diff --git a/dist/tangram.debug.js b/dist/tangram.debug.js index fed596979..592efa7af 100644 --- a/dist/tangram.debug.js +++ b/dist/tangram.debug.js @@ -1,6 +1,418 @@ (function(f){if(typeof exports==="object"&&typeof module!=="undefined"){module.exports=f()}else if(typeof define==="function"&&define.amd){define([],f)}else{var g;if(typeof window!=="undefined"){g=window}else if(typeof global!=="undefined"){g=global}else if(typeof self!=="undefined"){g=self}else{g=this}g.Tangram = f()}})(function(){var define,module,exports;return (function e(t,n,r){function s(o,u){if(!n[o]){if(!t[o]){var a=typeof require=="function"&&require;if(!u&&a)return a(o,!0);if(i)return i(o,!0);var f=new Error("Cannot find module '"+o+"'");throw f.code="MODULE_NOT_FOUND",f}var l=n[o]={exports:{}};t[o][0].call(l.exports,function(e){var n=t[o][1][e];return s(n?n:e)},l,l.exports,e,t,n,r)}return n[o].exports}var i=typeof require=="function"&&require;for(var o=0;o capacity) { + // Manually shift all values starting at the index back to the + // beginning of the queue. + for (var scan = 0, newLength = queue.length - index; scan < newLength; scan++) { + queue[scan] = queue[scan + index]; + } + queue.length -= index; + index = 0; + } + } + queue.length = 0; + index = 0; + flushing = false; +} + +// `requestFlush` is implemented using a strategy based on data collected from +// every available SauceLabs Selenium web driver worker at time of writing. +// https://docs.google.com/spreadsheets/d/1mG-5UYGup5qxGdEMWkhP6BWCz053NUb2E1QoUTU16uA/edit#gid=783724593 -},{}],2:[function(_dereq_,module,exports){ +// Safari 6 and 6.1 for desktop, iPad, and iPhone are the only browsers that +// have WebKitMutationObserver but not un-prefixed MutationObserver. +// Must use `global` or `self` instead of `window` to work in both frames and web +// workers. `global` is a provision of Browserify, Mr, Mrs, or Mop. + +/* globals self */ +var scope = typeof global !== "undefined" ? global : self; +var BrowserMutationObserver = scope.MutationObserver || scope.WebKitMutationObserver; + +// MutationObservers are desirable because they have high priority and work +// reliably everywhere they are implemented. +// They are implemented in all modern browsers. +// +// - Android 4-4.3 +// - Chrome 26-34 +// - Firefox 14-29 +// - Internet Explorer 11 +// - iPad Safari 6-7.1 +// - iPhone Safari 7-7.1 +// - Safari 6-7 +if (typeof BrowserMutationObserver === "function") { + requestFlush = makeRequestCallFromMutationObserver(flush); + +// MessageChannels are desirable because they give direct access to the HTML +// task queue, are implemented in Internet Explorer 10, Safari 5.0-1, and Opera +// 11-12, and in web workers in many engines. +// Although message channels yield to any queued rendering and IO tasks, they +// would be better than imposing the 4ms delay of timers. +// However, they do not work reliably in Internet Explorer or Safari. + +// Internet Explorer 10 is the only browser that has setImmediate but does +// not have MutationObservers. +// Although setImmediate yields to the browser's renderer, it would be +// preferrable to falling back to setTimeout since it does not have +// the minimum 4ms penalty. +// Unfortunately there appears to be a bug in Internet Explorer 10 Mobile (and +// Desktop to a lesser extent) that renders both setImmediate and +// MessageChannel useless for the purposes of ASAP. +// https://github.com/kriskowal/q/issues/396 + +// Timers are implemented universally. +// We fall back to timers in workers in most engines, and in foreground +// contexts in the following browsers. +// However, note that even this simple case requires nuances to operate in a +// broad spectrum of browsers. +// +// - Firefox 3-13 +// - Internet Explorer 6-9 +// - iPad Safari 4.3 +// - Lynx 2.8.7 +} else { + requestFlush = makeRequestCallFromTimer(flush); +} + +// `requestFlush` requests that the high priority event queue be flushed as +// soon as possible. +// This is useful to prevent an error thrown in a task from stalling the event +// queue if the exception handled by Node.js’s +// `process.on("uncaughtException")` or by a domain. +rawAsap.requestFlush = requestFlush; + +// To request a high priority event, we induce a mutation observer by toggling +// the text of a text node between "1" and "-1". +function makeRequestCallFromMutationObserver(callback) { + var toggle = 1; + var observer = new BrowserMutationObserver(callback); + var node = document.createTextNode(""); + observer.observe(node, {characterData: true}); + return function requestCall() { + toggle = -toggle; + node.data = toggle; + }; +} + +// The message channel technique was discovered by Malte Ubl and was the +// original foundation for this library. +// http://www.nonblocking.io/2011/06/windownexttick.html + +// Safari 6.0.5 (at least) intermittently fails to create message ports on a +// page's first load. Thankfully, this version of Safari supports +// MutationObservers, so we don't need to fall back in that case. + +// function makeRequestCallFromMessageChannel(callback) { +// var channel = new MessageChannel(); +// channel.port1.onmessage = callback; +// return function requestCall() { +// channel.port2.postMessage(0); +// }; +// } + +// For reasons explained above, we are also unable to use `setImmediate` +// under any circumstances. +// Even if we were, there is another bug in Internet Explorer 10. +// It is not sufficient to assign `setImmediate` to `requestFlush` because +// `setImmediate` must be called *by name* and therefore must be wrapped in a +// closure. +// Never forget. + +// function makeRequestCallFromSetImmediate(callback) { +// return function requestCall() { +// setImmediate(callback); +// }; +// } + +// Safari 6.0 has a problem where timers will get lost while the user is +// scrolling. This problem does not impact ASAP because Safari 6.0 supports +// mutation observers, so that implementation is used instead. +// However, if we ever elect to use timers in Safari, the prevalent work-around +// is to add a scroll event listener that calls for a flush. + +// `setTimeout` does not call the passed callback if the delay is less than +// approximately 7 in web workers in Firefox 8 through 18, and sometimes not +// even then. + +function makeRequestCallFromTimer(callback) { + return function requestCall() { + // We dispatch a timeout with a specified delay of 0 for engines that + // can reliably accommodate that request. This will usually be snapped + // to a 4 milisecond delay, but once we're flushing, there's no delay + // between events. + var timeoutHandle = setTimeout(handleTimer, 0); + // However, since this timer gets frequently dropped in Firefox + // workers, we enlist an interval handle that will try to fire + // an event 20 times per second until it succeeds. + var intervalHandle = setInterval(handleTimer, 50); + + function handleTimer() { + // Whichever timer succeeds will cancel both timers and + // execute the callback. + clearTimeout(timeoutHandle); + clearInterval(intervalHandle); + callback(); + } + }; +} + +// This is for `asap.js` only. +// Its name will be periodically randomized to break any code that depends on +// its existence. +rawAsap.makeRequestCallFromTimer = makeRequestCallFromTimer; + +// ASAP was originally a nextTick shim included in Q. This was factored out +// into this ASAP package. It was later adapted to RSVP which made further +// amendments. These decisions, particularly to marginalize MessageChannel and +// to capture the MutationObserver implementation in a closure, were integrated +// back into ASAP proper. +// https://github.com/tildeio/rsvp.js/blob/cddf7232546a9cf858524b75cde6f9edf72620a7/lib/rsvp/asap.js + +}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) + +},{}],3:[function(_dereq_,module,exports){ +'use strict' + +exports.byteLength = byteLength +exports.toByteArray = toByteArray +exports.fromByteArray = fromByteArray + +var lookup = [] +var revLookup = [] +var Arr = typeof Uint8Array !== 'undefined' ? Uint8Array : Array + +var code = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/' +for (var i = 0, len = code.length; i < len; ++i) { + lookup[i] = code[i] + revLookup[code.charCodeAt(i)] = i +} + +revLookup['-'.charCodeAt(0)] = 62 +revLookup['_'.charCodeAt(0)] = 63 + +function placeHoldersCount (b64) { + var len = b64.length + if (len % 4 > 0) { + throw new Error('Invalid string. Length must be a multiple of 4') + } + + // the number of equal signs (place holders) + // if there are two placeholders, than the two characters before it + // represent one byte + // if there is only one, then the three characters before it represent 2 bytes + // this is just a cheap hack to not do indexOf twice + return b64[len - 2] === '=' ? 2 : b64[len - 1] === '=' ? 1 : 0 +} + +function byteLength (b64) { + // base64 is 4/3 + up to two characters of the original data + return b64.length * 3 / 4 - placeHoldersCount(b64) +} + +function toByteArray (b64) { + var i, j, l, tmp, placeHolders, arr + var len = b64.length + placeHolders = placeHoldersCount(b64) + + arr = new Arr(len * 3 / 4 - placeHolders) + + // if there are placeholders, only get up to the last complete 4 chars + l = placeHolders > 0 ? len - 4 : len + + var L = 0 + + for (i = 0, j = 0; i < l; i += 4, j += 3) { + tmp = (revLookup[b64.charCodeAt(i)] << 18) | (revLookup[b64.charCodeAt(i + 1)] << 12) | (revLookup[b64.charCodeAt(i + 2)] << 6) | revLookup[b64.charCodeAt(i + 3)] + arr[L++] = (tmp >> 16) & 0xFF + arr[L++] = (tmp >> 8) & 0xFF + arr[L++] = tmp & 0xFF + } + + if (placeHolders === 2) { + tmp = (revLookup[b64.charCodeAt(i)] << 2) | (revLookup[b64.charCodeAt(i + 1)] >> 4) + arr[L++] = tmp & 0xFF + } else if (placeHolders === 1) { + tmp = (revLookup[b64.charCodeAt(i)] << 10) | (revLookup[b64.charCodeAt(i + 1)] << 4) | (revLookup[b64.charCodeAt(i + 2)] >> 2) + arr[L++] = (tmp >> 8) & 0xFF + arr[L++] = tmp & 0xFF + } + + return arr +} + +function tripletToBase64 (num) { + return lookup[num >> 18 & 0x3F] + lookup[num >> 12 & 0x3F] + lookup[num >> 6 & 0x3F] + lookup[num & 0x3F] +} + +function encodeChunk (uint8, start, end) { + var tmp + var output = [] + for (var i = start; i < end; i += 3) { + tmp = (uint8[i] << 16) + (uint8[i + 1] << 8) + (uint8[i + 2]) + output.push(tripletToBase64(tmp)) + } + return output.join('') +} + +function fromByteArray (uint8) { + var tmp + var len = uint8.length + var extraBytes = len % 3 // if we have 1 byte left, pad 2 bytes + var output = '' + var parts = [] + var maxChunkLength = 16383 // must be multiple of 3 + + // go through the array every three bytes, we'll deal with trailing stuff later + for (var i = 0, len2 = len - extraBytes; i < len2; i += maxChunkLength) { + parts.push(encodeChunk(uint8, i, (i + maxChunkLength) > len2 ? len2 : (i + maxChunkLength))) + } + + // pad the end with zeros, but make sure to not forget the extra bytes + if (extraBytes === 1) { + tmp = uint8[len - 1] + output += lookup[tmp >> 2] + output += lookup[(tmp << 4) & 0x3F] + output += '==' + } else if (extraBytes === 2) { + tmp = (uint8[len - 2] << 8) + (uint8[len - 1]) + output += lookup[tmp >> 10] + output += lookup[(tmp >> 4) & 0x3F] + output += lookup[(tmp << 2) & 0x3F] + output += '=' + } + + parts.push(output) + + return parts.join('') +} + +},{}],4:[function(_dereq_,module,exports){ + +},{}],5:[function(_dereq_,module,exports){ (function (global){ /*! * The buffer module from node.js, for the browser. @@ -1794,758 +2206,1237 @@ function isnan (val) { }).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) -},{"base64-js":3,"ieee754":4,"isarray":5}],3:[function(_dereq_,module,exports){ -'use strict' - -exports.byteLength = byteLength -exports.toByteArray = toByteArray -exports.fromByteArray = fromByteArray - -var lookup = [] -var revLookup = [] -var Arr = typeof Uint8Array !== 'undefined' ? Uint8Array : Array +},{"base64-js":3,"ieee754":91,"isarray":94}],6:[function(_dereq_,module,exports){ +_dereq_('../modules/es6.object.to-string'); +_dereq_('../modules/es6.string.iterator'); +_dereq_('../modules/web.dom.iterable'); +_dereq_('../modules/es6.promise'); +module.exports = _dereq_('../modules/_core').Promise; +},{"../modules/_core":14,"../modules/es6.object.to-string":66,"../modules/es6.promise":67,"../modules/es6.string.iterator":68,"../modules/web.dom.iterable":69}],7:[function(_dereq_,module,exports){ +module.exports = function(it){ + if(typeof it != 'function')throw TypeError(it + ' is not a function!'); + return it; +}; +},{}],8:[function(_dereq_,module,exports){ +// 22.1.3.31 Array.prototype[@@unscopables] +var UNSCOPABLES = _dereq_('./_wks')('unscopables') + , ArrayProto = Array.prototype; +if(ArrayProto[UNSCOPABLES] == undefined)_dereq_('./_hide')(ArrayProto, UNSCOPABLES, {}); +module.exports = function(key){ + ArrayProto[UNSCOPABLES][key] = true; +}; +},{"./_hide":25,"./_wks":63}],9:[function(_dereq_,module,exports){ +module.exports = function(it, Constructor, name, forbiddenField){ + if(!(it instanceof Constructor) || (forbiddenField !== undefined && forbiddenField in it)){ + throw TypeError(name + ': incorrect invocation!'); + } return it; +}; +},{}],10:[function(_dereq_,module,exports){ +var isObject = _dereq_('./_is-object'); +module.exports = function(it){ + if(!isObject(it))throw TypeError(it + ' is not an object!'); + return it; +}; +},{"./_is-object":31}],11:[function(_dereq_,module,exports){ +// false -> Array#indexOf +// true -> Array#includes +var toIObject = _dereq_('./_to-iobject') + , toLength = _dereq_('./_to-length') + , toIndex = _dereq_('./_to-index'); +module.exports = function(IS_INCLUDES){ + return function($this, el, fromIndex){ + var O = toIObject($this) + , length = toLength(O.length) + , index = toIndex(fromIndex, length) + , value; + // Array#includes uses SameValueZero equality algorithm + if(IS_INCLUDES && el != el)while(length > index){ + value = O[index++]; + if(value != value)return true; + // Array#toIndex ignores holes, Array#includes - not + } else for(;length > index; index++)if(IS_INCLUDES || index in O){ + if(O[index] === el)return IS_INCLUDES || index || 0; + } return !IS_INCLUDES && -1; + }; +}; +},{"./_to-index":56,"./_to-iobject":58,"./_to-length":59}],12:[function(_dereq_,module,exports){ +// getting tag from 19.1.3.6 Object.prototype.toString() +var cof = _dereq_('./_cof') + , TAG = _dereq_('./_wks')('toStringTag') + // ES3 wrong here + , ARG = cof(function(){ return arguments; }()) == 'Arguments'; -var code = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/' -for (var i = 0, len = code.length; i < len; ++i) { - lookup[i] = code[i] - revLookup[code.charCodeAt(i)] = i -} +// fallback for IE11 Script Access Denied error +var tryGet = function(it, key){ + try { + return it[key]; + } catch(e){ /* empty */ } +}; -revLookup['-'.charCodeAt(0)] = 62 -revLookup['_'.charCodeAt(0)] = 63 +module.exports = function(it){ + var O, T, B; + return it === undefined ? 'Undefined' : it === null ? 'Null' + // @@toStringTag case + : typeof (T = tryGet(O = Object(it), TAG)) == 'string' ? T + // builtinTag case + : ARG ? cof(O) + // ES3 arguments fallback + : (B = cof(O)) == 'Object' && typeof O.callee == 'function' ? 'Arguments' : B; +}; +},{"./_cof":13,"./_wks":63}],13:[function(_dereq_,module,exports){ +var toString = {}.toString; -function placeHoldersCount (b64) { - var len = b64.length - if (len % 4 > 0) { - throw new Error('Invalid string. Length must be a multiple of 4') +module.exports = function(it){ + return toString.call(it).slice(8, -1); +}; +},{}],14:[function(_dereq_,module,exports){ +var core = module.exports = {version: '2.4.0'}; +if(typeof __e == 'number')__e = core; // eslint-disable-line no-undef +},{}],15:[function(_dereq_,module,exports){ +// optional / simple context binding +var aFunction = _dereq_('./_a-function'); +module.exports = function(fn, that, length){ + aFunction(fn); + if(that === undefined)return fn; + switch(length){ + case 1: return function(a){ + return fn.call(that, a); + }; + case 2: return function(a, b){ + return fn.call(that, a, b); + }; + case 3: return function(a, b, c){ + return fn.call(that, a, b, c); + }; } + return function(/* ...args */){ + return fn.apply(that, arguments); + }; +}; +},{"./_a-function":7}],16:[function(_dereq_,module,exports){ +// 7.2.1 RequireObjectCoercible(argument) +module.exports = function(it){ + if(it == undefined)throw TypeError("Can't call method on " + it); + return it; +}; +},{}],17:[function(_dereq_,module,exports){ +// Thank's IE8 for his funny defineProperty +module.exports = !_dereq_('./_fails')(function(){ + return Object.defineProperty({}, 'a', {get: function(){ return 7; }}).a != 7; +}); +},{"./_fails":21}],18:[function(_dereq_,module,exports){ +var isObject = _dereq_('./_is-object') + , document = _dereq_('./_global').document + // in old IE typeof document.createElement is 'object' + , is = isObject(document) && isObject(document.createElement); +module.exports = function(it){ + return is ? document.createElement(it) : {}; +}; +},{"./_global":23,"./_is-object":31}],19:[function(_dereq_,module,exports){ +// IE 8- don't enum bug keys +module.exports = ( + 'constructor,hasOwnProperty,isPrototypeOf,propertyIsEnumerable,toLocaleString,toString,valueOf' +).split(','); +},{}],20:[function(_dereq_,module,exports){ +var global = _dereq_('./_global') + , core = _dereq_('./_core') + , hide = _dereq_('./_hide') + , redefine = _dereq_('./_redefine') + , ctx = _dereq_('./_ctx') + , PROTOTYPE = 'prototype'; - // the number of equal signs (place holders) - // if there are two placeholders, than the two characters before it - // represent one byte - // if there is only one, then the three characters before it represent 2 bytes - // this is just a cheap hack to not do indexOf twice - return b64[len - 2] === '=' ? 2 : b64[len - 1] === '=' ? 1 : 0 -} - -function byteLength (b64) { - // base64 is 4/3 + up to two characters of the original data - return b64.length * 3 / 4 - placeHoldersCount(b64) -} - -function toByteArray (b64) { - var i, j, l, tmp, placeHolders, arr - var len = b64.length - placeHolders = placeHoldersCount(b64) - - arr = new Arr(len * 3 / 4 - placeHolders) - - // if there are placeholders, only get up to the last complete 4 chars - l = placeHolders > 0 ? len - 4 : len - - var L = 0 - - for (i = 0, j = 0; i < l; i += 4, j += 3) { - tmp = (revLookup[b64.charCodeAt(i)] << 18) | (revLookup[b64.charCodeAt(i + 1)] << 12) | (revLookup[b64.charCodeAt(i + 2)] << 6) | revLookup[b64.charCodeAt(i + 3)] - arr[L++] = (tmp >> 16) & 0xFF - arr[L++] = (tmp >> 8) & 0xFF - arr[L++] = tmp & 0xFF +var $export = function(type, name, source){ + var IS_FORCED = type & $export.F + , IS_GLOBAL = type & $export.G + , IS_STATIC = type & $export.S + , IS_PROTO = type & $export.P + , IS_BIND = type & $export.B + , target = IS_GLOBAL ? global : IS_STATIC ? global[name] || (global[name] = {}) : (global[name] || {})[PROTOTYPE] + , exports = IS_GLOBAL ? core : core[name] || (core[name] = {}) + , expProto = exports[PROTOTYPE] || (exports[PROTOTYPE] = {}) + , key, own, out, exp; + if(IS_GLOBAL)source = name; + for(key in source){ + // contains in native + own = !IS_FORCED && target && target[key] !== undefined; + // export native or passed + out = (own ? target : source)[key]; + // bind timers to global for call from export context + exp = IS_BIND && own ? ctx(out, global) : IS_PROTO && typeof out == 'function' ? ctx(Function.call, out) : out; + // extend global + if(target)redefine(target, key, out, type & $export.U); + // export + if(exports[key] != out)hide(exports, key, exp); + if(IS_PROTO && expProto[key] != out)expProto[key] = out; } - - if (placeHolders === 2) { - tmp = (revLookup[b64.charCodeAt(i)] << 2) | (revLookup[b64.charCodeAt(i + 1)] >> 4) - arr[L++] = tmp & 0xFF - } else if (placeHolders === 1) { - tmp = (revLookup[b64.charCodeAt(i)] << 10) | (revLookup[b64.charCodeAt(i + 1)] << 4) | (revLookup[b64.charCodeAt(i + 2)] >> 2) - arr[L++] = (tmp >> 8) & 0xFF - arr[L++] = tmp & 0xFF +}; +global.core = core; +// type bitmap +$export.F = 1; // forced +$export.G = 2; // global +$export.S = 4; // static +$export.P = 8; // proto +$export.B = 16; // bind +$export.W = 32; // wrap +$export.U = 64; // safe +$export.R = 128; // real proto method for `library` +module.exports = $export; +},{"./_core":14,"./_ctx":15,"./_global":23,"./_hide":25,"./_redefine":48}],21:[function(_dereq_,module,exports){ +module.exports = function(exec){ + try { + return !!exec(); + } catch(e){ + return true; } - - return arr -} - -function tripletToBase64 (num) { - return lookup[num >> 18 & 0x3F] + lookup[num >> 12 & 0x3F] + lookup[num >> 6 & 0x3F] + lookup[num & 0x3F] -} - -function encodeChunk (uint8, start, end) { - var tmp - var output = [] - for (var i = start; i < end; i += 3) { - tmp = (uint8[i] << 16) + (uint8[i + 1] << 8) + (uint8[i + 2]) - output.push(tripletToBase64(tmp)) +}; +},{}],22:[function(_dereq_,module,exports){ +var ctx = _dereq_('./_ctx') + , call = _dereq_('./_iter-call') + , isArrayIter = _dereq_('./_is-array-iter') + , anObject = _dereq_('./_an-object') + , toLength = _dereq_('./_to-length') + , getIterFn = _dereq_('./core.get-iterator-method') + , BREAK = {} + , RETURN = {}; +var exports = module.exports = function(iterable, entries, fn, that, ITERATOR){ + var iterFn = ITERATOR ? function(){ return iterable; } : getIterFn(iterable) + , f = ctx(fn, that, entries ? 2 : 1) + , index = 0 + , length, step, iterator, result; + if(typeof iterFn != 'function')throw TypeError(iterable + ' is not iterable!'); + // fast case for arrays with default iterator + if(isArrayIter(iterFn))for(length = toLength(iterable.length); length > index; index++){ + result = entries ? f(anObject(step = iterable[index])[0], step[1]) : f(iterable[index]); + if(result === BREAK || result === RETURN)return result; + } else for(iterator = iterFn.call(iterable); !(step = iterator.next()).done; ){ + result = call(iterator, f, step.value, entries); + if(result === BREAK || result === RETURN)return result; } - return output.join('') -} - -function fromByteArray (uint8) { - var tmp - var len = uint8.length - var extraBytes = len % 3 // if we have 1 byte left, pad 2 bytes - var output = '' - var parts = [] - var maxChunkLength = 16383 // must be multiple of 3 +}; +exports.BREAK = BREAK; +exports.RETURN = RETURN; +},{"./_an-object":10,"./_ctx":15,"./_is-array-iter":30,"./_iter-call":32,"./_to-length":59,"./core.get-iterator-method":64}],23:[function(_dereq_,module,exports){ +// https://github.com/zloirock/core-js/issues/86#issuecomment-115759028 +var global = module.exports = typeof window != 'undefined' && window.Math == Math + ? window : typeof self != 'undefined' && self.Math == Math ? self : Function('return this')(); +if(typeof __g == 'number')__g = global; // eslint-disable-line no-undef +},{}],24:[function(_dereq_,module,exports){ +var hasOwnProperty = {}.hasOwnProperty; +module.exports = function(it, key){ + return hasOwnProperty.call(it, key); +}; +},{}],25:[function(_dereq_,module,exports){ +var dP = _dereq_('./_object-dp') + , createDesc = _dereq_('./_property-desc'); +module.exports = _dereq_('./_descriptors') ? function(object, key, value){ + return dP.f(object, key, createDesc(1, value)); +} : function(object, key, value){ + object[key] = value; + return object; +}; +},{"./_descriptors":17,"./_object-dp":41,"./_property-desc":46}],26:[function(_dereq_,module,exports){ +module.exports = _dereq_('./_global').document && document.documentElement; +},{"./_global":23}],27:[function(_dereq_,module,exports){ +module.exports = !_dereq_('./_descriptors') && !_dereq_('./_fails')(function(){ + return Object.defineProperty(_dereq_('./_dom-create')('div'), 'a', {get: function(){ return 7; }}).a != 7; +}); +},{"./_descriptors":17,"./_dom-create":18,"./_fails":21}],28:[function(_dereq_,module,exports){ +// fast apply, http://jsperf.lnkit.com/fast-apply/5 +module.exports = function(fn, args, that){ + var un = that === undefined; + switch(args.length){ + case 0: return un ? fn() + : fn.call(that); + case 1: return un ? fn(args[0]) + : fn.call(that, args[0]); + case 2: return un ? fn(args[0], args[1]) + : fn.call(that, args[0], args[1]); + case 3: return un ? fn(args[0], args[1], args[2]) + : fn.call(that, args[0], args[1], args[2]); + case 4: return un ? fn(args[0], args[1], args[2], args[3]) + : fn.call(that, args[0], args[1], args[2], args[3]); + } return fn.apply(that, args); +}; +},{}],29:[function(_dereq_,module,exports){ +// fallback for non-array-like ES3 and non-enumerable old V8 strings +var cof = _dereq_('./_cof'); +module.exports = Object('z').propertyIsEnumerable(0) ? Object : function(it){ + return cof(it) == 'String' ? it.split('') : Object(it); +}; +},{"./_cof":13}],30:[function(_dereq_,module,exports){ +// check on default Array iterator +var Iterators = _dereq_('./_iterators') + , ITERATOR = _dereq_('./_wks')('iterator') + , ArrayProto = Array.prototype; - // go through the array every three bytes, we'll deal with trailing stuff later - for (var i = 0, len2 = len - extraBytes; i < len2; i += maxChunkLength) { - parts.push(encodeChunk(uint8, i, (i + maxChunkLength) > len2 ? len2 : (i + maxChunkLength))) +module.exports = function(it){ + return it !== undefined && (Iterators.Array === it || ArrayProto[ITERATOR] === it); +}; +},{"./_iterators":37,"./_wks":63}],31:[function(_dereq_,module,exports){ +module.exports = function(it){ + return typeof it === 'object' ? it !== null : typeof it === 'function'; +}; +},{}],32:[function(_dereq_,module,exports){ +// call something on iterator step with safe closing on error +var anObject = _dereq_('./_an-object'); +module.exports = function(iterator, fn, value, entries){ + try { + return entries ? fn(anObject(value)[0], value[1]) : fn(value); + // 7.4.6 IteratorClose(iterator, completion) + } catch(e){ + var ret = iterator['return']; + if(ret !== undefined)anObject(ret.call(iterator)); + throw e; } +}; +},{"./_an-object":10}],33:[function(_dereq_,module,exports){ +'use strict'; +var create = _dereq_('./_object-create') + , descriptor = _dereq_('./_property-desc') + , setToStringTag = _dereq_('./_set-to-string-tag') + , IteratorPrototype = {}; - // pad the end with zeros, but make sure to not forget the extra bytes - if (extraBytes === 1) { - tmp = uint8[len - 1] - output += lookup[tmp >> 2] - output += lookup[(tmp << 4) & 0x3F] - output += '==' - } else if (extraBytes === 2) { - tmp = (uint8[len - 2] << 8) + (uint8[len - 1]) - output += lookup[tmp >> 10] - output += lookup[(tmp >> 4) & 0x3F] - output += lookup[(tmp << 2) & 0x3F] - output += '=' - } +// 25.1.2.1.1 %IteratorPrototype%[@@iterator]() +_dereq_('./_hide')(IteratorPrototype, _dereq_('./_wks')('iterator'), function(){ return this; }); - parts.push(output) +module.exports = function(Constructor, NAME, next){ + Constructor.prototype = create(IteratorPrototype, {next: descriptor(1, next)}); + setToStringTag(Constructor, NAME + ' Iterator'); +}; +},{"./_hide":25,"./_object-create":40,"./_property-desc":46,"./_set-to-string-tag":50,"./_wks":63}],34:[function(_dereq_,module,exports){ +'use strict'; +var LIBRARY = _dereq_('./_library') + , $export = _dereq_('./_export') + , redefine = _dereq_('./_redefine') + , hide = _dereq_('./_hide') + , has = _dereq_('./_has') + , Iterators = _dereq_('./_iterators') + , $iterCreate = _dereq_('./_iter-create') + , setToStringTag = _dereq_('./_set-to-string-tag') + , getPrototypeOf = _dereq_('./_object-gpo') + , ITERATOR = _dereq_('./_wks')('iterator') + , BUGGY = !([].keys && 'next' in [].keys()) // Safari has buggy iterators w/o `next` + , FF_ITERATOR = '@@iterator' + , KEYS = 'keys' + , VALUES = 'values'; - return parts.join('') -} +var returnThis = function(){ return this; }; -},{}],4:[function(_dereq_,module,exports){ -exports.read = function (buffer, offset, isLE, mLen, nBytes) { - var e, m - var eLen = nBytes * 8 - mLen - 1 - var eMax = (1 << eLen) - 1 - var eBias = eMax >> 1 - var nBits = -7 - var i = isLE ? (nBytes - 1) : 0 - var d = isLE ? -1 : 1 - var s = buffer[offset + i] +module.exports = function(Base, NAME, Constructor, next, DEFAULT, IS_SET, FORCED){ + $iterCreate(Constructor, NAME, next); + var getMethod = function(kind){ + if(!BUGGY && kind in proto)return proto[kind]; + switch(kind){ + case KEYS: return function keys(){ return new Constructor(this, kind); }; + case VALUES: return function values(){ return new Constructor(this, kind); }; + } return function entries(){ return new Constructor(this, kind); }; + }; + var TAG = NAME + ' Iterator' + , DEF_VALUES = DEFAULT == VALUES + , VALUES_BUG = false + , proto = Base.prototype + , $native = proto[ITERATOR] || proto[FF_ITERATOR] || DEFAULT && proto[DEFAULT] + , $default = $native || getMethod(DEFAULT) + , $entries = DEFAULT ? !DEF_VALUES ? $default : getMethod('entries') : undefined + , $anyNative = NAME == 'Array' ? proto.entries || $native : $native + , methods, key, IteratorPrototype; + // Fix native + if($anyNative){ + IteratorPrototype = getPrototypeOf($anyNative.call(new Base)); + if(IteratorPrototype !== Object.prototype){ + // Set @@toStringTag to native iterators + setToStringTag(IteratorPrototype, TAG, true); + // fix for some old engines + if(!LIBRARY && !has(IteratorPrototype, ITERATOR))hide(IteratorPrototype, ITERATOR, returnThis); + } + } + // fix Array#{values, @@iterator}.name in V8 / FF + if(DEF_VALUES && $native && $native.name !== VALUES){ + VALUES_BUG = true; + $default = function values(){ return $native.call(this); }; + } + // Define iterator + if((!LIBRARY || FORCED) && (BUGGY || VALUES_BUG || !proto[ITERATOR])){ + hide(proto, ITERATOR, $default); + } + // Plug for library + Iterators[NAME] = $default; + Iterators[TAG] = returnThis; + if(DEFAULT){ + methods = { + values: DEF_VALUES ? $default : getMethod(VALUES), + keys: IS_SET ? $default : getMethod(KEYS), + entries: $entries + }; + if(FORCED)for(key in methods){ + if(!(key in proto))redefine(proto, key, methods[key]); + } else $export($export.P + $export.F * (BUGGY || VALUES_BUG), NAME, methods); + } + return methods; +}; +},{"./_export":20,"./_has":24,"./_hide":25,"./_iter-create":33,"./_iterators":37,"./_library":38,"./_object-gpo":43,"./_redefine":48,"./_set-to-string-tag":50,"./_wks":63}],35:[function(_dereq_,module,exports){ +var ITERATOR = _dereq_('./_wks')('iterator') + , SAFE_CLOSING = false; - i += d +try { + var riter = [7][ITERATOR](); + riter['return'] = function(){ SAFE_CLOSING = true; }; + Array.from(riter, function(){ throw 2; }); +} catch(e){ /* empty */ } - e = s & ((1 << (-nBits)) - 1) - s >>= (-nBits) - nBits += eLen - for (; nBits > 0; e = e * 256 + buffer[offset + i], i += d, nBits -= 8) {} +module.exports = function(exec, skipClosing){ + if(!skipClosing && !SAFE_CLOSING)return false; + var safe = false; + try { + var arr = [7] + , iter = arr[ITERATOR](); + iter.next = function(){ return {done: safe = true}; }; + arr[ITERATOR] = function(){ return iter; }; + exec(arr); + } catch(e){ /* empty */ } + return safe; +}; +},{"./_wks":63}],36:[function(_dereq_,module,exports){ +module.exports = function(done, value){ + return {value: value, done: !!done}; +}; +},{}],37:[function(_dereq_,module,exports){ +module.exports = {}; +},{}],38:[function(_dereq_,module,exports){ +module.exports = false; +},{}],39:[function(_dereq_,module,exports){ +var global = _dereq_('./_global') + , macrotask = _dereq_('./_task').set + , Observer = global.MutationObserver || global.WebKitMutationObserver + , process = global.process + , Promise = global.Promise + , isNode = _dereq_('./_cof')(process) == 'process'; - m = e & ((1 << (-nBits)) - 1) - e >>= (-nBits) - nBits += mLen - for (; nBits > 0; m = m * 256 + buffer[offset + i], i += d, nBits -= 8) {} +module.exports = function(){ + var head, last, notify; - if (e === 0) { - e = 1 - eBias - } else if (e === eMax) { - return m ? NaN : ((s ? -1 : 1) * Infinity) - } else { - m = m + Math.pow(2, mLen) - e = e - eBias - } - return (s ? -1 : 1) * m * Math.pow(2, e - mLen) -} + var flush = function(){ + var parent, fn; + if(isNode && (parent = process.domain))parent.exit(); + while(head){ + fn = head.fn; + head = head.next; + try { + fn(); + } catch(e){ + if(head)notify(); + else last = undefined; + throw e; + } + } last = undefined; + if(parent)parent.enter(); + }; -exports.write = function (buffer, value, offset, isLE, mLen, nBytes) { - var e, m, c - var eLen = nBytes * 8 - mLen - 1 - var eMax = (1 << eLen) - 1 - var eBias = eMax >> 1 - var rt = (mLen === 23 ? Math.pow(2, -24) - Math.pow(2, -77) : 0) - var i = isLE ? 0 : (nBytes - 1) - var d = isLE ? 1 : -1 - var s = value < 0 || (value === 0 && 1 / value < 0) ? 1 : 0 - - value = Math.abs(value) - - if (isNaN(value) || value === Infinity) { - m = isNaN(value) ? 1 : 0 - e = eMax + // Node.js + if(isNode){ + notify = function(){ + process.nextTick(flush); + }; + // browsers with MutationObserver + } else if(Observer){ + var toggle = true + , node = document.createTextNode(''); + new Observer(flush).observe(node, {characterData: true}); // eslint-disable-line no-new + notify = function(){ + node.data = toggle = !toggle; + }; + // environments with maybe non-completely correct, but existent Promise + } else if(Promise && Promise.resolve){ + var promise = Promise.resolve(); + notify = function(){ + promise.then(flush); + }; + // for other environments - macrotask based on: + // - setImmediate + // - MessageChannel + // - window.postMessag + // - onreadystatechange + // - setTimeout } else { - e = Math.floor(Math.log(value) / Math.LN2) - if (value * (c = Math.pow(2, -e)) < 1) { - e-- - c *= 2 - } - if (e + eBias >= 1) { - value += rt / c - } else { - value += rt * Math.pow(2, 1 - eBias) - } - if (value * c >= 2) { - e++ - c /= 2 - } - - if (e + eBias >= eMax) { - m = 0 - e = eMax - } else if (e + eBias >= 1) { - m = (value * c - 1) * Math.pow(2, mLen) - e = e + eBias - } else { - m = value * Math.pow(2, eBias - 1) * Math.pow(2, mLen) - e = 0 - } + notify = function(){ + // strange IE + webpack dev server bug - use .call(global) + macrotask.call(global, flush); + }; } - for (; mLen >= 8; buffer[offset + i] = m & 0xff, i += d, m /= 256, mLen -= 8) {} - - e = (e << mLen) | m - eLen += mLen - for (; eLen > 0; buffer[offset + i] = e & 0xff, i += d, e /= 256, eLen -= 8) {} - - buffer[offset + i - d] |= s * 128 -} - -},{}],5:[function(_dereq_,module,exports){ -var toString = {}.toString; - -module.exports = Array.isArray || function (arr) { - return toString.call(arr) == '[object Array]'; + return function(fn){ + var task = {fn: fn, next: undefined}; + if(last)last.next = task; + if(!head){ + head = task; + notify(); + } last = task; + }; }; +},{"./_cof":13,"./_global":23,"./_task":55}],40:[function(_dereq_,module,exports){ +// 19.1.2.2 / 15.2.3.5 Object.create(O [, Properties]) +var anObject = _dereq_('./_an-object') + , dPs = _dereq_('./_object-dps') + , enumBugKeys = _dereq_('./_enum-bug-keys') + , IE_PROTO = _dereq_('./_shared-key')('IE_PROTO') + , Empty = function(){ /* empty */ } + , PROTOTYPE = 'prototype'; -},{}],6:[function(_dereq_,module,exports){ -// Copyright Joyent, Inc. and other Node contributors. -// -// Permission is hereby granted, free of charge, to any person obtaining a -// copy of this software and associated documentation files (the -// "Software"), to deal in the Software without restriction, including -// without limitation the rights to use, copy, modify, merge, publish, -// distribute, sublicense, and/or sell copies of the Software, and to permit -// persons to whom the Software is furnished to do so, subject to the -// following conditions: -// -// The above copyright notice and this permission notice shall be included -// in all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN -// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR -// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE -// USE OR OTHER DEALINGS IN THE SOFTWARE. - -function EventEmitter() { - this._events = this._events || {}; - this._maxListeners = this._maxListeners || undefined; -} -module.exports = EventEmitter; - -// Backwards-compat with node 0.10.x -EventEmitter.EventEmitter = EventEmitter; - -EventEmitter.prototype._events = undefined; -EventEmitter.prototype._maxListeners = undefined; - -// By default EventEmitters will print a warning if more than 10 listeners are -// added to it. This is a useful default which helps finding memory leaks. -EventEmitter.defaultMaxListeners = 10; - -// Obviously not all Emitters should be limited to 10. This function allows -// that to be increased. Set to zero for unlimited. -EventEmitter.prototype.setMaxListeners = function(n) { - if (!isNumber(n) || n < 0 || isNaN(n)) - throw TypeError('n must be a positive number'); - this._maxListeners = n; - return this; +// Create object with fake `null` prototype: use iframe Object with cleared prototype +var createDict = function(){ + // Thrash, waste and sodomy: IE GC bug + var iframe = _dereq_('./_dom-create')('iframe') + , i = enumBugKeys.length + , lt = '<' + , gt = '>' + , iframeDocument; + iframe.style.display = 'none'; + _dereq_('./_html').appendChild(iframe); + iframe.src = 'javascript:'; // eslint-disable-line no-script-url + // createDict = iframe.contentWindow.Object; + // html.removeChild(iframe); + iframeDocument = iframe.contentWindow.document; + iframeDocument.open(); + iframeDocument.write(lt + 'script' + gt + 'document.F=Object' + lt + '/script' + gt); + iframeDocument.close(); + createDict = iframeDocument.F; + while(i--)delete createDict[PROTOTYPE][enumBugKeys[i]]; + return createDict(); }; -EventEmitter.prototype.emit = function(type) { - var er, handler, len, args, i, listeners; - - if (!this._events) - this._events = {}; - - // If there is no 'error' event listener then throw. - if (type === 'error') { - if (!this._events.error || - (isObject(this._events.error) && !this._events.error.length)) { - er = arguments[1]; - if (er instanceof Error) { - throw er; // Unhandled 'error' event - } else { - // At least give some kind of context to the user - var err = new Error('Uncaught, unspecified "error" event. (' + er + ')'); - err.context = er; - throw err; - } - } - } - - handler = this._events[type]; - - if (isUndefined(handler)) - return false; - - if (isFunction(handler)) { - switch (arguments.length) { - // fast cases - case 1: - handler.call(this); - break; - case 2: - handler.call(this, arguments[1]); - break; - case 3: - handler.call(this, arguments[1], arguments[2]); - break; - // slower - default: - args = Array.prototype.slice.call(arguments, 1); - handler.apply(this, args); - } - } else if (isObject(handler)) { - args = Array.prototype.slice.call(arguments, 1); - listeners = handler.slice(); - len = listeners.length; - for (i = 0; i < len; i++) - listeners[i].apply(this, args); - } - - return true; +module.exports = Object.create || function create(O, Properties){ + var result; + if(O !== null){ + Empty[PROTOTYPE] = anObject(O); + result = new Empty; + Empty[PROTOTYPE] = null; + // add "__proto__" for Object.getPrototypeOf polyfill + result[IE_PROTO] = O; + } else result = createDict(); + return Properties === undefined ? result : dPs(result, Properties); }; -EventEmitter.prototype.addListener = function(type, listener) { - var m; - - if (!isFunction(listener)) - throw TypeError('listener must be a function'); - - if (!this._events) - this._events = {}; - - // To avoid recursion in the case that type === "newListener"! Before - // adding it to the listeners, first emit "newListener". - if (this._events.newListener) - this.emit('newListener', type, - isFunction(listener.listener) ? - listener.listener : listener); - - if (!this._events[type]) - // Optimize the case of one listener. Don't need the extra array object. - this._events[type] = listener; - else if (isObject(this._events[type])) - // If we've already got an array, just append. - this._events[type].push(listener); - else - // Adding the second element, need to change to array. - this._events[type] = [this._events[type], listener]; - - // Check for listener leak - if (isObject(this._events[type]) && !this._events[type].warned) { - if (!isUndefined(this._maxListeners)) { - m = this._maxListeners; - } else { - m = EventEmitter.defaultMaxListeners; - } - - if (m && m > 0 && this._events[type].length > m) { - this._events[type].warned = true; - console.error('(node) warning: possible EventEmitter memory ' + - 'leak detected. %d listeners added. ' + - 'Use emitter.setMaxListeners() to increase limit.', - this._events[type].length); - if (typeof console.trace === 'function') { - // not supported in IE 10 - console.trace(); - } - } - } +},{"./_an-object":10,"./_dom-create":18,"./_enum-bug-keys":19,"./_html":26,"./_object-dps":42,"./_shared-key":51}],41:[function(_dereq_,module,exports){ +var anObject = _dereq_('./_an-object') + , IE8_DOM_DEFINE = _dereq_('./_ie8-dom-define') + , toPrimitive = _dereq_('./_to-primitive') + , dP = Object.defineProperty; - return this; +exports.f = _dereq_('./_descriptors') ? Object.defineProperty : function defineProperty(O, P, Attributes){ + anObject(O); + P = toPrimitive(P, true); + anObject(Attributes); + if(IE8_DOM_DEFINE)try { + return dP(O, P, Attributes); + } catch(e){ /* empty */ } + if('get' in Attributes || 'set' in Attributes)throw TypeError('Accessors not supported!'); + if('value' in Attributes)O[P] = Attributes.value; + return O; }; +},{"./_an-object":10,"./_descriptors":17,"./_ie8-dom-define":27,"./_to-primitive":61}],42:[function(_dereq_,module,exports){ +var dP = _dereq_('./_object-dp') + , anObject = _dereq_('./_an-object') + , getKeys = _dereq_('./_object-keys'); -EventEmitter.prototype.on = EventEmitter.prototype.addListener; - -EventEmitter.prototype.once = function(type, listener) { - if (!isFunction(listener)) - throw TypeError('listener must be a function'); - - var fired = false; - - function g() { - this.removeListener(type, g); - - if (!fired) { - fired = true; - listener.apply(this, arguments); - } - } - - g.listener = listener; - this.on(type, g); - - return this; +module.exports = _dereq_('./_descriptors') ? Object.defineProperties : function defineProperties(O, Properties){ + anObject(O); + var keys = getKeys(Properties) + , length = keys.length + , i = 0 + , P; + while(length > i)dP.f(O, P = keys[i++], Properties[P]); + return O; }; +},{"./_an-object":10,"./_descriptors":17,"./_object-dp":41,"./_object-keys":45}],43:[function(_dereq_,module,exports){ +// 19.1.2.9 / 15.2.3.2 Object.getPrototypeOf(O) +var has = _dereq_('./_has') + , toObject = _dereq_('./_to-object') + , IE_PROTO = _dereq_('./_shared-key')('IE_PROTO') + , ObjectProto = Object.prototype; -// emits a 'removeListener' event iff the listener was removed -EventEmitter.prototype.removeListener = function(type, listener) { - var list, position, length, i; - - if (!isFunction(listener)) - throw TypeError('listener must be a function'); - - if (!this._events || !this._events[type]) - return this; - - list = this._events[type]; - length = list.length; - position = -1; - - if (list === listener || - (isFunction(list.listener) && list.listener === listener)) { - delete this._events[type]; - if (this._events.removeListener) - this.emit('removeListener', type, listener); - - } else if (isObject(list)) { - for (i = length; i-- > 0;) { - if (list[i] === listener || - (list[i].listener && list[i].listener === listener)) { - position = i; - break; - } - } - - if (position < 0) - return this; - - if (list.length === 1) { - list.length = 0; - delete this._events[type]; - } else { - list.splice(position, 1); - } +module.exports = Object.getPrototypeOf || function(O){ + O = toObject(O); + if(has(O, IE_PROTO))return O[IE_PROTO]; + if(typeof O.constructor == 'function' && O instanceof O.constructor){ + return O.constructor.prototype; + } return O instanceof Object ? ObjectProto : null; +}; +},{"./_has":24,"./_shared-key":51,"./_to-object":60}],44:[function(_dereq_,module,exports){ +var has = _dereq_('./_has') + , toIObject = _dereq_('./_to-iobject') + , arrayIndexOf = _dereq_('./_array-includes')(false) + , IE_PROTO = _dereq_('./_shared-key')('IE_PROTO'); - if (this._events.removeListener) - this.emit('removeListener', type, listener); +module.exports = function(object, names){ + var O = toIObject(object) + , i = 0 + , result = [] + , key; + for(key in O)if(key != IE_PROTO)has(O, key) && result.push(key); + // Don't enum bug & hidden keys + while(names.length > i)if(has(O, key = names[i++])){ + ~arrayIndexOf(result, key) || result.push(key); } - - return this; + return result; }; +},{"./_array-includes":11,"./_has":24,"./_shared-key":51,"./_to-iobject":58}],45:[function(_dereq_,module,exports){ +// 19.1.2.14 / 15.2.3.14 Object.keys(O) +var $keys = _dereq_('./_object-keys-internal') + , enumBugKeys = _dereq_('./_enum-bug-keys'); -EventEmitter.prototype.removeAllListeners = function(type) { - var key, listeners; - - if (!this._events) - return this; +module.exports = Object.keys || function keys(O){ + return $keys(O, enumBugKeys); +}; +},{"./_enum-bug-keys":19,"./_object-keys-internal":44}],46:[function(_dereq_,module,exports){ +module.exports = function(bitmap, value){ + return { + enumerable : !(bitmap & 1), + configurable: !(bitmap & 2), + writable : !(bitmap & 4), + value : value + }; +}; +},{}],47:[function(_dereq_,module,exports){ +var redefine = _dereq_('./_redefine'); +module.exports = function(target, src, safe){ + for(var key in src)redefine(target, key, src[key], safe); + return target; +}; +},{"./_redefine":48}],48:[function(_dereq_,module,exports){ +var global = _dereq_('./_global') + , hide = _dereq_('./_hide') + , has = _dereq_('./_has') + , SRC = _dereq_('./_uid')('src') + , TO_STRING = 'toString' + , $toString = Function[TO_STRING] + , TPL = ('' + $toString).split(TO_STRING); - // not listening for removeListener, no need to emit - if (!this._events.removeListener) { - if (arguments.length === 0) - this._events = {}; - else if (this._events[type]) - delete this._events[type]; - return this; - } +_dereq_('./_core').inspectSource = function(it){ + return $toString.call(it); +}; - // emit removeListener for all listeners on all events - if (arguments.length === 0) { - for (key in this._events) { - if (key === 'removeListener') continue; - this.removeAllListeners(key); +(module.exports = function(O, key, val, safe){ + var isFunction = typeof val == 'function'; + if(isFunction)has(val, 'name') || hide(val, 'name', key); + if(O[key] === val)return; + if(isFunction)has(val, SRC) || hide(val, SRC, O[key] ? '' + O[key] : TPL.join(String(key))); + if(O === global){ + O[key] = val; + } else { + if(!safe){ + delete O[key]; + hide(O, key, val); + } else { + if(O[key])O[key] = val; + else hide(O, key, val); } - this.removeAllListeners('removeListener'); - this._events = {}; - return this; - } - - listeners = this._events[type]; - - if (isFunction(listeners)) { - this.removeListener(type, listeners); - } else if (listeners) { - // LIFO order - while (listeners.length) - this.removeListener(type, listeners[listeners.length - 1]); } - delete this._events[type]; +// add fake Function#toString for correct work wrapped methods / constructors with methods like LoDash isNative +})(Function.prototype, TO_STRING, function toString(){ + return typeof this == 'function' && this[SRC] || $toString.call(this); +}); +},{"./_core":14,"./_global":23,"./_has":24,"./_hide":25,"./_uid":62}],49:[function(_dereq_,module,exports){ +'use strict'; +var global = _dereq_('./_global') + , dP = _dereq_('./_object-dp') + , DESCRIPTORS = _dereq_('./_descriptors') + , SPECIES = _dereq_('./_wks')('species'); - return this; +module.exports = function(KEY){ + var C = global[KEY]; + if(DESCRIPTORS && C && !C[SPECIES])dP.f(C, SPECIES, { + configurable: true, + get: function(){ return this; } + }); }; +},{"./_descriptors":17,"./_global":23,"./_object-dp":41,"./_wks":63}],50:[function(_dereq_,module,exports){ +var def = _dereq_('./_object-dp').f + , has = _dereq_('./_has') + , TAG = _dereq_('./_wks')('toStringTag'); -EventEmitter.prototype.listeners = function(type) { - var ret; - if (!this._events || !this._events[type]) - ret = []; - else if (isFunction(this._events[type])) - ret = [this._events[type]]; - else - ret = this._events[type].slice(); - return ret; +module.exports = function(it, tag, stat){ + if(it && !has(it = stat ? it : it.prototype, TAG))def(it, TAG, {configurable: true, value: tag}); }; - -EventEmitter.prototype.listenerCount = function(type) { - if (this._events) { - var evlistener = this._events[type]; - - if (isFunction(evlistener)) - return 1; - else if (evlistener) - return evlistener.length; - } - return 0; +},{"./_has":24,"./_object-dp":41,"./_wks":63}],51:[function(_dereq_,module,exports){ +var shared = _dereq_('./_shared')('keys') + , uid = _dereq_('./_uid'); +module.exports = function(key){ + return shared[key] || (shared[key] = uid(key)); }; - -EventEmitter.listenerCount = function(emitter, type) { - return emitter.listenerCount(type); +},{"./_shared":52,"./_uid":62}],52:[function(_dereq_,module,exports){ +var global = _dereq_('./_global') + , SHARED = '__core-js_shared__' + , store = global[SHARED] || (global[SHARED] = {}); +module.exports = function(key){ + return store[key] || (store[key] = {}); }; - -function isFunction(arg) { - return typeof arg === 'function'; -} - -function isNumber(arg) { - return typeof arg === 'number'; -} - -function isObject(arg) { - return typeof arg === 'object' && arg !== null; +},{"./_global":23}],53:[function(_dereq_,module,exports){ +// 7.3.20 SpeciesConstructor(O, defaultConstructor) +var anObject = _dereq_('./_an-object') + , aFunction = _dereq_('./_a-function') + , SPECIES = _dereq_('./_wks')('species'); +module.exports = function(O, D){ + var C = anObject(O).constructor, S; + return C === undefined || (S = anObject(C)[SPECIES]) == undefined ? D : aFunction(S); +}; +},{"./_a-function":7,"./_an-object":10,"./_wks":63}],54:[function(_dereq_,module,exports){ +var toInteger = _dereq_('./_to-integer') + , defined = _dereq_('./_defined'); +// true -> String#at +// false -> String#codePointAt +module.exports = function(TO_STRING){ + return function(that, pos){ + var s = String(defined(that)) + , i = toInteger(pos) + , l = s.length + , a, b; + if(i < 0 || i >= l)return TO_STRING ? '' : undefined; + a = s.charCodeAt(i); + return a < 0xd800 || a > 0xdbff || i + 1 === l || (b = s.charCodeAt(i + 1)) < 0xdc00 || b > 0xdfff + ? TO_STRING ? s.charAt(i) : a + : TO_STRING ? s.slice(i, i + 2) : (a - 0xd800 << 10) + (b - 0xdc00) + 0x10000; + }; +}; +},{"./_defined":16,"./_to-integer":57}],55:[function(_dereq_,module,exports){ +var ctx = _dereq_('./_ctx') + , invoke = _dereq_('./_invoke') + , html = _dereq_('./_html') + , cel = _dereq_('./_dom-create') + , global = _dereq_('./_global') + , process = global.process + , setTask = global.setImmediate + , clearTask = global.clearImmediate + , MessageChannel = global.MessageChannel + , counter = 0 + , queue = {} + , ONREADYSTATECHANGE = 'onreadystatechange' + , defer, channel, port; +var run = function(){ + var id = +this; + if(queue.hasOwnProperty(id)){ + var fn = queue[id]; + delete queue[id]; + fn(); + } +}; +var listener = function(event){ + run.call(event.data); +}; +// Node.js 0.9+ & IE10+ has setImmediate, otherwise: +if(!setTask || !clearTask){ + setTask = function setImmediate(fn){ + var args = [], i = 1; + while(arguments.length > i)args.push(arguments[i++]); + queue[++counter] = function(){ + invoke(typeof fn == 'function' ? fn : Function(fn), args); + }; + defer(counter); + return counter; + }; + clearTask = function clearImmediate(id){ + delete queue[id]; + }; + // Node.js 0.8- + if(_dereq_('./_cof')(process) == 'process'){ + defer = function(id){ + process.nextTick(ctx(run, id, 1)); + }; + // Browsers with MessageChannel, includes WebWorkers + } else if(MessageChannel){ + channel = new MessageChannel; + port = channel.port2; + channel.port1.onmessage = listener; + defer = ctx(port.postMessage, port, 1); + // Browsers with postMessage, skip WebWorkers + // IE8 has postMessage, but it's sync & typeof its postMessage is 'object' + } else if(global.addEventListener && typeof postMessage == 'function' && !global.importScripts){ + defer = function(id){ + global.postMessage(id + '', '*'); + }; + global.addEventListener('message', listener, false); + // IE8- + } else if(ONREADYSTATECHANGE in cel('script')){ + defer = function(id){ + html.appendChild(cel('script'))[ONREADYSTATECHANGE] = function(){ + html.removeChild(this); + run.call(id); + }; + }; + // Rest old browsers + } else { + defer = function(id){ + setTimeout(ctx(run, id, 1), 0); + }; + } } +module.exports = { + set: setTask, + clear: clearTask +}; +},{"./_cof":13,"./_ctx":15,"./_dom-create":18,"./_global":23,"./_html":26,"./_invoke":28}],56:[function(_dereq_,module,exports){ +var toInteger = _dereq_('./_to-integer') + , max = Math.max + , min = Math.min; +module.exports = function(index, length){ + index = toInteger(index); + return index < 0 ? max(index + length, 0) : min(index, length); +}; +},{"./_to-integer":57}],57:[function(_dereq_,module,exports){ +// 7.1.4 ToInteger +var ceil = Math.ceil + , floor = Math.floor; +module.exports = function(it){ + return isNaN(it = +it) ? 0 : (it > 0 ? floor : ceil)(it); +}; +},{}],58:[function(_dereq_,module,exports){ +// to indexed object, toObject with fallback for non-array-like ES3 strings +var IObject = _dereq_('./_iobject') + , defined = _dereq_('./_defined'); +module.exports = function(it){ + return IObject(defined(it)); +}; +},{"./_defined":16,"./_iobject":29}],59:[function(_dereq_,module,exports){ +// 7.1.15 ToLength +var toInteger = _dereq_('./_to-integer') + , min = Math.min; +module.exports = function(it){ + return it > 0 ? min(toInteger(it), 0x1fffffffffffff) : 0; // pow(2, 53) - 1 == 9007199254740991 +}; +},{"./_to-integer":57}],60:[function(_dereq_,module,exports){ +// 7.1.13 ToObject(argument) +var defined = _dereq_('./_defined'); +module.exports = function(it){ + return Object(defined(it)); +}; +},{"./_defined":16}],61:[function(_dereq_,module,exports){ +// 7.1.1 ToPrimitive(input [, PreferredType]) +var isObject = _dereq_('./_is-object'); +// instead of the ES6 spec version, we didn't implement @@toPrimitive case +// and the second argument - flag - preferred type is a string +module.exports = function(it, S){ + if(!isObject(it))return it; + var fn, val; + if(S && typeof (fn = it.toString) == 'function' && !isObject(val = fn.call(it)))return val; + if(typeof (fn = it.valueOf) == 'function' && !isObject(val = fn.call(it)))return val; + if(!S && typeof (fn = it.toString) == 'function' && !isObject(val = fn.call(it)))return val; + throw TypeError("Can't convert object to primitive value"); +}; +},{"./_is-object":31}],62:[function(_dereq_,module,exports){ +var id = 0 + , px = Math.random(); +module.exports = function(key){ + return 'Symbol('.concat(key === undefined ? '' : key, ')_', (++id + px).toString(36)); +}; +},{}],63:[function(_dereq_,module,exports){ +var store = _dereq_('./_shared')('wks') + , uid = _dereq_('./_uid') + , Symbol = _dereq_('./_global').Symbol + , USE_SYMBOL = typeof Symbol == 'function'; -function isUndefined(arg) { - return arg === void 0; -} +var $exports = module.exports = function(name){ + return store[name] || (store[name] = + USE_SYMBOL && Symbol[name] || (USE_SYMBOL ? Symbol : uid)('Symbol.' + name)); +}; -},{}],7:[function(_dereq_,module,exports){ -/*! - * Determine if an object is a Buffer - * - * @author Feross Aboukhadijeh - * @license MIT - */ +$exports.store = store; +},{"./_global":23,"./_shared":52,"./_uid":62}],64:[function(_dereq_,module,exports){ +var classof = _dereq_('./_classof') + , ITERATOR = _dereq_('./_wks')('iterator') + , Iterators = _dereq_('./_iterators'); +module.exports = _dereq_('./_core').getIteratorMethod = function(it){ + if(it != undefined)return it[ITERATOR] + || it['@@iterator'] + || Iterators[classof(it)]; +}; +},{"./_classof":12,"./_core":14,"./_iterators":37,"./_wks":63}],65:[function(_dereq_,module,exports){ +'use strict'; +var addToUnscopables = _dereq_('./_add-to-unscopables') + , step = _dereq_('./_iter-step') + , Iterators = _dereq_('./_iterators') + , toIObject = _dereq_('./_to-iobject'); -// The _isBuffer check is for Safari 5-7 support, because it's missing -// Object.prototype.constructor. Remove this eventually -module.exports = function (obj) { - return obj != null && (isBuffer(obj) || isSlowBuffer(obj) || !!obj._isBuffer) -} +// 22.1.3.4 Array.prototype.entries() +// 22.1.3.13 Array.prototype.keys() +// 22.1.3.29 Array.prototype.values() +// 22.1.3.30 Array.prototype[@@iterator]() +module.exports = _dereq_('./_iter-define')(Array, 'Array', function(iterated, kind){ + this._t = toIObject(iterated); // target + this._i = 0; // next index + this._k = kind; // kind +// 22.1.5.2.1 %ArrayIteratorPrototype%.next() +}, function(){ + var O = this._t + , kind = this._k + , index = this._i++; + if(!O || index >= O.length){ + this._t = undefined; + return step(1); + } + if(kind == 'keys' )return step(0, index); + if(kind == 'values')return step(0, O[index]); + return step(0, [index, O[index]]); +}, 'values'); -function isBuffer (obj) { - return !!obj.constructor && typeof obj.constructor.isBuffer === 'function' && obj.constructor.isBuffer(obj) -} +// argumentsList[@@iterator] is %ArrayProto_values% (9.4.4.6, 9.4.4.7) +Iterators.Arguments = Iterators.Array; -// For Node v0.10 support. Remove this eventually. -function isSlowBuffer (obj) { - return typeof obj.readFloatLE === 'function' && typeof obj.slice === 'function' && isBuffer(obj.slice(0, 0)) +addToUnscopables('keys'); +addToUnscopables('values'); +addToUnscopables('entries'); +},{"./_add-to-unscopables":8,"./_iter-define":34,"./_iter-step":36,"./_iterators":37,"./_to-iobject":58}],66:[function(_dereq_,module,exports){ +'use strict'; +// 19.1.3.6 Object.prototype.toString() +var classof = _dereq_('./_classof') + , test = {}; +test[_dereq_('./_wks')('toStringTag')] = 'z'; +if(test + '' != '[object z]'){ + _dereq_('./_redefine')(Object.prototype, 'toString', function toString(){ + return '[object ' + classof(this) + ']'; + }, true); } +},{"./_classof":12,"./_redefine":48,"./_wks":63}],67:[function(_dereq_,module,exports){ +'use strict'; +var LIBRARY = _dereq_('./_library') + , global = _dereq_('./_global') + , ctx = _dereq_('./_ctx') + , classof = _dereq_('./_classof') + , $export = _dereq_('./_export') + , isObject = _dereq_('./_is-object') + , aFunction = _dereq_('./_a-function') + , anInstance = _dereq_('./_an-instance') + , forOf = _dereq_('./_for-of') + , speciesConstructor = _dereq_('./_species-constructor') + , task = _dereq_('./_task').set + , microtask = _dereq_('./_microtask')() + , PROMISE = 'Promise' + , TypeError = global.TypeError + , process = global.process + , $Promise = global[PROMISE] + , process = global.process + , isNode = classof(process) == 'process' + , empty = function(){ /* empty */ } + , Internal, GenericPromiseCapability, Wrapper; -},{}],8:[function(_dereq_,module,exports){ -// shim for using process in browser -var process = module.exports = {}; - -// cached from whatever global is present so that test runners that stub it -// don't break things. But we need to wrap it in a try catch in case it is -// wrapped in strict mode code which doesn't define any globals. It's inside a -// function because try/catches deoptimize in certain engines. - -var cachedSetTimeout; -var cachedClearTimeout; +var USE_NATIVE = !!function(){ + try { + // correct subclassing with @@species support + var promise = $Promise.resolve(1) + , FakePromise = (promise.constructor = {})[_dereq_('./_wks')('species')] = function(exec){ exec(empty, empty); }; + // unhandled rejections tracking support, NodeJS Promise without it fails @@species test + return (isNode || typeof PromiseRejectionEvent == 'function') && promise.then(empty) instanceof FakePromise; + } catch(e){ /* empty */ } +}(); -function defaultSetTimout() { - throw new Error('setTimeout has not been defined'); -} -function defaultClearTimeout () { - throw new Error('clearTimeout has not been defined'); -} -(function () { - try { - if (typeof setTimeout === 'function') { - cachedSetTimeout = setTimeout; - } else { - cachedSetTimeout = defaultSetTimout; - } - } catch (e) { - cachedSetTimeout = defaultSetTimout; - } - try { - if (typeof clearTimeout === 'function') { - cachedClearTimeout = clearTimeout; - } else { - cachedClearTimeout = defaultClearTimeout; +// helpers +var sameConstructor = function(a, b){ + // with library wrapper special case + return a === b || a === $Promise && b === Wrapper; +}; +var isThenable = function(it){ + var then; + return isObject(it) && typeof (then = it.then) == 'function' ? then : false; +}; +var newPromiseCapability = function(C){ + return sameConstructor($Promise, C) + ? new PromiseCapability(C) + : new GenericPromiseCapability(C); +}; +var PromiseCapability = GenericPromiseCapability = function(C){ + var resolve, reject; + this.promise = new C(function($$resolve, $$reject){ + if(resolve !== undefined || reject !== undefined)throw TypeError('Bad Promise constructor'); + resolve = $$resolve; + reject = $$reject; + }); + this.resolve = aFunction(resolve); + this.reject = aFunction(reject); +}; +var perform = function(exec){ + try { + exec(); + } catch(e){ + return {error: e}; + } +}; +var notify = function(promise, isReject){ + if(promise._n)return; + promise._n = true; + var chain = promise._c; + microtask(function(){ + var value = promise._v + , ok = promise._s == 1 + , i = 0; + var run = function(reaction){ + var handler = ok ? reaction.ok : reaction.fail + , resolve = reaction.resolve + , reject = reaction.reject + , domain = reaction.domain + , result, then; + try { + if(handler){ + if(!ok){ + if(promise._h == 2)onHandleUnhandled(promise); + promise._h = 1; + } + if(handler === true)result = value; + else { + if(domain)domain.enter(); + result = handler(value); + if(domain)domain.exit(); + } + if(result === reaction.promise){ + reject(TypeError('Promise-chain cycle')); + } else if(then = isThenable(result)){ + then.call(result, resolve, reject); + } else resolve(result); + } else reject(value); + } catch(e){ + reject(e); + } + }; + while(chain.length > i)run(chain[i++]); // variable length - can't use forEach + promise._c = []; + promise._n = false; + if(isReject && !promise._h)onUnhandled(promise); + }); +}; +var onUnhandled = function(promise){ + task.call(global, function(){ + var value = promise._v + , abrupt, handler, console; + if(isUnhandled(promise)){ + abrupt = perform(function(){ + if(isNode){ + process.emit('unhandledRejection', value, promise); + } else if(handler = global.onunhandledrejection){ + handler({promise: promise, reason: value}); + } else if((console = global.console) && console.error){ + console.error('Unhandled promise rejection', value); } - } catch (e) { - cachedClearTimeout = defaultClearTimeout; - } -} ()) -function runTimeout(fun) { - if (cachedSetTimeout === setTimeout) { - //normal enviroments in sane situations - return setTimeout(fun, 0); - } - // if setTimeout wasn't available but was latter defined - if ((cachedSetTimeout === defaultSetTimout || !cachedSetTimeout) && setTimeout) { - cachedSetTimeout = setTimeout; - return setTimeout(fun, 0); + }); + // Browsers should not trigger `rejectionHandled` event if it was handled here, NodeJS - should + promise._h = isNode || isUnhandled(promise) ? 2 : 1; + } promise._a = undefined; + if(abrupt)throw abrupt.error; + }); +}; +var isUnhandled = function(promise){ + if(promise._h == 1)return false; + var chain = promise._a || promise._c + , i = 0 + , reaction; + while(chain.length > i){ + reaction = chain[i++]; + if(reaction.fail || !isUnhandled(reaction.promise))return false; + } return true; +}; +var onHandleUnhandled = function(promise){ + task.call(global, function(){ + var handler; + if(isNode){ + process.emit('rejectionHandled', promise); + } else if(handler = global.onrejectionhandled){ + handler({promise: promise, reason: promise._v}); } - try { - // when when somebody has screwed with setTimeout but no I.E. maddness - return cachedSetTimeout(fun, 0); - } catch(e){ + }); +}; +var $reject = function(value){ + var promise = this; + if(promise._d)return; + promise._d = true; + promise = promise._w || promise; // unwrap + promise._v = value; + promise._s = 2; + if(!promise._a)promise._a = promise._c.slice(); + notify(promise, true); +}; +var $resolve = function(value){ + var promise = this + , then; + if(promise._d)return; + promise._d = true; + promise = promise._w || promise; // unwrap + try { + if(promise === value)throw TypeError("Promise can't be resolved itself"); + if(then = isThenable(value)){ + microtask(function(){ + var wrapper = {_w: promise, _d: false}; // wrap try { - // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally - return cachedSetTimeout.call(null, fun, 0); + then.call(value, ctx($resolve, wrapper, 1), ctx($reject, wrapper, 1)); } catch(e){ - // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error - return cachedSetTimeout.call(this, fun, 0); + $reject.call(wrapper, e); } + }); + } else { + promise._v = value; + promise._s = 1; + notify(promise, false); } + } catch(e){ + $reject.call({_w: promise, _d: false}, e); // wrap + } +}; - -} -function runClearTimeout(marker) { - if (cachedClearTimeout === clearTimeout) { - //normal enviroments in sane situations - return clearTimeout(marker); - } - // if clearTimeout wasn't available but was latter defined - if ((cachedClearTimeout === defaultClearTimeout || !cachedClearTimeout) && clearTimeout) { - cachedClearTimeout = clearTimeout; - return clearTimeout(marker); - } +// constructor polyfill +if(!USE_NATIVE){ + // 25.4.3.1 Promise(executor) + $Promise = function Promise(executor){ + anInstance(this, $Promise, PROMISE, '_h'); + aFunction(executor); + Internal.call(this); try { - // when when somebody has screwed with setTimeout but no I.E. maddness - return cachedClearTimeout(marker); - } catch (e){ - try { - // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally - return cachedClearTimeout.call(null, marker); - } catch (e){ - // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error. - // Some versions of I.E. have different rules for clearTimeout vs setTimeout - return cachedClearTimeout.call(this, marker); - } - } - - - -} -var queue = []; -var draining = false; -var currentQueue; -var queueIndex = -1; - -function cleanUpNextTick() { - if (!draining || !currentQueue) { - return; - } - draining = false; - if (currentQueue.length) { - queue = currentQueue.concat(queue); - } else { - queueIndex = -1; + executor(ctx($resolve, this, 1), ctx($reject, this, 1)); + } catch(err){ + $reject.call(this, err); } - if (queue.length) { - drainQueue(); - } -} - -function drainQueue() { - if (draining) { - return; - } - var timeout = runTimeout(cleanUpNextTick); - draining = true; - - var len = queue.length; - while(len) { - currentQueue = queue; - queue = []; - while (++queueIndex < len) { - if (currentQueue) { - currentQueue[queueIndex].run(); - } - } - queueIndex = -1; - len = queue.length; - } - currentQueue = null; - draining = false; - runClearTimeout(timeout); -} - -process.nextTick = function (fun) { - var args = new Array(arguments.length - 1); - if (arguments.length > 1) { - for (var i = 1; i < arguments.length; i++) { - args[i - 1] = arguments[i]; - } - } - queue.push(new Item(fun, args)); - if (queue.length === 1 && !draining) { - runTimeout(drainQueue); + }; + Internal = function Promise(executor){ + this._c = []; // <- awaiting reactions + this._a = undefined; // <- checked in isUnhandled reactions + this._s = 0; // <- state + this._d = false; // <- done + this._v = undefined; // <- value + this._h = 0; // <- rejection state, 0 - default, 1 - handled, 2 - unhandled + this._n = false; // <- notify + }; + Internal.prototype = _dereq_('./_redefine-all')($Promise.prototype, { + // 25.4.5.3 Promise.prototype.then(onFulfilled, onRejected) + then: function then(onFulfilled, onRejected){ + var reaction = newPromiseCapability(speciesConstructor(this, $Promise)); + reaction.ok = typeof onFulfilled == 'function' ? onFulfilled : true; + reaction.fail = typeof onRejected == 'function' && onRejected; + reaction.domain = isNode ? process.domain : undefined; + this._c.push(reaction); + if(this._a)this._a.push(reaction); + if(this._s)notify(this, false); + return reaction.promise; + }, + // 25.4.5.1 Promise.prototype.catch(onRejected) + 'catch': function(onRejected){ + return this.then(undefined, onRejected); } -}; - -// v8 likes predictible objects -function Item(fun, array) { - this.fun = fun; - this.array = array; + }); + PromiseCapability = function(){ + var promise = new Internal; + this.promise = promise; + this.resolve = ctx($resolve, promise, 1); + this.reject = ctx($reject, promise, 1); + }; } -Item.prototype.run = function () { - this.fun.apply(null, this.array); -}; -process.title = 'browser'; -process.browser = true; -process.env = {}; -process.argv = []; -process.version = ''; // empty string to avoid regexp issues -process.versions = {}; - -function noop() {} - -process.on = noop; -process.addListener = noop; -process.once = noop; -process.off = noop; -process.removeListener = noop; -process.removeAllListeners = noop; -process.emit = noop; - -process.binding = function (name) { - throw new Error('process.binding is not supported'); -}; -process.cwd = function () { return '/' }; -process.chdir = function (dir) { - throw new Error('process.chdir is not supported'); -}; -process.umask = function() { return 0; }; +$export($export.G + $export.W + $export.F * !USE_NATIVE, {Promise: $Promise}); +_dereq_('./_set-to-string-tag')($Promise, PROMISE); +_dereq_('./_set-species')(PROMISE); +Wrapper = _dereq_('./_core')[PROMISE]; -},{}],9:[function(_dereq_,module,exports){ -if (typeof Object.create === 'function') { - // implementation from standard node.js 'util' module - module.exports = function inherits(ctor, superCtor) { - ctor.super_ = superCtor - ctor.prototype = Object.create(superCtor.prototype, { - constructor: { - value: ctor, - enumerable: false, - writable: true, - configurable: true - } +// statics +$export($export.S + $export.F * !USE_NATIVE, PROMISE, { + // 25.4.4.5 Promise.reject(r) + reject: function reject(r){ + var capability = newPromiseCapability(this) + , $$reject = capability.reject; + $$reject(r); + return capability.promise; + } +}); +$export($export.S + $export.F * (LIBRARY || !USE_NATIVE), PROMISE, { + // 25.4.4.6 Promise.resolve(x) + resolve: function resolve(x){ + // instanceof instead of internal slot check because we should fix it without replacement native Promise core + if(x instanceof $Promise && sameConstructor(x.constructor, this))return x; + var capability = newPromiseCapability(this) + , $$resolve = capability.resolve; + $$resolve(x); + return capability.promise; + } +}); +$export($export.S + $export.F * !(USE_NATIVE && _dereq_('./_iter-detect')(function(iter){ + $Promise.all(iter)['catch'](empty); +})), PROMISE, { + // 25.4.4.1 Promise.all(iterable) + all: function all(iterable){ + var C = this + , capability = newPromiseCapability(C) + , resolve = capability.resolve + , reject = capability.reject; + var abrupt = perform(function(){ + var values = [] + , index = 0 + , remaining = 1; + forOf(iterable, false, function(promise){ + var $index = index++ + , alreadyCalled = false; + values.push(undefined); + remaining++; + C.resolve(promise).then(function(value){ + if(alreadyCalled)return; + alreadyCalled = true; + values[$index] = value; + --remaining || resolve(values); + }, reject); + }); + --remaining || resolve(values); }); - }; -} else { - // old school shim for old browsers - module.exports = function inherits(ctor, superCtor) { - ctor.super_ = superCtor - var TempCtor = function () {} - TempCtor.prototype = superCtor.prototype - ctor.prototype = new TempCtor() - ctor.prototype.constructor = ctor + if(abrupt)reject(abrupt.error); + return capability.promise; + }, + // 25.4.4.4 Promise.race(iterable) + race: function race(iterable){ + var C = this + , capability = newPromiseCapability(C) + , reject = capability.reject; + var abrupt = perform(function(){ + forOf(iterable, false, function(promise){ + C.resolve(promise).then(capability.resolve, reject); + }); + }); + if(abrupt)reject(abrupt.error); + return capability.promise; } -} +}); +},{"./_a-function":7,"./_an-instance":9,"./_classof":12,"./_core":14,"./_ctx":15,"./_export":20,"./_for-of":22,"./_global":23,"./_is-object":31,"./_iter-detect":35,"./_library":38,"./_microtask":39,"./_redefine-all":47,"./_set-species":49,"./_set-to-string-tag":50,"./_species-constructor":53,"./_task":55,"./_wks":63}],68:[function(_dereq_,module,exports){ +'use strict'; +var $at = _dereq_('./_string-at')(true); -},{}],10:[function(_dereq_,module,exports){ -module.exports = function isBuffer(arg) { - return arg && typeof arg === 'object' - && typeof arg.copy === 'function' - && typeof arg.fill === 'function' - && typeof arg.readUInt8 === 'function'; +// 21.1.3.27 String.prototype[@@iterator]() +_dereq_('./_iter-define')(String, 'String', function(iterated){ + this._t = String(iterated); // target + this._i = 0; // next index +// 21.1.5.2.1 %StringIteratorPrototype%.next() +}, function(){ + var O = this._t + , index = this._i + , point; + if(index >= O.length)return {value: undefined, done: true}; + point = $at(O, index); + this._i += point.length; + return {value: point, done: false}; +}); +},{"./_iter-define":34,"./_string-at":54}],69:[function(_dereq_,module,exports){ +var $iterators = _dereq_('./es6.array.iterator') + , redefine = _dereq_('./_redefine') + , global = _dereq_('./_global') + , hide = _dereq_('./_hide') + , Iterators = _dereq_('./_iterators') + , wks = _dereq_('./_wks') + , ITERATOR = wks('iterator') + , TO_STRING_TAG = wks('toStringTag') + , ArrayValues = Iterators.Array; + +for(var collections = ['NodeList', 'DOMTokenList', 'MediaList', 'StyleSheetList', 'CSSRuleList'], i = 0; i < 5; i++){ + var NAME = collections[i] + , Collection = global[NAME] + , proto = Collection && Collection.prototype + , key; + if(proto){ + if(!proto[ITERATOR])hide(proto, ITERATOR, ArrayValues); + if(!proto[TO_STRING_TAG])hide(proto, TO_STRING_TAG, NAME); + Iterators[NAME] = ArrayValues; + for(key in $iterators)if(!proto[key])redefine(proto, key, $iterators[key], true); + } } -},{}],11:[function(_dereq_,module,exports){ -(function (process,global){ +},{"./_global":23,"./_hide":25,"./_iterators":37,"./_redefine":48,"./_wks":63,"./es6.array.iterator":65}],70:[function(_dereq_,module,exports){ +(function (Buffer){ // Copyright Joyent, Inc. and other Node contributors. // // Permission is hereby granted, free of charge, to any person obtaining a @@ -2567,2653 +3458,1249 @@ module.exports = function isBuffer(arg) { // OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE // USE OR OTHER DEALINGS IN THE SOFTWARE. -var formatRegExp = /%[sdj%]/g; -exports.format = function(f) { - if (!isString(f)) { - var objects = []; - for (var i = 0; i < arguments.length; i++) { - objects.push(inspect(arguments[i])); - } - return objects.join(' '); - } - - var i = 1; - var args = arguments; - var len = args.length; - var str = String(f).replace(formatRegExp, function(x) { - if (x === '%%') return '%'; - if (i >= len) return x; - switch (x) { - case '%s': return String(args[i++]); - case '%d': return Number(args[i++]); - case '%j': - try { - return JSON.stringify(args[i++]); - } catch (_) { - return '[Circular]'; - } - default: - return x; - } - }); - for (var x = args[i]; i < len; x = args[++i]) { - if (isNull(x) || !isObject(x)) { - str += ' ' + x; - } else { - str += ' ' + inspect(x); - } - } - return str; -}; - - -// Mark that a method should not be used. -// Returns a modified function which warns once by default. -// If --no-deprecation is set, then it is a no-op. -exports.deprecate = function(fn, msg) { - // Allow for deprecating things in the process of starting up. - if (isUndefined(global.process)) { - return function() { - return exports.deprecate(fn, msg).apply(this, arguments); - }; - } - - if (process.noDeprecation === true) { - return fn; - } +// NOTE: These type checking functions intentionally don't use `instanceof` +// because it is fragile and can be easily faked with `Object.create()`. - var warned = false; - function deprecated() { - if (!warned) { - if (process.throwDeprecation) { - throw new Error(msg); - } else if (process.traceDeprecation) { - console.trace(msg); - } else { - console.error(msg); - } - warned = true; - } - return fn.apply(this, arguments); +function isArray(arg) { + if (Array.isArray) { + return Array.isArray(arg); } + return objectToString(arg) === '[object Array]'; +} +exports.isArray = isArray; - return deprecated; -}; - - -var debugs = {}; -var debugEnviron; -exports.debuglog = function(set) { - if (isUndefined(debugEnviron)) - debugEnviron = process.env.NODE_DEBUG || ''; - set = set.toUpperCase(); - if (!debugs[set]) { - if (new RegExp('\\b' + set + '\\b', 'i').test(debugEnviron)) { - var pid = process.pid; - debugs[set] = function() { - var msg = exports.format.apply(exports, arguments); - console.error('%s %d: %s', set, pid, msg); - }; - } else { - debugs[set] = function() {}; - } - } - return debugs[set]; -}; +function isBoolean(arg) { + return typeof arg === 'boolean'; +} +exports.isBoolean = isBoolean; +function isNull(arg) { + return arg === null; +} +exports.isNull = isNull; -/** - * Echos the value of a value. Trys to print the value out - * in the best way possible given the different types. - * - * @param {Object} obj The object to print out. - * @param {Object} opts Optional options object that alters the output. - */ -/* legacy: obj, showHidden, depth, colors*/ -function inspect(obj, opts) { - // default options - var ctx = { - seen: [], - stylize: stylizeNoColor - }; - // legacy... - if (arguments.length >= 3) ctx.depth = arguments[2]; - if (arguments.length >= 4) ctx.colors = arguments[3]; - if (isBoolean(opts)) { - // legacy... - ctx.showHidden = opts; - } else if (opts) { - // got an "options" object - exports._extend(ctx, opts); - } - // set default options - if (isUndefined(ctx.showHidden)) ctx.showHidden = false; - if (isUndefined(ctx.depth)) ctx.depth = 2; - if (isUndefined(ctx.colors)) ctx.colors = false; - if (isUndefined(ctx.customInspect)) ctx.customInspect = true; - if (ctx.colors) ctx.stylize = stylizeWithColor; - return formatValue(ctx, obj, ctx.depth); +function isNullOrUndefined(arg) { + return arg == null; } -exports.inspect = inspect; +exports.isNullOrUndefined = isNullOrUndefined; +function isNumber(arg) { + return typeof arg === 'number'; +} +exports.isNumber = isNumber; -// http://en.wikipedia.org/wiki/ANSI_escape_code#graphics -inspect.colors = { - 'bold' : [1, 22], - 'italic' : [3, 23], - 'underline' : [4, 24], - 'inverse' : [7, 27], - 'white' : [37, 39], - 'grey' : [90, 39], - 'black' : [30, 39], - 'blue' : [34, 39], - 'cyan' : [36, 39], - 'green' : [32, 39], - 'magenta' : [35, 39], - 'red' : [31, 39], - 'yellow' : [33, 39] -}; +function isString(arg) { + return typeof arg === 'string'; +} +exports.isString = isString; -// Don't use 'blue' not visible on cmd.exe -inspect.styles = { - 'special': 'cyan', - 'number': 'yellow', - 'boolean': 'yellow', - 'undefined': 'grey', - 'null': 'bold', - 'string': 'green', - 'date': 'magenta', - // "name": intentionally not styling - 'regexp': 'red' -}; +function isSymbol(arg) { + return typeof arg === 'symbol'; +} +exports.isSymbol = isSymbol; +function isUndefined(arg) { + return arg === void 0; +} +exports.isUndefined = isUndefined; -function stylizeWithColor(str, styleType) { - var style = inspect.styles[styleType]; +function isRegExp(re) { + return objectToString(re) === '[object RegExp]'; +} +exports.isRegExp = isRegExp; - if (style) { - return '\u001b[' + inspect.colors[style][0] + 'm' + str + - '\u001b[' + inspect.colors[style][1] + 'm'; - } else { - return str; - } +function isObject(arg) { + return typeof arg === 'object' && arg !== null; } +exports.isObject = isObject; +function isDate(d) { + return objectToString(d) === '[object Date]'; +} +exports.isDate = isDate; -function stylizeNoColor(str, styleType) { - return str; +function isError(e) { + return (objectToString(e) === '[object Error]' || e instanceof Error); } +exports.isError = isError; +function isFunction(arg) { + return typeof arg === 'function'; +} +exports.isFunction = isFunction; -function arrayToHash(array) { - var hash = {}; +function isPrimitive(arg) { + return arg === null || + typeof arg === 'boolean' || + typeof arg === 'number' || + typeof arg === 'string' || + typeof arg === 'symbol' || // ES6 symbol + typeof arg === 'undefined'; +} +exports.isPrimitive = isPrimitive; - array.forEach(function(val, idx) { - hash[val] = true; - }); +exports.isBuffer = Buffer.isBuffer; - return hash; +function objectToString(o) { + return Object.prototype.toString.call(o); } +}).call(this,{"isBuffer":_dereq_("../../is-buffer/index.js")}) -function formatValue(ctx, value, recurseTimes) { - // Provide a hook for user-specified inspect functions. - // Check that value is an object with an inspect function on it - if (ctx.customInspect && - value && - isFunction(value.inspect) && - // Filter out the util module, it's inspect function is special - value.inspect !== exports.inspect && - // Also filter out any prototype objects using the circular check. - !(value.constructor && value.constructor.prototype === value)) { - var ret = value.inspect(recurseTimes, ctx); - if (!isString(ret)) { - ret = formatValue(ctx, ret, recurseTimes); - } - return ret; - } - - // Primitive types cannot have properties - var primitive = formatPrimitive(ctx, value); - if (primitive) { - return primitive; - } +},{"../../is-buffer/index.js":93}],71:[function(_dereq_,module,exports){ +// (c) Dean McNamee , 2012. +// +// https://github.com/deanm/css-color-parser-js +// +// Permission is hereby granted, free of charge, to any person obtaining a copy +// of this software and associated documentation files (the "Software"), to +// deal in the Software without restriction, including without limitation the +// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or +// sell copies of the Software, and to permit persons to whom the Software is +// furnished to do so, subject to the following conditions: +// +// The above copyright notice and this permission notice shall be included in +// all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS +// IN THE SOFTWARE. - // Look up the keys of the object. - var keys = Object.keys(value); - var visibleKeys = arrayToHash(keys); +// http://www.w3.org/TR/css3-color/ +var kCSSColorTable = { + "transparent": [0,0,0,0], "aliceblue": [240,248,255,1], + "antiquewhite": [250,235,215,1], "aqua": [0,255,255,1], + "aquamarine": [127,255,212,1], "azure": [240,255,255,1], + "beige": [245,245,220,1], "bisque": [255,228,196,1], + "black": [0,0,0,1], "blanchedalmond": [255,235,205,1], + "blue": [0,0,255,1], "blueviolet": [138,43,226,1], + "brown": [165,42,42,1], "burlywood": [222,184,135,1], + "cadetblue": [95,158,160,1], "chartreuse": [127,255,0,1], + "chocolate": [210,105,30,1], "coral": [255,127,80,1], + "cornflowerblue": [100,149,237,1], "cornsilk": [255,248,220,1], + "crimson": [220,20,60,1], "cyan": [0,255,255,1], + "darkblue": [0,0,139,1], "darkcyan": [0,139,139,1], + "darkgoldenrod": [184,134,11,1], "darkgray": [169,169,169,1], + "darkgreen": [0,100,0,1], "darkgrey": [169,169,169,1], + "darkkhaki": [189,183,107,1], "darkmagenta": [139,0,139,1], + "darkolivegreen": [85,107,47,1], "darkorange": [255,140,0,1], + "darkorchid": [153,50,204,1], "darkred": [139,0,0,1], + "darksalmon": [233,150,122,1], "darkseagreen": [143,188,143,1], + "darkslateblue": [72,61,139,1], "darkslategray": [47,79,79,1], + "darkslategrey": [47,79,79,1], "darkturquoise": [0,206,209,1], + "darkviolet": [148,0,211,1], "deeppink": [255,20,147,1], + "deepskyblue": [0,191,255,1], "dimgray": [105,105,105,1], + "dimgrey": [105,105,105,1], "dodgerblue": [30,144,255,1], + "firebrick": [178,34,34,1], "floralwhite": [255,250,240,1], + "forestgreen": [34,139,34,1], "fuchsia": [255,0,255,1], + "gainsboro": [220,220,220,1], "ghostwhite": [248,248,255,1], + "gold": [255,215,0,1], "goldenrod": [218,165,32,1], + "gray": [128,128,128,1], "green": [0,128,0,1], + "greenyellow": [173,255,47,1], "grey": [128,128,128,1], + "honeydew": [240,255,240,1], "hotpink": [255,105,180,1], + "indianred": [205,92,92,1], "indigo": [75,0,130,1], + "ivory": [255,255,240,1], "khaki": [240,230,140,1], + "lavender": [230,230,250,1], "lavenderblush": [255,240,245,1], + "lawngreen": [124,252,0,1], "lemonchiffon": [255,250,205,1], + "lightblue": [173,216,230,1], "lightcoral": [240,128,128,1], + "lightcyan": [224,255,255,1], "lightgoldenrodyellow": [250,250,210,1], + "lightgray": [211,211,211,1], "lightgreen": [144,238,144,1], + "lightgrey": [211,211,211,1], "lightpink": [255,182,193,1], + "lightsalmon": [255,160,122,1], "lightseagreen": [32,178,170,1], + "lightskyblue": [135,206,250,1], "lightslategray": [119,136,153,1], + "lightslategrey": [119,136,153,1], "lightsteelblue": [176,196,222,1], + "lightyellow": [255,255,224,1], "lime": [0,255,0,1], + "limegreen": [50,205,50,1], "linen": [250,240,230,1], + "magenta": [255,0,255,1], "maroon": [128,0,0,1], + "mediumaquamarine": [102,205,170,1], "mediumblue": [0,0,205,1], + "mediumorchid": [186,85,211,1], "mediumpurple": [147,112,219,1], + "mediumseagreen": [60,179,113,1], "mediumslateblue": [123,104,238,1], + "mediumspringgreen": [0,250,154,1], "mediumturquoise": [72,209,204,1], + "mediumvioletred": [199,21,133,1], "midnightblue": [25,25,112,1], + "mintcream": [245,255,250,1], "mistyrose": [255,228,225,1], + "moccasin": [255,228,181,1], "navajowhite": [255,222,173,1], + "navy": [0,0,128,1], "oldlace": [253,245,230,1], + "olive": [128,128,0,1], "olivedrab": [107,142,35,1], + "orange": [255,165,0,1], "orangered": [255,69,0,1], + "orchid": [218,112,214,1], "palegoldenrod": [238,232,170,1], + "palegreen": [152,251,152,1], "paleturquoise": [175,238,238,1], + "palevioletred": [219,112,147,1], "papayawhip": [255,239,213,1], + "peachpuff": [255,218,185,1], "peru": [205,133,63,1], + "pink": [255,192,203,1], "plum": [221,160,221,1], + "powderblue": [176,224,230,1], "purple": [128,0,128,1], + "rebeccapurple": [102,51,153,1], + "red": [255,0,0,1], "rosybrown": [188,143,143,1], + "royalblue": [65,105,225,1], "saddlebrown": [139,69,19,1], + "salmon": [250,128,114,1], "sandybrown": [244,164,96,1], + "seagreen": [46,139,87,1], "seashell": [255,245,238,1], + "sienna": [160,82,45,1], "silver": [192,192,192,1], + "skyblue": [135,206,235,1], "slateblue": [106,90,205,1], + "slategray": [112,128,144,1], "slategrey": [112,128,144,1], + "snow": [255,250,250,1], "springgreen": [0,255,127,1], + "steelblue": [70,130,180,1], "tan": [210,180,140,1], + "teal": [0,128,128,1], "thistle": [216,191,216,1], + "tomato": [255,99,71,1], "turquoise": [64,224,208,1], + "violet": [238,130,238,1], "wheat": [245,222,179,1], + "white": [255,255,255,1], "whitesmoke": [245,245,245,1], + "yellow": [255,255,0,1], "yellowgreen": [154,205,50,1]} - if (ctx.showHidden) { - keys = Object.getOwnPropertyNames(value); - } +function clamp_css_byte(i) { // Clamp to integer 0 .. 255. + i = Math.round(i); // Seems to be what Chrome does (vs truncation). + return i < 0 ? 0 : i > 255 ? 255 : i; +} - // IE doesn't make error fields non-enumerable - // http://msdn.microsoft.com/en-us/library/ie/dww52sbt(v=vs.94).aspx - if (isError(value) - && (keys.indexOf('message') >= 0 || keys.indexOf('description') >= 0)) { - return formatError(value); - } +function clamp_css_float(f) { // Clamp to float 0.0 .. 1.0. + return f < 0 ? 0 : f > 1 ? 1 : f; +} - // Some type of object without properties can be shortcutted. - if (keys.length === 0) { - if (isFunction(value)) { - var name = value.name ? ': ' + value.name : ''; - return ctx.stylize('[Function' + name + ']', 'special'); - } - if (isRegExp(value)) { - return ctx.stylize(RegExp.prototype.toString.call(value), 'regexp'); - } - if (isDate(value)) { - return ctx.stylize(Date.prototype.toString.call(value), 'date'); - } - if (isError(value)) { - return formatError(value); - } - } +function parse_css_int(str) { // int or percentage. + if (str[str.length - 1] === '%') + return clamp_css_byte(parseFloat(str) / 100 * 255); + return clamp_css_byte(parseInt(str)); +} - var base = '', array = false, braces = ['{', '}']; +function parse_css_float(str) { // float or percentage. + if (str[str.length - 1] === '%') + return clamp_css_float(parseFloat(str) / 100); + return clamp_css_float(parseFloat(str)); +} - // Make Array say that they are Array - if (isArray(value)) { - array = true; - braces = ['[', ']']; - } +function css_hue_to_rgb(m1, m2, h) { + if (h < 0) h += 1; + else if (h > 1) h -= 1; - // Make functions say that they are functions - if (isFunction(value)) { - var n = value.name ? ': ' + value.name : ''; - base = ' [Function' + n + ']'; - } + if (h * 6 < 1) return m1 + (m2 - m1) * h * 6; + if (h * 2 < 1) return m2; + if (h * 3 < 2) return m1 + (m2 - m1) * (2/3 - h) * 6; + return m1; +} - // Make RegExps say that they are RegExps - if (isRegExp(value)) { - base = ' ' + RegExp.prototype.toString.call(value); - } +function parseCSSColor(css_str) { + // Remove all whitespace, not compliant, but should just be more accepting. + var str = css_str.replace(/ /g, '').toLowerCase(); - // Make dates with properties first say the date - if (isDate(value)) { - base = ' ' + Date.prototype.toUTCString.call(value); - } + // Color keywords (and transparent) lookup. + if (str in kCSSColorTable) return kCSSColorTable[str].slice(); // dup. - // Make error with message first say the error - if (isError(value)) { - base = ' ' + formatError(value); - } + // #abc and #abc123 syntax. + if (str[0] === '#') { + if (str.length === 4) { + var iv = parseInt(str.substr(1), 16); // TODO(deanm): Stricter parsing. + if (!(iv >= 0 && iv <= 0xfff)) return null; // Covers NaN. + return [((iv & 0xf00) >> 4) | ((iv & 0xf00) >> 8), + (iv & 0xf0) | ((iv & 0xf0) >> 4), + (iv & 0xf) | ((iv & 0xf) << 4), + 1]; + } else if (str.length === 7) { + var iv = parseInt(str.substr(1), 16); // TODO(deanm): Stricter parsing. + if (!(iv >= 0 && iv <= 0xffffff)) return null; // Covers NaN. + return [(iv & 0xff0000) >> 16, + (iv & 0xff00) >> 8, + iv & 0xff, + 1]; + } - if (keys.length === 0 && (!array || value.length == 0)) { - return braces[0] + base + braces[1]; + return null; } - if (recurseTimes < 0) { - if (isRegExp(value)) { - return ctx.stylize(RegExp.prototype.toString.call(value), 'regexp'); - } else { - return ctx.stylize('[Object]', 'special'); + var op = str.indexOf('('), ep = str.indexOf(')'); + if (op !== -1 && ep + 1 === str.length) { + var fname = str.substr(0, op); + var params = str.substr(op+1, ep-(op+1)).split(','); + var alpha = 1; // To allow case fallthrough. + switch (fname) { + case 'rgba': + if (params.length !== 4) return null; + alpha = parse_css_float(params.pop()); + // Fall through. + case 'rgb': + if (params.length !== 3) return null; + return [parse_css_int(params[0]), + parse_css_int(params[1]), + parse_css_int(params[2]), + alpha]; + case 'hsla': + if (params.length !== 4) return null; + alpha = parse_css_float(params.pop()); + // Fall through. + case 'hsl': + if (params.length !== 3) return null; + var h = (((parseFloat(params[0]) % 360) + 360) % 360) / 360; // 0 .. 1 + // NOTE(deanm): According to the CSS spec s/l should only be + // percentages, but we don't bother and let float or percentage. + var s = parse_css_float(params[1]); + var l = parse_css_float(params[2]); + var m2 = l <= 0.5 ? l * (s + 1) : l + s - l * s; + var m1 = l * 2 - m2; + return [clamp_css_byte(css_hue_to_rgb(m1, m2, h+1/3) * 255), + clamp_css_byte(css_hue_to_rgb(m1, m2, h) * 255), + clamp_css_byte(css_hue_to_rgb(m1, m2, h-1/3) * 255), + alpha]; + default: + return null; } } - ctx.seen.push(value); + return null; +} - var output; - if (array) { - output = formatArray(ctx, value, recurseTimes, visibleKeys, keys); - } else { - output = keys.map(function(key) { - return formatProperty(ctx, value, recurseTimes, visibleKeys, key, array); - }); - } +try { exports.parseCSSColor = parseCSSColor } catch(e) { } - ctx.seen.pop(); +},{}],72:[function(_dereq_,module,exports){ +'use strict'; - return reduceToSingleString(output, base, braces); -} +module.exports = earcut; +function earcut(data, holeIndices, dim) { -function formatPrimitive(ctx, value) { - if (isUndefined(value)) - return ctx.stylize('undefined', 'undefined'); - if (isString(value)) { - var simple = '\'' + JSON.stringify(value).replace(/^"|"$/g, '') - .replace(/'/g, "\\'") - .replace(/\\"/g, '"') + '\''; - return ctx.stylize(simple, 'string'); - } - if (isNumber(value)) - return ctx.stylize('' + value, 'number'); - if (isBoolean(value)) - return ctx.stylize('' + value, 'boolean'); - // For some reason typeof null is "object", so special case here. - if (isNull(value)) - return ctx.stylize('null', 'null'); -} + dim = dim || 2; + var hasHoles = holeIndices && holeIndices.length, + outerLen = hasHoles ? holeIndices[0] * dim : data.length, + outerNode = linkedList(data, 0, outerLen, dim, true), + triangles = []; -function formatError(value) { - return '[' + Error.prototype.toString.call(value) + ']'; -} + if (!outerNode) return triangles; + var minX, minY, maxX, maxY, x, y, size; -function formatArray(ctx, value, recurseTimes, visibleKeys, keys) { - var output = []; - for (var i = 0, l = value.length; i < l; ++i) { - if (hasOwnProperty(value, String(i))) { - output.push(formatProperty(ctx, value, recurseTimes, visibleKeys, - String(i), true)); - } else { - output.push(''); - } - } - keys.forEach(function(key) { - if (!key.match(/^\d+$/)) { - output.push(formatProperty(ctx, value, recurseTimes, visibleKeys, - key, true)); - } - }); - return output; -} + if (hasHoles) outerNode = eliminateHoles(data, holeIndices, outerNode, dim); + // if the shape is not too simple, we'll use z-order curve hash later; calculate polygon bbox + if (data.length > 80 * dim) { + minX = maxX = data[0]; + minY = maxY = data[1]; -function formatProperty(ctx, value, recurseTimes, visibleKeys, key, array) { - var name, str, desc; - desc = Object.getOwnPropertyDescriptor(value, key) || { value: value[key] }; - if (desc.get) { - if (desc.set) { - str = ctx.stylize('[Getter/Setter]', 'special'); - } else { - str = ctx.stylize('[Getter]', 'special'); - } - } else { - if (desc.set) { - str = ctx.stylize('[Setter]', 'special'); - } - } - if (!hasOwnProperty(visibleKeys, key)) { - name = '[' + key + ']'; - } - if (!str) { - if (ctx.seen.indexOf(desc.value) < 0) { - if (isNull(recurseTimes)) { - str = formatValue(ctx, desc.value, null); - } else { - str = formatValue(ctx, desc.value, recurseTimes - 1); - } - if (str.indexOf('\n') > -1) { - if (array) { - str = str.split('\n').map(function(line) { - return ' ' + line; - }).join('\n').substr(2); - } else { - str = '\n' + str.split('\n').map(function(line) { - return ' ' + line; - }).join('\n'); + for (var i = dim; i < outerLen; i += dim) { + x = data[i]; + y = data[i + 1]; + if (x < minX) minX = x; + if (y < minY) minY = y; + if (x > maxX) maxX = x; + if (y > maxY) maxY = y; } - } - } else { - str = ctx.stylize('[Circular]', 'special'); - } - } - if (isUndefined(name)) { - if (array && key.match(/^\d+$/)) { - return str; - } - name = JSON.stringify('' + key); - if (name.match(/^"([a-zA-Z_][a-zA-Z_0-9]*)"$/)) { - name = name.substr(1, name.length - 2); - name = ctx.stylize(name, 'name'); - } else { - name = name.replace(/'/g, "\\'") - .replace(/\\"/g, '"') - .replace(/(^"|"$)/g, "'"); - name = ctx.stylize(name, 'string'); + + // minX, minY and size are later used to transform coords into integers for z-order calculation + size = Math.max(maxX - minX, maxY - minY); } - } - return name + ': ' + str; + earcutLinked(outerNode, triangles, dim, minX, minY, size); + + return triangles; } +// create a circular doubly linked list from polygon points in the specified winding order +function linkedList(data, start, end, dim, clockwise) { + var i, last; -function reduceToSingleString(output, base, braces) { - var numLinesEst = 0; - var length = output.reduce(function(prev, cur) { - numLinesEst++; - if (cur.indexOf('\n') >= 0) numLinesEst++; - return prev + cur.replace(/\u001b\[\d\d?m/g, '').length + 1; - }, 0); + if (clockwise === (signedArea(data, start, end, dim) > 0)) { + for (i = start; i < end; i += dim) last = insertNode(i, data[i], data[i + 1], last); + } else { + for (i = end - dim; i >= start; i -= dim) last = insertNode(i, data[i], data[i + 1], last); + } - if (length > 60) { - return braces[0] + - (base === '' ? '' : base + '\n ') + - ' ' + - output.join(',\n ') + - ' ' + - braces[1]; - } + if (last && equals(last, last.next)) { + removeNode(last); + last = last.next; + } - return braces[0] + base + ' ' + output.join(', ') + ' ' + braces[1]; + return last; } +// eliminate colinear or duplicate points +function filterPoints(start, end) { + if (!start) return start; + if (!end) end = start; -// NOTE: These type checking functions intentionally don't use `instanceof` -// because it is fragile and can be easily faked with `Object.create()`. -function isArray(ar) { - return Array.isArray(ar); -} -exports.isArray = isArray; - -function isBoolean(arg) { - return typeof arg === 'boolean'; -} -exports.isBoolean = isBoolean; + var p = start, + again; + do { + again = false; -function isNull(arg) { - return arg === null; -} -exports.isNull = isNull; + if (!p.steiner && (equals(p, p.next) || area(p.prev, p, p.next) === 0)) { + removeNode(p); + p = end = p.prev; + if (p === p.next) return null; + again = true; -function isNullOrUndefined(arg) { - return arg == null; -} -exports.isNullOrUndefined = isNullOrUndefined; + } else { + p = p.next; + } + } while (again || p !== end); -function isNumber(arg) { - return typeof arg === 'number'; + return end; } -exports.isNumber = isNumber; -function isString(arg) { - return typeof arg === 'string'; -} -exports.isString = isString; +// main ear slicing loop which triangulates a polygon (given as a linked list) +function earcutLinked(ear, triangles, dim, minX, minY, size, pass) { + if (!ear) return; -function isSymbol(arg) { - return typeof arg === 'symbol'; -} -exports.isSymbol = isSymbol; + // interlink polygon nodes in z-order + if (!pass && size) indexCurve(ear, minX, minY, size); -function isUndefined(arg) { - return arg === void 0; -} -exports.isUndefined = isUndefined; + var stop = ear, + prev, next; -function isRegExp(re) { - return isObject(re) && objectToString(re) === '[object RegExp]'; -} -exports.isRegExp = isRegExp; + // iterate through ears, slicing them one by one + while (ear.prev !== ear.next) { + prev = ear.prev; + next = ear.next; -function isObject(arg) { - return typeof arg === 'object' && arg !== null; -} -exports.isObject = isObject; + if (size ? isEarHashed(ear, minX, minY, size) : isEar(ear)) { + // cut off the triangle + triangles.push(prev.i / dim); + triangles.push(ear.i / dim); + triangles.push(next.i / dim); -function isDate(d) { - return isObject(d) && objectToString(d) === '[object Date]'; -} -exports.isDate = isDate; + removeNode(ear); -function isError(e) { - return isObject(e) && - (objectToString(e) === '[object Error]' || e instanceof Error); -} -exports.isError = isError; + // skipping the next vertice leads to less sliver triangles + ear = next.next; + stop = next.next; -function isFunction(arg) { - return typeof arg === 'function'; -} -exports.isFunction = isFunction; + continue; + } -function isPrimitive(arg) { - return arg === null || - typeof arg === 'boolean' || - typeof arg === 'number' || - typeof arg === 'string' || - typeof arg === 'symbol' || // ES6 symbol - typeof arg === 'undefined'; -} -exports.isPrimitive = isPrimitive; + ear = next; -exports.isBuffer = _dereq_('./support/isBuffer'); + // if we looped through the whole remaining polygon and can't find any more ears + if (ear === stop) { + // try filtering points and slicing again + if (!pass) { + earcutLinked(filterPoints(ear), triangles, dim, minX, minY, size, 1); -function objectToString(o) { - return Object.prototype.toString.call(o); -} + // if this didn't work, try curing all small self-intersections locally + } else if (pass === 1) { + ear = cureLocalIntersections(ear, triangles, dim); + earcutLinked(ear, triangles, dim, minX, minY, size, 2); + // as a last resort, try splitting the remaining polygon into two + } else if (pass === 2) { + splitEarcut(ear, triangles, dim, minX, minY, size); + } -function pad(n) { - return n < 10 ? '0' + n.toString(10) : n.toString(10); + break; + } + } } +// check whether a polygon node forms a valid ear with adjacent nodes +function isEar(ear) { + var a = ear.prev, + b = ear, + c = ear.next; -var months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', - 'Oct', 'Nov', 'Dec']; + if (area(a, b, c) >= 0) return false; // reflex, can't be an ear -// 26 Feb 16:19:34 -function timestamp() { - var d = new Date(); - var time = [pad(d.getHours()), - pad(d.getMinutes()), - pad(d.getSeconds())].join(':'); - return [d.getDate(), months[d.getMonth()], time].join(' '); + // now make sure we don't have other points inside the potential ear + var p = ear.next.next; + + while (p !== ear.prev) { + if (pointInTriangle(a.x, a.y, b.x, b.y, c.x, c.y, p.x, p.y) && + area(p.prev, p, p.next) >= 0) return false; + p = p.next; + } + + return true; } +function isEarHashed(ear, minX, minY, size) { + var a = ear.prev, + b = ear, + c = ear.next; -// log is just a thin wrapper to console.log that prepends a timestamp -exports.log = function() { - console.log('%s - %s', timestamp(), exports.format.apply(exports, arguments)); -}; + if (area(a, b, c) >= 0) return false; // reflex, can't be an ear + // triangle bbox; min & max are calculated like this for speed + var minTX = a.x < b.x ? (a.x < c.x ? a.x : c.x) : (b.x < c.x ? b.x : c.x), + minTY = a.y < b.y ? (a.y < c.y ? a.y : c.y) : (b.y < c.y ? b.y : c.y), + maxTX = a.x > b.x ? (a.x > c.x ? a.x : c.x) : (b.x > c.x ? b.x : c.x), + maxTY = a.y > b.y ? (a.y > c.y ? a.y : c.y) : (b.y > c.y ? b.y : c.y); -/** - * Inherit the prototype methods from one constructor into another. - * - * The Function.prototype.inherits from lang.js rewritten as a standalone - * function (not on Function.prototype). NOTE: If this file is to be loaded - * during bootstrapping this function needs to be rewritten using some native - * functions as prototype setup using normal JavaScript does not work as - * expected during bootstrapping (see mirror.js in r114903). - * - * @param {function} ctor Constructor function which needs to inherit the - * prototype. - * @param {function} superCtor Constructor function to inherit prototype from. - */ -exports.inherits = _dereq_('inherits'); + // z-order range for the current triangle bbox; + var minZ = zOrder(minTX, minTY, minX, minY, size), + maxZ = zOrder(maxTX, maxTY, minX, minY, size); -exports._extend = function(origin, add) { - // Don't do anything if add isn't an object - if (!add || !isObject(add)) return origin; + // first look for points inside the triangle in increasing z-order + var p = ear.nextZ; - var keys = Object.keys(add); - var i = keys.length; - while (i--) { - origin[keys[i]] = add[keys[i]]; - } - return origin; -}; + while (p && p.z <= maxZ) { + if (p !== ear.prev && p !== ear.next && + pointInTriangle(a.x, a.y, b.x, b.y, c.x, c.y, p.x, p.y) && + area(p.prev, p, p.next) >= 0) return false; + p = p.nextZ; + } -function hasOwnProperty(obj, prop) { - return Object.prototype.hasOwnProperty.call(obj, prop); + // then look for points in decreasing z-order + p = ear.prevZ; + + while (p && p.z >= minZ) { + if (p !== ear.prev && p !== ear.next && + pointInTriangle(a.x, a.y, b.x, b.y, c.x, c.y, p.x, p.y) && + area(p.prev, p, p.next) >= 0) return false; + p = p.prevZ; + } + + return true; } -}).call(this,_dereq_('_process'),typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) +// go through all polygon nodes and cure small local self-intersections +function cureLocalIntersections(start, triangles, dim) { + var p = start; + do { + var a = p.prev, + b = p.next.next; -},{"./support/isBuffer":10,"_process":8,"inherits":9}],12:[function(_dereq_,module,exports){ -_dereq_('../modules/es6.object.to-string'); -_dereq_('../modules/es6.string.iterator'); -_dereq_('../modules/web.dom.iterable'); -_dereq_('../modules/es6.promise'); -module.exports = _dereq_('../modules/_core').Promise; -},{"../modules/_core":20,"../modules/es6.object.to-string":72,"../modules/es6.promise":73,"../modules/es6.string.iterator":74,"../modules/web.dom.iterable":75}],13:[function(_dereq_,module,exports){ -module.exports = function(it){ - if(typeof it != 'function')throw TypeError(it + ' is not a function!'); - return it; -}; -},{}],14:[function(_dereq_,module,exports){ -// 22.1.3.31 Array.prototype[@@unscopables] -var UNSCOPABLES = _dereq_('./_wks')('unscopables') - , ArrayProto = Array.prototype; -if(ArrayProto[UNSCOPABLES] == undefined)_dereq_('./_hide')(ArrayProto, UNSCOPABLES, {}); -module.exports = function(key){ - ArrayProto[UNSCOPABLES][key] = true; -}; -},{"./_hide":31,"./_wks":69}],15:[function(_dereq_,module,exports){ -module.exports = function(it, Constructor, name, forbiddenField){ - if(!(it instanceof Constructor) || (forbiddenField !== undefined && forbiddenField in it)){ - throw TypeError(name + ': incorrect invocation!'); - } return it; -}; -},{}],16:[function(_dereq_,module,exports){ -var isObject = _dereq_('./_is-object'); -module.exports = function(it){ - if(!isObject(it))throw TypeError(it + ' is not an object!'); - return it; -}; -},{"./_is-object":37}],17:[function(_dereq_,module,exports){ -// false -> Array#indexOf -// true -> Array#includes -var toIObject = _dereq_('./_to-iobject') - , toLength = _dereq_('./_to-length') - , toIndex = _dereq_('./_to-index'); -module.exports = function(IS_INCLUDES){ - return function($this, el, fromIndex){ - var O = toIObject($this) - , length = toLength(O.length) - , index = toIndex(fromIndex, length) - , value; - // Array#includes uses SameValueZero equality algorithm - if(IS_INCLUDES && el != el)while(length > index){ - value = O[index++]; - if(value != value)return true; - // Array#toIndex ignores holes, Array#includes - not - } else for(;length > index; index++)if(IS_INCLUDES || index in O){ - if(O[index] === el)return IS_INCLUDES || index || 0; - } return !IS_INCLUDES && -1; - }; -}; -},{"./_to-index":62,"./_to-iobject":64,"./_to-length":65}],18:[function(_dereq_,module,exports){ -// getting tag from 19.1.3.6 Object.prototype.toString() -var cof = _dereq_('./_cof') - , TAG = _dereq_('./_wks')('toStringTag') - // ES3 wrong here - , ARG = cof(function(){ return arguments; }()) == 'Arguments'; + if (!equals(a, b) && intersects(a, p, p.next, b) && locallyInside(a, b) && locallyInside(b, a)) { -// fallback for IE11 Script Access Denied error -var tryGet = function(it, key){ - try { - return it[key]; - } catch(e){ /* empty */ } -}; + triangles.push(a.i / dim); + triangles.push(p.i / dim); + triangles.push(b.i / dim); -module.exports = function(it){ - var O, T, B; - return it === undefined ? 'Undefined' : it === null ? 'Null' - // @@toStringTag case - : typeof (T = tryGet(O = Object(it), TAG)) == 'string' ? T - // builtinTag case - : ARG ? cof(O) - // ES3 arguments fallback - : (B = cof(O)) == 'Object' && typeof O.callee == 'function' ? 'Arguments' : B; -}; -},{"./_cof":19,"./_wks":69}],19:[function(_dereq_,module,exports){ -var toString = {}.toString; + // remove two nodes involved + removeNode(p); + removeNode(p.next); -module.exports = function(it){ - return toString.call(it).slice(8, -1); -}; -},{}],20:[function(_dereq_,module,exports){ -var core = module.exports = {version: '2.4.0'}; -if(typeof __e == 'number')__e = core; // eslint-disable-line no-undef -},{}],21:[function(_dereq_,module,exports){ -// optional / simple context binding -var aFunction = _dereq_('./_a-function'); -module.exports = function(fn, that, length){ - aFunction(fn); - if(that === undefined)return fn; - switch(length){ - case 1: return function(a){ - return fn.call(that, a); - }; - case 2: return function(a, b){ - return fn.call(that, a, b); - }; - case 3: return function(a, b, c){ - return fn.call(that, a, b, c); - }; - } - return function(/* ...args */){ - return fn.apply(that, arguments); - }; -}; -},{"./_a-function":13}],22:[function(_dereq_,module,exports){ -// 7.2.1 RequireObjectCoercible(argument) -module.exports = function(it){ - if(it == undefined)throw TypeError("Can't call method on " + it); - return it; -}; -},{}],23:[function(_dereq_,module,exports){ -// Thank's IE8 for his funny defineProperty -module.exports = !_dereq_('./_fails')(function(){ - return Object.defineProperty({}, 'a', {get: function(){ return 7; }}).a != 7; -}); -},{"./_fails":27}],24:[function(_dereq_,module,exports){ -var isObject = _dereq_('./_is-object') - , document = _dereq_('./_global').document - // in old IE typeof document.createElement is 'object' - , is = isObject(document) && isObject(document.createElement); -module.exports = function(it){ - return is ? document.createElement(it) : {}; -}; -},{"./_global":29,"./_is-object":37}],25:[function(_dereq_,module,exports){ -// IE 8- don't enum bug keys -module.exports = ( - 'constructor,hasOwnProperty,isPrototypeOf,propertyIsEnumerable,toLocaleString,toString,valueOf' -).split(','); -},{}],26:[function(_dereq_,module,exports){ -var global = _dereq_('./_global') - , core = _dereq_('./_core') - , hide = _dereq_('./_hide') - , redefine = _dereq_('./_redefine') - , ctx = _dereq_('./_ctx') - , PROTOTYPE = 'prototype'; + p = start = b; + } + p = p.next; + } while (p !== start); -var $export = function(type, name, source){ - var IS_FORCED = type & $export.F - , IS_GLOBAL = type & $export.G - , IS_STATIC = type & $export.S - , IS_PROTO = type & $export.P - , IS_BIND = type & $export.B - , target = IS_GLOBAL ? global : IS_STATIC ? global[name] || (global[name] = {}) : (global[name] || {})[PROTOTYPE] - , exports = IS_GLOBAL ? core : core[name] || (core[name] = {}) - , expProto = exports[PROTOTYPE] || (exports[PROTOTYPE] = {}) - , key, own, out, exp; - if(IS_GLOBAL)source = name; - for(key in source){ - // contains in native - own = !IS_FORCED && target && target[key] !== undefined; - // export native or passed - out = (own ? target : source)[key]; - // bind timers to global for call from export context - exp = IS_BIND && own ? ctx(out, global) : IS_PROTO && typeof out == 'function' ? ctx(Function.call, out) : out; - // extend global - if(target)redefine(target, key, out, type & $export.U); - // export - if(exports[key] != out)hide(exports, key, exp); - if(IS_PROTO && expProto[key] != out)expProto[key] = out; - } -}; -global.core = core; -// type bitmap -$export.F = 1; // forced -$export.G = 2; // global -$export.S = 4; // static -$export.P = 8; // proto -$export.B = 16; // bind -$export.W = 32; // wrap -$export.U = 64; // safe -$export.R = 128; // real proto method for `library` -module.exports = $export; -},{"./_core":20,"./_ctx":21,"./_global":29,"./_hide":31,"./_redefine":54}],27:[function(_dereq_,module,exports){ -module.exports = function(exec){ - try { - return !!exec(); - } catch(e){ - return true; - } -}; -},{}],28:[function(_dereq_,module,exports){ -var ctx = _dereq_('./_ctx') - , call = _dereq_('./_iter-call') - , isArrayIter = _dereq_('./_is-array-iter') - , anObject = _dereq_('./_an-object') - , toLength = _dereq_('./_to-length') - , getIterFn = _dereq_('./core.get-iterator-method') - , BREAK = {} - , RETURN = {}; -var exports = module.exports = function(iterable, entries, fn, that, ITERATOR){ - var iterFn = ITERATOR ? function(){ return iterable; } : getIterFn(iterable) - , f = ctx(fn, that, entries ? 2 : 1) - , index = 0 - , length, step, iterator, result; - if(typeof iterFn != 'function')throw TypeError(iterable + ' is not iterable!'); - // fast case for arrays with default iterator - if(isArrayIter(iterFn))for(length = toLength(iterable.length); length > index; index++){ - result = entries ? f(anObject(step = iterable[index])[0], step[1]) : f(iterable[index]); - if(result === BREAK || result === RETURN)return result; - } else for(iterator = iterFn.call(iterable); !(step = iterator.next()).done; ){ - result = call(iterator, f, step.value, entries); - if(result === BREAK || result === RETURN)return result; - } -}; -exports.BREAK = BREAK; -exports.RETURN = RETURN; -},{"./_an-object":16,"./_ctx":21,"./_is-array-iter":36,"./_iter-call":38,"./_to-length":65,"./core.get-iterator-method":70}],29:[function(_dereq_,module,exports){ -// https://github.com/zloirock/core-js/issues/86#issuecomment-115759028 -var global = module.exports = typeof window != 'undefined' && window.Math == Math - ? window : typeof self != 'undefined' && self.Math == Math ? self : Function('return this')(); -if(typeof __g == 'number')__g = global; // eslint-disable-line no-undef -},{}],30:[function(_dereq_,module,exports){ -var hasOwnProperty = {}.hasOwnProperty; -module.exports = function(it, key){ - return hasOwnProperty.call(it, key); -}; -},{}],31:[function(_dereq_,module,exports){ -var dP = _dereq_('./_object-dp') - , createDesc = _dereq_('./_property-desc'); -module.exports = _dereq_('./_descriptors') ? function(object, key, value){ - return dP.f(object, key, createDesc(1, value)); -} : function(object, key, value){ - object[key] = value; - return object; -}; -},{"./_descriptors":23,"./_object-dp":47,"./_property-desc":52}],32:[function(_dereq_,module,exports){ -module.exports = _dereq_('./_global').document && document.documentElement; -},{"./_global":29}],33:[function(_dereq_,module,exports){ -module.exports = !_dereq_('./_descriptors') && !_dereq_('./_fails')(function(){ - return Object.defineProperty(_dereq_('./_dom-create')('div'), 'a', {get: function(){ return 7; }}).a != 7; -}); -},{"./_descriptors":23,"./_dom-create":24,"./_fails":27}],34:[function(_dereq_,module,exports){ -// fast apply, http://jsperf.lnkit.com/fast-apply/5 -module.exports = function(fn, args, that){ - var un = that === undefined; - switch(args.length){ - case 0: return un ? fn() - : fn.call(that); - case 1: return un ? fn(args[0]) - : fn.call(that, args[0]); - case 2: return un ? fn(args[0], args[1]) - : fn.call(that, args[0], args[1]); - case 3: return un ? fn(args[0], args[1], args[2]) - : fn.call(that, args[0], args[1], args[2]); - case 4: return un ? fn(args[0], args[1], args[2], args[3]) - : fn.call(that, args[0], args[1], args[2], args[3]); - } return fn.apply(that, args); -}; -},{}],35:[function(_dereq_,module,exports){ -// fallback for non-array-like ES3 and non-enumerable old V8 strings -var cof = _dereq_('./_cof'); -module.exports = Object('z').propertyIsEnumerable(0) ? Object : function(it){ - return cof(it) == 'String' ? it.split('') : Object(it); -}; -},{"./_cof":19}],36:[function(_dereq_,module,exports){ -// check on default Array iterator -var Iterators = _dereq_('./_iterators') - , ITERATOR = _dereq_('./_wks')('iterator') - , ArrayProto = Array.prototype; + return p; +} -module.exports = function(it){ - return it !== undefined && (Iterators.Array === it || ArrayProto[ITERATOR] === it); -}; -},{"./_iterators":43,"./_wks":69}],37:[function(_dereq_,module,exports){ -module.exports = function(it){ - return typeof it === 'object' ? it !== null : typeof it === 'function'; -}; -},{}],38:[function(_dereq_,module,exports){ -// call something on iterator step with safe closing on error -var anObject = _dereq_('./_an-object'); -module.exports = function(iterator, fn, value, entries){ - try { - return entries ? fn(anObject(value)[0], value[1]) : fn(value); - // 7.4.6 IteratorClose(iterator, completion) - } catch(e){ - var ret = iterator['return']; - if(ret !== undefined)anObject(ret.call(iterator)); - throw e; - } -}; -},{"./_an-object":16}],39:[function(_dereq_,module,exports){ -'use strict'; -var create = _dereq_('./_object-create') - , descriptor = _dereq_('./_property-desc') - , setToStringTag = _dereq_('./_set-to-string-tag') - , IteratorPrototype = {}; +// try splitting polygon into two and triangulate them independently +function splitEarcut(start, triangles, dim, minX, minY, size) { + // look for a valid diagonal that divides the polygon into two + var a = start; + do { + var b = a.next.next; + while (b !== a.prev) { + if (a.i !== b.i && isValidDiagonal(a, b)) { + // split the polygon in two by the diagonal + var c = splitPolygon(a, b); -// 25.1.2.1.1 %IteratorPrototype%[@@iterator]() -_dereq_('./_hide')(IteratorPrototype, _dereq_('./_wks')('iterator'), function(){ return this; }); + // filter colinear points around the cuts + a = filterPoints(a, a.next); + c = filterPoints(c, c.next); -module.exports = function(Constructor, NAME, next){ - Constructor.prototype = create(IteratorPrototype, {next: descriptor(1, next)}); - setToStringTag(Constructor, NAME + ' Iterator'); -}; -},{"./_hide":31,"./_object-create":46,"./_property-desc":52,"./_set-to-string-tag":56,"./_wks":69}],40:[function(_dereq_,module,exports){ -'use strict'; -var LIBRARY = _dereq_('./_library') - , $export = _dereq_('./_export') - , redefine = _dereq_('./_redefine') - , hide = _dereq_('./_hide') - , has = _dereq_('./_has') - , Iterators = _dereq_('./_iterators') - , $iterCreate = _dereq_('./_iter-create') - , setToStringTag = _dereq_('./_set-to-string-tag') - , getPrototypeOf = _dereq_('./_object-gpo') - , ITERATOR = _dereq_('./_wks')('iterator') - , BUGGY = !([].keys && 'next' in [].keys()) // Safari has buggy iterators w/o `next` - , FF_ITERATOR = '@@iterator' - , KEYS = 'keys' - , VALUES = 'values'; + // run earcut on each half + earcutLinked(a, triangles, dim, minX, minY, size); + earcutLinked(c, triangles, dim, minX, minY, size); + return; + } + b = b.next; + } + a = a.next; + } while (a !== start); +} -var returnThis = function(){ return this; }; +// link every hole into the outer loop, producing a single-ring polygon without holes +function eliminateHoles(data, holeIndices, outerNode, dim) { + var queue = [], + i, len, start, end, list; -module.exports = function(Base, NAME, Constructor, next, DEFAULT, IS_SET, FORCED){ - $iterCreate(Constructor, NAME, next); - var getMethod = function(kind){ - if(!BUGGY && kind in proto)return proto[kind]; - switch(kind){ - case KEYS: return function keys(){ return new Constructor(this, kind); }; - case VALUES: return function values(){ return new Constructor(this, kind); }; - } return function entries(){ return new Constructor(this, kind); }; - }; - var TAG = NAME + ' Iterator' - , DEF_VALUES = DEFAULT == VALUES - , VALUES_BUG = false - , proto = Base.prototype - , $native = proto[ITERATOR] || proto[FF_ITERATOR] || DEFAULT && proto[DEFAULT] - , $default = $native || getMethod(DEFAULT) - , $entries = DEFAULT ? !DEF_VALUES ? $default : getMethod('entries') : undefined - , $anyNative = NAME == 'Array' ? proto.entries || $native : $native - , methods, key, IteratorPrototype; - // Fix native - if($anyNative){ - IteratorPrototype = getPrototypeOf($anyNative.call(new Base)); - if(IteratorPrototype !== Object.prototype){ - // Set @@toStringTag to native iterators - setToStringTag(IteratorPrototype, TAG, true); - // fix for some old engines - if(!LIBRARY && !has(IteratorPrototype, ITERATOR))hide(IteratorPrototype, ITERATOR, returnThis); + for (i = 0, len = holeIndices.length; i < len; i++) { + start = holeIndices[i] * dim; + end = i < len - 1 ? holeIndices[i + 1] * dim : data.length; + list = linkedList(data, start, end, dim, false); + if (list === list.next) list.steiner = true; + queue.push(getLeftmost(list)); } - } - // fix Array#{values, @@iterator}.name in V8 / FF - if(DEF_VALUES && $native && $native.name !== VALUES){ - VALUES_BUG = true; - $default = function values(){ return $native.call(this); }; - } - // Define iterator - if((!LIBRARY || FORCED) && (BUGGY || VALUES_BUG || !proto[ITERATOR])){ - hide(proto, ITERATOR, $default); - } - // Plug for library - Iterators[NAME] = $default; - Iterators[TAG] = returnThis; - if(DEFAULT){ - methods = { - values: DEF_VALUES ? $default : getMethod(VALUES), - keys: IS_SET ? $default : getMethod(KEYS), - entries: $entries - }; - if(FORCED)for(key in methods){ - if(!(key in proto))redefine(proto, key, methods[key]); - } else $export($export.P + $export.F * (BUGGY || VALUES_BUG), NAME, methods); - } - return methods; -}; -},{"./_export":26,"./_has":30,"./_hide":31,"./_iter-create":39,"./_iterators":43,"./_library":44,"./_object-gpo":49,"./_redefine":54,"./_set-to-string-tag":56,"./_wks":69}],41:[function(_dereq_,module,exports){ -var ITERATOR = _dereq_('./_wks')('iterator') - , SAFE_CLOSING = false; -try { - var riter = [7][ITERATOR](); - riter['return'] = function(){ SAFE_CLOSING = true; }; - Array.from(riter, function(){ throw 2; }); -} catch(e){ /* empty */ } + queue.sort(compareX); -module.exports = function(exec, skipClosing){ - if(!skipClosing && !SAFE_CLOSING)return false; - var safe = false; - try { - var arr = [7] - , iter = arr[ITERATOR](); - iter.next = function(){ return {done: safe = true}; }; - arr[ITERATOR] = function(){ return iter; }; - exec(arr); - } catch(e){ /* empty */ } - return safe; -}; -},{"./_wks":69}],42:[function(_dereq_,module,exports){ -module.exports = function(done, value){ - return {value: value, done: !!done}; -}; -},{}],43:[function(_dereq_,module,exports){ -module.exports = {}; -},{}],44:[function(_dereq_,module,exports){ -module.exports = false; -},{}],45:[function(_dereq_,module,exports){ -var global = _dereq_('./_global') - , macrotask = _dereq_('./_task').set - , Observer = global.MutationObserver || global.WebKitMutationObserver - , process = global.process - , Promise = global.Promise - , isNode = _dereq_('./_cof')(process) == 'process'; + // process holes from left to right + for (i = 0; i < queue.length; i++) { + eliminateHole(queue[i], outerNode); + outerNode = filterPoints(outerNode, outerNode.next); + } -module.exports = function(){ - var head, last, notify; + return outerNode; +} - var flush = function(){ - var parent, fn; - if(isNode && (parent = process.domain))parent.exit(); - while(head){ - fn = head.fn; - head = head.next; - try { - fn(); - } catch(e){ - if(head)notify(); - else last = undefined; - throw e; - } - } last = undefined; - if(parent)parent.enter(); - }; +function compareX(a, b) { + return a.x - b.x; +} - // Node.js - if(isNode){ - notify = function(){ - process.nextTick(flush); - }; - // browsers with MutationObserver - } else if(Observer){ - var toggle = true - , node = document.createTextNode(''); - new Observer(flush).observe(node, {characterData: true}); // eslint-disable-line no-new - notify = function(){ - node.data = toggle = !toggle; - }; - // environments with maybe non-completely correct, but existent Promise - } else if(Promise && Promise.resolve){ - var promise = Promise.resolve(); - notify = function(){ - promise.then(flush); - }; - // for other environments - macrotask based on: - // - setImmediate - // - MessageChannel - // - window.postMessag - // - onreadystatechange - // - setTimeout - } else { - notify = function(){ - // strange IE + webpack dev server bug - use .call(global) - macrotask.call(global, flush); - }; - } +// find a bridge between vertices that connects hole with an outer ring and and link it +function eliminateHole(hole, outerNode) { + outerNode = findHoleBridge(hole, outerNode); + if (outerNode) { + var b = splitPolygon(outerNode, hole); + filterPoints(b, b.next); + } +} - return function(fn){ - var task = {fn: fn, next: undefined}; - if(last)last.next = task; - if(!head){ - head = task; - notify(); - } last = task; - }; -}; -},{"./_cof":19,"./_global":29,"./_task":61}],46:[function(_dereq_,module,exports){ -// 19.1.2.2 / 15.2.3.5 Object.create(O [, Properties]) -var anObject = _dereq_('./_an-object') - , dPs = _dereq_('./_object-dps') - , enumBugKeys = _dereq_('./_enum-bug-keys') - , IE_PROTO = _dereq_('./_shared-key')('IE_PROTO') - , Empty = function(){ /* empty */ } - , PROTOTYPE = 'prototype'; +// David Eberly's algorithm for finding a bridge between hole and outer polygon +function findHoleBridge(hole, outerNode) { + var p = outerNode, + hx = hole.x, + hy = hole.y, + qx = -Infinity, + m; -// Create object with fake `null` prototype: use iframe Object with cleared prototype -var createDict = function(){ - // Thrash, waste and sodomy: IE GC bug - var iframe = _dereq_('./_dom-create')('iframe') - , i = enumBugKeys.length - , lt = '<' - , gt = '>' - , iframeDocument; - iframe.style.display = 'none'; - _dereq_('./_html').appendChild(iframe); - iframe.src = 'javascript:'; // eslint-disable-line no-script-url - // createDict = iframe.contentWindow.Object; - // html.removeChild(iframe); - iframeDocument = iframe.contentWindow.document; - iframeDocument.open(); - iframeDocument.write(lt + 'script' + gt + 'document.F=Object' + lt + '/script' + gt); - iframeDocument.close(); - createDict = iframeDocument.F; - while(i--)delete createDict[PROTOTYPE][enumBugKeys[i]]; - return createDict(); -}; + // find a segment intersected by a ray from the hole's leftmost point to the left; + // segment's endpoint with lesser x will be potential connection point + do { + if (hy <= p.y && hy >= p.next.y) { + var x = p.x + (hy - p.y) * (p.next.x - p.x) / (p.next.y - p.y); + if (x <= hx && x > qx) { + qx = x; + if (x === hx) { + if (hy === p.y) return p; + if (hy === p.next.y) return p.next; + } + m = p.x < p.next.x ? p : p.next; + } + } + p = p.next; + } while (p !== outerNode); -module.exports = Object.create || function create(O, Properties){ - var result; - if(O !== null){ - Empty[PROTOTYPE] = anObject(O); - result = new Empty; - Empty[PROTOTYPE] = null; - // add "__proto__" for Object.getPrototypeOf polyfill - result[IE_PROTO] = O; - } else result = createDict(); - return Properties === undefined ? result : dPs(result, Properties); -}; + if (!m) return null; -},{"./_an-object":16,"./_dom-create":24,"./_enum-bug-keys":25,"./_html":32,"./_object-dps":48,"./_shared-key":57}],47:[function(_dereq_,module,exports){ -var anObject = _dereq_('./_an-object') - , IE8_DOM_DEFINE = _dereq_('./_ie8-dom-define') - , toPrimitive = _dereq_('./_to-primitive') - , dP = Object.defineProperty; + if (hx === qx) return m.prev; // hole touches outer segment; pick lower endpoint -exports.f = _dereq_('./_descriptors') ? Object.defineProperty : function defineProperty(O, P, Attributes){ - anObject(O); - P = toPrimitive(P, true); - anObject(Attributes); - if(IE8_DOM_DEFINE)try { - return dP(O, P, Attributes); - } catch(e){ /* empty */ } - if('get' in Attributes || 'set' in Attributes)throw TypeError('Accessors not supported!'); - if('value' in Attributes)O[P] = Attributes.value; - return O; -}; -},{"./_an-object":16,"./_descriptors":23,"./_ie8-dom-define":33,"./_to-primitive":67}],48:[function(_dereq_,module,exports){ -var dP = _dereq_('./_object-dp') - , anObject = _dereq_('./_an-object') - , getKeys = _dereq_('./_object-keys'); + // look for points inside the triangle of hole point, segment intersection and endpoint; + // if there are no points found, we have a valid connection; + // otherwise choose the point of the minimum angle with the ray as connection point -module.exports = _dereq_('./_descriptors') ? Object.defineProperties : function defineProperties(O, Properties){ - anObject(O); - var keys = getKeys(Properties) - , length = keys.length - , i = 0 - , P; - while(length > i)dP.f(O, P = keys[i++], Properties[P]); - return O; -}; -},{"./_an-object":16,"./_descriptors":23,"./_object-dp":47,"./_object-keys":51}],49:[function(_dereq_,module,exports){ -// 19.1.2.9 / 15.2.3.2 Object.getPrototypeOf(O) -var has = _dereq_('./_has') - , toObject = _dereq_('./_to-object') - , IE_PROTO = _dereq_('./_shared-key')('IE_PROTO') - , ObjectProto = Object.prototype; + var stop = m, + mx = m.x, + my = m.y, + tanMin = Infinity, + tan; -module.exports = Object.getPrototypeOf || function(O){ - O = toObject(O); - if(has(O, IE_PROTO))return O[IE_PROTO]; - if(typeof O.constructor == 'function' && O instanceof O.constructor){ - return O.constructor.prototype; - } return O instanceof Object ? ObjectProto : null; -}; -},{"./_has":30,"./_shared-key":57,"./_to-object":66}],50:[function(_dereq_,module,exports){ -var has = _dereq_('./_has') - , toIObject = _dereq_('./_to-iobject') - , arrayIndexOf = _dereq_('./_array-includes')(false) - , IE_PROTO = _dereq_('./_shared-key')('IE_PROTO'); + p = m.next; -module.exports = function(object, names){ - var O = toIObject(object) - , i = 0 - , result = [] - , key; - for(key in O)if(key != IE_PROTO)has(O, key) && result.push(key); - // Don't enum bug & hidden keys - while(names.length > i)if(has(O, key = names[i++])){ - ~arrayIndexOf(result, key) || result.push(key); - } - return result; -}; -},{"./_array-includes":17,"./_has":30,"./_shared-key":57,"./_to-iobject":64}],51:[function(_dereq_,module,exports){ -// 19.1.2.14 / 15.2.3.14 Object.keys(O) -var $keys = _dereq_('./_object-keys-internal') - , enumBugKeys = _dereq_('./_enum-bug-keys'); + while (p !== stop) { + if (hx >= p.x && p.x >= mx && + pointInTriangle(hy < my ? hx : qx, hy, mx, my, hy < my ? qx : hx, hy, p.x, p.y)) { -module.exports = Object.keys || function keys(O){ - return $keys(O, enumBugKeys); -}; -},{"./_enum-bug-keys":25,"./_object-keys-internal":50}],52:[function(_dereq_,module,exports){ -module.exports = function(bitmap, value){ - return { - enumerable : !(bitmap & 1), - configurable: !(bitmap & 2), - writable : !(bitmap & 4), - value : value - }; -}; -},{}],53:[function(_dereq_,module,exports){ -var redefine = _dereq_('./_redefine'); -module.exports = function(target, src, safe){ - for(var key in src)redefine(target, key, src[key], safe); - return target; -}; -},{"./_redefine":54}],54:[function(_dereq_,module,exports){ -var global = _dereq_('./_global') - , hide = _dereq_('./_hide') - , has = _dereq_('./_has') - , SRC = _dereq_('./_uid')('src') - , TO_STRING = 'toString' - , $toString = Function[TO_STRING] - , TPL = ('' + $toString).split(TO_STRING); + tan = Math.abs(hy - p.y) / (hx - p.x); // tangential -_dereq_('./_core').inspectSource = function(it){ - return $toString.call(it); -}; + if ((tan < tanMin || (tan === tanMin && p.x > m.x)) && locallyInside(p, hole)) { + m = p; + tanMin = tan; + } + } -(module.exports = function(O, key, val, safe){ - var isFunction = typeof val == 'function'; - if(isFunction)has(val, 'name') || hide(val, 'name', key); - if(O[key] === val)return; - if(isFunction)has(val, SRC) || hide(val, SRC, O[key] ? '' + O[key] : TPL.join(String(key))); - if(O === global){ - O[key] = val; - } else { - if(!safe){ - delete O[key]; - hide(O, key, val); - } else { - if(O[key])O[key] = val; - else hide(O, key, val); + p = p.next; } - } -// add fake Function#toString for correct work wrapped methods / constructors with methods like LoDash isNative -})(Function.prototype, TO_STRING, function toString(){ - return typeof this == 'function' && this[SRC] || $toString.call(this); -}); -},{"./_core":20,"./_global":29,"./_has":30,"./_hide":31,"./_uid":68}],55:[function(_dereq_,module,exports){ -'use strict'; -var global = _dereq_('./_global') - , dP = _dereq_('./_object-dp') - , DESCRIPTORS = _dereq_('./_descriptors') - , SPECIES = _dereq_('./_wks')('species'); -module.exports = function(KEY){ - var C = global[KEY]; - if(DESCRIPTORS && C && !C[SPECIES])dP.f(C, SPECIES, { - configurable: true, - get: function(){ return this; } - }); -}; -},{"./_descriptors":23,"./_global":29,"./_object-dp":47,"./_wks":69}],56:[function(_dereq_,module,exports){ -var def = _dereq_('./_object-dp').f - , has = _dereq_('./_has') - , TAG = _dereq_('./_wks')('toStringTag'); + return m; +} -module.exports = function(it, tag, stat){ - if(it && !has(it = stat ? it : it.prototype, TAG))def(it, TAG, {configurable: true, value: tag}); -}; -},{"./_has":30,"./_object-dp":47,"./_wks":69}],57:[function(_dereq_,module,exports){ -var shared = _dereq_('./_shared')('keys') - , uid = _dereq_('./_uid'); -module.exports = function(key){ - return shared[key] || (shared[key] = uid(key)); -}; -},{"./_shared":58,"./_uid":68}],58:[function(_dereq_,module,exports){ -var global = _dereq_('./_global') - , SHARED = '__core-js_shared__' - , store = global[SHARED] || (global[SHARED] = {}); -module.exports = function(key){ - return store[key] || (store[key] = {}); -}; -},{"./_global":29}],59:[function(_dereq_,module,exports){ -// 7.3.20 SpeciesConstructor(O, defaultConstructor) -var anObject = _dereq_('./_an-object') - , aFunction = _dereq_('./_a-function') - , SPECIES = _dereq_('./_wks')('species'); -module.exports = function(O, D){ - var C = anObject(O).constructor, S; - return C === undefined || (S = anObject(C)[SPECIES]) == undefined ? D : aFunction(S); -}; -},{"./_a-function":13,"./_an-object":16,"./_wks":69}],60:[function(_dereq_,module,exports){ -var toInteger = _dereq_('./_to-integer') - , defined = _dereq_('./_defined'); -// true -> String#at -// false -> String#codePointAt -module.exports = function(TO_STRING){ - return function(that, pos){ - var s = String(defined(that)) - , i = toInteger(pos) - , l = s.length - , a, b; - if(i < 0 || i >= l)return TO_STRING ? '' : undefined; - a = s.charCodeAt(i); - return a < 0xd800 || a > 0xdbff || i + 1 === l || (b = s.charCodeAt(i + 1)) < 0xdc00 || b > 0xdfff - ? TO_STRING ? s.charAt(i) : a - : TO_STRING ? s.slice(i, i + 2) : (a - 0xd800 << 10) + (b - 0xdc00) + 0x10000; - }; -}; -},{"./_defined":22,"./_to-integer":63}],61:[function(_dereq_,module,exports){ -var ctx = _dereq_('./_ctx') - , invoke = _dereq_('./_invoke') - , html = _dereq_('./_html') - , cel = _dereq_('./_dom-create') - , global = _dereq_('./_global') - , process = global.process - , setTask = global.setImmediate - , clearTask = global.clearImmediate - , MessageChannel = global.MessageChannel - , counter = 0 - , queue = {} - , ONREADYSTATECHANGE = 'onreadystatechange' - , defer, channel, port; -var run = function(){ - var id = +this; - if(queue.hasOwnProperty(id)){ - var fn = queue[id]; - delete queue[id]; - fn(); - } -}; -var listener = function(event){ - run.call(event.data); -}; -// Node.js 0.9+ & IE10+ has setImmediate, otherwise: -if(!setTask || !clearTask){ - setTask = function setImmediate(fn){ - var args = [], i = 1; - while(arguments.length > i)args.push(arguments[i++]); - queue[++counter] = function(){ - invoke(typeof fn == 'function' ? fn : Function(fn), args); - }; - defer(counter); - return counter; - }; - clearTask = function clearImmediate(id){ - delete queue[id]; - }; - // Node.js 0.8- - if(_dereq_('./_cof')(process) == 'process'){ - defer = function(id){ - process.nextTick(ctx(run, id, 1)); - }; - // Browsers with MessageChannel, includes WebWorkers - } else if(MessageChannel){ - channel = new MessageChannel; - port = channel.port2; - channel.port1.onmessage = listener; - defer = ctx(port.postMessage, port, 1); - // Browsers with postMessage, skip WebWorkers - // IE8 has postMessage, but it's sync & typeof its postMessage is 'object' - } else if(global.addEventListener && typeof postMessage == 'function' && !global.importScripts){ - defer = function(id){ - global.postMessage(id + '', '*'); - }; - global.addEventListener('message', listener, false); - // IE8- - } else if(ONREADYSTATECHANGE in cel('script')){ - defer = function(id){ - html.appendChild(cel('script'))[ONREADYSTATECHANGE] = function(){ - html.removeChild(this); - run.call(id); - }; - }; - // Rest old browsers - } else { - defer = function(id){ - setTimeout(ctx(run, id, 1), 0); - }; - } +// interlink polygon nodes in z-order +function indexCurve(start, minX, minY, size) { + var p = start; + do { + if (p.z === null) p.z = zOrder(p.x, p.y, minX, minY, size); + p.prevZ = p.prev; + p.nextZ = p.next; + p = p.next; + } while (p !== start); + + p.prevZ.nextZ = null; + p.prevZ = null; + + sortLinked(p); } -module.exports = { - set: setTask, - clear: clearTask -}; -},{"./_cof":19,"./_ctx":21,"./_dom-create":24,"./_global":29,"./_html":32,"./_invoke":34}],62:[function(_dereq_,module,exports){ -var toInteger = _dereq_('./_to-integer') - , max = Math.max - , min = Math.min; -module.exports = function(index, length){ - index = toInteger(index); - return index < 0 ? max(index + length, 0) : min(index, length); -}; -},{"./_to-integer":63}],63:[function(_dereq_,module,exports){ -// 7.1.4 ToInteger -var ceil = Math.ceil - , floor = Math.floor; -module.exports = function(it){ - return isNaN(it = +it) ? 0 : (it > 0 ? floor : ceil)(it); -}; -},{}],64:[function(_dereq_,module,exports){ -// to indexed object, toObject with fallback for non-array-like ES3 strings -var IObject = _dereq_('./_iobject') - , defined = _dereq_('./_defined'); -module.exports = function(it){ - return IObject(defined(it)); -}; -},{"./_defined":22,"./_iobject":35}],65:[function(_dereq_,module,exports){ -// 7.1.15 ToLength -var toInteger = _dereq_('./_to-integer') - , min = Math.min; -module.exports = function(it){ - return it > 0 ? min(toInteger(it), 0x1fffffffffffff) : 0; // pow(2, 53) - 1 == 9007199254740991 -}; -},{"./_to-integer":63}],66:[function(_dereq_,module,exports){ -// 7.1.13 ToObject(argument) -var defined = _dereq_('./_defined'); -module.exports = function(it){ - return Object(defined(it)); -}; -},{"./_defined":22}],67:[function(_dereq_,module,exports){ -// 7.1.1 ToPrimitive(input [, PreferredType]) -var isObject = _dereq_('./_is-object'); -// instead of the ES6 spec version, we didn't implement @@toPrimitive case -// and the second argument - flag - preferred type is a string -module.exports = function(it, S){ - if(!isObject(it))return it; - var fn, val; - if(S && typeof (fn = it.toString) == 'function' && !isObject(val = fn.call(it)))return val; - if(typeof (fn = it.valueOf) == 'function' && !isObject(val = fn.call(it)))return val; - if(!S && typeof (fn = it.toString) == 'function' && !isObject(val = fn.call(it)))return val; - throw TypeError("Can't convert object to primitive value"); -}; -},{"./_is-object":37}],68:[function(_dereq_,module,exports){ -var id = 0 - , px = Math.random(); -module.exports = function(key){ - return 'Symbol('.concat(key === undefined ? '' : key, ')_', (++id + px).toString(36)); -}; -},{}],69:[function(_dereq_,module,exports){ -var store = _dereq_('./_shared')('wks') - , uid = _dereq_('./_uid') - , Symbol = _dereq_('./_global').Symbol - , USE_SYMBOL = typeof Symbol == 'function'; -var $exports = module.exports = function(name){ - return store[name] || (store[name] = - USE_SYMBOL && Symbol[name] || (USE_SYMBOL ? Symbol : uid)('Symbol.' + name)); -}; +// Simon Tatham's linked list merge sort algorithm +// http://www.chiark.greenend.org.uk/~sgtatham/algorithms/listsort.html +function sortLinked(list) { + var i, p, q, e, tail, numMerges, pSize, qSize, + inSize = 1; -$exports.store = store; -},{"./_global":29,"./_shared":58,"./_uid":68}],70:[function(_dereq_,module,exports){ -var classof = _dereq_('./_classof') - , ITERATOR = _dereq_('./_wks')('iterator') - , Iterators = _dereq_('./_iterators'); -module.exports = _dereq_('./_core').getIteratorMethod = function(it){ - if(it != undefined)return it[ITERATOR] - || it['@@iterator'] - || Iterators[classof(it)]; -}; -},{"./_classof":18,"./_core":20,"./_iterators":43,"./_wks":69}],71:[function(_dereq_,module,exports){ -'use strict'; -var addToUnscopables = _dereq_('./_add-to-unscopables') - , step = _dereq_('./_iter-step') - , Iterators = _dereq_('./_iterators') - , toIObject = _dereq_('./_to-iobject'); + do { + p = list; + list = null; + tail = null; + numMerges = 0; -// 22.1.3.4 Array.prototype.entries() -// 22.1.3.13 Array.prototype.keys() -// 22.1.3.29 Array.prototype.values() -// 22.1.3.30 Array.prototype[@@iterator]() -module.exports = _dereq_('./_iter-define')(Array, 'Array', function(iterated, kind){ - this._t = toIObject(iterated); // target - this._i = 0; // next index - this._k = kind; // kind -// 22.1.5.2.1 %ArrayIteratorPrototype%.next() -}, function(){ - var O = this._t - , kind = this._k - , index = this._i++; - if(!O || index >= O.length){ - this._t = undefined; - return step(1); - } - if(kind == 'keys' )return step(0, index); - if(kind == 'values')return step(0, O[index]); - return step(0, [index, O[index]]); -}, 'values'); + while (p) { + numMerges++; + q = p; + pSize = 0; + for (i = 0; i < inSize; i++) { + pSize++; + q = q.nextZ; + if (!q) break; + } -// argumentsList[@@iterator] is %ArrayProto_values% (9.4.4.6, 9.4.4.7) -Iterators.Arguments = Iterators.Array; + qSize = inSize; -addToUnscopables('keys'); -addToUnscopables('values'); -addToUnscopables('entries'); -},{"./_add-to-unscopables":14,"./_iter-define":40,"./_iter-step":42,"./_iterators":43,"./_to-iobject":64}],72:[function(_dereq_,module,exports){ -'use strict'; -// 19.1.3.6 Object.prototype.toString() -var classof = _dereq_('./_classof') - , test = {}; -test[_dereq_('./_wks')('toStringTag')] = 'z'; -if(test + '' != '[object z]'){ - _dereq_('./_redefine')(Object.prototype, 'toString', function toString(){ - return '[object ' + classof(this) + ']'; - }, true); -} -},{"./_classof":18,"./_redefine":54,"./_wks":69}],73:[function(_dereq_,module,exports){ -'use strict'; -var LIBRARY = _dereq_('./_library') - , global = _dereq_('./_global') - , ctx = _dereq_('./_ctx') - , classof = _dereq_('./_classof') - , $export = _dereq_('./_export') - , isObject = _dereq_('./_is-object') - , aFunction = _dereq_('./_a-function') - , anInstance = _dereq_('./_an-instance') - , forOf = _dereq_('./_for-of') - , speciesConstructor = _dereq_('./_species-constructor') - , task = _dereq_('./_task').set - , microtask = _dereq_('./_microtask')() - , PROMISE = 'Promise' - , TypeError = global.TypeError - , process = global.process - , $Promise = global[PROMISE] - , process = global.process - , isNode = classof(process) == 'process' - , empty = function(){ /* empty */ } - , Internal, GenericPromiseCapability, Wrapper; + while (pSize > 0 || (qSize > 0 && q)) { -var USE_NATIVE = !!function(){ - try { - // correct subclassing with @@species support - var promise = $Promise.resolve(1) - , FakePromise = (promise.constructor = {})[_dereq_('./_wks')('species')] = function(exec){ exec(empty, empty); }; - // unhandled rejections tracking support, NodeJS Promise without it fails @@species test - return (isNode || typeof PromiseRejectionEvent == 'function') && promise.then(empty) instanceof FakePromise; - } catch(e){ /* empty */ } -}(); + if (pSize === 0) { + e = q; + q = q.nextZ; + qSize--; + } else if (qSize === 0 || !q) { + e = p; + p = p.nextZ; + pSize--; + } else if (p.z <= q.z) { + e = p; + p = p.nextZ; + pSize--; + } else { + e = q; + q = q.nextZ; + qSize--; + } -// helpers -var sameConstructor = function(a, b){ - // with library wrapper special case - return a === b || a === $Promise && b === Wrapper; -}; -var isThenable = function(it){ - var then; - return isObject(it) && typeof (then = it.then) == 'function' ? then : false; -}; -var newPromiseCapability = function(C){ - return sameConstructor($Promise, C) - ? new PromiseCapability(C) - : new GenericPromiseCapability(C); -}; -var PromiseCapability = GenericPromiseCapability = function(C){ - var resolve, reject; - this.promise = new C(function($$resolve, $$reject){ - if(resolve !== undefined || reject !== undefined)throw TypeError('Bad Promise constructor'); - resolve = $$resolve; - reject = $$reject; - }); - this.resolve = aFunction(resolve); - this.reject = aFunction(reject); -}; -var perform = function(exec){ - try { - exec(); - } catch(e){ - return {error: e}; - } -}; -var notify = function(promise, isReject){ - if(promise._n)return; - promise._n = true; - var chain = promise._c; - microtask(function(){ - var value = promise._v - , ok = promise._s == 1 - , i = 0; - var run = function(reaction){ - var handler = ok ? reaction.ok : reaction.fail - , resolve = reaction.resolve - , reject = reaction.reject - , domain = reaction.domain - , result, then; - try { - if(handler){ - if(!ok){ - if(promise._h == 2)onHandleUnhandled(promise); - promise._h = 1; - } - if(handler === true)result = value; - else { - if(domain)domain.enter(); - result = handler(value); - if(domain)domain.exit(); - } - if(result === reaction.promise){ - reject(TypeError('Promise-chain cycle')); - } else if(then = isThenable(result)){ - then.call(result, resolve, reject); - } else resolve(result); - } else reject(value); - } catch(e){ - reject(e); - } - }; - while(chain.length > i)run(chain[i++]); // variable length - can't use forEach - promise._c = []; - promise._n = false; - if(isReject && !promise._h)onUnhandled(promise); - }); -}; -var onUnhandled = function(promise){ - task.call(global, function(){ - var value = promise._v - , abrupt, handler, console; - if(isUnhandled(promise)){ - abrupt = perform(function(){ - if(isNode){ - process.emit('unhandledRejection', value, promise); - } else if(handler = global.onunhandledrejection){ - handler({promise: promise, reason: value}); - } else if((console = global.console) && console.error){ - console.error('Unhandled promise rejection', value); - } - }); - // Browsers should not trigger `rejectionHandled` event if it was handled here, NodeJS - should - promise._h = isNode || isUnhandled(promise) ? 2 : 1; - } promise._a = undefined; - if(abrupt)throw abrupt.error; - }); -}; -var isUnhandled = function(promise){ - if(promise._h == 1)return false; - var chain = promise._a || promise._c - , i = 0 - , reaction; - while(chain.length > i){ - reaction = chain[i++]; - if(reaction.fail || !isUnhandled(reaction.promise))return false; - } return true; -}; -var onHandleUnhandled = function(promise){ - task.call(global, function(){ - var handler; - if(isNode){ - process.emit('rejectionHandled', promise); - } else if(handler = global.onrejectionhandled){ - handler({promise: promise, reason: promise._v}); - } - }); -}; -var $reject = function(value){ - var promise = this; - if(promise._d)return; - promise._d = true; - promise = promise._w || promise; // unwrap - promise._v = value; - promise._s = 2; - if(!promise._a)promise._a = promise._c.slice(); - notify(promise, true); -}; -var $resolve = function(value){ - var promise = this - , then; - if(promise._d)return; - promise._d = true; - promise = promise._w || promise; // unwrap - try { - if(promise === value)throw TypeError("Promise can't be resolved itself"); - if(then = isThenable(value)){ - microtask(function(){ - var wrapper = {_w: promise, _d: false}; // wrap - try { - then.call(value, ctx($resolve, wrapper, 1), ctx($reject, wrapper, 1)); - } catch(e){ - $reject.call(wrapper, e); + if (tail) tail.nextZ = e; + else list = e; + + e.prevZ = tail; + tail = e; + } + + p = q; } - }); - } else { - promise._v = value; - promise._s = 1; - notify(promise, false); - } - } catch(e){ - $reject.call({_w: promise, _d: false}, e); // wrap - } -}; -// constructor polyfill -if(!USE_NATIVE){ - // 25.4.3.1 Promise(executor) - $Promise = function Promise(executor){ - anInstance(this, $Promise, PROMISE, '_h'); - aFunction(executor); - Internal.call(this); - try { - executor(ctx($resolve, this, 1), ctx($reject, this, 1)); - } catch(err){ - $reject.call(this, err); - } - }; - Internal = function Promise(executor){ - this._c = []; // <- awaiting reactions - this._a = undefined; // <- checked in isUnhandled reactions - this._s = 0; // <- state - this._d = false; // <- done - this._v = undefined; // <- value - this._h = 0; // <- rejection state, 0 - default, 1 - handled, 2 - unhandled - this._n = false; // <- notify - }; - Internal.prototype = _dereq_('./_redefine-all')($Promise.prototype, { - // 25.4.5.3 Promise.prototype.then(onFulfilled, onRejected) - then: function then(onFulfilled, onRejected){ - var reaction = newPromiseCapability(speciesConstructor(this, $Promise)); - reaction.ok = typeof onFulfilled == 'function' ? onFulfilled : true; - reaction.fail = typeof onRejected == 'function' && onRejected; - reaction.domain = isNode ? process.domain : undefined; - this._c.push(reaction); - if(this._a)this._a.push(reaction); - if(this._s)notify(this, false); - return reaction.promise; - }, - // 25.4.5.1 Promise.prototype.catch(onRejected) - 'catch': function(onRejected){ - return this.then(undefined, onRejected); - } - }); - PromiseCapability = function(){ - var promise = new Internal; - this.promise = promise; - this.resolve = ctx($resolve, promise, 1); - this.reject = ctx($reject, promise, 1); - }; + tail.nextZ = null; + inSize *= 2; + + } while (numMerges > 1); + + return list; } -$export($export.G + $export.W + $export.F * !USE_NATIVE, {Promise: $Promise}); -_dereq_('./_set-to-string-tag')($Promise, PROMISE); -_dereq_('./_set-species')(PROMISE); -Wrapper = _dereq_('./_core')[PROMISE]; +// z-order of a point given coords and size of the data bounding box +function zOrder(x, y, minX, minY, size) { + // coords are transformed into non-negative 15-bit integer range + x = 32767 * (x - minX) / size; + y = 32767 * (y - minY) / size; -// statics -$export($export.S + $export.F * !USE_NATIVE, PROMISE, { - // 25.4.4.5 Promise.reject(r) - reject: function reject(r){ - var capability = newPromiseCapability(this) - , $$reject = capability.reject; - $$reject(r); - return capability.promise; - } -}); -$export($export.S + $export.F * (LIBRARY || !USE_NATIVE), PROMISE, { - // 25.4.4.6 Promise.resolve(x) - resolve: function resolve(x){ - // instanceof instead of internal slot check because we should fix it without replacement native Promise core - if(x instanceof $Promise && sameConstructor(x.constructor, this))return x; - var capability = newPromiseCapability(this) - , $$resolve = capability.resolve; - $$resolve(x); - return capability.promise; - } -}); -$export($export.S + $export.F * !(USE_NATIVE && _dereq_('./_iter-detect')(function(iter){ - $Promise.all(iter)['catch'](empty); -})), PROMISE, { - // 25.4.4.1 Promise.all(iterable) - all: function all(iterable){ - var C = this - , capability = newPromiseCapability(C) - , resolve = capability.resolve - , reject = capability.reject; - var abrupt = perform(function(){ - var values = [] - , index = 0 - , remaining = 1; - forOf(iterable, false, function(promise){ - var $index = index++ - , alreadyCalled = false; - values.push(undefined); - remaining++; - C.resolve(promise).then(function(value){ - if(alreadyCalled)return; - alreadyCalled = true; - values[$index] = value; - --remaining || resolve(values); - }, reject); - }); - --remaining || resolve(values); - }); - if(abrupt)reject(abrupt.error); - return capability.promise; - }, - // 25.4.4.4 Promise.race(iterable) - race: function race(iterable){ - var C = this - , capability = newPromiseCapability(C) - , reject = capability.reject; - var abrupt = perform(function(){ - forOf(iterable, false, function(promise){ - C.resolve(promise).then(capability.resolve, reject); - }); - }); - if(abrupt)reject(abrupt.error); - return capability.promise; - } -}); -},{"./_a-function":13,"./_an-instance":15,"./_classof":18,"./_core":20,"./_ctx":21,"./_export":26,"./_for-of":28,"./_global":29,"./_is-object":37,"./_iter-detect":41,"./_library":44,"./_microtask":45,"./_redefine-all":53,"./_set-species":55,"./_set-to-string-tag":56,"./_species-constructor":59,"./_task":61,"./_wks":69}],74:[function(_dereq_,module,exports){ -'use strict'; -var $at = _dereq_('./_string-at')(true); + x = (x | (x << 8)) & 0x00FF00FF; + x = (x | (x << 4)) & 0x0F0F0F0F; + x = (x | (x << 2)) & 0x33333333; + x = (x | (x << 1)) & 0x55555555; -// 21.1.3.27 String.prototype[@@iterator]() -_dereq_('./_iter-define')(String, 'String', function(iterated){ - this._t = String(iterated); // target - this._i = 0; // next index -// 21.1.5.2.1 %StringIteratorPrototype%.next() -}, function(){ - var O = this._t - , index = this._i - , point; - if(index >= O.length)return {value: undefined, done: true}; - point = $at(O, index); - this._i += point.length; - return {value: point, done: false}; -}); -},{"./_iter-define":40,"./_string-at":60}],75:[function(_dereq_,module,exports){ -var $iterators = _dereq_('./es6.array.iterator') - , redefine = _dereq_('./_redefine') - , global = _dereq_('./_global') - , hide = _dereq_('./_hide') - , Iterators = _dereq_('./_iterators') - , wks = _dereq_('./_wks') - , ITERATOR = wks('iterator') - , TO_STRING_TAG = wks('toStringTag') - , ArrayValues = Iterators.Array; + y = (y | (y << 8)) & 0x00FF00FF; + y = (y | (y << 4)) & 0x0F0F0F0F; + y = (y | (y << 2)) & 0x33333333; + y = (y | (y << 1)) & 0x55555555; -for(var collections = ['NodeList', 'DOMTokenList', 'MediaList', 'StyleSheetList', 'CSSRuleList'], i = 0; i < 5; i++){ - var NAME = collections[i] - , Collection = global[NAME] - , proto = Collection && Collection.prototype - , key; - if(proto){ - if(!proto[ITERATOR])hide(proto, ITERATOR, ArrayValues); - if(!proto[TO_STRING_TAG])hide(proto, TO_STRING_TAG, NAME); - Iterators[NAME] = ArrayValues; - for(key in $iterators)if(!proto[key])redefine(proto, key, $iterators[key], true); - } + return x | (y << 1); } -},{"./_global":29,"./_hide":31,"./_iterators":43,"./_redefine":54,"./_wks":69,"./es6.array.iterator":71}],76:[function(_dereq_,module,exports){ -// (c) Dean McNamee , 2012. -// -// https://github.com/deanm/css-color-parser-js -// -// Permission is hereby granted, free of charge, to any person obtaining a copy -// of this software and associated documentation files (the "Software"), to -// deal in the Software without restriction, including without limitation the -// rights to use, copy, modify, merge, publish, distribute, sublicense, and/or -// sell copies of the Software, and to permit persons to whom the Software is -// furnished to do so, subject to the following conditions: -// -// The above copyright notice and this permission notice shall be included in -// all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING -// FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS -// IN THE SOFTWARE. -// http://www.w3.org/TR/css3-color/ -var kCSSColorTable = { - "transparent": [0,0,0,0], "aliceblue": [240,248,255,1], - "antiquewhite": [250,235,215,1], "aqua": [0,255,255,1], - "aquamarine": [127,255,212,1], "azure": [240,255,255,1], - "beige": [245,245,220,1], "bisque": [255,228,196,1], - "black": [0,0,0,1], "blanchedalmond": [255,235,205,1], - "blue": [0,0,255,1], "blueviolet": [138,43,226,1], - "brown": [165,42,42,1], "burlywood": [222,184,135,1], - "cadetblue": [95,158,160,1], "chartreuse": [127,255,0,1], - "chocolate": [210,105,30,1], "coral": [255,127,80,1], - "cornflowerblue": [100,149,237,1], "cornsilk": [255,248,220,1], - "crimson": [220,20,60,1], "cyan": [0,255,255,1], - "darkblue": [0,0,139,1], "darkcyan": [0,139,139,1], - "darkgoldenrod": [184,134,11,1], "darkgray": [169,169,169,1], - "darkgreen": [0,100,0,1], "darkgrey": [169,169,169,1], - "darkkhaki": [189,183,107,1], "darkmagenta": [139,0,139,1], - "darkolivegreen": [85,107,47,1], "darkorange": [255,140,0,1], - "darkorchid": [153,50,204,1], "darkred": [139,0,0,1], - "darksalmon": [233,150,122,1], "darkseagreen": [143,188,143,1], - "darkslateblue": [72,61,139,1], "darkslategray": [47,79,79,1], - "darkslategrey": [47,79,79,1], "darkturquoise": [0,206,209,1], - "darkviolet": [148,0,211,1], "deeppink": [255,20,147,1], - "deepskyblue": [0,191,255,1], "dimgray": [105,105,105,1], - "dimgrey": [105,105,105,1], "dodgerblue": [30,144,255,1], - "firebrick": [178,34,34,1], "floralwhite": [255,250,240,1], - "forestgreen": [34,139,34,1], "fuchsia": [255,0,255,1], - "gainsboro": [220,220,220,1], "ghostwhite": [248,248,255,1], - "gold": [255,215,0,1], "goldenrod": [218,165,32,1], - "gray": [128,128,128,1], "green": [0,128,0,1], - "greenyellow": [173,255,47,1], "grey": [128,128,128,1], - "honeydew": [240,255,240,1], "hotpink": [255,105,180,1], - "indianred": [205,92,92,1], "indigo": [75,0,130,1], - "ivory": [255,255,240,1], "khaki": [240,230,140,1], - "lavender": [230,230,250,1], "lavenderblush": [255,240,245,1], - "lawngreen": [124,252,0,1], "lemonchiffon": [255,250,205,1], - "lightblue": [173,216,230,1], "lightcoral": [240,128,128,1], - "lightcyan": [224,255,255,1], "lightgoldenrodyellow": [250,250,210,1], - "lightgray": [211,211,211,1], "lightgreen": [144,238,144,1], - "lightgrey": [211,211,211,1], "lightpink": [255,182,193,1], - "lightsalmon": [255,160,122,1], "lightseagreen": [32,178,170,1], - "lightskyblue": [135,206,250,1], "lightslategray": [119,136,153,1], - "lightslategrey": [119,136,153,1], "lightsteelblue": [176,196,222,1], - "lightyellow": [255,255,224,1], "lime": [0,255,0,1], - "limegreen": [50,205,50,1], "linen": [250,240,230,1], - "magenta": [255,0,255,1], "maroon": [128,0,0,1], - "mediumaquamarine": [102,205,170,1], "mediumblue": [0,0,205,1], - "mediumorchid": [186,85,211,1], "mediumpurple": [147,112,219,1], - "mediumseagreen": [60,179,113,1], "mediumslateblue": [123,104,238,1], - "mediumspringgreen": [0,250,154,1], "mediumturquoise": [72,209,204,1], - "mediumvioletred": [199,21,133,1], "midnightblue": [25,25,112,1], - "mintcream": [245,255,250,1], "mistyrose": [255,228,225,1], - "moccasin": [255,228,181,1], "navajowhite": [255,222,173,1], - "navy": [0,0,128,1], "oldlace": [253,245,230,1], - "olive": [128,128,0,1], "olivedrab": [107,142,35,1], - "orange": [255,165,0,1], "orangered": [255,69,0,1], - "orchid": [218,112,214,1], "palegoldenrod": [238,232,170,1], - "palegreen": [152,251,152,1], "paleturquoise": [175,238,238,1], - "palevioletred": [219,112,147,1], "papayawhip": [255,239,213,1], - "peachpuff": [255,218,185,1], "peru": [205,133,63,1], - "pink": [255,192,203,1], "plum": [221,160,221,1], - "powderblue": [176,224,230,1], "purple": [128,0,128,1], - "rebeccapurple": [102,51,153,1], - "red": [255,0,0,1], "rosybrown": [188,143,143,1], - "royalblue": [65,105,225,1], "saddlebrown": [139,69,19,1], - "salmon": [250,128,114,1], "sandybrown": [244,164,96,1], - "seagreen": [46,139,87,1], "seashell": [255,245,238,1], - "sienna": [160,82,45,1], "silver": [192,192,192,1], - "skyblue": [135,206,235,1], "slateblue": [106,90,205,1], - "slategray": [112,128,144,1], "slategrey": [112,128,144,1], - "snow": [255,250,250,1], "springgreen": [0,255,127,1], - "steelblue": [70,130,180,1], "tan": [210,180,140,1], - "teal": [0,128,128,1], "thistle": [216,191,216,1], - "tomato": [255,99,71,1], "turquoise": [64,224,208,1], - "violet": [238,130,238,1], "wheat": [245,222,179,1], - "white": [255,255,255,1], "whitesmoke": [245,245,245,1], - "yellow": [255,255,0,1], "yellowgreen": [154,205,50,1]} +// find the leftmost node of a polygon ring +function getLeftmost(start) { + var p = start, + leftmost = start; + do { + if (p.x < leftmost.x) leftmost = p; + p = p.next; + } while (p !== start); -function clamp_css_byte(i) { // Clamp to integer 0 .. 255. - i = Math.round(i); // Seems to be what Chrome does (vs truncation). - return i < 0 ? 0 : i > 255 ? 255 : i; + return leftmost; } -function clamp_css_float(f) { // Clamp to float 0.0 .. 1.0. - return f < 0 ? 0 : f > 1 ? 1 : f; +// check if a point lies within a convex triangle +function pointInTriangle(ax, ay, bx, by, cx, cy, px, py) { + return (cx - px) * (ay - py) - (ax - px) * (cy - py) >= 0 && + (ax - px) * (by - py) - (bx - px) * (ay - py) >= 0 && + (bx - px) * (cy - py) - (cx - px) * (by - py) >= 0; } -function parse_css_int(str) { // int or percentage. - if (str[str.length - 1] === '%') - return clamp_css_byte(parseFloat(str) / 100 * 255); - return clamp_css_byte(parseInt(str)); +// check if a diagonal between two polygon nodes is valid (lies in polygon interior) +function isValidDiagonal(a, b) { + return a.next.i !== b.i && a.prev.i !== b.i && !intersectsPolygon(a, b) && + locallyInside(a, b) && locallyInside(b, a) && middleInside(a, b); } -function parse_css_float(str) { // float or percentage. - if (str[str.length - 1] === '%') - return clamp_css_float(parseFloat(str) / 100); - return clamp_css_float(parseFloat(str)); +// signed area of a triangle +function area(p, q, r) { + return (q.y - p.y) * (r.x - q.x) - (q.x - p.x) * (r.y - q.y); } -function css_hue_to_rgb(m1, m2, h) { - if (h < 0) h += 1; - else if (h > 1) h -= 1; - - if (h * 6 < 1) return m1 + (m2 - m1) * h * 6; - if (h * 2 < 1) return m2; - if (h * 3 < 2) return m1 + (m2 - m1) * (2/3 - h) * 6; - return m1; +// check if two points are equal +function equals(p1, p2) { + return p1.x === p2.x && p1.y === p2.y; } -function parseCSSColor(css_str) { - // Remove all whitespace, not compliant, but should just be more accepting. - var str = css_str.replace(/ /g, '').toLowerCase(); - - // Color keywords (and transparent) lookup. - if (str in kCSSColorTable) return kCSSColorTable[str].slice(); // dup. - - // #abc and #abc123 syntax. - if (str[0] === '#') { - if (str.length === 4) { - var iv = parseInt(str.substr(1), 16); // TODO(deanm): Stricter parsing. - if (!(iv >= 0 && iv <= 0xfff)) return null; // Covers NaN. - return [((iv & 0xf00) >> 4) | ((iv & 0xf00) >> 8), - (iv & 0xf0) | ((iv & 0xf0) >> 4), - (iv & 0xf) | ((iv & 0xf) << 4), - 1]; - } else if (str.length === 7) { - var iv = parseInt(str.substr(1), 16); // TODO(deanm): Stricter parsing. - if (!(iv >= 0 && iv <= 0xffffff)) return null; // Covers NaN. - return [(iv & 0xff0000) >> 16, - (iv & 0xff00) >> 8, - iv & 0xff, - 1]; - } - - return null; - } +// check if two segments intersect +function intersects(p1, q1, p2, q2) { + if ((equals(p1, q1) && equals(p2, q2)) || + (equals(p1, q2) && equals(p2, q1))) return true; + return area(p1, q1, p2) > 0 !== area(p1, q1, q2) > 0 && + area(p2, q2, p1) > 0 !== area(p2, q2, q1) > 0; +} - var op = str.indexOf('('), ep = str.indexOf(')'); - if (op !== -1 && ep + 1 === str.length) { - var fname = str.substr(0, op); - var params = str.substr(op+1, ep-(op+1)).split(','); - var alpha = 1; // To allow case fallthrough. - switch (fname) { - case 'rgba': - if (params.length !== 4) return null; - alpha = parse_css_float(params.pop()); - // Fall through. - case 'rgb': - if (params.length !== 3) return null; - return [parse_css_int(params[0]), - parse_css_int(params[1]), - parse_css_int(params[2]), - alpha]; - case 'hsla': - if (params.length !== 4) return null; - alpha = parse_css_float(params.pop()); - // Fall through. - case 'hsl': - if (params.length !== 3) return null; - var h = (((parseFloat(params[0]) % 360) + 360) % 360) / 360; // 0 .. 1 - // NOTE(deanm): According to the CSS spec s/l should only be - // percentages, but we don't bother and let float or percentage. - var s = parse_css_float(params[1]); - var l = parse_css_float(params[2]); - var m2 = l <= 0.5 ? l * (s + 1) : l + s - l * s; - var m1 = l * 2 - m2; - return [clamp_css_byte(css_hue_to_rgb(m1, m2, h+1/3) * 255), - clamp_css_byte(css_hue_to_rgb(m1, m2, h) * 255), - clamp_css_byte(css_hue_to_rgb(m1, m2, h-1/3) * 255), - alpha]; - default: - return null; - } - } +// check if a polygon diagonal intersects any polygon segments +function intersectsPolygon(a, b) { + var p = a; + do { + if (p.i !== a.i && p.next.i !== a.i && p.i !== b.i && p.next.i !== b.i && + intersects(p, p.next, a, b)) return true; + p = p.next; + } while (p !== a); - return null; + return false; } -try { exports.parseCSSColor = parseCSSColor } catch(e) { } +// check if a polygon diagonal is locally inside the polygon +function locallyInside(a, b) { + return area(a.prev, a, a.next) < 0 ? + area(a, b, a.next) >= 0 && area(a, a.prev, b) >= 0 : + area(a, b, a.prev) < 0 || area(a, a.next, b) < 0; +} -},{}],77:[function(_dereq_,module,exports){ -'use strict'; +// check if the middle point of a polygon diagonal is inside the polygon +function middleInside(a, b) { + var p = a, + inside = false, + px = (a.x + b.x) / 2, + py = (a.y + b.y) / 2; + do { + if (((p.y > py) !== (p.next.y > py)) && (px < (p.next.x - p.x) * (py - p.y) / (p.next.y - p.y) + p.x)) + inside = !inside; + p = p.next; + } while (p !== a); -module.exports = earcut; + return inside; +} -function earcut(data, holeIndices, dim) { +// link two polygon vertices with a bridge; if the vertices belong to the same ring, it splits polygon into two; +// if one belongs to the outer ring and another to a hole, it merges it into a single ring +function splitPolygon(a, b) { + var a2 = new Node(a.i, a.x, a.y), + b2 = new Node(b.i, b.x, b.y), + an = a.next, + bp = b.prev; - dim = dim || 2; + a.next = b; + b.prev = a; - var hasHoles = holeIndices && holeIndices.length, - outerLen = hasHoles ? holeIndices[0] * dim : data.length, - outerNode = linkedList(data, 0, outerLen, dim, true), - triangles = []; + a2.next = an; + an.prev = a2; - if (!outerNode) return triangles; + b2.next = a2; + a2.prev = b2; - var minX, minY, maxX, maxY, x, y, size; + bp.next = b2; + b2.prev = bp; - if (hasHoles) outerNode = eliminateHoles(data, holeIndices, outerNode, dim); + return b2; +} - // if the shape is not too simple, we'll use z-order curve hash later; calculate polygon bbox - if (data.length > 80 * dim) { - minX = maxX = data[0]; - minY = maxY = data[1]; +// create a node and optionally link it with previous one (in a circular doubly linked list) +function insertNode(i, x, y, last) { + var p = new Node(i, x, y); - for (var i = dim; i < outerLen; i += dim) { - x = data[i]; - y = data[i + 1]; - if (x < minX) minX = x; - if (y < minY) minY = y; - if (x > maxX) maxX = x; - if (y > maxY) maxY = y; - } + if (!last) { + p.prev = p; + p.next = p; - // minX, minY and size are later used to transform coords into integers for z-order calculation - size = Math.max(maxX - minX, maxY - minY); + } else { + p.next = last.next; + p.prev = last; + last.next.prev = p; + last.next = p; } + return p; +} - earcutLinked(outerNode, triangles, dim, minX, minY, size); +function removeNode(p) { + p.next.prev = p.prev; + p.prev.next = p.next; - return triangles; + if (p.prevZ) p.prevZ.nextZ = p.nextZ; + if (p.nextZ) p.nextZ.prevZ = p.prevZ; } -// create a circular doubly linked list from polygon points in the specified winding order -function linkedList(data, start, end, dim, clockwise) { - var i, last; +function Node(i, x, y) { + // vertice index in coordinates array + this.i = i; - if (clockwise === (signedArea(data, start, end, dim) > 0)) { - for (i = start; i < end; i += dim) last = insertNode(i, data[i], data[i + 1], last); - } else { - for (i = end - dim; i >= start; i -= dim) last = insertNode(i, data[i], data[i + 1], last); - } + // vertex coordinates + this.x = x; + this.y = y; - if (last && equals(last, last.next)) { - removeNode(last); - last = last.next; - } + // previous and next vertice nodes in a polygon ring + this.prev = null; + this.next = null; - return last; -} + // z-order curve value + this.z = null; -// eliminate colinear or duplicate points -function filterPoints(start, end) { - if (!start) return start; - if (!end) end = start; + // previous and next nodes in z-order + this.prevZ = null; + this.nextZ = null; - var p = start, - again; - do { - again = false; + // indicates whether this is a steiner point + this.steiner = false; +} - if (!p.steiner && (equals(p, p.next) || area(p.prev, p, p.next) === 0)) { - removeNode(p); - p = end = p.prev; - if (p === p.next) return null; - again = true; +// return a percentage difference between the polygon area and its triangulation area; +// used to verify correctness of triangulation +earcut.deviation = function (data, holeIndices, dim, triangles) { + var hasHoles = holeIndices && holeIndices.length; + var outerLen = hasHoles ? holeIndices[0] * dim : data.length; - } else { - p = p.next; + var polygonArea = Math.abs(signedArea(data, 0, outerLen, dim)); + if (hasHoles) { + for (var i = 0, len = holeIndices.length; i < len; i++) { + var start = holeIndices[i] * dim; + var end = i < len - 1 ? holeIndices[i + 1] * dim : data.length; + polygonArea -= Math.abs(signedArea(data, start, end, dim)); } - } while (again || p !== end); + } - return end; -} + var trianglesArea = 0; + for (i = 0; i < triangles.length; i += 3) { + var a = triangles[i] * dim; + var b = triangles[i + 1] * dim; + var c = triangles[i + 2] * dim; + trianglesArea += Math.abs( + (data[a] - data[c]) * (data[b + 1] - data[a + 1]) - + (data[a] - data[b]) * (data[c + 1] - data[a + 1])); + } -// main ear slicing loop which triangulates a polygon (given as a linked list) -function earcutLinked(ear, triangles, dim, minX, minY, size, pass) { - if (!ear) return; + return polygonArea === 0 && trianglesArea === 0 ? 0 : + Math.abs((trianglesArea - polygonArea) / polygonArea); +}; - // interlink polygon nodes in z-order - if (!pass && size) indexCurve(ear, minX, minY, size); +function signedArea(data, start, end, dim) { + var sum = 0; + for (var i = start, j = end - dim; i < end; i += dim) { + sum += (data[j] - data[i]) * (data[i + 1] + data[j + 1]); + j = i; + } + return sum; +} - var stop = ear, - prev, next; +// turn a polygon in a multi-dimensional array form (e.g. as in GeoJSON) into a form Earcut accepts +earcut.flatten = function (data) { + var dim = data[0][0].length, + result = {vertices: [], holes: [], dimensions: dim}, + holeIndex = 0; - // iterate through ears, slicing them one by one - while (ear.prev !== ear.next) { - prev = ear.prev; - next = ear.next; + for (var i = 0; i < data.length; i++) { + for (var j = 0; j < data[i].length; j++) { + for (var d = 0; d < dim; d++) result.vertices.push(data[i][j][d]); + } + if (i > 0) { + holeIndex += data[i - 1].length; + result.holes.push(holeIndex); + } + } + return result; +}; - if (size ? isEarHashed(ear, minX, minY, size) : isEar(ear)) { - // cut off the triangle - triangles.push(prev.i / dim); - triangles.push(ear.i / dim); - triangles.push(next.i / dim); +},{}],73:[function(_dereq_,module,exports){ +// Copyright Joyent, Inc. and other Node contributors. +// +// Permission is hereby granted, free of charge, to any person obtaining a +// copy of this software and associated documentation files (the +// "Software"), to deal in the Software without restriction, including +// without limitation the rights to use, copy, modify, merge, publish, +// distribute, sublicense, and/or sell copies of the Software, and to permit +// persons to whom the Software is furnished to do so, subject to the +// following conditions: +// +// The above copyright notice and this permission notice shall be included +// in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN +// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE +// USE OR OTHER DEALINGS IN THE SOFTWARE. - removeNode(ear); +function EventEmitter() { + this._events = this._events || {}; + this._maxListeners = this._maxListeners || undefined; +} +module.exports = EventEmitter; - // skipping the next vertice leads to less sliver triangles - ear = next.next; - stop = next.next; +// Backwards-compat with node 0.10.x +EventEmitter.EventEmitter = EventEmitter; - continue; - } +EventEmitter.prototype._events = undefined; +EventEmitter.prototype._maxListeners = undefined; - ear = next; +// By default EventEmitters will print a warning if more than 10 listeners are +// added to it. This is a useful default which helps finding memory leaks. +EventEmitter.defaultMaxListeners = 10; - // if we looped through the whole remaining polygon and can't find any more ears - if (ear === stop) { - // try filtering points and slicing again - if (!pass) { - earcutLinked(filterPoints(ear), triangles, dim, minX, minY, size, 1); +// Obviously not all Emitters should be limited to 10. This function allows +// that to be increased. Set to zero for unlimited. +EventEmitter.prototype.setMaxListeners = function(n) { + if (!isNumber(n) || n < 0 || isNaN(n)) + throw TypeError('n must be a positive number'); + this._maxListeners = n; + return this; +}; - // if this didn't work, try curing all small self-intersections locally - } else if (pass === 1) { - ear = cureLocalIntersections(ear, triangles, dim); - earcutLinked(ear, triangles, dim, minX, minY, size, 2); +EventEmitter.prototype.emit = function(type) { + var er, handler, len, args, i, listeners; - // as a last resort, try splitting the remaining polygon into two - } else if (pass === 2) { - splitEarcut(ear, triangles, dim, minX, minY, size); - } + if (!this._events) + this._events = {}; - break; - } + // If there is no 'error' event listener then throw. + if (type === 'error') { + if (!this._events.error || + (isObject(this._events.error) && !this._events.error.length)) { + er = arguments[1]; + if (er instanceof Error) { + throw er; // Unhandled 'error' event + } else { + // At least give some kind of context to the user + var err = new Error('Uncaught, unspecified "error" event. (' + er + ')'); + err.context = er; + throw err; + } } -} - -// check whether a polygon node forms a valid ear with adjacent nodes -function isEar(ear) { - var a = ear.prev, - b = ear, - c = ear.next; + } - if (area(a, b, c) >= 0) return false; // reflex, can't be an ear + handler = this._events[type]; - // now make sure we don't have other points inside the potential ear - var p = ear.next.next; + if (isUndefined(handler)) + return false; - while (p !== ear.prev) { - if (pointInTriangle(a.x, a.y, b.x, b.y, c.x, c.y, p.x, p.y) && - area(p.prev, p, p.next) >= 0) return false; - p = p.next; + if (isFunction(handler)) { + switch (arguments.length) { + // fast cases + case 1: + handler.call(this); + break; + case 2: + handler.call(this, arguments[1]); + break; + case 3: + handler.call(this, arguments[1], arguments[2]); + break; + // slower + default: + args = Array.prototype.slice.call(arguments, 1); + handler.apply(this, args); } + } else if (isObject(handler)) { + args = Array.prototype.slice.call(arguments, 1); + listeners = handler.slice(); + len = listeners.length; + for (i = 0; i < len; i++) + listeners[i].apply(this, args); + } - return true; -} + return true; +}; -function isEarHashed(ear, minX, minY, size) { - var a = ear.prev, - b = ear, - c = ear.next; +EventEmitter.prototype.addListener = function(type, listener) { + var m; - if (area(a, b, c) >= 0) return false; // reflex, can't be an ear + if (!isFunction(listener)) + throw TypeError('listener must be a function'); - // triangle bbox; min & max are calculated like this for speed - var minTX = a.x < b.x ? (a.x < c.x ? a.x : c.x) : (b.x < c.x ? b.x : c.x), - minTY = a.y < b.y ? (a.y < c.y ? a.y : c.y) : (b.y < c.y ? b.y : c.y), - maxTX = a.x > b.x ? (a.x > c.x ? a.x : c.x) : (b.x > c.x ? b.x : c.x), - maxTY = a.y > b.y ? (a.y > c.y ? a.y : c.y) : (b.y > c.y ? b.y : c.y); + if (!this._events) + this._events = {}; - // z-order range for the current triangle bbox; - var minZ = zOrder(minTX, minTY, minX, minY, size), - maxZ = zOrder(maxTX, maxTY, minX, minY, size); + // To avoid recursion in the case that type === "newListener"! Before + // adding it to the listeners, first emit "newListener". + if (this._events.newListener) + this.emit('newListener', type, + isFunction(listener.listener) ? + listener.listener : listener); - // first look for points inside the triangle in increasing z-order - var p = ear.nextZ; + if (!this._events[type]) + // Optimize the case of one listener. Don't need the extra array object. + this._events[type] = listener; + else if (isObject(this._events[type])) + // If we've already got an array, just append. + this._events[type].push(listener); + else + // Adding the second element, need to change to array. + this._events[type] = [this._events[type], listener]; - while (p && p.z <= maxZ) { - if (p !== ear.prev && p !== ear.next && - pointInTriangle(a.x, a.y, b.x, b.y, c.x, c.y, p.x, p.y) && - area(p.prev, p, p.next) >= 0) return false; - p = p.nextZ; + // Check for listener leak + if (isObject(this._events[type]) && !this._events[type].warned) { + if (!isUndefined(this._maxListeners)) { + m = this._maxListeners; + } else { + m = EventEmitter.defaultMaxListeners; } - // then look for points in decreasing z-order - p = ear.prevZ; - - while (p && p.z >= minZ) { - if (p !== ear.prev && p !== ear.next && - pointInTriangle(a.x, a.y, b.x, b.y, c.x, c.y, p.x, p.y) && - area(p.prev, p, p.next) >= 0) return false; - p = p.prevZ; + if (m && m > 0 && this._events[type].length > m) { + this._events[type].warned = true; + console.error('(node) warning: possible EventEmitter memory ' + + 'leak detected. %d listeners added. ' + + 'Use emitter.setMaxListeners() to increase limit.', + this._events[type].length); + if (typeof console.trace === 'function') { + // not supported in IE 10 + console.trace(); + } } + } - return true; -} + return this; +}; -// go through all polygon nodes and cure small local self-intersections -function cureLocalIntersections(start, triangles, dim) { - var p = start; - do { - var a = p.prev, - b = p.next.next; +EventEmitter.prototype.on = EventEmitter.prototype.addListener; - if (!equals(a, b) && intersects(a, p, p.next, b) && locallyInside(a, b) && locallyInside(b, a)) { +EventEmitter.prototype.once = function(type, listener) { + if (!isFunction(listener)) + throw TypeError('listener must be a function'); - triangles.push(a.i / dim); - triangles.push(p.i / dim); - triangles.push(b.i / dim); + var fired = false; - // remove two nodes involved - removeNode(p); - removeNode(p.next); + function g() { + this.removeListener(type, g); - p = start = b; - } - p = p.next; - } while (p !== start); + if (!fired) { + fired = true; + listener.apply(this, arguments); + } + } - return p; -} + g.listener = listener; + this.on(type, g); -// try splitting polygon into two and triangulate them independently -function splitEarcut(start, triangles, dim, minX, minY, size) { - // look for a valid diagonal that divides the polygon into two - var a = start; - do { - var b = a.next.next; - while (b !== a.prev) { - if (a.i !== b.i && isValidDiagonal(a, b)) { - // split the polygon in two by the diagonal - var c = splitPolygon(a, b); + return this; +}; - // filter colinear points around the cuts - a = filterPoints(a, a.next); - c = filterPoints(c, c.next); +// emits a 'removeListener' event iff the listener was removed +EventEmitter.prototype.removeListener = function(type, listener) { + var list, position, length, i; - // run earcut on each half - earcutLinked(a, triangles, dim, minX, minY, size); - earcutLinked(c, triangles, dim, minX, minY, size); - return; - } - b = b.next; - } - a = a.next; - } while (a !== start); -} + if (!isFunction(listener)) + throw TypeError('listener must be a function'); -// link every hole into the outer loop, producing a single-ring polygon without holes -function eliminateHoles(data, holeIndices, outerNode, dim) { - var queue = [], - i, len, start, end, list; + if (!this._events || !this._events[type]) + return this; - for (i = 0, len = holeIndices.length; i < len; i++) { - start = holeIndices[i] * dim; - end = i < len - 1 ? holeIndices[i + 1] * dim : data.length; - list = linkedList(data, start, end, dim, false); - if (list === list.next) list.steiner = true; - queue.push(getLeftmost(list)); - } + list = this._events[type]; + length = list.length; + position = -1; - queue.sort(compareX); + if (list === listener || + (isFunction(list.listener) && list.listener === listener)) { + delete this._events[type]; + if (this._events.removeListener) + this.emit('removeListener', type, listener); - // process holes from left to right - for (i = 0; i < queue.length; i++) { - eliminateHole(queue[i], outerNode); - outerNode = filterPoints(outerNode, outerNode.next); + } else if (isObject(list)) { + for (i = length; i-- > 0;) { + if (list[i] === listener || + (list[i].listener && list[i].listener === listener)) { + position = i; + break; + } } - return outerNode; -} - -function compareX(a, b) { - return a.x - b.x; -} + if (position < 0) + return this; -// find a bridge between vertices that connects hole with an outer ring and and link it -function eliminateHole(hole, outerNode) { - outerNode = findHoleBridge(hole, outerNode); - if (outerNode) { - var b = splitPolygon(outerNode, hole); - filterPoints(b, b.next); + if (list.length === 1) { + list.length = 0; + delete this._events[type]; + } else { + list.splice(position, 1); } -} - -// David Eberly's algorithm for finding a bridge between hole and outer polygon -function findHoleBridge(hole, outerNode) { - var p = outerNode, - hx = hole.x, - hy = hole.y, - qx = -Infinity, - m; - - // find a segment intersected by a ray from the hole's leftmost point to the left; - // segment's endpoint with lesser x will be potential connection point - do { - if (hy <= p.y && hy >= p.next.y) { - var x = p.x + (hy - p.y) * (p.next.x - p.x) / (p.next.y - p.y); - if (x <= hx && x > qx) { - qx = x; - if (x === hx) { - if (hy === p.y) return p; - if (hy === p.next.y) return p.next; - } - m = p.x < p.next.x ? p : p.next; - } - } - p = p.next; - } while (p !== outerNode); - if (!m) return null; - - if (hx === qx) return m.prev; // hole touches outer segment; pick lower endpoint - - // look for points inside the triangle of hole point, segment intersection and endpoint; - // if there are no points found, we have a valid connection; - // otherwise choose the point of the minimum angle with the ray as connection point - - var stop = m, - mx = m.x, - my = m.y, - tanMin = Infinity, - tan; + if (this._events.removeListener) + this.emit('removeListener', type, listener); + } - p = m.next; + return this; +}; - while (p !== stop) { - if (hx >= p.x && p.x >= mx && - pointInTriangle(hy < my ? hx : qx, hy, mx, my, hy < my ? qx : hx, hy, p.x, p.y)) { +EventEmitter.prototype.removeAllListeners = function(type) { + var key, listeners; - tan = Math.abs(hy - p.y) / (hx - p.x); // tangential + if (!this._events) + return this; - if ((tan < tanMin || (tan === tanMin && p.x > m.x)) && locallyInside(p, hole)) { - m = p; - tanMin = tan; - } - } + // not listening for removeListener, no need to emit + if (!this._events.removeListener) { + if (arguments.length === 0) + this._events = {}; + else if (this._events[type]) + delete this._events[type]; + return this; + } - p = p.next; + // emit removeListener for all listeners on all events + if (arguments.length === 0) { + for (key in this._events) { + if (key === 'removeListener') continue; + this.removeAllListeners(key); } + this.removeAllListeners('removeListener'); + this._events = {}; + return this; + } - return m; -} - -// interlink polygon nodes in z-order -function indexCurve(start, minX, minY, size) { - var p = start; - do { - if (p.z === null) p.z = zOrder(p.x, p.y, minX, minY, size); - p.prevZ = p.prev; - p.nextZ = p.next; - p = p.next; - } while (p !== start); - - p.prevZ.nextZ = null; - p.prevZ = null; - - sortLinked(p); -} - -// Simon Tatham's linked list merge sort algorithm -// http://www.chiark.greenend.org.uk/~sgtatham/algorithms/listsort.html -function sortLinked(list) { - var i, p, q, e, tail, numMerges, pSize, qSize, - inSize = 1; - - do { - p = list; - list = null; - tail = null; - numMerges = 0; - - while (p) { - numMerges++; - q = p; - pSize = 0; - for (i = 0; i < inSize; i++) { - pSize++; - q = q.nextZ; - if (!q) break; - } - - qSize = inSize; - - while (pSize > 0 || (qSize > 0 && q)) { - - if (pSize === 0) { - e = q; - q = q.nextZ; - qSize--; - } else if (qSize === 0 || !q) { - e = p; - p = p.nextZ; - pSize--; - } else if (p.z <= q.z) { - e = p; - p = p.nextZ; - pSize--; - } else { - e = q; - q = q.nextZ; - qSize--; - } - - if (tail) tail.nextZ = e; - else list = e; - - e.prevZ = tail; - tail = e; - } - - p = q; - } - - tail.nextZ = null; - inSize *= 2; - - } while (numMerges > 1); - - return list; -} - -// z-order of a point given coords and size of the data bounding box -function zOrder(x, y, minX, minY, size) { - // coords are transformed into non-negative 15-bit integer range - x = 32767 * (x - minX) / size; - y = 32767 * (y - minY) / size; - - x = (x | (x << 8)) & 0x00FF00FF; - x = (x | (x << 4)) & 0x0F0F0F0F; - x = (x | (x << 2)) & 0x33333333; - x = (x | (x << 1)) & 0x55555555; - - y = (y | (y << 8)) & 0x00FF00FF; - y = (y | (y << 4)) & 0x0F0F0F0F; - y = (y | (y << 2)) & 0x33333333; - y = (y | (y << 1)) & 0x55555555; - - return x | (y << 1); -} - -// find the leftmost node of a polygon ring -function getLeftmost(start) { - var p = start, - leftmost = start; - do { - if (p.x < leftmost.x) leftmost = p; - p = p.next; - } while (p !== start); - - return leftmost; -} - -// check if a point lies within a convex triangle -function pointInTriangle(ax, ay, bx, by, cx, cy, px, py) { - return (cx - px) * (ay - py) - (ax - px) * (cy - py) >= 0 && - (ax - px) * (by - py) - (bx - px) * (ay - py) >= 0 && - (bx - px) * (cy - py) - (cx - px) * (by - py) >= 0; -} - -// check if a diagonal between two polygon nodes is valid (lies in polygon interior) -function isValidDiagonal(a, b) { - return a.next.i !== b.i && a.prev.i !== b.i && !intersectsPolygon(a, b) && - locallyInside(a, b) && locallyInside(b, a) && middleInside(a, b); -} - -// signed area of a triangle -function area(p, q, r) { - return (q.y - p.y) * (r.x - q.x) - (q.x - p.x) * (r.y - q.y); -} - -// check if two points are equal -function equals(p1, p2) { - return p1.x === p2.x && p1.y === p2.y; -} - -// check if two segments intersect -function intersects(p1, q1, p2, q2) { - if ((equals(p1, q1) && equals(p2, q2)) || - (equals(p1, q2) && equals(p2, q1))) return true; - return area(p1, q1, p2) > 0 !== area(p1, q1, q2) > 0 && - area(p2, q2, p1) > 0 !== area(p2, q2, q1) > 0; -} - -// check if a polygon diagonal intersects any polygon segments -function intersectsPolygon(a, b) { - var p = a; - do { - if (p.i !== a.i && p.next.i !== a.i && p.i !== b.i && p.next.i !== b.i && - intersects(p, p.next, a, b)) return true; - p = p.next; - } while (p !== a); - - return false; -} - -// check if a polygon diagonal is locally inside the polygon -function locallyInside(a, b) { - return area(a.prev, a, a.next) < 0 ? - area(a, b, a.next) >= 0 && area(a, a.prev, b) >= 0 : - area(a, b, a.prev) < 0 || area(a, a.next, b) < 0; -} - -// check if the middle point of a polygon diagonal is inside the polygon -function middleInside(a, b) { - var p = a, - inside = false, - px = (a.x + b.x) / 2, - py = (a.y + b.y) / 2; - do { - if (((p.y > py) !== (p.next.y > py)) && (px < (p.next.x - p.x) * (py - p.y) / (p.next.y - p.y) + p.x)) - inside = !inside; - p = p.next; - } while (p !== a); - - return inside; -} - -// link two polygon vertices with a bridge; if the vertices belong to the same ring, it splits polygon into two; -// if one belongs to the outer ring and another to a hole, it merges it into a single ring -function splitPolygon(a, b) { - var a2 = new Node(a.i, a.x, a.y), - b2 = new Node(b.i, b.x, b.y), - an = a.next, - bp = b.prev; - - a.next = b; - b.prev = a; + listeners = this._events[type]; - a2.next = an; - an.prev = a2; + if (isFunction(listeners)) { + this.removeListener(type, listeners); + } else if (listeners) { + // LIFO order + while (listeners.length) + this.removeListener(type, listeners[listeners.length - 1]); + } + delete this._events[type]; - b2.next = a2; - a2.prev = b2; + return this; +}; - bp.next = b2; - b2.prev = bp; +EventEmitter.prototype.listeners = function(type) { + var ret; + if (!this._events || !this._events[type]) + ret = []; + else if (isFunction(this._events[type])) + ret = [this._events[type]]; + else + ret = this._events[type].slice(); + return ret; +}; - return b2; -} +EventEmitter.prototype.listenerCount = function(type) { + if (this._events) { + var evlistener = this._events[type]; -// create a node and optionally link it with previous one (in a circular doubly linked list) -function insertNode(i, x, y, last) { - var p = new Node(i, x, y); + if (isFunction(evlistener)) + return 1; + else if (evlistener) + return evlistener.length; + } + return 0; +}; - if (!last) { - p.prev = p; - p.next = p; +EventEmitter.listenerCount = function(emitter, type) { + return emitter.listenerCount(type); +}; - } else { - p.next = last.next; - p.prev = last; - last.next.prev = p; - last.next = p; - } - return p; +function isFunction(arg) { + return typeof arg === 'function'; } -function removeNode(p) { - p.next.prev = p.prev; - p.prev.next = p.next; - - if (p.prevZ) p.prevZ.nextZ = p.nextZ; - if (p.nextZ) p.nextZ.prevZ = p.prevZ; +function isNumber(arg) { + return typeof arg === 'number'; } -function Node(i, x, y) { - // vertice index in coordinates array - this.i = i; - - // vertex coordinates - this.x = x; - this.y = y; - - // previous and next vertice nodes in a polygon ring - this.prev = null; - this.next = null; - - // z-order curve value - this.z = null; - - // previous and next nodes in z-order - this.prevZ = null; - this.nextZ = null; - - // indicates whether this is a steiner point - this.steiner = false; +function isObject(arg) { + return typeof arg === 'object' && arg !== null; } -// return a percentage difference between the polygon area and its triangulation area; -// used to verify correctness of triangulation -earcut.deviation = function (data, holeIndices, dim, triangles) { - var hasHoles = holeIndices && holeIndices.length; - var outerLen = hasHoles ? holeIndices[0] * dim : data.length; - - var polygonArea = Math.abs(signedArea(data, 0, outerLen, dim)); - if (hasHoles) { - for (var i = 0, len = holeIndices.length; i < len; i++) { - var start = holeIndices[i] * dim; - var end = i < len - 1 ? holeIndices[i + 1] * dim : data.length; - polygonArea -= Math.abs(signedArea(data, start, end, dim)); - } - } - - var trianglesArea = 0; - for (i = 0; i < triangles.length; i += 3) { - var a = triangles[i] * dim; - var b = triangles[i + 1] * dim; - var c = triangles[i + 2] * dim; - trianglesArea += Math.abs( - (data[a] - data[c]) * (data[b + 1] - data[a + 1]) - - (data[a] - data[b]) * (data[c + 1] - data[a + 1])); - } - - return polygonArea === 0 && trianglesArea === 0 ? 0 : - Math.abs((trianglesArea - polygonArea) / polygonArea); -}; - -function signedArea(data, start, end, dim) { - var sum = 0; - for (var i = start, j = end - dim; i < end; i += dim) { - sum += (data[j] - data[i]) * (data[i + 1] + data[j + 1]); - j = i; - } - return sum; +function isUndefined(arg) { + return arg === void 0; } -// turn a polygon in a multi-dimensional array form (e.g. as in GeoJSON) into a form Earcut accepts -earcut.flatten = function (data) { - var dim = data[0][0].length, - result = {vertices: [], holes: [], dimensions: dim}, - holeIndex = 0; - - for (var i = 0; i < data.length; i++) { - for (var j = 0; j < data[i].length; j++) { - for (var d = 0; d < dim; d++) result.vertices.push(data[i][j][d]); - } - if (i > 0) { - holeIndex += data[i - 1].length; - result.holes.push(holeIndex); - } - } - return result; -}; - -},{}],78:[function(_dereq_,module,exports){ +},{}],74:[function(_dereq_,module,exports){ (function(){var k=!!document.addEventListener;function l(a,b){k?a.addEventListener("scroll",b,!1):a.attachEvent("scroll",b)}function v(a){document.body?a():k?document.addEventListener("DOMContentLoaded",a):document.attachEvent("onreadystatechange",function(){"interactive"!=document.readyState&&"complete"!=document.readyState||a()})};function w(a){this.a=document.createElement("div");this.a.setAttribute("aria-hidden","true");this.a.appendChild(document.createTextNode(a));this.b=document.createElement("span");this.c=document.createElement("span");this.h=document.createElement("span");this.f=document.createElement("span");this.g=-1;this.b.style.cssText="max-width:none;display:inline-block;position:absolute;height:100%;width:100%;overflow:scroll;font-size:16px;";this.c.style.cssText="max-width:none;display:inline-block;position:absolute;height:100%;width:100%;overflow:scroll;font-size:16px;"; this.f.style.cssText="max-width:none;display:inline-block;position:absolute;height:100%;width:100%;overflow:scroll;font-size:16px;";this.h.style.cssText="display:inline-block;width:200%;height:200%;font-size:16px;max-width:none;";this.b.appendChild(this.h);this.c.appendChild(this.f);this.a.appendChild(this.b);this.a.appendChild(this.c)} function y(a,b){a.a.style.cssText="max-width:none;min-width:20px;min-height:20px;display:inline-block;overflow:hidden;position:absolute;width:auto;margin:0;padding:0;top:-999px;left:-999px;white-space:nowrap;font:"+b+";"}function z(a){var b=a.a.offsetWidth,c=b+100;a.f.style.width=c+"px";a.c.scrollLeft=c;a.b.scrollLeft=a.b.scrollWidth+100;return a.g!==b?(a.g=b,!0):!1}function A(a,b){function c(){var a=m;z(a)&&null!==a.a.parentNode&&b(a.g)}var m=a;l(a.b,c);l(a.c,c);z(a)};function B(a,b){var c=b||{};this.family=a;this.style=c.style||"normal";this.weight=c.weight||"normal";this.stretch=c.stretch||"normal"}var C=null,D=null,H=!!window.FontFace;function I(){if(null===D){var a=document.createElement("div");try{a.style.font="condensed 100px sans-serif"}catch(b){}D=""!==a.style.font}return D}function J(a,b){return[a.style,a.weight,I()?a.stretch:"","100px",b].join(" ")} @@ -5222,7 +4709,7 @@ h)(b=f!=g&&f!=h&&g!=h)||(null===C&&(b=/AppleWebKit\/([0-9]+)(?:\.([0-9]+))/.exec h=p.a.offsetWidth,q();G=setTimeout(F,50)}}var e=new w(m),n=new w(m),p=new w(m),f=-1,g=-1,h=-1,r=-1,t=-1,u=-1,d=document.createElement("div"),G=0;d.dir="ltr";y(e,J(c,"sans-serif"));y(n,J(c,"serif"));y(p,J(c,"monospace"));d.appendChild(e.a);d.appendChild(n.a);d.appendChild(p.a);document.body.appendChild(d);r=e.a.offsetWidth;t=n.a.offsetWidth;u=p.a.offsetWidth;F();A(e,function(a){f=a;q()});y(e,J(c,'"'+c.family+'",sans-serif'));A(n,function(a){g=a;q()});y(n,J(c,'"'+c.family+'",serif'));A(p,function(a){h= a;q()});y(p,J(c,'"'+c.family+'",monospace'))})})};window.FontFaceObserver=B;window.FontFaceObserver.prototype.check=window.FontFaceObserver.prototype.load=B.prototype.load;"undefined"!==typeof module&&(module.exports=window.FontFaceObserver);}()); -},{}],79:[function(_dereq_,module,exports){ +},{}],75:[function(_dereq_,module,exports){ 'use strict'; module.exports = clip; @@ -5375,7 +4862,7 @@ function newSlice(slices, slice, area, dist) { return []; } -},{}],80:[function(_dereq_,module,exports){ +},{}],76:[function(_dereq_,module,exports){ 'use strict'; module.exports = convert; @@ -5521,7 +5008,7 @@ function calcRingBBox(min, max, points) { } } -},{"./simplify":82}],81:[function(_dereq_,module,exports){ +},{"./simplify":78}],77:[function(_dereq_,module,exports){ 'use strict'; module.exports = geojsonvt; @@ -5788,7 +5275,7 @@ function isClippedSquare(tile, extent, buffer) { return true; } -},{"./clip":79,"./convert":80,"./tile":83,"./wrap":84}],82:[function(_dereq_,module,exports){ +},{"./clip":75,"./convert":76,"./tile":79,"./wrap":80}],78:[function(_dereq_,module,exports){ 'use strict'; module.exports = simplify; @@ -5864,7 +5351,7 @@ function getSqSegDist(p, a, b) { return dx * dx + dy * dy; } -},{}],83:[function(_dereq_,module,exports){ +},{}],79:[function(_dereq_,module,exports){ 'use strict'; module.exports = createTile; @@ -5951,7 +5438,7 @@ function addFeature(tile, feature, tolerance, noSimplify) { } } -},{}],84:[function(_dereq_,module,exports){ +},{}],80:[function(_dereq_,module,exports){ 'use strict'; var clip = _dereq_('./clip'); @@ -6014,7 +5501,7 @@ function shiftCoords(points, offset) { return newPoints; } -},{"./clip":79}],85:[function(_dereq_,module,exports){ +},{"./clip":75}],81:[function(_dereq_,module,exports){ module.exports = invert /** @@ -6053,7 +5540,7 @@ function invert(out, a) { return out } -},{}],86:[function(_dereq_,module,exports){ +},{}],82:[function(_dereq_,module,exports){ module.exports = normalFromMat4 /** @@ -6110,7 +5597,7 @@ function normalFromMat4(out, a) { return out } -},{}],87:[function(_dereq_,module,exports){ +},{}],83:[function(_dereq_,module,exports){ module.exports = copy; /** @@ -6139,7 +5626,7 @@ function copy(out, a) { out[15] = a[15]; return out; }; -},{}],88:[function(_dereq_,module,exports){ +},{}],84:[function(_dereq_,module,exports){ module.exports = identity; /** @@ -6167,7 +5654,7 @@ function identity(out) { out[15] = 1; return out; }; -},{}],89:[function(_dereq_,module,exports){ +},{}],85:[function(_dereq_,module,exports){ var identity = _dereq_('./identity'); module.exports = lookAt; @@ -6258,7 +5745,7 @@ function lookAt(out, eye, center, up) { return out; }; -},{"./identity":88}],90:[function(_dereq_,module,exports){ +},{"./identity":84}],86:[function(_dereq_,module,exports){ module.exports = multiply; /** @@ -6301,7 +5788,7 @@ function multiply(out, a, b) { out[15] = b0*a03 + b1*a13 + b2*a23 + b3*a33; return out; }; -},{}],91:[function(_dereq_,module,exports){ +},{}],87:[function(_dereq_,module,exports){ module.exports = perspective; /** @@ -6335,7 +5822,7 @@ function perspective(out, fovy, aspect, near, far) { out[15] = 0; return out; }; -},{}],92:[function(_dereq_,module,exports){ +},{}],88:[function(_dereq_,module,exports){ module.exports = scale; /** @@ -6367,7 +5854,7 @@ function scale(out, a, v) { out[15] = a[15]; return out; }; -},{}],93:[function(_dereq_,module,exports){ +},{}],89:[function(_dereq_,module,exports){ module.exports = translate; /** @@ -6406,7 +5893,7 @@ function translate(out, a, v) { return out; }; -},{}],94:[function(_dereq_,module,exports){ +},{}],90:[function(_dereq_,module,exports){ module.exports = parseErrors function parseErrors(log) { @@ -6434,6 +5921,147 @@ function parseErrors(log) { return logs } +},{}],91:[function(_dereq_,module,exports){ +exports.read = function (buffer, offset, isLE, mLen, nBytes) { + var e, m + var eLen = nBytes * 8 - mLen - 1 + var eMax = (1 << eLen) - 1 + var eBias = eMax >> 1 + var nBits = -7 + var i = isLE ? (nBytes - 1) : 0 + var d = isLE ? -1 : 1 + var s = buffer[offset + i] + + i += d + + e = s & ((1 << (-nBits)) - 1) + s >>= (-nBits) + nBits += eLen + for (; nBits > 0; e = e * 256 + buffer[offset + i], i += d, nBits -= 8) {} + + m = e & ((1 << (-nBits)) - 1) + e >>= (-nBits) + nBits += mLen + for (; nBits > 0; m = m * 256 + buffer[offset + i], i += d, nBits -= 8) {} + + if (e === 0) { + e = 1 - eBias + } else if (e === eMax) { + return m ? NaN : ((s ? -1 : 1) * Infinity) + } else { + m = m + Math.pow(2, mLen) + e = e - eBias + } + return (s ? -1 : 1) * m * Math.pow(2, e - mLen) +} + +exports.write = function (buffer, value, offset, isLE, mLen, nBytes) { + var e, m, c + var eLen = nBytes * 8 - mLen - 1 + var eMax = (1 << eLen) - 1 + var eBias = eMax >> 1 + var rt = (mLen === 23 ? Math.pow(2, -24) - Math.pow(2, -77) : 0) + var i = isLE ? 0 : (nBytes - 1) + var d = isLE ? 1 : -1 + var s = value < 0 || (value === 0 && 1 / value < 0) ? 1 : 0 + + value = Math.abs(value) + + if (isNaN(value) || value === Infinity) { + m = isNaN(value) ? 1 : 0 + e = eMax + } else { + e = Math.floor(Math.log(value) / Math.LN2) + if (value * (c = Math.pow(2, -e)) < 1) { + e-- + c *= 2 + } + if (e + eBias >= 1) { + value += rt / c + } else { + value += rt * Math.pow(2, 1 - eBias) + } + if (value * c >= 2) { + e++ + c /= 2 + } + + if (e + eBias >= eMax) { + m = 0 + e = eMax + } else if (e + eBias >= 1) { + m = (value * c - 1) * Math.pow(2, mLen) + e = e + eBias + } else { + m = value * Math.pow(2, eBias - 1) * Math.pow(2, mLen) + e = 0 + } + } + + for (; mLen >= 8; buffer[offset + i] = m & 0xff, i += d, m /= 256, mLen -= 8) {} + + e = (e << mLen) | m + eLen += mLen + for (; eLen > 0; buffer[offset + i] = e & 0xff, i += d, e /= 256, eLen -= 8) {} + + buffer[offset + i - d] |= s * 128 +} + +},{}],92:[function(_dereq_,module,exports){ +if (typeof Object.create === 'function') { + // implementation from standard node.js 'util' module + module.exports = function inherits(ctor, superCtor) { + ctor.super_ = superCtor + ctor.prototype = Object.create(superCtor.prototype, { + constructor: { + value: ctor, + enumerable: false, + writable: true, + configurable: true + } + }); + }; +} else { + // old school shim for old browsers + module.exports = function inherits(ctor, superCtor) { + ctor.super_ = superCtor + var TempCtor = function () {} + TempCtor.prototype = superCtor.prototype + ctor.prototype = new TempCtor() + ctor.prototype.constructor = ctor + } +} + +},{}],93:[function(_dereq_,module,exports){ +/*! + * Determine if an object is a Buffer + * + * @author Feross Aboukhadijeh + * @license MIT + */ + +// The _isBuffer check is for Safari 5-7 support, because it's missing +// Object.prototype.constructor. Remove this eventually +module.exports = function (obj) { + return obj != null && (isBuffer(obj) || isSlowBuffer(obj) || !!obj._isBuffer) +} + +function isBuffer (obj) { + return !!obj.constructor && typeof obj.constructor.isBuffer === 'function' && obj.constructor.isBuffer(obj) +} + +// For Node v0.10 support. Remove this eventually. +function isSlowBuffer (obj) { + return typeof obj.readFloatLE === 'function' && typeof obj.slice === 'function' && isBuffer(obj.slice(0, 0)) +} + +},{}],94:[function(_dereq_,module,exports){ +var toString = {}.toString; + +module.exports = Array.isArray || function (arr) { + return toString.call(arr) == '[object Array]'; +}; + },{}],95:[function(_dereq_,module,exports){ 'use strict'; @@ -8680,7 +8308,7 @@ module.exports = new Type('tag:yaml.org,2002:binary', { represent: representYamlBinary }); -},{"../type":107,"buffer":1}],109:[function(_dereq_,module,exports){ +},{"../type":107,"buffer":4}],109:[function(_dereq_,module,exports){ 'use strict'; var Type = _dereq_('../type'); @@ -9822,7 +9450,7 @@ exports.uncompressWorker = function () { return new FlateWorker("Inflate", {}); }; -},{"./stream/GenericWorker":148,"./utils":152,"pako":158}],131:[function(_dereq_,module,exports){ +},{"./stream/GenericWorker":148,"./utils":152,"pako":156}],131:[function(_dereq_,module,exports){ 'use strict'; /** @@ -10076,7 +9704,7 @@ NodejsStreamOutputAdapter.prototype._read = function() { module.exports = NodejsStreamOutputAdapter; -},{"readable-stream":185,"util":11}],135:[function(_dereq_,module,exports){ +},{"readable-stream":182,"util":189}],135:[function(_dereq_,module,exports){ (function (Buffer){ 'use strict'; @@ -10115,7 +9743,7 @@ module.exports = { }).call(this,_dereq_("buffer").Buffer) -},{"buffer":2}],136:[function(_dereq_,module,exports){ +},{"buffer":5}],136:[function(_dereq_,module,exports){ 'use strict'; // var utf8 = require('./utf8'); var utils = _dereq_('./utils'); @@ -11484,7 +11112,7 @@ module.exports = StreamHelper; }).call(this,_dereq_("buffer").Buffer) -},{"../base64":124,"../external":129,"../nodejs/NodejsStreamOutputAdapter":134,"../utils":152,"./ConvertWorker":144,"./GenericWorker":148,"buffer":2}],150:[function(_dereq_,module,exports){ +},{"../base64":124,"../external":129,"../nodejs/NodejsStreamOutputAdapter":134,"../utils":152,"./ConvertWorker":144,"./GenericWorker":148,"buffer":5}],150:[function(_dereq_,module,exports){ (function (Buffer){ 'use strict'; @@ -11523,7 +11151,7 @@ exports.nodestream = !!_dereq_("./nodejs/NodejsStreamOutputAdapter").prototype; }).call(this,_dereq_("buffer").Buffer) -},{"./nodejs/NodejsStreamOutputAdapter":134,"buffer":2}],151:[function(_dereq_,module,exports){ +},{"./nodejs/NodejsStreamOutputAdapter":134,"buffer":5}],151:[function(_dereq_,module,exports){ 'use strict'; var utils = _dereq_('./utils'); @@ -12267,7 +11895,7 @@ exports.prepareContent = function(name, inputData, isBinary, isOptimizedBinarySt }); }; -},{"./base64":124,"./external":129,"./nodejsUtils":135,"./support":150,"asap":156}],153:[function(_dereq_,module,exports){ +},{"./base64":124,"./external":129,"./nodejsUtils":135,"./support":150,"asap":1}],153:[function(_dereq_,module,exports){ 'use strict'; var readerFor = _dereq_('./reader/readerFor'); var utils = _dereq_('./utils'); @@ -12952,302 +12580,6 @@ for(var i = 0; i < removedMethods.length; i++) { module.exports = ZipObject; },{"./compressedObject":125,"./stream/DataWorker":147,"./stream/GenericWorker":148,"./stream/StreamHelper":149,"./utf8":151}],156:[function(_dereq_,module,exports){ -"use strict"; - -// rawAsap provides everything we need except exception management. -var rawAsap = _dereq_("./raw"); -// RawTasks are recycled to reduce GC churn. -var freeTasks = []; -// We queue errors to ensure they are thrown in right order (FIFO). -// Array-as-queue is good enough here, since we are just dealing with exceptions. -var pendingErrors = []; -var requestErrorThrow = rawAsap.makeRequestCallFromTimer(throwFirstError); - -function throwFirstError() { - if (pendingErrors.length) { - throw pendingErrors.shift(); - } -} - -/** - * Calls a task as soon as possible after returning, in its own event, with priority - * over other events like animation, reflow, and repaint. An error thrown from an - * event will not interrupt, nor even substantially slow down the processing of - * other events, but will be rather postponed to a lower priority event. - * @param {{call}} task A callable object, typically a function that takes no - * arguments. - */ -module.exports = asap; -function asap(task) { - var rawTask; - if (freeTasks.length) { - rawTask = freeTasks.pop(); - } else { - rawTask = new RawTask(); - } - rawTask.task = task; - rawAsap(rawTask); -} - -// We wrap tasks with recyclable task objects. A task object implements -// `call`, just like a function. -function RawTask() { - this.task = null; -} - -// The sole purpose of wrapping the task is to catch the exception and recycle -// the task object after its single use. -RawTask.prototype.call = function () { - try { - this.task.call(); - } catch (error) { - if (asap.onerror) { - // This hook exists purely for testing purposes. - // Its name will be periodically randomized to break any code that - // depends on its existence. - asap.onerror(error); - } else { - // In a web browser, exceptions are not fatal. However, to avoid - // slowing down the queue of pending tasks, we rethrow the error in a - // lower priority turn. - pendingErrors.push(error); - requestErrorThrow(); - } - } finally { - this.task = null; - freeTasks[freeTasks.length] = this; - } -}; - -},{"./raw":157}],157:[function(_dereq_,module,exports){ -(function (global){ -"use strict"; - -// Use the fastest means possible to execute a task in its own turn, with -// priority over other events including IO, animation, reflow, and redraw -// events in browsers. -// -// An exception thrown by a task will permanently interrupt the processing of -// subsequent tasks. The higher level `asap` function ensures that if an -// exception is thrown by a task, that the task queue will continue flushing as -// soon as possible, but if you use `rawAsap` directly, you are responsible to -// either ensure that no exceptions are thrown from your task, or to manually -// call `rawAsap.requestFlush` if an exception is thrown. -module.exports = rawAsap; -function rawAsap(task) { - if (!queue.length) { - requestFlush(); - flushing = true; - } - // Equivalent to push, but avoids a function call. - queue[queue.length] = task; -} - -var queue = []; -// Once a flush has been requested, no further calls to `requestFlush` are -// necessary until the next `flush` completes. -var flushing = false; -// `requestFlush` is an implementation-specific method that attempts to kick -// off a `flush` event as quickly as possible. `flush` will attempt to exhaust -// the event queue before yielding to the browser's own event loop. -var requestFlush; -// The position of the next task to execute in the task queue. This is -// preserved between calls to `flush` so that it can be resumed if -// a task throws an exception. -var index = 0; -// If a task schedules additional tasks recursively, the task queue can grow -// unbounded. To prevent memory exhaustion, the task queue will periodically -// truncate already-completed tasks. -var capacity = 1024; - -// The flush function processes all tasks that have been scheduled with -// `rawAsap` unless and until one of those tasks throws an exception. -// If a task throws an exception, `flush` ensures that its state will remain -// consistent and will resume where it left off when called again. -// However, `flush` does not make any arrangements to be called again if an -// exception is thrown. -function flush() { - while (index < queue.length) { - var currentIndex = index; - // Advance the index before calling the task. This ensures that we will - // begin flushing on the next task the task throws an error. - index = index + 1; - queue[currentIndex].call(); - // Prevent leaking memory for long chains of recursive calls to `asap`. - // If we call `asap` within tasks scheduled by `asap`, the queue will - // grow, but to avoid an O(n) walk for every task we execute, we don't - // shift tasks off the queue after they have been executed. - // Instead, we periodically shift 1024 tasks off the queue. - if (index > capacity) { - // Manually shift all values starting at the index back to the - // beginning of the queue. - for (var scan = 0, newLength = queue.length - index; scan < newLength; scan++) { - queue[scan] = queue[scan + index]; - } - queue.length -= index; - index = 0; - } - } - queue.length = 0; - index = 0; - flushing = false; -} - -// `requestFlush` is implemented using a strategy based on data collected from -// every available SauceLabs Selenium web driver worker at time of writing. -// https://docs.google.com/spreadsheets/d/1mG-5UYGup5qxGdEMWkhP6BWCz053NUb2E1QoUTU16uA/edit#gid=783724593 - -// Safari 6 and 6.1 for desktop, iPad, and iPhone are the only browsers that -// have WebKitMutationObserver but not un-prefixed MutationObserver. -// Must use `global` or `self` instead of `window` to work in both frames and web -// workers. `global` is a provision of Browserify, Mr, Mrs, or Mop. - -/* globals self */ -var scope = typeof global !== "undefined" ? global : self; -var BrowserMutationObserver = scope.MutationObserver || scope.WebKitMutationObserver; - -// MutationObservers are desirable because they have high priority and work -// reliably everywhere they are implemented. -// They are implemented in all modern browsers. -// -// - Android 4-4.3 -// - Chrome 26-34 -// - Firefox 14-29 -// - Internet Explorer 11 -// - iPad Safari 6-7.1 -// - iPhone Safari 7-7.1 -// - Safari 6-7 -if (typeof BrowserMutationObserver === "function") { - requestFlush = makeRequestCallFromMutationObserver(flush); - -// MessageChannels are desirable because they give direct access to the HTML -// task queue, are implemented in Internet Explorer 10, Safari 5.0-1, and Opera -// 11-12, and in web workers in many engines. -// Although message channels yield to any queued rendering and IO tasks, they -// would be better than imposing the 4ms delay of timers. -// However, they do not work reliably in Internet Explorer or Safari. - -// Internet Explorer 10 is the only browser that has setImmediate but does -// not have MutationObservers. -// Although setImmediate yields to the browser's renderer, it would be -// preferrable to falling back to setTimeout since it does not have -// the minimum 4ms penalty. -// Unfortunately there appears to be a bug in Internet Explorer 10 Mobile (and -// Desktop to a lesser extent) that renders both setImmediate and -// MessageChannel useless for the purposes of ASAP. -// https://github.com/kriskowal/q/issues/396 - -// Timers are implemented universally. -// We fall back to timers in workers in most engines, and in foreground -// contexts in the following browsers. -// However, note that even this simple case requires nuances to operate in a -// broad spectrum of browsers. -// -// - Firefox 3-13 -// - Internet Explorer 6-9 -// - iPad Safari 4.3 -// - Lynx 2.8.7 -} else { - requestFlush = makeRequestCallFromTimer(flush); -} - -// `requestFlush` requests that the high priority event queue be flushed as -// soon as possible. -// This is useful to prevent an error thrown in a task from stalling the event -// queue if the exception handled by Node.js’s -// `process.on("uncaughtException")` or by a domain. -rawAsap.requestFlush = requestFlush; - -// To request a high priority event, we induce a mutation observer by toggling -// the text of a text node between "1" and "-1". -function makeRequestCallFromMutationObserver(callback) { - var toggle = 1; - var observer = new BrowserMutationObserver(callback); - var node = document.createTextNode(""); - observer.observe(node, {characterData: true}); - return function requestCall() { - toggle = -toggle; - node.data = toggle; - }; -} - -// The message channel technique was discovered by Malte Ubl and was the -// original foundation for this library. -// http://www.nonblocking.io/2011/06/windownexttick.html - -// Safari 6.0.5 (at least) intermittently fails to create message ports on a -// page's first load. Thankfully, this version of Safari supports -// MutationObservers, so we don't need to fall back in that case. - -// function makeRequestCallFromMessageChannel(callback) { -// var channel = new MessageChannel(); -// channel.port1.onmessage = callback; -// return function requestCall() { -// channel.port2.postMessage(0); -// }; -// } - -// For reasons explained above, we are also unable to use `setImmediate` -// under any circumstances. -// Even if we were, there is another bug in Internet Explorer 10. -// It is not sufficient to assign `setImmediate` to `requestFlush` because -// `setImmediate` must be called *by name* and therefore must be wrapped in a -// closure. -// Never forget. - -// function makeRequestCallFromSetImmediate(callback) { -// return function requestCall() { -// setImmediate(callback); -// }; -// } - -// Safari 6.0 has a problem where timers will get lost while the user is -// scrolling. This problem does not impact ASAP because Safari 6.0 supports -// mutation observers, so that implementation is used instead. -// However, if we ever elect to use timers in Safari, the prevalent work-around -// is to add a scroll event listener that calls for a flush. - -// `setTimeout` does not call the passed callback if the delay is less than -// approximately 7 in web workers in Firefox 8 through 18, and sometimes not -// even then. - -function makeRequestCallFromTimer(callback) { - return function requestCall() { - // We dispatch a timeout with a specified delay of 0 for engines that - // can reliably accommodate that request. This will usually be snapped - // to a 4 milisecond delay, but once we're flushing, there's no delay - // between events. - var timeoutHandle = setTimeout(handleTimer, 0); - // However, since this timer gets frequently dropped in Firefox - // workers, we enlist an interval handle that will try to fire - // an event 20 times per second until it succeeds. - var intervalHandle = setInterval(handleTimer, 50); - - function handleTimer() { - // Whichever timer succeeds will cancel both timers and - // execute the callback. - clearTimeout(timeoutHandle); - clearInterval(intervalHandle); - callback(); - } - }; -} - -// This is for `asap.js` only. -// Its name will be periodically randomized to break any code that depends on -// its existence. -rawAsap.makeRequestCallFromTimer = makeRequestCallFromTimer; - -// ASAP was originally a nextTick shim included in Q. This was factored out -// into this ASAP package. It was later adapted to RSVP which made further -// amendments. These decisions, particularly to marginalize MessageChannel and -// to capture the MutationObserver implementation in a closure, were integrated -// back into ASAP proper. -// https://github.com/tildeio/rsvp.js/blob/cddf7232546a9cf858524b75cde6f9edf72620a7/lib/rsvp/asap.js - -}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) - -},{}],158:[function(_dereq_,module,exports){ // Top level file is just a mixin of submodules & constants 'use strict'; @@ -13263,7 +12595,7 @@ assign(pako, deflate, inflate, constants); module.exports = pako; -},{"./lib/deflate":159,"./lib/inflate":160,"./lib/utils/common":161,"./lib/zlib/constants":164}],159:[function(_dereq_,module,exports){ +},{"./lib/deflate":157,"./lib/inflate":158,"./lib/utils/common":159,"./lib/zlib/constants":162}],157:[function(_dereq_,module,exports){ 'use strict'; @@ -13665,7 +12997,7 @@ exports.deflate = deflate; exports.deflateRaw = deflateRaw; exports.gzip = gzip; -},{"./utils/common":161,"./utils/strings":162,"./zlib/deflate":166,"./zlib/messages":171,"./zlib/zstream":173}],160:[function(_dereq_,module,exports){ +},{"./utils/common":159,"./utils/strings":160,"./zlib/deflate":164,"./zlib/messages":169,"./zlib/zstream":171}],158:[function(_dereq_,module,exports){ 'use strict'; @@ -14085,7 +13417,7 @@ exports.inflate = inflate; exports.inflateRaw = inflateRaw; exports.ungzip = inflate; -},{"./utils/common":161,"./utils/strings":162,"./zlib/constants":164,"./zlib/gzheader":167,"./zlib/inflate":169,"./zlib/messages":171,"./zlib/zstream":173}],161:[function(_dereq_,module,exports){ +},{"./utils/common":159,"./utils/strings":160,"./zlib/constants":162,"./zlib/gzheader":165,"./zlib/inflate":167,"./zlib/messages":169,"./zlib/zstream":171}],159:[function(_dereq_,module,exports){ 'use strict'; @@ -14189,7 +13521,7 @@ exports.setTyped = function (on) { exports.setTyped(TYPED_OK); -},{}],162:[function(_dereq_,module,exports){ +},{}],160:[function(_dereq_,module,exports){ // String encode/decode helpers 'use strict'; @@ -14376,7 +13708,7 @@ exports.utf8border = function (buf, max) { return (pos + _utf8len[buf[pos]] > max) ? pos : max; }; -},{"./common":161}],163:[function(_dereq_,module,exports){ +},{"./common":159}],161:[function(_dereq_,module,exports){ 'use strict'; // Note: adler32 takes 12% for level 0 and 2% for level 6. @@ -14410,7 +13742,7 @@ function adler32(adler, buf, len, pos) { module.exports = adler32; -},{}],164:[function(_dereq_,module,exports){ +},{}],162:[function(_dereq_,module,exports){ 'use strict'; @@ -14462,7 +13794,7 @@ module.exports = { //Z_NULL: null // Use -1 or null inline, depending on var type }; -},{}],165:[function(_dereq_,module,exports){ +},{}],163:[function(_dereq_,module,exports){ 'use strict'; // Note: we can't get significant speed boost here. @@ -14505,7 +13837,7 @@ function crc32(crc, buf, len, pos) { module.exports = crc32; -},{}],166:[function(_dereq_,module,exports){ +},{}],164:[function(_dereq_,module,exports){ 'use strict'; var utils = _dereq_('../utils/common'); @@ -16362,7 +15694,7 @@ exports.deflatePrime = deflatePrime; exports.deflateTune = deflateTune; */ -},{"../utils/common":161,"./adler32":163,"./crc32":165,"./messages":171,"./trees":172}],167:[function(_dereq_,module,exports){ +},{"../utils/common":159,"./adler32":161,"./crc32":163,"./messages":169,"./trees":170}],165:[function(_dereq_,module,exports){ 'use strict'; @@ -16404,7 +15736,7 @@ function GZheader() { module.exports = GZheader; -},{}],168:[function(_dereq_,module,exports){ +},{}],166:[function(_dereq_,module,exports){ 'use strict'; // See state defs from inflate.js @@ -16732,7 +16064,7 @@ module.exports = function inflate_fast(strm, start) { return; }; -},{}],169:[function(_dereq_,module,exports){ +},{}],167:[function(_dereq_,module,exports){ 'use strict'; @@ -18146,1712 +17478,2664 @@ function inflate(strm, flush) { // inf_leave <- here is real place for "goto inf_leave", emulated via "break inf_leave" - /* - Return from inflate(), updating the total counts and the check value. - If there was no progress during the inflate() call, return a buffer - error. Call updatewindow() to create and/or update the window state. - Note: a memory error from inflate() is non-recoverable. - */ + /* + Return from inflate(), updating the total counts and the check value. + If there was no progress during the inflate() call, return a buffer + error. Call updatewindow() to create and/or update the window state. + Note: a memory error from inflate() is non-recoverable. + */ + + //--- RESTORE() --- + strm.next_out = put; + strm.avail_out = left; + strm.next_in = next; + strm.avail_in = have; + state.hold = hold; + state.bits = bits; + //--- + + if (state.wsize || (_out !== strm.avail_out && state.mode < BAD && + (state.mode < CHECK || flush !== Z_FINISH))) { + if (updatewindow(strm, strm.output, strm.next_out, _out - strm.avail_out)) { + state.mode = MEM; + return Z_MEM_ERROR; + } + } + _in -= strm.avail_in; + _out -= strm.avail_out; + strm.total_in += _in; + strm.total_out += _out; + state.total += _out; + if (state.wrap && _out) { + strm.adler = state.check = /*UPDATE(state.check, strm.next_out - _out, _out);*/ + (state.flags ? crc32(state.check, output, _out, strm.next_out - _out) : adler32(state.check, output, _out, strm.next_out - _out)); + } + strm.data_type = state.bits + (state.last ? 64 : 0) + + (state.mode === TYPE ? 128 : 0) + + (state.mode === LEN_ || state.mode === COPY_ ? 256 : 0); + if (((_in === 0 && _out === 0) || flush === Z_FINISH) && ret === Z_OK) { + ret = Z_BUF_ERROR; + } + return ret; +} + +function inflateEnd(strm) { + + if (!strm || !strm.state /*|| strm->zfree == (free_func)0*/) { + return Z_STREAM_ERROR; + } + + var state = strm.state; + if (state.window) { + state.window = null; + } + strm.state = null; + return Z_OK; +} + +function inflateGetHeader(strm, head) { + var state; + + /* check state */ + if (!strm || !strm.state) { return Z_STREAM_ERROR; } + state = strm.state; + if ((state.wrap & 2) === 0) { return Z_STREAM_ERROR; } + + /* save header structure */ + state.head = head; + head.done = false; + return Z_OK; +} + +function inflateSetDictionary(strm, dictionary) { + var dictLength = dictionary.length; + + var state; + var dictid; + var ret; + + /* check state */ + if (!strm /* == Z_NULL */ || !strm.state /* == Z_NULL */) { return Z_STREAM_ERROR; } + state = strm.state; + + if (state.wrap !== 0 && state.mode !== DICT) { + return Z_STREAM_ERROR; + } + + /* check for correct dictionary identifier */ + if (state.mode === DICT) { + dictid = 1; /* adler32(0, null, 0)*/ + /* dictid = adler32(dictid, dictionary, dictLength); */ + dictid = adler32(dictid, dictionary, dictLength, 0); + if (dictid !== state.check) { + return Z_DATA_ERROR; + } + } + /* copy dictionary to window using updatewindow(), which will amend the + existing dictionary if appropriate */ + ret = updatewindow(strm, dictionary, dictLength, dictLength); + if (ret) { + state.mode = MEM; + return Z_MEM_ERROR; + } + state.havedict = 1; + // Tracev((stderr, "inflate: dictionary set\n")); + return Z_OK; +} + +exports.inflateReset = inflateReset; +exports.inflateReset2 = inflateReset2; +exports.inflateResetKeep = inflateResetKeep; +exports.inflateInit = inflateInit; +exports.inflateInit2 = inflateInit2; +exports.inflate = inflate; +exports.inflateEnd = inflateEnd; +exports.inflateGetHeader = inflateGetHeader; +exports.inflateSetDictionary = inflateSetDictionary; +exports.inflateInfo = 'pako inflate (from Nodeca project)'; + +/* Not implemented +exports.inflateCopy = inflateCopy; +exports.inflateGetDictionary = inflateGetDictionary; +exports.inflateMark = inflateMark; +exports.inflatePrime = inflatePrime; +exports.inflateSync = inflateSync; +exports.inflateSyncPoint = inflateSyncPoint; +exports.inflateUndermine = inflateUndermine; +*/ + +},{"../utils/common":159,"./adler32":161,"./crc32":163,"./inffast":166,"./inftrees":168}],168:[function(_dereq_,module,exports){ +'use strict'; + + +var utils = _dereq_('../utils/common'); + +var MAXBITS = 15; +var ENOUGH_LENS = 852; +var ENOUGH_DISTS = 592; +//var ENOUGH = (ENOUGH_LENS+ENOUGH_DISTS); + +var CODES = 0; +var LENS = 1; +var DISTS = 2; + +var lbase = [ /* Length codes 257..285 base */ + 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15, 17, 19, 23, 27, 31, + 35, 43, 51, 59, 67, 83, 99, 115, 131, 163, 195, 227, 258, 0, 0 +]; + +var lext = [ /* Length codes 257..285 extra */ + 16, 16, 16, 16, 16, 16, 16, 16, 17, 17, 17, 17, 18, 18, 18, 18, + 19, 19, 19, 19, 20, 20, 20, 20, 21, 21, 21, 21, 16, 72, 78 +]; + +var dbase = [ /* Distance codes 0..29 base */ + 1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193, + 257, 385, 513, 769, 1025, 1537, 2049, 3073, 4097, 6145, + 8193, 12289, 16385, 24577, 0, 0 +]; + +var dext = [ /* Distance codes 0..29 extra */ + 16, 16, 16, 16, 17, 17, 18, 18, 19, 19, 20, 20, 21, 21, 22, 22, + 23, 23, 24, 24, 25, 25, 26, 26, 27, 27, + 28, 28, 29, 29, 64, 64 +]; + +module.exports = function inflate_table(type, lens, lens_index, codes, table, table_index, work, opts) +{ + var bits = opts.bits; + //here = opts.here; /* table entry for duplication */ + + var len = 0; /* a code's length in bits */ + var sym = 0; /* index of code symbols */ + var min = 0, max = 0; /* minimum and maximum code lengths */ + var root = 0; /* number of index bits for root table */ + var curr = 0; /* number of index bits for current table */ + var drop = 0; /* code bits to drop for sub-table */ + var left = 0; /* number of prefix codes available */ + var used = 0; /* code entries in table used */ + var huff = 0; /* Huffman code */ + var incr; /* for incrementing code, index */ + var fill; /* index for replicating entries */ + var low; /* low bits for current root entry */ + var mask; /* mask for low root bits */ + var next; /* next available space in table */ + var base = null; /* base value table to use */ + var base_index = 0; +// var shoextra; /* extra bits table to use */ + var end; /* use base and extra for symbol > end */ + var count = new utils.Buf16(MAXBITS + 1); //[MAXBITS+1]; /* number of codes of each length */ + var offs = new utils.Buf16(MAXBITS + 1); //[MAXBITS+1]; /* offsets in table for each length */ + var extra = null; + var extra_index = 0; + + var here_bits, here_op, here_val; + + /* + Process a set of code lengths to create a canonical Huffman code. The + code lengths are lens[0..codes-1]. Each length corresponds to the + symbols 0..codes-1. The Huffman code is generated by first sorting the + symbols by length from short to long, and retaining the symbol order + for codes with equal lengths. Then the code starts with all zero bits + for the first code of the shortest length, and the codes are integer + increments for the same length, and zeros are appended as the length + increases. For the deflate format, these bits are stored backwards + from their more natural integer increment ordering, and so when the + decoding tables are built in the large loop below, the integer codes + are incremented backwards. + + This routine assumes, but does not check, that all of the entries in + lens[] are in the range 0..MAXBITS. The caller must assure this. + 1..MAXBITS is interpreted as that code length. zero means that that + symbol does not occur in this code. + + The codes are sorted by computing a count of codes for each length, + creating from that a table of starting indices for each length in the + sorted table, and then entering the symbols in order in the sorted + table. The sorted table is work[], with that space being provided by + the caller. + + The length counts are used for other purposes as well, i.e. finding + the minimum and maximum length codes, determining if there are any + codes at all, checking for a valid set of lengths, and looking ahead + at length counts to determine sub-table sizes when building the + decoding tables. + */ + + /* accumulate lengths for codes (assumes lens[] all in 0..MAXBITS) */ + for (len = 0; len <= MAXBITS; len++) { + count[len] = 0; + } + for (sym = 0; sym < codes; sym++) { + count[lens[lens_index + sym]]++; + } + + /* bound code lengths, force root to be within code lengths */ + root = bits; + for (max = MAXBITS; max >= 1; max--) { + if (count[max] !== 0) { break; } + } + if (root > max) { + root = max; + } + if (max === 0) { /* no symbols to code at all */ + //table.op[opts.table_index] = 64; //here.op = (var char)64; /* invalid code marker */ + //table.bits[opts.table_index] = 1; //here.bits = (var char)1; + //table.val[opts.table_index++] = 0; //here.val = (var short)0; + table[table_index++] = (1 << 24) | (64 << 16) | 0; + + + //table.op[opts.table_index] = 64; + //table.bits[opts.table_index] = 1; + //table.val[opts.table_index++] = 0; + table[table_index++] = (1 << 24) | (64 << 16) | 0; + + opts.bits = 1; + return 0; /* no symbols, but wait for decoding to report error */ + } + for (min = 1; min < max; min++) { + if (count[min] !== 0) { break; } + } + if (root < min) { + root = min; + } + + /* check for an over-subscribed or incomplete set of lengths */ + left = 1; + for (len = 1; len <= MAXBITS; len++) { + left <<= 1; + left -= count[len]; + if (left < 0) { + return -1; + } /* over-subscribed */ + } + if (left > 0 && (type === CODES || max !== 1)) { + return -1; /* incomplete set */ + } + + /* generate offsets into symbol table for each length for sorting */ + offs[1] = 0; + for (len = 1; len < MAXBITS; len++) { + offs[len + 1] = offs[len] + count[len]; + } + + /* sort symbols by length, by symbol order within each length */ + for (sym = 0; sym < codes; sym++) { + if (lens[lens_index + sym] !== 0) { + work[offs[lens[lens_index + sym]]++] = sym; + } + } + + /* + Create and fill in decoding tables. In this loop, the table being + filled is at next and has curr index bits. The code being used is huff + with length len. That code is converted to an index by dropping drop + bits off of the bottom. For codes where len is less than drop + curr, + those top drop + curr - len bits are incremented through all values to + fill the table with replicated entries. + + root is the number of index bits for the root table. When len exceeds + root, sub-tables are created pointed to by the root entry with an index + of the low root bits of huff. This is saved in low to check for when a + new sub-table should be started. drop is zero when the root table is + being filled, and drop is root when sub-tables are being filled. + + When a new sub-table is needed, it is necessary to look ahead in the + code lengths to determine what size sub-table is needed. The length + counts are used for this, and so count[] is decremented as codes are + entered in the tables. + + used keeps track of how many table entries have been allocated from the + provided *table space. It is checked for LENS and DIST tables against + the constants ENOUGH_LENS and ENOUGH_DISTS to guard against changes in + the initial root table size constants. See the comments in inftrees.h + for more information. + + sym increments through all symbols, and the loop terminates when + all codes of length max, i.e. all codes, have been processed. This + routine permits incomplete codes, so another loop after this one fills + in the rest of the decoding tables with invalid code markers. + */ + + /* set up for code type */ + // poor man optimization - use if-else instead of switch, + // to avoid deopts in old v8 + if (type === CODES) { + base = extra = work; /* dummy value--not used */ + end = 19; + + } else if (type === LENS) { + base = lbase; + base_index -= 257; + extra = lext; + extra_index -= 257; + end = 256; + + } else { /* DISTS */ + base = dbase; + extra = dext; + end = -1; + } + + /* initialize opts for loop */ + huff = 0; /* starting code */ + sym = 0; /* starting code symbol */ + len = min; /* starting code length */ + next = table_index; /* current table to fill in */ + curr = root; /* current table index bits */ + drop = 0; /* current bits to drop from code for index */ + low = -1; /* trigger new sub-table when len > root */ + used = 1 << root; /* use root table entries */ + mask = used - 1; /* mask for comparing low */ + + /* check available table space */ + if ((type === LENS && used > ENOUGH_LENS) || + (type === DISTS && used > ENOUGH_DISTS)) { + return 1; + } + + var i = 0; + /* process all codes and make table entries */ + for (;;) { + i++; + /* create table entry */ + here_bits = len - drop; + if (work[sym] < end) { + here_op = 0; + here_val = work[sym]; + } + else if (work[sym] > end) { + here_op = extra[extra_index + work[sym]]; + here_val = base[base_index + work[sym]]; + } + else { + here_op = 32 + 64; /* end of block */ + here_val = 0; + } + + /* replicate for those indices with low len bits equal to huff */ + incr = 1 << (len - drop); + fill = 1 << curr; + min = fill; /* save offset to next table */ + do { + fill -= incr; + table[next + (huff >> drop) + fill] = (here_bits << 24) | (here_op << 16) | here_val |0; + } while (fill !== 0); + + /* backwards increment the len-bit code huff */ + incr = 1 << (len - 1); + while (huff & incr) { + incr >>= 1; + } + if (incr !== 0) { + huff &= incr - 1; + huff += incr; + } else { + huff = 0; + } + + /* go to next symbol, update count, len */ + sym++; + if (--count[len] === 0) { + if (len === max) { break; } + len = lens[lens_index + work[sym]]; + } + + /* create new sub-table if needed */ + if (len > root && (huff & mask) !== low) { + /* if first time, transition to sub-tables */ + if (drop === 0) { + drop = root; + } + + /* increment past last table */ + next += min; /* here min is 1 << curr */ + + /* determine length of next table */ + curr = len - drop; + left = 1 << curr; + while (curr + drop < max) { + left -= count[curr + drop]; + if (left <= 0) { break; } + curr++; + left <<= 1; + } + + /* check for enough space */ + used += 1 << curr; + if ((type === LENS && used > ENOUGH_LENS) || + (type === DISTS && used > ENOUGH_DISTS)) { + return 1; + } + + /* point entry in root table to sub-table */ + low = huff & mask; + /*table.op[low] = curr; + table.bits[low] = root; + table.val[low] = next - opts.table_index;*/ + table[low] = (root << 24) | (curr << 16) | (next - table_index) |0; + } + } + + /* fill in remaining table entry if code is incomplete (guaranteed to have + at most one remaining entry, since if the code is incomplete, the + maximum code length that was allowed to get this far is one bit) */ + if (huff !== 0) { + //table.op[next + huff] = 64; /* invalid code marker */ + //table.bits[next + huff] = len - drop; + //table.val[next + huff] = 0; + table[next + huff] = ((len - drop) << 24) | (64 << 16) |0; + } + + /* set return parameters */ + //opts.table_index += used; + opts.bits = root; + return 0; +}; + +},{"../utils/common":159}],169:[function(_dereq_,module,exports){ +'use strict'; + +module.exports = { + 2: 'need dictionary', /* Z_NEED_DICT 2 */ + 1: 'stream end', /* Z_STREAM_END 1 */ + 0: '', /* Z_OK 0 */ + '-1': 'file error', /* Z_ERRNO (-1) */ + '-2': 'stream error', /* Z_STREAM_ERROR (-2) */ + '-3': 'data error', /* Z_DATA_ERROR (-3) */ + '-4': 'insufficient memory', /* Z_MEM_ERROR (-4) */ + '-5': 'buffer error', /* Z_BUF_ERROR (-5) */ + '-6': 'incompatible version' /* Z_VERSION_ERROR (-6) */ +}; + +},{}],170:[function(_dereq_,module,exports){ +'use strict'; + + +var utils = _dereq_('../utils/common'); + +/* Public constants ==========================================================*/ +/* ===========================================================================*/ + + +//var Z_FILTERED = 1; +//var Z_HUFFMAN_ONLY = 2; +//var Z_RLE = 3; +var Z_FIXED = 4; +//var Z_DEFAULT_STRATEGY = 0; + +/* Possible values of the data_type field (though see inflate()) */ +var Z_BINARY = 0; +var Z_TEXT = 1; +//var Z_ASCII = 1; // = Z_TEXT +var Z_UNKNOWN = 2; + +/*============================================================================*/ + + +function zero(buf) { var len = buf.length; while (--len >= 0) { buf[len] = 0; } } + +// From zutil.h + +var STORED_BLOCK = 0; +var STATIC_TREES = 1; +var DYN_TREES = 2; +/* The three kinds of block type */ + +var MIN_MATCH = 3; +var MAX_MATCH = 258; +/* The minimum and maximum match lengths */ + +// From deflate.h +/* =========================================================================== + * Internal compression state. + */ + +var LENGTH_CODES = 29; +/* number of length codes, not counting the special END_BLOCK code */ + +var LITERALS = 256; +/* number of literal bytes 0..255 */ + +var L_CODES = LITERALS + 1 + LENGTH_CODES; +/* number of Literal or Length codes, including the END_BLOCK code */ + +var D_CODES = 30; +/* number of distance codes */ + +var BL_CODES = 19; +/* number of codes used to transfer the bit lengths */ + +var HEAP_SIZE = 2 * L_CODES + 1; +/* maximum heap size */ + +var MAX_BITS = 15; +/* All codes must not exceed MAX_BITS bits */ + +var Buf_size = 16; +/* size of bit buffer in bi_buf */ + + +/* =========================================================================== + * Constants + */ + +var MAX_BL_BITS = 7; +/* Bit length codes must not exceed MAX_BL_BITS bits */ + +var END_BLOCK = 256; +/* end of block literal code */ + +var REP_3_6 = 16; +/* repeat previous bit length 3-6 times (2 bits of repeat count) */ + +var REPZ_3_10 = 17; +/* repeat a zero length 3-10 times (3 bits of repeat count) */ + +var REPZ_11_138 = 18; +/* repeat a zero length 11-138 times (7 bits of repeat count) */ + +/* eslint-disable comma-spacing,array-bracket-spacing */ +var extra_lbits = /* extra bits for each length code */ + [0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0]; + +var extra_dbits = /* extra bits for each distance code */ + [0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13]; + +var extra_blbits = /* extra bits for each bit length code */ + [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,3,7]; + +var bl_order = + [16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15]; +/* eslint-enable comma-spacing,array-bracket-spacing */ + +/* The lengths of the bit length codes are sent in order of decreasing + * probability, to avoid transmitting the lengths for unused bit length codes. + */ + +/* =========================================================================== + * Local data. These are initialized only once. + */ + +// We pre-fill arrays with 0 to avoid uninitialized gaps + +var DIST_CODE_LEN = 512; /* see definition of array dist_code below */ + +// !!!! Use flat array insdead of structure, Freq = i*2, Len = i*2+1 +var static_ltree = new Array((L_CODES + 2) * 2); +zero(static_ltree); +/* The static literal tree. Since the bit lengths are imposed, there is no + * need for the L_CODES extra codes used during heap construction. However + * The codes 286 and 287 are needed to build a canonical tree (see _tr_init + * below). + */ + +var static_dtree = new Array(D_CODES * 2); +zero(static_dtree); +/* The static distance tree. (Actually a trivial tree since all codes use + * 5 bits.) + */ + +var _dist_code = new Array(DIST_CODE_LEN); +zero(_dist_code); +/* Distance codes. The first 256 values correspond to the distances + * 3 .. 258, the last 256 values correspond to the top 8 bits of + * the 15 bit distances. + */ + +var _length_code = new Array(MAX_MATCH - MIN_MATCH + 1); +zero(_length_code); +/* length code for each normalized match length (0 == MIN_MATCH) */ + +var base_length = new Array(LENGTH_CODES); +zero(base_length); +/* First normalized length for each code (0 = MIN_MATCH) */ + +var base_dist = new Array(D_CODES); +zero(base_dist); +/* First normalized distance for each code (0 = distance of 1) */ + + +function StaticTreeDesc(static_tree, extra_bits, extra_base, elems, max_length) { - //--- RESTORE() --- - strm.next_out = put; - strm.avail_out = left; - strm.next_in = next; - strm.avail_in = have; - state.hold = hold; - state.bits = bits; - //--- + this.static_tree = static_tree; /* static tree or NULL */ + this.extra_bits = extra_bits; /* extra bits for each code or NULL */ + this.extra_base = extra_base; /* base index for extra_bits */ + this.elems = elems; /* max number of elements in the tree */ + this.max_length = max_length; /* max bit length for the codes */ - if (state.wsize || (_out !== strm.avail_out && state.mode < BAD && - (state.mode < CHECK || flush !== Z_FINISH))) { - if (updatewindow(strm, strm.output, strm.next_out, _out - strm.avail_out)) { - state.mode = MEM; - return Z_MEM_ERROR; - } - } - _in -= strm.avail_in; - _out -= strm.avail_out; - strm.total_in += _in; - strm.total_out += _out; - state.total += _out; - if (state.wrap && _out) { - strm.adler = state.check = /*UPDATE(state.check, strm.next_out - _out, _out);*/ - (state.flags ? crc32(state.check, output, _out, strm.next_out - _out) : adler32(state.check, output, _out, strm.next_out - _out)); - } - strm.data_type = state.bits + (state.last ? 64 : 0) + - (state.mode === TYPE ? 128 : 0) + - (state.mode === LEN_ || state.mode === COPY_ ? 256 : 0); - if (((_in === 0 && _out === 0) || flush === Z_FINISH) && ret === Z_OK) { - ret = Z_BUF_ERROR; - } - return ret; + // show if `static_tree` has data or dummy - needed for monomorphic objects + this.has_stree = static_tree && static_tree.length; } -function inflateEnd(strm) { - if (!strm || !strm.state /*|| strm->zfree == (free_func)0*/) { - return Z_STREAM_ERROR; - } +var static_l_desc; +var static_d_desc; +var static_bl_desc; - var state = strm.state; - if (state.window) { - state.window = null; - } - strm.state = null; - return Z_OK; + +function TreeDesc(dyn_tree, stat_desc) { + this.dyn_tree = dyn_tree; /* the dynamic tree */ + this.max_code = 0; /* largest code with non zero frequency */ + this.stat_desc = stat_desc; /* the corresponding static tree */ } -function inflateGetHeader(strm, head) { - var state; - /* check state */ - if (!strm || !strm.state) { return Z_STREAM_ERROR; } - state = strm.state; - if ((state.wrap & 2) === 0) { return Z_STREAM_ERROR; } - /* save header structure */ - state.head = head; - head.done = false; - return Z_OK; +function d_code(dist) { + return dist < 256 ? _dist_code[dist] : _dist_code[256 + (dist >>> 7)]; } -function inflateSetDictionary(strm, dictionary) { - var dictLength = dictionary.length; - var state; - var dictid; - var ret; +/* =========================================================================== + * Output a short LSB first on the stream. + * IN assertion: there is enough room in pendingBuf. + */ +function put_short(s, w) { +// put_byte(s, (uch)((w) & 0xff)); +// put_byte(s, (uch)((ush)(w) >> 8)); + s.pending_buf[s.pending++] = (w) & 0xff; + s.pending_buf[s.pending++] = (w >>> 8) & 0xff; +} - /* check state */ - if (!strm /* == Z_NULL */ || !strm.state /* == Z_NULL */) { return Z_STREAM_ERROR; } - state = strm.state; - if (state.wrap !== 0 && state.mode !== DICT) { - return Z_STREAM_ERROR; +/* =========================================================================== + * Send a value on a given number of bits. + * IN assertion: length <= 16 and value fits in length bits. + */ +function send_bits(s, value, length) { + if (s.bi_valid > (Buf_size - length)) { + s.bi_buf |= (value << s.bi_valid) & 0xffff; + put_short(s, s.bi_buf); + s.bi_buf = value >> (Buf_size - s.bi_valid); + s.bi_valid += length - Buf_size; + } else { + s.bi_buf |= (value << s.bi_valid) & 0xffff; + s.bi_valid += length; } +} - /* check for correct dictionary identifier */ - if (state.mode === DICT) { - dictid = 1; /* adler32(0, null, 0)*/ - /* dictid = adler32(dictid, dictionary, dictLength); */ - dictid = adler32(dictid, dictionary, dictLength, 0); - if (dictid !== state.check) { - return Z_DATA_ERROR; - } - } - /* copy dictionary to window using updatewindow(), which will amend the - existing dictionary if appropriate */ - ret = updatewindow(strm, dictionary, dictLength, dictLength); - if (ret) { - state.mode = MEM; - return Z_MEM_ERROR; - } - state.havedict = 1; - // Tracev((stderr, "inflate: dictionary set\n")); - return Z_OK; + +function send_code(s, c, tree) { + send_bits(s, tree[c * 2]/*.Code*/, tree[c * 2 + 1]/*.Len*/); } -exports.inflateReset = inflateReset; -exports.inflateReset2 = inflateReset2; -exports.inflateResetKeep = inflateResetKeep; -exports.inflateInit = inflateInit; -exports.inflateInit2 = inflateInit2; -exports.inflate = inflate; -exports.inflateEnd = inflateEnd; -exports.inflateGetHeader = inflateGetHeader; -exports.inflateSetDictionary = inflateSetDictionary; -exports.inflateInfo = 'pako inflate (from Nodeca project)'; -/* Not implemented -exports.inflateCopy = inflateCopy; -exports.inflateGetDictionary = inflateGetDictionary; -exports.inflateMark = inflateMark; -exports.inflatePrime = inflatePrime; -exports.inflateSync = inflateSync; -exports.inflateSyncPoint = inflateSyncPoint; -exports.inflateUndermine = inflateUndermine; -*/ +/* =========================================================================== + * Reverse the first len bits of a code, using straightforward code (a faster + * method would use a table) + * IN assertion: 1 <= len <= 15 + */ +function bi_reverse(code, len) { + var res = 0; + do { + res |= code & 1; + code >>>= 1; + res <<= 1; + } while (--len > 0); + return res >>> 1; +} -},{"../utils/common":161,"./adler32":163,"./crc32":165,"./inffast":168,"./inftrees":170}],170:[function(_dereq_,module,exports){ -'use strict'; +/* =========================================================================== + * Flush the bit buffer, keeping at most 7 bits in it. + */ +function bi_flush(s) { + if (s.bi_valid === 16) { + put_short(s, s.bi_buf); + s.bi_buf = 0; + s.bi_valid = 0; -var utils = _dereq_('../utils/common'); + } else if (s.bi_valid >= 8) { + s.pending_buf[s.pending++] = s.bi_buf & 0xff; + s.bi_buf >>= 8; + s.bi_valid -= 8; + } +} -var MAXBITS = 15; -var ENOUGH_LENS = 852; -var ENOUGH_DISTS = 592; -//var ENOUGH = (ENOUGH_LENS+ENOUGH_DISTS); -var CODES = 0; -var LENS = 1; -var DISTS = 2; +/* =========================================================================== + * Compute the optimal bit lengths for a tree and update the total bit length + * for the current block. + * IN assertion: the fields freq and dad are set, heap[heap_max] and + * above are the tree nodes sorted by increasing frequency. + * OUT assertions: the field len is set to the optimal bit length, the + * array bl_count contains the frequencies for each bit length. + * The length opt_len is updated; static_len is also updated if stree is + * not null. + */ +function gen_bitlen(s, desc) +// deflate_state *s; +// tree_desc *desc; /* the tree descriptor */ +{ + var tree = desc.dyn_tree; + var max_code = desc.max_code; + var stree = desc.stat_desc.static_tree; + var has_stree = desc.stat_desc.has_stree; + var extra = desc.stat_desc.extra_bits; + var base = desc.stat_desc.extra_base; + var max_length = desc.stat_desc.max_length; + var h; /* heap index */ + var n, m; /* iterate over the tree elements */ + var bits; /* bit length */ + var xbits; /* extra bits */ + var f; /* frequency */ + var overflow = 0; /* number of elements with bit length too large */ -var lbase = [ /* Length codes 257..285 base */ - 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15, 17, 19, 23, 27, 31, - 35, 43, 51, 59, 67, 83, 99, 115, 131, 163, 195, 227, 258, 0, 0 -]; + for (bits = 0; bits <= MAX_BITS; bits++) { + s.bl_count[bits] = 0; + } -var lext = [ /* Length codes 257..285 extra */ - 16, 16, 16, 16, 16, 16, 16, 16, 17, 17, 17, 17, 18, 18, 18, 18, - 19, 19, 19, 19, 20, 20, 20, 20, 21, 21, 21, 21, 16, 72, 78 -]; + /* In a first pass, compute the optimal bit lengths (which may + * overflow in the case of the bit length tree). + */ + tree[s.heap[s.heap_max] * 2 + 1]/*.Len*/ = 0; /* root of the heap */ -var dbase = [ /* Distance codes 0..29 base */ - 1, 2, 3, 4, 5, 7, 9, 13, 17, 25, 33, 49, 65, 97, 129, 193, - 257, 385, 513, 769, 1025, 1537, 2049, 3073, 4097, 6145, - 8193, 12289, 16385, 24577, 0, 0 -]; + for (h = s.heap_max + 1; h < HEAP_SIZE; h++) { + n = s.heap[h]; + bits = tree[tree[n * 2 + 1]/*.Dad*/ * 2 + 1]/*.Len*/ + 1; + if (bits > max_length) { + bits = max_length; + overflow++; + } + tree[n * 2 + 1]/*.Len*/ = bits; + /* We overwrite tree[n].Dad which is no longer needed */ -var dext = [ /* Distance codes 0..29 extra */ - 16, 16, 16, 16, 17, 17, 18, 18, 19, 19, 20, 20, 21, 21, 22, 22, - 23, 23, 24, 24, 25, 25, 26, 26, 27, 27, - 28, 28, 29, 29, 64, 64 -]; + if (n > max_code) { continue; } /* not a leaf node */ -module.exports = function inflate_table(type, lens, lens_index, codes, table, table_index, work, opts) -{ - var bits = opts.bits; - //here = opts.here; /* table entry for duplication */ + s.bl_count[bits]++; + xbits = 0; + if (n >= base) { + xbits = extra[n - base]; + } + f = tree[n * 2]/*.Freq*/; + s.opt_len += f * (bits + xbits); + if (has_stree) { + s.static_len += f * (stree[n * 2 + 1]/*.Len*/ + xbits); + } + } + if (overflow === 0) { return; } - var len = 0; /* a code's length in bits */ - var sym = 0; /* index of code symbols */ - var min = 0, max = 0; /* minimum and maximum code lengths */ - var root = 0; /* number of index bits for root table */ - var curr = 0; /* number of index bits for current table */ - var drop = 0; /* code bits to drop for sub-table */ - var left = 0; /* number of prefix codes available */ - var used = 0; /* code entries in table used */ - var huff = 0; /* Huffman code */ - var incr; /* for incrementing code, index */ - var fill; /* index for replicating entries */ - var low; /* low bits for current root entry */ - var mask; /* mask for low root bits */ - var next; /* next available space in table */ - var base = null; /* base value table to use */ - var base_index = 0; -// var shoextra; /* extra bits table to use */ - var end; /* use base and extra for symbol > end */ - var count = new utils.Buf16(MAXBITS + 1); //[MAXBITS+1]; /* number of codes of each length */ - var offs = new utils.Buf16(MAXBITS + 1); //[MAXBITS+1]; /* offsets in table for each length */ - var extra = null; - var extra_index = 0; + // Trace((stderr,"\nbit length overflow\n")); + /* This happens for example on obj2 and pic of the Calgary corpus */ - var here_bits, here_op, here_val; + /* Find the first bit length which could increase: */ + do { + bits = max_length - 1; + while (s.bl_count[bits] === 0) { bits--; } + s.bl_count[bits]--; /* move one leaf down the tree */ + s.bl_count[bits + 1] += 2; /* move one overflow item as its brother */ + s.bl_count[max_length]--; + /* The brother of the overflow item also moves one step up, + * but this does not affect bl_count[max_length] + */ + overflow -= 2; + } while (overflow > 0); - /* - Process a set of code lengths to create a canonical Huffman code. The - code lengths are lens[0..codes-1]. Each length corresponds to the - symbols 0..codes-1. The Huffman code is generated by first sorting the - symbols by length from short to long, and retaining the symbol order - for codes with equal lengths. Then the code starts with all zero bits - for the first code of the shortest length, and the codes are integer - increments for the same length, and zeros are appended as the length - increases. For the deflate format, these bits are stored backwards - from their more natural integer increment ordering, and so when the - decoding tables are built in the large loop below, the integer codes - are incremented backwards. + /* Now recompute all bit lengths, scanning in increasing frequency. + * h is still equal to HEAP_SIZE. (It is simpler to reconstruct all + * lengths instead of fixing only the wrong ones. This idea is taken + * from 'ar' written by Haruhiko Okumura.) + */ + for (bits = max_length; bits !== 0; bits--) { + n = s.bl_count[bits]; + while (n !== 0) { + m = s.heap[--h]; + if (m > max_code) { continue; } + if (tree[m * 2 + 1]/*.Len*/ !== bits) { + // Trace((stderr,"code %d bits %d->%d\n", m, tree[m].Len, bits)); + s.opt_len += (bits - tree[m * 2 + 1]/*.Len*/) * tree[m * 2]/*.Freq*/; + tree[m * 2 + 1]/*.Len*/ = bits; + } + n--; + } + } +} - This routine assumes, but does not check, that all of the entries in - lens[] are in the range 0..MAXBITS. The caller must assure this. - 1..MAXBITS is interpreted as that code length. zero means that that - symbol does not occur in this code. - The codes are sorted by computing a count of codes for each length, - creating from that a table of starting indices for each length in the - sorted table, and then entering the symbols in order in the sorted - table. The sorted table is work[], with that space being provided by - the caller. +/* =========================================================================== + * Generate the codes for a given tree and bit counts (which need not be + * optimal). + * IN assertion: the array bl_count contains the bit length statistics for + * the given tree and the field len is set for all tree elements. + * OUT assertion: the field code is set for all tree elements of non + * zero code length. + */ +function gen_codes(tree, max_code, bl_count) +// ct_data *tree; /* the tree to decorate */ +// int max_code; /* largest code with non zero frequency */ +// ushf *bl_count; /* number of codes at each bit length */ +{ + var next_code = new Array(MAX_BITS + 1); /* next code value for each bit length */ + var code = 0; /* running code value */ + var bits; /* bit index */ + var n; /* code index */ - The length counts are used for other purposes as well, i.e. finding - the minimum and maximum length codes, determining if there are any - codes at all, checking for a valid set of lengths, and looking ahead - at length counts to determine sub-table sizes when building the - decoding tables. + /* The distribution counts are first used to generate the code values + * without bit reversal. */ - - /* accumulate lengths for codes (assumes lens[] all in 0..MAXBITS) */ - for (len = 0; len <= MAXBITS; len++) { - count[len] = 0; - } - for (sym = 0; sym < codes; sym++) { - count[lens[lens_index + sym]]++; + for (bits = 1; bits <= MAX_BITS; bits++) { + next_code[bits] = code = (code + bl_count[bits - 1]) << 1; } + /* Check that the bit counts in bl_count are consistent. The last code + * must be all ones. + */ + //Assert (code + bl_count[MAX_BITS]-1 == (1<= 1; max--) { - if (count[max] !== 0) { break; } - } - if (root > max) { - root = max; + for (n = 0; n <= max_code; n++) { + var len = tree[n * 2 + 1]/*.Len*/; + if (len === 0) { continue; } + /* Now reverse the bits */ + tree[n * 2]/*.Code*/ = bi_reverse(next_code[len]++, len); + + //Tracecv(tree != static_ltree, (stderr,"\nn %3d %c l %2d c %4x (%x) ", + // n, (isgraph(n) ? n : ' '), len, tree[n].Code, next_code[len]-1)); } - if (max === 0) { /* no symbols to code at all */ - //table.op[opts.table_index] = 64; //here.op = (var char)64; /* invalid code marker */ - //table.bits[opts.table_index] = 1; //here.bits = (var char)1; - //table.val[opts.table_index++] = 0; //here.val = (var short)0; - table[table_index++] = (1 << 24) | (64 << 16) | 0; +} - //table.op[opts.table_index] = 64; - //table.bits[opts.table_index] = 1; - //table.val[opts.table_index++] = 0; - table[table_index++] = (1 << 24) | (64 << 16) | 0; +/* =========================================================================== + * Initialize the various 'constant' tables. + */ +function tr_static_init() { + var n; /* iterates over tree elements */ + var bits; /* bit counter */ + var length; /* length value */ + var code; /* code value */ + var dist; /* distance index */ + var bl_count = new Array(MAX_BITS + 1); + /* number of codes at each bit length for an optimal tree */ - opts.bits = 1; - return 0; /* no symbols, but wait for decoding to report error */ - } - for (min = 1; min < max; min++) { - if (count[min] !== 0) { break; } - } - if (root < min) { - root = min; + // do check in _tr_init() + //if (static_init_done) return; + + /* For some embedded targets, global variables are not initialized: */ +/*#ifdef NO_INIT_GLOBAL_POINTERS + static_l_desc.static_tree = static_ltree; + static_l_desc.extra_bits = extra_lbits; + static_d_desc.static_tree = static_dtree; + static_d_desc.extra_bits = extra_dbits; + static_bl_desc.extra_bits = extra_blbits; +#endif*/ + + /* Initialize the mapping length (0..255) -> length code (0..28) */ + length = 0; + for (code = 0; code < LENGTH_CODES - 1; code++) { + base_length[code] = length; + for (n = 0; n < (1 << extra_lbits[code]); n++) { + _length_code[length++] = code; + } } + //Assert (length == 256, "tr_static_init: length != 256"); + /* Note that the length 255 (match length 258) can be represented + * in two different ways: code 284 + 5 bits or code 285, so we + * overwrite length_code[255] to use the best encoding: + */ + _length_code[length - 1] = code; - /* check for an over-subscribed or incomplete set of lengths */ - left = 1; - for (len = 1; len <= MAXBITS; len++) { - left <<= 1; - left -= count[len]; - if (left < 0) { - return -1; - } /* over-subscribed */ + /* Initialize the mapping dist (0..32K) -> dist code (0..29) */ + dist = 0; + for (code = 0; code < 16; code++) { + base_dist[code] = dist; + for (n = 0; n < (1 << extra_dbits[code]); n++) { + _dist_code[dist++] = code; + } } - if (left > 0 && (type === CODES || max !== 1)) { - return -1; /* incomplete set */ + //Assert (dist == 256, "tr_static_init: dist != 256"); + dist >>= 7; /* from now on, all distances are divided by 128 */ + for (; code < D_CODES; code++) { + base_dist[code] = dist << 7; + for (n = 0; n < (1 << (extra_dbits[code] - 7)); n++) { + _dist_code[256 + dist++] = code; + } } + //Assert (dist == 256, "tr_static_init: 256+dist != 512"); - /* generate offsets into symbol table for each length for sorting */ - offs[1] = 0; - for (len = 1; len < MAXBITS; len++) { - offs[len + 1] = offs[len] + count[len]; + /* Construct the codes of the static literal tree */ + for (bits = 0; bits <= MAX_BITS; bits++) { + bl_count[bits] = 0; } - /* sort symbols by length, by symbol order within each length */ - for (sym = 0; sym < codes; sym++) { - if (lens[lens_index + sym] !== 0) { - work[offs[lens[lens_index + sym]]++] = sym; - } + n = 0; + while (n <= 143) { + static_ltree[n * 2 + 1]/*.Len*/ = 8; + n++; + bl_count[8]++; + } + while (n <= 255) { + static_ltree[n * 2 + 1]/*.Len*/ = 9; + n++; + bl_count[9]++; + } + while (n <= 279) { + static_ltree[n * 2 + 1]/*.Len*/ = 7; + n++; + bl_count[7]++; + } + while (n <= 287) { + static_ltree[n * 2 + 1]/*.Len*/ = 8; + n++; + bl_count[8]++; + } + /* Codes 286 and 287 do not exist, but we must include them in the + * tree construction to get a canonical Huffman tree (longest code + * all ones) + */ + gen_codes(static_ltree, L_CODES + 1, bl_count); + + /* The static distance tree is trivial: */ + for (n = 0; n < D_CODES; n++) { + static_dtree[n * 2 + 1]/*.Len*/ = 5; + static_dtree[n * 2]/*.Code*/ = bi_reverse(n, 5); } - /* - Create and fill in decoding tables. In this loop, the table being - filled is at next and has curr index bits. The code being used is huff - with length len. That code is converted to an index by dropping drop - bits off of the bottom. For codes where len is less than drop + curr, - those top drop + curr - len bits are incremented through all values to - fill the table with replicated entries. + // Now data ready and we can init static trees + static_l_desc = new StaticTreeDesc(static_ltree, extra_lbits, LITERALS + 1, L_CODES, MAX_BITS); + static_d_desc = new StaticTreeDesc(static_dtree, extra_dbits, 0, D_CODES, MAX_BITS); + static_bl_desc = new StaticTreeDesc(new Array(0), extra_blbits, 0, BL_CODES, MAX_BL_BITS); - root is the number of index bits for the root table. When len exceeds - root, sub-tables are created pointed to by the root entry with an index - of the low root bits of huff. This is saved in low to check for when a - new sub-table should be started. drop is zero when the root table is - being filled, and drop is root when sub-tables are being filled. + //static_init_done = true; +} - When a new sub-table is needed, it is necessary to look ahead in the - code lengths to determine what size sub-table is needed. The length - counts are used for this, and so count[] is decremented as codes are - entered in the tables. - used keeps track of how many table entries have been allocated from the - provided *table space. It is checked for LENS and DIST tables against - the constants ENOUGH_LENS and ENOUGH_DISTS to guard against changes in - the initial root table size constants. See the comments in inftrees.h - for more information. +/* =========================================================================== + * Initialize a new block. + */ +function init_block(s) { + var n; /* iterates over tree elements */ - sym increments through all symbols, and the loop terminates when - all codes of length max, i.e. all codes, have been processed. This - routine permits incomplete codes, so another loop after this one fills - in the rest of the decoding tables with invalid code markers. - */ + /* Initialize the trees. */ + for (n = 0; n < L_CODES; n++) { s.dyn_ltree[n * 2]/*.Freq*/ = 0; } + for (n = 0; n < D_CODES; n++) { s.dyn_dtree[n * 2]/*.Freq*/ = 0; } + for (n = 0; n < BL_CODES; n++) { s.bl_tree[n * 2]/*.Freq*/ = 0; } - /* set up for code type */ - // poor man optimization - use if-else instead of switch, - // to avoid deopts in old v8 - if (type === CODES) { - base = extra = work; /* dummy value--not used */ - end = 19; + s.dyn_ltree[END_BLOCK * 2]/*.Freq*/ = 1; + s.opt_len = s.static_len = 0; + s.last_lit = s.matches = 0; +} - } else if (type === LENS) { - base = lbase; - base_index -= 257; - extra = lext; - extra_index -= 257; - end = 256; - } else { /* DISTS */ - base = dbase; - extra = dext; - end = -1; +/* =========================================================================== + * Flush the bit buffer and align the output on a byte boundary + */ +function bi_windup(s) +{ + if (s.bi_valid > 8) { + put_short(s, s.bi_buf); + } else if (s.bi_valid > 0) { + //put_byte(s, (Byte)s->bi_buf); + s.pending_buf[s.pending++] = s.bi_buf; } + s.bi_buf = 0; + s.bi_valid = 0; +} - /* initialize opts for loop */ - huff = 0; /* starting code */ - sym = 0; /* starting code symbol */ - len = min; /* starting code length */ - next = table_index; /* current table to fill in */ - curr = root; /* current table index bits */ - drop = 0; /* current bits to drop from code for index */ - low = -1; /* trigger new sub-table when len > root */ - used = 1 << root; /* use root table entries */ - mask = used - 1; /* mask for comparing low */ +/* =========================================================================== + * Copy a stored block, storing first the length and its + * one's complement if requested. + */ +function copy_block(s, buf, len, header) +//DeflateState *s; +//charf *buf; /* the input data */ +//unsigned len; /* its length */ +//int header; /* true if block header must be written */ +{ + bi_windup(s); /* align on byte boundary */ - /* check available table space */ - if ((type === LENS && used > ENOUGH_LENS) || - (type === DISTS && used > ENOUGH_DISTS)) { - return 1; + if (header) { + put_short(s, len); + put_short(s, ~len); } +// while (len--) { +// put_byte(s, *buf++); +// } + utils.arraySet(s.pending_buf, s.window, buf, len, s.pending); + s.pending += len; +} - var i = 0; - /* process all codes and make table entries */ - for (;;) { - i++; - /* create table entry */ - here_bits = len - drop; - if (work[sym] < end) { - here_op = 0; - here_val = work[sym]; - } - else if (work[sym] > end) { - here_op = extra[extra_index + work[sym]]; - here_val = base[base_index + work[sym]]; - } - else { - here_op = 32 + 64; /* end of block */ - here_val = 0; - } - - /* replicate for those indices with low len bits equal to huff */ - incr = 1 << (len - drop); - fill = 1 << curr; - min = fill; /* save offset to next table */ - do { - fill -= incr; - table[next + (huff >> drop) + fill] = (here_bits << 24) | (here_op << 16) | here_val |0; - } while (fill !== 0); +/* =========================================================================== + * Compares to subtrees, using the tree depth as tie breaker when + * the subtrees have equal frequency. This minimizes the worst case length. + */ +function smaller(tree, n, m, depth) { + var _n2 = n * 2; + var _m2 = m * 2; + return (tree[_n2]/*.Freq*/ < tree[_m2]/*.Freq*/ || + (tree[_n2]/*.Freq*/ === tree[_m2]/*.Freq*/ && depth[n] <= depth[m])); +} - /* backwards increment the len-bit code huff */ - incr = 1 << (len - 1); - while (huff & incr) { - incr >>= 1; - } - if (incr !== 0) { - huff &= incr - 1; - huff += incr; - } else { - huff = 0; +/* =========================================================================== + * Restore the heap property by moving down the tree starting at node k, + * exchanging a node with the smallest of its two sons if necessary, stopping + * when the heap property is re-established (each father smaller than its + * two sons). + */ +function pqdownheap(s, tree, k) +// deflate_state *s; +// ct_data *tree; /* the tree to restore */ +// int k; /* node to move down */ +{ + var v = s.heap[k]; + var j = k << 1; /* left son of k */ + while (j <= s.heap_len) { + /* Set j to the smallest of the two sons: */ + if (j < s.heap_len && + smaller(tree, s.heap[j + 1], s.heap[j], s.depth)) { + j++; } + /* Exit if v is smaller than both sons */ + if (smaller(tree, v, s.heap[j], s.depth)) { break; } - /* go to next symbol, update count, len */ - sym++; - if (--count[len] === 0) { - if (len === max) { break; } - len = lens[lens_index + work[sym]]; - } + /* Exchange v with the smallest son */ + s.heap[k] = s.heap[j]; + k = j; - /* create new sub-table if needed */ - if (len > root && (huff & mask) !== low) { - /* if first time, transition to sub-tables */ - if (drop === 0) { - drop = root; - } + /* And continue down the tree, setting j to the left son of k */ + j <<= 1; + } + s.heap[k] = v; +} - /* increment past last table */ - next += min; /* here min is 1 << curr */ - /* determine length of next table */ - curr = len - drop; - left = 1 << curr; - while (curr + drop < max) { - left -= count[curr + drop]; - if (left <= 0) { break; } - curr++; - left <<= 1; - } +// inlined manually +// var SMALLEST = 1; - /* check for enough space */ - used += 1 << curr; - if ((type === LENS && used > ENOUGH_LENS) || - (type === DISTS && used > ENOUGH_DISTS)) { - return 1; - } +/* =========================================================================== + * Send the block data compressed using the given Huffman trees + */ +function compress_block(s, ltree, dtree) +// deflate_state *s; +// const ct_data *ltree; /* literal tree */ +// const ct_data *dtree; /* distance tree */ +{ + var dist; /* distance of matched string */ + var lc; /* match length or unmatched char (if dist == 0) */ + var lx = 0; /* running index in l_buf */ + var code; /* the code to send */ + var extra; /* number of extra bits to send */ - /* point entry in root table to sub-table */ - low = huff & mask; - /*table.op[low] = curr; - table.bits[low] = root; - table.val[low] = next - opts.table_index;*/ - table[low] = (root << 24) | (curr << 16) | (next - table_index) |0; - } - } + if (s.last_lit !== 0) { + do { + dist = (s.pending_buf[s.d_buf + lx * 2] << 8) | (s.pending_buf[s.d_buf + lx * 2 + 1]); + lc = s.pending_buf[s.l_buf + lx]; + lx++; - /* fill in remaining table entry if code is incomplete (guaranteed to have - at most one remaining entry, since if the code is incomplete, the - maximum code length that was allowed to get this far is one bit) */ - if (huff !== 0) { - //table.op[next + huff] = 64; /* invalid code marker */ - //table.bits[next + huff] = len - drop; - //table.val[next + huff] = 0; - table[next + huff] = ((len - drop) << 24) | (64 << 16) |0; - } + if (dist === 0) { + send_code(s, lc, ltree); /* send a literal byte */ + //Tracecv(isgraph(lc), (stderr," '%c' ", lc)); + } else { + /* Here, lc is the match length - MIN_MATCH */ + code = _length_code[lc]; + send_code(s, code + LITERALS + 1, ltree); /* send the length code */ + extra = extra_lbits[code]; + if (extra !== 0) { + lc -= base_length[code]; + send_bits(s, lc, extra); /* send the extra length bits */ + } + dist--; /* dist is now the match distance - 1 */ + code = d_code(dist); + //Assert (code < D_CODES, "bad d_code"); - /* set return parameters */ - //opts.table_index += used; - opts.bits = root; - return 0; -}; + send_code(s, code, dtree); /* send the distance code */ + extra = extra_dbits[code]; + if (extra !== 0) { + dist -= base_dist[code]; + send_bits(s, dist, extra); /* send the extra distance bits */ + } + } /* literal or match pair ? */ -},{"../utils/common":161}],171:[function(_dereq_,module,exports){ -'use strict'; + /* Check that the overlay between pending_buf and d_buf+l_buf is ok: */ + //Assert((uInt)(s->pending) < s->lit_bufsize + 2*lx, + // "pendingBuf overflow"); -module.exports = { - 2: 'need dictionary', /* Z_NEED_DICT 2 */ - 1: 'stream end', /* Z_STREAM_END 1 */ - 0: '', /* Z_OK 0 */ - '-1': 'file error', /* Z_ERRNO (-1) */ - '-2': 'stream error', /* Z_STREAM_ERROR (-2) */ - '-3': 'data error', /* Z_DATA_ERROR (-3) */ - '-4': 'insufficient memory', /* Z_MEM_ERROR (-4) */ - '-5': 'buffer error', /* Z_BUF_ERROR (-5) */ - '-6': 'incompatible version' /* Z_VERSION_ERROR (-6) */ -}; + } while (lx < s.last_lit); + } -},{}],172:[function(_dereq_,module,exports){ -'use strict'; + send_code(s, END_BLOCK, ltree); +} -var utils = _dereq_('../utils/common'); +/* =========================================================================== + * Construct one Huffman tree and assigns the code bit strings and lengths. + * Update the total bit length for the current block. + * IN assertion: the field freq is set for all tree elements. + * OUT assertions: the fields len and code are set to the optimal bit length + * and corresponding code. The length opt_len is updated; static_len is + * also updated if stree is not null. The field max_code is set. + */ +function build_tree(s, desc) +// deflate_state *s; +// tree_desc *desc; /* the tree descriptor */ +{ + var tree = desc.dyn_tree; + var stree = desc.stat_desc.static_tree; + var has_stree = desc.stat_desc.has_stree; + var elems = desc.stat_desc.elems; + var n, m; /* iterate over heap elements */ + var max_code = -1; /* largest code with non zero frequency */ + var node; /* new node being created */ -/* Public constants ==========================================================*/ -/* ===========================================================================*/ + /* Construct the initial heap, with least frequent element in + * heap[SMALLEST]. The sons of heap[n] are heap[2*n] and heap[2*n+1]. + * heap[0] is not used. + */ + s.heap_len = 0; + s.heap_max = HEAP_SIZE; + for (n = 0; n < elems; n++) { + if (tree[n * 2]/*.Freq*/ !== 0) { + s.heap[++s.heap_len] = max_code = n; + s.depth[n] = 0; -//var Z_FILTERED = 1; -//var Z_HUFFMAN_ONLY = 2; -//var Z_RLE = 3; -var Z_FIXED = 4; -//var Z_DEFAULT_STRATEGY = 0; + } else { + tree[n * 2 + 1]/*.Len*/ = 0; + } + } -/* Possible values of the data_type field (though see inflate()) */ -var Z_BINARY = 0; -var Z_TEXT = 1; -//var Z_ASCII = 1; // = Z_TEXT -var Z_UNKNOWN = 2; + /* The pkzip format requires that at least one distance code exists, + * and that at least one bit should be sent even if there is only one + * possible code. So to avoid special checks later on we force at least + * two codes of non zero frequency. + */ + while (s.heap_len < 2) { + node = s.heap[++s.heap_len] = (max_code < 2 ? ++max_code : 0); + tree[node * 2]/*.Freq*/ = 1; + s.depth[node] = 0; + s.opt_len--; -/*============================================================================*/ + if (has_stree) { + s.static_len -= stree[node * 2 + 1]/*.Len*/; + } + /* node is 0 or 1 so it does not have extra bits */ + } + desc.max_code = max_code; + /* The elements heap[heap_len/2+1 .. heap_len] are leaves of the tree, + * establish sub-heaps of increasing lengths: + */ + for (n = (s.heap_len >> 1/*int /2*/); n >= 1; n--) { pqdownheap(s, tree, n); } -function zero(buf) { var len = buf.length; while (--len >= 0) { buf[len] = 0; } } + /* Construct the Huffman tree by repeatedly combining the least two + * frequent nodes. + */ + node = elems; /* next internal node of the tree */ + do { + //pqremove(s, tree, n); /* n = node of least frequency */ + /*** pqremove ***/ + n = s.heap[1/*SMALLEST*/]; + s.heap[1/*SMALLEST*/] = s.heap[s.heap_len--]; + pqdownheap(s, tree, 1/*SMALLEST*/); + /***/ -// From zutil.h + m = s.heap[1/*SMALLEST*/]; /* m = node of next least frequency */ -var STORED_BLOCK = 0; -var STATIC_TREES = 1; -var DYN_TREES = 2; -/* The three kinds of block type */ + s.heap[--s.heap_max] = n; /* keep the nodes sorted by frequency */ + s.heap[--s.heap_max] = m; -var MIN_MATCH = 3; -var MAX_MATCH = 258; -/* The minimum and maximum match lengths */ + /* Create a new node father of n and m */ + tree[node * 2]/*.Freq*/ = tree[n * 2]/*.Freq*/ + tree[m * 2]/*.Freq*/; + s.depth[node] = (s.depth[n] >= s.depth[m] ? s.depth[n] : s.depth[m]) + 1; + tree[n * 2 + 1]/*.Dad*/ = tree[m * 2 + 1]/*.Dad*/ = node; -// From deflate.h -/* =========================================================================== - * Internal compression state. - */ + /* and insert the new node in the heap */ + s.heap[1/*SMALLEST*/] = node++; + pqdownheap(s, tree, 1/*SMALLEST*/); -var LENGTH_CODES = 29; -/* number of length codes, not counting the special END_BLOCK code */ + } while (s.heap_len >= 2); -var LITERALS = 256; -/* number of literal bytes 0..255 */ + s.heap[--s.heap_max] = s.heap[1/*SMALLEST*/]; -var L_CODES = LITERALS + 1 + LENGTH_CODES; -/* number of Literal or Length codes, including the END_BLOCK code */ + /* At this point, the fields freq and dad are set. We can now + * generate the bit lengths. + */ + gen_bitlen(s, desc); -var D_CODES = 30; -/* number of distance codes */ + /* The field len is now set, we can generate the bit codes */ + gen_codes(tree, max_code, s.bl_count); +} -var BL_CODES = 19; -/* number of codes used to transfer the bit lengths */ -var HEAP_SIZE = 2 * L_CODES + 1; -/* maximum heap size */ +/* =========================================================================== + * Scan a literal or distance tree to determine the frequencies of the codes + * in the bit length tree. + */ +function scan_tree(s, tree, max_code) +// deflate_state *s; +// ct_data *tree; /* the tree to be scanned */ +// int max_code; /* and its largest code of non zero frequency */ +{ + var n; /* iterates over all tree elements */ + var prevlen = -1; /* last emitted length */ + var curlen; /* length of current code */ -var MAX_BITS = 15; -/* All codes must not exceed MAX_BITS bits */ + var nextlen = tree[0 * 2 + 1]/*.Len*/; /* length of next code */ -var Buf_size = 16; -/* size of bit buffer in bi_buf */ + var count = 0; /* repeat count of the current code */ + var max_count = 7; /* max repeat count */ + var min_count = 4; /* min repeat count */ + + if (nextlen === 0) { + max_count = 138; + min_count = 3; + } + tree[(max_code + 1) * 2 + 1]/*.Len*/ = 0xffff; /* guard */ + for (n = 0; n <= max_code; n++) { + curlen = nextlen; + nextlen = tree[(n + 1) * 2 + 1]/*.Len*/; -/* =========================================================================== - * Constants - */ + if (++count < max_count && curlen === nextlen) { + continue; -var MAX_BL_BITS = 7; -/* Bit length codes must not exceed MAX_BL_BITS bits */ + } else if (count < min_count) { + s.bl_tree[curlen * 2]/*.Freq*/ += count; -var END_BLOCK = 256; -/* end of block literal code */ + } else if (curlen !== 0) { -var REP_3_6 = 16; -/* repeat previous bit length 3-6 times (2 bits of repeat count) */ + if (curlen !== prevlen) { s.bl_tree[curlen * 2]/*.Freq*/++; } + s.bl_tree[REP_3_6 * 2]/*.Freq*/++; -var REPZ_3_10 = 17; -/* repeat a zero length 3-10 times (3 bits of repeat count) */ + } else if (count <= 10) { + s.bl_tree[REPZ_3_10 * 2]/*.Freq*/++; -var REPZ_11_138 = 18; -/* repeat a zero length 11-138 times (7 bits of repeat count) */ + } else { + s.bl_tree[REPZ_11_138 * 2]/*.Freq*/++; + } -/* eslint-disable comma-spacing,array-bracket-spacing */ -var extra_lbits = /* extra bits for each length code */ - [0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0]; + count = 0; + prevlen = curlen; -var extra_dbits = /* extra bits for each distance code */ - [0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13]; + if (nextlen === 0) { + max_count = 138; + min_count = 3; -var extra_blbits = /* extra bits for each bit length code */ - [0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,3,7]; + } else if (curlen === nextlen) { + max_count = 6; + min_count = 3; -var bl_order = - [16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15]; -/* eslint-enable comma-spacing,array-bracket-spacing */ + } else { + max_count = 7; + min_count = 4; + } + } +} -/* The lengths of the bit length codes are sent in order of decreasing - * probability, to avoid transmitting the lengths for unused bit length codes. - */ /* =========================================================================== - * Local data. These are initialized only once. + * Send a literal or distance tree in compressed form, using the codes in + * bl_tree. */ +function send_tree(s, tree, max_code) +// deflate_state *s; +// ct_data *tree; /* the tree to be scanned */ +// int max_code; /* and its largest code of non zero frequency */ +{ + var n; /* iterates over all tree elements */ + var prevlen = -1; /* last emitted length */ + var curlen; /* length of current code */ -// We pre-fill arrays with 0 to avoid uninitialized gaps + var nextlen = tree[0 * 2 + 1]/*.Len*/; /* length of next code */ -var DIST_CODE_LEN = 512; /* see definition of array dist_code below */ + var count = 0; /* repeat count of the current code */ + var max_count = 7; /* max repeat count */ + var min_count = 4; /* min repeat count */ -// !!!! Use flat array insdead of structure, Freq = i*2, Len = i*2+1 -var static_ltree = new Array((L_CODES + 2) * 2); -zero(static_ltree); -/* The static literal tree. Since the bit lengths are imposed, there is no - * need for the L_CODES extra codes used during heap construction. However - * The codes 286 and 287 are needed to build a canonical tree (see _tr_init - * below). - */ + /* tree[max_code+1].Len = -1; */ /* guard already set */ + if (nextlen === 0) { + max_count = 138; + min_count = 3; + } -var static_dtree = new Array(D_CODES * 2); -zero(static_dtree); -/* The static distance tree. (Actually a trivial tree since all codes use - * 5 bits.) - */ + for (n = 0; n <= max_code; n++) { + curlen = nextlen; + nextlen = tree[(n + 1) * 2 + 1]/*.Len*/; -var _dist_code = new Array(DIST_CODE_LEN); -zero(_dist_code); -/* Distance codes. The first 256 values correspond to the distances - * 3 .. 258, the last 256 values correspond to the top 8 bits of - * the 15 bit distances. - */ + if (++count < max_count && curlen === nextlen) { + continue; -var _length_code = new Array(MAX_MATCH - MIN_MATCH + 1); -zero(_length_code); -/* length code for each normalized match length (0 == MIN_MATCH) */ + } else if (count < min_count) { + do { send_code(s, curlen, s.bl_tree); } while (--count !== 0); -var base_length = new Array(LENGTH_CODES); -zero(base_length); -/* First normalized length for each code (0 = MIN_MATCH) */ + } else if (curlen !== 0) { + if (curlen !== prevlen) { + send_code(s, curlen, s.bl_tree); + count--; + } + //Assert(count >= 3 && count <= 6, " 3_6?"); + send_code(s, REP_3_6, s.bl_tree); + send_bits(s, count - 3, 2); -var base_dist = new Array(D_CODES); -zero(base_dist); -/* First normalized distance for each code (0 = distance of 1) */ + } else if (count <= 10) { + send_code(s, REPZ_3_10, s.bl_tree); + send_bits(s, count - 3, 3); + } else { + send_code(s, REPZ_11_138, s.bl_tree); + send_bits(s, count - 11, 7); + } -function StaticTreeDesc(static_tree, extra_bits, extra_base, elems, max_length) { + count = 0; + prevlen = curlen; + if (nextlen === 0) { + max_count = 138; + min_count = 3; - this.static_tree = static_tree; /* static tree or NULL */ - this.extra_bits = extra_bits; /* extra bits for each code or NULL */ - this.extra_base = extra_base; /* base index for extra_bits */ - this.elems = elems; /* max number of elements in the tree */ - this.max_length = max_length; /* max bit length for the codes */ + } else if (curlen === nextlen) { + max_count = 6; + min_count = 3; - // show if `static_tree` has data or dummy - needed for monomorphic objects - this.has_stree = static_tree && static_tree.length; + } else { + max_count = 7; + min_count = 4; + } + } } -var static_l_desc; -var static_d_desc; -var static_bl_desc; +/* =========================================================================== + * Construct the Huffman tree for the bit lengths and return the index in + * bl_order of the last bit length code to send. + */ +function build_bl_tree(s) { + var max_blindex; /* index of last bit length code of non zero freq */ + /* Determine the bit length frequencies for literal and distance trees */ + scan_tree(s, s.dyn_ltree, s.l_desc.max_code); + scan_tree(s, s.dyn_dtree, s.d_desc.max_code); -function TreeDesc(dyn_tree, stat_desc) { - this.dyn_tree = dyn_tree; /* the dynamic tree */ - this.max_code = 0; /* largest code with non zero frequency */ - this.stat_desc = stat_desc; /* the corresponding static tree */ + /* Build the bit length tree: */ + build_tree(s, s.bl_desc); + /* opt_len now includes the length of the tree representations, except + * the lengths of the bit lengths codes and the 5+5+4 bits for the counts. + */ + + /* Determine the number of bit length codes to send. The pkzip format + * requires that at least 4 bit length codes be sent. (appnote.txt says + * 3 but the actual value used is 4.) + */ + for (max_blindex = BL_CODES - 1; max_blindex >= 3; max_blindex--) { + if (s.bl_tree[bl_order[max_blindex] * 2 + 1]/*.Len*/ !== 0) { + break; + } + } + /* Update opt_len to include the bit length tree and counts */ + s.opt_len += 3 * (max_blindex + 1) + 5 + 5 + 4; + //Tracev((stderr, "\ndyn trees: dyn %ld, stat %ld", + // s->opt_len, s->static_len)); + + return max_blindex; } +/* =========================================================================== + * Send the header for a block using dynamic Huffman trees: the counts, the + * lengths of the bit length codes, the literal tree and the distance tree. + * IN assertion: lcodes >= 257, dcodes >= 1, blcodes >= 4. + */ +function send_all_trees(s, lcodes, dcodes, blcodes) +// deflate_state *s; +// int lcodes, dcodes, blcodes; /* number of codes for each tree */ +{ + var rank; /* index in bl_order */ + + //Assert (lcodes >= 257 && dcodes >= 1 && blcodes >= 4, "not enough codes"); + //Assert (lcodes <= L_CODES && dcodes <= D_CODES && blcodes <= BL_CODES, + // "too many codes"); + //Tracev((stderr, "\nbl counts: ")); + send_bits(s, lcodes - 257, 5); /* not +255 as stated in appnote.txt */ + send_bits(s, dcodes - 1, 5); + send_bits(s, blcodes - 4, 4); /* not -3 as stated in appnote.txt */ + for (rank = 0; rank < blcodes; rank++) { + //Tracev((stderr, "\nbl code %2d ", bl_order[rank])); + send_bits(s, s.bl_tree[bl_order[rank] * 2 + 1]/*.Len*/, 3); + } + //Tracev((stderr, "\nbl tree: sent %ld", s->bits_sent)); + + send_tree(s, s.dyn_ltree, lcodes - 1); /* literal tree */ + //Tracev((stderr, "\nlit tree: sent %ld", s->bits_sent)); -function d_code(dist) { - return dist < 256 ? _dist_code[dist] : _dist_code[256 + (dist >>> 7)]; + send_tree(s, s.dyn_dtree, dcodes - 1); /* distance tree */ + //Tracev((stderr, "\ndist tree: sent %ld", s->bits_sent)); } /* =========================================================================== - * Output a short LSB first on the stream. - * IN assertion: there is enough room in pendingBuf. + * Check if the data type is TEXT or BINARY, using the following algorithm: + * - TEXT if the two conditions below are satisfied: + * a) There are no non-portable control characters belonging to the + * "black list" (0..6, 14..25, 28..31). + * b) There is at least one printable character belonging to the + * "white list" (9 {TAB}, 10 {LF}, 13 {CR}, 32..255). + * - BINARY otherwise. + * - The following partially-portable control characters form a + * "gray list" that is ignored in this detection algorithm: + * (7 {BEL}, 8 {BS}, 11 {VT}, 12 {FF}, 26 {SUB}, 27 {ESC}). + * IN assertion: the fields Freq of dyn_ltree are set. */ -function put_short(s, w) { -// put_byte(s, (uch)((w) & 0xff)); -// put_byte(s, (uch)((ush)(w) >> 8)); - s.pending_buf[s.pending++] = (w) & 0xff; - s.pending_buf[s.pending++] = (w >>> 8) & 0xff; +function detect_data_type(s) { + /* black_mask is the bit mask of black-listed bytes + * set bits 0..6, 14..25, and 28..31 + * 0xf3ffc07f = binary 11110011111111111100000001111111 + */ + var black_mask = 0xf3ffc07f; + var n; + + /* Check for non-textual ("black-listed") bytes. */ + for (n = 0; n <= 31; n++, black_mask >>>= 1) { + if ((black_mask & 1) && (s.dyn_ltree[n * 2]/*.Freq*/ !== 0)) { + return Z_BINARY; + } + } + + /* Check for textual ("white-listed") bytes. */ + if (s.dyn_ltree[9 * 2]/*.Freq*/ !== 0 || s.dyn_ltree[10 * 2]/*.Freq*/ !== 0 || + s.dyn_ltree[13 * 2]/*.Freq*/ !== 0) { + return Z_TEXT; + } + for (n = 32; n < LITERALS; n++) { + if (s.dyn_ltree[n * 2]/*.Freq*/ !== 0) { + return Z_TEXT; + } + } + + /* There are no "black-listed" or "white-listed" bytes: + * this stream either is empty or has tolerated ("gray-listed") bytes only. + */ + return Z_BINARY; } +var static_init_done = false; + /* =========================================================================== - * Send a value on a given number of bits. - * IN assertion: length <= 16 and value fits in length bits. + * Initialize the tree data structures for a new zlib stream. */ -function send_bits(s, value, length) { - if (s.bi_valid > (Buf_size - length)) { - s.bi_buf |= (value << s.bi_valid) & 0xffff; - put_short(s, s.bi_buf); - s.bi_buf = value >> (Buf_size - s.bi_valid); - s.bi_valid += length - Buf_size; - } else { - s.bi_buf |= (value << s.bi_valid) & 0xffff; - s.bi_valid += length; +function _tr_init(s) +{ + + if (!static_init_done) { + tr_static_init(); + static_init_done = true; } -} + s.l_desc = new TreeDesc(s.dyn_ltree, static_l_desc); + s.d_desc = new TreeDesc(s.dyn_dtree, static_d_desc); + s.bl_desc = new TreeDesc(s.bl_tree, static_bl_desc); + + s.bi_buf = 0; + s.bi_valid = 0; -function send_code(s, c, tree) { - send_bits(s, tree[c * 2]/*.Code*/, tree[c * 2 + 1]/*.Len*/); + /* Initialize the first block of the first file: */ + init_block(s); } /* =========================================================================== - * Reverse the first len bits of a code, using straightforward code (a faster - * method would use a table) - * IN assertion: 1 <= len <= 15 + * Send a stored block */ -function bi_reverse(code, len) { - var res = 0; - do { - res |= code & 1; - code >>>= 1; - res <<= 1; - } while (--len > 0); - return res >>> 1; +function _tr_stored_block(s, buf, stored_len, last) +//DeflateState *s; +//charf *buf; /* input block */ +//ulg stored_len; /* length of input block */ +//int last; /* one if this is the last block for a file */ +{ + send_bits(s, (STORED_BLOCK << 1) + (last ? 1 : 0), 3); /* send block type */ + copy_block(s, buf, stored_len, true); /* with header */ } /* =========================================================================== - * Flush the bit buffer, keeping at most 7 bits in it. + * Send one empty static block to give enough lookahead for inflate. + * This takes 10 bits, of which 7 may remain in the bit buffer. */ -function bi_flush(s) { - if (s.bi_valid === 16) { - put_short(s, s.bi_buf); - s.bi_buf = 0; - s.bi_valid = 0; - - } else if (s.bi_valid >= 8) { - s.pending_buf[s.pending++] = s.bi_buf & 0xff; - s.bi_buf >>= 8; - s.bi_valid -= 8; - } +function _tr_align(s) { + send_bits(s, STATIC_TREES << 1, 3); + send_code(s, END_BLOCK, static_ltree); + bi_flush(s); } /* =========================================================================== - * Compute the optimal bit lengths for a tree and update the total bit length - * for the current block. - * IN assertion: the fields freq and dad are set, heap[heap_max] and - * above are the tree nodes sorted by increasing frequency. - * OUT assertions: the field len is set to the optimal bit length, the - * array bl_count contains the frequencies for each bit length. - * The length opt_len is updated; static_len is also updated if stree is - * not null. + * Determine the best encoding for the current block: dynamic trees, static + * trees or store, and output the encoded block to the zip file. */ -function gen_bitlen(s, desc) -// deflate_state *s; -// tree_desc *desc; /* the tree descriptor */ +function _tr_flush_block(s, buf, stored_len, last) +//DeflateState *s; +//charf *buf; /* input block, or NULL if too old */ +//ulg stored_len; /* length of input block */ +//int last; /* one if this is the last block for a file */ { - var tree = desc.dyn_tree; - var max_code = desc.max_code; - var stree = desc.stat_desc.static_tree; - var has_stree = desc.stat_desc.has_stree; - var extra = desc.stat_desc.extra_bits; - var base = desc.stat_desc.extra_base; - var max_length = desc.stat_desc.max_length; - var h; /* heap index */ - var n, m; /* iterate over the tree elements */ - var bits; /* bit length */ - var xbits; /* extra bits */ - var f; /* frequency */ - var overflow = 0; /* number of elements with bit length too large */ - - for (bits = 0; bits <= MAX_BITS; bits++) { - s.bl_count[bits] = 0; - } + var opt_lenb, static_lenb; /* opt_len and static_len in bytes */ + var max_blindex = 0; /* index of last bit length code of non zero freq */ - /* In a first pass, compute the optimal bit lengths (which may - * overflow in the case of the bit length tree). - */ - tree[s.heap[s.heap_max] * 2 + 1]/*.Len*/ = 0; /* root of the heap */ + /* Build the Huffman trees unless a stored block is forced */ + if (s.level > 0) { - for (h = s.heap_max + 1; h < HEAP_SIZE; h++) { - n = s.heap[h]; - bits = tree[tree[n * 2 + 1]/*.Dad*/ * 2 + 1]/*.Len*/ + 1; - if (bits > max_length) { - bits = max_length; - overflow++; + /* Check if the file is binary or text */ + if (s.strm.data_type === Z_UNKNOWN) { + s.strm.data_type = detect_data_type(s); } - tree[n * 2 + 1]/*.Len*/ = bits; - /* We overwrite tree[n].Dad which is no longer needed */ - if (n > max_code) { continue; } /* not a leaf node */ + /* Construct the literal and distance trees */ + build_tree(s, s.l_desc); + // Tracev((stderr, "\nlit data: dyn %ld, stat %ld", s->opt_len, + // s->static_len)); - s.bl_count[bits]++; - xbits = 0; - if (n >= base) { - xbits = extra[n - base]; - } - f = tree[n * 2]/*.Freq*/; - s.opt_len += f * (bits + xbits); - if (has_stree) { - s.static_len += f * (stree[n * 2 + 1]/*.Len*/ + xbits); - } + build_tree(s, s.d_desc); + // Tracev((stderr, "\ndist data: dyn %ld, stat %ld", s->opt_len, + // s->static_len)); + /* At this point, opt_len and static_len are the total bit lengths of + * the compressed block data, excluding the tree representations. + */ + + /* Build the bit length tree for the above two trees, and get the index + * in bl_order of the last bit length code to send. + */ + max_blindex = build_bl_tree(s); + + /* Determine the best encoding. Compute the block lengths in bytes. */ + opt_lenb = (s.opt_len + 3 + 7) >>> 3; + static_lenb = (s.static_len + 3 + 7) >>> 3; + + // Tracev((stderr, "\nopt %lu(%lu) stat %lu(%lu) stored %lu lit %u ", + // opt_lenb, s->opt_len, static_lenb, s->static_len, stored_len, + // s->last_lit)); + + if (static_lenb <= opt_lenb) { opt_lenb = static_lenb; } + + } else { + // Assert(buf != (char*)0, "lost buf"); + opt_lenb = static_lenb = stored_len + 5; /* force a stored block */ } - if (overflow === 0) { return; } - // Trace((stderr,"\nbit length overflow\n")); - /* This happens for example on obj2 and pic of the Calgary corpus */ + if ((stored_len + 4 <= opt_lenb) && (buf !== -1)) { + /* 4: two words for the lengths */ - /* Find the first bit length which could increase: */ - do { - bits = max_length - 1; - while (s.bl_count[bits] === 0) { bits--; } - s.bl_count[bits]--; /* move one leaf down the tree */ - s.bl_count[bits + 1] += 2; /* move one overflow item as its brother */ - s.bl_count[max_length]--; - /* The brother of the overflow item also moves one step up, - * but this does not affect bl_count[max_length] + /* The test buf != NULL is only necessary if LIT_BUFSIZE > WSIZE. + * Otherwise we can't have processed more than WSIZE input bytes since + * the last block flush, because compression would have been + * successful. If LIT_BUFSIZE <= WSIZE, it is never too late to + * transform a block into a stored block. */ - overflow -= 2; - } while (overflow > 0); + _tr_stored_block(s, buf, stored_len, last); - /* Now recompute all bit lengths, scanning in increasing frequency. - * h is still equal to HEAP_SIZE. (It is simpler to reconstruct all - * lengths instead of fixing only the wrong ones. This idea is taken - * from 'ar' written by Haruhiko Okumura.) + } else if (s.strategy === Z_FIXED || static_lenb === opt_lenb) { + + send_bits(s, (STATIC_TREES << 1) + (last ? 1 : 0), 3); + compress_block(s, static_ltree, static_dtree); + + } else { + send_bits(s, (DYN_TREES << 1) + (last ? 1 : 0), 3); + send_all_trees(s, s.l_desc.max_code + 1, s.d_desc.max_code + 1, max_blindex + 1); + compress_block(s, s.dyn_ltree, s.dyn_dtree); + } + // Assert (s->compressed_len == s->bits_sent, "bad compressed size"); + /* The above check is made mod 2^32, for files larger than 512 MB + * and uLong implemented on 32 bits. */ - for (bits = max_length; bits !== 0; bits--) { - n = s.bl_count[bits]; - while (n !== 0) { - m = s.heap[--h]; - if (m > max_code) { continue; } - if (tree[m * 2 + 1]/*.Len*/ !== bits) { - // Trace((stderr,"code %d bits %d->%d\n", m, tree[m].Len, bits)); - s.opt_len += (bits - tree[m * 2 + 1]/*.Len*/) * tree[m * 2]/*.Freq*/; - tree[m * 2 + 1]/*.Len*/ = bits; - } - n--; - } + init_block(s); + + if (last) { + bi_windup(s); } + // Tracev((stderr,"\ncomprlen %lu(%lu) ", s->compressed_len>>3, + // s->compressed_len-7*last)); } - /* =========================================================================== - * Generate the codes for a given tree and bit counts (which need not be - * optimal). - * IN assertion: the array bl_count contains the bit length statistics for - * the given tree and the field len is set for all tree elements. - * OUT assertion: the field code is set for all tree elements of non - * zero code length. + * Save the match info and tally the frequency counts. Return true if + * the current block must be flushed. */ -function gen_codes(tree, max_code, bl_count) -// ct_data *tree; /* the tree to decorate */ -// int max_code; /* largest code with non zero frequency */ -// ushf *bl_count; /* number of codes at each bit length */ +function _tr_tally(s, dist, lc) +// deflate_state *s; +// unsigned dist; /* distance of matched string */ +// unsigned lc; /* match length-MIN_MATCH or unmatched char (if dist==0) */ { - var next_code = new Array(MAX_BITS + 1); /* next code value for each bit length */ - var code = 0; /* running code value */ - var bits; /* bit index */ - var n; /* code index */ + //var out_length, in_length, dcode; - /* The distribution counts are first used to generate the code values - * without bit reversal. - */ - for (bits = 1; bits <= MAX_BITS; bits++) { - next_code[bits] = code = (code + bl_count[bits - 1]) << 1; + s.pending_buf[s.d_buf + s.last_lit * 2] = (dist >>> 8) & 0xff; + s.pending_buf[s.d_buf + s.last_lit * 2 + 1] = dist & 0xff; + + s.pending_buf[s.l_buf + s.last_lit] = lc & 0xff; + s.last_lit++; + + if (dist === 0) { + /* lc is the unmatched char */ + s.dyn_ltree[lc * 2]/*.Freq*/++; + } else { + s.matches++; + /* Here, lc is the match length - MIN_MATCH */ + dist--; /* dist = match distance - 1 */ + //Assert((ush)dist < (ush)MAX_DIST(s) && + // (ush)lc <= (ush)(MAX_MATCH-MIN_MATCH) && + // (ush)d_code(dist) < (ush)D_CODES, "_tr_tally: bad match"); + + s.dyn_ltree[(_length_code[lc] + LITERALS + 1) * 2]/*.Freq*/++; + s.dyn_dtree[d_code(dist) * 2]/*.Freq*/++; } - /* Check that the bit counts in bl_count are consistent. The last code - * must be all ones. + +// (!) This block is disabled in zlib defailts, +// don't enable it for binary compatibility + +//#ifdef TRUNCATE_BLOCK +// /* Try to guess if it is profitable to stop the current block here */ +// if ((s.last_lit & 0x1fff) === 0 && s.level > 2) { +// /* Compute an upper bound for the compressed length */ +// out_length = s.last_lit*8; +// in_length = s.strstart - s.block_start; +// +// for (dcode = 0; dcode < D_CODES; dcode++) { +// out_length += s.dyn_dtree[dcode*2]/*.Freq*/ * (5 + extra_dbits[dcode]); +// } +// out_length >>>= 3; +// //Tracev((stderr,"\nlast_lit %u, in %ld, out ~%ld(%ld%%) ", +// // s->last_lit, in_length, out_length, +// // 100L - out_length*100L/in_length)); +// if (s.matches < (s.last_lit>>1)/*int /2*/ && out_length < (in_length>>1)/*int /2*/) { +// return true; +// } +// } +//#endif + + return (s.last_lit === s.lit_bufsize - 1); + /* We avoid equality with lit_bufsize because of wraparound at 64K + * on 16 bit machines and because stored blocks are restricted to + * 64K-1 bytes. */ - //Assert (code + bl_count[MAX_BITS]-1 == (1< length code (0..28) */ - length = 0; - for (code = 0; code < LENGTH_CODES - 1; code++) { - base_length[code] = length; - for (n = 0; n < (1 << extra_lbits[code]); n++) { - _length_code[length++] = code; - } - } - //Assert (length == 256, "tr_static_init: length != 256"); - /* Note that the length 255 (match length 258) can be represented - * in two different ways: code 284 + 5 bits or code 285, so we - * overwrite length_code[255] to use the best encoding: - */ - _length_code[length - 1] = code; +var ieee754 = _dereq_('ieee754'); - /* Initialize the mapping dist (0..32K) -> dist code (0..29) */ - dist = 0; - for (code = 0; code < 16; code++) { - base_dist[code] = dist; - for (n = 0; n < (1 << extra_dbits[code]); n++) { - _dist_code[dist++] = code; - } - } - //Assert (dist == 256, "tr_static_init: dist != 256"); - dist >>= 7; /* from now on, all distances are divided by 128 */ - for (; code < D_CODES; code++) { - base_dist[code] = dist << 7; - for (n = 0; n < (1 << (extra_dbits[code] - 7)); n++) { - _dist_code[256 + dist++] = code; +var BufferMethods; + +function Buffer(length) { + var arr; + if (length && length.length) { + arr = length; + length = arr.length; } - } - //Assert (dist == 256, "tr_static_init: 256+dist != 512"); + var buf = new Uint8Array(length || 0); + if (arr) buf.set(arr); - /* Construct the codes of the static literal tree */ - for (bits = 0; bits <= MAX_BITS; bits++) { - bl_count[bits] = 0; - } + buf.readUInt32LE = BufferMethods.readUInt32LE; + buf.writeUInt32LE = BufferMethods.writeUInt32LE; + buf.readInt32LE = BufferMethods.readInt32LE; + buf.writeInt32LE = BufferMethods.writeInt32LE; + buf.readFloatLE = BufferMethods.readFloatLE; + buf.writeFloatLE = BufferMethods.writeFloatLE; + buf.readDoubleLE = BufferMethods.readDoubleLE; + buf.writeDoubleLE = BufferMethods.writeDoubleLE; + buf.toString = BufferMethods.toString; + buf.write = BufferMethods.write; + buf.slice = BufferMethods.slice; + buf.copy = BufferMethods.copy; - n = 0; - while (n <= 143) { - static_ltree[n * 2 + 1]/*.Len*/ = 8; - n++; - bl_count[8]++; - } - while (n <= 255) { - static_ltree[n * 2 + 1]/*.Len*/ = 9; - n++; - bl_count[9]++; - } - while (n <= 279) { - static_ltree[n * 2 + 1]/*.Len*/ = 7; - n++; - bl_count[7]++; - } - while (n <= 287) { - static_ltree[n * 2 + 1]/*.Len*/ = 8; - n++; - bl_count[8]++; - } - /* Codes 286 and 287 do not exist, but we must include them in the - * tree construction to get a canonical Huffman tree (longest code - * all ones) - */ - gen_codes(static_ltree, L_CODES + 1, bl_count); + buf._isBuffer = true; + return buf; +} - /* The static distance tree is trivial: */ - for (n = 0; n < D_CODES; n++) { - static_dtree[n * 2 + 1]/*.Len*/ = 5; - static_dtree[n * 2]/*.Code*/ = bi_reverse(n, 5); - } +var lastStr, lastStrEncoded; - // Now data ready and we can init static trees - static_l_desc = new StaticTreeDesc(static_ltree, extra_lbits, LITERALS + 1, L_CODES, MAX_BITS); - static_d_desc = new StaticTreeDesc(static_dtree, extra_dbits, 0, D_CODES, MAX_BITS); - static_bl_desc = new StaticTreeDesc(new Array(0), extra_blbits, 0, BL_CODES, MAX_BL_BITS); +BufferMethods = { + readUInt32LE: function(pos) { + return ((this[pos]) | + (this[pos + 1] << 8) | + (this[pos + 2] << 16)) + + (this[pos + 3] * 0x1000000); + }, - //static_init_done = true; -} + writeUInt32LE: function(val, pos) { + this[pos] = val; + this[pos + 1] = (val >>> 8); + this[pos + 2] = (val >>> 16); + this[pos + 3] = (val >>> 24); + }, + readInt32LE: function(pos) { + return ((this[pos]) | + (this[pos + 1] << 8) | + (this[pos + 2] << 16)) + + (this[pos + 3] << 24); + }, -/* =========================================================================== - * Initialize a new block. - */ -function init_block(s) { - var n; /* iterates over tree elements */ + readFloatLE: function(pos) { return ieee754.read(this, pos, true, 23, 4); }, + readDoubleLE: function(pos) { return ieee754.read(this, pos, true, 52, 8); }, - /* Initialize the trees. */ - for (n = 0; n < L_CODES; n++) { s.dyn_ltree[n * 2]/*.Freq*/ = 0; } - for (n = 0; n < D_CODES; n++) { s.dyn_dtree[n * 2]/*.Freq*/ = 0; } - for (n = 0; n < BL_CODES; n++) { s.bl_tree[n * 2]/*.Freq*/ = 0; } + writeFloatLE: function(val, pos) { return ieee754.write(this, val, pos, true, 23, 4); }, + writeDoubleLE: function(val, pos) { return ieee754.write(this, val, pos, true, 52, 8); }, - s.dyn_ltree[END_BLOCK * 2]/*.Freq*/ = 1; - s.opt_len = s.static_len = 0; - s.last_lit = s.matches = 0; -} + toString: function(encoding, start, end) { + var str = '', + tmp = ''; + start = start || 0; + end = Math.min(this.length, end || this.length); -/* =========================================================================== - * Flush the bit buffer and align the output on a byte boundary - */ -function bi_windup(s) -{ - if (s.bi_valid > 8) { - put_short(s, s.bi_buf); - } else if (s.bi_valid > 0) { - //put_byte(s, (Byte)s->bi_buf); - s.pending_buf[s.pending++] = s.bi_buf; - } - s.bi_buf = 0; - s.bi_valid = 0; -} + for (var i = start; i < end; i++) { + var ch = this[i]; + if (ch <= 0x7F) { + str += decodeURIComponent(tmp) + String.fromCharCode(ch); + tmp = ''; + } else { + tmp += '%' + ch.toString(16); + } + } -/* =========================================================================== - * Copy a stored block, storing first the length and its - * one's complement if requested. - */ -function copy_block(s, buf, len, header) -//DeflateState *s; -//charf *buf; /* the input data */ -//unsigned len; /* its length */ -//int header; /* true if block header must be written */ -{ - bi_windup(s); /* align on byte boundary */ + str += decodeURIComponent(tmp); - if (header) { - put_short(s, len); - put_short(s, ~len); - } -// while (len--) { -// put_byte(s, *buf++); -// } - utils.arraySet(s.pending_buf, s.window, buf, len, s.pending); - s.pending += len; -} + return str; + }, -/* =========================================================================== - * Compares to subtrees, using the tree depth as tie breaker when - * the subtrees have equal frequency. This minimizes the worst case length. - */ -function smaller(tree, n, m, depth) { - var _n2 = n * 2; - var _m2 = m * 2; - return (tree[_n2]/*.Freq*/ < tree[_m2]/*.Freq*/ || - (tree[_n2]/*.Freq*/ === tree[_m2]/*.Freq*/ && depth[n] <= depth[m])); -} + write: function(str, pos) { + var bytes = str === lastStr ? lastStrEncoded : encodeString(str); + for (var i = 0; i < bytes.length; i++) { + this[pos + i] = bytes[i]; + } + }, -/* =========================================================================== - * Restore the heap property by moving down the tree starting at node k, - * exchanging a node with the smallest of its two sons if necessary, stopping - * when the heap property is re-established (each father smaller than its - * two sons). - */ -function pqdownheap(s, tree, k) -// deflate_state *s; -// ct_data *tree; /* the tree to restore */ -// int k; /* node to move down */ -{ - var v = s.heap[k]; - var j = k << 1; /* left son of k */ - while (j <= s.heap_len) { - /* Set j to the smallest of the two sons: */ - if (j < s.heap_len && - smaller(tree, s.heap[j + 1], s.heap[j], s.depth)) { - j++; + slice: function(start, end) { + return this.subarray(start, end); + }, + + copy: function(buf, pos) { + pos = pos || 0; + for (var i = 0; i < this.length; i++) { + buf[pos + i] = this[i]; + } } - /* Exit if v is smaller than both sons */ - if (smaller(tree, v, s.heap[j], s.depth)) { break; } +}; - /* Exchange v with the smallest son */ - s.heap[k] = s.heap[j]; - k = j; +BufferMethods.writeInt32LE = BufferMethods.writeUInt32LE; - /* And continue down the tree, setting j to the left son of k */ - j <<= 1; - } - s.heap[k] = v; -} +Buffer.byteLength = function(str) { + lastStr = str; + lastStrEncoded = encodeString(str); + return lastStrEncoded.length; +}; +Buffer.isBuffer = function(buf) { + return !!(buf && buf._isBuffer); +}; -// inlined manually -// var SMALLEST = 1; +function encodeString(str) { + var length = str.length, + bytes = []; -/* =========================================================================== - * Send the block data compressed using the given Huffman trees - */ -function compress_block(s, ltree, dtree) -// deflate_state *s; -// const ct_data *ltree; /* literal tree */ -// const ct_data *dtree; /* distance tree */ -{ - var dist; /* distance of matched string */ - var lc; /* match length or unmatched char (if dist == 0) */ - var lx = 0; /* running index in l_buf */ - var code; /* the code to send */ - var extra; /* number of extra bits to send */ + for (var i = 0, c, lead; i < length; i++) { + c = str.charCodeAt(i); // code point - if (s.last_lit !== 0) { - do { - dist = (s.pending_buf[s.d_buf + lx * 2] << 8) | (s.pending_buf[s.d_buf + lx * 2 + 1]); - lc = s.pending_buf[s.l_buf + lx]; - lx++; + if (c > 0xD7FF && c < 0xE000) { - if (dist === 0) { - send_code(s, lc, ltree); /* send a literal byte */ - //Tracecv(isgraph(lc), (stderr," '%c' ", lc)); - } else { - /* Here, lc is the match length - MIN_MATCH */ - code = _length_code[lc]; - send_code(s, code + LITERALS + 1, ltree); /* send the length code */ - extra = extra_lbits[code]; - if (extra !== 0) { - lc -= base_length[code]; - send_bits(s, lc, extra); /* send the extra length bits */ - } - dist--; /* dist is now the match distance - 1 */ - code = d_code(dist); - //Assert (code < D_CODES, "bad d_code"); + if (lead) { + if (c < 0xDC00) { + bytes.push(0xEF, 0xBF, 0xBD); + lead = c; + continue; - send_code(s, code, dtree); /* send the distance code */ - extra = extra_dbits[code]; - if (extra !== 0) { - dist -= base_dist[code]; - send_bits(s, dist, extra); /* send the extra distance bits */ + } else { + c = lead - 0xD800 << 10 | c - 0xDC00 | 0x10000; + lead = null; + } + + } else { + if (c > 0xDBFF || (i + 1 === length)) bytes.push(0xEF, 0xBF, 0xBD); + else lead = c; + + continue; + } + + } else if (lead) { + bytes.push(0xEF, 0xBF, 0xBD); + lead = null; } - } /* literal or match pair ? */ - /* Check that the overlay between pending_buf and d_buf+l_buf is ok: */ - //Assert((uInt)(s->pending) < s->lit_bufsize + 2*lx, - // "pendingBuf overflow"); + if (c < 0x80) bytes.push(c); + else if (c < 0x800) bytes.push(c >> 0x6 | 0xC0, c & 0x3F | 0x80); + else if (c < 0x10000) bytes.push(c >> 0xC | 0xE0, c >> 0x6 & 0x3F | 0x80, c & 0x3F | 0x80); + else bytes.push(c >> 0x12 | 0xF0, c >> 0xC & 0x3F | 0x80, c >> 0x6 & 0x3F | 0x80, c & 0x3F | 0x80); + } + return bytes; +} - } while (lx < s.last_lit); - } +},{"ieee754":91}],173:[function(_dereq_,module,exports){ +(function (global){ +'use strict'; - send_code(s, END_BLOCK, ltree); +module.exports = Pbf; + +var Buffer = global.Buffer || _dereq_('./buffer'); + +function Pbf(buf) { + this.buf = !Buffer.isBuffer(buf) ? new Buffer(buf || 0) : buf; + this.pos = 0; + this.length = this.buf.length; } +Pbf.Varint = 0; // varint: int32, int64, uint32, uint64, sint32, sint64, bool, enum +Pbf.Fixed64 = 1; // 64-bit: double, fixed64, sfixed64 +Pbf.Bytes = 2; // length-delimited: string, bytes, embedded messages, packed repeated fields +Pbf.Fixed32 = 5; // 32-bit: float, fixed32, sfixed32 -/* =========================================================================== - * Construct one Huffman tree and assigns the code bit strings and lengths. - * Update the total bit length for the current block. - * IN assertion: the field freq is set for all tree elements. - * OUT assertions: the fields len and code are set to the optimal bit length - * and corresponding code. The length opt_len is updated; static_len is - * also updated if stree is not null. The field max_code is set. - */ -function build_tree(s, desc) -// deflate_state *s; -// tree_desc *desc; /* the tree descriptor */ -{ - var tree = desc.dyn_tree; - var stree = desc.stat_desc.static_tree; - var has_stree = desc.stat_desc.has_stree; - var elems = desc.stat_desc.elems; - var n, m; /* iterate over heap elements */ - var max_code = -1; /* largest code with non zero frequency */ - var node; /* new node being created */ +var SHIFT_LEFT_32 = (1 << 16) * (1 << 16), + SHIFT_RIGHT_32 = 1 / SHIFT_LEFT_32, + POW_2_63 = Math.pow(2, 63); - /* Construct the initial heap, with least frequent element in - * heap[SMALLEST]. The sons of heap[n] are heap[2*n] and heap[2*n+1]. - * heap[0] is not used. - */ - s.heap_len = 0; - s.heap_max = HEAP_SIZE; +Pbf.prototype = { - for (n = 0; n < elems; n++) { - if (tree[n * 2]/*.Freq*/ !== 0) { - s.heap[++s.heap_len] = max_code = n; - s.depth[n] = 0; + destroy: function() { + this.buf = null; + }, - } else { - tree[n * 2 + 1]/*.Len*/ = 0; - } - } + // === READING ================================================================= - /* The pkzip format requires that at least one distance code exists, - * and that at least one bit should be sent even if there is only one - * possible code. So to avoid special checks later on we force at least - * two codes of non zero frequency. - */ - while (s.heap_len < 2) { - node = s.heap[++s.heap_len] = (max_code < 2 ? ++max_code : 0); - tree[node * 2]/*.Freq*/ = 1; - s.depth[node] = 0; - s.opt_len--; + readFields: function(readField, result, end) { + end = end || this.length; - if (has_stree) { - s.static_len -= stree[node * 2 + 1]/*.Len*/; - } - /* node is 0 or 1 so it does not have extra bits */ - } - desc.max_code = max_code; + while (this.pos < end) { + var val = this.readVarint(), + tag = val >> 3, + startPos = this.pos; - /* The elements heap[heap_len/2+1 .. heap_len] are leaves of the tree, - * establish sub-heaps of increasing lengths: - */ - for (n = (s.heap_len >> 1/*int /2*/); n >= 1; n--) { pqdownheap(s, tree, n); } + readField(tag, result, this); - /* Construct the Huffman tree by repeatedly combining the least two - * frequent nodes. - */ - node = elems; /* next internal node of the tree */ - do { - //pqremove(s, tree, n); /* n = node of least frequency */ - /*** pqremove ***/ - n = s.heap[1/*SMALLEST*/]; - s.heap[1/*SMALLEST*/] = s.heap[s.heap_len--]; - pqdownheap(s, tree, 1/*SMALLEST*/); - /***/ + if (this.pos === startPos) this.skip(val); + } + return result; + }, - m = s.heap[1/*SMALLEST*/]; /* m = node of next least frequency */ + readMessage: function(readField, result) { + return this.readFields(readField, result, this.readVarint() + this.pos); + }, - s.heap[--s.heap_max] = n; /* keep the nodes sorted by frequency */ - s.heap[--s.heap_max] = m; + readFixed32: function() { + var val = this.buf.readUInt32LE(this.pos); + this.pos += 4; + return val; + }, - /* Create a new node father of n and m */ - tree[node * 2]/*.Freq*/ = tree[n * 2]/*.Freq*/ + tree[m * 2]/*.Freq*/; - s.depth[node] = (s.depth[n] >= s.depth[m] ? s.depth[n] : s.depth[m]) + 1; - tree[n * 2 + 1]/*.Dad*/ = tree[m * 2 + 1]/*.Dad*/ = node; + readSFixed32: function() { + var val = this.buf.readInt32LE(this.pos); + this.pos += 4; + return val; + }, - /* and insert the new node in the heap */ - s.heap[1/*SMALLEST*/] = node++; - pqdownheap(s, tree, 1/*SMALLEST*/); + // 64-bit int handling is based on github.com/dpw/node-buffer-more-ints (MIT-licensed) + + readFixed64: function() { + var val = this.buf.readUInt32LE(this.pos) + this.buf.readUInt32LE(this.pos + 4) * SHIFT_LEFT_32; + this.pos += 8; + return val; + }, + + readSFixed64: function() { + var val = this.buf.readUInt32LE(this.pos) + this.buf.readInt32LE(this.pos + 4) * SHIFT_LEFT_32; + this.pos += 8; + return val; + }, - } while (s.heap_len >= 2); + readFloat: function() { + var val = this.buf.readFloatLE(this.pos); + this.pos += 4; + return val; + }, - s.heap[--s.heap_max] = s.heap[1/*SMALLEST*/]; + readDouble: function() { + var val = this.buf.readDoubleLE(this.pos); + this.pos += 8; + return val; + }, - /* At this point, the fields freq and dad are set. We can now - * generate the bit lengths. - */ - gen_bitlen(s, desc); + readVarint: function() { + var buf = this.buf, + val, b, b0, b1, b2, b3; - /* The field len is now set, we can generate the bit codes */ - gen_codes(tree, max_code, s.bl_count); -} + b0 = buf[this.pos++]; if (b0 < 0x80) return b0; b0 = b0 & 0x7f; + b1 = buf[this.pos++]; if (b1 < 0x80) return b0 | b1 << 7; b1 = (b1 & 0x7f) << 7; + b2 = buf[this.pos++]; if (b2 < 0x80) return b0 | b1 | b2 << 14; b2 = (b2 & 0x7f) << 14; + b3 = buf[this.pos++]; if (b3 < 0x80) return b0 | b1 | b2 | b3 << 21; + val = b0 | b1 | b2 | (b3 & 0x7f) << 21; -/* =========================================================================== - * Scan a literal or distance tree to determine the frequencies of the codes - * in the bit length tree. - */ -function scan_tree(s, tree, max_code) -// deflate_state *s; -// ct_data *tree; /* the tree to be scanned */ -// int max_code; /* and its largest code of non zero frequency */ -{ - var n; /* iterates over all tree elements */ - var prevlen = -1; /* last emitted length */ - var curlen; /* length of current code */ + b = buf[this.pos++]; val += (b & 0x7f) * 0x10000000; if (b < 0x80) return val; + b = buf[this.pos++]; val += (b & 0x7f) * 0x800000000; if (b < 0x80) return val; + b = buf[this.pos++]; val += (b & 0x7f) * 0x40000000000; if (b < 0x80) return val; + b = buf[this.pos++]; val += (b & 0x7f) * 0x2000000000000; if (b < 0x80) return val; + b = buf[this.pos++]; val += (b & 0x7f) * 0x100000000000000; if (b < 0x80) return val; + b = buf[this.pos++]; val += (b & 0x7f) * 0x8000000000000000; if (b < 0x80) return val; - var nextlen = tree[0 * 2 + 1]/*.Len*/; /* length of next code */ + throw new Error('Expected varint not more than 10 bytes'); + }, - var count = 0; /* repeat count of the current code */ - var max_count = 7; /* max repeat count */ - var min_count = 4; /* min repeat count */ + readVarint64: function() { + var startPos = this.pos, + val = this.readVarint(); - if (nextlen === 0) { - max_count = 138; - min_count = 3; - } - tree[(max_code + 1) * 2 + 1]/*.Len*/ = 0xffff; /* guard */ + if (val < POW_2_63) return val; - for (n = 0; n <= max_code; n++) { - curlen = nextlen; - nextlen = tree[(n + 1) * 2 + 1]/*.Len*/; + var pos = this.pos - 2; + while (this.buf[pos] === 0xff) pos--; + if (pos < startPos) pos = startPos; - if (++count < max_count && curlen === nextlen) { - continue; + val = 0; + for (var i = 0; i < pos - startPos + 1; i++) { + var b = ~this.buf[startPos + i] & 0x7f; + val += i < 4 ? b << i * 7 : b * Math.pow(2, i * 7); + } - } else if (count < min_count) { - s.bl_tree[curlen * 2]/*.Freq*/ += count; + return -val - 1; + }, - } else if (curlen !== 0) { + readSVarint: function() { + var num = this.readVarint(); + return num % 2 === 1 ? (num + 1) / -2 : num / 2; // zigzag encoding + }, - if (curlen !== prevlen) { s.bl_tree[curlen * 2]/*.Freq*/++; } - s.bl_tree[REP_3_6 * 2]/*.Freq*/++; + readBoolean: function() { + return Boolean(this.readVarint()); + }, - } else if (count <= 10) { - s.bl_tree[REPZ_3_10 * 2]/*.Freq*/++; + readString: function() { + var end = this.readVarint() + this.pos, + str = this.buf.toString('utf8', this.pos, end); + this.pos = end; + return str; + }, - } else { - s.bl_tree[REPZ_11_138 * 2]/*.Freq*/++; - } + readBytes: function() { + var end = this.readVarint() + this.pos, + buffer = this.buf.slice(this.pos, end); + this.pos = end; + return buffer; + }, - count = 0; - prevlen = curlen; + // verbose for performance reasons; doesn't affect gzipped size - if (nextlen === 0) { - max_count = 138; - min_count = 3; + readPackedVarint: function() { + var end = this.readVarint() + this.pos, arr = []; + while (this.pos < end) arr.push(this.readVarint()); + return arr; + }, + readPackedSVarint: function() { + var end = this.readVarint() + this.pos, arr = []; + while (this.pos < end) arr.push(this.readSVarint()); + return arr; + }, + readPackedBoolean: function() { + var end = this.readVarint() + this.pos, arr = []; + while (this.pos < end) arr.push(this.readBoolean()); + return arr; + }, + readPackedFloat: function() { + var end = this.readVarint() + this.pos, arr = []; + while (this.pos < end) arr.push(this.readFloat()); + return arr; + }, + readPackedDouble: function() { + var end = this.readVarint() + this.pos, arr = []; + while (this.pos < end) arr.push(this.readDouble()); + return arr; + }, + readPackedFixed32: function() { + var end = this.readVarint() + this.pos, arr = []; + while (this.pos < end) arr.push(this.readFixed32()); + return arr; + }, + readPackedSFixed32: function() { + var end = this.readVarint() + this.pos, arr = []; + while (this.pos < end) arr.push(this.readSFixed32()); + return arr; + }, + readPackedFixed64: function() { + var end = this.readVarint() + this.pos, arr = []; + while (this.pos < end) arr.push(this.readFixed64()); + return arr; + }, + readPackedSFixed64: function() { + var end = this.readVarint() + this.pos, arr = []; + while (this.pos < end) arr.push(this.readSFixed64()); + return arr; + }, - } else if (curlen === nextlen) { - max_count = 6; - min_count = 3; + skip: function(val) { + var type = val & 0x7; + if (type === Pbf.Varint) while (this.buf[this.pos++] > 0x7f) {} + else if (type === Pbf.Bytes) this.pos = this.readVarint() + this.pos; + else if (type === Pbf.Fixed32) this.pos += 4; + else if (type === Pbf.Fixed64) this.pos += 8; + else throw new Error('Unimplemented type: ' + type); + }, - } else { - max_count = 7; - min_count = 4; - } - } -} + // === WRITING ================================================================= + writeTag: function(tag, type) { + this.writeVarint((tag << 3) | type); + }, -/* =========================================================================== - * Send a literal or distance tree in compressed form, using the codes in - * bl_tree. - */ -function send_tree(s, tree, max_code) -// deflate_state *s; -// ct_data *tree; /* the tree to be scanned */ -// int max_code; /* and its largest code of non zero frequency */ -{ - var n; /* iterates over all tree elements */ - var prevlen = -1; /* last emitted length */ - var curlen; /* length of current code */ + realloc: function(min) { + var length = this.length || 16; - var nextlen = tree[0 * 2 + 1]/*.Len*/; /* length of next code */ + while (length < this.pos + min) length *= 2; - var count = 0; /* repeat count of the current code */ - var max_count = 7; /* max repeat count */ - var min_count = 4; /* min repeat count */ + if (length !== this.length) { + var buf = new Buffer(length); + this.buf.copy(buf); + this.buf = buf; + this.length = length; + } + }, - /* tree[max_code+1].Len = -1; */ /* guard already set */ - if (nextlen === 0) { - max_count = 138; - min_count = 3; - } + finish: function() { + this.length = this.pos; + this.pos = 0; + return this.buf.slice(0, this.length); + }, - for (n = 0; n <= max_code; n++) { - curlen = nextlen; - nextlen = tree[(n + 1) * 2 + 1]/*.Len*/; + writeFixed32: function(val) { + this.realloc(4); + this.buf.writeUInt32LE(val, this.pos); + this.pos += 4; + }, - if (++count < max_count && curlen === nextlen) { - continue; + writeSFixed32: function(val) { + this.realloc(4); + this.buf.writeInt32LE(val, this.pos); + this.pos += 4; + }, - } else if (count < min_count) { - do { send_code(s, curlen, s.bl_tree); } while (--count !== 0); + writeFixed64: function(val) { + this.realloc(8); + this.buf.writeInt32LE(val & -1, this.pos); + this.buf.writeUInt32LE(Math.floor(val * SHIFT_RIGHT_32), this.pos + 4); + this.pos += 8; + }, - } else if (curlen !== 0) { - if (curlen !== prevlen) { - send_code(s, curlen, s.bl_tree); - count--; - } - //Assert(count >= 3 && count <= 6, " 3_6?"); - send_code(s, REP_3_6, s.bl_tree); - send_bits(s, count - 3, 2); + writeSFixed64: function(val) { + this.realloc(8); + this.buf.writeInt32LE(val & -1, this.pos); + this.buf.writeInt32LE(Math.floor(val * SHIFT_RIGHT_32), this.pos + 4); + this.pos += 8; + }, - } else if (count <= 10) { - send_code(s, REPZ_3_10, s.bl_tree); - send_bits(s, count - 3, 3); + writeVarint: function(val) { + val = +val; - } else { - send_code(s, REPZ_11_138, s.bl_tree); - send_bits(s, count - 11, 7); - } + if (val <= 0x7f) { + this.realloc(1); + this.buf[this.pos++] = val; - count = 0; - prevlen = curlen; - if (nextlen === 0) { - max_count = 138; - min_count = 3; + } else if (val <= 0x3fff) { + this.realloc(2); + this.buf[this.pos++] = ((val >>> 0) & 0x7f) | 0x80; + this.buf[this.pos++] = ((val >>> 7) & 0x7f); - } else if (curlen === nextlen) { - max_count = 6; - min_count = 3; + } else if (val <= 0x1fffff) { + this.realloc(3); + this.buf[this.pos++] = ((val >>> 0) & 0x7f) | 0x80; + this.buf[this.pos++] = ((val >>> 7) & 0x7f) | 0x80; + this.buf[this.pos++] = ((val >>> 14) & 0x7f); - } else { - max_count = 7; - min_count = 4; - } - } -} + } else if (val <= 0xfffffff) { + this.realloc(4); + this.buf[this.pos++] = ((val >>> 0) & 0x7f) | 0x80; + this.buf[this.pos++] = ((val >>> 7) & 0x7f) | 0x80; + this.buf[this.pos++] = ((val >>> 14) & 0x7f) | 0x80; + this.buf[this.pos++] = ((val >>> 21) & 0x7f); + } else { + var pos = this.pos; + while (val >= 0x80) { + this.realloc(1); + this.buf[this.pos++] = (val & 0xff) | 0x80; + val /= 0x80; + } + this.realloc(1); + this.buf[this.pos++] = val | 0; + if (this.pos - pos > 10) throw new Error('Given varint doesn\'t fit into 10 bytes'); + } + }, -/* =========================================================================== - * Construct the Huffman tree for the bit lengths and return the index in - * bl_order of the last bit length code to send. - */ -function build_bl_tree(s) { - var max_blindex; /* index of last bit length code of non zero freq */ + writeSVarint: function(val) { + this.writeVarint(val < 0 ? -val * 2 - 1 : val * 2); + }, - /* Determine the bit length frequencies for literal and distance trees */ - scan_tree(s, s.dyn_ltree, s.l_desc.max_code); - scan_tree(s, s.dyn_dtree, s.d_desc.max_code); + writeBoolean: function(val) { + this.writeVarint(Boolean(val)); + }, - /* Build the bit length tree: */ - build_tree(s, s.bl_desc); - /* opt_len now includes the length of the tree representations, except - * the lengths of the bit lengths codes and the 5+5+4 bits for the counts. - */ + writeString: function(str) { + str = String(str); + var bytes = Buffer.byteLength(str); + this.writeVarint(bytes); + this.realloc(bytes); + this.buf.write(str, this.pos); + this.pos += bytes; + }, - /* Determine the number of bit length codes to send. The pkzip format - * requires that at least 4 bit length codes be sent. (appnote.txt says - * 3 but the actual value used is 4.) - */ - for (max_blindex = BL_CODES - 1; max_blindex >= 3; max_blindex--) { - if (s.bl_tree[bl_order[max_blindex] * 2 + 1]/*.Len*/ !== 0) { - break; - } - } - /* Update opt_len to include the bit length tree and counts */ - s.opt_len += 3 * (max_blindex + 1) + 5 + 5 + 4; - //Tracev((stderr, "\ndyn trees: dyn %ld, stat %ld", - // s->opt_len, s->static_len)); + writeFloat: function(val) { + this.realloc(4); + this.buf.writeFloatLE(val, this.pos); + this.pos += 4; + }, - return max_blindex; -} + writeDouble: function(val) { + this.realloc(8); + this.buf.writeDoubleLE(val, this.pos); + this.pos += 8; + }, + writeBytes: function(buffer) { + var len = buffer.length; + this.writeVarint(len); + this.realloc(len); + for (var i = 0; i < len; i++) this.buf[this.pos++] = buffer[i]; + }, -/* =========================================================================== - * Send the header for a block using dynamic Huffman trees: the counts, the - * lengths of the bit length codes, the literal tree and the distance tree. - * IN assertion: lcodes >= 257, dcodes >= 1, blcodes >= 4. - */ -function send_all_trees(s, lcodes, dcodes, blcodes) -// deflate_state *s; -// int lcodes, dcodes, blcodes; /* number of codes for each tree */ -{ - var rank; /* index in bl_order */ + writeMessage: function(tag, fn, obj) { + this.writeTag(tag, Pbf.Bytes); - //Assert (lcodes >= 257 && dcodes >= 1 && blcodes >= 4, "not enough codes"); - //Assert (lcodes <= L_CODES && dcodes <= D_CODES && blcodes <= BL_CODES, - // "too many codes"); - //Tracev((stderr, "\nbl counts: ")); - send_bits(s, lcodes - 257, 5); /* not +255 as stated in appnote.txt */ - send_bits(s, dcodes - 1, 5); - send_bits(s, blcodes - 4, 4); /* not -3 as stated in appnote.txt */ - for (rank = 0; rank < blcodes; rank++) { - //Tracev((stderr, "\nbl code %2d ", bl_order[rank])); - send_bits(s, s.bl_tree[bl_order[rank] * 2 + 1]/*.Len*/, 3); - } - //Tracev((stderr, "\nbl tree: sent %ld", s->bits_sent)); + this.pos++; // reserve 1 byte for short message length - send_tree(s, s.dyn_ltree, lcodes - 1); /* literal tree */ - //Tracev((stderr, "\nlit tree: sent %ld", s->bits_sent)); + // write the message directly to the buffer and see how much was written + var startPos = this.pos; + fn(obj, this); + var len = this.pos - startPos; - send_tree(s, s.dyn_dtree, dcodes - 1); /* distance tree */ - //Tracev((stderr, "\ndist tree: sent %ld", s->bits_sent)); -} + var varintLen = + len <= 0x7f ? 1 : + len <= 0x3fff ? 2 : + len <= 0x1fffff ? 3 : + len <= 0xfffffff ? 4 : Math.ceil(Math.log(len) / (Math.LN2 * 7)); + // if 1 byte isn't enough for encoding message length, shift the data to the right + if (varintLen > 1) { + this.realloc(varintLen - 1); + for (var i = this.pos - 1; i >= startPos; i--) this.buf[i + varintLen - 1] = this.buf[i]; + } -/* =========================================================================== - * Check if the data type is TEXT or BINARY, using the following algorithm: - * - TEXT if the two conditions below are satisfied: - * a) There are no non-portable control characters belonging to the - * "black list" (0..6, 14..25, 28..31). - * b) There is at least one printable character belonging to the - * "white list" (9 {TAB}, 10 {LF}, 13 {CR}, 32..255). - * - BINARY otherwise. - * - The following partially-portable control characters form a - * "gray list" that is ignored in this detection algorithm: - * (7 {BEL}, 8 {BS}, 11 {VT}, 12 {FF}, 26 {SUB}, 27 {ESC}). - * IN assertion: the fields Freq of dyn_ltree are set. - */ -function detect_data_type(s) { - /* black_mask is the bit mask of black-listed bytes - * set bits 0..6, 14..25, and 28..31 - * 0xf3ffc07f = binary 11110011111111111100000001111111 - */ - var black_mask = 0xf3ffc07f; - var n; + // finally, write the message length in the reserved place and restore the position + this.pos = startPos - 1; + this.writeVarint(len); + this.pos += len; + }, - /* Check for non-textual ("black-listed") bytes. */ - for (n = 0; n <= 31; n++, black_mask >>>= 1) { - if ((black_mask & 1) && (s.dyn_ltree[n * 2]/*.Freq*/ !== 0)) { - return Z_BINARY; - } - } + writePackedVarint: function(tag, arr) { this.writeMessage(tag, writePackedVarint, arr); }, + writePackedSVarint: function(tag, arr) { this.writeMessage(tag, writePackedSVarint, arr); }, + writePackedBoolean: function(tag, arr) { this.writeMessage(tag, writePackedBoolean, arr); }, + writePackedFloat: function(tag, arr) { this.writeMessage(tag, writePackedFloat, arr); }, + writePackedDouble: function(tag, arr) { this.writeMessage(tag, writePackedDouble, arr); }, + writePackedFixed32: function(tag, arr) { this.writeMessage(tag, writePackedFixed32, arr); }, + writePackedSFixed32: function(tag, arr) { this.writeMessage(tag, writePackedSFixed32, arr); }, + writePackedFixed64: function(tag, arr) { this.writeMessage(tag, writePackedFixed64, arr); }, + writePackedSFixed64: function(tag, arr) { this.writeMessage(tag, writePackedSFixed64, arr); }, - /* Check for textual ("white-listed") bytes. */ - if (s.dyn_ltree[9 * 2]/*.Freq*/ !== 0 || s.dyn_ltree[10 * 2]/*.Freq*/ !== 0 || - s.dyn_ltree[13 * 2]/*.Freq*/ !== 0) { - return Z_TEXT; - } - for (n = 32; n < LITERALS; n++) { - if (s.dyn_ltree[n * 2]/*.Freq*/ !== 0) { - return Z_TEXT; + writeBytesField: function(tag, buffer) { + this.writeTag(tag, Pbf.Bytes); + this.writeBytes(buffer); + }, + writeFixed32Field: function(tag, val) { + this.writeTag(tag, Pbf.Fixed32); + this.writeFixed32(val); + }, + writeSFixed32Field: function(tag, val) { + this.writeTag(tag, Pbf.Fixed32); + this.writeSFixed32(val); + }, + writeFixed64Field: function(tag, val) { + this.writeTag(tag, Pbf.Fixed64); + this.writeFixed64(val); + }, + writeSFixed64Field: function(tag, val) { + this.writeTag(tag, Pbf.Fixed64); + this.writeSFixed64(val); + }, + writeVarintField: function(tag, val) { + this.writeTag(tag, Pbf.Varint); + this.writeVarint(val); + }, + writeSVarintField: function(tag, val) { + this.writeTag(tag, Pbf.Varint); + this.writeSVarint(val); + }, + writeStringField: function(tag, str) { + this.writeTag(tag, Pbf.Bytes); + this.writeString(str); + }, + writeFloatField: function(tag, val) { + this.writeTag(tag, Pbf.Fixed32); + this.writeFloat(val); + }, + writeDoubleField: function(tag, val) { + this.writeTag(tag, Pbf.Fixed64); + this.writeDouble(val); + }, + writeBooleanField: function(tag, val) { + this.writeVarintField(tag, Boolean(val)); } - } +}; - /* There are no "black-listed" or "white-listed" bytes: - * this stream either is empty or has tolerated ("gray-listed") bytes only. - */ - return Z_BINARY; -} +function writePackedVarint(arr, pbf) { for (var i = 0; i < arr.length; i++) pbf.writeVarint(arr[i]); } +function writePackedSVarint(arr, pbf) { for (var i = 0; i < arr.length; i++) pbf.writeSVarint(arr[i]); } +function writePackedFloat(arr, pbf) { for (var i = 0; i < arr.length; i++) pbf.writeFloat(arr[i]); } +function writePackedDouble(arr, pbf) { for (var i = 0; i < arr.length; i++) pbf.writeDouble(arr[i]); } +function writePackedBoolean(arr, pbf) { for (var i = 0; i < arr.length; i++) pbf.writeBoolean(arr[i]); } +function writePackedFixed32(arr, pbf) { for (var i = 0; i < arr.length; i++) pbf.writeFixed32(arr[i]); } +function writePackedSFixed32(arr, pbf) { for (var i = 0; i < arr.length; i++) pbf.writeSFixed32(arr[i]); } +function writePackedFixed64(arr, pbf) { for (var i = 0; i < arr.length; i++) pbf.writeFixed64(arr[i]); } +function writePackedSFixed64(arr, pbf) { for (var i = 0; i < arr.length; i++) pbf.writeSFixed64(arr[i]); } +}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) -var static_init_done = false; +},{"./buffer":172}],174:[function(_dereq_,module,exports){ +'use strict'; -/* =========================================================================== - * Initialize the tree data structures for a new zlib stream. - */ -function _tr_init(s) -{ +module.exports = Point; - if (!static_init_done) { - tr_static_init(); - static_init_done = true; - } +function Point(x, y) { + this.x = x; + this.y = y; +} - s.l_desc = new TreeDesc(s.dyn_ltree, static_l_desc); - s.d_desc = new TreeDesc(s.dyn_dtree, static_d_desc); - s.bl_desc = new TreeDesc(s.bl_tree, static_bl_desc); +Point.prototype = { + clone: function() { return new Point(this.x, this.y); }, - s.bi_buf = 0; - s.bi_valid = 0; + add: function(p) { return this.clone()._add(p); }, + sub: function(p) { return this.clone()._sub(p); }, + mult: function(k) { return this.clone()._mult(k); }, + div: function(k) { return this.clone()._div(k); }, + rotate: function(a) { return this.clone()._rotate(a); }, + matMult: function(m) { return this.clone()._matMult(m); }, + unit: function() { return this.clone()._unit(); }, + perp: function() { return this.clone()._perp(); }, + round: function() { return this.clone()._round(); }, - /* Initialize the first block of the first file: */ - init_block(s); -} + mag: function() { + return Math.sqrt(this.x * this.x + this.y * this.y); + }, + equals: function(p) { + return this.x === p.x && + this.y === p.y; + }, -/* =========================================================================== - * Send a stored block - */ -function _tr_stored_block(s, buf, stored_len, last) -//DeflateState *s; -//charf *buf; /* input block */ -//ulg stored_len; /* length of input block */ -//int last; /* one if this is the last block for a file */ -{ - send_bits(s, (STORED_BLOCK << 1) + (last ? 1 : 0), 3); /* send block type */ - copy_block(s, buf, stored_len, true); /* with header */ -} + dist: function(p) { + return Math.sqrt(this.distSqr(p)); + }, + distSqr: function(p) { + var dx = p.x - this.x, + dy = p.y - this.y; + return dx * dx + dy * dy; + }, -/* =========================================================================== - * Send one empty static block to give enough lookahead for inflate. - * This takes 10 bits, of which 7 may remain in the bit buffer. - */ -function _tr_align(s) { - send_bits(s, STATIC_TREES << 1, 3); - send_code(s, END_BLOCK, static_ltree); - bi_flush(s); -} + angle: function() { + return Math.atan2(this.y, this.x); + }, + angleTo: function(b) { + return Math.atan2(this.y - b.y, this.x - b.x); + }, -/* =========================================================================== - * Determine the best encoding for the current block: dynamic trees, static - * trees or store, and output the encoded block to the zip file. - */ -function _tr_flush_block(s, buf, stored_len, last) -//DeflateState *s; -//charf *buf; /* input block, or NULL if too old */ -//ulg stored_len; /* length of input block */ -//int last; /* one if this is the last block for a file */ -{ - var opt_lenb, static_lenb; /* opt_len and static_len in bytes */ - var max_blindex = 0; /* index of last bit length code of non zero freq */ + angleWith: function(b) { + return this.angleWithSep(b.x, b.y); + }, - /* Build the Huffman trees unless a stored block is forced */ - if (s.level > 0) { + // Find the angle of the two vectors, solving the formula for the cross product a x b = |a||b|sin(θ) for θ. + angleWithSep: function(x, y) { + return Math.atan2( + this.x * y - this.y * x, + this.x * x + this.y * y); + }, - /* Check if the file is binary or text */ - if (s.strm.data_type === Z_UNKNOWN) { - s.strm.data_type = detect_data_type(s); - } + _matMult: function(m) { + var x = m[0] * this.x + m[1] * this.y, + y = m[2] * this.x + m[3] * this.y; + this.x = x; + this.y = y; + return this; + }, - /* Construct the literal and distance trees */ - build_tree(s, s.l_desc); - // Tracev((stderr, "\nlit data: dyn %ld, stat %ld", s->opt_len, - // s->static_len)); + _add: function(p) { + this.x += p.x; + this.y += p.y; + return this; + }, - build_tree(s, s.d_desc); - // Tracev((stderr, "\ndist data: dyn %ld, stat %ld", s->opt_len, - // s->static_len)); - /* At this point, opt_len and static_len are the total bit lengths of - * the compressed block data, excluding the tree representations. - */ + _sub: function(p) { + this.x -= p.x; + this.y -= p.y; + return this; + }, - /* Build the bit length tree for the above two trees, and get the index - * in bl_order of the last bit length code to send. - */ - max_blindex = build_bl_tree(s); + _mult: function(k) { + this.x *= k; + this.y *= k; + return this; + }, - /* Determine the best encoding. Compute the block lengths in bytes. */ - opt_lenb = (s.opt_len + 3 + 7) >>> 3; - static_lenb = (s.static_len + 3 + 7) >>> 3; + _div: function(k) { + this.x /= k; + this.y /= k; + return this; + }, - // Tracev((stderr, "\nopt %lu(%lu) stat %lu(%lu) stored %lu lit %u ", - // opt_lenb, s->opt_len, static_lenb, s->static_len, stored_len, - // s->last_lit)); + _unit: function() { + this._div(this.mag()); + return this; + }, - if (static_lenb <= opt_lenb) { opt_lenb = static_lenb; } + _perp: function() { + var y = this.y; + this.y = this.x; + this.x = -y; + return this; + }, - } else { - // Assert(buf != (char*)0, "lost buf"); - opt_lenb = static_lenb = stored_len + 5; /* force a stored block */ - } + _rotate: function(angle) { + var cos = Math.cos(angle), + sin = Math.sin(angle), + x = cos * this.x - sin * this.y, + y = sin * this.x + cos * this.y; + this.x = x; + this.y = y; + return this; + }, - if ((stored_len + 4 <= opt_lenb) && (buf !== -1)) { - /* 4: two words for the lengths */ + _round: function() { + this.x = Math.round(this.x); + this.y = Math.round(this.y); + return this; + } +}; - /* The test buf != NULL is only necessary if LIT_BUFSIZE > WSIZE. - * Otherwise we can't have processed more than WSIZE input bytes since - * the last block flush, because compression would have been - * successful. If LIT_BUFSIZE <= WSIZE, it is never too late to - * transform a block into a stored block. - */ - _tr_stored_block(s, buf, stored_len, last); +// constructs Point from an array if necessary +Point.convert = function (a) { + if (a instanceof Point) { + return a; + } + if (Array.isArray(a)) { + return new Point(a[0], a[1]); + } + return a; +}; - } else if (s.strategy === Z_FIXED || static_lenb === opt_lenb) { +},{}],175:[function(_dereq_,module,exports){ +(function (process){ +'use strict'; - send_bits(s, (STATIC_TREES << 1) + (last ? 1 : 0), 3); - compress_block(s, static_ltree, static_dtree); +if (!process.version || + process.version.indexOf('v0.') === 0 || + process.version.indexOf('v1.') === 0 && process.version.indexOf('v1.8.') !== 0) { + module.exports = nextTick; +} else { + module.exports = process.nextTick; +} - } else { - send_bits(s, (DYN_TREES << 1) + (last ? 1 : 0), 3); - send_all_trees(s, s.l_desc.max_code + 1, s.d_desc.max_code + 1, max_blindex + 1); - compress_block(s, s.dyn_ltree, s.dyn_dtree); +function nextTick(fn, arg1, arg2, arg3) { + if (typeof fn !== 'function') { + throw new TypeError('"callback" argument must be a function'); } - // Assert (s->compressed_len == s->bits_sent, "bad compressed size"); - /* The above check is made mod 2^32, for files larger than 512 MB - * and uLong implemented on 32 bits. - */ - init_block(s); - - if (last) { - bi_windup(s); + var len = arguments.length; + var args, i; + switch (len) { + case 0: + case 1: + return process.nextTick(fn); + case 2: + return process.nextTick(function afterTickOne() { + fn.call(null, arg1); + }); + case 3: + return process.nextTick(function afterTickTwo() { + fn.call(null, arg1, arg2); + }); + case 4: + return process.nextTick(function afterTickThree() { + fn.call(null, arg1, arg2, arg3); + }); + default: + args = new Array(len - 1); + i = 0; + while (i < args.length) { + args[i++] = arguments[i]; + } + return process.nextTick(function afterTick() { + fn.apply(null, args); + }); } - // Tracev((stderr,"\ncomprlen %lu(%lu) ", s->compressed_len>>3, - // s->compressed_len-7*last)); } -/* =========================================================================== - * Save the match info and tally the frequency counts. Return true if - * the current block must be flushed. - */ -function _tr_tally(s, dist, lc) -// deflate_state *s; -// unsigned dist; /* distance of matched string */ -// unsigned lc; /* match length-MIN_MATCH or unmatched char (if dist==0) */ -{ - //var out_length, in_length, dcode; +}).call(this,_dereq_('_process')) - s.pending_buf[s.d_buf + s.last_lit * 2] = (dist >>> 8) & 0xff; - s.pending_buf[s.d_buf + s.last_lit * 2 + 1] = dist & 0xff; +},{"_process":176}],176:[function(_dereq_,module,exports){ +// shim for using process in browser +var process = module.exports = {}; - s.pending_buf[s.l_buf + s.last_lit] = lc & 0xff; - s.last_lit++; +// cached from whatever global is present so that test runners that stub it +// don't break things. But we need to wrap it in a try catch in case it is +// wrapped in strict mode code which doesn't define any globals. It's inside a +// function because try/catches deoptimize in certain engines. - if (dist === 0) { - /* lc is the unmatched char */ - s.dyn_ltree[lc * 2]/*.Freq*/++; - } else { - s.matches++; - /* Here, lc is the match length - MIN_MATCH */ - dist--; /* dist = match distance - 1 */ - //Assert((ush)dist < (ush)MAX_DIST(s) && - // (ush)lc <= (ush)(MAX_MATCH-MIN_MATCH) && - // (ush)d_code(dist) < (ush)D_CODES, "_tr_tally: bad match"); +var cachedSetTimeout; +var cachedClearTimeout; - s.dyn_ltree[(_length_code[lc] + LITERALS + 1) * 2]/*.Freq*/++; - s.dyn_dtree[d_code(dist) * 2]/*.Freq*/++; - } +function defaultSetTimout() { + throw new Error('setTimeout has not been defined'); +} +function defaultClearTimeout () { + throw new Error('clearTimeout has not been defined'); +} +(function () { + try { + if (typeof setTimeout === 'function') { + cachedSetTimeout = setTimeout; + } else { + cachedSetTimeout = defaultSetTimout; + } + } catch (e) { + cachedSetTimeout = defaultSetTimout; + } + try { + if (typeof clearTimeout === 'function') { + cachedClearTimeout = clearTimeout; + } else { + cachedClearTimeout = defaultClearTimeout; + } + } catch (e) { + cachedClearTimeout = defaultClearTimeout; + } +} ()) +function runTimeout(fun) { + if (cachedSetTimeout === setTimeout) { + //normal enviroments in sane situations + return setTimeout(fun, 0); + } + // if setTimeout wasn't available but was latter defined + if ((cachedSetTimeout === defaultSetTimout || !cachedSetTimeout) && setTimeout) { + cachedSetTimeout = setTimeout; + return setTimeout(fun, 0); + } + try { + // when when somebody has screwed with setTimeout but no I.E. maddness + return cachedSetTimeout(fun, 0); + } catch(e){ + try { + // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally + return cachedSetTimeout.call(null, fun, 0); + } catch(e){ + // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error + return cachedSetTimeout.call(this, fun, 0); + } + } + + +} +function runClearTimeout(marker) { + if (cachedClearTimeout === clearTimeout) { + //normal enviroments in sane situations + return clearTimeout(marker); + } + // if clearTimeout wasn't available but was latter defined + if ((cachedClearTimeout === defaultClearTimeout || !cachedClearTimeout) && clearTimeout) { + cachedClearTimeout = clearTimeout; + return clearTimeout(marker); + } + try { + // when when somebody has screwed with setTimeout but no I.E. maddness + return cachedClearTimeout(marker); + } catch (e){ + try { + // When we are in I.E. but the script has been evaled so I.E. doesn't trust the global object when called normally + return cachedClearTimeout.call(null, marker); + } catch (e){ + // same as above but when it's a version of I.E. that must have the global object for 'this', hopfully our context correct otherwise it will throw a global error. + // Some versions of I.E. have different rules for clearTimeout vs setTimeout + return cachedClearTimeout.call(this, marker); + } + } -// (!) This block is disabled in zlib defailts, -// don't enable it for binary compatibility -//#ifdef TRUNCATE_BLOCK -// /* Try to guess if it is profitable to stop the current block here */ -// if ((s.last_lit & 0x1fff) === 0 && s.level > 2) { -// /* Compute an upper bound for the compressed length */ -// out_length = s.last_lit*8; -// in_length = s.strstart - s.block_start; -// -// for (dcode = 0; dcode < D_CODES; dcode++) { -// out_length += s.dyn_dtree[dcode*2]/*.Freq*/ * (5 + extra_dbits[dcode]); -// } -// out_length >>>= 3; -// //Tracev((stderr,"\nlast_lit %u, in %ld, out ~%ld(%ld%%) ", -// // s->last_lit, in_length, out_length, -// // 100L - out_length*100L/in_length)); -// if (s.matches < (s.last_lit>>1)/*int /2*/ && out_length < (in_length>>1)/*int /2*/) { -// return true; -// } -// } -//#endif - return (s.last_lit === s.lit_bufsize - 1); - /* We avoid equality with lit_bufsize because of wraparound at 64K - * on 16 bit machines and because stored blocks are restricted to - * 64K-1 bytes. - */ } +var queue = []; +var draining = false; +var currentQueue; +var queueIndex = -1; -exports._tr_init = _tr_init; -exports._tr_stored_block = _tr_stored_block; -exports._tr_flush_block = _tr_flush_block; -exports._tr_tally = _tr_tally; -exports._tr_align = _tr_align; +function cleanUpNextTick() { + if (!draining || !currentQueue) { + return; + } + draining = false; + if (currentQueue.length) { + queue = currentQueue.concat(queue); + } else { + queueIndex = -1; + } + if (queue.length) { + drainQueue(); + } +} -},{"../utils/common":161}],173:[function(_dereq_,module,exports){ -'use strict'; +function drainQueue() { + if (draining) { + return; + } + var timeout = runTimeout(cleanUpNextTick); + draining = true; + var len = queue.length; + while(len) { + currentQueue = queue; + queue = []; + while (++queueIndex < len) { + if (currentQueue) { + currentQueue[queueIndex].run(); + } + } + queueIndex = -1; + len = queue.length; + } + currentQueue = null; + draining = false; + runClearTimeout(timeout); +} -function ZStream() { - /* next input byte */ - this.input = null; // JS specific, because we have no pointers - this.next_in = 0; - /* number of bytes available at input */ - this.avail_in = 0; - /* total number of input bytes read so far */ - this.total_in = 0; - /* next output byte should be put there */ - this.output = null; // JS specific, because we have no pointers - this.next_out = 0; - /* remaining free space at output */ - this.avail_out = 0; - /* total number of bytes output so far */ - this.total_out = 0; - /* last error message, NULL if no error */ - this.msg = ''/*Z_NULL*/; - /* not visible by applications */ - this.state = null; - /* best guess about the data type: binary or text */ - this.data_type = 2/*Z_UNKNOWN*/; - /* adler32 value of the uncompressed data */ - this.adler = 0; +process.nextTick = function (fun) { + var args = new Array(arguments.length - 1); + if (arguments.length > 1) { + for (var i = 1; i < arguments.length; i++) { + args[i - 1] = arguments[i]; + } + } + queue.push(new Item(fun, args)); + if (queue.length === 1 && !draining) { + runTimeout(drainQueue); + } +}; + +// v8 likes predictible objects +function Item(fun, array) { + this.fun = fun; + this.array = array; } +Item.prototype.run = function () { + this.fun.apply(null, this.array); +}; +process.title = 'browser'; +process.browser = true; +process.env = {}; +process.argv = []; +process.version = ''; // empty string to avoid regexp issues +process.versions = {}; -module.exports = ZStream; +function noop() {} + +process.on = noop; +process.addListener = noop; +process.once = noop; +process.off = noop; +process.removeListener = noop; +process.removeAllListeners = noop; +process.emit = noop; + +process.binding = function (name) { + throw new Error('process.binding is not supported'); +}; + +process.cwd = function () { return '/' }; +process.chdir = function (dir) { + throw new Error('process.chdir is not supported'); +}; +process.umask = function() { return 0; }; -},{}],174:[function(_dereq_,module,exports){ +},{}],177:[function(_dereq_,module,exports){ // a duplex stream is just a stream that is both readable and writable. // Since JS doesn't have multiple prototypal inheritance, this class // prototypally inherits from Readable, and then parasitically from @@ -19927,7 +20211,7 @@ function forEach(xs, f) { f(xs[i], i); } } -},{"./_stream_readable":176,"./_stream_writable":178,"core-util-is":179,"inherits":180,"process-nextick-args":182}],175:[function(_dereq_,module,exports){ +},{"./_stream_readable":179,"./_stream_writable":181,"core-util-is":70,"inherits":92,"process-nextick-args":175}],178:[function(_dereq_,module,exports){ // a passthrough stream. // basically just the most minimal sort of Transform stream. // Every written chunk gets output as-is. @@ -19954,7 +20238,7 @@ function PassThrough(options) { PassThrough.prototype._transform = function (chunk, encoding, cb) { cb(null, chunk); }; -},{"./_stream_transform":177,"core-util-is":179,"inherits":180}],176:[function(_dereq_,module,exports){ +},{"./_stream_transform":180,"core-util-is":70,"inherits":92}],179:[function(_dereq_,module,exports){ (function (process){ 'use strict'; @@ -20838,7 +21122,7 @@ function indexOf(xs, x) { } }).call(this,_dereq_('_process')) -},{"./_stream_duplex":174,"_process":8,"buffer":2,"core-util-is":179,"events":6,"inherits":180,"isarray":181,"process-nextick-args":182,"string_decoder/":183,"util":1}],177:[function(_dereq_,module,exports){ +},{"./_stream_duplex":177,"_process":176,"buffer":5,"core-util-is":70,"events":73,"inherits":92,"isarray":94,"process-nextick-args":175,"string_decoder/":183,"util":4}],180:[function(_dereq_,module,exports){ // a transform stream is a readable/writable stream where you do // something with the data. Sometimes it's called a "filter", // but that's not a great name for it, since that implies a thing where @@ -21019,7 +21303,7 @@ function done(stream, er) { return stream.push(null); } -},{"./_stream_duplex":174,"core-util-is":179,"inherits":180}],178:[function(_dereq_,module,exports){ +},{"./_stream_duplex":177,"core-util-is":70,"inherits":92}],181:[function(_dereq_,module,exports){ (function (process){ // A bit simpler than readable streams. // Implement an async ._write(chunk, encoding, cb), and it'll handle all @@ -21539,171 +21823,21 @@ function CorkedRequest(state) { } }).call(this,_dereq_('_process')) -},{"./_stream_duplex":174,"_process":8,"buffer":2,"core-util-is":179,"events":6,"inherits":180,"process-nextick-args":182,"util-deprecate":184}],179:[function(_dereq_,module,exports){ -(function (Buffer){ -// Copyright Joyent, Inc. and other Node contributors. -// -// Permission is hereby granted, free of charge, to any person obtaining a -// copy of this software and associated documentation files (the -// "Software"), to deal in the Software without restriction, including -// without limitation the rights to use, copy, modify, merge, publish, -// distribute, sublicense, and/or sell copies of the Software, and to permit -// persons to whom the Software is furnished to do so, subject to the -// following conditions: -// -// The above copyright notice and this permission notice shall be included -// in all copies or substantial portions of the Software. -// -// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS -// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF -// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN -// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, -// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR -// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE -// USE OR OTHER DEALINGS IN THE SOFTWARE. - -// NOTE: These type checking functions intentionally don't use `instanceof` -// because it is fragile and can be easily faked with `Object.create()`. - -function isArray(arg) { - if (Array.isArray) { - return Array.isArray(arg); - } - return objectToString(arg) === '[object Array]'; -} -exports.isArray = isArray; - -function isBoolean(arg) { - return typeof arg === 'boolean'; -} -exports.isBoolean = isBoolean; - -function isNull(arg) { - return arg === null; -} -exports.isNull = isNull; - -function isNullOrUndefined(arg) { - return arg == null; -} -exports.isNullOrUndefined = isNullOrUndefined; - -function isNumber(arg) { - return typeof arg === 'number'; -} -exports.isNumber = isNumber; - -function isString(arg) { - return typeof arg === 'string'; -} -exports.isString = isString; - -function isSymbol(arg) { - return typeof arg === 'symbol'; -} -exports.isSymbol = isSymbol; - -function isUndefined(arg) { - return arg === void 0; -} -exports.isUndefined = isUndefined; - -function isRegExp(re) { - return objectToString(re) === '[object RegExp]'; -} -exports.isRegExp = isRegExp; - -function isObject(arg) { - return typeof arg === 'object' && arg !== null; -} -exports.isObject = isObject; - -function isDate(d) { - return objectToString(d) === '[object Date]'; -} -exports.isDate = isDate; - -function isError(e) { - return (objectToString(e) === '[object Error]' || e instanceof Error); -} -exports.isError = isError; - -function isFunction(arg) { - return typeof arg === 'function'; -} -exports.isFunction = isFunction; - -function isPrimitive(arg) { - return arg === null || - typeof arg === 'boolean' || - typeof arg === 'number' || - typeof arg === 'string' || - typeof arg === 'symbol' || // ES6 symbol - typeof arg === 'undefined'; -} -exports.isPrimitive = isPrimitive; - -exports.isBuffer = Buffer.isBuffer; - -function objectToString(o) { - return Object.prototype.toString.call(o); -} - -}).call(this,{"isBuffer":_dereq_("../../../../../../browserify/node_modules/insert-module-globals/node_modules/is-buffer/index.js")}) - -},{"../../../../../../browserify/node_modules/insert-module-globals/node_modules/is-buffer/index.js":7}],180:[function(_dereq_,module,exports){ -arguments[4][9][0].apply(exports,arguments) -},{"dup":9}],181:[function(_dereq_,module,exports){ -arguments[4][5][0].apply(exports,arguments) -},{"dup":5}],182:[function(_dereq_,module,exports){ -(function (process){ -'use strict'; - -if (!process.version || - process.version.indexOf('v0.') === 0 || - process.version.indexOf('v1.') === 0 && process.version.indexOf('v1.8.') !== 0) { - module.exports = nextTick; -} else { - module.exports = process.nextTick; -} - -function nextTick(fn, arg1, arg2, arg3) { - if (typeof fn !== 'function') { - throw new TypeError('"callback" argument must be a function'); - } - var len = arguments.length; - var args, i; - switch (len) { - case 0: - case 1: - return process.nextTick(fn); - case 2: - return process.nextTick(function afterTickOne() { - fn.call(null, arg1); - }); - case 3: - return process.nextTick(function afterTickTwo() { - fn.call(null, arg1, arg2); - }); - case 4: - return process.nextTick(function afterTickThree() { - fn.call(null, arg1, arg2, arg3); - }); - default: - args = new Array(len - 1); - i = 0; - while (i < args.length) { - args[i++] = arguments[i]; - } - return process.nextTick(function afterTick() { - fn.apply(null, args); - }); - } -} - -}).call(this,_dereq_('_process')) +},{"./_stream_duplex":177,"_process":176,"buffer":5,"core-util-is":70,"events":73,"inherits":92,"process-nextick-args":175,"util-deprecate":186}],182:[function(_dereq_,module,exports){ +var Stream = (function (){ + try { + return _dereq_('st' + 'ream'); // hack to fix a circular dependency issue when used with browserify + } catch(_){} +}()); +exports = module.exports = _dereq_('./lib/_stream_readable.js'); +exports.Stream = Stream || exports; +exports.Readable = exports; +exports.Writable = _dereq_('./lib/_stream_writable.js'); +exports.Duplex = _dereq_('./lib/_stream_duplex.js'); +exports.Transform = _dereq_('./lib/_stream_transform.js'); +exports.PassThrough = _dereq_('./lib/_stream_passthrough.js'); -},{"_process":8}],183:[function(_dereq_,module,exports){ +},{"./lib/_stream_duplex.js":177,"./lib/_stream_passthrough.js":178,"./lib/_stream_readable.js":179,"./lib/_stream_transform.js":180,"./lib/_stream_writable.js":181}],183:[function(_dereq_,module,exports){ // Copyright Joyent, Inc. and other Node contributors. // // Permission is hereby granted, free of charge, to any person obtaining a @@ -21784,1164 +21918,1017 @@ var StringDecoder = exports.StringDecoder = function(encoding) { }; -// write decodes the given buffer and returns it as JS string that is -// guaranteed to not contain any partial multi-byte characters. Any partial -// character found at the end of the buffer is buffered up, and will be -// returned when calling write again with the remaining bytes. -// -// Note: Converting a Buffer containing an orphan surrogate to a String -// currently works, but converting a String to a Buffer (via `new Buffer`, or -// Buffer#write) will replace incomplete surrogates with the unicode -// replacement character. See https://codereview.chromium.org/121173009/ . -StringDecoder.prototype.write = function(buffer) { - var charStr = ''; - // if our last write ended with an incomplete multibyte character - while (this.charLength) { - // determine how many remaining bytes this buffer has to offer for this char - var available = (buffer.length >= this.charLength - this.charReceived) ? - this.charLength - this.charReceived : - buffer.length; - - // add the new bytes to the char buffer - buffer.copy(this.charBuffer, this.charReceived, 0, available); - this.charReceived += available; - - if (this.charReceived < this.charLength) { - // still not enough chars in this buffer? wait for more ... - return ''; - } - - // remove bytes belonging to the current character from the buffer - buffer = buffer.slice(available, buffer.length); - - // get the character that was split - charStr = this.charBuffer.slice(0, this.charLength).toString(this.encoding); - - // CESU-8: lead surrogate (D800-DBFF) is also the incomplete character - var charCode = charStr.charCodeAt(charStr.length - 1); - if (charCode >= 0xD800 && charCode <= 0xDBFF) { - this.charLength += this.surrogateSize; - charStr = ''; - continue; - } - this.charReceived = this.charLength = 0; - - // if there are no more bytes in this buffer, just emit our char - if (buffer.length === 0) { - return charStr; - } - break; - } - - // determine and set charLength / charReceived - this.detectIncompleteChar(buffer); - - var end = buffer.length; - if (this.charLength) { - // buffer the incomplete character bytes we got - buffer.copy(this.charBuffer, 0, buffer.length - this.charReceived, end); - end -= this.charReceived; - } - - charStr += buffer.toString(this.encoding, 0, end); - - var end = charStr.length - 1; - var charCode = charStr.charCodeAt(end); - // CESU-8: lead surrogate (D800-DBFF) is also the incomplete character - if (charCode >= 0xD800 && charCode <= 0xDBFF) { - var size = this.surrogateSize; - this.charLength += size; - this.charReceived += size; - this.charBuffer.copy(this.charBuffer, size, 0, size); - buffer.copy(this.charBuffer, 0, 0, size); - return charStr.substring(0, end); - } - - // or just emit the charStr - return charStr; -}; - -// detectIncompleteChar determines if there is an incomplete UTF-8 character at -// the end of the given buffer. If so, it sets this.charLength to the byte -// length that character, and sets this.charReceived to the number of bytes -// that are available for this character. -StringDecoder.prototype.detectIncompleteChar = function(buffer) { - // determine how many bytes we have to check at the end of this buffer - var i = (buffer.length >= 3) ? 3 : buffer.length; - - // Figure out if one of the last i bytes of our buffer announces an - // incomplete char. - for (; i > 0; i--) { - var c = buffer[buffer.length - i]; - - // See http://en.wikipedia.org/wiki/UTF-8#Description - - // 110XXXXX - if (i == 1 && c >> 5 == 0x06) { - this.charLength = 2; - break; - } - - // 1110XXXX - if (i <= 2 && c >> 4 == 0x0E) { - this.charLength = 3; - break; - } - - // 11110XXX - if (i <= 3 && c >> 3 == 0x1E) { - this.charLength = 4; - break; - } - } - this.charReceived = i; -}; - -StringDecoder.prototype.end = function(buffer) { - var res = ''; - if (buffer && buffer.length) - res = this.write(buffer); - - if (this.charReceived) { - var cr = this.charReceived; - var buf = this.charBuffer; - var enc = this.encoding; - res += buf.slice(0, cr).toString(enc); - } - - return res; -}; - -function passThroughWrite(buffer) { - return buffer.toString(this.encoding); -} - -function utf16DetectIncompleteChar(buffer) { - this.charReceived = buffer.length % 2; - this.charLength = this.charReceived ? 2 : 0; -} - -function base64DetectIncompleteChar(buffer) { - this.charReceived = buffer.length % 3; - this.charLength = this.charReceived ? 3 : 0; -} - -},{"buffer":2}],184:[function(_dereq_,module,exports){ -(function (global){ - -/** - * Module exports. - */ - -module.exports = deprecate; - -/** - * Mark that a method should not be used. - * Returns a modified function which warns once by default. - * - * If `localStorage.noDeprecation = true` is set, then it is a no-op. - * - * If `localStorage.throwDeprecation = true` is set, then deprecated functions - * will throw an Error when invoked. - * - * If `localStorage.traceDeprecation = true` is set, then deprecated functions - * will invoke `console.trace()` instead of `console.error()`. - * - * @param {Function} fn - the function to deprecate - * @param {String} msg - the string to print to the console when `fn` is invoked - * @returns {Function} a new "deprecated" version of `fn` - * @api public - */ - -function deprecate (fn, msg) { - if (config('noDeprecation')) { - return fn; - } - - var warned = false; - function deprecated() { - if (!warned) { - if (config('throwDeprecation')) { - throw new Error(msg); - } else if (config('traceDeprecation')) { - console.trace(msg); - } else { - console.warn(msg); - } - warned = true; - } - return fn.apply(this, arguments); - } - - return deprecated; -} - -/** - * Checks `localStorage` for boolean values for the given `name`. - * - * @param {String} name - * @returns {Boolean} - * @api private - */ - -function config (name) { - // accessing global.localStorage can trigger a DOMException in sandboxed iframes - try { - if (!global.localStorage) return false; - } catch (_) { - return false; - } - var val = global.localStorage[name]; - if (null == val) return false; - return String(val).toLowerCase() === 'true'; -} - -}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) - -},{}],185:[function(_dereq_,module,exports){ -var Stream = (function (){ - try { - return _dereq_('st' + 'ream'); // hack to fix a circular dependency issue when used with browserify - } catch(_){} -}()); -exports = module.exports = _dereq_('./lib/_stream_readable.js'); -exports.Stream = Stream || exports; -exports.Readable = exports; -exports.Writable = _dereq_('./lib/_stream_writable.js'); -exports.Duplex = _dereq_('./lib/_stream_duplex.js'); -exports.Transform = _dereq_('./lib/_stream_transform.js'); -exports.PassThrough = _dereq_('./lib/_stream_passthrough.js'); - -},{"./lib/_stream_duplex.js":174,"./lib/_stream_passthrough.js":175,"./lib/_stream_readable.js":176,"./lib/_stream_transform.js":177,"./lib/_stream_writable.js":178}],186:[function(_dereq_,module,exports){ -'use strict'; - -function notNull(x) { return x != null; } -function wrap(x) { return '(' + x + ')';} - -function maybeQuote(value) { - if (typeof value === 'string') { - return '"' + value + '"'; - } - return value; -} - -function lookUp(key) { - if (key[0] === '$') { - return 'context.' + key.substring(1); - } - return 'context.feature.properties.' + key; -} - -function nullValue(key, value) { - return ' true '; -} - -function propertyEqual(key, value) { - return wrap(maybeQuote(value) + ' === ' + lookUp(key)); -} - -function propertyOr(key, values) { - return wrap(values.map(function (x) { return propertyEqual(key, x); }).join(' || ')); -} - -function printNested(values, joiner) { - return wrap(values.filter(notNull).map(function (x) { - return wrap(x.join(' && ')); - }).join(' ' + joiner + ' ')); -} - -function any(_, values, options) { - return (values && values.length > 0) ? printNested(values.map(function(v) { return parseFilter(v, options) }), '||') : 'true'; -} - -function all(_, values, options) { - return (values && values.length > 0) ? printNested(values.map(function(v) { return parseFilter(v, options) }), '&&') : 'true'; -} - -function not(key, value, options) { - return '!' + wrap(parseFilter(value, options).join(' && ')); -} - -function none(key, values, options) { - return '!' + wrap(any(null, values, options)); -} - -function propertyMatchesBoolean(key, value) { - return wrap(lookUp(key) + (value ? ' != ' : ' == ') + 'null'); -} - -function rangeMatch(key, values, options) { - var expressions = []; - var transform = options && (typeof options.rangeTransform === 'function') && options.rangeTransform; - - if (values.max) { - var max = transform ? transform(values.max) : values.max; - expressions.push('' + lookUp(key) + ' < ' + max); - } +// write decodes the given buffer and returns it as JS string that is +// guaranteed to not contain any partial multi-byte characters. Any partial +// character found at the end of the buffer is buffered up, and will be +// returned when calling write again with the remaining bytes. +// +// Note: Converting a Buffer containing an orphan surrogate to a String +// currently works, but converting a String to a Buffer (via `new Buffer`, or +// Buffer#write) will replace incomplete surrogates with the unicode +// replacement character. See https://codereview.chromium.org/121173009/ . +StringDecoder.prototype.write = function(buffer) { + var charStr = ''; + // if our last write ended with an incomplete multibyte character + while (this.charLength) { + // determine how many remaining bytes this buffer has to offer for this char + var available = (buffer.length >= this.charLength - this.charReceived) ? + this.charLength - this.charReceived : + buffer.length; - if (values.min) { - var min = transform ? min = transform(values.min) : values.min; - expressions.push('' + lookUp(key) + ' >= ' + min); + // add the new bytes to the char buffer + buffer.copy(this.charBuffer, this.charReceived, 0, available); + this.charReceived += available; + + if (this.charReceived < this.charLength) { + // still not enough chars in this buffer? wait for more ... + return ''; } - return wrap(expressions.join(' && ')); -} + // remove bytes belonging to the current character from the buffer + buffer = buffer.slice(available, buffer.length); -function parseFilter(filter, options) { - var filterAST = []; + // get the character that was split + charStr = this.charBuffer.slice(0, this.charLength).toString(this.encoding); - // Function filter - if (typeof filter === 'function') { - return [wrap(filter.toString() + '(context)')]; - } - // Array filter, implicit 'any' - else if (Array.isArray(filter)) { - return [any(null, filter, options)]; - } - // Null filter object - else if (filter == null) { - return ['true']; + // CESU-8: lead surrogate (D800-DBFF) is also the incomplete character + var charCode = charStr.charCodeAt(charStr.length - 1); + if (charCode >= 0xD800 && charCode <= 0xDBFF) { + this.charLength += this.surrogateSize; + charStr = ''; + continue; } + this.charReceived = this.charLength = 0; - // Object filter, e.g. implicit 'all' - var keys = Object.keys(filter); - for (var k=0; k < keys.length; k++) { - var key = keys[k]; - - var value = filter[key], - type = typeof value; - if (type === 'string' || type === 'number') { - filterAST.push(propertyEqual(key, value)); - } else if (type === 'boolean') { - filterAST.push(propertyMatchesBoolean(key, value)); - } else if (key === 'not') { - filterAST.push(not(key, value, options)); - } else if (key === 'any') { - filterAST.push(any(key, value, options)); - } else if (key === 'all') { - filterAST.push(all(key, value, options)); - } else if (key === 'none') { - filterAST.push(none(key, value, options)); - } else if (Array.isArray(value)) { - filterAST.push(propertyOr(key, value)); - } else if (type === 'object' && value != null) { - if (value.max || value.min) { - filterAST.push(rangeMatch(key, value, options)); - } - } else if (value == null) { - filterAST.push(nullValue(key, value)); - } else { - throw new Error('Unknown Query sytnax: ' + value); - } + // if there are no more bytes in this buffer, just emit our char + if (buffer.length === 0) { + return charStr; } + break; + } - return keys.length === 0 ? ['true'] : filterAST; -} + // determine and set charLength / charReceived + this.detectIncompleteChar(buffer); -function filterToString(filterAST) { - return wrap(filterAST.join(' && ')); -} + var end = buffer.length; + if (this.charLength) { + // buffer the incomplete character bytes we got + buffer.copy(this.charBuffer, 0, buffer.length - this.charReceived, end); + end -= this.charReceived; + } -function match(filter, options) { - if (filter == null) { return function () { return true; }; } - // jshint evil: true - return new Function('context', 'return ' + filterToString(parseFilter(filter, options)) + ';'); -} + charStr += buffer.toString(this.encoding, 0, end); -module.exports = { - match: match, - filterToString: filterToString, - parseFilter: parseFilter + var end = charStr.length - 1; + var charCode = charStr.charCodeAt(end); + // CESU-8: lead surrogate (D800-DBFF) is also the incomplete character + if (charCode >= 0xD800 && charCode <= 0xDBFF) { + var size = this.surrogateSize; + this.charLength += size; + this.charReceived += size; + this.charBuffer.copy(this.charBuffer, size, 0, size); + buffer.copy(this.charBuffer, 0, 0, size); + return charStr.substring(0, end); + } + + // or just emit the charStr + return charStr; }; -},{}],187:[function(_dereq_,module,exports){ -'use strict'; +// detectIncompleteChar determines if there is an incomplete UTF-8 character at +// the end of the given buffer. If so, it sets this.charLength to the byte +// length that character, and sets this.charReceived to the number of bytes +// that are available for this character. +StringDecoder.prototype.detectIncompleteChar = function(buffer) { + // determine how many bytes we have to check at the end of this buffer + var i = (buffer.length >= 3) ? 3 : buffer.length; -// lightweight Buffer shim for pbf browser build -// based on code from github.com/feross/buffer (MIT-licensed) + // Figure out if one of the last i bytes of our buffer announces an + // incomplete char. + for (; i > 0; i--) { + var c = buffer[buffer.length - i]; -module.exports = Buffer; + // See http://en.wikipedia.org/wiki/UTF-8#Description -var ieee754 = _dereq_('ieee754'); + // 110XXXXX + if (i == 1 && c >> 5 == 0x06) { + this.charLength = 2; + break; + } -var BufferMethods; + // 1110XXXX + if (i <= 2 && c >> 4 == 0x0E) { + this.charLength = 3; + break; + } -function Buffer(length) { - var arr; - if (length && length.length) { - arr = length; - length = arr.length; + // 11110XXX + if (i <= 3 && c >> 3 == 0x1E) { + this.charLength = 4; + break; } - var buf = new Uint8Array(length || 0); - if (arr) buf.set(arr); + } + this.charReceived = i; +}; - buf.readUInt32LE = BufferMethods.readUInt32LE; - buf.writeUInt32LE = BufferMethods.writeUInt32LE; - buf.readInt32LE = BufferMethods.readInt32LE; - buf.writeInt32LE = BufferMethods.writeInt32LE; - buf.readFloatLE = BufferMethods.readFloatLE; - buf.writeFloatLE = BufferMethods.writeFloatLE; - buf.readDoubleLE = BufferMethods.readDoubleLE; - buf.writeDoubleLE = BufferMethods.writeDoubleLE; - buf.toString = BufferMethods.toString; - buf.write = BufferMethods.write; - buf.slice = BufferMethods.slice; - buf.copy = BufferMethods.copy; +StringDecoder.prototype.end = function(buffer) { + var res = ''; + if (buffer && buffer.length) + res = this.write(buffer); - buf._isBuffer = true; - return buf; + if (this.charReceived) { + var cr = this.charReceived; + var buf = this.charBuffer; + var enc = this.encoding; + res += buf.slice(0, cr).toString(enc); + } + + return res; +}; + +function passThroughWrite(buffer) { + return buffer.toString(this.encoding); } -var lastStr, lastStrEncoded; +function utf16DetectIncompleteChar(buffer) { + this.charReceived = buffer.length % 2; + this.charLength = this.charReceived ? 2 : 0; +} -BufferMethods = { - readUInt32LE: function(pos) { - return ((this[pos]) | - (this[pos + 1] << 8) | - (this[pos + 2] << 16)) + - (this[pos + 3] * 0x1000000); - }, +function base64DetectIncompleteChar(buffer) { + this.charReceived = buffer.length % 3; + this.charLength = this.charReceived ? 3 : 0; +} - writeUInt32LE: function(val, pos) { - this[pos] = val; - this[pos + 1] = (val >>> 8); - this[pos + 2] = (val >>> 16); - this[pos + 3] = (val >>> 24); - }, +},{"buffer":5}],184:[function(_dereq_,module,exports){ +/*! + * strip-comments + * + * Copyright (c) 2014 Jon Schlinkert, contributors. + * Licensed under the MIT license. + */ - readInt32LE: function(pos) { - return ((this[pos]) | - (this[pos + 1] << 8) | - (this[pos + 2] << 16)) + - (this[pos + 3] << 24); - }, +'use stric'; - readFloatLE: function(pos) { return ieee754.read(this, pos, true, 23, 4); }, - readDoubleLE: function(pos) { return ieee754.read(this, pos, true, 52, 8); }, +var reBlock = '\\/\\*'; +var reBlockIgnore = '\\/\\*(?!\\*?\\!)'; +var reBlockEnd = '(.|[\\r\\n]|\\n)*?\\*\\/\\n?\\n?'; +var reLine = /(^|[^\S\n])(?:\/\/)([\s\S]+?)$/gm; +var reLineIgnore = /(^|[^\S\n])(?:\/\/[^!])([\s\S]+?)$/gm; - writeFloatLE: function(val, pos) { return ieee754.write(this, val, pos, true, 23, 4); }, - writeDoubleLE: function(val, pos) { return ieee754.write(this, val, pos, true, 52, 8); }, - toString: function(encoding, start, end) { - var str = '', - tmp = ''; +/** + * Strip all comments + * + * {%= docs("strip") %} + * + * @param {String} `str` file contents or string to strip. + * @param {Object} `opts` options are passed to `.block`, and `.line` + * @return {String} String without comments. + * @api public + */ - start = start || 0; - end = Math.min(this.length, end || this.length); +var strip = module.exports = function(str, opts) { + return str ? strip.block(strip.line(str, opts), opts) : ''; +}; - for (var i = start; i < end; i++) { - var ch = this[i]; - if (ch <= 0x7F) { - str += decodeURIComponent(tmp) + String.fromCharCode(ch); - tmp = ''; - } else { - tmp += '%' + ch.toString(16); - } - } - str += decodeURIComponent(tmp); +/** + * Strip only block comments, optionally leaving protected comments + * (e.g. `/*!`) intact. + * + * {%= docs("block") %} + * + * @param {String} `str` file content or string to strip to + * @param {Object} `opts` if `safe:true`, strip only comments that do not start with `/*!` or `/**!` + * @return {String} String without block comments. + * @api public + */ - return str; - }, +strip.block = function(str, opts) { + opts = opts || {}; + var re = new RegExp(reBlock + reBlockEnd, 'gm'); + if(opts.safe) { + re = new RegExp(reBlockIgnore + reBlockEnd, 'gm'); + } + return str ? str.replace(re, '') : ''; +}; - write: function(str, pos) { - var bytes = str === lastStr ? lastStrEncoded : encodeString(str); - for (var i = 0; i < bytes.length; i++) { - this[pos + i] = bytes[i]; - } - }, - slice: function(start, end) { - return this.subarray(start, end); - }, +/** + * Strip only line comments + * + * {%= docs("line") %} + * + * @param {String} `str` file content or string to strip to + * @param {Object} `opts` if `safe:true`, strip all that not starts with `//!` + * @return {String} String without line comments. + * @api public + */ - copy: function(buf, pos) { - pos = pos || 0; - for (var i = 0; i < this.length; i++) { - buf[pos + i] = this[i]; - } - } +strip.line = function(str, opts) { + opts = opts || {}; + var re = reLine; + if(opts.safe) { + re = reLineIgnore; + } + return str ? str.replace(re, '') : ''; }; -BufferMethods.writeInt32LE = BufferMethods.writeUInt32LE; +},{}],185:[function(_dereq_,module,exports){ +// https://github.com/topojson/topojson-client Version 2.1.0. Copyright 2016 Mike Bostock. +(function (global, factory) { + typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) : + typeof define === 'function' && define.amd ? define(['exports'], factory) : + (factory((global.topojson = global.topojson || {}))); +}(this, (function (exports) { 'use strict'; -Buffer.byteLength = function(str) { - lastStr = str; - lastStrEncoded = encodeString(str); - return lastStrEncoded.length; +var reverse = function(array, n) { + var t, j = array.length, i = j - n; + while (i < --j) t = array[i], array[i++] = array[j], array[j] = t; }; -Buffer.isBuffer = function(buf) { - return !!(buf && buf._isBuffer); +var identity = function(x) { + return x; }; -function encodeString(str) { - var length = str.length, - bytes = []; - - for (var i = 0, c, lead; i < length; i++) { - c = str.charCodeAt(i); // code point - - if (c > 0xD7FF && c < 0xE000) { +var transform = function(topology) { + if ((transform = topology.transform) == null) return identity; + var transform, + x0, + y0, + kx = transform.scale[0], + ky = transform.scale[1], + dx = transform.translate[0], + dy = transform.translate[1]; + return function(point, i) { + if (!i) x0 = y0 = 0; + point[0] = (x0 += point[0]) * kx + dx; + point[1] = (y0 += point[1]) * ky + dy; + return point; + }; +}; - if (lead) { - if (c < 0xDC00) { - bytes.push(0xEF, 0xBF, 0xBD); - lead = c; - continue; +var feature = function(topology, o) { + return o.type === "GeometryCollection" + ? {type: "FeatureCollection", features: o.geometries.map(function(o) { return feature$1(topology, o); })} + : feature$1(topology, o); +}; - } else { - c = lead - 0xD800 << 10 | c - 0xDC00 | 0x10000; - lead = null; - } +function feature$1(topology, o) { + var id = o.id, + bbox = o.bbox, + properties = o.properties == null ? {} : o.properties, + geometry = object(topology, o); + return id == null && bbox == null ? {type: "Feature", properties: properties, geometry: geometry} + : bbox == null ? {type: "Feature", id: id, properties: properties, geometry: geometry} + : {type: "Feature", id: id, bbox: bbox, properties: properties, geometry: geometry}; +} - } else { - if (c > 0xDBFF || (i + 1 === length)) bytes.push(0xEF, 0xBF, 0xBD); - else lead = c; +function object(topology, o) { + var transformPoint = transform(topology), + arcs = topology.arcs; - continue; - } + function arc(i, points) { + if (points.length) points.pop(); + for (var a = arcs[i < 0 ? ~i : i], k = 0, n = a.length; k < n; ++k) { + points.push(transformPoint(a[k].slice(), k)); + } + if (i < 0) reverse(points, n); + } - } else if (lead) { - bytes.push(0xEF, 0xBF, 0xBD); - lead = null; - } + function point(p) { + return transformPoint(p.slice()); + } - if (c < 0x80) bytes.push(c); - else if (c < 0x800) bytes.push(c >> 0x6 | 0xC0, c & 0x3F | 0x80); - else if (c < 0x10000) bytes.push(c >> 0xC | 0xE0, c >> 0x6 & 0x3F | 0x80, c & 0x3F | 0x80); - else bytes.push(c >> 0x12 | 0xF0, c >> 0xC & 0x3F | 0x80, c >> 0x6 & 0x3F | 0x80, c & 0x3F | 0x80); - } - return bytes; -} + function line(arcs) { + var points = []; + for (var i = 0, n = arcs.length; i < n; ++i) arc(arcs[i], points); + if (points.length < 2) points.push(points[0].slice()); + return points; + } -},{"ieee754":189}],188:[function(_dereq_,module,exports){ -(function (global){ -'use strict'; + function ring(arcs) { + var points = line(arcs); + while (points.length < 4) points.push(points[0].slice()); + return points; + } -module.exports = Pbf; + function polygon(arcs) { + return arcs.map(ring); + } -var Buffer = global.Buffer || _dereq_('./buffer'); + function geometry(o) { + var type = o.type, coordinates; + switch (type) { + case "GeometryCollection": return {type: type, geometries: o.geometries.map(geometry)}; + case "Point": coordinates = point(o.coordinates); break; + case "MultiPoint": coordinates = o.coordinates.map(point); break; + case "LineString": coordinates = line(o.arcs); break; + case "MultiLineString": coordinates = o.arcs.map(line); break; + case "Polygon": coordinates = polygon(o.arcs); break; + case "MultiPolygon": coordinates = o.arcs.map(polygon); break; + default: return null; + } + return {type: type, coordinates: coordinates}; + } -function Pbf(buf) { - this.buf = !Buffer.isBuffer(buf) ? new Buffer(buf || 0) : buf; - this.pos = 0; - this.length = this.buf.length; + return geometry(o); } -Pbf.Varint = 0; // varint: int32, int64, uint32, uint64, sint32, sint64, bool, enum -Pbf.Fixed64 = 1; // 64-bit: double, fixed64, sfixed64 -Pbf.Bytes = 2; // length-delimited: string, bytes, embedded messages, packed repeated fields -Pbf.Fixed32 = 5; // 32-bit: float, fixed32, sfixed32 +// export {default as bbox} from "./src/bbox"; -var SHIFT_LEFT_32 = (1 << 16) * (1 << 16), - SHIFT_RIGHT_32 = 1 / SHIFT_LEFT_32, - POW_2_63 = Math.pow(2, 63); +// export {default as mesh, meshArcs} from "./src/mesh"; +// export {default as merge, mergeArcs} from "./src/merge"; +// export {default as neighbors} from "./src/neighbors"; +// export {default as quantize} from "./src/quantize"; +// export {default as transform} from "./src/transform"; +// export {default as untransform} from "./src/untransform"; -Pbf.prototype = { +exports.feature = feature; - destroy: function() { - this.buf = null; - }, +Object.defineProperty(exports, '__esModule', { value: true }); - // === READING ================================================================= +}))); - readFields: function(readField, result, end) { - end = end || this.length; +},{}],186:[function(_dereq_,module,exports){ +(function (global){ - while (this.pos < end) { - var val = this.readVarint(), - tag = val >> 3, - startPos = this.pos; +/** + * Module exports. + */ - readField(tag, result, this); +module.exports = deprecate; - if (this.pos === startPos) this.skip(val); - } - return result; - }, +/** + * Mark that a method should not be used. + * Returns a modified function which warns once by default. + * + * If `localStorage.noDeprecation = true` is set, then it is a no-op. + * + * If `localStorage.throwDeprecation = true` is set, then deprecated functions + * will throw an Error when invoked. + * + * If `localStorage.traceDeprecation = true` is set, then deprecated functions + * will invoke `console.trace()` instead of `console.error()`. + * + * @param {Function} fn - the function to deprecate + * @param {String} msg - the string to print to the console when `fn` is invoked + * @returns {Function} a new "deprecated" version of `fn` + * @api public + */ - readMessage: function(readField, result) { - return this.readFields(readField, result, this.readVarint() + this.pos); - }, +function deprecate (fn, msg) { + if (config('noDeprecation')) { + return fn; + } - readFixed32: function() { - var val = this.buf.readUInt32LE(this.pos); - this.pos += 4; - return val; - }, + var warned = false; + function deprecated() { + if (!warned) { + if (config('throwDeprecation')) { + throw new Error(msg); + } else if (config('traceDeprecation')) { + console.trace(msg); + } else { + console.warn(msg); + } + warned = true; + } + return fn.apply(this, arguments); + } - readSFixed32: function() { - var val = this.buf.readInt32LE(this.pos); - this.pos += 4; - return val; - }, + return deprecated; +} - // 64-bit int handling is based on github.com/dpw/node-buffer-more-ints (MIT-licensed) +/** + * Checks `localStorage` for boolean values for the given `name`. + * + * @param {String} name + * @returns {Boolean} + * @api private + */ - readFixed64: function() { - var val = this.buf.readUInt32LE(this.pos) + this.buf.readUInt32LE(this.pos + 4) * SHIFT_LEFT_32; - this.pos += 8; - return val; - }, +function config (name) { + // accessing global.localStorage can trigger a DOMException in sandboxed iframes + try { + if (!global.localStorage) return false; + } catch (_) { + return false; + } + var val = global.localStorage[name]; + if (null == val) return false; + return String(val).toLowerCase() === 'true'; +} - readSFixed64: function() { - var val = this.buf.readUInt32LE(this.pos) + this.buf.readInt32LE(this.pos + 4) * SHIFT_LEFT_32; - this.pos += 8; - return val; - }, +}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) - readFloat: function() { - var val = this.buf.readFloatLE(this.pos); - this.pos += 4; - return val; - }, +},{}],187:[function(_dereq_,module,exports){ +arguments[4][92][0].apply(exports,arguments) +},{"dup":92}],188:[function(_dereq_,module,exports){ +module.exports = function isBuffer(arg) { + return arg && typeof arg === 'object' + && typeof arg.copy === 'function' + && typeof arg.fill === 'function' + && typeof arg.readUInt8 === 'function'; +} +},{}],189:[function(_dereq_,module,exports){ +(function (process,global){ +// Copyright Joyent, Inc. and other Node contributors. +// +// Permission is hereby granted, free of charge, to any person obtaining a +// copy of this software and associated documentation files (the +// "Software"), to deal in the Software without restriction, including +// without limitation the rights to use, copy, modify, merge, publish, +// distribute, sublicense, and/or sell copies of the Software, and to permit +// persons to whom the Software is furnished to do so, subject to the +// following conditions: +// +// The above copyright notice and this permission notice shall be included +// in all copies or substantial portions of the Software. +// +// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS +// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN +// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, +// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR +// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE +// USE OR OTHER DEALINGS IN THE SOFTWARE. - readDouble: function() { - var val = this.buf.readDoubleLE(this.pos); - this.pos += 8; - return val; - }, +var formatRegExp = /%[sdj%]/g; +exports.format = function(f) { + if (!isString(f)) { + var objects = []; + for (var i = 0; i < arguments.length; i++) { + objects.push(inspect(arguments[i])); + } + return objects.join(' '); + } - readVarint: function() { - var buf = this.buf, - val, b, b0, b1, b2, b3; + var i = 1; + var args = arguments; + var len = args.length; + var str = String(f).replace(formatRegExp, function(x) { + if (x === '%%') return '%'; + if (i >= len) return x; + switch (x) { + case '%s': return String(args[i++]); + case '%d': return Number(args[i++]); + case '%j': + try { + return JSON.stringify(args[i++]); + } catch (_) { + return '[Circular]'; + } + default: + return x; + } + }); + for (var x = args[i]; i < len; x = args[++i]) { + if (isNull(x) || !isObject(x)) { + str += ' ' + x; + } else { + str += ' ' + inspect(x); + } + } + return str; +}; - b0 = buf[this.pos++]; if (b0 < 0x80) return b0; b0 = b0 & 0x7f; - b1 = buf[this.pos++]; if (b1 < 0x80) return b0 | b1 << 7; b1 = (b1 & 0x7f) << 7; - b2 = buf[this.pos++]; if (b2 < 0x80) return b0 | b1 | b2 << 14; b2 = (b2 & 0x7f) << 14; - b3 = buf[this.pos++]; if (b3 < 0x80) return b0 | b1 | b2 | b3 << 21; - val = b0 | b1 | b2 | (b3 & 0x7f) << 21; +// Mark that a method should not be used. +// Returns a modified function which warns once by default. +// If --no-deprecation is set, then it is a no-op. +exports.deprecate = function(fn, msg) { + // Allow for deprecating things in the process of starting up. + if (isUndefined(global.process)) { + return function() { + return exports.deprecate(fn, msg).apply(this, arguments); + }; + } - b = buf[this.pos++]; val += (b & 0x7f) * 0x10000000; if (b < 0x80) return val; - b = buf[this.pos++]; val += (b & 0x7f) * 0x800000000; if (b < 0x80) return val; - b = buf[this.pos++]; val += (b & 0x7f) * 0x40000000000; if (b < 0x80) return val; - b = buf[this.pos++]; val += (b & 0x7f) * 0x2000000000000; if (b < 0x80) return val; - b = buf[this.pos++]; val += (b & 0x7f) * 0x100000000000000; if (b < 0x80) return val; - b = buf[this.pos++]; val += (b & 0x7f) * 0x8000000000000000; if (b < 0x80) return val; + if (process.noDeprecation === true) { + return fn; + } - throw new Error('Expected varint not more than 10 bytes'); - }, + var warned = false; + function deprecated() { + if (!warned) { + if (process.throwDeprecation) { + throw new Error(msg); + } else if (process.traceDeprecation) { + console.trace(msg); + } else { + console.error(msg); + } + warned = true; + } + return fn.apply(this, arguments); + } - readVarint64: function() { - var startPos = this.pos, - val = this.readVarint(); + return deprecated; +}; - if (val < POW_2_63) return val; - var pos = this.pos - 2; - while (this.buf[pos] === 0xff) pos--; - if (pos < startPos) pos = startPos; +var debugs = {}; +var debugEnviron; +exports.debuglog = function(set) { + if (isUndefined(debugEnviron)) + debugEnviron = process.env.NODE_DEBUG || ''; + set = set.toUpperCase(); + if (!debugs[set]) { + if (new RegExp('\\b' + set + '\\b', 'i').test(debugEnviron)) { + var pid = process.pid; + debugs[set] = function() { + var msg = exports.format.apply(exports, arguments); + console.error('%s %d: %s', set, pid, msg); + }; + } else { + debugs[set] = function() {}; + } + } + return debugs[set]; +}; - val = 0; - for (var i = 0; i < pos - startPos + 1; i++) { - var b = ~this.buf[startPos + i] & 0x7f; - val += i < 4 ? b << i * 7 : b * Math.pow(2, i * 7); - } - return -val - 1; - }, +/** + * Echos the value of a value. Trys to print the value out + * in the best way possible given the different types. + * + * @param {Object} obj The object to print out. + * @param {Object} opts Optional options object that alters the output. + */ +/* legacy: obj, showHidden, depth, colors*/ +function inspect(obj, opts) { + // default options + var ctx = { + seen: [], + stylize: stylizeNoColor + }; + // legacy... + if (arguments.length >= 3) ctx.depth = arguments[2]; + if (arguments.length >= 4) ctx.colors = arguments[3]; + if (isBoolean(opts)) { + // legacy... + ctx.showHidden = opts; + } else if (opts) { + // got an "options" object + exports._extend(ctx, opts); + } + // set default options + if (isUndefined(ctx.showHidden)) ctx.showHidden = false; + if (isUndefined(ctx.depth)) ctx.depth = 2; + if (isUndefined(ctx.colors)) ctx.colors = false; + if (isUndefined(ctx.customInspect)) ctx.customInspect = true; + if (ctx.colors) ctx.stylize = stylizeWithColor; + return formatValue(ctx, obj, ctx.depth); +} +exports.inspect = inspect; - readSVarint: function() { - var num = this.readVarint(); - return num % 2 === 1 ? (num + 1) / -2 : num / 2; // zigzag encoding - }, - readBoolean: function() { - return Boolean(this.readVarint()); - }, +// http://en.wikipedia.org/wiki/ANSI_escape_code#graphics +inspect.colors = { + 'bold' : [1, 22], + 'italic' : [3, 23], + 'underline' : [4, 24], + 'inverse' : [7, 27], + 'white' : [37, 39], + 'grey' : [90, 39], + 'black' : [30, 39], + 'blue' : [34, 39], + 'cyan' : [36, 39], + 'green' : [32, 39], + 'magenta' : [35, 39], + 'red' : [31, 39], + 'yellow' : [33, 39] +}; - readString: function() { - var end = this.readVarint() + this.pos, - str = this.buf.toString('utf8', this.pos, end); - this.pos = end; - return str; - }, +// Don't use 'blue' not visible on cmd.exe +inspect.styles = { + 'special': 'cyan', + 'number': 'yellow', + 'boolean': 'yellow', + 'undefined': 'grey', + 'null': 'bold', + 'string': 'green', + 'date': 'magenta', + // "name": intentionally not styling + 'regexp': 'red' +}; - readBytes: function() { - var end = this.readVarint() + this.pos, - buffer = this.buf.slice(this.pos, end); - this.pos = end; - return buffer; - }, - // verbose for performance reasons; doesn't affect gzipped size +function stylizeWithColor(str, styleType) { + var style = inspect.styles[styleType]; - readPackedVarint: function() { - var end = this.readVarint() + this.pos, arr = []; - while (this.pos < end) arr.push(this.readVarint()); - return arr; - }, - readPackedSVarint: function() { - var end = this.readVarint() + this.pos, arr = []; - while (this.pos < end) arr.push(this.readSVarint()); - return arr; - }, - readPackedBoolean: function() { - var end = this.readVarint() + this.pos, arr = []; - while (this.pos < end) arr.push(this.readBoolean()); - return arr; - }, - readPackedFloat: function() { - var end = this.readVarint() + this.pos, arr = []; - while (this.pos < end) arr.push(this.readFloat()); - return arr; - }, - readPackedDouble: function() { - var end = this.readVarint() + this.pos, arr = []; - while (this.pos < end) arr.push(this.readDouble()); - return arr; - }, - readPackedFixed32: function() { - var end = this.readVarint() + this.pos, arr = []; - while (this.pos < end) arr.push(this.readFixed32()); - return arr; - }, - readPackedSFixed32: function() { - var end = this.readVarint() + this.pos, arr = []; - while (this.pos < end) arr.push(this.readSFixed32()); - return arr; - }, - readPackedFixed64: function() { - var end = this.readVarint() + this.pos, arr = []; - while (this.pos < end) arr.push(this.readFixed64()); - return arr; - }, - readPackedSFixed64: function() { - var end = this.readVarint() + this.pos, arr = []; - while (this.pos < end) arr.push(this.readSFixed64()); - return arr; - }, + if (style) { + return '\u001b[' + inspect.colors[style][0] + 'm' + str + + '\u001b[' + inspect.colors[style][1] + 'm'; + } else { + return str; + } +} - skip: function(val) { - var type = val & 0x7; - if (type === Pbf.Varint) while (this.buf[this.pos++] > 0x7f) {} - else if (type === Pbf.Bytes) this.pos = this.readVarint() + this.pos; - else if (type === Pbf.Fixed32) this.pos += 4; - else if (type === Pbf.Fixed64) this.pos += 8; - else throw new Error('Unimplemented type: ' + type); - }, - // === WRITING ================================================================= +function stylizeNoColor(str, styleType) { + return str; +} - writeTag: function(tag, type) { - this.writeVarint((tag << 3) | type); - }, - realloc: function(min) { - var length = this.length || 16; +function arrayToHash(array) { + var hash = {}; - while (length < this.pos + min) length *= 2; + array.forEach(function(val, idx) { + hash[val] = true; + }); - if (length !== this.length) { - var buf = new Buffer(length); - this.buf.copy(buf); - this.buf = buf; - this.length = length; - } - }, + return hash; +} - finish: function() { - this.length = this.pos; - this.pos = 0; - return this.buf.slice(0, this.length); - }, - writeFixed32: function(val) { - this.realloc(4); - this.buf.writeUInt32LE(val, this.pos); - this.pos += 4; - }, +function formatValue(ctx, value, recurseTimes) { + // Provide a hook for user-specified inspect functions. + // Check that value is an object with an inspect function on it + if (ctx.customInspect && + value && + isFunction(value.inspect) && + // Filter out the util module, it's inspect function is special + value.inspect !== exports.inspect && + // Also filter out any prototype objects using the circular check. + !(value.constructor && value.constructor.prototype === value)) { + var ret = value.inspect(recurseTimes, ctx); + if (!isString(ret)) { + ret = formatValue(ctx, ret, recurseTimes); + } + return ret; + } - writeSFixed32: function(val) { - this.realloc(4); - this.buf.writeInt32LE(val, this.pos); - this.pos += 4; - }, + // Primitive types cannot have properties + var primitive = formatPrimitive(ctx, value); + if (primitive) { + return primitive; + } - writeFixed64: function(val) { - this.realloc(8); - this.buf.writeInt32LE(val & -1, this.pos); - this.buf.writeUInt32LE(Math.floor(val * SHIFT_RIGHT_32), this.pos + 4); - this.pos += 8; - }, + // Look up the keys of the object. + var keys = Object.keys(value); + var visibleKeys = arrayToHash(keys); - writeSFixed64: function(val) { - this.realloc(8); - this.buf.writeInt32LE(val & -1, this.pos); - this.buf.writeInt32LE(Math.floor(val * SHIFT_RIGHT_32), this.pos + 4); - this.pos += 8; - }, + if (ctx.showHidden) { + keys = Object.getOwnPropertyNames(value); + } - writeVarint: function(val) { - val = +val; + // IE doesn't make error fields non-enumerable + // http://msdn.microsoft.com/en-us/library/ie/dww52sbt(v=vs.94).aspx + if (isError(value) + && (keys.indexOf('message') >= 0 || keys.indexOf('description') >= 0)) { + return formatError(value); + } - if (val <= 0x7f) { - this.realloc(1); - this.buf[this.pos++] = val; + // Some type of object without properties can be shortcutted. + if (keys.length === 0) { + if (isFunction(value)) { + var name = value.name ? ': ' + value.name : ''; + return ctx.stylize('[Function' + name + ']', 'special'); + } + if (isRegExp(value)) { + return ctx.stylize(RegExp.prototype.toString.call(value), 'regexp'); + } + if (isDate(value)) { + return ctx.stylize(Date.prototype.toString.call(value), 'date'); + } + if (isError(value)) { + return formatError(value); + } + } - } else if (val <= 0x3fff) { - this.realloc(2); - this.buf[this.pos++] = ((val >>> 0) & 0x7f) | 0x80; - this.buf[this.pos++] = ((val >>> 7) & 0x7f); + var base = '', array = false, braces = ['{', '}']; - } else if (val <= 0x1fffff) { - this.realloc(3); - this.buf[this.pos++] = ((val >>> 0) & 0x7f) | 0x80; - this.buf[this.pos++] = ((val >>> 7) & 0x7f) | 0x80; - this.buf[this.pos++] = ((val >>> 14) & 0x7f); + // Make Array say that they are Array + if (isArray(value)) { + array = true; + braces = ['[', ']']; + } - } else if (val <= 0xfffffff) { - this.realloc(4); - this.buf[this.pos++] = ((val >>> 0) & 0x7f) | 0x80; - this.buf[this.pos++] = ((val >>> 7) & 0x7f) | 0x80; - this.buf[this.pos++] = ((val >>> 14) & 0x7f) | 0x80; - this.buf[this.pos++] = ((val >>> 21) & 0x7f); + // Make functions say that they are functions + if (isFunction(value)) { + var n = value.name ? ': ' + value.name : ''; + base = ' [Function' + n + ']'; + } - } else { - var pos = this.pos; - while (val >= 0x80) { - this.realloc(1); - this.buf[this.pos++] = (val & 0xff) | 0x80; - val /= 0x80; - } - this.realloc(1); - this.buf[this.pos++] = val | 0; - if (this.pos - pos > 10) throw new Error('Given varint doesn\'t fit into 10 bytes'); - } - }, + // Make RegExps say that they are RegExps + if (isRegExp(value)) { + base = ' ' + RegExp.prototype.toString.call(value); + } - writeSVarint: function(val) { - this.writeVarint(val < 0 ? -val * 2 - 1 : val * 2); - }, + // Make dates with properties first say the date + if (isDate(value)) { + base = ' ' + Date.prototype.toUTCString.call(value); + } - writeBoolean: function(val) { - this.writeVarint(Boolean(val)); - }, + // Make error with message first say the error + if (isError(value)) { + base = ' ' + formatError(value); + } - writeString: function(str) { - str = String(str); - var bytes = Buffer.byteLength(str); - this.writeVarint(bytes); - this.realloc(bytes); - this.buf.write(str, this.pos); - this.pos += bytes; - }, + if (keys.length === 0 && (!array || value.length == 0)) { + return braces[0] + base + braces[1]; + } - writeFloat: function(val) { - this.realloc(4); - this.buf.writeFloatLE(val, this.pos); - this.pos += 4; - }, + if (recurseTimes < 0) { + if (isRegExp(value)) { + return ctx.stylize(RegExp.prototype.toString.call(value), 'regexp'); + } else { + return ctx.stylize('[Object]', 'special'); + } + } - writeDouble: function(val) { - this.realloc(8); - this.buf.writeDoubleLE(val, this.pos); - this.pos += 8; - }, + ctx.seen.push(value); - writeBytes: function(buffer) { - var len = buffer.length; - this.writeVarint(len); - this.realloc(len); - for (var i = 0; i < len; i++) this.buf[this.pos++] = buffer[i]; - }, + var output; + if (array) { + output = formatArray(ctx, value, recurseTimes, visibleKeys, keys); + } else { + output = keys.map(function(key) { + return formatProperty(ctx, value, recurseTimes, visibleKeys, key, array); + }); + } - writeMessage: function(tag, fn, obj) { - this.writeTag(tag, Pbf.Bytes); + ctx.seen.pop(); - this.pos++; // reserve 1 byte for short message length + return reduceToSingleString(output, base, braces); +} - // write the message directly to the buffer and see how much was written - var startPos = this.pos; - fn(obj, this); - var len = this.pos - startPos; - var varintLen = - len <= 0x7f ? 1 : - len <= 0x3fff ? 2 : - len <= 0x1fffff ? 3 : - len <= 0xfffffff ? 4 : Math.ceil(Math.log(len) / (Math.LN2 * 7)); +function formatPrimitive(ctx, value) { + if (isUndefined(value)) + return ctx.stylize('undefined', 'undefined'); + if (isString(value)) { + var simple = '\'' + JSON.stringify(value).replace(/^"|"$/g, '') + .replace(/'/g, "\\'") + .replace(/\\"/g, '"') + '\''; + return ctx.stylize(simple, 'string'); + } + if (isNumber(value)) + return ctx.stylize('' + value, 'number'); + if (isBoolean(value)) + return ctx.stylize('' + value, 'boolean'); + // For some reason typeof null is "object", so special case here. + if (isNull(value)) + return ctx.stylize('null', 'null'); +} - // if 1 byte isn't enough for encoding message length, shift the data to the right - if (varintLen > 1) { - this.realloc(varintLen - 1); - for (var i = this.pos - 1; i >= startPos; i--) this.buf[i + varintLen - 1] = this.buf[i]; - } - // finally, write the message length in the reserved place and restore the position - this.pos = startPos - 1; - this.writeVarint(len); - this.pos += len; - }, +function formatError(value) { + return '[' + Error.prototype.toString.call(value) + ']'; +} - writePackedVarint: function(tag, arr) { this.writeMessage(tag, writePackedVarint, arr); }, - writePackedSVarint: function(tag, arr) { this.writeMessage(tag, writePackedSVarint, arr); }, - writePackedBoolean: function(tag, arr) { this.writeMessage(tag, writePackedBoolean, arr); }, - writePackedFloat: function(tag, arr) { this.writeMessage(tag, writePackedFloat, arr); }, - writePackedDouble: function(tag, arr) { this.writeMessage(tag, writePackedDouble, arr); }, - writePackedFixed32: function(tag, arr) { this.writeMessage(tag, writePackedFixed32, arr); }, - writePackedSFixed32: function(tag, arr) { this.writeMessage(tag, writePackedSFixed32, arr); }, - writePackedFixed64: function(tag, arr) { this.writeMessage(tag, writePackedFixed64, arr); }, - writePackedSFixed64: function(tag, arr) { this.writeMessage(tag, writePackedSFixed64, arr); }, - writeBytesField: function(tag, buffer) { - this.writeTag(tag, Pbf.Bytes); - this.writeBytes(buffer); - }, - writeFixed32Field: function(tag, val) { - this.writeTag(tag, Pbf.Fixed32); - this.writeFixed32(val); - }, - writeSFixed32Field: function(tag, val) { - this.writeTag(tag, Pbf.Fixed32); - this.writeSFixed32(val); - }, - writeFixed64Field: function(tag, val) { - this.writeTag(tag, Pbf.Fixed64); - this.writeFixed64(val); - }, - writeSFixed64Field: function(tag, val) { - this.writeTag(tag, Pbf.Fixed64); - this.writeSFixed64(val); - }, - writeVarintField: function(tag, val) { - this.writeTag(tag, Pbf.Varint); - this.writeVarint(val); - }, - writeSVarintField: function(tag, val) { - this.writeTag(tag, Pbf.Varint); - this.writeSVarint(val); - }, - writeStringField: function(tag, str) { - this.writeTag(tag, Pbf.Bytes); - this.writeString(str); - }, - writeFloatField: function(tag, val) { - this.writeTag(tag, Pbf.Fixed32); - this.writeFloat(val); - }, - writeDoubleField: function(tag, val) { - this.writeTag(tag, Pbf.Fixed64); - this.writeDouble(val); - }, - writeBooleanField: function(tag, val) { - this.writeVarintField(tag, Boolean(val)); +function formatArray(ctx, value, recurseTimes, visibleKeys, keys) { + var output = []; + for (var i = 0, l = value.length; i < l; ++i) { + if (hasOwnProperty(value, String(i))) { + output.push(formatProperty(ctx, value, recurseTimes, visibleKeys, + String(i), true)); + } else { + output.push(''); } -}; + } + keys.forEach(function(key) { + if (!key.match(/^\d+$/)) { + output.push(formatProperty(ctx, value, recurseTimes, visibleKeys, + key, true)); + } + }); + return output; +} -function writePackedVarint(arr, pbf) { for (var i = 0; i < arr.length; i++) pbf.writeVarint(arr[i]); } -function writePackedSVarint(arr, pbf) { for (var i = 0; i < arr.length; i++) pbf.writeSVarint(arr[i]); } -function writePackedFloat(arr, pbf) { for (var i = 0; i < arr.length; i++) pbf.writeFloat(arr[i]); } -function writePackedDouble(arr, pbf) { for (var i = 0; i < arr.length; i++) pbf.writeDouble(arr[i]); } -function writePackedBoolean(arr, pbf) { for (var i = 0; i < arr.length; i++) pbf.writeBoolean(arr[i]); } -function writePackedFixed32(arr, pbf) { for (var i = 0; i < arr.length; i++) pbf.writeFixed32(arr[i]); } -function writePackedSFixed32(arr, pbf) { for (var i = 0; i < arr.length; i++) pbf.writeSFixed32(arr[i]); } -function writePackedFixed64(arr, pbf) { for (var i = 0; i < arr.length; i++) pbf.writeFixed64(arr[i]); } -function writePackedSFixed64(arr, pbf) { for (var i = 0; i < arr.length; i++) pbf.writeSFixed64(arr[i]); } -}).call(this,typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) +function formatProperty(ctx, value, recurseTimes, visibleKeys, key, array) { + var name, str, desc; + desc = Object.getOwnPropertyDescriptor(value, key) || { value: value[key] }; + if (desc.get) { + if (desc.set) { + str = ctx.stylize('[Getter/Setter]', 'special'); + } else { + str = ctx.stylize('[Getter]', 'special'); + } + } else { + if (desc.set) { + str = ctx.stylize('[Setter]', 'special'); + } + } + if (!hasOwnProperty(visibleKeys, key)) { + name = '[' + key + ']'; + } + if (!str) { + if (ctx.seen.indexOf(desc.value) < 0) { + if (isNull(recurseTimes)) { + str = formatValue(ctx, desc.value, null); + } else { + str = formatValue(ctx, desc.value, recurseTimes - 1); + } + if (str.indexOf('\n') > -1) { + if (array) { + str = str.split('\n').map(function(line) { + return ' ' + line; + }).join('\n').substr(2); + } else { + str = '\n' + str.split('\n').map(function(line) { + return ' ' + line; + }).join('\n'); + } + } + } else { + str = ctx.stylize('[Circular]', 'special'); + } + } + if (isUndefined(name)) { + if (array && key.match(/^\d+$/)) { + return str; + } + name = JSON.stringify('' + key); + if (name.match(/^"([a-zA-Z_][a-zA-Z_0-9]*)"$/)) { + name = name.substr(1, name.length - 2); + name = ctx.stylize(name, 'name'); + } else { + name = name.replace(/'/g, "\\'") + .replace(/\\"/g, '"') + .replace(/(^"|"$)/g, "'"); + name = ctx.stylize(name, 'string'); + } + } -},{"./buffer":187}],189:[function(_dereq_,module,exports){ -arguments[4][4][0].apply(exports,arguments) -},{"dup":4}],190:[function(_dereq_,module,exports){ -/*! - * strip-comments - * - * Copyright (c) 2014 Jon Schlinkert, contributors. - * Licensed under the MIT license. - */ + return name + ': ' + str; +} -'use stric'; -var reBlock = '\\/\\*'; -var reBlockIgnore = '\\/\\*(?!\\*?\\!)'; -var reBlockEnd = '(.|[\\r\\n]|\\n)*?\\*\\/\\n?\\n?'; -var reLine = /(^|[^\S\n])(?:\/\/)([\s\S]+?)$/gm; -var reLineIgnore = /(^|[^\S\n])(?:\/\/[^!])([\s\S]+?)$/gm; +function reduceToSingleString(output, base, braces) { + var numLinesEst = 0; + var length = output.reduce(function(prev, cur) { + numLinesEst++; + if (cur.indexOf('\n') >= 0) numLinesEst++; + return prev + cur.replace(/\u001b\[\d\d?m/g, '').length + 1; + }, 0); + if (length > 60) { + return braces[0] + + (base === '' ? '' : base + '\n ') + + ' ' + + output.join(',\n ') + + ' ' + + braces[1]; + } -/** - * Strip all comments - * - * {%= docs("strip") %} - * - * @param {String} `str` file contents or string to strip. - * @param {Object} `opts` options are passed to `.block`, and `.line` - * @return {String} String without comments. - * @api public - */ + return braces[0] + base + ' ' + output.join(', ') + ' ' + braces[1]; +} -var strip = module.exports = function(str, opts) { - return str ? strip.block(strip.line(str, opts), opts) : ''; -}; +// NOTE: These type checking functions intentionally don't use `instanceof` +// because it is fragile and can be easily faked with `Object.create()`. +function isArray(ar) { + return Array.isArray(ar); +} +exports.isArray = isArray; -/** - * Strip only block comments, optionally leaving protected comments - * (e.g. `/*!`) intact. - * - * {%= docs("block") %} - * - * @param {String} `str` file content or string to strip to - * @param {Object} `opts` if `safe:true`, strip only comments that do not start with `/*!` or `/**!` - * @return {String} String without block comments. - * @api public - */ +function isBoolean(arg) { + return typeof arg === 'boolean'; +} +exports.isBoolean = isBoolean; -strip.block = function(str, opts) { - opts = opts || {}; - var re = new RegExp(reBlock + reBlockEnd, 'gm'); - if(opts.safe) { - re = new RegExp(reBlockIgnore + reBlockEnd, 'gm'); - } - return str ? str.replace(re, '') : ''; -}; +function isNull(arg) { + return arg === null; +} +exports.isNull = isNull; +function isNullOrUndefined(arg) { + return arg == null; +} +exports.isNullOrUndefined = isNullOrUndefined; -/** - * Strip only line comments - * - * {%= docs("line") %} - * - * @param {String} `str` file content or string to strip to - * @param {Object} `opts` if `safe:true`, strip all that not starts with `//!` - * @return {String} String without line comments. - * @api public - */ +function isNumber(arg) { + return typeof arg === 'number'; +} +exports.isNumber = isNumber; -strip.line = function(str, opts) { - opts = opts || {}; - var re = reLine; - if(opts.safe) { - re = reLineIgnore; - } - return str ? str.replace(re, '') : ''; -}; +function isString(arg) { + return typeof arg === 'string'; +} +exports.isString = isString; -},{}],191:[function(_dereq_,module,exports){ -// https://github.com/topojson/topojson-client Version 2.1.0. Copyright 2016 Mike Bostock. -(function (global, factory) { - typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports) : - typeof define === 'function' && define.amd ? define(['exports'], factory) : - (factory((global.topojson = global.topojson || {}))); -}(this, (function (exports) { 'use strict'; +function isSymbol(arg) { + return typeof arg === 'symbol'; +} +exports.isSymbol = isSymbol; -var reverse = function(array, n) { - var t, j = array.length, i = j - n; - while (i < --j) t = array[i], array[i++] = array[j], array[j] = t; -}; +function isUndefined(arg) { + return arg === void 0; +} +exports.isUndefined = isUndefined; -var identity = function(x) { - return x; -}; +function isRegExp(re) { + return isObject(re) && objectToString(re) === '[object RegExp]'; +} +exports.isRegExp = isRegExp; -var transform = function(topology) { - if ((transform = topology.transform) == null) return identity; - var transform, - x0, - y0, - kx = transform.scale[0], - ky = transform.scale[1], - dx = transform.translate[0], - dy = transform.translate[1]; - return function(point, i) { - if (!i) x0 = y0 = 0; - point[0] = (x0 += point[0]) * kx + dx; - point[1] = (y0 += point[1]) * ky + dy; - return point; - }; -}; +function isObject(arg) { + return typeof arg === 'object' && arg !== null; +} +exports.isObject = isObject; -var feature = function(topology, o) { - return o.type === "GeometryCollection" - ? {type: "FeatureCollection", features: o.geometries.map(function(o) { return feature$1(topology, o); })} - : feature$1(topology, o); -}; +function isDate(d) { + return isObject(d) && objectToString(d) === '[object Date]'; +} +exports.isDate = isDate; -function feature$1(topology, o) { - var id = o.id, - bbox = o.bbox, - properties = o.properties == null ? {} : o.properties, - geometry = object(topology, o); - return id == null && bbox == null ? {type: "Feature", properties: properties, geometry: geometry} - : bbox == null ? {type: "Feature", id: id, properties: properties, geometry: geometry} - : {type: "Feature", id: id, bbox: bbox, properties: properties, geometry: geometry}; +function isError(e) { + return isObject(e) && + (objectToString(e) === '[object Error]' || e instanceof Error); } +exports.isError = isError; -function object(topology, o) { - var transformPoint = transform(topology), - arcs = topology.arcs; +function isFunction(arg) { + return typeof arg === 'function'; +} +exports.isFunction = isFunction; - function arc(i, points) { - if (points.length) points.pop(); - for (var a = arcs[i < 0 ? ~i : i], k = 0, n = a.length; k < n; ++k) { - points.push(transformPoint(a[k].slice(), k)); - } - if (i < 0) reverse(points, n); - } +function isPrimitive(arg) { + return arg === null || + typeof arg === 'boolean' || + typeof arg === 'number' || + typeof arg === 'string' || + typeof arg === 'symbol' || // ES6 symbol + typeof arg === 'undefined'; +} +exports.isPrimitive = isPrimitive; - function point(p) { - return transformPoint(p.slice()); - } +exports.isBuffer = _dereq_('./support/isBuffer'); - function line(arcs) { - var points = []; - for (var i = 0, n = arcs.length; i < n; ++i) arc(arcs[i], points); - if (points.length < 2) points.push(points[0].slice()); - return points; - } +function objectToString(o) { + return Object.prototype.toString.call(o); +} - function ring(arcs) { - var points = line(arcs); - while (points.length < 4) points.push(points[0].slice()); - return points; - } - function polygon(arcs) { - return arcs.map(ring); - } +function pad(n) { + return n < 10 ? '0' + n.toString(10) : n.toString(10); +} - function geometry(o) { - var type = o.type, coordinates; - switch (type) { - case "GeometryCollection": return {type: type, geometries: o.geometries.map(geometry)}; - case "Point": coordinates = point(o.coordinates); break; - case "MultiPoint": coordinates = o.coordinates.map(point); break; - case "LineString": coordinates = line(o.arcs); break; - case "MultiLineString": coordinates = o.arcs.map(line); break; - case "Polygon": coordinates = polygon(o.arcs); break; - case "MultiPolygon": coordinates = o.arcs.map(polygon); break; - default: return null; - } - return {type: type, coordinates: coordinates}; - } - return geometry(o); +var months = ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', + 'Oct', 'Nov', 'Dec']; + +// 26 Feb 16:19:34 +function timestamp() { + var d = new Date(); + var time = [pad(d.getHours()), + pad(d.getMinutes()), + pad(d.getSeconds())].join(':'); + return [d.getDate(), months[d.getMonth()], time].join(' '); } -// export {default as bbox} from "./src/bbox"; -// export {default as mesh, meshArcs} from "./src/mesh"; -// export {default as merge, mergeArcs} from "./src/merge"; -// export {default as neighbors} from "./src/neighbors"; -// export {default as quantize} from "./src/quantize"; -// export {default as transform} from "./src/transform"; -// export {default as untransform} from "./src/untransform"; +// log is just a thin wrapper to console.log that prepends a timestamp +exports.log = function() { + console.log('%s - %s', timestamp(), exports.format.apply(exports, arguments)); +}; -exports.feature = feature; -Object.defineProperty(exports, '__esModule', { value: true }); +/** + * Inherit the prototype methods from one constructor into another. + * + * The Function.prototype.inherits from lang.js rewritten as a standalone + * function (not on Function.prototype). NOTE: If this file is to be loaded + * during bootstrapping this function needs to be rewritten using some native + * functions as prototype setup using normal JavaScript does not work as + * expected during bootstrapping (see mirror.js in r114903). + * + * @param {function} ctor Constructor function which needs to inherit the + * prototype. + * @param {function} superCtor Constructor function to inherit prototype from. + */ +exports.inherits = _dereq_('inherits'); -}))); +exports._extend = function(origin, add) { + // Don't do anything if add isn't an object + if (!add || !isObject(add)) return origin; + + var keys = Object.keys(add); + var i = keys.length; + while (i--) { + origin[keys[i]] = add[keys[i]]; + } + return origin; +}; + +function hasOwnProperty(obj, prop) { + return Object.prototype.hasOwnProperty.call(obj, prop); +} + +}).call(this,_dereq_('_process'),typeof global !== "undefined" ? global : typeof self !== "undefined" ? self : typeof window !== "undefined" ? window : {}) -},{}],192:[function(_dereq_,module,exports){ +},{"./support/isBuffer":188,"_process":176,"inherits":187}],190:[function(_dereq_,module,exports){ module.exports.VectorTile = _dereq_('./lib/vectortile.js'); module.exports.VectorTileFeature = _dereq_('./lib/vectortilefeature.js'); module.exports.VectorTileLayer = _dereq_('./lib/vectortilelayer.js'); -},{"./lib/vectortile.js":193,"./lib/vectortilefeature.js":194,"./lib/vectortilelayer.js":195}],193:[function(_dereq_,module,exports){ +},{"./lib/vectortile.js":191,"./lib/vectortilefeature.js":192,"./lib/vectortilelayer.js":193}],191:[function(_dereq_,module,exports){ 'use strict'; var VectorTileLayer = _dereq_('./vectortilelayer'); @@ -22960,7 +22947,7 @@ function readTile(tag, layers, pbf) { } -},{"./vectortilelayer":195}],194:[function(_dereq_,module,exports){ +},{"./vectortilelayer":193}],192:[function(_dereq_,module,exports){ 'use strict'; var Point = _dereq_('point-geometry'); @@ -23124,7 +23111,7 @@ VectorTileFeature.prototype.toGeoJSON = function(x, y, z) { }; }; -},{"point-geometry":196}],195:[function(_dereq_,module,exports){ +},{"point-geometry":174}],193:[function(_dereq_,module,exports){ 'use strict'; var VectorTileFeature = _dereq_('./vectortilefeature.js'); @@ -23187,140 +23174,7 @@ VectorTileLayer.prototype.feature = function(i) { return new VectorTileFeature(this._pbf, end, this.extent, this._keys, this._values); }; -},{"./vectortilefeature.js":194}],196:[function(_dereq_,module,exports){ -'use strict'; - -module.exports = Point; - -function Point(x, y) { - this.x = x; - this.y = y; -} - -Point.prototype = { - clone: function() { return new Point(this.x, this.y); }, - - add: function(p) { return this.clone()._add(p); }, - sub: function(p) { return this.clone()._sub(p); }, - mult: function(k) { return this.clone()._mult(k); }, - div: function(k) { return this.clone()._div(k); }, - rotate: function(a) { return this.clone()._rotate(a); }, - matMult: function(m) { return this.clone()._matMult(m); }, - unit: function() { return this.clone()._unit(); }, - perp: function() { return this.clone()._perp(); }, - round: function() { return this.clone()._round(); }, - - mag: function() { - return Math.sqrt(this.x * this.x + this.y * this.y); - }, - - equals: function(p) { - return this.x === p.x && - this.y === p.y; - }, - - dist: function(p) { - return Math.sqrt(this.distSqr(p)); - }, - - distSqr: function(p) { - var dx = p.x - this.x, - dy = p.y - this.y; - return dx * dx + dy * dy; - }, - - angle: function() { - return Math.atan2(this.y, this.x); - }, - - angleTo: function(b) { - return Math.atan2(this.y - b.y, this.x - b.x); - }, - - angleWith: function(b) { - return this.angleWithSep(b.x, b.y); - }, - - // Find the angle of the two vectors, solving the formula for the cross product a x b = |a||b|sin(θ) for θ. - angleWithSep: function(x, y) { - return Math.atan2( - this.x * y - this.y * x, - this.x * x + this.y * y); - }, - - _matMult: function(m) { - var x = m[0] * this.x + m[1] * this.y, - y = m[2] * this.x + m[3] * this.y; - this.x = x; - this.y = y; - return this; - }, - - _add: function(p) { - this.x += p.x; - this.y += p.y; - return this; - }, - - _sub: function(p) { - this.x -= p.x; - this.y -= p.y; - return this; - }, - - _mult: function(k) { - this.x *= k; - this.y *= k; - return this; - }, - - _div: function(k) { - this.x /= k; - this.y /= k; - return this; - }, - - _unit: function() { - this._div(this.mag()); - return this; - }, - - _perp: function() { - var y = this.y; - this.y = this.x; - this.x = -y; - return this; - }, - - _rotate: function(angle) { - var cos = Math.cos(angle), - sin = Math.sin(angle), - x = cos * this.x - sin * this.y, - y = sin * this.x + cos * this.y; - this.x = x; - this.y = y; - return this; - }, - - _round: function() { - this.x = Math.round(this.x); - this.y = Math.round(this.y); - return this; - } -}; - -// constructs Point from an array if necessary -Point.convert = function (a) { - if (a instanceof Point) { - return a; - } - if (Array.isArray(a)) { - return new Point(a[0], a[1]); - } - return a; -}; - -},{}],197:[function(_dereq_,module,exports){ +},{"./vectortilefeature.js":192}],194:[function(_dereq_,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -23362,7 +23216,7 @@ function isCoordOutsideTile(coord, tolerance) { return coord[0] <= tile_min.x + tolerance || coord[0] >= tile_max.x - tolerance || coord[1] >= tile_min.y - tolerance || coord[1] <= tile_max.y + tolerance; } -},{"../geo":202}],198:[function(_dereq_,module,exports){ +},{"../geo":199}],195:[function(_dereq_,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -23450,7 +23304,7 @@ function buildQuadsForPoints(points, vertex_data, vertex_template, _ref, _ref2) } } -},{"./common":197}],199:[function(_dereq_,module,exports){ +},{"./common":194}],196:[function(_dereq_,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -23651,7 +23505,7 @@ function triangulatePolygon(data) { return (0, _earcut2.default)(data.vertices, data.holes, data.dimensions); } -},{"../geo":202,"../vector":268,"./common":197,"earcut":77}],200:[function(_dereq_,module,exports){ +},{"../geo":199,"../vector":266,"./common":194,"earcut":72}],197:[function(_dereq_,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -24265,7 +24119,7 @@ function permuteLine(line, startIndex) { return newLine; } -},{"../geo":202,"../vector":268,"./common":197}],201:[function(_dereq_,module,exports){ +},{"../geo":199,"../vector":266,"./common":194}],198:[function(_dereq_,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -24632,7 +24486,7 @@ var FlatCamera = function (_IsometricCamera) { return FlatCamera; }(IsometricCamera); -},{"./gl/shader_program":208,"./utils/gl-matrix":256,"./utils/utils":265}],202:[function(_dereq_,module,exports){ +},{"./gl/shader_program":205,"./utils/gl-matrix":254,"./utils/utils":263}],199:[function(_dereq_,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -24913,7 +24767,7 @@ Geo.ringWinding = function (ring) { // return undefined on zero area polygon }; -},{}],203:[function(_dereq_,module,exports){ +},{}],200:[function(_dereq_,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { @@ -24934,7 +24788,7 @@ gl.INT = 0x1404; gl.UNSIGNED_INT = 0x1405; gl.FLOAT = 0x1406; -},{}],204:[function(_dereq_,module,exports){ +},{}],201:[function(_dereq_,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -24987,7 +24841,7 @@ Context.resize = function (gl, width, height, device_pixel_ratio) { gl.viewport(0, 0, gl.canvas.width, gl.canvas.height); }; -},{}],205:[function(_dereq_,module,exports){ +},{}],202:[function(_dereq_,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { @@ -25017,7 +24871,7 @@ function getExtension(gl, name) { return exts[name]; } -},{}],206:[function(_dereq_,module,exports){ +},{}],203:[function(_dereq_,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -25295,7 +25149,7 @@ GLSL.expandVec4 = function (v) { } }; -},{}],207:[function(_dereq_,module,exports){ +},{}],204:[function(_dereq_,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { @@ -25398,7 +25252,7 @@ var RenderStateManager = function RenderStateManager(gl) { exports.default = RenderStateManager; -},{}],208:[function(_dereq_,module,exports){ +},{}],205:[function(_dereq_,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -26236,7 +26090,7 @@ ShaderProgram.createShader = function (gl, source, stype) { return shader; }; -},{"../utils/log":257,"./extensions":205,"./glsl":206,"./texture":209,"gl-shader-errors":94,"strip-comments":190}],209:[function(_dereq_,module,exports){ +},{"../utils/log":255,"./extensions":202,"./glsl":203,"./texture":206,"gl-shader-errors":90,"strip-comments":184}],206:[function(_dereq_,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -26778,7 +26632,7 @@ Texture.activeUnit = null; _worker_broker2.default.addTarget('Texture', Texture); (0, _subscribe2.default)(Texture); -},{"../utils/log":257,"../utils/subscribe":262,"../utils/utils":265,"../utils/worker_broker":267}],210:[function(_dereq_,module,exports){ +},{"../utils/log":255,"../utils/subscribe":260,"../utils/utils":263,"../utils/worker_broker":265}],207:[function(_dereq_,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -26877,7 +26731,7 @@ exports.default = { } }; -},{"../utils/log":257,"./extensions":205}],211:[function(_dereq_,module,exports){ +},{"../utils/log":255,"./extensions":202}],208:[function(_dereq_,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -27046,7 +26900,7 @@ var VBOMesh = function () { exports.default = VBOMesh; -},{"../utils/log":257,"./shader_program":208,"./vao":210}],212:[function(_dereq_,module,exports){ +},{"../utils/log":255,"./shader_program":205,"./vao":207}],209:[function(_dereq_,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -27204,7 +27058,7 @@ exports.default = VertexData; VertexData.array_pool = []; // pool of currently available (previously used) buffers (uint8) -},{"../utils/log":257,"./constants":203,"./vertex_elements":213}],213:[function(_dereq_,module,exports){ +},{"../utils/log":255,"./constants":200,"./vertex_elements":210}],210:[function(_dereq_,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -27281,7 +27135,7 @@ function createBuffer(array, overflown) { _worker_broker2.default.addTarget('VertexElements', VertexElements); -},{"../utils/worker_broker":267}],214:[function(_dereq_,module,exports){ +},{"../utils/worker_broker":265}],211:[function(_dereq_,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -27423,7 +27277,7 @@ var VertexLayout = function () { exports.default = VertexLayout; VertexLayout.enabled_attribs = {}; -},{"./constants":203,"./vertex_data":212}],215:[function(_dereq_,module,exports){ +},{"./constants":200,"./vertex_data":209}],212:[function(_dereq_,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -27599,7 +27453,7 @@ exports.default = Collision = { } }; -},{"../utils/log":257,"./repeat_group":222}],216:[function(_dereq_,module,exports){ +},{"../utils/log":255,"./repeat_group":219}],213:[function(_dereq_,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { @@ -27633,7 +27487,7 @@ function boxIntersectsList(a, boxes, callback) { } } -},{}],217:[function(_dereq_,module,exports){ +},{}],214:[function(_dereq_,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -27776,7 +27630,7 @@ exports.default = Label; Label.epsilon = 0.9999; // tolerance around collision boxes, prevent perfectly adjacent objects from colliding -},{"../utils/obb":260,"../utils/utils":265,"./intersect":216,"./point_anchor":220}],218:[function(_dereq_,module,exports){ +},{"../utils/obb":258,"../utils/utils":263,"./intersect":213,"./point_anchor":217}],215:[function(_dereq_,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -28325,7 +28179,7 @@ function calcFitness(line_length, label_length) { return 1 - line_length / label_length; } -},{"../utils/obb":260,"../vector":268,"./label":217}],219:[function(_dereq_,module,exports){ +},{"../utils/obb":258,"../vector":266,"./label":214}],216:[function(_dereq_,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -28538,7 +28392,7 @@ LabelPoint.PLACEMENT = { CENTROID: 3 // place labels at center of polygons }; -},{"../geo":202,"../styles/style_parser":245,"../utils/obb":260,"./label":217,"./point_anchor":220}],220:[function(_dereq_,module,exports){ +},{"../geo":199,"../styles/style_parser":243,"../utils/obb":258,"./label":214,"./point_anchor":217}],217:[function(_dereq_,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -28621,7 +28475,7 @@ exports.default = PointAnchor = { }; -},{}],221:[function(_dereq_,module,exports){ +},{}],218:[function(_dereq_,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -28782,7 +28636,7 @@ function interpolateSegment(p, q, distance) { return [ratio * p[0] + (1 - ratio) * q[0], ratio * p[1] + (1 - ratio) * q[1]]; } -},{"../builders/common":197,"./label_point":219}],222:[function(_dereq_,module,exports){ +},{"../builders/common":194,"./label_point":216}],219:[function(_dereq_,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -28907,7 +28761,7 @@ RepeatGroup.groups = {}; // will be allowed per group, e.g. set to tile size for one-label-per-tile RepeatGroup.max_repeat_dist = _geo2.default.tile_scale; -},{"../geo":202}],223:[function(_dereq_,module,exports){ +},{"../geo":199}],220:[function(_dereq_,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -29395,7 +29249,7 @@ function extendLeaflet(options) { } } -},{"./geo":202,"./scene":227,"./utils/thread":263}],224:[function(_dereq_,module,exports){ +},{"./geo":199,"./scene":224,"./utils/thread":261}],221:[function(_dereq_,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -29828,7 +29682,7 @@ var SpotLight = function (_PointLight) { Light.types['spotlight'] = SpotLight; -},{"./geo":202,"./gl/glsl":206,"./gl/shader_program":208,"./styles/style_parser":245,"./vector":268}],225:[function(_dereq_,module,exports){ +},{"./geo":199,"./gl/glsl":203,"./gl/shader_program":205,"./styles/style_parser":243,"./vector":266}],222:[function(_dereq_,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -29989,7 +29843,7 @@ exports.default = Material; Material.block = 'material'; -},{"./gl/glsl":206,"./styles/style_parser":245}],226:[function(_dereq_,module,exports){ +},{"./gl/glsl":203,"./styles/style_parser":243}],223:[function(_dereq_,module,exports){ 'use strict'; _dereq_('./utils/polyfills'); @@ -30151,7 +30005,7 @@ module.exports = { version: _version2.default }; -},{"./geo":202,"./gl/glsl":206,"./gl/shader_program":208,"./gl/texture":209,"./gl/vertex_data":212,"./labels/collision":215,"./leaflet_layer":223,"./light":224,"./material":225,"./scene":227,"./scene_worker":230,"./selection":231,"./sources/data_source":232,"./sources/geojson":233,"./sources/mvt":234,"./sources/raster":235,"./sources/topojson":236,"./styles/layer":237,"./styles/style_manager":244,"./styles/style_parser":245,"./styles/text/canvas_text":246,"./utils/debug_settings":254,"./utils/log":257,"./utils/polyfills":261,"./utils/thread":263,"./utils/utils":265,"./utils/version":266,"./utils/worker_broker":267,"./vector":268,"js-yaml":95,"jszip":131}],227:[function(_dereq_,module,exports){ +},{"./geo":199,"./gl/glsl":203,"./gl/shader_program":205,"./gl/texture":206,"./gl/vertex_data":209,"./labels/collision":212,"./leaflet_layer":220,"./light":221,"./material":222,"./scene":224,"./scene_worker":227,"./selection":228,"./sources/data_source":229,"./sources/geojson":230,"./sources/mvt":231,"./sources/raster":232,"./sources/topojson":233,"./styles/layer":235,"./styles/style_manager":242,"./styles/style_parser":243,"./styles/text/canvas_text":244,"./utils/debug_settings":252,"./utils/log":255,"./utils/polyfills":259,"./utils/thread":261,"./utils/utils":263,"./utils/version":264,"./utils/worker_broker":265,"./vector":266,"js-yaml":95,"jszip":131}],224:[function(_dereq_,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -30274,6 +30128,7 @@ var Scene = function () { this.config = null; this.config_source = config_source; + this.config_bundle = null; this.config_serialized = null; this.last_valid_config_source = null; @@ -31154,8 +31009,12 @@ var Scene = function () { this.config_path = URLs.pathForURL(config_path); } - return _scene_loader2.default.loadScene(this.config_source, this.config_path).then(function (config) { + return _scene_loader2.default.loadScene(this.config_source, this.config_path).then(function (_ref6) { + var config = _ref6.config, + bundle = _ref6.bundle; + _this9.config = config; + _this9.config_bundle = bundle; _this9.trigger('load', { config: _this9.config }); return _this9.config; }); @@ -31186,11 +31045,15 @@ var Scene = function () { var load = this.config.sources[name] == null; var source = this.config.sources[name] = Object.assign({}, config); + // Convert raw data into blob URL if (source.data && _typeof(source.data) === 'object') { source.url = URLs.createObjectURL(new Blob([JSON.stringify(source.data)])); delete source.data; } + // Resolve paths relative to root scene bundle + _scene_loader2.default.normalizeDataSource(source, this.config_bundle); + if (load) { return this.updateConfig({ rebuild: { sources: [name] } }); } else { @@ -31204,13 +31067,15 @@ var Scene = function () { var reset = []; // sources to reset var prev_source_names = Object.keys(this.sources); + var source_id = 0; for (var name in this.config.sources) { var source = this.config.sources[name]; var prev_source = this.sources[name]; try { - this.sources[name] = _data_source2.default.create(Object.assign({}, source, { name: name }), this.sources); + var config = Object.assign({}, source, { name: name, id: source_id++ }); + this.sources[name] = _data_source2.default.create(config, this.sources); if (!this.sources[name]) { throw {}; } @@ -31376,12 +31241,12 @@ var Scene = function () { }, { key: 'updateConfig', value: function updateConfig() { - var _ref6 = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}, - _ref6$rebuild = _ref6.rebuild, - rebuild = _ref6$rebuild === undefined ? true : _ref6$rebuild, - serialize_funcs = _ref6.serialize_funcs, - _ref6$fade_in = _ref6.fade_in, - fade_in = _ref6$fade_in === undefined ? false : _ref6$fade_in; + var _ref7 = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}, + _ref7$rebuild = _ref7.rebuild, + rebuild = _ref7$rebuild === undefined ? true : _ref7$rebuild, + serialize_funcs = _ref7.serialize_funcs, + _ref7$fade_in = _ref7.fade_in, + fade_in = _ref7$fade_in === undefined ? false : _ref7$fade_in; this.generation = ++Scene.generation; this.updating++; @@ -31415,9 +31280,9 @@ var Scene = function () { }, { key: 'syncConfigToWorker', value: function syncConfigToWorker() { - var _ref7 = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}, - _ref7$serialize_funcs = _ref7.serialize_funcs, - serialize_funcs = _ref7$serialize_funcs === undefined ? true : _ref7$serialize_funcs; + var _ref8 = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {}, + _ref8$serialize_funcs = _ref8.serialize_funcs, + serialize_funcs = _ref8$serialize_funcs === undefined ? true : _ref8$serialize_funcs; // Tell workers we're about to rebuild (so they can update styles, etc.) this.config_serialized = serialize_funcs ? _utils2.default.serializeWithFunctions(this.config) : JSON.stringify(this.config); @@ -31636,7 +31501,7 @@ exports.default = Scene; Scene.id = 0; // unique id for a scene instance Scene.generation = 0; // id that is incremented each time a scene config is re-parsed -},{"./gl/context":204,"./gl/render_state":207,"./gl/shader_program":208,"./gl/texture":209,"./gl/vao":210,"./light":224,"./scene_loader":229,"./selection":231,"./sources/data_source":232,"./styles/style":243,"./styles/style_manager":244,"./styles/style_parser":245,"./styles/text/font_manager":247,"./tile_manager":252,"./utils/log":257,"./utils/media_capture":258,"./utils/subscribe":262,"./utils/urls":264,"./utils/utils":265,"./utils/worker_broker":267,"./view":269}],228:[function(_dereq_,module,exports){ +},{"./gl/context":201,"./gl/render_state":204,"./gl/shader_program":205,"./gl/texture":206,"./gl/vao":207,"./light":221,"./scene_loader":226,"./selection":228,"./sources/data_source":229,"./styles/style":241,"./styles/style_manager":242,"./styles/style_parser":243,"./styles/text/font_manager":245,"./tile_manager":250,"./utils/log":255,"./utils/media_capture":256,"./utils/subscribe":260,"./utils/urls":262,"./utils/utils":263,"./utils/worker_broker":265,"./view":267}],225:[function(_dereq_,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -31663,6 +31528,10 @@ var _jszip = _dereq_('jszip'); var _jszip2 = _interopRequireDefault(_jszip); +var _jsYaml = _dereq_('js-yaml'); + +var _jsYaml2 = _interopRequireDefault(_jsYaml); + function _interopRequireWildcard(obj) { if (obj && obj.__esModule) { return obj; } else { var newObj = {}; if (obj != null) { for (var key in obj) { if (Object.prototype.hasOwnProperty.call(obj, key)) newObj[key] = obj[key]; } } newObj.default = obj; return newObj; } } function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } @@ -31708,7 +31577,7 @@ var SceneBundle = exports.SceneBundle = function () { _createClass(SceneBundle, [{ key: 'load', value: function load() { - return _utils2.default.loadResource(this.url); + return loadResource(this.url); } // Info for retrieving a specific resource from this bundle @@ -31824,7 +31693,7 @@ var ZipSceneBundle = exports.ZipSceneBundle = function (_SceneBundle) { var _this3 = this; return this.findRoot().then(function () { - return _utils2.default.loadResource(_this3.urlForZipFile(_this3.root)); + return loadResource(_this3.urlForZipFile(_this3.root)); }); } }, { @@ -31922,7 +31791,38 @@ function isGlobal(val) { return false; } -},{"./utils/urls":264,"./utils/utils":265,"jszip":131}],229:[function(_dereq_,module,exports){ +function parseResource(body) { + var data; + try { + // jsyaml 'json' option allows duplicate keys + // Keeping this for backwards compatibility, but should consider migrating to requiring + // unique keys, as this is YAML spec. But Tangram ES currently accepts dupe keys as well, + // so should consider how best to unify. + data = _jsYaml2.default.safeLoad(body, { json: true }); + } catch (e) { + throw e; + } + return data; +} + +function loadResource(source) { + return new Promise(function (resolve, reject) { + if (typeof source === 'string') { + _utils2.default.io(source).then(function (body) { + try { + var data = parseResource(body); + resolve(data); + } catch (e) { + reject(e); + } + }, reject); + } else { + resolve(source); + } + }); +} + +},{"./utils/urls":262,"./utils/utils":263,"js-yaml":95,"jszip":131}],226:[function(_dereq_,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -31970,9 +31870,12 @@ exports.default = SceneLoader = { var path = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null; var errors = []; - return this.loadSceneRecursive({ url: url, path: path }, null, errors).then(function (config) { - return _this.finalize(config); - }).then(function (config) { + return this.loadSceneRecursive({ url: url, path: path }, null, errors).then(function (result) { + return _this.finalize(result); + }).then(function (_ref) { + var config = _ref.config, + bundle = _ref.bundle; + if (!config) { // root scene failed to load, reject with first error return Promise.reject(errors[0]); @@ -31984,7 +31887,7 @@ exports.default = SceneLoader = { _this.trigger('error', { type: 'scene_import', message: message, error: error, url: error.url }); }); } - return config; + return { config: config, bundle: bundle }; }); }, @@ -31993,10 +31896,10 @@ exports.default = SceneLoader = { // Optional *initial* path only (won't be passed to recursive 'import' calls) // Useful for loading resources in base scene file from a separate location // (e.g. in Tangram Play, when modified local scene should still refer to original resource URLs) - loadSceneRecursive: function loadSceneRecursive(_ref, parent) { - var url = _ref.url, - path = _ref.path, - type = _ref.type; + loadSceneRecursive: function loadSceneRecursive(_ref2, parent) { + var url = _ref2.url, + path = _ref2.path, + type = _ref2.type; var _this2 = this; @@ -32010,8 +31913,7 @@ exports.default = SceneLoader = { return bundle.load().then(function (config) { if (config.import == null) { - _this2.normalize(config, bundle); - return config; + return _this2.normalize(config, bundle); } // accept single entry or array @@ -32033,15 +31935,18 @@ exports.default = SceneLoader = { return Promise.all(imports.map(function (resource) { return _this2.loadSceneRecursive(resource, bundle, errors); - })).then(function (configs) { + })).then(function (results) { + var configs = results.map(function (r) { + return r.config; + }); config = _merge2.default.apply(undefined, [{}].concat(_toConsumableArray(configs), [config])); - _this2.normalize(config, bundle); - return config; + return _this2.normalize(config, bundle); }); }).catch(function (error) { // Collect scene load errors as we go error.url = url; errors.push(error); + return {}; }); }, @@ -32051,7 +31956,7 @@ exports.default = SceneLoader = { this.normalizeDataSources(config, bundle); this.normalizeFonts(config, bundle); this.normalizeTextures(config, bundle); - return config; + return { config: config, bundle: bundle }; }, @@ -32060,18 +31965,22 @@ exports.default = SceneLoader = { config.sources = config.sources || {}; for (var sn in config.sources) { - var source = config.sources[sn]; - source.url = bundle.urlFor(source.url); - - if (Array.isArray(source.scripts)) { - source.scripts = source.scripts.map(function (url) { - return bundle.urlFor(url); - }); - } + this.normalizeDataSource(config.sources[sn], bundle); } return config; }, + normalizeDataSource: function normalizeDataSource(source, bundle) { + source.url = bundle.urlFor(source.url); + + if (Array.isArray(source.scripts)) { + source.scripts = source.scripts.map(function (url) { + return bundle.urlFor(url); + }); + } + + return source; + }, // Expand paths for fonts @@ -32133,11 +32042,11 @@ exports.default = SceneLoader = { // Shader uniforms if (style.shaders && style.shaders.uniforms) { - _glsl2.default.parseUniforms(style.shaders.uniforms).forEach(function (_ref2) { - var type = _ref2.type, - value = _ref2.value, - key = _ref2.key, - uniforms = _ref2.uniforms; + _glsl2.default.parseUniforms(style.shaders.uniforms).forEach(function (_ref3) { + var type = _ref3.type, + value = _ref3.value, + key = _ref3.key, + uniforms = _ref3.uniforms; // Texture by URL (string-named texture not referencing existing texture definition) if (type === 'sampler2D' && typeof value === 'string' && !config.textures[value] && !(0, _scene_bundle.isGlobal)(value)) { @@ -32173,10 +32082,10 @@ exports.default = SceneLoader = { // at run-time. Once a global property substitution has been recorderd, it will always be re-applied // on subsequent scene updates, even if the target property was updated to another literal value. // This is unlikely to be a common occurrence an acceptable limitation for now. - applied.forEach(function (_ref3) { - var prop = _ref3.prop, - target = _ref3.target, - key = _ref3.key; + applied.forEach(function (_ref4) { + var prop = _ref4.prop, + target = _ref4.target, + key = _ref4.key; if (target) { target[key] = props[prop]; @@ -32245,11 +32154,11 @@ exports.default = SceneLoader = { // Shader uniforms if (style.shaders && style.shaders.uniforms) { - _glsl2.default.parseUniforms(style.shaders.uniforms).forEach(function (_ref4) { - var type = _ref4.type, - value = _ref4.value, - key = _ref4.key, - uniforms = _ref4.uniforms; + _glsl2.default.parseUniforms(style.shaders.uniforms).forEach(function (_ref5) { + var type = _ref5.type, + value = _ref5.value, + key = _ref5.key, + uniforms = _ref5.uniforms; // Texture by URL (string-named texture not referencing existing texture definition) if (type === 'sampler2D' && typeof value === 'string' && !config.textures[value]) { @@ -32270,9 +32179,12 @@ exports.default = SceneLoader = { // Normalize some scene-wide settings that apply to the final, merged scene - finalize: function finalize(config) { + finalize: function finalize(_ref6) { + var config = _ref6.config, + bundle = _ref6.bundle; + if (!config) { - return; + return {}; } // Ensure top-level properties @@ -32282,12 +32194,6 @@ exports.default = SceneLoader = { config.styles = config.styles || {}; config.layers = config.layers || {}; - // Assign ids to data sources - var source_id = 0; - for (var source in config.sources) { - config.sources[source].id = source_id++; - } - // If only one camera specified, set it as default if (config.camera) { config.cameras.default = config.camera; @@ -32307,7 +32213,7 @@ exports.default = SceneLoader = { }; } - return config; + return { config: config, bundle: bundle }; } }; @@ -32335,7 +32241,7 @@ function flattenProperties(obj) { (0, _subscribe2.default)(SceneLoader); -},{"./gl/glsl":206,"./scene_bundle":228,"./utils/log":257,"./utils/merge":259,"./utils/subscribe":262,"./utils/urls":264}],230:[function(_dereq_,module,exports){ +},{"./gl/glsl":203,"./scene_bundle":225,"./utils/log":255,"./utils/merge":257,"./utils/subscribe":260,"./utils/urls":262}],227:[function(_dereq_,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -32662,7 +32568,7 @@ if (_thread2.default.is_worker) { _worker_broker2.default.addTarget('self', self); } -},{"./gl/texture":209,"./selection":231,"./sources/data_source":232,"./styles/layer":237,"./styles/style_manager":244,"./styles/style_parser":245,"./tile":251,"./utils/log":257,"./utils/merge":259,"./utils/thread":263,"./utils/utils":265,"./utils/worker_broker":267}],231:[function(_dereq_,module,exports){ +},{"./gl/texture":206,"./selection":228,"./sources/data_source":229,"./styles/layer":235,"./styles/style_manager":242,"./styles/style_parser":243,"./tile":249,"./utils/log":255,"./utils/merge":257,"./utils/thread":261,"./utils/utils":263,"./utils/worker_broker":265}],228:[function(_dereq_,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -32982,7 +32888,7 @@ FeatureSelection.map_entry = 0; FeatureSelection.map_prefix = 0; // set by worker to worker id # FeatureSelection.defaultColor = [0, 0, 0, 1]; -},{"./gl/texture":209,"./utils/log":257,"./utils/worker_broker":267}],232:[function(_dereq_,module,exports){ +},{"./gl/texture":206,"./utils/log":255,"./utils/worker_broker":265}],229:[function(_dereq_,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -33437,7 +33343,7 @@ var NetworkTileSource = exports.NetworkTileSource = function (_NetworkSource) { return NetworkTileSource; }(NetworkSource); -},{"../geo":202,"../utils/errors":255,"../utils/urls":264,"../utils/utils":265}],233:[function(_dereq_,module,exports){ +},{"../geo":199,"../utils/errors":253,"../utils/urls":262,"../utils/utils":263}],230:[function(_dereq_,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -33777,7 +33683,7 @@ function getCentroidFeatureForPolygon(coordinates, properties, newProperties) { }; } -},{"../geo":202,"../utils/log":257,"./data_source":232,"./mvt":234,"geojson-vt":81}],234:[function(_dereq_,module,exports){ +},{"../geo":199,"../utils/log":255,"./data_source":229,"./mvt":231,"geojson-vt":77}],231:[function(_dereq_,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -33945,7 +33851,7 @@ function decodeMultiPolygon(geom) { _data_source2.default.register(MVTSource, 'MVT'); -},{"../geo":202,"./data_source":232,"pbf":188,"vector-tile":192}],235:[function(_dereq_,module,exports){ +},{"../geo":199,"./data_source":229,"pbf":173,"vector-tile":190}],232:[function(_dereq_,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -34043,7 +33949,7 @@ var RasterTileSource = exports.RasterTileSource = function (_NetworkTileSource) _data_source2.default.register(RasterTileSource, 'Raster'); -},{"../geo":202,"../tile":251,"./data_source":232}],236:[function(_dereq_,module,exports){ +},{"../geo":199,"../tile":249,"./data_source":229}],233:[function(_dereq_,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -34171,7 +34077,164 @@ var TopoJSONTileSource = exports.TopoJSONTileSource = function (_GeoJSONTileSour _data_source2.default.register(TopoJSONTileSource, 'TopoJSON'); // prefered shorter name -},{"./data_source":232,"./geojson":233,"topojson-client":191}],237:[function(_dereq_,module,exports){ +},{"./data_source":229,"./geojson":230,"topojson-client":185}],234:[function(_dereq_,module,exports){ +'use strict'; + +Object.defineProperty(exports, "__esModule", { + value: true +}); + +var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function (obj) { return typeof obj; } : function (obj) { return obj && typeof Symbol === "function" && obj.constructor === Symbol && obj !== Symbol.prototype ? "symbol" : typeof obj; }; + +exports.buildFilter = buildFilter; +function notNull(x) { + return x != null; +} +function wrap(x) { + return '(' + x + ')'; +} + +function maybeQuote(value) { + if (typeof value === 'string') { + return '"' + value + '"'; + } + return value; +} + +function lookUp(key) { + if (key[0] === '$') { + return 'context[\'' + key.substring(1) + '\']'; + } + return 'context.feature.properties[\'' + key + '\']'; +} + +function nullValue(key, value) { + return ' true '; +} + +function propertyEqual(key, value) { + return wrap(maybeQuote(value) + ' === ' + lookUp(key)); +} + +function propertyOr(key, values) { + return wrap(values.map(function (x) { + return propertyEqual(key, x); + }).join(' || ')); +} + +function printNested(values, joiner) { + return wrap(values.filter(notNull).map(function (x) { + return wrap(x.join(' && ')); + }).join(' ' + joiner + ' ')); +} + +function any(_, values, options) { + return values && values.length > 0 ? printNested(values.map(function (v) { + return parseFilter(v, options); + }), '||') : 'true'; +} + +function all(_, values, options) { + return values && values.length > 0 ? printNested(values.map(function (v) { + return parseFilter(v, options); + }), '&&') : 'true'; +} + +function not(key, value, options) { + return '!' + wrap(parseFilter(value, options).join(' && ')); +} + +function none(key, values, options) { + return '!' + wrap(any(null, values, options)); +} + +function propertyMatchesBoolean(key, value) { + return wrap(lookUp(key) + (value ? ' != ' : ' == ') + 'null'); +} + +function rangeMatch(key, values, options) { + var expressions = []; + var transform = options && typeof options.rangeTransform === 'function' && options.rangeTransform; + + if (values.max) { + var max = transform ? transform(values.max) : values.max; + expressions.push('' + lookUp(key) + ' < ' + max); + } + + if (values.min) { + var min = transform ? min = transform(values.min) : values.min; + expressions.push('' + lookUp(key) + ' >= ' + min); + } + + return wrap(expressions.join(' && ')); +} + +function parseFilter(filter, options) { + var filterAST = []; + + // Function filter + if (typeof filter === 'function') { + return [wrap(filter.toString() + '(context)')]; + } + // Array filter, implicit 'any' + else if (Array.isArray(filter)) { + return [any(null, filter, options)]; + } + // Null filter object + else if (filter == null) { + return ['true']; + } + + // Object filter, e.g. implicit 'all' + var keys = Object.keys(filter); + for (var k = 0; k < keys.length; k++) { + var key = keys[k]; + + var value = filter[key], + type = typeof value === 'undefined' ? 'undefined' : _typeof(value); + if (type === 'string' || type === 'number') { + filterAST.push(propertyEqual(key, value)); + } else if (type === 'boolean') { + filterAST.push(propertyMatchesBoolean(key, value)); + } else if (key === 'not') { + filterAST.push(not(key, value, options)); + } else if (key === 'any') { + filterAST.push(any(key, value, options)); + } else if (key === 'all') { + filterAST.push(all(key, value, options)); + } else if (key === 'none') { + filterAST.push(none(key, value, options)); + } else if (Array.isArray(value)) { + filterAST.push(propertyOr(key, value)); + } else if (type === 'object' && value != null) { + if (value.max || value.min) { + filterAST.push(rangeMatch(key, value, options)); + } + } else if (value == null) { + filterAST.push(nullValue(key, value)); + } else { + throw new Error('Unknown Query sytnax: ' + value); + } + } + + return keys.length === 0 ? ['true'] : filterAST; +} + +function filterToString(filterAST) { + return wrap(filterAST.join(' && ')); +} + +function buildFilter(filter, options) { + if (filter == null) { + return function () { + return true; + }; + } + // jshint evil: true + return new Function('context', 'return ' + filterToString(parseFilter(filter, options)) + ';'); +} + +},{}],235:[function(_dereq_,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -34206,7 +34269,7 @@ var _merge = _dereq_('../utils/merge'); var _merge2 = _interopRequireDefault(_merge); -var _matchFeature = _dereq_('match-feature'); +var _filter = _dereq_('./filter'); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } @@ -34367,7 +34430,7 @@ var Layer = function () { this.buildZooms(); this.buildPropMatches(); if (this.filter != null && (typeof this.filter === 'function' || Object.keys(this.filter).length > 0)) { - this.filter = (0, _matchFeature.match)(this.filter, FilterOptions); + this.filter = (0, _filter.buildFilter)(this.filter, FilterOptions); } else { this.filter = null; } @@ -34445,9 +34508,9 @@ var Layer = function () { value: function doPropMatches(context) { if (this.feature_prop_matches) { for (var r = 0; r < this.feature_prop_matches.length; r++) { - var _match = this.feature_prop_matches[r]; - var val = context.feature.properties[_match[0]]; - if (val == null || _match[1].indexOf(val) === -1) { + var match = this.feature_prop_matches[r]; + var val = context.feature.properties[match[0]]; + if (val == null || match[1].indexOf(val) === -1) { return false; } } @@ -34455,9 +34518,9 @@ var Layer = function () { if (this.context_prop_matches) { for (var _r = 0; _r < this.context_prop_matches.length; _r++) { - var _match2 = this.context_prop_matches[_r]; - var _val = context[_match2[0]]; - if (_val == null || _match2[1].indexOf(_val) === -1) { + var _match = this.context_prop_matches[_r]; + var _val = context[_match[0]]; + if (_val == null || _match[1].indexOf(_val) === -1) { return false; } } @@ -34739,7 +34802,7 @@ function matchFeature(context, layers, collected_layers, collected_layers_ids) { return matched; } -},{"../utils/log":257,"../utils/merge":259,"../utils/utils":265,"./style_parser":245,"match-feature":186}],238:[function(_dereq_,module,exports){ +},{"../utils/log":255,"../utils/merge":257,"../utils/utils":263,"./filter":234,"./style_parser":243}],236:[function(_dereq_,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { @@ -34790,7 +34853,7 @@ function renderDashArray(pattern) { return { pixels: pixels, length: length }; } -},{}],239:[function(_dereq_,module,exports){ +},{}],237:[function(_dereq_,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -35143,7 +35206,7 @@ Object.assign(Lines, { } }); -},{"../../builders/polylines":200,"../../geo":202,"../../gl/constants":203,"../../gl/texture":209,"../../gl/vertex_layout":214,"../polygons/polygons":241,"../style":243,"../style_parser":245,"./dasharray":238}],240:[function(_dereq_,module,exports){ +},{"../../builders/polylines":197,"../../geo":199,"../../gl/constants":200,"../../gl/texture":206,"../../gl/vertex_layout":211,"../polygons/polygons":239,"../style":241,"../style_parser":243,"./dasharray":236}],238:[function(_dereq_,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -35836,7 +35899,7 @@ Object.assign(Points, { } }); -},{"../../builders/points":198,"../../geo":202,"../../gl/constants":203,"../../gl/texture":209,"../../gl/vertex_layout":214,"../../labels/collision":215,"../../labels/label_point":219,"../../labels/point_placement":221,"../../utils/debug_settings":254,"../../utils/log":257,"../../vector":268,"../../view":269,"../style":243,"../style_parser":245,"../text/text_labels":249}],241:[function(_dereq_,module,exports){ +},{"../../builders/points":195,"../../geo":199,"../../gl/constants":200,"../../gl/texture":206,"../../gl/vertex_layout":211,"../../labels/collision":212,"../../labels/label_point":216,"../../labels/point_placement":218,"../../utils/debug_settings":252,"../../utils/log":255,"../../vector":266,"../../view":267,"../style":241,"../style_parser":243,"../text/text_labels":247}],239:[function(_dereq_,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -36017,7 +36080,7 @@ Object.assign(Polygons, { } }); -},{"../../builders/polygons":199,"../../geo":202,"../../gl/constants":203,"../../gl/vertex_layout":214,"../style":243,"../style_parser":245}],242:[function(_dereq_,module,exports){ +},{"../../builders/polygons":196,"../../geo":199,"../../gl/constants":200,"../../gl/vertex_layout":211,"../style":241,"../style_parser":243}],240:[function(_dereq_,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -36053,7 +36116,7 @@ Object.assign(RasterStyle, { } }); -},{"../polygons/polygons":241,"../style_parser":245}],243:[function(_dereq_,module,exports){ +},{"../polygons/polygons":239,"../style_parser":243}],241:[function(_dereq_,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -36720,7 +36783,7 @@ var Style = exports.Style = { } }; -},{"../gl/shader_program":208,"../gl/texture":209,"../gl/vbo_mesh":211,"../light":224,"../material":225,"../selection":231,"../sources/raster":235,"../utils/log":257,"../utils/thread":263,"../utils/worker_broker":267,"./style_parser":245}],244:[function(_dereq_,module,exports){ +},{"../gl/shader_program":205,"../gl/texture":206,"../gl/vbo_mesh":208,"../light":221,"../material":222,"../selection":228,"../sources/raster":232,"../utils/log":255,"../utils/thread":261,"../utils/worker_broker":265,"./style_parser":243}],242:[function(_dereq_,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -37229,7 +37292,7 @@ var StyleManager = exports.StyleManager = function () { return StyleManager; }(); -},{"../geo":202,"../gl/shader_program":208,"../utils/log":257,"../utils/merge":259,"./lines/lines":239,"./points/points":240,"./polygons/polygons":241,"./raster/raster":242,"./text/text":248}],245:[function(_dereq_,module,exports){ +},{"../geo":199,"../gl/shader_program":205,"../utils/log":255,"../utils/merge":257,"./lines/lines":237,"./points/points":238,"./polygons/polygons":239,"./raster/raster":240,"./text/text":246}],243:[function(_dereq_,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -37639,7 +37702,7 @@ StyleParser.evalProperty = function (prop, context) { return prop; }; -},{"../geo":202,"../utils/utils":265,"csscolorparser":76}],246:[function(_dereq_,module,exports){ +},{"../geo":199,"../utils/utils":263,"csscolorparser":71}],244:[function(_dereq_,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -38349,7 +38412,7 @@ var Line = function () { return Line; }(); -},{"../../gl/texture":209,"../../utils/debug_settings":254,"../../utils/utils":265,"./font_manager":247}],247:[function(_dereq_,module,exports){ +},{"../../gl/texture":206,"../../utils/debug_settings":252,"../../utils/utils":263,"./font_manager":245}],245:[function(_dereq_,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -38519,7 +38582,7 @@ var FontManager = { exports.default = FontManager; -},{"../../utils/log":257,"../../utils/utils":265,"fontfaceobserver":78}],248:[function(_dereq_,module,exports){ +},{"../../utils/log":255,"../../utils/utils":263,"fontfaceobserver":74}],246:[function(_dereq_,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -38820,7 +38883,7 @@ function placementStrategy(label) { TextStyle.texture_id = 0; // namespaces per-tile label textures -},{"../../geo":202,"../../labels/collision":215,"../../labels/label_line":218,"../../labels/label_point":219,"../points/points":240,"../style":243}],249:[function(_dereq_,module,exports){ +},{"../../geo":199,"../../labels/collision":212,"../../labels/label_line":215,"../../labels/label_point":216,"../points/points":238,"../style":241}],247:[function(_dereq_,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -39140,7 +39203,7 @@ var TextLabels = exports.TextLabels = { } }; -},{"../../geo":202,"../../gl/texture":209,"../../labels/collision":215,"../../utils/log":257,"../../utils/thread":263,"../../utils/worker_broker":267,"../style_parser":245,"../text/canvas_text":246,"../text/text_settings":250}],250:[function(_dereq_,module,exports){ +},{"../../geo":199,"../../gl/texture":206,"../../labels/collision":212,"../../utils/log":255,"../../utils/thread":261,"../../utils/worker_broker":265,"../style_parser":243,"../text/canvas_text":244,"../text/text_settings":248}],248:[function(_dereq_,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -39264,7 +39327,7 @@ exports.default = TextSettings = { } }; -},{"../../geo":202,"../../utils/utils":265,"../style_parser":245}],251:[function(_dereq_,module,exports){ +},{"../../geo":199,"../../utils/utils":263,"../style_parser":243}],249:[function(_dereq_,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -40002,7 +40065,7 @@ exports.default = Tile; Tile.coord_children = {}; // only allocate children coordinates once per coordinate -},{"./geo":202,"./gl/texture":209,"./labels/collision":215,"./styles/style_parser":245,"./utils/gl-matrix":256,"./utils/log":257,"./utils/worker_broker":267}],252:[function(_dereq_,module,exports){ +},{"./geo":199,"./gl/texture":206,"./labels/collision":212,"./styles/style_parser":243,"./utils/gl-matrix":254,"./utils/log":255,"./utils/worker_broker":265}],250:[function(_dereq_,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -40487,7 +40550,7 @@ var TileManager = function () { exports.default = TileManager; -},{"./tile":251,"./tile_pyramid":253,"./utils/log":257,"./utils/worker_broker":267}],253:[function(_dereq_,module,exports){ +},{"./tile":249,"./tile_pyramid":251,"./utils/log":255,"./utils/worker_broker":265}],251:[function(_dereq_,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -40669,7 +40732,7 @@ var TilePyramid = function () { exports.default = TilePyramid; -},{"./geo":202,"./tile":251}],254:[function(_dereq_,module,exports){ +},{"./geo":199,"./tile":249}],252:[function(_dereq_,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { @@ -40686,7 +40749,7 @@ exports.default = { suppress_label_snap_animation: false }; -},{}],255:[function(_dereq_,module,exports){ +},{}],253:[function(_dereq_,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -40715,7 +40778,7 @@ var MethodNotImplemented = exports.MethodNotImplemented = function (_Error) { return MethodNotImplemented; }(Error); -},{}],256:[function(_dereq_,module,exports){ +},{}],254:[function(_dereq_,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -40802,7 +40865,7 @@ exports.vec3 = vec3; exports.mat3 = mat3; exports.mat4 = mat4; -},{"gl-mat3/invert":85,"gl-mat3/normal-from-mat4":86,"gl-mat4/copy":87,"gl-mat4/identity":88,"gl-mat4/lookAt":89,"gl-mat4/multiply":90,"gl-mat4/perspective":91,"gl-mat4/scale":92,"gl-mat4/translate":93}],257:[function(_dereq_,module,exports){ +},{"gl-mat3/invert":81,"gl-mat3/normal-from-mat4":82,"gl-mat4/copy":83,"gl-mat4/identity":84,"gl-mat4/lookAt":85,"gl-mat4/multiply":86,"gl-mat4/perspective":87,"gl-mat4/scale":88,"gl-mat4/translate":89}],255:[function(_dereq_,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -40886,7 +40949,7 @@ if (_thread2.default.is_main) { _worker_broker2.default.addTarget('_logProxy', log); // proxy log messages from worker to main thread _worker_broker2.default.addTarget('_logSetLevelProxy', log.setLevel); // proxy log level setting from main to worker thread -},{"./thread":263,"./version":266,"./worker_broker":267}],258:[function(_dereq_,module,exports){ +},{"./thread":261,"./version":264,"./worker_broker":265}],256:[function(_dereq_,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -41051,7 +41114,7 @@ var MediaCapture = function () { exports.default = MediaCapture; -},{"./log":257,"./urls":264}],259:[function(_dereq_,module,exports){ +},{"./log":255,"./urls":262}],257:[function(_dereq_,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -41095,7 +41158,7 @@ function mergeObjects(dest) { return dest; } -},{}],260:[function(_dereq_,module,exports){ +},{}],258:[function(_dereq_,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -41212,7 +41275,7 @@ var OBB = function () { exports.default = OBB; -},{"../vector":268}],261:[function(_dereq_,module,exports){ +},{"../vector":266}],259:[function(_dereq_,module,exports){ 'use strict'; _dereq_('core-js/es6/promise'); @@ -41245,7 +41308,7 @@ if (typeof Object.assign !== 'function') { })(); } // Promises polyfill -},{"core-js/es6/promise":12}],262:[function(_dereq_,module,exports){ +},{"core-js/es6/promise":6}],260:[function(_dereq_,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -41294,7 +41357,7 @@ function subscribeMixin(target) { }); } -},{}],263:[function(_dereq_,module,exports){ +},{}],261:[function(_dereq_,module,exports){ "use strict"; Object.defineProperty(exports, "__esModule", { @@ -41326,7 +41389,7 @@ try { } } -},{}],264:[function(_dereq_,module,exports){ +},{}],262:[function(_dereq_,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -41519,7 +41582,7 @@ function findCurrentURL() { } } -},{"./log":257}],265:[function(_dereq_,module,exports){ +},{"./log":255}],263:[function(_dereq_,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -41545,10 +41608,6 @@ var _geo = _dereq_('../geo'); var _geo2 = _interopRequireDefault(_geo); -var _jsYaml = _dereq_('js-yaml'); - -var _jsYaml2 = _interopRequireDefault(_jsYaml); - function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } function _toConsumableArray(arr) { if (Array.isArray(arr)) { for (var i = 0, arr2 = Array(arr.length); i < arr.length; i++) { arr2[i] = arr[i]; } return arr2; } else { return Array.from(arr); } } @@ -41611,45 +41670,17 @@ Utils.io = function (url) { request.send(); }); - Object.defineProperty(promise, 'request', { - value: request + promise = promise.then(function (response) { + return proxy && _worker_broker2.default.withTransferables(response) || response; }); - return promise.then(function (response) { - return proxy && _worker_broker2.default.withTransferables(response) || response; + // Attach request to promise to allow for XHR cancellation + Object.defineProperty(promise, 'request', { + value: request }); - } -}; -Utils.parseResource = function (body) { - var data; - try { - // jsyaml 'json' option allows duplicate keys - // Keeping this for backwards compatibility, but should consider migrating to requiring - // unique keys, as this is YAML spec. But Tangram ES currently accepts dupe keys as well, - // so should consider how best to unify. - data = _jsYaml2.default.safeLoad(body, { json: true }); - } catch (e) { - throw e; + return promise; } - return data; -}; - -Utils.loadResource = function (source) { - return new Promise(function (resolve, reject) { - if (typeof source === 'string') { - Utils.io(source).then(function (body) { - try { - var data = Utils.parseResource(body); - resolve(data); - } catch (e) { - reject(e); - } - }, reject); - } else { - resolve(source); - } - }); }; // Needed for older browsers that still support WebGL (Safari 6 etc.) @@ -41833,18 +41864,18 @@ Utils.pointInTile = function (point) { return point[0] >= 0 && point[1] > -_geo2.default.tile_scale && point[0] < _geo2.default.tile_scale && point[1] <= 0; }; -},{"../geo":202,"./log":257,"./thread":263,"./worker_broker":267,"js-yaml":95}],266:[function(_dereq_,module,exports){ +},{"../geo":199,"./log":255,"./thread":261,"./worker_broker":265}],264:[function(_dereq_,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { value: true }); -var pkg = JSON.parse("{\n \"name\": \"tangram\",\n \"version\": \"0.11.2\",\n \"description\": \"WebGL Maps for Vector Tiles\",\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"git://github.com/tangrams/tangram.git\"\n },\n \"main\": \"dist/tangram.min.js\",\n \"homepage\": \"https://github.com/tangrams/tangram\",\n \"keywords\": [\n \"maps\",\n \"graphics\",\n \"rendering\",\n \"visualization\",\n \"WebGL\",\n \"OpenStreetMap\"\n ],\n \"scripts\": {\n \"start\": \"npm run watch\",\n \"test\": \"npm run lint && npm run build-test && npm run test-local\",\n \"test-ci\": \"npm run lint && npm run build-test && npm run test-remote\",\n \"test-remote\": \"./node_modules/karma/bin/karma start --browsers SL_Firefox --single-run\",\n \"test-local\": \"./node_modules/karma/bin/karma start --browsers Chrome --single-run\",\n \"karma-start\": \"./node_modules/karma/bin/karma start --browsers Chrome --no-watch\",\n \"karma-run\": \"./node_modules/karma/bin/karma run --browsers Chrome\",\n \"lint\": \"$(npm bin)/jshint src/ && jshint test/\",\n \"build\": \"npm run build-bundle -- -o dist/tangram.debug.js && npm run build-minify\",\n \"build-test\": \"npm run build-bundle -- -o dist/tangram.test.js\",\n \"build-debug\": \"npm run build-bundle -- -o dist/tangram.debug.js\",\n \"build-bundle\": \"$(npm bin)/browserify src/module.js -t [ babelify --presets [ es2015 ] ] -t brfs -s Tangram -p browserify-derequire --debug\",\n \"build-minify\": \"$(npm bin)/uglifyjs dist/tangram.debug.js -c warnings=false -m -o dist/tangram.min.js && npm run build-size\",\n \"build-size\": \"gzip dist/tangram.min.js -c | wc -c | awk '{kb=$1/1024; print kb}' OFMT='%.0fk minified+gzipped'\",\n \"watch\": \"$(npm bin)/budo src/module.js:dist/tangram.debug.js --port 8000 --cors --live -- -t [ babelify --presets [ es2015 ] ] -t brfs -s Tangram\"\n },\n \"author\": {\n \"name\": \"Mapzen\",\n \"email\": \"tangram@mapzen.com\"\n },\n \"contributors\": [\n {\n \"name\": \"Brett Camper\"\n },\n {\n \"name\": \"Peter Richardson\"\n },\n {\n \"name\": \"Patricio Gonzalez Vivo\"\n },\n {\n \"name\": \"Karim Naaji\"\n },\n {\n \"name\": \"Ivan Willig\"\n },\n {\n \"name\": \"Lou Huang\"\n },\n {\n \"name\": \"David Valdman\"\n }\n ],\n \"license\": \"MIT\",\n \"dependencies\": {\n \"brfs\": \"1.4.3\",\n \"csscolorparser\": \"1.0.3\",\n \"earcut\": \"2.1.1\",\n \"fontfaceobserver\": \"1.7.1\",\n \"geojson-vt\": \"2.1.6\",\n \"gl-mat3\": \"1.0.0\",\n \"gl-mat4\": \"1.1.4\",\n \"gl-shader-errors\": \"1.0.3\",\n \"js-yaml\": \"tangrams/js-yaml#read-only\",\n \"jszip\": \"tangrams/jszip#read-only\",\n \"match-feature\": \"tangrams/match-feature#v1.3.1\",\n \"pbf\": \"1.3.2\",\n \"strip-comments\": \"0.3.2\",\n \"topojson-client\": \"tangrams/topojson-client#read-only\",\n \"vector-tile\": \"1.1.2\"\n },\n \"devDependencies\": {\n \"babelify\": \"7.3.0\",\n \"babel-preset-es2015\": \"6.16.0\",\n \"browserify\": \"13.0.1\",\n \"browserify-derequire\": \"0.9.4\",\n \"budo\": \"8.2.1\",\n \"chai\": \"1.9.2\",\n \"chai-as-promised\": \"4.1.1\",\n \"core-js\": \"2.4.1\",\n \"glob\": \"4.0.6\",\n \"jshint\": \"jshint/jshint#3a8efa979dbb157bfb5c10b5826603a55a33b9ad\",\n \"karma\": \"0.12.23\",\n \"karma-browserify\": \"5.1.0\",\n \"karma-chrome-launcher\": \"0.1.4\",\n \"karma-mocha\": \"0.1.9\",\n \"karma-mocha-reporter\": \"1.0.0\",\n \"karma-sauce-launcher\": \"tangrams/karma-sauce-launcher#firefox-profiles\",\n \"karma-sinon\": \"1.0.4\",\n \"mocha\": \"1.21.4\",\n \"sinon\": \"1.10.3\",\n \"uglify-js\": \"2.4.14\",\n \"yargs\": \"1.3.2\"\n }\n}\n"); +var pkg = JSON.parse("{\n \"name\": \"tangram\",\n \"version\": \"0.11.3\",\n \"description\": \"WebGL Maps for Vector Tiles\",\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"git://github.com/tangrams/tangram.git\"\n },\n \"main\": \"dist/tangram.min.js\",\n \"homepage\": \"https://github.com/tangrams/tangram\",\n \"keywords\": [\n \"maps\",\n \"graphics\",\n \"rendering\",\n \"visualization\",\n \"WebGL\",\n \"OpenStreetMap\"\n ],\n \"scripts\": {\n \"start\": \"npm run watch\",\n \"test\": \"npm run lint && npm run build-test && npm run test-local\",\n \"test-ci\": \"npm run lint && npm run build-test && npm run test-remote\",\n \"test-remote\": \"./node_modules/karma/bin/karma start --browsers SL_Firefox --single-run\",\n \"test-local\": \"./node_modules/karma/bin/karma start --browsers Chrome --single-run\",\n \"karma-start\": \"./node_modules/karma/bin/karma start --browsers Chrome --no-watch\",\n \"karma-run\": \"./node_modules/karma/bin/karma run --browsers Chrome\",\n \"lint\": \"$(npm bin)/jshint src/ && jshint test/\",\n \"build\": \"npm run build-bundle -- -o dist/tangram.debug.js && npm run build-minify\",\n \"build-test\": \"npm run build-bundle -- -o dist/tangram.test.js\",\n \"build-debug\": \"npm run build-bundle -- -o dist/tangram.debug.js\",\n \"build-bundle\": \"$(npm bin)/browserify src/module.js -t [ babelify --presets [ es2015 ] ] -t brfs -s Tangram -p browserify-derequire --debug\",\n \"build-minify\": \"$(npm bin)/uglifyjs dist/tangram.debug.js -c warnings=false -m -o dist/tangram.min.js && npm run build-size\",\n \"build-size\": \"gzip dist/tangram.min.js -c | wc -c | awk '{kb=$1/1024; print kb}' OFMT='%.0fk minified+gzipped'\",\n \"watch\": \"$(npm bin)/budo src/module.js:dist/tangram.debug.js --port 8000 --cors --live -- -t [ babelify --presets [ es2015 ] ] -t brfs -s Tangram\"\n },\n \"author\": {\n \"name\": \"Mapzen\",\n \"email\": \"tangram@mapzen.com\"\n },\n \"contributors\": [\n {\n \"name\": \"Brett Camper\"\n },\n {\n \"name\": \"Peter Richardson\"\n },\n {\n \"name\": \"Patricio Gonzalez Vivo\"\n },\n {\n \"name\": \"Karim Naaji\"\n },\n {\n \"name\": \"Ivan Willig\"\n },\n {\n \"name\": \"Lou Huang\"\n },\n {\n \"name\": \"David Valdman\"\n }\n ],\n \"license\": \"MIT\",\n \"dependencies\": {\n \"brfs\": \"1.4.3\",\n \"csscolorparser\": \"1.0.3\",\n \"earcut\": \"2.1.1\",\n \"fontfaceobserver\": \"1.7.1\",\n \"geojson-vt\": \"2.1.6\",\n \"gl-mat3\": \"1.0.0\",\n \"gl-mat4\": \"1.1.4\",\n \"gl-shader-errors\": \"1.0.3\",\n \"js-yaml\": \"tangrams/js-yaml#read-only\",\n \"jszip\": \"tangrams/jszip#read-only\",\n \"pbf\": \"1.3.2\",\n \"strip-comments\": \"0.3.2\",\n \"topojson-client\": \"tangrams/topojson-client#read-only\",\n \"vector-tile\": \"1.1.2\"\n },\n \"devDependencies\": {\n \"babelify\": \"7.3.0\",\n \"babel-preset-es2015\": \"6.16.0\",\n \"browserify\": \"13.0.1\",\n \"browserify-derequire\": \"0.9.4\",\n \"budo\": \"8.2.1\",\n \"chai\": \"1.9.2\",\n \"chai-as-promised\": \"4.1.1\",\n \"core-js\": \"2.4.1\",\n \"glob\": \"4.0.6\",\n \"jshint\": \"jshint/jshint#3a8efa979dbb157bfb5c10b5826603a55a33b9ad\",\n \"karma\": \"0.12.23\",\n \"karma-browserify\": \"5.1.0\",\n \"karma-chrome-launcher\": \"0.1.4\",\n \"karma-mocha\": \"0.1.9\",\n \"karma-mocha-reporter\": \"1.0.0\",\n \"karma-sauce-launcher\": \"tangrams/karma-sauce-launcher#firefox-profiles\",\n \"karma-sinon\": \"1.0.4\",\n \"mocha\": \"1.21.4\",\n \"sinon\": \"1.10.3\",\n \"uglify-js\": \"2.4.14\",\n \"yargs\": \"1.3.2\"\n }\n}\n"); var version = void 0; exports.default = version = 'v' + pkg.version; -},{}],267:[function(_dereq_,module,exports){ +},{}],265:[function(_dereq_,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -42424,7 +42455,7 @@ if (_thread2.default.is_worker) { setupWorkerThread(); } -},{"./log":257,"./thread":263}],268:[function(_dereq_,module,exports){ +},{"./log":255,"./thread":261}],266:[function(_dereq_,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -42615,7 +42646,7 @@ Vector.dot = function (v1, v2) { return n; }; -},{}],269:[function(_dereq_,module,exports){ +},{}],267:[function(_dereq_,module,exports){ 'use strict'; Object.defineProperty(exports, "__esModule", { @@ -43050,6 +43081,6 @@ var View = function () { exports.default = View; -},{"./camera":201,"./geo":202,"./tile":251,"./utils/log":257,"./utils/subscribe":262,"./utils/utils":265}]},{},[226])(226) +},{"./camera":198,"./geo":199,"./tile":249,"./utils/log":255,"./utils/subscribe":260,"./utils/utils":263}]},{},[223])(223) }); -//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm5vZGVfbW9kdWxlcy9icm93c2VyaWZ5L25vZGVfbW9kdWxlcy9icm93c2VyLXBhY2svX3ByZWx1ZGUuanMiLCJub2RlX21vZHVsZXMvYnJvd3NlcmlmeS9ub2RlX21vZHVsZXMvYnJvd3Nlci1yZXNvbHZlL2VtcHR5LmpzIiwibm9kZV9tb2R1bGVzL2Jyb3dzZXJpZnkvbm9kZV9tb2R1bGVzL2J1ZmZlci9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9icm93c2VyaWZ5L25vZGVfbW9kdWxlcy9idWZmZXIvbm9kZV9tb2R1bGVzL2Jhc2U2NC1qcy9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9icm93c2VyaWZ5L25vZGVfbW9kdWxlcy9idWZmZXIvbm9kZV9tb2R1bGVzL2llZWU3NTQvaW5kZXguanMiLCJub2RlX21vZHVsZXMvYnJvd3NlcmlmeS9ub2RlX21vZHVsZXMvYnVmZmVyL25vZGVfbW9kdWxlcy9pc2FycmF5L2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL2Jyb3dzZXJpZnkvbm9kZV9tb2R1bGVzL2V2ZW50cy9ldmVudHMuanMiLCJub2RlX21vZHVsZXMvYnJvd3NlcmlmeS9ub2RlX21vZHVsZXMvaW5zZXJ0LW1vZHVsZS1nbG9iYWxzL25vZGVfbW9kdWxlcy9pcy1idWZmZXIvaW5kZXguanMiLCJub2RlX21vZHVsZXMvYnJvd3NlcmlmeS9ub2RlX21vZHVsZXMvcHJvY2Vzcy9icm93c2VyLmpzIiwibm9kZV9tb2R1bGVzL2Jyb3dzZXJpZnkvbm9kZV9tb2R1bGVzL3V0aWwvbm9kZV9tb2R1bGVzL2luaGVyaXRzL2luaGVyaXRzX2Jyb3dzZXIuanMiLCJub2RlX21vZHVsZXMvYnJvd3NlcmlmeS9ub2RlX21vZHVsZXMvdXRpbC9zdXBwb3J0L2lzQnVmZmVyQnJvd3Nlci5qcyIsIm5vZGVfbW9kdWxlcy9icm93c2VyaWZ5L25vZGVfbW9kdWxlcy91dGlsL3V0aWwuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9lczYvcHJvbWlzZS5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX2EtZnVuY3Rpb24uanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19hZGQtdG8tdW5zY29wYWJsZXMuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19hbi1pbnN0YW5jZS5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX2FuLW9iamVjdC5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX2FycmF5LWluY2x1ZGVzLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fY2xhc3NvZi5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX2NvZi5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX2NvcmUuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19jdHguanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19kZWZpbmVkLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fZGVzY3JpcHRvcnMuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19kb20tY3JlYXRlLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fZW51bS1idWcta2V5cy5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX2V4cG9ydC5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX2ZhaWxzLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fZm9yLW9mLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fZ2xvYmFsLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9faGFzLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9faGlkZS5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX2h0bWwuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19pZTgtZG9tLWRlZmluZS5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX2ludm9rZS5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX2lvYmplY3QuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19pcy1hcnJheS1pdGVyLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9faXMtb2JqZWN0LmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9faXRlci1jYWxsLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9faXRlci1jcmVhdGUuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19pdGVyLWRlZmluZS5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX2l0ZXItZGV0ZWN0LmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9faXRlci1zdGVwLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9faXRlcmF0b3JzLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fbGlicmFyeS5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX21pY3JvdGFzay5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX29iamVjdC1jcmVhdGUuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19vYmplY3QtZHAuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19vYmplY3QtZHBzLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fb2JqZWN0LWdwby5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX29iamVjdC1rZXlzLWludGVybmFsLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fb2JqZWN0LWtleXMuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19wcm9wZXJ0eS1kZXNjLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fcmVkZWZpbmUtYWxsLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fcmVkZWZpbmUuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19zZXQtc3BlY2llcy5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX3NldC10by1zdHJpbmctdGFnLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fc2hhcmVkLWtleS5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX3NoYXJlZC5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX3NwZWNpZXMtY29uc3RydWN0b3IuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19zdHJpbmctYXQuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL190YXNrLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fdG8taW5kZXguanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL190by1pbnRlZ2VyLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fdG8taW9iamVjdC5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX3RvLWxlbmd0aC5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX3RvLW9iamVjdC5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX3RvLXByaW1pdGl2ZS5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX3VpZC5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX3drcy5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvY29yZS5nZXQtaXRlcmF0b3ItbWV0aG9kLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYuYXJyYXkuaXRlcmF0b3IuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi5vYmplY3QudG8tc3RyaW5nLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYucHJvbWlzZS5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM2LnN0cmluZy5pdGVyYXRvci5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvd2ViLmRvbS5pdGVyYWJsZS5qcyIsIm5vZGVfbW9kdWxlcy9jc3Njb2xvcnBhcnNlci9jc3Njb2xvcnBhcnNlci5qcyIsIm5vZGVfbW9kdWxlcy9lYXJjdXQvc3JjL2VhcmN1dC5qcyIsIm5vZGVfbW9kdWxlcy9mb250ZmFjZW9ic2VydmVyL2ZvbnRmYWNlb2JzZXJ2ZXIuc3RhbmRhbG9uZS5qcyIsIm5vZGVfbW9kdWxlcy9nZW9qc29uLXZ0L3NyYy9jbGlwLmpzIiwibm9kZV9tb2R1bGVzL2dlb2pzb24tdnQvc3JjL2NvbnZlcnQuanMiLCJub2RlX21vZHVsZXMvZ2VvanNvbi12dC9zcmMvaW5kZXguanMiLCJub2RlX21vZHVsZXMvZ2VvanNvbi12dC9zcmMvc2ltcGxpZnkuanMiLCJub2RlX21vZHVsZXMvZ2VvanNvbi12dC9zcmMvdGlsZS5qcyIsIm5vZGVfbW9kdWxlcy9nZW9qc29uLXZ0L3NyYy93cmFwLmpzIiwibm9kZV9tb2R1bGVzL2dsLW1hdDMvaW52ZXJ0LmpzIiwibm9kZV9tb2R1bGVzL2dsLW1hdDMvbm9ybWFsLWZyb20tbWF0NC5qcyIsIm5vZGVfbW9kdWxlcy9nbC1tYXQ0L2NvcHkuanMiLCJub2RlX21vZHVsZXMvZ2wtbWF0NC9pZGVudGl0eS5qcyIsIm5vZGVfbW9kdWxlcy9nbC1tYXQ0L2xvb2tBdC5qcyIsIm5vZGVfbW9kdWxlcy9nbC1tYXQ0L211bHRpcGx5LmpzIiwibm9kZV9tb2R1bGVzL2dsLW1hdDQvcGVyc3BlY3RpdmUuanMiLCJub2RlX21vZHVsZXMvZ2wtbWF0NC9zY2FsZS5qcyIsIm5vZGVfbW9kdWxlcy9nbC1tYXQ0L3RyYW5zbGF0ZS5qcyIsIm5vZGVfbW9kdWxlcy9nbC1zaGFkZXItZXJyb3JzL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL2pzLXlhbWwvaW5kZXguanMiLCJub2RlX21vZHVsZXMvanMteWFtbC9saWIvanMteWFtbC5qcyIsIm5vZGVfbW9kdWxlcy9qcy15YW1sL2xpYi9qcy15YW1sL2NvbW1vbi5qcyIsIm5vZGVfbW9kdWxlcy9qcy15YW1sL2xpYi9qcy15YW1sL2V4Y2VwdGlvbi5qcyIsIm5vZGVfbW9kdWxlcy9qcy15YW1sL2xpYi9qcy15YW1sL2xvYWRlci5qcyIsIm5vZGVfbW9kdWxlcy9qcy15YW1sL2xpYi9qcy15YW1sL21hcmsuanMiLCJub2RlX21vZHVsZXMvanMteWFtbC9saWIvanMteWFtbC9zY2hlbWEuanMiLCJub2RlX21vZHVsZXMvanMteWFtbC9saWIvanMteWFtbC9zY2hlbWEvY29yZS5qcyIsIm5vZGVfbW9kdWxlcy9qcy15YW1sL2xpYi9qcy15YW1sL3NjaGVtYS9kZWZhdWx0X2Z1bGwuanMiLCJub2RlX21vZHVsZXMvanMteWFtbC9saWIvanMteWFtbC9zY2hlbWEvZGVmYXVsdF9zYWZlLmpzIiwibm9kZV9tb2R1bGVzL2pzLXlhbWwvbGliL2pzLXlhbWwvc2NoZW1hL2ZhaWxzYWZlLmpzIiwibm9kZV9tb2R1bGVzL2pzLXlhbWwvbGliL2pzLXlhbWwvc2NoZW1hL2pzb24uanMiLCJub2RlX21vZHVsZXMvanMteWFtbC9saWIvanMteWFtbC90eXBlLmpzIiwibm9kZV9tb2R1bGVzL2pzLXlhbWwvbGliL2pzLXlhbWwvdHlwZS9iaW5hcnkuanMiLCJub2RlX21vZHVsZXMvanMteWFtbC9saWIvanMteWFtbC90eXBlL2Jvb2wuanMiLCJub2RlX21vZHVsZXMvanMteWFtbC9saWIvanMteWFtbC90eXBlL2Zsb2F0LmpzIiwibm9kZV9tb2R1bGVzL2pzLXlhbWwvbGliL2pzLXlhbWwvdHlwZS9pbnQuanMiLCJub2RlX21vZHVsZXMvanMteWFtbC9saWIvanMteWFtbC90eXBlL2pzL2Z1bmN0aW9uLmpzIiwibm9kZV9tb2R1bGVzL2pzLXlhbWwvbGliL2pzLXlhbWwvdHlwZS9qcy9yZWdleHAuanMiLCJub2RlX21vZHVsZXMvanMteWFtbC9saWIvanMteWFtbC90eXBlL2pzL3VuZGVmaW5lZC5qcyIsIm5vZGVfbW9kdWxlcy9qcy15YW1sL2xpYi9qcy15YW1sL3R5cGUvbWFwLmpzIiwibm9kZV9tb2R1bGVzL2pzLXlhbWwvbGliL2pzLXlhbWwvdHlwZS9tZXJnZS5qcyIsIm5vZGVfbW9kdWxlcy9qcy15YW1sL2xpYi9qcy15YW1sL3R5cGUvbnVsbC5qcyIsIm5vZGVfbW9kdWxlcy9qcy15YW1sL2xpYi9qcy15YW1sL3R5cGUvb21hcC5qcyIsIm5vZGVfbW9kdWxlcy9qcy15YW1sL2xpYi9qcy15YW1sL3R5cGUvcGFpcnMuanMiLCJub2RlX21vZHVsZXMvanMteWFtbC9saWIvanMteWFtbC90eXBlL3NlcS5qcyIsIm5vZGVfbW9kdWxlcy9qcy15YW1sL2xpYi9qcy15YW1sL3R5cGUvc2V0LmpzIiwibm9kZV9tb2R1bGVzL2pzLXlhbWwvbGliL2pzLXlhbWwvdHlwZS9zdHIuanMiLCJub2RlX21vZHVsZXMvanMteWFtbC9saWIvanMteWFtbC90eXBlL3RpbWVzdGFtcC5qcyIsIm5vZGVfbW9kdWxlcy9qc3ppcC9saWIvYmFzZTY0LmpzIiwibm9kZV9tb2R1bGVzL2pzemlwL2xpYi9jb21wcmVzc2VkT2JqZWN0LmpzIiwibm9kZV9tb2R1bGVzL2pzemlwL2xpYi9jb21wcmVzc2lvbnMuanMiLCJub2RlX21vZHVsZXMvanN6aXAvbGliL2NyYzMyLmpzIiwibm9kZV9tb2R1bGVzL2pzemlwL2xpYi9kZWZhdWx0cy5qcyIsIm5vZGVfbW9kdWxlcy9qc3ppcC9saWIvZXh0ZXJuYWwuanMiLCJub2RlX21vZHVsZXMvanN6aXAvbGliL2ZsYXRlLmpzIiwibm9kZV9tb2R1bGVzL2pzemlwL2xpYi9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9qc3ppcC9saWIvbG9hZC5qcyIsIm5vZGVfbW9kdWxlcy9qc3ppcC9saWIvbm9kZWpzL05vZGVqc1N0cmVhbUlucHV0QWRhcHRlci5qcyIsIm5vZGVfbW9kdWxlcy9qc3ppcC9saWIvbm9kZWpzL05vZGVqc1N0cmVhbU91dHB1dEFkYXB0ZXIuanMiLCJub2RlX21vZHVsZXMvanN6aXAvbGliL25vZGVqc1V0aWxzLmpzIiwibm9kZV9tb2R1bGVzL2pzemlwL2xpYi9vYmplY3QuanMiLCJub2RlX21vZHVsZXMvanN6aXAvbGliL3JlYWRlci9BcnJheVJlYWRlci5qcyIsIm5vZGVfbW9kdWxlcy9qc3ppcC9saWIvcmVhZGVyL0RhdGFSZWFkZXIuanMiLCJub2RlX21vZHVsZXMvanN6aXAvbGliL3JlYWRlci9Ob2RlQnVmZmVyUmVhZGVyLmpzIiwibm9kZV9tb2R1bGVzL2pzemlwL2xpYi9yZWFkZXIvU3RyaW5nUmVhZGVyLmpzIiwibm9kZV9tb2R1bGVzL2pzemlwL2xpYi9yZWFkZXIvVWludDhBcnJheVJlYWRlci5qcyIsIm5vZGVfbW9kdWxlcy9qc3ppcC9saWIvcmVhZGVyL3JlYWRlckZvci5qcyIsIm5vZGVfbW9kdWxlcy9qc3ppcC9saWIvc2lnbmF0dXJlLmpzIiwibm9kZV9tb2R1bGVzL2pzemlwL2xpYi9zdHJlYW0vQ29udmVydFdvcmtlci5qcyIsIm5vZGVfbW9kdWxlcy9qc3ppcC9saWIvc3RyZWFtL0NyYzMyUHJvYmUuanMiLCJub2RlX21vZHVsZXMvanN6aXAvbGliL3N0cmVhbS9EYXRhTGVuZ3RoUHJvYmUuanMiLCJub2RlX21vZHVsZXMvanN6aXAvbGliL3N0cmVhbS9EYXRhV29ya2VyLmpzIiwibm9kZV9tb2R1bGVzL2pzemlwL2xpYi9zdHJlYW0vR2VuZXJpY1dvcmtlci5qcyIsIm5vZGVfbW9kdWxlcy9qc3ppcC9saWIvc3RyZWFtL1N0cmVhbUhlbHBlci5qcyIsIm5vZGVfbW9kdWxlcy9qc3ppcC9saWIvc3VwcG9ydC5qcyIsIm5vZGVfbW9kdWxlcy9qc3ppcC9saWIvdXRmOC5qcyIsIm5vZGVfbW9kdWxlcy9qc3ppcC9saWIvdXRpbHMuanMiLCJub2RlX21vZHVsZXMvanN6aXAvbGliL3ppcEVudHJpZXMuanMiLCJub2RlX21vZHVsZXMvanN6aXAvbGliL3ppcEVudHJ5LmpzIiwibm9kZV9tb2R1bGVzL2pzemlwL2xpYi96aXBPYmplY3QuanMiLCJub2RlX21vZHVsZXMvanN6aXAvbm9kZV9tb2R1bGVzL2FzYXAvYnJvd3Nlci1hc2FwLmpzIiwibm9kZV9tb2R1bGVzL2pzemlwL25vZGVfbW9kdWxlcy9hc2FwL2Jyb3dzZXItcmF3LmpzIiwibm9kZV9tb2R1bGVzL2pzemlwL25vZGVfbW9kdWxlcy9wYWtvL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL2pzemlwL25vZGVfbW9kdWxlcy9wYWtvL2xpYi9kZWZsYXRlLmpzIiwibm9kZV9tb2R1bGVzL2pzemlwL25vZGVfbW9kdWxlcy9wYWtvL2xpYi9pbmZsYXRlLmpzIiwibm9kZV9tb2R1bGVzL2pzemlwL25vZGVfbW9kdWxlcy9wYWtvL2xpYi91dGlscy9jb21tb24uanMiLCJub2RlX21vZHVsZXMvanN6aXAvbm9kZV9tb2R1bGVzL3Bha28vbGliL3V0aWxzL3N0cmluZ3MuanMiLCJub2RlX21vZHVsZXMvanN6aXAvbm9kZV9tb2R1bGVzL3Bha28vbGliL3psaWIvYWRsZXIzMi5qcyIsIm5vZGVfbW9kdWxlcy9qc3ppcC9ub2RlX21vZHVsZXMvcGFrby9saWIvemxpYi9jb25zdGFudHMuanMiLCJub2RlX21vZHVsZXMvanN6aXAvbm9kZV9tb2R1bGVzL3Bha28vbGliL3psaWIvY3JjMzIuanMiLCJub2RlX21vZHVsZXMvanN6aXAvbm9kZV9tb2R1bGVzL3Bha28vbGliL3psaWIvZGVmbGF0ZS5qcyIsIm5vZGVfbW9kdWxlcy9qc3ppcC9ub2RlX21vZHVsZXMvcGFrby9saWIvemxpYi9nemhlYWRlci5qcyIsIm5vZGVfbW9kdWxlcy9qc3ppcC9ub2RlX21vZHVsZXMvcGFrby9saWIvemxpYi9pbmZmYXN0LmpzIiwibm9kZV9tb2R1bGVzL2pzemlwL25vZGVfbW9kdWxlcy9wYWtvL2xpYi96bGliL2luZmxhdGUuanMiLCJub2RlX21vZHVsZXMvanN6aXAvbm9kZV9tb2R1bGVzL3Bha28vbGliL3psaWIvaW5mdHJlZXMuanMiLCJub2RlX21vZHVsZXMvanN6aXAvbm9kZV9tb2R1bGVzL3Bha28vbGliL3psaWIvbWVzc2FnZXMuanMiLCJub2RlX21vZHVsZXMvanN6aXAvbm9kZV9tb2R1bGVzL3Bha28vbGliL3psaWIvdHJlZXMuanMiLCJub2RlX21vZHVsZXMvanN6aXAvbm9kZV9tb2R1bGVzL3Bha28vbGliL3psaWIvenN0cmVhbS5qcyIsIm5vZGVfbW9kdWxlcy9qc3ppcC9ub2RlX21vZHVsZXMvcmVhZGFibGUtc3RyZWFtL2xpYi9fc3RyZWFtX2R1cGxleC5qcyIsIm5vZGVfbW9kdWxlcy9qc3ppcC9ub2RlX21vZHVsZXMvcmVhZGFibGUtc3RyZWFtL2xpYi9fc3RyZWFtX3Bhc3N0aHJvdWdoLmpzIiwibm9kZV9tb2R1bGVzL2pzemlwL25vZGVfbW9kdWxlcy9yZWFkYWJsZS1zdHJlYW0vbGliL19zdHJlYW1fcmVhZGFibGUuanMiLCJub2RlX21vZHVsZXMvanN6aXAvbm9kZV9tb2R1bGVzL3JlYWRhYmxlLXN0cmVhbS9saWIvX3N0cmVhbV90cmFuc2Zvcm0uanMiLCJub2RlX21vZHVsZXMvanN6aXAvbm9kZV9tb2R1bGVzL3JlYWRhYmxlLXN0cmVhbS9saWIvX3N0cmVhbV93cml0YWJsZS5qcyIsIm5vZGVfbW9kdWxlcy9qc3ppcC9ub2RlX21vZHVsZXMvcmVhZGFibGUtc3RyZWFtL25vZGVfbW9kdWxlcy9jb3JlLXV0aWwtaXMvbGliL3V0aWwuanMiLCJub2RlX21vZHVsZXMvanN6aXAvbm9kZV9tb2R1bGVzL3JlYWRhYmxlLXN0cmVhbS9ub2RlX21vZHVsZXMvcHJvY2Vzcy1uZXh0aWNrLWFyZ3MvaW5kZXguanMiLCJub2RlX21vZHVsZXMvanN6aXAvbm9kZV9tb2R1bGVzL3JlYWRhYmxlLXN0cmVhbS9ub2RlX21vZHVsZXMvc3RyaW5nX2RlY29kZXIvaW5kZXguanMiLCJub2RlX21vZHVsZXMvanN6aXAvbm9kZV9tb2R1bGVzL3JlYWRhYmxlLXN0cmVhbS9ub2RlX21vZHVsZXMvdXRpbC1kZXByZWNhdGUvYnJvd3Nlci5qcyIsIm5vZGVfbW9kdWxlcy9qc3ppcC9ub2RlX21vZHVsZXMvcmVhZGFibGUtc3RyZWFtL3JlYWRhYmxlLmpzIiwibm9kZV9tb2R1bGVzL21hdGNoLWZlYXR1cmUvaW5kZXguanMiLCJub2RlX21vZHVsZXMvcGJmL2J1ZmZlci5qcyIsIm5vZGVfbW9kdWxlcy9wYmYvaW5kZXguanMiLCJub2RlX21vZHVsZXMvc3RyaXAtY29tbWVudHMvaW5kZXguanMiLCJub2RlX21vZHVsZXMvdG9wb2pzb24tY2xpZW50L2Rpc3QvdG9wb2pzb24tY2xpZW50LmpzIiwibm9kZV9tb2R1bGVzL3ZlY3Rvci10aWxlL2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL3ZlY3Rvci10aWxlL2xpYi92ZWN0b3J0aWxlLmpzIiwibm9kZV9tb2R1bGVzL3ZlY3Rvci10aWxlL2xpYi92ZWN0b3J0aWxlZmVhdHVyZS5qcyIsIm5vZGVfbW9kdWxlcy92ZWN0b3ItdGlsZS9saWIvdmVjdG9ydGlsZWxheWVyLmpzIiwibm9kZV9tb2R1bGVzL3ZlY3Rvci10aWxlL25vZGVfbW9kdWxlcy9wb2ludC1nZW9tZXRyeS9pbmRleC5qcyIsInNyYy9idWlsZGVycy9jb21tb24uanMiLCJzcmMvYnVpbGRlcnMvcG9pbnRzLmpzIiwic3JjL2J1aWxkZXJzL3BvbHlnb25zLmpzIiwic3JjL2J1aWxkZXJzL3BvbHlsaW5lcy5qcyIsInNyYy9jYW1lcmEuanMiLCJzcmMvZ2VvLmpzIiwic3JjL2dsL2NvbnN0YW50cy5qcyIsInNyYy9nbC9jb250ZXh0LmpzIiwic3JjL2dsL2V4dGVuc2lvbnMuanMiLCJzcmMvZ2wvZ2xzbC5qcyIsInNyYy9nbC9yZW5kZXJfc3RhdGUuanMiLCJzcmMvZ2wvc2hhZGVyX3Byb2dyYW0uanMiLCJzcmMvZ2wvdGV4dHVyZS5qcyIsInNyYy9nbC92YW8uanMiLCJzcmMvZ2wvdmJvX21lc2guanMiLCJzcmMvZ2wvdmVydGV4X2RhdGEuanMiLCJzcmMvZ2wvdmVydGV4X2VsZW1lbnRzLmpzIiwic3JjL2dsL3ZlcnRleF9sYXlvdXQuanMiLCJzcmMvbGFiZWxzL2NvbGxpc2lvbi5qcyIsInNyYy9sYWJlbHMvaW50ZXJzZWN0LmpzIiwic3JjL2xhYmVscy9sYWJlbC5qcyIsInNyYy9sYWJlbHMvbGFiZWxfbGluZS5qcyIsInNyYy9sYWJlbHMvbGFiZWxfcG9pbnQuanMiLCJzcmMvbGFiZWxzL3BvaW50X2FuY2hvci5qcyIsInNyYy9sYWJlbHMvcG9pbnRfcGxhY2VtZW50LmpzIiwic3JjL2xhYmVscy9yZXBlYXRfZ3JvdXAuanMiLCJzcmMvbGVhZmxldF9sYXllci5qcyIsInNyYy9saWdodC5qcyIsInNyYy9tYXRlcmlhbC5qcyIsInNyYy9tb2R1bGUuanMiLCJzcmMvc2NlbmUuanMiLCJzcmMvc2NlbmVfYnVuZGxlLmpzIiwic3JjL3NjZW5lX2xvYWRlci5qcyIsInNyYy9zY2VuZV93b3JrZXIuanMiLCJzcmMvc2VsZWN0aW9uLmpzIiwic3JjL3NvdXJjZXMvZGF0YV9zb3VyY2UuanMiLCJzcmMvc291cmNlcy9nZW9qc29uLmpzIiwic3JjL3NvdXJjZXMvbXZ0LmpzIiwic3JjL3NvdXJjZXMvcmFzdGVyLmpzIiwic3JjL3NvdXJjZXMvdG9wb2pzb24uanMiLCJzcmMvc3R5bGVzL2xheWVyLmpzIiwic3JjL3N0eWxlcy9saW5lcy9kYXNoYXJyYXkuanMiLCJzcmMvc3R5bGVzL2xpbmVzL2xpbmVzLmpzIiwic3JjL3N0eWxlcy9wb2ludHMvcG9pbnRzLmpzIiwic3JjL3N0eWxlcy9wb2x5Z29ucy9wb2x5Z29ucy5qcyIsInNyYy9zdHlsZXMvcmFzdGVyL3Jhc3Rlci5qcyIsInNyYy9zdHlsZXMvc3R5bGUuanMiLCJzcmMvc3R5bGVzL3N0eWxlX21hbmFnZXIuanMiLCJzcmMvc3R5bGVzL3N0eWxlX3BhcnNlci5qcyIsInNyYy9zdHlsZXMvdGV4dC9jYW52YXNfdGV4dC5qcyIsInNyYy9zdHlsZXMvdGV4dC9mb250X21hbmFnZXIuanMiLCJzcmMvc3R5bGVzL3RleHQvdGV4dC5qcyIsInNyYy9zdHlsZXMvdGV4dC90ZXh0X2xhYmVscy5qcyIsInNyYy9zdHlsZXMvdGV4dC90ZXh0X3NldHRpbmdzLmpzIiwic3JjL3RpbGUuanMiLCJzcmMvdGlsZV9tYW5hZ2VyLmpzIiwic3JjL3RpbGVfcHlyYW1pZC5qcyIsInNyYy91dGlscy9kZWJ1Z19zZXR0aW5ncy5qcyIsInNyYy91dGlscy9lcnJvcnMuanMiLCJzcmMvdXRpbHMvZ2wtbWF0cml4LmpzIiwic3JjL3V0aWxzL2xvZy5qcyIsInNyYy91dGlscy9tZWRpYV9jYXB0dXJlLmpzIiwic3JjL3V0aWxzL21lcmdlLmpzIiwic3JjL3V0aWxzL29iYi5qcyIsInNyYy91dGlscy9wb2x5ZmlsbHMuanMiLCJzcmMvdXRpbHMvc3Vic2NyaWJlLmpzIiwic3JjL3V0aWxzL3RocmVhZC5qcyIsInNyYy91dGlscy91cmxzLmpzIiwic3JjL3V0aWxzL3V0aWxzLmpzIiwic3JjL3V0aWxzL3ZlcnNpb24uanMiLCJzcmMvdXRpbHMvd29ya2VyX2Jyb2tlci5qcyIsInNyYy92ZWN0b3IuanMiLCJzcmMvdmlldy5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTtBQ0FBOzs7QUNBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7O0FDN3ZEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNsSEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDcEZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNMQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDOVNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3JCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNwTEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3ZCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQ0xBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7QUMxa0JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDSkE7QUFDQTtBQUNBO0FBQ0E7O0FDSEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDTkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNKQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ0pBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNwQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN0QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNKQTtBQUNBOztBQ0RBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbkJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDSkE7QUFDQTtBQUNBO0FBQ0E7O0FDSEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDTkE7QUFDQTtBQUNBO0FBQ0E7O0FDSEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDMUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ05BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3hCQTtBQUNBO0FBQ0E7QUFDQTs7QUNIQTtBQUNBO0FBQ0E7QUFDQTs7QUNIQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1BBOztBQ0FBO0FBQ0E7QUFDQTs7QUNGQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNmQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ0pBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDUEE7QUFDQTtBQUNBOztBQ0ZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNYQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNaQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNyRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3BCQTtBQUNBO0FBQ0E7O0FDRkE7O0FDQUE7O0FDQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNuRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3pDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNmQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNaQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNaQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2hCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNOQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1BBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDSkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMvQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDWkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDTkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNKQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDTEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNQQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2hCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDMUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ05BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNMQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDTEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ0xBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDSkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1hBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDSkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNWQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1BBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2pDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNUQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzFTQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2hCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNyQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDek1BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNwb0JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDUEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN2SkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDaEpBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDelFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMxRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNyRkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM3REE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNyQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN2REE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDM0JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMxQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3pGQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDekNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNoQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDOUJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDckNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMxQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNQQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN2Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzNEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzNDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbGpEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzVFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDeEdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2xCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3pCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzVCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDakJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDekJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDN0RBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbElBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNuQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDekdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3hLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNwRkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDNURBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDNUJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNSQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNaQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2xDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDNUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNyREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM3QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2pGQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3JGQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMzRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2RBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzlFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDWEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNWQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDcEVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2hEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2xGQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDMUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUMxQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztBQ2xDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNuWUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDekRBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNwSEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNuQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3RDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3RCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM5QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNQQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDMUJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN2QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzdCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDcEhBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FDdlFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7O0FDN01BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7QUNsQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ25SQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNqZEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN0UUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNwU0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM1SEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQ2xFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7O0FDL05BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNkQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2haQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2xhQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN0R0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3pMQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDaENBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNsREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3pDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQy96REE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN4Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3RVQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbGdEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN2VUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNiQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbHJDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDN0JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMxRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FDekJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7O0FDLzJCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQ25MQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7O0FDbmdCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7Ozs7OztBQzNHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7O0FDM0NBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FDN05BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7QUNuRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDWkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzVJQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FDL0pBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7Ozs7QUN2YUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN6RUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbEhBO0FBQ0E7QUFDQTtBQUNBOztBQ0hBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNqQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbEtBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDN0RBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtB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QjtBQUNBO0FBQ0EsaUJBQUssWUFBTCxDQUFrQixLQUFLLFFBQXZCLEVBQWlDLE9BQWpDOztBQUVBO0FBQ0EsaUJBQUssTUFBTCxDQUFZLGFBQVosQ0FBMEIsS0FBSyxRQUEvQixFQUF5QyxPQUF6QztBQUNIOztBQUVEOzs7O3FDQUNjLE8sRUFBUztBQUNuQixvQkFBUSxPQUFSLENBQWdCLEtBQWhCLEVBQXVCLGNBQXZCLEVBQXVDLENBQUMsS0FBSyxJQUFMLENBQVUsTUFBVixDQUFpQixLQUFsQixFQUF5QixLQUFLLElBQUwsQ0FBVSxNQUFWLENBQWlCLE1BQTFDLENBQXZDO0FBQ0Esb0JBQVEsT0FBUixDQUFnQixLQUFoQixFQUF1QixnQkFBdkIsRUFBeUMsQ0FBQyxLQUFLLE1BQUwsQ0FBWSxNQUFaLENBQW1CLENBQXBCLEVBQXVCLEtBQUssTUFBTCxDQUFZLE1BQVosQ0FBbUIsQ0FBMUMsRUFBNkMsS0FBSyxJQUFsRCxDQUF6QztBQUNBLG9CQUFRLE9BQVIsQ0FBZ0IsSUFBaEIsRUFBc0Isb0JBQXRCLEVBQTRDLEtBQUssZ0JBQWpEO0FBQ0Esb0JBQVEsT0FBUixDQUFnQixJQUFoQixFQUFzQixzQkFBdEIsRUFBOEMsZ0JBQU0sa0JBQXBEO0FBQ0Esb0JBQVEsT0FBUixDQUFnQixJQUFoQixFQUFzQix1QkFBdEIsRUFBK0MsS0FBSyxjQUFwRDtBQUNBLG9CQUFRLE9BQVIsQ0FBZ0IsSUFBaEIsRUFBc0IsZ0JBQXRCLEVBQXdDLEtBQUssT0FBN0M7O0FBRUEsaUJBQUssTUFBTCxDQUFZLFlBQVosQ0FBeUIsT0FBekI7QUFDSDs7QUFFRDs7OztzQ0FDZTtBQUNYLG1CQUFRLEtBQUssY0FBTCxJQUF1QixrQkFBL0I7QUFDSDs7Ozs7O2tCQXRVZ0IsSSIsImZpbGUiOiJnZW5lcmF0ZWQuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlc0NvbnRlbnQiOlsiKGZ1bmN0aW9uIGUodCxuLHIpe2Z1bmN0aW9uIHMobyx1KXtpZighbltvXSl7aWYoIXRbb10pe3ZhciBhPXR5cGVvZiByZXF1aXJlPT1cImZ1bmN0aW9uXCImJnJlcXVpcmU7aWYoIXUmJmEpcmV0dXJuIGEobywhMCk7aWYoaSlyZXR1cm4gaShvLCEwKTt2YXIgZj1uZXcgRXJyb3IoXCJDYW5ub3QgZmluZCBtb2R1bGUgJ1wiK28rXCInXCIpO3Rocm93IGYuY29kZT1cIk1PRFVMRV9OT1RfRk9VTkRcIixmfXZhciBsPW5bb109e2V4cG9ydHM6e319O3Rbb11bMF0uY2FsbChsLmV4cG9ydHMsZnVuY3Rpb24oZSl7dmFyIG49dFtvXVsxXVtlXTtyZXR1cm4gcyhuP246ZSl9LGwsbC5leHBvcnRzLGUsdCxuLHIpfXJldHVybiBuW29dLmV4cG9ydHN9dmFyIGk9dHlwZW9mIHJlcXVpcmU9PVwiZnVuY3Rpb25cIiYmcmVxdWlyZTtmb3IodmFyIG89MDtvPHIubGVuZ3RoO28rKylzKHJbb10pO3JldHVybiBzfSkiLCIiLCIvKiFcbiAqIFRoZSBidWZmZXIgbW9kdWxlIGZyb20gbm9kZS5qcywgZm9yIHRoZSBicm93c2VyLlxuICpcbiAqIEBhdXRob3IgICBGZXJvc3MgQWJvdWtoYWRpamVoIDxmZXJvc3NAZmVyb3NzLm9yZz4gPGh0dHA6Ly9mZXJvc3Mub3JnPlxuICogQGxpY2Vuc2UgIE1JVFxuICovXG4vKiBlc2xpbnQtZGlzYWJsZSBuby1wcm90byAqL1xuXG4ndXNlIHN0cmljdCdcblxudmFyIGJhc2U2NCA9IHJlcXVpcmUoJ2Jhc2U2NC1qcycpXG52YXIgaWVlZTc1NCA9IHJlcXVpcmUoJ2llZWU3NTQnKVxudmFyIGlzQXJyYXkgPSByZXF1aXJlKCdpc2FycmF5JylcblxuZXhwb3J0cy5CdWZmZXIgPSBCdWZmZXJcbmV4cG9ydHMuU2xvd0J1ZmZlciA9IFNsb3dCdWZmZXJcbmV4cG9ydHMuSU5TUEVDVF9NQVhfQllURVMgPSA1MFxuXG4vKipcbiAqIElmIGBCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVGA6XG4gKiAgID09PSB0cnVlICAgIFVzZSBVaW50OEFycmF5IGltcGxlbWVudGF0aW9uIChmYXN0ZXN0KVxuICogICA9PT0gZmFsc2UgICBVc2UgT2JqZWN0IGltcGxlbWVudGF0aW9uIChtb3N0IGNvbXBhdGlibGUsIGV2ZW4gSUU2KVxuICpcbiAqIEJyb3dzZXJzIHRoYXQgc3VwcG9ydCB0eXBlZCBhcnJheXMgYXJlIElFIDEwKywgRmlyZWZveCA0KywgQ2hyb21lIDcrLCBTYWZhcmkgNS4xKyxcbiAqIE9wZXJhIDExLjYrLCBpT1MgNC4yKy5cbiAqXG4gKiBEdWUgdG8gdmFyaW91cyBicm93c2VyIGJ1Z3MsIHNvbWV0aW1lcyB0aGUgT2JqZWN0IGltcGxlbWVudGF0aW9uIHdpbGwgYmUgdXNlZCBldmVuXG4gKiB3aGVuIHRoZSBicm93c2VyIHN1cHBvcnRzIHR5cGVkIGFycmF5cy5cbiAqXG4gKiBOb3RlOlxuICpcbiAqICAgLSBGaXJlZm94IDQtMjkgbGFja3Mgc3VwcG9ydCBmb3IgYWRkaW5nIG5ldyBwcm9wZXJ0aWVzIHRvIGBVaW50OEFycmF5YCBpbnN0YW5jZXMsXG4gKiAgICAgU2VlOiBodHRwczovL2J1Z3ppbGxhLm1vemlsbGEub3JnL3Nob3dfYnVnLmNnaT9pZD02OTU0MzguXG4gKlxuICogICAtIENocm9tZSA5LTEwIGlzIG1pc3NpbmcgdGhlIGBUeXBlZEFycmF5LnByb3RvdHlwZS5zdWJhcnJheWAgZnVuY3Rpb24uXG4gKlxuICogICAtIElFMTAgaGFzIGEgYnJva2VuIGBUeXBlZEFycmF5LnByb3RvdHlwZS5zdWJhcnJheWAgZnVuY3Rpb24gd2hpY2ggcmV0dXJucyBhcnJheXMgb2ZcbiAqICAgICBpbmNvcnJlY3QgbGVuZ3RoIGluIHNvbWUgc2l0dWF0aW9ucy5cblxuICogV2UgZGV0ZWN0IHRoZXNlIGJ1Z2d5IGJyb3dzZXJzIGFuZCBzZXQgYEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUYCB0byBgZmFsc2VgIHNvIHRoZXlcbiAqIGdldCB0aGUgT2JqZWN0IGltcGxlbWVudGF0aW9uLCB3aGljaCBpcyBzbG93ZXIgYnV0IGJlaGF2ZXMgY29ycmVjdGx5LlxuICovXG5CdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCA9IGdsb2JhbC5UWVBFRF9BUlJBWV9TVVBQT1JUICE9PSB1bmRlZmluZWRcbiAgPyBnbG9iYWwuVFlQRURfQVJSQVlfU1VQUE9SVFxuICA6IHR5cGVkQXJyYXlTdXBwb3J0KClcblxuLypcbiAqIEV4cG9ydCBrTWF4TGVuZ3RoIGFmdGVyIHR5cGVkIGFycmF5IHN1cHBvcnQgaXMgZGV0ZXJtaW5lZC5cbiAqL1xuZXhwb3J0cy5rTWF4TGVuZ3RoID0ga01heExlbmd0aCgpXG5cbmZ1bmN0aW9uIHR5cGVkQXJyYXlTdXBwb3J0ICgpIHtcbiAgdHJ5IHtcbiAgICB2YXIgYXJyID0gbmV3IFVpbnQ4QXJyYXkoMSlcbiAgICBhcnIuX19wcm90b19fID0ge19fcHJvdG9fXzogVWludDhBcnJheS5wcm90b3R5cGUsIGZvbzogZnVuY3Rpb24gKCkgeyByZXR1cm4gNDIgfX1cbiAgICByZXR1cm4gYXJyLmZvbygpID09PSA0MiAmJiAvLyB0eXBlZCBhcnJheSBpbnN0YW5jZXMgY2FuIGJlIGF1Z21lbnRlZFxuICAgICAgICB0eXBlb2YgYXJyLnN1YmFycmF5ID09PSAnZnVuY3Rpb24nICYmIC8vIGNocm9tZSA5LTEwIGxhY2sgYHN1YmFycmF5YFxuICAgICAgICBhcnIuc3ViYXJyYXkoMSwgMSkuYnl0ZUxlbmd0aCA9PT0gMCAvLyBpZTEwIGhhcyBicm9rZW4gYHN1YmFycmF5YFxuICB9IGNhdGNoIChlKSB7XG4gICAgcmV0dXJuIGZhbHNlXG4gIH1cbn1cblxuZnVuY3Rpb24ga01heExlbmd0aCAoKSB7XG4gIHJldHVybiBCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVFxuICAgID8gMHg3ZmZmZmZmZlxuICAgIDogMHgzZmZmZmZmZlxufVxuXG5mdW5jdGlvbiBjcmVhdGVCdWZmZXIgKHRoYXQsIGxlbmd0aCkge1xuICBpZiAoa01heExlbmd0aCgpIDwgbGVuZ3RoKSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ0ludmFsaWQgdHlwZWQgYXJyYXkgbGVuZ3RoJylcbiAgfVxuICBpZiAoQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHtcbiAgICAvLyBSZXR1cm4gYW4gYXVnbWVudGVkIGBVaW50OEFycmF5YCBpbnN0YW5jZSwgZm9yIGJlc3QgcGVyZm9ybWFuY2VcbiAgICB0aGF0ID0gbmV3IFVpbnQ4QXJyYXkobGVuZ3RoKVxuICAgIHRoYXQuX19wcm90b19fID0gQnVmZmVyLnByb3RvdHlwZVxuICB9IGVsc2Uge1xuICAgIC8vIEZhbGxiYWNrOiBSZXR1cm4gYW4gb2JqZWN0IGluc3RhbmNlIG9mIHRoZSBCdWZmZXIgY2xhc3NcbiAgICBpZiAodGhhdCA9PT0gbnVsbCkge1xuICAgICAgdGhhdCA9IG5ldyBCdWZmZXIobGVuZ3RoKVxuICAgIH1cbiAgICB0aGF0Lmxlbmd0aCA9IGxlbmd0aFxuICB9XG5cbiAgcmV0dXJuIHRoYXRcbn1cblxuLyoqXG4gKiBUaGUgQnVmZmVyIGNvbnN0cnVjdG9yIHJldHVybnMgaW5zdGFuY2VzIG9mIGBVaW50OEFycmF5YCB0aGF0IGhhdmUgdGhlaXJcbiAqIHByb3RvdHlwZSBjaGFuZ2VkIHRvIGBCdWZmZXIucHJvdG90eXBlYC4gRnVydGhlcm1vcmUsIGBCdWZmZXJgIGlzIGEgc3ViY2xhc3Mgb2ZcbiAqIGBVaW50OEFycmF5YCwgc28gdGhlIHJldHVybmVkIGluc3RhbmNlcyB3aWxsIGhhdmUgYWxsIHRoZSBub2RlIGBCdWZmZXJgIG1ldGhvZHNcbiAqIGFuZCB0aGUgYFVpbnQ4QXJyYXlgIG1ldGhvZHMuIFNxdWFyZSBicmFja2V0IG5vdGF0aW9uIHdvcmtzIGFzIGV4cGVjdGVkIC0tIGl0XG4gKiByZXR1cm5zIGEgc2luZ2xlIG9jdGV0LlxuICpcbiAqIFRoZSBgVWludDhBcnJheWAgcHJvdG90eXBlIHJlbWFpbnMgdW5tb2RpZmllZC5cbiAqL1xuXG5mdW5jdGlvbiBCdWZmZXIgKGFyZywgZW5jb2RpbmdPck9mZnNldCwgbGVuZ3RoKSB7XG4gIGlmICghQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQgJiYgISh0aGlzIGluc3RhbmNlb2YgQnVmZmVyKSkge1xuICAgIHJldHVybiBuZXcgQnVmZmVyKGFyZywgZW5jb2RpbmdPck9mZnNldCwgbGVuZ3RoKVxuICB9XG5cbiAgLy8gQ29tbW9uIGNhc2UuXG4gIGlmICh0eXBlb2YgYXJnID09PSAnbnVtYmVyJykge1xuICAgIGlmICh0eXBlb2YgZW5jb2RpbmdPck9mZnNldCA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgJ0lmIGVuY29kaW5nIGlzIHNwZWNpZmllZCB0aGVuIHRoZSBmaXJzdCBhcmd1bWVudCBtdXN0IGJlIGEgc3RyaW5nJ1xuICAgICAgKVxuICAgIH1cbiAgICByZXR1cm4gYWxsb2NVbnNhZmUodGhpcywgYXJnKVxuICB9XG4gIHJldHVybiBmcm9tKHRoaXMsIGFyZywgZW5jb2RpbmdPck9mZnNldCwgbGVuZ3RoKVxufVxuXG5CdWZmZXIucG9vbFNpemUgPSA4MTkyIC8vIG5vdCB1c2VkIGJ5IHRoaXMgaW1wbGVtZW50YXRpb25cblxuLy8gVE9ETzogTGVnYWN5LCBub3QgbmVlZGVkIGFueW1vcmUuIFJlbW92ZSBpbiBuZXh0IG1ham9yIHZlcnNpb24uXG5CdWZmZXIuX2F1Z21lbnQgPSBmdW5jdGlvbiAoYXJyKSB7XG4gIGFyci5fX3Byb3RvX18gPSBCdWZmZXIucHJvdG90eXBlXG4gIHJldHVybiBhcnJcbn1cblxuZnVuY3Rpb24gZnJvbSAodGhhdCwgdmFsdWUsIGVuY29kaW5nT3JPZmZzZXQsIGxlbmd0aCkge1xuICBpZiAodHlwZW9mIHZhbHVlID09PSAnbnVtYmVyJykge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1widmFsdWVcIiBhcmd1bWVudCBtdXN0IG5vdCBiZSBhIG51bWJlcicpXG4gIH1cblxuICBpZiAodHlwZW9mIEFycmF5QnVmZmVyICE9PSAndW5kZWZpbmVkJyAmJiB2YWx1ZSBpbnN0YW5jZW9mIEFycmF5QnVmZmVyKSB7XG4gICAgcmV0dXJuIGZyb21BcnJheUJ1ZmZlcih0aGF0LCB2YWx1ZSwgZW5jb2RpbmdPck9mZnNldCwgbGVuZ3RoKVxuICB9XG5cbiAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICByZXR1cm4gZnJvbVN0cmluZyh0aGF0LCB2YWx1ZSwgZW5jb2RpbmdPck9mZnNldClcbiAgfVxuXG4gIHJldHVybiBmcm9tT2JqZWN0KHRoYXQsIHZhbHVlKVxufVxuXG4vKipcbiAqIEZ1bmN0aW9uYWxseSBlcXVpdmFsZW50IHRvIEJ1ZmZlcihhcmcsIGVuY29kaW5nKSBidXQgdGhyb3dzIGEgVHlwZUVycm9yXG4gKiBpZiB2YWx1ZSBpcyBhIG51bWJlci5cbiAqIEJ1ZmZlci5mcm9tKHN0clssIGVuY29kaW5nXSlcbiAqIEJ1ZmZlci5mcm9tKGFycmF5KVxuICogQnVmZmVyLmZyb20oYnVmZmVyKVxuICogQnVmZmVyLmZyb20oYXJyYXlCdWZmZXJbLCBieXRlT2Zmc2V0WywgbGVuZ3RoXV0pXG4gKiovXG5CdWZmZXIuZnJvbSA9IGZ1bmN0aW9uICh2YWx1ZSwgZW5jb2RpbmdPck9mZnNldCwgbGVuZ3RoKSB7XG4gIHJldHVybiBmcm9tKG51bGwsIHZhbHVlLCBlbmNvZGluZ09yT2Zmc2V0LCBsZW5ndGgpXG59XG5cbmlmIChCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCkge1xuICBCdWZmZXIucHJvdG90eXBlLl9fcHJvdG9fXyA9IFVpbnQ4QXJyYXkucHJvdG90eXBlXG4gIEJ1ZmZlci5fX3Byb3RvX18gPSBVaW50OEFycmF5XG4gIGlmICh0eXBlb2YgU3ltYm9sICE9PSAndW5kZWZpbmVkJyAmJiBTeW1ib2wuc3BlY2llcyAmJlxuICAgICAgQnVmZmVyW1N5bWJvbC5zcGVjaWVzXSA9PT0gQnVmZmVyKSB7XG4gICAgLy8gRml4IHN1YmFycmF5KCkgaW4gRVMyMDE2LiBTZWU6IGh0dHBzOi8vZ2l0aHViLmNvbS9mZXJvc3MvYnVmZmVyL3B1bGwvOTdcbiAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoQnVmZmVyLCBTeW1ib2wuc3BlY2llcywge1xuICAgICAgdmFsdWU6IG51bGwsXG4gICAgICBjb25maWd1cmFibGU6IHRydWVcbiAgICB9KVxuICB9XG59XG5cbmZ1bmN0aW9uIGFzc2VydFNpemUgKHNpemUpIHtcbiAgaWYgKHR5cGVvZiBzaXplICE9PSAnbnVtYmVyJykge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1wic2l6ZVwiIGFyZ3VtZW50IG11c3QgYmUgYSBudW1iZXInKVxuICB9IGVsc2UgaWYgKHNpemUgPCAwKSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ1wic2l6ZVwiIGFyZ3VtZW50IG11c3Qgbm90IGJlIG5lZ2F0aXZlJylcbiAgfVxufVxuXG5mdW5jdGlvbiBhbGxvYyAodGhhdCwgc2l6ZSwgZmlsbCwgZW5jb2RpbmcpIHtcbiAgYXNzZXJ0U2l6ZShzaXplKVxuICBpZiAoc2l6ZSA8PSAwKSB7XG4gICAgcmV0dXJuIGNyZWF0ZUJ1ZmZlcih0aGF0LCBzaXplKVxuICB9XG4gIGlmIChmaWxsICE9PSB1bmRlZmluZWQpIHtcbiAgICAvLyBPbmx5IHBheSBhdHRlbnRpb24gdG8gZW5jb2RpbmcgaWYgaXQncyBhIHN0cmluZy4gVGhpc1xuICAgIC8vIHByZXZlbnRzIGFjY2lkZW50YWxseSBzZW5kaW5nIGluIGEgbnVtYmVyIHRoYXQgd291bGRcbiAgICAvLyBiZSBpbnRlcnByZXR0ZWQgYXMgYSBzdGFydCBvZmZzZXQuXG4gICAgcmV0dXJuIHR5cGVvZiBlbmNvZGluZyA9PT0gJ3N0cmluZydcbiAgICAgID8gY3JlYXRlQnVmZmVyKHRoYXQsIHNpemUpLmZpbGwoZmlsbCwgZW5jb2RpbmcpXG4gICAgICA6IGNyZWF0ZUJ1ZmZlcih0aGF0LCBzaXplKS5maWxsKGZpbGwpXG4gIH1cbiAgcmV0dXJuIGNyZWF0ZUJ1ZmZlcih0aGF0LCBzaXplKVxufVxuXG4vKipcbiAqIENyZWF0ZXMgYSBuZXcgZmlsbGVkIEJ1ZmZlciBpbnN0YW5jZS5cbiAqIGFsbG9jKHNpemVbLCBmaWxsWywgZW5jb2RpbmddXSlcbiAqKi9cbkJ1ZmZlci5hbGxvYyA9IGZ1bmN0aW9uIChzaXplLCBmaWxsLCBlbmNvZGluZykge1xuICByZXR1cm4gYWxsb2MobnVsbCwgc2l6ZSwgZmlsbCwgZW5jb2RpbmcpXG59XG5cbmZ1bmN0aW9uIGFsbG9jVW5zYWZlICh0aGF0LCBzaXplKSB7XG4gIGFzc2VydFNpemUoc2l6ZSlcbiAgdGhhdCA9IGNyZWF0ZUJ1ZmZlcih0aGF0LCBzaXplIDwgMCA/IDAgOiBjaGVja2VkKHNpemUpIHwgMClcbiAgaWYgKCFCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCkge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc2l6ZTsgKytpKSB7XG4gICAgICB0aGF0W2ldID0gMFxuICAgIH1cbiAgfVxuICByZXR1cm4gdGhhdFxufVxuXG4vKipcbiAqIEVxdWl2YWxlbnQgdG8gQnVmZmVyKG51bSksIGJ5IGRlZmF1bHQgY3JlYXRlcyBhIG5vbi16ZXJvLWZpbGxlZCBCdWZmZXIgaW5zdGFuY2UuXG4gKiAqL1xuQnVmZmVyLmFsbG9jVW5zYWZlID0gZnVuY3Rpb24gKHNpemUpIHtcbiAgcmV0dXJuIGFsbG9jVW5zYWZlKG51bGwsIHNpemUpXG59XG4vKipcbiAqIEVxdWl2YWxlbnQgdG8gU2xvd0J1ZmZlcihudW0pLCBieSBkZWZhdWx0IGNyZWF0ZXMgYSBub24temVyby1maWxsZWQgQnVmZmVyIGluc3RhbmNlLlxuICovXG5CdWZmZXIuYWxsb2NVbnNhZmVTbG93ID0gZnVuY3Rpb24gKHNpemUpIHtcbiAgcmV0dXJuIGFsbG9jVW5zYWZlKG51bGwsIHNpemUpXG59XG5cbmZ1bmN0aW9uIGZyb21TdHJpbmcgKHRoYXQsIHN0cmluZywgZW5jb2RpbmcpIHtcbiAgaWYgKHR5cGVvZiBlbmNvZGluZyAhPT0gJ3N0cmluZycgfHwgZW5jb2RpbmcgPT09ICcnKSB7XG4gICAgZW5jb2RpbmcgPSAndXRmOCdcbiAgfVxuXG4gIGlmICghQnVmZmVyLmlzRW5jb2RpbmcoZW5jb2RpbmcpKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignXCJlbmNvZGluZ1wiIG11c3QgYmUgYSB2YWxpZCBzdHJpbmcgZW5jb2RpbmcnKVxuICB9XG5cbiAgdmFyIGxlbmd0aCA9IGJ5dGVMZW5ndGgoc3RyaW5nLCBlbmNvZGluZykgfCAwXG4gIHRoYXQgPSBjcmVhdGVCdWZmZXIodGhhdCwgbGVuZ3RoKVxuXG4gIHZhciBhY3R1YWwgPSB0aGF0LndyaXRlKHN0cmluZywgZW5jb2RpbmcpXG5cbiAgaWYgKGFjdHVhbCAhPT0gbGVuZ3RoKSB7XG4gICAgLy8gV3JpdGluZyBhIGhleCBzdHJpbmcsIGZvciBleGFtcGxlLCB0aGF0IGNvbnRhaW5zIGludmFsaWQgY2hhcmFjdGVycyB3aWxsXG4gICAgLy8gY2F1c2UgZXZlcnl0aGluZyBhZnRlciB0aGUgZmlyc3QgaW52YWxpZCBjaGFyYWN0ZXIgdG8gYmUgaWdub3JlZC4gKGUuZy5cbiAgICAvLyAnYWJ4eGNkJyB3aWxsIGJlIHRyZWF0ZWQgYXMgJ2FiJylcbiAgICB0aGF0ID0gdGhhdC5zbGljZSgwLCBhY3R1YWwpXG4gIH1cblxuICByZXR1cm4gdGhhdFxufVxuXG5mdW5jdGlvbiBmcm9tQXJyYXlMaWtlICh0aGF0LCBhcnJheSkge1xuICB2YXIgbGVuZ3RoID0gYXJyYXkubGVuZ3RoIDwgMCA/IDAgOiBjaGVja2VkKGFycmF5Lmxlbmd0aCkgfCAwXG4gIHRoYXQgPSBjcmVhdGVCdWZmZXIodGhhdCwgbGVuZ3RoKVxuICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbmd0aDsgaSArPSAxKSB7XG4gICAgdGhhdFtpXSA9IGFycmF5W2ldICYgMjU1XG4gIH1cbiAgcmV0dXJuIHRoYXRcbn1cblxuZnVuY3Rpb24gZnJvbUFycmF5QnVmZmVyICh0aGF0LCBhcnJheSwgYnl0ZU9mZnNldCwgbGVuZ3RoKSB7XG4gIGFycmF5LmJ5dGVMZW5ndGggLy8gdGhpcyB0aHJvd3MgaWYgYGFycmF5YCBpcyBub3QgYSB2YWxpZCBBcnJheUJ1ZmZlclxuXG4gIGlmIChieXRlT2Zmc2V0IDwgMCB8fCBhcnJheS5ieXRlTGVuZ3RoIDwgYnl0ZU9mZnNldCkge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdcXCdvZmZzZXRcXCcgaXMgb3V0IG9mIGJvdW5kcycpXG4gIH1cblxuICBpZiAoYXJyYXkuYnl0ZUxlbmd0aCA8IGJ5dGVPZmZzZXQgKyAobGVuZ3RoIHx8IDApKSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ1xcJ2xlbmd0aFxcJyBpcyBvdXQgb2YgYm91bmRzJylcbiAgfVxuXG4gIGlmIChieXRlT2Zmc2V0ID09PSB1bmRlZmluZWQgJiYgbGVuZ3RoID09PSB1bmRlZmluZWQpIHtcbiAgICBhcnJheSA9IG5ldyBVaW50OEFycmF5KGFycmF5KVxuICB9IGVsc2UgaWYgKGxlbmd0aCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgYXJyYXkgPSBuZXcgVWludDhBcnJheShhcnJheSwgYnl0ZU9mZnNldClcbiAgfSBlbHNlIHtcbiAgICBhcnJheSA9IG5ldyBVaW50OEFycmF5KGFycmF5LCBieXRlT2Zmc2V0LCBsZW5ndGgpXG4gIH1cblxuICBpZiAoQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHtcbiAgICAvLyBSZXR1cm4gYW4gYXVnbWVudGVkIGBVaW50OEFycmF5YCBpbnN0YW5jZSwgZm9yIGJlc3QgcGVyZm9ybWFuY2VcbiAgICB0aGF0ID0gYXJyYXlcbiAgICB0aGF0Ll9fcHJvdG9fXyA9IEJ1ZmZlci5wcm90b3R5cGVcbiAgfSBlbHNlIHtcbiAgICAvLyBGYWxsYmFjazogUmV0dXJuIGFuIG9iamVjdCBpbnN0YW5jZSBvZiB0aGUgQnVmZmVyIGNsYXNzXG4gICAgdGhhdCA9IGZyb21BcnJheUxpa2UodGhhdCwgYXJyYXkpXG4gIH1cbiAgcmV0dXJuIHRoYXRcbn1cblxuZnVuY3Rpb24gZnJvbU9iamVjdCAodGhhdCwgb2JqKSB7XG4gIGlmIChCdWZmZXIuaXNCdWZmZXIob2JqKSkge1xuICAgIHZhciBsZW4gPSBjaGVja2VkKG9iai5sZW5ndGgpIHwgMFxuICAgIHRoYXQgPSBjcmVhdGVCdWZmZXIodGhhdCwgbGVuKVxuXG4gICAgaWYgKHRoYXQubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gdGhhdFxuICAgIH1cblxuICAgIG9iai5jb3B5KHRoYXQsIDAsIDAsIGxlbilcbiAgICByZXR1cm4gdGhhdFxuICB9XG5cbiAgaWYgKG9iaikge1xuICAgIGlmICgodHlwZW9mIEFycmF5QnVmZmVyICE9PSAndW5kZWZpbmVkJyAmJlxuICAgICAgICBvYmouYnVmZmVyIGluc3RhbmNlb2YgQXJyYXlCdWZmZXIpIHx8ICdsZW5ndGgnIGluIG9iaikge1xuICAgICAgaWYgKHR5cGVvZiBvYmoubGVuZ3RoICE9PSAnbnVtYmVyJyB8fCBpc25hbihvYmoubGVuZ3RoKSkge1xuICAgICAgICByZXR1cm4gY3JlYXRlQnVmZmVyKHRoYXQsIDApXG4gICAgICB9XG4gICAgICByZXR1cm4gZnJvbUFycmF5TGlrZSh0aGF0LCBvYmopXG4gICAgfVxuXG4gICAgaWYgKG9iai50eXBlID09PSAnQnVmZmVyJyAmJiBpc0FycmF5KG9iai5kYXRhKSkge1xuICAgICAgcmV0dXJuIGZyb21BcnJheUxpa2UodGhhdCwgb2JqLmRhdGEpXG4gICAgfVxuICB9XG5cbiAgdGhyb3cgbmV3IFR5cGVFcnJvcignRmlyc3QgYXJndW1lbnQgbXVzdCBiZSBhIHN0cmluZywgQnVmZmVyLCBBcnJheUJ1ZmZlciwgQXJyYXksIG9yIGFycmF5LWxpa2Ugb2JqZWN0LicpXG59XG5cbmZ1bmN0aW9uIGNoZWNrZWQgKGxlbmd0aCkge1xuICAvLyBOb3RlOiBjYW5ub3QgdXNlIGBsZW5ndGggPCBrTWF4TGVuZ3RoKClgIGhlcmUgYmVjYXVzZSB0aGF0IGZhaWxzIHdoZW5cbiAgLy8gbGVuZ3RoIGlzIE5hTiAod2hpY2ggaXMgb3RoZXJ3aXNlIGNvZXJjZWQgdG8gemVyby4pXG4gIGlmIChsZW5ndGggPj0ga01heExlbmd0aCgpKSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ0F0dGVtcHQgdG8gYWxsb2NhdGUgQnVmZmVyIGxhcmdlciB0aGFuIG1heGltdW0gJyArXG4gICAgICAgICAgICAgICAgICAgICAgICAgJ3NpemU6IDB4JyArIGtNYXhMZW5ndGgoKS50b1N0cmluZygxNikgKyAnIGJ5dGVzJylcbiAgfVxuICByZXR1cm4gbGVuZ3RoIHwgMFxufVxuXG5mdW5jdGlvbiBTbG93QnVmZmVyIChsZW5ndGgpIHtcbiAgaWYgKCtsZW5ndGggIT0gbGVuZ3RoKSB7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgZXFlcWVxXG4gICAgbGVuZ3RoID0gMFxuICB9XG4gIHJldHVybiBCdWZmZXIuYWxsb2MoK2xlbmd0aClcbn1cblxuQnVmZmVyLmlzQnVmZmVyID0gZnVuY3Rpb24gaXNCdWZmZXIgKGIpIHtcbiAgcmV0dXJuICEhKGIgIT0gbnVsbCAmJiBiLl9pc0J1ZmZlcilcbn1cblxuQnVmZmVyLmNvbXBhcmUgPSBmdW5jdGlvbiBjb21wYXJlIChhLCBiKSB7XG4gIGlmICghQnVmZmVyLmlzQnVmZmVyKGEpIHx8ICFCdWZmZXIuaXNCdWZmZXIoYikpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdBcmd1bWVudHMgbXVzdCBiZSBCdWZmZXJzJylcbiAgfVxuXG4gIGlmIChhID09PSBiKSByZXR1cm4gMFxuXG4gIHZhciB4ID0gYS5sZW5ndGhcbiAgdmFyIHkgPSBiLmxlbmd0aFxuXG4gIGZvciAodmFyIGkgPSAwLCBsZW4gPSBNYXRoLm1pbih4LCB5KTsgaSA8IGxlbjsgKytpKSB7XG4gICAgaWYgKGFbaV0gIT09IGJbaV0pIHtcbiAgICAgIHggPSBhW2ldXG4gICAgICB5ID0gYltpXVxuICAgICAgYnJlYWtcbiAgICB9XG4gIH1cblxuICBpZiAoeCA8IHkpIHJldHVybiAtMVxuICBpZiAoeSA8IHgpIHJldHVybiAxXG4gIHJldHVybiAwXG59XG5cbkJ1ZmZlci5pc0VuY29kaW5nID0gZnVuY3Rpb24gaXNFbmNvZGluZyAoZW5jb2RpbmcpIHtcbiAgc3dpdGNoIChTdHJpbmcoZW5jb2RpbmcpLnRvTG93ZXJDYXNlKCkpIHtcbiAgICBjYXNlICdoZXgnOlxuICAgIGNhc2UgJ3V0ZjgnOlxuICAgIGNhc2UgJ3V0Zi04JzpcbiAgICBjYXNlICdhc2NpaSc6XG4gICAgY2FzZSAnbGF0aW4xJzpcbiAgICBjYXNlICdiaW5hcnknOlxuICAgIGNhc2UgJ2Jhc2U2NCc6XG4gICAgY2FzZSAndWNzMic6XG4gICAgY2FzZSAndWNzLTInOlxuICAgIGNhc2UgJ3V0ZjE2bGUnOlxuICAgIGNhc2UgJ3V0Zi0xNmxlJzpcbiAgICAgIHJldHVybiB0cnVlXG4gICAgZGVmYXVsdDpcbiAgICAgIHJldHVybiBmYWxzZVxuICB9XG59XG5cbkJ1ZmZlci5jb25jYXQgPSBmdW5jdGlvbiBjb25jYXQgKGxpc3QsIGxlbmd0aCkge1xuICBpZiAoIWlzQXJyYXkobGlzdCkpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdcImxpc3RcIiBhcmd1bWVudCBtdXN0IGJlIGFuIEFycmF5IG9mIEJ1ZmZlcnMnKVxuICB9XG5cbiAgaWYgKGxpc3QubGVuZ3RoID09PSAwKSB7XG4gICAgcmV0dXJuIEJ1ZmZlci5hbGxvYygwKVxuICB9XG5cbiAgdmFyIGlcbiAgaWYgKGxlbmd0aCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgbGVuZ3RoID0gMFxuICAgIGZvciAoaSA9IDA7IGkgPCBsaXN0Lmxlbmd0aDsgKytpKSB7XG4gICAgICBsZW5ndGggKz0gbGlzdFtpXS5sZW5ndGhcbiAgICB9XG4gIH1cblxuICB2YXIgYnVmZmVyID0gQnVmZmVyLmFsbG9jVW5zYWZlKGxlbmd0aClcbiAgdmFyIHBvcyA9IDBcbiAgZm9yIChpID0gMDsgaSA8IGxpc3QubGVuZ3RoOyArK2kpIHtcbiAgICB2YXIgYnVmID0gbGlzdFtpXVxuICAgIGlmICghQnVmZmVyLmlzQnVmZmVyKGJ1ZikpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1wibGlzdFwiIGFyZ3VtZW50IG11c3QgYmUgYW4gQXJyYXkgb2YgQnVmZmVycycpXG4gICAgfVxuICAgIGJ1Zi5jb3B5KGJ1ZmZlciwgcG9zKVxuICAgIHBvcyArPSBidWYubGVuZ3RoXG4gIH1cbiAgcmV0dXJuIGJ1ZmZlclxufVxuXG5mdW5jdGlvbiBieXRlTGVuZ3RoIChzdHJpbmcsIGVuY29kaW5nKSB7XG4gIGlmIChCdWZmZXIuaXNCdWZmZXIoc3RyaW5nKSkge1xuICAgIHJldHVybiBzdHJpbmcubGVuZ3RoXG4gIH1cbiAgaWYgKHR5cGVvZiBBcnJheUJ1ZmZlciAhPT0gJ3VuZGVmaW5lZCcgJiYgdHlwZW9mIEFycmF5QnVmZmVyLmlzVmlldyA9PT0gJ2Z1bmN0aW9uJyAmJlxuICAgICAgKEFycmF5QnVmZmVyLmlzVmlldyhzdHJpbmcpIHx8IHN0cmluZyBpbnN0YW5jZW9mIEFycmF5QnVmZmVyKSkge1xuICAgIHJldHVybiBzdHJpbmcuYnl0ZUxlbmd0aFxuICB9XG4gIGlmICh0eXBlb2Ygc3RyaW5nICE9PSAnc3RyaW5nJykge1xuICAgIHN0cmluZyA9ICcnICsgc3RyaW5nXG4gIH1cblxuICB2YXIgbGVuID0gc3RyaW5nLmxlbmd0aFxuICBpZiAobGVuID09PSAwKSByZXR1cm4gMFxuXG4gIC8vIFVzZSBhIGZvciBsb29wIHRvIGF2b2lkIHJlY3Vyc2lvblxuICB2YXIgbG93ZXJlZENhc2UgPSBmYWxzZVxuICBmb3IgKDs7KSB7XG4gICAgc3dpdGNoIChlbmNvZGluZykge1xuICAgICAgY2FzZSAnYXNjaWknOlxuICAgICAgY2FzZSAnbGF0aW4xJzpcbiAgICAgIGNhc2UgJ2JpbmFyeSc6XG4gICAgICAgIHJldHVybiBsZW5cbiAgICAgIGNhc2UgJ3V0ZjgnOlxuICAgICAgY2FzZSAndXRmLTgnOlxuICAgICAgY2FzZSB1bmRlZmluZWQ6XG4gICAgICAgIHJldHVybiB1dGY4VG9CeXRlcyhzdHJpbmcpLmxlbmd0aFxuICAgICAgY2FzZSAndWNzMic6XG4gICAgICBjYXNlICd1Y3MtMic6XG4gICAgICBjYXNlICd1dGYxNmxlJzpcbiAgICAgIGNhc2UgJ3V0Zi0xNmxlJzpcbiAgICAgICAgcmV0dXJuIGxlbiAqIDJcbiAgICAgIGNhc2UgJ2hleCc6XG4gICAgICAgIHJldHVybiBsZW4gPj4+IDFcbiAgICAgIGNhc2UgJ2Jhc2U2NCc6XG4gICAgICAgIHJldHVybiBiYXNlNjRUb0J5dGVzKHN0cmluZykubGVuZ3RoXG4gICAgICBkZWZhdWx0OlxuICAgICAgICBpZiAobG93ZXJlZENhc2UpIHJldHVybiB1dGY4VG9CeXRlcyhzdHJpbmcpLmxlbmd0aCAvLyBhc3N1bWUgdXRmOFxuICAgICAgICBlbmNvZGluZyA9ICgnJyArIGVuY29kaW5nKS50b0xvd2VyQ2FzZSgpXG4gICAgICAgIGxvd2VyZWRDYXNlID0gdHJ1ZVxuICAgIH1cbiAgfVxufVxuQnVmZmVyLmJ5dGVMZW5ndGggPSBieXRlTGVuZ3RoXG5cbmZ1bmN0aW9uIHNsb3dUb1N0cmluZyAoZW5jb2RpbmcsIHN0YXJ0LCBlbmQpIHtcbiAgdmFyIGxvd2VyZWRDYXNlID0gZmFsc2VcblxuICAvLyBObyBuZWVkIHRvIHZlcmlmeSB0aGF0IFwidGhpcy5sZW5ndGggPD0gTUFYX1VJTlQzMlwiIHNpbmNlIGl0J3MgYSByZWFkLW9ubHlcbiAgLy8gcHJvcGVydHkgb2YgYSB0eXBlZCBhcnJheS5cblxuICAvLyBUaGlzIGJlaGF2ZXMgbmVpdGhlciBsaWtlIFN0cmluZyBub3IgVWludDhBcnJheSBpbiB0aGF0IHdlIHNldCBzdGFydC9lbmRcbiAgLy8gdG8gdGhlaXIgdXBwZXIvbG93ZXIgYm91bmRzIGlmIHRoZSB2YWx1ZSBwYXNzZWQgaXMgb3V0IG9mIHJhbmdlLlxuICAvLyB1bmRlZmluZWQgaXMgaGFuZGxlZCBzcGVjaWFsbHkgYXMgcGVyIEVDTUEtMjYyIDZ0aCBFZGl0aW9uLFxuICAvLyBTZWN0aW9uIDEzLjMuMy43IFJ1bnRpbWUgU2VtYW50aWNzOiBLZXllZEJpbmRpbmdJbml0aWFsaXphdGlvbi5cbiAgaWYgKHN0YXJ0ID09PSB1bmRlZmluZWQgfHwgc3RhcnQgPCAwKSB7XG4gICAgc3RhcnQgPSAwXG4gIH1cbiAgLy8gUmV0dXJuIGVhcmx5IGlmIHN0YXJ0ID4gdGhpcy5sZW5ndGguIERvbmUgaGVyZSB0byBwcmV2ZW50IHBvdGVudGlhbCB1aW50MzJcbiAgLy8gY29lcmNpb24gZmFpbCBiZWxvdy5cbiAgaWYgKHN0YXJ0ID4gdGhpcy5sZW5ndGgpIHtcbiAgICByZXR1cm4gJydcbiAgfVxuXG4gIGlmIChlbmQgPT09IHVuZGVmaW5lZCB8fCBlbmQgPiB0aGlzLmxlbmd0aCkge1xuICAgIGVuZCA9IHRoaXMubGVuZ3RoXG4gIH1cblxuICBpZiAoZW5kIDw9IDApIHtcbiAgICByZXR1cm4gJydcbiAgfVxuXG4gIC8vIEZvcmNlIGNvZXJzaW9uIHRvIHVpbnQzMi4gVGhpcyB3aWxsIGFsc28gY29lcmNlIGZhbHNleS9OYU4gdmFsdWVzIHRvIDAuXG4gIGVuZCA+Pj49IDBcbiAgc3RhcnQgPj4+PSAwXG5cbiAgaWYgKGVuZCA8PSBzdGFydCkge1xuICAgIHJldHVybiAnJ1xuICB9XG5cbiAgaWYgKCFlbmNvZGluZykgZW5jb2RpbmcgPSAndXRmOCdcblxuICB3aGlsZSAodHJ1ZSkge1xuICAgIHN3aXRjaCAoZW5jb2RpbmcpIHtcbiAgICAgIGNhc2UgJ2hleCc6XG4gICAgICAgIHJldHVybiBoZXhTbGljZSh0aGlzLCBzdGFydCwgZW5kKVxuXG4gICAgICBjYXNlICd1dGY4JzpcbiAgICAgIGNhc2UgJ3V0Zi04JzpcbiAgICAgICAgcmV0dXJuIHV0ZjhTbGljZSh0aGlzLCBzdGFydCwgZW5kKVxuXG4gICAgICBjYXNlICdhc2NpaSc6XG4gICAgICAgIHJldHVybiBhc2NpaVNsaWNlKHRoaXMsIHN0YXJ0LCBlbmQpXG5cbiAgICAgIGNhc2UgJ2xhdGluMSc6XG4gICAgICBjYXNlICdiaW5hcnknOlxuICAgICAgICByZXR1cm4gbGF0aW4xU2xpY2UodGhpcywgc3RhcnQsIGVuZClcblxuICAgICAgY2FzZSAnYmFzZTY0JzpcbiAgICAgICAgcmV0dXJuIGJhc2U2NFNsaWNlKHRoaXMsIHN0YXJ0LCBlbmQpXG5cbiAgICAgIGNhc2UgJ3VjczInOlxuICAgICAgY2FzZSAndWNzLTInOlxuICAgICAgY2FzZSAndXRmMTZsZSc6XG4gICAgICBjYXNlICd1dGYtMTZsZSc6XG4gICAgICAgIHJldHVybiB1dGYxNmxlU2xpY2UodGhpcywgc3RhcnQsIGVuZClcblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgaWYgKGxvd2VyZWRDYXNlKSB0aHJvdyBuZXcgVHlwZUVycm9yKCdVbmtub3duIGVuY29kaW5nOiAnICsgZW5jb2RpbmcpXG4gICAgICAgIGVuY29kaW5nID0gKGVuY29kaW5nICsgJycpLnRvTG93ZXJDYXNlKClcbiAgICAgICAgbG93ZXJlZENhc2UgPSB0cnVlXG4gICAgfVxuICB9XG59XG5cbi8vIFRoZSBwcm9wZXJ0eSBpcyB1c2VkIGJ5IGBCdWZmZXIuaXNCdWZmZXJgIGFuZCBgaXMtYnVmZmVyYCAoaW4gU2FmYXJpIDUtNykgdG8gZGV0ZWN0XG4vLyBCdWZmZXIgaW5zdGFuY2VzLlxuQnVmZmVyLnByb3RvdHlwZS5faXNCdWZmZXIgPSB0cnVlXG5cbmZ1bmN0aW9uIHN3YXAgKGIsIG4sIG0pIHtcbiAgdmFyIGkgPSBiW25dXG4gIGJbbl0gPSBiW21dXG4gIGJbbV0gPSBpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUuc3dhcDE2ID0gZnVuY3Rpb24gc3dhcDE2ICgpIHtcbiAgdmFyIGxlbiA9IHRoaXMubGVuZ3RoXG4gIGlmIChsZW4gJSAyICE9PSAwKSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ0J1ZmZlciBzaXplIG11c3QgYmUgYSBtdWx0aXBsZSBvZiAxNi1iaXRzJylcbiAgfVxuICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgaSArPSAyKSB7XG4gICAgc3dhcCh0aGlzLCBpLCBpICsgMSlcbiAgfVxuICByZXR1cm4gdGhpc1xufVxuXG5CdWZmZXIucHJvdG90eXBlLnN3YXAzMiA9IGZ1bmN0aW9uIHN3YXAzMiAoKSB7XG4gIHZhciBsZW4gPSB0aGlzLmxlbmd0aFxuICBpZiAobGVuICUgNCAhPT0gMCkge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdCdWZmZXIgc2l6ZSBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgMzItYml0cycpXG4gIH1cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47IGkgKz0gNCkge1xuICAgIHN3YXAodGhpcywgaSwgaSArIDMpXG4gICAgc3dhcCh0aGlzLCBpICsgMSwgaSArIDIpXG4gIH1cbiAgcmV0dXJuIHRoaXNcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5zd2FwNjQgPSBmdW5jdGlvbiBzd2FwNjQgKCkge1xuICB2YXIgbGVuID0gdGhpcy5sZW5ndGhcbiAgaWYgKGxlbiAlIDggIT09IDApIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignQnVmZmVyIHNpemUgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDY0LWJpdHMnKVxuICB9XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyBpICs9IDgpIHtcbiAgICBzd2FwKHRoaXMsIGksIGkgKyA3KVxuICAgIHN3YXAodGhpcywgaSArIDEsIGkgKyA2KVxuICAgIHN3YXAodGhpcywgaSArIDIsIGkgKyA1KVxuICAgIHN3YXAodGhpcywgaSArIDMsIGkgKyA0KVxuICB9XG4gIHJldHVybiB0aGlzXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbiB0b1N0cmluZyAoKSB7XG4gIHZhciBsZW5ndGggPSB0aGlzLmxlbmd0aCB8IDBcbiAgaWYgKGxlbmd0aCA9PT0gMCkgcmV0dXJuICcnXG4gIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAwKSByZXR1cm4gdXRmOFNsaWNlKHRoaXMsIDAsIGxlbmd0aClcbiAgcmV0dXJuIHNsb3dUb1N0cmluZy5hcHBseSh0aGlzLCBhcmd1bWVudHMpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUuZXF1YWxzID0gZnVuY3Rpb24gZXF1YWxzIChiKSB7XG4gIGlmICghQnVmZmVyLmlzQnVmZmVyKGIpKSB0aHJvdyBuZXcgVHlwZUVycm9yKCdBcmd1bWVudCBtdXN0IGJlIGEgQnVmZmVyJylcbiAgaWYgKHRoaXMgPT09IGIpIHJldHVybiB0cnVlXG4gIHJldHVybiBCdWZmZXIuY29tcGFyZSh0aGlzLCBiKSA9PT0gMFxufVxuXG5CdWZmZXIucHJvdG90eXBlLmluc3BlY3QgPSBmdW5jdGlvbiBpbnNwZWN0ICgpIHtcbiAgdmFyIHN0ciA9ICcnXG4gIHZhciBtYXggPSBleHBvcnRzLklOU1BFQ1RfTUFYX0JZVEVTXG4gIGlmICh0aGlzLmxlbmd0aCA+IDApIHtcbiAgICBzdHIgPSB0aGlzLnRvU3RyaW5nKCdoZXgnLCAwLCBtYXgpLm1hdGNoKC8uezJ9L2cpLmpvaW4oJyAnKVxuICAgIGlmICh0aGlzLmxlbmd0aCA+IG1heCkgc3RyICs9ICcgLi4uICdcbiAgfVxuICByZXR1cm4gJzxCdWZmZXIgJyArIHN0ciArICc+J1xufVxuXG5CdWZmZXIucHJvdG90eXBlLmNvbXBhcmUgPSBmdW5jdGlvbiBjb21wYXJlICh0YXJnZXQsIHN0YXJ0LCBlbmQsIHRoaXNTdGFydCwgdGhpc0VuZCkge1xuICBpZiAoIUJ1ZmZlci5pc0J1ZmZlcih0YXJnZXQpKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignQXJndW1lbnQgbXVzdCBiZSBhIEJ1ZmZlcicpXG4gIH1cblxuICBpZiAoc3RhcnQgPT09IHVuZGVmaW5lZCkge1xuICAgIHN0YXJ0ID0gMFxuICB9XG4gIGlmIChlbmQgPT09IHVuZGVmaW5lZCkge1xuICAgIGVuZCA9IHRhcmdldCA/IHRhcmdldC5sZW5ndGggOiAwXG4gIH1cbiAgaWYgKHRoaXNTdGFydCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgdGhpc1N0YXJ0ID0gMFxuICB9XG4gIGlmICh0aGlzRW5kID09PSB1bmRlZmluZWQpIHtcbiAgICB0aGlzRW5kID0gdGhpcy5sZW5ndGhcbiAgfVxuXG4gIGlmIChzdGFydCA8IDAgfHwgZW5kID4gdGFyZ2V0Lmxlbmd0aCB8fCB0aGlzU3RhcnQgPCAwIHx8IHRoaXNFbmQgPiB0aGlzLmxlbmd0aCkge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdvdXQgb2YgcmFuZ2UgaW5kZXgnKVxuICB9XG5cbiAgaWYgKHRoaXNTdGFydCA+PSB0aGlzRW5kICYmIHN0YXJ0ID49IGVuZCkge1xuICAgIHJldHVybiAwXG4gIH1cbiAgaWYgKHRoaXNTdGFydCA+PSB0aGlzRW5kKSB7XG4gICAgcmV0dXJuIC0xXG4gIH1cbiAgaWYgKHN0YXJ0ID49IGVuZCkge1xuICAgIHJldHVybiAxXG4gIH1cblxuICBzdGFydCA+Pj49IDBcbiAgZW5kID4+Pj0gMFxuICB0aGlzU3RhcnQgPj4+PSAwXG4gIHRoaXNFbmQgPj4+PSAwXG5cbiAgaWYgKHRoaXMgPT09IHRhcmdldCkgcmV0dXJuIDBcblxuICB2YXIgeCA9IHRoaXNFbmQgLSB0aGlzU3RhcnRcbiAgdmFyIHkgPSBlbmQgLSBzdGFydFxuICB2YXIgbGVuID0gTWF0aC5taW4oeCwgeSlcblxuICB2YXIgdGhpc0NvcHkgPSB0aGlzLnNsaWNlKHRoaXNTdGFydCwgdGhpc0VuZClcbiAgdmFyIHRhcmdldENvcHkgPSB0YXJnZXQuc2xpY2Uoc3RhcnQsIGVuZClcblxuICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgKytpKSB7XG4gICAgaWYgKHRoaXNDb3B5W2ldICE9PSB0YXJnZXRDb3B5W2ldKSB7XG4gICAgICB4ID0gdGhpc0NvcHlbaV1cbiAgICAgIHkgPSB0YXJnZXRDb3B5W2ldXG4gICAgICBicmVha1xuICAgIH1cbiAgfVxuXG4gIGlmICh4IDwgeSkgcmV0dXJuIC0xXG4gIGlmICh5IDwgeCkgcmV0dXJuIDFcbiAgcmV0dXJuIDBcbn1cblxuLy8gRmluZHMgZWl0aGVyIHRoZSBmaXJzdCBpbmRleCBvZiBgdmFsYCBpbiBgYnVmZmVyYCBhdCBvZmZzZXQgPj0gYGJ5dGVPZmZzZXRgLFxuLy8gT1IgdGhlIGxhc3QgaW5kZXggb2YgYHZhbGAgaW4gYGJ1ZmZlcmAgYXQgb2Zmc2V0IDw9IGBieXRlT2Zmc2V0YC5cbi8vXG4vLyBBcmd1bWVudHM6XG4vLyAtIGJ1ZmZlciAtIGEgQnVmZmVyIHRvIHNlYXJjaFxuLy8gLSB2YWwgLSBhIHN0cmluZywgQnVmZmVyLCBvciBudW1iZXJcbi8vIC0gYnl0ZU9mZnNldCAtIGFuIGluZGV4IGludG8gYGJ1ZmZlcmA7IHdpbGwgYmUgY2xhbXBlZCB0byBhbiBpbnQzMlxuLy8gLSBlbmNvZGluZyAtIGFuIG9wdGlvbmFsIGVuY29kaW5nLCByZWxldmFudCBpcyB2YWwgaXMgYSBzdHJpbmdcbi8vIC0gZGlyIC0gdHJ1ZSBmb3IgaW5kZXhPZiwgZmFsc2UgZm9yIGxhc3RJbmRleE9mXG5mdW5jdGlvbiBiaWRpcmVjdGlvbmFsSW5kZXhPZiAoYnVmZmVyLCB2YWwsIGJ5dGVPZmZzZXQsIGVuY29kaW5nLCBkaXIpIHtcbiAgLy8gRW1wdHkgYnVmZmVyIG1lYW5zIG5vIG1hdGNoXG4gIGlmIChidWZmZXIubGVuZ3RoID09PSAwKSByZXR1cm4gLTFcblxuICAvLyBOb3JtYWxpemUgYnl0ZU9mZnNldFxuICBpZiAodHlwZW9mIGJ5dGVPZmZzZXQgPT09ICdzdHJpbmcnKSB7XG4gICAgZW5jb2RpbmcgPSBieXRlT2Zmc2V0XG4gICAgYnl0ZU9mZnNldCA9IDBcbiAgfSBlbHNlIGlmIChieXRlT2Zmc2V0ID4gMHg3ZmZmZmZmZikge1xuICAgIGJ5dGVPZmZzZXQgPSAweDdmZmZmZmZmXG4gIH0gZWxzZSBpZiAoYnl0ZU9mZnNldCA8IC0weDgwMDAwMDAwKSB7XG4gICAgYnl0ZU9mZnNldCA9IC0weDgwMDAwMDAwXG4gIH1cbiAgYnl0ZU9mZnNldCA9ICtieXRlT2Zmc2V0ICAvLyBDb2VyY2UgdG8gTnVtYmVyLlxuICBpZiAoaXNOYU4oYnl0ZU9mZnNldCkpIHtcbiAgICAvLyBieXRlT2Zmc2V0OiBpdCBpdCdzIHVuZGVmaW5lZCwgbnVsbCwgTmFOLCBcImZvb1wiLCBldGMsIHNlYXJjaCB3aG9sZSBidWZmZXJcbiAgICBieXRlT2Zmc2V0ID0gZGlyID8gMCA6IChidWZmZXIubGVuZ3RoIC0gMSlcbiAgfVxuXG4gIC8vIE5vcm1hbGl6ZSBieXRlT2Zmc2V0OiBuZWdhdGl2ZSBvZmZzZXRzIHN0YXJ0IGZyb20gdGhlIGVuZCBvZiB0aGUgYnVmZmVyXG4gIGlmIChieXRlT2Zmc2V0IDwgMCkgYnl0ZU9mZnNldCA9IGJ1ZmZlci5sZW5ndGggKyBieXRlT2Zmc2V0XG4gIGlmIChieXRlT2Zmc2V0ID49IGJ1ZmZlci5sZW5ndGgpIHtcbiAgICBpZiAoZGlyKSByZXR1cm4gLTFcbiAgICBlbHNlIGJ5dGVPZmZzZXQgPSBidWZmZXIubGVuZ3RoIC0gMVxuICB9IGVsc2UgaWYgKGJ5dGVPZmZzZXQgPCAwKSB7XG4gICAgaWYgKGRpcikgYnl0ZU9mZnNldCA9IDBcbiAgICBlbHNlIHJldHVybiAtMVxuICB9XG5cbiAgLy8gTm9ybWFsaXplIHZhbFxuICBpZiAodHlwZW9mIHZhbCA9PT0gJ3N0cmluZycpIHtcbiAgICB2YWwgPSBCdWZmZXIuZnJvbSh2YWwsIGVuY29kaW5nKVxuICB9XG5cbiAgLy8gRmluYWxseSwgc2VhcmNoIGVpdGhlciBpbmRleE9mIChpZiBkaXIgaXMgdHJ1ZSkgb3IgbGFzdEluZGV4T2ZcbiAgaWYgKEJ1ZmZlci5pc0J1ZmZlcih2YWwpKSB7XG4gICAgLy8gU3BlY2lhbCBjYXNlOiBsb29raW5nIGZvciBlbXB0eSBzdHJpbmcvYnVmZmVyIGFsd2F5cyBmYWlsc1xuICAgIGlmICh2YWwubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gLTFcbiAgICB9XG4gICAgcmV0dXJuIGFycmF5SW5kZXhPZihidWZmZXIsIHZhbCwgYnl0ZU9mZnNldCwgZW5jb2RpbmcsIGRpcilcbiAgfSBlbHNlIGlmICh0eXBlb2YgdmFsID09PSAnbnVtYmVyJykge1xuICAgIHZhbCA9IHZhbCAmIDB4RkYgLy8gU2VhcmNoIGZvciBhIGJ5dGUgdmFsdWUgWzAtMjU1XVxuICAgIGlmIChCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCAmJlxuICAgICAgICB0eXBlb2YgVWludDhBcnJheS5wcm90b3R5cGUuaW5kZXhPZiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgaWYgKGRpcikge1xuICAgICAgICByZXR1cm4gVWludDhBcnJheS5wcm90b3R5cGUuaW5kZXhPZi5jYWxsKGJ1ZmZlciwgdmFsLCBieXRlT2Zmc2V0KVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIFVpbnQ4QXJyYXkucHJvdG90eXBlLmxhc3RJbmRleE9mLmNhbGwoYnVmZmVyLCB2YWwsIGJ5dGVPZmZzZXQpXG4gICAgICB9XG4gICAgfVxuICAgIHJldHVybiBhcnJheUluZGV4T2YoYnVmZmVyLCBbIHZhbCBdLCBieXRlT2Zmc2V0LCBlbmNvZGluZywgZGlyKVxuICB9XG5cbiAgdGhyb3cgbmV3IFR5cGVFcnJvcigndmFsIG11c3QgYmUgc3RyaW5nLCBudW1iZXIgb3IgQnVmZmVyJylcbn1cblxuZnVuY3Rpb24gYXJyYXlJbmRleE9mIChhcnIsIHZhbCwgYnl0ZU9mZnNldCwgZW5jb2RpbmcsIGRpcikge1xuICB2YXIgaW5kZXhTaXplID0gMVxuICB2YXIgYXJyTGVuZ3RoID0gYXJyLmxlbmd0aFxuICB2YXIgdmFsTGVuZ3RoID0gdmFsLmxlbmd0aFxuXG4gIGlmIChlbmNvZGluZyAhPT0gdW5kZWZpbmVkKSB7XG4gICAgZW5jb2RpbmcgPSBTdHJpbmcoZW5jb2RpbmcpLnRvTG93ZXJDYXNlKClcbiAgICBpZiAoZW5jb2RpbmcgPT09ICd1Y3MyJyB8fCBlbmNvZGluZyA9PT0gJ3Vjcy0yJyB8fFxuICAgICAgICBlbmNvZGluZyA9PT0gJ3V0ZjE2bGUnIHx8IGVuY29kaW5nID09PSAndXRmLTE2bGUnKSB7XG4gICAgICBpZiAoYXJyLmxlbmd0aCA8IDIgfHwgdmFsLmxlbmd0aCA8IDIpIHtcbiAgICAgICAgcmV0dXJuIC0xXG4gICAgICB9XG4gICAgICBpbmRleFNpemUgPSAyXG4gICAgICBhcnJMZW5ndGggLz0gMlxuICAgICAgdmFsTGVuZ3RoIC89IDJcbiAgICAgIGJ5dGVPZmZzZXQgLz0gMlxuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIHJlYWQgKGJ1ZiwgaSkge1xuICAgIGlmIChpbmRleFNpemUgPT09IDEpIHtcbiAgICAgIHJldHVybiBidWZbaV1cbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGJ1Zi5yZWFkVUludDE2QkUoaSAqIGluZGV4U2l6ZSlcbiAgICB9XG4gIH1cblxuICB2YXIgaVxuICBpZiAoZGlyKSB7XG4gICAgdmFyIGZvdW5kSW5kZXggPSAtMVxuICAgIGZvciAoaSA9IGJ5dGVPZmZzZXQ7IGkgPCBhcnJMZW5ndGg7IGkrKykge1xuICAgICAgaWYgKHJlYWQoYXJyLCBpKSA9PT0gcmVhZCh2YWwsIGZvdW5kSW5kZXggPT09IC0xID8gMCA6IGkgLSBmb3VuZEluZGV4KSkge1xuICAgICAgICBpZiAoZm91bmRJbmRleCA9PT0gLTEpIGZvdW5kSW5kZXggPSBpXG4gICAgICAgIGlmIChpIC0gZm91bmRJbmRleCArIDEgPT09IHZhbExlbmd0aCkgcmV0dXJuIGZvdW5kSW5kZXggKiBpbmRleFNpemVcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmIChmb3VuZEluZGV4ICE9PSAtMSkgaSAtPSBpIC0gZm91bmRJbmRleFxuICAgICAgICBmb3VuZEluZGV4ID0gLTFcbiAgICAgIH1cbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgaWYgKGJ5dGVPZmZzZXQgKyB2YWxMZW5ndGggPiBhcnJMZW5ndGgpIGJ5dGVPZmZzZXQgPSBhcnJMZW5ndGggLSB2YWxMZW5ndGhcbiAgICBmb3IgKGkgPSBieXRlT2Zmc2V0OyBpID49IDA7IGktLSkge1xuICAgICAgdmFyIGZvdW5kID0gdHJ1ZVxuICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCB2YWxMZW5ndGg7IGorKykge1xuICAgICAgICBpZiAocmVhZChhcnIsIGkgKyBqKSAhPT0gcmVhZCh2YWwsIGopKSB7XG4gICAgICAgICAgZm91bmQgPSBmYWxzZVxuICAgICAgICAgIGJyZWFrXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIGlmIChmb3VuZCkgcmV0dXJuIGlcbiAgICB9XG4gIH1cblxuICByZXR1cm4gLTFcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5pbmNsdWRlcyA9IGZ1bmN0aW9uIGluY2x1ZGVzICh2YWwsIGJ5dGVPZmZzZXQsIGVuY29kaW5nKSB7XG4gIHJldHVybiB0aGlzLmluZGV4T2YodmFsLCBieXRlT2Zmc2V0LCBlbmNvZGluZykgIT09IC0xXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUuaW5kZXhPZiA9IGZ1bmN0aW9uIGluZGV4T2YgKHZhbCwgYnl0ZU9mZnNldCwgZW5jb2RpbmcpIHtcbiAgcmV0dXJuIGJpZGlyZWN0aW9uYWxJbmRleE9mKHRoaXMsIHZhbCwgYnl0ZU9mZnNldCwgZW5jb2RpbmcsIHRydWUpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUubGFzdEluZGV4T2YgPSBmdW5jdGlvbiBsYXN0SW5kZXhPZiAodmFsLCBieXRlT2Zmc2V0LCBlbmNvZGluZykge1xuICByZXR1cm4gYmlkaXJlY3Rpb25hbEluZGV4T2YodGhpcywgdmFsLCBieXRlT2Zmc2V0LCBlbmNvZGluZywgZmFsc2UpXG59XG5cbmZ1bmN0aW9uIGhleFdyaXRlIChidWYsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpIHtcbiAgb2Zmc2V0ID0gTnVtYmVyKG9mZnNldCkgfHwgMFxuICB2YXIgcmVtYWluaW5nID0gYnVmLmxlbmd0aCAtIG9mZnNldFxuICBpZiAoIWxlbmd0aCkge1xuICAgIGxlbmd0aCA9IHJlbWFpbmluZ1xuICB9IGVsc2Uge1xuICAgIGxlbmd0aCA9IE51bWJlcihsZW5ndGgpXG4gICAgaWYgKGxlbmd0aCA+IHJlbWFpbmluZykge1xuICAgICAgbGVuZ3RoID0gcmVtYWluaW5nXG4gICAgfVxuICB9XG5cbiAgLy8gbXVzdCBiZSBhbiBldmVuIG51bWJlciBvZiBkaWdpdHNcbiAgdmFyIHN0ckxlbiA9IHN0cmluZy5sZW5ndGhcbiAgaWYgKHN0ckxlbiAlIDIgIT09IDApIHRocm93IG5ldyBUeXBlRXJyb3IoJ0ludmFsaWQgaGV4IHN0cmluZycpXG5cbiAgaWYgKGxlbmd0aCA+IHN0ckxlbiAvIDIpIHtcbiAgICBsZW5ndGggPSBzdHJMZW4gLyAyXG4gIH1cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW5ndGg7ICsraSkge1xuICAgIHZhciBwYXJzZWQgPSBwYXJzZUludChzdHJpbmcuc3Vic3RyKGkgKiAyLCAyKSwgMTYpXG4gICAgaWYgKGlzTmFOKHBhcnNlZCkpIHJldHVybiBpXG4gICAgYnVmW29mZnNldCArIGldID0gcGFyc2VkXG4gIH1cbiAgcmV0dXJuIGlcbn1cblxuZnVuY3Rpb24gdXRmOFdyaXRlIChidWYsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpIHtcbiAgcmV0dXJuIGJsaXRCdWZmZXIodXRmOFRvQnl0ZXMoc3RyaW5nLCBidWYubGVuZ3RoIC0gb2Zmc2V0KSwgYnVmLCBvZmZzZXQsIGxlbmd0aClcbn1cblxuZnVuY3Rpb24gYXNjaWlXcml0ZSAoYnVmLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKSB7XG4gIHJldHVybiBibGl0QnVmZmVyKGFzY2lpVG9CeXRlcyhzdHJpbmcpLCBidWYsIG9mZnNldCwgbGVuZ3RoKVxufVxuXG5mdW5jdGlvbiBsYXRpbjFXcml0ZSAoYnVmLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKSB7XG4gIHJldHVybiBhc2NpaVdyaXRlKGJ1Ziwgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aClcbn1cblxuZnVuY3Rpb24gYmFzZTY0V3JpdGUgKGJ1Ziwgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aCkge1xuICByZXR1cm4gYmxpdEJ1ZmZlcihiYXNlNjRUb0J5dGVzKHN0cmluZyksIGJ1Ziwgb2Zmc2V0LCBsZW5ndGgpXG59XG5cbmZ1bmN0aW9uIHVjczJXcml0ZSAoYnVmLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKSB7XG4gIHJldHVybiBibGl0QnVmZmVyKHV0ZjE2bGVUb0J5dGVzKHN0cmluZywgYnVmLmxlbmd0aCAtIG9mZnNldCksIGJ1Ziwgb2Zmc2V0LCBsZW5ndGgpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGUgPSBmdW5jdGlvbiB3cml0ZSAoc3RyaW5nLCBvZmZzZXQsIGxlbmd0aCwgZW5jb2RpbmcpIHtcbiAgLy8gQnVmZmVyI3dyaXRlKHN0cmluZylcbiAgaWYgKG9mZnNldCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgZW5jb2RpbmcgPSAndXRmOCdcbiAgICBsZW5ndGggPSB0aGlzLmxlbmd0aFxuICAgIG9mZnNldCA9IDBcbiAgLy8gQnVmZmVyI3dyaXRlKHN0cmluZywgZW5jb2RpbmcpXG4gIH0gZWxzZSBpZiAobGVuZ3RoID09PSB1bmRlZmluZWQgJiYgdHlwZW9mIG9mZnNldCA9PT0gJ3N0cmluZycpIHtcbiAgICBlbmNvZGluZyA9IG9mZnNldFxuICAgIGxlbmd0aCA9IHRoaXMubGVuZ3RoXG4gICAgb2Zmc2V0ID0gMFxuICAvLyBCdWZmZXIjd3JpdGUoc3RyaW5nLCBvZmZzZXRbLCBsZW5ndGhdWywgZW5jb2RpbmddKVxuICB9IGVsc2UgaWYgKGlzRmluaXRlKG9mZnNldCkpIHtcbiAgICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gICAgaWYgKGlzRmluaXRlKGxlbmd0aCkpIHtcbiAgICAgIGxlbmd0aCA9IGxlbmd0aCB8IDBcbiAgICAgIGlmIChlbmNvZGluZyA9PT0gdW5kZWZpbmVkKSBlbmNvZGluZyA9ICd1dGY4J1xuICAgIH0gZWxzZSB7XG4gICAgICBlbmNvZGluZyA9IGxlbmd0aFxuICAgICAgbGVuZ3RoID0gdW5kZWZpbmVkXG4gICAgfVxuICAvLyBsZWdhY3kgd3JpdGUoc3RyaW5nLCBlbmNvZGluZywgb2Zmc2V0LCBsZW5ndGgpIC0gcmVtb3ZlIGluIHYwLjEzXG4gIH0gZWxzZSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgJ0J1ZmZlci53cml0ZShzdHJpbmcsIGVuY29kaW5nLCBvZmZzZXRbLCBsZW5ndGhdKSBpcyBubyBsb25nZXIgc3VwcG9ydGVkJ1xuICAgIClcbiAgfVxuXG4gIHZhciByZW1haW5pbmcgPSB0aGlzLmxlbmd0aCAtIG9mZnNldFxuICBpZiAobGVuZ3RoID09PSB1bmRlZmluZWQgfHwgbGVuZ3RoID4gcmVtYWluaW5nKSBsZW5ndGggPSByZW1haW5pbmdcblxuICBpZiAoKHN0cmluZy5sZW5ndGggPiAwICYmIChsZW5ndGggPCAwIHx8IG9mZnNldCA8IDApKSB8fCBvZmZzZXQgPiB0aGlzLmxlbmd0aCkge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdBdHRlbXB0IHRvIHdyaXRlIG91dHNpZGUgYnVmZmVyIGJvdW5kcycpXG4gIH1cblxuICBpZiAoIWVuY29kaW5nKSBlbmNvZGluZyA9ICd1dGY4J1xuXG4gIHZhciBsb3dlcmVkQ2FzZSA9IGZhbHNlXG4gIGZvciAoOzspIHtcbiAgICBzd2l0Y2ggKGVuY29kaW5nKSB7XG4gICAgICBjYXNlICdoZXgnOlxuICAgICAgICByZXR1cm4gaGV4V3JpdGUodGhpcywgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aClcblxuICAgICAgY2FzZSAndXRmOCc6XG4gICAgICBjYXNlICd1dGYtOCc6XG4gICAgICAgIHJldHVybiB1dGY4V3JpdGUodGhpcywgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aClcblxuICAgICAgY2FzZSAnYXNjaWknOlxuICAgICAgICByZXR1cm4gYXNjaWlXcml0ZSh0aGlzLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKVxuXG4gICAgICBjYXNlICdsYXRpbjEnOlxuICAgICAgY2FzZSAnYmluYXJ5JzpcbiAgICAgICAgcmV0dXJuIGxhdGluMVdyaXRlKHRoaXMsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpXG5cbiAgICAgIGNhc2UgJ2Jhc2U2NCc6XG4gICAgICAgIC8vIFdhcm5pbmc6IG1heExlbmd0aCBub3QgdGFrZW4gaW50byBhY2NvdW50IGluIGJhc2U2NFdyaXRlXG4gICAgICAgIHJldHVybiBiYXNlNjRXcml0ZSh0aGlzLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKVxuXG4gICAgICBjYXNlICd1Y3MyJzpcbiAgICAgIGNhc2UgJ3Vjcy0yJzpcbiAgICAgIGNhc2UgJ3V0ZjE2bGUnOlxuICAgICAgY2FzZSAndXRmLTE2bGUnOlxuICAgICAgICByZXR1cm4gdWNzMldyaXRlKHRoaXMsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpXG5cbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGlmIChsb3dlcmVkQ2FzZSkgdGhyb3cgbmV3IFR5cGVFcnJvcignVW5rbm93biBlbmNvZGluZzogJyArIGVuY29kaW5nKVxuICAgICAgICBlbmNvZGluZyA9ICgnJyArIGVuY29kaW5nKS50b0xvd2VyQ2FzZSgpXG4gICAgICAgIGxvd2VyZWRDYXNlID0gdHJ1ZVxuICAgIH1cbiAgfVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnRvSlNPTiA9IGZ1bmN0aW9uIHRvSlNPTiAoKSB7XG4gIHJldHVybiB7XG4gICAgdHlwZTogJ0J1ZmZlcicsXG4gICAgZGF0YTogQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwodGhpcy5fYXJyIHx8IHRoaXMsIDApXG4gIH1cbn1cblxuZnVuY3Rpb24gYmFzZTY0U2xpY2UgKGJ1Ziwgc3RhcnQsIGVuZCkge1xuICBpZiAoc3RhcnQgPT09IDAgJiYgZW5kID09PSBidWYubGVuZ3RoKSB7XG4gICAgcmV0dXJuIGJhc2U2NC5mcm9tQnl0ZUFycmF5KGJ1ZilcbiAgfSBlbHNlIHtcbiAgICByZXR1cm4gYmFzZTY0LmZyb21CeXRlQXJyYXkoYnVmLnNsaWNlKHN0YXJ0LCBlbmQpKVxuICB9XG59XG5cbmZ1bmN0aW9uIHV0ZjhTbGljZSAoYnVmLCBzdGFydCwgZW5kKSB7XG4gIGVuZCA9IE1hdGgubWluKGJ1Zi5sZW5ndGgsIGVuZClcbiAgdmFyIHJlcyA9IFtdXG5cbiAgdmFyIGkgPSBzdGFydFxuICB3aGlsZSAoaSA8IGVuZCkge1xuICAgIHZhciBmaXJzdEJ5dGUgPSBidWZbaV1cbiAgICB2YXIgY29kZVBvaW50ID0gbnVsbFxuICAgIHZhciBieXRlc1BlclNlcXVlbmNlID0gKGZpcnN0Qnl0ZSA+IDB4RUYpID8gNFxuICAgICAgOiAoZmlyc3RCeXRlID4gMHhERikgPyAzXG4gICAgICA6IChmaXJzdEJ5dGUgPiAweEJGKSA/IDJcbiAgICAgIDogMVxuXG4gICAgaWYgKGkgKyBieXRlc1BlclNlcXVlbmNlIDw9IGVuZCkge1xuICAgICAgdmFyIHNlY29uZEJ5dGUsIHRoaXJkQnl0ZSwgZm91cnRoQnl0ZSwgdGVtcENvZGVQb2ludFxuXG4gICAgICBzd2l0Y2ggKGJ5dGVzUGVyU2VxdWVuY2UpIHtcbiAgICAgICAgY2FzZSAxOlxuICAgICAgICAgIGlmIChmaXJzdEJ5dGUgPCAweDgwKSB7XG4gICAgICAgICAgICBjb2RlUG9pbnQgPSBmaXJzdEJ5dGVcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgY2FzZSAyOlxuICAgICAgICAgIHNlY29uZEJ5dGUgPSBidWZbaSArIDFdXG4gICAgICAgICAgaWYgKChzZWNvbmRCeXRlICYgMHhDMCkgPT09IDB4ODApIHtcbiAgICAgICAgICAgIHRlbXBDb2RlUG9pbnQgPSAoZmlyc3RCeXRlICYgMHgxRikgPDwgMHg2IHwgKHNlY29uZEJ5dGUgJiAweDNGKVxuICAgICAgICAgICAgaWYgKHRlbXBDb2RlUG9pbnQgPiAweDdGKSB7XG4gICAgICAgICAgICAgIGNvZGVQb2ludCA9IHRlbXBDb2RlUG9pbnRcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgY2FzZSAzOlxuICAgICAgICAgIHNlY29uZEJ5dGUgPSBidWZbaSArIDFdXG4gICAgICAgICAgdGhpcmRCeXRlID0gYnVmW2kgKyAyXVxuICAgICAgICAgIGlmICgoc2Vjb25kQnl0ZSAmIDB4QzApID09PSAweDgwICYmICh0aGlyZEJ5dGUgJiAweEMwKSA9PT0gMHg4MCkge1xuICAgICAgICAgICAgdGVtcENvZGVQb2ludCA9IChmaXJzdEJ5dGUgJiAweEYpIDw8IDB4QyB8IChzZWNvbmRCeXRlICYgMHgzRikgPDwgMHg2IHwgKHRoaXJkQnl0ZSAmIDB4M0YpXG4gICAgICAgICAgICBpZiAodGVtcENvZGVQb2ludCA+IDB4N0ZGICYmICh0ZW1wQ29kZVBvaW50IDwgMHhEODAwIHx8IHRlbXBDb2RlUG9pbnQgPiAweERGRkYpKSB7XG4gICAgICAgICAgICAgIGNvZGVQb2ludCA9IHRlbXBDb2RlUG9pbnRcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgY2FzZSA0OlxuICAgICAgICAgIHNlY29uZEJ5dGUgPSBidWZbaSArIDFdXG4gICAgICAgICAgdGhpcmRCeXRlID0gYnVmW2kgKyAyXVxuICAgICAgICAgIGZvdXJ0aEJ5dGUgPSBidWZbaSArIDNdXG4gICAgICAgICAgaWYgKChzZWNvbmRCeXRlICYgMHhDMCkgPT09IDB4ODAgJiYgKHRoaXJkQnl0ZSAmIDB4QzApID09PSAweDgwICYmIChmb3VydGhCeXRlICYgMHhDMCkgPT09IDB4ODApIHtcbiAgICAgICAgICAgIHRlbXBDb2RlUG9pbnQgPSAoZmlyc3RCeXRlICYgMHhGKSA8PCAweDEyIHwgKHNlY29uZEJ5dGUgJiAweDNGKSA8PCAweEMgfCAodGhpcmRCeXRlICYgMHgzRikgPDwgMHg2IHwgKGZvdXJ0aEJ5dGUgJiAweDNGKVxuICAgICAgICAgICAgaWYgKHRlbXBDb2RlUG9pbnQgPiAweEZGRkYgJiYgdGVtcENvZGVQb2ludCA8IDB4MTEwMDAwKSB7XG4gICAgICAgICAgICAgIGNvZGVQb2ludCA9IHRlbXBDb2RlUG9pbnRcbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGNvZGVQb2ludCA9PT0gbnVsbCkge1xuICAgICAgLy8gd2UgZGlkIG5vdCBnZW5lcmF0ZSBhIHZhbGlkIGNvZGVQb2ludCBzbyBpbnNlcnQgYVxuICAgICAgLy8gcmVwbGFjZW1lbnQgY2hhciAoVStGRkZEKSBhbmQgYWR2YW5jZSBvbmx5IDEgYnl0ZVxuICAgICAgY29kZVBvaW50ID0gMHhGRkZEXG4gICAgICBieXRlc1BlclNlcXVlbmNlID0gMVxuICAgIH0gZWxzZSBpZiAoY29kZVBvaW50ID4gMHhGRkZGKSB7XG4gICAgICAvLyBlbmNvZGUgdG8gdXRmMTYgKHN1cnJvZ2F0ZSBwYWlyIGRhbmNlKVxuICAgICAgY29kZVBvaW50IC09IDB4MTAwMDBcbiAgICAgIHJlcy5wdXNoKGNvZGVQb2ludCA+Pj4gMTAgJiAweDNGRiB8IDB4RDgwMClcbiAgICAgIGNvZGVQb2ludCA9IDB4REMwMCB8IGNvZGVQb2ludCAmIDB4M0ZGXG4gICAgfVxuXG4gICAgcmVzLnB1c2goY29kZVBvaW50KVxuICAgIGkgKz0gYnl0ZXNQZXJTZXF1ZW5jZVxuICB9XG5cbiAgcmV0dXJuIGRlY29kZUNvZGVQb2ludHNBcnJheShyZXMpXG59XG5cbi8vIEJhc2VkIG9uIGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9hLzIyNzQ3MjcyLzY4MDc0MiwgdGhlIGJyb3dzZXIgd2l0aFxuLy8gdGhlIGxvd2VzdCBsaW1pdCBpcyBDaHJvbWUsIHdpdGggMHgxMDAwMCBhcmdzLlxuLy8gV2UgZ28gMSBtYWduaXR1ZGUgbGVzcywgZm9yIHNhZmV0eVxudmFyIE1BWF9BUkdVTUVOVFNfTEVOR1RIID0gMHgxMDAwXG5cbmZ1bmN0aW9uIGRlY29kZUNvZGVQb2ludHNBcnJheSAoY29kZVBvaW50cykge1xuICB2YXIgbGVuID0gY29kZVBvaW50cy5sZW5ndGhcbiAgaWYgKGxlbiA8PSBNQVhfQVJHVU1FTlRTX0xFTkdUSCkge1xuICAgIHJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KFN0cmluZywgY29kZVBvaW50cykgLy8gYXZvaWQgZXh0cmEgc2xpY2UoKVxuICB9XG5cbiAgLy8gRGVjb2RlIGluIGNodW5rcyB0byBhdm9pZCBcImNhbGwgc3RhY2sgc2l6ZSBleGNlZWRlZFwiLlxuICB2YXIgcmVzID0gJydcbiAgdmFyIGkgPSAwXG4gIHdoaWxlIChpIDwgbGVuKSB7XG4gICAgcmVzICs9IFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkoXG4gICAgICBTdHJpbmcsXG4gICAgICBjb2RlUG9pbnRzLnNsaWNlKGksIGkgKz0gTUFYX0FSR1VNRU5UU19MRU5HVEgpXG4gICAgKVxuICB9XG4gIHJldHVybiByZXNcbn1cblxuZnVuY3Rpb24gYXNjaWlTbGljZSAoYnVmLCBzdGFydCwgZW5kKSB7XG4gIHZhciByZXQgPSAnJ1xuICBlbmQgPSBNYXRoLm1pbihidWYubGVuZ3RoLCBlbmQpXG5cbiAgZm9yICh2YXIgaSA9IHN0YXJ0OyBpIDwgZW5kOyArK2kpIHtcbiAgICByZXQgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShidWZbaV0gJiAweDdGKVxuICB9XG4gIHJldHVybiByZXRcbn1cblxuZnVuY3Rpb24gbGF0aW4xU2xpY2UgKGJ1Ziwgc3RhcnQsIGVuZCkge1xuICB2YXIgcmV0ID0gJydcbiAgZW5kID0gTWF0aC5taW4oYnVmLmxlbmd0aCwgZW5kKVxuXG4gIGZvciAodmFyIGkgPSBzdGFydDsgaSA8IGVuZDsgKytpKSB7XG4gICAgcmV0ICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoYnVmW2ldKVxuICB9XG4gIHJldHVybiByZXRcbn1cblxuZnVuY3Rpb24gaGV4U2xpY2UgKGJ1Ziwgc3RhcnQsIGVuZCkge1xuICB2YXIgbGVuID0gYnVmLmxlbmd0aFxuXG4gIGlmICghc3RhcnQgfHwgc3RhcnQgPCAwKSBzdGFydCA9IDBcbiAgaWYgKCFlbmQgfHwgZW5kIDwgMCB8fCBlbmQgPiBsZW4pIGVuZCA9IGxlblxuXG4gIHZhciBvdXQgPSAnJ1xuICBmb3IgKHZhciBpID0gc3RhcnQ7IGkgPCBlbmQ7ICsraSkge1xuICAgIG91dCArPSB0b0hleChidWZbaV0pXG4gIH1cbiAgcmV0dXJuIG91dFxufVxuXG5mdW5jdGlvbiB1dGYxNmxlU2xpY2UgKGJ1Ziwgc3RhcnQsIGVuZCkge1xuICB2YXIgYnl0ZXMgPSBidWYuc2xpY2Uoc3RhcnQsIGVuZClcbiAgdmFyIHJlcyA9ICcnXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgYnl0ZXMubGVuZ3RoOyBpICs9IDIpIHtcbiAgICByZXMgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShieXRlc1tpXSArIGJ5dGVzW2kgKyAxXSAqIDI1NilcbiAgfVxuICByZXR1cm4gcmVzXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUuc2xpY2UgPSBmdW5jdGlvbiBzbGljZSAoc3RhcnQsIGVuZCkge1xuICB2YXIgbGVuID0gdGhpcy5sZW5ndGhcbiAgc3RhcnQgPSB+fnN0YXJ0XG4gIGVuZCA9IGVuZCA9PT0gdW5kZWZpbmVkID8gbGVuIDogfn5lbmRcblxuICBpZiAoc3RhcnQgPCAwKSB7XG4gICAgc3RhcnQgKz0gbGVuXG4gICAgaWYgKHN0YXJ0IDwgMCkgc3RhcnQgPSAwXG4gIH0gZWxzZSBpZiAoc3RhcnQgPiBsZW4pIHtcbiAgICBzdGFydCA9IGxlblxuICB9XG5cbiAgaWYgKGVuZCA8IDApIHtcbiAgICBlbmQgKz0gbGVuXG4gICAgaWYgKGVuZCA8IDApIGVuZCA9IDBcbiAgfSBlbHNlIGlmIChlbmQgPiBsZW4pIHtcbiAgICBlbmQgPSBsZW5cbiAgfVxuXG4gIGlmIChlbmQgPCBzdGFydCkgZW5kID0gc3RhcnRcblxuICB2YXIgbmV3QnVmXG4gIGlmIChCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCkge1xuICAgIG5ld0J1ZiA9IHRoaXMuc3ViYXJyYXkoc3RhcnQsIGVuZClcbiAgICBuZXdCdWYuX19wcm90b19fID0gQnVmZmVyLnByb3RvdHlwZVxuICB9IGVsc2Uge1xuICAgIHZhciBzbGljZUxlbiA9IGVuZCAtIHN0YXJ0XG4gICAgbmV3QnVmID0gbmV3IEJ1ZmZlcihzbGljZUxlbiwgdW5kZWZpbmVkKVxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgc2xpY2VMZW47ICsraSkge1xuICAgICAgbmV3QnVmW2ldID0gdGhpc1tpICsgc3RhcnRdXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG5ld0J1ZlxufVxuXG4vKlxuICogTmVlZCB0byBtYWtlIHN1cmUgdGhhdCBidWZmZXIgaXNuJ3QgdHJ5aW5nIHRvIHdyaXRlIG91dCBvZiBib3VuZHMuXG4gKi9cbmZ1bmN0aW9uIGNoZWNrT2Zmc2V0IChvZmZzZXQsIGV4dCwgbGVuZ3RoKSB7XG4gIGlmICgob2Zmc2V0ICUgMSkgIT09IDAgfHwgb2Zmc2V0IDwgMCkgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ29mZnNldCBpcyBub3QgdWludCcpXG4gIGlmIChvZmZzZXQgKyBleHQgPiBsZW5ndGgpIHRocm93IG5ldyBSYW5nZUVycm9yKCdUcnlpbmcgdG8gYWNjZXNzIGJleW9uZCBidWZmZXIgbGVuZ3RoJylcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkVUludExFID0gZnVuY3Rpb24gcmVhZFVJbnRMRSAob2Zmc2V0LCBieXRlTGVuZ3RoLCBub0Fzc2VydCkge1xuICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gIGJ5dGVMZW5ndGggPSBieXRlTGVuZ3RoIHwgMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIGJ5dGVMZW5ndGgsIHRoaXMubGVuZ3RoKVxuXG4gIHZhciB2YWwgPSB0aGlzW29mZnNldF1cbiAgdmFyIG11bCA9IDFcbiAgdmFyIGkgPSAwXG4gIHdoaWxlICgrK2kgPCBieXRlTGVuZ3RoICYmIChtdWwgKj0gMHgxMDApKSB7XG4gICAgdmFsICs9IHRoaXNbb2Zmc2V0ICsgaV0gKiBtdWxcbiAgfVxuXG4gIHJldHVybiB2YWxcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkVUludEJFID0gZnVuY3Rpb24gcmVhZFVJbnRCRSAob2Zmc2V0LCBieXRlTGVuZ3RoLCBub0Fzc2VydCkge1xuICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gIGJ5dGVMZW5ndGggPSBieXRlTGVuZ3RoIHwgMFxuICBpZiAoIW5vQXNzZXJ0KSB7XG4gICAgY2hlY2tPZmZzZXQob2Zmc2V0LCBieXRlTGVuZ3RoLCB0aGlzLmxlbmd0aClcbiAgfVxuXG4gIHZhciB2YWwgPSB0aGlzW29mZnNldCArIC0tYnl0ZUxlbmd0aF1cbiAgdmFyIG11bCA9IDFcbiAgd2hpbGUgKGJ5dGVMZW5ndGggPiAwICYmIChtdWwgKj0gMHgxMDApKSB7XG4gICAgdmFsICs9IHRoaXNbb2Zmc2V0ICsgLS1ieXRlTGVuZ3RoXSAqIG11bFxuICB9XG5cbiAgcmV0dXJuIHZhbFxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRVSW50OCA9IGZ1bmN0aW9uIHJlYWRVSW50OCAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDEsIHRoaXMubGVuZ3RoKVxuICByZXR1cm4gdGhpc1tvZmZzZXRdXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZFVJbnQxNkxFID0gZnVuY3Rpb24gcmVhZFVJbnQxNkxFIChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgMiwgdGhpcy5sZW5ndGgpXG4gIHJldHVybiB0aGlzW29mZnNldF0gfCAodGhpc1tvZmZzZXQgKyAxXSA8PCA4KVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRVSW50MTZCRSA9IGZ1bmN0aW9uIHJlYWRVSW50MTZCRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDIsIHRoaXMubGVuZ3RoKVxuICByZXR1cm4gKHRoaXNbb2Zmc2V0XSA8PCA4KSB8IHRoaXNbb2Zmc2V0ICsgMV1cbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkVUludDMyTEUgPSBmdW5jdGlvbiByZWFkVUludDMyTEUgKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCA0LCB0aGlzLmxlbmd0aClcblxuICByZXR1cm4gKCh0aGlzW29mZnNldF0pIHxcbiAgICAgICh0aGlzW29mZnNldCArIDFdIDw8IDgpIHxcbiAgICAgICh0aGlzW29mZnNldCArIDJdIDw8IDE2KSkgK1xuICAgICAgKHRoaXNbb2Zmc2V0ICsgM10gKiAweDEwMDAwMDApXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZFVJbnQzMkJFID0gZnVuY3Rpb24gcmVhZFVJbnQzMkJFIChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgNCwgdGhpcy5sZW5ndGgpXG5cbiAgcmV0dXJuICh0aGlzW29mZnNldF0gKiAweDEwMDAwMDApICtcbiAgICAoKHRoaXNbb2Zmc2V0ICsgMV0gPDwgMTYpIHxcbiAgICAodGhpc1tvZmZzZXQgKyAyXSA8PCA4KSB8XG4gICAgdGhpc1tvZmZzZXQgKyAzXSlcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkSW50TEUgPSBmdW5jdGlvbiByZWFkSW50TEUgKG9mZnNldCwgYnl0ZUxlbmd0aCwgbm9Bc3NlcnQpIHtcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICBieXRlTGVuZ3RoID0gYnl0ZUxlbmd0aCB8IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCBieXRlTGVuZ3RoLCB0aGlzLmxlbmd0aClcblxuICB2YXIgdmFsID0gdGhpc1tvZmZzZXRdXG4gIHZhciBtdWwgPSAxXG4gIHZhciBpID0gMFxuICB3aGlsZSAoKytpIDwgYnl0ZUxlbmd0aCAmJiAobXVsICo9IDB4MTAwKSkge1xuICAgIHZhbCArPSB0aGlzW29mZnNldCArIGldICogbXVsXG4gIH1cbiAgbXVsICo9IDB4ODBcblxuICBpZiAodmFsID49IG11bCkgdmFsIC09IE1hdGgucG93KDIsIDggKiBieXRlTGVuZ3RoKVxuXG4gIHJldHVybiB2YWxcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkSW50QkUgPSBmdW5jdGlvbiByZWFkSW50QkUgKG9mZnNldCwgYnl0ZUxlbmd0aCwgbm9Bc3NlcnQpIHtcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICBieXRlTGVuZ3RoID0gYnl0ZUxlbmd0aCB8IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCBieXRlTGVuZ3RoLCB0aGlzLmxlbmd0aClcblxuICB2YXIgaSA9IGJ5dGVMZW5ndGhcbiAgdmFyIG11bCA9IDFcbiAgdmFyIHZhbCA9IHRoaXNbb2Zmc2V0ICsgLS1pXVxuICB3aGlsZSAoaSA+IDAgJiYgKG11bCAqPSAweDEwMCkpIHtcbiAgICB2YWwgKz0gdGhpc1tvZmZzZXQgKyAtLWldICogbXVsXG4gIH1cbiAgbXVsICo9IDB4ODBcblxuICBpZiAodmFsID49IG11bCkgdmFsIC09IE1hdGgucG93KDIsIDggKiBieXRlTGVuZ3RoKVxuXG4gIHJldHVybiB2YWxcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkSW50OCA9IGZ1bmN0aW9uIHJlYWRJbnQ4IChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgMSwgdGhpcy5sZW5ndGgpXG4gIGlmICghKHRoaXNbb2Zmc2V0XSAmIDB4ODApKSByZXR1cm4gKHRoaXNbb2Zmc2V0XSlcbiAgcmV0dXJuICgoMHhmZiAtIHRoaXNbb2Zmc2V0XSArIDEpICogLTEpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZEludDE2TEUgPSBmdW5jdGlvbiByZWFkSW50MTZMRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDIsIHRoaXMubGVuZ3RoKVxuICB2YXIgdmFsID0gdGhpc1tvZmZzZXRdIHwgKHRoaXNbb2Zmc2V0ICsgMV0gPDwgOClcbiAgcmV0dXJuICh2YWwgJiAweDgwMDApID8gdmFsIHwgMHhGRkZGMDAwMCA6IHZhbFxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRJbnQxNkJFID0gZnVuY3Rpb24gcmVhZEludDE2QkUgKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCAyLCB0aGlzLmxlbmd0aClcbiAgdmFyIHZhbCA9IHRoaXNbb2Zmc2V0ICsgMV0gfCAodGhpc1tvZmZzZXRdIDw8IDgpXG4gIHJldHVybiAodmFsICYgMHg4MDAwKSA/IHZhbCB8IDB4RkZGRjAwMDAgOiB2YWxcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkSW50MzJMRSA9IGZ1bmN0aW9uIHJlYWRJbnQzMkxFIChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgNCwgdGhpcy5sZW5ndGgpXG5cbiAgcmV0dXJuICh0aGlzW29mZnNldF0pIHxcbiAgICAodGhpc1tvZmZzZXQgKyAxXSA8PCA4KSB8XG4gICAgKHRoaXNbb2Zmc2V0ICsgMl0gPDwgMTYpIHxcbiAgICAodGhpc1tvZmZzZXQgKyAzXSA8PCAyNClcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkSW50MzJCRSA9IGZ1bmN0aW9uIHJlYWRJbnQzMkJFIChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgNCwgdGhpcy5sZW5ndGgpXG5cbiAgcmV0dXJuICh0aGlzW29mZnNldF0gPDwgMjQpIHxcbiAgICAodGhpc1tvZmZzZXQgKyAxXSA8PCAxNikgfFxuICAgICh0aGlzW29mZnNldCArIDJdIDw8IDgpIHxcbiAgICAodGhpc1tvZmZzZXQgKyAzXSlcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkRmxvYXRMRSA9IGZ1bmN0aW9uIHJlYWRGbG9hdExFIChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgNCwgdGhpcy5sZW5ndGgpXG4gIHJldHVybiBpZWVlNzU0LnJlYWQodGhpcywgb2Zmc2V0LCB0cnVlLCAyMywgNClcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkRmxvYXRCRSA9IGZ1bmN0aW9uIHJlYWRGbG9hdEJFIChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgNCwgdGhpcy5sZW5ndGgpXG4gIHJldHVybiBpZWVlNzU0LnJlYWQodGhpcywgb2Zmc2V0LCBmYWxzZSwgMjMsIDQpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZERvdWJsZUxFID0gZnVuY3Rpb24gcmVhZERvdWJsZUxFIChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgOCwgdGhpcy5sZW5ndGgpXG4gIHJldHVybiBpZWVlNzU0LnJlYWQodGhpcywgb2Zmc2V0LCB0cnVlLCA1MiwgOClcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkRG91YmxlQkUgPSBmdW5jdGlvbiByZWFkRG91YmxlQkUgKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCA4LCB0aGlzLmxlbmd0aClcbiAgcmV0dXJuIGllZWU3NTQucmVhZCh0aGlzLCBvZmZzZXQsIGZhbHNlLCA1MiwgOClcbn1cblxuZnVuY3Rpb24gY2hlY2tJbnQgKGJ1ZiwgdmFsdWUsIG9mZnNldCwgZXh0LCBtYXgsIG1pbikge1xuICBpZiAoIUJ1ZmZlci5pc0J1ZmZlcihidWYpKSB0aHJvdyBuZXcgVHlwZUVycm9yKCdcImJ1ZmZlclwiIGFyZ3VtZW50IG11c3QgYmUgYSBCdWZmZXIgaW5zdGFuY2UnKVxuICBpZiAodmFsdWUgPiBtYXggfHwgdmFsdWUgPCBtaW4pIHRocm93IG5ldyBSYW5nZUVycm9yKCdcInZhbHVlXCIgYXJndW1lbnQgaXMgb3V0IG9mIGJvdW5kcycpXG4gIGlmIChvZmZzZXQgKyBleHQgPiBidWYubGVuZ3RoKSB0aHJvdyBuZXcgUmFuZ2VFcnJvcignSW5kZXggb3V0IG9mIHJhbmdlJylcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZVVJbnRMRSA9IGZ1bmN0aW9uIHdyaXRlVUludExFICh2YWx1ZSwgb2Zmc2V0LCBieXRlTGVuZ3RoLCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gIGJ5dGVMZW5ndGggPSBieXRlTGVuZ3RoIHwgMFxuICBpZiAoIW5vQXNzZXJ0KSB7XG4gICAgdmFyIG1heEJ5dGVzID0gTWF0aC5wb3coMiwgOCAqIGJ5dGVMZW5ndGgpIC0gMVxuICAgIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIGJ5dGVMZW5ndGgsIG1heEJ5dGVzLCAwKVxuICB9XG5cbiAgdmFyIG11bCA9IDFcbiAgdmFyIGkgPSAwXG4gIHRoaXNbb2Zmc2V0XSA9IHZhbHVlICYgMHhGRlxuICB3aGlsZSAoKytpIDwgYnl0ZUxlbmd0aCAmJiAobXVsICo9IDB4MTAwKSkge1xuICAgIHRoaXNbb2Zmc2V0ICsgaV0gPSAodmFsdWUgLyBtdWwpICYgMHhGRlxuICB9XG5cbiAgcmV0dXJuIG9mZnNldCArIGJ5dGVMZW5ndGhcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZVVJbnRCRSA9IGZ1bmN0aW9uIHdyaXRlVUludEJFICh2YWx1ZSwgb2Zmc2V0LCBieXRlTGVuZ3RoLCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gIGJ5dGVMZW5ndGggPSBieXRlTGVuZ3RoIHwgMFxuICBpZiAoIW5vQXNzZXJ0KSB7XG4gICAgdmFyIG1heEJ5dGVzID0gTWF0aC5wb3coMiwgOCAqIGJ5dGVMZW5ndGgpIC0gMVxuICAgIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIGJ5dGVMZW5ndGgsIG1heEJ5dGVzLCAwKVxuICB9XG5cbiAgdmFyIGkgPSBieXRlTGVuZ3RoIC0gMVxuICB2YXIgbXVsID0gMVxuICB0aGlzW29mZnNldCArIGldID0gdmFsdWUgJiAweEZGXG4gIHdoaWxlICgtLWkgPj0gMCAmJiAobXVsICo9IDB4MTAwKSkge1xuICAgIHRoaXNbb2Zmc2V0ICsgaV0gPSAodmFsdWUgLyBtdWwpICYgMHhGRlxuICB9XG5cbiAgcmV0dXJuIG9mZnNldCArIGJ5dGVMZW5ndGhcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZVVJbnQ4ID0gZnVuY3Rpb24gd3JpdGVVSW50OCAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCAxLCAweGZmLCAwKVxuICBpZiAoIUJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB2YWx1ZSA9IE1hdGguZmxvb3IodmFsdWUpXG4gIHRoaXNbb2Zmc2V0XSA9ICh2YWx1ZSAmIDB4ZmYpXG4gIHJldHVybiBvZmZzZXQgKyAxXG59XG5cbmZ1bmN0aW9uIG9iamVjdFdyaXRlVUludDE2IChidWYsIHZhbHVlLCBvZmZzZXQsIGxpdHRsZUVuZGlhbikge1xuICBpZiAodmFsdWUgPCAwKSB2YWx1ZSA9IDB4ZmZmZiArIHZhbHVlICsgMVxuICBmb3IgKHZhciBpID0gMCwgaiA9IE1hdGgubWluKGJ1Zi5sZW5ndGggLSBvZmZzZXQsIDIpOyBpIDwgajsgKytpKSB7XG4gICAgYnVmW29mZnNldCArIGldID0gKHZhbHVlICYgKDB4ZmYgPDwgKDggKiAobGl0dGxlRW5kaWFuID8gaSA6IDEgLSBpKSkpKSA+Pj5cbiAgICAgIChsaXR0bGVFbmRpYW4gPyBpIDogMSAtIGkpICogOFxuICB9XG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVVSW50MTZMRSA9IGZ1bmN0aW9uIHdyaXRlVUludDE2TEUgKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgMiwgMHhmZmZmLCAwKVxuICBpZiAoQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHtcbiAgICB0aGlzW29mZnNldF0gPSAodmFsdWUgJiAweGZmKVxuICAgIHRoaXNbb2Zmc2V0ICsgMV0gPSAodmFsdWUgPj4+IDgpXG4gIH0gZWxzZSB7XG4gICAgb2JqZWN0V3JpdGVVSW50MTYodGhpcywgdmFsdWUsIG9mZnNldCwgdHJ1ZSlcbiAgfVxuICByZXR1cm4gb2Zmc2V0ICsgMlxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlVUludDE2QkUgPSBmdW5jdGlvbiB3cml0ZVVJbnQxNkJFICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIDIsIDB4ZmZmZiwgMClcbiAgaWYgKEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB7XG4gICAgdGhpc1tvZmZzZXRdID0gKHZhbHVlID4+PiA4KVxuICAgIHRoaXNbb2Zmc2V0ICsgMV0gPSAodmFsdWUgJiAweGZmKVxuICB9IGVsc2Uge1xuICAgIG9iamVjdFdyaXRlVUludDE2KHRoaXMsIHZhbHVlLCBvZmZzZXQsIGZhbHNlKVxuICB9XG4gIHJldHVybiBvZmZzZXQgKyAyXG59XG5cbmZ1bmN0aW9uIG9iamVjdFdyaXRlVUludDMyIChidWYsIHZhbHVlLCBvZmZzZXQsIGxpdHRsZUVuZGlhbikge1xuICBpZiAodmFsdWUgPCAwKSB2YWx1ZSA9IDB4ZmZmZmZmZmYgKyB2YWx1ZSArIDFcbiAgZm9yICh2YXIgaSA9IDAsIGogPSBNYXRoLm1pbihidWYubGVuZ3RoIC0gb2Zmc2V0LCA0KTsgaSA8IGo7ICsraSkge1xuICAgIGJ1ZltvZmZzZXQgKyBpXSA9ICh2YWx1ZSA+Pj4gKGxpdHRsZUVuZGlhbiA/IGkgOiAzIC0gaSkgKiA4KSAmIDB4ZmZcbiAgfVxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlVUludDMyTEUgPSBmdW5jdGlvbiB3cml0ZVVJbnQzMkxFICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIDQsIDB4ZmZmZmZmZmYsIDApXG4gIGlmIChCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCkge1xuICAgIHRoaXNbb2Zmc2V0ICsgM10gPSAodmFsdWUgPj4+IDI0KVxuICAgIHRoaXNbb2Zmc2V0ICsgMl0gPSAodmFsdWUgPj4+IDE2KVxuICAgIHRoaXNbb2Zmc2V0ICsgMV0gPSAodmFsdWUgPj4+IDgpXG4gICAgdGhpc1tvZmZzZXRdID0gKHZhbHVlICYgMHhmZilcbiAgfSBlbHNlIHtcbiAgICBvYmplY3RXcml0ZVVJbnQzMih0aGlzLCB2YWx1ZSwgb2Zmc2V0LCB0cnVlKVxuICB9XG4gIHJldHVybiBvZmZzZXQgKyA0XG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVVSW50MzJCRSA9IGZ1bmN0aW9uIHdyaXRlVUludDMyQkUgKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgNCwgMHhmZmZmZmZmZiwgMClcbiAgaWYgKEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB7XG4gICAgdGhpc1tvZmZzZXRdID0gKHZhbHVlID4+PiAyNClcbiAgICB0aGlzW29mZnNldCArIDFdID0gKHZhbHVlID4+PiAxNilcbiAgICB0aGlzW29mZnNldCArIDJdID0gKHZhbHVlID4+PiA4KVxuICAgIHRoaXNbb2Zmc2V0ICsgM10gPSAodmFsdWUgJiAweGZmKVxuICB9IGVsc2Uge1xuICAgIG9iamVjdFdyaXRlVUludDMyKHRoaXMsIHZhbHVlLCBvZmZzZXQsIGZhbHNlKVxuICB9XG4gIHJldHVybiBvZmZzZXQgKyA0XG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVJbnRMRSA9IGZ1bmN0aW9uIHdyaXRlSW50TEUgKHZhbHVlLCBvZmZzZXQsIGJ5dGVMZW5ndGgsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgaWYgKCFub0Fzc2VydCkge1xuICAgIHZhciBsaW1pdCA9IE1hdGgucG93KDIsIDggKiBieXRlTGVuZ3RoIC0gMSlcblxuICAgIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIGJ5dGVMZW5ndGgsIGxpbWl0IC0gMSwgLWxpbWl0KVxuICB9XG5cbiAgdmFyIGkgPSAwXG4gIHZhciBtdWwgPSAxXG4gIHZhciBzdWIgPSAwXG4gIHRoaXNbb2Zmc2V0XSA9IHZhbHVlICYgMHhGRlxuICB3aGlsZSAoKytpIDwgYnl0ZUxlbmd0aCAmJiAobXVsICo9IDB4MTAwKSkge1xuICAgIGlmICh2YWx1ZSA8IDAgJiYgc3ViID09PSAwICYmIHRoaXNbb2Zmc2V0ICsgaSAtIDFdICE9PSAwKSB7XG4gICAgICBzdWIgPSAxXG4gICAgfVxuICAgIHRoaXNbb2Zmc2V0ICsgaV0gPSAoKHZhbHVlIC8gbXVsKSA+PiAwKSAtIHN1YiAmIDB4RkZcbiAgfVxuXG4gIHJldHVybiBvZmZzZXQgKyBieXRlTGVuZ3RoXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVJbnRCRSA9IGZ1bmN0aW9uIHdyaXRlSW50QkUgKHZhbHVlLCBvZmZzZXQsIGJ5dGVMZW5ndGgsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgaWYgKCFub0Fzc2VydCkge1xuICAgIHZhciBsaW1pdCA9IE1hdGgucG93KDIsIDggKiBieXRlTGVuZ3RoIC0gMSlcblxuICAgIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIGJ5dGVMZW5ndGgsIGxpbWl0IC0gMSwgLWxpbWl0KVxuICB9XG5cbiAgdmFyIGkgPSBieXRlTGVuZ3RoIC0gMVxuICB2YXIgbXVsID0gMVxuICB2YXIgc3ViID0gMFxuICB0aGlzW29mZnNldCArIGldID0gdmFsdWUgJiAweEZGXG4gIHdoaWxlICgtLWkgPj0gMCAmJiAobXVsICo9IDB4MTAwKSkge1xuICAgIGlmICh2YWx1ZSA8IDAgJiYgc3ViID09PSAwICYmIHRoaXNbb2Zmc2V0ICsgaSArIDFdICE9PSAwKSB7XG4gICAgICBzdWIgPSAxXG4gICAgfVxuICAgIHRoaXNbb2Zmc2V0ICsgaV0gPSAoKHZhbHVlIC8gbXVsKSA+PiAwKSAtIHN1YiAmIDB4RkZcbiAgfVxuXG4gIHJldHVybiBvZmZzZXQgKyBieXRlTGVuZ3RoXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVJbnQ4ID0gZnVuY3Rpb24gd3JpdGVJbnQ4ICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIDEsIDB4N2YsIC0weDgwKVxuICBpZiAoIUJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB2YWx1ZSA9IE1hdGguZmxvb3IodmFsdWUpXG4gIGlmICh2YWx1ZSA8IDApIHZhbHVlID0gMHhmZiArIHZhbHVlICsgMVxuICB0aGlzW29mZnNldF0gPSAodmFsdWUgJiAweGZmKVxuICByZXR1cm4gb2Zmc2V0ICsgMVxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlSW50MTZMRSA9IGZ1bmN0aW9uIHdyaXRlSW50MTZMRSAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCAyLCAweDdmZmYsIC0weDgwMDApXG4gIGlmIChCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCkge1xuICAgIHRoaXNbb2Zmc2V0XSA9ICh2YWx1ZSAmIDB4ZmYpXG4gICAgdGhpc1tvZmZzZXQgKyAxXSA9ICh2YWx1ZSA+Pj4gOClcbiAgfSBlbHNlIHtcbiAgICBvYmplY3RXcml0ZVVJbnQxNih0aGlzLCB2YWx1ZSwgb2Zmc2V0LCB0cnVlKVxuICB9XG4gIHJldHVybiBvZmZzZXQgKyAyXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVJbnQxNkJFID0gZnVuY3Rpb24gd3JpdGVJbnQxNkJFICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIDIsIDB4N2ZmZiwgLTB4ODAwMClcbiAgaWYgKEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB7XG4gICAgdGhpc1tvZmZzZXRdID0gKHZhbHVlID4+PiA4KVxuICAgIHRoaXNbb2Zmc2V0ICsgMV0gPSAodmFsdWUgJiAweGZmKVxuICB9IGVsc2Uge1xuICAgIG9iamVjdFdyaXRlVUludDE2KHRoaXMsIHZhbHVlLCBvZmZzZXQsIGZhbHNlKVxuICB9XG4gIHJldHVybiBvZmZzZXQgKyAyXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVJbnQzMkxFID0gZnVuY3Rpb24gd3JpdGVJbnQzMkxFICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIDQsIDB4N2ZmZmZmZmYsIC0weDgwMDAwMDAwKVxuICBpZiAoQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHtcbiAgICB0aGlzW29mZnNldF0gPSAodmFsdWUgJiAweGZmKVxuICAgIHRoaXNbb2Zmc2V0ICsgMV0gPSAodmFsdWUgPj4+IDgpXG4gICAgdGhpc1tvZmZzZXQgKyAyXSA9ICh2YWx1ZSA+Pj4gMTYpXG4gICAgdGhpc1tvZmZzZXQgKyAzXSA9ICh2YWx1ZSA+Pj4gMjQpXG4gIH0gZWxzZSB7XG4gICAgb2JqZWN0V3JpdGVVSW50MzIodGhpcywgdmFsdWUsIG9mZnNldCwgdHJ1ZSlcbiAgfVxuICByZXR1cm4gb2Zmc2V0ICsgNFxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlSW50MzJCRSA9IGZ1bmN0aW9uIHdyaXRlSW50MzJCRSAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCA0LCAweDdmZmZmZmZmLCAtMHg4MDAwMDAwMClcbiAgaWYgKHZhbHVlIDwgMCkgdmFsdWUgPSAweGZmZmZmZmZmICsgdmFsdWUgKyAxXG4gIGlmIChCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCkge1xuICAgIHRoaXNbb2Zmc2V0XSA9ICh2YWx1ZSA+Pj4gMjQpXG4gICAgdGhpc1tvZmZzZXQgKyAxXSA9ICh2YWx1ZSA+Pj4gMTYpXG4gICAgdGhpc1tvZmZzZXQgKyAyXSA9ICh2YWx1ZSA+Pj4gOClcbiAgICB0aGlzW29mZnNldCArIDNdID0gKHZhbHVlICYgMHhmZilcbiAgfSBlbHNlIHtcbiAgICBvYmplY3RXcml0ZVVJbnQzMih0aGlzLCB2YWx1ZSwgb2Zmc2V0LCBmYWxzZSlcbiAgfVxuICByZXR1cm4gb2Zmc2V0ICsgNFxufVxuXG5mdW5jdGlvbiBjaGVja0lFRUU3NTQgKGJ1ZiwgdmFsdWUsIG9mZnNldCwgZXh0LCBtYXgsIG1pbikge1xuICBpZiAob2Zmc2V0ICsgZXh0ID4gYnVmLmxlbmd0aCkgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ0luZGV4IG91dCBvZiByYW5nZScpXG4gIGlmIChvZmZzZXQgPCAwKSB0aHJvdyBuZXcgUmFuZ2VFcnJvcignSW5kZXggb3V0IG9mIHJhbmdlJylcbn1cblxuZnVuY3Rpb24gd3JpdGVGbG9hdCAoYnVmLCB2YWx1ZSwgb2Zmc2V0LCBsaXR0bGVFbmRpYW4sIG5vQXNzZXJ0KSB7XG4gIGlmICghbm9Bc3NlcnQpIHtcbiAgICBjaGVja0lFRUU3NTQoYnVmLCB2YWx1ZSwgb2Zmc2V0LCA0LCAzLjQwMjgyMzQ2NjM4NTI4ODZlKzM4LCAtMy40MDI4MjM0NjYzODUyODg2ZSszOClcbiAgfVxuICBpZWVlNzU0LndyaXRlKGJ1ZiwgdmFsdWUsIG9mZnNldCwgbGl0dGxlRW5kaWFuLCAyMywgNClcbiAgcmV0dXJuIG9mZnNldCArIDRcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZUZsb2F0TEUgPSBmdW5jdGlvbiB3cml0ZUZsb2F0TEUgKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHJldHVybiB3cml0ZUZsb2F0KHRoaXMsIHZhbHVlLCBvZmZzZXQsIHRydWUsIG5vQXNzZXJ0KVxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlRmxvYXRCRSA9IGZ1bmN0aW9uIHdyaXRlRmxvYXRCRSAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgcmV0dXJuIHdyaXRlRmxvYXQodGhpcywgdmFsdWUsIG9mZnNldCwgZmFsc2UsIG5vQXNzZXJ0KVxufVxuXG5mdW5jdGlvbiB3cml0ZURvdWJsZSAoYnVmLCB2YWx1ZSwgb2Zmc2V0LCBsaXR0bGVFbmRpYW4sIG5vQXNzZXJ0KSB7XG4gIGlmICghbm9Bc3NlcnQpIHtcbiAgICBjaGVja0lFRUU3NTQoYnVmLCB2YWx1ZSwgb2Zmc2V0LCA4LCAxLjc5NzY5MzEzNDg2MjMxNTdFKzMwOCwgLTEuNzk3NjkzMTM0ODYyMzE1N0UrMzA4KVxuICB9XG4gIGllZWU3NTQud3JpdGUoYnVmLCB2YWx1ZSwgb2Zmc2V0LCBsaXR0bGVFbmRpYW4sIDUyLCA4KVxuICByZXR1cm4gb2Zmc2V0ICsgOFxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlRG91YmxlTEUgPSBmdW5jdGlvbiB3cml0ZURvdWJsZUxFICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICByZXR1cm4gd3JpdGVEb3VibGUodGhpcywgdmFsdWUsIG9mZnNldCwgdHJ1ZSwgbm9Bc3NlcnQpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVEb3VibGVCRSA9IGZ1bmN0aW9uIHdyaXRlRG91YmxlQkUgKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHJldHVybiB3cml0ZURvdWJsZSh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCBmYWxzZSwgbm9Bc3NlcnQpXG59XG5cbi8vIGNvcHkodGFyZ2V0QnVmZmVyLCB0YXJnZXRTdGFydD0wLCBzb3VyY2VTdGFydD0wLCBzb3VyY2VFbmQ9YnVmZmVyLmxlbmd0aClcbkJ1ZmZlci5wcm90b3R5cGUuY29weSA9IGZ1bmN0aW9uIGNvcHkgKHRhcmdldCwgdGFyZ2V0U3RhcnQsIHN0YXJ0LCBlbmQpIHtcbiAgaWYgKCFzdGFydCkgc3RhcnQgPSAwXG4gIGlmICghZW5kICYmIGVuZCAhPT0gMCkgZW5kID0gdGhpcy5sZW5ndGhcbiAgaWYgKHRhcmdldFN0YXJ0ID49IHRhcmdldC5sZW5ndGgpIHRhcmdldFN0YXJ0ID0gdGFyZ2V0Lmxlbmd0aFxuICBpZiAoIXRhcmdldFN0YXJ0KSB0YXJnZXRTdGFydCA9IDBcbiAgaWYgKGVuZCA+IDAgJiYgZW5kIDwgc3RhcnQpIGVuZCA9IHN0YXJ0XG5cbiAgLy8gQ29weSAwIGJ5dGVzOyB3ZSdyZSBkb25lXG4gIGlmIChlbmQgPT09IHN0YXJ0KSByZXR1cm4gMFxuICBpZiAodGFyZ2V0Lmxlbmd0aCA9PT0gMCB8fCB0aGlzLmxlbmd0aCA9PT0gMCkgcmV0dXJuIDBcblxuICAvLyBGYXRhbCBlcnJvciBjb25kaXRpb25zXG4gIGlmICh0YXJnZXRTdGFydCA8IDApIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcigndGFyZ2V0U3RhcnQgb3V0IG9mIGJvdW5kcycpXG4gIH1cbiAgaWYgKHN0YXJ0IDwgMCB8fCBzdGFydCA+PSB0aGlzLmxlbmd0aCkgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ3NvdXJjZVN0YXJ0IG91dCBvZiBib3VuZHMnKVxuICBpZiAoZW5kIDwgMCkgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ3NvdXJjZUVuZCBvdXQgb2YgYm91bmRzJylcblxuICAvLyBBcmUgd2Ugb29iP1xuICBpZiAoZW5kID4gdGhpcy5sZW5ndGgpIGVuZCA9IHRoaXMubGVuZ3RoXG4gIGlmICh0YXJnZXQubGVuZ3RoIC0gdGFyZ2V0U3RhcnQgPCBlbmQgLSBzdGFydCkge1xuICAgIGVuZCA9IHRhcmdldC5sZW5ndGggLSB0YXJnZXRTdGFydCArIHN0YXJ0XG4gIH1cblxuICB2YXIgbGVuID0gZW5kIC0gc3RhcnRcbiAgdmFyIGlcblxuICBpZiAodGhpcyA9PT0gdGFyZ2V0ICYmIHN0YXJ0IDwgdGFyZ2V0U3RhcnQgJiYgdGFyZ2V0U3RhcnQgPCBlbmQpIHtcbiAgICAvLyBkZXNjZW5kaW5nIGNvcHkgZnJvbSBlbmRcbiAgICBmb3IgKGkgPSBsZW4gLSAxOyBpID49IDA7IC0taSkge1xuICAgICAgdGFyZ2V0W2kgKyB0YXJnZXRTdGFydF0gPSB0aGlzW2kgKyBzdGFydF1cbiAgICB9XG4gIH0gZWxzZSBpZiAobGVuIDwgMTAwMCB8fCAhQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHtcbiAgICAvLyBhc2NlbmRpbmcgY29weSBmcm9tIHN0YXJ0XG4gICAgZm9yIChpID0gMDsgaSA8IGxlbjsgKytpKSB7XG4gICAgICB0YXJnZXRbaSArIHRhcmdldFN0YXJ0XSA9IHRoaXNbaSArIHN0YXJ0XVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBVaW50OEFycmF5LnByb3RvdHlwZS5zZXQuY2FsbChcbiAgICAgIHRhcmdldCxcbiAgICAgIHRoaXMuc3ViYXJyYXkoc3RhcnQsIHN0YXJ0ICsgbGVuKSxcbiAgICAgIHRhcmdldFN0YXJ0XG4gICAgKVxuICB9XG5cbiAgcmV0dXJuIGxlblxufVxuXG4vLyBVc2FnZTpcbi8vICAgIGJ1ZmZlci5maWxsKG51bWJlclssIG9mZnNldFssIGVuZF1dKVxuLy8gICAgYnVmZmVyLmZpbGwoYnVmZmVyWywgb2Zmc2V0WywgZW5kXV0pXG4vLyAgICBidWZmZXIuZmlsbChzdHJpbmdbLCBvZmZzZXRbLCBlbmRdXVssIGVuY29kaW5nXSlcbkJ1ZmZlci5wcm90b3R5cGUuZmlsbCA9IGZ1bmN0aW9uIGZpbGwgKHZhbCwgc3RhcnQsIGVuZCwgZW5jb2RpbmcpIHtcbiAgLy8gSGFuZGxlIHN0cmluZyBjYXNlczpcbiAgaWYgKHR5cGVvZiB2YWwgPT09ICdzdHJpbmcnKSB7XG4gICAgaWYgKHR5cGVvZiBzdGFydCA9PT0gJ3N0cmluZycpIHtcbiAgICAgIGVuY29kaW5nID0gc3RhcnRcbiAgICAgIHN0YXJ0ID0gMFxuICAgICAgZW5kID0gdGhpcy5sZW5ndGhcbiAgICB9IGVsc2UgaWYgKHR5cGVvZiBlbmQgPT09ICdzdHJpbmcnKSB7XG4gICAgICBlbmNvZGluZyA9IGVuZFxuICAgICAgZW5kID0gdGhpcy5sZW5ndGhcbiAgICB9XG4gICAgaWYgKHZhbC5sZW5ndGggPT09IDEpIHtcbiAgICAgIHZhciBjb2RlID0gdmFsLmNoYXJDb2RlQXQoMClcbiAgICAgIGlmIChjb2RlIDwgMjU2KSB7XG4gICAgICAgIHZhbCA9IGNvZGVcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGVuY29kaW5nICE9PSB1bmRlZmluZWQgJiYgdHlwZW9mIGVuY29kaW5nICE9PSAnc3RyaW5nJykge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignZW5jb2RpbmcgbXVzdCBiZSBhIHN0cmluZycpXG4gICAgfVxuICAgIGlmICh0eXBlb2YgZW5jb2RpbmcgPT09ICdzdHJpbmcnICYmICFCdWZmZXIuaXNFbmNvZGluZyhlbmNvZGluZykpIHtcbiAgICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1Vua25vd24gZW5jb2Rpbmc6ICcgKyBlbmNvZGluZylcbiAgICB9XG4gIH0gZWxzZSBpZiAodHlwZW9mIHZhbCA9PT0gJ251bWJlcicpIHtcbiAgICB2YWwgPSB2YWwgJiAyNTVcbiAgfVxuXG4gIC8vIEludmFsaWQgcmFuZ2VzIGFyZSBub3Qgc2V0IHRvIGEgZGVmYXVsdCwgc28gY2FuIHJhbmdlIGNoZWNrIGVhcmx5LlxuICBpZiAoc3RhcnQgPCAwIHx8IHRoaXMubGVuZ3RoIDwgc3RhcnQgfHwgdGhpcy5sZW5ndGggPCBlbmQpIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignT3V0IG9mIHJhbmdlIGluZGV4JylcbiAgfVxuXG4gIGlmIChlbmQgPD0gc3RhcnQpIHtcbiAgICByZXR1cm4gdGhpc1xuICB9XG5cbiAgc3RhcnQgPSBzdGFydCA+Pj4gMFxuICBlbmQgPSBlbmQgPT09IHVuZGVmaW5lZCA/IHRoaXMubGVuZ3RoIDogZW5kID4+PiAwXG5cbiAgaWYgKCF2YWwpIHZhbCA9IDBcblxuICB2YXIgaVxuICBpZiAodHlwZW9mIHZhbCA9PT0gJ251bWJlcicpIHtcbiAgICBmb3IgKGkgPSBzdGFydDsgaSA8IGVuZDsgKytpKSB7XG4gICAgICB0aGlzW2ldID0gdmFsXG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHZhciBieXRlcyA9IEJ1ZmZlci5pc0J1ZmZlcih2YWwpXG4gICAgICA/IHZhbFxuICAgICAgOiB1dGY4VG9CeXRlcyhuZXcgQnVmZmVyKHZhbCwgZW5jb2RpbmcpLnRvU3RyaW5nKCkpXG4gICAgdmFyIGxlbiA9IGJ5dGVzLmxlbmd0aFxuICAgIGZvciAoaSA9IDA7IGkgPCBlbmQgLSBzdGFydDsgKytpKSB7XG4gICAgICB0aGlzW2kgKyBzdGFydF0gPSBieXRlc1tpICUgbGVuXVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiB0aGlzXG59XG5cbi8vIEhFTFBFUiBGVU5DVElPTlNcbi8vID09PT09PT09PT09PT09PT1cblxudmFyIElOVkFMSURfQkFTRTY0X1JFID0gL1teK1xcLzAtOUEtWmEtei1fXS9nXG5cbmZ1bmN0aW9uIGJhc2U2NGNsZWFuIChzdHIpIHtcbiAgLy8gTm9kZSBzdHJpcHMgb3V0IGludmFsaWQgY2hhcmFjdGVycyBsaWtlIFxcbiBhbmQgXFx0IGZyb20gdGhlIHN0cmluZywgYmFzZTY0LWpzIGRvZXMgbm90XG4gIHN0ciA9IHN0cmluZ3RyaW0oc3RyKS5yZXBsYWNlKElOVkFMSURfQkFTRTY0X1JFLCAnJylcbiAgLy8gTm9kZSBjb252ZXJ0cyBzdHJpbmdzIHdpdGggbGVuZ3RoIDwgMiB0byAnJ1xuICBpZiAoc3RyLmxlbmd0aCA8IDIpIHJldHVybiAnJ1xuICAvLyBOb2RlIGFsbG93cyBmb3Igbm9uLXBhZGRlZCBiYXNlNjQgc3RyaW5ncyAobWlzc2luZyB0cmFpbGluZyA9PT0pLCBiYXNlNjQtanMgZG9lcyBub3RcbiAgd2hpbGUgKHN0ci5sZW5ndGggJSA0ICE9PSAwKSB7XG4gICAgc3RyID0gc3RyICsgJz0nXG4gIH1cbiAgcmV0dXJuIHN0clxufVxuXG5mdW5jdGlvbiBzdHJpbmd0cmltIChzdHIpIHtcbiAgaWYgKHN0ci50cmltKSByZXR1cm4gc3RyLnRyaW0oKVxuICByZXR1cm4gc3RyLnJlcGxhY2UoL15cXHMrfFxccyskL2csICcnKVxufVxuXG5mdW5jdGlvbiB0b0hleCAobikge1xuICBpZiAobiA8IDE2KSByZXR1cm4gJzAnICsgbi50b1N0cmluZygxNilcbiAgcmV0dXJuIG4udG9TdHJpbmcoMTYpXG59XG5cbmZ1bmN0aW9uIHV0ZjhUb0J5dGVzIChzdHJpbmcsIHVuaXRzKSB7XG4gIHVuaXRzID0gdW5pdHMgfHwgSW5maW5pdHlcbiAgdmFyIGNvZGVQb2ludFxuICB2YXIgbGVuZ3RoID0gc3RyaW5nLmxlbmd0aFxuICB2YXIgbGVhZFN1cnJvZ2F0ZSA9IG51bGxcbiAgdmFyIGJ5dGVzID0gW11cblxuICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbmd0aDsgKytpKSB7XG4gICAgY29kZVBvaW50ID0gc3RyaW5nLmNoYXJDb2RlQXQoaSlcblxuICAgIC8vIGlzIHN1cnJvZ2F0ZSBjb21wb25lbnRcbiAgICBpZiAoY29kZVBvaW50ID4gMHhEN0ZGICYmIGNvZGVQb2ludCA8IDB4RTAwMCkge1xuICAgICAgLy8gbGFzdCBjaGFyIHdhcyBhIGxlYWRcbiAgICAgIGlmICghbGVhZFN1cnJvZ2F0ZSkge1xuICAgICAgICAvLyBubyBsZWFkIHlldFxuICAgICAgICBpZiAoY29kZVBvaW50ID4gMHhEQkZGKSB7XG4gICAgICAgICAgLy8gdW5leHBlY3RlZCB0cmFpbFxuICAgICAgICAgIGlmICgodW5pdHMgLT0gMykgPiAtMSkgYnl0ZXMucHVzaCgweEVGLCAweEJGLCAweEJEKVxuICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgIH0gZWxzZSBpZiAoaSArIDEgPT09IGxlbmd0aCkge1xuICAgICAgICAgIC8vIHVucGFpcmVkIGxlYWRcbiAgICAgICAgICBpZiAoKHVuaXRzIC09IDMpID4gLTEpIGJ5dGVzLnB1c2goMHhFRiwgMHhCRiwgMHhCRClcbiAgICAgICAgICBjb250aW51ZVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gdmFsaWQgbGVhZFxuICAgICAgICBsZWFkU3Vycm9nYXRlID0gY29kZVBvaW50XG5cbiAgICAgICAgY29udGludWVcbiAgICAgIH1cblxuICAgICAgLy8gMiBsZWFkcyBpbiBhIHJvd1xuICAgICAgaWYgKGNvZGVQb2ludCA8IDB4REMwMCkge1xuICAgICAgICBpZiAoKHVuaXRzIC09IDMpID4gLTEpIGJ5dGVzLnB1c2goMHhFRiwgMHhCRiwgMHhCRClcbiAgICAgICAgbGVhZFN1cnJvZ2F0ZSA9IGNvZGVQb2ludFxuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuXG4gICAgICAvLyB2YWxpZCBzdXJyb2dhdGUgcGFpclxuICAgICAgY29kZVBvaW50ID0gKGxlYWRTdXJyb2dhdGUgLSAweEQ4MDAgPDwgMTAgfCBjb2RlUG9pbnQgLSAweERDMDApICsgMHgxMDAwMFxuICAgIH0gZWxzZSBpZiAobGVhZFN1cnJvZ2F0ZSkge1xuICAgICAgLy8gdmFsaWQgYm1wIGNoYXIsIGJ1dCBsYXN0IGNoYXIgd2FzIGEgbGVhZFxuICAgICAgaWYgKCh1bml0cyAtPSAzKSA+IC0xKSBieXRlcy5wdXNoKDB4RUYsIDB4QkYsIDB4QkQpXG4gICAgfVxuXG4gICAgbGVhZFN1cnJvZ2F0ZSA9IG51bGxcblxuICAgIC8vIGVuY29kZSB1dGY4XG4gICAgaWYgKGNvZGVQb2ludCA8IDB4ODApIHtcbiAgICAgIGlmICgodW5pdHMgLT0gMSkgPCAwKSBicmVha1xuICAgICAgYnl0ZXMucHVzaChjb2RlUG9pbnQpXG4gICAgfSBlbHNlIGlmIChjb2RlUG9pbnQgPCAweDgwMCkge1xuICAgICAgaWYgKCh1bml0cyAtPSAyKSA8IDApIGJyZWFrXG4gICAgICBieXRlcy5wdXNoKFxuICAgICAgICBjb2RlUG9pbnQgPj4gMHg2IHwgMHhDMCxcbiAgICAgICAgY29kZVBvaW50ICYgMHgzRiB8IDB4ODBcbiAgICAgIClcbiAgICB9IGVsc2UgaWYgKGNvZGVQb2ludCA8IDB4MTAwMDApIHtcbiAgICAgIGlmICgodW5pdHMgLT0gMykgPCAwKSBicmVha1xuICAgICAgYnl0ZXMucHVzaChcbiAgICAgICAgY29kZVBvaW50ID4+IDB4QyB8IDB4RTAsXG4gICAgICAgIGNvZGVQb2ludCA+PiAweDYgJiAweDNGIHwgMHg4MCxcbiAgICAgICAgY29kZVBvaW50ICYgMHgzRiB8IDB4ODBcbiAgICAgIClcbiAgICB9IGVsc2UgaWYgKGNvZGVQb2ludCA8IDB4MTEwMDAwKSB7XG4gICAgICBpZiAoKHVuaXRzIC09IDQpIDwgMCkgYnJlYWtcbiAgICAgIGJ5dGVzLnB1c2goXG4gICAgICAgIGNvZGVQb2ludCA+PiAweDEyIHwgMHhGMCxcbiAgICAgICAgY29kZVBvaW50ID4+IDB4QyAmIDB4M0YgfCAweDgwLFxuICAgICAgICBjb2RlUG9pbnQgPj4gMHg2ICYgMHgzRiB8IDB4ODAsXG4gICAgICAgIGNvZGVQb2ludCAmIDB4M0YgfCAweDgwXG4gICAgICApXG4gICAgfSBlbHNlIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBjb2RlIHBvaW50JylcbiAgICB9XG4gIH1cblxuICByZXR1cm4gYnl0ZXNcbn1cblxuZnVuY3Rpb24gYXNjaWlUb0J5dGVzIChzdHIpIHtcbiAgdmFyIGJ5dGVBcnJheSA9IFtdXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgc3RyLmxlbmd0aDsgKytpKSB7XG4gICAgLy8gTm9kZSdzIGNvZGUgc2VlbXMgdG8gYmUgZG9pbmcgdGhpcyBhbmQgbm90ICYgMHg3Ri4uXG4gICAgYnl0ZUFycmF5LnB1c2goc3RyLmNoYXJDb2RlQXQoaSkgJiAweEZGKVxuICB9XG4gIHJldHVybiBieXRlQXJyYXlcbn1cblxuZnVuY3Rpb24gdXRmMTZsZVRvQnl0ZXMgKHN0ciwgdW5pdHMpIHtcbiAgdmFyIGMsIGhpLCBsb1xuICB2YXIgYnl0ZUFycmF5ID0gW11cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBzdHIubGVuZ3RoOyArK2kpIHtcbiAgICBpZiAoKHVuaXRzIC09IDIpIDwgMCkgYnJlYWtcblxuICAgIGMgPSBzdHIuY2hhckNvZGVBdChpKVxuICAgIGhpID0gYyA+PiA4XG4gICAgbG8gPSBjICUgMjU2XG4gICAgYnl0ZUFycmF5LnB1c2gobG8pXG4gICAgYnl0ZUFycmF5LnB1c2goaGkpXG4gIH1cblxuICByZXR1cm4gYnl0ZUFycmF5XG59XG5cbmZ1bmN0aW9uIGJhc2U2NFRvQnl0ZXMgKHN0cikge1xuICByZXR1cm4gYmFzZTY0LnRvQnl0ZUFycmF5KGJhc2U2NGNsZWFuKHN0cikpXG59XG5cbmZ1bmN0aW9uIGJsaXRCdWZmZXIgKHNyYywgZHN0LCBvZmZzZXQsIGxlbmd0aCkge1xuICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbmd0aDsgKytpKSB7XG4gICAgaWYgKChpICsgb2Zmc2V0ID49IGRzdC5sZW5ndGgpIHx8IChpID49IHNyYy5sZW5ndGgpKSBicmVha1xuICAgIGRzdFtpICsgb2Zmc2V0XSA9IHNyY1tpXVxuICB9XG4gIHJldHVybiBpXG59XG5cbmZ1bmN0aW9uIGlzbmFuICh2YWwpIHtcbiAgcmV0dXJuIHZhbCAhPT0gdmFsIC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tc2VsZi1jb21wYXJlXG59XG4iLCIndXNlIHN0cmljdCdcblxuZXhwb3J0cy5ieXRlTGVuZ3RoID0gYnl0ZUxlbmd0aFxuZXhwb3J0cy50b0J5dGVBcnJheSA9IHRvQnl0ZUFycmF5XG5leHBvcnRzLmZyb21CeXRlQXJyYXkgPSBmcm9tQnl0ZUFycmF5XG5cbnZhciBsb29rdXAgPSBbXVxudmFyIHJldkxvb2t1cCA9IFtdXG52YXIgQXJyID0gdHlwZW9mIFVpbnQ4QXJyYXkgIT09ICd1bmRlZmluZWQnID8gVWludDhBcnJheSA6IEFycmF5XG5cbnZhciBjb2RlID0gJ0FCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky8nXG5mb3IgKHZhciBpID0gMCwgbGVuID0gY29kZS5sZW5ndGg7IGkgPCBsZW47ICsraSkge1xuICBsb29rdXBbaV0gPSBjb2RlW2ldXG4gIHJldkxvb2t1cFtjb2RlLmNoYXJDb2RlQXQoaSldID0gaVxufVxuXG5yZXZMb29rdXBbJy0nLmNoYXJDb2RlQXQoMCldID0gNjJcbnJldkxvb2t1cFsnXycuY2hhckNvZGVBdCgwKV0gPSA2M1xuXG5mdW5jdGlvbiBwbGFjZUhvbGRlcnNDb3VudCAoYjY0KSB7XG4gIHZhciBsZW4gPSBiNjQubGVuZ3RoXG4gIGlmIChsZW4gJSA0ID4gMCkge1xuICAgIHRocm93IG5ldyBFcnJvcignSW52YWxpZCBzdHJpbmcuIExlbmd0aCBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgNCcpXG4gIH1cblxuICAvLyB0aGUgbnVtYmVyIG9mIGVxdWFsIHNpZ25zIChwbGFjZSBob2xkZXJzKVxuICAvLyBpZiB0aGVyZSBhcmUgdHdvIHBsYWNlaG9sZGVycywgdGhhbiB0aGUgdHdvIGNoYXJhY3RlcnMgYmVmb3JlIGl0XG4gIC8vIHJlcHJlc2VudCBvbmUgYnl0ZVxuICAvLyBpZiB0aGVyZSBpcyBvbmx5IG9uZSwgdGhlbiB0aGUgdGhyZWUgY2hhcmFjdGVycyBiZWZvcmUgaXQgcmVwcmVzZW50IDIgYnl0ZXNcbiAgLy8gdGhpcyBpcyBqdXN0IGEgY2hlYXAgaGFjayB0byBub3QgZG8gaW5kZXhPZiB0d2ljZVxuICByZXR1cm4gYjY0W2xlbiAtIDJdID09PSAnPScgPyAyIDogYjY0W2xlbiAtIDFdID09PSAnPScgPyAxIDogMFxufVxuXG5mdW5jdGlvbiBieXRlTGVuZ3RoIChiNjQpIHtcbiAgLy8gYmFzZTY0IGlzIDQvMyArIHVwIHRvIHR3byBjaGFyYWN0ZXJzIG9mIHRoZSBvcmlnaW5hbCBkYXRhXG4gIHJldHVybiBiNjQubGVuZ3RoICogMyAvIDQgLSBwbGFjZUhvbGRlcnNDb3VudChiNjQpXG59XG5cbmZ1bmN0aW9uIHRvQnl0ZUFycmF5IChiNjQpIHtcbiAgdmFyIGksIGosIGwsIHRtcCwgcGxhY2VIb2xkZXJzLCBhcnJcbiAgdmFyIGxlbiA9IGI2NC5sZW5ndGhcbiAgcGxhY2VIb2xkZXJzID0gcGxhY2VIb2xkZXJzQ291bnQoYjY0KVxuXG4gIGFyciA9IG5ldyBBcnIobGVuICogMyAvIDQgLSBwbGFjZUhvbGRlcnMpXG5cbiAgLy8gaWYgdGhlcmUgYXJlIHBsYWNlaG9sZGVycywgb25seSBnZXQgdXAgdG8gdGhlIGxhc3QgY29tcGxldGUgNCBjaGFyc1xuICBsID0gcGxhY2VIb2xkZXJzID4gMCA/IGxlbiAtIDQgOiBsZW5cblxuICB2YXIgTCA9IDBcblxuICBmb3IgKGkgPSAwLCBqID0gMDsgaSA8IGw7IGkgKz0gNCwgaiArPSAzKSB7XG4gICAgdG1wID0gKHJldkxvb2t1cFtiNjQuY2hhckNvZGVBdChpKV0gPDwgMTgpIHwgKHJldkxvb2t1cFtiNjQuY2hhckNvZGVBdChpICsgMSldIDw8IDEyKSB8IChyZXZMb29rdXBbYjY0LmNoYXJDb2RlQXQoaSArIDIpXSA8PCA2KSB8IHJldkxvb2t1cFtiNjQuY2hhckNvZGVBdChpICsgMyldXG4gICAgYXJyW0wrK10gPSAodG1wID4+IDE2KSAmIDB4RkZcbiAgICBhcnJbTCsrXSA9ICh0bXAgPj4gOCkgJiAweEZGXG4gICAgYXJyW0wrK10gPSB0bXAgJiAweEZGXG4gIH1cblxuICBpZiAocGxhY2VIb2xkZXJzID09PSAyKSB7XG4gICAgdG1wID0gKHJldkxvb2t1cFtiNjQuY2hhckNvZGVBdChpKV0gPDwgMikgfCAocmV2TG9va3VwW2I2NC5jaGFyQ29kZUF0KGkgKyAxKV0gPj4gNClcbiAgICBhcnJbTCsrXSA9IHRtcCAmIDB4RkZcbiAgfSBlbHNlIGlmIChwbGFjZUhvbGRlcnMgPT09IDEpIHtcbiAgICB0bXAgPSAocmV2TG9va3VwW2I2NC5jaGFyQ29kZUF0KGkpXSA8PCAxMCkgfCAocmV2TG9va3VwW2I2NC5jaGFyQ29kZUF0KGkgKyAxKV0gPDwgNCkgfCAocmV2TG9va3VwW2I2NC5jaGFyQ29kZUF0KGkgKyAyKV0gPj4gMilcbiAgICBhcnJbTCsrXSA9ICh0bXAgPj4gOCkgJiAweEZGXG4gICAgYXJyW0wrK10gPSB0bXAgJiAweEZGXG4gIH1cblxuICByZXR1cm4gYXJyXG59XG5cbmZ1bmN0aW9uIHRyaXBsZXRUb0Jhc2U2NCAobnVtKSB7XG4gIHJldHVybiBsb29rdXBbbnVtID4+IDE4ICYgMHgzRl0gKyBsb29rdXBbbnVtID4+IDEyICYgMHgzRl0gKyBsb29rdXBbbnVtID4+IDYgJiAweDNGXSArIGxvb2t1cFtudW0gJiAweDNGXVxufVxuXG5mdW5jdGlvbiBlbmNvZGVDaHVuayAodWludDgsIHN0YXJ0LCBlbmQpIHtcbiAgdmFyIHRtcFxuICB2YXIgb3V0cHV0ID0gW11cbiAgZm9yICh2YXIgaSA9IHN0YXJ0OyBpIDwgZW5kOyBpICs9IDMpIHtcbiAgICB0bXAgPSAodWludDhbaV0gPDwgMTYpICsgKHVpbnQ4W2kgKyAxXSA8PCA4KSArICh1aW50OFtpICsgMl0pXG4gICAgb3V0cHV0LnB1c2godHJpcGxldFRvQmFzZTY0KHRtcCkpXG4gIH1cbiAgcmV0dXJuIG91dHB1dC5qb2luKCcnKVxufVxuXG5mdW5jdGlvbiBmcm9tQnl0ZUFycmF5ICh1aW50OCkge1xuICB2YXIgdG1wXG4gIHZhciBsZW4gPSB1aW50OC5sZW5ndGhcbiAgdmFyIGV4dHJhQnl0ZXMgPSBsZW4gJSAzIC8vIGlmIHdlIGhhdmUgMSBieXRlIGxlZnQsIHBhZCAyIGJ5dGVzXG4gIHZhciBvdXRwdXQgPSAnJ1xuICB2YXIgcGFydHMgPSBbXVxuICB2YXIgbWF4Q2h1bmtMZW5ndGggPSAxNjM4MyAvLyBtdXN0IGJlIG11bHRpcGxlIG9mIDNcblxuICAvLyBnbyB0aHJvdWdoIHRoZSBhcnJheSBldmVyeSB0aHJlZSBieXRlcywgd2UnbGwgZGVhbCB3aXRoIHRyYWlsaW5nIHN0dWZmIGxhdGVyXG4gIGZvciAodmFyIGkgPSAwLCBsZW4yID0gbGVuIC0gZXh0cmFCeXRlczsgaSA8IGxlbjI7IGkgKz0gbWF4Q2h1bmtMZW5ndGgpIHtcbiAgICBwYXJ0cy5wdXNoKGVuY29kZUNodW5rKHVpbnQ4LCBpLCAoaSArIG1heENodW5rTGVuZ3RoKSA+IGxlbjIgPyBsZW4yIDogKGkgKyBtYXhDaHVua0xlbmd0aCkpKVxuICB9XG5cbiAgLy8gcGFkIHRoZSBlbmQgd2l0aCB6ZXJvcywgYnV0IG1ha2Ugc3VyZSB0byBub3QgZm9yZ2V0IHRoZSBleHRyYSBieXRlc1xuICBpZiAoZXh0cmFCeXRlcyA9PT0gMSkge1xuICAgIHRtcCA9IHVpbnQ4W2xlbiAtIDFdXG4gICAgb3V0cHV0ICs9IGxvb2t1cFt0bXAgPj4gMl1cbiAgICBvdXRwdXQgKz0gbG9va3VwWyh0bXAgPDwgNCkgJiAweDNGXVxuICAgIG91dHB1dCArPSAnPT0nXG4gIH0gZWxzZSBpZiAoZXh0cmFCeXRlcyA9PT0gMikge1xuICAgIHRtcCA9ICh1aW50OFtsZW4gLSAyXSA8PCA4KSArICh1aW50OFtsZW4gLSAxXSlcbiAgICBvdXRwdXQgKz0gbG9va3VwW3RtcCA+PiAxMF1cbiAgICBvdXRwdXQgKz0gbG9va3VwWyh0bXAgPj4gNCkgJiAweDNGXVxuICAgIG91dHB1dCArPSBsb29rdXBbKHRtcCA8PCAyKSAmIDB4M0ZdXG4gICAgb3V0cHV0ICs9ICc9J1xuICB9XG5cbiAgcGFydHMucHVzaChvdXRwdXQpXG5cbiAgcmV0dXJuIHBhcnRzLmpvaW4oJycpXG59XG4iLCJleHBvcnRzLnJlYWQgPSBmdW5jdGlvbiAoYnVmZmVyLCBvZmZzZXQsIGlzTEUsIG1MZW4sIG5CeXRlcykge1xuICB2YXIgZSwgbVxuICB2YXIgZUxlbiA9IG5CeXRlcyAqIDggLSBtTGVuIC0gMVxuICB2YXIgZU1heCA9ICgxIDw8IGVMZW4pIC0gMVxuICB2YXIgZUJpYXMgPSBlTWF4ID4+IDFcbiAgdmFyIG5CaXRzID0gLTdcbiAgdmFyIGkgPSBpc0xFID8gKG5CeXRlcyAtIDEpIDogMFxuICB2YXIgZCA9IGlzTEUgPyAtMSA6IDFcbiAgdmFyIHMgPSBidWZmZXJbb2Zmc2V0ICsgaV1cblxuICBpICs9IGRcblxuICBlID0gcyAmICgoMSA8PCAoLW5CaXRzKSkgLSAxKVxuICBzID4+PSAoLW5CaXRzKVxuICBuQml0cyArPSBlTGVuXG4gIGZvciAoOyBuQml0cyA+IDA7IGUgPSBlICogMjU2ICsgYnVmZmVyW29mZnNldCArIGldLCBpICs9IGQsIG5CaXRzIC09IDgpIHt9XG5cbiAgbSA9IGUgJiAoKDEgPDwgKC1uQml0cykpIC0gMSlcbiAgZSA+Pj0gKC1uQml0cylcbiAgbkJpdHMgKz0gbUxlblxuICBmb3IgKDsgbkJpdHMgPiAwOyBtID0gbSAqIDI1NiArIGJ1ZmZlcltvZmZzZXQgKyBpXSwgaSArPSBkLCBuQml0cyAtPSA4KSB7fVxuXG4gIGlmIChlID09PSAwKSB7XG4gICAgZSA9IDEgLSBlQmlhc1xuICB9IGVsc2UgaWYgKGUgPT09IGVNYXgpIHtcbiAgICByZXR1cm4gbSA/IE5hTiA6ICgocyA/IC0xIDogMSkgKiBJbmZpbml0eSlcbiAgfSBlbHNlIHtcbiAgICBtID0gbSArIE1hdGgucG93KDIsIG1MZW4pXG4gICAgZSA9IGUgLSBlQmlhc1xuICB9XG4gIHJldHVybiAocyA/IC0xIDogMSkgKiBtICogTWF0aC5wb3coMiwgZSAtIG1MZW4pXG59XG5cbmV4cG9ydHMud3JpdGUgPSBmdW5jdGlvbiAoYnVmZmVyLCB2YWx1ZSwgb2Zmc2V0LCBpc0xFLCBtTGVuLCBuQnl0ZXMpIHtcbiAgdmFyIGUsIG0sIGNcbiAgdmFyIGVMZW4gPSBuQnl0ZXMgKiA4IC0gbUxlbiAtIDFcbiAgdmFyIGVNYXggPSAoMSA8PCBlTGVuKSAtIDFcbiAgdmFyIGVCaWFzID0gZU1heCA+PiAxXG4gIHZhciBydCA9IChtTGVuID09PSAyMyA/IE1hdGgucG93KDIsIC0yNCkgLSBNYXRoLnBvdygyLCAtNzcpIDogMClcbiAgdmFyIGkgPSBpc0xFID8gMCA6IChuQnl0ZXMgLSAxKVxuICB2YXIgZCA9IGlzTEUgPyAxIDogLTFcbiAgdmFyIHMgPSB2YWx1ZSA8IDAgfHwgKHZhbHVlID09PSAwICYmIDEgLyB2YWx1ZSA8IDApID8gMSA6IDBcblxuICB2YWx1ZSA9IE1hdGguYWJzKHZhbHVlKVxuXG4gIGlmIChpc05hTih2YWx1ZSkgfHwgdmFsdWUgPT09IEluZmluaXR5KSB7XG4gICAgbSA9IGlzTmFOKHZhbHVlKSA/IDEgOiAwXG4gICAgZSA9IGVNYXhcbiAgfSBlbHNlIHtcbiAgICBlID0gTWF0aC5mbG9vcihNYXRoLmxvZyh2YWx1ZSkgLyBNYXRoLkxOMilcbiAgICBpZiAodmFsdWUgKiAoYyA9IE1hdGgucG93KDIsIC1lKSkgPCAxKSB7XG4gICAgICBlLS1cbiAgICAgIGMgKj0gMlxuICAgIH1cbiAgICBpZiAoZSArIGVCaWFzID49IDEpIHtcbiAgICAgIHZhbHVlICs9IHJ0IC8gY1xuICAgIH0gZWxzZSB7XG4gICAgICB2YWx1ZSArPSBydCAqIE1hdGgucG93KDIsIDEgLSBlQmlhcylcbiAgICB9XG4gICAgaWYgKHZhbHVlICogYyA+PSAyKSB7XG4gICAgICBlKytcbiAgICAgIGMgLz0gMlxuICAgIH1cblxuICAgIGlmIChlICsgZUJpYXMgPj0gZU1heCkge1xuICAgICAgbSA9IDBcbiAgICAgIGUgPSBlTWF4XG4gICAgfSBlbHNlIGlmIChlICsgZUJpYXMgPj0gMSkge1xuICAgICAgbSA9ICh2YWx1ZSAqIGMgLSAxKSAqIE1hdGgucG93KDIsIG1MZW4pXG4gICAgICBlID0gZSArIGVCaWFzXG4gICAgfSBlbHNlIHtcbiAgICAgIG0gPSB2YWx1ZSAqIE1hdGgucG93KDIsIGVCaWFzIC0gMSkgKiBNYXRoLnBvdygyLCBtTGVuKVxuICAgICAgZSA9IDBcbiAgICB9XG4gIH1cblxuICBmb3IgKDsgbUxlbiA+PSA4OyBidWZmZXJbb2Zmc2V0ICsgaV0gPSBtICYgMHhmZiwgaSArPSBkLCBtIC89IDI1NiwgbUxlbiAtPSA4KSB7fVxuXG4gIGUgPSAoZSA8PCBtTGVuKSB8IG1cbiAgZUxlbiArPSBtTGVuXG4gIGZvciAoOyBlTGVuID4gMDsgYnVmZmVyW29mZnNldCArIGldID0gZSAmIDB4ZmYsIGkgKz0gZCwgZSAvPSAyNTYsIGVMZW4gLT0gOCkge31cblxuICBidWZmZXJbb2Zmc2V0ICsgaSAtIGRdIHw9IHMgKiAxMjhcbn1cbiIsInZhciB0b1N0cmluZyA9IHt9LnRvU3RyaW5nO1xuXG5tb2R1bGUuZXhwb3J0cyA9IEFycmF5LmlzQXJyYXkgfHwgZnVuY3Rpb24gKGFycikge1xuICByZXR1cm4gdG9TdHJpbmcuY2FsbChhcnIpID09ICdbb2JqZWN0IEFycmF5XSc7XG59O1xuIiwiLy8gQ29weXJpZ2h0IEpveWVudCwgSW5jLiBhbmQgb3RoZXIgTm9kZSBjb250cmlidXRvcnMuXG4vL1xuLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGFcbi8vIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGVcbi8vIFwiU29mdHdhcmVcIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZ1xuLy8gd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLFxuLy8gZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdFxuLy8gcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlXG4vLyBmb2xsb3dpbmcgY29uZGl0aW9uczpcbi8vXG4vLyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZFxuLy8gaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4vL1xuLy8gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTU1xuLy8gT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRlxuLy8gTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTlxuLy8gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sXG4vLyBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1Jcbi8vIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEVcbi8vIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuXG5cbmZ1bmN0aW9uIEV2ZW50RW1pdHRlcigpIHtcbiAgdGhpcy5fZXZlbnRzID0gdGhpcy5fZXZlbnRzIHx8IHt9O1xuICB0aGlzLl9tYXhMaXN0ZW5lcnMgPSB0aGlzLl9tYXhMaXN0ZW5lcnMgfHwgdW5kZWZpbmVkO1xufVxubW9kdWxlLmV4cG9ydHMgPSBFdmVudEVtaXR0ZXI7XG5cbi8vIEJhY2t3YXJkcy1jb21wYXQgd2l0aCBub2RlIDAuMTAueFxuRXZlbnRFbWl0dGVyLkV2ZW50RW1pdHRlciA9IEV2ZW50RW1pdHRlcjtcblxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5fZXZlbnRzID0gdW5kZWZpbmVkO1xuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5fbWF4TGlzdGVuZXJzID0gdW5kZWZpbmVkO1xuXG4vLyBCeSBkZWZhdWx0IEV2ZW50RW1pdHRlcnMgd2lsbCBwcmludCBhIHdhcm5pbmcgaWYgbW9yZSB0aGFuIDEwIGxpc3RlbmVycyBhcmVcbi8vIGFkZGVkIHRvIGl0LiBUaGlzIGlzIGEgdXNlZnVsIGRlZmF1bHQgd2hpY2ggaGVscHMgZmluZGluZyBtZW1vcnkgbGVha3MuXG5FdmVudEVtaXR0ZXIuZGVmYXVsdE1heExpc3RlbmVycyA9IDEwO1xuXG4vLyBPYnZpb3VzbHkgbm90IGFsbCBFbWl0dGVycyBzaG91bGQgYmUgbGltaXRlZCB0byAxMC4gVGhpcyBmdW5jdGlvbiBhbGxvd3Ncbi8vIHRoYXQgdG8gYmUgaW5jcmVhc2VkLiBTZXQgdG8gemVybyBmb3IgdW5saW1pdGVkLlxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5zZXRNYXhMaXN0ZW5lcnMgPSBmdW5jdGlvbihuKSB7XG4gIGlmICghaXNOdW1iZXIobikgfHwgbiA8IDAgfHwgaXNOYU4obikpXG4gICAgdGhyb3cgVHlwZUVycm9yKCduIG11c3QgYmUgYSBwb3NpdGl2ZSBudW1iZXInKTtcbiAgdGhpcy5fbWF4TGlzdGVuZXJzID0gbjtcbiAgcmV0dXJuIHRoaXM7XG59O1xuXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLmVtaXQgPSBmdW5jdGlvbih0eXBlKSB7XG4gIHZhciBlciwgaGFuZGxlciwgbGVuLCBhcmdzLCBpLCBsaXN0ZW5lcnM7XG5cbiAgaWYgKCF0aGlzLl9ldmVudHMpXG4gICAgdGhpcy5fZXZlbnRzID0ge307XG5cbiAgLy8gSWYgdGhlcmUgaXMgbm8gJ2Vycm9yJyBldmVudCBsaXN0ZW5lciB0aGVuIHRocm93LlxuICBpZiAodHlwZSA9PT0gJ2Vycm9yJykge1xuICAgIGlmICghdGhpcy5fZXZlbnRzLmVycm9yIHx8XG4gICAgICAgIChpc09iamVjdCh0aGlzLl9ldmVudHMuZXJyb3IpICYmICF0aGlzLl9ldmVudHMuZXJyb3IubGVuZ3RoKSkge1xuICAgICAgZXIgPSBhcmd1bWVudHNbMV07XG4gICAgICBpZiAoZXIgaW5zdGFuY2VvZiBFcnJvcikge1xuICAgICAgICB0aHJvdyBlcjsgLy8gVW5oYW5kbGVkICdlcnJvcicgZXZlbnRcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIEF0IGxlYXN0IGdpdmUgc29tZSBraW5kIG9mIGNvbnRleHQgdG8gdGhlIHVzZXJcbiAgICAgICAgdmFyIGVyciA9IG5ldyBFcnJvcignVW5jYXVnaHQsIHVuc3BlY2lmaWVkIFwiZXJyb3JcIiBldmVudC4gKCcgKyBlciArICcpJyk7XG4gICAgICAgIGVyci5jb250ZXh0ID0gZXI7XG4gICAgICAgIHRocm93IGVycjtcbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICBoYW5kbGVyID0gdGhpcy5fZXZlbnRzW3R5cGVdO1xuXG4gIGlmIChpc1VuZGVmaW5lZChoYW5kbGVyKSlcbiAgICByZXR1cm4gZmFsc2U7XG5cbiAgaWYgKGlzRnVuY3Rpb24oaGFuZGxlcikpIHtcbiAgICBzd2l0Y2ggKGFyZ3VtZW50cy5sZW5ndGgpIHtcbiAgICAgIC8vIGZhc3QgY2FzZXNcbiAgICAgIGNhc2UgMTpcbiAgICAgICAgaGFuZGxlci5jYWxsKHRoaXMpO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgMjpcbiAgICAgICAgaGFuZGxlci5jYWxsKHRoaXMsIGFyZ3VtZW50c1sxXSk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAzOlxuICAgICAgICBoYW5kbGVyLmNhbGwodGhpcywgYXJndW1lbnRzWzFdLCBhcmd1bWVudHNbMl0pO1xuICAgICAgICBicmVhaztcbiAgICAgIC8vIHNsb3dlclxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgYXJncyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMSk7XG4gICAgICAgIGhhbmRsZXIuYXBwbHkodGhpcywgYXJncyk7XG4gICAgfVxuICB9IGVsc2UgaWYgKGlzT2JqZWN0KGhhbmRsZXIpKSB7XG4gICAgYXJncyA9IEFycmF5LnByb3RvdHlwZS5zbGljZS5jYWxsKGFyZ3VtZW50cywgMSk7XG4gICAgbGlzdGVuZXJzID0gaGFuZGxlci5zbGljZSgpO1xuICAgIGxlbiA9IGxpc3RlbmVycy5sZW5ndGg7XG4gICAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKVxuICAgICAgbGlzdGVuZXJzW2ldLmFwcGx5KHRoaXMsIGFyZ3MpO1xuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59O1xuXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLmFkZExpc3RlbmVyID0gZnVuY3Rpb24odHlwZSwgbGlzdGVuZXIpIHtcbiAgdmFyIG07XG5cbiAgaWYgKCFpc0Z1bmN0aW9uKGxpc3RlbmVyKSlcbiAgICB0aHJvdyBUeXBlRXJyb3IoJ2xpc3RlbmVyIG11c3QgYmUgYSBmdW5jdGlvbicpO1xuXG4gIGlmICghdGhpcy5fZXZlbnRzKVxuICAgIHRoaXMuX2V2ZW50cyA9IHt9O1xuXG4gIC8vIFRvIGF2b2lkIHJlY3Vyc2lvbiBpbiB0aGUgY2FzZSB0aGF0IHR5cGUgPT09IFwibmV3TGlzdGVuZXJcIiEgQmVmb3JlXG4gIC8vIGFkZGluZyBpdCB0byB0aGUgbGlzdGVuZXJzLCBmaXJzdCBlbWl0IFwibmV3TGlzdGVuZXJcIi5cbiAgaWYgKHRoaXMuX2V2ZW50cy5uZXdMaXN0ZW5lcilcbiAgICB0aGlzLmVtaXQoJ25ld0xpc3RlbmVyJywgdHlwZSxcbiAgICAgICAgICAgICAgaXNGdW5jdGlvbihsaXN0ZW5lci5saXN0ZW5lcikgP1xuICAgICAgICAgICAgICBsaXN0ZW5lci5saXN0ZW5lciA6IGxpc3RlbmVyKTtcblxuICBpZiAoIXRoaXMuX2V2ZW50c1t0eXBlXSlcbiAgICAvLyBPcHRpbWl6ZSB0aGUgY2FzZSBvZiBvbmUgbGlzdGVuZXIuIERvbid0IG5lZWQgdGhlIGV4dHJhIGFycmF5IG9iamVjdC5cbiAgICB0aGlzLl9ldmVudHNbdHlwZV0gPSBsaXN0ZW5lcjtcbiAgZWxzZSBpZiAoaXNPYmplY3QodGhpcy5fZXZlbnRzW3R5cGVdKSlcbiAgICAvLyBJZiB3ZSd2ZSBhbHJlYWR5IGdvdCBhbiBhcnJheSwganVzdCBhcHBlbmQuXG4gICAgdGhpcy5fZXZlbnRzW3R5cGVdLnB1c2gobGlzdGVuZXIpO1xuICBlbHNlXG4gICAgLy8gQWRkaW5nIHRoZSBzZWNvbmQgZWxlbWVudCwgbmVlZCB0byBjaGFuZ2UgdG8gYXJyYXkuXG4gICAgdGhpcy5fZXZlbnRzW3R5cGVdID0gW3RoaXMuX2V2ZW50c1t0eXBlXSwgbGlzdGVuZXJdO1xuXG4gIC8vIENoZWNrIGZvciBsaXN0ZW5lciBsZWFrXG4gIGlmIChpc09iamVjdCh0aGlzLl9ldmVudHNbdHlwZV0pICYmICF0aGlzLl9ldmVudHNbdHlwZV0ud2FybmVkKSB7XG4gICAgaWYgKCFpc1VuZGVmaW5lZCh0aGlzLl9tYXhMaXN0ZW5lcnMpKSB7XG4gICAgICBtID0gdGhpcy5fbWF4TGlzdGVuZXJzO1xuICAgIH0gZWxzZSB7XG4gICAgICBtID0gRXZlbnRFbWl0dGVyLmRlZmF1bHRNYXhMaXN0ZW5lcnM7XG4gICAgfVxuXG4gICAgaWYgKG0gJiYgbSA+IDAgJiYgdGhpcy5fZXZlbnRzW3R5cGVdLmxlbmd0aCA+IG0pIHtcbiAgICAgIHRoaXMuX2V2ZW50c1t0eXBlXS53YXJuZWQgPSB0cnVlO1xuICAgICAgY29uc29sZS5lcnJvcignKG5vZGUpIHdhcm5pbmc6IHBvc3NpYmxlIEV2ZW50RW1pdHRlciBtZW1vcnkgJyArXG4gICAgICAgICAgICAgICAgICAgICdsZWFrIGRldGVjdGVkLiAlZCBsaXN0ZW5lcnMgYWRkZWQuICcgK1xuICAgICAgICAgICAgICAgICAgICAnVXNlIGVtaXR0ZXIuc2V0TWF4TGlzdGVuZXJzKCkgdG8gaW5jcmVhc2UgbGltaXQuJyxcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fZXZlbnRzW3R5cGVdLmxlbmd0aCk7XG4gICAgICBpZiAodHlwZW9mIGNvbnNvbGUudHJhY2UgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgLy8gbm90IHN1cHBvcnRlZCBpbiBJRSAxMFxuICAgICAgICBjb25zb2xlLnRyYWNlKCk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHRoaXM7XG59O1xuXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLm9uID0gRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5hZGRMaXN0ZW5lcjtcblxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5vbmNlID0gZnVuY3Rpb24odHlwZSwgbGlzdGVuZXIpIHtcbiAgaWYgKCFpc0Z1bmN0aW9uKGxpc3RlbmVyKSlcbiAgICB0aHJvdyBUeXBlRXJyb3IoJ2xpc3RlbmVyIG11c3QgYmUgYSBmdW5jdGlvbicpO1xuXG4gIHZhciBmaXJlZCA9IGZhbHNlO1xuXG4gIGZ1bmN0aW9uIGcoKSB7XG4gICAgdGhpcy5yZW1vdmVMaXN0ZW5lcih0eXBlLCBnKTtcblxuICAgIGlmICghZmlyZWQpIHtcbiAgICAgIGZpcmVkID0gdHJ1ZTtcbiAgICAgIGxpc3RlbmVyLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgfVxuICB9XG5cbiAgZy5saXN0ZW5lciA9IGxpc3RlbmVyO1xuICB0aGlzLm9uKHR5cGUsIGcpO1xuXG4gIHJldHVybiB0aGlzO1xufTtcblxuLy8gZW1pdHMgYSAncmVtb3ZlTGlzdGVuZXInIGV2ZW50IGlmZiB0aGUgbGlzdGVuZXIgd2FzIHJlbW92ZWRcbkV2ZW50RW1pdHRlci5wcm90b3R5cGUucmVtb3ZlTGlzdGVuZXIgPSBmdW5jdGlvbih0eXBlLCBsaXN0ZW5lcikge1xuICB2YXIgbGlzdCwgcG9zaXRpb24sIGxlbmd0aCwgaTtcblxuICBpZiAoIWlzRnVuY3Rpb24obGlzdGVuZXIpKVxuICAgIHRocm93IFR5cGVFcnJvcignbGlzdGVuZXIgbXVzdCBiZSBhIGZ1bmN0aW9uJyk7XG5cbiAgaWYgKCF0aGlzLl9ldmVudHMgfHwgIXRoaXMuX2V2ZW50c1t0eXBlXSlcbiAgICByZXR1cm4gdGhpcztcblxuICBsaXN0ID0gdGhpcy5fZXZlbnRzW3R5cGVdO1xuICBsZW5ndGggPSBsaXN0Lmxlbmd0aDtcbiAgcG9zaXRpb24gPSAtMTtcblxuICBpZiAobGlzdCA9PT0gbGlzdGVuZXIgfHxcbiAgICAgIChpc0Z1bmN0aW9uKGxpc3QubGlzdGVuZXIpICYmIGxpc3QubGlzdGVuZXIgPT09IGxpc3RlbmVyKSkge1xuICAgIGRlbGV0ZSB0aGlzLl9ldmVudHNbdHlwZV07XG4gICAgaWYgKHRoaXMuX2V2ZW50cy5yZW1vdmVMaXN0ZW5lcilcbiAgICAgIHRoaXMuZW1pdCgncmVtb3ZlTGlzdGVuZXInLCB0eXBlLCBsaXN0ZW5lcik7XG5cbiAgfSBlbHNlIGlmIChpc09iamVjdChsaXN0KSkge1xuICAgIGZvciAoaSA9IGxlbmd0aDsgaS0tID4gMDspIHtcbiAgICAgIGlmIChsaXN0W2ldID09PSBsaXN0ZW5lciB8fFxuICAgICAgICAgIChsaXN0W2ldLmxpc3RlbmVyICYmIGxpc3RbaV0ubGlzdGVuZXIgPT09IGxpc3RlbmVyKSkge1xuICAgICAgICBwb3NpdGlvbiA9IGk7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgIH1cblxuICAgIGlmIChwb3NpdGlvbiA8IDApXG4gICAgICByZXR1cm4gdGhpcztcblxuICAgIGlmIChsaXN0Lmxlbmd0aCA9PT0gMSkge1xuICAgICAgbGlzdC5sZW5ndGggPSAwO1xuICAgICAgZGVsZXRlIHRoaXMuX2V2ZW50c1t0eXBlXTtcbiAgICB9IGVsc2Uge1xuICAgICAgbGlzdC5zcGxpY2UocG9zaXRpb24sIDEpO1xuICAgIH1cblxuICAgIGlmICh0aGlzLl9ldmVudHMucmVtb3ZlTGlzdGVuZXIpXG4gICAgICB0aGlzLmVtaXQoJ3JlbW92ZUxpc3RlbmVyJywgdHlwZSwgbGlzdGVuZXIpO1xuICB9XG5cbiAgcmV0dXJuIHRoaXM7XG59O1xuXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLnJlbW92ZUFsbExpc3RlbmVycyA9IGZ1bmN0aW9uKHR5cGUpIHtcbiAgdmFyIGtleSwgbGlzdGVuZXJzO1xuXG4gIGlmICghdGhpcy5fZXZlbnRzKVxuICAgIHJldHVybiB0aGlzO1xuXG4gIC8vIG5vdCBsaXN0ZW5pbmcgZm9yIHJlbW92ZUxpc3RlbmVyLCBubyBuZWVkIHRvIGVtaXRcbiAgaWYgKCF0aGlzLl9ldmVudHMucmVtb3ZlTGlzdGVuZXIpIHtcbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PT0gMClcbiAgICAgIHRoaXMuX2V2ZW50cyA9IHt9O1xuICAgIGVsc2UgaWYgKHRoaXMuX2V2ZW50c1t0eXBlXSlcbiAgICAgIGRlbGV0ZSB0aGlzLl9ldmVudHNbdHlwZV07XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICAvLyBlbWl0IHJlbW92ZUxpc3RlbmVyIGZvciBhbGwgbGlzdGVuZXJzIG9uIGFsbCBldmVudHNcbiAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDApIHtcbiAgICBmb3IgKGtleSBpbiB0aGlzLl9ldmVudHMpIHtcbiAgICAgIGlmIChrZXkgPT09ICdyZW1vdmVMaXN0ZW5lcicpIGNvbnRpbnVlO1xuICAgICAgdGhpcy5yZW1vdmVBbGxMaXN0ZW5lcnMoa2V5KTtcbiAgICB9XG4gICAgdGhpcy5yZW1vdmVBbGxMaXN0ZW5lcnMoJ3JlbW92ZUxpc3RlbmVyJyk7XG4gICAgdGhpcy5fZXZlbnRzID0ge307XG4gICAgcmV0dXJuIHRoaXM7XG4gIH1cblxuICBsaXN0ZW5lcnMgPSB0aGlzLl9ldmVudHNbdHlwZV07XG5cbiAgaWYgKGlzRnVuY3Rpb24obGlzdGVuZXJzKSkge1xuICAgIHRoaXMucmVtb3ZlTGlzdGVuZXIodHlwZSwgbGlzdGVuZXJzKTtcbiAgfSBlbHNlIGlmIChsaXN0ZW5lcnMpIHtcbiAgICAvLyBMSUZPIG9yZGVyXG4gICAgd2hpbGUgKGxpc3RlbmVycy5sZW5ndGgpXG4gICAgICB0aGlzLnJlbW92ZUxpc3RlbmVyKHR5cGUsIGxpc3RlbmVyc1tsaXN0ZW5lcnMubGVuZ3RoIC0gMV0pO1xuICB9XG4gIGRlbGV0ZSB0aGlzLl9ldmVudHNbdHlwZV07XG5cbiAgcmV0dXJuIHRoaXM7XG59O1xuXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLmxpc3RlbmVycyA9IGZ1bmN0aW9uKHR5cGUpIHtcbiAgdmFyIHJldDtcbiAgaWYgKCF0aGlzLl9ldmVudHMgfHwgIXRoaXMuX2V2ZW50c1t0eXBlXSlcbiAgICByZXQgPSBbXTtcbiAgZWxzZSBpZiAoaXNGdW5jdGlvbih0aGlzLl9ldmVudHNbdHlwZV0pKVxuICAgIHJldCA9IFt0aGlzLl9ldmVudHNbdHlwZV1dO1xuICBlbHNlXG4gICAgcmV0ID0gdGhpcy5fZXZlbnRzW3R5cGVdLnNsaWNlKCk7XG4gIHJldHVybiByZXQ7XG59O1xuXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLmxpc3RlbmVyQ291bnQgPSBmdW5jdGlvbih0eXBlKSB7XG4gIGlmICh0aGlzLl9ldmVudHMpIHtcbiAgICB2YXIgZXZsaXN0ZW5lciA9IHRoaXMuX2V2ZW50c1t0eXBlXTtcblxuICAgIGlmIChpc0Z1bmN0aW9uKGV2bGlzdGVuZXIpKVxuICAgICAgcmV0dXJuIDE7XG4gICAgZWxzZSBpZiAoZXZsaXN0ZW5lcilcbiAgICAgIHJldHVybiBldmxpc3RlbmVyLmxlbmd0aDtcbiAgfVxuICByZXR1cm4gMDtcbn07XG5cbkV2ZW50RW1pdHRlci5saXN0ZW5lckNvdW50ID0gZnVuY3Rpb24oZW1pdHRlciwgdHlwZSkge1xuICByZXR1cm4gZW1pdHRlci5saXN0ZW5lckNvdW50KHR5cGUpO1xufTtcblxuZnVuY3Rpb24gaXNGdW5jdGlvbihhcmcpIHtcbiAgcmV0dXJuIHR5cGVvZiBhcmcgPT09ICdmdW5jdGlvbic7XG59XG5cbmZ1bmN0aW9uIGlzTnVtYmVyKGFyZykge1xuICByZXR1cm4gdHlwZW9mIGFyZyA9PT0gJ251bWJlcic7XG59XG5cbmZ1bmN0aW9uIGlzT2JqZWN0KGFyZykge1xuICByZXR1cm4gdHlwZW9mIGFyZyA9PT0gJ29iamVjdCcgJiYgYXJnICE9PSBudWxsO1xufVxuXG5mdW5jdGlvbiBpc1VuZGVmaW5lZChhcmcpIHtcbiAgcmV0dXJuIGFyZyA9PT0gdm9pZCAwO1xufVxuIiwiLyohXG4gKiBEZXRlcm1pbmUgaWYgYW4gb2JqZWN0IGlzIGEgQnVmZmVyXG4gKlxuICogQGF1dGhvciAgIEZlcm9zcyBBYm91a2hhZGlqZWggPGZlcm9zc0BmZXJvc3Mub3JnPiA8aHR0cDovL2Zlcm9zcy5vcmc+XG4gKiBAbGljZW5zZSAgTUlUXG4gKi9cblxuLy8gVGhlIF9pc0J1ZmZlciBjaGVjayBpcyBmb3IgU2FmYXJpIDUtNyBzdXBwb3J0LCBiZWNhdXNlIGl0J3MgbWlzc2luZ1xuLy8gT2JqZWN0LnByb3RvdHlwZS5jb25zdHJ1Y3Rvci4gUmVtb3ZlIHRoaXMgZXZlbnR1YWxseVxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiAob2JqKSB7XG4gIHJldHVybiBvYmogIT0gbnVsbCAmJiAoaXNCdWZmZXIob2JqKSB8fCBpc1Nsb3dCdWZmZXIob2JqKSB8fCAhIW9iai5faXNCdWZmZXIpXG59XG5cbmZ1bmN0aW9uIGlzQnVmZmVyIChvYmopIHtcbiAgcmV0dXJuICEhb2JqLmNvbnN0cnVjdG9yICYmIHR5cGVvZiBvYmouY29uc3RydWN0b3IuaXNCdWZmZXIgPT09ICdmdW5jdGlvbicgJiYgb2JqLmNvbnN0cnVjdG9yLmlzQnVmZmVyKG9iailcbn1cblxuLy8gRm9yIE5vZGUgdjAuMTAgc3VwcG9ydC4gUmVtb3ZlIHRoaXMgZXZlbnR1YWxseS5cbmZ1bmN0aW9uIGlzU2xvd0J1ZmZlciAob2JqKSB7XG4gIHJldHVybiB0eXBlb2Ygb2JqLnJlYWRGbG9hdExFID09PSAnZnVuY3Rpb24nICYmIHR5cGVvZiBvYmouc2xpY2UgPT09ICdmdW5jdGlvbicgJiYgaXNCdWZmZXIob2JqLnNsaWNlKDAsIDApKVxufVxuIiwiLy8gc2hpbSBmb3IgdXNpbmcgcHJvY2VzcyBpbiBicm93c2VyXG52YXIgcHJvY2VzcyA9IG1vZHVsZS5leHBvcnRzID0ge307XG5cbi8vIGNhY2hlZCBmcm9tIHdoYXRldmVyIGdsb2JhbCBpcyBwcmVzZW50IHNvIHRoYXQgdGVzdCBydW5uZXJzIHRoYXQgc3R1YiBpdFxuLy8gZG9uJ3QgYnJlYWsgdGhpbmdzLiAgQnV0IHdlIG5lZWQgdG8gd3JhcCBpdCBpbiBhIHRyeSBjYXRjaCBpbiBjYXNlIGl0IGlzXG4vLyB3cmFwcGVkIGluIHN0cmljdCBtb2RlIGNvZGUgd2hpY2ggZG9lc24ndCBkZWZpbmUgYW55IGdsb2JhbHMuICBJdCdzIGluc2lkZSBhXG4vLyBmdW5jdGlvbiBiZWNhdXNlIHRyeS9jYXRjaGVzIGRlb3B0aW1pemUgaW4gY2VydGFpbiBlbmdpbmVzLlxuXG52YXIgY2FjaGVkU2V0VGltZW91dDtcbnZhciBjYWNoZWRDbGVhclRpbWVvdXQ7XG5cbmZ1bmN0aW9uIGRlZmF1bHRTZXRUaW1vdXQoKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdzZXRUaW1lb3V0IGhhcyBub3QgYmVlbiBkZWZpbmVkJyk7XG59XG5mdW5jdGlvbiBkZWZhdWx0Q2xlYXJUaW1lb3V0ICgpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ2NsZWFyVGltZW91dCBoYXMgbm90IGJlZW4gZGVmaW5lZCcpO1xufVxuKGZ1bmN0aW9uICgpIHtcbiAgICB0cnkge1xuICAgICAgICBpZiAodHlwZW9mIHNldFRpbWVvdXQgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIGNhY2hlZFNldFRpbWVvdXQgPSBzZXRUaW1lb3V0O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY2FjaGVkU2V0VGltZW91dCA9IGRlZmF1bHRTZXRUaW1vdXQ7XG4gICAgICAgIH1cbiAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgIGNhY2hlZFNldFRpbWVvdXQgPSBkZWZhdWx0U2V0VGltb3V0O1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgICBpZiAodHlwZW9mIGNsZWFyVGltZW91dCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgY2FjaGVkQ2xlYXJUaW1lb3V0ID0gY2xlYXJUaW1lb3V0O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgY2FjaGVkQ2xlYXJUaW1lb3V0ID0gZGVmYXVsdENsZWFyVGltZW91dDtcbiAgICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgY2FjaGVkQ2xlYXJUaW1lb3V0ID0gZGVmYXVsdENsZWFyVGltZW91dDtcbiAgICB9XG59ICgpKVxuZnVuY3Rpb24gcnVuVGltZW91dChmdW4pIHtcbiAgICBpZiAoY2FjaGVkU2V0VGltZW91dCA9PT0gc2V0VGltZW91dCkge1xuICAgICAgICAvL25vcm1hbCBlbnZpcm9tZW50cyBpbiBzYW5lIHNpdHVhdGlvbnNcbiAgICAgICAgcmV0dXJuIHNldFRpbWVvdXQoZnVuLCAwKTtcbiAgICB9XG4gICAgLy8gaWYgc2V0VGltZW91dCB3YXNuJ3QgYXZhaWxhYmxlIGJ1dCB3YXMgbGF0dGVyIGRlZmluZWRcbiAgICBpZiAoKGNhY2hlZFNldFRpbWVvdXQgPT09IGRlZmF1bHRTZXRUaW1vdXQgfHwgIWNhY2hlZFNldFRpbWVvdXQpICYmIHNldFRpbWVvdXQpIHtcbiAgICAgICAgY2FjaGVkU2V0VGltZW91dCA9IHNldFRpbWVvdXQ7XG4gICAgICAgIHJldHVybiBzZXRUaW1lb3V0KGZ1biwgMCk7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICAgIC8vIHdoZW4gd2hlbiBzb21lYm9keSBoYXMgc2NyZXdlZCB3aXRoIHNldFRpbWVvdXQgYnV0IG5vIEkuRS4gbWFkZG5lc3NcbiAgICAgICAgcmV0dXJuIGNhY2hlZFNldFRpbWVvdXQoZnVuLCAwKTtcbiAgICB9IGNhdGNoKGUpe1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgLy8gV2hlbiB3ZSBhcmUgaW4gSS5FLiBidXQgdGhlIHNjcmlwdCBoYXMgYmVlbiBldmFsZWQgc28gSS5FLiBkb2Vzbid0IHRydXN0IHRoZSBnbG9iYWwgb2JqZWN0IHdoZW4gY2FsbGVkIG5vcm1hbGx5XG4gICAgICAgICAgICByZXR1cm4gY2FjaGVkU2V0VGltZW91dC5jYWxsKG51bGwsIGZ1biwgMCk7XG4gICAgICAgIH0gY2F0Y2goZSl7XG4gICAgICAgICAgICAvLyBzYW1lIGFzIGFib3ZlIGJ1dCB3aGVuIGl0J3MgYSB2ZXJzaW9uIG9mIEkuRS4gdGhhdCBtdXN0IGhhdmUgdGhlIGdsb2JhbCBvYmplY3QgZm9yICd0aGlzJywgaG9wZnVsbHkgb3VyIGNvbnRleHQgY29ycmVjdCBvdGhlcndpc2UgaXQgd2lsbCB0aHJvdyBhIGdsb2JhbCBlcnJvclxuICAgICAgICAgICAgcmV0dXJuIGNhY2hlZFNldFRpbWVvdXQuY2FsbCh0aGlzLCBmdW4sIDApO1xuICAgICAgICB9XG4gICAgfVxuXG5cbn1cbmZ1bmN0aW9uIHJ1bkNsZWFyVGltZW91dChtYXJrZXIpIHtcbiAgICBpZiAoY2FjaGVkQ2xlYXJUaW1lb3V0ID09PSBjbGVhclRpbWVvdXQpIHtcbiAgICAgICAgLy9ub3JtYWwgZW52aXJvbWVudHMgaW4gc2FuZSBzaXR1YXRpb25zXG4gICAgICAgIHJldHVybiBjbGVhclRpbWVvdXQobWFya2VyKTtcbiAgICB9XG4gICAgLy8gaWYgY2xlYXJUaW1lb3V0IHdhc24ndCBhdmFpbGFibGUgYnV0IHdhcyBsYXR0ZXIgZGVmaW5lZFxuICAgIGlmICgoY2FjaGVkQ2xlYXJUaW1lb3V0ID09PSBkZWZhdWx0Q2xlYXJUaW1lb3V0IHx8ICFjYWNoZWRDbGVhclRpbWVvdXQpICYmIGNsZWFyVGltZW91dCkge1xuICAgICAgICBjYWNoZWRDbGVhclRpbWVvdXQgPSBjbGVhclRpbWVvdXQ7XG4gICAgICAgIHJldHVybiBjbGVhclRpbWVvdXQobWFya2VyKTtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgICAgLy8gd2hlbiB3aGVuIHNvbWVib2R5IGhhcyBzY3Jld2VkIHdpdGggc2V0VGltZW91dCBidXQgbm8gSS5FLiBtYWRkbmVzc1xuICAgICAgICByZXR1cm4gY2FjaGVkQ2xlYXJUaW1lb3V0KG1hcmtlcik7XG4gICAgfSBjYXRjaCAoZSl7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICAvLyBXaGVuIHdlIGFyZSBpbiBJLkUuIGJ1dCB0aGUgc2NyaXB0IGhhcyBiZWVuIGV2YWxlZCBzbyBJLkUuIGRvZXNuJ3QgIHRydXN0IHRoZSBnbG9iYWwgb2JqZWN0IHdoZW4gY2FsbGVkIG5vcm1hbGx5XG4gICAgICAgICAgICByZXR1cm4gY2FjaGVkQ2xlYXJUaW1lb3V0LmNhbGwobnVsbCwgbWFya2VyKTtcbiAgICAgICAgfSBjYXRjaCAoZSl7XG4gICAgICAgICAgICAvLyBzYW1lIGFzIGFib3ZlIGJ1dCB3aGVuIGl0J3MgYSB2ZXJzaW9uIG9mIEkuRS4gdGhhdCBtdXN0IGhhdmUgdGhlIGdsb2JhbCBvYmplY3QgZm9yICd0aGlzJywgaG9wZnVsbHkgb3VyIGNvbnRleHQgY29ycmVjdCBvdGhlcndpc2UgaXQgd2lsbCB0aHJvdyBhIGdsb2JhbCBlcnJvci5cbiAgICAgICAgICAgIC8vIFNvbWUgdmVyc2lvbnMgb2YgSS5FLiBoYXZlIGRpZmZlcmVudCBydWxlcyBmb3IgY2xlYXJUaW1lb3V0IHZzIHNldFRpbWVvdXRcbiAgICAgICAgICAgIHJldHVybiBjYWNoZWRDbGVhclRpbWVvdXQuY2FsbCh0aGlzLCBtYXJrZXIpO1xuICAgICAgICB9XG4gICAgfVxuXG5cblxufVxudmFyIHF1ZXVlID0gW107XG52YXIgZHJhaW5pbmcgPSBmYWxzZTtcbnZhciBjdXJyZW50UXVldWU7XG52YXIgcXVldWVJbmRleCA9IC0xO1xuXG5mdW5jdGlvbiBjbGVhblVwTmV4dFRpY2soKSB7XG4gICAgaWYgKCFkcmFpbmluZyB8fCAhY3VycmVudFF1ZXVlKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgZHJhaW5pbmcgPSBmYWxzZTtcbiAgICBpZiAoY3VycmVudFF1ZXVlLmxlbmd0aCkge1xuICAgICAgICBxdWV1ZSA9IGN1cnJlbnRRdWV1ZS5jb25jYXQocXVldWUpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHF1ZXVlSW5kZXggPSAtMTtcbiAgICB9XG4gICAgaWYgKHF1ZXVlLmxlbmd0aCkge1xuICAgICAgICBkcmFpblF1ZXVlKCk7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBkcmFpblF1ZXVlKCkge1xuICAgIGlmIChkcmFpbmluZykge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIHZhciB0aW1lb3V0ID0gcnVuVGltZW91dChjbGVhblVwTmV4dFRpY2spO1xuICAgIGRyYWluaW5nID0gdHJ1ZTtcblxuICAgIHZhciBsZW4gPSBxdWV1ZS5sZW5ndGg7XG4gICAgd2hpbGUobGVuKSB7XG4gICAgICAgIGN1cnJlbnRRdWV1ZSA9IHF1ZXVlO1xuICAgICAgICBxdWV1ZSA9IFtdO1xuICAgICAgICB3aGlsZSAoKytxdWV1ZUluZGV4IDwgbGVuKSB7XG4gICAgICAgICAgICBpZiAoY3VycmVudFF1ZXVlKSB7XG4gICAgICAgICAgICAgICAgY3VycmVudFF1ZXVlW3F1ZXVlSW5kZXhdLnJ1bigpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHF1ZXVlSW5kZXggPSAtMTtcbiAgICAgICAgbGVuID0gcXVldWUubGVuZ3RoO1xuICAgIH1cbiAgICBjdXJyZW50UXVldWUgPSBudWxsO1xuICAgIGRyYWluaW5nID0gZmFsc2U7XG4gICAgcnVuQ2xlYXJUaW1lb3V0KHRpbWVvdXQpO1xufVxuXG5wcm9jZXNzLm5leHRUaWNrID0gZnVuY3Rpb24gKGZ1bikge1xuICAgIHZhciBhcmdzID0gbmV3IEFycmF5KGFyZ3VtZW50cy5sZW5ndGggLSAxKTtcbiAgICBpZiAoYXJndW1lbnRzLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgZm9yICh2YXIgaSA9IDE7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGFyZ3NbaSAtIDFdID0gYXJndW1lbnRzW2ldO1xuICAgICAgICB9XG4gICAgfVxuICAgIHF1ZXVlLnB1c2gobmV3IEl0ZW0oZnVuLCBhcmdzKSk7XG4gICAgaWYgKHF1ZXVlLmxlbmd0aCA9PT0gMSAmJiAhZHJhaW5pbmcpIHtcbiAgICAgICAgcnVuVGltZW91dChkcmFpblF1ZXVlKTtcbiAgICB9XG59O1xuXG4vLyB2OCBsaWtlcyBwcmVkaWN0aWJsZSBvYmplY3RzXG5mdW5jdGlvbiBJdGVtKGZ1biwgYXJyYXkpIHtcbiAgICB0aGlzLmZ1biA9IGZ1bjtcbiAgICB0aGlzLmFycmF5ID0gYXJyYXk7XG59XG5JdGVtLnByb3RvdHlwZS5ydW4gPSBmdW5jdGlvbiAoKSB7XG4gICAgdGhpcy5mdW4uYXBwbHkobnVsbCwgdGhpcy5hcnJheSk7XG59O1xucHJvY2Vzcy50aXRsZSA9ICdicm93c2VyJztcbnByb2Nlc3MuYnJvd3NlciA9IHRydWU7XG5wcm9jZXNzLmVudiA9IHt9O1xucHJvY2Vzcy5hcmd2ID0gW107XG5wcm9jZXNzLnZlcnNpb24gPSAnJzsgLy8gZW1wdHkgc3RyaW5nIHRvIGF2b2lkIHJlZ2V4cCBpc3N1ZXNcbnByb2Nlc3MudmVyc2lvbnMgPSB7fTtcblxuZnVuY3Rpb24gbm9vcCgpIHt9XG5cbnByb2Nlc3Mub24gPSBub29wO1xucHJvY2Vzcy5hZGRMaXN0ZW5lciA9IG5vb3A7XG5wcm9jZXNzLm9uY2UgPSBub29wO1xucHJvY2Vzcy5vZmYgPSBub29wO1xucHJvY2Vzcy5yZW1vdmVMaXN0ZW5lciA9IG5vb3A7XG5wcm9jZXNzLnJlbW92ZUFsbExpc3RlbmVycyA9IG5vb3A7XG5wcm9jZXNzLmVtaXQgPSBub29wO1xuXG5wcm9jZXNzLmJpbmRpbmcgPSBmdW5jdGlvbiAobmFtZSkge1xuICAgIHRocm93IG5ldyBFcnJvcigncHJvY2Vzcy5iaW5kaW5nIGlzIG5vdCBzdXBwb3J0ZWQnKTtcbn07XG5cbnByb2Nlc3MuY3dkID0gZnVuY3Rpb24gKCkgeyByZXR1cm4gJy8nIH07XG5wcm9jZXNzLmNoZGlyID0gZnVuY3Rpb24gKGRpcikge1xuICAgIHRocm93IG5ldyBFcnJvcigncHJvY2Vzcy5jaGRpciBpcyBub3Qgc3VwcG9ydGVkJyk7XG59O1xucHJvY2Vzcy51bWFzayA9IGZ1bmN0aW9uKCkgeyByZXR1cm4gMDsgfTtcbiIsImlmICh0eXBlb2YgT2JqZWN0LmNyZWF0ZSA9PT0gJ2Z1bmN0aW9uJykge1xuICAvLyBpbXBsZW1lbnRhdGlvbiBmcm9tIHN0YW5kYXJkIG5vZGUuanMgJ3V0aWwnIG1vZHVsZVxuICBtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGluaGVyaXRzKGN0b3IsIHN1cGVyQ3Rvcikge1xuICAgIGN0b3Iuc3VwZXJfID0gc3VwZXJDdG9yXG4gICAgY3Rvci5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKHN1cGVyQ3Rvci5wcm90b3R5cGUsIHtcbiAgICAgIGNvbnN0cnVjdG9yOiB7XG4gICAgICAgIHZhbHVlOiBjdG9yLFxuICAgICAgICBlbnVtZXJhYmxlOiBmYWxzZSxcbiAgICAgICAgd3JpdGFibGU6IHRydWUsXG4gICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgICAgfVxuICAgIH0pO1xuICB9O1xufSBlbHNlIHtcbiAgLy8gb2xkIHNjaG9vbCBzaGltIGZvciBvbGQgYnJvd3NlcnNcbiAgbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBpbmhlcml0cyhjdG9yLCBzdXBlckN0b3IpIHtcbiAgICBjdG9yLnN1cGVyXyA9IHN1cGVyQ3RvclxuICAgIHZhciBUZW1wQ3RvciA9IGZ1bmN0aW9uICgpIHt9XG4gICAgVGVtcEN0b3IucHJvdG90eXBlID0gc3VwZXJDdG9yLnByb3RvdHlwZVxuICAgIGN0b3IucHJvdG90eXBlID0gbmV3IFRlbXBDdG9yKClcbiAgICBjdG9yLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IGN0b3JcbiAgfVxufVxuIiwibW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBpc0J1ZmZlcihhcmcpIHtcbiAgcmV0dXJuIGFyZyAmJiB0eXBlb2YgYXJnID09PSAnb2JqZWN0J1xuICAgICYmIHR5cGVvZiBhcmcuY29weSA9PT0gJ2Z1bmN0aW9uJ1xuICAgICYmIHR5cGVvZiBhcmcuZmlsbCA9PT0gJ2Z1bmN0aW9uJ1xuICAgICYmIHR5cGVvZiBhcmcucmVhZFVJbnQ4ID09PSAnZnVuY3Rpb24nO1xufSIsIi8vIENvcHlyaWdodCBKb3llbnQsIEluYy4gYW5kIG90aGVyIE5vZGUgY29udHJpYnV0b3JzLlxuLy9cbi8vIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhXG4vLyBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlXG4vLyBcIlNvZnR3YXJlXCIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmdcbi8vIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCxcbi8vIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXRcbi8vIHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZVxuLy8gZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4vL1xuLy8gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWRcbi8vIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuLy9cbi8vIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1Ncbi8vIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0Zcbi8vIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU5cbi8vIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLFxuLy8gREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SXG4vLyBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFXG4vLyBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLlxuXG52YXIgZm9ybWF0UmVnRXhwID0gLyVbc2RqJV0vZztcbmV4cG9ydHMuZm9ybWF0ID0gZnVuY3Rpb24oZikge1xuICBpZiAoIWlzU3RyaW5nKGYpKSB7XG4gICAgdmFyIG9iamVjdHMgPSBbXTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgb2JqZWN0cy5wdXNoKGluc3BlY3QoYXJndW1lbnRzW2ldKSk7XG4gICAgfVxuICAgIHJldHVybiBvYmplY3RzLmpvaW4oJyAnKTtcbiAgfVxuXG4gIHZhciBpID0gMTtcbiAgdmFyIGFyZ3MgPSBhcmd1bWVudHM7XG4gIHZhciBsZW4gPSBhcmdzLmxlbmd0aDtcbiAgdmFyIHN0ciA9IFN0cmluZyhmKS5yZXBsYWNlKGZvcm1hdFJlZ0V4cCwgZnVuY3Rpb24oeCkge1xuICAgIGlmICh4ID09PSAnJSUnKSByZXR1cm4gJyUnO1xuICAgIGlmIChpID49IGxlbikgcmV0dXJuIHg7XG4gICAgc3dpdGNoICh4KSB7XG4gICAgICBjYXNlICclcyc6IHJldHVybiBTdHJpbmcoYXJnc1tpKytdKTtcbiAgICAgIGNhc2UgJyVkJzogcmV0dXJuIE51bWJlcihhcmdzW2krK10pO1xuICAgICAgY2FzZSAnJWonOlxuICAgICAgICB0cnkge1xuICAgICAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShhcmdzW2krK10pO1xuICAgICAgICB9IGNhdGNoIChfKSB7XG4gICAgICAgICAgcmV0dXJuICdbQ2lyY3VsYXJdJztcbiAgICAgICAgfVxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgcmV0dXJuIHg7XG4gICAgfVxuICB9KTtcbiAgZm9yICh2YXIgeCA9IGFyZ3NbaV07IGkgPCBsZW47IHggPSBhcmdzWysraV0pIHtcbiAgICBpZiAoaXNOdWxsKHgpIHx8ICFpc09iamVjdCh4KSkge1xuICAgICAgc3RyICs9ICcgJyArIHg7XG4gICAgfSBlbHNlIHtcbiAgICAgIHN0ciArPSAnICcgKyBpbnNwZWN0KHgpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gc3RyO1xufTtcblxuXG4vLyBNYXJrIHRoYXQgYSBtZXRob2Qgc2hvdWxkIG5vdCBiZSB1c2VkLlxuLy8gUmV0dXJucyBhIG1vZGlmaWVkIGZ1bmN0aW9uIHdoaWNoIHdhcm5zIG9uY2UgYnkgZGVmYXVsdC5cbi8vIElmIC0tbm8tZGVwcmVjYXRpb24gaXMgc2V0LCB0aGVuIGl0IGlzIGEgbm8tb3AuXG5leHBvcnRzLmRlcHJlY2F0ZSA9IGZ1bmN0aW9uKGZuLCBtc2cpIHtcbiAgLy8gQWxsb3cgZm9yIGRlcHJlY2F0aW5nIHRoaW5ncyBpbiB0aGUgcHJvY2VzcyBvZiBzdGFydGluZyB1cC5cbiAgaWYgKGlzVW5kZWZpbmVkKGdsb2JhbC5wcm9jZXNzKSkge1xuICAgIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICAgIHJldHVybiBleHBvcnRzLmRlcHJlY2F0ZShmbiwgbXNnKS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIH07XG4gIH1cblxuICBpZiAocHJvY2Vzcy5ub0RlcHJlY2F0aW9uID09PSB0cnVlKSB7XG4gICAgcmV0dXJuIGZuO1xuICB9XG5cbiAgdmFyIHdhcm5lZCA9IGZhbHNlO1xuICBmdW5jdGlvbiBkZXByZWNhdGVkKCkge1xuICAgIGlmICghd2FybmVkKSB7XG4gICAgICBpZiAocHJvY2Vzcy50aHJvd0RlcHJlY2F0aW9uKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihtc2cpO1xuICAgICAgfSBlbHNlIGlmIChwcm9jZXNzLnRyYWNlRGVwcmVjYXRpb24pIHtcbiAgICAgICAgY29uc29sZS50cmFjZShtc2cpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgY29uc29sZS5lcnJvcihtc2cpO1xuICAgICAgfVxuICAgICAgd2FybmVkID0gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGZuLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gIH1cblxuICByZXR1cm4gZGVwcmVjYXRlZDtcbn07XG5cblxudmFyIGRlYnVncyA9IHt9O1xudmFyIGRlYnVnRW52aXJvbjtcbmV4cG9ydHMuZGVidWdsb2cgPSBmdW5jdGlvbihzZXQpIHtcbiAgaWYgKGlzVW5kZWZpbmVkKGRlYnVnRW52aXJvbikpXG4gICAgZGVidWdFbnZpcm9uID0gcHJvY2Vzcy5lbnYuTk9ERV9ERUJVRyB8fCAnJztcbiAgc2V0ID0gc2V0LnRvVXBwZXJDYXNlKCk7XG4gIGlmICghZGVidWdzW3NldF0pIHtcbiAgICBpZiAobmV3IFJlZ0V4cCgnXFxcXGInICsgc2V0ICsgJ1xcXFxiJywgJ2knKS50ZXN0KGRlYnVnRW52aXJvbikpIHtcbiAgICAgIHZhciBwaWQgPSBwcm9jZXNzLnBpZDtcbiAgICAgIGRlYnVnc1tzZXRdID0gZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciBtc2cgPSBleHBvcnRzLmZvcm1hdC5hcHBseShleHBvcnRzLCBhcmd1bWVudHMpO1xuICAgICAgICBjb25zb2xlLmVycm9yKCclcyAlZDogJXMnLCBzZXQsIHBpZCwgbXNnKTtcbiAgICAgIH07XG4gICAgfSBlbHNlIHtcbiAgICAgIGRlYnVnc1tzZXRdID0gZnVuY3Rpb24oKSB7fTtcbiAgICB9XG4gIH1cbiAgcmV0dXJuIGRlYnVnc1tzZXRdO1xufTtcblxuXG4vKipcbiAqIEVjaG9zIHRoZSB2YWx1ZSBvZiBhIHZhbHVlLiBUcnlzIHRvIHByaW50IHRoZSB2YWx1ZSBvdXRcbiAqIGluIHRoZSBiZXN0IHdheSBwb3NzaWJsZSBnaXZlbiB0aGUgZGlmZmVyZW50IHR5cGVzLlxuICpcbiAqIEBwYXJhbSB7T2JqZWN0fSBvYmogVGhlIG9iamVjdCB0byBwcmludCBvdXQuXG4gKiBAcGFyYW0ge09iamVjdH0gb3B0cyBPcHRpb25hbCBvcHRpb25zIG9iamVjdCB0aGF0IGFsdGVycyB0aGUgb3V0cHV0LlxuICovXG4vKiBsZWdhY3k6IG9iaiwgc2hvd0hpZGRlbiwgZGVwdGgsIGNvbG9ycyovXG5mdW5jdGlvbiBpbnNwZWN0KG9iaiwgb3B0cykge1xuICAvLyBkZWZhdWx0IG9wdGlvbnNcbiAgdmFyIGN0eCA9IHtcbiAgICBzZWVuOiBbXSxcbiAgICBzdHlsaXplOiBzdHlsaXplTm9Db2xvclxuICB9O1xuICAvLyBsZWdhY3kuLi5cbiAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPj0gMykgY3R4LmRlcHRoID0gYXJndW1lbnRzWzJdO1xuICBpZiAoYXJndW1lbnRzLmxlbmd0aCA+PSA0KSBjdHguY29sb3JzID0gYXJndW1lbnRzWzNdO1xuICBpZiAoaXNCb29sZWFuKG9wdHMpKSB7XG4gICAgLy8gbGVnYWN5Li4uXG4gICAgY3R4LnNob3dIaWRkZW4gPSBvcHRzO1xuICB9IGVsc2UgaWYgKG9wdHMpIHtcbiAgICAvLyBnb3QgYW4gXCJvcHRpb25zXCIgb2JqZWN0XG4gICAgZXhwb3J0cy5fZXh0ZW5kKGN0eCwgb3B0cyk7XG4gIH1cbiAgLy8gc2V0IGRlZmF1bHQgb3B0aW9uc1xuICBpZiAoaXNVbmRlZmluZWQoY3R4LnNob3dIaWRkZW4pKSBjdHguc2hvd0hpZGRlbiA9IGZhbHNlO1xuICBpZiAoaXNVbmRlZmluZWQoY3R4LmRlcHRoKSkgY3R4LmRlcHRoID0gMjtcbiAgaWYgKGlzVW5kZWZpbmVkKGN0eC5jb2xvcnMpKSBjdHguY29sb3JzID0gZmFsc2U7XG4gIGlmIChpc1VuZGVmaW5lZChjdHguY3VzdG9tSW5zcGVjdCkpIGN0eC5jdXN0b21JbnNwZWN0ID0gdHJ1ZTtcbiAgaWYgKGN0eC5jb2xvcnMpIGN0eC5zdHlsaXplID0gc3R5bGl6ZVdpdGhDb2xvcjtcbiAgcmV0dXJuIGZvcm1hdFZhbHVlKGN0eCwgb2JqLCBjdHguZGVwdGgpO1xufVxuZXhwb3J0cy5pbnNwZWN0ID0gaW5zcGVjdDtcblxuXG4vLyBodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL0FOU0lfZXNjYXBlX2NvZGUjZ3JhcGhpY3Ncbmluc3BlY3QuY29sb3JzID0ge1xuICAnYm9sZCcgOiBbMSwgMjJdLFxuICAnaXRhbGljJyA6IFszLCAyM10sXG4gICd1bmRlcmxpbmUnIDogWzQsIDI0XSxcbiAgJ2ludmVyc2UnIDogWzcsIDI3XSxcbiAgJ3doaXRlJyA6IFszNywgMzldLFxuICAnZ3JleScgOiBbOTAsIDM5XSxcbiAgJ2JsYWNrJyA6IFszMCwgMzldLFxuICAnYmx1ZScgOiBbMzQsIDM5XSxcbiAgJ2N5YW4nIDogWzM2LCAzOV0sXG4gICdncmVlbicgOiBbMzIsIDM5XSxcbiAgJ21hZ2VudGEnIDogWzM1LCAzOV0sXG4gICdyZWQnIDogWzMxLCAzOV0sXG4gICd5ZWxsb3cnIDogWzMzLCAzOV1cbn07XG5cbi8vIERvbid0IHVzZSAnYmx1ZScgbm90IHZpc2libGUgb24gY21kLmV4ZVxuaW5zcGVjdC5zdHlsZXMgPSB7XG4gICdzcGVjaWFsJzogJ2N5YW4nLFxuICAnbnVtYmVyJzogJ3llbGxvdycsXG4gICdib29sZWFuJzogJ3llbGxvdycsXG4gICd1bmRlZmluZWQnOiAnZ3JleScsXG4gICdudWxsJzogJ2JvbGQnLFxuICAnc3RyaW5nJzogJ2dyZWVuJyxcbiAgJ2RhdGUnOiAnbWFnZW50YScsXG4gIC8vIFwibmFtZVwiOiBpbnRlbnRpb25hbGx5IG5vdCBzdHlsaW5nXG4gICdyZWdleHAnOiAncmVkJ1xufTtcblxuXG5mdW5jdGlvbiBzdHlsaXplV2l0aENvbG9yKHN0ciwgc3R5bGVUeXBlKSB7XG4gIHZhciBzdHlsZSA9IGluc3BlY3Quc3R5bGVzW3N0eWxlVHlwZV07XG5cbiAgaWYgKHN0eWxlKSB7XG4gICAgcmV0dXJuICdcXHUwMDFiWycgKyBpbnNwZWN0LmNvbG9yc1tzdHlsZV1bMF0gKyAnbScgKyBzdHIgK1xuICAgICAgICAgICAnXFx1MDAxYlsnICsgaW5zcGVjdC5jb2xvcnNbc3R5bGVdWzFdICsgJ20nO1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBzdHI7XG4gIH1cbn1cblxuXG5mdW5jdGlvbiBzdHlsaXplTm9Db2xvcihzdHIsIHN0eWxlVHlwZSkge1xuICByZXR1cm4gc3RyO1xufVxuXG5cbmZ1bmN0aW9uIGFycmF5VG9IYXNoKGFycmF5KSB7XG4gIHZhciBoYXNoID0ge307XG5cbiAgYXJyYXkuZm9yRWFjaChmdW5jdGlvbih2YWwsIGlkeCkge1xuICAgIGhhc2hbdmFsXSA9IHRydWU7XG4gIH0pO1xuXG4gIHJldHVybiBoYXNoO1xufVxuXG5cbmZ1bmN0aW9uIGZvcm1hdFZhbHVlKGN0eCwgdmFsdWUsIHJlY3Vyc2VUaW1lcykge1xuICAvLyBQcm92aWRlIGEgaG9vayBmb3IgdXNlci1zcGVjaWZpZWQgaW5zcGVjdCBmdW5jdGlvbnMuXG4gIC8vIENoZWNrIHRoYXQgdmFsdWUgaXMgYW4gb2JqZWN0IHdpdGggYW4gaW5zcGVjdCBmdW5jdGlvbiBvbiBpdFxuICBpZiAoY3R4LmN1c3RvbUluc3BlY3QgJiZcbiAgICAgIHZhbHVlICYmXG4gICAgICBpc0Z1bmN0aW9uKHZhbHVlLmluc3BlY3QpICYmXG4gICAgICAvLyBGaWx0ZXIgb3V0IHRoZSB1dGlsIG1vZHVsZSwgaXQncyBpbnNwZWN0IGZ1bmN0aW9uIGlzIHNwZWNpYWxcbiAgICAgIHZhbHVlLmluc3BlY3QgIT09IGV4cG9ydHMuaW5zcGVjdCAmJlxuICAgICAgLy8gQWxzbyBmaWx0ZXIgb3V0IGFueSBwcm90b3R5cGUgb2JqZWN0cyB1c2luZyB0aGUgY2lyY3VsYXIgY2hlY2suXG4gICAgICAhKHZhbHVlLmNvbnN0cnVjdG9yICYmIHZhbHVlLmNvbnN0cnVjdG9yLnByb3RvdHlwZSA9PT0gdmFsdWUpKSB7XG4gICAgdmFyIHJldCA9IHZhbHVlLmluc3BlY3QocmVjdXJzZVRpbWVzLCBjdHgpO1xuICAgIGlmICghaXNTdHJpbmcocmV0KSkge1xuICAgICAgcmV0ID0gZm9ybWF0VmFsdWUoY3R4LCByZXQsIHJlY3Vyc2VUaW1lcyk7XG4gICAgfVxuICAgIHJldHVybiByZXQ7XG4gIH1cblxuICAvLyBQcmltaXRpdmUgdHlwZXMgY2Fubm90IGhhdmUgcHJvcGVydGllc1xuICB2YXIgcHJpbWl0aXZlID0gZm9ybWF0UHJpbWl0aXZlKGN0eCwgdmFsdWUpO1xuICBpZiAocHJpbWl0aXZlKSB7XG4gICAgcmV0dXJuIHByaW1pdGl2ZTtcbiAgfVxuXG4gIC8vIExvb2sgdXAgdGhlIGtleXMgb2YgdGhlIG9iamVjdC5cbiAgdmFyIGtleXMgPSBPYmplY3Qua2V5cyh2YWx1ZSk7XG4gIHZhciB2aXNpYmxlS2V5cyA9IGFycmF5VG9IYXNoKGtleXMpO1xuXG4gIGlmIChjdHguc2hvd0hpZGRlbikge1xuICAgIGtleXMgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyh2YWx1ZSk7XG4gIH1cblxuICAvLyBJRSBkb2Vzbid0IG1ha2UgZXJyb3IgZmllbGRzIG5vbi1lbnVtZXJhYmxlXG4gIC8vIGh0dHA6Ly9tc2RuLm1pY3Jvc29mdC5jb20vZW4tdXMvbGlicmFyeS9pZS9kd3c1MnNidCh2PXZzLjk0KS5hc3B4XG4gIGlmIChpc0Vycm9yKHZhbHVlKVxuICAgICAgJiYgKGtleXMuaW5kZXhPZignbWVzc2FnZScpID49IDAgfHwga2V5cy5pbmRleE9mKCdkZXNjcmlwdGlvbicpID49IDApKSB7XG4gICAgcmV0dXJuIGZvcm1hdEVycm9yKHZhbHVlKTtcbiAgfVxuXG4gIC8vIFNvbWUgdHlwZSBvZiBvYmplY3Qgd2l0aG91dCBwcm9wZXJ0aWVzIGNhbiBiZSBzaG9ydGN1dHRlZC5cbiAgaWYgKGtleXMubGVuZ3RoID09PSAwKSB7XG4gICAgaWYgKGlzRnVuY3Rpb24odmFsdWUpKSB7XG4gICAgICB2YXIgbmFtZSA9IHZhbHVlLm5hbWUgPyAnOiAnICsgdmFsdWUubmFtZSA6ICcnO1xuICAgICAgcmV0dXJuIGN0eC5zdHlsaXplKCdbRnVuY3Rpb24nICsgbmFtZSArICddJywgJ3NwZWNpYWwnKTtcbiAgICB9XG4gICAgaWYgKGlzUmVnRXhwKHZhbHVlKSkge1xuICAgICAgcmV0dXJuIGN0eC5zdHlsaXplKFJlZ0V4cC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh2YWx1ZSksICdyZWdleHAnKTtcbiAgICB9XG4gICAgaWYgKGlzRGF0ZSh2YWx1ZSkpIHtcbiAgICAgIHJldHVybiBjdHguc3R5bGl6ZShEYXRlLnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHZhbHVlKSwgJ2RhdGUnKTtcbiAgICB9XG4gICAgaWYgKGlzRXJyb3IodmFsdWUpKSB7XG4gICAgICByZXR1cm4gZm9ybWF0RXJyb3IodmFsdWUpO1xuICAgIH1cbiAgfVxuXG4gIHZhciBiYXNlID0gJycsIGFycmF5ID0gZmFsc2UsIGJyYWNlcyA9IFsneycsICd9J107XG5cbiAgLy8gTWFrZSBBcnJheSBzYXkgdGhhdCB0aGV5IGFyZSBBcnJheVxuICBpZiAoaXNBcnJheSh2YWx1ZSkpIHtcbiAgICBhcnJheSA9IHRydWU7XG4gICAgYnJhY2VzID0gWydbJywgJ10nXTtcbiAgfVxuXG4gIC8vIE1ha2UgZnVuY3Rpb25zIHNheSB0aGF0IHRoZXkgYXJlIGZ1bmN0aW9uc1xuICBpZiAoaXNGdW5jdGlvbih2YWx1ZSkpIHtcbiAgICB2YXIgbiA9IHZhbHVlLm5hbWUgPyAnOiAnICsgdmFsdWUubmFtZSA6ICcnO1xuICAgIGJhc2UgPSAnIFtGdW5jdGlvbicgKyBuICsgJ10nO1xuICB9XG5cbiAgLy8gTWFrZSBSZWdFeHBzIHNheSB0aGF0IHRoZXkgYXJlIFJlZ0V4cHNcbiAgaWYgKGlzUmVnRXhwKHZhbHVlKSkge1xuICAgIGJhc2UgPSAnICcgKyBSZWdFeHAucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodmFsdWUpO1xuICB9XG5cbiAgLy8gTWFrZSBkYXRlcyB3aXRoIHByb3BlcnRpZXMgZmlyc3Qgc2F5IHRoZSBkYXRlXG4gIGlmIChpc0RhdGUodmFsdWUpKSB7XG4gICAgYmFzZSA9ICcgJyArIERhdGUucHJvdG90eXBlLnRvVVRDU3RyaW5nLmNhbGwodmFsdWUpO1xuICB9XG5cbiAgLy8gTWFrZSBlcnJvciB3aXRoIG1lc3NhZ2UgZmlyc3Qgc2F5IHRoZSBlcnJvclxuICBpZiAoaXNFcnJvcih2YWx1ZSkpIHtcbiAgICBiYXNlID0gJyAnICsgZm9ybWF0RXJyb3IodmFsdWUpO1xuICB9XG5cbiAgaWYgKGtleXMubGVuZ3RoID09PSAwICYmICghYXJyYXkgfHwgdmFsdWUubGVuZ3RoID09IDApKSB7XG4gICAgcmV0dXJuIGJyYWNlc1swXSArIGJhc2UgKyBicmFjZXNbMV07XG4gIH1cblxuICBpZiAocmVjdXJzZVRpbWVzIDwgMCkge1xuICAgIGlmIChpc1JlZ0V4cCh2YWx1ZSkpIHtcbiAgICAgIHJldHVybiBjdHguc3R5bGl6ZShSZWdFeHAucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodmFsdWUpLCAncmVnZXhwJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBjdHguc3R5bGl6ZSgnW09iamVjdF0nLCAnc3BlY2lhbCcpO1xuICAgIH1cbiAgfVxuXG4gIGN0eC5zZWVuLnB1c2godmFsdWUpO1xuXG4gIHZhciBvdXRwdXQ7XG4gIGlmIChhcnJheSkge1xuICAgIG91dHB1dCA9IGZvcm1hdEFycmF5KGN0eCwgdmFsdWUsIHJlY3Vyc2VUaW1lcywgdmlzaWJsZUtleXMsIGtleXMpO1xuICB9IGVsc2Uge1xuICAgIG91dHB1dCA9IGtleXMubWFwKGZ1bmN0aW9uKGtleSkge1xuICAgICAgcmV0dXJuIGZvcm1hdFByb3BlcnR5KGN0eCwgdmFsdWUsIHJlY3Vyc2VUaW1lcywgdmlzaWJsZUtleXMsIGtleSwgYXJyYXkpO1xuICAgIH0pO1xuICB9XG5cbiAgY3R4LnNlZW4ucG9wKCk7XG5cbiAgcmV0dXJuIHJlZHVjZVRvU2luZ2xlU3RyaW5nKG91dHB1dCwgYmFzZSwgYnJhY2VzKTtcbn1cblxuXG5mdW5jdGlvbiBmb3JtYXRQcmltaXRpdmUoY3R4LCB2YWx1ZSkge1xuICBpZiAoaXNVbmRlZmluZWQodmFsdWUpKVxuICAgIHJldHVybiBjdHguc3R5bGl6ZSgndW5kZWZpbmVkJywgJ3VuZGVmaW5lZCcpO1xuICBpZiAoaXNTdHJpbmcodmFsdWUpKSB7XG4gICAgdmFyIHNpbXBsZSA9ICdcXCcnICsgSlNPTi5zdHJpbmdpZnkodmFsdWUpLnJlcGxhY2UoL15cInxcIiQvZywgJycpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAucmVwbGFjZSgvJy9nLCBcIlxcXFwnXCIpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAucmVwbGFjZSgvXFxcXFwiL2csICdcIicpICsgJ1xcJyc7XG4gICAgcmV0dXJuIGN0eC5zdHlsaXplKHNpbXBsZSwgJ3N0cmluZycpO1xuICB9XG4gIGlmIChpc051bWJlcih2YWx1ZSkpXG4gICAgcmV0dXJuIGN0eC5zdHlsaXplKCcnICsgdmFsdWUsICdudW1iZXInKTtcbiAgaWYgKGlzQm9vbGVhbih2YWx1ZSkpXG4gICAgcmV0dXJuIGN0eC5zdHlsaXplKCcnICsgdmFsdWUsICdib29sZWFuJyk7XG4gIC8vIEZvciBzb21lIHJlYXNvbiB0eXBlb2YgbnVsbCBpcyBcIm9iamVjdFwiLCBzbyBzcGVjaWFsIGNhc2UgaGVyZS5cbiAgaWYgKGlzTnVsbCh2YWx1ZSkpXG4gICAgcmV0dXJuIGN0eC5zdHlsaXplKCdudWxsJywgJ251bGwnKTtcbn1cblxuXG5mdW5jdGlvbiBmb3JtYXRFcnJvcih2YWx1ZSkge1xuICByZXR1cm4gJ1snICsgRXJyb3IucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodmFsdWUpICsgJ10nO1xufVxuXG5cbmZ1bmN0aW9uIGZvcm1hdEFycmF5KGN0eCwgdmFsdWUsIHJlY3Vyc2VUaW1lcywgdmlzaWJsZUtleXMsIGtleXMpIHtcbiAgdmFyIG91dHB1dCA9IFtdO1xuICBmb3IgKHZhciBpID0gMCwgbCA9IHZhbHVlLmxlbmd0aDsgaSA8IGw7ICsraSkge1xuICAgIGlmIChoYXNPd25Qcm9wZXJ0eSh2YWx1ZSwgU3RyaW5nKGkpKSkge1xuICAgICAgb3V0cHV0LnB1c2goZm9ybWF0UHJvcGVydHkoY3R4LCB2YWx1ZSwgcmVjdXJzZVRpbWVzLCB2aXNpYmxlS2V5cyxcbiAgICAgICAgICBTdHJpbmcoaSksIHRydWUpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgb3V0cHV0LnB1c2goJycpO1xuICAgIH1cbiAgfVxuICBrZXlzLmZvckVhY2goZnVuY3Rpb24oa2V5KSB7XG4gICAgaWYgKCFrZXkubWF0Y2goL15cXGQrJC8pKSB7XG4gICAgICBvdXRwdXQucHVzaChmb3JtYXRQcm9wZXJ0eShjdHgsIHZhbHVlLCByZWN1cnNlVGltZXMsIHZpc2libGVLZXlzLFxuICAgICAgICAgIGtleSwgdHJ1ZSkpO1xuICAgIH1cbiAgfSk7XG4gIHJldHVybiBvdXRwdXQ7XG59XG5cblxuZnVuY3Rpb24gZm9ybWF0UHJvcGVydHkoY3R4LCB2YWx1ZSwgcmVjdXJzZVRpbWVzLCB2aXNpYmxlS2V5cywga2V5LCBhcnJheSkge1xuICB2YXIgbmFtZSwgc3RyLCBkZXNjO1xuICBkZXNjID0gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcih2YWx1ZSwga2V5KSB8fCB7IHZhbHVlOiB2YWx1ZVtrZXldIH07XG4gIGlmIChkZXNjLmdldCkge1xuICAgIGlmIChkZXNjLnNldCkge1xuICAgICAgc3RyID0gY3R4LnN0eWxpemUoJ1tHZXR0ZXIvU2V0dGVyXScsICdzcGVjaWFsJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHN0ciA9IGN0eC5zdHlsaXplKCdbR2V0dGVyXScsICdzcGVjaWFsJyk7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIGlmIChkZXNjLnNldCkge1xuICAgICAgc3RyID0gY3R4LnN0eWxpemUoJ1tTZXR0ZXJdJywgJ3NwZWNpYWwnKTtcbiAgICB9XG4gIH1cbiAgaWYgKCFoYXNPd25Qcm9wZXJ0eSh2aXNpYmxlS2V5cywga2V5KSkge1xuICAgIG5hbWUgPSAnWycgKyBrZXkgKyAnXSc7XG4gIH1cbiAgaWYgKCFzdHIpIHtcbiAgICBpZiAoY3R4LnNlZW4uaW5kZXhPZihkZXNjLnZhbHVlKSA8IDApIHtcbiAgICAgIGlmIChpc051bGwocmVjdXJzZVRpbWVzKSkge1xuICAgICAgICBzdHIgPSBmb3JtYXRWYWx1ZShjdHgsIGRlc2MudmFsdWUsIG51bGwpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgc3RyID0gZm9ybWF0VmFsdWUoY3R4LCBkZXNjLnZhbHVlLCByZWN1cnNlVGltZXMgLSAxKTtcbiAgICAgIH1cbiAgICAgIGlmIChzdHIuaW5kZXhPZignXFxuJykgPiAtMSkge1xuICAgICAgICBpZiAoYXJyYXkpIHtcbiAgICAgICAgICBzdHIgPSBzdHIuc3BsaXQoJ1xcbicpLm1hcChmdW5jdGlvbihsaW5lKSB7XG4gICAgICAgICAgICByZXR1cm4gJyAgJyArIGxpbmU7XG4gICAgICAgICAgfSkuam9pbignXFxuJykuc3Vic3RyKDIpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHN0ciA9ICdcXG4nICsgc3RyLnNwbGl0KCdcXG4nKS5tYXAoZnVuY3Rpb24obGluZSkge1xuICAgICAgICAgICAgcmV0dXJuICcgICAnICsgbGluZTtcbiAgICAgICAgICB9KS5qb2luKCdcXG4nKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICBzdHIgPSBjdHguc3R5bGl6ZSgnW0NpcmN1bGFyXScsICdzcGVjaWFsJyk7XG4gICAgfVxuICB9XG4gIGlmIChpc1VuZGVmaW5lZChuYW1lKSkge1xuICAgIGlmIChhcnJheSAmJiBrZXkubWF0Y2goL15cXGQrJC8pKSB7XG4gICAgICByZXR1cm4gc3RyO1xuICAgIH1cbiAgICBuYW1lID0gSlNPTi5zdHJpbmdpZnkoJycgKyBrZXkpO1xuICAgIGlmIChuYW1lLm1hdGNoKC9eXCIoW2EtekEtWl9dW2EtekEtWl8wLTldKilcIiQvKSkge1xuICAgICAgbmFtZSA9IG5hbWUuc3Vic3RyKDEsIG5hbWUubGVuZ3RoIC0gMik7XG4gICAgICBuYW1lID0gY3R4LnN0eWxpemUobmFtZSwgJ25hbWUnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgbmFtZSA9IG5hbWUucmVwbGFjZSgvJy9nLCBcIlxcXFwnXCIpXG4gICAgICAgICAgICAgICAgIC5yZXBsYWNlKC9cXFxcXCIvZywgJ1wiJylcbiAgICAgICAgICAgICAgICAgLnJlcGxhY2UoLyheXCJ8XCIkKS9nLCBcIidcIik7XG4gICAgICBuYW1lID0gY3R4LnN0eWxpemUobmFtZSwgJ3N0cmluZycpO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBuYW1lICsgJzogJyArIHN0cjtcbn1cblxuXG5mdW5jdGlvbiByZWR1Y2VUb1NpbmdsZVN0cmluZyhvdXRwdXQsIGJhc2UsIGJyYWNlcykge1xuICB2YXIgbnVtTGluZXNFc3QgPSAwO1xuICB2YXIgbGVuZ3RoID0gb3V0cHV0LnJlZHVjZShmdW5jdGlvbihwcmV2LCBjdXIpIHtcbiAgICBudW1MaW5lc0VzdCsrO1xuICAgIGlmIChjdXIuaW5kZXhPZignXFxuJykgPj0gMCkgbnVtTGluZXNFc3QrKztcbiAgICByZXR1cm4gcHJldiArIGN1ci5yZXBsYWNlKC9cXHUwMDFiXFxbXFxkXFxkP20vZywgJycpLmxlbmd0aCArIDE7XG4gIH0sIDApO1xuXG4gIGlmIChsZW5ndGggPiA2MCkge1xuICAgIHJldHVybiBicmFjZXNbMF0gK1xuICAgICAgICAgICAoYmFzZSA9PT0gJycgPyAnJyA6IGJhc2UgKyAnXFxuICcpICtcbiAgICAgICAgICAgJyAnICtcbiAgICAgICAgICAgb3V0cHV0LmpvaW4oJyxcXG4gICcpICtcbiAgICAgICAgICAgJyAnICtcbiAgICAgICAgICAgYnJhY2VzWzFdO1xuICB9XG5cbiAgcmV0dXJuIGJyYWNlc1swXSArIGJhc2UgKyAnICcgKyBvdXRwdXQuam9pbignLCAnKSArICcgJyArIGJyYWNlc1sxXTtcbn1cblxuXG4vLyBOT1RFOiBUaGVzZSB0eXBlIGNoZWNraW5nIGZ1bmN0aW9ucyBpbnRlbnRpb25hbGx5IGRvbid0IHVzZSBgaW5zdGFuY2VvZmBcbi8vIGJlY2F1c2UgaXQgaXMgZnJhZ2lsZSBhbmQgY2FuIGJlIGVhc2lseSBmYWtlZCB3aXRoIGBPYmplY3QuY3JlYXRlKClgLlxuZnVuY3Rpb24gaXNBcnJheShhcikge1xuICByZXR1cm4gQXJyYXkuaXNBcnJheShhcik7XG59XG5leHBvcnRzLmlzQXJyYXkgPSBpc0FycmF5O1xuXG5mdW5jdGlvbiBpc0Jvb2xlYW4oYXJnKSB7XG4gIHJldHVybiB0eXBlb2YgYXJnID09PSAnYm9vbGVhbic7XG59XG5leHBvcnRzLmlzQm9vbGVhbiA9IGlzQm9vbGVhbjtcblxuZnVuY3Rpb24gaXNOdWxsKGFyZykge1xuICByZXR1cm4gYXJnID09PSBudWxsO1xufVxuZXhwb3J0cy5pc051bGwgPSBpc051bGw7XG5cbmZ1bmN0aW9uIGlzTnVsbE9yVW5kZWZpbmVkKGFyZykge1xuICByZXR1cm4gYXJnID09IG51bGw7XG59XG5leHBvcnRzLmlzTnVsbE9yVW5kZWZpbmVkID0gaXNOdWxsT3JVbmRlZmluZWQ7XG5cbmZ1bmN0aW9uIGlzTnVtYmVyKGFyZykge1xuICByZXR1cm4gdHlwZW9mIGFyZyA9PT0gJ251bWJlcic7XG59XG5leHBvcnRzLmlzTnVtYmVyID0gaXNOdW1iZXI7XG5cbmZ1bmN0aW9uIGlzU3RyaW5nKGFyZykge1xuICByZXR1cm4gdHlwZW9mIGFyZyA9PT0gJ3N0cmluZyc7XG59XG5leHBvcnRzLmlzU3RyaW5nID0gaXNTdHJpbmc7XG5cbmZ1bmN0aW9uIGlzU3ltYm9sKGFyZykge1xuICByZXR1cm4gdHlwZW9mIGFyZyA9PT0gJ3N5bWJvbCc7XG59XG5leHBvcnRzLmlzU3ltYm9sID0gaXNTeW1ib2w7XG5cbmZ1bmN0aW9uIGlzVW5kZWZpbmVkKGFyZykge1xuICByZXR1cm4gYXJnID09PSB2b2lkIDA7XG59XG5leHBvcnRzLmlzVW5kZWZpbmVkID0gaXNVbmRlZmluZWQ7XG5cbmZ1bmN0aW9uIGlzUmVnRXhwKHJlKSB7XG4gIHJldHVybiBpc09iamVjdChyZSkgJiYgb2JqZWN0VG9TdHJpbmcocmUpID09PSAnW29iamVjdCBSZWdFeHBdJztcbn1cbmV4cG9ydHMuaXNSZWdFeHAgPSBpc1JlZ0V4cDtcblxuZnVuY3Rpb24gaXNPYmplY3QoYXJnKSB7XG4gIHJldHVybiB0eXBlb2YgYXJnID09PSAnb2JqZWN0JyAmJiBhcmcgIT09IG51bGw7XG59XG5leHBvcnRzLmlzT2JqZWN0ID0gaXNPYmplY3Q7XG5cbmZ1bmN0aW9uIGlzRGF0ZShkKSB7XG4gIHJldHVybiBpc09iamVjdChkKSAmJiBvYmplY3RUb1N0cmluZyhkKSA9PT0gJ1tvYmplY3QgRGF0ZV0nO1xufVxuZXhwb3J0cy5pc0RhdGUgPSBpc0RhdGU7XG5cbmZ1bmN0aW9uIGlzRXJyb3IoZSkge1xuICByZXR1cm4gaXNPYmplY3QoZSkgJiZcbiAgICAgIChvYmplY3RUb1N0cmluZyhlKSA9PT0gJ1tvYmplY3QgRXJyb3JdJyB8fCBlIGluc3RhbmNlb2YgRXJyb3IpO1xufVxuZXhwb3J0cy5pc0Vycm9yID0gaXNFcnJvcjtcblxuZnVuY3Rpb24gaXNGdW5jdGlvbihhcmcpIHtcbiAgcmV0dXJuIHR5cGVvZiBhcmcgPT09ICdmdW5jdGlvbic7XG59XG5leHBvcnRzLmlzRnVuY3Rpb24gPSBpc0Z1bmN0aW9uO1xuXG5mdW5jdGlvbiBpc1ByaW1pdGl2ZShhcmcpIHtcbiAgcmV0dXJuIGFyZyA9PT0gbnVsbCB8fFxuICAgICAgICAgdHlwZW9mIGFyZyA9PT0gJ2Jvb2xlYW4nIHx8XG4gICAgICAgICB0eXBlb2YgYXJnID09PSAnbnVtYmVyJyB8fFxuICAgICAgICAgdHlwZW9mIGFyZyA9PT0gJ3N0cmluZycgfHxcbiAgICAgICAgIHR5cGVvZiBhcmcgPT09ICdzeW1ib2wnIHx8ICAvLyBFUzYgc3ltYm9sXG4gICAgICAgICB0eXBlb2YgYXJnID09PSAndW5kZWZpbmVkJztcbn1cbmV4cG9ydHMuaXNQcmltaXRpdmUgPSBpc1ByaW1pdGl2ZTtcblxuZXhwb3J0cy5pc0J1ZmZlciA9IHJlcXVpcmUoJy4vc3VwcG9ydC9pc0J1ZmZlcicpO1xuXG5mdW5jdGlvbiBvYmplY3RUb1N0cmluZyhvKSB7XG4gIHJldHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwobyk7XG59XG5cblxuZnVuY3Rpb24gcGFkKG4pIHtcbiAgcmV0dXJuIG4gPCAxMCA/ICcwJyArIG4udG9TdHJpbmcoMTApIDogbi50b1N0cmluZygxMCk7XG59XG5cblxudmFyIG1vbnRocyA9IFsnSmFuJywgJ0ZlYicsICdNYXInLCAnQXByJywgJ01heScsICdKdW4nLCAnSnVsJywgJ0F1ZycsICdTZXAnLFxuICAgICAgICAgICAgICAnT2N0JywgJ05vdicsICdEZWMnXTtcblxuLy8gMjYgRmViIDE2OjE5OjM0XG5mdW5jdGlvbiB0aW1lc3RhbXAoKSB7XG4gIHZhciBkID0gbmV3IERhdGUoKTtcbiAgdmFyIHRpbWUgPSBbcGFkKGQuZ2V0SG91cnMoKSksXG4gICAgICAgICAgICAgIHBhZChkLmdldE1pbnV0ZXMoKSksXG4gICAgICAgICAgICAgIHBhZChkLmdldFNlY29uZHMoKSldLmpvaW4oJzonKTtcbiAgcmV0dXJuIFtkLmdldERhdGUoKSwgbW9udGhzW2QuZ2V0TW9udGgoKV0sIHRpbWVdLmpvaW4oJyAnKTtcbn1cblxuXG4vLyBsb2cgaXMganVzdCBhIHRoaW4gd3JhcHBlciB0byBjb25zb2xlLmxvZyB0aGF0IHByZXBlbmRzIGEgdGltZXN0YW1wXG5leHBvcnRzLmxvZyA9IGZ1bmN0aW9uKCkge1xuICBjb25zb2xlLmxvZygnJXMgLSAlcycsIHRpbWVzdGFtcCgpLCBleHBvcnRzLmZvcm1hdC5hcHBseShleHBvcnRzLCBhcmd1bWVudHMpKTtcbn07XG5cblxuLyoqXG4gKiBJbmhlcml0IHRoZSBwcm90b3R5cGUgbWV0aG9kcyBmcm9tIG9uZSBjb25zdHJ1Y3RvciBpbnRvIGFub3RoZXIuXG4gKlxuICogVGhlIEZ1bmN0aW9uLnByb3RvdHlwZS5pbmhlcml0cyBmcm9tIGxhbmcuanMgcmV3cml0dGVuIGFzIGEgc3RhbmRhbG9uZVxuICogZnVuY3Rpb24gKG5vdCBvbiBGdW5jdGlvbi5wcm90b3R5cGUpLiBOT1RFOiBJZiB0aGlzIGZpbGUgaXMgdG8gYmUgbG9hZGVkXG4gKiBkdXJpbmcgYm9vdHN0cmFwcGluZyB0aGlzIGZ1bmN0aW9uIG5lZWRzIHRvIGJlIHJld3JpdHRlbiB1c2luZyBzb21lIG5hdGl2ZVxuICogZnVuY3Rpb25zIGFzIHByb3RvdHlwZSBzZXR1cCB1c2luZyBub3JtYWwgSmF2YVNjcmlwdCBkb2VzIG5vdCB3b3JrIGFzXG4gKiBleHBlY3RlZCBkdXJpbmcgYm9vdHN0cmFwcGluZyAoc2VlIG1pcnJvci5qcyBpbiByMTE0OTAzKS5cbiAqXG4gKiBAcGFyYW0ge2Z1bmN0aW9ufSBjdG9yIENvbnN0cnVjdG9yIGZ1bmN0aW9uIHdoaWNoIG5lZWRzIHRvIGluaGVyaXQgdGhlXG4gKiAgICAgcHJvdG90eXBlLlxuICogQHBhcmFtIHtmdW5jdGlvbn0gc3VwZXJDdG9yIENvbnN0cnVjdG9yIGZ1bmN0aW9uIHRvIGluaGVyaXQgcHJvdG90eXBlIGZyb20uXG4gKi9cbmV4cG9ydHMuaW5oZXJpdHMgPSByZXF1aXJlKCdpbmhlcml0cycpO1xuXG5leHBvcnRzLl9leHRlbmQgPSBmdW5jdGlvbihvcmlnaW4sIGFkZCkge1xuICAvLyBEb24ndCBkbyBhbnl0aGluZyBpZiBhZGQgaXNuJ3QgYW4gb2JqZWN0XG4gIGlmICghYWRkIHx8ICFpc09iamVjdChhZGQpKSByZXR1cm4gb3JpZ2luO1xuXG4gIHZhciBrZXlzID0gT2JqZWN0LmtleXMoYWRkKTtcbiAgdmFyIGkgPSBrZXlzLmxlbmd0aDtcbiAgd2hpbGUgKGktLSkge1xuICAgIG9yaWdpbltrZXlzW2ldXSA9IGFkZFtrZXlzW2ldXTtcbiAgfVxuICByZXR1cm4gb3JpZ2luO1xufTtcblxuZnVuY3Rpb24gaGFzT3duUHJvcGVydHkob2JqLCBwcm9wKSB7XG4gIHJldHVybiBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5LmNhbGwob2JqLCBwcm9wKTtcbn1cbiIsInJlcXVpcmUoJy4uL21vZHVsZXMvZXM2Lm9iamVjdC50by1zdHJpbmcnKTtcbnJlcXVpcmUoJy4uL21vZHVsZXMvZXM2LnN0cmluZy5pdGVyYXRvcicpO1xucmVxdWlyZSgnLi4vbW9kdWxlcy93ZWIuZG9tLml0ZXJhYmxlJyk7XG5yZXF1aXJlKCcuLi9tb2R1bGVzL2VzNi5wcm9taXNlJyk7XG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4uL21vZHVsZXMvX2NvcmUnKS5Qcm9taXNlOyIsIm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oaXQpe1xuICBpZih0eXBlb2YgaXQgIT0gJ2Z1bmN0aW9uJyl0aHJvdyBUeXBlRXJyb3IoaXQgKyAnIGlzIG5vdCBhIGZ1bmN0aW9uIScpO1xuICByZXR1cm4gaXQ7XG59OyIsIi8vIDIyLjEuMy4zMSBBcnJheS5wcm90b3R5cGVbQEB1bnNjb3BhYmxlc11cbnZhciBVTlNDT1BBQkxFUyA9IHJlcXVpcmUoJy4vX3drcycpKCd1bnNjb3BhYmxlcycpXG4gICwgQXJyYXlQcm90byAgPSBBcnJheS5wcm90b3R5cGU7XG5pZihBcnJheVByb3RvW1VOU0NPUEFCTEVTXSA9PSB1bmRlZmluZWQpcmVxdWlyZSgnLi9faGlkZScpKEFycmF5UHJvdG8sIFVOU0NPUEFCTEVTLCB7fSk7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGtleSl7XG4gIEFycmF5UHJvdG9bVU5TQ09QQUJMRVNdW2tleV0gPSB0cnVlO1xufTsiLCJtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGl0LCBDb25zdHJ1Y3RvciwgbmFtZSwgZm9yYmlkZGVuRmllbGQpe1xuICBpZighKGl0IGluc3RhbmNlb2YgQ29uc3RydWN0b3IpIHx8IChmb3JiaWRkZW5GaWVsZCAhPT0gdW5kZWZpbmVkICYmIGZvcmJpZGRlbkZpZWxkIGluIGl0KSl7XG4gICAgdGhyb3cgVHlwZUVycm9yKG5hbWUgKyAnOiBpbmNvcnJlY3QgaW52b2NhdGlvbiEnKTtcbiAgfSByZXR1cm4gaXQ7XG59OyIsInZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4vX2lzLW9iamVjdCcpO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihpdCl7XG4gIGlmKCFpc09iamVjdChpdCkpdGhyb3cgVHlwZUVycm9yKGl0ICsgJyBpcyBub3QgYW4gb2JqZWN0IScpO1xuICByZXR1cm4gaXQ7XG59OyIsIi8vIGZhbHNlIC0+IEFycmF5I2luZGV4T2Zcbi8vIHRydWUgIC0+IEFycmF5I2luY2x1ZGVzXG52YXIgdG9JT2JqZWN0ID0gcmVxdWlyZSgnLi9fdG8taW9iamVjdCcpXG4gICwgdG9MZW5ndGggID0gcmVxdWlyZSgnLi9fdG8tbGVuZ3RoJylcbiAgLCB0b0luZGV4ICAgPSByZXF1aXJlKCcuL190by1pbmRleCcpO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihJU19JTkNMVURFUyl7XG4gIHJldHVybiBmdW5jdGlvbigkdGhpcywgZWwsIGZyb21JbmRleCl7XG4gICAgdmFyIE8gICAgICA9IHRvSU9iamVjdCgkdGhpcylcbiAgICAgICwgbGVuZ3RoID0gdG9MZW5ndGgoTy5sZW5ndGgpXG4gICAgICAsIGluZGV4ICA9IHRvSW5kZXgoZnJvbUluZGV4LCBsZW5ndGgpXG4gICAgICAsIHZhbHVlO1xuICAgIC8vIEFycmF5I2luY2x1ZGVzIHVzZXMgU2FtZVZhbHVlWmVybyBlcXVhbGl0eSBhbGdvcml0aG1cbiAgICBpZihJU19JTkNMVURFUyAmJiBlbCAhPSBlbCl3aGlsZShsZW5ndGggPiBpbmRleCl7XG4gICAgICB2YWx1ZSA9IE9baW5kZXgrK107XG4gICAgICBpZih2YWx1ZSAhPSB2YWx1ZSlyZXR1cm4gdHJ1ZTtcbiAgICAvLyBBcnJheSN0b0luZGV4IGlnbm9yZXMgaG9sZXMsIEFycmF5I2luY2x1ZGVzIC0gbm90XG4gICAgfSBlbHNlIGZvcig7bGVuZ3RoID4gaW5kZXg7IGluZGV4KyspaWYoSVNfSU5DTFVERVMgfHwgaW5kZXggaW4gTyl7XG4gICAgICBpZihPW2luZGV4XSA9PT0gZWwpcmV0dXJuIElTX0lOQ0xVREVTIHx8IGluZGV4IHx8IDA7XG4gICAgfSByZXR1cm4gIUlTX0lOQ0xVREVTICYmIC0xO1xuICB9O1xufTsiLCIvLyBnZXR0aW5nIHRhZyBmcm9tIDE5LjEuMy42IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcoKVxudmFyIGNvZiA9IHJlcXVpcmUoJy4vX2NvZicpXG4gICwgVEFHID0gcmVxdWlyZSgnLi9fd2tzJykoJ3RvU3RyaW5nVGFnJylcbiAgLy8gRVMzIHdyb25nIGhlcmVcbiAgLCBBUkcgPSBjb2YoZnVuY3Rpb24oKXsgcmV0dXJuIGFyZ3VtZW50czsgfSgpKSA9PSAnQXJndW1lbnRzJztcblxuLy8gZmFsbGJhY2sgZm9yIElFMTEgU2NyaXB0IEFjY2VzcyBEZW5pZWQgZXJyb3JcbnZhciB0cnlHZXQgPSBmdW5jdGlvbihpdCwga2V5KXtcbiAgdHJ5IHtcbiAgICByZXR1cm4gaXRba2V5XTtcbiAgfSBjYXRjaChlKXsgLyogZW1wdHkgKi8gfVxufTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihpdCl7XG4gIHZhciBPLCBULCBCO1xuICByZXR1cm4gaXQgPT09IHVuZGVmaW5lZCA/ICdVbmRlZmluZWQnIDogaXQgPT09IG51bGwgPyAnTnVsbCdcbiAgICAvLyBAQHRvU3RyaW5nVGFnIGNhc2VcbiAgICA6IHR5cGVvZiAoVCA9IHRyeUdldChPID0gT2JqZWN0KGl0KSwgVEFHKSkgPT0gJ3N0cmluZycgPyBUXG4gICAgLy8gYnVpbHRpblRhZyBjYXNlXG4gICAgOiBBUkcgPyBjb2YoTylcbiAgICAvLyBFUzMgYXJndW1lbnRzIGZhbGxiYWNrXG4gICAgOiAoQiA9IGNvZihPKSkgPT0gJ09iamVjdCcgJiYgdHlwZW9mIE8uY2FsbGVlID09ICdmdW5jdGlvbicgPyAnQXJndW1lbnRzJyA6IEI7XG59OyIsInZhciB0b1N0cmluZyA9IHt9LnRvU3RyaW5nO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGl0KXtcbiAgcmV0dXJuIHRvU3RyaW5nLmNhbGwoaXQpLnNsaWNlKDgsIC0xKTtcbn07IiwidmFyIGNvcmUgPSBtb2R1bGUuZXhwb3J0cyA9IHt2ZXJzaW9uOiAnMi40LjAnfTtcbmlmKHR5cGVvZiBfX2UgPT0gJ251bWJlcicpX19lID0gY29yZTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bmRlZiIsIi8vIG9wdGlvbmFsIC8gc2ltcGxlIGNvbnRleHQgYmluZGluZ1xudmFyIGFGdW5jdGlvbiA9IHJlcXVpcmUoJy4vX2EtZnVuY3Rpb24nKTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oZm4sIHRoYXQsIGxlbmd0aCl7XG4gIGFGdW5jdGlvbihmbik7XG4gIGlmKHRoYXQgPT09IHVuZGVmaW5lZClyZXR1cm4gZm47XG4gIHN3aXRjaChsZW5ndGgpe1xuICAgIGNhc2UgMTogcmV0dXJuIGZ1bmN0aW9uKGEpe1xuICAgICAgcmV0dXJuIGZuLmNhbGwodGhhdCwgYSk7XG4gICAgfTtcbiAgICBjYXNlIDI6IHJldHVybiBmdW5jdGlvbihhLCBiKXtcbiAgICAgIHJldHVybiBmbi5jYWxsKHRoYXQsIGEsIGIpO1xuICAgIH07XG4gICAgY2FzZSAzOiByZXR1cm4gZnVuY3Rpb24oYSwgYiwgYyl7XG4gICAgICByZXR1cm4gZm4uY2FsbCh0aGF0LCBhLCBiLCBjKTtcbiAgICB9O1xuICB9XG4gIHJldHVybiBmdW5jdGlvbigvKiAuLi5hcmdzICovKXtcbiAgICByZXR1cm4gZm4uYXBwbHkodGhhdCwgYXJndW1lbnRzKTtcbiAgfTtcbn07IiwiLy8gNy4yLjEgUmVxdWlyZU9iamVjdENvZXJjaWJsZShhcmd1bWVudClcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oaXQpe1xuICBpZihpdCA9PSB1bmRlZmluZWQpdGhyb3cgVHlwZUVycm9yKFwiQ2FuJ3QgY2FsbCBtZXRob2Qgb24gIFwiICsgaXQpO1xuICByZXR1cm4gaXQ7XG59OyIsIi8vIFRoYW5rJ3MgSUU4IGZvciBoaXMgZnVubnkgZGVmaW5lUHJvcGVydHlcbm1vZHVsZS5leHBvcnRzID0gIXJlcXVpcmUoJy4vX2ZhaWxzJykoZnVuY3Rpb24oKXtcbiAgcmV0dXJuIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh7fSwgJ2EnLCB7Z2V0OiBmdW5jdGlvbigpeyByZXR1cm4gNzsgfX0pLmEgIT0gNztcbn0pOyIsInZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4vX2lzLW9iamVjdCcpXG4gICwgZG9jdW1lbnQgPSByZXF1aXJlKCcuL19nbG9iYWwnKS5kb2N1bWVudFxuICAvLyBpbiBvbGQgSUUgdHlwZW9mIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQgaXMgJ29iamVjdCdcbiAgLCBpcyA9IGlzT2JqZWN0KGRvY3VtZW50KSAmJiBpc09iamVjdChkb2N1bWVudC5jcmVhdGVFbGVtZW50KTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oaXQpe1xuICByZXR1cm4gaXMgPyBkb2N1bWVudC5jcmVhdGVFbGVtZW50KGl0KSA6IHt9O1xufTsiLCIvLyBJRSA4LSBkb24ndCBlbnVtIGJ1ZyBrZXlzXG5tb2R1bGUuZXhwb3J0cyA9IChcbiAgJ2NvbnN0cnVjdG9yLGhhc093blByb3BlcnR5LGlzUHJvdG90eXBlT2YscHJvcGVydHlJc0VudW1lcmFibGUsdG9Mb2NhbGVTdHJpbmcsdG9TdHJpbmcsdmFsdWVPZidcbikuc3BsaXQoJywnKTsiLCJ2YXIgZ2xvYmFsICAgID0gcmVxdWlyZSgnLi9fZ2xvYmFsJylcbiAgLCBjb3JlICAgICAgPSByZXF1aXJlKCcuL19jb3JlJylcbiAgLCBoaWRlICAgICAgPSByZXF1aXJlKCcuL19oaWRlJylcbiAgLCByZWRlZmluZSAgPSByZXF1aXJlKCcuL19yZWRlZmluZScpXG4gICwgY3R4ICAgICAgID0gcmVxdWlyZSgnLi9fY3R4JylcbiAgLCBQUk9UT1RZUEUgPSAncHJvdG90eXBlJztcblxudmFyICRleHBvcnQgPSBmdW5jdGlvbih0eXBlLCBuYW1lLCBzb3VyY2Upe1xuICB2YXIgSVNfRk9SQ0VEID0gdHlwZSAmICRleHBvcnQuRlxuICAgICwgSVNfR0xPQkFMID0gdHlwZSAmICRleHBvcnQuR1xuICAgICwgSVNfU1RBVElDID0gdHlwZSAmICRleHBvcnQuU1xuICAgICwgSVNfUFJPVE8gID0gdHlwZSAmICRleHBvcnQuUFxuICAgICwgSVNfQklORCAgID0gdHlwZSAmICRleHBvcnQuQlxuICAgICwgdGFyZ2V0ICAgID0gSVNfR0xPQkFMID8gZ2xvYmFsIDogSVNfU1RBVElDID8gZ2xvYmFsW25hbWVdIHx8IChnbG9iYWxbbmFtZV0gPSB7fSkgOiAoZ2xvYmFsW25hbWVdIHx8IHt9KVtQUk9UT1RZUEVdXG4gICAgLCBleHBvcnRzICAgPSBJU19HTE9CQUwgPyBjb3JlIDogY29yZVtuYW1lXSB8fCAoY29yZVtuYW1lXSA9IHt9KVxuICAgICwgZXhwUHJvdG8gID0gZXhwb3J0c1tQUk9UT1RZUEVdIHx8IChleHBvcnRzW1BST1RPVFlQRV0gPSB7fSlcbiAgICAsIGtleSwgb3duLCBvdXQsIGV4cDtcbiAgaWYoSVNfR0xPQkFMKXNvdXJjZSA9IG5hbWU7XG4gIGZvcihrZXkgaW4gc291cmNlKXtcbiAgICAvLyBjb250YWlucyBpbiBuYXRpdmVcbiAgICBvd24gPSAhSVNfRk9SQ0VEICYmIHRhcmdldCAmJiB0YXJnZXRba2V5XSAhPT0gdW5kZWZpbmVkO1xuICAgIC8vIGV4cG9ydCBuYXRpdmUgb3IgcGFzc2VkXG4gICAgb3V0ID0gKG93biA/IHRhcmdldCA6IHNvdXJjZSlba2V5XTtcbiAgICAvLyBiaW5kIHRpbWVycyB0byBnbG9iYWwgZm9yIGNhbGwgZnJvbSBleHBvcnQgY29udGV4dFxuICAgIGV4cCA9IElTX0JJTkQgJiYgb3duID8gY3R4KG91dCwgZ2xvYmFsKSA6IElTX1BST1RPICYmIHR5cGVvZiBvdXQgPT0gJ2Z1bmN0aW9uJyA/IGN0eChGdW5jdGlvbi5jYWxsLCBvdXQpIDogb3V0O1xuICAgIC8vIGV4dGVuZCBnbG9iYWxcbiAgICBpZih0YXJnZXQpcmVkZWZpbmUodGFyZ2V0LCBrZXksIG91dCwgdHlwZSAmICRleHBvcnQuVSk7XG4gICAgLy8gZXhwb3J0XG4gICAgaWYoZXhwb3J0c1trZXldICE9IG91dCloaWRlKGV4cG9ydHMsIGtleSwgZXhwKTtcbiAgICBpZihJU19QUk9UTyAmJiBleHBQcm90b1trZXldICE9IG91dClleHBQcm90b1trZXldID0gb3V0O1xuICB9XG59O1xuZ2xvYmFsLmNvcmUgPSBjb3JlO1xuLy8gdHlwZSBiaXRtYXBcbiRleHBvcnQuRiA9IDE7ICAgLy8gZm9yY2VkXG4kZXhwb3J0LkcgPSAyOyAgIC8vIGdsb2JhbFxuJGV4cG9ydC5TID0gNDsgICAvLyBzdGF0aWNcbiRleHBvcnQuUCA9IDg7ICAgLy8gcHJvdG9cbiRleHBvcnQuQiA9IDE2OyAgLy8gYmluZFxuJGV4cG9ydC5XID0gMzI7ICAvLyB3cmFwXG4kZXhwb3J0LlUgPSA2NDsgIC8vIHNhZmVcbiRleHBvcnQuUiA9IDEyODsgLy8gcmVhbCBwcm90byBtZXRob2QgZm9yIGBsaWJyYXJ5YCBcbm1vZHVsZS5leHBvcnRzID0gJGV4cG9ydDsiLCJtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGV4ZWMpe1xuICB0cnkge1xuICAgIHJldHVybiAhIWV4ZWMoKTtcbiAgfSBjYXRjaChlKXtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxufTsiLCJ2YXIgY3R4ICAgICAgICAgPSByZXF1aXJlKCcuL19jdHgnKVxuICAsIGNhbGwgICAgICAgID0gcmVxdWlyZSgnLi9faXRlci1jYWxsJylcbiAgLCBpc0FycmF5SXRlciA9IHJlcXVpcmUoJy4vX2lzLWFycmF5LWl0ZXInKVxuICAsIGFuT2JqZWN0ICAgID0gcmVxdWlyZSgnLi9fYW4tb2JqZWN0JylcbiAgLCB0b0xlbmd0aCAgICA9IHJlcXVpcmUoJy4vX3RvLWxlbmd0aCcpXG4gICwgZ2V0SXRlckZuICAgPSByZXF1aXJlKCcuL2NvcmUuZ2V0LWl0ZXJhdG9yLW1ldGhvZCcpXG4gICwgQlJFQUsgICAgICAgPSB7fVxuICAsIFJFVFVSTiAgICAgID0ge307XG52YXIgZXhwb3J0cyA9IG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oaXRlcmFibGUsIGVudHJpZXMsIGZuLCB0aGF0LCBJVEVSQVRPUil7XG4gIHZhciBpdGVyRm4gPSBJVEVSQVRPUiA/IGZ1bmN0aW9uKCl7IHJldHVybiBpdGVyYWJsZTsgfSA6IGdldEl0ZXJGbihpdGVyYWJsZSlcbiAgICAsIGYgICAgICA9IGN0eChmbiwgdGhhdCwgZW50cmllcyA/IDIgOiAxKVxuICAgICwgaW5kZXggID0gMFxuICAgICwgbGVuZ3RoLCBzdGVwLCBpdGVyYXRvciwgcmVzdWx0O1xuICBpZih0eXBlb2YgaXRlckZuICE9ICdmdW5jdGlvbicpdGhyb3cgVHlwZUVycm9yKGl0ZXJhYmxlICsgJyBpcyBub3QgaXRlcmFibGUhJyk7XG4gIC8vIGZhc3QgY2FzZSBmb3IgYXJyYXlzIHdpdGggZGVmYXVsdCBpdGVyYXRvclxuICBpZihpc0FycmF5SXRlcihpdGVyRm4pKWZvcihsZW5ndGggPSB0b0xlbmd0aChpdGVyYWJsZS5sZW5ndGgpOyBsZW5ndGggPiBpbmRleDsgaW5kZXgrKyl7XG4gICAgcmVzdWx0ID0gZW50cmllcyA/IGYoYW5PYmplY3Qoc3RlcCA9IGl0ZXJhYmxlW2luZGV4XSlbMF0sIHN0ZXBbMV0pIDogZihpdGVyYWJsZVtpbmRleF0pO1xuICAgIGlmKHJlc3VsdCA9PT0gQlJFQUsgfHwgcmVzdWx0ID09PSBSRVRVUk4pcmV0dXJuIHJlc3VsdDtcbiAgfSBlbHNlIGZvcihpdGVyYXRvciA9IGl0ZXJGbi5jYWxsKGl0ZXJhYmxlKTsgIShzdGVwID0gaXRlcmF0b3IubmV4dCgpKS5kb25lOyApe1xuICAgIHJlc3VsdCA9IGNhbGwoaXRlcmF0b3IsIGYsIHN0ZXAudmFsdWUsIGVudHJpZXMpO1xuICAgIGlmKHJlc3VsdCA9PT0gQlJFQUsgfHwgcmVzdWx0ID09PSBSRVRVUk4pcmV0dXJuIHJlc3VsdDtcbiAgfVxufTtcbmV4cG9ydHMuQlJFQUsgID0gQlJFQUs7XG5leHBvcnRzLlJFVFVSTiA9IFJFVFVSTjsiLCIvLyBodHRwczovL2dpdGh1Yi5jb20vemxvaXJvY2svY29yZS1qcy9pc3N1ZXMvODYjaXNzdWVjb21tZW50LTExNTc1OTAyOFxudmFyIGdsb2JhbCA9IG1vZHVsZS5leHBvcnRzID0gdHlwZW9mIHdpbmRvdyAhPSAndW5kZWZpbmVkJyAmJiB3aW5kb3cuTWF0aCA9PSBNYXRoXG4gID8gd2luZG93IDogdHlwZW9mIHNlbGYgIT0gJ3VuZGVmaW5lZCcgJiYgc2VsZi5NYXRoID09IE1hdGggPyBzZWxmIDogRnVuY3Rpb24oJ3JldHVybiB0aGlzJykoKTtcbmlmKHR5cGVvZiBfX2cgPT0gJ251bWJlcicpX19nID0gZ2xvYmFsOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVuZGVmIiwidmFyIGhhc093blByb3BlcnR5ID0ge30uaGFzT3duUHJvcGVydHk7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGl0LCBrZXkpe1xuICByZXR1cm4gaGFzT3duUHJvcGVydHkuY2FsbChpdCwga2V5KTtcbn07IiwidmFyIGRQICAgICAgICAgPSByZXF1aXJlKCcuL19vYmplY3QtZHAnKVxuICAsIGNyZWF0ZURlc2MgPSByZXF1aXJlKCcuL19wcm9wZXJ0eS1kZXNjJyk7XG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vX2Rlc2NyaXB0b3JzJykgPyBmdW5jdGlvbihvYmplY3QsIGtleSwgdmFsdWUpe1xuICByZXR1cm4gZFAuZihvYmplY3QsIGtleSwgY3JlYXRlRGVzYygxLCB2YWx1ZSkpO1xufSA6IGZ1bmN0aW9uKG9iamVjdCwga2V5LCB2YWx1ZSl7XG4gIG9iamVjdFtrZXldID0gdmFsdWU7XG4gIHJldHVybiBvYmplY3Q7XG59OyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9fZ2xvYmFsJykuZG9jdW1lbnQgJiYgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50OyIsIm1vZHVsZS5leHBvcnRzID0gIXJlcXVpcmUoJy4vX2Rlc2NyaXB0b3JzJykgJiYgIXJlcXVpcmUoJy4vX2ZhaWxzJykoZnVuY3Rpb24oKXtcbiAgcmV0dXJuIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShyZXF1aXJlKCcuL19kb20tY3JlYXRlJykoJ2RpdicpLCAnYScsIHtnZXQ6IGZ1bmN0aW9uKCl7IHJldHVybiA3OyB9fSkuYSAhPSA3O1xufSk7IiwiLy8gZmFzdCBhcHBseSwgaHR0cDovL2pzcGVyZi5sbmtpdC5jb20vZmFzdC1hcHBseS81XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGZuLCBhcmdzLCB0aGF0KXtcbiAgdmFyIHVuID0gdGhhdCA9PT0gdW5kZWZpbmVkO1xuICBzd2l0Y2goYXJncy5sZW5ndGgpe1xuICAgIGNhc2UgMDogcmV0dXJuIHVuID8gZm4oKVxuICAgICAgICAgICAgICAgICAgICAgIDogZm4uY2FsbCh0aGF0KTtcbiAgICBjYXNlIDE6IHJldHVybiB1biA/IGZuKGFyZ3NbMF0pXG4gICAgICAgICAgICAgICAgICAgICAgOiBmbi5jYWxsKHRoYXQsIGFyZ3NbMF0pO1xuICAgIGNhc2UgMjogcmV0dXJuIHVuID8gZm4oYXJnc1swXSwgYXJnc1sxXSlcbiAgICAgICAgICAgICAgICAgICAgICA6IGZuLmNhbGwodGhhdCwgYXJnc1swXSwgYXJnc1sxXSk7XG4gICAgY2FzZSAzOiByZXR1cm4gdW4gPyBmbihhcmdzWzBdLCBhcmdzWzFdLCBhcmdzWzJdKVxuICAgICAgICAgICAgICAgICAgICAgIDogZm4uY2FsbCh0aGF0LCBhcmdzWzBdLCBhcmdzWzFdLCBhcmdzWzJdKTtcbiAgICBjYXNlIDQ6IHJldHVybiB1biA/IGZuKGFyZ3NbMF0sIGFyZ3NbMV0sIGFyZ3NbMl0sIGFyZ3NbM10pXG4gICAgICAgICAgICAgICAgICAgICAgOiBmbi5jYWxsKHRoYXQsIGFyZ3NbMF0sIGFyZ3NbMV0sIGFyZ3NbMl0sIGFyZ3NbM10pO1xuICB9IHJldHVybiAgICAgICAgICAgICAgZm4uYXBwbHkodGhhdCwgYXJncyk7XG59OyIsIi8vIGZhbGxiYWNrIGZvciBub24tYXJyYXktbGlrZSBFUzMgYW5kIG5vbi1lbnVtZXJhYmxlIG9sZCBWOCBzdHJpbmdzXG52YXIgY29mID0gcmVxdWlyZSgnLi9fY29mJyk7XG5tb2R1bGUuZXhwb3J0cyA9IE9iamVjdCgneicpLnByb3BlcnR5SXNFbnVtZXJhYmxlKDApID8gT2JqZWN0IDogZnVuY3Rpb24oaXQpe1xuICByZXR1cm4gY29mKGl0KSA9PSAnU3RyaW5nJyA/IGl0LnNwbGl0KCcnKSA6IE9iamVjdChpdCk7XG59OyIsIi8vIGNoZWNrIG9uIGRlZmF1bHQgQXJyYXkgaXRlcmF0b3JcbnZhciBJdGVyYXRvcnMgID0gcmVxdWlyZSgnLi9faXRlcmF0b3JzJylcbiAgLCBJVEVSQVRPUiAgID0gcmVxdWlyZSgnLi9fd2tzJykoJ2l0ZXJhdG9yJylcbiAgLCBBcnJheVByb3RvID0gQXJyYXkucHJvdG90eXBlO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGl0KXtcbiAgcmV0dXJuIGl0ICE9PSB1bmRlZmluZWQgJiYgKEl0ZXJhdG9ycy5BcnJheSA9PT0gaXQgfHwgQXJyYXlQcm90b1tJVEVSQVRPUl0gPT09IGl0KTtcbn07IiwibW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihpdCl7XG4gIHJldHVybiB0eXBlb2YgaXQgPT09ICdvYmplY3QnID8gaXQgIT09IG51bGwgOiB0eXBlb2YgaXQgPT09ICdmdW5jdGlvbic7XG59OyIsIi8vIGNhbGwgc29tZXRoaW5nIG9uIGl0ZXJhdG9yIHN0ZXAgd2l0aCBzYWZlIGNsb3Npbmcgb24gZXJyb3JcbnZhciBhbk9iamVjdCA9IHJlcXVpcmUoJy4vX2FuLW9iamVjdCcpO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihpdGVyYXRvciwgZm4sIHZhbHVlLCBlbnRyaWVzKXtcbiAgdHJ5IHtcbiAgICByZXR1cm4gZW50cmllcyA/IGZuKGFuT2JqZWN0KHZhbHVlKVswXSwgdmFsdWVbMV0pIDogZm4odmFsdWUpO1xuICAvLyA3LjQuNiBJdGVyYXRvckNsb3NlKGl0ZXJhdG9yLCBjb21wbGV0aW9uKVxuICB9IGNhdGNoKGUpe1xuICAgIHZhciByZXQgPSBpdGVyYXRvclsncmV0dXJuJ107XG4gICAgaWYocmV0ICE9PSB1bmRlZmluZWQpYW5PYmplY3QocmV0LmNhbGwoaXRlcmF0b3IpKTtcbiAgICB0aHJvdyBlO1xuICB9XG59OyIsIid1c2Ugc3RyaWN0JztcbnZhciBjcmVhdGUgICAgICAgICA9IHJlcXVpcmUoJy4vX29iamVjdC1jcmVhdGUnKVxuICAsIGRlc2NyaXB0b3IgICAgID0gcmVxdWlyZSgnLi9fcHJvcGVydHktZGVzYycpXG4gICwgc2V0VG9TdHJpbmdUYWcgPSByZXF1aXJlKCcuL19zZXQtdG8tc3RyaW5nLXRhZycpXG4gICwgSXRlcmF0b3JQcm90b3R5cGUgPSB7fTtcblxuLy8gMjUuMS4yLjEuMSAlSXRlcmF0b3JQcm90b3R5cGUlW0BAaXRlcmF0b3JdKClcbnJlcXVpcmUoJy4vX2hpZGUnKShJdGVyYXRvclByb3RvdHlwZSwgcmVxdWlyZSgnLi9fd2tzJykoJ2l0ZXJhdG9yJyksIGZ1bmN0aW9uKCl7IHJldHVybiB0aGlzOyB9KTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihDb25zdHJ1Y3RvciwgTkFNRSwgbmV4dCl7XG4gIENvbnN0cnVjdG9yLnByb3RvdHlwZSA9IGNyZWF0ZShJdGVyYXRvclByb3RvdHlwZSwge25leHQ6IGRlc2NyaXB0b3IoMSwgbmV4dCl9KTtcbiAgc2V0VG9TdHJpbmdUYWcoQ29uc3RydWN0b3IsIE5BTUUgKyAnIEl0ZXJhdG9yJyk7XG59OyIsIid1c2Ugc3RyaWN0JztcbnZhciBMSUJSQVJZICAgICAgICA9IHJlcXVpcmUoJy4vX2xpYnJhcnknKVxuICAsICRleHBvcnQgICAgICAgID0gcmVxdWlyZSgnLi9fZXhwb3J0JylcbiAgLCByZWRlZmluZSAgICAgICA9IHJlcXVpcmUoJy4vX3JlZGVmaW5lJylcbiAgLCBoaWRlICAgICAgICAgICA9IHJlcXVpcmUoJy4vX2hpZGUnKVxuICAsIGhhcyAgICAgICAgICAgID0gcmVxdWlyZSgnLi9faGFzJylcbiAgLCBJdGVyYXRvcnMgICAgICA9IHJlcXVpcmUoJy4vX2l0ZXJhdG9ycycpXG4gICwgJGl0ZXJDcmVhdGUgICAgPSByZXF1aXJlKCcuL19pdGVyLWNyZWF0ZScpXG4gICwgc2V0VG9TdHJpbmdUYWcgPSByZXF1aXJlKCcuL19zZXQtdG8tc3RyaW5nLXRhZycpXG4gICwgZ2V0UHJvdG90eXBlT2YgPSByZXF1aXJlKCcuL19vYmplY3QtZ3BvJylcbiAgLCBJVEVSQVRPUiAgICAgICA9IHJlcXVpcmUoJy4vX3drcycpKCdpdGVyYXRvcicpXG4gICwgQlVHR1kgICAgICAgICAgPSAhKFtdLmtleXMgJiYgJ25leHQnIGluIFtdLmtleXMoKSkgLy8gU2FmYXJpIGhhcyBidWdneSBpdGVyYXRvcnMgdy9vIGBuZXh0YFxuICAsIEZGX0lURVJBVE9SICAgID0gJ0BAaXRlcmF0b3InXG4gICwgS0VZUyAgICAgICAgICAgPSAna2V5cydcbiAgLCBWQUxVRVMgICAgICAgICA9ICd2YWx1ZXMnO1xuXG52YXIgcmV0dXJuVGhpcyA9IGZ1bmN0aW9uKCl7IHJldHVybiB0aGlzOyB9O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKEJhc2UsIE5BTUUsIENvbnN0cnVjdG9yLCBuZXh0LCBERUZBVUxULCBJU19TRVQsIEZPUkNFRCl7XG4gICRpdGVyQ3JlYXRlKENvbnN0cnVjdG9yLCBOQU1FLCBuZXh0KTtcbiAgdmFyIGdldE1ldGhvZCA9IGZ1bmN0aW9uKGtpbmQpe1xuICAgIGlmKCFCVUdHWSAmJiBraW5kIGluIHByb3RvKXJldHVybiBwcm90b1traW5kXTtcbiAgICBzd2l0Y2goa2luZCl7XG4gICAgICBjYXNlIEtFWVM6IHJldHVybiBmdW5jdGlvbiBrZXlzKCl7IHJldHVybiBuZXcgQ29uc3RydWN0b3IodGhpcywga2luZCk7IH07XG4gICAgICBjYXNlIFZBTFVFUzogcmV0dXJuIGZ1bmN0aW9uIHZhbHVlcygpeyByZXR1cm4gbmV3IENvbnN0cnVjdG9yKHRoaXMsIGtpbmQpOyB9O1xuICAgIH0gcmV0dXJuIGZ1bmN0aW9uIGVudHJpZXMoKXsgcmV0dXJuIG5ldyBDb25zdHJ1Y3Rvcih0aGlzLCBraW5kKTsgfTtcbiAgfTtcbiAgdmFyIFRBRyAgICAgICAgPSBOQU1FICsgJyBJdGVyYXRvcidcbiAgICAsIERFRl9WQUxVRVMgPSBERUZBVUxUID09IFZBTFVFU1xuICAgICwgVkFMVUVTX0JVRyA9IGZhbHNlXG4gICAgLCBwcm90byAgICAgID0gQmFzZS5wcm90b3R5cGVcbiAgICAsICRuYXRpdmUgICAgPSBwcm90b1tJVEVSQVRPUl0gfHwgcHJvdG9bRkZfSVRFUkFUT1JdIHx8IERFRkFVTFQgJiYgcHJvdG9bREVGQVVMVF1cbiAgICAsICRkZWZhdWx0ICAgPSAkbmF0aXZlIHx8IGdldE1ldGhvZChERUZBVUxUKVxuICAgICwgJGVudHJpZXMgICA9IERFRkFVTFQgPyAhREVGX1ZBTFVFUyA/ICRkZWZhdWx0IDogZ2V0TWV0aG9kKCdlbnRyaWVzJykgOiB1bmRlZmluZWRcbiAgICAsICRhbnlOYXRpdmUgPSBOQU1FID09ICdBcnJheScgPyBwcm90by5lbnRyaWVzIHx8ICRuYXRpdmUgOiAkbmF0aXZlXG4gICAgLCBtZXRob2RzLCBrZXksIEl0ZXJhdG9yUHJvdG90eXBlO1xuICAvLyBGaXggbmF0aXZlXG4gIGlmKCRhbnlOYXRpdmUpe1xuICAgIEl0ZXJhdG9yUHJvdG90eXBlID0gZ2V0UHJvdG90eXBlT2YoJGFueU5hdGl2ZS5jYWxsKG5ldyBCYXNlKSk7XG4gICAgaWYoSXRlcmF0b3JQcm90b3R5cGUgIT09IE9iamVjdC5wcm90b3R5cGUpe1xuICAgICAgLy8gU2V0IEBAdG9TdHJpbmdUYWcgdG8gbmF0aXZlIGl0ZXJhdG9yc1xuICAgICAgc2V0VG9TdHJpbmdUYWcoSXRlcmF0b3JQcm90b3R5cGUsIFRBRywgdHJ1ZSk7XG4gICAgICAvLyBmaXggZm9yIHNvbWUgb2xkIGVuZ2luZXNcbiAgICAgIGlmKCFMSUJSQVJZICYmICFoYXMoSXRlcmF0b3JQcm90b3R5cGUsIElURVJBVE9SKSloaWRlKEl0ZXJhdG9yUHJvdG90eXBlLCBJVEVSQVRPUiwgcmV0dXJuVGhpcyk7XG4gICAgfVxuICB9XG4gIC8vIGZpeCBBcnJheSN7dmFsdWVzLCBAQGl0ZXJhdG9yfS5uYW1lIGluIFY4IC8gRkZcbiAgaWYoREVGX1ZBTFVFUyAmJiAkbmF0aXZlICYmICRuYXRpdmUubmFtZSAhPT0gVkFMVUVTKXtcbiAgICBWQUxVRVNfQlVHID0gdHJ1ZTtcbiAgICAkZGVmYXVsdCA9IGZ1bmN0aW9uIHZhbHVlcygpeyByZXR1cm4gJG5hdGl2ZS5jYWxsKHRoaXMpOyB9O1xuICB9XG4gIC8vIERlZmluZSBpdGVyYXRvclxuICBpZigoIUxJQlJBUlkgfHwgRk9SQ0VEKSAmJiAoQlVHR1kgfHwgVkFMVUVTX0JVRyB8fCAhcHJvdG9bSVRFUkFUT1JdKSl7XG4gICAgaGlkZShwcm90bywgSVRFUkFUT1IsICRkZWZhdWx0KTtcbiAgfVxuICAvLyBQbHVnIGZvciBsaWJyYXJ5XG4gIEl0ZXJhdG9yc1tOQU1FXSA9ICRkZWZhdWx0O1xuICBJdGVyYXRvcnNbVEFHXSAgPSByZXR1cm5UaGlzO1xuICBpZihERUZBVUxUKXtcbiAgICBtZXRob2RzID0ge1xuICAgICAgdmFsdWVzOiAgREVGX1ZBTFVFUyA/ICRkZWZhdWx0IDogZ2V0TWV0aG9kKFZBTFVFUyksXG4gICAgICBrZXlzOiAgICBJU19TRVQgICAgID8gJGRlZmF1bHQgOiBnZXRNZXRob2QoS0VZUyksXG4gICAgICBlbnRyaWVzOiAkZW50cmllc1xuICAgIH07XG4gICAgaWYoRk9SQ0VEKWZvcihrZXkgaW4gbWV0aG9kcyl7XG4gICAgICBpZighKGtleSBpbiBwcm90bykpcmVkZWZpbmUocHJvdG8sIGtleSwgbWV0aG9kc1trZXldKTtcbiAgICB9IGVsc2UgJGV4cG9ydCgkZXhwb3J0LlAgKyAkZXhwb3J0LkYgKiAoQlVHR1kgfHwgVkFMVUVTX0JVRyksIE5BTUUsIG1ldGhvZHMpO1xuICB9XG4gIHJldHVybiBtZXRob2RzO1xufTsiLCJ2YXIgSVRFUkFUT1IgICAgID0gcmVxdWlyZSgnLi9fd2tzJykoJ2l0ZXJhdG9yJylcbiAgLCBTQUZFX0NMT1NJTkcgPSBmYWxzZTtcblxudHJ5IHtcbiAgdmFyIHJpdGVyID0gWzddW0lURVJBVE9SXSgpO1xuICByaXRlclsncmV0dXJuJ10gPSBmdW5jdGlvbigpeyBTQUZFX0NMT1NJTkcgPSB0cnVlOyB9O1xuICBBcnJheS5mcm9tKHJpdGVyLCBmdW5jdGlvbigpeyB0aHJvdyAyOyB9KTtcbn0gY2F0Y2goZSl7IC8qIGVtcHR5ICovIH1cblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihleGVjLCBza2lwQ2xvc2luZyl7XG4gIGlmKCFza2lwQ2xvc2luZyAmJiAhU0FGRV9DTE9TSU5HKXJldHVybiBmYWxzZTtcbiAgdmFyIHNhZmUgPSBmYWxzZTtcbiAgdHJ5IHtcbiAgICB2YXIgYXJyICA9IFs3XVxuICAgICAgLCBpdGVyID0gYXJyW0lURVJBVE9SXSgpO1xuICAgIGl0ZXIubmV4dCA9IGZ1bmN0aW9uKCl7IHJldHVybiB7ZG9uZTogc2FmZSA9IHRydWV9OyB9O1xuICAgIGFycltJVEVSQVRPUl0gPSBmdW5jdGlvbigpeyByZXR1cm4gaXRlcjsgfTtcbiAgICBleGVjKGFycik7XG4gIH0gY2F0Y2goZSl7IC8qIGVtcHR5ICovIH1cbiAgcmV0dXJuIHNhZmU7XG59OyIsIm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oZG9uZSwgdmFsdWUpe1xuICByZXR1cm4ge3ZhbHVlOiB2YWx1ZSwgZG9uZTogISFkb25lfTtcbn07IiwibW9kdWxlLmV4cG9ydHMgPSB7fTsiLCJtb2R1bGUuZXhwb3J0cyA9IGZhbHNlOyIsInZhciBnbG9iYWwgICAgPSByZXF1aXJlKCcuL19nbG9iYWwnKVxuICAsIG1hY3JvdGFzayA9IHJlcXVpcmUoJy4vX3Rhc2snKS5zZXRcbiAgLCBPYnNlcnZlciAgPSBnbG9iYWwuTXV0YXRpb25PYnNlcnZlciB8fCBnbG9iYWwuV2ViS2l0TXV0YXRpb25PYnNlcnZlclxuICAsIHByb2Nlc3MgICA9IGdsb2JhbC5wcm9jZXNzXG4gICwgUHJvbWlzZSAgID0gZ2xvYmFsLlByb21pc2VcbiAgLCBpc05vZGUgICAgPSByZXF1aXJlKCcuL19jb2YnKShwcm9jZXNzKSA9PSAncHJvY2Vzcyc7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oKXtcbiAgdmFyIGhlYWQsIGxhc3QsIG5vdGlmeTtcblxuICB2YXIgZmx1c2ggPSBmdW5jdGlvbigpe1xuICAgIHZhciBwYXJlbnQsIGZuO1xuICAgIGlmKGlzTm9kZSAmJiAocGFyZW50ID0gcHJvY2Vzcy5kb21haW4pKXBhcmVudC5leGl0KCk7XG4gICAgd2hpbGUoaGVhZCl7XG4gICAgICBmbiAgID0gaGVhZC5mbjtcbiAgICAgIGhlYWQgPSBoZWFkLm5leHQ7XG4gICAgICB0cnkge1xuICAgICAgICBmbigpO1xuICAgICAgfSBjYXRjaChlKXtcbiAgICAgICAgaWYoaGVhZClub3RpZnkoKTtcbiAgICAgICAgZWxzZSBsYXN0ID0gdW5kZWZpbmVkO1xuICAgICAgICB0aHJvdyBlO1xuICAgICAgfVxuICAgIH0gbGFzdCA9IHVuZGVmaW5lZDtcbiAgICBpZihwYXJlbnQpcGFyZW50LmVudGVyKCk7XG4gIH07XG5cbiAgLy8gTm9kZS5qc1xuICBpZihpc05vZGUpe1xuICAgIG5vdGlmeSA9IGZ1bmN0aW9uKCl7XG4gICAgICBwcm9jZXNzLm5leHRUaWNrKGZsdXNoKTtcbiAgICB9O1xuICAvLyBicm93c2VycyB3aXRoIE11dGF0aW9uT2JzZXJ2ZXJcbiAgfSBlbHNlIGlmKE9ic2VydmVyKXtcbiAgICB2YXIgdG9nZ2xlID0gdHJ1ZVxuICAgICAgLCBub2RlICAgPSBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSgnJyk7XG4gICAgbmV3IE9ic2VydmVyKGZsdXNoKS5vYnNlcnZlKG5vZGUsIHtjaGFyYWN0ZXJEYXRhOiB0cnVlfSk7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tbmV3XG4gICAgbm90aWZ5ID0gZnVuY3Rpb24oKXtcbiAgICAgIG5vZGUuZGF0YSA9IHRvZ2dsZSA9ICF0b2dnbGU7XG4gICAgfTtcbiAgLy8gZW52aXJvbm1lbnRzIHdpdGggbWF5YmUgbm9uLWNvbXBsZXRlbHkgY29ycmVjdCwgYnV0IGV4aXN0ZW50IFByb21pc2VcbiAgfSBlbHNlIGlmKFByb21pc2UgJiYgUHJvbWlzZS5yZXNvbHZlKXtcbiAgICB2YXIgcHJvbWlzZSA9IFByb21pc2UucmVzb2x2ZSgpO1xuICAgIG5vdGlmeSA9IGZ1bmN0aW9uKCl7XG4gICAgICBwcm9taXNlLnRoZW4oZmx1c2gpO1xuICAgIH07XG4gIC8vIGZvciBvdGhlciBlbnZpcm9ubWVudHMgLSBtYWNyb3Rhc2sgYmFzZWQgb246XG4gIC8vIC0gc2V0SW1tZWRpYXRlXG4gIC8vIC0gTWVzc2FnZUNoYW5uZWxcbiAgLy8gLSB3aW5kb3cucG9zdE1lc3NhZ1xuICAvLyAtIG9ucmVhZHlzdGF0ZWNoYW5nZVxuICAvLyAtIHNldFRpbWVvdXRcbiAgfSBlbHNlIHtcbiAgICBub3RpZnkgPSBmdW5jdGlvbigpe1xuICAgICAgLy8gc3RyYW5nZSBJRSArIHdlYnBhY2sgZGV2IHNlcnZlciBidWcgLSB1c2UgLmNhbGwoZ2xvYmFsKVxuICAgICAgbWFjcm90YXNrLmNhbGwoZ2xvYmFsLCBmbHVzaCk7XG4gICAgfTtcbiAgfVxuXG4gIHJldHVybiBmdW5jdGlvbihmbil7XG4gICAgdmFyIHRhc2sgPSB7Zm46IGZuLCBuZXh0OiB1bmRlZmluZWR9O1xuICAgIGlmKGxhc3QpbGFzdC5uZXh0ID0gdGFzaztcbiAgICBpZighaGVhZCl7XG4gICAgICBoZWFkID0gdGFzaztcbiAgICAgIG5vdGlmeSgpO1xuICAgIH0gbGFzdCA9IHRhc2s7XG4gIH07XG59OyIsIi8vIDE5LjEuMi4yIC8gMTUuMi4zLjUgT2JqZWN0LmNyZWF0ZShPIFssIFByb3BlcnRpZXNdKVxudmFyIGFuT2JqZWN0ICAgID0gcmVxdWlyZSgnLi9fYW4tb2JqZWN0JylcbiAgLCBkUHMgICAgICAgICA9IHJlcXVpcmUoJy4vX29iamVjdC1kcHMnKVxuICAsIGVudW1CdWdLZXlzID0gcmVxdWlyZSgnLi9fZW51bS1idWcta2V5cycpXG4gICwgSUVfUFJPVE8gICAgPSByZXF1aXJlKCcuL19zaGFyZWQta2V5JykoJ0lFX1BST1RPJylcbiAgLCBFbXB0eSAgICAgICA9IGZ1bmN0aW9uKCl7IC8qIGVtcHR5ICovIH1cbiAgLCBQUk9UT1RZUEUgICA9ICdwcm90b3R5cGUnO1xuXG4vLyBDcmVhdGUgb2JqZWN0IHdpdGggZmFrZSBgbnVsbGAgcHJvdG90eXBlOiB1c2UgaWZyYW1lIE9iamVjdCB3aXRoIGNsZWFyZWQgcHJvdG90eXBlXG52YXIgY3JlYXRlRGljdCA9IGZ1bmN0aW9uKCl7XG4gIC8vIFRocmFzaCwgd2FzdGUgYW5kIHNvZG9teTogSUUgR0MgYnVnXG4gIHZhciBpZnJhbWUgPSByZXF1aXJlKCcuL19kb20tY3JlYXRlJykoJ2lmcmFtZScpXG4gICAgLCBpICAgICAgPSBlbnVtQnVnS2V5cy5sZW5ndGhcbiAgICAsIGx0ICAgICA9ICc8J1xuICAgICwgZ3QgICAgID0gJz4nXG4gICAgLCBpZnJhbWVEb2N1bWVudDtcbiAgaWZyYW1lLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gIHJlcXVpcmUoJy4vX2h0bWwnKS5hcHBlbmRDaGlsZChpZnJhbWUpO1xuICBpZnJhbWUuc3JjID0gJ2phdmFzY3JpcHQ6JzsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1zY3JpcHQtdXJsXG4gIC8vIGNyZWF0ZURpY3QgPSBpZnJhbWUuY29udGVudFdpbmRvdy5PYmplY3Q7XG4gIC8vIGh0bWwucmVtb3ZlQ2hpbGQoaWZyYW1lKTtcbiAgaWZyYW1lRG9jdW1lbnQgPSBpZnJhbWUuY29udGVudFdpbmRvdy5kb2N1bWVudDtcbiAgaWZyYW1lRG9jdW1lbnQub3BlbigpO1xuICBpZnJhbWVEb2N1bWVudC53cml0ZShsdCArICdzY3JpcHQnICsgZ3QgKyAnZG9jdW1lbnQuRj1PYmplY3QnICsgbHQgKyAnL3NjcmlwdCcgKyBndCk7XG4gIGlmcmFtZURvY3VtZW50LmNsb3NlKCk7XG4gIGNyZWF0ZURpY3QgPSBpZnJhbWVEb2N1bWVudC5GO1xuICB3aGlsZShpLS0pZGVsZXRlIGNyZWF0ZURpY3RbUFJPVE9UWVBFXVtlbnVtQnVnS2V5c1tpXV07XG4gIHJldHVybiBjcmVhdGVEaWN0KCk7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IE9iamVjdC5jcmVhdGUgfHwgZnVuY3Rpb24gY3JlYXRlKE8sIFByb3BlcnRpZXMpe1xuICB2YXIgcmVzdWx0O1xuICBpZihPICE9PSBudWxsKXtcbiAgICBFbXB0eVtQUk9UT1RZUEVdID0gYW5PYmplY3QoTyk7XG4gICAgcmVzdWx0ID0gbmV3IEVtcHR5O1xuICAgIEVtcHR5W1BST1RPVFlQRV0gPSBudWxsO1xuICAgIC8vIGFkZCBcIl9fcHJvdG9fX1wiIGZvciBPYmplY3QuZ2V0UHJvdG90eXBlT2YgcG9seWZpbGxcbiAgICByZXN1bHRbSUVfUFJPVE9dID0gTztcbiAgfSBlbHNlIHJlc3VsdCA9IGNyZWF0ZURpY3QoKTtcbiAgcmV0dXJuIFByb3BlcnRpZXMgPT09IHVuZGVmaW5lZCA/IHJlc3VsdCA6IGRQcyhyZXN1bHQsIFByb3BlcnRpZXMpO1xufTtcbiIsInZhciBhbk9iamVjdCAgICAgICA9IHJlcXVpcmUoJy4vX2FuLW9iamVjdCcpXG4gICwgSUU4X0RPTV9ERUZJTkUgPSByZXF1aXJlKCcuL19pZTgtZG9tLWRlZmluZScpXG4gICwgdG9QcmltaXRpdmUgICAgPSByZXF1aXJlKCcuL190by1wcmltaXRpdmUnKVxuICAsIGRQICAgICAgICAgICAgID0gT2JqZWN0LmRlZmluZVByb3BlcnR5O1xuXG5leHBvcnRzLmYgPSByZXF1aXJlKCcuL19kZXNjcmlwdG9ycycpID8gT2JqZWN0LmRlZmluZVByb3BlcnR5IDogZnVuY3Rpb24gZGVmaW5lUHJvcGVydHkoTywgUCwgQXR0cmlidXRlcyl7XG4gIGFuT2JqZWN0KE8pO1xuICBQID0gdG9QcmltaXRpdmUoUCwgdHJ1ZSk7XG4gIGFuT2JqZWN0KEF0dHJpYnV0ZXMpO1xuICBpZihJRThfRE9NX0RFRklORSl0cnkge1xuICAgIHJldHVybiBkUChPLCBQLCBBdHRyaWJ1dGVzKTtcbiAgfSBjYXRjaChlKXsgLyogZW1wdHkgKi8gfVxuICBpZignZ2V0JyBpbiBBdHRyaWJ1dGVzIHx8ICdzZXQnIGluIEF0dHJpYnV0ZXMpdGhyb3cgVHlwZUVycm9yKCdBY2Nlc3NvcnMgbm90IHN1cHBvcnRlZCEnKTtcbiAgaWYoJ3ZhbHVlJyBpbiBBdHRyaWJ1dGVzKU9bUF0gPSBBdHRyaWJ1dGVzLnZhbHVlO1xuICByZXR1cm4gTztcbn07IiwidmFyIGRQICAgICAgID0gcmVxdWlyZSgnLi9fb2JqZWN0LWRwJylcbiAgLCBhbk9iamVjdCA9IHJlcXVpcmUoJy4vX2FuLW9iamVjdCcpXG4gICwgZ2V0S2V5cyAgPSByZXF1aXJlKCcuL19vYmplY3Qta2V5cycpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vX2Rlc2NyaXB0b3JzJykgPyBPYmplY3QuZGVmaW5lUHJvcGVydGllcyA6IGZ1bmN0aW9uIGRlZmluZVByb3BlcnRpZXMoTywgUHJvcGVydGllcyl7XG4gIGFuT2JqZWN0KE8pO1xuICB2YXIga2V5cyAgID0gZ2V0S2V5cyhQcm9wZXJ0aWVzKVxuICAgICwgbGVuZ3RoID0ga2V5cy5sZW5ndGhcbiAgICAsIGkgPSAwXG4gICAgLCBQO1xuICB3aGlsZShsZW5ndGggPiBpKWRQLmYoTywgUCA9IGtleXNbaSsrXSwgUHJvcGVydGllc1tQXSk7XG4gIHJldHVybiBPO1xufTsiLCIvLyAxOS4xLjIuOSAvIDE1LjIuMy4yIE9iamVjdC5nZXRQcm90b3R5cGVPZihPKVxudmFyIGhhcyAgICAgICAgID0gcmVxdWlyZSgnLi9faGFzJylcbiAgLCB0b09iamVjdCAgICA9IHJlcXVpcmUoJy4vX3RvLW9iamVjdCcpXG4gICwgSUVfUFJPVE8gICAgPSByZXF1aXJlKCcuL19zaGFyZWQta2V5JykoJ0lFX1BST1RPJylcbiAgLCBPYmplY3RQcm90byA9IE9iamVjdC5wcm90b3R5cGU7XG5cbm1vZHVsZS5leHBvcnRzID0gT2JqZWN0LmdldFByb3RvdHlwZU9mIHx8IGZ1bmN0aW9uKE8pe1xuICBPID0gdG9PYmplY3QoTyk7XG4gIGlmKGhhcyhPLCBJRV9QUk9UTykpcmV0dXJuIE9bSUVfUFJPVE9dO1xuICBpZih0eXBlb2YgTy5jb25zdHJ1Y3RvciA9PSAnZnVuY3Rpb24nICYmIE8gaW5zdGFuY2VvZiBPLmNvbnN0cnVjdG9yKXtcbiAgICByZXR1cm4gTy5jb25zdHJ1Y3Rvci5wcm90b3R5cGU7XG4gIH0gcmV0dXJuIE8gaW5zdGFuY2VvZiBPYmplY3QgPyBPYmplY3RQcm90byA6IG51bGw7XG59OyIsInZhciBoYXMgICAgICAgICAgPSByZXF1aXJlKCcuL19oYXMnKVxuICAsIHRvSU9iamVjdCAgICA9IHJlcXVpcmUoJy4vX3RvLWlvYmplY3QnKVxuICAsIGFycmF5SW5kZXhPZiA9IHJlcXVpcmUoJy4vX2FycmF5LWluY2x1ZGVzJykoZmFsc2UpXG4gICwgSUVfUFJPVE8gICAgID0gcmVxdWlyZSgnLi9fc2hhcmVkLWtleScpKCdJRV9QUk9UTycpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKG9iamVjdCwgbmFtZXMpe1xuICB2YXIgTyAgICAgID0gdG9JT2JqZWN0KG9iamVjdClcbiAgICAsIGkgICAgICA9IDBcbiAgICAsIHJlc3VsdCA9IFtdXG4gICAgLCBrZXk7XG4gIGZvcihrZXkgaW4gTylpZihrZXkgIT0gSUVfUFJPVE8paGFzKE8sIGtleSkgJiYgcmVzdWx0LnB1c2goa2V5KTtcbiAgLy8gRG9uJ3QgZW51bSBidWcgJiBoaWRkZW4ga2V5c1xuICB3aGlsZShuYW1lcy5sZW5ndGggPiBpKWlmKGhhcyhPLCBrZXkgPSBuYW1lc1tpKytdKSl7XG4gICAgfmFycmF5SW5kZXhPZihyZXN1bHQsIGtleSkgfHwgcmVzdWx0LnB1c2goa2V5KTtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufTsiLCIvLyAxOS4xLjIuMTQgLyAxNS4yLjMuMTQgT2JqZWN0LmtleXMoTylcbnZhciAka2V5cyAgICAgICA9IHJlcXVpcmUoJy4vX29iamVjdC1rZXlzLWludGVybmFsJylcbiAgLCBlbnVtQnVnS2V5cyA9IHJlcXVpcmUoJy4vX2VudW0tYnVnLWtleXMnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBPYmplY3Qua2V5cyB8fCBmdW5jdGlvbiBrZXlzKE8pe1xuICByZXR1cm4gJGtleXMoTywgZW51bUJ1Z0tleXMpO1xufTsiLCJtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGJpdG1hcCwgdmFsdWUpe1xuICByZXR1cm4ge1xuICAgIGVudW1lcmFibGUgIDogIShiaXRtYXAgJiAxKSxcbiAgICBjb25maWd1cmFibGU6ICEoYml0bWFwICYgMiksXG4gICAgd3JpdGFibGUgICAgOiAhKGJpdG1hcCAmIDQpLFxuICAgIHZhbHVlICAgICAgIDogdmFsdWVcbiAgfTtcbn07IiwidmFyIHJlZGVmaW5lID0gcmVxdWlyZSgnLi9fcmVkZWZpbmUnKTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24odGFyZ2V0LCBzcmMsIHNhZmUpe1xuICBmb3IodmFyIGtleSBpbiBzcmMpcmVkZWZpbmUodGFyZ2V0LCBrZXksIHNyY1trZXldLCBzYWZlKTtcbiAgcmV0dXJuIHRhcmdldDtcbn07IiwidmFyIGdsb2JhbCAgICA9IHJlcXVpcmUoJy4vX2dsb2JhbCcpXG4gICwgaGlkZSAgICAgID0gcmVxdWlyZSgnLi9faGlkZScpXG4gICwgaGFzICAgICAgID0gcmVxdWlyZSgnLi9faGFzJylcbiAgLCBTUkMgICAgICAgPSByZXF1aXJlKCcuL191aWQnKSgnc3JjJylcbiAgLCBUT19TVFJJTkcgPSAndG9TdHJpbmcnXG4gICwgJHRvU3RyaW5nID0gRnVuY3Rpb25bVE9fU1RSSU5HXVxuICAsIFRQTCAgICAgICA9ICgnJyArICR0b1N0cmluZykuc3BsaXQoVE9fU1RSSU5HKTtcblxucmVxdWlyZSgnLi9fY29yZScpLmluc3BlY3RTb3VyY2UgPSBmdW5jdGlvbihpdCl7XG4gIHJldHVybiAkdG9TdHJpbmcuY2FsbChpdCk7XG59O1xuXG4obW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihPLCBrZXksIHZhbCwgc2FmZSl7XG4gIHZhciBpc0Z1bmN0aW9uID0gdHlwZW9mIHZhbCA9PSAnZnVuY3Rpb24nO1xuICBpZihpc0Z1bmN0aW9uKWhhcyh2YWwsICduYW1lJykgfHwgaGlkZSh2YWwsICduYW1lJywga2V5KTtcbiAgaWYoT1trZXldID09PSB2YWwpcmV0dXJuO1xuICBpZihpc0Z1bmN0aW9uKWhhcyh2YWwsIFNSQykgfHwgaGlkZSh2YWwsIFNSQywgT1trZXldID8gJycgKyBPW2tleV0gOiBUUEwuam9pbihTdHJpbmcoa2V5KSkpO1xuICBpZihPID09PSBnbG9iYWwpe1xuICAgIE9ba2V5XSA9IHZhbDtcbiAgfSBlbHNlIHtcbiAgICBpZighc2FmZSl7XG4gICAgICBkZWxldGUgT1trZXldO1xuICAgICAgaGlkZShPLCBrZXksIHZhbCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmKE9ba2V5XSlPW2tleV0gPSB2YWw7XG4gICAgICBlbHNlIGhpZGUoTywga2V5LCB2YWwpO1xuICAgIH1cbiAgfVxuLy8gYWRkIGZha2UgRnVuY3Rpb24jdG9TdHJpbmcgZm9yIGNvcnJlY3Qgd29yayB3cmFwcGVkIG1ldGhvZHMgLyBjb25zdHJ1Y3RvcnMgd2l0aCBtZXRob2RzIGxpa2UgTG9EYXNoIGlzTmF0aXZlXG59KShGdW5jdGlvbi5wcm90b3R5cGUsIFRPX1NUUklORywgZnVuY3Rpb24gdG9TdHJpbmcoKXtcbiAgcmV0dXJuIHR5cGVvZiB0aGlzID09ICdmdW5jdGlvbicgJiYgdGhpc1tTUkNdIHx8ICR0b1N0cmluZy5jYWxsKHRoaXMpO1xufSk7IiwiJ3VzZSBzdHJpY3QnO1xudmFyIGdsb2JhbCAgICAgID0gcmVxdWlyZSgnLi9fZ2xvYmFsJylcbiAgLCBkUCAgICAgICAgICA9IHJlcXVpcmUoJy4vX29iamVjdC1kcCcpXG4gICwgREVTQ1JJUFRPUlMgPSByZXF1aXJlKCcuL19kZXNjcmlwdG9ycycpXG4gICwgU1BFQ0lFUyAgICAgPSByZXF1aXJlKCcuL193a3MnKSgnc3BlY2llcycpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKEtFWSl7XG4gIHZhciBDID0gZ2xvYmFsW0tFWV07XG4gIGlmKERFU0NSSVBUT1JTICYmIEMgJiYgIUNbU1BFQ0lFU10pZFAuZihDLCBTUEVDSUVTLCB7XG4gICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgIGdldDogZnVuY3Rpb24oKXsgcmV0dXJuIHRoaXM7IH1cbiAgfSk7XG59OyIsInZhciBkZWYgPSByZXF1aXJlKCcuL19vYmplY3QtZHAnKS5mXG4gICwgaGFzID0gcmVxdWlyZSgnLi9faGFzJylcbiAgLCBUQUcgPSByZXF1aXJlKCcuL193a3MnKSgndG9TdHJpbmdUYWcnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihpdCwgdGFnLCBzdGF0KXtcbiAgaWYoaXQgJiYgIWhhcyhpdCA9IHN0YXQgPyBpdCA6IGl0LnByb3RvdHlwZSwgVEFHKSlkZWYoaXQsIFRBRywge2NvbmZpZ3VyYWJsZTogdHJ1ZSwgdmFsdWU6IHRhZ30pO1xufTsiLCJ2YXIgc2hhcmVkID0gcmVxdWlyZSgnLi9fc2hhcmVkJykoJ2tleXMnKVxuICAsIHVpZCAgICA9IHJlcXVpcmUoJy4vX3VpZCcpO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihrZXkpe1xuICByZXR1cm4gc2hhcmVkW2tleV0gfHwgKHNoYXJlZFtrZXldID0gdWlkKGtleSkpO1xufTsiLCJ2YXIgZ2xvYmFsID0gcmVxdWlyZSgnLi9fZ2xvYmFsJylcbiAgLCBTSEFSRUQgPSAnX19jb3JlLWpzX3NoYXJlZF9fJ1xuICAsIHN0b3JlICA9IGdsb2JhbFtTSEFSRURdIHx8IChnbG9iYWxbU0hBUkVEXSA9IHt9KTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oa2V5KXtcbiAgcmV0dXJuIHN0b3JlW2tleV0gfHwgKHN0b3JlW2tleV0gPSB7fSk7XG59OyIsIi8vIDcuMy4yMCBTcGVjaWVzQ29uc3RydWN0b3IoTywgZGVmYXVsdENvbnN0cnVjdG9yKVxudmFyIGFuT2JqZWN0ICA9IHJlcXVpcmUoJy4vX2FuLW9iamVjdCcpXG4gICwgYUZ1bmN0aW9uID0gcmVxdWlyZSgnLi9fYS1mdW5jdGlvbicpXG4gICwgU1BFQ0lFUyAgID0gcmVxdWlyZSgnLi9fd2tzJykoJ3NwZWNpZXMnKTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oTywgRCl7XG4gIHZhciBDID0gYW5PYmplY3QoTykuY29uc3RydWN0b3IsIFM7XG4gIHJldHVybiBDID09PSB1bmRlZmluZWQgfHwgKFMgPSBhbk9iamVjdChDKVtTUEVDSUVTXSkgPT0gdW5kZWZpbmVkID8gRCA6IGFGdW5jdGlvbihTKTtcbn07IiwidmFyIHRvSW50ZWdlciA9IHJlcXVpcmUoJy4vX3RvLWludGVnZXInKVxuICAsIGRlZmluZWQgICA9IHJlcXVpcmUoJy4vX2RlZmluZWQnKTtcbi8vIHRydWUgIC0+IFN0cmluZyNhdFxuLy8gZmFsc2UgLT4gU3RyaW5nI2NvZGVQb2ludEF0XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKFRPX1NUUklORyl7XG4gIHJldHVybiBmdW5jdGlvbih0aGF0LCBwb3Mpe1xuICAgIHZhciBzID0gU3RyaW5nKGRlZmluZWQodGhhdCkpXG4gICAgICAsIGkgPSB0b0ludGVnZXIocG9zKVxuICAgICAgLCBsID0gcy5sZW5ndGhcbiAgICAgICwgYSwgYjtcbiAgICBpZihpIDwgMCB8fCBpID49IGwpcmV0dXJuIFRPX1NUUklORyA/ICcnIDogdW5kZWZpbmVkO1xuICAgIGEgPSBzLmNoYXJDb2RlQXQoaSk7XG4gICAgcmV0dXJuIGEgPCAweGQ4MDAgfHwgYSA+IDB4ZGJmZiB8fCBpICsgMSA9PT0gbCB8fCAoYiA9IHMuY2hhckNvZGVBdChpICsgMSkpIDwgMHhkYzAwIHx8IGIgPiAweGRmZmZcbiAgICAgID8gVE9fU1RSSU5HID8gcy5jaGFyQXQoaSkgOiBhXG4gICAgICA6IFRPX1NUUklORyA/IHMuc2xpY2UoaSwgaSArIDIpIDogKGEgLSAweGQ4MDAgPDwgMTApICsgKGIgLSAweGRjMDApICsgMHgxMDAwMDtcbiAgfTtcbn07IiwidmFyIGN0eCAgICAgICAgICAgICAgICA9IHJlcXVpcmUoJy4vX2N0eCcpXG4gICwgaW52b2tlICAgICAgICAgICAgID0gcmVxdWlyZSgnLi9faW52b2tlJylcbiAgLCBodG1sICAgICAgICAgICAgICAgPSByZXF1aXJlKCcuL19odG1sJylcbiAgLCBjZWwgICAgICAgICAgICAgICAgPSByZXF1aXJlKCcuL19kb20tY3JlYXRlJylcbiAgLCBnbG9iYWwgICAgICAgICAgICAgPSByZXF1aXJlKCcuL19nbG9iYWwnKVxuICAsIHByb2Nlc3MgICAgICAgICAgICA9IGdsb2JhbC5wcm9jZXNzXG4gICwgc2V0VGFzayAgICAgICAgICAgID0gZ2xvYmFsLnNldEltbWVkaWF0ZVxuICAsIGNsZWFyVGFzayAgICAgICAgICA9IGdsb2JhbC5jbGVhckltbWVkaWF0ZVxuICAsIE1lc3NhZ2VDaGFubmVsICAgICA9IGdsb2JhbC5NZXNzYWdlQ2hhbm5lbFxuICAsIGNvdW50ZXIgICAgICAgICAgICA9IDBcbiAgLCBxdWV1ZSAgICAgICAgICAgICAgPSB7fVxuICAsIE9OUkVBRFlTVEFURUNIQU5HRSA9ICdvbnJlYWR5c3RhdGVjaGFuZ2UnXG4gICwgZGVmZXIsIGNoYW5uZWwsIHBvcnQ7XG52YXIgcnVuID0gZnVuY3Rpb24oKXtcbiAgdmFyIGlkID0gK3RoaXM7XG4gIGlmKHF1ZXVlLmhhc093blByb3BlcnR5KGlkKSl7XG4gICAgdmFyIGZuID0gcXVldWVbaWRdO1xuICAgIGRlbGV0ZSBxdWV1ZVtpZF07XG4gICAgZm4oKTtcbiAgfVxufTtcbnZhciBsaXN0ZW5lciA9IGZ1bmN0aW9uKGV2ZW50KXtcbiAgcnVuLmNhbGwoZXZlbnQuZGF0YSk7XG59O1xuLy8gTm9kZS5qcyAwLjkrICYgSUUxMCsgaGFzIHNldEltbWVkaWF0ZSwgb3RoZXJ3aXNlOlxuaWYoIXNldFRhc2sgfHwgIWNsZWFyVGFzayl7XG4gIHNldFRhc2sgPSBmdW5jdGlvbiBzZXRJbW1lZGlhdGUoZm4pe1xuICAgIHZhciBhcmdzID0gW10sIGkgPSAxO1xuICAgIHdoaWxlKGFyZ3VtZW50cy5sZW5ndGggPiBpKWFyZ3MucHVzaChhcmd1bWVudHNbaSsrXSk7XG4gICAgcXVldWVbKytjb3VudGVyXSA9IGZ1bmN0aW9uKCl7XG4gICAgICBpbnZva2UodHlwZW9mIGZuID09ICdmdW5jdGlvbicgPyBmbiA6IEZ1bmN0aW9uKGZuKSwgYXJncyk7XG4gICAgfTtcbiAgICBkZWZlcihjb3VudGVyKTtcbiAgICByZXR1cm4gY291bnRlcjtcbiAgfTtcbiAgY2xlYXJUYXNrID0gZnVuY3Rpb24gY2xlYXJJbW1lZGlhdGUoaWQpe1xuICAgIGRlbGV0ZSBxdWV1ZVtpZF07XG4gIH07XG4gIC8vIE5vZGUuanMgMC44LVxuICBpZihyZXF1aXJlKCcuL19jb2YnKShwcm9jZXNzKSA9PSAncHJvY2Vzcycpe1xuICAgIGRlZmVyID0gZnVuY3Rpb24oaWQpe1xuICAgICAgcHJvY2Vzcy5uZXh0VGljayhjdHgocnVuLCBpZCwgMSkpO1xuICAgIH07XG4gIC8vIEJyb3dzZXJzIHdpdGggTWVzc2FnZUNoYW5uZWwsIGluY2x1ZGVzIFdlYldvcmtlcnNcbiAgfSBlbHNlIGlmKE1lc3NhZ2VDaGFubmVsKXtcbiAgICBjaGFubmVsID0gbmV3IE1lc3NhZ2VDaGFubmVsO1xuICAgIHBvcnQgICAgPSBjaGFubmVsLnBvcnQyO1xuICAgIGNoYW5uZWwucG9ydDEub25tZXNzYWdlID0gbGlzdGVuZXI7XG4gICAgZGVmZXIgPSBjdHgocG9ydC5wb3N0TWVzc2FnZSwgcG9ydCwgMSk7XG4gIC8vIEJyb3dzZXJzIHdpdGggcG9zdE1lc3NhZ2UsIHNraXAgV2ViV29ya2Vyc1xuICAvLyBJRTggaGFzIHBvc3RNZXNzYWdlLCBidXQgaXQncyBzeW5jICYgdHlwZW9mIGl0cyBwb3N0TWVzc2FnZSBpcyAnb2JqZWN0J1xuICB9IGVsc2UgaWYoZ2xvYmFsLmFkZEV2ZW50TGlzdGVuZXIgJiYgdHlwZW9mIHBvc3RNZXNzYWdlID09ICdmdW5jdGlvbicgJiYgIWdsb2JhbC5pbXBvcnRTY3JpcHRzKXtcbiAgICBkZWZlciA9IGZ1bmN0aW9uKGlkKXtcbiAgICAgIGdsb2JhbC5wb3N0TWVzc2FnZShpZCArICcnLCAnKicpO1xuICAgIH07XG4gICAgZ2xvYmFsLmFkZEV2ZW50TGlzdGVuZXIoJ21lc3NhZ2UnLCBsaXN0ZW5lciwgZmFsc2UpO1xuICAvLyBJRTgtXG4gIH0gZWxzZSBpZihPTlJFQURZU1RBVEVDSEFOR0UgaW4gY2VsKCdzY3JpcHQnKSl7XG4gICAgZGVmZXIgPSBmdW5jdGlvbihpZCl7XG4gICAgICBodG1sLmFwcGVuZENoaWxkKGNlbCgnc2NyaXB0JykpW09OUkVBRFlTVEFURUNIQU5HRV0gPSBmdW5jdGlvbigpe1xuICAgICAgICBodG1sLnJlbW92ZUNoaWxkKHRoaXMpO1xuICAgICAgICBydW4uY2FsbChpZCk7XG4gICAgICB9O1xuICAgIH07XG4gIC8vIFJlc3Qgb2xkIGJyb3dzZXJzXG4gIH0gZWxzZSB7XG4gICAgZGVmZXIgPSBmdW5jdGlvbihpZCl7XG4gICAgICBzZXRUaW1lb3V0KGN0eChydW4sIGlkLCAxKSwgMCk7XG4gICAgfTtcbiAgfVxufVxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIHNldDogICBzZXRUYXNrLFxuICBjbGVhcjogY2xlYXJUYXNrXG59OyIsInZhciB0b0ludGVnZXIgPSByZXF1aXJlKCcuL190by1pbnRlZ2VyJylcbiAgLCBtYXggICAgICAgPSBNYXRoLm1heFxuICAsIG1pbiAgICAgICA9IE1hdGgubWluO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihpbmRleCwgbGVuZ3RoKXtcbiAgaW5kZXggPSB0b0ludGVnZXIoaW5kZXgpO1xuICByZXR1cm4gaW5kZXggPCAwID8gbWF4KGluZGV4ICsgbGVuZ3RoLCAwKSA6IG1pbihpbmRleCwgbGVuZ3RoKTtcbn07IiwiLy8gNy4xLjQgVG9JbnRlZ2VyXG52YXIgY2VpbCAgPSBNYXRoLmNlaWxcbiAgLCBmbG9vciA9IE1hdGguZmxvb3I7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGl0KXtcbiAgcmV0dXJuIGlzTmFOKGl0ID0gK2l0KSA/IDAgOiAoaXQgPiAwID8gZmxvb3IgOiBjZWlsKShpdCk7XG59OyIsIi8vIHRvIGluZGV4ZWQgb2JqZWN0LCB0b09iamVjdCB3aXRoIGZhbGxiYWNrIGZvciBub24tYXJyYXktbGlrZSBFUzMgc3RyaW5nc1xudmFyIElPYmplY3QgPSByZXF1aXJlKCcuL19pb2JqZWN0JylcbiAgLCBkZWZpbmVkID0gcmVxdWlyZSgnLi9fZGVmaW5lZCcpO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihpdCl7XG4gIHJldHVybiBJT2JqZWN0KGRlZmluZWQoaXQpKTtcbn07IiwiLy8gNy4xLjE1IFRvTGVuZ3RoXG52YXIgdG9JbnRlZ2VyID0gcmVxdWlyZSgnLi9fdG8taW50ZWdlcicpXG4gICwgbWluICAgICAgID0gTWF0aC5taW47XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGl0KXtcbiAgcmV0dXJuIGl0ID4gMCA/IG1pbih0b0ludGVnZXIoaXQpLCAweDFmZmZmZmZmZmZmZmZmKSA6IDA7IC8vIHBvdygyLCA1MykgLSAxID09IDkwMDcxOTkyNTQ3NDA5OTFcbn07IiwiLy8gNy4xLjEzIFRvT2JqZWN0KGFyZ3VtZW50KVxudmFyIGRlZmluZWQgPSByZXF1aXJlKCcuL19kZWZpbmVkJyk7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGl0KXtcbiAgcmV0dXJuIE9iamVjdChkZWZpbmVkKGl0KSk7XG59OyIsIi8vIDcuMS4xIFRvUHJpbWl0aXZlKGlucHV0IFssIFByZWZlcnJlZFR5cGVdKVxudmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi9faXMtb2JqZWN0Jyk7XG4vLyBpbnN0ZWFkIG9mIHRoZSBFUzYgc3BlYyB2ZXJzaW9uLCB3ZSBkaWRuJ3QgaW1wbGVtZW50IEBAdG9QcmltaXRpdmUgY2FzZVxuLy8gYW5kIHRoZSBzZWNvbmQgYXJndW1lbnQgLSBmbGFnIC0gcHJlZmVycmVkIHR5cGUgaXMgYSBzdHJpbmdcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oaXQsIFMpe1xuICBpZighaXNPYmplY3QoaXQpKXJldHVybiBpdDtcbiAgdmFyIGZuLCB2YWw7XG4gIGlmKFMgJiYgdHlwZW9mIChmbiA9IGl0LnRvU3RyaW5nKSA9PSAnZnVuY3Rpb24nICYmICFpc09iamVjdCh2YWwgPSBmbi5jYWxsKGl0KSkpcmV0dXJuIHZhbDtcbiAgaWYodHlwZW9mIChmbiA9IGl0LnZhbHVlT2YpID09ICdmdW5jdGlvbicgJiYgIWlzT2JqZWN0KHZhbCA9IGZuLmNhbGwoaXQpKSlyZXR1cm4gdmFsO1xuICBpZighUyAmJiB0eXBlb2YgKGZuID0gaXQudG9TdHJpbmcpID09ICdmdW5jdGlvbicgJiYgIWlzT2JqZWN0KHZhbCA9IGZuLmNhbGwoaXQpKSlyZXR1cm4gdmFsO1xuICB0aHJvdyBUeXBlRXJyb3IoXCJDYW4ndCBjb252ZXJ0IG9iamVjdCB0byBwcmltaXRpdmUgdmFsdWVcIik7XG59OyIsInZhciBpZCA9IDBcbiAgLCBweCA9IE1hdGgucmFuZG9tKCk7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGtleSl7XG4gIHJldHVybiAnU3ltYm9sKCcuY29uY2F0KGtleSA9PT0gdW5kZWZpbmVkID8gJycgOiBrZXksICcpXycsICgrK2lkICsgcHgpLnRvU3RyaW5nKDM2KSk7XG59OyIsInZhciBzdG9yZSAgICAgID0gcmVxdWlyZSgnLi9fc2hhcmVkJykoJ3drcycpXG4gICwgdWlkICAgICAgICA9IHJlcXVpcmUoJy4vX3VpZCcpXG4gICwgU3ltYm9sICAgICA9IHJlcXVpcmUoJy4vX2dsb2JhbCcpLlN5bWJvbFxuICAsIFVTRV9TWU1CT0wgPSB0eXBlb2YgU3ltYm9sID09ICdmdW5jdGlvbic7XG5cbnZhciAkZXhwb3J0cyA9IG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24obmFtZSl7XG4gIHJldHVybiBzdG9yZVtuYW1lXSB8fCAoc3RvcmVbbmFtZV0gPVxuICAgIFVTRV9TWU1CT0wgJiYgU3ltYm9sW25hbWVdIHx8IChVU0VfU1lNQk9MID8gU3ltYm9sIDogdWlkKSgnU3ltYm9sLicgKyBuYW1lKSk7XG59O1xuXG4kZXhwb3J0cy5zdG9yZSA9IHN0b3JlOyIsInZhciBjbGFzc29mICAgPSByZXF1aXJlKCcuL19jbGFzc29mJylcbiAgLCBJVEVSQVRPUiAgPSByZXF1aXJlKCcuL193a3MnKSgnaXRlcmF0b3InKVxuICAsIEl0ZXJhdG9ycyA9IHJlcXVpcmUoJy4vX2l0ZXJhdG9ycycpO1xubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL19jb3JlJykuZ2V0SXRlcmF0b3JNZXRob2QgPSBmdW5jdGlvbihpdCl7XG4gIGlmKGl0ICE9IHVuZGVmaW5lZClyZXR1cm4gaXRbSVRFUkFUT1JdXG4gICAgfHwgaXRbJ0BAaXRlcmF0b3InXVxuICAgIHx8IEl0ZXJhdG9yc1tjbGFzc29mKGl0KV07XG59OyIsIid1c2Ugc3RyaWN0JztcbnZhciBhZGRUb1Vuc2NvcGFibGVzID0gcmVxdWlyZSgnLi9fYWRkLXRvLXVuc2NvcGFibGVzJylcbiAgLCBzdGVwICAgICAgICAgICAgID0gcmVxdWlyZSgnLi9faXRlci1zdGVwJylcbiAgLCBJdGVyYXRvcnMgICAgICAgID0gcmVxdWlyZSgnLi9faXRlcmF0b3JzJylcbiAgLCB0b0lPYmplY3QgICAgICAgID0gcmVxdWlyZSgnLi9fdG8taW9iamVjdCcpO1xuXG4vLyAyMi4xLjMuNCBBcnJheS5wcm90b3R5cGUuZW50cmllcygpXG4vLyAyMi4xLjMuMTMgQXJyYXkucHJvdG90eXBlLmtleXMoKVxuLy8gMjIuMS4zLjI5IEFycmF5LnByb3RvdHlwZS52YWx1ZXMoKVxuLy8gMjIuMS4zLjMwIEFycmF5LnByb3RvdHlwZVtAQGl0ZXJhdG9yXSgpXG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vX2l0ZXItZGVmaW5lJykoQXJyYXksICdBcnJheScsIGZ1bmN0aW9uKGl0ZXJhdGVkLCBraW5kKXtcbiAgdGhpcy5fdCA9IHRvSU9iamVjdChpdGVyYXRlZCk7IC8vIHRhcmdldFxuICB0aGlzLl9pID0gMDsgICAgICAgICAgICAgICAgICAgLy8gbmV4dCBpbmRleFxuICB0aGlzLl9rID0ga2luZDsgICAgICAgICAgICAgICAgLy8ga2luZFxuLy8gMjIuMS41LjIuMSAlQXJyYXlJdGVyYXRvclByb3RvdHlwZSUubmV4dCgpXG59LCBmdW5jdGlvbigpe1xuICB2YXIgTyAgICAgPSB0aGlzLl90XG4gICAgLCBraW5kICA9IHRoaXMuX2tcbiAgICAsIGluZGV4ID0gdGhpcy5faSsrO1xuICBpZighTyB8fCBpbmRleCA+PSBPLmxlbmd0aCl7XG4gICAgdGhpcy5fdCA9IHVuZGVmaW5lZDtcbiAgICByZXR1cm4gc3RlcCgxKTtcbiAgfVxuICBpZihraW5kID09ICdrZXlzJyAgKXJldHVybiBzdGVwKDAsIGluZGV4KTtcbiAgaWYoa2luZCA9PSAndmFsdWVzJylyZXR1cm4gc3RlcCgwLCBPW2luZGV4XSk7XG4gIHJldHVybiBzdGVwKDAsIFtpbmRleCwgT1tpbmRleF1dKTtcbn0sICd2YWx1ZXMnKTtcblxuLy8gYXJndW1lbnRzTGlzdFtAQGl0ZXJhdG9yXSBpcyAlQXJyYXlQcm90b192YWx1ZXMlICg5LjQuNC42LCA5LjQuNC43KVxuSXRlcmF0b3JzLkFyZ3VtZW50cyA9IEl0ZXJhdG9ycy5BcnJheTtcblxuYWRkVG9VbnNjb3BhYmxlcygna2V5cycpO1xuYWRkVG9VbnNjb3BhYmxlcygndmFsdWVzJyk7XG5hZGRUb1Vuc2NvcGFibGVzKCdlbnRyaWVzJyk7IiwiJ3VzZSBzdHJpY3QnO1xuLy8gMTkuMS4zLjYgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZygpXG52YXIgY2xhc3NvZiA9IHJlcXVpcmUoJy4vX2NsYXNzb2YnKVxuICAsIHRlc3QgICAgPSB7fTtcbnRlc3RbcmVxdWlyZSgnLi9fd2tzJykoJ3RvU3RyaW5nVGFnJyldID0gJ3onO1xuaWYodGVzdCArICcnICE9ICdbb2JqZWN0IHpdJyl7XG4gIHJlcXVpcmUoJy4vX3JlZGVmaW5lJykoT2JqZWN0LnByb3RvdHlwZSwgJ3RvU3RyaW5nJywgZnVuY3Rpb24gdG9TdHJpbmcoKXtcbiAgICByZXR1cm4gJ1tvYmplY3QgJyArIGNsYXNzb2YodGhpcykgKyAnXSc7XG4gIH0sIHRydWUpO1xufSIsIid1c2Ugc3RyaWN0JztcbnZhciBMSUJSQVJZICAgICAgICAgICAgPSByZXF1aXJlKCcuL19saWJyYXJ5JylcbiAgLCBnbG9iYWwgICAgICAgICAgICAgPSByZXF1aXJlKCcuL19nbG9iYWwnKVxuICAsIGN0eCAgICAgICAgICAgICAgICA9IHJlcXVpcmUoJy4vX2N0eCcpXG4gICwgY2xhc3NvZiAgICAgICAgICAgID0gcmVxdWlyZSgnLi9fY2xhc3NvZicpXG4gICwgJGV4cG9ydCAgICAgICAgICAgID0gcmVxdWlyZSgnLi9fZXhwb3J0JylcbiAgLCBpc09iamVjdCAgICAgICAgICAgPSByZXF1aXJlKCcuL19pcy1vYmplY3QnKVxuICAsIGFGdW5jdGlvbiAgICAgICAgICA9IHJlcXVpcmUoJy4vX2EtZnVuY3Rpb24nKVxuICAsIGFuSW5zdGFuY2UgICAgICAgICA9IHJlcXVpcmUoJy4vX2FuLWluc3RhbmNlJylcbiAgLCBmb3JPZiAgICAgICAgICAgICAgPSByZXF1aXJlKCcuL19mb3Itb2YnKVxuICAsIHNwZWNpZXNDb25zdHJ1Y3RvciA9IHJlcXVpcmUoJy4vX3NwZWNpZXMtY29uc3RydWN0b3InKVxuICAsIHRhc2sgICAgICAgICAgICAgICA9IHJlcXVpcmUoJy4vX3Rhc2snKS5zZXRcbiAgLCBtaWNyb3Rhc2sgICAgICAgICAgPSByZXF1aXJlKCcuL19taWNyb3Rhc2snKSgpXG4gICwgUFJPTUlTRSAgICAgICAgICAgID0gJ1Byb21pc2UnXG4gICwgVHlwZUVycm9yICAgICAgICAgID0gZ2xvYmFsLlR5cGVFcnJvclxuICAsIHByb2Nlc3MgICAgICAgICAgICA9IGdsb2JhbC5wcm9jZXNzXG4gICwgJFByb21pc2UgICAgICAgICAgID0gZ2xvYmFsW1BST01JU0VdXG4gICwgcHJvY2VzcyAgICAgICAgICAgID0gZ2xvYmFsLnByb2Nlc3NcbiAgLCBpc05vZGUgICAgICAgICAgICAgPSBjbGFzc29mKHByb2Nlc3MpID09ICdwcm9jZXNzJ1xuICAsIGVtcHR5ICAgICAgICAgICAgICA9IGZ1bmN0aW9uKCl7IC8qIGVtcHR5ICovIH1cbiAgLCBJbnRlcm5hbCwgR2VuZXJpY1Byb21pc2VDYXBhYmlsaXR5LCBXcmFwcGVyO1xuXG52YXIgVVNFX05BVElWRSA9ICEhZnVuY3Rpb24oKXtcbiAgdHJ5IHtcbiAgICAvLyBjb3JyZWN0IHN1YmNsYXNzaW5nIHdpdGggQEBzcGVjaWVzIHN1cHBvcnRcbiAgICB2YXIgcHJvbWlzZSAgICAgPSAkUHJvbWlzZS5yZXNvbHZlKDEpXG4gICAgICAsIEZha2VQcm9taXNlID0gKHByb21pc2UuY29uc3RydWN0b3IgPSB7fSlbcmVxdWlyZSgnLi9fd2tzJykoJ3NwZWNpZXMnKV0gPSBmdW5jdGlvbihleGVjKXsgZXhlYyhlbXB0eSwgZW1wdHkpOyB9O1xuICAgIC8vIHVuaGFuZGxlZCByZWplY3Rpb25zIHRyYWNraW5nIHN1cHBvcnQsIE5vZGVKUyBQcm9taXNlIHdpdGhvdXQgaXQgZmFpbHMgQEBzcGVjaWVzIHRlc3RcbiAgICByZXR1cm4gKGlzTm9kZSB8fCB0eXBlb2YgUHJvbWlzZVJlamVjdGlvbkV2ZW50ID09ICdmdW5jdGlvbicpICYmIHByb21pc2UudGhlbihlbXB0eSkgaW5zdGFuY2VvZiBGYWtlUHJvbWlzZTtcbiAgfSBjYXRjaChlKXsgLyogZW1wdHkgKi8gfVxufSgpO1xuXG4vLyBoZWxwZXJzXG52YXIgc2FtZUNvbnN0cnVjdG9yID0gZnVuY3Rpb24oYSwgYil7XG4gIC8vIHdpdGggbGlicmFyeSB3cmFwcGVyIHNwZWNpYWwgY2FzZVxuICByZXR1cm4gYSA9PT0gYiB8fCBhID09PSAkUHJvbWlzZSAmJiBiID09PSBXcmFwcGVyO1xufTtcbnZhciBpc1RoZW5hYmxlID0gZnVuY3Rpb24oaXQpe1xuICB2YXIgdGhlbjtcbiAgcmV0dXJuIGlzT2JqZWN0KGl0KSAmJiB0eXBlb2YgKHRoZW4gPSBpdC50aGVuKSA9PSAnZnVuY3Rpb24nID8gdGhlbiA6IGZhbHNlO1xufTtcbnZhciBuZXdQcm9taXNlQ2FwYWJpbGl0eSA9IGZ1bmN0aW9uKEMpe1xuICByZXR1cm4gc2FtZUNvbnN0cnVjdG9yKCRQcm9taXNlLCBDKVxuICAgID8gbmV3IFByb21pc2VDYXBhYmlsaXR5KEMpXG4gICAgOiBuZXcgR2VuZXJpY1Byb21pc2VDYXBhYmlsaXR5KEMpO1xufTtcbnZhciBQcm9taXNlQ2FwYWJpbGl0eSA9IEdlbmVyaWNQcm9taXNlQ2FwYWJpbGl0eSA9IGZ1bmN0aW9uKEMpe1xuICB2YXIgcmVzb2x2ZSwgcmVqZWN0O1xuICB0aGlzLnByb21pc2UgPSBuZXcgQyhmdW5jdGlvbigkJHJlc29sdmUsICQkcmVqZWN0KXtcbiAgICBpZihyZXNvbHZlICE9PSB1bmRlZmluZWQgfHwgcmVqZWN0ICE9PSB1bmRlZmluZWQpdGhyb3cgVHlwZUVycm9yKCdCYWQgUHJvbWlzZSBjb25zdHJ1Y3RvcicpO1xuICAgIHJlc29sdmUgPSAkJHJlc29sdmU7XG4gICAgcmVqZWN0ICA9ICQkcmVqZWN0O1xuICB9KTtcbiAgdGhpcy5yZXNvbHZlID0gYUZ1bmN0aW9uKHJlc29sdmUpO1xuICB0aGlzLnJlamVjdCAgPSBhRnVuY3Rpb24ocmVqZWN0KTtcbn07XG52YXIgcGVyZm9ybSA9IGZ1bmN0aW9uKGV4ZWMpe1xuICB0cnkge1xuICAgIGV4ZWMoKTtcbiAgfSBjYXRjaChlKXtcbiAgICByZXR1cm4ge2Vycm9yOiBlfTtcbiAgfVxufTtcbnZhciBub3RpZnkgPSBmdW5jdGlvbihwcm9taXNlLCBpc1JlamVjdCl7XG4gIGlmKHByb21pc2UuX24pcmV0dXJuO1xuICBwcm9taXNlLl9uID0gdHJ1ZTtcbiAgdmFyIGNoYWluID0gcHJvbWlzZS5fYztcbiAgbWljcm90YXNrKGZ1bmN0aW9uKCl7XG4gICAgdmFyIHZhbHVlID0gcHJvbWlzZS5fdlxuICAgICAgLCBvayAgICA9IHByb21pc2UuX3MgPT0gMVxuICAgICAgLCBpICAgICA9IDA7XG4gICAgdmFyIHJ1biA9IGZ1bmN0aW9uKHJlYWN0aW9uKXtcbiAgICAgIHZhciBoYW5kbGVyID0gb2sgPyByZWFjdGlvbi5vayA6IHJlYWN0aW9uLmZhaWxcbiAgICAgICAgLCByZXNvbHZlID0gcmVhY3Rpb24ucmVzb2x2ZVxuICAgICAgICAsIHJlamVjdCAgPSByZWFjdGlvbi5yZWplY3RcbiAgICAgICAgLCBkb21haW4gID0gcmVhY3Rpb24uZG9tYWluXG4gICAgICAgICwgcmVzdWx0LCB0aGVuO1xuICAgICAgdHJ5IHtcbiAgICAgICAgaWYoaGFuZGxlcil7XG4gICAgICAgICAgaWYoIW9rKXtcbiAgICAgICAgICAgIGlmKHByb21pc2UuX2ggPT0gMilvbkhhbmRsZVVuaGFuZGxlZChwcm9taXNlKTtcbiAgICAgICAgICAgIHByb21pc2UuX2ggPSAxO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZihoYW5kbGVyID09PSB0cnVlKXJlc3VsdCA9IHZhbHVlO1xuICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaWYoZG9tYWluKWRvbWFpbi5lbnRlcigpO1xuICAgICAgICAgICAgcmVzdWx0ID0gaGFuZGxlcih2YWx1ZSk7XG4gICAgICAgICAgICBpZihkb21haW4pZG9tYWluLmV4aXQoKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYocmVzdWx0ID09PSByZWFjdGlvbi5wcm9taXNlKXtcbiAgICAgICAgICAgIHJlamVjdChUeXBlRXJyb3IoJ1Byb21pc2UtY2hhaW4gY3ljbGUnKSk7XG4gICAgICAgICAgfSBlbHNlIGlmKHRoZW4gPSBpc1RoZW5hYmxlKHJlc3VsdCkpe1xuICAgICAgICAgICAgdGhlbi5jYWxsKHJlc3VsdCwgcmVzb2x2ZSwgcmVqZWN0KTtcbiAgICAgICAgICB9IGVsc2UgcmVzb2x2ZShyZXN1bHQpO1xuICAgICAgICB9IGVsc2UgcmVqZWN0KHZhbHVlKTtcbiAgICAgIH0gY2F0Y2goZSl7XG4gICAgICAgIHJlamVjdChlKTtcbiAgICAgIH1cbiAgICB9O1xuICAgIHdoaWxlKGNoYWluLmxlbmd0aCA+IGkpcnVuKGNoYWluW2krK10pOyAvLyB2YXJpYWJsZSBsZW5ndGggLSBjYW4ndCB1c2UgZm9yRWFjaFxuICAgIHByb21pc2UuX2MgPSBbXTtcbiAgICBwcm9taXNlLl9uID0gZmFsc2U7XG4gICAgaWYoaXNSZWplY3QgJiYgIXByb21pc2UuX2gpb25VbmhhbmRsZWQocHJvbWlzZSk7XG4gIH0pO1xufTtcbnZhciBvblVuaGFuZGxlZCA9IGZ1bmN0aW9uKHByb21pc2Upe1xuICB0YXNrLmNhbGwoZ2xvYmFsLCBmdW5jdGlvbigpe1xuICAgIHZhciB2YWx1ZSA9IHByb21pc2UuX3ZcbiAgICAgICwgYWJydXB0LCBoYW5kbGVyLCBjb25zb2xlO1xuICAgIGlmKGlzVW5oYW5kbGVkKHByb21pc2UpKXtcbiAgICAgIGFicnVwdCA9IHBlcmZvcm0oZnVuY3Rpb24oKXtcbiAgICAgICAgaWYoaXNOb2RlKXtcbiAgICAgICAgICBwcm9jZXNzLmVtaXQoJ3VuaGFuZGxlZFJlamVjdGlvbicsIHZhbHVlLCBwcm9taXNlKTtcbiAgICAgICAgfSBlbHNlIGlmKGhhbmRsZXIgPSBnbG9iYWwub251bmhhbmRsZWRyZWplY3Rpb24pe1xuICAgICAgICAgIGhhbmRsZXIoe3Byb21pc2U6IHByb21pc2UsIHJlYXNvbjogdmFsdWV9KTtcbiAgICAgICAgfSBlbHNlIGlmKChjb25zb2xlID0gZ2xvYmFsLmNvbnNvbGUpICYmIGNvbnNvbGUuZXJyb3Ipe1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ1VuaGFuZGxlZCBwcm9taXNlIHJlamVjdGlvbicsIHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICAvLyBCcm93c2VycyBzaG91bGQgbm90IHRyaWdnZXIgYHJlamVjdGlvbkhhbmRsZWRgIGV2ZW50IGlmIGl0IHdhcyBoYW5kbGVkIGhlcmUsIE5vZGVKUyAtIHNob3VsZFxuICAgICAgcHJvbWlzZS5faCA9IGlzTm9kZSB8fCBpc1VuaGFuZGxlZChwcm9taXNlKSA/IDIgOiAxO1xuICAgIH0gcHJvbWlzZS5fYSA9IHVuZGVmaW5lZDtcbiAgICBpZihhYnJ1cHQpdGhyb3cgYWJydXB0LmVycm9yO1xuICB9KTtcbn07XG52YXIgaXNVbmhhbmRsZWQgPSBmdW5jdGlvbihwcm9taXNlKXtcbiAgaWYocHJvbWlzZS5faCA9PSAxKXJldHVybiBmYWxzZTtcbiAgdmFyIGNoYWluID0gcHJvbWlzZS5fYSB8fCBwcm9taXNlLl9jXG4gICAgLCBpICAgICA9IDBcbiAgICAsIHJlYWN0aW9uO1xuICB3aGlsZShjaGFpbi5sZW5ndGggPiBpKXtcbiAgICByZWFjdGlvbiA9IGNoYWluW2krK107XG4gICAgaWYocmVhY3Rpb24uZmFpbCB8fCAhaXNVbmhhbmRsZWQocmVhY3Rpb24ucHJvbWlzZSkpcmV0dXJuIGZhbHNlO1xuICB9IHJldHVybiB0cnVlO1xufTtcbnZhciBvbkhhbmRsZVVuaGFuZGxlZCA9IGZ1bmN0aW9uKHByb21pc2Upe1xuICB0YXNrLmNhbGwoZ2xvYmFsLCBmdW5jdGlvbigpe1xuICAgIHZhciBoYW5kbGVyO1xuICAgIGlmKGlzTm9kZSl7XG4gICAgICBwcm9jZXNzLmVtaXQoJ3JlamVjdGlvbkhhbmRsZWQnLCBwcm9taXNlKTtcbiAgICB9IGVsc2UgaWYoaGFuZGxlciA9IGdsb2JhbC5vbnJlamVjdGlvbmhhbmRsZWQpe1xuICAgICAgaGFuZGxlcih7cHJvbWlzZTogcHJvbWlzZSwgcmVhc29uOiBwcm9taXNlLl92fSk7XG4gICAgfVxuICB9KTtcbn07XG52YXIgJHJlamVjdCA9IGZ1bmN0aW9uKHZhbHVlKXtcbiAgdmFyIHByb21pc2UgPSB0aGlzO1xuICBpZihwcm9taXNlLl9kKXJldHVybjtcbiAgcHJvbWlzZS5fZCA9IHRydWU7XG4gIHByb21pc2UgPSBwcm9taXNlLl93IHx8IHByb21pc2U7IC8vIHVud3JhcFxuICBwcm9taXNlLl92ID0gdmFsdWU7XG4gIHByb21pc2UuX3MgPSAyO1xuICBpZighcHJvbWlzZS5fYSlwcm9taXNlLl9hID0gcHJvbWlzZS5fYy5zbGljZSgpO1xuICBub3RpZnkocHJvbWlzZSwgdHJ1ZSk7XG59O1xudmFyICRyZXNvbHZlID0gZnVuY3Rpb24odmFsdWUpe1xuICB2YXIgcHJvbWlzZSA9IHRoaXNcbiAgICAsIHRoZW47XG4gIGlmKHByb21pc2UuX2QpcmV0dXJuO1xuICBwcm9taXNlLl9kID0gdHJ1ZTtcbiAgcHJvbWlzZSA9IHByb21pc2UuX3cgfHwgcHJvbWlzZTsgLy8gdW53cmFwXG4gIHRyeSB7XG4gICAgaWYocHJvbWlzZSA9PT0gdmFsdWUpdGhyb3cgVHlwZUVycm9yKFwiUHJvbWlzZSBjYW4ndCBiZSByZXNvbHZlZCBpdHNlbGZcIik7XG4gICAgaWYodGhlbiA9IGlzVGhlbmFibGUodmFsdWUpKXtcbiAgICAgIG1pY3JvdGFzayhmdW5jdGlvbigpe1xuICAgICAgICB2YXIgd3JhcHBlciA9IHtfdzogcHJvbWlzZSwgX2Q6IGZhbHNlfTsgLy8gd3JhcFxuICAgICAgICB0cnkge1xuICAgICAgICAgIHRoZW4uY2FsbCh2YWx1ZSwgY3R4KCRyZXNvbHZlLCB3cmFwcGVyLCAxKSwgY3R4KCRyZWplY3QsIHdyYXBwZXIsIDEpKTtcbiAgICAgICAgfSBjYXRjaChlKXtcbiAgICAgICAgICAkcmVqZWN0LmNhbGwod3JhcHBlciwgZSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBwcm9taXNlLl92ID0gdmFsdWU7XG4gICAgICBwcm9taXNlLl9zID0gMTtcbiAgICAgIG5vdGlmeShwcm9taXNlLCBmYWxzZSk7XG4gICAgfVxuICB9IGNhdGNoKGUpe1xuICAgICRyZWplY3QuY2FsbCh7X3c6IHByb21pc2UsIF9kOiBmYWxzZX0sIGUpOyAvLyB3cmFwXG4gIH1cbn07XG5cbi8vIGNvbnN0cnVjdG9yIHBvbHlmaWxsXG5pZighVVNFX05BVElWRSl7XG4gIC8vIDI1LjQuMy4xIFByb21pc2UoZXhlY3V0b3IpXG4gICRQcm9taXNlID0gZnVuY3Rpb24gUHJvbWlzZShleGVjdXRvcil7XG4gICAgYW5JbnN0YW5jZSh0aGlzLCAkUHJvbWlzZSwgUFJPTUlTRSwgJ19oJyk7XG4gICAgYUZ1bmN0aW9uKGV4ZWN1dG9yKTtcbiAgICBJbnRlcm5hbC5jYWxsKHRoaXMpO1xuICAgIHRyeSB7XG4gICAgICBleGVjdXRvcihjdHgoJHJlc29sdmUsIHRoaXMsIDEpLCBjdHgoJHJlamVjdCwgdGhpcywgMSkpO1xuICAgIH0gY2F0Y2goZXJyKXtcbiAgICAgICRyZWplY3QuY2FsbCh0aGlzLCBlcnIpO1xuICAgIH1cbiAgfTtcbiAgSW50ZXJuYWwgPSBmdW5jdGlvbiBQcm9taXNlKGV4ZWN1dG9yKXtcbiAgICB0aGlzLl9jID0gW107ICAgICAgICAgICAgIC8vIDwtIGF3YWl0aW5nIHJlYWN0aW9uc1xuICAgIHRoaXMuX2EgPSB1bmRlZmluZWQ7ICAgICAgLy8gPC0gY2hlY2tlZCBpbiBpc1VuaGFuZGxlZCByZWFjdGlvbnNcbiAgICB0aGlzLl9zID0gMDsgICAgICAgICAgICAgIC8vIDwtIHN0YXRlXG4gICAgdGhpcy5fZCA9IGZhbHNlOyAgICAgICAgICAvLyA8LSBkb25lXG4gICAgdGhpcy5fdiA9IHVuZGVmaW5lZDsgICAgICAvLyA8LSB2YWx1ZVxuICAgIHRoaXMuX2ggPSAwOyAgICAgICAgICAgICAgLy8gPC0gcmVqZWN0aW9uIHN0YXRlLCAwIC0gZGVmYXVsdCwgMSAtIGhhbmRsZWQsIDIgLSB1bmhhbmRsZWRcbiAgICB0aGlzLl9uID0gZmFsc2U7ICAgICAgICAgIC8vIDwtIG5vdGlmeVxuICB9O1xuICBJbnRlcm5hbC5wcm90b3R5cGUgPSByZXF1aXJlKCcuL19yZWRlZmluZS1hbGwnKSgkUHJvbWlzZS5wcm90b3R5cGUsIHtcbiAgICAvLyAyNS40LjUuMyBQcm9taXNlLnByb3RvdHlwZS50aGVuKG9uRnVsZmlsbGVkLCBvblJlamVjdGVkKVxuICAgIHRoZW46IGZ1bmN0aW9uIHRoZW4ob25GdWxmaWxsZWQsIG9uUmVqZWN0ZWQpe1xuICAgICAgdmFyIHJlYWN0aW9uICAgID0gbmV3UHJvbWlzZUNhcGFiaWxpdHkoc3BlY2llc0NvbnN0cnVjdG9yKHRoaXMsICRQcm9taXNlKSk7XG4gICAgICByZWFjdGlvbi5vayAgICAgPSB0eXBlb2Ygb25GdWxmaWxsZWQgPT0gJ2Z1bmN0aW9uJyA/IG9uRnVsZmlsbGVkIDogdHJ1ZTtcbiAgICAgIHJlYWN0aW9uLmZhaWwgICA9IHR5cGVvZiBvblJlamVjdGVkID09ICdmdW5jdGlvbicgJiYgb25SZWplY3RlZDtcbiAgICAgIHJlYWN0aW9uLmRvbWFpbiA9IGlzTm9kZSA/IHByb2Nlc3MuZG9tYWluIDogdW5kZWZpbmVkO1xuICAgICAgdGhpcy5fYy5wdXNoKHJlYWN0aW9uKTtcbiAgICAgIGlmKHRoaXMuX2EpdGhpcy5fYS5wdXNoKHJlYWN0aW9uKTtcbiAgICAgIGlmKHRoaXMuX3Mpbm90aWZ5KHRoaXMsIGZhbHNlKTtcbiAgICAgIHJldHVybiByZWFjdGlvbi5wcm9taXNlO1xuICAgIH0sXG4gICAgLy8gMjUuNC41LjEgUHJvbWlzZS5wcm90b3R5cGUuY2F0Y2gob25SZWplY3RlZClcbiAgICAnY2F0Y2gnOiBmdW5jdGlvbihvblJlamVjdGVkKXtcbiAgICAgIHJldHVybiB0aGlzLnRoZW4odW5kZWZpbmVkLCBvblJlamVjdGVkKTtcbiAgICB9XG4gIH0pO1xuICBQcm9taXNlQ2FwYWJpbGl0eSA9IGZ1bmN0aW9uKCl7XG4gICAgdmFyIHByb21pc2UgID0gbmV3IEludGVybmFsO1xuICAgIHRoaXMucHJvbWlzZSA9IHByb21pc2U7XG4gICAgdGhpcy5yZXNvbHZlID0gY3R4KCRyZXNvbHZlLCBwcm9taXNlLCAxKTtcbiAgICB0aGlzLnJlamVjdCAgPSBjdHgoJHJlamVjdCwgcHJvbWlzZSwgMSk7XG4gIH07XG59XG5cbiRleHBvcnQoJGV4cG9ydC5HICsgJGV4cG9ydC5XICsgJGV4cG9ydC5GICogIVVTRV9OQVRJVkUsIHtQcm9taXNlOiAkUHJvbWlzZX0pO1xucmVxdWlyZSgnLi9fc2V0LXRvLXN0cmluZy10YWcnKSgkUHJvbWlzZSwgUFJPTUlTRSk7XG5yZXF1aXJlKCcuL19zZXQtc3BlY2llcycpKFBST01JU0UpO1xuV3JhcHBlciA9IHJlcXVpcmUoJy4vX2NvcmUnKVtQUk9NSVNFXTtcblxuLy8gc3RhdGljc1xuJGV4cG9ydCgkZXhwb3J0LlMgKyAkZXhwb3J0LkYgKiAhVVNFX05BVElWRSwgUFJPTUlTRSwge1xuICAvLyAyNS40LjQuNSBQcm9taXNlLnJlamVjdChyKVxuICByZWplY3Q6IGZ1bmN0aW9uIHJlamVjdChyKXtcbiAgICB2YXIgY2FwYWJpbGl0eSA9IG5ld1Byb21pc2VDYXBhYmlsaXR5KHRoaXMpXG4gICAgICAsICQkcmVqZWN0ICAgPSBjYXBhYmlsaXR5LnJlamVjdDtcbiAgICAkJHJlamVjdChyKTtcbiAgICByZXR1cm4gY2FwYWJpbGl0eS5wcm9taXNlO1xuICB9XG59KTtcbiRleHBvcnQoJGV4cG9ydC5TICsgJGV4cG9ydC5GICogKExJQlJBUlkgfHwgIVVTRV9OQVRJVkUpLCBQUk9NSVNFLCB7XG4gIC8vIDI1LjQuNC42IFByb21pc2UucmVzb2x2ZSh4KVxuICByZXNvbHZlOiBmdW5jdGlvbiByZXNvbHZlKHgpe1xuICAgIC8vIGluc3RhbmNlb2YgaW5zdGVhZCBvZiBpbnRlcm5hbCBzbG90IGNoZWNrIGJlY2F1c2Ugd2Ugc2hvdWxkIGZpeCBpdCB3aXRob3V0IHJlcGxhY2VtZW50IG5hdGl2ZSBQcm9taXNlIGNvcmVcbiAgICBpZih4IGluc3RhbmNlb2YgJFByb21pc2UgJiYgc2FtZUNvbnN0cnVjdG9yKHguY29uc3RydWN0b3IsIHRoaXMpKXJldHVybiB4O1xuICAgIHZhciBjYXBhYmlsaXR5ID0gbmV3UHJvbWlzZUNhcGFiaWxpdHkodGhpcylcbiAgICAgICwgJCRyZXNvbHZlICA9IGNhcGFiaWxpdHkucmVzb2x2ZTtcbiAgICAkJHJlc29sdmUoeCk7XG4gICAgcmV0dXJuIGNhcGFiaWxpdHkucHJvbWlzZTtcbiAgfVxufSk7XG4kZXhwb3J0KCRleHBvcnQuUyArICRleHBvcnQuRiAqICEoVVNFX05BVElWRSAmJiByZXF1aXJlKCcuL19pdGVyLWRldGVjdCcpKGZ1bmN0aW9uKGl0ZXIpe1xuICAkUHJvbWlzZS5hbGwoaXRlcilbJ2NhdGNoJ10oZW1wdHkpO1xufSkpLCBQUk9NSVNFLCB7XG4gIC8vIDI1LjQuNC4xIFByb21pc2UuYWxsKGl0ZXJhYmxlKVxuICBhbGw6IGZ1bmN0aW9uIGFsbChpdGVyYWJsZSl7XG4gICAgdmFyIEMgICAgICAgICAgPSB0aGlzXG4gICAgICAsIGNhcGFiaWxpdHkgPSBuZXdQcm9taXNlQ2FwYWJpbGl0eShDKVxuICAgICAgLCByZXNvbHZlICAgID0gY2FwYWJpbGl0eS5yZXNvbHZlXG4gICAgICAsIHJlamVjdCAgICAgPSBjYXBhYmlsaXR5LnJlamVjdDtcbiAgICB2YXIgYWJydXB0ID0gcGVyZm9ybShmdW5jdGlvbigpe1xuICAgICAgdmFyIHZhbHVlcyAgICA9IFtdXG4gICAgICAgICwgaW5kZXggICAgID0gMFxuICAgICAgICAsIHJlbWFpbmluZyA9IDE7XG4gICAgICBmb3JPZihpdGVyYWJsZSwgZmFsc2UsIGZ1bmN0aW9uKHByb21pc2Upe1xuICAgICAgICB2YXIgJGluZGV4ICAgICAgICA9IGluZGV4KytcbiAgICAgICAgICAsIGFscmVhZHlDYWxsZWQgPSBmYWxzZTtcbiAgICAgICAgdmFsdWVzLnB1c2godW5kZWZpbmVkKTtcbiAgICAgICAgcmVtYWluaW5nKys7XG4gICAgICAgIEMucmVzb2x2ZShwcm9taXNlKS50aGVuKGZ1bmN0aW9uKHZhbHVlKXtcbiAgICAgICAgICBpZihhbHJlYWR5Q2FsbGVkKXJldHVybjtcbiAgICAgICAgICBhbHJlYWR5Q2FsbGVkICA9IHRydWU7XG4gICAgICAgICAgdmFsdWVzWyRpbmRleF0gPSB2YWx1ZTtcbiAgICAgICAgICAtLXJlbWFpbmluZyB8fCByZXNvbHZlKHZhbHVlcyk7XG4gICAgICAgIH0sIHJlamVjdCk7XG4gICAgICB9KTtcbiAgICAgIC0tcmVtYWluaW5nIHx8IHJlc29sdmUodmFsdWVzKTtcbiAgICB9KTtcbiAgICBpZihhYnJ1cHQpcmVqZWN0KGFicnVwdC5lcnJvcik7XG4gICAgcmV0dXJuIGNhcGFiaWxpdHkucHJvbWlzZTtcbiAgfSxcbiAgLy8gMjUuNC40LjQgUHJvbWlzZS5yYWNlKGl0ZXJhYmxlKVxuICByYWNlOiBmdW5jdGlvbiByYWNlKGl0ZXJhYmxlKXtcbiAgICB2YXIgQyAgICAgICAgICA9IHRoaXNcbiAgICAgICwgY2FwYWJpbGl0eSA9IG5ld1Byb21pc2VDYXBhYmlsaXR5KEMpXG4gICAgICAsIHJlamVjdCAgICAgPSBjYXBhYmlsaXR5LnJlamVjdDtcbiAgICB2YXIgYWJydXB0ID0gcGVyZm9ybShmdW5jdGlvbigpe1xuICAgICAgZm9yT2YoaXRlcmFibGUsIGZhbHNlLCBmdW5jdGlvbihwcm9taXNlKXtcbiAgICAgICAgQy5yZXNvbHZlKHByb21pc2UpLnRoZW4oY2FwYWJpbGl0eS5yZXNvbHZlLCByZWplY3QpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gICAgaWYoYWJydXB0KXJlamVjdChhYnJ1cHQuZXJyb3IpO1xuICAgIHJldHVybiBjYXBhYmlsaXR5LnByb21pc2U7XG4gIH1cbn0pOyIsIid1c2Ugc3RyaWN0JztcbnZhciAkYXQgID0gcmVxdWlyZSgnLi9fc3RyaW5nLWF0JykodHJ1ZSk7XG5cbi8vIDIxLjEuMy4yNyBTdHJpbmcucHJvdG90eXBlW0BAaXRlcmF0b3JdKClcbnJlcXVpcmUoJy4vX2l0ZXItZGVmaW5lJykoU3RyaW5nLCAnU3RyaW5nJywgZnVuY3Rpb24oaXRlcmF0ZWQpe1xuICB0aGlzLl90ID0gU3RyaW5nKGl0ZXJhdGVkKTsgLy8gdGFyZ2V0XG4gIHRoaXMuX2kgPSAwOyAgICAgICAgICAgICAgICAvLyBuZXh0IGluZGV4XG4vLyAyMS4xLjUuMi4xICVTdHJpbmdJdGVyYXRvclByb3RvdHlwZSUubmV4dCgpXG59LCBmdW5jdGlvbigpe1xuICB2YXIgTyAgICAgPSB0aGlzLl90XG4gICAgLCBpbmRleCA9IHRoaXMuX2lcbiAgICAsIHBvaW50O1xuICBpZihpbmRleCA+PSBPLmxlbmd0aClyZXR1cm4ge3ZhbHVlOiB1bmRlZmluZWQsIGRvbmU6IHRydWV9O1xuICBwb2ludCA9ICRhdChPLCBpbmRleCk7XG4gIHRoaXMuX2kgKz0gcG9pbnQubGVuZ3RoO1xuICByZXR1cm4ge3ZhbHVlOiBwb2ludCwgZG9uZTogZmFsc2V9O1xufSk7IiwidmFyICRpdGVyYXRvcnMgICAgPSByZXF1aXJlKCcuL2VzNi5hcnJheS5pdGVyYXRvcicpXG4gICwgcmVkZWZpbmUgICAgICA9IHJlcXVpcmUoJy4vX3JlZGVmaW5lJylcbiAgLCBnbG9iYWwgICAgICAgID0gcmVxdWlyZSgnLi9fZ2xvYmFsJylcbiAgLCBoaWRlICAgICAgICAgID0gcmVxdWlyZSgnLi9faGlkZScpXG4gICwgSXRlcmF0b3JzICAgICA9IHJlcXVpcmUoJy4vX2l0ZXJhdG9ycycpXG4gICwgd2tzICAgICAgICAgICA9IHJlcXVpcmUoJy4vX3drcycpXG4gICwgSVRFUkFUT1IgICAgICA9IHdrcygnaXRlcmF0b3InKVxuICAsIFRPX1NUUklOR19UQUcgPSB3a3MoJ3RvU3RyaW5nVGFnJylcbiAgLCBBcnJheVZhbHVlcyAgID0gSXRlcmF0b3JzLkFycmF5O1xuXG5mb3IodmFyIGNvbGxlY3Rpb25zID0gWydOb2RlTGlzdCcsICdET01Ub2tlbkxpc3QnLCAnTWVkaWFMaXN0JywgJ1N0eWxlU2hlZXRMaXN0JywgJ0NTU1J1bGVMaXN0J10sIGkgPSAwOyBpIDwgNTsgaSsrKXtcbiAgdmFyIE5BTUUgICAgICAgPSBjb2xsZWN0aW9uc1tpXVxuICAgICwgQ29sbGVjdGlvbiA9IGdsb2JhbFtOQU1FXVxuICAgICwgcHJvdG8gICAgICA9IENvbGxlY3Rpb24gJiYgQ29sbGVjdGlvbi5wcm90b3R5cGVcbiAgICAsIGtleTtcbiAgaWYocHJvdG8pe1xuICAgIGlmKCFwcm90b1tJVEVSQVRPUl0paGlkZShwcm90bywgSVRFUkFUT1IsIEFycmF5VmFsdWVzKTtcbiAgICBpZighcHJvdG9bVE9fU1RSSU5HX1RBR10paGlkZShwcm90bywgVE9fU1RSSU5HX1RBRywgTkFNRSk7XG4gICAgSXRlcmF0b3JzW05BTUVdID0gQXJyYXlWYWx1ZXM7XG4gICAgZm9yKGtleSBpbiAkaXRlcmF0b3JzKWlmKCFwcm90b1trZXldKXJlZGVmaW5lKHByb3RvLCBrZXksICRpdGVyYXRvcnNba2V5XSwgdHJ1ZSk7XG4gIH1cbn0iLCIvLyAoYykgRGVhbiBNY05hbWVlIDxkZWFuQGdtYWlsLmNvbT4sIDIwMTIuXG4vL1xuLy8gaHR0cHM6Ly9naXRodWIuY29tL2RlYW5tL2Nzcy1jb2xvci1wYXJzZXItanNcbi8vXG4vLyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5XG4vLyBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSBcIlNvZnR3YXJlXCIpLCB0b1xuLy8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGVcbi8vIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vclxuLy8gc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXNcbi8vIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4vL1xuLy8gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW5cbi8vIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuLy9cbi8vIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1Jcbi8vIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLFxuLy8gRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFXG4vLyBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSXG4vLyBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lOR1xuLy8gRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HU1xuLy8gSU4gVEhFIFNPRlRXQVJFLlxuXG4vLyBodHRwOi8vd3d3LnczLm9yZy9UUi9jc3MzLWNvbG9yL1xudmFyIGtDU1NDb2xvclRhYmxlID0ge1xuICBcInRyYW5zcGFyZW50XCI6IFswLDAsMCwwXSwgXCJhbGljZWJsdWVcIjogWzI0MCwyNDgsMjU1LDFdLFxuICBcImFudGlxdWV3aGl0ZVwiOiBbMjUwLDIzNSwyMTUsMV0sIFwiYXF1YVwiOiBbMCwyNTUsMjU1LDFdLFxuICBcImFxdWFtYXJpbmVcIjogWzEyNywyNTUsMjEyLDFdLCBcImF6dXJlXCI6IFsyNDAsMjU1LDI1NSwxXSxcbiAgXCJiZWlnZVwiOiBbMjQ1LDI0NSwyMjAsMV0sIFwiYmlzcXVlXCI6IFsyNTUsMjI4LDE5NiwxXSxcbiAgXCJibGFja1wiOiBbMCwwLDAsMV0sIFwiYmxhbmNoZWRhbG1vbmRcIjogWzI1NSwyMzUsMjA1LDFdLFxuICBcImJsdWVcIjogWzAsMCwyNTUsMV0sIFwiYmx1ZXZpb2xldFwiOiBbMTM4LDQzLDIyNiwxXSxcbiAgXCJicm93blwiOiBbMTY1LDQyLDQyLDFdLCBcImJ1cmx5d29vZFwiOiBbMjIyLDE4NCwxMzUsMV0sXG4gIFwiY2FkZXRibHVlXCI6IFs5NSwxNTgsMTYwLDFdLCBcImNoYXJ0cmV1c2VcIjogWzEyNywyNTUsMCwxXSxcbiAgXCJjaG9jb2xhdGVcIjogWzIxMCwxMDUsMzAsMV0sIFwiY29yYWxcIjogWzI1NSwxMjcsODAsMV0sXG4gIFwiY29ybmZsb3dlcmJsdWVcIjogWzEwMCwxNDksMjM3LDFdLCBcImNvcm5zaWxrXCI6IFsyNTUsMjQ4LDIyMCwxXSxcbiAgXCJjcmltc29uXCI6IFsyMjAsMjAsNjAsMV0sIFwiY3lhblwiOiBbMCwyNTUsMjU1LDFdLFxuICBcImRhcmtibHVlXCI6IFswLDAsMTM5LDFdLCBcImRhcmtjeWFuXCI6IFswLDEzOSwxMzksMV0sXG4gIFwiZGFya2dvbGRlbnJvZFwiOiBbMTg0LDEzNCwxMSwxXSwgXCJkYXJrZ3JheVwiOiBbMTY5LDE2OSwxNjksMV0sXG4gIFwiZGFya2dyZWVuXCI6IFswLDEwMCwwLDFdLCBcImRhcmtncmV5XCI6IFsxNjksMTY5LDE2OSwxXSxcbiAgXCJkYXJra2hha2lcIjogWzE4OSwxODMsMTA3LDFdLCBcImRhcmttYWdlbnRhXCI6IFsxMzksMCwxMzksMV0sXG4gIFwiZGFya29saXZlZ3JlZW5cIjogWzg1LDEwNyw0NywxXSwgXCJkYXJrb3JhbmdlXCI6IFsyNTUsMTQwLDAsMV0sXG4gIFwiZGFya29yY2hpZFwiOiBbMTUzLDUwLDIwNCwxXSwgXCJkYXJrcmVkXCI6IFsxMzksMCwwLDFdLFxuICBcImRhcmtzYWxtb25cIjogWzIzMywxNTAsMTIyLDFdLCBcImRhcmtzZWFncmVlblwiOiBbMTQzLDE4OCwxNDMsMV0sXG4gIFwiZGFya3NsYXRlYmx1ZVwiOiBbNzIsNjEsMTM5LDFdLCBcImRhcmtzbGF0ZWdyYXlcIjogWzQ3LDc5LDc5LDFdLFxuICBcImRhcmtzbGF0ZWdyZXlcIjogWzQ3LDc5LDc5LDFdLCBcImRhcmt0dXJxdW9pc2VcIjogWzAsMjA2LDIwOSwxXSxcbiAgXCJkYXJrdmlvbGV0XCI6IFsxNDgsMCwyMTEsMV0sIFwiZGVlcHBpbmtcIjogWzI1NSwyMCwxNDcsMV0sXG4gIFwiZGVlcHNreWJsdWVcIjogWzAsMTkxLDI1NSwxXSwgXCJkaW1ncmF5XCI6IFsxMDUsMTA1LDEwNSwxXSxcbiAgXCJkaW1ncmV5XCI6IFsxMDUsMTA1LDEwNSwxXSwgXCJkb2RnZXJibHVlXCI6IFszMCwxNDQsMjU1LDFdLFxuICBcImZpcmVicmlja1wiOiBbMTc4LDM0LDM0LDFdLCBcImZsb3JhbHdoaXRlXCI6IFsyNTUsMjUwLDI0MCwxXSxcbiAgXCJmb3Jlc3RncmVlblwiOiBbMzQsMTM5LDM0LDFdLCBcImZ1Y2hzaWFcIjogWzI1NSwwLDI1NSwxXSxcbiAgXCJnYWluc2Jvcm9cIjogWzIyMCwyMjAsMjIwLDFdLCBcImdob3N0d2hpdGVcIjogWzI0OCwyNDgsMjU1LDFdLFxuICBcImdvbGRcIjogWzI1NSwyMTUsMCwxXSwgXCJnb2xkZW5yb2RcIjogWzIxOCwxNjUsMzIsMV0sXG4gIFwiZ3JheVwiOiBbMTI4LDEyOCwxMjgsMV0sIFwiZ3JlZW5cIjogWzAsMTI4LDAsMV0sXG4gIFwiZ3JlZW55ZWxsb3dcIjogWzE3MywyNTUsNDcsMV0sIFwiZ3JleVwiOiBbMTI4LDEyOCwxMjgsMV0sXG4gIFwiaG9uZXlkZXdcIjogWzI0MCwyNTUsMjQwLDFdLCBcImhvdHBpbmtcIjogWzI1NSwxMDUsMTgwLDFdLFxuICBcImluZGlhbnJlZFwiOiBbMjA1LDkyLDkyLDFdLCBcImluZGlnb1wiOiBbNzUsMCwxMzAsMV0sXG4gIFwiaXZvcnlcIjogWzI1NSwyNTUsMjQwLDFdLCBcImtoYWtpXCI6IFsyNDAsMjMwLDE0MCwxXSxcbiAgXCJsYXZlbmRlclwiOiBbMjMwLDIzMCwyNTAsMV0sIFwibGF2ZW5kZXJibHVzaFwiOiBbMjU1LDI0MCwyNDUsMV0sXG4gIFwibGF3bmdyZWVuXCI6IFsxMjQsMjUyLDAsMV0sIFwibGVtb25jaGlmZm9uXCI6IFsyNTUsMjUwLDIwNSwxXSxcbiAgXCJsaWdodGJsdWVcIjogWzE3MywyMTYsMjMwLDFdLCBcImxpZ2h0Y29yYWxcIjogWzI0MCwxMjgsMTI4LDFdLFxuICBcImxpZ2h0Y3lhblwiOiBbMjI0LDI1NSwyNTUsMV0sIFwibGlnaHRnb2xkZW5yb2R5ZWxsb3dcIjogWzI1MCwyNTAsMjEwLDFdLFxuICBcImxpZ2h0Z3JheVwiOiBbMjExLDIxMSwyMTEsMV0sIFwibGlnaHRncmVlblwiOiBbMTQ0LDIzOCwxNDQsMV0sXG4gIFwibGlnaHRncmV5XCI6IFsyMTEsMjExLDIxMSwxXSwgXCJsaWdodHBpbmtcIjogWzI1NSwxODIsMTkzLDFdLFxuICBcImxpZ2h0c2FsbW9uXCI6IFsyNTUsMTYwLDEyMiwxXSwgXCJsaWdodHNlYWdyZWVuXCI6IFszMiwxNzgsMTcwLDFdLFxuICBcImxpZ2h0c2t5Ymx1ZVwiOiBbMTM1LDIwNiwyNTAsMV0sIFwibGlnaHRzbGF0ZWdyYXlcIjogWzExOSwxMzYsMTUzLDFdLFxuICBcImxpZ2h0c2xhdGVncmV5XCI6IFsxMTksMTM2LDE1MywxXSwgXCJsaWdodHN0ZWVsYmx1ZVwiOiBbMTc2LDE5NiwyMjIsMV0sXG4gIFwibGlnaHR5ZWxsb3dcIjogWzI1NSwyNTUsMjI0LDFdLCBcImxpbWVcIjogWzAsMjU1LDAsMV0sXG4gIFwibGltZWdyZWVuXCI6IFs1MCwyMDUsNTAsMV0sIFwibGluZW5cIjogWzI1MCwyNDAsMjMwLDFdLFxuICBcIm1hZ2VudGFcIjogWzI1NSwwLDI1NSwxXSwgXCJtYXJvb25cIjogWzEyOCwwLDAsMV0sXG4gIFwibWVkaXVtYXF1YW1hcmluZVwiOiBbMTAyLDIwNSwxNzAsMV0sIFwibWVkaXVtYmx1ZVwiOiBbMCwwLDIwNSwxXSxcbiAgXCJtZWRpdW1vcmNoaWRcIjogWzE4Niw4NSwyMTEsMV0sIFwibWVkaXVtcHVycGxlXCI6IFsxNDcsMTEyLDIxOSwxXSxcbiAgXCJtZWRpdW1zZWFncmVlblwiOiBbNjAsMTc5LDExMywxXSwgXCJtZWRpdW1zbGF0ZWJsdWVcIjogWzEyMywxMDQsMjM4LDFdLFxuICBcIm1lZGl1bXNwcmluZ2dyZWVuXCI6IFswLDI1MCwxNTQsMV0sIFwibWVkaXVtdHVycXVvaXNlXCI6IFs3MiwyMDksMjA0LDFdLFxuICBcIm1lZGl1bXZpb2xldHJlZFwiOiBbMTk5LDIxLDEzMywxXSwgXCJtaWRuaWdodGJsdWVcIjogWzI1LDI1LDExMiwxXSxcbiAgXCJtaW50Y3JlYW1cIjogWzI0NSwyNTUsMjUwLDFdLCBcIm1pc3R5cm9zZVwiOiBbMjU1LDIyOCwyMjUsMV0sXG4gIFwibW9jY2FzaW5cIjogWzI1NSwyMjgsMTgxLDFdLCBcIm5hdmFqb3doaXRlXCI6IFsyNTUsMjIyLDE3MywxXSxcbiAgXCJuYXZ5XCI6IFswLDAsMTI4LDFdLCBcIm9sZGxhY2VcIjogWzI1MywyNDUsMjMwLDFdLFxuICBcIm9saXZlXCI6IFsxMjgsMTI4LDAsMV0sIFwib2xpdmVkcmFiXCI6IFsxMDcsMTQyLDM1LDFdLFxuICBcIm9yYW5nZVwiOiBbMjU1LDE2NSwwLDFdLCBcIm9yYW5nZXJlZFwiOiBbMjU1LDY5LDAsMV0sXG4gIFwib3JjaGlkXCI6IFsyMTgsMTEyLDIxNCwxXSwgXCJwYWxlZ29sZGVucm9kXCI6IFsyMzgsMjMyLDE3MCwxXSxcbiAgXCJwYWxlZ3JlZW5cIjogWzE1MiwyNTEsMTUyLDFdLCBcInBhbGV0dXJxdW9pc2VcIjogWzE3NSwyMzgsMjM4LDFdLFxuICBcInBhbGV2aW9sZXRyZWRcIjogWzIxOSwxMTIsMTQ3LDFdLCBcInBhcGF5YXdoaXBcIjogWzI1NSwyMzksMjEzLDFdLFxuICBcInBlYWNocHVmZlwiOiBbMjU1LDIxOCwxODUsMV0sIFwicGVydVwiOiBbMjA1LDEzMyw2MywxXSxcbiAgXCJwaW5rXCI6IFsyNTUsMTkyLDIwMywxXSwgXCJwbHVtXCI6IFsyMjEsMTYwLDIyMSwxXSxcbiAgXCJwb3dkZXJibHVlXCI6IFsxNzYsMjI0LDIzMCwxXSwgXCJwdXJwbGVcIjogWzEyOCwwLDEyOCwxXSxcbiAgXCJyZWJlY2NhcHVycGxlXCI6IFsxMDIsNTEsMTUzLDFdLFxuICBcInJlZFwiOiBbMjU1LDAsMCwxXSwgXCJyb3N5YnJvd25cIjogWzE4OCwxNDMsMTQzLDFdLFxuICBcInJveWFsYmx1ZVwiOiBbNjUsMTA1LDIyNSwxXSwgXCJzYWRkbGVicm93blwiOiBbMTM5LDY5LDE5LDFdLFxuICBcInNhbG1vblwiOiBbMjUwLDEyOCwxMTQsMV0sIFwic2FuZHlicm93blwiOiBbMjQ0LDE2NCw5NiwxXSxcbiAgXCJzZWFncmVlblwiOiBbNDYsMTM5LDg3LDFdLCBcInNlYXNoZWxsXCI6IFsyNTUsMjQ1LDIzOCwxXSxcbiAgXCJzaWVubmFcIjogWzE2MCw4Miw0NSwxXSwgXCJzaWx2ZXJcIjogWzE5MiwxOTIsMTkyLDFdLFxuICBcInNreWJsdWVcIjogWzEzNSwyMDYsMjM1LDFdLCBcInNsYXRlYmx1ZVwiOiBbMTA2LDkwLDIwNSwxXSxcbiAgXCJzbGF0ZWdyYXlcIjogWzExMiwxMjgsMTQ0LDFdLCBcInNsYXRlZ3JleVwiOiBbMTEyLDEyOCwxNDQsMV0sXG4gIFwic25vd1wiOiBbMjU1LDI1MCwyNTAsMV0sIFwic3ByaW5nZ3JlZW5cIjogWzAsMjU1LDEyNywxXSxcbiAgXCJzdGVlbGJsdWVcIjogWzcwLDEzMCwxODAsMV0sIFwidGFuXCI6IFsyMTAsMTgwLDE0MCwxXSxcbiAgXCJ0ZWFsXCI6IFswLDEyOCwxMjgsMV0sIFwidGhpc3RsZVwiOiBbMjE2LDE5MSwyMTYsMV0sXG4gIFwidG9tYXRvXCI6IFsyNTUsOTksNzEsMV0sIFwidHVycXVvaXNlXCI6IFs2NCwyMjQsMjA4LDFdLFxuICBcInZpb2xldFwiOiBbMjM4LDEzMCwyMzgsMV0sIFwid2hlYXRcIjogWzI0NSwyMjIsMTc5LDFdLFxuICBcIndoaXRlXCI6IFsyNTUsMjU1LDI1NSwxXSwgXCJ3aGl0ZXNtb2tlXCI6IFsyNDUsMjQ1LDI0NSwxXSxcbiAgXCJ5ZWxsb3dcIjogWzI1NSwyNTUsMCwxXSwgXCJ5ZWxsb3dncmVlblwiOiBbMTU0LDIwNSw1MCwxXX1cblxuZnVuY3Rpb24gY2xhbXBfY3NzX2J5dGUoaSkgeyAgLy8gQ2xhbXAgdG8gaW50ZWdlciAwIC4uIDI1NS5cbiAgaSA9IE1hdGgucm91bmQoaSk7ICAvLyBTZWVtcyB0byBiZSB3aGF0IENocm9tZSBkb2VzICh2cyB0cnVuY2F0aW9uKS5cbiAgcmV0dXJuIGkgPCAwID8gMCA6IGkgPiAyNTUgPyAyNTUgOiBpO1xufVxuXG5mdW5jdGlvbiBjbGFtcF9jc3NfZmxvYXQoZikgeyAgLy8gQ2xhbXAgdG8gZmxvYXQgMC4wIC4uIDEuMC5cbiAgcmV0dXJuIGYgPCAwID8gMCA6IGYgPiAxID8gMSA6IGY7XG59XG5cbmZ1bmN0aW9uIHBhcnNlX2Nzc19pbnQoc3RyKSB7ICAvLyBpbnQgb3IgcGVyY2VudGFnZS5cbiAgaWYgKHN0cltzdHIubGVuZ3RoIC0gMV0gPT09ICclJylcbiAgICByZXR1cm4gY2xhbXBfY3NzX2J5dGUocGFyc2VGbG9hdChzdHIpIC8gMTAwICogMjU1KTtcbiAgcmV0dXJuIGNsYW1wX2Nzc19ieXRlKHBhcnNlSW50KHN0cikpO1xufVxuXG5mdW5jdGlvbiBwYXJzZV9jc3NfZmxvYXQoc3RyKSB7ICAvLyBmbG9hdCBvciBwZXJjZW50YWdlLlxuICBpZiAoc3RyW3N0ci5sZW5ndGggLSAxXSA9PT0gJyUnKVxuICAgIHJldHVybiBjbGFtcF9jc3NfZmxvYXQocGFyc2VGbG9hdChzdHIpIC8gMTAwKTtcbiAgcmV0dXJuIGNsYW1wX2Nzc19mbG9hdChwYXJzZUZsb2F0KHN0cikpO1xufVxuXG5mdW5jdGlvbiBjc3NfaHVlX3RvX3JnYihtMSwgbTIsIGgpIHtcbiAgaWYgKGggPCAwKSBoICs9IDE7XG4gIGVsc2UgaWYgKGggPiAxKSBoIC09IDE7XG5cbiAgaWYgKGggKiA2IDwgMSkgcmV0dXJuIG0xICsgKG0yIC0gbTEpICogaCAqIDY7XG4gIGlmIChoICogMiA8IDEpIHJldHVybiBtMjtcbiAgaWYgKGggKiAzIDwgMikgcmV0dXJuIG0xICsgKG0yIC0gbTEpICogKDIvMyAtIGgpICogNjtcbiAgcmV0dXJuIG0xO1xufVxuXG5mdW5jdGlvbiBwYXJzZUNTU0NvbG9yKGNzc19zdHIpIHtcbiAgLy8gUmVtb3ZlIGFsbCB3aGl0ZXNwYWNlLCBub3QgY29tcGxpYW50LCBidXQgc2hvdWxkIGp1c3QgYmUgbW9yZSBhY2NlcHRpbmcuXG4gIHZhciBzdHIgPSBjc3Nfc3RyLnJlcGxhY2UoLyAvZywgJycpLnRvTG93ZXJDYXNlKCk7XG5cbiAgLy8gQ29sb3Iga2V5d29yZHMgKGFuZCB0cmFuc3BhcmVudCkgbG9va3VwLlxuICBpZiAoc3RyIGluIGtDU1NDb2xvclRhYmxlKSByZXR1cm4ga0NTU0NvbG9yVGFibGVbc3RyXS5zbGljZSgpOyAgLy8gZHVwLlxuXG4gIC8vICNhYmMgYW5kICNhYmMxMjMgc3ludGF4LlxuICBpZiAoc3RyWzBdID09PSAnIycpIHtcbiAgICBpZiAoc3RyLmxlbmd0aCA9PT0gNCkge1xuICAgICAgdmFyIGl2ID0gcGFyc2VJbnQoc3RyLnN1YnN0cigxKSwgMTYpOyAgLy8gVE9ETyhkZWFubSk6IFN0cmljdGVyIHBhcnNpbmcuXG4gICAgICBpZiAoIShpdiA+PSAwICYmIGl2IDw9IDB4ZmZmKSkgcmV0dXJuIG51bGw7ICAvLyBDb3ZlcnMgTmFOLlxuICAgICAgcmV0dXJuIFsoKGl2ICYgMHhmMDApID4+IDQpIHwgKChpdiAmIDB4ZjAwKSA+PiA4KSxcbiAgICAgICAgICAgICAgKGl2ICYgMHhmMCkgfCAoKGl2ICYgMHhmMCkgPj4gNCksXG4gICAgICAgICAgICAgIChpdiAmIDB4ZikgfCAoKGl2ICYgMHhmKSA8PCA0KSxcbiAgICAgICAgICAgICAgMV07XG4gICAgfSBlbHNlIGlmIChzdHIubGVuZ3RoID09PSA3KSB7XG4gICAgICB2YXIgaXYgPSBwYXJzZUludChzdHIuc3Vic3RyKDEpLCAxNik7ICAvLyBUT0RPKGRlYW5tKTogU3RyaWN0ZXIgcGFyc2luZy5cbiAgICAgIGlmICghKGl2ID49IDAgJiYgaXYgPD0gMHhmZmZmZmYpKSByZXR1cm4gbnVsbDsgIC8vIENvdmVycyBOYU4uXG4gICAgICByZXR1cm4gWyhpdiAmIDB4ZmYwMDAwKSA+PiAxNixcbiAgICAgICAgICAgICAgKGl2ICYgMHhmZjAwKSA+PiA4LFxuICAgICAgICAgICAgICBpdiAmIDB4ZmYsXG4gICAgICAgICAgICAgIDFdO1xuICAgIH1cblxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgdmFyIG9wID0gc3RyLmluZGV4T2YoJygnKSwgZXAgPSBzdHIuaW5kZXhPZignKScpO1xuICBpZiAob3AgIT09IC0xICYmIGVwICsgMSA9PT0gc3RyLmxlbmd0aCkge1xuICAgIHZhciBmbmFtZSA9IHN0ci5zdWJzdHIoMCwgb3ApO1xuICAgIHZhciBwYXJhbXMgPSBzdHIuc3Vic3RyKG9wKzEsIGVwLShvcCsxKSkuc3BsaXQoJywnKTtcbiAgICB2YXIgYWxwaGEgPSAxOyAgLy8gVG8gYWxsb3cgY2FzZSBmYWxsdGhyb3VnaC5cbiAgICBzd2l0Y2ggKGZuYW1lKSB7XG4gICAgICBjYXNlICdyZ2JhJzpcbiAgICAgICAgaWYgKHBhcmFtcy5sZW5ndGggIT09IDQpIHJldHVybiBudWxsO1xuICAgICAgICBhbHBoYSA9IHBhcnNlX2Nzc19mbG9hdChwYXJhbXMucG9wKCkpO1xuICAgICAgICAvLyBGYWxsIHRocm91Z2guXG4gICAgICBjYXNlICdyZ2InOlxuICAgICAgICBpZiAocGFyYW1zLmxlbmd0aCAhPT0gMykgcmV0dXJuIG51bGw7XG4gICAgICAgIHJldHVybiBbcGFyc2VfY3NzX2ludChwYXJhbXNbMF0pLFxuICAgICAgICAgICAgICAgIHBhcnNlX2Nzc19pbnQocGFyYW1zWzFdKSxcbiAgICAgICAgICAgICAgICBwYXJzZV9jc3NfaW50KHBhcmFtc1syXSksXG4gICAgICAgICAgICAgICAgYWxwaGFdO1xuICAgICAgY2FzZSAnaHNsYSc6XG4gICAgICAgIGlmIChwYXJhbXMubGVuZ3RoICE9PSA0KSByZXR1cm4gbnVsbDtcbiAgICAgICAgYWxwaGEgPSBwYXJzZV9jc3NfZmxvYXQocGFyYW1zLnBvcCgpKTtcbiAgICAgICAgLy8gRmFsbCB0aHJvdWdoLlxuICAgICAgY2FzZSAnaHNsJzpcbiAgICAgICAgaWYgKHBhcmFtcy5sZW5ndGggIT09IDMpIHJldHVybiBudWxsO1xuICAgICAgICB2YXIgaCA9ICgoKHBhcnNlRmxvYXQocGFyYW1zWzBdKSAlIDM2MCkgKyAzNjApICUgMzYwKSAvIDM2MDsgIC8vIDAgLi4gMVxuICAgICAgICAvLyBOT1RFKGRlYW5tKTogQWNjb3JkaW5nIHRvIHRoZSBDU1Mgc3BlYyBzL2wgc2hvdWxkIG9ubHkgYmVcbiAgICAgICAgLy8gcGVyY2VudGFnZXMsIGJ1dCB3ZSBkb24ndCBib3RoZXIgYW5kIGxldCBmbG9hdCBvciBwZXJjZW50YWdlLlxuICAgICAgICB2YXIgcyA9IHBhcnNlX2Nzc19mbG9hdChwYXJhbXNbMV0pO1xuICAgICAgICB2YXIgbCA9IHBhcnNlX2Nzc19mbG9hdChwYXJhbXNbMl0pO1xuICAgICAgICB2YXIgbTIgPSBsIDw9IDAuNSA/IGwgKiAocyArIDEpIDogbCArIHMgLSBsICogcztcbiAgICAgICAgdmFyIG0xID0gbCAqIDIgLSBtMjtcbiAgICAgICAgcmV0dXJuIFtjbGFtcF9jc3NfYnl0ZShjc3NfaHVlX3RvX3JnYihtMSwgbTIsIGgrMS8zKSAqIDI1NSksXG4gICAgICAgICAgICAgICAgY2xhbXBfY3NzX2J5dGUoY3NzX2h1ZV90b19yZ2IobTEsIG0yLCBoKSAqIDI1NSksXG4gICAgICAgICAgICAgICAgY2xhbXBfY3NzX2J5dGUoY3NzX2h1ZV90b19yZ2IobTEsIG0yLCBoLTEvMykgKiAyNTUpLFxuICAgICAgICAgICAgICAgIGFscGhhXTtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBudWxsO1xufVxuXG50cnkgeyBleHBvcnRzLnBhcnNlQ1NTQ29sb3IgPSBwYXJzZUNTU0NvbG9yIH0gY2F0Y2goZSkgeyB9XG4iLCIndXNlIHN0cmljdCc7XG5cbm1vZHVsZS5leHBvcnRzID0gZWFyY3V0O1xuXG5mdW5jdGlvbiBlYXJjdXQoZGF0YSwgaG9sZUluZGljZXMsIGRpbSkge1xuXG4gICAgZGltID0gZGltIHx8IDI7XG5cbiAgICB2YXIgaGFzSG9sZXMgPSBob2xlSW5kaWNlcyAmJiBob2xlSW5kaWNlcy5sZW5ndGgsXG4gICAgICAgIG91dGVyTGVuID0gaGFzSG9sZXMgPyBob2xlSW5kaWNlc1swXSAqIGRpbSA6IGRhdGEubGVuZ3RoLFxuICAgICAgICBvdXRlck5vZGUgPSBsaW5rZWRMaXN0KGRhdGEsIDAsIG91dGVyTGVuLCBkaW0sIHRydWUpLFxuICAgICAgICB0cmlhbmdsZXMgPSBbXTtcblxuICAgIGlmICghb3V0ZXJOb2RlKSByZXR1cm4gdHJpYW5nbGVzO1xuXG4gICAgdmFyIG1pblgsIG1pblksIG1heFgsIG1heFksIHgsIHksIHNpemU7XG5cbiAgICBpZiAoaGFzSG9sZXMpIG91dGVyTm9kZSA9IGVsaW1pbmF0ZUhvbGVzKGRhdGEsIGhvbGVJbmRpY2VzLCBvdXRlck5vZGUsIGRpbSk7XG5cbiAgICAvLyBpZiB0aGUgc2hhcGUgaXMgbm90IHRvbyBzaW1wbGUsIHdlJ2xsIHVzZSB6LW9yZGVyIGN1cnZlIGhhc2ggbGF0ZXI7IGNhbGN1bGF0ZSBwb2x5Z29uIGJib3hcbiAgICBpZiAoZGF0YS5sZW5ndGggPiA4MCAqIGRpbSkge1xuICAgICAgICBtaW5YID0gbWF4WCA9IGRhdGFbMF07XG4gICAgICAgIG1pblkgPSBtYXhZID0gZGF0YVsxXTtcblxuICAgICAgICBmb3IgKHZhciBpID0gZGltOyBpIDwgb3V0ZXJMZW47IGkgKz0gZGltKSB7XG4gICAgICAgICAgICB4ID0gZGF0YVtpXTtcbiAgICAgICAgICAgIHkgPSBkYXRhW2kgKyAxXTtcbiAgICAgICAgICAgIGlmICh4IDwgbWluWCkgbWluWCA9IHg7XG4gICAgICAgICAgICBpZiAoeSA8IG1pblkpIG1pblkgPSB5O1xuICAgICAgICAgICAgaWYgKHggPiBtYXhYKSBtYXhYID0geDtcbiAgICAgICAgICAgIGlmICh5ID4gbWF4WSkgbWF4WSA9IHk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBtaW5YLCBtaW5ZIGFuZCBzaXplIGFyZSBsYXRlciB1c2VkIHRvIHRyYW5zZm9ybSBjb29yZHMgaW50byBpbnRlZ2VycyBmb3Igei1vcmRlciBjYWxjdWxhdGlvblxuICAgICAgICBzaXplID0gTWF0aC5tYXgobWF4WCAtIG1pblgsIG1heFkgLSBtaW5ZKTtcbiAgICB9XG5cbiAgICBlYXJjdXRMaW5rZWQob3V0ZXJOb2RlLCB0cmlhbmdsZXMsIGRpbSwgbWluWCwgbWluWSwgc2l6ZSk7XG5cbiAgICByZXR1cm4gdHJpYW5nbGVzO1xufVxuXG4vLyBjcmVhdGUgYSBjaXJjdWxhciBkb3VibHkgbGlua2VkIGxpc3QgZnJvbSBwb2x5Z29uIHBvaW50cyBpbiB0aGUgc3BlY2lmaWVkIHdpbmRpbmcgb3JkZXJcbmZ1bmN0aW9uIGxpbmtlZExpc3QoZGF0YSwgc3RhcnQsIGVuZCwgZGltLCBjbG9ja3dpc2UpIHtcbiAgICB2YXIgaSwgbGFzdDtcblxuICAgIGlmIChjbG9ja3dpc2UgPT09IChzaWduZWRBcmVhKGRhdGEsIHN0YXJ0LCBlbmQsIGRpbSkgPiAwKSkge1xuICAgICAgICBmb3IgKGkgPSBzdGFydDsgaSA8IGVuZDsgaSArPSBkaW0pIGxhc3QgPSBpbnNlcnROb2RlKGksIGRhdGFbaV0sIGRhdGFbaSArIDFdLCBsYXN0KTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBmb3IgKGkgPSBlbmQgLSBkaW07IGkgPj0gc3RhcnQ7IGkgLT0gZGltKSBsYXN0ID0gaW5zZXJ0Tm9kZShpLCBkYXRhW2ldLCBkYXRhW2kgKyAxXSwgbGFzdCk7XG4gICAgfVxuXG4gICAgaWYgKGxhc3QgJiYgZXF1YWxzKGxhc3QsIGxhc3QubmV4dCkpIHtcbiAgICAgICAgcmVtb3ZlTm9kZShsYXN0KTtcbiAgICAgICAgbGFzdCA9IGxhc3QubmV4dDtcbiAgICB9XG5cbiAgICByZXR1cm4gbGFzdDtcbn1cblxuLy8gZWxpbWluYXRlIGNvbGluZWFyIG9yIGR1cGxpY2F0ZSBwb2ludHNcbmZ1bmN0aW9uIGZpbHRlclBvaW50cyhzdGFydCwgZW5kKSB7XG4gICAgaWYgKCFzdGFydCkgcmV0dXJuIHN0YXJ0O1xuICAgIGlmICghZW5kKSBlbmQgPSBzdGFydDtcblxuICAgIHZhciBwID0gc3RhcnQsXG4gICAgICAgIGFnYWluO1xuICAgIGRvIHtcbiAgICAgICAgYWdhaW4gPSBmYWxzZTtcblxuICAgICAgICBpZiAoIXAuc3RlaW5lciAmJiAoZXF1YWxzKHAsIHAubmV4dCkgfHwgYXJlYShwLnByZXYsIHAsIHAubmV4dCkgPT09IDApKSB7XG4gICAgICAgICAgICByZW1vdmVOb2RlKHApO1xuICAgICAgICAgICAgcCA9IGVuZCA9IHAucHJldjtcbiAgICAgICAgICAgIGlmIChwID09PSBwLm5leHQpIHJldHVybiBudWxsO1xuICAgICAgICAgICAgYWdhaW4gPSB0cnVlO1xuXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBwID0gcC5uZXh0O1xuICAgICAgICB9XG4gICAgfSB3aGlsZSAoYWdhaW4gfHwgcCAhPT0gZW5kKTtcblxuICAgIHJldHVybiBlbmQ7XG59XG5cbi8vIG1haW4gZWFyIHNsaWNpbmcgbG9vcCB3aGljaCB0cmlhbmd1bGF0ZXMgYSBwb2x5Z29uIChnaXZlbiBhcyBhIGxpbmtlZCBsaXN0KVxuZnVuY3Rpb24gZWFyY3V0TGlua2VkKGVhciwgdHJpYW5nbGVzLCBkaW0sIG1pblgsIG1pblksIHNpemUsIHBhc3MpIHtcbiAgICBpZiAoIWVhcikgcmV0dXJuO1xuXG4gICAgLy8gaW50ZXJsaW5rIHBvbHlnb24gbm9kZXMgaW4gei1vcmRlclxuICAgIGlmICghcGFzcyAmJiBzaXplKSBpbmRleEN1cnZlKGVhciwgbWluWCwgbWluWSwgc2l6ZSk7XG5cbiAgICB2YXIgc3RvcCA9IGVhcixcbiAgICAgICAgcHJldiwgbmV4dDtcblxuICAgIC8vIGl0ZXJhdGUgdGhyb3VnaCBlYXJzLCBzbGljaW5nIHRoZW0gb25lIGJ5IG9uZVxuICAgIHdoaWxlIChlYXIucHJldiAhPT0gZWFyLm5leHQpIHtcbiAgICAgICAgcHJldiA9IGVhci5wcmV2O1xuICAgICAgICBuZXh0ID0gZWFyLm5leHQ7XG5cbiAgICAgICAgaWYgKHNpemUgPyBpc0Vhckhhc2hlZChlYXIsIG1pblgsIG1pblksIHNpemUpIDogaXNFYXIoZWFyKSkge1xuICAgICAgICAgICAgLy8gY3V0IG9mZiB0aGUgdHJpYW5nbGVcbiAgICAgICAgICAgIHRyaWFuZ2xlcy5wdXNoKHByZXYuaSAvIGRpbSk7XG4gICAgICAgICAgICB0cmlhbmdsZXMucHVzaChlYXIuaSAvIGRpbSk7XG4gICAgICAgICAgICB0cmlhbmdsZXMucHVzaChuZXh0LmkgLyBkaW0pO1xuXG4gICAgICAgICAgICByZW1vdmVOb2RlKGVhcik7XG5cbiAgICAgICAgICAgIC8vIHNraXBwaW5nIHRoZSBuZXh0IHZlcnRpY2UgbGVhZHMgdG8gbGVzcyBzbGl2ZXIgdHJpYW5nbGVzXG4gICAgICAgICAgICBlYXIgPSBuZXh0Lm5leHQ7XG4gICAgICAgICAgICBzdG9wID0gbmV4dC5uZXh0O1xuXG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGVhciA9IG5leHQ7XG5cbiAgICAgICAgLy8gaWYgd2UgbG9vcGVkIHRocm91Z2ggdGhlIHdob2xlIHJlbWFpbmluZyBwb2x5Z29uIGFuZCBjYW4ndCBmaW5kIGFueSBtb3JlIGVhcnNcbiAgICAgICAgaWYgKGVhciA9PT0gc3RvcCkge1xuICAgICAgICAgICAgLy8gdHJ5IGZpbHRlcmluZyBwb2ludHMgYW5kIHNsaWNpbmcgYWdhaW5cbiAgICAgICAgICAgIGlmICghcGFzcykge1xuICAgICAgICAgICAgICAgIGVhcmN1dExpbmtlZChmaWx0ZXJQb2ludHMoZWFyKSwgdHJpYW5nbGVzLCBkaW0sIG1pblgsIG1pblksIHNpemUsIDEpO1xuXG4gICAgICAgICAgICAvLyBpZiB0aGlzIGRpZG4ndCB3b3JrLCB0cnkgY3VyaW5nIGFsbCBzbWFsbCBzZWxmLWludGVyc2VjdGlvbnMgbG9jYWxseVxuICAgICAgICAgICAgfSBlbHNlIGlmIChwYXNzID09PSAxKSB7XG4gICAgICAgICAgICAgICAgZWFyID0gY3VyZUxvY2FsSW50ZXJzZWN0aW9ucyhlYXIsIHRyaWFuZ2xlcywgZGltKTtcbiAgICAgICAgICAgICAgICBlYXJjdXRMaW5rZWQoZWFyLCB0cmlhbmdsZXMsIGRpbSwgbWluWCwgbWluWSwgc2l6ZSwgMik7XG5cbiAgICAgICAgICAgIC8vIGFzIGEgbGFzdCByZXNvcnQsIHRyeSBzcGxpdHRpbmcgdGhlIHJlbWFpbmluZyBwb2x5Z29uIGludG8gdHdvXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHBhc3MgPT09IDIpIHtcbiAgICAgICAgICAgICAgICBzcGxpdEVhcmN1dChlYXIsIHRyaWFuZ2xlcywgZGltLCBtaW5YLCBtaW5ZLCBzaXplKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbi8vIGNoZWNrIHdoZXRoZXIgYSBwb2x5Z29uIG5vZGUgZm9ybXMgYSB2YWxpZCBlYXIgd2l0aCBhZGphY2VudCBub2Rlc1xuZnVuY3Rpb24gaXNFYXIoZWFyKSB7XG4gICAgdmFyIGEgPSBlYXIucHJldixcbiAgICAgICAgYiA9IGVhcixcbiAgICAgICAgYyA9IGVhci5uZXh0O1xuXG4gICAgaWYgKGFyZWEoYSwgYiwgYykgPj0gMCkgcmV0dXJuIGZhbHNlOyAvLyByZWZsZXgsIGNhbid0IGJlIGFuIGVhclxuXG4gICAgLy8gbm93IG1ha2Ugc3VyZSB3ZSBkb24ndCBoYXZlIG90aGVyIHBvaW50cyBpbnNpZGUgdGhlIHBvdGVudGlhbCBlYXJcbiAgICB2YXIgcCA9IGVhci5uZXh0Lm5leHQ7XG5cbiAgICB3aGlsZSAocCAhPT0gZWFyLnByZXYpIHtcbiAgICAgICAgaWYgKHBvaW50SW5UcmlhbmdsZShhLngsIGEueSwgYi54LCBiLnksIGMueCwgYy55LCBwLngsIHAueSkgJiZcbiAgICAgICAgICAgIGFyZWEocC5wcmV2LCBwLCBwLm5leHQpID49IDApIHJldHVybiBmYWxzZTtcbiAgICAgICAgcCA9IHAubmV4dDtcbiAgICB9XG5cbiAgICByZXR1cm4gdHJ1ZTtcbn1cblxuZnVuY3Rpb24gaXNFYXJIYXNoZWQoZWFyLCBtaW5YLCBtaW5ZLCBzaXplKSB7XG4gICAgdmFyIGEgPSBlYXIucHJldixcbiAgICAgICAgYiA9IGVhcixcbiAgICAgICAgYyA9IGVhci5uZXh0O1xuXG4gICAgaWYgKGFyZWEoYSwgYiwgYykgPj0gMCkgcmV0dXJuIGZhbHNlOyAvLyByZWZsZXgsIGNhbid0IGJlIGFuIGVhclxuXG4gICAgLy8gdHJpYW5nbGUgYmJveDsgbWluICYgbWF4IGFyZSBjYWxjdWxhdGVkIGxpa2UgdGhpcyBmb3Igc3BlZWRcbiAgICB2YXIgbWluVFggPSBhLnggPCBiLnggPyAoYS54IDwgYy54ID8gYS54IDogYy54KSA6IChiLnggPCBjLnggPyBiLnggOiBjLngpLFxuICAgICAgICBtaW5UWSA9IGEueSA8IGIueSA/IChhLnkgPCBjLnkgPyBhLnkgOiBjLnkpIDogKGIueSA8IGMueSA/IGIueSA6IGMueSksXG4gICAgICAgIG1heFRYID0gYS54ID4gYi54ID8gKGEueCA+IGMueCA/IGEueCA6IGMueCkgOiAoYi54ID4gYy54ID8gYi54IDogYy54KSxcbiAgICAgICAgbWF4VFkgPSBhLnkgPiBiLnkgPyAoYS55ID4gYy55ID8gYS55IDogYy55KSA6IChiLnkgPiBjLnkgPyBiLnkgOiBjLnkpO1xuXG4gICAgLy8gei1vcmRlciByYW5nZSBmb3IgdGhlIGN1cnJlbnQgdHJpYW5nbGUgYmJveDtcbiAgICB2YXIgbWluWiA9IHpPcmRlcihtaW5UWCwgbWluVFksIG1pblgsIG1pblksIHNpemUpLFxuICAgICAgICBtYXhaID0gek9yZGVyKG1heFRYLCBtYXhUWSwgbWluWCwgbWluWSwgc2l6ZSk7XG5cbiAgICAvLyBmaXJzdCBsb29rIGZvciBwb2ludHMgaW5zaWRlIHRoZSB0cmlhbmdsZSBpbiBpbmNyZWFzaW5nIHotb3JkZXJcbiAgICB2YXIgcCA9IGVhci5uZXh0WjtcblxuICAgIHdoaWxlIChwICYmIHAueiA8PSBtYXhaKSB7XG4gICAgICAgIGlmIChwICE9PSBlYXIucHJldiAmJiBwICE9PSBlYXIubmV4dCAmJlxuICAgICAgICAgICAgcG9pbnRJblRyaWFuZ2xlKGEueCwgYS55LCBiLngsIGIueSwgYy54LCBjLnksIHAueCwgcC55KSAmJlxuICAgICAgICAgICAgYXJlYShwLnByZXYsIHAsIHAubmV4dCkgPj0gMCkgcmV0dXJuIGZhbHNlO1xuICAgICAgICBwID0gcC5uZXh0WjtcbiAgICB9XG5cbiAgICAvLyB0aGVuIGxvb2sgZm9yIHBvaW50cyBpbiBkZWNyZWFzaW5nIHotb3JkZXJcbiAgICBwID0gZWFyLnByZXZaO1xuXG4gICAgd2hpbGUgKHAgJiYgcC56ID49IG1pblopIHtcbiAgICAgICAgaWYgKHAgIT09IGVhci5wcmV2ICYmIHAgIT09IGVhci5uZXh0ICYmXG4gICAgICAgICAgICBwb2ludEluVHJpYW5nbGUoYS54LCBhLnksIGIueCwgYi55LCBjLngsIGMueSwgcC54LCBwLnkpICYmXG4gICAgICAgICAgICBhcmVhKHAucHJldiwgcCwgcC5uZXh0KSA+PSAwKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIHAgPSBwLnByZXZaO1xuICAgIH1cblxuICAgIHJldHVybiB0cnVlO1xufVxuXG4vLyBnbyB0aHJvdWdoIGFsbCBwb2x5Z29uIG5vZGVzIGFuZCBjdXJlIHNtYWxsIGxvY2FsIHNlbGYtaW50ZXJzZWN0aW9uc1xuZnVuY3Rpb24gY3VyZUxvY2FsSW50ZXJzZWN0aW9ucyhzdGFydCwgdHJpYW5nbGVzLCBkaW0pIHtcbiAgICB2YXIgcCA9IHN0YXJ0O1xuICAgIGRvIHtcbiAgICAgICAgdmFyIGEgPSBwLnByZXYsXG4gICAgICAgICAgICBiID0gcC5uZXh0Lm5leHQ7XG5cbiAgICAgICAgaWYgKCFlcXVhbHMoYSwgYikgJiYgaW50ZXJzZWN0cyhhLCBwLCBwLm5leHQsIGIpICYmIGxvY2FsbHlJbnNpZGUoYSwgYikgJiYgbG9jYWxseUluc2lkZShiLCBhKSkge1xuXG4gICAgICAgICAgICB0cmlhbmdsZXMucHVzaChhLmkgLyBkaW0pO1xuICAgICAgICAgICAgdHJpYW5nbGVzLnB1c2gocC5pIC8gZGltKTtcbiAgICAgICAgICAgIHRyaWFuZ2xlcy5wdXNoKGIuaSAvIGRpbSk7XG5cbiAgICAgICAgICAgIC8vIHJlbW92ZSB0d28gbm9kZXMgaW52b2x2ZWRcbiAgICAgICAgICAgIHJlbW92ZU5vZGUocCk7XG4gICAgICAgICAgICByZW1vdmVOb2RlKHAubmV4dCk7XG5cbiAgICAgICAgICAgIHAgPSBzdGFydCA9IGI7XG4gICAgICAgIH1cbiAgICAgICAgcCA9IHAubmV4dDtcbiAgICB9IHdoaWxlIChwICE9PSBzdGFydCk7XG5cbiAgICByZXR1cm4gcDtcbn1cblxuLy8gdHJ5IHNwbGl0dGluZyBwb2x5Z29uIGludG8gdHdvIGFuZCB0cmlhbmd1bGF0ZSB0aGVtIGluZGVwZW5kZW50bHlcbmZ1bmN0aW9uIHNwbGl0RWFyY3V0KHN0YXJ0LCB0cmlhbmdsZXMsIGRpbSwgbWluWCwgbWluWSwgc2l6ZSkge1xuICAgIC8vIGxvb2sgZm9yIGEgdmFsaWQgZGlhZ29uYWwgdGhhdCBkaXZpZGVzIHRoZSBwb2x5Z29uIGludG8gdHdvXG4gICAgdmFyIGEgPSBzdGFydDtcbiAgICBkbyB7XG4gICAgICAgIHZhciBiID0gYS5uZXh0Lm5leHQ7XG4gICAgICAgIHdoaWxlIChiICE9PSBhLnByZXYpIHtcbiAgICAgICAgICAgIGlmIChhLmkgIT09IGIuaSAmJiBpc1ZhbGlkRGlhZ29uYWwoYSwgYikpIHtcbiAgICAgICAgICAgICAgICAvLyBzcGxpdCB0aGUgcG9seWdvbiBpbiB0d28gYnkgdGhlIGRpYWdvbmFsXG4gICAgICAgICAgICAgICAgdmFyIGMgPSBzcGxpdFBvbHlnb24oYSwgYik7XG5cbiAgICAgICAgICAgICAgICAvLyBmaWx0ZXIgY29saW5lYXIgcG9pbnRzIGFyb3VuZCB0aGUgY3V0c1xuICAgICAgICAgICAgICAgIGEgPSBmaWx0ZXJQb2ludHMoYSwgYS5uZXh0KTtcbiAgICAgICAgICAgICAgICBjID0gZmlsdGVyUG9pbnRzKGMsIGMubmV4dCk7XG5cbiAgICAgICAgICAgICAgICAvLyBydW4gZWFyY3V0IG9uIGVhY2ggaGFsZlxuICAgICAgICAgICAgICAgIGVhcmN1dExpbmtlZChhLCB0cmlhbmdsZXMsIGRpbSwgbWluWCwgbWluWSwgc2l6ZSk7XG4gICAgICAgICAgICAgICAgZWFyY3V0TGlua2VkKGMsIHRyaWFuZ2xlcywgZGltLCBtaW5YLCBtaW5ZLCBzaXplKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBiID0gYi5uZXh0O1xuICAgICAgICB9XG4gICAgICAgIGEgPSBhLm5leHQ7XG4gICAgfSB3aGlsZSAoYSAhPT0gc3RhcnQpO1xufVxuXG4vLyBsaW5rIGV2ZXJ5IGhvbGUgaW50byB0aGUgb3V0ZXIgbG9vcCwgcHJvZHVjaW5nIGEgc2luZ2xlLXJpbmcgcG9seWdvbiB3aXRob3V0IGhvbGVzXG5mdW5jdGlvbiBlbGltaW5hdGVIb2xlcyhkYXRhLCBob2xlSW5kaWNlcywgb3V0ZXJOb2RlLCBkaW0pIHtcbiAgICB2YXIgcXVldWUgPSBbXSxcbiAgICAgICAgaSwgbGVuLCBzdGFydCwgZW5kLCBsaXN0O1xuXG4gICAgZm9yIChpID0gMCwgbGVuID0gaG9sZUluZGljZXMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgc3RhcnQgPSBob2xlSW5kaWNlc1tpXSAqIGRpbTtcbiAgICAgICAgZW5kID0gaSA8IGxlbiAtIDEgPyBob2xlSW5kaWNlc1tpICsgMV0gKiBkaW0gOiBkYXRhLmxlbmd0aDtcbiAgICAgICAgbGlzdCA9IGxpbmtlZExpc3QoZGF0YSwgc3RhcnQsIGVuZCwgZGltLCBmYWxzZSk7XG4gICAgICAgIGlmIChsaXN0ID09PSBsaXN0Lm5leHQpIGxpc3Quc3RlaW5lciA9IHRydWU7XG4gICAgICAgIHF1ZXVlLnB1c2goZ2V0TGVmdG1vc3QobGlzdCkpO1xuICAgIH1cblxuICAgIHF1ZXVlLnNvcnQoY29tcGFyZVgpO1xuXG4gICAgLy8gcHJvY2VzcyBob2xlcyBmcm9tIGxlZnQgdG8gcmlnaHRcbiAgICBmb3IgKGkgPSAwOyBpIDwgcXVldWUubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgZWxpbWluYXRlSG9sZShxdWV1ZVtpXSwgb3V0ZXJOb2RlKTtcbiAgICAgICAgb3V0ZXJOb2RlID0gZmlsdGVyUG9pbnRzKG91dGVyTm9kZSwgb3V0ZXJOb2RlLm5leHQpO1xuICAgIH1cblxuICAgIHJldHVybiBvdXRlck5vZGU7XG59XG5cbmZ1bmN0aW9uIGNvbXBhcmVYKGEsIGIpIHtcbiAgICByZXR1cm4gYS54IC0gYi54O1xufVxuXG4vLyBmaW5kIGEgYnJpZGdlIGJldHdlZW4gdmVydGljZXMgdGhhdCBjb25uZWN0cyBob2xlIHdpdGggYW4gb3V0ZXIgcmluZyBhbmQgYW5kIGxpbmsgaXRcbmZ1bmN0aW9uIGVsaW1pbmF0ZUhvbGUoaG9sZSwgb3V0ZXJOb2RlKSB7XG4gICAgb3V0ZXJOb2RlID0gZmluZEhvbGVCcmlkZ2UoaG9sZSwgb3V0ZXJOb2RlKTtcbiAgICBpZiAob3V0ZXJOb2RlKSB7XG4gICAgICAgIHZhciBiID0gc3BsaXRQb2x5Z29uKG91dGVyTm9kZSwgaG9sZSk7XG4gICAgICAgIGZpbHRlclBvaW50cyhiLCBiLm5leHQpO1xuICAgIH1cbn1cblxuLy8gRGF2aWQgRWJlcmx5J3MgYWxnb3JpdGhtIGZvciBmaW5kaW5nIGEgYnJpZGdlIGJldHdlZW4gaG9sZSBhbmQgb3V0ZXIgcG9seWdvblxuZnVuY3Rpb24gZmluZEhvbGVCcmlkZ2UoaG9sZSwgb3V0ZXJOb2RlKSB7XG4gICAgdmFyIHAgPSBvdXRlck5vZGUsXG4gICAgICAgIGh4ID0gaG9sZS54LFxuICAgICAgICBoeSA9IGhvbGUueSxcbiAgICAgICAgcXggPSAtSW5maW5pdHksXG4gICAgICAgIG07XG5cbiAgICAvLyBmaW5kIGEgc2VnbWVudCBpbnRlcnNlY3RlZCBieSBhIHJheSBmcm9tIHRoZSBob2xlJ3MgbGVmdG1vc3QgcG9pbnQgdG8gdGhlIGxlZnQ7XG4gICAgLy8gc2VnbWVudCdzIGVuZHBvaW50IHdpdGggbGVzc2VyIHggd2lsbCBiZSBwb3RlbnRpYWwgY29ubmVjdGlvbiBwb2ludFxuICAgIGRvIHtcbiAgICAgICAgaWYgKGh5IDw9IHAueSAmJiBoeSA+PSBwLm5leHQueSkge1xuICAgICAgICAgICAgdmFyIHggPSBwLnggKyAoaHkgLSBwLnkpICogKHAubmV4dC54IC0gcC54KSAvIChwLm5leHQueSAtIHAueSk7XG4gICAgICAgICAgICBpZiAoeCA8PSBoeCAmJiB4ID4gcXgpIHtcbiAgICAgICAgICAgICAgICBxeCA9IHg7XG4gICAgICAgICAgICAgICAgaWYgKHggPT09IGh4KSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChoeSA9PT0gcC55KSByZXR1cm4gcDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGh5ID09PSBwLm5leHQueSkgcmV0dXJuIHAubmV4dDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbSA9IHAueCA8IHAubmV4dC54ID8gcCA6IHAubmV4dDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBwID0gcC5uZXh0O1xuICAgIH0gd2hpbGUgKHAgIT09IG91dGVyTm9kZSk7XG5cbiAgICBpZiAoIW0pIHJldHVybiBudWxsO1xuXG4gICAgaWYgKGh4ID09PSBxeCkgcmV0dXJuIG0ucHJldjsgLy8gaG9sZSB0b3VjaGVzIG91dGVyIHNlZ21lbnQ7IHBpY2sgbG93ZXIgZW5kcG9pbnRcblxuICAgIC8vIGxvb2sgZm9yIHBvaW50cyBpbnNpZGUgdGhlIHRyaWFuZ2xlIG9mIGhvbGUgcG9pbnQsIHNlZ21lbnQgaW50ZXJzZWN0aW9uIGFuZCBlbmRwb2ludDtcbiAgICAvLyBpZiB0aGVyZSBhcmUgbm8gcG9pbnRzIGZvdW5kLCB3ZSBoYXZlIGEgdmFsaWQgY29ubmVjdGlvbjtcbiAgICAvLyBvdGhlcndpc2UgY2hvb3NlIHRoZSBwb2ludCBvZiB0aGUgbWluaW11bSBhbmdsZSB3aXRoIHRoZSByYXkgYXMgY29ubmVjdGlvbiBwb2ludFxuXG4gICAgdmFyIHN0b3AgPSBtLFxuICAgICAgICBteCA9IG0ueCxcbiAgICAgICAgbXkgPSBtLnksXG4gICAgICAgIHRhbk1pbiA9IEluZmluaXR5LFxuICAgICAgICB0YW47XG5cbiAgICBwID0gbS5uZXh0O1xuXG4gICAgd2hpbGUgKHAgIT09IHN0b3ApIHtcbiAgICAgICAgaWYgKGh4ID49IHAueCAmJiBwLnggPj0gbXggJiZcbiAgICAgICAgICAgICAgICBwb2ludEluVHJpYW5nbGUoaHkgPCBteSA/IGh4IDogcXgsIGh5LCBteCwgbXksIGh5IDwgbXkgPyBxeCA6IGh4LCBoeSwgcC54LCBwLnkpKSB7XG5cbiAgICAgICAgICAgIHRhbiA9IE1hdGguYWJzKGh5IC0gcC55KSAvIChoeCAtIHAueCk7IC8vIHRhbmdlbnRpYWxcblxuICAgICAgICAgICAgaWYgKCh0YW4gPCB0YW5NaW4gfHwgKHRhbiA9PT0gdGFuTWluICYmIHAueCA+IG0ueCkpICYmIGxvY2FsbHlJbnNpZGUocCwgaG9sZSkpIHtcbiAgICAgICAgICAgICAgICBtID0gcDtcbiAgICAgICAgICAgICAgICB0YW5NaW4gPSB0YW47XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBwID0gcC5uZXh0O1xuICAgIH1cblxuICAgIHJldHVybiBtO1xufVxuXG4vLyBpbnRlcmxpbmsgcG9seWdvbiBub2RlcyBpbiB6LW9yZGVyXG5mdW5jdGlvbiBpbmRleEN1cnZlKHN0YXJ0LCBtaW5YLCBtaW5ZLCBzaXplKSB7XG4gICAgdmFyIHAgPSBzdGFydDtcbiAgICBkbyB7XG4gICAgICAgIGlmIChwLnogPT09IG51bGwpIHAueiA9IHpPcmRlcihwLngsIHAueSwgbWluWCwgbWluWSwgc2l6ZSk7XG4gICAgICAgIHAucHJldlogPSBwLnByZXY7XG4gICAgICAgIHAubmV4dFogPSBwLm5leHQ7XG4gICAgICAgIHAgPSBwLm5leHQ7XG4gICAgfSB3aGlsZSAocCAhPT0gc3RhcnQpO1xuXG4gICAgcC5wcmV2Wi5uZXh0WiA9IG51bGw7XG4gICAgcC5wcmV2WiA9IG51bGw7XG5cbiAgICBzb3J0TGlua2VkKHApO1xufVxuXG4vLyBTaW1vbiBUYXRoYW0ncyBsaW5rZWQgbGlzdCBtZXJnZSBzb3J0IGFsZ29yaXRobVxuLy8gaHR0cDovL3d3dy5jaGlhcmsuZ3JlZW5lbmQub3JnLnVrL35zZ3RhdGhhbS9hbGdvcml0aG1zL2xpc3Rzb3J0Lmh0bWxcbmZ1bmN0aW9uIHNvcnRMaW5rZWQobGlzdCkge1xuICAgIHZhciBpLCBwLCBxLCBlLCB0YWlsLCBudW1NZXJnZXMsIHBTaXplLCBxU2l6ZSxcbiAgICAgICAgaW5TaXplID0gMTtcblxuICAgIGRvIHtcbiAgICAgICAgcCA9IGxpc3Q7XG4gICAgICAgIGxpc3QgPSBudWxsO1xuICAgICAgICB0YWlsID0gbnVsbDtcbiAgICAgICAgbnVtTWVyZ2VzID0gMDtcblxuICAgICAgICB3aGlsZSAocCkge1xuICAgICAgICAgICAgbnVtTWVyZ2VzKys7XG4gICAgICAgICAgICBxID0gcDtcbiAgICAgICAgICAgIHBTaXplID0gMDtcbiAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBpblNpemU7IGkrKykge1xuICAgICAgICAgICAgICAgIHBTaXplKys7XG4gICAgICAgICAgICAgICAgcSA9IHEubmV4dFo7XG4gICAgICAgICAgICAgICAgaWYgKCFxKSBicmVhaztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcVNpemUgPSBpblNpemU7XG5cbiAgICAgICAgICAgIHdoaWxlIChwU2l6ZSA+IDAgfHwgKHFTaXplID4gMCAmJiBxKSkge1xuXG4gICAgICAgICAgICAgICAgaWYgKHBTaXplID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGUgPSBxO1xuICAgICAgICAgICAgICAgICAgICBxID0gcS5uZXh0WjtcbiAgICAgICAgICAgICAgICAgICAgcVNpemUtLTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHFTaXplID09PSAwIHx8ICFxKSB7XG4gICAgICAgICAgICAgICAgICAgIGUgPSBwO1xuICAgICAgICAgICAgICAgICAgICBwID0gcC5uZXh0WjtcbiAgICAgICAgICAgICAgICAgICAgcFNpemUtLTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHAueiA8PSBxLnopIHtcbiAgICAgICAgICAgICAgICAgICAgZSA9IHA7XG4gICAgICAgICAgICAgICAgICAgIHAgPSBwLm5leHRaO1xuICAgICAgICAgICAgICAgICAgICBwU2l6ZS0tO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGUgPSBxO1xuICAgICAgICAgICAgICAgICAgICBxID0gcS5uZXh0WjtcbiAgICAgICAgICAgICAgICAgICAgcVNpemUtLTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAodGFpbCkgdGFpbC5uZXh0WiA9IGU7XG4gICAgICAgICAgICAgICAgZWxzZSBsaXN0ID0gZTtcblxuICAgICAgICAgICAgICAgIGUucHJldlogPSB0YWlsO1xuICAgICAgICAgICAgICAgIHRhaWwgPSBlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBwID0gcTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRhaWwubmV4dFogPSBudWxsO1xuICAgICAgICBpblNpemUgKj0gMjtcblxuICAgIH0gd2hpbGUgKG51bU1lcmdlcyA+IDEpO1xuXG4gICAgcmV0dXJuIGxpc3Q7XG59XG5cbi8vIHotb3JkZXIgb2YgYSBwb2ludCBnaXZlbiBjb29yZHMgYW5kIHNpemUgb2YgdGhlIGRhdGEgYm91bmRpbmcgYm94XG5mdW5jdGlvbiB6T3JkZXIoeCwgeSwgbWluWCwgbWluWSwgc2l6ZSkge1xuICAgIC8vIGNvb3JkcyBhcmUgdHJhbnNmb3JtZWQgaW50byBub24tbmVnYXRpdmUgMTUtYml0IGludGVnZXIgcmFuZ2VcbiAgICB4ID0gMzI3NjcgKiAoeCAtIG1pblgpIC8gc2l6ZTtcbiAgICB5ID0gMzI3NjcgKiAoeSAtIG1pblkpIC8gc2l6ZTtcblxuICAgIHggPSAoeCB8ICh4IDw8IDgpKSAmIDB4MDBGRjAwRkY7XG4gICAgeCA9ICh4IHwgKHggPDwgNCkpICYgMHgwRjBGMEYwRjtcbiAgICB4ID0gKHggfCAoeCA8PCAyKSkgJiAweDMzMzMzMzMzO1xuICAgIHggPSAoeCB8ICh4IDw8IDEpKSAmIDB4NTU1NTU1NTU7XG5cbiAgICB5ID0gKHkgfCAoeSA8PCA4KSkgJiAweDAwRkYwMEZGO1xuICAgIHkgPSAoeSB8ICh5IDw8IDQpKSAmIDB4MEYwRjBGMEY7XG4gICAgeSA9ICh5IHwgKHkgPDwgMikpICYgMHgzMzMzMzMzMztcbiAgICB5ID0gKHkgfCAoeSA8PCAxKSkgJiAweDU1NTU1NTU1O1xuXG4gICAgcmV0dXJuIHggfCAoeSA8PCAxKTtcbn1cblxuLy8gZmluZCB0aGUgbGVmdG1vc3Qgbm9kZSBvZiBhIHBvbHlnb24gcmluZ1xuZnVuY3Rpb24gZ2V0TGVmdG1vc3Qoc3RhcnQpIHtcbiAgICB2YXIgcCA9IHN0YXJ0LFxuICAgICAgICBsZWZ0bW9zdCA9IHN0YXJ0O1xuICAgIGRvIHtcbiAgICAgICAgaWYgKHAueCA8IGxlZnRtb3N0LngpIGxlZnRtb3N0ID0gcDtcbiAgICAgICAgcCA9IHAubmV4dDtcbiAgICB9IHdoaWxlIChwICE9PSBzdGFydCk7XG5cbiAgICByZXR1cm4gbGVmdG1vc3Q7XG59XG5cbi8vIGNoZWNrIGlmIGEgcG9pbnQgbGllcyB3aXRoaW4gYSBjb252ZXggdHJpYW5nbGVcbmZ1bmN0aW9uIHBvaW50SW5UcmlhbmdsZShheCwgYXksIGJ4LCBieSwgY3gsIGN5LCBweCwgcHkpIHtcbiAgICByZXR1cm4gKGN4IC0gcHgpICogKGF5IC0gcHkpIC0gKGF4IC0gcHgpICogKGN5IC0gcHkpID49IDAgJiZcbiAgICAgICAgICAgKGF4IC0gcHgpICogKGJ5IC0gcHkpIC0gKGJ4IC0gcHgpICogKGF5IC0gcHkpID49IDAgJiZcbiAgICAgICAgICAgKGJ4IC0gcHgpICogKGN5IC0gcHkpIC0gKGN4IC0gcHgpICogKGJ5IC0gcHkpID49IDA7XG59XG5cbi8vIGNoZWNrIGlmIGEgZGlhZ29uYWwgYmV0d2VlbiB0d28gcG9seWdvbiBub2RlcyBpcyB2YWxpZCAobGllcyBpbiBwb2x5Z29uIGludGVyaW9yKVxuZnVuY3Rpb24gaXNWYWxpZERpYWdvbmFsKGEsIGIpIHtcbiAgICByZXR1cm4gYS5uZXh0LmkgIT09IGIuaSAmJiBhLnByZXYuaSAhPT0gYi5pICYmICFpbnRlcnNlY3RzUG9seWdvbihhLCBiKSAmJlxuICAgICAgICAgICBsb2NhbGx5SW5zaWRlKGEsIGIpICYmIGxvY2FsbHlJbnNpZGUoYiwgYSkgJiYgbWlkZGxlSW5zaWRlKGEsIGIpO1xufVxuXG4vLyBzaWduZWQgYXJlYSBvZiBhIHRyaWFuZ2xlXG5mdW5jdGlvbiBhcmVhKHAsIHEsIHIpIHtcbiAgICByZXR1cm4gKHEueSAtIHAueSkgKiAoci54IC0gcS54KSAtIChxLnggLSBwLngpICogKHIueSAtIHEueSk7XG59XG5cbi8vIGNoZWNrIGlmIHR3byBwb2ludHMgYXJlIGVxdWFsXG5mdW5jdGlvbiBlcXVhbHMocDEsIHAyKSB7XG4gICAgcmV0dXJuIHAxLnggPT09IHAyLnggJiYgcDEueSA9PT0gcDIueTtcbn1cblxuLy8gY2hlY2sgaWYgdHdvIHNlZ21lbnRzIGludGVyc2VjdFxuZnVuY3Rpb24gaW50ZXJzZWN0cyhwMSwgcTEsIHAyLCBxMikge1xuICAgIGlmICgoZXF1YWxzKHAxLCBxMSkgJiYgZXF1YWxzKHAyLCBxMikpIHx8XG4gICAgICAgIChlcXVhbHMocDEsIHEyKSAmJiBlcXVhbHMocDIsIHExKSkpIHJldHVybiB0cnVlO1xuICAgIHJldHVybiBhcmVhKHAxLCBxMSwgcDIpID4gMCAhPT0gYXJlYShwMSwgcTEsIHEyKSA+IDAgJiZcbiAgICAgICAgICAgYXJlYShwMiwgcTIsIHAxKSA+IDAgIT09IGFyZWEocDIsIHEyLCBxMSkgPiAwO1xufVxuXG4vLyBjaGVjayBpZiBhIHBvbHlnb24gZGlhZ29uYWwgaW50ZXJzZWN0cyBhbnkgcG9seWdvbiBzZWdtZW50c1xuZnVuY3Rpb24gaW50ZXJzZWN0c1BvbHlnb24oYSwgYikge1xuICAgIHZhciBwID0gYTtcbiAgICBkbyB7XG4gICAgICAgIGlmIChwLmkgIT09IGEuaSAmJiBwLm5leHQuaSAhPT0gYS5pICYmIHAuaSAhPT0gYi5pICYmIHAubmV4dC5pICE9PSBiLmkgJiZcbiAgICAgICAgICAgICAgICBpbnRlcnNlY3RzKHAsIHAubmV4dCwgYSwgYikpIHJldHVybiB0cnVlO1xuICAgICAgICBwID0gcC5uZXh0O1xuICAgIH0gd2hpbGUgKHAgIT09IGEpO1xuXG4gICAgcmV0dXJuIGZhbHNlO1xufVxuXG4vLyBjaGVjayBpZiBhIHBvbHlnb24gZGlhZ29uYWwgaXMgbG9jYWxseSBpbnNpZGUgdGhlIHBvbHlnb25cbmZ1bmN0aW9uIGxvY2FsbHlJbnNpZGUoYSwgYikge1xuICAgIHJldHVybiBhcmVhKGEucHJldiwgYSwgYS5uZXh0KSA8IDAgP1xuICAgICAgICBhcmVhKGEsIGIsIGEubmV4dCkgPj0gMCAmJiBhcmVhKGEsIGEucHJldiwgYikgPj0gMCA6XG4gICAgICAgIGFyZWEoYSwgYiwgYS5wcmV2KSA8IDAgfHwgYXJlYShhLCBhLm5leHQsIGIpIDwgMDtcbn1cblxuLy8gY2hlY2sgaWYgdGhlIG1pZGRsZSBwb2ludCBvZiBhIHBvbHlnb24gZGlhZ29uYWwgaXMgaW5zaWRlIHRoZSBwb2x5Z29uXG5mdW5jdGlvbiBtaWRkbGVJbnNpZGUoYSwgYikge1xuICAgIHZhciBwID0gYSxcbiAgICAgICAgaW5zaWRlID0gZmFsc2UsXG4gICAgICAgIHB4ID0gKGEueCArIGIueCkgLyAyLFxuICAgICAgICBweSA9IChhLnkgKyBiLnkpIC8gMjtcbiAgICBkbyB7XG4gICAgICAgIGlmICgoKHAueSA+IHB5KSAhPT0gKHAubmV4dC55ID4gcHkpKSAmJiAocHggPCAocC5uZXh0LnggLSBwLngpICogKHB5IC0gcC55KSAvIChwLm5leHQueSAtIHAueSkgKyBwLngpKVxuICAgICAgICAgICAgaW5zaWRlID0gIWluc2lkZTtcbiAgICAgICAgcCA9IHAubmV4dDtcbiAgICB9IHdoaWxlIChwICE9PSBhKTtcblxuICAgIHJldHVybiBpbnNpZGU7XG59XG5cbi8vIGxpbmsgdHdvIHBvbHlnb24gdmVydGljZXMgd2l0aCBhIGJyaWRnZTsgaWYgdGhlIHZlcnRpY2VzIGJlbG9uZyB0byB0aGUgc2FtZSByaW5nLCBpdCBzcGxpdHMgcG9seWdvbiBpbnRvIHR3bztcbi8vIGlmIG9uZSBiZWxvbmdzIHRvIHRoZSBvdXRlciByaW5nIGFuZCBhbm90aGVyIHRvIGEgaG9sZSwgaXQgbWVyZ2VzIGl0IGludG8gYSBzaW5nbGUgcmluZ1xuZnVuY3Rpb24gc3BsaXRQb2x5Z29uKGEsIGIpIHtcbiAgICB2YXIgYTIgPSBuZXcgTm9kZShhLmksIGEueCwgYS55KSxcbiAgICAgICAgYjIgPSBuZXcgTm9kZShiLmksIGIueCwgYi55KSxcbiAgICAgICAgYW4gPSBhLm5leHQsXG4gICAgICAgIGJwID0gYi5wcmV2O1xuXG4gICAgYS5uZXh0ID0gYjtcbiAgICBiLnByZXYgPSBhO1xuXG4gICAgYTIubmV4dCA9IGFuO1xuICAgIGFuLnByZXYgPSBhMjtcblxuICAgIGIyLm5leHQgPSBhMjtcbiAgICBhMi5wcmV2ID0gYjI7XG5cbiAgICBicC5uZXh0ID0gYjI7XG4gICAgYjIucHJldiA9IGJwO1xuXG4gICAgcmV0dXJuIGIyO1xufVxuXG4vLyBjcmVhdGUgYSBub2RlIGFuZCBvcHRpb25hbGx5IGxpbmsgaXQgd2l0aCBwcmV2aW91cyBvbmUgKGluIGEgY2lyY3VsYXIgZG91Ymx5IGxpbmtlZCBsaXN0KVxuZnVuY3Rpb24gaW5zZXJ0Tm9kZShpLCB4LCB5LCBsYXN0KSB7XG4gICAgdmFyIHAgPSBuZXcgTm9kZShpLCB4LCB5KTtcblxuICAgIGlmICghbGFzdCkge1xuICAgICAgICBwLnByZXYgPSBwO1xuICAgICAgICBwLm5leHQgPSBwO1xuXG4gICAgfSBlbHNlIHtcbiAgICAgICAgcC5uZXh0ID0gbGFzdC5uZXh0O1xuICAgICAgICBwLnByZXYgPSBsYXN0O1xuICAgICAgICBsYXN0Lm5leHQucHJldiA9IHA7XG4gICAgICAgIGxhc3QubmV4dCA9IHA7XG4gICAgfVxuICAgIHJldHVybiBwO1xufVxuXG5mdW5jdGlvbiByZW1vdmVOb2RlKHApIHtcbiAgICBwLm5leHQucHJldiA9IHAucHJldjtcbiAgICBwLnByZXYubmV4dCA9IHAubmV4dDtcblxuICAgIGlmIChwLnByZXZaKSBwLnByZXZaLm5leHRaID0gcC5uZXh0WjtcbiAgICBpZiAocC5uZXh0WikgcC5uZXh0Wi5wcmV2WiA9IHAucHJldlo7XG59XG5cbmZ1bmN0aW9uIE5vZGUoaSwgeCwgeSkge1xuICAgIC8vIHZlcnRpY2UgaW5kZXggaW4gY29vcmRpbmF0ZXMgYXJyYXlcbiAgICB0aGlzLmkgPSBpO1xuXG4gICAgLy8gdmVydGV4IGNvb3JkaW5hdGVzXG4gICAgdGhpcy54ID0geDtcbiAgICB0aGlzLnkgPSB5O1xuXG4gICAgLy8gcHJldmlvdXMgYW5kIG5leHQgdmVydGljZSBub2RlcyBpbiBhIHBvbHlnb24gcmluZ1xuICAgIHRoaXMucHJldiA9IG51bGw7XG4gICAgdGhpcy5uZXh0ID0gbnVsbDtcblxuICAgIC8vIHotb3JkZXIgY3VydmUgdmFsdWVcbiAgICB0aGlzLnogPSBudWxsO1xuXG4gICAgLy8gcHJldmlvdXMgYW5kIG5leHQgbm9kZXMgaW4gei1vcmRlclxuICAgIHRoaXMucHJldlogPSBudWxsO1xuICAgIHRoaXMubmV4dFogPSBudWxsO1xuXG4gICAgLy8gaW5kaWNhdGVzIHdoZXRoZXIgdGhpcyBpcyBhIHN0ZWluZXIgcG9pbnRcbiAgICB0aGlzLnN0ZWluZXIgPSBmYWxzZTtcbn1cblxuLy8gcmV0dXJuIGEgcGVyY2VudGFnZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIHBvbHlnb24gYXJlYSBhbmQgaXRzIHRyaWFuZ3VsYXRpb24gYXJlYTtcbi8vIHVzZWQgdG8gdmVyaWZ5IGNvcnJlY3RuZXNzIG9mIHRyaWFuZ3VsYXRpb25cbmVhcmN1dC5kZXZpYXRpb24gPSBmdW5jdGlvbiAoZGF0YSwgaG9sZUluZGljZXMsIGRpbSwgdHJpYW5nbGVzKSB7XG4gICAgdmFyIGhhc0hvbGVzID0gaG9sZUluZGljZXMgJiYgaG9sZUluZGljZXMubGVuZ3RoO1xuICAgIHZhciBvdXRlckxlbiA9IGhhc0hvbGVzID8gaG9sZUluZGljZXNbMF0gKiBkaW0gOiBkYXRhLmxlbmd0aDtcblxuICAgIHZhciBwb2x5Z29uQXJlYSA9IE1hdGguYWJzKHNpZ25lZEFyZWEoZGF0YSwgMCwgb3V0ZXJMZW4sIGRpbSkpO1xuICAgIGlmIChoYXNIb2xlcykge1xuICAgICAgICBmb3IgKHZhciBpID0gMCwgbGVuID0gaG9sZUluZGljZXMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgICAgIHZhciBzdGFydCA9IGhvbGVJbmRpY2VzW2ldICogZGltO1xuICAgICAgICAgICAgdmFyIGVuZCA9IGkgPCBsZW4gLSAxID8gaG9sZUluZGljZXNbaSArIDFdICogZGltIDogZGF0YS5sZW5ndGg7XG4gICAgICAgICAgICBwb2x5Z29uQXJlYSAtPSBNYXRoLmFicyhzaWduZWRBcmVhKGRhdGEsIHN0YXJ0LCBlbmQsIGRpbSkpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgdmFyIHRyaWFuZ2xlc0FyZWEgPSAwO1xuICAgIGZvciAoaSA9IDA7IGkgPCB0cmlhbmdsZXMubGVuZ3RoOyBpICs9IDMpIHtcbiAgICAgICAgdmFyIGEgPSB0cmlhbmdsZXNbaV0gKiBkaW07XG4gICAgICAgIHZhciBiID0gdHJpYW5nbGVzW2kgKyAxXSAqIGRpbTtcbiAgICAgICAgdmFyIGMgPSB0cmlhbmdsZXNbaSArIDJdICogZGltO1xuICAgICAgICB0cmlhbmdsZXNBcmVhICs9IE1hdGguYWJzKFxuICAgICAgICAgICAgKGRhdGFbYV0gLSBkYXRhW2NdKSAqIChkYXRhW2IgKyAxXSAtIGRhdGFbYSArIDFdKSAtXG4gICAgICAgICAgICAoZGF0YVthXSAtIGRhdGFbYl0pICogKGRhdGFbYyArIDFdIC0gZGF0YVthICsgMV0pKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcG9seWdvbkFyZWEgPT09IDAgJiYgdHJpYW5nbGVzQXJlYSA9PT0gMCA/IDAgOlxuICAgICAgICBNYXRoLmFicygodHJpYW5nbGVzQXJlYSAtIHBvbHlnb25BcmVhKSAvIHBvbHlnb25BcmVhKTtcbn07XG5cbmZ1bmN0aW9uIHNpZ25lZEFyZWEoZGF0YSwgc3RhcnQsIGVuZCwgZGltKSB7XG4gICAgdmFyIHN1bSA9IDA7XG4gICAgZm9yICh2YXIgaSA9IHN0YXJ0LCBqID0gZW5kIC0gZGltOyBpIDwgZW5kOyBpICs9IGRpbSkge1xuICAgICAgICBzdW0gKz0gKGRhdGFbal0gLSBkYXRhW2ldKSAqIChkYXRhW2kgKyAxXSArIGRhdGFbaiArIDFdKTtcbiAgICAgICAgaiA9IGk7XG4gICAgfVxuICAgIHJldHVybiBzdW07XG59XG5cbi8vIHR1cm4gYSBwb2x5Z29uIGluIGEgbXVsdGktZGltZW5zaW9uYWwgYXJyYXkgZm9ybSAoZS5nLiBhcyBpbiBHZW9KU09OKSBpbnRvIGEgZm9ybSBFYXJjdXQgYWNjZXB0c1xuZWFyY3V0LmZsYXR0ZW4gPSBmdW5jdGlvbiAoZGF0YSkge1xuICAgIHZhciBkaW0gPSBkYXRhWzBdWzBdLmxlbmd0aCxcbiAgICAgICAgcmVzdWx0ID0ge3ZlcnRpY2VzOiBbXSwgaG9sZXM6IFtdLCBkaW1lbnNpb25zOiBkaW19LFxuICAgICAgICBob2xlSW5kZXggPSAwO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBkYXRhLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgZGF0YVtpXS5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgZm9yICh2YXIgZCA9IDA7IGQgPCBkaW07IGQrKykgcmVzdWx0LnZlcnRpY2VzLnB1c2goZGF0YVtpXVtqXVtkXSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGkgPiAwKSB7XG4gICAgICAgICAgICBob2xlSW5kZXggKz0gZGF0YVtpIC0gMV0ubGVuZ3RoO1xuICAgICAgICAgICAgcmVzdWx0LmhvbGVzLnB1c2goaG9sZUluZGV4KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xufTtcbiIsIihmdW5jdGlvbigpe3ZhciBrPSEhZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcjtmdW5jdGlvbiBsKGEsYil7az9hLmFkZEV2ZW50TGlzdGVuZXIoXCJzY3JvbGxcIixiLCExKTphLmF0dGFjaEV2ZW50KFwic2Nyb2xsXCIsYil9ZnVuY3Rpb24gdihhKXtkb2N1bWVudC5ib2R5P2EoKTprP2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJET01Db250ZW50TG9hZGVkXCIsYSk6ZG9jdW1lbnQuYXR0YWNoRXZlbnQoXCJvbnJlYWR5c3RhdGVjaGFuZ2VcIixmdW5jdGlvbigpe1wiaW50ZXJhY3RpdmVcIiE9ZG9jdW1lbnQucmVhZHlTdGF0ZSYmXCJjb21wbGV0ZVwiIT1kb2N1bWVudC5yZWFkeVN0YXRlfHxhKCl9KX07ZnVuY3Rpb24gdyhhKXt0aGlzLmE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTt0aGlzLmEuc2V0QXR0cmlidXRlKFwiYXJpYS1oaWRkZW5cIixcInRydWVcIik7dGhpcy5hLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGEpKTt0aGlzLmI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInNwYW5cIik7dGhpcy5jPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIpO3RoaXMuaD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KFwic3BhblwiKTt0aGlzLmY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInNwYW5cIik7dGhpcy5nPS0xO3RoaXMuYi5zdHlsZS5jc3NUZXh0PVwibWF4LXdpZHRoOm5vbmU7ZGlzcGxheTppbmxpbmUtYmxvY2s7cG9zaXRpb246YWJzb2x1dGU7aGVpZ2h0OjEwMCU7d2lkdGg6MTAwJTtvdmVyZmxvdzpzY3JvbGw7Zm9udC1zaXplOjE2cHg7XCI7dGhpcy5jLnN0eWxlLmNzc1RleHQ9XCJtYXgtd2lkdGg6bm9uZTtkaXNwbGF5OmlubGluZS1ibG9jaztwb3NpdGlvbjphYnNvbHV0ZTtoZWlnaHQ6MTAwJTt3aWR0aDoxMDAlO292ZXJmbG93OnNjcm9sbDtmb250LXNpemU6MTZweDtcIjtcbnRoaXMuZi5zdHlsZS5jc3NUZXh0PVwibWF4LXdpZHRoOm5vbmU7ZGlzcGxheTppbmxpbmUtYmxvY2s7cG9zaXRpb246YWJzb2x1dGU7aGVpZ2h0OjEwMCU7d2lkdGg6MTAwJTtvdmVyZmxvdzpzY3JvbGw7Zm9udC1zaXplOjE2cHg7XCI7dGhpcy5oLnN0eWxlLmNzc1RleHQ9XCJkaXNwbGF5OmlubGluZS1ibG9jazt3aWR0aDoyMDAlO2hlaWdodDoyMDAlO2ZvbnQtc2l6ZToxNnB4O21heC13aWR0aDpub25lO1wiO3RoaXMuYi5hcHBlbmRDaGlsZCh0aGlzLmgpO3RoaXMuYy5hcHBlbmRDaGlsZCh0aGlzLmYpO3RoaXMuYS5hcHBlbmRDaGlsZCh0aGlzLmIpO3RoaXMuYS5hcHBlbmRDaGlsZCh0aGlzLmMpfVxuZnVuY3Rpb24geShhLGIpe2EuYS5zdHlsZS5jc3NUZXh0PVwibWF4LXdpZHRoOm5vbmU7bWluLXdpZHRoOjIwcHg7bWluLWhlaWdodDoyMHB4O2Rpc3BsYXk6aW5saW5lLWJsb2NrO292ZXJmbG93OmhpZGRlbjtwb3NpdGlvbjphYnNvbHV0ZTt3aWR0aDphdXRvO21hcmdpbjowO3BhZGRpbmc6MDt0b3A6LTk5OXB4O2xlZnQ6LTk5OXB4O3doaXRlLXNwYWNlOm5vd3JhcDtmb250OlwiK2IrXCI7XCJ9ZnVuY3Rpb24geihhKXt2YXIgYj1hLmEub2Zmc2V0V2lkdGgsYz1iKzEwMDthLmYuc3R5bGUud2lkdGg9YytcInB4XCI7YS5jLnNjcm9sbExlZnQ9YzthLmIuc2Nyb2xsTGVmdD1hLmIuc2Nyb2xsV2lkdGgrMTAwO3JldHVybiBhLmchPT1iPyhhLmc9YiwhMCk6ITF9ZnVuY3Rpb24gQShhLGIpe2Z1bmN0aW9uIGMoKXt2YXIgYT1tO3ooYSkmJm51bGwhPT1hLmEucGFyZW50Tm9kZSYmYihhLmcpfXZhciBtPWE7bChhLmIsYyk7bChhLmMsYyk7eihhKX07ZnVuY3Rpb24gQihhLGIpe3ZhciBjPWJ8fHt9O3RoaXMuZmFtaWx5PWE7dGhpcy5zdHlsZT1jLnN0eWxlfHxcIm5vcm1hbFwiO3RoaXMud2VpZ2h0PWMud2VpZ2h0fHxcIm5vcm1hbFwiO3RoaXMuc3RyZXRjaD1jLnN0cmV0Y2h8fFwibm9ybWFsXCJ9dmFyIEM9bnVsbCxEPW51bGwsSD0hIXdpbmRvdy5Gb250RmFjZTtmdW5jdGlvbiBJKCl7aWYobnVsbD09PUQpe3ZhciBhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7dHJ5e2Euc3R5bGUuZm9udD1cImNvbmRlbnNlZCAxMDBweCBzYW5zLXNlcmlmXCJ9Y2F0Y2goYil7fUQ9XCJcIiE9PWEuc3R5bGUuZm9udH1yZXR1cm4gRH1mdW5jdGlvbiBKKGEsYil7cmV0dXJuW2Euc3R5bGUsYS53ZWlnaHQsSSgpP2Euc3RyZXRjaDpcIlwiLFwiMTAwcHhcIixiXS5qb2luKFwiIFwiKX1cbkIucHJvdG90eXBlLmxvYWQ9ZnVuY3Rpb24oYSxiKXt2YXIgYz10aGlzLG09YXx8XCJCRVNic3d5XCIseD1ifHwzRTMsRT0obmV3IERhdGUpLmdldFRpbWUoKTtyZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24oYSxiKXtpZihIKXt2YXIgSz1uZXcgUHJvbWlzZShmdW5jdGlvbihhLGIpe2Z1bmN0aW9uIGUoKXsobmV3IERhdGUpLmdldFRpbWUoKS1FPj14P2IoKTpkb2N1bWVudC5mb250cy5sb2FkKEooYyxjLmZhbWlseSksbSkudGhlbihmdW5jdGlvbihjKXsxPD1jLmxlbmd0aD9hKCk6c2V0VGltZW91dChlLDI1KX0sZnVuY3Rpb24oKXtiKCl9KX1lKCl9KSxMPW5ldyBQcm9taXNlKGZ1bmN0aW9uKGEsYyl7c2V0VGltZW91dChjLHgpfSk7UHJvbWlzZS5yYWNlKFtMLEtdKS50aGVuKGZ1bmN0aW9uKCl7YShjKX0sZnVuY3Rpb24oKXtiKGMpfSl9ZWxzZSB2KGZ1bmN0aW9uKCl7ZnVuY3Rpb24gcSgpe3ZhciBiO2lmKGI9LTEhPWYmJi0xIT1nfHwtMSE9ZiYmLTEhPWh8fC0xIT1nJiYtMSE9XG5oKShiPWYhPWcmJmYhPWgmJmchPWgpfHwobnVsbD09PUMmJihiPS9BcHBsZVdlYktpdFxcLyhbMC05XSspKD86XFwuKFswLTldKykpLy5leGVjKHdpbmRvdy5uYXZpZ2F0b3IudXNlckFnZW50KSxDPSEhYiYmKDUzNj5wYXJzZUludChiWzFdLDEwKXx8NTM2PT09cGFyc2VJbnQoYlsxXSwxMCkmJjExPj1wYXJzZUludChiWzJdLDEwKSkpLGI9QyYmKGY9PXImJmc9PXImJmg9PXJ8fGY9PXQmJmc9PXQmJmg9PXR8fGY9PXUmJmc9PXUmJmg9PXUpKSxiPSFiO2ImJihudWxsIT09ZC5wYXJlbnROb2RlJiZkLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoZCksY2xlYXJUaW1lb3V0KEcpLGEoYykpfWZ1bmN0aW9uIEYoKXtpZigobmV3IERhdGUpLmdldFRpbWUoKS1FPj14KW51bGwhPT1kLnBhcmVudE5vZGUmJmQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChkKSxiKGMpO2Vsc2V7dmFyIGE9ZG9jdW1lbnQuaGlkZGVuO2lmKCEwPT09YXx8dm9pZCAwPT09YSlmPWUuYS5vZmZzZXRXaWR0aCxnPW4uYS5vZmZzZXRXaWR0aCxcbmg9cC5hLm9mZnNldFdpZHRoLHEoKTtHPXNldFRpbWVvdXQoRiw1MCl9fXZhciBlPW5ldyB3KG0pLG49bmV3IHcobSkscD1uZXcgdyhtKSxmPS0xLGc9LTEsaD0tMSxyPS0xLHQ9LTEsdT0tMSxkPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiksRz0wO2QuZGlyPVwibHRyXCI7eShlLEooYyxcInNhbnMtc2VyaWZcIikpO3kobixKKGMsXCJzZXJpZlwiKSk7eShwLEooYyxcIm1vbm9zcGFjZVwiKSk7ZC5hcHBlbmRDaGlsZChlLmEpO2QuYXBwZW5kQ2hpbGQobi5hKTtkLmFwcGVuZENoaWxkKHAuYSk7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChkKTtyPWUuYS5vZmZzZXRXaWR0aDt0PW4uYS5vZmZzZXRXaWR0aDt1PXAuYS5vZmZzZXRXaWR0aDtGKCk7QShlLGZ1bmN0aW9uKGEpe2Y9YTtxKCl9KTt5KGUsSihjLCdcIicrYy5mYW1pbHkrJ1wiLHNhbnMtc2VyaWYnKSk7QShuLGZ1bmN0aW9uKGEpe2c9YTtxKCl9KTt5KG4sSihjLCdcIicrYy5mYW1pbHkrJ1wiLHNlcmlmJykpO0EocCxmdW5jdGlvbihhKXtoPVxuYTtxKCl9KTt5KHAsSihjLCdcIicrYy5mYW1pbHkrJ1wiLG1vbm9zcGFjZScpKX0pfSl9O3dpbmRvdy5Gb250RmFjZU9ic2VydmVyPUI7d2luZG93LkZvbnRGYWNlT2JzZXJ2ZXIucHJvdG90eXBlLmNoZWNrPXdpbmRvdy5Gb250RmFjZU9ic2VydmVyLnByb3RvdHlwZS5sb2FkPUIucHJvdG90eXBlLmxvYWQ7XCJ1bmRlZmluZWRcIiE9PXR5cGVvZiBtb2R1bGUmJihtb2R1bGUuZXhwb3J0cz13aW5kb3cuRm9udEZhY2VPYnNlcnZlcik7fSgpKTtcbiIsIid1c2Ugc3RyaWN0JztcblxubW9kdWxlLmV4cG9ydHMgPSBjbGlwO1xuXG4vKiBjbGlwIGZlYXR1cmVzIGJldHdlZW4gdHdvIGF4aXMtcGFyYWxsZWwgbGluZXM6XG4gKiAgICAgfCAgICAgICAgfFxuICogIF9fX3xfX18gICAgIHwgICAgIC9cbiAqIC8gICB8ICAgXFxfX19ffF9fX18vXG4gKiAgICAgfCAgICAgICAgfFxuICovXG5cbmZ1bmN0aW9uIGNsaXAoZmVhdHVyZXMsIHNjYWxlLCBrMSwgazIsIGF4aXMsIGludGVyc2VjdCwgbWluQWxsLCBtYXhBbGwpIHtcblxuICAgIGsxIC89IHNjYWxlO1xuICAgIGsyIC89IHNjYWxlO1xuXG4gICAgaWYgKG1pbkFsbCA+PSBrMSAmJiBtYXhBbGwgPD0gazIpIHJldHVybiBmZWF0dXJlczsgLy8gdHJpdmlhbCBhY2NlcHRcbiAgICBlbHNlIGlmIChtaW5BbGwgPiBrMiB8fCBtYXhBbGwgPCBrMSkgcmV0dXJuIG51bGw7IC8vIHRyaXZpYWwgcmVqZWN0XG5cbiAgICB2YXIgY2xpcHBlZCA9IFtdO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBmZWF0dXJlcy5sZW5ndGg7IGkrKykge1xuXG4gICAgICAgIHZhciBmZWF0dXJlID0gZmVhdHVyZXNbaV0sXG4gICAgICAgICAgICBnZW9tZXRyeSA9IGZlYXR1cmUuZ2VvbWV0cnksXG4gICAgICAgICAgICB0eXBlID0gZmVhdHVyZS50eXBlLFxuICAgICAgICAgICAgbWluLCBtYXg7XG5cbiAgICAgICAgbWluID0gZmVhdHVyZS5taW5bYXhpc107XG4gICAgICAgIG1heCA9IGZlYXR1cmUubWF4W2F4aXNdO1xuXG4gICAgICAgIGlmIChtaW4gPj0gazEgJiYgbWF4IDw9IGsyKSB7IC8vIHRyaXZpYWwgYWNjZXB0XG4gICAgICAgICAgICBjbGlwcGVkLnB1c2goZmVhdHVyZSk7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfSBlbHNlIGlmIChtaW4gPiBrMiB8fCBtYXggPCBrMSkgY29udGludWU7IC8vIHRyaXZpYWwgcmVqZWN0XG5cbiAgICAgICAgdmFyIHNsaWNlcyA9IHR5cGUgPT09IDEgP1xuICAgICAgICAgICAgICAgIGNsaXBQb2ludHMoZ2VvbWV0cnksIGsxLCBrMiwgYXhpcykgOlxuICAgICAgICAgICAgICAgIGNsaXBHZW9tZXRyeShnZW9tZXRyeSwgazEsIGsyLCBheGlzLCBpbnRlcnNlY3QsIHR5cGUgPT09IDMpO1xuXG4gICAgICAgIGlmIChzbGljZXMubGVuZ3RoKSB7XG4gICAgICAgICAgICAvLyBpZiBhIGZlYXR1cmUgZ290IGNsaXBwZWQsIGl0IHdpbGwgbGlrZWx5IGdldCBjbGlwcGVkIG9uIHRoZSBuZXh0IHpvb20gbGV2ZWwgYXMgd2VsbCxcbiAgICAgICAgICAgIC8vIHNvIHRoZXJlJ3Mgbm8gbmVlZCB0byByZWNhbGN1bGF0ZSBiYm94ZXNcbiAgICAgICAgICAgIGNsaXBwZWQucHVzaCh7XG4gICAgICAgICAgICAgICAgZ2VvbWV0cnk6IHNsaWNlcyxcbiAgICAgICAgICAgICAgICB0eXBlOiB0eXBlLFxuICAgICAgICAgICAgICAgIHRhZ3M6IGZlYXR1cmVzW2ldLnRhZ3MgfHwgbnVsbCxcbiAgICAgICAgICAgICAgICBtaW46IGZlYXR1cmUubWluLFxuICAgICAgICAgICAgICAgIG1heDogZmVhdHVyZS5tYXhcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGNsaXBwZWQubGVuZ3RoID8gY2xpcHBlZCA6IG51bGw7XG59XG5cbmZ1bmN0aW9uIGNsaXBQb2ludHMoZ2VvbWV0cnksIGsxLCBrMiwgYXhpcykge1xuICAgIHZhciBzbGljZSA9IFtdO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBnZW9tZXRyeS5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgYSA9IGdlb21ldHJ5W2ldLFxuICAgICAgICAgICAgYWsgPSBhW2F4aXNdO1xuXG4gICAgICAgIGlmIChhayA+PSBrMSAmJiBhayA8PSBrMikgc2xpY2UucHVzaChhKTtcbiAgICB9XG4gICAgcmV0dXJuIHNsaWNlO1xufVxuXG5mdW5jdGlvbiBjbGlwR2VvbWV0cnkoZ2VvbWV0cnksIGsxLCBrMiwgYXhpcywgaW50ZXJzZWN0LCBjbG9zZWQpIHtcblxuICAgIHZhciBzbGljZXMgPSBbXTtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZ2VvbWV0cnkubGVuZ3RoOyBpKyspIHtcblxuICAgICAgICB2YXIgYWsgPSAwLFxuICAgICAgICAgICAgYmsgPSAwLFxuICAgICAgICAgICAgYiA9IG51bGwsXG4gICAgICAgICAgICBwb2ludHMgPSBnZW9tZXRyeVtpXSxcbiAgICAgICAgICAgIGFyZWEgPSBwb2ludHMuYXJlYSxcbiAgICAgICAgICAgIGRpc3QgPSBwb2ludHMuZGlzdCxcbiAgICAgICAgICAgIGxlbiA9IHBvaW50cy5sZW5ndGgsXG4gICAgICAgICAgICBhLCBqLCBsYXN0O1xuXG4gICAgICAgIHZhciBzbGljZSA9IFtdO1xuXG4gICAgICAgIGZvciAoaiA9IDA7IGogPCBsZW4gLSAxOyBqKyspIHtcbiAgICAgICAgICAgIGEgPSBiIHx8IHBvaW50c1tqXTtcbiAgICAgICAgICAgIGIgPSBwb2ludHNbaiArIDFdO1xuICAgICAgICAgICAgYWsgPSBiayB8fCBhW2F4aXNdO1xuICAgICAgICAgICAgYmsgPSBiW2F4aXNdO1xuXG4gICAgICAgICAgICBpZiAoYWsgPCBrMSkge1xuXG4gICAgICAgICAgICAgICAgaWYgKChiayA+IGsyKSkgeyAvLyAtLS18LS0tLS18LS0+XG4gICAgICAgICAgICAgICAgICAgIHNsaWNlLnB1c2goaW50ZXJzZWN0KGEsIGIsIGsxKSwgaW50ZXJzZWN0KGEsIGIsIGsyKSk7XG4gICAgICAgICAgICAgICAgICAgIGlmICghY2xvc2VkKSBzbGljZSA9IG5ld1NsaWNlKHNsaWNlcywgc2xpY2UsIGFyZWEsIGRpc3QpO1xuXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChiayA+PSBrMSkgc2xpY2UucHVzaChpbnRlcnNlY3QoYSwgYiwgazEpKTsgLy8gLS0tfC0tPiAgfFxuXG4gICAgICAgICAgICB9IGVsc2UgaWYgKGFrID4gazIpIHtcblxuICAgICAgICAgICAgICAgIGlmICgoYmsgPCBrMSkpIHsgLy8gPC0tfC0tLS0tfC0tLVxuICAgICAgICAgICAgICAgICAgICBzbGljZS5wdXNoKGludGVyc2VjdChhLCBiLCBrMiksIGludGVyc2VjdChhLCBiLCBrMSkpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWNsb3NlZCkgc2xpY2UgPSBuZXdTbGljZShzbGljZXMsIHNsaWNlLCBhcmVhLCBkaXN0KTtcblxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYmsgPD0gazIpIHNsaWNlLnB1c2goaW50ZXJzZWN0KGEsIGIsIGsyKSk7IC8vIHwgIDwtLXwtLS1cblxuICAgICAgICAgICAgfSBlbHNlIHtcblxuICAgICAgICAgICAgICAgIHNsaWNlLnB1c2goYSk7XG5cbiAgICAgICAgICAgICAgICBpZiAoYmsgPCBrMSkgeyAvLyA8LS18LS0tICB8XG4gICAgICAgICAgICAgICAgICAgIHNsaWNlLnB1c2goaW50ZXJzZWN0KGEsIGIsIGsxKSk7XG4gICAgICAgICAgICAgICAgICAgIGlmICghY2xvc2VkKSBzbGljZSA9IG5ld1NsaWNlKHNsaWNlcywgc2xpY2UsIGFyZWEsIGRpc3QpO1xuXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChiayA+IGsyKSB7IC8vIHwgIC0tLXwtLT5cbiAgICAgICAgICAgICAgICAgICAgc2xpY2UucHVzaChpbnRlcnNlY3QoYSwgYiwgazIpKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFjbG9zZWQpIHNsaWNlID0gbmV3U2xpY2Uoc2xpY2VzLCBzbGljZSwgYXJlYSwgZGlzdCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIHwgLS0+IHxcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGFkZCB0aGUgbGFzdCBwb2ludFxuICAgICAgICBhID0gcG9pbnRzW2xlbiAtIDFdO1xuICAgICAgICBhayA9IGFbYXhpc107XG4gICAgICAgIGlmIChhayA+PSBrMSAmJiBhayA8PSBrMikgc2xpY2UucHVzaChhKTtcblxuICAgICAgICAvLyBjbG9zZSB0aGUgcG9seWdvbiBpZiBpdHMgZW5kcG9pbnRzIGFyZSBub3QgdGhlIHNhbWUgYWZ0ZXIgY2xpcHBpbmdcblxuICAgICAgICBsYXN0ID0gc2xpY2Vbc2xpY2UubGVuZ3RoIC0gMV07XG4gICAgICAgIGlmIChjbG9zZWQgJiYgbGFzdCAmJiAoc2xpY2VbMF1bMF0gIT09IGxhc3RbMF0gfHwgc2xpY2VbMF1bMV0gIT09IGxhc3RbMV0pKSBzbGljZS5wdXNoKHNsaWNlWzBdKTtcblxuICAgICAgICAvLyBhZGQgdGhlIGZpbmFsIHNsaWNlXG4gICAgICAgIG5ld1NsaWNlKHNsaWNlcywgc2xpY2UsIGFyZWEsIGRpc3QpO1xuICAgIH1cblxuICAgIHJldHVybiBzbGljZXM7XG59XG5cbmZ1bmN0aW9uIG5ld1NsaWNlKHNsaWNlcywgc2xpY2UsIGFyZWEsIGRpc3QpIHtcbiAgICBpZiAoc2xpY2UubGVuZ3RoKSB7XG4gICAgICAgIC8vIHdlIGRvbid0IHJlY2FsY3VsYXRlIHRoZSBhcmVhL2xlbmd0aCBvZiB0aGUgdW5jbGlwcGVkIGdlb21ldHJ5IGJlY2F1c2UgdGhlIGNhc2Ugd2hlcmUgaXQgZ29lc1xuICAgICAgICAvLyBiZWxvdyB0aGUgdmlzaWJpbGl0eSB0aHJlc2hvbGQgYXMgYSByZXN1bHQgb2YgY2xpcHBpbmcgaXMgcmFyZSwgc28gd2UgYXZvaWQgZG9pbmcgdW5uZWNlc3Nhcnkgd29ya1xuICAgICAgICBzbGljZS5hcmVhID0gYXJlYTtcbiAgICAgICAgc2xpY2UuZGlzdCA9IGRpc3Q7XG5cbiAgICAgICAgc2xpY2VzLnB1c2goc2xpY2UpO1xuICAgIH1cbiAgICByZXR1cm4gW107XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbm1vZHVsZS5leHBvcnRzID0gY29udmVydDtcblxudmFyIHNpbXBsaWZ5ID0gcmVxdWlyZSgnLi9zaW1wbGlmeScpO1xuXG4vLyBjb252ZXJ0cyBHZW9KU09OIGZlYXR1cmUgaW50byBhbiBpbnRlcm1lZGlhdGUgcHJvamVjdGVkIEpTT04gdmVjdG9yIGZvcm1hdCB3aXRoIHNpbXBsaWZpY2F0aW9uIGRhdGFcblxuZnVuY3Rpb24gY29udmVydChkYXRhLCB0b2xlcmFuY2UpIHtcbiAgICB2YXIgZmVhdHVyZXMgPSBbXTtcblxuICAgIGlmIChkYXRhLnR5cGUgPT09ICdGZWF0dXJlQ29sbGVjdGlvbicpIHtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBkYXRhLmZlYXR1cmVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBjb252ZXJ0RmVhdHVyZShmZWF0dXJlcywgZGF0YS5mZWF0dXJlc1tpXSwgdG9sZXJhbmNlKTtcbiAgICAgICAgfVxuICAgIH0gZWxzZSBpZiAoZGF0YS50eXBlID09PSAnRmVhdHVyZScpIHtcbiAgICAgICAgY29udmVydEZlYXR1cmUoZmVhdHVyZXMsIGRhdGEsIHRvbGVyYW5jZSk7XG5cbiAgICB9IGVsc2Uge1xuICAgICAgICAvLyBzaW5nbGUgZ2VvbWV0cnkgb3IgYSBnZW9tZXRyeSBjb2xsZWN0aW9uXG4gICAgICAgIGNvbnZlcnRGZWF0dXJlKGZlYXR1cmVzLCB7Z2VvbWV0cnk6IGRhdGF9LCB0b2xlcmFuY2UpO1xuICAgIH1cbiAgICByZXR1cm4gZmVhdHVyZXM7XG59XG5cbmZ1bmN0aW9uIGNvbnZlcnRGZWF0dXJlKGZlYXR1cmVzLCBmZWF0dXJlLCB0b2xlcmFuY2UpIHtcbiAgICB2YXIgZ2VvbSA9IGZlYXR1cmUuZ2VvbWV0cnksXG4gICAgICAgIHR5cGUgPSBnZW9tLnR5cGUsXG4gICAgICAgIGNvb3JkcyA9IGdlb20uY29vcmRpbmF0ZXMsXG4gICAgICAgIHRhZ3MgPSBmZWF0dXJlLnByb3BlcnRpZXMsXG4gICAgICAgIGksIGosIHJpbmdzO1xuXG4gICAgaWYgKHR5cGUgPT09ICdQb2ludCcpIHtcbiAgICAgICAgZmVhdHVyZXMucHVzaChjcmVhdGUodGFncywgMSwgW3Byb2plY3RQb2ludChjb29yZHMpXSkpO1xuXG4gICAgfSBlbHNlIGlmICh0eXBlID09PSAnTXVsdGlQb2ludCcpIHtcbiAgICAgICAgZmVhdHVyZXMucHVzaChjcmVhdGUodGFncywgMSwgcHJvamVjdChjb29yZHMpKSk7XG5cbiAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdMaW5lU3RyaW5nJykge1xuICAgICAgICBmZWF0dXJlcy5wdXNoKGNyZWF0ZSh0YWdzLCAyLCBbcHJvamVjdChjb29yZHMsIHRvbGVyYW5jZSldKSk7XG5cbiAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdNdWx0aUxpbmVTdHJpbmcnIHx8IHR5cGUgPT09ICdQb2x5Z29uJykge1xuICAgICAgICByaW5ncyA9IFtdO1xuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgY29vcmRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICByaW5ncy5wdXNoKHByb2plY3QoY29vcmRzW2ldLCB0b2xlcmFuY2UpKTtcbiAgICAgICAgfVxuICAgICAgICBmZWF0dXJlcy5wdXNoKGNyZWF0ZSh0YWdzLCB0eXBlID09PSAnUG9seWdvbicgPyAzIDogMiwgcmluZ3MpKTtcblxuICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ011bHRpUG9seWdvbicpIHtcbiAgICAgICAgcmluZ3MgPSBbXTtcbiAgICAgICAgZm9yIChpID0gMDsgaSA8IGNvb3Jkcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IGNvb3Jkc1tpXS5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgICAgIHJpbmdzLnB1c2gocHJvamVjdChjb29yZHNbaV1bal0sIHRvbGVyYW5jZSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGZlYXR1cmVzLnB1c2goY3JlYXRlKHRhZ3MsIDMsIHJpbmdzKSk7XG5cbiAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdHZW9tZXRyeUNvbGxlY3Rpb24nKSB7XG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCBnZW9tLmdlb21ldHJpZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnZlcnRGZWF0dXJlKGZlYXR1cmVzLCB7XG4gICAgICAgICAgICAgICAgZ2VvbWV0cnk6IGdlb20uZ2VvbWV0cmllc1tpXSxcbiAgICAgICAgICAgICAgICBwcm9wZXJ0aWVzOiB0YWdzXG4gICAgICAgICAgICB9LCB0b2xlcmFuY2UpO1xuICAgICAgICB9XG5cbiAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0lucHV0IGRhdGEgaXMgbm90IGEgdmFsaWQgR2VvSlNPTiBvYmplY3QuJyk7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBjcmVhdGUodGFncywgdHlwZSwgZ2VvbWV0cnkpIHtcbiAgICB2YXIgZmVhdHVyZSA9IHtcbiAgICAgICAgZ2VvbWV0cnk6IGdlb21ldHJ5LFxuICAgICAgICB0eXBlOiB0eXBlLFxuICAgICAgICB0YWdzOiB0YWdzIHx8IG51bGwsXG4gICAgICAgIG1pbjogWzIsIDFdLCAvLyBpbml0aWFsIGJib3ggdmFsdWVzO1xuICAgICAgICBtYXg6IFstMSwgMF0gIC8vIG5vdGUgdGhhdCBjb29yZHMgYXJlIHVzdWFsbHkgaW4gWzAuLjFdIHJhbmdlXG4gICAgfTtcbiAgICBjYWxjQkJveChmZWF0dXJlKTtcbiAgICByZXR1cm4gZmVhdHVyZTtcbn1cblxuZnVuY3Rpb24gcHJvamVjdChsb25sYXRzLCB0b2xlcmFuY2UpIHtcbiAgICB2YXIgcHJvamVjdGVkID0gW107XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsb25sYXRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHByb2plY3RlZC5wdXNoKHByb2plY3RQb2ludChsb25sYXRzW2ldKSk7XG4gICAgfVxuICAgIGlmICh0b2xlcmFuY2UpIHtcbiAgICAgICAgc2ltcGxpZnkocHJvamVjdGVkLCB0b2xlcmFuY2UpO1xuICAgICAgICBjYWxjU2l6ZShwcm9qZWN0ZWQpO1xuICAgIH1cbiAgICByZXR1cm4gcHJvamVjdGVkO1xufVxuXG5mdW5jdGlvbiBwcm9qZWN0UG9pbnQocCkge1xuICAgIHZhciBzaW4gPSBNYXRoLnNpbihwWzFdICogTWF0aC5QSSAvIDE4MCksXG4gICAgICAgIHggPSAocFswXSAvIDM2MCArIDAuNSksXG4gICAgICAgIHkgPSAoMC41IC0gMC4yNSAqIE1hdGgubG9nKCgxICsgc2luKSAvICgxIC0gc2luKSkgLyBNYXRoLlBJKTtcblxuICAgIHkgPSB5IDwgLTEgPyAtMSA6XG4gICAgICAgIHkgPiAxID8gMSA6IHk7XG5cbiAgICByZXR1cm4gW3gsIHksIDBdO1xufVxuXG4vLyBjYWxjdWxhdGUgYXJlYSBhbmQgbGVuZ3RoIG9mIHRoZSBwb2x5XG5mdW5jdGlvbiBjYWxjU2l6ZShwb2ludHMpIHtcbiAgICB2YXIgYXJlYSA9IDAsXG4gICAgICAgIGRpc3QgPSAwO1xuXG4gICAgZm9yICh2YXIgaSA9IDAsIGEsIGI7IGkgPCBwb2ludHMubGVuZ3RoIC0gMTsgaSsrKSB7XG4gICAgICAgIGEgPSBiIHx8IHBvaW50c1tpXTtcbiAgICAgICAgYiA9IHBvaW50c1tpICsgMV07XG5cbiAgICAgICAgYXJlYSArPSBhWzBdICogYlsxXSAtIGJbMF0gKiBhWzFdO1xuXG4gICAgICAgIC8vIHVzZSBNYW5oYXR0YW4gZGlzdGFuY2UgaW5zdGVhZCBvZiBFdWNsaWRpYW4gb25lIHRvIGF2b2lkIGV4cGVuc2l2ZSBzcXVhcmUgcm9vdCBjb21wdXRhdGlvblxuICAgICAgICBkaXN0ICs9IE1hdGguYWJzKGJbMF0gLSBhWzBdKSArIE1hdGguYWJzKGJbMV0gLSBhWzFdKTtcbiAgICB9XG4gICAgcG9pbnRzLmFyZWEgPSBNYXRoLmFicyhhcmVhIC8gMik7XG4gICAgcG9pbnRzLmRpc3QgPSBkaXN0O1xufVxuXG4vLyBjYWxjdWxhdGUgdGhlIGZlYXR1cmUgYm91bmRpbmcgYm94IGZvciBmYXN0ZXIgY2xpcHBpbmcgbGF0ZXJcbmZ1bmN0aW9uIGNhbGNCQm94KGZlYXR1cmUpIHtcbiAgICB2YXIgZ2VvbWV0cnkgPSBmZWF0dXJlLmdlb21ldHJ5LFxuICAgICAgICBtaW4gPSBmZWF0dXJlLm1pbixcbiAgICAgICAgbWF4ID0gZmVhdHVyZS5tYXg7XG5cbiAgICBpZiAoZmVhdHVyZS50eXBlID09PSAxKSBjYWxjUmluZ0JCb3gobWluLCBtYXgsIGdlb21ldHJ5KTtcbiAgICBlbHNlIGZvciAodmFyIGkgPSAwOyBpIDwgZ2VvbWV0cnkubGVuZ3RoOyBpKyspIGNhbGNSaW5nQkJveChtaW4sIG1heCwgZ2VvbWV0cnlbaV0pO1xuXG4gICAgcmV0dXJuIGZlYXR1cmU7XG59XG5cbmZ1bmN0aW9uIGNhbGNSaW5nQkJveChtaW4sIG1heCwgcG9pbnRzKSB7XG4gICAgZm9yICh2YXIgaSA9IDAsIHA7IGkgPCBwb2ludHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgcCA9IHBvaW50c1tpXTtcbiAgICAgICAgbWluWzBdID0gTWF0aC5taW4ocFswXSwgbWluWzBdKTtcbiAgICAgICAgbWF4WzBdID0gTWF0aC5tYXgocFswXSwgbWF4WzBdKTtcbiAgICAgICAgbWluWzFdID0gTWF0aC5taW4ocFsxXSwgbWluWzFdKTtcbiAgICAgICAgbWF4WzFdID0gTWF0aC5tYXgocFsxXSwgbWF4WzFdKTtcbiAgICB9XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbm1vZHVsZS5leHBvcnRzID0gZ2VvanNvbnZ0O1xuXG52YXIgY29udmVydCA9IHJlcXVpcmUoJy4vY29udmVydCcpLCAvLyBHZW9KU09OIGNvbnZlcnNpb24gYW5kIHByZXByb2Nlc3NpbmdcbiAgICBjbGlwID0gcmVxdWlyZSgnLi9jbGlwJyksICAgICAgIC8vIHN0cmlwZSBjbGlwcGluZyBhbGdvcml0aG1cbiAgICB3cmFwID0gcmVxdWlyZSgnLi93cmFwJyksICAgICAgIC8vIGRhdGUgbGluZSBwcm9jZXNzaW5nXG4gICAgY3JlYXRlVGlsZSA9IHJlcXVpcmUoJy4vdGlsZScpOyAvLyBmaW5hbCBzaW1wbGlmaWVkIHRpbGUgZ2VuZXJhdGlvblxuXG5cbmZ1bmN0aW9uIGdlb2pzb252dChkYXRhLCBvcHRpb25zKSB7XG4gICAgcmV0dXJuIG5ldyBHZW9KU09OVlQoZGF0YSwgb3B0aW9ucyk7XG59XG5cbmZ1bmN0aW9uIEdlb0pTT05WVChkYXRhLCBvcHRpb25zKSB7XG4gICAgb3B0aW9ucyA9IHRoaXMub3B0aW9ucyA9IGV4dGVuZChPYmplY3QuY3JlYXRlKHRoaXMub3B0aW9ucyksIG9wdGlvbnMpO1xuXG4gICAgdmFyIGRlYnVnID0gb3B0aW9ucy5kZWJ1ZztcblxuICAgIGlmIChkZWJ1ZykgY29uc29sZS50aW1lKCdwcmVwcm9jZXNzIGRhdGEnKTtcblxuICAgIHZhciB6MiA9IDEgPDwgb3B0aW9ucy5tYXhab29tLCAvLyAyXnpcbiAgICAgICAgZmVhdHVyZXMgPSBjb252ZXJ0KGRhdGEsIG9wdGlvbnMudG9sZXJhbmNlIC8gKHoyICogb3B0aW9ucy5leHRlbnQpKTtcblxuICAgIHRoaXMudGlsZXMgPSB7fTtcbiAgICB0aGlzLnRpbGVDb29yZHMgPSBbXTtcblxuICAgIGlmIChkZWJ1Zykge1xuICAgICAgICBjb25zb2xlLnRpbWVFbmQoJ3ByZXByb2Nlc3MgZGF0YScpO1xuICAgICAgICBjb25zb2xlLmxvZygnaW5kZXg6IG1heFpvb206ICVkLCBtYXhQb2ludHM6ICVkJywgb3B0aW9ucy5pbmRleE1heFpvb20sIG9wdGlvbnMuaW5kZXhNYXhQb2ludHMpO1xuICAgICAgICBjb25zb2xlLnRpbWUoJ2dlbmVyYXRlIHRpbGVzJyk7XG4gICAgICAgIHRoaXMuc3RhdHMgPSB7fTtcbiAgICAgICAgdGhpcy50b3RhbCA9IDA7XG4gICAgfVxuXG4gICAgZmVhdHVyZXMgPSB3cmFwKGZlYXR1cmVzLCBvcHRpb25zLmJ1ZmZlciAvIG9wdGlvbnMuZXh0ZW50LCBpbnRlcnNlY3RYKTtcblxuICAgIC8vIHN0YXJ0IHNsaWNpbmcgZnJvbSB0aGUgdG9wIHRpbGUgZG93blxuICAgIGlmIChmZWF0dXJlcy5sZW5ndGgpIHRoaXMuc3BsaXRUaWxlKGZlYXR1cmVzLCAwLCAwLCAwKTtcblxuICAgIGlmIChkZWJ1Zykge1xuICAgICAgICBpZiAoZmVhdHVyZXMubGVuZ3RoKSBjb25zb2xlLmxvZygnZmVhdHVyZXM6ICVkLCBwb2ludHM6ICVkJywgdGhpcy50aWxlc1swXS5udW1GZWF0dXJlcywgdGhpcy50aWxlc1swXS5udW1Qb2ludHMpO1xuICAgICAgICBjb25zb2xlLnRpbWVFbmQoJ2dlbmVyYXRlIHRpbGVzJyk7XG4gICAgICAgIGNvbnNvbGUubG9nKCd0aWxlcyBnZW5lcmF0ZWQ6JywgdGhpcy50b3RhbCwgSlNPTi5zdHJpbmdpZnkodGhpcy5zdGF0cykpO1xuICAgIH1cbn1cblxuR2VvSlNPTlZULnByb3RvdHlwZS5vcHRpb25zID0ge1xuICAgIG1heFpvb206IDE0LCAgICAgICAgICAgIC8vIG1heCB6b29tIHRvIHByZXNlcnZlIGRldGFpbCBvblxuICAgIGluZGV4TWF4Wm9vbTogNSwgICAgICAgIC8vIG1heCB6b29tIGluIHRoZSB0aWxlIGluZGV4XG4gICAgaW5kZXhNYXhQb2ludHM6IDEwMDAwMCwgLy8gbWF4IG51bWJlciBvZiBwb2ludHMgcGVyIHRpbGUgaW4gdGhlIHRpbGUgaW5kZXhcbiAgICBzb2xpZENoaWxkcmVuOiBmYWxzZSwgICAvLyB3aGV0aGVyIHRvIHRpbGUgc29saWQgc3F1YXJlIHRpbGVzIGZ1cnRoZXJcbiAgICB0b2xlcmFuY2U6IDMsICAgICAgICAgICAvLyBzaW1wbGlmaWNhdGlvbiB0b2xlcmFuY2UgKGhpZ2hlciBtZWFucyBzaW1wbGVyKVxuICAgIGV4dGVudDogNDA5NiwgICAgICAgICAgIC8vIHRpbGUgZXh0ZW50XG4gICAgYnVmZmVyOiA2NCwgICAgICAgICAgICAgLy8gdGlsZSBidWZmZXIgb24gZWFjaCBzaWRlXG4gICAgZGVidWc6IDAgICAgICAgICAgICAgICAgLy8gbG9nZ2luZyBsZXZlbCAoMCwgMSBvciAyKVxufTtcblxuR2VvSlNPTlZULnByb3RvdHlwZS5zcGxpdFRpbGUgPSBmdW5jdGlvbiAoZmVhdHVyZXMsIHosIHgsIHksIGN6LCBjeCwgY3kpIHtcblxuICAgIHZhciBzdGFjayA9IFtmZWF0dXJlcywgeiwgeCwgeV0sXG4gICAgICAgIG9wdGlvbnMgPSB0aGlzLm9wdGlvbnMsXG4gICAgICAgIGRlYnVnID0gb3B0aW9ucy5kZWJ1ZztcblxuICAgIC8vIGF2b2lkIHJlY3Vyc2lvbiBieSB1c2luZyBhIHByb2Nlc3NpbmcgcXVldWVcbiAgICB3aGlsZSAoc3RhY2subGVuZ3RoKSB7XG4gICAgICAgIHkgPSBzdGFjay5wb3AoKTtcbiAgICAgICAgeCA9IHN0YWNrLnBvcCgpO1xuICAgICAgICB6ID0gc3RhY2sucG9wKCk7XG4gICAgICAgIGZlYXR1cmVzID0gc3RhY2sucG9wKCk7XG5cbiAgICAgICAgdmFyIHoyID0gMSA8PCB6LFxuICAgICAgICAgICAgaWQgPSB0b0lEKHosIHgsIHkpLFxuICAgICAgICAgICAgdGlsZSA9IHRoaXMudGlsZXNbaWRdLFxuICAgICAgICAgICAgdGlsZVRvbGVyYW5jZSA9IHogPT09IG9wdGlvbnMubWF4Wm9vbSA/IDAgOiBvcHRpb25zLnRvbGVyYW5jZSAvICh6MiAqIG9wdGlvbnMuZXh0ZW50KTtcblxuICAgICAgICBpZiAoIXRpbGUpIHtcbiAgICAgICAgICAgIGlmIChkZWJ1ZyA+IDEpIGNvbnNvbGUudGltZSgnY3JlYXRpb24nKTtcblxuICAgICAgICAgICAgdGlsZSA9IHRoaXMudGlsZXNbaWRdID0gY3JlYXRlVGlsZShmZWF0dXJlcywgejIsIHgsIHksIHRpbGVUb2xlcmFuY2UsIHogPT09IG9wdGlvbnMubWF4Wm9vbSk7XG4gICAgICAgICAgICB0aGlzLnRpbGVDb29yZHMucHVzaCh7ejogeiwgeDogeCwgeTogeX0pO1xuXG4gICAgICAgICAgICBpZiAoZGVidWcpIHtcbiAgICAgICAgICAgICAgICBpZiAoZGVidWcgPiAxKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCd0aWxlIHolZC0lZC0lZCAoZmVhdHVyZXM6ICVkLCBwb2ludHM6ICVkLCBzaW1wbGlmaWVkOiAlZCknLFxuICAgICAgICAgICAgICAgICAgICAgICAgeiwgeCwgeSwgdGlsZS5udW1GZWF0dXJlcywgdGlsZS5udW1Qb2ludHMsIHRpbGUubnVtU2ltcGxpZmllZCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUudGltZUVuZCgnY3JlYXRpb24nKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdmFyIGtleSA9ICd6JyArIHo7XG4gICAgICAgICAgICAgICAgdGhpcy5zdGF0c1trZXldID0gKHRoaXMuc3RhdHNba2V5XSB8fCAwKSArIDE7XG4gICAgICAgICAgICAgICAgdGhpcy50b3RhbCsrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gc2F2ZSByZWZlcmVuY2UgdG8gb3JpZ2luYWwgZ2VvbWV0cnkgaW4gdGlsZSBzbyB0aGF0IHdlIGNhbiBkcmlsbCBkb3duIGxhdGVyIGlmIHdlIHN0b3Agbm93XG4gICAgICAgIHRpbGUuc291cmNlID0gZmVhdHVyZXM7XG5cbiAgICAgICAgLy8gc3RvcCB0aWxpbmcgaWYgdGhlIHRpbGUgaXMgc29saWQgY2xpcHBlZCBzcXVhcmVcbiAgICAgICAgaWYgKCFvcHRpb25zLnNvbGlkQ2hpbGRyZW4gJiYgaXNDbGlwcGVkU3F1YXJlKHRpbGUsIG9wdGlvbnMuZXh0ZW50LCBvcHRpb25zLmJ1ZmZlcikpIGNvbnRpbnVlO1xuXG4gICAgICAgIC8vIGlmIGl0J3MgdGhlIGZpcnN0LXBhc3MgdGlsaW5nXG4gICAgICAgIGlmICghY3opIHtcbiAgICAgICAgICAgIC8vIHN0b3AgdGlsaW5nIGlmIHdlIHJlYWNoZWQgbWF4IHpvb20sIG9yIGlmIHRoZSB0aWxlIGlzIHRvbyBzaW1wbGVcbiAgICAgICAgICAgIGlmICh6ID09PSBvcHRpb25zLmluZGV4TWF4Wm9vbSB8fCB0aWxlLm51bVBvaW50cyA8PSBvcHRpb25zLmluZGV4TWF4UG9pbnRzKSBjb250aW51ZTtcblxuICAgICAgICAvLyBpZiBhIGRyaWxsZG93biB0byBhIHNwZWNpZmljIHRpbGVcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIHN0b3AgdGlsaW5nIGlmIHdlIHJlYWNoZWQgYmFzZSB6b29tIG9yIG91ciB0YXJnZXQgdGlsZSB6b29tXG4gICAgICAgICAgICBpZiAoeiA9PT0gb3B0aW9ucy5tYXhab29tIHx8IHogPT09IGN6KSBjb250aW51ZTtcblxuICAgICAgICAgICAgLy8gc3RvcCB0aWxpbmcgaWYgaXQncyBub3QgYW4gYW5jZXN0b3Igb2YgdGhlIHRhcmdldCB0aWxlXG4gICAgICAgICAgICB2YXIgbSA9IDEgPDwgKGN6IC0geik7XG4gICAgICAgICAgICBpZiAoeCAhPT0gTWF0aC5mbG9vcihjeCAvIG0pIHx8IHkgIT09IE1hdGguZmxvb3IoY3kgLyBtKSkgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBpZiB3ZSBzbGljZSBmdXJ0aGVyIGRvd24sIG5vIG5lZWQgdG8ga2VlcCBzb3VyY2UgZ2VvbWV0cnlcbiAgICAgICAgdGlsZS5zb3VyY2UgPSBudWxsO1xuXG4gICAgICAgIGlmIChkZWJ1ZyA+IDEpIGNvbnNvbGUudGltZSgnY2xpcHBpbmcnKTtcblxuICAgICAgICAvLyB2YWx1ZXMgd2UnbGwgdXNlIGZvciBjbGlwcGluZ1xuICAgICAgICB2YXIgazEgPSAwLjUgKiBvcHRpb25zLmJ1ZmZlciAvIG9wdGlvbnMuZXh0ZW50LFxuICAgICAgICAgICAgazIgPSAwLjUgLSBrMSxcbiAgICAgICAgICAgIGszID0gMC41ICsgazEsXG4gICAgICAgICAgICBrNCA9IDEgKyBrMSxcbiAgICAgICAgICAgIHRsLCBibCwgdHIsIGJyLCBsZWZ0LCByaWdodDtcblxuICAgICAgICB0bCA9IGJsID0gdHIgPSBiciA9IG51bGw7XG5cbiAgICAgICAgbGVmdCAgPSBjbGlwKGZlYXR1cmVzLCB6MiwgeCAtIGsxLCB4ICsgazMsIDAsIGludGVyc2VjdFgsIHRpbGUubWluWzBdLCB0aWxlLm1heFswXSk7XG4gICAgICAgIHJpZ2h0ID0gY2xpcChmZWF0dXJlcywgejIsIHggKyBrMiwgeCArIGs0LCAwLCBpbnRlcnNlY3RYLCB0aWxlLm1pblswXSwgdGlsZS5tYXhbMF0pO1xuXG4gICAgICAgIGlmIChsZWZ0KSB7XG4gICAgICAgICAgICB0bCA9IGNsaXAobGVmdCwgejIsIHkgLSBrMSwgeSArIGszLCAxLCBpbnRlcnNlY3RZLCB0aWxlLm1pblsxXSwgdGlsZS5tYXhbMV0pO1xuICAgICAgICAgICAgYmwgPSBjbGlwKGxlZnQsIHoyLCB5ICsgazIsIHkgKyBrNCwgMSwgaW50ZXJzZWN0WSwgdGlsZS5taW5bMV0sIHRpbGUubWF4WzFdKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChyaWdodCkge1xuICAgICAgICAgICAgdHIgPSBjbGlwKHJpZ2h0LCB6MiwgeSAtIGsxLCB5ICsgazMsIDEsIGludGVyc2VjdFksIHRpbGUubWluWzFdLCB0aWxlLm1heFsxXSk7XG4gICAgICAgICAgICBiciA9IGNsaXAocmlnaHQsIHoyLCB5ICsgazIsIHkgKyBrNCwgMSwgaW50ZXJzZWN0WSwgdGlsZS5taW5bMV0sIHRpbGUubWF4WzFdKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChkZWJ1ZyA+IDEpIGNvbnNvbGUudGltZUVuZCgnY2xpcHBpbmcnKTtcblxuICAgICAgICBpZiAodGwpIHN0YWNrLnB1c2godGwsIHogKyAxLCB4ICogMiwgICAgIHkgKiAyKTtcbiAgICAgICAgaWYgKGJsKSBzdGFjay5wdXNoKGJsLCB6ICsgMSwgeCAqIDIsICAgICB5ICogMiArIDEpO1xuICAgICAgICBpZiAodHIpIHN0YWNrLnB1c2godHIsIHogKyAxLCB4ICogMiArIDEsIHkgKiAyKTtcbiAgICAgICAgaWYgKGJyKSBzdGFjay5wdXNoKGJyLCB6ICsgMSwgeCAqIDIgKyAxLCB5ICogMiArIDEpO1xuICAgIH1cbn07XG5cbkdlb0pTT05WVC5wcm90b3R5cGUuZ2V0VGlsZSA9IGZ1bmN0aW9uICh6LCB4LCB5KSB7XG4gICAgdmFyIG9wdGlvbnMgPSB0aGlzLm9wdGlvbnMsXG4gICAgICAgIGV4dGVudCA9IG9wdGlvbnMuZXh0ZW50LFxuICAgICAgICBkZWJ1ZyA9IG9wdGlvbnMuZGVidWc7XG5cbiAgICB2YXIgejIgPSAxIDw8IHo7XG4gICAgeCA9ICgoeCAlIHoyKSArIHoyKSAlIHoyOyAvLyB3cmFwIHRpbGUgeCBjb29yZGluYXRlXG5cbiAgICB2YXIgaWQgPSB0b0lEKHosIHgsIHkpO1xuICAgIGlmICh0aGlzLnRpbGVzW2lkXSkgcmV0dXJuIHRyYW5zZm9ybVRpbGUodGhpcy50aWxlc1tpZF0sIGV4dGVudCk7XG5cbiAgICBpZiAoZGVidWcgPiAxKSBjb25zb2xlLmxvZygnZHJpbGxpbmcgZG93biB0byB6JWQtJWQtJWQnLCB6LCB4LCB5KTtcblxuICAgIHZhciB6MCA9IHosXG4gICAgICAgIHgwID0geCxcbiAgICAgICAgeTAgPSB5LFxuICAgICAgICBwYXJlbnQ7XG5cbiAgICB3aGlsZSAoIXBhcmVudCAmJiB6MCA+IDApIHtcbiAgICAgICAgejAtLTtcbiAgICAgICAgeDAgPSBNYXRoLmZsb29yKHgwIC8gMik7XG4gICAgICAgIHkwID0gTWF0aC5mbG9vcih5MCAvIDIpO1xuICAgICAgICBwYXJlbnQgPSB0aGlzLnRpbGVzW3RvSUQoejAsIHgwLCB5MCldO1xuICAgIH1cblxuICAgIGlmICghcGFyZW50KSByZXR1cm4gbnVsbDtcblxuICAgIGlmIChkZWJ1ZyA+IDEpIGNvbnNvbGUubG9nKCdmb3VuZCBwYXJlbnQgdGlsZSB6JWQtJWQtJWQnLCB6MCwgeDAsIHkwKTtcblxuICAgIC8vIGlmIHdlIGZvdW5kIGEgcGFyZW50IHRpbGUgY29udGFpbmluZyB0aGUgb3JpZ2luYWwgZ2VvbWV0cnksIHdlIGNhbiBkcmlsbCBkb3duIGZyb20gaXRcbiAgICBpZiAocGFyZW50LnNvdXJjZSkge1xuICAgICAgICBpZiAoaXNDbGlwcGVkU3F1YXJlKHBhcmVudCwgZXh0ZW50LCBvcHRpb25zLmJ1ZmZlcikpIHJldHVybiB0cmFuc2Zvcm1UaWxlKHBhcmVudCwgZXh0ZW50KTtcblxuICAgICAgICBpZiAoZGVidWcgPiAxKSBjb25zb2xlLnRpbWUoJ2RyaWxsaW5nIGRvd24nKTtcbiAgICAgICAgdGhpcy5zcGxpdFRpbGUocGFyZW50LnNvdXJjZSwgejAsIHgwLCB5MCwgeiwgeCwgeSk7XG4gICAgICAgIGlmIChkZWJ1ZyA+IDEpIGNvbnNvbGUudGltZUVuZCgnZHJpbGxpbmcgZG93bicpO1xuICAgIH1cblxuICAgIGlmICghdGhpcy50aWxlc1tpZF0pIHJldHVybiBudWxsO1xuXG4gICAgcmV0dXJuIHRyYW5zZm9ybVRpbGUodGhpcy50aWxlc1tpZF0sIGV4dGVudCk7XG59O1xuXG5mdW5jdGlvbiB0cmFuc2Zvcm1UaWxlKHRpbGUsIGV4dGVudCkge1xuICAgIGlmICh0aWxlLnRyYW5zZm9ybWVkKSByZXR1cm4gdGlsZTtcblxuICAgIHZhciB6MiA9IHRpbGUuejIsXG4gICAgICAgIHR4ID0gdGlsZS54LFxuICAgICAgICB0eSA9IHRpbGUueSxcbiAgICAgICAgaSwgaiwgaztcblxuICAgIGZvciAoaSA9IDA7IGkgPCB0aWxlLmZlYXR1cmVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciBmZWF0dXJlID0gdGlsZS5mZWF0dXJlc1tpXSxcbiAgICAgICAgICAgIGdlb20gPSBmZWF0dXJlLmdlb21ldHJ5LFxuICAgICAgICAgICAgdHlwZSA9IGZlYXR1cmUudHlwZTtcblxuICAgICAgICBpZiAodHlwZSA9PT0gMSkge1xuICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IGdlb20ubGVuZ3RoOyBqKyspIGdlb21bal0gPSB0cmFuc2Zvcm1Qb2ludChnZW9tW2pdLCBleHRlbnQsIHoyLCB0eCwgdHkpO1xuXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgZ2VvbS5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgICAgIHZhciByaW5nID0gZ2VvbVtqXTtcbiAgICAgICAgICAgICAgICBmb3IgKGsgPSAwOyBrIDwgcmluZy5sZW5ndGg7IGsrKykgcmluZ1trXSA9IHRyYW5zZm9ybVBvaW50KHJpbmdba10sIGV4dGVudCwgejIsIHR4LCB0eSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICB0aWxlLnRyYW5zZm9ybWVkID0gdHJ1ZTtcblxuICAgIHJldHVybiB0aWxlO1xufVxuXG5mdW5jdGlvbiB0cmFuc2Zvcm1Qb2ludChwLCBleHRlbnQsIHoyLCB0eCwgdHkpIHtcbiAgICB2YXIgeCA9IE1hdGgucm91bmQoZXh0ZW50ICogKHBbMF0gKiB6MiAtIHR4KSksXG4gICAgICAgIHkgPSBNYXRoLnJvdW5kKGV4dGVudCAqIChwWzFdICogejIgLSB0eSkpO1xuICAgIHJldHVybiBbeCwgeV07XG59XG5cbmZ1bmN0aW9uIHRvSUQoeiwgeCwgeSkge1xuICAgIHJldHVybiAoKCgxIDw8IHopICogeSArIHgpICogMzIpICsgejtcbn1cblxuZnVuY3Rpb24gaW50ZXJzZWN0WChhLCBiLCB4KSB7XG4gICAgcmV0dXJuIFt4LCAoeCAtIGFbMF0pICogKGJbMV0gLSBhWzFdKSAvIChiWzBdIC0gYVswXSkgKyBhWzFdLCAxXTtcbn1cbmZ1bmN0aW9uIGludGVyc2VjdFkoYSwgYiwgeSkge1xuICAgIHJldHVybiBbKHkgLSBhWzFdKSAqIChiWzBdIC0gYVswXSkgLyAoYlsxXSAtIGFbMV0pICsgYVswXSwgeSwgMV07XG59XG5cbmZ1bmN0aW9uIGV4dGVuZChkZXN0LCBzcmMpIHtcbiAgICBmb3IgKHZhciBpIGluIHNyYykgZGVzdFtpXSA9IHNyY1tpXTtcbiAgICByZXR1cm4gZGVzdDtcbn1cblxuLy8gY2hlY2tzIHdoZXRoZXIgYSB0aWxlIGlzIGEgd2hvbGUtYXJlYSBmaWxsIGFmdGVyIGNsaXBwaW5nOyBpZiBpdCBpcywgdGhlcmUncyBubyBzZW5zZSBzbGljaW5nIGl0IGZ1cnRoZXJcbmZ1bmN0aW9uIGlzQ2xpcHBlZFNxdWFyZSh0aWxlLCBleHRlbnQsIGJ1ZmZlcikge1xuXG4gICAgdmFyIGZlYXR1cmVzID0gdGlsZS5zb3VyY2U7XG4gICAgaWYgKGZlYXR1cmVzLmxlbmd0aCAhPT0gMSkgcmV0dXJuIGZhbHNlO1xuXG4gICAgdmFyIGZlYXR1cmUgPSBmZWF0dXJlc1swXTtcbiAgICBpZiAoZmVhdHVyZS50eXBlICE9PSAzIHx8IGZlYXR1cmUuZ2VvbWV0cnkubGVuZ3RoID4gMSkgcmV0dXJuIGZhbHNlO1xuXG4gICAgdmFyIGxlbiA9IGZlYXR1cmUuZ2VvbWV0cnlbMF0ubGVuZ3RoO1xuICAgIGlmIChsZW4gIT09IDUpIHJldHVybiBmYWxzZTtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgdmFyIHAgPSB0cmFuc2Zvcm1Qb2ludChmZWF0dXJlLmdlb21ldHJ5WzBdW2ldLCBleHRlbnQsIHRpbGUuejIsIHRpbGUueCwgdGlsZS55KTtcbiAgICAgICAgaWYgKChwWzBdICE9PSAtYnVmZmVyICYmIHBbMF0gIT09IGV4dGVudCArIGJ1ZmZlcikgfHxcbiAgICAgICAgICAgIChwWzFdICE9PSAtYnVmZmVyICYmIHBbMV0gIT09IGV4dGVudCArIGJ1ZmZlcikpIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICByZXR1cm4gdHJ1ZTtcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxubW9kdWxlLmV4cG9ydHMgPSBzaW1wbGlmeTtcblxuLy8gY2FsY3VsYXRlIHNpbXBsaWZpY2F0aW9uIGRhdGEgdXNpbmcgb3B0aW1pemVkIERvdWdsYXMtUGV1Y2tlciBhbGdvcml0aG1cblxuZnVuY3Rpb24gc2ltcGxpZnkocG9pbnRzLCB0b2xlcmFuY2UpIHtcblxuICAgIHZhciBzcVRvbGVyYW5jZSA9IHRvbGVyYW5jZSAqIHRvbGVyYW5jZSxcbiAgICAgICAgbGVuID0gcG9pbnRzLmxlbmd0aCxcbiAgICAgICAgZmlyc3QgPSAwLFxuICAgICAgICBsYXN0ID0gbGVuIC0gMSxcbiAgICAgICAgc3RhY2sgPSBbXSxcbiAgICAgICAgaSwgbWF4U3FEaXN0LCBzcURpc3QsIGluZGV4O1xuXG4gICAgLy8gYWx3YXlzIHJldGFpbiB0aGUgZW5kcG9pbnRzICgxIGlzIHRoZSBtYXggdmFsdWUpXG4gICAgcG9pbnRzW2ZpcnN0XVsyXSA9IDE7XG4gICAgcG9pbnRzW2xhc3RdWzJdID0gMTtcblxuICAgIC8vIGF2b2lkIHJlY3Vyc2lvbiBieSB1c2luZyBhIHN0YWNrXG4gICAgd2hpbGUgKGxhc3QpIHtcblxuICAgICAgICBtYXhTcURpc3QgPSAwO1xuXG4gICAgICAgIGZvciAoaSA9IGZpcnN0ICsgMTsgaSA8IGxhc3Q7IGkrKykge1xuICAgICAgICAgICAgc3FEaXN0ID0gZ2V0U3FTZWdEaXN0KHBvaW50c1tpXSwgcG9pbnRzW2ZpcnN0XSwgcG9pbnRzW2xhc3RdKTtcblxuICAgICAgICAgICAgaWYgKHNxRGlzdCA+IG1heFNxRGlzdCkge1xuICAgICAgICAgICAgICAgIGluZGV4ID0gaTtcbiAgICAgICAgICAgICAgICBtYXhTcURpc3QgPSBzcURpc3Q7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAobWF4U3FEaXN0ID4gc3FUb2xlcmFuY2UpIHtcbiAgICAgICAgICAgIHBvaW50c1tpbmRleF1bMl0gPSBtYXhTcURpc3Q7IC8vIHNhdmUgdGhlIHBvaW50IGltcG9ydGFuY2UgaW4gc3F1YXJlZCBwaXhlbHMgYXMgYSB6IGNvb3JkaW5hdGVcbiAgICAgICAgICAgIHN0YWNrLnB1c2goZmlyc3QpO1xuICAgICAgICAgICAgc3RhY2sucHVzaChpbmRleCk7XG4gICAgICAgICAgICBmaXJzdCA9IGluZGV4O1xuXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBsYXN0ID0gc3RhY2sucG9wKCk7XG4gICAgICAgICAgICBmaXJzdCA9IHN0YWNrLnBvcCgpO1xuICAgICAgICB9XG4gICAgfVxufVxuXG4vLyBzcXVhcmUgZGlzdGFuY2UgZnJvbSBhIHBvaW50IHRvIGEgc2VnbWVudFxuZnVuY3Rpb24gZ2V0U3FTZWdEaXN0KHAsIGEsIGIpIHtcblxuICAgIHZhciB4ID0gYVswXSwgeSA9IGFbMV0sXG4gICAgICAgIGJ4ID0gYlswXSwgYnkgPSBiWzFdLFxuICAgICAgICBweCA9IHBbMF0sIHB5ID0gcFsxXSxcbiAgICAgICAgZHggPSBieCAtIHgsXG4gICAgICAgIGR5ID0gYnkgLSB5O1xuXG4gICAgaWYgKGR4ICE9PSAwIHx8IGR5ICE9PSAwKSB7XG5cbiAgICAgICAgdmFyIHQgPSAoKHB4IC0geCkgKiBkeCArIChweSAtIHkpICogZHkpIC8gKGR4ICogZHggKyBkeSAqIGR5KTtcblxuICAgICAgICBpZiAodCA+IDEpIHtcbiAgICAgICAgICAgIHggPSBieDtcbiAgICAgICAgICAgIHkgPSBieTtcblxuICAgICAgICB9IGVsc2UgaWYgKHQgPiAwKSB7XG4gICAgICAgICAgICB4ICs9IGR4ICogdDtcbiAgICAgICAgICAgIHkgKz0gZHkgKiB0O1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZHggPSBweCAtIHg7XG4gICAgZHkgPSBweSAtIHk7XG5cbiAgICByZXR1cm4gZHggKiBkeCArIGR5ICogZHk7XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbm1vZHVsZS5leHBvcnRzID0gY3JlYXRlVGlsZTtcblxuZnVuY3Rpb24gY3JlYXRlVGlsZShmZWF0dXJlcywgejIsIHR4LCB0eSwgdG9sZXJhbmNlLCBub1NpbXBsaWZ5KSB7XG4gICAgdmFyIHRpbGUgPSB7XG4gICAgICAgIGZlYXR1cmVzOiBbXSxcbiAgICAgICAgbnVtUG9pbnRzOiAwLFxuICAgICAgICBudW1TaW1wbGlmaWVkOiAwLFxuICAgICAgICBudW1GZWF0dXJlczogMCxcbiAgICAgICAgc291cmNlOiBudWxsLFxuICAgICAgICB4OiB0eCxcbiAgICAgICAgeTogdHksXG4gICAgICAgIHoyOiB6MixcbiAgICAgICAgdHJhbnNmb3JtZWQ6IGZhbHNlLFxuICAgICAgICBtaW46IFsyLCAxXSxcbiAgICAgICAgbWF4OiBbLTEsIDBdXG4gICAgfTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGZlYXR1cmVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHRpbGUubnVtRmVhdHVyZXMrKztcbiAgICAgICAgYWRkRmVhdHVyZSh0aWxlLCBmZWF0dXJlc1tpXSwgdG9sZXJhbmNlLCBub1NpbXBsaWZ5KTtcblxuICAgICAgICB2YXIgbWluID0gZmVhdHVyZXNbaV0ubWluLFxuICAgICAgICAgICAgbWF4ID0gZmVhdHVyZXNbaV0ubWF4O1xuXG4gICAgICAgIGlmIChtaW5bMF0gPCB0aWxlLm1pblswXSkgdGlsZS5taW5bMF0gPSBtaW5bMF07XG4gICAgICAgIGlmIChtaW5bMV0gPCB0aWxlLm1pblsxXSkgdGlsZS5taW5bMV0gPSBtaW5bMV07XG4gICAgICAgIGlmIChtYXhbMF0gPiB0aWxlLm1heFswXSkgdGlsZS5tYXhbMF0gPSBtYXhbMF07XG4gICAgICAgIGlmIChtYXhbMV0gPiB0aWxlLm1heFsxXSkgdGlsZS5tYXhbMV0gPSBtYXhbMV07XG4gICAgfVxuICAgIHJldHVybiB0aWxlO1xufVxuXG5mdW5jdGlvbiBhZGRGZWF0dXJlKHRpbGUsIGZlYXR1cmUsIHRvbGVyYW5jZSwgbm9TaW1wbGlmeSkge1xuXG4gICAgdmFyIGdlb20gPSBmZWF0dXJlLmdlb21ldHJ5LFxuICAgICAgICB0eXBlID0gZmVhdHVyZS50eXBlLFxuICAgICAgICBzaW1wbGlmaWVkID0gW10sXG4gICAgICAgIHNxVG9sZXJhbmNlID0gdG9sZXJhbmNlICogdG9sZXJhbmNlLFxuICAgICAgICBpLCBqLCByaW5nLCBwO1xuXG4gICAgaWYgKHR5cGUgPT09IDEpIHtcbiAgICAgICAgZm9yIChpID0gMDsgaSA8IGdlb20ubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHNpbXBsaWZpZWQucHVzaChnZW9tW2ldKTtcbiAgICAgICAgICAgIHRpbGUubnVtUG9pbnRzKys7XG4gICAgICAgICAgICB0aWxlLm51bVNpbXBsaWZpZWQrKztcbiAgICAgICAgfVxuXG4gICAgfSBlbHNlIHtcblxuICAgICAgICAvLyBzaW1wbGlmeSBhbmQgdHJhbnNmb3JtIHByb2plY3RlZCBjb29yZGluYXRlcyBmb3IgdGlsZSBnZW9tZXRyeVxuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgZ2VvbS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgcmluZyA9IGdlb21baV07XG5cbiAgICAgICAgICAgIC8vIGZpbHRlciBvdXQgdGlueSBwb2x5bGluZXMgJiBwb2x5Z29uc1xuICAgICAgICAgICAgaWYgKCFub1NpbXBsaWZ5ICYmICgodHlwZSA9PT0gMiAmJiByaW5nLmRpc3QgPCB0b2xlcmFuY2UpIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0eXBlID09PSAzICYmIHJpbmcuYXJlYSA8IHNxVG9sZXJhbmNlKSkpIHtcbiAgICAgICAgICAgICAgICB0aWxlLm51bVBvaW50cyArPSByaW5nLmxlbmd0aDtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdmFyIHNpbXBsaWZpZWRSaW5nID0gW107XG5cbiAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCByaW5nLmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICAgICAgcCA9IHJpbmdbal07XG4gICAgICAgICAgICAgICAgLy8ga2VlcCBwb2ludHMgd2l0aCBpbXBvcnRhbmNlID4gdG9sZXJhbmNlXG4gICAgICAgICAgICAgICAgaWYgKG5vU2ltcGxpZnkgfHwgcFsyXSA+IHNxVG9sZXJhbmNlKSB7XG4gICAgICAgICAgICAgICAgICAgIHNpbXBsaWZpZWRSaW5nLnB1c2gocCk7XG4gICAgICAgICAgICAgICAgICAgIHRpbGUubnVtU2ltcGxpZmllZCsrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aWxlLm51bVBvaW50cysrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBzaW1wbGlmaWVkLnB1c2goc2ltcGxpZmllZFJpbmcpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHNpbXBsaWZpZWQubGVuZ3RoKSB7XG4gICAgICAgIHRpbGUuZmVhdHVyZXMucHVzaCh7XG4gICAgICAgICAgICBnZW9tZXRyeTogc2ltcGxpZmllZCxcbiAgICAgICAgICAgIHR5cGU6IHR5cGUsXG4gICAgICAgICAgICB0YWdzOiBmZWF0dXJlLnRhZ3MgfHwgbnVsbFxuICAgICAgICB9KTtcbiAgICB9XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBjbGlwID0gcmVxdWlyZSgnLi9jbGlwJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gd3JhcDtcblxuZnVuY3Rpb24gd3JhcChmZWF0dXJlcywgYnVmZmVyLCBpbnRlcnNlY3RYKSB7XG4gICAgdmFyIG1lcmdlZCA9IGZlYXR1cmVzLFxuICAgICAgICBsZWZ0ICA9IGNsaXAoZmVhdHVyZXMsIDEsIC0xIC0gYnVmZmVyLCBidWZmZXIsICAgICAwLCBpbnRlcnNlY3RYLCAtMSwgMiksIC8vIGxlZnQgd29ybGQgY29weVxuICAgICAgICByaWdodCA9IGNsaXAoZmVhdHVyZXMsIDEsICAxIC0gYnVmZmVyLCAyICsgYnVmZmVyLCAwLCBpbnRlcnNlY3RYLCAtMSwgMik7IC8vIHJpZ2h0IHdvcmxkIGNvcHlcblxuICAgIGlmIChsZWZ0IHx8IHJpZ2h0KSB7XG4gICAgICAgIG1lcmdlZCA9IGNsaXAoZmVhdHVyZXMsIDEsIC1idWZmZXIsIDEgKyBidWZmZXIsIDAsIGludGVyc2VjdFgsIC0xLCAyKTsgLy8gY2VudGVyIHdvcmxkIGNvcHlcblxuICAgICAgICBpZiAobGVmdCkgbWVyZ2VkID0gc2hpZnRGZWF0dXJlQ29vcmRzKGxlZnQsIDEpLmNvbmNhdChtZXJnZWQpOyAvLyBtZXJnZSBsZWZ0IGludG8gY2VudGVyXG4gICAgICAgIGlmIChyaWdodCkgbWVyZ2VkID0gbWVyZ2VkLmNvbmNhdChzaGlmdEZlYXR1cmVDb29yZHMocmlnaHQsIC0xKSk7IC8vIG1lcmdlIHJpZ2h0IGludG8gY2VudGVyXG4gICAgfVxuXG4gICAgcmV0dXJuIG1lcmdlZDtcbn1cblxuZnVuY3Rpb24gc2hpZnRGZWF0dXJlQ29vcmRzKGZlYXR1cmVzLCBvZmZzZXQpIHtcbiAgICB2YXIgbmV3RmVhdHVyZXMgPSBbXTtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZmVhdHVyZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIGZlYXR1cmUgPSBmZWF0dXJlc1tpXSxcbiAgICAgICAgICAgIHR5cGUgPSBmZWF0dXJlLnR5cGU7XG5cbiAgICAgICAgdmFyIG5ld0dlb21ldHJ5O1xuXG4gICAgICAgIGlmICh0eXBlID09PSAxKSB7XG4gICAgICAgICAgICBuZXdHZW9tZXRyeSA9IHNoaWZ0Q29vcmRzKGZlYXR1cmUuZ2VvbWV0cnksIG9mZnNldCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBuZXdHZW9tZXRyeSA9IFtdO1xuICAgICAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBmZWF0dXJlLmdlb21ldHJ5Lmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICAgICAgbmV3R2VvbWV0cnkucHVzaChzaGlmdENvb3JkcyhmZWF0dXJlLmdlb21ldHJ5W2pdLCBvZmZzZXQpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIG5ld0ZlYXR1cmVzLnB1c2goe1xuICAgICAgICAgICAgZ2VvbWV0cnk6IG5ld0dlb21ldHJ5LFxuICAgICAgICAgICAgdHlwZTogdHlwZSxcbiAgICAgICAgICAgIHRhZ3M6IGZlYXR1cmUudGFncyxcbiAgICAgICAgICAgIG1pbjogW2ZlYXR1cmUubWluWzBdICsgb2Zmc2V0LCBmZWF0dXJlLm1pblsxXV0sXG4gICAgICAgICAgICBtYXg6IFtmZWF0dXJlLm1heFswXSArIG9mZnNldCwgZmVhdHVyZS5tYXhbMV1dXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiBuZXdGZWF0dXJlcztcbn1cblxuZnVuY3Rpb24gc2hpZnRDb29yZHMocG9pbnRzLCBvZmZzZXQpIHtcbiAgICB2YXIgbmV3UG9pbnRzID0gW107XG4gICAgbmV3UG9pbnRzLmFyZWEgPSBwb2ludHMuYXJlYTtcbiAgICBuZXdQb2ludHMuZGlzdCA9IHBvaW50cy5kaXN0O1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwb2ludHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgbmV3UG9pbnRzLnB1c2goW3BvaW50c1tpXVswXSArIG9mZnNldCwgcG9pbnRzW2ldWzFdLCBwb2ludHNbaV1bMl1dKTtcbiAgICB9XG4gICAgcmV0dXJuIG5ld1BvaW50cztcbn1cbiIsIm1vZHVsZS5leHBvcnRzID0gaW52ZXJ0XG5cbi8qKlxuICogSW52ZXJ0cyBhIG1hdDNcbiAqXG4gKiBAYWxpYXMgbWF0My5pbnZlcnRcbiAqIEBwYXJhbSB7bWF0M30gb3V0IHRoZSByZWNlaXZpbmcgbWF0cml4XG4gKiBAcGFyYW0ge21hdDN9IGEgdGhlIHNvdXJjZSBtYXRyaXhcbiAqIEByZXR1cm5zIHttYXQzfSBvdXRcbiAqL1xuZnVuY3Rpb24gaW52ZXJ0KG91dCwgYSkge1xuICB2YXIgYTAwID0gYVswXSwgYTAxID0gYVsxXSwgYTAyID0gYVsyXVxuICB2YXIgYTEwID0gYVszXSwgYTExID0gYVs0XSwgYTEyID0gYVs1XVxuICB2YXIgYTIwID0gYVs2XSwgYTIxID0gYVs3XSwgYTIyID0gYVs4XVxuXG4gIHZhciBiMDEgPSBhMjIgKiBhMTEgLSBhMTIgKiBhMjFcbiAgdmFyIGIxMSA9IC1hMjIgKiBhMTAgKyBhMTIgKiBhMjBcbiAgdmFyIGIyMSA9IGEyMSAqIGExMCAtIGExMSAqIGEyMFxuXG4gIC8vIENhbGN1bGF0ZSB0aGUgZGV0ZXJtaW5hbnRcbiAgdmFyIGRldCA9IGEwMCAqIGIwMSArIGEwMSAqIGIxMSArIGEwMiAqIGIyMVxuXG4gIGlmICghZGV0KSByZXR1cm4gbnVsbFxuICBkZXQgPSAxLjAgLyBkZXRcblxuICBvdXRbMF0gPSBiMDEgKiBkZXRcbiAgb3V0WzFdID0gKC1hMjIgKiBhMDEgKyBhMDIgKiBhMjEpICogZGV0XG4gIG91dFsyXSA9IChhMTIgKiBhMDEgLSBhMDIgKiBhMTEpICogZGV0XG4gIG91dFszXSA9IGIxMSAqIGRldFxuICBvdXRbNF0gPSAoYTIyICogYTAwIC0gYTAyICogYTIwKSAqIGRldFxuICBvdXRbNV0gPSAoLWExMiAqIGEwMCArIGEwMiAqIGExMCkgKiBkZXRcbiAgb3V0WzZdID0gYjIxICogZGV0XG4gIG91dFs3XSA9ICgtYTIxICogYTAwICsgYTAxICogYTIwKSAqIGRldFxuICBvdXRbOF0gPSAoYTExICogYTAwIC0gYTAxICogYTEwKSAqIGRldFxuXG4gIHJldHVybiBvdXRcbn1cbiIsIm1vZHVsZS5leHBvcnRzID0gbm9ybWFsRnJvbU1hdDRcblxuLyoqXG4qIENhbGN1bGF0ZXMgYSAzeDMgbm9ybWFsIG1hdHJpeCAodHJhbnNwb3NlIGludmVyc2UpIGZyb20gdGhlIDR4NCBtYXRyaXhcbipcbiogQGFsaWFzIG1hdDMubm9ybWFsRnJvbU1hdDRcbiogQHBhcmFtIHttYXQzfSBvdXQgbWF0MyByZWNlaXZpbmcgb3BlcmF0aW9uIHJlc3VsdFxuKiBAcGFyYW0ge21hdDR9IGEgTWF0NCB0byBkZXJpdmUgdGhlIG5vcm1hbCBtYXRyaXggZnJvbVxuKlxuKiBAcmV0dXJucyB7bWF0M30gb3V0XG4qL1xuZnVuY3Rpb24gbm9ybWFsRnJvbU1hdDQob3V0LCBhKSB7XG4gIHZhciBhMDAgPSBhWzBdLCBhMDEgPSBhWzFdLCBhMDIgPSBhWzJdLCBhMDMgPSBhWzNdXG4gIHZhciBhMTAgPSBhWzRdLCBhMTEgPSBhWzVdLCBhMTIgPSBhWzZdLCBhMTMgPSBhWzddXG4gIHZhciBhMjAgPSBhWzhdLCBhMjEgPSBhWzldLCBhMjIgPSBhWzEwXSwgYTIzID0gYVsxMV1cbiAgdmFyIGEzMCA9IGFbMTJdLCBhMzEgPSBhWzEzXSwgYTMyID0gYVsxNF0sIGEzMyA9IGFbMTVdXG5cbiAgdmFyIGIwMCA9IGEwMCAqIGExMSAtIGEwMSAqIGExMFxuICB2YXIgYjAxID0gYTAwICogYTEyIC0gYTAyICogYTEwXG4gIHZhciBiMDIgPSBhMDAgKiBhMTMgLSBhMDMgKiBhMTBcbiAgdmFyIGIwMyA9IGEwMSAqIGExMiAtIGEwMiAqIGExMVxuICB2YXIgYjA0ID0gYTAxICogYTEzIC0gYTAzICogYTExXG4gIHZhciBiMDUgPSBhMDIgKiBhMTMgLSBhMDMgKiBhMTJcbiAgdmFyIGIwNiA9IGEyMCAqIGEzMSAtIGEyMSAqIGEzMFxuICB2YXIgYjA3ID0gYTIwICogYTMyIC0gYTIyICogYTMwXG4gIHZhciBiMDggPSBhMjAgKiBhMzMgLSBhMjMgKiBhMzBcbiAgdmFyIGIwOSA9IGEyMSAqIGEzMiAtIGEyMiAqIGEzMVxuICB2YXIgYjEwID0gYTIxICogYTMzIC0gYTIzICogYTMxXG4gIHZhciBiMTEgPSBhMjIgKiBhMzMgLSBhMjMgKiBhMzJcblxuICAvLyBDYWxjdWxhdGUgdGhlIGRldGVybWluYW50XG4gIHZhciBkZXQgPSBiMDAgKiBiMTFcbiAgICAgICAgICAtIGIwMSAqIGIxMFxuICAgICAgICAgICsgYjAyICogYjA5XG4gICAgICAgICAgKyBiMDMgKiBiMDhcbiAgICAgICAgICAtIGIwNCAqIGIwN1xuICAgICAgICAgICsgYjA1ICogYjA2XG5cbiAgaWYgKCFkZXQpIHJldHVybiBudWxsXG4gIGRldCA9IDEuMCAvIGRldFxuXG4gIG91dFswXSA9IChhMTEgKiBiMTEgLSBhMTIgKiBiMTAgKyBhMTMgKiBiMDkpICogZGV0XG4gIG91dFsxXSA9IChhMTIgKiBiMDggLSBhMTAgKiBiMTEgLSBhMTMgKiBiMDcpICogZGV0XG4gIG91dFsyXSA9IChhMTAgKiBiMTAgLSBhMTEgKiBiMDggKyBhMTMgKiBiMDYpICogZGV0XG5cbiAgb3V0WzNdID0gKGEwMiAqIGIxMCAtIGEwMSAqIGIxMSAtIGEwMyAqIGIwOSkgKiBkZXRcbiAgb3V0WzRdID0gKGEwMCAqIGIxMSAtIGEwMiAqIGIwOCArIGEwMyAqIGIwNykgKiBkZXRcbiAgb3V0WzVdID0gKGEwMSAqIGIwOCAtIGEwMCAqIGIxMCAtIGEwMyAqIGIwNikgKiBkZXRcblxuICBvdXRbNl0gPSAoYTMxICogYjA1IC0gYTMyICogYjA0ICsgYTMzICogYjAzKSAqIGRldFxuICBvdXRbN10gPSAoYTMyICogYjAyIC0gYTMwICogYjA1IC0gYTMzICogYjAxKSAqIGRldFxuICBvdXRbOF0gPSAoYTMwICogYjA0IC0gYTMxICogYjAyICsgYTMzICogYjAwKSAqIGRldFxuXG4gIHJldHVybiBvdXRcbn1cbiIsIm1vZHVsZS5leHBvcnRzID0gY29weTtcblxuLyoqXG4gKiBDb3B5IHRoZSB2YWx1ZXMgZnJvbSBvbmUgbWF0NCB0byBhbm90aGVyXG4gKlxuICogQHBhcmFtIHttYXQ0fSBvdXQgdGhlIHJlY2VpdmluZyBtYXRyaXhcbiAqIEBwYXJhbSB7bWF0NH0gYSB0aGUgc291cmNlIG1hdHJpeFxuICogQHJldHVybnMge21hdDR9IG91dFxuICovXG5mdW5jdGlvbiBjb3B5KG91dCwgYSkge1xuICAgIG91dFswXSA9IGFbMF07XG4gICAgb3V0WzFdID0gYVsxXTtcbiAgICBvdXRbMl0gPSBhWzJdO1xuICAgIG91dFszXSA9IGFbM107XG4gICAgb3V0WzRdID0gYVs0XTtcbiAgICBvdXRbNV0gPSBhWzVdO1xuICAgIG91dFs2XSA9IGFbNl07XG4gICAgb3V0WzddID0gYVs3XTtcbiAgICBvdXRbOF0gPSBhWzhdO1xuICAgIG91dFs5XSA9IGFbOV07XG4gICAgb3V0WzEwXSA9IGFbMTBdO1xuICAgIG91dFsxMV0gPSBhWzExXTtcbiAgICBvdXRbMTJdID0gYVsxMl07XG4gICAgb3V0WzEzXSA9IGFbMTNdO1xuICAgIG91dFsxNF0gPSBhWzE0XTtcbiAgICBvdXRbMTVdID0gYVsxNV07XG4gICAgcmV0dXJuIG91dDtcbn07IiwibW9kdWxlLmV4cG9ydHMgPSBpZGVudGl0eTtcblxuLyoqXG4gKiBTZXQgYSBtYXQ0IHRvIHRoZSBpZGVudGl0eSBtYXRyaXhcbiAqXG4gKiBAcGFyYW0ge21hdDR9IG91dCB0aGUgcmVjZWl2aW5nIG1hdHJpeFxuICogQHJldHVybnMge21hdDR9IG91dFxuICovXG5mdW5jdGlvbiBpZGVudGl0eShvdXQpIHtcbiAgICBvdXRbMF0gPSAxO1xuICAgIG91dFsxXSA9IDA7XG4gICAgb3V0WzJdID0gMDtcbiAgICBvdXRbM10gPSAwO1xuICAgIG91dFs0XSA9IDA7XG4gICAgb3V0WzVdID0gMTtcbiAgICBvdXRbNl0gPSAwO1xuICAgIG91dFs3XSA9IDA7XG4gICAgb3V0WzhdID0gMDtcbiAgICBvdXRbOV0gPSAwO1xuICAgIG91dFsxMF0gPSAxO1xuICAgIG91dFsxMV0gPSAwO1xuICAgIG91dFsxMl0gPSAwO1xuICAgIG91dFsxM10gPSAwO1xuICAgIG91dFsxNF0gPSAwO1xuICAgIG91dFsxNV0gPSAxO1xuICAgIHJldHVybiBvdXQ7XG59OyIsInZhciBpZGVudGl0eSA9IHJlcXVpcmUoJy4vaWRlbnRpdHknKTtcblxubW9kdWxlLmV4cG9ydHMgPSBsb29rQXQ7XG5cbi8qKlxuICogR2VuZXJhdGVzIGEgbG9vay1hdCBtYXRyaXggd2l0aCB0aGUgZ2l2ZW4gZXllIHBvc2l0aW9uLCBmb2NhbCBwb2ludCwgYW5kIHVwIGF4aXNcbiAqXG4gKiBAcGFyYW0ge21hdDR9IG91dCBtYXQ0IGZydXN0dW0gbWF0cml4IHdpbGwgYmUgd3JpdHRlbiBpbnRvXG4gKiBAcGFyYW0ge3ZlYzN9IGV5ZSBQb3NpdGlvbiBvZiB0aGUgdmlld2VyXG4gKiBAcGFyYW0ge3ZlYzN9IGNlbnRlciBQb2ludCB0aGUgdmlld2VyIGlzIGxvb2tpbmcgYXRcbiAqIEBwYXJhbSB7dmVjM30gdXAgdmVjMyBwb2ludGluZyB1cFxuICogQHJldHVybnMge21hdDR9IG91dFxuICovXG5mdW5jdGlvbiBsb29rQXQob3V0LCBleWUsIGNlbnRlciwgdXApIHtcbiAgICB2YXIgeDAsIHgxLCB4MiwgeTAsIHkxLCB5MiwgejAsIHoxLCB6MiwgbGVuLFxuICAgICAgICBleWV4ID0gZXllWzBdLFxuICAgICAgICBleWV5ID0gZXllWzFdLFxuICAgICAgICBleWV6ID0gZXllWzJdLFxuICAgICAgICB1cHggPSB1cFswXSxcbiAgICAgICAgdXB5ID0gdXBbMV0sXG4gICAgICAgIHVweiA9IHVwWzJdLFxuICAgICAgICBjZW50ZXJ4ID0gY2VudGVyWzBdLFxuICAgICAgICBjZW50ZXJ5ID0gY2VudGVyWzFdLFxuICAgICAgICBjZW50ZXJ6ID0gY2VudGVyWzJdO1xuXG4gICAgaWYgKE1hdGguYWJzKGV5ZXggLSBjZW50ZXJ4KSA8IDAuMDAwMDAxICYmXG4gICAgICAgIE1hdGguYWJzKGV5ZXkgLSBjZW50ZXJ5KSA8IDAuMDAwMDAxICYmXG4gICAgICAgIE1hdGguYWJzKGV5ZXogLSBjZW50ZXJ6KSA8IDAuMDAwMDAxKSB7XG4gICAgICAgIHJldHVybiBpZGVudGl0eShvdXQpO1xuICAgIH1cblxuICAgIHowID0gZXlleCAtIGNlbnRlcng7XG4gICAgejEgPSBleWV5IC0gY2VudGVyeTtcbiAgICB6MiA9IGV5ZXogLSBjZW50ZXJ6O1xuXG4gICAgbGVuID0gMSAvIE1hdGguc3FydCh6MCAqIHowICsgejEgKiB6MSArIHoyICogejIpO1xuICAgIHowICo9IGxlbjtcbiAgICB6MSAqPSBsZW47XG4gICAgejIgKj0gbGVuO1xuXG4gICAgeDAgPSB1cHkgKiB6MiAtIHVweiAqIHoxO1xuICAgIHgxID0gdXB6ICogejAgLSB1cHggKiB6MjtcbiAgICB4MiA9IHVweCAqIHoxIC0gdXB5ICogejA7XG4gICAgbGVuID0gTWF0aC5zcXJ0KHgwICogeDAgKyB4MSAqIHgxICsgeDIgKiB4Mik7XG4gICAgaWYgKCFsZW4pIHtcbiAgICAgICAgeDAgPSAwO1xuICAgICAgICB4MSA9IDA7XG4gICAgICAgIHgyID0gMDtcbiAgICB9IGVsc2Uge1xuICAgICAgICBsZW4gPSAxIC8gbGVuO1xuICAgICAgICB4MCAqPSBsZW47XG4gICAgICAgIHgxICo9IGxlbjtcbiAgICAgICAgeDIgKj0gbGVuO1xuICAgIH1cblxuICAgIHkwID0gejEgKiB4MiAtIHoyICogeDE7XG4gICAgeTEgPSB6MiAqIHgwIC0gejAgKiB4MjtcbiAgICB5MiA9IHowICogeDEgLSB6MSAqIHgwO1xuXG4gICAgbGVuID0gTWF0aC5zcXJ0KHkwICogeTAgKyB5MSAqIHkxICsgeTIgKiB5Mik7XG4gICAgaWYgKCFsZW4pIHtcbiAgICAgICAgeTAgPSAwO1xuICAgICAgICB5MSA9IDA7XG4gICAgICAgIHkyID0gMDtcbiAgICB9IGVsc2Uge1xuICAgICAgICBsZW4gPSAxIC8gbGVuO1xuICAgICAgICB5MCAqPSBsZW47XG4gICAgICAgIHkxICo9IGxlbjtcbiAgICAgICAgeTIgKj0gbGVuO1xuICAgIH1cblxuICAgIG91dFswXSA9IHgwO1xuICAgIG91dFsxXSA9IHkwO1xuICAgIG91dFsyXSA9IHowO1xuICAgIG91dFszXSA9IDA7XG4gICAgb3V0WzRdID0geDE7XG4gICAgb3V0WzVdID0geTE7XG4gICAgb3V0WzZdID0gejE7XG4gICAgb3V0WzddID0gMDtcbiAgICBvdXRbOF0gPSB4MjtcbiAgICBvdXRbOV0gPSB5MjtcbiAgICBvdXRbMTBdID0gejI7XG4gICAgb3V0WzExXSA9IDA7XG4gICAgb3V0WzEyXSA9IC0oeDAgKiBleWV4ICsgeDEgKiBleWV5ICsgeDIgKiBleWV6KTtcbiAgICBvdXRbMTNdID0gLSh5MCAqIGV5ZXggKyB5MSAqIGV5ZXkgKyB5MiAqIGV5ZXopO1xuICAgIG91dFsxNF0gPSAtKHowICogZXlleCArIHoxICogZXlleSArIHoyICogZXlleik7XG4gICAgb3V0WzE1XSA9IDE7XG5cbiAgICByZXR1cm4gb3V0O1xufTsiLCJtb2R1bGUuZXhwb3J0cyA9IG11bHRpcGx5O1xuXG4vKipcbiAqIE11bHRpcGxpZXMgdHdvIG1hdDQnc1xuICpcbiAqIEBwYXJhbSB7bWF0NH0gb3V0IHRoZSByZWNlaXZpbmcgbWF0cml4XG4gKiBAcGFyYW0ge21hdDR9IGEgdGhlIGZpcnN0IG9wZXJhbmRcbiAqIEBwYXJhbSB7bWF0NH0gYiB0aGUgc2Vjb25kIG9wZXJhbmRcbiAqIEByZXR1cm5zIHttYXQ0fSBvdXRcbiAqL1xuZnVuY3Rpb24gbXVsdGlwbHkob3V0LCBhLCBiKSB7XG4gICAgdmFyIGEwMCA9IGFbMF0sIGEwMSA9IGFbMV0sIGEwMiA9IGFbMl0sIGEwMyA9IGFbM10sXG4gICAgICAgIGExMCA9IGFbNF0sIGExMSA9IGFbNV0sIGExMiA9IGFbNl0sIGExMyA9IGFbN10sXG4gICAgICAgIGEyMCA9IGFbOF0sIGEyMSA9IGFbOV0sIGEyMiA9IGFbMTBdLCBhMjMgPSBhWzExXSxcbiAgICAgICAgYTMwID0gYVsxMl0sIGEzMSA9IGFbMTNdLCBhMzIgPSBhWzE0XSwgYTMzID0gYVsxNV07XG5cbiAgICAvLyBDYWNoZSBvbmx5IHRoZSBjdXJyZW50IGxpbmUgb2YgdGhlIHNlY29uZCBtYXRyaXhcbiAgICB2YXIgYjAgID0gYlswXSwgYjEgPSBiWzFdLCBiMiA9IGJbMl0sIGIzID0gYlszXTsgIFxuICAgIG91dFswXSA9IGIwKmEwMCArIGIxKmExMCArIGIyKmEyMCArIGIzKmEzMDtcbiAgICBvdXRbMV0gPSBiMCphMDEgKyBiMSphMTEgKyBiMiphMjEgKyBiMyphMzE7XG4gICAgb3V0WzJdID0gYjAqYTAyICsgYjEqYTEyICsgYjIqYTIyICsgYjMqYTMyO1xuICAgIG91dFszXSA9IGIwKmEwMyArIGIxKmExMyArIGIyKmEyMyArIGIzKmEzMztcblxuICAgIGIwID0gYls0XTsgYjEgPSBiWzVdOyBiMiA9IGJbNl07IGIzID0gYls3XTtcbiAgICBvdXRbNF0gPSBiMCphMDAgKyBiMSphMTAgKyBiMiphMjAgKyBiMyphMzA7XG4gICAgb3V0WzVdID0gYjAqYTAxICsgYjEqYTExICsgYjIqYTIxICsgYjMqYTMxO1xuICAgIG91dFs2XSA9IGIwKmEwMiArIGIxKmExMiArIGIyKmEyMiArIGIzKmEzMjtcbiAgICBvdXRbN10gPSBiMCphMDMgKyBiMSphMTMgKyBiMiphMjMgKyBiMyphMzM7XG5cbiAgICBiMCA9IGJbOF07IGIxID0gYls5XTsgYjIgPSBiWzEwXTsgYjMgPSBiWzExXTtcbiAgICBvdXRbOF0gPSBiMCphMDAgKyBiMSphMTAgKyBiMiphMjAgKyBiMyphMzA7XG4gICAgb3V0WzldID0gYjAqYTAxICsgYjEqYTExICsgYjIqYTIxICsgYjMqYTMxO1xuICAgIG91dFsxMF0gPSBiMCphMDIgKyBiMSphMTIgKyBiMiphMjIgKyBiMyphMzI7XG4gICAgb3V0WzExXSA9IGIwKmEwMyArIGIxKmExMyArIGIyKmEyMyArIGIzKmEzMztcblxuICAgIGIwID0gYlsxMl07IGIxID0gYlsxM107IGIyID0gYlsxNF07IGIzID0gYlsxNV07XG4gICAgb3V0WzEyXSA9IGIwKmEwMCArIGIxKmExMCArIGIyKmEyMCArIGIzKmEzMDtcbiAgICBvdXRbMTNdID0gYjAqYTAxICsgYjEqYTExICsgYjIqYTIxICsgYjMqYTMxO1xuICAgIG91dFsxNF0gPSBiMCphMDIgKyBiMSphMTIgKyBiMiphMjIgKyBiMyphMzI7XG4gICAgb3V0WzE1XSA9IGIwKmEwMyArIGIxKmExMyArIGIyKmEyMyArIGIzKmEzMztcbiAgICByZXR1cm4gb3V0O1xufTsiLCJtb2R1bGUuZXhwb3J0cyA9IHBlcnNwZWN0aXZlO1xuXG4vKipcbiAqIEdlbmVyYXRlcyBhIHBlcnNwZWN0aXZlIHByb2plY3Rpb24gbWF0cml4IHdpdGggdGhlIGdpdmVuIGJvdW5kc1xuICpcbiAqIEBwYXJhbSB7bWF0NH0gb3V0IG1hdDQgZnJ1c3R1bSBtYXRyaXggd2lsbCBiZSB3cml0dGVuIGludG9cbiAqIEBwYXJhbSB7bnVtYmVyfSBmb3Z5IFZlcnRpY2FsIGZpZWxkIG9mIHZpZXcgaW4gcmFkaWFuc1xuICogQHBhcmFtIHtudW1iZXJ9IGFzcGVjdCBBc3BlY3QgcmF0aW8uIHR5cGljYWxseSB2aWV3cG9ydCB3aWR0aC9oZWlnaHRcbiAqIEBwYXJhbSB7bnVtYmVyfSBuZWFyIE5lYXIgYm91bmQgb2YgdGhlIGZydXN0dW1cbiAqIEBwYXJhbSB7bnVtYmVyfSBmYXIgRmFyIGJvdW5kIG9mIHRoZSBmcnVzdHVtXG4gKiBAcmV0dXJucyB7bWF0NH0gb3V0XG4gKi9cbmZ1bmN0aW9uIHBlcnNwZWN0aXZlKG91dCwgZm92eSwgYXNwZWN0LCBuZWFyLCBmYXIpIHtcbiAgICB2YXIgZiA9IDEuMCAvIE1hdGgudGFuKGZvdnkgLyAyKSxcbiAgICAgICAgbmYgPSAxIC8gKG5lYXIgLSBmYXIpO1xuICAgIG91dFswXSA9IGYgLyBhc3BlY3Q7XG4gICAgb3V0WzFdID0gMDtcbiAgICBvdXRbMl0gPSAwO1xuICAgIG91dFszXSA9IDA7XG4gICAgb3V0WzRdID0gMDtcbiAgICBvdXRbNV0gPSBmO1xuICAgIG91dFs2XSA9IDA7XG4gICAgb3V0WzddID0gMDtcbiAgICBvdXRbOF0gPSAwO1xuICAgIG91dFs5XSA9IDA7XG4gICAgb3V0WzEwXSA9IChmYXIgKyBuZWFyKSAqIG5mO1xuICAgIG91dFsxMV0gPSAtMTtcbiAgICBvdXRbMTJdID0gMDtcbiAgICBvdXRbMTNdID0gMDtcbiAgICBvdXRbMTRdID0gKDIgKiBmYXIgKiBuZWFyKSAqIG5mO1xuICAgIG91dFsxNV0gPSAwO1xuICAgIHJldHVybiBvdXQ7XG59OyIsIm1vZHVsZS5leHBvcnRzID0gc2NhbGU7XG5cbi8qKlxuICogU2NhbGVzIHRoZSBtYXQ0IGJ5IHRoZSBkaW1lbnNpb25zIGluIHRoZSBnaXZlbiB2ZWMzXG4gKlxuICogQHBhcmFtIHttYXQ0fSBvdXQgdGhlIHJlY2VpdmluZyBtYXRyaXhcbiAqIEBwYXJhbSB7bWF0NH0gYSB0aGUgbWF0cml4IHRvIHNjYWxlXG4gKiBAcGFyYW0ge3ZlYzN9IHYgdGhlIHZlYzMgdG8gc2NhbGUgdGhlIG1hdHJpeCBieVxuICogQHJldHVybnMge21hdDR9IG91dFxuICoqL1xuZnVuY3Rpb24gc2NhbGUob3V0LCBhLCB2KSB7XG4gICAgdmFyIHggPSB2WzBdLCB5ID0gdlsxXSwgeiA9IHZbMl07XG5cbiAgICBvdXRbMF0gPSBhWzBdICogeDtcbiAgICBvdXRbMV0gPSBhWzFdICogeDtcbiAgICBvdXRbMl0gPSBhWzJdICogeDtcbiAgICBvdXRbM10gPSBhWzNdICogeDtcbiAgICBvdXRbNF0gPSBhWzRdICogeTtcbiAgICBvdXRbNV0gPSBhWzVdICogeTtcbiAgICBvdXRbNl0gPSBhWzZdICogeTtcbiAgICBvdXRbN10gPSBhWzddICogeTtcbiAgICBvdXRbOF0gPSBhWzhdICogejtcbiAgICBvdXRbOV0gPSBhWzldICogejtcbiAgICBvdXRbMTBdID0gYVsxMF0gKiB6O1xuICAgIG91dFsxMV0gPSBhWzExXSAqIHo7XG4gICAgb3V0WzEyXSA9IGFbMTJdO1xuICAgIG91dFsxM10gPSBhWzEzXTtcbiAgICBvdXRbMTRdID0gYVsxNF07XG4gICAgb3V0WzE1XSA9IGFbMTVdO1xuICAgIHJldHVybiBvdXQ7XG59OyIsIm1vZHVsZS5leHBvcnRzID0gdHJhbnNsYXRlO1xuXG4vKipcbiAqIFRyYW5zbGF0ZSBhIG1hdDQgYnkgdGhlIGdpdmVuIHZlY3RvclxuICpcbiAqIEBwYXJhbSB7bWF0NH0gb3V0IHRoZSByZWNlaXZpbmcgbWF0cml4XG4gKiBAcGFyYW0ge21hdDR9IGEgdGhlIG1hdHJpeCB0byB0cmFuc2xhdGVcbiAqIEBwYXJhbSB7dmVjM30gdiB2ZWN0b3IgdG8gdHJhbnNsYXRlIGJ5XG4gKiBAcmV0dXJucyB7bWF0NH0gb3V0XG4gKi9cbmZ1bmN0aW9uIHRyYW5zbGF0ZShvdXQsIGEsIHYpIHtcbiAgICB2YXIgeCA9IHZbMF0sIHkgPSB2WzFdLCB6ID0gdlsyXSxcbiAgICAgICAgYTAwLCBhMDEsIGEwMiwgYTAzLFxuICAgICAgICBhMTAsIGExMSwgYTEyLCBhMTMsXG4gICAgICAgIGEyMCwgYTIxLCBhMjIsIGEyMztcblxuICAgIGlmIChhID09PSBvdXQpIHtcbiAgICAgICAgb3V0WzEyXSA9IGFbMF0gKiB4ICsgYVs0XSAqIHkgKyBhWzhdICogeiArIGFbMTJdO1xuICAgICAgICBvdXRbMTNdID0gYVsxXSAqIHggKyBhWzVdICogeSArIGFbOV0gKiB6ICsgYVsxM107XG4gICAgICAgIG91dFsxNF0gPSBhWzJdICogeCArIGFbNl0gKiB5ICsgYVsxMF0gKiB6ICsgYVsxNF07XG4gICAgICAgIG91dFsxNV0gPSBhWzNdICogeCArIGFbN10gKiB5ICsgYVsxMV0gKiB6ICsgYVsxNV07XG4gICAgfSBlbHNlIHtcbiAgICAgICAgYTAwID0gYVswXTsgYTAxID0gYVsxXTsgYTAyID0gYVsyXTsgYTAzID0gYVszXTtcbiAgICAgICAgYTEwID0gYVs0XTsgYTExID0gYVs1XTsgYTEyID0gYVs2XTsgYTEzID0gYVs3XTtcbiAgICAgICAgYTIwID0gYVs4XTsgYTIxID0gYVs5XTsgYTIyID0gYVsxMF07IGEyMyA9IGFbMTFdO1xuXG4gICAgICAgIG91dFswXSA9IGEwMDsgb3V0WzFdID0gYTAxOyBvdXRbMl0gPSBhMDI7IG91dFszXSA9IGEwMztcbiAgICAgICAgb3V0WzRdID0gYTEwOyBvdXRbNV0gPSBhMTE7IG91dFs2XSA9IGExMjsgb3V0WzddID0gYTEzO1xuICAgICAgICBvdXRbOF0gPSBhMjA7IG91dFs5XSA9IGEyMTsgb3V0WzEwXSA9IGEyMjsgb3V0WzExXSA9IGEyMztcblxuICAgICAgICBvdXRbMTJdID0gYTAwICogeCArIGExMCAqIHkgKyBhMjAgKiB6ICsgYVsxMl07XG4gICAgICAgIG91dFsxM10gPSBhMDEgKiB4ICsgYTExICogeSArIGEyMSAqIHogKyBhWzEzXTtcbiAgICAgICAgb3V0WzE0XSA9IGEwMiAqIHggKyBhMTIgKiB5ICsgYTIyICogeiArIGFbMTRdO1xuICAgICAgICBvdXRbMTVdID0gYTAzICogeCArIGExMyAqIHkgKyBhMjMgKiB6ICsgYVsxNV07XG4gICAgfVxuXG4gICAgcmV0dXJuIG91dDtcbn07IiwibW9kdWxlLmV4cG9ydHMgPSBwYXJzZUVycm9yc1xuXG5mdW5jdGlvbiBwYXJzZUVycm9ycyhsb2cpIHtcbiAgbG9nID0gU3RyaW5nKGxvZylcblxuICB2YXIgbG9ncyA9IFtdXG4gIHZhciByZXN1bHRcblxuICB3aGlsZSAocmVzdWx0ID0gbG9nLm1hdGNoKC9FUlJPUlxcOihbXlxcbl0rKS8pKSB7XG4gICAgbG9nID0gbG9nLnNsaWNlKHJlc3VsdC5pbmRleCArIDEpXG5cbiAgICB2YXIgbGluZSA9IHJlc3VsdFsxXS50cmltKClcbiAgICB2YXIgc2VwcyA9IGxpbmUuc3BsaXQoJzonKVxuICAgIHZhciBlbXNnID0gc2Vwcy5zbGljZSgyKS5qb2luKCc6JykudHJpbSgpXG4gICAgdmFyIGZpbGUgPSBwYXJzZUludChzZXBzWzBdLCAxMClcbiAgICB2YXIgbGluZSA9IHBhcnNlSW50KHNlcHNbMV0sIDEwKVxuXG4gICAgbG9ncy5wdXNoKHtcbiAgICAgICAgbWVzc2FnZTogZW1zZ1xuICAgICAgLCBmaWxlOiBmaWxlXG4gICAgICAsIGxpbmU6IGxpbmVcbiAgICB9KVxuICB9XG5cbiAgcmV0dXJuIGxvZ3Ncbn1cbiIsIid1c2Ugc3RyaWN0JztcblxuXG52YXIgeWFtbCA9IHJlcXVpcmUoJy4vbGliL2pzLXlhbWwuanMnKTtcblxuXG5tb2R1bGUuZXhwb3J0cyA9IHlhbWw7XG4iLCIndXNlIHN0cmljdCc7XG5cblxudmFyIGxvYWRlciA9IHJlcXVpcmUoJy4vanMteWFtbC9sb2FkZXInKTtcbi8vIHZhciBkdW1wZXIgPSByZXF1aXJlKCcuL2pzLXlhbWwvZHVtcGVyJyk7XG5cblxuZnVuY3Rpb24gZGVwcmVjYXRlZChuYW1lKSB7XG4gIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdGdW5jdGlvbiAnICsgbmFtZSArICcgaXMgZGVwcmVjYXRlZCBhbmQgY2Fubm90IGJlIHVzZWQuJyk7XG4gIH07XG59XG5cblxubW9kdWxlLmV4cG9ydHMuVHlwZSAgICAgICAgICAgICAgICA9IHJlcXVpcmUoJy4vanMteWFtbC90eXBlJyk7XG5tb2R1bGUuZXhwb3J0cy5TY2hlbWEgICAgICAgICAgICAgID0gcmVxdWlyZSgnLi9qcy15YW1sL3NjaGVtYScpO1xubW9kdWxlLmV4cG9ydHMuRkFJTFNBRkVfU0NIRU1BICAgICA9IHJlcXVpcmUoJy4vanMteWFtbC9zY2hlbWEvZmFpbHNhZmUnKTtcbm1vZHVsZS5leHBvcnRzLkpTT05fU0NIRU1BICAgICAgICAgPSByZXF1aXJlKCcuL2pzLXlhbWwvc2NoZW1hL2pzb24nKTtcbm1vZHVsZS5leHBvcnRzLkNPUkVfU0NIRU1BICAgICAgICAgPSByZXF1aXJlKCcuL2pzLXlhbWwvc2NoZW1hL2NvcmUnKTtcbm1vZHVsZS5leHBvcnRzLkRFRkFVTFRfU0FGRV9TQ0hFTUEgPSByZXF1aXJlKCcuL2pzLXlhbWwvc2NoZW1hL2RlZmF1bHRfc2FmZScpO1xubW9kdWxlLmV4cG9ydHMuREVGQVVMVF9GVUxMX1NDSEVNQSA9IHJlcXVpcmUoJy4vanMteWFtbC9zY2hlbWEvZGVmYXVsdF9mdWxsJyk7XG5tb2R1bGUuZXhwb3J0cy5sb2FkICAgICAgICAgICAgICAgID0gbG9hZGVyLmxvYWQ7XG5tb2R1bGUuZXhwb3J0cy5sb2FkQWxsICAgICAgICAgICAgID0gbG9hZGVyLmxvYWRBbGw7XG5tb2R1bGUuZXhwb3J0cy5zYWZlTG9hZCAgICAgICAgICAgID0gbG9hZGVyLnNhZmVMb2FkO1xubW9kdWxlLmV4cG9ydHMuc2FmZUxvYWRBbGwgICAgICAgICA9IGxvYWRlci5zYWZlTG9hZEFsbDtcbi8vIG1vZHVsZS5leHBvcnRzLmR1bXAgICAgICAgICAgICAgICAgPSBkdW1wZXIuZHVtcDtcbi8vIG1vZHVsZS5leHBvcnRzLnNhZmVEdW1wICAgICAgICAgICAgPSBkdW1wZXIuc2FmZUR1bXA7XG5tb2R1bGUuZXhwb3J0cy5ZQU1MRXhjZXB0aW9uICAgICAgID0gcmVxdWlyZSgnLi9qcy15YW1sL2V4Y2VwdGlvbicpO1xuXG4vLyBEZXByZWNhdGVkIHNjaGVtYSBuYW1lcyBmcm9tIEpTLVlBTUwgMi4wLnhcbm1vZHVsZS5leHBvcnRzLk1JTklNQUxfU0NIRU1BID0gcmVxdWlyZSgnLi9qcy15YW1sL3NjaGVtYS9mYWlsc2FmZScpO1xubW9kdWxlLmV4cG9ydHMuU0FGRV9TQ0hFTUEgICAgPSByZXF1aXJlKCcuL2pzLXlhbWwvc2NoZW1hL2RlZmF1bHRfc2FmZScpO1xubW9kdWxlLmV4cG9ydHMuREVGQVVMVF9TQ0hFTUEgPSByZXF1aXJlKCcuL2pzLXlhbWwvc2NoZW1hL2RlZmF1bHRfZnVsbCcpO1xuXG4vLyBEZXByZWNhdGVkIGZ1bmN0aW9ucyBmcm9tIEpTLVlBTUwgMS54Lnhcbm1vZHVsZS5leHBvcnRzLnNjYW4gICAgICAgICAgID0gZGVwcmVjYXRlZCgnc2NhbicpO1xubW9kdWxlLmV4cG9ydHMucGFyc2UgICAgICAgICAgPSBkZXByZWNhdGVkKCdwYXJzZScpO1xubW9kdWxlLmV4cG9ydHMuY29tcG9zZSAgICAgICAgPSBkZXByZWNhdGVkKCdjb21wb3NlJyk7XG5tb2R1bGUuZXhwb3J0cy5hZGRDb25zdHJ1Y3RvciA9IGRlcHJlY2F0ZWQoJ2FkZENvbnN0cnVjdG9yJyk7XG4iLCIndXNlIHN0cmljdCc7XG5cblxuZnVuY3Rpb24gaXNOb3RoaW5nKHN1YmplY3QpIHtcbiAgcmV0dXJuICh0eXBlb2Ygc3ViamVjdCA9PT0gJ3VuZGVmaW5lZCcpIHx8IChzdWJqZWN0ID09PSBudWxsKTtcbn1cblxuXG5mdW5jdGlvbiBpc09iamVjdChzdWJqZWN0KSB7XG4gIHJldHVybiAodHlwZW9mIHN1YmplY3QgPT09ICdvYmplY3QnKSAmJiAoc3ViamVjdCAhPT0gbnVsbCk7XG59XG5cblxuZnVuY3Rpb24gdG9BcnJheShzZXF1ZW5jZSkge1xuICBpZiAoQXJyYXkuaXNBcnJheShzZXF1ZW5jZSkpIHJldHVybiBzZXF1ZW5jZTtcbiAgZWxzZSBpZiAoaXNOb3RoaW5nKHNlcXVlbmNlKSkgcmV0dXJuIFtdO1xuXG4gIHJldHVybiBbIHNlcXVlbmNlIF07XG59XG5cblxuZnVuY3Rpb24gZXh0ZW5kKHRhcmdldCwgc291cmNlKSB7XG4gIHZhciBpbmRleCwgbGVuZ3RoLCBrZXksIHNvdXJjZUtleXM7XG5cbiAgaWYgKHNvdXJjZSkge1xuICAgIHNvdXJjZUtleXMgPSBPYmplY3Qua2V5cyhzb3VyY2UpO1xuXG4gICAgZm9yIChpbmRleCA9IDAsIGxlbmd0aCA9IHNvdXJjZUtleXMubGVuZ3RoOyBpbmRleCA8IGxlbmd0aDsgaW5kZXggKz0gMSkge1xuICAgICAga2V5ID0gc291cmNlS2V5c1tpbmRleF07XG4gICAgICB0YXJnZXRba2V5XSA9IHNvdXJjZVtrZXldO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB0YXJnZXQ7XG59XG5cblxuZnVuY3Rpb24gcmVwZWF0KHN0cmluZywgY291bnQpIHtcbiAgdmFyIHJlc3VsdCA9ICcnLCBjeWNsZTtcblxuICBmb3IgKGN5Y2xlID0gMDsgY3ljbGUgPCBjb3VudDsgY3ljbGUgKz0gMSkge1xuICAgIHJlc3VsdCArPSBzdHJpbmc7XG4gIH1cblxuICByZXR1cm4gcmVzdWx0O1xufVxuXG5cbmZ1bmN0aW9uIGlzTmVnYXRpdmVaZXJvKG51bWJlcikge1xuICByZXR1cm4gKG51bWJlciA9PT0gMCkgJiYgKE51bWJlci5ORUdBVElWRV9JTkZJTklUWSA9PT0gMSAvIG51bWJlcik7XG59XG5cblxubW9kdWxlLmV4cG9ydHMuaXNOb3RoaW5nICAgICAgPSBpc05vdGhpbmc7XG5tb2R1bGUuZXhwb3J0cy5pc09iamVjdCAgICAgICA9IGlzT2JqZWN0O1xubW9kdWxlLmV4cG9ydHMudG9BcnJheSAgICAgICAgPSB0b0FycmF5O1xubW9kdWxlLmV4cG9ydHMucmVwZWF0ICAgICAgICAgPSByZXBlYXQ7XG5tb2R1bGUuZXhwb3J0cy5pc05lZ2F0aXZlWmVybyA9IGlzTmVnYXRpdmVaZXJvO1xubW9kdWxlLmV4cG9ydHMuZXh0ZW5kICAgICAgICAgPSBleHRlbmQ7XG4iLCIvLyBZQU1MIGVycm9yIGNsYXNzLiBodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzg0NTg5ODRcbi8vXG4ndXNlIHN0cmljdCc7XG5cbmZ1bmN0aW9uIFlBTUxFeGNlcHRpb24ocmVhc29uLCBtYXJrKSB7XG4gIC8vIFN1cGVyIGNvbnN0cnVjdG9yXG4gIEVycm9yLmNhbGwodGhpcyk7XG5cbiAgLy8gSW5jbHVkZSBzdGFjayB0cmFjZSBpbiBlcnJvciBvYmplY3RcbiAgaWYgKEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKSB7XG4gICAgLy8gQ2hyb21lIGFuZCBOb2RlSlNcbiAgICBFcnJvci5jYXB0dXJlU3RhY2tUcmFjZSh0aGlzLCB0aGlzLmNvbnN0cnVjdG9yKTtcbiAgfSBlbHNlIHtcbiAgICAvLyBGRiwgSUUgMTArIGFuZCBTYWZhcmkgNisuIEZhbGxiYWNrIGZvciBvdGhlcnNcbiAgICB0aGlzLnN0YWNrID0gKG5ldyBFcnJvcigpKS5zdGFjayB8fCAnJztcbiAgfVxuXG4gIHRoaXMubmFtZSA9ICdZQU1MRXhjZXB0aW9uJztcbiAgdGhpcy5yZWFzb24gPSByZWFzb247XG4gIHRoaXMubWFyayA9IG1hcms7XG4gIHRoaXMubWVzc2FnZSA9ICh0aGlzLnJlYXNvbiB8fCAnKHVua25vd24gcmVhc29uKScpICsgKHRoaXMubWFyayA/ICcgJyArIHRoaXMubWFyay50b1N0cmluZygpIDogJycpO1xufVxuXG5cbi8vIEluaGVyaXQgZnJvbSBFcnJvclxuWUFNTEV4Y2VwdGlvbi5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKEVycm9yLnByb3RvdHlwZSk7XG5ZQU1MRXhjZXB0aW9uLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IFlBTUxFeGNlcHRpb247XG5cblxuWUFNTEV4Y2VwdGlvbi5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbiB0b1N0cmluZyhjb21wYWN0KSB7XG4gIHZhciByZXN1bHQgPSB0aGlzLm5hbWUgKyAnOiAnO1xuXG4gIHJlc3VsdCArPSB0aGlzLnJlYXNvbiB8fCAnKHVua25vd24gcmVhc29uKSc7XG5cbiAgaWYgKCFjb21wYWN0ICYmIHRoaXMubWFyaykge1xuICAgIHJlc3VsdCArPSAnICcgKyB0aGlzLm1hcmsudG9TdHJpbmcoKTtcbiAgfVxuXG4gIHJldHVybiByZXN1bHQ7XG59O1xuXG5cbm1vZHVsZS5leHBvcnRzID0gWUFNTEV4Y2VwdGlvbjtcbiIsIid1c2Ugc3RyaWN0JztcblxuLyplc2xpbnQtZGlzYWJsZSBtYXgtbGVuLG5vLXVzZS1iZWZvcmUtZGVmaW5lKi9cblxudmFyIGNvbW1vbiAgICAgICAgICAgICAgPSByZXF1aXJlKCcuL2NvbW1vbicpO1xudmFyIFlBTUxFeGNlcHRpb24gICAgICAgPSByZXF1aXJlKCcuL2V4Y2VwdGlvbicpO1xudmFyIE1hcmsgICAgICAgICAgICAgICAgPSByZXF1aXJlKCcuL21hcmsnKTtcbnZhciBERUZBVUxUX1NBRkVfU0NIRU1BID0gcmVxdWlyZSgnLi9zY2hlbWEvZGVmYXVsdF9zYWZlJyk7XG52YXIgREVGQVVMVF9GVUxMX1NDSEVNQSA9IHJlcXVpcmUoJy4vc2NoZW1hL2RlZmF1bHRfZnVsbCcpO1xuXG5cbnZhciBfaGFzT3duUHJvcGVydHkgPSBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5O1xuXG5cbnZhciBDT05URVhUX0ZMT1dfSU4gICA9IDE7XG52YXIgQ09OVEVYVF9GTE9XX09VVCAgPSAyO1xudmFyIENPTlRFWFRfQkxPQ0tfSU4gID0gMztcbnZhciBDT05URVhUX0JMT0NLX09VVCA9IDQ7XG5cblxudmFyIENIT01QSU5HX0NMSVAgID0gMTtcbnZhciBDSE9NUElOR19TVFJJUCA9IDI7XG52YXIgQ0hPTVBJTkdfS0VFUCAgPSAzO1xuXG5cbnZhciBQQVRURVJOX05PTl9QUklOVEFCTEUgICAgICAgICA9IC9bXFx4MDAtXFx4MDhcXHgwQlxceDBDXFx4MEUtXFx4MUZcXHg3Ri1cXHg4NFxceDg2LVxceDlGXFx1RkZGRVxcdUZGRkZdfFtcXHVEODAwLVxcdURCRkZdKD8hW1xcdURDMDAtXFx1REZGRl0pfCg/OlteXFx1RDgwMC1cXHVEQkZGXXxeKVtcXHVEQzAwLVxcdURGRkZdLztcbnZhciBQQVRURVJOX05PTl9BU0NJSV9MSU5FX0JSRUFLUyA9IC9bXFx4ODVcXHUyMDI4XFx1MjAyOV0vO1xudmFyIFBBVFRFUk5fRkxPV19JTkRJQ0FUT1JTICAgICAgID0gL1ssXFxbXFxdXFx7XFx9XS87XG52YXIgUEFUVEVSTl9UQUdfSEFORExFICAgICAgICAgICAgPSAvXig/OiF8ISF8IVthLXpcXC1dKyEpJC9pO1xudmFyIFBBVFRFUk5fVEFHX1VSSSAgICAgICAgICAgICAgID0gL14oPzohfFteLFxcW1xcXVxce1xcfV0pKD86JVswLTlhLWZdezJ9fFswLTlhLXpcXC0jO1xcL1xcPzpAJj1cXCtcXCQsX1xcLiF+XFwqJ1xcKFxcKVxcW1xcXV0pKiQvaTtcblxuXG5mdW5jdGlvbiBpc19FT0woYykge1xuICByZXR1cm4gKGMgPT09IDB4MEEvKiBMRiAqLykgfHwgKGMgPT09IDB4MEQvKiBDUiAqLyk7XG59XG5cbmZ1bmN0aW9uIGlzX1dISVRFX1NQQUNFKGMpIHtcbiAgcmV0dXJuIChjID09PSAweDA5LyogVGFiICovKSB8fCAoYyA9PT0gMHgyMC8qIFNwYWNlICovKTtcbn1cblxuZnVuY3Rpb24gaXNfV1NfT1JfRU9MKGMpIHtcbiAgcmV0dXJuIChjID09PSAweDA5LyogVGFiICovKSB8fFxuICAgICAgICAgKGMgPT09IDB4MjAvKiBTcGFjZSAqLykgfHxcbiAgICAgICAgIChjID09PSAweDBBLyogTEYgKi8pIHx8XG4gICAgICAgICAoYyA9PT0gMHgwRC8qIENSICovKTtcbn1cblxuZnVuY3Rpb24gaXNfRkxPV19JTkRJQ0FUT1IoYykge1xuICByZXR1cm4gYyA9PT0gMHgyQy8qICwgKi8gfHxcbiAgICAgICAgIGMgPT09IDB4NUIvKiBbICovIHx8XG4gICAgICAgICBjID09PSAweDVELyogXSAqLyB8fFxuICAgICAgICAgYyA9PT0gMHg3Qi8qIHsgKi8gfHxcbiAgICAgICAgIGMgPT09IDB4N0QvKiB9ICovO1xufVxuXG5mdW5jdGlvbiBmcm9tSGV4Q29kZShjKSB7XG4gIHZhciBsYztcblxuICBpZiAoKDB4MzAvKiAwICovIDw9IGMpICYmIChjIDw9IDB4MzkvKiA5ICovKSkge1xuICAgIHJldHVybiBjIC0gMHgzMDtcbiAgfVxuXG4gIC8qZXNsaW50LWRpc2FibGUgbm8tYml0d2lzZSovXG4gIGxjID0gYyB8IDB4MjA7XG5cbiAgaWYgKCgweDYxLyogYSAqLyA8PSBsYykgJiYgKGxjIDw9IDB4NjYvKiBmICovKSkge1xuICAgIHJldHVybiBsYyAtIDB4NjEgKyAxMDtcbiAgfVxuXG4gIHJldHVybiAtMTtcbn1cblxuZnVuY3Rpb24gZXNjYXBlZEhleExlbihjKSB7XG4gIGlmIChjID09PSAweDc4LyogeCAqLykgeyByZXR1cm4gMjsgfVxuICBpZiAoYyA9PT0gMHg3NS8qIHUgKi8pIHsgcmV0dXJuIDQ7IH1cbiAgaWYgKGMgPT09IDB4NTUvKiBVICovKSB7IHJldHVybiA4OyB9XG4gIHJldHVybiAwO1xufVxuXG5mdW5jdGlvbiBmcm9tRGVjaW1hbENvZGUoYykge1xuICBpZiAoKDB4MzAvKiAwICovIDw9IGMpICYmIChjIDw9IDB4MzkvKiA5ICovKSkge1xuICAgIHJldHVybiBjIC0gMHgzMDtcbiAgfVxuXG4gIHJldHVybiAtMTtcbn1cblxuZnVuY3Rpb24gc2ltcGxlRXNjYXBlU2VxdWVuY2UoYykge1xuICByZXR1cm4gKGMgPT09IDB4MzAvKiAwICovKSA/ICdcXHgwMCcgOlxuICAgICAgICAoYyA9PT0gMHg2MS8qIGEgKi8pID8gJ1xceDA3JyA6XG4gICAgICAgIChjID09PSAweDYyLyogYiAqLykgPyAnXFx4MDgnIDpcbiAgICAgICAgKGMgPT09IDB4NzQvKiB0ICovKSA/ICdcXHgwOScgOlxuICAgICAgICAoYyA9PT0gMHgwOS8qIFRhYiAqLykgPyAnXFx4MDknIDpcbiAgICAgICAgKGMgPT09IDB4NkUvKiBuICovKSA/ICdcXHgwQScgOlxuICAgICAgICAoYyA9PT0gMHg3Ni8qIHYgKi8pID8gJ1xceDBCJyA6XG4gICAgICAgIChjID09PSAweDY2LyogZiAqLykgPyAnXFx4MEMnIDpcbiAgICAgICAgKGMgPT09IDB4NzIvKiByICovKSA/ICdcXHgwRCcgOlxuICAgICAgICAoYyA9PT0gMHg2NS8qIGUgKi8pID8gJ1xceDFCJyA6XG4gICAgICAgIChjID09PSAweDIwLyogU3BhY2UgKi8pID8gJyAnIDpcbiAgICAgICAgKGMgPT09IDB4MjIvKiBcIiAqLykgPyAnXFx4MjInIDpcbiAgICAgICAgKGMgPT09IDB4MkYvKiAvICovKSA/ICcvJyA6XG4gICAgICAgIChjID09PSAweDVDLyogXFwgKi8pID8gJ1xceDVDJyA6XG4gICAgICAgIChjID09PSAweDRFLyogTiAqLykgPyAnXFx4ODUnIDpcbiAgICAgICAgKGMgPT09IDB4NUYvKiBfICovKSA/ICdcXHhBMCcgOlxuICAgICAgICAoYyA9PT0gMHg0Qy8qIEwgKi8pID8gJ1xcdTIwMjgnIDpcbiAgICAgICAgKGMgPT09IDB4NTAvKiBQICovKSA/ICdcXHUyMDI5JyA6ICcnO1xufVxuXG5mdW5jdGlvbiBjaGFyRnJvbUNvZGVwb2ludChjKSB7XG4gIGlmIChjIDw9IDB4RkZGRikge1xuICAgIHJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKGMpO1xuICB9XG4gIC8vIEVuY29kZSBVVEYtMTYgc3Vycm9nYXRlIHBhaXJcbiAgLy8gaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvVVRGLTE2I0NvZGVfcG9pbnRzX1UuMkIwMTAwMDBfdG9fVS4yQjEwRkZGRlxuICByZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZSgoKGMgLSAweDAxMDAwMCkgPj4gMTApICsgMHhEODAwLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKGMgLSAweDAxMDAwMCkgJiAweDAzRkYpICsgMHhEQzAwKTtcbn1cblxudmFyIHNpbXBsZUVzY2FwZUNoZWNrID0gbmV3IEFycmF5KDI1Nik7IC8vIGludGVnZXIsIGZvciBmYXN0IGFjY2Vzc1xudmFyIHNpbXBsZUVzY2FwZU1hcCA9IG5ldyBBcnJheSgyNTYpO1xuZm9yICh2YXIgaSA9IDA7IGkgPCAyNTY7IGkrKykge1xuICBzaW1wbGVFc2NhcGVDaGVja1tpXSA9IHNpbXBsZUVzY2FwZVNlcXVlbmNlKGkpID8gMSA6IDA7XG4gIHNpbXBsZUVzY2FwZU1hcFtpXSA9IHNpbXBsZUVzY2FwZVNlcXVlbmNlKGkpO1xufVxuXG5cbmZ1bmN0aW9uIFN0YXRlKGlucHV0LCBvcHRpb25zKSB7XG4gIHRoaXMuaW5wdXQgPSBpbnB1dDtcblxuICB0aGlzLmZpbGVuYW1lICA9IG9wdGlvbnNbJ2ZpbGVuYW1lJ10gIHx8IG51bGw7XG4gIHRoaXMuc2NoZW1hICAgID0gb3B0aW9uc1snc2NoZW1hJ10gICAgfHwgREVGQVVMVF9GVUxMX1NDSEVNQTtcbiAgdGhpcy5vbldhcm5pbmcgPSBvcHRpb25zWydvbldhcm5pbmcnXSB8fCBudWxsO1xuICB0aGlzLmxlZ2FjeSAgICA9IG9wdGlvbnNbJ2xlZ2FjeSddICAgIHx8IGZhbHNlO1xuICB0aGlzLmpzb24gICAgICA9IG9wdGlvbnNbJ2pzb24nXSAgICAgIHx8IGZhbHNlO1xuICB0aGlzLmxpc3RlbmVyICA9IG9wdGlvbnNbJ2xpc3RlbmVyJ10gIHx8IG51bGw7XG5cbiAgdGhpcy5pbXBsaWNpdFR5cGVzID0gdGhpcy5zY2hlbWEuY29tcGlsZWRJbXBsaWNpdDtcbiAgdGhpcy50eXBlTWFwICAgICAgID0gdGhpcy5zY2hlbWEuY29tcGlsZWRUeXBlTWFwO1xuXG4gIHRoaXMubGVuZ3RoICAgICA9IGlucHV0Lmxlbmd0aDtcbiAgdGhpcy5wb3NpdGlvbiAgID0gMDtcbiAgdGhpcy5saW5lICAgICAgID0gMDtcbiAgdGhpcy5saW5lU3RhcnQgID0gMDtcbiAgdGhpcy5saW5lSW5kZW50ID0gMDtcblxuICB0aGlzLmRvY3VtZW50cyA9IFtdO1xuXG4gIC8qXG4gIHRoaXMudmVyc2lvbjtcbiAgdGhpcy5jaGVja0xpbmVCcmVha3M7XG4gIHRoaXMudGFnTWFwO1xuICB0aGlzLmFuY2hvck1hcDtcbiAgdGhpcy50YWc7XG4gIHRoaXMuYW5jaG9yO1xuICB0aGlzLmtpbmQ7XG4gIHRoaXMucmVzdWx0OyovXG5cbn1cblxuXG5mdW5jdGlvbiBnZW5lcmF0ZUVycm9yKHN0YXRlLCBtZXNzYWdlKSB7XG4gIHJldHVybiBuZXcgWUFNTEV4Y2VwdGlvbihcbiAgICBtZXNzYWdlLFxuICAgIG5ldyBNYXJrKHN0YXRlLmZpbGVuYW1lLCBzdGF0ZS5pbnB1dCwgc3RhdGUucG9zaXRpb24sIHN0YXRlLmxpbmUsIChzdGF0ZS5wb3NpdGlvbiAtIHN0YXRlLmxpbmVTdGFydCkpKTtcbn1cblxuZnVuY3Rpb24gdGhyb3dFcnJvcihzdGF0ZSwgbWVzc2FnZSkge1xuICB0aHJvdyBnZW5lcmF0ZUVycm9yKHN0YXRlLCBtZXNzYWdlKTtcbn1cblxuZnVuY3Rpb24gdGhyb3dXYXJuaW5nKHN0YXRlLCBtZXNzYWdlKSB7XG4gIGlmIChzdGF0ZS5vbldhcm5pbmcpIHtcbiAgICBzdGF0ZS5vbldhcm5pbmcuY2FsbChudWxsLCBnZW5lcmF0ZUVycm9yKHN0YXRlLCBtZXNzYWdlKSk7XG4gIH1cbn1cblxuXG52YXIgZGlyZWN0aXZlSGFuZGxlcnMgPSB7XG5cbiAgWUFNTDogZnVuY3Rpb24gaGFuZGxlWWFtbERpcmVjdGl2ZShzdGF0ZSwgbmFtZSwgYXJncykge1xuXG4gICAgdmFyIG1hdGNoLCBtYWpvciwgbWlub3I7XG5cbiAgICBpZiAoc3RhdGUudmVyc2lvbiAhPT0gbnVsbCkge1xuICAgICAgdGhyb3dFcnJvcihzdGF0ZSwgJ2R1cGxpY2F0aW9uIG9mICVZQU1MIGRpcmVjdGl2ZScpO1xuICAgIH1cblxuICAgIGlmIChhcmdzLmxlbmd0aCAhPT0gMSkge1xuICAgICAgdGhyb3dFcnJvcihzdGF0ZSwgJ1lBTUwgZGlyZWN0aXZlIGFjY2VwdHMgZXhhY3RseSBvbmUgYXJndW1lbnQnKTtcbiAgICB9XG5cbiAgICBtYXRjaCA9IC9eKFswLTldKylcXC4oWzAtOV0rKSQvLmV4ZWMoYXJnc1swXSk7XG5cbiAgICBpZiAobWF0Y2ggPT09IG51bGwpIHtcbiAgICAgIHRocm93RXJyb3Ioc3RhdGUsICdpbGwtZm9ybWVkIGFyZ3VtZW50IG9mIHRoZSBZQU1MIGRpcmVjdGl2ZScpO1xuICAgIH1cblxuICAgIG1ham9yID0gcGFyc2VJbnQobWF0Y2hbMV0sIDEwKTtcbiAgICBtaW5vciA9IHBhcnNlSW50KG1hdGNoWzJdLCAxMCk7XG5cbiAgICBpZiAobWFqb3IgIT09IDEpIHtcbiAgICAgIHRocm93RXJyb3Ioc3RhdGUsICd1bmFjY2VwdGFibGUgWUFNTCB2ZXJzaW9uIG9mIHRoZSBkb2N1bWVudCcpO1xuICAgIH1cblxuICAgIHN0YXRlLnZlcnNpb24gPSBhcmdzWzBdO1xuICAgIHN0YXRlLmNoZWNrTGluZUJyZWFrcyA9IChtaW5vciA8IDIpO1xuXG4gICAgaWYgKG1pbm9yICE9PSAxICYmIG1pbm9yICE9PSAyKSB7XG4gICAgICB0aHJvd1dhcm5pbmcoc3RhdGUsICd1bnN1cHBvcnRlZCBZQU1MIHZlcnNpb24gb2YgdGhlIGRvY3VtZW50Jyk7XG4gICAgfVxuICB9LFxuXG4gIFRBRzogZnVuY3Rpb24gaGFuZGxlVGFnRGlyZWN0aXZlKHN0YXRlLCBuYW1lLCBhcmdzKSB7XG5cbiAgICB2YXIgaGFuZGxlLCBwcmVmaXg7XG5cbiAgICBpZiAoYXJncy5sZW5ndGggIT09IDIpIHtcbiAgICAgIHRocm93RXJyb3Ioc3RhdGUsICdUQUcgZGlyZWN0aXZlIGFjY2VwdHMgZXhhY3RseSB0d28gYXJndW1lbnRzJyk7XG4gICAgfVxuXG4gICAgaGFuZGxlID0gYXJnc1swXTtcbiAgICBwcmVmaXggPSBhcmdzWzFdO1xuXG4gICAgaWYgKCFQQVRURVJOX1RBR19IQU5ETEUudGVzdChoYW5kbGUpKSB7XG4gICAgICB0aHJvd0Vycm9yKHN0YXRlLCAnaWxsLWZvcm1lZCB0YWcgaGFuZGxlIChmaXJzdCBhcmd1bWVudCkgb2YgdGhlIFRBRyBkaXJlY3RpdmUnKTtcbiAgICB9XG5cbiAgICBpZiAoX2hhc093blByb3BlcnR5LmNhbGwoc3RhdGUudGFnTWFwLCBoYW5kbGUpKSB7XG4gICAgICB0aHJvd0Vycm9yKHN0YXRlLCAndGhlcmUgaXMgYSBwcmV2aW91c2x5IGRlY2xhcmVkIHN1ZmZpeCBmb3IgXCInICsgaGFuZGxlICsgJ1wiIHRhZyBoYW5kbGUnKTtcbiAgICB9XG5cbiAgICBpZiAoIVBBVFRFUk5fVEFHX1VSSS50ZXN0KHByZWZpeCkpIHtcbiAgICAgIHRocm93RXJyb3Ioc3RhdGUsICdpbGwtZm9ybWVkIHRhZyBwcmVmaXggKHNlY29uZCBhcmd1bWVudCkgb2YgdGhlIFRBRyBkaXJlY3RpdmUnKTtcbiAgICB9XG5cbiAgICBzdGF0ZS50YWdNYXBbaGFuZGxlXSA9IHByZWZpeDtcbiAgfVxufTtcblxuXG5mdW5jdGlvbiBjYXB0dXJlU2VnbWVudChzdGF0ZSwgc3RhcnQsIGVuZCwgY2hlY2tKc29uKSB7XG4gIHZhciBfcG9zaXRpb24sIF9sZW5ndGgsIF9jaGFyYWN0ZXIsIF9yZXN1bHQ7XG5cbiAgaWYgKHN0YXJ0IDwgZW5kKSB7XG4gICAgX3Jlc3VsdCA9IHN0YXRlLmlucHV0LnNsaWNlKHN0YXJ0LCBlbmQpO1xuXG4gICAgaWYgKGNoZWNrSnNvbikge1xuICAgICAgZm9yIChfcG9zaXRpb24gPSAwLCBfbGVuZ3RoID0gX3Jlc3VsdC5sZW5ndGg7XG4gICAgICAgICAgIF9wb3NpdGlvbiA8IF9sZW5ndGg7XG4gICAgICAgICAgIF9wb3NpdGlvbiArPSAxKSB7XG4gICAgICAgIF9jaGFyYWN0ZXIgPSBfcmVzdWx0LmNoYXJDb2RlQXQoX3Bvc2l0aW9uKTtcbiAgICAgICAgaWYgKCEoX2NoYXJhY3RlciA9PT0gMHgwOSB8fFxuICAgICAgICAgICAgICAoMHgyMCA8PSBfY2hhcmFjdGVyICYmIF9jaGFyYWN0ZXIgPD0gMHgxMEZGRkYpKSkge1xuICAgICAgICAgIHRocm93RXJyb3Ioc3RhdGUsICdleHBlY3RlZCB2YWxpZCBKU09OIGNoYXJhY3RlcicpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChQQVRURVJOX05PTl9QUklOVEFCTEUudGVzdChfcmVzdWx0KSkge1xuICAgICAgdGhyb3dFcnJvcihzdGF0ZSwgJ3RoZSBzdHJlYW0gY29udGFpbnMgbm9uLXByaW50YWJsZSBjaGFyYWN0ZXJzJyk7XG4gICAgfVxuXG4gICAgc3RhdGUucmVzdWx0ICs9IF9yZXN1bHQ7XG4gIH1cbn1cblxuZnVuY3Rpb24gbWVyZ2VNYXBwaW5ncyhzdGF0ZSwgZGVzdGluYXRpb24sIHNvdXJjZSwgb3ZlcnJpZGFibGVLZXlzKSB7XG4gIHZhciBzb3VyY2VLZXlzLCBrZXksIGluZGV4LCBxdWFudGl0eTtcblxuICBpZiAoIWNvbW1vbi5pc09iamVjdChzb3VyY2UpKSB7XG4gICAgdGhyb3dFcnJvcihzdGF0ZSwgJ2Nhbm5vdCBtZXJnZSBtYXBwaW5nczsgdGhlIHByb3ZpZGVkIHNvdXJjZSBvYmplY3QgaXMgdW5hY2NlcHRhYmxlJyk7XG4gIH1cblxuICBzb3VyY2VLZXlzID0gT2JqZWN0LmtleXMoc291cmNlKTtcblxuICBmb3IgKGluZGV4ID0gMCwgcXVhbnRpdHkgPSBzb3VyY2VLZXlzLmxlbmd0aDsgaW5kZXggPCBxdWFudGl0eTsgaW5kZXggKz0gMSkge1xuICAgIGtleSA9IHNvdXJjZUtleXNbaW5kZXhdO1xuXG4gICAgaWYgKCFfaGFzT3duUHJvcGVydHkuY2FsbChkZXN0aW5hdGlvbiwga2V5KSkge1xuICAgICAgZGVzdGluYXRpb25ba2V5XSA9IHNvdXJjZVtrZXldO1xuICAgICAgb3ZlcnJpZGFibGVLZXlzW2tleV0gPSB0cnVlO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBzdG9yZU1hcHBpbmdQYWlyKHN0YXRlLCBfcmVzdWx0LCBvdmVycmlkYWJsZUtleXMsIGtleVRhZywga2V5Tm9kZSwgdmFsdWVOb2RlKSB7XG4gIHZhciBpbmRleCwgcXVhbnRpdHk7XG5cbiAga2V5Tm9kZSA9IFN0cmluZyhrZXlOb2RlKTtcblxuICBpZiAoX3Jlc3VsdCA9PT0gbnVsbCkge1xuICAgIF9yZXN1bHQgPSB7fTtcbiAgfVxuXG4gIGlmIChrZXlUYWcgPT09ICd0YWc6eWFtbC5vcmcsMjAwMjptZXJnZScpIHtcbiAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZU5vZGUpKSB7XG4gICAgICBmb3IgKGluZGV4ID0gMCwgcXVhbnRpdHkgPSB2YWx1ZU5vZGUubGVuZ3RoOyBpbmRleCA8IHF1YW50aXR5OyBpbmRleCArPSAxKSB7XG4gICAgICAgIG1lcmdlTWFwcGluZ3Moc3RhdGUsIF9yZXN1bHQsIHZhbHVlTm9kZVtpbmRleF0sIG92ZXJyaWRhYmxlS2V5cyk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIG1lcmdlTWFwcGluZ3Moc3RhdGUsIF9yZXN1bHQsIHZhbHVlTm9kZSwgb3ZlcnJpZGFibGVLZXlzKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgaWYgKCFzdGF0ZS5qc29uICYmXG4gICAgICAgICFfaGFzT3duUHJvcGVydHkuY2FsbChvdmVycmlkYWJsZUtleXMsIGtleU5vZGUpICYmXG4gICAgICAgIF9oYXNPd25Qcm9wZXJ0eS5jYWxsKF9yZXN1bHQsIGtleU5vZGUpKSB7XG4gICAgICB0aHJvd0Vycm9yKHN0YXRlLCAnZHVwbGljYXRlZCBtYXBwaW5nIGtleScpO1xuICAgIH1cbiAgICBfcmVzdWx0W2tleU5vZGVdID0gdmFsdWVOb2RlO1xuICAgIGRlbGV0ZSBvdmVycmlkYWJsZUtleXNba2V5Tm9kZV07XG4gIH1cblxuICByZXR1cm4gX3Jlc3VsdDtcbn1cblxuZnVuY3Rpb24gcmVhZExpbmVCcmVhayhzdGF0ZSkge1xuICB2YXIgY2g7XG5cbiAgY2ggPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KHN0YXRlLnBvc2l0aW9uKTtcblxuICBpZiAoY2ggPT09IDB4MEEvKiBMRiAqLykge1xuICAgIHN0YXRlLnBvc2l0aW9uKys7XG4gIH0gZWxzZSBpZiAoY2ggPT09IDB4MEQvKiBDUiAqLykge1xuICAgIHN0YXRlLnBvc2l0aW9uKys7XG4gICAgaWYgKHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoc3RhdGUucG9zaXRpb24pID09PSAweDBBLyogTEYgKi8pIHtcbiAgICAgIHN0YXRlLnBvc2l0aW9uKys7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHRocm93RXJyb3Ioc3RhdGUsICdhIGxpbmUgYnJlYWsgaXMgZXhwZWN0ZWQnKTtcbiAgfVxuXG4gIHN0YXRlLmxpbmUgKz0gMTtcbiAgc3RhdGUubGluZVN0YXJ0ID0gc3RhdGUucG9zaXRpb247XG59XG5cbmZ1bmN0aW9uIHNraXBTZXBhcmF0aW9uU3BhY2Uoc3RhdGUsIGFsbG93Q29tbWVudHMsIGNoZWNrSW5kZW50KSB7XG4gIHZhciBsaW5lQnJlYWtzID0gMCxcbiAgICAgIGNoID0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdChzdGF0ZS5wb3NpdGlvbik7XG5cbiAgd2hpbGUgKGNoICE9PSAwKSB7XG4gICAgd2hpbGUgKGlzX1dISVRFX1NQQUNFKGNoKSkge1xuICAgICAgY2ggPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KCsrc3RhdGUucG9zaXRpb24pO1xuICAgIH1cblxuICAgIGlmIChhbGxvd0NvbW1lbnRzICYmIGNoID09PSAweDIzLyogIyAqLykge1xuICAgICAgZG8ge1xuICAgICAgICBjaCA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoKytzdGF0ZS5wb3NpdGlvbik7XG4gICAgICB9IHdoaWxlIChjaCAhPT0gMHgwQS8qIExGICovICYmIGNoICE9PSAweDBELyogQ1IgKi8gJiYgY2ggIT09IDApO1xuICAgIH1cblxuICAgIGlmIChpc19FT0woY2gpKSB7XG4gICAgICByZWFkTGluZUJyZWFrKHN0YXRlKTtcblxuICAgICAgY2ggPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KHN0YXRlLnBvc2l0aW9uKTtcbiAgICAgIGxpbmVCcmVha3MrKztcbiAgICAgIHN0YXRlLmxpbmVJbmRlbnQgPSAwO1xuXG4gICAgICB3aGlsZSAoY2ggPT09IDB4MjAvKiBTcGFjZSAqLykge1xuICAgICAgICBzdGF0ZS5saW5lSW5kZW50Kys7XG4gICAgICAgIGNoID0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdCgrK3N0YXRlLnBvc2l0aW9uKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG5cbiAgaWYgKGNoZWNrSW5kZW50ICE9PSAtMSAmJiBsaW5lQnJlYWtzICE9PSAwICYmIHN0YXRlLmxpbmVJbmRlbnQgPCBjaGVja0luZGVudCkge1xuICAgIHRocm93V2FybmluZyhzdGF0ZSwgJ2RlZmljaWVudCBpbmRlbnRhdGlvbicpO1xuICB9XG5cbiAgcmV0dXJuIGxpbmVCcmVha3M7XG59XG5cbmZ1bmN0aW9uIHRlc3REb2N1bWVudFNlcGFyYXRvcihzdGF0ZSkge1xuICB2YXIgX3Bvc2l0aW9uID0gc3RhdGUucG9zaXRpb24sXG4gICAgICBjaDtcblxuICBjaCA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoX3Bvc2l0aW9uKTtcblxuICAvLyBDb25kaXRpb24gc3RhdGUucG9zaXRpb24gPT09IHN0YXRlLmxpbmVTdGFydCBpcyB0ZXN0ZWRcbiAgLy8gaW4gcGFyZW50IG9uIGVhY2ggY2FsbCwgZm9yIGVmZmljaWVuY3kuIE5vIG5lZWRzIHRvIHRlc3QgaGVyZSBhZ2Fpbi5cbiAgaWYgKChjaCA9PT0gMHgyRC8qIC0gKi8gfHwgY2ggPT09IDB4MkUvKiAuICovKSAmJlxuICAgICAgY2ggPT09IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoX3Bvc2l0aW9uICsgMSkgJiZcbiAgICAgIGNoID09PSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KF9wb3NpdGlvbiArIDIpKSB7XG5cbiAgICBfcG9zaXRpb24gKz0gMztcblxuICAgIGNoID0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdChfcG9zaXRpb24pO1xuXG4gICAgaWYgKGNoID09PSAwIHx8IGlzX1dTX09SX0VPTChjaCkpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBmYWxzZTtcbn1cblxuZnVuY3Rpb24gd3JpdGVGb2xkZWRMaW5lcyhzdGF0ZSwgY291bnQpIHtcbiAgaWYgKGNvdW50ID09PSAxKSB7XG4gICAgc3RhdGUucmVzdWx0ICs9ICcgJztcbiAgfSBlbHNlIGlmIChjb3VudCA+IDEpIHtcbiAgICBzdGF0ZS5yZXN1bHQgKz0gY29tbW9uLnJlcGVhdCgnXFxuJywgY291bnQgLSAxKTtcbiAgfVxufVxuXG5cbmZ1bmN0aW9uIHJlYWRQbGFpblNjYWxhcihzdGF0ZSwgbm9kZUluZGVudCwgd2l0aGluRmxvd0NvbGxlY3Rpb24pIHtcbiAgdmFyIHByZWNlZGluZyxcbiAgICAgIGZvbGxvd2luZyxcbiAgICAgIGNhcHR1cmVTdGFydCxcbiAgICAgIGNhcHR1cmVFbmQsXG4gICAgICBoYXNQZW5kaW5nQ29udGVudCxcbiAgICAgIF9saW5lLFxuICAgICAgX2xpbmVTdGFydCxcbiAgICAgIF9saW5lSW5kZW50LFxuICAgICAgX2tpbmQgPSBzdGF0ZS5raW5kLFxuICAgICAgX3Jlc3VsdCA9IHN0YXRlLnJlc3VsdCxcbiAgICAgIGNoO1xuXG4gIGNoID0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdChzdGF0ZS5wb3NpdGlvbik7XG5cbiAgaWYgKGlzX1dTX09SX0VPTChjaCkgICAgICB8fFxuICAgICAgaXNfRkxPV19JTkRJQ0FUT1IoY2gpIHx8XG4gICAgICBjaCA9PT0gMHgyMy8qICMgKi8gICAgfHxcbiAgICAgIGNoID09PSAweDI2LyogJiAqLyAgICB8fFxuICAgICAgY2ggPT09IDB4MkEvKiAqICovICAgIHx8XG4gICAgICBjaCA9PT0gMHgyMS8qICEgKi8gICAgfHxcbiAgICAgIGNoID09PSAweDdDLyogfCAqLyAgICB8fFxuICAgICAgY2ggPT09IDB4M0UvKiA+ICovICAgIHx8XG4gICAgICBjaCA9PT0gMHgyNy8qICcgKi8gICAgfHxcbiAgICAgIGNoID09PSAweDIyLyogXCIgKi8gICAgfHxcbiAgICAgIGNoID09PSAweDI1LyogJSAqLyAgICB8fFxuICAgICAgY2ggPT09IDB4NDAvKiBAICovICAgIHx8XG4gICAgICBjaCA9PT0gMHg2MC8qIGAgKi8pIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAoY2ggPT09IDB4M0YvKiA/ICovIHx8IGNoID09PSAweDJELyogLSAqLykge1xuICAgIGZvbGxvd2luZyA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoc3RhdGUucG9zaXRpb24gKyAxKTtcblxuICAgIGlmIChpc19XU19PUl9FT0woZm9sbG93aW5nKSB8fFxuICAgICAgICB3aXRoaW5GbG93Q29sbGVjdGlvbiAmJiBpc19GTE9XX0lORElDQVRPUihmb2xsb3dpbmcpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgc3RhdGUua2luZCA9ICdzY2FsYXInO1xuICBzdGF0ZS5yZXN1bHQgPSAnJztcbiAgY2FwdHVyZVN0YXJ0ID0gY2FwdHVyZUVuZCA9IHN0YXRlLnBvc2l0aW9uO1xuICBoYXNQZW5kaW5nQ29udGVudCA9IGZhbHNlO1xuXG4gIHdoaWxlIChjaCAhPT0gMCkge1xuICAgIGlmIChjaCA9PT0gMHgzQS8qIDogKi8pIHtcbiAgICAgIGZvbGxvd2luZyA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoc3RhdGUucG9zaXRpb24gKyAxKTtcblxuICAgICAgaWYgKGlzX1dTX09SX0VPTChmb2xsb3dpbmcpIHx8XG4gICAgICAgICAgd2l0aGluRmxvd0NvbGxlY3Rpb24gJiYgaXNfRkxPV19JTkRJQ0FUT1IoZm9sbG93aW5nKSkge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgIH0gZWxzZSBpZiAoY2ggPT09IDB4MjMvKiAjICovKSB7XG4gICAgICBwcmVjZWRpbmcgPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KHN0YXRlLnBvc2l0aW9uIC0gMSk7XG5cbiAgICAgIGlmIChpc19XU19PUl9FT0wocHJlY2VkaW5nKSkge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgIH0gZWxzZSBpZiAoKHN0YXRlLnBvc2l0aW9uID09PSBzdGF0ZS5saW5lU3RhcnQgJiYgdGVzdERvY3VtZW50U2VwYXJhdG9yKHN0YXRlKSkgfHxcbiAgICAgICAgICAgICAgIHdpdGhpbkZsb3dDb2xsZWN0aW9uICYmIGlzX0ZMT1dfSU5ESUNBVE9SKGNoKSkge1xuICAgICAgYnJlYWs7XG5cbiAgICB9IGVsc2UgaWYgKGlzX0VPTChjaCkpIHtcbiAgICAgIF9saW5lID0gc3RhdGUubGluZTtcbiAgICAgIF9saW5lU3RhcnQgPSBzdGF0ZS5saW5lU3RhcnQ7XG4gICAgICBfbGluZUluZGVudCA9IHN0YXRlLmxpbmVJbmRlbnQ7XG4gICAgICBza2lwU2VwYXJhdGlvblNwYWNlKHN0YXRlLCBmYWxzZSwgLTEpO1xuXG4gICAgICBpZiAoc3RhdGUubGluZUluZGVudCA+PSBub2RlSW5kZW50KSB7XG4gICAgICAgIGhhc1BlbmRpbmdDb250ZW50ID0gdHJ1ZTtcbiAgICAgICAgY2ggPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KHN0YXRlLnBvc2l0aW9uKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzdGF0ZS5wb3NpdGlvbiA9IGNhcHR1cmVFbmQ7XG4gICAgICAgIHN0YXRlLmxpbmUgPSBfbGluZTtcbiAgICAgICAgc3RhdGUubGluZVN0YXJ0ID0gX2xpbmVTdGFydDtcbiAgICAgICAgc3RhdGUubGluZUluZGVudCA9IF9saW5lSW5kZW50O1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoaGFzUGVuZGluZ0NvbnRlbnQpIHtcbiAgICAgIGNhcHR1cmVTZWdtZW50KHN0YXRlLCBjYXB0dXJlU3RhcnQsIGNhcHR1cmVFbmQsIGZhbHNlKTtcbiAgICAgIHdyaXRlRm9sZGVkTGluZXMoc3RhdGUsIHN0YXRlLmxpbmUgLSBfbGluZSk7XG4gICAgICBjYXB0dXJlU3RhcnQgPSBjYXB0dXJlRW5kID0gc3RhdGUucG9zaXRpb247XG4gICAgICBoYXNQZW5kaW5nQ29udGVudCA9IGZhbHNlO1xuICAgIH1cblxuICAgIGlmICghaXNfV0hJVEVfU1BBQ0UoY2gpKSB7XG4gICAgICBjYXB0dXJlRW5kID0gc3RhdGUucG9zaXRpb24gKyAxO1xuICAgIH1cblxuICAgIGNoID0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdCgrK3N0YXRlLnBvc2l0aW9uKTtcbiAgfVxuXG4gIGNhcHR1cmVTZWdtZW50KHN0YXRlLCBjYXB0dXJlU3RhcnQsIGNhcHR1cmVFbmQsIGZhbHNlKTtcblxuICBpZiAoc3RhdGUucmVzdWx0KSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBzdGF0ZS5raW5kID0gX2tpbmQ7XG4gIHN0YXRlLnJlc3VsdCA9IF9yZXN1bHQ7XG4gIHJldHVybiBmYWxzZTtcbn1cblxuZnVuY3Rpb24gcmVhZFNpbmdsZVF1b3RlZFNjYWxhcihzdGF0ZSwgbm9kZUluZGVudCkge1xuICB2YXIgY2gsXG4gICAgICBjYXB0dXJlU3RhcnQsIGNhcHR1cmVFbmQ7XG5cbiAgY2ggPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KHN0YXRlLnBvc2l0aW9uKTtcblxuICBpZiAoY2ggIT09IDB4MjcvKiAnICovKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgc3RhdGUua2luZCA9ICdzY2FsYXInO1xuICBzdGF0ZS5yZXN1bHQgPSAnJztcbiAgc3RhdGUucG9zaXRpb24rKztcbiAgY2FwdHVyZVN0YXJ0ID0gY2FwdHVyZUVuZCA9IHN0YXRlLnBvc2l0aW9uO1xuXG4gIHdoaWxlICgoY2ggPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KHN0YXRlLnBvc2l0aW9uKSkgIT09IDApIHtcbiAgICBpZiAoY2ggPT09IDB4MjcvKiAnICovKSB7XG4gICAgICBjYXB0dXJlU2VnbWVudChzdGF0ZSwgY2FwdHVyZVN0YXJ0LCBzdGF0ZS5wb3NpdGlvbiwgdHJ1ZSk7XG4gICAgICBjaCA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoKytzdGF0ZS5wb3NpdGlvbik7XG5cbiAgICAgIGlmIChjaCA9PT0gMHgyNy8qICcgKi8pIHtcbiAgICAgICAgY2FwdHVyZVN0YXJ0ID0gY2FwdHVyZUVuZCA9IHN0YXRlLnBvc2l0aW9uO1xuICAgICAgICBzdGF0ZS5wb3NpdGlvbisrO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG5cbiAgICB9IGVsc2UgaWYgKGlzX0VPTChjaCkpIHtcbiAgICAgIGNhcHR1cmVTZWdtZW50KHN0YXRlLCBjYXB0dXJlU3RhcnQsIGNhcHR1cmVFbmQsIHRydWUpO1xuICAgICAgd3JpdGVGb2xkZWRMaW5lcyhzdGF0ZSwgc2tpcFNlcGFyYXRpb25TcGFjZShzdGF0ZSwgZmFsc2UsIG5vZGVJbmRlbnQpKTtcbiAgICAgIGNhcHR1cmVTdGFydCA9IGNhcHR1cmVFbmQgPSBzdGF0ZS5wb3NpdGlvbjtcblxuICAgIH0gZWxzZSBpZiAoc3RhdGUucG9zaXRpb24gPT09IHN0YXRlLmxpbmVTdGFydCAmJiB0ZXN0RG9jdW1lbnRTZXBhcmF0b3Ioc3RhdGUpKSB7XG4gICAgICB0aHJvd0Vycm9yKHN0YXRlLCAndW5leHBlY3RlZCBlbmQgb2YgdGhlIGRvY3VtZW50IHdpdGhpbiBhIHNpbmdsZSBxdW90ZWQgc2NhbGFyJyk7XG5cbiAgICB9IGVsc2Uge1xuICAgICAgc3RhdGUucG9zaXRpb24rKztcbiAgICAgIGNhcHR1cmVFbmQgPSBzdGF0ZS5wb3NpdGlvbjtcbiAgICB9XG4gIH1cblxuICB0aHJvd0Vycm9yKHN0YXRlLCAndW5leHBlY3RlZCBlbmQgb2YgdGhlIHN0cmVhbSB3aXRoaW4gYSBzaW5nbGUgcXVvdGVkIHNjYWxhcicpO1xufVxuXG5mdW5jdGlvbiByZWFkRG91YmxlUXVvdGVkU2NhbGFyKHN0YXRlLCBub2RlSW5kZW50KSB7XG4gIHZhciBjYXB0dXJlU3RhcnQsXG4gICAgICBjYXB0dXJlRW5kLFxuICAgICAgaGV4TGVuZ3RoLFxuICAgICAgaGV4UmVzdWx0LFxuICAgICAgdG1wLFxuICAgICAgY2g7XG5cbiAgY2ggPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KHN0YXRlLnBvc2l0aW9uKTtcblxuICBpZiAoY2ggIT09IDB4MjIvKiBcIiAqLykge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHN0YXRlLmtpbmQgPSAnc2NhbGFyJztcbiAgc3RhdGUucmVzdWx0ID0gJyc7XG4gIHN0YXRlLnBvc2l0aW9uKys7XG4gIGNhcHR1cmVTdGFydCA9IGNhcHR1cmVFbmQgPSBzdGF0ZS5wb3NpdGlvbjtcblxuICB3aGlsZSAoKGNoID0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdChzdGF0ZS5wb3NpdGlvbikpICE9PSAwKSB7XG4gICAgaWYgKGNoID09PSAweDIyLyogXCIgKi8pIHtcbiAgICAgIGNhcHR1cmVTZWdtZW50KHN0YXRlLCBjYXB0dXJlU3RhcnQsIHN0YXRlLnBvc2l0aW9uLCB0cnVlKTtcbiAgICAgIHN0YXRlLnBvc2l0aW9uKys7XG4gICAgICByZXR1cm4gdHJ1ZTtcblxuICAgIH0gZWxzZSBpZiAoY2ggPT09IDB4NUMvKiBcXCAqLykge1xuICAgICAgY2FwdHVyZVNlZ21lbnQoc3RhdGUsIGNhcHR1cmVTdGFydCwgc3RhdGUucG9zaXRpb24sIHRydWUpO1xuICAgICAgY2ggPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KCsrc3RhdGUucG9zaXRpb24pO1xuXG4gICAgICBpZiAoaXNfRU9MKGNoKSkge1xuICAgICAgICBza2lwU2VwYXJhdGlvblNwYWNlKHN0YXRlLCBmYWxzZSwgbm9kZUluZGVudCk7XG5cbiAgICAgICAgLy8gVE9ETzogcmV3b3JrIHRvIGlubGluZSBmbiB3aXRoIG5vIHR5cGUgY2FzdD9cbiAgICAgIH0gZWxzZSBpZiAoY2ggPCAyNTYgJiYgc2ltcGxlRXNjYXBlQ2hlY2tbY2hdKSB7XG4gICAgICAgIHN0YXRlLnJlc3VsdCArPSBzaW1wbGVFc2NhcGVNYXBbY2hdO1xuICAgICAgICBzdGF0ZS5wb3NpdGlvbisrO1xuXG4gICAgICB9IGVsc2UgaWYgKCh0bXAgPSBlc2NhcGVkSGV4TGVuKGNoKSkgPiAwKSB7XG4gICAgICAgIGhleExlbmd0aCA9IHRtcDtcbiAgICAgICAgaGV4UmVzdWx0ID0gMDtcblxuICAgICAgICBmb3IgKDsgaGV4TGVuZ3RoID4gMDsgaGV4TGVuZ3RoLS0pIHtcbiAgICAgICAgICBjaCA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoKytzdGF0ZS5wb3NpdGlvbik7XG5cbiAgICAgICAgICBpZiAoKHRtcCA9IGZyb21IZXhDb2RlKGNoKSkgPj0gMCkge1xuICAgICAgICAgICAgaGV4UmVzdWx0ID0gKGhleFJlc3VsdCA8PCA0KSArIHRtcDtcblxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aHJvd0Vycm9yKHN0YXRlLCAnZXhwZWN0ZWQgaGV4YWRlY2ltYWwgY2hhcmFjdGVyJyk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgc3RhdGUucmVzdWx0ICs9IGNoYXJGcm9tQ29kZXBvaW50KGhleFJlc3VsdCk7XG5cbiAgICAgICAgc3RhdGUucG9zaXRpb24rKztcblxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3dFcnJvcihzdGF0ZSwgJ3Vua25vd24gZXNjYXBlIHNlcXVlbmNlJyk7XG4gICAgICB9XG5cbiAgICAgIGNhcHR1cmVTdGFydCA9IGNhcHR1cmVFbmQgPSBzdGF0ZS5wb3NpdGlvbjtcblxuICAgIH0gZWxzZSBpZiAoaXNfRU9MKGNoKSkge1xuICAgICAgY2FwdHVyZVNlZ21lbnQoc3RhdGUsIGNhcHR1cmVTdGFydCwgY2FwdHVyZUVuZCwgdHJ1ZSk7XG4gICAgICB3cml0ZUZvbGRlZExpbmVzKHN0YXRlLCBza2lwU2VwYXJhdGlvblNwYWNlKHN0YXRlLCBmYWxzZSwgbm9kZUluZGVudCkpO1xuICAgICAgY2FwdHVyZVN0YXJ0ID0gY2FwdHVyZUVuZCA9IHN0YXRlLnBvc2l0aW9uO1xuXG4gICAgfSBlbHNlIGlmIChzdGF0ZS5wb3NpdGlvbiA9PT0gc3RhdGUubGluZVN0YXJ0ICYmIHRlc3REb2N1bWVudFNlcGFyYXRvcihzdGF0ZSkpIHtcbiAgICAgIHRocm93RXJyb3Ioc3RhdGUsICd1bmV4cGVjdGVkIGVuZCBvZiB0aGUgZG9jdW1lbnQgd2l0aGluIGEgZG91YmxlIHF1b3RlZCBzY2FsYXInKTtcblxuICAgIH0gZWxzZSB7XG4gICAgICBzdGF0ZS5wb3NpdGlvbisrO1xuICAgICAgY2FwdHVyZUVuZCA9IHN0YXRlLnBvc2l0aW9uO1xuICAgIH1cbiAgfVxuXG4gIHRocm93RXJyb3Ioc3RhdGUsICd1bmV4cGVjdGVkIGVuZCBvZiB0aGUgc3RyZWFtIHdpdGhpbiBhIGRvdWJsZSBxdW90ZWQgc2NhbGFyJyk7XG59XG5cbmZ1bmN0aW9uIHJlYWRGbG93Q29sbGVjdGlvbihzdGF0ZSwgbm9kZUluZGVudCkge1xuICB2YXIgcmVhZE5leHQgPSB0cnVlLFxuICAgICAgX2xpbmUsXG4gICAgICBfdGFnICAgICA9IHN0YXRlLnRhZyxcbiAgICAgIF9yZXN1bHQsXG4gICAgICBfYW5jaG9yICA9IHN0YXRlLmFuY2hvcixcbiAgICAgIGZvbGxvd2luZyxcbiAgICAgIHRlcm1pbmF0b3IsXG4gICAgICBpc1BhaXIsXG4gICAgICBpc0V4cGxpY2l0UGFpcixcbiAgICAgIGlzTWFwcGluZyxcbiAgICAgIG92ZXJyaWRhYmxlS2V5cyA9IHt9LFxuICAgICAga2V5Tm9kZSxcbiAgICAgIGtleVRhZyxcbiAgICAgIHZhbHVlTm9kZSxcbiAgICAgIGNoO1xuXG4gIGNoID0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdChzdGF0ZS5wb3NpdGlvbik7XG5cbiAgaWYgKGNoID09PSAweDVCLyogWyAqLykge1xuICAgIHRlcm1pbmF0b3IgPSAweDVEOy8qIF0gKi9cbiAgICBpc01hcHBpbmcgPSBmYWxzZTtcbiAgICBfcmVzdWx0ID0gW107XG4gIH0gZWxzZSBpZiAoY2ggPT09IDB4N0IvKiB7ICovKSB7XG4gICAgdGVybWluYXRvciA9IDB4N0Q7LyogfSAqL1xuICAgIGlzTWFwcGluZyA9IHRydWU7XG4gICAgX3Jlc3VsdCA9IHt9O1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmIChzdGF0ZS5hbmNob3IgIT09IG51bGwpIHtcbiAgICBzdGF0ZS5hbmNob3JNYXBbc3RhdGUuYW5jaG9yXSA9IF9yZXN1bHQ7XG4gIH1cblxuICBjaCA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoKytzdGF0ZS5wb3NpdGlvbik7XG5cbiAgd2hpbGUgKGNoICE9PSAwKSB7XG4gICAgc2tpcFNlcGFyYXRpb25TcGFjZShzdGF0ZSwgdHJ1ZSwgbm9kZUluZGVudCk7XG5cbiAgICBjaCA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoc3RhdGUucG9zaXRpb24pO1xuXG4gICAgaWYgKGNoID09PSB0ZXJtaW5hdG9yKSB7XG4gICAgICBzdGF0ZS5wb3NpdGlvbisrO1xuICAgICAgc3RhdGUudGFnID0gX3RhZztcbiAgICAgIHN0YXRlLmFuY2hvciA9IF9hbmNob3I7XG4gICAgICBzdGF0ZS5raW5kID0gaXNNYXBwaW5nID8gJ21hcHBpbmcnIDogJ3NlcXVlbmNlJztcbiAgICAgIHN0YXRlLnJlc3VsdCA9IF9yZXN1bHQ7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGVsc2UgaWYgKCFyZWFkTmV4dCkge1xuICAgICAgdGhyb3dFcnJvcihzdGF0ZSwgJ21pc3NlZCBjb21tYSBiZXR3ZWVuIGZsb3cgY29sbGVjdGlvbiBlbnRyaWVzJyk7XG4gICAgfVxuXG4gICAga2V5VGFnID0ga2V5Tm9kZSA9IHZhbHVlTm9kZSA9IG51bGw7XG4gICAgaXNQYWlyID0gaXNFeHBsaWNpdFBhaXIgPSBmYWxzZTtcblxuICAgIGlmIChjaCA9PT0gMHgzRi8qID8gKi8pIHtcbiAgICAgIGZvbGxvd2luZyA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoc3RhdGUucG9zaXRpb24gKyAxKTtcblxuICAgICAgaWYgKGlzX1dTX09SX0VPTChmb2xsb3dpbmcpKSB7XG4gICAgICAgIGlzUGFpciA9IGlzRXhwbGljaXRQYWlyID0gdHJ1ZTtcbiAgICAgICAgc3RhdGUucG9zaXRpb24rKztcbiAgICAgICAgc2tpcFNlcGFyYXRpb25TcGFjZShzdGF0ZSwgdHJ1ZSwgbm9kZUluZGVudCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgX2xpbmUgPSBzdGF0ZS5saW5lO1xuICAgIGNvbXBvc2VOb2RlKHN0YXRlLCBub2RlSW5kZW50LCBDT05URVhUX0ZMT1dfSU4sIGZhbHNlLCB0cnVlKTtcbiAgICBrZXlUYWcgPSBzdGF0ZS50YWc7XG4gICAga2V5Tm9kZSA9IHN0YXRlLnJlc3VsdDtcbiAgICBza2lwU2VwYXJhdGlvblNwYWNlKHN0YXRlLCB0cnVlLCBub2RlSW5kZW50KTtcblxuICAgIGNoID0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdChzdGF0ZS5wb3NpdGlvbik7XG5cbiAgICBpZiAoKGlzRXhwbGljaXRQYWlyIHx8IHN0YXRlLmxpbmUgPT09IF9saW5lKSAmJiBjaCA9PT0gMHgzQS8qIDogKi8pIHtcbiAgICAgIGlzUGFpciA9IHRydWU7XG4gICAgICBjaCA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoKytzdGF0ZS5wb3NpdGlvbik7XG4gICAgICBza2lwU2VwYXJhdGlvblNwYWNlKHN0YXRlLCB0cnVlLCBub2RlSW5kZW50KTtcbiAgICAgIGNvbXBvc2VOb2RlKHN0YXRlLCBub2RlSW5kZW50LCBDT05URVhUX0ZMT1dfSU4sIGZhbHNlLCB0cnVlKTtcbiAgICAgIHZhbHVlTm9kZSA9IHN0YXRlLnJlc3VsdDtcbiAgICB9XG5cbiAgICBpZiAoaXNNYXBwaW5nKSB7XG4gICAgICBzdG9yZU1hcHBpbmdQYWlyKHN0YXRlLCBfcmVzdWx0LCBvdmVycmlkYWJsZUtleXMsIGtleVRhZywga2V5Tm9kZSwgdmFsdWVOb2RlKTtcbiAgICB9IGVsc2UgaWYgKGlzUGFpcikge1xuICAgICAgX3Jlc3VsdC5wdXNoKHN0b3JlTWFwcGluZ1BhaXIoc3RhdGUsIG51bGwsIG92ZXJyaWRhYmxlS2V5cywga2V5VGFnLCBrZXlOb2RlLCB2YWx1ZU5vZGUpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgX3Jlc3VsdC5wdXNoKGtleU5vZGUpO1xuICAgIH1cblxuICAgIHNraXBTZXBhcmF0aW9uU3BhY2Uoc3RhdGUsIHRydWUsIG5vZGVJbmRlbnQpO1xuXG4gICAgY2ggPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KHN0YXRlLnBvc2l0aW9uKTtcblxuICAgIGlmIChjaCA9PT0gMHgyQy8qICwgKi8pIHtcbiAgICAgIHJlYWROZXh0ID0gdHJ1ZTtcbiAgICAgIGNoID0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdCgrK3N0YXRlLnBvc2l0aW9uKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmVhZE5leHQgPSBmYWxzZTtcbiAgICB9XG4gIH1cblxuICB0aHJvd0Vycm9yKHN0YXRlLCAndW5leHBlY3RlZCBlbmQgb2YgdGhlIHN0cmVhbSB3aXRoaW4gYSBmbG93IGNvbGxlY3Rpb24nKTtcbn1cblxuZnVuY3Rpb24gcmVhZEJsb2NrU2NhbGFyKHN0YXRlLCBub2RlSW5kZW50KSB7XG4gIHZhciBjYXB0dXJlU3RhcnQsXG4gICAgICBmb2xkaW5nLFxuICAgICAgY2hvbXBpbmcgICAgICAgPSBDSE9NUElOR19DTElQLFxuICAgICAgZGV0ZWN0ZWRJbmRlbnQgPSBmYWxzZSxcbiAgICAgIHRleHRJbmRlbnQgICAgID0gbm9kZUluZGVudCxcbiAgICAgIGVtcHR5TGluZXMgICAgID0gMCxcbiAgICAgIGF0TW9yZUluZGVudGVkID0gZmFsc2UsXG4gICAgICB0bXAsXG4gICAgICBjaDtcblxuICBjaCA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoc3RhdGUucG9zaXRpb24pO1xuXG4gIGlmIChjaCA9PT0gMHg3Qy8qIHwgKi8pIHtcbiAgICBmb2xkaW5nID0gZmFsc2U7XG4gIH0gZWxzZSBpZiAoY2ggPT09IDB4M0UvKiA+ICovKSB7XG4gICAgZm9sZGluZyA9IHRydWU7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgc3RhdGUua2luZCA9ICdzY2FsYXInO1xuICBzdGF0ZS5yZXN1bHQgPSAnJztcblxuICB3aGlsZSAoY2ggIT09IDApIHtcbiAgICBjaCA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoKytzdGF0ZS5wb3NpdGlvbik7XG5cbiAgICBpZiAoY2ggPT09IDB4MkIvKiArICovIHx8IGNoID09PSAweDJELyogLSAqLykge1xuICAgICAgaWYgKENIT01QSU5HX0NMSVAgPT09IGNob21waW5nKSB7XG4gICAgICAgIGNob21waW5nID0gKGNoID09PSAweDJCLyogKyAqLykgPyBDSE9NUElOR19LRUVQIDogQ0hPTVBJTkdfU1RSSVA7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvd0Vycm9yKHN0YXRlLCAncmVwZWF0IG9mIGEgY2hvbXBpbmcgbW9kZSBpZGVudGlmaWVyJyk7XG4gICAgICB9XG5cbiAgICB9IGVsc2UgaWYgKCh0bXAgPSBmcm9tRGVjaW1hbENvZGUoY2gpKSA+PSAwKSB7XG4gICAgICBpZiAodG1wID09PSAwKSB7XG4gICAgICAgIHRocm93RXJyb3Ioc3RhdGUsICdiYWQgZXhwbGljaXQgaW5kZW50YXRpb24gd2lkdGggb2YgYSBibG9jayBzY2FsYXI7IGl0IGNhbm5vdCBiZSBsZXNzIHRoYW4gb25lJyk7XG4gICAgICB9IGVsc2UgaWYgKCFkZXRlY3RlZEluZGVudCkge1xuICAgICAgICB0ZXh0SW5kZW50ID0gbm9kZUluZGVudCArIHRtcCAtIDE7XG4gICAgICAgIGRldGVjdGVkSW5kZW50ID0gdHJ1ZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93RXJyb3Ioc3RhdGUsICdyZXBlYXQgb2YgYW4gaW5kZW50YXRpb24gd2lkdGggaWRlbnRpZmllcicpO1xuICAgICAgfVxuXG4gICAgfSBlbHNlIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIGlmIChpc19XSElURV9TUEFDRShjaCkpIHtcbiAgICBkbyB7IGNoID0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdCgrK3N0YXRlLnBvc2l0aW9uKTsgfVxuICAgIHdoaWxlIChpc19XSElURV9TUEFDRShjaCkpO1xuXG4gICAgaWYgKGNoID09PSAweDIzLyogIyAqLykge1xuICAgICAgZG8geyBjaCA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoKytzdGF0ZS5wb3NpdGlvbik7IH1cbiAgICAgIHdoaWxlICghaXNfRU9MKGNoKSAmJiAoY2ggIT09IDApKTtcbiAgICB9XG4gIH1cblxuICB3aGlsZSAoY2ggIT09IDApIHtcbiAgICByZWFkTGluZUJyZWFrKHN0YXRlKTtcbiAgICBzdGF0ZS5saW5lSW5kZW50ID0gMDtcblxuICAgIGNoID0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdChzdGF0ZS5wb3NpdGlvbik7XG5cbiAgICB3aGlsZSAoKCFkZXRlY3RlZEluZGVudCB8fCBzdGF0ZS5saW5lSW5kZW50IDwgdGV4dEluZGVudCkgJiZcbiAgICAgICAgICAgKGNoID09PSAweDIwLyogU3BhY2UgKi8pKSB7XG4gICAgICBzdGF0ZS5saW5lSW5kZW50Kys7XG4gICAgICBjaCA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoKytzdGF0ZS5wb3NpdGlvbik7XG4gICAgfVxuXG4gICAgaWYgKCFkZXRlY3RlZEluZGVudCAmJiBzdGF0ZS5saW5lSW5kZW50ID4gdGV4dEluZGVudCkge1xuICAgICAgdGV4dEluZGVudCA9IHN0YXRlLmxpbmVJbmRlbnQ7XG4gICAgfVxuXG4gICAgaWYgKGlzX0VPTChjaCkpIHtcbiAgICAgIGVtcHR5TGluZXMrKztcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIC8vIEVuZCBvZiB0aGUgc2NhbGFyLlxuICAgIGlmIChzdGF0ZS5saW5lSW5kZW50IDwgdGV4dEluZGVudCkge1xuXG4gICAgICAvLyBQZXJmb3JtIHRoZSBjaG9tcGluZy5cbiAgICAgIGlmIChjaG9tcGluZyA9PT0gQ0hPTVBJTkdfS0VFUCkge1xuICAgICAgICBzdGF0ZS5yZXN1bHQgKz0gY29tbW9uLnJlcGVhdCgnXFxuJywgZW1wdHlMaW5lcyk7XG4gICAgICB9IGVsc2UgaWYgKGNob21waW5nID09PSBDSE9NUElOR19DTElQKSB7XG4gICAgICAgIGlmIChkZXRlY3RlZEluZGVudCkgeyAvLyBpLmUuIG9ubHkgaWYgdGhlIHNjYWxhciBpcyBub3QgZW1wdHkuXG4gICAgICAgICAgc3RhdGUucmVzdWx0ICs9ICdcXG4nO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIEJyZWFrIHRoaXMgYHdoaWxlYCBjeWNsZSBhbmQgZ28gdG8gdGhlIGZ1bmNpdG9uJ3MgZXBpbG9ndWUuXG4gICAgICBicmVhaztcbiAgICB9XG5cbiAgICAvLyBGb2xkZWQgc3R5bGU6IHVzZSBmYW5jeSBydWxlcyB0byBoYW5kbGUgbGluZSBicmVha3MuXG4gICAgaWYgKGZvbGRpbmcpIHtcblxuICAgICAgLy8gTGluZXMgc3RhcnRpbmcgd2l0aCB3aGl0ZSBzcGFjZSBjaGFyYWN0ZXJzIChtb3JlLWluZGVudGVkIGxpbmVzKSBhcmUgbm90IGZvbGRlZC5cbiAgICAgIGlmIChpc19XSElURV9TUEFDRShjaCkpIHtcbiAgICAgICAgYXRNb3JlSW5kZW50ZWQgPSB0cnVlO1xuICAgICAgICBzdGF0ZS5yZXN1bHQgKz0gY29tbW9uLnJlcGVhdCgnXFxuJywgZW1wdHlMaW5lcyArIDEpO1xuXG4gICAgICAvLyBFbmQgb2YgbW9yZS1pbmRlbnRlZCBibG9jay5cbiAgICAgIH0gZWxzZSBpZiAoYXRNb3JlSW5kZW50ZWQpIHtcbiAgICAgICAgYXRNb3JlSW5kZW50ZWQgPSBmYWxzZTtcbiAgICAgICAgc3RhdGUucmVzdWx0ICs9IGNvbW1vbi5yZXBlYXQoJ1xcbicsIGVtcHR5TGluZXMgKyAxKTtcblxuICAgICAgLy8gSnVzdCBvbmUgbGluZSBicmVhayAtIHBlcmNlaXZlIGFzIHRoZSBzYW1lIGxpbmUuXG4gICAgICB9IGVsc2UgaWYgKGVtcHR5TGluZXMgPT09IDApIHtcbiAgICAgICAgaWYgKGRldGVjdGVkSW5kZW50KSB7IC8vIGkuZS4gb25seSBpZiB3ZSBoYXZlIGFscmVhZHkgcmVhZCBzb21lIHNjYWxhciBjb250ZW50LlxuICAgICAgICAgIHN0YXRlLnJlc3VsdCArPSAnICc7XG4gICAgICAgIH1cblxuICAgICAgLy8gU2V2ZXJhbCBsaW5lIGJyZWFrcyAtIHBlcmNlaXZlIGFzIGRpZmZlcmVudCBsaW5lcy5cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHN0YXRlLnJlc3VsdCArPSBjb21tb24ucmVwZWF0KCdcXG4nLCBlbXB0eUxpbmVzKTtcbiAgICAgIH1cblxuICAgIC8vIExpdGVyYWwgc3R5bGU6IGp1c3QgYWRkIGV4YWN0IG51bWJlciBvZiBsaW5lIGJyZWFrcyBiZXR3ZWVuIGNvbnRlbnQgbGluZXMuXG4gICAgfSBlbHNlIGlmIChkZXRlY3RlZEluZGVudCkge1xuICAgICAgLy8gSWYgY3VycmVudCBsaW5lIGlzbid0IHRoZSBmaXJzdCBvbmUgLSBjb3VudCBsaW5lIGJyZWFrIGZyb20gdGhlIGxhc3QgY29udGVudCBsaW5lLlxuICAgICAgc3RhdGUucmVzdWx0ICs9IGNvbW1vbi5yZXBlYXQoJ1xcbicsIGVtcHR5TGluZXMgKyAxKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gSW4gY2FzZSBvZiB0aGUgZmlyc3QgY29udGVudCBsaW5lIC0gY291bnQgb25seSBlbXB0eSBsaW5lcy5cbiAgICAgIHN0YXRlLnJlc3VsdCArPSBjb21tb24ucmVwZWF0KCdcXG4nLCBlbXB0eUxpbmVzKTtcbiAgICB9XG5cbiAgICBkZXRlY3RlZEluZGVudCA9IHRydWU7XG4gICAgZW1wdHlMaW5lcyA9IDA7XG4gICAgY2FwdHVyZVN0YXJ0ID0gc3RhdGUucG9zaXRpb247XG5cbiAgICB3aGlsZSAoIWlzX0VPTChjaCkgJiYgKGNoICE9PSAwKSkge1xuICAgICAgY2ggPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KCsrc3RhdGUucG9zaXRpb24pO1xuICAgIH1cblxuICAgIGNhcHR1cmVTZWdtZW50KHN0YXRlLCBjYXB0dXJlU3RhcnQsIHN0YXRlLnBvc2l0aW9uLCBmYWxzZSk7XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn1cblxuZnVuY3Rpb24gcmVhZEJsb2NrU2VxdWVuY2Uoc3RhdGUsIG5vZGVJbmRlbnQpIHtcbiAgdmFyIF9saW5lLFxuICAgICAgX3RhZyAgICAgID0gc3RhdGUudGFnLFxuICAgICAgX2FuY2hvciAgID0gc3RhdGUuYW5jaG9yLFxuICAgICAgX3Jlc3VsdCAgID0gW10sXG4gICAgICBmb2xsb3dpbmcsXG4gICAgICBkZXRlY3RlZCAgPSBmYWxzZSxcbiAgICAgIGNoO1xuXG4gIGlmIChzdGF0ZS5hbmNob3IgIT09IG51bGwpIHtcbiAgICBzdGF0ZS5hbmNob3JNYXBbc3RhdGUuYW5jaG9yXSA9IF9yZXN1bHQ7XG4gIH1cblxuICBjaCA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoc3RhdGUucG9zaXRpb24pO1xuXG4gIHdoaWxlIChjaCAhPT0gMCkge1xuXG4gICAgaWYgKGNoICE9PSAweDJELyogLSAqLykge1xuICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgZm9sbG93aW5nID0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdChzdGF0ZS5wb3NpdGlvbiArIDEpO1xuXG4gICAgaWYgKCFpc19XU19PUl9FT0woZm9sbG93aW5nKSkge1xuICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgZGV0ZWN0ZWQgPSB0cnVlO1xuICAgIHN0YXRlLnBvc2l0aW9uKys7XG5cbiAgICBpZiAoc2tpcFNlcGFyYXRpb25TcGFjZShzdGF0ZSwgdHJ1ZSwgLTEpKSB7XG4gICAgICBpZiAoc3RhdGUubGluZUluZGVudCA8PSBub2RlSW5kZW50KSB7XG4gICAgICAgIF9yZXN1bHQucHVzaChudWxsKTtcbiAgICAgICAgY2ggPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KHN0YXRlLnBvc2l0aW9uKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgX2xpbmUgPSBzdGF0ZS5saW5lO1xuICAgIGNvbXBvc2VOb2RlKHN0YXRlLCBub2RlSW5kZW50LCBDT05URVhUX0JMT0NLX0lOLCBmYWxzZSwgdHJ1ZSk7XG4gICAgX3Jlc3VsdC5wdXNoKHN0YXRlLnJlc3VsdCk7XG4gICAgc2tpcFNlcGFyYXRpb25TcGFjZShzdGF0ZSwgdHJ1ZSwgLTEpO1xuXG4gICAgY2ggPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KHN0YXRlLnBvc2l0aW9uKTtcblxuICAgIGlmICgoc3RhdGUubGluZSA9PT0gX2xpbmUgfHwgc3RhdGUubGluZUluZGVudCA+IG5vZGVJbmRlbnQpICYmIChjaCAhPT0gMCkpIHtcbiAgICAgIHRocm93RXJyb3Ioc3RhdGUsICdiYWQgaW5kZW50YXRpb24gb2YgYSBzZXF1ZW5jZSBlbnRyeScpO1xuICAgIH0gZWxzZSBpZiAoc3RhdGUubGluZUluZGVudCA8IG5vZGVJbmRlbnQpIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIGlmIChkZXRlY3RlZCkge1xuICAgIHN0YXRlLnRhZyA9IF90YWc7XG4gICAgc3RhdGUuYW5jaG9yID0gX2FuY2hvcjtcbiAgICBzdGF0ZS5raW5kID0gJ3NlcXVlbmNlJztcbiAgICBzdGF0ZS5yZXN1bHQgPSBfcmVzdWx0O1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cblxuZnVuY3Rpb24gcmVhZEJsb2NrTWFwcGluZyhzdGF0ZSwgbm9kZUluZGVudCwgZmxvd0luZGVudCkge1xuICB2YXIgZm9sbG93aW5nLFxuICAgICAgYWxsb3dDb21wYWN0LFxuICAgICAgX2xpbmUsXG4gICAgICBfdGFnICAgICAgICAgID0gc3RhdGUudGFnLFxuICAgICAgX2FuY2hvciAgICAgICA9IHN0YXRlLmFuY2hvcixcbiAgICAgIF9yZXN1bHQgICAgICAgPSB7fSxcbiAgICAgIG92ZXJyaWRhYmxlS2V5cyA9IHt9LFxuICAgICAga2V5VGFnICAgICAgICA9IG51bGwsXG4gICAgICBrZXlOb2RlICAgICAgID0gbnVsbCxcbiAgICAgIHZhbHVlTm9kZSAgICAgPSBudWxsLFxuICAgICAgYXRFeHBsaWNpdEtleSA9IGZhbHNlLFxuICAgICAgZGV0ZWN0ZWQgICAgICA9IGZhbHNlLFxuICAgICAgY2g7XG5cbiAgaWYgKHN0YXRlLmFuY2hvciAhPT0gbnVsbCkge1xuICAgIHN0YXRlLmFuY2hvck1hcFtzdGF0ZS5hbmNob3JdID0gX3Jlc3VsdDtcbiAgfVxuXG4gIGNoID0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdChzdGF0ZS5wb3NpdGlvbik7XG5cbiAgd2hpbGUgKGNoICE9PSAwKSB7XG4gICAgZm9sbG93aW5nID0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdChzdGF0ZS5wb3NpdGlvbiArIDEpO1xuICAgIF9saW5lID0gc3RhdGUubGluZTsgLy8gU2F2ZSB0aGUgY3VycmVudCBsaW5lLlxuXG4gICAgLy9cbiAgICAvLyBFeHBsaWNpdCBub3RhdGlvbiBjYXNlLiBUaGVyZSBhcmUgdHdvIHNlcGFyYXRlIGJsb2NrczpcbiAgICAvLyBmaXJzdCBmb3IgdGhlIGtleSAoZGVub3RlZCBieSBcIj9cIikgYW5kIHNlY29uZCBmb3IgdGhlIHZhbHVlIChkZW5vdGVkIGJ5IFwiOlwiKVxuICAgIC8vXG4gICAgaWYgKChjaCA9PT0gMHgzRi8qID8gKi8gfHwgY2ggPT09IDB4M0EvKiA6ICovKSAmJiBpc19XU19PUl9FT0woZm9sbG93aW5nKSkge1xuXG4gICAgICBpZiAoY2ggPT09IDB4M0YvKiA/ICovKSB7XG4gICAgICAgIGlmIChhdEV4cGxpY2l0S2V5KSB7XG4gICAgICAgICAgc3RvcmVNYXBwaW5nUGFpcihzdGF0ZSwgX3Jlc3VsdCwgb3ZlcnJpZGFibGVLZXlzLCBrZXlUYWcsIGtleU5vZGUsIG51bGwpO1xuICAgICAgICAgIGtleVRhZyA9IGtleU5vZGUgPSB2YWx1ZU5vZGUgPSBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgZGV0ZWN0ZWQgPSB0cnVlO1xuICAgICAgICBhdEV4cGxpY2l0S2V5ID0gdHJ1ZTtcbiAgICAgICAgYWxsb3dDb21wYWN0ID0gdHJ1ZTtcblxuICAgICAgfSBlbHNlIGlmIChhdEV4cGxpY2l0S2V5KSB7XG4gICAgICAgIC8vIGkuZS4gMHgzQS8qIDogKi8gPT09IGNoYXJhY3RlciBhZnRlciB0aGUgZXhwbGljaXQga2V5LlxuICAgICAgICBhdEV4cGxpY2l0S2V5ID0gZmFsc2U7XG4gICAgICAgIGFsbG93Q29tcGFjdCA9IHRydWU7XG5cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93RXJyb3Ioc3RhdGUsICdpbmNvbXBsZXRlIGV4cGxpY2l0IG1hcHBpbmcgcGFpcjsgYSBrZXkgbm9kZSBpcyBtaXNzZWQnKTtcbiAgICAgIH1cblxuICAgICAgc3RhdGUucG9zaXRpb24gKz0gMTtcbiAgICAgIGNoID0gZm9sbG93aW5nO1xuXG4gICAgLy9cbiAgICAvLyBJbXBsaWNpdCBub3RhdGlvbiBjYXNlLiBGbG93LXN0eWxlIG5vZGUgYXMgdGhlIGtleSBmaXJzdCwgdGhlbiBcIjpcIiwgYW5kIHRoZSB2YWx1ZS5cbiAgICAvL1xuICAgIH0gZWxzZSBpZiAoY29tcG9zZU5vZGUoc3RhdGUsIGZsb3dJbmRlbnQsIENPTlRFWFRfRkxPV19PVVQsIGZhbHNlLCB0cnVlKSkge1xuXG4gICAgICBpZiAoc3RhdGUubGluZSA9PT0gX2xpbmUpIHtcbiAgICAgICAgY2ggPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KHN0YXRlLnBvc2l0aW9uKTtcblxuICAgICAgICB3aGlsZSAoaXNfV0hJVEVfU1BBQ0UoY2gpKSB7XG4gICAgICAgICAgY2ggPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KCsrc3RhdGUucG9zaXRpb24pO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNoID09PSAweDNBLyogOiAqLykge1xuICAgICAgICAgIGNoID0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdCgrK3N0YXRlLnBvc2l0aW9uKTtcblxuICAgICAgICAgIGlmICghaXNfV1NfT1JfRU9MKGNoKSkge1xuICAgICAgICAgICAgdGhyb3dFcnJvcihzdGF0ZSwgJ2Egd2hpdGVzcGFjZSBjaGFyYWN0ZXIgaXMgZXhwZWN0ZWQgYWZ0ZXIgdGhlIGtleS12YWx1ZSBzZXBhcmF0b3Igd2l0aGluIGEgYmxvY2sgbWFwcGluZycpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChhdEV4cGxpY2l0S2V5KSB7XG4gICAgICAgICAgICBzdG9yZU1hcHBpbmdQYWlyKHN0YXRlLCBfcmVzdWx0LCBvdmVycmlkYWJsZUtleXMsIGtleVRhZywga2V5Tm9kZSwgbnVsbCk7XG4gICAgICAgICAgICBrZXlUYWcgPSBrZXlOb2RlID0gdmFsdWVOb2RlID0gbnVsbDtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBkZXRlY3RlZCA9IHRydWU7XG4gICAgICAgICAgYXRFeHBsaWNpdEtleSA9IGZhbHNlO1xuICAgICAgICAgIGFsbG93Q29tcGFjdCA9IGZhbHNlO1xuICAgICAgICAgIGtleVRhZyA9IHN0YXRlLnRhZztcbiAgICAgICAgICBrZXlOb2RlID0gc3RhdGUucmVzdWx0O1xuXG4gICAgICAgIH0gZWxzZSBpZiAoZGV0ZWN0ZWQpIHtcbiAgICAgICAgICB0aHJvd0Vycm9yKHN0YXRlLCAnY2FuIG5vdCByZWFkIGFuIGltcGxpY2l0IG1hcHBpbmcgcGFpcjsgYSBjb2xvbiBpcyBtaXNzZWQnKTtcblxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHN0YXRlLnRhZyA9IF90YWc7XG4gICAgICAgICAgc3RhdGUuYW5jaG9yID0gX2FuY2hvcjtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTsgLy8gS2VlcCB0aGUgcmVzdWx0IG9mIGBjb21wb3NlTm9kZWAuXG4gICAgICAgIH1cblxuICAgICAgfSBlbHNlIGlmIChkZXRlY3RlZCkge1xuICAgICAgICB0aHJvd0Vycm9yKHN0YXRlLCAnY2FuIG5vdCByZWFkIGEgYmxvY2sgbWFwcGluZyBlbnRyeTsgYSBtdWx0aWxpbmUga2V5IG1heSBub3QgYmUgYW4gaW1wbGljaXQga2V5Jyk7XG5cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHN0YXRlLnRhZyA9IF90YWc7XG4gICAgICAgIHN0YXRlLmFuY2hvciA9IF9hbmNob3I7XG4gICAgICAgIHJldHVybiB0cnVlOyAvLyBLZWVwIHRoZSByZXN1bHQgb2YgYGNvbXBvc2VOb2RlYC5cbiAgICAgIH1cblxuICAgIH0gZWxzZSB7XG4gICAgICBicmVhazsgLy8gUmVhZGluZyBpcyBkb25lLiBHbyB0byB0aGUgZXBpbG9ndWUuXG4gICAgfVxuXG4gICAgLy9cbiAgICAvLyBDb21tb24gcmVhZGluZyBjb2RlIGZvciBib3RoIGV4cGxpY2l0IGFuZCBpbXBsaWNpdCBub3RhdGlvbnMuXG4gICAgLy9cbiAgICBpZiAoc3RhdGUubGluZSA9PT0gX2xpbmUgfHwgc3RhdGUubGluZUluZGVudCA+IG5vZGVJbmRlbnQpIHtcbiAgICAgIGlmIChjb21wb3NlTm9kZShzdGF0ZSwgbm9kZUluZGVudCwgQ09OVEVYVF9CTE9DS19PVVQsIHRydWUsIGFsbG93Q29tcGFjdCkpIHtcbiAgICAgICAgaWYgKGF0RXhwbGljaXRLZXkpIHtcbiAgICAgICAgICBrZXlOb2RlID0gc3RhdGUucmVzdWx0O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHZhbHVlTm9kZSA9IHN0YXRlLnJlc3VsdDtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoIWF0RXhwbGljaXRLZXkpIHtcbiAgICAgICAgc3RvcmVNYXBwaW5nUGFpcihzdGF0ZSwgX3Jlc3VsdCwgb3ZlcnJpZGFibGVLZXlzLCBrZXlUYWcsIGtleU5vZGUsIHZhbHVlTm9kZSk7XG4gICAgICAgIGtleVRhZyA9IGtleU5vZGUgPSB2YWx1ZU5vZGUgPSBudWxsO1xuICAgICAgfVxuXG4gICAgICBza2lwU2VwYXJhdGlvblNwYWNlKHN0YXRlLCB0cnVlLCAtMSk7XG4gICAgICBjaCA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoc3RhdGUucG9zaXRpb24pO1xuICAgIH1cblxuICAgIGlmIChzdGF0ZS5saW5lSW5kZW50ID4gbm9kZUluZGVudCAmJiAoY2ggIT09IDApKSB7XG4gICAgICB0aHJvd0Vycm9yKHN0YXRlLCAnYmFkIGluZGVudGF0aW9uIG9mIGEgbWFwcGluZyBlbnRyeScpO1xuICAgIH0gZWxzZSBpZiAoc3RhdGUubGluZUluZGVudCA8IG5vZGVJbmRlbnQpIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIC8vXG4gIC8vIEVwaWxvZ3VlLlxuICAvL1xuXG4gIC8vIFNwZWNpYWwgY2FzZTogbGFzdCBtYXBwaW5nJ3Mgbm9kZSBjb250YWlucyBvbmx5IHRoZSBrZXkgaW4gZXhwbGljaXQgbm90YXRpb24uXG4gIGlmIChhdEV4cGxpY2l0S2V5KSB7XG4gICAgc3RvcmVNYXBwaW5nUGFpcihzdGF0ZSwgX3Jlc3VsdCwgb3ZlcnJpZGFibGVLZXlzLCBrZXlUYWcsIGtleU5vZGUsIG51bGwpO1xuICB9XG5cbiAgLy8gRXhwb3NlIHRoZSByZXN1bHRpbmcgbWFwcGluZy5cbiAgaWYgKGRldGVjdGVkKSB7XG4gICAgc3RhdGUudGFnID0gX3RhZztcbiAgICBzdGF0ZS5hbmNob3IgPSBfYW5jaG9yO1xuICAgIHN0YXRlLmtpbmQgPSAnbWFwcGluZyc7XG4gICAgc3RhdGUucmVzdWx0ID0gX3Jlc3VsdDtcbiAgfVxuXG4gIHJldHVybiBkZXRlY3RlZDtcbn1cblxuZnVuY3Rpb24gcmVhZFRhZ1Byb3BlcnR5KHN0YXRlKSB7XG4gIHZhciBfcG9zaXRpb24sXG4gICAgICBpc1ZlcmJhdGltID0gZmFsc2UsXG4gICAgICBpc05hbWVkICAgID0gZmFsc2UsXG4gICAgICB0YWdIYW5kbGUsXG4gICAgICB0YWdOYW1lLFxuICAgICAgY2g7XG5cbiAgY2ggPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KHN0YXRlLnBvc2l0aW9uKTtcblxuICBpZiAoY2ggIT09IDB4MjEvKiAhICovKSByZXR1cm4gZmFsc2U7XG5cbiAgaWYgKHN0YXRlLnRhZyAhPT0gbnVsbCkge1xuICAgIHRocm93RXJyb3Ioc3RhdGUsICdkdXBsaWNhdGlvbiBvZiBhIHRhZyBwcm9wZXJ0eScpO1xuICB9XG5cbiAgY2ggPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KCsrc3RhdGUucG9zaXRpb24pO1xuXG4gIGlmIChjaCA9PT0gMHgzQy8qIDwgKi8pIHtcbiAgICBpc1ZlcmJhdGltID0gdHJ1ZTtcbiAgICBjaCA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoKytzdGF0ZS5wb3NpdGlvbik7XG5cbiAgfSBlbHNlIGlmIChjaCA9PT0gMHgyMS8qICEgKi8pIHtcbiAgICBpc05hbWVkID0gdHJ1ZTtcbiAgICB0YWdIYW5kbGUgPSAnISEnO1xuICAgIGNoID0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdCgrK3N0YXRlLnBvc2l0aW9uKTtcblxuICB9IGVsc2Uge1xuICAgIHRhZ0hhbmRsZSA9ICchJztcbiAgfVxuXG4gIF9wb3NpdGlvbiA9IHN0YXRlLnBvc2l0aW9uO1xuXG4gIGlmIChpc1ZlcmJhdGltKSB7XG4gICAgZG8geyBjaCA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoKytzdGF0ZS5wb3NpdGlvbik7IH1cbiAgICB3aGlsZSAoY2ggIT09IDAgJiYgY2ggIT09IDB4M0UvKiA+ICovKTtcblxuICAgIGlmIChzdGF0ZS5wb3NpdGlvbiA8IHN0YXRlLmxlbmd0aCkge1xuICAgICAgdGFnTmFtZSA9IHN0YXRlLmlucHV0LnNsaWNlKF9wb3NpdGlvbiwgc3RhdGUucG9zaXRpb24pO1xuICAgICAgY2ggPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KCsrc3RhdGUucG9zaXRpb24pO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvd0Vycm9yKHN0YXRlLCAndW5leHBlY3RlZCBlbmQgb2YgdGhlIHN0cmVhbSB3aXRoaW4gYSB2ZXJiYXRpbSB0YWcnKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgd2hpbGUgKGNoICE9PSAwICYmICFpc19XU19PUl9FT0woY2gpKSB7XG5cbiAgICAgIGlmIChjaCA9PT0gMHgyMS8qICEgKi8pIHtcbiAgICAgICAgaWYgKCFpc05hbWVkKSB7XG4gICAgICAgICAgdGFnSGFuZGxlID0gc3RhdGUuaW5wdXQuc2xpY2UoX3Bvc2l0aW9uIC0gMSwgc3RhdGUucG9zaXRpb24gKyAxKTtcblxuICAgICAgICAgIGlmICghUEFUVEVSTl9UQUdfSEFORExFLnRlc3QodGFnSGFuZGxlKSkge1xuICAgICAgICAgICAgdGhyb3dFcnJvcihzdGF0ZSwgJ25hbWVkIHRhZyBoYW5kbGUgY2Fubm90IGNvbnRhaW4gc3VjaCBjaGFyYWN0ZXJzJyk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaXNOYW1lZCA9IHRydWU7XG4gICAgICAgICAgX3Bvc2l0aW9uID0gc3RhdGUucG9zaXRpb24gKyAxO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRocm93RXJyb3Ioc3RhdGUsICd0YWcgc3VmZml4IGNhbm5vdCBjb250YWluIGV4Y2xhbWF0aW9uIG1hcmtzJyk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgY2ggPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KCsrc3RhdGUucG9zaXRpb24pO1xuICAgIH1cblxuICAgIHRhZ05hbWUgPSBzdGF0ZS5pbnB1dC5zbGljZShfcG9zaXRpb24sIHN0YXRlLnBvc2l0aW9uKTtcblxuICAgIGlmIChQQVRURVJOX0ZMT1dfSU5ESUNBVE9SUy50ZXN0KHRhZ05hbWUpKSB7XG4gICAgICB0aHJvd0Vycm9yKHN0YXRlLCAndGFnIHN1ZmZpeCBjYW5ub3QgY29udGFpbiBmbG93IGluZGljYXRvciBjaGFyYWN0ZXJzJyk7XG4gICAgfVxuICB9XG5cbiAgaWYgKHRhZ05hbWUgJiYgIVBBVFRFUk5fVEFHX1VSSS50ZXN0KHRhZ05hbWUpKSB7XG4gICAgdGhyb3dFcnJvcihzdGF0ZSwgJ3RhZyBuYW1lIGNhbm5vdCBjb250YWluIHN1Y2ggY2hhcmFjdGVyczogJyArIHRhZ05hbWUpO1xuICB9XG5cbiAgaWYgKGlzVmVyYmF0aW0pIHtcbiAgICBzdGF0ZS50YWcgPSB0YWdOYW1lO1xuXG4gIH0gZWxzZSBpZiAoX2hhc093blByb3BlcnR5LmNhbGwoc3RhdGUudGFnTWFwLCB0YWdIYW5kbGUpKSB7XG4gICAgc3RhdGUudGFnID0gc3RhdGUudGFnTWFwW3RhZ0hhbmRsZV0gKyB0YWdOYW1lO1xuXG4gIH0gZWxzZSBpZiAodGFnSGFuZGxlID09PSAnIScpIHtcbiAgICBzdGF0ZS50YWcgPSAnIScgKyB0YWdOYW1lO1xuXG4gIH0gZWxzZSBpZiAodGFnSGFuZGxlID09PSAnISEnKSB7XG4gICAgc3RhdGUudGFnID0gJ3RhZzp5YW1sLm9yZywyMDAyOicgKyB0YWdOYW1lO1xuXG4gIH0gZWxzZSB7XG4gICAgdGhyb3dFcnJvcihzdGF0ZSwgJ3VuZGVjbGFyZWQgdGFnIGhhbmRsZSBcIicgKyB0YWdIYW5kbGUgKyAnXCInKTtcbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufVxuXG5mdW5jdGlvbiByZWFkQW5jaG9yUHJvcGVydHkoc3RhdGUpIHtcbiAgdmFyIF9wb3NpdGlvbixcbiAgICAgIGNoO1xuXG4gIGNoID0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdChzdGF0ZS5wb3NpdGlvbik7XG5cbiAgaWYgKGNoICE9PSAweDI2LyogJiAqLykgcmV0dXJuIGZhbHNlO1xuXG4gIGlmIChzdGF0ZS5hbmNob3IgIT09IG51bGwpIHtcbiAgICB0aHJvd0Vycm9yKHN0YXRlLCAnZHVwbGljYXRpb24gb2YgYW4gYW5jaG9yIHByb3BlcnR5Jyk7XG4gIH1cblxuICBjaCA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoKytzdGF0ZS5wb3NpdGlvbik7XG4gIF9wb3NpdGlvbiA9IHN0YXRlLnBvc2l0aW9uO1xuXG4gIHdoaWxlIChjaCAhPT0gMCAmJiAhaXNfV1NfT1JfRU9MKGNoKSAmJiAhaXNfRkxPV19JTkRJQ0FUT1IoY2gpKSB7XG4gICAgY2ggPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KCsrc3RhdGUucG9zaXRpb24pO1xuICB9XG5cbiAgaWYgKHN0YXRlLnBvc2l0aW9uID09PSBfcG9zaXRpb24pIHtcbiAgICB0aHJvd0Vycm9yKHN0YXRlLCAnbmFtZSBvZiBhbiBhbmNob3Igbm9kZSBtdXN0IGNvbnRhaW4gYXQgbGVhc3Qgb25lIGNoYXJhY3RlcicpO1xuICB9XG5cbiAgc3RhdGUuYW5jaG9yID0gc3RhdGUuaW5wdXQuc2xpY2UoX3Bvc2l0aW9uLCBzdGF0ZS5wb3NpdGlvbik7XG4gIHJldHVybiB0cnVlO1xufVxuXG5mdW5jdGlvbiByZWFkQWxpYXMoc3RhdGUpIHtcbiAgdmFyIF9wb3NpdGlvbiwgYWxpYXMsXG4gICAgICBjaDtcblxuICBjaCA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoc3RhdGUucG9zaXRpb24pO1xuXG4gIGlmIChjaCAhPT0gMHgyQS8qICogKi8pIHJldHVybiBmYWxzZTtcblxuICBjaCA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoKytzdGF0ZS5wb3NpdGlvbik7XG4gIF9wb3NpdGlvbiA9IHN0YXRlLnBvc2l0aW9uO1xuXG4gIHdoaWxlIChjaCAhPT0gMCAmJiAhaXNfV1NfT1JfRU9MKGNoKSAmJiAhaXNfRkxPV19JTkRJQ0FUT1IoY2gpKSB7XG4gICAgY2ggPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KCsrc3RhdGUucG9zaXRpb24pO1xuICB9XG5cbiAgaWYgKHN0YXRlLnBvc2l0aW9uID09PSBfcG9zaXRpb24pIHtcbiAgICB0aHJvd0Vycm9yKHN0YXRlLCAnbmFtZSBvZiBhbiBhbGlhcyBub2RlIG11c3QgY29udGFpbiBhdCBsZWFzdCBvbmUgY2hhcmFjdGVyJyk7XG4gIH1cblxuICBhbGlhcyA9IHN0YXRlLmlucHV0LnNsaWNlKF9wb3NpdGlvbiwgc3RhdGUucG9zaXRpb24pO1xuXG4gIGlmICghc3RhdGUuYW5jaG9yTWFwLmhhc093blByb3BlcnR5KGFsaWFzKSkge1xuICAgIHRocm93RXJyb3Ioc3RhdGUsICd1bmlkZW50aWZpZWQgYWxpYXMgXCInICsgYWxpYXMgKyAnXCInKTtcbiAgfVxuXG4gIHN0YXRlLnJlc3VsdCA9IHN0YXRlLmFuY2hvck1hcFthbGlhc107XG4gIHNraXBTZXBhcmF0aW9uU3BhY2Uoc3RhdGUsIHRydWUsIC0xKTtcbiAgcmV0dXJuIHRydWU7XG59XG5cbmZ1bmN0aW9uIGNvbXBvc2VOb2RlKHN0YXRlLCBwYXJlbnRJbmRlbnQsIG5vZGVDb250ZXh0LCBhbGxvd1RvU2VlaywgYWxsb3dDb21wYWN0KSB7XG4gIHZhciBhbGxvd0Jsb2NrU3R5bGVzLFxuICAgICAgYWxsb3dCbG9ja1NjYWxhcnMsXG4gICAgICBhbGxvd0Jsb2NrQ29sbGVjdGlvbnMsXG4gICAgICBpbmRlbnRTdGF0dXMgPSAxLCAvLyAxOiB0aGlzPnBhcmVudCwgMDogdGhpcz1wYXJlbnQsIC0xOiB0aGlzPHBhcmVudFxuICAgICAgYXROZXdMaW5lICA9IGZhbHNlLFxuICAgICAgaGFzQ29udGVudCA9IGZhbHNlLFxuICAgICAgdHlwZUluZGV4LFxuICAgICAgdHlwZVF1YW50aXR5LFxuICAgICAgdHlwZSxcbiAgICAgIGZsb3dJbmRlbnQsXG4gICAgICBibG9ja0luZGVudDtcblxuICBpZiAoc3RhdGUubGlzdGVuZXIgIT09IG51bGwpIHtcbiAgICBzdGF0ZS5saXN0ZW5lcignb3BlbicsIHN0YXRlKTtcbiAgfVxuXG4gIHN0YXRlLnRhZyAgICA9IG51bGw7XG4gIHN0YXRlLmFuY2hvciA9IG51bGw7XG4gIHN0YXRlLmtpbmQgICA9IG51bGw7XG4gIHN0YXRlLnJlc3VsdCA9IG51bGw7XG5cbiAgYWxsb3dCbG9ja1N0eWxlcyA9IGFsbG93QmxvY2tTY2FsYXJzID0gYWxsb3dCbG9ja0NvbGxlY3Rpb25zID1cbiAgICBDT05URVhUX0JMT0NLX09VVCA9PT0gbm9kZUNvbnRleHQgfHxcbiAgICBDT05URVhUX0JMT0NLX0lOICA9PT0gbm9kZUNvbnRleHQ7XG5cbiAgaWYgKGFsbG93VG9TZWVrKSB7XG4gICAgaWYgKHNraXBTZXBhcmF0aW9uU3BhY2Uoc3RhdGUsIHRydWUsIC0xKSkge1xuICAgICAgYXROZXdMaW5lID0gdHJ1ZTtcblxuICAgICAgaWYgKHN0YXRlLmxpbmVJbmRlbnQgPiBwYXJlbnRJbmRlbnQpIHtcbiAgICAgICAgaW5kZW50U3RhdHVzID0gMTtcbiAgICAgIH0gZWxzZSBpZiAoc3RhdGUubGluZUluZGVudCA9PT0gcGFyZW50SW5kZW50KSB7XG4gICAgICAgIGluZGVudFN0YXR1cyA9IDA7XG4gICAgICB9IGVsc2UgaWYgKHN0YXRlLmxpbmVJbmRlbnQgPCBwYXJlbnRJbmRlbnQpIHtcbiAgICAgICAgaW5kZW50U3RhdHVzID0gLTE7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgaWYgKGluZGVudFN0YXR1cyA9PT0gMSkge1xuICAgIHdoaWxlIChyZWFkVGFnUHJvcGVydHkoc3RhdGUpIHx8IHJlYWRBbmNob3JQcm9wZXJ0eShzdGF0ZSkpIHtcbiAgICAgIGlmIChza2lwU2VwYXJhdGlvblNwYWNlKHN0YXRlLCB0cnVlLCAtMSkpIHtcbiAgICAgICAgYXROZXdMaW5lID0gdHJ1ZTtcbiAgICAgICAgYWxsb3dCbG9ja0NvbGxlY3Rpb25zID0gYWxsb3dCbG9ja1N0eWxlcztcblxuICAgICAgICBpZiAoc3RhdGUubGluZUluZGVudCA+IHBhcmVudEluZGVudCkge1xuICAgICAgICAgIGluZGVudFN0YXR1cyA9IDE7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdGUubGluZUluZGVudCA9PT0gcGFyZW50SW5kZW50KSB7XG4gICAgICAgICAgaW5kZW50U3RhdHVzID0gMDtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0ZS5saW5lSW5kZW50IDwgcGFyZW50SW5kZW50KSB7XG4gICAgICAgICAgaW5kZW50U3RhdHVzID0gLTE7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGFsbG93QmxvY2tDb2xsZWN0aW9ucyA9IGZhbHNlO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGlmIChhbGxvd0Jsb2NrQ29sbGVjdGlvbnMpIHtcbiAgICBhbGxvd0Jsb2NrQ29sbGVjdGlvbnMgPSBhdE5ld0xpbmUgfHwgYWxsb3dDb21wYWN0O1xuICB9XG5cbiAgaWYgKGluZGVudFN0YXR1cyA9PT0gMSB8fCBDT05URVhUX0JMT0NLX09VVCA9PT0gbm9kZUNvbnRleHQpIHtcbiAgICBpZiAoQ09OVEVYVF9GTE9XX0lOID09PSBub2RlQ29udGV4dCB8fCBDT05URVhUX0ZMT1dfT1VUID09PSBub2RlQ29udGV4dCkge1xuICAgICAgZmxvd0luZGVudCA9IHBhcmVudEluZGVudDtcbiAgICB9IGVsc2Uge1xuICAgICAgZmxvd0luZGVudCA9IHBhcmVudEluZGVudCArIDE7XG4gICAgfVxuXG4gICAgYmxvY2tJbmRlbnQgPSBzdGF0ZS5wb3NpdGlvbiAtIHN0YXRlLmxpbmVTdGFydDtcblxuICAgIGlmIChpbmRlbnRTdGF0dXMgPT09IDEpIHtcbiAgICAgIGlmIChhbGxvd0Jsb2NrQ29sbGVjdGlvbnMgJiZcbiAgICAgICAgICAocmVhZEJsb2NrU2VxdWVuY2Uoc3RhdGUsIGJsb2NrSW5kZW50KSB8fFxuICAgICAgICAgICByZWFkQmxvY2tNYXBwaW5nKHN0YXRlLCBibG9ja0luZGVudCwgZmxvd0luZGVudCkpIHx8XG4gICAgICAgICAgcmVhZEZsb3dDb2xsZWN0aW9uKHN0YXRlLCBmbG93SW5kZW50KSkge1xuICAgICAgICBoYXNDb250ZW50ID0gdHJ1ZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmICgoYWxsb3dCbG9ja1NjYWxhcnMgJiYgcmVhZEJsb2NrU2NhbGFyKHN0YXRlLCBmbG93SW5kZW50KSkgfHxcbiAgICAgICAgICAgIHJlYWRTaW5nbGVRdW90ZWRTY2FsYXIoc3RhdGUsIGZsb3dJbmRlbnQpIHx8XG4gICAgICAgICAgICByZWFkRG91YmxlUXVvdGVkU2NhbGFyKHN0YXRlLCBmbG93SW5kZW50KSkge1xuICAgICAgICAgIGhhc0NvbnRlbnQgPSB0cnVlO1xuXG4gICAgICAgIH0gZWxzZSBpZiAocmVhZEFsaWFzKHN0YXRlKSkge1xuICAgICAgICAgIGhhc0NvbnRlbnQgPSB0cnVlO1xuXG4gICAgICAgICAgaWYgKHN0YXRlLnRhZyAhPT0gbnVsbCB8fCBzdGF0ZS5hbmNob3IgIT09IG51bGwpIHtcbiAgICAgICAgICAgIHRocm93RXJyb3Ioc3RhdGUsICdhbGlhcyBub2RlIHNob3VsZCBub3QgaGF2ZSBhbnkgcHJvcGVydGllcycpO1xuICAgICAgICAgIH1cblxuICAgICAgICB9IGVsc2UgaWYgKHJlYWRQbGFpblNjYWxhcihzdGF0ZSwgZmxvd0luZGVudCwgQ09OVEVYVF9GTE9XX0lOID09PSBub2RlQ29udGV4dCkpIHtcbiAgICAgICAgICBoYXNDb250ZW50ID0gdHJ1ZTtcblxuICAgICAgICAgIGlmIChzdGF0ZS50YWcgPT09IG51bGwpIHtcbiAgICAgICAgICAgIHN0YXRlLnRhZyA9ICc/JztcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoc3RhdGUuYW5jaG9yICE9PSBudWxsKSB7XG4gICAgICAgICAgc3RhdGUuYW5jaG9yTWFwW3N0YXRlLmFuY2hvcl0gPSBzdGF0ZS5yZXN1bHQ7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGluZGVudFN0YXR1cyA9PT0gMCkge1xuICAgICAgLy8gU3BlY2lhbCBjYXNlOiBibG9jayBzZXF1ZW5jZXMgYXJlIGFsbG93ZWQgdG8gaGF2ZSBzYW1lIGluZGVudGF0aW9uIGxldmVsIGFzIHRoZSBwYXJlbnQuXG4gICAgICAvLyBodHRwOi8vd3d3LnlhbWwub3JnL3NwZWMvMS4yL3NwZWMuaHRtbCNpZDI3OTk3ODRcbiAgICAgIGhhc0NvbnRlbnQgPSBhbGxvd0Jsb2NrQ29sbGVjdGlvbnMgJiYgcmVhZEJsb2NrU2VxdWVuY2Uoc3RhdGUsIGJsb2NrSW5kZW50KTtcbiAgICB9XG4gIH1cblxuICBpZiAoc3RhdGUudGFnICE9PSBudWxsICYmIHN0YXRlLnRhZyAhPT0gJyEnKSB7XG4gICAgaWYgKHN0YXRlLnRhZyA9PT0gJz8nKSB7XG4gICAgICBmb3IgKHR5cGVJbmRleCA9IDAsIHR5cGVRdWFudGl0eSA9IHN0YXRlLmltcGxpY2l0VHlwZXMubGVuZ3RoO1xuICAgICAgICAgICB0eXBlSW5kZXggPCB0eXBlUXVhbnRpdHk7XG4gICAgICAgICAgIHR5cGVJbmRleCArPSAxKSB7XG4gICAgICAgIHR5cGUgPSBzdGF0ZS5pbXBsaWNpdFR5cGVzW3R5cGVJbmRleF07XG5cbiAgICAgICAgLy8gSW1wbGljaXQgcmVzb2x2aW5nIGlzIG5vdCBhbGxvd2VkIGZvciBub24tc2NhbGFyIHR5cGVzLCBhbmQgJz8nXG4gICAgICAgIC8vIG5vbi1zcGVjaWZpYyB0YWcgaXMgb25seSBhc3NpZ25lZCB0byBwbGFpbiBzY2FsYXJzLiBTbywgaXQgaXNuJ3RcbiAgICAgICAgLy8gbmVlZGVkIHRvIGNoZWNrIGZvciAna2luZCcgY29uZm9ybWl0eS5cblxuICAgICAgICBpZiAodHlwZS5yZXNvbHZlKHN0YXRlLnJlc3VsdCkpIHsgLy8gYHN0YXRlLnJlc3VsdGAgdXBkYXRlZCBpbiByZXNvbHZlciBpZiBtYXRjaGVkXG4gICAgICAgICAgc3RhdGUucmVzdWx0ID0gdHlwZS5jb25zdHJ1Y3Qoc3RhdGUucmVzdWx0KTtcbiAgICAgICAgICBzdGF0ZS50YWcgPSB0eXBlLnRhZztcbiAgICAgICAgICBpZiAoc3RhdGUuYW5jaG9yICE9PSBudWxsKSB7XG4gICAgICAgICAgICBzdGF0ZS5hbmNob3JNYXBbc3RhdGUuYW5jaG9yXSA9IHN0YXRlLnJlc3VsdDtcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKF9oYXNPd25Qcm9wZXJ0eS5jYWxsKHN0YXRlLnR5cGVNYXAsIHN0YXRlLnRhZykpIHtcbiAgICAgIHR5cGUgPSBzdGF0ZS50eXBlTWFwW3N0YXRlLnRhZ107XG5cbiAgICAgIGlmIChzdGF0ZS5yZXN1bHQgIT09IG51bGwgJiYgdHlwZS5raW5kICE9PSBzdGF0ZS5raW5kKSB7XG4gICAgICAgIHRocm93RXJyb3Ioc3RhdGUsICd1bmFjY2VwdGFibGUgbm9kZSBraW5kIGZvciAhPCcgKyBzdGF0ZS50YWcgKyAnPiB0YWc7IGl0IHNob3VsZCBiZSBcIicgKyB0eXBlLmtpbmQgKyAnXCIsIG5vdCBcIicgKyBzdGF0ZS5raW5kICsgJ1wiJyk7XG4gICAgICB9XG5cbiAgICAgIGlmICghdHlwZS5yZXNvbHZlKHN0YXRlLnJlc3VsdCkpIHsgLy8gYHN0YXRlLnJlc3VsdGAgdXBkYXRlZCBpbiByZXNvbHZlciBpZiBtYXRjaGVkXG4gICAgICAgIHRocm93RXJyb3Ioc3RhdGUsICdjYW5ub3QgcmVzb2x2ZSBhIG5vZGUgd2l0aCAhPCcgKyBzdGF0ZS50YWcgKyAnPiBleHBsaWNpdCB0YWcnKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHN0YXRlLnJlc3VsdCA9IHR5cGUuY29uc3RydWN0KHN0YXRlLnJlc3VsdCk7XG4gICAgICAgIGlmIChzdGF0ZS5hbmNob3IgIT09IG51bGwpIHtcbiAgICAgICAgICBzdGF0ZS5hbmNob3JNYXBbc3RhdGUuYW5jaG9yXSA9IHN0YXRlLnJlc3VsdDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvd0Vycm9yKHN0YXRlLCAndW5rbm93biB0YWcgITwnICsgc3RhdGUudGFnICsgJz4nKTtcbiAgICB9XG4gIH1cblxuICBpZiAoc3RhdGUubGlzdGVuZXIgIT09IG51bGwpIHtcbiAgICBzdGF0ZS5saXN0ZW5lcignY2xvc2UnLCBzdGF0ZSk7XG4gIH1cbiAgcmV0dXJuIHN0YXRlLnRhZyAhPT0gbnVsbCB8fCAgc3RhdGUuYW5jaG9yICE9PSBudWxsIHx8IGhhc0NvbnRlbnQ7XG59XG5cbmZ1bmN0aW9uIHJlYWREb2N1bWVudChzdGF0ZSkge1xuICB2YXIgZG9jdW1lbnRTdGFydCA9IHN0YXRlLnBvc2l0aW9uLFxuICAgICAgX3Bvc2l0aW9uLFxuICAgICAgZGlyZWN0aXZlTmFtZSxcbiAgICAgIGRpcmVjdGl2ZUFyZ3MsXG4gICAgICBoYXNEaXJlY3RpdmVzID0gZmFsc2UsXG4gICAgICBjaDtcblxuICBzdGF0ZS52ZXJzaW9uID0gbnVsbDtcbiAgc3RhdGUuY2hlY2tMaW5lQnJlYWtzID0gc3RhdGUubGVnYWN5O1xuICBzdGF0ZS50YWdNYXAgPSB7fTtcbiAgc3RhdGUuYW5jaG9yTWFwID0ge307XG5cbiAgd2hpbGUgKChjaCA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoc3RhdGUucG9zaXRpb24pKSAhPT0gMCkge1xuICAgIHNraXBTZXBhcmF0aW9uU3BhY2Uoc3RhdGUsIHRydWUsIC0xKTtcblxuICAgIGNoID0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdChzdGF0ZS5wb3NpdGlvbik7XG5cbiAgICBpZiAoc3RhdGUubGluZUluZGVudCA+IDAgfHwgY2ggIT09IDB4MjUvKiAlICovKSB7XG4gICAgICBicmVhaztcbiAgICB9XG5cbiAgICBoYXNEaXJlY3RpdmVzID0gdHJ1ZTtcbiAgICBjaCA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoKytzdGF0ZS5wb3NpdGlvbik7XG4gICAgX3Bvc2l0aW9uID0gc3RhdGUucG9zaXRpb247XG5cbiAgICB3aGlsZSAoY2ggIT09IDAgJiYgIWlzX1dTX09SX0VPTChjaCkpIHtcbiAgICAgIGNoID0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdCgrK3N0YXRlLnBvc2l0aW9uKTtcbiAgICB9XG5cbiAgICBkaXJlY3RpdmVOYW1lID0gc3RhdGUuaW5wdXQuc2xpY2UoX3Bvc2l0aW9uLCBzdGF0ZS5wb3NpdGlvbik7XG4gICAgZGlyZWN0aXZlQXJncyA9IFtdO1xuXG4gICAgaWYgKGRpcmVjdGl2ZU5hbWUubGVuZ3RoIDwgMSkge1xuICAgICAgdGhyb3dFcnJvcihzdGF0ZSwgJ2RpcmVjdGl2ZSBuYW1lIG11c3Qgbm90IGJlIGxlc3MgdGhhbiBvbmUgY2hhcmFjdGVyIGluIGxlbmd0aCcpO1xuICAgIH1cblxuICAgIHdoaWxlIChjaCAhPT0gMCkge1xuICAgICAgd2hpbGUgKGlzX1dISVRFX1NQQUNFKGNoKSkge1xuICAgICAgICBjaCA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoKytzdGF0ZS5wb3NpdGlvbik7XG4gICAgICB9XG5cbiAgICAgIGlmIChjaCA9PT0gMHgyMy8qICMgKi8pIHtcbiAgICAgICAgZG8geyBjaCA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoKytzdGF0ZS5wb3NpdGlvbik7IH1cbiAgICAgICAgd2hpbGUgKGNoICE9PSAwICYmICFpc19FT0woY2gpKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICAgIGlmIChpc19FT0woY2gpKSBicmVhaztcblxuICAgICAgX3Bvc2l0aW9uID0gc3RhdGUucG9zaXRpb247XG5cbiAgICAgIHdoaWxlIChjaCAhPT0gMCAmJiAhaXNfV1NfT1JfRU9MKGNoKSkge1xuICAgICAgICBjaCA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoKytzdGF0ZS5wb3NpdGlvbik7XG4gICAgICB9XG5cbiAgICAgIGRpcmVjdGl2ZUFyZ3MucHVzaChzdGF0ZS5pbnB1dC5zbGljZShfcG9zaXRpb24sIHN0YXRlLnBvc2l0aW9uKSk7XG4gICAgfVxuXG4gICAgaWYgKGNoICE9PSAwKSByZWFkTGluZUJyZWFrKHN0YXRlKTtcblxuICAgIGlmIChfaGFzT3duUHJvcGVydHkuY2FsbChkaXJlY3RpdmVIYW5kbGVycywgZGlyZWN0aXZlTmFtZSkpIHtcbiAgICAgIGRpcmVjdGl2ZUhhbmRsZXJzW2RpcmVjdGl2ZU5hbWVdKHN0YXRlLCBkaXJlY3RpdmVOYW1lLCBkaXJlY3RpdmVBcmdzKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3dXYXJuaW5nKHN0YXRlLCAndW5rbm93biBkb2N1bWVudCBkaXJlY3RpdmUgXCInICsgZGlyZWN0aXZlTmFtZSArICdcIicpO1xuICAgIH1cbiAgfVxuXG4gIHNraXBTZXBhcmF0aW9uU3BhY2Uoc3RhdGUsIHRydWUsIC0xKTtcblxuICBpZiAoc3RhdGUubGluZUluZGVudCA9PT0gMCAmJlxuICAgICAgc3RhdGUuaW5wdXQuY2hhckNvZGVBdChzdGF0ZS5wb3NpdGlvbikgICAgID09PSAweDJELyogLSAqLyAmJlxuICAgICAgc3RhdGUuaW5wdXQuY2hhckNvZGVBdChzdGF0ZS5wb3NpdGlvbiArIDEpID09PSAweDJELyogLSAqLyAmJlxuICAgICAgc3RhdGUuaW5wdXQuY2hhckNvZGVBdChzdGF0ZS5wb3NpdGlvbiArIDIpID09PSAweDJELyogLSAqLykge1xuICAgIHN0YXRlLnBvc2l0aW9uICs9IDM7XG4gICAgc2tpcFNlcGFyYXRpb25TcGFjZShzdGF0ZSwgdHJ1ZSwgLTEpO1xuXG4gIH0gZWxzZSBpZiAoaGFzRGlyZWN0aXZlcykge1xuICAgIHRocm93RXJyb3Ioc3RhdGUsICdkaXJlY3RpdmVzIGVuZCBtYXJrIGlzIGV4cGVjdGVkJyk7XG4gIH1cblxuICBjb21wb3NlTm9kZShzdGF0ZSwgc3RhdGUubGluZUluZGVudCAtIDEsIENPTlRFWFRfQkxPQ0tfT1VULCBmYWxzZSwgdHJ1ZSk7XG4gIHNraXBTZXBhcmF0aW9uU3BhY2Uoc3RhdGUsIHRydWUsIC0xKTtcblxuICBpZiAoc3RhdGUuY2hlY2tMaW5lQnJlYWtzICYmXG4gICAgICBQQVRURVJOX05PTl9BU0NJSV9MSU5FX0JSRUFLUy50ZXN0KHN0YXRlLmlucHV0LnNsaWNlKGRvY3VtZW50U3RhcnQsIHN0YXRlLnBvc2l0aW9uKSkpIHtcbiAgICB0aHJvd1dhcm5pbmcoc3RhdGUsICdub24tQVNDSUkgbGluZSBicmVha3MgYXJlIGludGVycHJldGVkIGFzIGNvbnRlbnQnKTtcbiAgfVxuXG4gIHN0YXRlLmRvY3VtZW50cy5wdXNoKHN0YXRlLnJlc3VsdCk7XG5cbiAgaWYgKHN0YXRlLnBvc2l0aW9uID09PSBzdGF0ZS5saW5lU3RhcnQgJiYgdGVzdERvY3VtZW50U2VwYXJhdG9yKHN0YXRlKSkge1xuXG4gICAgaWYgKHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoc3RhdGUucG9zaXRpb24pID09PSAweDJFLyogLiAqLykge1xuICAgICAgc3RhdGUucG9zaXRpb24gKz0gMztcbiAgICAgIHNraXBTZXBhcmF0aW9uU3BhY2Uoc3RhdGUsIHRydWUsIC0xKTtcbiAgICB9XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKHN0YXRlLnBvc2l0aW9uIDwgKHN0YXRlLmxlbmd0aCAtIDEpKSB7XG4gICAgdGhyb3dFcnJvcihzdGF0ZSwgJ2VuZCBvZiB0aGUgc3RyZWFtIG9yIGEgZG9jdW1lbnQgc2VwYXJhdG9yIGlzIGV4cGVjdGVkJyk7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuO1xuICB9XG59XG5cblxuZnVuY3Rpb24gbG9hZERvY3VtZW50cyhpbnB1dCwgb3B0aW9ucykge1xuICBpbnB1dCA9IFN0cmluZyhpbnB1dCk7XG4gIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuXG4gIGlmIChpbnB1dC5sZW5ndGggIT09IDApIHtcblxuICAgIC8vIEFkZCB0YWlsaW5nIGBcXG5gIGlmIG5vdCBleGlzdHNcbiAgICBpZiAoaW5wdXQuY2hhckNvZGVBdChpbnB1dC5sZW5ndGggLSAxKSAhPT0gMHgwQS8qIExGICovICYmXG4gICAgICAgIGlucHV0LmNoYXJDb2RlQXQoaW5wdXQubGVuZ3RoIC0gMSkgIT09IDB4MEQvKiBDUiAqLykge1xuICAgICAgaW5wdXQgKz0gJ1xcbic7XG4gICAgfVxuXG4gICAgLy8gU3RyaXAgQk9NXG4gICAgaWYgKGlucHV0LmNoYXJDb2RlQXQoMCkgPT09IDB4RkVGRikge1xuICAgICAgaW5wdXQgPSBpbnB1dC5zbGljZSgxKTtcbiAgICB9XG4gIH1cblxuICB2YXIgc3RhdGUgPSBuZXcgU3RhdGUoaW5wdXQsIG9wdGlvbnMpO1xuXG4gIC8vIFVzZSAwIGFzIHN0cmluZyB0ZXJtaW5hdG9yLiBUaGF0IHNpZ25pZmljYW50bHkgc2ltcGxpZmllcyBib3VuZHMgY2hlY2suXG4gIHN0YXRlLmlucHV0ICs9ICdcXDAnO1xuXG4gIHdoaWxlIChzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KHN0YXRlLnBvc2l0aW9uKSA9PT0gMHgyMC8qIFNwYWNlICovKSB7XG4gICAgc3RhdGUubGluZUluZGVudCArPSAxO1xuICAgIHN0YXRlLnBvc2l0aW9uICs9IDE7XG4gIH1cblxuICB3aGlsZSAoc3RhdGUucG9zaXRpb24gPCAoc3RhdGUubGVuZ3RoIC0gMSkpIHtcbiAgICByZWFkRG9jdW1lbnQoc3RhdGUpO1xuICB9XG5cbiAgcmV0dXJuIHN0YXRlLmRvY3VtZW50cztcbn1cblxuXG5mdW5jdGlvbiBsb2FkQWxsKGlucHV0LCBpdGVyYXRvciwgb3B0aW9ucykge1xuICB2YXIgZG9jdW1lbnRzID0gbG9hZERvY3VtZW50cyhpbnB1dCwgb3B0aW9ucyksIGluZGV4LCBsZW5ndGg7XG5cbiAgZm9yIChpbmRleCA9IDAsIGxlbmd0aCA9IGRvY3VtZW50cy5sZW5ndGg7IGluZGV4IDwgbGVuZ3RoOyBpbmRleCArPSAxKSB7XG4gICAgaXRlcmF0b3IoZG9jdW1lbnRzW2luZGV4XSk7XG4gIH1cbn1cblxuXG5mdW5jdGlvbiBsb2FkKGlucHV0LCBvcHRpb25zKSB7XG4gIHZhciBkb2N1bWVudHMgPSBsb2FkRG9jdW1lbnRzKGlucHV0LCBvcHRpb25zKTtcblxuICBpZiAoZG9jdW1lbnRzLmxlbmd0aCA9PT0gMCkge1xuICAgIC8qZXNsaW50LWRpc2FibGUgbm8tdW5kZWZpbmVkKi9cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9IGVsc2UgaWYgKGRvY3VtZW50cy5sZW5ndGggPT09IDEpIHtcbiAgICByZXR1cm4gZG9jdW1lbnRzWzBdO1xuICB9XG4gIHRocm93IG5ldyBZQU1MRXhjZXB0aW9uKCdleHBlY3RlZCBhIHNpbmdsZSBkb2N1bWVudCBpbiB0aGUgc3RyZWFtLCBidXQgZm91bmQgbW9yZScpO1xufVxuXG5cbmZ1bmN0aW9uIHNhZmVMb2FkQWxsKGlucHV0LCBvdXRwdXQsIG9wdGlvbnMpIHtcbiAgbG9hZEFsbChpbnB1dCwgb3V0cHV0LCBjb21tb24uZXh0ZW5kKHsgc2NoZW1hOiBERUZBVUxUX1NBRkVfU0NIRU1BIH0sIG9wdGlvbnMpKTtcbn1cblxuXG5mdW5jdGlvbiBzYWZlTG9hZChpbnB1dCwgb3B0aW9ucykge1xuICByZXR1cm4gbG9hZChpbnB1dCwgY29tbW9uLmV4dGVuZCh7IHNjaGVtYTogREVGQVVMVF9TQUZFX1NDSEVNQSB9LCBvcHRpb25zKSk7XG59XG5cblxubW9kdWxlLmV4cG9ydHMubG9hZEFsbCAgICAgPSBsb2FkQWxsO1xubW9kdWxlLmV4cG9ydHMubG9hZCAgICAgICAgPSBsb2FkO1xubW9kdWxlLmV4cG9ydHMuc2FmZUxvYWRBbGwgPSBzYWZlTG9hZEFsbDtcbm1vZHVsZS5leHBvcnRzLnNhZmVMb2FkICAgID0gc2FmZUxvYWQ7XG4iLCIndXNlIHN0cmljdCc7XG5cblxudmFyIGNvbW1vbiA9IHJlcXVpcmUoJy4vY29tbW9uJyk7XG5cblxuZnVuY3Rpb24gTWFyayhuYW1lLCBidWZmZXIsIHBvc2l0aW9uLCBsaW5lLCBjb2x1bW4pIHtcbiAgdGhpcy5uYW1lICAgICA9IG5hbWU7XG4gIHRoaXMuYnVmZmVyICAgPSBidWZmZXI7XG4gIHRoaXMucG9zaXRpb24gPSBwb3NpdGlvbjtcbiAgdGhpcy5saW5lICAgICA9IGxpbmU7XG4gIHRoaXMuY29sdW1uICAgPSBjb2x1bW47XG59XG5cblxuTWFyay5wcm90b3R5cGUuZ2V0U25pcHBldCA9IGZ1bmN0aW9uIGdldFNuaXBwZXQoaW5kZW50LCBtYXhMZW5ndGgpIHtcbiAgdmFyIGhlYWQsIHN0YXJ0LCB0YWlsLCBlbmQsIHNuaXBwZXQ7XG5cbiAgaWYgKCF0aGlzLmJ1ZmZlcikgcmV0dXJuIG51bGw7XG5cbiAgaW5kZW50ID0gaW5kZW50IHx8IDQ7XG4gIG1heExlbmd0aCA9IG1heExlbmd0aCB8fCA3NTtcblxuICBoZWFkID0gJyc7XG4gIHN0YXJ0ID0gdGhpcy5wb3NpdGlvbjtcblxuICB3aGlsZSAoc3RhcnQgPiAwICYmICdcXHgwMFxcclxcblxceDg1XFx1MjAyOFxcdTIwMjknLmluZGV4T2YodGhpcy5idWZmZXIuY2hhckF0KHN0YXJ0IC0gMSkpID09PSAtMSkge1xuICAgIHN0YXJ0IC09IDE7XG4gICAgaWYgKHRoaXMucG9zaXRpb24gLSBzdGFydCA+IChtYXhMZW5ndGggLyAyIC0gMSkpIHtcbiAgICAgIGhlYWQgPSAnIC4uLiAnO1xuICAgICAgc3RhcnQgKz0gNTtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIHRhaWwgPSAnJztcbiAgZW5kID0gdGhpcy5wb3NpdGlvbjtcblxuICB3aGlsZSAoZW5kIDwgdGhpcy5idWZmZXIubGVuZ3RoICYmICdcXHgwMFxcclxcblxceDg1XFx1MjAyOFxcdTIwMjknLmluZGV4T2YodGhpcy5idWZmZXIuY2hhckF0KGVuZCkpID09PSAtMSkge1xuICAgIGVuZCArPSAxO1xuICAgIGlmIChlbmQgLSB0aGlzLnBvc2l0aW9uID4gKG1heExlbmd0aCAvIDIgLSAxKSkge1xuICAgICAgdGFpbCA9ICcgLi4uICc7XG4gICAgICBlbmQgLT0gNTtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIHNuaXBwZXQgPSB0aGlzLmJ1ZmZlci5zbGljZShzdGFydCwgZW5kKTtcblxuICByZXR1cm4gY29tbW9uLnJlcGVhdCgnICcsIGluZGVudCkgKyBoZWFkICsgc25pcHBldCArIHRhaWwgKyAnXFxuJyArXG4gICAgICAgICBjb21tb24ucmVwZWF0KCcgJywgaW5kZW50ICsgdGhpcy5wb3NpdGlvbiAtIHN0YXJ0ICsgaGVhZC5sZW5ndGgpICsgJ14nO1xufTtcblxuXG5NYXJrLnByb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uIHRvU3RyaW5nKGNvbXBhY3QpIHtcbiAgdmFyIHNuaXBwZXQsIHdoZXJlID0gJyc7XG5cbiAgaWYgKHRoaXMubmFtZSkge1xuICAgIHdoZXJlICs9ICdpbiBcIicgKyB0aGlzLm5hbWUgKyAnXCIgJztcbiAgfVxuXG4gIHdoZXJlICs9ICdhdCBsaW5lICcgKyAodGhpcy5saW5lICsgMSkgKyAnLCBjb2x1bW4gJyArICh0aGlzLmNvbHVtbiArIDEpO1xuXG4gIGlmICghY29tcGFjdCkge1xuICAgIHNuaXBwZXQgPSB0aGlzLmdldFNuaXBwZXQoKTtcblxuICAgIGlmIChzbmlwcGV0KSB7XG4gICAgICB3aGVyZSArPSAnOlxcbicgKyBzbmlwcGV0O1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB3aGVyZTtcbn07XG5cblxubW9kdWxlLmV4cG9ydHMgPSBNYXJrO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG4vKmVzbGludC1kaXNhYmxlIG1heC1sZW4qL1xuXG52YXIgY29tbW9uICAgICAgICA9IHJlcXVpcmUoJy4vY29tbW9uJyk7XG52YXIgWUFNTEV4Y2VwdGlvbiA9IHJlcXVpcmUoJy4vZXhjZXB0aW9uJyk7XG52YXIgVHlwZSAgICAgICAgICA9IHJlcXVpcmUoJy4vdHlwZScpO1xuXG5cbmZ1bmN0aW9uIGNvbXBpbGVMaXN0KHNjaGVtYSwgbmFtZSwgcmVzdWx0KSB7XG4gIHZhciBleGNsdWRlID0gW107XG5cbiAgc2NoZW1hLmluY2x1ZGUuZm9yRWFjaChmdW5jdGlvbiAoaW5jbHVkZWRTY2hlbWEpIHtcbiAgICByZXN1bHQgPSBjb21waWxlTGlzdChpbmNsdWRlZFNjaGVtYSwgbmFtZSwgcmVzdWx0KTtcbiAgfSk7XG5cbiAgc2NoZW1hW25hbWVdLmZvckVhY2goZnVuY3Rpb24gKGN1cnJlbnRUeXBlKSB7XG4gICAgcmVzdWx0LmZvckVhY2goZnVuY3Rpb24gKHByZXZpb3VzVHlwZSwgcHJldmlvdXNJbmRleCkge1xuICAgICAgaWYgKHByZXZpb3VzVHlwZS50YWcgPT09IGN1cnJlbnRUeXBlLnRhZykge1xuICAgICAgICBleGNsdWRlLnB1c2gocHJldmlvdXNJbmRleCk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICByZXN1bHQucHVzaChjdXJyZW50VHlwZSk7XG4gIH0pO1xuXG4gIHJldHVybiByZXN1bHQuZmlsdGVyKGZ1bmN0aW9uICh0eXBlLCBpbmRleCkge1xuICAgIHJldHVybiBleGNsdWRlLmluZGV4T2YoaW5kZXgpID09PSAtMTtcbiAgfSk7XG59XG5cblxuZnVuY3Rpb24gY29tcGlsZU1hcCgvKiBsaXN0cy4uLiAqLykge1xuICB2YXIgcmVzdWx0ID0ge30sIGluZGV4LCBsZW5ndGg7XG5cbiAgZnVuY3Rpb24gY29sbGVjdFR5cGUodHlwZSkge1xuICAgIHJlc3VsdFt0eXBlLnRhZ10gPSB0eXBlO1xuICB9XG5cbiAgZm9yIChpbmRleCA9IDAsIGxlbmd0aCA9IGFyZ3VtZW50cy5sZW5ndGg7IGluZGV4IDwgbGVuZ3RoOyBpbmRleCArPSAxKSB7XG4gICAgYXJndW1lbnRzW2luZGV4XS5mb3JFYWNoKGNvbGxlY3RUeXBlKTtcbiAgfVxuXG4gIHJldHVybiByZXN1bHQ7XG59XG5cblxuZnVuY3Rpb24gU2NoZW1hKGRlZmluaXRpb24pIHtcbiAgdGhpcy5pbmNsdWRlICA9IGRlZmluaXRpb24uaW5jbHVkZSAgfHwgW107XG4gIHRoaXMuaW1wbGljaXQgPSBkZWZpbml0aW9uLmltcGxpY2l0IHx8IFtdO1xuICB0aGlzLmV4cGxpY2l0ID0gZGVmaW5pdGlvbi5leHBsaWNpdCB8fCBbXTtcblxuICB0aGlzLmltcGxpY2l0LmZvckVhY2goZnVuY3Rpb24gKHR5cGUpIHtcbiAgICBpZiAodHlwZS5sb2FkS2luZCAmJiB0eXBlLmxvYWRLaW5kICE9PSAnc2NhbGFyJykge1xuICAgICAgdGhyb3cgbmV3IFlBTUxFeGNlcHRpb24oJ1RoZXJlIGlzIGEgbm9uLXNjYWxhciB0eXBlIGluIHRoZSBpbXBsaWNpdCBsaXN0IG9mIGEgc2NoZW1hLiBJbXBsaWNpdCByZXNvbHZpbmcgb2Ygc3VjaCB0eXBlcyBpcyBub3Qgc3VwcG9ydGVkLicpO1xuICAgIH1cbiAgfSk7XG5cbiAgdGhpcy5jb21waWxlZEltcGxpY2l0ID0gY29tcGlsZUxpc3QodGhpcywgJ2ltcGxpY2l0JywgW10pO1xuICB0aGlzLmNvbXBpbGVkRXhwbGljaXQgPSBjb21waWxlTGlzdCh0aGlzLCAnZXhwbGljaXQnLCBbXSk7XG4gIHRoaXMuY29tcGlsZWRUeXBlTWFwICA9IGNvbXBpbGVNYXAodGhpcy5jb21waWxlZEltcGxpY2l0LCB0aGlzLmNvbXBpbGVkRXhwbGljaXQpO1xufVxuXG5cblNjaGVtYS5ERUZBVUxUID0gbnVsbDtcblxuXG5TY2hlbWEuY3JlYXRlID0gZnVuY3Rpb24gY3JlYXRlU2NoZW1hKCkge1xuICB2YXIgc2NoZW1hcywgdHlwZXM7XG5cbiAgc3dpdGNoIChhcmd1bWVudHMubGVuZ3RoKSB7XG4gICAgY2FzZSAxOlxuICAgICAgc2NoZW1hcyA9IFNjaGVtYS5ERUZBVUxUO1xuICAgICAgdHlwZXMgPSBhcmd1bWVudHNbMF07XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgMjpcbiAgICAgIHNjaGVtYXMgPSBhcmd1bWVudHNbMF07XG4gICAgICB0eXBlcyA9IGFyZ3VtZW50c1sxXTtcbiAgICAgIGJyZWFrO1xuXG4gICAgZGVmYXVsdDpcbiAgICAgIHRocm93IG5ldyBZQU1MRXhjZXB0aW9uKCdXcm9uZyBudW1iZXIgb2YgYXJndW1lbnRzIGZvciBTY2hlbWEuY3JlYXRlIGZ1bmN0aW9uJyk7XG4gIH1cblxuICBzY2hlbWFzID0gY29tbW9uLnRvQXJyYXkoc2NoZW1hcyk7XG4gIHR5cGVzID0gY29tbW9uLnRvQXJyYXkodHlwZXMpO1xuXG4gIGlmICghc2NoZW1hcy5ldmVyeShmdW5jdGlvbiAoc2NoZW1hKSB7IHJldHVybiBzY2hlbWEgaW5zdGFuY2VvZiBTY2hlbWE7IH0pKSB7XG4gICAgdGhyb3cgbmV3IFlBTUxFeGNlcHRpb24oJ1NwZWNpZmllZCBsaXN0IG9mIHN1cGVyIHNjaGVtYXMgKG9yIGEgc2luZ2xlIFNjaGVtYSBvYmplY3QpIGNvbnRhaW5zIGEgbm9uLVNjaGVtYSBvYmplY3QuJyk7XG4gIH1cblxuICBpZiAoIXR5cGVzLmV2ZXJ5KGZ1bmN0aW9uICh0eXBlKSB7IHJldHVybiB0eXBlIGluc3RhbmNlb2YgVHlwZTsgfSkpIHtcbiAgICB0aHJvdyBuZXcgWUFNTEV4Y2VwdGlvbignU3BlY2lmaWVkIGxpc3Qgb2YgWUFNTCB0eXBlcyAob3IgYSBzaW5nbGUgVHlwZSBvYmplY3QpIGNvbnRhaW5zIGEgbm9uLVR5cGUgb2JqZWN0LicpO1xuICB9XG5cbiAgcmV0dXJuIG5ldyBTY2hlbWEoe1xuICAgIGluY2x1ZGU6IHNjaGVtYXMsXG4gICAgZXhwbGljaXQ6IHR5cGVzXG4gIH0pO1xufTtcblxuXG5tb2R1bGUuZXhwb3J0cyA9IFNjaGVtYTtcbiIsIi8vIFN0YW5kYXJkIFlBTUwncyBDb3JlIHNjaGVtYS5cbi8vIGh0dHA6Ly93d3cueWFtbC5vcmcvc3BlYy8xLjIvc3BlYy5odG1sI2lkMjgwNDkyM1xuLy9cbi8vIE5PVEU6IEpTLVlBTUwgZG9lcyBub3Qgc3VwcG9ydCBzY2hlbWEtc3BlY2lmaWMgdGFnIHJlc29sdXRpb24gcmVzdHJpY3Rpb25zLlxuLy8gU28sIENvcmUgc2NoZW1hIGhhcyBubyBkaXN0aW5jdGlvbnMgZnJvbSBKU09OIHNjaGVtYSBpcyBKUy1ZQU1MLlxuXG5cbid1c2Ugc3RyaWN0JztcblxuXG52YXIgU2NoZW1hID0gcmVxdWlyZSgnLi4vc2NoZW1hJyk7XG5cblxubW9kdWxlLmV4cG9ydHMgPSBuZXcgU2NoZW1hKHtcbiAgaW5jbHVkZTogW1xuICAgIHJlcXVpcmUoJy4vanNvbicpXG4gIF1cbn0pO1xuIiwiLy8gSlMtWUFNTCdzIGRlZmF1bHQgc2NoZW1hIGZvciBgbG9hZGAgZnVuY3Rpb24uXG4vLyBJdCBpcyBub3QgZGVzY3JpYmVkIGluIHRoZSBZQU1MIHNwZWNpZmljYXRpb24uXG4vL1xuLy8gVGhpcyBzY2hlbWEgaXMgYmFzZWQgb24gSlMtWUFNTCdzIGRlZmF1bHQgc2FmZSBzY2hlbWEgYW5kIGluY2x1ZGVzXG4vLyBKYXZhU2NyaXB0LXNwZWNpZmljIHR5cGVzOiAhIWpzL3VuZGVmaW5lZCwgISFqcy9yZWdleHAgYW5kICEhanMvZnVuY3Rpb24uXG4vL1xuLy8gQWxzbyB0aGlzIHNjaGVtYSBpcyB1c2VkIGFzIGRlZmF1bHQgYmFzZSBzY2hlbWEgYXQgYFNjaGVtYS5jcmVhdGVgIGZ1bmN0aW9uLlxuXG5cbid1c2Ugc3RyaWN0JztcblxuXG52YXIgU2NoZW1hID0gcmVxdWlyZSgnLi4vc2NoZW1hJyk7XG5cblxubW9kdWxlLmV4cG9ydHMgPSBTY2hlbWEuREVGQVVMVCA9IG5ldyBTY2hlbWEoe1xuICBpbmNsdWRlOiBbXG4gICAgcmVxdWlyZSgnLi9kZWZhdWx0X3NhZmUnKVxuICBdLFxuICBleHBsaWNpdDogW1xuICAgIHJlcXVpcmUoJy4uL3R5cGUvanMvdW5kZWZpbmVkJyksXG4gICAgcmVxdWlyZSgnLi4vdHlwZS9qcy9yZWdleHAnKSxcbiAgICByZXF1aXJlKCcuLi90eXBlL2pzL2Z1bmN0aW9uJylcbiAgXVxufSk7XG4iLCIvLyBKUy1ZQU1MJ3MgZGVmYXVsdCBzY2hlbWEgZm9yIGBzYWZlTG9hZGAgZnVuY3Rpb24uXG4vLyBJdCBpcyBub3QgZGVzY3JpYmVkIGluIHRoZSBZQU1MIHNwZWNpZmljYXRpb24uXG4vL1xuLy8gVGhpcyBzY2hlbWEgaXMgYmFzZWQgb24gc3RhbmRhcmQgWUFNTCdzIENvcmUgc2NoZW1hIGFuZCBpbmNsdWRlcyBtb3N0IG9mXG4vLyBleHRyYSB0eXBlcyBkZXNjcmliZWQgYXQgWUFNTCB0YWcgcmVwb3NpdG9yeS4gKGh0dHA6Ly95YW1sLm9yZy90eXBlLylcblxuXG4ndXNlIHN0cmljdCc7XG5cblxudmFyIFNjaGVtYSA9IHJlcXVpcmUoJy4uL3NjaGVtYScpO1xuXG5cbm1vZHVsZS5leHBvcnRzID0gbmV3IFNjaGVtYSh7XG4gIGluY2x1ZGU6IFtcbiAgICByZXF1aXJlKCcuL2NvcmUnKVxuICBdLFxuICBpbXBsaWNpdDogW1xuICAgIHJlcXVpcmUoJy4uL3R5cGUvdGltZXN0YW1wJyksXG4gICAgcmVxdWlyZSgnLi4vdHlwZS9tZXJnZScpXG4gIF0sXG4gIGV4cGxpY2l0OiBbXG4gICAgcmVxdWlyZSgnLi4vdHlwZS9iaW5hcnknKSxcbiAgICByZXF1aXJlKCcuLi90eXBlL29tYXAnKSxcbiAgICByZXF1aXJlKCcuLi90eXBlL3BhaXJzJyksXG4gICAgcmVxdWlyZSgnLi4vdHlwZS9zZXQnKVxuICBdXG59KTtcbiIsIi8vIFN0YW5kYXJkIFlBTUwncyBGYWlsc2FmZSBzY2hlbWEuXG4vLyBodHRwOi8vd3d3LnlhbWwub3JnL3NwZWMvMS4yL3NwZWMuaHRtbCNpZDI4MDIzNDZcblxuXG4ndXNlIHN0cmljdCc7XG5cblxudmFyIFNjaGVtYSA9IHJlcXVpcmUoJy4uL3NjaGVtYScpO1xuXG5cbm1vZHVsZS5leHBvcnRzID0gbmV3IFNjaGVtYSh7XG4gIGV4cGxpY2l0OiBbXG4gICAgcmVxdWlyZSgnLi4vdHlwZS9zdHInKSxcbiAgICByZXF1aXJlKCcuLi90eXBlL3NlcScpLFxuICAgIHJlcXVpcmUoJy4uL3R5cGUvbWFwJylcbiAgXVxufSk7XG4iLCIvLyBTdGFuZGFyZCBZQU1MJ3MgSlNPTiBzY2hlbWEuXG4vLyBodHRwOi8vd3d3LnlhbWwub3JnL3NwZWMvMS4yL3NwZWMuaHRtbCNpZDI4MDMyMzFcbi8vXG4vLyBOT1RFOiBKUy1ZQU1MIGRvZXMgbm90IHN1cHBvcnQgc2NoZW1hLXNwZWNpZmljIHRhZyByZXNvbHV0aW9uIHJlc3RyaWN0aW9ucy5cbi8vIFNvLCB0aGlzIHNjaGVtYSBpcyBub3Qgc3VjaCBzdHJpY3QgYXMgZGVmaW5lZCBpbiB0aGUgWUFNTCBzcGVjaWZpY2F0aW9uLlxuLy8gSXQgYWxsb3dzIG51bWJlcnMgaW4gYmluYXJ5IG5vdGFpb24sIHVzZSBgTnVsbGAgYW5kIGBOVUxMYCBhcyBgbnVsbGAsIGV0Yy5cblxuXG4ndXNlIHN0cmljdCc7XG5cblxudmFyIFNjaGVtYSA9IHJlcXVpcmUoJy4uL3NjaGVtYScpO1xuXG5cbm1vZHVsZS5leHBvcnRzID0gbmV3IFNjaGVtYSh7XG4gIGluY2x1ZGU6IFtcbiAgICByZXF1aXJlKCcuL2ZhaWxzYWZlJylcbiAgXSxcbiAgaW1wbGljaXQ6IFtcbiAgICByZXF1aXJlKCcuLi90eXBlL251bGwnKSxcbiAgICByZXF1aXJlKCcuLi90eXBlL2Jvb2wnKSxcbiAgICByZXF1aXJlKCcuLi90eXBlL2ludCcpLFxuICAgIHJlcXVpcmUoJy4uL3R5cGUvZmxvYXQnKVxuICBdXG59KTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIFlBTUxFeGNlcHRpb24gPSByZXF1aXJlKCcuL2V4Y2VwdGlvbicpO1xuXG52YXIgVFlQRV9DT05TVFJVQ1RPUl9PUFRJT05TID0gW1xuICAna2luZCcsXG4gICdyZXNvbHZlJyxcbiAgJ2NvbnN0cnVjdCcsXG4gICdpbnN0YW5jZU9mJyxcbiAgJ3ByZWRpY2F0ZScsXG4gICdyZXByZXNlbnQnLFxuICAnZGVmYXVsdFN0eWxlJyxcbiAgJ3N0eWxlQWxpYXNlcydcbl07XG5cbnZhciBZQU1MX05PREVfS0lORFMgPSBbXG4gICdzY2FsYXInLFxuICAnc2VxdWVuY2UnLFxuICAnbWFwcGluZydcbl07XG5cbmZ1bmN0aW9uIGNvbXBpbGVTdHlsZUFsaWFzZXMobWFwKSB7XG4gIHZhciByZXN1bHQgPSB7fTtcblxuICBpZiAobWFwICE9PSBudWxsKSB7XG4gICAgT2JqZWN0LmtleXMobWFwKS5mb3JFYWNoKGZ1bmN0aW9uIChzdHlsZSkge1xuICAgICAgbWFwW3N0eWxlXS5mb3JFYWNoKGZ1bmN0aW9uIChhbGlhcykge1xuICAgICAgICByZXN1bHRbU3RyaW5nKGFsaWFzKV0gPSBzdHlsZTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZnVuY3Rpb24gVHlwZSh0YWcsIG9wdGlvbnMpIHtcbiAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG5cbiAgT2JqZWN0LmtleXMob3B0aW9ucykuZm9yRWFjaChmdW5jdGlvbiAobmFtZSkge1xuICAgIGlmIChUWVBFX0NPTlNUUlVDVE9SX09QVElPTlMuaW5kZXhPZihuYW1lKSA9PT0gLTEpIHtcbiAgICAgIHRocm93IG5ldyBZQU1MRXhjZXB0aW9uKCdVbmtub3duIG9wdGlvbiBcIicgKyBuYW1lICsgJ1wiIGlzIG1ldCBpbiBkZWZpbml0aW9uIG9mIFwiJyArIHRhZyArICdcIiBZQU1MIHR5cGUuJyk7XG4gICAgfVxuICB9KTtcblxuICAvLyBUT0RPOiBBZGQgdGFnIGZvcm1hdCBjaGVjay5cbiAgdGhpcy50YWcgICAgICAgICAgPSB0YWc7XG4gIHRoaXMua2luZCAgICAgICAgID0gb3B0aW9uc1sna2luZCddICAgICAgICAgfHwgbnVsbDtcbiAgdGhpcy5yZXNvbHZlICAgICAgPSBvcHRpb25zWydyZXNvbHZlJ10gICAgICB8fCBmdW5jdGlvbiAoKSB7IHJldHVybiB0cnVlOyB9O1xuICB0aGlzLmNvbnN0cnVjdCAgICA9IG9wdGlvbnNbJ2NvbnN0cnVjdCddICAgIHx8IGZ1bmN0aW9uIChkYXRhKSB7IHJldHVybiBkYXRhOyB9O1xuICB0aGlzLmluc3RhbmNlT2YgICA9IG9wdGlvbnNbJ2luc3RhbmNlT2YnXSAgIHx8IG51bGw7XG4gIHRoaXMucHJlZGljYXRlICAgID0gb3B0aW9uc1sncHJlZGljYXRlJ10gICAgfHwgbnVsbDtcbiAgdGhpcy5yZXByZXNlbnQgICAgPSBvcHRpb25zWydyZXByZXNlbnQnXSAgICB8fCBudWxsO1xuICB0aGlzLmRlZmF1bHRTdHlsZSA9IG9wdGlvbnNbJ2RlZmF1bHRTdHlsZSddIHx8IG51bGw7XG4gIHRoaXMuc3R5bGVBbGlhc2VzID0gY29tcGlsZVN0eWxlQWxpYXNlcyhvcHRpb25zWydzdHlsZUFsaWFzZXMnXSB8fCBudWxsKTtcblxuICBpZiAoWUFNTF9OT0RFX0tJTkRTLmluZGV4T2YodGhpcy5raW5kKSA9PT0gLTEpIHtcbiAgICB0aHJvdyBuZXcgWUFNTEV4Y2VwdGlvbignVW5rbm93biBraW5kIFwiJyArIHRoaXMua2luZCArICdcIiBpcyBzcGVjaWZpZWQgZm9yIFwiJyArIHRhZyArICdcIiBZQU1MIHR5cGUuJyk7XG4gIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBUeXBlO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG4vKmVzbGludC1kaXNhYmxlIG5vLWJpdHdpc2UqL1xuXG4vLyBBIHRyaWNrIGZvciBicm93c2VyaWZpZWQgdmVyc2lvbi5cbi8vIFNpbmNlIHdlIG1ha2UgYnJvd3NlcmlmaWVyIHRvIGlnbm9yZSBgYnVmZmVyYCBtb2R1bGUsIE5vZGVCdWZmZXIgd2lsbCBiZSB1bmRlZmluZWRcbnZhciBOb2RlQnVmZmVyID0gcmVxdWlyZSgnYnVmZmVyJykuQnVmZmVyO1xudmFyIFR5cGUgICAgICAgPSByZXF1aXJlKCcuLi90eXBlJyk7XG5cblxuLy8gWyA2NCwgNjUsIDY2IF0gLT4gWyBwYWRkaW5nLCBDUiwgTEYgXVxudmFyIEJBU0U2NF9NQVAgPSAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz1cXG5cXHInO1xuXG5cbmZ1bmN0aW9uIHJlc29sdmVZYW1sQmluYXJ5KGRhdGEpIHtcbiAgaWYgKGRhdGEgPT09IG51bGwpIHJldHVybiBmYWxzZTtcblxuICB2YXIgY29kZSwgaWR4LCBiaXRsZW4gPSAwLCBtYXggPSBkYXRhLmxlbmd0aCwgbWFwID0gQkFTRTY0X01BUDtcblxuICAvLyBDb252ZXJ0IG9uZSBieSBvbmUuXG4gIGZvciAoaWR4ID0gMDsgaWR4IDwgbWF4OyBpZHgrKykge1xuICAgIGNvZGUgPSBtYXAuaW5kZXhPZihkYXRhLmNoYXJBdChpZHgpKTtcblxuICAgIC8vIFNraXAgQ1IvTEZcbiAgICBpZiAoY29kZSA+IDY0KSBjb250aW51ZTtcblxuICAgIC8vIEZhaWwgb24gaWxsZWdhbCBjaGFyYWN0ZXJzXG4gICAgaWYgKGNvZGUgPCAwKSByZXR1cm4gZmFsc2U7XG5cbiAgICBiaXRsZW4gKz0gNjtcbiAgfVxuXG4gIC8vIElmIHRoZXJlIGFyZSBhbnkgYml0cyBsZWZ0LCBzb3VyY2Ugd2FzIGNvcnJ1cHRlZFxuICByZXR1cm4gKGJpdGxlbiAlIDgpID09PSAwO1xufVxuXG5mdW5jdGlvbiBjb25zdHJ1Y3RZYW1sQmluYXJ5KGRhdGEpIHtcbiAgdmFyIGlkeCwgdGFpbGJpdHMsXG4gICAgICBpbnB1dCA9IGRhdGEucmVwbGFjZSgvW1xcclxcbj1dL2csICcnKSwgLy8gcmVtb3ZlIENSL0xGICYgcGFkZGluZyB0byBzaW1wbGlmeSBzY2FuXG4gICAgICBtYXggPSBpbnB1dC5sZW5ndGgsXG4gICAgICBtYXAgPSBCQVNFNjRfTUFQLFxuICAgICAgYml0cyA9IDAsXG4gICAgICByZXN1bHQgPSBbXTtcblxuICAvLyBDb2xsZWN0IGJ5IDYqNCBiaXRzICgzIGJ5dGVzKVxuXG4gIGZvciAoaWR4ID0gMDsgaWR4IDwgbWF4OyBpZHgrKykge1xuICAgIGlmICgoaWR4ICUgNCA9PT0gMCkgJiYgaWR4KSB7XG4gICAgICByZXN1bHQucHVzaCgoYml0cyA+PiAxNikgJiAweEZGKTtcbiAgICAgIHJlc3VsdC5wdXNoKChiaXRzID4+IDgpICYgMHhGRik7XG4gICAgICByZXN1bHQucHVzaChiaXRzICYgMHhGRik7XG4gICAgfVxuXG4gICAgYml0cyA9IChiaXRzIDw8IDYpIHwgbWFwLmluZGV4T2YoaW5wdXQuY2hhckF0KGlkeCkpO1xuICB9XG5cbiAgLy8gRHVtcCB0YWlsXG5cbiAgdGFpbGJpdHMgPSAobWF4ICUgNCkgKiA2O1xuXG4gIGlmICh0YWlsYml0cyA9PT0gMCkge1xuICAgIHJlc3VsdC5wdXNoKChiaXRzID4+IDE2KSAmIDB4RkYpO1xuICAgIHJlc3VsdC5wdXNoKChiaXRzID4+IDgpICYgMHhGRik7XG4gICAgcmVzdWx0LnB1c2goYml0cyAmIDB4RkYpO1xuICB9IGVsc2UgaWYgKHRhaWxiaXRzID09PSAxOCkge1xuICAgIHJlc3VsdC5wdXNoKChiaXRzID4+IDEwKSAmIDB4RkYpO1xuICAgIHJlc3VsdC5wdXNoKChiaXRzID4+IDIpICYgMHhGRik7XG4gIH0gZWxzZSBpZiAodGFpbGJpdHMgPT09IDEyKSB7XG4gICAgcmVzdWx0LnB1c2goKGJpdHMgPj4gNCkgJiAweEZGKTtcbiAgfVxuXG4gIC8vIFdyYXAgaW50byBCdWZmZXIgZm9yIE5vZGVKUyBhbmQgbGVhdmUgQXJyYXkgZm9yIGJyb3dzZXJcbiAgaWYgKE5vZGVCdWZmZXIpIHJldHVybiBuZXcgTm9kZUJ1ZmZlcihyZXN1bHQpO1xuXG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmZ1bmN0aW9uIHJlcHJlc2VudFlhbWxCaW5hcnkob2JqZWN0IC8qLCBzdHlsZSovKSB7XG4gIHZhciByZXN1bHQgPSAnJywgYml0cyA9IDAsIGlkeCwgdGFpbCxcbiAgICAgIG1heCA9IG9iamVjdC5sZW5ndGgsXG4gICAgICBtYXAgPSBCQVNFNjRfTUFQO1xuXG4gIC8vIENvbnZlcnQgZXZlcnkgdGhyZWUgYnl0ZXMgdG8gNCBBU0NJSSBjaGFyYWN0ZXJzLlxuXG4gIGZvciAoaWR4ID0gMDsgaWR4IDwgbWF4OyBpZHgrKykge1xuICAgIGlmICgoaWR4ICUgMyA9PT0gMCkgJiYgaWR4KSB7XG4gICAgICByZXN1bHQgKz0gbWFwWyhiaXRzID4+IDE4KSAmIDB4M0ZdO1xuICAgICAgcmVzdWx0ICs9IG1hcFsoYml0cyA+PiAxMikgJiAweDNGXTtcbiAgICAgIHJlc3VsdCArPSBtYXBbKGJpdHMgPj4gNikgJiAweDNGXTtcbiAgICAgIHJlc3VsdCArPSBtYXBbYml0cyAmIDB4M0ZdO1xuICAgIH1cblxuICAgIGJpdHMgPSAoYml0cyA8PCA4KSArIG9iamVjdFtpZHhdO1xuICB9XG5cbiAgLy8gRHVtcCB0YWlsXG5cbiAgdGFpbCA9IG1heCAlIDM7XG5cbiAgaWYgKHRhaWwgPT09IDApIHtcbiAgICByZXN1bHQgKz0gbWFwWyhiaXRzID4+IDE4KSAmIDB4M0ZdO1xuICAgIHJlc3VsdCArPSBtYXBbKGJpdHMgPj4gMTIpICYgMHgzRl07XG4gICAgcmVzdWx0ICs9IG1hcFsoYml0cyA+PiA2KSAmIDB4M0ZdO1xuICAgIHJlc3VsdCArPSBtYXBbYml0cyAmIDB4M0ZdO1xuICB9IGVsc2UgaWYgKHRhaWwgPT09IDIpIHtcbiAgICByZXN1bHQgKz0gbWFwWyhiaXRzID4+IDEwKSAmIDB4M0ZdO1xuICAgIHJlc3VsdCArPSBtYXBbKGJpdHMgPj4gNCkgJiAweDNGXTtcbiAgICByZXN1bHQgKz0gbWFwWyhiaXRzIDw8IDIpICYgMHgzRl07XG4gICAgcmVzdWx0ICs9IG1hcFs2NF07XG4gIH0gZWxzZSBpZiAodGFpbCA9PT0gMSkge1xuICAgIHJlc3VsdCArPSBtYXBbKGJpdHMgPj4gMikgJiAweDNGXTtcbiAgICByZXN1bHQgKz0gbWFwWyhiaXRzIDw8IDQpICYgMHgzRl07XG4gICAgcmVzdWx0ICs9IG1hcFs2NF07XG4gICAgcmVzdWx0ICs9IG1hcFs2NF07XG4gIH1cblxuICByZXR1cm4gcmVzdWx0O1xufVxuXG5mdW5jdGlvbiBpc0JpbmFyeShvYmplY3QpIHtcbiAgcmV0dXJuIE5vZGVCdWZmZXIgJiYgTm9kZUJ1ZmZlci5pc0J1ZmZlcihvYmplY3QpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IG5ldyBUeXBlKCd0YWc6eWFtbC5vcmcsMjAwMjpiaW5hcnknLCB7XG4gIGtpbmQ6ICdzY2FsYXInLFxuICByZXNvbHZlOiByZXNvbHZlWWFtbEJpbmFyeSxcbiAgY29uc3RydWN0OiBjb25zdHJ1Y3RZYW1sQmluYXJ5LFxuICBwcmVkaWNhdGU6IGlzQmluYXJ5LFxuICByZXByZXNlbnQ6IHJlcHJlc2VudFlhbWxCaW5hcnlcbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgVHlwZSA9IHJlcXVpcmUoJy4uL3R5cGUnKTtcblxuZnVuY3Rpb24gcmVzb2x2ZVlhbWxCb29sZWFuKGRhdGEpIHtcbiAgaWYgKGRhdGEgPT09IG51bGwpIHJldHVybiBmYWxzZTtcblxuICB2YXIgbWF4ID0gZGF0YS5sZW5ndGg7XG5cbiAgcmV0dXJuIChtYXggPT09IDQgJiYgKGRhdGEgPT09ICd0cnVlJyB8fCBkYXRhID09PSAnVHJ1ZScgfHwgZGF0YSA9PT0gJ1RSVUUnKSkgfHxcbiAgICAgICAgIChtYXggPT09IDUgJiYgKGRhdGEgPT09ICdmYWxzZScgfHwgZGF0YSA9PT0gJ0ZhbHNlJyB8fCBkYXRhID09PSAnRkFMU0UnKSk7XG59XG5cbmZ1bmN0aW9uIGNvbnN0cnVjdFlhbWxCb29sZWFuKGRhdGEpIHtcbiAgcmV0dXJuIGRhdGEgPT09ICd0cnVlJyB8fFxuICAgICAgICAgZGF0YSA9PT0gJ1RydWUnIHx8XG4gICAgICAgICBkYXRhID09PSAnVFJVRSc7XG59XG5cbmZ1bmN0aW9uIGlzQm9vbGVhbihvYmplY3QpIHtcbiAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvYmplY3QpID09PSAnW29iamVjdCBCb29sZWFuXSc7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gbmV3IFR5cGUoJ3RhZzp5YW1sLm9yZywyMDAyOmJvb2wnLCB7XG4gIGtpbmQ6ICdzY2FsYXInLFxuICByZXNvbHZlOiByZXNvbHZlWWFtbEJvb2xlYW4sXG4gIGNvbnN0cnVjdDogY29uc3RydWN0WWFtbEJvb2xlYW4sXG4gIHByZWRpY2F0ZTogaXNCb29sZWFuLFxuICByZXByZXNlbnQ6IHtcbiAgICBsb3dlcmNhc2U6IGZ1bmN0aW9uIChvYmplY3QpIHsgcmV0dXJuIG9iamVjdCA/ICd0cnVlJyA6ICdmYWxzZSc7IH0sXG4gICAgdXBwZXJjYXNlOiBmdW5jdGlvbiAob2JqZWN0KSB7IHJldHVybiBvYmplY3QgPyAnVFJVRScgOiAnRkFMU0UnOyB9LFxuICAgIGNhbWVsY2FzZTogZnVuY3Rpb24gKG9iamVjdCkgeyByZXR1cm4gb2JqZWN0ID8gJ1RydWUnIDogJ0ZhbHNlJzsgfVxuICB9LFxuICBkZWZhdWx0U3R5bGU6ICdsb3dlcmNhc2UnXG59KTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIGNvbW1vbiA9IHJlcXVpcmUoJy4uL2NvbW1vbicpO1xudmFyIFR5cGUgICA9IHJlcXVpcmUoJy4uL3R5cGUnKTtcblxudmFyIFlBTUxfRkxPQVRfUEFUVEVSTiA9IG5ldyBSZWdFeHAoXG4gICdeKD86Wy0rXT8oPzpbMC05XVswLTlfXSopXFxcXC5bMC05X10qKD86W2VFXVstK11bMC05XSspPycgK1xuICAnfFxcXFwuWzAtOV9dKyg/OltlRV1bLStdWzAtOV0rKT8nICtcbiAgJ3xbLStdP1swLTldWzAtOV9dKig/OjpbMC01XT9bMC05XSkrXFxcXC5bMC05X10qJyArXG4gICd8Wy0rXT9cXFxcLig/OmluZnxJbmZ8SU5GKScgK1xuICAnfFxcXFwuKD86bmFufE5hTnxOQU4pKSQnKTtcblxuZnVuY3Rpb24gcmVzb2x2ZVlhbWxGbG9hdChkYXRhKSB7XG4gIGlmIChkYXRhID09PSBudWxsKSByZXR1cm4gZmFsc2U7XG5cbiAgaWYgKCFZQU1MX0ZMT0FUX1BBVFRFUk4udGVzdChkYXRhKSkgcmV0dXJuIGZhbHNlO1xuXG4gIHJldHVybiB0cnVlO1xufVxuXG5mdW5jdGlvbiBjb25zdHJ1Y3RZYW1sRmxvYXQoZGF0YSkge1xuICB2YXIgdmFsdWUsIHNpZ24sIGJhc2UsIGRpZ2l0cztcblxuICB2YWx1ZSAgPSBkYXRhLnJlcGxhY2UoL18vZywgJycpLnRvTG93ZXJDYXNlKCk7XG4gIHNpZ24gICA9IHZhbHVlWzBdID09PSAnLScgPyAtMSA6IDE7XG4gIGRpZ2l0cyA9IFtdO1xuXG4gIGlmICgnKy0nLmluZGV4T2YodmFsdWVbMF0pID49IDApIHtcbiAgICB2YWx1ZSA9IHZhbHVlLnNsaWNlKDEpO1xuICB9XG5cbiAgaWYgKHZhbHVlID09PSAnLmluZicpIHtcbiAgICByZXR1cm4gKHNpZ24gPT09IDEpID8gTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZIDogTnVtYmVyLk5FR0FUSVZFX0lORklOSVRZO1xuXG4gIH0gZWxzZSBpZiAodmFsdWUgPT09ICcubmFuJykge1xuICAgIHJldHVybiBOYU47XG5cbiAgfSBlbHNlIGlmICh2YWx1ZS5pbmRleE9mKCc6JykgPj0gMCkge1xuICAgIHZhbHVlLnNwbGl0KCc6JykuZm9yRWFjaChmdW5jdGlvbiAodikge1xuICAgICAgZGlnaXRzLnVuc2hpZnQocGFyc2VGbG9hdCh2LCAxMCkpO1xuICAgIH0pO1xuXG4gICAgdmFsdWUgPSAwLjA7XG4gICAgYmFzZSA9IDE7XG5cbiAgICBkaWdpdHMuZm9yRWFjaChmdW5jdGlvbiAoZCkge1xuICAgICAgdmFsdWUgKz0gZCAqIGJhc2U7XG4gICAgICBiYXNlICo9IDYwO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIHNpZ24gKiB2YWx1ZTtcblxuICB9XG4gIHJldHVybiBzaWduICogcGFyc2VGbG9hdCh2YWx1ZSwgMTApO1xufVxuXG5cbnZhciBTQ0lFTlRJRklDX1dJVEhPVVRfRE9UID0gL15bLStdP1swLTldK2UvO1xuXG5mdW5jdGlvbiByZXByZXNlbnRZYW1sRmxvYXQob2JqZWN0LCBzdHlsZSkge1xuICB2YXIgcmVzO1xuXG4gIGlmIChpc05hTihvYmplY3QpKSB7XG4gICAgc3dpdGNoIChzdHlsZSkge1xuICAgICAgY2FzZSAnbG93ZXJjYXNlJzogcmV0dXJuICcubmFuJztcbiAgICAgIGNhc2UgJ3VwcGVyY2FzZSc6IHJldHVybiAnLk5BTic7XG4gICAgICBjYXNlICdjYW1lbGNhc2UnOiByZXR1cm4gJy5OYU4nO1xuICAgIH1cbiAgfSBlbHNlIGlmIChOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFkgPT09IG9iamVjdCkge1xuICAgIHN3aXRjaCAoc3R5bGUpIHtcbiAgICAgIGNhc2UgJ2xvd2VyY2FzZSc6IHJldHVybiAnLmluZic7XG4gICAgICBjYXNlICd1cHBlcmNhc2UnOiByZXR1cm4gJy5JTkYnO1xuICAgICAgY2FzZSAnY2FtZWxjYXNlJzogcmV0dXJuICcuSW5mJztcbiAgICB9XG4gIH0gZWxzZSBpZiAoTnVtYmVyLk5FR0FUSVZFX0lORklOSVRZID09PSBvYmplY3QpIHtcbiAgICBzd2l0Y2ggKHN0eWxlKSB7XG4gICAgICBjYXNlICdsb3dlcmNhc2UnOiByZXR1cm4gJy0uaW5mJztcbiAgICAgIGNhc2UgJ3VwcGVyY2FzZSc6IHJldHVybiAnLS5JTkYnO1xuICAgICAgY2FzZSAnY2FtZWxjYXNlJzogcmV0dXJuICctLkluZic7XG4gICAgfVxuICB9IGVsc2UgaWYgKGNvbW1vbi5pc05lZ2F0aXZlWmVybyhvYmplY3QpKSB7XG4gICAgcmV0dXJuICctMC4wJztcbiAgfVxuXG4gIHJlcyA9IG9iamVjdC50b1N0cmluZygxMCk7XG5cbiAgLy8gSlMgc3RyaW5naWZpZXIgY2FuIGJ1aWxkIHNjaWVudGlmaWMgZm9ybWF0IHdpdGhvdXQgZG90czogNWUtMTAwLFxuICAvLyB3aGlsZSBZQU1MIHJlcXVyZXMgZG90OiA1LmUtMTAwLiBGaXggaXQgd2l0aCBzaW1wbGUgaGFja1xuXG4gIHJldHVybiBTQ0lFTlRJRklDX1dJVEhPVVRfRE9ULnRlc3QocmVzKSA/IHJlcy5yZXBsYWNlKCdlJywgJy5lJykgOiByZXM7XG59XG5cbmZ1bmN0aW9uIGlzRmxvYXQob2JqZWN0KSB7XG4gIHJldHVybiAoT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG9iamVjdCkgPT09ICdbb2JqZWN0IE51bWJlcl0nKSAmJlxuICAgICAgICAgKG9iamVjdCAlIDEgIT09IDAgfHwgY29tbW9uLmlzTmVnYXRpdmVaZXJvKG9iamVjdCkpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IG5ldyBUeXBlKCd0YWc6eWFtbC5vcmcsMjAwMjpmbG9hdCcsIHtcbiAga2luZDogJ3NjYWxhcicsXG4gIHJlc29sdmU6IHJlc29sdmVZYW1sRmxvYXQsXG4gIGNvbnN0cnVjdDogY29uc3RydWN0WWFtbEZsb2F0LFxuICBwcmVkaWNhdGU6IGlzRmxvYXQsXG4gIHJlcHJlc2VudDogcmVwcmVzZW50WWFtbEZsb2F0LFxuICBkZWZhdWx0U3R5bGU6ICdsb3dlcmNhc2UnXG59KTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIGNvbW1vbiA9IHJlcXVpcmUoJy4uL2NvbW1vbicpO1xudmFyIFR5cGUgICA9IHJlcXVpcmUoJy4uL3R5cGUnKTtcblxuZnVuY3Rpb24gaXNIZXhDb2RlKGMpIHtcbiAgcmV0dXJuICgoMHgzMC8qIDAgKi8gPD0gYykgJiYgKGMgPD0gMHgzOS8qIDkgKi8pKSB8fFxuICAgICAgICAgKCgweDQxLyogQSAqLyA8PSBjKSAmJiAoYyA8PSAweDQ2LyogRiAqLykpIHx8XG4gICAgICAgICAoKDB4NjEvKiBhICovIDw9IGMpICYmIChjIDw9IDB4NjYvKiBmICovKSk7XG59XG5cbmZ1bmN0aW9uIGlzT2N0Q29kZShjKSB7XG4gIHJldHVybiAoKDB4MzAvKiAwICovIDw9IGMpICYmIChjIDw9IDB4MzcvKiA3ICovKSk7XG59XG5cbmZ1bmN0aW9uIGlzRGVjQ29kZShjKSB7XG4gIHJldHVybiAoKDB4MzAvKiAwICovIDw9IGMpICYmIChjIDw9IDB4MzkvKiA5ICovKSk7XG59XG5cbmZ1bmN0aW9uIHJlc29sdmVZYW1sSW50ZWdlcihkYXRhKSB7XG4gIGlmIChkYXRhID09PSBudWxsKSByZXR1cm4gZmFsc2U7XG5cbiAgdmFyIG1heCA9IGRhdGEubGVuZ3RoLFxuICAgICAgaW5kZXggPSAwLFxuICAgICAgaGFzRGlnaXRzID0gZmFsc2UsXG4gICAgICBjaDtcblxuICBpZiAoIW1heCkgcmV0dXJuIGZhbHNlO1xuXG4gIGNoID0gZGF0YVtpbmRleF07XG5cbiAgLy8gc2lnblxuICBpZiAoY2ggPT09ICctJyB8fCBjaCA9PT0gJysnKSB7XG4gICAgY2ggPSBkYXRhWysraW5kZXhdO1xuICB9XG5cbiAgaWYgKGNoID09PSAnMCcpIHtcbiAgICAvLyAwXG4gICAgaWYgKGluZGV4ICsgMSA9PT0gbWF4KSByZXR1cm4gdHJ1ZTtcbiAgICBjaCA9IGRhdGFbKytpbmRleF07XG5cbiAgICAvLyBiYXNlIDIsIGJhc2UgOCwgYmFzZSAxNlxuXG4gICAgaWYgKGNoID09PSAnYicpIHtcbiAgICAgIC8vIGJhc2UgMlxuICAgICAgaW5kZXgrKztcblxuICAgICAgZm9yICg7IGluZGV4IDwgbWF4OyBpbmRleCsrKSB7XG4gICAgICAgIGNoID0gZGF0YVtpbmRleF07XG4gICAgICAgIGlmIChjaCA9PT0gJ18nKSBjb250aW51ZTtcbiAgICAgICAgaWYgKGNoICE9PSAnMCcgJiYgY2ggIT09ICcxJykgcmV0dXJuIGZhbHNlO1xuICAgICAgICBoYXNEaWdpdHMgPSB0cnVlO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGhhc0RpZ2l0cztcbiAgICB9XG5cblxuICAgIGlmIChjaCA9PT0gJ3gnKSB7XG4gICAgICAvLyBiYXNlIDE2XG4gICAgICBpbmRleCsrO1xuXG4gICAgICBmb3IgKDsgaW5kZXggPCBtYXg7IGluZGV4KyspIHtcbiAgICAgICAgY2ggPSBkYXRhW2luZGV4XTtcbiAgICAgICAgaWYgKGNoID09PSAnXycpIGNvbnRpbnVlO1xuICAgICAgICBpZiAoIWlzSGV4Q29kZShkYXRhLmNoYXJDb2RlQXQoaW5kZXgpKSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICBoYXNEaWdpdHMgPSB0cnVlO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGhhc0RpZ2l0cztcbiAgICB9XG5cbiAgICAvLyBiYXNlIDhcbiAgICBmb3IgKDsgaW5kZXggPCBtYXg7IGluZGV4KyspIHtcbiAgICAgIGNoID0gZGF0YVtpbmRleF07XG4gICAgICBpZiAoY2ggPT09ICdfJykgY29udGludWU7XG4gICAgICBpZiAoIWlzT2N0Q29kZShkYXRhLmNoYXJDb2RlQXQoaW5kZXgpKSkgcmV0dXJuIGZhbHNlO1xuICAgICAgaGFzRGlnaXRzID0gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGhhc0RpZ2l0cztcbiAgfVxuXG4gIC8vIGJhc2UgMTAgKGV4Y2VwdCAwKSBvciBiYXNlIDYwXG5cbiAgZm9yICg7IGluZGV4IDwgbWF4OyBpbmRleCsrKSB7XG4gICAgY2ggPSBkYXRhW2luZGV4XTtcbiAgICBpZiAoY2ggPT09ICdfJykgY29udGludWU7XG4gICAgaWYgKGNoID09PSAnOicpIGJyZWFrO1xuICAgIGlmICghaXNEZWNDb2RlKGRhdGEuY2hhckNvZGVBdChpbmRleCkpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGhhc0RpZ2l0cyA9IHRydWU7XG4gIH1cblxuICBpZiAoIWhhc0RpZ2l0cykgcmV0dXJuIGZhbHNlO1xuXG4gIC8vIGlmICFiYXNlNjAgLSBkb25lO1xuICBpZiAoY2ggIT09ICc6JykgcmV0dXJuIHRydWU7XG5cbiAgLy8gYmFzZTYwIGFsbW9zdCBub3QgdXNlZCwgbm8gbmVlZHMgdG8gb3B0aW1pemVcbiAgcmV0dXJuIC9eKDpbMC01XT9bMC05XSkrJC8udGVzdChkYXRhLnNsaWNlKGluZGV4KSk7XG59XG5cbmZ1bmN0aW9uIGNvbnN0cnVjdFlhbWxJbnRlZ2VyKGRhdGEpIHtcbiAgdmFyIHZhbHVlID0gZGF0YSwgc2lnbiA9IDEsIGNoLCBiYXNlLCBkaWdpdHMgPSBbXTtcblxuICBpZiAodmFsdWUuaW5kZXhPZignXycpICE9PSAtMSkge1xuICAgIHZhbHVlID0gdmFsdWUucmVwbGFjZSgvXy9nLCAnJyk7XG4gIH1cblxuICBjaCA9IHZhbHVlWzBdO1xuXG4gIGlmIChjaCA9PT0gJy0nIHx8IGNoID09PSAnKycpIHtcbiAgICBpZiAoY2ggPT09ICctJykgc2lnbiA9IC0xO1xuICAgIHZhbHVlID0gdmFsdWUuc2xpY2UoMSk7XG4gICAgY2ggPSB2YWx1ZVswXTtcbiAgfVxuXG4gIGlmICh2YWx1ZSA9PT0gJzAnKSByZXR1cm4gMDtcblxuICBpZiAoY2ggPT09ICcwJykge1xuICAgIGlmICh2YWx1ZVsxXSA9PT0gJ2InKSByZXR1cm4gc2lnbiAqIHBhcnNlSW50KHZhbHVlLnNsaWNlKDIpLCAyKTtcbiAgICBpZiAodmFsdWVbMV0gPT09ICd4JykgcmV0dXJuIHNpZ24gKiBwYXJzZUludCh2YWx1ZSwgMTYpO1xuICAgIHJldHVybiBzaWduICogcGFyc2VJbnQodmFsdWUsIDgpO1xuICB9XG5cbiAgaWYgKHZhbHVlLmluZGV4T2YoJzonKSAhPT0gLTEpIHtcbiAgICB2YWx1ZS5zcGxpdCgnOicpLmZvckVhY2goZnVuY3Rpb24gKHYpIHtcbiAgICAgIGRpZ2l0cy51bnNoaWZ0KHBhcnNlSW50KHYsIDEwKSk7XG4gICAgfSk7XG5cbiAgICB2YWx1ZSA9IDA7XG4gICAgYmFzZSA9IDE7XG5cbiAgICBkaWdpdHMuZm9yRWFjaChmdW5jdGlvbiAoZCkge1xuICAgICAgdmFsdWUgKz0gKGQgKiBiYXNlKTtcbiAgICAgIGJhc2UgKj0gNjA7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gc2lnbiAqIHZhbHVlO1xuXG4gIH1cblxuICByZXR1cm4gc2lnbiAqIHBhcnNlSW50KHZhbHVlLCAxMCk7XG59XG5cbmZ1bmN0aW9uIGlzSW50ZWdlcihvYmplY3QpIHtcbiAgcmV0dXJuIChPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwob2JqZWN0KSkgPT09ICdbb2JqZWN0IE51bWJlcl0nICYmXG4gICAgICAgICAob2JqZWN0ICUgMSA9PT0gMCAmJiAhY29tbW9uLmlzTmVnYXRpdmVaZXJvKG9iamVjdCkpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IG5ldyBUeXBlKCd0YWc6eWFtbC5vcmcsMjAwMjppbnQnLCB7XG4gIGtpbmQ6ICdzY2FsYXInLFxuICByZXNvbHZlOiByZXNvbHZlWWFtbEludGVnZXIsXG4gIGNvbnN0cnVjdDogY29uc3RydWN0WWFtbEludGVnZXIsXG4gIHByZWRpY2F0ZTogaXNJbnRlZ2VyLFxuICByZXByZXNlbnQ6IHtcbiAgICBiaW5hcnk6ICAgICAgZnVuY3Rpb24gKG9iamVjdCkgeyByZXR1cm4gJzBiJyArIG9iamVjdC50b1N0cmluZygyKTsgfSxcbiAgICBvY3RhbDogICAgICAgZnVuY3Rpb24gKG9iamVjdCkgeyByZXR1cm4gJzAnICArIG9iamVjdC50b1N0cmluZyg4KTsgfSxcbiAgICBkZWNpbWFsOiAgICAgZnVuY3Rpb24gKG9iamVjdCkgeyByZXR1cm4gICAgICAgIG9iamVjdC50b1N0cmluZygxMCk7IH0sXG4gICAgaGV4YWRlY2ltYWw6IGZ1bmN0aW9uIChvYmplY3QpIHsgcmV0dXJuICcweCcgKyBvYmplY3QudG9TdHJpbmcoMTYpLnRvVXBwZXJDYXNlKCk7IH1cbiAgfSxcbiAgZGVmYXVsdFN0eWxlOiAnZGVjaW1hbCcsXG4gIHN0eWxlQWxpYXNlczoge1xuICAgIGJpbmFyeTogICAgICBbIDIsICAnYmluJyBdLFxuICAgIG9jdGFsOiAgICAgICBbIDgsICAnb2N0JyBdLFxuICAgIGRlY2ltYWw6ICAgICBbIDEwLCAnZGVjJyBdLFxuICAgIGhleGFkZWNpbWFsOiBbIDE2LCAnaGV4JyBdXG4gIH1cbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgZXNwcmltYTtcblxuLy8gQnJvd3NlcmlmaWVkIHZlcnNpb24gZG9lcyBub3QgaGF2ZSBlc3ByaW1hXG4vL1xuLy8gMS4gRm9yIG5vZGUuanMganVzdCByZXF1aXJlIG1vZHVsZSBhcyBkZXBzXG4vLyAyLiBGb3IgYnJvd3NlciB0cnkgdG8gcmVxdWlyZSBtdWR1bGUgdmlhIGV4dGVybmFsIEFNRCBzeXN0ZW0uXG4vLyAgICBJZiBub3QgZm91bmQgLSB0cnkgdG8gZmFsbGJhY2sgdG8gd2luZG93LmVzcHJpbWEuIElmIG5vdFxuLy8gICAgZm91bmQgdG9vIC0gdGhlbiBmYWlsIHRvIHBhcnNlLlxuLy9cbnRyeSB7XG4gIC8vIHdvcmthcm91bmQgdG8gZXhjbHVkZSBwYWNrYWdlIGZyb20gYnJvd3NlcmlmeSBsaXN0LlxuICB2YXIgX3JlcXVpcmUgPSByZXF1aXJlO1xuICBlc3ByaW1hID0gX3JlcXVpcmUoJ2VzcHJpbWEnKTtcbn0gY2F0Y2ggKF8pIHtcbiAgLypnbG9iYWwgd2luZG93ICovXG4gIGlmICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJykgZXNwcmltYSA9IHdpbmRvdy5lc3ByaW1hO1xufVxuXG52YXIgVHlwZSA9IHJlcXVpcmUoJy4uLy4uL3R5cGUnKTtcblxuZnVuY3Rpb24gcmVzb2x2ZUphdmFzY3JpcHRGdW5jdGlvbihkYXRhKSB7XG4gIGlmIChkYXRhID09PSBudWxsKSByZXR1cm4gZmFsc2U7XG5cbiAgdHJ5IHtcbiAgICB2YXIgc291cmNlID0gJygnICsgZGF0YSArICcpJyxcbiAgICAgICAgYXN0ICAgID0gZXNwcmltYS5wYXJzZShzb3VyY2UsIHsgcmFuZ2U6IHRydWUgfSk7XG5cbiAgICBpZiAoYXN0LnR5cGUgICAgICAgICAgICAgICAgICAgICE9PSAnUHJvZ3JhbScgICAgICAgICAgICAgfHxcbiAgICAgICAgYXN0LmJvZHkubGVuZ3RoICAgICAgICAgICAgICE9PSAxICAgICAgICAgICAgICAgICAgICAgfHxcbiAgICAgICAgYXN0LmJvZHlbMF0udHlwZSAgICAgICAgICAgICE9PSAnRXhwcmVzc2lvblN0YXRlbWVudCcgfHxcbiAgICAgICAgYXN0LmJvZHlbMF0uZXhwcmVzc2lvbi50eXBlICE9PSAnRnVuY3Rpb25FeHByZXNzaW9uJykge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHJldHVybiB0cnVlO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuZnVuY3Rpb24gY29uc3RydWN0SmF2YXNjcmlwdEZ1bmN0aW9uKGRhdGEpIHtcbiAgLypqc2xpbnQgZXZpbDp0cnVlKi9cblxuICB2YXIgc291cmNlID0gJygnICsgZGF0YSArICcpJyxcbiAgICAgIGFzdCAgICA9IGVzcHJpbWEucGFyc2Uoc291cmNlLCB7IHJhbmdlOiB0cnVlIH0pLFxuICAgICAgcGFyYW1zID0gW10sXG4gICAgICBib2R5O1xuXG4gIGlmIChhc3QudHlwZSAgICAgICAgICAgICAgICAgICAgIT09ICdQcm9ncmFtJyAgICAgICAgICAgICB8fFxuICAgICAgYXN0LmJvZHkubGVuZ3RoICAgICAgICAgICAgICE9PSAxICAgICAgICAgICAgICAgICAgICAgfHxcbiAgICAgIGFzdC5ib2R5WzBdLnR5cGUgICAgICAgICAgICAhPT0gJ0V4cHJlc3Npb25TdGF0ZW1lbnQnIHx8XG4gICAgICBhc3QuYm9keVswXS5leHByZXNzaW9uLnR5cGUgIT09ICdGdW5jdGlvbkV4cHJlc3Npb24nKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdGYWlsZWQgdG8gcmVzb2x2ZSBmdW5jdGlvbicpO1xuICB9XG5cbiAgYXN0LmJvZHlbMF0uZXhwcmVzc2lvbi5wYXJhbXMuZm9yRWFjaChmdW5jdGlvbiAocGFyYW0pIHtcbiAgICBwYXJhbXMucHVzaChwYXJhbS5uYW1lKTtcbiAgfSk7XG5cbiAgYm9keSA9IGFzdC5ib2R5WzBdLmV4cHJlc3Npb24uYm9keS5yYW5nZTtcblxuICAvLyBFc3ByaW1hJ3MgcmFuZ2VzIGluY2x1ZGUgdGhlIGZpcnN0ICd7JyBhbmQgdGhlIGxhc3QgJ30nIGNoYXJhY3RlcnMgb25cbiAgLy8gZnVuY3Rpb24gZXhwcmVzc2lvbnMuIFNvIGN1dCB0aGVtIG91dC5cbiAgLyplc2xpbnQtZGlzYWJsZSBuby1uZXctZnVuYyovXG4gIHJldHVybiBuZXcgRnVuY3Rpb24ocGFyYW1zLCBzb3VyY2Uuc2xpY2UoYm9keVswXSArIDEsIGJvZHlbMV0gLSAxKSk7XG59XG5cbmZ1bmN0aW9uIHJlcHJlc2VudEphdmFzY3JpcHRGdW5jdGlvbihvYmplY3QgLyosIHN0eWxlKi8pIHtcbiAgcmV0dXJuIG9iamVjdC50b1N0cmluZygpO1xufVxuXG5mdW5jdGlvbiBpc0Z1bmN0aW9uKG9iamVjdCkge1xuICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG9iamVjdCkgPT09ICdbb2JqZWN0IEZ1bmN0aW9uXSc7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gbmV3IFR5cGUoJ3RhZzp5YW1sLm9yZywyMDAyOmpzL2Z1bmN0aW9uJywge1xuICBraW5kOiAnc2NhbGFyJyxcbiAgcmVzb2x2ZTogcmVzb2x2ZUphdmFzY3JpcHRGdW5jdGlvbixcbiAgY29uc3RydWN0OiBjb25zdHJ1Y3RKYXZhc2NyaXB0RnVuY3Rpb24sXG4gIHByZWRpY2F0ZTogaXNGdW5jdGlvbixcbiAgcmVwcmVzZW50OiByZXByZXNlbnRKYXZhc2NyaXB0RnVuY3Rpb25cbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgVHlwZSA9IHJlcXVpcmUoJy4uLy4uL3R5cGUnKTtcblxuZnVuY3Rpb24gcmVzb2x2ZUphdmFzY3JpcHRSZWdFeHAoZGF0YSkge1xuICBpZiAoZGF0YSA9PT0gbnVsbCkgcmV0dXJuIGZhbHNlO1xuICBpZiAoZGF0YS5sZW5ndGggPT09IDApIHJldHVybiBmYWxzZTtcblxuICB2YXIgcmVnZXhwID0gZGF0YSxcbiAgICAgIHRhaWwgICA9IC9cXC8oW2dpbV0qKSQvLmV4ZWMoZGF0YSksXG4gICAgICBtb2RpZmllcnMgPSAnJztcblxuICAvLyBpZiByZWdleHAgc3RhcnRzIHdpdGggJy8nIGl0IGNhbiBoYXZlIG1vZGlmaWVycyBhbmQgbXVzdCBiZSBwcm9wZXJseSBjbG9zZWRcbiAgLy8gYC9mb28vZ2ltYCAtIG1vZGlmaWVycyB0YWlsIGNhbiBiZSBtYXhpbXVtIDMgY2hhcnNcbiAgaWYgKHJlZ2V4cFswXSA9PT0gJy8nKSB7XG4gICAgaWYgKHRhaWwpIG1vZGlmaWVycyA9IHRhaWxbMV07XG5cbiAgICBpZiAobW9kaWZpZXJzLmxlbmd0aCA+IDMpIHJldHVybiBmYWxzZTtcbiAgICAvLyBpZiBleHByZXNzaW9uIHN0YXJ0cyB3aXRoIC8sIGlzIHNob3VsZCBiZSBwcm9wZXJseSB0ZXJtaW5hdGVkXG4gICAgaWYgKHJlZ2V4cFtyZWdleHAubGVuZ3RoIC0gbW9kaWZpZXJzLmxlbmd0aCAtIDFdICE9PSAnLycpIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufVxuXG5mdW5jdGlvbiBjb25zdHJ1Y3RKYXZhc2NyaXB0UmVnRXhwKGRhdGEpIHtcbiAgdmFyIHJlZ2V4cCA9IGRhdGEsXG4gICAgICB0YWlsICAgPSAvXFwvKFtnaW1dKikkLy5leGVjKGRhdGEpLFxuICAgICAgbW9kaWZpZXJzID0gJyc7XG5cbiAgLy8gYC9mb28vZ2ltYCAtIHRhaWwgY2FuIGJlIG1heGltdW0gNCBjaGFyc1xuICBpZiAocmVnZXhwWzBdID09PSAnLycpIHtcbiAgICBpZiAodGFpbCkgbW9kaWZpZXJzID0gdGFpbFsxXTtcbiAgICByZWdleHAgPSByZWdleHAuc2xpY2UoMSwgcmVnZXhwLmxlbmd0aCAtIG1vZGlmaWVycy5sZW5ndGggLSAxKTtcbiAgfVxuXG4gIHJldHVybiBuZXcgUmVnRXhwKHJlZ2V4cCwgbW9kaWZpZXJzKTtcbn1cblxuZnVuY3Rpb24gcmVwcmVzZW50SmF2YXNjcmlwdFJlZ0V4cChvYmplY3QgLyosIHN0eWxlKi8pIHtcbiAgdmFyIHJlc3VsdCA9ICcvJyArIG9iamVjdC5zb3VyY2UgKyAnLyc7XG5cbiAgaWYgKG9iamVjdC5nbG9iYWwpIHJlc3VsdCArPSAnZyc7XG4gIGlmIChvYmplY3QubXVsdGlsaW5lKSByZXN1bHQgKz0gJ20nO1xuICBpZiAob2JqZWN0Lmlnbm9yZUNhc2UpIHJlc3VsdCArPSAnaSc7XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZnVuY3Rpb24gaXNSZWdFeHAob2JqZWN0KSB7XG4gIHJldHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwob2JqZWN0KSA9PT0gJ1tvYmplY3QgUmVnRXhwXSc7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gbmV3IFR5cGUoJ3RhZzp5YW1sLm9yZywyMDAyOmpzL3JlZ2V4cCcsIHtcbiAga2luZDogJ3NjYWxhcicsXG4gIHJlc29sdmU6IHJlc29sdmVKYXZhc2NyaXB0UmVnRXhwLFxuICBjb25zdHJ1Y3Q6IGNvbnN0cnVjdEphdmFzY3JpcHRSZWdFeHAsXG4gIHByZWRpY2F0ZTogaXNSZWdFeHAsXG4gIHJlcHJlc2VudDogcmVwcmVzZW50SmF2YXNjcmlwdFJlZ0V4cFxufSk7XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBUeXBlID0gcmVxdWlyZSgnLi4vLi4vdHlwZScpO1xuXG5mdW5jdGlvbiByZXNvbHZlSmF2YXNjcmlwdFVuZGVmaW5lZCgpIHtcbiAgcmV0dXJuIHRydWU7XG59XG5cbmZ1bmN0aW9uIGNvbnN0cnVjdEphdmFzY3JpcHRVbmRlZmluZWQoKSB7XG4gIC8qZXNsaW50LWRpc2FibGUgbm8tdW5kZWZpbmVkKi9cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuZnVuY3Rpb24gcmVwcmVzZW50SmF2YXNjcmlwdFVuZGVmaW5lZCgpIHtcbiAgcmV0dXJuICcnO1xufVxuXG5mdW5jdGlvbiBpc1VuZGVmaW5lZChvYmplY3QpIHtcbiAgcmV0dXJuIHR5cGVvZiBvYmplY3QgPT09ICd1bmRlZmluZWQnO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IG5ldyBUeXBlKCd0YWc6eWFtbC5vcmcsMjAwMjpqcy91bmRlZmluZWQnLCB7XG4gIGtpbmQ6ICdzY2FsYXInLFxuICByZXNvbHZlOiByZXNvbHZlSmF2YXNjcmlwdFVuZGVmaW5lZCxcbiAgY29uc3RydWN0OiBjb25zdHJ1Y3RKYXZhc2NyaXB0VW5kZWZpbmVkLFxuICBwcmVkaWNhdGU6IGlzVW5kZWZpbmVkLFxuICByZXByZXNlbnQ6IHJlcHJlc2VudEphdmFzY3JpcHRVbmRlZmluZWRcbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgVHlwZSA9IHJlcXVpcmUoJy4uL3R5cGUnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBuZXcgVHlwZSgndGFnOnlhbWwub3JnLDIwMDI6bWFwJywge1xuICBraW5kOiAnbWFwcGluZycsXG4gIGNvbnN0cnVjdDogZnVuY3Rpb24gKGRhdGEpIHsgcmV0dXJuIGRhdGEgIT09IG51bGwgPyBkYXRhIDoge307IH1cbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgVHlwZSA9IHJlcXVpcmUoJy4uL3R5cGUnKTtcblxuZnVuY3Rpb24gcmVzb2x2ZVlhbWxNZXJnZShkYXRhKSB7XG4gIHJldHVybiBkYXRhID09PSAnPDwnIHx8IGRhdGEgPT09IG51bGw7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gbmV3IFR5cGUoJ3RhZzp5YW1sLm9yZywyMDAyOm1lcmdlJywge1xuICBraW5kOiAnc2NhbGFyJyxcbiAgcmVzb2x2ZTogcmVzb2x2ZVlhbWxNZXJnZVxufSk7XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBUeXBlID0gcmVxdWlyZSgnLi4vdHlwZScpO1xuXG5mdW5jdGlvbiByZXNvbHZlWWFtbE51bGwoZGF0YSkge1xuICBpZiAoZGF0YSA9PT0gbnVsbCkgcmV0dXJuIHRydWU7XG5cbiAgdmFyIG1heCA9IGRhdGEubGVuZ3RoO1xuXG4gIHJldHVybiAobWF4ID09PSAxICYmIGRhdGEgPT09ICd+JykgfHxcbiAgICAgICAgIChtYXggPT09IDQgJiYgKGRhdGEgPT09ICdudWxsJyB8fCBkYXRhID09PSAnTnVsbCcgfHwgZGF0YSA9PT0gJ05VTEwnKSk7XG59XG5cbmZ1bmN0aW9uIGNvbnN0cnVjdFlhbWxOdWxsKCkge1xuICByZXR1cm4gbnVsbDtcbn1cblxuZnVuY3Rpb24gaXNOdWxsKG9iamVjdCkge1xuICByZXR1cm4gb2JqZWN0ID09PSBudWxsO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IG5ldyBUeXBlKCd0YWc6eWFtbC5vcmcsMjAwMjpudWxsJywge1xuICBraW5kOiAnc2NhbGFyJyxcbiAgcmVzb2x2ZTogcmVzb2x2ZVlhbWxOdWxsLFxuICBjb25zdHJ1Y3Q6IGNvbnN0cnVjdFlhbWxOdWxsLFxuICBwcmVkaWNhdGU6IGlzTnVsbCxcbiAgcmVwcmVzZW50OiB7XG4gICAgY2Fub25pY2FsOiBmdW5jdGlvbiAoKSB7IHJldHVybiAnfic7ICAgIH0sXG4gICAgbG93ZXJjYXNlOiBmdW5jdGlvbiAoKSB7IHJldHVybiAnbnVsbCc7IH0sXG4gICAgdXBwZXJjYXNlOiBmdW5jdGlvbiAoKSB7IHJldHVybiAnTlVMTCc7IH0sXG4gICAgY2FtZWxjYXNlOiBmdW5jdGlvbiAoKSB7IHJldHVybiAnTnVsbCc7IH1cbiAgfSxcbiAgZGVmYXVsdFN0eWxlOiAnbG93ZXJjYXNlJ1xufSk7XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBUeXBlID0gcmVxdWlyZSgnLi4vdHlwZScpO1xuXG52YXIgX2hhc093blByb3BlcnR5ID0gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTtcbnZhciBfdG9TdHJpbmcgICAgICAgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nO1xuXG5mdW5jdGlvbiByZXNvbHZlWWFtbE9tYXAoZGF0YSkge1xuICBpZiAoZGF0YSA9PT0gbnVsbCkgcmV0dXJuIHRydWU7XG5cbiAgdmFyIG9iamVjdEtleXMgPSBbXSwgaW5kZXgsIGxlbmd0aCwgcGFpciwgcGFpcktleSwgcGFpckhhc0tleSxcbiAgICAgIG9iamVjdCA9IGRhdGE7XG5cbiAgZm9yIChpbmRleCA9IDAsIGxlbmd0aCA9IG9iamVjdC5sZW5ndGg7IGluZGV4IDwgbGVuZ3RoOyBpbmRleCArPSAxKSB7XG4gICAgcGFpciA9IG9iamVjdFtpbmRleF07XG4gICAgcGFpckhhc0tleSA9IGZhbHNlO1xuXG4gICAgaWYgKF90b1N0cmluZy5jYWxsKHBhaXIpICE9PSAnW29iamVjdCBPYmplY3RdJykgcmV0dXJuIGZhbHNlO1xuXG4gICAgZm9yIChwYWlyS2V5IGluIHBhaXIpIHtcbiAgICAgIGlmIChfaGFzT3duUHJvcGVydHkuY2FsbChwYWlyLCBwYWlyS2V5KSkge1xuICAgICAgICBpZiAoIXBhaXJIYXNLZXkpIHBhaXJIYXNLZXkgPSB0cnVlO1xuICAgICAgICBlbHNlIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoIXBhaXJIYXNLZXkpIHJldHVybiBmYWxzZTtcblxuICAgIGlmIChvYmplY3RLZXlzLmluZGV4T2YocGFpcktleSkgPT09IC0xKSBvYmplY3RLZXlzLnB1c2gocGFpcktleSk7XG4gICAgZWxzZSByZXR1cm4gZmFsc2U7XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn1cblxuZnVuY3Rpb24gY29uc3RydWN0WWFtbE9tYXAoZGF0YSkge1xuICByZXR1cm4gZGF0YSAhPT0gbnVsbCA/IGRhdGEgOiBbXTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBuZXcgVHlwZSgndGFnOnlhbWwub3JnLDIwMDI6b21hcCcsIHtcbiAga2luZDogJ3NlcXVlbmNlJyxcbiAgcmVzb2x2ZTogcmVzb2x2ZVlhbWxPbWFwLFxuICBjb25zdHJ1Y3Q6IGNvbnN0cnVjdFlhbWxPbWFwXG59KTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIFR5cGUgPSByZXF1aXJlKCcuLi90eXBlJyk7XG5cbnZhciBfdG9TdHJpbmcgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nO1xuXG5mdW5jdGlvbiByZXNvbHZlWWFtbFBhaXJzKGRhdGEpIHtcbiAgaWYgKGRhdGEgPT09IG51bGwpIHJldHVybiB0cnVlO1xuXG4gIHZhciBpbmRleCwgbGVuZ3RoLCBwYWlyLCBrZXlzLCByZXN1bHQsXG4gICAgICBvYmplY3QgPSBkYXRhO1xuXG4gIHJlc3VsdCA9IG5ldyBBcnJheShvYmplY3QubGVuZ3RoKTtcblxuICBmb3IgKGluZGV4ID0gMCwgbGVuZ3RoID0gb2JqZWN0Lmxlbmd0aDsgaW5kZXggPCBsZW5ndGg7IGluZGV4ICs9IDEpIHtcbiAgICBwYWlyID0gb2JqZWN0W2luZGV4XTtcblxuICAgIGlmIChfdG9TdHJpbmcuY2FsbChwYWlyKSAhPT0gJ1tvYmplY3QgT2JqZWN0XScpIHJldHVybiBmYWxzZTtcblxuICAgIGtleXMgPSBPYmplY3Qua2V5cyhwYWlyKTtcblxuICAgIGlmIChrZXlzLmxlbmd0aCAhPT0gMSkgcmV0dXJuIGZhbHNlO1xuXG4gICAgcmVzdWx0W2luZGV4XSA9IFsga2V5c1swXSwgcGFpcltrZXlzWzBdXSBdO1xuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59XG5cbmZ1bmN0aW9uIGNvbnN0cnVjdFlhbWxQYWlycyhkYXRhKSB7XG4gIGlmIChkYXRhID09PSBudWxsKSByZXR1cm4gW107XG5cbiAgdmFyIGluZGV4LCBsZW5ndGgsIHBhaXIsIGtleXMsIHJlc3VsdCxcbiAgICAgIG9iamVjdCA9IGRhdGE7XG5cbiAgcmVzdWx0ID0gbmV3IEFycmF5KG9iamVjdC5sZW5ndGgpO1xuXG4gIGZvciAoaW5kZXggPSAwLCBsZW5ndGggPSBvYmplY3QubGVuZ3RoOyBpbmRleCA8IGxlbmd0aDsgaW5kZXggKz0gMSkge1xuICAgIHBhaXIgPSBvYmplY3RbaW5kZXhdO1xuXG4gICAga2V5cyA9IE9iamVjdC5rZXlzKHBhaXIpO1xuXG4gICAgcmVzdWx0W2luZGV4XSA9IFsga2V5c1swXSwgcGFpcltrZXlzWzBdXSBdO1xuICB9XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBuZXcgVHlwZSgndGFnOnlhbWwub3JnLDIwMDI6cGFpcnMnLCB7XG4gIGtpbmQ6ICdzZXF1ZW5jZScsXG4gIHJlc29sdmU6IHJlc29sdmVZYW1sUGFpcnMsXG4gIGNvbnN0cnVjdDogY29uc3RydWN0WWFtbFBhaXJzXG59KTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIFR5cGUgPSByZXF1aXJlKCcuLi90eXBlJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gbmV3IFR5cGUoJ3RhZzp5YW1sLm9yZywyMDAyOnNlcScsIHtcbiAga2luZDogJ3NlcXVlbmNlJyxcbiAgY29uc3RydWN0OiBmdW5jdGlvbiAoZGF0YSkgeyByZXR1cm4gZGF0YSAhPT0gbnVsbCA/IGRhdGEgOiBbXTsgfVxufSk7XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBUeXBlID0gcmVxdWlyZSgnLi4vdHlwZScpO1xuXG52YXIgX2hhc093blByb3BlcnR5ID0gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTtcblxuZnVuY3Rpb24gcmVzb2x2ZVlhbWxTZXQoZGF0YSkge1xuICBpZiAoZGF0YSA9PT0gbnVsbCkgcmV0dXJuIHRydWU7XG5cbiAgdmFyIGtleSwgb2JqZWN0ID0gZGF0YTtcblxuICBmb3IgKGtleSBpbiBvYmplY3QpIHtcbiAgICBpZiAoX2hhc093blByb3BlcnR5LmNhbGwob2JqZWN0LCBrZXkpKSB7XG4gICAgICBpZiAob2JqZWN0W2tleV0gIT09IG51bGwpIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn1cblxuZnVuY3Rpb24gY29uc3RydWN0WWFtbFNldChkYXRhKSB7XG4gIHJldHVybiBkYXRhICE9PSBudWxsID8gZGF0YSA6IHt9O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IG5ldyBUeXBlKCd0YWc6eWFtbC5vcmcsMjAwMjpzZXQnLCB7XG4gIGtpbmQ6ICdtYXBwaW5nJyxcbiAgcmVzb2x2ZTogcmVzb2x2ZVlhbWxTZXQsXG4gIGNvbnN0cnVjdDogY29uc3RydWN0WWFtbFNldFxufSk7XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBUeXBlID0gcmVxdWlyZSgnLi4vdHlwZScpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IG5ldyBUeXBlKCd0YWc6eWFtbC5vcmcsMjAwMjpzdHInLCB7XG4gIGtpbmQ6ICdzY2FsYXInLFxuICBjb25zdHJ1Y3Q6IGZ1bmN0aW9uIChkYXRhKSB7IHJldHVybiBkYXRhICE9PSBudWxsID8gZGF0YSA6ICcnOyB9XG59KTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIFR5cGUgPSByZXF1aXJlKCcuLi90eXBlJyk7XG5cbnZhciBZQU1MX1RJTUVTVEFNUF9SRUdFWFAgPSBuZXcgUmVnRXhwKFxuICAnXihbMC05XVswLTldWzAtOV1bMC05XSknICAgICAgICAgICsgLy8gWzFdIHllYXJcbiAgJy0oWzAtOV1bMC05XT8pJyAgICAgICAgICAgICAgICAgICArIC8vIFsyXSBtb250aFxuICAnLShbMC05XVswLTldPyknICAgICAgICAgICAgICAgICAgICsgLy8gWzNdIGRheVxuICAnKD86KD86W1R0XXxbIFxcXFx0XSspJyAgICAgICAgICAgICAgKyAvLyAuLi5cbiAgJyhbMC05XVswLTldPyknICAgICAgICAgICAgICAgICAgICArIC8vIFs0XSBob3VyXG4gICc6KFswLTldWzAtOV0pJyAgICAgICAgICAgICAgICAgICAgKyAvLyBbNV0gbWludXRlXG4gICc6KFswLTldWzAtOV0pJyAgICAgICAgICAgICAgICAgICAgKyAvLyBbNl0gc2Vjb25kXG4gICcoPzpcXFxcLihbMC05XSopKT8nICAgICAgICAgICAgICAgICArIC8vIFs3XSBmcmFjdGlvblxuICAnKD86WyBcXFxcdF0qKFp8KFstK10pKFswLTldWzAtOV0/KScgKyAvLyBbOF0gdHogWzldIHR6X3NpZ24gWzEwXSB0el9ob3VyXG4gICcoPzo6KFswLTldWzAtOV0pKT8pKT8pPyQnKTsgICAgICAgICAvLyBbMTFdIHR6X21pbnV0ZVxuXG5mdW5jdGlvbiByZXNvbHZlWWFtbFRpbWVzdGFtcChkYXRhKSB7XG4gIGlmIChkYXRhID09PSBudWxsKSByZXR1cm4gZmFsc2U7XG4gIGlmIChZQU1MX1RJTUVTVEFNUF9SRUdFWFAuZXhlYyhkYXRhKSA9PT0gbnVsbCkgcmV0dXJuIGZhbHNlO1xuICByZXR1cm4gdHJ1ZTtcbn1cblxuZnVuY3Rpb24gY29uc3RydWN0WWFtbFRpbWVzdGFtcChkYXRhKSB7XG4gIHZhciBtYXRjaCwgeWVhciwgbW9udGgsIGRheSwgaG91ciwgbWludXRlLCBzZWNvbmQsIGZyYWN0aW9uID0gMCxcbiAgICAgIGRlbHRhID0gbnVsbCwgdHpfaG91ciwgdHpfbWludXRlLCBkYXRlO1xuXG4gIG1hdGNoID0gWUFNTF9USU1FU1RBTVBfUkVHRVhQLmV4ZWMoZGF0YSk7XG5cbiAgaWYgKG1hdGNoID09PSBudWxsKSB0aHJvdyBuZXcgRXJyb3IoJ0RhdGUgcmVzb2x2ZSBlcnJvcicpO1xuXG4gIC8vIG1hdGNoOiBbMV0geWVhciBbMl0gbW9udGggWzNdIGRheVxuXG4gIHllYXIgPSArKG1hdGNoWzFdKTtcbiAgbW9udGggPSArKG1hdGNoWzJdKSAtIDE7IC8vIEpTIG1vbnRoIHN0YXJ0cyB3aXRoIDBcbiAgZGF5ID0gKyhtYXRjaFszXSk7XG5cbiAgaWYgKCFtYXRjaFs0XSkgeyAvLyBubyBob3VyXG4gICAgcmV0dXJuIG5ldyBEYXRlKERhdGUuVVRDKHllYXIsIG1vbnRoLCBkYXkpKTtcbiAgfVxuXG4gIC8vIG1hdGNoOiBbNF0gaG91ciBbNV0gbWludXRlIFs2XSBzZWNvbmQgWzddIGZyYWN0aW9uXG5cbiAgaG91ciA9ICsobWF0Y2hbNF0pO1xuICBtaW51dGUgPSArKG1hdGNoWzVdKTtcbiAgc2Vjb25kID0gKyhtYXRjaFs2XSk7XG5cbiAgaWYgKG1hdGNoWzddKSB7XG4gICAgZnJhY3Rpb24gPSBtYXRjaFs3XS5zbGljZSgwLCAzKTtcbiAgICB3aGlsZSAoZnJhY3Rpb24ubGVuZ3RoIDwgMykgeyAvLyBtaWxsaS1zZWNvbmRzXG4gICAgICBmcmFjdGlvbiArPSAnMCc7XG4gICAgfVxuICAgIGZyYWN0aW9uID0gK2ZyYWN0aW9uO1xuICB9XG5cbiAgLy8gbWF0Y2g6IFs4XSB0eiBbOV0gdHpfc2lnbiBbMTBdIHR6X2hvdXIgWzExXSB0el9taW51dGVcblxuICBpZiAobWF0Y2hbOV0pIHtcbiAgICB0el9ob3VyID0gKyhtYXRjaFsxMF0pO1xuICAgIHR6X21pbnV0ZSA9ICsobWF0Y2hbMTFdIHx8IDApO1xuICAgIGRlbHRhID0gKHR6X2hvdXIgKiA2MCArIHR6X21pbnV0ZSkgKiA2MDAwMDsgLy8gZGVsdGEgaW4gbWlsaS1zZWNvbmRzXG4gICAgaWYgKG1hdGNoWzldID09PSAnLScpIGRlbHRhID0gLWRlbHRhO1xuICB9XG5cbiAgZGF0ZSA9IG5ldyBEYXRlKERhdGUuVVRDKHllYXIsIG1vbnRoLCBkYXksIGhvdXIsIG1pbnV0ZSwgc2Vjb25kLCBmcmFjdGlvbikpO1xuXG4gIGlmIChkZWx0YSkgZGF0ZS5zZXRUaW1lKGRhdGUuZ2V0VGltZSgpIC0gZGVsdGEpO1xuXG4gIHJldHVybiBkYXRlO1xufVxuXG5mdW5jdGlvbiByZXByZXNlbnRZYW1sVGltZXN0YW1wKG9iamVjdCAvKiwgc3R5bGUqLykge1xuICByZXR1cm4gb2JqZWN0LnRvSVNPU3RyaW5nKCk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gbmV3IFR5cGUoJ3RhZzp5YW1sLm9yZywyMDAyOnRpbWVzdGFtcCcsIHtcbiAga2luZDogJ3NjYWxhcicsXG4gIHJlc29sdmU6IHJlc29sdmVZYW1sVGltZXN0YW1wLFxuICBjb25zdHJ1Y3Q6IGNvbnN0cnVjdFlhbWxUaW1lc3RhbXAsXG4gIGluc3RhbmNlT2Y6IERhdGUsXG4gIHJlcHJlc2VudDogcmVwcmVzZW50WWFtbFRpbWVzdGFtcFxufSk7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgdXRpbHMgPSByZXF1aXJlKCcuL3V0aWxzJyk7XG52YXIgc3VwcG9ydCA9IHJlcXVpcmUoJy4vc3VwcG9ydCcpO1xuLy8gcHJpdmF0ZSBwcm9wZXJ0eVxudmFyIF9rZXlTdHIgPSBcIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89XCI7XG5cblxuLy8gcHVibGljIG1ldGhvZCBmb3IgZW5jb2Rpbmdcbi8vIGV4cG9ydHMuZW5jb2RlID0gZnVuY3Rpb24oaW5wdXQpIHtcbi8vICAgICB2YXIgb3V0cHV0ID0gW107XG4vLyAgICAgdmFyIGNocjEsIGNocjIsIGNocjMsIGVuYzEsIGVuYzIsIGVuYzMsIGVuYzQ7XG4vLyAgICAgdmFyIGkgPSAwLCBsZW4gPSBpbnB1dC5sZW5ndGgsIHJlbWFpbmluZ0J5dGVzID0gbGVuO1xuXG4vLyAgICAgdmFyIGlzQXJyYXkgPSB1dGlscy5nZXRUeXBlT2YoaW5wdXQpICE9PSBcInN0cmluZ1wiO1xuLy8gICAgIHdoaWxlIChpIDwgaW5wdXQubGVuZ3RoKSB7XG4vLyAgICAgICAgIHJlbWFpbmluZ0J5dGVzID0gbGVuIC0gaTtcblxuLy8gICAgICAgICBpZiAoIWlzQXJyYXkpIHtcbi8vICAgICAgICAgICAgIGNocjEgPSBpbnB1dC5jaGFyQ29kZUF0KGkrKyk7XG4vLyAgICAgICAgICAgICBjaHIyID0gaSA8IGxlbiA/IGlucHV0LmNoYXJDb2RlQXQoaSsrKSA6IDA7XG4vLyAgICAgICAgICAgICBjaHIzID0gaSA8IGxlbiA/IGlucHV0LmNoYXJDb2RlQXQoaSsrKSA6IDA7XG4vLyAgICAgICAgIH0gZWxzZSB7XG4vLyAgICAgICAgICAgICBjaHIxID0gaW5wdXRbaSsrXTtcbi8vICAgICAgICAgICAgIGNocjIgPSBpIDwgbGVuID8gaW5wdXRbaSsrXSA6IDA7XG4vLyAgICAgICAgICAgICBjaHIzID0gaSA8IGxlbiA/IGlucHV0W2krK10gOiAwO1xuLy8gICAgICAgICB9XG5cbi8vICAgICAgICAgZW5jMSA9IGNocjEgPj4gMjtcbi8vICAgICAgICAgZW5jMiA9ICgoY2hyMSAmIDMpIDw8IDQpIHwgKGNocjIgPj4gNCk7XG4vLyAgICAgICAgIGVuYzMgPSByZW1haW5pbmdCeXRlcyA+IDEgPyAoKChjaHIyICYgMTUpIDw8IDIpIHwgKGNocjMgPj4gNikpIDogNjQ7XG4vLyAgICAgICAgIGVuYzQgPSByZW1haW5pbmdCeXRlcyA+IDIgPyAoY2hyMyAmIDYzKSA6IDY0O1xuXG4vLyAgICAgICAgIG91dHB1dC5wdXNoKF9rZXlTdHIuY2hhckF0KGVuYzEpICsgX2tleVN0ci5jaGFyQXQoZW5jMikgKyBfa2V5U3RyLmNoYXJBdChlbmMzKSArIF9rZXlTdHIuY2hhckF0KGVuYzQpKTtcblxuLy8gICAgIH1cblxuLy8gICAgIHJldHVybiBvdXRwdXQuam9pbihcIlwiKTtcbi8vIH07XG5cbi8vIHB1YmxpYyBtZXRob2QgZm9yIGRlY29kaW5nXG5leHBvcnRzLmRlY29kZSA9IGZ1bmN0aW9uKGlucHV0KSB7XG4gICAgdmFyIGNocjEsIGNocjIsIGNocjM7XG4gICAgdmFyIGVuYzEsIGVuYzIsIGVuYzMsIGVuYzQ7XG4gICAgdmFyIGkgPSAwLCByZXN1bHRJbmRleCA9IDA7XG5cbiAgICBpbnB1dCA9IGlucHV0LnJlcGxhY2UoL1teQS1aYS16MC05XFwrXFwvXFw9XS9nLCBcIlwiKTtcblxuICAgIHZhciB0b3RhbExlbmd0aCA9IGlucHV0Lmxlbmd0aCAqIDMgLyA0O1xuICAgIGlmKGlucHV0LmNoYXJBdChpbnB1dC5sZW5ndGggLSAxKSA9PT0gX2tleVN0ci5jaGFyQXQoNjQpKSB7XG4gICAgICAgIHRvdGFsTGVuZ3RoLS07XG4gICAgfVxuICAgIGlmKGlucHV0LmNoYXJBdChpbnB1dC5sZW5ndGggLSAyKSA9PT0gX2tleVN0ci5jaGFyQXQoNjQpKSB7XG4gICAgICAgIHRvdGFsTGVuZ3RoLS07XG4gICAgfVxuICAgIHZhciBvdXRwdXQ7XG4gICAgaWYgKHN1cHBvcnQudWludDhhcnJheSkge1xuICAgICAgICBvdXRwdXQgPSBuZXcgVWludDhBcnJheSh0b3RhbExlbmd0aCk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgb3V0cHV0ID0gbmV3IEFycmF5KHRvdGFsTGVuZ3RoKTtcbiAgICB9XG5cbiAgICB3aGlsZSAoaSA8IGlucHV0Lmxlbmd0aCkge1xuXG4gICAgICAgIGVuYzEgPSBfa2V5U3RyLmluZGV4T2YoaW5wdXQuY2hhckF0KGkrKykpO1xuICAgICAgICBlbmMyID0gX2tleVN0ci5pbmRleE9mKGlucHV0LmNoYXJBdChpKyspKTtcbiAgICAgICAgZW5jMyA9IF9rZXlTdHIuaW5kZXhPZihpbnB1dC5jaGFyQXQoaSsrKSk7XG4gICAgICAgIGVuYzQgPSBfa2V5U3RyLmluZGV4T2YoaW5wdXQuY2hhckF0KGkrKykpO1xuXG4gICAgICAgIGNocjEgPSAoZW5jMSA8PCAyKSB8IChlbmMyID4+IDQpO1xuICAgICAgICBjaHIyID0gKChlbmMyICYgMTUpIDw8IDQpIHwgKGVuYzMgPj4gMik7XG4gICAgICAgIGNocjMgPSAoKGVuYzMgJiAzKSA8PCA2KSB8IGVuYzQ7XG5cbiAgICAgICAgb3V0cHV0W3Jlc3VsdEluZGV4KytdID0gY2hyMTtcblxuICAgICAgICBpZiAoZW5jMyAhPT0gNjQpIHtcbiAgICAgICAgICAgIG91dHB1dFtyZXN1bHRJbmRleCsrXSA9IGNocjI7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGVuYzQgIT09IDY0KSB7XG4gICAgICAgICAgICBvdXRwdXRbcmVzdWx0SW5kZXgrK10gPSBjaHIzO1xuICAgICAgICB9XG5cbiAgICB9XG5cbiAgICByZXR1cm4gb3V0cHV0O1xufTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIGV4dGVybmFsID0gcmVxdWlyZShcIi4vZXh0ZXJuYWxcIik7XG52YXIgRGF0YVdvcmtlciA9IHJlcXVpcmUoJy4vc3RyZWFtL0RhdGFXb3JrZXInKTtcbnZhciBEYXRhTGVuZ3RoUHJvYmUgPSByZXF1aXJlKCcuL3N0cmVhbS9EYXRhTGVuZ3RoUHJvYmUnKTtcbnZhciBDcmMzMlByb2JlID0gcmVxdWlyZSgnLi9zdHJlYW0vQ3JjMzJQcm9iZScpO1xudmFyIERhdGFMZW5ndGhQcm9iZSA9IHJlcXVpcmUoJy4vc3RyZWFtL0RhdGFMZW5ndGhQcm9iZScpO1xuXG4vKipcbiAqIFJlcHJlc2VudCBhIGNvbXByZXNzZWQgb2JqZWN0LCB3aXRoIGV2ZXJ5dGhpbmcgbmVlZGVkIHRvIGRlY29tcHJlc3MgaXQuXG4gKiBAY29uc3RydWN0b3JcbiAqIEBwYXJhbSB7bnVtYmVyfSBjb21wcmVzc2VkU2l6ZSB0aGUgc2l6ZSBvZiB0aGUgZGF0YSBjb21wcmVzc2VkLlxuICogQHBhcmFtIHtudW1iZXJ9IHVuY29tcHJlc3NlZFNpemUgdGhlIHNpemUgb2YgdGhlIGRhdGEgYWZ0ZXIgZGVjb21wcmVzc2lvbi5cbiAqIEBwYXJhbSB7bnVtYmVyfSBjcmMzMiB0aGUgY3JjMzIgb2YgdGhlIGRlY29tcHJlc3NlZCBmaWxlLlxuICogQHBhcmFtIHtvYmplY3R9IGNvbXByZXNzaW9uIHRoZSB0eXBlIG9mIGNvbXByZXNzaW9uLCBzZWUgbGliL2NvbXByZXNzaW9ucy5qcy5cbiAqIEBwYXJhbSB7U3RyaW5nfEFycmF5QnVmZmVyfFVpbnQ4QXJyYXl8QnVmZmVyfSBkYXRhIHRoZSBjb21wcmVzc2VkIGRhdGEuXG4gKi9cbmZ1bmN0aW9uIENvbXByZXNzZWRPYmplY3QoY29tcHJlc3NlZFNpemUsIHVuY29tcHJlc3NlZFNpemUsIGNyYzMyLCBjb21wcmVzc2lvbiwgZGF0YSkge1xuICAgIHRoaXMuY29tcHJlc3NlZFNpemUgPSBjb21wcmVzc2VkU2l6ZTtcbiAgICB0aGlzLnVuY29tcHJlc3NlZFNpemUgPSB1bmNvbXByZXNzZWRTaXplO1xuICAgIHRoaXMuY3JjMzIgPSBjcmMzMjtcbiAgICB0aGlzLmNvbXByZXNzaW9uID0gY29tcHJlc3Npb247XG4gICAgdGhpcy5jb21wcmVzc2VkQ29udGVudCA9IGRhdGE7XG59XG5cbkNvbXByZXNzZWRPYmplY3QucHJvdG90eXBlID0ge1xuICAgIC8qKlxuICAgICAqIENyZWF0ZSBhIHdvcmtlciB0byBnZXQgdGhlIHVuY29tcHJlc3NlZCBjb250ZW50LlxuICAgICAqIEByZXR1cm4ge0dlbmVyaWNXb3JrZXJ9IHRoZSB3b3JrZXIuXG4gICAgICovXG4gICAgZ2V0Q29udGVudFdvcmtlciA6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIHdvcmtlciA9IG5ldyBEYXRhV29ya2VyKGV4dGVybmFsLlByb21pc2UucmVzb2x2ZSh0aGlzLmNvbXByZXNzZWRDb250ZW50KSlcbiAgICAgICAgLnBpcGUodGhpcy5jb21wcmVzc2lvbi51bmNvbXByZXNzV29ya2VyKCkpXG4gICAgICAgIC5waXBlKG5ldyBEYXRhTGVuZ3RoUHJvYmUoXCJkYXRhX2xlbmd0aFwiKSk7XG5cbiAgICAgICAgdmFyIHRoYXQgPSB0aGlzO1xuICAgICAgICB3b3JrZXIub24oXCJlbmRcIiwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgaWYodGhpcy5zdHJlYW1JbmZvWydkYXRhX2xlbmd0aCddICE9PSB0aGF0LnVuY29tcHJlc3NlZFNpemUpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJCdWcgOiB1bmNvbXByZXNzZWQgZGF0YSBzaXplIG1pc21hdGNoXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHdvcmtlcjtcbiAgICB9LFxuICAgIC8qKlxuICAgICAqIENyZWF0ZSBhIHdvcmtlciB0byBnZXQgdGhlIGNvbXByZXNzZWQgY29udGVudC5cbiAgICAgKiBAcmV0dXJuIHtHZW5lcmljV29ya2VyfSB0aGUgd29ya2VyLlxuICAgICAqL1xuICAgIGdldENvbXByZXNzZWRXb3JrZXIgOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBuZXcgRGF0YVdvcmtlcihleHRlcm5hbC5Qcm9taXNlLnJlc29sdmUodGhpcy5jb21wcmVzc2VkQ29udGVudCkpXG4gICAgICAgIC53aXRoU3RyZWFtSW5mbyhcImNvbXByZXNzZWRTaXplXCIsIHRoaXMuY29tcHJlc3NlZFNpemUpXG4gICAgICAgIC53aXRoU3RyZWFtSW5mbyhcInVuY29tcHJlc3NlZFNpemVcIiwgdGhpcy51bmNvbXByZXNzZWRTaXplKVxuICAgICAgICAud2l0aFN0cmVhbUluZm8oXCJjcmMzMlwiLCB0aGlzLmNyYzMyKVxuICAgICAgICAud2l0aFN0cmVhbUluZm8oXCJjb21wcmVzc2lvblwiLCB0aGlzLmNvbXByZXNzaW9uKVxuICAgICAgICA7XG4gICAgfVxufTtcblxuLyoqXG4gKiBDaGFpbiB0aGUgZ2l2ZW4gd29ya2VyIHdpdGggb3RoZXIgd29ya2VycyB0byBjb21wcmVzcyB0aGUgY29udGVudCB3aXRoIHRoZVxuICogZ2l2ZW4gY29tcHJlc2lvbi5cbiAqIEBwYXJhbSB7R2VuZXJpY1dvcmtlcn0gdW5jb21wcmVzc2VkV29ya2VyIHRoZSB3b3JrZXIgdG8gcGlwZS5cbiAqIEBwYXJhbSB7T2JqZWN0fSBjb21wcmVzc2lvbiB0aGUgY29tcHJlc3Npb24gb2JqZWN0LlxuICogQHBhcmFtIHtPYmplY3R9IGNvbXByZXNzaW9uT3B0aW9ucyB0aGUgb3B0aW9ucyB0byB1c2Ugd2hlbiBjb21wcmVzc2luZy5cbiAqIEByZXR1cm4ge0dlbmVyaWNXb3JrZXJ9IHRoZSBuZXcgd29ya2VyIGNvbXByZXNzaW5nIHRoZSBjb250ZW50LlxuICovXG5Db21wcmVzc2VkT2JqZWN0LmNyZWF0ZVdvcmtlckZyb20gPSBmdW5jdGlvbiAodW5jb21wcmVzc2VkV29ya2VyLCBjb21wcmVzc2lvbiwgY29tcHJlc3Npb25PcHRpb25zKSB7XG4gICAgcmV0dXJuIHVuY29tcHJlc3NlZFdvcmtlclxuICAgIC5waXBlKG5ldyBDcmMzMlByb2JlKCkpXG4gICAgLnBpcGUobmV3IERhdGFMZW5ndGhQcm9iZShcInVuY29tcHJlc3NlZFNpemVcIikpXG4gICAgLnBpcGUoY29tcHJlc3Npb24uY29tcHJlc3NXb3JrZXIoY29tcHJlc3Npb25PcHRpb25zKSlcbiAgICAucGlwZShuZXcgRGF0YUxlbmd0aFByb2JlKFwiY29tcHJlc3NlZFNpemVcIikpXG4gICAgLndpdGhTdHJlYW1JbmZvKFwiY29tcHJlc3Npb25cIiwgY29tcHJlc3Npb24pO1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSBDb21wcmVzc2VkT2JqZWN0O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgR2VuZXJpY1dvcmtlciA9IHJlcXVpcmUoXCIuL3N0cmVhbS9HZW5lcmljV29ya2VyXCIpO1xuXG5leHBvcnRzLlNUT1JFID0ge1xuICAgIG1hZ2ljOiBcIlxceDAwXFx4MDBcIixcbiAgICAvLyBjb21wcmVzc1dvcmtlciA6IGZ1bmN0aW9uIChjb21wcmVzc2lvbk9wdGlvbnMpIHtcbiAgICAvLyAgICAgcmV0dXJuIG5ldyBHZW5lcmljV29ya2VyKFwiU1RPUkUgY29tcHJlc3Npb25cIik7XG4gICAgLy8gfSxcbiAgICB1bmNvbXByZXNzV29ya2VyIDogZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gbmV3IEdlbmVyaWNXb3JrZXIoXCJTVE9SRSBkZWNvbXByZXNzaW9uXCIpO1xuICAgIH1cbn07XG5leHBvcnRzLkRFRkxBVEUgPSByZXF1aXJlKCcuL2ZsYXRlJyk7XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciB1dGlscyA9IHJlcXVpcmUoJy4vdXRpbHMnKTtcblxuLyoqXG4gKiBUaGUgZm9sbG93aW5nIGZ1bmN0aW9ucyBjb21lIGZyb20gcGFrbywgZnJvbSBwYWtvL2xpYi96bGliL2NyYzMyLmpzXG4gKiByZWxlYXNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UsIHNlZSBwYWtvIGh0dHBzOi8vZ2l0aHViLmNvbS9ub2RlY2EvcGFrby9cbiAqL1xuXG4vLyBVc2Ugb3JkaW5hcnkgYXJyYXksIHNpbmNlIHVudHlwZWQgbWFrZXMgbm8gYm9vc3QgaGVyZVxuZnVuY3Rpb24gbWFrZVRhYmxlKCkge1xuICAgIHZhciBjLCB0YWJsZSA9IFtdO1xuXG4gICAgZm9yKHZhciBuID0wOyBuIDwgMjU2OyBuKyspe1xuICAgICAgICBjID0gbjtcbiAgICAgICAgZm9yKHZhciBrID0wOyBrIDwgODsgaysrKXtcbiAgICAgICAgICAgIGMgPSAoKGMmMSkgPyAoMHhFREI4ODMyMCBeIChjID4+PiAxKSkgOiAoYyA+Pj4gMSkpO1xuICAgICAgICB9XG4gICAgICAgIHRhYmxlW25dID0gYztcbiAgICB9XG5cbiAgICByZXR1cm4gdGFibGU7XG59XG5cbi8vIENyZWF0ZSB0YWJsZSBvbiBsb2FkLiBKdXN0IDI1NSBzaWduZWQgbG9uZ3MuIE5vdCBhIHByb2JsZW0uXG52YXIgY3JjVGFibGUgPSBtYWtlVGFibGUoKTtcblxuXG5mdW5jdGlvbiBjcmMzMihjcmMsIGJ1ZiwgbGVuLCBwb3MpIHtcbiAgICB2YXIgdCA9IGNyY1RhYmxlLCBlbmQgPSBwb3MgKyBsZW47XG5cbiAgICBjcmMgPSBjcmMgXiAoLTEpO1xuXG4gICAgZm9yICh2YXIgaSA9IHBvczsgaSA8IGVuZDsgaSsrICkge1xuICAgICAgICBjcmMgPSAoY3JjID4+PiA4KSBeIHRbKGNyYyBeIGJ1ZltpXSkgJiAweEZGXTtcbiAgICB9XG5cbiAgICByZXR1cm4gKGNyYyBeICgtMSkpOyAvLyA+Pj4gMDtcbn1cblxuLy8gVGhhdCdzIGFsbCBmb3IgdGhlIHBha28gZnVuY3Rpb25zLlxuXG4vKipcbiAqIENvbXB1dGUgdGhlIGNyYzMyIG9mIGEgc3RyaW5nLlxuICogVGhpcyBpcyBhbG1vc3QgdGhlIHNhbWUgYXMgdGhlIGZ1bmN0aW9uIGNyYzMyLCBidXQgZm9yIHN0cmluZ3MuIFVzaW5nIHRoZVxuICogc2FtZSBmdW5jdGlvbiBmb3IgdGhlIHR3byB1c2UgY2FzZXMgbGVhZHMgdG8gaG9ycmlibGUgcGVyZm9ybWFuY2VzLlxuICogQHBhcmFtIHtOdW1iZXJ9IGNyYyB0aGUgc3RhcnRpbmcgdmFsdWUgb2YgdGhlIGNyYy5cbiAqIEBwYXJhbSB7U3RyaW5nfSBzdHIgdGhlIHN0cmluZyB0byB1c2UuXG4gKiBAcGFyYW0ge051bWJlcn0gbGVuIHRoZSBsZW5ndGggb2YgdGhlIHN0cmluZy5cbiAqIEBwYXJhbSB7TnVtYmVyfSBwb3MgdGhlIHN0YXJ0aW5nIHBvc2l0aW9uIGZvciB0aGUgY3JjMzIgY29tcHV0YXRpb24uXG4gKiBAcmV0dXJuIHtOdW1iZXJ9IHRoZSBjb21wdXRlZCBjcmMzMi5cbiAqL1xuZnVuY3Rpb24gY3JjMzJzdHIoY3JjLCBzdHIsIGxlbiwgcG9zKSB7XG4gICAgdmFyIHQgPSBjcmNUYWJsZSwgZW5kID0gcG9zICsgbGVuO1xuXG4gICAgY3JjID0gY3JjIF4gKC0xKTtcblxuICAgIGZvciAodmFyIGkgPSBwb3M7IGkgPCBlbmQ7IGkrKyApIHtcbiAgICAgICAgY3JjID0gKGNyYyA+Pj4gOCkgXiB0WyhjcmMgXiBzdHIuY2hhckNvZGVBdChpKSkgJiAweEZGXTtcbiAgICB9XG5cbiAgICByZXR1cm4gKGNyYyBeICgtMSkpOyAvLyA+Pj4gMDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBjcmMzMndyYXBwZXIoaW5wdXQsIGNyYykge1xuICAgIGlmICh0eXBlb2YgaW5wdXQgPT09IFwidW5kZWZpbmVkXCIgfHwgIWlucHV0Lmxlbmd0aCkge1xuICAgICAgICByZXR1cm4gMDtcbiAgICB9XG5cbiAgICB2YXIgaXNBcnJheSA9IHV0aWxzLmdldFR5cGVPZihpbnB1dCkgIT09IFwic3RyaW5nXCI7XG5cbiAgICBpZihpc0FycmF5KSB7XG4gICAgICAgIHJldHVybiBjcmMzMihjcmN8MCwgaW5wdXQsIGlucHV0Lmxlbmd0aCwgMCk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIGNyYzMyc3RyKGNyY3wwLCBpbnB1dCwgaW5wdXQubGVuZ3RoLCAwKTtcbiAgICB9XG59O1xuLy8gdmltOiBzZXQgc2hpZnR3aWR0aD00IHNvZnR0YWJzdG9wPTQ6XG4iLCIndXNlIHN0cmljdCc7XG5leHBvcnRzLmJhc2U2NCA9IGZhbHNlO1xuZXhwb3J0cy5iaW5hcnkgPSBmYWxzZTtcbmV4cG9ydHMuZGlyID0gZmFsc2U7XG5leHBvcnRzLmNyZWF0ZUZvbGRlcnMgPSB0cnVlO1xuZXhwb3J0cy5kYXRlID0gbnVsbDtcbmV4cG9ydHMuY29tcHJlc3Npb24gPSBudWxsO1xuZXhwb3J0cy5jb21wcmVzc2lvbk9wdGlvbnMgPSBudWxsO1xuZXhwb3J0cy5jb21tZW50ID0gbnVsbDtcbmV4cG9ydHMudW5peFBlcm1pc3Npb25zID0gbnVsbDtcbmV4cG9ydHMuZG9zUGVybWlzc2lvbnMgPSBudWxsO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG4vLyB2YXIgRVM2UHJvbWlzZSA9IHJlcXVpcmUoXCJlczYtcHJvbWlzZVwiKS5Qcm9taXNlO1xuXG4vKipcbiAqIExldCB0aGUgdXNlciB1c2UvY2hhbmdlIHNvbWUgaW1wbGVtZW50YXRpb25zLlxuICovXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgICBQcm9taXNlOiB3aW5kb3cuUHJvbWlzZVxufTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBVU0VfVFlQRURBUlJBWSA9ICh0eXBlb2YgVWludDhBcnJheSAhPT0gJ3VuZGVmaW5lZCcpICYmICh0eXBlb2YgVWludDE2QXJyYXkgIT09ICd1bmRlZmluZWQnKSAmJiAodHlwZW9mIFVpbnQzMkFycmF5ICE9PSAndW5kZWZpbmVkJyk7XG5cbnZhciBwYWtvID0gcmVxdWlyZShcInBha29cIik7XG52YXIgdXRpbHMgPSByZXF1aXJlKFwiLi91dGlsc1wiKTtcbnZhciBHZW5lcmljV29ya2VyID0gcmVxdWlyZShcIi4vc3RyZWFtL0dlbmVyaWNXb3JrZXJcIik7XG5cbnZhciBBUlJBWV9UWVBFID0gVVNFX1RZUEVEQVJSQVkgPyBcInVpbnQ4YXJyYXlcIiA6IFwiYXJyYXlcIjtcblxuZXhwb3J0cy5tYWdpYyA9IFwiXFx4MDhcXHgwMFwiO1xuXG4vKipcbiAqIENyZWF0ZSBhIHdvcmtlciB0aGF0IHVzZXMgcGFrbyB0byBpbmZsYXRlL2RlZmxhdGUuXG4gKiBAY29uc3RydWN0b3JcbiAqIEBwYXJhbSB7U3RyaW5nfSBhY3Rpb24gdGhlIG5hbWUgb2YgdGhlIHBha28gZnVuY3Rpb24gdG8gY2FsbCA6IGVpdGhlciBcIkRlZmxhdGVcIiBvciBcIkluZmxhdGVcIi5cbiAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIHRoZSBvcHRpb25zIHRvIHVzZSB3aGVuIChkZSljb21wcmVzc2luZy5cbiAqL1xuZnVuY3Rpb24gRmxhdGVXb3JrZXIoYWN0aW9uLCBvcHRpb25zKSB7XG4gICAgR2VuZXJpY1dvcmtlci5jYWxsKHRoaXMsIFwiRmxhdGVXb3JrZXIvXCIgKyBhY3Rpb24pO1xuXG4gICAgdGhpcy5fcGFrbyA9IG5ldyBwYWtvW2FjdGlvbl0oe1xuICAgICAgICByYXc6dHJ1ZSxcbiAgICAgICAgbGV2ZWwgOiBvcHRpb25zLmxldmVsIHx8IC0xIC8vIGRlZmF1bHQgY29tcHJlc3Npb25cbiAgICB9KTtcbiAgICAvLyB0aGUgYG1ldGFgIG9iamVjdCBmcm9tIHRoZSBsYXN0IGNodW5rIHJlY2VpdmVkXG4gICAgLy8gdGhpcyBhbGxvdyB0aGlzIHdvcmtlciB0byBwYXNzIGFyb3VuZCBtZXRhZGF0YVxuICAgIHRoaXMubWV0YSA9IHt9O1xuXG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIHRoaXMuX3Bha28ub25EYXRhID0gZnVuY3Rpb24oZGF0YSkge1xuICAgICAgICBzZWxmLnB1c2goe1xuICAgICAgICAgICAgZGF0YSA6IGRhdGEsXG4gICAgICAgICAgICBtZXRhIDogc2VsZi5tZXRhXG4gICAgICAgIH0pO1xuICAgIH07XG59XG5cbnV0aWxzLmluaGVyaXRzKEZsYXRlV29ya2VyLCBHZW5lcmljV29ya2VyKTtcblxuLyoqXG4gKiBAc2VlIEdlbmVyaWNXb3JrZXIucHJvY2Vzc0NodW5rXG4gKi9cbkZsYXRlV29ya2VyLnByb3RvdHlwZS5wcm9jZXNzQ2h1bmsgPSBmdW5jdGlvbiAoY2h1bmspIHtcbiAgICB0aGlzLm1ldGEgPSBjaHVuay5tZXRhO1xuICAgIHRoaXMuX3Bha28ucHVzaCh1dGlscy50cmFuc2Zvcm1UbyhBUlJBWV9UWVBFLCBjaHVuay5kYXRhKSwgZmFsc2UpO1xufTtcblxuLyoqXG4gKiBAc2VlIEdlbmVyaWNXb3JrZXIuZmx1c2hcbiAqL1xuRmxhdGVXb3JrZXIucHJvdG90eXBlLmZsdXNoID0gZnVuY3Rpb24gKCkge1xuICAgIEdlbmVyaWNXb3JrZXIucHJvdG90eXBlLmZsdXNoLmNhbGwodGhpcyk7XG4gICAgdGhpcy5fcGFrby5wdXNoKFtdLCB0cnVlKTtcbn07XG4vKipcbiAqIEBzZWUgR2VuZXJpY1dvcmtlci5jbGVhblVwXG4gKi9cbkZsYXRlV29ya2VyLnByb3RvdHlwZS5jbGVhblVwID0gZnVuY3Rpb24gKCkge1xuICAgIEdlbmVyaWNXb3JrZXIucHJvdG90eXBlLmNsZWFuVXAuY2FsbCh0aGlzKTtcbiAgICB0aGlzLl9wYWtvID0gbnVsbDtcbn07XG5cbmV4cG9ydHMuY29tcHJlc3NXb3JrZXIgPSBmdW5jdGlvbiAoY29tcHJlc3Npb25PcHRpb25zKSB7XG4gICAgcmV0dXJuIG5ldyBGbGF0ZVdvcmtlcihcIkRlZmxhdGVcIiwgY29tcHJlc3Npb25PcHRpb25zKTtcbn07XG5leHBvcnRzLnVuY29tcHJlc3NXb3JrZXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIG5ldyBGbGF0ZVdvcmtlcihcIkluZmxhdGVcIiwge30pO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcblxuLyoqXG4gKiBSZXByZXNlbnRhdGlvbiBhIG9mIHppcCBmaWxlIGluIGpzXG4gKiBAY29uc3RydWN0b3JcbiAqL1xuZnVuY3Rpb24gSlNaaXAoKSB7XG4gICAgLy8gaWYgdGhpcyBjb25zdHJ1Y3RvciBpc8KgdXNlZCB3aXRob3V0wqBgbmV3YCwgaXTCoGFkZHMgYG5ld2AgYmVmb3JlwqBpdHNlbGY6XG4gICAgaWYoISh0aGlzIGluc3RhbmNlb2YgSlNaaXApKSB7XG4gICAgICAgIHJldHVybiBuZXcgSlNaaXAoKTtcbiAgICB9XG5cbiAgICBpZihhcmd1bWVudHMubGVuZ3RoKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIlRoZSBjb25zdHJ1Y3RvciB3aXRoIHBhcmFtZXRlcnMgaGFzIGJlZW4gcmVtb3ZlZCBpbiBKU1ppcCAzLjAsIHBsZWFzZSBjaGVjayB0aGUgdXBncmFkZSBndWlkZS5cIik7XG4gICAgfVxuXG4gICAgLy8gb2JqZWN0IGNvbnRhaW5pbmcgdGhlIGZpbGVzIDpcbiAgICAvLyB7XG4gICAgLy8gICBcImZvbGRlci9cIiA6IHsuLi59LFxuICAgIC8vICAgXCJmb2xkZXIvZGF0YS50eHRcIiA6IHsuLi59XG4gICAgLy8gfVxuICAgIHRoaXMuZmlsZXMgPSB7fTtcblxuICAgIHRoaXMuY29tbWVudCA9IG51bGw7XG5cbiAgICAvLyBXaGVyZSB3ZSBhcmUgaW4gdGhlIGhpZXJhcmNoeVxuICAgIHRoaXMucm9vdCA9IFwiXCI7XG4gICAgdGhpcy5jbG9uZSA9IGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgbmV3T2JqID0gbmV3IEpTWmlwKCk7XG4gICAgICAgIGZvciAodmFyIGkgaW4gdGhpcykge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiB0aGlzW2ldICE9PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICAgICAgICBuZXdPYmpbaV0gPSB0aGlzW2ldO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXdPYmo7XG4gICAgfTtcbn1cbkpTWmlwLnByb3RvdHlwZSA9IHJlcXVpcmUoJy4vb2JqZWN0Jyk7XG5KU1ppcC5wcm90b3R5cGUubG9hZEFzeW5jID0gcmVxdWlyZSgnLi9sb2FkJyk7XG5KU1ppcC5zdXBwb3J0ID0gcmVxdWlyZSgnLi9zdXBwb3J0Jyk7XG5KU1ppcC5kZWZhdWx0cyA9IHJlcXVpcmUoJy4vZGVmYXVsdHMnKTtcblxuSlNaaXAubG9hZEFzeW5jID0gZnVuY3Rpb24gKGNvbnRlbnQsIG9wdGlvbnMpIHtcbiAgICByZXR1cm4gbmV3IEpTWmlwKCkubG9hZEFzeW5jKGNvbnRlbnQsIG9wdGlvbnMpO1xufTtcblxuSlNaaXAuZXh0ZXJuYWwgPSByZXF1aXJlKFwiLi9leHRlcm5hbFwiKTtcbm1vZHVsZS5leHBvcnRzID0gSlNaaXA7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgdXRpbHMgPSByZXF1aXJlKCcuL3V0aWxzJyk7XG52YXIgZXh0ZXJuYWwgPSByZXF1aXJlKFwiLi9leHRlcm5hbFwiKTtcbnZhciB1dGY4ID0gcmVxdWlyZSgnLi91dGY4Jyk7XG52YXIgdXRpbHMgPSByZXF1aXJlKCcuL3V0aWxzJyk7XG52YXIgWmlwRW50cmllcyA9IHJlcXVpcmUoJy4vemlwRW50cmllcycpO1xudmFyIENyYzMyUHJvYmUgPSByZXF1aXJlKCcuL3N0cmVhbS9DcmMzMlByb2JlJyk7XG52YXIgbm9kZWpzVXRpbHMgPSByZXF1aXJlKFwiLi9ub2RlanNVdGlsc1wiKTtcblxuLyoqXG4gKiBDaGVjayB0aGUgQ1JDMzIgb2YgYW4gZW50cnkuXG4gKiBAcGFyYW0ge1ppcEVudHJ5fSB6aXBFbnRyeSB0aGUgemlwIGVudHJ5IHRvIGNoZWNrLlxuICogQHJldHVybiB7UHJvbWlzZX0gdGhlIHJlc3VsdC5cbiAqL1xuZnVuY3Rpb24gY2hlY2tFbnRyeUNSQzMyKHppcEVudHJ5KSB7XG4gICAgcmV0dXJuIG5ldyBleHRlcm5hbC5Qcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgdmFyIHdvcmtlciA9IHppcEVudHJ5LmRlY29tcHJlc3NlZC5nZXRDb250ZW50V29ya2VyKCkucGlwZShuZXcgQ3JjMzJQcm9iZSgpKTtcbiAgICAgICAgd29ya2VyLm9uKFwiZXJyb3JcIiwgZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICAgIHJlamVjdChlKTtcbiAgICAgICAgfSlcbiAgICAgICAgLm9uKFwiZW5kXCIsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGlmICh3b3JrZXIuc3RyZWFtSW5mby5jcmMzMiAhPT0gemlwRW50cnkuZGVjb21wcmVzc2VkLmNyYzMyKSB7XG4gICAgICAgICAgICAgICAgcmVqZWN0KG5ldyBFcnJvcihcIkNvcnJ1cHRlZCB6aXAgOiBDUkMzMiBtaXNtYXRjaFwiKSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgICAgLnJlc3VtZSgpO1xuICAgIH0pO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGRhdGEsIG9wdGlvbnMpIHtcbiAgICB2YXIgemlwID0gdGhpcztcbiAgICBvcHRpb25zID0gdXRpbHMuZXh0ZW5kKG9wdGlvbnMgfHwge30sIHtcbiAgICAgICAgYmFzZTY0OiBmYWxzZSxcbiAgICAgICAgY2hlY2tDUkMzMjogZmFsc2UsXG4gICAgICAgIG9wdGltaXplZEJpbmFyeVN0cmluZzogZmFsc2UsXG4gICAgICAgIGNyZWF0ZUZvbGRlcnM6IGZhbHNlLFxuICAgICAgICBkZWNvZGVGaWxlTmFtZTogdXRmOC51dGY4ZGVjb2RlXG4gICAgfSk7XG5cbiAgICBpZiAobm9kZWpzVXRpbHMuaXNOb2RlICYmIG5vZGVqc1V0aWxzLmlzU3RyZWFtKGRhdGEpKSB7XG4gICAgICAgIHJldHVybiBleHRlcm5hbC5Qcm9taXNlLnJlamVjdChuZXcgRXJyb3IoXCJKU1ppcCBjYW4ndCBhY2NlcHQgYSBzdHJlYW0gd2hlbiBsb2FkaW5nIGEgemlwIGZpbGUuXCIpKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdXRpbHMucHJlcGFyZUNvbnRlbnQoXCJ0aGUgbG9hZGVkIHppcCBmaWxlXCIsIGRhdGEsIHRydWUsIG9wdGlvbnMub3B0aW1pemVkQmluYXJ5U3RyaW5nLCBvcHRpb25zLmJhc2U2NClcbiAgICAudGhlbihmdW5jdGlvbihkYXRhKSB7XG4gICAgICAgIHZhciB6aXBFbnRyaWVzID0gbmV3IFppcEVudHJpZXMob3B0aW9ucyk7XG4gICAgICAgIHppcEVudHJpZXMubG9hZChkYXRhKTtcbiAgICAgICAgcmV0dXJuIHppcEVudHJpZXM7XG4gICAgfSkudGhlbihmdW5jdGlvbiBjaGVja0NSQzMyKHppcEVudHJpZXMpIHtcbiAgICAgICAgdmFyIHByb21pc2VzID0gW2V4dGVybmFsLlByb21pc2UucmVzb2x2ZSh6aXBFbnRyaWVzKV07XG4gICAgICAgIHZhciBmaWxlcyA9IHppcEVudHJpZXMuZmlsZXM7XG4gICAgICAgIGlmIChvcHRpb25zLmNoZWNrQ1JDMzIpIHtcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZmlsZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBwcm9taXNlcy5wdXNoKGNoZWNrRW50cnlDUkMzMihmaWxlc1tpXSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBleHRlcm5hbC5Qcm9taXNlLmFsbChwcm9taXNlcyk7XG4gICAgfSkudGhlbihmdW5jdGlvbiBhZGRGaWxlcyhyZXN1bHRzKSB7XG4gICAgICAgIHZhciB6aXBFbnRyaWVzID0gcmVzdWx0cy5zaGlmdCgpO1xuICAgICAgICB2YXIgZmlsZXMgPSB6aXBFbnRyaWVzLmZpbGVzO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGZpbGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICB2YXIgaW5wdXQgPSBmaWxlc1tpXTtcbiAgICAgICAgICAgIHppcC5maWxlKGlucHV0LmZpbGVOYW1lU3RyLCBpbnB1dC5kZWNvbXByZXNzZWQsIHtcbiAgICAgICAgICAgICAgICBiaW5hcnk6IHRydWUsXG4gICAgICAgICAgICAgICAgb3B0aW1pemVkQmluYXJ5U3RyaW5nOiB0cnVlLFxuICAgICAgICAgICAgICAgIGRhdGU6IGlucHV0LmRhdGUsXG4gICAgICAgICAgICAgICAgZGlyOiBpbnB1dC5kaXIsXG4gICAgICAgICAgICAgICAgY29tbWVudCA6IGlucHV0LmZpbGVDb21tZW50U3RyLmxlbmd0aCA/IGlucHV0LmZpbGVDb21tZW50U3RyIDogbnVsbCxcbiAgICAgICAgICAgICAgICB1bml4UGVybWlzc2lvbnMgOiBpbnB1dC51bml4UGVybWlzc2lvbnMsXG4gICAgICAgICAgICAgICAgZG9zUGVybWlzc2lvbnMgOiBpbnB1dC5kb3NQZXJtaXNzaW9ucyxcbiAgICAgICAgICAgICAgICBjcmVhdGVGb2xkZXJzOiBvcHRpb25zLmNyZWF0ZUZvbGRlcnNcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGlmICh6aXBFbnRyaWVzLnppcENvbW1lbnQubGVuZ3RoKSB7XG4gICAgICAgICAgICB6aXAuY29tbWVudCA9IHppcEVudHJpZXMuemlwQ29tbWVudDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB6aXA7XG4gICAgfSk7XG59O1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciB1dGlscyA9IHJlcXVpcmUoJy4uL3V0aWxzJyk7XG52YXIgR2VuZXJpY1dvcmtlciA9IHJlcXVpcmUoJy4uL3N0cmVhbS9HZW5lcmljV29ya2VyJyk7XG5cbi8qKlxuICogQSB3b3JrZXIgdGhhdCB1c2UgYSBub2RlanMgc3RyZWFtIGFzIHNvdXJjZS5cbiAqIEBjb25zdHJ1Y3RvclxuICogQHBhcmFtIHtTdHJpbmd9IGZpbGVuYW1lIHRoZSBuYW1lIG9mIHRoZSBmaWxlIGVudHJ5IGZvciB0aGlzIHN0cmVhbS5cbiAqIEBwYXJhbSB7UmVhZGFibGV9IHN0cmVhbSB0aGUgbm9kZWpzIHN0cmVhbS5cbiAqL1xuZnVuY3Rpb24gTm9kZWpzU3RyZWFtSW5wdXRBZGFwdGVyKGZpbGVuYW1lLCBzdHJlYW0pIHtcbiAgICBHZW5lcmljV29ya2VyLmNhbGwodGhpcywgXCJOb2RlanMgc3RyZWFtIGlucHV0IGFkYXB0ZXIgZm9yIFwiICsgZmlsZW5hbWUpO1xuICAgIHRoaXMuX3Vwc3RyZWFtRW5kZWQgPSBmYWxzZTtcbiAgICB0aGlzLl9iaW5kU3RyZWFtKHN0cmVhbSk7XG59XG5cbnV0aWxzLmluaGVyaXRzKE5vZGVqc1N0cmVhbUlucHV0QWRhcHRlciwgR2VuZXJpY1dvcmtlcik7XG5cbi8qKlxuICogUHJlcGFyZSB0aGUgc3RyZWFtIGFuZCBiaW5kIHRoZSBjYWxsYmFja3Mgb24gaXQuXG4gKiBEbyB0aGlzIEFTQVAgb24gbm9kZSAwLjEwICEgQSBsYXp5IGJpbmRpbmcgZG9lc24ndCBhbHdheXMgd29yay5cbiAqIEBwYXJhbSB7U3RyZWFtfSBzdHJlYW0gdGhlIG5vZGVqcyBzdHJlYW0gdG8gdXNlLlxuICovXG5Ob2RlanNTdHJlYW1JbnB1dEFkYXB0ZXIucHJvdG90eXBlLl9iaW5kU3RyZWFtID0gZnVuY3Rpb24gKHN0cmVhbSkge1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICB0aGlzLl9zdHJlYW0gPSBzdHJlYW07XG4gICAgc3RyZWFtLnBhdXNlKCk7XG4gICAgc3RyZWFtXG4gICAgLm9uKFwiZGF0YVwiLCBmdW5jdGlvbiAoY2h1bmspIHtcbiAgICAgICAgc2VsZi5wdXNoKHtcbiAgICAgICAgICAgIGRhdGE6IGNodW5rLFxuICAgICAgICAgICAgbWV0YSA6IHtcbiAgICAgICAgICAgICAgICBwZXJjZW50IDogMFxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9KVxuICAgIC5vbihcImVycm9yXCIsIGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIGlmKHNlbGYuaXNQYXVzZWQpIHtcbiAgICAgICAgICAgIHRoaXMuZ2VuZXJhdGVkRXJyb3IgPSBlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgc2VsZi5lcnJvcihlKTtcbiAgICAgICAgfVxuICAgIH0pXG4gICAgLm9uKFwiZW5kXCIsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYoc2VsZi5pc1BhdXNlZCkge1xuICAgICAgICAgICAgc2VsZi5fdXBzdHJlYW1FbmRlZCA9IHRydWU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBzZWxmLmVuZCgpO1xuICAgICAgICB9XG4gICAgfSk7XG59O1xuTm9kZWpzU3RyZWFtSW5wdXRBZGFwdGVyLnByb3RvdHlwZS5wYXVzZSA9IGZ1bmN0aW9uICgpIHtcbiAgICBpZighR2VuZXJpY1dvcmtlci5wcm90b3R5cGUucGF1c2UuY2FsbCh0aGlzKSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHRoaXMuX3N0cmVhbS5wYXVzZSgpO1xuICAgIHJldHVybiB0cnVlO1xufTtcbk5vZGVqc1N0cmVhbUlucHV0QWRhcHRlci5wcm90b3R5cGUucmVzdW1lID0gZnVuY3Rpb24gKCkge1xuICAgIGlmKCFHZW5lcmljV29ya2VyLnByb3RvdHlwZS5yZXN1bWUuY2FsbCh0aGlzKSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgaWYodGhpcy5fdXBzdHJlYW1FbmRlZCkge1xuICAgICAgICB0aGlzLmVuZCgpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuX3N0cmVhbS5yZXN1bWUoKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdHJ1ZTtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gTm9kZWpzU3RyZWFtSW5wdXRBZGFwdGVyO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgUmVhZGFibGUgPSByZXF1aXJlKCdyZWFkYWJsZS1zdHJlYW0nKS5SZWFkYWJsZTtcblxudmFyIHV0aWwgPSByZXF1aXJlKCd1dGlsJyk7XG51dGlsLmluaGVyaXRzKE5vZGVqc1N0cmVhbU91dHB1dEFkYXB0ZXIsIFJlYWRhYmxlKTtcblxuLyoqXG4qIEEgbm9kZWpzIHN0cmVhbSB1c2luZyBhIHdvcmtlciBhcyBzb3VyY2UuXG4qIEBzZWUgdGhlIFNvdXJjZVdyYXBwZXIgaW4gaHR0cDovL25vZGVqcy5vcmcvYXBpL3N0cmVhbS5odG1sXG4qIEBjb25zdHJ1Y3RvclxuKiBAcGFyYW0ge1N0cmVhbUhlbHBlcn0gaGVscGVyIHRoZSBoZWxwZXIgd3JhcHBpbmcgdGhlIHdvcmtlclxuKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucyB0aGUgbm9kZWpzIHN0cmVhbSBvcHRpb25zXG4qIEBwYXJhbSB7RnVuY3Rpb259IHVwZGF0ZUNiIHRoZSB1cGRhdGUgY2FsbGJhY2suXG4qL1xuZnVuY3Rpb24gTm9kZWpzU3RyZWFtT3V0cHV0QWRhcHRlcihoZWxwZXIsIG9wdGlvbnMsIHVwZGF0ZUNiKSB7XG4gICAgUmVhZGFibGUuY2FsbCh0aGlzLCBvcHRpb25zKTtcbiAgICB0aGlzLl9oZWxwZXIgPSBoZWxwZXI7XG5cbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgaGVscGVyLm9uKFwiZGF0YVwiLCBmdW5jdGlvbiAoZGF0YSwgbWV0YSkge1xuICAgICAgICBpZiAoIXNlbGYucHVzaChkYXRhKSkge1xuICAgICAgICAgICAgc2VsZi5faGVscGVyLnBhdXNlKCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYodXBkYXRlQ2IpIHtcbiAgICAgICAgICAgIHVwZGF0ZUNiKG1ldGEpO1xuICAgICAgICB9XG4gICAgfSlcbiAgICAub24oXCJlcnJvclwiLCBmdW5jdGlvbihlKSB7XG4gICAgICAgIHNlbGYuZW1pdCgnZXJyb3InLCBlKTtcbiAgICB9KVxuICAgIC5vbihcImVuZFwiLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHNlbGYucHVzaChudWxsKTtcbiAgICB9KTtcbn1cblxuXG5Ob2RlanNTdHJlYW1PdXRwdXRBZGFwdGVyLnByb3RvdHlwZS5fcmVhZCA9IGZ1bmN0aW9uKCkge1xuICAgIHRoaXMuX2hlbHBlci5yZXN1bWUoKTtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gTm9kZWpzU3RyZWFtT3V0cHV0QWRhcHRlcjtcbiIsIid1c2Ugc3RyaWN0JztcblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gICAgLyoqXG4gICAgICogVHJ1ZSBpZiB0aGlzIGlzIHJ1bm5pbmcgaW4gTm9kZWpzLCB3aWxsIGJlIHVuZGVmaW5lZCBpbiBhIGJyb3dzZXIuXG4gICAgICogSW4gYSBicm93c2VyLCBicm93c2VyaWZ5IHdvbid0IGluY2x1ZGUgdGhpcyBmaWxlIGFuZCB0aGUgd2hvbGUgbW9kdWxlXG4gICAgICogd2lsbCBiZSByZXNvbHZlZCBhbiBlbXB0eSBvYmplY3QuXG4gICAgICovXG4gICAgaXNOb2RlIDogdHlwZW9mIEJ1ZmZlciAhPT0gXCJ1bmRlZmluZWRcIixcbiAgICAvKipcbiAgICAgKiBDcmVhdGUgYSBuZXcgbm9kZWpzIEJ1ZmZlci5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gZGF0YSB0aGUgZGF0YSB0byBwYXNzIHRvIHRoZSBjb25zdHJ1Y3Rvci5cbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gZW5jb2RpbmcgdGhlIGVuY29kaW5nIHRvIHVzZS5cbiAgICAgKiBAcmV0dXJuIHtCdWZmZXJ9IGEgbmV3IEJ1ZmZlci5cbiAgICAgKi9cbiAgICBuZXdCdWZmZXIgOiBmdW5jdGlvbihkYXRhLCBlbmNvZGluZyl7XG4gICAgICAgIHJldHVybiBuZXcgQnVmZmVyKGRhdGEsIGVuY29kaW5nKTtcbiAgICB9LFxuICAgIC8qKlxuICAgICAqIEZpbmQgb3V0IGlmIGFuIG9iamVjdCBpcyBhIEJ1ZmZlci5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gYiB0aGUgb2JqZWN0IHRvIHRlc3QuXG4gICAgICogQHJldHVybiB7Qm9vbGVhbn0gdHJ1ZSBpZiB0aGUgb2JqZWN0IGlzIGEgQnVmZmVyLCBmYWxzZSBvdGhlcndpc2UuXG4gICAgICovXG4gICAgaXNCdWZmZXIgOiBmdW5jdGlvbihiKXtcbiAgICAgICAgcmV0dXJuIEJ1ZmZlci5pc0J1ZmZlcihiKTtcbiAgICB9LFxuXG4gICAgaXNTdHJlYW0gOiBmdW5jdGlvbiAob2JqKSB7XG4gICAgICAgIHJldHVybiBvYmogJiZcbiAgICAgICAgICAgIHR5cGVvZiBvYmoub24gPT09IFwiZnVuY3Rpb25cIiAmJlxuICAgICAgICAgICAgdHlwZW9mIG9iai5wYXVzZSA9PT0gXCJmdW5jdGlvblwiICYmXG4gICAgICAgICAgICB0eXBlb2Ygb2JqLnJlc3VtZSA9PT0gXCJmdW5jdGlvblwiO1xuICAgIH1cbn07XG4iLCIndXNlIHN0cmljdCc7XG4vLyB2YXIgdXRmOCA9IHJlcXVpcmUoJy4vdXRmOCcpO1xudmFyIHV0aWxzID0gcmVxdWlyZSgnLi91dGlscycpO1xudmFyIEdlbmVyaWNXb3JrZXIgPSByZXF1aXJlKCcuL3N0cmVhbS9HZW5lcmljV29ya2VyJyk7XG4vLyB2YXIgU3RyZWFtSGVscGVyID0gcmVxdWlyZSgnLi9zdHJlYW0vU3RyZWFtSGVscGVyJyk7XG52YXIgZGVmYXVsdHMgPSByZXF1aXJlKCcuL2RlZmF1bHRzJyk7XG52YXIgQ29tcHJlc3NlZE9iamVjdCA9IHJlcXVpcmUoJy4vY29tcHJlc3NlZE9iamVjdCcpO1xudmFyIFppcE9iamVjdCA9IHJlcXVpcmUoJy4vemlwT2JqZWN0Jyk7XG4vLyB2YXIgZ2VuZXJhdGUgPSByZXF1aXJlKFwiLi9nZW5lcmF0ZVwiKTtcbnZhciBub2RlanNVdGlscyA9IHJlcXVpcmUoXCIuL25vZGVqc1V0aWxzXCIpO1xudmFyIE5vZGVqc1N0cmVhbUlucHV0QWRhcHRlciA9IHJlcXVpcmUoXCIuL25vZGVqcy9Ob2RlanNTdHJlYW1JbnB1dEFkYXB0ZXJcIik7XG5cblxuLyoqXG4gKiBBZGQgYSBmaWxlIGluIHRoZSBjdXJyZW50IGZvbGRlci5cbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge3N0cmluZ30gbmFtZSB0aGUgbmFtZSBvZiB0aGUgZmlsZVxuICogQHBhcmFtIHtTdHJpbmd8QXJyYXlCdWZmZXJ8VWludDhBcnJheXxCdWZmZXJ9IGRhdGEgdGhlIGRhdGEgb2YgdGhlIGZpbGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBvIHRoZSBvcHRpb25zIG9mIHRoZSBmaWxlXG4gKiBAcmV0dXJuIHtPYmplY3R9IHRoZSBuZXcgZmlsZS5cbiAqL1xudmFyIGZpbGVBZGQgPSBmdW5jdGlvbihuYW1lLCBkYXRhLCBvKSB7XG4gICAgLy8gYmUgc3VyZSBzdWIgZm9sZGVycyBleGlzdFxuICAgIHZhciBkYXRhVHlwZSA9IHV0aWxzLmdldFR5cGVPZihkYXRhKSxcbiAgICAgICAgcGFyZW50O1xuXG5cbiAgICAvKlxuICAgICAqIENvcnJlY3Qgb3B0aW9ucy5cbiAgICAgKi9cblxuICAgIG8gPSB1dGlscy5leHRlbmQobyB8fCB7fSwgZGVmYXVsdHMpO1xuICAgIG8uZGF0ZSA9IG8uZGF0ZSB8fCBuZXcgRGF0ZSgpO1xuICAgIGlmIChvLmNvbXByZXNzaW9uICE9PSBudWxsKSB7XG4gICAgICAgIG8uY29tcHJlc3Npb24gPSBvLmNvbXByZXNzaW9uLnRvVXBwZXJDYXNlKCk7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBvLnVuaXhQZXJtaXNzaW9ucyA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICBvLnVuaXhQZXJtaXNzaW9ucyA9IHBhcnNlSW50KG8udW5peFBlcm1pc3Npb25zLCA4KTtcbiAgICB9XG5cbiAgICAvLyBVTlhfSUZESVIgIDAwNDAwMDAgc2VlIHppcGluZm8uY1xuICAgIGlmIChvLnVuaXhQZXJtaXNzaW9ucyAmJiAoby51bml4UGVybWlzc2lvbnMgJiAweDQwMDApKSB7XG4gICAgICAgIG8uZGlyID0gdHJ1ZTtcbiAgICB9XG4gICAgLy8gQml0IDQgICAgRGlyZWN0b3J5XG4gICAgaWYgKG8uZG9zUGVybWlzc2lvbnMgJiYgKG8uZG9zUGVybWlzc2lvbnMgJiAweDAwMTApKSB7XG4gICAgICAgIG8uZGlyID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBpZiAoby5kaXIpIHtcbiAgICAgICAgbmFtZSA9IGZvcmNlVHJhaWxpbmdTbGFzaChuYW1lKTtcbiAgICB9XG4gICAgaWYgKG8uY3JlYXRlRm9sZGVycyAmJiAocGFyZW50ID0gcGFyZW50Rm9sZGVyKG5hbWUpKSkge1xuICAgICAgICBmb2xkZXJBZGQuY2FsbCh0aGlzLCBwYXJlbnQsIHRydWUpO1xuICAgIH1cblxuICAgIHZhciBpc1VuaWNvZGVTdHJpbmcgPSBkYXRhVHlwZSA9PT0gXCJzdHJpbmdcIiAmJiBvLmJpbmFyeSA9PT0gZmFsc2UgJiYgby5iYXNlNjQgPT09IGZhbHNlO1xuICAgIG8uYmluYXJ5ID0gIWlzVW5pY29kZVN0cmluZztcblxuXG4gICAgdmFyIGlzQ29tcHJlc3NlZEVtcHR5ID0gKGRhdGEgaW5zdGFuY2VvZiBDb21wcmVzc2VkT2JqZWN0KSAmJiBkYXRhLnVuY29tcHJlc3NlZFNpemUgPT09IDA7XG5cbiAgICBpZiAoaXNDb21wcmVzc2VkRW1wdHkgfHwgby5kaXIgfHwgIWRhdGEgfHwgZGF0YS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgby5iYXNlNjQgPSBmYWxzZTtcbiAgICAgICAgby5iaW5hcnkgPSB0cnVlO1xuICAgICAgICBkYXRhID0gXCJcIjtcbiAgICAgICAgby5jb21wcmVzc2lvbiA9IFwiU1RPUkVcIjtcbiAgICAgICAgZGF0YVR5cGUgPSBcInN0cmluZ1wiO1xuICAgIH1cblxuICAgIC8qXG4gICAgICogQ29udmVydCBjb250ZW50IHRvIGZpdC5cbiAgICAgKi9cblxuICAgIHZhciB6aXBPYmplY3RDb250ZW50ID0gbnVsbDtcbiAgICBpZiAoZGF0YSBpbnN0YW5jZW9mIENvbXByZXNzZWRPYmplY3QgfHwgZGF0YSBpbnN0YW5jZW9mIEdlbmVyaWNXb3JrZXIpIHtcbiAgICAgICAgemlwT2JqZWN0Q29udGVudCA9IGRhdGE7XG4gICAgfSBlbHNlIGlmIChub2RlanNVdGlscy5pc05vZGUgJiYgbm9kZWpzVXRpbHMuaXNTdHJlYW0oZGF0YSkpIHtcbiAgICAgICAgemlwT2JqZWN0Q29udGVudCA9IG5ldyBOb2RlanNTdHJlYW1JbnB1dEFkYXB0ZXIobmFtZSwgZGF0YSk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgemlwT2JqZWN0Q29udGVudCA9IHV0aWxzLnByZXBhcmVDb250ZW50KG5hbWUsIGRhdGEsIG8uYmluYXJ5LCBvLm9wdGltaXplZEJpbmFyeVN0cmluZywgby5iYXNlNjQpO1xuICAgIH1cblxuICAgIHZhciBvYmplY3QgPSBuZXcgWmlwT2JqZWN0KG5hbWUsIHppcE9iamVjdENvbnRlbnQsIG8pO1xuICAgIHRoaXMuZmlsZXNbbmFtZV0gPSBvYmplY3Q7XG4gICAgLypcbiAgICBUT0RPOiB3ZSBjYW4ndCB0aHJvdyBhbiBleGNlcHRpb24gYmVjYXVzZSB3ZSBoYXZlIGFzeW5jIHByb21pc2VzXG4gICAgKHdlIGNhbiBoYXZlIGEgcHJvbWlzZSBvZiBhIERhdGUoKSBmb3IgZXhhbXBsZSkgYnV0IHJldHVybmluZyBhXG4gICAgcHJvbWlzZSBpcyB1c2VsZXNzIGJlY2F1c2UgZmlsZShuYW1lLCBkYXRhKSByZXR1cm5zIHRoZSBKU1ppcFxuICAgIG9iamVjdCBmb3IgY2hhaW5pbmcuIFNob3VsZCB3ZSBicmVhayB0aGF0IHRvIGFsbG93IHRoZSB1c2VyXG4gICAgdG8gY2F0Y2ggdGhlIGVycm9yID9cblxuICAgIHJldHVybiBleHRlcm5hbC5Qcm9taXNlLnJlc29sdmUoemlwT2JqZWN0Q29udGVudClcbiAgICAudGhlbihmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBvYmplY3Q7XG4gICAgfSk7XG4gICAgKi9cbn07XG5cbi8qKlxuICogRmluZCB0aGUgcGFyZW50IGZvbGRlciBvZiB0aGUgcGF0aC5cbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge3N0cmluZ30gcGF0aCB0aGUgcGF0aCB0byB1c2VcbiAqIEByZXR1cm4ge3N0cmluZ30gdGhlIHBhcmVudCBmb2xkZXIsIG9yIFwiXCJcbiAqL1xudmFyIHBhcmVudEZvbGRlciA9IGZ1bmN0aW9uIChwYXRoKSB7XG4gICAgaWYgKHBhdGguc2xpY2UoLTEpID09PSAnLycpIHtcbiAgICAgICAgcGF0aCA9IHBhdGguc3Vic3RyaW5nKDAsIHBhdGgubGVuZ3RoIC0gMSk7XG4gICAgfVxuICAgIHZhciBsYXN0U2xhc2ggPSBwYXRoLmxhc3RJbmRleE9mKCcvJyk7XG4gICAgcmV0dXJuIChsYXN0U2xhc2ggPiAwKSA/IHBhdGguc3Vic3RyaW5nKDAsIGxhc3RTbGFzaCkgOiBcIlwiO1xufTtcblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBwYXRoIHdpdGggYSBzbGFzaCBhdCB0aGUgZW5kLlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7U3RyaW5nfSBwYXRoIHRoZSBwYXRoIHRvIGNoZWNrLlxuICogQHJldHVybiB7U3RyaW5nfSB0aGUgcGF0aCB3aXRoIGEgdHJhaWxpbmcgc2xhc2guXG4gKi9cbnZhciBmb3JjZVRyYWlsaW5nU2xhc2ggPSBmdW5jdGlvbihwYXRoKSB7XG4gICAgLy8gQ2hlY2sgdGhlIG5hbWUgZW5kcyB3aXRoIGEgL1xuICAgIGlmIChwYXRoLnNsaWNlKC0xKSAhPT0gXCIvXCIpIHtcbiAgICAgICAgcGF0aCArPSBcIi9cIjsgLy8gSUUgZG9lc24ndCBsaWtlIHN1YnN0cigtMSlcbiAgICB9XG4gICAgcmV0dXJuIHBhdGg7XG59O1xuXG4vKipcbiAqIEFkZCBhIChzdWIpIGZvbGRlciBpbiB0aGUgY3VycmVudCBmb2xkZXIuXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgdGhlIGZvbGRlcidzIG5hbWVcbiAqIEBwYXJhbSB7Ym9vbGVhbj19IFtjcmVhdGVGb2xkZXJzXSBJZiB0cnVlLCBhdXRvbWF0aWNhbGx5IGNyZWF0ZSBzdWJcbiAqICBmb2xkZXJzLiBEZWZhdWx0cyB0byBmYWxzZS5cbiAqIEByZXR1cm4ge09iamVjdH0gdGhlIG5ldyBmb2xkZXIuXG4gKi9cbnZhciBmb2xkZXJBZGQgPSBmdW5jdGlvbihuYW1lLCBjcmVhdGVGb2xkZXJzKSB7XG4gICAgY3JlYXRlRm9sZGVycyA9ICh0eXBlb2YgY3JlYXRlRm9sZGVycyAhPT0gJ3VuZGVmaW5lZCcpID8gY3JlYXRlRm9sZGVycyA6IGRlZmF1bHRzLmNyZWF0ZUZvbGRlcnM7XG5cbiAgICBuYW1lID0gZm9yY2VUcmFpbGluZ1NsYXNoKG5hbWUpO1xuXG4gICAgLy8gRG9lcyB0aGlzIGZvbGRlciBhbHJlYWR5IGV4aXN0P1xuICAgIGlmICghdGhpcy5maWxlc1tuYW1lXSkge1xuICAgICAgICBmaWxlQWRkLmNhbGwodGhpcywgbmFtZSwgbnVsbCwge1xuICAgICAgICAgICAgZGlyOiB0cnVlLFxuICAgICAgICAgICAgY3JlYXRlRm9sZGVyczogY3JlYXRlRm9sZGVyc1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuZmlsZXNbbmFtZV07XG59O1xuXG4vKipcbiogQ3Jvc3Mtd2luZG93LCBjcm9zcy1Ob2RlLWNvbnRleHQgcmVndWxhciBleHByZXNzaW9uIGRldGVjdGlvblxuKiBAcGFyYW0gIHtPYmplY3R9ICBvYmplY3QgQW55dGhpbmdcbiogQHJldHVybiB7Qm9vbGVhbn0gICAgICAgIHRydWUgaWYgdGhlIG9iamVjdCBpcyBhIHJlZ3VsYXIgZXhwcmVzc2lvbixcbiogZmFsc2Ugb3RoZXJ3aXNlXG4qL1xuZnVuY3Rpb24gaXNSZWdFeHAob2JqZWN0KSB7XG4gICAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvYmplY3QpID09PSBcIltvYmplY3QgUmVnRXhwXVwiO1xufVxuXG4vLyByZXR1cm4gdGhlIGFjdHVhbCBwcm90b3R5cGUgb2YgSlNaaXBcbnZhciBvdXQgPSB7XG4gICAgLyoqXG4gICAgICogQHNlZSBsb2FkQXN5bmNcbiAgICAgKi9cbiAgICBsb2FkOiBmdW5jdGlvbigpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhpcyBtZXRob2QgaGFzIGJlZW4gcmVtb3ZlZCBpbiBKU1ppcCAzLjAsIHBsZWFzZSBjaGVjayB0aGUgdXBncmFkZSBndWlkZS5cIik7XG4gICAgfSxcblxuXG4gICAgLyoqXG4gICAgICogQ2FsbCBhIGNhbGxiYWNrIGZ1bmN0aW9uIGZvciBlYWNoIGVudHJ5IGF0IHRoaXMgZm9sZGVyIGxldmVsLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGNiIHRoZSBjYWxsYmFjayBmdW5jdGlvbjpcbiAgICAgKiBmdW5jdGlvbiAocmVsYXRpdmVQYXRoLCBmaWxlKSB7Li4ufVxuICAgICAqIEl0IHRha2VzIDIgYXJndW1lbnRzIDogdGhlIHJlbGF0aXZlIHBhdGggYW5kIHRoZSBmaWxlLlxuICAgICAqL1xuICAgIGZvckVhY2g6IGZ1bmN0aW9uKGNiKSB7XG4gICAgICAgIHZhciBmaWxlbmFtZSwgcmVsYXRpdmVQYXRoLCBmaWxlO1xuICAgICAgICBmb3IgKGZpbGVuYW1lIGluIHRoaXMuZmlsZXMpIHtcbiAgICAgICAgICAgIGlmICghdGhpcy5maWxlcy5oYXNPd25Qcm9wZXJ0eShmaWxlbmFtZSkpIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZpbGUgPSB0aGlzLmZpbGVzW2ZpbGVuYW1lXTtcbiAgICAgICAgICAgIHJlbGF0aXZlUGF0aCA9IGZpbGVuYW1lLnNsaWNlKHRoaXMucm9vdC5sZW5ndGgsIGZpbGVuYW1lLmxlbmd0aCk7XG4gICAgICAgICAgICBpZiAocmVsYXRpdmVQYXRoICYmIGZpbGVuYW1lLnNsaWNlKDAsIHRoaXMucm9vdC5sZW5ndGgpID09PSB0aGlzLnJvb3QpIHsgLy8gdGhlIGZpbGUgaXMgaW4gdGhlIGN1cnJlbnQgcm9vdFxuICAgICAgICAgICAgICAgIGNiKHJlbGF0aXZlUGF0aCwgZmlsZSk7IC8vIFRPRE8gcmV2ZXJzZSB0aGUgcGFyYW1ldGVycyA/IG5lZWQgdG8gYmUgY2xlYW4gQU5EIGNvbnNpc3RlbnQgd2l0aCB0aGUgZmlsdGVyIHNlYXJjaCBmbi4uLlxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEZpbHRlciBuZXN0ZWQgZmlsZXMvZm9sZGVycyB3aXRoIHRoZSBzcGVjaWZpZWQgZnVuY3Rpb24uXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gc2VhcmNoIHRoZSBwcmVkaWNhdGUgdG8gdXNlIDpcbiAgICAgKiBmdW5jdGlvbiAocmVsYXRpdmVQYXRoLCBmaWxlKSB7Li4ufVxuICAgICAqIEl0IHRha2VzIDIgYXJndW1lbnRzIDogdGhlIHJlbGF0aXZlIHBhdGggYW5kIHRoZSBmaWxlLlxuICAgICAqIEByZXR1cm4ge0FycmF5fSBBbiBhcnJheSBvZiBtYXRjaGluZyBlbGVtZW50cy5cbiAgICAgKi9cbiAgICBmaWx0ZXI6IGZ1bmN0aW9uKHNlYXJjaCkge1xuICAgICAgICB2YXIgcmVzdWx0ID0gW107XG4gICAgICAgIHRoaXMuZm9yRWFjaChmdW5jdGlvbiAocmVsYXRpdmVQYXRoLCBlbnRyeSkge1xuICAgICAgICAgICAgaWYgKHNlYXJjaChyZWxhdGl2ZVBhdGgsIGVudHJ5KSkgeyAvLyB0aGUgZmlsZSBtYXRjaGVzIHRoZSBmdW5jdGlvblxuICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKGVudHJ5KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogQWRkIGEgZmlsZSB0byB0aGUgemlwIGZpbGUsIG9yIHNlYXJjaCBhIGZpbGUuXG4gICAgICogQHBhcmFtICAge3N0cmluZ3xSZWdFeHB9IG5hbWUgVGhlIG5hbWUgb2YgdGhlIGZpbGUgdG8gYWRkIChpZiBkYXRhIGlzIGRlZmluZWQpLFxuICAgICAqIHRoZSBuYW1lIG9mIHRoZSBmaWxlIHRvIGZpbmQgKGlmIG5vIGRhdGEpIG9yIGEgcmVnZXggdG8gbWF0Y2ggZmlsZXMuXG4gICAgICogQHBhcmFtICAge1N0cmluZ3xBcnJheUJ1ZmZlcnxVaW50OEFycmF5fEJ1ZmZlcn0gZGF0YSAgVGhlIGZpbGUgZGF0YSwgZWl0aGVyIHJhdyBvciBiYXNlNjQgZW5jb2RlZFxuICAgICAqIEBwYXJhbSAgIHtPYmplY3R9IG8gICAgIEZpbGUgb3B0aW9uc1xuICAgICAqIEByZXR1cm4gIHtKU1ppcHxPYmplY3R8QXJyYXl9IHRoaXMgSlNaaXAgb2JqZWN0ICh3aGVuIGFkZGluZyBhIGZpbGUpLFxuICAgICAqIGEgZmlsZSAod2hlbiBzZWFyY2hpbmcgYnkgc3RyaW5nKSBvciBhbiBhcnJheSBvZiBmaWxlcyAod2hlbiBzZWFyY2hpbmcgYnkgcmVnZXgpLlxuICAgICAqL1xuICAgIGZpbGU6IGZ1bmN0aW9uKG5hbWUsIGRhdGEsIG8pIHtcbiAgICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICAgIGlmIChpc1JlZ0V4cChuYW1lKSkge1xuICAgICAgICAgICAgICAgIHZhciByZWdleHAgPSBuYW1lO1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmZpbHRlcihmdW5jdGlvbihyZWxhdGl2ZVBhdGgsIGZpbGUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICFmaWxlLmRpciAmJiByZWdleHAudGVzdChyZWxhdGl2ZVBhdGgpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7IC8vIHRleHRcbiAgICAgICAgICAgICAgICB2YXIgb2JqID0gdGhpcy5maWxlc1t0aGlzLnJvb3QgKyBuYW1lXTtcbiAgICAgICAgICAgICAgICBpZiAob2JqICYmICFvYmouZGlyKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBvYmo7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2UgeyAvLyBtb3JlIHRoYW4gb25lIGFyZ3VtZW50IDogd2UgaGF2ZSBkYXRhICFcbiAgICAgICAgICAgIG5hbWUgPSB0aGlzLnJvb3QgKyBuYW1lO1xuICAgICAgICAgICAgZmlsZUFkZC5jYWxsKHRoaXMsIG5hbWUsIGRhdGEsIG8pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBBZGQgYSBkaXJlY3RvcnkgdG8gdGhlIHppcCBmaWxlLCBvciBzZWFyY2guXG4gICAgICogQHBhcmFtICAge1N0cmluZ3xSZWdFeHB9IGFyZyBUaGUgbmFtZSBvZiB0aGUgZGlyZWN0b3J5IHRvIGFkZCwgb3IgYSByZWdleCB0byBzZWFyY2ggZm9sZGVycy5cbiAgICAgKiBAcmV0dXJuICB7SlNaaXB9IGFuIG9iamVjdCB3aXRoIHRoZSBuZXcgZGlyZWN0b3J5IGFzIHRoZSByb290LCBvciBhbiBhcnJheSBjb250YWluaW5nIG1hdGNoaW5nIGZvbGRlcnMuXG4gICAgICovXG4gICAgZm9sZGVyOiBmdW5jdGlvbihhcmcpIHtcbiAgICAgICAgaWYgKCFhcmcpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGlzUmVnRXhwKGFyZykpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmZpbHRlcihmdW5jdGlvbihyZWxhdGl2ZVBhdGgsIGZpbGUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmlsZS5kaXIgJiYgYXJnLnRlc3QocmVsYXRpdmVQYXRoKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gZWxzZSwgbmFtZSBpcyBhIG5ldyBmb2xkZXJcbiAgICAgICAgdmFyIG5hbWUgPSB0aGlzLnJvb3QgKyBhcmc7XG4gICAgICAgIHZhciBuZXdGb2xkZXIgPSBmb2xkZXJBZGQuY2FsbCh0aGlzLCBuYW1lKTtcblxuICAgICAgICAvLyBBbGxvdyBjaGFpbmluZyBieSByZXR1cm5pbmcgYSBuZXcgb2JqZWN0IHdpdGggdGhpcyBmb2xkZXIgYXMgdGhlIHJvb3RcbiAgICAgICAgdmFyIHJldCA9IHRoaXMuY2xvbmUoKTtcbiAgICAgICAgcmV0LnJvb3QgPSBuZXdGb2xkZXIubmFtZTtcbiAgICAgICAgcmV0dXJuIHJldDtcbiAgICB9Ly8sXG5cbiAgICAvKipcbiAgICAgKiBEZWxldGUgYSBmaWxlLCBvciBhIGRpcmVjdG9yeSBhbmQgYWxsIHN1Yi1maWxlcywgZnJvbSB0aGUgemlwXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgdGhlIG5hbWUgb2YgdGhlIGZpbGUgdG8gZGVsZXRlXG4gICAgICogQHJldHVybiB7SlNaaXB9IHRoaXMgSlNaaXAgb2JqZWN0XG4gICAgICovXG4gICAgLy8gcmVtb3ZlOiBmdW5jdGlvbihuYW1lKSB7XG4gICAgLy8gICAgIG5hbWUgPSB0aGlzLnJvb3QgKyBuYW1lO1xuICAgIC8vICAgICB2YXIgZmlsZSA9IHRoaXMuZmlsZXNbbmFtZV07XG4gICAgLy8gICAgIGlmICghZmlsZSkge1xuICAgIC8vICAgICAgICAgLy8gTG9vayBmb3IgYW55IGZvbGRlcnNcbiAgICAvLyAgICAgICAgIGlmIChuYW1lLnNsaWNlKC0xKSAhPT0gXCIvXCIpIHtcbiAgICAvLyAgICAgICAgICAgICBuYW1lICs9IFwiL1wiO1xuICAgIC8vICAgICAgICAgfVxuICAgIC8vICAgICAgICAgZmlsZSA9IHRoaXMuZmlsZXNbbmFtZV07XG4gICAgLy8gICAgIH1cblxuICAgIC8vICAgICBpZiAoZmlsZSAmJiAhZmlsZS5kaXIpIHtcbiAgICAvLyAgICAgICAgIC8vIGZpbGVcbiAgICAvLyAgICAgICAgIGRlbGV0ZSB0aGlzLmZpbGVzW25hbWVdO1xuICAgIC8vICAgICB9IGVsc2Uge1xuICAgIC8vICAgICAgICAgLy8gbWF5YmUgYSBmb2xkZXIsIGRlbGV0ZSByZWN1cnNpdmVseVxuICAgIC8vICAgICAgICAgdmFyIGtpZHMgPSB0aGlzLmZpbHRlcihmdW5jdGlvbihyZWxhdGl2ZVBhdGgsIGZpbGUpIHtcbiAgICAvLyAgICAgICAgICAgICByZXR1cm4gZmlsZS5uYW1lLnNsaWNlKDAsIG5hbWUubGVuZ3RoKSA9PT0gbmFtZTtcbiAgICAvLyAgICAgICAgIH0pO1xuICAgIC8vICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBraWRzLmxlbmd0aDsgaSsrKSB7XG4gICAgLy8gICAgICAgICAgICAgZGVsZXRlIHRoaXMuZmlsZXNba2lkc1tpXS5uYW1lXTtcbiAgICAvLyAgICAgICAgIH1cbiAgICAvLyAgICAgfVxuXG4gICAgLy8gICAgIHJldHVybiB0aGlzO1xuICAgIC8vIH0sXG5cbiAgICAvKipcbiAgICAgKiBHZW5lcmF0ZSB0aGUgY29tcGxldGUgemlwIGZpbGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucyB0aGUgb3B0aW9ucyB0byBnZW5lcmF0ZSB0aGUgemlwIGZpbGUgOlxuICAgICAqIC0gY29tcHJlc3Npb24sIFwiU1RPUkVcIiBieSBkZWZhdWx0LlxuICAgICAqIC0gdHlwZSwgXCJiYXNlNjRcIiBieSBkZWZhdWx0LiBWYWx1ZXMgYXJlIDogc3RyaW5nLCBiYXNlNjQsIHVpbnQ4YXJyYXksIGFycmF5YnVmZmVyLCBibG9iLlxuICAgICAqIEByZXR1cm4ge1N0cmluZ3xVaW50OEFycmF5fEFycmF5QnVmZmVyfEJ1ZmZlcnxCbG9ifSB0aGUgemlwIGZpbGVcbiAgICAgKi9cbiAgICAvLyBnZW5lcmF0ZTogZnVuY3Rpb24ob3B0aW9ucykge1xuICAgIC8vICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGlzIG1ldGhvZCBoYXMgYmVlbiByZW1vdmVkIGluIEpTWmlwIDMuMCwgcGxlYXNlIGNoZWNrIHRoZSB1cGdyYWRlIGd1aWRlLlwiKTtcbiAgICAvLyB9LFxuXG4gICAgLyoqXG4gICAgICogR2VuZXJhdGUgdGhlIGNvbXBsZXRlIHppcCBmaWxlIGFzIGFuIGludGVybmFsIHN0cmVhbS5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucyB0aGUgb3B0aW9ucyB0byBnZW5lcmF0ZSB0aGUgemlwIGZpbGUgOlxuICAgICAqIC0gY29tcHJlc3Npb24sIFwiU1RPUkVcIiBieSBkZWZhdWx0LlxuICAgICAqIC0gdHlwZSwgXCJiYXNlNjRcIiBieSBkZWZhdWx0LiBWYWx1ZXMgYXJlIDogc3RyaW5nLCBiYXNlNjQsIHVpbnQ4YXJyYXksIGFycmF5YnVmZmVyLCBibG9iLlxuICAgICAqIEByZXR1cm4ge1N0cmVhbUhlbHBlcn0gdGhlIHN0cmVhbWVkIHppcCBmaWxlLlxuICAgICAqL1xuICAgIC8vIGdlbmVyYXRlSW50ZXJuYWxTdHJlYW06IGZ1bmN0aW9uKG9wdGlvbnMpIHtcbiAgICAvLyAgIHZhciB3b3JrZXIsIG9wdHMgPSB7fTtcbiAgICAvLyAgIHRyeSB7XG4gICAgLy8gICAgICAgb3B0cyA9IHV0aWxzLmV4dGVuZChvcHRpb25zIHx8IHt9LCB7XG4gICAgLy8gICAgICAgICAgIHN0cmVhbUZpbGVzOiBmYWxzZSxcbiAgICAvLyAgICAgICAgICAgY29tcHJlc3Npb246IFwiU1RPUkVcIixcbiAgICAvLyAgICAgICAgICAgY29tcHJlc3Npb25PcHRpb25zIDogbnVsbCxcbiAgICAvLyAgICAgICAgICAgdHlwZTogXCJcIixcbiAgICAvLyAgICAgICAgICAgcGxhdGZvcm06IFwiRE9TXCIsXG4gICAgLy8gICAgICAgICAgIGNvbW1lbnQ6IG51bGwsXG4gICAgLy8gICAgICAgICAgIG1pbWVUeXBlOiAnYXBwbGljYXRpb24vemlwJyxcbiAgICAvLyAgICAgICAgICAgZW5jb2RlRmlsZU5hbWU6IHV0ZjgudXRmOGVuY29kZVxuICAgIC8vICAgICAgIH0pO1xuXG4gICAgLy8gICAgICAgb3B0cy50eXBlID0gb3B0cy50eXBlLnRvTG93ZXJDYXNlKCk7XG4gICAgLy8gICAgICAgb3B0cy5jb21wcmVzc2lvbiA9IG9wdHMuY29tcHJlc3Npb24udG9VcHBlckNhc2UoKTtcblxuICAgIC8vICAgICAgIC8vIFwiYmluYXJ5c3RyaW5nXCIgaXMgcHJlZmVyZWQgYnV0IHRoZSBpbnRlcm5hbHMgdXNlIFwic3RyaW5nXCIuXG4gICAgLy8gICAgICAgaWYob3B0cy50eXBlID09PSBcImJpbmFyeXN0cmluZ1wiKSB7XG4gICAgLy8gICAgICAgICBvcHRzLnR5cGUgPSBcInN0cmluZ1wiO1xuICAgIC8vICAgICAgIH1cblxuICAgIC8vICAgICAgIGlmICghb3B0cy50eXBlKSB7XG4gICAgLy8gICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJObyBvdXRwdXQgdHlwZSBzcGVjaWZpZWQuXCIpO1xuICAgIC8vICAgICAgIH1cblxuICAgIC8vICAgICAgIHV0aWxzLmNoZWNrU3VwcG9ydChvcHRzLnR5cGUpO1xuXG4gICAgLy8gICAgICAgLy8gYWNjZXB0IG5vZGVqcyBgcHJvY2Vzcy5wbGF0Zm9ybWBcbiAgICAvLyAgICAgICBpZihcbiAgICAvLyAgICAgICAgICAgb3B0aW9ucy5wbGF0Zm9ybSA9PT0gJ2RhcndpbicgfHxcbiAgICAvLyAgICAgICAgICAgb3B0aW9ucy5wbGF0Zm9ybSA9PT0gJ2ZyZWVic2QnIHx8XG4gICAgLy8gICAgICAgICAgIG9wdGlvbnMucGxhdGZvcm0gPT09ICdsaW51eCcgfHxcbiAgICAvLyAgICAgICAgICAgb3B0aW9ucy5wbGF0Zm9ybSA9PT0gJ3N1bm9zJ1xuICAgIC8vICAgICAgICkge1xuICAgIC8vICAgICAgICAgICBvcHRpb25zLnBsYXRmb3JtID0gXCJVTklYXCI7XG4gICAgLy8gICAgICAgfVxuICAgIC8vICAgICAgIGlmIChvcHRpb25zLnBsYXRmb3JtID09PSAnd2luMzInKSB7XG4gICAgLy8gICAgICAgICAgIG9wdGlvbnMucGxhdGZvcm0gPSBcIkRPU1wiO1xuICAgIC8vICAgICAgIH1cblxuICAgIC8vICAgICAgIHZhciBjb21tZW50ID0gb3B0cy5jb21tZW50IHx8IHRoaXMuY29tbWVudCB8fCBcIlwiO1xuICAgIC8vICAgICAgIHdvcmtlciA9IGdlbmVyYXRlLmdlbmVyYXRlV29ya2VyKHRoaXMsIG9wdHMsIGNvbW1lbnQpO1xuICAgIC8vICAgfSBjYXRjaCAoZSkge1xuICAgIC8vICAgICB3b3JrZXIgPSBuZXcgR2VuZXJpY1dvcmtlcihcImVycm9yXCIpO1xuICAgIC8vICAgICB3b3JrZXIuZXJyb3IoZSk7XG4gICAgLy8gICB9XG4gICAgLy8gICByZXR1cm4gbmV3IFN0cmVhbUhlbHBlcih3b3JrZXIsIG9wdHMudHlwZSB8fCBcInN0cmluZ1wiLCBvcHRzLm1pbWVUeXBlKTtcbiAgICAvLyB9LFxuICAgIC8vIC8qKlxuICAgIC8vICAqIEdlbmVyYXRlIHRoZSBjb21wbGV0ZSB6aXAgZmlsZSBhc3luY2hyb25vdXNseS5cbiAgICAvLyAgKiBAc2VlIGdlbmVyYXRlSW50ZXJuYWxTdHJlYW1cbiAgICAvLyAgKi9cbiAgICAvLyBnZW5lcmF0ZUFzeW5jOiBmdW5jdGlvbihvcHRpb25zLCBvblVwZGF0ZSkge1xuICAgIC8vICAgICByZXR1cm4gdGhpcy5nZW5lcmF0ZUludGVybmFsU3RyZWFtKG9wdGlvbnMpLmFjY3VtdWxhdGUob25VcGRhdGUpO1xuICAgIC8vIH0sXG4gICAgLy8gLyoqXG4gICAgLy8gICogR2VuZXJhdGUgdGhlIGNvbXBsZXRlIHppcCBmaWxlIGFzeW5jaHJvbm91c2x5LlxuICAgIC8vICAqIEBzZWUgZ2VuZXJhdGVJbnRlcm5hbFN0cmVhbVxuICAgIC8vICAqL1xuICAgIC8vIGdlbmVyYXRlTm9kZVN0cmVhbTogZnVuY3Rpb24ob3B0aW9ucywgb25VcGRhdGUpIHtcbiAgICAvLyAgICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gICAgLy8gICAgIGlmICghb3B0aW9ucy50eXBlKSB7XG4gICAgLy8gICAgICAgICBvcHRpb25zLnR5cGUgPSBcIm5vZGVidWZmZXJcIjtcbiAgICAvLyAgICAgfVxuICAgIC8vICAgICByZXR1cm4gdGhpcy5nZW5lcmF0ZUludGVybmFsU3RyZWFtKG9wdGlvbnMpLnRvTm9kZWpzU3RyZWFtKG9uVXBkYXRlKTtcbiAgICAvLyB9XG59O1xubW9kdWxlLmV4cG9ydHMgPSBvdXQ7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgRGF0YVJlYWRlciA9IHJlcXVpcmUoJy4vRGF0YVJlYWRlcicpO1xudmFyIHV0aWxzID0gcmVxdWlyZSgnLi4vdXRpbHMnKTtcblxuZnVuY3Rpb24gQXJyYXlSZWFkZXIoZGF0YSkge1xuICAgIERhdGFSZWFkZXIuY2FsbCh0aGlzLCBkYXRhKTtcblx0Zm9yKHZhciBpID0gMDsgaSA8IHRoaXMuZGF0YS5sZW5ndGg7IGkrKykge1xuXHRcdGRhdGFbaV0gPSBkYXRhW2ldICYgMHhGRjtcblx0fVxufVxudXRpbHMuaW5oZXJpdHMoQXJyYXlSZWFkZXIsIERhdGFSZWFkZXIpO1xuLyoqXG4gKiBAc2VlIERhdGFSZWFkZXIuYnl0ZUF0XG4gKi9cbkFycmF5UmVhZGVyLnByb3RvdHlwZS5ieXRlQXQgPSBmdW5jdGlvbihpKSB7XG4gICAgcmV0dXJuIHRoaXMuZGF0YVt0aGlzLnplcm8gKyBpXTtcbn07XG4vKipcbiAqIEBzZWUgRGF0YVJlYWRlci5sYXN0SW5kZXhPZlNpZ25hdHVyZVxuICovXG5BcnJheVJlYWRlci5wcm90b3R5cGUubGFzdEluZGV4T2ZTaWduYXR1cmUgPSBmdW5jdGlvbihzaWcpIHtcbiAgICB2YXIgc2lnMCA9IHNpZy5jaGFyQ29kZUF0KDApLFxuICAgICAgICBzaWcxID0gc2lnLmNoYXJDb2RlQXQoMSksXG4gICAgICAgIHNpZzIgPSBzaWcuY2hhckNvZGVBdCgyKSxcbiAgICAgICAgc2lnMyA9IHNpZy5jaGFyQ29kZUF0KDMpO1xuICAgIGZvciAodmFyIGkgPSB0aGlzLmxlbmd0aCAtIDQ7IGkgPj0gMDsgLS1pKSB7XG4gICAgICAgIGlmICh0aGlzLmRhdGFbaV0gPT09IHNpZzAgJiYgdGhpcy5kYXRhW2kgKyAxXSA9PT0gc2lnMSAmJiB0aGlzLmRhdGFbaSArIDJdID09PSBzaWcyICYmIHRoaXMuZGF0YVtpICsgM10gPT09IHNpZzMpIHtcbiAgICAgICAgICAgIHJldHVybiBpIC0gdGhpcy56ZXJvO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIC0xO1xufTtcbi8qKlxuICogQHNlZSBEYXRhUmVhZGVyLnJlYWRBbmRDaGVja1NpZ25hdHVyZVxuICovXG5BcnJheVJlYWRlci5wcm90b3R5cGUucmVhZEFuZENoZWNrU2lnbmF0dXJlID0gZnVuY3Rpb24gKHNpZykge1xuICAgIHZhciBzaWcwID0gc2lnLmNoYXJDb2RlQXQoMCksXG4gICAgICAgIHNpZzEgPSBzaWcuY2hhckNvZGVBdCgxKSxcbiAgICAgICAgc2lnMiA9IHNpZy5jaGFyQ29kZUF0KDIpLFxuICAgICAgICBzaWczID0gc2lnLmNoYXJDb2RlQXQoMyksXG4gICAgICAgIGRhdGEgPSB0aGlzLnJlYWREYXRhKDQpO1xuICAgIHJldHVybiBzaWcwID09PSBkYXRhWzBdICYmIHNpZzEgPT09IGRhdGFbMV0gJiYgc2lnMiA9PT0gZGF0YVsyXSAmJiBzaWczID09PSBkYXRhWzNdO1xufTtcbi8qKlxuICogQHNlZSBEYXRhUmVhZGVyLnJlYWREYXRhXG4gKi9cbkFycmF5UmVhZGVyLnByb3RvdHlwZS5yZWFkRGF0YSA9IGZ1bmN0aW9uKHNpemUpIHtcbiAgICB0aGlzLmNoZWNrT2Zmc2V0KHNpemUpO1xuICAgIGlmKHNpemUgPT09IDApIHtcbiAgICAgICAgcmV0dXJuIFtdO1xuICAgIH1cbiAgICB2YXIgcmVzdWx0ID0gdGhpcy5kYXRhLnNsaWNlKHRoaXMuemVybyArIHRoaXMuaW5kZXgsIHRoaXMuemVybyArIHRoaXMuaW5kZXggKyBzaXplKTtcbiAgICB0aGlzLmluZGV4ICs9IHNpemU7XG4gICAgcmV0dXJuIHJlc3VsdDtcbn07XG5tb2R1bGUuZXhwb3J0cyA9IEFycmF5UmVhZGVyO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIHV0aWxzID0gcmVxdWlyZSgnLi4vdXRpbHMnKTtcblxuZnVuY3Rpb24gRGF0YVJlYWRlcihkYXRhKSB7XG4gICAgdGhpcy5kYXRhID0gZGF0YTsgLy8gdHlwZSA6IHNlZSBpbXBsZW1lbnRhdGlvblxuICAgIHRoaXMubGVuZ3RoID0gZGF0YS5sZW5ndGg7XG4gICAgdGhpcy5pbmRleCA9IDA7XG4gICAgdGhpcy56ZXJvID0gMDtcbn1cbkRhdGFSZWFkZXIucHJvdG90eXBlID0ge1xuICAgIC8qKlxuICAgICAqIENoZWNrIHRoYXQgdGhlIG9mZnNldCB3aWxsIG5vdCBnbyB0b28gZmFyLlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBvZmZzZXQgdGhlIGFkZGl0aW9uYWwgb2Zmc2V0IHRvIGNoZWNrLlxuICAgICAqIEB0aHJvd3Mge0Vycm9yfSBhbiBFcnJvciBpZiB0aGUgb2Zmc2V0IGlzIG91dCBvZiBib3VuZHMuXG4gICAgICovXG4gICAgY2hlY2tPZmZzZXQ6IGZ1bmN0aW9uKG9mZnNldCkge1xuICAgICAgICB0aGlzLmNoZWNrSW5kZXgodGhpcy5pbmRleCArIG9mZnNldCk7XG4gICAgfSxcbiAgICAvKipcbiAgICAgKiBDaGVjayB0aGF0IHRoZSBzcGVjaWZlZCBpbmRleCB3aWxsIG5vdCBiZSB0b28gZmFyLlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBuZXdJbmRleCB0aGUgaW5kZXggdG8gY2hlY2suXG4gICAgICogQHRocm93cyB7RXJyb3J9IGFuIEVycm9yIGlmIHRoZSBpbmRleCBpcyBvdXQgb2YgYm91bmRzLlxuICAgICAqL1xuICAgIGNoZWNrSW5kZXg6IGZ1bmN0aW9uKG5ld0luZGV4KSB7XG4gICAgICAgIGlmICh0aGlzLmxlbmd0aCA8IHRoaXMuemVybyArIG5ld0luZGV4IHx8IG5ld0luZGV4IDwgMCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiRW5kIG9mIGRhdGEgcmVhY2hlZCAoZGF0YSBsZW5ndGggPSBcIiArIHRoaXMubGVuZ3RoICsgXCIsIGFza2VkIGluZGV4ID0gXCIgKyAobmV3SW5kZXgpICsgXCIpLiBDb3JydXB0ZWQgemlwID9cIik7XG4gICAgICAgIH1cbiAgICB9LFxuICAgIC8qKlxuICAgICAqIENoYW5nZSB0aGUgaW5kZXguXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IG5ld0luZGV4IFRoZSBuZXcgaW5kZXguXG4gICAgICogQHRocm93cyB7RXJyb3J9IGlmIHRoZSBuZXcgaW5kZXggaXMgb3V0IG9mIHRoZSBkYXRhLlxuICAgICAqL1xuICAgIHNldEluZGV4OiBmdW5jdGlvbihuZXdJbmRleCkge1xuICAgICAgICB0aGlzLmNoZWNrSW5kZXgobmV3SW5kZXgpO1xuICAgICAgICB0aGlzLmluZGV4ID0gbmV3SW5kZXg7XG4gICAgfSxcbiAgICAvKipcbiAgICAgKiBTa2lwIHRoZSBuZXh0IG4gYnl0ZXMuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IG4gdGhlIG51bWJlciBvZiBieXRlcyB0byBza2lwLlxuICAgICAqIEB0aHJvd3Mge0Vycm9yfSBpZiB0aGUgbmV3IGluZGV4IGlzIG91dCBvZiB0aGUgZGF0YS5cbiAgICAgKi9cbiAgICBza2lwOiBmdW5jdGlvbihuKSB7XG4gICAgICAgIHRoaXMuc2V0SW5kZXgodGhpcy5pbmRleCArIG4pO1xuICAgIH0sXG4gICAgLyoqXG4gICAgICogR2V0IHRoZSBieXRlIGF0IHRoZSBzcGVjaWZpZWQgaW5kZXguXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGkgdGhlIGluZGV4IHRvIHVzZS5cbiAgICAgKiBAcmV0dXJuIHtudW1iZXJ9IGEgYnl0ZS5cbiAgICAgKi9cbiAgICBieXRlQXQ6IGZ1bmN0aW9uKGkpIHtcbiAgICAgICAgLy8gc2VlIGltcGxlbWVudGF0aW9uc1xuICAgIH0sXG4gICAgLyoqXG4gICAgICogR2V0IHRoZSBuZXh0IG51bWJlciB3aXRoIGEgZ2l2ZW4gYnl0ZSBzaXplLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBzaXplIHRoZSBudW1iZXIgb2YgYnl0ZXMgdG8gcmVhZC5cbiAgICAgKiBAcmV0dXJuIHtudW1iZXJ9IHRoZSBjb3JyZXNwb25kaW5nIG51bWJlci5cbiAgICAgKi9cbiAgICByZWFkSW50OiBmdW5jdGlvbihzaXplKSB7XG4gICAgICAgIHZhciByZXN1bHQgPSAwLFxuICAgICAgICAgICAgaTtcbiAgICAgICAgdGhpcy5jaGVja09mZnNldChzaXplKTtcbiAgICAgICAgZm9yIChpID0gdGhpcy5pbmRleCArIHNpemUgLSAxOyBpID49IHRoaXMuaW5kZXg7IGktLSkge1xuICAgICAgICAgICAgcmVzdWx0ID0gKHJlc3VsdCA8PCA4KSArIHRoaXMuYnl0ZUF0KGkpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuaW5kZXggKz0gc2l6ZTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9LFxuICAgIC8qKlxuICAgICAqIEdldCB0aGUgbmV4dCBzdHJpbmcgd2l0aCBhIGdpdmVuIGJ5dGUgc2l6ZS5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gc2l6ZSB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRvIHJlYWQuXG4gICAgICogQHJldHVybiB7c3RyaW5nfSB0aGUgY29ycmVzcG9uZGluZyBzdHJpbmcuXG4gICAgICovXG4gICAgcmVhZFN0cmluZzogZnVuY3Rpb24oc2l6ZSkge1xuICAgICAgICByZXR1cm4gdXRpbHMudHJhbnNmb3JtVG8oXCJzdHJpbmdcIiwgdGhpcy5yZWFkRGF0YShzaXplKSk7XG4gICAgfSxcbiAgICAvKipcbiAgICAgKiBHZXQgcmF3IGRhdGEgd2l0aG91dCBjb252ZXJzaW9uLCA8c2l6ZT4gYnl0ZXMuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHNpemUgdGhlIG51bWJlciBvZiBieXRlcyB0byByZWFkLlxuICAgICAqIEByZXR1cm4ge09iamVjdH0gdGhlIHJhdyBkYXRhLCBpbXBsZW1lbnRhdGlvbiBzcGVjaWZpYy5cbiAgICAgKi9cbiAgICByZWFkRGF0YTogZnVuY3Rpb24oc2l6ZSkge1xuICAgICAgICAvLyBzZWUgaW1wbGVtZW50YXRpb25zXG4gICAgfSxcbiAgICAvKipcbiAgICAgKiBGaW5kIHRoZSBsYXN0IG9jY3VyZW5jZSBvZiBhIHppcCBzaWduYXR1cmUgKDQgYnl0ZXMpLlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBzaWcgdGhlIHNpZ25hdHVyZSB0byBmaW5kLlxuICAgICAqIEByZXR1cm4ge251bWJlcn0gdGhlIGluZGV4IG9mIHRoZSBsYXN0IG9jY3VyZW5jZSwgLTEgaWYgbm90IGZvdW5kLlxuICAgICAqL1xuICAgIGxhc3RJbmRleE9mU2lnbmF0dXJlOiBmdW5jdGlvbihzaWcpIHtcbiAgICAgICAgLy8gc2VlIGltcGxlbWVudGF0aW9uc1xuICAgIH0sXG4gICAgLyoqXG4gICAgICogUmVhZCB0aGUgc2lnbmF0dXJlICg0IGJ5dGVzKSBhdCB0aGUgY3VycmVudCBwb3NpdGlvbiBhbmQgY29tcGFyZSBpdCB3aXRoIHNpZy5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gc2lnIHRoZSBleHBlY3RlZCBzaWduYXR1cmVcbiAgICAgKiBAcmV0dXJuIHtib29sZWFufSB0cnVlIGlmIHRoZSBzaWduYXR1cmUgbWF0Y2hlcywgZmFsc2Ugb3RoZXJ3aXNlLlxuICAgICAqL1xuICAgIHJlYWRBbmRDaGVja1NpZ25hdHVyZTogZnVuY3Rpb24oc2lnKSB7XG4gICAgICAgIC8vIHNlZSBpbXBsZW1lbnRhdGlvbnNcbiAgICB9LFxuICAgIC8qKlxuICAgICAqIEdldCB0aGUgbmV4dCBkYXRlLlxuICAgICAqIEByZXR1cm4ge0RhdGV9IHRoZSBkYXRlLlxuICAgICAqL1xuICAgIHJlYWREYXRlOiBmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIGRvc3RpbWUgPSB0aGlzLnJlYWRJbnQoNCk7XG4gICAgICAgIHJldHVybiBuZXcgRGF0ZShEYXRlLlVUQyhcbiAgICAgICAgKChkb3N0aW1lID4+IDI1KSAmIDB4N2YpICsgMTk4MCwgLy8geWVhclxuICAgICAgICAoKGRvc3RpbWUgPj4gMjEpICYgMHgwZikgLSAxLCAvLyBtb250aFxuICAgICAgICAoZG9zdGltZSA+PiAxNikgJiAweDFmLCAvLyBkYXlcbiAgICAgICAgKGRvc3RpbWUgPj4gMTEpICYgMHgxZiwgLy8gaG91clxuICAgICAgICAoZG9zdGltZSA+PiA1KSAmIDB4M2YsIC8vIG1pbnV0ZVxuICAgICAgICAoZG9zdGltZSAmIDB4MWYpIDw8IDEpKTsgLy8gc2Vjb25kXG4gICAgfVxufTtcbm1vZHVsZS5leHBvcnRzID0gRGF0YVJlYWRlcjtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBVaW50OEFycmF5UmVhZGVyID0gcmVxdWlyZSgnLi9VaW50OEFycmF5UmVhZGVyJyk7XG52YXIgdXRpbHMgPSByZXF1aXJlKCcuLi91dGlscycpO1xuXG5mdW5jdGlvbiBOb2RlQnVmZmVyUmVhZGVyKGRhdGEpIHtcbiAgICBVaW50OEFycmF5UmVhZGVyLmNhbGwodGhpcywgZGF0YSk7XG59XG51dGlscy5pbmhlcml0cyhOb2RlQnVmZmVyUmVhZGVyLCBVaW50OEFycmF5UmVhZGVyKTtcblxuLyoqXG4gKiBAc2VlIERhdGFSZWFkZXIucmVhZERhdGFcbiAqL1xuTm9kZUJ1ZmZlclJlYWRlci5wcm90b3R5cGUucmVhZERhdGEgPSBmdW5jdGlvbihzaXplKSB7XG4gICAgdGhpcy5jaGVja09mZnNldChzaXplKTtcbiAgICB2YXIgcmVzdWx0ID0gdGhpcy5kYXRhLnNsaWNlKHRoaXMuemVybyArIHRoaXMuaW5kZXgsIHRoaXMuemVybyArIHRoaXMuaW5kZXggKyBzaXplKTtcbiAgICB0aGlzLmluZGV4ICs9IHNpemU7XG4gICAgcmV0dXJuIHJlc3VsdDtcbn07XG5tb2R1bGUuZXhwb3J0cyA9IE5vZGVCdWZmZXJSZWFkZXI7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgRGF0YVJlYWRlciA9IHJlcXVpcmUoJy4vRGF0YVJlYWRlcicpO1xudmFyIHV0aWxzID0gcmVxdWlyZSgnLi4vdXRpbHMnKTtcblxuZnVuY3Rpb24gU3RyaW5nUmVhZGVyKGRhdGEpIHtcbiAgICBEYXRhUmVhZGVyLmNhbGwodGhpcywgZGF0YSk7XG59XG51dGlscy5pbmhlcml0cyhTdHJpbmdSZWFkZXIsIERhdGFSZWFkZXIpO1xuLyoqXG4gKiBAc2VlIERhdGFSZWFkZXIuYnl0ZUF0XG4gKi9cblN0cmluZ1JlYWRlci5wcm90b3R5cGUuYnl0ZUF0ID0gZnVuY3Rpb24oaSkge1xuICAgIHJldHVybiB0aGlzLmRhdGEuY2hhckNvZGVBdCh0aGlzLnplcm8gKyBpKTtcbn07XG4vKipcbiAqIEBzZWUgRGF0YVJlYWRlci5sYXN0SW5kZXhPZlNpZ25hdHVyZVxuICovXG5TdHJpbmdSZWFkZXIucHJvdG90eXBlLmxhc3RJbmRleE9mU2lnbmF0dXJlID0gZnVuY3Rpb24oc2lnKSB7XG4gICAgcmV0dXJuIHRoaXMuZGF0YS5sYXN0SW5kZXhPZihzaWcpIC0gdGhpcy56ZXJvO1xufTtcbi8qKlxuICogQHNlZSBEYXRhUmVhZGVyLnJlYWRBbmRDaGVja1NpZ25hdHVyZVxuICovXG5TdHJpbmdSZWFkZXIucHJvdG90eXBlLnJlYWRBbmRDaGVja1NpZ25hdHVyZSA9IGZ1bmN0aW9uIChzaWcpIHtcbiAgICB2YXIgZGF0YSA9IHRoaXMucmVhZERhdGEoNCk7XG4gICAgcmV0dXJuIHNpZyA9PT0gZGF0YTtcbn07XG4vKipcbiAqIEBzZWUgRGF0YVJlYWRlci5yZWFkRGF0YVxuICovXG5TdHJpbmdSZWFkZXIucHJvdG90eXBlLnJlYWREYXRhID0gZnVuY3Rpb24oc2l6ZSkge1xuICAgIHRoaXMuY2hlY2tPZmZzZXQoc2l6ZSk7XG4gICAgLy8gdGhpcyB3aWxsIHdvcmsgYmVjYXVzZSB0aGUgY29uc3RydWN0b3IgYXBwbGllZCB0aGUgXCImIDB4ZmZcIiBtYXNrLlxuICAgIHZhciByZXN1bHQgPSB0aGlzLmRhdGEuc2xpY2UodGhpcy56ZXJvICsgdGhpcy5pbmRleCwgdGhpcy56ZXJvICsgdGhpcy5pbmRleCArIHNpemUpO1xuICAgIHRoaXMuaW5kZXggKz0gc2l6ZTtcbiAgICByZXR1cm4gcmVzdWx0O1xufTtcbm1vZHVsZS5leHBvcnRzID0gU3RyaW5nUmVhZGVyO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIEFycmF5UmVhZGVyID0gcmVxdWlyZSgnLi9BcnJheVJlYWRlcicpO1xudmFyIHV0aWxzID0gcmVxdWlyZSgnLi4vdXRpbHMnKTtcblxuZnVuY3Rpb24gVWludDhBcnJheVJlYWRlcihkYXRhKSB7XG4gICAgQXJyYXlSZWFkZXIuY2FsbCh0aGlzLCBkYXRhKTtcbn1cbnV0aWxzLmluaGVyaXRzKFVpbnQ4QXJyYXlSZWFkZXIsIEFycmF5UmVhZGVyKTtcbi8qKlxuICogQHNlZSBEYXRhUmVhZGVyLnJlYWREYXRhXG4gKi9cblVpbnQ4QXJyYXlSZWFkZXIucHJvdG90eXBlLnJlYWREYXRhID0gZnVuY3Rpb24oc2l6ZSkge1xuICAgIHRoaXMuY2hlY2tPZmZzZXQoc2l6ZSk7XG4gICAgaWYoc2l6ZSA9PT0gMCkge1xuICAgICAgICAvLyBpbiBJRTEwLCB3aGVuIHVzaW5nIHN1YmFycmF5KGlkeCwgaWR4KSwgd2UgZ2V0IHRoZSBhcnJheSBbMHgwMF0gaW5zdGVhZCBvZiBbXS5cbiAgICAgICAgcmV0dXJuIG5ldyBVaW50OEFycmF5KDApO1xuICAgIH1cbiAgICB2YXIgcmVzdWx0ID0gdGhpcy5kYXRhLnN1YmFycmF5KHRoaXMuemVybyArIHRoaXMuaW5kZXgsIHRoaXMuemVybyArIHRoaXMuaW5kZXggKyBzaXplKTtcbiAgICB0aGlzLmluZGV4ICs9IHNpemU7XG4gICAgcmV0dXJuIHJlc3VsdDtcbn07XG5tb2R1bGUuZXhwb3J0cyA9IFVpbnQ4QXJyYXlSZWFkZXI7XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciB1dGlscyA9IHJlcXVpcmUoJy4uL3V0aWxzJyk7XG52YXIgc3VwcG9ydCA9IHJlcXVpcmUoJy4uL3N1cHBvcnQnKTtcbnZhciBBcnJheVJlYWRlciA9IHJlcXVpcmUoJy4vQXJyYXlSZWFkZXInKTtcbnZhciBTdHJpbmdSZWFkZXIgPSByZXF1aXJlKCcuL1N0cmluZ1JlYWRlcicpO1xudmFyIE5vZGVCdWZmZXJSZWFkZXIgPSByZXF1aXJlKCcuL05vZGVCdWZmZXJSZWFkZXInKTtcbnZhciBVaW50OEFycmF5UmVhZGVyID0gcmVxdWlyZSgnLi9VaW50OEFycmF5UmVhZGVyJyk7XG5cbi8qKlxuICogQ3JlYXRlIGEgcmVhZGVyIGFkYXB0ZWQgdG8gdGhlIGRhdGEuXG4gKiBAcGFyYW0ge1N0cmluZ3xBcnJheUJ1ZmZlcnxVaW50OEFycmF5fEJ1ZmZlcn0gZGF0YSB0aGUgZGF0YSB0byByZWFkLlxuICogQHJldHVybiB7RGF0YVJlYWRlcn0gdGhlIGRhdGEgcmVhZGVyLlxuICovXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChkYXRhKSB7XG4gICAgdmFyIHR5cGUgPSB1dGlscy5nZXRUeXBlT2YoZGF0YSk7XG4gICAgdXRpbHMuY2hlY2tTdXBwb3J0KHR5cGUpO1xuICAgIGlmICh0eXBlID09PSBcInN0cmluZ1wiICYmICFzdXBwb3J0LnVpbnQ4YXJyYXkpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmdSZWFkZXIoZGF0YSk7XG4gICAgfVxuICAgIGlmICh0eXBlID09PSBcIm5vZGVidWZmZXJcIikge1xuICAgICAgICByZXR1cm4gbmV3IE5vZGVCdWZmZXJSZWFkZXIoZGF0YSk7XG4gICAgfVxuICAgIGlmIChzdXBwb3J0LnVpbnQ4YXJyYXkpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBVaW50OEFycmF5UmVhZGVyKHV0aWxzLnRyYW5zZm9ybVRvKFwidWludDhhcnJheVwiLCBkYXRhKSk7XG4gICAgfVxuICAgIHJldHVybiBuZXcgQXJyYXlSZWFkZXIodXRpbHMudHJhbnNmb3JtVG8oXCJhcnJheVwiLCBkYXRhKSk7XG59O1xuXG4vLyB2aW06IHNldCBzaGlmdHdpZHRoPTQgc29mdHRhYnN0b3A9NDpcbiIsIid1c2Ugc3RyaWN0JztcbmV4cG9ydHMuTE9DQUxfRklMRV9IRUFERVIgPSBcIlBLXFx4MDNcXHgwNFwiO1xuZXhwb3J0cy5DRU5UUkFMX0ZJTEVfSEVBREVSID0gXCJQS1xceDAxXFx4MDJcIjtcbmV4cG9ydHMuQ0VOVFJBTF9ESVJFQ1RPUllfRU5EID0gXCJQS1xceDA1XFx4MDZcIjtcbmV4cG9ydHMuWklQNjRfQ0VOVFJBTF9ESVJFQ1RPUllfTE9DQVRPUiA9IFwiUEtcXHgwNlxceDA3XCI7XG5leHBvcnRzLlpJUDY0X0NFTlRSQUxfRElSRUNUT1JZX0VORCA9IFwiUEtcXHgwNlxceDA2XCI7XG5leHBvcnRzLkRBVEFfREVTQ1JJUFRPUiA9IFwiUEtcXHgwN1xceDA4XCI7XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBHZW5lcmljV29ya2VyID0gcmVxdWlyZSgnLi9HZW5lcmljV29ya2VyJyk7XG52YXIgdXRpbHMgPSByZXF1aXJlKCcuLi91dGlscycpO1xuXG4vKipcbiAqIEEgd29ya2VyIHdoaWNoIGNvbnZlcnQgY2h1bmtzIHRvIGEgc3BlY2lmaWVkIHR5cGUuXG4gKiBAY29uc3RydWN0b3JcbiAqIEBwYXJhbSB7U3RyaW5nfSBkZXN0VHlwZSB0aGUgZGVzdGluYXRpb24gdHlwZS5cbiAqL1xuZnVuY3Rpb24gQ29udmVydFdvcmtlcihkZXN0VHlwZSkge1xuICAgIEdlbmVyaWNXb3JrZXIuY2FsbCh0aGlzLCBcIkNvbnZlcnRXb3JrZXIgdG8gXCIgKyBkZXN0VHlwZSk7XG4gICAgdGhpcy5kZXN0VHlwZSA9IGRlc3RUeXBlO1xufVxudXRpbHMuaW5oZXJpdHMoQ29udmVydFdvcmtlciwgR2VuZXJpY1dvcmtlcik7XG5cbi8qKlxuICogQHNlZSBHZW5lcmljV29ya2VyLnByb2Nlc3NDaHVua1xuICovXG5Db252ZXJ0V29ya2VyLnByb3RvdHlwZS5wcm9jZXNzQ2h1bmsgPSBmdW5jdGlvbiAoY2h1bmspIHtcbiAgICB0aGlzLnB1c2goe1xuICAgICAgICBkYXRhIDogdXRpbHMudHJhbnNmb3JtVG8odGhpcy5kZXN0VHlwZSwgY2h1bmsuZGF0YSksXG4gICAgICAgIG1ldGEgOiBjaHVuay5tZXRhXG4gICAgfSk7XG59O1xubW9kdWxlLmV4cG9ydHMgPSBDb252ZXJ0V29ya2VyO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgR2VuZXJpY1dvcmtlciA9IHJlcXVpcmUoJy4vR2VuZXJpY1dvcmtlcicpO1xudmFyIGNyYzMyID0gcmVxdWlyZSgnLi4vY3JjMzInKTtcbnZhciB1dGlscyA9IHJlcXVpcmUoJy4uL3V0aWxzJyk7XG5cbi8qKlxuICogQSB3b3JrZXIgd2hpY2ggY2FsY3VsYXRlIHRoZSBjcmMzMiBvZiB0aGUgZGF0YSBmbG93aW5nIHRocm91Z2guXG4gKiBAY29uc3RydWN0b3JcbiAqL1xuZnVuY3Rpb24gQ3JjMzJQcm9iZSgpIHtcbiAgICBHZW5lcmljV29ya2VyLmNhbGwodGhpcywgXCJDcmMzMlByb2JlXCIpO1xufVxudXRpbHMuaW5oZXJpdHMoQ3JjMzJQcm9iZSwgR2VuZXJpY1dvcmtlcik7XG5cbi8qKlxuICogQHNlZSBHZW5lcmljV29ya2VyLnByb2Nlc3NDaHVua1xuICovXG5DcmMzMlByb2JlLnByb3RvdHlwZS5wcm9jZXNzQ2h1bmsgPSBmdW5jdGlvbiAoY2h1bmspIHtcbiAgICB0aGlzLnN0cmVhbUluZm8uY3JjMzIgPSBjcmMzMihjaHVuay5kYXRhLCB0aGlzLnN0cmVhbUluZm8uY3JjMzIgfHwgMCk7XG4gICAgdGhpcy5wdXNoKGNodW5rKTtcbn07XG5tb2R1bGUuZXhwb3J0cyA9IENyYzMyUHJvYmU7XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciB1dGlscyA9IHJlcXVpcmUoJy4uL3V0aWxzJyk7XG52YXIgR2VuZXJpY1dvcmtlciA9IHJlcXVpcmUoJy4vR2VuZXJpY1dvcmtlcicpO1xuXG4vKipcbiAqIEEgd29ya2VyIHdoaWNoIGNhbGN1bGF0ZSB0aGUgdG90YWwgbGVuZ3RoIG9mIHRoZSBkYXRhIGZsb3dpbmcgdGhyb3VnaC5cbiAqIEBjb25zdHJ1Y3RvclxuICogQHBhcmFtIHtTdHJpbmd9IHByb3BOYW1lIHRoZSBuYW1lIHVzZWQgdG8gZXhwb3NlIHRoZSBsZW5ndGhcbiAqL1xuZnVuY3Rpb24gRGF0YUxlbmd0aFByb2JlKHByb3BOYW1lKSB7XG4gICAgR2VuZXJpY1dvcmtlci5jYWxsKHRoaXMsIFwiRGF0YUxlbmd0aFByb2JlIGZvciBcIiArIHByb3BOYW1lKTtcbiAgICB0aGlzLnByb3BOYW1lID0gcHJvcE5hbWU7XG4gICAgdGhpcy53aXRoU3RyZWFtSW5mbyhwcm9wTmFtZSwgMCk7XG59XG51dGlscy5pbmhlcml0cyhEYXRhTGVuZ3RoUHJvYmUsIEdlbmVyaWNXb3JrZXIpO1xuXG4vKipcbiAqIEBzZWUgR2VuZXJpY1dvcmtlci5wcm9jZXNzQ2h1bmtcbiAqL1xuRGF0YUxlbmd0aFByb2JlLnByb3RvdHlwZS5wcm9jZXNzQ2h1bmsgPSBmdW5jdGlvbiAoY2h1bmspIHtcbiAgICBpZihjaHVuaykge1xuICAgICAgICB2YXIgbGVuZ3RoID0gdGhpcy5zdHJlYW1JbmZvW3RoaXMucHJvcE5hbWVdIHx8IDA7XG4gICAgICAgIHRoaXMuc3RyZWFtSW5mb1t0aGlzLnByb3BOYW1lXSA9IGxlbmd0aCArIGNodW5rLmRhdGEubGVuZ3RoO1xuICAgIH1cbiAgICBHZW5lcmljV29ya2VyLnByb3RvdHlwZS5wcm9jZXNzQ2h1bmsuY2FsbCh0aGlzLCBjaHVuayk7XG59O1xubW9kdWxlLmV4cG9ydHMgPSBEYXRhTGVuZ3RoUHJvYmU7XG5cbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIHV0aWxzID0gcmVxdWlyZSgnLi4vdXRpbHMnKTtcbnZhciBHZW5lcmljV29ya2VyID0gcmVxdWlyZSgnLi9HZW5lcmljV29ya2VyJyk7XG5cbi8vIHRoZSBzaXplIG9mIHRoZSBnZW5lcmF0ZWQgY2h1bmtzXG4vLyBUT0RPIGV4cG9zZSB0aGlzIGFzIGEgcHVibGljIHZhcmlhYmxlXG52YXIgREVGQVVMVF9CTE9DS19TSVpFID0gMTYgKiAxMDI0O1xuXG4vKipcbiAqIEEgd29ya2VyIHRoYXQgcmVhZHMgYSBjb250ZW50IGFuZCBlbWl0cyBjaHVua3MuXG4gKiBAY29uc3RydWN0b3JcbiAqIEBwYXJhbSB7UHJvbWlzZX0gZGF0YVAgdGhlIHByb21pc2Ugb2YgdGhlIGRhdGEgdG8gc3BsaXRcbiAqL1xuZnVuY3Rpb24gRGF0YVdvcmtlcihkYXRhUCkge1xuICAgIEdlbmVyaWNXb3JrZXIuY2FsbCh0aGlzLCBcIkRhdGFXb3JrZXJcIik7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIHRoaXMuZGF0YUlzUmVhZHkgPSBmYWxzZTtcbiAgICB0aGlzLmluZGV4ID0gMDtcbiAgICB0aGlzLm1heCA9IDA7XG4gICAgdGhpcy5kYXRhID0gbnVsbDtcbiAgICB0aGlzLnR5cGUgPSBcIlwiO1xuXG4gICAgdGhpcy5fdGlja1NjaGVkdWxlZCA9IGZhbHNlO1xuXG4gICAgZGF0YVAudGhlbihmdW5jdGlvbiAoZGF0YSkge1xuICAgICAgICBzZWxmLmRhdGFJc1JlYWR5ID0gdHJ1ZTtcbiAgICAgICAgc2VsZi5kYXRhID0gZGF0YTtcbiAgICAgICAgc2VsZi5tYXggPSBkYXRhICYmIGRhdGEubGVuZ3RoIHx8IDA7XG4gICAgICAgIHNlbGYudHlwZSA9IHV0aWxzLmdldFR5cGVPZihkYXRhKTtcbiAgICAgICAgaWYoIXNlbGYuaXNQYXVzZWQpIHtcbiAgICAgICAgICAgIHNlbGYuX3RpY2tBbmRSZXBlYXQoKTtcbiAgICAgICAgfVxuICAgIH0sIGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIHNlbGYuZXJyb3IoZSk7XG4gICAgfSk7XG59XG5cbnV0aWxzLmluaGVyaXRzKERhdGFXb3JrZXIsIEdlbmVyaWNXb3JrZXIpO1xuXG4vKipcbiAqIEBzZWUgR2VuZXJpY1dvcmtlci5jbGVhblVwXG4gKi9cbkRhdGFXb3JrZXIucHJvdG90eXBlLmNsZWFuVXAgPSBmdW5jdGlvbiAoKSB7XG4gICAgR2VuZXJpY1dvcmtlci5wcm90b3R5cGUuY2xlYW5VcC5jYWxsKHRoaXMpO1xuICAgIHRoaXMuZGF0YSA9IG51bGw7XG59O1xuXG4vKipcbiAqIEBzZWUgR2VuZXJpY1dvcmtlci5yZXN1bWVcbiAqL1xuRGF0YVdvcmtlci5wcm90b3R5cGUucmVzdW1lID0gZnVuY3Rpb24gKCkge1xuICAgIGlmKCFHZW5lcmljV29ya2VyLnByb3RvdHlwZS5yZXN1bWUuY2FsbCh0aGlzKSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLl90aWNrU2NoZWR1bGVkICYmIHRoaXMuZGF0YUlzUmVhZHkpIHtcbiAgICAgICAgdGhpcy5fdGlja1NjaGVkdWxlZCA9IHRydWU7XG4gICAgICAgIHV0aWxzLmRlbGF5KHRoaXMuX3RpY2tBbmRSZXBlYXQsIFtdLCB0aGlzKTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG59O1xuXG4vKipcbiAqIFRyaWdnZXIgYSB0aWNrIGEgc2NoZWR1bGUgYW4gb3RoZXIgY2FsbCB0byB0aGlzIGZ1bmN0aW9uLlxuICovXG5EYXRhV29ya2VyLnByb3RvdHlwZS5fdGlja0FuZFJlcGVhdCA9IGZ1bmN0aW9uKCkge1xuICAgIHRoaXMuX3RpY2tTY2hlZHVsZWQgPSBmYWxzZTtcbiAgICBpZih0aGlzLmlzUGF1c2VkIHx8IHRoaXMuaXNGaW5pc2hlZCkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuX3RpY2soKTtcbiAgICBpZighdGhpcy5pc0ZpbmlzaGVkKSB7XG4gICAgICAgIHV0aWxzLmRlbGF5KHRoaXMuX3RpY2tBbmRSZXBlYXQsIFtdLCB0aGlzKTtcbiAgICAgICAgdGhpcy5fdGlja1NjaGVkdWxlZCA9IHRydWU7XG4gICAgfVxufTtcblxuLyoqXG4gKiBSZWFkIGFuZCBwdXNoIGEgY2h1bmsuXG4gKi9cbkRhdGFXb3JrZXIucHJvdG90eXBlLl90aWNrID0gZnVuY3Rpb24oKSB7XG5cbiAgICBpZih0aGlzLmlzUGF1c2VkIHx8IHRoaXMuaXNGaW5pc2hlZCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgdmFyIHNpemUgPSBERUZBVUxUX0JMT0NLX1NJWkU7XG4gICAgdmFyIGRhdGEgPSBudWxsLCBuZXh0SW5kZXggPSBNYXRoLm1pbih0aGlzLm1heCwgdGhpcy5pbmRleCArIHNpemUpO1xuICAgIGlmICh0aGlzLmluZGV4ID49IHRoaXMubWF4KSB7XG4gICAgICAgIC8vIEVPRlxuICAgICAgICByZXR1cm4gdGhpcy5lbmQoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBzd2l0Y2godGhpcy50eXBlKSB7XG4gICAgICAgICAgICBjYXNlIFwic3RyaW5nXCI6XG4gICAgICAgICAgICAgICAgZGF0YSA9IHRoaXMuZGF0YS5zdWJzdHJpbmcodGhpcy5pbmRleCwgbmV4dEluZGV4KTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBcInVpbnQ4YXJyYXlcIjpcbiAgICAgICAgICAgICAgICBkYXRhID0gdGhpcy5kYXRhLnN1YmFycmF5KHRoaXMuaW5kZXgsIG5leHRJbmRleCk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgXCJhcnJheVwiOlxuICAgICAgICAgICAgY2FzZSBcIm5vZGVidWZmZXJcIjpcbiAgICAgICAgICAgICAgICBkYXRhID0gdGhpcy5kYXRhLnNsaWNlKHRoaXMuaW5kZXgsIG5leHRJbmRleCk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmluZGV4ID0gbmV4dEluZGV4O1xuICAgICAgICByZXR1cm4gdGhpcy5wdXNoKHtcbiAgICAgICAgICAgIGRhdGEgOiBkYXRhLFxuICAgICAgICAgICAgbWV0YSA6IHtcbiAgICAgICAgICAgICAgICBwZXJjZW50IDogdGhpcy5tYXggPyB0aGlzLmluZGV4IC8gdGhpcy5tYXggKiAxMDAgOiAwXG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cbn07XG5cbm1vZHVsZS5leHBvcnRzID0gRGF0YVdvcmtlcjtcbiIsIid1c2Ugc3RyaWN0JztcblxuLyoqXG4gKiBBIHdvcmtlciB0aGF0IGRvZXMgbm90aGluZyBidXQgcGFzc2luZyBjaHVua3MgdG8gdGhlIG5leHQgb25lLiBUaGlzIGlzIGxpa2VcbiAqIGEgbm9kZWpzIHN0cmVhbSBidXQgd2l0aCBzb21lIGRpZmZlcmVuY2VzLiBPbiB0aGUgZ29vZCBzaWRlIDpcbiAqIC0gaXQgd29ya3Mgb24gSUUgNi05IHdpdGhvdXQgYW55IGlzc3VlIC8gcG9seWZpbGxcbiAqIC0gaXQgd2VpZ2h0cyBsZXNzIHRoYW4gdGhlIGZ1bGwgZGVwZW5kZW5jaWVzIGJ1bmRsZWQgd2l0aCBicm93c2VyaWZ5XG4gKiAtIGl0IGZvcndhcmRzIGVycm9ycyAobm8gbmVlZCB0byBkZWNsYXJlIGFuIGVycm9yIGhhbmRsZXIgRVZFUllXSEVSRSlcbiAqXG4gKiBBIGNodW5rIGlzIGFuIG9iamVjdCB3aXRoIDIgYXR0cmlidXRlcyA6IGBtZXRhYCBhbmQgYGRhdGFgLiBUaGUgZm9ybWVyIGlzIGFuXG4gKiBvYmplY3QgY29udGFpbmluZyBhbnl0aGluZyAoYHBlcmNlbnRgIGZvciBleGFtcGxlKSwgc2VlIGVhY2ggd29ya2VyIGZvciBtb3JlXG4gKiBkZXRhaWxzLiBUaGUgbGF0dGVyIGlzIHRoZSByZWFsIGRhdGEgKFN0cmluZywgVWludDhBcnJheSwgZXRjKS5cbiAqXG4gKiBAY29uc3RydWN0b3JcbiAqIEBwYXJhbSB7U3RyaW5nfSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBzdHJlYW0gKG1haW5seSB1c2VkIGZvciBkZWJ1Z2dpbmcgcHVycG9zZXMpXG4gKi9cbmZ1bmN0aW9uIEdlbmVyaWNXb3JrZXIobmFtZSkge1xuICAgIC8vIHRoZSBuYW1lIG9mIHRoZSB3b3JrZXJcbiAgICB0aGlzLm5hbWUgPSBuYW1lIHx8IFwiZGVmYXVsdFwiO1xuICAgIC8vIGFuIG9iamVjdCBjb250YWluaW5nIG1ldGFkYXRhIGFib3V0IHRoZSB3b3JrZXJzIGNoYWluXG4gICAgdGhpcy5zdHJlYW1JbmZvID0ge307XG4gICAgLy8gYW4gZXJyb3Igd2hpY2ggaGFwcGVuZWQgd2hlbiB0aGUgd29ya2VyIHdhcyBwYXVzZWRcbiAgICB0aGlzLmdlbmVyYXRlZEVycm9yID0gbnVsbDtcbiAgICAvLyBhbiBvYmplY3QgY29udGFpbmluZyBtZXRhZGF0YSB0byBiZSBtZXJnZWQgYnkgdGhpcyB3b3JrZXIgaW50byB0aGUgZ2VuZXJhbCBtZXRhZGF0YVxuICAgIHRoaXMuZXh0cmFTdHJlYW1JbmZvID0ge307XG4gICAgLy8gdHJ1ZSBpZiB0aGUgc3RyZWFtIGlzIHBhdXNlZCAoYW5kIHNob3VsZCBub3QgZG8gYW55dGhpbmcpLCBmYWxzZSBvdGhlcndpc2VcbiAgICB0aGlzLmlzUGF1c2VkID0gdHJ1ZTtcbiAgICAvLyB0cnVlIGlmIHRoZSBzdHJlYW0gaXMgZmluaXNoZWQgKGFuZCBzaG91bGQgbm90IGRvIGFueXRoaW5nKSwgZmFsc2Ugb3RoZXJ3aXNlXG4gICAgdGhpcy5pc0ZpbmlzaGVkID0gZmFsc2U7XG4gICAgLy8gdHJ1ZSBpZiB0aGUgc3RyZWFtIGlzIGxvY2tlZCB0byBwcmV2ZW50IGZ1cnRoZXIgc3RydWN0dXJlIHVwZGF0ZXMgKHBpcGUpLCBmYWxzZSBvdGhlcndpc2VcbiAgICB0aGlzLmlzTG9ja2VkID0gZmFsc2U7XG4gICAgLy8gdGhlIGV2ZW50IGxpc3RlbmVyc1xuICAgIHRoaXMuX2xpc3RlbmVycyA9IHtcbiAgICAgICAgJ2RhdGEnOltdLFxuICAgICAgICAnZW5kJzpbXSxcbiAgICAgICAgJ2Vycm9yJzpbXVxuICAgIH07XG4gICAgLy8gdGhlIHByZXZpb3VzIHdvcmtlciwgaWYgYW55XG4gICAgdGhpcy5wcmV2aW91cyA9IG51bGw7XG59XG5cbkdlbmVyaWNXb3JrZXIucHJvdG90eXBlID0ge1xuICAgIC8qKlxuICAgICAqIFB1c2ggYSBjaHVuayB0byB0aGUgbmV4dCB3b3JrZXJzLlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBjaHVuayB0aGUgY2h1bmsgdG8gcHVzaFxuICAgICAqL1xuICAgIHB1c2ggOiBmdW5jdGlvbiAoY2h1bmspIHtcbiAgICAgICAgdGhpcy5lbWl0KFwiZGF0YVwiLCBjaHVuayk7XG4gICAgfSxcbiAgICAvKipcbiAgICAgKiBFbmQgdGhlIHN0cmVhbS5cbiAgICAgKiBAcmV0dXJuIHtCb29sZWFufSB0cnVlIGlmIHRoaXMgY2FsbCBlbmRlZCB0aGUgd29ya2VyLCBmYWxzZSBvdGhlcndpc2UuXG4gICAgICovXG4gICAgZW5kIDogZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAodGhpcy5pc0ZpbmlzaGVkKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmZsdXNoKCk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICB0aGlzLmVtaXQoXCJlbmRcIik7XG4gICAgICAgICAgICB0aGlzLmNsZWFuVXAoKTtcbiAgICAgICAgICAgIHRoaXMuaXNGaW5pc2hlZCA9IHRydWU7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIHRoaXMuZW1pdChcImVycm9yXCIsIGUpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH0sXG4gICAgLyoqXG4gICAgICogRW5kIHRoZSBzdHJlYW0gd2l0aCBhbiBlcnJvci5cbiAgICAgKiBAcGFyYW0ge0Vycm9yfSBlIHRoZSBlcnJvciB3aGljaCBjYXVzZWQgdGhlIHByZW1hdHVyZSBlbmQuXG4gICAgICogQHJldHVybiB7Qm9vbGVhbn0gdHJ1ZSBpZiB0aGlzIGNhbGwgZW5kZWQgdGhlIHdvcmtlciB3aXRoIGFuIGVycm9yLCBmYWxzZSBvdGhlcndpc2UuXG4gICAgICovXG4gICAgZXJyb3IgOiBmdW5jdGlvbiAoZSkge1xuICAgICAgICBpZiAodGhpcy5pc0ZpbmlzaGVkKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICBpZih0aGlzLmlzUGF1c2VkKSB7XG4gICAgICAgICAgICB0aGlzLmdlbmVyYXRlZEVycm9yID0gZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuaXNGaW5pc2hlZCA9IHRydWU7XG5cbiAgICAgICAgICAgIHRoaXMuZW1pdChcImVycm9yXCIsIGUpO1xuXG4gICAgICAgICAgICAvLyBpbiB0aGUgd29ya2VycyBjaGFpbiBleHBsb2RlZCBpbiB0aGUgbWlkZGxlIG9mIHRoZSBjaGFpbixcbiAgICAgICAgICAgIC8vIHRoZSBlcnJvciBldmVudCB3aWxsIGdvIGRvd253YXJkIGJ1dCB3ZSBhbHNvIG5lZWQgdG8gbm90aWZ5XG4gICAgICAgICAgICAvLyB3b3JrZXJzIHVwd2FyZCB0aGF0IHRoZXJlIGhhcyBiZWVuIGFuIGVycm9yLlxuICAgICAgICAgICAgaWYodGhpcy5wcmV2aW91cykge1xuICAgICAgICAgICAgICAgIHRoaXMucHJldmlvdXMuZXJyb3IoZSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMuY2xlYW5VcCgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH0sXG4gICAgLyoqXG4gICAgICogQWRkIGEgY2FsbGJhY2sgb24gYW4gZXZlbnQuXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IG5hbWUgdGhlIG5hbWUgb2YgdGhlIGV2ZW50IChkYXRhLCBlbmQsIGVycm9yKVxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGxpc3RlbmVyIHRoZSBmdW5jdGlvbiB0byBjYWxsIHdoZW4gdGhlIGV2ZW50IGlzIHRyaWdnZXJlZFxuICAgICAqIEByZXR1cm4ge0dlbmVyaWNXb3JrZXJ9IHRoZSBjdXJyZW50IG9iamVjdCBmb3IgY2hhaW5hYmlsaXR5XG4gICAgICovXG4gICAgb24gOiBmdW5jdGlvbiAobmFtZSwgbGlzdGVuZXIpIHtcbiAgICAgICAgdGhpcy5fbGlzdGVuZXJzW25hbWVdLnB1c2gobGlzdGVuZXIpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuICAgIC8qKlxuICAgICAqIENsZWFuIGFueSByZWZlcmVuY2VzIHdoZW4gYSB3b3JrZXIgaXMgZW5kaW5nLlxuICAgICAqL1xuICAgIGNsZWFuVXAgOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuc3RyZWFtSW5mbyA9IHRoaXMuZ2VuZXJhdGVkRXJyb3IgPSB0aGlzLmV4dHJhU3RyZWFtSW5mbyA9IG51bGw7XG4gICAgICAgIHRoaXMuX2xpc3RlbmVycyA9IFtdO1xuICAgIH0sXG4gICAgLyoqXG4gICAgICogVHJpZ2dlciBhbiBldmVudC4gVGhpcyB3aWxsIGNhbGwgcmVnaXN0ZXJlZCBjYWxsYmFjayB3aXRoIHRoZSBwcm92aWRlZCBhcmcuXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IG5hbWUgdGhlIG5hbWUgb2YgdGhlIGV2ZW50IChkYXRhLCBlbmQsIGVycm9yKVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBhcmcgdGhlIGFyZ3VtZW50IHRvIGNhbGwgdGhlIGNhbGxiYWNrIHdpdGguXG4gICAgICovXG4gICAgZW1pdCA6IGZ1bmN0aW9uIChuYW1lLCBhcmcpIHtcbiAgICAgICAgaWYgKHRoaXMuX2xpc3RlbmVyc1tuYW1lXSkge1xuICAgICAgICAgICAgZm9yKHZhciBpID0gMDsgaSA8IHRoaXMuX2xpc3RlbmVyc1tuYW1lXS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIHRoaXMuX2xpc3RlbmVyc1tuYW1lXVtpXS5jYWxsKHRoaXMsIGFyZyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9LFxuICAgIC8qKlxuICAgICAqIENoYWluIGEgd29ya2VyIHdpdGggYW4gb3RoZXIuXG4gICAgICogQHBhcmFtIHtXb3JrZXJ9IG5leHQgdGhlIHdvcmtlciByZWNlaXZpbmcgZXZlbnRzIGZyb20gdGhlIGN1cnJlbnQgb25lLlxuICAgICAqIEByZXR1cm4ge3dvcmtlcn0gdGhlIG5leHQgd29ya2VyIGZvciBjaGFpbmFiaWxpdHlcbiAgICAgKi9cbiAgICBwaXBlIDogZnVuY3Rpb24gKG5leHQpIHtcbiAgICAgICAgcmV0dXJuIG5leHQucmVnaXN0ZXJQcmV2aW91cyh0aGlzKTtcbiAgICB9LFxuICAgIC8qKlxuICAgICAqIFNhbWUgYXMgYHBpcGVgIGluIHRoZSBvdGhlciBkaXJlY3Rpb24uXG4gICAgICogVXNpbmcgYW4gQVBJIHdpdGggYHBpcGUobmV4dClgIGlzIHZlcnkgZWFzeS5cbiAgICAgKiBJbXBsZW1lbnRpbmcgdGhlIEFQSSB3aXRoIHRoZSBwb2ludCBvZiB2aWV3IG9mIHRoZSBuZXh0IG9uZSByZWdpc3RlcmluZ1xuICAgICAqIGEgc291cmNlIGlzIGVhc2llciwgc2VlIHRoZSBaaXBGaWxlV29ya2VyLlxuICAgICAqIEBwYXJhbSB7V29ya2VyfSBwcmV2aW91cyB0aGUgcHJldmlvdXMgd29ya2VyLCBzZW5kaW5nIGV2ZW50cyB0byB0aGlzIG9uZVxuICAgICAqIEByZXR1cm4ge1dvcmtlcn0gdGhlIGN1cnJlbnQgd29ya2VyIGZvciBjaGFpbmFiaWxpdHlcbiAgICAgKi9cbiAgICByZWdpc3RlclByZXZpb3VzIDogZnVuY3Rpb24gKHByZXZpb3VzKSB7XG4gICAgICAgIGlmICh0aGlzLmlzTG9ja2VkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGUgc3RyZWFtICdcIiArIHRoaXMgKyBcIicgaGFzIGFscmVhZHkgYmVlbiB1c2VkLlwiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHNoYXJpbmcgdGhlIHN0cmVhbUluZm8uLi5cbiAgICAgICAgdGhpcy5zdHJlYW1JbmZvID0gcHJldmlvdXMuc3RyZWFtSW5mbztcbiAgICAgICAgLy8gLi4uIGFuZCBhZGRpbmcgb3VyIG93biBiaXRzXG4gICAgICAgIHRoaXMubWVyZ2VTdHJlYW1JbmZvKCk7XG4gICAgICAgIHRoaXMucHJldmlvdXMgPSAgcHJldmlvdXM7XG4gICAgICAgIHZhciBzZWxmID0gdGhpcztcbiAgICAgICAgcHJldmlvdXMub24oJ2RhdGEnLCBmdW5jdGlvbiAoY2h1bmspIHtcbiAgICAgICAgICAgIHNlbGYucHJvY2Vzc0NodW5rKGNodW5rKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHByZXZpb3VzLm9uKCdlbmQnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBzZWxmLmVuZCgpO1xuICAgICAgICB9KTtcbiAgICAgICAgcHJldmlvdXMub24oJ2Vycm9yJywgZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICAgIHNlbGYuZXJyb3IoZSk7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuICAgIC8qKlxuICAgICAqIFBhdXNlIHRoZSBzdHJlYW0gc28gaXQgZG9lc24ndCBzZW5kIGV2ZW50cyBhbnltb3JlLlxuICAgICAqIEByZXR1cm4ge0Jvb2xlYW59IHRydWUgaWYgdGhpcyBjYWxsIHBhdXNlZCB0aGUgd29ya2VyLCBmYWxzZSBvdGhlcndpc2UuXG4gICAgICovXG4gICAgcGF1c2UgOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmKHRoaXMuaXNQYXVzZWQgfHwgdGhpcy5pc0ZpbmlzaGVkKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5pc1BhdXNlZCA9IHRydWU7XG5cbiAgICAgICAgaWYodGhpcy5wcmV2aW91cykge1xuICAgICAgICAgICAgdGhpcy5wcmV2aW91cy5wYXVzZSgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH0sXG4gICAgLyoqXG4gICAgICogUmVzdW1lIGEgcGF1c2VkIHN0cmVhbS5cbiAgICAgKiBAcmV0dXJuIHtCb29sZWFufSB0cnVlIGlmIHRoaXMgY2FsbCByZXN1bWVkIHRoZSB3b3JrZXIsIGZhbHNlIG90aGVyd2lzZS5cbiAgICAgKi9cbiAgICByZXN1bWUgOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmKCF0aGlzLmlzUGF1c2VkIHx8IHRoaXMuaXNGaW5pc2hlZCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuaXNQYXVzZWQgPSBmYWxzZTtcblxuICAgICAgICAvLyBpZiB0cnVlLCB0aGUgd29ya2VyIHRyaWVkIHRvIHJlc3VtZSBidXQgZmFpbGVkXG4gICAgICAgIHZhciB3aXRoRXJyb3IgPSBmYWxzZTtcbiAgICAgICAgaWYodGhpcy5nZW5lcmF0ZWRFcnJvcikge1xuICAgICAgICAgICAgdGhpcy5lcnJvcih0aGlzLmdlbmVyYXRlZEVycm9yKTtcbiAgICAgICAgICAgIHdpdGhFcnJvciA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYodGhpcy5wcmV2aW91cykge1xuICAgICAgICAgICAgdGhpcy5wcmV2aW91cy5yZXN1bWUoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiAhd2l0aEVycm9yO1xuICAgIH0sXG4gICAgLyoqXG4gICAgICogRmx1c2ggYW55IHJlbWFpbmluZyBieXRlcyBhcyB0aGUgc3RyZWFtIGlzIGVuZGluZy5cbiAgICAgKi9cbiAgICBmbHVzaCA6IGZ1bmN0aW9uICgpIHt9LFxuICAgIC8qKlxuICAgICAqIFByb2Nlc3MgYSBjaHVuay4gVGhpcyBpcyB1c3VhbGx5IHRoZSBtZXRob2Qgb3ZlcnJpZGRlbi5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gY2h1bmsgdGhlIGNodW5rIHRvIHByb2Nlc3MuXG4gICAgICovXG4gICAgcHJvY2Vzc0NodW5rIDogZnVuY3Rpb24oY2h1bmspIHtcbiAgICAgICAgdGhpcy5wdXNoKGNodW5rKTtcbiAgICB9LFxuICAgIC8qKlxuICAgICAqIEFkZCBhIGtleS92YWx1ZSB0byBiZSBhZGRlZCBpbiB0aGUgd29ya2VycyBjaGFpbiBzdHJlYW1JbmZvIG9uY2UgYWN0aXZhdGVkLlxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBrZXkgdGhlIGtleSB0byB1c2VcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gdmFsdWUgdGhlIGFzc29jaWF0ZWQgdmFsdWVcbiAgICAgKiBAcmV0dXJuIHtXb3JrZXJ9IHRoZSBjdXJyZW50IHdvcmtlciBmb3IgY2hhaW5hYmlsaXR5XG4gICAgICovXG4gICAgd2l0aFN0cmVhbUluZm8gOiBmdW5jdGlvbiAoa2V5LCB2YWx1ZSkge1xuICAgICAgICB0aGlzLmV4dHJhU3RyZWFtSW5mb1trZXldID0gdmFsdWU7XG4gICAgICAgIHRoaXMubWVyZ2VTdHJlYW1JbmZvKCk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG4gICAgLyoqXG4gICAgICogTWVyZ2UgdGhpcyB3b3JrZXIncyBzdHJlYW1JbmZvIGludG8gdGhlIGNoYWluJ3Mgc3RyZWFtSW5mby5cbiAgICAgKi9cbiAgICBtZXJnZVN0cmVhbUluZm8gOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGZvcih2YXIga2V5IGluIHRoaXMuZXh0cmFTdHJlYW1JbmZvKSB7XG4gICAgICAgICAgICBpZiAoIXRoaXMuZXh0cmFTdHJlYW1JbmZvLmhhc093blByb3BlcnR5KGtleSkpIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuc3RyZWFtSW5mb1trZXldID0gdGhpcy5leHRyYVN0cmVhbUluZm9ba2V5XTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBMb2NrIHRoZSBzdHJlYW0gdG8gcHJldmVudCBmdXJ0aGVyIHVwZGF0ZXMgb24gdGhlIHdvcmtlcnMgY2hhaW4uXG4gICAgICogQWZ0ZXIgY2FsbGluZyB0aGlzIG1ldGhvZCwgYWxsIGNhbGxzIHRvIHBpcGUgd2lsbCBmYWlsLlxuICAgICAqL1xuICAgIGxvY2s6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKHRoaXMuaXNMb2NrZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlRoZSBzdHJlYW0gJ1wiICsgdGhpcyArIFwiJyBoYXMgYWxyZWFkeSBiZWVuIHVzZWQuXCIpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuaXNMb2NrZWQgPSB0cnVlO1xuICAgICAgICBpZiAodGhpcy5wcmV2aW91cykge1xuICAgICAgICAgICAgdGhpcy5wcmV2aW91cy5sb2NrKCk7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICpcbiAgICAgKiBQcmV0dHkgcHJpbnQgdGhlIHdvcmtlcnMgY2hhaW4uXG4gICAgICovXG4gICAgdG9TdHJpbmcgOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBtZSA9IFwiV29ya2VyIFwiICsgdGhpcy5uYW1lO1xuICAgICAgICBpZiAodGhpcy5wcmV2aW91cykge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMucHJldmlvdXMgKyBcIiAtPiBcIiArIG1lO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIG1lO1xuICAgICAgICB9XG4gICAgfVxufTtcblxubW9kdWxlLmV4cG9ydHMgPSBHZW5lcmljV29ya2VyO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgdXRpbHMgPSByZXF1aXJlKCcuLi91dGlscycpO1xudmFyIENvbnZlcnRXb3JrZXIgPSByZXF1aXJlKCcuL0NvbnZlcnRXb3JrZXInKTtcbnZhciBHZW5lcmljV29ya2VyID0gcmVxdWlyZSgnLi9HZW5lcmljV29ya2VyJyk7XG52YXIgYmFzZTY0ID0gcmVxdWlyZSgnLi4vYmFzZTY0Jyk7XG52YXIgTm9kZWpzU3RyZWFtT3V0cHV0QWRhcHRlciA9IHJlcXVpcmUoJy4uL25vZGVqcy9Ob2RlanNTdHJlYW1PdXRwdXRBZGFwdGVyJyk7XG52YXIgZXh0ZXJuYWwgPSByZXF1aXJlKFwiLi4vZXh0ZXJuYWxcIik7XG5cbi8qKlxuICogQXBwbHkgdGhlIGZpbmFsIHRyYW5zZm9ybWF0aW9uIG9mIHRoZSBkYXRhLiBJZiB0aGUgdXNlciB3YW50cyBhIEJsb2IgZm9yXG4gKiBleGFtcGxlLCBpdCdzIGVhc2llciB0byB3b3JrIHdpdGggYW4gVThpbnRBcnJheSBhbmQgZmluYWxseSBkbyB0aGVcbiAqIEFycmF5QnVmZmVyL0Jsb2IgY29udmVyc2lvbi5cbiAqIEBwYXJhbSB7U3RyaW5nfSB0eXBlIHRoZSBuYW1lIG9mIHRoZSBmaW5hbCB0eXBlXG4gKiBAcGFyYW0ge1N0cmluZ3xVaW50OEFycmF5fEJ1ZmZlcn0gY29udGVudCB0aGUgY29udGVudCB0byB0cmFuc2Zvcm1cbiAqIEBwYXJhbSB7U3RyaW5nfSBtaW1lVHlwZSB0aGUgbWltZSB0eXBlIG9mIHRoZSBjb250ZW50LCBpZiBhcHBsaWNhYmxlLlxuICogQHJldHVybiB7U3RyaW5nfFVpbnQ4QXJyYXl8QXJyYXlCdWZmZXJ8QnVmZmVyfEJsb2J9IHRoZSBjb250ZW50IGluIHRoZSByaWdodCBmb3JtYXQuXG4gKi9cbmZ1bmN0aW9uIHRyYW5zZm9ybVppcE91dHB1dCh0eXBlLCBjb250ZW50LCBtaW1lVHlwZSkge1xuICAgIHN3aXRjaCh0eXBlKSB7XG4gICAgICAgIGNhc2UgXCJibG9iXCIgOlxuICAgICAgICAgICAgcmV0dXJuIHV0aWxzLm5ld0Jsb2IodXRpbHMudHJhbnNmb3JtVG8oXCJhcnJheWJ1ZmZlclwiLCBjb250ZW50KSwgbWltZVR5cGUpO1xuICAgICAgICBjYXNlIFwiYmFzZTY0XCIgOlxuICAgICAgICAgICAgcmV0dXJuIGJhc2U2NC5lbmNvZGUoY29udGVudCk7XG4gICAgICAgIGRlZmF1bHQgOlxuICAgICAgICAgICAgcmV0dXJuIHV0aWxzLnRyYW5zZm9ybVRvKHR5cGUsIGNvbnRlbnQpO1xuICAgIH1cbn1cblxuLyoqXG4gKiBDb25jYXRlbmF0ZSBhbiBhcnJheSBvZiBkYXRhIG9mIHRoZSBnaXZlbiB0eXBlLlxuICogQHBhcmFtIHtTdHJpbmd9IHR5cGUgdGhlIHR5cGUgb2YgdGhlIGRhdGEgaW4gdGhlIGdpdmVuIGFycmF5LlxuICogQHBhcmFtIHtBcnJheX0gZGF0YUFycmF5IHRoZSBhcnJheSBjb250YWluaW5nIHRoZSBkYXRhIGNodW5rcyB0byBjb25jYXRlbmF0ZVxuICogQHJldHVybiB7U3RyaW5nfFVpbnQ4QXJyYXl8QnVmZmVyfSB0aGUgY29uY2F0ZW5hdGVkIGRhdGFcbiAqIEB0aHJvd3MgRXJyb3IgaWYgdGhlIGFza2VkIHR5cGUgaXMgdW5zdXBwb3J0ZWRcbiAqL1xuZnVuY3Rpb24gY29uY2F0ICh0eXBlLCBkYXRhQXJyYXkpIHtcbiAgICB2YXIgaSwgaW5kZXggPSAwLCByZXMgPSBudWxsLCB0b3RhbExlbmd0aCA9IDA7XG4gICAgZm9yKGkgPSAwOyBpIDwgZGF0YUFycmF5Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHRvdGFsTGVuZ3RoICs9IGRhdGFBcnJheVtpXS5sZW5ndGg7XG4gICAgfVxuICAgIHN3aXRjaCh0eXBlKSB7XG4gICAgICAgIGNhc2UgXCJzdHJpbmdcIjpcbiAgICAgICAgICAgIHJldHVybiBkYXRhQXJyYXkuam9pbihcIlwiKTtcbiAgICAgICAgICBjYXNlIFwiYXJyYXlcIjpcbiAgICAgICAgICAgIHJldHVybiBBcnJheS5wcm90b3R5cGUuY29uY2F0LmFwcGx5KFtdLCBkYXRhQXJyYXkpO1xuICAgICAgICBjYXNlIFwidWludDhhcnJheVwiOlxuICAgICAgICAgICAgcmVzID0gbmV3IFVpbnQ4QXJyYXkodG90YWxMZW5ndGgpO1xuICAgICAgICAgICAgZm9yKGkgPSAwOyBpIDwgZGF0YUFycmF5Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgcmVzLnNldChkYXRhQXJyYXlbaV0sIGluZGV4KTtcbiAgICAgICAgICAgICAgICBpbmRleCArPSBkYXRhQXJyYXlbaV0ubGVuZ3RoO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHJlcztcbiAgICAgICAgY2FzZSBcIm5vZGVidWZmZXJcIjpcbiAgICAgICAgICAgIHJldHVybiBCdWZmZXIuY29uY2F0KGRhdGFBcnJheSk7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJjb25jYXQgOiB1bnN1cHBvcnRlZCB0eXBlICdcIiAgKyB0eXBlICsgXCInXCIpO1xuICAgIH1cbn1cblxuLyoqXG4gKiBMaXN0ZW4gYSBTdHJlYW1IZWxwZXIsIGFjY3VtdWxhdGUgaXRzIGNvbnRlbnQgYW5kIGNvbmNhdGVuYXRlIGl0IGludG8gYVxuICogY29tcGxldGUgYmxvY2suXG4gKiBAcGFyYW0ge1N0cmVhbUhlbHBlcn0gaGVscGVyIHRoZSBoZWxwZXIgdG8gdXNlLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gdXBkYXRlQ2FsbGJhY2sgYSBjYWxsYmFjayBjYWxsZWQgb24gZWFjaCB1cGRhdGUuIENhbGxlZFxuICogd2l0aCBvbmUgYXJnIDpcbiAqIC0gdGhlIG1ldGFkYXRhIGxpbmtlZCB0byB0aGUgdXBkYXRlIHJlY2VpdmVkLlxuICogQHJldHVybiBQcm9taXNlIHRoZSBwcm9taXNlIGZvciB0aGUgYWNjdW11bGF0aW9uLlxuICovXG5mdW5jdGlvbiBhY2N1bXVsYXRlKGhlbHBlciwgdXBkYXRlQ2FsbGJhY2spIHtcbiAgICByZXR1cm4gbmV3IGV4dGVybmFsLlByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCl7XG4gICAgICAgIHZhciBkYXRhQXJyYXkgPSBbXTtcbiAgICAgICAgdmFyIGNodW5rVHlwZSA9IGhlbHBlci5faW50ZXJuYWxUeXBlLFxuICAgICAgICAgICAgcmVzdWx0VHlwZSA9IGhlbHBlci5fb3V0cHV0VHlwZSxcbiAgICAgICAgICAgIG1pbWVUeXBlID0gaGVscGVyLl9taW1lVHlwZTtcbiAgICAgICAgaGVscGVyXG4gICAgICAgIC5vbignZGF0YScsIGZ1bmN0aW9uIChkYXRhLCBtZXRhKSB7XG4gICAgICAgICAgICBkYXRhQXJyYXkucHVzaChkYXRhKTtcbiAgICAgICAgICAgIGlmKHVwZGF0ZUNhbGxiYWNrKSB7XG4gICAgICAgICAgICAgICAgdXBkYXRlQ2FsbGJhY2sobWV0YSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICAgIC5vbignZXJyb3InLCBmdW5jdGlvbihlcnIpIHtcbiAgICAgICAgICAgIGRhdGFBcnJheSA9IFtdO1xuICAgICAgICAgICAgcmVqZWN0KGVycik7XG4gICAgICAgIH0pXG4gICAgICAgIC5vbignZW5kJywgZnVuY3Rpb24gKCl7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHZhciByZXN1bHQgPSB0cmFuc2Zvcm1aaXBPdXRwdXQocmVzdWx0VHlwZSwgY29uY2F0KGNodW5rVHlwZSwgZGF0YUFycmF5KSwgbWltZVR5cGUpO1xuICAgICAgICAgICAgICAgIHJlc29sdmUocmVzdWx0KTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICByZWplY3QoZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBkYXRhQXJyYXkgPSBbXTtcbiAgICAgICAgfSlcbiAgICAgICAgLnJlc3VtZSgpO1xuICAgIH0pO1xufVxuXG4vKipcbiAqIEFuIGhlbHBlciB0byBlYXNpbHkgdXNlIHdvcmtlcnMgb3V0c2lkZSBvZiBKU1ppcC5cbiAqIEBjb25zdHJ1Y3RvclxuICogQHBhcmFtIHtXb3JrZXJ9IHdvcmtlciB0aGUgd29ya2VyIHRvIHdyYXBcbiAqIEBwYXJhbSB7U3RyaW5nfSBvdXRwdXRUeXBlIHRoZSB0eXBlIG9mIGRhdGEgZXhwZWN0ZWQgYnkgdGhlIHVzZVxuICogQHBhcmFtIHtTdHJpbmd9IG1pbWVUeXBlIHRoZSBtaW1lIHR5cGUgb2YgdGhlIGNvbnRlbnQsIGlmIGFwcGxpY2FibGUuXG4gKi9cbmZ1bmN0aW9uIFN0cmVhbUhlbHBlcih3b3JrZXIsIG91dHB1dFR5cGUsIG1pbWVUeXBlKSB7XG4gICAgdmFyIGludGVybmFsVHlwZSA9IG91dHB1dFR5cGU7XG4gICAgc3dpdGNoKG91dHB1dFR5cGUpIHtcbiAgICAgICAgY2FzZSBcImJsb2JcIjpcbiAgICAgICAgY2FzZSBcImFycmF5YnVmZmVyXCI6XG4gICAgICAgICAgICBpbnRlcm5hbFR5cGUgPSBcInVpbnQ4YXJyYXlcIjtcbiAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgXCJiYXNlNjRcIjpcbiAgICAgICAgICAgIGludGVybmFsVHlwZSA9IFwic3RyaW5nXCI7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICAgIC8vIHRoZSB0eXBlIHVzZWQgaW50ZXJuYWxseVxuICAgICAgICB0aGlzLl9pbnRlcm5hbFR5cGUgPSBpbnRlcm5hbFR5cGU7XG4gICAgICAgIC8vIHRoZSB0eXBlIHVzZWQgdG8gb3V0cHV0IHJlc3VsdHNcbiAgICAgICAgdGhpcy5fb3V0cHV0VHlwZSA9IG91dHB1dFR5cGU7XG4gICAgICAgIC8vIHRoZSBtaW1lIHR5cGVcbiAgICAgICAgdGhpcy5fbWltZVR5cGUgPSBtaW1lVHlwZTtcbiAgICAgICAgdXRpbHMuY2hlY2tTdXBwb3J0KGludGVybmFsVHlwZSk7XG4gICAgICAgIHRoaXMuX3dvcmtlciA9IHdvcmtlci5waXBlKG5ldyBDb252ZXJ0V29ya2VyKGludGVybmFsVHlwZSkpO1xuICAgICAgICAvLyB0aGUgbGFzdCB3b3JrZXJzIGNhbiBiZSByZXdpcmVkIHdpdGhvdXQgaXNzdWVzIGJ1dCB3ZSBuZWVkIHRvXG4gICAgICAgIC8vIHByZXZlbnQgYW55IHVwZGF0ZXMgb24gcHJldmlvdXMgd29ya2Vycy5cbiAgICAgICAgd29ya2VyLmxvY2soKTtcbiAgICB9IGNhdGNoKGUpIHtcbiAgICAgICAgdGhpcy5fd29ya2VyID0gbmV3IEdlbmVyaWNXb3JrZXIoXCJlcnJvclwiKTtcbiAgICAgICAgdGhpcy5fd29ya2VyLmVycm9yKGUpO1xuICAgIH1cbn1cblxuU3RyZWFtSGVscGVyLnByb3RvdHlwZSA9IHtcbiAgICAvKipcbiAgICAgKiBMaXN0ZW4gYSBTdHJlYW1IZWxwZXIsIGFjY3VtdWxhdGUgaXRzIGNvbnRlbnQgYW5kIGNvbmNhdGVuYXRlIGl0IGludG8gYVxuICAgICAqIGNvbXBsZXRlIGJsb2NrLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IHVwZGF0ZUNiIHRoZSB1cGRhdGUgY2FsbGJhY2suXG4gICAgICogQHJldHVybiBQcm9taXNlIHRoZSBwcm9taXNlIGZvciB0aGUgYWNjdW11bGF0aW9uLlxuICAgICAqL1xuICAgIGFjY3VtdWxhdGUgOiBmdW5jdGlvbiAodXBkYXRlQ2IpIHtcbiAgICAgICAgcmV0dXJuIGFjY3VtdWxhdGUodGhpcywgdXBkYXRlQ2IpO1xuICAgIH0sXG4gICAgLyoqXG4gICAgICogQWRkIGEgbGlzdGVuZXIgb24gYW4gZXZlbnQgdHJpZ2dlcmVkIG9uIGEgc3RyZWFtLlxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBldnQgdGhlIG5hbWUgb2YgdGhlIGV2ZW50XG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZm4gdGhlIGxpc3RlbmVyXG4gICAgICogQHJldHVybiB7U3RyZWFtSGVscGVyfSB0aGUgY3VycmVudCBoZWxwZXIuXG4gICAgICovXG4gICAgb24gOiBmdW5jdGlvbiAoZXZ0LCBmbikge1xuICAgICAgICB2YXIgc2VsZiA9IHRoaXM7XG5cbiAgICAgICAgaWYoZXZ0ID09PSBcImRhdGFcIikge1xuICAgICAgICAgICAgdGhpcy5fd29ya2VyLm9uKGV2dCwgZnVuY3Rpb24gKGNodW5rKSB7XG4gICAgICAgICAgICAgICAgZm4uY2FsbChzZWxmLCBjaHVuay5kYXRhLCBjaHVuay5tZXRhKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5fd29ya2VyLm9uKGV2dCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHV0aWxzLmRlbGF5KGZuLCBhcmd1bWVudHMsIHNlbGYpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcbiAgICAvKipcbiAgICAgKiBSZXN1bWUgdGhlIGZsb3cgb2YgY2h1bmtzLlxuICAgICAqIEByZXR1cm4ge1N0cmVhbUhlbHBlcn0gdGhlIGN1cnJlbnQgaGVscGVyLlxuICAgICAqL1xuICAgIHJlc3VtZSA6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdXRpbHMuZGVsYXkodGhpcy5fd29ya2VyLnJlc3VtZSwgW10sIHRoaXMuX3dvcmtlcik7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG4gICAgLyoqXG4gICAgICogUGF1c2UgdGhlIGZsb3cgb2YgY2h1bmtzLlxuICAgICAqIEByZXR1cm4ge1N0cmVhbUhlbHBlcn0gdGhlIGN1cnJlbnQgaGVscGVyLlxuICAgICAqL1xuICAgIHBhdXNlIDogZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLl93b3JrZXIucGF1c2UoKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcbiAgICAvKipcbiAgICAgKiBSZXR1cm4gYSBub2RlanMgc3RyZWFtIGZvciB0aGlzIGhlbHBlci5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSB1cGRhdGVDYiB0aGUgdXBkYXRlIGNhbGxiYWNrLlxuICAgICAqIEByZXR1cm4ge05vZGVqc1N0cmVhbU91dHB1dEFkYXB0ZXJ9IHRoZSBub2RlanMgc3RyZWFtLlxuICAgICAqL1xuICAgIHRvTm9kZWpzU3RyZWFtIDogZnVuY3Rpb24gKHVwZGF0ZUNiKSB7XG4gICAgICAgIHV0aWxzLmNoZWNrU3VwcG9ydChcIm5vZGVzdHJlYW1cIik7XG4gICAgICAgIGlmICh0aGlzLl9vdXRwdXRUeXBlICE9PSBcIm5vZGVidWZmZXJcIikge1xuICAgICAgICAgICAgLy8gYW4gb2JqZWN0IHN0cmVhbSBjb250YWluaW5nIGJsb2IvYXJyYXlidWZmZXIvdWludDhhcnJheS9zdHJpbmdcbiAgICAgICAgICAgIC8vIGlzIHN0cmFuZ2UgYW5kIEkgZG9uJ3Qga25vdyBpZiBpdCB3b3VsZCBiZSB1c2VmdWwuXG4gICAgICAgICAgICAvLyBJIHlvdSBmaW5kIHRoaXMgY29tbWVudCBhbmQgaGF2ZSBhIGdvb2QgdXNlY2FzZSwgcGxlYXNlIG9wZW4gYVxuICAgICAgICAgICAgLy8gYnVnIHJlcG9ydCAhXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IodGhpcy5fb3V0cHV0VHlwZSArIFwiIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhpcyBtZXRob2RcIik7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbmV3IE5vZGVqc1N0cmVhbU91dHB1dEFkYXB0ZXIodGhpcywge1xuICAgICAgICAgICAgb2JqZWN0TW9kZSA6IHRoaXMuX291dHB1dFR5cGUgIT09IFwibm9kZWJ1ZmZlclwiXG4gICAgICAgIH0sIHVwZGF0ZUNiKTtcbiAgICB9XG59O1xuXG5cbm1vZHVsZS5leHBvcnRzID0gU3RyZWFtSGVscGVyO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5leHBvcnRzLmJhc2U2NCA9IHRydWU7XG5leHBvcnRzLmFycmF5ID0gdHJ1ZTtcbmV4cG9ydHMuc3RyaW5nID0gdHJ1ZTtcbmV4cG9ydHMuYXJyYXlidWZmZXIgPSB0eXBlb2YgQXJyYXlCdWZmZXIgIT09IFwidW5kZWZpbmVkXCIgJiYgdHlwZW9mIFVpbnQ4QXJyYXkgIT09IFwidW5kZWZpbmVkXCI7XG5leHBvcnRzLm5vZGVidWZmZXIgPSB0eXBlb2YgQnVmZmVyICE9PSBcInVuZGVmaW5lZFwiO1xuLy8gY29udGFpbnMgdHJ1ZSBpZiBKU1ppcCBjYW4gcmVhZC9nZW5lcmF0ZSBVaW50OEFycmF5LCBmYWxzZSBvdGhlcndpc2UuXG5leHBvcnRzLnVpbnQ4YXJyYXkgPSB0eXBlb2YgVWludDhBcnJheSAhPT0gXCJ1bmRlZmluZWRcIjtcblxuaWYgKHR5cGVvZiBBcnJheUJ1ZmZlciA9PT0gXCJ1bmRlZmluZWRcIikge1xuICAgIGV4cG9ydHMuYmxvYiA9IGZhbHNlO1xufVxuZWxzZSB7XG4gICAgdmFyIGJ1ZmZlciA9IG5ldyBBcnJheUJ1ZmZlcigwKTtcbiAgICB0cnkge1xuICAgICAgICBleHBvcnRzLmJsb2IgPSBuZXcgQmxvYihbYnVmZmVyXSwge1xuICAgICAgICAgICAgdHlwZTogXCJhcHBsaWNhdGlvbi96aXBcIlxuICAgICAgICB9KS5zaXplID09PSAwO1xuICAgIH1cbiAgICBjYXRjaCAoZSkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgdmFyIEJ1aWxkZXIgPSB3aW5kb3cuQmxvYkJ1aWxkZXIgfHwgd2luZG93LldlYktpdEJsb2JCdWlsZGVyIHx8IHdpbmRvdy5Nb3pCbG9iQnVpbGRlciB8fCB3aW5kb3cuTVNCbG9iQnVpbGRlcjtcbiAgICAgICAgICAgIHZhciBidWlsZGVyID0gbmV3IEJ1aWxkZXIoKTtcbiAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKGJ1ZmZlcik7XG4gICAgICAgICAgICBleHBvcnRzLmJsb2IgPSBidWlsZGVyLmdldEJsb2IoJ2FwcGxpY2F0aW9uL3ppcCcpLnNpemUgPT09IDA7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIGV4cG9ydHMuYmxvYiA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxufVxuXG5leHBvcnRzLm5vZGVzdHJlYW0gPSAhIXJlcXVpcmUoXCIuL25vZGVqcy9Ob2RlanNTdHJlYW1PdXRwdXRBZGFwdGVyXCIpLnByb3RvdHlwZTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIHV0aWxzID0gcmVxdWlyZSgnLi91dGlscycpO1xudmFyIHN1cHBvcnQgPSByZXF1aXJlKCcuL3N1cHBvcnQnKTtcbnZhciBub2RlanNVdGlscyA9IHJlcXVpcmUoJy4vbm9kZWpzVXRpbHMnKTtcbnZhciBHZW5lcmljV29ya2VyID0gcmVxdWlyZSgnLi9zdHJlYW0vR2VuZXJpY1dvcmtlcicpO1xuXG4vKipcbiAqIFRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zIGNvbWUgZnJvbSBwYWtvLCBmcm9tIHBha28vbGliL3V0aWxzL3N0cmluZ3NcbiAqIHJlbGVhc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZSwgc2VlIHBha28gaHR0cHM6Ly9naXRodWIuY29tL25vZGVjYS9wYWtvL1xuICovXG5cbi8vIFRhYmxlIHdpdGggdXRmOCBsZW5ndGhzIChjYWxjdWxhdGVkIGJ5IGZpcnN0IGJ5dGUgb2Ygc2VxdWVuY2UpXG4vLyBOb3RlLCB0aGF0IDUgJiA2LWJ5dGUgdmFsdWVzIGFuZCBzb21lIDQtYnl0ZSB2YWx1ZXMgY2FuIG5vdCBiZSByZXByZXNlbnRlZCBpbiBKUyxcbi8vIGJlY2F1c2UgbWF4IHBvc3NpYmxlIGNvZGVwb2ludCBpcyAweDEwZmZmZlxudmFyIF91dGY4bGVuID0gbmV3IEFycmF5KDI1Nik7XG5mb3IgKHZhciBpPTA7IGk8MjU2OyBpKyspIHtcbiAgX3V0ZjhsZW5baV0gPSAoaSA+PSAyNTIgPyA2IDogaSA+PSAyNDggPyA1IDogaSA+PSAyNDAgPyA0IDogaSA+PSAyMjQgPyAzIDogaSA+PSAxOTIgPyAyIDogMSk7XG59XG5fdXRmOGxlblsyNTRdPV91dGY4bGVuWzI1NF09MTsgLy8gSW52YWxpZCBzZXF1ZW5jZSBzdGFydFxuXG4vLyBjb252ZXJ0IHN0cmluZyB0byBhcnJheSAodHlwZWQsIHdoZW4gcG9zc2libGUpXG52YXIgc3RyaW5nMmJ1ZiA9IGZ1bmN0aW9uIChzdHIpIHtcbiAgICB2YXIgYnVmLCBjLCBjMiwgbV9wb3MsIGksIHN0cl9sZW4gPSBzdHIubGVuZ3RoLCBidWZfbGVuID0gMDtcblxuICAgIC8vIGNvdW50IGJpbmFyeSBzaXplXG4gICAgZm9yIChtX3BvcyA9IDA7IG1fcG9zIDwgc3RyX2xlbjsgbV9wb3MrKykge1xuICAgICAgICBjID0gc3RyLmNoYXJDb2RlQXQobV9wb3MpO1xuICAgICAgICBpZiAoKGMgJiAweGZjMDApID09PSAweGQ4MDAgJiYgKG1fcG9zKzEgPCBzdHJfbGVuKSkge1xuICAgICAgICAgICAgYzIgPSBzdHIuY2hhckNvZGVBdChtX3BvcysxKTtcbiAgICAgICAgICAgIGlmICgoYzIgJiAweGZjMDApID09PSAweGRjMDApIHtcbiAgICAgICAgICAgICAgICBjID0gMHgxMDAwMCArICgoYyAtIDB4ZDgwMCkgPDwgMTApICsgKGMyIC0gMHhkYzAwKTtcbiAgICAgICAgICAgICAgICBtX3BvcysrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGJ1Zl9sZW4gKz0gYyA8IDB4ODAgPyAxIDogYyA8IDB4ODAwID8gMiA6IGMgPCAweDEwMDAwID8gMyA6IDQ7XG4gICAgfVxuXG4gICAgLy8gYWxsb2NhdGUgYnVmZmVyXG4gICAgaWYgKHN1cHBvcnQudWludDhhcnJheSkge1xuICAgICAgICBidWYgPSBuZXcgVWludDhBcnJheShidWZfbGVuKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBidWYgPSBuZXcgQXJyYXkoYnVmX2xlbik7XG4gICAgfVxuXG4gICAgLy8gY29udmVydFxuICAgIGZvciAoaT0wLCBtX3BvcyA9IDA7IGkgPCBidWZfbGVuOyBtX3BvcysrKSB7XG4gICAgICAgIGMgPSBzdHIuY2hhckNvZGVBdChtX3Bvcyk7XG4gICAgICAgIGlmICgoYyAmIDB4ZmMwMCkgPT09IDB4ZDgwMCAmJiAobV9wb3MrMSA8IHN0cl9sZW4pKSB7XG4gICAgICAgICAgICBjMiA9IHN0ci5jaGFyQ29kZUF0KG1fcG9zKzEpO1xuICAgICAgICAgICAgaWYgKChjMiAmIDB4ZmMwMCkgPT09IDB4ZGMwMCkge1xuICAgICAgICAgICAgICAgIGMgPSAweDEwMDAwICsgKChjIC0gMHhkODAwKSA8PCAxMCkgKyAoYzIgLSAweGRjMDApO1xuICAgICAgICAgICAgICAgIG1fcG9zKys7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGMgPCAweDgwKSB7XG4gICAgICAgICAgICAvKiBvbmUgYnl0ZSAqL1xuICAgICAgICAgICAgYnVmW2krK10gPSBjO1xuICAgICAgICB9IGVsc2UgaWYgKGMgPCAweDgwMCkge1xuICAgICAgICAgICAgLyogdHdvIGJ5dGVzICovXG4gICAgICAgICAgICBidWZbaSsrXSA9IDB4QzAgfCAoYyA+Pj4gNik7XG4gICAgICAgICAgICBidWZbaSsrXSA9IDB4ODAgfCAoYyAmIDB4M2YpO1xuICAgICAgICB9IGVsc2UgaWYgKGMgPCAweDEwMDAwKSB7XG4gICAgICAgICAgICAvKiB0aHJlZSBieXRlcyAqL1xuICAgICAgICAgICAgYnVmW2krK10gPSAweEUwIHwgKGMgPj4+IDEyKTtcbiAgICAgICAgICAgIGJ1ZltpKytdID0gMHg4MCB8IChjID4+PiA2ICYgMHgzZik7XG4gICAgICAgICAgICBidWZbaSsrXSA9IDB4ODAgfCAoYyAmIDB4M2YpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLyogZm91ciBieXRlcyAqL1xuICAgICAgICAgICAgYnVmW2krK10gPSAweGYwIHwgKGMgPj4+IDE4KTtcbiAgICAgICAgICAgIGJ1ZltpKytdID0gMHg4MCB8IChjID4+PiAxMiAmIDB4M2YpO1xuICAgICAgICAgICAgYnVmW2krK10gPSAweDgwIHwgKGMgPj4+IDYgJiAweDNmKTtcbiAgICAgICAgICAgIGJ1ZltpKytdID0gMHg4MCB8IChjICYgMHgzZik7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gYnVmO1xufTtcblxuLy8gQ2FsY3VsYXRlIG1heCBwb3NzaWJsZSBwb3NpdGlvbiBpbiB1dGY4IGJ1ZmZlcixcbi8vIHRoYXQgd2lsbCBub3QgYnJlYWsgc2VxdWVuY2UuIElmIHRoYXQncyBub3QgcG9zc2libGVcbi8vIC0gKHZlcnkgc21hbGwgbGltaXRzKSByZXR1cm4gbWF4IHNpemUgYXMgaXMuXG4vL1xuLy8gYnVmW10gLSB1dGY4IGJ5dGVzIGFycmF5XG4vLyBtYXggICAtIGxlbmd0aCBsaW1pdCAobWFuZGF0b3J5KTtcbnZhciB1dGY4Ym9yZGVyID0gZnVuY3Rpb24oYnVmLCBtYXgpIHtcbiAgICB2YXIgcG9zO1xuXG4gICAgbWF4ID0gbWF4IHx8IGJ1Zi5sZW5ndGg7XG4gICAgaWYgKG1heCA+IGJ1Zi5sZW5ndGgpIHsgbWF4ID0gYnVmLmxlbmd0aDsgfVxuXG4gICAgLy8gZ28gYmFjayBmcm9tIGxhc3QgcG9zaXRpb24sIHVudGlsIHN0YXJ0IG9mIHNlcXVlbmNlIGZvdW5kXG4gICAgcG9zID0gbWF4LTE7XG4gICAgd2hpbGUgKHBvcyA+PSAwICYmIChidWZbcG9zXSAmIDB4QzApID09PSAweDgwKSB7IHBvcy0tOyB9XG5cbiAgICAvLyBGdWNrdXAgLSB2ZXJ5IHNtYWxsIGFuZCBicm9rZW4gc2VxdWVuY2UsXG4gICAgLy8gcmV0dXJuIG1heCwgYmVjYXVzZSB3ZSBzaG91bGQgcmV0dXJuIHNvbWV0aGluZyBhbnl3YXkuXG4gICAgaWYgKHBvcyA8IDApIHsgcmV0dXJuIG1heDsgfVxuXG4gICAgLy8gSWYgd2UgY2FtZSB0byBzdGFydCBvZiBidWZmZXIgLSB0aGF0IG1lYW5zIHZ1ZmZlciBpcyB0b28gc21hbGwsXG4gICAgLy8gcmV0dXJuIG1heCB0b28uXG4gICAgaWYgKHBvcyA9PT0gMCkgeyByZXR1cm4gbWF4OyB9XG5cbiAgICByZXR1cm4gKHBvcyArIF91dGY4bGVuW2J1Zltwb3NdXSA+IG1heCkgPyBwb3MgOiBtYXg7XG59O1xuXG4vLyBjb252ZXJ0IGFycmF5IHRvIHN0cmluZ1xudmFyIGJ1ZjJzdHJpbmcgPSBmdW5jdGlvbiAoYnVmKSB7XG4gICAgdmFyIHN0ciwgaSwgb3V0LCBjLCBjX2xlbjtcbiAgICB2YXIgbGVuID0gYnVmLmxlbmd0aDtcblxuICAgIC8vIFJlc2VydmUgbWF4IHBvc3NpYmxlIGxlbmd0aCAoMiB3b3JkcyBwZXIgY2hhcilcbiAgICAvLyBOQjogYnkgdW5rbm93biByZWFzb25zLCBBcnJheSBpcyBzaWduaWZpY2FudGx5IGZhc3RlciBmb3JcbiAgICAvLyAgICAgU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseSB0aGFuIFVpbnQxNkFycmF5LlxuICAgIHZhciB1dGYxNmJ1ZiA9IG5ldyBBcnJheShsZW4qMik7XG5cbiAgICBmb3IgKG91dD0wLCBpPTA7IGk8bGVuOykge1xuICAgICAgICBjID0gYnVmW2krK107XG4gICAgICAgIC8vIHF1aWNrIHByb2Nlc3MgYXNjaWlcbiAgICAgICAgaWYgKGMgPCAweDgwKSB7IHV0ZjE2YnVmW291dCsrXSA9IGM7IGNvbnRpbnVlOyB9XG5cbiAgICAgICAgY19sZW4gPSBfdXRmOGxlbltjXTtcbiAgICAgICAgLy8gc2tpcCA1ICYgNiBieXRlIGNvZGVzXG4gICAgICAgIGlmIChjX2xlbiA+IDQpIHsgdXRmMTZidWZbb3V0KytdID0gMHhmZmZkOyBpICs9IGNfbGVuLTE7IGNvbnRpbnVlOyB9XG5cbiAgICAgICAgLy8gYXBwbHkgbWFzayBvbiBmaXJzdCBieXRlXG4gICAgICAgIGMgJj0gY19sZW4gPT09IDIgPyAweDFmIDogY19sZW4gPT09IDMgPyAweDBmIDogMHgwNztcbiAgICAgICAgLy8gam9pbiB0aGUgcmVzdFxuICAgICAgICB3aGlsZSAoY19sZW4gPiAxICYmIGkgPCBsZW4pIHtcbiAgICAgICAgICAgIGMgPSAoYyA8PCA2KSB8IChidWZbaSsrXSAmIDB4M2YpO1xuICAgICAgICAgICAgY19sZW4tLTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHRlcm1pbmF0ZWQgYnkgZW5kIG9mIHN0cmluZz9cbiAgICAgICAgaWYgKGNfbGVuID4gMSkgeyB1dGYxNmJ1ZltvdXQrK10gPSAweGZmZmQ7IGNvbnRpbnVlOyB9XG5cbiAgICAgICAgaWYgKGMgPCAweDEwMDAwKSB7XG4gICAgICAgICAgICB1dGYxNmJ1ZltvdXQrK10gPSBjO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgYyAtPSAweDEwMDAwO1xuICAgICAgICAgICAgdXRmMTZidWZbb3V0KytdID0gMHhkODAwIHwgKChjID4+IDEwKSAmIDB4M2ZmKTtcbiAgICAgICAgICAgIHV0ZjE2YnVmW291dCsrXSA9IDB4ZGMwMCB8IChjICYgMHgzZmYpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gc2hyaW5rQnVmKHV0ZjE2YnVmLCBvdXQpXG4gICAgaWYgKHV0ZjE2YnVmLmxlbmd0aCAhPT0gb3V0KSB7XG4gICAgICAgIGlmKHV0ZjE2YnVmLnN1YmFycmF5KSB7XG4gICAgICAgICAgICB1dGYxNmJ1ZiA9IHV0ZjE2YnVmLnN1YmFycmF5KDAsIG91dCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB1dGYxNmJ1Zi5sZW5ndGggPSBvdXQ7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyByZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShudWxsLCB1dGYxNmJ1Zik7XG4gICAgcmV0dXJuIHV0aWxzLmFwcGx5RnJvbUNoYXJDb2RlKHV0ZjE2YnVmKTtcbn07XG5cblxuLy8gVGhhdCdzIGFsbCBmb3IgdGhlIHBha28gZnVuY3Rpb25zLlxuXG5cbi8qKlxuICogVHJhbnNmb3JtIGEgamF2YXNjcmlwdCBzdHJpbmcgaW50byBhbiBhcnJheSAodHlwZWQgaWYgcG9zc2libGUpIG9mIGJ5dGVzLFxuICogVVRGLTggZW5jb2RlZC5cbiAqIEBwYXJhbSB7U3RyaW5nfSBzdHIgdGhlIHN0cmluZyB0byBlbmNvZGVcbiAqIEByZXR1cm4ge0FycmF5fFVpbnQ4QXJyYXl8QnVmZmVyfSB0aGUgVVRGLTggZW5jb2RlZCBzdHJpbmcuXG4gKi9cbmV4cG9ydHMudXRmOGVuY29kZSA9IGZ1bmN0aW9uIHV0ZjhlbmNvZGUoc3RyKSB7XG4gICAgaWYgKHN1cHBvcnQubm9kZWJ1ZmZlcikge1xuICAgICAgICByZXR1cm4gbm9kZWpzVXRpbHMubmV3QnVmZmVyKHN0ciwgXCJ1dGYtOFwiKTtcbiAgICB9XG5cbiAgICByZXR1cm4gc3RyaW5nMmJ1ZihzdHIpO1xufTtcblxuXG4vKipcbiAqIFRyYW5zZm9ybSBhIGJ5dGVzIGFycmF5IChvciBhIHJlcHJlc2VudGF0aW9uKSByZXByZXNlbnRpbmcgYW4gVVRGLTggZW5jb2RlZFxuICogc3RyaW5nIGludG8gYSBqYXZhc2NyaXB0IHN0cmluZy5cbiAqIEBwYXJhbSB7QXJyYXl8VWludDhBcnJheXxCdWZmZXJ9IGJ1ZiB0aGUgZGF0YSBkZSBkZWNvZGVcbiAqIEByZXR1cm4ge1N0cmluZ30gdGhlIGRlY29kZWQgc3RyaW5nLlxuICovXG5leHBvcnRzLnV0ZjhkZWNvZGUgPSBmdW5jdGlvbiB1dGY4ZGVjb2RlKGJ1Zikge1xuICAgIGlmIChzdXBwb3J0Lm5vZGVidWZmZXIpIHtcbiAgICAgICAgcmV0dXJuIHV0aWxzLnRyYW5zZm9ybVRvKFwibm9kZWJ1ZmZlclwiLCBidWYpLnRvU3RyaW5nKFwidXRmLThcIik7XG4gICAgfVxuXG4gICAgYnVmID0gdXRpbHMudHJhbnNmb3JtVG8oc3VwcG9ydC51aW50OGFycmF5ID8gXCJ1aW50OGFycmF5XCIgOiBcImFycmF5XCIsIGJ1Zik7XG5cbiAgICByZXR1cm4gYnVmMnN0cmluZyhidWYpO1xufTtcblxuLyoqXG4gKiBBIHdvcmtlciB0byBkZWNvZGUgdXRmOCBlbmNvZGVkIGJpbmFyeSBjaHVua3MgaW50byBzdHJpbmcgY2h1bmtzLlxuICogQGNvbnN0cnVjdG9yXG4gKi9cbmZ1bmN0aW9uIFV0ZjhEZWNvZGVXb3JrZXIoKSB7XG4gICAgR2VuZXJpY1dvcmtlci5jYWxsKHRoaXMsIFwidXRmLTggZGVjb2RlXCIpO1xuICAgIC8vIHRoZSBsYXN0IGJ5dGVzIGlmIGEgY2h1bmsgZGlkbid0IGVuZCB3aXRoIGEgY29tcGxldGUgY29kZXBvaW50LlxuICAgIHRoaXMubGVmdE92ZXIgPSBudWxsO1xufVxudXRpbHMuaW5oZXJpdHMoVXRmOERlY29kZVdvcmtlciwgR2VuZXJpY1dvcmtlcik7XG5cbi8qKlxuICogQHNlZSBHZW5lcmljV29ya2VyLnByb2Nlc3NDaHVua1xuICovXG5VdGY4RGVjb2RlV29ya2VyLnByb3RvdHlwZS5wcm9jZXNzQ2h1bmsgPSBmdW5jdGlvbiAoY2h1bmspIHtcblxuICAgIHZhciBkYXRhID0gdXRpbHMudHJhbnNmb3JtVG8oc3VwcG9ydC51aW50OGFycmF5ID8gXCJ1aW50OGFycmF5XCIgOiBcImFycmF5XCIsIGNodW5rLmRhdGEpO1xuXG4gICAgLy8gMXN0IHN0ZXAsIHJlLXVzZSB3aGF0J3MgbGVmdCBvZiB0aGUgcHJldmlvdXMgY2h1bmtcbiAgICBpZiAodGhpcy5sZWZ0T3ZlciAmJiB0aGlzLmxlZnRPdmVyLmxlbmd0aCkge1xuICAgICAgICBpZihzdXBwb3J0LnVpbnQ4YXJyYXkpIHtcbiAgICAgICAgICAgIHZhciBwcmV2aW91c0RhdGEgPSBkYXRhO1xuICAgICAgICAgICAgZGF0YSA9IG5ldyBVaW50OEFycmF5KHByZXZpb3VzRGF0YS5sZW5ndGggKyB0aGlzLmxlZnRPdmVyLmxlbmd0aCk7XG4gICAgICAgICAgICBkYXRhLnNldCh0aGlzLmxlZnRPdmVyLCAwKTtcbiAgICAgICAgICAgIGRhdGEuc2V0KHByZXZpb3VzRGF0YSwgdGhpcy5sZWZ0T3Zlci5sZW5ndGgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZGF0YSA9IHRoaXMubGVmdE92ZXIuY29uY2F0KGRhdGEpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMubGVmdE92ZXIgPSBudWxsO1xuICAgIH1cblxuICAgIHZhciBuZXh0Qm91bmRhcnkgPSB1dGY4Ym9yZGVyKGRhdGEpO1xuICAgIHZhciB1c2FibGVEYXRhID0gZGF0YTtcbiAgICBpZiAobmV4dEJvdW5kYXJ5ICE9PSBkYXRhLmxlbmd0aCkge1xuICAgICAgICBpZiAoc3VwcG9ydC51aW50OGFycmF5KSB7XG4gICAgICAgICAgICB1c2FibGVEYXRhID0gZGF0YS5zdWJhcnJheSgwLCBuZXh0Qm91bmRhcnkpO1xuICAgICAgICAgICAgdGhpcy5sZWZ0T3ZlciA9IGRhdGEuc3ViYXJyYXkobmV4dEJvdW5kYXJ5LCBkYXRhLmxlbmd0aCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB1c2FibGVEYXRhID0gZGF0YS5zbGljZSgwLCBuZXh0Qm91bmRhcnkpO1xuICAgICAgICAgICAgdGhpcy5sZWZ0T3ZlciA9IGRhdGEuc2xpY2UobmV4dEJvdW5kYXJ5LCBkYXRhLmxlbmd0aCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLnB1c2goe1xuICAgICAgICBkYXRhIDogZXhwb3J0cy51dGY4ZGVjb2RlKHVzYWJsZURhdGEpLFxuICAgICAgICBtZXRhIDogY2h1bmsubWV0YVxuICAgIH0pO1xufTtcblxuLyoqXG4gKiBAc2VlIEdlbmVyaWNXb3JrZXIuZmx1c2hcbiAqL1xuVXRmOERlY29kZVdvcmtlci5wcm90b3R5cGUuZmx1c2ggPSBmdW5jdGlvbiAoKSB7XG4gICAgaWYodGhpcy5sZWZ0T3ZlciAmJiB0aGlzLmxlZnRPdmVyLmxlbmd0aCkge1xuICAgICAgICB0aGlzLnB1c2goe1xuICAgICAgICAgICAgZGF0YSA6IGV4cG9ydHMudXRmOGRlY29kZSh0aGlzLmxlZnRPdmVyKSxcbiAgICAgICAgICAgIG1ldGEgOiB7fVxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5sZWZ0T3ZlciA9IG51bGw7XG4gICAgfVxufTtcbmV4cG9ydHMuVXRmOERlY29kZVdvcmtlciA9IFV0ZjhEZWNvZGVXb3JrZXI7XG5cbi8qKlxuICogQSB3b3JrZXIgdG8gZW5kY29kZSBzdHJpbmcgY2h1bmtzIGludG8gdXRmOCBlbmNvZGVkIGJpbmFyeSBjaHVua3MuXG4gKiBAY29uc3RydWN0b3JcbiAqL1xuZnVuY3Rpb24gVXRmOEVuY29kZVdvcmtlcigpIHtcbiAgICBHZW5lcmljV29ya2VyLmNhbGwodGhpcywgXCJ1dGYtOCBlbmNvZGVcIik7XG59XG51dGlscy5pbmhlcml0cyhVdGY4RW5jb2RlV29ya2VyLCBHZW5lcmljV29ya2VyKTtcblxuLyoqXG4gKiBAc2VlIEdlbmVyaWNXb3JrZXIucHJvY2Vzc0NodW5rXG4gKi9cblV0ZjhFbmNvZGVXb3JrZXIucHJvdG90eXBlLnByb2Nlc3NDaHVuayA9IGZ1bmN0aW9uIChjaHVuaykge1xuICAgIHRoaXMucHVzaCh7XG4gICAgICAgIGRhdGEgOiBleHBvcnRzLnV0ZjhlbmNvZGUoY2h1bmsuZGF0YSksXG4gICAgICAgIG1ldGEgOiBjaHVuay5tZXRhXG4gICAgfSk7XG59O1xuZXhwb3J0cy5VdGY4RW5jb2RlV29ya2VyID0gVXRmOEVuY29kZVdvcmtlcjtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIHN1cHBvcnQgPSByZXF1aXJlKCcuL3N1cHBvcnQnKTtcbnZhciBiYXNlNjQgPSByZXF1aXJlKCcuL2Jhc2U2NCcpO1xudmFyIG5vZGVqc1V0aWxzID0gcmVxdWlyZSgnLi9ub2RlanNVdGlscycpO1xudmFyIGFzYXAgPSByZXF1aXJlKCdhc2FwJyk7XG52YXIgZXh0ZXJuYWwgPSByZXF1aXJlKFwiLi9leHRlcm5hbFwiKTtcblxuXG4vKipcbiAqIENvbnZlcnQgYSBzdHJpbmcgdGhhdCBwYXNzIGFzIGEgXCJiaW5hcnkgc3RyaW5nXCI6IGl0IHNob3VsZCByZXByZXNlbnQgYSBieXRlXG4gKiBhcnJheSBidXQgbWF5IGhhdmUgPiAyNTUgY2hhciBjb2Rlcy4gQmUgc3VyZSB0byB0YWtlIG9ubHkgdGhlIGZpcnN0IGJ5dGVcbiAqIGFuZCByZXR1cm5zIHRoZSBieXRlIGFycmF5LlxuICogQHBhcmFtIHtTdHJpbmd9IHN0ciB0aGUgc3RyaW5nIHRvIHRyYW5zZm9ybS5cbiAqIEByZXR1cm4ge0FycmF5fFVpbnQ4QXJyYXl9IHRoZSBzdHJpbmcgaW4gYSBiaW5hcnkgZm9ybWF0LlxuICovXG5mdW5jdGlvbiBzdHJpbmcyYmluYXJ5KHN0cikge1xuICAgIHZhciByZXN1bHQgPSBudWxsO1xuICAgIGlmIChzdXBwb3J0LnVpbnQ4YXJyYXkpIHtcbiAgICAgIHJlc3VsdCA9IG5ldyBVaW50OEFycmF5KHN0ci5sZW5ndGgpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXN1bHQgPSBuZXcgQXJyYXkoc3RyLmxlbmd0aCk7XG4gICAgfVxuICAgIHJldHVybiBzdHJpbmdUb0FycmF5TGlrZShzdHIsIHJlc3VsdCk7XG59XG5cbi8qKlxuICogQ3JlYXRlIGEgbmV3IGJsb2Igd2l0aCB0aGUgZ2l2ZW4gY29udGVudCBhbmQgdGhlIGdpdmVuIHR5cGUuXG4gKiBAcGFyYW0ge1N0cmluZ3xBcnJheUJ1ZmZlcn0gcGFydCB0aGUgY29udGVudCB0byBwdXQgaW4gdGhlIGJsb2IuIERPIE5PVCB1c2VcbiAqIGFuIFVpbnQ4QXJyYXkgYmVjYXVzZSB0aGUgc3RvY2sgYnJvd3NlciBvZiBhbmRyb2lkIDQgd29uJ3QgYWNjZXB0IGl0IChpdFxuICogd2lsbCBiZSBzaWxlbnRseSBjb252ZXJ0ZWQgdG8gYSBzdHJpbmcsIFwiW29iamVjdCBVaW50OEFycmF5XVwiKS5cbiAqIEBwYXJhbSB7U3RyaW5nfSB0eXBlIHRoZSBtaW1lIHR5cGUgb2YgdGhlIGJsb2IuXG4gKiBAcmV0dXJuIHtCbG9ifSB0aGUgY3JlYXRlZCBibG9iLlxuICovXG5leHBvcnRzLm5ld0Jsb2IgPSBmdW5jdGlvbihwYXJ0LCB0eXBlKSB7XG4gICAgZXhwb3J0cy5jaGVja1N1cHBvcnQoXCJibG9iXCIpO1xuXG4gICAgdHJ5IHtcbiAgICAgICAgLy8gQmxvYiBjb25zdHJ1Y3RvclxuICAgICAgICByZXR1cm4gbmV3IEJsb2IoW3BhcnRdLCB7XG4gICAgICAgICAgICB0eXBlOiB0eXBlXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBjYXRjaCAoZSkge1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICAvLyBkZXByZWNhdGVkLCBicm93c2VyIG9ubHksIG9sZCB3YXlcbiAgICAgICAgICAgIHZhciBCdWlsZGVyID0gd2luZG93LkJsb2JCdWlsZGVyIHx8IHdpbmRvdy5XZWJLaXRCbG9iQnVpbGRlciB8fCB3aW5kb3cuTW96QmxvYkJ1aWxkZXIgfHwgd2luZG93Lk1TQmxvYkJ1aWxkZXI7XG4gICAgICAgICAgICB2YXIgYnVpbGRlciA9IG5ldyBCdWlsZGVyKCk7XG4gICAgICAgICAgICBidWlsZGVyLmFwcGVuZChwYXJ0KTtcbiAgICAgICAgICAgIHJldHVybiBidWlsZGVyLmdldEJsb2IodHlwZSk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGUpIHtcblxuICAgICAgICAgICAgLy8gd2VsbCwgZnVjayA/IVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQnVnIDogY2FuJ3QgY29uc3RydWN0IHRoZSBCbG9iLlwiKTtcbiAgICAgICAgfVxuICAgIH1cblxuXG59O1xuLyoqXG4gKiBUaGUgaWRlbnRpdHkgZnVuY3Rpb24uXG4gKiBAcGFyYW0ge09iamVjdH0gaW5wdXQgdGhlIGlucHV0LlxuICogQHJldHVybiB7T2JqZWN0fSB0aGUgc2FtZSBpbnB1dC5cbiAqL1xuZnVuY3Rpb24gaWRlbnRpdHkoaW5wdXQpIHtcbiAgICByZXR1cm4gaW5wdXQ7XG59XG5cbi8qKlxuICogRmlsbCBpbiBhbiBhcnJheSB3aXRoIGEgc3RyaW5nLlxuICogQHBhcmFtIHtTdHJpbmd9IHN0ciB0aGUgc3RyaW5nIHRvIHVzZS5cbiAqIEBwYXJhbSB7QXJyYXl8QXJyYXlCdWZmZXJ8VWludDhBcnJheXxCdWZmZXJ9IGFycmF5IHRoZSBhcnJheSB0byBmaWxsIGluICh3aWxsIGJlIG11dGF0ZWQpLlxuICogQHJldHVybiB7QXJyYXl8QXJyYXlCdWZmZXJ8VWludDhBcnJheXxCdWZmZXJ9IHRoZSB1cGRhdGVkIGFycmF5LlxuICovXG5mdW5jdGlvbiBzdHJpbmdUb0FycmF5TGlrZShzdHIsIGFycmF5KSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzdHIubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgYXJyYXlbaV0gPSBzdHIuY2hhckNvZGVBdChpKSAmIDB4RkY7XG4gICAgfVxuICAgIHJldHVybiBhcnJheTtcbn1cblxuLyoqXG4gKiBBbiBoZWxwZXIgZm9yIHRoZSBmdW5jdGlvbiBhcnJheUxpa2VUb1N0cmluZy5cbiAqIFRoaXMgY29udGFpbnMgc3RhdGljIGluZm9ybWF0aW9ucyBhbmQgZnVuY3Rpb25zIHRoYXRcbiAqIGNhbiBiZSBvcHRpbWl6ZWQgYnkgdGhlIGJyb3dzZXIgSklUIGNvbXBpbGVyLlxuICovXG52YXIgYXJyYXlUb1N0cmluZ0hlbHBlciA9IHtcbiAgICAvKipcbiAgICAgKiBUcmFuc2Zvcm0gYW4gYXJyYXkgb2YgaW50IGludG8gYSBzdHJpbmcsIGNodW5rIGJ5IGNodW5rLlxuICAgICAqIFNlZSB0aGUgcGVyZm9ybWFuY2VzIG5vdGVzIG9uIGFycmF5TGlrZVRvU3RyaW5nLlxuICAgICAqIEBwYXJhbSB7QXJyYXl8QXJyYXlCdWZmZXJ8VWludDhBcnJheXxCdWZmZXJ9IGFycmF5IHRoZSBhcnJheSB0byB0cmFuc2Zvcm0uXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IHR5cGUgdGhlIHR5cGUgb2YgdGhlIGFycmF5LlxuICAgICAqIEBwYXJhbSB7SW50ZWdlcn0gY2h1bmsgdGhlIGNodW5rIHNpemUuXG4gICAgICogQHJldHVybiB7U3RyaW5nfSB0aGUgcmVzdWx0aW5nIHN0cmluZy5cbiAgICAgKiBAdGhyb3dzIEVycm9yIGlmIHRoZSBjaHVuayBpcyB0b28gYmlnIGZvciB0aGUgc3RhY2suXG4gICAgICovXG4gICAgc3RyaW5naWZ5QnlDaHVuazogZnVuY3Rpb24oYXJyYXksIHR5cGUsIGNodW5rKSB7XG4gICAgICAgIHZhciByZXN1bHQgPSBbXSwgayA9IDAsIGxlbiA9IGFycmF5Lmxlbmd0aDtcbiAgICAgICAgLy8gc2hvcnRjdXRcbiAgICAgICAgaWYgKGxlbiA8PSBjaHVuaykge1xuICAgICAgICAgICAgcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkobnVsbCwgYXJyYXkpO1xuICAgICAgICB9XG4gICAgICAgIHdoaWxlIChrIDwgbGVuKSB7XG4gICAgICAgICAgICBpZiAodHlwZSA9PT0gXCJhcnJheVwiIHx8IHR5cGUgPT09IFwibm9kZWJ1ZmZlclwiKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShudWxsLCBhcnJheS5zbGljZShrLCBNYXRoLm1pbihrICsgY2h1bmssIGxlbikpKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXN1bHQucHVzaChTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KG51bGwsIGFycmF5LnN1YmFycmF5KGssIE1hdGgubWluKGsgKyBjaHVuaywgbGVuKSkpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGsgKz0gY2h1bms7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdC5qb2luKFwiXCIpO1xuICAgIH0sXG4gICAgLyoqXG4gICAgICogQ2FsbCBTdHJpbmcuZnJvbUNoYXJDb2RlIG9uIGV2ZXJ5IGl0ZW0gaW4gdGhlIGFycmF5LlxuICAgICAqIFRoaXMgaXMgdGhlIG5haXZlIGltcGxlbWVudGF0aW9uLCB3aGljaCBnZW5lcmF0ZSBBIExPVCBvZiBpbnRlcm1lZGlhdGUgc3RyaW5nLlxuICAgICAqIFRoaXMgc2hvdWxkIGJlIHVzZWQgd2hlbiBldmVyeXRoaW5nIGVsc2UgZmFpbC5cbiAgICAgKiBAcGFyYW0ge0FycmF5fEFycmF5QnVmZmVyfFVpbnQ4QXJyYXl8QnVmZmVyfSBhcnJheSB0aGUgYXJyYXkgdG8gdHJhbnNmb3JtLlxuICAgICAqIEByZXR1cm4ge1N0cmluZ30gdGhlIHJlc3VsdC5cbiAgICAgKi9cbiAgICBzdHJpbmdpZnlCeUNoYXI6IGZ1bmN0aW9uKGFycmF5KXtcbiAgICAgICAgdmFyIHJlc3VsdFN0ciA9IFwiXCI7XG4gICAgICAgIGZvcih2YXIgaSA9IDA7IGkgPCBhcnJheS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgcmVzdWx0U3RyICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoYXJyYXlbaV0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHRTdHI7XG4gICAgfSxcbiAgICBhcHBseUNhbkJlVXNlZCA6IHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIHRydWUgaWYgdGhlIGJyb3dzZXIgYWNjZXB0cyB0byB1c2UgU3RyaW5nLmZyb21DaGFyQ29kZSBvbiBVaW50OEFycmF5XG4gICAgICAgICAqL1xuICAgICAgICB1aW50OGFycmF5IDogKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHN1cHBvcnQudWludDhhcnJheSAmJiBTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KG51bGwsIG5ldyBVaW50OEFycmF5KDEpKS5sZW5ndGggPT09IDE7XG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KSgpLFxuICAgICAgICAvKipcbiAgICAgICAgICogdHJ1ZSBpZiB0aGUgYnJvd3NlciBhY2NlcHRzIHRvIHVzZSBTdHJpbmcuZnJvbUNoYXJDb2RlIG9uIG5vZGVqcyBCdWZmZXIuXG4gICAgICAgICAqL1xuICAgICAgICBub2RlYnVmZmVyIDogKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHN1cHBvcnQubm9kZWJ1ZmZlciAmJiBTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KG51bGwsIG5vZGVqc1V0aWxzLm5ld0J1ZmZlcigxKSkubGVuZ3RoID09PSAxO1xuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSkoKVxuICAgIH1cbn07XG5cbi8qKlxuICogVHJhbnNmb3JtIGFuIGFycmF5LWxpa2Ugb2JqZWN0IHRvIGEgc3RyaW5nLlxuICogQHBhcmFtIHtBcnJheXxBcnJheUJ1ZmZlcnxVaW50OEFycmF5fEJ1ZmZlcn0gYXJyYXkgdGhlIGFycmF5IHRvIHRyYW5zZm9ybS5cbiAqIEByZXR1cm4ge1N0cmluZ30gdGhlIHJlc3VsdC5cbiAqL1xuZnVuY3Rpb24gYXJyYXlMaWtlVG9TdHJpbmcoYXJyYXkpIHtcbiAgICAvLyBQZXJmb3JtYW5jZXMgbm90ZXMgOlxuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgLy8gU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShudWxsLCBhcnJheSkgaXMgdGhlIGZhc3Rlc3QsIHNlZVxuICAgIC8vIHNlZSBodHRwOi8vanNwZXJmLmNvbS9jb252ZXJ0aW5nLWEtdWludDhhcnJheS10by1hLXN0cmluZy8yXG4gICAgLy8gYnV0IHRoZSBzdGFjayBpcyBsaW1pdGVkIChhbmQgd2UgY2FuIGdldCBodWdlIGFycmF5cyAhKS5cbiAgICAvL1xuICAgIC8vIHJlc3VsdCArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGFycmF5W2ldKTsgZ2VuZXJhdGUgdG9vIG1hbnkgc3RyaW5ncyAhXG4gICAgLy9cbiAgICAvLyBUaGlzIGNvZGUgaXMgaW5zcGlyZWQgYnkgaHR0cDovL2pzcGVyZi5jb20vYXJyYXlidWZmZXItdG8tc3RyaW5nLWFwcGx5LXBlcmZvcm1hbmNlLzJcbiAgICAvLyBUT0RPIDogd2Ugbm93IGhhdmUgd29ya2VycyB0aGF0IHNwbGl0IHRoZSB3b3JrLiBEbyB3ZSBzdGlsbCBuZWVkIHRoYXQgP1xuICAgIHZhciBjaHVuayA9IDY1NTM2LFxuICAgICAgICB0eXBlID0gZXhwb3J0cy5nZXRUeXBlT2YoYXJyYXkpLFxuICAgICAgICBjYW5Vc2VBcHBseSA9IHRydWU7XG4gICAgaWYgKHR5cGUgPT09IFwidWludDhhcnJheVwiKSB7XG4gICAgICAgIGNhblVzZUFwcGx5ID0gYXJyYXlUb1N0cmluZ0hlbHBlci5hcHBseUNhbkJlVXNlZC51aW50OGFycmF5O1xuICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gXCJub2RlYnVmZmVyXCIpIHtcbiAgICAgICAgY2FuVXNlQXBwbHkgPSBhcnJheVRvU3RyaW5nSGVscGVyLmFwcGx5Q2FuQmVVc2VkLm5vZGVidWZmZXI7XG4gICAgfVxuXG4gICAgaWYgKGNhblVzZUFwcGx5KSB7XG4gICAgICAgIHdoaWxlIChjaHVuayA+IDEpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGFycmF5VG9TdHJpbmdIZWxwZXIuc3RyaW5naWZ5QnlDaHVuayhhcnJheSwgdHlwZSwgY2h1bmspO1xuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgIGNodW5rID0gTWF0aC5mbG9vcihjaHVuayAvIDIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gbm8gYXBwbHkgb3IgY2h1bmsgZXJyb3IgOiBzbG93IGFuZCBwYWluZnVsIGFsZ29yaXRobVxuICAgIC8vIGRlZmF1bHQgYnJvd3NlciBvbiBhbmRyb2lkIDQuKlxuICAgIHJldHVybiBhcnJheVRvU3RyaW5nSGVscGVyLnN0cmluZ2lmeUJ5Q2hhcihhcnJheSk7XG59XG5cbmV4cG9ydHMuYXBwbHlGcm9tQ2hhckNvZGUgPSBhcnJheUxpa2VUb1N0cmluZztcblxuXG4vKipcbiAqIENvcHkgdGhlIGRhdGEgZnJvbSBhbiBhcnJheS1saWtlIHRvIGFuIG90aGVyIGFycmF5LWxpa2UuXG4gKiBAcGFyYW0ge0FycmF5fEFycmF5QnVmZmVyfFVpbnQ4QXJyYXl8QnVmZmVyfSBhcnJheUZyb20gdGhlIG9yaWdpbiBhcnJheS5cbiAqIEBwYXJhbSB7QXJyYXl8QXJyYXlCdWZmZXJ8VWludDhBcnJheXxCdWZmZXJ9IGFycmF5VG8gdGhlIGRlc3RpbmF0aW9uIGFycmF5IHdoaWNoIHdpbGwgYmUgbXV0YXRlZC5cbiAqIEByZXR1cm4ge0FycmF5fEFycmF5QnVmZmVyfFVpbnQ4QXJyYXl8QnVmZmVyfSB0aGUgdXBkYXRlZCBkZXN0aW5hdGlvbiBhcnJheS5cbiAqL1xuZnVuY3Rpb24gYXJyYXlMaWtlVG9BcnJheUxpa2UoYXJyYXlGcm9tLCBhcnJheVRvKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcnJheUZyb20ubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgYXJyYXlUb1tpXSA9IGFycmF5RnJvbVtpXTtcbiAgICB9XG4gICAgcmV0dXJuIGFycmF5VG87XG59XG5cbi8vIGEgbWF0cml4IGNvbnRhaW5pbmcgZnVuY3Rpb25zIHRvIHRyYW5zZm9ybSBldmVyeXRoaW5nIGludG8gZXZlcnl0aGluZy5cbnZhciB0cmFuc2Zvcm0gPSB7fTtcblxuLy8gc3RyaW5nIHRvID9cbnRyYW5zZm9ybVtcInN0cmluZ1wiXSA9IHtcbiAgICBcInN0cmluZ1wiOiBpZGVudGl0eSxcbiAgICBcImFycmF5XCI6IGZ1bmN0aW9uKGlucHV0KSB7XG4gICAgICAgIHJldHVybiBzdHJpbmdUb0FycmF5TGlrZShpbnB1dCwgbmV3IEFycmF5KGlucHV0Lmxlbmd0aCkpO1xuICAgIH0sXG4gICAgXCJhcnJheWJ1ZmZlclwiOiBmdW5jdGlvbihpbnB1dCkge1xuICAgICAgICByZXR1cm4gdHJhbnNmb3JtW1wic3RyaW5nXCJdW1widWludDhhcnJheVwiXShpbnB1dCkuYnVmZmVyO1xuICAgIH0sXG4gICAgXCJ1aW50OGFycmF5XCI6IGZ1bmN0aW9uKGlucHV0KSB7XG4gICAgICAgIHJldHVybiBzdHJpbmdUb0FycmF5TGlrZShpbnB1dCwgbmV3IFVpbnQ4QXJyYXkoaW5wdXQubGVuZ3RoKSk7XG4gICAgfSxcbiAgICBcIm5vZGVidWZmZXJcIjogZnVuY3Rpb24oaW5wdXQpIHtcbiAgICAgICAgcmV0dXJuIHN0cmluZ1RvQXJyYXlMaWtlKGlucHV0LCBub2RlanNVdGlscy5uZXdCdWZmZXIoaW5wdXQubGVuZ3RoKSk7XG4gICAgfVxufTtcblxuLy8gYXJyYXkgdG8gP1xudHJhbnNmb3JtW1wiYXJyYXlcIl0gPSB7XG4gICAgXCJzdHJpbmdcIjogYXJyYXlMaWtlVG9TdHJpbmcsXG4gICAgXCJhcnJheVwiOiBpZGVudGl0eSxcbiAgICBcImFycmF5YnVmZmVyXCI6IGZ1bmN0aW9uKGlucHV0KSB7XG4gICAgICAgIHJldHVybiAobmV3IFVpbnQ4QXJyYXkoaW5wdXQpKS5idWZmZXI7XG4gICAgfSxcbiAgICBcInVpbnQ4YXJyYXlcIjogZnVuY3Rpb24oaW5wdXQpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBVaW50OEFycmF5KGlucHV0KTtcbiAgICB9LFxuICAgIFwibm9kZWJ1ZmZlclwiOiBmdW5jdGlvbihpbnB1dCkge1xuICAgICAgICByZXR1cm4gbm9kZWpzVXRpbHMubmV3QnVmZmVyKGlucHV0KTtcbiAgICB9XG59O1xuXG4vLyBhcnJheWJ1ZmZlciB0byA/XG50cmFuc2Zvcm1bXCJhcnJheWJ1ZmZlclwiXSA9IHtcbiAgICBcInN0cmluZ1wiOiBmdW5jdGlvbihpbnB1dCkge1xuICAgICAgICByZXR1cm4gYXJyYXlMaWtlVG9TdHJpbmcobmV3IFVpbnQ4QXJyYXkoaW5wdXQpKTtcbiAgICB9LFxuICAgIFwiYXJyYXlcIjogZnVuY3Rpb24oaW5wdXQpIHtcbiAgICAgICAgcmV0dXJuIGFycmF5TGlrZVRvQXJyYXlMaWtlKG5ldyBVaW50OEFycmF5KGlucHV0KSwgbmV3IEFycmF5KGlucHV0LmJ5dGVMZW5ndGgpKTtcbiAgICB9LFxuICAgIFwiYXJyYXlidWZmZXJcIjogaWRlbnRpdHksXG4gICAgXCJ1aW50OGFycmF5XCI6IGZ1bmN0aW9uKGlucHV0KSB7XG4gICAgICAgIHJldHVybiBuZXcgVWludDhBcnJheShpbnB1dCk7XG4gICAgfSxcbiAgICBcIm5vZGVidWZmZXJcIjogZnVuY3Rpb24oaW5wdXQpIHtcbiAgICAgICAgcmV0dXJuIG5vZGVqc1V0aWxzLm5ld0J1ZmZlcihuZXcgVWludDhBcnJheShpbnB1dCkpO1xuICAgIH1cbn07XG5cbi8vIHVpbnQ4YXJyYXkgdG8gP1xudHJhbnNmb3JtW1widWludDhhcnJheVwiXSA9IHtcbiAgICBcInN0cmluZ1wiOiBhcnJheUxpa2VUb1N0cmluZyxcbiAgICBcImFycmF5XCI6IGZ1bmN0aW9uKGlucHV0KSB7XG4gICAgICAgIHJldHVybiBhcnJheUxpa2VUb0FycmF5TGlrZShpbnB1dCwgbmV3IEFycmF5KGlucHV0Lmxlbmd0aCkpO1xuICAgIH0sXG4gICAgXCJhcnJheWJ1ZmZlclwiOiBmdW5jdGlvbihpbnB1dCkge1xuICAgICAgICByZXR1cm4gaW5wdXQuYnVmZmVyO1xuICAgIH0sXG4gICAgXCJ1aW50OGFycmF5XCI6IGlkZW50aXR5LFxuICAgIFwibm9kZWJ1ZmZlclwiOiBmdW5jdGlvbihpbnB1dCkge1xuICAgICAgICByZXR1cm4gbm9kZWpzVXRpbHMubmV3QnVmZmVyKGlucHV0KTtcbiAgICB9XG59O1xuXG4vLyBub2RlYnVmZmVyIHRvID9cbnRyYW5zZm9ybVtcIm5vZGVidWZmZXJcIl0gPSB7XG4gICAgXCJzdHJpbmdcIjogYXJyYXlMaWtlVG9TdHJpbmcsXG4gICAgXCJhcnJheVwiOiBmdW5jdGlvbihpbnB1dCkge1xuICAgICAgICByZXR1cm4gYXJyYXlMaWtlVG9BcnJheUxpa2UoaW5wdXQsIG5ldyBBcnJheShpbnB1dC5sZW5ndGgpKTtcbiAgICB9LFxuICAgIFwiYXJyYXlidWZmZXJcIjogZnVuY3Rpb24oaW5wdXQpIHtcbiAgICAgICAgcmV0dXJuIHRyYW5zZm9ybVtcIm5vZGVidWZmZXJcIl1bXCJ1aW50OGFycmF5XCJdKGlucHV0KS5idWZmZXI7XG4gICAgfSxcbiAgICBcInVpbnQ4YXJyYXlcIjogZnVuY3Rpb24oaW5wdXQpIHtcbiAgICAgICAgcmV0dXJuIGFycmF5TGlrZVRvQXJyYXlMaWtlKGlucHV0LCBuZXcgVWludDhBcnJheShpbnB1dC5sZW5ndGgpKTtcbiAgICB9LFxuICAgIFwibm9kZWJ1ZmZlclwiOiBpZGVudGl0eVxufTtcblxuLyoqXG4gKiBUcmFuc2Zvcm0gYW4gaW5wdXQgaW50byBhbnkgdHlwZS5cbiAqIFRoZSBzdXBwb3J0ZWQgb3V0cHV0IHR5cGUgYXJlIDogc3RyaW5nLCBhcnJheSwgdWludDhhcnJheSwgYXJyYXlidWZmZXIsIG5vZGVidWZmZXIuXG4gKiBJZiBubyBvdXRwdXQgdHlwZSBpcyBzcGVjaWZpZWQsIHRoZSB1bm1vZGlmaWVkIGlucHV0IHdpbGwgYmUgcmV0dXJuZWQuXG4gKiBAcGFyYW0ge1N0cmluZ30gb3V0cHV0VHlwZSB0aGUgb3V0cHV0IHR5cGUuXG4gKiBAcGFyYW0ge1N0cmluZ3xBcnJheXxBcnJheUJ1ZmZlcnxVaW50OEFycmF5fEJ1ZmZlcn0gaW5wdXQgdGhlIGlucHV0IHRvIGNvbnZlcnQuXG4gKiBAdGhyb3dzIHtFcnJvcn0gYW4gRXJyb3IgaWYgdGhlIGJyb3dzZXIgZG9lc24ndCBzdXBwb3J0IHRoZSByZXF1ZXN0ZWQgb3V0cHV0IHR5cGUuXG4gKi9cbmV4cG9ydHMudHJhbnNmb3JtVG8gPSBmdW5jdGlvbihvdXRwdXRUeXBlLCBpbnB1dCkge1xuICAgIGlmICghaW5wdXQpIHtcbiAgICAgICAgLy8gdW5kZWZpbmVkLCBudWxsLCBldGNcbiAgICAgICAgLy8gYW4gZW1wdHkgc3RyaW5nIHdvbid0IGhhcm0uXG4gICAgICAgIGlucHV0ID0gXCJcIjtcbiAgICB9XG4gICAgaWYgKCFvdXRwdXRUeXBlKSB7XG4gICAgICAgIHJldHVybiBpbnB1dDtcbiAgICB9XG4gICAgZXhwb3J0cy5jaGVja1N1cHBvcnQob3V0cHV0VHlwZSk7XG4gICAgdmFyIGlucHV0VHlwZSA9IGV4cG9ydHMuZ2V0VHlwZU9mKGlucHV0KTtcbiAgICB2YXIgcmVzdWx0ID0gdHJhbnNmb3JtW2lucHV0VHlwZV1bb3V0cHV0VHlwZV0oaW5wdXQpO1xuICAgIHJldHVybiByZXN1bHQ7XG59O1xuXG4vKipcbiAqIFJldHVybiB0aGUgdHlwZSBvZiB0aGUgaW5wdXQuXG4gKiBUaGUgdHlwZSB3aWxsIGJlIGluIGEgZm9ybWF0IHZhbGlkIGZvciBKU1ppcC51dGlscy50cmFuc2Zvcm1UbyA6IHN0cmluZywgYXJyYXksIHVpbnQ4YXJyYXksIGFycmF5YnVmZmVyLlxuICogQHBhcmFtIHtPYmplY3R9IGlucHV0IHRoZSBpbnB1dCB0byBpZGVudGlmeS5cbiAqIEByZXR1cm4ge1N0cmluZ30gdGhlIChsb3dlcmNhc2UpIHR5cGUgb2YgdGhlIGlucHV0LlxuICovXG5leHBvcnRzLmdldFR5cGVPZiA9IGZ1bmN0aW9uKGlucHV0KSB7XG4gICAgaWYgKHR5cGVvZiBpbnB1dCA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICByZXR1cm4gXCJzdHJpbmdcIjtcbiAgICB9XG4gICAgaWYgKE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChpbnB1dCkgPT09IFwiW29iamVjdCBBcnJheV1cIikge1xuICAgICAgICByZXR1cm4gXCJhcnJheVwiO1xuICAgIH1cbiAgICBpZiAoc3VwcG9ydC5ub2RlYnVmZmVyICYmIG5vZGVqc1V0aWxzLmlzQnVmZmVyKGlucHV0KSkge1xuICAgICAgICByZXR1cm4gXCJub2RlYnVmZmVyXCI7XG4gICAgfVxuICAgIGlmIChzdXBwb3J0LnVpbnQ4YXJyYXkgJiYgaW5wdXQgaW5zdGFuY2VvZiBVaW50OEFycmF5KSB7XG4gICAgICAgIHJldHVybiBcInVpbnQ4YXJyYXlcIjtcbiAgICB9XG4gICAgaWYgKHN1cHBvcnQuYXJyYXlidWZmZXIgJiYgaW5wdXQgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcikge1xuICAgICAgICByZXR1cm4gXCJhcnJheWJ1ZmZlclwiO1xuICAgIH1cbn07XG5cbi8qKlxuICogVGhyb3cgYW4gZXhjZXB0aW9uIGlmIHRoZSB0eXBlIGlzIG5vdCBzdXBwb3J0ZWQuXG4gKiBAcGFyYW0ge1N0cmluZ30gdHlwZSB0aGUgdHlwZSB0byBjaGVjay5cbiAqIEB0aHJvd3Mge0Vycm9yfSBhbiBFcnJvciBpZiB0aGUgYnJvd3NlciBkb2Vzbid0IHN1cHBvcnQgdGhlIHJlcXVlc3RlZCB0eXBlLlxuICovXG5leHBvcnRzLmNoZWNrU3VwcG9ydCA9IGZ1bmN0aW9uKHR5cGUpIHtcbiAgICB2YXIgc3VwcG9ydGVkID0gc3VwcG9ydFt0eXBlLnRvTG93ZXJDYXNlKCldO1xuICAgIGlmICghc3VwcG9ydGVkKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcih0eXBlICsgXCIgaXMgbm90IHN1cHBvcnRlZCBieSB0aGlzIHBsYXRmb3JtXCIpO1xuICAgIH1cbn07XG5cbmV4cG9ydHMuTUFYX1ZBTFVFXzE2QklUUyA9IDY1NTM1O1xuZXhwb3J0cy5NQVhfVkFMVUVfMzJCSVRTID0gLTE7IC8vIHdlbGwsIFwiXFx4RkZcXHhGRlxceEZGXFx4RkZcXHhGRlxceEZGXFx4RkZcXHhGRlwiIGlzIHBhcnNlZCBhcyAtMVxuXG4vKipcbiAqIFByZXR0aWZ5IGEgc3RyaW5nIHJlYWQgYXMgYmluYXJ5LlxuICogQHBhcmFtIHtzdHJpbmd9IHN0ciB0aGUgc3RyaW5nIHRvIHByZXR0aWZ5LlxuICogQHJldHVybiB7c3RyaW5nfSBhIHByZXR0eSBzdHJpbmcuXG4gKi9cbmV4cG9ydHMucHJldHR5ID0gZnVuY3Rpb24oc3RyKSB7XG4gICAgdmFyIHJlcyA9ICcnLFxuICAgICAgICBjb2RlLCBpO1xuICAgIGZvciAoaSA9IDA7IGkgPCAoc3RyIHx8IFwiXCIpLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvZGUgPSBzdHIuY2hhckNvZGVBdChpKTtcbiAgICAgICAgcmVzICs9ICdcXFxceCcgKyAoY29kZSA8IDE2ID8gXCIwXCIgOiBcIlwiKSArIGNvZGUudG9TdHJpbmcoMTYpLnRvVXBwZXJDYXNlKCk7XG4gICAgfVxuICAgIHJldHVybiByZXM7XG59O1xuXG4vKipcbiAqIERlZmVyIHRoZSBjYWxsIG9mIGEgZnVuY3Rpb24uXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFjayB0aGUgZnVuY3Rpb24gdG8gY2FsbCBhc3luY2hyb25vdXNseS5cbiAqIEBwYXJhbSB7QXJyYXl9IGFyZ3MgdGhlIGFyZ3VtZW50cyB0byBnaXZlIHRvIHRoZSBjYWxsYmFjay5cbiAqL1xuZXhwb3J0cy5kZWxheSA9IGZ1bmN0aW9uKGNhbGxiYWNrLCBhcmdzLCBzZWxmKSB7XG4gICAgYXNhcChmdW5jdGlvbiAoKSB7XG4gICAgICAgIGNhbGxiYWNrLmFwcGx5KHNlbGYgfHwgbnVsbCwgYXJncyB8fCBbXSk7XG4gICAgfSk7XG59O1xuXG4vKipcbiAqIEV4dGVuZHMgYSBwcm90b3R5cGUgd2l0aCBhbiBvdGhlciwgd2l0aG91dCBjYWxsaW5nIGEgY29uc3RydWN0b3Igd2l0aFxuICogc2lkZSBlZmZlY3RzLiBJbnNwaXJlZCBieSBub2RlanMnIGB1dGlscy5pbmhlcml0c2BcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGN0b3IgdGhlIGNvbnN0cnVjdG9yIHRvIGF1Z21lbnRcbiAqIEBwYXJhbSB7RnVuY3Rpb259IHN1cGVyQ3RvciB0aGUgcGFyZW50IGNvbnN0cnVjdG9yIHRvIHVzZVxuICovXG5leHBvcnRzLmluaGVyaXRzID0gZnVuY3Rpb24gKGN0b3IsIHN1cGVyQ3Rvcikge1xuICAgIHZhciBPYmogPSBmdW5jdGlvbigpIHt9O1xuICAgIE9iai5wcm90b3R5cGUgPSBzdXBlckN0b3IucHJvdG90eXBlO1xuICAgIGN0b3IucHJvdG90eXBlID0gbmV3IE9iaigpO1xufTtcblxuLyoqXG4gKiBNZXJnZSB0aGUgb2JqZWN0cyBwYXNzZWQgYXMgcGFyYW1ldGVycyBpbnRvIGEgbmV3IG9uZS5cbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0gey4uLk9iamVjdH0gdmFyX2FyZ3MgQWxsIG9iamVjdHMgdG8gbWVyZ2UuXG4gKiBAcmV0dXJuIHtPYmplY3R9IGEgbmV3IG9iamVjdCB3aXRoIHRoZSBkYXRhIG9mIHRoZSBvdGhlcnMuXG4gKi9cbmV4cG9ydHMuZXh0ZW5kID0gZnVuY3Rpb24oKSB7XG4gICAgdmFyIHJlc3VsdCA9IHt9LCBpLCBhdHRyO1xuICAgIGZvciAoaSA9IDA7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHsgLy8gYXJndW1lbnRzIGlzIG5vdCBlbnVtZXJhYmxlIGluIHNvbWUgYnJvd3NlcnNcbiAgICAgICAgZm9yIChhdHRyIGluIGFyZ3VtZW50c1tpXSkge1xuICAgICAgICAgICAgaWYgKGFyZ3VtZW50c1tpXS5oYXNPd25Qcm9wZXJ0eShhdHRyKSAmJiB0eXBlb2YgcmVzdWx0W2F0dHJdID09PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0W2F0dHJdID0gYXJndW1lbnRzW2ldW2F0dHJdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG59O1xuXG4vKipcbiAqIFRyYW5zZm9ybSBhcmJpdHJhcnkgY29udGVudCBpbnRvIGEgUHJvbWlzZS5cbiAqIEBwYXJhbSB7U3RyaW5nfSBuYW1lIGEgbmFtZSBmb3IgdGhlIGNvbnRlbnQgYmVpbmcgcHJvY2Vzc2VkLlxuICogQHBhcmFtIHtPYmplY3R9IGlucHV0RGF0YSB0aGUgY29udGVudCB0byBwcm9jZXNzLlxuICogQHBhcmFtIHtCb29sZWFufSBpc0JpbmFyeSB0cnVlIGlmIHRoZSBjb250ZW50IGlzIG5vdCBhbiB1bmljb2RlIHN0cmluZ1xuICogQHBhcmFtIHtCb29sZWFufSBpc09wdGltaXplZEJpbmFyeVN0cmluZyB0cnVlIGlmIHRoZSBzdHJpbmcgY29udGVudCBvbmx5IGhhcyBvbmUgYnl0ZSBwZXIgY2hhcmFjdGVyLlxuICogQHBhcmFtIHtCb29sZWFufSBpc0Jhc2U2NCB0cnVlIGlmIHRoZSBzdHJpbmcgY29udGVudCBpcyBlbmNvZGVkIHdpdGggYmFzZTY0LlxuICogQHJldHVybiB7UHJvbWlzZX0gYSBwcm9taXNlIGluIGEgZm9ybWF0IHVzYWJsZSBieSBKU1ppcC5cbiAqL1xuZXhwb3J0cy5wcmVwYXJlQ29udGVudCA9IGZ1bmN0aW9uKG5hbWUsIGlucHV0RGF0YSwgaXNCaW5hcnksIGlzT3B0aW1pemVkQmluYXJ5U3RyaW5nLCBpc0Jhc2U2NCkge1xuXG4gICAgdmFyIHByb21pc2UgPSBudWxsO1xuICAgIGlmIChzdXBwb3J0LmJsb2IgJiYgaW5wdXREYXRhIGluc3RhbmNlb2YgQmxvYiAmJiB0eXBlb2YgRmlsZVJlYWRlciAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICBwcm9taXNlID0gbmV3IGV4dGVybmFsLlByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICAgICAgdmFyIHJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKCk7XG5cbiAgICAgICAgICAgIHJlYWRlci5vbmxvYWQgPSBmdW5jdGlvbihlKSB7XG4gICAgICAgICAgICAgICAgcmVzb2x2ZShlLnRhcmdldC5yZXN1bHQpO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHJlYWRlci5vbmVycm9yID0gZnVuY3Rpb24oZSkge1xuICAgICAgICAgICAgICAgIHJlamVjdChlLnRhcmdldC5lcnJvcik7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgcmVhZGVyLnJlYWRBc0FycmF5QnVmZmVyKGlucHV0RGF0YSk7XG4gICAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIGlmIGRhdGEgaXMgYWxyZWFkeSBhIHByb21pc2UsIHRoaXMgZmxhdHRlbiBpdC5cbiAgICAgICAgcHJvbWlzZSA9IGV4dGVybmFsLlByb21pc2UucmVzb2x2ZShpbnB1dERhdGEpO1xuICAgIH1cblxuICAgIHJldHVybiBwcm9taXNlLnRoZW4oZnVuY3Rpb24oZGF0YSkge1xuICAgICAgICB2YXIgZGF0YVR5cGUgPSBleHBvcnRzLmdldFR5cGVPZihkYXRhKTtcblxuICAgICAgICBpZiAoIWRhdGFUeXBlKSB7XG4gICAgICAgICAgICByZXR1cm4gZXh0ZXJuYWwuUHJvbWlzZS5yZWplY3QoXG4gICAgICAgICAgICAgICAgbmV3IEVycm9yKFwiVGhlIGRhdGEgb2YgJ1wiICsgbmFtZSArIFwiJyBpcyBpbiBhbiB1bnN1cHBvcnRlZCBmb3JtYXQgIVwiKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBzcGVjaWFsIGNhc2UgOiBpdCdzIHdheSBlYXNpZXIgdG8gd29yayB3aXRoIFVpbnQ4QXJyYXkgdGhhbiB3aXRoIEFycmF5QnVmZmVyXG4gICAgICAgIGlmIChkYXRhVHlwZSA9PT0gXCJhcnJheWJ1ZmZlclwiKSB7XG4gICAgICAgICAgICBkYXRhID0gZXhwb3J0cy50cmFuc2Zvcm1UbyhcInVpbnQ4YXJyYXlcIiwgZGF0YSk7XG4gICAgICAgIH0gZWxzZSBpZiAoZGF0YVR5cGUgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgIGlmIChpc0Jhc2U2NCkge1xuICAgICAgICAgICAgICAgIGRhdGEgPSBiYXNlNjQuZGVjb2RlKGRhdGEpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoaXNCaW5hcnkpIHtcbiAgICAgICAgICAgICAgICAvLyBvcHRpbWl6ZWRCaW5hcnlTdHJpbmcgPT09IHRydWUgbWVhbnMgdGhhdCB0aGUgZmlsZSBoYXMgYWxyZWFkeSBiZWVuIGZpbHRlcmVkIHdpdGggYSAweEZGIG1hc2tcbiAgICAgICAgICAgICAgICBpZiAoaXNPcHRpbWl6ZWRCaW5hcnlTdHJpbmcgIT09IHRydWUpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gdGhpcyBpcyBhIHN0cmluZywgbm90IGluIGEgYmFzZTY0IGZvcm1hdC5cbiAgICAgICAgICAgICAgICAgICAgLy8gQmUgc3VyZSB0aGF0IHRoaXMgaXMgYSBjb3JyZWN0IFwiYmluYXJ5IHN0cmluZ1wiXG4gICAgICAgICAgICAgICAgICAgIGRhdGEgPSBzdHJpbmcyYmluYXJ5KGRhdGEpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZGF0YTtcbiAgICB9KTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG52YXIgcmVhZGVyRm9yID0gcmVxdWlyZSgnLi9yZWFkZXIvcmVhZGVyRm9yJyk7XG52YXIgdXRpbHMgPSByZXF1aXJlKCcuL3V0aWxzJyk7XG52YXIgc2lnID0gcmVxdWlyZSgnLi9zaWduYXR1cmUnKTtcbnZhciBaaXBFbnRyeSA9IHJlcXVpcmUoJy4vemlwRW50cnknKTtcbnZhciB1dGY4ID0gcmVxdWlyZSgnLi91dGY4Jyk7XG52YXIgc3VwcG9ydCA9IHJlcXVpcmUoJy4vc3VwcG9ydCcpO1xuLy8gIGNsYXNzIFppcEVudHJpZXMge3t7XG4vKipcbiAqIEFsbCB0aGUgZW50cmllcyBpbiB0aGUgemlwIGZpbGUuXG4gKiBAY29uc3RydWN0b3JcbiAqIEBwYXJhbSB7T2JqZWN0fSBsb2FkT3B0aW9ucyBPcHRpb25zIGZvciBsb2FkaW5nIHRoZSBzdHJlYW0uXG4gKi9cbmZ1bmN0aW9uIFppcEVudHJpZXMobG9hZE9wdGlvbnMpIHtcbiAgICB0aGlzLmZpbGVzID0gW107XG4gICAgdGhpcy5sb2FkT3B0aW9ucyA9IGxvYWRPcHRpb25zO1xufVxuWmlwRW50cmllcy5wcm90b3R5cGUgPSB7XG4gICAgLyoqXG4gICAgICogQ2hlY2sgdGhhdCB0aGUgcmVhZGVyIGlzIG9uIHRoZSBzcGVmaWNpZWQgc2lnbmF0dXJlLlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBleHBlY3RlZFNpZ25hdHVyZSB0aGUgZXhwZWN0ZWQgc2lnbmF0dXJlLlxuICAgICAqIEB0aHJvd3Mge0Vycm9yfSBpZiBpdCBpcyBhbiBvdGhlciBzaWduYXR1cmUuXG4gICAgICovXG4gICAgY2hlY2tTaWduYXR1cmU6IGZ1bmN0aW9uKGV4cGVjdGVkU2lnbmF0dXJlKSB7XG4gICAgICAgIGlmICghdGhpcy5yZWFkZXIucmVhZEFuZENoZWNrU2lnbmF0dXJlKGV4cGVjdGVkU2lnbmF0dXJlKSkge1xuICAgICAgICAgICAgdGhpcy5yZWFkZXIuaW5kZXggLT0gNDtcbiAgICAgICAgICAgIHZhciBzaWduYXR1cmUgPSB0aGlzLnJlYWRlci5yZWFkU3RyaW5nKDQpO1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQ29ycnVwdGVkIHppcCBvciBidWcgOiB1bmV4cGVjdGVkIHNpZ25hdHVyZSBcIiArIFwiKFwiICsgdXRpbHMucHJldHR5KHNpZ25hdHVyZSkgKyBcIiwgZXhwZWN0ZWQgXCIgKyB1dGlscy5wcmV0dHkoZXhwZWN0ZWRTaWduYXR1cmUpICsgXCIpXCIpO1xuICAgICAgICB9XG4gICAgfSxcbiAgICAvKipcbiAgICAgKiBDaGVjayBpZiB0aGUgZ2l2ZW4gc2lnbmF0dXJlIGlzIGF0IHRoZSBnaXZlbiBpbmRleC5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gYXNrZWRJbmRleCB0aGUgaW5kZXggdG8gY2hlY2suXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGV4cGVjdGVkU2lnbmF0dXJlIHRoZSBzaWduYXR1cmUgdG8gZXhwZWN0LlxuICAgICAqIEByZXR1cm4ge2Jvb2xlYW59IHRydWUgaWYgdGhlIHNpZ25hdHVyZSBpcyBoZXJlLCBmYWxzZSBvdGhlcndpc2UuXG4gICAgICovXG4gICAgaXNTaWduYXR1cmU6IGZ1bmN0aW9uKGFza2VkSW5kZXgsIGV4cGVjdGVkU2lnbmF0dXJlKSB7XG4gICAgICAgIHZhciBjdXJyZW50SW5kZXggPSB0aGlzLnJlYWRlci5pbmRleDtcbiAgICAgICAgdGhpcy5yZWFkZXIuc2V0SW5kZXgoYXNrZWRJbmRleCk7XG4gICAgICAgIHZhciBzaWduYXR1cmUgPSB0aGlzLnJlYWRlci5yZWFkU3RyaW5nKDQpO1xuICAgICAgICB2YXIgcmVzdWx0ID0gc2lnbmF0dXJlID09PSBleHBlY3RlZFNpZ25hdHVyZTtcbiAgICAgICAgdGhpcy5yZWFkZXIuc2V0SW5kZXgoY3VycmVudEluZGV4KTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9LFxuICAgIC8qKlxuICAgICAqIFJlYWQgdGhlIGVuZCBvZiB0aGUgY2VudHJhbCBkaXJlY3RvcnkuXG4gICAgICovXG4gICAgcmVhZEJsb2NrRW5kT2ZDZW50cmFsOiBmdW5jdGlvbigpIHtcbiAgICAgICAgdGhpcy5kaXNrTnVtYmVyID0gdGhpcy5yZWFkZXIucmVhZEludCgyKTtcbiAgICAgICAgdGhpcy5kaXNrV2l0aENlbnRyYWxEaXJTdGFydCA9IHRoaXMucmVhZGVyLnJlYWRJbnQoMik7XG4gICAgICAgIHRoaXMuY2VudHJhbERpclJlY29yZHNPblRoaXNEaXNrID0gdGhpcy5yZWFkZXIucmVhZEludCgyKTtcbiAgICAgICAgdGhpcy5jZW50cmFsRGlyUmVjb3JkcyA9IHRoaXMucmVhZGVyLnJlYWRJbnQoMik7XG4gICAgICAgIHRoaXMuY2VudHJhbERpclNpemUgPSB0aGlzLnJlYWRlci5yZWFkSW50KDQpO1xuICAgICAgICB0aGlzLmNlbnRyYWxEaXJPZmZzZXQgPSB0aGlzLnJlYWRlci5yZWFkSW50KDQpO1xuXG4gICAgICAgIHRoaXMuemlwQ29tbWVudExlbmd0aCA9IHRoaXMucmVhZGVyLnJlYWRJbnQoMik7XG4gICAgICAgIC8vIHdhcm5pbmcgOiB0aGUgZW5jb2RpbmcgZGVwZW5kcyBvZiB0aGUgc3lzdGVtIGxvY2FsZVxuICAgICAgICAvLyBPbiBhIGxpbnV4IG1hY2hpbmUgd2l0aCBMQU5HPWVuX1VTLnV0ZjgsIHRoaXMgZmllbGQgaXMgdXRmOCBlbmNvZGVkLlxuICAgICAgICAvLyBPbiBhIHdpbmRvd3MgbWFjaGluZSwgdGhpcyBmaWVsZCBpcyBlbmNvZGVkIHdpdGggdGhlIGxvY2FsaXplZCB3aW5kb3dzIGNvZGUgcGFnZS5cbiAgICAgICAgdmFyIHppcENvbW1lbnQgPSB0aGlzLnJlYWRlci5yZWFkRGF0YSh0aGlzLnppcENvbW1lbnRMZW5ndGgpO1xuICAgICAgICB2YXIgZGVjb2RlUGFyYW1UeXBlID0gc3VwcG9ydC51aW50OGFycmF5ID8gXCJ1aW50OGFycmF5XCIgOiBcImFycmF5XCI7XG4gICAgICAgIC8vIFRvIGdldCBjb25zaXN0ZW50IGJlaGF2aW9yIHdpdGggdGhlIGdlbmVyYXRpb24gcGFydCwgd2Ugd2lsbCBhc3N1bWUgdGhhdFxuICAgICAgICAvLyB0aGlzIGlzIHV0ZjggZW5jb2RlZCB1bmxlc3Mgc3BlY2lmaWVkIG90aGVyd2lzZS5cbiAgICAgICAgdmFyIGRlY29kZUNvbnRlbnQgPSB1dGlscy50cmFuc2Zvcm1UbyhkZWNvZGVQYXJhbVR5cGUsIHppcENvbW1lbnQpO1xuICAgICAgICB0aGlzLnppcENvbW1lbnQgPSB0aGlzLmxvYWRPcHRpb25zLmRlY29kZUZpbGVOYW1lKGRlY29kZUNvbnRlbnQpO1xuICAgIH0sXG4gICAgLyoqXG4gICAgICogUmVhZCB0aGUgZW5kIG9mIHRoZSBaaXAgNjQgY2VudHJhbCBkaXJlY3RvcnkuXG4gICAgICogTm90IG1lcmdlZCB3aXRoIHRoZSBtZXRob2QgcmVhZEVuZE9mQ2VudHJhbCA6XG4gICAgICogVGhlIGVuZCBvZiBjZW50cmFsIGNhbiBjb2V4aXN0IHdpdGggaXRzIFppcDY0IGJyb3RoZXIsXG4gICAgICogSSBkb24ndCB3YW50IHRvIHJlYWQgdGhlIHdyb25nIG51bWJlciBvZiBieXRlcyAhXG4gICAgICovXG4gICAgcmVhZEJsb2NrWmlwNjRFbmRPZkNlbnRyYWw6IGZ1bmN0aW9uKCkge1xuICAgICAgICB0aGlzLnppcDY0RW5kT2ZDZW50cmFsU2l6ZSA9IHRoaXMucmVhZGVyLnJlYWRJbnQoOCk7XG4gICAgICAgIHRoaXMucmVhZGVyLnNraXAoNCk7XG4gICAgICAgIC8vIHRoaXMudmVyc2lvbk1hZGVCeSA9IHRoaXMucmVhZGVyLnJlYWRTdHJpbmcoMik7XG4gICAgICAgIC8vIHRoaXMudmVyc2lvbk5lZWRlZCA9IHRoaXMucmVhZGVyLnJlYWRJbnQoMik7XG4gICAgICAgIHRoaXMuZGlza051bWJlciA9IHRoaXMucmVhZGVyLnJlYWRJbnQoNCk7XG4gICAgICAgIHRoaXMuZGlza1dpdGhDZW50cmFsRGlyU3RhcnQgPSB0aGlzLnJlYWRlci5yZWFkSW50KDQpO1xuICAgICAgICB0aGlzLmNlbnRyYWxEaXJSZWNvcmRzT25UaGlzRGlzayA9IHRoaXMucmVhZGVyLnJlYWRJbnQoOCk7XG4gICAgICAgIHRoaXMuY2VudHJhbERpclJlY29yZHMgPSB0aGlzLnJlYWRlci5yZWFkSW50KDgpO1xuICAgICAgICB0aGlzLmNlbnRyYWxEaXJTaXplID0gdGhpcy5yZWFkZXIucmVhZEludCg4KTtcbiAgICAgICAgdGhpcy5jZW50cmFsRGlyT2Zmc2V0ID0gdGhpcy5yZWFkZXIucmVhZEludCg4KTtcblxuICAgICAgICB0aGlzLnppcDY0RXh0ZW5zaWJsZURhdGEgPSB7fTtcbiAgICAgICAgdmFyIGV4dHJhRGF0YVNpemUgPSB0aGlzLnppcDY0RW5kT2ZDZW50cmFsU2l6ZSAtIDQ0LFxuICAgICAgICAgICAgaW5kZXggPSAwLFxuICAgICAgICAgICAgZXh0cmFGaWVsZElkLFxuICAgICAgICAgICAgZXh0cmFGaWVsZExlbmd0aCxcbiAgICAgICAgICAgIGV4dHJhRmllbGRWYWx1ZTtcbiAgICAgICAgd2hpbGUgKGluZGV4IDwgZXh0cmFEYXRhU2l6ZSkge1xuICAgICAgICAgICAgZXh0cmFGaWVsZElkID0gdGhpcy5yZWFkZXIucmVhZEludCgyKTtcbiAgICAgICAgICAgIGV4dHJhRmllbGRMZW5ndGggPSB0aGlzLnJlYWRlci5yZWFkSW50KDQpO1xuICAgICAgICAgICAgZXh0cmFGaWVsZFZhbHVlID0gdGhpcy5yZWFkZXIucmVhZERhdGEoZXh0cmFGaWVsZExlbmd0aCk7XG4gICAgICAgICAgICB0aGlzLnppcDY0RXh0ZW5zaWJsZURhdGFbZXh0cmFGaWVsZElkXSA9IHtcbiAgICAgICAgICAgICAgICBpZDogZXh0cmFGaWVsZElkLFxuICAgICAgICAgICAgICAgIGxlbmd0aDogZXh0cmFGaWVsZExlbmd0aCxcbiAgICAgICAgICAgICAgICB2YWx1ZTogZXh0cmFGaWVsZFZhbHVlXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgfSxcbiAgICAvKipcbiAgICAgKiBSZWFkIHRoZSBlbmQgb2YgdGhlIFppcCA2NCBjZW50cmFsIGRpcmVjdG9yeSBsb2NhdG9yLlxuICAgICAqL1xuICAgIHJlYWRCbG9ja1ppcDY0RW5kT2ZDZW50cmFsTG9jYXRvcjogZnVuY3Rpb24oKSB7XG4gICAgICAgIHRoaXMuZGlza1dpdGhaaXA2NENlbnRyYWxEaXJTdGFydCA9IHRoaXMucmVhZGVyLnJlYWRJbnQoNCk7XG4gICAgICAgIHRoaXMucmVsYXRpdmVPZmZzZXRFbmRPZlppcDY0Q2VudHJhbERpciA9IHRoaXMucmVhZGVyLnJlYWRJbnQoOCk7XG4gICAgICAgIHRoaXMuZGlza3NDb3VudCA9IHRoaXMucmVhZGVyLnJlYWRJbnQoNCk7XG4gICAgICAgIGlmICh0aGlzLmRpc2tzQ291bnQgPiAxKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJNdWx0aS12b2x1bWVzIHppcCBhcmUgbm90IHN1cHBvcnRlZFwiKTtcbiAgICAgICAgfVxuICAgIH0sXG4gICAgLyoqXG4gICAgICogUmVhZCB0aGUgbG9jYWwgZmlsZXMsIGJhc2VkIG9uIHRoZSBvZmZzZXQgcmVhZCBpbiB0aGUgY2VudHJhbCBwYXJ0LlxuICAgICAqL1xuICAgIHJlYWRMb2NhbEZpbGVzOiBmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIGksIGZpbGU7XG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCB0aGlzLmZpbGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBmaWxlID0gdGhpcy5maWxlc1tpXTtcbiAgICAgICAgICAgIHRoaXMucmVhZGVyLnNldEluZGV4KGZpbGUubG9jYWxIZWFkZXJPZmZzZXQpO1xuICAgICAgICAgICAgdGhpcy5jaGVja1NpZ25hdHVyZShzaWcuTE9DQUxfRklMRV9IRUFERVIpO1xuICAgICAgICAgICAgZmlsZS5yZWFkTG9jYWxQYXJ0KHRoaXMucmVhZGVyKTtcbiAgICAgICAgICAgIGZpbGUuaGFuZGxlVVRGOCgpO1xuICAgICAgICAgICAgZmlsZS5wcm9jZXNzQXR0cmlidXRlcygpO1xuICAgICAgICB9XG4gICAgfSxcbiAgICAvKipcbiAgICAgKiBSZWFkIHRoZSBjZW50cmFsIGRpcmVjdG9yeS5cbiAgICAgKi9cbiAgICByZWFkQ2VudHJhbERpcjogZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciBmaWxlO1xuXG4gICAgICAgIHRoaXMucmVhZGVyLnNldEluZGV4KHRoaXMuY2VudHJhbERpck9mZnNldCk7XG4gICAgICAgIHdoaWxlICh0aGlzLnJlYWRlci5yZWFkQW5kQ2hlY2tTaWduYXR1cmUoc2lnLkNFTlRSQUxfRklMRV9IRUFERVIpKSB7XG4gICAgICAgICAgICBmaWxlID0gbmV3IFppcEVudHJ5KHtcbiAgICAgICAgICAgICAgICB6aXA2NDogdGhpcy56aXA2NFxuICAgICAgICAgICAgfSwgdGhpcy5sb2FkT3B0aW9ucyk7XG4gICAgICAgICAgICBmaWxlLnJlYWRDZW50cmFsUGFydCh0aGlzLnJlYWRlcik7XG4gICAgICAgICAgICB0aGlzLmZpbGVzLnB1c2goZmlsZSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5jZW50cmFsRGlyUmVjb3JkcyAhPT0gdGhpcy5maWxlcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmNlbnRyYWxEaXJSZWNvcmRzICE9PSAwICYmIHRoaXMuZmlsZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgLy8gV2UgZXhwZWN0ZWQgc29tZSByZWNvcmRzIGJ1dCBjb3VsZG4ndCBmaW5kIEFOWS5cbiAgICAgICAgICAgICAgICAvLyBUaGlzIGlzIHJlYWxseSBzdXNwaWNpb3VzLCBhcyBpZiBzb21ldGhpbmcgd2VudCB3cm9uZy5cbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDb3JydXB0ZWQgemlwIG9yIGJ1ZzogZXhwZWN0ZWQgXCIgKyB0aGlzLmNlbnRyYWxEaXJSZWNvcmRzICsgXCIgcmVjb3JkcyBpbiBjZW50cmFsIGRpciwgZ290IFwiICsgdGhpcy5maWxlcy5sZW5ndGgpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBXZSBmb3VuZCBzb21lIHJlY29yZHMgYnV0IG5vdCBhbGwuXG4gICAgICAgICAgICAgICAgLy8gU29tZXRoaW5nIGlzIHdyb25nIGJ1dCB3ZSBnb3Qgc29tZXRoaW5nIGZvciB0aGUgdXNlcjogbm8gZXJyb3IgaGVyZS5cbiAgICAgICAgICAgICAgICAvLyBjb25zb2xlLndhcm4oXCJleHBlY3RlZFwiLCB0aGlzLmNlbnRyYWxEaXJSZWNvcmRzLCBcInJlY29yZHMgaW4gY2VudHJhbCBkaXIsIGdvdFwiLCB0aGlzLmZpbGVzLmxlbmd0aCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9LFxuICAgIC8qKlxuICAgICAqIFJlYWQgdGhlIGVuZCBvZiBjZW50cmFsIGRpcmVjdG9yeS5cbiAgICAgKi9cbiAgICByZWFkRW5kT2ZDZW50cmFsOiBmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIG9mZnNldCA9IHRoaXMucmVhZGVyLmxhc3RJbmRleE9mU2lnbmF0dXJlKHNpZy5DRU5UUkFMX0RJUkVDVE9SWV9FTkQpO1xuICAgICAgICBpZiAob2Zmc2V0IDwgMCkge1xuICAgICAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIGNvbnRlbnQgaXMgYSB0cnVuY2F0ZWQgemlwIG9yIGNvbXBsZXRlIGdhcmJhZ2UuXG4gICAgICAgICAgICAvLyBBIFwiTE9DQUxfRklMRV9IRUFERVJcIiBpcyBub3QgcmVxdWlyZWQgYXQgdGhlIGJlZ2lubmluZyAoYXV0b1xuICAgICAgICAgICAgLy8gZXh0cmFjdGlibGUgemlwIGZvciBleGFtcGxlKSBidXQgaXQgY2FuIGdpdmUgYSBnb29kIGhpbnQuXG4gICAgICAgICAgICAvLyBJZiBhbiBhamF4IHJlcXVlc3Qgd2FzIHVzZWQgd2l0aG91dCByZXNwb25zZVR5cGUsIHdlIHdpbGwgYWxzb1xuICAgICAgICAgICAgLy8gZ2V0IHVucmVhZGFibGUgZGF0YS5cbiAgICAgICAgICAgIHZhciBpc0dhcmJhZ2UgPSAhdGhpcy5pc1NpZ25hdHVyZSgwLCBzaWcuTE9DQUxfRklMRV9IRUFERVIpO1xuXG4gICAgICAgICAgICBpZiAoaXNHYXJiYWdlKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQ2FuJ3QgZmluZCBlbmQgb2YgY2VudHJhbCBkaXJlY3RvcnkgOiBpcyB0aGlzIGEgemlwIGZpbGUgPyBcIiArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiSWYgaXQgaXMsIHNlZSBodHRwOi8vc3R1ay5naXRodWIuaW8vanN6aXAvZG9jdW1lbnRhdGlvbi9ob3d0by9yZWFkX3ppcC5odG1sXCIpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDb3JydXB0ZWQgemlwIDogY2FuJ3QgZmluZCBlbmQgb2YgY2VudHJhbCBkaXJlY3RvcnlcIik7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgfVxuICAgICAgICB0aGlzLnJlYWRlci5zZXRJbmRleChvZmZzZXQpO1xuICAgICAgICB2YXIgZW5kT2ZDZW50cmFsRGlyT2Zmc2V0ID0gb2Zmc2V0O1xuICAgICAgICB0aGlzLmNoZWNrU2lnbmF0dXJlKHNpZy5DRU5UUkFMX0RJUkVDVE9SWV9FTkQpO1xuICAgICAgICB0aGlzLnJlYWRCbG9ja0VuZE9mQ2VudHJhbCgpO1xuXG5cbiAgICAgICAgLyogZXh0cmFjdCBmcm9tIHRoZSB6aXAgc3BlYyA6XG4gICAgICAgICAgICA0KSAgSWYgb25lIG9mIHRoZSBmaWVsZHMgaW4gdGhlIGVuZCBvZiBjZW50cmFsIGRpcmVjdG9yeVxuICAgICAgICAgICAgICAgIHJlY29yZCBpcyB0b28gc21hbGwgdG8gaG9sZCByZXF1aXJlZCBkYXRhLCB0aGUgZmllbGRcbiAgICAgICAgICAgICAgICBzaG91bGQgYmUgc2V0IHRvIC0xICgweEZGRkYgb3IgMHhGRkZGRkZGRikgYW5kIHRoZVxuICAgICAgICAgICAgICAgIFpJUDY0IGZvcm1hdCByZWNvcmQgc2hvdWxkIGJlIGNyZWF0ZWQuXG4gICAgICAgICAgICA1KSAgVGhlIGVuZCBvZiBjZW50cmFsIGRpcmVjdG9yeSByZWNvcmQgYW5kIHRoZVxuICAgICAgICAgICAgICAgIFppcDY0IGVuZCBvZiBjZW50cmFsIGRpcmVjdG9yeSBsb2NhdG9yIHJlY29yZCBtdXN0XG4gICAgICAgICAgICAgICAgcmVzaWRlIG9uIHRoZSBzYW1lIGRpc2sgd2hlbiBzcGxpdHRpbmcgb3Igc3Bhbm5pbmdcbiAgICAgICAgICAgICAgICBhbiBhcmNoaXZlLlxuICAgICAgICAgKi9cbiAgICAgICAgaWYgKHRoaXMuZGlza051bWJlciA9PT0gdXRpbHMuTUFYX1ZBTFVFXzE2QklUUyB8fCB0aGlzLmRpc2tXaXRoQ2VudHJhbERpclN0YXJ0ID09PSB1dGlscy5NQVhfVkFMVUVfMTZCSVRTIHx8IHRoaXMuY2VudHJhbERpclJlY29yZHNPblRoaXNEaXNrID09PSB1dGlscy5NQVhfVkFMVUVfMTZCSVRTIHx8IHRoaXMuY2VudHJhbERpclJlY29yZHMgPT09IHV0aWxzLk1BWF9WQUxVRV8xNkJJVFMgfHwgdGhpcy5jZW50cmFsRGlyU2l6ZSA9PT0gdXRpbHMuTUFYX1ZBTFVFXzMyQklUUyB8fCB0aGlzLmNlbnRyYWxEaXJPZmZzZXQgPT09IHV0aWxzLk1BWF9WQUxVRV8zMkJJVFMpIHtcbiAgICAgICAgICAgIHRoaXMuemlwNjQgPSB0cnVlO1xuXG4gICAgICAgICAgICAvKlxuICAgICAgICAgICAgV2FybmluZyA6IHRoZSB6aXA2NCBleHRlbnNpb24gaXMgc3VwcG9ydGVkLCBidXQgT05MWSBpZiB0aGUgNjRiaXRzIGludGVnZXIgcmVhZCBmcm9tXG4gICAgICAgICAgICB0aGUgemlwIGZpbGUgY2FuIGZpdCBpbnRvIGEgMzJiaXRzIGludGVnZXIuIFRoaXMgY2Fubm90IGJlIHNvbHZlZCA6IEphdmFzY3JpcHQgcmVwcmVzZW50c1xuICAgICAgICAgICAgYWxsIG51bWJlcnMgYXMgNjQtYml0IGRvdWJsZSBwcmVjaXNpb24gSUVFRSA3NTQgZmxvYXRpbmcgcG9pbnQgbnVtYmVycy5cbiAgICAgICAgICAgIFNvLCB3ZSBoYXZlIDUzYml0cyBmb3IgaW50ZWdlcnMgYW5kIGJpdHdpc2Ugb3BlcmF0aW9ucyB0cmVhdCBldmVyeXRoaW5nIGFzIDMyYml0cy5cbiAgICAgICAgICAgIHNlZSBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL0phdmFTY3JpcHQvUmVmZXJlbmNlL09wZXJhdG9ycy9CaXR3aXNlX09wZXJhdG9yc1xuICAgICAgICAgICAgYW5kIGh0dHA6Ly93d3cuZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9wdWJsaWNhdGlvbnMvZmlsZXMvRUNNQS1TVC9FQ01BLTI2Mi5wZGYgc2VjdGlvbiA4LjVcbiAgICAgICAgICAgICovXG5cbiAgICAgICAgICAgIC8vIHNob3VsZCBsb29rIGZvciBhIHppcDY0IEVPQ0QgbG9jYXRvclxuICAgICAgICAgICAgb2Zmc2V0ID0gdGhpcy5yZWFkZXIubGFzdEluZGV4T2ZTaWduYXR1cmUoc2lnLlpJUDY0X0NFTlRSQUxfRElSRUNUT1JZX0xPQ0FUT1IpO1xuICAgICAgICAgICAgaWYgKG9mZnNldCA8IDApIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDb3JydXB0ZWQgemlwIDogY2FuJ3QgZmluZCB0aGUgWklQNjQgZW5kIG9mIGNlbnRyYWwgZGlyZWN0b3J5IGxvY2F0b3JcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnJlYWRlci5zZXRJbmRleChvZmZzZXQpO1xuICAgICAgICAgICAgdGhpcy5jaGVja1NpZ25hdHVyZShzaWcuWklQNjRfQ0VOVFJBTF9ESVJFQ1RPUllfTE9DQVRPUik7XG4gICAgICAgICAgICB0aGlzLnJlYWRCbG9ja1ppcDY0RW5kT2ZDZW50cmFsTG9jYXRvcigpO1xuXG4gICAgICAgICAgICAvLyBub3cgdGhlIHppcDY0IEVPQ0QgcmVjb3JkXG4gICAgICAgICAgICBpZiAoIXRoaXMuaXNTaWduYXR1cmUodGhpcy5yZWxhdGl2ZU9mZnNldEVuZE9mWmlwNjRDZW50cmFsRGlyLCBzaWcuWklQNjRfQ0VOVFJBTF9ESVJFQ1RPUllfRU5EKSkge1xuICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUud2FybihcIlpJUDY0IGVuZCBvZiBjZW50cmFsIGRpcmVjdG9yeSBub3Qgd2hlcmUgZXhwZWN0ZWQuXCIpO1xuICAgICAgICAgICAgICAgIHRoaXMucmVsYXRpdmVPZmZzZXRFbmRPZlppcDY0Q2VudHJhbERpciA9IHRoaXMucmVhZGVyLmxhc3RJbmRleE9mU2lnbmF0dXJlKHNpZy5aSVA2NF9DRU5UUkFMX0RJUkVDVE9SWV9FTkQpO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLnJlbGF0aXZlT2Zmc2V0RW5kT2ZaaXA2NENlbnRyYWxEaXIgPCAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkNvcnJ1cHRlZCB6aXAgOiBjYW4ndCBmaW5kIHRoZSBaSVA2NCBlbmQgb2YgY2VudHJhbCBkaXJlY3RvcnlcIik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5yZWFkZXIuc2V0SW5kZXgodGhpcy5yZWxhdGl2ZU9mZnNldEVuZE9mWmlwNjRDZW50cmFsRGlyKTtcbiAgICAgICAgICAgIHRoaXMuY2hlY2tTaWduYXR1cmUoc2lnLlpJUDY0X0NFTlRSQUxfRElSRUNUT1JZX0VORCk7XG4gICAgICAgICAgICB0aGlzLnJlYWRCbG9ja1ppcDY0RW5kT2ZDZW50cmFsKCk7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgZXhwZWN0ZWRFbmRPZkNlbnRyYWxEaXJPZmZzZXQgPSB0aGlzLmNlbnRyYWxEaXJPZmZzZXQgKyB0aGlzLmNlbnRyYWxEaXJTaXplO1xuICAgICAgICBpZiAodGhpcy56aXA2NCkge1xuICAgICAgICAgICAgZXhwZWN0ZWRFbmRPZkNlbnRyYWxEaXJPZmZzZXQgKz0gMjA7IC8vIGVuZCBvZiBjZW50cmFsIGRpciA2NCBsb2NhdG9yXG4gICAgICAgICAgICBleHBlY3RlZEVuZE9mQ2VudHJhbERpck9mZnNldCArPSAxMiAvKiBzaG91bGQgbm90IGluY2x1ZGUgdGhlIGxlYWRpbmcgMTIgYnl0ZXMgKi8gKyB0aGlzLnppcDY0RW5kT2ZDZW50cmFsU2l6ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBleHRyYUJ5dGVzID0gZW5kT2ZDZW50cmFsRGlyT2Zmc2V0IC0gZXhwZWN0ZWRFbmRPZkNlbnRyYWxEaXJPZmZzZXQ7XG5cbiAgICAgICAgaWYgKGV4dHJhQnl0ZXMgPiAwKSB7XG4gICAgICAgICAgICAvLyBjb25zb2xlLndhcm4oZXh0cmFCeXRlcywgXCJleHRyYSBieXRlcyBhdCBiZWdpbm5pbmcgb3Igd2l0aGluIHppcGZpbGVcIik7XG4gICAgICAgICAgICBpZiAodGhpcy5pc1NpZ25hdHVyZShlbmRPZkNlbnRyYWxEaXJPZmZzZXQsIHNpZy5DRU5UUkFMX0ZJTEVfSEVBREVSKSkge1xuICAgICAgICAgICAgICAgIC8vIFRoZSBvZmZzZXRzIHNlZW0gd3JvbmcsIGJ1dCB3ZSBoYXZlIHNvbWV0aGluZyBhdCB0aGUgc3BlY2lmaWVkIG9mZnNldC5cbiAgICAgICAgICAgICAgICAvLyBTb+KApiB3ZSBrZWVwIGl0LlxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyB0aGUgb2Zmc2V0IGlzIHdyb25nLCB1cGRhdGUgdGhlIFwiemVyb1wiIG9mIHRoZSByZWFkZXJcbiAgICAgICAgICAgICAgICAvLyB0aGlzIGhhcHBlbnMgaWYgZGF0YSBoYXMgYmVlbiBwcmVwZW5kZWQgKGNyeCBmaWxlcyBmb3IgZXhhbXBsZSlcbiAgICAgICAgICAgICAgICB0aGlzLnJlYWRlci56ZXJvID0gZXh0cmFCeXRlcztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChleHRyYUJ5dGVzIDwgMCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQ29ycnVwdGVkIHppcDogbWlzc2luZyBcIiArIE1hdGguYWJzKGV4dHJhQnl0ZXMpICsgXCIgYnl0ZXMuXCIpO1xuICAgICAgICB9XG4gICAgfSxcbiAgICBwcmVwYXJlUmVhZGVyOiBmdW5jdGlvbihkYXRhKSB7XG4gICAgICAgIHRoaXMucmVhZGVyID0gcmVhZGVyRm9yKGRhdGEpO1xuICAgIH0sXG4gICAgLyoqXG4gICAgICogUmVhZCBhIHppcCBmaWxlIGFuZCBjcmVhdGUgWmlwRW50cmllcy5cbiAgICAgKiBAcGFyYW0ge1N0cmluZ3xBcnJheUJ1ZmZlcnxVaW50OEFycmF5fEJ1ZmZlcn0gZGF0YSB0aGUgYmluYXJ5IHN0cmluZyByZXByZXNlbnRpbmcgYSB6aXAgZmlsZS5cbiAgICAgKi9cbiAgICBsb2FkOiBmdW5jdGlvbihkYXRhKSB7XG4gICAgICAgIHRoaXMucHJlcGFyZVJlYWRlcihkYXRhKTtcbiAgICAgICAgdGhpcy5yZWFkRW5kT2ZDZW50cmFsKCk7XG4gICAgICAgIHRoaXMucmVhZENlbnRyYWxEaXIoKTtcbiAgICAgICAgdGhpcy5yZWFkTG9jYWxGaWxlcygpO1xuICAgIH1cbn07XG4vLyB9fX0gZW5kIG9mIFppcEVudHJpZXNcbm1vZHVsZS5leHBvcnRzID0gWmlwRW50cmllcztcbiIsIid1c2Ugc3RyaWN0JztcbnZhciByZWFkZXJGb3IgPSByZXF1aXJlKCcuL3JlYWRlci9yZWFkZXJGb3InKTtcbnZhciB1dGlscyA9IHJlcXVpcmUoJy4vdXRpbHMnKTtcbnZhciBDb21wcmVzc2VkT2JqZWN0ID0gcmVxdWlyZSgnLi9jb21wcmVzc2VkT2JqZWN0Jyk7XG52YXIgY3JjMzJmbiA9IHJlcXVpcmUoJy4vY3JjMzInKTtcbnZhciB1dGY4ID0gcmVxdWlyZSgnLi91dGY4Jyk7XG52YXIgY29tcHJlc3Npb25zID0gcmVxdWlyZSgnLi9jb21wcmVzc2lvbnMnKTtcbnZhciBzdXBwb3J0ID0gcmVxdWlyZSgnLi9zdXBwb3J0Jyk7XG5cbnZhciBNQURFX0JZX0RPUyA9IDB4MDA7XG52YXIgTUFERV9CWV9VTklYID0gMHgwMztcblxuLyoqXG4gKiBGaW5kIGEgY29tcHJlc3Npb24gcmVnaXN0ZXJlZCBpbiBKU1ppcC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBjb21wcmVzc2lvbk1ldGhvZCB0aGUgbWV0aG9kIG1hZ2ljIHRvIGZpbmQuXG4gKiBAcmV0dXJuIHtPYmplY3R8bnVsbH0gdGhlIEpTWmlwIGNvbXByZXNzaW9uIG9iamVjdCwgbnVsbCBpZiBub25lIGZvdW5kLlxuICovXG52YXIgZmluZENvbXByZXNzaW9uID0gZnVuY3Rpb24oY29tcHJlc3Npb25NZXRob2QpIHtcbiAgICBmb3IgKHZhciBtZXRob2QgaW4gY29tcHJlc3Npb25zKSB7XG4gICAgICAgIGlmICghY29tcHJlc3Npb25zLmhhc093blByb3BlcnR5KG1ldGhvZCkpIHtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjb21wcmVzc2lvbnNbbWV0aG9kXS5tYWdpYyA9PT0gY29tcHJlc3Npb25NZXRob2QpIHtcbiAgICAgICAgICAgIHJldHVybiBjb21wcmVzc2lvbnNbbWV0aG9kXTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbn07XG5cbi8vIGNsYXNzIFppcEVudHJ5IHt7e1xuLyoqXG4gKiBBbiBlbnRyeSBpbiB0aGUgemlwIGZpbGUuXG4gKiBAY29uc3RydWN0b3JcbiAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIE9wdGlvbnMgb2YgdGhlIGN1cnJlbnQgZmlsZS5cbiAqIEBwYXJhbSB7T2JqZWN0fSBsb2FkT3B0aW9ucyBPcHRpb25zIGZvciBsb2FkaW5nIHRoZSBzdHJlYW0uXG4gKi9cbmZ1bmN0aW9uIFppcEVudHJ5KG9wdGlvbnMsIGxvYWRPcHRpb25zKSB7XG4gICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucztcbiAgICB0aGlzLmxvYWRPcHRpb25zID0gbG9hZE9wdGlvbnM7XG59XG5aaXBFbnRyeS5wcm90b3R5cGUgPSB7XG4gICAgLyoqXG4gICAgICogc2F5IGlmIHRoZSBmaWxlIGlzIGVuY3J5cHRlZC5cbiAgICAgKiBAcmV0dXJuIHtib29sZWFufSB0cnVlIGlmIHRoZSBmaWxlIGlzIGVuY3J5cHRlZCwgZmFsc2Ugb3RoZXJ3aXNlLlxuICAgICAqL1xuICAgIGlzRW5jcnlwdGVkOiBmdW5jdGlvbigpIHtcbiAgICAgICAgLy8gYml0IDEgaXMgc2V0XG4gICAgICAgIHJldHVybiAodGhpcy5iaXRGbGFnICYgMHgwMDAxKSA9PT0gMHgwMDAxO1xuICAgIH0sXG4gICAgLyoqXG4gICAgICogc2F5IGlmIHRoZSBmaWxlIGhhcyB1dGYtOCBmaWxlbmFtZS9jb21tZW50LlxuICAgICAqIEByZXR1cm4ge2Jvb2xlYW59IHRydWUgaWYgdGhlIGZpbGVuYW1lL2NvbW1lbnQgaXMgaW4gdXRmLTgsIGZhbHNlIG90aGVyd2lzZS5cbiAgICAgKi9cbiAgICB1c2VVVEY4OiBmdW5jdGlvbigpIHtcbiAgICAgICAgLy8gYml0IDExIGlzIHNldFxuICAgICAgICByZXR1cm4gKHRoaXMuYml0RmxhZyAmIDB4MDgwMCkgPT09IDB4MDgwMDtcbiAgICB9LFxuICAgIC8qKlxuICAgICAqIFJlYWQgdGhlIGxvY2FsIHBhcnQgb2YgYSB6aXAgZmlsZSBhbmQgYWRkIHRoZSBpbmZvIGluIHRoaXMgb2JqZWN0LlxuICAgICAqIEBwYXJhbSB7RGF0YVJlYWRlcn0gcmVhZGVyIHRoZSByZWFkZXIgdG8gdXNlLlxuICAgICAqL1xuICAgIHJlYWRMb2NhbFBhcnQ6IGZ1bmN0aW9uKHJlYWRlcikge1xuICAgICAgICB2YXIgY29tcHJlc3Npb24sIGxvY2FsRXh0cmFGaWVsZHNMZW5ndGg7XG5cbiAgICAgICAgLy8gd2UgYWxyZWFkeSBrbm93IGV2ZXJ5dGhpbmcgZnJvbSB0aGUgY2VudHJhbCBkaXIgIVxuICAgICAgICAvLyBJZiB0aGUgY2VudHJhbCBkaXIgZGF0YSBhcmUgZmFsc2UsIHdlIGFyZSBkb29tZWQuXG4gICAgICAgIC8vIE9uIHRoZSBicmlnaHQgc2lkZSwgdGhlIGxvY2FsIHBhcnQgaXMgc2NhcnkgIDogemlwNjQsIGRhdGEgZGVzY3JpcHRvcnMsIGJvdGgsIGV0Yy5cbiAgICAgICAgLy8gVGhlIGxlc3MgZGF0YSB3ZSBnZXQgaGVyZSwgdGhlIG1vcmUgcmVsaWFibGUgdGhpcyBzaG91bGQgYmUuXG4gICAgICAgIC8vIExldCdzIHNraXAgdGhlIHdob2xlIGhlYWRlciBhbmQgZGFzaCB0byB0aGUgZGF0YSAhXG4gICAgICAgIHJlYWRlci5za2lwKDIyKTtcbiAgICAgICAgLy8gaW4gc29tZSB6aXAgY3JlYXRlZCBvbiB3aW5kb3dzLCB0aGUgZmlsZW5hbWUgc3RvcmVkIGluIHRoZSBjZW50cmFsIGRpciBjb250YWlucyBcXCBpbnN0ZWFkIG9mIC8uXG4gICAgICAgIC8vIFN0cmFuZ2VseSwgdGhlIGZpbGVuYW1lIGhlcmUgaXMgT0suXG4gICAgICAgIC8vIEkgd291bGQgbG92ZSB0byB0cmVhdCB0aGVzZSB6aXAgZmlsZXMgYXMgY29ycnVwdGVkIChzZWUgaHR0cDovL3d3dy5pbmZvLXppcC5vcmcvRkFRLmh0bWwjYmFja3NsYXNoZXNcbiAgICAgICAgLy8gb3IgQVBQTk9URSM0LjQuMTcuMSwgXCJBbGwgc2xhc2hlcyBNVVNUIGJlIGZvcndhcmQgc2xhc2hlcyAnLydcIikgYnV0IHRoZXJlIGFyZSBhIGxvdCBvZiBiYWQgemlwIGdlbmVyYXRvcnMuLi5cbiAgICAgICAgLy8gU2VhcmNoIFwidW56aXAgbWlzbWF0Y2hpbmcgXCJsb2NhbFwiIGZpbGVuYW1lIGNvbnRpbnVpbmcgd2l0aCBcImNlbnRyYWxcIiBmaWxlbmFtZSB2ZXJzaW9uXCIgb25cbiAgICAgICAgLy8gdGhlIGludGVybmV0LlxuICAgICAgICAvL1xuICAgICAgICAvLyBJIHRoaW5rIEkgc2VlIHRoZSBsb2dpYyBoZXJlIDogdGhlIGNlbnRyYWwgZGlyZWN0b3J5IGlzIHVzZWQgdG8gZGlzcGxheVxuICAgICAgICAvLyBjb250ZW50IGFuZCB0aGUgbG9jYWwgZGlyZWN0b3J5IGlzIHVzZWQgdG8gZXh0cmFjdCB0aGUgZmlsZXMuIE1peGluZyAvIGFuZCBcXFxuICAgICAgICAvLyBtYXkgYmUgdXNlZCB0byBkaXNwbGF5IFxcIHRvIHdpbmRvd3MgdXNlcnMgYW5kIHVzZSAvIHdoZW4gZXh0cmFjdGluZyB0aGUgZmlsZXMuXG4gICAgICAgIC8vIFVuZm9ydHVuYXRlbHksIHRoaXMgbGVhZCBhbHNvIHRvIHNvbWUgaXNzdWVzIDogaHR0cDovL3NlY2xpc3RzLm9yZy9mdWxsZGlzY2xvc3VyZS8yMDA5L1NlcC8zOTRcbiAgICAgICAgdGhpcy5maWxlTmFtZUxlbmd0aCA9IHJlYWRlci5yZWFkSW50KDIpO1xuICAgICAgICBsb2NhbEV4dHJhRmllbGRzTGVuZ3RoID0gcmVhZGVyLnJlYWRJbnQoMik7IC8vIGNhbid0IGJlIHN1cmUgdGhpcyB3aWxsIGJlIHRoZSBzYW1lIGFzIHRoZSBjZW50cmFsIGRpclxuICAgICAgICAvLyB0aGUgZmlsZU5hbWUgaXMgc3RvcmVkIGFzIGJpbmFyeSBkYXRhLCB0aGUgaGFuZGxlVVRGOCBtZXRob2Qgd2lsbCB0YWtlIGNhcmUgb2YgdGhlIGVuY29kaW5nLlxuICAgICAgICB0aGlzLmZpbGVOYW1lID0gcmVhZGVyLnJlYWREYXRhKHRoaXMuZmlsZU5hbWVMZW5ndGgpO1xuICAgICAgICByZWFkZXIuc2tpcChsb2NhbEV4dHJhRmllbGRzTGVuZ3RoKTtcblxuICAgICAgICBpZiAodGhpcy5jb21wcmVzc2VkU2l6ZSA9PT0gLTEgfHwgdGhpcy51bmNvbXByZXNzZWRTaXplID09PSAtMSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQnVnIG9yIGNvcnJ1cHRlZCB6aXAgOiBkaWRuJ3QgZ2V0IGVub3VnaCBpbmZvcm1hdGlvbnMgZnJvbSB0aGUgY2VudHJhbCBkaXJlY3RvcnkgXCIgKyBcIihjb21wcmVzc2VkU2l6ZSA9PT0gLTEgfHwgdW5jb21wcmVzc2VkU2l6ZSA9PT0gLTEpXCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29tcHJlc3Npb24gPSBmaW5kQ29tcHJlc3Npb24odGhpcy5jb21wcmVzc2lvbk1ldGhvZCk7XG4gICAgICAgIGlmIChjb21wcmVzc2lvbiA9PT0gbnVsbCkgeyAvLyBubyBjb21wcmVzc2lvbiBmb3VuZFxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQ29ycnVwdGVkIHppcCA6IGNvbXByZXNzaW9uIFwiICsgdXRpbHMucHJldHR5KHRoaXMuY29tcHJlc3Npb25NZXRob2QpICsgXCIgdW5rbm93biAoaW5uZXIgZmlsZSA6IFwiICsgdXRpbHMudHJhbnNmb3JtVG8oXCJzdHJpbmdcIiwgdGhpcy5maWxlTmFtZSkgKyBcIilcIik7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5kZWNvbXByZXNzZWQgPSBuZXcgQ29tcHJlc3NlZE9iamVjdCh0aGlzLmNvbXByZXNzZWRTaXplLCB0aGlzLnVuY29tcHJlc3NlZFNpemUsIHRoaXMuY3JjMzIsIGNvbXByZXNzaW9uLCByZWFkZXIucmVhZERhdGEodGhpcy5jb21wcmVzc2VkU2l6ZSkpO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBSZWFkIHRoZSBjZW50cmFsIHBhcnQgb2YgYSB6aXAgZmlsZSBhbmQgYWRkIHRoZSBpbmZvIGluIHRoaXMgb2JqZWN0LlxuICAgICAqIEBwYXJhbSB7RGF0YVJlYWRlcn0gcmVhZGVyIHRoZSByZWFkZXIgdG8gdXNlLlxuICAgICAqL1xuICAgIHJlYWRDZW50cmFsUGFydDogZnVuY3Rpb24ocmVhZGVyKSB7XG4gICAgICAgIHRoaXMudmVyc2lvbk1hZGVCeSA9IHJlYWRlci5yZWFkSW50KDIpO1xuICAgICAgICByZWFkZXIuc2tpcCgyKTtcbiAgICAgICAgLy8gdGhpcy52ZXJzaW9uTmVlZGVkID0gcmVhZGVyLnJlYWRJbnQoMik7XG4gICAgICAgIHRoaXMuYml0RmxhZyA9IHJlYWRlci5yZWFkSW50KDIpO1xuICAgICAgICB0aGlzLmNvbXByZXNzaW9uTWV0aG9kID0gcmVhZGVyLnJlYWRTdHJpbmcoMik7XG4gICAgICAgIHRoaXMuZGF0ZSA9IHJlYWRlci5yZWFkRGF0ZSgpO1xuICAgICAgICB0aGlzLmNyYzMyID0gcmVhZGVyLnJlYWRJbnQoNCk7XG4gICAgICAgIHRoaXMuY29tcHJlc3NlZFNpemUgPSByZWFkZXIucmVhZEludCg0KTtcbiAgICAgICAgdGhpcy51bmNvbXByZXNzZWRTaXplID0gcmVhZGVyLnJlYWRJbnQoNCk7XG4gICAgICAgIHZhciBmaWxlTmFtZUxlbmd0aCA9IHJlYWRlci5yZWFkSW50KDIpO1xuICAgICAgICB0aGlzLmV4dHJhRmllbGRzTGVuZ3RoID0gcmVhZGVyLnJlYWRJbnQoMik7XG4gICAgICAgIHRoaXMuZmlsZUNvbW1lbnRMZW5ndGggPSByZWFkZXIucmVhZEludCgyKTtcbiAgICAgICAgdGhpcy5kaXNrTnVtYmVyU3RhcnQgPSByZWFkZXIucmVhZEludCgyKTtcbiAgICAgICAgdGhpcy5pbnRlcm5hbEZpbGVBdHRyaWJ1dGVzID0gcmVhZGVyLnJlYWRJbnQoMik7XG4gICAgICAgIHRoaXMuZXh0ZXJuYWxGaWxlQXR0cmlidXRlcyA9IHJlYWRlci5yZWFkSW50KDQpO1xuICAgICAgICB0aGlzLmxvY2FsSGVhZGVyT2Zmc2V0ID0gcmVhZGVyLnJlYWRJbnQoNCk7XG5cbiAgICAgICAgaWYgKHRoaXMuaXNFbmNyeXB0ZWQoKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiRW5jcnlwdGVkIHppcCBhcmUgbm90IHN1cHBvcnRlZFwiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHdpbGwgYmUgcmVhZCBpbiB0aGUgbG9jYWwgcGFydCwgc2VlIHRoZSBjb21tZW50cyB0aGVyZVxuICAgICAgICByZWFkZXIuc2tpcChmaWxlTmFtZUxlbmd0aCk7XG4gICAgICAgIHRoaXMucmVhZEV4dHJhRmllbGRzKHJlYWRlcik7XG4gICAgICAgIHRoaXMucGFyc2VaSVA2NEV4dHJhRmllbGQocmVhZGVyKTtcbiAgICAgICAgdGhpcy5maWxlQ29tbWVudCA9IHJlYWRlci5yZWFkRGF0YSh0aGlzLmZpbGVDb21tZW50TGVuZ3RoKTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogUGFyc2UgdGhlIGV4dGVybmFsIGZpbGUgYXR0cmlidXRlcyBhbmQgZ2V0IHRoZSB1bml4L2RvcyBwZXJtaXNzaW9ucy5cbiAgICAgKi9cbiAgICBwcm9jZXNzQXR0cmlidXRlczogZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLnVuaXhQZXJtaXNzaW9ucyA9IG51bGw7XG4gICAgICAgIHRoaXMuZG9zUGVybWlzc2lvbnMgPSBudWxsO1xuICAgICAgICB2YXIgbWFkZUJ5ID0gdGhpcy52ZXJzaW9uTWFkZUJ5ID4+IDg7XG5cbiAgICAgICAgLy8gQ2hlY2sgaWYgd2UgaGF2ZSB0aGUgRE9TIGRpcmVjdG9yeSBmbGFnIHNldC5cbiAgICAgICAgLy8gV2UgbG9vayBmb3IgaXQgaW4gdGhlIERPUyBhbmQgVU5JWCBwZXJtaXNzaW9uc1xuICAgICAgICAvLyBidXQgc29tZSB1bmtub3duIHBsYXRmb3JtIGNvdWxkIHNldCBpdCBhcyBhIGNvbXBhdGliaWxpdHkgZmxhZy5cbiAgICAgICAgdGhpcy5kaXIgPSB0aGlzLmV4dGVybmFsRmlsZUF0dHJpYnV0ZXMgJiAweDAwMTAgPyB0cnVlIDogZmFsc2U7XG5cbiAgICAgICAgaWYobWFkZUJ5ID09PSBNQURFX0JZX0RPUykge1xuICAgICAgICAgICAgLy8gZmlyc3QgNiBiaXRzICgwIHRvIDUpXG4gICAgICAgICAgICB0aGlzLmRvc1Blcm1pc3Npb25zID0gdGhpcy5leHRlcm5hbEZpbGVBdHRyaWJ1dGVzICYgMHgzRjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmKG1hZGVCeSA9PT0gTUFERV9CWV9VTklYKSB7XG4gICAgICAgICAgICB0aGlzLnVuaXhQZXJtaXNzaW9ucyA9ICh0aGlzLmV4dGVybmFsRmlsZUF0dHJpYnV0ZXMgPj4gMTYpICYgMHhGRkZGO1xuICAgICAgICAgICAgLy8gdGhlIG9jdGFsIHBlcm1pc3Npb25zIGFyZSBpbiAodGhpcy51bml4UGVybWlzc2lvbnMgJiAweDAxRkYpLnRvU3RyaW5nKDgpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gZmFpbCBzYWZlIDogaWYgdGhlIG5hbWUgZW5kcyB3aXRoIGEgLyBpdCBwcm9iYWJseSBtZWFucyBhIGZvbGRlclxuICAgICAgICBpZiAoIXRoaXMuZGlyICYmIHRoaXMuZmlsZU5hbWVTdHIuc2xpY2UoLTEpID09PSAnLycpIHtcbiAgICAgICAgICAgIHRoaXMuZGlyID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBQYXJzZSB0aGUgWklQNjQgZXh0cmEgZmllbGQgYW5kIG1lcmdlIHRoZSBpbmZvIGluIHRoZSBjdXJyZW50IFppcEVudHJ5LlxuICAgICAqIEBwYXJhbSB7RGF0YVJlYWRlcn0gcmVhZGVyIHRoZSByZWFkZXIgdG8gdXNlLlxuICAgICAqL1xuICAgIHBhcnNlWklQNjRFeHRyYUZpZWxkOiBmdW5jdGlvbihyZWFkZXIpIHtcblxuICAgICAgICBpZiAoIXRoaXMuZXh0cmFGaWVsZHNbMHgwMDAxXSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gc2hvdWxkIGJlIHNvbWV0aGluZywgcHJlcGFyaW5nIHRoZSBleHRyYSByZWFkZXJcbiAgICAgICAgdmFyIGV4dHJhUmVhZGVyID0gcmVhZGVyRm9yKHRoaXMuZXh0cmFGaWVsZHNbMHgwMDAxXS52YWx1ZSk7XG5cbiAgICAgICAgLy8gSSByZWFsbHkgaG9wZSB0aGF0IHRoZXNlIDY0Yml0cyBpbnRlZ2VyIGNhbiBmaXQgaW4gMzIgYml0cyBpbnRlZ2VyLCBiZWNhdXNlIGpzXG4gICAgICAgIC8vIHdvbid0IGxldCB1cyBoYXZlIG1vcmUuXG4gICAgICAgIGlmICh0aGlzLnVuY29tcHJlc3NlZFNpemUgPT09IHV0aWxzLk1BWF9WQUxVRV8zMkJJVFMpIHtcbiAgICAgICAgICAgIHRoaXMudW5jb21wcmVzc2VkU2l6ZSA9IGV4dHJhUmVhZGVyLnJlYWRJbnQoOCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuY29tcHJlc3NlZFNpemUgPT09IHV0aWxzLk1BWF9WQUxVRV8zMkJJVFMpIHtcbiAgICAgICAgICAgIHRoaXMuY29tcHJlc3NlZFNpemUgPSBleHRyYVJlYWRlci5yZWFkSW50KDgpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmxvY2FsSGVhZGVyT2Zmc2V0ID09PSB1dGlscy5NQVhfVkFMVUVfMzJCSVRTKSB7XG4gICAgICAgICAgICB0aGlzLmxvY2FsSGVhZGVyT2Zmc2V0ID0gZXh0cmFSZWFkZXIucmVhZEludCg4KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5kaXNrTnVtYmVyU3RhcnQgPT09IHV0aWxzLk1BWF9WQUxVRV8zMkJJVFMpIHtcbiAgICAgICAgICAgIHRoaXMuZGlza051bWJlclN0YXJ0ID0gZXh0cmFSZWFkZXIucmVhZEludCg0KTtcbiAgICAgICAgfVxuICAgIH0sXG4gICAgLyoqXG4gICAgICogUmVhZCB0aGUgY2VudHJhbCBwYXJ0IG9mIGEgemlwIGZpbGUgYW5kIGFkZCB0aGUgaW5mbyBpbiB0aGlzIG9iamVjdC5cbiAgICAgKiBAcGFyYW0ge0RhdGFSZWFkZXJ9IHJlYWRlciB0aGUgcmVhZGVyIHRvIHVzZS5cbiAgICAgKi9cbiAgICByZWFkRXh0cmFGaWVsZHM6IGZ1bmN0aW9uKHJlYWRlcikge1xuICAgICAgICB2YXIgZW5kID0gcmVhZGVyLmluZGV4ICsgdGhpcy5leHRyYUZpZWxkc0xlbmd0aCxcbiAgICAgICAgICAgIGV4dHJhRmllbGRJZCxcbiAgICAgICAgICAgIGV4dHJhRmllbGRMZW5ndGgsXG4gICAgICAgICAgICBleHRyYUZpZWxkVmFsdWU7XG5cbiAgICAgICAgaWYgKCF0aGlzLmV4dHJhRmllbGRzKSB7XG4gICAgICAgICAgICB0aGlzLmV4dHJhRmllbGRzID0ge307XG4gICAgICAgIH1cblxuICAgICAgICB3aGlsZSAocmVhZGVyLmluZGV4IDwgZW5kKSB7XG4gICAgICAgICAgICBleHRyYUZpZWxkSWQgPSByZWFkZXIucmVhZEludCgyKTtcbiAgICAgICAgICAgIGV4dHJhRmllbGRMZW5ndGggPSByZWFkZXIucmVhZEludCgyKTtcbiAgICAgICAgICAgIGV4dHJhRmllbGRWYWx1ZSA9IHJlYWRlci5yZWFkRGF0YShleHRyYUZpZWxkTGVuZ3RoKTtcblxuICAgICAgICAgICAgdGhpcy5leHRyYUZpZWxkc1tleHRyYUZpZWxkSWRdID0ge1xuICAgICAgICAgICAgICAgIGlkOiBleHRyYUZpZWxkSWQsXG4gICAgICAgICAgICAgICAgbGVuZ3RoOiBleHRyYUZpZWxkTGVuZ3RoLFxuICAgICAgICAgICAgICAgIHZhbHVlOiBleHRyYUZpZWxkVmFsdWVcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICB9LFxuICAgIC8qKlxuICAgICAqIEFwcGx5IGFuIFVURjggdHJhbnNmb3JtYXRpb24gaWYgbmVlZGVkLlxuICAgICAqL1xuICAgIGhhbmRsZVVURjg6IGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgZGVjb2RlUGFyYW1UeXBlID0gc3VwcG9ydC51aW50OGFycmF5ID8gXCJ1aW50OGFycmF5XCIgOiBcImFycmF5XCI7XG4gICAgICAgIGlmICh0aGlzLnVzZVVURjgoKSkge1xuICAgICAgICAgICAgdGhpcy5maWxlTmFtZVN0ciA9IHV0ZjgudXRmOGRlY29kZSh0aGlzLmZpbGVOYW1lKTtcbiAgICAgICAgICAgIHRoaXMuZmlsZUNvbW1lbnRTdHIgPSB1dGY4LnV0ZjhkZWNvZGUodGhpcy5maWxlQ29tbWVudCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB2YXIgdXBhdGggPSB0aGlzLmZpbmRFeHRyYUZpZWxkVW5pY29kZVBhdGgoKTtcbiAgICAgICAgICAgIGlmICh1cGF0aCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHRoaXMuZmlsZU5hbWVTdHIgPSB1cGF0aDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gQVNDSUkgdGV4dCBvciB1bnN1cHBvcnRlZCBjb2RlIHBhZ2VcbiAgICAgICAgICAgICAgICB2YXIgZmlsZU5hbWVCeXRlQXJyYXkgPSAgdXRpbHMudHJhbnNmb3JtVG8oZGVjb2RlUGFyYW1UeXBlLCB0aGlzLmZpbGVOYW1lKTtcbiAgICAgICAgICAgICAgICB0aGlzLmZpbGVOYW1lU3RyID0gdGhpcy5sb2FkT3B0aW9ucy5kZWNvZGVGaWxlTmFtZShmaWxlTmFtZUJ5dGVBcnJheSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHZhciB1Y29tbWVudCA9IHRoaXMuZmluZEV4dHJhRmllbGRVbmljb2RlQ29tbWVudCgpO1xuICAgICAgICAgICAgaWYgKHVjb21tZW50ICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5maWxlQ29tbWVudFN0ciA9IHVjb21tZW50O1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBBU0NJSSB0ZXh0IG9yIHVuc3VwcG9ydGVkIGNvZGUgcGFnZVxuICAgICAgICAgICAgICAgIHZhciBjb21tZW50Qnl0ZUFycmF5ID0gIHV0aWxzLnRyYW5zZm9ybVRvKGRlY29kZVBhcmFtVHlwZSwgdGhpcy5maWxlQ29tbWVudCk7XG4gICAgICAgICAgICAgICAgdGhpcy5maWxlQ29tbWVudFN0ciA9IHRoaXMubG9hZE9wdGlvbnMuZGVjb2RlRmlsZU5hbWUoY29tbWVudEJ5dGVBcnJheSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogRmluZCB0aGUgdW5pY29kZSBwYXRoIGRlY2xhcmVkIGluIHRoZSBleHRyYSBmaWVsZCwgaWYgYW55LlxuICAgICAqIEByZXR1cm4ge1N0cmluZ30gdGhlIHVuaWNvZGUgcGF0aCwgbnVsbCBvdGhlcndpc2UuXG4gICAgICovXG4gICAgZmluZEV4dHJhRmllbGRVbmljb2RlUGF0aDogZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciB1cGF0aEZpZWxkID0gdGhpcy5leHRyYUZpZWxkc1sweDcwNzVdO1xuICAgICAgICBpZiAodXBhdGhGaWVsZCkge1xuICAgICAgICAgICAgdmFyIGV4dHJhUmVhZGVyID0gcmVhZGVyRm9yKHVwYXRoRmllbGQudmFsdWUpO1xuXG4gICAgICAgICAgICAvLyB3cm9uZyB2ZXJzaW9uXG4gICAgICAgICAgICBpZiAoZXh0cmFSZWFkZXIucmVhZEludCgxKSAhPT0gMSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyB0aGUgY3JjIG9mIHRoZSBmaWxlbmFtZSBjaGFuZ2VkLCB0aGlzIGZpZWxkIGlzIG91dCBvZiBkYXRlLlxuICAgICAgICAgICAgaWYgKGNyYzMyZm4odGhpcy5maWxlTmFtZSkgIT09IGV4dHJhUmVhZGVyLnJlYWRJbnQoNCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIHV0ZjgudXRmOGRlY29kZShleHRyYVJlYWRlci5yZWFkRGF0YSh1cGF0aEZpZWxkLmxlbmd0aCAtIDUpKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogRmluZCB0aGUgdW5pY29kZSBjb21tZW50IGRlY2xhcmVkIGluIHRoZSBleHRyYSBmaWVsZCwgaWYgYW55LlxuICAgICAqIEByZXR1cm4ge1N0cmluZ30gdGhlIHVuaWNvZGUgY29tbWVudCwgbnVsbCBvdGhlcndpc2UuXG4gICAgICovXG4gICAgZmluZEV4dHJhRmllbGRVbmljb2RlQ29tbWVudDogZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciB1Y29tbWVudEZpZWxkID0gdGhpcy5leHRyYUZpZWxkc1sweDYzNzVdO1xuICAgICAgICBpZiAodWNvbW1lbnRGaWVsZCkge1xuICAgICAgICAgICAgdmFyIGV4dHJhUmVhZGVyID0gcmVhZGVyRm9yKHVjb21tZW50RmllbGQudmFsdWUpO1xuXG4gICAgICAgICAgICAvLyB3cm9uZyB2ZXJzaW9uXG4gICAgICAgICAgICBpZiAoZXh0cmFSZWFkZXIucmVhZEludCgxKSAhPT0gMSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyB0aGUgY3JjIG9mIHRoZSBjb21tZW50IGNoYW5nZWQsIHRoaXMgZmllbGQgaXMgb3V0IG9mIGRhdGUuXG4gICAgICAgICAgICBpZiAoY3JjMzJmbih0aGlzLmZpbGVDb21tZW50KSAhPT0gZXh0cmFSZWFkZXIucmVhZEludCg0KSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gdXRmOC51dGY4ZGVjb2RlKGV4dHJhUmVhZGVyLnJlYWREYXRhKHVjb21tZW50RmllbGQubGVuZ3RoIC0gNSkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbn07XG5tb2R1bGUuZXhwb3J0cyA9IFppcEVudHJ5O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgU3RyZWFtSGVscGVyID0gcmVxdWlyZSgnLi9zdHJlYW0vU3RyZWFtSGVscGVyJyk7XG52YXIgRGF0YVdvcmtlciA9IHJlcXVpcmUoJy4vc3RyZWFtL0RhdGFXb3JrZXInKTtcbnZhciB1dGY4ID0gcmVxdWlyZSgnLi91dGY4Jyk7XG52YXIgQ29tcHJlc3NlZE9iamVjdCA9IHJlcXVpcmUoJy4vY29tcHJlc3NlZE9iamVjdCcpO1xudmFyIEdlbmVyaWNXb3JrZXIgPSByZXF1aXJlKCcuL3N0cmVhbS9HZW5lcmljV29ya2VyJyk7XG5cbi8qKlxuICogQSBzaW1wbGUgb2JqZWN0IHJlcHJlc2VudGluZyBhIGZpbGUgaW4gdGhlIHppcCBmaWxlLlxuICogQGNvbnN0cnVjdG9yXG4gKiBAcGFyYW0ge3N0cmluZ30gbmFtZSB0aGUgbmFtZSBvZiB0aGUgZmlsZVxuICogQHBhcmFtIHtTdHJpbmd8QXJyYXlCdWZmZXJ8VWludDhBcnJheXxCdWZmZXJ9IGRhdGEgdGhlIGRhdGFcbiAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIHRoZSBvcHRpb25zIG9mIHRoZSBmaWxlXG4gKi9cbnZhciBaaXBPYmplY3QgPSBmdW5jdGlvbihuYW1lLCBkYXRhLCBvcHRpb25zKSB7XG4gICAgdGhpcy5uYW1lID0gbmFtZTtcbiAgICB0aGlzLmRpciA9IG9wdGlvbnMuZGlyO1xuICAgIHRoaXMuZGF0ZSA9IG9wdGlvbnMuZGF0ZTtcbiAgICB0aGlzLmNvbW1lbnQgPSBvcHRpb25zLmNvbW1lbnQ7XG4gICAgdGhpcy51bml4UGVybWlzc2lvbnMgPSBvcHRpb25zLnVuaXhQZXJtaXNzaW9ucztcbiAgICB0aGlzLmRvc1Blcm1pc3Npb25zID0gb3B0aW9ucy5kb3NQZXJtaXNzaW9ucztcblxuICAgIHRoaXMuX2RhdGEgPSBkYXRhO1xuICAgIHRoaXMuX2RhdGFCaW5hcnkgPSBvcHRpb25zLmJpbmFyeTtcbiAgICAvLyBrZWVwIG9ubHkgdGhlIGNvbXByZXNzaW9uXG4gICAgdGhpcy5vcHRpb25zID0ge1xuICAgICAgICBjb21wcmVzc2lvbiA6IG9wdGlvbnMuY29tcHJlc3Npb24sXG4gICAgICAgIGNvbXByZXNzaW9uT3B0aW9ucyA6IG9wdGlvbnMuY29tcHJlc3Npb25PcHRpb25zXG4gICAgfTtcbn07XG5cblppcE9iamVjdC5wcm90b3R5cGUgPSB7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlIGFuIGludGVybmFsIHN0cmVhbSBmb3IgdGhlIGNvbnRlbnQgb2YgdGhpcyBvYmplY3QuXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IHR5cGUgdGhlIHR5cGUgb2YgZWFjaCBjaHVuay5cbiAgICAgKiBAcmV0dXJuIFN0cmVhbUhlbHBlciB0aGUgc3RyZWFtLlxuICAgICAqL1xuICAgIGludGVybmFsU3RyZWFtOiBmdW5jdGlvbiAodHlwZSkge1xuICAgICAgICB2YXIgb3V0cHV0VHlwZSA9IHR5cGUudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgdmFyIGFza1VuaWNvZGVTdHJpbmcgPSBvdXRwdXRUeXBlID09PSBcInN0cmluZ1wiIHx8IG91dHB1dFR5cGUgPT09IFwidGV4dFwiO1xuICAgICAgICBpZiAob3V0cHV0VHlwZSA9PT0gXCJiaW5hcnlzdHJpbmdcIiB8fCBvdXRwdXRUeXBlID09PSBcInRleHRcIikge1xuICAgICAgICAgICAgb3V0cHV0VHlwZSA9IFwic3RyaW5nXCI7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHJlc3VsdCA9IHRoaXMuX2RlY29tcHJlc3NXb3JrZXIoKTtcblxuICAgICAgICB2YXIgaXNVbmljb2RlU3RyaW5nID0gIXRoaXMuX2RhdGFCaW5hcnk7XG5cbiAgICAgICAgaWYgKGlzVW5pY29kZVN0cmluZyAmJiAhYXNrVW5pY29kZVN0cmluZykge1xuICAgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0LnBpcGUobmV3IHV0ZjguVXRmOEVuY29kZVdvcmtlcigpKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWlzVW5pY29kZVN0cmluZyAmJiBhc2tVbmljb2RlU3RyaW5nKSB7XG4gICAgICAgICAgICByZXN1bHQgPSByZXN1bHQucGlwZShuZXcgdXRmOC5VdGY4RGVjb2RlV29ya2VyKCkpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG5ldyBTdHJlYW1IZWxwZXIocmVzdWx0LCBvdXRwdXRUeXBlLCBcIlwiKTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogUHJlcGFyZSB0aGUgY29udGVudCBpbiB0aGUgYXNrZWQgdHlwZS5cbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gdHlwZSB0aGUgdHlwZSBvZiB0aGUgcmVzdWx0LlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IG9uVXBkYXRlIGEgZnVuY3Rpb24gdG8gY2FsbCBvbiBlYWNoIGludGVybmFsIHVwZGF0ZS5cbiAgICAgKiBAcmV0dXJuIFByb21pc2UgdGhlIHByb21pc2Ugb2YgdGhlIHJlc3VsdC5cbiAgICAgKi9cbiAgICBhc3luYzogZnVuY3Rpb24gKHR5cGUsIG9uVXBkYXRlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmludGVybmFsU3RyZWFtKHR5cGUpLmFjY3VtdWxhdGUob25VcGRhdGUpO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBQcmVwYXJlIHRoZSBjb250ZW50IGFzIGEgbm9kZWpzIHN0cmVhbS5cbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gdHlwZSB0aGUgdHlwZSBvZiBlYWNoIGNodW5rLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IG9uVXBkYXRlIGEgZnVuY3Rpb24gdG8gY2FsbCBvbiBlYWNoIGludGVybmFsIHVwZGF0ZS5cbiAgICAgKiBAcmV0dXJuIFN0cmVhbSB0aGUgc3RyZWFtLlxuICAgICAqL1xuICAgIG5vZGVTdHJlYW06IGZ1bmN0aW9uICh0eXBlLCBvblVwZGF0ZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5pbnRlcm5hbFN0cmVhbSh0eXBlIHx8IFwibm9kZWJ1ZmZlclwiKS50b05vZGVqc1N0cmVhbShvblVwZGF0ZSk7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFJldHVybiBhIHdvcmtlciBmb3IgdGhlIGNvbXByZXNzZWQgY29udGVudC5cbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBjb21wcmVzc2lvbiB0aGUgY29tcHJlc3Npb24gb2JqZWN0IHRvIHVzZS5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gY29tcHJlc3Npb25PcHRpb25zIHRoZSBvcHRpb25zIHRvIHVzZSB3aGVuIGNvbXByZXNzaW5nLlxuICAgICAqIEByZXR1cm4gV29ya2VyIHRoZSB3b3JrZXIuXG4gICAgICovXG4gICAgLy8gX2NvbXByZXNzV29ya2VyOiBmdW5jdGlvbiAoY29tcHJlc3Npb24sIGNvbXByZXNzaW9uT3B0aW9ucykge1xuICAgIC8vICAgICBpZiAoXG4gICAgLy8gICAgICAgICB0aGlzLl9kYXRhIGluc3RhbmNlb2YgQ29tcHJlc3NlZE9iamVjdCAmJlxuICAgIC8vICAgICAgICAgdGhpcy5fZGF0YS5jb21wcmVzc2lvbi5tYWdpYyA9PT0gY29tcHJlc3Npb24ubWFnaWNcbiAgICAvLyAgICAgKSB7XG4gICAgLy8gICAgICAgICByZXR1cm4gdGhpcy5fZGF0YS5nZXRDb21wcmVzc2VkV29ya2VyKCk7XG4gICAgLy8gICAgIH0gZWxzZSB7XG4gICAgLy8gICAgICAgICB2YXIgcmVzdWx0ID0gdGhpcy5fZGVjb21wcmVzc1dvcmtlcigpO1xuICAgIC8vICAgICAgICAgaWYoIXRoaXMuX2RhdGFCaW5hcnkpIHtcbiAgICAvLyAgICAgICAgICAgICByZXN1bHQgPSByZXN1bHQucGlwZShuZXcgdXRmOC5VdGY4RW5jb2RlV29ya2VyKCkpO1xuICAgIC8vICAgICAgICAgfVxuICAgIC8vICAgICAgICAgcmV0dXJuIENvbXByZXNzZWRPYmplY3QuY3JlYXRlV29ya2VyRnJvbShyZXN1bHQsIGNvbXByZXNzaW9uLCBjb21wcmVzc2lvbk9wdGlvbnMpO1xuICAgIC8vICAgICB9XG4gICAgLy8gfSxcbiAgICAvKipcbiAgICAgKiBSZXR1cm4gYSB3b3JrZXIgZm9yIHRoZSBkZWNvbXByZXNzZWQgY29udGVudC5cbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEByZXR1cm4gV29ya2VyIHRoZSB3b3JrZXIuXG4gICAgICovXG4gICAgX2RlY29tcHJlc3NXb3JrZXIgOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICh0aGlzLl9kYXRhIGluc3RhbmNlb2YgQ29tcHJlc3NlZE9iamVjdCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2RhdGEuZ2V0Q29udGVudFdvcmtlcigpO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuX2RhdGEgaW5zdGFuY2VvZiBHZW5lcmljV29ya2VyKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fZGF0YTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgRGF0YVdvcmtlcih0aGlzLl9kYXRhKTtcbiAgICAgICAgfVxuICAgIH1cbn07XG5cbnZhciByZW1vdmVkTWV0aG9kcyA9IFtcImFzVGV4dFwiLCBcImFzQmluYXJ5XCIsIFwiYXNOb2RlQnVmZmVyXCIsIFwiYXNVaW50OEFycmF5XCIsIFwiYXNBcnJheUJ1ZmZlclwiXTtcbnZhciByZW1vdmVkRm4gPSBmdW5jdGlvbiAoKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiVGhpcyBtZXRob2QgaGFzIGJlZW4gcmVtb3ZlZCBpbiBKU1ppcCAzLjAsIHBsZWFzZSBjaGVjayB0aGUgdXBncmFkZSBndWlkZS5cIik7XG59O1xuXG5mb3IodmFyIGkgPSAwOyBpIDwgcmVtb3ZlZE1ldGhvZHMubGVuZ3RoOyBpKyspIHtcbiAgICBaaXBPYmplY3QucHJvdG90eXBlW3JlbW92ZWRNZXRob2RzW2ldXSA9IHJlbW92ZWRGbjtcbn1cbm1vZHVsZS5leHBvcnRzID0gWmlwT2JqZWN0O1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbi8vIHJhd0FzYXAgcHJvdmlkZXMgZXZlcnl0aGluZyB3ZSBuZWVkIGV4Y2VwdCBleGNlcHRpb24gbWFuYWdlbWVudC5cbnZhciByYXdBc2FwID0gcmVxdWlyZShcIi4vcmF3XCIpO1xuLy8gUmF3VGFza3MgYXJlIHJlY3ljbGVkIHRvIHJlZHVjZSBHQyBjaHVybi5cbnZhciBmcmVlVGFza3MgPSBbXTtcbi8vIFdlIHF1ZXVlIGVycm9ycyB0byBlbnN1cmUgdGhleSBhcmUgdGhyb3duIGluIHJpZ2h0IG9yZGVyIChGSUZPKS5cbi8vIEFycmF5LWFzLXF1ZXVlIGlzIGdvb2QgZW5vdWdoIGhlcmUsIHNpbmNlIHdlIGFyZSBqdXN0IGRlYWxpbmcgd2l0aCBleGNlcHRpb25zLlxudmFyIHBlbmRpbmdFcnJvcnMgPSBbXTtcbnZhciByZXF1ZXN0RXJyb3JUaHJvdyA9IHJhd0FzYXAubWFrZVJlcXVlc3RDYWxsRnJvbVRpbWVyKHRocm93Rmlyc3RFcnJvcik7XG5cbmZ1bmN0aW9uIHRocm93Rmlyc3RFcnJvcigpIHtcbiAgICBpZiAocGVuZGluZ0Vycm9ycy5sZW5ndGgpIHtcbiAgICAgICAgdGhyb3cgcGVuZGluZ0Vycm9ycy5zaGlmdCgpO1xuICAgIH1cbn1cblxuLyoqXG4gKiBDYWxscyBhIHRhc2sgYXMgc29vbiBhcyBwb3NzaWJsZSBhZnRlciByZXR1cm5pbmcsIGluIGl0cyBvd24gZXZlbnQsIHdpdGggcHJpb3JpdHlcbiAqIG92ZXIgb3RoZXIgZXZlbnRzIGxpa2UgYW5pbWF0aW9uLCByZWZsb3csIGFuZCByZXBhaW50LiBBbiBlcnJvciB0aHJvd24gZnJvbSBhblxuICogZXZlbnQgd2lsbCBub3QgaW50ZXJydXB0LCBub3IgZXZlbiBzdWJzdGFudGlhbGx5IHNsb3cgZG93biB0aGUgcHJvY2Vzc2luZyBvZlxuICogb3RoZXIgZXZlbnRzLCBidXQgd2lsbCBiZSByYXRoZXIgcG9zdHBvbmVkIHRvIGEgbG93ZXIgcHJpb3JpdHkgZXZlbnQuXG4gKiBAcGFyYW0ge3tjYWxsfX0gdGFzayBBIGNhbGxhYmxlIG9iamVjdCwgdHlwaWNhbGx5IGEgZnVuY3Rpb24gdGhhdCB0YWtlcyBub1xuICogYXJndW1lbnRzLlxuICovXG5tb2R1bGUuZXhwb3J0cyA9IGFzYXA7XG5mdW5jdGlvbiBhc2FwKHRhc2spIHtcbiAgICB2YXIgcmF3VGFzaztcbiAgICBpZiAoZnJlZVRhc2tzLmxlbmd0aCkge1xuICAgICAgICByYXdUYXNrID0gZnJlZVRhc2tzLnBvcCgpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHJhd1Rhc2sgPSBuZXcgUmF3VGFzaygpO1xuICAgIH1cbiAgICByYXdUYXNrLnRhc2sgPSB0YXNrO1xuICAgIHJhd0FzYXAocmF3VGFzayk7XG59XG5cbi8vIFdlIHdyYXAgdGFza3Mgd2l0aCByZWN5Y2xhYmxlIHRhc2sgb2JqZWN0cy4gIEEgdGFzayBvYmplY3QgaW1wbGVtZW50c1xuLy8gYGNhbGxgLCBqdXN0IGxpa2UgYSBmdW5jdGlvbi5cbmZ1bmN0aW9uIFJhd1Rhc2soKSB7XG4gICAgdGhpcy50YXNrID0gbnVsbDtcbn1cblxuLy8gVGhlIHNvbGUgcHVycG9zZSBvZiB3cmFwcGluZyB0aGUgdGFzayBpcyB0byBjYXRjaCB0aGUgZXhjZXB0aW9uIGFuZCByZWN5Y2xlXG4vLyB0aGUgdGFzayBvYmplY3QgYWZ0ZXIgaXRzIHNpbmdsZSB1c2UuXG5SYXdUYXNrLnByb3RvdHlwZS5jYWxsID0gZnVuY3Rpb24gKCkge1xuICAgIHRyeSB7XG4gICAgICAgIHRoaXMudGFzay5jYWxsKCk7XG4gICAgfSBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgaWYgKGFzYXAub25lcnJvcikge1xuICAgICAgICAgICAgLy8gVGhpcyBob29rIGV4aXN0cyBwdXJlbHkgZm9yIHRlc3RpbmcgcHVycG9zZXMuXG4gICAgICAgICAgICAvLyBJdHMgbmFtZSB3aWxsIGJlIHBlcmlvZGljYWxseSByYW5kb21pemVkIHRvIGJyZWFrIGFueSBjb2RlIHRoYXRcbiAgICAgICAgICAgIC8vIGRlcGVuZHMgb24gaXRzIGV4aXN0ZW5jZS5cbiAgICAgICAgICAgIGFzYXAub25lcnJvcihlcnJvcik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAvLyBJbiBhIHdlYiBicm93c2VyLCBleGNlcHRpb25zIGFyZSBub3QgZmF0YWwuIEhvd2V2ZXIsIHRvIGF2b2lkXG4gICAgICAgICAgICAvLyBzbG93aW5nIGRvd24gdGhlIHF1ZXVlIG9mIHBlbmRpbmcgdGFza3MsIHdlIHJldGhyb3cgdGhlIGVycm9yIGluIGFcbiAgICAgICAgICAgIC8vIGxvd2VyIHByaW9yaXR5IHR1cm4uXG4gICAgICAgICAgICBwZW5kaW5nRXJyb3JzLnB1c2goZXJyb3IpO1xuICAgICAgICAgICAgcmVxdWVzdEVycm9yVGhyb3coKTtcbiAgICAgICAgfVxuICAgIH0gZmluYWxseSB7XG4gICAgICAgIHRoaXMudGFzayA9IG51bGw7XG4gICAgICAgIGZyZWVUYXNrc1tmcmVlVGFza3MubGVuZ3RoXSA9IHRoaXM7XG4gICAgfVxufTtcbiIsIlwidXNlIHN0cmljdFwiO1xuXG4vLyBVc2UgdGhlIGZhc3Rlc3QgbWVhbnMgcG9zc2libGUgdG8gZXhlY3V0ZSBhIHRhc2sgaW4gaXRzIG93biB0dXJuLCB3aXRoXG4vLyBwcmlvcml0eSBvdmVyIG90aGVyIGV2ZW50cyBpbmNsdWRpbmcgSU8sIGFuaW1hdGlvbiwgcmVmbG93LCBhbmQgcmVkcmF3XG4vLyBldmVudHMgaW4gYnJvd3NlcnMuXG4vL1xuLy8gQW4gZXhjZXB0aW9uIHRocm93biBieSBhIHRhc2sgd2lsbCBwZXJtYW5lbnRseSBpbnRlcnJ1cHQgdGhlIHByb2Nlc3Npbmcgb2Zcbi8vIHN1YnNlcXVlbnQgdGFza3MuIFRoZSBoaWdoZXIgbGV2ZWwgYGFzYXBgIGZ1bmN0aW9uIGVuc3VyZXMgdGhhdCBpZiBhblxuLy8gZXhjZXB0aW9uIGlzIHRocm93biBieSBhIHRhc2ssIHRoYXQgdGhlIHRhc2sgcXVldWUgd2lsbCBjb250aW51ZSBmbHVzaGluZyBhc1xuLy8gc29vbiBhcyBwb3NzaWJsZSwgYnV0IGlmIHlvdSB1c2UgYHJhd0FzYXBgIGRpcmVjdGx5LCB5b3UgYXJlIHJlc3BvbnNpYmxlIHRvXG4vLyBlaXRoZXIgZW5zdXJlIHRoYXQgbm8gZXhjZXB0aW9ucyBhcmUgdGhyb3duIGZyb20geW91ciB0YXNrLCBvciB0byBtYW51YWxseVxuLy8gY2FsbCBgcmF3QXNhcC5yZXF1ZXN0Rmx1c2hgIGlmIGFuIGV4Y2VwdGlvbiBpcyB0aHJvd24uXG5tb2R1bGUuZXhwb3J0cyA9IHJhd0FzYXA7XG5mdW5jdGlvbiByYXdBc2FwKHRhc2spIHtcbiAgICBpZiAoIXF1ZXVlLmxlbmd0aCkge1xuICAgICAgICByZXF1ZXN0Rmx1c2goKTtcbiAgICAgICAgZmx1c2hpbmcgPSB0cnVlO1xuICAgIH1cbiAgICAvLyBFcXVpdmFsZW50IHRvIHB1c2gsIGJ1dCBhdm9pZHMgYSBmdW5jdGlvbiBjYWxsLlxuICAgIHF1ZXVlW3F1ZXVlLmxlbmd0aF0gPSB0YXNrO1xufVxuXG52YXIgcXVldWUgPSBbXTtcbi8vIE9uY2UgYSBmbHVzaCBoYXMgYmVlbiByZXF1ZXN0ZWQsIG5vIGZ1cnRoZXIgY2FsbHMgdG8gYHJlcXVlc3RGbHVzaGAgYXJlXG4vLyBuZWNlc3NhcnkgdW50aWwgdGhlIG5leHQgYGZsdXNoYCBjb21wbGV0ZXMuXG52YXIgZmx1c2hpbmcgPSBmYWxzZTtcbi8vIGByZXF1ZXN0Rmx1c2hgIGlzIGFuIGltcGxlbWVudGF0aW9uLXNwZWNpZmljIG1ldGhvZCB0aGF0IGF0dGVtcHRzIHRvIGtpY2tcbi8vIG9mZiBhIGBmbHVzaGAgZXZlbnQgYXMgcXVpY2tseSBhcyBwb3NzaWJsZS4gYGZsdXNoYCB3aWxsIGF0dGVtcHQgdG8gZXhoYXVzdFxuLy8gdGhlIGV2ZW50IHF1ZXVlIGJlZm9yZSB5aWVsZGluZyB0byB0aGUgYnJvd3NlcidzIG93biBldmVudCBsb29wLlxudmFyIHJlcXVlc3RGbHVzaDtcbi8vIFRoZSBwb3NpdGlvbiBvZiB0aGUgbmV4dCB0YXNrIHRvIGV4ZWN1dGUgaW4gdGhlIHRhc2sgcXVldWUuIFRoaXMgaXNcbi8vIHByZXNlcnZlZCBiZXR3ZWVuIGNhbGxzIHRvIGBmbHVzaGAgc28gdGhhdCBpdCBjYW4gYmUgcmVzdW1lZCBpZlxuLy8gYSB0YXNrIHRocm93cyBhbiBleGNlcHRpb24uXG52YXIgaW5kZXggPSAwO1xuLy8gSWYgYSB0YXNrIHNjaGVkdWxlcyBhZGRpdGlvbmFsIHRhc2tzIHJlY3Vyc2l2ZWx5LCB0aGUgdGFzayBxdWV1ZSBjYW4gZ3Jvd1xuLy8gdW5ib3VuZGVkLiBUbyBwcmV2ZW50IG1lbW9yeSBleGhhdXN0aW9uLCB0aGUgdGFzayBxdWV1ZSB3aWxsIHBlcmlvZGljYWxseVxuLy8gdHJ1bmNhdGUgYWxyZWFkeS1jb21wbGV0ZWQgdGFza3MuXG52YXIgY2FwYWNpdHkgPSAxMDI0O1xuXG4vLyBUaGUgZmx1c2ggZnVuY3Rpb24gcHJvY2Vzc2VzIGFsbCB0YXNrcyB0aGF0IGhhdmUgYmVlbiBzY2hlZHVsZWQgd2l0aFxuLy8gYHJhd0FzYXBgIHVubGVzcyBhbmQgdW50aWwgb25lIG9mIHRob3NlIHRhc2tzIHRocm93cyBhbiBleGNlcHRpb24uXG4vLyBJZiBhIHRhc2sgdGhyb3dzIGFuIGV4Y2VwdGlvbiwgYGZsdXNoYCBlbnN1cmVzIHRoYXQgaXRzIHN0YXRlIHdpbGwgcmVtYWluXG4vLyBjb25zaXN0ZW50IGFuZCB3aWxsIHJlc3VtZSB3aGVyZSBpdCBsZWZ0IG9mZiB3aGVuIGNhbGxlZCBhZ2Fpbi5cbi8vIEhvd2V2ZXIsIGBmbHVzaGAgZG9lcyBub3QgbWFrZSBhbnkgYXJyYW5nZW1lbnRzIHRvIGJlIGNhbGxlZCBhZ2FpbiBpZiBhblxuLy8gZXhjZXB0aW9uIGlzIHRocm93bi5cbmZ1bmN0aW9uIGZsdXNoKCkge1xuICAgIHdoaWxlIChpbmRleCA8IHF1ZXVlLmxlbmd0aCkge1xuICAgICAgICB2YXIgY3VycmVudEluZGV4ID0gaW5kZXg7XG4gICAgICAgIC8vIEFkdmFuY2UgdGhlIGluZGV4IGJlZm9yZSBjYWxsaW5nIHRoZSB0YXNrLiBUaGlzIGVuc3VyZXMgdGhhdCB3ZSB3aWxsXG4gICAgICAgIC8vIGJlZ2luIGZsdXNoaW5nIG9uIHRoZSBuZXh0IHRhc2sgdGhlIHRhc2sgdGhyb3dzIGFuIGVycm9yLlxuICAgICAgICBpbmRleCA9IGluZGV4ICsgMTtcbiAgICAgICAgcXVldWVbY3VycmVudEluZGV4XS5jYWxsKCk7XG4gICAgICAgIC8vIFByZXZlbnQgbGVha2luZyBtZW1vcnkgZm9yIGxvbmcgY2hhaW5zIG9mIHJlY3Vyc2l2ZSBjYWxscyB0byBgYXNhcGAuXG4gICAgICAgIC8vIElmIHdlIGNhbGwgYGFzYXBgIHdpdGhpbiB0YXNrcyBzY2hlZHVsZWQgYnkgYGFzYXBgLCB0aGUgcXVldWUgd2lsbFxuICAgICAgICAvLyBncm93LCBidXQgdG8gYXZvaWQgYW4gTyhuKSB3YWxrIGZvciBldmVyeSB0YXNrIHdlIGV4ZWN1dGUsIHdlIGRvbid0XG4gICAgICAgIC8vIHNoaWZ0IHRhc2tzIG9mZiB0aGUgcXVldWUgYWZ0ZXIgdGhleSBoYXZlIGJlZW4gZXhlY3V0ZWQuXG4gICAgICAgIC8vIEluc3RlYWQsIHdlIHBlcmlvZGljYWxseSBzaGlmdCAxMDI0IHRhc2tzIG9mZiB0aGUgcXVldWUuXG4gICAgICAgIGlmIChpbmRleCA+IGNhcGFjaXR5KSB7XG4gICAgICAgICAgICAvLyBNYW51YWxseSBzaGlmdCBhbGwgdmFsdWVzIHN0YXJ0aW5nIGF0IHRoZSBpbmRleCBiYWNrIHRvIHRoZVxuICAgICAgICAgICAgLy8gYmVnaW5uaW5nIG9mIHRoZSBxdWV1ZS5cbiAgICAgICAgICAgIGZvciAodmFyIHNjYW4gPSAwLCBuZXdMZW5ndGggPSBxdWV1ZS5sZW5ndGggLSBpbmRleDsgc2NhbiA8IG5ld0xlbmd0aDsgc2NhbisrKSB7XG4gICAgICAgICAgICAgICAgcXVldWVbc2Nhbl0gPSBxdWV1ZVtzY2FuICsgaW5kZXhdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcXVldWUubGVuZ3RoIC09IGluZGV4O1xuICAgICAgICAgICAgaW5kZXggPSAwO1xuICAgICAgICB9XG4gICAgfVxuICAgIHF1ZXVlLmxlbmd0aCA9IDA7XG4gICAgaW5kZXggPSAwO1xuICAgIGZsdXNoaW5nID0gZmFsc2U7XG59XG5cbi8vIGByZXF1ZXN0Rmx1c2hgIGlzIGltcGxlbWVudGVkIHVzaW5nIGEgc3RyYXRlZ3kgYmFzZWQgb24gZGF0YSBjb2xsZWN0ZWQgZnJvbVxuLy8gZXZlcnkgYXZhaWxhYmxlIFNhdWNlTGFicyBTZWxlbml1bSB3ZWIgZHJpdmVyIHdvcmtlciBhdCB0aW1lIG9mIHdyaXRpbmcuXG4vLyBodHRwczovL2RvY3MuZ29vZ2xlLmNvbS9zcHJlYWRzaGVldHMvZC8xbUctNVVZR3VwNXF4R2RFTVdraFA2QldDejA1M05VYjJFMVFvVVRVMTZ1QS9lZGl0I2dpZD03ODM3MjQ1OTNcblxuLy8gU2FmYXJpIDYgYW5kIDYuMSBmb3IgZGVza3RvcCwgaVBhZCwgYW5kIGlQaG9uZSBhcmUgdGhlIG9ubHkgYnJvd3NlcnMgdGhhdFxuLy8gaGF2ZSBXZWJLaXRNdXRhdGlvbk9ic2VydmVyIGJ1dCBub3QgdW4tcHJlZml4ZWQgTXV0YXRpb25PYnNlcnZlci5cbi8vIE11c3QgdXNlIGBnbG9iYWxgIG9yIGBzZWxmYCBpbnN0ZWFkIG9mIGB3aW5kb3dgIHRvIHdvcmsgaW4gYm90aCBmcmFtZXMgYW5kIHdlYlxuLy8gd29ya2Vycy4gYGdsb2JhbGAgaXMgYSBwcm92aXNpb24gb2YgQnJvd3NlcmlmeSwgTXIsIE1ycywgb3IgTW9wLlxuXG4vKiBnbG9iYWxzIHNlbGYgKi9cbnZhciBzY29wZSA9IHR5cGVvZiBnbG9iYWwgIT09IFwidW5kZWZpbmVkXCIgPyBnbG9iYWwgOiBzZWxmO1xudmFyIEJyb3dzZXJNdXRhdGlvbk9ic2VydmVyID0gc2NvcGUuTXV0YXRpb25PYnNlcnZlciB8fCBzY29wZS5XZWJLaXRNdXRhdGlvbk9ic2VydmVyO1xuXG4vLyBNdXRhdGlvbk9ic2VydmVycyBhcmUgZGVzaXJhYmxlIGJlY2F1c2UgdGhleSBoYXZlIGhpZ2ggcHJpb3JpdHkgYW5kIHdvcmtcbi8vIHJlbGlhYmx5IGV2ZXJ5d2hlcmUgdGhleSBhcmUgaW1wbGVtZW50ZWQuXG4vLyBUaGV5IGFyZSBpbXBsZW1lbnRlZCBpbiBhbGwgbW9kZXJuIGJyb3dzZXJzLlxuLy9cbi8vIC0gQW5kcm9pZCA0LTQuM1xuLy8gLSBDaHJvbWUgMjYtMzRcbi8vIC0gRmlyZWZveCAxNC0yOVxuLy8gLSBJbnRlcm5ldCBFeHBsb3JlciAxMVxuLy8gLSBpUGFkIFNhZmFyaSA2LTcuMVxuLy8gLSBpUGhvbmUgU2FmYXJpIDctNy4xXG4vLyAtIFNhZmFyaSA2LTdcbmlmICh0eXBlb2YgQnJvd3Nlck11dGF0aW9uT2JzZXJ2ZXIgPT09IFwiZnVuY3Rpb25cIikge1xuICAgIHJlcXVlc3RGbHVzaCA9IG1ha2VSZXF1ZXN0Q2FsbEZyb21NdXRhdGlvbk9ic2VydmVyKGZsdXNoKTtcblxuLy8gTWVzc2FnZUNoYW5uZWxzIGFyZSBkZXNpcmFibGUgYmVjYXVzZSB0aGV5IGdpdmUgZGlyZWN0IGFjY2VzcyB0byB0aGUgSFRNTFxuLy8gdGFzayBxdWV1ZSwgYXJlIGltcGxlbWVudGVkIGluIEludGVybmV0IEV4cGxvcmVyIDEwLCBTYWZhcmkgNS4wLTEsIGFuZCBPcGVyYVxuLy8gMTEtMTIsIGFuZCBpbiB3ZWIgd29ya2VycyBpbiBtYW55IGVuZ2luZXMuXG4vLyBBbHRob3VnaCBtZXNzYWdlIGNoYW5uZWxzIHlpZWxkIHRvIGFueSBxdWV1ZWQgcmVuZGVyaW5nIGFuZCBJTyB0YXNrcywgdGhleVxuLy8gd291bGQgYmUgYmV0dGVyIHRoYW4gaW1wb3NpbmcgdGhlIDRtcyBkZWxheSBvZiB0aW1lcnMuXG4vLyBIb3dldmVyLCB0aGV5IGRvIG5vdCB3b3JrIHJlbGlhYmx5IGluIEludGVybmV0IEV4cGxvcmVyIG9yIFNhZmFyaS5cblxuLy8gSW50ZXJuZXQgRXhwbG9yZXIgMTAgaXMgdGhlIG9ubHkgYnJvd3NlciB0aGF0IGhhcyBzZXRJbW1lZGlhdGUgYnV0IGRvZXNcbi8vIG5vdCBoYXZlIE11dGF0aW9uT2JzZXJ2ZXJzLlxuLy8gQWx0aG91Z2ggc2V0SW1tZWRpYXRlIHlpZWxkcyB0byB0aGUgYnJvd3NlcidzIHJlbmRlcmVyLCBpdCB3b3VsZCBiZVxuLy8gcHJlZmVycmFibGUgdG8gZmFsbGluZyBiYWNrIHRvIHNldFRpbWVvdXQgc2luY2UgaXQgZG9lcyBub3QgaGF2ZVxuLy8gdGhlIG1pbmltdW0gNG1zIHBlbmFsdHkuXG4vLyBVbmZvcnR1bmF0ZWx5IHRoZXJlIGFwcGVhcnMgdG8gYmUgYSBidWcgaW4gSW50ZXJuZXQgRXhwbG9yZXIgMTAgTW9iaWxlIChhbmRcbi8vIERlc2t0b3AgdG8gYSBsZXNzZXIgZXh0ZW50KSB0aGF0IHJlbmRlcnMgYm90aCBzZXRJbW1lZGlhdGUgYW5kXG4vLyBNZXNzYWdlQ2hhbm5lbCB1c2VsZXNzIGZvciB0aGUgcHVycG9zZXMgb2YgQVNBUC5cbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS9rcmlza293YWwvcS9pc3N1ZXMvMzk2XG5cbi8vIFRpbWVycyBhcmUgaW1wbGVtZW50ZWQgdW5pdmVyc2FsbHkuXG4vLyBXZSBmYWxsIGJhY2sgdG8gdGltZXJzIGluIHdvcmtlcnMgaW4gbW9zdCBlbmdpbmVzLCBhbmQgaW4gZm9yZWdyb3VuZFxuLy8gY29udGV4dHMgaW4gdGhlIGZvbGxvd2luZyBicm93c2Vycy5cbi8vIEhvd2V2ZXIsIG5vdGUgdGhhdCBldmVuIHRoaXMgc2ltcGxlIGNhc2UgcmVxdWlyZXMgbnVhbmNlcyB0byBvcGVyYXRlIGluIGFcbi8vIGJyb2FkIHNwZWN0cnVtIG9mIGJyb3dzZXJzLlxuLy9cbi8vIC0gRmlyZWZveCAzLTEzXG4vLyAtIEludGVybmV0IEV4cGxvcmVyIDYtOVxuLy8gLSBpUGFkIFNhZmFyaSA0LjNcbi8vIC0gTHlueCAyLjguN1xufSBlbHNlIHtcbiAgICByZXF1ZXN0Rmx1c2ggPSBtYWtlUmVxdWVzdENhbGxGcm9tVGltZXIoZmx1c2gpO1xufVxuXG4vLyBgcmVxdWVzdEZsdXNoYCByZXF1ZXN0cyB0aGF0IHRoZSBoaWdoIHByaW9yaXR5IGV2ZW50IHF1ZXVlIGJlIGZsdXNoZWQgYXNcbi8vIHNvb24gYXMgcG9zc2libGUuXG4vLyBUaGlzIGlzIHVzZWZ1bCB0byBwcmV2ZW50IGFuIGVycm9yIHRocm93biBpbiBhIHRhc2sgZnJvbSBzdGFsbGluZyB0aGUgZXZlbnRcbi8vIHF1ZXVlIGlmIHRoZSBleGNlcHRpb24gaGFuZGxlZCBieSBOb2RlLmpz4oCZc1xuLy8gYHByb2Nlc3Mub24oXCJ1bmNhdWdodEV4Y2VwdGlvblwiKWAgb3IgYnkgYSBkb21haW4uXG5yYXdBc2FwLnJlcXVlc3RGbHVzaCA9IHJlcXVlc3RGbHVzaDtcblxuLy8gVG8gcmVxdWVzdCBhIGhpZ2ggcHJpb3JpdHkgZXZlbnQsIHdlIGluZHVjZSBhIG11dGF0aW9uIG9ic2VydmVyIGJ5IHRvZ2dsaW5nXG4vLyB0aGUgdGV4dCBvZiBhIHRleHQgbm9kZSBiZXR3ZWVuIFwiMVwiIGFuZCBcIi0xXCIuXG5mdW5jdGlvbiBtYWtlUmVxdWVzdENhbGxGcm9tTXV0YXRpb25PYnNlcnZlcihjYWxsYmFjaykge1xuICAgIHZhciB0b2dnbGUgPSAxO1xuICAgIHZhciBvYnNlcnZlciA9IG5ldyBCcm93c2VyTXV0YXRpb25PYnNlcnZlcihjYWxsYmFjayk7XG4gICAgdmFyIG5vZGUgPSBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZShcIlwiKTtcbiAgICBvYnNlcnZlci5vYnNlcnZlKG5vZGUsIHtjaGFyYWN0ZXJEYXRhOiB0cnVlfSk7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIHJlcXVlc3RDYWxsKCkge1xuICAgICAgICB0b2dnbGUgPSAtdG9nZ2xlO1xuICAgICAgICBub2RlLmRhdGEgPSB0b2dnbGU7XG4gICAgfTtcbn1cblxuLy8gVGhlIG1lc3NhZ2UgY2hhbm5lbCB0ZWNobmlxdWUgd2FzIGRpc2NvdmVyZWQgYnkgTWFsdGUgVWJsIGFuZCB3YXMgdGhlXG4vLyBvcmlnaW5hbCBmb3VuZGF0aW9uIGZvciB0aGlzIGxpYnJhcnkuXG4vLyBodHRwOi8vd3d3Lm5vbmJsb2NraW5nLmlvLzIwMTEvMDYvd2luZG93bmV4dHRpY2suaHRtbFxuXG4vLyBTYWZhcmkgNi4wLjUgKGF0IGxlYXN0KSBpbnRlcm1pdHRlbnRseSBmYWlscyB0byBjcmVhdGUgbWVzc2FnZSBwb3J0cyBvbiBhXG4vLyBwYWdlJ3MgZmlyc3QgbG9hZC4gVGhhbmtmdWxseSwgdGhpcyB2ZXJzaW9uIG9mIFNhZmFyaSBzdXBwb3J0c1xuLy8gTXV0YXRpb25PYnNlcnZlcnMsIHNvIHdlIGRvbid0IG5lZWQgdG8gZmFsbCBiYWNrIGluIHRoYXQgY2FzZS5cblxuLy8gZnVuY3Rpb24gbWFrZVJlcXVlc3RDYWxsRnJvbU1lc3NhZ2VDaGFubmVsKGNhbGxiYWNrKSB7XG4vLyAgICAgdmFyIGNoYW5uZWwgPSBuZXcgTWVzc2FnZUNoYW5uZWwoKTtcbi8vICAgICBjaGFubmVsLnBvcnQxLm9ubWVzc2FnZSA9IGNhbGxiYWNrO1xuLy8gICAgIHJldHVybiBmdW5jdGlvbiByZXF1ZXN0Q2FsbCgpIHtcbi8vICAgICAgICAgY2hhbm5lbC5wb3J0Mi5wb3N0TWVzc2FnZSgwKTtcbi8vICAgICB9O1xuLy8gfVxuXG4vLyBGb3IgcmVhc29ucyBleHBsYWluZWQgYWJvdmUsIHdlIGFyZSBhbHNvIHVuYWJsZSB0byB1c2UgYHNldEltbWVkaWF0ZWBcbi8vIHVuZGVyIGFueSBjaXJjdW1zdGFuY2VzLlxuLy8gRXZlbiBpZiB3ZSB3ZXJlLCB0aGVyZSBpcyBhbm90aGVyIGJ1ZyBpbiBJbnRlcm5ldCBFeHBsb3JlciAxMC5cbi8vIEl0IGlzIG5vdCBzdWZmaWNpZW50IHRvIGFzc2lnbiBgc2V0SW1tZWRpYXRlYCB0byBgcmVxdWVzdEZsdXNoYCBiZWNhdXNlXG4vLyBgc2V0SW1tZWRpYXRlYCBtdXN0IGJlIGNhbGxlZCAqYnkgbmFtZSogYW5kIHRoZXJlZm9yZSBtdXN0IGJlIHdyYXBwZWQgaW4gYVxuLy8gY2xvc3VyZS5cbi8vIE5ldmVyIGZvcmdldC5cblxuLy8gZnVuY3Rpb24gbWFrZVJlcXVlc3RDYWxsRnJvbVNldEltbWVkaWF0ZShjYWxsYmFjaykge1xuLy8gICAgIHJldHVybiBmdW5jdGlvbiByZXF1ZXN0Q2FsbCgpIHtcbi8vICAgICAgICAgc2V0SW1tZWRpYXRlKGNhbGxiYWNrKTtcbi8vICAgICB9O1xuLy8gfVxuXG4vLyBTYWZhcmkgNi4wIGhhcyBhIHByb2JsZW0gd2hlcmUgdGltZXJzIHdpbGwgZ2V0IGxvc3Qgd2hpbGUgdGhlIHVzZXIgaXNcbi8vIHNjcm9sbGluZy4gVGhpcyBwcm9ibGVtIGRvZXMgbm90IGltcGFjdCBBU0FQIGJlY2F1c2UgU2FmYXJpIDYuMCBzdXBwb3J0c1xuLy8gbXV0YXRpb24gb2JzZXJ2ZXJzLCBzbyB0aGF0IGltcGxlbWVudGF0aW9uIGlzIHVzZWQgaW5zdGVhZC5cbi8vIEhvd2V2ZXIsIGlmIHdlIGV2ZXIgZWxlY3QgdG8gdXNlIHRpbWVycyBpbiBTYWZhcmksIHRoZSBwcmV2YWxlbnQgd29yay1hcm91bmRcbi8vIGlzIHRvIGFkZCBhIHNjcm9sbCBldmVudCBsaXN0ZW5lciB0aGF0IGNhbGxzIGZvciBhIGZsdXNoLlxuXG4vLyBgc2V0VGltZW91dGAgZG9lcyBub3QgY2FsbCB0aGUgcGFzc2VkIGNhbGxiYWNrIGlmIHRoZSBkZWxheSBpcyBsZXNzIHRoYW5cbi8vIGFwcHJveGltYXRlbHkgNyBpbiB3ZWIgd29ya2VycyBpbiBGaXJlZm94IDggdGhyb3VnaCAxOCwgYW5kIHNvbWV0aW1lcyBub3Rcbi8vIGV2ZW4gdGhlbi5cblxuZnVuY3Rpb24gbWFrZVJlcXVlc3RDYWxsRnJvbVRpbWVyKGNhbGxiYWNrKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uIHJlcXVlc3RDYWxsKCkge1xuICAgICAgICAvLyBXZSBkaXNwYXRjaCBhIHRpbWVvdXQgd2l0aCBhIHNwZWNpZmllZCBkZWxheSBvZiAwIGZvciBlbmdpbmVzIHRoYXRcbiAgICAgICAgLy8gY2FuIHJlbGlhYmx5IGFjY29tbW9kYXRlIHRoYXQgcmVxdWVzdC4gVGhpcyB3aWxsIHVzdWFsbHkgYmUgc25hcHBlZFxuICAgICAgICAvLyB0byBhIDQgbWlsaXNlY29uZCBkZWxheSwgYnV0IG9uY2Ugd2UncmUgZmx1c2hpbmcsIHRoZXJlJ3Mgbm8gZGVsYXlcbiAgICAgICAgLy8gYmV0d2VlbiBldmVudHMuXG4gICAgICAgIHZhciB0aW1lb3V0SGFuZGxlID0gc2V0VGltZW91dChoYW5kbGVUaW1lciwgMCk7XG4gICAgICAgIC8vIEhvd2V2ZXIsIHNpbmNlIHRoaXMgdGltZXIgZ2V0cyBmcmVxdWVudGx5IGRyb3BwZWQgaW4gRmlyZWZveFxuICAgICAgICAvLyB3b3JrZXJzLCB3ZSBlbmxpc3QgYW4gaW50ZXJ2YWwgaGFuZGxlIHRoYXQgd2lsbCB0cnkgdG8gZmlyZVxuICAgICAgICAvLyBhbiBldmVudCAyMCB0aW1lcyBwZXIgc2Vjb25kIHVudGlsIGl0IHN1Y2NlZWRzLlxuICAgICAgICB2YXIgaW50ZXJ2YWxIYW5kbGUgPSBzZXRJbnRlcnZhbChoYW5kbGVUaW1lciwgNTApO1xuXG4gICAgICAgIGZ1bmN0aW9uIGhhbmRsZVRpbWVyKCkge1xuICAgICAgICAgICAgLy8gV2hpY2hldmVyIHRpbWVyIHN1Y2NlZWRzIHdpbGwgY2FuY2VsIGJvdGggdGltZXJzIGFuZFxuICAgICAgICAgICAgLy8gZXhlY3V0ZSB0aGUgY2FsbGJhY2suXG4gICAgICAgICAgICBjbGVhclRpbWVvdXQodGltZW91dEhhbmRsZSk7XG4gICAgICAgICAgICBjbGVhckludGVydmFsKGludGVydmFsSGFuZGxlKTtcbiAgICAgICAgICAgIGNhbGxiYWNrKCk7XG4gICAgICAgIH1cbiAgICB9O1xufVxuXG4vLyBUaGlzIGlzIGZvciBgYXNhcC5qc2Agb25seS5cbi8vIEl0cyBuYW1lIHdpbGwgYmUgcGVyaW9kaWNhbGx5IHJhbmRvbWl6ZWQgdG8gYnJlYWsgYW55IGNvZGUgdGhhdCBkZXBlbmRzIG9uXG4vLyBpdHMgZXhpc3RlbmNlLlxucmF3QXNhcC5tYWtlUmVxdWVzdENhbGxGcm9tVGltZXIgPSBtYWtlUmVxdWVzdENhbGxGcm9tVGltZXI7XG5cbi8vIEFTQVAgd2FzIG9yaWdpbmFsbHkgYSBuZXh0VGljayBzaGltIGluY2x1ZGVkIGluIFEuIFRoaXMgd2FzIGZhY3RvcmVkIG91dFxuLy8gaW50byB0aGlzIEFTQVAgcGFja2FnZS4gSXQgd2FzIGxhdGVyIGFkYXB0ZWQgdG8gUlNWUCB3aGljaCBtYWRlIGZ1cnRoZXJcbi8vIGFtZW5kbWVudHMuIFRoZXNlIGRlY2lzaW9ucywgcGFydGljdWxhcmx5IHRvIG1hcmdpbmFsaXplIE1lc3NhZ2VDaGFubmVsIGFuZFxuLy8gdG8gY2FwdHVyZSB0aGUgTXV0YXRpb25PYnNlcnZlciBpbXBsZW1lbnRhdGlvbiBpbiBhIGNsb3N1cmUsIHdlcmUgaW50ZWdyYXRlZFxuLy8gYmFjayBpbnRvIEFTQVAgcHJvcGVyLlxuLy8gaHR0cHM6Ly9naXRodWIuY29tL3RpbGRlaW8vcnN2cC5qcy9ibG9iL2NkZGY3MjMyNTQ2YTljZjg1ODUyNGI3NWNkZTZmOWVkZjcyNjIwYTcvbGliL3JzdnAvYXNhcC5qc1xuIiwiLy8gVG9wIGxldmVsIGZpbGUgaXMganVzdCBhIG1peGluIG9mIHN1Ym1vZHVsZXMgJiBjb25zdGFudHNcbid1c2Ugc3RyaWN0JztcblxudmFyIGFzc2lnbiAgICA9IHJlcXVpcmUoJy4vbGliL3V0aWxzL2NvbW1vbicpLmFzc2lnbjtcblxudmFyIGRlZmxhdGUgICA9IHJlcXVpcmUoJy4vbGliL2RlZmxhdGUnKTtcbnZhciBpbmZsYXRlICAgPSByZXF1aXJlKCcuL2xpYi9pbmZsYXRlJyk7XG52YXIgY29uc3RhbnRzID0gcmVxdWlyZSgnLi9saWIvemxpYi9jb25zdGFudHMnKTtcblxudmFyIHBha28gPSB7fTtcblxuYXNzaWduKHBha28sIGRlZmxhdGUsIGluZmxhdGUsIGNvbnN0YW50cyk7XG5cbm1vZHVsZS5leHBvcnRzID0gcGFrbztcbiIsIid1c2Ugc3RyaWN0JztcblxuXG52YXIgemxpYl9kZWZsYXRlID0gcmVxdWlyZSgnLi96bGliL2RlZmxhdGUnKTtcbnZhciB1dGlscyAgICAgICAgPSByZXF1aXJlKCcuL3V0aWxzL2NvbW1vbicpO1xudmFyIHN0cmluZ3MgICAgICA9IHJlcXVpcmUoJy4vdXRpbHMvc3RyaW5ncycpO1xudmFyIG1zZyAgICAgICAgICA9IHJlcXVpcmUoJy4vemxpYi9tZXNzYWdlcycpO1xudmFyIFpTdHJlYW0gICAgICA9IHJlcXVpcmUoJy4vemxpYi96c3RyZWFtJyk7XG5cbnZhciB0b1N0cmluZyA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmc7XG5cbi8qIFB1YmxpYyBjb25zdGFudHMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qL1xuXG52YXIgWl9OT19GTFVTSCAgICAgID0gMDtcbnZhciBaX0ZJTklTSCAgICAgICAgPSA0O1xuXG52YXIgWl9PSyAgICAgICAgICAgID0gMDtcbnZhciBaX1NUUkVBTV9FTkQgICAgPSAxO1xudmFyIFpfU1lOQ19GTFVTSCAgICA9IDI7XG5cbnZhciBaX0RFRkFVTFRfQ09NUFJFU1NJT04gPSAtMTtcblxudmFyIFpfREVGQVVMVF9TVFJBVEVHWSAgICA9IDA7XG5cbnZhciBaX0RFRkxBVEVEICA9IDg7XG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovXG5cblxuLyoqXG4gKiBjbGFzcyBEZWZsYXRlXG4gKlxuICogR2VuZXJpYyBKUy1zdHlsZSB3cmFwcGVyIGZvciB6bGliIGNhbGxzLiBJZiB5b3UgZG9uJ3QgbmVlZFxuICogc3RyZWFtaW5nIGJlaGF2aW91ciAtIHVzZSBtb3JlIHNpbXBsZSBmdW5jdGlvbnM6IFtbZGVmbGF0ZV1dLFxuICogW1tkZWZsYXRlUmF3XV0gYW5kIFtbZ3ppcF1dLlxuICoqL1xuXG4vKiBpbnRlcm5hbFxuICogRGVmbGF0ZS5jaHVua3MgLT4gQXJyYXlcbiAqXG4gKiBDaHVua3Mgb2Ygb3V0cHV0IGRhdGEsIGlmIFtbRGVmbGF0ZSNvbkRhdGFdXSBub3Qgb3ZlcnJpZGVuLlxuICoqL1xuXG4vKipcbiAqIERlZmxhdGUucmVzdWx0IC0+IFVpbnQ4QXJyYXl8QXJyYXlcbiAqXG4gKiBDb21wcmVzc2VkIHJlc3VsdCwgZ2VuZXJhdGVkIGJ5IGRlZmF1bHQgW1tEZWZsYXRlI29uRGF0YV1dXG4gKiBhbmQgW1tEZWZsYXRlI29uRW5kXV0gaGFuZGxlcnMuIEZpbGxlZCBhZnRlciB5b3UgcHVzaCBsYXN0IGNodW5rXG4gKiAoY2FsbCBbW0RlZmxhdGUjcHVzaF1dIHdpdGggYFpfRklOSVNIYCAvIGB0cnVlYCBwYXJhbSkgIG9yIGlmIHlvdVxuICogcHVzaCBhIGNodW5rIHdpdGggZXhwbGljaXQgZmx1c2ggKGNhbGwgW1tEZWZsYXRlI3B1c2hdXSB3aXRoXG4gKiBgWl9TWU5DX0ZMVVNIYCBwYXJhbSkuXG4gKiovXG5cbi8qKlxuICogRGVmbGF0ZS5lcnIgLT4gTnVtYmVyXG4gKlxuICogRXJyb3IgY29kZSBhZnRlciBkZWZsYXRlIGZpbmlzaGVkLiAwIChaX09LKSBvbiBzdWNjZXNzLlxuICogWW91IHdpbGwgbm90IG5lZWQgaXQgaW4gcmVhbCBsaWZlLCBiZWNhdXNlIGRlZmxhdGUgZXJyb3JzXG4gKiBhcmUgcG9zc2libGUgb25seSBvbiB3cm9uZyBvcHRpb25zIG9yIGJhZCBgb25EYXRhYCAvIGBvbkVuZGBcbiAqIGN1c3RvbSBoYW5kbGVycy5cbiAqKi9cblxuLyoqXG4gKiBEZWZsYXRlLm1zZyAtPiBTdHJpbmdcbiAqXG4gKiBFcnJvciBtZXNzYWdlLCBpZiBbW0RlZmxhdGUuZXJyXV0gIT0gMFxuICoqL1xuXG5cbi8qKlxuICogbmV3IERlZmxhdGUob3B0aW9ucylcbiAqIC0gb3B0aW9ucyAoT2JqZWN0KTogemxpYiBkZWZsYXRlIG9wdGlvbnMuXG4gKlxuICogQ3JlYXRlcyBuZXcgZGVmbGF0b3IgaW5zdGFuY2Ugd2l0aCBzcGVjaWZpZWQgcGFyYW1zLiBUaHJvd3MgZXhjZXB0aW9uXG4gKiBvbiBiYWQgcGFyYW1zLiBTdXBwb3J0ZWQgb3B0aW9uczpcbiAqXG4gKiAtIGBsZXZlbGBcbiAqIC0gYHdpbmRvd0JpdHNgXG4gKiAtIGBtZW1MZXZlbGBcbiAqIC0gYHN0cmF0ZWd5YFxuICogLSBgZGljdGlvbmFyeWBcbiAqXG4gKiBbaHR0cDovL3psaWIubmV0L21hbnVhbC5odG1sI0FkdmFuY2VkXShodHRwOi8vemxpYi5uZXQvbWFudWFsLmh0bWwjQWR2YW5jZWQpXG4gKiBmb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGVzZS5cbiAqXG4gKiBBZGRpdGlvbmFsIG9wdGlvbnMsIGZvciBpbnRlcm5hbCBuZWVkczpcbiAqXG4gKiAtIGBjaHVua1NpemVgIC0gc2l6ZSBvZiBnZW5lcmF0ZWQgZGF0YSBjaHVua3MgKDE2SyBieSBkZWZhdWx0KVxuICogLSBgcmF3YCAoQm9vbGVhbikgLSBkbyByYXcgZGVmbGF0ZVxuICogLSBgZ3ppcGAgKEJvb2xlYW4pIC0gY3JlYXRlIGd6aXAgd3JhcHBlclxuICogLSBgdG9gIChTdHJpbmcpIC0gaWYgZXF1YWwgdG8gJ3N0cmluZycsIHRoZW4gcmVzdWx0IHdpbGwgYmUgXCJiaW5hcnkgc3RyaW5nXCJcbiAqICAgIChlYWNoIGNoYXIgY29kZSBbMC4uMjU1XSlcbiAqIC0gYGhlYWRlcmAgKE9iamVjdCkgLSBjdXN0b20gaGVhZGVyIGZvciBnemlwXG4gKiAgIC0gYHRleHRgIChCb29sZWFuKSAtIHRydWUgaWYgY29tcHJlc3NlZCBkYXRhIGJlbGlldmVkIHRvIGJlIHRleHRcbiAqICAgLSBgdGltZWAgKE51bWJlcikgLSBtb2RpZmljYXRpb24gdGltZSwgdW5peCB0aW1lc3RhbXBcbiAqICAgLSBgb3NgIChOdW1iZXIpIC0gb3BlcmF0aW9uIHN5c3RlbSBjb2RlXG4gKiAgIC0gYGV4dHJhYCAoQXJyYXkpIC0gYXJyYXkgb2YgYnl0ZXMgd2l0aCBleHRyYSBkYXRhIChtYXggNjU1MzYpXG4gKiAgIC0gYG5hbWVgIChTdHJpbmcpIC0gZmlsZSBuYW1lIChiaW5hcnkgc3RyaW5nKVxuICogICAtIGBjb21tZW50YCAoU3RyaW5nKSAtIGNvbW1lbnQgKGJpbmFyeSBzdHJpbmcpXG4gKiAgIC0gYGhjcmNgIChCb29sZWFuKSAtIHRydWUgaWYgaGVhZGVyIGNyYyBzaG91bGQgYmUgYWRkZWRcbiAqXG4gKiAjIyMjIyBFeGFtcGxlOlxuICpcbiAqIGBgYGphdmFzY3JpcHRcbiAqIHZhciBwYWtvID0gcmVxdWlyZSgncGFrbycpXG4gKiAgICwgY2h1bmsxID0gVWludDhBcnJheShbMSwyLDMsNCw1LDYsNyw4LDldKVxuICogICAsIGNodW5rMiA9IFVpbnQ4QXJyYXkoWzEwLDExLDEyLDEzLDE0LDE1LDE2LDE3LDE4LDE5XSk7XG4gKlxuICogdmFyIGRlZmxhdGUgPSBuZXcgcGFrby5EZWZsYXRlKHsgbGV2ZWw6IDN9KTtcbiAqXG4gKiBkZWZsYXRlLnB1c2goY2h1bmsxLCBmYWxzZSk7XG4gKiBkZWZsYXRlLnB1c2goY2h1bmsyLCB0cnVlKTsgIC8vIHRydWUgLT4gbGFzdCBjaHVua1xuICpcbiAqIGlmIChkZWZsYXRlLmVycikgeyB0aHJvdyBuZXcgRXJyb3IoZGVmbGF0ZS5lcnIpOyB9XG4gKlxuICogY29uc29sZS5sb2coZGVmbGF0ZS5yZXN1bHQpO1xuICogYGBgXG4gKiovXG5mdW5jdGlvbiBEZWZsYXRlKG9wdGlvbnMpIHtcbiAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIERlZmxhdGUpKSByZXR1cm4gbmV3IERlZmxhdGUob3B0aW9ucyk7XG5cbiAgdGhpcy5vcHRpb25zID0gdXRpbHMuYXNzaWduKHtcbiAgICBsZXZlbDogWl9ERUZBVUxUX0NPTVBSRVNTSU9OLFxuICAgIG1ldGhvZDogWl9ERUZMQVRFRCxcbiAgICBjaHVua1NpemU6IDE2Mzg0LFxuICAgIHdpbmRvd0JpdHM6IDE1LFxuICAgIG1lbUxldmVsOiA4LFxuICAgIHN0cmF0ZWd5OiBaX0RFRkFVTFRfU1RSQVRFR1ksXG4gICAgdG86ICcnXG4gIH0sIG9wdGlvbnMgfHwge30pO1xuXG4gIHZhciBvcHQgPSB0aGlzLm9wdGlvbnM7XG5cbiAgaWYgKG9wdC5yYXcgJiYgKG9wdC53aW5kb3dCaXRzID4gMCkpIHtcbiAgICBvcHQud2luZG93Qml0cyA9IC1vcHQud2luZG93Qml0cztcbiAgfVxuXG4gIGVsc2UgaWYgKG9wdC5nemlwICYmIChvcHQud2luZG93Qml0cyA+IDApICYmIChvcHQud2luZG93Qml0cyA8IDE2KSkge1xuICAgIG9wdC53aW5kb3dCaXRzICs9IDE2O1xuICB9XG5cbiAgdGhpcy5lcnIgICAgPSAwOyAgICAgIC8vIGVycm9yIGNvZGUsIGlmIGhhcHBlbnMgKDAgPSBaX09LKVxuICB0aGlzLm1zZyAgICA9ICcnOyAgICAgLy8gZXJyb3IgbWVzc2FnZVxuICB0aGlzLmVuZGVkICA9IGZhbHNlOyAgLy8gdXNlZCB0byBhdm9pZCBtdWx0aXBsZSBvbkVuZCgpIGNhbGxzXG4gIHRoaXMuY2h1bmtzID0gW107ICAgICAvLyBjaHVua3Mgb2YgY29tcHJlc3NlZCBkYXRhXG5cbiAgdGhpcy5zdHJtID0gbmV3IFpTdHJlYW0oKTtcbiAgdGhpcy5zdHJtLmF2YWlsX291dCA9IDA7XG5cbiAgdmFyIHN0YXR1cyA9IHpsaWJfZGVmbGF0ZS5kZWZsYXRlSW5pdDIoXG4gICAgdGhpcy5zdHJtLFxuICAgIG9wdC5sZXZlbCxcbiAgICBvcHQubWV0aG9kLFxuICAgIG9wdC53aW5kb3dCaXRzLFxuICAgIG9wdC5tZW1MZXZlbCxcbiAgICBvcHQuc3RyYXRlZ3lcbiAgKTtcblxuICBpZiAoc3RhdHVzICE9PSBaX09LKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKG1zZ1tzdGF0dXNdKTtcbiAgfVxuXG4gIGlmIChvcHQuaGVhZGVyKSB7XG4gICAgemxpYl9kZWZsYXRlLmRlZmxhdGVTZXRIZWFkZXIodGhpcy5zdHJtLCBvcHQuaGVhZGVyKTtcbiAgfVxuXG4gIGlmIChvcHQuZGljdGlvbmFyeSkge1xuICAgIHZhciBkaWN0O1xuICAgIC8vIENvbnZlcnQgZGF0YSBpZiBuZWVkZWRcbiAgICBpZiAodHlwZW9mIG9wdC5kaWN0aW9uYXJ5ID09PSAnc3RyaW5nJykge1xuICAgICAgLy8gSWYgd2UgbmVlZCB0byBjb21wcmVzcyB0ZXh0LCBjaGFuZ2UgZW5jb2RpbmcgdG8gdXRmOC5cbiAgICAgIGRpY3QgPSBzdHJpbmdzLnN0cmluZzJidWYob3B0LmRpY3Rpb25hcnkpO1xuICAgIH0gZWxzZSBpZiAodG9TdHJpbmcuY2FsbChvcHQuZGljdGlvbmFyeSkgPT09ICdbb2JqZWN0IEFycmF5QnVmZmVyXScpIHtcbiAgICAgIGRpY3QgPSBuZXcgVWludDhBcnJheShvcHQuZGljdGlvbmFyeSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGRpY3QgPSBvcHQuZGljdGlvbmFyeTtcbiAgICB9XG5cbiAgICBzdGF0dXMgPSB6bGliX2RlZmxhdGUuZGVmbGF0ZVNldERpY3Rpb25hcnkodGhpcy5zdHJtLCBkaWN0KTtcblxuICAgIGlmIChzdGF0dXMgIT09IFpfT0spIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihtc2dbc3RhdHVzXSk7XG4gICAgfVxuXG4gICAgdGhpcy5fZGljdF9zZXQgPSB0cnVlO1xuICB9XG59XG5cbi8qKlxuICogRGVmbGF0ZSNwdXNoKGRhdGFbLCBtb2RlXSkgLT4gQm9vbGVhblxuICogLSBkYXRhIChVaW50OEFycmF5fEFycmF5fEFycmF5QnVmZmVyfFN0cmluZyk6IGlucHV0IGRhdGEuIFN0cmluZ3Mgd2lsbCBiZVxuICogICBjb252ZXJ0ZWQgdG8gdXRmOCBieXRlIHNlcXVlbmNlLlxuICogLSBtb2RlIChOdW1iZXJ8Qm9vbGVhbik6IDAuLjYgZm9yIGNvcnJlc3BvbmRpbmcgWl9OT19GTFVTSC4uWl9UUkVFIG1vZGVzLlxuICogICBTZWUgY29uc3RhbnRzLiBTa2lwcGVkIG9yIGBmYWxzZWAgbWVhbnMgWl9OT19GTFVTSCwgYHRydWVgIG1lYW5zaCBaX0ZJTklTSC5cbiAqXG4gKiBTZW5kcyBpbnB1dCBkYXRhIHRvIGRlZmxhdGUgcGlwZSwgZ2VuZXJhdGluZyBbW0RlZmxhdGUjb25EYXRhXV0gY2FsbHMgd2l0aFxuICogbmV3IGNvbXByZXNzZWQgY2h1bmtzLiBSZXR1cm5zIGB0cnVlYCBvbiBzdWNjZXNzLiBUaGUgbGFzdCBkYXRhIGJsb2NrIG11c3QgaGF2ZVxuICogbW9kZSBaX0ZJTklTSCAob3IgYHRydWVgKS4gVGhhdCB3aWxsIGZsdXNoIGludGVybmFsIHBlbmRpbmcgYnVmZmVycyBhbmQgY2FsbFxuICogW1tEZWZsYXRlI29uRW5kXV0uIEZvciBpbnRlcmltIGV4cGxpY2l0IGZsdXNoZXMgKHdpdGhvdXQgZW5kaW5nIHRoZSBzdHJlYW0pIHlvdVxuICogY2FuIHVzZSBtb2RlIFpfU1lOQ19GTFVTSCwga2VlcGluZyB0aGUgY29tcHJlc3Npb24gY29udGV4dC5cbiAqXG4gKiBPbiBmYWlsIGNhbGwgW1tEZWZsYXRlI29uRW5kXV0gd2l0aCBlcnJvciBjb2RlIGFuZCByZXR1cm4gZmFsc2UuXG4gKlxuICogV2Ugc3Ryb25nbHkgcmVjb21tZW5kIHRvIHVzZSBgVWludDhBcnJheWAgb24gaW5wdXQgZm9yIGJlc3Qgc3BlZWQgKG91dHB1dFxuICogYXJyYXkgZm9ybWF0IGlzIGRldGVjdGVkIGF1dG9tYXRpY2FsbHkpLiBBbHNvLCBkb24ndCBza2lwIGxhc3QgcGFyYW0gYW5kIGFsd2F5c1xuICogdXNlIHRoZSBzYW1lIHR5cGUgaW4geW91ciBjb2RlIChib29sZWFuIG9yIG51bWJlcikuIFRoYXQgd2lsbCBpbXByb3ZlIEpTIHNwZWVkLlxuICpcbiAqIEZvciByZWd1bGFyIGBBcnJheWAtcyBtYWtlIHN1cmUgYWxsIGVsZW1lbnRzIGFyZSBbMC4uMjU1XS5cbiAqXG4gKiAjIyMjIyBFeGFtcGxlXG4gKlxuICogYGBgamF2YXNjcmlwdFxuICogcHVzaChjaHVuaywgZmFsc2UpOyAvLyBwdXNoIG9uZSBvZiBkYXRhIGNodW5rc1xuICogLi4uXG4gKiBwdXNoKGNodW5rLCB0cnVlKTsgIC8vIHB1c2ggbGFzdCBjaHVua1xuICogYGBgXG4gKiovXG5EZWZsYXRlLnByb3RvdHlwZS5wdXNoID0gZnVuY3Rpb24gKGRhdGEsIG1vZGUpIHtcbiAgdmFyIHN0cm0gPSB0aGlzLnN0cm07XG4gIHZhciBjaHVua1NpemUgPSB0aGlzLm9wdGlvbnMuY2h1bmtTaXplO1xuICB2YXIgc3RhdHVzLCBfbW9kZTtcblxuICBpZiAodGhpcy5lbmRlZCkgeyByZXR1cm4gZmFsc2U7IH1cblxuICBfbW9kZSA9IChtb2RlID09PSB+fm1vZGUpID8gbW9kZSA6ICgobW9kZSA9PT0gdHJ1ZSkgPyBaX0ZJTklTSCA6IFpfTk9fRkxVU0gpO1xuXG4gIC8vIENvbnZlcnQgZGF0YSBpZiBuZWVkZWRcbiAgaWYgKHR5cGVvZiBkYXRhID09PSAnc3RyaW5nJykge1xuICAgIC8vIElmIHdlIG5lZWQgdG8gY29tcHJlc3MgdGV4dCwgY2hhbmdlIGVuY29kaW5nIHRvIHV0ZjguXG4gICAgc3RybS5pbnB1dCA9IHN0cmluZ3Muc3RyaW5nMmJ1ZihkYXRhKTtcbiAgfSBlbHNlIGlmICh0b1N0cmluZy5jYWxsKGRhdGEpID09PSAnW29iamVjdCBBcnJheUJ1ZmZlcl0nKSB7XG4gICAgc3RybS5pbnB1dCA9IG5ldyBVaW50OEFycmF5KGRhdGEpO1xuICB9IGVsc2Uge1xuICAgIHN0cm0uaW5wdXQgPSBkYXRhO1xuICB9XG5cbiAgc3RybS5uZXh0X2luID0gMDtcbiAgc3RybS5hdmFpbF9pbiA9IHN0cm0uaW5wdXQubGVuZ3RoO1xuXG4gIGRvIHtcbiAgICBpZiAoc3RybS5hdmFpbF9vdXQgPT09IDApIHtcbiAgICAgIHN0cm0ub3V0cHV0ID0gbmV3IHV0aWxzLkJ1ZjgoY2h1bmtTaXplKTtcbiAgICAgIHN0cm0ubmV4dF9vdXQgPSAwO1xuICAgICAgc3RybS5hdmFpbF9vdXQgPSBjaHVua1NpemU7XG4gICAgfVxuICAgIHN0YXR1cyA9IHpsaWJfZGVmbGF0ZS5kZWZsYXRlKHN0cm0sIF9tb2RlKTsgICAgLyogbm8gYmFkIHJldHVybiB2YWx1ZSAqL1xuXG4gICAgaWYgKHN0YXR1cyAhPT0gWl9TVFJFQU1fRU5EICYmIHN0YXR1cyAhPT0gWl9PSykge1xuICAgICAgdGhpcy5vbkVuZChzdGF0dXMpO1xuICAgICAgdGhpcy5lbmRlZCA9IHRydWU7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlmIChzdHJtLmF2YWlsX291dCA9PT0gMCB8fCAoc3RybS5hdmFpbF9pbiA9PT0gMCAmJiAoX21vZGUgPT09IFpfRklOSVNIIHx8IF9tb2RlID09PSBaX1NZTkNfRkxVU0gpKSkge1xuICAgICAgaWYgKHRoaXMub3B0aW9ucy50byA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgdGhpcy5vbkRhdGEoc3RyaW5ncy5idWYyYmluc3RyaW5nKHV0aWxzLnNocmlua0J1ZihzdHJtLm91dHB1dCwgc3RybS5uZXh0X291dCkpKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMub25EYXRhKHV0aWxzLnNocmlua0J1ZihzdHJtLm91dHB1dCwgc3RybS5uZXh0X291dCkpO1xuICAgICAgfVxuICAgIH1cbiAgfSB3aGlsZSAoKHN0cm0uYXZhaWxfaW4gPiAwIHx8IHN0cm0uYXZhaWxfb3V0ID09PSAwKSAmJiBzdGF0dXMgIT09IFpfU1RSRUFNX0VORCk7XG5cbiAgLy8gRmluYWxpemUgb24gdGhlIGxhc3QgY2h1bmsuXG4gIGlmIChfbW9kZSA9PT0gWl9GSU5JU0gpIHtcbiAgICBzdGF0dXMgPSB6bGliX2RlZmxhdGUuZGVmbGF0ZUVuZCh0aGlzLnN0cm0pO1xuICAgIHRoaXMub25FbmQoc3RhdHVzKTtcbiAgICB0aGlzLmVuZGVkID0gdHJ1ZTtcbiAgICByZXR1cm4gc3RhdHVzID09PSBaX09LO1xuICB9XG5cbiAgLy8gY2FsbGJhY2sgaW50ZXJpbSByZXN1bHRzIGlmIFpfU1lOQ19GTFVTSC5cbiAgaWYgKF9tb2RlID09PSBaX1NZTkNfRkxVU0gpIHtcbiAgICB0aGlzLm9uRW5kKFpfT0spO1xuICAgIHN0cm0uYXZhaWxfb3V0ID0gMDtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufTtcblxuXG4vKipcbiAqIERlZmxhdGUjb25EYXRhKGNodW5rKSAtPiBWb2lkXG4gKiAtIGNodW5rIChVaW50OEFycmF5fEFycmF5fFN0cmluZyk6IG91cHV0IGRhdGEuIFR5cGUgb2YgYXJyYXkgZGVwZW5kc1xuICogICBvbiBqcyBlbmdpbmUgc3VwcG9ydC4gV2hlbiBzdHJpbmcgb3V0cHV0IHJlcXVlc3RlZCwgZWFjaCBjaHVua1xuICogICB3aWxsIGJlIHN0cmluZy5cbiAqXG4gKiBCeSBkZWZhdWx0LCBzdG9yZXMgZGF0YSBibG9ja3MgaW4gYGNodW5rc1tdYCBwcm9wZXJ0eSBhbmQgZ2x1ZVxuICogdGhvc2UgaW4gYG9uRW5kYC4gT3ZlcnJpZGUgdGhpcyBoYW5kbGVyLCBpZiB5b3UgbmVlZCBhbm90aGVyIGJlaGF2aW91ci5cbiAqKi9cbkRlZmxhdGUucHJvdG90eXBlLm9uRGF0YSA9IGZ1bmN0aW9uIChjaHVuaykge1xuICB0aGlzLmNodW5rcy5wdXNoKGNodW5rKTtcbn07XG5cblxuLyoqXG4gKiBEZWZsYXRlI29uRW5kKHN0YXR1cykgLT4gVm9pZFxuICogLSBzdGF0dXMgKE51bWJlcik6IGRlZmxhdGUgc3RhdHVzLiAwIChaX09LKSBvbiBzdWNjZXNzLFxuICogICBvdGhlciBpZiBub3QuXG4gKlxuICogQ2FsbGVkIG9uY2UgYWZ0ZXIgeW91IHRlbGwgZGVmbGF0ZSB0aGF0IHRoZSBpbnB1dCBzdHJlYW0gaXNcbiAqIGNvbXBsZXRlIChaX0ZJTklTSCkgb3Igc2hvdWxkIGJlIGZsdXNoZWQgKFpfU1lOQ19GTFVTSClcbiAqIG9yIGlmIGFuIGVycm9yIGhhcHBlbmVkLiBCeSBkZWZhdWx0IC0gam9pbiBjb2xsZWN0ZWQgY2h1bmtzLFxuICogZnJlZSBtZW1vcnkgYW5kIGZpbGwgYHJlc3VsdHNgIC8gYGVycmAgcHJvcGVydGllcy5cbiAqKi9cbkRlZmxhdGUucHJvdG90eXBlLm9uRW5kID0gZnVuY3Rpb24gKHN0YXR1cykge1xuICAvLyBPbiBzdWNjZXNzIC0gam9pblxuICBpZiAoc3RhdHVzID09PSBaX09LKSB7XG4gICAgaWYgKHRoaXMub3B0aW9ucy50byA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHRoaXMucmVzdWx0ID0gdGhpcy5jaHVua3Muam9pbignJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMucmVzdWx0ID0gdXRpbHMuZmxhdHRlbkNodW5rcyh0aGlzLmNodW5rcyk7XG4gICAgfVxuICB9XG4gIHRoaXMuY2h1bmtzID0gW107XG4gIHRoaXMuZXJyID0gc3RhdHVzO1xuICB0aGlzLm1zZyA9IHRoaXMuc3RybS5tc2c7XG59O1xuXG5cbi8qKlxuICogZGVmbGF0ZShkYXRhWywgb3B0aW9uc10pIC0+IFVpbnQ4QXJyYXl8QXJyYXl8U3RyaW5nXG4gKiAtIGRhdGEgKFVpbnQ4QXJyYXl8QXJyYXl8U3RyaW5nKTogaW5wdXQgZGF0YSB0byBjb21wcmVzcy5cbiAqIC0gb3B0aW9ucyAoT2JqZWN0KTogemxpYiBkZWZsYXRlIG9wdGlvbnMuXG4gKlxuICogQ29tcHJlc3MgYGRhdGFgIHdpdGggZGVmbGF0ZSBhbGdvcml0aG0gYW5kIGBvcHRpb25zYC5cbiAqXG4gKiBTdXBwb3J0ZWQgb3B0aW9ucyBhcmU6XG4gKlxuICogLSBsZXZlbFxuICogLSB3aW5kb3dCaXRzXG4gKiAtIG1lbUxldmVsXG4gKiAtIHN0cmF0ZWd5XG4gKiAtIGRpY3Rpb25hcnlcbiAqXG4gKiBbaHR0cDovL3psaWIubmV0L21hbnVhbC5odG1sI0FkdmFuY2VkXShodHRwOi8vemxpYi5uZXQvbWFudWFsLmh0bWwjQWR2YW5jZWQpXG4gKiBmb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGVzZS5cbiAqXG4gKiBTdWdhciAob3B0aW9ucyk6XG4gKlxuICogLSBgcmF3YCAoQm9vbGVhbikgLSBzYXkgdGhhdCB3ZSB3b3JrIHdpdGggcmF3IHN0cmVhbSwgaWYgeW91IGRvbid0IHdpc2ggdG8gc3BlY2lmeVxuICogICBuZWdhdGl2ZSB3aW5kb3dCaXRzIGltcGxpY2l0bHkuXG4gKiAtIGB0b2AgKFN0cmluZykgLSBpZiBlcXVhbCB0byAnc3RyaW5nJywgdGhlbiByZXN1bHQgd2lsbCBiZSBcImJpbmFyeSBzdHJpbmdcIlxuICogICAgKGVhY2ggY2hhciBjb2RlIFswLi4yNTVdKVxuICpcbiAqICMjIyMjIEV4YW1wbGU6XG4gKlxuICogYGBgamF2YXNjcmlwdFxuICogdmFyIHBha28gPSByZXF1aXJlKCdwYWtvJylcbiAqICAgLCBkYXRhID0gVWludDhBcnJheShbMSwyLDMsNCw1LDYsNyw4LDldKTtcbiAqXG4gKiBjb25zb2xlLmxvZyhwYWtvLmRlZmxhdGUoZGF0YSkpO1xuICogYGBgXG4gKiovXG5mdW5jdGlvbiBkZWZsYXRlKGlucHV0LCBvcHRpb25zKSB7XG4gIHZhciBkZWZsYXRvciA9IG5ldyBEZWZsYXRlKG9wdGlvbnMpO1xuXG4gIGRlZmxhdG9yLnB1c2goaW5wdXQsIHRydWUpO1xuXG4gIC8vIFRoYXQgd2lsbCBuZXZlciBoYXBwZW5zLCBpZiB5b3UgZG9uJ3QgY2hlYXQgd2l0aCBvcHRpb25zIDopXG4gIGlmIChkZWZsYXRvci5lcnIpIHsgdGhyb3cgZGVmbGF0b3IubXNnOyB9XG5cbiAgcmV0dXJuIGRlZmxhdG9yLnJlc3VsdDtcbn1cblxuXG4vKipcbiAqIGRlZmxhdGVSYXcoZGF0YVssIG9wdGlvbnNdKSAtPiBVaW50OEFycmF5fEFycmF5fFN0cmluZ1xuICogLSBkYXRhIChVaW50OEFycmF5fEFycmF5fFN0cmluZyk6IGlucHV0IGRhdGEgdG8gY29tcHJlc3MuXG4gKiAtIG9wdGlvbnMgKE9iamVjdCk6IHpsaWIgZGVmbGF0ZSBvcHRpb25zLlxuICpcbiAqIFRoZSBzYW1lIGFzIFtbZGVmbGF0ZV1dLCBidXQgY3JlYXRlcyByYXcgZGF0YSwgd2l0aG91dCB3cmFwcGVyXG4gKiAoaGVhZGVyIGFuZCBhZGxlcjMyIGNyYykuXG4gKiovXG5mdW5jdGlvbiBkZWZsYXRlUmF3KGlucHV0LCBvcHRpb25zKSB7XG4gIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICBvcHRpb25zLnJhdyA9IHRydWU7XG4gIHJldHVybiBkZWZsYXRlKGlucHV0LCBvcHRpb25zKTtcbn1cblxuXG4vKipcbiAqIGd6aXAoZGF0YVssIG9wdGlvbnNdKSAtPiBVaW50OEFycmF5fEFycmF5fFN0cmluZ1xuICogLSBkYXRhIChVaW50OEFycmF5fEFycmF5fFN0cmluZyk6IGlucHV0IGRhdGEgdG8gY29tcHJlc3MuXG4gKiAtIG9wdGlvbnMgKE9iamVjdCk6IHpsaWIgZGVmbGF0ZSBvcHRpb25zLlxuICpcbiAqIFRoZSBzYW1lIGFzIFtbZGVmbGF0ZV1dLCBidXQgY3JlYXRlIGd6aXAgd3JhcHBlciBpbnN0ZWFkIG9mXG4gKiBkZWZsYXRlIG9uZS5cbiAqKi9cbmZ1bmN0aW9uIGd6aXAoaW5wdXQsIG9wdGlvbnMpIHtcbiAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gIG9wdGlvbnMuZ3ppcCA9IHRydWU7XG4gIHJldHVybiBkZWZsYXRlKGlucHV0LCBvcHRpb25zKTtcbn1cblxuXG5leHBvcnRzLkRlZmxhdGUgPSBEZWZsYXRlO1xuZXhwb3J0cy5kZWZsYXRlID0gZGVmbGF0ZTtcbmV4cG9ydHMuZGVmbGF0ZVJhdyA9IGRlZmxhdGVSYXc7XG5leHBvcnRzLmd6aXAgPSBnemlwO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5cbnZhciB6bGliX2luZmxhdGUgPSByZXF1aXJlKCcuL3psaWIvaW5mbGF0ZScpO1xudmFyIHV0aWxzICAgICAgICA9IHJlcXVpcmUoJy4vdXRpbHMvY29tbW9uJyk7XG52YXIgc3RyaW5ncyAgICAgID0gcmVxdWlyZSgnLi91dGlscy9zdHJpbmdzJyk7XG52YXIgYyAgICAgICAgICAgID0gcmVxdWlyZSgnLi96bGliL2NvbnN0YW50cycpO1xudmFyIG1zZyAgICAgICAgICA9IHJlcXVpcmUoJy4vemxpYi9tZXNzYWdlcycpO1xudmFyIFpTdHJlYW0gICAgICA9IHJlcXVpcmUoJy4vemxpYi96c3RyZWFtJyk7XG52YXIgR1poZWFkZXIgICAgID0gcmVxdWlyZSgnLi96bGliL2d6aGVhZGVyJyk7XG5cbnZhciB0b1N0cmluZyA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmc7XG5cbi8qKlxuICogY2xhc3MgSW5mbGF0ZVxuICpcbiAqIEdlbmVyaWMgSlMtc3R5bGUgd3JhcHBlciBmb3IgemxpYiBjYWxscy4gSWYgeW91IGRvbid0IG5lZWRcbiAqIHN0cmVhbWluZyBiZWhhdmlvdXIgLSB1c2UgbW9yZSBzaW1wbGUgZnVuY3Rpb25zOiBbW2luZmxhdGVdXVxuICogYW5kIFtbaW5mbGF0ZVJhd11dLlxuICoqL1xuXG4vKiBpbnRlcm5hbFxuICogaW5mbGF0ZS5jaHVua3MgLT4gQXJyYXlcbiAqXG4gKiBDaHVua3Mgb2Ygb3V0cHV0IGRhdGEsIGlmIFtbSW5mbGF0ZSNvbkRhdGFdXSBub3Qgb3ZlcnJpZGVuLlxuICoqL1xuXG4vKipcbiAqIEluZmxhdGUucmVzdWx0IC0+IFVpbnQ4QXJyYXl8QXJyYXl8U3RyaW5nXG4gKlxuICogVW5jb21wcmVzc2VkIHJlc3VsdCwgZ2VuZXJhdGVkIGJ5IGRlZmF1bHQgW1tJbmZsYXRlI29uRGF0YV1dXG4gKiBhbmQgW1tJbmZsYXRlI29uRW5kXV0gaGFuZGxlcnMuIEZpbGxlZCBhZnRlciB5b3UgcHVzaCBsYXN0IGNodW5rXG4gKiAoY2FsbCBbW0luZmxhdGUjcHVzaF1dIHdpdGggYFpfRklOSVNIYCAvIGB0cnVlYCBwYXJhbSkgb3IgaWYgeW91XG4gKiBwdXNoIGEgY2h1bmsgd2l0aCBleHBsaWNpdCBmbHVzaCAoY2FsbCBbW0luZmxhdGUjcHVzaF1dIHdpdGhcbiAqIGBaX1NZTkNfRkxVU0hgIHBhcmFtKS5cbiAqKi9cblxuLyoqXG4gKiBJbmZsYXRlLmVyciAtPiBOdW1iZXJcbiAqXG4gKiBFcnJvciBjb2RlIGFmdGVyIGluZmxhdGUgZmluaXNoZWQuIDAgKFpfT0spIG9uIHN1Y2Nlc3MuXG4gKiBTaG91bGQgYmUgY2hlY2tlZCBpZiBicm9rZW4gZGF0YSBwb3NzaWJsZS5cbiAqKi9cblxuLyoqXG4gKiBJbmZsYXRlLm1zZyAtPiBTdHJpbmdcbiAqXG4gKiBFcnJvciBtZXNzYWdlLCBpZiBbW0luZmxhdGUuZXJyXV0gIT0gMFxuICoqL1xuXG5cbi8qKlxuICogbmV3IEluZmxhdGUob3B0aW9ucylcbiAqIC0gb3B0aW9ucyAoT2JqZWN0KTogemxpYiBpbmZsYXRlIG9wdGlvbnMuXG4gKlxuICogQ3JlYXRlcyBuZXcgaW5mbGF0b3IgaW5zdGFuY2Ugd2l0aCBzcGVjaWZpZWQgcGFyYW1zLiBUaHJvd3MgZXhjZXB0aW9uXG4gKiBvbiBiYWQgcGFyYW1zLiBTdXBwb3J0ZWQgb3B0aW9uczpcbiAqXG4gKiAtIGB3aW5kb3dCaXRzYFxuICogLSBgZGljdGlvbmFyeWBcbiAqXG4gKiBbaHR0cDovL3psaWIubmV0L21hbnVhbC5odG1sI0FkdmFuY2VkXShodHRwOi8vemxpYi5uZXQvbWFudWFsLmh0bWwjQWR2YW5jZWQpXG4gKiBmb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGVzZS5cbiAqXG4gKiBBZGRpdGlvbmFsIG9wdGlvbnMsIGZvciBpbnRlcm5hbCBuZWVkczpcbiAqXG4gKiAtIGBjaHVua1NpemVgIC0gc2l6ZSBvZiBnZW5lcmF0ZWQgZGF0YSBjaHVua3MgKDE2SyBieSBkZWZhdWx0KVxuICogLSBgcmF3YCAoQm9vbGVhbikgLSBkbyByYXcgaW5mbGF0ZVxuICogLSBgdG9gIChTdHJpbmcpIC0gaWYgZXF1YWwgdG8gJ3N0cmluZycsIHRoZW4gcmVzdWx0IHdpbGwgYmUgY29udmVydGVkXG4gKiAgIGZyb20gdXRmOCB0byB1dGYxNiAoamF2YXNjcmlwdCkgc3RyaW5nLiBXaGVuIHN0cmluZyBvdXRwdXQgcmVxdWVzdGVkLFxuICogICBjaHVuayBsZW5ndGggY2FuIGRpZmZlciBmcm9tIGBjaHVua1NpemVgLCBkZXBlbmRpbmcgb24gY29udGVudC5cbiAqXG4gKiBCeSBkZWZhdWx0LCB3aGVuIG5vIG9wdGlvbnMgc2V0LCBhdXRvZGV0ZWN0IGRlZmxhdGUvZ3ppcCBkYXRhIGZvcm1hdCB2aWFcbiAqIHdyYXBwZXIgaGVhZGVyLlxuICpcbiAqICMjIyMjIEV4YW1wbGU6XG4gKlxuICogYGBgamF2YXNjcmlwdFxuICogdmFyIHBha28gPSByZXF1aXJlKCdwYWtvJylcbiAqICAgLCBjaHVuazEgPSBVaW50OEFycmF5KFsxLDIsMyw0LDUsNiw3LDgsOV0pXG4gKiAgICwgY2h1bmsyID0gVWludDhBcnJheShbMTAsMTEsMTIsMTMsMTQsMTUsMTYsMTcsMTgsMTldKTtcbiAqXG4gKiB2YXIgaW5mbGF0ZSA9IG5ldyBwYWtvLkluZmxhdGUoeyBsZXZlbDogM30pO1xuICpcbiAqIGluZmxhdGUucHVzaChjaHVuazEsIGZhbHNlKTtcbiAqIGluZmxhdGUucHVzaChjaHVuazIsIHRydWUpOyAgLy8gdHJ1ZSAtPiBsYXN0IGNodW5rXG4gKlxuICogaWYgKGluZmxhdGUuZXJyKSB7IHRocm93IG5ldyBFcnJvcihpbmZsYXRlLmVycik7IH1cbiAqXG4gKiBjb25zb2xlLmxvZyhpbmZsYXRlLnJlc3VsdCk7XG4gKiBgYGBcbiAqKi9cbmZ1bmN0aW9uIEluZmxhdGUob3B0aW9ucykge1xuICBpZiAoISh0aGlzIGluc3RhbmNlb2YgSW5mbGF0ZSkpIHJldHVybiBuZXcgSW5mbGF0ZShvcHRpb25zKTtcblxuICB0aGlzLm9wdGlvbnMgPSB1dGlscy5hc3NpZ24oe1xuICAgIGNodW5rU2l6ZTogMTYzODQsXG4gICAgd2luZG93Qml0czogMCxcbiAgICB0bzogJydcbiAgfSwgb3B0aW9ucyB8fCB7fSk7XG5cbiAgdmFyIG9wdCA9IHRoaXMub3B0aW9ucztcblxuICAvLyBGb3JjZSB3aW5kb3cgc2l6ZSBmb3IgYHJhd2AgZGF0YSwgaWYgbm90IHNldCBkaXJlY3RseSxcbiAgLy8gYmVjYXVzZSB3ZSBoYXZlIG5vIGhlYWRlciBmb3IgYXV0b2RldGVjdC5cbiAgaWYgKG9wdC5yYXcgJiYgKG9wdC53aW5kb3dCaXRzID49IDApICYmIChvcHQud2luZG93Qml0cyA8IDE2KSkge1xuICAgIG9wdC53aW5kb3dCaXRzID0gLW9wdC53aW5kb3dCaXRzO1xuICAgIGlmIChvcHQud2luZG93Qml0cyA9PT0gMCkgeyBvcHQud2luZG93Qml0cyA9IC0xNTsgfVxuICB9XG5cbiAgLy8gSWYgYHdpbmRvd0JpdHNgIG5vdCBkZWZpbmVkIChhbmQgbW9kZSBub3QgcmF3KSAtIHNldCBhdXRvZGV0ZWN0IGZsYWcgZm9yIGd6aXAvZGVmbGF0ZVxuICBpZiAoKG9wdC53aW5kb3dCaXRzID49IDApICYmIChvcHQud2luZG93Qml0cyA8IDE2KSAmJlxuICAgICAgIShvcHRpb25zICYmIG9wdGlvbnMud2luZG93Qml0cykpIHtcbiAgICBvcHQud2luZG93Qml0cyArPSAzMjtcbiAgfVxuXG4gIC8vIEd6aXAgaGVhZGVyIGhhcyBubyBpbmZvIGFib3V0IHdpbmRvd3Mgc2l6ZSwgd2UgY2FuIGRvIGF1dG9kZXRlY3Qgb25seVxuICAvLyBmb3IgZGVmbGF0ZS4gU28sIGlmIHdpbmRvdyBzaXplIG5vdCBzZXQsIGZvcmNlIGl0IHRvIG1heCB3aGVuIGd6aXAgcG9zc2libGVcbiAgaWYgKChvcHQud2luZG93Qml0cyA+IDE1KSAmJiAob3B0LndpbmRvd0JpdHMgPCA0OCkpIHtcbiAgICAvLyBiaXQgMyAoMTYpIC0+IGd6aXBwZWQgZGF0YVxuICAgIC8vIGJpdCA0ICgzMikgLT4gYXV0b2RldGVjdCBnemlwL2RlZmxhdGVcbiAgICBpZiAoKG9wdC53aW5kb3dCaXRzICYgMTUpID09PSAwKSB7XG4gICAgICBvcHQud2luZG93Qml0cyB8PSAxNTtcbiAgICB9XG4gIH1cblxuICB0aGlzLmVyciAgICA9IDA7ICAgICAgLy8gZXJyb3IgY29kZSwgaWYgaGFwcGVucyAoMCA9IFpfT0spXG4gIHRoaXMubXNnICAgID0gJyc7ICAgICAvLyBlcnJvciBtZXNzYWdlXG4gIHRoaXMuZW5kZWQgID0gZmFsc2U7ICAvLyB1c2VkIHRvIGF2b2lkIG11bHRpcGxlIG9uRW5kKCkgY2FsbHNcbiAgdGhpcy5jaHVua3MgPSBbXTsgICAgIC8vIGNodW5rcyBvZiBjb21wcmVzc2VkIGRhdGFcblxuICB0aGlzLnN0cm0gICA9IG5ldyBaU3RyZWFtKCk7XG4gIHRoaXMuc3RybS5hdmFpbF9vdXQgPSAwO1xuXG4gIHZhciBzdGF0dXMgID0gemxpYl9pbmZsYXRlLmluZmxhdGVJbml0MihcbiAgICB0aGlzLnN0cm0sXG4gICAgb3B0LndpbmRvd0JpdHNcbiAgKTtcblxuICBpZiAoc3RhdHVzICE9PSBjLlpfT0spIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IobXNnW3N0YXR1c10pO1xuICB9XG5cbiAgdGhpcy5oZWFkZXIgPSBuZXcgR1poZWFkZXIoKTtcblxuICB6bGliX2luZmxhdGUuaW5mbGF0ZUdldEhlYWRlcih0aGlzLnN0cm0sIHRoaXMuaGVhZGVyKTtcbn1cblxuLyoqXG4gKiBJbmZsYXRlI3B1c2goZGF0YVssIG1vZGVdKSAtPiBCb29sZWFuXG4gKiAtIGRhdGEgKFVpbnQ4QXJyYXl8QXJyYXl8QXJyYXlCdWZmZXJ8U3RyaW5nKTogaW5wdXQgZGF0YVxuICogLSBtb2RlIChOdW1iZXJ8Qm9vbGVhbik6IDAuLjYgZm9yIGNvcnJlc3BvbmRpbmcgWl9OT19GTFVTSC4uWl9UUkVFIG1vZGVzLlxuICogICBTZWUgY29uc3RhbnRzLiBTa2lwcGVkIG9yIGBmYWxzZWAgbWVhbnMgWl9OT19GTFVTSCwgYHRydWVgIG1lYW5zaCBaX0ZJTklTSC5cbiAqXG4gKiBTZW5kcyBpbnB1dCBkYXRhIHRvIGluZmxhdGUgcGlwZSwgZ2VuZXJhdGluZyBbW0luZmxhdGUjb25EYXRhXV0gY2FsbHMgd2l0aFxuICogbmV3IG91dHB1dCBjaHVua3MuIFJldHVybnMgYHRydWVgIG9uIHN1Y2Nlc3MuIFRoZSBsYXN0IGRhdGEgYmxvY2sgbXVzdCBoYXZlXG4gKiBtb2RlIFpfRklOSVNIIChvciBgdHJ1ZWApLiBUaGF0IHdpbGwgZmx1c2ggaW50ZXJuYWwgcGVuZGluZyBidWZmZXJzIGFuZCBjYWxsXG4gKiBbW0luZmxhdGUjb25FbmRdXS4gRm9yIGludGVyaW0gZXhwbGljaXQgZmx1c2hlcyAod2l0aG91dCBlbmRpbmcgdGhlIHN0cmVhbSkgeW91XG4gKiBjYW4gdXNlIG1vZGUgWl9TWU5DX0ZMVVNILCBrZWVwaW5nIHRoZSBkZWNvbXByZXNzaW9uIGNvbnRleHQuXG4gKlxuICogT24gZmFpbCBjYWxsIFtbSW5mbGF0ZSNvbkVuZF1dIHdpdGggZXJyb3IgY29kZSBhbmQgcmV0dXJuIGZhbHNlLlxuICpcbiAqIFdlIHN0cm9uZ2x5IHJlY29tbWVuZCB0byB1c2UgYFVpbnQ4QXJyYXlgIG9uIGlucHV0IGZvciBiZXN0IHNwZWVkIChvdXRwdXRcbiAqIGZvcm1hdCBpcyBkZXRlY3RlZCBhdXRvbWF0aWNhbGx5KS4gQWxzbywgZG9uJ3Qgc2tpcCBsYXN0IHBhcmFtIGFuZCBhbHdheXNcbiAqIHVzZSB0aGUgc2FtZSB0eXBlIGluIHlvdXIgY29kZSAoYm9vbGVhbiBvciBudW1iZXIpLiBUaGF0IHdpbGwgaW1wcm92ZSBKUyBzcGVlZC5cbiAqXG4gKiBGb3IgcmVndWxhciBgQXJyYXlgLXMgbWFrZSBzdXJlIGFsbCBlbGVtZW50cyBhcmUgWzAuLjI1NV0uXG4gKlxuICogIyMjIyMgRXhhbXBsZVxuICpcbiAqIGBgYGphdmFzY3JpcHRcbiAqIHB1c2goY2h1bmssIGZhbHNlKTsgLy8gcHVzaCBvbmUgb2YgZGF0YSBjaHVua3NcbiAqIC4uLlxuICogcHVzaChjaHVuaywgdHJ1ZSk7ICAvLyBwdXNoIGxhc3QgY2h1bmtcbiAqIGBgYFxuICoqL1xuSW5mbGF0ZS5wcm90b3R5cGUucHVzaCA9IGZ1bmN0aW9uIChkYXRhLCBtb2RlKSB7XG4gIHZhciBzdHJtID0gdGhpcy5zdHJtO1xuICB2YXIgY2h1bmtTaXplID0gdGhpcy5vcHRpb25zLmNodW5rU2l6ZTtcbiAgdmFyIGRpY3Rpb25hcnkgPSB0aGlzLm9wdGlvbnMuZGljdGlvbmFyeTtcbiAgdmFyIHN0YXR1cywgX21vZGU7XG4gIHZhciBuZXh0X291dF91dGY4LCB0YWlsLCB1dGY4c3RyO1xuICB2YXIgZGljdDtcblxuICAvLyBGbGFnIHRvIHByb3Blcmx5IHByb2Nlc3MgWl9CVUZfRVJST1Igb24gdGVzdGluZyBpbmZsYXRlIGNhbGxcbiAgLy8gd2hlbiB3ZSBjaGVjayB0aGF0IGFsbCBvdXRwdXQgZGF0YSB3YXMgZmx1c2hlZC5cbiAgdmFyIGFsbG93QnVmRXJyb3IgPSBmYWxzZTtcblxuICBpZiAodGhpcy5lbmRlZCkgeyByZXR1cm4gZmFsc2U7IH1cbiAgX21vZGUgPSAobW9kZSA9PT0gfn5tb2RlKSA/IG1vZGUgOiAoKG1vZGUgPT09IHRydWUpID8gYy5aX0ZJTklTSCA6IGMuWl9OT19GTFVTSCk7XG5cbiAgLy8gQ29udmVydCBkYXRhIGlmIG5lZWRlZFxuICBpZiAodHlwZW9mIGRhdGEgPT09ICdzdHJpbmcnKSB7XG4gICAgLy8gT25seSBiaW5hcnkgc3RyaW5ncyBjYW4gYmUgZGVjb21wcmVzc2VkIG9uIHByYWN0aWNlXG4gICAgc3RybS5pbnB1dCA9IHN0cmluZ3MuYmluc3RyaW5nMmJ1ZihkYXRhKTtcbiAgfSBlbHNlIGlmICh0b1N0cmluZy5jYWxsKGRhdGEpID09PSAnW29iamVjdCBBcnJheUJ1ZmZlcl0nKSB7XG4gICAgc3RybS5pbnB1dCA9IG5ldyBVaW50OEFycmF5KGRhdGEpO1xuICB9IGVsc2Uge1xuICAgIHN0cm0uaW5wdXQgPSBkYXRhO1xuICB9XG5cbiAgc3RybS5uZXh0X2luID0gMDtcbiAgc3RybS5hdmFpbF9pbiA9IHN0cm0uaW5wdXQubGVuZ3RoO1xuXG4gIGRvIHtcbiAgICBpZiAoc3RybS5hdmFpbF9vdXQgPT09IDApIHtcbiAgICAgIHN0cm0ub3V0cHV0ID0gbmV3IHV0aWxzLkJ1ZjgoY2h1bmtTaXplKTtcbiAgICAgIHN0cm0ubmV4dF9vdXQgPSAwO1xuICAgICAgc3RybS5hdmFpbF9vdXQgPSBjaHVua1NpemU7XG4gICAgfVxuXG4gICAgc3RhdHVzID0gemxpYl9pbmZsYXRlLmluZmxhdGUoc3RybSwgYy5aX05PX0ZMVVNIKTsgICAgLyogbm8gYmFkIHJldHVybiB2YWx1ZSAqL1xuXG4gICAgaWYgKHN0YXR1cyA9PT0gYy5aX05FRURfRElDVCAmJiBkaWN0aW9uYXJ5KSB7XG4gICAgICAvLyBDb252ZXJ0IGRhdGEgaWYgbmVlZGVkXG4gICAgICBpZiAodHlwZW9mIGRpY3Rpb25hcnkgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIGRpY3QgPSBzdHJpbmdzLnN0cmluZzJidWYoZGljdGlvbmFyeSk7XG4gICAgICB9IGVsc2UgaWYgKHRvU3RyaW5nLmNhbGwoZGljdGlvbmFyeSkgPT09ICdbb2JqZWN0IEFycmF5QnVmZmVyXScpIHtcbiAgICAgICAgZGljdCA9IG5ldyBVaW50OEFycmF5KGRpY3Rpb25hcnkpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZGljdCA9IGRpY3Rpb25hcnk7XG4gICAgICB9XG5cbiAgICAgIHN0YXR1cyA9IHpsaWJfaW5mbGF0ZS5pbmZsYXRlU2V0RGljdGlvbmFyeSh0aGlzLnN0cm0sIGRpY3QpO1xuXG4gICAgfVxuXG4gICAgaWYgKHN0YXR1cyA9PT0gYy5aX0JVRl9FUlJPUiAmJiBhbGxvd0J1ZkVycm9yID09PSB0cnVlKSB7XG4gICAgICBzdGF0dXMgPSBjLlpfT0s7XG4gICAgICBhbGxvd0J1ZkVycm9yID0gZmFsc2U7XG4gICAgfVxuXG4gICAgaWYgKHN0YXR1cyAhPT0gYy5aX1NUUkVBTV9FTkQgJiYgc3RhdHVzICE9PSBjLlpfT0spIHtcbiAgICAgIHRoaXMub25FbmQoc3RhdHVzKTtcbiAgICAgIHRoaXMuZW5kZWQgPSB0cnVlO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGlmIChzdHJtLm5leHRfb3V0KSB7XG4gICAgICBpZiAoc3RybS5hdmFpbF9vdXQgPT09IDAgfHwgc3RhdHVzID09PSBjLlpfU1RSRUFNX0VORCB8fCAoc3RybS5hdmFpbF9pbiA9PT0gMCAmJiAoX21vZGUgPT09IGMuWl9GSU5JU0ggfHwgX21vZGUgPT09IGMuWl9TWU5DX0ZMVVNIKSkpIHtcblxuICAgICAgICBpZiAodGhpcy5vcHRpb25zLnRvID09PSAnc3RyaW5nJykge1xuXG4gICAgICAgICAgbmV4dF9vdXRfdXRmOCA9IHN0cmluZ3MudXRmOGJvcmRlcihzdHJtLm91dHB1dCwgc3RybS5uZXh0X291dCk7XG5cbiAgICAgICAgICB0YWlsID0gc3RybS5uZXh0X291dCAtIG5leHRfb3V0X3V0Zjg7XG4gICAgICAgICAgdXRmOHN0ciA9IHN0cmluZ3MuYnVmMnN0cmluZyhzdHJtLm91dHB1dCwgbmV4dF9vdXRfdXRmOCk7XG5cbiAgICAgICAgICAvLyBtb3ZlIHRhaWxcbiAgICAgICAgICBzdHJtLm5leHRfb3V0ID0gdGFpbDtcbiAgICAgICAgICBzdHJtLmF2YWlsX291dCA9IGNodW5rU2l6ZSAtIHRhaWw7XG4gICAgICAgICAgaWYgKHRhaWwpIHsgdXRpbHMuYXJyYXlTZXQoc3RybS5vdXRwdXQsIHN0cm0ub3V0cHV0LCBuZXh0X291dF91dGY4LCB0YWlsLCAwKTsgfVxuXG4gICAgICAgICAgdGhpcy5vbkRhdGEodXRmOHN0cik7XG5cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLm9uRGF0YSh1dGlscy5zaHJpbmtCdWYoc3RybS5vdXRwdXQsIHN0cm0ubmV4dF9vdXQpKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFdoZW4gbm8gbW9yZSBpbnB1dCBkYXRhLCB3ZSBzaG91bGQgY2hlY2sgdGhhdCBpbnRlcm5hbCBpbmZsYXRlIGJ1ZmZlcnNcbiAgICAvLyBhcmUgZmx1c2hlZC4gVGhlIG9ubHkgd2F5IHRvIGRvIGl0IHdoZW4gYXZhaWxfb3V0ID0gMCAtIHJ1biBvbmUgbW9yZVxuICAgIC8vIGluZmxhdGUgcGFzcy4gQnV0IGlmIG91dHB1dCBkYXRhIG5vdCBleGlzdHMsIGluZmxhdGUgcmV0dXJuIFpfQlVGX0VSUk9SLlxuICAgIC8vIEhlcmUgd2Ugc2V0IGZsYWcgdG8gcHJvY2VzcyB0aGlzIGVycm9yIHByb3Blcmx5LlxuICAgIC8vXG4gICAgLy8gTk9URS4gRGVmbGF0ZSBkb2VzIG5vdCByZXR1cm4gZXJyb3IgaW4gdGhpcyBjYXNlIGFuZCBkb2VzIG5vdCBuZWVkcyBzdWNoXG4gICAgLy8gbG9naWMuXG4gICAgaWYgKHN0cm0uYXZhaWxfaW4gPT09IDAgJiYgc3RybS5hdmFpbF9vdXQgPT09IDApIHtcbiAgICAgIGFsbG93QnVmRXJyb3IgPSB0cnVlO1xuICAgIH1cblxuICB9IHdoaWxlICgoc3RybS5hdmFpbF9pbiA+IDAgfHwgc3RybS5hdmFpbF9vdXQgPT09IDApICYmIHN0YXR1cyAhPT0gYy5aX1NUUkVBTV9FTkQpO1xuXG4gIGlmIChzdGF0dXMgPT09IGMuWl9TVFJFQU1fRU5EKSB7XG4gICAgX21vZGUgPSBjLlpfRklOSVNIO1xuICB9XG5cbiAgLy8gRmluYWxpemUgb24gdGhlIGxhc3QgY2h1bmsuXG4gIGlmIChfbW9kZSA9PT0gYy5aX0ZJTklTSCkge1xuICAgIHN0YXR1cyA9IHpsaWJfaW5mbGF0ZS5pbmZsYXRlRW5kKHRoaXMuc3RybSk7XG4gICAgdGhpcy5vbkVuZChzdGF0dXMpO1xuICAgIHRoaXMuZW5kZWQgPSB0cnVlO1xuICAgIHJldHVybiBzdGF0dXMgPT09IGMuWl9PSztcbiAgfVxuXG4gIC8vIGNhbGxiYWNrIGludGVyaW0gcmVzdWx0cyBpZiBaX1NZTkNfRkxVU0guXG4gIGlmIChfbW9kZSA9PT0gYy5aX1NZTkNfRkxVU0gpIHtcbiAgICB0aGlzLm9uRW5kKGMuWl9PSyk7XG4gICAgc3RybS5hdmFpbF9vdXQgPSAwO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59O1xuXG5cbi8qKlxuICogSW5mbGF0ZSNvbkRhdGEoY2h1bmspIC0+IFZvaWRcbiAqIC0gY2h1bmsgKFVpbnQ4QXJyYXl8QXJyYXl8U3RyaW5nKTogb3VwdXQgZGF0YS4gVHlwZSBvZiBhcnJheSBkZXBlbmRzXG4gKiAgIG9uIGpzIGVuZ2luZSBzdXBwb3J0LiBXaGVuIHN0cmluZyBvdXRwdXQgcmVxdWVzdGVkLCBlYWNoIGNodW5rXG4gKiAgIHdpbGwgYmUgc3RyaW5nLlxuICpcbiAqIEJ5IGRlZmF1bHQsIHN0b3JlcyBkYXRhIGJsb2NrcyBpbiBgY2h1bmtzW11gIHByb3BlcnR5IGFuZCBnbHVlXG4gKiB0aG9zZSBpbiBgb25FbmRgLiBPdmVycmlkZSB0aGlzIGhhbmRsZXIsIGlmIHlvdSBuZWVkIGFub3RoZXIgYmVoYXZpb3VyLlxuICoqL1xuSW5mbGF0ZS5wcm90b3R5cGUub25EYXRhID0gZnVuY3Rpb24gKGNodW5rKSB7XG4gIHRoaXMuY2h1bmtzLnB1c2goY2h1bmspO1xufTtcblxuXG4vKipcbiAqIEluZmxhdGUjb25FbmQoc3RhdHVzKSAtPiBWb2lkXG4gKiAtIHN0YXR1cyAoTnVtYmVyKTogaW5mbGF0ZSBzdGF0dXMuIDAgKFpfT0spIG9uIHN1Y2Nlc3MsXG4gKiAgIG90aGVyIGlmIG5vdC5cbiAqXG4gKiBDYWxsZWQgZWl0aGVyIGFmdGVyIHlvdSB0ZWxsIGluZmxhdGUgdGhhdCB0aGUgaW5wdXQgc3RyZWFtIGlzXG4gKiBjb21wbGV0ZSAoWl9GSU5JU0gpIG9yIHNob3VsZCBiZSBmbHVzaGVkIChaX1NZTkNfRkxVU0gpXG4gKiBvciBpZiBhbiBlcnJvciBoYXBwZW5lZC4gQnkgZGVmYXVsdCAtIGpvaW4gY29sbGVjdGVkIGNodW5rcyxcbiAqIGZyZWUgbWVtb3J5IGFuZCBmaWxsIGByZXN1bHRzYCAvIGBlcnJgIHByb3BlcnRpZXMuXG4gKiovXG5JbmZsYXRlLnByb3RvdHlwZS5vbkVuZCA9IGZ1bmN0aW9uIChzdGF0dXMpIHtcbiAgLy8gT24gc3VjY2VzcyAtIGpvaW5cbiAgaWYgKHN0YXR1cyA9PT0gYy5aX09LKSB7XG4gICAgaWYgKHRoaXMub3B0aW9ucy50byA9PT0gJ3N0cmluZycpIHtcbiAgICAgIC8vIEdsdWUgJiBjb252ZXJ0IGhlcmUsIHVudGlsIHdlIHRlYWNoIHBha28gdG8gc2VuZFxuICAgICAgLy8gdXRmOCBhbGxpZ25lZCBzdHJpbmdzIHRvIG9uRGF0YVxuICAgICAgdGhpcy5yZXN1bHQgPSB0aGlzLmNodW5rcy5qb2luKCcnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5yZXN1bHQgPSB1dGlscy5mbGF0dGVuQ2h1bmtzKHRoaXMuY2h1bmtzKTtcbiAgICB9XG4gIH1cbiAgdGhpcy5jaHVua3MgPSBbXTtcbiAgdGhpcy5lcnIgPSBzdGF0dXM7XG4gIHRoaXMubXNnID0gdGhpcy5zdHJtLm1zZztcbn07XG5cblxuLyoqXG4gKiBpbmZsYXRlKGRhdGFbLCBvcHRpb25zXSkgLT4gVWludDhBcnJheXxBcnJheXxTdHJpbmdcbiAqIC0gZGF0YSAoVWludDhBcnJheXxBcnJheXxTdHJpbmcpOiBpbnB1dCBkYXRhIHRvIGRlY29tcHJlc3MuXG4gKiAtIG9wdGlvbnMgKE9iamVjdCk6IHpsaWIgaW5mbGF0ZSBvcHRpb25zLlxuICpcbiAqIERlY29tcHJlc3MgYGRhdGFgIHdpdGggaW5mbGF0ZS91bmd6aXAgYW5kIGBvcHRpb25zYC4gQXV0b2RldGVjdFxuICogZm9ybWF0IHZpYSB3cmFwcGVyIGhlYWRlciBieSBkZWZhdWx0LiBUaGF0J3Mgd2h5IHdlIGRvbid0IHByb3ZpZGVcbiAqIHNlcGFyYXRlIGB1bmd6aXBgIG1ldGhvZC5cbiAqXG4gKiBTdXBwb3J0ZWQgb3B0aW9ucyBhcmU6XG4gKlxuICogLSB3aW5kb3dCaXRzXG4gKlxuICogW2h0dHA6Ly96bGliLm5ldC9tYW51YWwuaHRtbCNBZHZhbmNlZF0oaHR0cDovL3psaWIubmV0L21hbnVhbC5odG1sI0FkdmFuY2VkKVxuICogZm9yIG1vcmUgaW5mb3JtYXRpb24uXG4gKlxuICogU3VnYXIgKG9wdGlvbnMpOlxuICpcbiAqIC0gYHJhd2AgKEJvb2xlYW4pIC0gc2F5IHRoYXQgd2Ugd29yayB3aXRoIHJhdyBzdHJlYW0sIGlmIHlvdSBkb24ndCB3aXNoIHRvIHNwZWNpZnlcbiAqICAgbmVnYXRpdmUgd2luZG93Qml0cyBpbXBsaWNpdGx5LlxuICogLSBgdG9gIChTdHJpbmcpIC0gaWYgZXF1YWwgdG8gJ3N0cmluZycsIHRoZW4gcmVzdWx0IHdpbGwgYmUgY29udmVydGVkXG4gKiAgIGZyb20gdXRmOCB0byB1dGYxNiAoamF2YXNjcmlwdCkgc3RyaW5nLiBXaGVuIHN0cmluZyBvdXRwdXQgcmVxdWVzdGVkLFxuICogICBjaHVuayBsZW5ndGggY2FuIGRpZmZlciBmcm9tIGBjaHVua1NpemVgLCBkZXBlbmRpbmcgb24gY29udGVudC5cbiAqXG4gKlxuICogIyMjIyMgRXhhbXBsZTpcbiAqXG4gKiBgYGBqYXZhc2NyaXB0XG4gKiB2YXIgcGFrbyA9IHJlcXVpcmUoJ3Bha28nKVxuICogICAsIGlucHV0ID0gcGFrby5kZWZsYXRlKFsxLDIsMyw0LDUsNiw3LDgsOV0pXG4gKiAgICwgb3V0cHV0O1xuICpcbiAqIHRyeSB7XG4gKiAgIG91dHB1dCA9IHBha28uaW5mbGF0ZShpbnB1dCk7XG4gKiB9IGNhdGNoIChlcnIpXG4gKiAgIGNvbnNvbGUubG9nKGVycik7XG4gKiB9XG4gKiBgYGBcbiAqKi9cbmZ1bmN0aW9uIGluZmxhdGUoaW5wdXQsIG9wdGlvbnMpIHtcbiAgdmFyIGluZmxhdG9yID0gbmV3IEluZmxhdGUob3B0aW9ucyk7XG5cbiAgaW5mbGF0b3IucHVzaChpbnB1dCwgdHJ1ZSk7XG5cbiAgLy8gVGhhdCB3aWxsIG5ldmVyIGhhcHBlbnMsIGlmIHlvdSBkb24ndCBjaGVhdCB3aXRoIG9wdGlvbnMgOilcbiAgaWYgKGluZmxhdG9yLmVycikgeyB0aHJvdyBpbmZsYXRvci5tc2c7IH1cblxuICByZXR1cm4gaW5mbGF0b3IucmVzdWx0O1xufVxuXG5cbi8qKlxuICogaW5mbGF0ZVJhdyhkYXRhWywgb3B0aW9uc10pIC0+IFVpbnQ4QXJyYXl8QXJyYXl8U3RyaW5nXG4gKiAtIGRhdGEgKFVpbnQ4QXJyYXl8QXJyYXl8U3RyaW5nKTogaW5wdXQgZGF0YSB0byBkZWNvbXByZXNzLlxuICogLSBvcHRpb25zIChPYmplY3QpOiB6bGliIGluZmxhdGUgb3B0aW9ucy5cbiAqXG4gKiBUaGUgc2FtZSBhcyBbW2luZmxhdGVdXSwgYnV0IGNyZWF0ZXMgcmF3IGRhdGEsIHdpdGhvdXQgd3JhcHBlclxuICogKGhlYWRlciBhbmQgYWRsZXIzMiBjcmMpLlxuICoqL1xuZnVuY3Rpb24gaW5mbGF0ZVJhdyhpbnB1dCwgb3B0aW9ucykge1xuICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgb3B0aW9ucy5yYXcgPSB0cnVlO1xuICByZXR1cm4gaW5mbGF0ZShpbnB1dCwgb3B0aW9ucyk7XG59XG5cblxuLyoqXG4gKiB1bmd6aXAoZGF0YVssIG9wdGlvbnNdKSAtPiBVaW50OEFycmF5fEFycmF5fFN0cmluZ1xuICogLSBkYXRhIChVaW50OEFycmF5fEFycmF5fFN0cmluZyk6IGlucHV0IGRhdGEgdG8gZGVjb21wcmVzcy5cbiAqIC0gb3B0aW9ucyAoT2JqZWN0KTogemxpYiBpbmZsYXRlIG9wdGlvbnMuXG4gKlxuICogSnVzdCBzaG9ydGN1dCB0byBbW2luZmxhdGVdXSwgYmVjYXVzZSBpdCBhdXRvZGV0ZWN0cyBmb3JtYXRcbiAqIGJ5IGhlYWRlci5jb250ZW50LiBEb25lIGZvciBjb252ZW5pZW5jZS5cbiAqKi9cblxuXG5leHBvcnRzLkluZmxhdGUgPSBJbmZsYXRlO1xuZXhwb3J0cy5pbmZsYXRlID0gaW5mbGF0ZTtcbmV4cG9ydHMuaW5mbGF0ZVJhdyA9IGluZmxhdGVSYXc7XG5leHBvcnRzLnVuZ3ppcCAgPSBpbmZsYXRlO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5cbnZhciBUWVBFRF9PSyA9ICAodHlwZW9mIFVpbnQ4QXJyYXkgIT09ICd1bmRlZmluZWQnKSAmJlxuICAgICAgICAgICAgICAgICh0eXBlb2YgVWludDE2QXJyYXkgIT09ICd1bmRlZmluZWQnKSAmJlxuICAgICAgICAgICAgICAgICh0eXBlb2YgSW50MzJBcnJheSAhPT0gJ3VuZGVmaW5lZCcpO1xuXG5cbmV4cG9ydHMuYXNzaWduID0gZnVuY3Rpb24gKG9iaiAvKmZyb20xLCBmcm9tMiwgZnJvbTMsIC4uLiovKSB7XG4gIHZhciBzb3VyY2VzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKTtcbiAgd2hpbGUgKHNvdXJjZXMubGVuZ3RoKSB7XG4gICAgdmFyIHNvdXJjZSA9IHNvdXJjZXMuc2hpZnQoKTtcbiAgICBpZiAoIXNvdXJjZSkgeyBjb250aW51ZTsgfVxuXG4gICAgaWYgKHR5cGVvZiBzb3VyY2UgIT09ICdvYmplY3QnKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKHNvdXJjZSArICdtdXN0IGJlIG5vbi1vYmplY3QnKTtcbiAgICB9XG5cbiAgICBmb3IgKHZhciBwIGluIHNvdXJjZSkge1xuICAgICAgaWYgKHNvdXJjZS5oYXNPd25Qcm9wZXJ0eShwKSkge1xuICAgICAgICBvYmpbcF0gPSBzb3VyY2VbcF07XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG9iajtcbn07XG5cblxuLy8gcmVkdWNlIGJ1ZmZlciBzaXplLCBhdm9pZGluZyBtZW0gY29weVxuZXhwb3J0cy5zaHJpbmtCdWYgPSBmdW5jdGlvbiAoYnVmLCBzaXplKSB7XG4gIGlmIChidWYubGVuZ3RoID09PSBzaXplKSB7IHJldHVybiBidWY7IH1cbiAgaWYgKGJ1Zi5zdWJhcnJheSkgeyByZXR1cm4gYnVmLnN1YmFycmF5KDAsIHNpemUpOyB9XG4gIGJ1Zi5sZW5ndGggPSBzaXplO1xuICByZXR1cm4gYnVmO1xufTtcblxuXG52YXIgZm5UeXBlZCA9IHtcbiAgYXJyYXlTZXQ6IGZ1bmN0aW9uIChkZXN0LCBzcmMsIHNyY19vZmZzLCBsZW4sIGRlc3Rfb2Zmcykge1xuICAgIGlmIChzcmMuc3ViYXJyYXkgJiYgZGVzdC5zdWJhcnJheSkge1xuICAgICAgZGVzdC5zZXQoc3JjLnN1YmFycmF5KHNyY19vZmZzLCBzcmNfb2ZmcyArIGxlbiksIGRlc3Rfb2Zmcyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIC8vIEZhbGxiYWNrIHRvIG9yZGluYXJ5IGFycmF5XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47IGkrKykge1xuICAgICAgZGVzdFtkZXN0X29mZnMgKyBpXSA9IHNyY1tzcmNfb2ZmcyArIGldO1xuICAgIH1cbiAgfSxcbiAgLy8gSm9pbiBhcnJheSBvZiBjaHVua3MgdG8gc2luZ2xlIGFycmF5LlxuICBmbGF0dGVuQ2h1bmtzOiBmdW5jdGlvbiAoY2h1bmtzKSB7XG4gICAgdmFyIGksIGwsIGxlbiwgcG9zLCBjaHVuaywgcmVzdWx0O1xuXG4gICAgLy8gY2FsY3VsYXRlIGRhdGEgbGVuZ3RoXG4gICAgbGVuID0gMDtcbiAgICBmb3IgKGkgPSAwLCBsID0gY2h1bmtzLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgICAgbGVuICs9IGNodW5rc1tpXS5sZW5ndGg7XG4gICAgfVxuXG4gICAgLy8gam9pbiBjaHVua3NcbiAgICByZXN1bHQgPSBuZXcgVWludDhBcnJheShsZW4pO1xuICAgIHBvcyA9IDA7XG4gICAgZm9yIChpID0gMCwgbCA9IGNodW5rcy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICAgIGNodW5rID0gY2h1bmtzW2ldO1xuICAgICAgcmVzdWx0LnNldChjaHVuaywgcG9zKTtcbiAgICAgIHBvcyArPSBjaHVuay5sZW5ndGg7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxufTtcblxudmFyIGZuVW50eXBlZCA9IHtcbiAgYXJyYXlTZXQ6IGZ1bmN0aW9uIChkZXN0LCBzcmMsIHNyY19vZmZzLCBsZW4sIGRlc3Rfb2Zmcykge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgIGRlc3RbZGVzdF9vZmZzICsgaV0gPSBzcmNbc3JjX29mZnMgKyBpXTtcbiAgICB9XG4gIH0sXG4gIC8vIEpvaW4gYXJyYXkgb2YgY2h1bmtzIHRvIHNpbmdsZSBhcnJheS5cbiAgZmxhdHRlbkNodW5rczogZnVuY3Rpb24gKGNodW5rcykge1xuICAgIHJldHVybiBbXS5jb25jYXQuYXBwbHkoW10sIGNodW5rcyk7XG4gIH1cbn07XG5cblxuLy8gRW5hYmxlL0Rpc2FibGUgdHlwZWQgYXJyYXlzIHVzZSwgZm9yIHRlc3Rpbmdcbi8vXG5leHBvcnRzLnNldFR5cGVkID0gZnVuY3Rpb24gKG9uKSB7XG4gIGlmIChvbikge1xuICAgIGV4cG9ydHMuQnVmOCAgPSBVaW50OEFycmF5O1xuICAgIGV4cG9ydHMuQnVmMTYgPSBVaW50MTZBcnJheTtcbiAgICBleHBvcnRzLkJ1ZjMyID0gSW50MzJBcnJheTtcbiAgICBleHBvcnRzLmFzc2lnbihleHBvcnRzLCBmblR5cGVkKTtcbiAgfSBlbHNlIHtcbiAgICBleHBvcnRzLkJ1ZjggID0gQXJyYXk7XG4gICAgZXhwb3J0cy5CdWYxNiA9IEFycmF5O1xuICAgIGV4cG9ydHMuQnVmMzIgPSBBcnJheTtcbiAgICBleHBvcnRzLmFzc2lnbihleHBvcnRzLCBmblVudHlwZWQpO1xuICB9XG59O1xuXG5leHBvcnRzLnNldFR5cGVkKFRZUEVEX09LKTtcbiIsIi8vIFN0cmluZyBlbmNvZGUvZGVjb2RlIGhlbHBlcnNcbid1c2Ugc3RyaWN0JztcblxuXG52YXIgdXRpbHMgPSByZXF1aXJlKCcuL2NvbW1vbicpO1xuXG5cbi8vIFF1aWNrIGNoZWNrIGlmIHdlIGNhbiB1c2UgZmFzdCBhcnJheSB0byBiaW4gc3RyaW5nIGNvbnZlcnNpb25cbi8vXG4vLyAtIGFwcGx5KEFycmF5KSBjYW4gZmFpbCBvbiBBbmRyb2lkIDIuMlxuLy8gLSBhcHBseShVaW50OEFycmF5KSBjYW4gZmFpbCBvbiBpT1MgNS4xIFNhZmFyeVxuLy9cbnZhciBTVFJfQVBQTFlfT0sgPSB0cnVlO1xudmFyIFNUUl9BUFBMWV9VSUFfT0sgPSB0cnVlO1xuXG50cnkgeyBTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KG51bGwsIFsgMCBdKTsgfSBjYXRjaCAoX18pIHsgU1RSX0FQUExZX09LID0gZmFsc2U7IH1cbnRyeSB7IFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkobnVsbCwgbmV3IFVpbnQ4QXJyYXkoMSkpOyB9IGNhdGNoIChfXykgeyBTVFJfQVBQTFlfVUlBX09LID0gZmFsc2U7IH1cblxuXG4vLyBUYWJsZSB3aXRoIHV0ZjggbGVuZ3RocyAoY2FsY3VsYXRlZCBieSBmaXJzdCBieXRlIG9mIHNlcXVlbmNlKVxuLy8gTm90ZSwgdGhhdCA1ICYgNi1ieXRlIHZhbHVlcyBhbmQgc29tZSA0LWJ5dGUgdmFsdWVzIGNhbiBub3QgYmUgcmVwcmVzZW50ZWQgaW4gSlMsXG4vLyBiZWNhdXNlIG1heCBwb3NzaWJsZSBjb2RlcG9pbnQgaXMgMHgxMGZmZmZcbnZhciBfdXRmOGxlbiA9IG5ldyB1dGlscy5CdWY4KDI1Nik7XG5mb3IgKHZhciBxID0gMDsgcSA8IDI1NjsgcSsrKSB7XG4gIF91dGY4bGVuW3FdID0gKHEgPj0gMjUyID8gNiA6IHEgPj0gMjQ4ID8gNSA6IHEgPj0gMjQwID8gNCA6IHEgPj0gMjI0ID8gMyA6IHEgPj0gMTkyID8gMiA6IDEpO1xufVxuX3V0ZjhsZW5bMjU0XSA9IF91dGY4bGVuWzI1NF0gPSAxOyAvLyBJbnZhbGlkIHNlcXVlbmNlIHN0YXJ0XG5cblxuLy8gY29udmVydCBzdHJpbmcgdG8gYXJyYXkgKHR5cGVkLCB3aGVuIHBvc3NpYmxlKVxuZXhwb3J0cy5zdHJpbmcyYnVmID0gZnVuY3Rpb24gKHN0cikge1xuICB2YXIgYnVmLCBjLCBjMiwgbV9wb3MsIGksIHN0cl9sZW4gPSBzdHIubGVuZ3RoLCBidWZfbGVuID0gMDtcblxuICAvLyBjb3VudCBiaW5hcnkgc2l6ZVxuICBmb3IgKG1fcG9zID0gMDsgbV9wb3MgPCBzdHJfbGVuOyBtX3BvcysrKSB7XG4gICAgYyA9IHN0ci5jaGFyQ29kZUF0KG1fcG9zKTtcbiAgICBpZiAoKGMgJiAweGZjMDApID09PSAweGQ4MDAgJiYgKG1fcG9zICsgMSA8IHN0cl9sZW4pKSB7XG4gICAgICBjMiA9IHN0ci5jaGFyQ29kZUF0KG1fcG9zICsgMSk7XG4gICAgICBpZiAoKGMyICYgMHhmYzAwKSA9PT0gMHhkYzAwKSB7XG4gICAgICAgIGMgPSAweDEwMDAwICsgKChjIC0gMHhkODAwKSA8PCAxMCkgKyAoYzIgLSAweGRjMDApO1xuICAgICAgICBtX3BvcysrO1xuICAgICAgfVxuICAgIH1cbiAgICBidWZfbGVuICs9IGMgPCAweDgwID8gMSA6IGMgPCAweDgwMCA/IDIgOiBjIDwgMHgxMDAwMCA/IDMgOiA0O1xuICB9XG5cbiAgLy8gYWxsb2NhdGUgYnVmZmVyXG4gIGJ1ZiA9IG5ldyB1dGlscy5CdWY4KGJ1Zl9sZW4pO1xuXG4gIC8vIGNvbnZlcnRcbiAgZm9yIChpID0gMCwgbV9wb3MgPSAwOyBpIDwgYnVmX2xlbjsgbV9wb3MrKykge1xuICAgIGMgPSBzdHIuY2hhckNvZGVBdChtX3Bvcyk7XG4gICAgaWYgKChjICYgMHhmYzAwKSA9PT0gMHhkODAwICYmIChtX3BvcyArIDEgPCBzdHJfbGVuKSkge1xuICAgICAgYzIgPSBzdHIuY2hhckNvZGVBdChtX3BvcyArIDEpO1xuICAgICAgaWYgKChjMiAmIDB4ZmMwMCkgPT09IDB4ZGMwMCkge1xuICAgICAgICBjID0gMHgxMDAwMCArICgoYyAtIDB4ZDgwMCkgPDwgMTApICsgKGMyIC0gMHhkYzAwKTtcbiAgICAgICAgbV9wb3MrKztcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGMgPCAweDgwKSB7XG4gICAgICAvKiBvbmUgYnl0ZSAqL1xuICAgICAgYnVmW2krK10gPSBjO1xuICAgIH0gZWxzZSBpZiAoYyA8IDB4ODAwKSB7XG4gICAgICAvKiB0d28gYnl0ZXMgKi9cbiAgICAgIGJ1ZltpKytdID0gMHhDMCB8IChjID4+PiA2KTtcbiAgICAgIGJ1ZltpKytdID0gMHg4MCB8IChjICYgMHgzZik7XG4gICAgfSBlbHNlIGlmIChjIDwgMHgxMDAwMCkge1xuICAgICAgLyogdGhyZWUgYnl0ZXMgKi9cbiAgICAgIGJ1ZltpKytdID0gMHhFMCB8IChjID4+PiAxMik7XG4gICAgICBidWZbaSsrXSA9IDB4ODAgfCAoYyA+Pj4gNiAmIDB4M2YpO1xuICAgICAgYnVmW2krK10gPSAweDgwIHwgKGMgJiAweDNmKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLyogZm91ciBieXRlcyAqL1xuICAgICAgYnVmW2krK10gPSAweGYwIHwgKGMgPj4+IDE4KTtcbiAgICAgIGJ1ZltpKytdID0gMHg4MCB8IChjID4+PiAxMiAmIDB4M2YpO1xuICAgICAgYnVmW2krK10gPSAweDgwIHwgKGMgPj4+IDYgJiAweDNmKTtcbiAgICAgIGJ1ZltpKytdID0gMHg4MCB8IChjICYgMHgzZik7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGJ1Zjtcbn07XG5cbi8vIEhlbHBlciAodXNlZCBpbiAyIHBsYWNlcylcbmZ1bmN0aW9uIGJ1ZjJiaW5zdHJpbmcoYnVmLCBsZW4pIHtcbiAgLy8gdXNlIGZhbGxiYWNrIGZvciBiaWcgYXJyYXlzIHRvIGF2b2lkIHN0YWNrIG92ZXJmbG93XG4gIGlmIChsZW4gPCA2NTUzNykge1xuICAgIGlmICgoYnVmLnN1YmFycmF5ICYmIFNUUl9BUFBMWV9VSUFfT0spIHx8ICghYnVmLnN1YmFycmF5ICYmIFNUUl9BUFBMWV9PSykpIHtcbiAgICAgIHJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KG51bGwsIHV0aWxzLnNocmlua0J1ZihidWYsIGxlbikpO1xuICAgIH1cbiAgfVxuXG4gIHZhciByZXN1bHQgPSAnJztcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47IGkrKykge1xuICAgIHJlc3VsdCArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGJ1ZltpXSk7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuXG4vLyBDb252ZXJ0IGJ5dGUgYXJyYXkgdG8gYmluYXJ5IHN0cmluZ1xuZXhwb3J0cy5idWYyYmluc3RyaW5nID0gZnVuY3Rpb24gKGJ1Zikge1xuICByZXR1cm4gYnVmMmJpbnN0cmluZyhidWYsIGJ1Zi5sZW5ndGgpO1xufTtcblxuXG4vLyBDb252ZXJ0IGJpbmFyeSBzdHJpbmcgKHR5cGVkLCB3aGVuIHBvc3NpYmxlKVxuZXhwb3J0cy5iaW5zdHJpbmcyYnVmID0gZnVuY3Rpb24gKHN0cikge1xuICB2YXIgYnVmID0gbmV3IHV0aWxzLkJ1Zjgoc3RyLmxlbmd0aCk7XG4gIGZvciAodmFyIGkgPSAwLCBsZW4gPSBidWYubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICBidWZbaV0gPSBzdHIuY2hhckNvZGVBdChpKTtcbiAgfVxuICByZXR1cm4gYnVmO1xufTtcblxuXG4vLyBjb252ZXJ0IGFycmF5IHRvIHN0cmluZ1xuZXhwb3J0cy5idWYyc3RyaW5nID0gZnVuY3Rpb24gKGJ1ZiwgbWF4KSB7XG4gIHZhciBpLCBvdXQsIGMsIGNfbGVuO1xuICB2YXIgbGVuID0gbWF4IHx8IGJ1Zi5sZW5ndGg7XG5cbiAgLy8gUmVzZXJ2ZSBtYXggcG9zc2libGUgbGVuZ3RoICgyIHdvcmRzIHBlciBjaGFyKVxuICAvLyBOQjogYnkgdW5rbm93biByZWFzb25zLCBBcnJheSBpcyBzaWduaWZpY2FudGx5IGZhc3RlciBmb3JcbiAgLy8gICAgIFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkgdGhhbiBVaW50MTZBcnJheS5cbiAgdmFyIHV0ZjE2YnVmID0gbmV3IEFycmF5KGxlbiAqIDIpO1xuXG4gIGZvciAob3V0ID0gMCwgaSA9IDA7IGkgPCBsZW47KSB7XG4gICAgYyA9IGJ1ZltpKytdO1xuICAgIC8vIHF1aWNrIHByb2Nlc3MgYXNjaWlcbiAgICBpZiAoYyA8IDB4ODApIHsgdXRmMTZidWZbb3V0KytdID0gYzsgY29udGludWU7IH1cblxuICAgIGNfbGVuID0gX3V0ZjhsZW5bY107XG4gICAgLy8gc2tpcCA1ICYgNiBieXRlIGNvZGVzXG4gICAgaWYgKGNfbGVuID4gNCkgeyB1dGYxNmJ1ZltvdXQrK10gPSAweGZmZmQ7IGkgKz0gY19sZW4gLSAxOyBjb250aW51ZTsgfVxuXG4gICAgLy8gYXBwbHkgbWFzayBvbiBmaXJzdCBieXRlXG4gICAgYyAmPSBjX2xlbiA9PT0gMiA/IDB4MWYgOiBjX2xlbiA9PT0gMyA/IDB4MGYgOiAweDA3O1xuICAgIC8vIGpvaW4gdGhlIHJlc3RcbiAgICB3aGlsZSAoY19sZW4gPiAxICYmIGkgPCBsZW4pIHtcbiAgICAgIGMgPSAoYyA8PCA2KSB8IChidWZbaSsrXSAmIDB4M2YpO1xuICAgICAgY19sZW4tLTtcbiAgICB9XG5cbiAgICAvLyB0ZXJtaW5hdGVkIGJ5IGVuZCBvZiBzdHJpbmc/XG4gICAgaWYgKGNfbGVuID4gMSkgeyB1dGYxNmJ1ZltvdXQrK10gPSAweGZmZmQ7IGNvbnRpbnVlOyB9XG5cbiAgICBpZiAoYyA8IDB4MTAwMDApIHtcbiAgICAgIHV0ZjE2YnVmW291dCsrXSA9IGM7XG4gICAgfSBlbHNlIHtcbiAgICAgIGMgLT0gMHgxMDAwMDtcbiAgICAgIHV0ZjE2YnVmW291dCsrXSA9IDB4ZDgwMCB8ICgoYyA+PiAxMCkgJiAweDNmZik7XG4gICAgICB1dGYxNmJ1ZltvdXQrK10gPSAweGRjMDAgfCAoYyAmIDB4M2ZmKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gYnVmMmJpbnN0cmluZyh1dGYxNmJ1Ziwgb3V0KTtcbn07XG5cblxuLy8gQ2FsY3VsYXRlIG1heCBwb3NzaWJsZSBwb3NpdGlvbiBpbiB1dGY4IGJ1ZmZlcixcbi8vIHRoYXQgd2lsbCBub3QgYnJlYWsgc2VxdWVuY2UuIElmIHRoYXQncyBub3QgcG9zc2libGVcbi8vIC0gKHZlcnkgc21hbGwgbGltaXRzKSByZXR1cm4gbWF4IHNpemUgYXMgaXMuXG4vL1xuLy8gYnVmW10gLSB1dGY4IGJ5dGVzIGFycmF5XG4vLyBtYXggICAtIGxlbmd0aCBsaW1pdCAobWFuZGF0b3J5KTtcbmV4cG9ydHMudXRmOGJvcmRlciA9IGZ1bmN0aW9uIChidWYsIG1heCkge1xuICB2YXIgcG9zO1xuXG4gIG1heCA9IG1heCB8fCBidWYubGVuZ3RoO1xuICBpZiAobWF4ID4gYnVmLmxlbmd0aCkgeyBtYXggPSBidWYubGVuZ3RoOyB9XG5cbiAgLy8gZ28gYmFjayBmcm9tIGxhc3QgcG9zaXRpb24sIHVudGlsIHN0YXJ0IG9mIHNlcXVlbmNlIGZvdW5kXG4gIHBvcyA9IG1heCAtIDE7XG4gIHdoaWxlIChwb3MgPj0gMCAmJiAoYnVmW3Bvc10gJiAweEMwKSA9PT0gMHg4MCkgeyBwb3MtLTsgfVxuXG4gIC8vIEZ1Y2t1cCAtIHZlcnkgc21hbGwgYW5kIGJyb2tlbiBzZXF1ZW5jZSxcbiAgLy8gcmV0dXJuIG1heCwgYmVjYXVzZSB3ZSBzaG91bGQgcmV0dXJuIHNvbWV0aGluZyBhbnl3YXkuXG4gIGlmIChwb3MgPCAwKSB7IHJldHVybiBtYXg7IH1cblxuICAvLyBJZiB3ZSBjYW1lIHRvIHN0YXJ0IG9mIGJ1ZmZlciAtIHRoYXQgbWVhbnMgdnVmZmVyIGlzIHRvbyBzbWFsbCxcbiAgLy8gcmV0dXJuIG1heCB0b28uXG4gIGlmIChwb3MgPT09IDApIHsgcmV0dXJuIG1heDsgfVxuXG4gIHJldHVybiAocG9zICsgX3V0ZjhsZW5bYnVmW3Bvc11dID4gbWF4KSA/IHBvcyA6IG1heDtcbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbi8vIE5vdGU6IGFkbGVyMzIgdGFrZXMgMTIlIGZvciBsZXZlbCAwIGFuZCAyJSBmb3IgbGV2ZWwgNi5cbi8vIEl0IGRvZXNuJ3Qgd29ydGggdG8gbWFrZSBhZGRpdGlvbmFsIG9wdGltaXphdGlvbmEgYXMgaW4gb3JpZ2luYWwuXG4vLyBTbWFsbCBzaXplIGlzIHByZWZlcmFibGUuXG5cbmZ1bmN0aW9uIGFkbGVyMzIoYWRsZXIsIGJ1ZiwgbGVuLCBwb3MpIHtcbiAgdmFyIHMxID0gKGFkbGVyICYgMHhmZmZmKSB8MCxcbiAgICAgIHMyID0gKChhZGxlciA+Pj4gMTYpICYgMHhmZmZmKSB8MCxcbiAgICAgIG4gPSAwO1xuXG4gIHdoaWxlIChsZW4gIT09IDApIHtcbiAgICAvLyBTZXQgbGltaXQgfiB0d2ljZSBsZXNzIHRoYW4gNTU1MiwgdG8ga2VlcFxuICAgIC8vIHMyIGluIDMxLWJpdHMsIGJlY2F1c2Ugd2UgZm9yY2Ugc2lnbmVkIGludHMuXG4gICAgLy8gaW4gb3RoZXIgY2FzZSAlPSB3aWxsIGZhaWwuXG4gICAgbiA9IGxlbiA+IDIwMDAgPyAyMDAwIDogbGVuO1xuICAgIGxlbiAtPSBuO1xuXG4gICAgZG8ge1xuICAgICAgczEgPSAoczEgKyBidWZbcG9zKytdKSB8MDtcbiAgICAgIHMyID0gKHMyICsgczEpIHwwO1xuICAgIH0gd2hpbGUgKC0tbik7XG5cbiAgICBzMSAlPSA2NTUyMTtcbiAgICBzMiAlPSA2NTUyMTtcbiAgfVxuXG4gIHJldHVybiAoczEgfCAoczIgPDwgMTYpKSB8MDtcbn1cblxuXG5tb2R1bGUuZXhwb3J0cyA9IGFkbGVyMzI7XG4iLCIndXNlIHN0cmljdCc7XG5cblxubW9kdWxlLmV4cG9ydHMgPSB7XG5cbiAgLyogQWxsb3dlZCBmbHVzaCB2YWx1ZXM7IHNlZSBkZWZsYXRlKCkgYW5kIGluZmxhdGUoKSBiZWxvdyBmb3IgZGV0YWlscyAqL1xuICBaX05PX0ZMVVNIOiAgICAgICAgIDAsXG4gIFpfUEFSVElBTF9GTFVTSDogICAgMSxcbiAgWl9TWU5DX0ZMVVNIOiAgICAgICAyLFxuICBaX0ZVTExfRkxVU0g6ICAgICAgIDMsXG4gIFpfRklOSVNIOiAgICAgICAgICAgNCxcbiAgWl9CTE9DSzogICAgICAgICAgICA1LFxuICBaX1RSRUVTOiAgICAgICAgICAgIDYsXG5cbiAgLyogUmV0dXJuIGNvZGVzIGZvciB0aGUgY29tcHJlc3Npb24vZGVjb21wcmVzc2lvbiBmdW5jdGlvbnMuIE5lZ2F0aXZlIHZhbHVlc1xuICAqIGFyZSBlcnJvcnMsIHBvc2l0aXZlIHZhbHVlcyBhcmUgdXNlZCBmb3Igc3BlY2lhbCBidXQgbm9ybWFsIGV2ZW50cy5cbiAgKi9cbiAgWl9PSzogICAgICAgICAgICAgICAwLFxuICBaX1NUUkVBTV9FTkQ6ICAgICAgIDEsXG4gIFpfTkVFRF9ESUNUOiAgICAgICAgMixcbiAgWl9FUlJOTzogICAgICAgICAgIC0xLFxuICBaX1NUUkVBTV9FUlJPUjogICAgLTIsXG4gIFpfREFUQV9FUlJPUjogICAgICAtMyxcbiAgLy9aX01FTV9FUlJPUjogICAgIC00LFxuICBaX0JVRl9FUlJPUjogICAgICAgLTUsXG4gIC8vWl9WRVJTSU9OX0VSUk9SOiAtNixcblxuICAvKiBjb21wcmVzc2lvbiBsZXZlbHMgKi9cbiAgWl9OT19DT01QUkVTU0lPTjogICAgICAgICAwLFxuICBaX0JFU1RfU1BFRUQ6ICAgICAgICAgICAgIDEsXG4gIFpfQkVTVF9DT01QUkVTU0lPTjogICAgICAgOSxcbiAgWl9ERUZBVUxUX0NPTVBSRVNTSU9OOiAgIC0xLFxuXG5cbiAgWl9GSUxURVJFRDogICAgICAgICAgICAgICAxLFxuICBaX0hVRkZNQU5fT05MWTogICAgICAgICAgIDIsXG4gIFpfUkxFOiAgICAgICAgICAgICAgICAgICAgMyxcbiAgWl9GSVhFRDogICAgICAgICAgICAgICAgICA0LFxuICBaX0RFRkFVTFRfU1RSQVRFR1k6ICAgICAgIDAsXG5cbiAgLyogUG9zc2libGUgdmFsdWVzIG9mIHRoZSBkYXRhX3R5cGUgZmllbGQgKHRob3VnaCBzZWUgaW5mbGF0ZSgpKSAqL1xuICBaX0JJTkFSWTogICAgICAgICAgICAgICAgIDAsXG4gIFpfVEVYVDogICAgICAgICAgICAgICAgICAgMSxcbiAgLy9aX0FTQ0lJOiAgICAgICAgICAgICAgICAxLCAvLyA9IFpfVEVYVCAoZGVwcmVjYXRlZClcbiAgWl9VTktOT1dOOiAgICAgICAgICAgICAgICAyLFxuXG4gIC8qIFRoZSBkZWZsYXRlIGNvbXByZXNzaW9uIG1ldGhvZCAqL1xuICBaX0RFRkxBVEVEOiAgICAgICAgICAgICAgIDhcbiAgLy9aX05VTEw6ICAgICAgICAgICAgICAgICBudWxsIC8vIFVzZSAtMSBvciBudWxsIGlubGluZSwgZGVwZW5kaW5nIG9uIHZhciB0eXBlXG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG4vLyBOb3RlOiB3ZSBjYW4ndCBnZXQgc2lnbmlmaWNhbnQgc3BlZWQgYm9vc3QgaGVyZS5cbi8vIFNvIHdyaXRlIGNvZGUgdG8gbWluaW1pemUgc2l6ZSAtIG5vIHByZWdlbmVyYXRlZCB0YWJsZXNcbi8vIGFuZCBhcnJheSB0b29scyBkZXBlbmRlbmNpZXMuXG5cblxuLy8gVXNlIG9yZGluYXJ5IGFycmF5LCBzaW5jZSB1bnR5cGVkIG1ha2VzIG5vIGJvb3N0IGhlcmVcbmZ1bmN0aW9uIG1ha2VUYWJsZSgpIHtcbiAgdmFyIGMsIHRhYmxlID0gW107XG5cbiAgZm9yICh2YXIgbiA9IDA7IG4gPCAyNTY7IG4rKykge1xuICAgIGMgPSBuO1xuICAgIGZvciAodmFyIGsgPSAwOyBrIDwgODsgaysrKSB7XG4gICAgICBjID0gKChjICYgMSkgPyAoMHhFREI4ODMyMCBeIChjID4+PiAxKSkgOiAoYyA+Pj4gMSkpO1xuICAgIH1cbiAgICB0YWJsZVtuXSA9IGM7XG4gIH1cblxuICByZXR1cm4gdGFibGU7XG59XG5cbi8vIENyZWF0ZSB0YWJsZSBvbiBsb2FkLiBKdXN0IDI1NSBzaWduZWQgbG9uZ3MuIE5vdCBhIHByb2JsZW0uXG52YXIgY3JjVGFibGUgPSBtYWtlVGFibGUoKTtcblxuXG5mdW5jdGlvbiBjcmMzMihjcmMsIGJ1ZiwgbGVuLCBwb3MpIHtcbiAgdmFyIHQgPSBjcmNUYWJsZSxcbiAgICAgIGVuZCA9IHBvcyArIGxlbjtcblxuICBjcmMgXj0gLTE7XG5cbiAgZm9yICh2YXIgaSA9IHBvczsgaSA8IGVuZDsgaSsrKSB7XG4gICAgY3JjID0gKGNyYyA+Pj4gOCkgXiB0WyhjcmMgXiBidWZbaV0pICYgMHhGRl07XG4gIH1cblxuICByZXR1cm4gKGNyYyBeICgtMSkpOyAvLyA+Pj4gMDtcbn1cblxuXG5tb2R1bGUuZXhwb3J0cyA9IGNyYzMyO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgdXRpbHMgICA9IHJlcXVpcmUoJy4uL3V0aWxzL2NvbW1vbicpO1xudmFyIHRyZWVzICAgPSByZXF1aXJlKCcuL3RyZWVzJyk7XG52YXIgYWRsZXIzMiA9IHJlcXVpcmUoJy4vYWRsZXIzMicpO1xudmFyIGNyYzMyICAgPSByZXF1aXJlKCcuL2NyYzMyJyk7XG52YXIgbXNnICAgICA9IHJlcXVpcmUoJy4vbWVzc2FnZXMnKTtcblxuLyogUHVibGljIGNvbnN0YW50cyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki9cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovXG5cblxuLyogQWxsb3dlZCBmbHVzaCB2YWx1ZXM7IHNlZSBkZWZsYXRlKCkgYW5kIGluZmxhdGUoKSBiZWxvdyBmb3IgZGV0YWlscyAqL1xudmFyIFpfTk9fRkxVU0ggICAgICA9IDA7XG52YXIgWl9QQVJUSUFMX0ZMVVNIID0gMTtcbi8vdmFyIFpfU1lOQ19GTFVTSCAgICA9IDI7XG52YXIgWl9GVUxMX0ZMVVNIICAgID0gMztcbnZhciBaX0ZJTklTSCAgICAgICAgPSA0O1xudmFyIFpfQkxPQ0sgICAgICAgICA9IDU7XG4vL3ZhciBaX1RSRUVTICAgICAgICAgPSA2O1xuXG5cbi8qIFJldHVybiBjb2RlcyBmb3IgdGhlIGNvbXByZXNzaW9uL2RlY29tcHJlc3Npb24gZnVuY3Rpb25zLiBOZWdhdGl2ZSB2YWx1ZXNcbiAqIGFyZSBlcnJvcnMsIHBvc2l0aXZlIHZhbHVlcyBhcmUgdXNlZCBmb3Igc3BlY2lhbCBidXQgbm9ybWFsIGV2ZW50cy5cbiAqL1xudmFyIFpfT0sgICAgICAgICAgICA9IDA7XG52YXIgWl9TVFJFQU1fRU5EICAgID0gMTtcbi8vdmFyIFpfTkVFRF9ESUNUICAgICA9IDI7XG4vL3ZhciBaX0VSUk5PICAgICAgICAgPSAtMTtcbnZhciBaX1NUUkVBTV9FUlJPUiAgPSAtMjtcbnZhciBaX0RBVEFfRVJST1IgICAgPSAtMztcbi8vdmFyIFpfTUVNX0VSUk9SICAgICA9IC00O1xudmFyIFpfQlVGX0VSUk9SICAgICA9IC01O1xuLy92YXIgWl9WRVJTSU9OX0VSUk9SID0gLTY7XG5cblxuLyogY29tcHJlc3Npb24gbGV2ZWxzICovXG4vL3ZhciBaX05PX0NPTVBSRVNTSU9OICAgICAgPSAwO1xuLy92YXIgWl9CRVNUX1NQRUVEICAgICAgICAgID0gMTtcbi8vdmFyIFpfQkVTVF9DT01QUkVTU0lPTiAgICA9IDk7XG52YXIgWl9ERUZBVUxUX0NPTVBSRVNTSU9OID0gLTE7XG5cblxudmFyIFpfRklMVEVSRUQgICAgICAgICAgICA9IDE7XG52YXIgWl9IVUZGTUFOX09OTFkgICAgICAgID0gMjtcbnZhciBaX1JMRSAgICAgICAgICAgICAgICAgPSAzO1xudmFyIFpfRklYRUQgICAgICAgICAgICAgICA9IDQ7XG52YXIgWl9ERUZBVUxUX1NUUkFURUdZICAgID0gMDtcblxuLyogUG9zc2libGUgdmFsdWVzIG9mIHRoZSBkYXRhX3R5cGUgZmllbGQgKHRob3VnaCBzZWUgaW5mbGF0ZSgpKSAqL1xuLy92YXIgWl9CSU5BUlkgICAgICAgICAgICAgID0gMDtcbi8vdmFyIFpfVEVYVCAgICAgICAgICAgICAgICA9IDE7XG4vL3ZhciBaX0FTQ0lJICAgICAgICAgICAgICAgPSAxOyAvLyA9IFpfVEVYVFxudmFyIFpfVU5LTk9XTiAgICAgICAgICAgICA9IDI7XG5cblxuLyogVGhlIGRlZmxhdGUgY29tcHJlc3Npb24gbWV0aG9kICovXG52YXIgWl9ERUZMQVRFRCAgPSA4O1xuXG4vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qL1xuXG5cbnZhciBNQVhfTUVNX0xFVkVMID0gOTtcbi8qIE1heGltdW0gdmFsdWUgZm9yIG1lbUxldmVsIGluIGRlZmxhdGVJbml0MiAqL1xudmFyIE1BWF9XQklUUyA9IDE1O1xuLyogMzJLIExaNzcgd2luZG93ICovXG52YXIgREVGX01FTV9MRVZFTCA9IDg7XG5cblxudmFyIExFTkdUSF9DT0RFUyAgPSAyOTtcbi8qIG51bWJlciBvZiBsZW5ndGggY29kZXMsIG5vdCBjb3VudGluZyB0aGUgc3BlY2lhbCBFTkRfQkxPQ0sgY29kZSAqL1xudmFyIExJVEVSQUxTICAgICAgPSAyNTY7XG4vKiBudW1iZXIgb2YgbGl0ZXJhbCBieXRlcyAwLi4yNTUgKi9cbnZhciBMX0NPREVTICAgICAgID0gTElURVJBTFMgKyAxICsgTEVOR1RIX0NPREVTO1xuLyogbnVtYmVyIG9mIExpdGVyYWwgb3IgTGVuZ3RoIGNvZGVzLCBpbmNsdWRpbmcgdGhlIEVORF9CTE9DSyBjb2RlICovXG52YXIgRF9DT0RFUyAgICAgICA9IDMwO1xuLyogbnVtYmVyIG9mIGRpc3RhbmNlIGNvZGVzICovXG52YXIgQkxfQ09ERVMgICAgICA9IDE5O1xuLyogbnVtYmVyIG9mIGNvZGVzIHVzZWQgdG8gdHJhbnNmZXIgdGhlIGJpdCBsZW5ndGhzICovXG52YXIgSEVBUF9TSVpFICAgICA9IDIgKiBMX0NPREVTICsgMTtcbi8qIG1heGltdW0gaGVhcCBzaXplICovXG52YXIgTUFYX0JJVFMgID0gMTU7XG4vKiBBbGwgY29kZXMgbXVzdCBub3QgZXhjZWVkIE1BWF9CSVRTIGJpdHMgKi9cblxudmFyIE1JTl9NQVRDSCA9IDM7XG52YXIgTUFYX01BVENIID0gMjU4O1xudmFyIE1JTl9MT09LQUhFQUQgPSAoTUFYX01BVENIICsgTUlOX01BVENIICsgMSk7XG5cbnZhciBQUkVTRVRfRElDVCA9IDB4MjA7XG5cbnZhciBJTklUX1NUQVRFID0gNDI7XG52YXIgRVhUUkFfU1RBVEUgPSA2OTtcbnZhciBOQU1FX1NUQVRFID0gNzM7XG52YXIgQ09NTUVOVF9TVEFURSA9IDkxO1xudmFyIEhDUkNfU1RBVEUgPSAxMDM7XG52YXIgQlVTWV9TVEFURSA9IDExMztcbnZhciBGSU5JU0hfU1RBVEUgPSA2NjY7XG5cbnZhciBCU19ORUVEX01PUkUgICAgICA9IDE7IC8qIGJsb2NrIG5vdCBjb21wbGV0ZWQsIG5lZWQgbW9yZSBpbnB1dCBvciBtb3JlIG91dHB1dCAqL1xudmFyIEJTX0JMT0NLX0RPTkUgICAgID0gMjsgLyogYmxvY2sgZmx1c2ggcGVyZm9ybWVkICovXG52YXIgQlNfRklOSVNIX1NUQVJURUQgPSAzOyAvKiBmaW5pc2ggc3RhcnRlZCwgbmVlZCBvbmx5IG1vcmUgb3V0cHV0IGF0IG5leHQgZGVmbGF0ZSAqL1xudmFyIEJTX0ZJTklTSF9ET05FICAgID0gNDsgLyogZmluaXNoIGRvbmUsIGFjY2VwdCBubyBtb3JlIGlucHV0IG9yIG91dHB1dCAqL1xuXG52YXIgT1NfQ09ERSA9IDB4MDM7IC8vIFVuaXggOikgLiBEb24ndCBkZXRlY3QsIHVzZSB0aGlzIGRlZmF1bHQuXG5cbmZ1bmN0aW9uIGVycihzdHJtLCBlcnJvckNvZGUpIHtcbiAgc3RybS5tc2cgPSBtc2dbZXJyb3JDb2RlXTtcbiAgcmV0dXJuIGVycm9yQ29kZTtcbn1cblxuZnVuY3Rpb24gcmFuayhmKSB7XG4gIHJldHVybiAoKGYpIDw8IDEpIC0gKChmKSA+IDQgPyA5IDogMCk7XG59XG5cbmZ1bmN0aW9uIHplcm8oYnVmKSB7IHZhciBsZW4gPSBidWYubGVuZ3RoOyB3aGlsZSAoLS1sZW4gPj0gMCkgeyBidWZbbGVuXSA9IDA7IH0gfVxuXG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIEZsdXNoIGFzIG11Y2ggcGVuZGluZyBvdXRwdXQgYXMgcG9zc2libGUuIEFsbCBkZWZsYXRlKCkgb3V0cHV0IGdvZXNcbiAqIHRocm91Z2ggdGhpcyBmdW5jdGlvbiBzbyBzb21lIGFwcGxpY2F0aW9ucyBtYXkgd2lzaCB0byBtb2RpZnkgaXRcbiAqIHRvIGF2b2lkIGFsbG9jYXRpbmcgYSBsYXJnZSBzdHJtLT5vdXRwdXQgYnVmZmVyIGFuZCBjb3B5aW5nIGludG8gaXQuXG4gKiAoU2VlIGFsc28gcmVhZF9idWYoKSkuXG4gKi9cbmZ1bmN0aW9uIGZsdXNoX3BlbmRpbmcoc3RybSkge1xuICB2YXIgcyA9IHN0cm0uc3RhdGU7XG5cbiAgLy9fdHJfZmx1c2hfYml0cyhzKTtcbiAgdmFyIGxlbiA9IHMucGVuZGluZztcbiAgaWYgKGxlbiA+IHN0cm0uYXZhaWxfb3V0KSB7XG4gICAgbGVuID0gc3RybS5hdmFpbF9vdXQ7XG4gIH1cbiAgaWYgKGxlbiA9PT0gMCkgeyByZXR1cm47IH1cblxuICB1dGlscy5hcnJheVNldChzdHJtLm91dHB1dCwgcy5wZW5kaW5nX2J1Ziwgcy5wZW5kaW5nX291dCwgbGVuLCBzdHJtLm5leHRfb3V0KTtcbiAgc3RybS5uZXh0X291dCArPSBsZW47XG4gIHMucGVuZGluZ19vdXQgKz0gbGVuO1xuICBzdHJtLnRvdGFsX291dCArPSBsZW47XG4gIHN0cm0uYXZhaWxfb3V0IC09IGxlbjtcbiAgcy5wZW5kaW5nIC09IGxlbjtcbiAgaWYgKHMucGVuZGluZyA9PT0gMCkge1xuICAgIHMucGVuZGluZ19vdXQgPSAwO1xuICB9XG59XG5cblxuZnVuY3Rpb24gZmx1c2hfYmxvY2tfb25seShzLCBsYXN0KSB7XG4gIHRyZWVzLl90cl9mbHVzaF9ibG9jayhzLCAocy5ibG9ja19zdGFydCA+PSAwID8gcy5ibG9ja19zdGFydCA6IC0xKSwgcy5zdHJzdGFydCAtIHMuYmxvY2tfc3RhcnQsIGxhc3QpO1xuICBzLmJsb2NrX3N0YXJ0ID0gcy5zdHJzdGFydDtcbiAgZmx1c2hfcGVuZGluZyhzLnN0cm0pO1xufVxuXG5cbmZ1bmN0aW9uIHB1dF9ieXRlKHMsIGIpIHtcbiAgcy5wZW5kaW5nX2J1ZltzLnBlbmRpbmcrK10gPSBiO1xufVxuXG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIFB1dCBhIHNob3J0IGluIHRoZSBwZW5kaW5nIGJ1ZmZlci4gVGhlIDE2LWJpdCB2YWx1ZSBpcyBwdXQgaW4gTVNCIG9yZGVyLlxuICogSU4gYXNzZXJ0aW9uOiB0aGUgc3RyZWFtIHN0YXRlIGlzIGNvcnJlY3QgYW5kIHRoZXJlIGlzIGVub3VnaCByb29tIGluXG4gKiBwZW5kaW5nX2J1Zi5cbiAqL1xuZnVuY3Rpb24gcHV0U2hvcnRNU0IocywgYikge1xuLy8gIHB1dF9ieXRlKHMsIChCeXRlKShiID4+IDgpKTtcbi8vICBwdXRfYnl0ZShzLCAoQnl0ZSkoYiAmIDB4ZmYpKTtcbiAgcy5wZW5kaW5nX2J1ZltzLnBlbmRpbmcrK10gPSAoYiA+Pj4gOCkgJiAweGZmO1xuICBzLnBlbmRpbmdfYnVmW3MucGVuZGluZysrXSA9IGIgJiAweGZmO1xufVxuXG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogUmVhZCBhIG5ldyBidWZmZXIgZnJvbSB0aGUgY3VycmVudCBpbnB1dCBzdHJlYW0sIHVwZGF0ZSB0aGUgYWRsZXIzMlxuICogYW5kIHRvdGFsIG51bWJlciBvZiBieXRlcyByZWFkLiAgQWxsIGRlZmxhdGUoKSBpbnB1dCBnb2VzIHRocm91Z2hcbiAqIHRoaXMgZnVuY3Rpb24gc28gc29tZSBhcHBsaWNhdGlvbnMgbWF5IHdpc2ggdG8gbW9kaWZ5IGl0IHRvIGF2b2lkXG4gKiBhbGxvY2F0aW5nIGEgbGFyZ2Ugc3RybS0+aW5wdXQgYnVmZmVyIGFuZCBjb3B5aW5nIGZyb20gaXQuXG4gKiAoU2VlIGFsc28gZmx1c2hfcGVuZGluZygpKS5cbiAqL1xuZnVuY3Rpb24gcmVhZF9idWYoc3RybSwgYnVmLCBzdGFydCwgc2l6ZSkge1xuICB2YXIgbGVuID0gc3RybS5hdmFpbF9pbjtcblxuICBpZiAobGVuID4gc2l6ZSkgeyBsZW4gPSBzaXplOyB9XG4gIGlmIChsZW4gPT09IDApIHsgcmV0dXJuIDA7IH1cblxuICBzdHJtLmF2YWlsX2luIC09IGxlbjtcblxuICAvLyB6bWVtY3B5KGJ1Ziwgc3RybS0+bmV4dF9pbiwgbGVuKTtcbiAgdXRpbHMuYXJyYXlTZXQoYnVmLCBzdHJtLmlucHV0LCBzdHJtLm5leHRfaW4sIGxlbiwgc3RhcnQpO1xuICBpZiAoc3RybS5zdGF0ZS53cmFwID09PSAxKSB7XG4gICAgc3RybS5hZGxlciA9IGFkbGVyMzIoc3RybS5hZGxlciwgYnVmLCBsZW4sIHN0YXJ0KTtcbiAgfVxuXG4gIGVsc2UgaWYgKHN0cm0uc3RhdGUud3JhcCA9PT0gMikge1xuICAgIHN0cm0uYWRsZXIgPSBjcmMzMihzdHJtLmFkbGVyLCBidWYsIGxlbiwgc3RhcnQpO1xuICB9XG5cbiAgc3RybS5uZXh0X2luICs9IGxlbjtcbiAgc3RybS50b3RhbF9pbiArPSBsZW47XG5cbiAgcmV0dXJuIGxlbjtcbn1cblxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIFNldCBtYXRjaF9zdGFydCB0byB0aGUgbG9uZ2VzdCBtYXRjaCBzdGFydGluZyBhdCB0aGUgZ2l2ZW4gc3RyaW5nIGFuZFxuICogcmV0dXJuIGl0cyBsZW5ndGguIE1hdGNoZXMgc2hvcnRlciBvciBlcXVhbCB0byBwcmV2X2xlbmd0aCBhcmUgZGlzY2FyZGVkLFxuICogaW4gd2hpY2ggY2FzZSB0aGUgcmVzdWx0IGlzIGVxdWFsIHRvIHByZXZfbGVuZ3RoIGFuZCBtYXRjaF9zdGFydCBpc1xuICogZ2FyYmFnZS5cbiAqIElOIGFzc2VydGlvbnM6IGN1cl9tYXRjaCBpcyB0aGUgaGVhZCBvZiB0aGUgaGFzaCBjaGFpbiBmb3IgdGhlIGN1cnJlbnRcbiAqICAgc3RyaW5nIChzdHJzdGFydCkgYW5kIGl0cyBkaXN0YW5jZSBpcyA8PSBNQVhfRElTVCwgYW5kIHByZXZfbGVuZ3RoID49IDFcbiAqIE9VVCBhc3NlcnRpb246IHRoZSBtYXRjaCBsZW5ndGggaXMgbm90IGdyZWF0ZXIgdGhhbiBzLT5sb29rYWhlYWQuXG4gKi9cbmZ1bmN0aW9uIGxvbmdlc3RfbWF0Y2gocywgY3VyX21hdGNoKSB7XG4gIHZhciBjaGFpbl9sZW5ndGggPSBzLm1heF9jaGFpbl9sZW5ndGg7ICAgICAgLyogbWF4IGhhc2ggY2hhaW4gbGVuZ3RoICovXG4gIHZhciBzY2FuID0gcy5zdHJzdGFydDsgLyogY3VycmVudCBzdHJpbmcgKi9cbiAgdmFyIG1hdGNoOyAgICAgICAgICAgICAgICAgICAgICAgLyogbWF0Y2hlZCBzdHJpbmcgKi9cbiAgdmFyIGxlbjsgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBsZW5ndGggb2YgY3VycmVudCBtYXRjaCAqL1xuICB2YXIgYmVzdF9sZW4gPSBzLnByZXZfbGVuZ3RoOyAgICAgICAgICAgICAgLyogYmVzdCBtYXRjaCBsZW5ndGggc28gZmFyICovXG4gIHZhciBuaWNlX21hdGNoID0gcy5uaWNlX21hdGNoOyAgICAgICAgICAgICAvKiBzdG9wIGlmIG1hdGNoIGxvbmcgZW5vdWdoICovXG4gIHZhciBsaW1pdCA9IChzLnN0cnN0YXJ0ID4gKHMud19zaXplIC0gTUlOX0xPT0tBSEVBRCkpID9cbiAgICAgIHMuc3Ryc3RhcnQgLSAocy53X3NpemUgLSBNSU5fTE9PS0FIRUFEKSA6IDAvKk5JTCovO1xuXG4gIHZhciBfd2luID0gcy53aW5kb3c7IC8vIHNob3J0Y3V0XG5cbiAgdmFyIHdtYXNrID0gcy53X21hc2s7XG4gIHZhciBwcmV2ICA9IHMucHJldjtcblxuICAvKiBTdG9wIHdoZW4gY3VyX21hdGNoIGJlY29tZXMgPD0gbGltaXQuIFRvIHNpbXBsaWZ5IHRoZSBjb2RlLFxuICAgKiB3ZSBwcmV2ZW50IG1hdGNoZXMgd2l0aCB0aGUgc3RyaW5nIG9mIHdpbmRvdyBpbmRleCAwLlxuICAgKi9cblxuICB2YXIgc3RyZW5kID0gcy5zdHJzdGFydCArIE1BWF9NQVRDSDtcbiAgdmFyIHNjYW5fZW5kMSAgPSBfd2luW3NjYW4gKyBiZXN0X2xlbiAtIDFdO1xuICB2YXIgc2Nhbl9lbmQgICA9IF93aW5bc2NhbiArIGJlc3RfbGVuXTtcblxuICAvKiBUaGUgY29kZSBpcyBvcHRpbWl6ZWQgZm9yIEhBU0hfQklUUyA+PSA4IGFuZCBNQVhfTUFUQ0gtMiBtdWx0aXBsZSBvZiAxNi5cbiAgICogSXQgaXMgZWFzeSB0byBnZXQgcmlkIG9mIHRoaXMgb3B0aW1pemF0aW9uIGlmIG5lY2Vzc2FyeS5cbiAgICovXG4gIC8vIEFzc2VydChzLT5oYXNoX2JpdHMgPj0gOCAmJiBNQVhfTUFUQ0ggPT0gMjU4LCBcIkNvZGUgdG9vIGNsZXZlclwiKTtcblxuICAvKiBEbyBub3Qgd2FzdGUgdG9vIG11Y2ggdGltZSBpZiB3ZSBhbHJlYWR5IGhhdmUgYSBnb29kIG1hdGNoOiAqL1xuICBpZiAocy5wcmV2X2xlbmd0aCA+PSBzLmdvb2RfbWF0Y2gpIHtcbiAgICBjaGFpbl9sZW5ndGggPj49IDI7XG4gIH1cbiAgLyogRG8gbm90IGxvb2sgZm9yIG1hdGNoZXMgYmV5b25kIHRoZSBlbmQgb2YgdGhlIGlucHV0LiBUaGlzIGlzIG5lY2Vzc2FyeVxuICAgKiB0byBtYWtlIGRlZmxhdGUgZGV0ZXJtaW5pc3RpYy5cbiAgICovXG4gIGlmIChuaWNlX21hdGNoID4gcy5sb29rYWhlYWQpIHsgbmljZV9tYXRjaCA9IHMubG9va2FoZWFkOyB9XG5cbiAgLy8gQXNzZXJ0KCh1bGcpcy0+c3Ryc3RhcnQgPD0gcy0+d2luZG93X3NpemUtTUlOX0xPT0tBSEVBRCwgXCJuZWVkIGxvb2thaGVhZFwiKTtcblxuICBkbyB7XG4gICAgLy8gQXNzZXJ0KGN1cl9tYXRjaCA8IHMtPnN0cnN0YXJ0LCBcIm5vIGZ1dHVyZVwiKTtcbiAgICBtYXRjaCA9IGN1cl9tYXRjaDtcblxuICAgIC8qIFNraXAgdG8gbmV4dCBtYXRjaCBpZiB0aGUgbWF0Y2ggbGVuZ3RoIGNhbm5vdCBpbmNyZWFzZVxuICAgICAqIG9yIGlmIHRoZSBtYXRjaCBsZW5ndGggaXMgbGVzcyB0aGFuIDIuICBOb3RlIHRoYXQgdGhlIGNoZWNrcyBiZWxvd1xuICAgICAqIGZvciBpbnN1ZmZpY2llbnQgbG9va2FoZWFkIG9ubHkgb2NjdXIgb2NjYXNpb25hbGx5IGZvciBwZXJmb3JtYW5jZVxuICAgICAqIHJlYXNvbnMuICBUaGVyZWZvcmUgdW5pbml0aWFsaXplZCBtZW1vcnkgd2lsbCBiZSBhY2Nlc3NlZCwgYW5kXG4gICAgICogY29uZGl0aW9uYWwganVtcHMgd2lsbCBiZSBtYWRlIHRoYXQgZGVwZW5kIG9uIHRob3NlIHZhbHVlcy5cbiAgICAgKiBIb3dldmVyIHRoZSBsZW5ndGggb2YgdGhlIG1hdGNoIGlzIGxpbWl0ZWQgdG8gdGhlIGxvb2thaGVhZCwgc29cbiAgICAgKiB0aGUgb3V0cHV0IG9mIGRlZmxhdGUgaXMgbm90IGFmZmVjdGVkIGJ5IHRoZSB1bmluaXRpYWxpemVkIHZhbHVlcy5cbiAgICAgKi9cblxuICAgIGlmIChfd2luW21hdGNoICsgYmVzdF9sZW5dICAgICAhPT0gc2Nhbl9lbmQgIHx8XG4gICAgICAgIF93aW5bbWF0Y2ggKyBiZXN0X2xlbiAtIDFdICE9PSBzY2FuX2VuZDEgfHxcbiAgICAgICAgX3dpblttYXRjaF0gICAgICAgICAgICAgICAgIT09IF93aW5bc2Nhbl0gfHxcbiAgICAgICAgX3dpblsrK21hdGNoXSAgICAgICAgICAgICAgIT09IF93aW5bc2NhbiArIDFdKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICAvKiBUaGUgY2hlY2sgYXQgYmVzdF9sZW4tMSBjYW4gYmUgcmVtb3ZlZCBiZWNhdXNlIGl0IHdpbGwgYmUgbWFkZVxuICAgICAqIGFnYWluIGxhdGVyLiAoVGhpcyBoZXVyaXN0aWMgaXMgbm90IGFsd2F5cyBhIHdpbi4pXG4gICAgICogSXQgaXMgbm90IG5lY2Vzc2FyeSB0byBjb21wYXJlIHNjYW5bMl0gYW5kIG1hdGNoWzJdIHNpbmNlIHRoZXlcbiAgICAgKiBhcmUgYWx3YXlzIGVxdWFsIHdoZW4gdGhlIG90aGVyIGJ5dGVzIG1hdGNoLCBnaXZlbiB0aGF0XG4gICAgICogdGhlIGhhc2gga2V5cyBhcmUgZXF1YWwgYW5kIHRoYXQgSEFTSF9CSVRTID49IDguXG4gICAgICovXG4gICAgc2NhbiArPSAyO1xuICAgIG1hdGNoKys7XG4gICAgLy8gQXNzZXJ0KCpzY2FuID09ICptYXRjaCwgXCJtYXRjaFsyXT9cIik7XG5cbiAgICAvKiBXZSBjaGVjayBmb3IgaW5zdWZmaWNpZW50IGxvb2thaGVhZCBvbmx5IGV2ZXJ5IDh0aCBjb21wYXJpc29uO1xuICAgICAqIHRoZSAyNTZ0aCBjaGVjayB3aWxsIGJlIG1hZGUgYXQgc3Ryc3RhcnQrMjU4LlxuICAgICAqL1xuICAgIGRvIHtcbiAgICAgIC8qanNoaW50IG5vZW1wdHk6ZmFsc2UqL1xuICAgIH0gd2hpbGUgKF93aW5bKytzY2FuXSA9PT0gX3dpblsrK21hdGNoXSAmJiBfd2luWysrc2Nhbl0gPT09IF93aW5bKyttYXRjaF0gJiZcbiAgICAgICAgICAgICBfd2luWysrc2Nhbl0gPT09IF93aW5bKyttYXRjaF0gJiYgX3dpblsrK3NjYW5dID09PSBfd2luWysrbWF0Y2hdICYmXG4gICAgICAgICAgICAgX3dpblsrK3NjYW5dID09PSBfd2luWysrbWF0Y2hdICYmIF93aW5bKytzY2FuXSA9PT0gX3dpblsrK21hdGNoXSAmJlxuICAgICAgICAgICAgIF93aW5bKytzY2FuXSA9PT0gX3dpblsrK21hdGNoXSAmJiBfd2luWysrc2Nhbl0gPT09IF93aW5bKyttYXRjaF0gJiZcbiAgICAgICAgICAgICBzY2FuIDwgc3RyZW5kKTtcblxuICAgIC8vIEFzc2VydChzY2FuIDw9IHMtPndpbmRvdysodW5zaWduZWQpKHMtPndpbmRvd19zaXplLTEpLCBcIndpbGQgc2NhblwiKTtcblxuICAgIGxlbiA9IE1BWF9NQVRDSCAtIChzdHJlbmQgLSBzY2FuKTtcbiAgICBzY2FuID0gc3RyZW5kIC0gTUFYX01BVENIO1xuXG4gICAgaWYgKGxlbiA+IGJlc3RfbGVuKSB7XG4gICAgICBzLm1hdGNoX3N0YXJ0ID0gY3VyX21hdGNoO1xuICAgICAgYmVzdF9sZW4gPSBsZW47XG4gICAgICBpZiAobGVuID49IG5pY2VfbWF0Y2gpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBzY2FuX2VuZDEgID0gX3dpbltzY2FuICsgYmVzdF9sZW4gLSAxXTtcbiAgICAgIHNjYW5fZW5kICAgPSBfd2luW3NjYW4gKyBiZXN0X2xlbl07XG4gICAgfVxuICB9IHdoaWxlICgoY3VyX21hdGNoID0gcHJldltjdXJfbWF0Y2ggJiB3bWFza10pID4gbGltaXQgJiYgLS1jaGFpbl9sZW5ndGggIT09IDApO1xuXG4gIGlmIChiZXN0X2xlbiA8PSBzLmxvb2thaGVhZCkge1xuICAgIHJldHVybiBiZXN0X2xlbjtcbiAgfVxuICByZXR1cm4gcy5sb29rYWhlYWQ7XG59XG5cblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBGaWxsIHRoZSB3aW5kb3cgd2hlbiB0aGUgbG9va2FoZWFkIGJlY29tZXMgaW5zdWZmaWNpZW50LlxuICogVXBkYXRlcyBzdHJzdGFydCBhbmQgbG9va2FoZWFkLlxuICpcbiAqIElOIGFzc2VydGlvbjogbG9va2FoZWFkIDwgTUlOX0xPT0tBSEVBRFxuICogT1VUIGFzc2VydGlvbnM6IHN0cnN0YXJ0IDw9IHdpbmRvd19zaXplLU1JTl9MT09LQUhFQURcbiAqICAgIEF0IGxlYXN0IG9uZSBieXRlIGhhcyBiZWVuIHJlYWQsIG9yIGF2YWlsX2luID09IDA7IHJlYWRzIGFyZVxuICogICAgcGVyZm9ybWVkIGZvciBhdCBsZWFzdCB0d28gYnl0ZXMgKHJlcXVpcmVkIGZvciB0aGUgemlwIHRyYW5zbGF0ZV9lb2xcbiAqICAgIG9wdGlvbiAtLSBub3Qgc3VwcG9ydGVkIGhlcmUpLlxuICovXG5mdW5jdGlvbiBmaWxsX3dpbmRvdyhzKSB7XG4gIHZhciBfd19zaXplID0gcy53X3NpemU7XG4gIHZhciBwLCBuLCBtLCBtb3JlLCBzdHI7XG5cbiAgLy9Bc3NlcnQocy0+bG9va2FoZWFkIDwgTUlOX0xPT0tBSEVBRCwgXCJhbHJlYWR5IGVub3VnaCBsb29rYWhlYWRcIik7XG5cbiAgZG8ge1xuICAgIG1vcmUgPSBzLndpbmRvd19zaXplIC0gcy5sb29rYWhlYWQgLSBzLnN0cnN0YXJ0O1xuXG4gICAgLy8gSlMgaW50cyBoYXZlIDMyIGJpdCwgYmxvY2sgYmVsb3cgbm90IG5lZWRlZFxuICAgIC8qIERlYWwgd2l0aCAhQCMkJSA2NEsgbGltaXQ6ICovXG4gICAgLy9pZiAoc2l6ZW9mKGludCkgPD0gMikge1xuICAgIC8vICAgIGlmIChtb3JlID09IDAgJiYgcy0+c3Ryc3RhcnQgPT0gMCAmJiBzLT5sb29rYWhlYWQgPT0gMCkge1xuICAgIC8vICAgICAgICBtb3JlID0gd3NpemU7XG4gICAgLy9cbiAgICAvLyAgfSBlbHNlIGlmIChtb3JlID09ICh1bnNpZ25lZCkoLTEpKSB7XG4gICAgLy8gICAgICAgIC8qIFZlcnkgdW5saWtlbHksIGJ1dCBwb3NzaWJsZSBvbiAxNiBiaXQgbWFjaGluZSBpZlxuICAgIC8vICAgICAgICAgKiBzdHJzdGFydCA9PSAwICYmIGxvb2thaGVhZCA9PSAxIChpbnB1dCBkb25lIGEgYnl0ZSBhdCB0aW1lKVxuICAgIC8vICAgICAgICAgKi9cbiAgICAvLyAgICAgICAgbW9yZS0tO1xuICAgIC8vICAgIH1cbiAgICAvL31cblxuXG4gICAgLyogSWYgdGhlIHdpbmRvdyBpcyBhbG1vc3QgZnVsbCBhbmQgdGhlcmUgaXMgaW5zdWZmaWNpZW50IGxvb2thaGVhZCxcbiAgICAgKiBtb3ZlIHRoZSB1cHBlciBoYWxmIHRvIHRoZSBsb3dlciBvbmUgdG8gbWFrZSByb29tIGluIHRoZSB1cHBlciBoYWxmLlxuICAgICAqL1xuICAgIGlmIChzLnN0cnN0YXJ0ID49IF93X3NpemUgKyAoX3dfc2l6ZSAtIE1JTl9MT09LQUhFQUQpKSB7XG5cbiAgICAgIHV0aWxzLmFycmF5U2V0KHMud2luZG93LCBzLndpbmRvdywgX3dfc2l6ZSwgX3dfc2l6ZSwgMCk7XG4gICAgICBzLm1hdGNoX3N0YXJ0IC09IF93X3NpemU7XG4gICAgICBzLnN0cnN0YXJ0IC09IF93X3NpemU7XG4gICAgICAvKiB3ZSBub3cgaGF2ZSBzdHJzdGFydCA+PSBNQVhfRElTVCAqL1xuICAgICAgcy5ibG9ja19zdGFydCAtPSBfd19zaXplO1xuXG4gICAgICAvKiBTbGlkZSB0aGUgaGFzaCB0YWJsZSAoY291bGQgYmUgYXZvaWRlZCB3aXRoIDMyIGJpdCB2YWx1ZXNcbiAgICAgICBhdCB0aGUgZXhwZW5zZSBvZiBtZW1vcnkgdXNhZ2UpLiBXZSBzbGlkZSBldmVuIHdoZW4gbGV2ZWwgPT0gMFxuICAgICAgIHRvIGtlZXAgdGhlIGhhc2ggdGFibGUgY29uc2lzdGVudCBpZiB3ZSBzd2l0Y2ggYmFjayB0byBsZXZlbCA+IDBcbiAgICAgICBsYXRlci4gKFVzaW5nIGxldmVsIDAgcGVybWFuZW50bHkgaXMgbm90IGFuIG9wdGltYWwgdXNhZ2Ugb2ZcbiAgICAgICB6bGliLCBzbyB3ZSBkb24ndCBjYXJlIGFib3V0IHRoaXMgcGF0aG9sb2dpY2FsIGNhc2UuKVxuICAgICAgICovXG5cbiAgICAgIG4gPSBzLmhhc2hfc2l6ZTtcbiAgICAgIHAgPSBuO1xuICAgICAgZG8ge1xuICAgICAgICBtID0gcy5oZWFkWy0tcF07XG4gICAgICAgIHMuaGVhZFtwXSA9IChtID49IF93X3NpemUgPyBtIC0gX3dfc2l6ZSA6IDApO1xuICAgICAgfSB3aGlsZSAoLS1uKTtcblxuICAgICAgbiA9IF93X3NpemU7XG4gICAgICBwID0gbjtcbiAgICAgIGRvIHtcbiAgICAgICAgbSA9IHMucHJldlstLXBdO1xuICAgICAgICBzLnByZXZbcF0gPSAobSA+PSBfd19zaXplID8gbSAtIF93X3NpemUgOiAwKTtcbiAgICAgICAgLyogSWYgbiBpcyBub3Qgb24gYW55IGhhc2ggY2hhaW4sIHByZXZbbl0gaXMgZ2FyYmFnZSBidXRcbiAgICAgICAgICogaXRzIHZhbHVlIHdpbGwgbmV2ZXIgYmUgdXNlZC5cbiAgICAgICAgICovXG4gICAgICB9IHdoaWxlICgtLW4pO1xuXG4gICAgICBtb3JlICs9IF93X3NpemU7XG4gICAgfVxuICAgIGlmIChzLnN0cm0uYXZhaWxfaW4gPT09IDApIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIC8qIElmIHRoZXJlIHdhcyBubyBzbGlkaW5nOlxuICAgICAqICAgIHN0cnN0YXJ0IDw9IFdTSVpFK01BWF9ESVNULTEgJiYgbG9va2FoZWFkIDw9IE1JTl9MT09LQUhFQUQgLSAxICYmXG4gICAgICogICAgbW9yZSA9PSB3aW5kb3dfc2l6ZSAtIGxvb2thaGVhZCAtIHN0cnN0YXJ0XG4gICAgICogPT4gbW9yZSA+PSB3aW5kb3dfc2l6ZSAtIChNSU5fTE9PS0FIRUFELTEgKyBXU0laRSArIE1BWF9ESVNULTEpXG4gICAgICogPT4gbW9yZSA+PSB3aW5kb3dfc2l6ZSAtIDIqV1NJWkUgKyAyXG4gICAgICogSW4gdGhlIEJJR19NRU0gb3IgTU1BUCBjYXNlIChub3QgeWV0IHN1cHBvcnRlZCksXG4gICAgICogICB3aW5kb3dfc2l6ZSA9PSBpbnB1dF9zaXplICsgTUlOX0xPT0tBSEVBRCAgJiZcbiAgICAgKiAgIHN0cnN0YXJ0ICsgcy0+bG9va2FoZWFkIDw9IGlucHV0X3NpemUgPT4gbW9yZSA+PSBNSU5fTE9PS0FIRUFELlxuICAgICAqIE90aGVyd2lzZSwgd2luZG93X3NpemUgPT0gMipXU0laRSBzbyBtb3JlID49IDIuXG4gICAgICogSWYgdGhlcmUgd2FzIHNsaWRpbmcsIG1vcmUgPj0gV1NJWkUuIFNvIGluIGFsbCBjYXNlcywgbW9yZSA+PSAyLlxuICAgICAqL1xuICAgIC8vQXNzZXJ0KG1vcmUgPj0gMiwgXCJtb3JlIDwgMlwiKTtcbiAgICBuID0gcmVhZF9idWYocy5zdHJtLCBzLndpbmRvdywgcy5zdHJzdGFydCArIHMubG9va2FoZWFkLCBtb3JlKTtcbiAgICBzLmxvb2thaGVhZCArPSBuO1xuXG4gICAgLyogSW5pdGlhbGl6ZSB0aGUgaGFzaCB2YWx1ZSBub3cgdGhhdCB3ZSBoYXZlIHNvbWUgaW5wdXQ6ICovXG4gICAgaWYgKHMubG9va2FoZWFkICsgcy5pbnNlcnQgPj0gTUlOX01BVENIKSB7XG4gICAgICBzdHIgPSBzLnN0cnN0YXJ0IC0gcy5pbnNlcnQ7XG4gICAgICBzLmluc19oID0gcy53aW5kb3dbc3RyXTtcblxuICAgICAgLyogVVBEQVRFX0hBU0gocywgcy0+aW5zX2gsIHMtPndpbmRvd1tzdHIgKyAxXSk7ICovXG4gICAgICBzLmluc19oID0gKChzLmluc19oIDw8IHMuaGFzaF9zaGlmdCkgXiBzLndpbmRvd1tzdHIgKyAxXSkgJiBzLmhhc2hfbWFzaztcbi8vI2lmIE1JTl9NQVRDSCAhPSAzXG4vLyAgICAgICAgQ2FsbCB1cGRhdGVfaGFzaCgpIE1JTl9NQVRDSC0zIG1vcmUgdGltZXNcbi8vI2VuZGlmXG4gICAgICB3aGlsZSAocy5pbnNlcnQpIHtcbiAgICAgICAgLyogVVBEQVRFX0hBU0gocywgcy0+aW5zX2gsIHMtPndpbmRvd1tzdHIgKyBNSU5fTUFUQ0gtMV0pOyAqL1xuICAgICAgICBzLmluc19oID0gKChzLmluc19oIDw8IHMuaGFzaF9zaGlmdCkgXiBzLndpbmRvd1tzdHIgKyBNSU5fTUFUQ0ggLSAxXSkgJiBzLmhhc2hfbWFzaztcblxuICAgICAgICBzLnByZXZbc3RyICYgcy53X21hc2tdID0gcy5oZWFkW3MuaW5zX2hdO1xuICAgICAgICBzLmhlYWRbcy5pbnNfaF0gPSBzdHI7XG4gICAgICAgIHN0cisrO1xuICAgICAgICBzLmluc2VydC0tO1xuICAgICAgICBpZiAocy5sb29rYWhlYWQgKyBzLmluc2VydCA8IE1JTl9NQVRDSCkge1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIC8qIElmIHRoZSB3aG9sZSBpbnB1dCBoYXMgbGVzcyB0aGFuIE1JTl9NQVRDSCBieXRlcywgaW5zX2ggaXMgZ2FyYmFnZSxcbiAgICAgKiBidXQgdGhpcyBpcyBub3QgaW1wb3J0YW50IHNpbmNlIG9ubHkgbGl0ZXJhbCBieXRlcyB3aWxsIGJlIGVtaXR0ZWQuXG4gICAgICovXG5cbiAgfSB3aGlsZSAocy5sb29rYWhlYWQgPCBNSU5fTE9PS0FIRUFEICYmIHMuc3RybS5hdmFpbF9pbiAhPT0gMCk7XG5cbiAgLyogSWYgdGhlIFdJTl9JTklUIGJ5dGVzIGFmdGVyIHRoZSBlbmQgb2YgdGhlIGN1cnJlbnQgZGF0YSBoYXZlIG5ldmVyIGJlZW5cbiAgICogd3JpdHRlbiwgdGhlbiB6ZXJvIHRob3NlIGJ5dGVzIGluIG9yZGVyIHRvIGF2b2lkIG1lbW9yeSBjaGVjayByZXBvcnRzIG9mXG4gICAqIHRoZSB1c2Ugb2YgdW5pbml0aWFsaXplZCAob3IgdW5pbml0aWFsaXNlZCBhcyBKdWxpYW4gd3JpdGVzKSBieXRlcyBieVxuICAgKiB0aGUgbG9uZ2VzdCBtYXRjaCByb3V0aW5lcy4gIFVwZGF0ZSB0aGUgaGlnaCB3YXRlciBtYXJrIGZvciB0aGUgbmV4dFxuICAgKiB0aW1lIHRocm91Z2ggaGVyZS4gIFdJTl9JTklUIGlzIHNldCB0byBNQVhfTUFUQ0ggc2luY2UgdGhlIGxvbmdlc3QgbWF0Y2hcbiAgICogcm91dGluZXMgYWxsb3cgc2Nhbm5pbmcgdG8gc3Ryc3RhcnQgKyBNQVhfTUFUQ0gsIGlnbm9yaW5nIGxvb2thaGVhZC5cbiAgICovXG4vLyAgaWYgKHMuaGlnaF93YXRlciA8IHMud2luZG93X3NpemUpIHtcbi8vICAgIHZhciBjdXJyID0gcy5zdHJzdGFydCArIHMubG9va2FoZWFkO1xuLy8gICAgdmFyIGluaXQgPSAwO1xuLy9cbi8vICAgIGlmIChzLmhpZ2hfd2F0ZXIgPCBjdXJyKSB7XG4vLyAgICAgIC8qIFByZXZpb3VzIGhpZ2ggd2F0ZXIgbWFyayBiZWxvdyBjdXJyZW50IGRhdGEgLS0gemVybyBXSU5fSU5JVFxuLy8gICAgICAgKiBieXRlcyBvciB1cCB0byBlbmQgb2Ygd2luZG93LCB3aGljaGV2ZXIgaXMgbGVzcy5cbi8vICAgICAgICovXG4vLyAgICAgIGluaXQgPSBzLndpbmRvd19zaXplIC0gY3Vycjtcbi8vICAgICAgaWYgKGluaXQgPiBXSU5fSU5JVClcbi8vICAgICAgICBpbml0ID0gV0lOX0lOSVQ7XG4vLyAgICAgIHptZW16ZXJvKHMtPndpbmRvdyArIGN1cnIsICh1bnNpZ25lZClpbml0KTtcbi8vICAgICAgcy0+aGlnaF93YXRlciA9IGN1cnIgKyBpbml0O1xuLy8gICAgfVxuLy8gICAgZWxzZSBpZiAocy0+aGlnaF93YXRlciA8ICh1bGcpY3VyciArIFdJTl9JTklUKSB7XG4vLyAgICAgIC8qIEhpZ2ggd2F0ZXIgbWFyayBhdCBvciBhYm92ZSBjdXJyZW50IGRhdGEsIGJ1dCBiZWxvdyBjdXJyZW50IGRhdGFcbi8vICAgICAgICogcGx1cyBXSU5fSU5JVCAtLSB6ZXJvIG91dCB0byBjdXJyZW50IGRhdGEgcGx1cyBXSU5fSU5JVCwgb3IgdXBcbi8vICAgICAgICogdG8gZW5kIG9mIHdpbmRvdywgd2hpY2hldmVyIGlzIGxlc3MuXG4vLyAgICAgICAqL1xuLy8gICAgICBpbml0ID0gKHVsZyljdXJyICsgV0lOX0lOSVQgLSBzLT5oaWdoX3dhdGVyO1xuLy8gICAgICBpZiAoaW5pdCA+IHMtPndpbmRvd19zaXplIC0gcy0+aGlnaF93YXRlcilcbi8vICAgICAgICBpbml0ID0gcy0+d2luZG93X3NpemUgLSBzLT5oaWdoX3dhdGVyO1xuLy8gICAgICB6bWVtemVybyhzLT53aW5kb3cgKyBzLT5oaWdoX3dhdGVyLCAodW5zaWduZWQpaW5pdCk7XG4vLyAgICAgIHMtPmhpZ2hfd2F0ZXIgKz0gaW5pdDtcbi8vICAgIH1cbi8vICB9XG4vL1xuLy8gIEFzc2VydCgodWxnKXMtPnN0cnN0YXJ0IDw9IHMtPndpbmRvd19zaXplIC0gTUlOX0xPT0tBSEVBRCxcbi8vICAgIFwibm90IGVub3VnaCByb29tIGZvciBzZWFyY2hcIik7XG59XG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogQ29weSB3aXRob3V0IGNvbXByZXNzaW9uIGFzIG11Y2ggYXMgcG9zc2libGUgZnJvbSB0aGUgaW5wdXQgc3RyZWFtLCByZXR1cm5cbiAqIHRoZSBjdXJyZW50IGJsb2NrIHN0YXRlLlxuICogVGhpcyBmdW5jdGlvbiBkb2VzIG5vdCBpbnNlcnQgbmV3IHN0cmluZ3MgaW4gdGhlIGRpY3Rpb25hcnkgc2luY2VcbiAqIHVuY29tcHJlc3NpYmxlIGRhdGEgaXMgcHJvYmFibHkgbm90IHVzZWZ1bC4gVGhpcyBmdW5jdGlvbiBpcyB1c2VkXG4gKiBvbmx5IGZvciB0aGUgbGV2ZWw9MCBjb21wcmVzc2lvbiBvcHRpb24uXG4gKiBOT1RFOiB0aGlzIGZ1bmN0aW9uIHNob3VsZCBiZSBvcHRpbWl6ZWQgdG8gYXZvaWQgZXh0cmEgY29weWluZyBmcm9tXG4gKiB3aW5kb3cgdG8gcGVuZGluZ19idWYuXG4gKi9cbmZ1bmN0aW9uIGRlZmxhdGVfc3RvcmVkKHMsIGZsdXNoKSB7XG4gIC8qIFN0b3JlZCBibG9ja3MgYXJlIGxpbWl0ZWQgdG8gMHhmZmZmIGJ5dGVzLCBwZW5kaW5nX2J1ZiBpcyBsaW1pdGVkXG4gICAqIHRvIHBlbmRpbmdfYnVmX3NpemUsIGFuZCBlYWNoIHN0b3JlZCBibG9jayBoYXMgYSA1IGJ5dGUgaGVhZGVyOlxuICAgKi9cbiAgdmFyIG1heF9ibG9ja19zaXplID0gMHhmZmZmO1xuXG4gIGlmIChtYXhfYmxvY2tfc2l6ZSA+IHMucGVuZGluZ19idWZfc2l6ZSAtIDUpIHtcbiAgICBtYXhfYmxvY2tfc2l6ZSA9IHMucGVuZGluZ19idWZfc2l6ZSAtIDU7XG4gIH1cblxuICAvKiBDb3B5IGFzIG11Y2ggYXMgcG9zc2libGUgZnJvbSBpbnB1dCB0byBvdXRwdXQ6ICovXG4gIGZvciAoOzspIHtcbiAgICAvKiBGaWxsIHRoZSB3aW5kb3cgYXMgbXVjaCBhcyBwb3NzaWJsZTogKi9cbiAgICBpZiAocy5sb29rYWhlYWQgPD0gMSkge1xuXG4gICAgICAvL0Fzc2VydChzLT5zdHJzdGFydCA8IHMtPndfc2l6ZStNQVhfRElTVChzKSB8fFxuICAgICAgLy8gIHMtPmJsb2NrX3N0YXJ0ID49IChsb25nKXMtPndfc2l6ZSwgXCJzbGlkZSB0b28gbGF0ZVwiKTtcbi8vICAgICAgaWYgKCEocy5zdHJzdGFydCA8IHMud19zaXplICsgKHMud19zaXplIC0gTUlOX0xPT0tBSEVBRCkgfHxcbi8vICAgICAgICBzLmJsb2NrX3N0YXJ0ID49IHMud19zaXplKSkge1xuLy8gICAgICAgIHRocm93ICBuZXcgRXJyb3IoXCJzbGlkZSB0b28gbGF0ZVwiKTtcbi8vICAgICAgfVxuXG4gICAgICBmaWxsX3dpbmRvdyhzKTtcbiAgICAgIGlmIChzLmxvb2thaGVhZCA9PT0gMCAmJiBmbHVzaCA9PT0gWl9OT19GTFVTSCkge1xuICAgICAgICByZXR1cm4gQlNfTkVFRF9NT1JFO1xuICAgICAgfVxuXG4gICAgICBpZiAocy5sb29rYWhlYWQgPT09IDApIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICAvKiBmbHVzaCB0aGUgY3VycmVudCBibG9jayAqL1xuICAgIH1cbiAgICAvL0Fzc2VydChzLT5ibG9ja19zdGFydCA+PSAwTCwgXCJibG9jayBnb25lXCIpO1xuLy8gICAgaWYgKHMuYmxvY2tfc3RhcnQgPCAwKSB0aHJvdyBuZXcgRXJyb3IoXCJibG9jayBnb25lXCIpO1xuXG4gICAgcy5zdHJzdGFydCArPSBzLmxvb2thaGVhZDtcbiAgICBzLmxvb2thaGVhZCA9IDA7XG5cbiAgICAvKiBFbWl0IGEgc3RvcmVkIGJsb2NrIGlmIHBlbmRpbmdfYnVmIHdpbGwgYmUgZnVsbDogKi9cbiAgICB2YXIgbWF4X3N0YXJ0ID0gcy5ibG9ja19zdGFydCArIG1heF9ibG9ja19zaXplO1xuXG4gICAgaWYgKHMuc3Ryc3RhcnQgPT09IDAgfHwgcy5zdHJzdGFydCA+PSBtYXhfc3RhcnQpIHtcbiAgICAgIC8qIHN0cnN0YXJ0ID09IDAgaXMgcG9zc2libGUgd2hlbiB3cmFwYXJvdW5kIG9uIDE2LWJpdCBtYWNoaW5lICovXG4gICAgICBzLmxvb2thaGVhZCA9IHMuc3Ryc3RhcnQgLSBtYXhfc3RhcnQ7XG4gICAgICBzLnN0cnN0YXJ0ID0gbWF4X3N0YXJ0O1xuICAgICAgLyoqKiBGTFVTSF9CTE9DSyhzLCAwKTsgKioqL1xuICAgICAgZmx1c2hfYmxvY2tfb25seShzLCBmYWxzZSk7XG4gICAgICBpZiAocy5zdHJtLmF2YWlsX291dCA9PT0gMCkge1xuICAgICAgICByZXR1cm4gQlNfTkVFRF9NT1JFO1xuICAgICAgfVxuICAgICAgLyoqKi9cblxuXG4gICAgfVxuICAgIC8qIEZsdXNoIGlmIHdlIG1heSBoYXZlIHRvIHNsaWRlLCBvdGhlcndpc2UgYmxvY2tfc3RhcnQgbWF5IGJlY29tZVxuICAgICAqIG5lZ2F0aXZlIGFuZCB0aGUgZGF0YSB3aWxsIGJlIGdvbmU6XG4gICAgICovXG4gICAgaWYgKHMuc3Ryc3RhcnQgLSBzLmJsb2NrX3N0YXJ0ID49IChzLndfc2l6ZSAtIE1JTl9MT09LQUhFQUQpKSB7XG4gICAgICAvKioqIEZMVVNIX0JMT0NLKHMsIDApOyAqKiovXG4gICAgICBmbHVzaF9ibG9ja19vbmx5KHMsIGZhbHNlKTtcbiAgICAgIGlmIChzLnN0cm0uYXZhaWxfb3V0ID09PSAwKSB7XG4gICAgICAgIHJldHVybiBCU19ORUVEX01PUkU7XG4gICAgICB9XG4gICAgICAvKioqL1xuICAgIH1cbiAgfVxuXG4gIHMuaW5zZXJ0ID0gMDtcblxuICBpZiAoZmx1c2ggPT09IFpfRklOSVNIKSB7XG4gICAgLyoqKiBGTFVTSF9CTE9DSyhzLCAxKTsgKioqL1xuICAgIGZsdXNoX2Jsb2NrX29ubHkocywgdHJ1ZSk7XG4gICAgaWYgKHMuc3RybS5hdmFpbF9vdXQgPT09IDApIHtcbiAgICAgIHJldHVybiBCU19GSU5JU0hfU1RBUlRFRDtcbiAgICB9XG4gICAgLyoqKi9cbiAgICByZXR1cm4gQlNfRklOSVNIX0RPTkU7XG4gIH1cblxuICBpZiAocy5zdHJzdGFydCA+IHMuYmxvY2tfc3RhcnQpIHtcbiAgICAvKioqIEZMVVNIX0JMT0NLKHMsIDApOyAqKiovXG4gICAgZmx1c2hfYmxvY2tfb25seShzLCBmYWxzZSk7XG4gICAgaWYgKHMuc3RybS5hdmFpbF9vdXQgPT09IDApIHtcbiAgICAgIHJldHVybiBCU19ORUVEX01PUkU7XG4gICAgfVxuICAgIC8qKiovXG4gIH1cblxuICByZXR1cm4gQlNfTkVFRF9NT1JFO1xufVxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIENvbXByZXNzIGFzIG11Y2ggYXMgcG9zc2libGUgZnJvbSB0aGUgaW5wdXQgc3RyZWFtLCByZXR1cm4gdGhlIGN1cnJlbnRcbiAqIGJsb2NrIHN0YXRlLlxuICogVGhpcyBmdW5jdGlvbiBkb2VzIG5vdCBwZXJmb3JtIGxhenkgZXZhbHVhdGlvbiBvZiBtYXRjaGVzIGFuZCBpbnNlcnRzXG4gKiBuZXcgc3RyaW5ncyBpbiB0aGUgZGljdGlvbmFyeSBvbmx5IGZvciB1bm1hdGNoZWQgc3RyaW5ncyBvciBmb3Igc2hvcnRcbiAqIG1hdGNoZXMuIEl0IGlzIHVzZWQgb25seSBmb3IgdGhlIGZhc3QgY29tcHJlc3Npb24gb3B0aW9ucy5cbiAqL1xuZnVuY3Rpb24gZGVmbGF0ZV9mYXN0KHMsIGZsdXNoKSB7XG4gIHZhciBoYXNoX2hlYWQ7ICAgICAgICAvKiBoZWFkIG9mIHRoZSBoYXNoIGNoYWluICovXG4gIHZhciBiZmx1c2g7ICAgICAgICAgICAvKiBzZXQgaWYgY3VycmVudCBibG9jayBtdXN0IGJlIGZsdXNoZWQgKi9cblxuICBmb3IgKDs7KSB7XG4gICAgLyogTWFrZSBzdXJlIHRoYXQgd2UgYWx3YXlzIGhhdmUgZW5vdWdoIGxvb2thaGVhZCwgZXhjZXB0XG4gICAgICogYXQgdGhlIGVuZCBvZiB0aGUgaW5wdXQgZmlsZS4gV2UgbmVlZCBNQVhfTUFUQ0ggYnl0ZXNcbiAgICAgKiBmb3IgdGhlIG5leHQgbWF0Y2gsIHBsdXMgTUlOX01BVENIIGJ5dGVzIHRvIGluc2VydCB0aGVcbiAgICAgKiBzdHJpbmcgZm9sbG93aW5nIHRoZSBuZXh0IG1hdGNoLlxuICAgICAqL1xuICAgIGlmIChzLmxvb2thaGVhZCA8IE1JTl9MT09LQUhFQUQpIHtcbiAgICAgIGZpbGxfd2luZG93KHMpO1xuICAgICAgaWYgKHMubG9va2FoZWFkIDwgTUlOX0xPT0tBSEVBRCAmJiBmbHVzaCA9PT0gWl9OT19GTFVTSCkge1xuICAgICAgICByZXR1cm4gQlNfTkVFRF9NT1JFO1xuICAgICAgfVxuICAgICAgaWYgKHMubG9va2FoZWFkID09PSAwKSB7XG4gICAgICAgIGJyZWFrOyAvKiBmbHVzaCB0aGUgY3VycmVudCBibG9jayAqL1xuICAgICAgfVxuICAgIH1cblxuICAgIC8qIEluc2VydCB0aGUgc3RyaW5nIHdpbmRvd1tzdHJzdGFydCAuLiBzdHJzdGFydCsyXSBpbiB0aGVcbiAgICAgKiBkaWN0aW9uYXJ5LCBhbmQgc2V0IGhhc2hfaGVhZCB0byB0aGUgaGVhZCBvZiB0aGUgaGFzaCBjaGFpbjpcbiAgICAgKi9cbiAgICBoYXNoX2hlYWQgPSAwLypOSUwqLztcbiAgICBpZiAocy5sb29rYWhlYWQgPj0gTUlOX01BVENIKSB7XG4gICAgICAvKioqIElOU0VSVF9TVFJJTkcocywgcy5zdHJzdGFydCwgaGFzaF9oZWFkKTsgKioqL1xuICAgICAgcy5pbnNfaCA9ICgocy5pbnNfaCA8PCBzLmhhc2hfc2hpZnQpIF4gcy53aW5kb3dbcy5zdHJzdGFydCArIE1JTl9NQVRDSCAtIDFdKSAmIHMuaGFzaF9tYXNrO1xuICAgICAgaGFzaF9oZWFkID0gcy5wcmV2W3Muc3Ryc3RhcnQgJiBzLndfbWFza10gPSBzLmhlYWRbcy5pbnNfaF07XG4gICAgICBzLmhlYWRbcy5pbnNfaF0gPSBzLnN0cnN0YXJ0O1xuICAgICAgLyoqKi9cbiAgICB9XG5cbiAgICAvKiBGaW5kIHRoZSBsb25nZXN0IG1hdGNoLCBkaXNjYXJkaW5nIHRob3NlIDw9IHByZXZfbGVuZ3RoLlxuICAgICAqIEF0IHRoaXMgcG9pbnQgd2UgaGF2ZSBhbHdheXMgbWF0Y2hfbGVuZ3RoIDwgTUlOX01BVENIXG4gICAgICovXG4gICAgaWYgKGhhc2hfaGVhZCAhPT0gMC8qTklMKi8gJiYgKChzLnN0cnN0YXJ0IC0gaGFzaF9oZWFkKSA8PSAocy53X3NpemUgLSBNSU5fTE9PS0FIRUFEKSkpIHtcbiAgICAgIC8qIFRvIHNpbXBsaWZ5IHRoZSBjb2RlLCB3ZSBwcmV2ZW50IG1hdGNoZXMgd2l0aCB0aGUgc3RyaW5nXG4gICAgICAgKiBvZiB3aW5kb3cgaW5kZXggMCAoaW4gcGFydGljdWxhciB3ZSBoYXZlIHRvIGF2b2lkIGEgbWF0Y2hcbiAgICAgICAqIG9mIHRoZSBzdHJpbmcgd2l0aCBpdHNlbGYgYXQgdGhlIHN0YXJ0IG9mIHRoZSBpbnB1dCBmaWxlKS5cbiAgICAgICAqL1xuICAgICAgcy5tYXRjaF9sZW5ndGggPSBsb25nZXN0X21hdGNoKHMsIGhhc2hfaGVhZCk7XG4gICAgICAvKiBsb25nZXN0X21hdGNoKCkgc2V0cyBtYXRjaF9zdGFydCAqL1xuICAgIH1cbiAgICBpZiAocy5tYXRjaF9sZW5ndGggPj0gTUlOX01BVENIKSB7XG4gICAgICAvLyBjaGVja19tYXRjaChzLCBzLnN0cnN0YXJ0LCBzLm1hdGNoX3N0YXJ0LCBzLm1hdGNoX2xlbmd0aCk7IC8vIGZvciBkZWJ1ZyBvbmx5XG5cbiAgICAgIC8qKiogX3RyX3RhbGx5X2Rpc3Qocywgcy5zdHJzdGFydCAtIHMubWF0Y2hfc3RhcnQsXG4gICAgICAgICAgICAgICAgICAgICBzLm1hdGNoX2xlbmd0aCAtIE1JTl9NQVRDSCwgYmZsdXNoKTsgKioqL1xuICAgICAgYmZsdXNoID0gdHJlZXMuX3RyX3RhbGx5KHMsIHMuc3Ryc3RhcnQgLSBzLm1hdGNoX3N0YXJ0LCBzLm1hdGNoX2xlbmd0aCAtIE1JTl9NQVRDSCk7XG5cbiAgICAgIHMubG9va2FoZWFkIC09IHMubWF0Y2hfbGVuZ3RoO1xuXG4gICAgICAvKiBJbnNlcnQgbmV3IHN0cmluZ3MgaW4gdGhlIGhhc2ggdGFibGUgb25seSBpZiB0aGUgbWF0Y2ggbGVuZ3RoXG4gICAgICAgKiBpcyBub3QgdG9vIGxhcmdlLiBUaGlzIHNhdmVzIHRpbWUgYnV0IGRlZ3JhZGVzIGNvbXByZXNzaW9uLlxuICAgICAgICovXG4gICAgICBpZiAocy5tYXRjaF9sZW5ndGggPD0gcy5tYXhfbGF6eV9tYXRjaC8qbWF4X2luc2VydF9sZW5ndGgqLyAmJiBzLmxvb2thaGVhZCA+PSBNSU5fTUFUQ0gpIHtcbiAgICAgICAgcy5tYXRjaF9sZW5ndGgtLTsgLyogc3RyaW5nIGF0IHN0cnN0YXJ0IGFscmVhZHkgaW4gdGFibGUgKi9cbiAgICAgICAgZG8ge1xuICAgICAgICAgIHMuc3Ryc3RhcnQrKztcbiAgICAgICAgICAvKioqIElOU0VSVF9TVFJJTkcocywgcy5zdHJzdGFydCwgaGFzaF9oZWFkKTsgKioqL1xuICAgICAgICAgIHMuaW5zX2ggPSAoKHMuaW5zX2ggPDwgcy5oYXNoX3NoaWZ0KSBeIHMud2luZG93W3Muc3Ryc3RhcnQgKyBNSU5fTUFUQ0ggLSAxXSkgJiBzLmhhc2hfbWFzaztcbiAgICAgICAgICBoYXNoX2hlYWQgPSBzLnByZXZbcy5zdHJzdGFydCAmIHMud19tYXNrXSA9IHMuaGVhZFtzLmluc19oXTtcbiAgICAgICAgICBzLmhlYWRbcy5pbnNfaF0gPSBzLnN0cnN0YXJ0O1xuICAgICAgICAgIC8qKiovXG4gICAgICAgICAgLyogc3Ryc3RhcnQgbmV2ZXIgZXhjZWVkcyBXU0laRS1NQVhfTUFUQ0gsIHNvIHRoZXJlIGFyZVxuICAgICAgICAgICAqIGFsd2F5cyBNSU5fTUFUQ0ggYnl0ZXMgYWhlYWQuXG4gICAgICAgICAgICovXG4gICAgICAgIH0gd2hpbGUgKC0tcy5tYXRjaF9sZW5ndGggIT09IDApO1xuICAgICAgICBzLnN0cnN0YXJ0Kys7XG4gICAgICB9IGVsc2VcbiAgICAgIHtcbiAgICAgICAgcy5zdHJzdGFydCArPSBzLm1hdGNoX2xlbmd0aDtcbiAgICAgICAgcy5tYXRjaF9sZW5ndGggPSAwO1xuICAgICAgICBzLmluc19oID0gcy53aW5kb3dbcy5zdHJzdGFydF07XG4gICAgICAgIC8qIFVQREFURV9IQVNIKHMsIHMuaW5zX2gsIHMud2luZG93W3Muc3Ryc3RhcnQrMV0pOyAqL1xuICAgICAgICBzLmluc19oID0gKChzLmluc19oIDw8IHMuaGFzaF9zaGlmdCkgXiBzLndpbmRvd1tzLnN0cnN0YXJ0ICsgMV0pICYgcy5oYXNoX21hc2s7XG5cbi8vI2lmIE1JTl9NQVRDSCAhPSAzXG4vLyAgICAgICAgICAgICAgICBDYWxsIFVQREFURV9IQVNIKCkgTUlOX01BVENILTMgbW9yZSB0aW1lc1xuLy8jZW5kaWZcbiAgICAgICAgLyogSWYgbG9va2FoZWFkIDwgTUlOX01BVENILCBpbnNfaCBpcyBnYXJiYWdlLCBidXQgaXQgZG9lcyBub3RcbiAgICAgICAgICogbWF0dGVyIHNpbmNlIGl0IHdpbGwgYmUgcmVjb21wdXRlZCBhdCBuZXh0IGRlZmxhdGUgY2FsbC5cbiAgICAgICAgICovXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIC8qIE5vIG1hdGNoLCBvdXRwdXQgYSBsaXRlcmFsIGJ5dGUgKi9cbiAgICAgIC8vVHJhY2V2digoc3RkZXJyLFwiJWNcIiwgcy53aW5kb3dbcy5zdHJzdGFydF0pKTtcbiAgICAgIC8qKiogX3RyX3RhbGx5X2xpdChzLCBzLndpbmRvd1tzLnN0cnN0YXJ0XSwgYmZsdXNoKTsgKioqL1xuICAgICAgYmZsdXNoID0gdHJlZXMuX3RyX3RhbGx5KHMsIDAsIHMud2luZG93W3Muc3Ryc3RhcnRdKTtcblxuICAgICAgcy5sb29rYWhlYWQtLTtcbiAgICAgIHMuc3Ryc3RhcnQrKztcbiAgICB9XG4gICAgaWYgKGJmbHVzaCkge1xuICAgICAgLyoqKiBGTFVTSF9CTE9DSyhzLCAwKTsgKioqL1xuICAgICAgZmx1c2hfYmxvY2tfb25seShzLCBmYWxzZSk7XG4gICAgICBpZiAocy5zdHJtLmF2YWlsX291dCA9PT0gMCkge1xuICAgICAgICByZXR1cm4gQlNfTkVFRF9NT1JFO1xuICAgICAgfVxuICAgICAgLyoqKi9cbiAgICB9XG4gIH1cbiAgcy5pbnNlcnQgPSAoKHMuc3Ryc3RhcnQgPCAoTUlOX01BVENIIC0gMSkpID8gcy5zdHJzdGFydCA6IE1JTl9NQVRDSCAtIDEpO1xuICBpZiAoZmx1c2ggPT09IFpfRklOSVNIKSB7XG4gICAgLyoqKiBGTFVTSF9CTE9DSyhzLCAxKTsgKioqL1xuICAgIGZsdXNoX2Jsb2NrX29ubHkocywgdHJ1ZSk7XG4gICAgaWYgKHMuc3RybS5hdmFpbF9vdXQgPT09IDApIHtcbiAgICAgIHJldHVybiBCU19GSU5JU0hfU1RBUlRFRDtcbiAgICB9XG4gICAgLyoqKi9cbiAgICByZXR1cm4gQlNfRklOSVNIX0RPTkU7XG4gIH1cbiAgaWYgKHMubGFzdF9saXQpIHtcbiAgICAvKioqIEZMVVNIX0JMT0NLKHMsIDApOyAqKiovXG4gICAgZmx1c2hfYmxvY2tfb25seShzLCBmYWxzZSk7XG4gICAgaWYgKHMuc3RybS5hdmFpbF9vdXQgPT09IDApIHtcbiAgICAgIHJldHVybiBCU19ORUVEX01PUkU7XG4gICAgfVxuICAgIC8qKiovXG4gIH1cbiAgcmV0dXJuIEJTX0JMT0NLX0RPTkU7XG59XG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogU2FtZSBhcyBhYm92ZSwgYnV0IGFjaGlldmVzIGJldHRlciBjb21wcmVzc2lvbi4gV2UgdXNlIGEgbGF6eVxuICogZXZhbHVhdGlvbiBmb3IgbWF0Y2hlczogYSBtYXRjaCBpcyBmaW5hbGx5IGFkb3B0ZWQgb25seSBpZiB0aGVyZSBpc1xuICogbm8gYmV0dGVyIG1hdGNoIGF0IHRoZSBuZXh0IHdpbmRvdyBwb3NpdGlvbi5cbiAqL1xuZnVuY3Rpb24gZGVmbGF0ZV9zbG93KHMsIGZsdXNoKSB7XG4gIHZhciBoYXNoX2hlYWQ7ICAgICAgICAgIC8qIGhlYWQgb2YgaGFzaCBjaGFpbiAqL1xuICB2YXIgYmZsdXNoOyAgICAgICAgICAgICAgLyogc2V0IGlmIGN1cnJlbnQgYmxvY2sgbXVzdCBiZSBmbHVzaGVkICovXG5cbiAgdmFyIG1heF9pbnNlcnQ7XG5cbiAgLyogUHJvY2VzcyB0aGUgaW5wdXQgYmxvY2suICovXG4gIGZvciAoOzspIHtcbiAgICAvKiBNYWtlIHN1cmUgdGhhdCB3ZSBhbHdheXMgaGF2ZSBlbm91Z2ggbG9va2FoZWFkLCBleGNlcHRcbiAgICAgKiBhdCB0aGUgZW5kIG9mIHRoZSBpbnB1dCBmaWxlLiBXZSBuZWVkIE1BWF9NQVRDSCBieXRlc1xuICAgICAqIGZvciB0aGUgbmV4dCBtYXRjaCwgcGx1cyBNSU5fTUFUQ0ggYnl0ZXMgdG8gaW5zZXJ0IHRoZVxuICAgICAqIHN0cmluZyBmb2xsb3dpbmcgdGhlIG5leHQgbWF0Y2guXG4gICAgICovXG4gICAgaWYgKHMubG9va2FoZWFkIDwgTUlOX0xPT0tBSEVBRCkge1xuICAgICAgZmlsbF93aW5kb3cocyk7XG4gICAgICBpZiAocy5sb29rYWhlYWQgPCBNSU5fTE9PS0FIRUFEICYmIGZsdXNoID09PSBaX05PX0ZMVVNIKSB7XG4gICAgICAgIHJldHVybiBCU19ORUVEX01PUkU7XG4gICAgICB9XG4gICAgICBpZiAocy5sb29rYWhlYWQgPT09IDApIHsgYnJlYWs7IH0gLyogZmx1c2ggdGhlIGN1cnJlbnQgYmxvY2sgKi9cbiAgICB9XG5cbiAgICAvKiBJbnNlcnQgdGhlIHN0cmluZyB3aW5kb3dbc3Ryc3RhcnQgLi4gc3Ryc3RhcnQrMl0gaW4gdGhlXG4gICAgICogZGljdGlvbmFyeSwgYW5kIHNldCBoYXNoX2hlYWQgdG8gdGhlIGhlYWQgb2YgdGhlIGhhc2ggY2hhaW46XG4gICAgICovXG4gICAgaGFzaF9oZWFkID0gMC8qTklMKi87XG4gICAgaWYgKHMubG9va2FoZWFkID49IE1JTl9NQVRDSCkge1xuICAgICAgLyoqKiBJTlNFUlRfU1RSSU5HKHMsIHMuc3Ryc3RhcnQsIGhhc2hfaGVhZCk7ICoqKi9cbiAgICAgIHMuaW5zX2ggPSAoKHMuaW5zX2ggPDwgcy5oYXNoX3NoaWZ0KSBeIHMud2luZG93W3Muc3Ryc3RhcnQgKyBNSU5fTUFUQ0ggLSAxXSkgJiBzLmhhc2hfbWFzaztcbiAgICAgIGhhc2hfaGVhZCA9IHMucHJldltzLnN0cnN0YXJ0ICYgcy53X21hc2tdID0gcy5oZWFkW3MuaW5zX2hdO1xuICAgICAgcy5oZWFkW3MuaW5zX2hdID0gcy5zdHJzdGFydDtcbiAgICAgIC8qKiovXG4gICAgfVxuXG4gICAgLyogRmluZCB0aGUgbG9uZ2VzdCBtYXRjaCwgZGlzY2FyZGluZyB0aG9zZSA8PSBwcmV2X2xlbmd0aC5cbiAgICAgKi9cbiAgICBzLnByZXZfbGVuZ3RoID0gcy5tYXRjaF9sZW5ndGg7XG4gICAgcy5wcmV2X21hdGNoID0gcy5tYXRjaF9zdGFydDtcbiAgICBzLm1hdGNoX2xlbmd0aCA9IE1JTl9NQVRDSCAtIDE7XG5cbiAgICBpZiAoaGFzaF9oZWFkICE9PSAwLypOSUwqLyAmJiBzLnByZXZfbGVuZ3RoIDwgcy5tYXhfbGF6eV9tYXRjaCAmJlxuICAgICAgICBzLnN0cnN0YXJ0IC0gaGFzaF9oZWFkIDw9IChzLndfc2l6ZSAtIE1JTl9MT09LQUhFQUQpLypNQVhfRElTVChzKSovKSB7XG4gICAgICAvKiBUbyBzaW1wbGlmeSB0aGUgY29kZSwgd2UgcHJldmVudCBtYXRjaGVzIHdpdGggdGhlIHN0cmluZ1xuICAgICAgICogb2Ygd2luZG93IGluZGV4IDAgKGluIHBhcnRpY3VsYXIgd2UgaGF2ZSB0byBhdm9pZCBhIG1hdGNoXG4gICAgICAgKiBvZiB0aGUgc3RyaW5nIHdpdGggaXRzZWxmIGF0IHRoZSBzdGFydCBvZiB0aGUgaW5wdXQgZmlsZSkuXG4gICAgICAgKi9cbiAgICAgIHMubWF0Y2hfbGVuZ3RoID0gbG9uZ2VzdF9tYXRjaChzLCBoYXNoX2hlYWQpO1xuICAgICAgLyogbG9uZ2VzdF9tYXRjaCgpIHNldHMgbWF0Y2hfc3RhcnQgKi9cblxuICAgICAgaWYgKHMubWF0Y2hfbGVuZ3RoIDw9IDUgJiZcbiAgICAgICAgIChzLnN0cmF0ZWd5ID09PSBaX0ZJTFRFUkVEIHx8IChzLm1hdGNoX2xlbmd0aCA9PT0gTUlOX01BVENIICYmIHMuc3Ryc3RhcnQgLSBzLm1hdGNoX3N0YXJ0ID4gNDA5Ni8qVE9PX0ZBUiovKSkpIHtcblxuICAgICAgICAvKiBJZiBwcmV2X21hdGNoIGlzIGFsc28gTUlOX01BVENILCBtYXRjaF9zdGFydCBpcyBnYXJiYWdlXG4gICAgICAgICAqIGJ1dCB3ZSB3aWxsIGlnbm9yZSB0aGUgY3VycmVudCBtYXRjaCBhbnl3YXkuXG4gICAgICAgICAqL1xuICAgICAgICBzLm1hdGNoX2xlbmd0aCA9IE1JTl9NQVRDSCAtIDE7XG4gICAgICB9XG4gICAgfVxuICAgIC8qIElmIHRoZXJlIHdhcyBhIG1hdGNoIGF0IHRoZSBwcmV2aW91cyBzdGVwIGFuZCB0aGUgY3VycmVudFxuICAgICAqIG1hdGNoIGlzIG5vdCBiZXR0ZXIsIG91dHB1dCB0aGUgcHJldmlvdXMgbWF0Y2g6XG4gICAgICovXG4gICAgaWYgKHMucHJldl9sZW5ndGggPj0gTUlOX01BVENIICYmIHMubWF0Y2hfbGVuZ3RoIDw9IHMucHJldl9sZW5ndGgpIHtcbiAgICAgIG1heF9pbnNlcnQgPSBzLnN0cnN0YXJ0ICsgcy5sb29rYWhlYWQgLSBNSU5fTUFUQ0g7XG4gICAgICAvKiBEbyBub3QgaW5zZXJ0IHN0cmluZ3MgaW4gaGFzaCB0YWJsZSBiZXlvbmQgdGhpcy4gKi9cblxuICAgICAgLy9jaGVja19tYXRjaChzLCBzLnN0cnN0YXJ0LTEsIHMucHJldl9tYXRjaCwgcy5wcmV2X2xlbmd0aCk7XG5cbiAgICAgIC8qKipfdHJfdGFsbHlfZGlzdChzLCBzLnN0cnN0YXJ0IC0gMSAtIHMucHJldl9tYXRjaCxcbiAgICAgICAgICAgICAgICAgICAgIHMucHJldl9sZW5ndGggLSBNSU5fTUFUQ0gsIGJmbHVzaCk7KioqL1xuICAgICAgYmZsdXNoID0gdHJlZXMuX3RyX3RhbGx5KHMsIHMuc3Ryc3RhcnQgLSAxIC0gcy5wcmV2X21hdGNoLCBzLnByZXZfbGVuZ3RoIC0gTUlOX01BVENIKTtcbiAgICAgIC8qIEluc2VydCBpbiBoYXNoIHRhYmxlIGFsbCBzdHJpbmdzIHVwIHRvIHRoZSBlbmQgb2YgdGhlIG1hdGNoLlxuICAgICAgICogc3Ryc3RhcnQtMSBhbmQgc3Ryc3RhcnQgYXJlIGFscmVhZHkgaW5zZXJ0ZWQuIElmIHRoZXJlIGlzIG5vdFxuICAgICAgICogZW5vdWdoIGxvb2thaGVhZCwgdGhlIGxhc3QgdHdvIHN0cmluZ3MgYXJlIG5vdCBpbnNlcnRlZCBpblxuICAgICAgICogdGhlIGhhc2ggdGFibGUuXG4gICAgICAgKi9cbiAgICAgIHMubG9va2FoZWFkIC09IHMucHJldl9sZW5ndGggLSAxO1xuICAgICAgcy5wcmV2X2xlbmd0aCAtPSAyO1xuICAgICAgZG8ge1xuICAgICAgICBpZiAoKytzLnN0cnN0YXJ0IDw9IG1heF9pbnNlcnQpIHtcbiAgICAgICAgICAvKioqIElOU0VSVF9TVFJJTkcocywgcy5zdHJzdGFydCwgaGFzaF9oZWFkKTsgKioqL1xuICAgICAgICAgIHMuaW5zX2ggPSAoKHMuaW5zX2ggPDwgcy5oYXNoX3NoaWZ0KSBeIHMud2luZG93W3Muc3Ryc3RhcnQgKyBNSU5fTUFUQ0ggLSAxXSkgJiBzLmhhc2hfbWFzaztcbiAgICAgICAgICBoYXNoX2hlYWQgPSBzLnByZXZbcy5zdHJzdGFydCAmIHMud19tYXNrXSA9IHMuaGVhZFtzLmluc19oXTtcbiAgICAgICAgICBzLmhlYWRbcy5pbnNfaF0gPSBzLnN0cnN0YXJ0O1xuICAgICAgICAgIC8qKiovXG4gICAgICAgIH1cbiAgICAgIH0gd2hpbGUgKC0tcy5wcmV2X2xlbmd0aCAhPT0gMCk7XG4gICAgICBzLm1hdGNoX2F2YWlsYWJsZSA9IDA7XG4gICAgICBzLm1hdGNoX2xlbmd0aCA9IE1JTl9NQVRDSCAtIDE7XG4gICAgICBzLnN0cnN0YXJ0Kys7XG5cbiAgICAgIGlmIChiZmx1c2gpIHtcbiAgICAgICAgLyoqKiBGTFVTSF9CTE9DSyhzLCAwKTsgKioqL1xuICAgICAgICBmbHVzaF9ibG9ja19vbmx5KHMsIGZhbHNlKTtcbiAgICAgICAgaWYgKHMuc3RybS5hdmFpbF9vdXQgPT09IDApIHtcbiAgICAgICAgICByZXR1cm4gQlNfTkVFRF9NT1JFO1xuICAgICAgICB9XG4gICAgICAgIC8qKiovXG4gICAgICB9XG5cbiAgICB9IGVsc2UgaWYgKHMubWF0Y2hfYXZhaWxhYmxlKSB7XG4gICAgICAvKiBJZiB0aGVyZSB3YXMgbm8gbWF0Y2ggYXQgdGhlIHByZXZpb3VzIHBvc2l0aW9uLCBvdXRwdXQgYVxuICAgICAgICogc2luZ2xlIGxpdGVyYWwuIElmIHRoZXJlIHdhcyBhIG1hdGNoIGJ1dCB0aGUgY3VycmVudCBtYXRjaFxuICAgICAgICogaXMgbG9uZ2VyLCB0cnVuY2F0ZSB0aGUgcHJldmlvdXMgbWF0Y2ggdG8gYSBzaW5nbGUgbGl0ZXJhbC5cbiAgICAgICAqL1xuICAgICAgLy9UcmFjZXZ2KChzdGRlcnIsXCIlY1wiLCBzLT53aW5kb3dbcy0+c3Ryc3RhcnQtMV0pKTtcbiAgICAgIC8qKiogX3RyX3RhbGx5X2xpdChzLCBzLndpbmRvd1tzLnN0cnN0YXJ0LTFdLCBiZmx1c2gpOyAqKiovXG4gICAgICBiZmx1c2ggPSB0cmVlcy5fdHJfdGFsbHkocywgMCwgcy53aW5kb3dbcy5zdHJzdGFydCAtIDFdKTtcblxuICAgICAgaWYgKGJmbHVzaCkge1xuICAgICAgICAvKioqIEZMVVNIX0JMT0NLX09OTFkocywgMCkgKioqL1xuICAgICAgICBmbHVzaF9ibG9ja19vbmx5KHMsIGZhbHNlKTtcbiAgICAgICAgLyoqKi9cbiAgICAgIH1cbiAgICAgIHMuc3Ryc3RhcnQrKztcbiAgICAgIHMubG9va2FoZWFkLS07XG4gICAgICBpZiAocy5zdHJtLmF2YWlsX291dCA9PT0gMCkge1xuICAgICAgICByZXR1cm4gQlNfTkVFRF9NT1JFO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvKiBUaGVyZSBpcyBubyBwcmV2aW91cyBtYXRjaCB0byBjb21wYXJlIHdpdGgsIHdhaXQgZm9yXG4gICAgICAgKiB0aGUgbmV4dCBzdGVwIHRvIGRlY2lkZS5cbiAgICAgICAqL1xuICAgICAgcy5tYXRjaF9hdmFpbGFibGUgPSAxO1xuICAgICAgcy5zdHJzdGFydCsrO1xuICAgICAgcy5sb29rYWhlYWQtLTtcbiAgICB9XG4gIH1cbiAgLy9Bc3NlcnQgKGZsdXNoICE9IFpfTk9fRkxVU0gsIFwibm8gZmx1c2g/XCIpO1xuICBpZiAocy5tYXRjaF9hdmFpbGFibGUpIHtcbiAgICAvL1RyYWNldnYoKHN0ZGVycixcIiVjXCIsIHMtPndpbmRvd1tzLT5zdHJzdGFydC0xXSkpO1xuICAgIC8qKiogX3RyX3RhbGx5X2xpdChzLCBzLndpbmRvd1tzLnN0cnN0YXJ0LTFdLCBiZmx1c2gpOyAqKiovXG4gICAgYmZsdXNoID0gdHJlZXMuX3RyX3RhbGx5KHMsIDAsIHMud2luZG93W3Muc3Ryc3RhcnQgLSAxXSk7XG5cbiAgICBzLm1hdGNoX2F2YWlsYWJsZSA9IDA7XG4gIH1cbiAgcy5pbnNlcnQgPSBzLnN0cnN0YXJ0IDwgTUlOX01BVENIIC0gMSA/IHMuc3Ryc3RhcnQgOiBNSU5fTUFUQ0ggLSAxO1xuICBpZiAoZmx1c2ggPT09IFpfRklOSVNIKSB7XG4gICAgLyoqKiBGTFVTSF9CTE9DSyhzLCAxKTsgKioqL1xuICAgIGZsdXNoX2Jsb2NrX29ubHkocywgdHJ1ZSk7XG4gICAgaWYgKHMuc3RybS5hdmFpbF9vdXQgPT09IDApIHtcbiAgICAgIHJldHVybiBCU19GSU5JU0hfU1RBUlRFRDtcbiAgICB9XG4gICAgLyoqKi9cbiAgICByZXR1cm4gQlNfRklOSVNIX0RPTkU7XG4gIH1cbiAgaWYgKHMubGFzdF9saXQpIHtcbiAgICAvKioqIEZMVVNIX0JMT0NLKHMsIDApOyAqKiovXG4gICAgZmx1c2hfYmxvY2tfb25seShzLCBmYWxzZSk7XG4gICAgaWYgKHMuc3RybS5hdmFpbF9vdXQgPT09IDApIHtcbiAgICAgIHJldHVybiBCU19ORUVEX01PUkU7XG4gICAgfVxuICAgIC8qKiovXG4gIH1cblxuICByZXR1cm4gQlNfQkxPQ0tfRE9ORTtcbn1cblxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIEZvciBaX1JMRSwgc2ltcGx5IGxvb2sgZm9yIHJ1bnMgb2YgYnl0ZXMsIGdlbmVyYXRlIG1hdGNoZXMgb25seSBvZiBkaXN0YW5jZVxuICogb25lLiAgRG8gbm90IG1haW50YWluIGEgaGFzaCB0YWJsZS4gIChJdCB3aWxsIGJlIHJlZ2VuZXJhdGVkIGlmIHRoaXMgcnVuIG9mXG4gKiBkZWZsYXRlIHN3aXRjaGVzIGF3YXkgZnJvbSBaX1JMRS4pXG4gKi9cbmZ1bmN0aW9uIGRlZmxhdGVfcmxlKHMsIGZsdXNoKSB7XG4gIHZhciBiZmx1c2g7ICAgICAgICAgICAgLyogc2V0IGlmIGN1cnJlbnQgYmxvY2sgbXVzdCBiZSBmbHVzaGVkICovXG4gIHZhciBwcmV2OyAgICAgICAgICAgICAgLyogYnl0ZSBhdCBkaXN0YW5jZSBvbmUgdG8gbWF0Y2ggKi9cbiAgdmFyIHNjYW4sIHN0cmVuZDsgICAgICAvKiBzY2FuIGdvZXMgdXAgdG8gc3RyZW5kIGZvciBsZW5ndGggb2YgcnVuICovXG5cbiAgdmFyIF93aW4gPSBzLndpbmRvdztcblxuICBmb3IgKDs7KSB7XG4gICAgLyogTWFrZSBzdXJlIHRoYXQgd2UgYWx3YXlzIGhhdmUgZW5vdWdoIGxvb2thaGVhZCwgZXhjZXB0XG4gICAgICogYXQgdGhlIGVuZCBvZiB0aGUgaW5wdXQgZmlsZS4gV2UgbmVlZCBNQVhfTUFUQ0ggYnl0ZXNcbiAgICAgKiBmb3IgdGhlIGxvbmdlc3QgcnVuLCBwbHVzIG9uZSBmb3IgdGhlIHVucm9sbGVkIGxvb3AuXG4gICAgICovXG4gICAgaWYgKHMubG9va2FoZWFkIDw9IE1BWF9NQVRDSCkge1xuICAgICAgZmlsbF93aW5kb3cocyk7XG4gICAgICBpZiAocy5sb29rYWhlYWQgPD0gTUFYX01BVENIICYmIGZsdXNoID09PSBaX05PX0ZMVVNIKSB7XG4gICAgICAgIHJldHVybiBCU19ORUVEX01PUkU7XG4gICAgICB9XG4gICAgICBpZiAocy5sb29rYWhlYWQgPT09IDApIHsgYnJlYWs7IH0gLyogZmx1c2ggdGhlIGN1cnJlbnQgYmxvY2sgKi9cbiAgICB9XG5cbiAgICAvKiBTZWUgaG93IG1hbnkgdGltZXMgdGhlIHByZXZpb3VzIGJ5dGUgcmVwZWF0cyAqL1xuICAgIHMubWF0Y2hfbGVuZ3RoID0gMDtcbiAgICBpZiAocy5sb29rYWhlYWQgPj0gTUlOX01BVENIICYmIHMuc3Ryc3RhcnQgPiAwKSB7XG4gICAgICBzY2FuID0gcy5zdHJzdGFydCAtIDE7XG4gICAgICBwcmV2ID0gX3dpbltzY2FuXTtcbiAgICAgIGlmIChwcmV2ID09PSBfd2luWysrc2Nhbl0gJiYgcHJldiA9PT0gX3dpblsrK3NjYW5dICYmIHByZXYgPT09IF93aW5bKytzY2FuXSkge1xuICAgICAgICBzdHJlbmQgPSBzLnN0cnN0YXJ0ICsgTUFYX01BVENIO1xuICAgICAgICBkbyB7XG4gICAgICAgICAgLypqc2hpbnQgbm9lbXB0eTpmYWxzZSovXG4gICAgICAgIH0gd2hpbGUgKHByZXYgPT09IF93aW5bKytzY2FuXSAmJiBwcmV2ID09PSBfd2luWysrc2Nhbl0gJiZcbiAgICAgICAgICAgICAgICAgcHJldiA9PT0gX3dpblsrK3NjYW5dICYmIHByZXYgPT09IF93aW5bKytzY2FuXSAmJlxuICAgICAgICAgICAgICAgICBwcmV2ID09PSBfd2luWysrc2Nhbl0gJiYgcHJldiA9PT0gX3dpblsrK3NjYW5dICYmXG4gICAgICAgICAgICAgICAgIHByZXYgPT09IF93aW5bKytzY2FuXSAmJiBwcmV2ID09PSBfd2luWysrc2Nhbl0gJiZcbiAgICAgICAgICAgICAgICAgc2NhbiA8IHN0cmVuZCk7XG4gICAgICAgIHMubWF0Y2hfbGVuZ3RoID0gTUFYX01BVENIIC0gKHN0cmVuZCAtIHNjYW4pO1xuICAgICAgICBpZiAocy5tYXRjaF9sZW5ndGggPiBzLmxvb2thaGVhZCkge1xuICAgICAgICAgIHMubWF0Y2hfbGVuZ3RoID0gcy5sb29rYWhlYWQ7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIC8vQXNzZXJ0KHNjYW4gPD0gcy0+d2luZG93Kyh1SW50KShzLT53aW5kb3dfc2l6ZS0xKSwgXCJ3aWxkIHNjYW5cIik7XG4gICAgfVxuXG4gICAgLyogRW1pdCBtYXRjaCBpZiBoYXZlIHJ1biBvZiBNSU5fTUFUQ0ggb3IgbG9uZ2VyLCBlbHNlIGVtaXQgbGl0ZXJhbCAqL1xuICAgIGlmIChzLm1hdGNoX2xlbmd0aCA+PSBNSU5fTUFUQ0gpIHtcbiAgICAgIC8vY2hlY2tfbWF0Y2gocywgcy5zdHJzdGFydCwgcy5zdHJzdGFydCAtIDEsIHMubWF0Y2hfbGVuZ3RoKTtcblxuICAgICAgLyoqKiBfdHJfdGFsbHlfZGlzdChzLCAxLCBzLm1hdGNoX2xlbmd0aCAtIE1JTl9NQVRDSCwgYmZsdXNoKTsgKioqL1xuICAgICAgYmZsdXNoID0gdHJlZXMuX3RyX3RhbGx5KHMsIDEsIHMubWF0Y2hfbGVuZ3RoIC0gTUlOX01BVENIKTtcblxuICAgICAgcy5sb29rYWhlYWQgLT0gcy5tYXRjaF9sZW5ndGg7XG4gICAgICBzLnN0cnN0YXJ0ICs9IHMubWF0Y2hfbGVuZ3RoO1xuICAgICAgcy5tYXRjaF9sZW5ndGggPSAwO1xuICAgIH0gZWxzZSB7XG4gICAgICAvKiBObyBtYXRjaCwgb3V0cHV0IGEgbGl0ZXJhbCBieXRlICovXG4gICAgICAvL1RyYWNldnYoKHN0ZGVycixcIiVjXCIsIHMtPndpbmRvd1tzLT5zdHJzdGFydF0pKTtcbiAgICAgIC8qKiogX3RyX3RhbGx5X2xpdChzLCBzLndpbmRvd1tzLnN0cnN0YXJ0XSwgYmZsdXNoKTsgKioqL1xuICAgICAgYmZsdXNoID0gdHJlZXMuX3RyX3RhbGx5KHMsIDAsIHMud2luZG93W3Muc3Ryc3RhcnRdKTtcblxuICAgICAgcy5sb29rYWhlYWQtLTtcbiAgICAgIHMuc3Ryc3RhcnQrKztcbiAgICB9XG4gICAgaWYgKGJmbHVzaCkge1xuICAgICAgLyoqKiBGTFVTSF9CTE9DSyhzLCAwKTsgKioqL1xuICAgICAgZmx1c2hfYmxvY2tfb25seShzLCBmYWxzZSk7XG4gICAgICBpZiAocy5zdHJtLmF2YWlsX291dCA9PT0gMCkge1xuICAgICAgICByZXR1cm4gQlNfTkVFRF9NT1JFO1xuICAgICAgfVxuICAgICAgLyoqKi9cbiAgICB9XG4gIH1cbiAgcy5pbnNlcnQgPSAwO1xuICBpZiAoZmx1c2ggPT09IFpfRklOSVNIKSB7XG4gICAgLyoqKiBGTFVTSF9CTE9DSyhzLCAxKTsgKioqL1xuICAgIGZsdXNoX2Jsb2NrX29ubHkocywgdHJ1ZSk7XG4gICAgaWYgKHMuc3RybS5hdmFpbF9vdXQgPT09IDApIHtcbiAgICAgIHJldHVybiBCU19GSU5JU0hfU1RBUlRFRDtcbiAgICB9XG4gICAgLyoqKi9cbiAgICByZXR1cm4gQlNfRklOSVNIX0RPTkU7XG4gIH1cbiAgaWYgKHMubGFzdF9saXQpIHtcbiAgICAvKioqIEZMVVNIX0JMT0NLKHMsIDApOyAqKiovXG4gICAgZmx1c2hfYmxvY2tfb25seShzLCBmYWxzZSk7XG4gICAgaWYgKHMuc3RybS5hdmFpbF9vdXQgPT09IDApIHtcbiAgICAgIHJldHVybiBCU19ORUVEX01PUkU7XG4gICAgfVxuICAgIC8qKiovXG4gIH1cbiAgcmV0dXJuIEJTX0JMT0NLX0RPTkU7XG59XG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogRm9yIFpfSFVGRk1BTl9PTkxZLCBkbyBub3QgbG9vayBmb3IgbWF0Y2hlcy4gIERvIG5vdCBtYWludGFpbiBhIGhhc2ggdGFibGUuXG4gKiAoSXQgd2lsbCBiZSByZWdlbmVyYXRlZCBpZiB0aGlzIHJ1biBvZiBkZWZsYXRlIHN3aXRjaGVzIGF3YXkgZnJvbSBIdWZmbWFuLilcbiAqL1xuZnVuY3Rpb24gZGVmbGF0ZV9odWZmKHMsIGZsdXNoKSB7XG4gIHZhciBiZmx1c2g7ICAgICAgICAgICAgIC8qIHNldCBpZiBjdXJyZW50IGJsb2NrIG11c3QgYmUgZmx1c2hlZCAqL1xuXG4gIGZvciAoOzspIHtcbiAgICAvKiBNYWtlIHN1cmUgdGhhdCB3ZSBoYXZlIGEgbGl0ZXJhbCB0byB3cml0ZS4gKi9cbiAgICBpZiAocy5sb29rYWhlYWQgPT09IDApIHtcbiAgICAgIGZpbGxfd2luZG93KHMpO1xuICAgICAgaWYgKHMubG9va2FoZWFkID09PSAwKSB7XG4gICAgICAgIGlmIChmbHVzaCA9PT0gWl9OT19GTFVTSCkge1xuICAgICAgICAgIHJldHVybiBCU19ORUVEX01PUkU7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7ICAgICAgLyogZmx1c2ggdGhlIGN1cnJlbnQgYmxvY2sgKi9cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvKiBPdXRwdXQgYSBsaXRlcmFsIGJ5dGUgKi9cbiAgICBzLm1hdGNoX2xlbmd0aCA9IDA7XG4gICAgLy9UcmFjZXZ2KChzdGRlcnIsXCIlY1wiLCBzLT53aW5kb3dbcy0+c3Ryc3RhcnRdKSk7XG4gICAgLyoqKiBfdHJfdGFsbHlfbGl0KHMsIHMud2luZG93W3Muc3Ryc3RhcnRdLCBiZmx1c2gpOyAqKiovXG4gICAgYmZsdXNoID0gdHJlZXMuX3RyX3RhbGx5KHMsIDAsIHMud2luZG93W3Muc3Ryc3RhcnRdKTtcbiAgICBzLmxvb2thaGVhZC0tO1xuICAgIHMuc3Ryc3RhcnQrKztcbiAgICBpZiAoYmZsdXNoKSB7XG4gICAgICAvKioqIEZMVVNIX0JMT0NLKHMsIDApOyAqKiovXG4gICAgICBmbHVzaF9ibG9ja19vbmx5KHMsIGZhbHNlKTtcbiAgICAgIGlmIChzLnN0cm0uYXZhaWxfb3V0ID09PSAwKSB7XG4gICAgICAgIHJldHVybiBCU19ORUVEX01PUkU7XG4gICAgICB9XG4gICAgICAvKioqL1xuICAgIH1cbiAgfVxuICBzLmluc2VydCA9IDA7XG4gIGlmIChmbHVzaCA9PT0gWl9GSU5JU0gpIHtcbiAgICAvKioqIEZMVVNIX0JMT0NLKHMsIDEpOyAqKiovXG4gICAgZmx1c2hfYmxvY2tfb25seShzLCB0cnVlKTtcbiAgICBpZiAocy5zdHJtLmF2YWlsX291dCA9PT0gMCkge1xuICAgICAgcmV0dXJuIEJTX0ZJTklTSF9TVEFSVEVEO1xuICAgIH1cbiAgICAvKioqL1xuICAgIHJldHVybiBCU19GSU5JU0hfRE9ORTtcbiAgfVxuICBpZiAocy5sYXN0X2xpdCkge1xuICAgIC8qKiogRkxVU0hfQkxPQ0socywgMCk7ICoqKi9cbiAgICBmbHVzaF9ibG9ja19vbmx5KHMsIGZhbHNlKTtcbiAgICBpZiAocy5zdHJtLmF2YWlsX291dCA9PT0gMCkge1xuICAgICAgcmV0dXJuIEJTX05FRURfTU9SRTtcbiAgICB9XG4gICAgLyoqKi9cbiAgfVxuICByZXR1cm4gQlNfQkxPQ0tfRE9ORTtcbn1cblxuLyogVmFsdWVzIGZvciBtYXhfbGF6eV9tYXRjaCwgZ29vZF9tYXRjaCBhbmQgbWF4X2NoYWluX2xlbmd0aCwgZGVwZW5kaW5nIG9uXG4gKiB0aGUgZGVzaXJlZCBwYWNrIGxldmVsICgwLi45KS4gVGhlIHZhbHVlcyBnaXZlbiBiZWxvdyBoYXZlIGJlZW4gdHVuZWQgdG9cbiAqIGV4Y2x1ZGUgd29yc3QgY2FzZSBwZXJmb3JtYW5jZSBmb3IgcGF0aG9sb2dpY2FsIGZpbGVzLiBCZXR0ZXIgdmFsdWVzIG1heSBiZVxuICogZm91bmQgZm9yIHNwZWNpZmljIGZpbGVzLlxuICovXG5mdW5jdGlvbiBDb25maWcoZ29vZF9sZW5ndGgsIG1heF9sYXp5LCBuaWNlX2xlbmd0aCwgbWF4X2NoYWluLCBmdW5jKSB7XG4gIHRoaXMuZ29vZF9sZW5ndGggPSBnb29kX2xlbmd0aDtcbiAgdGhpcy5tYXhfbGF6eSA9IG1heF9sYXp5O1xuICB0aGlzLm5pY2VfbGVuZ3RoID0gbmljZV9sZW5ndGg7XG4gIHRoaXMubWF4X2NoYWluID0gbWF4X2NoYWluO1xuICB0aGlzLmZ1bmMgPSBmdW5jO1xufVxuXG52YXIgY29uZmlndXJhdGlvbl90YWJsZTtcblxuY29uZmlndXJhdGlvbl90YWJsZSA9IFtcbiAgLyogICAgICBnb29kIGxhenkgbmljZSBjaGFpbiAqL1xuICBuZXcgQ29uZmlnKDAsIDAsIDAsIDAsIGRlZmxhdGVfc3RvcmVkKSwgICAgICAgICAgLyogMCBzdG9yZSBvbmx5ICovXG4gIG5ldyBDb25maWcoNCwgNCwgOCwgNCwgZGVmbGF0ZV9mYXN0KSwgICAgICAgICAgICAvKiAxIG1heCBzcGVlZCwgbm8gbGF6eSBtYXRjaGVzICovXG4gIG5ldyBDb25maWcoNCwgNSwgMTYsIDgsIGRlZmxhdGVfZmFzdCksICAgICAgICAgICAvKiAyICovXG4gIG5ldyBDb25maWcoNCwgNiwgMzIsIDMyLCBkZWZsYXRlX2Zhc3QpLCAgICAgICAgICAvKiAzICovXG5cbiAgbmV3IENvbmZpZyg0LCA0LCAxNiwgMTYsIGRlZmxhdGVfc2xvdyksICAgICAgICAgIC8qIDQgbGF6eSBtYXRjaGVzICovXG4gIG5ldyBDb25maWcoOCwgMTYsIDMyLCAzMiwgZGVmbGF0ZV9zbG93KSwgICAgICAgICAvKiA1ICovXG4gIG5ldyBDb25maWcoOCwgMTYsIDEyOCwgMTI4LCBkZWZsYXRlX3Nsb3cpLCAgICAgICAvKiA2ICovXG4gIG5ldyBDb25maWcoOCwgMzIsIDEyOCwgMjU2LCBkZWZsYXRlX3Nsb3cpLCAgICAgICAvKiA3ICovXG4gIG5ldyBDb25maWcoMzIsIDEyOCwgMjU4LCAxMDI0LCBkZWZsYXRlX3Nsb3cpLCAgICAvKiA4ICovXG4gIG5ldyBDb25maWcoMzIsIDI1OCwgMjU4LCA0MDk2LCBkZWZsYXRlX3Nsb3cpICAgICAvKiA5IG1heCBjb21wcmVzc2lvbiAqL1xuXTtcblxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIEluaXRpYWxpemUgdGhlIFwibG9uZ2VzdCBtYXRjaFwiIHJvdXRpbmVzIGZvciBhIG5ldyB6bGliIHN0cmVhbVxuICovXG5mdW5jdGlvbiBsbV9pbml0KHMpIHtcbiAgcy53aW5kb3dfc2l6ZSA9IDIgKiBzLndfc2l6ZTtcblxuICAvKioqIENMRUFSX0hBU0gocyk7ICoqKi9cbiAgemVybyhzLmhlYWQpOyAvLyBGaWxsIHdpdGggTklMICg9IDApO1xuXG4gIC8qIFNldCB0aGUgZGVmYXVsdCBjb25maWd1cmF0aW9uIHBhcmFtZXRlcnM6XG4gICAqL1xuICBzLm1heF9sYXp5X21hdGNoID0gY29uZmlndXJhdGlvbl90YWJsZVtzLmxldmVsXS5tYXhfbGF6eTtcbiAgcy5nb29kX21hdGNoID0gY29uZmlndXJhdGlvbl90YWJsZVtzLmxldmVsXS5nb29kX2xlbmd0aDtcbiAgcy5uaWNlX21hdGNoID0gY29uZmlndXJhdGlvbl90YWJsZVtzLmxldmVsXS5uaWNlX2xlbmd0aDtcbiAgcy5tYXhfY2hhaW5fbGVuZ3RoID0gY29uZmlndXJhdGlvbl90YWJsZVtzLmxldmVsXS5tYXhfY2hhaW47XG5cbiAgcy5zdHJzdGFydCA9IDA7XG4gIHMuYmxvY2tfc3RhcnQgPSAwO1xuICBzLmxvb2thaGVhZCA9IDA7XG4gIHMuaW5zZXJ0ID0gMDtcbiAgcy5tYXRjaF9sZW5ndGggPSBzLnByZXZfbGVuZ3RoID0gTUlOX01BVENIIC0gMTtcbiAgcy5tYXRjaF9hdmFpbGFibGUgPSAwO1xuICBzLmluc19oID0gMDtcbn1cblxuXG5mdW5jdGlvbiBEZWZsYXRlU3RhdGUoKSB7XG4gIHRoaXMuc3RybSA9IG51bGw7ICAgICAgICAgICAgLyogcG9pbnRlciBiYWNrIHRvIHRoaXMgemxpYiBzdHJlYW0gKi9cbiAgdGhpcy5zdGF0dXMgPSAwOyAgICAgICAgICAgIC8qIGFzIHRoZSBuYW1lIGltcGxpZXMgKi9cbiAgdGhpcy5wZW5kaW5nX2J1ZiA9IG51bGw7ICAgICAgLyogb3V0cHV0IHN0aWxsIHBlbmRpbmcgKi9cbiAgdGhpcy5wZW5kaW5nX2J1Zl9zaXplID0gMDsgIC8qIHNpemUgb2YgcGVuZGluZ19idWYgKi9cbiAgdGhpcy5wZW5kaW5nX291dCA9IDA7ICAgICAgIC8qIG5leHQgcGVuZGluZyBieXRlIHRvIG91dHB1dCB0byB0aGUgc3RyZWFtICovXG4gIHRoaXMucGVuZGluZyA9IDA7ICAgICAgICAgICAvKiBuYiBvZiBieXRlcyBpbiB0aGUgcGVuZGluZyBidWZmZXIgKi9cbiAgdGhpcy53cmFwID0gMDsgICAgICAgICAgICAgIC8qIGJpdCAwIHRydWUgZm9yIHpsaWIsIGJpdCAxIHRydWUgZm9yIGd6aXAgKi9cbiAgdGhpcy5nemhlYWQgPSBudWxsOyAgICAgICAgIC8qIGd6aXAgaGVhZGVyIGluZm9ybWF0aW9uIHRvIHdyaXRlICovXG4gIHRoaXMuZ3ppbmRleCA9IDA7ICAgICAgICAgICAvKiB3aGVyZSBpbiBleHRyYSwgbmFtZSwgb3IgY29tbWVudCAqL1xuICB0aGlzLm1ldGhvZCA9IFpfREVGTEFURUQ7IC8qIGNhbiBvbmx5IGJlIERFRkxBVEVEICovXG4gIHRoaXMubGFzdF9mbHVzaCA9IC0xOyAgIC8qIHZhbHVlIG9mIGZsdXNoIHBhcmFtIGZvciBwcmV2aW91cyBkZWZsYXRlIGNhbGwgKi9cblxuICB0aGlzLndfc2l6ZSA9IDA7ICAvKiBMWjc3IHdpbmRvdyBzaXplICgzMksgYnkgZGVmYXVsdCkgKi9cbiAgdGhpcy53X2JpdHMgPSAwOyAgLyogbG9nMih3X3NpemUpICAoOC4uMTYpICovXG4gIHRoaXMud19tYXNrID0gMDsgIC8qIHdfc2l6ZSAtIDEgKi9cblxuICB0aGlzLndpbmRvdyA9IG51bGw7XG4gIC8qIFNsaWRpbmcgd2luZG93LiBJbnB1dCBieXRlcyBhcmUgcmVhZCBpbnRvIHRoZSBzZWNvbmQgaGFsZiBvZiB0aGUgd2luZG93LFxuICAgKiBhbmQgbW92ZSB0byB0aGUgZmlyc3QgaGFsZiBsYXRlciB0byBrZWVwIGEgZGljdGlvbmFyeSBvZiBhdCBsZWFzdCB3U2l6ZVxuICAgKiBieXRlcy4gV2l0aCB0aGlzIG9yZ2FuaXphdGlvbiwgbWF0Y2hlcyBhcmUgbGltaXRlZCB0byBhIGRpc3RhbmNlIG9mXG4gICAqIHdTaXplLU1BWF9NQVRDSCBieXRlcywgYnV0IHRoaXMgZW5zdXJlcyB0aGF0IElPIGlzIGFsd2F5c1xuICAgKiBwZXJmb3JtZWQgd2l0aCBhIGxlbmd0aCBtdWx0aXBsZSBvZiB0aGUgYmxvY2sgc2l6ZS5cbiAgICovXG5cbiAgdGhpcy53aW5kb3dfc2l6ZSA9IDA7XG4gIC8qIEFjdHVhbCBzaXplIG9mIHdpbmRvdzogMip3U2l6ZSwgZXhjZXB0IHdoZW4gdGhlIHVzZXIgaW5wdXQgYnVmZmVyXG4gICAqIGlzIGRpcmVjdGx5IHVzZWQgYXMgc2xpZGluZyB3aW5kb3cuXG4gICAqL1xuXG4gIHRoaXMucHJldiA9IG51bGw7XG4gIC8qIExpbmsgdG8gb2xkZXIgc3RyaW5nIHdpdGggc2FtZSBoYXNoIGluZGV4LiBUbyBsaW1pdCB0aGUgc2l6ZSBvZiB0aGlzXG4gICAqIGFycmF5IHRvIDY0SywgdGhpcyBsaW5rIGlzIG1haW50YWluZWQgb25seSBmb3IgdGhlIGxhc3QgMzJLIHN0cmluZ3MuXG4gICAqIEFuIGluZGV4IGluIHRoaXMgYXJyYXkgaXMgdGh1cyBhIHdpbmRvdyBpbmRleCBtb2R1bG8gMzJLLlxuICAgKi9cblxuICB0aGlzLmhlYWQgPSBudWxsOyAgIC8qIEhlYWRzIG9mIHRoZSBoYXNoIGNoYWlucyBvciBOSUwuICovXG5cbiAgdGhpcy5pbnNfaCA9IDA7ICAgICAgIC8qIGhhc2ggaW5kZXggb2Ygc3RyaW5nIHRvIGJlIGluc2VydGVkICovXG4gIHRoaXMuaGFzaF9zaXplID0gMDsgICAvKiBudW1iZXIgb2YgZWxlbWVudHMgaW4gaGFzaCB0YWJsZSAqL1xuICB0aGlzLmhhc2hfYml0cyA9IDA7ICAgLyogbG9nMihoYXNoX3NpemUpICovXG4gIHRoaXMuaGFzaF9tYXNrID0gMDsgICAvKiBoYXNoX3NpemUtMSAqL1xuXG4gIHRoaXMuaGFzaF9zaGlmdCA9IDA7XG4gIC8qIE51bWJlciBvZiBiaXRzIGJ5IHdoaWNoIGluc19oIG11c3QgYmUgc2hpZnRlZCBhdCBlYWNoIGlucHV0XG4gICAqIHN0ZXAuIEl0IG11c3QgYmUgc3VjaCB0aGF0IGFmdGVyIE1JTl9NQVRDSCBzdGVwcywgdGhlIG9sZGVzdFxuICAgKiBieXRlIG5vIGxvbmdlciB0YWtlcyBwYXJ0IGluIHRoZSBoYXNoIGtleSwgdGhhdCBpczpcbiAgICogICBoYXNoX3NoaWZ0ICogTUlOX01BVENIID49IGhhc2hfYml0c1xuICAgKi9cblxuICB0aGlzLmJsb2NrX3N0YXJ0ID0gMDtcbiAgLyogV2luZG93IHBvc2l0aW9uIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIGN1cnJlbnQgb3V0cHV0IGJsb2NrLiBHZXRzXG4gICAqIG5lZ2F0aXZlIHdoZW4gdGhlIHdpbmRvdyBpcyBtb3ZlZCBiYWNrd2FyZHMuXG4gICAqL1xuXG4gIHRoaXMubWF0Y2hfbGVuZ3RoID0gMDsgICAgICAvKiBsZW5ndGggb2YgYmVzdCBtYXRjaCAqL1xuICB0aGlzLnByZXZfbWF0Y2ggPSAwOyAgICAgICAgLyogcHJldmlvdXMgbWF0Y2ggKi9cbiAgdGhpcy5tYXRjaF9hdmFpbGFibGUgPSAwOyAgIC8qIHNldCBpZiBwcmV2aW91cyBtYXRjaCBleGlzdHMgKi9cbiAgdGhpcy5zdHJzdGFydCA9IDA7ICAgICAgICAgIC8qIHN0YXJ0IG9mIHN0cmluZyB0byBpbnNlcnQgKi9cbiAgdGhpcy5tYXRjaF9zdGFydCA9IDA7ICAgICAgIC8qIHN0YXJ0IG9mIG1hdGNoaW5nIHN0cmluZyAqL1xuICB0aGlzLmxvb2thaGVhZCA9IDA7ICAgICAgICAgLyogbnVtYmVyIG9mIHZhbGlkIGJ5dGVzIGFoZWFkIGluIHdpbmRvdyAqL1xuXG4gIHRoaXMucHJldl9sZW5ndGggPSAwO1xuICAvKiBMZW5ndGggb2YgdGhlIGJlc3QgbWF0Y2ggYXQgcHJldmlvdXMgc3RlcC4gTWF0Y2hlcyBub3QgZ3JlYXRlciB0aGFuIHRoaXNcbiAgICogYXJlIGRpc2NhcmRlZC4gVGhpcyBpcyB1c2VkIGluIHRoZSBsYXp5IG1hdGNoIGV2YWx1YXRpb24uXG4gICAqL1xuXG4gIHRoaXMubWF4X2NoYWluX2xlbmd0aCA9IDA7XG4gIC8qIFRvIHNwZWVkIHVwIGRlZmxhdGlvbiwgaGFzaCBjaGFpbnMgYXJlIG5ldmVyIHNlYXJjaGVkIGJleW9uZCB0aGlzXG4gICAqIGxlbmd0aC4gIEEgaGlnaGVyIGxpbWl0IGltcHJvdmVzIGNvbXByZXNzaW9uIHJhdGlvIGJ1dCBkZWdyYWRlcyB0aGVcbiAgICogc3BlZWQuXG4gICAqL1xuXG4gIHRoaXMubWF4X2xhenlfbWF0Y2ggPSAwO1xuICAvKiBBdHRlbXB0IHRvIGZpbmQgYSBiZXR0ZXIgbWF0Y2ggb25seSB3aGVuIHRoZSBjdXJyZW50IG1hdGNoIGlzIHN0cmljdGx5XG4gICAqIHNtYWxsZXIgdGhhbiB0aGlzIHZhbHVlLiBUaGlzIG1lY2hhbmlzbSBpcyB1c2VkIG9ubHkgZm9yIGNvbXByZXNzaW9uXG4gICAqIGxldmVscyA+PSA0LlxuICAgKi9cbiAgLy8gVGhhdCdzIGFsaWFzIHRvIG1heF9sYXp5X21hdGNoLCBkb24ndCB1c2UgZGlyZWN0bHlcbiAgLy90aGlzLm1heF9pbnNlcnRfbGVuZ3RoID0gMDtcbiAgLyogSW5zZXJ0IG5ldyBzdHJpbmdzIGluIHRoZSBoYXNoIHRhYmxlIG9ubHkgaWYgdGhlIG1hdGNoIGxlbmd0aCBpcyBub3RcbiAgICogZ3JlYXRlciB0aGFuIHRoaXMgbGVuZ3RoLiBUaGlzIHNhdmVzIHRpbWUgYnV0IGRlZ3JhZGVzIGNvbXByZXNzaW9uLlxuICAgKiBtYXhfaW5zZXJ0X2xlbmd0aCBpcyB1c2VkIG9ubHkgZm9yIGNvbXByZXNzaW9uIGxldmVscyA8PSAzLlxuICAgKi9cblxuICB0aGlzLmxldmVsID0gMDsgICAgIC8qIGNvbXByZXNzaW9uIGxldmVsICgxLi45KSAqL1xuICB0aGlzLnN0cmF0ZWd5ID0gMDsgIC8qIGZhdm9yIG9yIGZvcmNlIEh1ZmZtYW4gY29kaW5nKi9cblxuICB0aGlzLmdvb2RfbWF0Y2ggPSAwO1xuICAvKiBVc2UgYSBmYXN0ZXIgc2VhcmNoIHdoZW4gdGhlIHByZXZpb3VzIG1hdGNoIGlzIGxvbmdlciB0aGFuIHRoaXMgKi9cblxuICB0aGlzLm5pY2VfbWF0Y2ggPSAwOyAvKiBTdG9wIHNlYXJjaGluZyB3aGVuIGN1cnJlbnQgbWF0Y2ggZXhjZWVkcyB0aGlzICovXG5cbiAgICAgICAgICAgICAgLyogdXNlZCBieSB0cmVlcy5jOiAqL1xuXG4gIC8qIERpZG4ndCB1c2UgY3RfZGF0YSB0eXBlZGVmIGJlbG93IHRvIHN1cHByZXNzIGNvbXBpbGVyIHdhcm5pbmcgKi9cblxuICAvLyBzdHJ1Y3QgY3RfZGF0YV9zIGR5bl9sdHJlZVtIRUFQX1NJWkVdOyAgIC8qIGxpdGVyYWwgYW5kIGxlbmd0aCB0cmVlICovXG4gIC8vIHN0cnVjdCBjdF9kYXRhX3MgZHluX2R0cmVlWzIqRF9DT0RFUysxXTsgLyogZGlzdGFuY2UgdHJlZSAqL1xuICAvLyBzdHJ1Y3QgY3RfZGF0YV9zIGJsX3RyZWVbMipCTF9DT0RFUysxXTsgIC8qIEh1ZmZtYW4gdHJlZSBmb3IgYml0IGxlbmd0aHMgKi9cblxuICAvLyBVc2UgZmxhdCBhcnJheSBvZiBET1VCTEUgc2l6ZSwgd2l0aCBpbnRlcmxlYXZlZCBmYXRhLFxuICAvLyBiZWNhdXNlIEpTIGRvZXMgbm90IHN1cHBvcnQgZWZmZWN0aXZlXG4gIHRoaXMuZHluX2x0cmVlICA9IG5ldyB1dGlscy5CdWYxNihIRUFQX1NJWkUgKiAyKTtcbiAgdGhpcy5keW5fZHRyZWUgID0gbmV3IHV0aWxzLkJ1ZjE2KCgyICogRF9DT0RFUyArIDEpICogMik7XG4gIHRoaXMuYmxfdHJlZSAgICA9IG5ldyB1dGlscy5CdWYxNigoMiAqIEJMX0NPREVTICsgMSkgKiAyKTtcbiAgemVybyh0aGlzLmR5bl9sdHJlZSk7XG4gIHplcm8odGhpcy5keW5fZHRyZWUpO1xuICB6ZXJvKHRoaXMuYmxfdHJlZSk7XG5cbiAgdGhpcy5sX2Rlc2MgICA9IG51bGw7ICAgICAgICAgLyogZGVzYy4gZm9yIGxpdGVyYWwgdHJlZSAqL1xuICB0aGlzLmRfZGVzYyAgID0gbnVsbDsgICAgICAgICAvKiBkZXNjLiBmb3IgZGlzdGFuY2UgdHJlZSAqL1xuICB0aGlzLmJsX2Rlc2MgID0gbnVsbDsgICAgICAgICAvKiBkZXNjLiBmb3IgYml0IGxlbmd0aCB0cmVlICovXG5cbiAgLy91c2ggYmxfY291bnRbTUFYX0JJVFMrMV07XG4gIHRoaXMuYmxfY291bnQgPSBuZXcgdXRpbHMuQnVmMTYoTUFYX0JJVFMgKyAxKTtcbiAgLyogbnVtYmVyIG9mIGNvZGVzIGF0IGVhY2ggYml0IGxlbmd0aCBmb3IgYW4gb3B0aW1hbCB0cmVlICovXG5cbiAgLy9pbnQgaGVhcFsyKkxfQ09ERVMrMV07ICAgICAgLyogaGVhcCB1c2VkIHRvIGJ1aWxkIHRoZSBIdWZmbWFuIHRyZWVzICovXG4gIHRoaXMuaGVhcCA9IG5ldyB1dGlscy5CdWYxNigyICogTF9DT0RFUyArIDEpOyAgLyogaGVhcCB1c2VkIHRvIGJ1aWxkIHRoZSBIdWZmbWFuIHRyZWVzICovXG4gIHplcm8odGhpcy5oZWFwKTtcblxuICB0aGlzLmhlYXBfbGVuID0gMDsgICAgICAgICAgICAgICAvKiBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGhlYXAgKi9cbiAgdGhpcy5oZWFwX21heCA9IDA7ICAgICAgICAgICAgICAgLyogZWxlbWVudCBvZiBsYXJnZXN0IGZyZXF1ZW5jeSAqL1xuICAvKiBUaGUgc29ucyBvZiBoZWFwW25dIGFyZSBoZWFwWzIqbl0gYW5kIGhlYXBbMipuKzFdLiBoZWFwWzBdIGlzIG5vdCB1c2VkLlxuICAgKiBUaGUgc2FtZSBoZWFwIGFycmF5IGlzIHVzZWQgdG8gYnVpbGQgYWxsIHRyZWVzLlxuICAgKi9cblxuICB0aGlzLmRlcHRoID0gbmV3IHV0aWxzLkJ1ZjE2KDIgKiBMX0NPREVTICsgMSk7IC8vdWNoIGRlcHRoWzIqTF9DT0RFUysxXTtcbiAgemVybyh0aGlzLmRlcHRoKTtcbiAgLyogRGVwdGggb2YgZWFjaCBzdWJ0cmVlIHVzZWQgYXMgdGllIGJyZWFrZXIgZm9yIHRyZWVzIG9mIGVxdWFsIGZyZXF1ZW5jeVxuICAgKi9cblxuICB0aGlzLmxfYnVmID0gMDsgICAgICAgICAgLyogYnVmZmVyIGluZGV4IGZvciBsaXRlcmFscyBvciBsZW5ndGhzICovXG5cbiAgdGhpcy5saXRfYnVmc2l6ZSA9IDA7XG4gIC8qIFNpemUgb2YgbWF0Y2ggYnVmZmVyIGZvciBsaXRlcmFscy9sZW5ndGhzLiAgVGhlcmUgYXJlIDQgcmVhc29ucyBmb3JcbiAgICogbGltaXRpbmcgbGl0X2J1ZnNpemUgdG8gNjRLOlxuICAgKiAgIC0gZnJlcXVlbmNpZXMgY2FuIGJlIGtlcHQgaW4gMTYgYml0IGNvdW50ZXJzXG4gICAqICAgLSBpZiBjb21wcmVzc2lvbiBpcyBub3Qgc3VjY2Vzc2Z1bCBmb3IgdGhlIGZpcnN0IGJsb2NrLCBhbGwgaW5wdXRcbiAgICogICAgIGRhdGEgaXMgc3RpbGwgaW4gdGhlIHdpbmRvdyBzbyB3ZSBjYW4gc3RpbGwgZW1pdCBhIHN0b3JlZCBibG9jayBldmVuXG4gICAqICAgICB3aGVuIGlucHV0IGNvbWVzIGZyb20gc3RhbmRhcmQgaW5wdXQuICAoVGhpcyBjYW4gYWxzbyBiZSBkb25lIGZvclxuICAgKiAgICAgYWxsIGJsb2NrcyBpZiBsaXRfYnVmc2l6ZSBpcyBub3QgZ3JlYXRlciB0aGFuIDMySy4pXG4gICAqICAgLSBpZiBjb21wcmVzc2lvbiBpcyBub3Qgc3VjY2Vzc2Z1bCBmb3IgYSBmaWxlIHNtYWxsZXIgdGhhbiA2NEssIHdlIGNhblxuICAgKiAgICAgZXZlbiBlbWl0IGEgc3RvcmVkIGZpbGUgaW5zdGVhZCBvZiBhIHN0b3JlZCBibG9jayAoc2F2aW5nIDUgYnl0ZXMpLlxuICAgKiAgICAgVGhpcyBpcyBhcHBsaWNhYmxlIG9ubHkgZm9yIHppcCAobm90IGd6aXAgb3IgemxpYikuXG4gICAqICAgLSBjcmVhdGluZyBuZXcgSHVmZm1hbiB0cmVlcyBsZXNzIGZyZXF1ZW50bHkgbWF5IG5vdCBwcm92aWRlIGZhc3RcbiAgICogICAgIGFkYXB0YXRpb24gdG8gY2hhbmdlcyBpbiB0aGUgaW5wdXQgZGF0YSBzdGF0aXN0aWNzLiAoVGFrZSBmb3JcbiAgICogICAgIGV4YW1wbGUgYSBiaW5hcnkgZmlsZSB3aXRoIHBvb3JseSBjb21wcmVzc2libGUgY29kZSBmb2xsb3dlZCBieVxuICAgKiAgICAgYSBoaWdobHkgY29tcHJlc3NpYmxlIHN0cmluZyB0YWJsZS4pIFNtYWxsZXIgYnVmZmVyIHNpemVzIGdpdmVcbiAgICogICAgIGZhc3QgYWRhcHRhdGlvbiBidXQgaGF2ZSBvZiBjb3Vyc2UgdGhlIG92ZXJoZWFkIG9mIHRyYW5zbWl0dGluZ1xuICAgKiAgICAgdHJlZXMgbW9yZSBmcmVxdWVudGx5LlxuICAgKiAgIC0gSSBjYW4ndCBjb3VudCBhYm92ZSA0XG4gICAqL1xuXG4gIHRoaXMubGFzdF9saXQgPSAwOyAgICAgIC8qIHJ1bm5pbmcgaW5kZXggaW4gbF9idWYgKi9cblxuICB0aGlzLmRfYnVmID0gMDtcbiAgLyogQnVmZmVyIGluZGV4IGZvciBkaXN0YW5jZXMuIFRvIHNpbXBsaWZ5IHRoZSBjb2RlLCBkX2J1ZiBhbmQgbF9idWYgaGF2ZVxuICAgKiB0aGUgc2FtZSBudW1iZXIgb2YgZWxlbWVudHMuIFRvIHVzZSBkaWZmZXJlbnQgbGVuZ3RocywgYW4gZXh0cmEgZmxhZ1xuICAgKiBhcnJheSB3b3VsZCBiZSBuZWNlc3NhcnkuXG4gICAqL1xuXG4gIHRoaXMub3B0X2xlbiA9IDA7ICAgICAgIC8qIGJpdCBsZW5ndGggb2YgY3VycmVudCBibG9jayB3aXRoIG9wdGltYWwgdHJlZXMgKi9cbiAgdGhpcy5zdGF0aWNfbGVuID0gMDsgICAgLyogYml0IGxlbmd0aCBvZiBjdXJyZW50IGJsb2NrIHdpdGggc3RhdGljIHRyZWVzICovXG4gIHRoaXMubWF0Y2hlcyA9IDA7ICAgICAgIC8qIG51bWJlciBvZiBzdHJpbmcgbWF0Y2hlcyBpbiBjdXJyZW50IGJsb2NrICovXG4gIHRoaXMuaW5zZXJ0ID0gMDsgICAgICAgIC8qIGJ5dGVzIGF0IGVuZCBvZiB3aW5kb3cgbGVmdCB0byBpbnNlcnQgKi9cblxuXG4gIHRoaXMuYmlfYnVmID0gMDtcbiAgLyogT3V0cHV0IGJ1ZmZlci4gYml0cyBhcmUgaW5zZXJ0ZWQgc3RhcnRpbmcgYXQgdGhlIGJvdHRvbSAobGVhc3RcbiAgICogc2lnbmlmaWNhbnQgYml0cykuXG4gICAqL1xuICB0aGlzLmJpX3ZhbGlkID0gMDtcbiAgLyogTnVtYmVyIG9mIHZhbGlkIGJpdHMgaW4gYmlfYnVmLiAgQWxsIGJpdHMgYWJvdmUgdGhlIGxhc3QgdmFsaWQgYml0XG4gICAqIGFyZSBhbHdheXMgemVyby5cbiAgICovXG5cbiAgLy8gVXNlZCBmb3Igd2luZG93IG1lbW9yeSBpbml0LiBXZSBzYWZlbHkgaWdub3JlIGl0IGZvciBKUy4gVGhhdCBtYWtlc1xuICAvLyBzZW5zZSBvbmx5IGZvciBwb2ludGVycyBhbmQgbWVtb3J5IGNoZWNrIHRvb2xzLlxuICAvL3RoaXMuaGlnaF93YXRlciA9IDA7XG4gIC8qIEhpZ2ggd2F0ZXIgbWFyayBvZmZzZXQgaW4gd2luZG93IGZvciBpbml0aWFsaXplZCBieXRlcyAtLSBieXRlcyBhYm92ZVxuICAgKiB0aGlzIGFyZSBzZXQgdG8gemVybyBpbiBvcmRlciB0byBhdm9pZCBtZW1vcnkgY2hlY2sgd2FybmluZ3Mgd2hlblxuICAgKiBsb25nZXN0IG1hdGNoIHJvdXRpbmVzIGFjY2VzcyBieXRlcyBwYXN0IHRoZSBpbnB1dC4gIFRoaXMgaXMgdGhlblxuICAgKiB1cGRhdGVkIHRvIHRoZSBuZXcgaGlnaCB3YXRlciBtYXJrLlxuICAgKi9cbn1cblxuXG5mdW5jdGlvbiBkZWZsYXRlUmVzZXRLZWVwKHN0cm0pIHtcbiAgdmFyIHM7XG5cbiAgaWYgKCFzdHJtIHx8ICFzdHJtLnN0YXRlKSB7XG4gICAgcmV0dXJuIGVycihzdHJtLCBaX1NUUkVBTV9FUlJPUik7XG4gIH1cblxuICBzdHJtLnRvdGFsX2luID0gc3RybS50b3RhbF9vdXQgPSAwO1xuICBzdHJtLmRhdGFfdHlwZSA9IFpfVU5LTk9XTjtcblxuICBzID0gc3RybS5zdGF0ZTtcbiAgcy5wZW5kaW5nID0gMDtcbiAgcy5wZW5kaW5nX291dCA9IDA7XG5cbiAgaWYgKHMud3JhcCA8IDApIHtcbiAgICBzLndyYXAgPSAtcy53cmFwO1xuICAgIC8qIHdhcyBtYWRlIG5lZ2F0aXZlIGJ5IGRlZmxhdGUoLi4uLCBaX0ZJTklTSCk7ICovXG4gIH1cbiAgcy5zdGF0dXMgPSAocy53cmFwID8gSU5JVF9TVEFURSA6IEJVU1lfU1RBVEUpO1xuICBzdHJtLmFkbGVyID0gKHMud3JhcCA9PT0gMikgP1xuICAgIDAgIC8vIGNyYzMyKDAsIFpfTlVMTCwgMClcbiAgOlxuICAgIDE7IC8vIGFkbGVyMzIoMCwgWl9OVUxMLCAwKVxuICBzLmxhc3RfZmx1c2ggPSBaX05PX0ZMVVNIO1xuICB0cmVlcy5fdHJfaW5pdChzKTtcbiAgcmV0dXJuIFpfT0s7XG59XG5cblxuZnVuY3Rpb24gZGVmbGF0ZVJlc2V0KHN0cm0pIHtcbiAgdmFyIHJldCA9IGRlZmxhdGVSZXNldEtlZXAoc3RybSk7XG4gIGlmIChyZXQgPT09IFpfT0spIHtcbiAgICBsbV9pbml0KHN0cm0uc3RhdGUpO1xuICB9XG4gIHJldHVybiByZXQ7XG59XG5cblxuZnVuY3Rpb24gZGVmbGF0ZVNldEhlYWRlcihzdHJtLCBoZWFkKSB7XG4gIGlmICghc3RybSB8fCAhc3RybS5zdGF0ZSkgeyByZXR1cm4gWl9TVFJFQU1fRVJST1I7IH1cbiAgaWYgKHN0cm0uc3RhdGUud3JhcCAhPT0gMikgeyByZXR1cm4gWl9TVFJFQU1fRVJST1I7IH1cbiAgc3RybS5zdGF0ZS5nemhlYWQgPSBoZWFkO1xuICByZXR1cm4gWl9PSztcbn1cblxuXG5mdW5jdGlvbiBkZWZsYXRlSW5pdDIoc3RybSwgbGV2ZWwsIG1ldGhvZCwgd2luZG93Qml0cywgbWVtTGV2ZWwsIHN0cmF0ZWd5KSB7XG4gIGlmICghc3RybSkgeyAvLyA9PT0gWl9OVUxMXG4gICAgcmV0dXJuIFpfU1RSRUFNX0VSUk9SO1xuICB9XG4gIHZhciB3cmFwID0gMTtcblxuICBpZiAobGV2ZWwgPT09IFpfREVGQVVMVF9DT01QUkVTU0lPTikge1xuICAgIGxldmVsID0gNjtcbiAgfVxuXG4gIGlmICh3aW5kb3dCaXRzIDwgMCkgeyAvKiBzdXBwcmVzcyB6bGliIHdyYXBwZXIgKi9cbiAgICB3cmFwID0gMDtcbiAgICB3aW5kb3dCaXRzID0gLXdpbmRvd0JpdHM7XG4gIH1cblxuICBlbHNlIGlmICh3aW5kb3dCaXRzID4gMTUpIHtcbiAgICB3cmFwID0gMjsgICAgICAgICAgIC8qIHdyaXRlIGd6aXAgd3JhcHBlciBpbnN0ZWFkICovXG4gICAgd2luZG93Qml0cyAtPSAxNjtcbiAgfVxuXG5cbiAgaWYgKG1lbUxldmVsIDwgMSB8fCBtZW1MZXZlbCA+IE1BWF9NRU1fTEVWRUwgfHwgbWV0aG9kICE9PSBaX0RFRkxBVEVEIHx8XG4gICAgd2luZG93Qml0cyA8IDggfHwgd2luZG93Qml0cyA+IDE1IHx8IGxldmVsIDwgMCB8fCBsZXZlbCA+IDkgfHxcbiAgICBzdHJhdGVneSA8IDAgfHwgc3RyYXRlZ3kgPiBaX0ZJWEVEKSB7XG4gICAgcmV0dXJuIGVycihzdHJtLCBaX1NUUkVBTV9FUlJPUik7XG4gIH1cblxuXG4gIGlmICh3aW5kb3dCaXRzID09PSA4KSB7XG4gICAgd2luZG93Qml0cyA9IDk7XG4gIH1cbiAgLyogdW50aWwgMjU2LWJ5dGUgd2luZG93IGJ1ZyBmaXhlZCAqL1xuXG4gIHZhciBzID0gbmV3IERlZmxhdGVTdGF0ZSgpO1xuXG4gIHN0cm0uc3RhdGUgPSBzO1xuICBzLnN0cm0gPSBzdHJtO1xuXG4gIHMud3JhcCA9IHdyYXA7XG4gIHMuZ3poZWFkID0gbnVsbDtcbiAgcy53X2JpdHMgPSB3aW5kb3dCaXRzO1xuICBzLndfc2l6ZSA9IDEgPDwgcy53X2JpdHM7XG4gIHMud19tYXNrID0gcy53X3NpemUgLSAxO1xuXG4gIHMuaGFzaF9iaXRzID0gbWVtTGV2ZWwgKyA3O1xuICBzLmhhc2hfc2l6ZSA9IDEgPDwgcy5oYXNoX2JpdHM7XG4gIHMuaGFzaF9tYXNrID0gcy5oYXNoX3NpemUgLSAxO1xuICBzLmhhc2hfc2hpZnQgPSB+figocy5oYXNoX2JpdHMgKyBNSU5fTUFUQ0ggLSAxKSAvIE1JTl9NQVRDSCk7XG5cbiAgcy53aW5kb3cgPSBuZXcgdXRpbHMuQnVmOChzLndfc2l6ZSAqIDIpO1xuICBzLmhlYWQgPSBuZXcgdXRpbHMuQnVmMTYocy5oYXNoX3NpemUpO1xuICBzLnByZXYgPSBuZXcgdXRpbHMuQnVmMTYocy53X3NpemUpO1xuXG4gIC8vIERvbid0IG5lZWQgbWVtIGluaXQgbWFnaWMgZm9yIEpTLlxuICAvL3MuaGlnaF93YXRlciA9IDA7ICAvKiBub3RoaW5nIHdyaXR0ZW4gdG8gcy0+d2luZG93IHlldCAqL1xuXG4gIHMubGl0X2J1ZnNpemUgPSAxIDw8IChtZW1MZXZlbCArIDYpOyAvKiAxNksgZWxlbWVudHMgYnkgZGVmYXVsdCAqL1xuXG4gIHMucGVuZGluZ19idWZfc2l6ZSA9IHMubGl0X2J1ZnNpemUgKiA0O1xuXG4gIC8vb3ZlcmxheSA9ICh1c2hmICopIFpBTExPQyhzdHJtLCBzLT5saXRfYnVmc2l6ZSwgc2l6ZW9mKHVzaCkrMik7XG4gIC8vcy0+cGVuZGluZ19idWYgPSAodWNoZiAqKSBvdmVybGF5O1xuICBzLnBlbmRpbmdfYnVmID0gbmV3IHV0aWxzLkJ1Zjgocy5wZW5kaW5nX2J1Zl9zaXplKTtcblxuICAvLyBJdCBpcyBvZmZzZXQgZnJvbSBgcy5wZW5kaW5nX2J1ZmAgKHNpemUgaXMgYHMubGl0X2J1ZnNpemUgKiAyYClcbiAgLy9zLT5kX2J1ZiA9IG92ZXJsYXkgKyBzLT5saXRfYnVmc2l6ZS9zaXplb2YodXNoKTtcbiAgcy5kX2J1ZiA9IDEgKiBzLmxpdF9idWZzaXplO1xuXG4gIC8vcy0+bF9idWYgPSBzLT5wZW5kaW5nX2J1ZiArICgxK3NpemVvZih1c2gpKSpzLT5saXRfYnVmc2l6ZTtcbiAgcy5sX2J1ZiA9ICgxICsgMikgKiBzLmxpdF9idWZzaXplO1xuXG4gIHMubGV2ZWwgPSBsZXZlbDtcbiAgcy5zdHJhdGVneSA9IHN0cmF0ZWd5O1xuICBzLm1ldGhvZCA9IG1ldGhvZDtcblxuICByZXR1cm4gZGVmbGF0ZVJlc2V0KHN0cm0pO1xufVxuXG5mdW5jdGlvbiBkZWZsYXRlSW5pdChzdHJtLCBsZXZlbCkge1xuICByZXR1cm4gZGVmbGF0ZUluaXQyKHN0cm0sIGxldmVsLCBaX0RFRkxBVEVELCBNQVhfV0JJVFMsIERFRl9NRU1fTEVWRUwsIFpfREVGQVVMVF9TVFJBVEVHWSk7XG59XG5cblxuZnVuY3Rpb24gZGVmbGF0ZShzdHJtLCBmbHVzaCkge1xuICB2YXIgb2xkX2ZsdXNoLCBzO1xuICB2YXIgYmVnLCB2YWw7IC8vIGZvciBnemlwIGhlYWRlciB3cml0ZSBvbmx5XG5cbiAgaWYgKCFzdHJtIHx8ICFzdHJtLnN0YXRlIHx8XG4gICAgZmx1c2ggPiBaX0JMT0NLIHx8IGZsdXNoIDwgMCkge1xuICAgIHJldHVybiBzdHJtID8gZXJyKHN0cm0sIFpfU1RSRUFNX0VSUk9SKSA6IFpfU1RSRUFNX0VSUk9SO1xuICB9XG5cbiAgcyA9IHN0cm0uc3RhdGU7XG5cbiAgaWYgKCFzdHJtLm91dHB1dCB8fFxuICAgICAgKCFzdHJtLmlucHV0ICYmIHN0cm0uYXZhaWxfaW4gIT09IDApIHx8XG4gICAgICAocy5zdGF0dXMgPT09IEZJTklTSF9TVEFURSAmJiBmbHVzaCAhPT0gWl9GSU5JU0gpKSB7XG4gICAgcmV0dXJuIGVycihzdHJtLCAoc3RybS5hdmFpbF9vdXQgPT09IDApID8gWl9CVUZfRVJST1IgOiBaX1NUUkVBTV9FUlJPUik7XG4gIH1cblxuICBzLnN0cm0gPSBzdHJtOyAvKiBqdXN0IGluIGNhc2UgKi9cbiAgb2xkX2ZsdXNoID0gcy5sYXN0X2ZsdXNoO1xuICBzLmxhc3RfZmx1c2ggPSBmbHVzaDtcblxuICAvKiBXcml0ZSB0aGUgaGVhZGVyICovXG4gIGlmIChzLnN0YXR1cyA9PT0gSU5JVF9TVEFURSkge1xuXG4gICAgaWYgKHMud3JhcCA9PT0gMikgeyAvLyBHWklQIGhlYWRlclxuICAgICAgc3RybS5hZGxlciA9IDA7ICAvL2NyYzMyKDBMLCBaX05VTEwsIDApO1xuICAgICAgcHV0X2J5dGUocywgMzEpO1xuICAgICAgcHV0X2J5dGUocywgMTM5KTtcbiAgICAgIHB1dF9ieXRlKHMsIDgpO1xuICAgICAgaWYgKCFzLmd6aGVhZCkgeyAvLyBzLT5nemhlYWQgPT0gWl9OVUxMXG4gICAgICAgIHB1dF9ieXRlKHMsIDApO1xuICAgICAgICBwdXRfYnl0ZShzLCAwKTtcbiAgICAgICAgcHV0X2J5dGUocywgMCk7XG4gICAgICAgIHB1dF9ieXRlKHMsIDApO1xuICAgICAgICBwdXRfYnl0ZShzLCAwKTtcbiAgICAgICAgcHV0X2J5dGUocywgcy5sZXZlbCA9PT0gOSA/IDIgOlxuICAgICAgICAgICAgICAgICAgICAocy5zdHJhdGVneSA+PSBaX0hVRkZNQU5fT05MWSB8fCBzLmxldmVsIDwgMiA/XG4gICAgICAgICAgICAgICAgICAgICA0IDogMCkpO1xuICAgICAgICBwdXRfYnl0ZShzLCBPU19DT0RFKTtcbiAgICAgICAgcy5zdGF0dXMgPSBCVVNZX1NUQVRFO1xuICAgICAgfVxuICAgICAgZWxzZSB7XG4gICAgICAgIHB1dF9ieXRlKHMsIChzLmd6aGVhZC50ZXh0ID8gMSA6IDApICtcbiAgICAgICAgICAgICAgICAgICAgKHMuZ3poZWFkLmhjcmMgPyAyIDogMCkgK1xuICAgICAgICAgICAgICAgICAgICAoIXMuZ3poZWFkLmV4dHJhID8gMCA6IDQpICtcbiAgICAgICAgICAgICAgICAgICAgKCFzLmd6aGVhZC5uYW1lID8gMCA6IDgpICtcbiAgICAgICAgICAgICAgICAgICAgKCFzLmd6aGVhZC5jb21tZW50ID8gMCA6IDE2KVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgIHB1dF9ieXRlKHMsIHMuZ3poZWFkLnRpbWUgJiAweGZmKTtcbiAgICAgICAgcHV0X2J5dGUocywgKHMuZ3poZWFkLnRpbWUgPj4gOCkgJiAweGZmKTtcbiAgICAgICAgcHV0X2J5dGUocywgKHMuZ3poZWFkLnRpbWUgPj4gMTYpICYgMHhmZik7XG4gICAgICAgIHB1dF9ieXRlKHMsIChzLmd6aGVhZC50aW1lID4+IDI0KSAmIDB4ZmYpO1xuICAgICAgICBwdXRfYnl0ZShzLCBzLmxldmVsID09PSA5ID8gMiA6XG4gICAgICAgICAgICAgICAgICAgIChzLnN0cmF0ZWd5ID49IFpfSFVGRk1BTl9PTkxZIHx8IHMubGV2ZWwgPCAyID9cbiAgICAgICAgICAgICAgICAgICAgIDQgOiAwKSk7XG4gICAgICAgIHB1dF9ieXRlKHMsIHMuZ3poZWFkLm9zICYgMHhmZik7XG4gICAgICAgIGlmIChzLmd6aGVhZC5leHRyYSAmJiBzLmd6aGVhZC5leHRyYS5sZW5ndGgpIHtcbiAgICAgICAgICBwdXRfYnl0ZShzLCBzLmd6aGVhZC5leHRyYS5sZW5ndGggJiAweGZmKTtcbiAgICAgICAgICBwdXRfYnl0ZShzLCAocy5nemhlYWQuZXh0cmEubGVuZ3RoID4+IDgpICYgMHhmZik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHMuZ3poZWFkLmhjcmMpIHtcbiAgICAgICAgICBzdHJtLmFkbGVyID0gY3JjMzIoc3RybS5hZGxlciwgcy5wZW5kaW5nX2J1Ziwgcy5wZW5kaW5nLCAwKTtcbiAgICAgICAgfVxuICAgICAgICBzLmd6aW5kZXggPSAwO1xuICAgICAgICBzLnN0YXR1cyA9IEVYVFJBX1NUQVRFO1xuICAgICAgfVxuICAgIH1cbiAgICBlbHNlIC8vIERFRkxBVEUgaGVhZGVyXG4gICAge1xuICAgICAgdmFyIGhlYWRlciA9IChaX0RFRkxBVEVEICsgKChzLndfYml0cyAtIDgpIDw8IDQpKSA8PCA4O1xuICAgICAgdmFyIGxldmVsX2ZsYWdzID0gLTE7XG5cbiAgICAgIGlmIChzLnN0cmF0ZWd5ID49IFpfSFVGRk1BTl9PTkxZIHx8IHMubGV2ZWwgPCAyKSB7XG4gICAgICAgIGxldmVsX2ZsYWdzID0gMDtcbiAgICAgIH0gZWxzZSBpZiAocy5sZXZlbCA8IDYpIHtcbiAgICAgICAgbGV2ZWxfZmxhZ3MgPSAxO1xuICAgICAgfSBlbHNlIGlmIChzLmxldmVsID09PSA2KSB7XG4gICAgICAgIGxldmVsX2ZsYWdzID0gMjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGxldmVsX2ZsYWdzID0gMztcbiAgICAgIH1cbiAgICAgIGhlYWRlciB8PSAobGV2ZWxfZmxhZ3MgPDwgNik7XG4gICAgICBpZiAocy5zdHJzdGFydCAhPT0gMCkgeyBoZWFkZXIgfD0gUFJFU0VUX0RJQ1Q7IH1cbiAgICAgIGhlYWRlciArPSAzMSAtIChoZWFkZXIgJSAzMSk7XG5cbiAgICAgIHMuc3RhdHVzID0gQlVTWV9TVEFURTtcbiAgICAgIHB1dFNob3J0TVNCKHMsIGhlYWRlcik7XG5cbiAgICAgIC8qIFNhdmUgdGhlIGFkbGVyMzIgb2YgdGhlIHByZXNldCBkaWN0aW9uYXJ5OiAqL1xuICAgICAgaWYgKHMuc3Ryc3RhcnQgIT09IDApIHtcbiAgICAgICAgcHV0U2hvcnRNU0Iocywgc3RybS5hZGxlciA+Pj4gMTYpO1xuICAgICAgICBwdXRTaG9ydE1TQihzLCBzdHJtLmFkbGVyICYgMHhmZmZmKTtcbiAgICAgIH1cbiAgICAgIHN0cm0uYWRsZXIgPSAxOyAvLyBhZGxlcjMyKDBMLCBaX05VTEwsIDApO1xuICAgIH1cbiAgfVxuXG4vLyNpZmRlZiBHWklQXG4gIGlmIChzLnN0YXR1cyA9PT0gRVhUUkFfU1RBVEUpIHtcbiAgICBpZiAocy5nemhlYWQuZXh0cmEvKiAhPSBaX05VTEwqLykge1xuICAgICAgYmVnID0gcy5wZW5kaW5nOyAgLyogc3RhcnQgb2YgYnl0ZXMgdG8gdXBkYXRlIGNyYyAqL1xuXG4gICAgICB3aGlsZSAocy5nemluZGV4IDwgKHMuZ3poZWFkLmV4dHJhLmxlbmd0aCAmIDB4ZmZmZikpIHtcbiAgICAgICAgaWYgKHMucGVuZGluZyA9PT0gcy5wZW5kaW5nX2J1Zl9zaXplKSB7XG4gICAgICAgICAgaWYgKHMuZ3poZWFkLmhjcmMgJiYgcy5wZW5kaW5nID4gYmVnKSB7XG4gICAgICAgICAgICBzdHJtLmFkbGVyID0gY3JjMzIoc3RybS5hZGxlciwgcy5wZW5kaW5nX2J1Ziwgcy5wZW5kaW5nIC0gYmVnLCBiZWcpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBmbHVzaF9wZW5kaW5nKHN0cm0pO1xuICAgICAgICAgIGJlZyA9IHMucGVuZGluZztcbiAgICAgICAgICBpZiAocy5wZW5kaW5nID09PSBzLnBlbmRpbmdfYnVmX3NpemUpIHtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBwdXRfYnl0ZShzLCBzLmd6aGVhZC5leHRyYVtzLmd6aW5kZXhdICYgMHhmZik7XG4gICAgICAgIHMuZ3ppbmRleCsrO1xuICAgICAgfVxuICAgICAgaWYgKHMuZ3poZWFkLmhjcmMgJiYgcy5wZW5kaW5nID4gYmVnKSB7XG4gICAgICAgIHN0cm0uYWRsZXIgPSBjcmMzMihzdHJtLmFkbGVyLCBzLnBlbmRpbmdfYnVmLCBzLnBlbmRpbmcgLSBiZWcsIGJlZyk7XG4gICAgICB9XG4gICAgICBpZiAocy5nemluZGV4ID09PSBzLmd6aGVhZC5leHRyYS5sZW5ndGgpIHtcbiAgICAgICAgcy5nemluZGV4ID0gMDtcbiAgICAgICAgcy5zdGF0dXMgPSBOQU1FX1NUQVRFO1xuICAgICAgfVxuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIHMuc3RhdHVzID0gTkFNRV9TVEFURTtcbiAgICB9XG4gIH1cbiAgaWYgKHMuc3RhdHVzID09PSBOQU1FX1NUQVRFKSB7XG4gICAgaWYgKHMuZ3poZWFkLm5hbWUvKiAhPSBaX05VTEwqLykge1xuICAgICAgYmVnID0gcy5wZW5kaW5nOyAgLyogc3RhcnQgb2YgYnl0ZXMgdG8gdXBkYXRlIGNyYyAqL1xuICAgICAgLy9pbnQgdmFsO1xuXG4gICAgICBkbyB7XG4gICAgICAgIGlmIChzLnBlbmRpbmcgPT09IHMucGVuZGluZ19idWZfc2l6ZSkge1xuICAgICAgICAgIGlmIChzLmd6aGVhZC5oY3JjICYmIHMucGVuZGluZyA+IGJlZykge1xuICAgICAgICAgICAgc3RybS5hZGxlciA9IGNyYzMyKHN0cm0uYWRsZXIsIHMucGVuZGluZ19idWYsIHMucGVuZGluZyAtIGJlZywgYmVnKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgZmx1c2hfcGVuZGluZyhzdHJtKTtcbiAgICAgICAgICBiZWcgPSBzLnBlbmRpbmc7XG4gICAgICAgICAgaWYgKHMucGVuZGluZyA9PT0gcy5wZW5kaW5nX2J1Zl9zaXplKSB7XG4gICAgICAgICAgICB2YWwgPSAxO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIEpTIHNwZWNpZmljOiBsaXR0bGUgbWFnaWMgdG8gYWRkIHplcm8gdGVybWluYXRvciB0byBlbmQgb2Ygc3RyaW5nXG4gICAgICAgIGlmIChzLmd6aW5kZXggPCBzLmd6aGVhZC5uYW1lLmxlbmd0aCkge1xuICAgICAgICAgIHZhbCA9IHMuZ3poZWFkLm5hbWUuY2hhckNvZGVBdChzLmd6aW5kZXgrKykgJiAweGZmO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHZhbCA9IDA7XG4gICAgICAgIH1cbiAgICAgICAgcHV0X2J5dGUocywgdmFsKTtcbiAgICAgIH0gd2hpbGUgKHZhbCAhPT0gMCk7XG5cbiAgICAgIGlmIChzLmd6aGVhZC5oY3JjICYmIHMucGVuZGluZyA+IGJlZykge1xuICAgICAgICBzdHJtLmFkbGVyID0gY3JjMzIoc3RybS5hZGxlciwgcy5wZW5kaW5nX2J1Ziwgcy5wZW5kaW5nIC0gYmVnLCBiZWcpO1xuICAgICAgfVxuICAgICAgaWYgKHZhbCA9PT0gMCkge1xuICAgICAgICBzLmd6aW5kZXggPSAwO1xuICAgICAgICBzLnN0YXR1cyA9IENPTU1FTlRfU1RBVEU7XG4gICAgICB9XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgcy5zdGF0dXMgPSBDT01NRU5UX1NUQVRFO1xuICAgIH1cbiAgfVxuICBpZiAocy5zdGF0dXMgPT09IENPTU1FTlRfU1RBVEUpIHtcbiAgICBpZiAocy5nemhlYWQuY29tbWVudC8qICE9IFpfTlVMTCovKSB7XG4gICAgICBiZWcgPSBzLnBlbmRpbmc7ICAvKiBzdGFydCBvZiBieXRlcyB0byB1cGRhdGUgY3JjICovXG4gICAgICAvL2ludCB2YWw7XG5cbiAgICAgIGRvIHtcbiAgICAgICAgaWYgKHMucGVuZGluZyA9PT0gcy5wZW5kaW5nX2J1Zl9zaXplKSB7XG4gICAgICAgICAgaWYgKHMuZ3poZWFkLmhjcmMgJiYgcy5wZW5kaW5nID4gYmVnKSB7XG4gICAgICAgICAgICBzdHJtLmFkbGVyID0gY3JjMzIoc3RybS5hZGxlciwgcy5wZW5kaW5nX2J1Ziwgcy5wZW5kaW5nIC0gYmVnLCBiZWcpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBmbHVzaF9wZW5kaW5nKHN0cm0pO1xuICAgICAgICAgIGJlZyA9IHMucGVuZGluZztcbiAgICAgICAgICBpZiAocy5wZW5kaW5nID09PSBzLnBlbmRpbmdfYnVmX3NpemUpIHtcbiAgICAgICAgICAgIHZhbCA9IDE7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gSlMgc3BlY2lmaWM6IGxpdHRsZSBtYWdpYyB0byBhZGQgemVybyB0ZXJtaW5hdG9yIHRvIGVuZCBvZiBzdHJpbmdcbiAgICAgICAgaWYgKHMuZ3ppbmRleCA8IHMuZ3poZWFkLmNvbW1lbnQubGVuZ3RoKSB7XG4gICAgICAgICAgdmFsID0gcy5nemhlYWQuY29tbWVudC5jaGFyQ29kZUF0KHMuZ3ppbmRleCsrKSAmIDB4ZmY7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdmFsID0gMDtcbiAgICAgICAgfVxuICAgICAgICBwdXRfYnl0ZShzLCB2YWwpO1xuICAgICAgfSB3aGlsZSAodmFsICE9PSAwKTtcblxuICAgICAgaWYgKHMuZ3poZWFkLmhjcmMgJiYgcy5wZW5kaW5nID4gYmVnKSB7XG4gICAgICAgIHN0cm0uYWRsZXIgPSBjcmMzMihzdHJtLmFkbGVyLCBzLnBlbmRpbmdfYnVmLCBzLnBlbmRpbmcgLSBiZWcsIGJlZyk7XG4gICAgICB9XG4gICAgICBpZiAodmFsID09PSAwKSB7XG4gICAgICAgIHMuc3RhdHVzID0gSENSQ19TVEFURTtcbiAgICAgIH1cbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICBzLnN0YXR1cyA9IEhDUkNfU1RBVEU7XG4gICAgfVxuICB9XG4gIGlmIChzLnN0YXR1cyA9PT0gSENSQ19TVEFURSkge1xuICAgIGlmIChzLmd6aGVhZC5oY3JjKSB7XG4gICAgICBpZiAocy5wZW5kaW5nICsgMiA+IHMucGVuZGluZ19idWZfc2l6ZSkge1xuICAgICAgICBmbHVzaF9wZW5kaW5nKHN0cm0pO1xuICAgICAgfVxuICAgICAgaWYgKHMucGVuZGluZyArIDIgPD0gcy5wZW5kaW5nX2J1Zl9zaXplKSB7XG4gICAgICAgIHB1dF9ieXRlKHMsIHN0cm0uYWRsZXIgJiAweGZmKTtcbiAgICAgICAgcHV0X2J5dGUocywgKHN0cm0uYWRsZXIgPj4gOCkgJiAweGZmKTtcbiAgICAgICAgc3RybS5hZGxlciA9IDA7IC8vY3JjMzIoMEwsIFpfTlVMTCwgMCk7XG4gICAgICAgIHMuc3RhdHVzID0gQlVTWV9TVEFURTtcbiAgICAgIH1cbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICBzLnN0YXR1cyA9IEJVU1lfU1RBVEU7XG4gICAgfVxuICB9XG4vLyNlbmRpZlxuXG4gIC8qIEZsdXNoIGFzIG11Y2ggcGVuZGluZyBvdXRwdXQgYXMgcG9zc2libGUgKi9cbiAgaWYgKHMucGVuZGluZyAhPT0gMCkge1xuICAgIGZsdXNoX3BlbmRpbmcoc3RybSk7XG4gICAgaWYgKHN0cm0uYXZhaWxfb3V0ID09PSAwKSB7XG4gICAgICAvKiBTaW5jZSBhdmFpbF9vdXQgaXMgMCwgZGVmbGF0ZSB3aWxsIGJlIGNhbGxlZCBhZ2FpbiB3aXRoXG4gICAgICAgKiBtb3JlIG91dHB1dCBzcGFjZSwgYnV0IHBvc3NpYmx5IHdpdGggYm90aCBwZW5kaW5nIGFuZFxuICAgICAgICogYXZhaWxfaW4gZXF1YWwgdG8gemVyby4gVGhlcmUgd29uJ3QgYmUgYW55dGhpbmcgdG8gZG8sXG4gICAgICAgKiBidXQgdGhpcyBpcyBub3QgYW4gZXJyb3Igc2l0dWF0aW9uIHNvIG1ha2Ugc3VyZSB3ZVxuICAgICAgICogcmV0dXJuIE9LIGluc3RlYWQgb2YgQlVGX0VSUk9SIGF0IG5leHQgY2FsbCBvZiBkZWZsYXRlOlxuICAgICAgICovXG4gICAgICBzLmxhc3RfZmx1c2ggPSAtMTtcbiAgICAgIHJldHVybiBaX09LO1xuICAgIH1cblxuICAgIC8qIE1ha2Ugc3VyZSB0aGVyZSBpcyBzb21ldGhpbmcgdG8gZG8gYW5kIGF2b2lkIGR1cGxpY2F0ZSBjb25zZWN1dGl2ZVxuICAgICAqIGZsdXNoZXMuIEZvciByZXBlYXRlZCBhbmQgdXNlbGVzcyBjYWxscyB3aXRoIFpfRklOSVNILCB3ZSBrZWVwXG4gICAgICogcmV0dXJuaW5nIFpfU1RSRUFNX0VORCBpbnN0ZWFkIG9mIFpfQlVGX0VSUk9SLlxuICAgICAqL1xuICB9IGVsc2UgaWYgKHN0cm0uYXZhaWxfaW4gPT09IDAgJiYgcmFuayhmbHVzaCkgPD0gcmFuayhvbGRfZmx1c2gpICYmXG4gICAgZmx1c2ggIT09IFpfRklOSVNIKSB7XG4gICAgcmV0dXJuIGVycihzdHJtLCBaX0JVRl9FUlJPUik7XG4gIH1cblxuICAvKiBVc2VyIG11c3Qgbm90IHByb3ZpZGUgbW9yZSBpbnB1dCBhZnRlciB0aGUgZmlyc3QgRklOSVNIOiAqL1xuICBpZiAocy5zdGF0dXMgPT09IEZJTklTSF9TVEFURSAmJiBzdHJtLmF2YWlsX2luICE9PSAwKSB7XG4gICAgcmV0dXJuIGVycihzdHJtLCBaX0JVRl9FUlJPUik7XG4gIH1cblxuICAvKiBTdGFydCBhIG5ldyBibG9jayBvciBjb250aW51ZSB0aGUgY3VycmVudCBvbmUuXG4gICAqL1xuICBpZiAoc3RybS5hdmFpbF9pbiAhPT0gMCB8fCBzLmxvb2thaGVhZCAhPT0gMCB8fFxuICAgIChmbHVzaCAhPT0gWl9OT19GTFVTSCAmJiBzLnN0YXR1cyAhPT0gRklOSVNIX1NUQVRFKSkge1xuICAgIHZhciBic3RhdGUgPSAocy5zdHJhdGVneSA9PT0gWl9IVUZGTUFOX09OTFkpID8gZGVmbGF0ZV9odWZmKHMsIGZsdXNoKSA6XG4gICAgICAocy5zdHJhdGVneSA9PT0gWl9STEUgPyBkZWZsYXRlX3JsZShzLCBmbHVzaCkgOlxuICAgICAgICBjb25maWd1cmF0aW9uX3RhYmxlW3MubGV2ZWxdLmZ1bmMocywgZmx1c2gpKTtcblxuICAgIGlmIChic3RhdGUgPT09IEJTX0ZJTklTSF9TVEFSVEVEIHx8IGJzdGF0ZSA9PT0gQlNfRklOSVNIX0RPTkUpIHtcbiAgICAgIHMuc3RhdHVzID0gRklOSVNIX1NUQVRFO1xuICAgIH1cbiAgICBpZiAoYnN0YXRlID09PSBCU19ORUVEX01PUkUgfHwgYnN0YXRlID09PSBCU19GSU5JU0hfU1RBUlRFRCkge1xuICAgICAgaWYgKHN0cm0uYXZhaWxfb3V0ID09PSAwKSB7XG4gICAgICAgIHMubGFzdF9mbHVzaCA9IC0xO1xuICAgICAgICAvKiBhdm9pZCBCVUZfRVJST1IgbmV4dCBjYWxsLCBzZWUgYWJvdmUgKi9cbiAgICAgIH1cbiAgICAgIHJldHVybiBaX09LO1xuICAgICAgLyogSWYgZmx1c2ggIT0gWl9OT19GTFVTSCAmJiBhdmFpbF9vdXQgPT0gMCwgdGhlIG5leHQgY2FsbFxuICAgICAgICogb2YgZGVmbGF0ZSBzaG91bGQgdXNlIHRoZSBzYW1lIGZsdXNoIHBhcmFtZXRlciB0byBtYWtlIHN1cmVcbiAgICAgICAqIHRoYXQgdGhlIGZsdXNoIGlzIGNvbXBsZXRlLiBTbyB3ZSBkb24ndCBoYXZlIHRvIG91dHB1dCBhblxuICAgICAgICogZW1wdHkgYmxvY2sgaGVyZSwgdGhpcyB3aWxsIGJlIGRvbmUgYXQgbmV4dCBjYWxsLiBUaGlzIGFsc29cbiAgICAgICAqIGVuc3VyZXMgdGhhdCBmb3IgYSB2ZXJ5IHNtYWxsIG91dHB1dCBidWZmZXIsIHdlIGVtaXQgYXQgbW9zdFxuICAgICAgICogb25lIGVtcHR5IGJsb2NrLlxuICAgICAgICovXG4gICAgfVxuICAgIGlmIChic3RhdGUgPT09IEJTX0JMT0NLX0RPTkUpIHtcbiAgICAgIGlmIChmbHVzaCA9PT0gWl9QQVJUSUFMX0ZMVVNIKSB7XG4gICAgICAgIHRyZWVzLl90cl9hbGlnbihzKTtcbiAgICAgIH1cbiAgICAgIGVsc2UgaWYgKGZsdXNoICE9PSBaX0JMT0NLKSB7IC8qIEZVTExfRkxVU0ggb3IgU1lOQ19GTFVTSCAqL1xuXG4gICAgICAgIHRyZWVzLl90cl9zdG9yZWRfYmxvY2socywgMCwgMCwgZmFsc2UpO1xuICAgICAgICAvKiBGb3IgYSBmdWxsIGZsdXNoLCB0aGlzIGVtcHR5IGJsb2NrIHdpbGwgYmUgcmVjb2duaXplZFxuICAgICAgICAgKiBhcyBhIHNwZWNpYWwgbWFya2VyIGJ5IGluZmxhdGVfc3luYygpLlxuICAgICAgICAgKi9cbiAgICAgICAgaWYgKGZsdXNoID09PSBaX0ZVTExfRkxVU0gpIHtcbiAgICAgICAgICAvKioqIENMRUFSX0hBU0gocyk7ICoqKi8gICAgICAgICAgICAgLyogZm9yZ2V0IGhpc3RvcnkgKi9cbiAgICAgICAgICB6ZXJvKHMuaGVhZCk7IC8vIEZpbGwgd2l0aCBOSUwgKD0gMCk7XG5cbiAgICAgICAgICBpZiAocy5sb29rYWhlYWQgPT09IDApIHtcbiAgICAgICAgICAgIHMuc3Ryc3RhcnQgPSAwO1xuICAgICAgICAgICAgcy5ibG9ja19zdGFydCA9IDA7XG4gICAgICAgICAgICBzLmluc2VydCA9IDA7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBmbHVzaF9wZW5kaW5nKHN0cm0pO1xuICAgICAgaWYgKHN0cm0uYXZhaWxfb3V0ID09PSAwKSB7XG4gICAgICAgIHMubGFzdF9mbHVzaCA9IC0xOyAvKiBhdm9pZCBCVUZfRVJST1IgYXQgbmV4dCBjYWxsLCBzZWUgYWJvdmUgKi9cbiAgICAgICAgcmV0dXJuIFpfT0s7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIC8vQXNzZXJ0KHN0cm0tPmF2YWlsX291dCA+IDAsIFwiYnVnMlwiKTtcbiAgLy9pZiAoc3RybS5hdmFpbF9vdXQgPD0gMCkgeyB0aHJvdyBuZXcgRXJyb3IoXCJidWcyXCIpO31cblxuICBpZiAoZmx1c2ggIT09IFpfRklOSVNIKSB7IHJldHVybiBaX09LOyB9XG4gIGlmIChzLndyYXAgPD0gMCkgeyByZXR1cm4gWl9TVFJFQU1fRU5EOyB9XG5cbiAgLyogV3JpdGUgdGhlIHRyYWlsZXIgKi9cbiAgaWYgKHMud3JhcCA9PT0gMikge1xuICAgIHB1dF9ieXRlKHMsIHN0cm0uYWRsZXIgJiAweGZmKTtcbiAgICBwdXRfYnl0ZShzLCAoc3RybS5hZGxlciA+PiA4KSAmIDB4ZmYpO1xuICAgIHB1dF9ieXRlKHMsIChzdHJtLmFkbGVyID4+IDE2KSAmIDB4ZmYpO1xuICAgIHB1dF9ieXRlKHMsIChzdHJtLmFkbGVyID4+IDI0KSAmIDB4ZmYpO1xuICAgIHB1dF9ieXRlKHMsIHN0cm0udG90YWxfaW4gJiAweGZmKTtcbiAgICBwdXRfYnl0ZShzLCAoc3RybS50b3RhbF9pbiA+PiA4KSAmIDB4ZmYpO1xuICAgIHB1dF9ieXRlKHMsIChzdHJtLnRvdGFsX2luID4+IDE2KSAmIDB4ZmYpO1xuICAgIHB1dF9ieXRlKHMsIChzdHJtLnRvdGFsX2luID4+IDI0KSAmIDB4ZmYpO1xuICB9XG4gIGVsc2VcbiAge1xuICAgIHB1dFNob3J0TVNCKHMsIHN0cm0uYWRsZXIgPj4+IDE2KTtcbiAgICBwdXRTaG9ydE1TQihzLCBzdHJtLmFkbGVyICYgMHhmZmZmKTtcbiAgfVxuXG4gIGZsdXNoX3BlbmRpbmcoc3RybSk7XG4gIC8qIElmIGF2YWlsX291dCBpcyB6ZXJvLCB0aGUgYXBwbGljYXRpb24gd2lsbCBjYWxsIGRlZmxhdGUgYWdhaW5cbiAgICogdG8gZmx1c2ggdGhlIHJlc3QuXG4gICAqL1xuICBpZiAocy53cmFwID4gMCkgeyBzLndyYXAgPSAtcy53cmFwOyB9XG4gIC8qIHdyaXRlIHRoZSB0cmFpbGVyIG9ubHkgb25jZSEgKi9cbiAgcmV0dXJuIHMucGVuZGluZyAhPT0gMCA/IFpfT0sgOiBaX1NUUkVBTV9FTkQ7XG59XG5cbmZ1bmN0aW9uIGRlZmxhdGVFbmQoc3RybSkge1xuICB2YXIgc3RhdHVzO1xuXG4gIGlmICghc3RybS8qPT0gWl9OVUxMKi8gfHwgIXN0cm0uc3RhdGUvKj09IFpfTlVMTCovKSB7XG4gICAgcmV0dXJuIFpfU1RSRUFNX0VSUk9SO1xuICB9XG5cbiAgc3RhdHVzID0gc3RybS5zdGF0ZS5zdGF0dXM7XG4gIGlmIChzdGF0dXMgIT09IElOSVRfU1RBVEUgJiZcbiAgICBzdGF0dXMgIT09IEVYVFJBX1NUQVRFICYmXG4gICAgc3RhdHVzICE9PSBOQU1FX1NUQVRFICYmXG4gICAgc3RhdHVzICE9PSBDT01NRU5UX1NUQVRFICYmXG4gICAgc3RhdHVzICE9PSBIQ1JDX1NUQVRFICYmXG4gICAgc3RhdHVzICE9PSBCVVNZX1NUQVRFICYmXG4gICAgc3RhdHVzICE9PSBGSU5JU0hfU1RBVEVcbiAgKSB7XG4gICAgcmV0dXJuIGVycihzdHJtLCBaX1NUUkVBTV9FUlJPUik7XG4gIH1cblxuICBzdHJtLnN0YXRlID0gbnVsbDtcblxuICByZXR1cm4gc3RhdHVzID09PSBCVVNZX1NUQVRFID8gZXJyKHN0cm0sIFpfREFUQV9FUlJPUikgOiBaX09LO1xufVxuXG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIEluaXRpYWxpemVzIHRoZSBjb21wcmVzc2lvbiBkaWN0aW9uYXJ5IGZyb20gdGhlIGdpdmVuIGJ5dGVcbiAqIHNlcXVlbmNlIHdpdGhvdXQgcHJvZHVjaW5nIGFueSBjb21wcmVzc2VkIG91dHB1dC5cbiAqL1xuZnVuY3Rpb24gZGVmbGF0ZVNldERpY3Rpb25hcnkoc3RybSwgZGljdGlvbmFyeSkge1xuICB2YXIgZGljdExlbmd0aCA9IGRpY3Rpb25hcnkubGVuZ3RoO1xuXG4gIHZhciBzO1xuICB2YXIgc3RyLCBuO1xuICB2YXIgd3JhcDtcbiAgdmFyIGF2YWlsO1xuICB2YXIgbmV4dDtcbiAgdmFyIGlucHV0O1xuICB2YXIgdG1wRGljdDtcblxuICBpZiAoIXN0cm0vKj09IFpfTlVMTCovIHx8ICFzdHJtLnN0YXRlLyo9PSBaX05VTEwqLykge1xuICAgIHJldHVybiBaX1NUUkVBTV9FUlJPUjtcbiAgfVxuXG4gIHMgPSBzdHJtLnN0YXRlO1xuICB3cmFwID0gcy53cmFwO1xuXG4gIGlmICh3cmFwID09PSAyIHx8ICh3cmFwID09PSAxICYmIHMuc3RhdHVzICE9PSBJTklUX1NUQVRFKSB8fCBzLmxvb2thaGVhZCkge1xuICAgIHJldHVybiBaX1NUUkVBTV9FUlJPUjtcbiAgfVxuXG4gIC8qIHdoZW4gdXNpbmcgemxpYiB3cmFwcGVycywgY29tcHV0ZSBBZGxlci0zMiBmb3IgcHJvdmlkZWQgZGljdGlvbmFyeSAqL1xuICBpZiAod3JhcCA9PT0gMSkge1xuICAgIC8qIGFkbGVyMzIoc3RybS0+YWRsZXIsIGRpY3Rpb25hcnksIGRpY3RMZW5ndGgpOyAqL1xuICAgIHN0cm0uYWRsZXIgPSBhZGxlcjMyKHN0cm0uYWRsZXIsIGRpY3Rpb25hcnksIGRpY3RMZW5ndGgsIDApO1xuICB9XG5cbiAgcy53cmFwID0gMDsgICAvKiBhdm9pZCBjb21wdXRpbmcgQWRsZXItMzIgaW4gcmVhZF9idWYgKi9cblxuICAvKiBpZiBkaWN0aW9uYXJ5IHdvdWxkIGZpbGwgd2luZG93LCBqdXN0IHJlcGxhY2UgdGhlIGhpc3RvcnkgKi9cbiAgaWYgKGRpY3RMZW5ndGggPj0gcy53X3NpemUpIHtcbiAgICBpZiAod3JhcCA9PT0gMCkgeyAgICAgICAgICAgIC8qIGFscmVhZHkgZW1wdHkgb3RoZXJ3aXNlICovXG4gICAgICAvKioqIENMRUFSX0hBU0gocyk7ICoqKi9cbiAgICAgIHplcm8ocy5oZWFkKTsgLy8gRmlsbCB3aXRoIE5JTCAoPSAwKTtcbiAgICAgIHMuc3Ryc3RhcnQgPSAwO1xuICAgICAgcy5ibG9ja19zdGFydCA9IDA7XG4gICAgICBzLmluc2VydCA9IDA7XG4gICAgfVxuICAgIC8qIHVzZSB0aGUgdGFpbCAqL1xuICAgIC8vIGRpY3Rpb25hcnkgPSBkaWN0aW9uYXJ5LnNsaWNlKGRpY3RMZW5ndGggLSBzLndfc2l6ZSk7XG4gICAgdG1wRGljdCA9IG5ldyB1dGlscy5CdWY4KHMud19zaXplKTtcbiAgICB1dGlscy5hcnJheVNldCh0bXBEaWN0LCBkaWN0aW9uYXJ5LCBkaWN0TGVuZ3RoIC0gcy53X3NpemUsIHMud19zaXplLCAwKTtcbiAgICBkaWN0aW9uYXJ5ID0gdG1wRGljdDtcbiAgICBkaWN0TGVuZ3RoID0gcy53X3NpemU7XG4gIH1cbiAgLyogaW5zZXJ0IGRpY3Rpb25hcnkgaW50byB3aW5kb3cgYW5kIGhhc2ggKi9cbiAgYXZhaWwgPSBzdHJtLmF2YWlsX2luO1xuICBuZXh0ID0gc3RybS5uZXh0X2luO1xuICBpbnB1dCA9IHN0cm0uaW5wdXQ7XG4gIHN0cm0uYXZhaWxfaW4gPSBkaWN0TGVuZ3RoO1xuICBzdHJtLm5leHRfaW4gPSAwO1xuICBzdHJtLmlucHV0ID0gZGljdGlvbmFyeTtcbiAgZmlsbF93aW5kb3cocyk7XG4gIHdoaWxlIChzLmxvb2thaGVhZCA+PSBNSU5fTUFUQ0gpIHtcbiAgICBzdHIgPSBzLnN0cnN0YXJ0O1xuICAgIG4gPSBzLmxvb2thaGVhZCAtIChNSU5fTUFUQ0ggLSAxKTtcbiAgICBkbyB7XG4gICAgICAvKiBVUERBVEVfSEFTSChzLCBzLT5pbnNfaCwgcy0+d2luZG93W3N0ciArIE1JTl9NQVRDSC0xXSk7ICovXG4gICAgICBzLmluc19oID0gKChzLmluc19oIDw8IHMuaGFzaF9zaGlmdCkgXiBzLndpbmRvd1tzdHIgKyBNSU5fTUFUQ0ggLSAxXSkgJiBzLmhhc2hfbWFzaztcblxuICAgICAgcy5wcmV2W3N0ciAmIHMud19tYXNrXSA9IHMuaGVhZFtzLmluc19oXTtcblxuICAgICAgcy5oZWFkW3MuaW5zX2hdID0gc3RyO1xuICAgICAgc3RyKys7XG4gICAgfSB3aGlsZSAoLS1uKTtcbiAgICBzLnN0cnN0YXJ0ID0gc3RyO1xuICAgIHMubG9va2FoZWFkID0gTUlOX01BVENIIC0gMTtcbiAgICBmaWxsX3dpbmRvdyhzKTtcbiAgfVxuICBzLnN0cnN0YXJ0ICs9IHMubG9va2FoZWFkO1xuICBzLmJsb2NrX3N0YXJ0ID0gcy5zdHJzdGFydDtcbiAgcy5pbnNlcnQgPSBzLmxvb2thaGVhZDtcbiAgcy5sb29rYWhlYWQgPSAwO1xuICBzLm1hdGNoX2xlbmd0aCA9IHMucHJldl9sZW5ndGggPSBNSU5fTUFUQ0ggLSAxO1xuICBzLm1hdGNoX2F2YWlsYWJsZSA9IDA7XG4gIHN0cm0ubmV4dF9pbiA9IG5leHQ7XG4gIHN0cm0uaW5wdXQgPSBpbnB1dDtcbiAgc3RybS5hdmFpbF9pbiA9IGF2YWlsO1xuICBzLndyYXAgPSB3cmFwO1xuICByZXR1cm4gWl9PSztcbn1cblxuXG5leHBvcnRzLmRlZmxhdGVJbml0ID0gZGVmbGF0ZUluaXQ7XG5leHBvcnRzLmRlZmxhdGVJbml0MiA9IGRlZmxhdGVJbml0MjtcbmV4cG9ydHMuZGVmbGF0ZVJlc2V0ID0gZGVmbGF0ZVJlc2V0O1xuZXhwb3J0cy5kZWZsYXRlUmVzZXRLZWVwID0gZGVmbGF0ZVJlc2V0S2VlcDtcbmV4cG9ydHMuZGVmbGF0ZVNldEhlYWRlciA9IGRlZmxhdGVTZXRIZWFkZXI7XG5leHBvcnRzLmRlZmxhdGUgPSBkZWZsYXRlO1xuZXhwb3J0cy5kZWZsYXRlRW5kID0gZGVmbGF0ZUVuZDtcbmV4cG9ydHMuZGVmbGF0ZVNldERpY3Rpb25hcnkgPSBkZWZsYXRlU2V0RGljdGlvbmFyeTtcbmV4cG9ydHMuZGVmbGF0ZUluZm8gPSAncGFrbyBkZWZsYXRlIChmcm9tIE5vZGVjYSBwcm9qZWN0KSc7XG5cbi8qIE5vdCBpbXBsZW1lbnRlZFxuZXhwb3J0cy5kZWZsYXRlQm91bmQgPSBkZWZsYXRlQm91bmQ7XG5leHBvcnRzLmRlZmxhdGVDb3B5ID0gZGVmbGF0ZUNvcHk7XG5leHBvcnRzLmRlZmxhdGVQYXJhbXMgPSBkZWZsYXRlUGFyYW1zO1xuZXhwb3J0cy5kZWZsYXRlUGVuZGluZyA9IGRlZmxhdGVQZW5kaW5nO1xuZXhwb3J0cy5kZWZsYXRlUHJpbWUgPSBkZWZsYXRlUHJpbWU7XG5leHBvcnRzLmRlZmxhdGVUdW5lID0gZGVmbGF0ZVR1bmU7XG4qL1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5cbmZ1bmN0aW9uIEdaaGVhZGVyKCkge1xuICAvKiB0cnVlIGlmIGNvbXByZXNzZWQgZGF0YSBiZWxpZXZlZCB0byBiZSB0ZXh0ICovXG4gIHRoaXMudGV4dCAgICAgICA9IDA7XG4gIC8qIG1vZGlmaWNhdGlvbiB0aW1lICovXG4gIHRoaXMudGltZSAgICAgICA9IDA7XG4gIC8qIGV4dHJhIGZsYWdzIChub3QgdXNlZCB3aGVuIHdyaXRpbmcgYSBnemlwIGZpbGUpICovXG4gIHRoaXMueGZsYWdzICAgICA9IDA7XG4gIC8qIG9wZXJhdGluZyBzeXN0ZW0gKi9cbiAgdGhpcy5vcyAgICAgICAgID0gMDtcbiAgLyogcG9pbnRlciB0byBleHRyYSBmaWVsZCBvciBaX05VTEwgaWYgbm9uZSAqL1xuICB0aGlzLmV4dHJhICAgICAgPSBudWxsO1xuICAvKiBleHRyYSBmaWVsZCBsZW5ndGggKHZhbGlkIGlmIGV4dHJhICE9IFpfTlVMTCkgKi9cbiAgdGhpcy5leHRyYV9sZW4gID0gMDsgLy8gQWN0dWFsbHksIHdlIGRvbid0IG5lZWQgaXQgaW4gSlMsXG4gICAgICAgICAgICAgICAgICAgICAgIC8vIGJ1dCBsZWF2ZSBmb3IgZmV3IGNvZGUgbW9kaWZpY2F0aW9uc1xuXG4gIC8vXG4gIC8vIFNldHVwIGxpbWl0cyBpcyBub3QgbmVjZXNzYXJ5IGJlY2F1c2UgaW4ganMgd2Ugc2hvdWxkIG5vdCBwcmVhbGxvY2F0ZSBtZW1vcnlcbiAgLy8gZm9yIGluZmxhdGUgdXNlIGNvbnN0YW50IGxpbWl0IGluIDY1NTM2IGJ5dGVzXG4gIC8vXG5cbiAgLyogc3BhY2UgYXQgZXh0cmEgKG9ubHkgd2hlbiByZWFkaW5nIGhlYWRlcikgKi9cbiAgLy8gdGhpcy5leHRyYV9tYXggID0gMDtcbiAgLyogcG9pbnRlciB0byB6ZXJvLXRlcm1pbmF0ZWQgZmlsZSBuYW1lIG9yIFpfTlVMTCAqL1xuICB0aGlzLm5hbWUgICAgICAgPSAnJztcbiAgLyogc3BhY2UgYXQgbmFtZSAob25seSB3aGVuIHJlYWRpbmcgaGVhZGVyKSAqL1xuICAvLyB0aGlzLm5hbWVfbWF4ICAgPSAwO1xuICAvKiBwb2ludGVyIHRvIHplcm8tdGVybWluYXRlZCBjb21tZW50IG9yIFpfTlVMTCAqL1xuICB0aGlzLmNvbW1lbnQgICAgPSAnJztcbiAgLyogc3BhY2UgYXQgY29tbWVudCAob25seSB3aGVuIHJlYWRpbmcgaGVhZGVyKSAqL1xuICAvLyB0aGlzLmNvbW1fbWF4ICAgPSAwO1xuICAvKiB0cnVlIGlmIHRoZXJlIHdhcyBvciB3aWxsIGJlIGEgaGVhZGVyIGNyYyAqL1xuICB0aGlzLmhjcmMgICAgICAgPSAwO1xuICAvKiB0cnVlIHdoZW4gZG9uZSByZWFkaW5nIGd6aXAgaGVhZGVyIChub3QgdXNlZCB3aGVuIHdyaXRpbmcgYSBnemlwIGZpbGUpICovXG4gIHRoaXMuZG9uZSAgICAgICA9IGZhbHNlO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IEdaaGVhZGVyO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG4vLyBTZWUgc3RhdGUgZGVmcyBmcm9tIGluZmxhdGUuanNcbnZhciBCQUQgPSAzMDsgICAgICAgLyogZ290IGEgZGF0YSBlcnJvciAtLSByZW1haW4gaGVyZSB1bnRpbCByZXNldCAqL1xudmFyIFRZUEUgPSAxMjsgICAgICAvKiBpOiB3YWl0aW5nIGZvciB0eXBlIGJpdHMsIGluY2x1ZGluZyBsYXN0LWZsYWcgYml0ICovXG5cbi8qXG4gICBEZWNvZGUgbGl0ZXJhbCwgbGVuZ3RoLCBhbmQgZGlzdGFuY2UgY29kZXMgYW5kIHdyaXRlIG91dCB0aGUgcmVzdWx0aW5nXG4gICBsaXRlcmFsIGFuZCBtYXRjaCBieXRlcyB1bnRpbCBlaXRoZXIgbm90IGVub3VnaCBpbnB1dCBvciBvdXRwdXQgaXNcbiAgIGF2YWlsYWJsZSwgYW4gZW5kLW9mLWJsb2NrIGlzIGVuY291bnRlcmVkLCBvciBhIGRhdGEgZXJyb3IgaXMgZW5jb3VudGVyZWQuXG4gICBXaGVuIGxhcmdlIGVub3VnaCBpbnB1dCBhbmQgb3V0cHV0IGJ1ZmZlcnMgYXJlIHN1cHBsaWVkIHRvIGluZmxhdGUoKSwgZm9yXG4gICBleGFtcGxlLCBhIDE2SyBpbnB1dCBidWZmZXIgYW5kIGEgNjRLIG91dHB1dCBidWZmZXIsIG1vcmUgdGhhbiA5NSUgb2YgdGhlXG4gICBpbmZsYXRlIGV4ZWN1dGlvbiB0aW1lIGlzIHNwZW50IGluIHRoaXMgcm91dGluZS5cblxuICAgRW50cnkgYXNzdW1wdGlvbnM6XG5cbiAgICAgICAgc3RhdGUubW9kZSA9PT0gTEVOXG4gICAgICAgIHN0cm0uYXZhaWxfaW4gPj0gNlxuICAgICAgICBzdHJtLmF2YWlsX291dCA+PSAyNThcbiAgICAgICAgc3RhcnQgPj0gc3RybS5hdmFpbF9vdXRcbiAgICAgICAgc3RhdGUuYml0cyA8IDhcblxuICAgT24gcmV0dXJuLCBzdGF0ZS5tb2RlIGlzIG9uZSBvZjpcblxuICAgICAgICBMRU4gLS0gcmFuIG91dCBvZiBlbm91Z2ggb3V0cHV0IHNwYWNlIG9yIGVub3VnaCBhdmFpbGFibGUgaW5wdXRcbiAgICAgICAgVFlQRSAtLSByZWFjaGVkIGVuZCBvZiBibG9jayBjb2RlLCBpbmZsYXRlKCkgdG8gaW50ZXJwcmV0IG5leHQgYmxvY2tcbiAgICAgICAgQkFEIC0tIGVycm9yIGluIGJsb2NrIGRhdGFcblxuICAgTm90ZXM6XG5cbiAgICAtIFRoZSBtYXhpbXVtIGlucHV0IGJpdHMgdXNlZCBieSBhIGxlbmd0aC9kaXN0YW5jZSBwYWlyIGlzIDE1IGJpdHMgZm9yIHRoZVxuICAgICAgbGVuZ3RoIGNvZGUsIDUgYml0cyBmb3IgdGhlIGxlbmd0aCBleHRyYSwgMTUgYml0cyBmb3IgdGhlIGRpc3RhbmNlIGNvZGUsXG4gICAgICBhbmQgMTMgYml0cyBmb3IgdGhlIGRpc3RhbmNlIGV4dHJhLiAgVGhpcyB0b3RhbHMgNDggYml0cywgb3Igc2l4IGJ5dGVzLlxuICAgICAgVGhlcmVmb3JlIGlmIHN0cm0uYXZhaWxfaW4gPj0gNiwgdGhlbiB0aGVyZSBpcyBlbm91Z2ggaW5wdXQgdG8gYXZvaWRcbiAgICAgIGNoZWNraW5nIGZvciBhdmFpbGFibGUgaW5wdXQgd2hpbGUgZGVjb2RpbmcuXG5cbiAgICAtIFRoZSBtYXhpbXVtIGJ5dGVzIHRoYXQgYSBzaW5nbGUgbGVuZ3RoL2Rpc3RhbmNlIHBhaXIgY2FuIG91dHB1dCBpcyAyNThcbiAgICAgIGJ5dGVzLCB3aGljaCBpcyB0aGUgbWF4aW11bSBsZW5ndGggdGhhdCBjYW4gYmUgY29kZWQuICBpbmZsYXRlX2Zhc3QoKVxuICAgICAgcmVxdWlyZXMgc3RybS5hdmFpbF9vdXQgPj0gMjU4IGZvciBlYWNoIGxvb3AgdG8gYXZvaWQgY2hlY2tpbmcgZm9yXG4gICAgICBvdXRwdXQgc3BhY2UuXG4gKi9cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gaW5mbGF0ZV9mYXN0KHN0cm0sIHN0YXJ0KSB7XG4gIHZhciBzdGF0ZTtcbiAgdmFyIF9pbjsgICAgICAgICAgICAgICAgICAgIC8qIGxvY2FsIHN0cm0uaW5wdXQgKi9cbiAgdmFyIGxhc3Q7ICAgICAgICAgICAgICAgICAgIC8qIGhhdmUgZW5vdWdoIGlucHV0IHdoaWxlIGluIDwgbGFzdCAqL1xuICB2YXIgX291dDsgICAgICAgICAgICAgICAgICAgLyogbG9jYWwgc3RybS5vdXRwdXQgKi9cbiAgdmFyIGJlZzsgICAgICAgICAgICAgICAgICAgIC8qIGluZmxhdGUoKSdzIGluaXRpYWwgc3RybS5vdXRwdXQgKi9cbiAgdmFyIGVuZDsgICAgICAgICAgICAgICAgICAgIC8qIHdoaWxlIG91dCA8IGVuZCwgZW5vdWdoIHNwYWNlIGF2YWlsYWJsZSAqL1xuLy8jaWZkZWYgSU5GTEFURV9TVFJJQ1RcbiAgdmFyIGRtYXg7ICAgICAgICAgICAgICAgICAgIC8qIG1heGltdW0gZGlzdGFuY2UgZnJvbSB6bGliIGhlYWRlciAqL1xuLy8jZW5kaWZcbiAgdmFyIHdzaXplOyAgICAgICAgICAgICAgICAgIC8qIHdpbmRvdyBzaXplIG9yIHplcm8gaWYgbm90IHVzaW5nIHdpbmRvdyAqL1xuICB2YXIgd2hhdmU7ICAgICAgICAgICAgICAgICAgLyogdmFsaWQgYnl0ZXMgaW4gdGhlIHdpbmRvdyAqL1xuICB2YXIgd25leHQ7ICAgICAgICAgICAgICAgICAgLyogd2luZG93IHdyaXRlIGluZGV4ICovXG4gIC8vIFVzZSBgc193aW5kb3dgIGluc3RlYWQgYHdpbmRvd2AsIGF2b2lkIGNvbmZsaWN0IHdpdGggaW5zdHJ1bWVudGF0aW9uIHRvb2xzXG4gIHZhciBzX3dpbmRvdzsgICAgICAgICAgICAgICAvKiBhbGxvY2F0ZWQgc2xpZGluZyB3aW5kb3csIGlmIHdzaXplICE9IDAgKi9cbiAgdmFyIGhvbGQ7ICAgICAgICAgICAgICAgICAgIC8qIGxvY2FsIHN0cm0uaG9sZCAqL1xuICB2YXIgYml0czsgICAgICAgICAgICAgICAgICAgLyogbG9jYWwgc3RybS5iaXRzICovXG4gIHZhciBsY29kZTsgICAgICAgICAgICAgICAgICAvKiBsb2NhbCBzdHJtLmxlbmNvZGUgKi9cbiAgdmFyIGRjb2RlOyAgICAgICAgICAgICAgICAgIC8qIGxvY2FsIHN0cm0uZGlzdGNvZGUgKi9cbiAgdmFyIGxtYXNrOyAgICAgICAgICAgICAgICAgIC8qIG1hc2sgZm9yIGZpcnN0IGxldmVsIG9mIGxlbmd0aCBjb2RlcyAqL1xuICB2YXIgZG1hc2s7ICAgICAgICAgICAgICAgICAgLyogbWFzayBmb3IgZmlyc3QgbGV2ZWwgb2YgZGlzdGFuY2UgY29kZXMgKi9cbiAgdmFyIGhlcmU7ICAgICAgICAgICAgICAgICAgIC8qIHJldHJpZXZlZCB0YWJsZSBlbnRyeSAqL1xuICB2YXIgb3A7ICAgICAgICAgICAgICAgICAgICAgLyogY29kZSBiaXRzLCBvcGVyYXRpb24sIGV4dHJhIGJpdHMsIG9yICovXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgd2luZG93IHBvc2l0aW9uLCB3aW5kb3cgYnl0ZXMgdG8gY29weSAqL1xuICB2YXIgbGVuOyAgICAgICAgICAgICAgICAgICAgLyogbWF0Y2ggbGVuZ3RoLCB1bnVzZWQgYnl0ZXMgKi9cbiAgdmFyIGRpc3Q7ICAgICAgICAgICAgICAgICAgIC8qIG1hdGNoIGRpc3RhbmNlICovXG4gIHZhciBmcm9tOyAgICAgICAgICAgICAgICAgICAvKiB3aGVyZSB0byBjb3B5IG1hdGNoIGZyb20gKi9cbiAgdmFyIGZyb21fc291cmNlO1xuXG5cbiAgdmFyIGlucHV0LCBvdXRwdXQ7IC8vIEpTIHNwZWNpZmljLCBiZWNhdXNlIHdlIGhhdmUgbm8gcG9pbnRlcnNcblxuICAvKiBjb3B5IHN0YXRlIHRvIGxvY2FsIHZhcmlhYmxlcyAqL1xuICBzdGF0ZSA9IHN0cm0uc3RhdGU7XG4gIC8vaGVyZSA9IHN0YXRlLmhlcmU7XG4gIF9pbiA9IHN0cm0ubmV4dF9pbjtcbiAgaW5wdXQgPSBzdHJtLmlucHV0O1xuICBsYXN0ID0gX2luICsgKHN0cm0uYXZhaWxfaW4gLSA1KTtcbiAgX291dCA9IHN0cm0ubmV4dF9vdXQ7XG4gIG91dHB1dCA9IHN0cm0ub3V0cHV0O1xuICBiZWcgPSBfb3V0IC0gKHN0YXJ0IC0gc3RybS5hdmFpbF9vdXQpO1xuICBlbmQgPSBfb3V0ICsgKHN0cm0uYXZhaWxfb3V0IC0gMjU3KTtcbi8vI2lmZGVmIElORkxBVEVfU1RSSUNUXG4gIGRtYXggPSBzdGF0ZS5kbWF4O1xuLy8jZW5kaWZcbiAgd3NpemUgPSBzdGF0ZS53c2l6ZTtcbiAgd2hhdmUgPSBzdGF0ZS53aGF2ZTtcbiAgd25leHQgPSBzdGF0ZS53bmV4dDtcbiAgc193aW5kb3cgPSBzdGF0ZS53aW5kb3c7XG4gIGhvbGQgPSBzdGF0ZS5ob2xkO1xuICBiaXRzID0gc3RhdGUuYml0cztcbiAgbGNvZGUgPSBzdGF0ZS5sZW5jb2RlO1xuICBkY29kZSA9IHN0YXRlLmRpc3Rjb2RlO1xuICBsbWFzayA9ICgxIDw8IHN0YXRlLmxlbmJpdHMpIC0gMTtcbiAgZG1hc2sgPSAoMSA8PCBzdGF0ZS5kaXN0Yml0cykgLSAxO1xuXG5cbiAgLyogZGVjb2RlIGxpdGVyYWxzIGFuZCBsZW5ndGgvZGlzdGFuY2VzIHVudGlsIGVuZC1vZi1ibG9jayBvciBub3QgZW5vdWdoXG4gICAgIGlucHV0IGRhdGEgb3Igb3V0cHV0IHNwYWNlICovXG5cbiAgdG9wOlxuICBkbyB7XG4gICAgaWYgKGJpdHMgPCAxNSkge1xuICAgICAgaG9sZCArPSBpbnB1dFtfaW4rK10gPDwgYml0cztcbiAgICAgIGJpdHMgKz0gODtcbiAgICAgIGhvbGQgKz0gaW5wdXRbX2luKytdIDw8IGJpdHM7XG4gICAgICBiaXRzICs9IDg7XG4gICAgfVxuXG4gICAgaGVyZSA9IGxjb2RlW2hvbGQgJiBsbWFza107XG5cbiAgICBkb2xlbjpcbiAgICBmb3IgKDs7KSB7IC8vIEdvdG8gZW11bGF0aW9uXG4gICAgICBvcCA9IGhlcmUgPj4+IDI0LypoZXJlLmJpdHMqLztcbiAgICAgIGhvbGQgPj4+PSBvcDtcbiAgICAgIGJpdHMgLT0gb3A7XG4gICAgICBvcCA9IChoZXJlID4+PiAxNikgJiAweGZmLypoZXJlLm9wKi87XG4gICAgICBpZiAob3AgPT09IDApIHsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGxpdGVyYWwgKi9cbiAgICAgICAgLy9UcmFjZXZ2KChzdGRlcnIsIGhlcmUudmFsID49IDB4MjAgJiYgaGVyZS52YWwgPCAweDdmID9cbiAgICAgICAgLy8gICAgICAgIFwiaW5mbGF0ZTogICAgICAgICBsaXRlcmFsICclYydcXG5cIiA6XG4gICAgICAgIC8vICAgICAgICBcImluZmxhdGU6ICAgICAgICAgbGl0ZXJhbCAweCUwMnhcXG5cIiwgaGVyZS52YWwpKTtcbiAgICAgICAgb3V0cHV0W19vdXQrK10gPSBoZXJlICYgMHhmZmZmLypoZXJlLnZhbCovO1xuICAgICAgfVxuICAgICAgZWxzZSBpZiAob3AgJiAxNikgeyAgICAgICAgICAgICAgICAgICAgIC8qIGxlbmd0aCBiYXNlICovXG4gICAgICAgIGxlbiA9IGhlcmUgJiAweGZmZmYvKmhlcmUudmFsKi87XG4gICAgICAgIG9wICY9IDE1OyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG51bWJlciBvZiBleHRyYSBiaXRzICovXG4gICAgICAgIGlmIChvcCkge1xuICAgICAgICAgIGlmIChiaXRzIDwgb3ApIHtcbiAgICAgICAgICAgIGhvbGQgKz0gaW5wdXRbX2luKytdIDw8IGJpdHM7XG4gICAgICAgICAgICBiaXRzICs9IDg7XG4gICAgICAgICAgfVxuICAgICAgICAgIGxlbiArPSBob2xkICYgKCgxIDw8IG9wKSAtIDEpO1xuICAgICAgICAgIGhvbGQgPj4+PSBvcDtcbiAgICAgICAgICBiaXRzIC09IG9wO1xuICAgICAgICB9XG4gICAgICAgIC8vVHJhY2V2digoc3RkZXJyLCBcImluZmxhdGU6ICAgICAgICAgbGVuZ3RoICV1XFxuXCIsIGxlbikpO1xuICAgICAgICBpZiAoYml0cyA8IDE1KSB7XG4gICAgICAgICAgaG9sZCArPSBpbnB1dFtfaW4rK10gPDwgYml0cztcbiAgICAgICAgICBiaXRzICs9IDg7XG4gICAgICAgICAgaG9sZCArPSBpbnB1dFtfaW4rK10gPDwgYml0cztcbiAgICAgICAgICBiaXRzICs9IDg7XG4gICAgICAgIH1cbiAgICAgICAgaGVyZSA9IGRjb2RlW2hvbGQgJiBkbWFza107XG5cbiAgICAgICAgZG9kaXN0OlxuICAgICAgICBmb3IgKDs7KSB7IC8vIGdvdG8gZW11bGF0aW9uXG4gICAgICAgICAgb3AgPSBoZXJlID4+PiAyNC8qaGVyZS5iaXRzKi87XG4gICAgICAgICAgaG9sZCA+Pj49IG9wO1xuICAgICAgICAgIGJpdHMgLT0gb3A7XG4gICAgICAgICAgb3AgPSAoaGVyZSA+Pj4gMTYpICYgMHhmZi8qaGVyZS5vcCovO1xuXG4gICAgICAgICAgaWYgKG9wICYgMTYpIHsgICAgICAgICAgICAgICAgICAgICAgLyogZGlzdGFuY2UgYmFzZSAqL1xuICAgICAgICAgICAgZGlzdCA9IGhlcmUgJiAweGZmZmYvKmhlcmUudmFsKi87XG4gICAgICAgICAgICBvcCAmPSAxNTsgICAgICAgICAgICAgICAgICAgICAgIC8qIG51bWJlciBvZiBleHRyYSBiaXRzICovXG4gICAgICAgICAgICBpZiAoYml0cyA8IG9wKSB7XG4gICAgICAgICAgICAgIGhvbGQgKz0gaW5wdXRbX2luKytdIDw8IGJpdHM7XG4gICAgICAgICAgICAgIGJpdHMgKz0gODtcbiAgICAgICAgICAgICAgaWYgKGJpdHMgPCBvcCkge1xuICAgICAgICAgICAgICAgIGhvbGQgKz0gaW5wdXRbX2luKytdIDw8IGJpdHM7XG4gICAgICAgICAgICAgICAgYml0cyArPSA4O1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBkaXN0ICs9IGhvbGQgJiAoKDEgPDwgb3ApIC0gMSk7XG4vLyNpZmRlZiBJTkZMQVRFX1NUUklDVFxuICAgICAgICAgICAgaWYgKGRpc3QgPiBkbWF4KSB7XG4gICAgICAgICAgICAgIHN0cm0ubXNnID0gJ2ludmFsaWQgZGlzdGFuY2UgdG9vIGZhciBiYWNrJztcbiAgICAgICAgICAgICAgc3RhdGUubW9kZSA9IEJBRDtcbiAgICAgICAgICAgICAgYnJlYWsgdG9wO1xuICAgICAgICAgICAgfVxuLy8jZW5kaWZcbiAgICAgICAgICAgIGhvbGQgPj4+PSBvcDtcbiAgICAgICAgICAgIGJpdHMgLT0gb3A7XG4gICAgICAgICAgICAvL1RyYWNldnYoKHN0ZGVyciwgXCJpbmZsYXRlOiAgICAgICAgIGRpc3RhbmNlICV1XFxuXCIsIGRpc3QpKTtcbiAgICAgICAgICAgIG9wID0gX291dCAtIGJlZzsgICAgICAgICAgICAgICAgLyogbWF4IGRpc3RhbmNlIGluIG91dHB1dCAqL1xuICAgICAgICAgICAgaWYgKGRpc3QgPiBvcCkgeyAgICAgICAgICAgICAgICAvKiBzZWUgaWYgY29weSBmcm9tIHdpbmRvdyAqL1xuICAgICAgICAgICAgICBvcCA9IGRpc3QgLSBvcDsgICAgICAgICAgICAgICAvKiBkaXN0YW5jZSBiYWNrIGluIHdpbmRvdyAqL1xuICAgICAgICAgICAgICBpZiAob3AgPiB3aGF2ZSkge1xuICAgICAgICAgICAgICAgIGlmIChzdGF0ZS5zYW5lKSB7XG4gICAgICAgICAgICAgICAgICBzdHJtLm1zZyA9ICdpbnZhbGlkIGRpc3RhbmNlIHRvbyBmYXIgYmFjayc7XG4gICAgICAgICAgICAgICAgICBzdGF0ZS5tb2RlID0gQkFEO1xuICAgICAgICAgICAgICAgICAgYnJlYWsgdG9wO1xuICAgICAgICAgICAgICAgIH1cblxuLy8gKCEpIFRoaXMgYmxvY2sgaXMgZGlzYWJsZWQgaW4gemxpYiBkZWZhaWx0cyxcbi8vIGRvbid0IGVuYWJsZSBpdCBmb3IgYmluYXJ5IGNvbXBhdGliaWxpdHlcbi8vI2lmZGVmIElORkxBVEVfQUxMT1dfSU5WQUxJRF9ESVNUQU5DRV9UT09GQVJfQVJSUlxuLy8gICAgICAgICAgICAgICAgaWYgKGxlbiA8PSBvcCAtIHdoYXZlKSB7XG4vLyAgICAgICAgICAgICAgICAgIGRvIHtcbi8vICAgICAgICAgICAgICAgICAgICBvdXRwdXRbX291dCsrXSA9IDA7XG4vLyAgICAgICAgICAgICAgICAgIH0gd2hpbGUgKC0tbGVuKTtcbi8vICAgICAgICAgICAgICAgICAgY29udGludWUgdG9wO1xuLy8gICAgICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgICAgbGVuIC09IG9wIC0gd2hhdmU7XG4vLyAgICAgICAgICAgICAgICBkbyB7XG4vLyAgICAgICAgICAgICAgICAgIG91dHB1dFtfb3V0KytdID0gMDtcbi8vICAgICAgICAgICAgICAgIH0gd2hpbGUgKC0tb3AgPiB3aGF2ZSk7XG4vLyAgICAgICAgICAgICAgICBpZiAob3AgPT09IDApIHtcbi8vICAgICAgICAgICAgICAgICAgZnJvbSA9IF9vdXQgLSBkaXN0O1xuLy8gICAgICAgICAgICAgICAgICBkbyB7XG4vLyAgICAgICAgICAgICAgICAgICAgb3V0cHV0W19vdXQrK10gPSBvdXRwdXRbZnJvbSsrXTtcbi8vICAgICAgICAgICAgICAgICAgfSB3aGlsZSAoLS1sZW4pO1xuLy8gICAgICAgICAgICAgICAgICBjb250aW51ZSB0b3A7XG4vLyAgICAgICAgICAgICAgICB9XG4vLyNlbmRpZlxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGZyb20gPSAwOyAvLyB3aW5kb3cgaW5kZXhcbiAgICAgICAgICAgICAgZnJvbV9zb3VyY2UgPSBzX3dpbmRvdztcbiAgICAgICAgICAgICAgaWYgKHduZXh0ID09PSAwKSB7ICAgICAgICAgICAvKiB2ZXJ5IGNvbW1vbiBjYXNlICovXG4gICAgICAgICAgICAgICAgZnJvbSArPSB3c2l6ZSAtIG9wO1xuICAgICAgICAgICAgICAgIGlmIChvcCA8IGxlbikgeyAgICAgICAgIC8qIHNvbWUgZnJvbSB3aW5kb3cgKi9cbiAgICAgICAgICAgICAgICAgIGxlbiAtPSBvcDtcbiAgICAgICAgICAgICAgICAgIGRvIHtcbiAgICAgICAgICAgICAgICAgICAgb3V0cHV0W19vdXQrK10gPSBzX3dpbmRvd1tmcm9tKytdO1xuICAgICAgICAgICAgICAgICAgfSB3aGlsZSAoLS1vcCk7XG4gICAgICAgICAgICAgICAgICBmcm9tID0gX291dCAtIGRpc3Q7ICAvKiByZXN0IGZyb20gb3V0cHV0ICovXG4gICAgICAgICAgICAgICAgICBmcm9tX3NvdXJjZSA9IG91dHB1dDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgZWxzZSBpZiAod25leHQgPCBvcCkgeyAgICAgIC8qIHdyYXAgYXJvdW5kIHdpbmRvdyAqL1xuICAgICAgICAgICAgICAgIGZyb20gKz0gd3NpemUgKyB3bmV4dCAtIG9wO1xuICAgICAgICAgICAgICAgIG9wIC09IHduZXh0O1xuICAgICAgICAgICAgICAgIGlmIChvcCA8IGxlbikgeyAgICAgICAgIC8qIHNvbWUgZnJvbSBlbmQgb2Ygd2luZG93ICovXG4gICAgICAgICAgICAgICAgICBsZW4gLT0gb3A7XG4gICAgICAgICAgICAgICAgICBkbyB7XG4gICAgICAgICAgICAgICAgICAgIG91dHB1dFtfb3V0KytdID0gc193aW5kb3dbZnJvbSsrXTtcbiAgICAgICAgICAgICAgICAgIH0gd2hpbGUgKC0tb3ApO1xuICAgICAgICAgICAgICAgICAgZnJvbSA9IDA7XG4gICAgICAgICAgICAgICAgICBpZiAod25leHQgPCBsZW4pIHsgIC8qIHNvbWUgZnJvbSBzdGFydCBvZiB3aW5kb3cgKi9cbiAgICAgICAgICAgICAgICAgICAgb3AgPSB3bmV4dDtcbiAgICAgICAgICAgICAgICAgICAgbGVuIC09IG9wO1xuICAgICAgICAgICAgICAgICAgICBkbyB7XG4gICAgICAgICAgICAgICAgICAgICAgb3V0cHV0W19vdXQrK10gPSBzX3dpbmRvd1tmcm9tKytdO1xuICAgICAgICAgICAgICAgICAgICB9IHdoaWxlICgtLW9wKTtcbiAgICAgICAgICAgICAgICAgICAgZnJvbSA9IF9vdXQgLSBkaXN0OyAgICAgIC8qIHJlc3QgZnJvbSBvdXRwdXQgKi9cbiAgICAgICAgICAgICAgICAgICAgZnJvbV9zb3VyY2UgPSBvdXRwdXQ7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAvKiBjb250aWd1b3VzIGluIHdpbmRvdyAqL1xuICAgICAgICAgICAgICAgIGZyb20gKz0gd25leHQgLSBvcDtcbiAgICAgICAgICAgICAgICBpZiAob3AgPCBsZW4pIHsgICAgICAgICAvKiBzb21lIGZyb20gd2luZG93ICovXG4gICAgICAgICAgICAgICAgICBsZW4gLT0gb3A7XG4gICAgICAgICAgICAgICAgICBkbyB7XG4gICAgICAgICAgICAgICAgICAgIG91dHB1dFtfb3V0KytdID0gc193aW5kb3dbZnJvbSsrXTtcbiAgICAgICAgICAgICAgICAgIH0gd2hpbGUgKC0tb3ApO1xuICAgICAgICAgICAgICAgICAgZnJvbSA9IF9vdXQgLSBkaXN0OyAgLyogcmVzdCBmcm9tIG91dHB1dCAqL1xuICAgICAgICAgICAgICAgICAgZnJvbV9zb3VyY2UgPSBvdXRwdXQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHdoaWxlIChsZW4gPiAyKSB7XG4gICAgICAgICAgICAgICAgb3V0cHV0W19vdXQrK10gPSBmcm9tX3NvdXJjZVtmcm9tKytdO1xuICAgICAgICAgICAgICAgIG91dHB1dFtfb3V0KytdID0gZnJvbV9zb3VyY2VbZnJvbSsrXTtcbiAgICAgICAgICAgICAgICBvdXRwdXRbX291dCsrXSA9IGZyb21fc291cmNlW2Zyb20rK107XG4gICAgICAgICAgICAgICAgbGVuIC09IDM7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgaWYgKGxlbikge1xuICAgICAgICAgICAgICAgIG91dHB1dFtfb3V0KytdID0gZnJvbV9zb3VyY2VbZnJvbSsrXTtcbiAgICAgICAgICAgICAgICBpZiAobGVuID4gMSkge1xuICAgICAgICAgICAgICAgICAgb3V0cHV0W19vdXQrK10gPSBmcm9tX3NvdXJjZVtmcm9tKytdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgIGZyb20gPSBfb3V0IC0gZGlzdDsgICAgICAgICAgLyogY29weSBkaXJlY3QgZnJvbSBvdXRwdXQgKi9cbiAgICAgICAgICAgICAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgIC8qIG1pbmltdW0gbGVuZ3RoIGlzIHRocmVlICovXG4gICAgICAgICAgICAgICAgb3V0cHV0W19vdXQrK10gPSBvdXRwdXRbZnJvbSsrXTtcbiAgICAgICAgICAgICAgICBvdXRwdXRbX291dCsrXSA9IG91dHB1dFtmcm9tKytdO1xuICAgICAgICAgICAgICAgIG91dHB1dFtfb3V0KytdID0gb3V0cHV0W2Zyb20rK107XG4gICAgICAgICAgICAgICAgbGVuIC09IDM7XG4gICAgICAgICAgICAgIH0gd2hpbGUgKGxlbiA+IDIpO1xuICAgICAgICAgICAgICBpZiAobGVuKSB7XG4gICAgICAgICAgICAgICAgb3V0cHV0W19vdXQrK10gPSBvdXRwdXRbZnJvbSsrXTtcbiAgICAgICAgICAgICAgICBpZiAobGVuID4gMSkge1xuICAgICAgICAgICAgICAgICAgb3V0cHV0W19vdXQrK10gPSBvdXRwdXRbZnJvbSsrXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgZWxzZSBpZiAoKG9wICYgNjQpID09PSAwKSB7ICAgICAgICAgIC8qIDJuZCBsZXZlbCBkaXN0YW5jZSBjb2RlICovXG4gICAgICAgICAgICBoZXJlID0gZGNvZGVbKGhlcmUgJiAweGZmZmYpLypoZXJlLnZhbCovICsgKGhvbGQgJiAoKDEgPDwgb3ApIC0gMSkpXTtcbiAgICAgICAgICAgIGNvbnRpbnVlIGRvZGlzdDtcbiAgICAgICAgICB9XG4gICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBzdHJtLm1zZyA9ICdpbnZhbGlkIGRpc3RhbmNlIGNvZGUnO1xuICAgICAgICAgICAgc3RhdGUubW9kZSA9IEJBRDtcbiAgICAgICAgICAgIGJyZWFrIHRvcDtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBicmVhazsgLy8gbmVlZCB0byBlbXVsYXRlIGdvdG8gdmlhIFwiY29udGludWVcIlxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBlbHNlIGlmICgob3AgJiA2NCkgPT09IDApIHsgICAgICAgICAgICAgIC8qIDJuZCBsZXZlbCBsZW5ndGggY29kZSAqL1xuICAgICAgICBoZXJlID0gbGNvZGVbKGhlcmUgJiAweGZmZmYpLypoZXJlLnZhbCovICsgKGhvbGQgJiAoKDEgPDwgb3ApIC0gMSkpXTtcbiAgICAgICAgY29udGludWUgZG9sZW47XG4gICAgICB9XG4gICAgICBlbHNlIGlmIChvcCAmIDMyKSB7ICAgICAgICAgICAgICAgICAgICAgLyogZW5kLW9mLWJsb2NrICovXG4gICAgICAgIC8vVHJhY2V2digoc3RkZXJyLCBcImluZmxhdGU6ICAgICAgICAgZW5kIG9mIGJsb2NrXFxuXCIpKTtcbiAgICAgICAgc3RhdGUubW9kZSA9IFRZUEU7XG4gICAgICAgIGJyZWFrIHRvcDtcbiAgICAgIH1cbiAgICAgIGVsc2Uge1xuICAgICAgICBzdHJtLm1zZyA9ICdpbnZhbGlkIGxpdGVyYWwvbGVuZ3RoIGNvZGUnO1xuICAgICAgICBzdGF0ZS5tb2RlID0gQkFEO1xuICAgICAgICBicmVhayB0b3A7XG4gICAgICB9XG5cbiAgICAgIGJyZWFrOyAvLyBuZWVkIHRvIGVtdWxhdGUgZ290byB2aWEgXCJjb250aW51ZVwiXG4gICAgfVxuICB9IHdoaWxlIChfaW4gPCBsYXN0ICYmIF9vdXQgPCBlbmQpO1xuXG4gIC8qIHJldHVybiB1bnVzZWQgYnl0ZXMgKG9uIGVudHJ5LCBiaXRzIDwgOCwgc28gaW4gd29uJ3QgZ28gdG9vIGZhciBiYWNrKSAqL1xuICBsZW4gPSBiaXRzID4+IDM7XG4gIF9pbiAtPSBsZW47XG4gIGJpdHMgLT0gbGVuIDw8IDM7XG4gIGhvbGQgJj0gKDEgPDwgYml0cykgLSAxO1xuXG4gIC8qIHVwZGF0ZSBzdGF0ZSBhbmQgcmV0dXJuICovXG4gIHN0cm0ubmV4dF9pbiA9IF9pbjtcbiAgc3RybS5uZXh0X291dCA9IF9vdXQ7XG4gIHN0cm0uYXZhaWxfaW4gPSAoX2luIDwgbGFzdCA/IDUgKyAobGFzdCAtIF9pbikgOiA1IC0gKF9pbiAtIGxhc3QpKTtcbiAgc3RybS5hdmFpbF9vdXQgPSAoX291dCA8IGVuZCA/IDI1NyArIChlbmQgLSBfb3V0KSA6IDI1NyAtIChfb3V0IC0gZW5kKSk7XG4gIHN0YXRlLmhvbGQgPSBob2xkO1xuICBzdGF0ZS5iaXRzID0gYml0cztcbiAgcmV0dXJuO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcblxuXG52YXIgdXRpbHMgICAgICAgICA9IHJlcXVpcmUoJy4uL3V0aWxzL2NvbW1vbicpO1xudmFyIGFkbGVyMzIgICAgICAgPSByZXF1aXJlKCcuL2FkbGVyMzInKTtcbnZhciBjcmMzMiAgICAgICAgID0gcmVxdWlyZSgnLi9jcmMzMicpO1xudmFyIGluZmxhdGVfZmFzdCAgPSByZXF1aXJlKCcuL2luZmZhc3QnKTtcbnZhciBpbmZsYXRlX3RhYmxlID0gcmVxdWlyZSgnLi9pbmZ0cmVlcycpO1xuXG52YXIgQ09ERVMgPSAwO1xudmFyIExFTlMgPSAxO1xudmFyIERJU1RTID0gMjtcblxuLyogUHVibGljIGNvbnN0YW50cyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki9cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovXG5cblxuLyogQWxsb3dlZCBmbHVzaCB2YWx1ZXM7IHNlZSBkZWZsYXRlKCkgYW5kIGluZmxhdGUoKSBiZWxvdyBmb3IgZGV0YWlscyAqL1xuLy92YXIgWl9OT19GTFVTSCAgICAgID0gMDtcbi8vdmFyIFpfUEFSVElBTF9GTFVTSCA9IDE7XG4vL3ZhciBaX1NZTkNfRkxVU0ggICAgPSAyO1xuLy92YXIgWl9GVUxMX0ZMVVNIICAgID0gMztcbnZhciBaX0ZJTklTSCAgICAgICAgPSA0O1xudmFyIFpfQkxPQ0sgICAgICAgICA9IDU7XG52YXIgWl9UUkVFUyAgICAgICAgID0gNjtcblxuXG4vKiBSZXR1cm4gY29kZXMgZm9yIHRoZSBjb21wcmVzc2lvbi9kZWNvbXByZXNzaW9uIGZ1bmN0aW9ucy4gTmVnYXRpdmUgdmFsdWVzXG4gKiBhcmUgZXJyb3JzLCBwb3NpdGl2ZSB2YWx1ZXMgYXJlIHVzZWQgZm9yIHNwZWNpYWwgYnV0IG5vcm1hbCBldmVudHMuXG4gKi9cbnZhciBaX09LICAgICAgICAgICAgPSAwO1xudmFyIFpfU1RSRUFNX0VORCAgICA9IDE7XG52YXIgWl9ORUVEX0RJQ1QgICAgID0gMjtcbi8vdmFyIFpfRVJSTk8gICAgICAgICA9IC0xO1xudmFyIFpfU1RSRUFNX0VSUk9SICA9IC0yO1xudmFyIFpfREFUQV9FUlJPUiAgICA9IC0zO1xudmFyIFpfTUVNX0VSUk9SICAgICA9IC00O1xudmFyIFpfQlVGX0VSUk9SICAgICA9IC01O1xuLy92YXIgWl9WRVJTSU9OX0VSUk9SID0gLTY7XG5cbi8qIFRoZSBkZWZsYXRlIGNvbXByZXNzaW9uIG1ldGhvZCAqL1xudmFyIFpfREVGTEFURUQgID0gODtcblxuXG4vKiBTVEFURVMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qL1xuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki9cblxuXG52YXIgICAgSEVBRCA9IDE7ICAgICAgIC8qIGk6IHdhaXRpbmcgZm9yIG1hZ2ljIGhlYWRlciAqL1xudmFyICAgIEZMQUdTID0gMjsgICAgICAvKiBpOiB3YWl0aW5nIGZvciBtZXRob2QgYW5kIGZsYWdzIChnemlwKSAqL1xudmFyICAgIFRJTUUgPSAzOyAgICAgICAvKiBpOiB3YWl0aW5nIGZvciBtb2RpZmljYXRpb24gdGltZSAoZ3ppcCkgKi9cbnZhciAgICBPUyA9IDQ7ICAgICAgICAgLyogaTogd2FpdGluZyBmb3IgZXh0cmEgZmxhZ3MgYW5kIG9wZXJhdGluZyBzeXN0ZW0gKGd6aXApICovXG52YXIgICAgRVhMRU4gPSA1OyAgICAgIC8qIGk6IHdhaXRpbmcgZm9yIGV4dHJhIGxlbmd0aCAoZ3ppcCkgKi9cbnZhciAgICBFWFRSQSA9IDY7ICAgICAgLyogaTogd2FpdGluZyBmb3IgZXh0cmEgYnl0ZXMgKGd6aXApICovXG52YXIgICAgTkFNRSA9IDc7ICAgICAgIC8qIGk6IHdhaXRpbmcgZm9yIGVuZCBvZiBmaWxlIG5hbWUgKGd6aXApICovXG52YXIgICAgQ09NTUVOVCA9IDg7ICAgIC8qIGk6IHdhaXRpbmcgZm9yIGVuZCBvZiBjb21tZW50IChnemlwKSAqL1xudmFyICAgIEhDUkMgPSA5OyAgICAgICAvKiBpOiB3YWl0aW5nIGZvciBoZWFkZXIgY3JjIChnemlwKSAqL1xudmFyICAgIERJQ1RJRCA9IDEwOyAgICAvKiBpOiB3YWl0aW5nIGZvciBkaWN0aW9uYXJ5IGNoZWNrIHZhbHVlICovXG52YXIgICAgRElDVCA9IDExOyAgICAgIC8qIHdhaXRpbmcgZm9yIGluZmxhdGVTZXREaWN0aW9uYXJ5KCkgY2FsbCAqL1xudmFyICAgICAgICBUWVBFID0gMTI7ICAgICAgLyogaTogd2FpdGluZyBmb3IgdHlwZSBiaXRzLCBpbmNsdWRpbmcgbGFzdC1mbGFnIGJpdCAqL1xudmFyICAgICAgICBUWVBFRE8gPSAxMzsgICAgLyogaTogc2FtZSwgYnV0IHNraXAgY2hlY2sgdG8gZXhpdCBpbmZsYXRlIG9uIG5ldyBibG9jayAqL1xudmFyICAgICAgICBTVE9SRUQgPSAxNDsgICAgLyogaTogd2FpdGluZyBmb3Igc3RvcmVkIHNpemUgKGxlbmd0aCBhbmQgY29tcGxlbWVudCkgKi9cbnZhciAgICAgICAgQ09QWV8gPSAxNTsgICAgIC8qIGkvbzogc2FtZSBhcyBDT1BZIGJlbG93LCBidXQgb25seSBmaXJzdCB0aW1lIGluICovXG52YXIgICAgICAgIENPUFkgPSAxNjsgICAgICAvKiBpL286IHdhaXRpbmcgZm9yIGlucHV0IG9yIG91dHB1dCB0byBjb3B5IHN0b3JlZCBibG9jayAqL1xudmFyICAgICAgICBUQUJMRSA9IDE3OyAgICAgLyogaTogd2FpdGluZyBmb3IgZHluYW1pYyBibG9jayB0YWJsZSBsZW5ndGhzICovXG52YXIgICAgICAgIExFTkxFTlMgPSAxODsgICAvKiBpOiB3YWl0aW5nIGZvciBjb2RlIGxlbmd0aCBjb2RlIGxlbmd0aHMgKi9cbnZhciAgICAgICAgQ09ERUxFTlMgPSAxOTsgIC8qIGk6IHdhaXRpbmcgZm9yIGxlbmd0aC9saXQgYW5kIGRpc3RhbmNlIGNvZGUgbGVuZ3RocyAqL1xudmFyICAgICAgICAgICAgTEVOXyA9IDIwOyAgICAgIC8qIGk6IHNhbWUgYXMgTEVOIGJlbG93LCBidXQgb25seSBmaXJzdCB0aW1lIGluICovXG52YXIgICAgICAgICAgICBMRU4gPSAyMTsgICAgICAgLyogaTogd2FpdGluZyBmb3IgbGVuZ3RoL2xpdC9lb2IgY29kZSAqL1xudmFyICAgICAgICAgICAgTEVORVhUID0gMjI7ICAgIC8qIGk6IHdhaXRpbmcgZm9yIGxlbmd0aCBleHRyYSBiaXRzICovXG52YXIgICAgICAgICAgICBESVNUID0gMjM7ICAgICAgLyogaTogd2FpdGluZyBmb3IgZGlzdGFuY2UgY29kZSAqL1xudmFyICAgICAgICAgICAgRElTVEVYVCA9IDI0OyAgIC8qIGk6IHdhaXRpbmcgZm9yIGRpc3RhbmNlIGV4dHJhIGJpdHMgKi9cbnZhciAgICAgICAgICAgIE1BVENIID0gMjU7ICAgICAvKiBvOiB3YWl0aW5nIGZvciBvdXRwdXQgc3BhY2UgdG8gY29weSBzdHJpbmcgKi9cbnZhciAgICAgICAgICAgIExJVCA9IDI2OyAgICAgICAvKiBvOiB3YWl0aW5nIGZvciBvdXRwdXQgc3BhY2UgdG8gd3JpdGUgbGl0ZXJhbCAqL1xudmFyICAgIENIRUNLID0gMjc7ICAgICAvKiBpOiB3YWl0aW5nIGZvciAzMi1iaXQgY2hlY2sgdmFsdWUgKi9cbnZhciAgICBMRU5HVEggPSAyODsgICAgLyogaTogd2FpdGluZyBmb3IgMzItYml0IGxlbmd0aCAoZ3ppcCkgKi9cbnZhciAgICBET05FID0gMjk7ICAgICAgLyogZmluaXNoZWQgY2hlY2ssIGRvbmUgLS0gcmVtYWluIGhlcmUgdW50aWwgcmVzZXQgKi9cbnZhciAgICBCQUQgPSAzMDsgICAgICAgLyogZ290IGEgZGF0YSBlcnJvciAtLSByZW1haW4gaGVyZSB1bnRpbCByZXNldCAqL1xudmFyICAgIE1FTSA9IDMxOyAgICAgICAvKiBnb3QgYW4gaW5mbGF0ZSgpIG1lbW9yeSBlcnJvciAtLSByZW1haW4gaGVyZSB1bnRpbCByZXNldCAqL1xudmFyICAgIFNZTkMgPSAzMjsgICAgICAvKiBsb29raW5nIGZvciBzeW5jaHJvbml6YXRpb24gYnl0ZXMgdG8gcmVzdGFydCBpbmZsYXRlKCkgKi9cblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki9cblxuXG5cbnZhciBFTk9VR0hfTEVOUyA9IDg1MjtcbnZhciBFTk9VR0hfRElTVFMgPSA1OTI7XG4vL3ZhciBFTk9VR0ggPSAgKEVOT1VHSF9MRU5TK0VOT1VHSF9ESVNUUyk7XG5cbnZhciBNQVhfV0JJVFMgPSAxNTtcbi8qIDMySyBMWjc3IHdpbmRvdyAqL1xudmFyIERFRl9XQklUUyA9IE1BWF9XQklUUztcblxuXG5mdW5jdGlvbiB6c3dhcDMyKHEpIHtcbiAgcmV0dXJuICAoKChxID4+PiAyNCkgJiAweGZmKSArXG4gICAgICAgICAgKChxID4+PiA4KSAmIDB4ZmYwMCkgK1xuICAgICAgICAgICgocSAmIDB4ZmYwMCkgPDwgOCkgK1xuICAgICAgICAgICgocSAmIDB4ZmYpIDw8IDI0KSk7XG59XG5cblxuZnVuY3Rpb24gSW5mbGF0ZVN0YXRlKCkge1xuICB0aGlzLm1vZGUgPSAwOyAgICAgICAgICAgICAvKiBjdXJyZW50IGluZmxhdGUgbW9kZSAqL1xuICB0aGlzLmxhc3QgPSBmYWxzZTsgICAgICAgICAgLyogdHJ1ZSBpZiBwcm9jZXNzaW5nIGxhc3QgYmxvY2sgKi9cbiAgdGhpcy53cmFwID0gMDsgICAgICAgICAgICAgIC8qIGJpdCAwIHRydWUgZm9yIHpsaWIsIGJpdCAxIHRydWUgZm9yIGd6aXAgKi9cbiAgdGhpcy5oYXZlZGljdCA9IGZhbHNlOyAgICAgIC8qIHRydWUgaWYgZGljdGlvbmFyeSBwcm92aWRlZCAqL1xuICB0aGlzLmZsYWdzID0gMDsgICAgICAgICAgICAgLyogZ3ppcCBoZWFkZXIgbWV0aG9kIGFuZCBmbGFncyAoMCBpZiB6bGliKSAqL1xuICB0aGlzLmRtYXggPSAwOyAgICAgICAgICAgICAgLyogemxpYiBoZWFkZXIgbWF4IGRpc3RhbmNlIChJTkZMQVRFX1NUUklDVCkgKi9cbiAgdGhpcy5jaGVjayA9IDA7ICAgICAgICAgICAgIC8qIHByb3RlY3RlZCBjb3B5IG9mIGNoZWNrIHZhbHVlICovXG4gIHRoaXMudG90YWwgPSAwOyAgICAgICAgICAgICAvKiBwcm90ZWN0ZWQgY29weSBvZiBvdXRwdXQgY291bnQgKi9cbiAgLy8gVE9ETzogbWF5IGJlIHt9XG4gIHRoaXMuaGVhZCA9IG51bGw7ICAgICAgICAgICAvKiB3aGVyZSB0byBzYXZlIGd6aXAgaGVhZGVyIGluZm9ybWF0aW9uICovXG5cbiAgLyogc2xpZGluZyB3aW5kb3cgKi9cbiAgdGhpcy53Yml0cyA9IDA7ICAgICAgICAgICAgIC8qIGxvZyBiYXNlIDIgb2YgcmVxdWVzdGVkIHdpbmRvdyBzaXplICovXG4gIHRoaXMud3NpemUgPSAwOyAgICAgICAgICAgICAvKiB3aW5kb3cgc2l6ZSBvciB6ZXJvIGlmIG5vdCB1c2luZyB3aW5kb3cgKi9cbiAgdGhpcy53aGF2ZSA9IDA7ICAgICAgICAgICAgIC8qIHZhbGlkIGJ5dGVzIGluIHRoZSB3aW5kb3cgKi9cbiAgdGhpcy53bmV4dCA9IDA7ICAgICAgICAgICAgIC8qIHdpbmRvdyB3cml0ZSBpbmRleCAqL1xuICB0aGlzLndpbmRvdyA9IG51bGw7ICAgICAgICAgLyogYWxsb2NhdGVkIHNsaWRpbmcgd2luZG93LCBpZiBuZWVkZWQgKi9cblxuICAvKiBiaXQgYWNjdW11bGF0b3IgKi9cbiAgdGhpcy5ob2xkID0gMDsgICAgICAgICAgICAgIC8qIGlucHV0IGJpdCBhY2N1bXVsYXRvciAqL1xuICB0aGlzLmJpdHMgPSAwOyAgICAgICAgICAgICAgLyogbnVtYmVyIG9mIGJpdHMgaW4gXCJpblwiICovXG5cbiAgLyogZm9yIHN0cmluZyBhbmQgc3RvcmVkIGJsb2NrIGNvcHlpbmcgKi9cbiAgdGhpcy5sZW5ndGggPSAwOyAgICAgICAgICAgIC8qIGxpdGVyYWwgb3IgbGVuZ3RoIG9mIGRhdGEgdG8gY29weSAqL1xuICB0aGlzLm9mZnNldCA9IDA7ICAgICAgICAgICAgLyogZGlzdGFuY2UgYmFjayB0byBjb3B5IHN0cmluZyBmcm9tICovXG5cbiAgLyogZm9yIHRhYmxlIGFuZCBjb2RlIGRlY29kaW5nICovXG4gIHRoaXMuZXh0cmEgPSAwOyAgICAgICAgICAgICAvKiBleHRyYSBiaXRzIG5lZWRlZCAqL1xuXG4gIC8qIGZpeGVkIGFuZCBkeW5hbWljIGNvZGUgdGFibGVzICovXG4gIHRoaXMubGVuY29kZSA9IG51bGw7ICAgICAgICAgIC8qIHN0YXJ0aW5nIHRhYmxlIGZvciBsZW5ndGgvbGl0ZXJhbCBjb2RlcyAqL1xuICB0aGlzLmRpc3Rjb2RlID0gbnVsbDsgICAgICAgICAvKiBzdGFydGluZyB0YWJsZSBmb3IgZGlzdGFuY2UgY29kZXMgKi9cbiAgdGhpcy5sZW5iaXRzID0gMDsgICAgICAgICAgIC8qIGluZGV4IGJpdHMgZm9yIGxlbmNvZGUgKi9cbiAgdGhpcy5kaXN0Yml0cyA9IDA7ICAgICAgICAgIC8qIGluZGV4IGJpdHMgZm9yIGRpc3Rjb2RlICovXG5cbiAgLyogZHluYW1pYyB0YWJsZSBidWlsZGluZyAqL1xuICB0aGlzLm5jb2RlID0gMDsgICAgICAgICAgICAgLyogbnVtYmVyIG9mIGNvZGUgbGVuZ3RoIGNvZGUgbGVuZ3RocyAqL1xuICB0aGlzLm5sZW4gPSAwOyAgICAgICAgICAgICAgLyogbnVtYmVyIG9mIGxlbmd0aCBjb2RlIGxlbmd0aHMgKi9cbiAgdGhpcy5uZGlzdCA9IDA7ICAgICAgICAgICAgIC8qIG51bWJlciBvZiBkaXN0YW5jZSBjb2RlIGxlbmd0aHMgKi9cbiAgdGhpcy5oYXZlID0gMDsgICAgICAgICAgICAgIC8qIG51bWJlciBvZiBjb2RlIGxlbmd0aHMgaW4gbGVuc1tdICovXG4gIHRoaXMubmV4dCA9IG51bGw7ICAgICAgICAgICAgICAvKiBuZXh0IGF2YWlsYWJsZSBzcGFjZSBpbiBjb2Rlc1tdICovXG5cbiAgdGhpcy5sZW5zID0gbmV3IHV0aWxzLkJ1ZjE2KDMyMCk7IC8qIHRlbXBvcmFyeSBzdG9yYWdlIGZvciBjb2RlIGxlbmd0aHMgKi9cbiAgdGhpcy53b3JrID0gbmV3IHV0aWxzLkJ1ZjE2KDI4OCk7IC8qIHdvcmsgYXJlYSBmb3IgY29kZSB0YWJsZSBidWlsZGluZyAqL1xuXG4gIC8qXG4gICBiZWNhdXNlIHdlIGRvbid0IGhhdmUgcG9pbnRlcnMgaW4ganMsIHdlIHVzZSBsZW5jb2RlIGFuZCBkaXN0Y29kZSBkaXJlY3RseVxuICAgYXMgYnVmZmVycyBzbyB3ZSBkb24ndCBuZWVkIGNvZGVzXG4gICovXG4gIC8vdGhpcy5jb2RlcyA9IG5ldyB1dGlscy5CdWYzMihFTk9VR0gpOyAgICAgICAvKiBzcGFjZSBmb3IgY29kZSB0YWJsZXMgKi9cbiAgdGhpcy5sZW5keW4gPSBudWxsOyAgICAgICAgICAgICAgLyogZHluYW1pYyB0YWJsZSBmb3IgbGVuZ3RoL2xpdGVyYWwgY29kZXMgKEpTIHNwZWNpZmljKSAqL1xuICB0aGlzLmRpc3RkeW4gPSBudWxsOyAgICAgICAgICAgICAvKiBkeW5hbWljIHRhYmxlIGZvciBkaXN0YW5jZSBjb2RlcyAoSlMgc3BlY2lmaWMpICovXG4gIHRoaXMuc2FuZSA9IDA7ICAgICAgICAgICAgICAgICAgIC8qIGlmIGZhbHNlLCBhbGxvdyBpbnZhbGlkIGRpc3RhbmNlIHRvbyBmYXIgKi9cbiAgdGhpcy5iYWNrID0gMDsgICAgICAgICAgICAgICAgICAgLyogYml0cyBiYWNrIG9mIGxhc3QgdW5wcm9jZXNzZWQgbGVuZ3RoL2xpdCAqL1xuICB0aGlzLndhcyA9IDA7ICAgICAgICAgICAgICAgICAgICAvKiBpbml0aWFsIGxlbmd0aCBvZiBtYXRjaCAqL1xufVxuXG5mdW5jdGlvbiBpbmZsYXRlUmVzZXRLZWVwKHN0cm0pIHtcbiAgdmFyIHN0YXRlO1xuXG4gIGlmICghc3RybSB8fCAhc3RybS5zdGF0ZSkgeyByZXR1cm4gWl9TVFJFQU1fRVJST1I7IH1cbiAgc3RhdGUgPSBzdHJtLnN0YXRlO1xuICBzdHJtLnRvdGFsX2luID0gc3RybS50b3RhbF9vdXQgPSBzdGF0ZS50b3RhbCA9IDA7XG4gIHN0cm0ubXNnID0gJyc7IC8qWl9OVUxMKi9cbiAgaWYgKHN0YXRlLndyYXApIHsgICAgICAgLyogdG8gc3VwcG9ydCBpbGwtY29uY2VpdmVkIEphdmEgdGVzdCBzdWl0ZSAqL1xuICAgIHN0cm0uYWRsZXIgPSBzdGF0ZS53cmFwICYgMTtcbiAgfVxuICBzdGF0ZS5tb2RlID0gSEVBRDtcbiAgc3RhdGUubGFzdCA9IDA7XG4gIHN0YXRlLmhhdmVkaWN0ID0gMDtcbiAgc3RhdGUuZG1heCA9IDMyNzY4O1xuICBzdGF0ZS5oZWFkID0gbnVsbC8qWl9OVUxMKi87XG4gIHN0YXRlLmhvbGQgPSAwO1xuICBzdGF0ZS5iaXRzID0gMDtcbiAgLy9zdGF0ZS5sZW5jb2RlID0gc3RhdGUuZGlzdGNvZGUgPSBzdGF0ZS5uZXh0ID0gc3RhdGUuY29kZXM7XG4gIHN0YXRlLmxlbmNvZGUgPSBzdGF0ZS5sZW5keW4gPSBuZXcgdXRpbHMuQnVmMzIoRU5PVUdIX0xFTlMpO1xuICBzdGF0ZS5kaXN0Y29kZSA9IHN0YXRlLmRpc3RkeW4gPSBuZXcgdXRpbHMuQnVmMzIoRU5PVUdIX0RJU1RTKTtcblxuICBzdGF0ZS5zYW5lID0gMTtcbiAgc3RhdGUuYmFjayA9IC0xO1xuICAvL1RyYWNldigoc3RkZXJyLCBcImluZmxhdGU6IHJlc2V0XFxuXCIpKTtcbiAgcmV0dXJuIFpfT0s7XG59XG5cbmZ1bmN0aW9uIGluZmxhdGVSZXNldChzdHJtKSB7XG4gIHZhciBzdGF0ZTtcblxuICBpZiAoIXN0cm0gfHwgIXN0cm0uc3RhdGUpIHsgcmV0dXJuIFpfU1RSRUFNX0VSUk9SOyB9XG4gIHN0YXRlID0gc3RybS5zdGF0ZTtcbiAgc3RhdGUud3NpemUgPSAwO1xuICBzdGF0ZS53aGF2ZSA9IDA7XG4gIHN0YXRlLnduZXh0ID0gMDtcbiAgcmV0dXJuIGluZmxhdGVSZXNldEtlZXAoc3RybSk7XG5cbn1cblxuZnVuY3Rpb24gaW5mbGF0ZVJlc2V0MihzdHJtLCB3aW5kb3dCaXRzKSB7XG4gIHZhciB3cmFwO1xuICB2YXIgc3RhdGU7XG5cbiAgLyogZ2V0IHRoZSBzdGF0ZSAqL1xuICBpZiAoIXN0cm0gfHwgIXN0cm0uc3RhdGUpIHsgcmV0dXJuIFpfU1RSRUFNX0VSUk9SOyB9XG4gIHN0YXRlID0gc3RybS5zdGF0ZTtcblxuICAvKiBleHRyYWN0IHdyYXAgcmVxdWVzdCBmcm9tIHdpbmRvd0JpdHMgcGFyYW1ldGVyICovXG4gIGlmICh3aW5kb3dCaXRzIDwgMCkge1xuICAgIHdyYXAgPSAwO1xuICAgIHdpbmRvd0JpdHMgPSAtd2luZG93Qml0cztcbiAgfVxuICBlbHNlIHtcbiAgICB3cmFwID0gKHdpbmRvd0JpdHMgPj4gNCkgKyAxO1xuICAgIGlmICh3aW5kb3dCaXRzIDwgNDgpIHtcbiAgICAgIHdpbmRvd0JpdHMgJj0gMTU7XG4gICAgfVxuICB9XG5cbiAgLyogc2V0IG51bWJlciBvZiB3aW5kb3cgYml0cywgZnJlZSB3aW5kb3cgaWYgZGlmZmVyZW50ICovXG4gIGlmICh3aW5kb3dCaXRzICYmICh3aW5kb3dCaXRzIDwgOCB8fCB3aW5kb3dCaXRzID4gMTUpKSB7XG4gICAgcmV0dXJuIFpfU1RSRUFNX0VSUk9SO1xuICB9XG4gIGlmIChzdGF0ZS53aW5kb3cgIT09IG51bGwgJiYgc3RhdGUud2JpdHMgIT09IHdpbmRvd0JpdHMpIHtcbiAgICBzdGF0ZS53aW5kb3cgPSBudWxsO1xuICB9XG5cbiAgLyogdXBkYXRlIHN0YXRlIGFuZCByZXNldCB0aGUgcmVzdCBvZiBpdCAqL1xuICBzdGF0ZS53cmFwID0gd3JhcDtcbiAgc3RhdGUud2JpdHMgPSB3aW5kb3dCaXRzO1xuICByZXR1cm4gaW5mbGF0ZVJlc2V0KHN0cm0pO1xufVxuXG5mdW5jdGlvbiBpbmZsYXRlSW5pdDIoc3RybSwgd2luZG93Qml0cykge1xuICB2YXIgcmV0O1xuICB2YXIgc3RhdGU7XG5cbiAgaWYgKCFzdHJtKSB7IHJldHVybiBaX1NUUkVBTV9FUlJPUjsgfVxuICAvL3N0cm0ubXNnID0gWl9OVUxMOyAgICAgICAgICAgICAgICAgLyogaW4gY2FzZSB3ZSByZXR1cm4gYW4gZXJyb3IgKi9cblxuICBzdGF0ZSA9IG5ldyBJbmZsYXRlU3RhdGUoKTtcblxuICAvL2lmIChzdGF0ZSA9PT0gWl9OVUxMKSByZXR1cm4gWl9NRU1fRVJST1I7XG4gIC8vVHJhY2V2KChzdGRlcnIsIFwiaW5mbGF0ZTogYWxsb2NhdGVkXFxuXCIpKTtcbiAgc3RybS5zdGF0ZSA9IHN0YXRlO1xuICBzdGF0ZS53aW5kb3cgPSBudWxsLypaX05VTEwqLztcbiAgcmV0ID0gaW5mbGF0ZVJlc2V0MihzdHJtLCB3aW5kb3dCaXRzKTtcbiAgaWYgKHJldCAhPT0gWl9PSykge1xuICAgIHN0cm0uc3RhdGUgPSBudWxsLypaX05VTEwqLztcbiAgfVxuICByZXR1cm4gcmV0O1xufVxuXG5mdW5jdGlvbiBpbmZsYXRlSW5pdChzdHJtKSB7XG4gIHJldHVybiBpbmZsYXRlSW5pdDIoc3RybSwgREVGX1dCSVRTKTtcbn1cblxuXG4vKlxuIFJldHVybiBzdGF0ZSB3aXRoIGxlbmd0aCBhbmQgZGlzdGFuY2UgZGVjb2RpbmcgdGFibGVzIGFuZCBpbmRleCBzaXplcyBzZXQgdG9cbiBmaXhlZCBjb2RlIGRlY29kaW5nLiAgTm9ybWFsbHkgdGhpcyByZXR1cm5zIGZpeGVkIHRhYmxlcyBmcm9tIGluZmZpeGVkLmguXG4gSWYgQlVJTERGSVhFRCBpcyBkZWZpbmVkLCB0aGVuIGluc3RlYWQgdGhpcyByb3V0aW5lIGJ1aWxkcyB0aGUgdGFibGVzIHRoZVxuIGZpcnN0IHRpbWUgaXQncyBjYWxsZWQsIGFuZCByZXR1cm5zIHRob3NlIHRhYmxlcyB0aGUgZmlyc3QgdGltZSBhbmRcbiB0aGVyZWFmdGVyLiAgVGhpcyByZWR1Y2VzIHRoZSBzaXplIG9mIHRoZSBjb2RlIGJ5IGFib3V0IDJLIGJ5dGVzLCBpblxuIGV4Y2hhbmdlIGZvciBhIGxpdHRsZSBleGVjdXRpb24gdGltZS4gIEhvd2V2ZXIsIEJVSUxERklYRUQgc2hvdWxkIG5vdCBiZVxuIHVzZWQgZm9yIHRocmVhZGVkIGFwcGxpY2F0aW9ucywgc2luY2UgdGhlIHJld3JpdGluZyBvZiB0aGUgdGFibGVzIGFuZCB2aXJnaW5cbiBtYXkgbm90IGJlIHRocmVhZC1zYWZlLlxuICovXG52YXIgdmlyZ2luID0gdHJ1ZTtcblxudmFyIGxlbmZpeCwgZGlzdGZpeDsgLy8gV2UgaGF2ZSBubyBwb2ludGVycyBpbiBKUywgc28ga2VlcCB0YWJsZXMgc2VwYXJhdGVcblxuZnVuY3Rpb24gZml4ZWR0YWJsZXMoc3RhdGUpIHtcbiAgLyogYnVpbGQgZml4ZWQgaHVmZm1hbiB0YWJsZXMgaWYgZmlyc3QgY2FsbCAobWF5IG5vdCBiZSB0aHJlYWQgc2FmZSkgKi9cbiAgaWYgKHZpcmdpbikge1xuICAgIHZhciBzeW07XG5cbiAgICBsZW5maXggPSBuZXcgdXRpbHMuQnVmMzIoNTEyKTtcbiAgICBkaXN0Zml4ID0gbmV3IHV0aWxzLkJ1ZjMyKDMyKTtcblxuICAgIC8qIGxpdGVyYWwvbGVuZ3RoIHRhYmxlICovXG4gICAgc3ltID0gMDtcbiAgICB3aGlsZSAoc3ltIDwgMTQ0KSB7IHN0YXRlLmxlbnNbc3ltKytdID0gODsgfVxuICAgIHdoaWxlIChzeW0gPCAyNTYpIHsgc3RhdGUubGVuc1tzeW0rK10gPSA5OyB9XG4gICAgd2hpbGUgKHN5bSA8IDI4MCkgeyBzdGF0ZS5sZW5zW3N5bSsrXSA9IDc7IH1cbiAgICB3aGlsZSAoc3ltIDwgMjg4KSB7IHN0YXRlLmxlbnNbc3ltKytdID0gODsgfVxuXG4gICAgaW5mbGF0ZV90YWJsZShMRU5TLCAgc3RhdGUubGVucywgMCwgMjg4LCBsZW5maXgsICAgMCwgc3RhdGUud29yaywgeyBiaXRzOiA5IH0pO1xuXG4gICAgLyogZGlzdGFuY2UgdGFibGUgKi9cbiAgICBzeW0gPSAwO1xuICAgIHdoaWxlIChzeW0gPCAzMikgeyBzdGF0ZS5sZW5zW3N5bSsrXSA9IDU7IH1cblxuICAgIGluZmxhdGVfdGFibGUoRElTVFMsIHN0YXRlLmxlbnMsIDAsIDMyLCAgIGRpc3RmaXgsIDAsIHN0YXRlLndvcmssIHsgYml0czogNSB9KTtcblxuICAgIC8qIGRvIHRoaXMganVzdCBvbmNlICovXG4gICAgdmlyZ2luID0gZmFsc2U7XG4gIH1cblxuICBzdGF0ZS5sZW5jb2RlID0gbGVuZml4O1xuICBzdGF0ZS5sZW5iaXRzID0gOTtcbiAgc3RhdGUuZGlzdGNvZGUgPSBkaXN0Zml4O1xuICBzdGF0ZS5kaXN0Yml0cyA9IDU7XG59XG5cblxuLypcbiBVcGRhdGUgdGhlIHdpbmRvdyB3aXRoIHRoZSBsYXN0IHdzaXplIChub3JtYWxseSAzMkspIGJ5dGVzIHdyaXR0ZW4gYmVmb3JlXG4gcmV0dXJuaW5nLiAgSWYgd2luZG93IGRvZXMgbm90IGV4aXN0IHlldCwgY3JlYXRlIGl0LiAgVGhpcyBpcyBvbmx5IGNhbGxlZFxuIHdoZW4gYSB3aW5kb3cgaXMgYWxyZWFkeSBpbiB1c2UsIG9yIHdoZW4gb3V0cHV0IGhhcyBiZWVuIHdyaXR0ZW4gZHVyaW5nIHRoaXNcbiBpbmZsYXRlIGNhbGwsIGJ1dCB0aGUgZW5kIG9mIHRoZSBkZWZsYXRlIHN0cmVhbSBoYXMgbm90IGJlZW4gcmVhY2hlZCB5ZXQuXG4gSXQgaXMgYWxzbyBjYWxsZWQgdG8gY3JlYXRlIGEgd2luZG93IGZvciBkaWN0aW9uYXJ5IGRhdGEgd2hlbiBhIGRpY3Rpb25hcnlcbiBpcyBsb2FkZWQuXG5cbiBQcm92aWRpbmcgb3V0cHV0IGJ1ZmZlcnMgbGFyZ2VyIHRoYW4gMzJLIHRvIGluZmxhdGUoKSBzaG91bGQgcHJvdmlkZSBhIHNwZWVkXG4gYWR2YW50YWdlLCBzaW5jZSBvbmx5IHRoZSBsYXN0IDMySyBvZiBvdXRwdXQgaXMgY29waWVkIHRvIHRoZSBzbGlkaW5nIHdpbmRvd1xuIHVwb24gcmV0dXJuIGZyb20gaW5mbGF0ZSgpLCBhbmQgc2luY2UgYWxsIGRpc3RhbmNlcyBhZnRlciB0aGUgZmlyc3QgMzJLIG9mXG4gb3V0cHV0IHdpbGwgZmFsbCBpbiB0aGUgb3V0cHV0IGRhdGEsIG1ha2luZyBtYXRjaCBjb3BpZXMgc2ltcGxlciBhbmQgZmFzdGVyLlxuIFRoZSBhZHZhbnRhZ2UgbWF5IGJlIGRlcGVuZGVudCBvbiB0aGUgc2l6ZSBvZiB0aGUgcHJvY2Vzc29yJ3MgZGF0YSBjYWNoZXMuXG4gKi9cbmZ1bmN0aW9uIHVwZGF0ZXdpbmRvdyhzdHJtLCBzcmMsIGVuZCwgY29weSkge1xuICB2YXIgZGlzdDtcbiAgdmFyIHN0YXRlID0gc3RybS5zdGF0ZTtcblxuICAvKiBpZiBpdCBoYXNuJ3QgYmVlbiBkb25lIGFscmVhZHksIGFsbG9jYXRlIHNwYWNlIGZvciB0aGUgd2luZG93ICovXG4gIGlmIChzdGF0ZS53aW5kb3cgPT09IG51bGwpIHtcbiAgICBzdGF0ZS53c2l6ZSA9IDEgPDwgc3RhdGUud2JpdHM7XG4gICAgc3RhdGUud25leHQgPSAwO1xuICAgIHN0YXRlLndoYXZlID0gMDtcblxuICAgIHN0YXRlLndpbmRvdyA9IG5ldyB1dGlscy5CdWY4KHN0YXRlLndzaXplKTtcbiAgfVxuXG4gIC8qIGNvcHkgc3RhdGUtPndzaXplIG9yIGxlc3Mgb3V0cHV0IGJ5dGVzIGludG8gdGhlIGNpcmN1bGFyIHdpbmRvdyAqL1xuICBpZiAoY29weSA+PSBzdGF0ZS53c2l6ZSkge1xuICAgIHV0aWxzLmFycmF5U2V0KHN0YXRlLndpbmRvdywgc3JjLCBlbmQgLSBzdGF0ZS53c2l6ZSwgc3RhdGUud3NpemUsIDApO1xuICAgIHN0YXRlLnduZXh0ID0gMDtcbiAgICBzdGF0ZS53aGF2ZSA9IHN0YXRlLndzaXplO1xuICB9XG4gIGVsc2Uge1xuICAgIGRpc3QgPSBzdGF0ZS53c2l6ZSAtIHN0YXRlLnduZXh0O1xuICAgIGlmIChkaXN0ID4gY29weSkge1xuICAgICAgZGlzdCA9IGNvcHk7XG4gICAgfVxuICAgIC8vem1lbWNweShzdGF0ZS0+d2luZG93ICsgc3RhdGUtPnduZXh0LCBlbmQgLSBjb3B5LCBkaXN0KTtcbiAgICB1dGlscy5hcnJheVNldChzdGF0ZS53aW5kb3csIHNyYywgZW5kIC0gY29weSwgZGlzdCwgc3RhdGUud25leHQpO1xuICAgIGNvcHkgLT0gZGlzdDtcbiAgICBpZiAoY29weSkge1xuICAgICAgLy96bWVtY3B5KHN0YXRlLT53aW5kb3csIGVuZCAtIGNvcHksIGNvcHkpO1xuICAgICAgdXRpbHMuYXJyYXlTZXQoc3RhdGUud2luZG93LCBzcmMsIGVuZCAtIGNvcHksIGNvcHksIDApO1xuICAgICAgc3RhdGUud25leHQgPSBjb3B5O1xuICAgICAgc3RhdGUud2hhdmUgPSBzdGF0ZS53c2l6ZTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICBzdGF0ZS53bmV4dCArPSBkaXN0O1xuICAgICAgaWYgKHN0YXRlLnduZXh0ID09PSBzdGF0ZS53c2l6ZSkgeyBzdGF0ZS53bmV4dCA9IDA7IH1cbiAgICAgIGlmIChzdGF0ZS53aGF2ZSA8IHN0YXRlLndzaXplKSB7IHN0YXRlLndoYXZlICs9IGRpc3Q7IH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIDA7XG59XG5cbmZ1bmN0aW9uIGluZmxhdGUoc3RybSwgZmx1c2gpIHtcbiAgdmFyIHN0YXRlO1xuICB2YXIgaW5wdXQsIG91dHB1dDsgICAgICAgICAgLy8gaW5wdXQvb3V0cHV0IGJ1ZmZlcnNcbiAgdmFyIG5leHQ7ICAgICAgICAgICAgICAgICAgIC8qIG5leHQgaW5wdXQgSU5ERVggKi9cbiAgdmFyIHB1dDsgICAgICAgICAgICAgICAgICAgIC8qIG5leHQgb3V0cHV0IElOREVYICovXG4gIHZhciBoYXZlLCBsZWZ0OyAgICAgICAgICAgICAvKiBhdmFpbGFibGUgaW5wdXQgYW5kIG91dHB1dCAqL1xuICB2YXIgaG9sZDsgICAgICAgICAgICAgICAgICAgLyogYml0IGJ1ZmZlciAqL1xuICB2YXIgYml0czsgICAgICAgICAgICAgICAgICAgLyogYml0cyBpbiBiaXQgYnVmZmVyICovXG4gIHZhciBfaW4sIF9vdXQ7ICAgICAgICAgICAgICAvKiBzYXZlIHN0YXJ0aW5nIGF2YWlsYWJsZSBpbnB1dCBhbmQgb3V0cHV0ICovXG4gIHZhciBjb3B5OyAgICAgICAgICAgICAgICAgICAvKiBudW1iZXIgb2Ygc3RvcmVkIG9yIG1hdGNoIGJ5dGVzIHRvIGNvcHkgKi9cbiAgdmFyIGZyb207ICAgICAgICAgICAgICAgICAgIC8qIHdoZXJlIHRvIGNvcHkgbWF0Y2ggYnl0ZXMgZnJvbSAqL1xuICB2YXIgZnJvbV9zb3VyY2U7XG4gIHZhciBoZXJlID0gMDsgICAgICAgICAgICAgICAvKiBjdXJyZW50IGRlY29kaW5nIHRhYmxlIGVudHJ5ICovXG4gIHZhciBoZXJlX2JpdHMsIGhlcmVfb3AsIGhlcmVfdmFsOyAvLyBwYWtlZCBcImhlcmVcIiBkZW5vcm1hbGl6ZWQgKEpTIHNwZWNpZmljKVxuICAvL3ZhciBsYXN0OyAgICAgICAgICAgICAgICAgICAvKiBwYXJlbnQgdGFibGUgZW50cnkgKi9cbiAgdmFyIGxhc3RfYml0cywgbGFzdF9vcCwgbGFzdF92YWw7IC8vIHBha2VkIFwibGFzdFwiIGRlbm9ybWFsaXplZCAoSlMgc3BlY2lmaWMpXG4gIHZhciBsZW47ICAgICAgICAgICAgICAgICAgICAvKiBsZW5ndGggdG8gY29weSBmb3IgcmVwZWF0cywgYml0cyB0byBkcm9wICovXG4gIHZhciByZXQ7ICAgICAgICAgICAgICAgICAgICAvKiByZXR1cm4gY29kZSAqL1xuICB2YXIgaGJ1ZiA9IG5ldyB1dGlscy5CdWY4KDQpOyAgICAvKiBidWZmZXIgZm9yIGd6aXAgaGVhZGVyIGNyYyBjYWxjdWxhdGlvbiAqL1xuICB2YXIgb3B0cztcblxuICB2YXIgbjsgLy8gdGVtcG9yYXJ5IHZhciBmb3IgTkVFRF9CSVRTXG5cbiAgdmFyIG9yZGVyID0gLyogcGVybXV0YXRpb24gb2YgY29kZSBsZW5ndGhzICovXG4gICAgWyAxNiwgMTcsIDE4LCAwLCA4LCA3LCA5LCA2LCAxMCwgNSwgMTEsIDQsIDEyLCAzLCAxMywgMiwgMTQsIDEsIDE1IF07XG5cblxuICBpZiAoIXN0cm0gfHwgIXN0cm0uc3RhdGUgfHwgIXN0cm0ub3V0cHV0IHx8XG4gICAgICAoIXN0cm0uaW5wdXQgJiYgc3RybS5hdmFpbF9pbiAhPT0gMCkpIHtcbiAgICByZXR1cm4gWl9TVFJFQU1fRVJST1I7XG4gIH1cblxuICBzdGF0ZSA9IHN0cm0uc3RhdGU7XG4gIGlmIChzdGF0ZS5tb2RlID09PSBUWVBFKSB7IHN0YXRlLm1vZGUgPSBUWVBFRE87IH0gICAgLyogc2tpcCBjaGVjayAqL1xuXG5cbiAgLy8tLS0gTE9BRCgpIC0tLVxuICBwdXQgPSBzdHJtLm5leHRfb3V0O1xuICBvdXRwdXQgPSBzdHJtLm91dHB1dDtcbiAgbGVmdCA9IHN0cm0uYXZhaWxfb3V0O1xuICBuZXh0ID0gc3RybS5uZXh0X2luO1xuICBpbnB1dCA9IHN0cm0uaW5wdXQ7XG4gIGhhdmUgPSBzdHJtLmF2YWlsX2luO1xuICBob2xkID0gc3RhdGUuaG9sZDtcbiAgYml0cyA9IHN0YXRlLmJpdHM7XG4gIC8vLS0tXG5cbiAgX2luID0gaGF2ZTtcbiAgX291dCA9IGxlZnQ7XG4gIHJldCA9IFpfT0s7XG5cbiAgaW5mX2xlYXZlOiAvLyBnb3RvIGVtdWxhdGlvblxuICBmb3IgKDs7KSB7XG4gICAgc3dpdGNoIChzdGF0ZS5tb2RlKSB7XG4gICAgY2FzZSBIRUFEOlxuICAgICAgaWYgKHN0YXRlLndyYXAgPT09IDApIHtcbiAgICAgICAgc3RhdGUubW9kZSA9IFRZUEVETztcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICAvLz09PSBORUVEQklUUygxNik7XG4gICAgICB3aGlsZSAoYml0cyA8IDE2KSB7XG4gICAgICAgIGlmIChoYXZlID09PSAwKSB7IGJyZWFrIGluZl9sZWF2ZTsgfVxuICAgICAgICBoYXZlLS07XG4gICAgICAgIGhvbGQgKz0gaW5wdXRbbmV4dCsrXSA8PCBiaXRzO1xuICAgICAgICBiaXRzICs9IDg7XG4gICAgICB9XG4gICAgICAvLz09PS8vXG4gICAgICBpZiAoKHN0YXRlLndyYXAgJiAyKSAmJiBob2xkID09PSAweDhiMWYpIHsgIC8qIGd6aXAgaGVhZGVyICovXG4gICAgICAgIHN0YXRlLmNoZWNrID0gMC8qY3JjMzIoMEwsIFpfTlVMTCwgMCkqLztcbiAgICAgICAgLy89PT0gQ1JDMihzdGF0ZS5jaGVjaywgaG9sZCk7XG4gICAgICAgIGhidWZbMF0gPSBob2xkICYgMHhmZjtcbiAgICAgICAgaGJ1ZlsxXSA9IChob2xkID4+PiA4KSAmIDB4ZmY7XG4gICAgICAgIHN0YXRlLmNoZWNrID0gY3JjMzIoc3RhdGUuY2hlY2ssIGhidWYsIDIsIDApO1xuICAgICAgICAvLz09PS8vXG5cbiAgICAgICAgLy89PT0gSU5JVEJJVFMoKTtcbiAgICAgICAgaG9sZCA9IDA7XG4gICAgICAgIGJpdHMgPSAwO1xuICAgICAgICAvLz09PS8vXG4gICAgICAgIHN0YXRlLm1vZGUgPSBGTEFHUztcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBzdGF0ZS5mbGFncyA9IDA7ICAgICAgICAgICAvKiBleHBlY3QgemxpYiBoZWFkZXIgKi9cbiAgICAgIGlmIChzdGF0ZS5oZWFkKSB7XG4gICAgICAgIHN0YXRlLmhlYWQuZG9uZSA9IGZhbHNlO1xuICAgICAgfVxuICAgICAgaWYgKCEoc3RhdGUud3JhcCAmIDEpIHx8ICAgLyogY2hlY2sgaWYgemxpYiBoZWFkZXIgYWxsb3dlZCAqL1xuICAgICAgICAoKChob2xkICYgMHhmZikvKkJJVFMoOCkqLyA8PCA4KSArIChob2xkID4+IDgpKSAlIDMxKSB7XG4gICAgICAgIHN0cm0ubXNnID0gJ2luY29ycmVjdCBoZWFkZXIgY2hlY2snO1xuICAgICAgICBzdGF0ZS5tb2RlID0gQkFEO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGlmICgoaG9sZCAmIDB4MGYpLypCSVRTKDQpKi8gIT09IFpfREVGTEFURUQpIHtcbiAgICAgICAgc3RybS5tc2cgPSAndW5rbm93biBjb21wcmVzc2lvbiBtZXRob2QnO1xuICAgICAgICBzdGF0ZS5tb2RlID0gQkFEO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIC8vLS0tIERST1BCSVRTKDQpIC0tLS8vXG4gICAgICBob2xkID4+Pj0gNDtcbiAgICAgIGJpdHMgLT0gNDtcbiAgICAgIC8vLS0tLy9cbiAgICAgIGxlbiA9IChob2xkICYgMHgwZikvKkJJVFMoNCkqLyArIDg7XG4gICAgICBpZiAoc3RhdGUud2JpdHMgPT09IDApIHtcbiAgICAgICAgc3RhdGUud2JpdHMgPSBsZW47XG4gICAgICB9XG4gICAgICBlbHNlIGlmIChsZW4gPiBzdGF0ZS53Yml0cykge1xuICAgICAgICBzdHJtLm1zZyA9ICdpbnZhbGlkIHdpbmRvdyBzaXplJztcbiAgICAgICAgc3RhdGUubW9kZSA9IEJBRDtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBzdGF0ZS5kbWF4ID0gMSA8PCBsZW47XG4gICAgICAvL1RyYWNldigoc3RkZXJyLCBcImluZmxhdGU6ICAgemxpYiBoZWFkZXIgb2tcXG5cIikpO1xuICAgICAgc3RybS5hZGxlciA9IHN0YXRlLmNoZWNrID0gMS8qYWRsZXIzMigwTCwgWl9OVUxMLCAwKSovO1xuICAgICAgc3RhdGUubW9kZSA9IGhvbGQgJiAweDIwMCA/IERJQ1RJRCA6IFRZUEU7XG4gICAgICAvLz09PSBJTklUQklUUygpO1xuICAgICAgaG9sZCA9IDA7XG4gICAgICBiaXRzID0gMDtcbiAgICAgIC8vPT09Ly9cbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgRkxBR1M6XG4gICAgICAvLz09PSBORUVEQklUUygxNik7ICovXG4gICAgICB3aGlsZSAoYml0cyA8IDE2KSB7XG4gICAgICAgIGlmIChoYXZlID09PSAwKSB7IGJyZWFrIGluZl9sZWF2ZTsgfVxuICAgICAgICBoYXZlLS07XG4gICAgICAgIGhvbGQgKz0gaW5wdXRbbmV4dCsrXSA8PCBiaXRzO1xuICAgICAgICBiaXRzICs9IDg7XG4gICAgICB9XG4gICAgICAvLz09PS8vXG4gICAgICBzdGF0ZS5mbGFncyA9IGhvbGQ7XG4gICAgICBpZiAoKHN0YXRlLmZsYWdzICYgMHhmZikgIT09IFpfREVGTEFURUQpIHtcbiAgICAgICAgc3RybS5tc2cgPSAndW5rbm93biBjb21wcmVzc2lvbiBtZXRob2QnO1xuICAgICAgICBzdGF0ZS5tb2RlID0gQkFEO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGlmIChzdGF0ZS5mbGFncyAmIDB4ZTAwMCkge1xuICAgICAgICBzdHJtLm1zZyA9ICd1bmtub3duIGhlYWRlciBmbGFncyBzZXQnO1xuICAgICAgICBzdGF0ZS5tb2RlID0gQkFEO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGlmIChzdGF0ZS5oZWFkKSB7XG4gICAgICAgIHN0YXRlLmhlYWQudGV4dCA9ICgoaG9sZCA+PiA4KSAmIDEpO1xuICAgICAgfVxuICAgICAgaWYgKHN0YXRlLmZsYWdzICYgMHgwMjAwKSB7XG4gICAgICAgIC8vPT09IENSQzIoc3RhdGUuY2hlY2ssIGhvbGQpO1xuICAgICAgICBoYnVmWzBdID0gaG9sZCAmIDB4ZmY7XG4gICAgICAgIGhidWZbMV0gPSAoaG9sZCA+Pj4gOCkgJiAweGZmO1xuICAgICAgICBzdGF0ZS5jaGVjayA9IGNyYzMyKHN0YXRlLmNoZWNrLCBoYnVmLCAyLCAwKTtcbiAgICAgICAgLy89PT0vL1xuICAgICAgfVxuICAgICAgLy89PT0gSU5JVEJJVFMoKTtcbiAgICAgIGhvbGQgPSAwO1xuICAgICAgYml0cyA9IDA7XG4gICAgICAvLz09PS8vXG4gICAgICBzdGF0ZS5tb2RlID0gVElNRTtcbiAgICAgIC8qIGZhbGxzIHRocm91Z2ggKi9cbiAgICBjYXNlIFRJTUU6XG4gICAgICAvLz09PSBORUVEQklUUygzMik7ICovXG4gICAgICB3aGlsZSAoYml0cyA8IDMyKSB7XG4gICAgICAgIGlmIChoYXZlID09PSAwKSB7IGJyZWFrIGluZl9sZWF2ZTsgfVxuICAgICAgICBoYXZlLS07XG4gICAgICAgIGhvbGQgKz0gaW5wdXRbbmV4dCsrXSA8PCBiaXRzO1xuICAgICAgICBiaXRzICs9IDg7XG4gICAgICB9XG4gICAgICAvLz09PS8vXG4gICAgICBpZiAoc3RhdGUuaGVhZCkge1xuICAgICAgICBzdGF0ZS5oZWFkLnRpbWUgPSBob2xkO1xuICAgICAgfVxuICAgICAgaWYgKHN0YXRlLmZsYWdzICYgMHgwMjAwKSB7XG4gICAgICAgIC8vPT09IENSQzQoc3RhdGUuY2hlY2ssIGhvbGQpXG4gICAgICAgIGhidWZbMF0gPSBob2xkICYgMHhmZjtcbiAgICAgICAgaGJ1ZlsxXSA9IChob2xkID4+PiA4KSAmIDB4ZmY7XG4gICAgICAgIGhidWZbMl0gPSAoaG9sZCA+Pj4gMTYpICYgMHhmZjtcbiAgICAgICAgaGJ1ZlszXSA9IChob2xkID4+PiAyNCkgJiAweGZmO1xuICAgICAgICBzdGF0ZS5jaGVjayA9IGNyYzMyKHN0YXRlLmNoZWNrLCBoYnVmLCA0LCAwKTtcbiAgICAgICAgLy89PT1cbiAgICAgIH1cbiAgICAgIC8vPT09IElOSVRCSVRTKCk7XG4gICAgICBob2xkID0gMDtcbiAgICAgIGJpdHMgPSAwO1xuICAgICAgLy89PT0vL1xuICAgICAgc3RhdGUubW9kZSA9IE9TO1xuICAgICAgLyogZmFsbHMgdGhyb3VnaCAqL1xuICAgIGNhc2UgT1M6XG4gICAgICAvLz09PSBORUVEQklUUygxNik7ICovXG4gICAgICB3aGlsZSAoYml0cyA8IDE2KSB7XG4gICAgICAgIGlmIChoYXZlID09PSAwKSB7IGJyZWFrIGluZl9sZWF2ZTsgfVxuICAgICAgICBoYXZlLS07XG4gICAgICAgIGhvbGQgKz0gaW5wdXRbbmV4dCsrXSA8PCBiaXRzO1xuICAgICAgICBiaXRzICs9IDg7XG4gICAgICB9XG4gICAgICAvLz09PS8vXG4gICAgICBpZiAoc3RhdGUuaGVhZCkge1xuICAgICAgICBzdGF0ZS5oZWFkLnhmbGFncyA9IChob2xkICYgMHhmZik7XG4gICAgICAgIHN0YXRlLmhlYWQub3MgPSAoaG9sZCA+PiA4KTtcbiAgICAgIH1cbiAgICAgIGlmIChzdGF0ZS5mbGFncyAmIDB4MDIwMCkge1xuICAgICAgICAvLz09PSBDUkMyKHN0YXRlLmNoZWNrLCBob2xkKTtcbiAgICAgICAgaGJ1ZlswXSA9IGhvbGQgJiAweGZmO1xuICAgICAgICBoYnVmWzFdID0gKGhvbGQgPj4+IDgpICYgMHhmZjtcbiAgICAgICAgc3RhdGUuY2hlY2sgPSBjcmMzMihzdGF0ZS5jaGVjaywgaGJ1ZiwgMiwgMCk7XG4gICAgICAgIC8vPT09Ly9cbiAgICAgIH1cbiAgICAgIC8vPT09IElOSVRCSVRTKCk7XG4gICAgICBob2xkID0gMDtcbiAgICAgIGJpdHMgPSAwO1xuICAgICAgLy89PT0vL1xuICAgICAgc3RhdGUubW9kZSA9IEVYTEVOO1xuICAgICAgLyogZmFsbHMgdGhyb3VnaCAqL1xuICAgIGNhc2UgRVhMRU46XG4gICAgICBpZiAoc3RhdGUuZmxhZ3MgJiAweDA0MDApIHtcbiAgICAgICAgLy89PT0gTkVFREJJVFMoMTYpOyAqL1xuICAgICAgICB3aGlsZSAoYml0cyA8IDE2KSB7XG4gICAgICAgICAgaWYgKGhhdmUgPT09IDApIHsgYnJlYWsgaW5mX2xlYXZlOyB9XG4gICAgICAgICAgaGF2ZS0tO1xuICAgICAgICAgIGhvbGQgKz0gaW5wdXRbbmV4dCsrXSA8PCBiaXRzO1xuICAgICAgICAgIGJpdHMgKz0gODtcbiAgICAgICAgfVxuICAgICAgICAvLz09PS8vXG4gICAgICAgIHN0YXRlLmxlbmd0aCA9IGhvbGQ7XG4gICAgICAgIGlmIChzdGF0ZS5oZWFkKSB7XG4gICAgICAgICAgc3RhdGUuaGVhZC5leHRyYV9sZW4gPSBob2xkO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzdGF0ZS5mbGFncyAmIDB4MDIwMCkge1xuICAgICAgICAgIC8vPT09IENSQzIoc3RhdGUuY2hlY2ssIGhvbGQpO1xuICAgICAgICAgIGhidWZbMF0gPSBob2xkICYgMHhmZjtcbiAgICAgICAgICBoYnVmWzFdID0gKGhvbGQgPj4+IDgpICYgMHhmZjtcbiAgICAgICAgICBzdGF0ZS5jaGVjayA9IGNyYzMyKHN0YXRlLmNoZWNrLCBoYnVmLCAyLCAwKTtcbiAgICAgICAgICAvLz09PS8vXG4gICAgICAgIH1cbiAgICAgICAgLy89PT0gSU5JVEJJVFMoKTtcbiAgICAgICAgaG9sZCA9IDA7XG4gICAgICAgIGJpdHMgPSAwO1xuICAgICAgICAvLz09PS8vXG4gICAgICB9XG4gICAgICBlbHNlIGlmIChzdGF0ZS5oZWFkKSB7XG4gICAgICAgIHN0YXRlLmhlYWQuZXh0cmEgPSBudWxsLypaX05VTEwqLztcbiAgICAgIH1cbiAgICAgIHN0YXRlLm1vZGUgPSBFWFRSQTtcbiAgICAgIC8qIGZhbGxzIHRocm91Z2ggKi9cbiAgICBjYXNlIEVYVFJBOlxuICAgICAgaWYgKHN0YXRlLmZsYWdzICYgMHgwNDAwKSB7XG4gICAgICAgIGNvcHkgPSBzdGF0ZS5sZW5ndGg7XG4gICAgICAgIGlmIChjb3B5ID4gaGF2ZSkgeyBjb3B5ID0gaGF2ZTsgfVxuICAgICAgICBpZiAoY29weSkge1xuICAgICAgICAgIGlmIChzdGF0ZS5oZWFkKSB7XG4gICAgICAgICAgICBsZW4gPSBzdGF0ZS5oZWFkLmV4dHJhX2xlbiAtIHN0YXRlLmxlbmd0aDtcbiAgICAgICAgICAgIGlmICghc3RhdGUuaGVhZC5leHRyYSkge1xuICAgICAgICAgICAgICAvLyBVc2UgdW50eXBlZCBhcnJheSBmb3IgbW9yZSBjb252ZW5pZW5kIHByb2Nlc3NpbmcgbGF0ZXJcbiAgICAgICAgICAgICAgc3RhdGUuaGVhZC5leHRyYSA9IG5ldyBBcnJheShzdGF0ZS5oZWFkLmV4dHJhX2xlbik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB1dGlscy5hcnJheVNldChcbiAgICAgICAgICAgICAgc3RhdGUuaGVhZC5leHRyYSxcbiAgICAgICAgICAgICAgaW5wdXQsXG4gICAgICAgICAgICAgIG5leHQsXG4gICAgICAgICAgICAgIC8vIGV4dHJhIGZpZWxkIGlzIGxpbWl0ZWQgdG8gNjU1MzYgYnl0ZXNcbiAgICAgICAgICAgICAgLy8gLSBubyBuZWVkIGZvciBhZGRpdGlvbmFsIHNpemUgY2hlY2tcbiAgICAgICAgICAgICAgY29weSxcbiAgICAgICAgICAgICAgLypsZW4gKyBjb3B5ID4gc3RhdGUuaGVhZC5leHRyYV9tYXggLSBsZW4gPyBzdGF0ZS5oZWFkLmV4dHJhX21heCA6IGNvcHksKi9cbiAgICAgICAgICAgICAgbGVuXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgLy96bWVtY3B5KHN0YXRlLmhlYWQuZXh0cmEgKyBsZW4sIG5leHQsXG4gICAgICAgICAgICAvLyAgICAgICAgbGVuICsgY29weSA+IHN0YXRlLmhlYWQuZXh0cmFfbWF4ID9cbiAgICAgICAgICAgIC8vICAgICAgICBzdGF0ZS5oZWFkLmV4dHJhX21heCAtIGxlbiA6IGNvcHkpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoc3RhdGUuZmxhZ3MgJiAweDAyMDApIHtcbiAgICAgICAgICAgIHN0YXRlLmNoZWNrID0gY3JjMzIoc3RhdGUuY2hlY2ssIGlucHV0LCBjb3B5LCBuZXh0KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaGF2ZSAtPSBjb3B5O1xuICAgICAgICAgIG5leHQgKz0gY29weTtcbiAgICAgICAgICBzdGF0ZS5sZW5ndGggLT0gY29weTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoc3RhdGUubGVuZ3RoKSB7IGJyZWFrIGluZl9sZWF2ZTsgfVxuICAgICAgfVxuICAgICAgc3RhdGUubGVuZ3RoID0gMDtcbiAgICAgIHN0YXRlLm1vZGUgPSBOQU1FO1xuICAgICAgLyogZmFsbHMgdGhyb3VnaCAqL1xuICAgIGNhc2UgTkFNRTpcbiAgICAgIGlmIChzdGF0ZS5mbGFncyAmIDB4MDgwMCkge1xuICAgICAgICBpZiAoaGF2ZSA9PT0gMCkgeyBicmVhayBpbmZfbGVhdmU7IH1cbiAgICAgICAgY29weSA9IDA7XG4gICAgICAgIGRvIHtcbiAgICAgICAgICAvLyBUT0RPOiAyIG9yIDEgYnl0ZXM/XG4gICAgICAgICAgbGVuID0gaW5wdXRbbmV4dCArIGNvcHkrK107XG4gICAgICAgICAgLyogdXNlIGNvbnN0YW50IGxpbWl0IGJlY2F1c2UgaW4ganMgd2Ugc2hvdWxkIG5vdCBwcmVhbGxvY2F0ZSBtZW1vcnkgKi9cbiAgICAgICAgICBpZiAoc3RhdGUuaGVhZCAmJiBsZW4gJiZcbiAgICAgICAgICAgICAgKHN0YXRlLmxlbmd0aCA8IDY1NTM2IC8qc3RhdGUuaGVhZC5uYW1lX21heCovKSkge1xuICAgICAgICAgICAgc3RhdGUuaGVhZC5uYW1lICs9IFN0cmluZy5mcm9tQ2hhckNvZGUobGVuKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gd2hpbGUgKGxlbiAmJiBjb3B5IDwgaGF2ZSk7XG5cbiAgICAgICAgaWYgKHN0YXRlLmZsYWdzICYgMHgwMjAwKSB7XG4gICAgICAgICAgc3RhdGUuY2hlY2sgPSBjcmMzMihzdGF0ZS5jaGVjaywgaW5wdXQsIGNvcHksIG5leHQpO1xuICAgICAgICB9XG4gICAgICAgIGhhdmUgLT0gY29weTtcbiAgICAgICAgbmV4dCArPSBjb3B5O1xuICAgICAgICBpZiAobGVuKSB7IGJyZWFrIGluZl9sZWF2ZTsgfVxuICAgICAgfVxuICAgICAgZWxzZSBpZiAoc3RhdGUuaGVhZCkge1xuICAgICAgICBzdGF0ZS5oZWFkLm5hbWUgPSBudWxsO1xuICAgICAgfVxuICAgICAgc3RhdGUubGVuZ3RoID0gMDtcbiAgICAgIHN0YXRlLm1vZGUgPSBDT01NRU5UO1xuICAgICAgLyogZmFsbHMgdGhyb3VnaCAqL1xuICAgIGNhc2UgQ09NTUVOVDpcbiAgICAgIGlmIChzdGF0ZS5mbGFncyAmIDB4MTAwMCkge1xuICAgICAgICBpZiAoaGF2ZSA9PT0gMCkgeyBicmVhayBpbmZfbGVhdmU7IH1cbiAgICAgICAgY29weSA9IDA7XG4gICAgICAgIGRvIHtcbiAgICAgICAgICBsZW4gPSBpbnB1dFtuZXh0ICsgY29weSsrXTtcbiAgICAgICAgICAvKiB1c2UgY29uc3RhbnQgbGltaXQgYmVjYXVzZSBpbiBqcyB3ZSBzaG91bGQgbm90IHByZWFsbG9jYXRlIG1lbW9yeSAqL1xuICAgICAgICAgIGlmIChzdGF0ZS5oZWFkICYmIGxlbiAmJlxuICAgICAgICAgICAgICAoc3RhdGUubGVuZ3RoIDwgNjU1MzYgLypzdGF0ZS5oZWFkLmNvbW1fbWF4Ki8pKSB7XG4gICAgICAgICAgICBzdGF0ZS5oZWFkLmNvbW1lbnQgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShsZW4pO1xuICAgICAgICAgIH1cbiAgICAgICAgfSB3aGlsZSAobGVuICYmIGNvcHkgPCBoYXZlKTtcbiAgICAgICAgaWYgKHN0YXRlLmZsYWdzICYgMHgwMjAwKSB7XG4gICAgICAgICAgc3RhdGUuY2hlY2sgPSBjcmMzMihzdGF0ZS5jaGVjaywgaW5wdXQsIGNvcHksIG5leHQpO1xuICAgICAgICB9XG4gICAgICAgIGhhdmUgLT0gY29weTtcbiAgICAgICAgbmV4dCArPSBjb3B5O1xuICAgICAgICBpZiAobGVuKSB7IGJyZWFrIGluZl9sZWF2ZTsgfVxuICAgICAgfVxuICAgICAgZWxzZSBpZiAoc3RhdGUuaGVhZCkge1xuICAgICAgICBzdGF0ZS5oZWFkLmNvbW1lbnQgPSBudWxsO1xuICAgICAgfVxuICAgICAgc3RhdGUubW9kZSA9IEhDUkM7XG4gICAgICAvKiBmYWxscyB0aHJvdWdoICovXG4gICAgY2FzZSBIQ1JDOlxuICAgICAgaWYgKHN0YXRlLmZsYWdzICYgMHgwMjAwKSB7XG4gICAgICAgIC8vPT09IE5FRURCSVRTKDE2KTsgKi9cbiAgICAgICAgd2hpbGUgKGJpdHMgPCAxNikge1xuICAgICAgICAgIGlmIChoYXZlID09PSAwKSB7IGJyZWFrIGluZl9sZWF2ZTsgfVxuICAgICAgICAgIGhhdmUtLTtcbiAgICAgICAgICBob2xkICs9IGlucHV0W25leHQrK10gPDwgYml0cztcbiAgICAgICAgICBiaXRzICs9IDg7XG4gICAgICAgIH1cbiAgICAgICAgLy89PT0vL1xuICAgICAgICBpZiAoaG9sZCAhPT0gKHN0YXRlLmNoZWNrICYgMHhmZmZmKSkge1xuICAgICAgICAgIHN0cm0ubXNnID0gJ2hlYWRlciBjcmMgbWlzbWF0Y2gnO1xuICAgICAgICAgIHN0YXRlLm1vZGUgPSBCQUQ7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgLy89PT0gSU5JVEJJVFMoKTtcbiAgICAgICAgaG9sZCA9IDA7XG4gICAgICAgIGJpdHMgPSAwO1xuICAgICAgICAvLz09PS8vXG4gICAgICB9XG4gICAgICBpZiAoc3RhdGUuaGVhZCkge1xuICAgICAgICBzdGF0ZS5oZWFkLmhjcmMgPSAoKHN0YXRlLmZsYWdzID4+IDkpICYgMSk7XG4gICAgICAgIHN0YXRlLmhlYWQuZG9uZSA9IHRydWU7XG4gICAgICB9XG4gICAgICBzdHJtLmFkbGVyID0gc3RhdGUuY2hlY2sgPSAwO1xuICAgICAgc3RhdGUubW9kZSA9IFRZUEU7XG4gICAgICBicmVhaztcbiAgICBjYXNlIERJQ1RJRDpcbiAgICAgIC8vPT09IE5FRURCSVRTKDMyKTsgKi9cbiAgICAgIHdoaWxlIChiaXRzIDwgMzIpIHtcbiAgICAgICAgaWYgKGhhdmUgPT09IDApIHsgYnJlYWsgaW5mX2xlYXZlOyB9XG4gICAgICAgIGhhdmUtLTtcbiAgICAgICAgaG9sZCArPSBpbnB1dFtuZXh0KytdIDw8IGJpdHM7XG4gICAgICAgIGJpdHMgKz0gODtcbiAgICAgIH1cbiAgICAgIC8vPT09Ly9cbiAgICAgIHN0cm0uYWRsZXIgPSBzdGF0ZS5jaGVjayA9IHpzd2FwMzIoaG9sZCk7XG4gICAgICAvLz09PSBJTklUQklUUygpO1xuICAgICAgaG9sZCA9IDA7XG4gICAgICBiaXRzID0gMDtcbiAgICAgIC8vPT09Ly9cbiAgICAgIHN0YXRlLm1vZGUgPSBESUNUO1xuICAgICAgLyogZmFsbHMgdGhyb3VnaCAqL1xuICAgIGNhc2UgRElDVDpcbiAgICAgIGlmIChzdGF0ZS5oYXZlZGljdCA9PT0gMCkge1xuICAgICAgICAvLy0tLSBSRVNUT1JFKCkgLS0tXG4gICAgICAgIHN0cm0ubmV4dF9vdXQgPSBwdXQ7XG4gICAgICAgIHN0cm0uYXZhaWxfb3V0ID0gbGVmdDtcbiAgICAgICAgc3RybS5uZXh0X2luID0gbmV4dDtcbiAgICAgICAgc3RybS5hdmFpbF9pbiA9IGhhdmU7XG4gICAgICAgIHN0YXRlLmhvbGQgPSBob2xkO1xuICAgICAgICBzdGF0ZS5iaXRzID0gYml0cztcbiAgICAgICAgLy8tLS1cbiAgICAgICAgcmV0dXJuIFpfTkVFRF9ESUNUO1xuICAgICAgfVxuICAgICAgc3RybS5hZGxlciA9IHN0YXRlLmNoZWNrID0gMS8qYWRsZXIzMigwTCwgWl9OVUxMLCAwKSovO1xuICAgICAgc3RhdGUubW9kZSA9IFRZUEU7XG4gICAgICAvKiBmYWxscyB0aHJvdWdoICovXG4gICAgY2FzZSBUWVBFOlxuICAgICAgaWYgKGZsdXNoID09PSBaX0JMT0NLIHx8IGZsdXNoID09PSBaX1RSRUVTKSB7IGJyZWFrIGluZl9sZWF2ZTsgfVxuICAgICAgLyogZmFsbHMgdGhyb3VnaCAqL1xuICAgIGNhc2UgVFlQRURPOlxuICAgICAgaWYgKHN0YXRlLmxhc3QpIHtcbiAgICAgICAgLy8tLS0gQllURUJJVFMoKSAtLS0vL1xuICAgICAgICBob2xkID4+Pj0gYml0cyAmIDc7XG4gICAgICAgIGJpdHMgLT0gYml0cyAmIDc7XG4gICAgICAgIC8vLS0tLy9cbiAgICAgICAgc3RhdGUubW9kZSA9IENIRUNLO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIC8vPT09IE5FRURCSVRTKDMpOyAqL1xuICAgICAgd2hpbGUgKGJpdHMgPCAzKSB7XG4gICAgICAgIGlmIChoYXZlID09PSAwKSB7IGJyZWFrIGluZl9sZWF2ZTsgfVxuICAgICAgICBoYXZlLS07XG4gICAgICAgIGhvbGQgKz0gaW5wdXRbbmV4dCsrXSA8PCBiaXRzO1xuICAgICAgICBiaXRzICs9IDg7XG4gICAgICB9XG4gICAgICAvLz09PS8vXG4gICAgICBzdGF0ZS5sYXN0ID0gKGhvbGQgJiAweDAxKS8qQklUUygxKSovO1xuICAgICAgLy8tLS0gRFJPUEJJVFMoMSkgLS0tLy9cbiAgICAgIGhvbGQgPj4+PSAxO1xuICAgICAgYml0cyAtPSAxO1xuICAgICAgLy8tLS0vL1xuXG4gICAgICBzd2l0Y2ggKChob2xkICYgMHgwMykvKkJJVFMoMikqLykge1xuICAgICAgY2FzZSAwOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc3RvcmVkIGJsb2NrICovXG4gICAgICAgIC8vVHJhY2V2KChzdGRlcnIsIFwiaW5mbGF0ZTogICAgIHN0b3JlZCBibG9jayVzXFxuXCIsXG4gICAgICAgIC8vICAgICAgICBzdGF0ZS5sYXN0ID8gXCIgKGxhc3QpXCIgOiBcIlwiKSk7XG4gICAgICAgIHN0YXRlLm1vZGUgPSBTVE9SRUQ7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAxOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZml4ZWQgYmxvY2sgKi9cbiAgICAgICAgZml4ZWR0YWJsZXMoc3RhdGUpO1xuICAgICAgICAvL1RyYWNldigoc3RkZXJyLCBcImluZmxhdGU6ICAgICBmaXhlZCBjb2RlcyBibG9jayVzXFxuXCIsXG4gICAgICAgIC8vICAgICAgICBzdGF0ZS5sYXN0ID8gXCIgKGxhc3QpXCIgOiBcIlwiKSk7XG4gICAgICAgIHN0YXRlLm1vZGUgPSBMRU5fOyAgICAgICAgICAgICAvKiBkZWNvZGUgY29kZXMgKi9cbiAgICAgICAgaWYgKGZsdXNoID09PSBaX1RSRUVTKSB7XG4gICAgICAgICAgLy8tLS0gRFJPUEJJVFMoMikgLS0tLy9cbiAgICAgICAgICBob2xkID4+Pj0gMjtcbiAgICAgICAgICBiaXRzIC09IDI7XG4gICAgICAgICAgLy8tLS0vL1xuICAgICAgICAgIGJyZWFrIGluZl9sZWF2ZTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgMjogICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGR5bmFtaWMgYmxvY2sgKi9cbiAgICAgICAgLy9UcmFjZXYoKHN0ZGVyciwgXCJpbmZsYXRlOiAgICAgZHluYW1pYyBjb2RlcyBibG9jayVzXFxuXCIsXG4gICAgICAgIC8vICAgICAgICBzdGF0ZS5sYXN0ID8gXCIgKGxhc3QpXCIgOiBcIlwiKSk7XG4gICAgICAgIHN0YXRlLm1vZGUgPSBUQUJMRTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIDM6XG4gICAgICAgIHN0cm0ubXNnID0gJ2ludmFsaWQgYmxvY2sgdHlwZSc7XG4gICAgICAgIHN0YXRlLm1vZGUgPSBCQUQ7XG4gICAgICB9XG4gICAgICAvLy0tLSBEUk9QQklUUygyKSAtLS0vL1xuICAgICAgaG9sZCA+Pj49IDI7XG4gICAgICBiaXRzIC09IDI7XG4gICAgICAvLy0tLS8vXG4gICAgICBicmVhaztcbiAgICBjYXNlIFNUT1JFRDpcbiAgICAgIC8vLS0tIEJZVEVCSVRTKCkgLS0tLy8gLyogZ28gdG8gYnl0ZSBib3VuZGFyeSAqL1xuICAgICAgaG9sZCA+Pj49IGJpdHMgJiA3O1xuICAgICAgYml0cyAtPSBiaXRzICYgNztcbiAgICAgIC8vLS0tLy9cbiAgICAgIC8vPT09IE5FRURCSVRTKDMyKTsgKi9cbiAgICAgIHdoaWxlIChiaXRzIDwgMzIpIHtcbiAgICAgICAgaWYgKGhhdmUgPT09IDApIHsgYnJlYWsgaW5mX2xlYXZlOyB9XG4gICAgICAgIGhhdmUtLTtcbiAgICAgICAgaG9sZCArPSBpbnB1dFtuZXh0KytdIDw8IGJpdHM7XG4gICAgICAgIGJpdHMgKz0gODtcbiAgICAgIH1cbiAgICAgIC8vPT09Ly9cbiAgICAgIGlmICgoaG9sZCAmIDB4ZmZmZikgIT09ICgoaG9sZCA+Pj4gMTYpIF4gMHhmZmZmKSkge1xuICAgICAgICBzdHJtLm1zZyA9ICdpbnZhbGlkIHN0b3JlZCBibG9jayBsZW5ndGhzJztcbiAgICAgICAgc3RhdGUubW9kZSA9IEJBRDtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBzdGF0ZS5sZW5ndGggPSBob2xkICYgMHhmZmZmO1xuICAgICAgLy9UcmFjZXYoKHN0ZGVyciwgXCJpbmZsYXRlOiAgICAgICBzdG9yZWQgbGVuZ3RoICV1XFxuXCIsXG4gICAgICAvLyAgICAgICAgc3RhdGUubGVuZ3RoKSk7XG4gICAgICAvLz09PSBJTklUQklUUygpO1xuICAgICAgaG9sZCA9IDA7XG4gICAgICBiaXRzID0gMDtcbiAgICAgIC8vPT09Ly9cbiAgICAgIHN0YXRlLm1vZGUgPSBDT1BZXztcbiAgICAgIGlmIChmbHVzaCA9PT0gWl9UUkVFUykgeyBicmVhayBpbmZfbGVhdmU7IH1cbiAgICAgIC8qIGZhbGxzIHRocm91Z2ggKi9cbiAgICBjYXNlIENPUFlfOlxuICAgICAgc3RhdGUubW9kZSA9IENPUFk7XG4gICAgICAvKiBmYWxscyB0aHJvdWdoICovXG4gICAgY2FzZSBDT1BZOlxuICAgICAgY29weSA9IHN0YXRlLmxlbmd0aDtcbiAgICAgIGlmIChjb3B5KSB7XG4gICAgICAgIGlmIChjb3B5ID4gaGF2ZSkgeyBjb3B5ID0gaGF2ZTsgfVxuICAgICAgICBpZiAoY29weSA+IGxlZnQpIHsgY29weSA9IGxlZnQ7IH1cbiAgICAgICAgaWYgKGNvcHkgPT09IDApIHsgYnJlYWsgaW5mX2xlYXZlOyB9XG4gICAgICAgIC8vLS0tIHptZW1jcHkocHV0LCBuZXh0LCBjb3B5KTsgLS0tXG4gICAgICAgIHV0aWxzLmFycmF5U2V0KG91dHB1dCwgaW5wdXQsIG5leHQsIGNvcHksIHB1dCk7XG4gICAgICAgIC8vLS0tLy9cbiAgICAgICAgaGF2ZSAtPSBjb3B5O1xuICAgICAgICBuZXh0ICs9IGNvcHk7XG4gICAgICAgIGxlZnQgLT0gY29weTtcbiAgICAgICAgcHV0ICs9IGNvcHk7XG4gICAgICAgIHN0YXRlLmxlbmd0aCAtPSBjb3B5O1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIC8vVHJhY2V2KChzdGRlcnIsIFwiaW5mbGF0ZTogICAgICAgc3RvcmVkIGVuZFxcblwiKSk7XG4gICAgICBzdGF0ZS5tb2RlID0gVFlQRTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgVEFCTEU6XG4gICAgICAvLz09PSBORUVEQklUUygxNCk7ICovXG4gICAgICB3aGlsZSAoYml0cyA8IDE0KSB7XG4gICAgICAgIGlmIChoYXZlID09PSAwKSB7IGJyZWFrIGluZl9sZWF2ZTsgfVxuICAgICAgICBoYXZlLS07XG4gICAgICAgIGhvbGQgKz0gaW5wdXRbbmV4dCsrXSA8PCBiaXRzO1xuICAgICAgICBiaXRzICs9IDg7XG4gICAgICB9XG4gICAgICAvLz09PS8vXG4gICAgICBzdGF0ZS5ubGVuID0gKGhvbGQgJiAweDFmKS8qQklUUyg1KSovICsgMjU3O1xuICAgICAgLy8tLS0gRFJPUEJJVFMoNSkgLS0tLy9cbiAgICAgIGhvbGQgPj4+PSA1O1xuICAgICAgYml0cyAtPSA1O1xuICAgICAgLy8tLS0vL1xuICAgICAgc3RhdGUubmRpc3QgPSAoaG9sZCAmIDB4MWYpLypCSVRTKDUpKi8gKyAxO1xuICAgICAgLy8tLS0gRFJPUEJJVFMoNSkgLS0tLy9cbiAgICAgIGhvbGQgPj4+PSA1O1xuICAgICAgYml0cyAtPSA1O1xuICAgICAgLy8tLS0vL1xuICAgICAgc3RhdGUubmNvZGUgPSAoaG9sZCAmIDB4MGYpLypCSVRTKDQpKi8gKyA0O1xuICAgICAgLy8tLS0gRFJPUEJJVFMoNCkgLS0tLy9cbiAgICAgIGhvbGQgPj4+PSA0O1xuICAgICAgYml0cyAtPSA0O1xuICAgICAgLy8tLS0vL1xuLy8jaWZuZGVmIFBLWklQX0JVR19XT1JLQVJPVU5EXG4gICAgICBpZiAoc3RhdGUubmxlbiA+IDI4NiB8fCBzdGF0ZS5uZGlzdCA+IDMwKSB7XG4gICAgICAgIHN0cm0ubXNnID0gJ3RvbyBtYW55IGxlbmd0aCBvciBkaXN0YW5jZSBzeW1ib2xzJztcbiAgICAgICAgc3RhdGUubW9kZSA9IEJBRDtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4vLyNlbmRpZlxuICAgICAgLy9UcmFjZXYoKHN0ZGVyciwgXCJpbmZsYXRlOiAgICAgICB0YWJsZSBzaXplcyBva1xcblwiKSk7XG4gICAgICBzdGF0ZS5oYXZlID0gMDtcbiAgICAgIHN0YXRlLm1vZGUgPSBMRU5MRU5TO1xuICAgICAgLyogZmFsbHMgdGhyb3VnaCAqL1xuICAgIGNhc2UgTEVOTEVOUzpcbiAgICAgIHdoaWxlIChzdGF0ZS5oYXZlIDwgc3RhdGUubmNvZGUpIHtcbiAgICAgICAgLy89PT0gTkVFREJJVFMoMyk7XG4gICAgICAgIHdoaWxlIChiaXRzIDwgMykge1xuICAgICAgICAgIGlmIChoYXZlID09PSAwKSB7IGJyZWFrIGluZl9sZWF2ZTsgfVxuICAgICAgICAgIGhhdmUtLTtcbiAgICAgICAgICBob2xkICs9IGlucHV0W25leHQrK10gPDwgYml0cztcbiAgICAgICAgICBiaXRzICs9IDg7XG4gICAgICAgIH1cbiAgICAgICAgLy89PT0vL1xuICAgICAgICBzdGF0ZS5sZW5zW29yZGVyW3N0YXRlLmhhdmUrK11dID0gKGhvbGQgJiAweDA3KTsvL0JJVFMoMyk7XG4gICAgICAgIC8vLS0tIERST1BCSVRTKDMpIC0tLS8vXG4gICAgICAgIGhvbGQgPj4+PSAzO1xuICAgICAgICBiaXRzIC09IDM7XG4gICAgICAgIC8vLS0tLy9cbiAgICAgIH1cbiAgICAgIHdoaWxlIChzdGF0ZS5oYXZlIDwgMTkpIHtcbiAgICAgICAgc3RhdGUubGVuc1tvcmRlcltzdGF0ZS5oYXZlKytdXSA9IDA7XG4gICAgICB9XG4gICAgICAvLyBXZSBoYXZlIHNlcGFyYXRlIHRhYmxlcyAmIG5vIHBvaW50ZXJzLiAyIGNvbW1lbnRlZCBsaW5lcyBiZWxvdyBub3QgbmVlZGVkLlxuICAgICAgLy9zdGF0ZS5uZXh0ID0gc3RhdGUuY29kZXM7XG4gICAgICAvL3N0YXRlLmxlbmNvZGUgPSBzdGF0ZS5uZXh0O1xuICAgICAgLy8gU3dpdGNoIHRvIHVzZSBkeW5hbWljIHRhYmxlXG4gICAgICBzdGF0ZS5sZW5jb2RlID0gc3RhdGUubGVuZHluO1xuICAgICAgc3RhdGUubGVuYml0cyA9IDc7XG5cbiAgICAgIG9wdHMgPSB7IGJpdHM6IHN0YXRlLmxlbmJpdHMgfTtcbiAgICAgIHJldCA9IGluZmxhdGVfdGFibGUoQ09ERVMsIHN0YXRlLmxlbnMsIDAsIDE5LCBzdGF0ZS5sZW5jb2RlLCAwLCBzdGF0ZS53b3JrLCBvcHRzKTtcbiAgICAgIHN0YXRlLmxlbmJpdHMgPSBvcHRzLmJpdHM7XG5cbiAgICAgIGlmIChyZXQpIHtcbiAgICAgICAgc3RybS5tc2cgPSAnaW52YWxpZCBjb2RlIGxlbmd0aHMgc2V0JztcbiAgICAgICAgc3RhdGUubW9kZSA9IEJBRDtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICAvL1RyYWNldigoc3RkZXJyLCBcImluZmxhdGU6ICAgICAgIGNvZGUgbGVuZ3RocyBva1xcblwiKSk7XG4gICAgICBzdGF0ZS5oYXZlID0gMDtcbiAgICAgIHN0YXRlLm1vZGUgPSBDT0RFTEVOUztcbiAgICAgIC8qIGZhbGxzIHRocm91Z2ggKi9cbiAgICBjYXNlIENPREVMRU5TOlxuICAgICAgd2hpbGUgKHN0YXRlLmhhdmUgPCBzdGF0ZS5ubGVuICsgc3RhdGUubmRpc3QpIHtcbiAgICAgICAgZm9yICg7Oykge1xuICAgICAgICAgIGhlcmUgPSBzdGF0ZS5sZW5jb2RlW2hvbGQgJiAoKDEgPDwgc3RhdGUubGVuYml0cykgLSAxKV07LypCSVRTKHN0YXRlLmxlbmJpdHMpKi9cbiAgICAgICAgICBoZXJlX2JpdHMgPSBoZXJlID4+PiAyNDtcbiAgICAgICAgICBoZXJlX29wID0gKGhlcmUgPj4+IDE2KSAmIDB4ZmY7XG4gICAgICAgICAgaGVyZV92YWwgPSBoZXJlICYgMHhmZmZmO1xuXG4gICAgICAgICAgaWYgKChoZXJlX2JpdHMpIDw9IGJpdHMpIHsgYnJlYWs7IH1cbiAgICAgICAgICAvLy0tLSBQVUxMQllURSgpIC0tLS8vXG4gICAgICAgICAgaWYgKGhhdmUgPT09IDApIHsgYnJlYWsgaW5mX2xlYXZlOyB9XG4gICAgICAgICAgaGF2ZS0tO1xuICAgICAgICAgIGhvbGQgKz0gaW5wdXRbbmV4dCsrXSA8PCBiaXRzO1xuICAgICAgICAgIGJpdHMgKz0gODtcbiAgICAgICAgICAvLy0tLS8vXG4gICAgICAgIH1cbiAgICAgICAgaWYgKGhlcmVfdmFsIDwgMTYpIHtcbiAgICAgICAgICAvLy0tLSBEUk9QQklUUyhoZXJlLmJpdHMpIC0tLS8vXG4gICAgICAgICAgaG9sZCA+Pj49IGhlcmVfYml0cztcbiAgICAgICAgICBiaXRzIC09IGhlcmVfYml0cztcbiAgICAgICAgICAvLy0tLS8vXG4gICAgICAgICAgc3RhdGUubGVuc1tzdGF0ZS5oYXZlKytdID0gaGVyZV92YWw7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgaWYgKGhlcmVfdmFsID09PSAxNikge1xuICAgICAgICAgICAgLy89PT0gTkVFREJJVFMoaGVyZS5iaXRzICsgMik7XG4gICAgICAgICAgICBuID0gaGVyZV9iaXRzICsgMjtcbiAgICAgICAgICAgIHdoaWxlIChiaXRzIDwgbikge1xuICAgICAgICAgICAgICBpZiAoaGF2ZSA9PT0gMCkgeyBicmVhayBpbmZfbGVhdmU7IH1cbiAgICAgICAgICAgICAgaGF2ZS0tO1xuICAgICAgICAgICAgICBob2xkICs9IGlucHV0W25leHQrK10gPDwgYml0cztcbiAgICAgICAgICAgICAgYml0cyArPSA4O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy89PT0vL1xuICAgICAgICAgICAgLy8tLS0gRFJPUEJJVFMoaGVyZS5iaXRzKSAtLS0vL1xuICAgICAgICAgICAgaG9sZCA+Pj49IGhlcmVfYml0cztcbiAgICAgICAgICAgIGJpdHMgLT0gaGVyZV9iaXRzO1xuICAgICAgICAgICAgLy8tLS0vL1xuICAgICAgICAgICAgaWYgKHN0YXRlLmhhdmUgPT09IDApIHtcbiAgICAgICAgICAgICAgc3RybS5tc2cgPSAnaW52YWxpZCBiaXQgbGVuZ3RoIHJlcGVhdCc7XG4gICAgICAgICAgICAgIHN0YXRlLm1vZGUgPSBCQUQ7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGVuID0gc3RhdGUubGVuc1tzdGF0ZS5oYXZlIC0gMV07XG4gICAgICAgICAgICBjb3B5ID0gMyArIChob2xkICYgMHgwMyk7Ly9CSVRTKDIpO1xuICAgICAgICAgICAgLy8tLS0gRFJPUEJJVFMoMikgLS0tLy9cbiAgICAgICAgICAgIGhvbGQgPj4+PSAyO1xuICAgICAgICAgICAgYml0cyAtPSAyO1xuICAgICAgICAgICAgLy8tLS0vL1xuICAgICAgICAgIH1cbiAgICAgICAgICBlbHNlIGlmIChoZXJlX3ZhbCA9PT0gMTcpIHtcbiAgICAgICAgICAgIC8vPT09IE5FRURCSVRTKGhlcmUuYml0cyArIDMpO1xuICAgICAgICAgICAgbiA9IGhlcmVfYml0cyArIDM7XG4gICAgICAgICAgICB3aGlsZSAoYml0cyA8IG4pIHtcbiAgICAgICAgICAgICAgaWYgKGhhdmUgPT09IDApIHsgYnJlYWsgaW5mX2xlYXZlOyB9XG4gICAgICAgICAgICAgIGhhdmUtLTtcbiAgICAgICAgICAgICAgaG9sZCArPSBpbnB1dFtuZXh0KytdIDw8IGJpdHM7XG4gICAgICAgICAgICAgIGJpdHMgKz0gODtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vPT09Ly9cbiAgICAgICAgICAgIC8vLS0tIERST1BCSVRTKGhlcmUuYml0cykgLS0tLy9cbiAgICAgICAgICAgIGhvbGQgPj4+PSBoZXJlX2JpdHM7XG4gICAgICAgICAgICBiaXRzIC09IGhlcmVfYml0cztcbiAgICAgICAgICAgIC8vLS0tLy9cbiAgICAgICAgICAgIGxlbiA9IDA7XG4gICAgICAgICAgICBjb3B5ID0gMyArIChob2xkICYgMHgwNyk7Ly9CSVRTKDMpO1xuICAgICAgICAgICAgLy8tLS0gRFJPUEJJVFMoMykgLS0tLy9cbiAgICAgICAgICAgIGhvbGQgPj4+PSAzO1xuICAgICAgICAgICAgYml0cyAtPSAzO1xuICAgICAgICAgICAgLy8tLS0vL1xuICAgICAgICAgIH1cbiAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIC8vPT09IE5FRURCSVRTKGhlcmUuYml0cyArIDcpO1xuICAgICAgICAgICAgbiA9IGhlcmVfYml0cyArIDc7XG4gICAgICAgICAgICB3aGlsZSAoYml0cyA8IG4pIHtcbiAgICAgICAgICAgICAgaWYgKGhhdmUgPT09IDApIHsgYnJlYWsgaW5mX2xlYXZlOyB9XG4gICAgICAgICAgICAgIGhhdmUtLTtcbiAgICAgICAgICAgICAgaG9sZCArPSBpbnB1dFtuZXh0KytdIDw8IGJpdHM7XG4gICAgICAgICAgICAgIGJpdHMgKz0gODtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vPT09Ly9cbiAgICAgICAgICAgIC8vLS0tIERST1BCSVRTKGhlcmUuYml0cykgLS0tLy9cbiAgICAgICAgICAgIGhvbGQgPj4+PSBoZXJlX2JpdHM7XG4gICAgICAgICAgICBiaXRzIC09IGhlcmVfYml0cztcbiAgICAgICAgICAgIC8vLS0tLy9cbiAgICAgICAgICAgIGxlbiA9IDA7XG4gICAgICAgICAgICBjb3B5ID0gMTEgKyAoaG9sZCAmIDB4N2YpOy8vQklUUyg3KTtcbiAgICAgICAgICAgIC8vLS0tIERST1BCSVRTKDcpIC0tLS8vXG4gICAgICAgICAgICBob2xkID4+Pj0gNztcbiAgICAgICAgICAgIGJpdHMgLT0gNztcbiAgICAgICAgICAgIC8vLS0tLy9cbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHN0YXRlLmhhdmUgKyBjb3B5ID4gc3RhdGUubmxlbiArIHN0YXRlLm5kaXN0KSB7XG4gICAgICAgICAgICBzdHJtLm1zZyA9ICdpbnZhbGlkIGJpdCBsZW5ndGggcmVwZWF0JztcbiAgICAgICAgICAgIHN0YXRlLm1vZGUgPSBCQUQ7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgICAgd2hpbGUgKGNvcHktLSkge1xuICAgICAgICAgICAgc3RhdGUubGVuc1tzdGF0ZS5oYXZlKytdID0gbGVuO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvKiBoYW5kbGUgZXJyb3IgYnJlYWtzIGluIHdoaWxlICovXG4gICAgICBpZiAoc3RhdGUubW9kZSA9PT0gQkFEKSB7IGJyZWFrOyB9XG5cbiAgICAgIC8qIGNoZWNrIGZvciBlbmQtb2YtYmxvY2sgY29kZSAoYmV0dGVyIGhhdmUgb25lKSAqL1xuICAgICAgaWYgKHN0YXRlLmxlbnNbMjU2XSA9PT0gMCkge1xuICAgICAgICBzdHJtLm1zZyA9ICdpbnZhbGlkIGNvZGUgLS0gbWlzc2luZyBlbmQtb2YtYmxvY2snO1xuICAgICAgICBzdGF0ZS5tb2RlID0gQkFEO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgICAgLyogYnVpbGQgY29kZSB0YWJsZXMgLS0gbm90ZTogZG8gbm90IGNoYW5nZSB0aGUgbGVuYml0cyBvciBkaXN0Yml0c1xuICAgICAgICAgdmFsdWVzIGhlcmUgKDkgYW5kIDYpIHdpdGhvdXQgcmVhZGluZyB0aGUgY29tbWVudHMgaW4gaW5mdHJlZXMuaFxuICAgICAgICAgY29uY2VybmluZyB0aGUgRU5PVUdIIGNvbnN0YW50cywgd2hpY2ggZGVwZW5kIG9uIHRob3NlIHZhbHVlcyAqL1xuICAgICAgc3RhdGUubGVuYml0cyA9IDk7XG5cbiAgICAgIG9wdHMgPSB7IGJpdHM6IHN0YXRlLmxlbmJpdHMgfTtcbiAgICAgIHJldCA9IGluZmxhdGVfdGFibGUoTEVOUywgc3RhdGUubGVucywgMCwgc3RhdGUubmxlbiwgc3RhdGUubGVuY29kZSwgMCwgc3RhdGUud29yaywgb3B0cyk7XG4gICAgICAvLyBXZSBoYXZlIHNlcGFyYXRlIHRhYmxlcyAmIG5vIHBvaW50ZXJzLiAyIGNvbW1lbnRlZCBsaW5lcyBiZWxvdyBub3QgbmVlZGVkLlxuICAgICAgLy8gc3RhdGUubmV4dF9pbmRleCA9IG9wdHMudGFibGVfaW5kZXg7XG4gICAgICBzdGF0ZS5sZW5iaXRzID0gb3B0cy5iaXRzO1xuICAgICAgLy8gc3RhdGUubGVuY29kZSA9IHN0YXRlLm5leHQ7XG5cbiAgICAgIGlmIChyZXQpIHtcbiAgICAgICAgc3RybS5tc2cgPSAnaW52YWxpZCBsaXRlcmFsL2xlbmd0aHMgc2V0JztcbiAgICAgICAgc3RhdGUubW9kZSA9IEJBRDtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICAgIHN0YXRlLmRpc3RiaXRzID0gNjtcbiAgICAgIC8vc3RhdGUuZGlzdGNvZGUuY29weShzdGF0ZS5jb2Rlcyk7XG4gICAgICAvLyBTd2l0Y2ggdG8gdXNlIGR5bmFtaWMgdGFibGVcbiAgICAgIHN0YXRlLmRpc3Rjb2RlID0gc3RhdGUuZGlzdGR5bjtcbiAgICAgIG9wdHMgPSB7IGJpdHM6IHN0YXRlLmRpc3RiaXRzIH07XG4gICAgICByZXQgPSBpbmZsYXRlX3RhYmxlKERJU1RTLCBzdGF0ZS5sZW5zLCBzdGF0ZS5ubGVuLCBzdGF0ZS5uZGlzdCwgc3RhdGUuZGlzdGNvZGUsIDAsIHN0YXRlLndvcmssIG9wdHMpO1xuICAgICAgLy8gV2UgaGF2ZSBzZXBhcmF0ZSB0YWJsZXMgJiBubyBwb2ludGVycy4gMiBjb21tZW50ZWQgbGluZXMgYmVsb3cgbm90IG5lZWRlZC5cbiAgICAgIC8vIHN0YXRlLm5leHRfaW5kZXggPSBvcHRzLnRhYmxlX2luZGV4O1xuICAgICAgc3RhdGUuZGlzdGJpdHMgPSBvcHRzLmJpdHM7XG4gICAgICAvLyBzdGF0ZS5kaXN0Y29kZSA9IHN0YXRlLm5leHQ7XG5cbiAgICAgIGlmIChyZXQpIHtcbiAgICAgICAgc3RybS5tc2cgPSAnaW52YWxpZCBkaXN0YW5jZXMgc2V0JztcbiAgICAgICAgc3RhdGUubW9kZSA9IEJBRDtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICAvL1RyYWNldigoc3RkZXJyLCAnaW5mbGF0ZTogICAgICAgY29kZXMgb2tcXG4nKSk7XG4gICAgICBzdGF0ZS5tb2RlID0gTEVOXztcbiAgICAgIGlmIChmbHVzaCA9PT0gWl9UUkVFUykgeyBicmVhayBpbmZfbGVhdmU7IH1cbiAgICAgIC8qIGZhbGxzIHRocm91Z2ggKi9cbiAgICBjYXNlIExFTl86XG4gICAgICBzdGF0ZS5tb2RlID0gTEVOO1xuICAgICAgLyogZmFsbHMgdGhyb3VnaCAqL1xuICAgIGNhc2UgTEVOOlxuICAgICAgaWYgKGhhdmUgPj0gNiAmJiBsZWZ0ID49IDI1OCkge1xuICAgICAgICAvLy0tLSBSRVNUT1JFKCkgLS0tXG4gICAgICAgIHN0cm0ubmV4dF9vdXQgPSBwdXQ7XG4gICAgICAgIHN0cm0uYXZhaWxfb3V0ID0gbGVmdDtcbiAgICAgICAgc3RybS5uZXh0X2luID0gbmV4dDtcbiAgICAgICAgc3RybS5hdmFpbF9pbiA9IGhhdmU7XG4gICAgICAgIHN0YXRlLmhvbGQgPSBob2xkO1xuICAgICAgICBzdGF0ZS5iaXRzID0gYml0cztcbiAgICAgICAgLy8tLS1cbiAgICAgICAgaW5mbGF0ZV9mYXN0KHN0cm0sIF9vdXQpO1xuICAgICAgICAvLy0tLSBMT0FEKCkgLS0tXG4gICAgICAgIHB1dCA9IHN0cm0ubmV4dF9vdXQ7XG4gICAgICAgIG91dHB1dCA9IHN0cm0ub3V0cHV0O1xuICAgICAgICBsZWZ0ID0gc3RybS5hdmFpbF9vdXQ7XG4gICAgICAgIG5leHQgPSBzdHJtLm5leHRfaW47XG4gICAgICAgIGlucHV0ID0gc3RybS5pbnB1dDtcbiAgICAgICAgaGF2ZSA9IHN0cm0uYXZhaWxfaW47XG4gICAgICAgIGhvbGQgPSBzdGF0ZS5ob2xkO1xuICAgICAgICBiaXRzID0gc3RhdGUuYml0cztcbiAgICAgICAgLy8tLS1cblxuICAgICAgICBpZiAoc3RhdGUubW9kZSA9PT0gVFlQRSkge1xuICAgICAgICAgIHN0YXRlLmJhY2sgPSAtMTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIHN0YXRlLmJhY2sgPSAwO1xuICAgICAgZm9yICg7Oykge1xuICAgICAgICBoZXJlID0gc3RhdGUubGVuY29kZVtob2xkICYgKCgxIDw8IHN0YXRlLmxlbmJpdHMpIC0gMSldOyAgLypCSVRTKHN0YXRlLmxlbmJpdHMpKi9cbiAgICAgICAgaGVyZV9iaXRzID0gaGVyZSA+Pj4gMjQ7XG4gICAgICAgIGhlcmVfb3AgPSAoaGVyZSA+Pj4gMTYpICYgMHhmZjtcbiAgICAgICAgaGVyZV92YWwgPSBoZXJlICYgMHhmZmZmO1xuXG4gICAgICAgIGlmIChoZXJlX2JpdHMgPD0gYml0cykgeyBicmVhazsgfVxuICAgICAgICAvLy0tLSBQVUxMQllURSgpIC0tLS8vXG4gICAgICAgIGlmIChoYXZlID09PSAwKSB7IGJyZWFrIGluZl9sZWF2ZTsgfVxuICAgICAgICBoYXZlLS07XG4gICAgICAgIGhvbGQgKz0gaW5wdXRbbmV4dCsrXSA8PCBiaXRzO1xuICAgICAgICBiaXRzICs9IDg7XG4gICAgICAgIC8vLS0tLy9cbiAgICAgIH1cbiAgICAgIGlmIChoZXJlX29wICYmIChoZXJlX29wICYgMHhmMCkgPT09IDApIHtcbiAgICAgICAgbGFzdF9iaXRzID0gaGVyZV9iaXRzO1xuICAgICAgICBsYXN0X29wID0gaGVyZV9vcDtcbiAgICAgICAgbGFzdF92YWwgPSBoZXJlX3ZhbDtcbiAgICAgICAgZm9yICg7Oykge1xuICAgICAgICAgIGhlcmUgPSBzdGF0ZS5sZW5jb2RlW2xhc3RfdmFsICtcbiAgICAgICAgICAgICAgICAgICgoaG9sZCAmICgoMSA8PCAobGFzdF9iaXRzICsgbGFzdF9vcCkpIC0gMSkpLypCSVRTKGxhc3QuYml0cyArIGxhc3Qub3ApKi8gPj4gbGFzdF9iaXRzKV07XG4gICAgICAgICAgaGVyZV9iaXRzID0gaGVyZSA+Pj4gMjQ7XG4gICAgICAgICAgaGVyZV9vcCA9IChoZXJlID4+PiAxNikgJiAweGZmO1xuICAgICAgICAgIGhlcmVfdmFsID0gaGVyZSAmIDB4ZmZmZjtcblxuICAgICAgICAgIGlmICgobGFzdF9iaXRzICsgaGVyZV9iaXRzKSA8PSBiaXRzKSB7IGJyZWFrOyB9XG4gICAgICAgICAgLy8tLS0gUFVMTEJZVEUoKSAtLS0vL1xuICAgICAgICAgIGlmIChoYXZlID09PSAwKSB7IGJyZWFrIGluZl9sZWF2ZTsgfVxuICAgICAgICAgIGhhdmUtLTtcbiAgICAgICAgICBob2xkICs9IGlucHV0W25leHQrK10gPDwgYml0cztcbiAgICAgICAgICBiaXRzICs9IDg7XG4gICAgICAgICAgLy8tLS0vL1xuICAgICAgICB9XG4gICAgICAgIC8vLS0tIERST1BCSVRTKGxhc3QuYml0cykgLS0tLy9cbiAgICAgICAgaG9sZCA+Pj49IGxhc3RfYml0cztcbiAgICAgICAgYml0cyAtPSBsYXN0X2JpdHM7XG4gICAgICAgIC8vLS0tLy9cbiAgICAgICAgc3RhdGUuYmFjayArPSBsYXN0X2JpdHM7XG4gICAgICB9XG4gICAgICAvLy0tLSBEUk9QQklUUyhoZXJlLmJpdHMpIC0tLS8vXG4gICAgICBob2xkID4+Pj0gaGVyZV9iaXRzO1xuICAgICAgYml0cyAtPSBoZXJlX2JpdHM7XG4gICAgICAvLy0tLS8vXG4gICAgICBzdGF0ZS5iYWNrICs9IGhlcmVfYml0cztcbiAgICAgIHN0YXRlLmxlbmd0aCA9IGhlcmVfdmFsO1xuICAgICAgaWYgKGhlcmVfb3AgPT09IDApIHtcbiAgICAgICAgLy9UcmFjZXZ2KChzdGRlcnIsIGhlcmUudmFsID49IDB4MjAgJiYgaGVyZS52YWwgPCAweDdmID9cbiAgICAgICAgLy8gICAgICAgIFwiaW5mbGF0ZTogICAgICAgICBsaXRlcmFsICclYydcXG5cIiA6XG4gICAgICAgIC8vICAgICAgICBcImluZmxhdGU6ICAgICAgICAgbGl0ZXJhbCAweCUwMnhcXG5cIiwgaGVyZS52YWwpKTtcbiAgICAgICAgc3RhdGUubW9kZSA9IExJVDtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBpZiAoaGVyZV9vcCAmIDMyKSB7XG4gICAgICAgIC8vVHJhY2V2digoc3RkZXJyLCBcImluZmxhdGU6ICAgICAgICAgZW5kIG9mIGJsb2NrXFxuXCIpKTtcbiAgICAgICAgc3RhdGUuYmFjayA9IC0xO1xuICAgICAgICBzdGF0ZS5tb2RlID0gVFlQRTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBpZiAoaGVyZV9vcCAmIDY0KSB7XG4gICAgICAgIHN0cm0ubXNnID0gJ2ludmFsaWQgbGl0ZXJhbC9sZW5ndGggY29kZSc7XG4gICAgICAgIHN0YXRlLm1vZGUgPSBCQUQ7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgc3RhdGUuZXh0cmEgPSBoZXJlX29wICYgMTU7XG4gICAgICBzdGF0ZS5tb2RlID0gTEVORVhUO1xuICAgICAgLyogZmFsbHMgdGhyb3VnaCAqL1xuICAgIGNhc2UgTEVORVhUOlxuICAgICAgaWYgKHN0YXRlLmV4dHJhKSB7XG4gICAgICAgIC8vPT09IE5FRURCSVRTKHN0YXRlLmV4dHJhKTtcbiAgICAgICAgbiA9IHN0YXRlLmV4dHJhO1xuICAgICAgICB3aGlsZSAoYml0cyA8IG4pIHtcbiAgICAgICAgICBpZiAoaGF2ZSA9PT0gMCkgeyBicmVhayBpbmZfbGVhdmU7IH1cbiAgICAgICAgICBoYXZlLS07XG4gICAgICAgICAgaG9sZCArPSBpbnB1dFtuZXh0KytdIDw8IGJpdHM7XG4gICAgICAgICAgYml0cyArPSA4O1xuICAgICAgICB9XG4gICAgICAgIC8vPT09Ly9cbiAgICAgICAgc3RhdGUubGVuZ3RoICs9IGhvbGQgJiAoKDEgPDwgc3RhdGUuZXh0cmEpIC0gMSkvKkJJVFMoc3RhdGUuZXh0cmEpKi87XG4gICAgICAgIC8vLS0tIERST1BCSVRTKHN0YXRlLmV4dHJhKSAtLS0vL1xuICAgICAgICBob2xkID4+Pj0gc3RhdGUuZXh0cmE7XG4gICAgICAgIGJpdHMgLT0gc3RhdGUuZXh0cmE7XG4gICAgICAgIC8vLS0tLy9cbiAgICAgICAgc3RhdGUuYmFjayArPSBzdGF0ZS5leHRyYTtcbiAgICAgIH1cbiAgICAgIC8vVHJhY2V2digoc3RkZXJyLCBcImluZmxhdGU6ICAgICAgICAgbGVuZ3RoICV1XFxuXCIsIHN0YXRlLmxlbmd0aCkpO1xuICAgICAgc3RhdGUud2FzID0gc3RhdGUubGVuZ3RoO1xuICAgICAgc3RhdGUubW9kZSA9IERJU1Q7XG4gICAgICAvKiBmYWxscyB0aHJvdWdoICovXG4gICAgY2FzZSBESVNUOlxuICAgICAgZm9yICg7Oykge1xuICAgICAgICBoZXJlID0gc3RhdGUuZGlzdGNvZGVbaG9sZCAmICgoMSA8PCBzdGF0ZS5kaXN0Yml0cykgLSAxKV07LypCSVRTKHN0YXRlLmRpc3RiaXRzKSovXG4gICAgICAgIGhlcmVfYml0cyA9IGhlcmUgPj4+IDI0O1xuICAgICAgICBoZXJlX29wID0gKGhlcmUgPj4+IDE2KSAmIDB4ZmY7XG4gICAgICAgIGhlcmVfdmFsID0gaGVyZSAmIDB4ZmZmZjtcblxuICAgICAgICBpZiAoKGhlcmVfYml0cykgPD0gYml0cykgeyBicmVhazsgfVxuICAgICAgICAvLy0tLSBQVUxMQllURSgpIC0tLS8vXG4gICAgICAgIGlmIChoYXZlID09PSAwKSB7IGJyZWFrIGluZl9sZWF2ZTsgfVxuICAgICAgICBoYXZlLS07XG4gICAgICAgIGhvbGQgKz0gaW5wdXRbbmV4dCsrXSA8PCBiaXRzO1xuICAgICAgICBiaXRzICs9IDg7XG4gICAgICAgIC8vLS0tLy9cbiAgICAgIH1cbiAgICAgIGlmICgoaGVyZV9vcCAmIDB4ZjApID09PSAwKSB7XG4gICAgICAgIGxhc3RfYml0cyA9IGhlcmVfYml0cztcbiAgICAgICAgbGFzdF9vcCA9IGhlcmVfb3A7XG4gICAgICAgIGxhc3RfdmFsID0gaGVyZV92YWw7XG4gICAgICAgIGZvciAoOzspIHtcbiAgICAgICAgICBoZXJlID0gc3RhdGUuZGlzdGNvZGVbbGFzdF92YWwgK1xuICAgICAgICAgICAgICAgICAgKChob2xkICYgKCgxIDw8IChsYXN0X2JpdHMgKyBsYXN0X29wKSkgLSAxKSkvKkJJVFMobGFzdC5iaXRzICsgbGFzdC5vcCkqLyA+PiBsYXN0X2JpdHMpXTtcbiAgICAgICAgICBoZXJlX2JpdHMgPSBoZXJlID4+PiAyNDtcbiAgICAgICAgICBoZXJlX29wID0gKGhlcmUgPj4+IDE2KSAmIDB4ZmY7XG4gICAgICAgICAgaGVyZV92YWwgPSBoZXJlICYgMHhmZmZmO1xuXG4gICAgICAgICAgaWYgKChsYXN0X2JpdHMgKyBoZXJlX2JpdHMpIDw9IGJpdHMpIHsgYnJlYWs7IH1cbiAgICAgICAgICAvLy0tLSBQVUxMQllURSgpIC0tLS8vXG4gICAgICAgICAgaWYgKGhhdmUgPT09IDApIHsgYnJlYWsgaW5mX2xlYXZlOyB9XG4gICAgICAgICAgaGF2ZS0tO1xuICAgICAgICAgIGhvbGQgKz0gaW5wdXRbbmV4dCsrXSA8PCBiaXRzO1xuICAgICAgICAgIGJpdHMgKz0gODtcbiAgICAgICAgICAvLy0tLS8vXG4gICAgICAgIH1cbiAgICAgICAgLy8tLS0gRFJPUEJJVFMobGFzdC5iaXRzKSAtLS0vL1xuICAgICAgICBob2xkID4+Pj0gbGFzdF9iaXRzO1xuICAgICAgICBiaXRzIC09IGxhc3RfYml0cztcbiAgICAgICAgLy8tLS0vL1xuICAgICAgICBzdGF0ZS5iYWNrICs9IGxhc3RfYml0cztcbiAgICAgIH1cbiAgICAgIC8vLS0tIERST1BCSVRTKGhlcmUuYml0cykgLS0tLy9cbiAgICAgIGhvbGQgPj4+PSBoZXJlX2JpdHM7XG4gICAgICBiaXRzIC09IGhlcmVfYml0cztcbiAgICAgIC8vLS0tLy9cbiAgICAgIHN0YXRlLmJhY2sgKz0gaGVyZV9iaXRzO1xuICAgICAgaWYgKGhlcmVfb3AgJiA2NCkge1xuICAgICAgICBzdHJtLm1zZyA9ICdpbnZhbGlkIGRpc3RhbmNlIGNvZGUnO1xuICAgICAgICBzdGF0ZS5tb2RlID0gQkFEO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIHN0YXRlLm9mZnNldCA9IGhlcmVfdmFsO1xuICAgICAgc3RhdGUuZXh0cmEgPSAoaGVyZV9vcCkgJiAxNTtcbiAgICAgIHN0YXRlLm1vZGUgPSBESVNURVhUO1xuICAgICAgLyogZmFsbHMgdGhyb3VnaCAqL1xuICAgIGNhc2UgRElTVEVYVDpcbiAgICAgIGlmIChzdGF0ZS5leHRyYSkge1xuICAgICAgICAvLz09PSBORUVEQklUUyhzdGF0ZS5leHRyYSk7XG4gICAgICAgIG4gPSBzdGF0ZS5leHRyYTtcbiAgICAgICAgd2hpbGUgKGJpdHMgPCBuKSB7XG4gICAgICAgICAgaWYgKGhhdmUgPT09IDApIHsgYnJlYWsgaW5mX2xlYXZlOyB9XG4gICAgICAgICAgaGF2ZS0tO1xuICAgICAgICAgIGhvbGQgKz0gaW5wdXRbbmV4dCsrXSA8PCBiaXRzO1xuICAgICAgICAgIGJpdHMgKz0gODtcbiAgICAgICAgfVxuICAgICAgICAvLz09PS8vXG4gICAgICAgIHN0YXRlLm9mZnNldCArPSBob2xkICYgKCgxIDw8IHN0YXRlLmV4dHJhKSAtIDEpLypCSVRTKHN0YXRlLmV4dHJhKSovO1xuICAgICAgICAvLy0tLSBEUk9QQklUUyhzdGF0ZS5leHRyYSkgLS0tLy9cbiAgICAgICAgaG9sZCA+Pj49IHN0YXRlLmV4dHJhO1xuICAgICAgICBiaXRzIC09IHN0YXRlLmV4dHJhO1xuICAgICAgICAvLy0tLS8vXG4gICAgICAgIHN0YXRlLmJhY2sgKz0gc3RhdGUuZXh0cmE7XG4gICAgICB9XG4vLyNpZmRlZiBJTkZMQVRFX1NUUklDVFxuICAgICAgaWYgKHN0YXRlLm9mZnNldCA+IHN0YXRlLmRtYXgpIHtcbiAgICAgICAgc3RybS5tc2cgPSAnaW52YWxpZCBkaXN0YW5jZSB0b28gZmFyIGJhY2snO1xuICAgICAgICBzdGF0ZS5tb2RlID0gQkFEO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbi8vI2VuZGlmXG4gICAgICAvL1RyYWNldnYoKHN0ZGVyciwgXCJpbmZsYXRlOiAgICAgICAgIGRpc3RhbmNlICV1XFxuXCIsIHN0YXRlLm9mZnNldCkpO1xuICAgICAgc3RhdGUubW9kZSA9IE1BVENIO1xuICAgICAgLyogZmFsbHMgdGhyb3VnaCAqL1xuICAgIGNhc2UgTUFUQ0g6XG4gICAgICBpZiAobGVmdCA9PT0gMCkgeyBicmVhayBpbmZfbGVhdmU7IH1cbiAgICAgIGNvcHkgPSBfb3V0IC0gbGVmdDtcbiAgICAgIGlmIChzdGF0ZS5vZmZzZXQgPiBjb3B5KSB7ICAgICAgICAgLyogY29weSBmcm9tIHdpbmRvdyAqL1xuICAgICAgICBjb3B5ID0gc3RhdGUub2Zmc2V0IC0gY29weTtcbiAgICAgICAgaWYgKGNvcHkgPiBzdGF0ZS53aGF2ZSkge1xuICAgICAgICAgIGlmIChzdGF0ZS5zYW5lKSB7XG4gICAgICAgICAgICBzdHJtLm1zZyA9ICdpbnZhbGlkIGRpc3RhbmNlIHRvbyBmYXIgYmFjayc7XG4gICAgICAgICAgICBzdGF0ZS5tb2RlID0gQkFEO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuLy8gKCEpIFRoaXMgYmxvY2sgaXMgZGlzYWJsZWQgaW4gemxpYiBkZWZhaWx0cyxcbi8vIGRvbid0IGVuYWJsZSBpdCBmb3IgYmluYXJ5IGNvbXBhdGliaWxpdHlcbi8vI2lmZGVmIElORkxBVEVfQUxMT1dfSU5WQUxJRF9ESVNUQU5DRV9UT09GQVJfQVJSUlxuLy8gICAgICAgICAgVHJhY2UoKHN0ZGVyciwgXCJpbmZsYXRlLmMgdG9vIGZhclxcblwiKSk7XG4vLyAgICAgICAgICBjb3B5IC09IHN0YXRlLndoYXZlO1xuLy8gICAgICAgICAgaWYgKGNvcHkgPiBzdGF0ZS5sZW5ndGgpIHsgY29weSA9IHN0YXRlLmxlbmd0aDsgfVxuLy8gICAgICAgICAgaWYgKGNvcHkgPiBsZWZ0KSB7IGNvcHkgPSBsZWZ0OyB9XG4vLyAgICAgICAgICBsZWZ0IC09IGNvcHk7XG4vLyAgICAgICAgICBzdGF0ZS5sZW5ndGggLT0gY29weTtcbi8vICAgICAgICAgIGRvIHtcbi8vICAgICAgICAgICAgb3V0cHV0W3B1dCsrXSA9IDA7XG4vLyAgICAgICAgICB9IHdoaWxlICgtLWNvcHkpO1xuLy8gICAgICAgICAgaWYgKHN0YXRlLmxlbmd0aCA9PT0gMCkgeyBzdGF0ZS5tb2RlID0gTEVOOyB9XG4vLyAgICAgICAgICBicmVhaztcbi8vI2VuZGlmXG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNvcHkgPiBzdGF0ZS53bmV4dCkge1xuICAgICAgICAgIGNvcHkgLT0gc3RhdGUud25leHQ7XG4gICAgICAgICAgZnJvbSA9IHN0YXRlLndzaXplIC0gY29weTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICBmcm9tID0gc3RhdGUud25leHQgLSBjb3B5O1xuICAgICAgICB9XG4gICAgICAgIGlmIChjb3B5ID4gc3RhdGUubGVuZ3RoKSB7IGNvcHkgPSBzdGF0ZS5sZW5ndGg7IH1cbiAgICAgICAgZnJvbV9zb3VyY2UgPSBzdGF0ZS53aW5kb3c7XG4gICAgICB9XG4gICAgICBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBjb3B5IGZyb20gb3V0cHV0ICovXG4gICAgICAgIGZyb21fc291cmNlID0gb3V0cHV0O1xuICAgICAgICBmcm9tID0gcHV0IC0gc3RhdGUub2Zmc2V0O1xuICAgICAgICBjb3B5ID0gc3RhdGUubGVuZ3RoO1xuICAgICAgfVxuICAgICAgaWYgKGNvcHkgPiBsZWZ0KSB7IGNvcHkgPSBsZWZ0OyB9XG4gICAgICBsZWZ0IC09IGNvcHk7XG4gICAgICBzdGF0ZS5sZW5ndGggLT0gY29weTtcbiAgICAgIGRvIHtcbiAgICAgICAgb3V0cHV0W3B1dCsrXSA9IGZyb21fc291cmNlW2Zyb20rK107XG4gICAgICB9IHdoaWxlICgtLWNvcHkpO1xuICAgICAgaWYgKHN0YXRlLmxlbmd0aCA9PT0gMCkgeyBzdGF0ZS5tb2RlID0gTEVOOyB9XG4gICAgICBicmVhaztcbiAgICBjYXNlIExJVDpcbiAgICAgIGlmIChsZWZ0ID09PSAwKSB7IGJyZWFrIGluZl9sZWF2ZTsgfVxuICAgICAgb3V0cHV0W3B1dCsrXSA9IHN0YXRlLmxlbmd0aDtcbiAgICAgIGxlZnQtLTtcbiAgICAgIHN0YXRlLm1vZGUgPSBMRU47XG4gICAgICBicmVhaztcbiAgICBjYXNlIENIRUNLOlxuICAgICAgaWYgKHN0YXRlLndyYXApIHtcbiAgICAgICAgLy89PT0gTkVFREJJVFMoMzIpO1xuICAgICAgICB3aGlsZSAoYml0cyA8IDMyKSB7XG4gICAgICAgICAgaWYgKGhhdmUgPT09IDApIHsgYnJlYWsgaW5mX2xlYXZlOyB9XG4gICAgICAgICAgaGF2ZS0tO1xuICAgICAgICAgIC8vIFVzZSAnfCcgaW5zZGVhZCBvZiAnKycgdG8gbWFrZSBzdXJlIHRoYXQgcmVzdWx0IGlzIHNpZ25lZFxuICAgICAgICAgIGhvbGQgfD0gaW5wdXRbbmV4dCsrXSA8PCBiaXRzO1xuICAgICAgICAgIGJpdHMgKz0gODtcbiAgICAgICAgfVxuICAgICAgICAvLz09PS8vXG4gICAgICAgIF9vdXQgLT0gbGVmdDtcbiAgICAgICAgc3RybS50b3RhbF9vdXQgKz0gX291dDtcbiAgICAgICAgc3RhdGUudG90YWwgKz0gX291dDtcbiAgICAgICAgaWYgKF9vdXQpIHtcbiAgICAgICAgICBzdHJtLmFkbGVyID0gc3RhdGUuY2hlY2sgPVxuICAgICAgICAgICAgICAvKlVQREFURShzdGF0ZS5jaGVjaywgcHV0IC0gX291dCwgX291dCk7Ki9cbiAgICAgICAgICAgICAgKHN0YXRlLmZsYWdzID8gY3JjMzIoc3RhdGUuY2hlY2ssIG91dHB1dCwgX291dCwgcHV0IC0gX291dCkgOiBhZGxlcjMyKHN0YXRlLmNoZWNrLCBvdXRwdXQsIF9vdXQsIHB1dCAtIF9vdXQpKTtcblxuICAgICAgICB9XG4gICAgICAgIF9vdXQgPSBsZWZ0O1xuICAgICAgICAvLyBOQjogY3JjMzIgc3RvcmVkIGFzIHNpZ25lZCAzMi1iaXQgaW50LCB6c3dhcDMyIHJldHVybnMgc2lnbmVkIHRvb1xuICAgICAgICBpZiAoKHN0YXRlLmZsYWdzID8gaG9sZCA6IHpzd2FwMzIoaG9sZCkpICE9PSBzdGF0ZS5jaGVjaykge1xuICAgICAgICAgIHN0cm0ubXNnID0gJ2luY29ycmVjdCBkYXRhIGNoZWNrJztcbiAgICAgICAgICBzdGF0ZS5tb2RlID0gQkFEO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIC8vPT09IElOSVRCSVRTKCk7XG4gICAgICAgIGhvbGQgPSAwO1xuICAgICAgICBiaXRzID0gMDtcbiAgICAgICAgLy89PT0vL1xuICAgICAgICAvL1RyYWNldigoc3RkZXJyLCBcImluZmxhdGU6ICAgY2hlY2sgbWF0Y2hlcyB0cmFpbGVyXFxuXCIpKTtcbiAgICAgIH1cbiAgICAgIHN0YXRlLm1vZGUgPSBMRU5HVEg7XG4gICAgICAvKiBmYWxscyB0aHJvdWdoICovXG4gICAgY2FzZSBMRU5HVEg6XG4gICAgICBpZiAoc3RhdGUud3JhcCAmJiBzdGF0ZS5mbGFncykge1xuICAgICAgICAvLz09PSBORUVEQklUUygzMik7XG4gICAgICAgIHdoaWxlIChiaXRzIDwgMzIpIHtcbiAgICAgICAgICBpZiAoaGF2ZSA9PT0gMCkgeyBicmVhayBpbmZfbGVhdmU7IH1cbiAgICAgICAgICBoYXZlLS07XG4gICAgICAgICAgaG9sZCArPSBpbnB1dFtuZXh0KytdIDw8IGJpdHM7XG4gICAgICAgICAgYml0cyArPSA4O1xuICAgICAgICB9XG4gICAgICAgIC8vPT09Ly9cbiAgICAgICAgaWYgKGhvbGQgIT09IChzdGF0ZS50b3RhbCAmIDB4ZmZmZmZmZmYpKSB7XG4gICAgICAgICAgc3RybS5tc2cgPSAnaW5jb3JyZWN0IGxlbmd0aCBjaGVjayc7XG4gICAgICAgICAgc3RhdGUubW9kZSA9IEJBRDtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICAvLz09PSBJTklUQklUUygpO1xuICAgICAgICBob2xkID0gMDtcbiAgICAgICAgYml0cyA9IDA7XG4gICAgICAgIC8vPT09Ly9cbiAgICAgICAgLy9UcmFjZXYoKHN0ZGVyciwgXCJpbmZsYXRlOiAgIGxlbmd0aCBtYXRjaGVzIHRyYWlsZXJcXG5cIikpO1xuICAgICAgfVxuICAgICAgc3RhdGUubW9kZSA9IERPTkU7XG4gICAgICAvKiBmYWxscyB0aHJvdWdoICovXG4gICAgY2FzZSBET05FOlxuICAgICAgcmV0ID0gWl9TVFJFQU1fRU5EO1xuICAgICAgYnJlYWsgaW5mX2xlYXZlO1xuICAgIGNhc2UgQkFEOlxuICAgICAgcmV0ID0gWl9EQVRBX0VSUk9SO1xuICAgICAgYnJlYWsgaW5mX2xlYXZlO1xuICAgIGNhc2UgTUVNOlxuICAgICAgcmV0dXJuIFpfTUVNX0VSUk9SO1xuICAgIGNhc2UgU1lOQzpcbiAgICAgIC8qIGZhbGxzIHRocm91Z2ggKi9cbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIFpfU1RSRUFNX0VSUk9SO1xuICAgIH1cbiAgfVxuXG4gIC8vIGluZl9sZWF2ZSA8LSBoZXJlIGlzIHJlYWwgcGxhY2UgZm9yIFwiZ290byBpbmZfbGVhdmVcIiwgZW11bGF0ZWQgdmlhIFwiYnJlYWsgaW5mX2xlYXZlXCJcblxuICAvKlxuICAgICBSZXR1cm4gZnJvbSBpbmZsYXRlKCksIHVwZGF0aW5nIHRoZSB0b3RhbCBjb3VudHMgYW5kIHRoZSBjaGVjayB2YWx1ZS5cbiAgICAgSWYgdGhlcmUgd2FzIG5vIHByb2dyZXNzIGR1cmluZyB0aGUgaW5mbGF0ZSgpIGNhbGwsIHJldHVybiBhIGJ1ZmZlclxuICAgICBlcnJvci4gIENhbGwgdXBkYXRld2luZG93KCkgdG8gY3JlYXRlIGFuZC9vciB1cGRhdGUgdGhlIHdpbmRvdyBzdGF0ZS5cbiAgICAgTm90ZTogYSBtZW1vcnkgZXJyb3IgZnJvbSBpbmZsYXRlKCkgaXMgbm9uLXJlY292ZXJhYmxlLlxuICAgKi9cblxuICAvLy0tLSBSRVNUT1JFKCkgLS0tXG4gIHN0cm0ubmV4dF9vdXQgPSBwdXQ7XG4gIHN0cm0uYXZhaWxfb3V0ID0gbGVmdDtcbiAgc3RybS5uZXh0X2luID0gbmV4dDtcbiAgc3RybS5hdmFpbF9pbiA9IGhhdmU7XG4gIHN0YXRlLmhvbGQgPSBob2xkO1xuICBzdGF0ZS5iaXRzID0gYml0cztcbiAgLy8tLS1cblxuICBpZiAoc3RhdGUud3NpemUgfHwgKF9vdXQgIT09IHN0cm0uYXZhaWxfb3V0ICYmIHN0YXRlLm1vZGUgPCBCQUQgJiZcbiAgICAgICAgICAgICAgICAgICAgICAoc3RhdGUubW9kZSA8IENIRUNLIHx8IGZsdXNoICE9PSBaX0ZJTklTSCkpKSB7XG4gICAgaWYgKHVwZGF0ZXdpbmRvdyhzdHJtLCBzdHJtLm91dHB1dCwgc3RybS5uZXh0X291dCwgX291dCAtIHN0cm0uYXZhaWxfb3V0KSkge1xuICAgICAgc3RhdGUubW9kZSA9IE1FTTtcbiAgICAgIHJldHVybiBaX01FTV9FUlJPUjtcbiAgICB9XG4gIH1cbiAgX2luIC09IHN0cm0uYXZhaWxfaW47XG4gIF9vdXQgLT0gc3RybS5hdmFpbF9vdXQ7XG4gIHN0cm0udG90YWxfaW4gKz0gX2luO1xuICBzdHJtLnRvdGFsX291dCArPSBfb3V0O1xuICBzdGF0ZS50b3RhbCArPSBfb3V0O1xuICBpZiAoc3RhdGUud3JhcCAmJiBfb3V0KSB7XG4gICAgc3RybS5hZGxlciA9IHN0YXRlLmNoZWNrID0gLypVUERBVEUoc3RhdGUuY2hlY2ssIHN0cm0ubmV4dF9vdXQgLSBfb3V0LCBfb3V0KTsqL1xuICAgICAgKHN0YXRlLmZsYWdzID8gY3JjMzIoc3RhdGUuY2hlY2ssIG91dHB1dCwgX291dCwgc3RybS5uZXh0X291dCAtIF9vdXQpIDogYWRsZXIzMihzdGF0ZS5jaGVjaywgb3V0cHV0LCBfb3V0LCBzdHJtLm5leHRfb3V0IC0gX291dCkpO1xuICB9XG4gIHN0cm0uZGF0YV90eXBlID0gc3RhdGUuYml0cyArIChzdGF0ZS5sYXN0ID8gNjQgOiAwKSArXG4gICAgICAgICAgICAgICAgICAgIChzdGF0ZS5tb2RlID09PSBUWVBFID8gMTI4IDogMCkgK1xuICAgICAgICAgICAgICAgICAgICAoc3RhdGUubW9kZSA9PT0gTEVOXyB8fCBzdGF0ZS5tb2RlID09PSBDT1BZXyA/IDI1NiA6IDApO1xuICBpZiAoKChfaW4gPT09IDAgJiYgX291dCA9PT0gMCkgfHwgZmx1c2ggPT09IFpfRklOSVNIKSAmJiByZXQgPT09IFpfT0spIHtcbiAgICByZXQgPSBaX0JVRl9FUlJPUjtcbiAgfVxuICByZXR1cm4gcmV0O1xufVxuXG5mdW5jdGlvbiBpbmZsYXRlRW5kKHN0cm0pIHtcblxuICBpZiAoIXN0cm0gfHwgIXN0cm0uc3RhdGUgLyp8fCBzdHJtLT56ZnJlZSA9PSAoZnJlZV9mdW5jKTAqLykge1xuICAgIHJldHVybiBaX1NUUkVBTV9FUlJPUjtcbiAgfVxuXG4gIHZhciBzdGF0ZSA9IHN0cm0uc3RhdGU7XG4gIGlmIChzdGF0ZS53aW5kb3cpIHtcbiAgICBzdGF0ZS53aW5kb3cgPSBudWxsO1xuICB9XG4gIHN0cm0uc3RhdGUgPSBudWxsO1xuICByZXR1cm4gWl9PSztcbn1cblxuZnVuY3Rpb24gaW5mbGF0ZUdldEhlYWRlcihzdHJtLCBoZWFkKSB7XG4gIHZhciBzdGF0ZTtcblxuICAvKiBjaGVjayBzdGF0ZSAqL1xuICBpZiAoIXN0cm0gfHwgIXN0cm0uc3RhdGUpIHsgcmV0dXJuIFpfU1RSRUFNX0VSUk9SOyB9XG4gIHN0YXRlID0gc3RybS5zdGF0ZTtcbiAgaWYgKChzdGF0ZS53cmFwICYgMikgPT09IDApIHsgcmV0dXJuIFpfU1RSRUFNX0VSUk9SOyB9XG5cbiAgLyogc2F2ZSBoZWFkZXIgc3RydWN0dXJlICovXG4gIHN0YXRlLmhlYWQgPSBoZWFkO1xuICBoZWFkLmRvbmUgPSBmYWxzZTtcbiAgcmV0dXJuIFpfT0s7XG59XG5cbmZ1bmN0aW9uIGluZmxhdGVTZXREaWN0aW9uYXJ5KHN0cm0sIGRpY3Rpb25hcnkpIHtcbiAgdmFyIGRpY3RMZW5ndGggPSBkaWN0aW9uYXJ5Lmxlbmd0aDtcblxuICB2YXIgc3RhdGU7XG4gIHZhciBkaWN0aWQ7XG4gIHZhciByZXQ7XG5cbiAgLyogY2hlY2sgc3RhdGUgKi9cbiAgaWYgKCFzdHJtIC8qID09IFpfTlVMTCAqLyB8fCAhc3RybS5zdGF0ZSAvKiA9PSBaX05VTEwgKi8pIHsgcmV0dXJuIFpfU1RSRUFNX0VSUk9SOyB9XG4gIHN0YXRlID0gc3RybS5zdGF0ZTtcblxuICBpZiAoc3RhdGUud3JhcCAhPT0gMCAmJiBzdGF0ZS5tb2RlICE9PSBESUNUKSB7XG4gICAgcmV0dXJuIFpfU1RSRUFNX0VSUk9SO1xuICB9XG5cbiAgLyogY2hlY2sgZm9yIGNvcnJlY3QgZGljdGlvbmFyeSBpZGVudGlmaWVyICovXG4gIGlmIChzdGF0ZS5tb2RlID09PSBESUNUKSB7XG4gICAgZGljdGlkID0gMTsgLyogYWRsZXIzMigwLCBudWxsLCAwKSovXG4gICAgLyogZGljdGlkID0gYWRsZXIzMihkaWN0aWQsIGRpY3Rpb25hcnksIGRpY3RMZW5ndGgpOyAqL1xuICAgIGRpY3RpZCA9IGFkbGVyMzIoZGljdGlkLCBkaWN0aW9uYXJ5LCBkaWN0TGVuZ3RoLCAwKTtcbiAgICBpZiAoZGljdGlkICE9PSBzdGF0ZS5jaGVjaykge1xuICAgICAgcmV0dXJuIFpfREFUQV9FUlJPUjtcbiAgICB9XG4gIH1cbiAgLyogY29weSBkaWN0aW9uYXJ5IHRvIHdpbmRvdyB1c2luZyB1cGRhdGV3aW5kb3coKSwgd2hpY2ggd2lsbCBhbWVuZCB0aGVcbiAgIGV4aXN0aW5nIGRpY3Rpb25hcnkgaWYgYXBwcm9wcmlhdGUgKi9cbiAgcmV0ID0gdXBkYXRld2luZG93KHN0cm0sIGRpY3Rpb25hcnksIGRpY3RMZW5ndGgsIGRpY3RMZW5ndGgpO1xuICBpZiAocmV0KSB7XG4gICAgc3RhdGUubW9kZSA9IE1FTTtcbiAgICByZXR1cm4gWl9NRU1fRVJST1I7XG4gIH1cbiAgc3RhdGUuaGF2ZWRpY3QgPSAxO1xuICAvLyBUcmFjZXYoKHN0ZGVyciwgXCJpbmZsYXRlOiAgIGRpY3Rpb25hcnkgc2V0XFxuXCIpKTtcbiAgcmV0dXJuIFpfT0s7XG59XG5cbmV4cG9ydHMuaW5mbGF0ZVJlc2V0ID0gaW5mbGF0ZVJlc2V0O1xuZXhwb3J0cy5pbmZsYXRlUmVzZXQyID0gaW5mbGF0ZVJlc2V0MjtcbmV4cG9ydHMuaW5mbGF0ZVJlc2V0S2VlcCA9IGluZmxhdGVSZXNldEtlZXA7XG5leHBvcnRzLmluZmxhdGVJbml0ID0gaW5mbGF0ZUluaXQ7XG5leHBvcnRzLmluZmxhdGVJbml0MiA9IGluZmxhdGVJbml0MjtcbmV4cG9ydHMuaW5mbGF0ZSA9IGluZmxhdGU7XG5leHBvcnRzLmluZmxhdGVFbmQgPSBpbmZsYXRlRW5kO1xuZXhwb3J0cy5pbmZsYXRlR2V0SGVhZGVyID0gaW5mbGF0ZUdldEhlYWRlcjtcbmV4cG9ydHMuaW5mbGF0ZVNldERpY3Rpb25hcnkgPSBpbmZsYXRlU2V0RGljdGlvbmFyeTtcbmV4cG9ydHMuaW5mbGF0ZUluZm8gPSAncGFrbyBpbmZsYXRlIChmcm9tIE5vZGVjYSBwcm9qZWN0KSc7XG5cbi8qIE5vdCBpbXBsZW1lbnRlZFxuZXhwb3J0cy5pbmZsYXRlQ29weSA9IGluZmxhdGVDb3B5O1xuZXhwb3J0cy5pbmZsYXRlR2V0RGljdGlvbmFyeSA9IGluZmxhdGVHZXREaWN0aW9uYXJ5O1xuZXhwb3J0cy5pbmZsYXRlTWFyayA9IGluZmxhdGVNYXJrO1xuZXhwb3J0cy5pbmZsYXRlUHJpbWUgPSBpbmZsYXRlUHJpbWU7XG5leHBvcnRzLmluZmxhdGVTeW5jID0gaW5mbGF0ZVN5bmM7XG5leHBvcnRzLmluZmxhdGVTeW5jUG9pbnQgPSBpbmZsYXRlU3luY1BvaW50O1xuZXhwb3J0cy5pbmZsYXRlVW5kZXJtaW5lID0gaW5mbGF0ZVVuZGVybWluZTtcbiovXG4iLCIndXNlIHN0cmljdCc7XG5cblxudmFyIHV0aWxzID0gcmVxdWlyZSgnLi4vdXRpbHMvY29tbW9uJyk7XG5cbnZhciBNQVhCSVRTID0gMTU7XG52YXIgRU5PVUdIX0xFTlMgPSA4NTI7XG52YXIgRU5PVUdIX0RJU1RTID0gNTkyO1xuLy92YXIgRU5PVUdIID0gKEVOT1VHSF9MRU5TK0VOT1VHSF9ESVNUUyk7XG5cbnZhciBDT0RFUyA9IDA7XG52YXIgTEVOUyA9IDE7XG52YXIgRElTVFMgPSAyO1xuXG52YXIgbGJhc2UgPSBbIC8qIExlbmd0aCBjb2RlcyAyNTcuLjI4NSBiYXNlICovXG4gIDMsIDQsIDUsIDYsIDcsIDgsIDksIDEwLCAxMSwgMTMsIDE1LCAxNywgMTksIDIzLCAyNywgMzEsXG4gIDM1LCA0MywgNTEsIDU5LCA2NywgODMsIDk5LCAxMTUsIDEzMSwgMTYzLCAxOTUsIDIyNywgMjU4LCAwLCAwXG5dO1xuXG52YXIgbGV4dCA9IFsgLyogTGVuZ3RoIGNvZGVzIDI1Ny4uMjg1IGV4dHJhICovXG4gIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTcsIDE3LCAxNywgMTcsIDE4LCAxOCwgMTgsIDE4LFxuICAxOSwgMTksIDE5LCAxOSwgMjAsIDIwLCAyMCwgMjAsIDIxLCAyMSwgMjEsIDIxLCAxNiwgNzIsIDc4XG5dO1xuXG52YXIgZGJhc2UgPSBbIC8qIERpc3RhbmNlIGNvZGVzIDAuLjI5IGJhc2UgKi9cbiAgMSwgMiwgMywgNCwgNSwgNywgOSwgMTMsIDE3LCAyNSwgMzMsIDQ5LCA2NSwgOTcsIDEyOSwgMTkzLFxuICAyNTcsIDM4NSwgNTEzLCA3NjksIDEwMjUsIDE1MzcsIDIwNDksIDMwNzMsIDQwOTcsIDYxNDUsXG4gIDgxOTMsIDEyMjg5LCAxNjM4NSwgMjQ1NzcsIDAsIDBcbl07XG5cbnZhciBkZXh0ID0gWyAvKiBEaXN0YW5jZSBjb2RlcyAwLi4yOSBleHRyYSAqL1xuICAxNiwgMTYsIDE2LCAxNiwgMTcsIDE3LCAxOCwgMTgsIDE5LCAxOSwgMjAsIDIwLCAyMSwgMjEsIDIyLCAyMixcbiAgMjMsIDIzLCAyNCwgMjQsIDI1LCAyNSwgMjYsIDI2LCAyNywgMjcsXG4gIDI4LCAyOCwgMjksIDI5LCA2NCwgNjRcbl07XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gaW5mbGF0ZV90YWJsZSh0eXBlLCBsZW5zLCBsZW5zX2luZGV4LCBjb2RlcywgdGFibGUsIHRhYmxlX2luZGV4LCB3b3JrLCBvcHRzKVxue1xuICB2YXIgYml0cyA9IG9wdHMuYml0cztcbiAgICAgIC8vaGVyZSA9IG9wdHMuaGVyZTsgLyogdGFibGUgZW50cnkgZm9yIGR1cGxpY2F0aW9uICovXG5cbiAgdmFyIGxlbiA9IDA7ICAgICAgICAgICAgICAgLyogYSBjb2RlJ3MgbGVuZ3RoIGluIGJpdHMgKi9cbiAgdmFyIHN5bSA9IDA7ICAgICAgICAgICAgICAgLyogaW5kZXggb2YgY29kZSBzeW1ib2xzICovXG4gIHZhciBtaW4gPSAwLCBtYXggPSAwOyAgICAgICAgICAvKiBtaW5pbXVtIGFuZCBtYXhpbXVtIGNvZGUgbGVuZ3RocyAqL1xuICB2YXIgcm9vdCA9IDA7ICAgICAgICAgICAgICAvKiBudW1iZXIgb2YgaW5kZXggYml0cyBmb3Igcm9vdCB0YWJsZSAqL1xuICB2YXIgY3VyciA9IDA7ICAgICAgICAgICAgICAvKiBudW1iZXIgb2YgaW5kZXggYml0cyBmb3IgY3VycmVudCB0YWJsZSAqL1xuICB2YXIgZHJvcCA9IDA7ICAgICAgICAgICAgICAvKiBjb2RlIGJpdHMgdG8gZHJvcCBmb3Igc3ViLXRhYmxlICovXG4gIHZhciBsZWZ0ID0gMDsgICAgICAgICAgICAgICAgICAgLyogbnVtYmVyIG9mIHByZWZpeCBjb2RlcyBhdmFpbGFibGUgKi9cbiAgdmFyIHVzZWQgPSAwOyAgICAgICAgICAgICAgLyogY29kZSBlbnRyaWVzIGluIHRhYmxlIHVzZWQgKi9cbiAgdmFyIGh1ZmYgPSAwOyAgICAgICAgICAgICAgLyogSHVmZm1hbiBjb2RlICovXG4gIHZhciBpbmNyOyAgICAgICAgICAgICAgLyogZm9yIGluY3JlbWVudGluZyBjb2RlLCBpbmRleCAqL1xuICB2YXIgZmlsbDsgICAgICAgICAgICAgIC8qIGluZGV4IGZvciByZXBsaWNhdGluZyBlbnRyaWVzICovXG4gIHZhciBsb3c7ICAgICAgICAgICAgICAgLyogbG93IGJpdHMgZm9yIGN1cnJlbnQgcm9vdCBlbnRyeSAqL1xuICB2YXIgbWFzazsgICAgICAgICAgICAgIC8qIG1hc2sgZm9yIGxvdyByb290IGJpdHMgKi9cbiAgdmFyIG5leHQ7ICAgICAgICAgICAgIC8qIG5leHQgYXZhaWxhYmxlIHNwYWNlIGluIHRhYmxlICovXG4gIHZhciBiYXNlID0gbnVsbDsgICAgIC8qIGJhc2UgdmFsdWUgdGFibGUgdG8gdXNlICovXG4gIHZhciBiYXNlX2luZGV4ID0gMDtcbi8vICB2YXIgc2hvZXh0cmE7ICAgIC8qIGV4dHJhIGJpdHMgdGFibGUgdG8gdXNlICovXG4gIHZhciBlbmQ7ICAgICAgICAgICAgICAgICAgICAvKiB1c2UgYmFzZSBhbmQgZXh0cmEgZm9yIHN5bWJvbCA+IGVuZCAqL1xuICB2YXIgY291bnQgPSBuZXcgdXRpbHMuQnVmMTYoTUFYQklUUyArIDEpOyAvL1tNQVhCSVRTKzFdOyAgICAvKiBudW1iZXIgb2YgY29kZXMgb2YgZWFjaCBsZW5ndGggKi9cbiAgdmFyIG9mZnMgPSBuZXcgdXRpbHMuQnVmMTYoTUFYQklUUyArIDEpOyAvL1tNQVhCSVRTKzFdOyAgICAgLyogb2Zmc2V0cyBpbiB0YWJsZSBmb3IgZWFjaCBsZW5ndGggKi9cbiAgdmFyIGV4dHJhID0gbnVsbDtcbiAgdmFyIGV4dHJhX2luZGV4ID0gMDtcblxuICB2YXIgaGVyZV9iaXRzLCBoZXJlX29wLCBoZXJlX3ZhbDtcblxuICAvKlxuICAgUHJvY2VzcyBhIHNldCBvZiBjb2RlIGxlbmd0aHMgdG8gY3JlYXRlIGEgY2Fub25pY2FsIEh1ZmZtYW4gY29kZS4gIFRoZVxuICAgY29kZSBsZW5ndGhzIGFyZSBsZW5zWzAuLmNvZGVzLTFdLiAgRWFjaCBsZW5ndGggY29ycmVzcG9uZHMgdG8gdGhlXG4gICBzeW1ib2xzIDAuLmNvZGVzLTEuICBUaGUgSHVmZm1hbiBjb2RlIGlzIGdlbmVyYXRlZCBieSBmaXJzdCBzb3J0aW5nIHRoZVxuICAgc3ltYm9scyBieSBsZW5ndGggZnJvbSBzaG9ydCB0byBsb25nLCBhbmQgcmV0YWluaW5nIHRoZSBzeW1ib2wgb3JkZXJcbiAgIGZvciBjb2RlcyB3aXRoIGVxdWFsIGxlbmd0aHMuICBUaGVuIHRoZSBjb2RlIHN0YXJ0cyB3aXRoIGFsbCB6ZXJvIGJpdHNcbiAgIGZvciB0aGUgZmlyc3QgY29kZSBvZiB0aGUgc2hvcnRlc3QgbGVuZ3RoLCBhbmQgdGhlIGNvZGVzIGFyZSBpbnRlZ2VyXG4gICBpbmNyZW1lbnRzIGZvciB0aGUgc2FtZSBsZW5ndGgsIGFuZCB6ZXJvcyBhcmUgYXBwZW5kZWQgYXMgdGhlIGxlbmd0aFxuICAgaW5jcmVhc2VzLiAgRm9yIHRoZSBkZWZsYXRlIGZvcm1hdCwgdGhlc2UgYml0cyBhcmUgc3RvcmVkIGJhY2t3YXJkc1xuICAgZnJvbSB0aGVpciBtb3JlIG5hdHVyYWwgaW50ZWdlciBpbmNyZW1lbnQgb3JkZXJpbmcsIGFuZCBzbyB3aGVuIHRoZVxuICAgZGVjb2RpbmcgdGFibGVzIGFyZSBidWlsdCBpbiB0aGUgbGFyZ2UgbG9vcCBiZWxvdywgdGhlIGludGVnZXIgY29kZXNcbiAgIGFyZSBpbmNyZW1lbnRlZCBiYWNrd2FyZHMuXG5cbiAgIFRoaXMgcm91dGluZSBhc3N1bWVzLCBidXQgZG9lcyBub3QgY2hlY2ssIHRoYXQgYWxsIG9mIHRoZSBlbnRyaWVzIGluXG4gICBsZW5zW10gYXJlIGluIHRoZSByYW5nZSAwLi5NQVhCSVRTLiAgVGhlIGNhbGxlciBtdXN0IGFzc3VyZSB0aGlzLlxuICAgMS4uTUFYQklUUyBpcyBpbnRlcnByZXRlZCBhcyB0aGF0IGNvZGUgbGVuZ3RoLiAgemVybyBtZWFucyB0aGF0IHRoYXRcbiAgIHN5bWJvbCBkb2VzIG5vdCBvY2N1ciBpbiB0aGlzIGNvZGUuXG5cbiAgIFRoZSBjb2RlcyBhcmUgc29ydGVkIGJ5IGNvbXB1dGluZyBhIGNvdW50IG9mIGNvZGVzIGZvciBlYWNoIGxlbmd0aCxcbiAgIGNyZWF0aW5nIGZyb20gdGhhdCBhIHRhYmxlIG9mIHN0YXJ0aW5nIGluZGljZXMgZm9yIGVhY2ggbGVuZ3RoIGluIHRoZVxuICAgc29ydGVkIHRhYmxlLCBhbmQgdGhlbiBlbnRlcmluZyB0aGUgc3ltYm9scyBpbiBvcmRlciBpbiB0aGUgc29ydGVkXG4gICB0YWJsZS4gIFRoZSBzb3J0ZWQgdGFibGUgaXMgd29ya1tdLCB3aXRoIHRoYXQgc3BhY2UgYmVpbmcgcHJvdmlkZWQgYnlcbiAgIHRoZSBjYWxsZXIuXG5cbiAgIFRoZSBsZW5ndGggY291bnRzIGFyZSB1c2VkIGZvciBvdGhlciBwdXJwb3NlcyBhcyB3ZWxsLCBpLmUuIGZpbmRpbmdcbiAgIHRoZSBtaW5pbXVtIGFuZCBtYXhpbXVtIGxlbmd0aCBjb2RlcywgZGV0ZXJtaW5pbmcgaWYgdGhlcmUgYXJlIGFueVxuICAgY29kZXMgYXQgYWxsLCBjaGVja2luZyBmb3IgYSB2YWxpZCBzZXQgb2YgbGVuZ3RocywgYW5kIGxvb2tpbmcgYWhlYWRcbiAgIGF0IGxlbmd0aCBjb3VudHMgdG8gZGV0ZXJtaW5lIHN1Yi10YWJsZSBzaXplcyB3aGVuIGJ1aWxkaW5nIHRoZVxuICAgZGVjb2RpbmcgdGFibGVzLlxuICAgKi9cblxuICAvKiBhY2N1bXVsYXRlIGxlbmd0aHMgZm9yIGNvZGVzIChhc3N1bWVzIGxlbnNbXSBhbGwgaW4gMC4uTUFYQklUUykgKi9cbiAgZm9yIChsZW4gPSAwOyBsZW4gPD0gTUFYQklUUzsgbGVuKyspIHtcbiAgICBjb3VudFtsZW5dID0gMDtcbiAgfVxuICBmb3IgKHN5bSA9IDA7IHN5bSA8IGNvZGVzOyBzeW0rKykge1xuICAgIGNvdW50W2xlbnNbbGVuc19pbmRleCArIHN5bV1dKys7XG4gIH1cblxuICAvKiBib3VuZCBjb2RlIGxlbmd0aHMsIGZvcmNlIHJvb3QgdG8gYmUgd2l0aGluIGNvZGUgbGVuZ3RocyAqL1xuICByb290ID0gYml0cztcbiAgZm9yIChtYXggPSBNQVhCSVRTOyBtYXggPj0gMTsgbWF4LS0pIHtcbiAgICBpZiAoY291bnRbbWF4XSAhPT0gMCkgeyBicmVhazsgfVxuICB9XG4gIGlmIChyb290ID4gbWF4KSB7XG4gICAgcm9vdCA9IG1heDtcbiAgfVxuICBpZiAobWF4ID09PSAwKSB7ICAgICAgICAgICAgICAgICAgICAgLyogbm8gc3ltYm9scyB0byBjb2RlIGF0IGFsbCAqL1xuICAgIC8vdGFibGUub3Bbb3B0cy50YWJsZV9pbmRleF0gPSA2NDsgIC8vaGVyZS5vcCA9ICh2YXIgY2hhcik2NDsgICAgLyogaW52YWxpZCBjb2RlIG1hcmtlciAqL1xuICAgIC8vdGFibGUuYml0c1tvcHRzLnRhYmxlX2luZGV4XSA9IDE7ICAgLy9oZXJlLmJpdHMgPSAodmFyIGNoYXIpMTtcbiAgICAvL3RhYmxlLnZhbFtvcHRzLnRhYmxlX2luZGV4KytdID0gMDsgICAvL2hlcmUudmFsID0gKHZhciBzaG9ydCkwO1xuICAgIHRhYmxlW3RhYmxlX2luZGV4KytdID0gKDEgPDwgMjQpIHwgKDY0IDw8IDE2KSB8IDA7XG5cblxuICAgIC8vdGFibGUub3Bbb3B0cy50YWJsZV9pbmRleF0gPSA2NDtcbiAgICAvL3RhYmxlLmJpdHNbb3B0cy50YWJsZV9pbmRleF0gPSAxO1xuICAgIC8vdGFibGUudmFsW29wdHMudGFibGVfaW5kZXgrK10gPSAwO1xuICAgIHRhYmxlW3RhYmxlX2luZGV4KytdID0gKDEgPDwgMjQpIHwgKDY0IDw8IDE2KSB8IDA7XG5cbiAgICBvcHRzLmJpdHMgPSAxO1xuICAgIHJldHVybiAwOyAgICAgLyogbm8gc3ltYm9scywgYnV0IHdhaXQgZm9yIGRlY29kaW5nIHRvIHJlcG9ydCBlcnJvciAqL1xuICB9XG4gIGZvciAobWluID0gMTsgbWluIDwgbWF4OyBtaW4rKykge1xuICAgIGlmIChjb3VudFttaW5dICE9PSAwKSB7IGJyZWFrOyB9XG4gIH1cbiAgaWYgKHJvb3QgPCBtaW4pIHtcbiAgICByb290ID0gbWluO1xuICB9XG5cbiAgLyogY2hlY2sgZm9yIGFuIG92ZXItc3Vic2NyaWJlZCBvciBpbmNvbXBsZXRlIHNldCBvZiBsZW5ndGhzICovXG4gIGxlZnQgPSAxO1xuICBmb3IgKGxlbiA9IDE7IGxlbiA8PSBNQVhCSVRTOyBsZW4rKykge1xuICAgIGxlZnQgPDw9IDE7XG4gICAgbGVmdCAtPSBjb3VudFtsZW5dO1xuICAgIGlmIChsZWZ0IDwgMCkge1xuICAgICAgcmV0dXJuIC0xO1xuICAgIH0gICAgICAgIC8qIG92ZXItc3Vic2NyaWJlZCAqL1xuICB9XG4gIGlmIChsZWZ0ID4gMCAmJiAodHlwZSA9PT0gQ09ERVMgfHwgbWF4ICE9PSAxKSkge1xuICAgIHJldHVybiAtMTsgICAgICAgICAgICAgICAgICAgICAgLyogaW5jb21wbGV0ZSBzZXQgKi9cbiAgfVxuXG4gIC8qIGdlbmVyYXRlIG9mZnNldHMgaW50byBzeW1ib2wgdGFibGUgZm9yIGVhY2ggbGVuZ3RoIGZvciBzb3J0aW5nICovXG4gIG9mZnNbMV0gPSAwO1xuICBmb3IgKGxlbiA9IDE7IGxlbiA8IE1BWEJJVFM7IGxlbisrKSB7XG4gICAgb2Zmc1tsZW4gKyAxXSA9IG9mZnNbbGVuXSArIGNvdW50W2xlbl07XG4gIH1cblxuICAvKiBzb3J0IHN5bWJvbHMgYnkgbGVuZ3RoLCBieSBzeW1ib2wgb3JkZXIgd2l0aGluIGVhY2ggbGVuZ3RoICovXG4gIGZvciAoc3ltID0gMDsgc3ltIDwgY29kZXM7IHN5bSsrKSB7XG4gICAgaWYgKGxlbnNbbGVuc19pbmRleCArIHN5bV0gIT09IDApIHtcbiAgICAgIHdvcmtbb2Zmc1tsZW5zW2xlbnNfaW5kZXggKyBzeW1dXSsrXSA9IHN5bTtcbiAgICB9XG4gIH1cblxuICAvKlxuICAgQ3JlYXRlIGFuZCBmaWxsIGluIGRlY29kaW5nIHRhYmxlcy4gIEluIHRoaXMgbG9vcCwgdGhlIHRhYmxlIGJlaW5nXG4gICBmaWxsZWQgaXMgYXQgbmV4dCBhbmQgaGFzIGN1cnIgaW5kZXggYml0cy4gIFRoZSBjb2RlIGJlaW5nIHVzZWQgaXMgaHVmZlxuICAgd2l0aCBsZW5ndGggbGVuLiAgVGhhdCBjb2RlIGlzIGNvbnZlcnRlZCB0byBhbiBpbmRleCBieSBkcm9wcGluZyBkcm9wXG4gICBiaXRzIG9mZiBvZiB0aGUgYm90dG9tLiAgRm9yIGNvZGVzIHdoZXJlIGxlbiBpcyBsZXNzIHRoYW4gZHJvcCArIGN1cnIsXG4gICB0aG9zZSB0b3AgZHJvcCArIGN1cnIgLSBsZW4gYml0cyBhcmUgaW5jcmVtZW50ZWQgdGhyb3VnaCBhbGwgdmFsdWVzIHRvXG4gICBmaWxsIHRoZSB0YWJsZSB3aXRoIHJlcGxpY2F0ZWQgZW50cmllcy5cblxuICAgcm9vdCBpcyB0aGUgbnVtYmVyIG9mIGluZGV4IGJpdHMgZm9yIHRoZSByb290IHRhYmxlLiAgV2hlbiBsZW4gZXhjZWVkc1xuICAgcm9vdCwgc3ViLXRhYmxlcyBhcmUgY3JlYXRlZCBwb2ludGVkIHRvIGJ5IHRoZSByb290IGVudHJ5IHdpdGggYW4gaW5kZXhcbiAgIG9mIHRoZSBsb3cgcm9vdCBiaXRzIG9mIGh1ZmYuICBUaGlzIGlzIHNhdmVkIGluIGxvdyB0byBjaGVjayBmb3Igd2hlbiBhXG4gICBuZXcgc3ViLXRhYmxlIHNob3VsZCBiZSBzdGFydGVkLiAgZHJvcCBpcyB6ZXJvIHdoZW4gdGhlIHJvb3QgdGFibGUgaXNcbiAgIGJlaW5nIGZpbGxlZCwgYW5kIGRyb3AgaXMgcm9vdCB3aGVuIHN1Yi10YWJsZXMgYXJlIGJlaW5nIGZpbGxlZC5cblxuICAgV2hlbiBhIG5ldyBzdWItdGFibGUgaXMgbmVlZGVkLCBpdCBpcyBuZWNlc3NhcnkgdG8gbG9vayBhaGVhZCBpbiB0aGVcbiAgIGNvZGUgbGVuZ3RocyB0byBkZXRlcm1pbmUgd2hhdCBzaXplIHN1Yi10YWJsZSBpcyBuZWVkZWQuICBUaGUgbGVuZ3RoXG4gICBjb3VudHMgYXJlIHVzZWQgZm9yIHRoaXMsIGFuZCBzbyBjb3VudFtdIGlzIGRlY3JlbWVudGVkIGFzIGNvZGVzIGFyZVxuICAgZW50ZXJlZCBpbiB0aGUgdGFibGVzLlxuXG4gICB1c2VkIGtlZXBzIHRyYWNrIG9mIGhvdyBtYW55IHRhYmxlIGVudHJpZXMgaGF2ZSBiZWVuIGFsbG9jYXRlZCBmcm9tIHRoZVxuICAgcHJvdmlkZWQgKnRhYmxlIHNwYWNlLiAgSXQgaXMgY2hlY2tlZCBmb3IgTEVOUyBhbmQgRElTVCB0YWJsZXMgYWdhaW5zdFxuICAgdGhlIGNvbnN0YW50cyBFTk9VR0hfTEVOUyBhbmQgRU5PVUdIX0RJU1RTIHRvIGd1YXJkIGFnYWluc3QgY2hhbmdlcyBpblxuICAgdGhlIGluaXRpYWwgcm9vdCB0YWJsZSBzaXplIGNvbnN0YW50cy4gIFNlZSB0aGUgY29tbWVudHMgaW4gaW5mdHJlZXMuaFxuICAgZm9yIG1vcmUgaW5mb3JtYXRpb24uXG5cbiAgIHN5bSBpbmNyZW1lbnRzIHRocm91Z2ggYWxsIHN5bWJvbHMsIGFuZCB0aGUgbG9vcCB0ZXJtaW5hdGVzIHdoZW5cbiAgIGFsbCBjb2RlcyBvZiBsZW5ndGggbWF4LCBpLmUuIGFsbCBjb2RlcywgaGF2ZSBiZWVuIHByb2Nlc3NlZC4gIFRoaXNcbiAgIHJvdXRpbmUgcGVybWl0cyBpbmNvbXBsZXRlIGNvZGVzLCBzbyBhbm90aGVyIGxvb3AgYWZ0ZXIgdGhpcyBvbmUgZmlsbHNcbiAgIGluIHRoZSByZXN0IG9mIHRoZSBkZWNvZGluZyB0YWJsZXMgd2l0aCBpbnZhbGlkIGNvZGUgbWFya2Vycy5cbiAgICovXG5cbiAgLyogc2V0IHVwIGZvciBjb2RlIHR5cGUgKi9cbiAgLy8gcG9vciBtYW4gb3B0aW1pemF0aW9uIC0gdXNlIGlmLWVsc2UgaW5zdGVhZCBvZiBzd2l0Y2gsXG4gIC8vIHRvIGF2b2lkIGRlb3B0cyBpbiBvbGQgdjhcbiAgaWYgKHR5cGUgPT09IENPREVTKSB7XG4gICAgYmFzZSA9IGV4dHJhID0gd29yazsgICAgLyogZHVtbXkgdmFsdWUtLW5vdCB1c2VkICovXG4gICAgZW5kID0gMTk7XG5cbiAgfSBlbHNlIGlmICh0eXBlID09PSBMRU5TKSB7XG4gICAgYmFzZSA9IGxiYXNlO1xuICAgIGJhc2VfaW5kZXggLT0gMjU3O1xuICAgIGV4dHJhID0gbGV4dDtcbiAgICBleHRyYV9pbmRleCAtPSAyNTc7XG4gICAgZW5kID0gMjU2O1xuXG4gIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAvKiBESVNUUyAqL1xuICAgIGJhc2UgPSBkYmFzZTtcbiAgICBleHRyYSA9IGRleHQ7XG4gICAgZW5kID0gLTE7XG4gIH1cblxuICAvKiBpbml0aWFsaXplIG9wdHMgZm9yIGxvb3AgKi9cbiAgaHVmZiA9IDA7ICAgICAgICAgICAgICAgICAgIC8qIHN0YXJ0aW5nIGNvZGUgKi9cbiAgc3ltID0gMDsgICAgICAgICAgICAgICAgICAgIC8qIHN0YXJ0aW5nIGNvZGUgc3ltYm9sICovXG4gIGxlbiA9IG1pbjsgICAgICAgICAgICAgICAgICAvKiBzdGFydGluZyBjb2RlIGxlbmd0aCAqL1xuICBuZXh0ID0gdGFibGVfaW5kZXg7ICAgICAgICAgICAgICAvKiBjdXJyZW50IHRhYmxlIHRvIGZpbGwgaW4gKi9cbiAgY3VyciA9IHJvb3Q7ICAgICAgICAgICAgICAgIC8qIGN1cnJlbnQgdGFibGUgaW5kZXggYml0cyAqL1xuICBkcm9wID0gMDsgICAgICAgICAgICAgICAgICAgLyogY3VycmVudCBiaXRzIHRvIGRyb3AgZnJvbSBjb2RlIGZvciBpbmRleCAqL1xuICBsb3cgPSAtMTsgICAgICAgICAgICAgICAgICAgLyogdHJpZ2dlciBuZXcgc3ViLXRhYmxlIHdoZW4gbGVuID4gcm9vdCAqL1xuICB1c2VkID0gMSA8PCByb290OyAgICAgICAgICAvKiB1c2Ugcm9vdCB0YWJsZSBlbnRyaWVzICovXG4gIG1hc2sgPSB1c2VkIC0gMTsgICAgICAgICAgICAvKiBtYXNrIGZvciBjb21wYXJpbmcgbG93ICovXG5cbiAgLyogY2hlY2sgYXZhaWxhYmxlIHRhYmxlIHNwYWNlICovXG4gIGlmICgodHlwZSA9PT0gTEVOUyAmJiB1c2VkID4gRU5PVUdIX0xFTlMpIHx8XG4gICAgKHR5cGUgPT09IERJU1RTICYmIHVzZWQgPiBFTk9VR0hfRElTVFMpKSB7XG4gICAgcmV0dXJuIDE7XG4gIH1cblxuICB2YXIgaSA9IDA7XG4gIC8qIHByb2Nlc3MgYWxsIGNvZGVzIGFuZCBtYWtlIHRhYmxlIGVudHJpZXMgKi9cbiAgZm9yICg7Oykge1xuICAgIGkrKztcbiAgICAvKiBjcmVhdGUgdGFibGUgZW50cnkgKi9cbiAgICBoZXJlX2JpdHMgPSBsZW4gLSBkcm9wO1xuICAgIGlmICh3b3JrW3N5bV0gPCBlbmQpIHtcbiAgICAgIGhlcmVfb3AgPSAwO1xuICAgICAgaGVyZV92YWwgPSB3b3JrW3N5bV07XG4gICAgfVxuICAgIGVsc2UgaWYgKHdvcmtbc3ltXSA+IGVuZCkge1xuICAgICAgaGVyZV9vcCA9IGV4dHJhW2V4dHJhX2luZGV4ICsgd29ya1tzeW1dXTtcbiAgICAgIGhlcmVfdmFsID0gYmFzZVtiYXNlX2luZGV4ICsgd29ya1tzeW1dXTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICBoZXJlX29wID0gMzIgKyA2NDsgICAgICAgICAvKiBlbmQgb2YgYmxvY2sgKi9cbiAgICAgIGhlcmVfdmFsID0gMDtcbiAgICB9XG5cbiAgICAvKiByZXBsaWNhdGUgZm9yIHRob3NlIGluZGljZXMgd2l0aCBsb3cgbGVuIGJpdHMgZXF1YWwgdG8gaHVmZiAqL1xuICAgIGluY3IgPSAxIDw8IChsZW4gLSBkcm9wKTtcbiAgICBmaWxsID0gMSA8PCBjdXJyO1xuICAgIG1pbiA9IGZpbGw7ICAgICAgICAgICAgICAgICAvKiBzYXZlIG9mZnNldCB0byBuZXh0IHRhYmxlICovXG4gICAgZG8ge1xuICAgICAgZmlsbCAtPSBpbmNyO1xuICAgICAgdGFibGVbbmV4dCArIChodWZmID4+IGRyb3ApICsgZmlsbF0gPSAoaGVyZV9iaXRzIDw8IDI0KSB8IChoZXJlX29wIDw8IDE2KSB8IGhlcmVfdmFsIHwwO1xuICAgIH0gd2hpbGUgKGZpbGwgIT09IDApO1xuXG4gICAgLyogYmFja3dhcmRzIGluY3JlbWVudCB0aGUgbGVuLWJpdCBjb2RlIGh1ZmYgKi9cbiAgICBpbmNyID0gMSA8PCAobGVuIC0gMSk7XG4gICAgd2hpbGUgKGh1ZmYgJiBpbmNyKSB7XG4gICAgICBpbmNyID4+PSAxO1xuICAgIH1cbiAgICBpZiAoaW5jciAhPT0gMCkge1xuICAgICAgaHVmZiAmPSBpbmNyIC0gMTtcbiAgICAgIGh1ZmYgKz0gaW5jcjtcbiAgICB9IGVsc2Uge1xuICAgICAgaHVmZiA9IDA7XG4gICAgfVxuXG4gICAgLyogZ28gdG8gbmV4dCBzeW1ib2wsIHVwZGF0ZSBjb3VudCwgbGVuICovXG4gICAgc3ltKys7XG4gICAgaWYgKC0tY291bnRbbGVuXSA9PT0gMCkge1xuICAgICAgaWYgKGxlbiA9PT0gbWF4KSB7IGJyZWFrOyB9XG4gICAgICBsZW4gPSBsZW5zW2xlbnNfaW5kZXggKyB3b3JrW3N5bV1dO1xuICAgIH1cblxuICAgIC8qIGNyZWF0ZSBuZXcgc3ViLXRhYmxlIGlmIG5lZWRlZCAqL1xuICAgIGlmIChsZW4gPiByb290ICYmIChodWZmICYgbWFzaykgIT09IGxvdykge1xuICAgICAgLyogaWYgZmlyc3QgdGltZSwgdHJhbnNpdGlvbiB0byBzdWItdGFibGVzICovXG4gICAgICBpZiAoZHJvcCA9PT0gMCkge1xuICAgICAgICBkcm9wID0gcm9vdDtcbiAgICAgIH1cblxuICAgICAgLyogaW5jcmVtZW50IHBhc3QgbGFzdCB0YWJsZSAqL1xuICAgICAgbmV4dCArPSBtaW47ICAgICAgICAgICAgLyogaGVyZSBtaW4gaXMgMSA8PCBjdXJyICovXG5cbiAgICAgIC8qIGRldGVybWluZSBsZW5ndGggb2YgbmV4dCB0YWJsZSAqL1xuICAgICAgY3VyciA9IGxlbiAtIGRyb3A7XG4gICAgICBsZWZ0ID0gMSA8PCBjdXJyO1xuICAgICAgd2hpbGUgKGN1cnIgKyBkcm9wIDwgbWF4KSB7XG4gICAgICAgIGxlZnQgLT0gY291bnRbY3VyciArIGRyb3BdO1xuICAgICAgICBpZiAobGVmdCA8PSAwKSB7IGJyZWFrOyB9XG4gICAgICAgIGN1cnIrKztcbiAgICAgICAgbGVmdCA8PD0gMTtcbiAgICAgIH1cblxuICAgICAgLyogY2hlY2sgZm9yIGVub3VnaCBzcGFjZSAqL1xuICAgICAgdXNlZCArPSAxIDw8IGN1cnI7XG4gICAgICBpZiAoKHR5cGUgPT09IExFTlMgJiYgdXNlZCA+IEVOT1VHSF9MRU5TKSB8fFxuICAgICAgICAodHlwZSA9PT0gRElTVFMgJiYgdXNlZCA+IEVOT1VHSF9ESVNUUykpIHtcbiAgICAgICAgcmV0dXJuIDE7XG4gICAgICB9XG5cbiAgICAgIC8qIHBvaW50IGVudHJ5IGluIHJvb3QgdGFibGUgdG8gc3ViLXRhYmxlICovXG4gICAgICBsb3cgPSBodWZmICYgbWFzaztcbiAgICAgIC8qdGFibGUub3BbbG93XSA9IGN1cnI7XG4gICAgICB0YWJsZS5iaXRzW2xvd10gPSByb290O1xuICAgICAgdGFibGUudmFsW2xvd10gPSBuZXh0IC0gb3B0cy50YWJsZV9pbmRleDsqL1xuICAgICAgdGFibGVbbG93XSA9IChyb290IDw8IDI0KSB8IChjdXJyIDw8IDE2KSB8IChuZXh0IC0gdGFibGVfaW5kZXgpIHwwO1xuICAgIH1cbiAgfVxuXG4gIC8qIGZpbGwgaW4gcmVtYWluaW5nIHRhYmxlIGVudHJ5IGlmIGNvZGUgaXMgaW5jb21wbGV0ZSAoZ3VhcmFudGVlZCB0byBoYXZlXG4gICBhdCBtb3N0IG9uZSByZW1haW5pbmcgZW50cnksIHNpbmNlIGlmIHRoZSBjb2RlIGlzIGluY29tcGxldGUsIHRoZVxuICAgbWF4aW11bSBjb2RlIGxlbmd0aCB0aGF0IHdhcyBhbGxvd2VkIHRvIGdldCB0aGlzIGZhciBpcyBvbmUgYml0KSAqL1xuICBpZiAoaHVmZiAhPT0gMCkge1xuICAgIC8vdGFibGUub3BbbmV4dCArIGh1ZmZdID0gNjQ7ICAgICAgICAgICAgLyogaW52YWxpZCBjb2RlIG1hcmtlciAqL1xuICAgIC8vdGFibGUuYml0c1tuZXh0ICsgaHVmZl0gPSBsZW4gLSBkcm9wO1xuICAgIC8vdGFibGUudmFsW25leHQgKyBodWZmXSA9IDA7XG4gICAgdGFibGVbbmV4dCArIGh1ZmZdID0gKChsZW4gLSBkcm9wKSA8PCAyNCkgfCAoNjQgPDwgMTYpIHwwO1xuICB9XG5cbiAgLyogc2V0IHJldHVybiBwYXJhbWV0ZXJzICovXG4gIC8vb3B0cy50YWJsZV9pbmRleCArPSB1c2VkO1xuICBvcHRzLmJpdHMgPSByb290O1xuICByZXR1cm4gMDtcbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICAyOiAgICAgICduZWVkIGRpY3Rpb25hcnknLCAgICAgLyogWl9ORUVEX0RJQ1QgICAgICAgMiAgKi9cbiAgMTogICAgICAnc3RyZWFtIGVuZCcsICAgICAgICAgIC8qIFpfU1RSRUFNX0VORCAgICAgIDEgICovXG4gIDA6ICAgICAgJycsICAgICAgICAgICAgICAgICAgICAvKiBaX09LICAgICAgICAgICAgICAwICAqL1xuICAnLTEnOiAgICdmaWxlIGVycm9yJywgICAgICAgICAgLyogWl9FUlJOTyAgICAgICAgICgtMSkgKi9cbiAgJy0yJzogICAnc3RyZWFtIGVycm9yJywgICAgICAgIC8qIFpfU1RSRUFNX0VSUk9SICAoLTIpICovXG4gICctMyc6ICAgJ2RhdGEgZXJyb3InLCAgICAgICAgICAvKiBaX0RBVEFfRVJST1IgICAgKC0zKSAqL1xuICAnLTQnOiAgICdpbnN1ZmZpY2llbnQgbWVtb3J5JywgLyogWl9NRU1fRVJST1IgICAgICgtNCkgKi9cbiAgJy01JzogICAnYnVmZmVyIGVycm9yJywgICAgICAgIC8qIFpfQlVGX0VSUk9SICAgICAoLTUpICovXG4gICctNic6ICAgJ2luY29tcGF0aWJsZSB2ZXJzaW9uJyAvKiBaX1ZFUlNJT05fRVJST1IgKC02KSAqL1xufTtcbiIsIid1c2Ugc3RyaWN0JztcblxuXG52YXIgdXRpbHMgPSByZXF1aXJlKCcuLi91dGlscy9jb21tb24nKTtcblxuLyogUHVibGljIGNvbnN0YW50cyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki9cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovXG5cblxuLy92YXIgWl9GSUxURVJFRCAgICAgICAgICA9IDE7XG4vL3ZhciBaX0hVRkZNQU5fT05MWSAgICAgID0gMjtcbi8vdmFyIFpfUkxFICAgICAgICAgICAgICAgPSAzO1xudmFyIFpfRklYRUQgICAgICAgICAgICAgICA9IDQ7XG4vL3ZhciBaX0RFRkFVTFRfU1RSQVRFR1kgID0gMDtcblxuLyogUG9zc2libGUgdmFsdWVzIG9mIHRoZSBkYXRhX3R5cGUgZmllbGQgKHRob3VnaCBzZWUgaW5mbGF0ZSgpKSAqL1xudmFyIFpfQklOQVJZICAgICAgICAgICAgICA9IDA7XG52YXIgWl9URVhUICAgICAgICAgICAgICAgID0gMTtcbi8vdmFyIFpfQVNDSUkgICAgICAgICAgICAgPSAxOyAvLyA9IFpfVEVYVFxudmFyIFpfVU5LTk9XTiAgICAgICAgICAgICA9IDI7XG5cbi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovXG5cblxuZnVuY3Rpb24gemVybyhidWYpIHsgdmFyIGxlbiA9IGJ1Zi5sZW5ndGg7IHdoaWxlICgtLWxlbiA+PSAwKSB7IGJ1ZltsZW5dID0gMDsgfSB9XG5cbi8vIEZyb20genV0aWwuaFxuXG52YXIgU1RPUkVEX0JMT0NLID0gMDtcbnZhciBTVEFUSUNfVFJFRVMgPSAxO1xudmFyIERZTl9UUkVFUyAgICA9IDI7XG4vKiBUaGUgdGhyZWUga2luZHMgb2YgYmxvY2sgdHlwZSAqL1xuXG52YXIgTUlOX01BVENIICAgID0gMztcbnZhciBNQVhfTUFUQ0ggICAgPSAyNTg7XG4vKiBUaGUgbWluaW11bSBhbmQgbWF4aW11bSBtYXRjaCBsZW5ndGhzICovXG5cbi8vIEZyb20gZGVmbGF0ZS5oXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIEludGVybmFsIGNvbXByZXNzaW9uIHN0YXRlLlxuICovXG5cbnZhciBMRU5HVEhfQ09ERVMgID0gMjk7XG4vKiBudW1iZXIgb2YgbGVuZ3RoIGNvZGVzLCBub3QgY291bnRpbmcgdGhlIHNwZWNpYWwgRU5EX0JMT0NLIGNvZGUgKi9cblxudmFyIExJVEVSQUxTICAgICAgPSAyNTY7XG4vKiBudW1iZXIgb2YgbGl0ZXJhbCBieXRlcyAwLi4yNTUgKi9cblxudmFyIExfQ09ERVMgICAgICAgPSBMSVRFUkFMUyArIDEgKyBMRU5HVEhfQ09ERVM7XG4vKiBudW1iZXIgb2YgTGl0ZXJhbCBvciBMZW5ndGggY29kZXMsIGluY2x1ZGluZyB0aGUgRU5EX0JMT0NLIGNvZGUgKi9cblxudmFyIERfQ09ERVMgICAgICAgPSAzMDtcbi8qIG51bWJlciBvZiBkaXN0YW5jZSBjb2RlcyAqL1xuXG52YXIgQkxfQ09ERVMgICAgICA9IDE5O1xuLyogbnVtYmVyIG9mIGNvZGVzIHVzZWQgdG8gdHJhbnNmZXIgdGhlIGJpdCBsZW5ndGhzICovXG5cbnZhciBIRUFQX1NJWkUgICAgID0gMiAqIExfQ09ERVMgKyAxO1xuLyogbWF4aW11bSBoZWFwIHNpemUgKi9cblxudmFyIE1BWF9CSVRTICAgICAgPSAxNTtcbi8qIEFsbCBjb2RlcyBtdXN0IG5vdCBleGNlZWQgTUFYX0JJVFMgYml0cyAqL1xuXG52YXIgQnVmX3NpemUgICAgICA9IDE2O1xuLyogc2l6ZSBvZiBiaXQgYnVmZmVyIGluIGJpX2J1ZiAqL1xuXG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogQ29uc3RhbnRzXG4gKi9cblxudmFyIE1BWF9CTF9CSVRTID0gNztcbi8qIEJpdCBsZW5ndGggY29kZXMgbXVzdCBub3QgZXhjZWVkIE1BWF9CTF9CSVRTIGJpdHMgKi9cblxudmFyIEVORF9CTE9DSyAgID0gMjU2O1xuLyogZW5kIG9mIGJsb2NrIGxpdGVyYWwgY29kZSAqL1xuXG52YXIgUkVQXzNfNiAgICAgPSAxNjtcbi8qIHJlcGVhdCBwcmV2aW91cyBiaXQgbGVuZ3RoIDMtNiB0aW1lcyAoMiBiaXRzIG9mIHJlcGVhdCBjb3VudCkgKi9cblxudmFyIFJFUFpfM18xMCAgID0gMTc7XG4vKiByZXBlYXQgYSB6ZXJvIGxlbmd0aCAzLTEwIHRpbWVzICAoMyBiaXRzIG9mIHJlcGVhdCBjb3VudCkgKi9cblxudmFyIFJFUFpfMTFfMTM4ID0gMTg7XG4vKiByZXBlYXQgYSB6ZXJvIGxlbmd0aCAxMS0xMzggdGltZXMgICg3IGJpdHMgb2YgcmVwZWF0IGNvdW50KSAqL1xuXG4vKiBlc2xpbnQtZGlzYWJsZSBjb21tYS1zcGFjaW5nLGFycmF5LWJyYWNrZXQtc3BhY2luZyAqL1xudmFyIGV4dHJhX2xiaXRzID0gICAvKiBleHRyYSBiaXRzIGZvciBlYWNoIGxlbmd0aCBjb2RlICovXG4gIFswLDAsMCwwLDAsMCwwLDAsMSwxLDEsMSwyLDIsMiwyLDMsMywzLDMsNCw0LDQsNCw1LDUsNSw1LDBdO1xuXG52YXIgZXh0cmFfZGJpdHMgPSAgIC8qIGV4dHJhIGJpdHMgZm9yIGVhY2ggZGlzdGFuY2UgY29kZSAqL1xuICBbMCwwLDAsMCwxLDEsMiwyLDMsMyw0LDQsNSw1LDYsNiw3LDcsOCw4LDksOSwxMCwxMCwxMSwxMSwxMiwxMiwxMywxM107XG5cbnZhciBleHRyYV9ibGJpdHMgPSAgLyogZXh0cmEgYml0cyBmb3IgZWFjaCBiaXQgbGVuZ3RoIGNvZGUgKi9cbiAgWzAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMiwzLDddO1xuXG52YXIgYmxfb3JkZXIgPVxuICBbMTYsMTcsMTgsMCw4LDcsOSw2LDEwLDUsMTEsNCwxMiwzLDEzLDIsMTQsMSwxNV07XG4vKiBlc2xpbnQtZW5hYmxlIGNvbW1hLXNwYWNpbmcsYXJyYXktYnJhY2tldC1zcGFjaW5nICovXG5cbi8qIFRoZSBsZW5ndGhzIG9mIHRoZSBiaXQgbGVuZ3RoIGNvZGVzIGFyZSBzZW50IGluIG9yZGVyIG9mIGRlY3JlYXNpbmdcbiAqIHByb2JhYmlsaXR5LCB0byBhdm9pZCB0cmFuc21pdHRpbmcgdGhlIGxlbmd0aHMgZm9yIHVudXNlZCBiaXQgbGVuZ3RoIGNvZGVzLlxuICovXG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogTG9jYWwgZGF0YS4gVGhlc2UgYXJlIGluaXRpYWxpemVkIG9ubHkgb25jZS5cbiAqL1xuXG4vLyBXZSBwcmUtZmlsbCBhcnJheXMgd2l0aCAwIHRvIGF2b2lkIHVuaW5pdGlhbGl6ZWQgZ2Fwc1xuXG52YXIgRElTVF9DT0RFX0xFTiA9IDUxMjsgLyogc2VlIGRlZmluaXRpb24gb2YgYXJyYXkgZGlzdF9jb2RlIGJlbG93ICovXG5cbi8vICEhISEgVXNlIGZsYXQgYXJyYXkgaW5zZGVhZCBvZiBzdHJ1Y3R1cmUsIEZyZXEgPSBpKjIsIExlbiA9IGkqMisxXG52YXIgc3RhdGljX2x0cmVlICA9IG5ldyBBcnJheSgoTF9DT0RFUyArIDIpICogMik7XG56ZXJvKHN0YXRpY19sdHJlZSk7XG4vKiBUaGUgc3RhdGljIGxpdGVyYWwgdHJlZS4gU2luY2UgdGhlIGJpdCBsZW5ndGhzIGFyZSBpbXBvc2VkLCB0aGVyZSBpcyBub1xuICogbmVlZCBmb3IgdGhlIExfQ09ERVMgZXh0cmEgY29kZXMgdXNlZCBkdXJpbmcgaGVhcCBjb25zdHJ1Y3Rpb24uIEhvd2V2ZXJcbiAqIFRoZSBjb2RlcyAyODYgYW5kIDI4NyBhcmUgbmVlZGVkIHRvIGJ1aWxkIGEgY2Fub25pY2FsIHRyZWUgKHNlZSBfdHJfaW5pdFxuICogYmVsb3cpLlxuICovXG5cbnZhciBzdGF0aWNfZHRyZWUgID0gbmV3IEFycmF5KERfQ09ERVMgKiAyKTtcbnplcm8oc3RhdGljX2R0cmVlKTtcbi8qIFRoZSBzdGF0aWMgZGlzdGFuY2UgdHJlZS4gKEFjdHVhbGx5IGEgdHJpdmlhbCB0cmVlIHNpbmNlIGFsbCBjb2RlcyB1c2VcbiAqIDUgYml0cy4pXG4gKi9cblxudmFyIF9kaXN0X2NvZGUgICAgPSBuZXcgQXJyYXkoRElTVF9DT0RFX0xFTik7XG56ZXJvKF9kaXN0X2NvZGUpO1xuLyogRGlzdGFuY2UgY29kZXMuIFRoZSBmaXJzdCAyNTYgdmFsdWVzIGNvcnJlc3BvbmQgdG8gdGhlIGRpc3RhbmNlc1xuICogMyAuLiAyNTgsIHRoZSBsYXN0IDI1NiB2YWx1ZXMgY29ycmVzcG9uZCB0byB0aGUgdG9wIDggYml0cyBvZlxuICogdGhlIDE1IGJpdCBkaXN0YW5jZXMuXG4gKi9cblxudmFyIF9sZW5ndGhfY29kZSAgPSBuZXcgQXJyYXkoTUFYX01BVENIIC0gTUlOX01BVENIICsgMSk7XG56ZXJvKF9sZW5ndGhfY29kZSk7XG4vKiBsZW5ndGggY29kZSBmb3IgZWFjaCBub3JtYWxpemVkIG1hdGNoIGxlbmd0aCAoMCA9PSBNSU5fTUFUQ0gpICovXG5cbnZhciBiYXNlX2xlbmd0aCAgID0gbmV3IEFycmF5KExFTkdUSF9DT0RFUyk7XG56ZXJvKGJhc2VfbGVuZ3RoKTtcbi8qIEZpcnN0IG5vcm1hbGl6ZWQgbGVuZ3RoIGZvciBlYWNoIGNvZGUgKDAgPSBNSU5fTUFUQ0gpICovXG5cbnZhciBiYXNlX2Rpc3QgICAgID0gbmV3IEFycmF5KERfQ09ERVMpO1xuemVybyhiYXNlX2Rpc3QpO1xuLyogRmlyc3Qgbm9ybWFsaXplZCBkaXN0YW5jZSBmb3IgZWFjaCBjb2RlICgwID0gZGlzdGFuY2Ugb2YgMSkgKi9cblxuXG5mdW5jdGlvbiBTdGF0aWNUcmVlRGVzYyhzdGF0aWNfdHJlZSwgZXh0cmFfYml0cywgZXh0cmFfYmFzZSwgZWxlbXMsIG1heF9sZW5ndGgpIHtcblxuICB0aGlzLnN0YXRpY190cmVlICA9IHN0YXRpY190cmVlOyAgLyogc3RhdGljIHRyZWUgb3IgTlVMTCAqL1xuICB0aGlzLmV4dHJhX2JpdHMgICA9IGV4dHJhX2JpdHM7ICAgLyogZXh0cmEgYml0cyBmb3IgZWFjaCBjb2RlIG9yIE5VTEwgKi9cbiAgdGhpcy5leHRyYV9iYXNlICAgPSBleHRyYV9iYXNlOyAgIC8qIGJhc2UgaW5kZXggZm9yIGV4dHJhX2JpdHMgKi9cbiAgdGhpcy5lbGVtcyAgICAgICAgPSBlbGVtczsgICAgICAgIC8qIG1heCBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIHRyZWUgKi9cbiAgdGhpcy5tYXhfbGVuZ3RoICAgPSBtYXhfbGVuZ3RoOyAgIC8qIG1heCBiaXQgbGVuZ3RoIGZvciB0aGUgY29kZXMgKi9cblxuICAvLyBzaG93IGlmIGBzdGF0aWNfdHJlZWAgaGFzIGRhdGEgb3IgZHVtbXkgLSBuZWVkZWQgZm9yIG1vbm9tb3JwaGljIG9iamVjdHNcbiAgdGhpcy5oYXNfc3RyZWUgICAgPSBzdGF0aWNfdHJlZSAmJiBzdGF0aWNfdHJlZS5sZW5ndGg7XG59XG5cblxudmFyIHN0YXRpY19sX2Rlc2M7XG52YXIgc3RhdGljX2RfZGVzYztcbnZhciBzdGF0aWNfYmxfZGVzYztcblxuXG5mdW5jdGlvbiBUcmVlRGVzYyhkeW5fdHJlZSwgc3RhdF9kZXNjKSB7XG4gIHRoaXMuZHluX3RyZWUgPSBkeW5fdHJlZTsgICAgIC8qIHRoZSBkeW5hbWljIHRyZWUgKi9cbiAgdGhpcy5tYXhfY29kZSA9IDA7ICAgICAgICAgICAgLyogbGFyZ2VzdCBjb2RlIHdpdGggbm9uIHplcm8gZnJlcXVlbmN5ICovXG4gIHRoaXMuc3RhdF9kZXNjID0gc3RhdF9kZXNjOyAgIC8qIHRoZSBjb3JyZXNwb25kaW5nIHN0YXRpYyB0cmVlICovXG59XG5cblxuXG5mdW5jdGlvbiBkX2NvZGUoZGlzdCkge1xuICByZXR1cm4gZGlzdCA8IDI1NiA/IF9kaXN0X2NvZGVbZGlzdF0gOiBfZGlzdF9jb2RlWzI1NiArIChkaXN0ID4+PiA3KV07XG59XG5cblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBPdXRwdXQgYSBzaG9ydCBMU0IgZmlyc3Qgb24gdGhlIHN0cmVhbS5cbiAqIElOIGFzc2VydGlvbjogdGhlcmUgaXMgZW5vdWdoIHJvb20gaW4gcGVuZGluZ0J1Zi5cbiAqL1xuZnVuY3Rpb24gcHV0X3Nob3J0KHMsIHcpIHtcbi8vICAgIHB1dF9ieXRlKHMsICh1Y2gpKCh3KSAmIDB4ZmYpKTtcbi8vICAgIHB1dF9ieXRlKHMsICh1Y2gpKCh1c2gpKHcpID4+IDgpKTtcbiAgcy5wZW5kaW5nX2J1ZltzLnBlbmRpbmcrK10gPSAodykgJiAweGZmO1xuICBzLnBlbmRpbmdfYnVmW3MucGVuZGluZysrXSA9ICh3ID4+PiA4KSAmIDB4ZmY7XG59XG5cblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBTZW5kIGEgdmFsdWUgb24gYSBnaXZlbiBudW1iZXIgb2YgYml0cy5cbiAqIElOIGFzc2VydGlvbjogbGVuZ3RoIDw9IDE2IGFuZCB2YWx1ZSBmaXRzIGluIGxlbmd0aCBiaXRzLlxuICovXG5mdW5jdGlvbiBzZW5kX2JpdHMocywgdmFsdWUsIGxlbmd0aCkge1xuICBpZiAocy5iaV92YWxpZCA+IChCdWZfc2l6ZSAtIGxlbmd0aCkpIHtcbiAgICBzLmJpX2J1ZiB8PSAodmFsdWUgPDwgcy5iaV92YWxpZCkgJiAweGZmZmY7XG4gICAgcHV0X3Nob3J0KHMsIHMuYmlfYnVmKTtcbiAgICBzLmJpX2J1ZiA9IHZhbHVlID4+IChCdWZfc2l6ZSAtIHMuYmlfdmFsaWQpO1xuICAgIHMuYmlfdmFsaWQgKz0gbGVuZ3RoIC0gQnVmX3NpemU7XG4gIH0gZWxzZSB7XG4gICAgcy5iaV9idWYgfD0gKHZhbHVlIDw8IHMuYmlfdmFsaWQpICYgMHhmZmZmO1xuICAgIHMuYmlfdmFsaWQgKz0gbGVuZ3RoO1xuICB9XG59XG5cblxuZnVuY3Rpb24gc2VuZF9jb2RlKHMsIGMsIHRyZWUpIHtcbiAgc2VuZF9iaXRzKHMsIHRyZWVbYyAqIDJdLyouQ29kZSovLCB0cmVlW2MgKiAyICsgMV0vKi5MZW4qLyk7XG59XG5cblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBSZXZlcnNlIHRoZSBmaXJzdCBsZW4gYml0cyBvZiBhIGNvZGUsIHVzaW5nIHN0cmFpZ2h0Zm9yd2FyZCBjb2RlIChhIGZhc3RlclxuICogbWV0aG9kIHdvdWxkIHVzZSBhIHRhYmxlKVxuICogSU4gYXNzZXJ0aW9uOiAxIDw9IGxlbiA8PSAxNVxuICovXG5mdW5jdGlvbiBiaV9yZXZlcnNlKGNvZGUsIGxlbikge1xuICB2YXIgcmVzID0gMDtcbiAgZG8ge1xuICAgIHJlcyB8PSBjb2RlICYgMTtcbiAgICBjb2RlID4+Pj0gMTtcbiAgICByZXMgPDw9IDE7XG4gIH0gd2hpbGUgKC0tbGVuID4gMCk7XG4gIHJldHVybiByZXMgPj4+IDE7XG59XG5cblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBGbHVzaCB0aGUgYml0IGJ1ZmZlciwga2VlcGluZyBhdCBtb3N0IDcgYml0cyBpbiBpdC5cbiAqL1xuZnVuY3Rpb24gYmlfZmx1c2gocykge1xuICBpZiAocy5iaV92YWxpZCA9PT0gMTYpIHtcbiAgICBwdXRfc2hvcnQocywgcy5iaV9idWYpO1xuICAgIHMuYmlfYnVmID0gMDtcbiAgICBzLmJpX3ZhbGlkID0gMDtcblxuICB9IGVsc2UgaWYgKHMuYmlfdmFsaWQgPj0gOCkge1xuICAgIHMucGVuZGluZ19idWZbcy5wZW5kaW5nKytdID0gcy5iaV9idWYgJiAweGZmO1xuICAgIHMuYmlfYnVmID4+PSA4O1xuICAgIHMuYmlfdmFsaWQgLT0gODtcbiAgfVxufVxuXG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogQ29tcHV0ZSB0aGUgb3B0aW1hbCBiaXQgbGVuZ3RocyBmb3IgYSB0cmVlIGFuZCB1cGRhdGUgdGhlIHRvdGFsIGJpdCBsZW5ndGhcbiAqIGZvciB0aGUgY3VycmVudCBibG9jay5cbiAqIElOIGFzc2VydGlvbjogdGhlIGZpZWxkcyBmcmVxIGFuZCBkYWQgYXJlIHNldCwgaGVhcFtoZWFwX21heF0gYW5kXG4gKiAgICBhYm92ZSBhcmUgdGhlIHRyZWUgbm9kZXMgc29ydGVkIGJ5IGluY3JlYXNpbmcgZnJlcXVlbmN5LlxuICogT1VUIGFzc2VydGlvbnM6IHRoZSBmaWVsZCBsZW4gaXMgc2V0IHRvIHRoZSBvcHRpbWFsIGJpdCBsZW5ndGgsIHRoZVxuICogICAgIGFycmF5IGJsX2NvdW50IGNvbnRhaW5zIHRoZSBmcmVxdWVuY2llcyBmb3IgZWFjaCBiaXQgbGVuZ3RoLlxuICogICAgIFRoZSBsZW5ndGggb3B0X2xlbiBpcyB1cGRhdGVkOyBzdGF0aWNfbGVuIGlzIGFsc28gdXBkYXRlZCBpZiBzdHJlZSBpc1xuICogICAgIG5vdCBudWxsLlxuICovXG5mdW5jdGlvbiBnZW5fYml0bGVuKHMsIGRlc2MpXG4vLyAgICBkZWZsYXRlX3N0YXRlICpzO1xuLy8gICAgdHJlZV9kZXNjICpkZXNjOyAgICAvKiB0aGUgdHJlZSBkZXNjcmlwdG9yICovXG57XG4gIHZhciB0cmVlICAgICAgICAgICAgPSBkZXNjLmR5bl90cmVlO1xuICB2YXIgbWF4X2NvZGUgICAgICAgID0gZGVzYy5tYXhfY29kZTtcbiAgdmFyIHN0cmVlICAgICAgICAgICA9IGRlc2Muc3RhdF9kZXNjLnN0YXRpY190cmVlO1xuICB2YXIgaGFzX3N0cmVlICAgICAgID0gZGVzYy5zdGF0X2Rlc2MuaGFzX3N0cmVlO1xuICB2YXIgZXh0cmEgICAgICAgICAgID0gZGVzYy5zdGF0X2Rlc2MuZXh0cmFfYml0cztcbiAgdmFyIGJhc2UgICAgICAgICAgICA9IGRlc2Muc3RhdF9kZXNjLmV4dHJhX2Jhc2U7XG4gIHZhciBtYXhfbGVuZ3RoICAgICAgPSBkZXNjLnN0YXRfZGVzYy5tYXhfbGVuZ3RoO1xuICB2YXIgaDsgICAgICAgICAgICAgIC8qIGhlYXAgaW5kZXggKi9cbiAgdmFyIG4sIG07ICAgICAgICAgICAvKiBpdGVyYXRlIG92ZXIgdGhlIHRyZWUgZWxlbWVudHMgKi9cbiAgdmFyIGJpdHM7ICAgICAgICAgICAvKiBiaXQgbGVuZ3RoICovXG4gIHZhciB4Yml0czsgICAgICAgICAgLyogZXh0cmEgYml0cyAqL1xuICB2YXIgZjsgICAgICAgICAgICAgIC8qIGZyZXF1ZW5jeSAqL1xuICB2YXIgb3ZlcmZsb3cgPSAwOyAgIC8qIG51bWJlciBvZiBlbGVtZW50cyB3aXRoIGJpdCBsZW5ndGggdG9vIGxhcmdlICovXG5cbiAgZm9yIChiaXRzID0gMDsgYml0cyA8PSBNQVhfQklUUzsgYml0cysrKSB7XG4gICAgcy5ibF9jb3VudFtiaXRzXSA9IDA7XG4gIH1cblxuICAvKiBJbiBhIGZpcnN0IHBhc3MsIGNvbXB1dGUgdGhlIG9wdGltYWwgYml0IGxlbmd0aHMgKHdoaWNoIG1heVxuICAgKiBvdmVyZmxvdyBpbiB0aGUgY2FzZSBvZiB0aGUgYml0IGxlbmd0aCB0cmVlKS5cbiAgICovXG4gIHRyZWVbcy5oZWFwW3MuaGVhcF9tYXhdICogMiArIDFdLyouTGVuKi8gPSAwOyAvKiByb290IG9mIHRoZSBoZWFwICovXG5cbiAgZm9yIChoID0gcy5oZWFwX21heCArIDE7IGggPCBIRUFQX1NJWkU7IGgrKykge1xuICAgIG4gPSBzLmhlYXBbaF07XG4gICAgYml0cyA9IHRyZWVbdHJlZVtuICogMiArIDFdLyouRGFkKi8gKiAyICsgMV0vKi5MZW4qLyArIDE7XG4gICAgaWYgKGJpdHMgPiBtYXhfbGVuZ3RoKSB7XG4gICAgICBiaXRzID0gbWF4X2xlbmd0aDtcbiAgICAgIG92ZXJmbG93Kys7XG4gICAgfVxuICAgIHRyZWVbbiAqIDIgKyAxXS8qLkxlbiovID0gYml0cztcbiAgICAvKiBXZSBvdmVyd3JpdGUgdHJlZVtuXS5EYWQgd2hpY2ggaXMgbm8gbG9uZ2VyIG5lZWRlZCAqL1xuXG4gICAgaWYgKG4gPiBtYXhfY29kZSkgeyBjb250aW51ZTsgfSAvKiBub3QgYSBsZWFmIG5vZGUgKi9cblxuICAgIHMuYmxfY291bnRbYml0c10rKztcbiAgICB4Yml0cyA9IDA7XG4gICAgaWYgKG4gPj0gYmFzZSkge1xuICAgICAgeGJpdHMgPSBleHRyYVtuIC0gYmFzZV07XG4gICAgfVxuICAgIGYgPSB0cmVlW24gKiAyXS8qLkZyZXEqLztcbiAgICBzLm9wdF9sZW4gKz0gZiAqIChiaXRzICsgeGJpdHMpO1xuICAgIGlmIChoYXNfc3RyZWUpIHtcbiAgICAgIHMuc3RhdGljX2xlbiArPSBmICogKHN0cmVlW24gKiAyICsgMV0vKi5MZW4qLyArIHhiaXRzKTtcbiAgICB9XG4gIH1cbiAgaWYgKG92ZXJmbG93ID09PSAwKSB7IHJldHVybjsgfVxuXG4gIC8vIFRyYWNlKChzdGRlcnIsXCJcXG5iaXQgbGVuZ3RoIG92ZXJmbG93XFxuXCIpKTtcbiAgLyogVGhpcyBoYXBwZW5zIGZvciBleGFtcGxlIG9uIG9iajIgYW5kIHBpYyBvZiB0aGUgQ2FsZ2FyeSBjb3JwdXMgKi9cblxuICAvKiBGaW5kIHRoZSBmaXJzdCBiaXQgbGVuZ3RoIHdoaWNoIGNvdWxkIGluY3JlYXNlOiAqL1xuICBkbyB7XG4gICAgYml0cyA9IG1heF9sZW5ndGggLSAxO1xuICAgIHdoaWxlIChzLmJsX2NvdW50W2JpdHNdID09PSAwKSB7IGJpdHMtLTsgfVxuICAgIHMuYmxfY291bnRbYml0c10tLTsgICAgICAvKiBtb3ZlIG9uZSBsZWFmIGRvd24gdGhlIHRyZWUgKi9cbiAgICBzLmJsX2NvdW50W2JpdHMgKyAxXSArPSAyOyAvKiBtb3ZlIG9uZSBvdmVyZmxvdyBpdGVtIGFzIGl0cyBicm90aGVyICovXG4gICAgcy5ibF9jb3VudFttYXhfbGVuZ3RoXS0tO1xuICAgIC8qIFRoZSBicm90aGVyIG9mIHRoZSBvdmVyZmxvdyBpdGVtIGFsc28gbW92ZXMgb25lIHN0ZXAgdXAsXG4gICAgICogYnV0IHRoaXMgZG9lcyBub3QgYWZmZWN0IGJsX2NvdW50W21heF9sZW5ndGhdXG4gICAgICovXG4gICAgb3ZlcmZsb3cgLT0gMjtcbiAgfSB3aGlsZSAob3ZlcmZsb3cgPiAwKTtcblxuICAvKiBOb3cgcmVjb21wdXRlIGFsbCBiaXQgbGVuZ3Rocywgc2Nhbm5pbmcgaW4gaW5jcmVhc2luZyBmcmVxdWVuY3kuXG4gICAqIGggaXMgc3RpbGwgZXF1YWwgdG8gSEVBUF9TSVpFLiAoSXQgaXMgc2ltcGxlciB0byByZWNvbnN0cnVjdCBhbGxcbiAgICogbGVuZ3RocyBpbnN0ZWFkIG9mIGZpeGluZyBvbmx5IHRoZSB3cm9uZyBvbmVzLiBUaGlzIGlkZWEgaXMgdGFrZW5cbiAgICogZnJvbSAnYXInIHdyaXR0ZW4gYnkgSGFydWhpa28gT2t1bXVyYS4pXG4gICAqL1xuICBmb3IgKGJpdHMgPSBtYXhfbGVuZ3RoOyBiaXRzICE9PSAwOyBiaXRzLS0pIHtcbiAgICBuID0gcy5ibF9jb3VudFtiaXRzXTtcbiAgICB3aGlsZSAobiAhPT0gMCkge1xuICAgICAgbSA9IHMuaGVhcFstLWhdO1xuICAgICAgaWYgKG0gPiBtYXhfY29kZSkgeyBjb250aW51ZTsgfVxuICAgICAgaWYgKHRyZWVbbSAqIDIgKyAxXS8qLkxlbiovICE9PSBiaXRzKSB7XG4gICAgICAgIC8vIFRyYWNlKChzdGRlcnIsXCJjb2RlICVkIGJpdHMgJWQtPiVkXFxuXCIsIG0sIHRyZWVbbV0uTGVuLCBiaXRzKSk7XG4gICAgICAgIHMub3B0X2xlbiArPSAoYml0cyAtIHRyZWVbbSAqIDIgKyAxXS8qLkxlbiovKSAqIHRyZWVbbSAqIDJdLyouRnJlcSovO1xuICAgICAgICB0cmVlW20gKiAyICsgMV0vKi5MZW4qLyA9IGJpdHM7XG4gICAgICB9XG4gICAgICBuLS07XG4gICAgfVxuICB9XG59XG5cblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBHZW5lcmF0ZSB0aGUgY29kZXMgZm9yIGEgZ2l2ZW4gdHJlZSBhbmQgYml0IGNvdW50cyAod2hpY2ggbmVlZCBub3QgYmVcbiAqIG9wdGltYWwpLlxuICogSU4gYXNzZXJ0aW9uOiB0aGUgYXJyYXkgYmxfY291bnQgY29udGFpbnMgdGhlIGJpdCBsZW5ndGggc3RhdGlzdGljcyBmb3JcbiAqIHRoZSBnaXZlbiB0cmVlIGFuZCB0aGUgZmllbGQgbGVuIGlzIHNldCBmb3IgYWxsIHRyZWUgZWxlbWVudHMuXG4gKiBPVVQgYXNzZXJ0aW9uOiB0aGUgZmllbGQgY29kZSBpcyBzZXQgZm9yIGFsbCB0cmVlIGVsZW1lbnRzIG9mIG5vblxuICogICAgIHplcm8gY29kZSBsZW5ndGguXG4gKi9cbmZ1bmN0aW9uIGdlbl9jb2Rlcyh0cmVlLCBtYXhfY29kZSwgYmxfY291bnQpXG4vLyAgICBjdF9kYXRhICp0cmVlOyAgICAgICAgICAgICAvKiB0aGUgdHJlZSB0byBkZWNvcmF0ZSAqL1xuLy8gICAgaW50IG1heF9jb2RlOyAgICAgICAgICAgICAgLyogbGFyZ2VzdCBjb2RlIHdpdGggbm9uIHplcm8gZnJlcXVlbmN5ICovXG4vLyAgICB1c2hmICpibF9jb3VudDsgICAgICAgICAgICAvKiBudW1iZXIgb2YgY29kZXMgYXQgZWFjaCBiaXQgbGVuZ3RoICovXG57XG4gIHZhciBuZXh0X2NvZGUgPSBuZXcgQXJyYXkoTUFYX0JJVFMgKyAxKTsgLyogbmV4dCBjb2RlIHZhbHVlIGZvciBlYWNoIGJpdCBsZW5ndGggKi9cbiAgdmFyIGNvZGUgPSAwOyAgICAgICAgICAgICAgLyogcnVubmluZyBjb2RlIHZhbHVlICovXG4gIHZhciBiaXRzOyAgICAgICAgICAgICAgICAgIC8qIGJpdCBpbmRleCAqL1xuICB2YXIgbjsgICAgICAgICAgICAgICAgICAgICAvKiBjb2RlIGluZGV4ICovXG5cbiAgLyogVGhlIGRpc3RyaWJ1dGlvbiBjb3VudHMgYXJlIGZpcnN0IHVzZWQgdG8gZ2VuZXJhdGUgdGhlIGNvZGUgdmFsdWVzXG4gICAqIHdpdGhvdXQgYml0IHJldmVyc2FsLlxuICAgKi9cbiAgZm9yIChiaXRzID0gMTsgYml0cyA8PSBNQVhfQklUUzsgYml0cysrKSB7XG4gICAgbmV4dF9jb2RlW2JpdHNdID0gY29kZSA9IChjb2RlICsgYmxfY291bnRbYml0cyAtIDFdKSA8PCAxO1xuICB9XG4gIC8qIENoZWNrIHRoYXQgdGhlIGJpdCBjb3VudHMgaW4gYmxfY291bnQgYXJlIGNvbnNpc3RlbnQuIFRoZSBsYXN0IGNvZGVcbiAgICogbXVzdCBiZSBhbGwgb25lcy5cbiAgICovXG4gIC8vQXNzZXJ0IChjb2RlICsgYmxfY291bnRbTUFYX0JJVFNdLTEgPT0gKDE8PE1BWF9CSVRTKS0xLFxuICAvLyAgICAgICAgXCJpbmNvbnNpc3RlbnQgYml0IGNvdW50c1wiKTtcbiAgLy9UcmFjZXYoKHN0ZGVycixcIlxcbmdlbl9jb2RlczogbWF4X2NvZGUgJWQgXCIsIG1heF9jb2RlKSk7XG5cbiAgZm9yIChuID0gMDsgIG4gPD0gbWF4X2NvZGU7IG4rKykge1xuICAgIHZhciBsZW4gPSB0cmVlW24gKiAyICsgMV0vKi5MZW4qLztcbiAgICBpZiAobGVuID09PSAwKSB7IGNvbnRpbnVlOyB9XG4gICAgLyogTm93IHJldmVyc2UgdGhlIGJpdHMgKi9cbiAgICB0cmVlW24gKiAyXS8qLkNvZGUqLyA9IGJpX3JldmVyc2UobmV4dF9jb2RlW2xlbl0rKywgbGVuKTtcblxuICAgIC8vVHJhY2Vjdih0cmVlICE9IHN0YXRpY19sdHJlZSwgKHN0ZGVycixcIlxcbm4gJTNkICVjIGwgJTJkIGMgJTR4ICgleCkgXCIsXG4gICAgLy8gICAgIG4sIChpc2dyYXBoKG4pID8gbiA6ICcgJyksIGxlbiwgdHJlZVtuXS5Db2RlLCBuZXh0X2NvZGVbbGVuXS0xKSk7XG4gIH1cbn1cblxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIEluaXRpYWxpemUgdGhlIHZhcmlvdXMgJ2NvbnN0YW50JyB0YWJsZXMuXG4gKi9cbmZ1bmN0aW9uIHRyX3N0YXRpY19pbml0KCkge1xuICB2YXIgbjsgICAgICAgIC8qIGl0ZXJhdGVzIG92ZXIgdHJlZSBlbGVtZW50cyAqL1xuICB2YXIgYml0czsgICAgIC8qIGJpdCBjb3VudGVyICovXG4gIHZhciBsZW5ndGg7ICAgLyogbGVuZ3RoIHZhbHVlICovXG4gIHZhciBjb2RlOyAgICAgLyogY29kZSB2YWx1ZSAqL1xuICB2YXIgZGlzdDsgICAgIC8qIGRpc3RhbmNlIGluZGV4ICovXG4gIHZhciBibF9jb3VudCA9IG5ldyBBcnJheShNQVhfQklUUyArIDEpO1xuICAvKiBudW1iZXIgb2YgY29kZXMgYXQgZWFjaCBiaXQgbGVuZ3RoIGZvciBhbiBvcHRpbWFsIHRyZWUgKi9cblxuICAvLyBkbyBjaGVjayBpbiBfdHJfaW5pdCgpXG4gIC8vaWYgKHN0YXRpY19pbml0X2RvbmUpIHJldHVybjtcblxuICAvKiBGb3Igc29tZSBlbWJlZGRlZCB0YXJnZXRzLCBnbG9iYWwgdmFyaWFibGVzIGFyZSBub3QgaW5pdGlhbGl6ZWQ6ICovXG4vKiNpZmRlZiBOT19JTklUX0dMT0JBTF9QT0lOVEVSU1xuICBzdGF0aWNfbF9kZXNjLnN0YXRpY190cmVlID0gc3RhdGljX2x0cmVlO1xuICBzdGF0aWNfbF9kZXNjLmV4dHJhX2JpdHMgPSBleHRyYV9sYml0cztcbiAgc3RhdGljX2RfZGVzYy5zdGF0aWNfdHJlZSA9IHN0YXRpY19kdHJlZTtcbiAgc3RhdGljX2RfZGVzYy5leHRyYV9iaXRzID0gZXh0cmFfZGJpdHM7XG4gIHN0YXRpY19ibF9kZXNjLmV4dHJhX2JpdHMgPSBleHRyYV9ibGJpdHM7XG4jZW5kaWYqL1xuXG4gIC8qIEluaXRpYWxpemUgdGhlIG1hcHBpbmcgbGVuZ3RoICgwLi4yNTUpIC0+IGxlbmd0aCBjb2RlICgwLi4yOCkgKi9cbiAgbGVuZ3RoID0gMDtcbiAgZm9yIChjb2RlID0gMDsgY29kZSA8IExFTkdUSF9DT0RFUyAtIDE7IGNvZGUrKykge1xuICAgIGJhc2VfbGVuZ3RoW2NvZGVdID0gbGVuZ3RoO1xuICAgIGZvciAobiA9IDA7IG4gPCAoMSA8PCBleHRyYV9sYml0c1tjb2RlXSk7IG4rKykge1xuICAgICAgX2xlbmd0aF9jb2RlW2xlbmd0aCsrXSA9IGNvZGU7XG4gICAgfVxuICB9XG4gIC8vQXNzZXJ0IChsZW5ndGggPT0gMjU2LCBcInRyX3N0YXRpY19pbml0OiBsZW5ndGggIT0gMjU2XCIpO1xuICAvKiBOb3RlIHRoYXQgdGhlIGxlbmd0aCAyNTUgKG1hdGNoIGxlbmd0aCAyNTgpIGNhbiBiZSByZXByZXNlbnRlZFxuICAgKiBpbiB0d28gZGlmZmVyZW50IHdheXM6IGNvZGUgMjg0ICsgNSBiaXRzIG9yIGNvZGUgMjg1LCBzbyB3ZVxuICAgKiBvdmVyd3JpdGUgbGVuZ3RoX2NvZGVbMjU1XSB0byB1c2UgdGhlIGJlc3QgZW5jb2Rpbmc6XG4gICAqL1xuICBfbGVuZ3RoX2NvZGVbbGVuZ3RoIC0gMV0gPSBjb2RlO1xuXG4gIC8qIEluaXRpYWxpemUgdGhlIG1hcHBpbmcgZGlzdCAoMC4uMzJLKSAtPiBkaXN0IGNvZGUgKDAuLjI5KSAqL1xuICBkaXN0ID0gMDtcbiAgZm9yIChjb2RlID0gMDsgY29kZSA8IDE2OyBjb2RlKyspIHtcbiAgICBiYXNlX2Rpc3RbY29kZV0gPSBkaXN0O1xuICAgIGZvciAobiA9IDA7IG4gPCAoMSA8PCBleHRyYV9kYml0c1tjb2RlXSk7IG4rKykge1xuICAgICAgX2Rpc3RfY29kZVtkaXN0KytdID0gY29kZTtcbiAgICB9XG4gIH1cbiAgLy9Bc3NlcnQgKGRpc3QgPT0gMjU2LCBcInRyX3N0YXRpY19pbml0OiBkaXN0ICE9IDI1NlwiKTtcbiAgZGlzdCA+Pj0gNzsgLyogZnJvbSBub3cgb24sIGFsbCBkaXN0YW5jZXMgYXJlIGRpdmlkZWQgYnkgMTI4ICovXG4gIGZvciAoOyBjb2RlIDwgRF9DT0RFUzsgY29kZSsrKSB7XG4gICAgYmFzZV9kaXN0W2NvZGVdID0gZGlzdCA8PCA3O1xuICAgIGZvciAobiA9IDA7IG4gPCAoMSA8PCAoZXh0cmFfZGJpdHNbY29kZV0gLSA3KSk7IG4rKykge1xuICAgICAgX2Rpc3RfY29kZVsyNTYgKyBkaXN0KytdID0gY29kZTtcbiAgICB9XG4gIH1cbiAgLy9Bc3NlcnQgKGRpc3QgPT0gMjU2LCBcInRyX3N0YXRpY19pbml0OiAyNTYrZGlzdCAhPSA1MTJcIik7XG5cbiAgLyogQ29uc3RydWN0IHRoZSBjb2RlcyBvZiB0aGUgc3RhdGljIGxpdGVyYWwgdHJlZSAqL1xuICBmb3IgKGJpdHMgPSAwOyBiaXRzIDw9IE1BWF9CSVRTOyBiaXRzKyspIHtcbiAgICBibF9jb3VudFtiaXRzXSA9IDA7XG4gIH1cblxuICBuID0gMDtcbiAgd2hpbGUgKG4gPD0gMTQzKSB7XG4gICAgc3RhdGljX2x0cmVlW24gKiAyICsgMV0vKi5MZW4qLyA9IDg7XG4gICAgbisrO1xuICAgIGJsX2NvdW50WzhdKys7XG4gIH1cbiAgd2hpbGUgKG4gPD0gMjU1KSB7XG4gICAgc3RhdGljX2x0cmVlW24gKiAyICsgMV0vKi5MZW4qLyA9IDk7XG4gICAgbisrO1xuICAgIGJsX2NvdW50WzldKys7XG4gIH1cbiAgd2hpbGUgKG4gPD0gMjc5KSB7XG4gICAgc3RhdGljX2x0cmVlW24gKiAyICsgMV0vKi5MZW4qLyA9IDc7XG4gICAgbisrO1xuICAgIGJsX2NvdW50WzddKys7XG4gIH1cbiAgd2hpbGUgKG4gPD0gMjg3KSB7XG4gICAgc3RhdGljX2x0cmVlW24gKiAyICsgMV0vKi5MZW4qLyA9IDg7XG4gICAgbisrO1xuICAgIGJsX2NvdW50WzhdKys7XG4gIH1cbiAgLyogQ29kZXMgMjg2IGFuZCAyODcgZG8gbm90IGV4aXN0LCBidXQgd2UgbXVzdCBpbmNsdWRlIHRoZW0gaW4gdGhlXG4gICAqIHRyZWUgY29uc3RydWN0aW9uIHRvIGdldCBhIGNhbm9uaWNhbCBIdWZmbWFuIHRyZWUgKGxvbmdlc3QgY29kZVxuICAgKiBhbGwgb25lcylcbiAgICovXG4gIGdlbl9jb2RlcyhzdGF0aWNfbHRyZWUsIExfQ09ERVMgKyAxLCBibF9jb3VudCk7XG5cbiAgLyogVGhlIHN0YXRpYyBkaXN0YW5jZSB0cmVlIGlzIHRyaXZpYWw6ICovXG4gIGZvciAobiA9IDA7IG4gPCBEX0NPREVTOyBuKyspIHtcbiAgICBzdGF0aWNfZHRyZWVbbiAqIDIgKyAxXS8qLkxlbiovID0gNTtcbiAgICBzdGF0aWNfZHRyZWVbbiAqIDJdLyouQ29kZSovID0gYmlfcmV2ZXJzZShuLCA1KTtcbiAgfVxuXG4gIC8vIE5vdyBkYXRhIHJlYWR5IGFuZCB3ZSBjYW4gaW5pdCBzdGF0aWMgdHJlZXNcbiAgc3RhdGljX2xfZGVzYyA9IG5ldyBTdGF0aWNUcmVlRGVzYyhzdGF0aWNfbHRyZWUsIGV4dHJhX2xiaXRzLCBMSVRFUkFMUyArIDEsIExfQ09ERVMsIE1BWF9CSVRTKTtcbiAgc3RhdGljX2RfZGVzYyA9IG5ldyBTdGF0aWNUcmVlRGVzYyhzdGF0aWNfZHRyZWUsIGV4dHJhX2RiaXRzLCAwLCAgICAgICAgICBEX0NPREVTLCBNQVhfQklUUyk7XG4gIHN0YXRpY19ibF9kZXNjID0gbmV3IFN0YXRpY1RyZWVEZXNjKG5ldyBBcnJheSgwKSwgZXh0cmFfYmxiaXRzLCAwLCAgICAgICAgIEJMX0NPREVTLCBNQVhfQkxfQklUUyk7XG5cbiAgLy9zdGF0aWNfaW5pdF9kb25lID0gdHJ1ZTtcbn1cblxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIEluaXRpYWxpemUgYSBuZXcgYmxvY2suXG4gKi9cbmZ1bmN0aW9uIGluaXRfYmxvY2socykge1xuICB2YXIgbjsgLyogaXRlcmF0ZXMgb3ZlciB0cmVlIGVsZW1lbnRzICovXG5cbiAgLyogSW5pdGlhbGl6ZSB0aGUgdHJlZXMuICovXG4gIGZvciAobiA9IDA7IG4gPCBMX0NPREVTOyAgbisrKSB7IHMuZHluX2x0cmVlW24gKiAyXS8qLkZyZXEqLyA9IDA7IH1cbiAgZm9yIChuID0gMDsgbiA8IERfQ09ERVM7ICBuKyspIHsgcy5keW5fZHRyZWVbbiAqIDJdLyouRnJlcSovID0gMDsgfVxuICBmb3IgKG4gPSAwOyBuIDwgQkxfQ09ERVM7IG4rKykgeyBzLmJsX3RyZWVbbiAqIDJdLyouRnJlcSovID0gMDsgfVxuXG4gIHMuZHluX2x0cmVlW0VORF9CTE9DSyAqIDJdLyouRnJlcSovID0gMTtcbiAgcy5vcHRfbGVuID0gcy5zdGF0aWNfbGVuID0gMDtcbiAgcy5sYXN0X2xpdCA9IHMubWF0Y2hlcyA9IDA7XG59XG5cblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBGbHVzaCB0aGUgYml0IGJ1ZmZlciBhbmQgYWxpZ24gdGhlIG91dHB1dCBvbiBhIGJ5dGUgYm91bmRhcnlcbiAqL1xuZnVuY3Rpb24gYmlfd2luZHVwKHMpXG57XG4gIGlmIChzLmJpX3ZhbGlkID4gOCkge1xuICAgIHB1dF9zaG9ydChzLCBzLmJpX2J1Zik7XG4gIH0gZWxzZSBpZiAocy5iaV92YWxpZCA+IDApIHtcbiAgICAvL3B1dF9ieXRlKHMsIChCeXRlKXMtPmJpX2J1Zik7XG4gICAgcy5wZW5kaW5nX2J1ZltzLnBlbmRpbmcrK10gPSBzLmJpX2J1ZjtcbiAgfVxuICBzLmJpX2J1ZiA9IDA7XG4gIHMuYmlfdmFsaWQgPSAwO1xufVxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIENvcHkgYSBzdG9yZWQgYmxvY2ssIHN0b3JpbmcgZmlyc3QgdGhlIGxlbmd0aCBhbmQgaXRzXG4gKiBvbmUncyBjb21wbGVtZW50IGlmIHJlcXVlc3RlZC5cbiAqL1xuZnVuY3Rpb24gY29weV9ibG9jayhzLCBidWYsIGxlbiwgaGVhZGVyKVxuLy9EZWZsYXRlU3RhdGUgKnM7XG4vL2NoYXJmICAgICpidWY7ICAgIC8qIHRoZSBpbnB1dCBkYXRhICovXG4vL3Vuc2lnbmVkIGxlbjsgICAgIC8qIGl0cyBsZW5ndGggKi9cbi8vaW50ICAgICAgaGVhZGVyOyAgLyogdHJ1ZSBpZiBibG9jayBoZWFkZXIgbXVzdCBiZSB3cml0dGVuICovXG57XG4gIGJpX3dpbmR1cChzKTsgICAgICAgIC8qIGFsaWduIG9uIGJ5dGUgYm91bmRhcnkgKi9cblxuICBpZiAoaGVhZGVyKSB7XG4gICAgcHV0X3Nob3J0KHMsIGxlbik7XG4gICAgcHV0X3Nob3J0KHMsIH5sZW4pO1xuICB9XG4vLyAgd2hpbGUgKGxlbi0tKSB7XG4vLyAgICBwdXRfYnl0ZShzLCAqYnVmKyspO1xuLy8gIH1cbiAgdXRpbHMuYXJyYXlTZXQocy5wZW5kaW5nX2J1Ziwgcy53aW5kb3csIGJ1ZiwgbGVuLCBzLnBlbmRpbmcpO1xuICBzLnBlbmRpbmcgKz0gbGVuO1xufVxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIENvbXBhcmVzIHRvIHN1YnRyZWVzLCB1c2luZyB0aGUgdHJlZSBkZXB0aCBhcyB0aWUgYnJlYWtlciB3aGVuXG4gKiB0aGUgc3VidHJlZXMgaGF2ZSBlcXVhbCBmcmVxdWVuY3kuIFRoaXMgbWluaW1pemVzIHRoZSB3b3JzdCBjYXNlIGxlbmd0aC5cbiAqL1xuZnVuY3Rpb24gc21hbGxlcih0cmVlLCBuLCBtLCBkZXB0aCkge1xuICB2YXIgX24yID0gbiAqIDI7XG4gIHZhciBfbTIgPSBtICogMjtcbiAgcmV0dXJuICh0cmVlW19uMl0vKi5GcmVxKi8gPCB0cmVlW19tMl0vKi5GcmVxKi8gfHxcbiAgICAgICAgICh0cmVlW19uMl0vKi5GcmVxKi8gPT09IHRyZWVbX20yXS8qLkZyZXEqLyAmJiBkZXB0aFtuXSA8PSBkZXB0aFttXSkpO1xufVxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIFJlc3RvcmUgdGhlIGhlYXAgcHJvcGVydHkgYnkgbW92aW5nIGRvd24gdGhlIHRyZWUgc3RhcnRpbmcgYXQgbm9kZSBrLFxuICogZXhjaGFuZ2luZyBhIG5vZGUgd2l0aCB0aGUgc21hbGxlc3Qgb2YgaXRzIHR3byBzb25zIGlmIG5lY2Vzc2FyeSwgc3RvcHBpbmdcbiAqIHdoZW4gdGhlIGhlYXAgcHJvcGVydHkgaXMgcmUtZXN0YWJsaXNoZWQgKGVhY2ggZmF0aGVyIHNtYWxsZXIgdGhhbiBpdHNcbiAqIHR3byBzb25zKS5cbiAqL1xuZnVuY3Rpb24gcHFkb3duaGVhcChzLCB0cmVlLCBrKVxuLy8gICAgZGVmbGF0ZV9zdGF0ZSAqcztcbi8vICAgIGN0X2RhdGEgKnRyZWU7ICAvKiB0aGUgdHJlZSB0byByZXN0b3JlICovXG4vLyAgICBpbnQgazsgICAgICAgICAgICAgICAvKiBub2RlIHRvIG1vdmUgZG93biAqL1xue1xuICB2YXIgdiA9IHMuaGVhcFtrXTtcbiAgdmFyIGogPSBrIDw8IDE7ICAvKiBsZWZ0IHNvbiBvZiBrICovXG4gIHdoaWxlIChqIDw9IHMuaGVhcF9sZW4pIHtcbiAgICAvKiBTZXQgaiB0byB0aGUgc21hbGxlc3Qgb2YgdGhlIHR3byBzb25zOiAqL1xuICAgIGlmIChqIDwgcy5oZWFwX2xlbiAmJlxuICAgICAgc21hbGxlcih0cmVlLCBzLmhlYXBbaiArIDFdLCBzLmhlYXBbal0sIHMuZGVwdGgpKSB7XG4gICAgICBqKys7XG4gICAgfVxuICAgIC8qIEV4aXQgaWYgdiBpcyBzbWFsbGVyIHRoYW4gYm90aCBzb25zICovXG4gICAgaWYgKHNtYWxsZXIodHJlZSwgdiwgcy5oZWFwW2pdLCBzLmRlcHRoKSkgeyBicmVhazsgfVxuXG4gICAgLyogRXhjaGFuZ2UgdiB3aXRoIHRoZSBzbWFsbGVzdCBzb24gKi9cbiAgICBzLmhlYXBba10gPSBzLmhlYXBbal07XG4gICAgayA9IGo7XG5cbiAgICAvKiBBbmQgY29udGludWUgZG93biB0aGUgdHJlZSwgc2V0dGluZyBqIHRvIHRoZSBsZWZ0IHNvbiBvZiBrICovXG4gICAgaiA8PD0gMTtcbiAgfVxuICBzLmhlYXBba10gPSB2O1xufVxuXG5cbi8vIGlubGluZWQgbWFudWFsbHlcbi8vIHZhciBTTUFMTEVTVCA9IDE7XG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogU2VuZCB0aGUgYmxvY2sgZGF0YSBjb21wcmVzc2VkIHVzaW5nIHRoZSBnaXZlbiBIdWZmbWFuIHRyZWVzXG4gKi9cbmZ1bmN0aW9uIGNvbXByZXNzX2Jsb2NrKHMsIGx0cmVlLCBkdHJlZSlcbi8vICAgIGRlZmxhdGVfc3RhdGUgKnM7XG4vLyAgICBjb25zdCBjdF9kYXRhICpsdHJlZTsgLyogbGl0ZXJhbCB0cmVlICovXG4vLyAgICBjb25zdCBjdF9kYXRhICpkdHJlZTsgLyogZGlzdGFuY2UgdHJlZSAqL1xue1xuICB2YXIgZGlzdDsgICAgICAgICAgIC8qIGRpc3RhbmNlIG9mIG1hdGNoZWQgc3RyaW5nICovXG4gIHZhciBsYzsgICAgICAgICAgICAgLyogbWF0Y2ggbGVuZ3RoIG9yIHVubWF0Y2hlZCBjaGFyIChpZiBkaXN0ID09IDApICovXG4gIHZhciBseCA9IDA7ICAgICAgICAgLyogcnVubmluZyBpbmRleCBpbiBsX2J1ZiAqL1xuICB2YXIgY29kZTsgICAgICAgICAgIC8qIHRoZSBjb2RlIHRvIHNlbmQgKi9cbiAgdmFyIGV4dHJhOyAgICAgICAgICAvKiBudW1iZXIgb2YgZXh0cmEgYml0cyB0byBzZW5kICovXG5cbiAgaWYgKHMubGFzdF9saXQgIT09IDApIHtcbiAgICBkbyB7XG4gICAgICBkaXN0ID0gKHMucGVuZGluZ19idWZbcy5kX2J1ZiArIGx4ICogMl0gPDwgOCkgfCAocy5wZW5kaW5nX2J1ZltzLmRfYnVmICsgbHggKiAyICsgMV0pO1xuICAgICAgbGMgPSBzLnBlbmRpbmdfYnVmW3MubF9idWYgKyBseF07XG4gICAgICBseCsrO1xuXG4gICAgICBpZiAoZGlzdCA9PT0gMCkge1xuICAgICAgICBzZW5kX2NvZGUocywgbGMsIGx0cmVlKTsgLyogc2VuZCBhIGxpdGVyYWwgYnl0ZSAqL1xuICAgICAgICAvL1RyYWNlY3YoaXNncmFwaChsYyksIChzdGRlcnIsXCIgJyVjJyBcIiwgbGMpKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8qIEhlcmUsIGxjIGlzIHRoZSBtYXRjaCBsZW5ndGggLSBNSU5fTUFUQ0ggKi9cbiAgICAgICAgY29kZSA9IF9sZW5ndGhfY29kZVtsY107XG4gICAgICAgIHNlbmRfY29kZShzLCBjb2RlICsgTElURVJBTFMgKyAxLCBsdHJlZSk7IC8qIHNlbmQgdGhlIGxlbmd0aCBjb2RlICovXG4gICAgICAgIGV4dHJhID0gZXh0cmFfbGJpdHNbY29kZV07XG4gICAgICAgIGlmIChleHRyYSAhPT0gMCkge1xuICAgICAgICAgIGxjIC09IGJhc2VfbGVuZ3RoW2NvZGVdO1xuICAgICAgICAgIHNlbmRfYml0cyhzLCBsYywgZXh0cmEpOyAgICAgICAvKiBzZW5kIHRoZSBleHRyYSBsZW5ndGggYml0cyAqL1xuICAgICAgICB9XG4gICAgICAgIGRpc3QtLTsgLyogZGlzdCBpcyBub3cgdGhlIG1hdGNoIGRpc3RhbmNlIC0gMSAqL1xuICAgICAgICBjb2RlID0gZF9jb2RlKGRpc3QpO1xuICAgICAgICAvL0Fzc2VydCAoY29kZSA8IERfQ09ERVMsIFwiYmFkIGRfY29kZVwiKTtcblxuICAgICAgICBzZW5kX2NvZGUocywgY29kZSwgZHRyZWUpOyAgICAgICAvKiBzZW5kIHRoZSBkaXN0YW5jZSBjb2RlICovXG4gICAgICAgIGV4dHJhID0gZXh0cmFfZGJpdHNbY29kZV07XG4gICAgICAgIGlmIChleHRyYSAhPT0gMCkge1xuICAgICAgICAgIGRpc3QgLT0gYmFzZV9kaXN0W2NvZGVdO1xuICAgICAgICAgIHNlbmRfYml0cyhzLCBkaXN0LCBleHRyYSk7ICAgLyogc2VuZCB0aGUgZXh0cmEgZGlzdGFuY2UgYml0cyAqL1xuICAgICAgICB9XG4gICAgICB9IC8qIGxpdGVyYWwgb3IgbWF0Y2ggcGFpciA/ICovXG5cbiAgICAgIC8qIENoZWNrIHRoYXQgdGhlIG92ZXJsYXkgYmV0d2VlbiBwZW5kaW5nX2J1ZiBhbmQgZF9idWYrbF9idWYgaXMgb2s6ICovXG4gICAgICAvL0Fzc2VydCgodUludCkocy0+cGVuZGluZykgPCBzLT5saXRfYnVmc2l6ZSArIDIqbHgsXG4gICAgICAvLyAgICAgICBcInBlbmRpbmdCdWYgb3ZlcmZsb3dcIik7XG5cbiAgICB9IHdoaWxlIChseCA8IHMubGFzdF9saXQpO1xuICB9XG5cbiAgc2VuZF9jb2RlKHMsIEVORF9CTE9DSywgbHRyZWUpO1xufVxuXG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogQ29uc3RydWN0IG9uZSBIdWZmbWFuIHRyZWUgYW5kIGFzc2lnbnMgdGhlIGNvZGUgYml0IHN0cmluZ3MgYW5kIGxlbmd0aHMuXG4gKiBVcGRhdGUgdGhlIHRvdGFsIGJpdCBsZW5ndGggZm9yIHRoZSBjdXJyZW50IGJsb2NrLlxuICogSU4gYXNzZXJ0aW9uOiB0aGUgZmllbGQgZnJlcSBpcyBzZXQgZm9yIGFsbCB0cmVlIGVsZW1lbnRzLlxuICogT1VUIGFzc2VydGlvbnM6IHRoZSBmaWVsZHMgbGVuIGFuZCBjb2RlIGFyZSBzZXQgdG8gdGhlIG9wdGltYWwgYml0IGxlbmd0aFxuICogICAgIGFuZCBjb3JyZXNwb25kaW5nIGNvZGUuIFRoZSBsZW5ndGggb3B0X2xlbiBpcyB1cGRhdGVkOyBzdGF0aWNfbGVuIGlzXG4gKiAgICAgYWxzbyB1cGRhdGVkIGlmIHN0cmVlIGlzIG5vdCBudWxsLiBUaGUgZmllbGQgbWF4X2NvZGUgaXMgc2V0LlxuICovXG5mdW5jdGlvbiBidWlsZF90cmVlKHMsIGRlc2MpXG4vLyAgICBkZWZsYXRlX3N0YXRlICpzO1xuLy8gICAgdHJlZV9kZXNjICpkZXNjOyAvKiB0aGUgdHJlZSBkZXNjcmlwdG9yICovXG57XG4gIHZhciB0cmVlICAgICA9IGRlc2MuZHluX3RyZWU7XG4gIHZhciBzdHJlZSAgICA9IGRlc2Muc3RhdF9kZXNjLnN0YXRpY190cmVlO1xuICB2YXIgaGFzX3N0cmVlID0gZGVzYy5zdGF0X2Rlc2MuaGFzX3N0cmVlO1xuICB2YXIgZWxlbXMgICAgPSBkZXNjLnN0YXRfZGVzYy5lbGVtcztcbiAgdmFyIG4sIG07ICAgICAgICAgIC8qIGl0ZXJhdGUgb3ZlciBoZWFwIGVsZW1lbnRzICovXG4gIHZhciBtYXhfY29kZSA9IC0xOyAvKiBsYXJnZXN0IGNvZGUgd2l0aCBub24gemVybyBmcmVxdWVuY3kgKi9cbiAgdmFyIG5vZGU7ICAgICAgICAgIC8qIG5ldyBub2RlIGJlaW5nIGNyZWF0ZWQgKi9cblxuICAvKiBDb25zdHJ1Y3QgdGhlIGluaXRpYWwgaGVhcCwgd2l0aCBsZWFzdCBmcmVxdWVudCBlbGVtZW50IGluXG4gICAqIGhlYXBbU01BTExFU1RdLiBUaGUgc29ucyBvZiBoZWFwW25dIGFyZSBoZWFwWzIqbl0gYW5kIGhlYXBbMipuKzFdLlxuICAgKiBoZWFwWzBdIGlzIG5vdCB1c2VkLlxuICAgKi9cbiAgcy5oZWFwX2xlbiA9IDA7XG4gIHMuaGVhcF9tYXggPSBIRUFQX1NJWkU7XG5cbiAgZm9yIChuID0gMDsgbiA8IGVsZW1zOyBuKyspIHtcbiAgICBpZiAodHJlZVtuICogMl0vKi5GcmVxKi8gIT09IDApIHtcbiAgICAgIHMuaGVhcFsrK3MuaGVhcF9sZW5dID0gbWF4X2NvZGUgPSBuO1xuICAgICAgcy5kZXB0aFtuXSA9IDA7XG5cbiAgICB9IGVsc2Uge1xuICAgICAgdHJlZVtuICogMiArIDFdLyouTGVuKi8gPSAwO1xuICAgIH1cbiAgfVxuXG4gIC8qIFRoZSBwa3ppcCBmb3JtYXQgcmVxdWlyZXMgdGhhdCBhdCBsZWFzdCBvbmUgZGlzdGFuY2UgY29kZSBleGlzdHMsXG4gICAqIGFuZCB0aGF0IGF0IGxlYXN0IG9uZSBiaXQgc2hvdWxkIGJlIHNlbnQgZXZlbiBpZiB0aGVyZSBpcyBvbmx5IG9uZVxuICAgKiBwb3NzaWJsZSBjb2RlLiBTbyB0byBhdm9pZCBzcGVjaWFsIGNoZWNrcyBsYXRlciBvbiB3ZSBmb3JjZSBhdCBsZWFzdFxuICAgKiB0d28gY29kZXMgb2Ygbm9uIHplcm8gZnJlcXVlbmN5LlxuICAgKi9cbiAgd2hpbGUgKHMuaGVhcF9sZW4gPCAyKSB7XG4gICAgbm9kZSA9IHMuaGVhcFsrK3MuaGVhcF9sZW5dID0gKG1heF9jb2RlIDwgMiA/ICsrbWF4X2NvZGUgOiAwKTtcbiAgICB0cmVlW25vZGUgKiAyXS8qLkZyZXEqLyA9IDE7XG4gICAgcy5kZXB0aFtub2RlXSA9IDA7XG4gICAgcy5vcHRfbGVuLS07XG5cbiAgICBpZiAoaGFzX3N0cmVlKSB7XG4gICAgICBzLnN0YXRpY19sZW4gLT0gc3RyZWVbbm9kZSAqIDIgKyAxXS8qLkxlbiovO1xuICAgIH1cbiAgICAvKiBub2RlIGlzIDAgb3IgMSBzbyBpdCBkb2VzIG5vdCBoYXZlIGV4dHJhIGJpdHMgKi9cbiAgfVxuICBkZXNjLm1heF9jb2RlID0gbWF4X2NvZGU7XG5cbiAgLyogVGhlIGVsZW1lbnRzIGhlYXBbaGVhcF9sZW4vMisxIC4uIGhlYXBfbGVuXSBhcmUgbGVhdmVzIG9mIHRoZSB0cmVlLFxuICAgKiBlc3RhYmxpc2ggc3ViLWhlYXBzIG9mIGluY3JlYXNpbmcgbGVuZ3RoczpcbiAgICovXG4gIGZvciAobiA9IChzLmhlYXBfbGVuID4+IDEvKmludCAvMiovKTsgbiA+PSAxOyBuLS0pIHsgcHFkb3duaGVhcChzLCB0cmVlLCBuKTsgfVxuXG4gIC8qIENvbnN0cnVjdCB0aGUgSHVmZm1hbiB0cmVlIGJ5IHJlcGVhdGVkbHkgY29tYmluaW5nIHRoZSBsZWFzdCB0d29cbiAgICogZnJlcXVlbnQgbm9kZXMuXG4gICAqL1xuICBub2RlID0gZWxlbXM7ICAgICAgICAgICAgICAvKiBuZXh0IGludGVybmFsIG5vZGUgb2YgdGhlIHRyZWUgKi9cbiAgZG8ge1xuICAgIC8vcHFyZW1vdmUocywgdHJlZSwgbik7ICAvKiBuID0gbm9kZSBvZiBsZWFzdCBmcmVxdWVuY3kgKi9cbiAgICAvKioqIHBxcmVtb3ZlICoqKi9cbiAgICBuID0gcy5oZWFwWzEvKlNNQUxMRVNUKi9dO1xuICAgIHMuaGVhcFsxLypTTUFMTEVTVCovXSA9IHMuaGVhcFtzLmhlYXBfbGVuLS1dO1xuICAgIHBxZG93bmhlYXAocywgdHJlZSwgMS8qU01BTExFU1QqLyk7XG4gICAgLyoqKi9cblxuICAgIG0gPSBzLmhlYXBbMS8qU01BTExFU1QqL107IC8qIG0gPSBub2RlIG9mIG5leHQgbGVhc3QgZnJlcXVlbmN5ICovXG5cbiAgICBzLmhlYXBbLS1zLmhlYXBfbWF4XSA9IG47IC8qIGtlZXAgdGhlIG5vZGVzIHNvcnRlZCBieSBmcmVxdWVuY3kgKi9cbiAgICBzLmhlYXBbLS1zLmhlYXBfbWF4XSA9IG07XG5cbiAgICAvKiBDcmVhdGUgYSBuZXcgbm9kZSBmYXRoZXIgb2YgbiBhbmQgbSAqL1xuICAgIHRyZWVbbm9kZSAqIDJdLyouRnJlcSovID0gdHJlZVtuICogMl0vKi5GcmVxKi8gKyB0cmVlW20gKiAyXS8qLkZyZXEqLztcbiAgICBzLmRlcHRoW25vZGVdID0gKHMuZGVwdGhbbl0gPj0gcy5kZXB0aFttXSA/IHMuZGVwdGhbbl0gOiBzLmRlcHRoW21dKSArIDE7XG4gICAgdHJlZVtuICogMiArIDFdLyouRGFkKi8gPSB0cmVlW20gKiAyICsgMV0vKi5EYWQqLyA9IG5vZGU7XG5cbiAgICAvKiBhbmQgaW5zZXJ0IHRoZSBuZXcgbm9kZSBpbiB0aGUgaGVhcCAqL1xuICAgIHMuaGVhcFsxLypTTUFMTEVTVCovXSA9IG5vZGUrKztcbiAgICBwcWRvd25oZWFwKHMsIHRyZWUsIDEvKlNNQUxMRVNUKi8pO1xuXG4gIH0gd2hpbGUgKHMuaGVhcF9sZW4gPj0gMik7XG5cbiAgcy5oZWFwWy0tcy5oZWFwX21heF0gPSBzLmhlYXBbMS8qU01BTExFU1QqL107XG5cbiAgLyogQXQgdGhpcyBwb2ludCwgdGhlIGZpZWxkcyBmcmVxIGFuZCBkYWQgYXJlIHNldC4gV2UgY2FuIG5vd1xuICAgKiBnZW5lcmF0ZSB0aGUgYml0IGxlbmd0aHMuXG4gICAqL1xuICBnZW5fYml0bGVuKHMsIGRlc2MpO1xuXG4gIC8qIFRoZSBmaWVsZCBsZW4gaXMgbm93IHNldCwgd2UgY2FuIGdlbmVyYXRlIHRoZSBiaXQgY29kZXMgKi9cbiAgZ2VuX2NvZGVzKHRyZWUsIG1heF9jb2RlLCBzLmJsX2NvdW50KTtcbn1cblxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIFNjYW4gYSBsaXRlcmFsIG9yIGRpc3RhbmNlIHRyZWUgdG8gZGV0ZXJtaW5lIHRoZSBmcmVxdWVuY2llcyBvZiB0aGUgY29kZXNcbiAqIGluIHRoZSBiaXQgbGVuZ3RoIHRyZWUuXG4gKi9cbmZ1bmN0aW9uIHNjYW5fdHJlZShzLCB0cmVlLCBtYXhfY29kZSlcbi8vICAgIGRlZmxhdGVfc3RhdGUgKnM7XG4vLyAgICBjdF9kYXRhICp0cmVlOyAgIC8qIHRoZSB0cmVlIHRvIGJlIHNjYW5uZWQgKi9cbi8vICAgIGludCBtYXhfY29kZTsgICAgLyogYW5kIGl0cyBsYXJnZXN0IGNvZGUgb2Ygbm9uIHplcm8gZnJlcXVlbmN5ICovXG57XG4gIHZhciBuOyAgICAgICAgICAgICAgICAgICAgIC8qIGl0ZXJhdGVzIG92ZXIgYWxsIHRyZWUgZWxlbWVudHMgKi9cbiAgdmFyIHByZXZsZW4gPSAtMTsgICAgICAgICAgLyogbGFzdCBlbWl0dGVkIGxlbmd0aCAqL1xuICB2YXIgY3VybGVuOyAgICAgICAgICAgICAgICAvKiBsZW5ndGggb2YgY3VycmVudCBjb2RlICovXG5cbiAgdmFyIG5leHRsZW4gPSB0cmVlWzAgKiAyICsgMV0vKi5MZW4qLzsgLyogbGVuZ3RoIG9mIG5leHQgY29kZSAqL1xuXG4gIHZhciBjb3VudCA9IDA7ICAgICAgICAgICAgIC8qIHJlcGVhdCBjb3VudCBvZiB0aGUgY3VycmVudCBjb2RlICovXG4gIHZhciBtYXhfY291bnQgPSA3OyAgICAgICAgIC8qIG1heCByZXBlYXQgY291bnQgKi9cbiAgdmFyIG1pbl9jb3VudCA9IDQ7ICAgICAgICAgLyogbWluIHJlcGVhdCBjb3VudCAqL1xuXG4gIGlmIChuZXh0bGVuID09PSAwKSB7XG4gICAgbWF4X2NvdW50ID0gMTM4O1xuICAgIG1pbl9jb3VudCA9IDM7XG4gIH1cbiAgdHJlZVsobWF4X2NvZGUgKyAxKSAqIDIgKyAxXS8qLkxlbiovID0gMHhmZmZmOyAvKiBndWFyZCAqL1xuXG4gIGZvciAobiA9IDA7IG4gPD0gbWF4X2NvZGU7IG4rKykge1xuICAgIGN1cmxlbiA9IG5leHRsZW47XG4gICAgbmV4dGxlbiA9IHRyZWVbKG4gKyAxKSAqIDIgKyAxXS8qLkxlbiovO1xuXG4gICAgaWYgKCsrY291bnQgPCBtYXhfY291bnQgJiYgY3VybGVuID09PSBuZXh0bGVuKSB7XG4gICAgICBjb250aW51ZTtcblxuICAgIH0gZWxzZSBpZiAoY291bnQgPCBtaW5fY291bnQpIHtcbiAgICAgIHMuYmxfdHJlZVtjdXJsZW4gKiAyXS8qLkZyZXEqLyArPSBjb3VudDtcblxuICAgIH0gZWxzZSBpZiAoY3VybGVuICE9PSAwKSB7XG5cbiAgICAgIGlmIChjdXJsZW4gIT09IHByZXZsZW4pIHsgcy5ibF90cmVlW2N1cmxlbiAqIDJdLyouRnJlcSovKys7IH1cbiAgICAgIHMuYmxfdHJlZVtSRVBfM182ICogMl0vKi5GcmVxKi8rKztcblxuICAgIH0gZWxzZSBpZiAoY291bnQgPD0gMTApIHtcbiAgICAgIHMuYmxfdHJlZVtSRVBaXzNfMTAgKiAyXS8qLkZyZXEqLysrO1xuXG4gICAgfSBlbHNlIHtcbiAgICAgIHMuYmxfdHJlZVtSRVBaXzExXzEzOCAqIDJdLyouRnJlcSovKys7XG4gICAgfVxuXG4gICAgY291bnQgPSAwO1xuICAgIHByZXZsZW4gPSBjdXJsZW47XG5cbiAgICBpZiAobmV4dGxlbiA9PT0gMCkge1xuICAgICAgbWF4X2NvdW50ID0gMTM4O1xuICAgICAgbWluX2NvdW50ID0gMztcblxuICAgIH0gZWxzZSBpZiAoY3VybGVuID09PSBuZXh0bGVuKSB7XG4gICAgICBtYXhfY291bnQgPSA2O1xuICAgICAgbWluX2NvdW50ID0gMztcblxuICAgIH0gZWxzZSB7XG4gICAgICBtYXhfY291bnQgPSA3O1xuICAgICAgbWluX2NvdW50ID0gNDtcbiAgICB9XG4gIH1cbn1cblxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIFNlbmQgYSBsaXRlcmFsIG9yIGRpc3RhbmNlIHRyZWUgaW4gY29tcHJlc3NlZCBmb3JtLCB1c2luZyB0aGUgY29kZXMgaW5cbiAqIGJsX3RyZWUuXG4gKi9cbmZ1bmN0aW9uIHNlbmRfdHJlZShzLCB0cmVlLCBtYXhfY29kZSlcbi8vICAgIGRlZmxhdGVfc3RhdGUgKnM7XG4vLyAgICBjdF9kYXRhICp0cmVlOyAvKiB0aGUgdHJlZSB0byBiZSBzY2FubmVkICovXG4vLyAgICBpbnQgbWF4X2NvZGU7ICAgICAgIC8qIGFuZCBpdHMgbGFyZ2VzdCBjb2RlIG9mIG5vbiB6ZXJvIGZyZXF1ZW5jeSAqL1xue1xuICB2YXIgbjsgICAgICAgICAgICAgICAgICAgICAvKiBpdGVyYXRlcyBvdmVyIGFsbCB0cmVlIGVsZW1lbnRzICovXG4gIHZhciBwcmV2bGVuID0gLTE7ICAgICAgICAgIC8qIGxhc3QgZW1pdHRlZCBsZW5ndGggKi9cbiAgdmFyIGN1cmxlbjsgICAgICAgICAgICAgICAgLyogbGVuZ3RoIG9mIGN1cnJlbnQgY29kZSAqL1xuXG4gIHZhciBuZXh0bGVuID0gdHJlZVswICogMiArIDFdLyouTGVuKi87IC8qIGxlbmd0aCBvZiBuZXh0IGNvZGUgKi9cblxuICB2YXIgY291bnQgPSAwOyAgICAgICAgICAgICAvKiByZXBlYXQgY291bnQgb2YgdGhlIGN1cnJlbnQgY29kZSAqL1xuICB2YXIgbWF4X2NvdW50ID0gNzsgICAgICAgICAvKiBtYXggcmVwZWF0IGNvdW50ICovXG4gIHZhciBtaW5fY291bnQgPSA0OyAgICAgICAgIC8qIG1pbiByZXBlYXQgY291bnQgKi9cblxuICAvKiB0cmVlW21heF9jb2RlKzFdLkxlbiA9IC0xOyAqLyAgLyogZ3VhcmQgYWxyZWFkeSBzZXQgKi9cbiAgaWYgKG5leHRsZW4gPT09IDApIHtcbiAgICBtYXhfY291bnQgPSAxMzg7XG4gICAgbWluX2NvdW50ID0gMztcbiAgfVxuXG4gIGZvciAobiA9IDA7IG4gPD0gbWF4X2NvZGU7IG4rKykge1xuICAgIGN1cmxlbiA9IG5leHRsZW47XG4gICAgbmV4dGxlbiA9IHRyZWVbKG4gKyAxKSAqIDIgKyAxXS8qLkxlbiovO1xuXG4gICAgaWYgKCsrY291bnQgPCBtYXhfY291bnQgJiYgY3VybGVuID09PSBuZXh0bGVuKSB7XG4gICAgICBjb250aW51ZTtcblxuICAgIH0gZWxzZSBpZiAoY291bnQgPCBtaW5fY291bnQpIHtcbiAgICAgIGRvIHsgc2VuZF9jb2RlKHMsIGN1cmxlbiwgcy5ibF90cmVlKTsgfSB3aGlsZSAoLS1jb3VudCAhPT0gMCk7XG5cbiAgICB9IGVsc2UgaWYgKGN1cmxlbiAhPT0gMCkge1xuICAgICAgaWYgKGN1cmxlbiAhPT0gcHJldmxlbikge1xuICAgICAgICBzZW5kX2NvZGUocywgY3VybGVuLCBzLmJsX3RyZWUpO1xuICAgICAgICBjb3VudC0tO1xuICAgICAgfVxuICAgICAgLy9Bc3NlcnQoY291bnQgPj0gMyAmJiBjb3VudCA8PSA2LCBcIiAzXzY/XCIpO1xuICAgICAgc2VuZF9jb2RlKHMsIFJFUF8zXzYsIHMuYmxfdHJlZSk7XG4gICAgICBzZW5kX2JpdHMocywgY291bnQgLSAzLCAyKTtcblxuICAgIH0gZWxzZSBpZiAoY291bnQgPD0gMTApIHtcbiAgICAgIHNlbmRfY29kZShzLCBSRVBaXzNfMTAsIHMuYmxfdHJlZSk7XG4gICAgICBzZW5kX2JpdHMocywgY291bnQgLSAzLCAzKTtcblxuICAgIH0gZWxzZSB7XG4gICAgICBzZW5kX2NvZGUocywgUkVQWl8xMV8xMzgsIHMuYmxfdHJlZSk7XG4gICAgICBzZW5kX2JpdHMocywgY291bnQgLSAxMSwgNyk7XG4gICAgfVxuXG4gICAgY291bnQgPSAwO1xuICAgIHByZXZsZW4gPSBjdXJsZW47XG4gICAgaWYgKG5leHRsZW4gPT09IDApIHtcbiAgICAgIG1heF9jb3VudCA9IDEzODtcbiAgICAgIG1pbl9jb3VudCA9IDM7XG5cbiAgICB9IGVsc2UgaWYgKGN1cmxlbiA9PT0gbmV4dGxlbikge1xuICAgICAgbWF4X2NvdW50ID0gNjtcbiAgICAgIG1pbl9jb3VudCA9IDM7XG5cbiAgICB9IGVsc2Uge1xuICAgICAgbWF4X2NvdW50ID0gNztcbiAgICAgIG1pbl9jb3VudCA9IDQ7XG4gICAgfVxuICB9XG59XG5cblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBDb25zdHJ1Y3QgdGhlIEh1ZmZtYW4gdHJlZSBmb3IgdGhlIGJpdCBsZW5ndGhzIGFuZCByZXR1cm4gdGhlIGluZGV4IGluXG4gKiBibF9vcmRlciBvZiB0aGUgbGFzdCBiaXQgbGVuZ3RoIGNvZGUgdG8gc2VuZC5cbiAqL1xuZnVuY3Rpb24gYnVpbGRfYmxfdHJlZShzKSB7XG4gIHZhciBtYXhfYmxpbmRleDsgIC8qIGluZGV4IG9mIGxhc3QgYml0IGxlbmd0aCBjb2RlIG9mIG5vbiB6ZXJvIGZyZXEgKi9cblxuICAvKiBEZXRlcm1pbmUgdGhlIGJpdCBsZW5ndGggZnJlcXVlbmNpZXMgZm9yIGxpdGVyYWwgYW5kIGRpc3RhbmNlIHRyZWVzICovXG4gIHNjYW5fdHJlZShzLCBzLmR5bl9sdHJlZSwgcy5sX2Rlc2MubWF4X2NvZGUpO1xuICBzY2FuX3RyZWUocywgcy5keW5fZHRyZWUsIHMuZF9kZXNjLm1heF9jb2RlKTtcblxuICAvKiBCdWlsZCB0aGUgYml0IGxlbmd0aCB0cmVlOiAqL1xuICBidWlsZF90cmVlKHMsIHMuYmxfZGVzYyk7XG4gIC8qIG9wdF9sZW4gbm93IGluY2x1ZGVzIHRoZSBsZW5ndGggb2YgdGhlIHRyZWUgcmVwcmVzZW50YXRpb25zLCBleGNlcHRcbiAgICogdGhlIGxlbmd0aHMgb2YgdGhlIGJpdCBsZW5ndGhzIGNvZGVzIGFuZCB0aGUgNSs1KzQgYml0cyBmb3IgdGhlIGNvdW50cy5cbiAgICovXG5cbiAgLyogRGV0ZXJtaW5lIHRoZSBudW1iZXIgb2YgYml0IGxlbmd0aCBjb2RlcyB0byBzZW5kLiBUaGUgcGt6aXAgZm9ybWF0XG4gICAqIHJlcXVpcmVzIHRoYXQgYXQgbGVhc3QgNCBiaXQgbGVuZ3RoIGNvZGVzIGJlIHNlbnQuIChhcHBub3RlLnR4dCBzYXlzXG4gICAqIDMgYnV0IHRoZSBhY3R1YWwgdmFsdWUgdXNlZCBpcyA0LilcbiAgICovXG4gIGZvciAobWF4X2JsaW5kZXggPSBCTF9DT0RFUyAtIDE7IG1heF9ibGluZGV4ID49IDM7IG1heF9ibGluZGV4LS0pIHtcbiAgICBpZiAocy5ibF90cmVlW2JsX29yZGVyW21heF9ibGluZGV4XSAqIDIgKyAxXS8qLkxlbiovICE9PSAwKSB7XG4gICAgICBicmVhaztcbiAgICB9XG4gIH1cbiAgLyogVXBkYXRlIG9wdF9sZW4gdG8gaW5jbHVkZSB0aGUgYml0IGxlbmd0aCB0cmVlIGFuZCBjb3VudHMgKi9cbiAgcy5vcHRfbGVuICs9IDMgKiAobWF4X2JsaW5kZXggKyAxKSArIDUgKyA1ICsgNDtcbiAgLy9UcmFjZXYoKHN0ZGVyciwgXCJcXG5keW4gdHJlZXM6IGR5biAlbGQsIHN0YXQgJWxkXCIsXG4gIC8vICAgICAgICBzLT5vcHRfbGVuLCBzLT5zdGF0aWNfbGVuKSk7XG5cbiAgcmV0dXJuIG1heF9ibGluZGV4O1xufVxuXG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogU2VuZCB0aGUgaGVhZGVyIGZvciBhIGJsb2NrIHVzaW5nIGR5bmFtaWMgSHVmZm1hbiB0cmVlczogdGhlIGNvdW50cywgdGhlXG4gKiBsZW5ndGhzIG9mIHRoZSBiaXQgbGVuZ3RoIGNvZGVzLCB0aGUgbGl0ZXJhbCB0cmVlIGFuZCB0aGUgZGlzdGFuY2UgdHJlZS5cbiAqIElOIGFzc2VydGlvbjogbGNvZGVzID49IDI1NywgZGNvZGVzID49IDEsIGJsY29kZXMgPj0gNC5cbiAqL1xuZnVuY3Rpb24gc2VuZF9hbGxfdHJlZXMocywgbGNvZGVzLCBkY29kZXMsIGJsY29kZXMpXG4vLyAgICBkZWZsYXRlX3N0YXRlICpzO1xuLy8gICAgaW50IGxjb2RlcywgZGNvZGVzLCBibGNvZGVzOyAvKiBudW1iZXIgb2YgY29kZXMgZm9yIGVhY2ggdHJlZSAqL1xue1xuICB2YXIgcmFuazsgICAgICAgICAgICAgICAgICAgIC8qIGluZGV4IGluIGJsX29yZGVyICovXG5cbiAgLy9Bc3NlcnQgKGxjb2RlcyA+PSAyNTcgJiYgZGNvZGVzID49IDEgJiYgYmxjb2RlcyA+PSA0LCBcIm5vdCBlbm91Z2ggY29kZXNcIik7XG4gIC8vQXNzZXJ0IChsY29kZXMgPD0gTF9DT0RFUyAmJiBkY29kZXMgPD0gRF9DT0RFUyAmJiBibGNvZGVzIDw9IEJMX0NPREVTLFxuICAvLyAgICAgICAgXCJ0b28gbWFueSBjb2Rlc1wiKTtcbiAgLy9UcmFjZXYoKHN0ZGVyciwgXCJcXG5ibCBjb3VudHM6IFwiKSk7XG4gIHNlbmRfYml0cyhzLCBsY29kZXMgLSAyNTcsIDUpOyAvKiBub3QgKzI1NSBhcyBzdGF0ZWQgaW4gYXBwbm90ZS50eHQgKi9cbiAgc2VuZF9iaXRzKHMsIGRjb2RlcyAtIDEsICAgNSk7XG4gIHNlbmRfYml0cyhzLCBibGNvZGVzIC0gNCwgIDQpOyAvKiBub3QgLTMgYXMgc3RhdGVkIGluIGFwcG5vdGUudHh0ICovXG4gIGZvciAocmFuayA9IDA7IHJhbmsgPCBibGNvZGVzOyByYW5rKyspIHtcbiAgICAvL1RyYWNldigoc3RkZXJyLCBcIlxcbmJsIGNvZGUgJTJkIFwiLCBibF9vcmRlcltyYW5rXSkpO1xuICAgIHNlbmRfYml0cyhzLCBzLmJsX3RyZWVbYmxfb3JkZXJbcmFua10gKiAyICsgMV0vKi5MZW4qLywgMyk7XG4gIH1cbiAgLy9UcmFjZXYoKHN0ZGVyciwgXCJcXG5ibCB0cmVlOiBzZW50ICVsZFwiLCBzLT5iaXRzX3NlbnQpKTtcblxuICBzZW5kX3RyZWUocywgcy5keW5fbHRyZWUsIGxjb2RlcyAtIDEpOyAvKiBsaXRlcmFsIHRyZWUgKi9cbiAgLy9UcmFjZXYoKHN0ZGVyciwgXCJcXG5saXQgdHJlZTogc2VudCAlbGRcIiwgcy0+Yml0c19zZW50KSk7XG5cbiAgc2VuZF90cmVlKHMsIHMuZHluX2R0cmVlLCBkY29kZXMgLSAxKTsgLyogZGlzdGFuY2UgdHJlZSAqL1xuICAvL1RyYWNldigoc3RkZXJyLCBcIlxcbmRpc3QgdHJlZTogc2VudCAlbGRcIiwgcy0+Yml0c19zZW50KSk7XG59XG5cblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBDaGVjayBpZiB0aGUgZGF0YSB0eXBlIGlzIFRFWFQgb3IgQklOQVJZLCB1c2luZyB0aGUgZm9sbG93aW5nIGFsZ29yaXRobTpcbiAqIC0gVEVYVCBpZiB0aGUgdHdvIGNvbmRpdGlvbnMgYmVsb3cgYXJlIHNhdGlzZmllZDpcbiAqICAgIGEpIFRoZXJlIGFyZSBubyBub24tcG9ydGFibGUgY29udHJvbCBjaGFyYWN0ZXJzIGJlbG9uZ2luZyB0byB0aGVcbiAqICAgICAgIFwiYmxhY2sgbGlzdFwiICgwLi42LCAxNC4uMjUsIDI4Li4zMSkuXG4gKiAgICBiKSBUaGVyZSBpcyBhdCBsZWFzdCBvbmUgcHJpbnRhYmxlIGNoYXJhY3RlciBiZWxvbmdpbmcgdG8gdGhlXG4gKiAgICAgICBcIndoaXRlIGxpc3RcIiAoOSB7VEFCfSwgMTAge0xGfSwgMTMge0NSfSwgMzIuLjI1NSkuXG4gKiAtIEJJTkFSWSBvdGhlcndpc2UuXG4gKiAtIFRoZSBmb2xsb3dpbmcgcGFydGlhbGx5LXBvcnRhYmxlIGNvbnRyb2wgY2hhcmFjdGVycyBmb3JtIGFcbiAqICAgXCJncmF5IGxpc3RcIiB0aGF0IGlzIGlnbm9yZWQgaW4gdGhpcyBkZXRlY3Rpb24gYWxnb3JpdGhtOlxuICogICAoNyB7QkVMfSwgOCB7QlN9LCAxMSB7VlR9LCAxMiB7RkZ9LCAyNiB7U1VCfSwgMjcge0VTQ30pLlxuICogSU4gYXNzZXJ0aW9uOiB0aGUgZmllbGRzIEZyZXEgb2YgZHluX2x0cmVlIGFyZSBzZXQuXG4gKi9cbmZ1bmN0aW9uIGRldGVjdF9kYXRhX3R5cGUocykge1xuICAvKiBibGFja19tYXNrIGlzIHRoZSBiaXQgbWFzayBvZiBibGFjay1saXN0ZWQgYnl0ZXNcbiAgICogc2V0IGJpdHMgMC4uNiwgMTQuLjI1LCBhbmQgMjguLjMxXG4gICAqIDB4ZjNmZmMwN2YgPSBiaW5hcnkgMTExMTAwMTExMTExMTExMTExMDAwMDAwMDExMTExMTFcbiAgICovXG4gIHZhciBibGFja19tYXNrID0gMHhmM2ZmYzA3ZjtcbiAgdmFyIG47XG5cbiAgLyogQ2hlY2sgZm9yIG5vbi10ZXh0dWFsIChcImJsYWNrLWxpc3RlZFwiKSBieXRlcy4gKi9cbiAgZm9yIChuID0gMDsgbiA8PSAzMTsgbisrLCBibGFja19tYXNrID4+Pj0gMSkge1xuICAgIGlmICgoYmxhY2tfbWFzayAmIDEpICYmIChzLmR5bl9sdHJlZVtuICogMl0vKi5GcmVxKi8gIT09IDApKSB7XG4gICAgICByZXR1cm4gWl9CSU5BUlk7XG4gICAgfVxuICB9XG5cbiAgLyogQ2hlY2sgZm9yIHRleHR1YWwgKFwid2hpdGUtbGlzdGVkXCIpIGJ5dGVzLiAqL1xuICBpZiAocy5keW5fbHRyZWVbOSAqIDJdLyouRnJlcSovICE9PSAwIHx8IHMuZHluX2x0cmVlWzEwICogMl0vKi5GcmVxKi8gIT09IDAgfHxcbiAgICAgIHMuZHluX2x0cmVlWzEzICogMl0vKi5GcmVxKi8gIT09IDApIHtcbiAgICByZXR1cm4gWl9URVhUO1xuICB9XG4gIGZvciAobiA9IDMyOyBuIDwgTElURVJBTFM7IG4rKykge1xuICAgIGlmIChzLmR5bl9sdHJlZVtuICogMl0vKi5GcmVxKi8gIT09IDApIHtcbiAgICAgIHJldHVybiBaX1RFWFQ7XG4gICAgfVxuICB9XG5cbiAgLyogVGhlcmUgYXJlIG5vIFwiYmxhY2stbGlzdGVkXCIgb3IgXCJ3aGl0ZS1saXN0ZWRcIiBieXRlczpcbiAgICogdGhpcyBzdHJlYW0gZWl0aGVyIGlzIGVtcHR5IG9yIGhhcyB0b2xlcmF0ZWQgKFwiZ3JheS1saXN0ZWRcIikgYnl0ZXMgb25seS5cbiAgICovXG4gIHJldHVybiBaX0JJTkFSWTtcbn1cblxuXG52YXIgc3RhdGljX2luaXRfZG9uZSA9IGZhbHNlO1xuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIEluaXRpYWxpemUgdGhlIHRyZWUgZGF0YSBzdHJ1Y3R1cmVzIGZvciBhIG5ldyB6bGliIHN0cmVhbS5cbiAqL1xuZnVuY3Rpb24gX3RyX2luaXQocylcbntcblxuICBpZiAoIXN0YXRpY19pbml0X2RvbmUpIHtcbiAgICB0cl9zdGF0aWNfaW5pdCgpO1xuICAgIHN0YXRpY19pbml0X2RvbmUgPSB0cnVlO1xuICB9XG5cbiAgcy5sX2Rlc2MgID0gbmV3IFRyZWVEZXNjKHMuZHluX2x0cmVlLCBzdGF0aWNfbF9kZXNjKTtcbiAgcy5kX2Rlc2MgID0gbmV3IFRyZWVEZXNjKHMuZHluX2R0cmVlLCBzdGF0aWNfZF9kZXNjKTtcbiAgcy5ibF9kZXNjID0gbmV3IFRyZWVEZXNjKHMuYmxfdHJlZSwgc3RhdGljX2JsX2Rlc2MpO1xuXG4gIHMuYmlfYnVmID0gMDtcbiAgcy5iaV92YWxpZCA9IDA7XG5cbiAgLyogSW5pdGlhbGl6ZSB0aGUgZmlyc3QgYmxvY2sgb2YgdGhlIGZpcnN0IGZpbGU6ICovXG4gIGluaXRfYmxvY2socyk7XG59XG5cblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBTZW5kIGEgc3RvcmVkIGJsb2NrXG4gKi9cbmZ1bmN0aW9uIF90cl9zdG9yZWRfYmxvY2socywgYnVmLCBzdG9yZWRfbGVuLCBsYXN0KVxuLy9EZWZsYXRlU3RhdGUgKnM7XG4vL2NoYXJmICpidWY7ICAgICAgIC8qIGlucHV0IGJsb2NrICovXG4vL3VsZyBzdG9yZWRfbGVuOyAgIC8qIGxlbmd0aCBvZiBpbnB1dCBibG9jayAqL1xuLy9pbnQgbGFzdDsgICAgICAgICAvKiBvbmUgaWYgdGhpcyBpcyB0aGUgbGFzdCBibG9jayBmb3IgYSBmaWxlICovXG57XG4gIHNlbmRfYml0cyhzLCAoU1RPUkVEX0JMT0NLIDw8IDEpICsgKGxhc3QgPyAxIDogMCksIDMpOyAgICAvKiBzZW5kIGJsb2NrIHR5cGUgKi9cbiAgY29weV9ibG9jayhzLCBidWYsIHN0b3JlZF9sZW4sIHRydWUpOyAvKiB3aXRoIGhlYWRlciAqL1xufVxuXG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogU2VuZCBvbmUgZW1wdHkgc3RhdGljIGJsb2NrIHRvIGdpdmUgZW5vdWdoIGxvb2thaGVhZCBmb3IgaW5mbGF0ZS5cbiAqIFRoaXMgdGFrZXMgMTAgYml0cywgb2Ygd2hpY2ggNyBtYXkgcmVtYWluIGluIHRoZSBiaXQgYnVmZmVyLlxuICovXG5mdW5jdGlvbiBfdHJfYWxpZ24ocykge1xuICBzZW5kX2JpdHMocywgU1RBVElDX1RSRUVTIDw8IDEsIDMpO1xuICBzZW5kX2NvZGUocywgRU5EX0JMT0NLLCBzdGF0aWNfbHRyZWUpO1xuICBiaV9mbHVzaChzKTtcbn1cblxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIERldGVybWluZSB0aGUgYmVzdCBlbmNvZGluZyBmb3IgdGhlIGN1cnJlbnQgYmxvY2s6IGR5bmFtaWMgdHJlZXMsIHN0YXRpY1xuICogdHJlZXMgb3Igc3RvcmUsIGFuZCBvdXRwdXQgdGhlIGVuY29kZWQgYmxvY2sgdG8gdGhlIHppcCBmaWxlLlxuICovXG5mdW5jdGlvbiBfdHJfZmx1c2hfYmxvY2socywgYnVmLCBzdG9yZWRfbGVuLCBsYXN0KVxuLy9EZWZsYXRlU3RhdGUgKnM7XG4vL2NoYXJmICpidWY7ICAgICAgIC8qIGlucHV0IGJsb2NrLCBvciBOVUxMIGlmIHRvbyBvbGQgKi9cbi8vdWxnIHN0b3JlZF9sZW47ICAgLyogbGVuZ3RoIG9mIGlucHV0IGJsb2NrICovXG4vL2ludCBsYXN0OyAgICAgICAgIC8qIG9uZSBpZiB0aGlzIGlzIHRoZSBsYXN0IGJsb2NrIGZvciBhIGZpbGUgKi9cbntcbiAgdmFyIG9wdF9sZW5iLCBzdGF0aWNfbGVuYjsgIC8qIG9wdF9sZW4gYW5kIHN0YXRpY19sZW4gaW4gYnl0ZXMgKi9cbiAgdmFyIG1heF9ibGluZGV4ID0gMDsgICAgICAgIC8qIGluZGV4IG9mIGxhc3QgYml0IGxlbmd0aCBjb2RlIG9mIG5vbiB6ZXJvIGZyZXEgKi9cblxuICAvKiBCdWlsZCB0aGUgSHVmZm1hbiB0cmVlcyB1bmxlc3MgYSBzdG9yZWQgYmxvY2sgaXMgZm9yY2VkICovXG4gIGlmIChzLmxldmVsID4gMCkge1xuXG4gICAgLyogQ2hlY2sgaWYgdGhlIGZpbGUgaXMgYmluYXJ5IG9yIHRleHQgKi9cbiAgICBpZiAocy5zdHJtLmRhdGFfdHlwZSA9PT0gWl9VTktOT1dOKSB7XG4gICAgICBzLnN0cm0uZGF0YV90eXBlID0gZGV0ZWN0X2RhdGFfdHlwZShzKTtcbiAgICB9XG5cbiAgICAvKiBDb25zdHJ1Y3QgdGhlIGxpdGVyYWwgYW5kIGRpc3RhbmNlIHRyZWVzICovXG4gICAgYnVpbGRfdHJlZShzLCBzLmxfZGVzYyk7XG4gICAgLy8gVHJhY2V2KChzdGRlcnIsIFwiXFxubGl0IGRhdGE6IGR5biAlbGQsIHN0YXQgJWxkXCIsIHMtPm9wdF9sZW4sXG4gICAgLy8gICAgICAgIHMtPnN0YXRpY19sZW4pKTtcblxuICAgIGJ1aWxkX3RyZWUocywgcy5kX2Rlc2MpO1xuICAgIC8vIFRyYWNldigoc3RkZXJyLCBcIlxcbmRpc3QgZGF0YTogZHluICVsZCwgc3RhdCAlbGRcIiwgcy0+b3B0X2xlbixcbiAgICAvLyAgICAgICAgcy0+c3RhdGljX2xlbikpO1xuICAgIC8qIEF0IHRoaXMgcG9pbnQsIG9wdF9sZW4gYW5kIHN0YXRpY19sZW4gYXJlIHRoZSB0b3RhbCBiaXQgbGVuZ3RocyBvZlxuICAgICAqIHRoZSBjb21wcmVzc2VkIGJsb2NrIGRhdGEsIGV4Y2x1ZGluZyB0aGUgdHJlZSByZXByZXNlbnRhdGlvbnMuXG4gICAgICovXG5cbiAgICAvKiBCdWlsZCB0aGUgYml0IGxlbmd0aCB0cmVlIGZvciB0aGUgYWJvdmUgdHdvIHRyZWVzLCBhbmQgZ2V0IHRoZSBpbmRleFxuICAgICAqIGluIGJsX29yZGVyIG9mIHRoZSBsYXN0IGJpdCBsZW5ndGggY29kZSB0byBzZW5kLlxuICAgICAqL1xuICAgIG1heF9ibGluZGV4ID0gYnVpbGRfYmxfdHJlZShzKTtcblxuICAgIC8qIERldGVybWluZSB0aGUgYmVzdCBlbmNvZGluZy4gQ29tcHV0ZSB0aGUgYmxvY2sgbGVuZ3RocyBpbiBieXRlcy4gKi9cbiAgICBvcHRfbGVuYiA9IChzLm9wdF9sZW4gKyAzICsgNykgPj4+IDM7XG4gICAgc3RhdGljX2xlbmIgPSAocy5zdGF0aWNfbGVuICsgMyArIDcpID4+PiAzO1xuXG4gICAgLy8gVHJhY2V2KChzdGRlcnIsIFwiXFxub3B0ICVsdSglbHUpIHN0YXQgJWx1KCVsdSkgc3RvcmVkICVsdSBsaXQgJXUgXCIsXG4gICAgLy8gICAgICAgIG9wdF9sZW5iLCBzLT5vcHRfbGVuLCBzdGF0aWNfbGVuYiwgcy0+c3RhdGljX2xlbiwgc3RvcmVkX2xlbixcbiAgICAvLyAgICAgICAgcy0+bGFzdF9saXQpKTtcblxuICAgIGlmIChzdGF0aWNfbGVuYiA8PSBvcHRfbGVuYikgeyBvcHRfbGVuYiA9IHN0YXRpY19sZW5iOyB9XG5cbiAgfSBlbHNlIHtcbiAgICAvLyBBc3NlcnQoYnVmICE9IChjaGFyKikwLCBcImxvc3QgYnVmXCIpO1xuICAgIG9wdF9sZW5iID0gc3RhdGljX2xlbmIgPSBzdG9yZWRfbGVuICsgNTsgLyogZm9yY2UgYSBzdG9yZWQgYmxvY2sgKi9cbiAgfVxuXG4gIGlmICgoc3RvcmVkX2xlbiArIDQgPD0gb3B0X2xlbmIpICYmIChidWYgIT09IC0xKSkge1xuICAgIC8qIDQ6IHR3byB3b3JkcyBmb3IgdGhlIGxlbmd0aHMgKi9cblxuICAgIC8qIFRoZSB0ZXN0IGJ1ZiAhPSBOVUxMIGlzIG9ubHkgbmVjZXNzYXJ5IGlmIExJVF9CVUZTSVpFID4gV1NJWkUuXG4gICAgICogT3RoZXJ3aXNlIHdlIGNhbid0IGhhdmUgcHJvY2Vzc2VkIG1vcmUgdGhhbiBXU0laRSBpbnB1dCBieXRlcyBzaW5jZVxuICAgICAqIHRoZSBsYXN0IGJsb2NrIGZsdXNoLCBiZWNhdXNlIGNvbXByZXNzaW9uIHdvdWxkIGhhdmUgYmVlblxuICAgICAqIHN1Y2Nlc3NmdWwuIElmIExJVF9CVUZTSVpFIDw9IFdTSVpFLCBpdCBpcyBuZXZlciB0b28gbGF0ZSB0b1xuICAgICAqIHRyYW5zZm9ybSBhIGJsb2NrIGludG8gYSBzdG9yZWQgYmxvY2suXG4gICAgICovXG4gICAgX3RyX3N0b3JlZF9ibG9jayhzLCBidWYsIHN0b3JlZF9sZW4sIGxhc3QpO1xuXG4gIH0gZWxzZSBpZiAocy5zdHJhdGVneSA9PT0gWl9GSVhFRCB8fCBzdGF0aWNfbGVuYiA9PT0gb3B0X2xlbmIpIHtcblxuICAgIHNlbmRfYml0cyhzLCAoU1RBVElDX1RSRUVTIDw8IDEpICsgKGxhc3QgPyAxIDogMCksIDMpO1xuICAgIGNvbXByZXNzX2Jsb2NrKHMsIHN0YXRpY19sdHJlZSwgc3RhdGljX2R0cmVlKTtcblxuICB9IGVsc2Uge1xuICAgIHNlbmRfYml0cyhzLCAoRFlOX1RSRUVTIDw8IDEpICsgKGxhc3QgPyAxIDogMCksIDMpO1xuICAgIHNlbmRfYWxsX3RyZWVzKHMsIHMubF9kZXNjLm1heF9jb2RlICsgMSwgcy5kX2Rlc2MubWF4X2NvZGUgKyAxLCBtYXhfYmxpbmRleCArIDEpO1xuICAgIGNvbXByZXNzX2Jsb2NrKHMsIHMuZHluX2x0cmVlLCBzLmR5bl9kdHJlZSk7XG4gIH1cbiAgLy8gQXNzZXJ0IChzLT5jb21wcmVzc2VkX2xlbiA9PSBzLT5iaXRzX3NlbnQsIFwiYmFkIGNvbXByZXNzZWQgc2l6ZVwiKTtcbiAgLyogVGhlIGFib3ZlIGNoZWNrIGlzIG1hZGUgbW9kIDJeMzIsIGZvciBmaWxlcyBsYXJnZXIgdGhhbiA1MTIgTUJcbiAgICogYW5kIHVMb25nIGltcGxlbWVudGVkIG9uIDMyIGJpdHMuXG4gICAqL1xuICBpbml0X2Jsb2NrKHMpO1xuXG4gIGlmIChsYXN0KSB7XG4gICAgYmlfd2luZHVwKHMpO1xuICB9XG4gIC8vIFRyYWNldigoc3RkZXJyLFwiXFxuY29tcHJsZW4gJWx1KCVsdSkgXCIsIHMtPmNvbXByZXNzZWRfbGVuPj4zLFxuICAvLyAgICAgICBzLT5jb21wcmVzc2VkX2xlbi03Kmxhc3QpKTtcbn1cblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBTYXZlIHRoZSBtYXRjaCBpbmZvIGFuZCB0YWxseSB0aGUgZnJlcXVlbmN5IGNvdW50cy4gUmV0dXJuIHRydWUgaWZcbiAqIHRoZSBjdXJyZW50IGJsb2NrIG11c3QgYmUgZmx1c2hlZC5cbiAqL1xuZnVuY3Rpb24gX3RyX3RhbGx5KHMsIGRpc3QsIGxjKVxuLy8gICAgZGVmbGF0ZV9zdGF0ZSAqcztcbi8vICAgIHVuc2lnbmVkIGRpc3Q7ICAvKiBkaXN0YW5jZSBvZiBtYXRjaGVkIHN0cmluZyAqL1xuLy8gICAgdW5zaWduZWQgbGM7ICAgIC8qIG1hdGNoIGxlbmd0aC1NSU5fTUFUQ0ggb3IgdW5tYXRjaGVkIGNoYXIgKGlmIGRpc3Q9PTApICovXG57XG4gIC8vdmFyIG91dF9sZW5ndGgsIGluX2xlbmd0aCwgZGNvZGU7XG5cbiAgcy5wZW5kaW5nX2J1ZltzLmRfYnVmICsgcy5sYXN0X2xpdCAqIDJdICAgICA9IChkaXN0ID4+PiA4KSAmIDB4ZmY7XG4gIHMucGVuZGluZ19idWZbcy5kX2J1ZiArIHMubGFzdF9saXQgKiAyICsgMV0gPSBkaXN0ICYgMHhmZjtcblxuICBzLnBlbmRpbmdfYnVmW3MubF9idWYgKyBzLmxhc3RfbGl0XSA9IGxjICYgMHhmZjtcbiAgcy5sYXN0X2xpdCsrO1xuXG4gIGlmIChkaXN0ID09PSAwKSB7XG4gICAgLyogbGMgaXMgdGhlIHVubWF0Y2hlZCBjaGFyICovXG4gICAgcy5keW5fbHRyZWVbbGMgKiAyXS8qLkZyZXEqLysrO1xuICB9IGVsc2Uge1xuICAgIHMubWF0Y2hlcysrO1xuICAgIC8qIEhlcmUsIGxjIGlzIHRoZSBtYXRjaCBsZW5ndGggLSBNSU5fTUFUQ0ggKi9cbiAgICBkaXN0LS07ICAgICAgICAgICAgIC8qIGRpc3QgPSBtYXRjaCBkaXN0YW5jZSAtIDEgKi9cbiAgICAvL0Fzc2VydCgodXNoKWRpc3QgPCAodXNoKU1BWF9ESVNUKHMpICYmXG4gICAgLy8gICAgICAgKHVzaClsYyA8PSAodXNoKShNQVhfTUFUQ0gtTUlOX01BVENIKSAmJlxuICAgIC8vICAgICAgICh1c2gpZF9jb2RlKGRpc3QpIDwgKHVzaClEX0NPREVTLCAgXCJfdHJfdGFsbHk6IGJhZCBtYXRjaFwiKTtcblxuICAgIHMuZHluX2x0cmVlWyhfbGVuZ3RoX2NvZGVbbGNdICsgTElURVJBTFMgKyAxKSAqIDJdLyouRnJlcSovKys7XG4gICAgcy5keW5fZHRyZWVbZF9jb2RlKGRpc3QpICogMl0vKi5GcmVxKi8rKztcbiAgfVxuXG4vLyAoISkgVGhpcyBibG9jayBpcyBkaXNhYmxlZCBpbiB6bGliIGRlZmFpbHRzLFxuLy8gZG9uJ3QgZW5hYmxlIGl0IGZvciBiaW5hcnkgY29tcGF0aWJpbGl0eVxuXG4vLyNpZmRlZiBUUlVOQ0FURV9CTE9DS1xuLy8gIC8qIFRyeSB0byBndWVzcyBpZiBpdCBpcyBwcm9maXRhYmxlIHRvIHN0b3AgdGhlIGN1cnJlbnQgYmxvY2sgaGVyZSAqL1xuLy8gIGlmICgocy5sYXN0X2xpdCAmIDB4MWZmZikgPT09IDAgJiYgcy5sZXZlbCA+IDIpIHtcbi8vICAgIC8qIENvbXB1dGUgYW4gdXBwZXIgYm91bmQgZm9yIHRoZSBjb21wcmVzc2VkIGxlbmd0aCAqL1xuLy8gICAgb3V0X2xlbmd0aCA9IHMubGFzdF9saXQqODtcbi8vICAgIGluX2xlbmd0aCA9IHMuc3Ryc3RhcnQgLSBzLmJsb2NrX3N0YXJ0O1xuLy9cbi8vICAgIGZvciAoZGNvZGUgPSAwOyBkY29kZSA8IERfQ09ERVM7IGRjb2RlKyspIHtcbi8vICAgICAgb3V0X2xlbmd0aCArPSBzLmR5bl9kdHJlZVtkY29kZSoyXS8qLkZyZXEqLyAqICg1ICsgZXh0cmFfZGJpdHNbZGNvZGVdKTtcbi8vICAgIH1cbi8vICAgIG91dF9sZW5ndGggPj4+PSAzO1xuLy8gICAgLy9UcmFjZXYoKHN0ZGVycixcIlxcbmxhc3RfbGl0ICV1LCBpbiAlbGQsIG91dCB+JWxkKCVsZCUlKSBcIixcbi8vICAgIC8vICAgICAgIHMtPmxhc3RfbGl0LCBpbl9sZW5ndGgsIG91dF9sZW5ndGgsXG4vLyAgICAvLyAgICAgICAxMDBMIC0gb3V0X2xlbmd0aCoxMDBML2luX2xlbmd0aCkpO1xuLy8gICAgaWYgKHMubWF0Y2hlcyA8IChzLmxhc3RfbGl0Pj4xKS8qaW50IC8yKi8gJiYgb3V0X2xlbmd0aCA8IChpbl9sZW5ndGg+PjEpLyppbnQgLzIqLykge1xuLy8gICAgICByZXR1cm4gdHJ1ZTtcbi8vICAgIH1cbi8vICB9XG4vLyNlbmRpZlxuXG4gIHJldHVybiAocy5sYXN0X2xpdCA9PT0gcy5saXRfYnVmc2l6ZSAtIDEpO1xuICAvKiBXZSBhdm9pZCBlcXVhbGl0eSB3aXRoIGxpdF9idWZzaXplIGJlY2F1c2Ugb2Ygd3JhcGFyb3VuZCBhdCA2NEtcbiAgICogb24gMTYgYml0IG1hY2hpbmVzIGFuZCBiZWNhdXNlIHN0b3JlZCBibG9ja3MgYXJlIHJlc3RyaWN0ZWQgdG9cbiAgICogNjRLLTEgYnl0ZXMuXG4gICAqL1xufVxuXG5leHBvcnRzLl90cl9pbml0ICA9IF90cl9pbml0O1xuZXhwb3J0cy5fdHJfc3RvcmVkX2Jsb2NrID0gX3RyX3N0b3JlZF9ibG9jaztcbmV4cG9ydHMuX3RyX2ZsdXNoX2Jsb2NrICA9IF90cl9mbHVzaF9ibG9jaztcbmV4cG9ydHMuX3RyX3RhbGx5ID0gX3RyX3RhbGx5O1xuZXhwb3J0cy5fdHJfYWxpZ24gPSBfdHJfYWxpZ247XG4iLCIndXNlIHN0cmljdCc7XG5cblxuZnVuY3Rpb24gWlN0cmVhbSgpIHtcbiAgLyogbmV4dCBpbnB1dCBieXRlICovXG4gIHRoaXMuaW5wdXQgPSBudWxsOyAvLyBKUyBzcGVjaWZpYywgYmVjYXVzZSB3ZSBoYXZlIG5vIHBvaW50ZXJzXG4gIHRoaXMubmV4dF9pbiA9IDA7XG4gIC8qIG51bWJlciBvZiBieXRlcyBhdmFpbGFibGUgYXQgaW5wdXQgKi9cbiAgdGhpcy5hdmFpbF9pbiA9IDA7XG4gIC8qIHRvdGFsIG51bWJlciBvZiBpbnB1dCBieXRlcyByZWFkIHNvIGZhciAqL1xuICB0aGlzLnRvdGFsX2luID0gMDtcbiAgLyogbmV4dCBvdXRwdXQgYnl0ZSBzaG91bGQgYmUgcHV0IHRoZXJlICovXG4gIHRoaXMub3V0cHV0ID0gbnVsbDsgLy8gSlMgc3BlY2lmaWMsIGJlY2F1c2Ugd2UgaGF2ZSBubyBwb2ludGVyc1xuICB0aGlzLm5leHRfb3V0ID0gMDtcbiAgLyogcmVtYWluaW5nIGZyZWUgc3BhY2UgYXQgb3V0cHV0ICovXG4gIHRoaXMuYXZhaWxfb3V0ID0gMDtcbiAgLyogdG90YWwgbnVtYmVyIG9mIGJ5dGVzIG91dHB1dCBzbyBmYXIgKi9cbiAgdGhpcy50b3RhbF9vdXQgPSAwO1xuICAvKiBsYXN0IGVycm9yIG1lc3NhZ2UsIE5VTEwgaWYgbm8gZXJyb3IgKi9cbiAgdGhpcy5tc2cgPSAnJy8qWl9OVUxMKi87XG4gIC8qIG5vdCB2aXNpYmxlIGJ5IGFwcGxpY2F0aW9ucyAqL1xuICB0aGlzLnN0YXRlID0gbnVsbDtcbiAgLyogYmVzdCBndWVzcyBhYm91dCB0aGUgZGF0YSB0eXBlOiBiaW5hcnkgb3IgdGV4dCAqL1xuICB0aGlzLmRhdGFfdHlwZSA9IDIvKlpfVU5LTk9XTiovO1xuICAvKiBhZGxlcjMyIHZhbHVlIG9mIHRoZSB1bmNvbXByZXNzZWQgZGF0YSAqL1xuICB0aGlzLmFkbGVyID0gMDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBaU3RyZWFtO1xuIiwiLy8gYSBkdXBsZXggc3RyZWFtIGlzIGp1c3QgYSBzdHJlYW0gdGhhdCBpcyBib3RoIHJlYWRhYmxlIGFuZCB3cml0YWJsZS5cbi8vIFNpbmNlIEpTIGRvZXNuJ3QgaGF2ZSBtdWx0aXBsZSBwcm90b3R5cGFsIGluaGVyaXRhbmNlLCB0aGlzIGNsYXNzXG4vLyBwcm90b3R5cGFsbHkgaW5oZXJpdHMgZnJvbSBSZWFkYWJsZSwgYW5kIHRoZW4gcGFyYXNpdGljYWxseSBmcm9tXG4vLyBXcml0YWJsZS5cblxuJ3VzZSBzdHJpY3QnO1xuXG4vKjxyZXBsYWNlbWVudD4qL1xuXG52YXIgb2JqZWN0S2V5cyA9IE9iamVjdC5rZXlzIHx8IGZ1bmN0aW9uIChvYmopIHtcbiAgdmFyIGtleXMgPSBbXTtcbiAgZm9yICh2YXIga2V5IGluIG9iaikge1xuICAgIGtleXMucHVzaChrZXkpO1xuICB9cmV0dXJuIGtleXM7XG59O1xuLyo8L3JlcGxhY2VtZW50PiovXG5cbm1vZHVsZS5leHBvcnRzID0gRHVwbGV4O1xuXG4vKjxyZXBsYWNlbWVudD4qL1xudmFyIHByb2Nlc3NOZXh0VGljayA9IHJlcXVpcmUoJ3Byb2Nlc3MtbmV4dGljay1hcmdzJyk7XG4vKjwvcmVwbGFjZW1lbnQ+Ki9cblxuLyo8cmVwbGFjZW1lbnQ+Ki9cbnZhciB1dGlsID0gcmVxdWlyZSgnY29yZS11dGlsLWlzJyk7XG51dGlsLmluaGVyaXRzID0gcmVxdWlyZSgnaW5oZXJpdHMnKTtcbi8qPC9yZXBsYWNlbWVudD4qL1xuXG52YXIgUmVhZGFibGUgPSByZXF1aXJlKCcuL19zdHJlYW1fcmVhZGFibGUnKTtcbnZhciBXcml0YWJsZSA9IHJlcXVpcmUoJy4vX3N0cmVhbV93cml0YWJsZScpO1xuXG51dGlsLmluaGVyaXRzKER1cGxleCwgUmVhZGFibGUpO1xuXG52YXIga2V5cyA9IG9iamVjdEtleXMoV3JpdGFibGUucHJvdG90eXBlKTtcbmZvciAodmFyIHYgPSAwOyB2IDwga2V5cy5sZW5ndGg7IHYrKykge1xuICB2YXIgbWV0aG9kID0ga2V5c1t2XTtcbiAgaWYgKCFEdXBsZXgucHJvdG90eXBlW21ldGhvZF0pIER1cGxleC5wcm90b3R5cGVbbWV0aG9kXSA9IFdyaXRhYmxlLnByb3RvdHlwZVttZXRob2RdO1xufVxuXG5mdW5jdGlvbiBEdXBsZXgob3B0aW9ucykge1xuICBpZiAoISh0aGlzIGluc3RhbmNlb2YgRHVwbGV4KSkgcmV0dXJuIG5ldyBEdXBsZXgob3B0aW9ucyk7XG5cbiAgUmVhZGFibGUuY2FsbCh0aGlzLCBvcHRpb25zKTtcbiAgV3JpdGFibGUuY2FsbCh0aGlzLCBvcHRpb25zKTtcblxuICBpZiAob3B0aW9ucyAmJiBvcHRpb25zLnJlYWRhYmxlID09PSBmYWxzZSkgdGhpcy5yZWFkYWJsZSA9IGZhbHNlO1xuXG4gIGlmIChvcHRpb25zICYmIG9wdGlvbnMud3JpdGFibGUgPT09IGZhbHNlKSB0aGlzLndyaXRhYmxlID0gZmFsc2U7XG5cbiAgdGhpcy5hbGxvd0hhbGZPcGVuID0gdHJ1ZTtcbiAgaWYgKG9wdGlvbnMgJiYgb3B0aW9ucy5hbGxvd0hhbGZPcGVuID09PSBmYWxzZSkgdGhpcy5hbGxvd0hhbGZPcGVuID0gZmFsc2U7XG5cbiAgdGhpcy5vbmNlKCdlbmQnLCBvbmVuZCk7XG59XG5cbi8vIHRoZSBuby1oYWxmLW9wZW4gZW5mb3JjZXJcbmZ1bmN0aW9uIG9uZW5kKCkge1xuICAvLyBpZiB3ZSBhbGxvdyBoYWxmLW9wZW4gc3RhdGUsIG9yIGlmIHRoZSB3cml0YWJsZSBzaWRlIGVuZGVkLFxuICAvLyB0aGVuIHdlJ3JlIG9rLlxuICBpZiAodGhpcy5hbGxvd0hhbGZPcGVuIHx8IHRoaXMuX3dyaXRhYmxlU3RhdGUuZW5kZWQpIHJldHVybjtcblxuICAvLyBubyBtb3JlIGRhdGEgY2FuIGJlIHdyaXR0ZW4uXG4gIC8vIEJ1dCBhbGxvdyBtb3JlIHdyaXRlcyB0byBoYXBwZW4gaW4gdGhpcyB0aWNrLlxuICBwcm9jZXNzTmV4dFRpY2sob25FbmROVCwgdGhpcyk7XG59XG5cbmZ1bmN0aW9uIG9uRW5kTlQoc2VsZikge1xuICBzZWxmLmVuZCgpO1xufVxuXG5mdW5jdGlvbiBmb3JFYWNoKHhzLCBmKSB7XG4gIGZvciAodmFyIGkgPSAwLCBsID0geHMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgZih4c1tpXSwgaSk7XG4gIH1cbn0iLCIvLyBhIHBhc3N0aHJvdWdoIHN0cmVhbS5cbi8vIGJhc2ljYWxseSBqdXN0IHRoZSBtb3N0IG1pbmltYWwgc29ydCBvZiBUcmFuc2Zvcm0gc3RyZWFtLlxuLy8gRXZlcnkgd3JpdHRlbiBjaHVuayBnZXRzIG91dHB1dCBhcy1pcy5cblxuJ3VzZSBzdHJpY3QnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IFBhc3NUaHJvdWdoO1xuXG52YXIgVHJhbnNmb3JtID0gcmVxdWlyZSgnLi9fc3RyZWFtX3RyYW5zZm9ybScpO1xuXG4vKjxyZXBsYWNlbWVudD4qL1xudmFyIHV0aWwgPSByZXF1aXJlKCdjb3JlLXV0aWwtaXMnKTtcbnV0aWwuaW5oZXJpdHMgPSByZXF1aXJlKCdpbmhlcml0cycpO1xuLyo8L3JlcGxhY2VtZW50PiovXG5cbnV0aWwuaW5oZXJpdHMoUGFzc1Rocm91Z2gsIFRyYW5zZm9ybSk7XG5cbmZ1bmN0aW9uIFBhc3NUaHJvdWdoKG9wdGlvbnMpIHtcbiAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIFBhc3NUaHJvdWdoKSkgcmV0dXJuIG5ldyBQYXNzVGhyb3VnaChvcHRpb25zKTtcblxuICBUcmFuc2Zvcm0uY2FsbCh0aGlzLCBvcHRpb25zKTtcbn1cblxuUGFzc1Rocm91Z2gucHJvdG90eXBlLl90cmFuc2Zvcm0gPSBmdW5jdGlvbiAoY2h1bmssIGVuY29kaW5nLCBjYikge1xuICBjYihudWxsLCBjaHVuayk7XG59OyIsIid1c2Ugc3RyaWN0JztcblxubW9kdWxlLmV4cG9ydHMgPSBSZWFkYWJsZTtcblxuLyo8cmVwbGFjZW1lbnQ+Ki9cbnZhciBwcm9jZXNzTmV4dFRpY2sgPSByZXF1aXJlKCdwcm9jZXNzLW5leHRpY2stYXJncycpO1xuLyo8L3JlcGxhY2VtZW50PiovXG5cbi8qPHJlcGxhY2VtZW50PiovXG52YXIgaXNBcnJheSA9IHJlcXVpcmUoJ2lzYXJyYXknKTtcbi8qPC9yZXBsYWNlbWVudD4qL1xuXG4vKjxyZXBsYWNlbWVudD4qL1xudmFyIEJ1ZmZlciA9IHJlcXVpcmUoJ2J1ZmZlcicpLkJ1ZmZlcjtcbi8qPC9yZXBsYWNlbWVudD4qL1xuXG5SZWFkYWJsZS5SZWFkYWJsZVN0YXRlID0gUmVhZGFibGVTdGF0ZTtcblxudmFyIEVFID0gcmVxdWlyZSgnZXZlbnRzJyk7XG5cbi8qPHJlcGxhY2VtZW50PiovXG52YXIgRUVsaXN0ZW5lckNvdW50ID0gZnVuY3Rpb24gKGVtaXR0ZXIsIHR5cGUpIHtcbiAgcmV0dXJuIGVtaXR0ZXIubGlzdGVuZXJzKHR5cGUpLmxlbmd0aDtcbn07XG4vKjwvcmVwbGFjZW1lbnQ+Ki9cblxuLyo8cmVwbGFjZW1lbnQ+Ki9cbnZhciBTdHJlYW07XG4oZnVuY3Rpb24gKCkge1xuICB0cnkge1xuICAgIFN0cmVhbSA9IHJlcXVpcmUoJ3N0JyArICdyZWFtJyk7XG4gIH0gY2F0Y2ggKF8pIHt9IGZpbmFsbHkge1xuICAgIGlmICghU3RyZWFtKSBTdHJlYW0gPSByZXF1aXJlKCdldmVudHMnKS5FdmVudEVtaXR0ZXI7XG4gIH1cbn0pKCk7XG4vKjwvcmVwbGFjZW1lbnQ+Ki9cblxudmFyIEJ1ZmZlciA9IHJlcXVpcmUoJ2J1ZmZlcicpLkJ1ZmZlcjtcblxuLyo8cmVwbGFjZW1lbnQ+Ki9cbnZhciB1dGlsID0gcmVxdWlyZSgnY29yZS11dGlsLWlzJyk7XG51dGlsLmluaGVyaXRzID0gcmVxdWlyZSgnaW5oZXJpdHMnKTtcbi8qPC9yZXBsYWNlbWVudD4qL1xuXG4vKjxyZXBsYWNlbWVudD4qL1xudmFyIGRlYnVnVXRpbCA9IHJlcXVpcmUoJ3V0aWwnKTtcbnZhciBkZWJ1ZyA9IHVuZGVmaW5lZDtcbmlmIChkZWJ1Z1V0aWwgJiYgZGVidWdVdGlsLmRlYnVnbG9nKSB7XG4gIGRlYnVnID0gZGVidWdVdGlsLmRlYnVnbG9nKCdzdHJlYW0nKTtcbn0gZWxzZSB7XG4gIGRlYnVnID0gZnVuY3Rpb24gKCkge307XG59XG4vKjwvcmVwbGFjZW1lbnQ+Ki9cblxudmFyIFN0cmluZ0RlY29kZXI7XG5cbnV0aWwuaW5oZXJpdHMoUmVhZGFibGUsIFN0cmVhbSk7XG5cbnZhciBEdXBsZXg7XG5mdW5jdGlvbiBSZWFkYWJsZVN0YXRlKG9wdGlvbnMsIHN0cmVhbSkge1xuICBEdXBsZXggPSBEdXBsZXggfHwgcmVxdWlyZSgnLi9fc3RyZWFtX2R1cGxleCcpO1xuXG4gIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuXG4gIC8vIG9iamVjdCBzdHJlYW0gZmxhZy4gVXNlZCB0byBtYWtlIHJlYWQobikgaWdub3JlIG4gYW5kIHRvXG4gIC8vIG1ha2UgYWxsIHRoZSBidWZmZXIgbWVyZ2luZyBhbmQgbGVuZ3RoIGNoZWNrcyBnbyBhd2F5XG4gIHRoaXMub2JqZWN0TW9kZSA9ICEhb3B0aW9ucy5vYmplY3RNb2RlO1xuXG4gIGlmIChzdHJlYW0gaW5zdGFuY2VvZiBEdXBsZXgpIHRoaXMub2JqZWN0TW9kZSA9IHRoaXMub2JqZWN0TW9kZSB8fCAhIW9wdGlvbnMucmVhZGFibGVPYmplY3RNb2RlO1xuXG4gIC8vIHRoZSBwb2ludCBhdCB3aGljaCBpdCBzdG9wcyBjYWxsaW5nIF9yZWFkKCkgdG8gZmlsbCB0aGUgYnVmZmVyXG4gIC8vIE5vdGU6IDAgaXMgYSB2YWxpZCB2YWx1ZSwgbWVhbnMgXCJkb24ndCBjYWxsIF9yZWFkIHByZWVtcHRpdmVseSBldmVyXCJcbiAgdmFyIGh3bSA9IG9wdGlvbnMuaGlnaFdhdGVyTWFyaztcbiAgdmFyIGRlZmF1bHRId20gPSB0aGlzLm9iamVjdE1vZGUgPyAxNiA6IDE2ICogMTAyNDtcbiAgdGhpcy5oaWdoV2F0ZXJNYXJrID0gaHdtIHx8IGh3bSA9PT0gMCA/IGh3bSA6IGRlZmF1bHRId207XG5cbiAgLy8gY2FzdCB0byBpbnRzLlxuICB0aGlzLmhpZ2hXYXRlck1hcmsgPSB+IH50aGlzLmhpZ2hXYXRlck1hcms7XG5cbiAgdGhpcy5idWZmZXIgPSBbXTtcbiAgdGhpcy5sZW5ndGggPSAwO1xuICB0aGlzLnBpcGVzID0gbnVsbDtcbiAgdGhpcy5waXBlc0NvdW50ID0gMDtcbiAgdGhpcy5mbG93aW5nID0gbnVsbDtcbiAgdGhpcy5lbmRlZCA9IGZhbHNlO1xuICB0aGlzLmVuZEVtaXR0ZWQgPSBmYWxzZTtcbiAgdGhpcy5yZWFkaW5nID0gZmFsc2U7XG5cbiAgLy8gYSBmbGFnIHRvIGJlIGFibGUgdG8gdGVsbCBpZiB0aGUgb253cml0ZSBjYiBpcyBjYWxsZWQgaW1tZWRpYXRlbHksXG4gIC8vIG9yIG9uIGEgbGF0ZXIgdGljay4gIFdlIHNldCB0aGlzIHRvIHRydWUgYXQgZmlyc3QsIGJlY2F1c2UgYW55XG4gIC8vIGFjdGlvbnMgdGhhdCBzaG91bGRuJ3QgaGFwcGVuIHVudGlsIFwibGF0ZXJcIiBzaG91bGQgZ2VuZXJhbGx5IGFsc29cbiAgLy8gbm90IGhhcHBlbiBiZWZvcmUgdGhlIGZpcnN0IHdyaXRlIGNhbGwuXG4gIHRoaXMuc3luYyA9IHRydWU7XG5cbiAgLy8gd2hlbmV2ZXIgd2UgcmV0dXJuIG51bGwsIHRoZW4gd2Ugc2V0IGEgZmxhZyB0byBzYXlcbiAgLy8gdGhhdCB3ZSdyZSBhd2FpdGluZyBhICdyZWFkYWJsZScgZXZlbnQgZW1pc3Npb24uXG4gIHRoaXMubmVlZFJlYWRhYmxlID0gZmFsc2U7XG4gIHRoaXMuZW1pdHRlZFJlYWRhYmxlID0gZmFsc2U7XG4gIHRoaXMucmVhZGFibGVMaXN0ZW5pbmcgPSBmYWxzZTtcbiAgdGhpcy5yZXN1bWVTY2hlZHVsZWQgPSBmYWxzZTtcblxuICAvLyBDcnlwdG8gaXMga2luZCBvZiBvbGQgYW5kIGNydXN0eS4gIEhpc3RvcmljYWxseSwgaXRzIGRlZmF1bHQgc3RyaW5nXG4gIC8vIGVuY29kaW5nIGlzICdiaW5hcnknIHNvIHdlIGhhdmUgdG8gbWFrZSB0aGlzIGNvbmZpZ3VyYWJsZS5cbiAgLy8gRXZlcnl0aGluZyBlbHNlIGluIHRoZSB1bml2ZXJzZSB1c2VzICd1dGY4JywgdGhvdWdoLlxuICB0aGlzLmRlZmF1bHRFbmNvZGluZyA9IG9wdGlvbnMuZGVmYXVsdEVuY29kaW5nIHx8ICd1dGY4JztcblxuICAvLyB3aGVuIHBpcGluZywgd2Ugb25seSBjYXJlIGFib3V0ICdyZWFkYWJsZScgZXZlbnRzIHRoYXQgaGFwcGVuXG4gIC8vIGFmdGVyIHJlYWQoKWluZyBhbGwgdGhlIGJ5dGVzIGFuZCBub3QgZ2V0dGluZyBhbnkgcHVzaGJhY2suXG4gIHRoaXMucmFuT3V0ID0gZmFsc2U7XG5cbiAgLy8gdGhlIG51bWJlciBvZiB3cml0ZXJzIHRoYXQgYXJlIGF3YWl0aW5nIGEgZHJhaW4gZXZlbnQgaW4gLnBpcGUoKXNcbiAgdGhpcy5hd2FpdERyYWluID0gMDtcblxuICAvLyBpZiB0cnVlLCBhIG1heWJlUmVhZE1vcmUgaGFzIGJlZW4gc2NoZWR1bGVkXG4gIHRoaXMucmVhZGluZ01vcmUgPSBmYWxzZTtcblxuICB0aGlzLmRlY29kZXIgPSBudWxsO1xuICB0aGlzLmVuY29kaW5nID0gbnVsbDtcbiAgaWYgKG9wdGlvbnMuZW5jb2RpbmcpIHtcbiAgICBpZiAoIVN0cmluZ0RlY29kZXIpIFN0cmluZ0RlY29kZXIgPSByZXF1aXJlKCdzdHJpbmdfZGVjb2Rlci8nKS5TdHJpbmdEZWNvZGVyO1xuICAgIHRoaXMuZGVjb2RlciA9IG5ldyBTdHJpbmdEZWNvZGVyKG9wdGlvbnMuZW5jb2RpbmcpO1xuICAgIHRoaXMuZW5jb2RpbmcgPSBvcHRpb25zLmVuY29kaW5nO1xuICB9XG59XG5cbnZhciBEdXBsZXg7XG5mdW5jdGlvbiBSZWFkYWJsZShvcHRpb25zKSB7XG4gIER1cGxleCA9IER1cGxleCB8fCByZXF1aXJlKCcuL19zdHJlYW1fZHVwbGV4Jyk7XG5cbiAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIFJlYWRhYmxlKSkgcmV0dXJuIG5ldyBSZWFkYWJsZShvcHRpb25zKTtcblxuICB0aGlzLl9yZWFkYWJsZVN0YXRlID0gbmV3IFJlYWRhYmxlU3RhdGUob3B0aW9ucywgdGhpcyk7XG5cbiAgLy8gbGVnYWN5XG4gIHRoaXMucmVhZGFibGUgPSB0cnVlO1xuXG4gIGlmIChvcHRpb25zICYmIHR5cGVvZiBvcHRpb25zLnJlYWQgPT09ICdmdW5jdGlvbicpIHRoaXMuX3JlYWQgPSBvcHRpb25zLnJlYWQ7XG5cbiAgU3RyZWFtLmNhbGwodGhpcyk7XG59XG5cbi8vIE1hbnVhbGx5IHNob3ZlIHNvbWV0aGluZyBpbnRvIHRoZSByZWFkKCkgYnVmZmVyLlxuLy8gVGhpcyByZXR1cm5zIHRydWUgaWYgdGhlIGhpZ2hXYXRlck1hcmsgaGFzIG5vdCBiZWVuIGhpdCB5ZXQsXG4vLyBzaW1pbGFyIHRvIGhvdyBXcml0YWJsZS53cml0ZSgpIHJldHVybnMgdHJ1ZSBpZiB5b3Ugc2hvdWxkXG4vLyB3cml0ZSgpIHNvbWUgbW9yZS5cblJlYWRhYmxlLnByb3RvdHlwZS5wdXNoID0gZnVuY3Rpb24gKGNodW5rLCBlbmNvZGluZykge1xuICB2YXIgc3RhdGUgPSB0aGlzLl9yZWFkYWJsZVN0YXRlO1xuXG4gIGlmICghc3RhdGUub2JqZWN0TW9kZSAmJiB0eXBlb2YgY2h1bmsgPT09ICdzdHJpbmcnKSB7XG4gICAgZW5jb2RpbmcgPSBlbmNvZGluZyB8fCBzdGF0ZS5kZWZhdWx0RW5jb2Rpbmc7XG4gICAgaWYgKGVuY29kaW5nICE9PSBzdGF0ZS5lbmNvZGluZykge1xuICAgICAgY2h1bmsgPSBuZXcgQnVmZmVyKGNodW5rLCBlbmNvZGluZyk7XG4gICAgICBlbmNvZGluZyA9ICcnO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiByZWFkYWJsZUFkZENodW5rKHRoaXMsIHN0YXRlLCBjaHVuaywgZW5jb2RpbmcsIGZhbHNlKTtcbn07XG5cbi8vIFVuc2hpZnQgc2hvdWxkICphbHdheXMqIGJlIHNvbWV0aGluZyBkaXJlY3RseSBvdXQgb2YgcmVhZCgpXG5SZWFkYWJsZS5wcm90b3R5cGUudW5zaGlmdCA9IGZ1bmN0aW9uIChjaHVuaykge1xuICB2YXIgc3RhdGUgPSB0aGlzLl9yZWFkYWJsZVN0YXRlO1xuICByZXR1cm4gcmVhZGFibGVBZGRDaHVuayh0aGlzLCBzdGF0ZSwgY2h1bmssICcnLCB0cnVlKTtcbn07XG5cblJlYWRhYmxlLnByb3RvdHlwZS5pc1BhdXNlZCA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHRoaXMuX3JlYWRhYmxlU3RhdGUuZmxvd2luZyA9PT0gZmFsc2U7XG59O1xuXG5mdW5jdGlvbiByZWFkYWJsZUFkZENodW5rKHN0cmVhbSwgc3RhdGUsIGNodW5rLCBlbmNvZGluZywgYWRkVG9Gcm9udCkge1xuICB2YXIgZXIgPSBjaHVua0ludmFsaWQoc3RhdGUsIGNodW5rKTtcbiAgaWYgKGVyKSB7XG4gICAgc3RyZWFtLmVtaXQoJ2Vycm9yJywgZXIpO1xuICB9IGVsc2UgaWYgKGNodW5rID09PSBudWxsKSB7XG4gICAgc3RhdGUucmVhZGluZyA9IGZhbHNlO1xuICAgIG9uRW9mQ2h1bmsoc3RyZWFtLCBzdGF0ZSk7XG4gIH0gZWxzZSBpZiAoc3RhdGUub2JqZWN0TW9kZSB8fCBjaHVuayAmJiBjaHVuay5sZW5ndGggPiAwKSB7XG4gICAgaWYgKHN0YXRlLmVuZGVkICYmICFhZGRUb0Zyb250KSB7XG4gICAgICB2YXIgZSA9IG5ldyBFcnJvcignc3RyZWFtLnB1c2goKSBhZnRlciBFT0YnKTtcbiAgICAgIHN0cmVhbS5lbWl0KCdlcnJvcicsIGUpO1xuICAgIH0gZWxzZSBpZiAoc3RhdGUuZW5kRW1pdHRlZCAmJiBhZGRUb0Zyb250KSB7XG4gICAgICB2YXIgZSA9IG5ldyBFcnJvcignc3RyZWFtLnVuc2hpZnQoKSBhZnRlciBlbmQgZXZlbnQnKTtcbiAgICAgIHN0cmVhbS5lbWl0KCdlcnJvcicsIGUpO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgc2tpcEFkZDtcbiAgICAgIGlmIChzdGF0ZS5kZWNvZGVyICYmICFhZGRUb0Zyb250ICYmICFlbmNvZGluZykge1xuICAgICAgICBjaHVuayA9IHN0YXRlLmRlY29kZXIud3JpdGUoY2h1bmspO1xuICAgICAgICBza2lwQWRkID0gIXN0YXRlLm9iamVjdE1vZGUgJiYgY2h1bmsubGVuZ3RoID09PSAwO1xuICAgICAgfVxuXG4gICAgICBpZiAoIWFkZFRvRnJvbnQpIHN0YXRlLnJlYWRpbmcgPSBmYWxzZTtcblxuICAgICAgLy8gRG9uJ3QgYWRkIHRvIHRoZSBidWZmZXIgaWYgd2UndmUgZGVjb2RlZCB0byBhbiBlbXB0eSBzdHJpbmcgY2h1bmsgYW5kXG4gICAgICAvLyB3ZSdyZSBub3QgaW4gb2JqZWN0IG1vZGVcbiAgICAgIGlmICghc2tpcEFkZCkge1xuICAgICAgICAvLyBpZiB3ZSB3YW50IHRoZSBkYXRhIG5vdywganVzdCBlbWl0IGl0LlxuICAgICAgICBpZiAoc3RhdGUuZmxvd2luZyAmJiBzdGF0ZS5sZW5ndGggPT09IDAgJiYgIXN0YXRlLnN5bmMpIHtcbiAgICAgICAgICBzdHJlYW0uZW1pdCgnZGF0YScsIGNodW5rKTtcbiAgICAgICAgICBzdHJlYW0ucmVhZCgwKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyB1cGRhdGUgdGhlIGJ1ZmZlciBpbmZvLlxuICAgICAgICAgIHN0YXRlLmxlbmd0aCArPSBzdGF0ZS5vYmplY3RNb2RlID8gMSA6IGNodW5rLmxlbmd0aDtcbiAgICAgICAgICBpZiAoYWRkVG9Gcm9udCkgc3RhdGUuYnVmZmVyLnVuc2hpZnQoY2h1bmspO2Vsc2Ugc3RhdGUuYnVmZmVyLnB1c2goY2h1bmspO1xuXG4gICAgICAgICAgaWYgKHN0YXRlLm5lZWRSZWFkYWJsZSkgZW1pdFJlYWRhYmxlKHN0cmVhbSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgbWF5YmVSZWFkTW9yZShzdHJlYW0sIHN0YXRlKTtcbiAgICB9XG4gIH0gZWxzZSBpZiAoIWFkZFRvRnJvbnQpIHtcbiAgICBzdGF0ZS5yZWFkaW5nID0gZmFsc2U7XG4gIH1cblxuICByZXR1cm4gbmVlZE1vcmVEYXRhKHN0YXRlKTtcbn1cblxuLy8gaWYgaXQncyBwYXN0IHRoZSBoaWdoIHdhdGVyIG1hcmssIHdlIGNhbiBwdXNoIGluIHNvbWUgbW9yZS5cbi8vIEFsc28sIGlmIHdlIGhhdmUgbm8gZGF0YSB5ZXQsIHdlIGNhbiBzdGFuZCBzb21lXG4vLyBtb3JlIGJ5dGVzLiAgVGhpcyBpcyB0byB3b3JrIGFyb3VuZCBjYXNlcyB3aGVyZSBod209MCxcbi8vIHN1Y2ggYXMgdGhlIHJlcGwuICBBbHNvLCBpZiB0aGUgcHVzaCgpIHRyaWdnZXJlZCBhXG4vLyByZWFkYWJsZSBldmVudCwgYW5kIHRoZSB1c2VyIGNhbGxlZCByZWFkKGxhcmdlTnVtYmVyKSBzdWNoIHRoYXRcbi8vIG5lZWRSZWFkYWJsZSB3YXMgc2V0LCB0aGVuIHdlIG91Z2h0IHRvIHB1c2ggbW9yZSwgc28gdGhhdCBhbm90aGVyXG4vLyAncmVhZGFibGUnIGV2ZW50IHdpbGwgYmUgdHJpZ2dlcmVkLlxuZnVuY3Rpb24gbmVlZE1vcmVEYXRhKHN0YXRlKSB7XG4gIHJldHVybiAhc3RhdGUuZW5kZWQgJiYgKHN0YXRlLm5lZWRSZWFkYWJsZSB8fCBzdGF0ZS5sZW5ndGggPCBzdGF0ZS5oaWdoV2F0ZXJNYXJrIHx8IHN0YXRlLmxlbmd0aCA9PT0gMCk7XG59XG5cbi8vIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LlxuUmVhZGFibGUucHJvdG90eXBlLnNldEVuY29kaW5nID0gZnVuY3Rpb24gKGVuYykge1xuICBpZiAoIVN0cmluZ0RlY29kZXIpIFN0cmluZ0RlY29kZXIgPSByZXF1aXJlKCdzdHJpbmdfZGVjb2Rlci8nKS5TdHJpbmdEZWNvZGVyO1xuICB0aGlzLl9yZWFkYWJsZVN0YXRlLmRlY29kZXIgPSBuZXcgU3RyaW5nRGVjb2RlcihlbmMpO1xuICB0aGlzLl9yZWFkYWJsZVN0YXRlLmVuY29kaW5nID0gZW5jO1xuICByZXR1cm4gdGhpcztcbn07XG5cbi8vIERvbid0IHJhaXNlIHRoZSBod20gPiA4TUJcbnZhciBNQVhfSFdNID0gMHg4MDAwMDA7XG5mdW5jdGlvbiBjb21wdXRlTmV3SGlnaFdhdGVyTWFyayhuKSB7XG4gIGlmIChuID49IE1BWF9IV00pIHtcbiAgICBuID0gTUFYX0hXTTtcbiAgfSBlbHNlIHtcbiAgICAvLyBHZXQgdGhlIG5leHQgaGlnaGVzdCBwb3dlciBvZiAyXG4gICAgbi0tO1xuICAgIG4gfD0gbiA+Pj4gMTtcbiAgICBuIHw9IG4gPj4+IDI7XG4gICAgbiB8PSBuID4+PiA0O1xuICAgIG4gfD0gbiA+Pj4gODtcbiAgICBuIHw9IG4gPj4+IDE2O1xuICAgIG4rKztcbiAgfVxuICByZXR1cm4gbjtcbn1cblxuZnVuY3Rpb24gaG93TXVjaFRvUmVhZChuLCBzdGF0ZSkge1xuICBpZiAoc3RhdGUubGVuZ3RoID09PSAwICYmIHN0YXRlLmVuZGVkKSByZXR1cm4gMDtcblxuICBpZiAoc3RhdGUub2JqZWN0TW9kZSkgcmV0dXJuIG4gPT09IDAgPyAwIDogMTtcblxuICBpZiAobiA9PT0gbnVsbCB8fCBpc05hTihuKSkge1xuICAgIC8vIG9ubHkgZmxvdyBvbmUgYnVmZmVyIGF0IGEgdGltZVxuICAgIGlmIChzdGF0ZS5mbG93aW5nICYmIHN0YXRlLmJ1ZmZlci5sZW5ndGgpIHJldHVybiBzdGF0ZS5idWZmZXJbMF0ubGVuZ3RoO2Vsc2UgcmV0dXJuIHN0YXRlLmxlbmd0aDtcbiAgfVxuXG4gIGlmIChuIDw9IDApIHJldHVybiAwO1xuXG4gIC8vIElmIHdlJ3JlIGFza2luZyBmb3IgbW9yZSB0aGFuIHRoZSB0YXJnZXQgYnVmZmVyIGxldmVsLFxuICAvLyB0aGVuIHJhaXNlIHRoZSB3YXRlciBtYXJrLiAgQnVtcCB1cCB0byB0aGUgbmV4dCBoaWdoZXN0XG4gIC8vIHBvd2VyIG9mIDIsIHRvIHByZXZlbnQgaW5jcmVhc2luZyBpdCBleGNlc3NpdmVseSBpbiB0aW55XG4gIC8vIGFtb3VudHMuXG4gIGlmIChuID4gc3RhdGUuaGlnaFdhdGVyTWFyaykgc3RhdGUuaGlnaFdhdGVyTWFyayA9IGNvbXB1dGVOZXdIaWdoV2F0ZXJNYXJrKG4pO1xuXG4gIC8vIGRvbid0IGhhdmUgdGhhdCBtdWNoLiAgcmV0dXJuIG51bGwsIHVubGVzcyB3ZSd2ZSBlbmRlZC5cbiAgaWYgKG4gPiBzdGF0ZS5sZW5ndGgpIHtcbiAgICBpZiAoIXN0YXRlLmVuZGVkKSB7XG4gICAgICBzdGF0ZS5uZWVkUmVhZGFibGUgPSB0cnVlO1xuICAgICAgcmV0dXJuIDA7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBzdGF0ZS5sZW5ndGg7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG47XG59XG5cbi8vIHlvdSBjYW4gb3ZlcnJpZGUgZWl0aGVyIHRoaXMgbWV0aG9kLCBvciB0aGUgYXN5bmMgX3JlYWQobikgYmVsb3cuXG5SZWFkYWJsZS5wcm90b3R5cGUucmVhZCA9IGZ1bmN0aW9uIChuKSB7XG4gIGRlYnVnKCdyZWFkJywgbik7XG4gIHZhciBzdGF0ZSA9IHRoaXMuX3JlYWRhYmxlU3RhdGU7XG4gIHZhciBuT3JpZyA9IG47XG5cbiAgaWYgKHR5cGVvZiBuICE9PSAnbnVtYmVyJyB8fCBuID4gMCkgc3RhdGUuZW1pdHRlZFJlYWRhYmxlID0gZmFsc2U7XG5cbiAgLy8gaWYgd2UncmUgZG9pbmcgcmVhZCgwKSB0byB0cmlnZ2VyIGEgcmVhZGFibGUgZXZlbnQsIGJ1dCB3ZVxuICAvLyBhbHJlYWR5IGhhdmUgYSBidW5jaCBvZiBkYXRhIGluIHRoZSBidWZmZXIsIHRoZW4ganVzdCB0cmlnZ2VyXG4gIC8vIHRoZSAncmVhZGFibGUnIGV2ZW50IGFuZCBtb3ZlIG9uLlxuICBpZiAobiA9PT0gMCAmJiBzdGF0ZS5uZWVkUmVhZGFibGUgJiYgKHN0YXRlLmxlbmd0aCA+PSBzdGF0ZS5oaWdoV2F0ZXJNYXJrIHx8IHN0YXRlLmVuZGVkKSkge1xuICAgIGRlYnVnKCdyZWFkOiBlbWl0UmVhZGFibGUnLCBzdGF0ZS5sZW5ndGgsIHN0YXRlLmVuZGVkKTtcbiAgICBpZiAoc3RhdGUubGVuZ3RoID09PSAwICYmIHN0YXRlLmVuZGVkKSBlbmRSZWFkYWJsZSh0aGlzKTtlbHNlIGVtaXRSZWFkYWJsZSh0aGlzKTtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIG4gPSBob3dNdWNoVG9SZWFkKG4sIHN0YXRlKTtcblxuICAvLyBpZiB3ZSd2ZSBlbmRlZCwgYW5kIHdlJ3JlIG5vdyBjbGVhciwgdGhlbiBmaW5pc2ggaXQgdXAuXG4gIGlmIChuID09PSAwICYmIHN0YXRlLmVuZGVkKSB7XG4gICAgaWYgKHN0YXRlLmxlbmd0aCA9PT0gMCkgZW5kUmVhZGFibGUodGhpcyk7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICAvLyBBbGwgdGhlIGFjdHVhbCBjaHVuayBnZW5lcmF0aW9uIGxvZ2ljIG5lZWRzIHRvIGJlXG4gIC8vICpiZWxvdyogdGhlIGNhbGwgdG8gX3JlYWQuICBUaGUgcmVhc29uIGlzIHRoYXQgaW4gY2VydGFpblxuICAvLyBzeW50aGV0aWMgc3RyZWFtIGNhc2VzLCBzdWNoIGFzIHBhc3N0aHJvdWdoIHN0cmVhbXMsIF9yZWFkXG4gIC8vIG1heSBiZSBhIGNvbXBsZXRlbHkgc3luY2hyb25vdXMgb3BlcmF0aW9uIHdoaWNoIG1heSBjaGFuZ2VcbiAgLy8gdGhlIHN0YXRlIG9mIHRoZSByZWFkIGJ1ZmZlciwgcHJvdmlkaW5nIGVub3VnaCBkYXRhIHdoZW5cbiAgLy8gYmVmb3JlIHRoZXJlIHdhcyAqbm90KiBlbm91Z2guXG4gIC8vXG4gIC8vIFNvLCB0aGUgc3RlcHMgYXJlOlxuICAvLyAxLiBGaWd1cmUgb3V0IHdoYXQgdGhlIHN0YXRlIG9mIHRoaW5ncyB3aWxsIGJlIGFmdGVyIHdlIGRvXG4gIC8vIGEgcmVhZCBmcm9tIHRoZSBidWZmZXIuXG4gIC8vXG4gIC8vIDIuIElmIHRoYXQgcmVzdWx0aW5nIHN0YXRlIHdpbGwgdHJpZ2dlciBhIF9yZWFkLCB0aGVuIGNhbGwgX3JlYWQuXG4gIC8vIE5vdGUgdGhhdCB0aGlzIG1heSBiZSBhc3luY2hyb25vdXMsIG9yIHN5bmNocm9ub3VzLiAgWWVzLCBpdCBpc1xuICAvLyBkZWVwbHkgdWdseSB0byB3cml0ZSBBUElzIHRoaXMgd2F5LCBidXQgdGhhdCBzdGlsbCBkb2Vzbid0IG1lYW5cbiAgLy8gdGhhdCB0aGUgUmVhZGFibGUgY2xhc3Mgc2hvdWxkIGJlaGF2ZSBpbXByb3Blcmx5LCBhcyBzdHJlYW1zIGFyZVxuICAvLyBkZXNpZ25lZCB0byBiZSBzeW5jL2FzeW5jIGFnbm9zdGljLlxuICAvLyBUYWtlIG5vdGUgaWYgdGhlIF9yZWFkIGNhbGwgaXMgc3luYyBvciBhc3luYyAoaWUsIGlmIHRoZSByZWFkIGNhbGxcbiAgLy8gaGFzIHJldHVybmVkIHlldCksIHNvIHRoYXQgd2Uga25vdyB3aGV0aGVyIG9yIG5vdCBpdCdzIHNhZmUgdG8gZW1pdFxuICAvLyAncmVhZGFibGUnIGV0Yy5cbiAgLy9cbiAgLy8gMy4gQWN0dWFsbHkgcHVsbCB0aGUgcmVxdWVzdGVkIGNodW5rcyBvdXQgb2YgdGhlIGJ1ZmZlciBhbmQgcmV0dXJuLlxuXG4gIC8vIGlmIHdlIG5lZWQgYSByZWFkYWJsZSBldmVudCwgdGhlbiB3ZSBuZWVkIHRvIGRvIHNvbWUgcmVhZGluZy5cbiAgdmFyIGRvUmVhZCA9IHN0YXRlLm5lZWRSZWFkYWJsZTtcbiAgZGVidWcoJ25lZWQgcmVhZGFibGUnLCBkb1JlYWQpO1xuXG4gIC8vIGlmIHdlIGN1cnJlbnRseSBoYXZlIGxlc3MgdGhhbiB0aGUgaGlnaFdhdGVyTWFyaywgdGhlbiBhbHNvIHJlYWQgc29tZVxuICBpZiAoc3RhdGUubGVuZ3RoID09PSAwIHx8IHN0YXRlLmxlbmd0aCAtIG4gPCBzdGF0ZS5oaWdoV2F0ZXJNYXJrKSB7XG4gICAgZG9SZWFkID0gdHJ1ZTtcbiAgICBkZWJ1ZygnbGVuZ3RoIGxlc3MgdGhhbiB3YXRlcm1hcmsnLCBkb1JlYWQpO1xuICB9XG5cbiAgLy8gaG93ZXZlciwgaWYgd2UndmUgZW5kZWQsIHRoZW4gdGhlcmUncyBubyBwb2ludCwgYW5kIGlmIHdlJ3JlIGFscmVhZHlcbiAgLy8gcmVhZGluZywgdGhlbiBpdCdzIHVubmVjZXNzYXJ5LlxuICBpZiAoc3RhdGUuZW5kZWQgfHwgc3RhdGUucmVhZGluZykge1xuICAgIGRvUmVhZCA9IGZhbHNlO1xuICAgIGRlYnVnKCdyZWFkaW5nIG9yIGVuZGVkJywgZG9SZWFkKTtcbiAgfVxuXG4gIGlmIChkb1JlYWQpIHtcbiAgICBkZWJ1ZygnZG8gcmVhZCcpO1xuICAgIHN0YXRlLnJlYWRpbmcgPSB0cnVlO1xuICAgIHN0YXRlLnN5bmMgPSB0cnVlO1xuICAgIC8vIGlmIHRoZSBsZW5ndGggaXMgY3VycmVudGx5IHplcm8sIHRoZW4gd2UgKm5lZWQqIGEgcmVhZGFibGUgZXZlbnQuXG4gICAgaWYgKHN0YXRlLmxlbmd0aCA9PT0gMCkgc3RhdGUubmVlZFJlYWRhYmxlID0gdHJ1ZTtcbiAgICAvLyBjYWxsIGludGVybmFsIHJlYWQgbWV0aG9kXG4gICAgdGhpcy5fcmVhZChzdGF0ZS5oaWdoV2F0ZXJNYXJrKTtcbiAgICBzdGF0ZS5zeW5jID0gZmFsc2U7XG4gIH1cblxuICAvLyBJZiBfcmVhZCBwdXNoZWQgZGF0YSBzeW5jaHJvbm91c2x5LCB0aGVuIGByZWFkaW5nYCB3aWxsIGJlIGZhbHNlLFxuICAvLyBhbmQgd2UgbmVlZCB0byByZS1ldmFsdWF0ZSBob3cgbXVjaCBkYXRhIHdlIGNhbiByZXR1cm4gdG8gdGhlIHVzZXIuXG4gIGlmIChkb1JlYWQgJiYgIXN0YXRlLnJlYWRpbmcpIG4gPSBob3dNdWNoVG9SZWFkKG5PcmlnLCBzdGF0ZSk7XG5cbiAgdmFyIHJldDtcbiAgaWYgKG4gPiAwKSByZXQgPSBmcm9tTGlzdChuLCBzdGF0ZSk7ZWxzZSByZXQgPSBudWxsO1xuXG4gIGlmIChyZXQgPT09IG51bGwpIHtcbiAgICBzdGF0ZS5uZWVkUmVhZGFibGUgPSB0cnVlO1xuICAgIG4gPSAwO1xuICB9XG5cbiAgc3RhdGUubGVuZ3RoIC09IG47XG5cbiAgLy8gSWYgd2UgaGF2ZSBub3RoaW5nIGluIHRoZSBidWZmZXIsIHRoZW4gd2Ugd2FudCB0byBrbm93XG4gIC8vIGFzIHNvb24gYXMgd2UgKmRvKiBnZXQgc29tZXRoaW5nIGludG8gdGhlIGJ1ZmZlci5cbiAgaWYgKHN0YXRlLmxlbmd0aCA9PT0gMCAmJiAhc3RhdGUuZW5kZWQpIHN0YXRlLm5lZWRSZWFkYWJsZSA9IHRydWU7XG5cbiAgLy8gSWYgd2UgdHJpZWQgdG8gcmVhZCgpIHBhc3QgdGhlIEVPRiwgdGhlbiBlbWl0IGVuZCBvbiB0aGUgbmV4dCB0aWNrLlxuICBpZiAobk9yaWcgIT09IG4gJiYgc3RhdGUuZW5kZWQgJiYgc3RhdGUubGVuZ3RoID09PSAwKSBlbmRSZWFkYWJsZSh0aGlzKTtcblxuICBpZiAocmV0ICE9PSBudWxsKSB0aGlzLmVtaXQoJ2RhdGEnLCByZXQpO1xuXG4gIHJldHVybiByZXQ7XG59O1xuXG5mdW5jdGlvbiBjaHVua0ludmFsaWQoc3RhdGUsIGNodW5rKSB7XG4gIHZhciBlciA9IG51bGw7XG4gIGlmICghQnVmZmVyLmlzQnVmZmVyKGNodW5rKSAmJiB0eXBlb2YgY2h1bmsgIT09ICdzdHJpbmcnICYmIGNodW5rICE9PSBudWxsICYmIGNodW5rICE9PSB1bmRlZmluZWQgJiYgIXN0YXRlLm9iamVjdE1vZGUpIHtcbiAgICBlciA9IG5ldyBUeXBlRXJyb3IoJ0ludmFsaWQgbm9uLXN0cmluZy9idWZmZXIgY2h1bmsnKTtcbiAgfVxuICByZXR1cm4gZXI7XG59XG5cbmZ1bmN0aW9uIG9uRW9mQ2h1bmsoc3RyZWFtLCBzdGF0ZSkge1xuICBpZiAoc3RhdGUuZW5kZWQpIHJldHVybjtcbiAgaWYgKHN0YXRlLmRlY29kZXIpIHtcbiAgICB2YXIgY2h1bmsgPSBzdGF0ZS5kZWNvZGVyLmVuZCgpO1xuICAgIGlmIChjaHVuayAmJiBjaHVuay5sZW5ndGgpIHtcbiAgICAgIHN0YXRlLmJ1ZmZlci5wdXNoKGNodW5rKTtcbiAgICAgIHN0YXRlLmxlbmd0aCArPSBzdGF0ZS5vYmplY3RNb2RlID8gMSA6IGNodW5rLmxlbmd0aDtcbiAgICB9XG4gIH1cbiAgc3RhdGUuZW5kZWQgPSB0cnVlO1xuXG4gIC8vIGVtaXQgJ3JlYWRhYmxlJyBub3cgdG8gbWFrZSBzdXJlIGl0IGdldHMgcGlja2VkIHVwLlxuICBlbWl0UmVhZGFibGUoc3RyZWFtKTtcbn1cblxuLy8gRG9uJ3QgZW1pdCByZWFkYWJsZSByaWdodCBhd2F5IGluIHN5bmMgbW9kZSwgYmVjYXVzZSB0aGlzIGNhbiB0cmlnZ2VyXG4vLyBhbm90aGVyIHJlYWQoKSBjYWxsID0+IHN0YWNrIG92ZXJmbG93LiAgVGhpcyB3YXksIGl0IG1pZ2h0IHRyaWdnZXJcbi8vIGEgbmV4dFRpY2sgcmVjdXJzaW9uIHdhcm5pbmcsIGJ1dCB0aGF0J3Mgbm90IHNvIGJhZC5cbmZ1bmN0aW9uIGVtaXRSZWFkYWJsZShzdHJlYW0pIHtcbiAgdmFyIHN0YXRlID0gc3RyZWFtLl9yZWFkYWJsZVN0YXRlO1xuICBzdGF0ZS5uZWVkUmVhZGFibGUgPSBmYWxzZTtcbiAgaWYgKCFzdGF0ZS5lbWl0dGVkUmVhZGFibGUpIHtcbiAgICBkZWJ1ZygnZW1pdFJlYWRhYmxlJywgc3RhdGUuZmxvd2luZyk7XG4gICAgc3RhdGUuZW1pdHRlZFJlYWRhYmxlID0gdHJ1ZTtcbiAgICBpZiAoc3RhdGUuc3luYykgcHJvY2Vzc05leHRUaWNrKGVtaXRSZWFkYWJsZV8sIHN0cmVhbSk7ZWxzZSBlbWl0UmVhZGFibGVfKHN0cmVhbSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gZW1pdFJlYWRhYmxlXyhzdHJlYW0pIHtcbiAgZGVidWcoJ2VtaXQgcmVhZGFibGUnKTtcbiAgc3RyZWFtLmVtaXQoJ3JlYWRhYmxlJyk7XG4gIGZsb3coc3RyZWFtKTtcbn1cblxuLy8gYXQgdGhpcyBwb2ludCwgdGhlIHVzZXIgaGFzIHByZXN1bWFibHkgc2VlbiB0aGUgJ3JlYWRhYmxlJyBldmVudCxcbi8vIGFuZCBjYWxsZWQgcmVhZCgpIHRvIGNvbnN1bWUgc29tZSBkYXRhLiAgdGhhdCBtYXkgaGF2ZSB0cmlnZ2VyZWRcbi8vIGluIHR1cm4gYW5vdGhlciBfcmVhZChuKSBjYWxsLCBpbiB3aGljaCBjYXNlIHJlYWRpbmcgPSB0cnVlIGlmXG4vLyBpdCdzIGluIHByb2dyZXNzLlxuLy8gSG93ZXZlciwgaWYgd2UncmUgbm90IGVuZGVkLCBvciByZWFkaW5nLCBhbmQgdGhlIGxlbmd0aCA8IGh3bSxcbi8vIHRoZW4gZ28gYWhlYWQgYW5kIHRyeSB0byByZWFkIHNvbWUgbW9yZSBwcmVlbXB0aXZlbHkuXG5mdW5jdGlvbiBtYXliZVJlYWRNb3JlKHN0cmVhbSwgc3RhdGUpIHtcbiAgaWYgKCFzdGF0ZS5yZWFkaW5nTW9yZSkge1xuICAgIHN0YXRlLnJlYWRpbmdNb3JlID0gdHJ1ZTtcbiAgICBwcm9jZXNzTmV4dFRpY2sobWF5YmVSZWFkTW9yZV8sIHN0cmVhbSwgc3RhdGUpO1xuICB9XG59XG5cbmZ1bmN0aW9uIG1heWJlUmVhZE1vcmVfKHN0cmVhbSwgc3RhdGUpIHtcbiAgdmFyIGxlbiA9IHN0YXRlLmxlbmd0aDtcbiAgd2hpbGUgKCFzdGF0ZS5yZWFkaW5nICYmICFzdGF0ZS5mbG93aW5nICYmICFzdGF0ZS5lbmRlZCAmJiBzdGF0ZS5sZW5ndGggPCBzdGF0ZS5oaWdoV2F0ZXJNYXJrKSB7XG4gICAgZGVidWcoJ21heWJlUmVhZE1vcmUgcmVhZCAwJyk7XG4gICAgc3RyZWFtLnJlYWQoMCk7XG4gICAgaWYgKGxlbiA9PT0gc3RhdGUubGVuZ3RoKVxuICAgICAgLy8gZGlkbid0IGdldCBhbnkgZGF0YSwgc3RvcCBzcGlubmluZy5cbiAgICAgIGJyZWFrO2Vsc2UgbGVuID0gc3RhdGUubGVuZ3RoO1xuICB9XG4gIHN0YXRlLnJlYWRpbmdNb3JlID0gZmFsc2U7XG59XG5cbi8vIGFic3RyYWN0IG1ldGhvZC4gIHRvIGJlIG92ZXJyaWRkZW4gaW4gc3BlY2lmaWMgaW1wbGVtZW50YXRpb24gY2xhc3Nlcy5cbi8vIGNhbGwgY2IoZXIsIGRhdGEpIHdoZXJlIGRhdGEgaXMgPD0gbiBpbiBsZW5ndGguXG4vLyBmb3IgdmlydHVhbCAobm9uLXN0cmluZywgbm9uLWJ1ZmZlcikgc3RyZWFtcywgXCJsZW5ndGhcIiBpcyBzb21ld2hhdFxuLy8gYXJiaXRyYXJ5LCBhbmQgcGVyaGFwcyBub3QgdmVyeSBtZWFuaW5nZnVsLlxuUmVhZGFibGUucHJvdG90eXBlLl9yZWFkID0gZnVuY3Rpb24gKG4pIHtcbiAgdGhpcy5lbWl0KCdlcnJvcicsIG5ldyBFcnJvcignbm90IGltcGxlbWVudGVkJykpO1xufTtcblxuUmVhZGFibGUucHJvdG90eXBlLnBpcGUgPSBmdW5jdGlvbiAoZGVzdCwgcGlwZU9wdHMpIHtcbiAgdmFyIHNyYyA9IHRoaXM7XG4gIHZhciBzdGF0ZSA9IHRoaXMuX3JlYWRhYmxlU3RhdGU7XG5cbiAgc3dpdGNoIChzdGF0ZS5waXBlc0NvdW50KSB7XG4gICAgY2FzZSAwOlxuICAgICAgc3RhdGUucGlwZXMgPSBkZXN0O1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAxOlxuICAgICAgc3RhdGUucGlwZXMgPSBbc3RhdGUucGlwZXMsIGRlc3RdO1xuICAgICAgYnJlYWs7XG4gICAgZGVmYXVsdDpcbiAgICAgIHN0YXRlLnBpcGVzLnB1c2goZGVzdCk7XG4gICAgICBicmVhaztcbiAgfVxuICBzdGF0ZS5waXBlc0NvdW50ICs9IDE7XG4gIGRlYnVnKCdwaXBlIGNvdW50PSVkIG9wdHM9JWonLCBzdGF0ZS5waXBlc0NvdW50LCBwaXBlT3B0cyk7XG5cbiAgdmFyIGRvRW5kID0gKCFwaXBlT3B0cyB8fCBwaXBlT3B0cy5lbmQgIT09IGZhbHNlKSAmJiBkZXN0ICE9PSBwcm9jZXNzLnN0ZG91dCAmJiBkZXN0ICE9PSBwcm9jZXNzLnN0ZGVycjtcblxuICB2YXIgZW5kRm4gPSBkb0VuZCA/IG9uZW5kIDogY2xlYW51cDtcbiAgaWYgKHN0YXRlLmVuZEVtaXR0ZWQpIHByb2Nlc3NOZXh0VGljayhlbmRGbik7ZWxzZSBzcmMub25jZSgnZW5kJywgZW5kRm4pO1xuXG4gIGRlc3Qub24oJ3VucGlwZScsIG9udW5waXBlKTtcbiAgZnVuY3Rpb24gb251bnBpcGUocmVhZGFibGUpIHtcbiAgICBkZWJ1Zygnb251bnBpcGUnKTtcbiAgICBpZiAocmVhZGFibGUgPT09IHNyYykge1xuICAgICAgY2xlYW51cCgpO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIG9uZW5kKCkge1xuICAgIGRlYnVnKCdvbmVuZCcpO1xuICAgIGRlc3QuZW5kKCk7XG4gIH1cblxuICAvLyB3aGVuIHRoZSBkZXN0IGRyYWlucywgaXQgcmVkdWNlcyB0aGUgYXdhaXREcmFpbiBjb3VudGVyXG4gIC8vIG9uIHRoZSBzb3VyY2UuICBUaGlzIHdvdWxkIGJlIG1vcmUgZWxlZ2FudCB3aXRoIGEgLm9uY2UoKVxuICAvLyBoYW5kbGVyIGluIGZsb3coKSwgYnV0IGFkZGluZyBhbmQgcmVtb3ZpbmcgcmVwZWF0ZWRseSBpc1xuICAvLyB0b28gc2xvdy5cbiAgdmFyIG9uZHJhaW4gPSBwaXBlT25EcmFpbihzcmMpO1xuICBkZXN0Lm9uKCdkcmFpbicsIG9uZHJhaW4pO1xuXG4gIHZhciBjbGVhbmVkVXAgPSBmYWxzZTtcbiAgZnVuY3Rpb24gY2xlYW51cCgpIHtcbiAgICBkZWJ1ZygnY2xlYW51cCcpO1xuICAgIC8vIGNsZWFudXAgZXZlbnQgaGFuZGxlcnMgb25jZSB0aGUgcGlwZSBpcyBicm9rZW5cbiAgICBkZXN0LnJlbW92ZUxpc3RlbmVyKCdjbG9zZScsIG9uY2xvc2UpO1xuICAgIGRlc3QucmVtb3ZlTGlzdGVuZXIoJ2ZpbmlzaCcsIG9uZmluaXNoKTtcbiAgICBkZXN0LnJlbW92ZUxpc3RlbmVyKCdkcmFpbicsIG9uZHJhaW4pO1xuICAgIGRlc3QucmVtb3ZlTGlzdGVuZXIoJ2Vycm9yJywgb25lcnJvcik7XG4gICAgZGVzdC5yZW1vdmVMaXN0ZW5lcigndW5waXBlJywgb251bnBpcGUpO1xuICAgIHNyYy5yZW1vdmVMaXN0ZW5lcignZW5kJywgb25lbmQpO1xuICAgIHNyYy5yZW1vdmVMaXN0ZW5lcignZW5kJywgY2xlYW51cCk7XG4gICAgc3JjLnJlbW92ZUxpc3RlbmVyKCdkYXRhJywgb25kYXRhKTtcblxuICAgIGNsZWFuZWRVcCA9IHRydWU7XG5cbiAgICAvLyBpZiB0aGUgcmVhZGVyIGlzIHdhaXRpbmcgZm9yIGEgZHJhaW4gZXZlbnQgZnJvbSB0aGlzXG4gICAgLy8gc3BlY2lmaWMgd3JpdGVyLCB0aGVuIGl0IHdvdWxkIGNhdXNlIGl0IHRvIG5ldmVyIHN0YXJ0XG4gICAgLy8gZmxvd2luZyBhZ2Fpbi5cbiAgICAvLyBTbywgaWYgdGhpcyBpcyBhd2FpdGluZyBhIGRyYWluLCB0aGVuIHdlIGp1c3QgY2FsbCBpdCBub3cuXG4gICAgLy8gSWYgd2UgZG9uJ3Qga25vdywgdGhlbiBhc3N1bWUgdGhhdCB3ZSBhcmUgd2FpdGluZyBmb3Igb25lLlxuICAgIGlmIChzdGF0ZS5hd2FpdERyYWluICYmICghZGVzdC5fd3JpdGFibGVTdGF0ZSB8fCBkZXN0Ll93cml0YWJsZVN0YXRlLm5lZWREcmFpbikpIG9uZHJhaW4oKTtcbiAgfVxuXG4gIHNyYy5vbignZGF0YScsIG9uZGF0YSk7XG4gIGZ1bmN0aW9uIG9uZGF0YShjaHVuaykge1xuICAgIGRlYnVnKCdvbmRhdGEnKTtcbiAgICB2YXIgcmV0ID0gZGVzdC53cml0ZShjaHVuayk7XG4gICAgaWYgKGZhbHNlID09PSByZXQpIHtcbiAgICAgIC8vIElmIHRoZSB1c2VyIHVucGlwZWQgZHVyaW5nIGBkZXN0LndyaXRlKClgLCBpdCBpcyBwb3NzaWJsZVxuICAgICAgLy8gdG8gZ2V0IHN0dWNrIGluIGEgcGVybWFuZW50bHkgcGF1c2VkIHN0YXRlIGlmIHRoYXQgd3JpdGVcbiAgICAgIC8vIGFsc28gcmV0dXJuZWQgZmFsc2UuXG4gICAgICBpZiAoc3RhdGUucGlwZXNDb3VudCA9PT0gMSAmJiBzdGF0ZS5waXBlc1swXSA9PT0gZGVzdCAmJiBzcmMubGlzdGVuZXJDb3VudCgnZGF0YScpID09PSAxICYmICFjbGVhbmVkVXApIHtcbiAgICAgICAgZGVidWcoJ2ZhbHNlIHdyaXRlIHJlc3BvbnNlLCBwYXVzZScsIHNyYy5fcmVhZGFibGVTdGF0ZS5hd2FpdERyYWluKTtcbiAgICAgICAgc3JjLl9yZWFkYWJsZVN0YXRlLmF3YWl0RHJhaW4rKztcbiAgICAgIH1cbiAgICAgIHNyYy5wYXVzZSgpO1xuICAgIH1cbiAgfVxuXG4gIC8vIGlmIHRoZSBkZXN0IGhhcyBhbiBlcnJvciwgdGhlbiBzdG9wIHBpcGluZyBpbnRvIGl0LlxuICAvLyBob3dldmVyLCBkb24ndCBzdXBwcmVzcyB0aGUgdGhyb3dpbmcgYmVoYXZpb3IgZm9yIHRoaXMuXG4gIGZ1bmN0aW9uIG9uZXJyb3IoZXIpIHtcbiAgICBkZWJ1Zygnb25lcnJvcicsIGVyKTtcbiAgICB1bnBpcGUoKTtcbiAgICBkZXN0LnJlbW92ZUxpc3RlbmVyKCdlcnJvcicsIG9uZXJyb3IpO1xuICAgIGlmIChFRWxpc3RlbmVyQ291bnQoZGVzdCwgJ2Vycm9yJykgPT09IDApIGRlc3QuZW1pdCgnZXJyb3InLCBlcik7XG4gIH1cbiAgLy8gVGhpcyBpcyBhIGJydXRhbGx5IHVnbHkgaGFjayB0byBtYWtlIHN1cmUgdGhhdCBvdXIgZXJyb3IgaGFuZGxlclxuICAvLyBpcyBhdHRhY2hlZCBiZWZvcmUgYW55IHVzZXJsYW5kIG9uZXMuICBORVZFUiBETyBUSElTLlxuICBpZiAoIWRlc3QuX2V2ZW50cyB8fCAhZGVzdC5fZXZlbnRzLmVycm9yKSBkZXN0Lm9uKCdlcnJvcicsIG9uZXJyb3IpO2Vsc2UgaWYgKGlzQXJyYXkoZGVzdC5fZXZlbnRzLmVycm9yKSkgZGVzdC5fZXZlbnRzLmVycm9yLnVuc2hpZnQob25lcnJvcik7ZWxzZSBkZXN0Ll9ldmVudHMuZXJyb3IgPSBbb25lcnJvciwgZGVzdC5fZXZlbnRzLmVycm9yXTtcblxuICAvLyBCb3RoIGNsb3NlIGFuZCBmaW5pc2ggc2hvdWxkIHRyaWdnZXIgdW5waXBlLCBidXQgb25seSBvbmNlLlxuICBmdW5jdGlvbiBvbmNsb3NlKCkge1xuICAgIGRlc3QucmVtb3ZlTGlzdGVuZXIoJ2ZpbmlzaCcsIG9uZmluaXNoKTtcbiAgICB1bnBpcGUoKTtcbiAgfVxuICBkZXN0Lm9uY2UoJ2Nsb3NlJywgb25jbG9zZSk7XG4gIGZ1bmN0aW9uIG9uZmluaXNoKCkge1xuICAgIGRlYnVnKCdvbmZpbmlzaCcpO1xuICAgIGRlc3QucmVtb3ZlTGlzdGVuZXIoJ2Nsb3NlJywgb25jbG9zZSk7XG4gICAgdW5waXBlKCk7XG4gIH1cbiAgZGVzdC5vbmNlKCdmaW5pc2gnLCBvbmZpbmlzaCk7XG5cbiAgZnVuY3Rpb24gdW5waXBlKCkge1xuICAgIGRlYnVnKCd1bnBpcGUnKTtcbiAgICBzcmMudW5waXBlKGRlc3QpO1xuICB9XG5cbiAgLy8gdGVsbCB0aGUgZGVzdCB0aGF0IGl0J3MgYmVpbmcgcGlwZWQgdG9cbiAgZGVzdC5lbWl0KCdwaXBlJywgc3JjKTtcblxuICAvLyBzdGFydCB0aGUgZmxvdyBpZiBpdCBoYXNuJ3QgYmVlbiBzdGFydGVkIGFscmVhZHkuXG4gIGlmICghc3RhdGUuZmxvd2luZykge1xuICAgIGRlYnVnKCdwaXBlIHJlc3VtZScpO1xuICAgIHNyYy5yZXN1bWUoKTtcbiAgfVxuXG4gIHJldHVybiBkZXN0O1xufTtcblxuZnVuY3Rpb24gcGlwZU9uRHJhaW4oc3JjKSB7XG4gIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHN0YXRlID0gc3JjLl9yZWFkYWJsZVN0YXRlO1xuICAgIGRlYnVnKCdwaXBlT25EcmFpbicsIHN0YXRlLmF3YWl0RHJhaW4pO1xuICAgIGlmIChzdGF0ZS5hd2FpdERyYWluKSBzdGF0ZS5hd2FpdERyYWluLS07XG4gICAgaWYgKHN0YXRlLmF3YWl0RHJhaW4gPT09IDAgJiYgRUVsaXN0ZW5lckNvdW50KHNyYywgJ2RhdGEnKSkge1xuICAgICAgc3RhdGUuZmxvd2luZyA9IHRydWU7XG4gICAgICBmbG93KHNyYyk7XG4gICAgfVxuICB9O1xufVxuXG5SZWFkYWJsZS5wcm90b3R5cGUudW5waXBlID0gZnVuY3Rpb24gKGRlc3QpIHtcbiAgdmFyIHN0YXRlID0gdGhpcy5fcmVhZGFibGVTdGF0ZTtcblxuICAvLyBpZiB3ZSdyZSBub3QgcGlwaW5nIGFueXdoZXJlLCB0aGVuIGRvIG5vdGhpbmcuXG4gIGlmIChzdGF0ZS5waXBlc0NvdW50ID09PSAwKSByZXR1cm4gdGhpcztcblxuICAvLyBqdXN0IG9uZSBkZXN0aW5hdGlvbi4gIG1vc3QgY29tbW9uIGNhc2UuXG4gIGlmIChzdGF0ZS5waXBlc0NvdW50ID09PSAxKSB7XG4gICAgLy8gcGFzc2VkIGluIG9uZSwgYnV0IGl0J3Mgbm90IHRoZSByaWdodCBvbmUuXG4gICAgaWYgKGRlc3QgJiYgZGVzdCAhPT0gc3RhdGUucGlwZXMpIHJldHVybiB0aGlzO1xuXG4gICAgaWYgKCFkZXN0KSBkZXN0ID0gc3RhdGUucGlwZXM7XG5cbiAgICAvLyBnb3QgYSBtYXRjaC5cbiAgICBzdGF0ZS5waXBlcyA9IG51bGw7XG4gICAgc3RhdGUucGlwZXNDb3VudCA9IDA7XG4gICAgc3RhdGUuZmxvd2luZyA9IGZhbHNlO1xuICAgIGlmIChkZXN0KSBkZXN0LmVtaXQoJ3VucGlwZScsIHRoaXMpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLy8gc2xvdyBjYXNlLiBtdWx0aXBsZSBwaXBlIGRlc3RpbmF0aW9ucy5cblxuICBpZiAoIWRlc3QpIHtcbiAgICAvLyByZW1vdmUgYWxsLlxuICAgIHZhciBkZXN0cyA9IHN0YXRlLnBpcGVzO1xuICAgIHZhciBsZW4gPSBzdGF0ZS5waXBlc0NvdW50O1xuICAgIHN0YXRlLnBpcGVzID0gbnVsbDtcbiAgICBzdGF0ZS5waXBlc0NvdW50ID0gMDtcbiAgICBzdGF0ZS5mbG93aW5nID0gZmFsc2U7XG5cbiAgICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgbGVuOyBfaSsrKSB7XG4gICAgICBkZXN0c1tfaV0uZW1pdCgndW5waXBlJywgdGhpcyk7XG4gICAgfXJldHVybiB0aGlzO1xuICB9XG5cbiAgLy8gdHJ5IHRvIGZpbmQgdGhlIHJpZ2h0IG9uZS5cbiAgdmFyIGkgPSBpbmRleE9mKHN0YXRlLnBpcGVzLCBkZXN0KTtcbiAgaWYgKGkgPT09IC0xKSByZXR1cm4gdGhpcztcblxuICBzdGF0ZS5waXBlcy5zcGxpY2UoaSwgMSk7XG4gIHN0YXRlLnBpcGVzQ291bnQgLT0gMTtcbiAgaWYgKHN0YXRlLnBpcGVzQ291bnQgPT09IDEpIHN0YXRlLnBpcGVzID0gc3RhdGUucGlwZXNbMF07XG5cbiAgZGVzdC5lbWl0KCd1bnBpcGUnLCB0aGlzKTtcblxuICByZXR1cm4gdGhpcztcbn07XG5cbi8vIHNldCB1cCBkYXRhIGV2ZW50cyBpZiB0aGV5IGFyZSBhc2tlZCBmb3Jcbi8vIEVuc3VyZSByZWFkYWJsZSBsaXN0ZW5lcnMgZXZlbnR1YWxseSBnZXQgc29tZXRoaW5nXG5SZWFkYWJsZS5wcm90b3R5cGUub24gPSBmdW5jdGlvbiAoZXYsIGZuKSB7XG4gIHZhciByZXMgPSBTdHJlYW0ucHJvdG90eXBlLm9uLmNhbGwodGhpcywgZXYsIGZuKTtcblxuICAvLyBJZiBsaXN0ZW5pbmcgdG8gZGF0YSwgYW5kIGl0IGhhcyBub3QgZXhwbGljaXRseSBiZWVuIHBhdXNlZCxcbiAgLy8gdGhlbiBjYWxsIHJlc3VtZSB0byBzdGFydCB0aGUgZmxvdyBvZiBkYXRhIG9uIHRoZSBuZXh0IHRpY2suXG4gIGlmIChldiA9PT0gJ2RhdGEnICYmIGZhbHNlICE9PSB0aGlzLl9yZWFkYWJsZVN0YXRlLmZsb3dpbmcpIHtcbiAgICB0aGlzLnJlc3VtZSgpO1xuICB9XG5cbiAgaWYgKGV2ID09PSAncmVhZGFibGUnICYmICF0aGlzLl9yZWFkYWJsZVN0YXRlLmVuZEVtaXR0ZWQpIHtcbiAgICB2YXIgc3RhdGUgPSB0aGlzLl9yZWFkYWJsZVN0YXRlO1xuICAgIGlmICghc3RhdGUucmVhZGFibGVMaXN0ZW5pbmcpIHtcbiAgICAgIHN0YXRlLnJlYWRhYmxlTGlzdGVuaW5nID0gdHJ1ZTtcbiAgICAgIHN0YXRlLmVtaXR0ZWRSZWFkYWJsZSA9IGZhbHNlO1xuICAgICAgc3RhdGUubmVlZFJlYWRhYmxlID0gdHJ1ZTtcbiAgICAgIGlmICghc3RhdGUucmVhZGluZykge1xuICAgICAgICBwcm9jZXNzTmV4dFRpY2soblJlYWRpbmdOZXh0VGljaywgdGhpcyk7XG4gICAgICB9IGVsc2UgaWYgKHN0YXRlLmxlbmd0aCkge1xuICAgICAgICBlbWl0UmVhZGFibGUodGhpcywgc3RhdGUpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiByZXM7XG59O1xuUmVhZGFibGUucHJvdG90eXBlLmFkZExpc3RlbmVyID0gUmVhZGFibGUucHJvdG90eXBlLm9uO1xuXG5mdW5jdGlvbiBuUmVhZGluZ05leHRUaWNrKHNlbGYpIHtcbiAgZGVidWcoJ3JlYWRhYmxlIG5leHR0aWNrIHJlYWQgMCcpO1xuICBzZWxmLnJlYWQoMCk7XG59XG5cbi8vIHBhdXNlKCkgYW5kIHJlc3VtZSgpIGFyZSByZW1uYW50cyBvZiB0aGUgbGVnYWN5IHJlYWRhYmxlIHN0cmVhbSBBUElcbi8vIElmIHRoZSB1c2VyIHVzZXMgdGhlbSwgdGhlbiBzd2l0Y2ggaW50byBvbGQgbW9kZS5cblJlYWRhYmxlLnByb3RvdHlwZS5yZXN1bWUgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBzdGF0ZSA9IHRoaXMuX3JlYWRhYmxlU3RhdGU7XG4gIGlmICghc3RhdGUuZmxvd2luZykge1xuICAgIGRlYnVnKCdyZXN1bWUnKTtcbiAgICBzdGF0ZS5mbG93aW5nID0gdHJ1ZTtcbiAgICByZXN1bWUodGhpcywgc3RhdGUpO1xuICB9XG4gIHJldHVybiB0aGlzO1xufTtcblxuZnVuY3Rpb24gcmVzdW1lKHN0cmVhbSwgc3RhdGUpIHtcbiAgaWYgKCFzdGF0ZS5yZXN1bWVTY2hlZHVsZWQpIHtcbiAgICBzdGF0ZS5yZXN1bWVTY2hlZHVsZWQgPSB0cnVlO1xuICAgIHByb2Nlc3NOZXh0VGljayhyZXN1bWVfLCBzdHJlYW0sIHN0YXRlKTtcbiAgfVxufVxuXG5mdW5jdGlvbiByZXN1bWVfKHN0cmVhbSwgc3RhdGUpIHtcbiAgaWYgKCFzdGF0ZS5yZWFkaW5nKSB7XG4gICAgZGVidWcoJ3Jlc3VtZSByZWFkIDAnKTtcbiAgICBzdHJlYW0ucmVhZCgwKTtcbiAgfVxuXG4gIHN0YXRlLnJlc3VtZVNjaGVkdWxlZCA9IGZhbHNlO1xuICBzdHJlYW0uZW1pdCgncmVzdW1lJyk7XG4gIGZsb3coc3RyZWFtKTtcbiAgaWYgKHN0YXRlLmZsb3dpbmcgJiYgIXN0YXRlLnJlYWRpbmcpIHN0cmVhbS5yZWFkKDApO1xufVxuXG5SZWFkYWJsZS5wcm90b3R5cGUucGF1c2UgPSBmdW5jdGlvbiAoKSB7XG4gIGRlYnVnKCdjYWxsIHBhdXNlIGZsb3dpbmc9JWonLCB0aGlzLl9yZWFkYWJsZVN0YXRlLmZsb3dpbmcpO1xuICBpZiAoZmFsc2UgIT09IHRoaXMuX3JlYWRhYmxlU3RhdGUuZmxvd2luZykge1xuICAgIGRlYnVnKCdwYXVzZScpO1xuICAgIHRoaXMuX3JlYWRhYmxlU3RhdGUuZmxvd2luZyA9IGZhbHNlO1xuICAgIHRoaXMuZW1pdCgncGF1c2UnKTtcbiAgfVxuICByZXR1cm4gdGhpcztcbn07XG5cbmZ1bmN0aW9uIGZsb3coc3RyZWFtKSB7XG4gIHZhciBzdGF0ZSA9IHN0cmVhbS5fcmVhZGFibGVTdGF0ZTtcbiAgZGVidWcoJ2Zsb3cnLCBzdGF0ZS5mbG93aW5nKTtcbiAgaWYgKHN0YXRlLmZsb3dpbmcpIHtcbiAgICBkbyB7XG4gICAgICB2YXIgY2h1bmsgPSBzdHJlYW0ucmVhZCgpO1xuICAgIH0gd2hpbGUgKG51bGwgIT09IGNodW5rICYmIHN0YXRlLmZsb3dpbmcpO1xuICB9XG59XG5cbi8vIHdyYXAgYW4gb2xkLXN0eWxlIHN0cmVhbSBhcyB0aGUgYXN5bmMgZGF0YSBzb3VyY2UuXG4vLyBUaGlzIGlzICpub3QqIHBhcnQgb2YgdGhlIHJlYWRhYmxlIHN0cmVhbSBpbnRlcmZhY2UuXG4vLyBJdCBpcyBhbiB1Z2x5IHVuZm9ydHVuYXRlIG1lc3Mgb2YgaGlzdG9yeS5cblJlYWRhYmxlLnByb3RvdHlwZS53cmFwID0gZnVuY3Rpb24gKHN0cmVhbSkge1xuICB2YXIgc3RhdGUgPSB0aGlzLl9yZWFkYWJsZVN0YXRlO1xuICB2YXIgcGF1c2VkID0gZmFsc2U7XG5cbiAgdmFyIHNlbGYgPSB0aGlzO1xuICBzdHJlYW0ub24oJ2VuZCcsIGZ1bmN0aW9uICgpIHtcbiAgICBkZWJ1Zygnd3JhcHBlZCBlbmQnKTtcbiAgICBpZiAoc3RhdGUuZGVjb2RlciAmJiAhc3RhdGUuZW5kZWQpIHtcbiAgICAgIHZhciBjaHVuayA9IHN0YXRlLmRlY29kZXIuZW5kKCk7XG4gICAgICBpZiAoY2h1bmsgJiYgY2h1bmsubGVuZ3RoKSBzZWxmLnB1c2goY2h1bmspO1xuICAgIH1cblxuICAgIHNlbGYucHVzaChudWxsKTtcbiAgfSk7XG5cbiAgc3RyZWFtLm9uKCdkYXRhJywgZnVuY3Rpb24gKGNodW5rKSB7XG4gICAgZGVidWcoJ3dyYXBwZWQgZGF0YScpO1xuICAgIGlmIChzdGF0ZS5kZWNvZGVyKSBjaHVuayA9IHN0YXRlLmRlY29kZXIud3JpdGUoY2h1bmspO1xuXG4gICAgLy8gZG9uJ3Qgc2tpcCBvdmVyIGZhbHN5IHZhbHVlcyBpbiBvYmplY3RNb2RlXG4gICAgaWYgKHN0YXRlLm9iamVjdE1vZGUgJiYgKGNodW5rID09PSBudWxsIHx8IGNodW5rID09PSB1bmRlZmluZWQpKSByZXR1cm47ZWxzZSBpZiAoIXN0YXRlLm9iamVjdE1vZGUgJiYgKCFjaHVuayB8fCAhY2h1bmsubGVuZ3RoKSkgcmV0dXJuO1xuXG4gICAgdmFyIHJldCA9IHNlbGYucHVzaChjaHVuayk7XG4gICAgaWYgKCFyZXQpIHtcbiAgICAgIHBhdXNlZCA9IHRydWU7XG4gICAgICBzdHJlYW0ucGF1c2UoKTtcbiAgICB9XG4gIH0pO1xuXG4gIC8vIHByb3h5IGFsbCB0aGUgb3RoZXIgbWV0aG9kcy5cbiAgLy8gaW1wb3J0YW50IHdoZW4gd3JhcHBpbmcgZmlsdGVycyBhbmQgZHVwbGV4ZXMuXG4gIGZvciAodmFyIGkgaW4gc3RyZWFtKSB7XG4gICAgaWYgKHRoaXNbaV0gPT09IHVuZGVmaW5lZCAmJiB0eXBlb2Ygc3RyZWFtW2ldID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICB0aGlzW2ldID0gZnVuY3Rpb24gKG1ldGhvZCkge1xuICAgICAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHJldHVybiBzdHJlYW1bbWV0aG9kXS5hcHBseShzdHJlYW0sIGFyZ3VtZW50cyk7XG4gICAgICAgIH07XG4gICAgICB9KGkpO1xuICAgIH1cbiAgfVxuXG4gIC8vIHByb3h5IGNlcnRhaW4gaW1wb3J0YW50IGV2ZW50cy5cbiAgdmFyIGV2ZW50cyA9IFsnZXJyb3InLCAnY2xvc2UnLCAnZGVzdHJveScsICdwYXVzZScsICdyZXN1bWUnXTtcbiAgZm9yRWFjaChldmVudHMsIGZ1bmN0aW9uIChldikge1xuICAgIHN0cmVhbS5vbihldiwgc2VsZi5lbWl0LmJpbmQoc2VsZiwgZXYpKTtcbiAgfSk7XG5cbiAgLy8gd2hlbiB3ZSB0cnkgdG8gY29uc3VtZSBzb21lIG1vcmUgYnl0ZXMsIHNpbXBseSB1bnBhdXNlIHRoZVxuICAvLyB1bmRlcmx5aW5nIHN0cmVhbS5cbiAgc2VsZi5fcmVhZCA9IGZ1bmN0aW9uIChuKSB7XG4gICAgZGVidWcoJ3dyYXBwZWQgX3JlYWQnLCBuKTtcbiAgICBpZiAocGF1c2VkKSB7XG4gICAgICBwYXVzZWQgPSBmYWxzZTtcbiAgICAgIHN0cmVhbS5yZXN1bWUoKTtcbiAgICB9XG4gIH07XG5cbiAgcmV0dXJuIHNlbGY7XG59O1xuXG4vLyBleHBvc2VkIGZvciB0ZXN0aW5nIHB1cnBvc2VzIG9ubHkuXG5SZWFkYWJsZS5fZnJvbUxpc3QgPSBmcm9tTGlzdDtcblxuLy8gUGx1Y2sgb2ZmIG4gYnl0ZXMgZnJvbSBhbiBhcnJheSBvZiBidWZmZXJzLlxuLy8gTGVuZ3RoIGlzIHRoZSBjb21iaW5lZCBsZW5ndGhzIG9mIGFsbCB0aGUgYnVmZmVycyBpbiB0aGUgbGlzdC5cbmZ1bmN0aW9uIGZyb21MaXN0KG4sIHN0YXRlKSB7XG4gIHZhciBsaXN0ID0gc3RhdGUuYnVmZmVyO1xuICB2YXIgbGVuZ3RoID0gc3RhdGUubGVuZ3RoO1xuICB2YXIgc3RyaW5nTW9kZSA9ICEhc3RhdGUuZGVjb2RlcjtcbiAgdmFyIG9iamVjdE1vZGUgPSAhIXN0YXRlLm9iamVjdE1vZGU7XG4gIHZhciByZXQ7XG5cbiAgLy8gbm90aGluZyBpbiB0aGUgbGlzdCwgZGVmaW5pdGVseSBlbXB0eS5cbiAgaWYgKGxpc3QubGVuZ3RoID09PSAwKSByZXR1cm4gbnVsbDtcblxuICBpZiAobGVuZ3RoID09PSAwKSByZXQgPSBudWxsO2Vsc2UgaWYgKG9iamVjdE1vZGUpIHJldCA9IGxpc3Quc2hpZnQoKTtlbHNlIGlmICghbiB8fCBuID49IGxlbmd0aCkge1xuICAgIC8vIHJlYWQgaXQgYWxsLCB0cnVuY2F0ZSB0aGUgYXJyYXkuXG4gICAgaWYgKHN0cmluZ01vZGUpIHJldCA9IGxpc3Quam9pbignJyk7ZWxzZSBpZiAobGlzdC5sZW5ndGggPT09IDEpIHJldCA9IGxpc3RbMF07ZWxzZSByZXQgPSBCdWZmZXIuY29uY2F0KGxpc3QsIGxlbmd0aCk7XG4gICAgbGlzdC5sZW5ndGggPSAwO1xuICB9IGVsc2Uge1xuICAgIC8vIHJlYWQganVzdCBzb21lIG9mIGl0LlxuICAgIGlmIChuIDwgbGlzdFswXS5sZW5ndGgpIHtcbiAgICAgIC8vIGp1c3QgdGFrZSBhIHBhcnQgb2YgdGhlIGZpcnN0IGxpc3QgaXRlbS5cbiAgICAgIC8vIHNsaWNlIGlzIHRoZSBzYW1lIGZvciBidWZmZXJzIGFuZCBzdHJpbmdzLlxuICAgICAgdmFyIGJ1ZiA9IGxpc3RbMF07XG4gICAgICByZXQgPSBidWYuc2xpY2UoMCwgbik7XG4gICAgICBsaXN0WzBdID0gYnVmLnNsaWNlKG4pO1xuICAgIH0gZWxzZSBpZiAobiA9PT0gbGlzdFswXS5sZW5ndGgpIHtcbiAgICAgIC8vIGZpcnN0IGxpc3QgaXMgYSBwZXJmZWN0IG1hdGNoXG4gICAgICByZXQgPSBsaXN0LnNoaWZ0KCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIGNvbXBsZXggY2FzZS5cbiAgICAgIC8vIHdlIGhhdmUgZW5vdWdoIHRvIGNvdmVyIGl0LCBidXQgaXQgc3BhbnMgcGFzdCB0aGUgZmlyc3QgYnVmZmVyLlxuICAgICAgaWYgKHN0cmluZ01vZGUpIHJldCA9ICcnO2Vsc2UgcmV0ID0gbmV3IEJ1ZmZlcihuKTtcblxuICAgICAgdmFyIGMgPSAwO1xuICAgICAgZm9yICh2YXIgaSA9IDAsIGwgPSBsaXN0Lmxlbmd0aDsgaSA8IGwgJiYgYyA8IG47IGkrKykge1xuICAgICAgICB2YXIgYnVmID0gbGlzdFswXTtcbiAgICAgICAgdmFyIGNweSA9IE1hdGgubWluKG4gLSBjLCBidWYubGVuZ3RoKTtcblxuICAgICAgICBpZiAoc3RyaW5nTW9kZSkgcmV0ICs9IGJ1Zi5zbGljZSgwLCBjcHkpO2Vsc2UgYnVmLmNvcHkocmV0LCBjLCAwLCBjcHkpO1xuXG4gICAgICAgIGlmIChjcHkgPCBidWYubGVuZ3RoKSBsaXN0WzBdID0gYnVmLnNsaWNlKGNweSk7ZWxzZSBsaXN0LnNoaWZ0KCk7XG5cbiAgICAgICAgYyArPSBjcHk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHJldDtcbn1cblxuZnVuY3Rpb24gZW5kUmVhZGFibGUoc3RyZWFtKSB7XG4gIHZhciBzdGF0ZSA9IHN0cmVhbS5fcmVhZGFibGVTdGF0ZTtcblxuICAvLyBJZiB3ZSBnZXQgaGVyZSBiZWZvcmUgY29uc3VtaW5nIGFsbCB0aGUgYnl0ZXMsIHRoZW4gdGhhdCBpcyBhXG4gIC8vIGJ1ZyBpbiBub2RlLiAgU2hvdWxkIG5ldmVyIGhhcHBlbi5cbiAgaWYgKHN0YXRlLmxlbmd0aCA+IDApIHRocm93IG5ldyBFcnJvcignZW5kUmVhZGFibGUgY2FsbGVkIG9uIG5vbi1lbXB0eSBzdHJlYW0nKTtcblxuICBpZiAoIXN0YXRlLmVuZEVtaXR0ZWQpIHtcbiAgICBzdGF0ZS5lbmRlZCA9IHRydWU7XG4gICAgcHJvY2Vzc05leHRUaWNrKGVuZFJlYWRhYmxlTlQsIHN0YXRlLCBzdHJlYW0pO1xuICB9XG59XG5cbmZ1bmN0aW9uIGVuZFJlYWRhYmxlTlQoc3RhdGUsIHN0cmVhbSkge1xuICAvLyBDaGVjayB0aGF0IHdlIGRpZG4ndCBnZXQgb25lIGxhc3QgdW5zaGlmdC5cbiAgaWYgKCFzdGF0ZS5lbmRFbWl0dGVkICYmIHN0YXRlLmxlbmd0aCA9PT0gMCkge1xuICAgIHN0YXRlLmVuZEVtaXR0ZWQgPSB0cnVlO1xuICAgIHN0cmVhbS5yZWFkYWJsZSA9IGZhbHNlO1xuICAgIHN0cmVhbS5lbWl0KCdlbmQnKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBmb3JFYWNoKHhzLCBmKSB7XG4gIGZvciAodmFyIGkgPSAwLCBsID0geHMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgZih4c1tpXSwgaSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gaW5kZXhPZih4cywgeCkge1xuICBmb3IgKHZhciBpID0gMCwgbCA9IHhzLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgIGlmICh4c1tpXSA9PT0geCkgcmV0dXJuIGk7XG4gIH1cbiAgcmV0dXJuIC0xO1xufSIsIi8vIGEgdHJhbnNmb3JtIHN0cmVhbSBpcyBhIHJlYWRhYmxlL3dyaXRhYmxlIHN0cmVhbSB3aGVyZSB5b3UgZG9cbi8vIHNvbWV0aGluZyB3aXRoIHRoZSBkYXRhLiAgU29tZXRpbWVzIGl0J3MgY2FsbGVkIGEgXCJmaWx0ZXJcIixcbi8vIGJ1dCB0aGF0J3Mgbm90IGEgZ3JlYXQgbmFtZSBmb3IgaXQsIHNpbmNlIHRoYXQgaW1wbGllcyBhIHRoaW5nIHdoZXJlXG4vLyBzb21lIGJpdHMgcGFzcyB0aHJvdWdoLCBhbmQgb3RoZXJzIGFyZSBzaW1wbHkgaWdub3JlZC4gIChUaGF0IHdvdWxkXG4vLyBiZSBhIHZhbGlkIGV4YW1wbGUgb2YgYSB0cmFuc2Zvcm0sIG9mIGNvdXJzZS4pXG4vL1xuLy8gV2hpbGUgdGhlIG91dHB1dCBpcyBjYXVzYWxseSByZWxhdGVkIHRvIHRoZSBpbnB1dCwgaXQncyBub3QgYVxuLy8gbmVjZXNzYXJpbHkgc3ltbWV0cmljIG9yIHN5bmNocm9ub3VzIHRyYW5zZm9ybWF0aW9uLiAgRm9yIGV4YW1wbGUsXG4vLyBhIHpsaWIgc3RyZWFtIG1pZ2h0IHRha2UgbXVsdGlwbGUgcGxhaW4tdGV4dCB3cml0ZXMoKSwgYW5kIHRoZW5cbi8vIGVtaXQgYSBzaW5nbGUgY29tcHJlc3NlZCBjaHVuayBzb21lIHRpbWUgaW4gdGhlIGZ1dHVyZS5cbi8vXG4vLyBIZXJlJ3MgaG93IHRoaXMgd29ya3M6XG4vL1xuLy8gVGhlIFRyYW5zZm9ybSBzdHJlYW0gaGFzIGFsbCB0aGUgYXNwZWN0cyBvZiB0aGUgcmVhZGFibGUgYW5kIHdyaXRhYmxlXG4vLyBzdHJlYW0gY2xhc3Nlcy4gIFdoZW4geW91IHdyaXRlKGNodW5rKSwgdGhhdCBjYWxscyBfd3JpdGUoY2h1bmssY2IpXG4vLyBpbnRlcm5hbGx5LCBhbmQgcmV0dXJucyBmYWxzZSBpZiB0aGVyZSdzIGEgbG90IG9mIHBlbmRpbmcgd3JpdGVzXG4vLyBidWZmZXJlZCB1cC4gIFdoZW4geW91IGNhbGwgcmVhZCgpLCB0aGF0IGNhbGxzIF9yZWFkKG4pIHVudGlsXG4vLyB0aGVyZSdzIGVub3VnaCBwZW5kaW5nIHJlYWRhYmxlIGRhdGEgYnVmZmVyZWQgdXAuXG4vL1xuLy8gSW4gYSB0cmFuc2Zvcm0gc3RyZWFtLCB0aGUgd3JpdHRlbiBkYXRhIGlzIHBsYWNlZCBpbiBhIGJ1ZmZlci4gIFdoZW5cbi8vIF9yZWFkKG4pIGlzIGNhbGxlZCwgaXQgdHJhbnNmb3JtcyB0aGUgcXVldWVkIHVwIGRhdGEsIGNhbGxpbmcgdGhlXG4vLyBidWZmZXJlZCBfd3JpdGUgY2IncyBhcyBpdCBjb25zdW1lcyBjaHVua3MuICBJZiBjb25zdW1pbmcgYSBzaW5nbGVcbi8vIHdyaXR0ZW4gY2h1bmsgd291bGQgcmVzdWx0IGluIG11bHRpcGxlIG91dHB1dCBjaHVua3MsIHRoZW4gdGhlIGZpcnN0XG4vLyBvdXRwdXR0ZWQgYml0IGNhbGxzIHRoZSByZWFkY2IsIGFuZCBzdWJzZXF1ZW50IGNodW5rcyBqdXN0IGdvIGludG9cbi8vIHRoZSByZWFkIGJ1ZmZlciwgYW5kIHdpbGwgY2F1c2UgaXQgdG8gZW1pdCAncmVhZGFibGUnIGlmIG5lY2Vzc2FyeS5cbi8vXG4vLyBUaGlzIHdheSwgYmFjay1wcmVzc3VyZSBpcyBhY3R1YWxseSBkZXRlcm1pbmVkIGJ5IHRoZSByZWFkaW5nIHNpZGUsXG4vLyBzaW5jZSBfcmVhZCBoYXMgdG8gYmUgY2FsbGVkIHRvIHN0YXJ0IHByb2Nlc3NpbmcgYSBuZXcgY2h1bmsuICBIb3dldmVyLFxuLy8gYSBwYXRob2xvZ2ljYWwgaW5mbGF0ZSB0eXBlIG9mIHRyYW5zZm9ybSBjYW4gY2F1c2UgZXhjZXNzaXZlIGJ1ZmZlcmluZ1xuLy8gaGVyZS4gIEZvciBleGFtcGxlLCBpbWFnaW5lIGEgc3RyZWFtIHdoZXJlIGV2ZXJ5IGJ5dGUgb2YgaW5wdXQgaXNcbi8vIGludGVycHJldGVkIGFzIGFuIGludGVnZXIgZnJvbSAwLTI1NSwgYW5kIHRoZW4gcmVzdWx0cyBpbiB0aGF0IG1hbnlcbi8vIGJ5dGVzIG9mIG91dHB1dC4gIFdyaXRpbmcgdGhlIDQgYnl0ZXMge2ZmLGZmLGZmLGZmfSB3b3VsZCByZXN1bHQgaW5cbi8vIDFrYiBvZiBkYXRhIGJlaW5nIG91dHB1dC4gIEluIHRoaXMgY2FzZSwgeW91IGNvdWxkIHdyaXRlIGEgdmVyeSBzbWFsbFxuLy8gYW1vdW50IG9mIGlucHV0LCBhbmQgZW5kIHVwIHdpdGggYSB2ZXJ5IGxhcmdlIGFtb3VudCBvZiBvdXRwdXQuICBJblxuLy8gc3VjaCBhIHBhdGhvbG9naWNhbCBpbmZsYXRpbmcgbWVjaGFuaXNtLCB0aGVyZSdkIGJlIG5vIHdheSB0byB0ZWxsXG4vLyB0aGUgc3lzdGVtIHRvIHN0b3AgZG9pbmcgdGhlIHRyYW5zZm9ybS4gIEEgc2luZ2xlIDRNQiB3cml0ZSBjb3VsZFxuLy8gY2F1c2UgdGhlIHN5c3RlbSB0byBydW4gb3V0IG9mIG1lbW9yeS5cbi8vXG4vLyBIb3dldmVyLCBldmVuIGluIHN1Y2ggYSBwYXRob2xvZ2ljYWwgY2FzZSwgb25seSBhIHNpbmdsZSB3cml0dGVuIGNodW5rXG4vLyB3b3VsZCBiZSBjb25zdW1lZCwgYW5kIHRoZW4gdGhlIHJlc3Qgd291bGQgd2FpdCAodW4tdHJhbnNmb3JtZWQpIHVudGlsXG4vLyB0aGUgcmVzdWx0cyBvZiB0aGUgcHJldmlvdXMgdHJhbnNmb3JtZWQgY2h1bmsgd2VyZSBjb25zdW1lZC5cblxuJ3VzZSBzdHJpY3QnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IFRyYW5zZm9ybTtcblxudmFyIER1cGxleCA9IHJlcXVpcmUoJy4vX3N0cmVhbV9kdXBsZXgnKTtcblxuLyo8cmVwbGFjZW1lbnQ+Ki9cbnZhciB1dGlsID0gcmVxdWlyZSgnY29yZS11dGlsLWlzJyk7XG51dGlsLmluaGVyaXRzID0gcmVxdWlyZSgnaW5oZXJpdHMnKTtcbi8qPC9yZXBsYWNlbWVudD4qL1xuXG51dGlsLmluaGVyaXRzKFRyYW5zZm9ybSwgRHVwbGV4KTtcblxuZnVuY3Rpb24gVHJhbnNmb3JtU3RhdGUoc3RyZWFtKSB7XG4gIHRoaXMuYWZ0ZXJUcmFuc2Zvcm0gPSBmdW5jdGlvbiAoZXIsIGRhdGEpIHtcbiAgICByZXR1cm4gYWZ0ZXJUcmFuc2Zvcm0oc3RyZWFtLCBlciwgZGF0YSk7XG4gIH07XG5cbiAgdGhpcy5uZWVkVHJhbnNmb3JtID0gZmFsc2U7XG4gIHRoaXMudHJhbnNmb3JtaW5nID0gZmFsc2U7XG4gIHRoaXMud3JpdGVjYiA9IG51bGw7XG4gIHRoaXMud3JpdGVjaHVuayA9IG51bGw7XG4gIHRoaXMud3JpdGVlbmNvZGluZyA9IG51bGw7XG59XG5cbmZ1bmN0aW9uIGFmdGVyVHJhbnNmb3JtKHN0cmVhbSwgZXIsIGRhdGEpIHtcbiAgdmFyIHRzID0gc3RyZWFtLl90cmFuc2Zvcm1TdGF0ZTtcbiAgdHMudHJhbnNmb3JtaW5nID0gZmFsc2U7XG5cbiAgdmFyIGNiID0gdHMud3JpdGVjYjtcblxuICBpZiAoIWNiKSByZXR1cm4gc3RyZWFtLmVtaXQoJ2Vycm9yJywgbmV3IEVycm9yKCdubyB3cml0ZWNiIGluIFRyYW5zZm9ybSBjbGFzcycpKTtcblxuICB0cy53cml0ZWNodW5rID0gbnVsbDtcbiAgdHMud3JpdGVjYiA9IG51bGw7XG5cbiAgaWYgKGRhdGEgIT09IG51bGwgJiYgZGF0YSAhPT0gdW5kZWZpbmVkKSBzdHJlYW0ucHVzaChkYXRhKTtcblxuICBjYihlcik7XG5cbiAgdmFyIHJzID0gc3RyZWFtLl9yZWFkYWJsZVN0YXRlO1xuICBycy5yZWFkaW5nID0gZmFsc2U7XG4gIGlmIChycy5uZWVkUmVhZGFibGUgfHwgcnMubGVuZ3RoIDwgcnMuaGlnaFdhdGVyTWFyaykge1xuICAgIHN0cmVhbS5fcmVhZChycy5oaWdoV2F0ZXJNYXJrKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBUcmFuc2Zvcm0ob3B0aW9ucykge1xuICBpZiAoISh0aGlzIGluc3RhbmNlb2YgVHJhbnNmb3JtKSkgcmV0dXJuIG5ldyBUcmFuc2Zvcm0ob3B0aW9ucyk7XG5cbiAgRHVwbGV4LmNhbGwodGhpcywgb3B0aW9ucyk7XG5cbiAgdGhpcy5fdHJhbnNmb3JtU3RhdGUgPSBuZXcgVHJhbnNmb3JtU3RhdGUodGhpcyk7XG5cbiAgLy8gd2hlbiB0aGUgd3JpdGFibGUgc2lkZSBmaW5pc2hlcywgdGhlbiBmbHVzaCBvdXQgYW55dGhpbmcgcmVtYWluaW5nLlxuICB2YXIgc3RyZWFtID0gdGhpcztcblxuICAvLyBzdGFydCBvdXQgYXNraW5nIGZvciBhIHJlYWRhYmxlIGV2ZW50IG9uY2UgZGF0YSBpcyB0cmFuc2Zvcm1lZC5cbiAgdGhpcy5fcmVhZGFibGVTdGF0ZS5uZWVkUmVhZGFibGUgPSB0cnVlO1xuXG4gIC8vIHdlIGhhdmUgaW1wbGVtZW50ZWQgdGhlIF9yZWFkIG1ldGhvZCwgYW5kIGRvbmUgdGhlIG90aGVyIHRoaW5nc1xuICAvLyB0aGF0IFJlYWRhYmxlIHdhbnRzIGJlZm9yZSB0aGUgZmlyc3QgX3JlYWQgY2FsbCwgc28gdW5zZXQgdGhlXG4gIC8vIHN5bmMgZ3VhcmQgZmxhZy5cbiAgdGhpcy5fcmVhZGFibGVTdGF0ZS5zeW5jID0gZmFsc2U7XG5cbiAgaWYgKG9wdGlvbnMpIHtcbiAgICBpZiAodHlwZW9mIG9wdGlvbnMudHJhbnNmb3JtID09PSAnZnVuY3Rpb24nKSB0aGlzLl90cmFuc2Zvcm0gPSBvcHRpb25zLnRyYW5zZm9ybTtcblxuICAgIGlmICh0eXBlb2Ygb3B0aW9ucy5mbHVzaCA9PT0gJ2Z1bmN0aW9uJykgdGhpcy5fZmx1c2ggPSBvcHRpb25zLmZsdXNoO1xuICB9XG5cbiAgdGhpcy5vbmNlKCdwcmVmaW5pc2gnLCBmdW5jdGlvbiAoKSB7XG4gICAgaWYgKHR5cGVvZiB0aGlzLl9mbHVzaCA9PT0gJ2Z1bmN0aW9uJykgdGhpcy5fZmx1c2goZnVuY3Rpb24gKGVyKSB7XG4gICAgICBkb25lKHN0cmVhbSwgZXIpO1xuICAgIH0pO2Vsc2UgZG9uZShzdHJlYW0pO1xuICB9KTtcbn1cblxuVHJhbnNmb3JtLnByb3RvdHlwZS5wdXNoID0gZnVuY3Rpb24gKGNodW5rLCBlbmNvZGluZykge1xuICB0aGlzLl90cmFuc2Zvcm1TdGF0ZS5uZWVkVHJhbnNmb3JtID0gZmFsc2U7XG4gIHJldHVybiBEdXBsZXgucHJvdG90eXBlLnB1c2guY2FsbCh0aGlzLCBjaHVuaywgZW5jb2RpbmcpO1xufTtcblxuLy8gVGhpcyBpcyB0aGUgcGFydCB3aGVyZSB5b3UgZG8gc3R1ZmYhXG4vLyBvdmVycmlkZSB0aGlzIGZ1bmN0aW9uIGluIGltcGxlbWVudGF0aW9uIGNsYXNzZXMuXG4vLyAnY2h1bmsnIGlzIGFuIGlucHV0IGNodW5rLlxuLy9cbi8vIENhbGwgYHB1c2gobmV3Q2h1bmspYCB0byBwYXNzIGFsb25nIHRyYW5zZm9ybWVkIG91dHB1dFxuLy8gdG8gdGhlIHJlYWRhYmxlIHNpZGUuICBZb3UgbWF5IGNhbGwgJ3B1c2gnIHplcm8gb3IgbW9yZSB0aW1lcy5cbi8vXG4vLyBDYWxsIGBjYihlcnIpYCB3aGVuIHlvdSBhcmUgZG9uZSB3aXRoIHRoaXMgY2h1bmsuICBJZiB5b3UgcGFzc1xuLy8gYW4gZXJyb3IsIHRoZW4gdGhhdCdsbCBwdXQgdGhlIGh1cnQgb24gdGhlIHdob2xlIG9wZXJhdGlvbi4gIElmIHlvdVxuLy8gbmV2ZXIgY2FsbCBjYigpLCB0aGVuIHlvdSdsbCBuZXZlciBnZXQgYW5vdGhlciBjaHVuay5cblRyYW5zZm9ybS5wcm90b3R5cGUuX3RyYW5zZm9ybSA9IGZ1bmN0aW9uIChjaHVuaywgZW5jb2RpbmcsIGNiKSB7XG4gIHRocm93IG5ldyBFcnJvcignbm90IGltcGxlbWVudGVkJyk7XG59O1xuXG5UcmFuc2Zvcm0ucHJvdG90eXBlLl93cml0ZSA9IGZ1bmN0aW9uIChjaHVuaywgZW5jb2RpbmcsIGNiKSB7XG4gIHZhciB0cyA9IHRoaXMuX3RyYW5zZm9ybVN0YXRlO1xuICB0cy53cml0ZWNiID0gY2I7XG4gIHRzLndyaXRlY2h1bmsgPSBjaHVuaztcbiAgdHMud3JpdGVlbmNvZGluZyA9IGVuY29kaW5nO1xuICBpZiAoIXRzLnRyYW5zZm9ybWluZykge1xuICAgIHZhciBycyA9IHRoaXMuX3JlYWRhYmxlU3RhdGU7XG4gICAgaWYgKHRzLm5lZWRUcmFuc2Zvcm0gfHwgcnMubmVlZFJlYWRhYmxlIHx8IHJzLmxlbmd0aCA8IHJzLmhpZ2hXYXRlck1hcmspIHRoaXMuX3JlYWQocnMuaGlnaFdhdGVyTWFyayk7XG4gIH1cbn07XG5cbi8vIERvZXNuJ3QgbWF0dGVyIHdoYXQgdGhlIGFyZ3MgYXJlIGhlcmUuXG4vLyBfdHJhbnNmb3JtIGRvZXMgYWxsIHRoZSB3b3JrLlxuLy8gVGhhdCB3ZSBnb3QgaGVyZSBtZWFucyB0aGF0IHRoZSByZWFkYWJsZSBzaWRlIHdhbnRzIG1vcmUgZGF0YS5cblRyYW5zZm9ybS5wcm90b3R5cGUuX3JlYWQgPSBmdW5jdGlvbiAobikge1xuICB2YXIgdHMgPSB0aGlzLl90cmFuc2Zvcm1TdGF0ZTtcblxuICBpZiAodHMud3JpdGVjaHVuayAhPT0gbnVsbCAmJiB0cy53cml0ZWNiICYmICF0cy50cmFuc2Zvcm1pbmcpIHtcbiAgICB0cy50cmFuc2Zvcm1pbmcgPSB0cnVlO1xuICAgIHRoaXMuX3RyYW5zZm9ybSh0cy53cml0ZWNodW5rLCB0cy53cml0ZWVuY29kaW5nLCB0cy5hZnRlclRyYW5zZm9ybSk7XG4gIH0gZWxzZSB7XG4gICAgLy8gbWFyayB0aGF0IHdlIG5lZWQgYSB0cmFuc2Zvcm0sIHNvIHRoYXQgYW55IGRhdGEgdGhhdCBjb21lcyBpblxuICAgIC8vIHdpbGwgZ2V0IHByb2Nlc3NlZCwgbm93IHRoYXQgd2UndmUgYXNrZWQgZm9yIGl0LlxuICAgIHRzLm5lZWRUcmFuc2Zvcm0gPSB0cnVlO1xuICB9XG59O1xuXG5mdW5jdGlvbiBkb25lKHN0cmVhbSwgZXIpIHtcbiAgaWYgKGVyKSByZXR1cm4gc3RyZWFtLmVtaXQoJ2Vycm9yJywgZXIpO1xuXG4gIC8vIGlmIHRoZXJlJ3Mgbm90aGluZyBpbiB0aGUgd3JpdGUgYnVmZmVyLCB0aGVuIHRoYXQgbWVhbnNcbiAgLy8gdGhhdCBub3RoaW5nIG1vcmUgd2lsbCBldmVyIGJlIHByb3ZpZGVkXG4gIHZhciB3cyA9IHN0cmVhbS5fd3JpdGFibGVTdGF0ZTtcbiAgdmFyIHRzID0gc3RyZWFtLl90cmFuc2Zvcm1TdGF0ZTtcblxuICBpZiAod3MubGVuZ3RoKSB0aHJvdyBuZXcgRXJyb3IoJ2NhbGxpbmcgdHJhbnNmb3JtIGRvbmUgd2hlbiB3cy5sZW5ndGggIT0gMCcpO1xuXG4gIGlmICh0cy50cmFuc2Zvcm1pbmcpIHRocm93IG5ldyBFcnJvcignY2FsbGluZyB0cmFuc2Zvcm0gZG9uZSB3aGVuIHN0aWxsIHRyYW5zZm9ybWluZycpO1xuXG4gIHJldHVybiBzdHJlYW0ucHVzaChudWxsKTtcbn0iLCIvLyBBIGJpdCBzaW1wbGVyIHRoYW4gcmVhZGFibGUgc3RyZWFtcy5cbi8vIEltcGxlbWVudCBhbiBhc3luYyAuX3dyaXRlKGNodW5rLCBlbmNvZGluZywgY2IpLCBhbmQgaXQnbGwgaGFuZGxlIGFsbFxuLy8gdGhlIGRyYWluIGV2ZW50IGVtaXNzaW9uIGFuZCBidWZmZXJpbmcuXG5cbid1c2Ugc3RyaWN0JztcblxubW9kdWxlLmV4cG9ydHMgPSBXcml0YWJsZTtcblxuLyo8cmVwbGFjZW1lbnQ+Ki9cbnZhciBwcm9jZXNzTmV4dFRpY2sgPSByZXF1aXJlKCdwcm9jZXNzLW5leHRpY2stYXJncycpO1xuLyo8L3JlcGxhY2VtZW50PiovXG5cbi8qPHJlcGxhY2VtZW50PiovXG52YXIgYXN5bmNXcml0ZSA9ICFwcm9jZXNzLmJyb3dzZXIgJiYgWyd2MC4xMCcsICd2MC45LiddLmluZGV4T2YocHJvY2Vzcy52ZXJzaW9uLnNsaWNlKDAsIDUpKSA+IC0xID8gc2V0SW1tZWRpYXRlIDogcHJvY2Vzc05leHRUaWNrO1xuLyo8L3JlcGxhY2VtZW50PiovXG5cbi8qPHJlcGxhY2VtZW50PiovXG52YXIgQnVmZmVyID0gcmVxdWlyZSgnYnVmZmVyJykuQnVmZmVyO1xuLyo8L3JlcGxhY2VtZW50PiovXG5cbldyaXRhYmxlLldyaXRhYmxlU3RhdGUgPSBXcml0YWJsZVN0YXRlO1xuXG4vKjxyZXBsYWNlbWVudD4qL1xudmFyIHV0aWwgPSByZXF1aXJlKCdjb3JlLXV0aWwtaXMnKTtcbnV0aWwuaW5oZXJpdHMgPSByZXF1aXJlKCdpbmhlcml0cycpO1xuLyo8L3JlcGxhY2VtZW50PiovXG5cbi8qPHJlcGxhY2VtZW50PiovXG52YXIgaW50ZXJuYWxVdGlsID0ge1xuICBkZXByZWNhdGU6IHJlcXVpcmUoJ3V0aWwtZGVwcmVjYXRlJylcbn07XG4vKjwvcmVwbGFjZW1lbnQ+Ki9cblxuLyo8cmVwbGFjZW1lbnQ+Ki9cbnZhciBTdHJlYW07XG4oZnVuY3Rpb24gKCkge1xuICB0cnkge1xuICAgIFN0cmVhbSA9IHJlcXVpcmUoJ3N0JyArICdyZWFtJyk7XG4gIH0gY2F0Y2ggKF8pIHt9IGZpbmFsbHkge1xuICAgIGlmICghU3RyZWFtKSBTdHJlYW0gPSByZXF1aXJlKCdldmVudHMnKS5FdmVudEVtaXR0ZXI7XG4gIH1cbn0pKCk7XG4vKjwvcmVwbGFjZW1lbnQ+Ki9cblxudmFyIEJ1ZmZlciA9IHJlcXVpcmUoJ2J1ZmZlcicpLkJ1ZmZlcjtcblxudXRpbC5pbmhlcml0cyhXcml0YWJsZSwgU3RyZWFtKTtcblxuZnVuY3Rpb24gbm9wKCkge31cblxuZnVuY3Rpb24gV3JpdGVSZXEoY2h1bmssIGVuY29kaW5nLCBjYikge1xuICB0aGlzLmNodW5rID0gY2h1bms7XG4gIHRoaXMuZW5jb2RpbmcgPSBlbmNvZGluZztcbiAgdGhpcy5jYWxsYmFjayA9IGNiO1xuICB0aGlzLm5leHQgPSBudWxsO1xufVxuXG52YXIgRHVwbGV4O1xuZnVuY3Rpb24gV3JpdGFibGVTdGF0ZShvcHRpb25zLCBzdHJlYW0pIHtcbiAgRHVwbGV4ID0gRHVwbGV4IHx8IHJlcXVpcmUoJy4vX3N0cmVhbV9kdXBsZXgnKTtcblxuICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcblxuICAvLyBvYmplY3Qgc3RyZWFtIGZsYWcgdG8gaW5kaWNhdGUgd2hldGhlciBvciBub3QgdGhpcyBzdHJlYW1cbiAgLy8gY29udGFpbnMgYnVmZmVycyBvciBvYmplY3RzLlxuICB0aGlzLm9iamVjdE1vZGUgPSAhIW9wdGlvbnMub2JqZWN0TW9kZTtcblxuICBpZiAoc3RyZWFtIGluc3RhbmNlb2YgRHVwbGV4KSB0aGlzLm9iamVjdE1vZGUgPSB0aGlzLm9iamVjdE1vZGUgfHwgISFvcHRpb25zLndyaXRhYmxlT2JqZWN0TW9kZTtcblxuICAvLyB0aGUgcG9pbnQgYXQgd2hpY2ggd3JpdGUoKSBzdGFydHMgcmV0dXJuaW5nIGZhbHNlXG4gIC8vIE5vdGU6IDAgaXMgYSB2YWxpZCB2YWx1ZSwgbWVhbnMgdGhhdCB3ZSBhbHdheXMgcmV0dXJuIGZhbHNlIGlmXG4gIC8vIHRoZSBlbnRpcmUgYnVmZmVyIGlzIG5vdCBmbHVzaGVkIGltbWVkaWF0ZWx5IG9uIHdyaXRlKClcbiAgdmFyIGh3bSA9IG9wdGlvbnMuaGlnaFdhdGVyTWFyaztcbiAgdmFyIGRlZmF1bHRId20gPSB0aGlzLm9iamVjdE1vZGUgPyAxNiA6IDE2ICogMTAyNDtcbiAgdGhpcy5oaWdoV2F0ZXJNYXJrID0gaHdtIHx8IGh3bSA9PT0gMCA/IGh3bSA6IGRlZmF1bHRId207XG5cbiAgLy8gY2FzdCB0byBpbnRzLlxuICB0aGlzLmhpZ2hXYXRlck1hcmsgPSB+IH50aGlzLmhpZ2hXYXRlck1hcms7XG5cbiAgdGhpcy5uZWVkRHJhaW4gPSBmYWxzZTtcbiAgLy8gYXQgdGhlIHN0YXJ0IG9mIGNhbGxpbmcgZW5kKClcbiAgdGhpcy5lbmRpbmcgPSBmYWxzZTtcbiAgLy8gd2hlbiBlbmQoKSBoYXMgYmVlbiBjYWxsZWQsIGFuZCByZXR1cm5lZFxuICB0aGlzLmVuZGVkID0gZmFsc2U7XG4gIC8vIHdoZW4gJ2ZpbmlzaCcgaXMgZW1pdHRlZFxuICB0aGlzLmZpbmlzaGVkID0gZmFsc2U7XG5cbiAgLy8gc2hvdWxkIHdlIGRlY29kZSBzdHJpbmdzIGludG8gYnVmZmVycyBiZWZvcmUgcGFzc2luZyB0byBfd3JpdGU/XG4gIC8vIHRoaXMgaXMgaGVyZSBzbyB0aGF0IHNvbWUgbm9kZS1jb3JlIHN0cmVhbXMgY2FuIG9wdGltaXplIHN0cmluZ1xuICAvLyBoYW5kbGluZyBhdCBhIGxvd2VyIGxldmVsLlxuICB2YXIgbm9EZWNvZGUgPSBvcHRpb25zLmRlY29kZVN0cmluZ3MgPT09IGZhbHNlO1xuICB0aGlzLmRlY29kZVN0cmluZ3MgPSAhbm9EZWNvZGU7XG5cbiAgLy8gQ3J5cHRvIGlzIGtpbmQgb2Ygb2xkIGFuZCBjcnVzdHkuICBIaXN0b3JpY2FsbHksIGl0cyBkZWZhdWx0IHN0cmluZ1xuICAvLyBlbmNvZGluZyBpcyAnYmluYXJ5JyBzbyB3ZSBoYXZlIHRvIG1ha2UgdGhpcyBjb25maWd1cmFibGUuXG4gIC8vIEV2ZXJ5dGhpbmcgZWxzZSBpbiB0aGUgdW5pdmVyc2UgdXNlcyAndXRmOCcsIHRob3VnaC5cbiAgdGhpcy5kZWZhdWx0RW5jb2RpbmcgPSBvcHRpb25zLmRlZmF1bHRFbmNvZGluZyB8fCAndXRmOCc7XG5cbiAgLy8gbm90IGFuIGFjdHVhbCBidWZmZXIgd2Uga2VlcCB0cmFjayBvZiwgYnV0IGEgbWVhc3VyZW1lbnRcbiAgLy8gb2YgaG93IG11Y2ggd2UncmUgd2FpdGluZyB0byBnZXQgcHVzaGVkIHRvIHNvbWUgdW5kZXJseWluZ1xuICAvLyBzb2NrZXQgb3IgZmlsZS5cbiAgdGhpcy5sZW5ndGggPSAwO1xuXG4gIC8vIGEgZmxhZyB0byBzZWUgd2hlbiB3ZSdyZSBpbiB0aGUgbWlkZGxlIG9mIGEgd3JpdGUuXG4gIHRoaXMud3JpdGluZyA9IGZhbHNlO1xuXG4gIC8vIHdoZW4gdHJ1ZSBhbGwgd3JpdGVzIHdpbGwgYmUgYnVmZmVyZWQgdW50aWwgLnVuY29yaygpIGNhbGxcbiAgdGhpcy5jb3JrZWQgPSAwO1xuXG4gIC8vIGEgZmxhZyB0byBiZSBhYmxlIHRvIHRlbGwgaWYgdGhlIG9ud3JpdGUgY2IgaXMgY2FsbGVkIGltbWVkaWF0ZWx5LFxuICAvLyBvciBvbiBhIGxhdGVyIHRpY2suICBXZSBzZXQgdGhpcyB0byB0cnVlIGF0IGZpcnN0LCBiZWNhdXNlIGFueVxuICAvLyBhY3Rpb25zIHRoYXQgc2hvdWxkbid0IGhhcHBlbiB1bnRpbCBcImxhdGVyXCIgc2hvdWxkIGdlbmVyYWxseSBhbHNvXG4gIC8vIG5vdCBoYXBwZW4gYmVmb3JlIHRoZSBmaXJzdCB3cml0ZSBjYWxsLlxuICB0aGlzLnN5bmMgPSB0cnVlO1xuXG4gIC8vIGEgZmxhZyB0byBrbm93IGlmIHdlJ3JlIHByb2Nlc3NpbmcgcHJldmlvdXNseSBidWZmZXJlZCBpdGVtcywgd2hpY2hcbiAgLy8gbWF5IGNhbGwgdGhlIF93cml0ZSgpIGNhbGxiYWNrIGluIHRoZSBzYW1lIHRpY2ssIHNvIHRoYXQgd2UgZG9uJ3RcbiAgLy8gZW5kIHVwIGluIGFuIG92ZXJsYXBwZWQgb253cml0ZSBzaXR1YXRpb24uXG4gIHRoaXMuYnVmZmVyUHJvY2Vzc2luZyA9IGZhbHNlO1xuXG4gIC8vIHRoZSBjYWxsYmFjayB0aGF0J3MgcGFzc2VkIHRvIF93cml0ZShjaHVuayxjYilcbiAgdGhpcy5vbndyaXRlID0gZnVuY3Rpb24gKGVyKSB7XG4gICAgb253cml0ZShzdHJlYW0sIGVyKTtcbiAgfTtcblxuICAvLyB0aGUgY2FsbGJhY2sgdGhhdCB0aGUgdXNlciBzdXBwbGllcyB0byB3cml0ZShjaHVuayxlbmNvZGluZyxjYilcbiAgdGhpcy53cml0ZWNiID0gbnVsbDtcblxuICAvLyB0aGUgYW1vdW50IHRoYXQgaXMgYmVpbmcgd3JpdHRlbiB3aGVuIF93cml0ZSBpcyBjYWxsZWQuXG4gIHRoaXMud3JpdGVsZW4gPSAwO1xuXG4gIHRoaXMuYnVmZmVyZWRSZXF1ZXN0ID0gbnVsbDtcbiAgdGhpcy5sYXN0QnVmZmVyZWRSZXF1ZXN0ID0gbnVsbDtcblxuICAvLyBudW1iZXIgb2YgcGVuZGluZyB1c2VyLXN1cHBsaWVkIHdyaXRlIGNhbGxiYWNrc1xuICAvLyB0aGlzIG11c3QgYmUgMCBiZWZvcmUgJ2ZpbmlzaCcgY2FuIGJlIGVtaXR0ZWRcbiAgdGhpcy5wZW5kaW5nY2IgPSAwO1xuXG4gIC8vIGVtaXQgcHJlZmluaXNoIGlmIHRoZSBvbmx5IHRoaW5nIHdlJ3JlIHdhaXRpbmcgZm9yIGlzIF93cml0ZSBjYnNcbiAgLy8gVGhpcyBpcyByZWxldmFudCBmb3Igc3luY2hyb25vdXMgVHJhbnNmb3JtIHN0cmVhbXNcbiAgdGhpcy5wcmVmaW5pc2hlZCA9IGZhbHNlO1xuXG4gIC8vIFRydWUgaWYgdGhlIGVycm9yIHdhcyBhbHJlYWR5IGVtaXR0ZWQgYW5kIHNob3VsZCBub3QgYmUgdGhyb3duIGFnYWluXG4gIHRoaXMuZXJyb3JFbWl0dGVkID0gZmFsc2U7XG5cbiAgLy8gY291bnQgYnVmZmVyZWQgcmVxdWVzdHNcbiAgdGhpcy5idWZmZXJlZFJlcXVlc3RDb3VudCA9IDA7XG5cbiAgLy8gY3JlYXRlIHRoZSB0d28gb2JqZWN0cyBuZWVkZWQgdG8gc3RvcmUgdGhlIGNvcmtlZCByZXF1ZXN0c1xuICAvLyB0aGV5IGFyZSBub3QgYSBsaW5rZWQgbGlzdCwgYXMgbm8gbmV3IGVsZW1lbnRzIGFyZSBpbnNlcnRlZCBpbiB0aGVyZVxuICB0aGlzLmNvcmtlZFJlcXVlc3RzRnJlZSA9IG5ldyBDb3JrZWRSZXF1ZXN0KHRoaXMpO1xuICB0aGlzLmNvcmtlZFJlcXVlc3RzRnJlZS5uZXh0ID0gbmV3IENvcmtlZFJlcXVlc3QodGhpcyk7XG59XG5cbldyaXRhYmxlU3RhdGUucHJvdG90eXBlLmdldEJ1ZmZlciA9IGZ1bmN0aW9uIHdyaXRhYmxlU3RhdGVHZXRCdWZmZXIoKSB7XG4gIHZhciBjdXJyZW50ID0gdGhpcy5idWZmZXJlZFJlcXVlc3Q7XG4gIHZhciBvdXQgPSBbXTtcbiAgd2hpbGUgKGN1cnJlbnQpIHtcbiAgICBvdXQucHVzaChjdXJyZW50KTtcbiAgICBjdXJyZW50ID0gY3VycmVudC5uZXh0O1xuICB9XG4gIHJldHVybiBvdXQ7XG59O1xuXG4oZnVuY3Rpb24gKCkge1xuICB0cnkge1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShXcml0YWJsZVN0YXRlLnByb3RvdHlwZSwgJ2J1ZmZlcicsIHtcbiAgICAgIGdldDogaW50ZXJuYWxVdGlsLmRlcHJlY2F0ZShmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldEJ1ZmZlcigpO1xuICAgICAgfSwgJ193cml0YWJsZVN0YXRlLmJ1ZmZlciBpcyBkZXByZWNhdGVkLiBVc2UgX3dyaXRhYmxlU3RhdGUuZ2V0QnVmZmVyICcgKyAnaW5zdGVhZC4nKVxuICAgIH0pO1xuICB9IGNhdGNoIChfKSB7fVxufSkoKTtcblxudmFyIER1cGxleDtcbmZ1bmN0aW9uIFdyaXRhYmxlKG9wdGlvbnMpIHtcbiAgRHVwbGV4ID0gRHVwbGV4IHx8IHJlcXVpcmUoJy4vX3N0cmVhbV9kdXBsZXgnKTtcblxuICAvLyBXcml0YWJsZSBjdG9yIGlzIGFwcGxpZWQgdG8gRHVwbGV4ZXMsIHRob3VnaCB0aGV5J3JlIG5vdFxuICAvLyBpbnN0YW5jZW9mIFdyaXRhYmxlLCB0aGV5J3JlIGluc3RhbmNlb2YgUmVhZGFibGUuXG4gIGlmICghKHRoaXMgaW5zdGFuY2VvZiBXcml0YWJsZSkgJiYgISh0aGlzIGluc3RhbmNlb2YgRHVwbGV4KSkgcmV0dXJuIG5ldyBXcml0YWJsZShvcHRpb25zKTtcblxuICB0aGlzLl93cml0YWJsZVN0YXRlID0gbmV3IFdyaXRhYmxlU3RhdGUob3B0aW9ucywgdGhpcyk7XG5cbiAgLy8gbGVnYWN5LlxuICB0aGlzLndyaXRhYmxlID0gdHJ1ZTtcblxuICBpZiAob3B0aW9ucykge1xuICAgIGlmICh0eXBlb2Ygb3B0aW9ucy53cml0ZSA9PT0gJ2Z1bmN0aW9uJykgdGhpcy5fd3JpdGUgPSBvcHRpb25zLndyaXRlO1xuXG4gICAgaWYgKHR5cGVvZiBvcHRpb25zLndyaXRldiA9PT0gJ2Z1bmN0aW9uJykgdGhpcy5fd3JpdGV2ID0gb3B0aW9ucy53cml0ZXY7XG4gIH1cblxuICBTdHJlYW0uY2FsbCh0aGlzKTtcbn1cblxuLy8gT3RoZXJ3aXNlIHBlb3BsZSBjYW4gcGlwZSBXcml0YWJsZSBzdHJlYW1zLCB3aGljaCBpcyBqdXN0IHdyb25nLlxuV3JpdGFibGUucHJvdG90eXBlLnBpcGUgPSBmdW5jdGlvbiAoKSB7XG4gIHRoaXMuZW1pdCgnZXJyb3InLCBuZXcgRXJyb3IoJ0Nhbm5vdCBwaXBlLiBOb3QgcmVhZGFibGUuJykpO1xufTtcblxuZnVuY3Rpb24gd3JpdGVBZnRlckVuZChzdHJlYW0sIGNiKSB7XG4gIHZhciBlciA9IG5ldyBFcnJvcignd3JpdGUgYWZ0ZXIgZW5kJyk7XG4gIC8vIFRPRE86IGRlZmVyIGVycm9yIGV2ZW50cyBjb25zaXN0ZW50bHkgZXZlcnl3aGVyZSwgbm90IGp1c3QgdGhlIGNiXG4gIHN0cmVhbS5lbWl0KCdlcnJvcicsIGVyKTtcbiAgcHJvY2Vzc05leHRUaWNrKGNiLCBlcik7XG59XG5cbi8vIElmIHdlIGdldCBzb21ldGhpbmcgdGhhdCBpcyBub3QgYSBidWZmZXIsIHN0cmluZywgbnVsbCwgb3IgdW5kZWZpbmVkLFxuLy8gYW5kIHdlJ3JlIG5vdCBpbiBvYmplY3RNb2RlLCB0aGVuIHRoYXQncyBhbiBlcnJvci5cbi8vIE90aGVyd2lzZSBzdHJlYW0gY2h1bmtzIGFyZSBhbGwgY29uc2lkZXJlZCB0byBiZSBvZiBsZW5ndGg9MSwgYW5kIHRoZVxuLy8gd2F0ZXJtYXJrcyBkZXRlcm1pbmUgaG93IG1hbnkgb2JqZWN0cyB0byBrZWVwIGluIHRoZSBidWZmZXIsIHJhdGhlciB0aGFuXG4vLyBob3cgbWFueSBieXRlcyBvciBjaGFyYWN0ZXJzLlxuZnVuY3Rpb24gdmFsaWRDaHVuayhzdHJlYW0sIHN0YXRlLCBjaHVuaywgY2IpIHtcbiAgdmFyIHZhbGlkID0gdHJ1ZTtcblxuICBpZiAoIUJ1ZmZlci5pc0J1ZmZlcihjaHVuaykgJiYgdHlwZW9mIGNodW5rICE9PSAnc3RyaW5nJyAmJiBjaHVuayAhPT0gbnVsbCAmJiBjaHVuayAhPT0gdW5kZWZpbmVkICYmICFzdGF0ZS5vYmplY3RNb2RlKSB7XG4gICAgdmFyIGVyID0gbmV3IFR5cGVFcnJvcignSW52YWxpZCBub24tc3RyaW5nL2J1ZmZlciBjaHVuaycpO1xuICAgIHN0cmVhbS5lbWl0KCdlcnJvcicsIGVyKTtcbiAgICBwcm9jZXNzTmV4dFRpY2soY2IsIGVyKTtcbiAgICB2YWxpZCA9IGZhbHNlO1xuICB9XG4gIHJldHVybiB2YWxpZDtcbn1cblxuV3JpdGFibGUucHJvdG90eXBlLndyaXRlID0gZnVuY3Rpb24gKGNodW5rLCBlbmNvZGluZywgY2IpIHtcbiAgdmFyIHN0YXRlID0gdGhpcy5fd3JpdGFibGVTdGF0ZTtcbiAgdmFyIHJldCA9IGZhbHNlO1xuXG4gIGlmICh0eXBlb2YgZW5jb2RpbmcgPT09ICdmdW5jdGlvbicpIHtcbiAgICBjYiA9IGVuY29kaW5nO1xuICAgIGVuY29kaW5nID0gbnVsbDtcbiAgfVxuXG4gIGlmIChCdWZmZXIuaXNCdWZmZXIoY2h1bmspKSBlbmNvZGluZyA9ICdidWZmZXInO2Vsc2UgaWYgKCFlbmNvZGluZykgZW5jb2RpbmcgPSBzdGF0ZS5kZWZhdWx0RW5jb2Rpbmc7XG5cbiAgaWYgKHR5cGVvZiBjYiAhPT0gJ2Z1bmN0aW9uJykgY2IgPSBub3A7XG5cbiAgaWYgKHN0YXRlLmVuZGVkKSB3cml0ZUFmdGVyRW5kKHRoaXMsIGNiKTtlbHNlIGlmICh2YWxpZENodW5rKHRoaXMsIHN0YXRlLCBjaHVuaywgY2IpKSB7XG4gICAgc3RhdGUucGVuZGluZ2NiKys7XG4gICAgcmV0ID0gd3JpdGVPckJ1ZmZlcih0aGlzLCBzdGF0ZSwgY2h1bmssIGVuY29kaW5nLCBjYik7XG4gIH1cblxuICByZXR1cm4gcmV0O1xufTtcblxuV3JpdGFibGUucHJvdG90eXBlLmNvcmsgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBzdGF0ZSA9IHRoaXMuX3dyaXRhYmxlU3RhdGU7XG5cbiAgc3RhdGUuY29ya2VkKys7XG59O1xuXG5Xcml0YWJsZS5wcm90b3R5cGUudW5jb3JrID0gZnVuY3Rpb24gKCkge1xuICB2YXIgc3RhdGUgPSB0aGlzLl93cml0YWJsZVN0YXRlO1xuXG4gIGlmIChzdGF0ZS5jb3JrZWQpIHtcbiAgICBzdGF0ZS5jb3JrZWQtLTtcblxuICAgIGlmICghc3RhdGUud3JpdGluZyAmJiAhc3RhdGUuY29ya2VkICYmICFzdGF0ZS5maW5pc2hlZCAmJiAhc3RhdGUuYnVmZmVyUHJvY2Vzc2luZyAmJiBzdGF0ZS5idWZmZXJlZFJlcXVlc3QpIGNsZWFyQnVmZmVyKHRoaXMsIHN0YXRlKTtcbiAgfVxufTtcblxuV3JpdGFibGUucHJvdG90eXBlLnNldERlZmF1bHRFbmNvZGluZyA9IGZ1bmN0aW9uIHNldERlZmF1bHRFbmNvZGluZyhlbmNvZGluZykge1xuICAvLyBub2RlOjpQYXJzZUVuY29kaW5nKCkgcmVxdWlyZXMgbG93ZXIgY2FzZS5cbiAgaWYgKHR5cGVvZiBlbmNvZGluZyA9PT0gJ3N0cmluZycpIGVuY29kaW5nID0gZW5jb2RpbmcudG9Mb3dlckNhc2UoKTtcbiAgaWYgKCEoWydoZXgnLCAndXRmOCcsICd1dGYtOCcsICdhc2NpaScsICdiaW5hcnknLCAnYmFzZTY0JywgJ3VjczInLCAndWNzLTInLCAndXRmMTZsZScsICd1dGYtMTZsZScsICdyYXcnXS5pbmRleE9mKChlbmNvZGluZyArICcnKS50b0xvd2VyQ2FzZSgpKSA+IC0xKSkgdGhyb3cgbmV3IFR5cGVFcnJvcignVW5rbm93biBlbmNvZGluZzogJyArIGVuY29kaW5nKTtcbiAgdGhpcy5fd3JpdGFibGVTdGF0ZS5kZWZhdWx0RW5jb2RpbmcgPSBlbmNvZGluZztcbn07XG5cbmZ1bmN0aW9uIGRlY29kZUNodW5rKHN0YXRlLCBjaHVuaywgZW5jb2RpbmcpIHtcbiAgaWYgKCFzdGF0ZS5vYmplY3RNb2RlICYmIHN0YXRlLmRlY29kZVN0cmluZ3MgIT09IGZhbHNlICYmIHR5cGVvZiBjaHVuayA9PT0gJ3N0cmluZycpIHtcbiAgICBjaHVuayA9IG5ldyBCdWZmZXIoY2h1bmssIGVuY29kaW5nKTtcbiAgfVxuICByZXR1cm4gY2h1bms7XG59XG5cbi8vIGlmIHdlJ3JlIGFscmVhZHkgd3JpdGluZyBzb21ldGhpbmcsIHRoZW4ganVzdCBwdXQgdGhpc1xuLy8gaW4gdGhlIHF1ZXVlLCBhbmQgd2FpdCBvdXIgdHVybi4gIE90aGVyd2lzZSwgY2FsbCBfd3JpdGVcbi8vIElmIHdlIHJldHVybiBmYWxzZSwgdGhlbiB3ZSBuZWVkIGEgZHJhaW4gZXZlbnQsIHNvIHNldCB0aGF0IGZsYWcuXG5mdW5jdGlvbiB3cml0ZU9yQnVmZmVyKHN0cmVhbSwgc3RhdGUsIGNodW5rLCBlbmNvZGluZywgY2IpIHtcbiAgY2h1bmsgPSBkZWNvZGVDaHVuayhzdGF0ZSwgY2h1bmssIGVuY29kaW5nKTtcblxuICBpZiAoQnVmZmVyLmlzQnVmZmVyKGNodW5rKSkgZW5jb2RpbmcgPSAnYnVmZmVyJztcbiAgdmFyIGxlbiA9IHN0YXRlLm9iamVjdE1vZGUgPyAxIDogY2h1bmsubGVuZ3RoO1xuXG4gIHN0YXRlLmxlbmd0aCArPSBsZW47XG5cbiAgdmFyIHJldCA9IHN0YXRlLmxlbmd0aCA8IHN0YXRlLmhpZ2hXYXRlck1hcms7XG4gIC8vIHdlIG11c3QgZW5zdXJlIHRoYXQgcHJldmlvdXMgbmVlZERyYWluIHdpbGwgbm90IGJlIHJlc2V0IHRvIGZhbHNlLlxuICBpZiAoIXJldCkgc3RhdGUubmVlZERyYWluID0gdHJ1ZTtcblxuICBpZiAoc3RhdGUud3JpdGluZyB8fCBzdGF0ZS5jb3JrZWQpIHtcbiAgICB2YXIgbGFzdCA9IHN0YXRlLmxhc3RCdWZmZXJlZFJlcXVlc3Q7XG4gICAgc3RhdGUubGFzdEJ1ZmZlcmVkUmVxdWVzdCA9IG5ldyBXcml0ZVJlcShjaHVuaywgZW5jb2RpbmcsIGNiKTtcbiAgICBpZiAobGFzdCkge1xuICAgICAgbGFzdC5uZXh0ID0gc3RhdGUubGFzdEJ1ZmZlcmVkUmVxdWVzdDtcbiAgICB9IGVsc2Uge1xuICAgICAgc3RhdGUuYnVmZmVyZWRSZXF1ZXN0ID0gc3RhdGUubGFzdEJ1ZmZlcmVkUmVxdWVzdDtcbiAgICB9XG4gICAgc3RhdGUuYnVmZmVyZWRSZXF1ZXN0Q291bnQgKz0gMTtcbiAgfSBlbHNlIHtcbiAgICBkb1dyaXRlKHN0cmVhbSwgc3RhdGUsIGZhbHNlLCBsZW4sIGNodW5rLCBlbmNvZGluZywgY2IpO1xuICB9XG5cbiAgcmV0dXJuIHJldDtcbn1cblxuZnVuY3Rpb24gZG9Xcml0ZShzdHJlYW0sIHN0YXRlLCB3cml0ZXYsIGxlbiwgY2h1bmssIGVuY29kaW5nLCBjYikge1xuICBzdGF0ZS53cml0ZWxlbiA9IGxlbjtcbiAgc3RhdGUud3JpdGVjYiA9IGNiO1xuICBzdGF0ZS53cml0aW5nID0gdHJ1ZTtcbiAgc3RhdGUuc3luYyA9IHRydWU7XG4gIGlmICh3cml0ZXYpIHN0cmVhbS5fd3JpdGV2KGNodW5rLCBzdGF0ZS5vbndyaXRlKTtlbHNlIHN0cmVhbS5fd3JpdGUoY2h1bmssIGVuY29kaW5nLCBzdGF0ZS5vbndyaXRlKTtcbiAgc3RhdGUuc3luYyA9IGZhbHNlO1xufVxuXG5mdW5jdGlvbiBvbndyaXRlRXJyb3Ioc3RyZWFtLCBzdGF0ZSwgc3luYywgZXIsIGNiKSB7XG4gIC0tc3RhdGUucGVuZGluZ2NiO1xuICBpZiAoc3luYykgcHJvY2Vzc05leHRUaWNrKGNiLCBlcik7ZWxzZSBjYihlcik7XG5cbiAgc3RyZWFtLl93cml0YWJsZVN0YXRlLmVycm9yRW1pdHRlZCA9IHRydWU7XG4gIHN0cmVhbS5lbWl0KCdlcnJvcicsIGVyKTtcbn1cblxuZnVuY3Rpb24gb253cml0ZVN0YXRlVXBkYXRlKHN0YXRlKSB7XG4gIHN0YXRlLndyaXRpbmcgPSBmYWxzZTtcbiAgc3RhdGUud3JpdGVjYiA9IG51bGw7XG4gIHN0YXRlLmxlbmd0aCAtPSBzdGF0ZS53cml0ZWxlbjtcbiAgc3RhdGUud3JpdGVsZW4gPSAwO1xufVxuXG5mdW5jdGlvbiBvbndyaXRlKHN0cmVhbSwgZXIpIHtcbiAgdmFyIHN0YXRlID0gc3RyZWFtLl93cml0YWJsZVN0YXRlO1xuICB2YXIgc3luYyA9IHN0YXRlLnN5bmM7XG4gIHZhciBjYiA9IHN0YXRlLndyaXRlY2I7XG5cbiAgb253cml0ZVN0YXRlVXBkYXRlKHN0YXRlKTtcblxuICBpZiAoZXIpIG9ud3JpdGVFcnJvcihzdHJlYW0sIHN0YXRlLCBzeW5jLCBlciwgY2IpO2Vsc2Uge1xuICAgIC8vIENoZWNrIGlmIHdlJ3JlIGFjdHVhbGx5IHJlYWR5IHRvIGZpbmlzaCwgYnV0IGRvbid0IGVtaXQgeWV0XG4gICAgdmFyIGZpbmlzaGVkID0gbmVlZEZpbmlzaChzdGF0ZSk7XG5cbiAgICBpZiAoIWZpbmlzaGVkICYmICFzdGF0ZS5jb3JrZWQgJiYgIXN0YXRlLmJ1ZmZlclByb2Nlc3NpbmcgJiYgc3RhdGUuYnVmZmVyZWRSZXF1ZXN0KSB7XG4gICAgICBjbGVhckJ1ZmZlcihzdHJlYW0sIHN0YXRlKTtcbiAgICB9XG5cbiAgICBpZiAoc3luYykge1xuICAgICAgLyo8cmVwbGFjZW1lbnQ+Ki9cbiAgICAgIGFzeW5jV3JpdGUoYWZ0ZXJXcml0ZSwgc3RyZWFtLCBzdGF0ZSwgZmluaXNoZWQsIGNiKTtcbiAgICAgIC8qPC9yZXBsYWNlbWVudD4qL1xuICAgIH0gZWxzZSB7XG4gICAgICAgIGFmdGVyV3JpdGUoc3RyZWFtLCBzdGF0ZSwgZmluaXNoZWQsIGNiKTtcbiAgICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBhZnRlcldyaXRlKHN0cmVhbSwgc3RhdGUsIGZpbmlzaGVkLCBjYikge1xuICBpZiAoIWZpbmlzaGVkKSBvbndyaXRlRHJhaW4oc3RyZWFtLCBzdGF0ZSk7XG4gIHN0YXRlLnBlbmRpbmdjYi0tO1xuICBjYigpO1xuICBmaW5pc2hNYXliZShzdHJlYW0sIHN0YXRlKTtcbn1cblxuLy8gTXVzdCBmb3JjZSBjYWxsYmFjayB0byBiZSBjYWxsZWQgb24gbmV4dFRpY2ssIHNvIHRoYXQgd2UgZG9uJ3Rcbi8vIGVtaXQgJ2RyYWluJyBiZWZvcmUgdGhlIHdyaXRlKCkgY29uc3VtZXIgZ2V0cyB0aGUgJ2ZhbHNlJyByZXR1cm5cbi8vIHZhbHVlLCBhbmQgaGFzIGEgY2hhbmNlIHRvIGF0dGFjaCBhICdkcmFpbicgbGlzdGVuZXIuXG5mdW5jdGlvbiBvbndyaXRlRHJhaW4oc3RyZWFtLCBzdGF0ZSkge1xuICBpZiAoc3RhdGUubGVuZ3RoID09PSAwICYmIHN0YXRlLm5lZWREcmFpbikge1xuICAgIHN0YXRlLm5lZWREcmFpbiA9IGZhbHNlO1xuICAgIHN0cmVhbS5lbWl0KCdkcmFpbicpO1xuICB9XG59XG5cbi8vIGlmIHRoZXJlJ3Mgc29tZXRoaW5nIGluIHRoZSBidWZmZXIgd2FpdGluZywgdGhlbiBwcm9jZXNzIGl0XG5mdW5jdGlvbiBjbGVhckJ1ZmZlcihzdHJlYW0sIHN0YXRlKSB7XG4gIHN0YXRlLmJ1ZmZlclByb2Nlc3NpbmcgPSB0cnVlO1xuICB2YXIgZW50cnkgPSBzdGF0ZS5idWZmZXJlZFJlcXVlc3Q7XG5cbiAgaWYgKHN0cmVhbS5fd3JpdGV2ICYmIGVudHJ5ICYmIGVudHJ5Lm5leHQpIHtcbiAgICAvLyBGYXN0IGNhc2UsIHdyaXRlIGV2ZXJ5dGhpbmcgdXNpbmcgX3dyaXRldigpXG4gICAgdmFyIGwgPSBzdGF0ZS5idWZmZXJlZFJlcXVlc3RDb3VudDtcbiAgICB2YXIgYnVmZmVyID0gbmV3IEFycmF5KGwpO1xuICAgIHZhciBob2xkZXIgPSBzdGF0ZS5jb3JrZWRSZXF1ZXN0c0ZyZWU7XG4gICAgaG9sZGVyLmVudHJ5ID0gZW50cnk7XG5cbiAgICB2YXIgY291bnQgPSAwO1xuICAgIHdoaWxlIChlbnRyeSkge1xuICAgICAgYnVmZmVyW2NvdW50XSA9IGVudHJ5O1xuICAgICAgZW50cnkgPSBlbnRyeS5uZXh0O1xuICAgICAgY291bnQgKz0gMTtcbiAgICB9XG5cbiAgICBkb1dyaXRlKHN0cmVhbSwgc3RhdGUsIHRydWUsIHN0YXRlLmxlbmd0aCwgYnVmZmVyLCAnJywgaG9sZGVyLmZpbmlzaCk7XG5cbiAgICAvLyBkb1dyaXRlIGlzIGFsd2F5cyBhc3luYywgZGVmZXIgdGhlc2UgdG8gc2F2ZSBhIGJpdCBvZiB0aW1lXG4gICAgLy8gYXMgdGhlIGhvdCBwYXRoIGVuZHMgd2l0aCBkb1dyaXRlXG4gICAgc3RhdGUucGVuZGluZ2NiKys7XG4gICAgc3RhdGUubGFzdEJ1ZmZlcmVkUmVxdWVzdCA9IG51bGw7XG4gICAgc3RhdGUuY29ya2VkUmVxdWVzdHNGcmVlID0gaG9sZGVyLm5leHQ7XG4gICAgaG9sZGVyLm5leHQgPSBudWxsO1xuICB9IGVsc2Uge1xuICAgIC8vIFNsb3cgY2FzZSwgd3JpdGUgY2h1bmtzIG9uZS1ieS1vbmVcbiAgICB3aGlsZSAoZW50cnkpIHtcbiAgICAgIHZhciBjaHVuayA9IGVudHJ5LmNodW5rO1xuICAgICAgdmFyIGVuY29kaW5nID0gZW50cnkuZW5jb2Rpbmc7XG4gICAgICB2YXIgY2IgPSBlbnRyeS5jYWxsYmFjaztcbiAgICAgIHZhciBsZW4gPSBzdGF0ZS5vYmplY3RNb2RlID8gMSA6IGNodW5rLmxlbmd0aDtcblxuICAgICAgZG9Xcml0ZShzdHJlYW0sIHN0YXRlLCBmYWxzZSwgbGVuLCBjaHVuaywgZW5jb2RpbmcsIGNiKTtcbiAgICAgIGVudHJ5ID0gZW50cnkubmV4dDtcbiAgICAgIC8vIGlmIHdlIGRpZG4ndCBjYWxsIHRoZSBvbndyaXRlIGltbWVkaWF0ZWx5LCB0aGVuXG4gICAgICAvLyBpdCBtZWFucyB0aGF0IHdlIG5lZWQgdG8gd2FpdCB1bnRpbCBpdCBkb2VzLlxuICAgICAgLy8gYWxzbywgdGhhdCBtZWFucyB0aGF0IHRoZSBjaHVuayBhbmQgY2IgYXJlIGN1cnJlbnRseVxuICAgICAgLy8gYmVpbmcgcHJvY2Vzc2VkLCBzbyBtb3ZlIHRoZSBidWZmZXIgY291bnRlciBwYXN0IHRoZW0uXG4gICAgICBpZiAoc3RhdGUud3JpdGluZykge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoZW50cnkgPT09IG51bGwpIHN0YXRlLmxhc3RCdWZmZXJlZFJlcXVlc3QgPSBudWxsO1xuICB9XG5cbiAgc3RhdGUuYnVmZmVyZWRSZXF1ZXN0Q291bnQgPSAwO1xuICBzdGF0ZS5idWZmZXJlZFJlcXVlc3QgPSBlbnRyeTtcbiAgc3RhdGUuYnVmZmVyUHJvY2Vzc2luZyA9IGZhbHNlO1xufVxuXG5Xcml0YWJsZS5wcm90b3R5cGUuX3dyaXRlID0gZnVuY3Rpb24gKGNodW5rLCBlbmNvZGluZywgY2IpIHtcbiAgY2IobmV3IEVycm9yKCdub3QgaW1wbGVtZW50ZWQnKSk7XG59O1xuXG5Xcml0YWJsZS5wcm90b3R5cGUuX3dyaXRldiA9IG51bGw7XG5cbldyaXRhYmxlLnByb3RvdHlwZS5lbmQgPSBmdW5jdGlvbiAoY2h1bmssIGVuY29kaW5nLCBjYikge1xuICB2YXIgc3RhdGUgPSB0aGlzLl93cml0YWJsZVN0YXRlO1xuXG4gIGlmICh0eXBlb2YgY2h1bmsgPT09ICdmdW5jdGlvbicpIHtcbiAgICBjYiA9IGNodW5rO1xuICAgIGNodW5rID0gbnVsbDtcbiAgICBlbmNvZGluZyA9IG51bGw7XG4gIH0gZWxzZSBpZiAodHlwZW9mIGVuY29kaW5nID09PSAnZnVuY3Rpb24nKSB7XG4gICAgY2IgPSBlbmNvZGluZztcbiAgICBlbmNvZGluZyA9IG51bGw7XG4gIH1cblxuICBpZiAoY2h1bmsgIT09IG51bGwgJiYgY2h1bmsgIT09IHVuZGVmaW5lZCkgdGhpcy53cml0ZShjaHVuaywgZW5jb2RpbmcpO1xuXG4gIC8vIC5lbmQoKSBmdWxseSB1bmNvcmtzXG4gIGlmIChzdGF0ZS5jb3JrZWQpIHtcbiAgICBzdGF0ZS5jb3JrZWQgPSAxO1xuICAgIHRoaXMudW5jb3JrKCk7XG4gIH1cblxuICAvLyBpZ25vcmUgdW5uZWNlc3NhcnkgZW5kKCkgY2FsbHMuXG4gIGlmICghc3RhdGUuZW5kaW5nICYmICFzdGF0ZS5maW5pc2hlZCkgZW5kV3JpdGFibGUodGhpcywgc3RhdGUsIGNiKTtcbn07XG5cbmZ1bmN0aW9uIG5lZWRGaW5pc2goc3RhdGUpIHtcbiAgcmV0dXJuIHN0YXRlLmVuZGluZyAmJiBzdGF0ZS5sZW5ndGggPT09IDAgJiYgc3RhdGUuYnVmZmVyZWRSZXF1ZXN0ID09PSBudWxsICYmICFzdGF0ZS5maW5pc2hlZCAmJiAhc3RhdGUud3JpdGluZztcbn1cblxuZnVuY3Rpb24gcHJlZmluaXNoKHN0cmVhbSwgc3RhdGUpIHtcbiAgaWYgKCFzdGF0ZS5wcmVmaW5pc2hlZCkge1xuICAgIHN0YXRlLnByZWZpbmlzaGVkID0gdHJ1ZTtcbiAgICBzdHJlYW0uZW1pdCgncHJlZmluaXNoJyk7XG4gIH1cbn1cblxuZnVuY3Rpb24gZmluaXNoTWF5YmUoc3RyZWFtLCBzdGF0ZSkge1xuICB2YXIgbmVlZCA9IG5lZWRGaW5pc2goc3RhdGUpO1xuICBpZiAobmVlZCkge1xuICAgIGlmIChzdGF0ZS5wZW5kaW5nY2IgPT09IDApIHtcbiAgICAgIHByZWZpbmlzaChzdHJlYW0sIHN0YXRlKTtcbiAgICAgIHN0YXRlLmZpbmlzaGVkID0gdHJ1ZTtcbiAgICAgIHN0cmVhbS5lbWl0KCdmaW5pc2gnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcHJlZmluaXNoKHN0cmVhbSwgc3RhdGUpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gbmVlZDtcbn1cblxuZnVuY3Rpb24gZW5kV3JpdGFibGUoc3RyZWFtLCBzdGF0ZSwgY2IpIHtcbiAgc3RhdGUuZW5kaW5nID0gdHJ1ZTtcbiAgZmluaXNoTWF5YmUoc3RyZWFtLCBzdGF0ZSk7XG4gIGlmIChjYikge1xuICAgIGlmIChzdGF0ZS5maW5pc2hlZCkgcHJvY2Vzc05leHRUaWNrKGNiKTtlbHNlIHN0cmVhbS5vbmNlKCdmaW5pc2gnLCBjYik7XG4gIH1cbiAgc3RhdGUuZW5kZWQgPSB0cnVlO1xuICBzdHJlYW0ud3JpdGFibGUgPSBmYWxzZTtcbn1cblxuLy8gSXQgc2VlbXMgYSBsaW5rZWQgbGlzdCBidXQgaXQgaXMgbm90XG4vLyB0aGVyZSB3aWxsIGJlIG9ubHkgMiBvZiB0aGVzZSBmb3IgZWFjaCBzdHJlYW1cbmZ1bmN0aW9uIENvcmtlZFJlcXVlc3Qoc3RhdGUpIHtcbiAgdmFyIF90aGlzID0gdGhpcztcblxuICB0aGlzLm5leHQgPSBudWxsO1xuICB0aGlzLmVudHJ5ID0gbnVsbDtcblxuICB0aGlzLmZpbmlzaCA9IGZ1bmN0aW9uIChlcnIpIHtcbiAgICB2YXIgZW50cnkgPSBfdGhpcy5lbnRyeTtcbiAgICBfdGhpcy5lbnRyeSA9IG51bGw7XG4gICAgd2hpbGUgKGVudHJ5KSB7XG4gICAgICB2YXIgY2IgPSBlbnRyeS5jYWxsYmFjaztcbiAgICAgIHN0YXRlLnBlbmRpbmdjYi0tO1xuICAgICAgY2IoZXJyKTtcbiAgICAgIGVudHJ5ID0gZW50cnkubmV4dDtcbiAgICB9XG4gICAgaWYgKHN0YXRlLmNvcmtlZFJlcXVlc3RzRnJlZSkge1xuICAgICAgc3RhdGUuY29ya2VkUmVxdWVzdHNGcmVlLm5leHQgPSBfdGhpcztcbiAgICB9IGVsc2Uge1xuICAgICAgc3RhdGUuY29ya2VkUmVxdWVzdHNGcmVlID0gX3RoaXM7XG4gICAgfVxuICB9O1xufSIsIi8vIENvcHlyaWdodCBKb3llbnQsIEluYy4gYW5kIG90aGVyIE5vZGUgY29udHJpYnV0b3JzLlxuLy9cbi8vIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhXG4vLyBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlXG4vLyBcIlNvZnR3YXJlXCIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmdcbi8vIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCxcbi8vIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXRcbi8vIHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZVxuLy8gZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4vL1xuLy8gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWRcbi8vIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuLy9cbi8vIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1Ncbi8vIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0Zcbi8vIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU5cbi8vIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLFxuLy8gREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SXG4vLyBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFXG4vLyBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLlxuXG4vLyBOT1RFOiBUaGVzZSB0eXBlIGNoZWNraW5nIGZ1bmN0aW9ucyBpbnRlbnRpb25hbGx5IGRvbid0IHVzZSBgaW5zdGFuY2VvZmBcbi8vIGJlY2F1c2UgaXQgaXMgZnJhZ2lsZSBhbmQgY2FuIGJlIGVhc2lseSBmYWtlZCB3aXRoIGBPYmplY3QuY3JlYXRlKClgLlxuXG5mdW5jdGlvbiBpc0FycmF5KGFyZykge1xuICBpZiAoQXJyYXkuaXNBcnJheSkge1xuICAgIHJldHVybiBBcnJheS5pc0FycmF5KGFyZyk7XG4gIH1cbiAgcmV0dXJuIG9iamVjdFRvU3RyaW5nKGFyZykgPT09ICdbb2JqZWN0IEFycmF5XSc7XG59XG5leHBvcnRzLmlzQXJyYXkgPSBpc0FycmF5O1xuXG5mdW5jdGlvbiBpc0Jvb2xlYW4oYXJnKSB7XG4gIHJldHVybiB0eXBlb2YgYXJnID09PSAnYm9vbGVhbic7XG59XG5leHBvcnRzLmlzQm9vbGVhbiA9IGlzQm9vbGVhbjtcblxuZnVuY3Rpb24gaXNOdWxsKGFyZykge1xuICByZXR1cm4gYXJnID09PSBudWxsO1xufVxuZXhwb3J0cy5pc051bGwgPSBpc051bGw7XG5cbmZ1bmN0aW9uIGlzTnVsbE9yVW5kZWZpbmVkKGFyZykge1xuICByZXR1cm4gYXJnID09IG51bGw7XG59XG5leHBvcnRzLmlzTnVsbE9yVW5kZWZpbmVkID0gaXNOdWxsT3JVbmRlZmluZWQ7XG5cbmZ1bmN0aW9uIGlzTnVtYmVyKGFyZykge1xuICByZXR1cm4gdHlwZW9mIGFyZyA9PT0gJ251bWJlcic7XG59XG5leHBvcnRzLmlzTnVtYmVyID0gaXNOdW1iZXI7XG5cbmZ1bmN0aW9uIGlzU3RyaW5nKGFyZykge1xuICByZXR1cm4gdHlwZW9mIGFyZyA9PT0gJ3N0cmluZyc7XG59XG5leHBvcnRzLmlzU3RyaW5nID0gaXNTdHJpbmc7XG5cbmZ1bmN0aW9uIGlzU3ltYm9sKGFyZykge1xuICByZXR1cm4gdHlwZW9mIGFyZyA9PT0gJ3N5bWJvbCc7XG59XG5leHBvcnRzLmlzU3ltYm9sID0gaXNTeW1ib2w7XG5cbmZ1bmN0aW9uIGlzVW5kZWZpbmVkKGFyZykge1xuICByZXR1cm4gYXJnID09PSB2b2lkIDA7XG59XG5leHBvcnRzLmlzVW5kZWZpbmVkID0gaXNVbmRlZmluZWQ7XG5cbmZ1bmN0aW9uIGlzUmVnRXhwKHJlKSB7XG4gIHJldHVybiBvYmplY3RUb1N0cmluZyhyZSkgPT09ICdbb2JqZWN0IFJlZ0V4cF0nO1xufVxuZXhwb3J0cy5pc1JlZ0V4cCA9IGlzUmVnRXhwO1xuXG5mdW5jdGlvbiBpc09iamVjdChhcmcpIHtcbiAgcmV0dXJuIHR5cGVvZiBhcmcgPT09ICdvYmplY3QnICYmIGFyZyAhPT0gbnVsbDtcbn1cbmV4cG9ydHMuaXNPYmplY3QgPSBpc09iamVjdDtcblxuZnVuY3Rpb24gaXNEYXRlKGQpIHtcbiAgcmV0dXJuIG9iamVjdFRvU3RyaW5nKGQpID09PSAnW29iamVjdCBEYXRlXSc7XG59XG5leHBvcnRzLmlzRGF0ZSA9IGlzRGF0ZTtcblxuZnVuY3Rpb24gaXNFcnJvcihlKSB7XG4gIHJldHVybiAob2JqZWN0VG9TdHJpbmcoZSkgPT09ICdbb2JqZWN0IEVycm9yXScgfHwgZSBpbnN0YW5jZW9mIEVycm9yKTtcbn1cbmV4cG9ydHMuaXNFcnJvciA9IGlzRXJyb3I7XG5cbmZ1bmN0aW9uIGlzRnVuY3Rpb24oYXJnKSB7XG4gIHJldHVybiB0eXBlb2YgYXJnID09PSAnZnVuY3Rpb24nO1xufVxuZXhwb3J0cy5pc0Z1bmN0aW9uID0gaXNGdW5jdGlvbjtcblxuZnVuY3Rpb24gaXNQcmltaXRpdmUoYXJnKSB7XG4gIHJldHVybiBhcmcgPT09IG51bGwgfHxcbiAgICAgICAgIHR5cGVvZiBhcmcgPT09ICdib29sZWFuJyB8fFxuICAgICAgICAgdHlwZW9mIGFyZyA9PT0gJ251bWJlcicgfHxcbiAgICAgICAgIHR5cGVvZiBhcmcgPT09ICdzdHJpbmcnIHx8XG4gICAgICAgICB0eXBlb2YgYXJnID09PSAnc3ltYm9sJyB8fCAgLy8gRVM2IHN5bWJvbFxuICAgICAgICAgdHlwZW9mIGFyZyA9PT0gJ3VuZGVmaW5lZCc7XG59XG5leHBvcnRzLmlzUHJpbWl0aXZlID0gaXNQcmltaXRpdmU7XG5cbmV4cG9ydHMuaXNCdWZmZXIgPSBCdWZmZXIuaXNCdWZmZXI7XG5cbmZ1bmN0aW9uIG9iamVjdFRvU3RyaW5nKG8pIHtcbiAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvKTtcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxuaWYgKCFwcm9jZXNzLnZlcnNpb24gfHxcbiAgICBwcm9jZXNzLnZlcnNpb24uaW5kZXhPZigndjAuJykgPT09IDAgfHxcbiAgICBwcm9jZXNzLnZlcnNpb24uaW5kZXhPZigndjEuJykgPT09IDAgJiYgcHJvY2Vzcy52ZXJzaW9uLmluZGV4T2YoJ3YxLjguJykgIT09IDApIHtcbiAgbW9kdWxlLmV4cG9ydHMgPSBuZXh0VGljaztcbn0gZWxzZSB7XG4gIG1vZHVsZS5leHBvcnRzID0gcHJvY2Vzcy5uZXh0VGljaztcbn1cblxuZnVuY3Rpb24gbmV4dFRpY2soZm4sIGFyZzEsIGFyZzIsIGFyZzMpIHtcbiAgaWYgKHR5cGVvZiBmbiAhPT0gJ2Z1bmN0aW9uJykge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1wiY2FsbGJhY2tcIiBhcmd1bWVudCBtdXN0IGJlIGEgZnVuY3Rpb24nKTtcbiAgfVxuICB2YXIgbGVuID0gYXJndW1lbnRzLmxlbmd0aDtcbiAgdmFyIGFyZ3MsIGk7XG4gIHN3aXRjaCAobGVuKSB7XG4gIGNhc2UgMDpcbiAgY2FzZSAxOlxuICAgIHJldHVybiBwcm9jZXNzLm5leHRUaWNrKGZuKTtcbiAgY2FzZSAyOlxuICAgIHJldHVybiBwcm9jZXNzLm5leHRUaWNrKGZ1bmN0aW9uIGFmdGVyVGlja09uZSgpIHtcbiAgICAgIGZuLmNhbGwobnVsbCwgYXJnMSk7XG4gICAgfSk7XG4gIGNhc2UgMzpcbiAgICByZXR1cm4gcHJvY2Vzcy5uZXh0VGljayhmdW5jdGlvbiBhZnRlclRpY2tUd28oKSB7XG4gICAgICBmbi5jYWxsKG51bGwsIGFyZzEsIGFyZzIpO1xuICAgIH0pO1xuICBjYXNlIDQ6XG4gICAgcmV0dXJuIHByb2Nlc3MubmV4dFRpY2soZnVuY3Rpb24gYWZ0ZXJUaWNrVGhyZWUoKSB7XG4gICAgICBmbi5jYWxsKG51bGwsIGFyZzEsIGFyZzIsIGFyZzMpO1xuICAgIH0pO1xuICBkZWZhdWx0OlxuICAgIGFyZ3MgPSBuZXcgQXJyYXkobGVuIC0gMSk7XG4gICAgaSA9IDA7XG4gICAgd2hpbGUgKGkgPCBhcmdzLmxlbmd0aCkge1xuICAgICAgYXJnc1tpKytdID0gYXJndW1lbnRzW2ldO1xuICAgIH1cbiAgICByZXR1cm4gcHJvY2Vzcy5uZXh0VGljayhmdW5jdGlvbiBhZnRlclRpY2soKSB7XG4gICAgICBmbi5hcHBseShudWxsLCBhcmdzKTtcbiAgICB9KTtcbiAgfVxufVxuIiwiLy8gQ29weXJpZ2h0IEpveWVudCwgSW5jLiBhbmQgb3RoZXIgTm9kZSBjb250cmlidXRvcnMuXG4vL1xuLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGFcbi8vIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGVcbi8vIFwiU29mdHdhcmVcIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZ1xuLy8gd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLFxuLy8gZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdFxuLy8gcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlXG4vLyBmb2xsb3dpbmcgY29uZGl0aW9uczpcbi8vXG4vLyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZFxuLy8gaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4vL1xuLy8gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTU1xuLy8gT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRlxuLy8gTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTlxuLy8gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sXG4vLyBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1Jcbi8vIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEVcbi8vIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuXG5cbnZhciBCdWZmZXIgPSByZXF1aXJlKCdidWZmZXInKS5CdWZmZXI7XG5cbnZhciBpc0J1ZmZlckVuY29kaW5nID0gQnVmZmVyLmlzRW5jb2RpbmdcbiAgfHwgZnVuY3Rpb24oZW5jb2RpbmcpIHtcbiAgICAgICBzd2l0Y2ggKGVuY29kaW5nICYmIGVuY29kaW5nLnRvTG93ZXJDYXNlKCkpIHtcbiAgICAgICAgIGNhc2UgJ2hleCc6IGNhc2UgJ3V0ZjgnOiBjYXNlICd1dGYtOCc6IGNhc2UgJ2FzY2lpJzogY2FzZSAnYmluYXJ5JzogY2FzZSAnYmFzZTY0JzogY2FzZSAndWNzMic6IGNhc2UgJ3Vjcy0yJzogY2FzZSAndXRmMTZsZSc6IGNhc2UgJ3V0Zi0xNmxlJzogY2FzZSAncmF3JzogcmV0dXJuIHRydWU7XG4gICAgICAgICBkZWZhdWx0OiByZXR1cm4gZmFsc2U7XG4gICAgICAgfVxuICAgICB9XG5cblxuZnVuY3Rpb24gYXNzZXJ0RW5jb2RpbmcoZW5jb2RpbmcpIHtcbiAgaWYgKGVuY29kaW5nICYmICFpc0J1ZmZlckVuY29kaW5nKGVuY29kaW5nKSkge1xuICAgIHRocm93IG5ldyBFcnJvcignVW5rbm93biBlbmNvZGluZzogJyArIGVuY29kaW5nKTtcbiAgfVxufVxuXG4vLyBTdHJpbmdEZWNvZGVyIHByb3ZpZGVzIGFuIGludGVyZmFjZSBmb3IgZWZmaWNpZW50bHkgc3BsaXR0aW5nIGEgc2VyaWVzIG9mXG4vLyBidWZmZXJzIGludG8gYSBzZXJpZXMgb2YgSlMgc3RyaW5ncyB3aXRob3V0IGJyZWFraW5nIGFwYXJ0IG11bHRpLWJ5dGVcbi8vIGNoYXJhY3RlcnMuIENFU1UtOCBpcyBoYW5kbGVkIGFzIHBhcnQgb2YgdGhlIFVURi04IGVuY29kaW5nLlxuLy9cbi8vIEBUT0RPIEhhbmRsaW5nIGFsbCBlbmNvZGluZ3MgaW5zaWRlIGEgc2luZ2xlIG9iamVjdCBtYWtlcyBpdCB2ZXJ5IGRpZmZpY3VsdFxuLy8gdG8gcmVhc29uIGFib3V0IHRoaXMgY29kZSwgc28gaXQgc2hvdWxkIGJlIHNwbGl0IHVwIGluIHRoZSBmdXR1cmUuXG4vLyBAVE9ETyBUaGVyZSBzaG91bGQgYmUgYSB1dGY4LXN0cmljdCBlbmNvZGluZyB0aGF0IHJlamVjdHMgaW52YWxpZCBVVEYtOCBjb2RlXG4vLyBwb2ludHMgYXMgdXNlZCBieSBDRVNVLTguXG52YXIgU3RyaW5nRGVjb2RlciA9IGV4cG9ydHMuU3RyaW5nRGVjb2RlciA9IGZ1bmN0aW9uKGVuY29kaW5nKSB7XG4gIHRoaXMuZW5jb2RpbmcgPSAoZW5jb2RpbmcgfHwgJ3V0ZjgnKS50b0xvd2VyQ2FzZSgpLnJlcGxhY2UoL1stX10vLCAnJyk7XG4gIGFzc2VydEVuY29kaW5nKGVuY29kaW5nKTtcbiAgc3dpdGNoICh0aGlzLmVuY29kaW5nKSB7XG4gICAgY2FzZSAndXRmOCc6XG4gICAgICAvLyBDRVNVLTggcmVwcmVzZW50cyBlYWNoIG9mIFN1cnJvZ2F0ZSBQYWlyIGJ5IDMtYnl0ZXNcbiAgICAgIHRoaXMuc3Vycm9nYXRlU2l6ZSA9IDM7XG4gICAgICBicmVhaztcbiAgICBjYXNlICd1Y3MyJzpcbiAgICBjYXNlICd1dGYxNmxlJzpcbiAgICAgIC8vIFVURi0xNiByZXByZXNlbnRzIGVhY2ggb2YgU3Vycm9nYXRlIFBhaXIgYnkgMi1ieXRlc1xuICAgICAgdGhpcy5zdXJyb2dhdGVTaXplID0gMjtcbiAgICAgIHRoaXMuZGV0ZWN0SW5jb21wbGV0ZUNoYXIgPSB1dGYxNkRldGVjdEluY29tcGxldGVDaGFyO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnYmFzZTY0JzpcbiAgICAgIC8vIEJhc2UtNjQgc3RvcmVzIDMgYnl0ZXMgaW4gNCBjaGFycywgYW5kIHBhZHMgdGhlIHJlbWFpbmRlci5cbiAgICAgIHRoaXMuc3Vycm9nYXRlU2l6ZSA9IDM7XG4gICAgICB0aGlzLmRldGVjdEluY29tcGxldGVDaGFyID0gYmFzZTY0RGV0ZWN0SW5jb21wbGV0ZUNoYXI7XG4gICAgICBicmVhaztcbiAgICBkZWZhdWx0OlxuICAgICAgdGhpcy53cml0ZSA9IHBhc3NUaHJvdWdoV3JpdGU7XG4gICAgICByZXR1cm47XG4gIH1cblxuICAvLyBFbm91Z2ggc3BhY2UgdG8gc3RvcmUgYWxsIGJ5dGVzIG9mIGEgc2luZ2xlIGNoYXJhY3Rlci4gVVRGLTggbmVlZHMgNFxuICAvLyBieXRlcywgYnV0IENFU1UtOCBtYXkgcmVxdWlyZSB1cCB0byA2ICgzIGJ5dGVzIHBlciBzdXJyb2dhdGUpLlxuICB0aGlzLmNoYXJCdWZmZXIgPSBuZXcgQnVmZmVyKDYpO1xuICAvLyBOdW1iZXIgb2YgYnl0ZXMgcmVjZWl2ZWQgZm9yIHRoZSBjdXJyZW50IGluY29tcGxldGUgbXVsdGktYnl0ZSBjaGFyYWN0ZXIuXG4gIHRoaXMuY2hhclJlY2VpdmVkID0gMDtcbiAgLy8gTnVtYmVyIG9mIGJ5dGVzIGV4cGVjdGVkIGZvciB0aGUgY3VycmVudCBpbmNvbXBsZXRlIG11bHRpLWJ5dGUgY2hhcmFjdGVyLlxuICB0aGlzLmNoYXJMZW5ndGggPSAwO1xufTtcblxuXG4vLyB3cml0ZSBkZWNvZGVzIHRoZSBnaXZlbiBidWZmZXIgYW5kIHJldHVybnMgaXQgYXMgSlMgc3RyaW5nIHRoYXQgaXNcbi8vIGd1YXJhbnRlZWQgdG8gbm90IGNvbnRhaW4gYW55IHBhcnRpYWwgbXVsdGktYnl0ZSBjaGFyYWN0ZXJzLiBBbnkgcGFydGlhbFxuLy8gY2hhcmFjdGVyIGZvdW5kIGF0IHRoZSBlbmQgb2YgdGhlIGJ1ZmZlciBpcyBidWZmZXJlZCB1cCwgYW5kIHdpbGwgYmVcbi8vIHJldHVybmVkIHdoZW4gY2FsbGluZyB3cml0ZSBhZ2FpbiB3aXRoIHRoZSByZW1haW5pbmcgYnl0ZXMuXG4vL1xuLy8gTm90ZTogQ29udmVydGluZyBhIEJ1ZmZlciBjb250YWluaW5nIGFuIG9ycGhhbiBzdXJyb2dhdGUgdG8gYSBTdHJpbmdcbi8vIGN1cnJlbnRseSB3b3JrcywgYnV0IGNvbnZlcnRpbmcgYSBTdHJpbmcgdG8gYSBCdWZmZXIgKHZpYSBgbmV3IEJ1ZmZlcmAsIG9yXG4vLyBCdWZmZXIjd3JpdGUpIHdpbGwgcmVwbGFjZSBpbmNvbXBsZXRlIHN1cnJvZ2F0ZXMgd2l0aCB0aGUgdW5pY29kZVxuLy8gcmVwbGFjZW1lbnQgY2hhcmFjdGVyLiBTZWUgaHR0cHM6Ly9jb2RlcmV2aWV3LmNocm9taXVtLm9yZy8xMjExNzMwMDkvIC5cblN0cmluZ0RlY29kZXIucHJvdG90eXBlLndyaXRlID0gZnVuY3Rpb24oYnVmZmVyKSB7XG4gIHZhciBjaGFyU3RyID0gJyc7XG4gIC8vIGlmIG91ciBsYXN0IHdyaXRlIGVuZGVkIHdpdGggYW4gaW5jb21wbGV0ZSBtdWx0aWJ5dGUgY2hhcmFjdGVyXG4gIHdoaWxlICh0aGlzLmNoYXJMZW5ndGgpIHtcbiAgICAvLyBkZXRlcm1pbmUgaG93IG1hbnkgcmVtYWluaW5nIGJ5dGVzIHRoaXMgYnVmZmVyIGhhcyB0byBvZmZlciBmb3IgdGhpcyBjaGFyXG4gICAgdmFyIGF2YWlsYWJsZSA9IChidWZmZXIubGVuZ3RoID49IHRoaXMuY2hhckxlbmd0aCAtIHRoaXMuY2hhclJlY2VpdmVkKSA/XG4gICAgICAgIHRoaXMuY2hhckxlbmd0aCAtIHRoaXMuY2hhclJlY2VpdmVkIDpcbiAgICAgICAgYnVmZmVyLmxlbmd0aDtcblxuICAgIC8vIGFkZCB0aGUgbmV3IGJ5dGVzIHRvIHRoZSBjaGFyIGJ1ZmZlclxuICAgIGJ1ZmZlci5jb3B5KHRoaXMuY2hhckJ1ZmZlciwgdGhpcy5jaGFyUmVjZWl2ZWQsIDAsIGF2YWlsYWJsZSk7XG4gICAgdGhpcy5jaGFyUmVjZWl2ZWQgKz0gYXZhaWxhYmxlO1xuXG4gICAgaWYgKHRoaXMuY2hhclJlY2VpdmVkIDwgdGhpcy5jaGFyTGVuZ3RoKSB7XG4gICAgICAvLyBzdGlsbCBub3QgZW5vdWdoIGNoYXJzIGluIHRoaXMgYnVmZmVyPyB3YWl0IGZvciBtb3JlIC4uLlxuICAgICAgcmV0dXJuICcnO1xuICAgIH1cblxuICAgIC8vIHJlbW92ZSBieXRlcyBiZWxvbmdpbmcgdG8gdGhlIGN1cnJlbnQgY2hhcmFjdGVyIGZyb20gdGhlIGJ1ZmZlclxuICAgIGJ1ZmZlciA9IGJ1ZmZlci5zbGljZShhdmFpbGFibGUsIGJ1ZmZlci5sZW5ndGgpO1xuXG4gICAgLy8gZ2V0IHRoZSBjaGFyYWN0ZXIgdGhhdCB3YXMgc3BsaXRcbiAgICBjaGFyU3RyID0gdGhpcy5jaGFyQnVmZmVyLnNsaWNlKDAsIHRoaXMuY2hhckxlbmd0aCkudG9TdHJpbmcodGhpcy5lbmNvZGluZyk7XG5cbiAgICAvLyBDRVNVLTg6IGxlYWQgc3Vycm9nYXRlIChEODAwLURCRkYpIGlzIGFsc28gdGhlIGluY29tcGxldGUgY2hhcmFjdGVyXG4gICAgdmFyIGNoYXJDb2RlID0gY2hhclN0ci5jaGFyQ29kZUF0KGNoYXJTdHIubGVuZ3RoIC0gMSk7XG4gICAgaWYgKGNoYXJDb2RlID49IDB4RDgwMCAmJiBjaGFyQ29kZSA8PSAweERCRkYpIHtcbiAgICAgIHRoaXMuY2hhckxlbmd0aCArPSB0aGlzLnN1cnJvZ2F0ZVNpemU7XG4gICAgICBjaGFyU3RyID0gJyc7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgdGhpcy5jaGFyUmVjZWl2ZWQgPSB0aGlzLmNoYXJMZW5ndGggPSAwO1xuXG4gICAgLy8gaWYgdGhlcmUgYXJlIG5vIG1vcmUgYnl0ZXMgaW4gdGhpcyBidWZmZXIsIGp1c3QgZW1pdCBvdXIgY2hhclxuICAgIGlmIChidWZmZXIubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gY2hhclN0cjtcbiAgICB9XG4gICAgYnJlYWs7XG4gIH1cblxuICAvLyBkZXRlcm1pbmUgYW5kIHNldCBjaGFyTGVuZ3RoIC8gY2hhclJlY2VpdmVkXG4gIHRoaXMuZGV0ZWN0SW5jb21wbGV0ZUNoYXIoYnVmZmVyKTtcblxuICB2YXIgZW5kID0gYnVmZmVyLmxlbmd0aDtcbiAgaWYgKHRoaXMuY2hhckxlbmd0aCkge1xuICAgIC8vIGJ1ZmZlciB0aGUgaW5jb21wbGV0ZSBjaGFyYWN0ZXIgYnl0ZXMgd2UgZ290XG4gICAgYnVmZmVyLmNvcHkodGhpcy5jaGFyQnVmZmVyLCAwLCBidWZmZXIubGVuZ3RoIC0gdGhpcy5jaGFyUmVjZWl2ZWQsIGVuZCk7XG4gICAgZW5kIC09IHRoaXMuY2hhclJlY2VpdmVkO1xuICB9XG5cbiAgY2hhclN0ciArPSBidWZmZXIudG9TdHJpbmcodGhpcy5lbmNvZGluZywgMCwgZW5kKTtcblxuICB2YXIgZW5kID0gY2hhclN0ci5sZW5ndGggLSAxO1xuICB2YXIgY2hhckNvZGUgPSBjaGFyU3RyLmNoYXJDb2RlQXQoZW5kKTtcbiAgLy8gQ0VTVS04OiBsZWFkIHN1cnJvZ2F0ZSAoRDgwMC1EQkZGKSBpcyBhbHNvIHRoZSBpbmNvbXBsZXRlIGNoYXJhY3RlclxuICBpZiAoY2hhckNvZGUgPj0gMHhEODAwICYmIGNoYXJDb2RlIDw9IDB4REJGRikge1xuICAgIHZhciBzaXplID0gdGhpcy5zdXJyb2dhdGVTaXplO1xuICAgIHRoaXMuY2hhckxlbmd0aCArPSBzaXplO1xuICAgIHRoaXMuY2hhclJlY2VpdmVkICs9IHNpemU7XG4gICAgdGhpcy5jaGFyQnVmZmVyLmNvcHkodGhpcy5jaGFyQnVmZmVyLCBzaXplLCAwLCBzaXplKTtcbiAgICBidWZmZXIuY29weSh0aGlzLmNoYXJCdWZmZXIsIDAsIDAsIHNpemUpO1xuICAgIHJldHVybiBjaGFyU3RyLnN1YnN0cmluZygwLCBlbmQpO1xuICB9XG5cbiAgLy8gb3IganVzdCBlbWl0IHRoZSBjaGFyU3RyXG4gIHJldHVybiBjaGFyU3RyO1xufTtcblxuLy8gZGV0ZWN0SW5jb21wbGV0ZUNoYXIgZGV0ZXJtaW5lcyBpZiB0aGVyZSBpcyBhbiBpbmNvbXBsZXRlIFVURi04IGNoYXJhY3RlciBhdFxuLy8gdGhlIGVuZCBvZiB0aGUgZ2l2ZW4gYnVmZmVyLiBJZiBzbywgaXQgc2V0cyB0aGlzLmNoYXJMZW5ndGggdG8gdGhlIGJ5dGVcbi8vIGxlbmd0aCB0aGF0IGNoYXJhY3RlciwgYW5kIHNldHMgdGhpcy5jaGFyUmVjZWl2ZWQgdG8gdGhlIG51bWJlciBvZiBieXRlc1xuLy8gdGhhdCBhcmUgYXZhaWxhYmxlIGZvciB0aGlzIGNoYXJhY3Rlci5cblN0cmluZ0RlY29kZXIucHJvdG90eXBlLmRldGVjdEluY29tcGxldGVDaGFyID0gZnVuY3Rpb24oYnVmZmVyKSB7XG4gIC8vIGRldGVybWluZSBob3cgbWFueSBieXRlcyB3ZSBoYXZlIHRvIGNoZWNrIGF0IHRoZSBlbmQgb2YgdGhpcyBidWZmZXJcbiAgdmFyIGkgPSAoYnVmZmVyLmxlbmd0aCA+PSAzKSA/IDMgOiBidWZmZXIubGVuZ3RoO1xuXG4gIC8vIEZpZ3VyZSBvdXQgaWYgb25lIG9mIHRoZSBsYXN0IGkgYnl0ZXMgb2Ygb3VyIGJ1ZmZlciBhbm5vdW5jZXMgYW5cbiAgLy8gaW5jb21wbGV0ZSBjaGFyLlxuICBmb3IgKDsgaSA+IDA7IGktLSkge1xuICAgIHZhciBjID0gYnVmZmVyW2J1ZmZlci5sZW5ndGggLSBpXTtcblxuICAgIC8vIFNlZSBodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL1VURi04I0Rlc2NyaXB0aW9uXG5cbiAgICAvLyAxMTBYWFhYWFxuICAgIGlmIChpID09IDEgJiYgYyA+PiA1ID09IDB4MDYpIHtcbiAgICAgIHRoaXMuY2hhckxlbmd0aCA9IDI7XG4gICAgICBicmVhaztcbiAgICB9XG5cbiAgICAvLyAxMTEwWFhYWFxuICAgIGlmIChpIDw9IDIgJiYgYyA+PiA0ID09IDB4MEUpIHtcbiAgICAgIHRoaXMuY2hhckxlbmd0aCA9IDM7XG4gICAgICBicmVhaztcbiAgICB9XG5cbiAgICAvLyAxMTExMFhYWFxuICAgIGlmIChpIDw9IDMgJiYgYyA+PiAzID09IDB4MUUpIHtcbiAgICAgIHRoaXMuY2hhckxlbmd0aCA9IDQ7XG4gICAgICBicmVhaztcbiAgICB9XG4gIH1cbiAgdGhpcy5jaGFyUmVjZWl2ZWQgPSBpO1xufTtcblxuU3RyaW5nRGVjb2Rlci5wcm90b3R5cGUuZW5kID0gZnVuY3Rpb24oYnVmZmVyKSB7XG4gIHZhciByZXMgPSAnJztcbiAgaWYgKGJ1ZmZlciAmJiBidWZmZXIubGVuZ3RoKVxuICAgIHJlcyA9IHRoaXMud3JpdGUoYnVmZmVyKTtcblxuICBpZiAodGhpcy5jaGFyUmVjZWl2ZWQpIHtcbiAgICB2YXIgY3IgPSB0aGlzLmNoYXJSZWNlaXZlZDtcbiAgICB2YXIgYnVmID0gdGhpcy5jaGFyQnVmZmVyO1xuICAgIHZhciBlbmMgPSB0aGlzLmVuY29kaW5nO1xuICAgIHJlcyArPSBidWYuc2xpY2UoMCwgY3IpLnRvU3RyaW5nKGVuYyk7XG4gIH1cblxuICByZXR1cm4gcmVzO1xufTtcblxuZnVuY3Rpb24gcGFzc1Rocm91Z2hXcml0ZShidWZmZXIpIHtcbiAgcmV0dXJuIGJ1ZmZlci50b1N0cmluZyh0aGlzLmVuY29kaW5nKTtcbn1cblxuZnVuY3Rpb24gdXRmMTZEZXRlY3RJbmNvbXBsZXRlQ2hhcihidWZmZXIpIHtcbiAgdGhpcy5jaGFyUmVjZWl2ZWQgPSBidWZmZXIubGVuZ3RoICUgMjtcbiAgdGhpcy5jaGFyTGVuZ3RoID0gdGhpcy5jaGFyUmVjZWl2ZWQgPyAyIDogMDtcbn1cblxuZnVuY3Rpb24gYmFzZTY0RGV0ZWN0SW5jb21wbGV0ZUNoYXIoYnVmZmVyKSB7XG4gIHRoaXMuY2hhclJlY2VpdmVkID0gYnVmZmVyLmxlbmd0aCAlIDM7XG4gIHRoaXMuY2hhckxlbmd0aCA9IHRoaXMuY2hhclJlY2VpdmVkID8gMyA6IDA7XG59XG4iLCJcbi8qKlxuICogTW9kdWxlIGV4cG9ydHMuXG4gKi9cblxubW9kdWxlLmV4cG9ydHMgPSBkZXByZWNhdGU7XG5cbi8qKlxuICogTWFyayB0aGF0IGEgbWV0aG9kIHNob3VsZCBub3QgYmUgdXNlZC5cbiAqIFJldHVybnMgYSBtb2RpZmllZCBmdW5jdGlvbiB3aGljaCB3YXJucyBvbmNlIGJ5IGRlZmF1bHQuXG4gKlxuICogSWYgYGxvY2FsU3RvcmFnZS5ub0RlcHJlY2F0aW9uID0gdHJ1ZWAgaXMgc2V0LCB0aGVuIGl0IGlzIGEgbm8tb3AuXG4gKlxuICogSWYgYGxvY2FsU3RvcmFnZS50aHJvd0RlcHJlY2F0aW9uID0gdHJ1ZWAgaXMgc2V0LCB0aGVuIGRlcHJlY2F0ZWQgZnVuY3Rpb25zXG4gKiB3aWxsIHRocm93IGFuIEVycm9yIHdoZW4gaW52b2tlZC5cbiAqXG4gKiBJZiBgbG9jYWxTdG9yYWdlLnRyYWNlRGVwcmVjYXRpb24gPSB0cnVlYCBpcyBzZXQsIHRoZW4gZGVwcmVjYXRlZCBmdW5jdGlvbnNcbiAqIHdpbGwgaW52b2tlIGBjb25zb2xlLnRyYWNlKClgIGluc3RlYWQgb2YgYGNvbnNvbGUuZXJyb3IoKWAuXG4gKlxuICogQHBhcmFtIHtGdW5jdGlvbn0gZm4gLSB0aGUgZnVuY3Rpb24gdG8gZGVwcmVjYXRlXG4gKiBAcGFyYW0ge1N0cmluZ30gbXNnIC0gdGhlIHN0cmluZyB0byBwcmludCB0byB0aGUgY29uc29sZSB3aGVuIGBmbmAgaXMgaW52b2tlZFxuICogQHJldHVybnMge0Z1bmN0aW9ufSBhIG5ldyBcImRlcHJlY2F0ZWRcIiB2ZXJzaW9uIG9mIGBmbmBcbiAqIEBhcGkgcHVibGljXG4gKi9cblxuZnVuY3Rpb24gZGVwcmVjYXRlIChmbiwgbXNnKSB7XG4gIGlmIChjb25maWcoJ25vRGVwcmVjYXRpb24nKSkge1xuICAgIHJldHVybiBmbjtcbiAgfVxuXG4gIHZhciB3YXJuZWQgPSBmYWxzZTtcbiAgZnVuY3Rpb24gZGVwcmVjYXRlZCgpIHtcbiAgICBpZiAoIXdhcm5lZCkge1xuICAgICAgaWYgKGNvbmZpZygndGhyb3dEZXByZWNhdGlvbicpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihtc2cpO1xuICAgICAgfSBlbHNlIGlmIChjb25maWcoJ3RyYWNlRGVwcmVjYXRpb24nKSkge1xuICAgICAgICBjb25zb2xlLnRyYWNlKG1zZyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zb2xlLndhcm4obXNnKTtcbiAgICAgIH1cbiAgICAgIHdhcm5lZCA9IHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmbi5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICB9XG5cbiAgcmV0dXJuIGRlcHJlY2F0ZWQ7XG59XG5cbi8qKlxuICogQ2hlY2tzIGBsb2NhbFN0b3JhZ2VgIGZvciBib29sZWFuIHZhbHVlcyBmb3IgdGhlIGdpdmVuIGBuYW1lYC5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gbmFtZVxuICogQHJldHVybnMge0Jvb2xlYW59XG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBjb25maWcgKG5hbWUpIHtcbiAgLy8gYWNjZXNzaW5nIGdsb2JhbC5sb2NhbFN0b3JhZ2UgY2FuIHRyaWdnZXIgYSBET01FeGNlcHRpb24gaW4gc2FuZGJveGVkIGlmcmFtZXNcbiAgdHJ5IHtcbiAgICBpZiAoIWdsb2JhbC5sb2NhbFN0b3JhZ2UpIHJldHVybiBmYWxzZTtcbiAgfSBjYXRjaCAoXykge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICB2YXIgdmFsID0gZ2xvYmFsLmxvY2FsU3RvcmFnZVtuYW1lXTtcbiAgaWYgKG51bGwgPT0gdmFsKSByZXR1cm4gZmFsc2U7XG4gIHJldHVybiBTdHJpbmcodmFsKS50b0xvd2VyQ2FzZSgpID09PSAndHJ1ZSc7XG59XG4iLCJ2YXIgU3RyZWFtID0gKGZ1bmN0aW9uICgpe1xuICB0cnkge1xuICAgIHJldHVybiByZXF1aXJlKCdzdCcgKyAncmVhbScpOyAvLyBoYWNrIHRvIGZpeCBhIGNpcmN1bGFyIGRlcGVuZGVuY3kgaXNzdWUgd2hlbiB1c2VkIHdpdGggYnJvd3NlcmlmeVxuICB9IGNhdGNoKF8pe31cbn0oKSk7XG5leHBvcnRzID0gbW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL2xpYi9fc3RyZWFtX3JlYWRhYmxlLmpzJyk7XG5leHBvcnRzLlN0cmVhbSA9IFN0cmVhbSB8fCBleHBvcnRzO1xuZXhwb3J0cy5SZWFkYWJsZSA9IGV4cG9ydHM7XG5leHBvcnRzLldyaXRhYmxlID0gcmVxdWlyZSgnLi9saWIvX3N0cmVhbV93cml0YWJsZS5qcycpO1xuZXhwb3J0cy5EdXBsZXggPSByZXF1aXJlKCcuL2xpYi9fc3RyZWFtX2R1cGxleC5qcycpO1xuZXhwb3J0cy5UcmFuc2Zvcm0gPSByZXF1aXJlKCcuL2xpYi9fc3RyZWFtX3RyYW5zZm9ybS5qcycpO1xuZXhwb3J0cy5QYXNzVGhyb3VnaCA9IHJlcXVpcmUoJy4vbGliL19zdHJlYW1fcGFzc3Rocm91Z2guanMnKTtcbiIsIid1c2Ugc3RyaWN0JztcblxuZnVuY3Rpb24gbm90TnVsbCh4KSAgeyByZXR1cm4geCAhPSBudWxsOyB9XG5mdW5jdGlvbiB3cmFwKHgpICAgICB7IHJldHVybiAnKCcgKyB4ICsgJyknO31cblxuZnVuY3Rpb24gbWF5YmVRdW90ZSh2YWx1ZSkge1xuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIHJldHVybiAnXCInICsgdmFsdWUgKyAnXCInO1xuICAgIH1cbiAgICByZXR1cm4gdmFsdWU7XG59XG5cbmZ1bmN0aW9uIGxvb2tVcChrZXkpIHtcbiAgICBpZiAoa2V5WzBdID09PSAnJCcpIHtcbiAgICAgICAgcmV0dXJuICdjb250ZXh0LicgKyBrZXkuc3Vic3RyaW5nKDEpO1xuICAgIH1cbiAgICByZXR1cm4gJ2NvbnRleHQuZmVhdHVyZS5wcm9wZXJ0aWVzLicgKyBrZXk7XG59XG5cbmZ1bmN0aW9uIG51bGxWYWx1ZShrZXksIHZhbHVlKSB7XG4gICAgcmV0dXJuICcgdHJ1ZSAnO1xufVxuXG5mdW5jdGlvbiBwcm9wZXJ0eUVxdWFsKGtleSwgdmFsdWUpIHtcbiAgICByZXR1cm4gd3JhcChtYXliZVF1b3RlKHZhbHVlKSArICcgPT09ICcgKyBsb29rVXAoa2V5KSk7XG59XG5cbmZ1bmN0aW9uIHByb3BlcnR5T3Ioa2V5LCB2YWx1ZXMpIHtcbiAgICByZXR1cm4gd3JhcCh2YWx1ZXMubWFwKGZ1bmN0aW9uICh4KSB7IHJldHVybiBwcm9wZXJ0eUVxdWFsKGtleSwgeCk7IH0pLmpvaW4oJyB8fCAnKSk7XG59XG5cbmZ1bmN0aW9uIHByaW50TmVzdGVkKHZhbHVlcywgam9pbmVyKSB7XG4gICAgcmV0dXJuIHdyYXAodmFsdWVzLmZpbHRlcihub3ROdWxsKS5tYXAoZnVuY3Rpb24gKHgpIHtcbiAgICAgICAgcmV0dXJuIHdyYXAoeC5qb2luKCcgJiYgJykpO1xuICAgIH0pLmpvaW4oJyAnICsgam9pbmVyICsgJyAnKSk7XG59XG5cbmZ1bmN0aW9uIGFueShfLCB2YWx1ZXMsIG9wdGlvbnMpIHtcbiAgICByZXR1cm4gKHZhbHVlcyAmJiB2YWx1ZXMubGVuZ3RoID4gMCkgPyBwcmludE5lc3RlZCh2YWx1ZXMubWFwKGZ1bmN0aW9uKHYpIHsgcmV0dXJuIHBhcnNlRmlsdGVyKHYsIG9wdGlvbnMpIH0pLCAnfHwnKSA6ICd0cnVlJztcbn1cblxuZnVuY3Rpb24gYWxsKF8sIHZhbHVlcywgb3B0aW9ucykge1xuICAgIHJldHVybiAodmFsdWVzICYmIHZhbHVlcy5sZW5ndGggPiAwKSA/IHByaW50TmVzdGVkKHZhbHVlcy5tYXAoZnVuY3Rpb24odikgeyByZXR1cm4gcGFyc2VGaWx0ZXIodiwgb3B0aW9ucykgfSksICcmJicpIDogJ3RydWUnO1xufVxuXG5mdW5jdGlvbiBub3Qoa2V5LCB2YWx1ZSwgb3B0aW9ucykge1xuICAgIHJldHVybiAnIScgKyB3cmFwKHBhcnNlRmlsdGVyKHZhbHVlLCBvcHRpb25zKS5qb2luKCcgJiYgJykpO1xufVxuXG5mdW5jdGlvbiBub25lKGtleSwgdmFsdWVzLCBvcHRpb25zKSB7XG4gICAgcmV0dXJuICchJyArIHdyYXAoYW55KG51bGwsIHZhbHVlcywgb3B0aW9ucykpO1xufVxuXG5mdW5jdGlvbiBwcm9wZXJ0eU1hdGNoZXNCb29sZWFuKGtleSwgdmFsdWUpIHtcbiAgICByZXR1cm4gd3JhcChsb29rVXAoa2V5KSArICh2YWx1ZSA/ICcgIT0gJyA6ICcgPT0gJykgICsgJ251bGwnKTtcbn1cblxuZnVuY3Rpb24gcmFuZ2VNYXRjaChrZXksIHZhbHVlcywgb3B0aW9ucykge1xuICAgIHZhciBleHByZXNzaW9ucyA9IFtdO1xuICAgIHZhciB0cmFuc2Zvcm0gPSBvcHRpb25zICYmICh0eXBlb2Ygb3B0aW9ucy5yYW5nZVRyYW5zZm9ybSA9PT0gJ2Z1bmN0aW9uJykgJiYgb3B0aW9ucy5yYW5nZVRyYW5zZm9ybTtcblxuICAgIGlmICh2YWx1ZXMubWF4KSB7XG4gICAgICAgIHZhciBtYXggPSB0cmFuc2Zvcm0gPyB0cmFuc2Zvcm0odmFsdWVzLm1heCkgOiB2YWx1ZXMubWF4O1xuICAgICAgICBleHByZXNzaW9ucy5wdXNoKCcnICsgbG9va1VwKGtleSkgKyAnIDwgJyArIG1heCk7XG4gICAgfVxuXG4gICAgaWYgKHZhbHVlcy5taW4pIHtcbiAgICAgICAgdmFyIG1pbiA9IHRyYW5zZm9ybSA/IG1pbiA9IHRyYW5zZm9ybSh2YWx1ZXMubWluKSA6IHZhbHVlcy5taW47XG4gICAgICAgIGV4cHJlc3Npb25zLnB1c2goJycgKyBsb29rVXAoa2V5KSArICcgPj0gJyArIG1pbik7XG4gICAgfVxuXG4gICAgcmV0dXJuIHdyYXAoZXhwcmVzc2lvbnMuam9pbignICYmICcpKTtcbn1cblxuZnVuY3Rpb24gcGFyc2VGaWx0ZXIoZmlsdGVyLCBvcHRpb25zKSB7XG4gICAgdmFyIGZpbHRlckFTVCA9IFtdO1xuXG4gICAgLy8gRnVuY3Rpb24gZmlsdGVyXG4gICAgaWYgKHR5cGVvZiBmaWx0ZXIgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgcmV0dXJuIFt3cmFwKGZpbHRlci50b1N0cmluZygpICsgJyhjb250ZXh0KScpXTtcbiAgICB9XG4gICAgLy8gQXJyYXkgZmlsdGVyLCBpbXBsaWNpdCAnYW55J1xuICAgIGVsc2UgaWYgKEFycmF5LmlzQXJyYXkoZmlsdGVyKSkge1xuICAgICAgICByZXR1cm4gW2FueShudWxsLCBmaWx0ZXIsIG9wdGlvbnMpXTtcbiAgICB9XG4gICAgLy8gTnVsbCBmaWx0ZXIgb2JqZWN0XG4gICAgZWxzZSBpZiAoZmlsdGVyID09IG51bGwpIHtcbiAgICAgICAgcmV0dXJuIFsndHJ1ZSddO1xuICAgIH1cblxuICAgIC8vIE9iamVjdCBmaWx0ZXIsIGUuZy4gaW1wbGljaXQgJ2FsbCdcbiAgICB2YXIga2V5cyA9IE9iamVjdC5rZXlzKGZpbHRlcik7XG4gICAgZm9yICh2YXIgaz0wOyBrIDwga2V5cy5sZW5ndGg7IGsrKykge1xuICAgICAgICB2YXIga2V5ID0ga2V5c1trXTtcblxuICAgICAgICB2YXIgdmFsdWUgPSBmaWx0ZXJba2V5XSxcbiAgICAgICAgICAgIHR5cGUgID0gdHlwZW9mIHZhbHVlO1xuICAgICAgICBpZiAodHlwZSA9PT0gJ3N0cmluZycgfHwgdHlwZSA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgICAgIGZpbHRlckFTVC5wdXNoKHByb3BlcnR5RXF1YWwoa2V5LCB2YWx1ZSkpO1xuICAgICAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdib29sZWFuJykge1xuICAgICAgICAgICAgZmlsdGVyQVNULnB1c2gocHJvcGVydHlNYXRjaGVzQm9vbGVhbihrZXksIHZhbHVlKSk7XG4gICAgICAgIH0gZWxzZSBpZiAoa2V5ID09PSAnbm90Jykge1xuICAgICAgICAgICAgZmlsdGVyQVNULnB1c2gobm90KGtleSwgdmFsdWUsIG9wdGlvbnMpKTtcbiAgICAgICAgfSBlbHNlIGlmIChrZXkgPT09ICdhbnknKSB7XG4gICAgICAgICAgICBmaWx0ZXJBU1QucHVzaChhbnkoa2V5LCB2YWx1ZSwgb3B0aW9ucykpO1xuICAgICAgICB9IGVsc2UgaWYgKGtleSA9PT0gJ2FsbCcpIHtcbiAgICAgICAgICAgIGZpbHRlckFTVC5wdXNoKGFsbChrZXksIHZhbHVlLCBvcHRpb25zKSk7XG4gICAgICAgIH0gZWxzZSBpZiAoa2V5ID09PSAnbm9uZScpIHtcbiAgICAgICAgICAgIGZpbHRlckFTVC5wdXNoKG5vbmUoa2V5LCB2YWx1ZSwgb3B0aW9ucykpO1xuICAgICAgICB9IGVsc2UgaWYgKEFycmF5LmlzQXJyYXkodmFsdWUpKSB7XG4gICAgICAgICAgICBmaWx0ZXJBU1QucHVzaChwcm9wZXJ0eU9yKGtleSwgdmFsdWUpKTtcbiAgICAgICAgfSBlbHNlIGlmICh0eXBlID09PSAnb2JqZWN0JyAmJiB2YWx1ZSAhPSBudWxsKSB7XG4gICAgICAgICAgICBpZiAodmFsdWUubWF4IHx8IHZhbHVlLm1pbikge1xuICAgICAgICAgICAgICAgIGZpbHRlckFTVC5wdXNoKHJhbmdlTWF0Y2goa2V5LCB2YWx1ZSwgb3B0aW9ucykpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKHZhbHVlID09IG51bGwpIHtcbiAgICAgICAgICAgIGZpbHRlckFTVC5wdXNoKG51bGxWYWx1ZShrZXksIHZhbHVlKSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1Vua25vd24gUXVlcnkgc3l0bmF4OiAnICsgdmFsdWUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGtleXMubGVuZ3RoID09PSAwID8gWyd0cnVlJ10gOiBmaWx0ZXJBU1Q7XG59XG5cbmZ1bmN0aW9uIGZpbHRlclRvU3RyaW5nKGZpbHRlckFTVCkge1xuICAgIHJldHVybiB3cmFwKGZpbHRlckFTVC5qb2luKCcgJiYgJykpO1xufVxuXG5mdW5jdGlvbiBtYXRjaChmaWx0ZXIsIG9wdGlvbnMpIHtcbiAgICBpZiAoZmlsdGVyID09IG51bGwpIHsgcmV0dXJuIGZ1bmN0aW9uICgpIHsgcmV0dXJuIHRydWU7IH07IH1cbiAgICAvLyBqc2hpbnQgZXZpbDogdHJ1ZVxuICAgIHJldHVybiBuZXcgRnVuY3Rpb24oJ2NvbnRleHQnLCAncmV0dXJuICcgKyBmaWx0ZXJUb1N0cmluZyhwYXJzZUZpbHRlcihmaWx0ZXIsIG9wdGlvbnMpKSArICc7Jyk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICAgIG1hdGNoOiBtYXRjaCxcbiAgICBmaWx0ZXJUb1N0cmluZzogZmlsdGVyVG9TdHJpbmcsXG4gICAgcGFyc2VGaWx0ZXI6IHBhcnNlRmlsdGVyXG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG4vLyBsaWdodHdlaWdodCBCdWZmZXIgc2hpbSBmb3IgcGJmIGJyb3dzZXIgYnVpbGRcbi8vIGJhc2VkIG9uIGNvZGUgZnJvbSBnaXRodWIuY29tL2Zlcm9zcy9idWZmZXIgKE1JVC1saWNlbnNlZClcblxubW9kdWxlLmV4cG9ydHMgPSBCdWZmZXI7XG5cbnZhciBpZWVlNzU0ID0gcmVxdWlyZSgnaWVlZTc1NCcpO1xuXG52YXIgQnVmZmVyTWV0aG9kcztcblxuZnVuY3Rpb24gQnVmZmVyKGxlbmd0aCkge1xuICAgIHZhciBhcnI7XG4gICAgaWYgKGxlbmd0aCAmJiBsZW5ndGgubGVuZ3RoKSB7XG4gICAgICAgIGFyciA9IGxlbmd0aDtcbiAgICAgICAgbGVuZ3RoID0gYXJyLmxlbmd0aDtcbiAgICB9XG4gICAgdmFyIGJ1ZiA9IG5ldyBVaW50OEFycmF5KGxlbmd0aCB8fCAwKTtcbiAgICBpZiAoYXJyKSBidWYuc2V0KGFycik7XG5cbiAgICBidWYucmVhZFVJbnQzMkxFID0gQnVmZmVyTWV0aG9kcy5yZWFkVUludDMyTEU7XG4gICAgYnVmLndyaXRlVUludDMyTEUgPSBCdWZmZXJNZXRob2RzLndyaXRlVUludDMyTEU7XG4gICAgYnVmLnJlYWRJbnQzMkxFID0gQnVmZmVyTWV0aG9kcy5yZWFkSW50MzJMRTtcbiAgICBidWYud3JpdGVJbnQzMkxFID0gQnVmZmVyTWV0aG9kcy53cml0ZUludDMyTEU7XG4gICAgYnVmLnJlYWRGbG9hdExFID0gQnVmZmVyTWV0aG9kcy5yZWFkRmxvYXRMRTtcbiAgICBidWYud3JpdGVGbG9hdExFID0gQnVmZmVyTWV0aG9kcy53cml0ZUZsb2F0TEU7XG4gICAgYnVmLnJlYWREb3VibGVMRSA9IEJ1ZmZlck1ldGhvZHMucmVhZERvdWJsZUxFO1xuICAgIGJ1Zi53cml0ZURvdWJsZUxFID0gQnVmZmVyTWV0aG9kcy53cml0ZURvdWJsZUxFO1xuICAgIGJ1Zi50b1N0cmluZyA9IEJ1ZmZlck1ldGhvZHMudG9TdHJpbmc7XG4gICAgYnVmLndyaXRlID0gQnVmZmVyTWV0aG9kcy53cml0ZTtcbiAgICBidWYuc2xpY2UgPSBCdWZmZXJNZXRob2RzLnNsaWNlO1xuICAgIGJ1Zi5jb3B5ID0gQnVmZmVyTWV0aG9kcy5jb3B5O1xuXG4gICAgYnVmLl9pc0J1ZmZlciA9IHRydWU7XG4gICAgcmV0dXJuIGJ1Zjtcbn1cblxudmFyIGxhc3RTdHIsIGxhc3RTdHJFbmNvZGVkO1xuXG5CdWZmZXJNZXRob2RzID0ge1xuICAgIHJlYWRVSW50MzJMRTogZnVuY3Rpb24ocG9zKSB7XG4gICAgICAgIHJldHVybiAoKHRoaXNbcG9zXSkgfFxuICAgICAgICAgICAgKHRoaXNbcG9zICsgMV0gPDwgOCkgfFxuICAgICAgICAgICAgKHRoaXNbcG9zICsgMl0gPDwgMTYpKSArXG4gICAgICAgICAgICAodGhpc1twb3MgKyAzXSAqIDB4MTAwMDAwMCk7XG4gICAgfSxcblxuICAgIHdyaXRlVUludDMyTEU6IGZ1bmN0aW9uKHZhbCwgcG9zKSB7XG4gICAgICAgIHRoaXNbcG9zXSA9IHZhbDtcbiAgICAgICAgdGhpc1twb3MgKyAxXSA9ICh2YWwgPj4+IDgpO1xuICAgICAgICB0aGlzW3BvcyArIDJdID0gKHZhbCA+Pj4gMTYpO1xuICAgICAgICB0aGlzW3BvcyArIDNdID0gKHZhbCA+Pj4gMjQpO1xuICAgIH0sXG5cbiAgICByZWFkSW50MzJMRTogZnVuY3Rpb24ocG9zKSB7XG4gICAgICAgIHJldHVybiAoKHRoaXNbcG9zXSkgfFxuICAgICAgICAgICAgKHRoaXNbcG9zICsgMV0gPDwgOCkgfFxuICAgICAgICAgICAgKHRoaXNbcG9zICsgMl0gPDwgMTYpKSArXG4gICAgICAgICAgICAodGhpc1twb3MgKyAzXSA8PCAyNCk7XG4gICAgfSxcblxuICAgIHJlYWRGbG9hdExFOiAgZnVuY3Rpb24ocG9zKSB7IHJldHVybiBpZWVlNzU0LnJlYWQodGhpcywgcG9zLCB0cnVlLCAyMywgNCk7IH0sXG4gICAgcmVhZERvdWJsZUxFOiBmdW5jdGlvbihwb3MpIHsgcmV0dXJuIGllZWU3NTQucmVhZCh0aGlzLCBwb3MsIHRydWUsIDUyLCA4KTsgfSxcblxuICAgIHdyaXRlRmxvYXRMRTogIGZ1bmN0aW9uKHZhbCwgcG9zKSB7IHJldHVybiBpZWVlNzU0LndyaXRlKHRoaXMsIHZhbCwgcG9zLCB0cnVlLCAyMywgNCk7IH0sXG4gICAgd3JpdGVEb3VibGVMRTogZnVuY3Rpb24odmFsLCBwb3MpIHsgcmV0dXJuIGllZWU3NTQud3JpdGUodGhpcywgdmFsLCBwb3MsIHRydWUsIDUyLCA4KTsgfSxcblxuICAgIHRvU3RyaW5nOiBmdW5jdGlvbihlbmNvZGluZywgc3RhcnQsIGVuZCkge1xuICAgICAgICB2YXIgc3RyID0gJycsXG4gICAgICAgICAgICB0bXAgPSAnJztcblxuICAgICAgICBzdGFydCA9IHN0YXJ0IHx8IDA7XG4gICAgICAgIGVuZCA9IE1hdGgubWluKHRoaXMubGVuZ3RoLCBlbmQgfHwgdGhpcy5sZW5ndGgpO1xuXG4gICAgICAgIGZvciAodmFyIGkgPSBzdGFydDsgaSA8IGVuZDsgaSsrKSB7XG4gICAgICAgICAgICB2YXIgY2ggPSB0aGlzW2ldO1xuICAgICAgICAgICAgaWYgKGNoIDw9IDB4N0YpIHtcbiAgICAgICAgICAgICAgICBzdHIgKz0gZGVjb2RlVVJJQ29tcG9uZW50KHRtcCkgKyBTdHJpbmcuZnJvbUNoYXJDb2RlKGNoKTtcbiAgICAgICAgICAgICAgICB0bXAgPSAnJztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdG1wICs9ICclJyArIGNoLnRvU3RyaW5nKDE2KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHN0ciArPSBkZWNvZGVVUklDb21wb25lbnQodG1wKTtcblxuICAgICAgICByZXR1cm4gc3RyO1xuICAgIH0sXG5cbiAgICB3cml0ZTogZnVuY3Rpb24oc3RyLCBwb3MpIHtcbiAgICAgICAgdmFyIGJ5dGVzID0gc3RyID09PSBsYXN0U3RyID8gbGFzdFN0ckVuY29kZWQgOiBlbmNvZGVTdHJpbmcoc3RyKTtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBieXRlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgdGhpc1twb3MgKyBpXSA9IGJ5dGVzW2ldO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIHNsaWNlOiBmdW5jdGlvbihzdGFydCwgZW5kKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnN1YmFycmF5KHN0YXJ0LCBlbmQpO1xuICAgIH0sXG5cbiAgICBjb3B5OiBmdW5jdGlvbihidWYsIHBvcykge1xuICAgICAgICBwb3MgPSBwb3MgfHwgMDtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBidWZbcG9zICsgaV0gPSB0aGlzW2ldO1xuICAgICAgICB9XG4gICAgfVxufTtcblxuQnVmZmVyTWV0aG9kcy53cml0ZUludDMyTEUgPSBCdWZmZXJNZXRob2RzLndyaXRlVUludDMyTEU7XG5cbkJ1ZmZlci5ieXRlTGVuZ3RoID0gZnVuY3Rpb24oc3RyKSB7XG4gICAgbGFzdFN0ciA9IHN0cjtcbiAgICBsYXN0U3RyRW5jb2RlZCA9IGVuY29kZVN0cmluZyhzdHIpO1xuICAgIHJldHVybiBsYXN0U3RyRW5jb2RlZC5sZW5ndGg7XG59O1xuXG5CdWZmZXIuaXNCdWZmZXIgPSBmdW5jdGlvbihidWYpIHtcbiAgICByZXR1cm4gISEoYnVmICYmIGJ1Zi5faXNCdWZmZXIpO1xufTtcblxuZnVuY3Rpb24gZW5jb2RlU3RyaW5nKHN0cikge1xuICAgIHZhciBsZW5ndGggPSBzdHIubGVuZ3RoLFxuICAgICAgICBieXRlcyA9IFtdO1xuXG4gICAgZm9yICh2YXIgaSA9IDAsIGMsIGxlYWQ7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgICAgICBjID0gc3RyLmNoYXJDb2RlQXQoaSk7IC8vIGNvZGUgcG9pbnRcblxuICAgICAgICBpZiAoYyA+IDB4RDdGRiAmJiBjIDwgMHhFMDAwKSB7XG5cbiAgICAgICAgICAgIGlmIChsZWFkKSB7XG4gICAgICAgICAgICAgICAgaWYgKGMgPCAweERDMDApIHtcbiAgICAgICAgICAgICAgICAgICAgYnl0ZXMucHVzaCgweEVGLCAweEJGLCAweEJEKTtcbiAgICAgICAgICAgICAgICAgICAgbGVhZCA9IGM7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgYyA9IGxlYWQgLSAweEQ4MDAgPDwgMTAgfCBjIC0gMHhEQzAwIHwgMHgxMDAwMDtcbiAgICAgICAgICAgICAgICAgICAgbGVhZCA9IG51bGw7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmIChjID4gMHhEQkZGIHx8IChpICsgMSA9PT0gbGVuZ3RoKSkgYnl0ZXMucHVzaCgweEVGLCAweEJGLCAweEJEKTtcbiAgICAgICAgICAgICAgICBlbHNlIGxlYWQgPSBjO1xuXG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgfSBlbHNlIGlmIChsZWFkKSB7XG4gICAgICAgICAgICBieXRlcy5wdXNoKDB4RUYsIDB4QkYsIDB4QkQpO1xuICAgICAgICAgICAgbGVhZCA9IG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoYyA8IDB4ODApIGJ5dGVzLnB1c2goYyk7XG4gICAgICAgIGVsc2UgaWYgKGMgPCAweDgwMCkgYnl0ZXMucHVzaChjID4+IDB4NiB8IDB4QzAsIGMgJiAweDNGIHwgMHg4MCk7XG4gICAgICAgIGVsc2UgaWYgKGMgPCAweDEwMDAwKSBieXRlcy5wdXNoKGMgPj4gMHhDIHwgMHhFMCwgYyA+PiAweDYgJiAweDNGIHwgMHg4MCwgYyAmIDB4M0YgfCAweDgwKTtcbiAgICAgICAgZWxzZSBieXRlcy5wdXNoKGMgPj4gMHgxMiB8IDB4RjAsIGMgPj4gMHhDICYgMHgzRiB8IDB4ODAsIGMgPj4gMHg2ICYgMHgzRiB8IDB4ODAsIGMgJiAweDNGIHwgMHg4MCk7XG4gICAgfVxuICAgIHJldHVybiBieXRlcztcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxubW9kdWxlLmV4cG9ydHMgPSBQYmY7XG5cbnZhciBCdWZmZXIgPSBnbG9iYWwuQnVmZmVyIHx8IHJlcXVpcmUoJy4vYnVmZmVyJyk7XG5cbmZ1bmN0aW9uIFBiZihidWYpIHtcbiAgICB0aGlzLmJ1ZiA9ICFCdWZmZXIuaXNCdWZmZXIoYnVmKSA/IG5ldyBCdWZmZXIoYnVmIHx8IDApIDogYnVmO1xuICAgIHRoaXMucG9zID0gMDtcbiAgICB0aGlzLmxlbmd0aCA9IHRoaXMuYnVmLmxlbmd0aDtcbn1cblxuUGJmLlZhcmludCAgPSAwOyAvLyB2YXJpbnQ6IGludDMyLCBpbnQ2NCwgdWludDMyLCB1aW50NjQsIHNpbnQzMiwgc2ludDY0LCBib29sLCBlbnVtXG5QYmYuRml4ZWQ2NCA9IDE7IC8vIDY0LWJpdDogZG91YmxlLCBmaXhlZDY0LCBzZml4ZWQ2NFxuUGJmLkJ5dGVzICAgPSAyOyAvLyBsZW5ndGgtZGVsaW1pdGVkOiBzdHJpbmcsIGJ5dGVzLCBlbWJlZGRlZCBtZXNzYWdlcywgcGFja2VkIHJlcGVhdGVkIGZpZWxkc1xuUGJmLkZpeGVkMzIgPSA1OyAvLyAzMi1iaXQ6IGZsb2F0LCBmaXhlZDMyLCBzZml4ZWQzMlxuXG52YXIgU0hJRlRfTEVGVF8zMiA9ICgxIDw8IDE2KSAqICgxIDw8IDE2KSxcbiAgICBTSElGVF9SSUdIVF8zMiA9IDEgLyBTSElGVF9MRUZUXzMyLFxuICAgIFBPV18yXzYzID0gTWF0aC5wb3coMiwgNjMpO1xuXG5QYmYucHJvdG90eXBlID0ge1xuXG4gICAgZGVzdHJveTogZnVuY3Rpb24oKSB7XG4gICAgICAgIHRoaXMuYnVmID0gbnVsbDtcbiAgICB9LFxuXG4gICAgLy8gPT09IFJFQURJTkcgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAgIHJlYWRGaWVsZHM6IGZ1bmN0aW9uKHJlYWRGaWVsZCwgcmVzdWx0LCBlbmQpIHtcbiAgICAgICAgZW5kID0gZW5kIHx8IHRoaXMubGVuZ3RoO1xuXG4gICAgICAgIHdoaWxlICh0aGlzLnBvcyA8IGVuZCkge1xuICAgICAgICAgICAgdmFyIHZhbCA9IHRoaXMucmVhZFZhcmludCgpLFxuICAgICAgICAgICAgICAgIHRhZyA9IHZhbCA+PiAzLFxuICAgICAgICAgICAgICAgIHN0YXJ0UG9zID0gdGhpcy5wb3M7XG5cbiAgICAgICAgICAgIHJlYWRGaWVsZCh0YWcsIHJlc3VsdCwgdGhpcyk7XG5cbiAgICAgICAgICAgIGlmICh0aGlzLnBvcyA9PT0gc3RhcnRQb3MpIHRoaXMuc2tpcCh2YWwpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfSxcblxuICAgIHJlYWRNZXNzYWdlOiBmdW5jdGlvbihyZWFkRmllbGQsIHJlc3VsdCkge1xuICAgICAgICByZXR1cm4gdGhpcy5yZWFkRmllbGRzKHJlYWRGaWVsZCwgcmVzdWx0LCB0aGlzLnJlYWRWYXJpbnQoKSArIHRoaXMucG9zKTtcbiAgICB9LFxuXG4gICAgcmVhZEZpeGVkMzI6IGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgdmFsID0gdGhpcy5idWYucmVhZFVJbnQzMkxFKHRoaXMucG9zKTtcbiAgICAgICAgdGhpcy5wb3MgKz0gNDtcbiAgICAgICAgcmV0dXJuIHZhbDtcbiAgICB9LFxuXG4gICAgcmVhZFNGaXhlZDMyOiBmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIHZhbCA9IHRoaXMuYnVmLnJlYWRJbnQzMkxFKHRoaXMucG9zKTtcbiAgICAgICAgdGhpcy5wb3MgKz0gNDtcbiAgICAgICAgcmV0dXJuIHZhbDtcbiAgICB9LFxuXG4gICAgLy8gNjQtYml0IGludCBoYW5kbGluZyBpcyBiYXNlZCBvbiBnaXRodWIuY29tL2Rwdy9ub2RlLWJ1ZmZlci1tb3JlLWludHMgKE1JVC1saWNlbnNlZClcblxuICAgIHJlYWRGaXhlZDY0OiBmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIHZhbCA9IHRoaXMuYnVmLnJlYWRVSW50MzJMRSh0aGlzLnBvcykgKyB0aGlzLmJ1Zi5yZWFkVUludDMyTEUodGhpcy5wb3MgKyA0KSAqIFNISUZUX0xFRlRfMzI7XG4gICAgICAgIHRoaXMucG9zICs9IDg7XG4gICAgICAgIHJldHVybiB2YWw7XG4gICAgfSxcblxuICAgIHJlYWRTRml4ZWQ2NDogZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciB2YWwgPSB0aGlzLmJ1Zi5yZWFkVUludDMyTEUodGhpcy5wb3MpICsgdGhpcy5idWYucmVhZEludDMyTEUodGhpcy5wb3MgKyA0KSAqIFNISUZUX0xFRlRfMzI7XG4gICAgICAgIHRoaXMucG9zICs9IDg7XG4gICAgICAgIHJldHVybiB2YWw7XG4gICAgfSxcblxuICAgIHJlYWRGbG9hdDogZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciB2YWwgPSB0aGlzLmJ1Zi5yZWFkRmxvYXRMRSh0aGlzLnBvcyk7XG4gICAgICAgIHRoaXMucG9zICs9IDQ7XG4gICAgICAgIHJldHVybiB2YWw7XG4gICAgfSxcblxuICAgIHJlYWREb3VibGU6IGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgdmFsID0gdGhpcy5idWYucmVhZERvdWJsZUxFKHRoaXMucG9zKTtcbiAgICAgICAgdGhpcy5wb3MgKz0gODtcbiAgICAgICAgcmV0dXJuIHZhbDtcbiAgICB9LFxuXG4gICAgcmVhZFZhcmludDogZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciBidWYgPSB0aGlzLmJ1ZixcbiAgICAgICAgICAgIHZhbCwgYiwgYjAsIGIxLCBiMiwgYjM7XG5cbiAgICAgICAgYjAgPSBidWZbdGhpcy5wb3MrK107IGlmIChiMCA8IDB4ODApIHJldHVybiBiMDsgICAgICAgICAgICAgICAgIGIwID0gYjAgJiAweDdmO1xuICAgICAgICBiMSA9IGJ1Zlt0aGlzLnBvcysrXTsgaWYgKGIxIDwgMHg4MCkgcmV0dXJuIGIwIHwgYjEgPDwgNzsgICAgICAgYjEgPSAoYjEgJiAweDdmKSA8PCA3O1xuICAgICAgICBiMiA9IGJ1Zlt0aGlzLnBvcysrXTsgaWYgKGIyIDwgMHg4MCkgcmV0dXJuIGIwIHwgYjEgfCBiMiA8PCAxNDsgYjIgPSAoYjIgJiAweDdmKSA8PCAxNDtcbiAgICAgICAgYjMgPSBidWZbdGhpcy5wb3MrK107IGlmIChiMyA8IDB4ODApIHJldHVybiBiMCB8IGIxIHwgYjIgfCBiMyA8PCAyMTtcblxuICAgICAgICB2YWwgPSBiMCB8IGIxIHwgYjIgfCAoYjMgJiAweDdmKSA8PCAyMTtcblxuICAgICAgICBiID0gYnVmW3RoaXMucG9zKytdOyB2YWwgKz0gKGIgJiAweDdmKSAqIDB4MTAwMDAwMDA7ICAgICAgICAgaWYgKGIgPCAweDgwKSByZXR1cm4gdmFsO1xuICAgICAgICBiID0gYnVmW3RoaXMucG9zKytdOyB2YWwgKz0gKGIgJiAweDdmKSAqIDB4ODAwMDAwMDAwOyAgICAgICAgaWYgKGIgPCAweDgwKSByZXR1cm4gdmFsO1xuICAgICAgICBiID0gYnVmW3RoaXMucG9zKytdOyB2YWwgKz0gKGIgJiAweDdmKSAqIDB4NDAwMDAwMDAwMDA7ICAgICAgaWYgKGIgPCAweDgwKSByZXR1cm4gdmFsO1xuICAgICAgICBiID0gYnVmW3RoaXMucG9zKytdOyB2YWwgKz0gKGIgJiAweDdmKSAqIDB4MjAwMDAwMDAwMDAwMDsgICAgaWYgKGIgPCAweDgwKSByZXR1cm4gdmFsO1xuICAgICAgICBiID0gYnVmW3RoaXMucG9zKytdOyB2YWwgKz0gKGIgJiAweDdmKSAqIDB4MTAwMDAwMDAwMDAwMDAwOyAgaWYgKGIgPCAweDgwKSByZXR1cm4gdmFsO1xuICAgICAgICBiID0gYnVmW3RoaXMucG9zKytdOyB2YWwgKz0gKGIgJiAweDdmKSAqIDB4ODAwMDAwMDAwMDAwMDAwMDsgaWYgKGIgPCAweDgwKSByZXR1cm4gdmFsO1xuXG4gICAgICAgIHRocm93IG5ldyBFcnJvcignRXhwZWN0ZWQgdmFyaW50IG5vdCBtb3JlIHRoYW4gMTAgYnl0ZXMnKTtcbiAgICB9LFxuXG4gICAgcmVhZFZhcmludDY0OiBmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIHN0YXJ0UG9zID0gdGhpcy5wb3MsXG4gICAgICAgICAgICB2YWwgPSB0aGlzLnJlYWRWYXJpbnQoKTtcblxuICAgICAgICBpZiAodmFsIDwgUE9XXzJfNjMpIHJldHVybiB2YWw7XG5cbiAgICAgICAgdmFyIHBvcyA9IHRoaXMucG9zIC0gMjtcbiAgICAgICAgd2hpbGUgKHRoaXMuYnVmW3Bvc10gPT09IDB4ZmYpIHBvcy0tO1xuICAgICAgICBpZiAocG9zIDwgc3RhcnRQb3MpIHBvcyA9IHN0YXJ0UG9zO1xuXG4gICAgICAgIHZhbCA9IDA7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcG9zIC0gc3RhcnRQb3MgKyAxOyBpKyspIHtcbiAgICAgICAgICAgIHZhciBiID0gfnRoaXMuYnVmW3N0YXJ0UG9zICsgaV0gJiAweDdmO1xuICAgICAgICAgICAgdmFsICs9IGkgPCA0ID8gYiA8PCBpICogNyA6IGIgKiBNYXRoLnBvdygyLCBpICogNyk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gLXZhbCAtIDE7XG4gICAgfSxcblxuICAgIHJlYWRTVmFyaW50OiBmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIG51bSA9IHRoaXMucmVhZFZhcmludCgpO1xuICAgICAgICByZXR1cm4gbnVtICUgMiA9PT0gMSA/IChudW0gKyAxKSAvIC0yIDogbnVtIC8gMjsgLy8gemlnemFnIGVuY29kaW5nXG4gICAgfSxcblxuICAgIHJlYWRCb29sZWFuOiBmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIEJvb2xlYW4odGhpcy5yZWFkVmFyaW50KCkpO1xuICAgIH0sXG5cbiAgICByZWFkU3RyaW5nOiBmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIGVuZCA9IHRoaXMucmVhZFZhcmludCgpICsgdGhpcy5wb3MsXG4gICAgICAgICAgICBzdHIgPSB0aGlzLmJ1Zi50b1N0cmluZygndXRmOCcsIHRoaXMucG9zLCBlbmQpO1xuICAgICAgICB0aGlzLnBvcyA9IGVuZDtcbiAgICAgICAgcmV0dXJuIHN0cjtcbiAgICB9LFxuXG4gICAgcmVhZEJ5dGVzOiBmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIGVuZCA9IHRoaXMucmVhZFZhcmludCgpICsgdGhpcy5wb3MsXG4gICAgICAgICAgICBidWZmZXIgPSB0aGlzLmJ1Zi5zbGljZSh0aGlzLnBvcywgZW5kKTtcbiAgICAgICAgdGhpcy5wb3MgPSBlbmQ7XG4gICAgICAgIHJldHVybiBidWZmZXI7XG4gICAgfSxcblxuICAgIC8vIHZlcmJvc2UgZm9yIHBlcmZvcm1hbmNlIHJlYXNvbnM7IGRvZXNuJ3QgYWZmZWN0IGd6aXBwZWQgc2l6ZVxuXG4gICAgcmVhZFBhY2tlZFZhcmludDogZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciBlbmQgPSB0aGlzLnJlYWRWYXJpbnQoKSArIHRoaXMucG9zLCBhcnIgPSBbXTtcbiAgICAgICAgd2hpbGUgKHRoaXMucG9zIDwgZW5kKSBhcnIucHVzaCh0aGlzLnJlYWRWYXJpbnQoKSk7XG4gICAgICAgIHJldHVybiBhcnI7XG4gICAgfSxcbiAgICByZWFkUGFja2VkU1ZhcmludDogZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciBlbmQgPSB0aGlzLnJlYWRWYXJpbnQoKSArIHRoaXMucG9zLCBhcnIgPSBbXTtcbiAgICAgICAgd2hpbGUgKHRoaXMucG9zIDwgZW5kKSBhcnIucHVzaCh0aGlzLnJlYWRTVmFyaW50KCkpO1xuICAgICAgICByZXR1cm4gYXJyO1xuICAgIH0sXG4gICAgcmVhZFBhY2tlZEJvb2xlYW46IGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgZW5kID0gdGhpcy5yZWFkVmFyaW50KCkgKyB0aGlzLnBvcywgYXJyID0gW107XG4gICAgICAgIHdoaWxlICh0aGlzLnBvcyA8IGVuZCkgYXJyLnB1c2godGhpcy5yZWFkQm9vbGVhbigpKTtcbiAgICAgICAgcmV0dXJuIGFycjtcbiAgICB9LFxuICAgIHJlYWRQYWNrZWRGbG9hdDogZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciBlbmQgPSB0aGlzLnJlYWRWYXJpbnQoKSArIHRoaXMucG9zLCBhcnIgPSBbXTtcbiAgICAgICAgd2hpbGUgKHRoaXMucG9zIDwgZW5kKSBhcnIucHVzaCh0aGlzLnJlYWRGbG9hdCgpKTtcbiAgICAgICAgcmV0dXJuIGFycjtcbiAgICB9LFxuICAgIHJlYWRQYWNrZWREb3VibGU6IGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgZW5kID0gdGhpcy5yZWFkVmFyaW50KCkgKyB0aGlzLnBvcywgYXJyID0gW107XG4gICAgICAgIHdoaWxlICh0aGlzLnBvcyA8IGVuZCkgYXJyLnB1c2godGhpcy5yZWFkRG91YmxlKCkpO1xuICAgICAgICByZXR1cm4gYXJyO1xuICAgIH0sXG4gICAgcmVhZFBhY2tlZEZpeGVkMzI6IGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgZW5kID0gdGhpcy5yZWFkVmFyaW50KCkgKyB0aGlzLnBvcywgYXJyID0gW107XG4gICAgICAgIHdoaWxlICh0aGlzLnBvcyA8IGVuZCkgYXJyLnB1c2godGhpcy5yZWFkRml4ZWQzMigpKTtcbiAgICAgICAgcmV0dXJuIGFycjtcbiAgICB9LFxuICAgIHJlYWRQYWNrZWRTRml4ZWQzMjogZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciBlbmQgPSB0aGlzLnJlYWRWYXJpbnQoKSArIHRoaXMucG9zLCBhcnIgPSBbXTtcbiAgICAgICAgd2hpbGUgKHRoaXMucG9zIDwgZW5kKSBhcnIucHVzaCh0aGlzLnJlYWRTRml4ZWQzMigpKTtcbiAgICAgICAgcmV0dXJuIGFycjtcbiAgICB9LFxuICAgIHJlYWRQYWNrZWRGaXhlZDY0OiBmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIGVuZCA9IHRoaXMucmVhZFZhcmludCgpICsgdGhpcy5wb3MsIGFyciA9IFtdO1xuICAgICAgICB3aGlsZSAodGhpcy5wb3MgPCBlbmQpIGFyci5wdXNoKHRoaXMucmVhZEZpeGVkNjQoKSk7XG4gICAgICAgIHJldHVybiBhcnI7XG4gICAgfSxcbiAgICByZWFkUGFja2VkU0ZpeGVkNjQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgZW5kID0gdGhpcy5yZWFkVmFyaW50KCkgKyB0aGlzLnBvcywgYXJyID0gW107XG4gICAgICAgIHdoaWxlICh0aGlzLnBvcyA8IGVuZCkgYXJyLnB1c2godGhpcy5yZWFkU0ZpeGVkNjQoKSk7XG4gICAgICAgIHJldHVybiBhcnI7XG4gICAgfSxcblxuICAgIHNraXA6IGZ1bmN0aW9uKHZhbCkge1xuICAgICAgICB2YXIgdHlwZSA9IHZhbCAmIDB4NztcbiAgICAgICAgaWYgKHR5cGUgPT09IFBiZi5WYXJpbnQpIHdoaWxlICh0aGlzLmJ1Zlt0aGlzLnBvcysrXSA+IDB4N2YpIHt9XG4gICAgICAgIGVsc2UgaWYgKHR5cGUgPT09IFBiZi5CeXRlcykgdGhpcy5wb3MgPSB0aGlzLnJlYWRWYXJpbnQoKSArIHRoaXMucG9zO1xuICAgICAgICBlbHNlIGlmICh0eXBlID09PSBQYmYuRml4ZWQzMikgdGhpcy5wb3MgKz0gNDtcbiAgICAgICAgZWxzZSBpZiAodHlwZSA9PT0gUGJmLkZpeGVkNjQpIHRoaXMucG9zICs9IDg7XG4gICAgICAgIGVsc2UgdGhyb3cgbmV3IEVycm9yKCdVbmltcGxlbWVudGVkIHR5cGU6ICcgKyB0eXBlKTtcbiAgICB9LFxuXG4gICAgLy8gPT09IFdSSVRJTkcgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAgIHdyaXRlVGFnOiBmdW5jdGlvbih0YWcsIHR5cGUpIHtcbiAgICAgICAgdGhpcy53cml0ZVZhcmludCgodGFnIDw8IDMpIHwgdHlwZSk7XG4gICAgfSxcblxuICAgIHJlYWxsb2M6IGZ1bmN0aW9uKG1pbikge1xuICAgICAgICB2YXIgbGVuZ3RoID0gdGhpcy5sZW5ndGggfHwgMTY7XG5cbiAgICAgICAgd2hpbGUgKGxlbmd0aCA8IHRoaXMucG9zICsgbWluKSBsZW5ndGggKj0gMjtcblxuICAgICAgICBpZiAobGVuZ3RoICE9PSB0aGlzLmxlbmd0aCkge1xuICAgICAgICAgICAgdmFyIGJ1ZiA9IG5ldyBCdWZmZXIobGVuZ3RoKTtcbiAgICAgICAgICAgIHRoaXMuYnVmLmNvcHkoYnVmKTtcbiAgICAgICAgICAgIHRoaXMuYnVmID0gYnVmO1xuICAgICAgICAgICAgdGhpcy5sZW5ndGggPSBsZW5ndGg7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgZmluaXNoOiBmdW5jdGlvbigpIHtcbiAgICAgICAgdGhpcy5sZW5ndGggPSB0aGlzLnBvcztcbiAgICAgICAgdGhpcy5wb3MgPSAwO1xuICAgICAgICByZXR1cm4gdGhpcy5idWYuc2xpY2UoMCwgdGhpcy5sZW5ndGgpO1xuICAgIH0sXG5cbiAgICB3cml0ZUZpeGVkMzI6IGZ1bmN0aW9uKHZhbCkge1xuICAgICAgICB0aGlzLnJlYWxsb2MoNCk7XG4gICAgICAgIHRoaXMuYnVmLndyaXRlVUludDMyTEUodmFsLCB0aGlzLnBvcyk7XG4gICAgICAgIHRoaXMucG9zICs9IDQ7XG4gICAgfSxcblxuICAgIHdyaXRlU0ZpeGVkMzI6IGZ1bmN0aW9uKHZhbCkge1xuICAgICAgICB0aGlzLnJlYWxsb2MoNCk7XG4gICAgICAgIHRoaXMuYnVmLndyaXRlSW50MzJMRSh2YWwsIHRoaXMucG9zKTtcbiAgICAgICAgdGhpcy5wb3MgKz0gNDtcbiAgICB9LFxuXG4gICAgd3JpdGVGaXhlZDY0OiBmdW5jdGlvbih2YWwpIHtcbiAgICAgICAgdGhpcy5yZWFsbG9jKDgpO1xuICAgICAgICB0aGlzLmJ1Zi53cml0ZUludDMyTEUodmFsICYgLTEsIHRoaXMucG9zKTtcbiAgICAgICAgdGhpcy5idWYud3JpdGVVSW50MzJMRShNYXRoLmZsb29yKHZhbCAqIFNISUZUX1JJR0hUXzMyKSwgdGhpcy5wb3MgKyA0KTtcbiAgICAgICAgdGhpcy5wb3MgKz0gODtcbiAgICB9LFxuXG4gICAgd3JpdGVTRml4ZWQ2NDogZnVuY3Rpb24odmFsKSB7XG4gICAgICAgIHRoaXMucmVhbGxvYyg4KTtcbiAgICAgICAgdGhpcy5idWYud3JpdGVJbnQzMkxFKHZhbCAmIC0xLCB0aGlzLnBvcyk7XG4gICAgICAgIHRoaXMuYnVmLndyaXRlSW50MzJMRShNYXRoLmZsb29yKHZhbCAqIFNISUZUX1JJR0hUXzMyKSwgdGhpcy5wb3MgKyA0KTtcbiAgICAgICAgdGhpcy5wb3MgKz0gODtcbiAgICB9LFxuXG4gICAgd3JpdGVWYXJpbnQ6IGZ1bmN0aW9uKHZhbCkge1xuICAgICAgICB2YWwgPSArdmFsO1xuXG4gICAgICAgIGlmICh2YWwgPD0gMHg3Zikge1xuICAgICAgICAgICAgdGhpcy5yZWFsbG9jKDEpO1xuICAgICAgICAgICAgdGhpcy5idWZbdGhpcy5wb3MrK10gPSB2YWw7XG5cbiAgICAgICAgfSBlbHNlIGlmICh2YWwgPD0gMHgzZmZmKSB7XG4gICAgICAgICAgICB0aGlzLnJlYWxsb2MoMik7XG4gICAgICAgICAgICB0aGlzLmJ1Zlt0aGlzLnBvcysrXSA9ICgodmFsID4+PiAwKSAmIDB4N2YpIHwgMHg4MDtcbiAgICAgICAgICAgIHRoaXMuYnVmW3RoaXMucG9zKytdID0gKCh2YWwgPj4+IDcpICYgMHg3Zik7XG5cbiAgICAgICAgfSBlbHNlIGlmICh2YWwgPD0gMHgxZmZmZmYpIHtcbiAgICAgICAgICAgIHRoaXMucmVhbGxvYygzKTtcbiAgICAgICAgICAgIHRoaXMuYnVmW3RoaXMucG9zKytdID0gKCh2YWwgPj4+IDApICYgMHg3ZikgfCAweDgwO1xuICAgICAgICAgICAgdGhpcy5idWZbdGhpcy5wb3MrK10gPSAoKHZhbCA+Pj4gNykgJiAweDdmKSB8IDB4ODA7XG4gICAgICAgICAgICB0aGlzLmJ1Zlt0aGlzLnBvcysrXSA9ICgodmFsID4+PiAxNCkgJiAweDdmKTtcblxuICAgICAgICB9IGVsc2UgaWYgKHZhbCA8PSAweGZmZmZmZmYpIHtcbiAgICAgICAgICAgIHRoaXMucmVhbGxvYyg0KTtcbiAgICAgICAgICAgIHRoaXMuYnVmW3RoaXMucG9zKytdID0gKCh2YWwgPj4+IDApICYgMHg3ZikgfCAweDgwO1xuICAgICAgICAgICAgdGhpcy5idWZbdGhpcy5wb3MrK10gPSAoKHZhbCA+Pj4gNykgJiAweDdmKSB8IDB4ODA7XG4gICAgICAgICAgICB0aGlzLmJ1Zlt0aGlzLnBvcysrXSA9ICgodmFsID4+PiAxNCkgJiAweDdmKSB8IDB4ODA7XG4gICAgICAgICAgICB0aGlzLmJ1Zlt0aGlzLnBvcysrXSA9ICgodmFsID4+PiAyMSkgJiAweDdmKTtcblxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdmFyIHBvcyA9IHRoaXMucG9zO1xuICAgICAgICAgICAgd2hpbGUgKHZhbCA+PSAweDgwKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5yZWFsbG9jKDEpO1xuICAgICAgICAgICAgICAgIHRoaXMuYnVmW3RoaXMucG9zKytdID0gKHZhbCAmIDB4ZmYpIHwgMHg4MDtcbiAgICAgICAgICAgICAgICB2YWwgLz0gMHg4MDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMucmVhbGxvYygxKTtcbiAgICAgICAgICAgIHRoaXMuYnVmW3RoaXMucG9zKytdID0gdmFsIHwgMDtcbiAgICAgICAgICAgIGlmICh0aGlzLnBvcyAtIHBvcyA+IDEwKSB0aHJvdyBuZXcgRXJyb3IoJ0dpdmVuIHZhcmludCBkb2VzblxcJ3QgZml0IGludG8gMTAgYnl0ZXMnKTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICB3cml0ZVNWYXJpbnQ6IGZ1bmN0aW9uKHZhbCkge1xuICAgICAgICB0aGlzLndyaXRlVmFyaW50KHZhbCA8IDAgPyAtdmFsICogMiAtIDEgOiB2YWwgKiAyKTtcbiAgICB9LFxuXG4gICAgd3JpdGVCb29sZWFuOiBmdW5jdGlvbih2YWwpIHtcbiAgICAgICAgdGhpcy53cml0ZVZhcmludChCb29sZWFuKHZhbCkpO1xuICAgIH0sXG5cbiAgICB3cml0ZVN0cmluZzogZnVuY3Rpb24oc3RyKSB7XG4gICAgICAgIHN0ciA9IFN0cmluZyhzdHIpO1xuICAgICAgICB2YXIgYnl0ZXMgPSBCdWZmZXIuYnl0ZUxlbmd0aChzdHIpO1xuICAgICAgICB0aGlzLndyaXRlVmFyaW50KGJ5dGVzKTtcbiAgICAgICAgdGhpcy5yZWFsbG9jKGJ5dGVzKTtcbiAgICAgICAgdGhpcy5idWYud3JpdGUoc3RyLCB0aGlzLnBvcyk7XG4gICAgICAgIHRoaXMucG9zICs9IGJ5dGVzO1xuICAgIH0sXG5cbiAgICB3cml0ZUZsb2F0OiBmdW5jdGlvbih2YWwpIHtcbiAgICAgICAgdGhpcy5yZWFsbG9jKDQpO1xuICAgICAgICB0aGlzLmJ1Zi53cml0ZUZsb2F0TEUodmFsLCB0aGlzLnBvcyk7XG4gICAgICAgIHRoaXMucG9zICs9IDQ7XG4gICAgfSxcblxuICAgIHdyaXRlRG91YmxlOiBmdW5jdGlvbih2YWwpIHtcbiAgICAgICAgdGhpcy5yZWFsbG9jKDgpO1xuICAgICAgICB0aGlzLmJ1Zi53cml0ZURvdWJsZUxFKHZhbCwgdGhpcy5wb3MpO1xuICAgICAgICB0aGlzLnBvcyArPSA4O1xuICAgIH0sXG5cbiAgICB3cml0ZUJ5dGVzOiBmdW5jdGlvbihidWZmZXIpIHtcbiAgICAgICAgdmFyIGxlbiA9IGJ1ZmZlci5sZW5ndGg7XG4gICAgICAgIHRoaXMud3JpdGVWYXJpbnQobGVuKTtcbiAgICAgICAgdGhpcy5yZWFsbG9jKGxlbik7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyBpKyspIHRoaXMuYnVmW3RoaXMucG9zKytdID0gYnVmZmVyW2ldO1xuICAgIH0sXG5cbiAgICB3cml0ZU1lc3NhZ2U6IGZ1bmN0aW9uKHRhZywgZm4sIG9iaikge1xuICAgICAgICB0aGlzLndyaXRlVGFnKHRhZywgUGJmLkJ5dGVzKTtcblxuICAgICAgICB0aGlzLnBvcysrOyAvLyByZXNlcnZlIDEgYnl0ZSBmb3Igc2hvcnQgbWVzc2FnZSBsZW5ndGhcblxuICAgICAgICAvLyB3cml0ZSB0aGUgbWVzc2FnZSBkaXJlY3RseSB0byB0aGUgYnVmZmVyIGFuZCBzZWUgaG93IG11Y2ggd2FzIHdyaXR0ZW5cbiAgICAgICAgdmFyIHN0YXJ0UG9zID0gdGhpcy5wb3M7XG4gICAgICAgIGZuKG9iaiwgdGhpcyk7XG4gICAgICAgIHZhciBsZW4gPSB0aGlzLnBvcyAtIHN0YXJ0UG9zO1xuXG4gICAgICAgIHZhciB2YXJpbnRMZW4gPVxuICAgICAgICAgICAgbGVuIDw9IDB4N2YgPyAxIDpcbiAgICAgICAgICAgIGxlbiA8PSAweDNmZmYgPyAyIDpcbiAgICAgICAgICAgIGxlbiA8PSAweDFmZmZmZiA/IDMgOlxuICAgICAgICAgICAgbGVuIDw9IDB4ZmZmZmZmZiA/IDQgOiBNYXRoLmNlaWwoTWF0aC5sb2cobGVuKSAvIChNYXRoLkxOMiAqIDcpKTtcblxuICAgICAgICAvLyBpZiAxIGJ5dGUgaXNuJ3QgZW5vdWdoIGZvciBlbmNvZGluZyBtZXNzYWdlIGxlbmd0aCwgc2hpZnQgdGhlIGRhdGEgdG8gdGhlIHJpZ2h0XG4gICAgICAgIGlmICh2YXJpbnRMZW4gPiAxKSB7XG4gICAgICAgICAgICB0aGlzLnJlYWxsb2ModmFyaW50TGVuIC0gMSk7XG4gICAgICAgICAgICBmb3IgKHZhciBpID0gdGhpcy5wb3MgLSAxOyBpID49IHN0YXJ0UG9zOyBpLS0pIHRoaXMuYnVmW2kgKyB2YXJpbnRMZW4gLSAxXSA9IHRoaXMuYnVmW2ldO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gZmluYWxseSwgd3JpdGUgdGhlIG1lc3NhZ2UgbGVuZ3RoIGluIHRoZSByZXNlcnZlZCBwbGFjZSBhbmQgcmVzdG9yZSB0aGUgcG9zaXRpb25cbiAgICAgICAgdGhpcy5wb3MgPSBzdGFydFBvcyAtIDE7XG4gICAgICAgIHRoaXMud3JpdGVWYXJpbnQobGVuKTtcbiAgICAgICAgdGhpcy5wb3MgKz0gbGVuO1xuICAgIH0sXG5cbiAgICB3cml0ZVBhY2tlZFZhcmludDogICBmdW5jdGlvbih0YWcsIGFycikgeyB0aGlzLndyaXRlTWVzc2FnZSh0YWcsIHdyaXRlUGFja2VkVmFyaW50LCBhcnIpOyAgIH0sXG4gICAgd3JpdGVQYWNrZWRTVmFyaW50OiAgZnVuY3Rpb24odGFnLCBhcnIpIHsgdGhpcy53cml0ZU1lc3NhZ2UodGFnLCB3cml0ZVBhY2tlZFNWYXJpbnQsIGFycik7ICB9LFxuICAgIHdyaXRlUGFja2VkQm9vbGVhbjogIGZ1bmN0aW9uKHRhZywgYXJyKSB7IHRoaXMud3JpdGVNZXNzYWdlKHRhZywgd3JpdGVQYWNrZWRCb29sZWFuLCBhcnIpOyAgfSxcbiAgICB3cml0ZVBhY2tlZEZsb2F0OiAgICBmdW5jdGlvbih0YWcsIGFycikgeyB0aGlzLndyaXRlTWVzc2FnZSh0YWcsIHdyaXRlUGFja2VkRmxvYXQsIGFycik7ICAgIH0sXG4gICAgd3JpdGVQYWNrZWREb3VibGU6ICAgZnVuY3Rpb24odGFnLCBhcnIpIHsgdGhpcy53cml0ZU1lc3NhZ2UodGFnLCB3cml0ZVBhY2tlZERvdWJsZSwgYXJyKTsgICB9LFxuICAgIHdyaXRlUGFja2VkRml4ZWQzMjogIGZ1bmN0aW9uKHRhZywgYXJyKSB7IHRoaXMud3JpdGVNZXNzYWdlKHRhZywgd3JpdGVQYWNrZWRGaXhlZDMyLCBhcnIpOyAgfSxcbiAgICB3cml0ZVBhY2tlZFNGaXhlZDMyOiBmdW5jdGlvbih0YWcsIGFycikgeyB0aGlzLndyaXRlTWVzc2FnZSh0YWcsIHdyaXRlUGFja2VkU0ZpeGVkMzIsIGFycik7IH0sXG4gICAgd3JpdGVQYWNrZWRGaXhlZDY0OiAgZnVuY3Rpb24odGFnLCBhcnIpIHsgdGhpcy53cml0ZU1lc3NhZ2UodGFnLCB3cml0ZVBhY2tlZEZpeGVkNjQsIGFycik7ICB9LFxuICAgIHdyaXRlUGFja2VkU0ZpeGVkNjQ6IGZ1bmN0aW9uKHRhZywgYXJyKSB7IHRoaXMud3JpdGVNZXNzYWdlKHRhZywgd3JpdGVQYWNrZWRTRml4ZWQ2NCwgYXJyKTsgfSxcblxuICAgIHdyaXRlQnl0ZXNGaWVsZDogZnVuY3Rpb24odGFnLCBidWZmZXIpIHtcbiAgICAgICAgdGhpcy53cml0ZVRhZyh0YWcsIFBiZi5CeXRlcyk7XG4gICAgICAgIHRoaXMud3JpdGVCeXRlcyhidWZmZXIpO1xuICAgIH0sXG4gICAgd3JpdGVGaXhlZDMyRmllbGQ6IGZ1bmN0aW9uKHRhZywgdmFsKSB7XG4gICAgICAgIHRoaXMud3JpdGVUYWcodGFnLCBQYmYuRml4ZWQzMik7XG4gICAgICAgIHRoaXMud3JpdGVGaXhlZDMyKHZhbCk7XG4gICAgfSxcbiAgICB3cml0ZVNGaXhlZDMyRmllbGQ6IGZ1bmN0aW9uKHRhZywgdmFsKSB7XG4gICAgICAgIHRoaXMud3JpdGVUYWcodGFnLCBQYmYuRml4ZWQzMik7XG4gICAgICAgIHRoaXMud3JpdGVTRml4ZWQzMih2YWwpO1xuICAgIH0sXG4gICAgd3JpdGVGaXhlZDY0RmllbGQ6IGZ1bmN0aW9uKHRhZywgdmFsKSB7XG4gICAgICAgIHRoaXMud3JpdGVUYWcodGFnLCBQYmYuRml4ZWQ2NCk7XG4gICAgICAgIHRoaXMud3JpdGVGaXhlZDY0KHZhbCk7XG4gICAgfSxcbiAgICB3cml0ZVNGaXhlZDY0RmllbGQ6IGZ1bmN0aW9uKHRhZywgdmFsKSB7XG4gICAgICAgIHRoaXMud3JpdGVUYWcodGFnLCBQYmYuRml4ZWQ2NCk7XG4gICAgICAgIHRoaXMud3JpdGVTRml4ZWQ2NCh2YWwpO1xuICAgIH0sXG4gICAgd3JpdGVWYXJpbnRGaWVsZDogZnVuY3Rpb24odGFnLCB2YWwpIHtcbiAgICAgICAgdGhpcy53cml0ZVRhZyh0YWcsIFBiZi5WYXJpbnQpO1xuICAgICAgICB0aGlzLndyaXRlVmFyaW50KHZhbCk7XG4gICAgfSxcbiAgICB3cml0ZVNWYXJpbnRGaWVsZDogZnVuY3Rpb24odGFnLCB2YWwpIHtcbiAgICAgICAgdGhpcy53cml0ZVRhZyh0YWcsIFBiZi5WYXJpbnQpO1xuICAgICAgICB0aGlzLndyaXRlU1ZhcmludCh2YWwpO1xuICAgIH0sXG4gICAgd3JpdGVTdHJpbmdGaWVsZDogZnVuY3Rpb24odGFnLCBzdHIpIHtcbiAgICAgICAgdGhpcy53cml0ZVRhZyh0YWcsIFBiZi5CeXRlcyk7XG4gICAgICAgIHRoaXMud3JpdGVTdHJpbmcoc3RyKTtcbiAgICB9LFxuICAgIHdyaXRlRmxvYXRGaWVsZDogZnVuY3Rpb24odGFnLCB2YWwpIHtcbiAgICAgICAgdGhpcy53cml0ZVRhZyh0YWcsIFBiZi5GaXhlZDMyKTtcbiAgICAgICAgdGhpcy53cml0ZUZsb2F0KHZhbCk7XG4gICAgfSxcbiAgICB3cml0ZURvdWJsZUZpZWxkOiBmdW5jdGlvbih0YWcsIHZhbCkge1xuICAgICAgICB0aGlzLndyaXRlVGFnKHRhZywgUGJmLkZpeGVkNjQpO1xuICAgICAgICB0aGlzLndyaXRlRG91YmxlKHZhbCk7XG4gICAgfSxcbiAgICB3cml0ZUJvb2xlYW5GaWVsZDogZnVuY3Rpb24odGFnLCB2YWwpIHtcbiAgICAgICAgdGhpcy53cml0ZVZhcmludEZpZWxkKHRhZywgQm9vbGVhbih2YWwpKTtcbiAgICB9XG59O1xuXG5mdW5jdGlvbiB3cml0ZVBhY2tlZFZhcmludChhcnIsIHBiZikgICB7IGZvciAodmFyIGkgPSAwOyBpIDwgYXJyLmxlbmd0aDsgaSsrKSBwYmYud3JpdGVWYXJpbnQoYXJyW2ldKTsgICB9XG5mdW5jdGlvbiB3cml0ZVBhY2tlZFNWYXJpbnQoYXJyLCBwYmYpICB7IGZvciAodmFyIGkgPSAwOyBpIDwgYXJyLmxlbmd0aDsgaSsrKSBwYmYud3JpdGVTVmFyaW50KGFycltpXSk7ICB9XG5mdW5jdGlvbiB3cml0ZVBhY2tlZEZsb2F0KGFyciwgcGJmKSAgICB7IGZvciAodmFyIGkgPSAwOyBpIDwgYXJyLmxlbmd0aDsgaSsrKSBwYmYud3JpdGVGbG9hdChhcnJbaV0pOyAgICB9XG5mdW5jdGlvbiB3cml0ZVBhY2tlZERvdWJsZShhcnIsIHBiZikgICB7IGZvciAodmFyIGkgPSAwOyBpIDwgYXJyLmxlbmd0aDsgaSsrKSBwYmYud3JpdGVEb3VibGUoYXJyW2ldKTsgICB9XG5mdW5jdGlvbiB3cml0ZVBhY2tlZEJvb2xlYW4oYXJyLCBwYmYpICB7IGZvciAodmFyIGkgPSAwOyBpIDwgYXJyLmxlbmd0aDsgaSsrKSBwYmYud3JpdGVCb29sZWFuKGFycltpXSk7ICB9XG5mdW5jdGlvbiB3cml0ZVBhY2tlZEZpeGVkMzIoYXJyLCBwYmYpICB7IGZvciAodmFyIGkgPSAwOyBpIDwgYXJyLmxlbmd0aDsgaSsrKSBwYmYud3JpdGVGaXhlZDMyKGFycltpXSk7ICB9XG5mdW5jdGlvbiB3cml0ZVBhY2tlZFNGaXhlZDMyKGFyciwgcGJmKSB7IGZvciAodmFyIGkgPSAwOyBpIDwgYXJyLmxlbmd0aDsgaSsrKSBwYmYud3JpdGVTRml4ZWQzMihhcnJbaV0pOyB9XG5mdW5jdGlvbiB3cml0ZVBhY2tlZEZpeGVkNjQoYXJyLCBwYmYpICB7IGZvciAodmFyIGkgPSAwOyBpIDwgYXJyLmxlbmd0aDsgaSsrKSBwYmYud3JpdGVGaXhlZDY0KGFycltpXSk7ICB9XG5mdW5jdGlvbiB3cml0ZVBhY2tlZFNGaXhlZDY0KGFyciwgcGJmKSB7IGZvciAodmFyIGkgPSAwOyBpIDwgYXJyLmxlbmd0aDsgaSsrKSBwYmYud3JpdGVTRml4ZWQ2NChhcnJbaV0pOyB9XG4iLCIvKiFcbiAqIHN0cmlwLWNvbW1lbnRzIDxodHRwczovL2dpdGh1Yi5jb20vam9uc2NobGlua2VydC9zdHJpcC1jb21tZW50cz5cbiAqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTQgSm9uIFNjaGxpbmtlcnQsIGNvbnRyaWJ1dG9ycy5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZS5cbiAqL1xuXG4ndXNlIHN0cmljJztcblxudmFyIHJlQmxvY2sgPSAnXFxcXC9cXFxcKic7XG52YXIgcmVCbG9ja0lnbm9yZSA9ICdcXFxcL1xcXFwqKD8hXFxcXCo/XFxcXCEpJztcbnZhciByZUJsb2NrRW5kID0gJygufFtcXFxcclxcXFxuXXxcXFxcbikqP1xcXFwqXFxcXC9cXFxcbj9cXFxcbj8nO1xudmFyIHJlTGluZSA9IC8oXnxbXlxcU1xcbl0pKD86XFwvXFwvKShbXFxzXFxTXSs/KSQvZ207XG52YXIgcmVMaW5lSWdub3JlID0gLyhefFteXFxTXFxuXSkoPzpcXC9cXC9bXiFdKShbXFxzXFxTXSs/KSQvZ207XG5cblxuLyoqXG4gKiBTdHJpcCBhbGwgY29tbWVudHNcbiAqXG4gKiB7JT0gZG9jcyhcInN0cmlwXCIpICV9XG4gKlxuICogQHBhcmFtICAge1N0cmluZ30gYHN0cmAgIGZpbGUgY29udGVudHMgb3Igc3RyaW5nIHRvIHN0cmlwLlxuICogQHBhcmFtICAge09iamVjdH0gYG9wdHNgICBvcHRpb25zIGFyZSBwYXNzZWQgdG8gYC5ibG9ja2AsIGFuZCBgLmxpbmVgXG4gKiBAcmV0dXJuICB7U3RyaW5nfSBTdHJpbmcgd2l0aG91dCBjb21tZW50cy5cbiAqIEBhcGkgcHVibGljXG4gKi9cblxudmFyIHN0cmlwID0gbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihzdHIsIG9wdHMpIHtcbiAgcmV0dXJuIHN0ciA/IHN0cmlwLmJsb2NrKHN0cmlwLmxpbmUoc3RyLCBvcHRzKSwgb3B0cykgOiAnJztcbn07XG5cblxuLyoqXG4gKiBTdHJpcCBvbmx5IGJsb2NrIGNvbW1lbnRzLCBvcHRpb25hbGx5IGxlYXZpbmcgcHJvdGVjdGVkIGNvbW1lbnRzXG4gKiAoZS5nLiBgLyohYCkgaW50YWN0LlxuICpcbiAqIHslPSBkb2NzKFwiYmxvY2tcIikgJX1cbiAqXG4gKiBAcGFyYW0gICB7U3RyaW5nfSBgc3RyYCAgZmlsZSBjb250ZW50IG9yIHN0cmluZyB0byBzdHJpcCB0b1xuICogQHBhcmFtICAge09iamVjdH0gYG9wdHNgICBpZiBgc2FmZTp0cnVlYCwgc3RyaXAgb25seSBjb21tZW50cyB0aGF0IGRvIG5vdCBzdGFydCB3aXRoIGAvKiFgIG9yIGAvKiohYFxuICogQHJldHVybiAge1N0cmluZ30gU3RyaW5nIHdpdGhvdXQgYmxvY2sgY29tbWVudHMuXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbnN0cmlwLmJsb2NrID0gZnVuY3Rpb24oc3RyLCBvcHRzKSB7XG4gIG9wdHMgPSBvcHRzIHx8IHt9O1xuICB2YXIgcmUgPSBuZXcgUmVnRXhwKHJlQmxvY2sgKyByZUJsb2NrRW5kLCAnZ20nKTtcbiAgaWYob3B0cy5zYWZlKSB7XG4gICAgcmUgPSBuZXcgUmVnRXhwKHJlQmxvY2tJZ25vcmUgKyByZUJsb2NrRW5kLCAnZ20nKTtcbiAgfVxuICByZXR1cm4gc3RyID8gc3RyLnJlcGxhY2UocmUsICcnKSA6ICcnO1xufTtcblxuXG4vKipcbiAqIFN0cmlwIG9ubHkgbGluZSBjb21tZW50c1xuICpcbiAqIHslPSBkb2NzKFwibGluZVwiKSAlfVxuICpcbiAqIEBwYXJhbSAgIHtTdHJpbmd9IGBzdHJgICBmaWxlIGNvbnRlbnQgb3Igc3RyaW5nIHRvIHN0cmlwIHRvXG4gKiBAcGFyYW0gICB7T2JqZWN0fSBgb3B0c2AgIGlmIGBzYWZlOnRydWVgLCBzdHJpcCBhbGwgdGhhdCBub3Qgc3RhcnRzIHdpdGggYC8vIWBcbiAqIEByZXR1cm4gIHtTdHJpbmd9IFN0cmluZyB3aXRob3V0IGxpbmUgY29tbWVudHMuXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbnN0cmlwLmxpbmUgPSBmdW5jdGlvbihzdHIsIG9wdHMpIHtcbiAgb3B0cyA9IG9wdHMgfHwge307XG4gIHZhciByZSA9IHJlTGluZTtcbiAgaWYob3B0cy5zYWZlKSB7XG4gICAgcmUgPSByZUxpbmVJZ25vcmU7XG4gIH1cbiAgcmV0dXJuIHN0ciA/IHN0ci5yZXBsYWNlKHJlLCAnJykgOiAnJztcbn07XG4iLCIvLyBodHRwczovL2dpdGh1Yi5jb20vdG9wb2pzb24vdG9wb2pzb24tY2xpZW50IFZlcnNpb24gMi4xLjAuIENvcHlyaWdodCAyMDE2IE1pa2UgQm9zdG9jay5cbihmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJyA/IGZhY3RvcnkoZXhwb3J0cykgOlxuICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoWydleHBvcnRzJ10sIGZhY3RvcnkpIDpcbiAgKGZhY3RvcnkoKGdsb2JhbC50b3BvanNvbiA9IGdsb2JhbC50b3BvanNvbiB8fCB7fSkpKTtcbn0odGhpcywgKGZ1bmN0aW9uIChleHBvcnRzKSB7ICd1c2Ugc3RyaWN0JztcblxudmFyIHJldmVyc2UgPSBmdW5jdGlvbihhcnJheSwgbikge1xuICB2YXIgdCwgaiA9IGFycmF5Lmxlbmd0aCwgaSA9IGogLSBuO1xuICB3aGlsZSAoaSA8IC0taikgdCA9IGFycmF5W2ldLCBhcnJheVtpKytdID0gYXJyYXlbal0sIGFycmF5W2pdID0gdDtcbn07XG5cbnZhciBpZGVudGl0eSA9IGZ1bmN0aW9uKHgpIHtcbiAgcmV0dXJuIHg7XG59O1xuXG52YXIgdHJhbnNmb3JtID0gZnVuY3Rpb24odG9wb2xvZ3kpIHtcbiAgaWYgKCh0cmFuc2Zvcm0gPSB0b3BvbG9neS50cmFuc2Zvcm0pID09IG51bGwpIHJldHVybiBpZGVudGl0eTtcbiAgdmFyIHRyYW5zZm9ybSxcbiAgICAgIHgwLFxuICAgICAgeTAsXG4gICAgICBreCA9IHRyYW5zZm9ybS5zY2FsZVswXSxcbiAgICAgIGt5ID0gdHJhbnNmb3JtLnNjYWxlWzFdLFxuICAgICAgZHggPSB0cmFuc2Zvcm0udHJhbnNsYXRlWzBdLFxuICAgICAgZHkgPSB0cmFuc2Zvcm0udHJhbnNsYXRlWzFdO1xuICByZXR1cm4gZnVuY3Rpb24ocG9pbnQsIGkpIHtcbiAgICBpZiAoIWkpIHgwID0geTAgPSAwO1xuICAgIHBvaW50WzBdID0gKHgwICs9IHBvaW50WzBdKSAqIGt4ICsgZHg7XG4gICAgcG9pbnRbMV0gPSAoeTAgKz0gcG9pbnRbMV0pICoga3kgKyBkeTtcbiAgICByZXR1cm4gcG9pbnQ7XG4gIH07XG59O1xuXG52YXIgZmVhdHVyZSA9IGZ1bmN0aW9uKHRvcG9sb2d5LCBvKSB7XG4gIHJldHVybiBvLnR5cGUgPT09IFwiR2VvbWV0cnlDb2xsZWN0aW9uXCJcbiAgICAgID8ge3R5cGU6IFwiRmVhdHVyZUNvbGxlY3Rpb25cIiwgZmVhdHVyZXM6IG8uZ2VvbWV0cmllcy5tYXAoZnVuY3Rpb24obykgeyByZXR1cm4gZmVhdHVyZSQxKHRvcG9sb2d5LCBvKTsgfSl9XG4gICAgICA6IGZlYXR1cmUkMSh0b3BvbG9neSwgbyk7XG59O1xuXG5mdW5jdGlvbiBmZWF0dXJlJDEodG9wb2xvZ3ksIG8pIHtcbiAgdmFyIGlkID0gby5pZCxcbiAgICAgIGJib3ggPSBvLmJib3gsXG4gICAgICBwcm9wZXJ0aWVzID0gby5wcm9wZXJ0aWVzID09IG51bGwgPyB7fSA6IG8ucHJvcGVydGllcyxcbiAgICAgIGdlb21ldHJ5ID0gb2JqZWN0KHRvcG9sb2d5LCBvKTtcbiAgcmV0dXJuIGlkID09IG51bGwgJiYgYmJveCA9PSBudWxsID8ge3R5cGU6IFwiRmVhdHVyZVwiLCBwcm9wZXJ0aWVzOiBwcm9wZXJ0aWVzLCBnZW9tZXRyeTogZ2VvbWV0cnl9XG4gICAgICA6IGJib3ggPT0gbnVsbCA/IHt0eXBlOiBcIkZlYXR1cmVcIiwgaWQ6IGlkLCBwcm9wZXJ0aWVzOiBwcm9wZXJ0aWVzLCBnZW9tZXRyeTogZ2VvbWV0cnl9XG4gICAgICA6IHt0eXBlOiBcIkZlYXR1cmVcIiwgaWQ6IGlkLCBiYm94OiBiYm94LCBwcm9wZXJ0aWVzOiBwcm9wZXJ0aWVzLCBnZW9tZXRyeTogZ2VvbWV0cnl9O1xufVxuXG5mdW5jdGlvbiBvYmplY3QodG9wb2xvZ3ksIG8pIHtcbiAgdmFyIHRyYW5zZm9ybVBvaW50ID0gdHJhbnNmb3JtKHRvcG9sb2d5KSxcbiAgICAgIGFyY3MgPSB0b3BvbG9neS5hcmNzO1xuXG4gIGZ1bmN0aW9uIGFyYyhpLCBwb2ludHMpIHtcbiAgICBpZiAocG9pbnRzLmxlbmd0aCkgcG9pbnRzLnBvcCgpO1xuICAgIGZvciAodmFyIGEgPSBhcmNzW2kgPCAwID8gfmkgOiBpXSwgayA9IDAsIG4gPSBhLmxlbmd0aDsgayA8IG47ICsraykge1xuICAgICAgcG9pbnRzLnB1c2godHJhbnNmb3JtUG9pbnQoYVtrXS5zbGljZSgpLCBrKSk7XG4gICAgfVxuICAgIGlmIChpIDwgMCkgcmV2ZXJzZShwb2ludHMsIG4pO1xuICB9XG5cbiAgZnVuY3Rpb24gcG9pbnQocCkge1xuICAgIHJldHVybiB0cmFuc2Zvcm1Qb2ludChwLnNsaWNlKCkpO1xuICB9XG5cbiAgZnVuY3Rpb24gbGluZShhcmNzKSB7XG4gICAgdmFyIHBvaW50cyA9IFtdO1xuICAgIGZvciAodmFyIGkgPSAwLCBuID0gYXJjcy5sZW5ndGg7IGkgPCBuOyArK2kpIGFyYyhhcmNzW2ldLCBwb2ludHMpO1xuICAgIGlmIChwb2ludHMubGVuZ3RoIDwgMikgcG9pbnRzLnB1c2gocG9pbnRzWzBdLnNsaWNlKCkpO1xuICAgIHJldHVybiBwb2ludHM7XG4gIH1cblxuICBmdW5jdGlvbiByaW5nKGFyY3MpIHtcbiAgICB2YXIgcG9pbnRzID0gbGluZShhcmNzKTtcbiAgICB3aGlsZSAocG9pbnRzLmxlbmd0aCA8IDQpIHBvaW50cy5wdXNoKHBvaW50c1swXS5zbGljZSgpKTtcbiAgICByZXR1cm4gcG9pbnRzO1xuICB9XG5cbiAgZnVuY3Rpb24gcG9seWdvbihhcmNzKSB7XG4gICAgcmV0dXJuIGFyY3MubWFwKHJpbmcpO1xuICB9XG5cbiAgZnVuY3Rpb24gZ2VvbWV0cnkobykge1xuICAgIHZhciB0eXBlID0gby50eXBlLCBjb29yZGluYXRlcztcbiAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgIGNhc2UgXCJHZW9tZXRyeUNvbGxlY3Rpb25cIjogcmV0dXJuIHt0eXBlOiB0eXBlLCBnZW9tZXRyaWVzOiBvLmdlb21ldHJpZXMubWFwKGdlb21ldHJ5KX07XG4gICAgICBjYXNlIFwiUG9pbnRcIjogY29vcmRpbmF0ZXMgPSBwb2ludChvLmNvb3JkaW5hdGVzKTsgYnJlYWs7XG4gICAgICBjYXNlIFwiTXVsdGlQb2ludFwiOiBjb29yZGluYXRlcyA9IG8uY29vcmRpbmF0ZXMubWFwKHBvaW50KTsgYnJlYWs7XG4gICAgICBjYXNlIFwiTGluZVN0cmluZ1wiOiBjb29yZGluYXRlcyA9IGxpbmUoby5hcmNzKTsgYnJlYWs7XG4gICAgICBjYXNlIFwiTXVsdGlMaW5lU3RyaW5nXCI6IGNvb3JkaW5hdGVzID0gby5hcmNzLm1hcChsaW5lKTsgYnJlYWs7XG4gICAgICBjYXNlIFwiUG9seWdvblwiOiBjb29yZGluYXRlcyA9IHBvbHlnb24oby5hcmNzKTsgYnJlYWs7XG4gICAgICBjYXNlIFwiTXVsdGlQb2x5Z29uXCI6IGNvb3JkaW5hdGVzID0gby5hcmNzLm1hcChwb2x5Z29uKTsgYnJlYWs7XG4gICAgICBkZWZhdWx0OiByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgcmV0dXJuIHt0eXBlOiB0eXBlLCBjb29yZGluYXRlczogY29vcmRpbmF0ZXN9O1xuICB9XG5cbiAgcmV0dXJuIGdlb21ldHJ5KG8pO1xufVxuXG4vLyBleHBvcnQge2RlZmF1bHQgYXMgYmJveH0gZnJvbSBcIi4vc3JjL2Jib3hcIjtcblxuLy8gZXhwb3J0IHtkZWZhdWx0IGFzIG1lc2gsIG1lc2hBcmNzfSBmcm9tIFwiLi9zcmMvbWVzaFwiO1xuLy8gZXhwb3J0IHtkZWZhdWx0IGFzIG1lcmdlLCBtZXJnZUFyY3N9IGZyb20gXCIuL3NyYy9tZXJnZVwiO1xuLy8gZXhwb3J0IHtkZWZhdWx0IGFzIG5laWdoYm9yc30gZnJvbSBcIi4vc3JjL25laWdoYm9yc1wiO1xuLy8gZXhwb3J0IHtkZWZhdWx0IGFzIHF1YW50aXplfSBmcm9tIFwiLi9zcmMvcXVhbnRpemVcIjtcbi8vIGV4cG9ydCB7ZGVmYXVsdCBhcyB0cmFuc2Zvcm19IGZyb20gXCIuL3NyYy90cmFuc2Zvcm1cIjtcbi8vIGV4cG9ydCB7ZGVmYXVsdCBhcyB1bnRyYW5zZm9ybX0gZnJvbSBcIi4vc3JjL3VudHJhbnNmb3JtXCI7XG5cbmV4cG9ydHMuZmVhdHVyZSA9IGZlYXR1cmU7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnX19lc01vZHVsZScsIHsgdmFsdWU6IHRydWUgfSk7XG5cbn0pKSk7XG4iLCJtb2R1bGUuZXhwb3J0cy5WZWN0b3JUaWxlID0gcmVxdWlyZSgnLi9saWIvdmVjdG9ydGlsZS5qcycpO1xubW9kdWxlLmV4cG9ydHMuVmVjdG9yVGlsZUZlYXR1cmUgPSByZXF1aXJlKCcuL2xpYi92ZWN0b3J0aWxlZmVhdHVyZS5qcycpO1xubW9kdWxlLmV4cG9ydHMuVmVjdG9yVGlsZUxheWVyID0gcmVxdWlyZSgnLi9saWIvdmVjdG9ydGlsZWxheWVyLmpzJyk7XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBWZWN0b3JUaWxlTGF5ZXIgPSByZXF1aXJlKCcuL3ZlY3RvcnRpbGVsYXllcicpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IFZlY3RvclRpbGU7XG5cbmZ1bmN0aW9uIFZlY3RvclRpbGUocGJmLCBlbmQpIHtcbiAgICB0aGlzLmxheWVycyA9IHBiZi5yZWFkRmllbGRzKHJlYWRUaWxlLCB7fSwgZW5kKTtcbn1cblxuZnVuY3Rpb24gcmVhZFRpbGUodGFnLCBsYXllcnMsIHBiZikge1xuICAgIGlmICh0YWcgPT09IDMpIHtcbiAgICAgICAgdmFyIGxheWVyID0gbmV3IFZlY3RvclRpbGVMYXllcihwYmYsIHBiZi5yZWFkVmFyaW50KCkgKyBwYmYucG9zKTtcbiAgICAgICAgaWYgKGxheWVyLmxlbmd0aCkgbGF5ZXJzW2xheWVyLm5hbWVdID0gbGF5ZXI7XG4gICAgfVxufVxuXG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBQb2ludCA9IHJlcXVpcmUoJ3BvaW50LWdlb21ldHJ5Jyk7XG5cbm1vZHVsZS5leHBvcnRzID0gVmVjdG9yVGlsZUZlYXR1cmU7XG5cbmZ1bmN0aW9uIFZlY3RvclRpbGVGZWF0dXJlKHBiZiwgZW5kLCBleHRlbnQsIGtleXMsIHZhbHVlcykge1xuICAgIC8vIFB1YmxpY1xuICAgIHRoaXMucHJvcGVydGllcyA9IHt9O1xuICAgIHRoaXMuZXh0ZW50ID0gZXh0ZW50O1xuICAgIHRoaXMudHlwZSA9IDA7XG5cbiAgICAvLyBQcml2YXRlXG4gICAgdGhpcy5fcGJmID0gcGJmO1xuICAgIHRoaXMuX2dlb21ldHJ5ID0gLTE7XG4gICAgdGhpcy5fa2V5cyA9IGtleXM7XG4gICAgdGhpcy5fdmFsdWVzID0gdmFsdWVzO1xuXG4gICAgcGJmLnJlYWRGaWVsZHMocmVhZEZlYXR1cmUsIHRoaXMsIGVuZCk7XG59XG5cbmZ1bmN0aW9uIHJlYWRGZWF0dXJlKHRhZywgZmVhdHVyZSwgcGJmKSB7XG4gICAgaWYgKHRhZyA9PSAxKSBmZWF0dXJlLl9pZCA9IHBiZi5yZWFkVmFyaW50KCk7XG4gICAgZWxzZSBpZiAodGFnID09IDIpIHJlYWRUYWcocGJmLCBmZWF0dXJlKTtcbiAgICBlbHNlIGlmICh0YWcgPT0gMykgZmVhdHVyZS50eXBlID0gcGJmLnJlYWRWYXJpbnQoKTtcbiAgICBlbHNlIGlmICh0YWcgPT0gNCkgZmVhdHVyZS5fZ2VvbWV0cnkgPSBwYmYucG9zO1xufVxuXG5mdW5jdGlvbiByZWFkVGFnKHBiZiwgZmVhdHVyZSkge1xuICAgIHZhciBlbmQgPSBwYmYucmVhZFZhcmludCgpICsgcGJmLnBvcztcblxuICAgIHdoaWxlIChwYmYucG9zIDwgZW5kKSB7XG4gICAgICAgIHZhciBrZXkgPSBmZWF0dXJlLl9rZXlzW3BiZi5yZWFkVmFyaW50KCldLFxuICAgICAgICAgICAgdmFsdWUgPSBmZWF0dXJlLl92YWx1ZXNbcGJmLnJlYWRWYXJpbnQoKV07XG4gICAgICAgIGZlYXR1cmUucHJvcGVydGllc1trZXldID0gdmFsdWU7XG4gICAgfVxufVxuXG5WZWN0b3JUaWxlRmVhdHVyZS50eXBlcyA9IFsnVW5rbm93bicsICdQb2ludCcsICdMaW5lU3RyaW5nJywgJ1BvbHlnb24nXTtcblxuVmVjdG9yVGlsZUZlYXR1cmUucHJvdG90eXBlLmxvYWRHZW9tZXRyeSA9IGZ1bmN0aW9uKCkge1xuICAgIHZhciBwYmYgPSB0aGlzLl9wYmY7XG4gICAgcGJmLnBvcyA9IHRoaXMuX2dlb21ldHJ5O1xuXG4gICAgdmFyIGVuZCA9IHBiZi5yZWFkVmFyaW50KCkgKyBwYmYucG9zLFxuICAgICAgICBjbWQgPSAxLFxuICAgICAgICBsZW5ndGggPSAwLFxuICAgICAgICB4ID0gMCxcbiAgICAgICAgeSA9IDAsXG4gICAgICAgIGxpbmVzID0gW10sXG4gICAgICAgIGxpbmU7XG5cbiAgICB3aGlsZSAocGJmLnBvcyA8IGVuZCkge1xuICAgICAgICBpZiAoIWxlbmd0aCkge1xuICAgICAgICAgICAgdmFyIGNtZExlbiA9IHBiZi5yZWFkVmFyaW50KCk7XG4gICAgICAgICAgICBjbWQgPSBjbWRMZW4gJiAweDc7XG4gICAgICAgICAgICBsZW5ndGggPSBjbWRMZW4gPj4gMztcbiAgICAgICAgfVxuXG4gICAgICAgIGxlbmd0aC0tO1xuXG4gICAgICAgIGlmIChjbWQgPT09IDEgfHwgY21kID09PSAyKSB7XG4gICAgICAgICAgICB4ICs9IHBiZi5yZWFkU1ZhcmludCgpO1xuICAgICAgICAgICAgeSArPSBwYmYucmVhZFNWYXJpbnQoKTtcblxuICAgICAgICAgICAgaWYgKGNtZCA9PT0gMSkgeyAvLyBtb3ZlVG9cbiAgICAgICAgICAgICAgICBpZiAobGluZSkgbGluZXMucHVzaChsaW5lKTtcbiAgICAgICAgICAgICAgICBsaW5lID0gW107XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGxpbmUucHVzaChuZXcgUG9pbnQoeCwgeSkpO1xuXG4gICAgICAgIH0gZWxzZSBpZiAoY21kID09PSA3KSB7XG4gICAgICAgICAgICBsaW5lLnB1c2gobGluZVswXS5jbG9uZSgpKTsgLy8gY2xvc2VQb2x5Z29uXG5cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcigndW5rbm93biBjb21tYW5kICcgKyBjbWQpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgaWYgKGxpbmUpIGxpbmVzLnB1c2gobGluZSk7XG5cbiAgICByZXR1cm4gbGluZXM7XG59O1xuXG5WZWN0b3JUaWxlRmVhdHVyZS5wcm90b3R5cGUuYmJveCA9IGZ1bmN0aW9uKCkge1xuICAgIHZhciBwYmYgPSB0aGlzLl9wYmY7XG4gICAgcGJmLnBvcyA9IHRoaXMuX2dlb21ldHJ5O1xuXG4gICAgdmFyIGVuZCA9IHBiZi5yZWFkVmFyaW50KCkgKyBwYmYucG9zLFxuICAgICAgICBjbWQgPSAxLFxuICAgICAgICBsZW5ndGggPSAwLFxuICAgICAgICB4ID0gMCxcbiAgICAgICAgeSA9IDAsXG4gICAgICAgIHgxID0gSW5maW5pdHksXG4gICAgICAgIHgyID0gLUluZmluaXR5LFxuICAgICAgICB5MSA9IEluZmluaXR5LFxuICAgICAgICB5MiA9IC1JbmZpbml0eTtcblxuICAgIHdoaWxlIChwYmYucG9zIDwgZW5kKSB7XG4gICAgICAgIGlmICghbGVuZ3RoKSB7XG4gICAgICAgICAgICB2YXIgY21kTGVuID0gcGJmLnJlYWRWYXJpbnQoKTtcbiAgICAgICAgICAgIGNtZCA9IGNtZExlbiAmIDB4NztcbiAgICAgICAgICAgIGxlbmd0aCA9IGNtZExlbiA+PiAzO1xuICAgICAgICB9XG5cbiAgICAgICAgbGVuZ3RoLS07XG5cbiAgICAgICAgaWYgKGNtZCA9PT0gMSB8fCBjbWQgPT09IDIpIHtcbiAgICAgICAgICAgIHggKz0gcGJmLnJlYWRTVmFyaW50KCk7XG4gICAgICAgICAgICB5ICs9IHBiZi5yZWFkU1ZhcmludCgpO1xuICAgICAgICAgICAgaWYgKHggPCB4MSkgeDEgPSB4O1xuICAgICAgICAgICAgaWYgKHggPiB4MikgeDIgPSB4O1xuICAgICAgICAgICAgaWYgKHkgPCB5MSkgeTEgPSB5O1xuICAgICAgICAgICAgaWYgKHkgPiB5MikgeTIgPSB5O1xuXG4gICAgICAgIH0gZWxzZSBpZiAoY21kICE9PSA3KSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3Vua25vd24gY29tbWFuZCAnICsgY21kKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBbeDEsIHkxLCB4MiwgeTJdO1xufTtcblxuVmVjdG9yVGlsZUZlYXR1cmUucHJvdG90eXBlLnRvR2VvSlNPTiA9IGZ1bmN0aW9uKHgsIHksIHopIHtcbiAgICB2YXIgc2l6ZSA9IHRoaXMuZXh0ZW50ICogTWF0aC5wb3coMiwgeiksXG4gICAgICAgIHgwID0gdGhpcy5leHRlbnQgKiB4LFxuICAgICAgICB5MCA9IHRoaXMuZXh0ZW50ICogeSxcbiAgICAgICAgY29vcmRzID0gdGhpcy5sb2FkR2VvbWV0cnkoKSxcbiAgICAgICAgdHlwZSA9IFZlY3RvclRpbGVGZWF0dXJlLnR5cGVzW3RoaXMudHlwZV07XG5cbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNvb3Jkcy5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgbGluZSA9IGNvb3Jkc1tpXTtcbiAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBsaW5lLmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICB2YXIgcCA9IGxpbmVbal0sIHkyID0gMTgwIC0gKHAueSArIHkwKSAqIDM2MCAvIHNpemU7XG4gICAgICAgICAgICBsaW5lW2pdID0gW1xuICAgICAgICAgICAgICAgIChwLnggKyB4MCkgKiAzNjAgLyBzaXplIC0gMTgwLFxuICAgICAgICAgICAgICAgIDM2MCAvIE1hdGguUEkgKiBNYXRoLmF0YW4oTWF0aC5leHAoeTIgKiBNYXRoLlBJIC8gMTgwKSkgLSA5MFxuICAgICAgICAgICAgXTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGlmICh0eXBlID09PSAnUG9pbnQnICYmIGNvb3Jkcy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgY29vcmRzID0gY29vcmRzWzBdWzBdO1xuICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ1BvaW50Jykge1xuICAgICAgICBjb29yZHMgPSBjb29yZHNbMF07XG4gICAgICAgIHR5cGUgPSAnTXVsdGlQb2ludCc7XG4gICAgfSBlbHNlIGlmICh0eXBlID09PSAnTGluZVN0cmluZycgJiYgY29vcmRzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICBjb29yZHMgPSBjb29yZHNbMF07XG4gICAgfSBlbHNlIGlmICh0eXBlID09PSAnTGluZVN0cmluZycpIHtcbiAgICAgICAgdHlwZSA9ICdNdWx0aUxpbmVTdHJpbmcnO1xuICAgIH1cblxuICAgIHJldHVybiB7XG4gICAgICAgIHR5cGU6IFwiRmVhdHVyZVwiLFxuICAgICAgICBnZW9tZXRyeToge1xuICAgICAgICAgICAgdHlwZTogdHlwZSxcbiAgICAgICAgICAgIGNvb3JkaW5hdGVzOiBjb29yZHNcbiAgICAgICAgfSxcbiAgICAgICAgcHJvcGVydGllczogdGhpcy5wcm9wZXJ0aWVzXG4gICAgfTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBWZWN0b3JUaWxlRmVhdHVyZSA9IHJlcXVpcmUoJy4vdmVjdG9ydGlsZWZlYXR1cmUuanMnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBWZWN0b3JUaWxlTGF5ZXI7XG5cbmZ1bmN0aW9uIFZlY3RvclRpbGVMYXllcihwYmYsIGVuZCkge1xuICAgIC8vIFB1YmxpY1xuICAgIHRoaXMudmVyc2lvbiA9IDE7XG4gICAgdGhpcy5uYW1lID0gbnVsbDtcbiAgICB0aGlzLmV4dGVudCA9IDQwOTY7XG4gICAgdGhpcy5sZW5ndGggPSAwO1xuXG4gICAgLy8gUHJpdmF0ZVxuICAgIHRoaXMuX3BiZiA9IHBiZjtcbiAgICB0aGlzLl9rZXlzID0gW107XG4gICAgdGhpcy5fdmFsdWVzID0gW107XG4gICAgdGhpcy5fZmVhdHVyZXMgPSBbXTtcblxuICAgIHBiZi5yZWFkRmllbGRzKHJlYWRMYXllciwgdGhpcywgZW5kKTtcblxuICAgIHRoaXMubGVuZ3RoID0gdGhpcy5fZmVhdHVyZXMubGVuZ3RoO1xufVxuXG5mdW5jdGlvbiByZWFkTGF5ZXIodGFnLCBsYXllciwgcGJmKSB7XG4gICAgaWYgKHRhZyA9PT0gMTUpIGxheWVyLnZlcnNpb24gPSBwYmYucmVhZFZhcmludCgpO1xuICAgIGVsc2UgaWYgKHRhZyA9PT0gMSkgbGF5ZXIubmFtZSA9IHBiZi5yZWFkU3RyaW5nKCk7XG4gICAgZWxzZSBpZiAodGFnID09PSA1KSBsYXllci5leHRlbnQgPSBwYmYucmVhZFZhcmludCgpO1xuICAgIGVsc2UgaWYgKHRhZyA9PT0gMikgbGF5ZXIuX2ZlYXR1cmVzLnB1c2gocGJmLnBvcyk7XG4gICAgZWxzZSBpZiAodGFnID09PSAzKSBsYXllci5fa2V5cy5wdXNoKHBiZi5yZWFkU3RyaW5nKCkpO1xuICAgIGVsc2UgaWYgKHRhZyA9PT0gNCkgbGF5ZXIuX3ZhbHVlcy5wdXNoKHJlYWRWYWx1ZU1lc3NhZ2UocGJmKSk7XG59XG5cbmZ1bmN0aW9uIHJlYWRWYWx1ZU1lc3NhZ2UocGJmKSB7XG4gICAgdmFyIHZhbHVlID0gbnVsbCxcbiAgICAgICAgZW5kID0gcGJmLnJlYWRWYXJpbnQoKSArIHBiZi5wb3M7XG5cbiAgICB3aGlsZSAocGJmLnBvcyA8IGVuZCkge1xuICAgICAgICB2YXIgdGFnID0gcGJmLnJlYWRWYXJpbnQoKSA+PiAzO1xuXG4gICAgICAgIHZhbHVlID0gdGFnID09PSAxID8gcGJmLnJlYWRTdHJpbmcoKSA6XG4gICAgICAgICAgICB0YWcgPT09IDIgPyBwYmYucmVhZEZsb2F0KCkgOlxuICAgICAgICAgICAgdGFnID09PSAzID8gcGJmLnJlYWREb3VibGUoKSA6XG4gICAgICAgICAgICB0YWcgPT09IDQgPyBwYmYucmVhZFZhcmludDY0KCkgOlxuICAgICAgICAgICAgdGFnID09PSA1ID8gcGJmLnJlYWRWYXJpbnQoKSA6XG4gICAgICAgICAgICB0YWcgPT09IDYgPyBwYmYucmVhZFNWYXJpbnQoKSA6XG4gICAgICAgICAgICB0YWcgPT09IDcgPyBwYmYucmVhZEJvb2xlYW4oKSA6IG51bGw7XG4gICAgfVxuXG4gICAgcmV0dXJuIHZhbHVlO1xufVxuXG4vLyByZXR1cm4gZmVhdHVyZSBgaWAgZnJvbSB0aGlzIGxheWVyIGFzIGEgYFZlY3RvclRpbGVGZWF0dXJlYFxuVmVjdG9yVGlsZUxheWVyLnByb3RvdHlwZS5mZWF0dXJlID0gZnVuY3Rpb24oaSkge1xuICAgIGlmIChpIDwgMCB8fCBpID49IHRoaXMuX2ZlYXR1cmVzLmxlbmd0aCkgdGhyb3cgbmV3IEVycm9yKCdmZWF0dXJlIGluZGV4IG91dCBvZiBib3VuZHMnKTtcblxuICAgIHRoaXMuX3BiZi5wb3MgPSB0aGlzLl9mZWF0dXJlc1tpXTtcblxuICAgIHZhciBlbmQgPSB0aGlzLl9wYmYucmVhZFZhcmludCgpICsgdGhpcy5fcGJmLnBvcztcbiAgICByZXR1cm4gbmV3IFZlY3RvclRpbGVGZWF0dXJlKHRoaXMuX3BiZiwgZW5kLCB0aGlzLmV4dGVudCwgdGhpcy5fa2V5cywgdGhpcy5fdmFsdWVzKTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbm1vZHVsZS5leHBvcnRzID0gUG9pbnQ7XG5cbmZ1bmN0aW9uIFBvaW50KHgsIHkpIHtcbiAgICB0aGlzLnggPSB4O1xuICAgIHRoaXMueSA9IHk7XG59XG5cblBvaW50LnByb3RvdHlwZSA9IHtcbiAgICBjbG9uZTogZnVuY3Rpb24oKSB7IHJldHVybiBuZXcgUG9pbnQodGhpcy54LCB0aGlzLnkpOyB9LFxuXG4gICAgYWRkOiAgICAgZnVuY3Rpb24ocCkgeyByZXR1cm4gdGhpcy5jbG9uZSgpLl9hZGQocCk7ICAgICB9LFxuICAgIHN1YjogICAgIGZ1bmN0aW9uKHApIHsgcmV0dXJuIHRoaXMuY2xvbmUoKS5fc3ViKHApOyAgICAgfSxcbiAgICBtdWx0OiAgICBmdW5jdGlvbihrKSB7IHJldHVybiB0aGlzLmNsb25lKCkuX211bHQoayk7ICAgIH0sXG4gICAgZGl2OiAgICAgZnVuY3Rpb24oaykgeyByZXR1cm4gdGhpcy5jbG9uZSgpLl9kaXYoayk7ICAgICB9LFxuICAgIHJvdGF0ZTogIGZ1bmN0aW9uKGEpIHsgcmV0dXJuIHRoaXMuY2xvbmUoKS5fcm90YXRlKGEpOyAgfSxcbiAgICBtYXRNdWx0OiBmdW5jdGlvbihtKSB7IHJldHVybiB0aGlzLmNsb25lKCkuX21hdE11bHQobSk7IH0sXG4gICAgdW5pdDogICAgZnVuY3Rpb24oKSB7IHJldHVybiB0aGlzLmNsb25lKCkuX3VuaXQoKTsgfSxcbiAgICBwZXJwOiAgICBmdW5jdGlvbigpIHsgcmV0dXJuIHRoaXMuY2xvbmUoKS5fcGVycCgpOyB9LFxuICAgIHJvdW5kOiAgIGZ1bmN0aW9uKCkgeyByZXR1cm4gdGhpcy5jbG9uZSgpLl9yb3VuZCgpOyB9LFxuXG4gICAgbWFnOiBmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIE1hdGguc3FydCh0aGlzLnggKiB0aGlzLnggKyB0aGlzLnkgKiB0aGlzLnkpO1xuICAgIH0sXG5cbiAgICBlcXVhbHM6IGZ1bmN0aW9uKHApIHtcbiAgICAgICAgcmV0dXJuIHRoaXMueCA9PT0gcC54ICYmXG4gICAgICAgICAgICAgICB0aGlzLnkgPT09IHAueTtcbiAgICB9LFxuXG4gICAgZGlzdDogZnVuY3Rpb24ocCkge1xuICAgICAgICByZXR1cm4gTWF0aC5zcXJ0KHRoaXMuZGlzdFNxcihwKSk7XG4gICAgfSxcblxuICAgIGRpc3RTcXI6IGZ1bmN0aW9uKHApIHtcbiAgICAgICAgdmFyIGR4ID0gcC54IC0gdGhpcy54LFxuICAgICAgICAgICAgZHkgPSBwLnkgLSB0aGlzLnk7XG4gICAgICAgIHJldHVybiBkeCAqIGR4ICsgZHkgKiBkeTtcbiAgICB9LFxuXG4gICAgYW5nbGU6IGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gTWF0aC5hdGFuMih0aGlzLnksIHRoaXMueCk7XG4gICAgfSxcblxuICAgIGFuZ2xlVG86IGZ1bmN0aW9uKGIpIHtcbiAgICAgICAgcmV0dXJuIE1hdGguYXRhbjIodGhpcy55IC0gYi55LCB0aGlzLnggLSBiLngpO1xuICAgIH0sXG5cbiAgICBhbmdsZVdpdGg6IGZ1bmN0aW9uKGIpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYW5nbGVXaXRoU2VwKGIueCwgYi55KTtcbiAgICB9LFxuXG4gICAgLy8gRmluZCB0aGUgYW5nbGUgb2YgdGhlIHR3byB2ZWN0b3JzLCBzb2x2aW5nIHRoZSBmb3JtdWxhIGZvciB0aGUgY3Jvc3MgcHJvZHVjdCBhIHggYiA9IHxhfHxifHNpbijOuCkgZm9yIM64LlxuICAgIGFuZ2xlV2l0aFNlcDogZnVuY3Rpb24oeCwgeSkge1xuICAgICAgICByZXR1cm4gTWF0aC5hdGFuMihcbiAgICAgICAgICAgIHRoaXMueCAqIHkgLSB0aGlzLnkgKiB4LFxuICAgICAgICAgICAgdGhpcy54ICogeCArIHRoaXMueSAqIHkpO1xuICAgIH0sXG5cbiAgICBfbWF0TXVsdDogZnVuY3Rpb24obSkge1xuICAgICAgICB2YXIgeCA9IG1bMF0gKiB0aGlzLnggKyBtWzFdICogdGhpcy55LFxuICAgICAgICAgICAgeSA9IG1bMl0gKiB0aGlzLnggKyBtWzNdICogdGhpcy55O1xuICAgICAgICB0aGlzLnggPSB4O1xuICAgICAgICB0aGlzLnkgPSB5O1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuXG4gICAgX2FkZDogZnVuY3Rpb24ocCkge1xuICAgICAgICB0aGlzLnggKz0gcC54O1xuICAgICAgICB0aGlzLnkgKz0gcC55O1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuXG4gICAgX3N1YjogZnVuY3Rpb24ocCkge1xuICAgICAgICB0aGlzLnggLT0gcC54O1xuICAgICAgICB0aGlzLnkgLT0gcC55O1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuXG4gICAgX211bHQ6IGZ1bmN0aW9uKGspIHtcbiAgICAgICAgdGhpcy54ICo9IGs7XG4gICAgICAgIHRoaXMueSAqPSBrO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuXG4gICAgX2RpdjogZnVuY3Rpb24oaykge1xuICAgICAgICB0aGlzLnggLz0gaztcbiAgICAgICAgdGhpcy55IC89IGs7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG5cbiAgICBfdW5pdDogZnVuY3Rpb24oKSB7XG4gICAgICAgIHRoaXMuX2Rpdih0aGlzLm1hZygpKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcblxuICAgIF9wZXJwOiBmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIHkgPSB0aGlzLnk7XG4gICAgICAgIHRoaXMueSA9IHRoaXMueDtcbiAgICAgICAgdGhpcy54ID0gLXk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG5cbiAgICBfcm90YXRlOiBmdW5jdGlvbihhbmdsZSkge1xuICAgICAgICB2YXIgY29zID0gTWF0aC5jb3MoYW5nbGUpLFxuICAgICAgICAgICAgc2luID0gTWF0aC5zaW4oYW5nbGUpLFxuICAgICAgICAgICAgeCA9IGNvcyAqIHRoaXMueCAtIHNpbiAqIHRoaXMueSxcbiAgICAgICAgICAgIHkgPSBzaW4gKiB0aGlzLnggKyBjb3MgKiB0aGlzLnk7XG4gICAgICAgIHRoaXMueCA9IHg7XG4gICAgICAgIHRoaXMueSA9IHk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG5cbiAgICBfcm91bmQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICB0aGlzLnggPSBNYXRoLnJvdW5kKHRoaXMueCk7XG4gICAgICAgIHRoaXMueSA9IE1hdGgucm91bmQodGhpcy55KTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxufTtcblxuLy8gY29uc3RydWN0cyBQb2ludCBmcm9tIGFuIGFycmF5IGlmIG5lY2Vzc2FyeVxuUG9pbnQuY29udmVydCA9IGZ1bmN0aW9uIChhKSB7XG4gICAgaWYgKGEgaW5zdGFuY2VvZiBQb2ludCkge1xuICAgICAgICByZXR1cm4gYTtcbiAgICB9XG4gICAgaWYgKEFycmF5LmlzQXJyYXkoYSkpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQb2ludChhWzBdLCBhWzFdKTtcbiAgICB9XG4gICAgcmV0dXJuIGE7XG59O1xuIiwiLy8gR2VvbWV0cnkgYnVpbGRpbmcgZnVuY3Rpb25zXG5pbXBvcnQgR2VvIGZyb20gJy4uL2dlbyc7XG5cbmV4cG9ydCBjb25zdCB0aWxlX2JvdW5kcyA9IFtcbiAgICB7IHg6IDAsIHk6IDB9LFxuICAgIHsgeDogR2VvLnRpbGVfc2NhbGUsIHk6IC1HZW8udGlsZV9zY2FsZSB9IC8vIFRPRE86IGNvcnJlY3QgZm9yIGZsaXBwZWQgeS1heGlzP1xuXTtcblxuZXhwb3J0IGNvbnN0IGRlZmF1bHRfdXZzID0gWzAsIDAsIDEsIDFdO1xuXG4vLyBUZXN0cyBpZiBhIGxpbmUgc2VnbWVudCAoZnJvbSBwb2ludCBBIHRvIEIpIGlzIG91dHNpZGUgdGhlIHRpbGUgYm91bmRzXG4vLyAod2l0aGluIGEgY2VydGFpbiB0b2xlcmFuY2UgdG8gYWNjb3VudCBmb3IgZ2VvbWV0cnkgbmVhcmx5IG9uIHRpbGUgZWRnZXMpXG5leHBvcnQgZnVuY3Rpb24gb3V0c2lkZVRpbGUgKF9hLCBfYiwgdG9sZXJhbmNlKSB7XG4gICAgbGV0IHRpbGVfbWluID0gdGlsZV9ib3VuZHNbMF07XG4gICAgbGV0IHRpbGVfbWF4ID0gdGlsZV9ib3VuZHNbMV07XG5cbiAgICAvLyBUT0RPOiBmaXggZmxpcHBlZCBZIGNvb3JkcyBoZXJlLCBjb25mdXNpbmcgd2l0aCAnbWF4JyByZWZlcmVuY2VcbiAgICBpZiAoKF9hWzBdIDw9IHRpbGVfbWluLnggKyB0b2xlcmFuY2UgJiYgX2JbMF0gPD0gdGlsZV9taW4ueCArIHRvbGVyYW5jZSkgfHxcbiAgICAgICAgKF9hWzBdID49IHRpbGVfbWF4LnggLSB0b2xlcmFuY2UgJiYgX2JbMF0gPj0gdGlsZV9tYXgueCAtIHRvbGVyYW5jZSkgfHxcbiAgICAgICAgKF9hWzFdID49IHRpbGVfbWluLnkgLSB0b2xlcmFuY2UgJiYgX2JbMV0gPj0gdGlsZV9taW4ueSAtIHRvbGVyYW5jZSkgfHxcbiAgICAgICAgKF9hWzFdIDw9IHRpbGVfbWF4LnkgKyB0b2xlcmFuY2UgJiYgX2JbMV0gPD0gdGlsZV9tYXgueSArIHRvbGVyYW5jZSkpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNDb29yZE91dHNpZGVUaWxlIChjb29yZCwgdG9sZXJhbmNlKSB7XG4gICAgdG9sZXJhbmNlID0gdG9sZXJhbmNlIHx8IDA7XG4gICAgbGV0IHRpbGVfbWluID0gdGlsZV9ib3VuZHNbMF07XG4gICAgbGV0IHRpbGVfbWF4ID0gdGlsZV9ib3VuZHNbMV07XG5cbiAgICByZXR1cm4gY29vcmRbMF0gPD0gdGlsZV9taW4ueCArIHRvbGVyYW5jZSB8fFxuICAgICAgICAgICBjb29yZFswXSA+PSB0aWxlX21heC54IC0gdG9sZXJhbmNlIHx8XG4gICAgICAgICAgIGNvb3JkWzFdID49IHRpbGVfbWluLnkgLSB0b2xlcmFuY2UgfHxcbiAgICAgICAgICAgY29vcmRbMV0gPD0gdGlsZV9tYXgueSArIHRvbGVyYW5jZTtcbn1cbiIsIi8vIFBvaW50IGJ1aWxkZXJzXG5pbXBvcnQgeyBkZWZhdWx0X3V2cyB9IGZyb20gJy4vY29tbW9uJztcblxuLy8gQnVpbGQgYSBiaWxsYm9hcmQgc3ByaXRlIHF1YWQgY2VudGVyZWQgb24gYSBwb2ludC4gU3ByaXRlcyBhcmUgaW50ZW5kZWQgdG8gYmUgZHJhd24gaW4gc2NyZWVuc3BhY2UsIGFuZCBoYXZlXG4vLyBwcm9wZXJ0aWVzIGZvciB3aWR0aCwgaGVpZ2h0LCBhbmdsZSwgYW5kIGEgc2NhbGUgZmFjdG9yIHRoYXQgY2FuIGJlIHVzZWQgdG8gaW50ZXJwb2xhdGUgdGhlIHNjcmVlbnNwYWNlIHNpemVcbi8vIG9mIGEgc3ByaXRlIGJldHdlZW4gdHdvIHpvb20gbGV2ZWxzLlxuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkUXVhZHNGb3JQb2ludHMgKHBvaW50cywgdmVydGV4X2RhdGEsIHZlcnRleF90ZW1wbGF0ZSxcbiAgICB7IHRleGNvb3JkX2luZGV4LCBwb3NpdGlvbl9pbmRleCwgc2hhcGVfaW5kZXgsIG9mZnNldF9pbmRleCB9LFxuICAgIHsgcXVhZCwgcXVhZF9ub3JtYWxpemUsIG9mZnNldCwgYW5nbGUsIHNoYXBlX3csIHRleGNvb3JkX3NjYWxlLCB0ZXhjb29yZF9ub3JtYWxpemUgfSkge1xuICAgIHF1YWRfbm9ybWFsaXplID0gcXVhZF9ub3JtYWxpemUgfHwgMTtcbiAgICBsZXQgdzIgPSBxdWFkWzBdIC8gMiAqIHF1YWRfbm9ybWFsaXplO1xuICAgIGxldCBoMiA9IHF1YWRbMV0gLyAyICogcXVhZF9ub3JtYWxpemU7XG4gICAgbGV0IHNjYWxpbmcgPSBbXG4gICAgICAgIFstdzIsIC1oMl0sXG4gICAgICAgIFt3MiwgLWgyXSxcbiAgICAgICAgW3cyLCBoMl0sXG4gICAgICAgIFstdzIsIGgyXVxuICAgIF07XG5cbiAgICBsZXQgdmVydGV4X2VsZW1lbnRzID0gdmVydGV4X2RhdGEudmVydGV4X2VsZW1lbnRzO1xuICAgIGxldCBlbGVtZW50X29mZnNldCA9IHZlcnRleF9kYXRhLnZlcnRleF9jb3VudDtcblxuICAgIGxldCB0ZXhjb29yZHM7XG4gICAgaWYgKHRleGNvb3JkX2luZGV4KSB7XG4gICAgICAgIHRleGNvb3JkX25vcm1hbGl6ZSA9IHRleGNvb3JkX25vcm1hbGl6ZSB8fCAxO1xuXG4gICAgICAgIHZhciBbbWluX3UsIG1pbl92LCBtYXhfdSwgbWF4X3ZdID0gdGV4Y29vcmRfc2NhbGUgfHwgZGVmYXVsdF91dnM7XG4gICAgICAgIHRleGNvb3JkcyA9IFtcbiAgICAgICAgICAgIFttaW5fdSwgbWluX3ZdLFxuICAgICAgICAgICAgW21heF91LCBtaW5fdl0sXG4gICAgICAgICAgICBbbWF4X3UsIG1heF92XSxcbiAgICAgICAgICAgIFttaW5fdSwgbWF4X3ZdXG4gICAgICAgIF07XG4gICAgfVxuXG4gICAgbGV0IG51bV9wb2ludHMgPSBwb2ludHMubGVuZ3RoO1xuICAgIGZvciAobGV0IHA9MDsgcCA8IG51bV9wb2ludHM7IHArKykge1xuICAgICAgICBsZXQgcG9pbnQgPSBwb2ludHNbcF07XG5cbiAgICAgICAgZm9yIChsZXQgcG9zPTA7IHBvcyA8IDQ7IHBvcysrKSB7XG4gICAgICAgICAgICAvLyBBZGQgdGV4Y29vcmRzXG4gICAgICAgICAgICBpZiAodGV4Y29vcmRfaW5kZXgpIHtcbiAgICAgICAgICAgICAgICB2ZXJ0ZXhfdGVtcGxhdGVbdGV4Y29vcmRfaW5kZXggKyAwXSA9IHRleGNvb3Jkc1twb3NdWzBdICogdGV4Y29vcmRfbm9ybWFsaXplO1xuICAgICAgICAgICAgICAgIHZlcnRleF90ZW1wbGF0ZVt0ZXhjb29yZF9pbmRleCArIDFdID0gdGV4Y29vcmRzW3Bvc11bMV0gKiB0ZXhjb29yZF9ub3JtYWxpemU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHZlcnRleF90ZW1wbGF0ZVtwb3NpdGlvbl9pbmRleCArIDBdID0gcG9pbnRbMF07XG4gICAgICAgICAgICB2ZXJ0ZXhfdGVtcGxhdGVbcG9zaXRpb25faW5kZXggKyAxXSA9IHBvaW50WzFdO1xuXG4gICAgICAgICAgICB2ZXJ0ZXhfdGVtcGxhdGVbc2hhcGVfaW5kZXggKyAwXSA9IHNjYWxpbmdbcG9zXVswXTtcbiAgICAgICAgICAgIHZlcnRleF90ZW1wbGF0ZVtzaGFwZV9pbmRleCArIDFdID0gc2NhbGluZ1twb3NdWzFdO1xuICAgICAgICAgICAgdmVydGV4X3RlbXBsYXRlW3NoYXBlX2luZGV4ICsgMl0gPSBhbmdsZTtcbiAgICAgICAgICAgIHZlcnRleF90ZW1wbGF0ZVtzaGFwZV9pbmRleCArIDNdID0gc2hhcGVfdztcblxuICAgICAgICAgICAgdmVydGV4X3RlbXBsYXRlW29mZnNldF9pbmRleCArIDBdID0gb2Zmc2V0WzBdO1xuICAgICAgICAgICAgdmVydGV4X3RlbXBsYXRlW29mZnNldF9pbmRleCArIDFdID0gb2Zmc2V0WzFdO1xuXG4gICAgICAgICAgICB2ZXJ0ZXhfZGF0YS5hZGRWZXJ0ZXgodmVydGV4X3RlbXBsYXRlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZlcnRleF9lbGVtZW50cy5wdXNoKGVsZW1lbnRfb2Zmc2V0ICsgMCk7XG4gICAgICAgIHZlcnRleF9lbGVtZW50cy5wdXNoKGVsZW1lbnRfb2Zmc2V0ICsgMSk7XG4gICAgICAgIHZlcnRleF9lbGVtZW50cy5wdXNoKGVsZW1lbnRfb2Zmc2V0ICsgMik7XG4gICAgICAgIHZlcnRleF9lbGVtZW50cy5wdXNoKGVsZW1lbnRfb2Zmc2V0ICsgMik7XG4gICAgICAgIHZlcnRleF9lbGVtZW50cy5wdXNoKGVsZW1lbnRfb2Zmc2V0ICsgMyk7XG4gICAgICAgIHZlcnRleF9lbGVtZW50cy5wdXNoKGVsZW1lbnRfb2Zmc2V0ICsgMCk7XG5cbiAgICAgICAgZWxlbWVudF9vZmZzZXQgKz0gNDtcbiAgICB9XG59XG4iLCIvLyBQb2x5Z29uIGJ1aWxkZXJzXG5pbXBvcnQgR2VvIGZyb20gJy4uL2dlbyc7XG5pbXBvcnQgVmVjdG9yIGZyb20gJy4uL3ZlY3Rvcic7XG5pbXBvcnQgeyBkZWZhdWx0X3V2cywgb3V0c2lkZVRpbGUgfSBmcm9tICcuL2NvbW1vbic7XG5cbmltcG9ydCBlYXJjdXQgZnJvbSAnZWFyY3V0JztcblxuY29uc3QgdXBfdmVjMyA9IFswLCAwLCAxXTtcblxuLy8gVGVzc2VsYXRlIGEgZmxhdCAyRCBwb2x5Z29uXG4vLyB4ICYgeSBjb29yZGluYXRlcyB3aWxsIGJlIHNldCBhcyBmaXJzdCB0d28gZWxlbWVudHMgb2YgcHJvdmlkZWQgdmVydGV4X3RlbXBsYXRlXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRQb2x5Z29ucyAoXG4gICAgcG9seWdvbnMsXG4gICAgdmVydGV4X2RhdGEsIHZlcnRleF90ZW1wbGF0ZSxcbiAgICB7IHRleGNvb3JkX2luZGV4LCB0ZXhjb29yZF9zY2FsZSwgdGV4Y29vcmRfbm9ybWFsaXplIH0pIHtcblxuICAgIHZhciB2ZXJ0ZXhfZWxlbWVudHMgPSB2ZXJ0ZXhfZGF0YS52ZXJ0ZXhfZWxlbWVudHM7XG5cbiAgICBpZiAodGV4Y29vcmRfaW5kZXgpIHtcbiAgICAgICAgdGV4Y29vcmRfbm9ybWFsaXplID0gdGV4Y29vcmRfbm9ybWFsaXplIHx8IDE7XG4gICAgICAgIHZhciBbbWluX3UsIG1pbl92LCBtYXhfdSwgbWF4X3ZdID0gdGV4Y29vcmRfc2NhbGUgfHwgZGVmYXVsdF91dnM7XG4gICAgfVxuXG4gICAgdmFyIG51bV9wb2x5Z29ucyA9IHBvbHlnb25zLmxlbmd0aDtcbiAgICBmb3IgKHZhciBwPTA7IHAgPCBudW1fcG9seWdvbnM7IHArKykge1xuICAgICAgICB2YXIgZWxlbWVudF9vZmZzZXQgPSB2ZXJ0ZXhfZGF0YS52ZXJ0ZXhfY291bnQ7XG5cbiAgICAgICAgdmFyIHBvbHlnb24gPSBwb2x5Z29uc1twXTtcblxuICAgICAgICAvLyBGaW5kIHBvbHlnb24gZXh0ZW50cyB0byBjYWxjdWxhdGUgVVZzLCBmaXQgdGhlbSB0byB0aGUgYXhpcy1hbGlnbmVkIGJvdW5kaW5nIGJveFxuICAgICAgICBpZiAodGV4Y29vcmRfaW5kZXgpIHtcbiAgICAgICAgICAgIHZhciBbbWluX3gsIG1pbl95LCBtYXhfeCwgbWF4X3ldID0gR2VvLmZpbmRCb3VuZGluZ0JveChwb2x5Z29uKTtcbiAgICAgICAgICAgIHZhciBzcGFuX3ggPSBtYXhfeCAtIG1pbl94O1xuICAgICAgICAgICAgdmFyIHNwYW5feSA9IG1heF95IC0gbWluX3k7XG4gICAgICAgICAgICB2YXIgc2NhbGVfdSA9IChtYXhfdSAtIG1pbl91KSAvIHNwYW5feDtcbiAgICAgICAgICAgIHZhciBzY2FsZV92ID0gKG1heF92IC0gbWluX3YpIC8gc3Bhbl95O1xuICAgICAgICB9XG5cbiAgICAgICAgZm9yICh2YXIgcmluZ19pbmRleCA9IDA7IHJpbmdfaW5kZXggPCBwb2x5Z29uLmxlbmd0aDsgcmluZ19pbmRleCsrKXtcbiAgICAgICAgICAgIC8vIEFkZCB2ZXJ0ZXggZGF0YVxuICAgICAgICAgICAgdmFyIHBvbHlnb25fcmluZyA9IHBvbHlnb25bcmluZ19pbmRleF07XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBvbHlnb25fcmluZy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIHZhciB2ZXJ0ZXggPSBwb2x5Z29uX3JpbmdbaV07XG4gICAgICAgICAgICAgICAgdmVydGV4X3RlbXBsYXRlWzBdID0gdmVydGV4WzBdO1xuICAgICAgICAgICAgICAgIHZlcnRleF90ZW1wbGF0ZVsxXSA9IHZlcnRleFsxXTtcblxuICAgICAgICAgICAgICAgIC8vIEFkZCBVVnNcbiAgICAgICAgICAgICAgICBpZiAodGV4Y29vcmRfaW5kZXgpIHtcbiAgICAgICAgICAgICAgICAgICAgdmVydGV4X3RlbXBsYXRlW3RleGNvb3JkX2luZGV4ICsgMF0gPSAoKHZlcnRleFswXSAtIG1pbl94KSAqIHNjYWxlX3UgKyBtaW5fdSkgKiB0ZXhjb29yZF9ub3JtYWxpemU7XG4gICAgICAgICAgICAgICAgICAgIHZlcnRleF90ZW1wbGF0ZVt0ZXhjb29yZF9pbmRleCArIDFdID0gKCh2ZXJ0ZXhbMV0gLSBtaW5feSkgKiBzY2FsZV92ICsgbWluX3YpICogdGV4Y29vcmRfbm9ybWFsaXplO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHZlcnRleF9kYXRhLmFkZFZlcnRleCh2ZXJ0ZXhfdGVtcGxhdGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gQWRkIGVsZW1lbnQgaW5kaWNlc1xuICAgICAgICB2YXIgaW5kaWNlcyA9IHRyaWFuZ3VsYXRlUG9seWdvbihlYXJjdXQuZmxhdHRlbihwb2x5Z29uKSk7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaW5kaWNlcy5sZW5ndGg7IGkrKyl7XG4gICAgICAgICAgICB2ZXJ0ZXhfZWxlbWVudHMucHVzaChlbGVtZW50X29mZnNldCArIGluZGljZXNbaV0pO1xuICAgICAgICB9XG4gICAgfVxufVxuXG4vLyBUZXNzZWxhdGUgYW5kIGV4dHJ1ZGUgYSBmbGF0IDJEIHBvbHlnb24gaW50byBhIHNpbXBsZSAzRCBtb2RlbCB3aXRoIGZpeGVkIGhlaWdodCBhbmQgYWRkIHRvIEdMIHZlcnRleCBidWZmZXJcbmV4cG9ydCBmdW5jdGlvbiBidWlsZEV4dHJ1ZGVkUG9seWdvbnMgKFxuICAgIHBvbHlnb25zLFxuICAgIHosIGhlaWdodCwgbWluX2hlaWdodCxcbiAgICB2ZXJ0ZXhfZGF0YSwgdmVydGV4X3RlbXBsYXRlLFxuICAgIG5vcm1hbF9pbmRleCxcbiAgICBub3JtYWxfbm9ybWFsaXplLFxuICAgIHtcbiAgICAgICAgcmVtb3ZlX3RpbGVfZWRnZXMsXG4gICAgICAgIHRpbGVfZWRnZV90b2xlcmFuY2UsXG4gICAgICAgIHRleGNvb3JkX2luZGV4LFxuICAgICAgICB0ZXhjb29yZF9zY2FsZSxcbiAgICAgICAgdGV4Y29vcmRfbm9ybWFsaXplLFxuICAgICAgICB3aW5kaW5nXG4gICAgfSkge1xuXG4gICAgLy8gVG9wXG4gICAgdmFyIG1pbl96ID0geiArIChtaW5faGVpZ2h0IHx8IDApO1xuICAgIHZhciBtYXhfeiA9IHogKyBoZWlnaHQ7XG4gICAgdmVydGV4X3RlbXBsYXRlWzJdID0gbWF4X3o7XG4gICAgYnVpbGRQb2x5Z29ucyhwb2x5Z29ucywgdmVydGV4X2RhdGEsIHZlcnRleF90ZW1wbGF0ZSwgeyB0ZXhjb29yZF9pbmRleCwgdGV4Y29vcmRfc2NhbGUsIHRleGNvb3JkX25vcm1hbGl6ZSB9KTtcblxuICAgIHZhciB2ZXJ0ZXhfZWxlbWVudHMgPSB2ZXJ0ZXhfZGF0YS52ZXJ0ZXhfZWxlbWVudHM7XG4gICAgdmFyIGVsZW1lbnRfb2Zmc2V0ID0gdmVydGV4X2RhdGEudmVydGV4X2NvdW50O1xuXG4gICAgLy8gV2FsbHNcbiAgICAvLyBGaXQgVVZzIHRvIHdhbGwgcXVhZFxuICAgIGlmICh0ZXhjb29yZF9pbmRleCkge1xuICAgICAgICB0ZXhjb29yZF9ub3JtYWxpemUgPSB0ZXhjb29yZF9ub3JtYWxpemUgfHwgMTtcbiAgICAgICAgdmFyIFttaW5fdSwgbWluX3YsIG1heF91LCBtYXhfdl0gPSB0ZXhjb29yZF9zY2FsZSB8fCBkZWZhdWx0X3V2cztcbiAgICAgICAgdmFyIHRleGNvb3JkcyA9IFtcbiAgICAgICAgICAgIFttaW5fdSwgbWF4X3ZdLFxuICAgICAgICAgICAgW21pbl91LCBtaW5fdl0sXG4gICAgICAgICAgICBbbWF4X3UsIG1pbl92XSxcbiAgICAgICAgICAgIFttYXhfdSwgbWF4X3ZdXG4gICAgICAgIF07XG4gICAgfVxuXG4gICAgdmFyIG51bV9wb2x5Z29ucyA9IHBvbHlnb25zLmxlbmd0aDtcbiAgICBmb3IgKHZhciBwPTA7IHAgPCBudW1fcG9seWdvbnM7IHArKykge1xuICAgICAgICB2YXIgcG9seWdvbiA9IHBvbHlnb25zW3BdO1xuXG4gICAgICAgIGZvciAodmFyIHE9MDsgcSA8IHBvbHlnb24ubGVuZ3RoOyBxKyspIHtcbiAgICAgICAgICAgIHZhciBjb250b3VyID0gcG9seWdvbltxXTtcblxuICAgICAgICAgICAgZm9yICh2YXIgdz0wOyB3IDwgY29udG91ci5sZW5ndGggLSAxOyB3KyspIHtcbiAgICAgICAgICAgICAgICBpZiAocmVtb3ZlX3RpbGVfZWRnZXMgJiYgb3V0c2lkZVRpbGUoY29udG91clt3XSwgY29udG91clt3KzFdLCB0aWxlX2VkZ2VfdG9sZXJhbmNlKSkge1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsgLy8gZG9uJ3QgZXh0cnVkZSB0aWxlIGVkZ2VzXG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gV2FsbCBvcmRlciBpcyBkZXBlbmRlbnQgb24gd2luZGluZyBvcmRlciwgc28gdGhhdCBub3JtYWxzIGZhY2Ugb3V0d2FyZFxuICAgICAgICAgICAgICAgIGxldCB3MCwgdzE7XG4gICAgICAgICAgICAgICAgaWYgKHdpbmRpbmcgPT09ICdDQ1cnKSB7XG4gICAgICAgICAgICAgICAgICAgIHcwID0gdztcbiAgICAgICAgICAgICAgICAgICAgdzEgPSB3KzE7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB3MCA9IHcrMTtcbiAgICAgICAgICAgICAgICAgICAgdzEgPSB3O1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIFR3byB0cmlhbmdsZXMgZm9yIHRoZSBxdWFkIGZvcm1lZCBieSBlYWNoIHZlcnRleCBwYWlyLCBnb2luZyBmcm9tIGJvdHRvbSB0byB0b3AgaGVpZ2h0XG4gICAgICAgICAgICAgICAgdmFyIHdhbGxfdmVydGljZXMgPSBbXG4gICAgICAgICAgICAgICAgICAgIFtjb250b3VyW3cxXVswXSwgY29udG91clt3MV1bMV0sIG1heF96XSxcbiAgICAgICAgICAgICAgICAgICAgW2NvbnRvdXJbdzFdWzBdLCBjb250b3VyW3cxXVsxXSwgbWluX3pdLFxuICAgICAgICAgICAgICAgICAgICBbY29udG91clt3MF1bMF0sIGNvbnRvdXJbdzBdWzFdLCBtaW5fel0sXG4gICAgICAgICAgICAgICAgICAgIFtjb250b3VyW3cwXVswXSwgY29udG91clt3MF1bMV0sIG1heF96XVxuICAgICAgICAgICAgICAgIF07XG5cbiAgICAgICAgICAgICAgICAvLyBDYWxjIHRoZSBub3JtYWwgb2YgdGhlIHdhbGwgZnJvbSB1cCB2ZWN0b3IgYW5kIG9uZSBzZWdtZW50IG9mIHRoZSB3YWxsIHRyaWFuZ2xlc1xuICAgICAgICAgICAgICAgIGxldCB3YWxsX3ZlYyA9IFZlY3Rvci5ub3JtYWxpemUoW2NvbnRvdXJbdzFdWzBdIC0gY29udG91clt3MF1bMF0sIGNvbnRvdXJbdzFdWzFdIC0gY29udG91clt3MF1bMV0sIDBdKTtcbiAgICAgICAgICAgICAgICBsZXQgbm9ybWFsID0gVmVjdG9yLmNyb3NzKHVwX3ZlYzMsIHdhbGxfdmVjKTtcblxuICAgICAgICAgICAgICAgIC8vIFVwZGF0ZSB2ZXJ0ZXggdGVtcGxhdGUgd2l0aCBjdXJyZW50IHN1cmZhY2Ugbm9ybWFsXG4gICAgICAgICAgICAgICAgdmVydGV4X3RlbXBsYXRlW25vcm1hbF9pbmRleCArIDBdID0gbm9ybWFsWzBdICogbm9ybWFsX25vcm1hbGl6ZTtcbiAgICAgICAgICAgICAgICB2ZXJ0ZXhfdGVtcGxhdGVbbm9ybWFsX2luZGV4ICsgMV0gPSBub3JtYWxbMV0gKiBub3JtYWxfbm9ybWFsaXplO1xuICAgICAgICAgICAgICAgIHZlcnRleF90ZW1wbGF0ZVtub3JtYWxfaW5kZXggKyAyXSA9IG5vcm1hbFsyXSAqIG5vcm1hbF9ub3JtYWxpemU7XG5cbiAgICAgICAgICAgICAgICBmb3IgKHZhciB3dj0wOyB3diA8IHdhbGxfdmVydGljZXMubGVuZ3RoOyB3disrKSB7XG4gICAgICAgICAgICAgICAgICAgIHZlcnRleF90ZW1wbGF0ZVswXSA9IHdhbGxfdmVydGljZXNbd3ZdWzBdO1xuICAgICAgICAgICAgICAgICAgICB2ZXJ0ZXhfdGVtcGxhdGVbMV0gPSB3YWxsX3ZlcnRpY2VzW3d2XVsxXTtcbiAgICAgICAgICAgICAgICAgICAgdmVydGV4X3RlbXBsYXRlWzJdID0gd2FsbF92ZXJ0aWNlc1t3dl1bMl07XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHRleGNvb3JkX2luZGV4KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2ZXJ0ZXhfdGVtcGxhdGVbdGV4Y29vcmRfaW5kZXggKyAwXSA9IHRleGNvb3Jkc1t3dl1bMF0gKiB0ZXhjb29yZF9ub3JtYWxpemU7XG4gICAgICAgICAgICAgICAgICAgICAgICB2ZXJ0ZXhfdGVtcGxhdGVbdGV4Y29vcmRfaW5kZXggKyAxXSA9IHRleGNvb3Jkc1t3dl1bMV0gKiB0ZXhjb29yZF9ub3JtYWxpemU7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICB2ZXJ0ZXhfZGF0YS5hZGRWZXJ0ZXgodmVydGV4X3RlbXBsYXRlKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICB2ZXJ0ZXhfZWxlbWVudHMucHVzaChlbGVtZW50X29mZnNldCArIDApO1xuICAgICAgICAgICAgICAgIHZlcnRleF9lbGVtZW50cy5wdXNoKGVsZW1lbnRfb2Zmc2V0ICsgMSk7XG4gICAgICAgICAgICAgICAgdmVydGV4X2VsZW1lbnRzLnB1c2goZWxlbWVudF9vZmZzZXQgKyAyKTtcbiAgICAgICAgICAgICAgICB2ZXJ0ZXhfZWxlbWVudHMucHVzaChlbGVtZW50X29mZnNldCArIDIpO1xuICAgICAgICAgICAgICAgIHZlcnRleF9lbGVtZW50cy5wdXNoKGVsZW1lbnRfb2Zmc2V0ICsgMyk7XG4gICAgICAgICAgICAgICAgdmVydGV4X2VsZW1lbnRzLnB1c2goZWxlbWVudF9vZmZzZXQgKyAwKTtcblxuICAgICAgICAgICAgICAgIGVsZW1lbnRfb2Zmc2V0ICs9IDQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59XG5cbi8vIFRyaWFuZ3VsYXRpb24gdXNpbmcgZWFyY3V0XG4vLyBodHRwczovL2dpdGh1Yi5jb20vbWFwYm94L2VhcmN1dFxuZXhwb3J0IGZ1bmN0aW9uIHRyaWFuZ3VsYXRlUG9seWdvbiAoZGF0YSkge1xuICAgIHJldHVybiBlYXJjdXQoZGF0YS52ZXJ0aWNlcywgZGF0YS5ob2xlcywgZGF0YS5kaW1lbnNpb25zKTtcbn1cbiIsIi8vIEdlb21ldHJ5IGJ1aWxkaW5nIGZ1bmN0aW9uc1xuXG5pbXBvcnQgVmVjdG9yIGZyb20gJy4uL3ZlY3Rvcic7XG5pbXBvcnQgR2VvIGZyb20gJy4uL2dlbyc7XG5pbXBvcnQge291dHNpZGVUaWxlLCBpc0Nvb3JkT3V0c2lkZVRpbGV9IGZyb20gJy4vY29tbW9uJztcblxuY29uc3QgemVyb192ZWMyID0gWzAsIDBdO1xuXG4vLyBCdWlsZCB0ZXNzZWxsYXRlZCB0cmlhbmdsZXMgZm9yIGEgcG9seWxpbmVcbmNvbnN0IENBUF9UWVBFID0ge1xuICAgIGJ1dHQ6IDAsXG4gICAgc3F1YXJlOiAxLFxuICAgIHJvdW5kOiAyXG59O1xuXG5jb25zdCBKT0lOX1RZUEUgPSB7XG4gICAgbWl0ZXI6IDAsXG4gICAgYmV2ZWw6IDEsXG4gICAgcm91bmQ6IDJcbn07XG5cbmNvbnN0IERFRkFVTFQgPSB7XG4gICAgTUlURVJfTElNSVQ6IDMsXG4gICAgVEVYQ09PUkRfTk9STUFMSVpFOiAxLFxuICAgIFRFWENPT1JEX1JBVElPOiAxLFxuICAgIE1JTl9GQU5fV0lEVEg6IDUgICAgICAgIC8vIFdpZHRoIG9mIGxpbmUgaW4gdGlsZSB1bml0cyB0byBwbGFjZSAxIHRyaWFuZ2xlIHBlciBmYW5cbn07XG5cbi8vIFNjYWxpbmcgZmFjdG9yIHRvIGFkZCBwcmVjaXNpb24gdG8gbGluZSB0ZXh0dXJlIFYgY29vcmRpbmF0ZSBwYWNrZWQgYXMgbm9ybWFsaXplZCBzaG9ydFxuY29uc3Qgdl9zY2FsZV9hZGp1c3QgPSBHZW8udGlsZV9zY2FsZTtcblxuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkUG9seWxpbmVzIChsaW5lcywgd2lkdGgsIHZlcnRleF9kYXRhLCB2ZXJ0ZXhfdGVtcGxhdGUsXG4gICAge1xuICAgICAgICBjbG9zZWRfcG9seWdvbixcbiAgICAgICAgcmVtb3ZlX3RpbGVfZWRnZXMsXG4gICAgICAgIHRpbGVfZWRnZV90b2xlcmFuY2UsXG4gICAgICAgIHRleGNvb3JkX2luZGV4LFxuICAgICAgICB0ZXhjb29yZF9zY2FsZSxcbiAgICAgICAgdGV4Y29vcmRfd2lkdGgsXG4gICAgICAgIHRleGNvb3JkX3JhdGlvLFxuICAgICAgICB0ZXhjb29yZF9ub3JtYWxpemUsXG4gICAgICAgIHNjYWxpbmdfaW5kZXgsXG4gICAgICAgIHNjYWxpbmdfbm9ybWFsaXplLFxuICAgICAgICBqb2luLCBjYXAsXG4gICAgICAgIG1pdGVyX2xpbWl0XG4gICAgfSkge1xuXG4gICAgdmFyIGNhcF90eXBlID0gY2FwID8gQ0FQX1RZUEVbY2FwXSA6IENBUF9UWVBFLmJ1dHQ7XG4gICAgdmFyIGpvaW5fdHlwZSA9IGpvaW4gPyBKT0lOX1RZUEVbam9pbl0gOiBKT0lOX1RZUEUubWl0ZXI7XG5cbiAgICAvLyBDb25maWd1cmUgbWl0ZXIgbGltaXRcbiAgICBpZiAoam9pbl90eXBlID09PSBKT0lOX1RZUEUubWl0ZXIpIHtcbiAgICAgICAgbWl0ZXJfbGltaXQgPSBtaXRlcl9saW1pdCB8fCBERUZBVUxULk1JVEVSX0xJTUlUOyAvLyBkZWZhdWx0IG1pdGVyIGxpbWl0XG4gICAgICAgIHZhciBtaXRlcl9sZW5fc3EgPSBtaXRlcl9saW1pdCAqIG1pdGVyX2xpbWl0O1xuICAgIH1cblxuICAgIC8vIFRleHR1cmUgVmFyaWFibGVzXG4gICAgdmFyIHZfc2NhbGU7XG4gICAgaWYgKHRleGNvb3JkX2luZGV4KSB7XG4gICAgICAgIHRleGNvb3JkX25vcm1hbGl6ZSA9IHRleGNvb3JkX25vcm1hbGl6ZSB8fCBERUZBVUxULlRFWENPT1JEX05PUk1BTElaRTtcbiAgICAgICAgdGV4Y29vcmRfcmF0aW8gPSB0ZXhjb29yZF9yYXRpbyB8fCBERUZBVUxULlRFWENPT1JEX1JBVElPO1xuICAgICAgICB2X3NjYWxlID0gMSAvICh0ZXhjb29yZF93aWR0aCAqIHRleGNvb3JkX3JhdGlvICogdl9zY2FsZV9hZGp1c3QpOyAvLyBzY2FsZXMgbGluZSB0ZXh0dXJlIGFzIGEgcmF0aW8gb2YgdGhlIGxpbmUncyB3aWR0aFxuICAgIH1cblxuICAgIC8vIFZhbHVlcyB0aGF0IGFyZSBjb25zdGFudCBmb3IgZWFjaCBsaW5lIGFuZCBhcmUgcGFzc2VkIHRvIGhlbHBlciBmdW5jdGlvbnNcbiAgICB2YXIgY29udGV4dCA9IHtcbiAgICAgICAgY2xvc2VkX3BvbHlnb24sXG4gICAgICAgIHJlbW92ZV90aWxlX2VkZ2VzLFxuICAgICAgICB0aWxlX2VkZ2VfdG9sZXJhbmNlLFxuICAgICAgICBtaXRlcl9sZW5fc3EsXG4gICAgICAgIGpvaW5fdHlwZSxcbiAgICAgICAgY2FwX3R5cGUsXG4gICAgICAgIHZlcnRleF9kYXRhLFxuICAgICAgICB2ZXJ0ZXhfdGVtcGxhdGUsXG4gICAgICAgIGhhbGZfd2lkdGg6IHdpZHRoIC8gMixcbiAgICAgICAgc2NhbGluZ19pbmRleCxcbiAgICAgICAgc2NhbGluZ19ub3JtYWxpemUsXG4gICAgICAgIHZfc2NhbGUsXG4gICAgICAgIHRleGNvb3JkX2luZGV4LFxuICAgICAgICB0ZXhjb29yZF93aWR0aCxcbiAgICAgICAgdGV4Y29vcmRfbm9ybWFsaXplXG4gICAgfTtcblxuICAgIC8vIEJ1ZmZlciBmb3IgZXh0cmEgbGluZXMgdG8gcHJvY2Vzc1xuICAgIHZhciBleHRyYV9saW5lcyA9IFtdO1xuXG4gICAgLy8gUHJvY2VzcyBsaW5lc1xuICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBsaW5lcy5sZW5ndGg7IGluZGV4KyspIHtcbiAgICAgICAgYnVpbGRQb2x5bGluZShsaW5lc1tpbmRleF0sIGNvbnRleHQsIGV4dHJhX2xpbmVzKTtcbiAgICB9XG5cbiAgICAvLyBQcm9jZXNzIGV4dHJhIGxpbmVzXG4gICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IGV4dHJhX2xpbmVzLmxlbmd0aDsgaW5kZXgrKykge1xuICAgICAgICBidWlsZFBvbHlsaW5lKGV4dHJhX2xpbmVzW2luZGV4XSwgY29udGV4dCwgZXh0cmFfbGluZXMpO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gYnVpbGRQb2x5bGluZShsaW5lLCBjb250ZXh0LCBleHRyYV9saW5lcyl7XG4gICAgLy8gU2tpcCBpZiBsaW5lIGlzIG5vdCB2YWxpZFxuICAgIGlmIChsaW5lLmxlbmd0aCA8IDIpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHZhciB7am9pbl90eXBlLCBjYXBfdHlwZSwgY2xvc2VkX3BvbHlnb24sIHJlbW92ZV90aWxlX2VkZ2VzLCB0aWxlX2VkZ2VfdG9sZXJhbmNlLCB2X3NjYWxlLCBtaXRlcl9sZW5fc3F9ID0gY29udGV4dDtcblxuICAgIC8vIExvb3AgYmFja3dhcmRzIHRocm91Z2ggbGluZSB0byBhIHRpbGUgYm91bmRhcnkgaWYgZm91bmRcbiAgICBpZiAoY2xvc2VkX3BvbHlnb24gJiYgam9pbl90eXBlID09PSBKT0lOX1RZUEUubWl0ZXIpIHtcbiAgICAgICAgdmFyIGJvdW5kYXJ5SW5kZXggPSBnZXRUaWxlQm91bmRhcnlJbmRleChsaW5lKTtcbiAgICAgICAgaWYgKGJvdW5kYXJ5SW5kZXggIT09IDApIHtcbiAgICAgICAgICAgIC8vIGNyZWF0ZSBuZXcgbGluZSB0aGF0IGlzIGEgY3ljbGljIHBlcm11dGF0aW9uIG9mIHRoZSBvcmlnaW5hbFxuICAgICAgICAgICAgdmFyIHBlcm11dGVkTGluZSA9IHBlcm11dGVMaW5lKGxpbmUsIGJvdW5kYXJ5SW5kZXgpO1xuICAgICAgICAgICAgZXh0cmFfbGluZXMucHVzaChwZXJtdXRlZExpbmUpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgdmFyIGNvb3JkQ3VyciwgY29vcmROZXh0LCBub3JtUHJldiwgbm9ybU5leHQ7XG4gICAgdmFyIHYgPSAwOyAvLyBUZXh0dXJlIHYtY29vcmRpbmF0ZVxuXG4gICAgdmFyIGluZGV4X3N0YXJ0ID0gMDtcbiAgICB2YXIgaW5kZXhfZW5kID0gbGluZS5sZW5ndGggLSAxO1xuICAgIHZhciBpZ25vcmVkX2luZGljZXNfY291bnQgPSAwO1xuXG4gICAgLy8gRklSU1QgUE9JTlRcbiAgICAvLyBsb29wIHRocm91Z2ggYmVnaW5uaW5nIHBvaW50cyBpZiBkdXBsaWNhdGVzXG4gICAgY29vcmRDdXJyID0gbGluZVtpbmRleF9zdGFydF07XG4gICAgY29vcmROZXh0ID0gbGluZVtpbmRleF9zdGFydCArIDFdO1xuICAgIHdoaWxlIChWZWN0b3IuaXNFcXVhbChjb29yZEN1cnIsIGNvb3JkTmV4dCkpIHtcbiAgICAgICAgaW5kZXhfc3RhcnQrKztcbiAgICAgICAgY29vcmRDdXJyID0gY29vcmROZXh0O1xuICAgICAgICBjb29yZE5leHQgPSBsaW5lW2luZGV4X3N0YXJ0ICsgMV07XG4gICAgICAgIGlnbm9yZWRfaW5kaWNlc19jb3VudCsrO1xuICAgICAgICBpZiAoaW5kZXhfc3RhcnQgPT09IGxpbmUubGVuZ3RoIC0gMSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gbG9vcCB0aHJvdWdoIGVuZGluZyBwb2ludHMgdG8gY2hlY2sgZm9yIGR1cGxpY2F0ZXNcbiAgICB3aGlsZSAoVmVjdG9yLmlzRXF1YWwobGluZVtpbmRleF9lbmRdLCBsaW5lW2luZGV4X2VuZCAtIDFdKSkge1xuICAgICAgICBpbmRleF9lbmQtLTtcbiAgICAgICAgaWdub3JlZF9pbmRpY2VzX2NvdW50Kys7XG4gICAgICAgIGlmIChpbmRleF9lbmQgPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGlmIChsaW5lLmxlbmd0aCA8IDIgKyBpZ25vcmVkX2luZGljZXNfY291bnQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIG5vcm1OZXh0ID0gVmVjdG9yLm5vcm1hbGl6ZShWZWN0b3IucGVycChjb29yZEN1cnIsIGNvb3JkTmV4dCkpO1xuXG4gICAgLy8gU2tpcCB0aWxlIGJvdW5kYXJ5IGxpbmVzIGFuZCBhcHBlbmQgYSBuZXcgbGluZSBpZiBuZWVkZWRcbiAgICBpZiAocmVtb3ZlX3RpbGVfZWRnZXMgJiYgb3V0c2lkZVRpbGUoY29vcmRDdXJyLCBjb29yZE5leHQsIHRpbGVfZWRnZV90b2xlcmFuY2UpKSB7XG4gICAgICAgIHZhciBub25Cb3VuZGFyeVNlZ21lbnQgPSBnZXROZXh0Tm9uQm91bmRhcnlTZWdtZW50KGxpbmUsIGluZGV4X3N0YXJ0LCB0aWxlX2VkZ2VfdG9sZXJhbmNlKTtcbiAgICAgICAgaWYgKG5vbkJvdW5kYXJ5U2VnbWVudCkge1xuICAgICAgICAgICAgZXh0cmFfbGluZXMucHVzaChub25Cb3VuZGFyeVNlZ21lbnQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoY2xvc2VkX3BvbHlnb24pe1xuICAgICAgICAvLyBCZWdpbiB0aGUgcG9seWdvbiB3aXRoIGEgam9pbiAoY29ubmVjdGluZyB0aGUgZmlyc3QgYW5kIGxhc3Qgc2VnbWVudHMpXG4gICAgICAgIG5vcm1QcmV2ID0gVmVjdG9yLm5vcm1hbGl6ZShWZWN0b3IucGVycChsaW5lW2luZGV4X2VuZCAtIDFdLCBjb29yZEN1cnIpKTtcbiAgICAgICAgc3RhcnRQb2x5Z29uKGNvb3JkQ3Vyciwgbm9ybVByZXYsIG5vcm1OZXh0LCBqb2luX3R5cGUsIGNvbnRleHQpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgLy8gSWYgbGluZSBiZWdpbnMgYXQgZWRnZSwgZG9uJ3QgYWRkIGEgY2FwXG4gICAgICAgIGlmICghaXNDb29yZE91dHNpZGVUaWxlKGNvb3JkQ3VycikpIHtcbiAgICAgICAgICAgIGFkZENhcChjb29yZEN1cnIsIHYsIG5vcm1OZXh0LCBjYXBfdHlwZSwgdHJ1ZSwgY29udGV4dCk7XG4gICAgICAgICAgICBpZiAoY2FwX3R5cGUgIT09IENBUF9UWVBFLmJ1dHQpIHtcbiAgICAgICAgICAgICAgICB2ICs9IDAuNSAqIHZfc2NhbGUgKiBjb250ZXh0LnRleGNvb3JkX3dpZHRoO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gQWRkIGZpcnN0IHBhaXIgb2YgcG9pbnRzIGZvciB0aGUgbGluZSBzdHJpcFxuICAgICAgICBhZGRWZXJ0ZXgoY29vcmRDdXJyLCBub3JtTmV4dCwgWzEsIHZdLCBjb250ZXh0KTtcbiAgICAgICAgYWRkVmVydGV4KGNvb3JkQ3VyciwgVmVjdG9yLm5lZyhub3JtTmV4dCksIFswLCB2XSwgY29udGV4dCk7XG4gICAgfVxuXG4gICAgLy8gSU5URVJNRURJQVJZIFBPSU5UU1xuICAgIHYgKz0gdl9zY2FsZSAqIFZlY3Rvci5sZW5ndGgoVmVjdG9yLnN1Yihjb29yZE5leHQsIGNvb3JkQ3VycikpO1xuICAgIGZvciAodmFyIGkgPSBpbmRleF9zdGFydCArIDE7IGkgPCBpbmRleF9lbmQ7IGkrKykge1xuICAgICAgICB2YXIgY3VyckluZGV4ID0gaTtcbiAgICAgICAgdmFyIG5leHRJbmRleCA9IGkgKyAxO1xuICAgICAgICBjb29yZEN1cnIgPSBsaW5lW2N1cnJJbmRleF07XG4gICAgICAgIGNvb3JkTmV4dCA9IGxpbmVbbmV4dEluZGV4XTtcblxuICAgICAgICAvLyBTa2lwIHJlZHVuZGFudCB2ZXJ0aWNlc1xuICAgICAgICBpZiAoVmVjdG9yLmlzRXF1YWwoY29vcmRDdXJyLCBjb29yZE5leHQpKSB7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFJlbW92ZSB0aWxlIGJvdW5kYXJpZXNcbiAgICAgICAgaWYgKHJlbW92ZV90aWxlX2VkZ2VzICYmIG91dHNpZGVUaWxlKGNvb3JkQ3VyciwgY29vcmROZXh0LCB0aWxlX2VkZ2VfdG9sZXJhbmNlKSkge1xuICAgICAgICAgICAgYWRkVmVydGV4KGNvb3JkQ3Vyciwgbm9ybU5leHQsIFsxLCB2XSwgY29udGV4dCk7XG4gICAgICAgICAgICBhZGRWZXJ0ZXgoY29vcmRDdXJyLCBWZWN0b3IubmVnKG5vcm1OZXh0KSwgWzAsIHZdLCBjb250ZXh0KTtcbiAgICAgICAgICAgIGluZGV4UGFpcnMoMSwgY29udGV4dCk7XG5cbiAgICAgICAgICAgIHZhciBub25Cb3VuZGFyeUxpbmVzID0gZ2V0TmV4dE5vbkJvdW5kYXJ5U2VnbWVudChsaW5lLCBjdXJySW5kZXggKyAxLCB0aWxlX2VkZ2VfdG9sZXJhbmNlKTtcbiAgICAgICAgICAgIGlmIChub25Cb3VuZGFyeUxpbmVzKSB7XG4gICAgICAgICAgICAgICAgZXh0cmFfbGluZXMucHVzaChub25Cb3VuZGFyeUxpbmVzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIG5vcm1QcmV2ID0gbm9ybU5leHQ7XG4gICAgICAgIG5vcm1OZXh0ID0gVmVjdG9yLm5vcm1hbGl6ZShWZWN0b3IucGVycChjb29yZEN1cnIsIGNvb3JkTmV4dCkpO1xuXG4gICAgICAgIC8vIEFkZCBqb2luXG4gICAgICAgIGlmIChqb2luX3R5cGUgPT09IEpPSU5fVFlQRS5taXRlcikge1xuICAgICAgICAgICAgYWRkTWl0ZXIodiwgY29vcmRDdXJyLCBub3JtUHJldiwgbm9ybU5leHQsIG1pdGVyX2xlbl9zcSwgZmFsc2UsIGNvbnRleHQpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgYWRkSm9pbihqb2luX3R5cGUsIHYsIGNvb3JkQ3Vyciwgbm9ybVByZXYsIG5vcm1OZXh0LCBmYWxzZSwgY29udGV4dCk7XG4gICAgICAgIH1cblxuICAgICAgICB2ICs9IHZfc2NhbGUgKiBWZWN0b3IubGVuZ3RoKFZlY3Rvci5zdWIoY29vcmROZXh0LCBjb29yZEN1cnIpKTtcbiAgICB9XG5cbiAgICAvLyBMQVNUIFBPSU5UXG4gICAgY29vcmRDdXJyID0gY29vcmROZXh0O1xuICAgIG5vcm1QcmV2ID0gbm9ybU5leHQ7XG5cbiAgICBpZiAoY2xvc2VkX3BvbHlnb24pIHtcbiAgICAgICAgLy8gQ2xvc2UgdGhlIHBvbHlnb24gd2l0aCBhIG1pdGVyIGpvaW50IG9yIGJ1dHQgY2FwIGlmIG9uIGEgdGlsZSBib3VuZGFyeVxuICAgICAgICBub3JtTmV4dCA9IFZlY3Rvci5ub3JtYWxpemUoVmVjdG9yLnBlcnAoY29vcmRDdXJyLCBsaW5lWzFdKSk7XG4gICAgICAgIGVuZFBvbHlnb24oY29vcmRDdXJyLCBub3JtUHJldiwgbm9ybU5leHQsIGpvaW5fdHlwZSwgdiwgY29udGV4dCk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICAvLyBGaW5pc2ggdGhlIGxpbmUgc3RyaXBcbiAgICAgICAgYWRkVmVydGV4KGNvb3JkQ3Vyciwgbm9ybVByZXYsIFsxLCB2XSwgY29udGV4dCk7XG4gICAgICAgIGFkZFZlcnRleChjb29yZEN1cnIsIFZlY3Rvci5uZWcobm9ybVByZXYpLCBbMCwgdl0sIGNvbnRleHQpO1xuICAgICAgICBpbmRleFBhaXJzKDEsIGNvbnRleHQpO1xuXG4gICAgICAgIC8vIElmIGxpbmUgZW5kcyBhdCBlZGdlLCBkb24ndCBhZGQgYSBjYXBcbiAgICAgICAgaWYgKCFpc0Nvb3JkT3V0c2lkZVRpbGUoY29vcmRDdXJyKSkge1xuICAgICAgICAgICAgYWRkQ2FwKGNvb3JkQ3Vyciwgdiwgbm9ybVByZXYsIGNhcF90eXBlLCBmYWxzZSwgY29udGV4dCk7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbmZ1bmN0aW9uIGdldFRpbGVCb3VuZGFyeUluZGV4KGxpbmUpe1xuICAgIGlmIChpc0Nvb3JkT3V0c2lkZVRpbGUobGluZVswXSkpIHtcbiAgICAgICAgcmV0dXJuIDA7XG4gICAgfVxuXG4gICAgZm9yICh2YXIgYmFja0luZGV4ID0gMDsgYmFja0luZGV4IDwgbGluZS5sZW5ndGg7IGJhY2tJbmRleCsrKSB7XG4gICAgICAgIHZhciBjb29yZEN1cnIgPSBsaW5lW2xpbmUubGVuZ3RoIC0gMSAtIGJhY2tJbmRleF07XG4gICAgICAgIGlmIChpc0Nvb3JkT3V0c2lkZVRpbGUoY29vcmRDdXJyKSkge1xuICAgICAgICAgICAgcmV0dXJuIGxpbmUubGVuZ3RoIC0gMSAtIGJhY2tJbmRleDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiAwO1xufVxuXG4vLyBJdGVyYXRlIHRocm91Z2ggbGluZSBmcm9tIHN0YXJ0SW5kZXggdG8gZmluZCBhIHNlZ21lbnQgbm90IG9uIGEgdGlsZSBib3VuZGFyeSwgaWYgYW55LlxuZnVuY3Rpb24gZ2V0TmV4dE5vbkJvdW5kYXJ5U2VnbWVudCAobGluZSwgc3RhcnRJbmRleCwgdG9sZXJhbmNlKSB7XG4gICAgdmFyIGVuZEluZGV4ID0gc3RhcnRJbmRleDtcbiAgICB3aGlsZSAobGluZVtlbmRJbmRleCArIDFdICYmIG91dHNpZGVUaWxlKGxpbmVbZW5kSW5kZXhdLCBsaW5lW2VuZEluZGV4ICsgMV0sIHRvbGVyYW5jZSkpIHtcbiAgICAgICAgZW5kSW5kZXgrKztcbiAgICB9XG5cbiAgICAvLyBJZiB0aGVyZSBpcyBhIGxpbmUgc2VnbWVudCByZW1haW5pbmcgdGhhdCBpcyB3aXRoaW4gdGhlIHRpbGUsIHB1c2ggaXQgdG8gdGhlIGxpbmVzIGFycmF5XG4gICAgcmV0dXJuIChsaW5lLmxlbmd0aCAtIGVuZEluZGV4ID49IDIpID8gbGluZS5zbGljZShlbmRJbmRleCkgOiBmYWxzZTtcbn1cblxuLy8gQmVnaW4gYSBwb2x5Z29uIHdpdGggYSBqb2luIGNvbm5lY3RpbmcgdG8gdGhlIGxhc3Qgc2VnbWVudCAoaWYgdmFsaWQgam9pbi10eXBlIHNwZWNpZmllZClcbmZ1bmN0aW9uIHN0YXJ0UG9seWdvbihjb29yZEN1cnIsIG5vcm1QcmV2LCBub3JtTmV4dCwgam9pbl90eXBlLCBjb250ZXh0KXtcbiAgICAvLyBJZiBwb2x5Z29uIHN0YXJ0cyBvbiBhIHRpbGUgYm91bmRhcnksIGRvbid0IGFkZCBhIGpvaW5cbiAgICBpZiAoam9pbl90eXBlID09PSB1bmRlZmluZWQgfHwgaXNDb29yZE91dHNpZGVUaWxlKGNvb3JkQ3VycikpIHtcbiAgICAgICAgYWRkVmVydGV4KGNvb3JkQ3Vyciwgbm9ybU5leHQsIFsxLCAwXSwgY29udGV4dCk7XG4gICAgICAgIGFkZFZlcnRleChjb29yZEN1cnIsIFZlY3Rvci5uZWcobm9ybU5leHQpLCBbMCwgMF0sIGNvbnRleHQpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgLy8gSWYgcG9seWdvbiBzdGFydHMgd2l0aGluIGEgdGlsZSwgYWRkIGEgam9pblxuICAgICAgICB2YXIgdiA9IDA7XG4gICAgICAgIGlmIChqb2luX3R5cGUgPT09IEpPSU5fVFlQRS5taXRlcikge1xuICAgICAgICAgICAgYWRkTWl0ZXIodiwgY29vcmRDdXJyLCBub3JtUHJldiwgbm9ybU5leHQsIGNvbnRleHQubWl0ZXJfbGVuX3NxLCB0cnVlLCBjb250ZXh0KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGFkZEpvaW4oam9pbl90eXBlLCB2LCBjb29yZEN1cnIsIG5vcm1QcmV2LCBub3JtTmV4dCwgdHJ1ZSwgY29udGV4dCk7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbi8vIEVuZCBhIHBvbHlnb24gYXBwcm9wcmlhdGVseVxuZnVuY3Rpb24gZW5kUG9seWdvbihjb29yZEN1cnIsIG5vcm1QcmV2LCBub3JtTmV4dCwgam9pbl90eXBlLCB2LCBjb250ZXh0KSB7XG4gICAgLy8gSWYgcG9seWdvbiBlbmRzIG9uIGEgdGlsZSBib3VuZGFyeSwgZG9uJ3QgYWRkIGEgam9pblxuICAgIGlmIChpc0Nvb3JkT3V0c2lkZVRpbGUoY29vcmRDdXJyKSkge1xuICAgICAgICBhZGRWZXJ0ZXgoY29vcmRDdXJyLCBub3JtUHJldiwgWzEsIHZdLCBjb250ZXh0KTtcbiAgICAgICAgYWRkVmVydGV4KGNvb3JkQ3VyciwgVmVjdG9yLm5lZyhub3JtUHJldiksIFswLCB2XSwgY29udGV4dCk7XG4gICAgICAgIGluZGV4UGFpcnMoMSwgY29udGV4dCk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICAvLyBJZiBwb2x5Z29uIGVuZHMgd2l0aGluIGEgdGlsZSwgYWRkIE1pdGVyIG9yIG5vIGpvaW50IChqb2luIGFkZGVkIG9uIHN0YXJ0UG9seWdvbilcbiAgICAgICAgdmFyIG1pdGVyVmVjID0gY3JlYXRlTWl0ZXJWZWMobm9ybVByZXYsIG5vcm1OZXh0KTtcblxuICAgICAgICBpZiAoam9pbl90eXBlID09PSBKT0lOX1RZUEUubWl0ZXIgJiYgVmVjdG9yLmxlbmd0aFNxKG1pdGVyVmVjKSA+IGNvbnRleHQubWl0ZXJfbGVuX3NxKSB7XG4gICAgICAgICAgICBqb2luX3R5cGUgPSBKT0lOX1RZUEUuYmV2ZWw7IC8vIHN3aXRjaCB0byBiZXZlbFxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGpvaW5fdHlwZSA9PT0gSk9JTl9UWVBFLm1pdGVyKSB7XG4gICAgICAgICAgICBhZGRWZXJ0ZXgoY29vcmRDdXJyLCBtaXRlclZlYywgWzEsIHZdLCBjb250ZXh0KTtcbiAgICAgICAgICAgIGFkZFZlcnRleChjb29yZEN1cnIsIFZlY3Rvci5uZWcobWl0ZXJWZWMpLCBbMCwgdl0sIGNvbnRleHQpO1xuICAgICAgICAgICAgaW5kZXhQYWlycygxLCBjb250ZXh0KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGFkZFZlcnRleChjb29yZEN1cnIsIG5vcm1QcmV2LCBbMSwgdl0sIGNvbnRleHQpO1xuICAgICAgICAgICAgYWRkVmVydGV4KGNvb3JkQ3VyciwgVmVjdG9yLm5lZyhub3JtUHJldiksIFswLCB2XSwgY29udGV4dCk7XG4gICAgICAgICAgICBpbmRleFBhaXJzKDEsIGNvbnRleHQpO1xuICAgICAgICB9XG4gICAgfVxufVxuXG5mdW5jdGlvbiBjcmVhdGVNaXRlclZlYyhub3JtUHJldiwgbm9ybU5leHQpIHtcbiAgICB2YXIgbWl0ZXJWZWMgPSBWZWN0b3Iubm9ybWFsaXplKFZlY3Rvci5hZGQobm9ybVByZXYsIG5vcm1OZXh0KSk7XG4gICAgdmFyIHNjYWxlID0gMiAvICgxICsgTWF0aC5hYnMoVmVjdG9yLmRvdChub3JtUHJldiwgbWl0ZXJWZWMpKSk7XG4gICAgcmV0dXJuIFZlY3Rvci5tdWx0KG1pdGVyVmVjLCBzY2FsZSAqIHNjYWxlKTtcbn1cblxuLy8gQWRkIGEgbWl0ZXIgdmVjdG9yIG9yIGEgam9pbiBpZiB0aGUgbWl0ZXIgaXMgdG9vIHNoYXJwXG5mdW5jdGlvbiBhZGRNaXRlciAodiwgY29vcmRDdXJyLCBub3JtUHJldiwgbm9ybU5leHQsIG1pdGVyX2xlbl9zcSwgaXNCZWdpbm5pbmcsIGNvbnRleHQpIHtcbiAgICB2YXIgbWl0ZXJWZWMgPSBjcmVhdGVNaXRlclZlYyhub3JtUHJldiwgbm9ybU5leHQpO1xuXG4gICAgLy8gIE1pdGVyIGxpbWl0OiBpZiBtaXRlciBqb2luIGlzIHRvbyBzaGFycCwgY29udmVydCB0byBiZXZlbCBpbnN0ZWFkXG4gICAgaWYgKFZlY3Rvci5sZW5ndGhTcShtaXRlclZlYykgPiBtaXRlcl9sZW5fc3EpIHtcbiAgICAgICAgYWRkSm9pbihKT0lOX1RZUEUubWl0ZXIsIHYsIGNvb3JkQ3Vyciwgbm9ybVByZXYsIG5vcm1OZXh0LCBpc0JlZ2lubmluZywgY29udGV4dCk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBhZGRWZXJ0ZXgoY29vcmRDdXJyLCBtaXRlclZlYywgWzEsIHZdLCBjb250ZXh0KTtcbiAgICAgICAgYWRkVmVydGV4KGNvb3JkQ3VyciwgVmVjdG9yLm5lZyhtaXRlclZlYyksIFswLCB2XSwgY29udGV4dCk7XG4gICAgICAgIGlmICghaXNCZWdpbm5pbmcpIHtcbiAgICAgICAgICAgIGluZGV4UGFpcnMoMSwgY29udGV4dCk7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbi8vIEFkZCBhIGJldmVsIG9yIHJvdW5kIGpvaW5cbmZ1bmN0aW9uIGFkZEpvaW4oam9pbl90eXBlLCB2LCBjb29yZEN1cnIsIG5vcm1QcmV2LCBub3JtTmV4dCwgaXNCZWdpbm5pbmcsIGNvbnRleHQpIHtcbiAgICB2YXIgbWl0ZXJWZWMgPSBjcmVhdGVNaXRlclZlYyhub3JtUHJldiwgbm9ybU5leHQpO1xuICAgIHZhciBpc0Nsb2Nrd2lzZSA9IChub3JtTmV4dFswXSAqIG5vcm1QcmV2WzFdIC0gbm9ybU5leHRbMV0gKiBub3JtUHJldlswXSA+IDApO1xuXG4gICAgaWYgKGlzQ2xvY2t3aXNlKXtcbiAgICAgICAgYWRkVmVydGV4KGNvb3JkQ3VyciwgbWl0ZXJWZWMsIFsxLCB2XSwgY29udGV4dCk7XG4gICAgICAgIGFkZFZlcnRleChjb29yZEN1cnIsIFZlY3Rvci5uZWcobm9ybVByZXYpLCBbMCwgdl0sIGNvbnRleHQpO1xuXG4gICAgICAgIGlmICghaXNCZWdpbm5pbmcpIHtcbiAgICAgICAgICAgIGluZGV4UGFpcnMoMSwgY29udGV4dCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoam9pbl90eXBlID09PSBKT0lOX1RZUEUuYmV2ZWwpIHtcbiAgICAgICAgICAgIGFkZEJldmVsKGNvb3JkQ3VycixcbiAgICAgICAgICAgICAgICBWZWN0b3IubmVnKG5vcm1QcmV2KSwgbWl0ZXJWZWMsIFZlY3Rvci5uZWcobm9ybU5leHQpLFxuICAgICAgICAgICAgICAgIFswLCB2XSwgWzEsIHZdLCBbMCwgdl0sXG4gICAgICAgICAgICAgICAgY29udGV4dFxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChqb2luX3R5cGUgPT09IEpPSU5fVFlQRS5yb3VuZCkge1xuICAgICAgICAgICAgYWRkRmFuKGNvb3JkQ3VycixcbiAgICAgICAgICAgICAgICBWZWN0b3IubmVnKG5vcm1QcmV2KSwgbWl0ZXJWZWMsIFZlY3Rvci5uZWcobm9ybU5leHQpLFxuICAgICAgICAgICAgICAgIFswLCB2XSwgWzEsIHZdLCBbMCwgdl0sXG4gICAgICAgICAgICAgICAgZmFsc2UsIGNvbnRleHRcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICBhZGRWZXJ0ZXgoY29vcmRDdXJyLCBtaXRlclZlYywgWzEsIHZdLCBjb250ZXh0KTtcbiAgICAgICAgYWRkVmVydGV4KGNvb3JkQ3VyciwgVmVjdG9yLm5lZyhub3JtTmV4dCksIFswLCB2XSwgY29udGV4dCk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBhZGRWZXJ0ZXgoY29vcmRDdXJyLCBub3JtUHJldiwgWzEsIHZdLCBjb250ZXh0KTtcbiAgICAgICAgYWRkVmVydGV4KGNvb3JkQ3VyciwgVmVjdG9yLm5lZyhtaXRlclZlYyksIFswLCB2XSwgY29udGV4dCk7XG5cbiAgICAgICAgaWYgKCFpc0JlZ2lubmluZykge1xuICAgICAgICAgICAgaW5kZXhQYWlycygxLCBjb250ZXh0KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChqb2luX3R5cGUgPT09IEpPSU5fVFlQRS5iZXZlbCkge1xuICAgICAgICAgICAgYWRkQmV2ZWwoY29vcmRDdXJyLFxuICAgICAgICAgICAgICAgIG5vcm1QcmV2LCBWZWN0b3IubmVnKG1pdGVyVmVjKSwgbm9ybU5leHQsXG4gICAgICAgICAgICAgICAgWzEsIHZdLCBbMCwgdl0sIFsxLCB2XSxcbiAgICAgICAgICAgICAgICBjb250ZXh0XG4gICAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGpvaW5fdHlwZSA9PT0gSk9JTl9UWVBFLnJvdW5kKSB7XG4gICAgICAgICAgICBhZGRGYW4oY29vcmRDdXJyLFxuICAgICAgICAgICAgICAgIG5vcm1QcmV2LCBWZWN0b3IubmVnKG1pdGVyVmVjKSwgbm9ybU5leHQsXG4gICAgICAgICAgICAgICAgWzEsIHZdLCBbMCwgdl0sIFsxLCB2XSxcbiAgICAgICAgICAgICAgICBmYWxzZSwgY29udGV4dFxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGFkZFZlcnRleChjb29yZEN1cnIsIG5vcm1OZXh0LCBbMSwgdl0sIGNvbnRleHQpO1xuICAgICAgICBhZGRWZXJ0ZXgoY29vcmRDdXJyLCBWZWN0b3IubmVnKG1pdGVyVmVjKSwgWzAsIHZdLCBjb250ZXh0KTtcbiAgICB9XG59XG5cbi8vIEFkZCBpbmRpY2VzIHRvIHZlcnRleF9lbGVtZW50c1xuZnVuY3Rpb24gaW5kZXhQYWlycyhudW1fcGFpcnMsIGNvbnRleHQpe1xuICAgIHZhciB2ZXJ0ZXhfZWxlbWVudHMgPSBjb250ZXh0LnZlcnRleF9kYXRhLnZlcnRleF9lbGVtZW50cztcbiAgICB2YXIgbnVtX3ZlcnRpY2VzID0gY29udGV4dC52ZXJ0ZXhfZGF0YS52ZXJ0ZXhfY291bnQ7XG4gICAgdmFyIG9mZnNldCA9IG51bV92ZXJ0aWNlcyAtIDIgKiBudW1fcGFpcnMgLSAyO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBudW1fcGFpcnM7IGkrKyl7XG4gICAgICAgIHZlcnRleF9lbGVtZW50cy5wdXNoKG9mZnNldCArIDIgKiBpICsgMik7XG4gICAgICAgIHZlcnRleF9lbGVtZW50cy5wdXNoKG9mZnNldCArIDIgKiBpICsgMSk7XG4gICAgICAgIHZlcnRleF9lbGVtZW50cy5wdXNoKG9mZnNldCArIDIgKiBpICsgMCk7XG4gICAgICAgIHZlcnRleF9lbGVtZW50cy5wdXNoKG9mZnNldCArIDIgKiBpICsgMik7XG4gICAgICAgIHZlcnRleF9lbGVtZW50cy5wdXNoKG9mZnNldCArIDIgKiBpICsgMyk7XG4gICAgICAgIHZlcnRleF9lbGVtZW50cy5wdXNoKG9mZnNldCArIDIgKiBpICsgMSk7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBhZGRWZXJ0ZXgoY29vcmRpbmF0ZSwgbm9ybWFsLCB1diwgY29udGV4dCkge1xuICAgIHZhciB2ZXJ0ZXhfdGVtcGxhdGUgPSBjb250ZXh0LnZlcnRleF90ZW1wbGF0ZTtcbiAgICB2YXIgdmVydGV4X2RhdGEgPSBjb250ZXh0LnZlcnRleF9kYXRhO1xuXG4gICAgYnVpbGRWZXJ0ZXhUZW1wbGF0ZSh2ZXJ0ZXhfdGVtcGxhdGUsIGNvb3JkaW5hdGUsIHV2LCBub3JtYWwsIGNvbnRleHQpO1xuICAgIHZlcnRleF9kYXRhLmFkZFZlcnRleCh2ZXJ0ZXhfdGVtcGxhdGUpO1xufVxuXG5mdW5jdGlvbiBidWlsZFZlcnRleFRlbXBsYXRlICh2ZXJ0ZXhfdGVtcGxhdGUsIHZlcnRleCwgdGV4dHVyZV9jb29yZCwgc2NhbGUsIGNvbnRleHQpIHtcbiAgICAvLyBzZXQgdmVydGV4IHBvc2l0aW9uXG4gICAgdmVydGV4X3RlbXBsYXRlWzBdID0gdmVydGV4WzBdO1xuICAgIHZlcnRleF90ZW1wbGF0ZVsxXSA9IHZlcnRleFsxXTtcblxuICAgIC8vIHNldCBVVnNcbiAgICBpZiAoY29udGV4dC50ZXhjb29yZF9pbmRleCAmJiB0ZXh0dXJlX2Nvb3JkKSB7XG4gICAgICAgIHZlcnRleF90ZW1wbGF0ZVtjb250ZXh0LnRleGNvb3JkX2luZGV4ICsgMF0gPSB0ZXh0dXJlX2Nvb3JkWzBdICogY29udGV4dC50ZXhjb29yZF9ub3JtYWxpemU7XG4gICAgICAgIHZlcnRleF90ZW1wbGF0ZVtjb250ZXh0LnRleGNvb3JkX2luZGV4ICsgMV0gPSB0ZXh0dXJlX2Nvb3JkWzFdICogY29udGV4dC50ZXhjb29yZF9ub3JtYWxpemU7XG4gICAgfVxuXG4gICAgLy8gc2V0IFNjYWxpbmcgdmVydGV4IChYLCBZIG5vcm1hbCBkaXJlY3Rpb24gKyBaIGhhbGZfd2lkdGggYXMgYXR0cmlidXRlKVxuICAgIGlmIChjb250ZXh0LnNjYWxpbmdfaW5kZXgpIHtcbiAgICAgICAgdmVydGV4X3RlbXBsYXRlW2NvbnRleHQuc2NhbGluZ19pbmRleCArIDBdID0gc2NhbGVbMF0gKiBjb250ZXh0LnNjYWxpbmdfbm9ybWFsaXplO1xuICAgICAgICB2ZXJ0ZXhfdGVtcGxhdGVbY29udGV4dC5zY2FsaW5nX2luZGV4ICsgMV0gPSBzY2FsZVsxXSAqIGNvbnRleHQuc2NhbGluZ19ub3JtYWxpemU7XG4gICAgICAgIHZlcnRleF90ZW1wbGF0ZVtjb250ZXh0LnNjYWxpbmdfaW5kZXggKyAyXSA9IGNvbnRleHQuaGFsZl93aWR0aDtcbiAgICB9XG59XG5cbi8vICBUZXNzYWxhdGUgYSBGQU4gZ2VvbWV0cnkgYmV0d2VlbiBwb2ludHMgQSAgICAgICBCXG4vLyAgdXNpbmcgdGhlaXIgbm9ybWFscyBmcm9tIGEgY2VudGVyICAgICAgICBcXCAuIC4gL1xuLy8gIGFuZCBpbnRlcnBvbGF0aW5nIHRoZWlyIFVWcyAgICAgICAgICAgICAgIFxcIHAgL1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXC4vXG5mdW5jdGlvbiBhZGRGYW4gKGNvb3JkLCBuQSwgbkMsIG5CLCB1dkEsIHV2QywgdXZCLCBpc0NhcCwgY29udGV4dCkge1xuICAgIHZhciBjcm9zcyA9IG5BWzBdICogbkJbMV0gLSBuQVsxXSAqIG5CWzBdO1xuICAgIHZhciBkb3QgPSBWZWN0b3IuZG90KG5BLCBuQik7XG5cbiAgICB2YXIgYW5nbGUgPSBNYXRoLmF0YW4yKGNyb3NzLCBkb3QpO1xuICAgIHdoaWxlIChhbmdsZSA+PSBNYXRoLlBJKSB7XG4gICAgICAgIGFuZ2xlIC09IDIqTWF0aC5QSTtcbiAgICB9XG5cbiAgICB2YXIgbnVtVHJpYW5nbGVzID0gdHJpYW5nbGVzUGVyQXJjKGFuZ2xlLCBjb250ZXh0LmhhbGZfd2lkdGgpO1xuICAgIGlmIChudW1UcmlhbmdsZXMgPCAxKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB2YXIgcGl2b3RJbmRleCA9IGNvbnRleHQudmVydGV4X2RhdGEudmVydGV4X2NvdW50O1xuICAgIHZhciB2ZXJ0ZXhfZWxlbWVudHMgPSBjb250ZXh0LnZlcnRleF9kYXRhLnZlcnRleF9lbGVtZW50cztcblxuICAgIGFkZFZlcnRleChjb29yZCwgbkMsIHV2QywgY29udGV4dCk7XG4gICAgYWRkVmVydGV4KGNvb3JkLCBuQSwgdXZBLCBjb250ZXh0KTtcblxuICAgIHZhciBibGFkZSA9IG5BO1xuXG4gICAgaWYgKGNvbnRleHQudGV4Y29vcmRfaW5kZXggIT09IHVuZGVmaW5lZCkge1xuICAgICAgICB2YXIgdXZDdXJyO1xuICAgICAgICBpZiAoaXNDYXApe1xuICAgICAgICAgICAgdXZDdXJyID0gW107XG4gICAgICAgICAgICB2YXIgYWZmaW5lX3V2Q3VyciA9IFZlY3Rvci5zdWIodXZBLCB1dkMpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdXZDdXJyID0gVmVjdG9yLnNldCh1dkEpO1xuICAgICAgICAgICAgdmFyIHV2X2RlbHRhID0gVmVjdG9yLmRpdihWZWN0b3Iuc3ViKHV2QiwgdXZBKSwgbnVtVHJpYW5nbGVzKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHZhciBhbmdsZV9zdGVwID0gYW5nbGUgLyBudW1UcmlhbmdsZXM7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBudW1UcmlhbmdsZXM7IGkrKykge1xuICAgICAgICBibGFkZSA9IFZlY3Rvci5yb3QoYmxhZGUsIGFuZ2xlX3N0ZXApO1xuXG4gICAgICAgIGlmIChjb250ZXh0LnRleGNvb3JkX2luZGV4ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGlmIChpc0NhcCl7XG4gICAgICAgICAgICAgICAgLy8gVVYgdGV4dHVyZXMgZ28gXCJ0aHJvdWdoXCIgdGhlIGNhcFxuICAgICAgICAgICAgICAgIGFmZmluZV91dkN1cnIgPSBWZWN0b3Iucm90KGFmZmluZV91dkN1cnIsIGFuZ2xlX3N0ZXApO1xuICAgICAgICAgICAgICAgIHV2Q3VyclswXSA9IGFmZmluZV91dkN1cnJbMF0gKyB1dkNbMF07XG4gICAgICAgICAgICAgICAgdXZDdXJyWzFdID0gYWZmaW5lX3V2Q3VyclsxXSAqIGNvbnRleHQudGV4Y29vcmRfd2lkdGggKiBjb250ZXh0LnZfc2NhbGUgKyB1dkNbMV07IC8vIHNjYWxlIHRoZSB2LWNvb3JkaW5hdGVcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIFVWIHRleHR1cmVzIGdvIFwiYXJvdW5kXCIgdGhlIGpvaW5cbiAgICAgICAgICAgICAgICB1dkN1cnIgPSBWZWN0b3IuYWRkKHV2Q3VyciwgdXZfZGVsdGEpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgYWRkVmVydGV4KGNvb3JkLCBibGFkZSwgdXZDdXJyLCBjb250ZXh0KTtcblxuICAgICAgICB2ZXJ0ZXhfZWxlbWVudHMucHVzaChwaXZvdEluZGV4ICsgaSArICgoY3Jvc3MgPiAwKSA/IDIgOiAxKSk7XG4gICAgICAgIHZlcnRleF9lbGVtZW50cy5wdXNoKHBpdm90SW5kZXgpO1xuICAgICAgICB2ZXJ0ZXhfZWxlbWVudHMucHVzaChwaXZvdEluZGV4ICsgaSArICgoY3Jvc3MgPiAwKSA/IDEgOiAyKSk7XG4gICAgfVxufVxuXG4vLyAgYWRkQmV2ZWwgICAgQSAtLS0tLSBCXG4vLyAgICAgICAgICAgICAvIFxcICAgICAvIFxcXG4vLyAgICAgICAgICAgLyAgIC9cXCAgIC9cXCAgXFxcbi8vICAgICAgICAgICAgICAvICBcXCAvICBcXCAgXFxcbi8vICAgICAgICAgICAgICAgIC8gQyBcXFxuZnVuY3Rpb24gYWRkQmV2ZWwgKGNvb3JkLCBuQSwgbkMsIG5CLCB1QSwgdUMsIHVCLCBjb250ZXh0KSB7XG4gICAgdmFyIHBpdm90SW5kZXggPSBjb250ZXh0LnZlcnRleF9kYXRhLnZlcnRleF9jb3VudDtcblxuICAgIGFkZFZlcnRleChjb29yZCwgbkMsIHVDLCBjb250ZXh0KTtcbiAgICBhZGRWZXJ0ZXgoY29vcmQsIG5BLCB1QSwgY29udGV4dCk7XG4gICAgYWRkVmVydGV4KGNvb3JkLCBuQiwgdUIsIGNvbnRleHQpO1xuXG4gICAgdmFyIG9yaWVudGF0aW9uID0gbkFbMF0gKiBuQlsxXSAtIG5BWzFdICogbkJbMF0gPiAwO1xuXG4gICAgdmFyIHZlcnRleF9lbGVtZW50cyA9IGNvbnRleHQudmVydGV4X2RhdGEudmVydGV4X2VsZW1lbnRzO1xuXG4gICAgaWYgKG9yaWVudGF0aW9uKSB7XG4gICAgICAgIHZlcnRleF9lbGVtZW50cy5wdXNoKHBpdm90SW5kZXggKyAyKTtcbiAgICAgICAgdmVydGV4X2VsZW1lbnRzLnB1c2gocGl2b3RJbmRleCArIDApO1xuICAgICAgICB2ZXJ0ZXhfZWxlbWVudHMucHVzaChwaXZvdEluZGV4ICsgMSk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgdmVydGV4X2VsZW1lbnRzLnB1c2gocGl2b3RJbmRleCArIDEpO1xuICAgICAgICB2ZXJ0ZXhfZWxlbWVudHMucHVzaChwaXZvdEluZGV4ICsgMCk7XG4gICAgICAgIHZlcnRleF9lbGVtZW50cy5wdXNoKHBpdm90SW5kZXggKyAyKTtcbiAgICB9XG59XG5cbi8vICBGdW5jdGlvbiB0byBhZGQgdGhlIHZlcnRleCBuZWVkIGZvciBsaW5lIGNhcHMsXG4vLyAgYmVjYXVzZSByZS11c2UgdGhlIGJ1ZmZlcnMgbmVlZHMgdG8gYmUgYXQgdGhlIGVuZFxuZnVuY3Rpb24gYWRkQ2FwIChjb29yZCwgdiwgbm9ybWFsLCB0eXBlLCBpc0JlZ2lubmluZywgY29udGV4dCkge1xuICAgIHZhciBuZWdfbm9ybWFsID0gVmVjdG9yLm5lZyhub3JtYWwpO1xuXG4gICAgc3dpdGNoICh0eXBlKXtcbiAgICAgICAgY2FzZSBDQVBfVFlQRS5zcXVhcmU6XG4gICAgICAgICAgICB2YXIgdGFuZ2VudDtcbiAgICAgICAgICAgIGlmIChpc0JlZ2lubmluZyl7XG4gICAgICAgICAgICAgICAgdGFuZ2VudCA9IFtub3JtYWxbMV0sIC1ub3JtYWxbMF1dO1xuXG4gICAgICAgICAgICAgICAgYWRkVmVydGV4KGNvb3JkLCBWZWN0b3IuYWRkKG5vcm1hbCwgdGFuZ2VudCksIFsxLCB2XSwgY29udGV4dCk7XG4gICAgICAgICAgICAgICAgYWRkVmVydGV4KGNvb3JkLCBWZWN0b3IuYWRkKG5lZ19ub3JtYWwsIHRhbmdlbnQpLCBbMCwgdl0sIGNvbnRleHQpO1xuXG4gICAgICAgICAgICAgICAgLy8gQWRkIGxlbmd0aCBvZiBzcXVhcmUgY2FwIHRvIHRleHR1cmUgY29vcmRpbmF0ZVxuICAgICAgICAgICAgICAgIHYgKz0gMC41ICogY29udGV4dC50ZXhjb29yZF93aWR0aCAqIGNvbnRleHQudl9zY2FsZTtcblxuICAgICAgICAgICAgICAgIGFkZFZlcnRleChjb29yZCwgbm9ybWFsLCBbMSwgdl0sIGNvbnRleHQpO1xuICAgICAgICAgICAgICAgIGFkZFZlcnRleChjb29yZCwgbmVnX25vcm1hbCwgWzAsIHZdLCBjb250ZXh0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHRhbmdlbnQgPSBbLW5vcm1hbFsxXSwgbm9ybWFsWzBdXTtcblxuICAgICAgICAgICAgICAgIGFkZFZlcnRleChjb29yZCwgbm9ybWFsLCBbMSwgdl0sIGNvbnRleHQpO1xuICAgICAgICAgICAgICAgIGFkZFZlcnRleChjb29yZCwgbmVnX25vcm1hbCwgWzAsIHZdLCBjb250ZXh0KTtcblxuICAgICAgICAgICAgICAgIC8vIEFkZCBsZW5ndGggb2Ygc3F1YXJlIGNhcCB0byB0ZXh0dXJlIGNvb3JkaW5hdGVcbiAgICAgICAgICAgICAgICB2ICs9IDAuNSAqIGNvbnRleHQudGV4Y29vcmRfd2lkdGggKiBjb250ZXh0LnZfc2NhbGU7XG5cbiAgICAgICAgICAgICAgICBhZGRWZXJ0ZXgoY29vcmQsIFZlY3Rvci5hZGQobm9ybWFsLCB0YW5nZW50KSwgWzEsIHZdLCBjb250ZXh0KTtcbiAgICAgICAgICAgICAgICBhZGRWZXJ0ZXgoY29vcmQsIFZlY3Rvci5hZGQobmVnX25vcm1hbCwgdGFuZ2VudCksIFswLCB2XSwgY29udGV4dCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGluZGV4UGFpcnMoMSwgY29udGV4dCk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBDQVBfVFlQRS5yb3VuZDpcbiAgICAgICAgICAgIHZhciBuQSwgbkIsIHV2QSwgdXZCLCB1dkM7XG4gICAgICAgICAgICBpZiAoaXNCZWdpbm5pbmcpIHtcbiAgICAgICAgICAgICAgICBuQSA9IG5vcm1hbDtcbiAgICAgICAgICAgICAgICBuQiA9IG5lZ19ub3JtYWw7XG5cbiAgICAgICAgICAgICAgICBpZiAoY29udGV4dC50ZXhjb29yZF9pbmRleCAhPT0gdW5kZWZpbmVkKXtcbiAgICAgICAgICAgICAgICAgICAgdiArPSAwLjUgKiBjb250ZXh0LnRleGNvb3JkX3dpZHRoICogY29udGV4dC52X3NjYWxlO1xuICAgICAgICAgICAgICAgICAgICB1dkEgPSBbMSwgdl07XG4gICAgICAgICAgICAgICAgICAgIHV2QiA9IFswLCB2XTtcbiAgICAgICAgICAgICAgICAgICAgdXZDID0gWzAuNSwgdl07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgbkEgPSBuZWdfbm9ybWFsO1xuICAgICAgICAgICAgICAgIG5CID0gbm9ybWFsO1xuXG4gICAgICAgICAgICAgICAgaWYgKGNvbnRleHQudGV4Y29vcmRfaW5kZXggIT09IHVuZGVmaW5lZCl7XG4gICAgICAgICAgICAgICAgICAgIHV2QSA9IFswLCB2XTtcbiAgICAgICAgICAgICAgICAgICAgdXZCID0gWzEsIHZdO1xuICAgICAgICAgICAgICAgICAgICB1dkMgPSBbMC41LCB2XTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGFkZEZhbihjb29yZCxcbiAgICAgICAgICAgICAgICBuQSwgemVyb192ZWMyLCBuQixcbiAgICAgICAgICAgICAgICB1dkEsIHV2QywgdXZCLFxuICAgICAgICAgICAgICAgIHRydWUsIGNvbnRleHRcbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIENBUF9UWVBFLmJ1dHQ6XG4gICAgICAgICAgICByZXR1cm47XG4gICAgfVxufVxuXG4vLyBDYWxjdWxhdGUgbnVtYmVyIG9mIHRyaWFuZ2xlcyBmb3IgYSBmYW4gZ2l2ZW4gYW4gYW5nbGUgYW5kIGxpbmUgd2lkdGhcbmZ1bmN0aW9uIHRyaWFuZ2xlc1BlckFyYyAoYW5nbGUsIHdpZHRoKSB7XG4gICAgaWYgKGFuZ2xlIDwgMCkge1xuICAgICAgICBhbmdsZSA9IC1hbmdsZTtcbiAgICB9XG5cbiAgICB2YXIgbnVtVHJpYW5nbGVzID0gKHdpZHRoID4gMiAqIERFRkFVTFQuTUlOX0ZBTl9XSURUSCkgPyBNYXRoLmxvZzIod2lkdGggLyBERUZBVUxULk1JTl9GQU5fV0lEVEgpIDogMTtcbiAgICByZXR1cm4gTWF0aC5jZWlsKGFuZ2xlIC8gTWF0aC5QSSAqIG51bVRyaWFuZ2xlcyk7XG59XG5cbi8vIEN5Y2xpY2FsbHkgcGVybXV0ZSBjbG9zZWQgbGluZSBzdGFydGluZyBhdCBhbiBpbmRleFxuZnVuY3Rpb24gcGVybXV0ZUxpbmUobGluZSwgc3RhcnRJbmRleCl7XG4gICAgdmFyIG5ld0xpbmUgPSBbXTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxpbmUubGVuZ3RoOyBpKyspe1xuICAgICAgICB2YXIgaW5kZXggPSAoaSArIHN0YXJ0SW5kZXgpICUgbGluZS5sZW5ndGg7XG4gICAgICAgIC8vIHNraXAgdGhlIGZpcnN0IChyZXBlYXRlZCkgaW5kZXhcbiAgICAgICAgaWYgKGluZGV4ICE9PSAwKSB7XG4gICAgICAgICAgICBuZXdMaW5lLnB1c2gobGluZVtpbmRleF0pO1xuICAgICAgICB9XG4gICAgfVxuICAgIG5ld0xpbmUucHVzaChuZXdMaW5lWzBdKTtcbiAgICByZXR1cm4gbmV3TGluZTtcbn0iLCJpbXBvcnQgVXRpbHMgZnJvbSAnLi91dGlscy91dGlscyc7XG5pbXBvcnQgU2hhZGVyUHJvZ3JhbSBmcm9tICcuL2dsL3NoYWRlcl9wcm9ncmFtJztcbmltcG9ydCB7bWF0NCwgbWF0MywgdmVjM30gZnJvbSAnLi91dGlscy9nbC1tYXRyaXgnO1xuXG4vLyBBYnN0cmFjdCBiYXNlIGNsYXNzXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBDYW1lcmEge1xuXG4gICAgY29uc3RydWN0b3IobmFtZSwgdmlldywgb3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIHRoaXMudmlldyA9IHZpZXc7XG4gICAgICAgIHRoaXMucG9zaXRpb24gPSBvcHRpb25zLnBvc2l0aW9uO1xuICAgICAgICB0aGlzLnpvb20gPSBvcHRpb25zLnpvb207XG4gICAgfVxuXG4gICAgLy8gQ3JlYXRlIGEgY2FtZXJhIGJ5IHR5cGUgbmFtZSwgZmFjdG9yeS1zdHlsZVxuICAgIHN0YXRpYyBjcmVhdGUobmFtZSwgdmlldywgY29uZmlnKSB7XG4gICAgICAgIHN3aXRjaCAoY29uZmlnLnR5cGUpIHtcbiAgICAgICAgICAgIGNhc2UgJ2lzb21ldHJpYyc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBJc29tZXRyaWNDYW1lcmEobmFtZSwgdmlldywgY29uZmlnKTtcbiAgICAgICAgICAgIGNhc2UgJ2ZsYXQnOlxuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgRmxhdENhbWVyYShuYW1lLCB2aWV3LCBjb25maWcpO1xuICAgICAgICAgICAgY2FzZSAncGVyc3BlY3RpdmUnOlxuICAgICAgICAgICAgLyogZmFsbHMgdGhyb3VnaCAqL1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFBlcnNwZWN0aXZlQ2FtZXJhKG5hbWUsIHZpZXcsIGNvbmZpZyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBVcGRhdGUgbWV0aG9kIGNhbGxlZCBvbmNlIHBlciBmcmFtZVxuICAgIHVwZGF0ZSgpIHtcbiAgICB9XG5cbiAgICAvLyBDYWxsZWQgb25jZSBwZXIgZnJhbWUgcGVyIHByb2dyYW0gKGUuZy4gZm9yIG1haW4gcmVuZGVyIHBhc3MsIHRoZW4gZm9yIGVhY2ggYWRkaXRpb25hbCBwYXNzIGZvciBmZWF0dXJlIHNlbGVjdGlvbiwgZXRjLilcbiAgICBzZXR1cFByb2dyYW0ocHJvZ3JhbSkge1xuICAgIH1cblxuICAgIC8vIFN5bmMgY2FtZXJhIHBvc2l0aW9uL3pvb20gdG8gc2NlbmUgdmlld1xuICAgIHVwZGF0ZVZpZXcgKCkge1xuICAgICAgICBpZiAodGhpcy5wb3NpdGlvbiB8fCB0aGlzLnpvb20pIHtcbiAgICAgICAgICAgIHZhciB2aWV3ID0ge307XG4gICAgICAgICAgICBpZiAodGhpcy5wb3NpdGlvbikge1xuICAgICAgICAgICAgICAgIHZpZXcgPSB7IGxuZzogdGhpcy5wb3NpdGlvblswXSwgbGF0OiB0aGlzLnBvc2l0aW9uWzFdLCB6b29tOiB0aGlzLnBvc2l0aW9uWzJdIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodGhpcy56b29tKSB7XG4gICAgICAgICAgICAgICAgdmlldy56b29tID0gdGhpcy56b29tO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy52aWV3LnNldFZpZXcodmlldyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBTZXQgbW9kZWwtdmlldyBhbmQgbm9ybWFsIG1hdHJpY2VzXG4gICAgc2V0dXBNYXRyaWNlcyAobWF0cmljZXMsIHByb2dyYW0pIHtcbiAgICAgICAgLy8gTW9kZWwgdmlldyBtYXRyaXggLSB0cmFuc2Zvcm0gdGlsZSBzcGFjZSBpbnRvIHZpZXcgc3BhY2UgKG1ldGVycywgcmVsYXRpdmUgdG8gY2FtZXJhKVxuICAgICAgICBtYXQ0Lm11bHRpcGx5KG1hdHJpY2VzLm1vZGVsX3ZpZXczMiwgdGhpcy52aWV3X21hdHJpeCwgbWF0cmljZXMubW9kZWwpO1xuICAgICAgICBwcm9ncmFtLnVuaWZvcm0oJ01hdHJpeDRmdicsICd1X21vZGVsVmlldycsIG1hdHJpY2VzLm1vZGVsX3ZpZXczMik7XG5cbiAgICAgICAgLy8gTm9ybWFsIG1hdHJpY2VzIC0gdHJhbnNmb3JtcyBzdXJmYWNlIG5vcm1hbHMgaW50byB2aWV3IHNwYWNlXG4gICAgICAgIG1hdDMubm9ybWFsRnJvbU1hdDQobWF0cmljZXMubm9ybWFsMzIsIG1hdHJpY2VzLm1vZGVsX3ZpZXczMik7XG4gICAgICAgIG1hdDMuaW52ZXJ0KG1hdHJpY2VzLmludmVyc2Vfbm9ybWFsMzIsIG1hdHJpY2VzLm5vcm1hbDMyKTtcbiAgICAgICAgcHJvZ3JhbS51bmlmb3JtKCdNYXRyaXgzZnYnLCAndV9ub3JtYWxNYXRyaXgnLCBtYXRyaWNlcy5ub3JtYWwzMik7XG4gICAgICAgIHByb2dyYW0udW5pZm9ybSgnTWF0cml4M2Z2JywgJ3VfaW52ZXJzZU5vcm1hbE1hdHJpeCcsIG1hdHJpY2VzLmludmVyc2Vfbm9ybWFsMzIpO1xuICAgIH1cblxufVxuXG4vKipcbiAgICBQZXJzcGVjdGl2ZSBtYXRyaXggcHJvamVjdGlvblxuXG4gICAgVGhpcyBpcyBhIHNwZWNpYWxpemVkIHBlcnNwZWN0aXZlIGNhbWVyYSB0aGF0LCBnaXZlbiBhIGRlc2lyZWQgY2FtZXJhIGZvY2FsIGxlbmd0aCAod2hpY2ggY2FuIGFsc28gdmFyeSBieSB6b29tIGxldmVsKSxcbiAgICBjb25zdHJhaW5zIHRoZSBjYW1lcmEgaGVpZ2h0IGFib3ZlIHRoZSBncm91bmQgcGxhbmUgc3VjaCB0aGF0IHRoZSBkaXNwbGF5ZWQgZ3JvdW5kIGFyZWEgb2YgdGhlIG1hcCBtYXRjaGVzIHRoYXQgb2ZcbiAgICBhIHRyYWRpdGlvbmFsIHdlYiBtZXJjYXRvciBtYXAuIFRoaXMgbWVhbnMgeW91IGNhbiBzZXQgdGhlIGNhbWVyYSBsb2NhdGlvbiBieSBbbGF0LCBsbmcsIHpvb21dIGFzIHlvdSB3b3VsZCBhIHR5cGljYWxcbiAgICB3ZWIgbWVyY2F0b3IgbWFwLCB0aGVuIGFkanVzdCB0aGUgZm9jYWwgbGVuZ3RoIGFzIG5lZWRlZC5cblxuICAgIFZhbmlzaGluZyBwb2ludCBjYW4gYWxzbyBiZSBhZGp1c3RlZCB0byBhY2hpZXZlIGRpZmZlcmVudCBcInZpZXdpbmcgYW5nbGVzXCIsIGUuZy4gaW5zdGVhZCBvZiBsb29raW5nIHN0cmFpZ2h0IGRvd24gaW50b1xuICAgIHRoZSBjZW50ZXIgb2YgdGhlIHZpZXdwb3J0LCB0aGUgY2FtZXJhIGFwcGVhcnMgdG8gYmUgdGlsdGVkIGF0IGFuIGFuZ2xlLiBGb3IgZXhhbXBsZTpcblxuICAgIFswLCAwXSA9IGxvb2tpbmcgdG93YXJkcyBjZW50ZXIgb2Ygdmlld3BvcnRcbiAgICBbLTI1MCwgLTI1MF0gPSBsb29raW5nIDI1MCBwaXhlbHMgZnJvbSB0aGUgdmlld3BvcnQgY2VudGVyIHRvIHRoZSBsb3dlci1sZWZ0IGNvcm5lclxuICAgIFs0MDAsIDBdID0gbG9va2luZyA0MDAgcGl4ZWxzIHRvIHRoZSByaWdodCBvZiB0aGUgdmlld3BvcnQgY2VudGVyXG4qL1xuY2xhc3MgUGVyc3BlY3RpdmVDYW1lcmEgZXh0ZW5kcyBDYW1lcmEge1xuXG4gICAgY29uc3RydWN0b3IobmFtZSwgdmlldywgb3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIHN1cGVyKG5hbWUsIHZpZXcsIG9wdGlvbnMpO1xuICAgICAgICB0aGlzLnR5cGUgPSAncGVyc3BlY3RpdmUnO1xuXG4gICAgICAgIC8vIGEgc2luZ2xlIHNjYWxhciwgb3IgcGFpcnMgb2Ygc3RvcHMgbWFwcGluZyB6b29tIGxldmVscywgZS5nLiBbem9vbSwgZm9jYWwgbGVuZ3RoXVxuICAgICAgICB0aGlzLmZvY2FsX2xlbmd0aCA9IG9wdGlvbnMuZm9jYWxfbGVuZ3RoO1xuICAgICAgICB0aGlzLmZvdiA9IG9wdGlvbnMuZm92O1xuICAgICAgICBpZiAoIXRoaXMuZm9jYWxfbGVuZ3RoICYmICF0aGlzLmZvdikge1xuICAgICAgICAgICAgLy8gRGVmYXVsdCBmb2NhbCBsZW5ndGggcmFuZ2VzIGJ5IHpvb21cbiAgICAgICAgICAgIHRoaXMuZm9jYWxfbGVuZ3RoID0gW1sxNiwgMl0sIFsxNywgMi41XSwgWzE4LCAzXSwgWzE5LCA0XSwgWzIwLCA2XV07XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnZhbmlzaGluZ19wb2ludCA9IG9wdGlvbnMudmFuaXNoaW5nX3BvaW50IHx8IFswLCAwXTsgLy8gW3gsIHldXG4gICAgICAgIHRoaXMudmFuaXNoaW5nX3BvaW50ID0gdGhpcy52YW5pc2hpbmdfcG9pbnQubWFwKHBhcnNlRmxvYXQpOyAvLyB3ZSBpbXBsaWNpdGx5IG9ubHkgc3VwcG9ydCBweCB1bml0cyBoZXJlXG4gICAgICAgIHRoaXMudmFuaXNoaW5nX3BvaW50X3NrZXcgPSBbXTtcblxuICAgICAgICB0aGlzLnBvc2l0aW9uX21ldGVycyA9IG51bGw7XG4gICAgICAgIHRoaXMudmlld19tYXRyaXggPSBuZXcgRmxvYXQ2NEFycmF5KDE2KTtcbiAgICAgICAgdGhpcy5wcm9qZWN0aW9uX21hdHJpeCA9IG5ldyBGbG9hdDMyQXJyYXkoMTYpO1xuXG4gICAgICAgIC8vICdjYW1lcmEnIGlzIHRoZSBuYW1lIG9mIHRoZSBzaGFkZXIgYmxvY2ssIGUuZy4gZGV0ZXJtaW5lcyB3aGVyZSBpbiB0aGUgc2hhZGVyIHRoaXMgY29kZSBpcyBpbmplY3RlZFxuICAgICAgICBTaGFkZXJQcm9ncmFtLnJlcGxhY2VCbG9jaygnY2FtZXJhJywgYFxuICAgICAgICAgICAgdW5pZm9ybSBtYXQ0IHVfcHJvamVjdGlvbjtcbiAgICAgICAgICAgIHVuaWZvcm0gdmVjMyB1X2V5ZTtcbiAgICAgICAgICAgIHVuaWZvcm0gdmVjMiB1X3ZhbmlzaGluZ19wb2ludDtcblxuICAgICAgICAgICAgdm9pZCBjYW1lcmFQcm9qZWN0aW9uIChpbm91dCB2ZWM0IHBvc2l0aW9uKSB7XG4gICAgICAgICAgICAgICAgcG9zaXRpb24gPSB1X3Byb2plY3Rpb24gKiBwb3NpdGlvbjtcbiAgICAgICAgICAgIH1gXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gQ29uc3RyYWlucyB0aGUgY2FtZXJhIHNvIHRoYXQgdGhlIHZpZXdhYmxlIGFyZWEgbWF0Y2hlcyBnaXZlbiB0aGUgdmlld3BvcnQgaGVpZ2h0XG4gICAgLy8gKGluIHdvcmxkIHNwYWNlLCBlLmcuIG1ldGVycyksIGdpdmVuIGVpdGhlciBhIGNhbWVyYSBmb2NhbCBsZW5ndGggb3IgZmllbGQtb2Ytdmlld1xuICAgIC8vIChmb2NhbCBsZW5ndGggaXMgdXNlZCBpZiBib3RoIGFyZSBwYXNzZWQpLlxuICAgIGNvbnN0cmFpbkNhbWVyYSh7IHZpZXdfaGVpZ2h0LCBoZWlnaHQsIGZvY2FsX2xlbmd0aCwgZm92IH0pIHtcbiAgICAgICAgLy8gU29sdmUgZm9yIGNhbWVyYSBoZWlnaHRcbiAgICAgICAgaWYgKCFoZWlnaHQpIHtcbiAgICAgICAgICAgIC8vIFdlIGhhdmUgZm9jYWwgbGVuZ3RoLCBjYWxjdWxhdGUgRk9WXG4gICAgICAgICAgICBpZiAoZm9jYWxfbGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgZm92ID0gTWF0aC5hdGFuKDEgLyBmb2NhbF9sZW5ndGgpICogMjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIFdlIGhhdmUgRk9WLCBjYWxjdWxhdGUgZm9jYWwgbGVuZ3RoXG4gICAgICAgICAgICBlbHNlIGlmIChmb3YpIHtcbiAgICAgICAgICAgICAgICBmb3YgPSBmb3YgKiBNYXRoLlBJIC8gMTgwOyAvLyBjb252ZXJ0IEZPViBkZWdyZWVzIHRvIHJhZGlhbnNcbiAgICAgICAgICAgICAgICBmb2NhbF9sZW5ndGggPSAxIC8gTWF0aC50YW4oZm92IC8gMik7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIERpc3RhbmNlIHRoYXQgY2FtZXJhIHNob3VsZCBiZSBmcm9tIGdyb3VuZCBzdWNoIHRoYXQgaXQgZml0cyB0aGUgZmllbGQgb2YgdmlldyBleHBlY3RlZFxuICAgICAgICAgICAgLy8gZm9yIGEgY29udmVudGlvbmFsIHdlYiBtZXJjYXRvciBtYXAgYXQgdGhlIGN1cnJlbnQgem9vbSBsZXZlbCBhbmQgY2FtZXJhIGZvY2FsIGxlbmd0aFxuICAgICAgICAgICAgaGVpZ2h0ID0gdmlld19oZWlnaHQgLyAyICogZm9jYWxfbGVuZ3RoO1xuICAgICAgICB9XG4gICAgICAgIC8vIFNvbHZlIGZvciBjYW1lcmEgZm9jYWwgbGVuZ3RoIC8gZmllbGQtb2Ytdmlld1xuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGZvY2FsX2xlbmd0aCA9IDIgKiBoZWlnaHQgLyB2aWV3X2hlaWdodDtcbiAgICAgICAgICAgIGZvdiA9IE1hdGguYXRhbigxIC8gZm9jYWxfbGVuZ3RoKSAqIDI7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4geyB2aWV3X2hlaWdodCwgaGVpZ2h0LCBmb2NhbF9sZW5ndGgsIGZvdiB9O1xuICAgIH1cblxuICAgIHVwZGF0ZU1hdHJpY2VzKCkge1xuICAgICAgICAvLyBUT0RPOiBvbmx5IHJlLWNhbGN1bGF0ZSB0aGVzZSB2YXJzIHdoZW4gbmVjZXNzYXJ5XG5cbiAgICAgICAgLy8gSGVpZ2h0IG9mIHRoZSB2aWV3cG9ydCBpbiBtZXRlcnMgYXQgY3VycmVudCB6b29tXG4gICAgICAgIHZhciB2aWV3cG9ydF9oZWlnaHQgPSB0aGlzLnZpZXcuc2l6ZS5jc3MuaGVpZ2h0ICogdGhpcy52aWV3Lm1ldGVyc19wZXJfcGl4ZWw7XG5cbiAgICAgICAgLy8gQ29tcHV0ZSBjYW1lcmEgcHJvcGVydGllcyB0byBmaXQgZGVzaXJlZCB2aWV3XG4gICAgICAgIHZhciB7IGhlaWdodCwgZm92IH0gPSB0aGlzLmNvbnN0cmFpbkNhbWVyYSh7XG4gICAgICAgICAgICB2aWV3X2hlaWdodDogdmlld3BvcnRfaGVpZ2h0LFxuICAgICAgICAgICAgZm9jYWxfbGVuZ3RoOiBVdGlscy5pbnRlcnBvbGF0ZSh0aGlzLnZpZXcuem9vbSwgdGhpcy5mb2NhbF9sZW5ndGgpLFxuICAgICAgICAgICAgZm92OiBVdGlscy5pbnRlcnBvbGF0ZSh0aGlzLnZpZXcuem9vbSwgdGhpcy5mb3YpXG4gICAgICAgICB9KTtcblxuICAgICAgICAvLyBWaWV3IG1hdHJpeFxuICAgICAgICB2YXIgcG9zaXRpb24gPSBbdGhpcy52aWV3LmNlbnRlci5tZXRlcnMueCwgdGhpcy52aWV3LmNlbnRlci5tZXRlcnMueSwgaGVpZ2h0XTtcbiAgICAgICAgdGhpcy5wb3NpdGlvbl9tZXRlcnMgPSBwb3NpdGlvbjtcblxuICAgICAgICAvLyBtYXQ0Lmxvb2tBdCh0aGlzLnZpZXdfbWF0cml4LFxuICAgICAgICAvLyAgICAgdmVjMy5mcm9tVmFsdWVzKC4uLnBvc2l0aW9uKSxcbiAgICAgICAgLy8gICAgIHZlYzMuZnJvbVZhbHVlcyhwb3NpdGlvblswXSwgcG9zaXRpb25bMV0sIGhlaWdodCAtIDEpLFxuICAgICAgICAvLyAgICAgdmVjMy5mcm9tVmFsdWVzKDAsIDEsIDApKTtcbiAgICAgICAgLy8gRXhjbHVkZSBjYW1lcmEgaGVpZ2h0IGZyb20gdmlldyBtYXRyaXhcbiAgICAgICAgbWF0NC5sb29rQXQodGhpcy52aWV3X21hdHJpeCxcbiAgICAgICAgICAgIHZlYzMuZnJvbVZhbHVlcyhwb3NpdGlvblswXSwgcG9zaXRpb25bMV0sIDApLFxuICAgICAgICAgICAgdmVjMy5mcm9tVmFsdWVzKHBvc2l0aW9uWzBdLCBwb3NpdGlvblsxXSwgLTEpLFxuICAgICAgICAgICAgdmVjMy5mcm9tVmFsdWVzKDAsIDEsIDApKTtcblxuICAgICAgICAvLyBQcm9qZWN0aW9uIG1hdHJpeFxuICAgICAgICBtYXQ0LnBlcnNwZWN0aXZlKHRoaXMucHJvamVjdGlvbl9tYXRyaXgsIGZvdiwgdGhpcy52aWV3LmFzcGVjdCwgMSwgaGVpZ2h0ICogMik7XG5cbiAgICAgICAgLy8gQ29udmVydCB2YW5pc2hpbmcgcG9pbnQgZnJvbSBwaXhlbHMgdG8gdmlld3BvcnQgc3BhY2VcbiAgICAgICAgdGhpcy52YW5pc2hpbmdfcG9pbnRfc2tld1swXSA9IHRoaXMudmFuaXNoaW5nX3BvaW50WzBdIC8gdGhpcy52aWV3LnNpemUuY3NzLndpZHRoO1xuICAgICAgICB0aGlzLnZhbmlzaGluZ19wb2ludF9za2V3WzFdID0gdGhpcy52YW5pc2hpbmdfcG9pbnRbMV0gLyB0aGlzLnZpZXcuc2l6ZS5jc3MuaGVpZ2h0O1xuXG4gICAgICAgIC8vIEFkanVzdCBwcm9qZWN0aW9uIG1hdHJpeCB0byBpbmNsdWRlIHZhbmlzaGluZyBwb2ludCBza2V3XG4gICAgICAgIHRoaXMucHJvamVjdGlvbl9tYXRyaXhbOF0gPSAtdGhpcy52YW5pc2hpbmdfcG9pbnRfc2tld1swXSAqIDI7IC8vIHogY29sdW1uIG9mIHggcm93LCBlLmcuIGFtb3VudCB6IHNrZXdzIHhcbiAgICAgICAgdGhpcy5wcm9qZWN0aW9uX21hdHJpeFs5XSA9IC10aGlzLnZhbmlzaGluZ19wb2ludF9za2V3WzFdICogMjsgLy8geiBjb2x1bW4gb2YgeSByb3csIGUuZy4gYW1vdW50IHogc2tld3MgeVxuXG4gICAgICAgIC8vIFRyYW5zbGF0ZSBnZW9tZXRyeSBpbnRvIHRoZSBkaXN0YW5jZSBzbyB0aGF0IGNhbWVyYSBpcyBhcHByb3ByaWF0ZSBoZWlnaHQgYWJvdmUgZ3JvdW5kXG4gICAgICAgIC8vIEFkZGl0aW9uYWxseSwgYWRqdXN0IHh5IHRvIGNvbXBlbnNhdGUgZm9yIGFueSB2YW5pc2hpbmcgcG9pbnQgc2tldywgZS5nLiBtb3ZlIGdlb21ldHJ5IHNvIHRoYXQgdGhlIGRpc3BsYXllZCBnXG4gICAgICAgIC8vIHBsYW5lIG9mIHRoZSBtYXAgbWF0Y2hlcyB0aGF0IGV4cGVjdGVkIGJ5IGEgdHJhZGl0aW9uYWwgd2ViIG1lcmNhdG9yIG1hcCBhdCB0aGlzIFtsYXQsIGxuZywgem9vbV0uXG4gICAgICAgIG1hdDQudHJhbnNsYXRlKHRoaXMucHJvamVjdGlvbl9tYXRyaXgsIHRoaXMucHJvamVjdGlvbl9tYXRyaXgsXG4gICAgICAgICAgICB2ZWMzLmZyb21WYWx1ZXMoXG4gICAgICAgICAgICAgICAgdmlld3BvcnRfaGVpZ2h0LzIgKiB0aGlzLnZpZXcuYXNwZWN0ICogKC10aGlzLnZhbmlzaGluZ19wb2ludF9za2V3WzBdICogMiksXG4gICAgICAgICAgICAgICAgdmlld3BvcnRfaGVpZ2h0LzIgKiAoLXRoaXMudmFuaXNoaW5nX3BvaW50X3NrZXdbMV0gKiAyKSxcbiAgICAgICAgICAgICAgICAwXG4gICAgICAgICAgICApXG4gICAgICAgICk7XG5cbiAgICAgICAgLy8gSW5jbHVkZSBjYW1lcmEgaGVpZ2h0IGluIHByb2plY3Rpb24gbWF0cml4XG4gICAgICAgIG1hdDQudHJhbnNsYXRlKHRoaXMucHJvamVjdGlvbl9tYXRyaXgsIHRoaXMucHJvamVjdGlvbl9tYXRyaXgsIHZlYzMuZnJvbVZhbHVlcygwLCAwLCAtaGVpZ2h0KSk7XG4gICAgfVxuXG4gICAgdXBkYXRlKCkge1xuICAgICAgICBzdXBlci51cGRhdGUoKTtcbiAgICAgICAgdGhpcy51cGRhdGVNYXRyaWNlcygpO1xuICAgIH1cblxuICAgIHNldHVwUHJvZ3JhbShwcm9ncmFtKSB7XG4gICAgICAgIHByb2dyYW0udW5pZm9ybSgnTWF0cml4NGZ2JywgJ3VfcHJvamVjdGlvbicsIHRoaXMucHJvamVjdGlvbl9tYXRyaXgpO1xuICAgICAgICBwcm9ncmFtLnVuaWZvcm0oJzNmJywgJ3VfZXllJywgWzAsIDAsIHRoaXMucG9zaXRpb25fbWV0ZXJzWzJdXSk7XG4gICAgICAgIHByb2dyYW0udW5pZm9ybSgnMmZ2JywgJ3VfdmFuaXNoaW5nX3BvaW50JywgdGhpcy52YW5pc2hpbmdfcG9pbnRfc2tldyk7XG4gICAgfVxuXG59XG5cbi8vIElzb21ldHJpYy1zdHlsZSBwcm9qZWN0aW9uXG4vLyBOb3RlOiB0aGlzIGlzIGFjdHVhbGx5IGFuIFwiYXhvbm9tZXRyaWNcIiBwcm9qZWN0aW9uLCBidXQgSSdtIHVzaW5nIHRoZSBjb2xsb3F1aWFsIHRlcm0gaXNvbWV0cmljIGJlY2F1c2UgaXQgaXMgbW9yZSByZWNvZ25pemFibGUuXG4vLyBBbiBpc29tZXRyaWMgcHJvamVjdGlvbiBpcyBhIHNwZWNpZmljIHN1YnNldCBvZiBheG9ub21ldHJpYyBwcm9qZWN0aW9ucy5cbi8vICdheGlzJyBkZXRlcm1pbmVzIHRoZSB4eSBza2V3IGFwcGxpZWQgdG8gYSB2ZXJ0ZXggYmFzZWQgb24gaXRzIHogY29vcmRpbmF0ZSwgZS5nLiBbMCwgMV0gYXhpcyBjYXVzZXMgYnVpbGRpbmdzIHRvIGJlIGRyYXduXG4vLyBzdHJhaWdodCB1cHdhcmRzIG9uIHNjcmVlbiBhdCB0aGVpciB0cnVlIGhlaWdodCwgWzAsIC41XSB3b3VsZCBkcmF3IHRoZW0gdXAgYXQgaGFsZi1oZWlnaHQsIFsxLCAwXSB3b3VsZCBiZSBzaWRld2F5cywgZXRjLlxuY2xhc3MgSXNvbWV0cmljQ2FtZXJhIGV4dGVuZHMgQ2FtZXJhIHtcblxuICAgIGNvbnN0cnVjdG9yKG5hbWUsIHZpZXcsIG9wdGlvbnMgPSB7fSkge1xuICAgICAgICBzdXBlcihuYW1lLCB2aWV3LCBvcHRpb25zKTtcbiAgICAgICAgdGhpcy50eXBlID0gJ2lzb21ldHJpYyc7XG4gICAgICAgIHRoaXMuYXhpcyA9IG9wdGlvbnMuYXhpcyB8fCB7IHg6IDAsIHk6IDEgfTtcbiAgICAgICAgaWYgKHRoaXMuYXhpcy5sZW5ndGggPT09IDIpIHtcbiAgICAgICAgICAgIHRoaXMuYXhpcyA9IHsgeDogdGhpcy5heGlzWzBdLCB5OiB0aGlzLmF4aXNbMV0gfTsgLy8gYWxsb3cgYXhpcyB0byBhbHNvIGJlIHBhc3NlZCBhcyAyLWVsZW0gYXJyYXlcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMucG9zaXRpb25fbWV0ZXJzID0gbnVsbDtcbiAgICAgICAgdGhpcy52aWV3cG9ydF9oZWlnaHQgPSBudWxsO1xuXG4gICAgICAgIHRoaXMudmlld19tYXRyaXggPSBuZXcgRmxvYXQ2NEFycmF5KDE2KTtcbiAgICAgICAgdGhpcy5wcm9qZWN0aW9uX21hdHJpeCA9IG5ldyBGbG9hdDMyQXJyYXkoMTYpO1xuXG4gICAgICAgIC8vICdjYW1lcmEnIGlzIHRoZSBuYW1lIG9mIHRoZSBzaGFkZXIgYmxvY2ssIGUuZy4gZGV0ZXJtaW5lcyB3aGVyZSBpbiB0aGUgc2hhZGVyIHRoaXMgY29kZSBpcyBpbmplY3RlZFxuICAgICAgICBTaGFkZXJQcm9ncmFtLnJlcGxhY2VCbG9jaygnY2FtZXJhJywgYFxuICAgICAgICAgICAgdW5pZm9ybSBtYXQ0IHVfcHJvamVjdGlvbjtcbiAgICAgICAgICAgIHVuaWZvcm0gdmVjMyB1X2V5ZTtcbiAgICAgICAgICAgIHVuaWZvcm0gdmVjMiB1X3ZhbmlzaGluZ19wb2ludDtcblxuICAgICAgICAgICAgdm9pZCBjYW1lcmFQcm9qZWN0aW9uIChpbm91dCB2ZWM0IHBvc2l0aW9uKSB7XG4gICAgICAgICAgICAgICAgcG9zaXRpb24gPSB1X3Byb2plY3Rpb24gKiBwb3NpdGlvbjtcbiAgICAgICAgICAgICAgICAvLyBwb3NpdGlvbi54eSArPSBwb3NpdGlvbi56ICogdV9pc29tZXRyaWNfYXhpcztcblxuICAgICAgICAgICAgICAgIC8vIFJldmVyc2UgeiBmb3IgZGVwdGggYnVmZmVyIHNvIHVwIGlzIG5lZ2F0aXZlLFxuICAgICAgICAgICAgICAgIC8vIGFuZCBzY2FsZSBkb3duIHZhbHVlcyBzbyBvYmplY3RzIGhpZ2hlciB0aGFuIG9uZSBzY3JlZW4gaGVpZ2h0IHdpbGwgbm90IGdldCBjbGlwcGVkXG4gICAgICAgICAgICAgICAgLy8gcHVsbCBmb3J3YXJkIHNsaWdodGx5IHRvIGF2b2lkIGdvaW5nIHBhc3QgZmFyIGNsaXBwaW5nIHBsYW5lXG4gICAgICAgICAgICAgICAgcG9zaXRpb24ueiA9IC1wb3NpdGlvbi56IC8gMTAwLiArIDEuIC0gMC4wMDE7XG4gICAgICAgICAgICB9YFxuICAgICAgICApO1xuICAgIH1cblxuICAgIHVwZGF0ZSgpIHtcbiAgICAgICAgc3VwZXIudXBkYXRlKCk7XG5cbiAgICAgICAgdGhpcy52aWV3cG9ydF9oZWlnaHQgPSB0aGlzLnZpZXcuc2l6ZS5jc3MuaGVpZ2h0ICogdGhpcy52aWV3Lm1ldGVyc19wZXJfcGl4ZWw7XG4gICAgICAgIHZhciBwb3NpdGlvbiA9IFt0aGlzLnZpZXcuY2VudGVyLm1ldGVycy54LCB0aGlzLnZpZXcuY2VudGVyLm1ldGVycy55LCB0aGlzLnZpZXdwb3J0X2hlaWdodF07XG4gICAgICAgIHRoaXMucG9zaXRpb25fbWV0ZXJzID0gcG9zaXRpb247XG5cbiAgICAgICAgLy8gVmlld1xuICAgICAgICBtYXQ0LmlkZW50aXR5KHRoaXMudmlld19tYXRyaXgpO1xuICAgICAgICBtYXQ0LnRyYW5zbGF0ZSh0aGlzLnZpZXdfbWF0cml4LCB0aGlzLnZpZXdfbWF0cml4LCB2ZWMzLmZyb21WYWx1ZXMoLXBvc2l0aW9uWzBdLCAtcG9zaXRpb25bMV0sIDApKTtcblxuICAgICAgICAvLyBQcm9qZWN0aW9uXG4gICAgICAgIG1hdDQuaWRlbnRpdHkodGhpcy5wcm9qZWN0aW9uX21hdHJpeCk7XG5cbiAgICAgICAgLy8gYXBwbHkgaXNvbWV0cmljIHNrZXdcbiAgICAgICAgdGhpcy5wcm9qZWN0aW9uX21hdHJpeFs4XSA9IHRoaXMuYXhpcy54IC8gdGhpcy52aWV3LmFzcGVjdDsgLy8geiBjb2x1bW4gb2YgeCByb3csIGUuZy4gYW1vdW50IHogc2tld3MgeFxuICAgICAgICB0aGlzLnByb2plY3Rpb25fbWF0cml4WzldID0gdGhpcy5heGlzLnk7ICAgICAgICAgICAgICAgICAgICAvLyB6IGNvbHVtbiBvZiB4IHJvdywgZS5nLiBhbW91bnQgeiBza2V3cyB5XG5cbiAgICAgICAgLy8gY29udmVydCBtZXRlcnMgdG8gdmlld3BvcnRcbiAgICAgICAgbWF0NC5zY2FsZSh0aGlzLnByb2plY3Rpb25fbWF0cml4LCB0aGlzLnByb2plY3Rpb25fbWF0cml4LFxuICAgICAgICAgICAgdmVjMy5mcm9tVmFsdWVzKFxuICAgICAgICAgICAgICAgIDIgLyB0aGlzLnZpZXcuc2l6ZS5tZXRlcnMueCxcbiAgICAgICAgICAgICAgICAyIC8gdGhpcy52aWV3LnNpemUubWV0ZXJzLnksXG4gICAgICAgICAgICAgICAgMiAvIHRoaXMudmlldy5zaXplLm1ldGVycy55XG4gICAgICAgICAgICApXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgc2V0dXBQcm9ncmFtKHByb2dyYW0pIHtcbiAgICAgICAgcHJvZ3JhbS51bmlmb3JtKCdNYXRyaXg0ZnYnLCAndV9wcm9qZWN0aW9uJywgdGhpcy5wcm9qZWN0aW9uX21hdHJpeCk7XG5cbiAgICAgICAgcHJvZ3JhbS51bmlmb3JtKCczZnYnLCAndV9leWUnLCBbMCwgMCwgdGhpcy52aWV3cG9ydF9oZWlnaHRdKTtcbiAgICAgICAgLy8gcHJvZ3JhbS51bmlmb3JtKCczZicsICd1X2V5ZScsIHRoaXMudmlld3BvcnRfaGVpZ2h0ICogdGhpcy5heGlzLngsIHRoaXMudmlld3BvcnRfaGVpZ2h0ICogdGhpcy5heGlzLnksIHRoaXMudmlld3BvcnRfaGVpZ2h0KTtcbiAgICAgICAgcHJvZ3JhbS51bmlmb3JtKCcyZnYnLCAndV92YW5pc2hpbmdfcG9pbnQnLCBbMCwgMF0pO1xuICAgIH1cblxufVxuXG4vLyBGbGF0IHByb2plY3Rpb24gKGUuZy4ganVzdCB0b3AtZG93biwgbm8gcGVyc3BlY3RpdmUpIC0gYSBkZWdlbmVyYXRlIGlzb21ldHJpYyBjYW1lcmFcbmNsYXNzIEZsYXRDYW1lcmEgZXh0ZW5kcyBJc29tZXRyaWNDYW1lcmEge1xuXG4gICAgY29uc3RydWN0b3IobmFtZSwgdmlldywgb3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIHN1cGVyKG5hbWUsIHZpZXcsIG9wdGlvbnMpO1xuICAgICAgICB0aGlzLnR5cGUgPSAnZmxhdCc7XG4gICAgfVxuXG4gICAgdXBkYXRlKCkge1xuICAgICAgICAvLyBBeGlzIGlzIGZpeGVkIHRvICgwLCAwKSBmb3IgZmxhdCBjYW1lcmFcbiAgICAgICAgdGhpcy5heGlzLnggPSAwO1xuICAgICAgICB0aGlzLmF4aXMueSA9IDA7XG5cbiAgICAgICAgc3VwZXIudXBkYXRlKCk7XG4gICAgfVxuXG59XG4iLCIvLyBNaXNjZWxsYW5lb3VzIGdlbyBmdW5jdGlvbnNcblxudmFyIEdlbztcbmV4cG9ydCBkZWZhdWx0IEdlbyA9IHt9O1xuXG4vLyBQcm9qZWN0aW9uIGNvbnN0YW50c1xuR2VvLmRlZmF1bHRfc291cmNlX21heF96b29tID0gMTg7XG5HZW8uZGVmYXVsdF92aWV3X21heF96b29tID0gMjA7XG5HZW8udGlsZV9zaXplID0gMjU2O1xuR2VvLmhhbGZfY2lyY3VtZmVyZW5jZV9tZXRlcnMgPSAyMDAzNzUwOC4zNDI3ODkyNDQ7XG5HZW8uY2lyY3VtZmVyZW5jZV9tZXRlcnMgPSBHZW8uaGFsZl9jaXJjdW1mZXJlbmNlX21ldGVycyAqIDI7XG5HZW8ubWluX3pvb21fbWV0ZXJzX3Blcl9waXhlbCA9IEdlby5jaXJjdW1mZXJlbmNlX21ldGVycyAvIEdlby50aWxlX3NpemU7IC8vIG1pbiB6b29tIGRyYXdzIHdvcmxkIGFzIDIgdGlsZXMgd2lkZVxuXG5sZXQgbWV0ZXJzX3Blcl9waXhlbCA9IFtdO1xuR2VvLm1ldGVyc1BlclBpeGVsID0gZnVuY3Rpb24gKHopIHtcbiAgICBtZXRlcnNfcGVyX3BpeGVsW3pdID0gbWV0ZXJzX3Blcl9waXhlbFt6XSB8fCBHZW8ubWluX3pvb21fbWV0ZXJzX3Blcl9waXhlbCAvIE1hdGgucG93KDIsIHopO1xuICAgIHJldHVybiBtZXRlcnNfcGVyX3BpeGVsW3pdO1xufTtcblxubGV0IG1ldGVyc19wZXJfdGlsZSA9IFtdO1xuR2VvLm1ldGVyc1BlclRpbGUgPSBmdW5jdGlvbiAoeikge1xuICAgIG1ldGVyc19wZXJfdGlsZVt6XSA9IG1ldGVyc19wZXJfdGlsZVt6XSB8fCBHZW8uY2lyY3VtZmVyZW5jZV9tZXRlcnMgLyBNYXRoLnBvdygyLCB6KTtcbiAgICByZXR1cm4gbWV0ZXJzX3Blcl90aWxlW3pdO1xufTtcblxuLy8gQ29udmVyc2lvbiBmdW5jdGlvbnMgYmFzZWQgb24gYW4gZGVmaW5lZCB0aWxlIHNjYWxlXG5HZW8udGlsZV9zY2FsZSA9IDQwOTY7IC8vIGNvb3JkaW5hdGVzIGFyZSBsb2NhbGx5IHNjYWxlZCB0byB0aGUgcmFuZ2UgWzAsIHRpbGVfc2NhbGVdXG5HZW8udW5pdHNfcGVyX3BpeGVsID0gR2VvLnRpbGVfc2NhbGUgLyBHZW8udGlsZV9zaXplO1xuR2VvLmhlaWdodF9zY2FsZSA9IDE2OyAgLy8gcHJvdmlkZXMgc3ViLW1ldGVyIHByZWNpc2lvbiBmb3IgaGVpZ2h0IHZhbHVlcyAoMTZ0aHMgb2YgYSBtZXRlcnMpXG5cbmxldCB1bml0c19wZXJfbWV0ZXIgPSBbXTtcbkdlby51bml0c1Blck1ldGVyID0gZnVuY3Rpb24gKHopIHtcbiAgICB1bml0c19wZXJfbWV0ZXJbel0gPSB1bml0c19wZXJfbWV0ZXJbel0gfHwgR2VvLnRpbGVfc2NhbGUgLyAoR2VvLnRpbGVfc2l6ZSAqIEdlby5tZXRlcnNQZXJQaXhlbCh6KSk7XG4gICAgcmV0dXJuIHVuaXRzX3Blcl9tZXRlclt6XTtcbn07XG5cbi8vIENvbnZlcnQgdGlsZSBsb2NhdGlvbiB0byBtZXJjYXRvciBtZXRlcnMgLSBtdWx0aXBseSBieSBwaXhlbHMgcGVyIHRpbGUsIHRoZW4gYnkgbWV0ZXJzIHBlciBwaXhlbCwgYWRqdXN0IGZvciBtYXAgb3JpZ2luXG5HZW8ubWV0ZXJzRm9yVGlsZSA9IGZ1bmN0aW9uICh0aWxlKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgeDogdGlsZS54ICogR2VvLmNpcmN1bWZlcmVuY2VfbWV0ZXJzIC8gTWF0aC5wb3coMiwgdGlsZS56KSAtIEdlby5oYWxmX2NpcmN1bWZlcmVuY2VfbWV0ZXJzLFxuICAgICAgICB5OiAtKHRpbGUueSAqIEdlby5jaXJjdW1mZXJlbmNlX21ldGVycyAvIE1hdGgucG93KDIsIHRpbGUueikgLSBHZW8uaGFsZl9jaXJjdW1mZXJlbmNlX21ldGVycylcbiAgICB9O1xufTtcblxuLyoqXG4gICBHaXZlbiBhIHBvaW50IGluIG1lcmNhdG9yIG1ldGVycyBhbmQgYSB6b29tIGxldmVsLCByZXR1cm4gdGhlIHRpbGUgWC9ZL1ogdGhhdCB0aGUgcG9pbnQgbGllcyBpblxuKi9cbkdlby50aWxlRm9yTWV0ZXJzID0gZnVuY3Rpb24gKFt4LCB5XSwgem9vbSkge1xuICAgIHJldHVybiB7XG4gICAgICAgIHg6IE1hdGguZmxvb3IoKHggKyBHZW8uaGFsZl9jaXJjdW1mZXJlbmNlX21ldGVycykgLyAoR2VvLmNpcmN1bWZlcmVuY2VfbWV0ZXJzIC8gTWF0aC5wb3coMiwgem9vbSkpKSxcbiAgICAgICAgeTogTWF0aC5mbG9vcigoLXkgKyBHZW8uaGFsZl9jaXJjdW1mZXJlbmNlX21ldGVycykgLyAoR2VvLmNpcmN1bWZlcmVuY2VfbWV0ZXJzIC8gTWF0aC5wb3coMiwgem9vbSkpKSxcbiAgICAgICAgejogem9vbVxuICAgIH07XG59O1xuXG4vLyBXcmFwIGEgdGlsZSB0byBwb3NpdGl2ZSAjcyBmb3Igem9vbVxuLy8gT3B0aW9uYWxseSBzcGVjaWZ5IHRoZSBheGVzIHRvIHdyYXBcbkdlby53cmFwVGlsZSA9IGZ1bmN0aW9uKHsgeCwgeSwgeiB9LCBtYXNrID0geyB4OiB0cnVlLCB5OiBmYWxzZSB9KSB7XG4gICAgdmFyIG0gPSAoMSA8PCB6KSAtIDE7XG4gICAgaWYgKG1hc2sueCkge1xuICAgICAgICB4ID0geCAmIG07XG4gICAgfVxuICAgIGlmIChtYXNrLnkpIHtcbiAgICAgICAgeSA9IHkgJiBtO1xuICAgIH1cbiAgICByZXR1cm4geyB4LCB5LCB6IH07XG59O1xuXG4vKipcbiAgIENvbnZlcnQgbWVyY2F0b3IgbWV0ZXJzIHRvIGxhdC1sbmdcbiovXG5HZW8ubWV0ZXJzVG9MYXRMbmcgPSBmdW5jdGlvbiAoW3gsIHldKSB7XG5cbiAgICB4IC89IEdlby5oYWxmX2NpcmN1bWZlcmVuY2VfbWV0ZXJzO1xuICAgIHkgLz0gR2VvLmhhbGZfY2lyY3VtZmVyZW5jZV9tZXRlcnM7XG5cbiAgICB5ID0gKDIgKiBNYXRoLmF0YW4oTWF0aC5leHAoeSAqIE1hdGguUEkpKSAtIChNYXRoLlBJIC8gMikpIC8gTWF0aC5QSTtcblxuICAgIHggKj0gMTgwO1xuICAgIHkgKj0gMTgwO1xuXG4gICAgcmV0dXJuIFt4LCB5XTtcbn07XG5cbi8qKlxuICBDb252ZXJ0IGxhdC1sbmcgdG8gbWVyY2F0b3IgbWV0ZXJzXG4qL1xuR2VvLmxhdExuZ1RvTWV0ZXJzID0gZnVuY3Rpb24oW3gsIHldKSB7XG5cbiAgICAvLyBMYXRpdHVkZVxuICAgIHkgPSBNYXRoLmxvZyhNYXRoLnRhbih5Kk1hdGguUEkvMzYwICsgTWF0aC5QSS80KSkgLyBNYXRoLlBJO1xuICAgIHkgKj0gR2VvLmhhbGZfY2lyY3VtZmVyZW5jZV9tZXRlcnM7XG5cbiAgICAvLyBMb25naXR1ZGVcbiAgICB4ICo9IEdlby5oYWxmX2NpcmN1bWZlcmVuY2VfbWV0ZXJzIC8gMTgwO1xuXG4gICAgcmV0dXJuIFt4LCB5XTtcbn07XG5cbkdlby53cmFwTG5nID0gZnVuY3Rpb24oeCkge1xuICAgIGlmICh4ID4gMTgwIHx8IHggPCAtMTgwKSB7XG4gICAgICAgIHggPSAoKHggKyAxODApICUgMzYwICsgMzYwKSAlIDM2MCAtIDE4MDtcbiAgICB9XG4gICAgcmV0dXJuIHg7XG59O1xuXG4vLyBSdW4gYW4gaW4tcGxhY2UgdHJhbnNmb3JtIGZ1bmN0aW9uIG9uIGVhY2ggY29vb3JkaW5hdGUgaW4gYSBHZW9KU09OIGdlb21ldHJ5XG5HZW8udHJhbnNmb3JtR2VvbWV0cnkgPSBmdW5jdGlvbiAoZ2VvbWV0cnksIHRyYW5zZm9ybSkge1xuICAgIGlmIChnZW9tZXRyeSA9PSBudWxsKSB7XG4gICAgICAgIHJldHVybjsgLy8gc2tpcCBpZiBtaXNzaW5nIGdlb21ldHJ5ICh2YWxpZCBHZW9KU09OKVxuICAgIH1cblxuICAgIGlmIChnZW9tZXRyeS50eXBlID09PSAnUG9pbnQnKSB7XG4gICAgICAgIHRyYW5zZm9ybShnZW9tZXRyeS5jb29yZGluYXRlcyk7XG4gICAgfVxuICAgIGVsc2UgaWYgKGdlb21ldHJ5LnR5cGUgPT09ICdMaW5lU3RyaW5nJyB8fCBnZW9tZXRyeS50eXBlID09PSAnTXVsdGlQb2ludCcpIHtcbiAgICAgICAgZ2VvbWV0cnkuY29vcmRpbmF0ZXMuZm9yRWFjaCh0cmFuc2Zvcm0pO1xuICAgIH1cbiAgICBlbHNlIGlmIChnZW9tZXRyeS50eXBlID09PSAnUG9seWdvbicgfHwgZ2VvbWV0cnkudHlwZSA9PT0gJ011bHRpTGluZVN0cmluZycpIHtcbiAgICAgICAgZ2VvbWV0cnkuY29vcmRpbmF0ZXMuZm9yRWFjaChjb29yZGluYXRlcyA9PiBjb29yZGluYXRlcy5mb3JFYWNoKHRyYW5zZm9ybSkpO1xuICAgIH1cbiAgICBlbHNlIGlmIChnZW9tZXRyeS50eXBlID09PSAnTXVsdGlQb2x5Z29uJykge1xuICAgICAgICBnZW9tZXRyeS5jb29yZGluYXRlcy5mb3JFYWNoKHBvbHlnb24gPT4ge1xuICAgICAgICAgICAgcG9seWdvbi5mb3JFYWNoKGNvb3JkaW5hdGVzID0+IGNvb3JkaW5hdGVzLmZvckVhY2godHJhbnNmb3JtKSk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvLyBUT0RPOiBzdXBwb3J0IEdlb21ldHJ5Q29sbGVjdGlvblxufTtcblxuR2VvLmJveEludGVyc2VjdCA9IGZ1bmN0aW9uIChiMSwgYjIpIHtcbiAgICByZXR1cm4gIShcbiAgICAgICAgYjIuc3cueCA+IGIxLm5lLnggfHxcbiAgICAgICAgYjIubmUueCA8IGIxLnN3LnggfHxcbiAgICAgICAgYjIuc3cueSA+IGIxLm5lLnkgfHxcbiAgICAgICAgYjIubmUueSA8IGIxLnN3LnlcbiAgICApO1xufTtcblxuLy8gRmluZHMgdGhlIGF4aXMtYWxpZ25lZCBib3VuZGluZyBib3ggZm9yIGEgcG9seWdvblxuR2VvLmZpbmRCb3VuZGluZ0JveCA9IGZ1bmN0aW9uIChwb2x5Z29uKSB7XG4gICAgdmFyIG1pbl94ID0gSW5maW5pdHksXG4gICAgICAgIG1heF94ID0gLUluZmluaXR5LFxuICAgICAgICBtaW5feSA9IEluZmluaXR5LFxuICAgICAgICBtYXhfeSA9IC1JbmZpbml0eTtcblxuICAgIC8vIE9ubHkgbmVlZCB0byBleGFtaW5lIG91dGVyIHJpbmcgKHBvbHlnb25bMF0pXG4gICAgdmFyIG51bV9jb29yZHMgPSBwb2x5Z29uWzBdLmxlbmd0aDtcbiAgICBmb3IgKHZhciBjPTA7IGMgPCBudW1fY29vcmRzOyBjKyspIHtcbiAgICAgICAgdmFyIGNvb3JkID0gcG9seWdvblswXVtjXTtcblxuICAgICAgICBpZiAoY29vcmRbMF0gPCBtaW5feCkge1xuICAgICAgICAgICAgbWluX3ggPSBjb29yZFswXTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY29vcmRbMV0gPCBtaW5feSkge1xuICAgICAgICAgICAgbWluX3kgPSBjb29yZFsxXTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY29vcmRbMF0gPiBtYXhfeCkge1xuICAgICAgICAgICAgbWF4X3ggPSBjb29yZFswXTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY29vcmRbMV0gPiBtYXhfeSkge1xuICAgICAgICAgICAgbWF4X3kgPSBjb29yZFsxXTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBbbWluX3gsIG1pbl95LCBtYXhfeCwgbWF4X3ldO1xufTtcblxuLy8gQ29udmVydCBnZW9tZXRyeSB0eXBlIHRvIG9uZSBvZjogJ3BvaW50JywgJ2xpbmUnLCAncG9seWdvbidcbkdlby5nZW9tZXRyeVR5cGUgPSBmdW5jdGlvbih0eXBlKSB7XG4gICAgaWYgKHR5cGUgPT09ICdQb2x5Z29uJyB8fCB0eXBlID09PSAnTXVsdGlQb2x5Z29uJykge1xuICAgICAgICByZXR1cm4gJ3BvbHlnb24nO1xuICAgIH1cbiAgICBlbHNlIGlmICh0eXBlID09PSAnTGluZVN0cmluZycgfHwgdHlwZSA9PT0gJ011bHRpTGluZVN0cmluZycpIHtcbiAgICAgICAgcmV0dXJuICdsaW5lJztcbiAgICB9XG4gICAgaWYgKHR5cGUgPT09ICdQb2ludCcgfHwgdHlwZSA9PT0gJ011bHRpUG9pbnQnKSB7XG4gICAgICAgIHJldHVybiAncG9pbnQnO1xuICAgIH1cbn07XG5cbkdlby5jZW50cm9pZCA9IGZ1bmN0aW9uIChwb2x5Z29uKSB7XG4gICAgLy8gQWRhcHRlZCBmcm9tIGh0dHBzOi8vZ2l0aHViLmNvbS9MZWFmbGV0L0xlYWZsZXQvYmxvYi9jMTBmNDA1YTExMjE0MmIxOTc4NTk2N2NlMGUxNDIxMzJhNjA5NWFkL3NyYy9sYXllci92ZWN0b3IvUG9seWdvbi5qcyNMNTdcbiAgICBsZXQgeCA9IDAsIHkgPSAwLCBhcmVhID0gMDtcbiAgICBsZXQgcmluZyA9IHBvbHlnb25bMF07IC8vIG9ubHkgdXNlIGZpcnN0IHJpbmcgZm9yIG5vd1xuICAgIGxldCBsZW4gPSByaW5nLmxlbmd0aDtcblxuICAgIGZvciAobGV0IGkgPSAwLCBqID0gbGVuIC0gMTsgaSA8IGxlbjsgaiA9IGksIGkrKykge1xuICAgICAgICBsZXQgcDAgPSByaW5nW2ldO1xuICAgICAgICBsZXQgcDEgPSByaW5nW2pdO1xuICAgICAgICBsZXQgZiA9IHAwWzFdICogcDFbMF0gLSBwMVsxXSAqIHAwWzBdO1xuXG4gICAgICAgIHggKz0gKHAwWzBdICsgcDFbMF0pICogZjtcbiAgICAgICAgeSArPSAocDBbMV0gKyBwMVsxXSkgKiBmO1xuICAgICAgICBhcmVhICs9IGYgKiAzO1xuICAgIH1cblxuICAgIHJldHVybiBbeCAvIGFyZWEsIHkgLyBhcmVhXTtcbn07XG5cbkdlby5tdWx0aUNlbnRyb2lkID0gZnVuY3Rpb24gKHBvbHlnb25zKSB7XG4gICAgbGV0IG4gPSBwb2x5Z29ucy5sZW5ndGg7XG4gICAgbGV0IGNlbnRyb2lkID0gWzAsIDBdO1xuXG4gICAgZm9yIChsZXQgcD0wOyBwIDwgcG9seWdvbnMubGVuZ3RoOyBwKyspIHtcbiAgICAgICAgbGV0IGMgPSBHZW8uY2VudHJvaWQocG9seWdvbnNbcF0pO1xuICAgICAgICBjZW50cm9pZFswXSArPSBjWzBdO1xuICAgICAgICBjZW50cm9pZFsxXSArPSBjWzFdO1xuICAgIH1cblxuICAgIGNlbnRyb2lkWzBdIC89IG47XG4gICAgY2VudHJvaWRbMV0gLz0gbjtcblxuICAgIHJldHVybiBjZW50cm9pZDtcbn07XG5cbkdlby5zaWduZWRQb2x5Z29uUmluZ0FyZWFTdW0gPSBmdW5jdGlvbiAocmluZykge1xuICAgIGxldCBhcmVhID0gMDtcbiAgICBsZXQgbiA9IHJpbmcubGVuZ3RoO1xuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBuIC0gMTsgaSsrKSB7XG4gICAgICAgIGxldCBwMCA9IHJpbmdbaV07XG4gICAgICAgIGxldCBwMSA9IHJpbmdbaSsxXTtcblxuICAgICAgICBhcmVhICs9IHAwWzBdICogcDFbMV0gLSBwMVswXSAqIHAwWzFdO1xuICAgIH1cblxuICAgIGFyZWEgKz0gcmluZ1tuIC0gMV1bMF0gKiByaW5nWzBdWzFdIC0gcmluZ1swXVswXSAqIHJpbmdbbiAtIDFdWzFdO1xuICAgIHJldHVybiBhcmVhO1xufTtcblxuR2VvLnBvbHlnb25SaW5nQXJlYSA9IGZ1bmN0aW9uIChyaW5nKSB7XG4gICAgcmV0dXJuIE1hdGguYWJzKEdlby5zaWduZWRQb2x5Z29uUmluZ0FyZWFTdW0ocmluZykpIC8gMjtcbn07XG5cbi8vIFRPRE86IHN1YnRyYWN0IGlubmVyIHJpbmdzXG5HZW8ucG9seWdvbkFyZWEgPSBmdW5jdGlvbiAocG9seWdvbikge1xuICAgIHJldHVybiBHZW8ucG9seWdvblJpbmdBcmVhKHBvbHlnb25bMF0pO1xufTtcblxuR2VvLm11bHRpUG9seWdvbkFyZWEgPSBmdW5jdGlvbiAocG9seWdvbnMpIHtcbiAgICBsZXQgYXJlYSA9IDA7XG5cbiAgICBmb3IgKGxldCBwPTA7IHAgPCBwb2x5Z29ucy5sZW5ndGg7IHArKykge1xuICAgICAgICBhcmVhICs9IEdlby5wb2x5Z29uQXJlYShwb2x5Z29uc1twXSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGFyZWE7XG59O1xuXG5HZW8ucmluZ1dpbmRpbmcgPSBmdW5jdGlvbiAocmluZykge1xuICAgIGxldCBhcmVhID0gR2VvLnNpZ25lZFBvbHlnb25SaW5nQXJlYVN1bShyaW5nKTtcbiAgICBpZiAoYXJlYSA+IDApIHtcbiAgICAgICAgcmV0dXJuICdDVyc7XG4gICAgfVxuICAgIGVsc2UgaWYgKGFyZWEgPCAwKSB7XG4gICAgICAgIHJldHVybiAnQ0NXJztcbiAgICB9XG4gICAgLy8gcmV0dXJuIHVuZGVmaW5lZCBvbiB6ZXJvIGFyZWEgcG9seWdvblxufTtcbiIsIi8vIFdlYkdMIGNvbnN0YW50cyAtIG5lZWQgdG8gaW1wb3J0IHRoZXNlIHNlcGFyYXRlbHkgdG8gbWFrZSB0aGVtIGF2YWlsYWJsZSBpbiB0aGUgd2ViIHdvcmtlclxuXG52YXIgZ2w7XG5leHBvcnQgZGVmYXVsdCBnbCA9IHt9O1xuXG4vKiBEYXRhVHlwZSAqL1xuZ2wuQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgxNDAwO1xuZ2wuVU5TSUdORURfQllURSAgICAgICAgICAgICAgICAgID0gMHgxNDAxO1xuZ2wuU0hPUlQgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgxNDAyO1xuZ2wuVU5TSUdORURfU0hPUlQgICAgICAgICAgICAgICAgID0gMHgxNDAzO1xuZ2wuSU5UICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgxNDA0O1xuZ2wuVU5TSUdORURfSU5UICAgICAgICAgICAgICAgICAgID0gMHgxNDA1O1xuZ2wuRkxPQVQgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgxNDA2O1xuIiwiLy8gV2ViR0wgY29udGV4dCB3cmFwcGVyXG5cbnZhciBDb250ZXh0O1xuZXhwb3J0IGRlZmF1bHQgQ29udGV4dCA9IHt9O1xuXG4vLyBTZXR1cCBhIFdlYkdMIGNvbnRleHRcbi8vIElmIG5vIGNhbnZhcyBlbGVtZW50IGlzIHByb3ZpZGVkLCBvbmUgaXMgY3JlYXRlZCBhbmQgYWRkZWQgdG8gdGhlIGRvY3VtZW50IGJvZHlcbkNvbnRleHQuZ2V0Q29udGV4dCA9IGZ1bmN0aW9uIGdldENvbnRleHQgKGNhbnZhcywgb3B0aW9ucylcbntcbiAgICB2YXIgZnVsbHNjcmVlbiA9IGZhbHNlO1xuICAgIGlmIChjYW52YXMgPT0gbnVsbCkge1xuICAgICAgICBjYW52YXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjYW52YXMnKTtcbiAgICAgICAgY2FudmFzLnN0eWxlLnBvc2l0aW9uID0gJ2Fic29sdXRlJztcbiAgICAgICAgY2FudmFzLnN0eWxlLnRvcCA9IDA7XG4gICAgICAgIGNhbnZhcy5zdHlsZS5sZWZ0ID0gMDtcbiAgICAgICAgY2FudmFzLnN0eWxlLnpJbmRleCA9IC0xO1xuICAgICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGNhbnZhcyk7XG4gICAgICAgIGZ1bGxzY3JlZW4gPSB0cnVlO1xuICAgIH1cblxuICAgIHZhciBnbCA9IGNhbnZhcy5nZXRDb250ZXh0KCd3ZWJnbCcsIG9wdGlvbnMpIHx8IGNhbnZhcy5nZXRDb250ZXh0KCdleHBlcmltZW50YWwtd2ViZ2wnLCBvcHRpb25zKTtcbiAgICBpZiAoIWdsKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIkNvdWxkbid0IGNyZWF0ZSBXZWJHTCBjb250ZXh0LlwiKTtcbiAgICB9XG5cbiAgICBpZiAoIWZ1bGxzY3JlZW4pIHtcbiAgICAgICAgQ29udGV4dC5yZXNpemUoZ2wsIHBhcnNlRmxvYXQoY2FudmFzLnN0eWxlLndpZHRoKSwgcGFyc2VGbG9hdChjYW52YXMuc3R5bGUuaGVpZ2h0KSwgb3B0aW9ucy5kZXZpY2VfcGl4ZWxfcmF0aW8pO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgQ29udGV4dC5yZXNpemUoZ2wsIHdpbmRvdy5pbm5lcldpZHRoLCB3aW5kb3cuaW5uZXJIZWlnaHQsIG9wdGlvbnMuZGV2aWNlX3BpeGVsX3JhdGlvKTtcbiAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIENvbnRleHQucmVzaXplKGdsLCB3aW5kb3cuaW5uZXJXaWR0aCwgd2luZG93LmlubmVySGVpZ2h0LCBvcHRpb25zLmRldmljZV9waXhlbF9yYXRpbyk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiBnbDtcbn07XG5cbkNvbnRleHQucmVzaXplID0gZnVuY3Rpb24gKGdsLCB3aWR0aCwgaGVpZ2h0LCBkZXZpY2VfcGl4ZWxfcmF0aW8pXG57XG4gICAgZGV2aWNlX3BpeGVsX3JhdGlvID0gZGV2aWNlX3BpeGVsX3JhdGlvIHx8IHdpbmRvdy5kZXZpY2VQaXhlbFJhdGlvIHx8IDE7XG4gICAgZ2wuY2FudmFzLnN0eWxlLndpZHRoID0gd2lkdGggKyAncHgnO1xuICAgIGdsLmNhbnZhcy5zdHlsZS5oZWlnaHQgPSBoZWlnaHQgKyAncHgnO1xuICAgIGdsLmNhbnZhcy53aWR0aCA9IE1hdGgucm91bmQod2lkdGggKiBkZXZpY2VfcGl4ZWxfcmF0aW8pO1xuICAgIGdsLmNhbnZhcy5oZWlnaHQgPSBNYXRoLnJvdW5kKGhlaWdodCAqIGRldmljZV9waXhlbF9yYXRpbyk7XG4gICAgZ2wuYmluZEZyYW1lYnVmZmVyKGdsLkZSQU1FQlVGRkVSLCBudWxsKTtcbiAgICBnbC52aWV3cG9ydCgwLCAwLCBnbC5jYW52YXMud2lkdGgsIGdsLmNhbnZhcy5oZWlnaHQpO1xufTtcbiIsIi8vIFdlYkdMIGV4dGVuc2lvbiB3cmFwcGVyXG4vLyBTdG9yZXMgZXh0ZW5zaW9ucyBieSBuYW1lIGFuZCBHTCBjb250ZXh0XG5cbi8vIGxpc3Qgb2YgZXh0ZW5zaW9uIGFycmF5cywgZm9yIGVhY2ggZW50cnksIDFzdCBlbGVtZW50IEdMIGNvbnRleHQsIDJuZCBtYXAgb2YgZXh0ZW5zaW9ucyBieSBuYW1lXG5sZXQgZXh0ZW5zaW9ucyA9IFtdO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBnZXRFeHRlbnNpb24gKGdsLCBuYW1lKSB7XG4gICAgbGV0IGV4dHMgPSBleHRlbnNpb25zLmZpbHRlcihlID0+IGVbMF0gPT09IGdsKVswXTtcbiAgICBleHRzID0gZXh0cyAmJiBleHRzWzFdO1xuXG4gICAgaWYgKCFleHRzKSB7XG4gICAgICAgIGV4dGVuc2lvbnMucHVzaChbZ2wsIHt9XSk7XG4gICAgICAgIGV4dHMgPSBleHRlbnNpb25zW2V4dGVuc2lvbnMubGVuZ3RoLTFdWzFdO1xuICAgIH1cblxuICAgIGlmICghZXh0c1tuYW1lXSkge1xuICAgICAgICBleHRzW25hbWVdID0gZ2wuZ2V0RXh0ZW5zaW9uKG5hbWUpO1xuICAgIH1cbiAgICByZXR1cm4gZXh0c1tuYW1lXTtcbn1cbiIsInZhciBHTFNMID0ge307XG5leHBvcnQgZGVmYXVsdCBHTFNMO1xuXG4vKipcbiAgICBQYXJzZSB1bmlmb3JtcyBmcm9tIGEgSlMgb2JqZWN0LCBpbmZlcnMgdHlwZXMgYW5kIHJldHVybnMgYW4gYXJyYXkgb2Ygb2JqZWN0cyB3aXRoIHRoZVxuICAgIG5lY2Vzc2FyeSBpbmZvcm1hdGlvbiB0byBzZXQgdW5pZm9ybSB2YWx1ZXMgb24gYSBHTCBwcm9ncmFtLiBFYWNoIG9iamVjdCBpbiB0aGUgcmV0dXJuZWRcbiAgICBhcnJheSBoYXMgdGhlIGZvcm06XG4gICAgeyB0eXBlLCBtZXRob2QsIG5hbWUsIHZhbHVlIH1cblxuICAgIHR5cGU6IHRoZSBHTCB1bmlmb3JtIHR5cGUsIHN1Y2ggYXMgJ3ZlYzMnLCAnZmxvYXQnLCBldGMuXG4gICAgbWV0aG9kOiB0aGUgR0wgdW5pZm9ybSBzZXR0ZXIgbWV0aG9kIHRvIHVzZSwgc3VjaCBhcyAnMWYnLCAnM2Z2JywgZXRjLlxuICAgIG5hbWU6IHRoZSBmdWxseSBxdWFsaWZpZWQgbmFtZSBvZiB0aGUgR0wgdW5pZm9ybSBsb2NhdGlvbiwgZS5nLiAnYXJyYXlbMF0uZmllbGQnLCBldGMuXG4gICAgdmFsdWU6IHRoZSB2YWx1ZSB0byBiZSBwYXNzZWQgdG8gdGhlIEdMIHVuaWZvcm0gc2V0dGVyIGZvciB0aGF0IHR5cGUsIGUuZy4gWzEsIDIsIDNdIGZvciBhIHZlYzNcblxuICAgIFRleHR1cmVzIGhhdmUgc3BlY2lhbCBiZWhhdmlvcjogdW5pZm9ybXMgd2l0aCBzdHJpbmcgdmFsdWVzIGFyZSB0cmVhdGVkIGFzIHRleHR1cmVzLCBhbmRcbiAgICB0aGUgc3RyaW5nIGlzIHVzZWQgYXMgYSB1bmlxdWUgdGV4dHVyZSAna2V5JyB0byBiZSBpbnRlcnByZXRlZCBieSB0aGUgY2FsbGVyICh3aGljaCBpcyByZXNwb25zaWJsZVxuICAgIGZvciBhY3R1YWxseSBzZXR0aW5nIHRoZSB1bmlmb3JtcykuIEZvciBleGFtcGxlLCB0aGlzIGNvdWxkIGJlIHVzZWQgYXMgYSBrZXkgaW50byBhIGRpY3Rpb25hcnkgb2ZcbiAgICBrbm93biB0ZXh0dXJlIG5hbWVzLCBvciBpdCBjb3VsZCBzaW1wbHkgYmUgdXNlZCBhcyBhIFVSTCB0byBkeW5hbWljYWxseSBsb2FkIHRoZSB0ZXh0dXJlIGZyb20uXG4qL1xuR0xTTC5wYXJzZVVuaWZvcm1zID0gZnVuY3Rpb24gKHVuaWZvcm1zKSB7XG4gICAgdmFyIHBhcnNlZCA9IFtdO1xuXG4gICAgZm9yICh2YXIgbmFtZSBpbiB1bmlmb3Jtcykge1xuICAgICAgICB2YXIga2V5ID0gbmFtZTsgLy8gc2F2ZSB0aGUgb3JpZ2luYWwgbmFtZVxuICAgICAgICB2YXIgdW5pZm9ybSA9IHVuaWZvcm1zW25hbWVdO1xuICAgICAgICB2YXIgdTtcblxuICAgICAgICAvLyBTaW5nbGUgZmxvYXRcbiAgICAgICAgaWYgKHR5cGVvZiB1bmlmb3JtID09PSAnbnVtYmVyJykge1xuICAgICAgICAgICAgcGFyc2VkLnB1c2goe1xuICAgICAgICAgICAgICAgIHR5cGU6ICdmbG9hdCcsXG4gICAgICAgICAgICAgICAgbWV0aG9kOiAnMWYnLFxuICAgICAgICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgICAgICAgdmFsdWU6IHVuaWZvcm0sXG4gICAgICAgICAgICAgICAga2V5LFxuICAgICAgICAgICAgICAgIHVuaWZvcm1zXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICAvLyBBcnJheTogdmVjdG9yLCBhcnJheSBvZiBmbG9hdHMsIGFycmF5IG9mIHRleHR1cmVzXG4gICAgICAgIGVsc2UgaWYgKEFycmF5LmlzQXJyYXkodW5pZm9ybSkpIHtcbiAgICAgICAgICAgIC8vIE51bWVyaWMgdmFsdWVzXG4gICAgICAgICAgICBpZiAodHlwZW9mIHVuaWZvcm1bMF0gPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgICAgICAgLy8gZmxvYXQgdmVjdG9ycyAodmVjMiwgdmVjMywgdmVjNClcbiAgICAgICAgICAgICAgICBpZiAodW5pZm9ybS5sZW5ndGggPj0gMiAmJiB1bmlmb3JtLmxlbmd0aCA8PSA0KSB7XG4gICAgICAgICAgICAgICAgICAgIHBhcnNlZC5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICd2ZWMnICsgdW5pZm9ybS5sZW5ndGgsXG4gICAgICAgICAgICAgICAgICAgICAgICBtZXRob2Q6IHVuaWZvcm0ubGVuZ3RoICsgJ2Z2JyxcbiAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogdW5pZm9ybSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGtleSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHVuaWZvcm1zXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBmbG9hdCBhcnJheVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKHVuaWZvcm0ubGVuZ3RoID4gNCkge1xuICAgICAgICAgICAgICAgICAgICBwYXJzZWQucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAnZmxvYXRbXScsXG4gICAgICAgICAgICAgICAgICAgICAgICBtZXRob2Q6ICcxZnYnLFxuICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogbmFtZSArICdbMF0nLFxuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IHVuaWZvcm0sXG4gICAgICAgICAgICAgICAgICAgICAgICBrZXksXG4gICAgICAgICAgICAgICAgICAgICAgICB1bmlmb3Jtc1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gVE9ETzogYXNzdW1lIG1hdHJpeCBmb3IgKHR5cGVvZiA9PSBGbG9hdDMyQXJyYXkgJiYgbGVuZ3RoID09IDE2KT9cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIEFycmF5IG9mIHRleHR1cmVzXG4gICAgICAgICAgICBlbHNlIGlmICh0eXBlb2YgdW5pZm9ybVswXSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICBmb3IgKHU9MDsgdSA8IHVuaWZvcm0ubGVuZ3RoOyB1KyspIHtcbiAgICAgICAgICAgICAgICAgICAgcGFyc2VkLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ3NhbXBsZXIyRCcsXG4gICAgICAgICAgICAgICAgICAgICAgICBtZXRob2Q6ICcxaScsXG4gICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiBuYW1lICsgJ1snICsgdSArICddJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiB1bmlmb3JtW3VdLFxuICAgICAgICAgICAgICAgICAgICAgICAga2V5OiB1LFxuICAgICAgICAgICAgICAgICAgICAgICAgdW5pZm9ybXM6IHVuaWZvcm1cbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gQXJyYXkgb2YgYXJyYXlzIC0gYnV0IG9ubHkgYXJyYXlzIG9mIHZlY3RvcnMgYXJlIGFsbG93ZWQgaW4gdGhpcyBjYXNlXG4gICAgICAgICAgICBlbHNlIGlmIChBcnJheS5pc0FycmF5KHVuaWZvcm1bMF0pICYmIHR5cGVvZiB1bmlmb3JtWzBdWzBdID09PSAnbnVtYmVyJykge1xuICAgICAgICAgICAgICAgIC8vIGZsb2F0IHZlY3RvcnMgKHZlYzIsIHZlYzMsIHZlYzQpXG4gICAgICAgICAgICAgICAgaWYgKHVuaWZvcm1bMF0ubGVuZ3RoID49IDIgJiYgdW5pZm9ybVswXS5sZW5ndGggPD0gNCkge1xuICAgICAgICAgICAgICAgICAgICAvLyBTZXQgZWFjaCB2ZWN0b3IgaW4gdGhlIGFycmF5XG4gICAgICAgICAgICAgICAgICAgIGZvciAodT0wOyB1IDwgdW5pZm9ybS5sZW5ndGg7IHUrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2VkLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICd2ZWMnICsgdW5pZm9ybVswXS5sZW5ndGgsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kOiB1bmlmb3JtW3VdLmxlbmd0aCArICdmdicsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogbmFtZSArICdbJyArIHUgKyAnXScsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IHVuaWZvcm1bdV0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5OiB1LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuaWZvcm1zOiB1bmlmb3JtXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIFRPRE86IGVsc2Ugd2FybmluZ1xuICAgICAgICB9XG4gICAgICAgIC8vIEJvb2xlYW5cbiAgICAgICAgZWxzZSBpZiAodHlwZW9mIHVuaWZvcm0gPT09ICdib29sZWFuJykge1xuICAgICAgICAgICAgcGFyc2VkLnB1c2goe1xuICAgICAgICAgICAgICAgIHR5cGU6ICdib29sJyxcbiAgICAgICAgICAgICAgICBtZXRob2Q6ICcxaScsXG4gICAgICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgICAgICAgICB2YWx1ZTogdW5pZm9ybSxcbiAgICAgICAgICAgICAgICBrZXksXG4gICAgICAgICAgICAgICAgdW5pZm9ybXNcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIC8vIFRleHR1cmVcbiAgICAgICAgZWxzZSBpZiAodHlwZW9mIHVuaWZvcm0gPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICBwYXJzZWQucHVzaCh7XG4gICAgICAgICAgICAgICAgdHlwZTogJ3NhbXBsZXIyRCcsXG4gICAgICAgICAgICAgICAgbWV0aG9kOiAnMWknLFxuICAgICAgICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgICAgICAgdmFsdWU6IHVuaWZvcm0sXG4gICAgICAgICAgICAgICAga2V5LFxuICAgICAgICAgICAgICAgIHVuaWZvcm1zXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBwYXJzZWQ7XG59O1xuXG4vKipcbiAgICBHZW5lcmF0ZSBhIEdMU0wgdmFyaWFibGUgZGVmaW5pdGlvbiBmcm9tIGEgSlMgb2JqZWN0XG4qL1xuR0xTTC5kZWZpbmVWYXJpYWJsZSA9IGZ1bmN0aW9uIChuYW1lLCB2YWx1ZSkge1xuICAgIHZhciB0eXBlLCBhcnJheTtcblxuICAgIC8vIFNpbmdsZSBmbG9hdFxuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInKSB7XG4gICAgICAgIHR5cGUgPSAnZmxvYXQnO1xuICAgIH1cbiAgICAvLyBNdWx0aXBsZSBmbG9hdHMgLSB2ZWN0b3Igb3IgYXJyYXlcbiAgICBlbHNlIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICAvLyBOdW1lcmljIHZhbHVlc1xuICAgICAgICBpZiAodHlwZW9mIHZhbHVlWzBdID09PSAnbnVtYmVyJykge1xuICAgICAgICAgICAgLy8gZmxvYXQgdmVjdG9ycyAodmVjMiwgdmVjMywgdmVjNClcbiAgICAgICAgICAgIGlmICh2YWx1ZS5sZW5ndGggPj0gMiAmJiB2YWx1ZS5sZW5ndGggPD0gNCkge1xuICAgICAgICAgICAgICAgIHR5cGUgPSAndmVjJyArIHZhbHVlLmxlbmd0aDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIGZsb2F0IGFycmF5XG4gICAgICAgICAgICBlbHNlIHsgLy9pZiAodmFsdWUubGVuZ3RoID4gNCkge1xuICAgICAgICAgICAgICAgIHR5cGUgPSAnZmxvYXQnO1xuICAgICAgICAgICAgICAgIGFycmF5ID0gdmFsdWUubGVuZ3RoO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gVE9ETzogYXNzdW1lIG1hdHJpeCBmb3IgKHR5cGVvZiA9PSBGbG9hdDMyQXJyYXkgJiYgbGVuZ3RoID09IDE2KT9cbiAgICAgICAgfVxuICAgICAgICAvLyBBcnJheSBvZiB0ZXh0dXJlc1xuICAgICAgICBlbHNlIGlmICh0eXBlb2YgdmFsdWVbMF0gPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICB0eXBlID0gJ3NhbXBsZXIyRCc7XG4gICAgICAgICAgICBhcnJheSA9IHZhbHVlLmxlbmd0aDtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBCb29sZWFuXG4gICAgZWxzZSBpZiAodHlwZW9mIHZhbHVlID09PSAnYm9vbGVhbicpIHtcbiAgICAgICAgdHlwZSA9ICdib29sJztcbiAgICB9XG4gICAgLy8gVGV4dHVyZVxuICAgIGVsc2UgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgdHlwZSA9ICdzYW1wbGVyMkQnO1xuICAgIH1cblxuICAgIC8vIENvbnN0cnVjdCB2YXJpYWJsZSBkZWZpbml0aW9uXG4gICAgdmFyIHZhcmlhYmxlID0gJyc7XG4gICAgdmFyaWFibGUgKz0gYCR7dHlwZX0gJHtuYW1lfWA7XG4gICAgaWYgKGFycmF5KSB7XG4gICAgICAgIHZhcmlhYmxlICs9IGBbJHthcnJheX1dYDtcbiAgICB9XG4gICAgdmFyaWFibGUgKz0gJztcXG4nO1xuXG4gICAgcmV0dXJuIHZhcmlhYmxlO1xufTtcblxuLyoqXG4gICAgR2VuZXJhdGUgYSBHTFNMIHVuaWZvcm0gZGVmaW5pdGlvbiBmcm9tIGEgSlMgb2JqZWN0XG4qL1xuR0xTTC5kZWZpbmVVbmlmb3JtID0gZnVuY3Rpb24gKG5hbWUsIHZhbHVlKSB7XG4gICAgcmV0dXJuICd1bmlmb3JtICcgKyBHTFNMLmRlZmluZVZhcmlhYmxlKG5hbWUsIHZhbHVlKTtcbn07XG5cbi8qKlxuICAgIENoZWNrIGZvciBhIHVuaWZvcm0gZGVmaW5pdGlvbiBvZiAnbmFtZScgaW4gdGhlIHByb3ZpZGVkIEdMU0wgc291cmNlXG4gICAgU2ltcGxlIHJlZ2V4IGNoZWNrIGZvciAndW5pZm9ybScga2V5d29yZCBhbmQgdmFyIG5hbWUsIGRvZXMgbm90IGF0dGVtcHQgdG8gcGFyc2UvZXh0cmFjdCBHTFNMXG4gICAgTk9URTogYXNzdW1lcyBjb21tZW50cyBoYXZlIGJlZW4gc3RyaXBwZWQgZnJvbSBzb3VyY2VcbiovXG5HTFNMLmlzVW5pZm9ybURlZmluZWQgPSBmdW5jdGlvbiAobmFtZSwgc291cmNlKSB7XG4gICAgLy8gTWF0Y2gsIGluIG9yZGVyOlxuICAgIC8vIC0gdGhlIGtleXdvcmQgJ3VuaWZvcm0nXG4gICAgLy8gLSBhdCBsZWFzdCBvbmUgY2hhcmFjdGVyIHRoYXQgaXMgYW55dGhpbmcgZXhjZXB0IGEgc2VtaWNvbG9uLCA7XG4gICAgLy8gLSBvcHRpb25hbGx5LCBhbnl0aGluZyBlbmNsb3NlZCBpbiBjdXJseSBicmFjZXMsIHsgLi4uIH0gKGFuIGlubGluZSBzdHJ1Y3R1cmUgZGVmaW5pdGlvbiBjYW4gZ28gaGVyZSlcbiAgICAvLyAtIG9wdGlvbmFsbHksIGFueSAjIG9mIGNoYXJhY3RlcnMgdGhhdCBpcyBub3QgYSBzZW1pY29sb24sIDtcbiAgICAvLyAtIHRoZSBuYW1lIG9mIHRoZSB1bmlmb3JtXG5cbiAgICB2YXIgcmUgPSBuZXcgUmVnRXhwKCd1bmlmb3JtW147XSsoPzp7W1xcXFxzXFxcXFNdKn0pP1teO10qXFxcXGInICsgbmFtZSArICdcXFxcYicsICdnJyk7XG4gICAgaWYgKHNvdXJjZS5tYXRjaChyZSkpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbn07XG5cbi8qKlxuICAgIENoZWNrIHRoYXQgYSBzeW1ib2wgaXMgcmVmZXJlbmNlZCBpbiB0aGUgR0xTTCBzb3VyY2VcbiAgICBOT1RFOiBhc3N1bWVzIGNvbW1lbnRzIGhhdmUgYmVlbiBzdHJpcHBlZCBmcm9tIHNvdXJjZVxuKi9cbkdMU0wuaXNTeW1ib2xSZWZlcmVuY2VkID0gZnVuY3Rpb24gKG5hbWUsIHNvdXJjZSkge1xuICAgIHZhciByZSA9IG5ldyBSZWdFeHAoJ1xcXFxiJyArIG5hbWUgKyAnXFxcXGInLCAnZycpO1xuICAgIGlmIChzb3VyY2Uuc2VhcmNoKHJlKSA+PSAwKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG59O1xuXG4vKipcbiAgICBFeHBhbmQgYSBzaW5nbGUgdmFsdWUgb3IgMi1lbGVtZW50IGFycmF5IGludG8gYSAzLWVsZW1lbnQgYXJyYXksIHdpdGggdGhlIGxhc3QgKCB6IClcbiAgICBjb29yZGluYXRlIGRlZmF1bHRpbmcgdG8gMSAod2l0aCBvcHRpb24gdG8gc3BlY2lmeSkuIEFsc28gcnVucyBwYXJzZUZsb2F0IHRvIHRyeSB0byBtYWludGFpblxuICAgIGRhdGEgaW50ZWdyaXR5LiBSZXR1cm5zIG51bGwgaWYgaW5wdXQgY291bGRuJ3QgYmUgcGFyc2VkLlxuKi9cbkdMU0wuZXhwYW5kVmVjMyA9IGZ1bmN0aW9uICh2LCB6ID0gMSkge1xuICAgIGxldCB4O1xuICAgIGlmIChBcnJheS5pc0FycmF5KHYpKSB7XG4gICAgICAgIGlmICh2Lmxlbmd0aCA9PT0gMikge1xuICAgICAgICAgICAgeCA9IFsuLi52LCB6XS5tYXAocGFyc2VGbG9hdCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gdjtcbiAgICAgICAgfVxuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgeCA9IFt2LCB2LCB2XS5tYXAocGFyc2VGbG9hdCk7XG4gICAgfVxuXG4gICAgaWYgKHggJiYgeC5ldmVyeShuID0+IHR5cGVvZiBuID09PSAnbnVtYmVyJyAmJiAhaXNOYU4obikpKSB7XG4gICAgICAgIHJldHVybiB4O1xuICAgIH1cbn07XG5cbi8qKlxuICAgIEV4cGFuZCBhIHNpbmdsZSB2YWx1ZSBvciAzLWVsZW1lbnQgYXJyYXkgaW50byBhIDQtZWxlbWVudCBhcnJheSwgd2l0aCB0aGUgbGFzdCAoZS5nLiB3IG9yIGEpXG4gICAgY29vcmRpbmF0ZSBkZWZhdWx0aW5nIHRvIDEgKHdpdGggb3B0aW9uIHRvIHNwZWNpZnkpLiBBbHNvIHJ1bnMgcGFyc2VGbG9hdCB0byB0cnkgdG8gbWFpbnRhaW5cbiAgICBkYXRhIGludGVncml0eS4gUmV0dXJucyBudWxsIGlmIGlucHV0IGNvdWxkbid0IGJlIHBhcnNlZC5cbiovXG5HTFNMLmV4cGFuZFZlYzQgPSBmdW5jdGlvbiAodiwgdyA9IDEpIHtcbiAgICBsZXQgeDtcbiAgICBpZiAoQXJyYXkuaXNBcnJheSh2KSkge1xuICAgICAgICBpZiAodi5sZW5ndGggPT09IDMpIHtcbiAgICAgICAgICAgIHggPSBbLi4udiwgd10ubWFwKHBhcnNlRmxvYXQpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIHY7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHggPSBbdiwgdiwgdiwgd10ubWFwKHBhcnNlRmxvYXQpO1xuICAgIH1cblxuICAgIGlmICh4ICYmIHguZXZlcnkobiA9PiB0eXBlb2YgbiA9PT0gJ251bWJlcicgJiYgIWlzTmFOKG4pKSkge1xuICAgICAgICByZXR1cm4geDtcbiAgICB9XG59O1xuXG5cbiIsIlxuZXhwb3J0IGNsYXNzIFJlbmRlclN0YXRlIHtcblx0Y29uc3RydWN0b3IgKHZhbHVlLCBzZXR1cCkge1xuICAgICAgICBzZXR1cCh2YWx1ZSk7XG4gICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTtcbiAgICAgICAgdGhpcy5zZXR1cCA9IHNldHVwO1xuICAgIH1cblxuICAgIHNldCAodmFsdWUpIHtcbiAgICBcdC8vIGlmIHRoZSBzdGF0ZXMgYXJlIGRpZmZlcmVudCwgY2FsbCB0aGUgR0wgY29udGV4dCBmb3IgYSBzdGF0ZSBjaGFuZ2VcbiAgICBcdGlmIChKU09OLnN0cmluZ2lmeSh0aGlzLnZhbHVlKSAhPT0gSlNPTi5zdHJpbmdpZnkodmFsdWUpKSB7XG4gICAgXHRcdHRoaXMuc2V0dXAodmFsdWUpO1xuICAgIFx0XHR0aGlzLnZhbHVlID0gdmFsdWU7XG4gICAgXHR9XG4gICAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBSZW5kZXJTdGF0ZU1hbmFnZXIge1xuXG4gICAgY29uc3RydWN0b3IgKGdsKSB7XG4gICAgICAgIHRoaXMuZGVmYXVsdHMgPSB7fTtcblxuICAgICAgICAvLyBDdWxsaW5nXG4gICAgICAgIHRoaXMuZGVmYXVsdHMuY3VsbGluZyA9IHRydWU7XG4gICAgICAgIHRoaXMuZGVmYXVsdHMuY3VsbGluZ19mYWNlID0gZ2wuQkFDSztcblxuICAgICAgICAvLyBCbGVuZGluZ1xuICAgICAgICB0aGlzLmRlZmF1bHRzLmJsZW5kaW5nID0gZmFsc2U7XG4gICAgICAgIHRoaXMuZGVmYXVsdHMuYmxlbmRpbmdfc3JjID0gZ2wuT05FX01JTlVTX1NSQ19BTFBIQTtcbiAgICAgICAgdGhpcy5kZWZhdWx0cy5ibGVuZGluZ19kc3QgPSBnbC5PTkVfTUlOVVNfU1JDX0FMUEhBO1xuICAgICAgICB0aGlzLmRlZmF1bHRzLmJsZW5kaW5nX3NyY19hbHBoYSA9IGdsLk9ORTtcbiAgICAgICAgdGhpcy5kZWZhdWx0cy5ibGVuZGluZ19kc3RfYWxwaGEgPSBnbC5PTkVfTUlOVVNfU1JDX0FMUEhBO1xuXG4gICAgICAgIC8vIERlcHRoIHRlc3Qvd3JpdGVcbiAgICAgICAgdGhpcy5kZWZhdWx0cy5kZXB0aF93cml0ZSA9IHRydWU7XG4gICAgICAgIHRoaXMuZGVmYXVsdHMuZGVwdGhfdGVzdCA9IHRydWU7XG4gICAgICAgIGdsLmRlcHRoRnVuYyhnbC5MRVNTKTsgLy8gZGVwdGggZnVuY3Rpb24gb25seSBuZWVkcyB0byBiZSBzZXQgb25jZVxuXG4gICAgXHQvLyBDdWxsaW5nXG4gICAgICAgIHRoaXMuY3VsbGluZyA9IG5ldyBSZW5kZXJTdGF0ZShcbiAgICAgICAgICAgIHsgY3VsbDogdGhpcy5kZWZhdWx0cy5jdWxsaW5nLCBmYWNlOiB0aGlzLmRlZmF1bHRzLmN1bGxpbmdfZmFjZSB9LFxuICAgIFx0XHQodmFsdWUpID0+IHtcbiAgICBcdFx0XHRpZiAodmFsdWUuY3VsbCkge1xuICAgIFx0XHRcdFx0Z2wuZW5hYmxlKGdsLkNVTExfRkFDRSk7XG4gICAgICAgICAgICBcdFx0Z2wuY3VsbEZhY2UodmFsdWUuZmFjZSk7XG4gICAgXHRcdFx0fSBlbHNlIHtcbiAgICBcdFx0XHRcdGdsLmRpc2FibGUoZ2wuQ1VMTF9GQUNFKTtcbiAgICBcdFx0XHR9XG4gICAgXHRcdH1cbiAgICBcdCk7XG5cbiAgICBcdC8vIEJsZW5kaW5nIG1vZGVcbiAgICAgICAgdGhpcy5ibGVuZGluZyA9IG5ldyBSZW5kZXJTdGF0ZSh7XG4gICAgICAgICAgICAgICAgYmxlbmQ6IHRoaXMuZGVmYXVsdHMuYmxlbmRpbmcsXG4gICAgICAgICAgICAgICAgc3JjOiB0aGlzLmRlZmF1bHRzLmJsZW5kaW5nX3NyYyxcbiAgICAgICAgICAgICAgICBkc3Q6IHRoaXMuZGVmYXVsdHMuYmxlbmRpbmdfZHN0LFxuICAgICAgICAgICAgICAgIHNyY19hbHBoYTogdGhpcy5kZWZhdWx0cy5ibGVuZGluZ19zcmNfYWxwaGEsXG4gICAgICAgICAgICAgICAgZHN0X2FscGhhOiB0aGlzLmRlZmF1bHRzLmJsZW5kaW5nX2RzdF9hbHBoYVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICh2YWx1ZSkgPT4ge1xuICAgIFx0XHRcdGlmICh2YWx1ZS5ibGVuZCkge1xuICAgICAgICAgICAgXHRcdGdsLmVuYWJsZShnbC5CTEVORCk7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlLnNyY19hbHBoYSAmJiB2YWx1ZS5kc3RfYWxwaGEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGdsLmJsZW5kRnVuY1NlcGFyYXRlKHZhbHVlLnNyYywgdmFsdWUuZHN0LCB2YWx1ZS5zcmNfYWxwaGEsIHZhbHVlLmRzdF9hbHBoYSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBnbC5ibGVuZEZ1bmModmFsdWUuc3JjLCB2YWx1ZS5kc3QpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgXHRcdFx0fSBlbHNlIHtcbiAgICBcdFx0XHRcdGdsLmRpc2FibGUoZ2wuQkxFTkQpO1xuICAgIFx0XHRcdH1cbiAgICBcdFx0fVxuICAgIFx0KTtcblxuICAgIFx0Ly8gRGVwdGggd3JpdGVcbiAgICAgICAgdGhpcy5kZXB0aF93cml0ZSA9IG5ldyBSZW5kZXJTdGF0ZShcbiAgICAgICAgICAgIHsgZGVwdGhfd3JpdGU6IHRoaXMuZGVmYXVsdHMuZGVwdGhfd3JpdGUgfSxcbiAgICBcdFx0KHZhbHVlKSA9PiB7XG4gICAgICAgIFx0XHRnbC5kZXB0aE1hc2sodmFsdWUuZGVwdGhfd3JpdGUpO1xuICAgIFx0XHR9XG4gICAgXHQpO1xuXG4gICAgXHQvLyBEZXB0aCB0ZXN0XG4gICAgICAgIHRoaXMuZGVwdGhfdGVzdCA9IG5ldyBSZW5kZXJTdGF0ZShcbiAgICAgICAgICAgIHsgZGVwdGhfdGVzdDogdGhpcy5kZWZhdWx0cy5kZXB0aF90ZXN0IH0sXG4gICAgICAgICAgICAodmFsdWUpID0+IHtcbiAgICBcdFx0XHRpZiAodmFsdWUuZGVwdGhfdGVzdCkge1xuICAgICAgICAgICAgXHRcdGdsLmVuYWJsZShnbC5ERVBUSF9URVNUKTtcbiAgICBcdFx0XHR9IGVsc2Uge1xuICAgICAgICAgICAgXHRcdGdsLmRpc2FibGUoZ2wuREVQVEhfVEVTVCk7XG4gICAgXHRcdFx0fVxuICAgIFx0XHR9XG4gICAgXHQpO1xuXG4gICAgfVxuXG59XG4iLCIvLyBHTCBwcm9ncmFtIHdyYXBwZXIgdG8gY2FjaGUgdW5pZm9ybSBsb2NhdGlvbnMvdmFsdWVzLCBkbyBjb21waWxlLXRpbWUgcHJlLXByb2Nlc3Npbmdcbi8vIChpbmplY3RpbmcgI2RlZmluZXMgYW5kICNwcmFnbWEgYmxvY2tzIGludG8gc2hhZGVycyksIGV0Yy5cblxuaW1wb3J0IGxvZyBmcm9tICcuLi91dGlscy9sb2cnO1xuaW1wb3J0IEdMU0wgZnJvbSAnLi9nbHNsJztcbmltcG9ydCBUZXh0dXJlIGZyb20gJy4vdGV4dHVyZSc7XG5pbXBvcnQgZ2V0RXh0ZW5zaW9uIGZyb20gJy4vZXh0ZW5zaW9ucyc7XG5cbmltcG9ydCBzdHJpcCBmcm9tICdzdHJpcC1jb21tZW50cyc7XG5pbXBvcnQgeyBkZWZhdWx0IGFzIHBhcnNlU2hhZGVyRXJyb3JzIH0gZnJvbSAnZ2wtc2hhZGVyLWVycm9ycyc7XG5cbi8vIFJlZ2V4IHBhdHRlcm5zXG5jb25zdCByZV9wcmFnbWEgPSAvXlxccyojcHJhZ21hLiokL2dtOyAgIC8vIGZvciByZW1vdmluZyB1bnVzZWQgcHJhZ21hcyBhZnRlciBzaGFkZXIgYmxvY2sgaW5qZWN0aW9uXG5jb25zdCByZV9jb250aW51ZV9saW5lID0gL1xcXFxcXHMqXFxuL21nOyAgIC8vIGZvciByZW1vdmluZyBiYWNrc2xhc2ggbGluZSBjb250aW51YXRpb25zXG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFNoYWRlclByb2dyYW0ge1xuXG4gICAgY29uc3RydWN0b3IoZ2wsIHZlcnRleF9zb3VyY2UsIGZyYWdtZW50X3NvdXJjZSwgb3B0aW9ucykge1xuICAgICAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcblxuICAgICAgICB0aGlzLmdsID0gZ2w7XG4gICAgICAgIHRoaXMucHJvZ3JhbSA9IG51bGw7XG4gICAgICAgIHRoaXMuY29tcGlsZWQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5jb21waWxpbmcgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5lcnJvciA9IG51bGw7XG5cbiAgICAgICAgLy8ga2V5L3ZhbHVlcyBpbnNlcnRlZCBhcyAjZGVmaW5lcyBpbnRvIHNoYWRlcnMgYXQgY29tcGlsZS10aW1lXG4gICAgICAgIHRoaXMuZGVmaW5lcyA9IE9iamVjdC5hc3NpZ24oe30sIG9wdGlvbnMuZGVmaW5lc3x8e30pO1xuXG4gICAgICAgIC8vIGtleS92YWx1ZXMgZm9yIGJsb2NrcyB0aGF0IGNhbiBiZSBpbmplY3RlZCBpbnRvIHNoYWRlcnMgYXQgY29tcGlsZS10aW1lXG4gICAgICAgIHRoaXMuYmxvY2tzID0gT2JqZWN0LmFzc2lnbih7fSwgb3B0aW9ucy5ibG9ja3N8fHt9KTtcbiAgICAgICAgdGhpcy5ibG9ja19zY29wZXMgPSBPYmplY3QuYXNzaWduKHt9LCBvcHRpb25zLmJsb2NrX3Njb3Blc3x8e30pO1xuXG4gICAgICAgIC8vIGxpc3Qgb2YgZXh0ZW5zaW9ucyB0byBhY3RpdmF0ZVxuICAgICAgICB0aGlzLmV4dGVuc2lvbnMgPSBvcHRpb25zLmV4dGVuc2lvbnMgfHwgW107XG5cbiAgICAgICAgLy8gSlMtb2JqZWN0IHVuaWZvcm1zIHRoYXQgYXJlIGV4cGVjdGVkIGJ5IHRoaXMgcHJvZ3JhbVxuICAgICAgICAvLyBJZiB0aGV5IGFyZSBub3QgZm91bmQgaW4gdGhlIGV4aXN0aW5nIHNoYWRlciBzb3VyY2UsIHRoZWlyIHR5cGVzIHdpbGwgYmUgaW5mZXJyZWQgYW5kIGRlZmluaXRpb25zXG4gICAgICAgIC8vIGZvciBlYWNoIHdpbGwgYmUgaW5qZWN0ZWQuXG4gICAgICAgIHRoaXMuZGVwZW5kZW50X3VuaWZvcm1zID0gb3B0aW9ucy51bmlmb3JtcztcblxuICAgICAgICB0aGlzLnVuaWZvcm1zID0ge307IC8vIHByb2dyYW0gbG9jYXRpb25zIG9mIHVuaWZvcm1zLCBsYXppbHkgYWRkZWQgYXMgZWFjaCB1bmlmb3JtIGlzIHNldFxuICAgICAgICB0aGlzLmF0dHJpYnMgPSB7fTsgLy8gcHJvZ3JhbSBsb2NhdGlvbnMgb2YgdmVydGV4IGF0dHJpYnV0ZXMsIGxhemlseSBhZGRlZCBhcyBlYWNoIGF0dHJpYnV0ZSBpcyBhY2Nlc3NlZFxuXG4gICAgICAgIHRoaXMudmVydGV4X3NvdXJjZSA9IHZlcnRleF9zb3VyY2U7XG4gICAgICAgIHRoaXMuZnJhZ21lbnRfc291cmNlID0gZnJhZ21lbnRfc291cmNlO1xuXG4gICAgICAgIHRoaXMuaWQgPSBTaGFkZXJQcm9ncmFtLmlkKys7XG4gICAgICAgIHRoaXMubmFtZSA9IG9wdGlvbnMubmFtZTsgLy8gY2FuIHByb3ZpZGUgYSBwcm9ncmFtIG5hbWUgKHVzZWZ1bCBmb3IgZGVidWdnaW5nKVxuICAgIH1cblxuICAgIGRlc3Ryb3koKSB7XG4gICAgICAgIHRoaXMuZ2wudXNlUHJvZ3JhbShudWxsKTtcbiAgICAgICAgdGhpcy5nbC5kZWxldGVQcm9ncmFtKHRoaXMucHJvZ3JhbSk7XG4gICAgICAgIHRoaXMucHJvZ3JhbSA9IG51bGw7XG4gICAgICAgIHRoaXMudW5pZm9ybXMgPSB7fTtcbiAgICAgICAgdGhpcy5hdHRyaWJzID0ge307XG4gICAgICAgIHRoaXMuY29tcGlsZWQgPSBmYWxzZTtcbiAgICB9XG5cbiAgICAvLyBVc2UgcHJvZ3JhbSB3cmFwcGVyIHdpdGggc2ltcGxlIHN0YXRlIGNhY2hlXG4gICAgdXNlKCkge1xuICAgICAgICBpZiAoIXRoaXMuY29tcGlsZWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChTaGFkZXJQcm9ncmFtLmN1cnJlbnQgIT09IHRoaXMpIHtcbiAgICAgICAgICAgIHRoaXMuZ2wudXNlUHJvZ3JhbSh0aGlzLnByb2dyYW0pO1xuICAgICAgICB9XG4gICAgICAgIFNoYWRlclByb2dyYW0uY3VycmVudCA9IHRoaXM7XG4gICAgfVxuXG4gICAgY29tcGlsZSgpIHtcbiAgICAgICAgaWYgKHRoaXMuY29tcGlsaW5nKSB7XG4gICAgICAgICAgICB0aHJvdyhuZXcgRXJyb3IoYFNoYWRlclByb2dyYW0uY29tcGlsZSgpOiBza2lwcGluZyBmb3IgJHt0aGlzLmlkfSAoJHt0aGlzLm5hbWV9KSBiZWNhdXNlIGFscmVhZHkgY29tcGlsaW5nYCkpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuY29tcGlsaW5nID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5jb21waWxlZCA9IGZhbHNlO1xuICAgICAgICB0aGlzLmVycm9yID0gbnVsbDtcblxuICAgICAgICAvLyBDb3B5IHNvdXJjZXMgZnJvbSBwcmUtbW9kaWZpZWQgdGVtcGxhdGVcbiAgICAgICAgdGhpcy5jb21wdXRlZF92ZXJ0ZXhfc291cmNlID0gdGhpcy52ZXJ0ZXhfc291cmNlO1xuICAgICAgICB0aGlzLmNvbXB1dGVkX2ZyYWdtZW50X3NvdXJjZSA9IHRoaXMuZnJhZ21lbnRfc291cmNlO1xuXG4gICAgICAgIC8vIENoZWNrIGZvciBleHRlbnNpb24gYXZhaWxhYmlsaXR5XG4gICAgICAgIGxldCBleHRlbnNpb25zID0gdGhpcy5jaGVja0V4dGVuc2lvbnMoKTtcblxuICAgICAgICAvLyBNYWtlIGxpc3Qgb2YgZGVmaW5lcyB0byBiZSBpbmplY3RlZCBsYXRlclxuICAgICAgICB2YXIgZGVmaW5lcyA9IHRoaXMuYnVpbGREZWZpbmVMaXN0KCk7XG5cbiAgICAgICAgLy8gSW5qZWN0IHVzZXItZGVmaW5lZCBibG9ja3MgKGFyYml0cmFyeSBjb2RlIHBvaW50cyBtYXRjaGluZyBuYW1lZCAjcHJhZ21hcylcbiAgICAgICAgLy8gUmVwbGFjZSBhY2NvcmRpbmcgdG8gdGhpcyBwYXR0ZXJuOlxuICAgICAgICAvLyAjcHJhZ21hIHRhbmdyYW06IFtrZXldXG4gICAgICAgIC8vIGUuZy4gI3ByYWdtYSB0YW5ncmFtOiBnbG9iYWxcblxuICAgICAgICAvLyBHYXRoZXIgYWxsIGJsb2NrIGNvZGUgc25pcHBldHNcbiAgICAgICAgdmFyIGJsb2NrcyA9IHRoaXMuYnVpbGRTaGFkZXJCbG9ja0xpc3QoKTtcbiAgICAgICAgdmFyIHJlZ2V4cDtcblxuICAgICAgICBmb3IgKHZhciBrZXkgaW4gYmxvY2tzKSB7XG4gICAgICAgICAgICB2YXIgYmxvY2sgPSBibG9ja3Nba2V5XTtcbiAgICAgICAgICAgIGlmICghYmxvY2sgfHwgKEFycmF5LmlzQXJyYXkoYmxvY2spICYmIGJsb2NrLmxlbmd0aCA9PT0gMCkpIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gRmlyc3QgZmluZCBjb2RlIHJlcGxhY2UgcG9pbnRzIGluIHNoYWRlcnNcbiAgICAgICAgICAgIHJlZ2V4cCA9IG5ldyBSZWdFeHAoJ15cXFxccyojcHJhZ21hXFxcXHMrdGFuZ3JhbTpcXFxccysnICsga2V5ICsgJ1xcXFxzKiQnLCAnbScpO1xuICAgICAgICAgICAgdmFyIGluamVjdF92ZXJ0ZXggPSB0aGlzLmNvbXB1dGVkX3ZlcnRleF9zb3VyY2UubWF0Y2gocmVnZXhwKTtcbiAgICAgICAgICAgIHZhciBpbmplY3RfZnJhZ21lbnQgPSB0aGlzLmNvbXB1dGVkX2ZyYWdtZW50X3NvdXJjZS5tYXRjaChyZWdleHApO1xuXG4gICAgICAgICAgICAvLyBBdm9pZCBuZXR3b3JrIHJlcXVlc3QgaWYgbm90aGluZyB0byByZXBsYWNlXG4gICAgICAgICAgICBpZiAoaW5qZWN0X3ZlcnRleCA9PSBudWxsICYmIGluamVjdF9mcmFnbWVudCA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIENvbWJpbmUgYWxsIGJsb2NrcyBpbnRvIG9uZSBzdHJpbmdcbiAgICAgICAgICAgIHZhciBzb3VyY2UgPSAnJztcbiAgICAgICAgICAgIGJsb2NrLmZvckVhY2godmFsID0+IHtcbiAgICAgICAgICAgICAgICAvLyBNYXJrIHN0YXJ0IGFuZCBlbmQgb2YgZWFjaCBibG9jayB3aXRoIG1ldGFkYXRhICh3aGljaCBjYW4gYmUgZXh0cmFjdGVkIGZyb21cbiAgICAgICAgICAgICAgICAvLyBmaW5hbCBzb3VyY2UgZm9yIGVycm9yIGhhbmRsaW5nLCBkZWJ1Z2dpbmcsIGV0Yy4pXG4gICAgICAgICAgICAgICAgbGV0IG1hcmsgPSBgJHt2YWwuc2NvcGV9LCAke3ZhbC5rZXl9LCAke3ZhbC5udW19YDtcbiAgICAgICAgICAgICAgICBzb3VyY2UgKz0gYFxcbi8vIHRhbmdyYW0tYmxvY2stc3RhcnQ6ICR7bWFya31cXG5gO1xuICAgICAgICAgICAgICAgIHNvdXJjZSArPSB2YWwuc291cmNlO1xuICAgICAgICAgICAgICAgIHNvdXJjZSArPSBgXFxuLy8gdGFuZ3JhbS1ibG9jay1lbmQ6ICR7bWFya31cXG5gO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIC8vIEluamVjdFxuICAgICAgICAgICAgaWYgKGluamVjdF92ZXJ0ZXggIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHRoaXMuY29tcHV0ZWRfdmVydGV4X3NvdXJjZSA9IHRoaXMuY29tcHV0ZWRfdmVydGV4X3NvdXJjZS5yZXBsYWNlKHJlZ2V4cCwgc291cmNlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChpbmplY3RfZnJhZ21lbnQgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHRoaXMuY29tcHV0ZWRfZnJhZ21lbnRfc291cmNlID0gdGhpcy5jb21wdXRlZF9mcmFnbWVudF9zb3VyY2UucmVwbGFjZShyZWdleHAsIHNvdXJjZSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIEFkZCBhICNkZWZpbmUgZm9yIHRoaXMgaW5qZWN0aW9uIHBvaW50XG4gICAgICAgICAgICBkZWZpbmVzWydUQU5HUkFNX0JMT0NLXycgKyBrZXkucmVwbGFjZSgvW1xccy1dKy9nLCAnXycpLnRvVXBwZXJDYXNlKCldID0gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENsZWFuLXVwIGFueSAjcHJhZ21hcyB0aGF0IHdlcmVuJ3QgcmVwbGFjZWQgKHRvIHByZXZlbnQgY29tcGlsZXIgd2FybmluZ3MpXG4gICAgICAgIHRoaXMuY29tcHV0ZWRfdmVydGV4X3NvdXJjZSA9IHRoaXMuY29tcHV0ZWRfdmVydGV4X3NvdXJjZS5yZXBsYWNlKHJlX3ByYWdtYSwgJycpO1xuICAgICAgICB0aGlzLmNvbXB1dGVkX2ZyYWdtZW50X3NvdXJjZSA9IHRoaXMuY29tcHV0ZWRfZnJhZ21lbnRfc291cmNlLnJlcGxhY2UocmVfcHJhZ21hLCAnJyk7XG5cbiAgICAgICAgLy8gRGV0ZWN0IHVuaWZvcm0gZGVmaW5pdGlvbnMsIGluamVjdCBhbnkgbWlzc2luZyBvbmVzXG4gICAgICAgIHRoaXMuZW5zdXJlVW5pZm9ybXModGhpcy5kZXBlbmRlbnRfdW5pZm9ybXMpO1xuXG4gICAgICAgIC8vIEJ1aWxkICYgaW5qZWN0IGV4dGVuc2lvbnMgJiBkZWZpbmVzXG4gICAgICAgIC8vIFRoaXMgaXMgZG9uZSAqYWZ0ZXIqIGNvZGUgaW5qZWN0aW9uIHNvIHRoYXQgd2UgY2FuIGFkZCBkZWZpbmVzIGZvciB3aGljaCBjb2RlIHBvaW50cyB3ZXJlIGluamVjdGVkXG4gICAgICAgIGxldCBwcmVjaXNpb24gPSAnJztcbiAgICAgICAgbGV0IGhpZ2ggPSB0aGlzLmdsLmdldFNoYWRlclByZWNpc2lvbkZvcm1hdCh0aGlzLmdsLkZSQUdNRU5UX1NIQURFUiwgdGhpcy5nbC5ISUdIX0ZMT0FUKTtcbiAgICAgICAgaWYgKGhpZ2ggJiYgaGlnaC5wcmVjaXNpb24gPiAwKSB7XG4gICAgICAgICAgICBwcmVjaXNpb24gPSAncHJlY2lzaW9uIGhpZ2hwIGZsb2F0O1xcbic7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBwcmVjaXNpb24gPSAncHJlY2lzaW9uIG1lZGl1bXAgZmxvYXQ7XFxuJztcbiAgICAgICAgfVxuXG4gICAgICAgIGRlZmluZXNbJ1RBTkdSQU1fVkVSVEVYX1NIQURFUiddID0gdHJ1ZTtcbiAgICAgICAgZGVmaW5lc1snVEFOR1JBTV9GUkFHTUVOVF9TSEFERVInXSA9IGZhbHNlO1xuICAgICAgICB0aGlzLmNvbXB1dGVkX3ZlcnRleF9zb3VyY2UgPVxuICAgICAgICAgICAgcHJlY2lzaW9uICtcbiAgICAgICAgICAgIFNoYWRlclByb2dyYW0uYnVpbGREZWZpbmVTdHJpbmcoZGVmaW5lcykgK1xuICAgICAgICAgICAgdGhpcy5jb21wdXRlZF92ZXJ0ZXhfc291cmNlO1xuXG4gICAgICAgIC8vIFByZWNpc2lvbiBxdWFsaWZpZXIgb25seSB2YWxpZCBpbiBmcmFnbWVudCBzaGFkZXJcbiAgICAgICAgLy8gTkI6ICcjZXh0ZW5zaW9uJyBzdGF0ZW1lbnRzIGFkZGVkIHRvIGZyYWdtZW50IHNoYWRlciBvbmx5LCBhcyBJRTExIHRocm93cyBlcnJvciB3aGVuIHRoZXkgYXBwZWFyIGluXG4gICAgICAgIC8vIHZlcnRleCBzaGFkZXIgKGV2ZW4gd2hlbiBndWFyZGVkIGJ5ICNpZmRlZiksIGFuZCBubyBXZWJHTCBleHRlbnNpb25zIHJlcXVpcmUgJyNleHRlbnNpb24nIGluIHZlcnRleCBzaGFkZXJzXG4gICAgICAgIGRlZmluZXNbJ1RBTkdSQU1fVkVSVEVYX1NIQURFUiddID0gZmFsc2U7XG4gICAgICAgIGRlZmluZXNbJ1RBTkdSQU1fRlJBR01FTlRfU0hBREVSJ10gPSB0cnVlO1xuICAgICAgICB0aGlzLmNvbXB1dGVkX2ZyYWdtZW50X3NvdXJjZSA9XG4gICAgICAgICAgICBTaGFkZXJQcm9ncmFtLmJ1aWxkRXh0ZW5zaW9uU3RyaW5nKGV4dGVuc2lvbnMpICtcbiAgICAgICAgICAgIHByZWNpc2lvbiArXG4gICAgICAgICAgICBTaGFkZXJQcm9ncmFtLmJ1aWxkRGVmaW5lU3RyaW5nKGRlZmluZXMpICtcbiAgICAgICAgICAgIHRoaXMuY29tcHV0ZWRfZnJhZ21lbnRfc291cmNlO1xuXG4gICAgICAgIC8vIFJlcGxhY2UgbXVsdGktbGluZSBiYWNrc2xhc2hlc1xuICAgICAgICB0aGlzLmNvbXB1dGVkX3ZlcnRleF9zb3VyY2UgPSB0aGlzLmNvbXB1dGVkX3ZlcnRleF9zb3VyY2UucmVwbGFjZShyZV9jb250aW51ZV9saW5lLCAnJyk7XG4gICAgICAgIHRoaXMuY29tcHV0ZWRfZnJhZ21lbnRfc291cmNlID0gdGhpcy5jb21wdXRlZF9mcmFnbWVudF9zb3VyY2UucmVwbGFjZShyZV9jb250aW51ZV9saW5lLCAnJyk7XG5cbiAgICAgICAgLy8gQ29tcGlsZSAmIHNldCB1bmlmb3JtcyB0byBjYWNoZWQgdmFsdWVzXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICB0aGlzLnByb2dyYW0gPSBTaGFkZXJQcm9ncmFtLnVwZGF0ZVByb2dyYW0odGhpcy5nbCwgdGhpcy5wcm9ncmFtLCB0aGlzLmNvbXB1dGVkX3ZlcnRleF9zb3VyY2UsIHRoaXMuY29tcHV0ZWRfZnJhZ21lbnRfc291cmNlKTtcbiAgICAgICAgICAgIHRoaXMuY29tcGlsZWQgPSB0cnVlO1xuICAgICAgICAgICAgdGhpcy5jb21waWxpbmcgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaChlcnJvcikge1xuICAgICAgICAgICAgdGhpcy5wcm9ncmFtID0gbnVsbDtcbiAgICAgICAgICAgIHRoaXMuY29tcGlsZWQgPSBmYWxzZTtcbiAgICAgICAgICAgIHRoaXMuY29tcGlsaW5nID0gZmFsc2U7XG4gICAgICAgICAgICB0aGlzLmVycm9yID0gZXJyb3I7XG5cbiAgICAgICAgICAgIC8vIHNoYWRlciBlcnJvciBpbmZvXG4gICAgICAgICAgICBpZiAoZXJyb3IudHlwZSA9PT0gJ3ZlcnRleCcgfHwgZXJyb3IudHlwZSA9PT0gJ2ZyYWdtZW50Jykge1xuICAgICAgICAgICAgICAgIHRoaXMuc2hhZGVyX2Vycm9ycyA9IGVycm9yLmVycm9ycztcbiAgICAgICAgICAgICAgICB0aGlzLnNoYWRlcl9lcnJvcnMuZm9yRWFjaChlID0+IHtcbiAgICAgICAgICAgICAgICAgICAgZS50eXBlID0gZXJyb3IudHlwZTtcbiAgICAgICAgICAgICAgICAgICAgZS5ibG9jayA9IHRoaXMuYmxvY2soZXJyb3IudHlwZSwgZS5saW5lKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhyb3cobmV3IEVycm9yKGBTaGFkZXJQcm9ncmFtLmNvbXBpbGUoKTogcHJvZ3JhbSAke3RoaXMuaWR9ICgke3RoaXMubmFtZX0pIGVycm9yOmAsIGVycm9yKSk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnVzZSgpO1xuICAgICAgICB0aGlzLnJlZnJlc2hVbmlmb3JtcygpO1xuICAgICAgICB0aGlzLnJlZnJlc2hBdHRyaWJ1dGVzKCk7XG4gICAgfVxuXG4gICAgLy8gTWFrZSBsaXN0IG9mIGRlZmluZXMgKGdsb2JhbCwgdGhlbiBwcm9ncmFtLXNwZWNpZmljKVxuICAgIGJ1aWxkRGVmaW5lTGlzdCgpIHtcbiAgICAgICAgdmFyIGQsIGRlZmluZXMgPSB7fTtcbiAgICAgICAgZm9yIChkIGluIFNoYWRlclByb2dyYW0uZGVmaW5lcykge1xuICAgICAgICAgICAgZGVmaW5lc1tkXSA9IFNoYWRlclByb2dyYW0uZGVmaW5lc1tkXTtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGQgaW4gdGhpcy5kZWZpbmVzKSB7XG4gICAgICAgICAgICBkZWZpbmVzW2RdID0gdGhpcy5kZWZpbmVzW2RdO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBkZWZpbmVzO1xuICAgIH1cblxuICAgIC8vIE1ha2UgbGlzdCBvZiBzaGFkZXIgYmxvY2tzIChnbG9iYWwsIHRoZW4gcHJvZ3JhbS1zcGVjaWZpYylcbiAgICBidWlsZFNoYWRlckJsb2NrTGlzdCgpIHtcbiAgICAgICAgbGV0IGtleSwgYmxvY2tzID0ge307XG5cbiAgICAgICAgLy8gR2xvYmFsIGJsb2Nrc1xuICAgICAgICBmb3IgKGtleSBpbiBTaGFkZXJQcm9ncmFtLmJsb2Nrcykge1xuICAgICAgICAgICAgYmxvY2tzW2tleV0gPSBbXTtcblxuICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoU2hhZGVyUHJvZ3JhbS5ibG9ja3Nba2V5XSkpIHtcbiAgICAgICAgICAgICAgICBibG9ja3Nba2V5XS5wdXNoKFxuICAgICAgICAgICAgICAgICAgICAuLi5TaGFkZXJQcm9ncmFtLmJsb2Nrc1trZXldLm1hcCgoc291cmNlLCBudW0pID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7IGtleSwgc291cmNlLCBudW0sIHNjb3BlOiAnU2hhZGVyUHJvZ3JhbScgfTtcbiAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgYmxvY2tzW2tleV0gPSBbeyBrZXksIHNvdXJjZTogU2hhZGVyUHJvZ3JhbS5ibG9ja3Nba2V5XSwgbnVtOiAwLCBzY29wZTogJ1NoYWRlclByb2dyYW0nIH1dO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gUHJvZ3JhbS1zcGVjaWZpYyBibG9ja3NcbiAgICAgICAgZm9yIChrZXkgaW4gdGhpcy5ibG9ja3MpIHtcbiAgICAgICAgICAgIGJsb2Nrc1trZXldID0gYmxvY2tzW2tleV0gfHwgW107XG5cbiAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KHRoaXMuYmxvY2tzW2tleV0pKSB7XG4gICAgICAgICAgICAgICAgbGV0IHNjb3BlcyA9ICh0aGlzLmJsb2NrX3Njb3BlcyAmJiB0aGlzLmJsb2NrX3Njb3Blc1trZXldKSB8fCBbXTtcbiAgICAgICAgICAgICAgICBsZXQgY3VyX3Njb3BlID0gbnVsbCwgbnVtID0gMDtcblxuICAgICAgICAgICAgICAgIGZvciAobGV0IGI9MDsgYiA8IHRoaXMuYmxvY2tzW2tleV0ubGVuZ3RoOyBiKyspIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gQ291bnQgYmxvY2tzIHJlbGF0aXZlIHRvIGN1cnJlbnQgc2NvcGVcbiAgICAgICAgICAgICAgICAgICAgaWYgKHNjb3Blc1tiXSAhPT0gY3VyX3Njb3BlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjdXJfc2NvcGUgPSBzY29wZXNbYl07XG4gICAgICAgICAgICAgICAgICAgICAgICBudW0gPSAwO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgYmxvY2tzW2tleV0ucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgICAgICBrZXksXG4gICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2U6IHRoaXMuYmxvY2tzW2tleV1bYl0sXG4gICAgICAgICAgICAgICAgICAgICAgICBudW0sXG4gICAgICAgICAgICAgICAgICAgICAgICBzY29wZTogY3VyX3Njb3BlIHx8IHRoaXMubmFtZVxuICAgICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgICAgICBudW0rKztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBUT0RPOiBhZGRyZXNzIGRpc2NyZXBhbmN5IGluIGFycmF5IHZzLiBzaW5nbGUtdmFsdWUgYmxvY2tzXG4gICAgICAgICAgICAgICAgLy8gc3R5bGVzIGFzc3VtZSBhcnJheSB3aGVuIHRyYWNraW5nIGJsb2NrIHNjb3Blc1xuICAgICAgICAgICAgICAgIGJsb2Nrc1trZXldLnB1c2goeyBrZXksIHNvdXJjZTogdGhpcy5ibG9ja3Nba2V5XSwgbnVtOiAwLCBzY29wZTogdGhpcy5uYW1lIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBibG9ja3M7XG4gICAgfVxuXG4gICAgLy8gRGV0ZWN0IHVuaWZvcm0gZGVmaW5pdGlvbnMsIGluamVjdCBhbnkgbWlzc2luZyBvbmVzXG4gICAgZW5zdXJlVW5pZm9ybXModW5pZm9ybXMpIHtcbiAgICAgICAgaWYgKCF1bmlmb3Jtcykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIHZzID0gc3RyaXAodGhpcy5jb21wdXRlZF92ZXJ0ZXhfc291cmNlKTtcbiAgICAgICAgdmFyIGZzID0gc3RyaXAodGhpcy5jb21wdXRlZF9mcmFnbWVudF9zb3VyY2UpO1xuICAgICAgICB2YXIgaW5qZWN0LCB2c19pbmplY3Rpb25zID0gW10sIGZzX2luamVjdGlvbnMgPSBbXTtcblxuICAgICAgICAvLyBDaGVjayBmb3IgbWlzc2luZyB1bmlmb3JtIGRlZmluaXRpb25zXG4gICAgICAgIGZvciAodmFyIG5hbWUgaW4gdW5pZm9ybXMpIHtcbiAgICAgICAgICAgIGluamVjdCA9IG51bGw7XG5cbiAgICAgICAgICAgIC8vIENoZWNrIHZlcnRleCBzaGFkZXJcbiAgICAgICAgICAgIGlmICghR0xTTC5pc1VuaWZvcm1EZWZpbmVkKG5hbWUsIHZzKSkge1xuICAgICAgICAgICAgICAgIGlmICghaW5qZWN0KSB7XG4gICAgICAgICAgICAgICAgICAgIGluamVjdCA9IEdMU0wuZGVmaW5lVW5pZm9ybShuYW1lLCB1bmlmb3Jtc1tuYW1lXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGxvZygndHJhY2UnLCBgUHJvZ3JhbSAke3RoaXMubmFtZX06ICR7bmFtZX0gbm90IGRlZmluZWQgaW4gdmVydGV4IHNoYWRlciwgaW5qZWN0aW5nOiAnJHtpbmplY3R9J2ApO1xuICAgICAgICAgICAgICAgIHZzX2luamVjdGlvbnMucHVzaChpbmplY3QpO1xuXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBDaGVjayBmcmFnbWVudCBzaGFkZXJcbiAgICAgICAgICAgIGlmICghR0xTTC5pc1VuaWZvcm1EZWZpbmVkKG5hbWUsIGZzKSkge1xuICAgICAgICAgICAgICAgIGlmICghaW5qZWN0KSB7XG4gICAgICAgICAgICAgICAgICAgIGluamVjdCA9IEdMU0wuZGVmaW5lVW5pZm9ybShuYW1lLCB1bmlmb3Jtc1tuYW1lXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGxvZygndHJhY2UnLCBgUHJvZ3JhbSAke3RoaXMubmFtZX06ICR7bmFtZX0gbm90IGRlZmluZWQgaW4gZnJhZ21lbnQgc2hhZGVyLCBpbmplY3Rpbmc6ICcke2luamVjdH0nYCk7XG4gICAgICAgICAgICAgICAgZnNfaW5qZWN0aW9ucy5wdXNoKGluamVjdCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBJbmplY3QgbWlzc2luZyB1bmlmb3Jtc1xuICAgICAgICAvLyBOT1RFOiB0aGVzZSBhcmUgaW5qZWN0ZWQgYXQgdGhlIHZlcnkgdG9wIG9mIHRoZSBzaGFkZXJzLCBldmVuIGJlZm9yZSBhbnkgI2RlZmluZXMgb3IgI3ByYWdtYXMgYXJlIGFkZGVkXG4gICAgICAgIC8vIHRoaXMgY291bGQgY2F1c2Ugc29tZSBpc3N1ZXMgd2l0aCBjZXJ0YWluICNwcmFnbWFzLCBvciBvdGhlciBmdW5jdGlvbnMgdGhhdCBtaWdodCBleHBlY3QgI2RlZmluZXNcbiAgICAgICAgaWYgKHZzX2luamVjdGlvbnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgdGhpcy5jb21wdXRlZF92ZXJ0ZXhfc291cmNlID0gdnNfaW5qZWN0aW9ucy5qb2luKCdcXG4nKSArIHRoaXMuY29tcHV0ZWRfdmVydGV4X3NvdXJjZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChmc19pbmplY3Rpb25zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHRoaXMuY29tcHV0ZWRfZnJhZ21lbnRfc291cmNlID0gZnNfaW5qZWN0aW9ucy5qb2luKCdcXG4nKSArIHRoaXMuY29tcHV0ZWRfZnJhZ21lbnRfc291cmNlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gU2V0IHVuaWZvcm1zIGZyb20gYSBKUyBvYmplY3QsIHdpdGggaW5mZXJyZWQgdHlwZXNcbiAgICBzZXRVbmlmb3Jtcyh1bmlmb3JtcywgcmVzZXRfdGV4dHVyZV91bml0ID0gdHJ1ZSkge1xuICAgICAgICBpZiAoIXRoaXMuY29tcGlsZWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFRPRE86IG9ubHkgdXBkYXRlIHVuaWZvcm1zIHdoZW4gY2hhbmdlZFxuXG4gICAgICAgIC8vIFRleHR1cmUgdW5pdHMgbXVzdCBiZSB0cmFja2VkIGFuZCBpbmNyZW1lbnRlZCBlYWNoIHRpbWUgYSB0ZXh0dXJlIHNhbXBsZXIgdW5pZm9ybSBpcyBzZXQuXG4gICAgICAgIC8vIEJ5IGRlZmF1bHQsIHRoZSB0ZXh0dXJlIHVuaXQgaXMgcmVzZXQgdG8gMCBlYWNoIHRpbWUgc2V0VW5pZm9ybXMgaXMgY2FsbGVkLCBidXQgdGhleSBjYW5cbiAgICAgICAgLy8gYWxzbyBiZSBwcmVzZXJ2ZWQsIGZvciBleGFtcGxlIGluIGNhc2VzIHdoZXJlIG11bHRpcGxlIGNhbGxzIHRvIHNldFVuaWZvcm1zIGFyZSBleHBlY3RlZFxuICAgICAgICAvLyAoZS5nLiBwcm9ncmFtLXNwZWNpZmljIHVuaWZvcm1zIGZvbGxvd2VkIGJ5IG1lc2gtc3BlY2lmaWMgb25lcykuXG4gICAgICAgIGlmIChyZXNldF90ZXh0dXJlX3VuaXQpIHtcbiAgICAgICAgICAgIHRoaXMudGV4dHVyZV91bml0ID0gMDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFBhcnNlIHVuaWZvcm0gdHlwZXMgYW5kIHZhbHVlcyBmcm9tIHRoZSBKUyBvYmplY3RcbiAgICAgICAgY29uc3QgcGFyc2VkID0gR0xTTC5wYXJzZVVuaWZvcm1zKHVuaWZvcm1zKTtcblxuICAgICAgICAvLyBTZXQgZWFjaCB1bmlmb3JtXG4gICAgICAgIGZvciAobGV0IHU9MDsgdSA8IHBhcnNlZC5sZW5ndGg7IHUrKykge1xuICAgICAgICAgICAgY29uc3QgdW5pZm9ybSA9IHBhcnNlZFt1XTtcbiAgICAgICAgICAgIGlmICh1bmlmb3JtLnR5cGUgPT09ICdzYW1wbGVyMkQnKSB7XG4gICAgICAgICAgICAgICAgLy8gRm9yIHRleHR1cmVzLCB3ZSBuZWVkIHRvIHRyYWNrIHRleHR1cmUgdW5pdHMsIHNvIHdlIGhhdmUgYSBzcGVjaWFsIHNldHRlclxuICAgICAgICAgICAgICAgIHRoaXMuc2V0VGV4dHVyZVVuaWZvcm0odW5pZm9ybS5uYW1lLCB1bmlmb3JtLnZhbHVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMudW5pZm9ybSh1bmlmb3JtLm1ldGhvZCwgdW5pZm9ybS5uYW1lLCB1bmlmb3JtLnZhbHVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIENhY2hlIHNvbWUgb3IgYWxsIHVuaWZvcm0gdmFsdWVzIHNvIHRoZXkgY2FuIGJlIHJlc3RvcmVkXG4gICAgc2F2ZVVuaWZvcm1zKHN1YnNldCkge1xuICAgICAgICBsZXQgdW5pZm9ybXMgPSBzdWJzZXQgfHwgdGhpcy51bmlmb3JtcztcbiAgICAgICAgZm9yIChsZXQgdSBpbiB1bmlmb3Jtcykge1xuICAgICAgICAgICAgbGV0IHVuaWZvcm0gPSB0aGlzLnVuaWZvcm1zW3VdO1xuICAgICAgICAgICAgaWYgKHVuaWZvcm0pIHtcbiAgICAgICAgICAgICAgICB1bmlmb3JtLnNhdmVkX3ZhbHVlID0gdW5pZm9ybS52YWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aGlzLnNhdmVkX3RleHR1cmVfdW5pdCA9IHRoaXMudGV4dHVyZV91bml0IHx8IDA7XG4gICAgfVxuXG4gICAgLy8gUmVzdG9yZSBzb21lIG9yIGFsbCB1bmlmb3JtcyB0byBzYXZlZCB2YWx1ZXNcbiAgICByZXN0b3JlVW5pZm9ybXMoc3Vic2V0KSB7XG4gICAgICAgIGxldCB1bmlmb3JtcyA9IHN1YnNldCB8fCB0aGlzLnVuaWZvcm1zO1xuICAgICAgICBmb3IgKGxldCB1IGluIHVuaWZvcm1zKSB7XG4gICAgICAgICAgICBsZXQgdW5pZm9ybSA9IHRoaXMudW5pZm9ybXNbdV07XG4gICAgICAgICAgICBpZiAodW5pZm9ybSAmJiB1bmlmb3JtLnNhdmVkX3ZhbHVlKSB7XG4gICAgICAgICAgICAgICAgdW5pZm9ybS52YWx1ZSA9IHVuaWZvcm0uc2F2ZWRfdmFsdWU7XG4gICAgICAgICAgICAgICAgdGhpcy51cGRhdGVVbmlmb3JtKHVuaWZvcm0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMudGV4dHVyZV91bml0ID0gdGhpcy5zYXZlZF90ZXh0dXJlX3VuaXQgfHwgMDtcbiAgICB9XG5cbiAgICAvLyBTZXQgYSB0ZXh0dXJlIHVuaWZvcm0sIGZpbmRzIHRleHR1cmUgYnkgbmFtZSBvciBjcmVhdGVzIGEgbmV3IG9uZVxuICAgIHNldFRleHR1cmVVbmlmb3JtKHVuaWZvcm1fbmFtZSwgdGV4dHVyZV9uYW1lKSB7XG4gICAgICAgIHZhciB0ZXh0dXJlID0gVGV4dHVyZS50ZXh0dXJlc1t0ZXh0dXJlX25hbWVdO1xuICAgICAgICBpZiAodGV4dHVyZSA9PSBudWxsKSB7XG4gICAgICAgICAgICBsb2coJ3dhcm4nLCBgQ2Fubm90IGZpbmQgdGV4dHVyZSAnJHt0ZXh0dXJlX25hbWV9J2ApO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGV4dHVyZS5iaW5kKHRoaXMudGV4dHVyZV91bml0KTtcbiAgICAgICAgdGhpcy51bmlmb3JtKCcxaScsIHVuaWZvcm1fbmFtZSwgdGhpcy50ZXh0dXJlX3VuaXQpO1xuICAgICAgICB0aGlzLnRleHR1cmVfdW5pdCsrOyAvLyBUT0RPOiB0cmFjayBtYXggdGV4dHVyZSB1bml0cyBhbmQgbG9nL3Rocm93IGVycm9yc1xuICAgIH1cblxuICAgIC8vIGV4OiBwcm9ncmFtLnVuaWZvcm0oJzNmdicsICdwb3NpdGlvbicsIFt4LCB5LCB6XSk7XG4gICAgLy8gVE9ETzogb25seSB1cGRhdGUgdW5pZm9ybXMgd2hlbiBjaGFuZ2VkXG4gICAgdW5pZm9ybShtZXRob2QsIG5hbWUsIHZhbHVlKSB7IC8vICd2YWx1ZScgaXMgYSBtZXRob2QtYXBwcm9wcmlhdGUgYXJndW1lbnRzIGxpc3RcbiAgICAgICAgaWYgKCF0aGlzLmNvbXBpbGVkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnVuaWZvcm1zW25hbWVdID0gdGhpcy51bmlmb3Jtc1tuYW1lXSB8fCB7fTtcbiAgICAgICAgbGV0IHVuaWZvcm0gPSB0aGlzLnVuaWZvcm1zW25hbWVdO1xuICAgICAgICB1bmlmb3JtLm5hbWUgPSBuYW1lO1xuICAgICAgICBpZiAodW5pZm9ybS5sb2NhdGlvbiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB1bmlmb3JtLmxvY2F0aW9uID0gdGhpcy5nbC5nZXRVbmlmb3JtTG9jYXRpb24odGhpcy5wcm9ncmFtLCBuYW1lKTtcbiAgICAgICAgfVxuICAgICAgICB1bmlmb3JtLm1ldGhvZCA9IG1ldGhvZDtcbiAgICAgICAgdW5pZm9ybS52YWx1ZSA9IHZhbHVlO1xuICAgICAgICB0aGlzLnVwZGF0ZVVuaWZvcm0odW5pZm9ybSk7XG4gICAgfVxuXG4gICAgLy8gU2V0IGEgc2luZ2xlIHVuaWZvcm1cbiAgICB1cGRhdGVVbmlmb3JtKHVuaWZvcm0pIHtcbiAgICAgICAgaWYgKCF0aGlzLmNvbXBpbGVkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXVuaWZvcm0gfHwgdW5pZm9ybS5sb2NhdGlvbiA9PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnVzZSgpO1xuICAgICAgICB0aGlzLmNvbW1pdFVuaWZvcm0odW5pZm9ybSk7XG4gICAgfVxuXG4gICAgLy8gQ29tbWl0cyB0aGUgdW5pZm9ybSB0byB0aGUgR1BVXG4gICAgY29tbWl0VW5pZm9ybSh1bmlmb3JtKXtcbiAgICAgICAgbGV0IGxvY2F0aW9uID0gdW5pZm9ybS5sb2NhdGlvbjtcbiAgICAgICAgbGV0IHZhbHVlID0gdW5pZm9ybS52YWx1ZTtcblxuICAgICAgICBzd2l0Y2ggKHVuaWZvcm0ubWV0aG9kKSB7XG4gICAgICAgICAgICBjYXNlICcxaSc6XG4gICAgICAgICAgICAgICAgdGhpcy5nbC51bmlmb3JtMWkobG9jYXRpb24sIHZhbHVlKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJzFmJzpcbiAgICAgICAgICAgICAgICB0aGlzLmdsLnVuaWZvcm0xZihsb2NhdGlvbiwgdmFsdWUpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnMmYnOlxuICAgICAgICAgICAgICAgIHRoaXMuZ2wudW5pZm9ybTJmKGxvY2F0aW9uLCB2YWx1ZVswXSwgdmFsdWVbMV0pO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnM2YnOlxuICAgICAgICAgICAgICAgIHRoaXMuZ2wudW5pZm9ybTNmKGxvY2F0aW9uLCB2YWx1ZVswXSwgdmFsdWVbMV0sIHZhbHVlWzJdKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJzRmJzpcbiAgICAgICAgICAgICAgICB0aGlzLmdsLnVuaWZvcm00Zihsb2NhdGlvbiwgdmFsdWVbMF0sIHZhbHVlWzFdLCB2YWx1ZVsyXSwgdmFsdWVbM10pO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnMWl2JzpcbiAgICAgICAgICAgICAgICB0aGlzLmdsLnVuaWZvcm0xaXYobG9jYXRpb24sIHZhbHVlKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJzNpdic6XG4gICAgICAgICAgICAgICAgdGhpcy5nbC51bmlmb3JtM2l2KGxvY2F0aW9uLCB2YWx1ZSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICcxZnYnOlxuICAgICAgICAgICAgICAgIHRoaXMuZ2wudW5pZm9ybTFmdihsb2NhdGlvbiwgdmFsdWUpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnMmZ2JzpcbiAgICAgICAgICAgICAgICB0aGlzLmdsLnVuaWZvcm0yZnYobG9jYXRpb24sIHZhbHVlKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJzNmdic6XG4gICAgICAgICAgICAgICAgdGhpcy5nbC51bmlmb3JtM2Z2KGxvY2F0aW9uLCB2YWx1ZSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICc0ZnYnOlxuICAgICAgICAgICAgICAgIHRoaXMuZ2wudW5pZm9ybTRmdihsb2NhdGlvbiwgdmFsdWUpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnTWF0cml4M2Z2JzpcbiAgICAgICAgICAgICAgICB0aGlzLmdsLnVuaWZvcm1NYXRyaXgzZnYobG9jYXRpb24sIGZhbHNlLCB2YWx1ZSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdNYXRyaXg0ZnYnOlxuICAgICAgICAgICAgICAgIHRoaXMuZ2wudW5pZm9ybU1hdHJpeDRmdihsb2NhdGlvbiwgZmFsc2UsIHZhbHVlKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIFJlZnJlc2ggdW5pZm9ybSBsb2NhdGlvbnMgYW5kIHNldCB0byBsYXN0IGNhY2hlZCB2YWx1ZXNcbiAgICByZWZyZXNoVW5pZm9ybXMoKSB7XG4gICAgICAgIGlmICghdGhpcy5jb21waWxlZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgZm9yICh2YXIgdSBpbiB0aGlzLnVuaWZvcm1zKSB7XG4gICAgICAgICAgICBsZXQgdW5pZm9ybSA9IHRoaXMudW5pZm9ybXNbdV07XG4gICAgICAgICAgICB1bmlmb3JtLmxvY2F0aW9uID0gdGhpcy5nbC5nZXRVbmlmb3JtTG9jYXRpb24odGhpcy5wcm9ncmFtLCB1KTtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlVW5pZm9ybSh1bmlmb3JtKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJlZnJlc2hBdHRyaWJ1dGVzKCkge1xuICAgICAgICAvLyB2YXIgbGVuID0gdGhpcy5nbC5nZXRQcm9ncmFtUGFyYW1ldGVyKHRoaXMucHJvZ3JhbSwgdGhpcy5nbC5BQ1RJVkVfQVRUUklCVVRFUyk7XG4gICAgICAgIC8vIGZvciAodmFyIGk9MDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgIC8vICAgICB2YXIgYSA9IHRoaXMuZ2wuZ2V0QWN0aXZlQXR0cmliKHRoaXMucHJvZ3JhbSwgaSk7XG4gICAgICAgIC8vIH1cbiAgICAgICAgdGhpcy5hdHRyaWJzID0ge307XG4gICAgfVxuXG4gICAgLy8gR2V0IHRoZSBsb2NhdGlvbiBvZiBhIHZlcnRleCBhdHRyaWJ1dGVcbiAgICBhdHRyaWJ1dGUobmFtZSkge1xuICAgICAgICBpZiAoIXRoaXMuY29tcGlsZWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBhdHRyaWIgPSAodGhpcy5hdHRyaWJzW25hbWVdID0gdGhpcy5hdHRyaWJzW25hbWVdIHx8IHt9KTtcbiAgICAgICAgaWYgKGF0dHJpYi5sb2NhdGlvbiAhPSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gYXR0cmliO1xuICAgICAgICB9XG5cbiAgICAgICAgYXR0cmliLm5hbWUgPSBuYW1lO1xuICAgICAgICBhdHRyaWIubG9jYXRpb24gPSB0aGlzLmdsLmdldEF0dHJpYkxvY2F0aW9uKHRoaXMucHJvZ3JhbSwgbmFtZSk7XG5cbiAgICAgICAgLy8gdmFyIGluZm8gPSB0aGlzLmdsLmdldEFjdGl2ZUF0dHJpYih0aGlzLnByb2dyYW0sIGF0dHJpYi5sb2NhdGlvbik7XG4gICAgICAgIC8vIGF0dHJpYi50eXBlID0gaW5mby50eXBlO1xuICAgICAgICAvLyBhdHRyaWIuc2l6ZSA9IGluZm8uc2l6ZTtcblxuICAgICAgICByZXR1cm4gYXR0cmliO1xuICAgIH1cblxuICAgIC8vIEdldCBzaGFkZXIgc291cmNlIGFzIHN0cmluZ1xuICAgIHNvdXJjZSh0eXBlKSB7XG4gICAgICAgIGlmICh0eXBlID09PSAndmVydGV4Jykge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuY29tcHV0ZWRfdmVydGV4X3NvdXJjZTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0eXBlID09PSAnZnJhZ21lbnQnKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5jb21wdXRlZF9mcmFnbWVudF9zb3VyY2U7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBHZXQgc2hhZGVyIHNvdXJjZSBhcyBhcnJheSBvZiBsaW5lIHN0cmluZ3NcbiAgICBsaW5lcyh0eXBlKSB7XG4gICAgICAgIGxldCBzb3VyY2UgPSB0aGlzLnNvdXJjZSh0eXBlKTtcbiAgICAgICAgaWYgKHNvdXJjZSkge1xuICAgICAgICAgICAgcmV0dXJuIHNvdXJjZS5zcGxpdCgnXFxuJyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFtdO1xuICAgIH1cblxuICAgIC8vIEdldCBhIHNwZWNpZmljIGxpbmUgZnJvbSBzaGFkZXIgc291cmNlXG4gICAgbGluZSh0eXBlLCBudW0pIHtcbiAgICAgICAgbGV0IHNvdXJjZSA9IHRoaXMubGluZXModHlwZSk7XG4gICAgICAgIGlmIChzb3VyY2UpIHtcbiAgICAgICAgICAgIHJldHVybiBzb3VyY2VbbnVtXTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIEdldCBpbmZvIG9uIHdoaWNoIHNoYWRlciBibG9jayAoaWYgYW55KSBhIHBhcnRpY3VsYXIgbGluZSBudW1iZXIgaW4gYSBzaGFkZXIgaXMgaW5cbiAgICAvLyBSZXR1cm5zIGFuIG9iamVjdCB3aXRoIHRoZSBmb2xsb3dpbmcgaW5mbyBpZiBhIGJsb2NrIGlzIGZvdW5kOiB7IG5hbWUsIGxpbmUsIHNvdXJjZSB9XG4gICAgLy8gIHNjb3BlOiB3aGVyZSB0aGUgc2hhZGVyIGJsb2NrIG9yaWdpbmF0ZWQsIGVpdGhlciBhIHN0eWxlIG5hbWUsIG9yIGdsb2JhbCBzdWNoIGFzIFNoYWRlclByb2dyYW1cbiAgICAvLyAgbmFtZTogc2hhZGVyIGJsb2NrIG5hbWUgKGUuZy4gJ2NvbG9yJywgJ3Bvc2l0aW9uJywgJ2dsb2JhbCcpXG4gICAgLy8gIG51bTogdGhlIGJsb2NrIG51bWJlciAqd2l0aGluKiBsb2NhbCBzY29wZSAoZS5nLiBpZiBhIHN0eWxlIGhhcyBtdWx0aXBsZSAnY29sb3InIGJsb2NrcylcbiAgICAvLyAgbGluZTogbGluZSBudW1iZXIgKndpdGhpbiogdGhlIHNoYWRlciBibG9jayAobm90IHRoZSB3aG9sZSBzaGFkZXIgcHJvZ3JhbSksIHVzZWZ1bCBmb3IgZXJyb3IgaGlnaGxpZ2h0aW5nXG4gICAgLy8gIHNvdXJjZTogdGhlIGNvZGUgZm9yIHRoZSBsaW5lXG4gICAgLy8gTk9URTogdGhpcyBkb2VzIGEgYnJ1dGVmb3JjZSBsb29wIG92ZXIgdGhlIHNoYWRlciBzb3VyY2UgYW5kIGxvb2tzIGZvciBzaGFkZXIgYmxvY2sgc3RhcnQvZW5kIG1hcmtlcnNcbiAgICAvLyBXZSBjb3VsZCB0cmFjayBsaW5lIHJhbmdlcyBmb3Igc2hhZGVyIGJsb2NrcyBhcyB0aGV5IGFyZSBpbnNlcnRlZCwgYnV0IGFzIHRoaXMgY29kZSBpcyBvbmx5IHVzZWQgZm9yXG4gICAgLy8gZXJyb3IgaGFuZGxpbmcgb24gY29tcGlsYXRpb24gZmFpbHVyZSwgaXQgd2FzIHNpbXBsZXIgdG8ga2VlcCBpdCBzZXBhcmF0ZSB0aGFuIHRvIGJ1cmRlbiB0aGUgY29yZVxuICAgIC8vIGNvbXBpbGF0aW9uIHBhdGguXG4gICAgYmxvY2sodHlwZSwgbnVtKSB7XG4gICAgICAgIGxldCBsaW5lcyA9IHRoaXMubGluZXModHlwZSk7XG4gICAgICAgIGxldCBibG9jaztcbiAgICAgICAgZm9yIChsZXQgaT0wOyBpIDwgbnVtICYmIGkgPCBsaW5lcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgbGV0IGxpbmUgPSBsaW5lc1tpXTtcbiAgICAgICAgICAgIGxldCBtYXRjaCA9IGxpbmUubWF0Y2goL1xcL1xcLyB0YW5ncmFtLWJsb2NrLXN0YXJ0OiAoW0EtWmEtejAtOV8tXSspLCAoW0EtWmEtejAtOV8tXSspLCAoXFxkKykvKTtcbiAgICAgICAgICAgIGlmIChtYXRjaCAmJiBtYXRjaC5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgICAgICAgLy8gbWFyayBjdXJyZW50IGJsb2NrXG4gICAgICAgICAgICAgICAgYmxvY2sgPSB7XG4gICAgICAgICAgICAgICAgICAgIHNjb3BlOiBtYXRjaFsxXSxcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogbWF0Y2hbMl0sXG4gICAgICAgICAgICAgICAgICAgIG51bTogbWF0Y2hbM11cbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgbWF0Y2ggPSBsaW5lLm1hdGNoKC9cXC9cXC8gdGFuZ3JhbS1ibG9jay1lbmQ6IChbQS1aYS16MC05Xy1dKyksIChbQS1aYS16MC05Xy1dKyksIChcXGQrKS8pO1xuICAgICAgICAgICAgICAgIGlmIChtYXRjaCAmJiBtYXRjaC5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgICAgICAgICAgIGJsb2NrID0gbnVsbDsgLy8gY2xlYXIgY3VycmVudCBibG9ja1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gdXBkYXRlIGxpbmUgIyBhbmQgY29udGVudFxuICAgICAgICAgICAgaWYgKGJsb2NrKSB7XG4gICAgICAgICAgICAgICAgLy8gaW5pdCB0byAtMSBzbyB0aGF0IGxpbmUgMCBpcyBmaXJzdCBhY3R1YWwgbGluZSBvZiBibG9jayBjb2RlLCBhZnRlciBjb21tZW50IG1hcmtlclxuICAgICAgICAgICAgICAgIGJsb2NrLmxpbmUgPSAoYmxvY2subGluZSA9PSBudWxsKSA/IC0xIDogYmxvY2subGluZSArIDE7XG4gICAgICAgICAgICAgICAgYmxvY2suc291cmNlID0gbGluZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYmxvY2s7XG4gICAgfVxuXG4gICAgLy8gUmV0dXJucyBsaXN0IG9mIGF2YWlsYWJsZSBleHRlbnNpb25zIGZyb20gdGhvc2UgcmVxdWVzdGVkXG4gICAgLy8gU2V0cyBpbnRlcm5hbCAjZGVmaW5lcyBpbmRpY2F0aW5nIGF2YWlsYWJpbGl0eSBvZiBlYWNoIHJlcXVlc3RlZCBleHRlbnNpb25cbiAgICBjaGVja0V4dGVuc2lvbnMoKSB7XG4gICAgICAgIGxldCBleHRzID0gW107XG4gICAgICAgIHRoaXMuZXh0ZW5zaW9ucy5mb3JFYWNoKG5hbWUgPT4ge1xuICAgICAgICAgICAgbGV0IGV4dCA9IGdldEV4dGVuc2lvbih0aGlzLmdsLCBuYW1lKTtcbiAgICAgICAgICAgIGxldCBkZWYgPSBgVEFOR1JBTV9FWFRFTlNJT05fJHtuYW1lfWA7XG5cbiAgICAgICAgICAgIHRoaXMuZGVmaW5lc1tkZWZdID0gKGV4dCAhPSBudWxsKTtcblxuICAgICAgICAgICAgaWYgKGV4dCkge1xuICAgICAgICAgICAgICAgIGV4dHMucHVzaChuYW1lKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGxvZygnZGVidWcnLCBgQ291bGQgbm90IGVuYWJsZSBleHRlbnNpb24gJyR7bmFtZX0nYCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gZXh0cztcbiAgICB9XG5cbn1cblxuXG4vLyBTdGF0aWMgbWV0aG9kcyBhbmQgc3RhdGVcblNoYWRlclByb2dyYW0uaWQgPSAwOyAgICAgICAgICAgICAgICAgICAvLyBhc3NpZ24gZWFjaCBwcm9ncmFtIGEgdW5pcXVlIGlkXG5TaGFkZXJQcm9ncmFtLmN1cnJlbnQgPSBudWxsOyAgICAgICAgICAgLy8gY3VycmVudGx5IGJvdW5kIHByb2dyYW1cblxuLy8gR2xvYmFsIGNvbmZpZyBhcHBsaWVkIHRvIGFsbCBwcm9ncmFtcyAoZHVwbGljYXRlIHByb3BlcnRpZXMgZm9yIGEgc3BlY2lmaWMgcHJvZ3JhbSB3aWxsIHRha2UgcHJlY2VkZW5jZSlcblNoYWRlclByb2dyYW0uZGVmaW5lcyA9IHt9O1xuU2hhZGVyUHJvZ3JhbS5ibG9ja3MgPSB7fTtcblxuLy8gUmVzZXQgcHJvZ3JhbSBhbmQgc2hhZGVyIGNhY2hlc1xuU2hhZGVyUHJvZ3JhbS5yZXNldCA9IGZ1bmN0aW9uICgpIHtcbiAgICBTaGFkZXJQcm9ncmFtLnByb2dyYW1zX2J5X3NvdXJjZSA9IHt9OyAgLy8gR0wgcHJvZ3JhbSBvYmplY3RzIGJ5IGV4YWN0IHZlcnRleCArIGZyYWdtZW50IHNoYWRlciBzb3VyY2VcbiAgICBTaGFkZXJQcm9ncmFtLnNoYWRlcnNfYnlfc291cmNlID0ge307ICAgLy8gR0wgc2hhZGVyIG9iamVjdHMgYnkgZXhhY3Qgc291cmNlXG59O1xuU2hhZGVyUHJvZ3JhbS5yZXNldCgpO1xuXG4vLyBUdXJuIGFuIG9iamVjdCBvZiBrZXkvdmFsdWUgcGFpcnMgaW50byBzaW5nbGUgc3RyaW5nIG9mICNkZWZpbmUgc3RhdGVtZW50c1xuU2hhZGVyUHJvZ3JhbS5idWlsZERlZmluZVN0cmluZyA9IGZ1bmN0aW9uIChkZWZpbmVzKSB7XG4gICAgdmFyIGRlZmluZV9zdHIgPSBcIlwiO1xuICAgIGZvciAodmFyIGQgaW4gZGVmaW5lcykge1xuICAgICAgICBpZiAoZGVmaW5lc1tkXSA9PSBudWxsIHx8IGRlZmluZXNbZF0gPT09IGZhbHNlKSB7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0eXBlb2YgZGVmaW5lc1tkXSA9PT0gJ2Jvb2xlYW4nICYmIGRlZmluZXNbZF0gPT09IHRydWUpIHsgLy8gYm9vbGVhbnMgYXJlIHNpbXBsZSBkZWZpbmVzIHdpdGggbm8gdmFsdWVcbiAgICAgICAgICAgIGRlZmluZV9zdHIgKz0gXCIjZGVmaW5lIFwiICsgZCArIFwiXFxuXCI7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodHlwZW9mIGRlZmluZXNbZF0gPT09ICdudW1iZXInICYmIE1hdGguZmxvb3IoZGVmaW5lc1tkXSkgPT09IGRlZmluZXNbZF0pIHsgLy8gaW50IHRvIGZsb2F0IGNvbnZlcnNpb24gdG8gc2F0aXNmeSBHTFNMIGZsb2F0c1xuICAgICAgICAgICAgZGVmaW5lX3N0ciArPSBcIiNkZWZpbmUgXCIgKyBkICsgXCIgXCIgKyBkZWZpbmVzW2RdLnRvRml4ZWQoMSkgKyBcIlxcblwiO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgeyAvLyBhbnkgb3RoZXIgZmxvYXQgb3Igc3RyaW5nIHZhbHVlXG4gICAgICAgICAgICBkZWZpbmVfc3RyICs9IFwiI2RlZmluZSBcIiArIGQgKyBcIiBcIiArIGRlZmluZXNbZF0gKyBcIlxcblwiO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBkZWZpbmVfc3RyO1xufTtcblxuLy8gVHVybiBhIGxpc3Qgb2YgZXh0ZW5zaW9uIG5hbWVzIGludG8gc2luZ2xlIHN0cmluZyBvZiAjZXh0ZW5zaW9uIHN0YXRlbWVudHNcblNoYWRlclByb2dyYW0uYnVpbGRFeHRlbnNpb25TdHJpbmcgPSBmdW5jdGlvbiAoZXh0ZW5zaW9ucykge1xuICAgIGV4dGVuc2lvbnMgPSBleHRlbnNpb25zIHx8IFtdO1xuICAgIGxldCBzdHIgPSBcIlwiO1xuICAgIGV4dGVuc2lvbnMuZm9yRWFjaChleHQgPT4ge1xuICAgICAgICBzdHIgKz0gYCNpZmRlZiBHTF8ke2V4dH1cXG4jZXh0ZW5zaW9uIEdMXyR7ZXh0fSA6IGVuYWJsZVxcbiNlbmRpZlxcbmA7XG4gICAgfSk7XG4gICAgcmV0dXJuIHN0cjtcbn07XG5cblNoYWRlclByb2dyYW0uYWRkQmxvY2sgPSBmdW5jdGlvbiAoa2V5LCAuLi5ibG9ja3MpIHtcbiAgICBTaGFkZXJQcm9ncmFtLmJsb2Nrc1trZXldID0gU2hhZGVyUHJvZ3JhbS5ibG9ja3Nba2V5XSB8fCBbXTtcbiAgICBTaGFkZXJQcm9ncmFtLmJsb2Nrc1trZXldLnB1c2goLi4uYmxvY2tzKTtcbn07XG5cbi8vIFJlbW92ZSBhbGwgZ2xvYmFsIHNoYWRlciBibG9ja3MgZm9yIGEgZ2l2ZW4ga2V5XG5TaGFkZXJQcm9ncmFtLnJlbW92ZUJsb2NrID0gZnVuY3Rpb24gKGtleSkge1xuICAgIFNoYWRlclByb2dyYW0uYmxvY2tzW2tleV0gPSBbXTtcbn07XG5cblNoYWRlclByb2dyYW0ucmVwbGFjZUJsb2NrID0gZnVuY3Rpb24gKGtleSwgLi4uYmxvY2tzKSB7XG4gICAgU2hhZGVyUHJvZ3JhbS5yZW1vdmVCbG9jayhrZXkpO1xuICAgIFNoYWRlclByb2dyYW0uYWRkQmxvY2soa2V5LCAuLi5ibG9ja3MpO1xufTtcblxuLy8gQ29tcGlsZSAmIGxpbmsgYSBXZWJHTCBwcm9ncmFtIGZyb20gcHJvdmlkZWQgdmVydGV4IGFuZCBmcmFnbWVudCBzaGFkZXIgc291cmNlc1xuLy8gdXBkYXRlIGEgcHJvZ3JhbSBpZiBvbmUgaXMgcGFzc2VkIGluLiBDcmVhdGUgb25lIGlmIG5vdC4gQWxlcnQgYW5kIGRvbid0IHVwZGF0ZSBhbnl0aGluZyBpZiB0aGUgc2hhZGVycyBkb24ndCBjb21waWxlLlxuU2hhZGVyUHJvZ3JhbS51cGRhdGVQcm9ncmFtID0gZnVuY3Rpb24gKGdsLCBwcm9ncmFtLCB2ZXJ0ZXhfc2hhZGVyX3NvdXJjZSwgZnJhZ21lbnRfc2hhZGVyX3NvdXJjZSkge1xuICAgIC8vIFByb2dyYW0gd2l0aCB0aGlzIGV4YWN0IHZlcnRleCBhbmQgZnJhZ21lbnQgc2hhZGVyIHNvdXJjZXMgYWxyZWFkeSBjYWNoZWQ/XG4gICAgbGV0IGtleSA9IHZlcnRleF9zaGFkZXJfc291cmNlICsgJzo6JyArIGZyYWdtZW50X3NoYWRlcl9zb3VyY2U7XG4gICAgaWYgKFNoYWRlclByb2dyYW0ucHJvZ3JhbXNfYnlfc291cmNlW2tleV0pIHtcbiAgICAgICAgbG9nKCd0cmFjZScsICdSZXVzaW5nIGlkZW50aWNhbCBzb3VyY2UgR0wgcHJvZ3JhbSBvYmplY3QnKTtcbiAgICAgICAgcmV0dXJuIFNoYWRlclByb2dyYW0ucHJvZ3JhbXNfYnlfc291cmNlW2tleV07XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgICAgdmFyIHZlcnRleF9zaGFkZXIgPSBTaGFkZXJQcm9ncmFtLmNyZWF0ZVNoYWRlcihnbCwgdmVydGV4X3NoYWRlcl9zb3VyY2UsIGdsLlZFUlRFWF9TSEFERVIpO1xuICAgICAgICB2YXIgZnJhZ21lbnRfc2hhZGVyID0gU2hhZGVyUHJvZ3JhbS5jcmVhdGVTaGFkZXIoZ2wsIGZyYWdtZW50X3NoYWRlcl9zb3VyY2UsIGdsLkZSQUdNRU5UX1NIQURFUik7XG4gICAgfVxuICAgIGNhdGNoKGVycikge1xuICAgICAgICBsb2coJ2Vycm9yJywgZXJyLm1lc3NhZ2UpO1xuICAgICAgICB0aHJvdyBlcnI7XG4gICAgfVxuXG4gICAgZ2wudXNlUHJvZ3JhbShudWxsKTtcbiAgICBpZiAocHJvZ3JhbSAhPSBudWxsKSB7XG4gICAgICAgIHZhciBvbGRfc2hhZGVycyA9IGdsLmdldEF0dGFjaGVkU2hhZGVycyhwcm9ncmFtKTtcbiAgICAgICAgZm9yKHZhciBpID0gMDsgaSA8IG9sZF9zaGFkZXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBnbC5kZXRhY2hTaGFkZXIocHJvZ3JhbSwgb2xkX3NoYWRlcnNbaV0pO1xuICAgICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgICAgcHJvZ3JhbSA9IGdsLmNyZWF0ZVByb2dyYW0oKTtcbiAgICB9XG5cbiAgICBpZiAodmVydGV4X3NoYWRlciA9PSBudWxsIHx8IGZyYWdtZW50X3NoYWRlciA9PSBudWxsKSB7XG4gICAgICAgIHJldHVybiBwcm9ncmFtO1xuICAgIH1cblxuICAgIGdsLmF0dGFjaFNoYWRlcihwcm9ncmFtLCB2ZXJ0ZXhfc2hhZGVyKTtcbiAgICBnbC5hdHRhY2hTaGFkZXIocHJvZ3JhbSwgZnJhZ21lbnRfc2hhZGVyKTtcblxuICAgIGdsLmxpbmtQcm9ncmFtKHByb2dyYW0pO1xuXG4gICAgLy8gVE9ETzogcmVmZXJlbmNlIGNvdW50IGFuZCBkZWxldGUgc2hhZGVyIG9iamVjdHMgd2hlbiBubyBwcm9ncmFtcyByZWZlcmVuY2UgdGhlbVxuXG4gICAgaWYgKCFnbC5nZXRQcm9ncmFtUGFyYW1ldGVyKHByb2dyYW0sIGdsLkxJTktfU1RBVFVTKSkge1xuICAgICAgICBsZXQgbWVzc2FnZSA9IG5ldyBFcnJvcihcbiAgICAgICAgICAgIGBXZWJHTCBwcm9ncmFtIGVycm9yOlxuICAgICAgICAgICAgVkFMSURBVEVfU1RBVFVTOiAke2dsLmdldFByb2dyYW1QYXJhbWV0ZXIocHJvZ3JhbSwgZ2wuVkFMSURBVEVfU1RBVFVTKX1cbiAgICAgICAgICAgIEVSUk9SOiAke2dsLmdldEVycm9yKCl9XG4gICAgICAgICAgICAtLS0gVmVydGV4IFNoYWRlciAtLS1cbiAgICAgICAgICAgICR7dmVydGV4X3NoYWRlcl9zb3VyY2V9XG4gICAgICAgICAgICAtLS0gRnJhZ21lbnQgU2hhZGVyIC0tLVxuICAgICAgICAgICAgJHtmcmFnbWVudF9zaGFkZXJfc291cmNlfWApO1xuXG4gICAgICAgIGxldCBlcnJvciA9IHsgdHlwZTogJ3Byb2dyYW0nLCBtZXNzYWdlIH07XG4gICAgICAgIGxvZygnZXJyb3InLCBlcnJvci5tZXNzYWdlKTtcbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuXG4gICAgU2hhZGVyUHJvZ3JhbS5wcm9ncmFtc19ieV9zb3VyY2Vba2V5XSA9IHByb2dyYW07IC8vIGNhY2hlIGJ5IGV4YWN0IHNvdXJjZVxuICAgIHJldHVybiBwcm9ncmFtO1xufTtcblxuLy8gQ29tcGlsZSBhIHZlcnRleCBvciBmcmFnbWVudCBzaGFkZXIgZnJvbSBwcm92aWRlZCBzb3VyY2VcblNoYWRlclByb2dyYW0uY3JlYXRlU2hhZGVyID0gZnVuY3Rpb24gKGdsLCBzb3VyY2UsIHN0eXBlKSB7XG4gICAgLy8gUHJvZ3JhbSB3aXRoIGlkZW50aWNhbCB2ZXJ0ZXggYW5kIGZyYWdtZW50IHNoYWRlciBzb3VyY2VzIGFscmVhZHkgY2FjaGVkP1xuICAgIGxldCBrZXkgPSBzb3VyY2U7XG4gICAgaWYgKFNoYWRlclByb2dyYW0uc2hhZGVyc19ieV9zb3VyY2Vba2V5XSkge1xuICAgICAgICBsb2coJ3RyYWNlJywgJ1JldXNpbmcgaWRlbnRpY2FsIHNvdXJjZSBHTCBzaGFkZXIgb2JqZWN0Jyk7XG4gICAgICAgIHJldHVybiBTaGFkZXJQcm9ncmFtLnNoYWRlcnNfYnlfc291cmNlW2tleV07XG4gICAgfVxuXG4gICAgbGV0IHNoYWRlciA9IGdsLmNyZWF0ZVNoYWRlcihzdHlwZSk7XG5cbiAgICBnbC5zaGFkZXJTb3VyY2Uoc2hhZGVyLCBzb3VyY2UpO1xuICAgIGdsLmNvbXBpbGVTaGFkZXIoc2hhZGVyKTtcblxuICAgIGlmICghZ2wuZ2V0U2hhZGVyUGFyYW1ldGVyKHNoYWRlciwgZ2wuQ09NUElMRV9TVEFUVVMpKSB7XG4gICAgICAgIGxldCB0eXBlID0gKHN0eXBlID09PSBnbC5WRVJURVhfU0hBREVSID8gJ3ZlcnRleCcgOiAnZnJhZ21lbnQnKTtcbiAgICAgICAgbGV0IG1lc3NhZ2UgPSBnbC5nZXRTaGFkZXJJbmZvTG9nKHNoYWRlcik7XG4gICAgICAgIGxldCBlcnJvcnMgPSBwYXJzZVNoYWRlckVycm9ycyhtZXNzYWdlKTtcbiAgICAgICAgdGhyb3cgeyB0eXBlLCBtZXNzYWdlLCBlcnJvcnMgfTtcbiAgICB9XG5cbiAgICBTaGFkZXJQcm9ncmFtLnNoYWRlcnNfYnlfc291cmNlW2tleV0gPSBzaGFkZXI7IC8vIGNhY2hlIGJ5IGV4YWN0IHNvdXJjZVxuICAgIHJldHVybiBzaGFkZXI7XG59O1xuIiwiLy8gVGV4dHVyZSBtYW5hZ2VtZW50XG5pbXBvcnQgbG9nIGZyb20gJy4uL3V0aWxzL2xvZyc7XG5pbXBvcnQgVXRpbHMgZnJvbSAnLi4vdXRpbHMvdXRpbHMnO1xuaW1wb3J0IHN1YnNjcmliZU1peGluIGZyb20gJy4uL3V0aWxzL3N1YnNjcmliZSc7XG5pbXBvcnQgV29ya2VyQnJva2VyIGZyb20gJy4uL3V0aWxzL3dvcmtlcl9icm9rZXInO1xuXG4vLyBHTCB0ZXh0dXJlIHdyYXBwZXIgb2JqZWN0IGZvciBrZWVwaW5nIHRyYWNrIG9mIGEgZ2xvYmFsIHNldCBvZiB0ZXh0dXJlcywga2V5ZWQgYnkgYSB1bmlxdWUgdXNlci1kZWZpbmVkIG5hbWVcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFRleHR1cmUge1xuXG4gICAgY29uc3RydWN0b3IoZ2wsIG5hbWUsIG9wdGlvbnMgPSB7fSkge1xuICAgICAgICB0aGlzLmdsID0gZ2w7XG4gICAgICAgIHRoaXMudGV4dHVyZSA9IGdsLmNyZWF0ZVRleHR1cmUoKTtcbiAgICAgICAgaWYgKHRoaXMudGV4dHVyZSkge1xuICAgICAgICAgICAgdGhpcy52YWxpZCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5iaW5kKCk7XG5cbiAgICAgICAgdGhpcy5uYW1lID0gbmFtZTtcbiAgICAgICAgdGhpcy5yZXRhaW5fY291bnQgPSAwO1xuICAgICAgICB0aGlzLnNvdXJjZSA9IG51bGw7XG4gICAgICAgIHRoaXMuc291cmNlX3R5cGUgPSBudWxsO1xuICAgICAgICB0aGlzLmNvbmZpZ190eXBlID0gbnVsbDtcbiAgICAgICAgdGhpcy5sb2FkaW5nID0gbnVsbDsgICAgLy8gYSBQcm9taXNlIG9iamVjdCB0byB0cmFjayB0aGUgbG9hZGluZyBzdGF0ZSBvZiB0aGlzIHRleHR1cmVcbiAgICAgICAgdGhpcy5sb2FkZWQgPSBmYWxzZTsgICAgLy8gc3VjY2Vzc2Z1bGx5IGxvYWRlZCBhcyBleHBlY3RlZFxuICAgICAgICB0aGlzLmZpbHRlcmluZyA9IG9wdGlvbnMuZmlsdGVyaW5nO1xuICAgICAgICB0aGlzLnNwcml0ZXMgPSBvcHRpb25zLnNwcml0ZXM7XG4gICAgICAgIHRoaXMudGV4Y29vcmRzID0ge307ICAgIC8vIHNwcml0ZSBVVnMgKFswLCAxXSByYW5nZSlcbiAgICAgICAgdGhpcy5zaXplcyA9IHt9OyAgICAgICAgLy8gc3ByaXRlIHNpemVzIChwaXhlbCBzaXplKVxuXG4gICAgICAgIC8vIERlZmF1bHQgdG8gYSAxLXBpeGVsIGJsYWNrIHRleHR1cmUgc28gd2UgY2FuIHNhZmVseSByZW5kZXIgd2hpbGUgd2Ugd2FpdCBmb3IgYW4gaW1hZ2UgdG8gbG9hZFxuICAgICAgICAvLyBTZWU6IGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvMTk3MjIyNDcvd2ViZ2wtd2FpdC1mb3ItdGV4dHVyZS10by1sb2FkXG4gICAgICAgIHRoaXMuc2V0RGF0YSgxLCAxLCBuZXcgVWludDhBcnJheShbMCwgMCwgMCwgMjU1XSksIHsgZmlsdGVyaW5nOiAnbmVhcmVzdCcgfSk7XG5cbiAgICAgICAgLy8gRGVzdHJveSBwcmV2aW91cyB0ZXh0dXJlIGlmIHByZXNlbnRcbiAgICAgICAgaWYgKFRleHR1cmUudGV4dHVyZXNbdGhpcy5uYW1lXSkge1xuICAgICAgICAgICAgLy8gUHJlc2VydmUgcHJldmlvdXMgcmV0YWluIGNvdW50XG4gICAgICAgICAgICB0aGlzLnJldGFpbl9jb3VudCA9IFRleHR1cmUudGV4dHVyZXNbdGhpcy5uYW1lXS5yZXRhaW5fY291bnQ7XG4gICAgICAgICAgICBUZXh0dXJlLnRleHR1cmVzW3RoaXMubmFtZV0ucmV0YWluX2NvdW50ID0gMDsgLy8gYWxsb3cgdG8gYmUgZnJlZWRcbiAgICAgICAgICAgIFRleHR1cmUudGV4dHVyZXNbdGhpcy5uYW1lXS5kZXN0cm95KCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDYWNoZSB0ZXh0dXJlIGluc3RhbmNlIGFuZCBkZWZpbml0aW9uXG4gICAgICAgIFRleHR1cmUudGV4dHVyZXNbdGhpcy5uYW1lXSA9IHRoaXM7XG4gICAgICAgIFRleHR1cmUudGV4dHVyZV9jb25maWdzW3RoaXMubmFtZV0gPSBPYmplY3QuYXNzaWduKHsgbmFtZSB9LCBvcHRpb25zKTtcblxuICAgICAgICB0aGlzLmxvYWQob3B0aW9ucyk7XG4gICAgICAgIGxvZygndHJhY2UnLCBgY3JlYXRpbmcgVGV4dHVyZSAke3RoaXMubmFtZX1gKTtcbiAgICB9XG5cbiAgICAvLyBEZXN0cm95IGEgc2luZ2xlIHRleHR1cmUgaW5zdGFuY2VcbiAgICBkZXN0cm95KHsgZm9yY2UgfSA9IHt9KSB7XG4gICAgICAgIGlmICh0aGlzLnJldGFpbl9jb3VudCA+IDAgJiYgIWZvcmNlKSB7XG4gICAgICAgICAgICBsb2coJ2Vycm9yJywgYFRleHR1cmUgJyR7dGhpcy5uYW1lfSc6IGRlc3Ryb3lpbmcgdGV4dHVyZSB3aXRoIHJldGFpbiBjb3VudCBvZiAnJHt0aGlzLnJldGFpbl9jb3VudH0nYCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXRoaXMudmFsaWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmdsLmRlbGV0ZVRleHR1cmUodGhpcy50ZXh0dXJlKTtcbiAgICAgICAgdGhpcy50ZXh0dXJlID0gbnVsbDtcbiAgICAgICAgZGVsZXRlIHRoaXMuZGF0YTtcbiAgICAgICAgdGhpcy5kYXRhID0gbnVsbDtcbiAgICAgICAgZGVsZXRlIFRleHR1cmUudGV4dHVyZXNbdGhpcy5uYW1lXTtcbiAgICAgICAgdGhpcy52YWxpZCA9IGZhbHNlO1xuICAgICAgICBsb2coJ3RyYWNlJywgYGRlc3Ryb3lpbmcgVGV4dHVyZSAke3RoaXMubmFtZX1gKTtcbiAgICB9XG5cbiAgICByZXRhaW4gKCkge1xuICAgICAgICB0aGlzLnJldGFpbl9jb3VudCsrO1xuICAgIH1cblxuICAgIHJlbGVhc2UgKCkge1xuICAgICAgICBpZiAodGhpcy5yZXRhaW5fY291bnQgPD0gMCkge1xuICAgICAgICAgICAgbG9nKCdlcnJvcicsIGBUZXh0dXJlICcke3RoaXMubmFtZX0nOiByZWxlYXNpbmcgdGV4dHVyZSB3aXRoIHJldGFpbiBjb3VudCBvZiAnJHt0aGlzLnJldGFpbl9jb3VudH0nYCk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnJldGFpbl9jb3VudC0tO1xuICAgICAgICBpZiAodGhpcy5yZXRhaW5fY291bnQgPD0gMCkge1xuICAgICAgICAgICAgdGhpcy5kZXN0cm95KCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBiaW5kKHVuaXQgPSAwKSB7XG4gICAgICAgIGlmICghdGhpcy52YWxpZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKFRleHR1cmUuYWN0aXZlVW5pdCAhPT0gdW5pdCkge1xuICAgICAgICAgICAgdGhpcy5nbC5hY3RpdmVUZXh0dXJlKHRoaXMuZ2wuVEVYVFVSRTAgKyB1bml0KTtcbiAgICAgICAgICAgIFRleHR1cmUuYWN0aXZlVW5pdCA9IHVuaXQ7XG4gICAgICAgICAgICBUZXh0dXJlLmJvdW5kVGV4dHVyZSA9IG51bGw7IC8vIHRleHR1cmUgbXVzdCBiZSByZS1ib3VuZCB3aGVuIHVuaXQgY2hhbmdlc1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKFRleHR1cmUuYm91bmRUZXh0dXJlICE9PSB0aGlzLnRleHR1cmUpIHtcbiAgICAgICAgICAgIHRoaXMuZ2wuYmluZFRleHR1cmUodGhpcy5nbC5URVhUVVJFXzJELCB0aGlzLnRleHR1cmUpO1xuICAgICAgICAgICAgVGV4dHVyZS5ib3VuZFRleHR1cmUgPSB0aGlzLnRleHR1cmU7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBsb2FkKG9wdGlvbnMpIHtcbiAgICAgICAgaWYgKCFvcHRpb25zKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5sb2FkaW5nIHx8IFByb21pc2UucmVzb2x2ZSh0aGlzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMubG9hZGluZyA9IG51bGw7XG4gICAgICAgIGlmICh0eXBlb2Ygb3B0aW9ucy51cmwgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICB0aGlzLmNvbmZpZ190eXBlID0gJ3VybCc7XG4gICAgICAgICAgICB0aGlzLnNldFVybChvcHRpb25zLnVybCwgb3B0aW9ucyk7XG4gICAgICAgIH0gZWxzZSBpZiAob3B0aW9ucy5lbGVtZW50KSB7XG4gICAgICAgICAgICB0aGlzLmNvbmZpZ190eXBlID0gJ2VsZW1lbnQnO1xuICAgICAgICAgICAgdGhpcy5zZXRFbGVtZW50KG9wdGlvbnMuZWxlbWVudCwgb3B0aW9ucyk7XG4gICAgICAgIH0gZWxzZSBpZiAob3B0aW9ucy5kYXRhICYmIG9wdGlvbnMud2lkdGggJiYgb3B0aW9ucy5oZWlnaHQpIHtcbiAgICAgICAgICAgIHRoaXMuY29uZmlnX3R5cGUgPSAnZGF0YSc7XG4gICAgICAgICAgICB0aGlzLnNldERhdGEob3B0aW9ucy53aWR0aCwgb3B0aW9ucy5oZWlnaHQsIG9wdGlvbnMuZGF0YSwgb3B0aW9ucyk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmxvYWRpbmcgPVxuICAgICAgICAgICAgKHRoaXMubG9hZGluZyAmJiB0aGlzLmxvYWRpbmcudGhlbigoKSA9PiB7IHRoaXMuY2FsY3VsYXRlU3ByaXRlcygpOyByZXR1cm4gdGhpczsgfSkpIHx8XG4gICAgICAgICAgICBQcm9taXNlLnJlc29sdmUodGhpcyk7XG4gICAgICAgIHJldHVybiB0aGlzLmxvYWRpbmc7XG4gICAgfVxuXG4gICAgLy8gU2V0cyB0ZXh0dXJlIGZyb20gYW4gdXJsXG4gICAgc2V0VXJsKHVybCwgb3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIGlmICghdGhpcy52YWxpZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy51cmwgPSB1cmw7IC8vIHNhdmUgVVJMIHJlZmVyZW5jZSAod2lsbCBiZSBvdmVyd3JpdHRlbiB3aGVuIGVsZW1lbnQgaXMgbG9hZGVkIGJlbG93KVxuICAgICAgICB0aGlzLnNvdXJjZSA9IHRoaXMudXJsO1xuICAgICAgICB0aGlzLnNvdXJjZV90eXBlID0gJ3VybCc7XG5cbiAgICAgICAgdGhpcy5sb2FkaW5nID0gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgbGV0IGltYWdlID0gbmV3IEltYWdlKCk7XG4gICAgICAgICAgICBpbWFnZS5vbmxvYWQgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRFbGVtZW50KGltYWdlLCBvcHRpb25zKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2FkZWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgbG9nKCd3YXJuJywgYFRleHR1cmUgJyR7dGhpcy5uYW1lfSc6IGZhaWxlZCB0byBsb2FkIHVybDogJyR7dGhpcy5zb3VyY2V9J2AsIGUsIG9wdGlvbnMpO1xuICAgICAgICAgICAgICAgICAgICBUZXh0dXJlLnRyaWdnZXIoJ3dhcm5pbmcnLCB7IG1lc3NhZ2U6IGBGYWlsZWQgdG8gbG9hZCB0ZXh0dXJlIGZyb20gJHt0aGlzLnNvdXJjZX1gLCBlcnJvcjogZSwgdGV4dHVyZTogb3B0aW9ucyB9KTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICB0aGlzLmxvYWRlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgcmVzb2x2ZSh0aGlzKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBpbWFnZS5vbmVycm9yID0gZSA9PiB7XG4gICAgICAgICAgICAgICAgLy8gV2FybiBhbmQgcmVzb2x2ZSBvbiBlcnJvclxuICAgICAgICAgICAgICAgIHRoaXMubG9hZGVkID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgbG9nKCd3YXJuJywgYFRleHR1cmUgJyR7dGhpcy5uYW1lfSc6IGZhaWxlZCB0byBsb2FkIHVybDogJyR7dGhpcy5zb3VyY2V9J2AsIGUsIG9wdGlvbnMpO1xuICAgICAgICAgICAgICAgIFRleHR1cmUudHJpZ2dlcignd2FybmluZycsIHsgbWVzc2FnZTogYEZhaWxlZCB0byBsb2FkIHRleHR1cmUgZnJvbSAke3RoaXMuc291cmNlfWAsIGVycm9yOiBlLCB0ZXh0dXJlOiBvcHRpb25zIH0pO1xuICAgICAgICAgICAgICAgIHJlc29sdmUodGhpcyk7XG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAvLyBTYWZhcmkgaGFzIGEgYnVnIGxvYWRpbmcgZGF0YS1VUkwgaW1hZ2VzIHdpdGggQ09SUyBlbmFibGVkLCBzbyBpdCBtdXN0IGJlIGRpc2FibGVkIGluIHRoYXQgY2FzZVxuICAgICAgICAgICAgLy8gaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTEyMzk3OFxuICAgICAgICAgICAgaWYgKCEoVXRpbHMuaXNTYWZhcmkoKSAmJiB0aGlzLnNvdXJjZS5zbGljZSgwLCA1KSA9PT0gJ2RhdGE6JykpIHtcbiAgICAgICAgICAgICAgICBpbWFnZS5jcm9zc09yaWdpbiA9ICdhbm9ueW1vdXMnO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpbWFnZS5zcmMgPSB0aGlzLnNvdXJjZTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB0aGlzLmxvYWRpbmc7XG4gICAgfVxuXG4gICAgLy8gU2V0cyB0ZXh0dXJlIHRvIGEgcmF3IGltYWdlIGJ1ZmZlclxuICAgIHNldERhdGEod2lkdGgsIGhlaWdodCwgZGF0YSwgb3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIHRoaXMud2lkdGggPSB3aWR0aDtcbiAgICAgICAgdGhpcy5oZWlnaHQgPSBoZWlnaHQ7XG5cbiAgICAgICAgdGhpcy5zb3VyY2UgPSBkYXRhO1xuICAgICAgICB0aGlzLnNvdXJjZV90eXBlID0gJ2RhdGEnO1xuXG4gICAgICAgIC8vIENvbnZlcnQgcmVndWxhciBhcnJheSB0byB0eXBlZCBhcnJheVxuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh0aGlzLnNvdXJjZSkpIHtcbiAgICAgICAgICAgIHRoaXMuc291cmNlID0gbmV3IFVpbnQ4QXJyYXkodGhpcy5zb3VyY2UpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy51cGRhdGUob3B0aW9ucyk7XG4gICAgICAgIHRoaXMuc2V0RmlsdGVyaW5nKG9wdGlvbnMpO1xuXG4gICAgICAgIHRoaXMubG9hZGVkID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5sb2FkaW5nID0gUHJvbWlzZS5yZXNvbHZlKHRoaXMpO1xuICAgICAgICByZXR1cm4gdGhpcy5sb2FkaW5nO1xuICAgIH1cblxuICAgIC8vIFNldHMgdGhlIHRleHR1cmUgdG8gdHJhY2sgYSBlbGVtZW50IChjYW52YXMvaW1hZ2UpXG4gICAgc2V0RWxlbWVudChlbGVtZW50LCBvcHRpb25zKSB7XG4gICAgICAgIGxldCBlbCA9IGVsZW1lbnQ7XG5cbiAgICAgICAgLy8gYSBzdHJpbmcgZWxlbWVudCBpcyBpbnRlcnBldGVkIGFzIGEgQ1NTIHNlbGVjdG9yXG4gICAgICAgIGlmICh0eXBlb2YgZWxlbWVudCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIGVsZW1lbnQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGVsZW1lbnQpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBIVE1MQ2FudmFzRWxlbWVudCB8fFxuICAgICAgICAgICAgZWxlbWVudCBpbnN0YW5jZW9mIEhUTUxJbWFnZUVsZW1lbnQgfHxcbiAgICAgICAgICAgIGVsZW1lbnQgaW5zdGFuY2VvZiBIVE1MVmlkZW9FbGVtZW50KSB7XG4gICAgICAgICAgICB0aGlzLnNvdXJjZSA9IGVsZW1lbnQ7XG4gICAgICAgICAgICB0aGlzLnNvdXJjZV90eXBlID0gJ2VsZW1lbnQnO1xuXG4gICAgICAgICAgICB0aGlzLnVwZGF0ZShvcHRpb25zKTtcbiAgICAgICAgICAgIHRoaXMuc2V0RmlsdGVyaW5nKG9wdGlvbnMpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5sb2FkZWQgPSBmYWxzZTtcbiAgICAgICAgICAgIGxldCBtc2cgPSBgdGhlICdlbGVtZW50JyBwYXJhbWV0ZXIgKFxcYGVsZW1lbnQ6ICR7SlNPTi5zdHJpbmdpZnkoZWwpfVxcYCkgbXVzdCBiZSBhIENTUyBgO1xuICAgICAgICAgICAgbXNnICs9IGBzZWxlY3RvciBzdHJpbmcsIG9yIGEgPGNhbnZhcz4sIDxpbWFnZT4gb3IgPHZpZGVvPiBvYmplY3RgO1xuICAgICAgICAgICAgbG9nKCd3YXJuJywgYFRleHR1cmUgJyR7dGhpcy5uYW1lfSc6ICR7bXNnfWAsIG9wdGlvbnMpO1xuICAgICAgICAgICAgVGV4dHVyZS50cmlnZ2VyKCd3YXJuaW5nJywgeyBtZXNzYWdlOiBgRmFpbGVkIHRvIGxvYWQgdGV4dHVyZSBiZWNhdXNlICR7bXNnfWAsIHRleHR1cmU6IG9wdGlvbnMgfSk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmxvYWRlZCA9IHRydWU7XG4gICAgICAgIHRoaXMubG9hZGluZyA9IFByb21pc2UucmVzb2x2ZSh0aGlzKTtcbiAgICAgICAgcmV0dXJuIHRoaXMubG9hZGluZztcbiAgICB9XG5cbiAgICAvLyBVcGxvYWRzIGN1cnJlbnQgaW1hZ2Ugb3IgYnVmZmVyIHRvIHRoZSBHUFUgKGNhbiBiZSB1c2VkIHRvIHVwZGF0ZSBhbmltYXRlZCB0ZXh0dXJlcyBvbiB0aGUgZmx5KVxuICAgIHVwZGF0ZShvcHRpb25zID0ge30pIHtcbiAgICAgICAgaWYgKCF0aGlzLnZhbGlkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmJpbmQoKTtcbiAgICAgICAgdGhpcy5nbC5waXhlbFN0b3JlaSh0aGlzLmdsLlVOUEFDS19GTElQX1lfV0VCR0wsIChvcHRpb25zLlVOUEFDS19GTElQX1lfV0VCR0wgPT09IGZhbHNlID8gZmFsc2UgOiB0cnVlKSk7XG4gICAgICAgIHRoaXMuZ2wucGl4ZWxTdG9yZWkodGhpcy5nbC5VTlBBQ0tfUFJFTVVMVElQTFlfQUxQSEFfV0VCR0wsIG9wdGlvbnMuVU5QQUNLX1BSRU1VTFRJUExZX0FMUEhBX1dFQkdMIHx8IGZhbHNlKTtcblxuICAgICAgICAvLyBJbWFnZSBvciBDYW52YXMgZWxlbWVudFxuICAgICAgICBpZiAodGhpcy5zb3VyY2UgaW5zdGFuY2VvZiBIVE1MQ2FudmFzRWxlbWVudCB8fCB0aGlzLnNvdXJjZSBpbnN0YW5jZW9mIEhUTUxWaWRlb0VsZW1lbnQgfHxcbiAgICAgICAgICAgICh0aGlzLnNvdXJjZSBpbnN0YW5jZW9mIEhUTUxJbWFnZUVsZW1lbnQgJiYgdGhpcy5zb3VyY2UuY29tcGxldGUpKSB7XG5cbiAgICAgICAgICAgIHRoaXMud2lkdGggPSB0aGlzLnNvdXJjZS53aWR0aDtcbiAgICAgICAgICAgIHRoaXMuaGVpZ2h0ID0gdGhpcy5zb3VyY2UuaGVpZ2h0O1xuICAgICAgICAgICAgdGhpcy5nbC50ZXhJbWFnZTJEKHRoaXMuZ2wuVEVYVFVSRV8yRCwgMCwgdGhpcy5nbC5SR0JBLCB0aGlzLmdsLlJHQkEsIHRoaXMuZ2wuVU5TSUdORURfQllURSwgdGhpcy5zb3VyY2UpO1xuICAgICAgICB9XG4gICAgICAgIC8vIFJhdyBpbWFnZSBidWZmZXJcbiAgICAgICAgZWxzZSBpZiAodGhpcy5zb3VyY2VfdHlwZSA9PT0gJ2RhdGEnKSB7XG4gICAgICAgICAgICB0aGlzLmdsLnRleEltYWdlMkQodGhpcy5nbC5URVhUVVJFXzJELCAwLCB0aGlzLmdsLlJHQkEsIHRoaXMud2lkdGgsIHRoaXMuaGVpZ2h0LCAwLCB0aGlzLmdsLlJHQkEsIHRoaXMuZ2wuVU5TSUdORURfQllURSwgdGhpcy5zb3VyY2UpO1xuICAgICAgICB9XG5cbiAgICAgICAgVGV4dHVyZS50cmlnZ2VyKCd1cGRhdGUnLCB0aGlzKTtcbiAgICB9XG5cbiAgICAvLyBEZXRlcm1pbmVzIGFwcHJvcHJpYXRlIGZpbHRlcmluZyBtb2RlXG4gICAgc2V0RmlsdGVyaW5nKG9wdGlvbnMgPSB7fSkge1xuICAgICAgICBpZiAoIXRoaXMudmFsaWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIG9wdGlvbnMuZmlsdGVyaW5nID0gb3B0aW9ucy5maWx0ZXJpbmcgfHwgJ2xpbmVhcic7XG5cbiAgICAgICAgdmFyIGdsID0gdGhpcy5nbDtcbiAgICAgICAgdGhpcy5iaW5kKCk7XG5cbiAgICAgICAgLy8gRm9yIHBvd2VyLW9mLTIgdGV4dHVyZXMsIHRoZSBmb2xsb3dpbmcgcHJlc2V0cyBhcmUgYXZhaWxhYmxlOlxuICAgICAgICAvLyBtaXBtYXA6IGxpbmVhciBibGVuZCBmcm9tIG5lYXJlc3QgbWlwXG4gICAgICAgIC8vIGxpbmVhcjogbGluZWFyIGJsZW5kIGZyb20gb3JpZ2luYWwgaW1hZ2UgKG5vIG1pcHMpXG4gICAgICAgIC8vIG5lYXJlc3Q6IG5lYXJlc3QgcGl4ZWwgZnJvbSBvcmlnaW5hbCBpbWFnZSAobm8gbWlwcywgJ2Jsb2NreScgbG9vaylcbiAgICAgICAgaWYgKFV0aWxzLmlzUG93ZXJPZjIodGhpcy53aWR0aCkgJiYgVXRpbHMuaXNQb3dlck9mMih0aGlzLmhlaWdodCkpIHtcbiAgICAgICAgICAgIHRoaXMucG93ZXJfb2ZfMiA9IHRydWU7XG4gICAgICAgICAgICBnbC50ZXhQYXJhbWV0ZXJpKGdsLlRFWFRVUkVfMkQsIGdsLlRFWFRVUkVfV1JBUF9TLCBvcHRpb25zLlRFWFRVUkVfV1JBUF9TIHx8IChvcHRpb25zLnJlcGVhdCAmJiBnbC5SRVBFQVQpIHx8IGdsLkNMQU1QX1RPX0VER0UpO1xuICAgICAgICAgICAgZ2wudGV4UGFyYW1ldGVyaShnbC5URVhUVVJFXzJELCBnbC5URVhUVVJFX1dSQVBfVCwgb3B0aW9ucy5URVhUVVJFX1dSQVBfVCB8fCAob3B0aW9ucy5yZXBlYXQgJiYgZ2wuUkVQRUFUKSB8fCBnbC5DTEFNUF9UT19FREdFKTtcblxuICAgICAgICAgICAgaWYgKG9wdGlvbnMuZmlsdGVyaW5nID09PSAnbWlwbWFwJykge1xuICAgICAgICAgICAgICAgIHRoaXMuZmlsdGVyaW5nID0gJ21pcG1hcCc7XG4gICAgICAgICAgICAgICAgZ2wudGV4UGFyYW1ldGVyaShnbC5URVhUVVJFXzJELCBnbC5URVhUVVJFX01JTl9GSUxURVIsIGdsLkxJTkVBUl9NSVBNQVBfTElORUFSKTsgLy8gVE9ETzogdXNlIHRyaWxpbmVhciBmaWx0ZXJpbmcgYnkgZGVmdWFsdCBpbnN0ZWFkP1xuICAgICAgICAgICAgICAgIGdsLnRleFBhcmFtZXRlcmkoZ2wuVEVYVFVSRV8yRCwgZ2wuVEVYVFVSRV9NQUdfRklMVEVSLCBnbC5MSU5FQVIpO1xuICAgICAgICAgICAgICAgIGdsLmdlbmVyYXRlTWlwbWFwKGdsLlRFWFRVUkVfMkQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAob3B0aW9ucy5maWx0ZXJpbmcgPT09ICdsaW5lYXInKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5maWx0ZXJpbmcgPSAnbGluZWFyJztcbiAgICAgICAgICAgICAgICBnbC50ZXhQYXJhbWV0ZXJpKGdsLlRFWFRVUkVfMkQsIGdsLlRFWFRVUkVfTUlOX0ZJTFRFUiwgZ2wuTElORUFSKTtcbiAgICAgICAgICAgICAgICBnbC50ZXhQYXJhbWV0ZXJpKGdsLlRFWFRVUkVfMkQsIGdsLlRFWFRVUkVfTUFHX0ZJTFRFUiwgZ2wuTElORUFSKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKG9wdGlvbnMuZmlsdGVyaW5nID09PSAnbmVhcmVzdCcpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmZpbHRlcmluZyA9ICduZWFyZXN0JztcbiAgICAgICAgICAgICAgICBnbC50ZXhQYXJhbWV0ZXJpKGdsLlRFWFRVUkVfMkQsIGdsLlRFWFRVUkVfTUlOX0ZJTFRFUiwgZ2wuTkVBUkVTVCk7XG4gICAgICAgICAgICAgICAgZ2wudGV4UGFyYW1ldGVyaShnbC5URVhUVVJFXzJELCBnbC5URVhUVVJFX01BR19GSUxURVIsIGdsLk5FQVJFU1QpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgLy8gV2ViR0wgaGFzIHN0cmljdCByZXF1aXJlbWVudHMgb24gbm9uLXBvd2VyLW9mLTIgdGV4dHVyZXM6XG4gICAgICAgICAgICAvLyBObyBtaXBtYXBzIGFuZCBtdXN0IGNsYW1wIHRvIGVkZ2VcbiAgICAgICAgICAgIHRoaXMucG93ZXJfb2ZfMiA9IGZhbHNlO1xuICAgICAgICAgICAgZ2wudGV4UGFyYW1ldGVyaShnbC5URVhUVVJFXzJELCBnbC5URVhUVVJFX1dSQVBfUywgZ2wuQ0xBTVBfVE9fRURHRSk7XG4gICAgICAgICAgICBnbC50ZXhQYXJhbWV0ZXJpKGdsLlRFWFRVUkVfMkQsIGdsLlRFWFRVUkVfV1JBUF9ULCBnbC5DTEFNUF9UT19FREdFKTtcblxuICAgICAgICAgICAgaWYgKG9wdGlvbnMuZmlsdGVyaW5nID09PSAnbmVhcmVzdCcpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmZpbHRlcmluZyA9ICduZWFyZXN0JztcbiAgICAgICAgICAgICAgICBnbC50ZXhQYXJhbWV0ZXJpKGdsLlRFWFRVUkVfMkQsIGdsLlRFWFRVUkVfTUlOX0ZJTFRFUiwgZ2wuTkVBUkVTVCk7XG4gICAgICAgICAgICAgICAgZ2wudGV4UGFyYW1ldGVyaShnbC5URVhUVVJFXzJELCBnbC5URVhUVVJFX01BR19GSUxURVIsIGdsLk5FQVJFU1QpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7IC8vIGRlZmF1bHQgdG8gbGluZWFyIGZvciBub24tcG93ZXItb2YtMiB0ZXh0dXJlc1xuICAgICAgICAgICAgICAgIHRoaXMuZmlsdGVyaW5nID0gJ2xpbmVhcic7XG4gICAgICAgICAgICAgICAgZ2wudGV4UGFyYW1ldGVyaShnbC5URVhUVVJFXzJELCBnbC5URVhUVVJFX01JTl9GSUxURVIsIGdsLkxJTkVBUik7XG4gICAgICAgICAgICAgICAgZ2wudGV4UGFyYW1ldGVyaShnbC5URVhUVVJFXzJELCBnbC5URVhUVVJFX01BR19GSUxURVIsIGdsLkxJTkVBUik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBUZXh0dXJlLnRyaWdnZXIoJ3VwZGF0ZScsIHRoaXMpO1xuICAgIH1cblxuICAgIC8vIFByZS1jYWxjIHNwcml0ZSByZWdpb25zIGZvciBhIHRleHR1cmUgc3ByaXRlIGluIFVWIFswLCAxXSBzcGFjZVxuICAgIGNhbGN1bGF0ZVNwcml0ZXMoKSB7XG4gICAgICAgIGlmICh0aGlzLnNwcml0ZXMpIHtcbiAgICAgICAgICAgIGZvciAobGV0IHMgaW4gdGhpcy5zcHJpdGVzKSB7XG4gICAgICAgICAgICAgICAgbGV0IHNwcml0ZSA9IHRoaXMuc3ByaXRlc1tzXTtcblxuICAgICAgICAgICAgICAgIC8vIE1hcCBbMCwgMF0gdG8gWzEsIDFdIGNvb3JkcyB0byB0aGUgYXBwcm9wcmlhdGUgc3ByaXRlIHN1Yi1hcmVhIG9mIHRoZSB0ZXh0dXJlXG4gICAgICAgICAgICAgICAgdGhpcy50ZXhjb29yZHNbc10gPSBUZXh0dXJlLmdldFRleGNvb3Jkc0ZvclNwcml0ZShcbiAgICAgICAgICAgICAgICAgICAgW3Nwcml0ZVswXSwgc3ByaXRlWzFdXSxcbiAgICAgICAgICAgICAgICAgICAgW3Nwcml0ZVsyXSwgc3ByaXRlWzNdXSxcbiAgICAgICAgICAgICAgICAgICAgW3RoaXMud2lkdGgsIHRoaXMuaGVpZ2h0XVxuICAgICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgICAgICAvLyBQaXhlbCBzaXplIG9mIHNwcml0ZVxuICAgICAgICAgICAgICAgIHRoaXMuc2l6ZXNbc10gPSBbc3ByaXRlWzJdLCBzcHJpdGVbM11dO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG59XG5cblxuLy8gU3RhdGljL2NsYXNzIG1ldGhvZHMgYW5kIHN0YXRlXG5cblRleHR1cmUuY3JlYXRlID0gZnVuY3Rpb24gKGdsLCBuYW1lLCBvcHRpb25zKSB7XG4gICAgcmV0dXJuIG5ldyBUZXh0dXJlKGdsLCBuYW1lLCBvcHRpb25zKTtcbn07XG5cblRleHR1cmUucmV0YWluID0gZnVuY3Rpb24gKG5hbWUpIHtcbiAgICBpZiAoVGV4dHVyZS50ZXh0dXJlc1tuYW1lXSkge1xuICAgICAgICBUZXh0dXJlLnRleHR1cmVzW25hbWVdLnJldGFpbigpO1xuICAgIH1cbn07XG5cblRleHR1cmUucmVsZWFzZSA9IGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgaWYgKFRleHR1cmUudGV4dHVyZXNbbmFtZV0pIHtcbiAgICAgICAgVGV4dHVyZS50ZXh0dXJlc1tuYW1lXS5yZWxlYXNlKCk7XG4gICAgfVxufTtcblxuLy8gRGVzdHJveSBhbGwgdGV4dHVyZSBpbnN0YW5jZXMgZm9yIGEgZ2l2ZW4gR0wgY29udGV4dFxuVGV4dHVyZS5kZXN0cm95ID0gZnVuY3Rpb24gKGdsKSB7XG4gICAgdmFyIHRleHR1cmVzID0gT2JqZWN0LmtleXMoVGV4dHVyZS50ZXh0dXJlcyk7XG4gICAgdGV4dHVyZXMuZm9yRWFjaCh0ID0+IHtcbiAgICAgICAgdmFyIHRleHR1cmUgPSBUZXh0dXJlLnRleHR1cmVzW3RdO1xuICAgICAgICBpZiAodGV4dHVyZS5nbCA9PT0gZ2wpIHtcbiAgICAgICAgICAgIHRleHR1cmUuZGVzdHJveSh7IGZvcmNlOiB0cnVlIH0pO1xuICAgICAgICB9XG4gICAgfSk7XG59O1xuXG4vLyBHZXQgc3ByaXRlIHBpeGVsIHNpemUgYW5kIFVWc1xuVGV4dHVyZS5nZXRTcHJpdGVJbmZvID0gZnVuY3Rpb24gKHRleG5hbWUsIHNwcml0ZSkge1xuICAgIGxldCB0ZXh0dXJlID0gVGV4dHVyZS50ZXh0dXJlc1t0ZXhuYW1lXTtcbiAgICByZXR1cm4gdGV4dHVyZSAmJiB7IHNpemU6IHRleHR1cmUuc2l6ZXNbc3ByaXRlXSwgdGV4Y29vcmRzOiB0ZXh0dXJlLnRleGNvb3Jkc1tzcHJpdGVdIH07XG59O1xuXG4vLyBSZS1zY2FsZSBVVnMgZnJvbSBbMCwgMV0gcmFuZ2UgdG8gYSBzbWFsbGVyIGFyZWEgd2l0aGluIHRoZSBpbWFnZVxuVGV4dHVyZS5nZXRUZXhjb29yZHNGb3JTcHJpdGUgPSBmdW5jdGlvbiAoYXJlYV9vcmlnaW4sIGFyZWFfc2l6ZSwgdGV4X3NpemUpIHtcbiAgICB2YXIgYXJlYV9vcmlnaW5feSA9IHRleF9zaXplWzFdIC0gYXJlYV9vcmlnaW5bMV0gLSBhcmVhX3NpemVbMV07XG5cbiAgICByZXR1cm4gW1xuICAgICAgICBhcmVhX29yaWdpblswXSAvIHRleF9zaXplWzBdLFxuICAgICAgICBhcmVhX29yaWdpbl95IC8gdGV4X3NpemVbMV0sXG4gICAgICAgIChhcmVhX3NpemVbMF0gKyBhcmVhX29yaWdpblswXSkgLyB0ZXhfc2l6ZVswXSxcbiAgICAgICAgKGFyZWFfc2l6ZVsxXSArIGFyZWFfb3JpZ2luX3kpIC8gdGV4X3NpemVbMV1cbiAgICBdO1xufTtcblxuLy8gQ3JlYXRlIGEgc2V0IG9mIHRleHR1cmVzIGtleWVkIGluIGFuIG9iamVjdFxuLy8gT3B0aW9uYWxseSBsb2FkIGVhY2ggaWYgaXQgaGFzIGEgVVJMIHNwZWNpZmllZFxuVGV4dHVyZS5jcmVhdGVGcm9tT2JqZWN0ID0gZnVuY3Rpb24gKGdsLCB0ZXh0dXJlcykge1xuICAgIGxldCBsb2FkaW5nID0gW107XG4gICAgaWYgKHRleHR1cmVzKSB7XG4gICAgICAgIGZvciAobGV0IHRleG5hbWUgaW4gdGV4dHVyZXMpIHtcbiAgICAgICAgICAgIGxldCBjb25maWcgPSB0ZXh0dXJlc1t0ZXhuYW1lXTtcblxuICAgICAgICAgICAgLy8gSWYgdGV4dHVyZSBhbHJlYWR5IGV4aXN0cyBhbmQgZGVmaW5pdGlvbiBoYXNuJ3QgY2hhbmdlZCwgbm8gbmVlZCB0byByZS1jcmVhdGVcbiAgICAgICAgICAgIC8vIE5vdGU6IHRvIGF2b2lkIGZsaWNrZXIgd2hlbiBvdGhlciB0ZXh0dXJlcy9zY2VuZSBpdGVtcyBjaGFuZ2VcbiAgICAgICAgICAgIGlmICghVGV4dHVyZS5jaGFuZ2VkKHRleG5hbWUsIGNvbmZpZykpIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgbGV0IHRleHR1cmUgPSBUZXh0dXJlLmNyZWF0ZShnbCwgdGV4bmFtZSwgY29uZmlnKTtcbiAgICAgICAgICAgIGxvYWRpbmcucHVzaCh0ZXh0dXJlLmxvYWRpbmcpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBQcm9taXNlLmFsbChsb2FkaW5nKTtcbn07XG5cbi8vIENyZWF0ZSBhICdkZWZhdWx0JyB0ZXh0dXJlICgxeDEgcGl4ZWwpIHRoYXQgY2FuIGJlIHVzZWQgYXMgYSBwbGFjZWhvbGRlclxuLy8gKGZvciBleGFtcGxlIHRvIHByZXZlbnQgR0wgZnJvbSBjb21wbGFpbmluZyBhYm91dCB1bmJvdW5kIHRleHR1cmVzKVxuVGV4dHVyZS5kZWZhdWx0ID0gJ19fZGVmYXVsdCc7XG5UZXh0dXJlLmNyZWF0ZURlZmF1bHQgPSBmdW5jdGlvbiAoZ2wpIHtcbiAgICByZXR1cm4gVGV4dHVyZS5jcmVhdGUoZ2wsIFRleHR1cmUuZGVmYXVsdCk7XG59O1xuXG4vLyBJbmRpY2F0ZSBpZiBhIHRleHR1cmUgZGVmaW5pdGlvbiB3b3VsZCBiZSBhIGNoYW5nZSBmcm9tIHRoZSBjdXJyZW50IGNhY2hlXG5UZXh0dXJlLmNoYW5nZWQgPSBmdW5jdGlvbiAobmFtZSwgY29uZmlnKSB7XG4gICAgbGV0IHRleHR1cmUgPSBUZXh0dXJlLnRleHR1cmVzW25hbWVdO1xuICAgIGlmICh0ZXh0dXJlKSB7IC8vIGNhY2hlZCB0ZXh0dXJlXG4gICAgICAgIC8vIGNhbnZhcy9pbWFnZS1iYXNlZCB0ZXh0dXJlcyBhcmUgY29uc2lkZXJlZCBkeW5hbWljIGFuZCBhbHdheXMgcmVmcmVzaFxuICAgICAgICBpZiAodGV4dHVyZS5jb25maWdfdHlwZSA9PT0gJ2VsZW1lbnQnIHx8IGNvbmZpZy5lbGVtZW50ICE9IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gY29tcGFyZSBkZWZpbml0aW9uc1xuICAgICAgICBpZiAoSlNPTi5zdHJpbmdpZnkoVGV4dHVyZS50ZXh0dXJlX2NvbmZpZ3NbbmFtZV0pID09PVxuICAgICAgICAgICAgSlNPTi5zdHJpbmdpZnkoT2JqZWN0LmFzc2lnbih7IG5hbWUgfSwgY29uZmlnKSkpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbn07XG5cbi8vIEdldCBtZXRhZGF0YSBmb3IgYSB0ZXh0dXJlIGJ5IG5hbWVcbi8vIFJldHVybnMgdmlhIHByb21pc2UsIGluIGNhc2UgdGV4dHVyZSBpcyBzdGlsbCBsb2FkaW5nXG4vLyBDYW4gYmUgY2FsbGVkIG9uIG1haW4gdGhyZWFkIGZyb20gd29ya2VyLCB0byBzeW5jIHRleHR1cmUgaW5mbyB0byB3b3JrZXJcblRleHR1cmUuZ2V0SW5mbyA9IGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgLy8gR2V0IGluZm8gZm9yIGFsbCB0ZXh0dXJlcyBieSBkZWZhdWx0XG4gICAgaWYgKCFuYW1lKSB7XG4gICAgICAgIG5hbWUgPSBPYmplY3Qua2V5cyhUZXh0dXJlLnRleHR1cmVzKTtcbiAgICB9XG5cbiAgICAvLyBHZXQgbXVsdGlwbGUgdGV4dHVyZXNcbiAgICBpZiAoQXJyYXkuaXNBcnJheShuYW1lKSkge1xuICAgICAgICByZXR1cm4gUHJvbWlzZS5hbGwobmFtZS5tYXAobiA9PiBUZXh0dXJlLmdldEluZm8obikpKTtcbiAgICB9XG5cbiAgICAvLyBHZXQgc2luZ2xlIHRleHR1cmVcbiAgICB2YXIgdGV4ID0gVGV4dHVyZS50ZXh0dXJlc1tuYW1lXTtcbiAgICBpZiAodGV4KSB7XG4gICAgICAgIC8vIFdhaXQgZm9yIHRoaXMgdGV4dHVyZSB0byBmaW5pc2ggbG9hZGluZywgb3IgcmV0dXJuIGltbWVkaWF0ZWx5XG4gICAgICAgIHZhciBsb2FkaW5nID0gdGV4LmxvYWRpbmcgfHwgUHJvbWlzZS5yZXNvbHZlKHRleCk7XG4gICAgICAgIHJldHVybiBsb2FkaW5nLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgLy8gUmV0dXJuIGEgc3Vic2V0IG9mIHRleHR1cmUgaW5mb1xuICAgICAgICAgICAgLy8gKGNvbXBhdGlibGUgdy9zdHJ1Y3R1cmVkIGNsb25pbmcsIHN1aXRhYmxlIGZvciBwYXNzaW5nIHRvIGEgd29ya2VyKVxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBuYW1lOiB0ZXgubmFtZSxcbiAgICAgICAgICAgICAgICB3aWR0aDogdGV4LndpZHRoLFxuICAgICAgICAgICAgICAgIGhlaWdodDogdGV4LmhlaWdodCxcbiAgICAgICAgICAgICAgICBzcHJpdGVzOiB0ZXguc3ByaXRlcyxcbiAgICAgICAgICAgICAgICB0ZXhjb29yZHM6IHRleC50ZXhjb29yZHMsXG4gICAgICAgICAgICAgICAgc2l6ZXM6IHRleC5zaXplcyxcbiAgICAgICAgICAgICAgICBmaWx0ZXJpbmc6IHRleC5maWx0ZXJpbmcsXG4gICAgICAgICAgICAgICAgcG93ZXJfb2ZfMjogdGV4LnBvd2VyX29mXzIsXG4gICAgICAgICAgICAgICAgdmFsaWQ6IHRleC52YWxpZFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICAvLyBObyB0ZXh0dXJlIGZvdW5kXG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUobnVsbCk7XG4gICAgfVxufTtcblxuLy8gU3luYyB0ZXh0dXJlIGluZm8gdG8gd29ya2VyXG4vLyBDYWxsZWQgZnJvbSB3b3JrZXIsIGdldHMgaW5mbyBvbiBvbmUgb3IgbW9yZSB0ZXh0dXJlcyBpbmZvIGZyb20gbWFpbiB0aHJlYWQgdmlhIHJlbW90ZSBjYWxsLCB0aGVuIHN0b3JlcyBpdFxuLy8gbG9jYWxseSBpbiB3b3JrZXIuICd0ZXh0dXJlcycgY2FuIGJlIGFuIGFycmF5IG9mIHRleHR1cmUgbmFtZXMgdG8gc3luYywgb3IgaWYgbnVsbCwgYWxsIHRleHR1cmVzIGFyZSBzeW5jZWQuXG5UZXh0dXJlLnN5bmNUZXh0dXJlc1RvV29ya2VyID0gZnVuY3Rpb24gKG5hbWVzKSB7XG4gICAgcmV0dXJuIFdvcmtlckJyb2tlci5wb3N0TWVzc2FnZSgnVGV4dHVyZS5nZXRJbmZvJywgbmFtZXMpLlxuICAgICAgICB0aGVuKHRleHR1cmVzID0+IHtcbiAgICAgICAgICAgIHRleHR1cmVzLmZvckVhY2godGV4ID0+IHtcbiAgICAgICAgICAgICAgICBUZXh0dXJlLnRleHR1cmVzW3RleC5uYW1lXSA9IHRleDtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuIFRleHR1cmUudGV4dHVyZXM7XG4gICAgICAgIH0pO1xufTtcblxuLy8gUmVwb3J0IG1heCB0ZXh0dXJlIHNpemUgZm9yIGEgR0wgY29udGV4dFxuVGV4dHVyZS5nZXRNYXhUZXh0dXJlU2l6ZSA9IGZ1bmN0aW9uIChnbCkge1xuICAgIHJldHVybiBnbC5nZXRQYXJhbWV0ZXIoZ2wuTUFYX1RFWFRVUkVfU0laRSk7XG59O1xuXG4vLyBHbG9iYWwgc2V0IG9mIHRleHR1cmVzLCBieSBuYW1lXG5UZXh0dXJlLnRleHR1cmVzID0ge307XG5UZXh0dXJlLnRleHR1cmVfY29uZmlncyA9IHt9O1xuVGV4dHVyZS5ib3VuZFRleHR1cmUgPSBudWxsO1xuVGV4dHVyZS5hY3RpdmVVbml0ID0gbnVsbDtcblxuV29ya2VyQnJva2VyLmFkZFRhcmdldCgnVGV4dHVyZScsIFRleHR1cmUpO1xuc3Vic2NyaWJlTWl4aW4oVGV4dHVyZSk7XG4iLCIvLyBDcmVhdGVzIGEgVmVydGV4IEFycmF5IE9iamVjdCBpZiB0aGUgZXh0ZW5zaW9uIGlzIGF2YWlsYWJsZSwgb3IgZmFsbHMgYmFjayBvbiBzdGFuZGFyZCBhdHRyaWJ1dGUgY2FsbHNcblxuaW1wb3J0IGdldEV4dGVuc2lvbiBmcm9tICcuL2V4dGVuc2lvbnMnO1xuaW1wb3J0IGxvZyBmcm9tICcuLi91dGlscy9sb2cnO1xuXG5leHBvcnQgZGVmYXVsdCB7XG5cbiAgICBkaXNhYmxlZDogZmFsc2UsIC8vIHNldCB0byB0cnVlIHRvIGRpc2FibGUgVkFPcyBldmVuIGlmIGV4dGVuc2lvbiBpcyBhdmFpbGFibGVcbiAgICBib3VuZF92YW86IFtdLCAgIC8vIGN1cnJlbnRseSBib3VuZCBWQU8sIGJ5IEdMIGNvbnRleHRcblxuICAgIGluaXQgKGdsKSB7XG4gICAgICAgIGxldCBleHQ7XG4gICAgICAgIGlmICh0aGlzLmRpc2FibGVkICE9PSB0cnVlKSB7XG4gICAgICAgICAgICBleHQgPSBnZXRFeHRlbnNpb24oZ2wsICdPRVNfdmVydGV4X2FycmF5X29iamVjdCcpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGV4dCAhPSBudWxsKSB7XG4gICAgICAgICAgICBsb2coJ2luZm8nLCAnVmVydGV4IEFycmF5IE9iamVjdCBleHRlbnNpb24gYXZhaWxhYmxlJyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodGhpcy5kaXNhYmxlZCAhPT0gdHJ1ZSkge1xuICAgICAgICAgICAgbG9nKCd3YXJuJywgJ1ZlcnRleCBBcnJheSBPYmplY3QgZXh0ZW5zaW9uIE5PVCBhdmFpbGFibGUnKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGxvZygnd2FybicsICdWZXJ0ZXggQXJyYXkgT2JqZWN0IGV4dGVuc2lvbiBmb3JjZSBkaXNhYmxlZCcpO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIGNyZWF0ZSAoZ2wsIHNldHVwLCB0ZWFyZG93bikge1xuICAgICAgICBsZXQgdmFvID0ge307XG4gICAgICAgIHZhby5zZXR1cCA9IHNldHVwO1xuICAgICAgICB2YW8udGVhcmRvd24gPSB0ZWFyZG93bjtcblxuICAgICAgICBsZXQgZXh0ID0gZ2V0RXh0ZW5zaW9uKGdsLCAnT0VTX3ZlcnRleF9hcnJheV9vYmplY3QnKTtcbiAgICAgICAgaWYgKGV4dCAhPSBudWxsKSB7XG4gICAgICAgICAgICB2YW8uX3ZhbyA9IGV4dC5jcmVhdGVWZXJ0ZXhBcnJheU9FUygpO1xuICAgICAgICAgICAgZXh0LmJpbmRWZXJ0ZXhBcnJheU9FUyh2YW8uX3Zhbyk7XG4gICAgICAgIH1cblxuICAgICAgICB2YW8uc2V0dXAodHJ1ZSk7XG5cbiAgICAgICAgcmV0dXJuIHZhbztcbiAgICB9LFxuXG4gICAgZ2V0Q3VycmVudEJpbmRpbmcgKGdsKSB7XG4gICAgICAgIGxldCBib3VuZCA9IHRoaXMuYm91bmRfdmFvLmZpbHRlcihlID0+IGVbMF0gPT09IGdsKVswXTtcbiAgICAgICAgcmV0dXJuIGJvdW5kICYmIGJvdW5kWzFdO1xuICAgIH0sXG5cbiAgICBzZXRDdXJyZW50QmluZGluZyAoZ2wsIHZhbykge1xuICAgICAgICBsZXQgYm91bmRfdmFvID0gdGhpcy5ib3VuZF92YW87XG4gICAgICAgIGxldCBiaW5kaW5nID0gYm91bmRfdmFvLmZpbHRlcihlID0+IGVbMF0gPT09IGdsKVswXTtcbiAgICAgICAgaWYgKGJpbmRpbmcgPT0gbnVsbCkge1xuICAgICAgICAgICAgYm91bmRfdmFvLnB1c2goW2dsLCB2YW9dKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGJpbmRpbmdbMV0gPSB2YW87XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgYmluZCAoZ2wsIHZhbykge1xuICAgICAgICBsZXQgZXh0ID0gZ2V0RXh0ZW5zaW9uKGdsLCAnT0VTX3ZlcnRleF9hcnJheV9vYmplY3QnKTtcbiAgICAgICAgaWYgKHZhbyAhPSBudWxsKSB7XG4gICAgICAgICAgICBpZiAoZXh0ICE9IG51bGwgJiYgdmFvLl92YW8gIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGV4dC5iaW5kVmVydGV4QXJyYXlPRVModmFvLl92YW8pO1xuICAgICAgICAgICAgICAgIHRoaXMuc2V0Q3VycmVudEJpbmRpbmcoZ2wsIHZhbyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB2YW8uc2V0dXAoZmFsc2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgbGV0IGJvdW5kX3ZhbyA9IHRoaXMuZ2V0Q3VycmVudEJpbmRpbmcoZ2wpO1xuICAgICAgICAgICAgaWYgKGV4dCAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgZXh0LmJpbmRWZXJ0ZXhBcnJheU9FUyhudWxsKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGJvdW5kX3ZhbyAhPSBudWxsICYmIHR5cGVvZiBib3VuZF92YW8udGVhcmRvd24gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICBib3VuZF92YW8udGVhcmRvd24oKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuc2V0Q3VycmVudEJpbmRpbmcoZ2wsIG51bGwpO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIGRlc3Ryb3kgKGdsLCB2YW8pIHtcbiAgICAgICAgbGV0IGV4dCA9IGdldEV4dGVuc2lvbihnbCwgJ09FU192ZXJ0ZXhfYXJyYXlfb2JqZWN0Jyk7XG4gICAgICAgIGlmIChleHQgIT0gbnVsbCAmJiB2YW8gIT0gbnVsbCAmJiB2YW8uX3ZhbyAhPSBudWxsKSB7XG4gICAgICAgICAgICBleHQuZGVsZXRlVmVydGV4QXJyYXlPRVModmFvLl92YW8pO1xuICAgICAgICAgICAgdmFvLl92YW8gPSBudWxsO1xuICAgICAgICB9XG4gICAgICAgIC8vIGRlc3Ryb3kgaXMgYSBuby1vcCBpZiBWQU8gZXh0ZW5zaW9uIGlzbid0IGF2YWlsYWJsZVxuICAgIH1cblxufTtcbiIsIi8vIE1hbmFnZSByZW5kZXJpbmcgZm9yIHByaW1pdGl2ZXNcbmltcG9ydCBsb2cgZnJvbSAnLi4vdXRpbHMvbG9nJztcbmltcG9ydCBTaGFkZXJQcm9ncmFtIGZyb20gJy4vc2hhZGVyX3Byb2dyYW0nO1xuaW1wb3J0IFZlcnRleEFycmF5T2JqZWN0IGZyb20gJy4vdmFvJztcblxuLy8gQSBzaW5nbGUgbWVzaC9WQk8sIGRlc2NyaWJlZCBieSBhIHZlcnRleCBsYXlvdXQsIHRoYXQgY2FuIGJlIGRyYXduIHdpdGggb25lIG9yIG1vcmUgcHJvZ3JhbXNcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFZCT01lc2ggIHtcblxuICAgIGNvbnN0cnVjdG9yKGdsLCB2ZXJ0ZXhfZGF0YSwgZWxlbWVudF9kYXRhLCB2ZXJ0ZXhfbGF5b3V0LCBvcHRpb25zKSB7XG4gICAgICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuXG4gICAgICAgIHRoaXMuZ2wgPSBnbDtcbiAgICAgICAgdGhpcy52ZXJ0ZXhfZGF0YSA9IHZlcnRleF9kYXRhOyAvLyB0eXBlZCBhcnJheVxuICAgICAgICB0aGlzLmVsZW1lbnRfZGF0YSA9IGVsZW1lbnRfZGF0YTsgLy8gdHlwZWQgYXJyYXlcbiAgICAgICAgdGhpcy52ZXJ0ZXhfbGF5b3V0ID0gdmVydGV4X2xheW91dDtcbiAgICAgICAgdGhpcy52ZXJ0ZXhfYnVmZmVyID0gdGhpcy5nbC5jcmVhdGVCdWZmZXIoKTtcbiAgICAgICAgdGhpcy5kcmF3X21vZGUgPSBvcHRpb25zLmRyYXdfbW9kZSB8fCB0aGlzLmdsLlRSSUFOR0xFUztcbiAgICAgICAgdGhpcy5kYXRhX3VzYWdlID0gb3B0aW9ucy5kYXRhX3VzYWdlIHx8IHRoaXMuZ2wuU1RBVElDX0RSQVc7XG4gICAgICAgIHRoaXMudmVydGljZXNfcGVyX2dlb21ldHJ5ID0gMzsgLy8gVE9ETzogc3VwcG9ydCBsaW5lcywgc3RyaXAsIGZhbiwgZXRjLlxuICAgICAgICB0aGlzLnVuaWZvcm1zID0gb3B0aW9ucy51bmlmb3JtcztcbiAgICAgICAgdGhpcy5yZXRhaW4gPSBvcHRpb25zLnJldGFpbiB8fCBmYWxzZTsgLy8gd2hldGhlciB0byByZXRhaW4gbWVzaCBkYXRhIGluIENQVSBhZnRlciB1cGxvYWRpbmcgdG8gR1BVXG4gICAgICAgIHRoaXMuY3JlYXRlZF9hdCA9ICtuZXcgRGF0ZSgpO1xuICAgICAgICB0aGlzLmZhZGVfaW5fdGltZSA9IG9wdGlvbnMuZmFkZV9pbl90aW1lIHx8IDA7IC8vIG9wdGlvbmFsIHRpbWUgdG8gZmFkZSBpbiBtZXNoXG5cbiAgICAgICAgdGhpcy52ZXJ0ZXhfY291bnQgPSB0aGlzLnZlcnRleF9kYXRhLmJ5dGVMZW5ndGggLyB0aGlzLnZlcnRleF9sYXlvdXQuc3RyaWRlO1xuICAgICAgICB0aGlzLnZhb3MgPSB7fTsgLy8gbWFwIG9mIFZlcnRleEFycmF5T2JqZWN0cywga2V5ZWQgYnkgcHJvZ3JhbVxuXG4gICAgICAgIHRoaXMudG9nZ2xlX2VsZW1lbnRfYXJyYXkgPSBmYWxzZTtcbiAgICAgICAgaWYgKHRoaXMuZWxlbWVudF9kYXRhKXtcbiAgICAgICAgICAgIHRoaXMudG9nZ2xlX2VsZW1lbnRfYXJyYXkgPSB0cnVlO1xuICAgICAgICAgICAgdGhpcy5lbGVtZW50X2NvdW50ID0gdGhpcy5lbGVtZW50X2RhdGEubGVuZ3RoO1xuICAgICAgICAgICAgdGhpcy5nZW9tZXRyeV9jb3VudCA9IHRoaXMuZWxlbWVudF9jb3VudCAvIHRoaXMudmVydGljZXNfcGVyX2dlb21ldHJ5O1xuICAgICAgICAgICAgdGhpcy5lbGVtZW50X3R5cGUgPSAodGhpcy5lbGVtZW50X2RhdGEuY29uc3RydWN0b3IgPT09IFVpbnQxNkFycmF5KSA/IHRoaXMuZ2wuVU5TSUdORURfU0hPUlQ6IHRoaXMuZ2wuVU5TSUdORURfSU5UO1xuICAgICAgICAgICAgdGhpcy5lbGVtZW50X2J1ZmZlciA9IHRoaXMuZ2wuY3JlYXRlQnVmZmVyKCk7XG4gICAgICAgICAgICB0aGlzLmdsLmJpbmRCdWZmZXIodGhpcy5nbC5FTEVNRU5UX0FSUkFZX0JVRkZFUiwgdGhpcy5lbGVtZW50X2J1ZmZlcik7XG4gICAgICAgICAgICB0aGlzLmdsLmJ1ZmZlckRhdGEodGhpcy5nbC5FTEVNRU5UX0FSUkFZX0JVRkZFUiwgdGhpcy5lbGVtZW50X2RhdGEsIHRoaXMuZGF0YV91c2FnZSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmdlb21ldHJ5X2NvdW50ID0gdGhpcy52ZXJ0ZXhfY291bnQgLyB0aGlzLnZlcnRpY2VzX3Blcl9nZW9tZXRyeTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuZ2wuYmluZEJ1ZmZlcih0aGlzLmdsLkFSUkFZX0JVRkZFUiwgdGhpcy52ZXJ0ZXhfYnVmZmVyKTtcbiAgICAgICAgdGhpcy5nbC5idWZmZXJEYXRhKHRoaXMuZ2wuQVJSQVlfQlVGRkVSLCB0aGlzLnZlcnRleF9kYXRhLCB0aGlzLmRhdGFfdXNhZ2UpO1xuXG4gICAgICAgIGlmICghdGhpcy5yZXRhaW4pIHtcbiAgICAgICAgICAgIGRlbGV0ZSB0aGlzLnZlcnRleF9kYXRhO1xuICAgICAgICAgICAgZGVsZXRlIHRoaXMuZWxlbWVudF9kYXRhO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMudmFsaWQgPSB0cnVlO1xuICAgIH1cblxuICAgIC8vIFJlbmRlciwgYnkgZGVmYXVsdCB3aXRoIGN1cnJlbnRseSBib3VuZCBwcm9ncmFtLCBvciBvdGhlcndpc2Ugd2l0aCBvcHRpb25hbGx5IHByb3ZpZGVkIG9uZVxuICAgIC8vIFJldHVybnMgdHJ1ZSBpZiBtZXNoIHJlcXVlc3RzIGEgcmVuZGVyIG9uIG5leHQgZnJhbWUgKGUuZy4gZm9yIGZhZGUgYW5pbWF0aW9ucylcbiAgICByZW5kZXIob3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIGlmICghdGhpcy52YWxpZCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIHByb2dyYW0gPSBvcHRpb25zLnByb2dyYW0gfHwgU2hhZGVyUHJvZ3JhbS5jdXJyZW50O1xuICAgICAgICBwcm9ncmFtLnVzZSgpO1xuXG4gICAgICAgIGlmICh0aGlzLnVuaWZvcm1zKSB7XG4gICAgICAgICAgICBwcm9ncmFtLnNhdmVVbmlmb3Jtcyh0aGlzLnVuaWZvcm1zKTtcbiAgICAgICAgICAgIHByb2dyYW0uc2V0VW5pZm9ybXModGhpcy51bmlmb3JtcywgZmFsc2UpOyAvLyBkb24ndCByZXNldCB0ZXh0dXJlIHVuaXRcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCB2aXNpYmxlX3RpbWUgPSAoK25ldyBEYXRlKCkgLSB0aGlzLmNyZWF0ZWRfYXQpIC8gMTAwMDtcbiAgICAgICAgcHJvZ3JhbS51bmlmb3JtKCcxZicsICd1X3Zpc2libGVfdGltZScsIHZpc2libGVfdGltZSk7XG5cbiAgICAgICAgdGhpcy5iaW5kKHByb2dyYW0pO1xuXG4gICAgICAgIGlmICh0aGlzLnRvZ2dsZV9lbGVtZW50X2FycmF5KXtcbiAgICAgICAgICAgIHRoaXMuZ2wuZHJhd0VsZW1lbnRzKHRoaXMuZHJhd19tb2RlLCB0aGlzLmVsZW1lbnRfY291bnQsIHRoaXMuZWxlbWVudF90eXBlLCAwKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuZ2wuZHJhd0FycmF5cyh0aGlzLmRyYXdfbW9kZSwgMCwgdGhpcy52ZXJ0ZXhfY291bnQpO1xuICAgICAgICB9XG5cbiAgICAgICAgVmVydGV4QXJyYXlPYmplY3QuYmluZCh0aGlzLmdsLCBudWxsKTtcblxuICAgICAgICBpZiAodGhpcy51bmlmb3Jtcykge1xuICAgICAgICAgICAgcHJvZ3JhbS5yZXN0b3JlVW5pZm9ybXModGhpcy51bmlmb3Jtcyk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBSZXF1ZXN0IG5leHQgcmVuZGVyIGlmIG1lc2ggaXMgZmFkaW5nIGluXG4gICAgICAgIHJldHVybiAodmlzaWJsZV90aW1lIDwgdGhpcy5mYWRlX2luX3RpbWUpO1xuICAgIH1cblxuICAgIC8vIEJpbmQgYnVmZmVycyBhbmQgdmVydGV4IGF0dHJpYnV0ZXMgdG8gcHJlcGFyZSBmb3IgcmVuZGVyaW5nXG4gICAgYmluZChwcm9ncmFtKSB7XG4gICAgICAgIC8vIEJpbmQgVkFPIGZvciB0aGlzIHByb2dhbSwgb3IgY3JlYXRlIG9uZVxuICAgICAgICBsZXQgdmFvID0gdGhpcy52YW9zW3Byb2dyYW0uaWRdO1xuICAgICAgICBpZiAodmFvKSB7XG4gICAgICAgICAgICBWZXJ0ZXhBcnJheU9iamVjdC5iaW5kKHRoaXMuZ2wsIHZhbyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnZhb3NbcHJvZ3JhbS5pZF0gPSBWZXJ0ZXhBcnJheU9iamVjdC5jcmVhdGUodGhpcy5nbCwgKGZvcmNlKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5nbC5iaW5kQnVmZmVyKHRoaXMuZ2wuQVJSQVlfQlVGRkVSLCB0aGlzLnZlcnRleF9idWZmZXIpO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLnRvZ2dsZV9lbGVtZW50X2FycmF5KSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZ2wuYmluZEJ1ZmZlcih0aGlzLmdsLkVMRU1FTlRfQVJSQVlfQlVGRkVSLCB0aGlzLmVsZW1lbnRfYnVmZmVyKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy52ZXJ0ZXhfbGF5b3V0LmVuYWJsZSh0aGlzLmdsLCBwcm9ncmFtLCBmb3JjZSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGRlc3Ryb3koKSB7XG4gICAgICAgIGlmICghdGhpcy52YWxpZCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMudmFsaWQgPSBmYWxzZTtcblxuICAgICAgICBmb3IgKGxldCB2IGluIHRoaXMudmFvcykge1xuICAgICAgICAgICAgVmVydGV4QXJyYXlPYmplY3QuZGVzdHJveSh0aGlzLmdsLCB0aGlzLnZhb3Nbdl0pO1xuICAgICAgICB9XG5cbiAgICAgICAgbG9nKCd0cmFjZScsICdWQk9NZXNoLmRlc3Ryb3k6IGRlbGV0ZSBidWZmZXInICsgKHRoaXMudmVydGV4X2RhdGEgPyBgIG9mIHNpemUgJHt0aGlzLnZlcnRleF9kYXRhLmJ5dGVMZW5ndGh9YCA6ICcnKSk7XG5cbiAgICAgICAgdGhpcy5nbC5kZWxldGVCdWZmZXIodGhpcy52ZXJ0ZXhfYnVmZmVyKTtcbiAgICAgICAgdGhpcy52ZXJ0ZXhfYnVmZmVyID0gbnVsbDtcblxuICAgICAgICBpZiAodGhpcy5lbGVtZW50X2J1ZmZlcikge1xuICAgICAgICAgICAgdGhpcy5nbC5kZWxldGVCdWZmZXIodGhpcy5lbGVtZW50X2J1ZmZlcik7XG4gICAgICAgICAgICB0aGlzLmVsZW1lbnRfYnVmZmVyID0gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGRlbGV0ZSB0aGlzLnZlcnRleF9kYXRhO1xuICAgICAgICBkZWxldGUgdGhpcy5lbGVtZW50X2RhdGE7XG5cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG59XG4iLCJpbXBvcnQgZ2wgZnJvbSAnLi9jb25zdGFudHMnOyAvLyB3ZWIgd29ya2VycyBkb24ndCBoYXZlIGFjY2VzcyB0byBHTCBjb250ZXh0LCBzbyBpbXBvcnQgYWxsIEdMIGNvbnN0YW50c1xuaW1wb3J0IGxvZyBmcm9tICcuLi91dGlscy9sb2cnO1xuaW1wb3J0IFZlcnRleEVsZW1lbnRzIGZyb20gJy4vdmVydGV4X2VsZW1lbnRzJztcblxuLy8gTWFwcyBHTCB0eXBlcyB0byBKUyBhcnJheSB0eXBlc1xubGV0IGFycmF5X3R5cGVzID0ge1xuICAgIFtnbC5GTE9BVF06IEZsb2F0MzJBcnJheSxcbiAgICBbZ2wuQllURV06IEludDhBcnJheSxcbiAgICBbZ2wuVU5TSUdORURfQllURV06IFVpbnQ4QXJyYXksXG4gICAgW2dsLklOVF06IEludDMyQXJyYXksXG4gICAgW2dsLlVOU0lHTkVEX0lOVF06IFVpbnQzMkFycmF5LFxuICAgIFtnbC5TSE9SVF06IEludDE2QXJyYXksXG4gICAgW2dsLlVOU0lHTkVEX1NIT1JUXTogVWludDE2QXJyYXlcbn07XG5cbi8vIEFuIGludGVybWVkaWFyeSBvYmplY3QgdGhhdCBob2xkcyB2ZXJ0ZXggZGF0YSBpbiB0eXBlZCBhcnJheXMsIGFjY29yZGluZyB0byBhIGdpdmVuIHZlcnRleCBsYXlvdXRcbi8vIFVzZWQgdG8gY29uc3RydWN0IGEgbWVzaC9WQk8gZm9yIHJlbmRlcmluZ1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVmVydGV4RGF0YSB7XG5cbiAgICBjb25zdHJ1Y3RvciAodmVydGV4X2xheW91dCwgeyBwcmVhbGxvYyA9IDUwMCB9ID0ge30pIHtcbiAgICAgICAgdGhpcy52ZXJ0ZXhfbGF5b3V0ID0gdmVydGV4X2xheW91dDtcbiAgICAgICAgdGhpcy52ZXJ0ZXhfZWxlbWVudHMgPSBuZXcgVmVydGV4RWxlbWVudHMoKTtcblxuICAgICAgICBpZiAoVmVydGV4RGF0YS5hcnJheV9wb29sLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHRoaXMudmVydGV4X2J1ZmZlciA9IFZlcnRleERhdGEuYXJyYXlfcG9vbC5wb3AoKTtcbiAgICAgICAgICAgIHRoaXMuYnl0ZV9sZW5ndGggPSB0aGlzLnZlcnRleF9idWZmZXIuYnl0ZUxlbmd0aDtcbiAgICAgICAgICAgIHRoaXMuc2l6ZSA9IE1hdGguZmxvb3IodGhpcy5ieXRlX2xlbmd0aCAvIHRoaXMudmVydGV4X2xheW91dC5zdHJpZGUpO1xuICAgICAgICAgICAgbG9nKCd0cmFjZScsIGBWZXJ0ZXhEYXRhOiByZXVzZWQgYnVmZmVyIG9mIGJ5dGVzICR7dGhpcy5ieXRlX2xlbmd0aH0sICR7dGhpcy5zaXplfSB2ZXJ0aWNlc2ApO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5zaXplID0gcHJlYWxsb2M7IC8vICMgb2YgdmVydGljZXMgdG8gYWxsb2NhdGVcbiAgICAgICAgICAgIHRoaXMuYnl0ZV9sZW5ndGggPSB0aGlzLnZlcnRleF9sYXlvdXQuc3RyaWRlICogdGhpcy5zaXplO1xuICAgICAgICAgICAgdGhpcy52ZXJ0ZXhfYnVmZmVyID0gbmV3IFVpbnQ4QXJyYXkodGhpcy5ieXRlX2xlbmd0aCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5vZmZzZXQgPSAwOyAgICAgICAgICAgICAvLyBieXRlIG9mZnNldCBpbnRvIGN1cnJlbnRseSBhbGxvY2F0ZWQgYnVmZmVyXG5cbiAgICAgICAgdGhpcy5jb21wb25lbnRzID0gW107XG4gICAgICAgIGZvciAobGV0IGM9MDsgYyA8IHRoaXMudmVydGV4X2xheW91dC5jb21wb25lbnRzLmxlbmd0aDsgYysrKSB7XG4gICAgICAgICAgICB0aGlzLmNvbXBvbmVudHMucHVzaChbLi4udGhpcy52ZXJ0ZXhfbGF5b3V0LmNvbXBvbmVudHNbY11dKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnZlcnRleF9jb3VudCA9IDA7XG4gICAgICAgIHRoaXMucmVhbGxvY19jb3VudCA9IDA7XG4gICAgICAgIHRoaXMuc2V0QnVmZmVyVmlld3MoKTtcbiAgICB9XG5cbiAgICAvLyAoUmUtKWFsbG9jYXRlIHR5cGVkIHZpZXdzIGludG8gdGhlIG1haW4gYnVmZmVyIC0gb25seSBjcmVhdGUgdGhlIHR5cGVzIHdlIG5lZWQgZm9yIHRoaXMgbGF5b3V0XG4gICAgc2V0QnVmZmVyVmlld3MgKCkge1xuICAgICAgICB0aGlzLnZpZXdzID0ge307XG4gICAgICAgIHRoaXMudmlld3NbZ2wuVU5TSUdORURfQllURV0gPSB0aGlzLnZlcnRleF9idWZmZXI7XG4gICAgICAgIGZvciAobGV0IGE9MDsgYSA8IHRoaXMudmVydGV4X2xheW91dC5hdHRyaWJzLmxlbmd0aDsgYSsrKSB7XG4gICAgICAgICAgICBjb25zdCBhdHRyaWIgPSB0aGlzLnZlcnRleF9sYXlvdXQuYXR0cmlic1thXTtcblxuICAgICAgICAgICAgLy8gTmVlZCB2aWV3IGZvciB0aGlzIHR5cGU/XG4gICAgICAgICAgICBpZiAodGhpcy52aWV3c1thdHRyaWIudHlwZV0gPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHZhciBhcnJheV90eXBlID0gYXJyYXlfdHlwZXNbYXR0cmliLnR5cGVdO1xuICAgICAgICAgICAgICAgIHRoaXMudmlld3NbYXR0cmliLnR5cGVdID0gbmV3IGFycmF5X3R5cGUodGhpcy52ZXJ0ZXhfYnVmZmVyLmJ1ZmZlcik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBVcGRhdGUgY29tcG9uZW50IGJ1ZmZlciBwb2ludGVyc1xuICAgICAgICBmb3IgKGxldCBjPTA7IGMgPCB0aGlzLmNvbXBvbmVudHMubGVuZ3RoOyBjKyspIHtcbiAgICAgICAgICAgIGNvbnN0IGNvbXBvbmVudCA9IHRoaXMuY29tcG9uZW50c1tjXTtcbiAgICAgICAgICAgIGNvbXBvbmVudFsxXSA9IHRoaXMudmlld3NbY29tcG9uZW50WzBdXTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIENoZWNrIGFsbG9jYXRlZCBidWZmZXIgc2l6ZSwgZXhwYW5kL3JlYWxsb2MgYnVmZmVyIGlmIG5lZWRlZFxuICAgIGNoZWNrQnVmZmVyU2l6ZSAoKSB7XG4gICAgICAgIGlmICgodGhpcy5vZmZzZXQgKyB0aGlzLnZlcnRleF9sYXlvdXQuc3RyaWRlKSA+IHRoaXMuYnl0ZV9sZW5ndGgpIHtcbiAgICAgICAgICAgIHRoaXMuc2l6ZSA9IE1hdGguZmxvb3IodGhpcy5zaXplICogMS41KTtcbiAgICAgICAgICAgIHRoaXMuc2l6ZSAtPSB0aGlzLnNpemUgJSA0O1xuICAgICAgICAgICAgdGhpcy5ieXRlX2xlbmd0aCA9IHRoaXMudmVydGV4X2xheW91dC5zdHJpZGUgKiB0aGlzLnNpemU7XG4gICAgICAgICAgICB2YXIgbmV3X3ZpZXcgPSBuZXcgVWludDhBcnJheSh0aGlzLmJ5dGVfbGVuZ3RoKTtcbiAgICAgICAgICAgIG5ld192aWV3LnNldCh0aGlzLnZlcnRleF9idWZmZXIpOyAvLyBjb3B5IGV4aXN0aW5nIGRhdGEgdG8gbmV3IGJ1ZmZlclxuICAgICAgICAgICAgVmVydGV4RGF0YS5hcnJheV9wb29sLnB1c2godGhpcy52ZXJ0ZXhfYnVmZmVyKTsgLy8gc2F2ZSBwcmV2aW91cyBidWZmZXIgZm9yIHVzZSBieSBuZXh0IHRpbGVcbiAgICAgICAgICAgIHRoaXMudmVydGV4X2J1ZmZlciA9IG5ld192aWV3O1xuICAgICAgICAgICAgdGhpcy5zZXRCdWZmZXJWaWV3cygpO1xuICAgICAgICAgICAgdGhpcy5yZWFsbG9jX2NvdW50Kys7XG4gICAgICAgICAgICAvLyBsb2coJ2luZm8nLCBgVmVydGV4RGF0YTogZXhwYW5kZWQgdmVydGV4IGJsb2NrIHRvICR7dGhpcy5zaXplfSB2ZXJ0aWNlc2ApO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gQWRkIGEgdmVydGV4LCBjb3BpZWQgZnJvbSBhIHBsYWluIEpTIGFycmF5IG9mIGVsZW1lbnRzIG1hdGNoaW5nIHRoZSBvcmRlciBvZiB0aGUgdmVydGV4IGxheW91dC5cbiAgICAvLyBOb3RlOiB1c2VzIHByZS1jYWxjdWxhdGVkIGluZm8gYWJvdXQgZWFjaCBhdHRyaWJ1dGUsIGluY2x1ZGluZyBwb2ludGVyIHRvIGFwcHJvcHJpYXRlIHR5cGVkIGFycmF5XG4gICAgLy8gdmlldyBhbmQgb2Zmc2V0IGludG8gaXQuIFRoaXMgd2FzIHRoZSBmYXN0ZXN0IG1ldGhvZCBwcm9maWxlZCBzbyBmYXIgZm9yIGZpbGxpbmcgYSBtaXhlZC10eXBlXG4gICAgLy8gdmVydGV4IGxheW91dCAodGhvdWdoIHN0aWxsIHNsb3dlciB0aGFuIHRoZSBwcmV2aW91cyBtZXRob2QgdGhhdCBvbmx5IHN1cHBvcnRlZCBGbG9hdDMyQXJyYXkgYXR0cmlidXRlcykuXG4gICAgYWRkVmVydGV4ICh2ZXJ0ZXgpIHtcbiAgICAgICAgdGhpcy5jaGVja0J1ZmZlclNpemUoKTtcbiAgICAgICAgdmFyIGk9MDtcblxuICAgICAgICB2YXIgY2xlbiA9IHRoaXMuY29tcG9uZW50cy5sZW5ndGg7XG4gICAgICAgIGZvciAodmFyIGM9MDsgYyA8IGNsZW47IGMrKykge1xuICAgICAgICAgICAgdmFyIGNvbXBvbmVudCA9IHRoaXMuY29tcG9uZW50c1tjXTtcbiAgICAgICAgICAgIGNvbXBvbmVudFsxXVsodGhpcy5vZmZzZXQgPj4gY29tcG9uZW50WzJdKSArIGNvbXBvbmVudFszXV0gPSB2ZXJ0ZXhbaSsrXTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMub2Zmc2V0ICs9IHRoaXMudmVydGV4X2xheW91dC5zdHJpZGU7XG4gICAgICAgIHRoaXMudmVydGV4X2NvdW50Kys7XG4gICAgfVxuXG4gICAgLy8gRmluYWxpemUgdmVydGV4IGJ1ZmZlciBmb3IgdXNlIGluIGNvbnN0cnVjdGluZyBhIG1lc2hcbiAgICBlbmQgKCkge1xuICAgICAgICAvLyBDbGlwIHRoZSBidWZmZXIgdG8gc2l6ZSB1c2VkIGZvciB0aGlzIFZCT1xuICAgICAgICB0aGlzLnZlcnRleF9idWZmZXIgPSB0aGlzLnZlcnRleF9idWZmZXIuc3ViYXJyYXkoMCwgdGhpcy5vZmZzZXQpO1xuICAgICAgICB0aGlzLmVsZW1lbnRfYnVmZmVyID0gdGhpcy52ZXJ0ZXhfZWxlbWVudHMuZW5kKCk7XG5cbiAgICAgICAgbG9nKCd0cmFjZScsIGBWZXJ0ZXhEYXRhOiAke3RoaXMuc2l6ZX0gdmVydGljZXMgdG90YWwsIHJlYWxsb2MgY291bnQgJHt0aGlzLnJlYWxsb2NfY291bnR9YCk7XG5cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG59XG5cblZlcnRleERhdGEuYXJyYXlfcG9vbCA9IFtdOyAvLyBwb29sIG9mIGN1cnJlbnRseSBhdmFpbGFibGUgKHByZXZpb3VzbHkgdXNlZCkgYnVmZmVycyAodWludDgpXG4iLCJpbXBvcnQgV29ya2VyQnJva2VyIGZyb20gJy4uL3V0aWxzL3dvcmtlcl9icm9rZXInO1xuXG5sZXQgTUFYX1ZBTFVFID0gTWF0aC5wb3coMiwgMTYpIC0gMTtcbmxldCBVaW50MzJfZmxhZyA9IGZhbHNlO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBWZXJ0ZXhFbGVtZW50cyB7XG4gICAgY29uc3RydWN0b3IgKCkge1xuICAgICAgICB0aGlzLmFycmF5ID0gW107XG4gICAgICAgIHRoaXMuaGFzX292ZXJmbG93biA9IGZhbHNlO1xuICAgIH1cbiAgICBwdXNoICh2YWx1ZSkge1xuICAgICAgICAvLyBJZiB2YWx1ZXMgaGF2ZSBvdmVyZmxvd24gYW5kIG5vIFVpbnQzMiBvcHRpb24gaXMgYXZhaWxhYmxlLCBkbyBub3QgcHVzaCB2YWx1ZXNcbiAgICAgICAgaWYgKHRoaXMuaGFzX292ZXJmbG93biAmJiAhVWludDMyX2ZsYWcpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFRyaWdnZXIgb3ZlcmZsb3cgaWYgdmFsdWUgaXMgZ3JlYXRlciB0aGFuIFVpbnQxNiBtYXhcbiAgICAgICAgaWYgKHZhbHVlID4gTUFYX1ZBTFVFKSB7XG4gICAgICAgICAgICB0aGlzLmhhc19vdmVyZmxvd24gPSB0cnVlO1xuICAgICAgICAgICAgaWYgKCFVaW50MzJfZmxhZykge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuYXJyYXkucHVzaCh2YWx1ZSk7XG4gICAgfVxuICAgIGVuZCAoKSB7XG4gICAgICAgIGlmICh0aGlzLmFycmF5Lmxlbmd0aCl7XG4gICAgICAgICAgICBsZXQgYnVmZmVyID0gY3JlYXRlQnVmZmVyKHRoaXMuYXJyYXksIHRoaXMuaGFzX292ZXJmbG93bik7XG4gICAgICAgICAgICB0aGlzLmFycmF5ID0gW107XG4gICAgICAgICAgICB0aGlzLmhhc19vdmVyZmxvd24gPSBmYWxzZTtcbiAgICAgICAgICAgIHJldHVybiBidWZmZXI7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG59XG5cblZlcnRleEVsZW1lbnRzLnNldFVpbnQzMkZsYWcgPSBmdW5jdGlvbihmbGFnKSB7XG4gICAgVWludDMyX2ZsYWcgPSBmbGFnO1xufTtcblxuZnVuY3Rpb24gY3JlYXRlQnVmZmVyKGFycmF5LCBvdmVyZmxvd24pIHtcbiAgICB2YXIgdHlwZWRBcnJheSA9IChvdmVyZmxvd24gJiYgVWludDMyX2ZsYWcpID8gVWludDMyQXJyYXkgOiBVaW50MTZBcnJheTtcbiAgICByZXR1cm4gbmV3IHR5cGVkQXJyYXkoYXJyYXkpO1xufVxuXG5Xb3JrZXJCcm9rZXIuYWRkVGFyZ2V0KCdWZXJ0ZXhFbGVtZW50cycsIFZlcnRleEVsZW1lbnRzKTtcbiIsImltcG9ydCBnbCBmcm9tICcuL2NvbnN0YW50cyc7IC8vIHdlYiB3b3JrZXJzIGRvbid0IGhhdmUgYWNjZXNzIHRvIEdMIGNvbnRleHQsIHNvIGltcG9ydCBhbGwgR0wgY29uc3RhbnRzXG5pbXBvcnQgVmVydGV4RGF0YSBmcm9tICcuL3ZlcnRleF9kYXRhJztcblxuLy8gRGVzY3JpYmVzIGEgdmVydGV4IGxheW91dCB0aGF0IGNhbiBiZSB1c2VkIHdpdGggbWFueSBkaWZmZXJlbnQgR0wgcHJvZ3JhbXMuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBWZXJ0ZXhMYXlvdXQge1xuICAgIC8vIEF0dHJpYnMgYXJlIGFuIGFycmF5LCBpbiBsYXlvdXQgb3JkZXIsIG9mOiBuYW1lLCBzaXplLCB0eXBlLCBub3JtYWxpemVkXG4gICAgLy8gZXg6IHsgbmFtZTogJ3Bvc2l0aW9uJywgc2l6ZTogMywgdHlwZTogZ2wuRkxPQVQsIG5vcm1hbGl6ZWQ6IGZhbHNlIH1cbiAgICBjb25zdHJ1Y3RvciAoYXR0cmlicykge1xuICAgICAgICB0aGlzLmF0dHJpYnMgPSBhdHRyaWJzOyAvLyBhcnJheSBvZiBhdHRyaWJ1dGVzLCBzcGVjaWZpZWQgYXMgc3RhbmRhcmQgR0wgYXR0cmliIG9wdGlvbnNcbiAgICAgICAgdGhpcy5jb21wb25lbnRzID0gW107ICAgLy8gbGlzdCBvZiB0eXBlIGFuZCBvZmZzZXQgaW5mbyBhYm91dCBlYWNoIGF0dHJpYnV0ZSBjb21wb25lbnRcbiAgICAgICAgdGhpcy5pbmRleCA9IHt9OyAgICAgICAgLy8gbGluZWFyIGJ1ZmZlciBpbmRleCBvZiBlYWNoIGF0dHJpYnV0ZSBjb21wb25lbnQsIGUuZy4gdGhpcy5pbmRleC5wb3NpdGlvbi54XG5cbiAgICAgICAgLy8gQ2FsYyB2ZXJ0ZXggc3RyaWRlXG4gICAgICAgIHRoaXMuc3RyaWRlID0gMDtcblxuICAgICAgICB2YXIgY291bnQgPSAwO1xuICAgICAgICBmb3IgKGxldCBhPTA7IGEgPCB0aGlzLmF0dHJpYnMubGVuZ3RoOyBhKyspIHtcbiAgICAgICAgICAgIGxldCBhdHRyaWIgPSB0aGlzLmF0dHJpYnNbYV07XG4gICAgICAgICAgICBhdHRyaWIub2Zmc2V0ID0gdGhpcy5zdHJpZGU7XG4gICAgICAgICAgICBhdHRyaWIuYnl0ZV9zaXplID0gYXR0cmliLnNpemU7XG4gICAgICAgICAgICB2YXIgc2hpZnQgPSAwO1xuXG4gICAgICAgICAgICBzd2l0Y2ggKGF0dHJpYi50eXBlKSB7XG4gICAgICAgICAgICAgICAgY2FzZSBnbC5GTE9BVDpcbiAgICAgICAgICAgICAgICBjYXNlIGdsLklOVDpcbiAgICAgICAgICAgICAgICBjYXNlIGdsLlVOU0lHTkVEX0lOVDpcbiAgICAgICAgICAgICAgICAgICAgYXR0cmliLmJ5dGVfc2l6ZSAqPSA0O1xuICAgICAgICAgICAgICAgICAgICBzaGlmdCA9IDI7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgZ2wuU0hPUlQ6XG4gICAgICAgICAgICAgICAgY2FzZSBnbC5VTlNJR05FRF9TSE9SVDpcbiAgICAgICAgICAgICAgICAgICAgYXR0cmliLmJ5dGVfc2l6ZSAqPSAyO1xuICAgICAgICAgICAgICAgICAgICBzaGlmdCA9IDE7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBGb3JjZSA0LWJ5dGUgYWxpZ25tZW50IG9uIGF0dHJpYnV0ZXNcbiAgICAgICAgICAgIHRoaXMuc3RyaWRlICs9IGF0dHJpYi5ieXRlX3NpemU7XG4gICAgICAgICAgICBpZiAodGhpcy5zdHJpZGUgJiAzKSB7IC8vIHBhZCB0byBtdWx0aXBsZSBvZiA0IGJ5dGVzXG4gICAgICAgICAgICAgICAgdGhpcy5zdHJpZGUgKz0gNCAtICh0aGlzLnN0cmlkZSAmIDMpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBBZGQgaW5mbyB0byBsaXN0IG9mIGF0dHJpYnV0ZSBjb21wb25lbnRzXG4gICAgICAgICAgICAvLyBVc2VkIHRvIGJ1aWxkIHRoZSB2ZXJ0ZXggZGF0YSwgcHJvdmlkZXMgcG9pbnRlcnMgYW5kIG9mZnNldHMgaW50byBlYWNoIHR5cGVkIGFycmF5IHZpZXdcbiAgICAgICAgICAgIC8vIEVhY2ggY29tcG9uZW50IGlzIGFuIGFycmF5IG9mOlxuICAgICAgICAgICAgLy8gW0dMIGF0dHJpYiB0eXBlLCBwb2ludGVyIHRvIHR5cGVkIGFycmF5IHZpZXcsIGJpdHMgdG8gc2hpZnQgcmlnaHQgdG8gZGV0ZXJtaW5lIGJ1ZmZlciBvZmZzZXQsIGFkZGl0aW9uYWwgYnVmZmVyIG9mZnNldCBmb3IgdGhlIGNvbXBvbmVudF1cbiAgICAgICAgICAgIHZhciBvZmZzZXRfdHlwZWQgPSBhdHRyaWIub2Zmc2V0ID4+IHNoaWZ0O1xuICAgICAgICAgICAgaWYgKGF0dHJpYi5zaXplID4gMSkge1xuICAgICAgICAgICAgICAgIGZvciAobGV0IHM9MDsgcyA8IGF0dHJpYi5zaXplOyBzKyspIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jb21wb25lbnRzLnB1c2goW2F0dHJpYi50eXBlLCBudWxsLCBzaGlmdCwgb2Zmc2V0X3R5cGVkKytdKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNvbXBvbmVudHMucHVzaChbYXR0cmliLnR5cGUsIG51bGwsIHNoaWZ0LCBvZmZzZXRfdHlwZWRdKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gUHJvdmlkZSBhbiBpbmRleCBpbnRvIHRoZSB2ZXJ0ZXggZGF0YSBidWZmZXIgZm9yIGVhY2ggYXR0cmlidXRlIGNvbXBvbmVudFxuICAgICAgICAgICAgdGhpcy5pbmRleFthdHRyaWIubmFtZV0gPSBjb3VudDtcbiAgICAgICAgICAgIGNvdW50ICs9IGF0dHJpYi5zaXplO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gU2V0dXAgYSB2ZXJ0ZXggbGF5b3V0IGZvciBhIHNwZWNpZmljIEdMIHByb2dyYW1cbiAgICAvLyBBc3N1bWVzIHRoYXQgdGhlIGRlc2lyZWQgdmVydGV4IGJ1ZmZlciAoVkJPKSBpcyBhbHJlYWR5IGJvdW5kXG4gICAgLy8gSWYgYSBnaXZlbiBwcm9ncmFtIGRvZXNuJ3QgaW5jbHVkZSBhbGwgYXR0cmlidXRlcywgaXQgY2FuIHN0aWxsIHVzZSB0aGUgdmVydGV4IGxheW91dFxuICAgIC8vIHRvIHJlYWQgdGhvc2UgYXR0cmlicyB0aGF0IGl0IGRvZXMgcmVjb2duaXplLCB1c2luZyB0aGUgYXR0cmliIG9mZnNldHMgdG8gc2tpcCBvdGhlcnMuXG4gICAgZW5hYmxlIChnbCwgcHJvZ3JhbSwgZm9yY2UpXG4gICAge1xuICAgICAgICB2YXIgYXR0cmliLCBsb2NhdGlvbjtcblxuICAgICAgICAvLyBFbmFibGUgYWxsIGF0dHJpYnV0ZXMgZm9yIHRoaXMgbGF5b3V0XG4gICAgICAgIGZvciAodmFyIGE9MDsgYSA8IHRoaXMuYXR0cmlicy5sZW5ndGg7IGErKykge1xuICAgICAgICAgICAgYXR0cmliID0gdGhpcy5hdHRyaWJzW2FdO1xuICAgICAgICAgICAgbG9jYXRpb24gPSBwcm9ncmFtLmF0dHJpYnV0ZShhdHRyaWIubmFtZSkubG9jYXRpb247XG5cbiAgICAgICAgICAgIGlmIChsb2NhdGlvbiAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICBpZiAoIVZlcnRleExheW91dC5lbmFibGVkX2F0dHJpYnNbbG9jYXRpb25dIHx8IGZvcmNlKSB7XG4gICAgICAgICAgICAgICAgICAgIGdsLmVuYWJsZVZlcnRleEF0dHJpYkFycmF5KGxvY2F0aW9uKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZ2wudmVydGV4QXR0cmliUG9pbnRlcihsb2NhdGlvbiwgYXR0cmliLnNpemUsIGF0dHJpYi50eXBlLCBhdHRyaWIubm9ybWFsaXplZCwgdGhpcy5zdHJpZGUsIGF0dHJpYi5vZmZzZXQpO1xuICAgICAgICAgICAgICAgIFZlcnRleExheW91dC5lbmFibGVkX2F0dHJpYnNbbG9jYXRpb25dID0gcHJvZ3JhbTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIERpc2FibGUgYW55IHByZXZpb3VzbHkgYm91bmQgYXR0cmlidXRlcyB0aGF0IGFyZW4ndCBmb3IgdGhpcyBsYXlvdXRcbiAgICAgICAgZm9yIChsb2NhdGlvbiBpbiBWZXJ0ZXhMYXlvdXQuZW5hYmxlZF9hdHRyaWJzKSB7XG4gICAgICAgICAgICB0aGlzLmRpc2FibGVVbnVzZWRBdHRyaWJ1dGUoZ2wsIGxvY2F0aW9uLCBwcm9ncmFtKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIERpc2FibGUgYW4gYXR0cmlidXRlIGlmIGl0IHdhcyBub3QgZW5hYmxlZCBmb3IgdGhlIHNwZWNpZmllZCBwcm9ncmFtXG4gICAgLy8gTk9URTogdGhpcyB3YXMgbW92ZWQgb3V0IG9mIHRoZSBpbm5lciBsb29wIGluIGVuYWJsZSgpIHRvIGFzc2lzdCB3L1ZNIG9wdGltaXphdGlvblxuICAgIGRpc2FibGVVbnVzZWRBdHRyaWJ1dGUgKGdsLCBsb2NhdGlvbiwgcHJvZ3JhbSkge1xuICAgICAgICBpZiAoVmVydGV4TGF5b3V0LmVuYWJsZWRfYXR0cmlic1tsb2NhdGlvbl0gIT09IHByb2dyYW0pIHtcbiAgICAgICAgICAgIGdsLmRpc2FibGVWZXJ0ZXhBdHRyaWJBcnJheShsb2NhdGlvbik7XG4gICAgICAgICAgICBkZWxldGUgVmVydGV4TGF5b3V0LmVuYWJsZWRfYXR0cmlic1tsb2NhdGlvbl07XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBjcmVhdGVWZXJ0ZXhEYXRhICgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBWZXJ0ZXhEYXRhKHRoaXMpO1xuICAgIH1cblxufVxuXG4vLyBUcmFjayBjdXJyZW50bHkgZW5hYmxlZCBhdHRyaWJzLCBieSB0aGUgcHJvZ3JhbSB0aGV5IGFyZSBib3VuZCB0b1xuLy8gU3RhdGljIGNsYXNzIHByb3BlcnR5IHRvIHJlZmxlY3QgZ2xvYmFsIEdMIHN0YXRlXG5WZXJ0ZXhMYXlvdXQuZW5hYmxlZF9hdHRyaWJzID0ge307XG4iLCJpbXBvcnQgUmVwZWF0R3JvdXAgZnJvbSAnLi9yZXBlYXRfZ3JvdXAnO1xuaW1wb3J0IGxvZyBmcm9tICcuLi91dGlscy9sb2cnO1xuXG52YXIgQ29sbGlzaW9uO1xuXG5leHBvcnQgZGVmYXVsdCBDb2xsaXNpb24gPSB7XG5cbiAgICB0aWxlczoge30sXG5cbiAgICBzdGFydFRpbGUgKHRpbGUpIHtcbiAgICAgICAgbGV0IHN0YXRlID0gdGhpcy50aWxlc1t0aWxlXSA9IHtcbiAgICAgICAgICAgIGJib3hlczogeyAgICAgICAgICAgLy8gY3VycmVudCBzZXQgb2YgcGxhY2VkIGJvdW5kaW5nIGJveGVzXG4gICAgICAgICAgICAgICAgYWFiYjogW10sXG4gICAgICAgICAgICAgICAgb2JiOiBbXVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG9iamVjdHM6IHt9LCAgICAgICAgLy8gb2JqZWN0cyB0byBjb2xsaWRlLCBncm91cGVkIGJ5IHByaW9yaXR5LCB0aGVuIGJ5IHN0eWxlXG4gICAgICAgICAgICBrZWVwOiB7fSwgICAgICAgICAgIC8vIG9iamVjdHMgdGhhdCB3ZXJlIGtlcHQgYWZ0ZXIgY29sbGlzaW9uLCBncm91cGVkIGJ5IHN0eWxlXG4gICAgICAgICAgICBzdHlsZXM6IHt9ICAgICAgICAgIC8vIHN0eWxlcyBjb250cmlidXRpbmcgY29sbGlzaW9uIG9iamVjdHNcbiAgICAgICAgfTtcblxuICAgICAgICAvLyBQcm9taXNlIHJlc29sdmVkIHdoZW4gYWxsIHJlZ2lzdGVyZWQgc3R5bGVzIGhhdmUgYWRkZWQgb2JqZWN0c1xuICAgICAgICBzdGF0ZS5jb21wbGV0ZSA9IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgIHN0YXRlLnJlc29sdmUgPSByZXNvbHZlO1xuICAgICAgICAgICAgc3RhdGUucmVqZWN0ID0gcmVqZWN0O1xuICAgICAgICB9KTtcbiAgICB9LFxuXG4gICAgcmVzZXRUaWxlICh0aWxlKSB7XG4gICAgICAgIGRlbGV0ZSB0aGlzLnRpbGVzW3RpbGVdO1xuICAgIH0sXG5cbiAgICAvLyBBZGQgYSBzdHlsZSB0byB0aGUgcGVuZGluZyBzZXQsIGNvbGxpc2lvbiB3aWxsIGJsb2NrIG9uIGFsbCBzdHlsZXMgc3VibWl0dGluZyB0byBjb2xsaXNpb24gc2V0XG4gICAgYWRkU3R5bGUgKHN0eWxlLCB0aWxlKSB7XG4gICAgICAgIHRoaXMudGlsZXNbdGlsZV0uc3R5bGVzW3N0eWxlXSA9IHRydWU7XG4gICAgfSxcblxuICAgIC8vIEFkZCBjb2xsaXNpb24gb2JqZWN0cyBmb3IgYSBzdHlsZVxuICAgIGNvbGxpZGUgKG9iamVjdHMsIHN0eWxlLCB0aWxlKSB7XG4gICAgICAgIGxldCBzdGF0ZSA9IHRoaXMudGlsZXNbdGlsZV07XG4gICAgICAgIGlmICghc3RhdGUpIHtcbiAgICAgICAgICAgIGxvZygndHJhY2UnLCAnQ29sbGlzaW9uLmNvbGxpZGUoKSBjYWxsZWQgd2l0aCBudWxsIHRpbGUnLCB0aWxlLCB0aGlzLnRpbGVzLCBzdHlsZSwgb2JqZWN0cyk7XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKFtdKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEdyb3VwIGJ5IHByaW9yaXR5IGFuZCBzdHlsZVxuICAgICAgICBsZXQgdGlsZV9vYmplY3RzID0gc3RhdGUub2JqZWN0cztcbiAgICAgICAgZm9yIChsZXQgaT0wOyBpIDwgb2JqZWN0cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgbGV0IG9iaiA9IG9iamVjdHNbaV07XG4gICAgICAgICAgICBsZXQgcHJpb3JpdHkgPSBvYmoubGFiZWwubGF5b3V0LnByaW9yaXR5O1xuICAgICAgICAgICAgdGlsZV9vYmplY3RzW3ByaW9yaXR5XSA9IHRpbGVfb2JqZWN0c1twcmlvcml0eV0gfHwge307XG4gICAgICAgICAgICB0aWxlX29iamVjdHNbcHJpb3JpdHldW3N0eWxlXSA9IHRpbGVfb2JqZWN0c1twcmlvcml0eV1bc3R5bGVdIHx8IFtdO1xuICAgICAgICAgICAgdGlsZV9vYmplY3RzW3ByaW9yaXR5XVtzdHlsZV0ucHVzaChvYmopO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gUmVtb3ZlIGZyb20gcGVuZGluZyBzdHlsZSBzZXQsIGlmIG5vIG1vcmUgc3R5bGVzLCBkbyBjb2xsaXNpb24gJiBmaW5pc2ggdGlsZVxuICAgICAgICBkZWxldGUgc3RhdGUuc3R5bGVzW3N0eWxlXTtcbiAgICAgICAgaWYgKE9iamVjdC5rZXlzKHN0YXRlLnN0eWxlcykubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICB0aGlzLmVuZFRpbGUodGlsZSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBXYWl0IGZvciBvYmplY3RzIHRvIGJlIGFkZGVkIGZyb20gYWxsIHN0eWxlc1xuICAgICAgICByZXR1cm4gc3RhdGUuY29tcGxldGUudGhlbigoKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gc3RhdGUua2VlcFtzdHlsZV0gfHwgW107XG4gICAgICAgIH0pO1xuICAgIH0sXG5cbiAgICAvLyBUZXN0IGxhYmVscyBmb3IgY29sbGlzaW9ucywgaGlnaGVyIHRvIGxvd2VyIHByaW9yaXR5XG4gICAgLy8gV2hlbiB0d28gY29sbGlkZSwgZGlzY2FyZCB0aGUgbG93ZXItcHJpb3JpdHkgbGFiZWxcbiAgICBlbmRUaWxlICh0aWxlKSB7XG4gICAgICAgIGxldCBzdGF0ZSA9IHRoaXMudGlsZXNbdGlsZV07XG4gICAgICAgIGxldCBrZWVwID0gc3RhdGUua2VlcDtcblxuICAgICAgICBSZXBlYXRHcm91cC5jbGVhcih0aWxlKTtcblxuICAgICAgICAvLyBQcm9jZXNzIGxhYmVscyBieSBwcmlvcml0eSwgdGhlbiBieSBzdHlsZVxuICAgICAgICBsZXQgcHJpb3JpdGllcyA9IE9iamVjdC5rZXlzKHN0YXRlLm9iamVjdHMpLnNvcnQoKGEsIGIpID0+IGEgLSBiKTtcbiAgICAgICAgZm9yIChsZXQgcD0wOyBwIDwgcHJpb3JpdGllcy5sZW5ndGg7IHArKykge1xuICAgICAgICAgICAgbGV0IHN0eWxlX29iamVjdHMgPSBzdGF0ZS5vYmplY3RzW3ByaW9yaXRpZXNbcF1dO1xuICAgICAgICAgICAgaWYgKCFzdHlsZV9vYmplY3RzKSB7IC8vIG5vIGxhYmVscyBhdCB0aGlzIHByaW9yaXR5LCBza2lwIHRvIG5leHRcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gRm9yIGVhY2ggc3R5bGVcbiAgICAgICAgICAgIGZvciAobGV0IHN0eWxlIGluIHN0eWxlX29iamVjdHMpIHtcbiAgICAgICAgICAgICAgICBsZXQgb2JqZWN0cyA9IHN0eWxlX29iamVjdHNbc3R5bGVdO1xuICAgICAgICAgICAgICAgIGtlZXBbc3R5bGVdID0ga2VlcFtzdHlsZV0gfHwgW107XG5cbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG9iamVjdHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IG9iamVjdCA9IG9iamVjdHNbaV07XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmNhbkJlUGxhY2VkKG9iamVjdCwgdGlsZSwgb2JqZWN0LmxpbmtlZCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEtlZXAgb2JqZWN0IGlmIGl0IGlzbid0IGRlcGVuZGVudCBvbiBhIHBhcmVudCBvYmplY3RcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghb2JqZWN0LmxpbmtlZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtlZXBbc3R5bGVdLnB1c2gob2JqZWN0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnBsYWNlKG9iamVjdCwgdGlsZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBJZiBvYmplY3QgaXMgZGVwZW5kZW50IG9uIGEgcGFyZW50LCBvbmx5IGtlZXAgaWYgYm90aCBjYW4gYmUgcGxhY2VkXG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICh0aGlzLmNhbkJlUGxhY2VkKG9iamVjdC5saW5rZWQsIHRpbGUsIG9iamVjdCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZWVwW3N0eWxlXS5wdXNoKG9iamVjdCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wbGFjZShvYmplY3QsIHRpbGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucGxhY2Uob2JqZWN0LmxpbmtlZCwgdGlsZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBkZWxldGUgdGhpcy50aWxlc1t0aWxlXTtcbiAgICAgICAgc3RhdGUucmVzb2x2ZSgpO1xuICAgIH0sXG5cbiAgICAvLyBSdW4gY29sbGlzaW9uIGFuZCByZXBlYXQgY2hlY2sgdG8gc2VlIGlmIGxhYmVsIGNhbiBjdXJyZW50bHkgYmUgcGxhY2VkXG4gICAgY2FuQmVQbGFjZWQgKG9iamVjdCwgdGlsZSwgZXhjbHVkZSA9IG51bGwpIHtcbiAgICAgICAgbGV0IGxhYmVsID0gb2JqZWN0LmxhYmVsO1xuICAgICAgICBsZXQgbGF5b3V0ID0gb2JqZWN0LmxhYmVsLmxheW91dDtcblxuICAgICAgICAvLyBTa2lwIGlmIGFscmVhZHkgcHJvY2Vzc2VkIChlLmcuIGJ5IHBhcmVudCBvYmplY3QpXG4gICAgICAgIGlmIChsYWJlbC5wbGFjZWQgIT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIGxhYmVsLnBsYWNlZDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFRlc3QgdGhlIGxhYmVsIGZvciBpbnRlcnNlY3Rpb25zIHdpdGggb3RoZXIgbGFiZWxzIGluIHRoZSB0aWxlXG4gICAgICAgIGxldCBiYm94ZXMgPSB0aGlzLnRpbGVzW3RpbGVdLmJib3hlcztcbiAgICAgICAgaWYgKCFsYXlvdXQuY29sbGlkZSB8fCAhbGFiZWwuZGlzY2FyZChiYm94ZXMsIGV4Y2x1ZGUgJiYgZXhjbHVkZS5sYWJlbCkpIHtcbiAgICAgICAgICAgIC8vIGNoZWNrIGZvciByZXBlYXRzXG4gICAgICAgICAgICBsZXQgcmVwZWF0ID0gUmVwZWF0R3JvdXAuY2hlY2sobGFiZWwsIGxheW91dCwgdGlsZSk7XG4gICAgICAgICAgICBpZiAocmVwZWF0KSB7XG4gICAgICAgICAgICAgICAgLy8gbG9nKCd0cmFjZScsIGBkaXNjYXJkIGxhYmVsICcke2xhYmVsLnRleHR9JywgKG9uZV9wZXJfZ3JvdXA6ICR7cmVwZWF0Lm9uZV9wZXJfZ3JvdXB9KSwgZGlzdCAke01hdGguc3FydChyZXBlYXQuZGlzdF9zcSkvbGF5b3V0LnVuaXRzX3Blcl9waXhlbH0gPCAke01hdGguc3FydChyZXBlYXQucmVwZWF0X2Rpc3Rfc3EpL2xheW91dC51bml0c19wZXJfcGl4ZWx9YCk7XG4gICAgICAgICAgICAgICAgbGFiZWwucGxhY2VkID0gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChsYXlvdXQuY29sbGlkZSkge1xuICAgICAgICAgICAgLy8gbG9nKCd0cmFjZScsIGBkaXNjYXJkIGxhYmVsICcke2xhYmVsLnRleHR9JyBkdWUgdG8gY29sbGlzaW9uYCk7XG4gICAgICAgICAgICBsYWJlbC5wbGFjZWQgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbGFiZWwucGxhY2VkO1xuICAgIH0sXG5cbiAgICAvLyBQbGFjZSBsYWJlbFxuICAgIHBsYWNlICh7IGxhYmVsIH0sIHRpbGUpIHtcbiAgICAgICAgLy8gU2tpcCBpZiBhbHJlYWR5IHByb2Nlc3NlZCAoZS5nLiBieSBwYXJlbnQgb2JqZWN0KVxuICAgICAgICBpZiAobGFiZWwucGxhY2VkICE9IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFJlZ2lzdGVyIGFzIHBsYWNlZCBmb3IgZnV0dXJlIGNvbGxpc2lvbiBhbmQgcmVwZWF0IGN1bGxpbmdcbiAgICAgICAgUmVwZWF0R3JvdXAuYWRkKGxhYmVsLCBsYWJlbC5sYXlvdXQsIHRpbGUpO1xuICAgICAgICBsYWJlbC5hZGQodGhpcy50aWxlc1t0aWxlXS5iYm94ZXMpO1xuICAgIH1cblxufTtcbiIsIlxuLy8gRG8gQUFCQiBgYWAgYW5kIGBiYCBpbnRlcnNlY3Q/XG5leHBvcnQgZnVuY3Rpb24gYm94SW50ZXJzZWN0c0JveCAoYSwgYikge1xuICAgIGlmIChhWzJdIDwgYlswXSB8fCAvLyBhIGlzIGxlZnQgb2YgYlxuICAgICAgICBhWzBdID4gYlsyXSB8fCAvLyBhIGlzIHJpZ2h0IG9mIGJcbiAgICAgICAgYVszXSA8IGJbMV0gfHwgLy8gYSBpcyBhYm92ZSBiXG4gICAgICAgIGFbMV0gPiBiWzNdKSB7IC8vIGEgaXMgYmVsb3cgYlxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiB0cnVlOyAvLyBib3hlcyBvdmVybGFwXG59XG5cbi8vIERvZXMgQUFCQiBgYWAgaW50ZXJzZWN0IGFueSBvZiB0aGUgQUFCQnMgaW4gYXJyYXkgYGJveGVzYD9cbi8vIEludm9rZXMgYGNhbGxiYWNrYCB3aXRoIGluZGV4IG9mIGludGVyc2VjdGluZyBib3hcbi8vIFN0b3BzIGludGVyc2VjdGluZyBpZiBgY2FsbGJhY2tgIHJldHVybnMgbm9uLW51bGwgdmFsdWUgKGNvbnRpbnVlcyBvdGhlcndpc2UpXG5leHBvcnQgZnVuY3Rpb24gYm94SW50ZXJzZWN0c0xpc3QgKGEsIGJveGVzLCBjYWxsYmFjaykge1xuICAgIGZvciAobGV0IGk9MDsgaSA8IGJveGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGlmIChib3hJbnRlcnNlY3RzQm94KGEsIGJveGVzW2ldKSkge1xuICAgICAgICAgICAgaWYgKGNhbGxiYWNrKGkpICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn1cbiIsImltcG9ydCBQb2ludEFuY2hvciBmcm9tICcuL3BvaW50X2FuY2hvcic7XG5pbXBvcnQge2JveEludGVyc2VjdHNMaXN0fSBmcm9tICcuL2ludGVyc2VjdCc7XG5pbXBvcnQgVXRpbHMgZnJvbSAnLi4vdXRpbHMvdXRpbHMnO1xuaW1wb3J0IE9CQiBmcm9tICcuLi91dGlscy9vYmInO1xuLy8gaW1wb3J0IGxvZyBmcm9tICcuLi91dGlscy9sb2cnO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBMYWJlbCB7XG5cbiAgICBjb25zdHJ1Y3RvciAoc2l6ZSwgbGF5b3V0ID0ge30pIHtcbiAgICAgICAgdGhpcy5zaXplID0gc2l6ZTtcbiAgICAgICAgdGhpcy5sYXlvdXQgPSBsYXlvdXQ7XG4gICAgICAgIHRoaXMucG9zaXRpb24gPSBudWxsO1xuICAgICAgICB0aGlzLmFuY2hvciA9IEFycmF5LmlzQXJyYXkodGhpcy5sYXlvdXQuYW5jaG9yKSA/IHRoaXMubGF5b3V0LmFuY2hvclswXSA6IHRoaXMubGF5b3V0LmFuY2hvcjsgLy8gaW5pdGlhbCBhbmNob3JcbiAgICAgICAgdGhpcy5wbGFjZWQgPSBudWxsO1xuICAgICAgICB0aGlzLm9mZnNldCA9IGxheW91dC5vZmZzZXQ7XG4gICAgICAgIHRoaXMuYWFiYiA9IG51bGw7XG4gICAgICAgIHRoaXMub2JiID0gbnVsbDtcbiAgICAgICAgdGhpcy5hbGlnbiA9ICdjZW50ZXInO1xuICAgICAgICB0aGlzLnRocm93X2F3YXkgPSBmYWxzZTsgICAgLy8gaWYgbGFiZWwgZG9lcyBub3QgZml0IChleGNlZWRzIHRpbGUgYm91bmRhcnksIGV0YykgdGhpcyBib29sZWFuIHdpbGwgYmUgdHJ1ZVxuICAgIH1cblxuICAgIHVwZGF0ZSAoKSB7XG4gICAgICAgIHRoaXMuYWxpZ24gPSB0aGlzLmxheW91dC5hbGlnbiB8fCBQb2ludEFuY2hvci5hbGlnbkZvckFuY2hvcih0aGlzLmFuY2hvcik7XG4gICAgfVxuXG4gICAgLy8gY2hlY2sgZm9yIG92ZXJsYXBzIHdpdGggb3RoZXIgbGFiZWxzIGluIHRoZSB0aWxlXG4gICAgb2NjbHVkZWQgKGJib3hlcywgZXhjbHVkZSA9IG51bGwpIHtcbiAgICAgICAgbGV0IGludGVyc2VjdCA9IGZhbHNlO1xuICAgICAgICBsZXQgYWFiYnMgPSBiYm94ZXMuYWFiYjtcbiAgICAgICAgbGV0IG9iYnMgPSBiYm94ZXMub2JiO1xuXG4gICAgICAgIC8vIEJyb2FkIHBoYXNlXG4gICAgICAgIGlmIChhYWJicy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBib3hJbnRlcnNlY3RzTGlzdCh0aGlzLmFhYmIsIGFhYmJzLCAoaikgPT4ge1xuICAgICAgICAgICAgICAgIC8vIGxvZygndHJhY2UnLCAnY29sbGlzaW9uOiBicm9hZCBwaGFzZSBjb2xsaWRlJywgdGhpcy5sYXlvdXQuaWQsIHRoaXMsIHRoaXMuYWFiYiwgYWFiYnNbal0pO1xuXG4gICAgICAgICAgICAgICAgLy8gU2tpcCBpZiBjb2xsaWRpbmcgd2l0aCBleGNsdWRlZCBsYWJlbFxuICAgICAgICAgICAgICAgIGlmIChleGNsdWRlICYmIGFhYmJzW2pdID09PSBleGNsdWRlLmFhYmIpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gbG9nKCd0cmFjZScsICdjb2xsaXNpb246IHNraXBwaW5nIGR1ZSB0byBleHBsaWNpdCBleGNsdXNpb24nLCB0aGlzLCBleGNsdWRlKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIFNraXAgbmFycm93IHBoYXNlIGNvbGxpc2lvbiBpZiBubyByb3RhdGlvblxuICAgICAgICAgICAgICAgIGlmICh0aGlzLm9iYi5hbmdsZSA9PT0gMCAmJiBvYmJzW2pdLmFuZ2xlID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGxvZygndHJhY2UnLCAnY29sbGlzaW9uOiBza2lwIG5hcnJvdyBwaGFzZSBjb2xsaWRlIGJlY2F1c2UgbmVpdGhlciBpcyByb3RhdGVkJywgdGhpcy5sYXlvdXQuaWQsIHRoaXMsIHRoaXMub2JiLCBvYmJzW2pdKTtcbiAgICAgICAgICAgICAgICAgICAgaW50ZXJzZWN0ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gTmFycm93IHBoYXNlXG4gICAgICAgICAgICAgICAgaWYgKE9CQi5pbnRlcnNlY3QodGhpcy5vYmIsIG9iYnNbal0pKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGxvZygndHJhY2UnLCAnY29sbGlzaW9uOiBuYXJyb3cgcGhhc2UgY29sbGlkZScsIHRoaXMubGF5b3V0LmlkLCB0aGlzLCB0aGlzLm9iYiwgb2Jic1tqXSk7XG4gICAgICAgICAgICAgICAgICAgIGludGVyc2VjdCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBpbnRlcnNlY3Q7XG4gICAgfVxuXG4gICAgLy8gQWRkIHRoaXMgbGFiZWwncyBib3VuZGluZyBib3ggdG8gdGhlIHByb3ZpZGVkIHNldFxuICAgIGFkZCAoYmJveGVzKSB7XG4gICAgICAgIHRoaXMucGxhY2VkID0gdHJ1ZTtcbiAgICAgICAgYmJveGVzLmFhYmIucHVzaCh0aGlzLmFhYmIpO1xuICAgICAgICBiYm94ZXMub2JiLnB1c2godGhpcy5vYmIpO1xuICAgIH1cblxuICAgIC8vIGNoZWNrcyB3aGV0aGVyIHRoZSBsYWJlbCBpcyB3aXRoaW4gdGhlIHRpbGUgYm91bmRhcmllc1xuICAgIGluVGlsZUJvdW5kcyAoKSB7XG4gICAgICAgIGxldCBtaW4gPSBbIHRoaXMuYWFiYlswXSwgdGhpcy5hYWJiWzFdIF07XG4gICAgICAgIGxldCBtYXggPSBbIHRoaXMuYWFiYlsyXSwgdGhpcy5hYWJiWzNdIF07XG5cbiAgICAgICAgaWYgKCFVdGlscy5wb2ludEluVGlsZShtaW4pIHx8ICFVdGlscy5wb2ludEluVGlsZShtYXgpKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICAvLyBXaGV0aGVyIHRoZSBsYWJlbCBzaG91bGQgYmUgZGlzY2FyZGVkXG4gICAgLy8gRGVwZW5kcyBvbiB3aGV0aGVyIGxhYmVsIG11c3QgZml0IGluIHRoZSB0aWxlIGJvdW5kcywgYW5kIGlmIHNvLCBjYW4gaXQgYmUgbW92ZWQgdG8gZml0IHRoZXJlXG4gICAgZGlzY2FyZChiYm94ZXMsIGV4Y2x1ZGUgPSBudWxsKSB7XG4gICAgICAgIGlmICh0aGlzLnRocm93X2F3YXkpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLm9jY2x1ZGVkKGJib3hlcywgZXhjbHVkZSk7XG4gICAgfVxufVxuXG5MYWJlbC5lcHNpbG9uID0gMC45OTk5OyAvLyB0b2xlcmFuY2UgYXJvdW5kIGNvbGxpc2lvbiBib3hlcywgcHJldmVudCBwZXJmZWN0bHkgYWRqYWNlbnQgb2JqZWN0cyBmcm9tIGNvbGxpZGluZ1xuIiwiaW1wb3J0IExhYmVsIGZyb20gJy4vbGFiZWwnO1xuaW1wb3J0IFZlY3RvciBmcm9tICcuLi92ZWN0b3InO1xuaW1wb3J0IE9CQiBmcm9tICcuLi91dGlscy9vYmInO1xuXG5jb25zdCBQTEFDRU1FTlQgPSB7XG4gICAgTUlEX1BPSU5UOiAwLFxuICAgIENPUk5FUjogMVxufTtcblxuY29uc3QgTUFYX0FOR0xFID0gTWF0aC5QSSAvIDI7ICAgICAgLy8gbWF4aW11bSBhbmdsZSBmb3IgYXJ0aWN1bGF0ZWQgbGFiZWxzXG5jb25zdCBMSU5FX0VYQ0VFRF9TVFJBSUdIVCA9IDAuNzsgICAvLyBtaW5pbWFsIHJhdGlvIGZvciBzdHJhaWdodCBsYWJlbHMgKGxhYmVsIGxlbmd0aCkgLyAobGluZSBsZW5ndGgpXG5jb25zdCBMSU5FX0VYQ0VFRF9LSU5LRUQgPSAwLjY7ICAgICAvLyBtaW5pbWFsIHJhdGlvIGZvciBraW5rZWQgbGFiZWxzXG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIExhYmVsTGluZSB7XG5cbiAgICBjb25zdHJ1Y3RvciAoc2l6ZSwgbGluZXMsIGxheW91dCkge1xuICAgICAgICB0aGlzLnNpemUgPSBzaXplO1xuICAgICAgICB0aGlzLmxheW91dCA9IGxheW91dDtcbiAgICAgICAgdGhpcy5saW5lcyA9IGxpbmVzO1xuICAgICAgICB0aGlzLnNwYWNlX3dpZHRoID0gbGF5b3V0LnNwYWNlX3dpZHRoOyAvLyB3aWR0aCBvZiBzcGFjZSBmb3IgdGhlIGZvbnQgdXNlZFxuICAgICAgICB0aGlzLm51bV9zZWdtZW50cyA9IHNpemUubGVuZ3RoOyAvLyBudW1iZXIgb2YgbGFiZWwgc2VnbWVudHNcbiAgICAgICAgdGhpcy50b3RhbF9sZW5ndGggPSBzaXplLnJlZHVjZShmdW5jdGlvbihwcmV2LCBuZXh0KXsgcmV0dXJuIHByZXYgKyBuZXh0WzBdOyB9LCAwKSArIChzaXplLmxlbmd0aCAtIDEpICogdGhpcy5zcGFjZV93aWR0aDtcbiAgICAgICAgdGhpcy50b3RhbF9oZWlnaHQgPSBzaXplWzBdWzFdO1xuICAgICAgICB0aGlzLnBsYWNlbWVudCA9IChsYXlvdXQucGxhY2VtZW50ID09PSB1bmRlZmluZWQpID8gUExBQ0VNRU5ULk1JRF9QT0lOVCA6IGxheW91dC5wbGFjZW1lbnQ7XG5cbiAgICAgICAgdGhpcy5raW5rX2luZGV4ID0gMDsgLy8gaW5kZXggYXQgd2hpY2ggYW4gYXJ0aWN1bGF0ZWQgbGFiZWwgd2lsbCBraW5rIChlLmcuLCAxIG1lYW5zIGEga2luayBfYWZ0ZXJfIHRoZSBmaXJzdCBzZWdtZW50KVxuICAgICAgICB0aGlzLnNwcmVhZF9mYWN0b3IgPSAwLjU7IC8vIHNwYWNlcyBvdXQgYWRqYWNlbnQgd29yZHMgdG8gcHJldmVudCBvdmVybGFwXG4gICAgICAgIHRoaXMuZml0bmVzcyA9IDA7IC8vIG1lYXN1cmUgb2YgcXVhbGl0eSBvZiBmaXRcblxuICAgICAgICAvLyBBcnJheXMgZm9yIExhYmVsIHByb3BlcnRpZXMuIFRPRE86IGNyZWF0ZSBhcnJheSBvZiBMYWJlbCB0eXBlcywgd2hlcmUgTGFiZWxMaW5lIGFjdHMgYXMgYSBcImdyb3VwZWQgbGFiZWxcIlxuICAgICAgICB0aGlzLnBvc2l0aW9uID0gW107XG4gICAgICAgIHRoaXMuYW5nbGUgPSBbXTtcbiAgICAgICAgdGhpcy5vZmZzZXRzID0gW107XG4gICAgICAgIHRoaXMub2JicyA9IFtdO1xuICAgICAgICB0aGlzLmFhYmJzID0gW107XG5cbiAgICAgICAgLy8gb3B0aW9uYWxseSBsaW1pdCB0aGUgbGluZSBzZWdtZW50cyB0aGF0IHRoZSBsYWJlbCBtYXkgYmUgcGxhY2VkIGluLCBieSBzcGVjaWZ5aW5nIGEgc2VnbWVudCBpbmRleCByYW5nZVxuICAgICAgICAvLyB1c2VkIGFzIGEgY29hcnNlIHN1YmRpdmlkZSBmb3IgcGxhY2luZyBtdWx0aXBsZSBsYWJlbHMgcGVyIGxpbmUgZ2VvbWV0cnlcbiAgICAgICAgdGhpcy5zZWdtZW50X2luZGV4ID0gbGF5b3V0LnNlZ21lbnRfaW5kZXggfHwgbGF5b3V0LnNlZ21lbnRfc3RhcnQgfHwgMDtcbiAgICAgICAgdGhpcy5zZWdtZW50X21heCA9IGxheW91dC5zZWdtZW50X2VuZCB8fCB0aGlzLmxpbmVzLmxlbmd0aDtcblxuICAgICAgICAvLyBGaXJzdCBmaXR0aW5nIHNlZ21lbnRcbiAgICAgICAgbGV0IHNlZ21lbnQgPSB0aGlzLmdldE5leHRGaXR0aW5nU2VnbWVudCh0aGlzLmdldEN1cnJlbnRTZWdtZW50KCkpO1xuICAgICAgICB0aGlzLnRocm93X2F3YXkgPSAoIXNlZ21lbnQpO1xuICAgIH1cblxuICAgIC8vIEl0ZXJhdGUgdGhyb3VnaCB0aGUgbGluZSBnZW9tZXRyeSBjcmVhdGluZyB0aGUgbmV4dCB2YWxpZCBsYWJlbC5cbiAgICBzdGF0aWMgbmV4dExhYmVsKGxhYmVsKSB7XG4gICAgICAgIC8vIGluY3JlbWVudCBzZWdtZW50XG4gICAgICAgIGxldCBoYXNOZXh0ID0gbGFiZWwuZ2V0TmV4dFNlZ21lbnQoKTtcbiAgICAgICAgaWYgKCFoYXNOZXh0KSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBjbG9uZSBvcHRpb25zXG4gICAgICAgIGxldCBsYXlvdXQgPSBPYmplY3QuY3JlYXRlKGxhYmVsLmxheW91dCk7XG4gICAgICAgIGxheW91dC5zZWdtZW50X2luZGV4ID0gbGFiZWwuc2VnbWVudF9pbmRleDtcbiAgICAgICAgbGF5b3V0LnBsYWNlbWVudCA9IGxhYmVsLnBsYWNlbWVudDtcblxuICAgICAgICAvLyBjcmVhdGUgbmV3IGxhYmVsXG4gICAgICAgIGxldCBuZXh0TGFiZWwgPSBuZXcgTGFiZWxMaW5lKGxhYmVsLnNpemUsIGxhYmVsLmxpbmVzLCBsYXlvdXQpO1xuXG4gICAgICAgIHJldHVybiAobmV4dExhYmVsLnRocm93X2F3YXkpID8gZmFsc2UgOiBuZXh0TGFiZWw7XG4gICAgfVxuXG4gICAgLy8gU3RyYXRlZ3kgZm9yIHJldHVybmluZyB0aGUgbmV4dCBzZWdtZW50LiBBc3N1bWVzIGFuIFwib3JkZXJpbmdcIiBvZiBwb3NzaWJsZSBzZWdtZW50c1xuICAgIC8vIHRha2luZyBpbnRvIGFjY291bnQgYm90aCBzdHJhaWdodCBhbmQgYXJ0aWN1bGF0ZWQgc2VnbWVudHMuIFJldHVybnMgZmFsc2UgaWYgYWxsIHBvc3NpYmlsaXRpZXNcbiAgICAvLyBoYXZlIGJlZW4gZXhoYXVzdGVkXG4gICAgZ2V0TmV4dFNlZ21lbnQoKSB7XG4gICAgICAgIHN3aXRjaCAodGhpcy5wbGFjZW1lbnQpIHtcbiAgICAgICAgICAgIGNhc2UgUExBQ0VNRU5ULkNPUk5FUjpcbiAgICAgICAgICAgICAgICB0aGlzLnBsYWNlbWVudCA9IFBMQUNFTUVOVC5NSURfUE9JTlQ7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFBMQUNFTUVOVC5NSURfUE9JTlQ6XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuc2VnbWVudF9pbmRleCA+PSB0aGlzLmxpbmVzLmxlbmd0aCAtIDIpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmICh0aGlzLnNpemUubGVuZ3RoID4gMSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnBsYWNlbWVudCA9IFBMQUNFTUVOVC5DT1JORVI7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMuc2VnbWVudF9pbmRleCsrO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0Q3VycmVudFNlZ21lbnQoKTtcbiAgICB9XG5cbiAgICAvLyBSZXR1cm5zIHRoZSBsaW5lIHNlZ21lbnRzIG5lY2Vzc2FyeSBmb3Igb3RoZXIgY2FsY3VsYXRpb25zIGF0IHRoZSBjdXJyZW50IGxpbmUgc2VnbWVudCBpbmRleC5cbiAgICAvLyBUaGlzIGlzIHRoZSBjdXJyZW50IGFuZCBuZXh0IHNlZ21lbnQgZm9yIGEgc3RyYWlnaHQgbGluZSwgYW5kIHRoZSBwcmV2aW91cywgY3VycmVudCBhbmQgbmV4dFxuICAgIC8vIGZvciBhbiBhcnRpY3VsYXRlZCBzZWdtZW50LlxuICAgIGdldEN1cnJlbnRTZWdtZW50KCkge1xuICAgICAgICBsZXQgcDEsIHAyLCBzZWdtZW50O1xuICAgICAgICBzd2l0Y2ggKHRoaXMucGxhY2VtZW50KSB7XG4gICAgICAgICAgICBjYXNlIFBMQUNFTUVOVC5DT1JORVI6XG4gICAgICAgICAgICAgICAgcDEgPSB0aGlzLmxpbmVzW3RoaXMuc2VnbWVudF9pbmRleCAtIDFdO1xuICAgICAgICAgICAgICAgIHAyID0gdGhpcy5saW5lc1t0aGlzLnNlZ21lbnRfaW5kZXhdO1xuICAgICAgICAgICAgICAgIGxldCBwMyA9IHRoaXMubGluZXNbdGhpcy5zZWdtZW50X2luZGV4ICsgMV07XG4gICAgICAgICAgICAgICAgc2VnbWVudCA9IFsgcDEsIHAyLCBwMyBdO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBQTEFDRU1FTlQuTUlEX1BPSU5UOlxuICAgICAgICAgICAgICAgIHAxID0gdGhpcy5saW5lc1t0aGlzLnNlZ21lbnRfaW5kZXhdO1xuICAgICAgICAgICAgICAgIHAyID0gdGhpcy5saW5lc1t0aGlzLnNlZ21lbnRfaW5kZXggKyAxXTtcbiAgICAgICAgICAgICAgICBzZWdtZW50ID0gWyBwMSwgcDIgXTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBzZWdtZW50O1xuICAgIH1cblxuICAgIC8vIFJldHVybnMgbmV4dCBzZWdtZW50IHRoYXQgaXMgdmFsaWQgKHdpdGhpbiB0aWxlLCBpbnNpZGUgYW5nbGUgcmVxdWlyZW1lbnRzIGFuZCB3aXRoaW4gbGluZSBnZW9tZXRyeSkuXG4gICAgZ2V0TmV4dEZpdHRpbmdTZWdtZW50KHNlZ21lbnQpIHtcbiAgICAgICAgc2VnbWVudCA9IHNlZ21lbnQgfHwgdGhpcy5nZXROZXh0U2VnbWVudCgpO1xuICAgICAgICBpZiAoIXNlZ21lbnQpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmRvZXNTZWdtZW50Rml0KHNlZ21lbnQpKSB7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZSgpO1xuICAgICAgICAgICAgaWYgKHRoaXMuaW5UaWxlQm91bmRzKCkgJiYgdGhpcy5pbkFuZ2xlQm91bmRzKCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gc2VnbWVudDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLmdldE5leHRGaXR0aW5nU2VnbWVudCgpO1xuICAgIH1cblxuICAgIC8vIFJldHVybnMgYm9vbGVhbiBpbmRpY2F0aW5nIHdoZXRoZXIgY3VycmVudCBzZWdtZW50IGlzIHZhbGlkXG4gICAgZG9lc1NlZ21lbnRGaXQoc2VnbWVudCkge1xuICAgICAgICBzd2l0Y2ggKHRoaXMucGxhY2VtZW50KSB7XG4gICAgICAgICAgICBjYXNlIFBMQUNFTUVOVC5DT1JORVI6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZml0S2lua2VkU2VnbWVudChzZWdtZW50KTtcbiAgICAgICAgICAgIGNhc2UgUExBQ0VNRU5ULk1JRF9QT0lOVDpcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5maXRTdHJhaWdodFNlZ21lbnQoc2VnbWVudCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBSZXR1cm5zIGJvb2xlYW4gaW5kaWNhdGluZyB3aGV0aGVyIGtpbmtlZCBzZWdtZW50IGlzIHZhbGlkXG4gICAgLy8gQ3ljbGVzIHRocm91Z2ggdmFyaW91cyB3YXlzIG9mIGtpbmtpbmcgdGhlIGxhYmVscyBhcm91bmQgdGhlIHNlZ21lbnQncyBwaXZvdCxcbiAgICAvLyBmaW5kaW5nIHRoZSBiZXN0IGZpdCwgYW5kIGRldGVybWluZXMgdGhlIGtpbmtfaW5kZXguXG4gICAgZml0S2lua2VkU2VnbWVudChzZWdtZW50KSB7XG4gICAgICAgIGxldCB1cHAgPSB0aGlzLmxheW91dC51bml0c19wZXJfcGl4ZWw7XG5cbiAgICAgICAgbGV0IHAwcDEgPSBWZWN0b3Iuc3ViKHNlZ21lbnRbMF0sIHNlZ21lbnRbMV0pO1xuICAgICAgICBsZXQgcDFwMiA9IFZlY3Rvci5zdWIoc2VnbWVudFsxXSwgc2VnbWVudFsyXSk7XG5cbiAgICAgICAgLy8gRG9uJ3QgZml0IGlmIHNlZ21lbnQgZG9lc24ndCBwYXNzIHRoZSB2ZXJ0aWNhbCBsaW5lIHRlc3QsIHJlc3VsdGluZyBpbiB1cHNpZGUtZG93biBsYWJlbHNcbiAgICAgICAgaWYgKHAwcDFbMF0gKiBwMXAyWzBdIDwgMCAmJiBwMHAxWzFdICogcDFwMlsxXSA+IDApIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBsaW5lX2xlbmd0aDEgPSBWZWN0b3IubGVuZ3RoKHAwcDEpIC8gdXBwO1xuICAgICAgICBsZXQgbGluZV9sZW5ndGgyID0gVmVjdG9yLmxlbmd0aChwMXAyKSAvIHVwcDtcblxuICAgICAgICAvLyBicmVhayB1cCBtdWx0aXBsZSBzZWdtZW50cyBpbnRvIHR3byBjaHVua3MgKE4tMSBvcHRpb25zKVxuICAgICAgICBsZXQgbGFiZWxfbGVuZ3RoMSA9IHRoaXMudG90YWxfbGVuZ3RoO1xuICAgICAgICBsZXQgbGFiZWxfbGVuZ3RoMiA9IDA7XG4gICAgICAgIGxldCB3aWR0aCwgZml0bmVzcyA9IDA7XG4gICAgICAgIGxldCBraW5rX2luZGV4ID0gdGhpcy5udW1fc2VnbWVudHMgLSAxO1xuICAgICAgICBsZXQgZml0bmVzc2VzID0gW107XG5cbiAgICAgICAgd2hpbGUgKGtpbmtfaW5kZXggPiAwKSB7XG4gICAgICAgICAgICB3aWR0aCA9IHRoaXMuc2l6ZVtraW5rX2luZGV4XVswXSArIHRoaXMuc3BhY2Vfd2lkdGg7XG5cbiAgICAgICAgICAgIGxhYmVsX2xlbmd0aDEgLT0gd2lkdGg7XG4gICAgICAgICAgICBsYWJlbF9sZW5ndGgyICs9IHdpZHRoO1xuXG4gICAgICAgICAgICBmaXRuZXNzID0gTWF0aC5tYXgoY2FsY0ZpdG5lc3MobGluZV9sZW5ndGgxLCBsYWJlbF9sZW5ndGgxKSwgY2FsY0ZpdG5lc3MobGluZV9sZW5ndGgyLCBsYWJlbF9sZW5ndGgyKSk7XG4gICAgICAgICAgICBmaXRuZXNzZXMudW5zaGlmdChmaXRuZXNzKTtcblxuICAgICAgICAgICAga2lua19pbmRleC0tO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IG1heF9maXRuZXNzID0gTWF0aC5tYXguYXBwbHkobnVsbCwgZml0bmVzc2VzKTtcblxuICAgICAgICBpZiAobWF4X2ZpdG5lc3MgPCBMSU5FX0VYQ0VFRF9LSU5LRUQpIHtcbiAgICAgICAgICAgIHRoaXMua2lua19pbmRleCA9IGZpdG5lc3Nlcy5pbmRleE9mKG1heF9maXRuZXNzKSArIDE7XG4gICAgICAgICAgICB0aGlzLmZpdG5lc3MgPSBtYXhfZml0bmVzcztcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5raW5rX2luZGV4ID0gMDtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIFJldHVybnMgYm9vbGVhbiBpbmRpY2F0aW5nIHdoZXRoZXIgc3RyYWlnaHQgc2VnbWVudCBpcyB2YWxpZFxuICAgIC8vIEEgc3RyYWlnaHQgc2VnbWVudCBpcyBwbGFjZWQgYXQgdGhlIG1pZHBvaW50IGFuZCBpcyB2YWxpZCBpZiB0aGUgbGFiZWwncyBsZW5ndGggaXMgZ3JlYXRlciB0aGFuIGFcbiAgICAvLyBmYWN0b3IgKExJTkVfRVhDRUVEX1NUUkFJR0hUKSBvZiB0aGUgbGluZSBzZWdtZW50J3MgbGVuZ3RoXG4gICAgZml0U3RyYWlnaHRTZWdtZW50KHNlZ21lbnQpIHtcbiAgICAgICAgbGV0IHVwcCA9IHRoaXMubGF5b3V0LnVuaXRzX3Blcl9waXhlbDtcbiAgICAgICAgbGV0IGxpbmVfbGVuZ3RoID0gVmVjdG9yLmxlbmd0aChWZWN0b3Iuc3ViKHNlZ21lbnRbMF0sIHNlZ21lbnRbMV0pKSAvIHVwcDtcbiAgICAgICAgbGV0IGZpdG5lc3MgPSBjYWxjRml0bmVzcyhsaW5lX2xlbmd0aCwgdGhpcy50b3RhbF9sZW5ndGgpO1xuXG4gICAgICAgIGlmIChmaXRuZXNzIDwgTElORV9FWENFRURfU1RSQUlHSFQpe1xuICAgICAgICAgICAgdGhpcy5maXRuZXNzID0gZml0bmVzcztcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gT25jZSBhIGZpdHRpbmcgc2VnbWVudCBpcyBmb3VuZCwgZGV0ZXJtaW5lIGl0cyBhbmdsZXMsIHBvc2l0aW9ucyBhbmQgYm91bmRpbmcgYm94ZXNcbiAgICB1cGRhdGUoKSB7XG4gICAgICAgIHRoaXMuYW5nbGUgPSB0aGlzLmdldEN1cnJlbnRBbmdsZSgpO1xuICAgICAgICB0aGlzLnBvc2l0aW9uID0gdGhpcy5nZXRDdXJyZW50UG9zaXRpb24oKTtcbiAgICAgICAgdGhpcy51cGRhdGVCQm94ZXMoKTtcbiAgICB9XG5cbiAgICBnZXRDdXJyZW50QW5nbGUoKSB7XG4gICAgICAgIGxldCBzZWdtZW50ID0gdGhpcy5nZXRDdXJyZW50U2VnbWVudCgpO1xuICAgICAgICBsZXQgYW5nbGVzID0gW107XG5cbiAgICAgICAgc3dpdGNoICh0aGlzLnBsYWNlbWVudCkge1xuICAgICAgICAgICAgY2FzZSBQTEFDRU1FTlQuQ09STkVSOlxuICAgICAgICAgICAgICAgIGxldCB0aGV0YTEgPSBnZXRBbmdsZUZyb21TZWdtZW50KHNlZ21lbnRbMF0sIHNlZ21lbnRbMV0pO1xuICAgICAgICAgICAgICAgIGxldCB0aGV0YTIgPSBnZXRBbmdsZUZyb21TZWdtZW50KHNlZ21lbnRbMV0sIHNlZ21lbnRbMl0pO1xuXG4gICAgICAgICAgICAgICAgbGV0IHAwcDEgPSBWZWN0b3Iuc3ViKHNlZ21lbnRbMF0sIHNlZ21lbnRbMV0pO1xuICAgICAgICAgICAgICAgIGxldCBwMXAyID0gVmVjdG9yLnN1YihzZWdtZW50WzFdLCBzZWdtZW50WzJdKTtcblxuICAgICAgICAgICAgICAgIGxldCBvcmllbnRhdGlvbiA9IChwMHAxWzBdID49IDAgJiYgcDFwMlswXSA+PSAwKSA/IDEgOiAtMTtcbiAgICAgICAgICAgICAgICBsZXQgYW5nbGU7XG5cbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMubnVtX3NlZ21lbnRzOyBpKyspe1xuICAgICAgICAgICAgICAgICAgICBpZiAoaSA8IHRoaXMua2lua19pbmRleCl7XG4gICAgICAgICAgICAgICAgICAgICAgICBhbmdsZSA9IChvcmllbnRhdGlvbiA+IDApID8gdGhldGEyIDogdGhldGExO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgYW5nbGUgPSAob3JpZW50YXRpb24gPiAwKSA/IHRoZXRhMSA6IHRoZXRhMjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBhbmdsZXMucHVzaChhbmdsZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBQTEFDRU1FTlQuTUlEX1BPSU5UOlxuICAgICAgICAgICAgICAgIGxldCB0aGV0YSA9IGdldEFuZ2xlRnJvbVNlZ21lbnQoc2VnbWVudFswXSwgc2VnbWVudFsxXSk7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLm51bV9zZWdtZW50czsgaSsrKXtcbiAgICAgICAgICAgICAgICAgICAgYW5nbGVzLnB1c2godGhldGEpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBhbmdsZXM7XG4gICAgfVxuXG4gICAgLy8gUmV0dXJuIHRoZSBwb3NpdGlvbiBvZiB0aGUgY2VudGVyIG9mIHRoZSBsYWJlbFxuICAgIGdldEN1cnJlbnRQb3NpdGlvbigpIHtcbiAgICAgICAgbGV0IHNlZ21lbnQgPSB0aGlzLmdldEN1cnJlbnRTZWdtZW50KCk7XG4gICAgICAgIGxldCBwb3NpdGlvbjtcblxuICAgICAgICBzd2l0Y2ggKHRoaXMucGxhY2VtZW50KSB7XG4gICAgICAgICAgICBjYXNlIFBMQUNFTUVOVC5DT1JORVI6XG4gICAgICAgICAgICAgICAgcG9zaXRpb24gPSBzZWdtZW50WzFdLnNsaWNlKCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFBMQUNFTUVOVC5NSURfUE9JTlQ6XG4gICAgICAgICAgICAgICAgcG9zaXRpb24gPSBbXG4gICAgICAgICAgICAgICAgICAgIDAuNSAqIChzZWdtZW50WzBdWzBdICsgc2VnbWVudFsxXVswXSksXG4gICAgICAgICAgICAgICAgICAgIDAuNSAqIChzZWdtZW50WzBdWzFdICsgc2VnbWVudFsxXVsxXSlcbiAgICAgICAgICAgICAgICBdO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHBvc2l0aW9uO1xuICAgIH1cblxuICAgIC8vIENoZWNrIGZvciBhcnRpY3VsYXRlZCBsYWJlbHMgdG8gYmUgd2l0aGluIGFuIGFuZ2xlIHJhbmdlIFstTUFYX0FOR0xFLCArTUFYX0FOR0xFXVxuICAgIGluQW5nbGVCb3VuZHMoKSB7XG4gICAgICAgIHN3aXRjaCAodGhpcy5wbGFjZW1lbnQpIHtcbiAgICAgICAgICAgIGNhc2UgUExBQ0VNRU5ULkNPUk5FUjpcbiAgICAgICAgICAgICAgICBsZXQgYW5nbGUwID0gdGhpcy5hbmdsZVswXTtcbiAgICAgICAgICAgICAgICBpZiAoYW5nbGUwIDwgMCkge1xuICAgICAgICAgICAgICAgICAgICBhbmdsZTAgKz0gMiAqIE1hdGguUEk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgbGV0IGFuZ2xlMSA9IHRoaXMuYW5nbGVbMV07XG4gICAgICAgICAgICAgICAgaWYgKGFuZ2xlMSA8IDApIHtcbiAgICAgICAgICAgICAgICAgICAgYW5nbGUxICs9IDIgKiBNYXRoLlBJO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGxldCB0aGV0YSA9IE1hdGguYWJzKGFuZ2xlMSAtIGFuZ2xlMCk7XG4gICAgICAgICAgICAgICAgdGhldGEgPSBNYXRoLm1pbigyICogTWF0aC5QSSAtIHRoZXRhLCB0aGV0YSk7XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gdGhldGEgPD0gTUFYX0FOR0xFO1xuICAgICAgICAgICAgY2FzZSBQTEFDRU1FTlQuTUlEX1BPSU5UOlxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gQ2FsY3VsYXRlIGJvdW5kaW5nIGJveGVzXG4gICAgdXBkYXRlQkJveGVzKCkge1xuICAgICAgICBsZXQgdXBwID0gdGhpcy5sYXlvdXQudW5pdHNfcGVyX3BpeGVsO1xuICAgICAgICBsZXQgaGVpZ2h0ID0gKHRoaXMudG90YWxfaGVpZ2h0ICsgdGhpcy5sYXlvdXQuYnVmZmVyWzFdICogMikgKiB1cHAgKiBMYWJlbC5lcHNpbG9uO1xuXG4gICAgICAgIC8vIHJlc2V0IGJvdW5kaW5nIGJveGVzXG4gICAgICAgIHRoaXMub2JicyA9IFtdO1xuICAgICAgICB0aGlzLmFhYmJzID0gW107XG5cbiAgICAgICAgLy8gZnVkZ2Ugd2lkdGggdmFsdWUgYXMgdGV4dCBtYXkgb3ZlcmZsb3cgYm91bmRpbmcgYm94IGlmIGl0IGhhcyBpdGFsaWMsIGJvbGQsIGV0YyBzdHlsZVxuICAgICAgICBsZXQgaXRhbGljc19idWZmZXIgPSAodGhpcy5sYXlvdXQuaXRhbGljKSA/IDUgKiB1cHAgOiAwO1xuXG4gICAgICAgIHN3aXRjaCAodGhpcy5wbGFjZW1lbnQpIHtcbiAgICAgICAgICAgIGNhc2UgUExBQ0VNRU5ULkNPUk5FUjpcbiAgICAgICAgICAgICAgICBsZXQgYW5nbGUwID0gdGhpcy5hbmdsZVt0aGlzLmtpbmtfaW5kZXggLSAxXTsgLy8gYW5nbGUgYmVmb3JlIGtpbmtcbiAgICAgICAgICAgICAgICBsZXQgYW5nbGUxID0gdGhpcy5hbmdsZVt0aGlzLmtpbmtfaW5kZXhdOyAvLyBhbmdsZSBhZnRlciBraW5rXG4gICAgICAgICAgICAgICAgbGV0IHRoZXRhID0gTWF0aC5hYnMoYW5nbGUxIC0gYW5nbGUwKTsgLy8gYW5nbGUgZGVsdGFcblxuICAgICAgICAgICAgICAgIC8vIEEgc3ByZWFkIGZhY3RvciBvZiAwIHBpdm90cyB0aGUgYm94ZXMgb24gdGhlaXIgaG9yaXpvbnRhbCBjZW50ZXIsIGxvb2tpbmcgbGlrZTogXCJYXCJcbiAgICAgICAgICAgICAgICAvLyBhIHNwcmVhZCBmYWN0b3Igb2YgMSBvZmZzZXRzIHRoZSBib3hlcyBzbyB0aGF0IHRoZWlyIGNvcm5lcnMgdG91Y2gsIGxvb2tpbmcgbGlrZTogXCJcXC9cIiBvciBcIi9cXFwiXG4gICAgICAgICAgICAgICAgbGV0IGR4ID0gdGhpcy5zcHJlYWRfZmFjdG9yICogTWF0aC5hYnModGhpcy50b3RhbF9oZWlnaHQgKiBNYXRoLnRhbigwLjUgKiB0aGV0YSkpO1xuICAgICAgICAgICAgICAgIGxldCBudWRnZSA9IDAuNSAqICgtZHggLSB0aGlzLnNwYWNlX3dpZHRoKTtcblxuICAgICAgICAgICAgICAgIC8vIFBsYWNlIGxhYmVscyBiYWNrd2FyZHMgZnJvbSBraW5rIGluZGV4XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IHRoaXMua2lua19pbmRleCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCB3aWR0aF9weCA9IHRoaXMuc2l6ZVtpXVswXTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGFuZ2xlID0gdGhpcy5hbmdsZVtpXTtcblxuICAgICAgICAgICAgICAgICAgICBsZXQgd2lkdGggPSAod2lkdGhfcHggKyAyICogdGhpcy5sYXlvdXQuYnVmZmVyWzBdKSAqIHVwcCAqIExhYmVsLmVwc2lsb247XG5cbiAgICAgICAgICAgICAgICAgICAgbnVkZ2UgLT0gMC41ICogd2lkdGhfcHg7XG5cbiAgICAgICAgICAgICAgICAgICAgbGV0IG9mZnNldCA9IFZlY3Rvci5yb3QoW251ZGdlICogdXBwLCAwXSwgLWFuZ2xlKTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHBvc2l0aW9uID0gVmVjdG9yLmFkZCh0aGlzLnBvc2l0aW9uLCBvZmZzZXQpO1xuXG4gICAgICAgICAgICAgICAgICAgIGxldCBvYmIgPSBnZXRPQkIocG9zaXRpb24sIHdpZHRoICsgaXRhbGljc19idWZmZXIsIGhlaWdodCwgYW5nbGUsIHRoaXMub2Zmc2V0LCB1cHApO1xuICAgICAgICAgICAgICAgICAgICBsZXQgYWFiYiA9IG9iYi5nZXRFeHRlbnQoKTtcblxuICAgICAgICAgICAgICAgICAgICB0aGlzLm9iYnMucHVzaChvYmIpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmFhYmJzLnB1c2goYWFiYik7XG5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5vZmZzZXRzW2ldID0gW1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sYXlvdXQub2Zmc2V0WzBdICsgbnVkZ2UsXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxheW91dC5vZmZzZXRbMV1cbiAgICAgICAgICAgICAgICAgICAgXTtcblxuICAgICAgICAgICAgICAgICAgICBudWRnZSAtPSAwLjUgKiB3aWR0aF9weCArIHRoaXMuc3BhY2Vfd2lkdGg7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gUGxhY2UgbGFiZWxzIGZvcndhcmRzIGZyb20ga2luayBpbmRleFxuICAgICAgICAgICAgICAgIG51ZGdlID0gMC41ICogKGR4ICsgdGhpcy5zcGFjZV93aWR0aCk7XG5cbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gdGhpcy5raW5rX2luZGV4OyBpIDwgdGhpcy5udW1fc2VnbWVudHM7IGkrKyl7XG4gICAgICAgICAgICAgICAgICAgIGxldCB3aWR0aF9weCA9IHRoaXMuc2l6ZVtpXVswXTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGFuZ2xlID0gdGhpcy5hbmdsZVtpXTtcblxuICAgICAgICAgICAgICAgICAgICBsZXQgd2lkdGggPSAod2lkdGhfcHggKyAyICogdGhpcy5sYXlvdXQuYnVmZmVyWzBdKSAqIHVwcCAqIExhYmVsLmVwc2lsb247XG5cbiAgICAgICAgICAgICAgICAgICAgbnVkZ2UgKz0gMC41ICogd2lkdGhfcHg7XG5cbiAgICAgICAgICAgICAgICAgICAgbGV0IG9mZnNldCA9IFZlY3Rvci5yb3QoW251ZGdlICogdXBwLCAwXSwgLWFuZ2xlKTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHBvc2l0aW9uID0gVmVjdG9yLmFkZCh0aGlzLnBvc2l0aW9uLCBvZmZzZXQpO1xuXG4gICAgICAgICAgICAgICAgICAgIGxldCBvYmIgPSBnZXRPQkIocG9zaXRpb24sIHdpZHRoICsgaXRhbGljc19idWZmZXIsIGhlaWdodCwgYW5nbGUsIHRoaXMub2Zmc2V0LCB1cHApO1xuICAgICAgICAgICAgICAgICAgICBsZXQgYWFiYiA9IG9iYi5nZXRFeHRlbnQoKTtcblxuICAgICAgICAgICAgICAgICAgICB0aGlzLm9iYnMucHVzaChvYmIpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmFhYmJzLnB1c2goYWFiYik7XG5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5vZmZzZXRzW2ldID0gW1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sYXlvdXQub2Zmc2V0WzBdICsgbnVkZ2UsXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxheW91dC5vZmZzZXRbMV1cbiAgICAgICAgICAgICAgICAgICAgXTtcblxuICAgICAgICAgICAgICAgICAgICBudWRnZSArPSAwLjUgKiB3aWR0aF9weCArIHRoaXMuc3BhY2Vfd2lkdGg7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBQTEFDRU1FTlQuTUlEX1BPSU5UOlxuICAgICAgICAgICAgICAgIGxldCBzaGlmdCA9IC0wLjUgKiB0aGlzLnRvdGFsX2xlbmd0aDsgLy8gc2hpZnQgZm9yIGNlbnRlcmluZyB0aGUgbGFiZWxzXG5cbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMubnVtX3NlZ21lbnRzOyBpKyspe1xuICAgICAgICAgICAgICAgICAgICBsZXQgd2lkdGhfcHggPSB0aGlzLnNpemVbaV1bMF07XG4gICAgICAgICAgICAgICAgICAgIGxldCB3aWR0aCA9ICh3aWR0aF9weCArIDIgKiB0aGlzLmxheW91dC5idWZmZXJbMF0pICogdXBwICogTGFiZWwuZXBzaWxvbjtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGFuZ2xlID0gdGhpcy5hbmdsZVtpXTtcblxuICAgICAgICAgICAgICAgICAgICBzaGlmdCArPSAwLjUgKiB3aWR0aF9weDtcblxuICAgICAgICAgICAgICAgICAgICBsZXQgb2Zmc2V0ID0gVmVjdG9yLnJvdChbc2hpZnQgKiB1cHAsIDBdLCAtYW5nbGUpO1xuICAgICAgICAgICAgICAgICAgICBsZXQgcG9zaXRpb24gPSBWZWN0b3IuYWRkKHRoaXMucG9zaXRpb24sIG9mZnNldCk7XG5cbiAgICAgICAgICAgICAgICAgICAgbGV0IG9iYiA9IGdldE9CQihwb3NpdGlvbiwgd2lkdGggKyBpdGFsaWNzX2J1ZmZlciwgaGVpZ2h0LCBhbmdsZSwgdGhpcy5vZmZzZXQsIHVwcCk7XG4gICAgICAgICAgICAgICAgICAgIGxldCBhYWJiID0gb2JiLmdldEV4dGVudCgpO1xuXG4gICAgICAgICAgICAgICAgICAgIHRoaXMub2Jicy5wdXNoKG9iYik7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYWFiYnMucHVzaChhYWJiKTtcblxuICAgICAgICAgICAgICAgICAgICB0aGlzLm9mZnNldHNbaV0gPSBbXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxheW91dC5vZmZzZXRbMF0gKyBzaGlmdCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubGF5b3V0Lm9mZnNldFsxXVxuICAgICAgICAgICAgICAgICAgICBdO1xuXG4gICAgICAgICAgICAgICAgICAgIHNoaWZ0ICs9IDAuNSAqIHdpZHRoX3B4ICsgdGhpcy5zcGFjZV93aWR0aDtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIENoZWNrcyBlYWNoIHNlZ21lbnQgdG8gc2VlIGlmIGl0IGlzIHdpdGhpbiB0aGUgdGlsZS4gSWYgYW55IHNlZ21lbnQgZmFpbHMgdGhpcyB0ZXN0LCB0aGV5IGFsbCBmYWlsLlxuICAgIC8vIFRPRE86IGxhYmVsIGdyb3VwXG4gICAgaW5UaWxlQm91bmRzKCkge1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuYWFiYnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGxldCBhYWJiID0gdGhpcy5hYWJic1tpXTtcbiAgICAgICAgICAgIGxldCBvYmogPSB7IGFhYmIgfTtcbiAgICAgICAgICAgIGxldCBpbl9ib3VuZHMgPSBMYWJlbC5wcm90b3R5cGUuaW5UaWxlQm91bmRzLmNhbGwob2JqKTtcbiAgICAgICAgICAgIGlmICghaW5fYm91bmRzKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIC8vIEFkZHMgZWFjaCBzZWdtZW50IHRvIHRoZSBjb2xsaXNpb24gcGFzcyBhcyBpdHMgb3duIGJvdW5kaW5nIGJveFxuICAgIC8vIFRPRE86IGxhYmVsIGdyb3VwXG4gICAgYWRkKGJib3hlcykge1xuICAgICAgICB0aGlzLnBsYWNlZCA9IHRydWU7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5hYWJicy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgbGV0IGFhYmIgPSB0aGlzLmFhYmJzW2ldO1xuICAgICAgICAgICAgbGV0IG9iYiA9IHRoaXMub2Jic1tpXTtcbiAgICAgICAgICAgIGxldCBvYmogPSB7IGFhYmIsIG9iYiB9O1xuICAgICAgICAgICAgTGFiZWwucHJvdG90eXBlLmFkZC5jYWxsKG9iaiwgYmJveGVzKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIENoZWNrcyBlYWNoIHNlZ21lbnQgdG8gc2VlIGlmIGl0IHNob3VsZCBiZSBkaXNjYXJkZWQgKHZpYSBjb2xsaXNpb24pLiBJZiBhbnkgc2VnbWVudCBmYWlscyB0aGlzIHRlc3QsIHRoZXkgYWxsIGZhaWwuXG4gICAgLy8gVE9ETzogbGFiZWwgZ3JvdXBcbiAgICBkaXNjYXJkKGJib3hlcywgZXhjbHVkZSA9IG51bGwpIHtcbiAgICAgICAgaWYgKHRoaXMudGhyb3dfYXdheSkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMub2Jicy5sZW5ndGg7IGkrKyl7XG4gICAgICAgICAgICBsZXQgYWFiYiA9IHRoaXMuYWFiYnNbaV07XG4gICAgICAgICAgICBsZXQgb2JiID0gdGhpcy5vYmJzW2ldO1xuICAgICAgICAgICAgbGV0IG9iaiA9IHsgYWFiYiwgb2JiIH07XG5cbiAgICAgICAgICAgIGxldCBzaG91bGREaXNjYXJkID0gTGFiZWwucHJvdG90eXBlLm9jY2x1ZGVkLmNhbGwob2JqLCBiYm94ZXMsIGV4Y2x1ZGUpO1xuICAgICAgICAgICAgaWYgKHNob3VsZERpc2NhcmQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxufVxuXG4vLyBQcml2YXRlIG1ldGhvZCB0byBjYWxjdWxhdGUgb3JpZW50ZWQgYm91bmRpbmcgYm94XG5mdW5jdGlvbiBnZXRPQkIocG9zaXRpb24sIHdpZHRoLCBoZWlnaHQsIGFuZ2xlLCBvZmZzZXQsIHVwcCkge1xuICAgIGxldCBwMCwgcDE7XG4gICAgLy8gYXBwbHkgb2Zmc2V0LCB4IHBvc2l0aXZlLCB5IHBvaW50aW5nIGRvd25cbiAgICBpZiAob2Zmc2V0ICYmIChvZmZzZXRbMF0gIT09IDAgfHwgb2Zmc2V0WzFdICE9PSAwKSkge1xuICAgICAgICBvZmZzZXQgPSBWZWN0b3Iucm90KG9mZnNldCwgYW5nbGUpO1xuICAgICAgICBwMCA9IHBvc2l0aW9uWzBdICsgKG9mZnNldFswXSAqIHVwcCk7XG4gICAgICAgIHAxID0gcG9zaXRpb25bMV0gLSAob2Zmc2V0WzFdICogdXBwKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHAwID0gcG9zaXRpb25bMF07XG4gICAgICAgIHAxID0gcG9zaXRpb25bMV07XG4gICAgfVxuXG4gICAgLy8gdGhlIGFuZ2xlIG9mIHRoZSBvYmIgaXMgbmVnYXRpdmUgc2luY2UgaXQncyB0aGUgdGlsZSBzeXN0ZW0geSBheGlzIGlzIHBvaW50aW5nIGRvd25cbiAgICByZXR1cm4gbmV3IE9CQihwMCwgcDEsIC1hbmdsZSwgd2lkdGgsIGhlaWdodCk7XG59XG5cbi8vIFByaXZhdGUgbWV0aG9kIHRvIGNhbGN1bGF0ZSB0aGUgYW5nbGUgb2YgYSBzZWdtZW50LlxuLy8gVHJhbnNmb3JtcyB0aGUgYW5nbGUgdG8gbGllIHdpdGhpbiB0aGUgcmFuZ2UgWzAsIFBJLzJdIGFuZCBbMypQSS8yLCAyKlBJXSAoMXN0IG9yIDR0aCBxdWFkcmFudHMpXG4vLyBhcyBvdGhlciByYW5nZXMgcHJvZHVjZSBcInVwc2lkZSBkb3duXCIgbGFiZWxzXG5mdW5jdGlvbiBnZXRBbmdsZUZyb21TZWdtZW50KHB0MSwgcHQyKSB7XG4gICAgbGV0IFBJID0gTWF0aC5QSTtcbiAgICBsZXQgUElfMiA9IFBJIC8gMjtcbiAgICBsZXQgcDFwMiA9IFZlY3Rvci5zdWIocHQxLCBwdDIpO1xuICAgIGxldCB0aGV0YSA9IE1hdGguYXRhbjIocDFwMlswXSwgcDFwMlsxXSkgKyBQSV8yO1xuXG4gICAgaWYgKHRoZXRhID4gUElfMikge1xuICAgICAgICAvLyBJZiBpbiAybmQgcXVhZHJhbnQsIG1vdmUgdG8gNHRoIHF1YWRyYW50XG4gICAgICAgIHRoZXRhICs9IFBJO1xuICAgICAgICB0aGV0YSAlPSAyICogTWF0aC5QSTtcbiAgICB9XG4gICAgZWxzZSBpZiAodGhldGEgPCAwKSB7XG4gICAgICAgIC8vIElmIGluIDR0aCBxdWFkcmFudCwgbWFrZSBhIHBvc2l0aXZlIGFuZ2xlXG4gICAgICAgIHRoZXRhICs9IDIgKiBQSTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhldGE7XG59XG5cbmZ1bmN0aW9uIGNhbGNGaXRuZXNzKGxpbmVfbGVuZ3RoLCBsYWJlbF9sZW5ndGgpe1xuICAgIHJldHVybiAxIC0gbGluZV9sZW5ndGggLyBsYWJlbF9sZW5ndGg7XG59XG4iLCJpbXBvcnQgTGFiZWwgZnJvbSAnLi9sYWJlbCc7XG5pbXBvcnQgUG9pbnRBbmNob3IgZnJvbSAnLi9wb2ludF9hbmNob3InO1xuaW1wb3J0IEdlbyBmcm9tICcuLi9nZW8nO1xuaW1wb3J0IE9CQiBmcm9tICcuLi91dGlscy9vYmInO1xuaW1wb3J0IHtTdHlsZVBhcnNlcn0gZnJvbSAnLi4vc3R5bGVzL3N0eWxlX3BhcnNlcic7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIExhYmVsUG9pbnQgZXh0ZW5kcyBMYWJlbCB7XG5cbiAgICBjb25zdHJ1Y3RvciAocG9zaXRpb24sIHNpemUsIGxheW91dCkge1xuICAgICAgICBzdXBlcihzaXplLCBsYXlvdXQpO1xuICAgICAgICB0aGlzLnBvc2l0aW9uID0gW3Bvc2l0aW9uWzBdLCBwb3NpdGlvblsxXV07XG4gICAgICAgIHRoaXMucGFyZW50ID0gdGhpcy5sYXlvdXQucGFyZW50O1xuICAgICAgICB0aGlzLnVwZGF0ZSgpO1xuXG4gICAgICAgIGlmICh0aGlzLmxheW91dC5hbmNob3IpIHtcbiAgICAgICAgICAgIHRoaXMuc3RhcnRfYW5jaG9yX2luZGV4ID0gMTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBoYXNOZXh0ID0gdGhpcy5nZXROZXh0Rml0KCk7XG4gICAgICAgIHRoaXMudGhyb3dfYXdheSA9ICFoYXNOZXh0O1xuICAgIH1cblxuICAgIHVwZGF0ZSgpIHtcbiAgICAgICAgc3VwZXIudXBkYXRlKCk7XG4gICAgICAgIHRoaXMuY29tcHV0ZU9mZnNldCgpO1xuICAgICAgICB0aGlzLnVwZGF0ZUJCb3hlcygpO1xuICAgIH1cblxuICAgIGNvbXB1dGVPZmZzZXQgKCkge1xuICAgICAgICB0aGlzLm9mZnNldCA9IFt0aGlzLmxheW91dC5vZmZzZXRbMF0sIHRoaXMubGF5b3V0Lm9mZnNldFsxXV07XG5cbiAgICAgICAgLy8gQWRkaXRpb25hbCBhbmNob3Ivb2Zmc2V0IGZvciBwb2ludDpcbiAgICAgICAgaWYgKHRoaXMucGFyZW50KSB7XG4gICAgICAgICAgICBsZXQgcGFyZW50ID0gdGhpcy5wYXJlbnQ7XG4gICAgICAgICAgICAvLyBwb2ludCdzIG93biBhbmNob3IsIHRleHQgYW5jaG9yIGFwcGxpZWQgdG8gcG9pbnQsIGFkZGl0aW9uYWwgcG9pbnQgb2Zmc2V0XG4gICAgICAgICAgICB0aGlzLm9mZnNldCA9IFBvaW50QW5jaG9yLmNvbXB1dGVPZmZzZXQodGhpcy5vZmZzZXQsIHBhcmVudC5zaXplLCBwYXJlbnQuYW5jaG9yLCBQb2ludEFuY2hvci56ZXJvX2J1ZmZlcik7XG4gICAgICAgICAgICB0aGlzLm9mZnNldCA9IFBvaW50QW5jaG9yLmNvbXB1dGVPZmZzZXQodGhpcy5vZmZzZXQsIHBhcmVudC5zaXplLCB0aGlzLmFuY2hvciwgUG9pbnRBbmNob3IuemVyb19idWZmZXIpO1xuICAgICAgICAgICAgaWYgKHBhcmVudC5vZmZzZXQgIT09IFN0eWxlUGFyc2VyLnplcm9QYWlyKSB7ICAgICAgICAvLyBwb2ludCBoYXMgYW4gb2Zmc2V0XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMub2Zmc2V0ID09PSBTdHlsZVBhcnNlci56ZXJvUGFpcikgeyAgICAgIC8vIG5vIHRleHQgb2Zmc2V0LCB1c2UgcG9pbnQnc1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm9mZnNldCA9IHBhcmVudC5vZmZzZXQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0ZXh0IGhhcyBvZmZzZXQsIGFkZCBwb2ludCdzXG4gICAgICAgICAgICAgICAgICAgIHRoaXMub2Zmc2V0WzBdICs9IHBhcmVudC5vZmZzZXRbMF07XG4gICAgICAgICAgICAgICAgICAgIHRoaXMub2Zmc2V0WzFdICs9IHBhcmVudC5vZmZzZXRbMV07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5vZmZzZXQgPSBQb2ludEFuY2hvci5jb21wdXRlT2Zmc2V0KHRoaXMub2Zmc2V0LCB0aGlzLnNpemUsIHRoaXMuYW5jaG9yKTtcbiAgICB9XG5cbiAgICB1cGRhdGVCQm94ZXMgKCkge1xuICAgICAgICBsZXQgd2lkdGggPSAodGhpcy5zaXplWzBdICsgdGhpcy5sYXlvdXQuYnVmZmVyWzBdICogMikgKiB0aGlzLmxheW91dC51bml0c19wZXJfcGl4ZWwgKiBMYWJlbC5lcHNpbG9uO1xuICAgICAgICBsZXQgaGVpZ2h0ID0gKHRoaXMuc2l6ZVsxXSArIHRoaXMubGF5b3V0LmJ1ZmZlclsxXSAqIDIpICogdGhpcy5sYXlvdXQudW5pdHNfcGVyX3BpeGVsICogTGFiZWwuZXBzaWxvbjtcblxuICAgICAgICAvLyBmdWRnZSB3aWR0aCB2YWx1ZSBhcyB0ZXh0IG1heSBvdmVyZmxvdyBib3VuZGluZyBib3ggaWYgaXQgaGFzIGl0YWxpYywgYm9sZCwgZXRjIHN0eWxlXG4gICAgICAgIGlmICh0aGlzLmxheW91dC5pdGFsaWMpe1xuICAgICAgICAgICAgd2lkdGggKz0gNSAqIHRoaXMubGF5b3V0LnVuaXRzX3Blcl9waXhlbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBwID0gW1xuICAgICAgICAgICAgdGhpcy5wb3NpdGlvblswXSArICh0aGlzLm9mZnNldFswXSAqIHRoaXMubGF5b3V0LnVuaXRzX3Blcl9waXhlbCksXG4gICAgICAgICAgICB0aGlzLnBvc2l0aW9uWzFdIC0gKHRoaXMub2Zmc2V0WzFdICogdGhpcy5sYXlvdXQudW5pdHNfcGVyX3BpeGVsKVxuICAgICAgICBdO1xuXG4gICAgICAgIHRoaXMub2JiID0gbmV3IE9CQihwWzBdLCBwWzFdLCAwLCB3aWR0aCwgaGVpZ2h0KTtcbiAgICAgICAgdGhpcy5hYWJiID0gdGhpcy5vYmIuZ2V0RXh0ZW50KCk7XG4gICAgfVxuXG4gICAgLy8gVHJ5IHRvIG1vdmUgdGhlIGxhYmVsIGludG8gdGhlIHRpbGUgYm91bmRzXG4gICAgLy8gUmV0dXJucyB0cnVlIGlmIGxhYmVsIHdhcyBtb3ZlZCBpbnRvIHRpbGUsIGZhbHNlIGlmIGl0IGNvdWxkbid0IGJlIG1vdmVkXG4gICAgbW92ZUludG9UaWxlICgpIHtcbiAgICAgICAgbGV0IHVwZGF0ZWQgPSBmYWxzZTtcblxuICAgICAgICBpZiAodGhpcy5hYWJiWzBdIDwgMCkge1xuICAgICAgICAgICAgdGhpcy5wb3NpdGlvblswXSArPSAtdGhpcy5hYWJiWzBdO1xuICAgICAgICAgICAgdXBkYXRlZCA9IHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5hYWJiWzJdID49IEdlby50aWxlX3NjYWxlKSB7XG4gICAgICAgICAgICB0aGlzLnBvc2l0aW9uWzBdIC09IHRoaXMuYWFiYlsyXSAtIEdlby50aWxlX3NjYWxlICsgMTtcbiAgICAgICAgICAgIHVwZGF0ZWQgPSB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuYWFiYlszXSA+IDApIHtcbiAgICAgICAgICAgIHRoaXMucG9zaXRpb25bMV0gLT0gdGhpcy5hYWJiWzNdO1xuICAgICAgICAgICAgdXBkYXRlZCA9IHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5hYWJiWzFdIDw9IC1HZW8udGlsZV9zY2FsZSkge1xuICAgICAgICAgICAgdGhpcy5wb3NpdGlvblsxXSAtPSB0aGlzLmFhYmJbMV0gKyBHZW8udGlsZV9zY2FsZSAtIDE7XG4gICAgICAgICAgICB1cGRhdGVkID0gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh1cGRhdGVkKSB7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZUJCb3hlcygpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHVwZGF0ZWQ7XG4gICAgfVxuXG4gICAgZ2V0TmV4dEZpdCgpIHtcbiAgICAgICAgaWYgKCF0aGlzLmxheW91dC5jdWxsX2Zyb21fdGlsZSB8fCB0aGlzLmluVGlsZUJvdW5kcygpKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmxheW91dC5tb3ZlX2ludG9fdGlsZSl7XG4gICAgICAgICAgICB0aGlzLm1vdmVJbnRvVGlsZSgpO1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh0aGlzLmxheW91dC5hbmNob3IpKSB7XG4gICAgICAgICAgICAgICAgLy8gU3RhcnQgb24gc2Vjb25kIGFuY2hvciAoZmlyc3QgYW5jaG9yIHdhcyBzZXQgb24gY3JlYXRpb24pXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDE7IGkgPCB0aGlzLmxheW91dC5hbmNob3IubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hbmNob3IgPSB0aGlzLmxheW91dC5hbmNob3JbaV07XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlKCk7XG5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zdGFydF9hbmNob3JfaW5kZXggPSBpO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmluVGlsZUJvdW5kcygpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gbm8gYW5jaG9ycyByZXN1bHQgaW4gZml0XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBkaXNjYXJkIChiYm94ZXMsIGV4Y2x1ZGUgPSBudWxsKSB7XG4gICAgICAgIGlmIChzdXBlci5kaXNjYXJkKGJib3hlcywgZXhjbHVkZSkpIHtcbiAgICAgICAgICAgIC8vIElmIG1vcmUgdGhhbiBvbmUgYW5jaG9yIHNwZWNpZmllZCwgdHJ5IHRoZW0gaW4gb3JkZXJcbiAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KHRoaXMubGF5b3V0LmFuY2hvcikpIHtcbiAgICAgICAgICAgICAgICAvLyBTdGFydCBvbiBzZWNvbmQgYW5jaG9yIChmaXJzdCBhbmNob3Igd2FzIHNldCBvbiBjcmVhdGlvbilcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpPXRoaXMuc3RhcnRfYW5jaG9yX2luZGV4OyBpIDwgdGhpcy5sYXlvdXQuYW5jaG9yLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYW5jaG9yID0gdGhpcy5sYXlvdXQuYW5jaG9yW2ldO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZSgpO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmxheW91dC5jdWxsX2Zyb21fdGlsZSAmJiAhdGhpcy5pblRpbGVCb3VuZHMoKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBpZiAoIXN1cGVyLmRpc2NhcmQoYmJveGVzLCBleGNsdWRlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxufVxuXG4vLyBQbGFjZW1lbnQgc3RyYXRlZ2llc1xuTGFiZWxQb2ludC5QTEFDRU1FTlQgPSB7XG4gICAgVkVSVEVYOiAwLCAgICAgICAgICAvLyBwbGFjZSBsYWJlbHMgYXQgZW5kcG9pbnRzIG9mIGxpbmUgc2VnbWVudHNcbiAgICBNSURQT0lOVDogMSwgICAgICAgIC8vIHBsYWNlIGxhYmVscyBhdCBtaWRwb2ludHMgb2YgbGluZSBzZWdtZW50c1xuICAgIFNQQUNFRDogMiwgICAgICAgICAgLy8gcGxhY2UgbGFiZWxzIGVxdWFsbHkgc3BhY2VkIGFsb25nIGxpbmVcbiAgICBDRU5UUk9JRDogMyAgICAgICAgIC8vIHBsYWNlIGxhYmVscyBhdCBjZW50ZXIgb2YgcG9seWdvbnNcbn07XG4iLCIvLyBTZXRzIG9mIHZhbHVlcyB0byBtYXRjaCBmb3IgZGlyZWN0aW9uYWwgYW5kIGNvcm5lciBhbmNob3JzXG5jb25zdCBsZWZ0cyA9IFsnbGVmdCcsICd0b3AtbGVmdCcsICdib3R0b20tbGVmdCddO1xuY29uc3QgcmlnaHRzID0gWydyaWdodCcsICd0b3AtcmlnaHQnLCAnYm90dG9tLXJpZ2h0J107XG5jb25zdCB0b3BzID0gWyd0b3AnLCAndG9wLWxlZnQnLCAndG9wLXJpZ2h0J107XG5jb25zdCBib3R0b21zID0gWydib3R0b20nLCAnYm90dG9tLWxlZnQnLCAnYm90dG9tLXJpZ2h0J107XG5cbmxldCBQb2ludEFuY2hvcjtcblxuZXhwb3J0IGRlZmF1bHQgUG9pbnRBbmNob3IgPSB7XG5cbiAgICBjb21wdXRlT2Zmc2V0IChvZmZzZXQsIHNpemUsIGFuY2hvciwgYnVmZmVyID0gbnVsbCkge1xuICAgICAgICBpZiAoIWFuY2hvciB8fCBhbmNob3IgPT09ICdjZW50ZXInKSB7XG4gICAgICAgICAgICByZXR1cm4gb2Zmc2V0O1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IG9mZnNldDIgPSBbb2Zmc2V0WzBdLCBvZmZzZXRbMV1dO1xuICAgICAgICBidWZmZXIgPSBidWZmZXIgfHwgdGhpcy5kZWZhdWx0X2J1ZmZlcjtcblxuICAgICAgICAvLyBBbiBvcHRpb25hbCBsZWZ0L3JpZ2h0IG9mZnNldFxuICAgICAgICBpZiAodGhpcy5pc0xlZnRBbmNob3IoYW5jaG9yKSkge1xuICAgICAgICAgICAgb2Zmc2V0MlswXSAtPSBzaXplWzBdIC8gMjtcbiAgICAgICAgICAgIGlmIChhbmNob3IgPT09ICdsZWZ0Jykge1xuICAgICAgICAgICAgICAgIG9mZnNldDJbMF0gLT0gYnVmZmVyWzBdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHRoaXMuaXNSaWdodEFuY2hvcihhbmNob3IpKSB7XG4gICAgICAgICAgICBvZmZzZXQyWzBdICs9IHNpemVbMF0gLyAyO1xuICAgICAgICAgICAgaWYgKGFuY2hvciA9PT0gJ3JpZ2h0Jykge1xuICAgICAgICAgICAgICAgIG9mZnNldDJbMF0gKz0gYnVmZmVyWzFdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gQW4gb3B0aW9uYWwgdG9wL2JvdHRvbSBvZmZzZXRcbiAgICAgICAgaWYgKHRoaXMuaXNUb3BBbmNob3IoYW5jaG9yKSkge1xuICAgICAgICAgICAgb2Zmc2V0MlsxXSAtPSBzaXplWzFdIC8gMjtcbiAgICAgICAgICAgIGlmIChhbmNob3IgPT09ICd0b3AnKSB7XG4gICAgICAgICAgICAgICAgb2Zmc2V0MlsxXSAtPSBidWZmZXJbMl07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodGhpcy5pc0JvdHRvbUFuY2hvcihhbmNob3IpKSB7XG4gICAgICAgICAgICBvZmZzZXQyWzFdICs9IHNpemVbMV0gLyAyO1xuICAgICAgICAgICAgaWYgKGFuY2hvciA9PT0gJ2JvdHRvbScpIHtcbiAgICAgICAgICAgICAgICBvZmZzZXQyWzFdICs9IGJ1ZmZlclszXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBvZmZzZXQyO1xuICAgIH0sXG5cbiAgICBhbGlnbkZvckFuY2hvciAoYW5jaG9yKSB7XG4gICAgICAgIGlmIChhbmNob3IgJiYgYW5jaG9yICE9PSAnY2VudGVyJykge1xuICAgICAgICAgICAgaWYgKHRoaXMuaXNMZWZ0QW5jaG9yKGFuY2hvcikpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ3JpZ2h0JztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHRoaXMuaXNSaWdodEFuY2hvcihhbmNob3IpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICdsZWZ0JztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gJ2NlbnRlcic7XG4gICAgfSxcblxuICAgIGlzTGVmdEFuY2hvciAoYW5jaG9yKSB7XG4gICAgICAgIHJldHVybiAobGVmdHMuaW5kZXhPZihhbmNob3IpID4gLTEpO1xuICAgIH0sXG5cbiAgICBpc1JpZ2h0QW5jaG9yIChhbmNob3IpIHtcbiAgICAgICAgcmV0dXJuIChyaWdodHMuaW5kZXhPZihhbmNob3IpID4gLTEpO1xuICAgIH0sXG5cbiAgICBpc1RvcEFuY2hvciAoYW5jaG9yKSB7XG4gICAgICAgIHJldHVybiAodG9wcy5pbmRleE9mKGFuY2hvcikgPiAtMSk7XG4gICAgfSxcblxuICAgIGlzQm90dG9tQW5jaG9yIChhbmNob3IpIHtcbiAgICAgICAgcmV0dXJuIChib3R0b21zLmluZGV4T2YoYW5jaG9yKSA+IC0xKTtcbiAgICB9LFxuXG4gICAgLy8gQnVmZmVyczogW2xlZnQsIHJpZ2h0LCB0b3AsIGJvdHRvbV1cbiAgICBkZWZhdWx0X2J1ZmZlcjogWzIuNSwgMi41LCAxLjUsIDAuNzVdLFxuICAgIHplcm9fYnVmZmVyOiBbMCwgMCwgMCwgMF1cblxufTtcbiIsIi8vIExvZ2ljIGZvciBwbGFjaW5nIHBvaW50IGxhYmVscyBhbG9uZyBhIGxpbmUgZ2VvbWV0cnlcblxuaW1wb3J0IExhYmVsUG9pbnQgZnJvbSAnLi9sYWJlbF9wb2ludCc7XG5pbXBvcnQge2lzQ29vcmRPdXRzaWRlVGlsZX0gZnJvbSAnLi4vYnVpbGRlcnMvY29tbW9uJztcblxuY29uc3QgUExBQ0VNRU5UID0gTGFiZWxQb2ludC5QTEFDRU1FTlQ7XG5jb25zdCBkZWZhdWx0X3NwYWNpbmcgPSA4MDsgLy8gc3BhY2luZyBvZiBwb2ludHMgYWxvbmcgbGluZSBpbiBwaXhlbHNcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gcGxhY2VQb2ludHNPbkxpbmUgKGxpbmUsIHNpemUsIG9wdGlvbnMpIHtcbiAgICBsZXQgbGFiZWxzID0gW107XG4gICAgbGV0IHN0cmF0ZWd5ID0gb3B0aW9ucy5wbGFjZW1lbnQ7XG4gICAgbGV0IG1pbl9sZW5ndGggPSBNYXRoLm1heChzaXplWzBdLCBzaXplWzFdKSAqIG9wdGlvbnMucGxhY2VtZW50X21pbl9sZW5ndGhfcmF0aW8gKiBvcHRpb25zLnVuaXRzX3Blcl9waXhlbDtcblxuICAgIHN3aXRjaCAoc3RyYXRlZ3kpe1xuICAgICAgICBjYXNlIFBMQUNFTUVOVC5TUEFDRUQ6XG4gICAgICAgICAgICBsZXQgcmVzdWx0ID0gZ2V0UG9zaXRpb25zQW5kQW5nbGVzKGxpbmUsIG1pbl9sZW5ndGgsIG9wdGlvbnMpO1xuICAgICAgICAgICAgLy8gZmFsc2Ugd2lsbCBiZSByZXR1cm5lZCBpZiBsaW5lIGhhdmUgbm8gbGVuZ3RoXG4gICAgICAgICAgICBpZiAoIXJlc3VsdCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgbGV0IHBvc2l0aW9ucyA9IHJlc3VsdC5wb3NpdGlvbnM7XG4gICAgICAgICAgICBsZXQgYW5nbGVzID0gcmVzdWx0LmFuZ2xlcztcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcG9zaXRpb25zLmxlbmd0aDsgaSsrKXtcbiAgICAgICAgICAgICAgICBsZXQgcG9zaXRpb24gPSBwb3NpdGlvbnNbaV07XG4gICAgICAgICAgICAgICAgbGV0IGFuZ2xlID0gYW5nbGVzW2ldO1xuICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLnRpbGVfZWRnZXMgPT09IHRydWUgfHwgIWlzQ29vcmRPdXRzaWRlVGlsZShwb3NpdGlvbikpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGxhYmVsID0gbmV3IExhYmVsUG9pbnQocG9zaXRpb24sIHNpemUsIG9wdGlvbnMpO1xuICAgICAgICAgICAgICAgICAgICBsYWJlbC5hbmdsZSA9IGFuZ2xlO1xuICAgICAgICAgICAgICAgICAgICBsYWJlbHMucHVzaChsYWJlbCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgUExBQ0VNRU5ULlZFUlRFWDpcbiAgICAgICAgICAgIGxldCBwLCBxLCBsYWJlbDtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGluZS5sZW5ndGggLSAxOyBpKyspe1xuICAgICAgICAgICAgICAgIHAgPSBsaW5lW2ldO1xuICAgICAgICAgICAgICAgIHEgPSBsaW5lW2kgKyAxXTtcbiAgICAgICAgICAgICAgICBpZiAob3B0aW9ucy50aWxlX2VkZ2VzID09PSB0cnVlIHx8ICFpc0Nvb3JkT3V0c2lkZVRpbGUocCkpIHtcbiAgICAgICAgICAgICAgICAgICAgbGFiZWwgPSBuZXcgTGFiZWxQb2ludChwLCBzaXplLCBvcHRpb25zKTtcbiAgICAgICAgICAgICAgICAgICAgbGFiZWwuYW5nbGUgPSBnZXRBbmdsZShwLCBxLCBvcHRpb25zLmFuZ2xlKTtcbiAgICAgICAgICAgICAgICAgICAgbGFiZWxzLnB1c2gobGFiZWwpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gYWRkIGxhc3QgZW5kcG9pbnRcbiAgICAgICAgICAgIGxhYmVsID0gbmV3IExhYmVsUG9pbnQocSwgc2l6ZSwgb3B0aW9ucyk7XG4gICAgICAgICAgICBsYWJlbC5hbmdsZSA9IGdldEFuZ2xlKHAsIHEsIG9wdGlvbnMuYW5nbGUpO1xuICAgICAgICAgICAgbGFiZWxzLnB1c2gobGFiZWwpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgUExBQ0VNRU5ULk1JRFBPSU5UOlxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsaW5lLmxlbmd0aCAtIDE7IGkrKyl7XG4gICAgICAgICAgICAgICAgbGV0IHAgPSBsaW5lW2ldO1xuICAgICAgICAgICAgICAgIGxldCBxID0gbGluZVtpICsgMV07XG4gICAgICAgICAgICAgICAgbGV0IHBvc2l0aW9uID0gW1xuICAgICAgICAgICAgICAgICAgICAwLjUgKiAocFswXSArIHFbMF0pLFxuICAgICAgICAgICAgICAgICAgICAwLjUgKiAocFsxXSArIHFbMV0pXG4gICAgICAgICAgICAgICAgXTtcbiAgICAgICAgICAgICAgICBpZiAob3B0aW9ucy50aWxlX2VkZ2VzID09PSB0cnVlIHx8ICFpc0Nvb3JkT3V0c2lkZVRpbGUocG9zaXRpb24pKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghbWluX2xlbmd0aCB8fCBub3JtKHAsIHEpID4gbWluX2xlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGxhYmVsID0gbmV3IExhYmVsUG9pbnQocG9zaXRpb24sIHNpemUsIG9wdGlvbnMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWwuYW5nbGUgPSBnZXRBbmdsZShwLCBxLCBvcHRpb25zLmFuZ2xlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVscy5wdXNoKGxhYmVsKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJyZWFrO1xuICAgIH1cbiAgICByZXR1cm4gbGFiZWxzO1xufVxuXG5mdW5jdGlvbiBnZXRQb3NpdGlvbnNBbmRBbmdsZXMobGluZSwgbWluX2xlbmd0aCwgb3B0aW9ucyl7XG4gICAgbGV0IHVwcCA9IG9wdGlvbnMudW5pdHNfcGVyX3BpeGVsO1xuICAgIGxldCBzcGFjaW5nID0gKG9wdGlvbnMucGxhY2VtZW50X3NwYWNpbmcgfHwgZGVmYXVsdF9zcGFjaW5nKSAqIHVwcDtcblxuICAgIGxldCBsZW5ndGggPSBnZXRMaW5lTGVuZ3RoKGxpbmUpO1xuICAgIGlmIChsZW5ndGggPD0gbWluX2xlbmd0aCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgbGV0IG51bV9sYWJlbHMgPSBNYXRoLm1heChNYXRoLmZsb29yKGxlbmd0aCAvIHNwYWNpbmcpLCAxKTtcbiAgICBsZXQgcmVtYWluZGVyID0gbGVuZ3RoIC0gKG51bV9sYWJlbHMgLSAxKSAqIHNwYWNpbmc7XG4gICAgbGV0IHBvc2l0aW9ucyA9IFtdO1xuICAgIGxldCBhbmdsZXMgPSBbXTtcblxuICAgIGxldCBkaXN0YW5jZSA9IDAuNSAqIHJlbWFpbmRlcjtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG51bV9sYWJlbHM7IGkrKyl7XG4gICAgICAgIGxldCB7cG9zaXRpb24sIGFuZ2xlfSA9IGludGVycG9sYXRlTGluZShsaW5lLCBkaXN0YW5jZSwgbWluX2xlbmd0aCwgb3B0aW9ucyk7XG4gICAgICAgIGlmIChwb3NpdGlvbiAhPSBudWxsICYmIGFuZ2xlICE9IG51bGwpIHtcbiAgICAgICAgICAgIHBvc2l0aW9ucy5wdXNoKHBvc2l0aW9uKTtcbiAgICAgICAgICAgIGFuZ2xlcy5wdXNoKGFuZ2xlKTtcbiAgICAgICAgfVxuICAgICAgICBkaXN0YW5jZSArPSBzcGFjaW5nO1xuICAgIH1cblxuICAgIHJldHVybiB7cG9zaXRpb25zLCBhbmdsZXN9O1xufVxuXG5mdW5jdGlvbiBnZXRBbmdsZShwLCBxLCBhbmdsZSA9IDApe1xuICAgIHJldHVybiAoYW5nbGUgPT09ICdhdXRvJykgPyBNYXRoLmF0YW4yKHFbMF0gLSBwWzBdLCBxWzFdIC0gcFsxXSkgOiBhbmdsZTtcbn1cblxuZnVuY3Rpb24gZ2V0TGluZUxlbmd0aChsaW5lKXtcbiAgICBsZXQgZGlzdGFuY2UgPSAwO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGluZS5sZW5ndGggLSAxOyBpKyspe1xuICAgICAgICBkaXN0YW5jZSArPSBub3JtKGxpbmVbaV0sIGxpbmVbaSsxXSk7XG4gICAgfVxuICAgIHJldHVybiBkaXN0YW5jZTtcbn1cblxuZnVuY3Rpb24gbm9ybShwLCBxKXtcbiAgICByZXR1cm4gTWF0aC5zcXJ0KE1hdGgucG93KHBbMF0gLSBxWzBdLCAyKSArIE1hdGgucG93KHBbMV0gLSBxWzFdLCAyKSk7XG59XG5cbmZ1bmN0aW9uIGludGVycG9sYXRlTGluZShsaW5lLCBkaXN0YW5jZSwgbWluX2xlbmd0aCwgb3B0aW9ucyl7XG4gICAgbGV0IHN1bSA9IDA7XG4gICAgbGV0IHBvc2l0aW9uLCBhbmdsZTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxpbmUubGVuZ3RoLTE7IGkrKyl7XG4gICAgICAgIGxldCBwID0gbGluZVtpXTtcbiAgICAgICAgbGV0IHEgPSBsaW5lW2krMV07XG5cbiAgICAgICAgY29uc3QgbGVuZ3RoID0gbm9ybShwLCBxKTtcbiAgICAgICAgaWYgKGxlbmd0aCA8PSBtaW5fbGVuZ3RoKSB7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHN1bSArPSBsZW5ndGg7XG5cbiAgICAgICAgaWYgKHN1bSA+IGRpc3RhbmNlKXtcbiAgICAgICAgICAgIHBvc2l0aW9uID0gaW50ZXJwb2xhdGVTZWdtZW50KHAsIHEsIHN1bSAtIGRpc3RhbmNlKTtcbiAgICAgICAgICAgIGFuZ2xlID0gZ2V0QW5nbGUocCwgcSwgb3B0aW9ucy5hbmdsZSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4ge3Bvc2l0aW9uLCBhbmdsZX07XG59XG5cbmZ1bmN0aW9uIGludGVycG9sYXRlU2VnbWVudChwLCBxLCBkaXN0YW5jZSl7XG4gICAgbGV0IGxlbmd0aCA9IG5vcm0ocCwgcSk7XG4gICAgbGV0IHJhdGlvID0gZGlzdGFuY2UgLyBsZW5ndGg7XG4gICAgcmV0dXJuIFtcbiAgICAgICAgcmF0aW8gKiBwWzBdICsgKDEgLSByYXRpbykgKiBxWzBdLFxuICAgICAgICByYXRpbyAqIHBbMV0gKyAoMSAtIHJhdGlvKSAqIHFbMV1cbiAgICBdO1xufVxuIiwiaW1wb3J0IEdlbyBmcm9tICcuLi9nZW8nO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBSZXBlYXRHcm91cCB7XG5cbiAgICBjb25zdHJ1Y3RvciAoa2V5LCByZXBlYXRfZGlzdCwgbWF4X3JlcGVhdF9kaXN0KSB7XG4gICAgICAgIHRoaXMua2V5ID0ga2V5O1xuICAgICAgICB0aGlzLnJlcGVhdF9kaXN0ID0gcmVwZWF0X2Rpc3Q7XG4gICAgICAgIHRoaXMucmVwZWF0X2Rpc3Rfc3EgPSB0aGlzLnJlcGVhdF9kaXN0ICogdGhpcy5yZXBlYXRfZGlzdDtcbiAgICAgICAgdGhpcy5tYXhfcmVwZWF0X2Rpc3Rfc3EgPSBtYXhfcmVwZWF0X2Rpc3QgKiBtYXhfcmVwZWF0X2Rpc3Q7XG4gICAgICAgIHRoaXMub25lX3Blcl9ncm91cCA9ICh0aGlzLnJlcGVhdF9kaXN0X3NxID49IHRoaXMubWF4X3JlcGVhdF9kaXN0X3NxKSA/IHRydWUgOiBmYWxzZTtcbiAgICAgICAgdGhpcy5wb3NpdGlvbnMgPSBbXTtcbiAgICB9XG5cbiAgICAvLyBDaGVjayBhbiBvYmplY3QgdG8gc2VlIGlmIGl0J3MgYSByZXBlYXQgaW4gdGhpcyBncm91cFxuICAgIGNoZWNrIChvYmopIHtcbiAgICAgICAgLy8gSWYgb25seSBvbmUgb2JqZWN0IGFsbG93ZWQgcGVyIGdyb3VwLCBzaG9ydGN1dCBkaXN0YW5jZSBsb2dpY1xuICAgICAgICBpZiAodGhpcy5vbmVfcGVyX2dyb3VwKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5wb3NpdGlvbnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIC8vIHJlcG9ydGVkIGRpc3RhbmNlIG1heGVzIG91dCBhdCB0aHJlc2hvbGQgaW4gdGhpcyBjYXNlXG4gICAgICAgICAgICAgICAgLy8gKG5vdCB0cnVlIGRpc3QgdmFsdWUgc2luY2Ugd2Ugc2tpcHBlZCBjYWxjdWxhdGluZyBpdClcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICBkaXN0X3NxOiB0aGlzLm1heF9yZXBlYXRfZGlzdF9zcSxcbiAgICAgICAgICAgICAgICAgICAgcmVwZWF0X2Rpc3Rfc3E6IHRoaXMucmVwZWF0X2Rpc3Rfc3EsXG4gICAgICAgICAgICAgICAgICAgIG9uZV9wZXJfZ3JvdXA6IHRoaXMub25lX3Blcl9ncm91cFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm47IC8vIG5vIG9iamVjdCBmb3IgdGhpcyBncm91cCB5ZXRcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENoZWNrIGRpc3RhbmNlIGZyb20gbmV3IG9iamVjdCB0byBvYmplY3RzIGFscmVhZHkgaW4gZ3JvdXBcbiAgICAgICAgbGV0IHAxID0gb2JqLnBvc2l0aW9uO1xuICAgICAgICBmb3IgKGxldCBpPTA7IGkgPCB0aGlzLnBvc2l0aW9ucy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgbGV0IHAyID0gdGhpcy5wb3NpdGlvbnNbaV07XG4gICAgICAgICAgICBsZXQgZHggPSBwMVswXSAtIHAyWzBdO1xuICAgICAgICAgICAgbGV0IGR5ID0gcDFbMV0gLSBwMlsxXTtcbiAgICAgICAgICAgIGxldCBkaXN0X3NxID0gZHggKiBkeCArIGR5ICogZHk7XG5cbiAgICAgICAgICAgIC8vIEZvdW5kIGFuIGV4aXN0aW5nIG9iamVjdCB3aXRoaW4gYWxsb3dlZCBkaXN0YW5jZVxuICAgICAgICAgICAgaWYgKGRpc3Rfc3EgPCB0aGlzLnJlcGVhdF9kaXN0X3NxKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgZGlzdF9zcSxcbiAgICAgICAgICAgICAgICAgICAgcmVwZWF0X2Rpc3Rfc3E6IHRoaXMucmVwZWF0X2Rpc3Rfc3FcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gQWRkIG9iamVjdCB0byB0aGlzIGdyb3VwXG4gICAgYWRkIChvYmopIHtcbiAgICAgICAgLy8gb25seSBzdG9yZSBvYmplY3QncyBwb3NpdGlvbiwgdG8gc2F2ZSBzcGFjZSAvIHByZXZlbnQgdW5uZWNlc3NhcnkgcmVmZXJlbmNlc1xuICAgICAgICBpZiAob2JqICYmIG9iai5wb3NpdGlvbikge1xuICAgICAgICAgICAgdGhpcy5wb3NpdGlvbnMucHVzaChvYmoucG9zaXRpb24pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gU3RhdGljIG1ldGhvZHMgYXJlIHVzZWQgdG8gbWFuYWdlIHJlcGVhdCBncm91cHMsIHdpdGhpbiBhbmQgYWNyb3NzIHRpbGVzXG5cbiAgICAvLyBSZXNldCBhbGwgZ3JvdXBzIGZvciB0aGlzIHRpbGVcbiAgICBzdGF0aWMgY2xlYXIgKHRpbGUpIHtcbiAgICAgICAgdGhpcy5ncm91cHNbdGlsZV0gPSB7fTtcbiAgICB9XG5cbiAgICAvLyBDaGVjayBhbiBvYmplY3QgdG8gc2VlIGlmIGl0J3MgYSByZXBlYXQgd2l0aGluIGl0cyBkZXNpZ25hdGVkIGdyb3VwXG4gICAgc3RhdGljIGNoZWNrIChvYmosIGxheW91dCwgdGlsZSkge1xuICAgICAgICBpZiAobGF5b3V0LnJlcGVhdF9kaXN0YW5jZSAmJiBsYXlvdXQucmVwZWF0X2dyb3VwICYmIHRoaXMuZ3JvdXBzW3RpbGVdW2xheW91dC5yZXBlYXRfZ3JvdXBdKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5ncm91cHNbdGlsZV1bbGF5b3V0LnJlcGVhdF9ncm91cF0uY2hlY2sob2JqKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIEFkZCBhbiBvYmplY3QgdG8gaXRzIGRlc2lnbmF0ZWQgZ3JvdXBcbiAgICBzdGF0aWMgYWRkIChvYmosIGxheW91dCwgdGlsZSkge1xuICAgICAgICBpZiAobGF5b3V0LnJlcGVhdF9kaXN0YW5jZSAmJiBsYXlvdXQucmVwZWF0X2dyb3VwKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5ncm91cHNbdGlsZV1bbGF5b3V0LnJlcGVhdF9ncm91cF0gPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHRoaXMuZ3JvdXBzW3RpbGVdW2xheW91dC5yZXBlYXRfZ3JvdXBdID0gbmV3IFJlcGVhdEdyb3VwKFxuICAgICAgICAgICAgICAgICAgICBsYXlvdXQucmVwZWF0X2dyb3VwLFxuICAgICAgICAgICAgICAgICAgICBsYXlvdXQucmVwZWF0X2Rpc3RhbmNlLFxuICAgICAgICAgICAgICAgICAgICBSZXBlYXRHcm91cC5tYXhfcmVwZWF0X2Rpc3RcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5ncm91cHNbdGlsZV1bbGF5b3V0LnJlcGVhdF9ncm91cF0uYWRkKG9iaik7XG4gICAgICAgIH1cbiAgICB9XG5cbn1cblxuLy8gQ3VycmVudCBzZXQgb2YgcmVwZWF0IGdyb3VwcywgZ3JvdXBlZCBhbmQga2V5ZWQgYnkgdGlsZVxuUmVwZWF0R3JvdXAuZ3JvdXBzID0ge307XG5cbi8vIE1heCByZXBlYXQgZGlzdDogZm9yIGdyb3VwcyB3aXRoIGEgcmVwZWF0IGRpc3QgYmV5b25kIHRoaXMgdGhyZXNob2xkLCBvbmx5IG9uZSBsYWJlbFxuLy8gd2lsbCBiZSBhbGxvd2VkIHBlciBncm91cCwgZS5nLiBzZXQgdG8gdGlsZSBzaXplIGZvciBvbmUtbGFiZWwtcGVyLXRpbGVcblJlcGVhdEdyb3VwLm1heF9yZXBlYXRfZGlzdCA9IEdlby50aWxlX3NjYWxlO1xuIiwiaW1wb3J0IFRocmVhZCBmcm9tICcuL3V0aWxzL3RocmVhZCc7XG5pbXBvcnQgU2NlbmUgZnJvbSAnLi9zY2VuZSc7XG5pbXBvcnQgR2VvIGZyb20gJy4vZ2VvJztcblxuLy8gRXhwb3J0cyBtdXN0IGFwcGVhciBvdXRzaWRlIGEgZnVuY3Rpb24sIGJ1dCB3aWxsIG9ubHkgYmUgZGVmaW5lZCBpbiBtYWluIHRocmVhZCAoYmVsb3cpXG5leHBvcnQgdmFyIExlYWZsZXRMYXllcjtcbmV4cG9ydCBmdW5jdGlvbiBsZWFmbGV0TGF5ZXIob3B0aW9ucykge1xuICAgIHJldHVybiBleHRlbmRMZWFmbGV0KG9wdGlvbnMpO1xufVxuXG5mdW5jdGlvbiBleHRlbmRMZWFmbGV0KG9wdGlvbnMpIHtcblxuICAgIC8vIElmIExlYWZsZXRMYXllciBpcyBhbHJlYWR5IGRlZmluZWQgd2hlbiB0aGlzIGlzIGNhbGxlZCBqdXN0IHJldHVybiB0aGF0IGltbWVkaWF0ZWx5XG4gICAgLy8gZS5nLiBpZiB5b3UgY2FsbCBsZWFmbGV0TGF5ZXIgbXVsdGlwbGUgdGltZXMgKHdoaWNoIGlzIHZhbGlkKVxuICAgIGlmICh0eXBlb2YgTGVhZmxldExheWVyICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICByZXR1cm4gbmV3IExlYWZsZXRMYXllcihvcHRpb25zKTtcbiAgICB9XG5cbiAgICAvLyBMZWFmbGV0IGxheWVyIGZ1bmN0aW9uYWxpdHkgaXMgb25seSBkZWZpbmVkIGluIG1haW4gdGhyZWFkXG4gICAgaWYgKFRocmVhZC5pc19tYWluKSB7XG5cbiAgICAgICAgbGV0IEwgPSBvcHRpb25zLmxlYWZsZXQgfHwgd2luZG93Lkw7XG5cbiAgICAgICAgLy8gRGV0ZXJtaW5lIGlmIHdlIGFyZSBleHRlbmRpbmcgdGhlIGxlYWZsZXQgMC43LnggVGlsZUxheWVyIGNsYXNzLCBvciB0aGUgbmV3ZXJcbiAgICAgICAgLy8gbGVhZmxldCAxLnggR3JpZExheWVyIGNsYXNzLlxuICAgICAgICBsZXQgbGF5ZXJCYXNlQ2xhc3MgPSBMLkdyaWRMYXllciA/IEwuR3JpZExheWVyIDogTC5UaWxlTGF5ZXI7XG4gICAgICAgIGxldCBsZWFmbGV0VmVyc2lvbiA9IGxheWVyQmFzZUNsYXNzID09PSBMLkdyaWRMYXllciA/ICcxLngnIDogJzAuNy54JztcbiAgICAgICAgbGV0IGxheWVyQ2xhc3NDb25maWcgPSB7fTtcblxuICAgICAgICAvLyBJZiBleHRlbmRpbmcgbGVhZmxldCAwLjcueCBUaWxlTGF5ZXIsIGFkZGl0aW9uYWwgbW9kaWZpY2F0aW9ucyBhcmUgbmVlZGVkXG4gICAgICAgIGlmIChsYXllckJhc2VDbGFzcyA9PT0gTC5UaWxlTGF5ZXIpIHtcbiAgICAgICAgICAgIGxheWVyQ2xhc3NDb25maWcuX2FkZFRpbGUgPSBmdW5jdGlvbigpe307XG4gICAgICAgICAgICBsYXllckNsYXNzQ29uZmlnLl9yZW1vdmVUaWxlID0gZnVuY3Rpb24oKXt9O1xuICAgICAgICAgICAgbGF5ZXJDbGFzc0NvbmZpZy5fcmVzZXQgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICBsYXllckJhc2VDbGFzcy5wcm90b3R5cGUuX3Jlc2V0LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICAgICAgICAgICAgLy8gcmUtYWRkIHRoZSBjYW52YXMgc2luY2UgYmFzZSBjbGFzcyBgdmlld3Jlc2V0YCBldmVudCBjYW4gcmVtb3ZlIGl0XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuc2NlbmUgJiYgdGhpcy5zY2VuZS5jb250YWluZXIgJiYgdGhpcy5zY2VuZS5jYW52YXMpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zY2VuZS5jb250YWluZXIuYXBwZW5kQ2hpbGQodGhpcy5zY2VuZS5jYW52YXMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cblxuICAgICAgICAvLyBEZWZpbmUgY3VzdG9tIGxheWVyIG1ldGhvZHNcbiAgICAgICAgT2JqZWN0LmFzc2lnbihsYXllckNsYXNzQ29uZmlnLCB7XG5cbiAgICAgICAgICAgIGluaXRpYWxpemUgKG9wdGlvbnMpIHtcbiAgICAgICAgICAgICAgICAvLyBEZWZhdWx0c1xuICAgICAgICAgICAgICAgIG9wdGlvbnMuc2hvd0RlYnVnID0gKCFvcHRpb25zLnNob3dEZWJ1ZyA/IGZhbHNlIDogdHJ1ZSk7XG5cbiAgICAgICAgICAgICAgICBMLnNldE9wdGlvbnModGhpcywgb3B0aW9ucyk7XG4gICAgICAgICAgICAgICAgdGhpcy5jcmVhdGVTY2VuZSgpO1xuICAgICAgICAgICAgICAgIHRoaXMuaG9va3MgPSB7fTtcbiAgICAgICAgICAgICAgICB0aGlzLl91cGRhdGluZ190YW5ncmFtID0gZmFsc2U7XG5cbiAgICAgICAgICAgICAgICAvLyBGb3JjZSBsZWFmbGV0IHpvb20gYW5pbWF0aW9ucyBvZmZcbiAgICAgICAgICAgICAgICB0aGlzLl96b29tQW5pbWF0ZWQgPSBmYWxzZTtcbiAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgIGNyZWF0ZVNjZW5lICgpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNjZW5lID0gU2NlbmUuY3JlYXRlKFxuICAgICAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuc2NlbmUsXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG51bVdvcmtlcnM6IHRoaXMub3B0aW9ucy5udW1Xb3JrZXJzLFxuICAgICAgICAgICAgICAgICAgICAgICAgcHJlVXBkYXRlOiB0aGlzLm9wdGlvbnMucHJlVXBkYXRlLFxuICAgICAgICAgICAgICAgICAgICAgICAgcG9zdFVwZGF0ZTogdGhpcy5vcHRpb25zLnBvc3RVcGRhdGUsXG4gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51b3VzWm9vbTogKExlYWZsZXRMYXllci5sZWFmbGV0VmVyc2lvbiA9PT0gJzEueCcpLFxuICAgICAgICAgICAgICAgICAgICAgICAgaGlnaERlbnNpdHlEaXNwbGF5OiB0aGlzLm9wdGlvbnMuaGlnaERlbnNpdHlEaXNwbGF5LFxuICAgICAgICAgICAgICAgICAgICAgICAgbG9nTGV2ZWw6IHRoaXMub3B0aW9ucy5sb2dMZXZlbCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGludHJvc3BlY3Rpb246IHRoaXMub3B0aW9ucy5pbnRyb3NwZWN0aW9uLFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWR2YW5jZWQgb3B0aW9uLCBhcHAgd2lsbCBoYXZlIHRvIG1hbnVhbGx5IGNhbGxlZCBzY2VuZS51cGRhdGUoKSBwZXIgZnJhbWVcbiAgICAgICAgICAgICAgICAgICAgICAgIGRpc2FibGVSZW5kZXJMb29wOiB0aGlzLm9wdGlvbnMuZGlzYWJsZVJlbmRlckxvb3AsXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBhZHZhbmNlZCBvcHRpb24sIHdpbGwgcmVxdWlyZSBsaWJyYXJ5IHRvIGJlIHNlcnZlZCBhcyBzYW1lIGhvc3QgYXMgcGFnZVxuICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dDcm9zc0RvbWFpbldvcmtlcnM6IHRoaXMub3B0aW9ucy5hbGxvd0Nyb3NzRG9tYWluV29ya2Vyc1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgIC8vIEZpbmlzaCBpbml0aWFsaXppbmcgc2NlbmUgYW5kIHNldHVwIGV2ZW50cyB3aGVuIGxheWVyIGlzIGFkZGVkIHRvIG1hcFxuICAgICAgICAgICAgb25BZGQgKG1hcCkge1xuICAgICAgICAgICAgICAgIGlmICghdGhpcy5zY2VuZSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNyZWF0ZVNjZW5lKCk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgbGF5ZXJCYXNlQ2xhc3MucHJvdG90eXBlLm9uQWRkLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG5cbiAgICAgICAgICAgICAgICB0aGlzLmhvb2tzLnJlc2l6ZSA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fdXBkYXRpbmdfdGFuZ3JhbSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlU2l6ZSgpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl91cGRhdGluZ190YW5ncmFtID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBtYXAub24oJ3Jlc2l6ZScsIHRoaXMuaG9va3MucmVzaXplKTtcblxuICAgICAgICAgICAgICAgIHRoaXMuaG9va3MubW92ZSA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuX3VwZGF0aW5nX3RhbmdyYW0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3VwZGF0aW5nX3RhbmdyYW0gPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB2YXIgdmlldyA9IG1hcC5nZXRDZW50ZXIoKTtcbiAgICAgICAgICAgICAgICAgICAgdmlldy56b29tID0gTWF0aC5taW4obWFwLmdldFpvb20oKSwgbWFwLmdldE1heFpvb20oKSB8fCBHZW8uZGVmYXVsdF92aWV3X21heF96b29tKTtcblxuICAgICAgICAgICAgICAgICAgICB0aGlzLnNjZW5lLnZpZXcuc2V0Vmlldyh2aWV3KTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zY2VuZS5pbW1lZGlhdGVSZWRyYXcoKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZXZlcnNlVHJhbnNmb3JtKCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3VwZGF0aW5nX3RhbmdyYW0gPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIG1hcC5vbignbW92ZScsIHRoaXMuaG9va3MubW92ZSk7XG5cbiAgICAgICAgICAgICAgICB0aGlzLmhvb2tzLnpvb21zdGFydCA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuX3VwZGF0aW5nX3RhbmdyYW0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3VwZGF0aW5nX3RhbmdyYW0gPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNjZW5lLnZpZXcuc3RhcnRab29tKCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3VwZGF0aW5nX3RhbmdyYW0gPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIG1hcC5vbignem9vbXN0YXJ0JywgdGhpcy5ob29rcy56b29tc3RhcnQpO1xuXG4gICAgICAgICAgICAgICAgdGhpcy5ob29rcy5kcmFnc3RhcnQgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2NlbmUudmlldy5zZXRQYW5uaW5nKHRydWUpO1xuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgbWFwLm9uKCdkcmFnc3RhcnQnLCB0aGlzLmhvb2tzLmRyYWdzdGFydCk7XG5cbiAgICAgICAgICAgICAgICB0aGlzLmhvb2tzLm1vdmVlbmQgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2NlbmUudmlldy5zZXRQYW5uaW5nKGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zY2VuZS5yZXF1ZXN0UmVkcmF3KCk7XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBtYXAub24oJ21vdmVlbmQnLCB0aGlzLmhvb2tzLm1vdmVlbmQpO1xuXG4gICAgICAgICAgICAgICAgLy8gRm9yY2UgbGVhZmxldCB6b29tIGFuaW1hdGlvbnMgb2ZmXG4gICAgICAgICAgICAgICAgbWFwLl96b29tQW5pbWF0ZWQgPSBmYWxzZTtcblxuICAgICAgICAgICAgICAgIC8vIE1vZGlmeSBkZWZhdWx0IExlYWZsZXQgYmVoYXZpb3JzXG4gICAgICAgICAgICAgICAgdGhpcy5tb2RpZnlTY3JvbGxXaGVlbEJlaGF2aW9yKG1hcCk7XG4gICAgICAgICAgICAgICAgdGhpcy5tb2RpZnlEb3VibGVDbGlja1pvb20obWFwKTtcblxuICAgICAgICAgICAgICAgIC8vIFNldHVwIGZlYXR1cmUgc2VsZWN0aW9uXG4gICAgICAgICAgICAgICAgdGhpcy5zZXR1cFNlbGVjdGlvbkV2ZW50SGFuZGxlcnMobWFwKTtcbiAgICAgICAgICAgICAgICB0aGlzLnNldFNlbGVjdGlvbkV2ZW50cyh0aGlzLm9wdGlvbnMuZXZlbnRzKTtcblxuICAgICAgICAgICAgICAgIC8vIEFkZCBHTCBjYW52YXMgdG8gbGF5ZXIgY29udGFpbmVyXG4gICAgICAgICAgICAgICAgdGhpcy5zY2VuZS5jb250YWluZXIgPSB0aGlzLmdldENvbnRhaW5lcigpO1xuICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlU2l6ZSgpO1xuXG4gICAgICAgICAgICAgICAgLy8gSW5pdGlhbCB2aWV3XG4gICAgICAgICAgICAgICAgdGhpcy51cGRhdGVWaWV3KCk7XG4gICAgICAgICAgICAgICAgdGhpcy5yZXNpemVPbkZpcnN0VmlzaWJsZSgpO1xuXG4gICAgICAgICAgICAgICAgLy8gU3Vic2NyaWJlIHRvIHRhbmdyYW0gZXZlbnRzXG4gICAgICAgICAgICAgICAgdGhpcy5zY2VuZS5zdWJzY3JpYmUoe1xuICAgICAgICAgICAgICAgICAgICBtb3ZlOiB0aGlzLm9uVGFuZ3JhbVZpZXdVcGRhdGUuYmluZCh0aGlzKVxuICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgLy8gVXNlIGxlYWZsZXQncyBleGlzdGluZyBldmVudCBzeXN0ZW0gYXMgdGhlIGNhbGxiYWNrIG1lY2hhbmlzbVxuICAgICAgICAgICAgICAgIHRoaXMuc2NlbmUubG9hZCh0aGlzLm9wdGlvbnMuc2NlbmUsXG4gICAgICAgICAgICAgICAgICAgIHsgY29uZmlnX3BhdGg6IHRoaXMub3B0aW9ucy5zY2VuZUJhc2VQYXRoLCBibG9ja2luZzogZmFsc2UgfSkudGhlbigoKSA9PiB7XG5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fdXBkYXRpbmdfdGFuZ3JhbSA9IHRydWU7XG5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy51cGRhdGVTaXplKCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlVmlldygpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnJldmVyc2VUcmFuc2Zvcm0oKTtcblxuICAgICAgICAgICAgICAgICAgICB0aGlzLl91cGRhdGluZ190YW5ncmFtID0gZmFsc2U7XG5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5maXJlKCdpbml0Jyk7XG4gICAgICAgICAgICAgICAgfSkuY2F0Y2goZXJyb3IgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmZpcmUoJ2Vycm9yJywgZXJyb3IpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgb25SZW1vdmUgKG1hcCkge1xuICAgICAgICAgICAgICAgIGxheWVyQmFzZUNsYXNzLnByb3RvdHlwZS5vblJlbW92ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuXG4gICAgICAgICAgICAgICAgbWFwLm9mZigncmVzaXplJywgdGhpcy5ob29rcy5yZXNpemUpO1xuICAgICAgICAgICAgICAgIG1hcC5vZmYoJ21vdmUnLCB0aGlzLmhvb2tzLm1vdmUpO1xuICAgICAgICAgICAgICAgIG1hcC5vZmYoJ3pvb21zdGFydCcsIHRoaXMuaG9va3Muem9vbXN0YXJ0KTtcbiAgICAgICAgICAgICAgICBtYXAub2ZmKCdkcmFnc3RhcnQnLCB0aGlzLmhvb2tzLmRyYWdzdGFydCk7XG4gICAgICAgICAgICAgICAgbWFwLm9mZignbW92ZWVuZCcsIHRoaXMuaG9va3MubW92ZWVuZCk7XG4gICAgICAgICAgICAgICAgbWFwLm9mZignY2xpY2snLCB0aGlzLmhvb2tzLmNsaWNrKTtcbiAgICAgICAgICAgICAgICBtYXAub2ZmKCdtb3VzZW1vdmUnLCB0aGlzLmhvb2tzLm1vdXNlbW92ZSk7XG4gICAgICAgICAgICAgICAgbWFwLm9mZignbW91c2VvdXQnLCB0aGlzLmhvb2tzLm1vdXNlb3V0KTtcbiAgICAgICAgICAgICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCd2aXNpYmlsaXR5Y2hhbmdlJywgdGhpcy5ob29rcy52aXNpYmlsaXR5Y2hhbmdlKTtcbiAgICAgICAgICAgICAgICB0aGlzLmhvb2tzID0ge307XG5cbiAgICAgICAgICAgICAgICBpZiAodGhpcy5zY2VuZSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNjZW5lLmRlc3Ryb3koKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zY2VuZSA9IG51bGw7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgY3JlYXRlVGlsZSAoY29vcmRzKSB7XG4gICAgICAgICAgICAgICAgdmFyIGtleSA9IGNvb3Jkcy54ICsgJy8nICsgY29vcmRzLnkgKyAnLycgKyBjb29yZHMuejtcbiAgICAgICAgICAgICAgICB2YXIgZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICAgICAgICAgICAgZGl2LnNldEF0dHJpYnV0ZSgnZGF0YS10aWxlLWtleScsIGtleSk7XG4gICAgICAgICAgICAgICAgZGl2LnN0eWxlLndpZHRoID0gJzI1NnB4JztcbiAgICAgICAgICAgICAgICBkaXYuc3R5bGUuaGVpZ2h0ID0gJzI1NnB4JztcblxuICAgICAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMuc2hvd0RlYnVnKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBkZWJ1Z19vdmVybGF5ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICAgICAgICAgICAgICAgIGRlYnVnX292ZXJsYXkudGV4dENvbnRlbnQgPSBrZXk7XG4gICAgICAgICAgICAgICAgICAgIGRlYnVnX292ZXJsYXkuc3R5bGUucG9zaXRpb24gPSAnYWJzb2x1dGUnO1xuICAgICAgICAgICAgICAgICAgICBkZWJ1Z19vdmVybGF5LnN0eWxlLmxlZnQgPSAwO1xuICAgICAgICAgICAgICAgICAgICBkZWJ1Z19vdmVybGF5LnN0eWxlLnRvcCA9IDA7XG4gICAgICAgICAgICAgICAgICAgIGRlYnVnX292ZXJsYXkuc3R5bGUuY29sb3IgPSAnd2hpdGUnO1xuICAgICAgICAgICAgICAgICAgICBkZWJ1Z19vdmVybGF5LnN0eWxlLmZvbnRTaXplID0gJzE2cHgnO1xuICAgICAgICAgICAgICAgICAgICBkZWJ1Z19vdmVybGF5LnN0eWxlLnRleHRPdXRsaW5lID0gJzFweCAjMDAwMDAwJztcbiAgICAgICAgICAgICAgICAgICAgZGVidWdfb3ZlcmxheS5zdHlsZS5wYWRkaW5nID0gJzhweCc7XG5cbiAgICAgICAgICAgICAgICAgICAgZGl2LmFwcGVuZENoaWxkKGRlYnVnX292ZXJsYXkpO1xuICAgICAgICAgICAgICAgICAgICBkaXYuc3R5bGUuYm9yZGVyU3R5bGUgPSAnc29saWQnO1xuICAgICAgICAgICAgICAgICAgICBkaXYuc3R5bGUuYm9yZGVyQ29sb3IgPSAnd2hpdGUnO1xuICAgICAgICAgICAgICAgICAgICBkaXYuc3R5bGUuYm9yZGVyV2lkdGggPSAnMXB4JztcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gZGl2O1xuICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgLy8gTW9kaWZ5IGxlYWZsZXQncyBkZWZhdWx0IHNjcm9sbCB3aGVlbCBiZWhhdmlvciB0byByZW5kZXIgZnJhbWVzIG1vcmUgZnJlcXVlbnRseVxuICAgICAgICAgICAgLy8gKHNob3VsZCBnZW5lcmFsbHkgbGVhZCB0byBzbW9vdGhlciBzY3JvbGwgd2l0aCBUYW5ncmFtIGZyYW1lIHJlLXJlbmRlcilcbiAgICAgICAgICAgIG1vZGlmeVNjcm9sbFdoZWVsQmVoYXZpb3IgKG1hcCkge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLnNjZW5lLnZpZXcuY29udGludW91c196b29tICYmIG1hcC5zY3JvbGxXaGVlbFpvb20gJiYgdGhpcy5vcHRpb25zLm1vZGlmeVNjcm9sbFdoZWVsICE9PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgICAgICBtYXAub3B0aW9ucy56b29tU25hcCA9IDA7XG5cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZW5hYmxlZCA9IG1hcC5zY3JvbGxXaGVlbFpvb20uZW5hYmxlZCgpO1xuICAgICAgICAgICAgICAgICAgICBtYXAuc2Nyb2xsV2hlZWxab29tLmRpc2FibGUoKTtcblxuICAgICAgICAgICAgICAgICAgICBtYXAuc2Nyb2xsV2hlZWxab29tLl9vbldoZWVsU2Nyb2xsID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBkZWx0YSA9IEwuRG9tRXZlbnQuZ2V0V2hlZWxEZWx0YShlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2RlbHRhICs9IGRlbHRhO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fbGFzdE1vdXNlUG9zID0gdGhpcy5fbWFwLm1vdXNlRXZlbnRUb0NvbnRhaW5lclBvaW50KGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fcGVyZm9ybVpvb20oKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIEwuRG9tRXZlbnQuc3RvcChlKTtcbiAgICAgICAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgICAgICAgICBtYXAuc2Nyb2xsV2hlZWxab29tLl9wZXJmb3JtWm9vbSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBtYXAgPSB0aGlzLl9tYXAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgem9vbSA9IG1hcC5nZXRab29tKCk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIG1hcC5fc3RvcCgpOyAvLyBzdG9wIHBhbm5pbmcgYW5kIGZseSBhbmltYXRpb25zIGlmIGFueVxuXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgZGVsdGEgPSB0aGlzLl9kZWx0YSAvICh0aGlzLl9tYXAub3B0aW9ucy53aGVlbFB4UGVyWm9vbUxldmVsICogNCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9kZWx0YSA9IDA7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoem9vbSArIGRlbHRhKSA+PSB0aGlzLl9tYXAuZ2V0TWF4Wm9vbSgpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsdGEgPSB0aGlzLl9tYXAuZ2V0TWF4Wm9vbSgpIC0gem9vbTsgLy8gZG9uJ3QgZ28gcGFzdCBtYXggem9vbVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWRlbHRhKSB7IHJldHVybjsgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobWFwLm9wdGlvbnMuc2Nyb2xsV2hlZWxab29tID09PSAnY2VudGVyJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcC5zZXRab29tKHpvb20gKyBkZWx0YSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcC5zZXRab29tQXJvdW5kKHRoaXMuX2xhc3RNb3VzZVBvcywgem9vbSArIGRlbHRhKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgICAgICAgICBpZiAoZW5hYmxlZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbWFwLnNjcm9sbFdoZWVsWm9vbS5lbmFibGUoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgIC8vIE1vZGlmeSBsZWFmbGV0J3MgZGVmYXVsdCBkb3VibGUtY2xpY2sgem9vbSBiZWhhdmlvciwgdG8gbWF0Y2ggdHlwaWNhbCB2ZWN0b3IgYmFzZW1hcCBwcm9kdWN0c1xuICAgICAgICAgICAgbW9kaWZ5RG91YmxlQ2xpY2tab29tIChtYXApIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5zY2VuZS52aWV3LmNvbnRpbnVvdXNfem9vbSAmJiBtYXAuZG91YmxlQ2xpY2tab29tICYmIHRoaXMub3B0aW9ucy5tb2RpZnlEb3VibGVDbGlja1pvb20gIT09IGZhbHNlKSB7XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gTW9kaWZpZWQgdmVyc2lvbiBvZiBMZWFmbGV0J3Mgc2V0Wm9vbUFyb3VuZCB0aGF0IGRvZXNuJ3QgdHJpZ2dlciBhIG1vdmVFbmQgZXZlbnRcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2V0Wm9vbUFyb3VuZE5vTW92ZUVuZCA9IGZ1bmN0aW9uIChtYXAsIGxhdGxuZywgem9vbSwgb3B0aW9ucykge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHNjYWxlID0gbWFwLmdldFpvb21TY2FsZSh6b29tKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aWV3SGFsZiA9IG1hcC5nZXRTaXplKCkuZGl2aWRlQnkoMiksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGFpbmVyUG9pbnQgPSBsYXRsbmcgaW5zdGFuY2VvZiBMLlBvaW50ID8gbGF0bG5nIDogbWFwLmxhdExuZ1RvQ29udGFpbmVyUG9pbnQobGF0bG5nKSxcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNlbnRlck9mZnNldCA9IGNvbnRhaW5lclBvaW50LnN1YnRyYWN0KHZpZXdIYWxmKS5tdWx0aXBseUJ5KDEgLSAxIC8gc2NhbGUpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0NlbnRlciA9IG1hcC5jb250YWluZXJQb2ludFRvTGF0TG5nKHZpZXdIYWxmLmFkZChjZW50ZXJPZmZzZXQpKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1hcC5fbW92ZShuZXdDZW50ZXIsIHpvb20sIHsgZmx5VG86IHRydWUgfSk7XG4gICAgICAgICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gU2ltcGxpZmllZCB2ZXJzaW9uIG9mIExlYWZsZXQncyBmbHlUbywgZm9yIHNob3J0IGFuaW1hdGlvbnMgem9vbWluZyBhcm91bmQgYSBwb2ludFxuICAgICAgICAgICAgICAgICAgICBjb25zdCBmbHlBcm91bmQgPSBmdW5jdGlvbiAobWFwLCB0YXJnZXRDZW50ZXIsIHRhcmdldFpvb20sIG9wdGlvbnMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMuYW5pbWF0ZSA9PT0gZmFsc2UgfHwgIUwuQnJvd3Nlci5hbnkzZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBtYXAuc2V0Vmlldyh0YXJnZXRDZW50ZXIsIHRhcmdldFpvb20sIG9wdGlvbnMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICBtYXAuX3N0b3AoKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHN0YXJ0Wm9vbSA9IG1hcC5fem9vbTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0Q2VudGVyID0gTC5sYXRMbmcodGFyZ2V0Q2VudGVyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldFpvb20gPSB0YXJnZXRab29tID09PSB1bmRlZmluZWQgPyBzdGFydFpvb20gOiB0YXJnZXRab29tO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0Wm9vbSA9IE1hdGgubWluKHRhcmdldFpvb20sIG1hcC5nZXRNYXhab29tKCkpOyAvLyBkb24ndCBnbyBwYXN0IG1heCB6b29tXG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBmcm9tID0gbWFwLnByb2plY3QobWFwLmdldENlbnRlcigpLCBzdGFydFpvb20pLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvID0gbWFwLnByb2plY3QodGFyZ2V0Q2VudGVyLCBzdGFydFpvb20pO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgc3RhcnQgPSBEYXRlLm5vdygpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR1cmF0aW9uID0gb3B0aW9ucy5kdXJhdGlvbiA/IDEwMDAgKiBvcHRpb25zLmR1cmF0aW9uIDogNzU7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGZyYW1lKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0gKERhdGUubm93KCkgLSBzdGFydCkgLyBkdXJhdGlvbjtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0IDw9IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmV1c2UgaW50ZXJuYWwgZmx5VG8gZnJhbWUgdG8gZW5zdXJlIHRoZXNlIGFuaW1hdGlvbnMgYXJlIGNhbmNlbGVkIGxpa2Ugb3RoZXJzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcC5fZmx5VG9GcmFtZSA9IEwuVXRpbC5yZXF1ZXN0QW5pbUZyYW1lKGZyYW1lLCBtYXApO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjZW50ZXIgPSBmcm9tLmFkZCh0by5zdWJ0cmFjdChmcm9tKS5tdWx0aXBseUJ5KHQpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2VudGVyID0gW2NlbnRlci54LCBjZW50ZXIueV07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNlbnRlciA9IEdlby5tZXRlcnNUb0xhdExuZyhjZW50ZXIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRab29tQXJvdW5kTm9Nb3ZlRW5kKG1hcCwgdGFyZ2V0Q2VudGVyLCBzdGFydFpvb20gKyAodGFyZ2V0Wm9vbSAtIHN0YXJ0Wm9vbSkgKiB0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRab29tQXJvdW5kTm9Nb3ZlRW5kKG1hcCwgdGFyZ2V0Q2VudGVyLCB0YXJnZXRab29tKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLl9tb3ZlRW5kKHRydWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgbWFwLl9tb3ZlU3RhcnQodHJ1ZSk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lLmNhbGwobWFwKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBtYXA7XG4gICAgICAgICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gTW9kaWZ5IHRoZSBkb3VibGUtY2xpY2sgem9vbSBoYW5kbGVyIHRvIGRvIGEgc2hvcnQgem9vbSBhbmltYXRpb25cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZW5hYmxlZCA9IG1hcC5kb3VibGVDbGlja1pvb20uZW5hYmxlZCgpO1xuICAgICAgICAgICAgICAgICAgICBtYXAuZG91YmxlQ2xpY2tab29tLmRpc2FibGUoKTtcblxuICAgICAgICAgICAgICAgICAgICBtYXAuZG91YmxlQ2xpY2tab29tLl9vbkRvdWJsZUNsaWNrID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBtYXAgPSB0aGlzLl9tYXAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb2xkWm9vbSA9IG1hcC5nZXRab29tKCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsdGEgPSBtYXAub3B0aW9ucy56b29tRGVsdGEsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgem9vbSA9IGUub3JpZ2luYWxFdmVudC5zaGlmdEtleSA/IG9sZFpvb20gLSBkZWx0YSA6IG9sZFpvb20gKyBkZWx0YTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1hcC5vcHRpb25zLmRvdWJsZUNsaWNrWm9vbSA9PT0gJ2NlbnRlcicpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbHlBcm91bmQobWFwLCBtYXAuZ2V0Q2VudGVyKCksIHpvb20pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbHlBcm91bmQobWFwLCBtYXAuY29udGFpbmVyUG9pbnRUb0xhdExuZyhlLmNvbnRhaW5lclBvaW50KSwgem9vbSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKGVuYWJsZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1hcC5kb3VibGVDbGlja1pvb20uZW5hYmxlKCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICB1cGRhdGVWaWV3ICgpIHtcbiAgICAgICAgICAgICAgICB2YXIgdmlldyA9IHRoaXMuX21hcC5nZXRDZW50ZXIoKTtcbiAgICAgICAgICAgICAgICB2aWV3Lnpvb20gPSBNYXRoLm1pbih0aGlzLl9tYXAuZ2V0Wm9vbSgpLCB0aGlzLl9tYXAuZ2V0TWF4Wm9vbSgpIHx8IEdlby5kZWZhdWx0X3ZpZXdfbWF4X3pvb20pO1xuICAgICAgICAgICAgICAgIHRoaXMuc2NlbmUudmlldy5zZXRWaWV3KHZpZXcpO1xuICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgdXBkYXRlU2l6ZSAoKSB7XG4gICAgICAgICAgICAgICAgdmFyIHNpemUgPSB0aGlzLl9tYXAuZ2V0U2l6ZSgpO1xuICAgICAgICAgICAgICAgIHRoaXMuc2NlbmUucmVzaXplTWFwKHNpemUueCwgc2l6ZS55KTtcbiAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgIHJlc2l6ZU9uRmlyc3RWaXNpYmxlICgpIHtcbiAgICAgICAgICAgICAgICBsZXQgZmlyc3RfdmlzaWJpbGl0eSA9IHRydWU7XG4gICAgICAgICAgICAgICAgdGhpcy5ob29rcy52aXNpYmlsaXR5Y2hhbmdlID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoZmlyc3RfdmlzaWJpbGl0eSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3RfdmlzaWJpbGl0eSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy51cGRhdGVTaXplKCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigndmlzaWJpbGl0eWNoYW5nZScsIHRoaXMuaG9va3MudmlzaWJpbGl0eWNoYW5nZSk7XG4gICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICBvblRhbmdyYW1WaWV3VXBkYXRlICgpIHtcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuX21hcCB8fCB0aGlzLl91cGRhdGluZ190YW5ncmFtKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy5fdXBkYXRpbmdfdGFuZ3JhbSA9IHRydWU7XG4gICAgICAgICAgICAgICAgdGhpcy5fbWFwLnNldFZpZXcoW3RoaXMuc2NlbmUudmlldy5jZW50ZXIubGF0LCB0aGlzLnNjZW5lLnZpZXcuY2VudGVyLmxuZ10sIHRoaXMuc2NlbmUudmlldy56b29tLCB7IGFuaW1hdGU6IGZhbHNlIH0pO1xuICAgICAgICAgICAgICAgIHRoaXMucmV2ZXJzZVRyYW5zZm9ybSgpO1xuICAgICAgICAgICAgICAgIHRoaXMuX3VwZGF0aW5nX3RhbmdyYW0gPSBmYWxzZTtcbiAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgIHJlbmRlciAoKSB7XG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLnNjZW5lKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy5zY2VuZS51cGRhdGUoKTtcbiAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgIC8vIFJldmVyc2UgdGhlIENTUyBwb3NpdGlvbmluZyBMZWFmbGV0IGFwcGxpZXMgdG8gdGhlIGxheWVyLCBzaW5jZSBUYW5ncmFtJ3MgV2ViR0wgY2FudmFzXG4gICAgICAgICAgICAvLyBpcyBleHBlY3RlZCB0byBiZSAnYWJzb2x1dGVseScgcG9zaXRpb25lZC5cbiAgICAgICAgICAgIHJldmVyc2VUcmFuc2Zvcm0gKCkge1xuICAgICAgICAgICAgICAgIGlmICghdGhpcy5fbWFwIHx8ICF0aGlzLnNjZW5lIHx8ICF0aGlzLnNjZW5lLmNvbnRhaW5lcikge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgdmFyIHRvcF9sZWZ0ID0gdGhpcy5fbWFwLmNvbnRhaW5lclBvaW50VG9MYXllclBvaW50KFswLCAwXSk7XG4gICAgICAgICAgICAgICAgTC5Eb21VdGlsLnNldFBvc2l0aW9uKHRoaXMuc2NlbmUuY29udGFpbmVyLCB0b3BfbGVmdCk7XG4gICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICAvLyBUaWUgTGVhZmxldCBldmVudCBoYW5kbGVycyB0byBUYW5ncmFtIGZlYXR1cmUgc2VsZWN0aW9uXG4gICAgICAgICAgICBzZXR1cFNlbGVjdGlvbkV2ZW50SGFuZGxlcnMgKG1hcCkge1xuICAgICAgICAgICAgICAgIHRoaXMuX3NlbGVjdGlvbl9ldmVudHMgPSB7fTtcblxuICAgICAgICAgICAgICAgIHRoaXMuaG9va3MuY2xpY2sgPSAoZXZlbnQpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiB0aGlzLl9zZWxlY3Rpb25fZXZlbnRzLmNsaWNrID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNjZW5lLmdldEZlYXR1cmVBdChldmVudC5jb250YWluZXJQb2ludCkuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlbihzZWxlY3Rpb24gPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgcmVzdWx0cyA9IE9iamVjdC5hc3NpZ24oe30sIHNlbGVjdGlvbiwgeyBsZWFmbGV0X2V2ZW50OiBldmVudCB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fc2VsZWN0aW9uX2V2ZW50cy5jbGljayhyZXN1bHRzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgbWFwLm9uKCdjbGljaycsIHRoaXMuaG9va3MuY2xpY2spO1xuXG4gICAgICAgICAgICAgICAgdGhpcy5ob29rcy5tb3VzZW1vdmUgPSAoZXZlbnQpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiB0aGlzLl9zZWxlY3Rpb25fZXZlbnRzLmhvdmVyID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNjZW5lLmdldEZlYXR1cmVBdChldmVudC5jb250YWluZXJQb2ludCkuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlbihzZWxlY3Rpb24gPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgcmVzdWx0cyA9IE9iamVjdC5hc3NpZ24oe30sIHNlbGVjdGlvbiwgeyBsZWFmbGV0X2V2ZW50OiBldmVudCB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fc2VsZWN0aW9uX2V2ZW50cy5ob3ZlcihyZXN1bHRzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgbWFwLm9uKCdtb3VzZW1vdmUnLCB0aGlzLmhvb2tzLm1vdXNlbW92ZSk7XG5cbiAgICAgICAgICAgICAgICB0aGlzLmhvb2tzLm1vdXNlb3V0ID0gKGV2ZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIC8vIFdoZW4gbW91c2UgbGVhdmVzIG1hcCwgc2VuZCBhbiBhZGRpdGlvbmFsIHNlbGVjdGlvbiBldmVudCB0byBpbmRpY2F0ZSBubyBmZWF0dXJlIGlzIHNlbGVjdGVkXG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgdGhpcy5fc2VsZWN0aW9uX2V2ZW50cy5ob3ZlciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fc2VsZWN0aW9uX2V2ZW50cy5ob3Zlcih7IGNoYW5nZWQ6IHRydWUsIGxlYWZsZXRfZXZlbnQ6IGV2ZW50IH0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBtYXAub24oJ21vdXNlb3V0JywgdGhpcy5ob29rcy5tb3VzZW91dCk7XG4gICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICAvLyBTZXQgdXNlci1kZWZpbmVkIGhhbmRsZXJzIGZvciBmZWF0dXJlIHNlbGVjdGlvbiBldmVudHNcbiAgICAgICAgICAgIC8vIEN1cnJlbnRseSBvbmx5IG9uZSBoYW5kbGVyIGNhbiBiZSBkZWZpbmVkIGZvciBlYWNoIGV2ZW50IHR5cGVcbiAgICAgICAgICAgIC8vIEV2ZW50IHR5cGVzIGFyZTogYGNsaWNrYCwgYGhvdmVyYCAobGVhZmxldCBgbW91c2Vtb3ZlYClcbiAgICAgICAgICAgIHNldFNlbGVjdGlvbkV2ZW50cyAoZXZlbnRzKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fc2VsZWN0aW9uX2V2ZW50cyA9IE9iamVjdC5hc3NpZ24odGhpcy5fc2VsZWN0aW9uX2V2ZW50cywgZXZlbnRzKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICB9KTtcblxuICAgICAgICAvLyBDcmVhdGUgdGhlIGxheWVyIGNsYXNzXG4gICAgICAgIExlYWZsZXRMYXllciA9IGxheWVyQmFzZUNsYXNzLmV4dGVuZChsYXllckNsYXNzQ29uZmlnKTtcblxuICAgICAgICAvLyBQb2x5ZmlsbCBzb21lIDEuMCBtZXRob2RzXG4gICAgICAgIGlmICh0eXBlb2YgTGVhZmxldExheWVyLnJlbW92ZSAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgTGVhZmxldExheWVyLnByb3RvdHlwZS5yZW1vdmUgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5fbWFwKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX21hcC5yZW1vdmVMYXllcih0aGlzKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy5maXJlKCdyZW1vdmUnKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cblxuICAgICAgICBMZWFmbGV0TGF5ZXIubGF5ZXJCYXNlQ2xhc3MgPSBsYXllckJhc2VDbGFzcztcbiAgICAgICAgTGVhZmxldExheWVyLmxlYWZsZXRWZXJzaW9uID0gbGVhZmxldFZlcnNpb247XG5cbiAgICAgICAgcmV0dXJuIG5ldyBMZWFmbGV0TGF5ZXIob3B0aW9ucyk7XG4gICAgfVxufVxuIiwiaW1wb3J0IFNoYWRlclByb2dyYW0gZnJvbSAnLi9nbC9zaGFkZXJfcHJvZ3JhbSc7XG5pbXBvcnQgR0xTTCBmcm9tICcuL2dsL2dsc2wnO1xuaW1wb3J0IEdlbyBmcm9tICcuL2dlbyc7XG5pbXBvcnQgVmVjdG9yIGZyb20gJy4vdmVjdG9yJztcbmltcG9ydCB7U3R5bGVQYXJzZXJ9IGZyb20gJy4vc3R5bGVzL3N0eWxlX3BhcnNlcic7XG5cbmxldCBmcyA9IHJlcXVpcmUoJ2ZzJyk7XG5cbmNvbnN0IHNoYWRlclNyY19hbWJpZW50TGlnaHQgPSBmcy5yZWFkRmlsZVN5bmMoX19kaXJuYW1lICsgJy9nbC9zaGFkZXJzL2FtYmllbnRMaWdodC5nbHNsJywgJ3V0ZjgnKTtcbmNvbnN0IHNoYWRlclNyY19kaXJlY3Rpb25hbExpZ2h0ID0gZnMucmVhZEZpbGVTeW5jKF9fZGlybmFtZSArICcvZ2wvc2hhZGVycy9kaXJlY3Rpb25hbExpZ2h0Lmdsc2wnLCAndXRmOCcpO1xuY29uc3Qgc2hhZGVyU3JjX3BvaW50TGlnaHQgPSBmcy5yZWFkRmlsZVN5bmMoX19kaXJuYW1lICsgJy9nbC9zaGFkZXJzL3BvaW50TGlnaHQuZ2xzbCcsICd1dGY4Jyk7XG5jb25zdCBzaGFkZXJTcmNfc3BvdExpZ2h0ID0gZnMucmVhZEZpbGVTeW5jKF9fZGlybmFtZSArICcvZ2wvc2hhZGVycy9zcG90TGlnaHQuZ2xzbCcsICd1dGY4Jyk7XG5cbi8vIEFic3RyYWN0IGxpZ2h0XG5leHBvcnQgZGVmYXVsdCBjbGFzcyBMaWdodCB7XG5cbiAgICBjb25zdHJ1Y3RvciAodmlldywgY29uZmlnKSB7XG4gICAgICAgIHRoaXMubmFtZSA9IGNvbmZpZy5uYW1lO1xuICAgICAgICB0aGlzLnZpZXcgPSB2aWV3O1xuXG4gICAgICAgIGlmIChjb25maWcuYW1iaWVudCA9PSBudWxsIHx8IHR5cGVvZiBjb25maWcuYW1iaWVudCA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgICAgIHRoaXMuYW1iaWVudCA9IEdMU0wuZXhwYW5kVmVjMyhjb25maWcuYW1iaWVudCB8fCAwKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuYW1iaWVudCA9IFN0eWxlUGFyc2VyLnBhcnNlQ29sb3IoY29uZmlnLmFtYmllbnQpLnNsaWNlKDAsIDMpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNvbmZpZy5kaWZmdXNlID09IG51bGwgfHwgdHlwZW9mIGNvbmZpZy5kaWZmdXNlID09PSAnbnVtYmVyJykge1xuICAgICAgICAgICAgdGhpcy5kaWZmdXNlID0gR0xTTC5leHBhbmRWZWMzKGNvbmZpZy5kaWZmdXNlICE9IG51bGwgPyBjb25maWcuZGlmZnVzZSA6IDEpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5kaWZmdXNlID0gU3R5bGVQYXJzZXIucGFyc2VDb2xvcihjb25maWcuZGlmZnVzZSkuc2xpY2UoMCwgMyk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29uZmlnLnNwZWN1bGFyID09IG51bGwgfHwgdHlwZW9mIGNvbmZpZy5zcGVjdWxhciA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgICAgIHRoaXMuc3BlY3VsYXIgPSBHTFNMLmV4cGFuZFZlYzMoY29uZmlnLnNwZWN1bGFyIHx8IDApO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5zcGVjdWxhciA9IFN0eWxlUGFyc2VyLnBhcnNlQ29sb3IoY29uZmlnLnNwZWN1bGFyKS5zbGljZSgwLCAzKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIENyZWF0ZSBhIGxpZ2h0IGJ5IHR5cGUgbmFtZSwgZmFjdG9yeS1zdHlsZVxuICAgIC8vICdjb25maWcnIG11c3QgaW5jbHVkZSAnbmFtZScgYW5kICd0eXBlJywgYWxvbmcgd2l0aCBhbnkgb3RoZXIgdHlwZS1zcGVjaWZpYyBwcm9wZXJ0aWVzXG4gICAgc3RhdGljIGNyZWF0ZSAodmlldywgY29uZmlnKSB7XG4gICAgICAgIGlmIChMaWdodC50eXBlc1tjb25maWcudHlwZV0pIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgTGlnaHQudHlwZXNbY29uZmlnLnR5cGVdKHZpZXcsIGNvbmZpZyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBTZXQgbGlnaHQgZm9yIGEgc3R5bGU6IGZyYWdtZW50IGxpZ2h0aW5nLCB2ZXJ0ZXggbGlnaHRpbmcsIG9yIG5vbmVcbiAgICBzdGF0aWMgc2V0TW9kZSAobW9kZSwgc3R5bGUpIHtcbiAgICAgICAgaWYgKG1vZGUgPT09IHRydWUpIHtcbiAgICAgICAgICAgIG1vZGUgPSAnZnJhZ21lbnQnO1xuICAgICAgICB9XG4gICAgICAgIG1vZGUgPSBMaWdodC5lbmFibGVkICYmICgobW9kZSAhPSBudWxsKSA/IG1vZGUgOiAnZnJhZ21lbnQnKTsgLy8gZGVmYXVsdCB0byBmcmFnbWVudCBsaWdodGluZ1xuICAgICAgICBzdHlsZS5kZWZpbmVzWydUQU5HUkFNX0xJR0hUSU5HX0ZSQUdNRU5UJ10gPSAobW9kZSA9PT0gJ2ZyYWdtZW50Jyk7XG4gICAgICAgIHN0eWxlLmRlZmluZXNbJ1RBTkdSQU1fTElHSFRJTkdfVkVSVEVYJ10gPSAobW9kZSA9PT0gJ3ZlcnRleCcpO1xuICAgIH1cblxuICAgIC8vIEluamVjdCBhbGwgcHJvdmlkZWQgbGlnaHQgZGVmaW5pdGlvbnMsIGFuZCBjYWxjdWxhdGUgY3VtdWxhdGl2ZSBsaWdodCBmdW5jdGlvblxuICAgIHN0YXRpYyBpbmplY3QgKGxpZ2h0cykge1xuICAgICAgICAvLyBDbGVhciBwcmV2aW91cyBpbmplY3Rpb25zXG4gICAgICAgIFNoYWRlclByb2dyYW0ucmVtb3ZlQmxvY2soTGlnaHQuYmxvY2spO1xuXG4gICAgICAgIC8vIElmIGxpZ2h0aW5nIGlzIGdsb2JhbGx5IGRpc2FibGVkLCBub3RoaW5nIGlzIGluamVjdGVkIChtb3N0bHkgZm9yIGRlYnVnZ2luZyBvciBsaXZlIGVkaXRpbmcpXG4gICAgICAgIGlmICghTGlnaHQuZW5hYmxlZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ29uc3RydWN0IGNvZGUgdG8gY2FsY3VsYXRlIGVhY2ggbGlnaHQgaW5zdGFuY2VcbiAgICAgICAgbGV0IGNhbGN1bGF0ZUxpZ2h0cyA9IFwiXCI7XG4gICAgICAgIGlmIChsaWdodHMgJiYgT2JqZWN0LmtleXMobGlnaHRzKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAvLyBDb2xsZWN0IHVuaXF1ZXMgdHlwZXMgb2YgbGlnaHRzXG4gICAgICAgICAgICBsZXQgdHlwZXMgPSB7fTtcbiAgICAgICAgICAgIGZvciAobGV0IGxpZ2h0X25hbWUgaW4gbGlnaHRzKSB7XG4gICAgICAgICAgICAgICAgdHlwZXNbbGlnaHRzW2xpZ2h0X25hbWVdLnR5cGVdID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gSW5qZWN0IGVhY2ggdHlwZSBvZiBsaWdodFxuICAgICAgICAgICAgZm9yIChsZXQgdHlwZSBpbiB0eXBlcykge1xuICAgICAgICAgICAgICAgIExpZ2h0LnR5cGVzW3R5cGVdLmluamVjdCgpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBJbmplY3QgcGVyLWluc3RhbmNlIGJsb2NrcyBhbmQgY29uc3RydWN0IHRoZSBsaXN0IG9mIGZ1bmN0aW9ucyB0byBjYWxjdWxhdGUgZWFjaCBsaWdodFxuICAgICAgICAgICAgZm9yIChsZXQgbGlnaHRfbmFtZSBpbiBsaWdodHMpIHtcbiAgICAgICAgICAgICAgICAvLyBEZWZpbmUgaW5zdGFuY2VcbiAgICAgICAgICAgICAgICBsaWdodHNbbGlnaHRfbmFtZV0uaW5qZWN0KCk7XG5cbiAgICAgICAgICAgICAgICAvLyBBZGQgdGhlIGNhbGN1bGF0aW9uIGZ1bmN0aW9uIHRvIHRoZSBsaXN0XG4gICAgICAgICAgICAgICAgY2FsY3VsYXRlTGlnaHRzICs9IGBjYWxjdWxhdGVMaWdodCgke2xpZ2h0X25hbWV9LCBfZXllVG9Qb2ludCwgX25vcm1hbCk7XFxuYDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEdsdWUgdG9nZXRoZXIgdGhlIGZpbmFsIGxpZ2h0aW5nIGZ1bmN0aW9uIHRoYXQgc3VtcyBhbGwgdGhlIGxpZ2h0c1xuICAgICAgICBsZXQgY2FsY3VsYXRlRnVuY3Rpb24gPSBgXG4gICAgICAgICAgICB2ZWM0IGNhbGN1bGF0ZUxpZ2h0aW5nKGluIHZlYzMgX2V5ZVRvUG9pbnQsIGluIHZlYzMgX25vcm1hbCwgaW4gdmVjNCBfY29sb3IpIHtcblxuICAgICAgICAgICAgICAgIC8vIERvIGluaXRpYWwgbWF0ZXJpYWwgY2FsY3VsYXRpb25zIG92ZXIgbm9ybWFsLCBlbWlzc2lvbiwgYW1iaWVudCwgZGlmZnVzZSBhbmQgc3BlY3VsYXIgdmFsdWVzXG4gICAgICAgICAgICAgICAgY2FsY3VsYXRlTWF0ZXJpYWwoX2V5ZVRvUG9pbnQsX25vcm1hbCk7XG5cbiAgICAgICAgICAgICAgICAvLyBVbiByb2xsIHRoZSBsb29wIG9mIGluZGl2aWR1YWwgbGlndGhzIHRvIGNhbGN1bGF0ZVxuICAgICAgICAgICAgICAgICR7Y2FsY3VsYXRlTGlnaHRzfVxuXG4gICAgICAgICAgICAgICAgLy8gIEZpbmFsIGxpZ2h0IGludGVuc2l0eSBjYWxjdWxhdGlvblxuICAgICAgICAgICAgICAgIHZlYzQgY29sb3IgPSB2ZWM0KHZlYzMoMC4pLCBfY29sb3IuYSk7IC8vIHN0YXJ0IHdpdGggdmVydGV4IGNvbG9yIGFscGhhXG5cbiAgICAgICAgICAgICAgICAjaWZkZWYgVEFOR1JBTV9NQVRFUklBTF9FTUlTU0lPTlxuICAgICAgICAgICAgICAgICAgICBjb2xvci5yZ2IgPSBtYXRlcmlhbC5lbWlzc2lvbi5yZ2I7XG4gICAgICAgICAgICAgICAgICAgIGNvbG9yLmEgKj0gbWF0ZXJpYWwuZW1pc3Npb24uYTtcbiAgICAgICAgICAgICAgICAjZW5kaWZcblxuICAgICAgICAgICAgICAgICNpZmRlZiBUQU5HUkFNX01BVEVSSUFMX0FNQklFTlRcbiAgICAgICAgICAgICAgICAgICAgY29sb3IucmdiICs9IGxpZ2h0X2FjY3VtdWxhdG9yX2FtYmllbnQucmdiICogX2NvbG9yLnJnYiAqIG1hdGVyaWFsLmFtYmllbnQucmdiO1xuICAgICAgICAgICAgICAgICAgICBjb2xvci5hICo9IG1hdGVyaWFsLmFtYmllbnQuYTtcbiAgICAgICAgICAgICAgICAjZWxzZVxuICAgICAgICAgICAgICAgICAgICAjaWZkZWYgVEFOR1JBTV9NQVRFUklBTF9ESUZGVVNFXG4gICAgICAgICAgICAgICAgICAgICAgICBjb2xvci5yZ2IgKz0gbGlnaHRfYWNjdW11bGF0b3JfYW1iaWVudC5yZ2IgKiBfY29sb3IucmdiICogbWF0ZXJpYWwuZGlmZnVzZS5yZ2I7XG4gICAgICAgICAgICAgICAgICAgICNlbmRpZlxuICAgICAgICAgICAgICAgICNlbmRpZlxuXG4gICAgICAgICAgICAgICAgI2lmZGVmIFRBTkdSQU1fTUFURVJJQUxfRElGRlVTRVxuICAgICAgICAgICAgICAgICAgICBjb2xvci5yZ2IgKz0gbGlnaHRfYWNjdW11bGF0b3JfZGlmZnVzZS5yZ2IgKiBfY29sb3IucmdiICogbWF0ZXJpYWwuZGlmZnVzZS5yZ2I7XG4gICAgICAgICAgICAgICAgICAgIGNvbG9yLmEgKj0gbWF0ZXJpYWwuZGlmZnVzZS5hO1xuICAgICAgICAgICAgICAgICNlbmRpZlxuXG4gICAgICAgICAgICAgICAgI2lmZGVmIFRBTkdSQU1fTUFURVJJQUxfU1BFQ1VMQVJcbiAgICAgICAgICAgICAgICAgICAgY29sb3IucmdiICs9IGxpZ2h0X2FjY3VtdWxhdG9yX3NwZWN1bGFyLnJnYiAqIG1hdGVyaWFsLnNwZWN1bGFyLnJnYjtcbiAgICAgICAgICAgICAgICAgICAgY29sb3IuYSAqPSBtYXRlcmlhbC5zcGVjdWxhci5hO1xuICAgICAgICAgICAgICAgICNlbmRpZlxuXG4gICAgICAgICAgICAgICAgLy8gQ2xhbXAgZmluYWwgY29sb3JcbiAgICAgICAgICAgICAgICBjb2xvciA9IGNsYW1wKGNvbG9yLCAwLjAsIDEuMCk7XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gY29sb3I7XG4gICAgICAgICAgICB9YDtcblxuICAgICAgICBTaGFkZXJQcm9ncmFtLmFkZEJsb2NrKExpZ2h0LmJsb2NrLCBjYWxjdWxhdGVGdW5jdGlvbik7XG4gICAgfVxuXG4gICAgLy8gQ29tbW9uIGluc3RhbmNlIGRlZmluaXRpb25cbiAgICBpbmplY3QgKCkge1xuICAgICAgICBsZXQgaW5zdGFuY2UgPSAgYFxuICAgICAgICAgICAgdW5pZm9ybSAke3RoaXMuc3RydWN0X25hbWV9IHVfJHt0aGlzLm5hbWV9O1xuICAgICAgICAgICAgJHt0aGlzLnN0cnVjdF9uYW1lfSAke3RoaXMubmFtZX07XG4gICAgICAgICAgICBgO1xuICAgICAgICBsZXQgYXNzaWduID0gYFxuICAgICAgICAgICAgJHt0aGlzLm5hbWV9ID0gdV8ke3RoaXMubmFtZX07XFxuXG4gICAgICAgIGA7XG5cbiAgICAgICAgU2hhZGVyUHJvZ3JhbS5hZGRCbG9jayhMaWdodC5ibG9jaywgaW5zdGFuY2UpO1xuICAgICAgICBTaGFkZXJQcm9ncmFtLmFkZEJsb2NrKCdzZXR1cCcsIGFzc2lnbik7XG4gICAgfVxuXG4gICAgLy8gVXBkYXRlIG1ldGhvZCBjYWxsZWQgb25jZSBwZXIgZnJhbWVcbiAgICB1cGRhdGUgKCkge1xuICAgIH1cblxuICAgIC8vIENhbGxlZCBvbmNlIHBlciBmcmFtZSBwZXIgcHJvZ3JhbSAoZS5nLiBmb3IgbWFpbiByZW5kZXIgcGFzcywgdGhlbiBmb3IgZWFjaCBhZGRpdGlvbmFsXG4gICAgLy8gcGFzcyBmb3IgZmVhdHVyZSBzZWxlY3Rpb24sIGV0Yy4pXG4gICAgc2V0dXBQcm9ncmFtIChfcHJvZ3JhbSkge1xuICAgICAgICAvLyAgVGhyZWUgY29tbW9uIGxpZ2h0IHByb3BlcnRpZXNcbiAgICAgICAgX3Byb2dyYW0udW5pZm9ybSgnM2Z2JywgYHVfJHt0aGlzLm5hbWV9LmFtYmllbnRgLCB0aGlzLmFtYmllbnQpO1xuICAgICAgICBfcHJvZ3JhbS51bmlmb3JtKCczZnYnLCBgdV8ke3RoaXMubmFtZX0uZGlmZnVzZWAsIHRoaXMuZGlmZnVzZSk7XG4gICAgICAgIF9wcm9ncmFtLnVuaWZvcm0oJzNmdicsIGB1XyR7dGhpcy5uYW1lfS5zcGVjdWxhcmAsIHRoaXMuc3BlY3VsYXIpO1xuICAgIH1cblxufVxuXG5MaWdodC50eXBlcyA9IHt9OyAvLyByZWZlcmVuY2VzIHRvIHN1YmNsYXNzZXMgYnkgc2hvcnQgbmFtZVxuTGlnaHQuYmxvY2sgPSAnbGlnaHRpbmcnOyAvLyBzaGFkZXIgYmxvY2sgbmFtZVxuTGlnaHQuZW5hYmxlZCA9IHRydWU7IC8vIGxpZ2h0aW5nIGNhbiBiZSBnbG9iYWxseSBlbmFibGVkL2Rpc2FibGVkXG5cblxuLy8gTGlnaHQgc3ViY2xhc3Nlc1xuY2xhc3MgQW1iaWVudExpZ2h0IGV4dGVuZHMgTGlnaHQge1xuXG4gICAgY29uc3RydWN0b3IodmlldywgY29uZmlnKSB7XG4gICAgICAgIHN1cGVyKHZpZXcsIGNvbmZpZyk7XG4gICAgICAgIHRoaXMudHlwZSA9ICdhbWJpZW50JztcbiAgICAgICAgdGhpcy5zdHJ1Y3RfbmFtZSA9ICdBbWJpZW50TGlnaHQnO1xuICAgIH1cblxuICAgIC8vIEluamVjdCBzdHJ1Y3QgYW5kIGNhbGN1bGF0ZSBmdW5jdGlvblxuICAgIHN0YXRpYyBpbmplY3QoKSB7XG4gICAgICAgIFNoYWRlclByb2dyYW0uYWRkQmxvY2soTGlnaHQuYmxvY2ssIHNoYWRlclNyY19hbWJpZW50TGlnaHQpO1xuICAgIH1cblxuICAgIHNldHVwUHJvZ3JhbSAoX3Byb2dyYW0pIHtcbiAgICAgICAgX3Byb2dyYW0udW5pZm9ybSgnM2Z2JywgYHVfJHt0aGlzLm5hbWV9LmFtYmllbnRgLCB0aGlzLmFtYmllbnQpO1xuICAgIH1cblxufVxuTGlnaHQudHlwZXNbJ2FtYmllbnQnXSA9IEFtYmllbnRMaWdodDtcblxuY2xhc3MgRGlyZWN0aW9uYWxMaWdodCBleHRlbmRzIExpZ2h0IHtcblxuICAgIGNvbnN0cnVjdG9yKHZpZXcsIGNvbmZpZykge1xuICAgICAgICBzdXBlcih2aWV3LCBjb25maWcpO1xuICAgICAgICB0aGlzLnR5cGUgPSAnZGlyZWN0aW9uYWwnO1xuICAgICAgICB0aGlzLnN0cnVjdF9uYW1lID0gJ0RpcmVjdGlvbmFsTGlnaHQnO1xuXG4gICAgICAgIGlmIChjb25maWcuZGlyZWN0aW9uKSB7XG4gICAgICAgICAgICB0aGlzLl9kaXJlY3Rpb24gPSBjb25maWcuZGlyZWN0aW9uO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgLy8gRGVmYXVsdCBkaXJlY3Rpb25hbCBsaWdodCBtYWludGFpbnMgZnVsbCBpbnRlbnNpdHkgb24gZ3JvdW5kLCB3aXRoIGJhc2ljIGV4dHJ1c2lvbiBzaGFkaW5nXG4gICAgICAgICAgICBsZXQgdGhldGEgPSAxMzU7IC8vIGFuZ2xlIG9mIGxpZ2h0IGluIHh5IHBsYW5lIChyb3RhdGVkIGFyb3VuZCB6IGF4aXMpXG4gICAgICAgICAgICBsZXQgc2NhbGUgPSBNYXRoLnNpbihNYXRoLlBJKjYwLzE4MCk7IC8vIHNjYWxpbmcgZmFjdG9yIHRvIGtlZXAgdG90YWwgZGlyZWN0aW9uYWwgaW50ZW5zaXR5IHRvIDAuNVxuICAgICAgICAgICAgdGhpcy5fZGlyZWN0aW9uID0gW1xuICAgICAgICAgICAgICAgIE1hdGguY29zKE1hdGguUEkqdGhldGEvMTgwKSAqIHNjYWxlLFxuICAgICAgICAgICAgICAgIE1hdGguc2luKE1hdGguUEkqdGhldGEvMTgwKSAqIHNjYWxlLFxuICAgICAgICAgICAgICAgIC0wLjVcbiAgICAgICAgICAgIF07XG5cbiAgICAgICAgICAgIGlmIChjb25maWcuYW1iaWVudCA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5hbWJpZW50ID0gR0xTTC5leHBhbmRWZWMzKDAuNSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5kaXJlY3Rpb24gPSB0aGlzLl9kaXJlY3Rpb24ubWFwKHBhcnNlRmxvYXQpO1xuICAgIH1cblxuICAgIGdldCBkaXJlY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZGlyZWN0aW9uO1xuICAgIH1cblxuICAgIHNldCBkaXJlY3Rpb24gKHYpIHtcbiAgICAgICAgdGhpcy5fZGlyZWN0aW9uID0gVmVjdG9yLm5vcm1hbGl6ZSh2KTtcbiAgICB9XG5cbiAgICAvLyBJbmplY3Qgc3RydWN0IGFuZCBjYWxjdWxhdGUgZnVuY3Rpb25cbiAgICBzdGF0aWMgaW5qZWN0KCkge1xuICAgICAgICBTaGFkZXJQcm9ncmFtLmFkZEJsb2NrKExpZ2h0LmJsb2NrLCBzaGFkZXJTcmNfZGlyZWN0aW9uYWxMaWdodCk7XG4gICAgfVxuXG4gICAgc2V0dXBQcm9ncmFtIChfcHJvZ3JhbSkge1xuICAgICAgICBzdXBlci5zZXR1cFByb2dyYW0oX3Byb2dyYW0pO1xuICAgICAgICBfcHJvZ3JhbS51bmlmb3JtKCczZnYnLCBgdV8ke3RoaXMubmFtZX0uZGlyZWN0aW9uYCwgdGhpcy5kaXJlY3Rpb24pO1xuICAgIH1cblxufVxuTGlnaHQudHlwZXNbJ2RpcmVjdGlvbmFsJ10gPSBEaXJlY3Rpb25hbExpZ2h0O1xuXG5cbmNsYXNzIFBvaW50TGlnaHQgZXh0ZW5kcyBMaWdodCB7XG5cbiAgICBjb25zdHJ1Y3RvciAodmlldywgY29uZmlnKSB7XG4gICAgICAgIHN1cGVyKHZpZXcsIGNvbmZpZyk7XG4gICAgICAgIHRoaXMudHlwZSA9ICdwb2ludCc7XG4gICAgICAgIHRoaXMuc3RydWN0X25hbWUgPSAnUG9pbnRMaWdodCc7XG5cbiAgICAgICAgdGhpcy5wb3NpdGlvbiA9IGNvbmZpZy5wb3NpdGlvbiB8fCBbMCwgMCwgJzEwMHB4J107XG4gICAgICAgIHRoaXMucG9zaXRpb25fZXllID0gW107IC8vIHBvc2l0aW9uIGluIGV5ZXNwYWNlXG4gICAgICAgIHRoaXMub3JpZ2luID0gY29uZmlnLm9yaWdpbiB8fCAnZ3JvdW5kJztcbiAgICAgICAgdGhpcy5hdHRlbnVhdGlvbiA9ICFpc05hTihwYXJzZUZsb2F0KGNvbmZpZy5hdHRlbnVhdGlvbikpID8gcGFyc2VGbG9hdChjb25maWcuYXR0ZW51YXRpb24pIDogMDtcblxuICAgICAgICBpZiAoY29uZmlnLnJhZGl1cykge1xuICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoY29uZmlnLnJhZGl1cykgJiYgY29uZmlnLnJhZGl1cy5sZW5ndGggPT09IDIpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnJhZGl1cyA9IGNvbmZpZy5yYWRpdXM7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLnJhZGl1cyA9IFtudWxsLCBjb25maWcucmFkaXVzXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMucmFkaXVzID0gbnVsbDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIEluamVjdCBzdHJ1Y3QgYW5kIGNhbGN1bGF0ZSBmdW5jdGlvblxuICAgIHN0YXRpYyBpbmplY3QgKCkge1xuICAgICAgICBTaGFkZXJQcm9ncmFtLmFkZEJsb2NrKExpZ2h0LmJsb2NrLCBzaGFkZXJTcmNfcG9pbnRMaWdodCk7XG4gICAgfVxuXG4gICAgLy8gSW5qZWN0IGlzbnRhbmNlLXNwZWNpZmljIHNldHRpbmdzXG4gICAgaW5qZWN0KCkge1xuICAgICAgICBzdXBlci5pbmplY3QoKTtcblxuICAgICAgICBTaGFkZXJQcm9ncmFtLmRlZmluZXNbJ1RBTkdSQU1fUE9JTlRMSUdIVF9BVFRFTlVBVElPTl9FWFBPTkVOVCddID0gKHRoaXMuYXR0ZW51YXRpb24gIT09IDApO1xuICAgICAgICBTaGFkZXJQcm9ncmFtLmRlZmluZXNbJ1RBTkdSQU1fUE9JTlRMSUdIVF9BVFRFTlVBVElPTl9JTk5FUl9SQURJVVMnXSA9ICh0aGlzLnJhZGl1cyAhPSBudWxsICYmIHRoaXMucmFkaXVzWzBdICE9IG51bGwpO1xuICAgICAgICBTaGFkZXJQcm9ncmFtLmRlZmluZXNbJ1RBTkdSQU1fUE9JTlRMSUdIVF9BVFRFTlVBVElPTl9PVVRFUl9SQURJVVMnXSA9ICh0aGlzLnJhZGl1cyAhPSBudWxsKTtcbiAgICB9XG5cbiAgICB1cGRhdGUgKCkge1xuICAgICAgICB0aGlzLnVwZGF0ZUV5ZVBvc2l0aW9uKCk7XG4gICAgfVxuXG4gICAgdXBkYXRlRXllUG9zaXRpb24gKCkge1xuICAgICAgICBpZiAodGhpcy5vcmlnaW4gPT09ICd3b3JsZCcpIHtcbiAgICAgICAgICAgIC8vIEZvciB3b3JsZCBvcmlnaW4sIGZvcm1hdCBpczogW2xvbmdpdHVkZSwgbGF0aXR1ZGUsIG1ldGVycyAoZGVmYXVsdCkgb3IgcGl4ZWxzIHcvcHggdW5pdHNdXG5cbiAgICAgICAgICAgIC8vIE1vdmUgbGlnaHQncyB3b3JsZCBwb3NpdGlvbiBpbnRvIGNhbWVyYSBzcGFjZVxuICAgICAgICAgICAgbGV0IFt4LCB5XSA9IEdlby5sYXRMbmdUb01ldGVycyh0aGlzLnBvc2l0aW9uKTtcbiAgICAgICAgICAgIHRoaXMucG9zaXRpb25fZXllWzBdID0geCAtIHRoaXMudmlldy5jYW1lcmEucG9zaXRpb25fbWV0ZXJzWzBdO1xuICAgICAgICAgICAgdGhpcy5wb3NpdGlvbl9leWVbMV0gPSB5IC0gdGhpcy52aWV3LmNhbWVyYS5wb3NpdGlvbl9tZXRlcnNbMV07XG5cbiAgICAgICAgICAgIHRoaXMucG9zaXRpb25fZXllWzJdID0gU3R5bGVQYXJzZXIuY29udmVydFVuaXRzKHRoaXMucG9zaXRpb25bMl0sXG4gICAgICAgICAgICAgICAgeyB6b29tOiB0aGlzLnZpZXcuem9vbSwgbWV0ZXJzX3Blcl9waXhlbDogR2VvLm1ldGVyc1BlclBpeGVsKHRoaXMudmlldy56b29tKSB9KTtcbiAgICAgICAgICAgIHRoaXMucG9zaXRpb25fZXllWzJdID0gdGhpcy5wb3NpdGlvbl9leWVbMl0gLSB0aGlzLnZpZXcuY2FtZXJhLnBvc2l0aW9uX21ldGVyc1syXTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0aGlzLm9yaWdpbiA9PT0gJ2dyb3VuZCcgfHwgdGhpcy5vcmlnaW4gPT09ICdjYW1lcmEnKSB7XG4gICAgICAgICAgICAvLyBGb3IgY2FtZXJhIG9yIGdyb3VuZCBvcmlnaW4sIGZvcm1hdCBpczogW3gsIHksIHpdIGluIG1ldGVycyAoZGVmYXVsdCkgb3IgcGl4ZWxzIHcvcHggdW5pdHNcblxuICAgICAgICAgICAgLy8gTGlnaHQgaXMgaW4gY2FtZXJhIHNwYWNlIGJ5IGRlZmF1bHRcbiAgICAgICAgICAgIHRoaXMucG9zaXRpb25fZXllID0gU3R5bGVQYXJzZXIuY29udmVydFVuaXRzKHRoaXMucG9zaXRpb24sXG4gICAgICAgICAgICAgICAgeyB6b29tOiB0aGlzLnZpZXcuem9vbSwgbWV0ZXJzX3Blcl9waXhlbDogR2VvLm1ldGVyc1BlclBpeGVsKHRoaXMudmlldy56b29tKSB9KTtcblxuICAgICAgICAgICAgaWYgKHRoaXMub3JpZ2luID09PSAnZ3JvdW5kJykge1xuICAgICAgICAgICAgICAgIC8vIExlYXZlIGxpZ2h0J3MgeHkgaW4gY2FtZXJhIHNwYWNlLCBidXQgeiBuZWVkcyB0byBiZSBtb3ZlZCByZWxhdGl2ZSB0byBncm91bmQgcGxhbmVcbiAgICAgICAgICAgICAgICB0aGlzLnBvc2l0aW9uX2V5ZVsyXSA9IHRoaXMucG9zaXRpb25fZXllWzJdIC0gdGhpcy52aWV3LmNhbWVyYS5wb3NpdGlvbl9tZXRlcnNbMl07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5wb3NpdGlvbl9leWVbM10gPSAxO1xuICAgIH1cblxuICAgIHNldHVwUHJvZ3JhbSAoX3Byb2dyYW0pIHtcbiAgICAgICAgc3VwZXIuc2V0dXBQcm9ncmFtKF9wcm9ncmFtKTtcblxuICAgICAgICBfcHJvZ3JhbS51bmlmb3JtKCc0ZnYnLCBgdV8ke3RoaXMubmFtZX0ucG9zaXRpb25gLCB0aGlzLnBvc2l0aW9uX2V5ZSk7XG5cbiAgICAgICAgaWYoU2hhZGVyUHJvZ3JhbS5kZWZpbmVzWydUQU5HUkFNX1BPSU5UTElHSFRfQVRURU5VQVRJT05fRVhQT05FTlQnXSkge1xuICAgICAgICAgICAgX3Byb2dyYW0udW5pZm9ybSgnMWYnLCBgdV8ke3RoaXMubmFtZX0uYXR0ZW51YXRpb25FeHBvbmVudGAsIHRoaXMuYXR0ZW51YXRpb24pO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYoU2hhZGVyUHJvZ3JhbS5kZWZpbmVzWydUQU5HUkFNX1BPSU5UTElHSFRfQVRURU5VQVRJT05fSU5ORVJfUkFESVVTJ10pIHtcbiAgICAgICAgICAgIF9wcm9ncmFtLnVuaWZvcm0oJzFmJywgYHVfJHt0aGlzLm5hbWV9LmlubmVyUmFkaXVzYCxcbiAgICAgICAgICAgICAgICBTdHlsZVBhcnNlci5jb252ZXJ0VW5pdHModGhpcy5yYWRpdXNbMF0sXG4gICAgICAgICAgICAgICAgICAgIHsgem9vbTogdGhpcy52aWV3Lnpvb20sIG1ldGVyc19wZXJfcGl4ZWw6IEdlby5tZXRlcnNQZXJQaXhlbCh0aGlzLnZpZXcuem9vbSkgfSkpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYoU2hhZGVyUHJvZ3JhbS5kZWZpbmVzWydUQU5HUkFNX1BPSU5UTElHSFRfQVRURU5VQVRJT05fT1VURVJfUkFESVVTJ10pIHtcbiAgICAgICAgICAgIF9wcm9ncmFtLnVuaWZvcm0oJzFmJywgYHVfJHt0aGlzLm5hbWV9Lm91dGVyUmFkaXVzYCxcbiAgICAgICAgICAgICAgICBTdHlsZVBhcnNlci5jb252ZXJ0VW5pdHModGhpcy5yYWRpdXNbMV0sXG4gICAgICAgICAgICAgICAgICAgIHsgem9vbTogdGhpcy52aWV3Lnpvb20sIG1ldGVyc19wZXJfcGl4ZWw6IEdlby5tZXRlcnNQZXJQaXhlbCh0aGlzLnZpZXcuem9vbSkgfSkpO1xuICAgICAgICB9XG4gICAgfVxufVxuTGlnaHQudHlwZXNbJ3BvaW50J10gPSBQb2ludExpZ2h0O1xuXG5cbmNsYXNzIFNwb3RMaWdodCBleHRlbmRzIFBvaW50TGlnaHQge1xuXG4gICAgY29uc3RydWN0b3IgKHZpZXcsIGNvbmZpZykge1xuICAgICAgICBzdXBlcih2aWV3LCBjb25maWcpO1xuICAgICAgICB0aGlzLnR5cGUgPSAnc3BvdGxpZ2h0JztcbiAgICAgICAgdGhpcy5zdHJ1Y3RfbmFtZSA9ICdTcG90TGlnaHQnO1xuXG4gICAgICAgIHRoaXMuZGlyZWN0aW9uID0gdGhpcy5fZGlyZWN0aW9uID0gKGNvbmZpZy5kaXJlY3Rpb24gfHwgWzAsIDAsIC0xXSkubWFwKHBhcnNlRmxvYXQpOyAvLyBbeCwgeSwgel1cbiAgICAgICAgdGhpcy5leHBvbmVudCA9IGNvbmZpZy5leHBvbmVudCA/IHBhcnNlRmxvYXQoY29uZmlnLmV4cG9uZW50KSA6IDAuMjtcbiAgICAgICAgdGhpcy5hbmdsZSA9IGNvbmZpZy5hbmdsZSA/IHBhcnNlRmxvYXQoY29uZmlnLmFuZ2xlKSA6IDIwO1xuICAgIH1cblxuICAgIGdldCBkaXJlY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZGlyZWN0aW9uO1xuICAgIH1cblxuICAgIHNldCBkaXJlY3Rpb24gKHYpIHtcbiAgICAgICAgdGhpcy5fZGlyZWN0aW9uID0gVmVjdG9yLm5vcm1hbGl6ZSh2KTtcbiAgICB9XG5cbiAgICAvLyBJbmplY3Qgc3RydWN0IGFuZCBjYWxjdWxhdGUgZnVuY3Rpb25cbiAgICBzdGF0aWMgaW5qZWN0ICgpIHtcbiAgICAgICAgU2hhZGVyUHJvZ3JhbS5hZGRCbG9jayhMaWdodC5ibG9jaywgc2hhZGVyU3JjX3Nwb3RMaWdodCk7XG4gICAgfVxuXG4gICAgc2V0dXBQcm9ncmFtIChfcHJvZ3JhbSkge1xuICAgICAgICBzdXBlci5zZXR1cFByb2dyYW0oX3Byb2dyYW0pO1xuXG4gICAgICAgIF9wcm9ncmFtLnVuaWZvcm0oJzNmdicsIGB1XyR7dGhpcy5uYW1lfS5kaXJlY3Rpb25gLCB0aGlzLmRpcmVjdGlvbik7XG4gICAgICAgIF9wcm9ncmFtLnVuaWZvcm0oJzFmJywgYHVfJHt0aGlzLm5hbWV9LnNwb3RDb3NDdXRvZmZgLCBNYXRoLmNvcyh0aGlzLmFuZ2xlICogMy4xNDE1OSAvIDE4MCkpO1xuICAgICAgICBfcHJvZ3JhbS51bmlmb3JtKCcxZicsIGB1XyR7dGhpcy5uYW1lfS5zcG90RXhwb25lbnRgLCB0aGlzLmV4cG9uZW50KTtcbiAgICB9XG5cbn1cbkxpZ2h0LnR5cGVzWydzcG90bGlnaHQnXSA9IFNwb3RMaWdodDtcbiIsImltcG9ydCBHTFNMIGZyb20gJy4vZ2wvZ2xzbCc7XG5pbXBvcnQge1N0eWxlUGFyc2VyfSBmcm9tICcuL3N0eWxlcy9zdHlsZV9wYXJzZXInO1xuXG5sZXQgZnMgPSByZXF1aXJlKCdmcycpO1xuY29uc3Qgc2hhZGVyU3JjX21hdGVyaWFsID0gZnMucmVhZEZpbGVTeW5jKF9fZGlybmFtZSArICcvZ2wvc2hhZGVycy9tYXRlcmlhbC5nbHNsJywgJ3V0ZjgnKTtcblxuY29uc3QgbWF0ZXJpYWxfcHJvcHMgPSBbJ2VtaXNzaW9uJywgJ2FtYmllbnQnLCAnZGlmZnVzZScsICdzcGVjdWxhciddO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBNYXRlcmlhbCB7XG4gICAgY29uc3RydWN0b3IgKGNvbmZpZykge1xuXG4gICAgICAgIGNvbmZpZyA9IGNvbmZpZyB8fCB7fTtcblxuICAgICAgICAvLyBUaGVzZSBwcm9wZXJ0aWVzIGFsbCBoYXZlIHRoZSBzYW1lIGRlZmF1bHRzLCBzbyB0aGV5IGNhbiBiZSBzZXQgaW4gYnVsa1xuICAgICAgICBtYXRlcmlhbF9wcm9wcy5mb3JFYWNoKHByb3AgPT4ge1xuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBjb25maWdbcHJvcF07XG4gICAgICAgICAgICBpZiAodmFsdWUgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGlmICh2YWx1ZS50ZXh0dXJlKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXNbcHJvcF0gPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0ZXh0dXJlOiB2YWx1ZS50ZXh0dXJlLFxuICAgICAgICAgICAgICAgICAgICAgICAgbWFwcGluZzogdmFsdWUubWFwcGluZyB8fCAnc3BoZXJlbWFwJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHNjYWxlOiBHTFNMLmV4cGFuZFZlYzModmFsdWUuc2NhbGUgIT0gbnVsbCA/IHZhbHVlLnNjYWxlIDogMSksXG4gICAgICAgICAgICAgICAgICAgICAgICBhbW91bnQ6IEdMU0wuZXhwYW5kVmVjNCh2YWx1ZS5hbW91bnQgIT0gbnVsbCA/IHZhbHVlLmFtb3VudCA6IDEpXG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicgfHwgQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpc1twcm9wXSA9IHsgYW1vdW50OiBHTFNMLmV4cGFuZFZlYzQodmFsdWUpIH07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpc1twcm9wXSA9IHsgYW1vdW50OiBTdHlsZVBhcnNlci5wYXJzZUNvbG9yKHZhbHVlKSB9O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpc1twcm9wXSA9IHZhbHVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gRXh0cmEgc3BlY3VsYXIgcHJvcHNcbiAgICAgICAgaWYgKHRoaXMuc3BlY3VsYXIpIHtcbiAgICAgICAgICAgIHRoaXMuc3BlY3VsYXIuc2hpbmluZXNzID0gY29uZmlnLnNoaW5pbmVzcyA/IHBhcnNlRmxvYXQoY29uZmlnLnNoaW5pbmVzcykgOiAwLjI7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBOb3JtYWwgbWFwcGluZ1xuICAgICAgICBpZiAoY29uZmlnLm5vcm1hbCAhPSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLm5vcm1hbCA9IHtcbiAgICAgICAgICAgICAgICB0ZXh0dXJlOiBjb25maWcubm9ybWFsLnRleHR1cmUsXG4gICAgICAgICAgICAgICAgbWFwcGluZzogY29uZmlnLm5vcm1hbC5tYXBwaW5nIHx8ICd0cmlwbGFuYXInLFxuICAgICAgICAgICAgICAgIHNjYWxlOiBHTFNMLmV4cGFuZFZlYzMoY29uZmlnLm5vcm1hbC5zY2FsZSAhPSBudWxsID8gY29uZmlnLm5vcm1hbC5zY2FsZSA6IDEpLFxuICAgICAgICAgICAgICAgIGFtb3VudDogY29uZmlnLm5vcm1hbC5hbW91bnQgIT0gbnVsbCA/IGNvbmZpZy5ub3JtYWwuYW1vdW50IDogMVxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIERldGVybWluZSBpZiBhIG1hdGVyaWFsIGNvbmZpZyBibG9jayBoYXMgc3VmZmljaWVudCBwcm9wZXJ0aWVzIHRvIGNyZWF0ZSBhIG1hdGVyaWFsXG4gICAgc3RhdGljIGlzVmFsaWQgKGNvbmZpZykge1xuICAgICAgICBpZiAoY29uZmlnID09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjb25maWcuZW1pc3Npb24gPT0gbnVsbCAmJlxuICAgICAgICAgICAgY29uZmlnLmFtYmllbnQgPT0gbnVsbCAmJlxuICAgICAgICAgICAgY29uZmlnLmRpZmZ1c2UgPT0gbnVsbCAmJlxuICAgICAgICAgICAgY29uZmlnLnNwZWN1bGFyID09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGluamVjdCAoc3R5bGUpIHtcbiAgICAgICAgLy8gRm9yIGVhY2ggcHJvcGVydHksIHNldHMgZGVmaW5lcyB0byBjb25maWd1cmUgdGV4dHVyZSBtYXBwaW5nLCB3aXRoIGEgcGF0dGVybiBsaWtlOlxuICAgICAgICAvLyAgIFRBTkdSQU1fTUFURVJJQUxfRElGRlVTRSwgVEFOR1JBTV9NQVRFUklBTF9ESUZGVVNFX1RFWFRVUkUsIFRBTkdSQU1fTUFURVJJQUxfRElGRlVTRV9URVhUVVJFX1NQSEVSRU1BUFxuICAgICAgICAvLyBBbHNvIHNldHMgZmxhZ3MgdG8ga2VlcCB0cmFjayBvZiBlYWNoIHVuaXF1ZSBtYXBwaW5nIHR5cGUgYmVpbmcgdXNlZCwgZS5nLjpcbiAgICAgICAgLy8gICBUQU5HUkFNX01BVEVSSUFMX1RFWFRVUkVfU1BIRVJFTUFQXG4gICAgICAgIC8vIEVuYWJsZXMgdGV4dHVyZSBjb29yZGluYXRlcyBpZiBuZWVkZWQgYW5kIG5vdCBhbHJlYWR5IG9uXG4gICAgICAgIG1hdGVyaWFsX3Byb3BzLmZvckVhY2gocHJvcCA9PiB7XG4gICAgICAgICAgICBsZXQgZGVmID0gYFRBTkdSQU1fTUFURVJJQUxfJHtwcm9wLnRvVXBwZXJDYXNlKCl9YDtcbiAgICAgICAgICAgIGxldCB0ZXhkZWYgPSBkZWYgKyAnX1RFWFRVUkUnO1xuICAgICAgICAgICAgc3R5bGUuZGVmaW5lc1tkZWZdID0gKHRoaXNbcHJvcF0gIT0gbnVsbCk7XG4gICAgICAgICAgICBpZiAodGhpc1twcm9wXSAmJiB0aGlzW3Byb3BdLnRleHR1cmUpIHtcbiAgICAgICAgICAgICAgICBzdHlsZS5kZWZpbmVzW3RleGRlZl0gPSB0cnVlO1xuICAgICAgICAgICAgICAgIHN0eWxlLmRlZmluZXNbdGV4ZGVmICsgJ18nICsgdGhpc1twcm9wXS5tYXBwaW5nLnRvVXBwZXJDYXNlKCldID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBzdHlsZS5kZWZpbmVzW2BUQU5HUkFNX01BVEVSSUFMX1RFWFRVUkVfJHt0aGlzW3Byb3BdLm1hcHBpbmcudG9VcHBlckNhc2UoKX1gXSA9IHRydWU7XG4gICAgICAgICAgICAgICAgc3R5bGUudGV4Y29vcmRzID0gc3R5bGUudGV4Y29vcmRzIHx8ICh0aGlzW3Byb3BdLm1hcHBpbmcgPT09ICd1dicpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICAvLyBOb3JtYWwgbWFwcGluZ1xuICAgICAgICAvLyBBcyBhbm92ZSwgc2V0cyBmbGFncyB0byBrZWVwIHRyYWNrIG9mIGVhY2ggdW5pcXVlIG1hcHBpbmcgdHlwZSBiZWluZyB1c2VkLCBlLmcuOlxuICAgICAgICAvLyAgIFRBTkdSQU1fTUFURVJJQUxfVEVYVFVSRV9TUEhFUkVNQVBcbiAgICAgICAgaWYgKHRoaXMubm9ybWFsICYmIHRoaXMubm9ybWFsLnRleHR1cmUpIHtcbiAgICAgICAgICAgIHN0eWxlLmRlZmluZXNbJ1RBTkdSQU1fTUFURVJJQUxfTk9STUFMX1RFWFRVUkUnXSA9IHRydWU7XG4gICAgICAgICAgICBzdHlsZS5kZWZpbmVzWydUQU5HUkFNX01BVEVSSUFMX05PUk1BTF9URVhUVVJFXycgKyB0aGlzLm5vcm1hbC5tYXBwaW5nLnRvVXBwZXJDYXNlKCldID0gdHJ1ZTtcbiAgICAgICAgICAgIHN0eWxlLmRlZmluZXNbYFRBTkdSQU1fTUFURVJJQUxfVEVYVFVSRV8ke3RoaXMubm9ybWFsLm1hcHBpbmcudG9VcHBlckNhc2UoKX1gXSA9IHRydWU7XG4gICAgICAgICAgICBzdHlsZS50ZXhjb29yZHMgPSBzdHlsZS50ZXhjb29yZHMgfHwgKHRoaXMubm9ybWFsLm1hcHBpbmcgPT09ICd1dicpO1xuICAgICAgICB9XG5cbiAgICAgICAgc3R5bGUucmVwbGFjZVNoYWRlckJsb2NrKE1hdGVyaWFsLmJsb2NrLCBzaGFkZXJTcmNfbWF0ZXJpYWwsICdNYXRlcmlhbCcpO1xuICAgICAgICBzdHlsZS5hZGRTaGFkZXJCbG9jaygnc2V0dXAnLCAnXFxubWF0ZXJpYWwgPSB1X21hdGVyaWFsO1xcbicsICdNYXRlcmlhbCcpO1xuICAgIH1cblxuICAgIHNldHVwUHJvZ3JhbSAoX3Byb2dyYW0pIHtcbiAgICAgICAgLy8gRm9yIGVhY2ggcHJvcGVydHksIHNldHMgdW5pZm9ybXMgaW4gdGhlIHBhdHRlcm46XG4gICAgICAgIC8vIHVfbWF0ZXJpYWwuZGlmZnVzZSwgdV9tYXRlcmlhbC5kaWZmdXNlU2NhbGUgdV9tYXRlcmlhbF9kaWZmdXNlX3RleHR1cmVcbiAgICAgICAgbWF0ZXJpYWxfcHJvcHMuZm9yRWFjaChwcm9wID0+IHtcbiAgICAgICAgICAgIGlmICh0aGlzW3Byb3BdKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXNbcHJvcF0udGV4dHVyZSkge1xuICAgICAgICAgICAgICAgICAgICBfcHJvZ3JhbS5zZXRUZXh0dXJlVW5pZm9ybShgdV9tYXRlcmlhbF8ke3Byb3B9X3RleHR1cmVgLCB0aGlzW3Byb3BdLnRleHR1cmUpO1xuICAgICAgICAgICAgICAgICAgICBfcHJvZ3JhbS51bmlmb3JtKCczZnYnLCBgdV9tYXRlcmlhbC4ke3Byb3B9U2NhbGVgLCB0aGlzW3Byb3BdLnNjYWxlKTtcbiAgICAgICAgICAgICAgICAgICAgX3Byb2dyYW0udW5pZm9ybSgnNGZ2JywgYHVfbWF0ZXJpYWwuJHtwcm9wfWAsIHRoaXNbcHJvcF0uYW1vdW50KTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXNbcHJvcF0uYW1vdW50KSB7XG4gICAgICAgICAgICAgICAgICAgIF9wcm9ncmFtLnVuaWZvcm0oJzRmdicsIGB1X21hdGVyaWFsLiR7cHJvcH1gLCB0aGlzW3Byb3BdLmFtb3VudCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICAvLyBFeHRyYSBzcGVjdWxhciBwcm9wc1xuICAgICAgICBpZiAodGhpcy5zcGVjdWxhcikge1xuICAgICAgICAgICAgX3Byb2dyYW0udW5pZm9ybSgnMWYnLCAndV9tYXRlcmlhbC5zaGluaW5lc3MnLCB0aGlzLnNwZWN1bGFyLnNoaW5pbmVzcyk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBOb3JtYWwgbWFwcGluZ1xuICAgICAgICBpZiAodGhpcy5ub3JtYWwgJiYgdGhpcy5ub3JtYWwudGV4dHVyZSkge1xuICAgICAgICAgICAgX3Byb2dyYW0uc2V0VGV4dHVyZVVuaWZvcm0oJ3VfbWF0ZXJpYWxfbm9ybWFsX3RleHR1cmUnLCB0aGlzLm5vcm1hbC50ZXh0dXJlKTtcbiAgICAgICAgICAgIF9wcm9ncmFtLnVuaWZvcm0oJzNmdicsICd1X21hdGVyaWFsLm5vcm1hbFNjYWxlJywgdGhpcy5ub3JtYWwuc2NhbGUpO1xuICAgICAgICAgICAgX3Byb2dyYW0udW5pZm9ybSgnMWYnLCAndV9tYXRlcmlhbC5ub3JtYWxBbW91bnQnLCB0aGlzLm5vcm1hbC5hbW91bnQpO1xuICAgICAgICB9XG4gICAgfVxufVxuXG5NYXRlcmlhbC5ibG9jayA9ICdtYXRlcmlhbCc7XG4iLCIvKmpzaGludCB3b3JrZXI6IHRydWUqL1xuXG5pbXBvcnQgJy4vdXRpbHMvcG9seWZpbGxzJztcblxuLy8gVGhlIGxlYWZsZXQgbGF5ZXIgcGx1Z2luIGlzIGN1cnJlbnRseSB0aGUgcHJpbWFyeSBwdWJsaWMgQVBJXG5pbXBvcnQge2xlYWZsZXRMYXllcn0gZnJvbSAnLi9sZWFmbGV0X2xheWVyJztcblxuLy8gVGhlIHNjZW5lIHdvcmtlciBpcyBvbmx5IGFjdGl2YXRlZCB3aGVuIGEgd29ya2VyIHRocmVhZCBpcyBpbnN0YW50aWF0ZWQsIGJ1dCBtdXN0IGFsd2F5cyBiZSBsb2FkZWRcbmltcG9ydCBTY2VuZSBmcm9tICcuL3NjZW5lJztcbmltcG9ydCB7U2NlbmVXb3JrZXJ9IGZyb20gJy4vc2NlbmVfd29ya2VyJztcblxuLy8gQWRkaXRpb25hbCBtb2R1bGVzIGFyZSBleHBvc2VkIGZvciBkZWJ1Z2dpbmdcbmltcG9ydCB2ZXJzaW9uIGZyb20gJy4vdXRpbHMvdmVyc2lvbic7XG5pbXBvcnQgbG9nIGZyb20gJy4vdXRpbHMvbG9nJztcbmltcG9ydCBUaHJlYWQgZnJvbSAnLi91dGlscy90aHJlYWQnO1xuaW1wb3J0IFV0aWxzIGZyb20gJy4vdXRpbHMvdXRpbHMnO1xuaW1wb3J0IEdlbyBmcm9tICcuL2dlbyc7XG5pbXBvcnQgVmVjdG9yIGZyb20gJy4vdmVjdG9yJztcbmltcG9ydCBEYXRhU291cmNlIGZyb20gJy4vc291cmNlcy9kYXRhX3NvdXJjZSc7XG5pbXBvcnQgJy4vc291cmNlcy9nZW9qc29uJztcbmltcG9ydCAnLi9zb3VyY2VzL3RvcG9qc29uJztcbmltcG9ydCAnLi9zb3VyY2VzL212dCc7XG5pbXBvcnQgJy4vc291cmNlcy9yYXN0ZXInO1xuaW1wb3J0IEdMU0wgZnJvbSAnLi9nbC9nbHNsJztcbmltcG9ydCBTaGFkZXJQcm9ncmFtIGZyb20gJy4vZ2wvc2hhZGVyX3Byb2dyYW0nO1xuaW1wb3J0IFZlcnRleERhdGEgZnJvbSAnLi9nbC92ZXJ0ZXhfZGF0YSc7XG5pbXBvcnQgVGV4dHVyZSBmcm9tICcuL2dsL3RleHR1cmUnO1xuaW1wb3J0IE1hdGVyaWFsIGZyb20gJy4vbWF0ZXJpYWwnO1xuaW1wb3J0IExpZ2h0IGZyb20gJy4vbGlnaHQnO1xuaW1wb3J0IFdvcmtlckJyb2tlciBmcm9tICcuL3V0aWxzL3dvcmtlcl9icm9rZXInO1xuaW1wb3J0IHtsYXllcl9jYWNoZX0gZnJvbSAnLi9zdHlsZXMvbGF5ZXInO1xuaW1wb3J0IHtTdHlsZU1hbmFnZXJ9IGZyb20gJy4vc3R5bGVzL3N0eWxlX21hbmFnZXInO1xuaW1wb3J0IHtTdHlsZVBhcnNlcn0gZnJvbSAnLi9zdHlsZXMvc3R5bGVfcGFyc2VyJztcbmltcG9ydCBDb2xsaXNpb24gZnJvbSAnLi9sYWJlbHMvY29sbGlzaW9uJztcbmltcG9ydCBGZWF0dXJlU2VsZWN0aW9uIGZyb20gJy4vc2VsZWN0aW9uJztcbmltcG9ydCBDYW52YXNUZXh0IGZyb20gJy4vc3R5bGVzL3RleHQvY2FudmFzX3RleHQnO1xuaW1wb3J0IGRlYnVnU2V0dGluZ3MgZnJvbSAnLi91dGlscy9kZWJ1Z19zZXR0aW5ncyc7XG5cbmltcG9ydCB5YW1sIGZyb20gJ2pzLXlhbWwnO1xuaW1wb3J0IEpTWmlwIGZyb20gJ2pzemlwJztcblxuLy8gTWFrZSBzb21lIG1vZHVsZXMgYWNjZXNzaWJsZSBmb3IgZGVidWdnaW5nXG52YXIgZGVidWcgPSB7XG4gICAgbG9nLFxuICAgIHlhbWwsXG4gICAgVGhyZWFkLFxuICAgIFV0aWxzLFxuICAgIEdlbyxcbiAgICBWZWN0b3IsXG4gICAgRGF0YVNvdXJjZSxcbiAgICBHTFNMLFxuICAgIFNoYWRlclByb2dyYW0sXG4gICAgVmVydGV4RGF0YSxcbiAgICBUZXh0dXJlLFxuICAgIE1hdGVyaWFsLFxuICAgIExpZ2h0LFxuICAgIFNjZW5lLFxuICAgIFNjZW5lV29ya2VyLFxuICAgIFdvcmtlckJyb2tlcixcbiAgICBsYXllcl9jYWNoZSxcbiAgICBTdHlsZU1hbmFnZXIsXG4gICAgU3R5bGVQYXJzZXIsXG4gICAgQ29sbGlzaW9uLFxuICAgIEZlYXR1cmVTZWxlY3Rpb24sXG4gICAgQ2FudmFzVGV4dCxcbiAgICBkZWJ1Z1NldHRpbmdzXG59O1xuXG5pZiAoVGhyZWFkLmlzX21haW4pIHtcbiAgICBVdGlscy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWVQb2x5ZmlsbCgpO1xuXG4gICAgLy8gQXR0YWNoIFByb21pc2UgcG9seWZpbGwgdG8gd2luZG93XG4gICAgLy8gQWxsb3dzIEZvbnRGYWNlT2JzZXJ2ZXIgdG8gdXNlIHBvbHlmaWxsICh3aXRob3V0IG5lZWRpbmcgdG8gaW5jbHVkZSBpdHMgb3duIGR1cGxpY2F0ZSBwb2x5ZmlsbClcbiAgICBpZiAod2luZG93LlByb21pc2UgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICB3aW5kb3cuUHJvbWlzZSA9IFByb21pc2U7XG4gICAgICAgIEpTWmlwLmV4dGVybmFsLlByb21pc2UgPSBQcm9taXNlO1xuICAgIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gICAgbGVhZmxldExheWVyLFxuICAgIGRlYnVnLFxuICAgIHZlcnNpb25cbn07XG4iLCJpbXBvcnQgbG9nIGZyb20gJy4vdXRpbHMvbG9nJztcbmltcG9ydCBVdGlscyBmcm9tICcuL3V0aWxzL3V0aWxzJztcbmltcG9ydCAqIGFzIFVSTHMgZnJvbSAnLi91dGlscy91cmxzJztcbmltcG9ydCBXb3JrZXJCcm9rZXIgZnJvbSAnLi91dGlscy93b3JrZXJfYnJva2VyJztcbmltcG9ydCBzdWJzY3JpYmVNaXhpbiBmcm9tICcuL3V0aWxzL3N1YnNjcmliZSc7XG5pbXBvcnQgQ29udGV4dCBmcm9tICcuL2dsL2NvbnRleHQnO1xuaW1wb3J0IFRleHR1cmUgZnJvbSAnLi9nbC90ZXh0dXJlJztcbmltcG9ydCBTaGFkZXJQcm9ncmFtIGZyb20gJy4vZ2wvc2hhZGVyX3Byb2dyYW0nO1xuaW1wb3J0IFZlcnRleEFycmF5T2JqZWN0IGZyb20gJy4vZ2wvdmFvJztcbmltcG9ydCB7U3R5bGVNYW5hZ2VyfSBmcm9tICcuL3N0eWxlcy9zdHlsZV9tYW5hZ2VyJztcbmltcG9ydCB7U3R5bGV9IGZyb20gJy4vc3R5bGVzL3N0eWxlJztcbmltcG9ydCB7U3R5bGVQYXJzZXJ9IGZyb20gJy4vc3R5bGVzL3N0eWxlX3BhcnNlcic7XG5pbXBvcnQgU2NlbmVMb2FkZXIgZnJvbSAnLi9zY2VuZV9sb2FkZXInO1xuaW1wb3J0IFZpZXcgZnJvbSAnLi92aWV3JztcbmltcG9ydCBMaWdodCBmcm9tICcuL2xpZ2h0JztcbmltcG9ydCBUaWxlTWFuYWdlciBmcm9tICcuL3RpbGVfbWFuYWdlcic7XG5pbXBvcnQgRGF0YVNvdXJjZSBmcm9tICcuL3NvdXJjZXMvZGF0YV9zb3VyY2UnO1xuaW1wb3J0IEZlYXR1cmVTZWxlY3Rpb24gZnJvbSAnLi9zZWxlY3Rpb24nO1xuaW1wb3J0IFJlbmRlclN0YXRlTWFuYWdlciBmcm9tICcuL2dsL3JlbmRlcl9zdGF0ZSc7XG5pbXBvcnQgRm9udE1hbmFnZXIgZnJvbSAnLi9zdHlsZXMvdGV4dC9mb250X21hbmFnZXInO1xuaW1wb3J0IE1lZGlhQ2FwdHVyZSBmcm9tICcuL3V0aWxzL21lZGlhX2NhcHR1cmUnO1xuXG4vLyBMb2FkIHNjZW5lIGRlZmluaXRpb246IHBhc3MgYW4gb2JqZWN0IGRpcmVjdGx5LCBvciBhIFVSTCBhcyBzdHJpbmcgdG8gbG9hZCByZW1vdGVseVxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgU2NlbmUge1xuXG4gICAgY29uc3RydWN0b3IoY29uZmlnX3NvdXJjZSwgb3B0aW9ucykge1xuICAgICAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgICAgICAgc3Vic2NyaWJlTWl4aW4odGhpcyk7XG5cbiAgICAgICAgdGhpcy5pZCA9IFNjZW5lLmlkKys7XG4gICAgICAgIHRoaXMuaW5pdGlhbGl6ZWQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5pbml0aWFsaXppbmcgPSBudWxsOyAvLyB3aWxsIGJlIGEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gc2NlbmUgaXMgbG9hZGVkXG4gICAgICAgIHRoaXMuc291cmNlcyA9IHt9O1xuXG4gICAgICAgIHRoaXMudmlldyA9IG5ldyBWaWV3KHRoaXMsIG9wdGlvbnMpO1xuICAgICAgICB0aGlzLnRpbGVfbWFuYWdlciA9IG5ldyBUaWxlTWFuYWdlcih7IHNjZW5lOiB0aGlzLCB2aWV3OiB0aGlzLnZpZXcgfSk7XG4gICAgICAgIHRoaXMubnVtX3dvcmtlcnMgPSBvcHRpb25zLm51bVdvcmtlcnMgfHwgMjtcbiAgICAgICAgdGhpcy53b3JrZXJfdXJsID0gb3B0aW9ucy53b3JrZXJVcmw7XG4gICAgICAgIGlmIChvcHRpb25zLmRpc2FibGVWZXJ0ZXhBcnJheU9iamVjdHMgPT09IHRydWUpIHtcbiAgICAgICAgICAgIFZlcnRleEFycmF5T2JqZWN0LmRpc2FibGVkID0gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIFV0aWxzLnVzZV9oaWdoX2RlbnNpdHlfZGlzcGxheSA9IG9wdGlvbnMuaGlnaERlbnNpdHlEaXNwbGF5ICE9PSB1bmRlZmluZWQgPyBvcHRpb25zLmhpZ2hEZW5zaXR5RGlzcGxheSA6IHRydWU7XG4gICAgICAgIFV0aWxzLnVwZGF0ZURldmljZVBpeGVsUmF0aW8oKTtcblxuICAgICAgICB0aGlzLmNvbmZpZyA9IG51bGw7XG4gICAgICAgIHRoaXMuY29uZmlnX3NvdXJjZSA9IGNvbmZpZ19zb3VyY2U7XG4gICAgICAgIHRoaXMuY29uZmlnX3NlcmlhbGl6ZWQgPSBudWxsO1xuICAgICAgICB0aGlzLmxhc3RfdmFsaWRfY29uZmlnX3NvdXJjZSA9IG51bGw7XG5cbiAgICAgICAgdGhpcy5zdHlsZXMgPSBudWxsO1xuICAgICAgICB0aGlzLnN0eWxlX21hbmFnZXIgPSBuZXcgU3R5bGVNYW5hZ2VyKCk7XG5cbiAgICAgICAgdGhpcy5idWlsZGluZyA9IG51bGw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHJhY2tzIGN1cnJlbnQgc2NlbmUgYnVpbGRpbmcgc3RhdGUgKHRpbGVzIGJlaW5nIGJ1aWx0LCBldGMuKVxuICAgICAgICB0aGlzLmRpcnR5ID0gdHJ1ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZXF1ZXN0IGEgcmVkcmF3XG4gICAgICAgIHRoaXMuYW5pbWF0ZWQgPSBmYWxzZTsgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlcXVlc3QgcmVkcmF3IGV2ZXJ5IGZyYW1lXG4gICAgICAgIHRoaXMucHJlVXBkYXRlID0gb3B0aW9ucy5wcmVVcGRhdGU7ICAgICAgICAgICAgIC8vIG9wdGlvbmFsIHByZS1yZW5kZXIgbG9vcCBob29rXG4gICAgICAgIHRoaXMucG9zdFVwZGF0ZSA9IG9wdGlvbnMucG9zdFVwZGF0ZTsgICAgICAgICAgIC8vIG9wdGlvbmFsIHBvc3QtcmVuZGVyIGxvb3AgaG9va1xuICAgICAgICB0aGlzLnJlbmRlcl9sb29wID0gIW9wdGlvbnMuZGlzYWJsZVJlbmRlckxvb3A7ICAvLyBkaXNhYmxlIHJlbmRlciBsb29wIC0gYXBwIHdpbGwgaGF2ZSB0byBtYW51YWxseSBjYWxsIFNjZW5lLnJlbmRlcigpIHBlciBmcmFtZVxuICAgICAgICB0aGlzLnJlbmRlcl9sb29wX2FjdGl2ZSA9IGZhbHNlO1xuICAgICAgICB0aGlzLnJlbmRlcl9sb29wX3N0b3AgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5yZW5kZXJfY291bnQgPSAwO1xuICAgICAgICB0aGlzLmxhc3RfcmVuZGVyX2NvdW50ID0gMDtcbiAgICAgICAgdGhpcy5yZW5kZXJfY291bnRfY2hhbmdlZCA9IGZhbHNlO1xuICAgICAgICB0aGlzLmZyYW1lID0gMDtcbiAgICAgICAgdGhpcy5tZWRpYV9jYXB0dXJlID0gbmV3IE1lZGlhQ2FwdHVyZSgpO1xuICAgICAgICB0aGlzLnNlbGVjdGlvbiA9IG51bGw7XG4gICAgICAgIHRoaXMuaW50cm9zcGVjdGlvbiA9IGZhbHNlO1xuICAgICAgICB0aGlzLnJlc2V0VGltZSgpO1xuXG4gICAgICAgIHRoaXMuY29udGFpbmVyID0gb3B0aW9ucy5jb250YWluZXI7XG5cbiAgICAgICAgdGhpcy5saWdodHMgPSBudWxsO1xuICAgICAgICB0aGlzLmJhY2tncm91bmQgPSBudWxsO1xuXG4gICAgICAgIHRoaXMuY3JlYXRlTGlzdGVuZXJzKCk7XG4gICAgICAgIHRoaXMudXBkYXRpbmcgPSAwO1xuICAgICAgICB0aGlzLmdlbmVyYXRpb24gPSBTY2VuZS5nZW5lcmF0aW9uOyAvLyBhbiBpZCB0aGF0IGlzIGluY3JlbWVudGVkIGVhY2ggdGltZSB0aGUgc2NlbmUgY29uZmlnIGlzIGludmFsaWRhdGVkXG4gICAgICAgIHRoaXMubGFzdF9jb21wbGV0ZV9nZW5lcmF0aW9uID0gU2NlbmUuZ2VuZXJhdGlvbjsgLy8gbGFzdCBnZW5lcmF0aW9uIGlkIHdpdGggYSBjb21wbGV0ZSB2aWV3XG4gICAgICAgIHRoaXMuc2V0dXBEZWJ1ZygpO1xuXG4gICAgICAgIHRoaXMubG9nX2xldmVsID0gb3B0aW9ucy5sb2dMZXZlbCB8fCAnd2Fybic7XG4gICAgICAgIGxvZy5zZXRMZXZlbCh0aGlzLmxvZ19sZXZlbCk7XG4gICAgfVxuXG4gICAgc3RhdGljIGNyZWF0ZSAoY29uZmlnLCBvcHRpb25zID0ge30pIHtcbiAgICAgICAgcmV0dXJuIG5ldyBTY2VuZShjb25maWcsIG9wdGlvbnMpO1xuICAgIH1cblxuICAgIC8vIExvYWQgc2NlbmUgKG9yIHJlbG9hZCBleGlzdGluZyBzY2VuZSBpZiBubyBuZXcgc291cmNlIHNwZWNpZmllZClcbiAgICAvLyBPcHRpb25zOlxuICAgIC8vICAgYGNvbmZpZ19wYXRoYDogYmFzZSBVUkwgYWdhaW5zdCB3aGljaCByb28gc2NlbmUgcmVzb3VyY2VzIHNob3VsZCBiZSByZXNvbHZlZCAodXNlZnVsIGZvciBQbGF5KSAoZGVmYXVsdCBudWxsbClcbiAgICAvLyAgIGBibG9ja2luZ2A6IHNob3VsZCByZW5kZXJpbmcgYmxvY2sgb24gc2NlbmUgbG9hZCBjb21wbGV0aW9uIChkZWZhdWx0IHRydWUpXG4gICAgbG9hZChjb25maWdfc291cmNlID0gbnVsbCwgb3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIGlmICh0aGlzLmluaXRpYWxpemluZykge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaW5pdGlhbGl6aW5nO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy51cGRhdGluZysrO1xuICAgICAgICB0aGlzLmluaXRpYWxpemVkID0gZmFsc2U7XG5cbiAgICAgICAgLy8gQmFja3dhcmRzIGNvbXBhdGliaWx0eSBmb3IgcGFzc2luZyBgY29uZmlnX3BhdGhgIHN0cmluZyBhcyBzZWNvbmQgYXJndW1lbnRcbiAgICAgICAgLy8gKHNpbmNlIHRyYW5zaXRpb25lZCB0byB1c2luZyBvcHRpb25zIGFyZ3VtZW50IHRvIGFjY2VwdCBtb3JlIHBhcmFtZXRlcnMpXG4gICAgICAgIG9wdGlvbnMgPSAodHlwZW9mIG9wdGlvbnMgPT09ICdzdHJpbmcnKSA/IHsgY29uZmlnX3BhdGg6IG9wdGlvbnMgfSA6IG9wdGlvbnM7XG4gICAgICAgIGxldCBjb25maWdfcGF0aCA9IG9wdGlvbnMuY29uZmlnX3BhdGg7XG5cbiAgICAgICAgLy8gU2hvdWxkIHJlbmRlcmluZyBibG9jayBvbiBsb2FkIChub3QgZGVzaXJhYmxlIGZvciBpbml0aWFsIGxvYWQsIG9mdGVuIGRlc2lyZWQgZm9yIGxpdmUgc3R5bGUtc3dpdGNoaW5nKVxuICAgICAgICBvcHRpb25zLmJsb2NraW5nID0gKG9wdGlvbnMuYmxvY2tpbmcgIT09IHVuZGVmaW5lZCkgPyBvcHRpb25zLmJsb2NraW5nIDogdHJ1ZTtcblxuICAgICAgICAvLyBMb2FkIHNjZW5lIGRlZmluaXRpb24gKHNvdXJjZXMsIHN0eWxlcywgZXRjLiksIHRoZW4gY3JlYXRlIHN0eWxlcyAmIHdvcmtlcnNcbiAgICAgICAgdGhpcy5jcmVhdGVDYW52YXMoKTtcbiAgICAgICAgdGhpcy5pbml0aWFsaXppbmcgPSB0aGlzLmxvYWRTY2VuZShjb25maWdfc291cmNlLCBjb25maWdfcGF0aClcbiAgICAgICAgICAgIC50aGVuKCgpID0+IHRoaXMuY3JlYXRlV29ya2VycygpKVxuICAgICAgICAgICAgLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMucmVzZXRGZWF0dXJlU2VsZWN0aW9uKCk7XG5cbiAgICAgICAgICAgICAgICAvLyBTY2VuZSBsb2FkZWQgZnJvbSBhIEpTIG9iamVjdCwgb3IgbW9kaWZpZWQgYnkgYSBgbG9hZGAgZXZlbnQsIG1heSBjb250YWluIGNvbXBpbGVkIEpTIGZ1bmN0aW9uc1xuICAgICAgICAgICAgICAgIC8vIHdoaWNoIG5lZWQgdG8gYmUgc2VyaWFsaXplZCwgd2hpbGUgb25lIGxvYWRlZCBvbmx5IGZyb20gYSBVUkwgZG9lcyBub3QuXG4gICAgICAgICAgICAgICAgY29uc3Qgc2VyaWFsaXplX2Z1bmNzID0gKCh0eXBlb2YgdGhpcy5jb25maWdfc291cmNlID09PSAnb2JqZWN0JykgfHwgdGhpcy5oYXNTdWJzY3JpYmVyc0ZvcignbG9hZCcpKTtcblxuICAgICAgICAgICAgICAgIGNvbnN0IHVwZGF0aW5nID0gdGhpcy51cGRhdGVDb25maWcoeyBzZXJpYWxpemVfZnVuY3MsIGZhZGVfaW46IHRydWUgfSk7XG4gICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMuYmxvY2tpbmcgPT09IHRydWUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHVwZGF0aW5nO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMudXBkYXRpbmctLTtcbiAgICAgICAgICAgICAgICB0aGlzLmluaXRpYWxpemluZyA9IG51bGw7XG4gICAgICAgICAgICAgICAgdGhpcy5pbml0aWFsaXplZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgdGhpcy5sYXN0X3ZhbGlkX2NvbmZpZ19zb3VyY2UgPSB0aGlzLmNvbmZpZ19zb3VyY2U7XG4gICAgICAgICAgICAgICAgdGhpcy5sYXN0X3ZhbGlkX2NvbmZpZ19wYXRoID0gdGhpcy5jb25maWdfcGF0aDtcblxuICAgICAgICAgICAgICAgIGlmICh0aGlzLnJlbmRlcl9sb29wICE9PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNldHVwUmVuZGVyTG9vcCgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aGlzLnJlcXVlc3RSZWRyYXcoKTtcbiAgICAgICAgfSkuY2F0Y2goZXJyb3IgPT4ge1xuICAgICAgICAgICAgdGhpcy5pbml0aWFsaXppbmcgPSBudWxsO1xuICAgICAgICAgICAgdGhpcy51cGRhdGluZyA9IDA7XG5cbiAgICAgICAgICAgIC8vIFJlcG9ydCBhbmQgcmV2ZXJ0IHRvIGxhc3QgdmFsaWQgY29uZmlnIGlmIGF2YWlsYWJsZVxuICAgICAgICAgICAgbGV0IHR5cGUsIG1lc3NhZ2U7XG4gICAgICAgICAgICBpZiAoZXJyb3IubmFtZSA9PT0gJ1lBTUxFeGNlcHRpb24nKSB7XG4gICAgICAgICAgICAgICAgdHlwZSA9ICd5YW1sJztcbiAgICAgICAgICAgICAgICBtZXNzYWdlID0gJ0Vycm9yIHBhcnNpbmcgc2NlbmUgWUFNTCc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBUT0RPOiBtb3JlIGVycm9yIHR5cGVzXG4gICAgICAgICAgICAgICAgbWVzc2FnZSA9ICdFcnJvciBpbml0aWFsaXppbmcgc2NlbmUnO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy50cmlnZ2VyKCdlcnJvcicsIHsgdHlwZSwgbWVzc2FnZSwgZXJyb3IsIHVybDogdGhpcy5jb25maWdfc291cmNlIH0pO1xuXG4gICAgICAgICAgICBtZXNzYWdlID0gYFNjZW5lLmxvYWQoKSBmYWlsZWQgdG8gbG9hZCAke3RoaXMuY29uZmlnX3NvdXJjZX06ICR7ZXJyb3IubWVzc2FnZX1gO1xuICAgICAgICAgICAgaWYgKHRoaXMubGFzdF92YWxpZF9jb25maWdfc291cmNlKSB7XG4gICAgICAgICAgICAgICAgbG9nKCd3YXJuJywgbWVzc2FnZSwgZXJyb3IpO1xuICAgICAgICAgICAgICAgIGxvZygnaW5mbycsIGBTY2VuZS5sb2FkKCkgcmV2ZXJ0aW5nIHRvIGxhc3QgdmFsaWQgY29uZmlndXJhdGlvbmApO1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmxvYWQodGhpcy5sYXN0X3ZhbGlkX2NvbmZpZ19zb3VyY2UsIHRoaXMubGFzdF92YWxpZF9jb25maWdfcGF0aCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsb2coJ2Vycm9yJywgbWVzc2FnZSwgZXJyb3IpO1xuICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiB0aGlzLmluaXRpYWxpemluZztcbiAgICB9XG5cbiAgICAvLyBGb3IgQVBJIGNvbXBhdGliaWxpdHlcbiAgICByZWxvYWQoY29uZmlnX3NvdXJjZSA9IG51bGwsIGNvbmZpZ19wYXRoID0gbnVsbCkge1xuICAgICAgICByZXR1cm4gdGhpcy5sb2FkKGNvbmZpZ19zb3VyY2UsIGNvbmZpZ19wYXRoKTtcbiAgICB9XG5cbiAgICBkZXN0cm95KCkge1xuICAgICAgICB0aGlzLmluaXRpYWxpemVkID0gZmFsc2U7XG4gICAgICAgIHRoaXMucmVuZGVyX2xvb3Bfc3RvcCA9IHRydWU7IC8vIHNjaGVkdWxlIHJlbmRlciBsb29wIHRvIHN0b3BcblxuICAgICAgICB0aGlzLmRlc3Ryb3lMaXN0ZW5lcnMoKTtcblxuICAgICAgICBpZiAodGhpcy5jYW52YXMgJiYgdGhpcy5jYW52YXMucGFyZW50Tm9kZSkge1xuICAgICAgICAgICAgdGhpcy5jYW52YXMucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLmNhbnZhcyk7XG4gICAgICAgICAgICB0aGlzLmNhbnZhcyA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5jb250YWluZXIgPSBudWxsO1xuXG4gICAgICAgIGlmICh0aGlzLnNlbGVjdGlvbikge1xuICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb24uZGVzdHJveSgpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuZ2wpIHtcbiAgICAgICAgICAgIFRleHR1cmUuZGVzdHJveSh0aGlzLmdsKTtcbiAgICAgICAgICAgIHRoaXMuc3R5bGVfbWFuYWdlci5kZXN0cm95KHRoaXMuZ2wpO1xuICAgICAgICAgICAgdGhpcy5zdHlsZXMgPSB7fTtcblxuICAgICAgICAgICAgU2hhZGVyUHJvZ3JhbS5yZXNldCgpO1xuXG4gICAgICAgICAgICAvLyBGb3JjZSBjb250ZXh0IGxvc3NcbiAgICAgICAgICAgIGxldCBleHQgPSB0aGlzLmdsLmdldEV4dGVuc2lvbignV0VCR0xfbG9zZV9jb250ZXh0Jyk7XG4gICAgICAgICAgICBpZiAoZXh0KSB7XG4gICAgICAgICAgICAgICAgZXh0Lmxvc2VDb250ZXh0KCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMuZ2wgPSBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5zb3VyY2VzID0ge307XG5cbiAgICAgICAgdGhpcy5kZXN0cm95V29ya2VycygpO1xuICAgICAgICB0aGlzLnRpbGVfbWFuYWdlci5kZXN0cm95KCk7XG4gICAgICAgIHRoaXMudGlsZV9tYW5hZ2VyID0gbnVsbDtcbiAgICB9XG5cbiAgICBjcmVhdGVDYW52YXMoKSB7XG4gICAgICAgIGlmICh0aGlzLmNhbnZhcykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5jb250YWluZXIgPSB0aGlzLmNvbnRhaW5lciB8fCBkb2N1bWVudC5ib2R5O1xuICAgICAgICB0aGlzLmNhbnZhcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2NhbnZhcycpO1xuICAgICAgICB0aGlzLmNhbnZhcy5zdHlsZS5wb3NpdGlvbiA9ICdhYnNvbHV0ZSc7XG4gICAgICAgIHRoaXMuY2FudmFzLnN0eWxlLnRvcCA9IDA7XG4gICAgICAgIHRoaXMuY2FudmFzLnN0eWxlLmxlZnQgPSAwO1xuXG4gICAgICAgIC8vIEZvcmNlIHRhbmdyYW0gY2FudmFzIHVuZGVybmVhdGggYWxsIGxlYWZsZXQgbGF5ZXJzLCBhbmQgc2V0IGJhY2tncm91bmQgdG8gdHJhbnNwYXJlbnRcbiAgICAgICAgdGhpcy5jb250YWluZXIuc3R5bGUuYmFja2dyb3VuZENvbG9yID0gJ3RyYW5zcGFyZW50JztcbiAgICAgICAgdGhpcy5jb250YWluZXIuYXBwZW5kQ2hpbGQodGhpcy5jYW52YXMpO1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICB0aGlzLmdsID0gQ29udGV4dC5nZXRDb250ZXh0KHRoaXMuY2FudmFzLCB7XG4gICAgICAgICAgICAgICAgYWxwaGE6IHRydWUsIHByZW11bHRpcGxpZWRBbHBoYTogdHJ1ZSwgLy8gVE9ETzogdmFyeSB3L3NjZW5lIGFscGhhXG4gICAgICAgICAgICAgICAgZGV2aWNlX3BpeGVsX3JhdGlvOiBVdGlscy5kZXZpY2VfcGl4ZWxfcmF0aW9cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoKGUpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgICAgICBcIkNvdWxkbid0IGNyZWF0ZSBXZWJHTCBjb250ZXh0LiBcIiArXG4gICAgICAgICAgICAgICAgXCJZb3VyIGJyb3dzZXIgbWF5IG5vdCBzdXBwb3J0IFdlYkdMLCBvciBpdCdzIHR1cm5lZCBvZmY/IFwiICtcbiAgICAgICAgICAgICAgICBcIlZpc2l0IGh0dHA6Ly93ZWJnbHJlcG9ydC5jb20vIGZvciBtb3JlIGluZm8uXCJcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnJlc2l6ZU1hcCh0aGlzLmNvbnRhaW5lci5jbGllbnRXaWR0aCwgdGhpcy5jb250YWluZXIuY2xpZW50SGVpZ2h0KTtcbiAgICAgICAgVmVydGV4QXJyYXlPYmplY3QuaW5pdCh0aGlzLmdsKTtcbiAgICAgICAgdGhpcy5yZW5kZXJfc3RhdGVzID0gbmV3IFJlbmRlclN0YXRlTWFuYWdlcih0aGlzLmdsKTtcbiAgICAgICAgdGhpcy5tZWRpYV9jYXB0dXJlLnNldENhbnZhcyh0aGlzLmNhbnZhcyk7XG4gICAgfVxuXG4gICAgLy8gR2V0IHRoZSBVUkwgdG8gbG9hZCB0aGUgd2ViIHdvcmtlciBmcm9tXG4gICAgZ2V0V29ya2VyVXJsKCkge1xuICAgICAgICBsZXQgd29ya2VyX3VybCA9IHRoaXMud29ya2VyX3VybCB8fCBVUkxzLmZpbmRDdXJyZW50VVJMKCd0YW5ncmFtLmRlYnVnLmpzJywgJ3RhbmdyYW0ubWluLmpzJyk7XG5cbiAgICAgICAgaWYgKCF3b3JrZXJfdXJsKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDYW4ndCBsb2FkIHdvcmtlciBiZWNhdXNlIGNvdWxkbid0IGZpbmQgYmFzZSBVUkwgdGhhdCBsaWJyYXJ5IHdhcyBsb2FkZWQgZnJvbVwiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEltcG9ydCBjdXN0b20gZGF0YSBzb3VyY2Ugc2NyaXB0cyBhbG9uZ3NpZGUgY29yZSBsaWJyYXJ5XG4gICAgICAgIC8vIE5PVEU6IHdvcmthcm91bmQgZm9yIGlzc3VlIHdoZXJlIGxhcmdlIGxpYnJhcmllcyBpbnRlcm1pdHRlbnRseSBmYWlsIHRvIGxvYWQgaW4gd2ViIHdvcmtlcnMsXG4gICAgICAgIC8vIHdoZW4gbXVsdGlwbGUgaW1wb3J0U2NyaXB0cygpIGNhbGxzIGFyZSB1c2VkLiBMb2FkaW5nIGFsbCBzY3JpcHRzIChpbmNsdWRpbmcgVGFuZ3JhbSBpdHNlbGYpXG4gICAgICAgIC8vIGluIG9uZSBjYWxsIGF0IGF0IHdvcmtlciBjcmVhdGlvbiB0aW1lIGhhcyBub3QgZXhoaWJpdGVkIHRoZSBzYW1lIGlzc3VlLlxuICAgICAgICBsZXQgdXJscyA9IFsuLi50aGlzLmRhdGFfc291cmNlX3NjcmlwdHNdO1xuICAgICAgICB1cmxzLnB1c2god29ya2VyX3VybCk7IC8vIGxvYWQgVGFuZ3JhbSAqbGFzdCogKGhhcyBiZWVuIG1vcmUgcmVsaWFibGUsIHRob3VnaCByZWFzb24gdW5rbm93bilcbiAgICAgICAgbGV0IGJvZHkgPSBgaW1wb3J0U2NyaXB0cygke3VybHMubWFwKHVybCA9PiBgJyR7dXJsfSdgKS5qb2luKCcsJyl9KTtgO1xuICAgICAgICByZXR1cm4gVVJMcy5jcmVhdGVPYmplY3RVUkwobmV3IEJsb2IoW2JvZHldLCB7IHR5cGU6ICdhcHBsaWNhdGlvbi9qYXZhc2NyaXB0JyB9KSk7XG4gICAgfVxuXG4gICAgLy8gVXBkYXRlIGxpc3Qgb2YgYW55IGN1c3RvbSBkYXRhIHNvdXJjZSBzY3JpcHRzIChpZiBhbnkpXG4gICAgdXBkYXRlRGF0YVNvdXJjZVNjcmlwdHMgKCkge1xuICAgICAgICBsZXQgcHJldl9zY3JpcHRzID0gWy4uLih0aGlzLmRhdGFfc291cmNlX3NjcmlwdHN8fFtdKV07IC8vIHNhdmUgbGlzdCBvZiBwcmV2aW91c2x5IGxvYWRlZCBzY3JpcHRzXG4gICAgICAgIGxldCBzY3JpcHRzID0gT2JqZWN0LmtleXModGhpcy5jb25maWcuc291cmNlcykubWFwKHMgPT4gdGhpcy5jb25maWcuc291cmNlc1tzXS5zY3JpcHRzKS5maWx0ZXIoeCA9PiB4KTtcbiAgICAgICAgaWYgKHNjcmlwdHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgbG9nKCdkZWJ1ZycsICdsb2FkaW5nIGN1c3RvbSBkYXRhIHNvdXJjZSBzY3JpcHRzIGluIHdvcmtlcjonLCBzY3JpcHRzKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmRhdGFfc291cmNlX3NjcmlwdHMgPSBbXS5jb25jYXQoLi4uc2NyaXB0cykuc29ydCgpO1xuXG4gICAgICAgIC8vIFNjcmlwdHMgY2hhbmdlZD9cbiAgICAgICAgcmV0dXJuICEodGhpcy5kYXRhX3NvdXJjZV9zY3JpcHRzLmxlbmd0aCA9PT0gcHJldl9zY3JpcHRzLmxlbmd0aCAmJlxuICAgICAgICAgICAgdGhpcy5kYXRhX3NvdXJjZV9zY3JpcHRzLmV2ZXJ5KCh2LCBpKSA9PiB2ID09PSBwcmV2X3NjcmlwdHNbaV0pKTtcbiAgICB9XG5cbiAgICAvLyBXZWIgd29ya2VycyBoYW5kbGUgaGVhdnkgZHV0eSB0aWxlIGNvbnN0cnVjdGlvbjogbmV0d29ya2luZywgZ2VvbWV0cnkgcHJvY2Vzc2luZywgZXRjLlxuICAgIGNyZWF0ZVdvcmtlcnMoKSB7XG4gICAgICAgIC8vIFJlc2V0IG9sZCB3b3JrZXJzIChpZiBhbnkpIGlmIHdlIG5lZWQgdG8gcmUtaW5zdGFudGlhdGUgd2l0aCBuZXcgZXh0ZXJuYWwgc2NyaXB0c1xuICAgICAgICBpZiAodGhpcy51cGRhdGVEYXRhU291cmNlU2NyaXB0cygpKSB7XG4gICAgICAgICAgICB0aGlzLmRlc3Ryb3lXb3JrZXJzKCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXRoaXMud29ya2Vycykge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMubWFrZVdvcmtlcnModGhpcy5nZXRXb3JrZXJVcmwoKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuICAgIH1cblxuICAgIC8vIEluc3RhbnRpYXRlIHdvcmtlcnMgZnJvbSBVUkwsIGluaXQgZXZlbnQgaGFuZGxlcnNcbiAgICBtYWtlV29ya2Vycyh1cmwpIHtcbiAgICAgICAgdmFyIHF1ZXVlID0gW107XG5cbiAgICAgICAgdGhpcy53b3JrZXJzID0gW107XG4gICAgICAgIGZvciAodmFyIGlkPTA7IGlkIDwgdGhpcy5udW1fd29ya2VyczsgaWQrKykge1xuICAgICAgICAgICAgdmFyIHdvcmtlciA9IG5ldyBXb3JrZXIodXJsKTtcbiAgICAgICAgICAgIHRoaXMud29ya2Vyc1tpZF0gPSB3b3JrZXI7XG5cbiAgICAgICAgICAgIFdvcmtlckJyb2tlci5hZGRXb3JrZXIod29ya2VyKTtcblxuICAgICAgICAgICAgbG9nKCdkZWJ1ZycsIGBTY2VuZS5tYWtlV29ya2VyczogaW5pdGlhbGl6aW5nIHdvcmtlciAke2lkfWApO1xuICAgICAgICAgICAgbGV0IF9pZCA9IGlkO1xuICAgICAgICAgICAgcXVldWUucHVzaChXb3JrZXJCcm9rZXIucG9zdE1lc3NhZ2Uod29ya2VyLCAnc2VsZi5pbml0JywgdGhpcy5pZCwgaWQsIHRoaXMubnVtX3dvcmtlcnMsIHRoaXMubG9nX2xldmVsLCBVdGlscy5kZXZpY2VfcGl4ZWxfcmF0aW8pLnRoZW4oXG4gICAgICAgICAgICAgICAgKGlkKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGxvZygnZGVidWcnLCBgU2NlbmUubWFrZVdvcmtlcnM6IGluaXRpYWxpemVkIHdvcmtlciAke2lkfWApO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gaWQ7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAoZXJyb3IpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgbG9nKCdlcnJvcicsIGBTY2VuZS5tYWtlV29ya2VyczogZmFpbGVkIHRvIGluaXRpYWxpemUgd29ya2VyICR7X2lkfTpgLCBlcnJvcik7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChlcnJvcik7XG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLm5leHRfd29ya2VyID0gMDtcbiAgICAgICAgcmV0dXJuIFByb21pc2UuYWxsKHF1ZXVlKS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgIGxvZy5zZXRXb3JrZXJzKHRoaXMud29ya2Vycyk7XG5cbiAgICAgICAgICAgIC8vIExldCBWZXJ0ZXhFbGVtZW50cyBrbm93IGlmIDMyIGJpdCBpbmRpY2VzIGZvciBlbGVtZW50IGFycmF5cyBhcmUgYXZhaWxhYmxlXG4gICAgICAgICAgICBsZXQgVWludDMyX2ZsYWcgPSB0aGlzLmdsLmdldEV4dGVuc2lvbihcIk9FU19lbGVtZW50X2luZGV4X3VpbnRcIikgPyB0cnVlIDogZmFsc2U7XG4gICAgICAgICAgICBXb3JrZXJCcm9rZXIucG9zdE1lc3NhZ2UodGhpcy53b3JrZXJzLCAnVmVydGV4RWxlbWVudHMuc2V0VWludDMyRmxhZycsIFVpbnQzMl9mbGFnKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgZGVzdHJveVdvcmtlcnMoKSB7XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KHRoaXMud29ya2VycykpIHtcbiAgICAgICAgICAgIGxvZy5zZXRXb3JrZXJzKG51bGwpO1xuICAgICAgICAgICAgdGhpcy53b3JrZXJzLmZvckVhY2goKHdvcmtlcikgPT4ge1xuICAgICAgICAgICAgICAgIHdvcmtlci50ZXJtaW5hdGUoKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhpcy53b3JrZXJzID0gbnVsbDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIEFzc2lnbiB0aWxlIHRvIHdvcmtlciB0aHJlYWQgYmFzZWQgb24gZGF0YSBzb3VyY2VcbiAgICBnZXRXb3JrZXJGb3JEYXRhU291cmNlKHNvdXJjZSkge1xuICAgICAgICBsZXQgd29ya2VyO1xuXG4gICAgICAgIGlmIChzb3VyY2UudGlsZWQpIHtcbiAgICAgICAgICAgIC8vIFJvdW5kIHJvYmluIHRpbGVkIHNvdXJjZXMgYWNyb3NzIGFsbCB3b3JrZXJzXG4gICAgICAgICAgICB3b3JrZXIgPSB0aGlzLndvcmtlcnNbdGhpcy5uZXh0X3dvcmtlcl07XG4gICAgICAgICAgICB0aGlzLm5leHRfd29ya2VyID0gKHRoaXMubmV4dF93b3JrZXIgKyAxKSAlIHRoaXMud29ya2Vycy5sZW5ndGg7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAvLyBQaW4gYWxsIHRpbGVzIGZyb20gZWFjaCBub24tdGlsZWQgc291cmNlIHRvIGEgc2luZ2xlIHdvcmtlclxuICAgICAgICAgICAgLy8gUHJldmVudHMgZGF0YSBmb3IgdGhlc2Ugc291cmNlcyBmcm9tIGJlaW5nIGxvYWRlZCBtb3JlIHRoYW4gb25jZVxuICAgICAgICAgICAgd29ya2VyID0gdGhpcy53b3JrZXJzW3NvdXJjZS5pZCAlIHRoaXMud29ya2Vycy5sZW5ndGhdO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHdvcmtlcjtcbiAgICB9XG5cbiAgICAvLyBTY2VuZSBpcyByZWFkeSBmb3IgcmVuZGVyaW5nXG4gICAgcmVhZHkoKSB7XG4gICAgICAgIGlmICghdGhpcy52aWV3LnJlYWR5KCkgfHwgT2JqZWN0LmtleXModGhpcy5zb3VyY2VzKS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgLy8gUmVzaXplIHRoZSBtYXAgd2hlbiBkZXZpY2UgcGl4ZWwgcmF0aW8gY2hhbmdlcywgZS5nLiB3aGVuIHN3aXRjaGluZyBiZXR3ZWVuIGRpc3BsYXlzXG4gICAgdXBkYXRlRGV2aWNlUGl4ZWxSYXRpbyAoKSB7XG4gICAgICAgIGlmIChVdGlscy51cGRhdGVEZXZpY2VQaXhlbFJhdGlvKCkpIHtcbiAgICAgICAgICAgIFdvcmtlckJyb2tlci5wb3N0TWVzc2FnZSh0aGlzLndvcmtlcnMsICdzZWxmLnVwZGF0ZURldmljZVBpeGVsUmF0aW8nLCBVdGlscy5kZXZpY2VfcGl4ZWxfcmF0aW8pXG4gICAgICAgICAgICAgICAgLnRoZW4oKCkgPT4gdGhpcy5yZWJ1aWxkKCkpXG4gICAgICAgICAgICAgICAgLnRoZW4oKCkgPT4gdGhpcy5yZXNpemVNYXAodGhpcy52aWV3LnNpemUuY3NzLndpZHRoLCB0aGlzLnZpZXcuc2l6ZS5jc3MuaGVpZ2h0KSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXNpemVNYXAod2lkdGgsIGhlaWdodCkge1xuICAgICAgICBpZiAod2lkdGggPT09IDAgJiYgaGVpZ2h0ID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmRpcnR5ID0gdHJ1ZTtcbiAgICAgICAgdGhpcy52aWV3LnNldFZpZXdwb3J0U2l6ZSh3aWR0aCwgaGVpZ2h0KTtcbiAgICAgICAgaWYgKHRoaXMuZ2wpIHtcbiAgICAgICAgICAgIENvbnRleHQucmVzaXplKHRoaXMuZ2wsIHdpZHRoLCBoZWlnaHQsIFV0aWxzLmRldmljZV9waXhlbF9yYXRpbyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBSZXF1ZXN0IHNjZW5lIGJlIHJlZHJhd24gYXQgbmV4dCBhbmltYXRpb24gbG9vcFxuICAgIHJlcXVlc3RSZWRyYXcoKSB7XG4gICAgICAgIHRoaXMuZGlydHkgPSB0cnVlO1xuICAgIH1cblxuICAgIC8vIFJlZHJhdyBzY2VuZSBpbW1lZGlhdGVseSAtIGRvbid0IHdhaXQgZm9yIGFuaW1hdGlvbiBsb29wXG4gICAgLy8gVXNlIHNwYXJpbmdseSwgYnV0IGZvciBjYXNlcyB3aGVyZSB5b3UgbmVlZCB0aGUgY2xvc2VzdCBwb3NzaWJsZSBzeW5jIHdpdGggb3RoZXIgVUkgZWxlbWVudHMsXG4gICAgLy8gc3VjaCBhcyBvdGhlciwgbm9uLVdlYkdMIG1hcCBsYXllcnMgKGUuZy4gTGVhZmxldCByYXN0ZXIgbGF5ZXJzLCBtYXJrZXJzLCBldGMuKVxuICAgIGltbWVkaWF0ZVJlZHJhdygpIHtcbiAgICAgICAgdGhpcy5kaXJ0eSA9IHRydWU7XG4gICAgICAgIHRoaXMudXBkYXRlKCk7XG4gICAgfVxuXG4gICAgcmVuZGVyTG9vcCAoKSB7XG4gICAgICAgIHRoaXMucmVuZGVyX2xvb3BfYWN0aXZlID0gdHJ1ZTsgLy8gb25seSBsZXQgdGhlIHJlbmRlciBsb29wIGluc3RhbnRpYXRlIG9uY2VcblxuICAgICAgICBpZiAodGhpcy5pbml0aWFsaXplZCkge1xuICAgICAgICAgICAgLy8gUmVuZGVyIHRoZSBzY2VuZVxuICAgICAgICAgICAgdGhpcy51cGRhdGUoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFJlcXVlc3QgdGhlIG5leHQgZnJhbWUgaWYgbm90IHNjaGVkdWxlZCB0byBzdG9wXG4gICAgICAgIGlmICghdGhpcy5yZW5kZXJfbG9vcF9zdG9wKSB7XG4gICAgICAgICAgICB3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lKHRoaXMucmVuZGVyTG9vcC5iaW5kKHRoaXMpKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMucmVuZGVyX2xvb3Bfc3RvcCA9IGZhbHNlO1xuICAgICAgICAgICAgdGhpcy5yZW5kZXJfbG9vcF9hY3RpdmUgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIFNldHVwIHRoZSByZW5kZXIgbG9vcFxuICAgIHNldHVwUmVuZGVyTG9vcCgpIHtcbiAgICAgICAgaWYgKCF0aGlzLnJlbmRlcl9sb29wX2FjdGl2ZSkge1xuICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7IHRoaXMucmVuZGVyTG9vcCgpOyB9LCAwKTsgLy8gZGVsYXkgc3RhcnQgYnkgb25lIHRpY2tcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHVwZGF0ZSgpIHtcbiAgICAgICAgLy8gUmVuZGVyIG9uIGRlbWFuZFxuICAgICAgICB2YXIgd2lsbF9yZW5kZXIgPSAhKFxuICAgICAgICAgICAgdGhpcy5kaXJ0eSA9PT0gZmFsc2UgfHxcbiAgICAgICAgICAgIHRoaXMuaW5pdGlhbGl6ZWQgPT09IGZhbHNlIHx8XG4gICAgICAgICAgICB0aGlzLnVwZGF0aW5nID4gMCB8fFxuICAgICAgICAgICAgdGhpcy5yZWFkeSgpID09PSBmYWxzZVxuICAgICAgICApO1xuXG4gICAgICAgIC8vIFByZS1yZW5kZXIgbG9vcCBob29rXG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5wcmVVcGRhdGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHRoaXMucHJlVXBkYXRlKHdpbGxfcmVuZGVyKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEJhaWwgaWYgbm8gbmVlZCB0byByZW5kZXJcbiAgICAgICAgaWYgKCF3aWxsX3JlbmRlcikge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZGlydHkgPSBmYWxzZTsgLy8gc3ViY2xhc3NlcyBjYW4gc2V0IHRoaXMgYmFjayB0byB0cnVlIHdoZW4gYW5pbWF0aW9uIGlzIG5lZWRlZFxuXG4gICAgICAgIC8vIFJlbmRlciB0aGUgc2NlbmVcbiAgICAgICAgdGhpcy51cGRhdGVEZXZpY2VQaXhlbFJhdGlvKCk7XG4gICAgICAgIHRoaXMucmVuZGVyKCk7XG4gICAgICAgIHRoaXMudXBkYXRlVmlld0NvbXBsZXRlKCk7IC8vIGZpcmVzIGV2ZW50IHdoZW4gcmVuZGVyZWQgdGlsZSBzZXQgb3Igc3R5bGUgY2hhbmdlc1xuICAgICAgICB0aGlzLm1lZGlhX2NhcHR1cmUuY29tcGxldGVTY3JlZW5zaG90KCk7IC8vIGNvbXBsZXRlcyBzY3JlZW5zaG90IGNhcHR1cmUgaWYgcmVxdWVzdGVkXG5cbiAgICAgICAgLy8gUG9zdC1yZW5kZXIgbG9vcCBob29rXG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5wb3N0VXBkYXRlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICB0aGlzLnBvc3RVcGRhdGUod2lsbF9yZW5kZXIpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gUmVkcmF3IGV2ZXJ5IGZyYW1lIGlmIGFuaW1hdGluZ1xuICAgICAgICBpZiAodGhpcy5hbmltYXRlZCA9PT0gdHJ1ZSB8fCB0aGlzLnZpZXcuaXNBbmltYXRpbmcoKSkge1xuICAgICAgICAgICAgdGhpcy5kaXJ0eSA9IHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmZyYW1lKys7XG4gICAgICAgIGxvZygndHJhY2UnLCAnU2NlbmUucmVuZGVyKCknKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgcmVuZGVyKCkge1xuICAgICAgICB2YXIgZ2wgPSB0aGlzLmdsO1xuXG4gICAgICAgIC8vIFVwZGF0ZSBzdHlsZXMsIGNhbWVyYSwgbGlnaHRzXG4gICAgICAgIHRoaXMudmlldy51cGRhdGUoKTtcbiAgICAgICAgT2JqZWN0LmtleXModGhpcy5saWdodHMpLmZvckVhY2goaSA9PiB0aGlzLmxpZ2h0c1tpXS51cGRhdGUoKSk7XG5cbiAgICAgICAgLy8gUmVuZGVyIG1haW4gcGFzc1xuICAgICAgICB0aGlzLnJlbmRlcl9jb3VudCA9IHRoaXMucmVuZGVyUGFzcygpO1xuXG4gICAgICAgIC8vIFJlbmRlciBzZWxlY3Rpb24gcGFzcyAoaWYgbmVlZGVkKVxuICAgICAgICBpZiAodGhpcy5zZWxlY3Rpb24ucGVuZGluZ1JlcXVlc3RzKCkpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnZpZXcucGFubmluZyB8fCB0aGlzLnZpZXcuem9vbWluZykge1xuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uLmNsZWFyUGVuZGluZ1JlcXVlc3RzKCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLnNlbGVjdGlvbi5iaW5kKCk7ICAgICAgICAgICAgICAgICAgLy8gc3dpdGNoIHRvIEZCT1xuICAgICAgICAgICAgdGhpcy5yZW5kZXJQYXNzKFxuICAgICAgICAgICAgICAgICdzZWxlY3Rpb25fcHJvZ3JhbScsICAgICAgICAgICAgICAgIC8vIHJlbmRlciB3L2FsdGVybmF0ZSBwcm9ncmFtXG4gICAgICAgICAgICAgICAgeyBhbGxvd19ibGVuZDogZmFsc2UgfSk7XG4gICAgICAgICAgICB0aGlzLnNlbGVjdGlvbi5yZWFkKCk7ICAgICAgICAgICAgICAgICAgLy8gcmVhZCByZXN1bHRzIGZyb20gc2VsZWN0aW9uIGJ1ZmZlclxuXG4gICAgICAgICAgICAvLyBSZXNldCB0byBzY3JlZW4gYnVmZmVyXG4gICAgICAgICAgICBnbC5iaW5kRnJhbWVidWZmZXIoZ2wuRlJBTUVCVUZGRVIsIG51bGwpO1xuICAgICAgICAgICAgZ2wudmlld3BvcnQoMCwgMCwgdGhpcy5jYW52YXMud2lkdGgsIHRoaXMuY2FudmFzLmhlaWdodCk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnJlbmRlcl9jb3VudF9jaGFuZ2VkID0gZmFsc2U7XG4gICAgICAgIGlmICh0aGlzLnJlbmRlcl9jb3VudCAhPT0gdGhpcy5sYXN0X3JlbmRlcl9jb3VudCkge1xuICAgICAgICAgICAgdGhpcy5yZW5kZXJfY291bnRfY2hhbmdlZCA9IHRydWU7XG5cbiAgICAgICAgICAgIHRoaXMuZ2V0RmVhdHVyZVNlbGVjdGlvbk1hcFNpemUoKS50aGVuKHNpemUgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChzaXplKSB7IC8vIHJldHVybnMgdW5kZWZpbmVkIGlmIHByZXZpb3VzIHJlcXVlc3QgcGVuZGluZ1xuICAgICAgICAgICAgICAgICAgICBsb2coJ2luZm8nLCBgU2NlbmU6IHJlbmRlcmVkICR7dGhpcy5yZW5kZXJfY291bnR9IHByaW1pdGl2ZXMgKCR7c2l6ZX0gZmVhdHVyZXMgaW4gc2VsZWN0aW9uIG1hcClgKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmxhc3RfcmVuZGVyX2NvdW50ID0gdGhpcy5yZW5kZXJfY291bnQ7XG5cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgLy8gUmVuZGVyIGFsbCBhY3RpdmUgc3R5bGVzLCBncm91cGVkIGJ5IGJsZW5kL2RlcHRoIHR5cGUgKG9wYXF1ZSwgb3ZlcmxheSwgZXRjLikgYW5kIGJ5IHByb2dyYW0gKHN0eWxlKVxuICAgIC8vIENhbGxlZCBib3RoIGZvciBtYWluIHJlbmRlciBwYXNzLCBhbmQgZm9yIHNlY29uZGFyeSBwYXNzZXMgbGlrZSBzZWxlY3Rpb24gYnVmZmVyXG4gICAgcmVuZGVyUGFzcyhwcm9ncmFtX2tleSA9ICdwcm9ncmFtJywgeyBhbGxvd19ibGVuZCB9ID0ge30pIHtcbiAgICAgICAgLy8gb3B0aW9uYWxseSBmb3JjZSBhbHBoYSBvZmYgKGUuZy4gZm9yIHNlbGVjdGlvbiBwYXNzKVxuICAgICAgICBhbGxvd19ibGVuZCA9IChhbGxvd19ibGVuZCA9PSBudWxsKSA/IHRydWUgOiBhbGxvd19ibGVuZDtcblxuICAgICAgICB0aGlzLmNsZWFyRnJhbWUoeyBjbGVhcl9jb2xvcjogdHJ1ZSwgY2xlYXJfZGVwdGg6IHRydWUgfSk7XG5cbiAgICAgICAgLy8gU29ydCBzdHlsZXMgYnkgYmxlbmQgb3JkZXJcbiAgICAgICAgbGV0IHN0eWxlcyA9IHRoaXMudGlsZV9tYW5hZ2VyLmdldEFjdGl2ZVN0eWxlcygpLlxuICAgICAgICAgICAgbWFwKHMgPT4gdGhpcy5zdHlsZXNbc10pLlxuICAgICAgICAgICAgZmlsdGVyKHMgPT4gcykuIC8vIGd1YXJkIGFnYWluc3QgbWlzc2luZyBzdHlsZXMsIHN1Y2ggYXMgd2hpbGUgbG9hZGluZyBhIG5ldyBzY2VuZVxuICAgICAgICAgICAgc29ydChTdHlsZS5ibGVuZE9yZGVyU29ydCk7XG5cbiAgICAgICAgLy8gUmVuZGVyIHN0eWxlc1xuICAgICAgICBsZXQgY291bnQgPSAwOyAvLyBob3cgbWFueSBwcmltaXRpdmVzIHdlcmUgcmVuZGVyZWRcbiAgICAgICAgbGV0IGxhc3RfYmxlbmQ7XG4gICAgICAgIGZvciAobGV0IHM9MDsgcyA8IHN0eWxlcy5sZW5ndGg7IHMrKykge1xuICAgICAgICAgICAgbGV0IHN0eWxlID0gc3R5bGVzW3NdO1xuXG4gICAgICAgICAgICAvLyBPbmx5IHVwZGF0ZSByZW5kZXIgc3RhdGUgd2hlbiBibGVuZCBtb2RlIGNoYW5nZXNcbiAgICAgICAgICAgIGlmIChzdHlsZS5ibGVuZCAhPT0gbGFzdF9ibGVuZCkge1xuICAgICAgICAgICAgICAgIGxldCBzdGF0ZSA9IE9iamVjdC5hc3NpZ24oe30sXG4gICAgICAgICAgICAgICAgICAgIFN0eWxlLnJlbmRlcl9zdGF0ZXNbc3R5bGUuYmxlbmRdLCAgICAgICAvLyByZW5kZXIgc3RhdGUgZm9yIGJsZW5kIG1vZGVcbiAgICAgICAgICAgICAgICAgICAgeyBibGVuZDogKGFsbG93X2JsZW5kICYmIHN0eWxlLmJsZW5kKSB9IC8vIGVuYWJsZS9kaXNhYmxlIGJsZW5kaW5nIChlLmcuIG5vIGJsZW5kIGZvciBzZWxlY3Rpb24pXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB0aGlzLnNldFJlbmRlclN0YXRlKHN0YXRlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvdW50ICs9IHRoaXMucmVuZGVyU3R5bGUoc3R5bGUubmFtZSwgcHJvZ3JhbV9rZXkpO1xuICAgICAgICAgICAgbGFzdF9ibGVuZCA9IHN0eWxlLmJsZW5kO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGNvdW50O1xuICAgIH1cblxuICAgIHJlbmRlclN0eWxlKHN0eWxlX25hbWUsIHByb2dyYW1fa2V5KSB7XG4gICAgICAgIGxldCBzdHlsZSA9IHRoaXMuc3R5bGVzW3N0eWxlX25hbWVdO1xuICAgICAgICBsZXQgZmlyc3RfZm9yX3N0eWxlID0gdHJ1ZTtcbiAgICAgICAgbGV0IHJlbmRlcl9jb3VudCA9IDA7XG4gICAgICAgIGxldCBwcm9ncmFtO1xuXG4gICAgICAgIC8vIFJlbmRlciB0aWxlIEdMIGdlb21ldHJpZXNcbiAgICAgICAgbGV0IHJlbmRlcmFibGVfdGlsZXMgPSB0aGlzLnRpbGVfbWFuYWdlci5nZXRSZW5kZXJhYmxlVGlsZXMoKTtcbiAgICAgICAgZm9yIChsZXQgdD0wOyB0IDwgcmVuZGVyYWJsZV90aWxlcy5sZW5ndGg7IHQrKykge1xuICAgICAgICAgICAgbGV0IHRpbGUgPSByZW5kZXJhYmxlX3RpbGVzW3RdO1xuXG4gICAgICAgICAgICBpZiAodGlsZS5tZXNoZXNbc3R5bGVfbmFtZV0gPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBTdHlsZS1zcGVjaWZpYyBzdGF0ZVxuICAgICAgICAgICAgLy8gT25seSBzZXR1cCBzdHlsZSBpZiByZW5kZXJpbmcgZm9yIGZpcnN0IHRpbWUgdGhpcyBmcmFtZVxuICAgICAgICAgICAgLy8gKGxhenkgaW5pdCwgbm90IGFsbCBzdHlsZXMgd2lsbCBiZSB1c2VkIGluIGFsbCBzY3JlZW4gdmlld3M7IHNvbWUgc3R5bGVzIG1pZ2h0IGJlIGRlZmluZWQgYnV0IG5ldmVyIHVzZWQpXG4gICAgICAgICAgICBpZiAoZmlyc3RfZm9yX3N0eWxlID09PSB0cnVlKSB7XG4gICAgICAgICAgICAgICAgZmlyc3RfZm9yX3N0eWxlID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgcHJvZ3JhbSA9IHRoaXMuc2V0dXBTdHlsZShzdHlsZSwgcHJvZ3JhbV9rZXkpO1xuICAgICAgICAgICAgICAgIGlmICghcHJvZ3JhbSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIFNraXAgcHJveHkgdGlsZXMgaWYgbmV3IHRpbGVzIGhhdmUgZmluaXNoZWQgbG9hZGluZyB0aGlzIHN0eWxlXG4gICAgICAgICAgICBpZiAoIXRpbGUuc2hvdWxkUHJveHlGb3JTdHlsZShzdHlsZV9uYW1lKSkge1xuICAgICAgICAgICAgICAgIC8vIGxvZygndHJhY2UnLCBgU2NlbmUucmVuZGVyU3R5bGUoKTogU2tpcCBwcm94eSB0aWxlIGZvciBzdHlsZSAnJHtzdHlsZV9uYW1lfScgYCwgdGlsZSwgdGlsZS5wcm94eV9mb3IpO1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBUaWxlLXNwZWNpZmljIHN0YXRlXG4gICAgICAgICAgICB0aGlzLnZpZXcuc2V0dXBUaWxlKHRpbGUsIHByb2dyYW0pO1xuXG4gICAgICAgICAgICAvLyBSZW5kZXIgdGlsZVxuICAgICAgICAgICAgbGV0IG1lc2ggPSB0aWxlLm1lc2hlc1tzdHlsZV9uYW1lXTtcbiAgICAgICAgICAgIGlmIChzdHlsZS5yZW5kZXIobWVzaCkpIHtcbiAgICAgICAgICAgICAgICAvLyBEb24ndCBpbmN1ciBhZGRpdGlvbmFsIHJlbmRlcnMgd2hpbGUgdmlld3BvcnQgaXMgbW92aW5nXG4gICAgICAgICAgICAgICAgaWYgKCEodGhpcy52aWV3LnBhbm5pbmcgfHwgdGhpcy52aWV3Lnpvb21pbmcpKSB7XG4gICAgICAgICAgICAgICAgICAgdGhpcy5yZXF1ZXN0UmVkcmF3KCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmVuZGVyX2NvdW50ICs9IG1lc2guZ2VvbWV0cnlfY291bnQ7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcmVuZGVyX2NvdW50O1xuICAgIH1cblxuICAgIHNldHVwU3R5bGUoc3R5bGUsIHByb2dyYW1fa2V5KSB7XG4gICAgICAgIC8vIEdldCBzaGFkZXIgcHJvZ3JhbSBmcm9tIHN0eWxlLCBsYXppbHkgY29tcGlsaW5nIGlmIG5lY2Vzc2FyeVxuICAgICAgICBsZXQgcHJvZ3JhbTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHByb2dyYW0gPSBzdHlsZS5nZXRQcm9ncmFtKHByb2dyYW1fa2V5KTtcbiAgICAgICAgICAgIGlmICghcHJvZ3JhbSkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjYXRjaChlcnJvcikge1xuICAgICAgICAgICAgdGhpcy50cmlnZ2VyKCd3YXJuaW5nJywge1xuICAgICAgICAgICAgICAgIHR5cGU6ICdzdHlsZXMnLFxuICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGBFcnJvciBjb21waWxpbmcgc3R5bGUgJHtzdHlsZS5uYW1lfWAsXG4gICAgICAgICAgICAgICAgc3R5bGUsXG4gICAgICAgICAgICAgICAgc2hhZGVyX2Vycm9yczogc3R5bGUucHJvZ3JhbSAmJiBzdHlsZS5wcm9ncmFtLnNoYWRlcl9lcnJvcnNcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgcHJvZ3JhbS51c2UoKTtcbiAgICAgICAgc3R5bGUuc2V0dXAoKTtcblxuICAgICAgICBwcm9ncmFtLnVuaWZvcm0oJzFmJywgJ3VfdGltZScsIHRoaXMuYW5pbWF0ZWQgPyAoKCgrbmV3IERhdGUoKSkgLSB0aGlzLnN0YXJ0X3RpbWUpIC8gMTAwMCkgOiAwKTtcbiAgICAgICAgdGhpcy52aWV3LnNldHVwUHJvZ3JhbShwcm9ncmFtKTtcbiAgICAgICAgZm9yIChsZXQgaSBpbiB0aGlzLmxpZ2h0cykge1xuICAgICAgICAgICAgdGhpcy5saWdodHNbaV0uc2V0dXBQcm9ncmFtKHByb2dyYW0pO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHByb2dyYW07XG4gICAgfVxuXG4gICAgY2xlYXJGcmFtZSh7IGNsZWFyX2NvbG9yLCBjbGVhcl9kZXB0aCB9ID0ge30pIHtcbiAgICAgICAgaWYgKCF0aGlzLmluaXRpYWxpemVkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBEZWZhdWx0c1xuICAgICAgICBjbGVhcl9jb2xvciA9IChjbGVhcl9jb2xvciA9PT0gZmFsc2UpID8gZmFsc2UgOiB0cnVlOyAvLyBkZWZhdWx0IHRydWVcbiAgICAgICAgY2xlYXJfZGVwdGggPSAoY2xlYXJfZGVwdGggPT09IGZhbHNlKSA/IGZhbHNlIDogdHJ1ZTsgLy8gZGVmYXVsdCB0cnVlXG5cbiAgICAgICAgLy8gU2V0IEdMIHN0YXRlXG4gICAgICAgIHRoaXMucmVuZGVyX3N0YXRlcy5kZXB0aF93cml0ZS5zZXQoeyBkZXB0aF93cml0ZTogY2xlYXJfZGVwdGggfSk7XG5cbiAgICAgICAgbGV0IGdsID0gdGhpcy5nbDtcbiAgICAgICAgaWYgKGNsZWFyX2NvbG9yIHx8IGNsZWFyX2RlcHRoKSB7XG4gICAgICAgICAgICBsZXQgbWFzayA9IChjbGVhcl9jb2xvciAmJiBnbC5DT0xPUl9CVUZGRVJfQklUKSB8IChjbGVhcl9kZXB0aCAmJiBnbC5ERVBUSF9CVUZGRVJfQklUKTtcbiAgICAgICAgICAgIGdsLmNsZWFyKG1hc2spO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgc2V0UmVuZGVyU3RhdGUoeyBkZXB0aF90ZXN0LCBkZXB0aF93cml0ZSwgY3VsbF9mYWNlLCBibGVuZCB9ID0ge30pIHtcbiAgICAgICAgaWYgKCF0aGlzLmluaXRpYWxpemVkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBEZWZhdWx0c1xuICAgICAgICAvLyBUT0RPOiB3aGVuIHdlIGFic3RyYWN0IG91dCBzdXBwb3J0IGZvciBtdWx0aXBsZSByZW5kZXIgcGFzc2VzLCB0aGVzZSBjYW4gYmUgcGVyLXBhc3MgY29uZmlnIG9wdGlvbnNcbiAgICAgICAgbGV0IHJlbmRlcl9zdGF0ZXMgPSB0aGlzLnJlbmRlcl9zdGF0ZXM7XG4gICAgICAgIGRlcHRoX3Rlc3QgPSAoZGVwdGhfdGVzdCA9PT0gZmFsc2UpID8gZmFsc2UgOiByZW5kZXJfc3RhdGVzLmRlZmF1bHRzLmRlcHRoX3Rlc3Q7ICAgICAgLy8gZGVmYXVsdCB0cnVlXG4gICAgICAgIGRlcHRoX3dyaXRlID0gKGRlcHRoX3dyaXRlID09PSBmYWxzZSkgPyBmYWxzZSA6IHJlbmRlcl9zdGF0ZXMuZGVmYXVsdHMuZGVwdGhfd3JpdGU7ICAgLy8gZGVmYXVsdCB0cnVlXG4gICAgICAgIGN1bGxfZmFjZSA9IChjdWxsX2ZhY2UgPT09IGZhbHNlKSA/IGZhbHNlIDogcmVuZGVyX3N0YXRlcy5kZWZhdWx0cy5jdWxsaW5nOyAgICAgICAgICAgLy8gZGVmYXVsdCB0cnVlXG4gICAgICAgIGJsZW5kID0gKGJsZW5kICE9IG51bGwpID8gYmxlbmQgOiByZW5kZXJfc3RhdGVzLmRlZmF1bHRzLmJsZW5kaW5nOyAgICAgICAgICAgICAgICAgICAgLy8gZGVmYXVsdCBmYWxzZVxuXG4gICAgICAgIC8vIFJlc2V0IGZyYW1lIHN0YXRlXG4gICAgICAgIGxldCBnbCA9IHRoaXMuZ2w7XG5cbiAgICAgICAgcmVuZGVyX3N0YXRlcy5kZXB0aF90ZXN0LnNldCh7IGRlcHRoX3Rlc3Q6IGRlcHRoX3Rlc3QgfSk7XG4gICAgICAgIHJlbmRlcl9zdGF0ZXMuZGVwdGhfd3JpdGUuc2V0KHsgZGVwdGhfd3JpdGU6IGRlcHRoX3dyaXRlIH0pO1xuICAgICAgICByZW5kZXJfc3RhdGVzLmN1bGxpbmcuc2V0KHsgY3VsbDogY3VsbF9mYWNlLCBmYWNlOiByZW5kZXJfc3RhdGVzLmRlZmF1bHRzLmN1bGxpbmdfZmFjZSB9KTtcblxuICAgICAgICAvLyBCbGVuZGluZyBvZiBhbHBoYSBjaGFubmVsIGlzIG1vZGlmaWVkIHRvIGFjY291bnQgZm9yIFdlYkdMIGFscGhhIGJlaGF2aW9yLCBzZWU6XG4gICAgICAgIC8vIGh0dHA6Ly93ZWJnbGZ1bmRhbWVudGFscy5vcmcvd2ViZ2wvbGVzc29ucy93ZWJnbC1hbmQtYWxwaGEuaHRtbFxuICAgICAgICAvLyBodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vYS8xMTUzMzQxNlxuICAgICAgICBpZiAoYmxlbmQpIHtcbiAgICAgICAgICAgIC8vIE9wYXF1ZTogYWxsIHNvdXJjZSwgbm8gZGVzdGluYXRpb25cbiAgICAgICAgICAgIGlmIChibGVuZCA9PT0gJ29wYXF1ZScpIHtcbiAgICAgICAgICAgICAgICByZW5kZXJfc3RhdGVzLmJsZW5kaW5nLnNldCh7XG4gICAgICAgICAgICAgICAgICAgIGJsZW5kOiBmYWxzZVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gVHJhZGl0aW9uYWwgYWxwaGEgYmxlbmRpbmdcbiAgICAgICAgICAgIGVsc2UgaWYgKGJsZW5kID09PSAnb3ZlcmxheScgfHwgYmxlbmQgPT09ICdpbmxheScpIHtcbiAgICAgICAgICAgICAgICByZW5kZXJfc3RhdGVzLmJsZW5kaW5nLnNldCh7XG4gICAgICAgICAgICAgICAgICAgIGJsZW5kOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICBzcmM6IGdsLlNSQ19BTFBIQSwgZHN0OiBnbC5PTkVfTUlOVVNfU1JDX0FMUEhBLFxuICAgICAgICAgICAgICAgICAgICBzcmNfYWxwaGE6IGdsLk9ORSwgZHN0X2FscGhhOiBnbC5PTkVfTUlOVVNfU1JDX0FMUEhBXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBBZGRpdGl2ZSBibGVuZGluZ1xuICAgICAgICAgICAgZWxzZSBpZiAoYmxlbmQgPT09ICdhZGQnKSB7XG4gICAgICAgICAgICAgICAgcmVuZGVyX3N0YXRlcy5ibGVuZGluZy5zZXQoe1xuICAgICAgICAgICAgICAgICAgICBibGVuZDogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgc3JjOiBnbC5PTkUsIGRzdDogZ2wuT05FXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBNdWx0aXBsaWNhdGl2ZSBibGVuZGluZ1xuICAgICAgICAgICAgZWxzZSBpZiAoYmxlbmQgPT09ICdtdWx0aXBseScpIHtcbiAgICAgICAgICAgICAgICByZW5kZXJfc3RhdGVzLmJsZW5kaW5nLnNldCh7XG4gICAgICAgICAgICAgICAgICAgIGJsZW5kOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICBzcmM6IGdsLlpFUk8sIGRzdDogZ2wuU1JDX0NPTE9SXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZW5kZXJfc3RhdGVzLmJsZW5kaW5nLnNldCh7IGJsZW5kOiBmYWxzZSB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIFJlcXVlc3QgZmVhdHVyZSBzZWxlY3Rpb24gYXQgZ2l2ZW4gcGl4ZWwuIFJ1bnMgYXN5bmMgYW5kIHJldHVybnMgcmVzdWx0cyB2aWEgYSBwcm9taXNlLlxuICAgIGdldEZlYXR1cmVBdChwaXhlbCkge1xuICAgICAgICBpZiAoIXRoaXMuaW5pdGlhbGl6ZWQpIHtcbiAgICAgICAgICAgIGxvZygnZGVidWcnLCBcIlNjZW5lLmdldEZlYXR1cmVBdCgpIGNhbGxlZCBiZWZvcmUgc2NlbmUgd2FzIGluaXRpYWxpemVkXCIpO1xuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gUG9pbnQgc2NhbGVkIHRvIFswLi4xXSByYW5nZVxuICAgICAgICB2YXIgcG9pbnQgPSB7XG4gICAgICAgICAgICB4OiBwaXhlbC54ICogVXRpbHMuZGV2aWNlX3BpeGVsX3JhdGlvIC8gdGhpcy52aWV3LnNpemUuZGV2aWNlLndpZHRoLFxuICAgICAgICAgICAgeTogcGl4ZWwueSAqIFV0aWxzLmRldmljZV9waXhlbF9yYXRpbyAvIHRoaXMudmlldy5zaXplLmRldmljZS5oZWlnaHRcbiAgICAgICAgfTtcblxuICAgICAgICB0aGlzLmRpcnR5ID0gdHJ1ZTsgLy8gbmVlZCB0byBtYWtlIHN1cmUgdGhlIHNjZW5lIHJlLXJlbmRlcnMgZm9yIHRoZXNlIHRvIGJlIHByb2Nlc3NlZFxuICAgICAgICByZXR1cm4gdGhpcy5zZWxlY3Rpb24uZ2V0RmVhdHVyZUF0KHBvaW50KS5cbiAgICAgICAgICAgIHRoZW4oc2VsZWN0aW9uID0+IE9iamVjdC5hc3NpZ24oc2VsZWN0aW9uLCB7IHBpeGVsIH0pKS5cbiAgICAgICAgICAgIGNhdGNoKGVycm9yID0+IFByb21pc2UucmVzb2x2ZSh7IGVycm9yIH0pKTtcbiAgICB9XG5cbiAgICAvLyBSZWJ1aWxkIGdlb21ldHJ5LCB3aXRob3V0IHJlLXBhcnNpbmcgdGhlIGNvbmZpZyBvciByZS1jb21waWxpbmcgc3R5bGVzXG4gICAgLy8gVE9ETzogZGV0ZWN0IHdoaWNoIGVsZW1lbnRzIG5lZWQgdG8gYmUgcmVmcmVzaGVkL3JlYnVpbHQgKHN0eWxlc2hlZXQgY2hhbmdlcywgZXRjLilcbiAgICByZWJ1aWxkKG9wdGlvbnMpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucmVidWlsZEdlb21ldHJ5KG9wdGlvbnMpO1xuICAgIH1cblxuICAgIC8vIFJlYnVpbGQgYWxsIHRpbGVzXG4gICAgLy8gc3luYzogYm9vbGVhbiBvZiB3aGV0aGVyIHRvIHN5bmMgdGhlIGNvbmZpZyBvYmplY3QgdG8gdGhlIHdvcmtlclxuICAgIC8vIHNvdXJjZXM6IG9wdGlvbmFsIGFycmF5IG9mIGRhdGEgc291cmNlcyB0byBzZWxlY3RpdmVseSByZWJ1aWxkIChieSBkZWZhdWx0IGFsbCBvdXIgcmVidWlsdClcbiAgICByZWJ1aWxkR2VvbWV0cnkoeyBzeW5jID0gdHJ1ZSwgc291cmNlcyA9IG51bGwsIHNlcmlhbGl6ZV9mdW5jcywgcHJvZmlsZSA9IGZhbHNlLCBmYWRlX2luID0gZmFsc2UgfSA9IHt9KSB7XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICAvLyBTa2lwIHJlYnVpbGQgaWYgYWxyZWFkeSBpbiBwcm9ncmVzc1xuICAgICAgICAgICAgaWYgKHRoaXMuYnVpbGRpbmcpIHtcbiAgICAgICAgICAgICAgICAvLyBRdWV1ZSB1cCB0byBvbmUgcmVidWlsZCBjYWxsIGF0IGEgdGltZSwgb25seSBzYXZlIGxhc3QgcmVxdWVzdFxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmJ1aWxkaW5nLnF1ZXVlZCAmJiB0aGlzLmJ1aWxkaW5nLnF1ZXVlZC5yZWplY3QpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gbm90aWZ5IHByZXZpb3VzIHJlcXVlc3QgdGhhdCBpdCBkaWQgbm90IGNvbXBsZXRlXG4gICAgICAgICAgICAgICAgICAgIGxvZygnZGVidWcnLCAnU2NlbmUucmVidWlsZDogcmVxdWVzdCBzdXBlcmNlZGVkIGJ5IGEgbmV3ZXIgY2FsbCcpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmJ1aWxkaW5nLnF1ZXVlZC5yZXNvbHZlKGZhbHNlKTsgLy8gZmFsc2UgZmxhZyBpbmRpY2F0ZXMgcmVidWlsZCByZXF1ZXN0IHdhcyBzdXBlcmNlZGVkXG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gU2F2ZSBxdWV1ZWQgcmVxdWVzdFxuICAgICAgICAgICAgICAgIHRoaXMuYnVpbGRpbmcucXVldWVkID0geyByZXNvbHZlLCByZWplY3QgfTtcbiAgICAgICAgICAgICAgICBsb2coJ3RyYWNlJywgYFNjZW5lLnJlYnVpbGQoKTogcXVldWluZyByZXF1ZXN0YCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBUcmFjayB0aWxlIGJ1aWxkIHN0YXRlXG4gICAgICAgICAgICB0aGlzLmJ1aWxkaW5nID0geyByZXNvbHZlLCByZWplY3QgfTtcblxuICAgICAgICAgICAgLy8gUHJvZmlsaW5nXG4gICAgICAgICAgICBpZiAocHJvZmlsZSkge1xuICAgICAgICAgICAgICAgIHRoaXMuX3Byb2ZpbGUoJ1NjZW5lLnJlYnVpbGQnKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gVXBkYXRlIGNvbmZpZyAoaW4gY2FzZSBKUyBvYmplY3RzIHdlcmUgbWFuaXB1bGF0ZWQgZGlyZWN0bHkpXG4gICAgICAgICAgICBpZiAoc3luYykge1xuICAgICAgICAgICAgICAgIHRoaXMuc3luY0NvbmZpZ1RvV29ya2VyKHsgc2VyaWFsaXplX2Z1bmNzIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5yZXNldEZlYXR1cmVTZWxlY3Rpb24oKTtcbiAgICAgICAgICAgIHRoaXMucmVzZXRUaW1lKCk7XG5cbiAgICAgICAgICAgIC8vIFJlYnVpbGQgdmlzaWJsZSB0aWxlc1xuICAgICAgICAgICAgdGhpcy50aWxlX21hbmFnZXIucHJ1bmVUb1Zpc2libGVUaWxlcygpO1xuICAgICAgICAgICAgdGhpcy50aWxlX21hbmFnZXIuZm9yRWFjaFRpbGUodGlsZSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKCFzb3VyY2VzIHx8IHNvdXJjZXMuaW5kZXhPZih0aWxlLnNvdXJjZS5uYW1lKSA+IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudGlsZV9tYW5hZ2VyLmJ1aWxkVGlsZSh0aWxlLCB7IGZhZGVfaW4gfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB0aGlzLnRpbGVfbWFuYWdlci51cGRhdGVUaWxlc0ZvclZpZXcoKTsgLy8gcGlja3MgdXAgYWRkaXRpb25hbCB0aWxlcyBmb3IgYW55IG5ldy9jaGFuZ2VkIGRhdGEgc291cmNlc1xuICAgICAgICAgICAgdGhpcy50aWxlX21hbmFnZXIuY2hlY2tCdWlsZFF1ZXVlKCk7ICAgIC8vIHJlc29sdmUgaW1tZWRpYXRlbHkgaWYgbm8gdGlsZXMgdG8gYnVpbGRcbiAgICAgICAgfSkudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAvLyBQcm9maWxpbmdcbiAgICAgICAgICAgIGlmIChwcm9maWxlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fcHJvZmlsZUVuZCgnU2NlbmUucmVidWlsZCcpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBUaWxlIG1hbmFnZXIgZmluaXNoZWQgYnVpbGRpbmcgdGlsZXNcbiAgICAvLyBUT0RPIG1vdmUgdG8gdGlsZSBtYW5hZ2VyXG4gICAgdGlsZU1hbmFnZXJCdWlsZERvbmUoKSB7XG4gICAgICAgIGlmICh0aGlzLmJ1aWxkaW5nKSB7XG4gICAgICAgICAgICBsb2coJ2luZm8nLCBgU2NlbmU6IGJ1aWxkIGdlb21ldHJ5IGZpbmlzaGVkYCk7XG4gICAgICAgICAgICBpZiAodGhpcy5idWlsZGluZy5yZXNvbHZlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5idWlsZGluZy5yZXNvbHZlKHRydWUpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBBbm90aGVyIHJlYnVpbGQgcXVldWVkP1xuICAgICAgICAgICAgdmFyIHF1ZXVlZCA9IHRoaXMuYnVpbGRpbmcucXVldWVkO1xuICAgICAgICAgICAgdGhpcy5idWlsZGluZyA9IG51bGw7XG4gICAgICAgICAgICBpZiAocXVldWVkKSB7XG4gICAgICAgICAgICAgICAgbG9nKCdkZWJ1ZycsIGBTY2VuZTogc3RhcnRpbmcgcXVldWVkIHJlYnVpbGQoKSByZXF1ZXN0YCk7XG4gICAgICAgICAgICAgICAgdGhpcy5yZWJ1aWxkKCkudGhlbihxdWV1ZWQucmVzb2x2ZSwgcXVldWVkLnJlamVjdCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgICBMb2FkIChvciByZWxvYWQpIHRoZSBzY2VuZSBjb25maWdcbiAgICAgICBAcmV0dXJuIHtQcm9taXNlfVxuICAgICovXG4gICAgbG9hZFNjZW5lKGNvbmZpZ19zb3VyY2UgPSBudWxsLCBjb25maWdfcGF0aCA9IG51bGwpIHtcbiAgICAgICAgdGhpcy5jb25maWdfc291cmNlID0gY29uZmlnX3NvdXJjZSB8fCB0aGlzLmNvbmZpZ19zb3VyY2U7XG4gICAgICAgIHRoaXMuY29uZmlnX2dsb2JhbHNfYXBwbGllZCA9IFtdO1xuXG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5jb25maWdfc291cmNlID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgdGhpcy5jb25maWdfcGF0aCA9IFVSTHMucGF0aEZvclVSTChjb25maWdfcGF0aCB8fCB0aGlzLmNvbmZpZ19zb3VyY2UpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5jb25maWdfcGF0aCA9IFVSTHMucGF0aEZvclVSTChjb25maWdfcGF0aCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gU2NlbmVMb2FkZXIubG9hZFNjZW5lKHRoaXMuY29uZmlnX3NvdXJjZSwgdGhpcy5jb25maWdfcGF0aCkudGhlbihjb25maWcgPT4ge1xuICAgICAgICAgICAgdGhpcy5jb25maWcgPSBjb25maWc7XG4gICAgICAgICAgICB0aGlzLnRyaWdnZXIoJ2xvYWQnLCB7IGNvbmZpZzogdGhpcy5jb25maWcgfSk7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5jb25maWc7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIEFkZCBzb3VyY2UgdG8gYSBzY2VuZSwgYXJndW1lbnRzIGBuYW1lYCBhbmQgYGNvbmZpZ2AgbmVlZCB0byBiZSBwcm92aWRlZDpcbiAgICAvLyAgLSBJZiB0aGUgbmFtZSBkb2Vzbid0IG1hdGNoIGEgc291cmNlcyBpdCB3aWxsIGNyZWF0ZSBpdFxuICAgIC8vICAtIHRoZSBgY29uZmlnYCBvYmogZm9sbG93IHRoZSBZQU1MIHNjZW5lIHNwZWMsIGV4OiBgYGB7dHlwZTogJ1RvcG9KU09OJywgdXJsOiBcIi8vdmVjdG9yLm1hcHplbi5jb20vb3NtL2FsbC97en0ve3h9L3t5fS50b3BvanNvblwiXX1gYGBcbiAgICAvLyAgICB0aGF0IGxvb2tzIGxpa2U6XG4gICAgLy9cbiAgICAvLyAgICAgIHNjZW5lLnNldERhdGFTb3VyY2UoXCJvc21cIiwge3R5cGU6ICdUb3BvSlNPTicsIHVybDogXCIvL3ZlY3Rvci5tYXB6ZW4uY29tL29zbS9hbGwve3p9L3t4fS97eX0udG9wb2pzb25cIiB9KTtcbiAgICAvL1xuICAgIC8vICAtIGFsc28gY2FuIGJlIHBhc3MgYSBgYGBkYXRhYGBgIG9iajogYGBge3R5cGU6ICdHZW9KU09OJywgZGF0YTogSlNPYmogXX1gYGBcbiAgICAvL1xuICAgIC8vICAgICAgdmFyIGdlb2pzb25fZGF0YSA9IHt9O1xuICAgIC8vICAgICAgLi4uXG4gICAgLy8gICAgICBzY2VuZS5zZXREYXRhU291cmNlKFwiZHluYW1pY19kYXRhXCIsIHt0eXBlOiAnR2VvSlNPTicsIGRhdGE6IGdlb2pzb25fZGF0YSB9KTtcbiAgICAvL1xuICAgIHNldERhdGFTb3VyY2UgKG5hbWUsIGNvbmZpZykge1xuICAgICAgICBpZiAoIW5hbWUgfHwgIWNvbmZpZyB8fCAhY29uZmlnLnR5cGUgfHwgKCFjb25maWcudXJsICYmICFjb25maWcuZGF0YSkpIHtcbiAgICAgICAgICAgIGxvZygnZXJyb3InLCBcIk5vIG5hbWUgcHJvdmlkZWQgb3Igbm90IGEgdmFsaWQgY29uZmlnOlwiLCBuYW1lLCBjb25maWcpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGxvYWQgPSAodGhpcy5jb25maWcuc291cmNlc1tuYW1lXSA9PSBudWxsKTtcbiAgICAgICAgbGV0IHNvdXJjZSA9IHRoaXMuY29uZmlnLnNvdXJjZXNbbmFtZV0gPSBPYmplY3QuYXNzaWduKHt9LCBjb25maWcpO1xuXG4gICAgICAgIGlmIChzb3VyY2UuZGF0YSAmJiB0eXBlb2Ygc291cmNlLmRhdGEgPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICBzb3VyY2UudXJsID0gVVJMcy5jcmVhdGVPYmplY3RVUkwobmV3IEJsb2IoW0pTT04uc3RyaW5naWZ5KHNvdXJjZS5kYXRhKV0pKTtcbiAgICAgICAgICAgIGRlbGV0ZSBzb3VyY2UuZGF0YTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChsb2FkKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy51cGRhdGVDb25maWcoeyByZWJ1aWxkOiB7IHNvdXJjZXM6IFtuYW1lXSB9IH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMucmVidWlsZCh7IHNvdXJjZXM6IFtuYW1lXSB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGNyZWF0ZURhdGFTb3VyY2VzKCkge1xuICAgICAgICBsZXQgcmVzZXQgPSBbXTsgLy8gc291cmNlcyB0byByZXNldFxuICAgICAgICBsZXQgcHJldl9zb3VyY2VfbmFtZXMgPSBPYmplY3Qua2V5cyh0aGlzLnNvdXJjZXMpO1xuXG4gICAgICAgIGZvciAodmFyIG5hbWUgaW4gdGhpcy5jb25maWcuc291cmNlcykge1xuICAgICAgICAgICAgbGV0IHNvdXJjZSA9IHRoaXMuY29uZmlnLnNvdXJjZXNbbmFtZV07XG4gICAgICAgICAgICBsZXQgcHJldl9zb3VyY2UgPSB0aGlzLnNvdXJjZXNbbmFtZV07XG5cbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zb3VyY2VzW25hbWVdID0gRGF0YVNvdXJjZS5jcmVhdGUoT2JqZWN0LmFzc2lnbih7fSwgc291cmNlLCB7bmFtZX0pLCB0aGlzLnNvdXJjZXMpO1xuICAgICAgICAgICAgICAgIGlmICghdGhpcy5zb3VyY2VzW25hbWVdKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IHt9O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoKGUpIHtcbiAgICAgICAgICAgICAgICBkZWxldGUgdGhpcy5zb3VyY2VzW25hbWVdO1xuICAgICAgICAgICAgICAgIGxldCBtZXNzYWdlID0gYENvdWxkIG5vdCBjcmVhdGUgZGF0YSBzb3VyY2U6ICR7ZS5tZXNzYWdlfWA7XG4gICAgICAgICAgICAgICAgbG9nKCd3YXJuJywgYFNjZW5lOiAke21lc3NhZ2V9YCwgc291cmNlKTtcbiAgICAgICAgICAgICAgICB0aGlzLnRyaWdnZXIoJ3dhcm5pbmcnLCB7IHR5cGU6ICdzb3VyY2VzJywgc291cmNlLCBtZXNzYWdlIH0pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBEYXRhIHNvdXJjZSBjaGFuZ2VkP1xuICAgICAgICAgICAgaWYgKERhdGFTb3VyY2UuY2hhbmdlZCh0aGlzLnNvdXJjZXNbbmFtZV0sIHByZXZfc291cmNlKSkge1xuICAgICAgICAgICAgICAgIHJlc2V0LnB1c2gobmFtZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBTb3VyY2VzIHRoYXQgd2VyZSByZW1vdmVkXG4gICAgICAgIHByZXZfc291cmNlX25hbWVzLmZvckVhY2gocyA9PiB7XG4gICAgICAgICAgICBpZiAoIXRoaXMuY29uZmlnLnNvdXJjZXNbc10pIHtcbiAgICAgICAgICAgICAgICBkZWxldGUgdGhpcy5zb3VyY2VzW3NdOyAvLyBUT0RPOiByZW1vdmUgZnJvbSB3b3JrZXJzIHRvbz9cbiAgICAgICAgICAgICAgICByZXNldC5wdXNoKHMpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICAvLyBSZW1vdmUgdGlsZXMgZnJvbSBzb3VyY2VzIHRoYXQgaGF2ZSBjaGFuZ2VkXG4gICAgICAgIGlmIChyZXNldC5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICB0aGlzLnRpbGVfbWFuYWdlci5yZW1vdmVUaWxlcyh0aWxlID0+IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gKHJlc2V0LmluZGV4T2YodGlsZS5zb3VyY2UubmFtZSkgPiAtMSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIE1hcmsgc291cmNlcyB0aGF0IHdpbGwgZ2VuZXJhdGUgZ2VvbWV0cnkgdGlsZXNcbiAgICAgICAgLy8gKGFsbCBleGNlcHQgdGhvc2UgdGhhdCBhcmUgb25seSByYXN0ZXIgc291cmNlcyBhdHRhY2hlZCB0byBvdGhlciBzb3VyY2VzKVxuICAgICAgICBmb3IgKGxldCBsbiBpbiB0aGlzLmNvbmZpZy5sYXllcnMpIHtcbiAgICAgICAgICAgIGxldCBsYXllciA9IHRoaXMuY29uZmlnLmxheWVyc1tsbl07XG4gICAgICAgICAgICBpZiAobGF5ZXIuZGF0YSAmJiB0aGlzLnNvdXJjZXNbbGF5ZXIuZGF0YS5zb3VyY2VdKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zb3VyY2VzW2xheWVyLmRhdGEuc291cmNlXS5idWlsZHNfZ2VvbWV0cnlfdGlsZXMgPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gTG9hZCBhbGwgdGV4dHVyZXMgaW4gdGhlIHNjZW5lIGRlZmluaXRpb25cbiAgICBsb2FkVGV4dHVyZXMoKSB7XG4gICAgICAgIHJldHVybiBUZXh0dXJlLmNyZWF0ZUZyb21PYmplY3QodGhpcy5nbCwgdGhpcy5jb25maWcudGV4dHVyZXMpLlxuICAgICAgICAgICAgdGhlbigoKSA9PiBUZXh0dXJlLmNyZWF0ZURlZmF1bHQodGhpcy5nbCkpOyAvLyBjcmVhdGUgYSAnZGVmYXVsdCcgdGV4dHVyZSBmb3IgcGxhY2Vob2xkZXJzXG4gICAgfVxuXG4gICAgLy8gQ2FsbGVkIChjdXJyZW50bHkgbWFudWFsbHkpIGFmdGVyIHN0eWxlcyBhcmUgdXBkYXRlZCBpbiBzdHlsZXNoZWV0XG4gICAgdXBkYXRlU3R5bGVzKCkge1xuICAgICAgICBpZiAoIXRoaXMuaW5pdGlhbGl6ZWQgJiYgIXRoaXMuaW5pdGlhbGl6aW5nKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1NjZW5lLnVwZGF0ZVN0eWxlcygpIGNhbGxlZCBiZWZvcmUgc2NlbmUgd2FzIGluaXRpYWxpemVkJyk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyAoUmUpYnVpbGQgc3R5bGVzIGZyb20gY29uZmlnXG4gICAgICAgIHRoaXMuc3R5bGVzID0gdGhpcy5zdHlsZV9tYW5hZ2VyLmJ1aWxkKHRoaXMuY29uZmlnLnN0eWxlcyk7XG4gICAgICAgIHRoaXMuc3R5bGVfbWFuYWdlci5pbml0U3R5bGVzKHRoaXMpO1xuXG4gICAgICAgIC8vIE9wdGlvbmFsbHkgc2V0IEdMIGNvbnRleHQgKHVzZWQgd2hlbiBpbml0aWFsaXppbmcgb3IgcmUtaW5pdGlhbGl6aW5nIEdMIHJlc291cmNlcylcbiAgICAgICAgZm9yIChsZXQgc3R5bGUgaW4gdGhpcy5zdHlsZXMpIHtcbiAgICAgICAgICAgIHRoaXMuc3R5bGVzW3N0eWxlXS5zZXRHTCh0aGlzLmdsKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFVzZSBleHBsaWNpdGx5IHNldCBzY2VuZSBhbmltYXRpb24gZmxhZyBpZiBkZWZpbmVkLCBvdGhlcndpc2UgdHVybiBvbiBhbmltYXRpb24gaWYgdGhlcmUgYXJlIGFueSBhbmltYXRlZCBzdHlsZXNcbiAgICAgICAgdGhpcy5hbmltYXRlZCA9XG4gICAgICAgICAgICB0aGlzLmNvbmZpZy5zY2VuZS5hbmltYXRlZCAhPT0gdW5kZWZpbmVkID9cbiAgICAgICAgICAgICAgICB0aGlzLmNvbmZpZy5zY2VuZS5hbmltYXRlZCA6XG4gICAgICAgICAgICAgICAgT2JqZWN0LmtleXModGhpcy5zdHlsZXMpLnNvbWUocyA9PiB0aGlzLnN0eWxlc1tzXS5hbmltYXRlZCk7XG5cbiAgICAgICAgdGhpcy5kaXJ0eSA9IHRydWU7XG4gICAgfVxuXG4gICAgLy8gR2V0IGFjdGl2ZSBjYW1lcmEgLSBmb3IgcHVibGljIEFQSVxuICAgIGdldEFjdGl2ZUNhbWVyYSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudmlldy5nZXRBY3RpdmVDYW1lcmEoKTtcbiAgICB9XG5cbiAgICAvLyBTZXQgYWN0aXZlIGNhbWVyYSAtIGZvciBwdWJsaWMgQVBJXG4gICAgc2V0QWN0aXZlQ2FtZXJhKG5hbWUpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudmlldy5zZXRBY3RpdmVDYW1lcmEobmFtZSk7XG4gICAgfVxuXG4gICAgLy8gQ3JlYXRlIGxpZ2h0aW5nXG4gICAgY3JlYXRlTGlnaHRzKCkge1xuICAgICAgICB0aGlzLmxpZ2h0cyA9IHt9O1xuICAgICAgICBmb3IgKGxldCBpIGluIHRoaXMuY29uZmlnLmxpZ2h0cykge1xuICAgICAgICAgICAgaWYgKCF0aGlzLmNvbmZpZy5saWdodHNbaV0gfHwgdHlwZW9mIHRoaXMuY29uZmlnLmxpZ2h0c1tpXSAhPT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxldCBsaWdodCA9IHRoaXMuY29uZmlnLmxpZ2h0c1tpXTtcbiAgICAgICAgICAgIGxpZ2h0Lm5hbWUgPSBpLnJlcGxhY2UoJy0nLCAnXycpOyAvLyBsaWdodCBuYW1lcyBhcmUgaW5qZWN0ZWQgaW4gc2hhZGVycywgY2FuJ3QgaGF2ZSBoeXBoZW5zXG4gICAgICAgICAgICBsaWdodC52aXNpYmxlID0gKGxpZ2h0LnZpc2libGUgPT09IGZhbHNlKSA/IGZhbHNlIDogdHJ1ZTtcbiAgICAgICAgICAgIGlmIChsaWdodC52aXNpYmxlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5saWdodHNbbGlnaHQubmFtZV0gPSBMaWdodC5jcmVhdGUodGhpcy52aWV3LCBsaWdodCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgTGlnaHQuaW5qZWN0KHRoaXMubGlnaHRzKTtcbiAgICB9XG5cbiAgICAvLyBTZXQgYmFja2dyb3VuZCBjb2xvclxuICAgIHNldEJhY2tncm91bmQoKSB7XG4gICAgICAgIGxldCBiZyA9IHRoaXMuY29uZmlnLnNjZW5lLmJhY2tncm91bmQ7XG4gICAgICAgIHRoaXMuYmFja2dyb3VuZCA9IHt9O1xuICAgICAgICBpZiAoYmcgJiYgYmcuY29sb3IpIHtcbiAgICAgICAgICAgIHRoaXMuYmFja2dyb3VuZC5jb2xvciA9IFN0eWxlUGFyc2VyLnBhcnNlQ29sb3IoYmcuY29sb3IpO1xuICAgICAgICB9XG4gICAgICAgIGlmICghdGhpcy5iYWNrZ3JvdW5kLmNvbG9yKSB7XG4gICAgICAgICAgICB0aGlzLmJhY2tncm91bmQuY29sb3IgPSBbMCwgMCwgMCwgMF07IC8vIGRlZmF1bHQgYmFja2dyb3VuZCBUT0RPOiB2YXJ5IHcvc2NlbmUgYWxwaGFcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGlmIGJhY2tncm91bmQgaXMgZnVsbHkgb3BhcXVlLCBzZXQgY2FudmFzIGJhY2tncm91bmQgdG8gbWF0Y2hcbiAgICAgICAgaWYgKHRoaXMuYmFja2dyb3VuZC5jb2xvclszXSA9PT0gMSkge1xuICAgICAgICAgICAgdGhpcy5jYW52YXMuc3R5bGUuYmFja2dyb3VuZENvbG9yID1cbiAgICAgICAgICAgICAgICBgcmdiYSgke3RoaXMuYmFja2dyb3VuZC5jb2xvci5tYXAoYyA9PiBNYXRoLmZsb29yKGMgKiAyNTUpKS5qb2luKCcsICcpfSlgO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5jYW52YXMuc3R5bGUuYmFja2dyb3VuZENvbG9yID0gJ3RyYW5zcGFyZW50JztcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuZ2wuY2xlYXJDb2xvciguLi50aGlzLmJhY2tncm91bmQuY29sb3IpO1xuICAgIH1cblxuICAgIC8vIFR1cm4gaW50cm9zcGVjdGlvbiBtb2RlIG9uL29mZlxuICAgIHNldEludHJvc3BlY3Rpb24gKHZhbCkge1xuICAgICAgICB0aGlzLmludHJvc3BlY3Rpb24gPSB2YWwgfHwgZmFsc2U7XG4gICAgICAgIHRoaXMudXBkYXRpbmcrKztcbiAgICAgICAgcmV0dXJuIHRoaXMudXBkYXRlQ29uZmlnKCkudGhlbigoKSA9PiB0aGlzLnVwZGF0aW5nLS0pO1xuICAgIH1cblxuICAgIC8vIFVwZGF0ZSBzY2VuZSBjb25maWcsIGFuZCBvcHRpb25hbGx5IHJlYnVpbGQgZ2VvbWV0cnlcbiAgICAvLyByZWJ1aWxkIGNhbiBiZSBib29sZWFuLCBvciBhbiBvYmplY3QgY29udGFpbmluZyByZWJ1aWxkIG9wdGlvbnMgdG8gcGFzc3Rocm91Z2hcbiAgICB1cGRhdGVDb25maWcoeyByZWJ1aWxkID0gdHJ1ZSwgc2VyaWFsaXplX2Z1bmNzLCBmYWRlX2luID0gZmFsc2UgfSA9IHt9KSB7XG4gICAgICAgIHRoaXMuZ2VuZXJhdGlvbiA9ICsrU2NlbmUuZ2VuZXJhdGlvbjtcbiAgICAgICAgdGhpcy51cGRhdGluZysrO1xuXG4gICAgICAgIHRoaXMuY29uZmlnID0gU2NlbmVMb2FkZXIuYXBwbHlHbG9iYWxQcm9wZXJ0aWVzKHRoaXMuY29uZmlnLCB0aGlzLmNvbmZpZ19nbG9iYWxzX2FwcGxpZWQpO1xuICAgICAgICBTY2VuZUxvYWRlci5ob2lzdFRleHR1cmVzKHRoaXMuY29uZmlnKTsgLy8gbW92ZSBpbmxpbmUgdGV4dHVyZXMgaW50byBnbG9iYWwgdGV4dHVyZSBzZXRcbiAgICAgICAgdGhpcy5zdHlsZV9tYW5hZ2VyLmluaXQoKTtcbiAgICAgICAgdGhpcy52aWV3LnJlc2V0KCk7XG4gICAgICAgIHRoaXMuY3JlYXRlTGlnaHRzKCk7XG4gICAgICAgIHRoaXMuY3JlYXRlRGF0YVNvdXJjZXMoKTtcbiAgICAgICAgdGhpcy5sb2FkVGV4dHVyZXMoKTtcbiAgICAgICAgdGhpcy5zZXRCYWNrZ3JvdW5kKCk7XG4gICAgICAgIEZvbnRNYW5hZ2VyLmxvYWRGb250cyh0aGlzLmNvbmZpZy5mb250cyk7XG5cbiAgICAgICAgLy8gVE9ETzogZGV0ZWN0IGNoYW5nZXMgdG8gc3R5bGVzPyBhbHJlYWR5IChjdXJyZW50bHkpIG5lZWQgdG8gcmVjb21waWxlIGFueXdheSB3aGVuIGNhbWVyYSBvciBsaWdodHMgY2hhbmdlXG4gICAgICAgIHRoaXMudXBkYXRlU3R5bGVzKCk7XG5cbiAgICAgICAgLy8gT3B0aW9uYWxseSByZWJ1aWxkIGdlb21ldHJ5XG4gICAgICAgIGxldCBkb25lID0gcmVidWlsZCA/XG4gICAgICAgICAgICB0aGlzLnJlYnVpbGQoT2JqZWN0LmFzc2lnbih7IHNlcmlhbGl6ZV9mdW5jcywgZmFkZV9pbiB9LCB0eXBlb2YgcmVidWlsZCA9PT0gJ29iamVjdCcgJiYgcmVidWlsZCkpIDpcbiAgICAgICAgICAgIHRoaXMuc3luY0NvbmZpZ1RvV29ya2VyKHsgc2VyaWFsaXplX2Z1bmNzIH0pOyAvLyByZWJ1aWxkKCkgYWxzbyBzeW5jcyBjb25maWdcblxuICAgICAgICAvLyBGaW5pc2ggYnkgdXBkYXRpbmcgYm91bmRzIGFuZCByZS1yZW5kZXJpbmdcbiAgICAgICAgdGhpcy51cGRhdGluZy0tO1xuICAgICAgICB0aGlzLnZpZXcudXBkYXRlQm91bmRzKCk7XG4gICAgICAgIHRoaXMucmVxdWVzdFJlZHJhdygpO1xuXG4gICAgICAgIHJldHVybiBkb25lO1xuICAgIH1cblxuICAgIC8vIFNlcmlhbGl6ZSBjb25maWcgYW5kIHNlbmQgdG8gd29ya2VyXG4gICAgc3luY0NvbmZpZ1RvV29ya2VyKHsgc2VyaWFsaXplX2Z1bmNzID0gdHJ1ZSB9ID0ge30pIHtcbiAgICAgICAgLy8gVGVsbCB3b3JrZXJzIHdlJ3JlIGFib3V0IHRvIHJlYnVpbGQgKHNvIHRoZXkgY2FuIHVwZGF0ZSBzdHlsZXMsIGV0Yy4pXG4gICAgICAgIHRoaXMuY29uZmlnX3NlcmlhbGl6ZWQgPVxuICAgICAgICAgICAgc2VyaWFsaXplX2Z1bmNzID8gVXRpbHMuc2VyaWFsaXplV2l0aEZ1bmN0aW9ucyh0aGlzLmNvbmZpZykgOiBKU09OLnN0cmluZ2lmeSh0aGlzLmNvbmZpZyk7XG4gICAgICAgIHJldHVybiBXb3JrZXJCcm9rZXIucG9zdE1lc3NhZ2UodGhpcy53b3JrZXJzLCAnc2VsZi51cGRhdGVDb25maWcnLCB7XG4gICAgICAgICAgICBjb25maWc6IHRoaXMuY29uZmlnX3NlcmlhbGl6ZWQsXG4gICAgICAgICAgICBnZW5lcmF0aW9uOiB0aGlzLmdlbmVyYXRpb24sXG4gICAgICAgICAgICBpbnRyb3NwZWN0aW9uOiB0aGlzLmludHJvc3BlY3Rpb25cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gTGlzdGVuIHRvIHJlbGF0ZWQgb2JqZWN0c1xuICAgIGNyZWF0ZUxpc3RlbmVycyAoKSB7XG4gICAgICAgIHRoaXMubGlzdGVuZXJzID0ge307XG5cbiAgICAgICAgdGhpcy5saXN0ZW5lcnMudmlldyA9IHtcbiAgICAgICAgICAgIG1vdmU6ICgpID0+IHRoaXMudHJpZ2dlcignbW92ZScpXG4gICAgICAgIH07XG4gICAgICAgIHRoaXMudmlldy5zdWJzY3JpYmUodGhpcy5saXN0ZW5lcnMudmlldyk7XG5cbiAgICAgICAgdGhpcy5saXN0ZW5lcnMudGV4dHVyZSA9IHtcbiAgICAgICAgICAgIHVwZGF0ZTogKCkgPT4gdGhpcy5kaXJ0eSA9IHRydWUsXG4gICAgICAgICAgICB3YXJuaW5nOiAoZGF0YSkgPT4gdGhpcy50cmlnZ2VyKCd3YXJuaW5nJywgT2JqZWN0LmFzc2lnbih7IHR5cGU6ICd0ZXh0dXJlcycgfSwgZGF0YSkpXG4gICAgICAgIH07XG4gICAgICAgIFRleHR1cmUuc3Vic2NyaWJlKHRoaXMubGlzdGVuZXJzLnRleHR1cmUpO1xuXG4gICAgICAgIHRoaXMubGlzdGVuZXJzLnNjZW5lX2xvYWRlciA9IHtcbiAgICAgICAgICAgIGVycm9yOiAoZGF0YSkgPT4gdGhpcy50cmlnZ2VyKCdlcnJvcicsIE9iamVjdC5hc3NpZ24oeyB0eXBlOiAnc2NlbmUnIH0sIGRhdGEpKVxuICAgICAgICB9O1xuICAgICAgICBTY2VuZUxvYWRlci5zdWJzY3JpYmUodGhpcy5saXN0ZW5lcnMuc2NlbmVfbG9hZGVyKTtcbiAgICB9XG5cbiAgICBkZXN0cm95TGlzdGVuZXJzICgpIHtcbiAgICAgICAgdGhpcy51bnN1YnNjcmliZUFsbCgpO1xuICAgICAgICB0aGlzLnZpZXcudW5zdWJzY3JpYmUodGhpcy5saXN0ZW5lcnMudmlldyk7XG4gICAgICAgIFRleHR1cmUudW5zdWJzY3JpYmUodGhpcy5saXN0ZW5lcnMudGV4dHVyZSk7XG4gICAgICAgIFNjZW5lTG9hZGVyLnVuc3Vic2NyaWJlKHRoaXMubGlzdGVuZXJzLnNjZW5lX2xvYWRlcik7XG4gICAgICAgIHRoaXMubGlzdGVuZXJzID0gbnVsbDtcbiAgICB9XG5cbiAgICByZXNldEZlYXR1cmVTZWxlY3Rpb24oKSB7XG4gICAgICAgIGlmICghdGhpcy5zZWxlY3Rpb24pIHtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uID0gbmV3IEZlYXR1cmVTZWxlY3Rpb24odGhpcy5nbCwgdGhpcy53b3JrZXJzKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0aGlzLndvcmtlcnMpIHtcbiAgICAgICAgICAgIFdvcmtlckJyb2tlci5wb3N0TWVzc2FnZSh0aGlzLndvcmtlcnMsICdzZWxmLnJlc2V0RmVhdHVyZVNlbGVjdGlvbicpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gR2V0cyB0aGUgY3VycmVudCBmZWF0dXJlIHNlbGVjdGlvbiBtYXAgc2l6ZSBhY3Jvc3MgYWxsIHdvcmtlcnMuIFJldHVybnMgYSBwcm9taXNlLlxuICAgIGdldEZlYXR1cmVTZWxlY3Rpb25NYXBTaXplKCkge1xuICAgICAgICBpZiAodGhpcy5mZXRjaGluZ19zZWxlY3Rpb25fbWFwKSB7XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7IC8vIHJldHVybiB1bmRlZmluZWQgaWYgYWxyZWFkeSBwZW5kaW5nXG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5mZXRjaGluZ19zZWxlY3Rpb25fbWFwID0gdHJ1ZTtcblxuICAgICAgICByZXR1cm4gV29ya2VyQnJva2VyLnBvc3RNZXNzYWdlKHRoaXMud29ya2VycywgJ3NlbGYuZ2V0RmVhdHVyZVNlbGVjdGlvbk1hcFNpemUnKVxuICAgICAgICAgICAgLnRoZW4oc2l6ZXMgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMuZmV0Y2hpbmdfc2VsZWN0aW9uX21hcCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIHJldHVybiBzaXplcy5yZWR1Y2UoKGEsIGIpID0+IGEgKyBiKTtcbiAgICAgICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIFJlc2V0IGludGVybmFsIGNsb2NrLCBtb3N0bHkgdXNlZnVsIGZvciBjb25zaXN0ZW50IGV4cGVyaWVuY2Ugd2hlbiBjaGFuZ2luZyBzdHlsZXMvZGVidWdnaW5nXG4gICAgcmVzZXRUaW1lKCkge1xuICAgICAgICB0aGlzLnN0YXJ0X3RpbWUgPSArbmV3IERhdGUoKTtcbiAgICB9XG5cbiAgICAvLyBGaXJlcyBldmVudCB3aGVuIHJlbmRlcmVkIHRpbGUgc2V0IG9yIHN0eWxlIGNoYW5nZXNcbiAgICB1cGRhdGVWaWV3Q29tcGxldGUgKCkge1xuICAgICAgICBpZiAoKHRoaXMucmVuZGVyX2NvdW50X2NoYW5nZWQgfHwgdGhpcy5nZW5lcmF0aW9uICE9PSB0aGlzLmxhc3RfY29tcGxldGVfZ2VuZXJhdGlvbikgJiZcbiAgICAgICAgICAgICF0aGlzLnRpbGVfbWFuYWdlci5pc0xvYWRpbmdWaXNpYmxlVGlsZXMoKSkge1xuICAgICAgICAgICAgdGhpcy5sYXN0X2NvbXBsZXRlX2dlbmVyYXRpb24gPSB0aGlzLmdlbmVyYXRpb247XG4gICAgICAgICAgICB0aGlzLnRyaWdnZXIoJ3ZpZXdfY29tcGxldGUnKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJlc2V0Vmlld0NvbXBsZXRlICgpIHtcbiAgICAgICAgdGhpcy5sYXN0X2NvbXBsZXRlX2dlbmVyYXRpb24gPSBudWxsO1xuICAgIH1cblxuICAgIC8vIFRha2UgYSBzY3JlZW5zaG90XG4gICAgLy8gQXN5bmNocm9ub3VzIGJlY2F1c2Ugd2UgaGF2ZSB0byB3YWl0IGZvciBuZXh0IHJlbmRlciB0byBjYXB0dXJlIGJ1ZmZlclxuICAgIC8vIFJldHVybnMgYSBwcm9taXNlXG4gICAgc2NyZWVuc2hvdCAoKSB7XG4gICAgICAgIHRoaXMucmVxdWVzdFJlZHJhdygpO1xuICAgICAgICByZXR1cm4gdGhpcy5tZWRpYV9jYXB0dXJlLnNjcmVlbnNob3QoKTtcbiAgICB9XG5cbiAgICBzdGFydFZpZGVvQ2FwdHVyZSAoKSB7XG4gICAgICAgIHRoaXMucmVxdWVzdFJlZHJhdygpO1xuICAgICAgICByZXR1cm4gdGhpcy5tZWRpYV9jYXB0dXJlLnN0YXJ0VmlkZW9DYXB0dXJlKCk7XG4gICAgfVxuXG4gICAgc3RvcFZpZGVvQ2FwdHVyZSAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLm1lZGlhX2NhcHR1cmUuc3RvcFZpZGVvQ2FwdHVyZSgpO1xuICAgIH1cblxuXG4gICAgLy8gU3RhdHMvZGVidWcvcHJvZmlsaW5nIG1ldGhvZHNcblxuICAgIC8vIFByb2ZpbGUgaGVscGVycywgaXNzdWVzIGEgcHJvZmlsZSBvbiBtYWluIHRocmVhZCAmIGFsbCB3b3JrZXJzXG4gICAgX3Byb2ZpbGUobmFtZSkge1xuICAgICAgICBjb25zb2xlLnByb2ZpbGUoYG1haW4gdGhyZWFkOiAke25hbWV9YCk7XG4gICAgICAgIFdvcmtlckJyb2tlci5wb3N0TWVzc2FnZSh0aGlzLndvcmtlcnMsICdzZWxmLnByb2ZpbGUnLCBuYW1lKTtcbiAgICB9XG5cbiAgICBfcHJvZmlsZUVuZChuYW1lKSB7XG4gICAgICAgIGNvbnNvbGUucHJvZmlsZUVuZChgbWFpbiB0aHJlYWQ6ICR7bmFtZX1gKTtcbiAgICAgICAgV29ya2VyQnJva2VyLnBvc3RNZXNzYWdlKHRoaXMud29ya2VycywgJ3NlbGYucHJvZmlsZUVuZCcsIG5hbWUpO1xuICAgIH1cblxuICAgIC8vIERlYnVnIGNvbmZpZyBhbmQgZnVuY3Rpb25zXG4gICAgc2V0dXBEZWJ1ZyAoKSB7XG4gICAgICAgIGxldCBzY2VuZSA9IHRoaXM7XG4gICAgICAgIHRoaXMuZGVidWcgPSB7XG4gICAgICAgICAgICAvLyBSZWJ1aWxkIGdlb21ldHJ5IGEgZ2l2ZW4gIyBvZiB0aW1lcyBhbmQgcHJpbnQgYXZlcmFnZSwgbWluLCBtYXggdGltaW5nc1xuICAgICAgICAgICAgdGltZVJlYnVpbGQgKG51bSA9IDEsIG9wdGlvbnMgPSB7fSkge1xuICAgICAgICAgICAgICAgIGxldCB0aW1lcyA9IFtdO1xuICAgICAgICAgICAgICAgIGxldCBjeWNsZSA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHN0YXJ0ID0gK25ldyBEYXRlKCk7XG4gICAgICAgICAgICAgICAgICAgIHNjZW5lLnJlYnVpbGQob3B0aW9ucykudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aW1lcy5wdXNoKCtuZXcgRGF0ZSgpIC0gc3RhcnQpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGltZXMubGVuZ3RoIDwgbnVtKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY3ljbGUoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBhdmcgPSB+fih0aW1lcy5yZWR1Y2UoKGEsIGIpID0+IGEgKyBiKSAvIHRpbWVzLmxlbmd0aCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nKCdpbmZvJywgYFByb2ZpbGVkIHJlYnVpbGQgJHtudW19IHRpbWVzOiAke2F2Z30gYXZnICgke01hdGgubWluKC4uLnRpbWVzKX0gbWluLCAke01hdGgubWF4KC4uLnRpbWVzKX0gbWF4KWApO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIGN5Y2xlKCk7XG4gICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICAvLyBSZXR1cm4gZ2VvbWV0cnkgY291bnRzIG9mIHZpc2libGUgdGlsZXMsIGdyb3VwZWQgYnkgc3R5bGUgbmFtZVxuICAgICAgICAgICAgZ2VvbWV0cnlDb3VudEJ5U3R5bGUgKCkge1xuICAgICAgICAgICAgICAgIGxldCBjb3VudHMgPSB7fTtcbiAgICAgICAgICAgICAgICBzY2VuZS50aWxlX21hbmFnZXIuZ2V0UmVuZGVyYWJsZVRpbGVzKCkuZm9yRWFjaCh0aWxlID0+IHtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgc3R5bGUgaW4gdGlsZS5tZXNoZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50c1tzdHlsZV0gPSBjb3VudHNbc3R5bGVdIHx8IDA7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb3VudHNbc3R5bGVdICs9IHRpbGUubWVzaGVzW3N0eWxlXS5nZW9tZXRyeV9jb3VudDtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIHJldHVybiBjb3VudHM7XG4gICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICBnZW9tZXRyeUNvdW50QnlCYXNlU3R5bGUgKCkge1xuICAgICAgICAgICAgICAgIGxldCBzdHlsZV9jb3VudHMgPSBzY2VuZS5kZWJ1Zy5nZW9tZXRyeUNvdW50QnlTdHlsZSgpO1xuICAgICAgICAgICAgICAgIGxldCBjb3VudHMgPSB7fTtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBzdHlsZSBpbiBzdHlsZV9jb3VudHMpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGJhc2UgPSBzY2VuZS5zdHlsZXNbc3R5bGVdLmJhc2VTdHlsZSgpO1xuICAgICAgICAgICAgICAgICAgICBjb3VudHNbYmFzZV0gPSBjb3VudHNbYmFzZV0gfHwgMDtcbiAgICAgICAgICAgICAgICAgICAgY291bnRzW2Jhc2VdICs9IHN0eWxlX2NvdW50c1tzdHlsZV07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBjb3VudHM7XG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG4gICAgfVxuXG59XG5cblNjZW5lLmlkID0gMDsgICAgICAgICAvLyB1bmlxdWUgaWQgZm9yIGEgc2NlbmUgaW5zdGFuY2VcblNjZW5lLmdlbmVyYXRpb24gPSAwOyAvLyBpZCB0aGF0IGlzIGluY3JlbWVudGVkIGVhY2ggdGltZSBhIHNjZW5lIGNvbmZpZyBpcyByZS1wYXJzZWRcbiIsImltcG9ydCBVdGlscyBmcm9tICcuL3V0aWxzL3V0aWxzJztcbmltcG9ydCAqIGFzIFVSTHMgZnJvbSAnLi91dGlscy91cmxzJztcbmltcG9ydCBKU1ppcCBmcm9tICdqc3ppcCc7XG5cbmV4cG9ydCBjbGFzcyBTY2VuZUJ1bmRsZSB7XG5cbiAgICBjb25zdHJ1Y3Rvcih1cmwsIHBhdGgsIHBhcmVudCA9IG51bGwpIHtcbiAgICAgICAgdGhpcy51cmwgPSB1cmw7XG5cbiAgICAgICAgLy8gSWYgYSBiYXNlIHBhdGggd2FzIHByb3ZpZGVkLCB1c2UgaXQgZm9yIHJlc29sdmluZyBsb2NhbCBidW5kbGUgcmVzb3VyY2VzIG9ubHkgaWZcbiAgICAgICAgLy8gdGhlIGJhc2UgcGF0aCBpcyBhYnNvbHV0ZSwgb3IgdGhpcyBidW5kbGUncyBwYXRoIGlzIHJlbGF0aXZlXG4gICAgICAgIGlmIChwYXRoICYmICghVVJMcy5pc1JlbGF0aXZlVVJMKHBhdGgpIHx8IFVSTHMuaXNSZWxhdGl2ZVVSTCh0aGlzLnVybCkpKSB7XG4gICAgICAgICAgICB0aGlzLnBhdGggPSBwYXRoO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5wYXRoID0gVVJMcy5wYXRoRm9yVVJMKHRoaXMudXJsKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMucGF0aF9mb3JfcGFyZW50ID0gcGF0aCB8fCB0aGlzLnBhdGg7IC8vIGZvciByZXNvbHZpbmcgcGF0aHMgcmVsYXRpdmUgdG8gYSBwYXJlbnQgYnVuZGxlXG4gICAgICAgIHRoaXMucGFyZW50ID0gcGFyZW50O1xuXG4gICAgICAgIC8vIEFuIGFuY2VzdG9yIGJ1bmRsZSBtYXkgYmUgYSBjb250YWluZXIgKGUuZy4gemlwIGZpbGUpIHRoYXQgbmVlZHMgdG8gcmVzb2x2ZSByZWxhdGl2ZSBwYXRoc1xuICAgICAgICAvLyBmb3IgYW55IHNjZW5lcyBpdCBjb250YWlucywgZS5nLiBgcm9vdC56aXBgIGhhcyBhIGByb290LnlhbWxgIHRoYXQgaW5jbHVkZXMgYSBgZm9sZGVyL2NoaWxkLnlhbWxgOlxuICAgICAgICAvLyByZXNvdXJjZXMgd2l0aGluIGBjaGlsZC55YW1sYCBtdXN0IGJlIHJlc29sdmVkIHRocm91Z2ggdGhlIGJ1bmRsZSBmb3IgYHJvb3QuemlwYFxuICAgICAgICB0aGlzLmNvbnRhaW5lciA9IG51bGw7XG4gICAgICAgIGlmICh0aGlzLnBhcmVudCkge1xuICAgICAgICAgICAgaWYgKHRoaXMucGFyZW50LmNvbnRhaW5lcikge1xuICAgICAgICAgICAgICAgIHRoaXMuY29udGFpbmVyID0gdGhpcy5wYXJlbnQuY29udGFpbmVyO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAodGhpcy5wYXJlbnQuaXNDb250YWluZXIoKSkge1xuICAgICAgICAgICAgICAgIHRoaXMuY29udGFpbmVyID0gdGhpcy5wYXJlbnQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBsb2FkKCkge1xuICAgICAgICByZXR1cm4gVXRpbHMubG9hZFJlc291cmNlKHRoaXMudXJsKTtcbiAgICB9XG5cbiAgICAvLyBJbmZvIGZvciByZXRyaWV2aW5nIGEgc3BlY2lmaWMgcmVzb3VyY2UgZnJvbSB0aGlzIGJ1bmRsZVxuICAgIC8vIHVybDogZnVsbHkgcXVhbGlmaWVkIFVSTCB0byByZXRyaWV2ZSB0aGUgY29udGVudCBvZiB0aGUgcmVzb3VyY2UgKGUuZy4gemlwcyB3aWxsIHRyYW5zZm9ybSB0aGlzIHRvIGJsb2IgVVJMKVxuICAgIC8vIHBhdGg6IG9yaWdpbmFsIHBhdGggb2YgdGhlIHJlc291cmNlIHdpdGhpbiB0aGUgYnVuZGxlIChmb3IgcmVzb2x2aW5nIHBhdGhzIHVwIHRoZSBidW5kbGUgdHJlZSlcbiAgICAvLyB0eXBlOiBmaWxlIGV4dGVuc2lvbiAodXNlZCBmb3IgZGV0ZXJtaW5pbmcgYnVuZGxlIHR5cGUsIGB5YW1sYCBvciBgemlwYClcbiAgICByZXNvdXJjZUZvcih1cmwpIHtcbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIHVybDogdGhpcy51cmxGb3IodXJsKSxcbiAgICAgICAgICAgIHBhdGg6IHRoaXMucGF0aEZvcih1cmwpLFxuICAgICAgICAgICAgdHlwZTogdGhpcy50eXBlRm9yKHVybClcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICB1cmxGb3IodXJsKSB7XG4gICAgICAgIGlmIChpc0dsb2JhbCh1cmwpKSB7XG4gICAgICAgICAgICByZXR1cm4gdXJsO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKFVSTHMuaXNSZWxhdGl2ZVVSTCh1cmwpICYmIHRoaXMuY29udGFpbmVyKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5wYXJlbnQudXJsRm9yKHRoaXMucGF0aF9mb3JfcGFyZW50ICsgdXJsKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gVVJMcy5hZGRCYXNlVVJMKHVybCwgdGhpcy5wYXRoKTtcbiAgICB9XG5cbiAgICBwYXRoRm9yKHVybCkge1xuICAgICAgICByZXR1cm4gVVJMcy5wYXRoRm9yVVJMKHVybCk7XG4gICAgfVxuXG4gICAgdHlwZUZvcih1cmwpIHtcbiAgICAgICAgcmV0dXJuIFVSTHMuZXh0ZW5zaW9uRm9yVVJMKHVybCk7XG4gICAgfVxuXG4gICAgaXNDb250YWluZXIoKSB7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbn1cblxuZXhwb3J0IGNsYXNzIFppcFNjZW5lQnVuZGxlIGV4dGVuZHMgU2NlbmVCdW5kbGUge1xuXG4gICAgY29uc3RydWN0b3IodXJsLCBwYXRoLCBwYXJlbnQpIHtcbiAgICAgICAgc3VwZXIodXJsLCBwYXRoLCBwYXJlbnQpO1xuICAgICAgICB0aGlzLnppcCA9IG51bGw7XG4gICAgICAgIHRoaXMuZmlsZXMgPSB7fTtcbiAgICAgICAgdGhpcy5yb290ID0gbnVsbDtcbiAgICAgICAgdGhpcy5wYXRoID0gJyc7XG4gICAgfVxuXG4gICAgaXNDb250YWluZXIoKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGxvYWQoKSB7XG4gICAgICAgIHRoaXMuemlwID0gbmV3IEpTWmlwKCk7XG5cbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLnVybCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIHJldHVybiBVdGlscy5pbyh0aGlzLnVybCwgNjAwMDAsICdhcnJheWJ1ZmZlcicpXG4gICAgICAgICAgICAgICAgLnRoZW4oYm9keSA9PiB0aGlzLnppcC5sb2FkQXN5bmMoYm9keSkpXG4gICAgICAgICAgICAgICAgLnRoZW4oKCkgPT4gdGhpcy5wYXJzZVppcEZpbGVzKCkpXG4gICAgICAgICAgICAgICAgLnRoZW4oKCkgPT4gdGhpcy5sb2FkUm9vdCgpKVxuICAgICAgICAgICAgICAgIC5jYXRjaChlID0+IFByb21pc2UucmVqZWN0KGUpKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUodGhpcyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICB1cmxGb3IodXJsKSB7XG4gICAgICAgIGlmIChpc0dsb2JhbCh1cmwpKSB7XG4gICAgICAgICAgICByZXR1cm4gdXJsO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKFVSTHMuaXNSZWxhdGl2ZVVSTCh1cmwpKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy51cmxGb3JaaXBGaWxlKFVSTHMuZmxhdHRlblJlbGF0aXZlVVJMKHVybCkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBzdXBlci51cmxGb3IodXJsKTtcbiAgICB9XG5cbiAgICB0eXBlRm9yKHVybCkge1xuICAgICAgICBpZiAoVVJMcy5pc1JlbGF0aXZlVVJMKHVybCkpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnR5cGVGb3JaaXBGaWxlKHVybCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHN1cGVyLnR5cGVGb3IodXJsKTtcbiAgICB9XG5cbiAgICBsb2FkUm9vdCgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZmluZFJvb3QoKVxuICAgICAgICAgICAgLnRoZW4oKCkgPT4gVXRpbHMubG9hZFJlc291cmNlKHRoaXMudXJsRm9yWmlwRmlsZSh0aGlzLnJvb3QpKSk7XG4gICAgfVxuXG4gICAgZmluZFJvb3QoKSB7XG4gICAgICAgIC8vIFRoZXJlIG11c3QgYmUgYSBzaW5nbGUgWUFNTCBmaWxlIGF0IHRoZSB0b3AgbGV2ZWwgb2YgdGhlIHppcFxuICAgICAgICBjb25zdCB5YW1scyA9IE9iamVjdC5rZXlzKHRoaXMuZmlsZXMpXG4gICAgICAgICAgICAuZmlsdGVyKHBhdGggPT4gdGhpcy5maWxlc1twYXRoXS5kZXB0aCA9PT0gMClcbiAgICAgICAgICAgIC5maWx0ZXIocGF0aCA9PiBVUkxzLmV4dGVuc2lvbkZvclVSTChwYXRoKSA9PT0gJ3lhbWwnKTtcblxuICAgICAgICBpZiAoeWFtbHMubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgICB0aGlzLnJvb3QgPSB5YW1sc1swXTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIE5vIHJvb3QgZm91bmRcbiAgICAgICAgaWYgKCF0aGlzLnJvb3QpIHtcbiAgICAgICAgICAgIGxldCBtc2cgPSBgQ291bGQgbm90IGZpbmQgcm9vdCBzY2VuZSBmb3IgYnVuZGxlICcke3RoaXMudXJsfSc6IGA7XG4gICAgICAgICAgICBtc2cgKz0gYFRoZSB6aXAgYXJjaGl2ZSdzIHJvb3QgbGV2ZWwgbXVzdCBjb250YWluIGEgc2luZ2xlIHNjZW5lIGZpbGUgd2l0aCB0aGUgJy55YW1sJyBleHRlbnNpb24uIGA7XG4gICAgICAgICAgICBpZiAoeWFtbHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIG1zZyArPSBgRm91bmQgbXVsdGlwbGUgWUFNTCBmaWxlcyBhdCB0aGUgcm9vdCBsZXZlbDogJHt5YW1scy5tYXAociA9PiAnXFwnJyArIHIgKyAnXFwnJyApLmpvaW4oJywgJyl9LmA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBtc2cgKz0gYEZvdW5kIE5PIFlBTUwgZmlsZXMgYXQgdGhlIHJvb3QgbGV2ZWwuYDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChFcnJvcihtc2cpKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKCk7XG4gICAgfVxuXG4gICAgcGFyc2VaaXBGaWxlcygpIHtcbiAgICAgICAgbGV0IHBhdGhzID0gW107XG4gICAgICAgIGxldCBxdWV1ZSA9IFtdO1xuICAgICAgICB0aGlzLnppcC5mb3JFYWNoKChwYXRoLCBmaWxlKSA9PiB7XG4gICAgICAgICAgICBpZiAoIWZpbGUuZGlyKSB7XG4gICAgICAgICAgICAgICAgcGF0aHMucHVzaChwYXRoKTtcbiAgICAgICAgICAgICAgICBxdWV1ZS5wdXNoKGZpbGUuYXN5bmMoJ2FycmF5YnVmZmVyJykpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gUHJvbWlzZS5hbGwocXVldWUpLnRoZW4oZGF0YSA9PiB7XG4gICAgICAgICAgICBmb3IgKGxldCBpPTA7IGkgPCBkYXRhLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgbGV0IHBhdGggPSBwYXRoc1tpXTtcbiAgICAgICAgICAgICAgICBsZXQgZGVwdGggPSBwYXRoLnNwbGl0KCcvJykubGVuZ3RoIC0gMTtcbiAgICAgICAgICAgICAgICB0aGlzLmZpbGVzW3BhdGhdID0ge1xuICAgICAgICAgICAgICAgICAgICBkYXRhOiBkYXRhW2ldLFxuICAgICAgICAgICAgICAgICAgICB0eXBlOiBVUkxzLmV4dGVuc2lvbkZvclVSTChwYXRoKSxcbiAgICAgICAgICAgICAgICAgICAgZGVwdGhcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICB1cmxGb3JaaXBGaWxlKGZpbGUpIHtcbiAgICAgICAgaWYgKHRoaXMuZmlsZXNbZmlsZV0pIHtcbiAgICAgICAgICAgIGlmICghdGhpcy5maWxlc1tmaWxlXS51cmwpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmZpbGVzW2ZpbGVdLnVybCA9IFVSTHMuY3JlYXRlT2JqZWN0VVJMKG5ldyBCbG9iKFt0aGlzLmZpbGVzW2ZpbGVdLmRhdGFdKSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiB0aGlzLmZpbGVzW2ZpbGVdLnVybDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHR5cGVGb3JaaXBGaWxlKGZpbGUpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuZmlsZXNbZmlsZV0gJiYgdGhpcy5maWxlc1tmaWxlXS50eXBlO1xuICAgIH1cblxufVxuXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlU2NlbmVCdW5kbGUodXJsLCBwYXRoLCBwYXJlbnQsIHR5cGUgPSBudWxsKSB7XG4gICAgaWYgKHR5cGUgPT09ICd6aXAnIHx8ICh0eXBlb2YgdXJsID09PSAnc3RyaW5nJyAmJiBVUkxzLmV4dGVuc2lvbkZvclVSTCh1cmwpID09PSAnemlwJykpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBaaXBTY2VuZUJ1bmRsZSh1cmwsIHBhdGgsIHBhcmVudCk7XG4gICAgfVxuICAgIHJldHVybiBuZXcgU2NlbmVCdW5kbGUodXJsLCBwYXRoLCBwYXJlbnQpO1xufVxuXG4vLyBSZWZlcmVuY2VzIGEgZ2xvYmFsIHByb3BlcnR5P1xuZXhwb3J0IGZ1bmN0aW9uIGlzR2xvYmFsICh2YWwpIHtcbiAgICBpZiAodmFsICYmIHZhbC5zbGljZSgwLCA3KSA9PT0gJ2dsb2JhbC4nKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG59XG4iLCJpbXBvcnQgbG9nIGZyb20gJy4vdXRpbHMvbG9nJztcbmltcG9ydCBHTFNMIGZyb20gJy4vZ2wvZ2xzbCc7XG5pbXBvcnQgKiBhcyBVUkxzIGZyb20gJy4vdXRpbHMvdXJscyc7XG5pbXBvcnQgbWVyZ2VPYmplY3RzIGZyb20gJy4vdXRpbHMvbWVyZ2UnO1xuaW1wb3J0IHN1YnNjcmliZU1peGluIGZyb20gJy4vdXRpbHMvc3Vic2NyaWJlJztcbmltcG9ydCB7Y3JlYXRlU2NlbmVCdW5kbGUsIGlzR2xvYmFsfSBmcm9tICcuL3NjZW5lX2J1bmRsZSc7XG5cbnZhciBTY2VuZUxvYWRlcjtcblxuZXhwb3J0IGRlZmF1bHQgU2NlbmVMb2FkZXIgPSB7XG5cbiAgICAvLyBMb2FkIHNjZW5lcyBkZWZpbml0aW9ucyBmcm9tIFVSTCAmIHByb3Byb2Nlc3NcbiAgICBsb2FkU2NlbmUodXJsLCBwYXRoID0gbnVsbCkge1xuICAgICAgICBsZXQgZXJyb3JzID0gW107XG4gICAgICAgIHJldHVybiB0aGlzLmxvYWRTY2VuZVJlY3Vyc2l2ZSh7IHVybCwgcGF0aCB9LCBudWxsLCBlcnJvcnMpLlxuICAgICAgICAgICAgdGhlbihjb25maWcgPT4gdGhpcy5maW5hbGl6ZShjb25maWcpKS5cbiAgICAgICAgICAgIHRoZW4oY29uZmlnID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoIWNvbmZpZykge1xuICAgICAgICAgICAgICAgICAgICAvLyByb290IHNjZW5lIGZhaWxlZCB0byBsb2FkLCByZWplY3Qgd2l0aCBmaXJzdCBlcnJvclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoZXJyb3JzWzBdKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoZXJyb3JzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gc2NlbmUgbG9hZGVkLCBidXQgc29tZSBpbXBvcnRzIGhhZCBlcnJvcnNcbiAgICAgICAgICAgICAgICAgICAgZXJyb3JzLmZvckVhY2goZXJyb3IgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG1lc3NhZ2UgPSBgRmFpbGVkIHRvIGltcG9ydCBzY2VuZTogJHtlcnJvci51cmx9YDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxvZygnZXJyb3InLCBtZXNzYWdlLCBlcnJvcik7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnRyaWdnZXIoJ2Vycm9yJywgeyB0eXBlOiAnc2NlbmVfaW1wb3J0JywgbWVzc2FnZSwgZXJyb3IsIHVybDogZXJyb3IudXJsIH0pO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIGNvbmZpZztcbiAgICAgICAgICAgIH0pO1xuICAgIH0sXG5cbiAgICAvLyBMb2FkcyBzY2VuZSBmaWxlcyBmcm9tIFVSTCwgcmVjdXJzaXZlbHkgbG9hZGluZyAnaW1wb3J0JyBzY2VuZXNcbiAgICAvLyBPcHRpb25hbCAqaW5pdGlhbCogcGF0aCBvbmx5ICh3b24ndCBiZSBwYXNzZWQgdG8gcmVjdXJzaXZlICdpbXBvcnQnIGNhbGxzKVxuICAgIC8vIFVzZWZ1bCBmb3IgbG9hZGluZyByZXNvdXJjZXMgaW4gYmFzZSBzY2VuZSBmaWxlIGZyb20gYSBzZXBhcmF0ZSBsb2NhdGlvblxuICAgIC8vIChlLmcuIGluIFRhbmdyYW0gUGxheSwgd2hlbiBtb2RpZmllZCBsb2NhbCBzY2VuZSBzaG91bGQgc3RpbGwgcmVmZXIgdG8gb3JpZ2luYWwgcmVzb3VyY2UgVVJMcylcbiAgICBsb2FkU2NlbmVSZWN1cnNpdmUoeyB1cmwsIHBhdGgsIHR5cGUgfSwgcGFyZW50LCBlcnJvcnMgPSBbXSkge1xuICAgICAgICBpZiAoIXVybCkge1xuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh7fSk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgYnVuZGxlID0gY3JlYXRlU2NlbmVCdW5kbGUodXJsLCBwYXRoLCBwYXJlbnQsIHR5cGUpO1xuXG4gICAgICAgIHJldHVybiBidW5kbGUubG9hZCgpLnRoZW4oY29uZmlnID0+IHtcbiAgICAgICAgICAgIGlmIChjb25maWcuaW1wb3J0ID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICB0aGlzLm5vcm1hbGl6ZShjb25maWcsIGJ1bmRsZSk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGNvbmZpZztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gYWNjZXB0IHNpbmdsZSBlbnRyeSBvciBhcnJheVxuICAgICAgICAgICAgaWYgKCFBcnJheS5pc0FycmF5KGNvbmZpZy5pbXBvcnQpKSB7XG4gICAgICAgICAgICAgICAgY29uZmlnLmltcG9ydCA9IFtjb25maWcuaW1wb3J0XTsgLy8gY29udmVydCB0byBhcnJheVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBDb2xsZWN0IFVSTHMgb2Ygc2NlbmVzIHRvIGltcG9ydFxuICAgICAgICAgICAgbGV0IGltcG9ydHMgPSBbXTtcbiAgICAgICAgICAgIGNvbmZpZy5pbXBvcnQuZm9yRWFjaCh1cmwgPT4ge1xuICAgICAgICAgICAgICAgIC8vIENvbnZlcnQgc2NlbmUgb2JqZWN0cyB0byBVUkxzXG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiB1cmwgPT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICAgICAgICAgIHVybCA9IFVSTHMuY3JlYXRlT2JqZWN0VVJMKG5ldyBCbG9iKFtKU09OLnN0cmluZ2lmeSh1cmwpXSkpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGltcG9ydHMucHVzaChidW5kbGUucmVzb3VyY2VGb3IodXJsKSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIGRlbGV0ZSBjb25maWcuaW1wb3J0OyAvLyBkb24ndCB3YW50IHRvIG1lcmdlIHRoaXMgcHJvcGVydHlcblxuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UuXG4gICAgICAgICAgICBhbGwoaW1wb3J0cy5tYXAocmVzb3VyY2UgPT4gdGhpcy5sb2FkU2NlbmVSZWN1cnNpdmUocmVzb3VyY2UsIGJ1bmRsZSwgZXJyb3JzKSkpLlxuICAgICAgICAgICAgICAgIHRoZW4oY29uZmlncyA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvbmZpZyA9IG1lcmdlT2JqZWN0cyh7fSwgLi4uY29uZmlncywgY29uZmlnKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5ub3JtYWxpemUoY29uZmlnLCBidW5kbGUpO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29uZmlnO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICB9KS5jYXRjaChlcnJvciA9PiB7XG4gICAgICAgICAgICAvLyBDb2xsZWN0IHNjZW5lIGxvYWQgZXJyb3JzIGFzIHdlIGdvXG4gICAgICAgICAgICBlcnJvci51cmwgPSB1cmw7XG4gICAgICAgICAgICBlcnJvcnMucHVzaChlcnJvcik7XG4gICAgICAgIH0pO1xuICAgIH0sXG5cbiAgICAvLyBOb3JtYWxpemUgcHJvcGVydGllcyB0aGF0IHNob3VsZCBiZSBhZGp1c3Qgd2l0aGluIGVhY2ggbG9jYWwgc2NlbmUgZmlsZSAodXN1YWxseSBieSBwYXRoKVxuICAgIG5vcm1hbGl6ZShjb25maWcsIGJ1bmRsZSkge1xuICAgICAgICB0aGlzLm5vcm1hbGl6ZURhdGFTb3VyY2VzKGNvbmZpZywgYnVuZGxlKTtcbiAgICAgICAgdGhpcy5ub3JtYWxpemVGb250cyhjb25maWcsIGJ1bmRsZSk7XG4gICAgICAgIHRoaXMubm9ybWFsaXplVGV4dHVyZXMoY29uZmlnLCBidW5kbGUpO1xuICAgICAgICByZXR1cm4gY29uZmlnO1xuICAgIH0sXG5cbiAgICAvLyBFeHBhbmQgcGF0aHMgZm9yIGRhdGEgc291cmNlXG4gICAgbm9ybWFsaXplRGF0YVNvdXJjZXMoY29uZmlnLCBidW5kbGUpIHtcbiAgICAgICAgY29uZmlnLnNvdXJjZXMgPSBjb25maWcuc291cmNlcyB8fCB7fTtcblxuICAgICAgICBmb3IgKGxldCBzbiBpbiBjb25maWcuc291cmNlcykge1xuICAgICAgICAgICAgbGV0IHNvdXJjZSA9IGNvbmZpZy5zb3VyY2VzW3NuXTtcbiAgICAgICAgICAgIHNvdXJjZS51cmwgPSBidW5kbGUudXJsRm9yKHNvdXJjZS51cmwpO1xuXG4gICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShzb3VyY2Uuc2NyaXB0cykpIHtcbiAgICAgICAgICAgICAgICBzb3VyY2Uuc2NyaXB0cyA9IHNvdXJjZS5zY3JpcHRzLm1hcCh1cmwgPT4gYnVuZGxlLnVybEZvcih1cmwpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBjb25maWc7XG4gICAgfSxcblxuICAgIC8vIEV4cGFuZCBwYXRocyBmb3IgZm9udHNcbiAgICBub3JtYWxpemVGb250cyhjb25maWcsIGJ1bmRsZSkge1xuICAgICAgICBjb25maWcuZm9udHMgPSBjb25maWcuZm9udHMgfHwge307XG5cbiAgICAgICAgZm9yIChsZXQgZmFtaWx5IGluIGNvbmZpZy5mb250cykge1xuICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoY29uZmlnLmZvbnRzW2ZhbWlseV0pKSB7XG4gICAgICAgICAgICAgICAgY29uZmlnLmZvbnRzW2ZhbWlseV0uZm9yRWFjaChmYWNlID0+IHtcbiAgICAgICAgICAgICAgICAgICAgZmFjZS51cmwgPSBmYWNlLnVybCAmJiBidW5kbGUudXJsRm9yKGZhY2UudXJsKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGxldCBmYWNlID0gY29uZmlnLmZvbnRzW2ZhbWlseV07XG4gICAgICAgICAgICAgICAgZmFjZS51cmwgPSBmYWNlLnVybCAmJiBidW5kbGUudXJsRm9yKGZhY2UudXJsKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBjb25maWc7XG4gICAgfSxcblxuICAgIC8vIEV4cGFuZCBwYXRocyBhbmQgY2VudHJhbGl6ZSB0ZXh0dXJlIGRlZmluaXRpb25zIGZvciBhIHNjZW5lIG9iamVjdFxuICAgIG5vcm1hbGl6ZVRleHR1cmVzKGNvbmZpZywgYnVuZGxlKSB7XG4gICAgICAgIGNvbmZpZy50ZXh0dXJlcyA9IGNvbmZpZy50ZXh0dXJlcyB8fCB7fTtcblxuICAgICAgICAvLyBBZGQgY3VycmVudCBzY2VuZSdzIGJhc2UgcGF0aCB0byBnbG9iYWxseSBkZWZpbmVkIHRleHR1cmVzXG4gICAgICAgIC8vIE9ubHkgYWRkcyBwYXRoIGZvciB0ZXh0dXJlcyB3aXRoIHJlbGF0aXZlIFVSTHMsIHNvIHRleHR1cmVzIGluIGltcG9ydGVkIHNjZW5lcyBnZXQgdGhlIGJhc2VcbiAgICAgICAgLy8gcGF0aCBvZiB0aGVpciBpbW1lZGlhdGUgc2NlbmUgZmlsZVxuICAgICAgICBpZiAoY29uZmlnLnRleHR1cmVzKSB7XG4gICAgICAgICAgICBmb3IgKGxldCB0biBpbiBjb25maWcudGV4dHVyZXMpIHtcbiAgICAgICAgICAgICAgICBsZXQgdGV4dHVyZSA9IGNvbmZpZy50ZXh0dXJlc1t0bl07XG4gICAgICAgICAgICAgICAgaWYgKHRleHR1cmUudXJsKSB7XG4gICAgICAgICAgICAgICAgICAgIHRleHR1cmUudXJsID0gYnVuZGxlLnVybEZvcih0ZXh0dXJlLnVybCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gUmVzb2x2ZSBVUkxzIGZvciBpbmxpbmUgdGV4dHVyZXNcbiAgICAgICAgaWYgKGNvbmZpZy5zdHlsZXMpIHtcbiAgICAgICAgICAgIGZvciAobGV0IHNuIGluIGNvbmZpZy5zdHlsZXMpIHtcbiAgICAgICAgICAgICAgICBsZXQgc3R5bGUgPSBjb25maWcuc3R5bGVzW3NuXTtcblxuICAgICAgICAgICAgICAgIC8vIFN0eWxlIGB0ZXh0dXJlYFxuICAgICAgICAgICAgICAgIGxldCB0ZXggPSBzdHlsZS50ZXh0dXJlO1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgdGV4ID09PSAnc3RyaW5nJyAmJiAhY29uZmlnLnRleHR1cmVzW3RleF0gJiYgIWlzR2xvYmFsKHRleCkpIHtcbiAgICAgICAgICAgICAgICAgICAgc3R5bGUudGV4dHVyZSA9IGJ1bmRsZS51cmxGb3IodGV4KTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyBNYXRlcmlhbFxuICAgICAgICAgICAgICAgIGlmIChzdHlsZS5tYXRlcmlhbCkge1xuICAgICAgICAgICAgICAgICAgICBbJ2VtaXNzaW9uJywgJ2FtYmllbnQnLCAnZGlmZnVzZScsICdzcGVjdWxhcicsICdub3JtYWwnXS5mb3JFYWNoKHByb3AgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gTWF0ZXJpYWwgcHJvcGVydHkgaGFzIGEgdGV4dHVyZVxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHRleCA9IHN0eWxlLm1hdGVyaWFsW3Byb3BdICE9IG51bGwgJiYgc3R5bGUubWF0ZXJpYWxbcHJvcF0udGV4dHVyZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgdGV4ID09PSAnc3RyaW5nJyAmJiAhY29uZmlnLnRleHR1cmVzW3RleF0gJiYgIWlzR2xvYmFsKHRleCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHlsZS5tYXRlcmlhbFtwcm9wXS50ZXh0dXJlID0gYnVuZGxlLnVybEZvcih0ZXgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyBTaGFkZXIgdW5pZm9ybXNcbiAgICAgICAgICAgICAgICBpZiAoc3R5bGUuc2hhZGVycyAmJiBzdHlsZS5zaGFkZXJzLnVuaWZvcm1zKSB7XG4gICAgICAgICAgICAgICAgICAgIEdMU0wucGFyc2VVbmlmb3JtcyhzdHlsZS5zaGFkZXJzLnVuaWZvcm1zKS5mb3JFYWNoKCh7dHlwZSwgdmFsdWUsIGtleSwgdW5pZm9ybXN9KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBUZXh0dXJlIGJ5IFVSTCAoc3RyaW5nLW5hbWVkIHRleHR1cmUgbm90IHJlZmVyZW5jaW5nIGV4aXN0aW5nIHRleHR1cmUgZGVmaW5pdGlvbilcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlID09PSAnc2FtcGxlcjJEJyAmJiB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnICYmICFjb25maWcudGV4dHVyZXNbdmFsdWVdICYmICFpc0dsb2JhbCh2YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmlmb3Jtc1trZXldID0gYnVuZGxlLnVybEZvcih2YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBjb25maWc7XG4gICAgfSxcblxuICAgIC8vIFN1YnN0aXR1dGVzIGdsb2JhbCBzY2VuZSBwcm9wZXJ0aWVzICh0aG9zZSBkZWZpbmVkIGluIHRoZSBgY29uZmlnLmdsb2JhbGAgb2JqZWN0KSBmb3IgYW55IHN0eWxlIHZhbHVlc1xuICAgIC8vIG9mIHRoZSBmb3JtIGBnbG9iYWwuYCwgZm9yIGV4YW1wbGUgYGNvbG9yOiBnbG9iYWwucGFya19jb2xvcmAgd291bGQgYmUgcmVwbGFjZWQgd2l0aCB0aGUgdmFsdWUgKGlmIGFueSlcbiAgICAvLyBkZWZpbmVkIGZvciB0aGUgYHBhcmtfY29sb3JgIHByb3BlcnR5IGluIGBjb25maWcuZ2xvYmFsLnBhcmtfY29sb3JgLlxuICAgIGFwcGx5R2xvYmFsUHJvcGVydGllcyhjb25maWcsIGFwcGxpZWQpIHtcbiAgICAgICAgaWYgKCFjb25maWcuZ2xvYmFsIHx8IE9iamVjdC5rZXlzKGNvbmZpZy5nbG9iYWwpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIGNvbmZpZzsgLy8gbm8gZ2xvYmFsIHByb3BlcnRpZXMgdG8gdHJhbnNmb3JtXG4gICAgICAgIH1cblxuICAgICAgICAvLyBQYXJzZSBwcm9wZXJ0aWVzIGZyb20gZ2xvYmFsc1xuICAgICAgICBjb25zdCBzZXBhcmF0b3IgPSAnOic7XG4gICAgICAgIGNvbnN0IHByb3BzID0gZmxhdHRlblByb3BlcnRpZXMoY29uZmlnLmdsb2JhbCwgc2VwYXJhdG9yKTtcblxuICAgICAgICAvLyBSZS1hcHBseSBwcmV2aW91c2x5IGFwcGxpZWQgcHJvcGVydGllc1xuICAgICAgICAvLyBOQjogYSBjdXJyZW50IHNob3J0Y29taW5nIGhlcmUgaXMgdGhhdCB5b3UgY2Fubm90IFwidW4tbGlua1wiIGEgdGFyZ2V0IHByb3BlcnR5IGZyb20gYSBnbG9iYWxcbiAgICAgICAgLy8gYXQgcnVuLXRpbWUuIE9uY2UgYSBnbG9iYWwgcHJvcGVydHkgc3Vic3RpdHV0aW9uIGhhcyBiZWVuIHJlY29yZGVyZCwgaXQgd2lsbCBhbHdheXMgYmUgcmUtYXBwbGllZFxuICAgICAgICAvLyBvbiBzdWJzZXF1ZW50IHNjZW5lIHVwZGF0ZXMsIGV2ZW4gaWYgdGhlIHRhcmdldCBwcm9wZXJ0eSB3YXMgdXBkYXRlZCB0byBhbm90aGVyIGxpdGVyYWwgdmFsdWUuXG4gICAgICAgIC8vIFRoaXMgaXMgdW5saWtlbHkgdG8gYmUgYSBjb21tb24gb2NjdXJyZW5jZSBhbiBhY2NlcHRhYmxlIGxpbWl0YXRpb24gZm9yIG5vdy5cbiAgICAgICAgYXBwbGllZC5mb3JFYWNoKCh7IHByb3AsIHRhcmdldCwga2V5IH0pID0+IHtcbiAgICAgICAgICAgIGlmICh0YXJnZXQpIHtcbiAgICAgICAgICAgICAgICB0YXJnZXRba2V5XSA9IHByb3BzW3Byb3BdO1xuICAgICAgICAgICAgICAgIC8vIGxvZygnaW5mbycsIGBSZS1hcHBseWluZyAke3Byb3B9IHdpdGggdmFsdWUgJHtwcm9wc1twcm9wXX0gdG8ga2V5ICR7a2V5fSBpbmAsIHRhcmdldCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIEZpbmQgYW5kIGFwcGx5IG5ldyBwcm9wZXJ0aWVzXG4gICAgICAgIGZ1bmN0aW9uIGFwcGx5UHJvcHMgKG9iaiwgdGFyZ2V0LCBrZXkpIHtcbiAgICAgICAgICAgIC8vIENvbnZlcnQgc3RyaW5nXG4gICAgICAgICAgICBpZiAodHlwZW9mIG9iaiA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBwcm9wID0gKG9iai5zbGljZSgwLCA3KSA9PT0gJ2dsb2JhbC4nKSAmJiAob2JqLnNsaWNlKDcpLnJlcGxhY2UoL1xcLi9nLCBzZXBhcmF0b3IpKTtcbiAgICAgICAgICAgICAgICBpZiAocHJvcCAmJiBwcm9wc1twcm9wXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIFNhdmUgcmVjb3JkIG9mIHdoZXJlIHByb3BlcnR5IGlzIGFwcGxpZWRcbiAgICAgICAgICAgICAgICAgICAgYXBwbGllZC5wdXNoKHsgcHJvcCwgdGFyZ2V0LCBrZXkgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gQXBwbHkgcHJvcGVydHlcbiAgICAgICAgICAgICAgICAgICAgb2JqID0gcHJvcHNbcHJvcF07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gTG9vcCB0aHJvdWdoIG9iamVjdCBwcm9wZXJ0aWVzXG4gICAgICAgICAgICBlbHNlIGlmICh0eXBlb2Ygb2JqID09PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgICAgIGZvciAobGV0IHAgaW4gb2JqKSB7XG4gICAgICAgICAgICAgICAgICAgIG9ialtwXSA9IGFwcGx5UHJvcHMob2JqW3BdLCBvYmosIHApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBvYmo7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gYXBwbHlQcm9wcyhjb25maWcpO1xuICAgIH0sXG5cbiAgICAvLyBNb3ZlIGlubGluZSAoVVJMIHN0cmluZykgdGV4dHVyZXMgdG8gdGhlIHNjZW5lJ3MgdG9wLWxldmVsIHNldCBvZiB0ZXh0dXJlcyAoY29uZmlnLnRleHR1cmVzKS5cbiAgICAvLyBUaGVyZSBhcmUgMyBzdWNoIGNhc2VzIG9mIHRleHR1cmVzOlxuICAgIC8vIC0gaW4gYSBzdHlsZSdzIGB0ZXh0dXJlYCBwcm9wZXJ0eVxuICAgIC8vIC0gaW4gYSBzdHlsZSdzIGBtYXRlcmlhbGAgcHJvcGVydGllc1xuICAgIC8vIC0gaW4gYSBzdHlsZSdzIGN1c3RvbSB1bmlmb3JtcyAoYHNoYWRlcnMudW5pZm9ybXNgKVxuICAgIGhvaXN0VGV4dHVyZXMgKGNvbmZpZykge1xuICAgICAgICBpZiAoY29uZmlnLnN0eWxlcykge1xuICAgICAgICAgICAgZm9yIChsZXQgc24gaW4gY29uZmlnLnN0eWxlcykge1xuICAgICAgICAgICAgICAgIGxldCBzdHlsZSA9IGNvbmZpZy5zdHlsZXNbc25dO1xuXG4gICAgICAgICAgICAgICAgLy8gU3R5bGUgYHRleHR1cmVgXG4gICAgICAgICAgICAgICAgbGV0IHRleCA9IHN0eWxlLnRleHR1cmU7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiB0ZXggPT09ICdzdHJpbmcnICYmICFjb25maWcudGV4dHVyZXNbdGV4XSkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgdXJsID0gdGV4O1xuICAgICAgICAgICAgICAgICAgICBsZXQgbmFtZSA9IGlzR2xvYmFsKHVybCkgPyBgdGV4dHVyZS0ke3VybH1gIDogdXJsO1xuICAgICAgICAgICAgICAgICAgICBjb25maWcudGV4dHVyZXNbbmFtZV0gPSB7IHVybCB9O1xuICAgICAgICAgICAgICAgICAgICBzdHlsZS50ZXh0dXJlID0gbmFtZTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyBNYXRlcmlhbFxuICAgICAgICAgICAgICAgIGlmIChzdHlsZS5tYXRlcmlhbCkge1xuICAgICAgICAgICAgICAgICAgICBbJ2VtaXNzaW9uJywgJ2FtYmllbnQnLCAnZGlmZnVzZScsICdzcGVjdWxhcicsICdub3JtYWwnXS5mb3JFYWNoKHByb3AgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gTWF0ZXJpYWwgcHJvcGVydHkgaGFzIGEgdGV4dHVyZVxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHRleCA9IHN0eWxlLm1hdGVyaWFsW3Byb3BdICE9IG51bGwgJiYgc3R5bGUubWF0ZXJpYWxbcHJvcF0udGV4dHVyZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgdGV4ID09PSAnc3RyaW5nJyAmJiAhY29uZmlnLnRleHR1cmVzW3RleF0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgdXJsID0gdGV4O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBuYW1lID0gaXNHbG9iYWwodXJsKSA/IGB0ZXh0dXJlLSR7dXJsfWAgOiB1cmw7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnLnRleHR1cmVzW25hbWVdID0geyB1cmwgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHlsZS5tYXRlcmlhbFtwcm9wXS50ZXh0dXJlID0gbmFtZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gU2hhZGVyIHVuaWZvcm1zXG4gICAgICAgICAgICAgICAgaWYgKHN0eWxlLnNoYWRlcnMgJiYgc3R5bGUuc2hhZGVycy51bmlmb3Jtcykge1xuICAgICAgICAgICAgICAgICAgICBHTFNMLnBhcnNlVW5pZm9ybXMoc3R5bGUuc2hhZGVycy51bmlmb3JtcykuZm9yRWFjaCgoe3R5cGUsIHZhbHVlLCBrZXksIHVuaWZvcm1zfSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGV4dHVyZSBieSBVUkwgKHN0cmluZy1uYW1lZCB0ZXh0dXJlIG5vdCByZWZlcmVuY2luZyBleGlzdGluZyB0ZXh0dXJlIGRlZmluaXRpb24pXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZSA9PT0gJ3NhbXBsZXIyRCcgJiYgdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyAmJiAhY29uZmlnLnRleHR1cmVzW3ZhbHVlXSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCB1cmwgPSB2YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgbmFtZSA9IGlzR2xvYmFsKHVybCkgPyBgdGV4dHVyZS0ke3VybH1gIDogdXJsO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy50ZXh0dXJlc1tuYW1lXSA9IHsgdXJsIH07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5pZm9ybXNba2V5XSA9IG5hbWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvLyBOb3JtYWxpemUgc29tZSBzY2VuZS13aWRlIHNldHRpbmdzIHRoYXQgYXBwbHkgdG8gdGhlIGZpbmFsLCBtZXJnZWQgc2NlbmVcbiAgICBmaW5hbGl6ZShjb25maWcpIHtcbiAgICAgICAgaWYgKCFjb25maWcpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEVuc3VyZSB0b3AtbGV2ZWwgcHJvcGVydGllc1xuICAgICAgICBjb25maWcuc2NlbmUgPSBjb25maWcuc2NlbmUgfHwge307XG4gICAgICAgIGNvbmZpZy5jYW1lcmFzID0gY29uZmlnLmNhbWVyYXMgfHwge307XG4gICAgICAgIGNvbmZpZy5saWdodHMgPSBjb25maWcubGlnaHRzIHx8IHt9O1xuICAgICAgICBjb25maWcuc3R5bGVzID0gY29uZmlnLnN0eWxlcyB8fCB7fTtcbiAgICAgICAgY29uZmlnLmxheWVycyA9IGNvbmZpZy5sYXllcnMgfHwge307XG5cbiAgICAgICAgLy8gQXNzaWduIGlkcyB0byBkYXRhIHNvdXJjZXNcbiAgICAgICAgbGV0IHNvdXJjZV9pZCA9IDA7XG4gICAgICAgIGZvciAobGV0IHNvdXJjZSBpbiBjb25maWcuc291cmNlcykge1xuICAgICAgICAgICAgY29uZmlnLnNvdXJjZXNbc291cmNlXS5pZCA9IHNvdXJjZV9pZCsrO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gSWYgb25seSBvbmUgY2FtZXJhIHNwZWNpZmllZCwgc2V0IGl0IGFzIGRlZmF1bHRcbiAgICAgICAgaWYgKGNvbmZpZy5jYW1lcmEpIHtcbiAgICAgICAgICAgIGNvbmZpZy5jYW1lcmFzLmRlZmF1bHQgPSBjb25maWcuY2FtZXJhO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gSWYgbm8gY2FtZXJhcyBzcGVjaWZpZWQsIGNyZWF0ZSBvbmVcbiAgICAgICAgaWYgKE9iamVjdC5rZXlzKGNvbmZpZy5jYW1lcmFzKS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIGNvbmZpZy5jYW1lcmFzLmRlZmF1bHQgPSB7fTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIElmIG5vIGxpZ2h0cyBzcGVjaWZpZWQsIGNyZWF0ZSBkZWZhdWx0XG4gICAgICAgIGlmIChPYmplY3Qua2V5cyhjb25maWcubGlnaHRzKS5sZW5ndGggPT09IDAgfHxcbiAgICAgICAgICAgIE9iamVjdC5rZXlzKGNvbmZpZy5saWdodHMpLmV2ZXJ5KGkgPT4gY29uZmlnLmxpZ2h0c1tpXS52aXNpYmxlID09PSBmYWxzZSkpIHtcbiAgICAgICAgICAgIGNvbmZpZy5saWdodHMuZGVmYXVsdF9saWdodCA9IHtcbiAgICAgICAgICAgICAgICB0eXBlOiAnZGlyZWN0aW9uYWwnXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGNvbmZpZztcbiAgICB9XG5cbn07XG5cbi8vIEZsYXR0ZW4gbmVzdGVkIHByb3BlcnRpZXMgZm9yIHNpbXBsZXIgc3RyaW5nIGxvb2stdXBzXG4vLyBlLmcuIGdsb2JhbC5iYWNrZ3JvdW5kLmNvbG9yIC0+ICdnbG9iYWw6YmFja2dyb3VuZDpjb2xvcidcbmZ1bmN0aW9uIGZsYXR0ZW5Qcm9wZXJ0aWVzIChvYmosIHNlcGFyYXRvciA9ICc6JywgcHJlZml4ID0gbnVsbCwgcHJvcHMgPSB7fSkge1xuICAgIHByZWZpeCA9IHByZWZpeCA/IChwcmVmaXggKyBzZXBhcmF0b3IpIDogJyc7XG5cbiAgICBmb3IgKGxldCBwIGluIG9iaikge1xuICAgICAgICBsZXQga2V5ID0gcHJlZml4ICsgcDtcbiAgICAgICAgbGV0IHZhbCA9IG9ialtwXTtcbiAgICAgICAgcHJvcHNba2V5XSA9IHZhbDtcblxuICAgICAgICBpZiAodHlwZW9mIHZhbCA9PT0gJ29iamVjdCcgJiYgIUFycmF5LmlzQXJyYXkodmFsKSkge1xuICAgICAgICAgICAgZmxhdHRlblByb3BlcnRpZXModmFsLCBzZXBhcmF0b3IsIGtleSwgcHJvcHMpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBwcm9wcztcbn1cblxuc3Vic2NyaWJlTWl4aW4oU2NlbmVMb2FkZXIpO1xuIiwiLypqc2hpbnQgd29ya2VyOiB0cnVlKi9cbmltcG9ydCBUaHJlYWQgZnJvbSAnLi91dGlscy90aHJlYWQnO1xuaW1wb3J0IFV0aWxzIGZyb20gJy4vdXRpbHMvdXRpbHMnO1xuaW1wb3J0IGxvZyBmcm9tICcuL3V0aWxzL2xvZyc7XG5pbXBvcnQgV29ya2VyQnJva2VyIGZyb20gJy4vdXRpbHMvd29ya2VyX2Jyb2tlcic7IC8vIGpzaGludCBpZ25vcmU6bGluZVxuaW1wb3J0IG1lcmdlT2JqZWN0cyBmcm9tICcuL3V0aWxzL21lcmdlJztcbmltcG9ydCBUaWxlIGZyb20gJy4vdGlsZSc7XG5pbXBvcnQgRGF0YVNvdXJjZSBmcm9tICcuL3NvdXJjZXMvZGF0YV9zb3VyY2UnO1xuaW1wb3J0IEZlYXR1cmVTZWxlY3Rpb24gZnJvbSAnLi9zZWxlY3Rpb24nO1xuaW1wb3J0IHtTdHlsZVBhcnNlcn0gZnJvbSAnLi9zdHlsZXMvc3R5bGVfcGFyc2VyJztcbmltcG9ydCB7U3R5bGVNYW5hZ2VyfSBmcm9tICcuL3N0eWxlcy9zdHlsZV9tYW5hZ2VyJztcbmltcG9ydCB7cGFyc2VMYXllcnN9IGZyb20gJy4vc3R5bGVzL2xheWVyJztcbmltcG9ydCBUZXh0dXJlIGZyb20gJy4vZ2wvdGV4dHVyZSc7XG5cbmV4cG9ydCB2YXIgU2NlbmVXb3JrZXIgPSBzZWxmO1xuXG4vLyBXb3JrZXIgZnVuY3Rpb25hbGl0eSB3aWxsIG9ubHkgYmUgZGVmaW5lZCBpbiB3b3JrZXIgdGhyZWFkXG5pZiAoVGhyZWFkLmlzX3dvcmtlcikge1xuXG5PYmplY3QuYXNzaWduKHNlbGYsIHtcblxuICAgIEZlYXR1cmVTZWxlY3Rpb24sXG5cbiAgICBzb3VyY2VzOiB7fSxcbiAgICBzdHlsZXM6IHt9LFxuICAgIGxheWVyczoge30sXG4gICAgdGlsZXM6IHt9LFxuICAgIG9iamVjdHM6IHt9LFxuICAgIGNvbmZpZzoge30sICAgICAvLyByYXcgY29uZmlnIChlLmcuIGZ1bmN0aW9ucywgZXRjLiBub3QgZXhwYW5kZWQpXG5cbiAgICAvLyBJbml0aWFsaXplIHdvcmtlclxuICAgIGluaXQgKHNjZW5lX2lkLCB3b3JrZXJfaWQsIG51bV93b3JrZXJzLCBsb2dfbGV2ZWwsIGRldmljZV9waXhlbF9yYXRpbykge1xuICAgICAgICBzZWxmLnNjZW5lX2lkID0gc2NlbmVfaWQ7XG4gICAgICAgIHNlbGYuX3dvcmtlcl9pZCA9IHdvcmtlcl9pZDtcbiAgICAgICAgc2VsZi5udW1fd29ya2VycyA9IG51bV93b3JrZXJzO1xuICAgICAgICBsb2cuc2V0TGV2ZWwobG9nX2xldmVsKTtcbiAgICAgICAgVXRpbHMuZGV2aWNlX3BpeGVsX3JhdGlvID0gZGV2aWNlX3BpeGVsX3JhdGlvO1xuICAgICAgICBGZWF0dXJlU2VsZWN0aW9uLnNldFByZWZpeChzZWxmLl93b3JrZXJfaWQpO1xuICAgICAgICBzZWxmLnN0eWxlX21hbmFnZXIgPSBuZXcgU3R5bGVNYW5hZ2VyKCk7XG4gICAgICAgIHJldHVybiB3b3JrZXJfaWQ7XG4gICAgfSxcblxuICAgIC8vIFN0YXJ0cyBhIGNvbmZpZyByZWZyZXNoXG4gICAgdXBkYXRlQ29uZmlnICh7IGNvbmZpZywgZ2VuZXJhdGlvbiwgaW50cm9zcGVjdGlvbiB9KSB7XG4gICAgICAgIGNvbmZpZyA9IEpTT04ucGFyc2UoY29uZmlnKTtcblxuICAgICAgICBzZWxmLmxhc3RfY29uZmlnID0gbWVyZ2VPYmplY3RzKHt9LCBzZWxmLmNvbmZpZyk7XG4gICAgICAgIHNlbGYuY29uZmlnID0gbWVyZ2VPYmplY3RzKHt9LCBjb25maWcpO1xuICAgICAgICBzZWxmLmdlbmVyYXRpb24gPSBnZW5lcmF0aW9uO1xuICAgICAgICBzZWxmLmludHJvc3BlY3Rpb24gPSBpbnRyb3NwZWN0aW9uO1xuXG4gICAgICAgIC8vIERhdGEgYmxvY2sgZnVuY3Rpb25zIGFyZSBub3QgY29udGV4dCB3cmFwcGVkIGxpa2UgdGhlIHJlc3Qgb2YgdGhlIHN0eWxlIGZ1bmN0aW9ucyBhcmVcbiAgICAgICAgLy8gVE9ETzogcHJvYmFibHkgd2FudCBhIGNsZWFuZXIgd2F5IHRvIGV4Y2x1ZGUgdGhlc2VcbiAgICAgICAgZm9yIChsZXQgbGF5ZXIgaW4gY29uZmlnLmxheWVycykge1xuICAgICAgICAgICAgaWYgKGNvbmZpZy5sYXllcnNbbGF5ZXJdKSB7XG4gICAgICAgICAgICAgICAgY29uZmlnLmxheWVyc1tsYXllcl0uZGF0YSA9IFV0aWxzLnN0cmluZ3NUb0Z1bmN0aW9ucyhjb25maWcubGF5ZXJzW2xheWVyXS5kYXRhKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEV4cGFuZCBnbG9iYWwgcHJvcGVydGllc1xuICAgICAgICBzZWxmLmdsb2JhbCA9IFV0aWxzLnN0cmluZ3NUb0Z1bmN0aW9ucyhjb25maWcuZ2xvYmFsKTtcblxuICAgICAgICAvLyBDcmVhdGUgZGF0YSBzb3VyY2VzXG4gICAgICAgIHNlbGYuY3JlYXRlRGF0YVNvdXJjZXMoY29uZmlnKTtcblxuICAgICAgICAvLyBFeHBhbmQgc3R5bGVzXG4gICAgICAgIGNvbmZpZy5zdHlsZXMgPSBVdGlscy5zdHJpbmdzVG9GdW5jdGlvbnMoY29uZmlnLnN0eWxlcywgU3R5bGVQYXJzZXIud3JhcEZ1bmN0aW9uKTtcbiAgICAgICAgc2VsZi5zdHlsZXMgPSBzZWxmLnN0eWxlX21hbmFnZXIuYnVpbGQoY29uZmlnLnN0eWxlcyk7XG4gICAgICAgIHNlbGYuc3R5bGVfbWFuYWdlci5pbml0U3R5bGVzKHtcbiAgICAgICAgICAgIGdlbmVyYXRpb246IHNlbGYuZ2VuZXJhdGlvbixcbiAgICAgICAgICAgIHN0eWxlczogc2VsZi5zdHlsZXMsXG4gICAgICAgICAgICBzb3VyY2VzOiBzZWxmLnNvdXJjZXMsXG4gICAgICAgICAgICBpbnRyb3NwZWN0aW9uOiBzZWxmLmludHJvc3BlY3Rpb25cbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gUGFyc2UgZWFjaCB0b3AtbGV2ZWwgbGF5ZXIgYXMgYSBzZXBhcmF0ZSB0cmVlXG4gICAgICAgIHNlbGYubGF5ZXJzID0gcGFyc2VMYXllcnMoY29uZmlnLmxheWVycywgc2VsZi5zdHlsZV9tYW5hZ2VyLnN0eWxlcyk7XG5cbiAgICAgICAgLy8gU3luYyB0ZXR4dXJlIGluZm8gZnJvbSBtYWluIHRocmVhZFxuICAgICAgICBzZWxmLnN5bmNpbmdfdGV4dHVyZXMgPSBzZWxmLnN5bmNUZXh0dXJlcyhjb25maWcudGV4dHVyZXMpO1xuXG4gICAgICAgIC8vIFJldHVybiBwcm9taXNlIGZvciB3aGVuIGNvbmZpZyByZWZyZXNoIGZpbmlzaGVzXG4gICAgICAgIHNlbGYuY29uZmlndXJpbmcgPSBzZWxmLnN5bmNpbmdfdGV4dHVyZXMudGhlbigoKSA9PiB7XG4gICAgICAgICAgICBsb2coJ2RlYnVnJywgYHVwZGF0ZWQgY29uZmlnYCk7XG4gICAgICAgIH0pO1xuICAgIH0sXG5cbiAgICAvLyBDcmVhdGUgZGF0YSBzb3VyY2VzIGFuZCBjbGVhciB0aWxlIGNhY2hlIGlmIG5lY2Vzc2FyeVxuICAgIGNyZWF0ZURhdGFTb3VyY2VzIChjb25maWcpIHtcbiAgICAgICAgY29uZmlnLnNvdXJjZXMgPSBVdGlscy5zdHJpbmdzVG9GdW5jdGlvbnMoY29uZmlnLnNvdXJjZXMpOyAvLyBwYXJzZSBuZXcgc291cmNlc1xuICAgICAgICBzZWxmLnNvdXJjZXMgPSB7fTsgLy8gY2xlYXIgcHJldmlvdXMgc291cmNlc1xuICAgICAgICBmb3IgKGxldCBuYW1lIGluIGNvbmZpZy5zb3VyY2VzKSB7XG4gICAgICAgICAgICBsZXQgc291cmNlO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBzb3VyY2UgPSBEYXRhU291cmNlLmNyZWF0ZShPYmplY3QuYXNzaWduKHt9LCBjb25maWcuc291cmNlc1tuYW1lXSwge25hbWV9KSwgc2VsZi5zb3VyY2VzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoKGUpIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKCFzb3VyY2UpIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHNlbGYuc291cmNlc1tuYW1lXSA9IHNvdXJjZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENsZWFyIHRpbGUgY2FjaGUgaWYgZGF0YSBzb3VyY2UgY29uZmlnIGNoYW5nZWRcbiAgICAgICAgaWYgKCFzZWxmLmNvbmZpZy5zb3VyY2VzIHx8XG4gICAgICAgICAgICAhc2VsZi5sYXN0X2NvbmZpZy5zb3VyY2VzIHx8XG4gICAgICAgICAgICBPYmplY3Qua2V5cyhzZWxmLmNvbmZpZy5zb3VyY2VzKS5zb21lKHMgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShzZWxmLmNvbmZpZy5zb3VyY2VzW3NdKSAhPT0gSlNPTi5zdHJpbmdpZnkoc2VsZi5sYXN0X2NvbmZpZy5zb3VyY2VzW3NdKTtcbiAgICAgICAgICAgIH0pKSB7XG4gICAgICAgICAgICBzZWxmLnRpbGVzID0ge307XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgLy8gUmV0dXJucyBhIHByb21pc2UgdGhhdCBmdWxmaWxscyB3aGVuIGNvbmZpZyByZWZyZXNoIGlzIGZpbmlzaGVkXG4gICAgYXdhaXRDb25maWd1cmF0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHNlbGYuY29uZmlndXJpbmc7XG4gICAgfSxcblxuICAgIC8vIEJ1aWxkIGEgdGlsZTogbG9hZCBmcm9tIHRpbGUgc291cmNlIGlmIGJ1aWxkaW5nIGZvciBmaXJzdCB0aW1lLCBvdGhlcndpc2UgcmVidWlsZCB3aXRoIGV4aXN0aW5nIGRhdGFcbiAgICBidWlsZFRpbGUgKHsgdGlsZSB9KSB7XG4gICAgICAgIC8vIFRpbGUgY2FjaGVkP1xuICAgICAgICBpZiAoc2VsZi5nZXRUaWxlKHRpbGUua2V5KSAhPSBudWxsKSB7XG4gICAgICAgICAgICAvLyBBbHJlYWR5IGxvYWRpbmc/XG4gICAgICAgICAgICBpZiAoc2VsZi5nZXRUaWxlKHRpbGUua2V5KS5sb2FkaW5nID09PSB0cnVlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gVXBkYXRlIHRpbGUgY2FjaGVcbiAgICAgICAgdGlsZSA9IHNlbGYudGlsZXNbdGlsZS5rZXldID0gT2JqZWN0LmFzc2lnbihzZWxmLmdldFRpbGUodGlsZS5rZXkpIHx8IHt9LCB0aWxlKTtcblxuICAgICAgICAvLyBVcGRhdGUgY29uZmlnIChzdHlsZXMsIGV0Yy4pLCB0aGVuIGJ1aWxkIHRpbGVcbiAgICAgICAgcmV0dXJuIHNlbGYuYXdhaXRDb25maWd1cmF0aW9uKCkudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAvLyBGaXJzdCB0aW1lIGJ1aWxkaW5nIHRoZSB0aWxlXG4gICAgICAgICAgICBpZiAodGlsZS5sb2FkZWQgIT09IHRydWUpIHtcblxuICAgICAgICAgICAgICAgIHRpbGUubG9hZGluZyA9IHRydWU7XG4gICAgICAgICAgICAgICAgdGlsZS5sb2FkZWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB0aWxlLmVycm9yID0gbnVsbDtcblxuICAgICAgICAgICAgICAgIHNlbGYubG9hZFRpbGVTb3VyY2VEYXRhKHRpbGUpLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIXNlbGYuZ2V0VGlsZSh0aWxlLmtleSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxvZygndHJhY2UnLCBgc3RvcCB0aWxlIGJ1aWxkIGFmdGVyIGRhdGEgc291cmNlIGxvYWQgYmVjYXVzZSB0aWxlIHdhcyByZW1vdmVkOiAke3RpbGUua2V5fWApO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gV2FybiBhbmQgY29udGludWUgb24gZGF0YSBzb3VyY2UgZXJyb3JcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRpbGUuc291cmNlX2RhdGEuZXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxvZygnd2FybicsIGB0aWxlIGxvYWQgZXJyb3IocykgZm9yICR7dGlsZS5rZXl9OiAke3RpbGUuc291cmNlX2RhdGEuZXJyb3J9YCk7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICB0aWxlLmxvYWRpbmcgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgdGlsZS5sb2FkZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICBUaWxlLmJ1aWxkR2VvbWV0cnkodGlsZSwgc2VsZik7XG4gICAgICAgICAgICAgICAgfSkuY2F0Y2goKGVycm9yKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRpbGUubG9hZGluZyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICB0aWxlLmxvYWRlZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICB0aWxlLmVycm9yID0gZXJyb3Iuc3RhY2s7XG4gICAgICAgICAgICAgICAgICAgIGxvZygnZXJyb3InLCBgdGlsZSBsb2FkIGVycm9yIGZvciAke3RpbGUua2V5fTogJHt0aWxlLmVycm9yfWApO1xuXG4gICAgICAgICAgICAgICAgICAgIC8vIFNlbmQgZXJyb3IgdG8gbWFpbiB0aHJlYWRcbiAgICAgICAgICAgICAgICAgICAgV29ya2VyQnJva2VyLnBvc3RNZXNzYWdlKGBUaWxlTWFuYWdlcl8ke3NlbGYuc2NlbmVfaWR9LmJ1aWxkVGlsZUVycm9yYCwgVGlsZS5zbGljZSh0aWxlKSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBUaWxlIGFscmVhZHkgbG9hZGVkLCBqdXN0IHJlYnVpbGRcbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGxvZygndHJhY2UnLCBgdXNlZCB3b3JrZXIgY2FjaGUgZm9yIHRpbGUgJHt0aWxlLmtleX1gKTtcblxuICAgICAgICAgICAgICAgIC8vIEJ1aWxkIGdlb21ldHJ5XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgVGlsZS5idWlsZEdlb21ldHJ5KHRpbGUsIHNlbGYpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjYXRjaChlcnJvcikge1xuICAgICAgICAgICAgICAgICAgICAvLyBTZW5kIGVycm9yIHRvIG1haW4gdGhyZWFkXG4gICAgICAgICAgICAgICAgICAgIHRpbGUuZXJyb3IgPSBlcnJvci50b1N0cmluZygpO1xuICAgICAgICAgICAgICAgICAgICBXb3JrZXJCcm9rZXIucG9zdE1lc3NhZ2UoYFRpbGVNYW5hZ2VyXyR7c2VsZi5zY2VuZV9pZH0uYnVpbGRUaWxlRXJyb3JgLCBUaWxlLnNsaWNlKHRpbGUpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH0sXG5cbiAgICAvLyBMb2FkIHRoaXMgdGlsZSdzIGRhdGEgc291cmNlXG4gICAgbG9hZFRpbGVTb3VyY2VEYXRhICh0aWxlKSB7XG4gICAgICAgIGlmIChzZWxmLnNvdXJjZXNbdGlsZS5zb3VyY2VdKSB7XG4gICAgICAgICAgICByZXR1cm4gc2VsZi5zb3VyY2VzW3RpbGUuc291cmNlXS5sb2FkKHRpbGUpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGlsZS5zb3VyY2VfZGF0YSA9IHt9O1xuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh0aWxlKTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICBnZXRUaWxlKGtleSkge1xuICAgICAgICByZXR1cm4gc2VsZi50aWxlc1trZXldO1xuICAgIH0sXG5cbiAgICAvLyBSZW1vdmUgdGlsZVxuICAgIHJlbW92ZVRpbGUgKGtleSkge1xuICAgICAgICB2YXIgdGlsZSA9IHNlbGYudGlsZXNba2V5XTtcblxuICAgICAgICBpZiAodGlsZSAhPSBudWxsKSB7XG4gICAgICAgICAgICAvLyBDYW5jZWwgaWYgbG9hZGluZ1xuICAgICAgICAgICAgaWYgKHRpbGUubG9hZGluZyA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgICAgIGxvZygndHJhY2UnLCBgY2FuY2VsIHRpbGUgbG9hZCBmb3IgJHtrZXl9YCk7XG4gICAgICAgICAgICAgICAgdGlsZS5sb2FkaW5nID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgVGlsZS5jYW5jZWwodGlsZSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIFJlbW92ZSBmcm9tIGNhY2hlXG4gICAgICAgICAgICBGZWF0dXJlU2VsZWN0aW9uLmNsZWFyVGlsZShrZXkpO1xuICAgICAgICAgICAgZGVsZXRlIHNlbGYudGlsZXNba2V5XTtcbiAgICAgICAgICAgIGxvZygndHJhY2UnLCBgcmVtb3ZlIHRpbGUgZnJvbSBjYWNoZSBmb3IgJHtrZXl9YCk7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgLy8gR2V0IGEgZmVhdHVyZSBmcm9tIHRoZSBzZWxlY3Rpb24gbWFwXG4gICAgZ2V0RmVhdHVyZVNlbGVjdGlvbiAoeyBpZCwga2V5IH0gPSB7fSkge1xuICAgICAgICB2YXIgc2VsZWN0aW9uID0gRmVhdHVyZVNlbGVjdGlvbi5tYXBba2V5XTtcblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgaWQ6IGlkLFxuICAgICAgICAgICAgZmVhdHVyZTogKHNlbGVjdGlvbiAmJiBzZWxlY3Rpb24uZmVhdHVyZSlcbiAgICAgICAgfTtcbiAgICB9LFxuXG4gICAgLy8gUmVzZXRzIHRoZSBmZWF0dXJlIHNlbGVjdGlvbiBzdGF0ZVxuICAgIHJlc2V0RmVhdHVyZVNlbGVjdGlvbiAoKSB7XG4gICAgICAgIEZlYXR1cmVTZWxlY3Rpb24ucmVzZXQoKTtcbiAgICB9LFxuXG4gICAgLy8gU2VsZWN0aW9uIG1hcCBzaXplIGZvciB0aGlzIHdvcmtlclxuICAgIGdldEZlYXR1cmVTZWxlY3Rpb25NYXBTaXplICgpIHtcbiAgICAgICAgcmV0dXJuIEZlYXR1cmVTZWxlY3Rpb24uZ2V0TWFwU2l6ZSgpO1xuICAgIH0sXG5cbiAgICAvLyBUZXh0dXJlIGluZm8gbmVlZHMgdG8gYmUgc3luY2VkIGZyb20gbWFpbiB0aHJlYWQsIGUuZy4gd2lkdGgvaGVpZ2h0LCB3aGljaCB3ZSBvbmx5IGtub3cgYWZ0ZXIgdGhlIHRleHR1cmUgbG9hZHNcbiAgICBzeW5jVGV4dHVyZXMgKHRleF9jb25maWcpIHtcbiAgICAgICAgbGV0IHRleHR1cmVzID0gW107XG4gICAgICAgIGlmICh0ZXhfY29uZmlnKSB7XG4gICAgICAgICAgICB0ZXh0dXJlcy5wdXNoKC4uLk9iamVjdC5rZXlzKHRleF9jb25maWcpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxvZygndHJhY2UnLCAnc3luYyB0ZXh0dXJlcyB0byB3b3JrZXI6JywgdGV4dHVyZXMpO1xuICAgICAgICBpZiAodGV4dHVyZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgcmV0dXJuIFRleHR1cmUuc3luY1RleHR1cmVzVG9Xb3JrZXIodGV4dHVyZXMpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbiAgICB9LFxuXG4gICAgLy8gU3luYyBkZXZpY2UgcGl4ZWwgcmF0aW8gZnJvbSBtYWluIHRocmVhZFxuICAgIHVwZGF0ZURldmljZVBpeGVsUmF0aW8gKGRldmljZV9waXhlbF9yYXRpbykge1xuICAgICAgICBVdGlscy5kZXZpY2VfcGl4ZWxfcmF0aW8gPSBkZXZpY2VfcGl4ZWxfcmF0aW87XG4gICAgfSxcblxuICAgIC8vIFByb2ZpbGluZyBoZWxwZXJzXG4gICAgcHJvZmlsZSAobmFtZSkge1xuICAgICAgICBjb25zb2xlLnByb2ZpbGUoYHdvcmtlciAke3NlbGYuX3dvcmtlcl9pZH06ICR7bmFtZX1gKTtcbiAgICB9LFxuXG4gICAgcHJvZmlsZUVuZCAobmFtZSkge1xuICAgICAgICBjb25zb2xlLnByb2ZpbGVFbmQoYHdvcmtlciAke3NlbGYuX3dvcmtlcl9pZH06ICR7bmFtZX1gKTtcbiAgICB9XG5cbn0pO1xuXG5Xb3JrZXJCcm9rZXIuYWRkVGFyZ2V0KCdzZWxmJywgc2VsZik7XG5cbn1cbiIsImltcG9ydCBsb2cgZnJvbSAnLi91dGlscy9sb2cnO1xuaW1wb3J0IFRleHR1cmUgZnJvbSAnLi9nbC90ZXh0dXJlJztcbmltcG9ydCBXb3JrZXJCcm9rZXIgZnJvbSAnLi91dGlscy93b3JrZXJfYnJva2VyJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgRmVhdHVyZVNlbGVjdGlvbiB7XG5cbiAgICBjb25zdHJ1Y3RvcihnbCwgd29ya2Vycykge1xuICAgICAgICB0aGlzLmdsID0gZ2w7XG4gICAgICAgIHRoaXMud29ya2VycyA9IHdvcmtlcnM7IC8vIHBvb2wgb2Ygd29ya2VycyB0byByZXF1ZXN0IGZlYXR1cmUgbG9vay11cHMgZnJvbSwga2V5ZWQgYnkgaWRcbiAgICAgICAgdGhpcy5pbml0KCk7XG4gICAgfVxuXG4gICAgaW5pdCgpIHtcbiAgICAgICAgLy8gU2VsZWN0aW9uIHN0YXRlIHRyYWNraW5nXG4gICAgICAgIHRoaXMucmVxdWVzdHMgPSB7fTsgLy8gcGVuZGluZyBzZWxlY3Rpb24gcmVxdWVzdHNcbiAgICAgICAgdGhpcy5mZWF0dXJlID0gbnVsbDsgLy8gY3VycmVudGx5IHNlbGVjdGVkIGZlYXR1cmVcbiAgICAgICAgdGhpcy5yZWFkX2RlbGF5ID0gNTsgLy8gZGVsYXkgdGltZSBmcm9tIHNlbGVjdGlvbiByZW5kZXIgdG8gZnJhbWVidWZmZXIgc2FtcGxlLCB0byBhdm9pZCBDUFUvR1BVIHN5bmMgbG9ja1xuICAgICAgICB0aGlzLnJlYWRfZGVsYXlfdGltZXIgPSBudWxsOyAvLyBjdXJyZW50IHRpbWVyIChzZXRUaW1lb3V0KSBmb3IgZGVsYXllZCBzZWxlY3Rpb24gcmVhZHNcblxuICAgICAgICB0aGlzLnBpeGVsID0gbmV3IFVpbnQ4QXJyYXkoNCk7XG4gICAgICAgIHRoaXMucGl4ZWwzMiA9IG5ldyBGbG9hdDMyQXJyYXkodGhpcy5waXhlbC5idWZmZXIpO1xuXG4gICAgICAgIC8vIEZyYW1lIGJ1ZmZlciBmb3Igc2VsZWN0aW9uXG4gICAgICAgIC8vIFRPRE86IGluaXRpYXRlIGxhemlseSBpbiBjYXNlIHdlIGRvbid0IG5lZWQgdG8gZG8gYW55IHNlbGVjdGlvblxuICAgICAgICB0aGlzLmZibyA9IHRoaXMuZ2wuY3JlYXRlRnJhbWVidWZmZXIoKTtcbiAgICAgICAgdGhpcy5nbC5iaW5kRnJhbWVidWZmZXIodGhpcy5nbC5GUkFNRUJVRkZFUiwgdGhpcy5mYm8pO1xuICAgICAgICB0aGlzLmZib19zaXplID0geyB3aWR0aDogMjU2LCBoZWlnaHQ6IDI1NiB9OyAvLyBUT0RPOiBtYWtlIGNvbmZpZ3VyYWJsZSAvIGFkYXB0aXZlIGJhc2VkIG9uIGNhbnZhcyBzaXplXG4gICAgICAgIHRoaXMuZmJvX3NpemUuYXNwZWN0ID0gdGhpcy5mYm9fc2l6ZS53aWR0aCAvIHRoaXMuZmJvX3NpemUuaGVpZ2h0O1xuXG4gICAgICAgIC8vIFRleHR1cmUgZm9yIHRoZSBGQk8gY29sb3IgYXR0YWNobWVudFxuICAgICAgICB2YXIgZmJvX3RleHR1cmUgPSBUZXh0dXJlLmNyZWF0ZSggdGhpcy5nbCwgJ3NlbGVjdGlvbl9mYm8nLCB7IGZpbHRlcmluZzogJ25lYXJlc3QnIH0pO1xuICAgICAgICBmYm9fdGV4dHVyZS5zZXREYXRhKHRoaXMuZmJvX3NpemUud2lkdGgsIHRoaXMuZmJvX3NpemUuaGVpZ2h0LCBudWxsLCB7IGZpbHRlcmluZzogJ25lYXJlc3QnIH0pO1xuICAgICAgICB0aGlzLmdsLmZyYW1lYnVmZmVyVGV4dHVyZTJEKHRoaXMuZ2wuRlJBTUVCVUZGRVIsIHRoaXMuZ2wuQ09MT1JfQVRUQUNITUVOVDAsIHRoaXMuZ2wuVEVYVFVSRV8yRCwgZmJvX3RleHR1cmUudGV4dHVyZSwgMCk7XG5cbiAgICAgICAgLy8gUmVuZGVyYnVmZmVyIGZvciB0aGUgRkJPIGRlcHRoIGF0dGFjaG1lbnRcbiAgICAgICAgdmFyIGZib19kZXB0aF9yYiA9IHRoaXMuZ2wuY3JlYXRlUmVuZGVyYnVmZmVyKCk7XG4gICAgICAgIHRoaXMuZ2wuYmluZFJlbmRlcmJ1ZmZlcih0aGlzLmdsLlJFTkRFUkJVRkZFUiwgZmJvX2RlcHRoX3JiKTtcbiAgICAgICAgdGhpcy5nbC5yZW5kZXJidWZmZXJTdG9yYWdlKHRoaXMuZ2wuUkVOREVSQlVGRkVSLCB0aGlzLmdsLkRFUFRIX0NPTVBPTkVOVDE2LCB0aGlzLmZib19zaXplLndpZHRoLCB0aGlzLmZib19zaXplLmhlaWdodCk7XG4gICAgICAgIHRoaXMuZ2wuZnJhbWVidWZmZXJSZW5kZXJidWZmZXIodGhpcy5nbC5GUkFNRUJVRkZFUiwgdGhpcy5nbC5ERVBUSF9BVFRBQ0hNRU5ULCB0aGlzLmdsLlJFTkRFUkJVRkZFUiwgZmJvX2RlcHRoX3JiKTtcblxuICAgICAgICB0aGlzLmdsLmJpbmRGcmFtZWJ1ZmZlcih0aGlzLmdsLkZSQU1FQlVGRkVSLCBudWxsKTtcbiAgICB9XG5cbiAgICBkZXN0cm95KCkge1xuICAgICAgICBpZiAodGhpcy5nbCAmJiB0aGlzLmZibykge1xuICAgICAgICAgICAgdGhpcy5nbC5kZWxldGVGcmFtZWJ1ZmZlcih0aGlzLmZibyk7XG4gICAgICAgICAgICB0aGlzLmZibyA9IG51bGw7XG4gICAgICAgICAgICB0aGlzLmdsLmJpbmRGcmFtZWJ1ZmZlcih0aGlzLmdsLkZSQU1FQlVGRkVSLCBudWxsKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFRPRE86IGZyZWUgdGV4dHVyZT9cbiAgICB9XG5cbiAgICBiaW5kKCkge1xuICAgICAgICAvLyBTd2l0Y2ggdG8gRkJPXG4gICAgICAgIHRoaXMuZ2wuYmluZEZyYW1lYnVmZmVyKHRoaXMuZ2wuRlJBTUVCVUZGRVIsIHRoaXMuZmJvKTtcbiAgICAgICAgdGhpcy5nbC52aWV3cG9ydCgwLCAwLCB0aGlzLmZib19zaXplLndpZHRoLCB0aGlzLmZib19zaXplLmhlaWdodCk7XG4gICAgfVxuXG4gICAgLy8gUmVxdWVzdCBmZWF0dXJlIHNlbGVjdGlvblxuICAgIC8vIFJ1bnMgYXN5bmNocm9ub3VzbHksIHNjaGVkdWxlcyBzZWxlY3Rpb24gYnVmZmVyIHRvIGJlIHVwZGF0ZWRcbiAgICBnZXRGZWF0dXJlQXQocG9pbnQpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgIC8vIFF1ZXVlIHJlcXVlc3RzIGZvciBmZWF0dXJlIHNlbGVjdGlvbiwgYW5kIHRoZXkgd2lsbCBiZSBwaWNrZWQgdXAgYnkgdGhlIHJlbmRlciBsb29wXG4gICAgICAgICAgICB0aGlzLnNlbGVjdGlvbl9yZXF1ZXN0X2lkID0gKHRoaXMuc2VsZWN0aW9uX3JlcXVlc3RfaWQgKyAxKSB8fCAwO1xuICAgICAgICAgICAgdGhpcy5yZXF1ZXN0c1t0aGlzLnNlbGVjdGlvbl9yZXF1ZXN0X2lkXSA9IHtcbiAgICAgICAgICAgICAgICB0eXBlOiAncG9pbnQnLFxuICAgICAgICAgICAgICAgIGlkOiB0aGlzLnNlbGVjdGlvbl9yZXF1ZXN0X2lkLFxuICAgICAgICAgICAgICAgIHBvaW50LFxuICAgICAgICAgICAgICAgIHJlc29sdmUsXG4gICAgICAgICAgICAgICAgcmVqZWN0XG4gICAgICAgICAgICB9O1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBBbnkgcGVuZGluZyBzZWxlY3Rpb24gcmVxdWVzdHNcbiAgICBwZW5kaW5nUmVxdWVzdHMoKSB7XG4gICAgICAgIHJldHVybiBPYmplY3Qua2V5cyh0aGlzLnJlcXVlc3RzKS5sZW5ndGggJiYgdGhpcy5yZXF1ZXN0cztcbiAgICB9XG5cbiAgICBjbGVhclBlbmRpbmdSZXF1ZXN0cygpIHtcbiAgICAgICAgZm9yICh2YXIgciBpbiB0aGlzLnJlcXVlc3RzKSB7XG4gICAgICAgICAgICB2YXIgcmVxdWVzdCA9IHRoaXMucmVxdWVzdHNbcl07XG5cbiAgICAgICAgICAgIC8vIFRoaXMgcmVxdWVzdCB3YXMgYWxyZWFkeSBzZW50IHRvIHRoZSB3b3JrZXIsIHdlJ3JlIGp1c3QgYXdhaXRpbmcgaXRzIHJlcGx5XG4gICAgICAgICAgICBpZiAocmVxdWVzdC5zZW50KSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIFJlamVjdCByZXF1ZXN0IHNpbmNlIGl0IHdpbGwgbmV2ZXIgYmUgZnVsZmlsbGVkXG4gICAgICAgICAgICAvLyBUT0RPOiBwYXNzIGEgcmVhc29uIGZvciByZWplY3Rpb24/XG4gICAgICAgICAgICByZXF1ZXN0LnJlamVjdCh7IHJlcXVlc3QgfSk7XG4gICAgICAgICAgICBkZWxldGUgdGhpcy5yZXF1ZXN0c1tyXTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIFJlYWQgcGVuZGluZyByZXN1bHRzIGZyb20gdGhlIHNlbGVjdGlvbiBidWZmZXIuIENhbGxlZCBhZnRlciByZW5kZXJpbmcgdG8gc2VsZWN0aW9uIGJ1ZmZlci5cbiAgICByZWFkKCkge1xuICAgICAgICAvLyBEZWxheSByZWFkaW5nIHRoZSBwaXhlbCByZXN1bHQgZnJvbSB0aGUgc2VsZWN0aW9uIGJ1ZmZlciB0byBhdm9pZCBDUFUvR1BVIHN5bmMgbG9jay5cbiAgICAgICAgLy8gQ2FsbGluZyByZWFkUGl4ZWxzIHN5bmNocm9ub3VzbHkgY2F1c2VkIGEgbWFzc2l2ZSBwZXJmb3JtYW5jZSBoaXQsIHByZXN1bWFibHkgc2luY2UgaXRcbiAgICAgICAgLy8gZm9yY2VkIHRoaXMgZnVuY3Rpb24gdG8gd2FpdCBmb3IgdGhlIEdQVSB0byBmaW5pc2ggcmVuZGVyaW5nIGFuZCByZXRyaWV2ZSB0aGUgdGV4dHVyZSBjb250ZW50cy5cbiAgICAgICAgaWYgKHRoaXMucmVhZF9kZWxheV90aW1lciAhPSBudWxsKSB7XG4gICAgICAgICAgICBjbGVhclRpbWVvdXQodGhpcy5yZWFkX2RlbGF5X3RpbWVyKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnJlYWRfZGVsYXlfdGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIHZhciBnbCA9IHRoaXMuZ2w7XG5cbiAgICAgICAgICAgIGdsLmJpbmRGcmFtZWJ1ZmZlcihnbC5GUkFNRUJVRkZFUiwgdGhpcy5mYm8pO1xuXG4gICAgICAgICAgICBmb3IgKHZhciByIGluIHRoaXMucmVxdWVzdHMpIHtcbiAgICAgICAgICAgICAgICB2YXIgcmVxdWVzdCA9IHRoaXMucmVxdWVzdHNbcl07XG5cbiAgICAgICAgICAgICAgICAvLyBUaGlzIHJlcXVlc3Qgd2FzIGFscmVhZHkgc2VudCB0byB0aGUgd29ya2VyLCB3ZSdyZSBqdXN0IGF3YWl0aW5nIGl0cyByZXBseVxuICAgICAgICAgICAgICAgIGlmIChyZXF1ZXN0LnNlbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gVE9ETzogc3VwcG9ydCBvdGhlciBzZWxlY3Rpb24gdHlwZXMsIHN1Y2ggYXMgZmVhdHVyZXMgd2l0aGluIGEgYm94XG4gICAgICAgICAgICAgICAgaWYgKHJlcXVlc3QudHlwZSAhPT0gJ3BvaW50Jykge1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyBDaGVjayBzZWxlY3Rpb24gbWFwIGFnYWluc3QgRkJPXG4gICAgICAgICAgICAgICAgZ2wucmVhZFBpeGVscyhcbiAgICAgICAgICAgICAgICAgICAgTWF0aC5mbG9vcihyZXF1ZXN0LnBvaW50LnggKiB0aGlzLmZib19zaXplLndpZHRoKSxcbiAgICAgICAgICAgICAgICAgICAgTWF0aC5mbG9vcigoMSAtIHJlcXVlc3QucG9pbnQueSkgKiB0aGlzLmZib19zaXplLmhlaWdodCksXG4gICAgICAgICAgICAgICAgICAgIDEsIDEsIGdsLlJHQkEsIGdsLlVOU0lHTkVEX0JZVEUsIHRoaXMucGl4ZWwpO1xuICAgICAgICAgICAgICAgIHZhciBmZWF0dXJlX2tleSA9ICh0aGlzLnBpeGVsWzBdICsgKHRoaXMucGl4ZWxbMV0gPDwgOCkgKyAodGhpcy5waXhlbFsyXSA8PCAxNikgKyAodGhpcy5waXhlbFszXSA8PCAyNCkpID4+PiAwO1xuXG4gICAgICAgICAgICAgICAgLy8gSWYgZmVhdHVyZSBmb3VuZCwgYXNrIGFwcHJvcHJpYXRlIHdlYiB3b3JrZXIgdG8gbG9va3VwIGZlYXR1cmVcbiAgICAgICAgICAgICAgICB2YXIgd29ya2VyX2lkID0gdGhpcy5waXhlbFszXTtcbiAgICAgICAgICAgICAgICBpZiAod29ya2VyX2lkICE9PSAyNTUpIHsgLy8gMjU1IGluZGljYXRlcyBhbiBlbXB0eSBzZWxlY3Rpb24gYnVmZmVyIHBpeGVsXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLndvcmtlcnNbd29ya2VyX2lkXSAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBXb3JrZXJCcm9rZXIucG9zdE1lc3NhZ2UoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy53b3JrZXJzW3dvcmtlcl9pZF0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NlbGYuZ2V0RmVhdHVyZVNlbGVjdGlvbicsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBpZDogcmVxdWVzdC5pZCwga2V5OiBmZWF0dXJlX2tleSB9KVxuICAgICAgICAgICAgICAgICAgICAgICAgLnRoZW4obWVzc2FnZSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5maW5pc2hSZWFkKG1lc3NhZ2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gTm8gZmVhdHVyZSBmb3VuZCwgYnV0IHN0aWxsIG5lZWQgdG8gcmVzb2x2ZSBwcm9taXNlXG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZmluaXNoUmVhZCh7IGlkOiByZXF1ZXN0LmlkLCBmZWF0dXJlOiBudWxsIH0pO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHJlcXVlc3Quc2VudCA9IHRydWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGdsLmJpbmRGcmFtZWJ1ZmZlcihnbC5GUkFNRUJVRkZFUiwgbnVsbCk7XG5cbiAgICAgICAgfSwgdGhpcy5yZWFkX2RlbGF5KTtcbiAgICB9XG5cbiAgICAvLyBDYWxsZWQgb24gbWFpbiB0aHJlYWQgd2hlbiBhIHdlYiB3b3JrZXIgZmluZHMgYSBmZWF0dXJlIGluIHRoZSBzZWxlY3Rpb24gYnVmZmVyXG4gICAgZmluaXNoUmVhZCAobWVzc2FnZSkge1xuICAgICAgICB2YXIgcmVxdWVzdCA9IHRoaXMucmVxdWVzdHNbbWVzc2FnZS5pZF07XG4gICAgICAgIGlmICghcmVxdWVzdCkge1xuICAgICAgICAgICAgbG9nKCdlcnJvcicsIFwiRmVhdHVyZVNlbGVjdGlvbi5maW5pc2hSZWFkKCk6IGNvdWxkIG5vdCBmaW5kIG1lc3NhZ2VcIiwgbWVzc2FnZSk7XG4gICAgICAgICAgICByZXR1cm47IC8vIHJlcXVlc3Qgd2FzIGNsZWFyZWQgYmVmb3JlIGl0IHJldHVybmVkXG4gICAgICAgIH1cblxuICAgICAgICB2YXIgZmVhdHVyZSA9IG1lc3NhZ2UuZmVhdHVyZTtcbiAgICAgICAgdmFyIGNoYW5nZWQgPSBmYWxzZTtcbiAgICAgICAgaWYgKChmZWF0dXJlICE9IG51bGwgJiYgdGhpcy5mZWF0dXJlID09IG51bGwpIHx8XG4gICAgICAgICAgICAoZmVhdHVyZSA9PSBudWxsICYmIHRoaXMuZmVhdHVyZSAhPSBudWxsKSB8fFxuICAgICAgICAgICAgKGZlYXR1cmUgIT0gbnVsbCAmJiB0aGlzLmZlYXR1cmUgIT0gbnVsbCAmJlxuICAgICAgICAgICAgICAgIEpTT04uc3RyaW5naWZ5KGZlYXR1cmUpICE9PSBKU09OLnN0cmluZ2lmeSh0aGlzLmZlYXR1cmUpKSkge1xuICAgICAgICAgICAgY2hhbmdlZCA9IHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmZlYXR1cmUgPSBmZWF0dXJlOyAvLyBzdG9yZSB0aGUgbW9zdCByZWNlbnRseSBzZWxlY3RlZCBmZWF0dXJlXG5cbiAgICAgICAgLy8gUmVzb2x2ZSB0aGUgcmVxdWVzdFxuICAgICAgICByZXF1ZXN0LnJlc29sdmUoeyBmZWF0dXJlLCBjaGFuZ2VkLCByZXF1ZXN0IH0pO1xuICAgICAgICBkZWxldGUgdGhpcy5yZXF1ZXN0c1ttZXNzYWdlLmlkXTsgLy8gZG9uZSBwcm9jZXNzaW5nIHRoaXMgcmVxdWVzdFxuICAgIH1cblxuXG4gICAgLy8gU2VsZWN0aW9uIG1hcCBnZW5lcmF0aW9uXG4gICAgLy8gRWFjaCB3b3JrZXIgd2lsbCBjcmVhdGUgaXRzIG93biBpbmRlcGVuZGVudCwgJ2xvY2FsJyBzZWxlY3Rpb24gbWFwXG5cbiAgICAvLyBDcmVhdGUgYSB1bmlxdWUgMzItYml0IGNvbG9yIHRvIGlkZW50aWZ5IGEgZmVhdHVyZVxuICAgIC8vIFdvcmtlcnMgaW5kZXBlbmRlbnRseSBjcmVhdGUvbW9kaWZ5IHNlbGVjdGlvbiBjb2xvcnMgaW4gdGhlaXIgb3duIHRocmVhZHMsIGJ1dCB3ZSBhbHNvXG4gICAgLy8gbmVlZCB0aGUgbWFpbiB0aHJlYWQgdG8ga25vdyB3aGVyZSBlYWNoIGZlYXR1cmUgY29sb3Igb3JpZ2luYXRlZC4gVG8gYWNjb21wbGlzaCB0aGlzLFxuICAgIC8vIHdlIHBhcnRpdGlvbiB0aGUgbWFwIGJ5IHNldHRpbmcgdGhlIDR0aCBjb21wb25lbnQgKGFscGhhIGNoYW5uZWwpIHRvIHRoZSB3b3JrZXIncyBpZC5cbiAgICBzdGF0aWMgbWFrZUVudHJ5KHRpbGUpIHtcbiAgICAgICAgLy8gMzItYml0IGNvbG9yIGtleVxuICAgICAgICB0aGlzLm1hcF9lbnRyeSsrO1xuICAgICAgICB2YXIgaXIgPSB0aGlzLm1hcF9lbnRyeSAmIDI1NTtcbiAgICAgICAgdmFyIGlnID0gKHRoaXMubWFwX2VudHJ5ID4+IDgpICYgMjU1O1xuICAgICAgICB2YXIgaWIgPSAodGhpcy5tYXBfZW50cnkgPj4gMTYpICYgMjU1O1xuICAgICAgICB2YXIgaWEgPSB0aGlzLm1hcF9wcmVmaXg7XG4gICAgICAgIHZhciByID0gaXIgLyAyNTU7XG4gICAgICAgIHZhciBnID0gaWcgLyAyNTU7XG4gICAgICAgIHZhciBiID0gaWIgLyAyNTU7XG4gICAgICAgIHZhciBhID0gaWEgLyAyNTU7XG4gICAgICAgIHZhciBrZXkgPSAoaXIgKyAoaWcgPDwgOCkgKyAoaWIgPDwgMTYpICsgKGlhIDw8IDI0KSkgPj4+IDA7IC8vIG5lZWQgdW5zaWduZWQgcmlnaHQgc2hpZnQgdG8gY29udmVydCB0byBwb3NpdGl2ZSAjXG5cbiAgICAgICAgdGhpcy5tYXBba2V5XSA9IHtcbiAgICAgICAgICAgIGNvbG9yOiBbciwgZywgYiwgYV0sXG4gICAgICAgIH07XG4gICAgICAgIHRoaXMubWFwX3NpemUrKztcblxuICAgICAgICAvLyBJbml0aWFsaXplIHRpbGUtc3BlY2lmaWMgdHJhY2tpbmcgaW5mb1xuICAgICAgICBpZiAoIXRoaXMudGlsZXNbdGlsZS5rZXldKSB7XG4gICAgICAgICAgICB0aGlzLnRpbGVzW3RpbGUua2V5XSA9IHtcbiAgICAgICAgICAgICAgICBlbnRyaWVzOiBbXSwgICAgICAgICAgICAgICAgICAgICAgICAvLyBzZXQgb2YgZmVhdHVyZSBlbnRyaWVzIGluIHRoaXMgdGhyZWFkXG4gICAgICAgICAgICAgICAgdGlsZTogeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3Vic2V0IG9mIHRpbGUgcHJvcGVydGllcyB0byBwYXNzIGJhY2sgd2l0aCBmZWF0dXJlXG4gICAgICAgICAgICAgICAgICAgIGtleTogdGlsZS5rZXksXG4gICAgICAgICAgICAgICAgICAgIGNvb3JkczogdGlsZS5jb29yZHMsXG4gICAgICAgICAgICAgICAgICAgIHN0eWxlX3pvb206IHRpbGUuc3R5bGVfem9vbSxcbiAgICAgICAgICAgICAgICAgICAgc291cmNlOiB0aWxlLnNvdXJjZSxcbiAgICAgICAgICAgICAgICAgICAgZ2VuZXJhdGlvbjogdGlsZS5nZW5lcmF0aW9uXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMudGlsZXNbdGlsZS5rZXldLmVudHJpZXMucHVzaChrZXkpO1xuXG4gICAgICAgIHJldHVybiB0aGlzLm1hcFtrZXldO1xuICAgIH1cblxuICAgIHN0YXRpYyBtYWtlQ29sb3IoZmVhdHVyZSwgdGlsZSwgY29udGV4dCkge1xuICAgICAgICB2YXIgc2VsZWN0b3IgPSB0aGlzLm1ha2VFbnRyeSh0aWxlKTtcbiAgICAgICAgc2VsZWN0b3IuZmVhdHVyZSA9IHtcbiAgICAgICAgICAgIGlkOiBmZWF0dXJlLmlkLFxuICAgICAgICAgICAgcHJvcGVydGllczogZmVhdHVyZS5wcm9wZXJ0aWVzLFxuICAgICAgICAgICAgc291cmNlX25hbWU6IGNvbnRleHQuc291cmNlLFxuICAgICAgICAgICAgc291cmNlX2xheWVyOiBjb250ZXh0LmxheWVyLFxuICAgICAgICAgICAgbGF5ZXJzOiBjb250ZXh0LmxheWVycyxcbiAgICAgICAgICAgIHRpbGU6IHRoaXMudGlsZXNbdGlsZS5rZXldLnRpbGVcbiAgICAgICAgfTtcblxuICAgICAgICByZXR1cm4gc2VsZWN0b3IuY29sb3I7XG4gICAgfVxuXG4gICAgc3RhdGljIHJlc2V0KCkge1xuICAgICAgICB0aGlzLnRpbGVzID0ge307XG4gICAgICAgIHRoaXMubWFwID0ge307XG4gICAgICAgIHRoaXMubWFwX3NpemUgPSAwO1xuICAgICAgICB0aGlzLm1hcF9lbnRyeSA9IDA7XG4gICAgfVxuXG4gICAgc3RhdGljIGNsZWFyVGlsZShrZXkpIHtcbiAgICAgICAgaWYgKHRoaXMudGlsZXNba2V5XSkge1xuICAgICAgICAgICAgdGhpcy50aWxlc1trZXldLmVudHJpZXMuZm9yRWFjaChrID0+IGRlbGV0ZSB0aGlzLm1hcFtrXSk7XG4gICAgICAgICAgICB0aGlzLm1hcF9zaXplIC09IHRoaXMudGlsZXNba2V5XS5lbnRyaWVzLmxlbmd0aDtcbiAgICAgICAgICAgIGRlbGV0ZSB0aGlzLnRpbGVzW2tleV07XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBzdGF0aWMgZ2V0TWFwU2l6ZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubWFwX3NpemU7XG4gICAgfVxuXG4gICAgc3RhdGljIHNldFByZWZpeChwcmVmaXgpIHtcbiAgICAgICAgdGhpcy5tYXBfcHJlZml4ID0gcHJlZml4O1xuICAgIH1cblxufVxuXG4vLyBTdGF0aWMgcHJvcGVydGllc1xuRmVhdHVyZVNlbGVjdGlvbi5tYXAgPSB7fTsgICAvLyB0aGlzIHdpbGwgYmUgdW5pcXVlIHBlciBtb2R1bGUgaW5zdGFuY2UgKHNvIHVuaXF1ZSBwZXIgd29ya2VyKVxuRmVhdHVyZVNlbGVjdGlvbi50aWxlcyA9IHt9OyAvLyBzZWxlY3Rpb24ga2V5cywgYnkgdGlsZVxuRmVhdHVyZVNlbGVjdGlvbi5tYXBfc2l6ZSA9IDA7XG5GZWF0dXJlU2VsZWN0aW9uLm1hcF9lbnRyeSA9IDA7XG5GZWF0dXJlU2VsZWN0aW9uLm1hcF9wcmVmaXggPSAwOyAvLyBzZXQgYnkgd29ya2VyIHRvIHdvcmtlciBpZCAjXG5GZWF0dXJlU2VsZWN0aW9uLmRlZmF1bHRDb2xvciA9IFswLCAwLCAwLCAxXTtcbiIsIi8qanNoaW50IHdvcmtlcjogdHJ1ZSAqL1xuaW1wb3J0IEdlbyBmcm9tICcuLi9nZW8nO1xuaW1wb3J0IHtNZXRob2ROb3RJbXBsZW1lbnRlZH0gZnJvbSAnLi4vdXRpbHMvZXJyb3JzJztcbmltcG9ydCBVdGlscyBmcm9tICcuLi91dGlscy91dGlscyc7XG5pbXBvcnQgKiBhcyBVUkxzIGZyb20gJy4uL3V0aWxzL3VybHMnO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBEYXRhU291cmNlIHtcblxuICAgIGNvbnN0cnVjdG9yIChjb25maWcsIHNvdXJjZXMpIHtcbiAgICAgICAgdGhpcy5jb25maWcgPSBjb25maWc7IC8vIHNhdmUgb3JpZ2luYWwgY29uZmlnXG4gICAgICAgIHRoaXMuc291cmNlcyA9IHNvdXJjZXM7IC8vIGZ1bGwgc2V0IG9mIGRhdGEgc291cmNlcyBUT0RPOiBjZW50cmFsaXplIHRoZXNlIGxpa2UgdGV4dHVyZXM/XG4gICAgICAgIHRoaXMuaWQgPSBjb25maWcuaWQ7XG4gICAgICAgIHRoaXMubmFtZSA9IGNvbmZpZy5uYW1lO1xuICAgICAgICB0aGlzLnBhZF9zY2FsZSA9IGNvbmZpZy5wYWRfc2NhbGUgfHwgMC4wMDAxOyAvLyBzY2FsZSB0aWxlIHVwIGJ5IHNtYWxsIGZhY3RvciB0byBjb3ZlciBzZWFtc1xuICAgICAgICB0aGlzLmRlZmF1bHRfd2luZGluZyA9IG51bGw7IC8vIHdpbmRpbmcgb3JkZXIgd2lsbCBhZGFwdCB0byBkYXRhIHNvdXJjZVxuICAgICAgICB0aGlzLnJhc3RlcnMgPSBbXTsgLy8gYXR0YWNoZWQgcmFzdGVyIHRpbGUgc291cmNlc1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShjb25maWcucmFzdGVycykpIHsgLy8gY29weSB1bmlxdWUgc2V0IG9mIHJhc3RlciBzb3VyY2VzXG4gICAgICAgICAgICBjb25maWcucmFzdGVycy5mb3JFYWNoKHIgPT4ge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLnJhc3RlcnMuaW5kZXhPZihyKSA9PT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yYXN0ZXJzLnB1c2gocik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBPcHRpb25hbCBmdW5jdGlvbiB0byB0cmFuc2Zvcm0gc291cmNlIGRhdGFcbiAgICAgICAgdGhpcy50cmFuc2Zvcm0gPSBjb25maWcudHJhbnNmb3JtO1xuICAgICAgICBpZiAodHlwZW9mIHRoaXMudHJhbnNmb3JtID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICB0aGlzLnRyYW5zZm9ybS5iaW5kKHRoaXMpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gT3B0aW9uYWwgYWRkaXRpb25hbCBkYXRhIHRvIHBhc3MgdG8gdGhlIHRyYW5zZm9ybSBmdW5jdGlvblxuICAgICAgICB0aGlzLmV4dHJhX2RhdGEgPSBjb25maWcuZXh0cmFfZGF0YTtcblxuICAgICAgICAvLyBPcHRpb25hbCBhZGRpdGlvbmFsIHNjcmlwdHMgbWFkZSBhdmFpbGFibGUgdG8gdGhlIHRyYW5zZm9ybSBmdW5jdGlvblxuICAgICAgICAvLyBOT1RFOiB0aGVzZSBhcmUgbG9hZGVkIGFsb25nc2lkZSB0aGUgbGlicmFyeSB3aGVuIHRoZSB3b3JrZXJzIGFyZSBpbnN0YW50aWF0ZWRcbiAgICAgICAgdGhpcy5zY3JpcHRzID0gY29uZmlnLnNjcmlwdHM7XG5cbiAgICAgICAgLy8gb3Zlcnpvb20gd2lsbCBhcHBseSBmb3Igem9vbXMgaGlnaGVyIHRoYW4gdGhpc1xuICAgICAgICB0aGlzLm1heF96b29tID0gKGNvbmZpZy5tYXhfem9vbSAhPSBudWxsKSA/IGNvbmZpZy5tYXhfem9vbSA6IEdlby5kZWZhdWx0X3NvdXJjZV9tYXhfem9vbTtcblxuICAgICAgICAvLyBubyB0aWxlcyB3aWxsIGJlIHJlcXVlc3RlZCBvciBkaXNwbGF5ZWQgb3V0c2lkZSBvZiB0aGVzZSBtaW4vbWF4IHZhbHVlc1xuICAgICAgICB0aGlzLm1pbl9kaXNwbGF5X3pvb20gPSAoY29uZmlnLm1pbl9kaXNwbGF5X3pvb20gIT0gbnVsbCkgPyBjb25maWcubWluX2Rpc3BsYXlfem9vbSA6IDA7XG4gICAgICAgIHRoaXMubWF4X2Rpc3BsYXlfem9vbSA9IChjb25maWcubWF4X2Rpc3BsYXlfem9vbSAhPSBudWxsKSA/IGNvbmZpZy5tYXhfZGlzcGxheV96b29tIDogbnVsbDtcbiAgICB9XG5cbiAgICAvLyBDcmVhdGUgYSB0aWxlIHNvdXJjZSBieSB0eXBlLCBmYWN0b3J5LXN0eWxlXG4gICAgc3RhdGljIGNyZWF0ZSAoc291cmNlLCBzb3VyY2VzKSB7XG4gICAgICAgIGlmIChEYXRhU291cmNlLnR5cGVzW3NvdXJjZS50eXBlXSkge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBEYXRhU291cmNlLnR5cGVzW3NvdXJjZS50eXBlXShzb3VyY2UsIHNvdXJjZXMpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gQ2hlY2sgaWYgYSBkYXRhIHNvdXJjZSBkZWZpbml0aW9uIGNoYW5nZWRcbiAgICBzdGF0aWMgY2hhbmdlZCAoc291cmNlLCBwcmV2X3NvdXJjZSkge1xuICAgICAgICBpZiAoIXNvdXJjZSB8fCAhcHJldl9zb3VyY2UpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGN1ciA9IE9iamVjdC5hc3NpZ24oe30sIHNvdXJjZS5jb25maWcsIHsgaWQ6IG51bGwgfSk7IC8vIG51bGwgb3V0IGlkcyBzaW5jZSB3ZSBkb24ndCB3YW50IHRvIGNvbXBhcmUgdGhlbVxuICAgICAgICBsZXQgcHJldiA9IE9iamVjdC5hc3NpZ24oe30sIHByZXZfc291cmNlLmNvbmZpZywgeyBpZDogbnVsbCB9KTtcblxuICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoY3VyKSAhPT0gSlNPTi5zdHJpbmdpZnkocHJldik7XG4gICAgfVxuXG4gICAgLy8gTWVyY2F0b3IgcHJvamVjdGlvblxuICAgIHN0YXRpYyBwcm9qZWN0RGF0YSAoc291cmNlKSB7XG4gICAgICAgIHZhciB0aW1lciA9ICtuZXcgRGF0ZSgpO1xuICAgICAgICBmb3IgKHZhciB0IGluIHNvdXJjZS5sYXllcnMpIHtcbiAgICAgICAgICAgIHZhciBudW1fZmVhdHVyZXMgPSBzb3VyY2UubGF5ZXJzW3RdLmZlYXR1cmVzLmxlbmd0aDtcbiAgICAgICAgICAgIGZvciAodmFyIGY9MDsgZiA8IG51bV9mZWF0dXJlczsgZisrKSB7XG4gICAgICAgICAgICAgICAgdmFyIGZlYXR1cmUgPSBzb3VyY2UubGF5ZXJzW3RdLmZlYXR1cmVzW2ZdO1xuICAgICAgICAgICAgICAgIEdlby50cmFuc2Zvcm1HZW9tZXRyeShmZWF0dXJlLmdlb21ldHJ5LCBjb29yZCA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBbeCwgeV0gPSBHZW8ubGF0TG5nVG9NZXRlcnMoY29vcmQpO1xuICAgICAgICAgICAgICAgICAgICBjb29yZFswXSA9IHg7XG4gICAgICAgICAgICAgICAgICAgIGNvb3JkWzFdID0geTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChzb3VyY2UuZGVidWcgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgc291cmNlLmRlYnVnLnByb2plY3Rpb24gPSArbmV3IERhdGUoKSAtIHRpbWVyO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgIFJlLXNjYWxlIGdlb21ldHJpZXMgd2l0aGluIGVhY2ggc291cmNlIHRvIGludGVybmFsIHRpbGUgdW5pdHNcbiAgICAqL1xuICAgIHN0YXRpYyBzY2FsZURhdGEgKHNvdXJjZSwge2Nvb3Jkczoge3p9LCBtaW4sIG1heH0pIHtcbiAgICAgICAgbGV0IHVuaXRzX3Blcl9tZXRlciA9IEdlby51bml0c1Blck1ldGVyKHopO1xuICAgICAgICBmb3IgKHZhciB0IGluIHNvdXJjZS5sYXllcnMpIHtcbiAgICAgICAgICAgIHZhciBudW1fZmVhdHVyZXMgPSBzb3VyY2UubGF5ZXJzW3RdLmZlYXR1cmVzLmxlbmd0aDtcbiAgICAgICAgICAgIGZvciAodmFyIGY9MDsgZiA8IG51bV9mZWF0dXJlczsgZisrKSB7XG4gICAgICAgICAgICAgICAgdmFyIGZlYXR1cmUgPSBzb3VyY2UubGF5ZXJzW3RdLmZlYXR1cmVzW2ZdO1xuICAgICAgICAgICAgICAgIEdlby50cmFuc2Zvcm1HZW9tZXRyeShmZWF0dXJlLmdlb21ldHJ5LCBjb29yZCA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvb3JkWzBdID0gKGNvb3JkWzBdIC0gbWluLngpICogdW5pdHNfcGVyX21ldGVyO1xuICAgICAgICAgICAgICAgICAgICBjb29yZFsxXSA9IChjb29yZFsxXSAtIG1pbi55KSAqIHVuaXRzX3Blcl9tZXRlciAqIC0xOyAvLyBmbGlwIGNvb3JkcyBwb3NpdGl2ZVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgbG9hZChkZXN0KSB7XG4gICAgICAgIGRlc3Quc291cmNlX2RhdGEgPSB7fTtcbiAgICAgICAgZGVzdC5zb3VyY2VfZGF0YS5sYXllcnMgPSB7fTtcbiAgICAgICAgZGVzdC5wYWRfc2NhbGUgPSB0aGlzLnBhZF9zY2FsZTtcbiAgICAgICAgZGVzdC5yYXN0ZXJzID0gWy4uLnRoaXMucmFzdGVyc107IC8vIGNvcHkgbGlzdCBvZiByYXN0ZXJzIHRvIGxvYWQgZm9yIHRpbGVcblxuICAgICAgICByZXR1cm4gdGhpcy5fbG9hZChkZXN0KS50aGVuKChkZXN0KSA9PiB7XG4gICAgICAgICAgICAvLyBQb3N0LXByb2Nlc3NpbmdcbiAgICAgICAgICAgIGZvciAobGV0IGxheWVyIGluIGRlc3Quc291cmNlX2RhdGEubGF5ZXJzKSB7XG4gICAgICAgICAgICAgICAgbGV0IGRhdGEgPSBkZXN0LnNvdXJjZV9kYXRhLmxheWVyc1tsYXllcl07XG4gICAgICAgICAgICAgICAgaWYgKGRhdGEgJiYgZGF0YS5mZWF0dXJlcykge1xuICAgICAgICAgICAgICAgICAgICBkYXRhLmZlYXR1cmVzLmZvckVhY2goZmVhdHVyZSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBHZW8udHJhbnNmb3JtR2VvbWV0cnkoZmVhdHVyZS5nZW9tZXRyeSwgY29vcmQgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZsaXAgWSBjb29yZHNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb29yZFsxXSA9IC1jb29yZFsxXTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNsaWdodGx5IHNjYWxlIHVwIHRpbGUgdG8gY292ZXIgc2VhbXNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5wYWRfc2NhbGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29vcmRbMF0gPSBNYXRoLnJvdW5kKGNvb3JkWzBdICogKDEgKyB0aGlzLnBhZF9zY2FsZSkgLSAoR2VvLnRpbGVfc2NhbGUgKiB0aGlzLnBhZF9zY2FsZS8yKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvb3JkWzFdID0gTWF0aC5yb3VuZChjb29yZFsxXSAqICgxICsgdGhpcy5wYWRfc2NhbGUpIC0gKEdlby50aWxlX3NjYWxlICogdGhpcy5wYWRfc2NhbGUvMikpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBVc2UgZmlyc3QgZW5jb3VudGVyZWQgcG9seWdvbiB3aW5kaW5nIG9yZGVyIGFzIGRlZmF1bHQgZm9yIGRhdGEgc291cmNlXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZURlZmF1bHRXaW5kaW5nKGZlYXR1cmUuZ2VvbWV0cnkpO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGRlc3QuZGVmYXVsdF93aW5kaW5nID0gdGhpcy5kZWZhdWx0X3dpbmRpbmcgfHwgJ0NDVyc7XG4gICAgICAgICAgICByZXR1cm4gZGVzdDtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gU3ViLWNsYXNzZXMgbXVzdCBpbXBsZW1lbnRcbiAgICBfbG9hZChkZXN0KSB7XG4gICAgICAgIHRocm93IG5ldyBNZXRob2ROb3RJbXBsZW1lbnRlZCgnX2xvYWQnKTtcbiAgICB9XG5cbiAgICAvLyBJbmZlciB3aW5kaW5nIGZvciBkYXRhIHNvdXJjZSBmcm9tIGZpcnN0IHJpbmcgb2YgcHJvdmlkZWQgZ2VvbWV0cnlcbiAgICB1cGRhdGVEZWZhdWx0V2luZGluZyAoZ2VvbSkge1xuICAgICAgICBpZiAodGhpcy5kZWZhdWx0X3dpbmRpbmcgPT0gbnVsbCkge1xuICAgICAgICAgICAgaWYgKGdlb20udHlwZSA9PT0gJ1BvbHlnb24nKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5kZWZhdWx0X3dpbmRpbmcgPSBHZW8ucmluZ1dpbmRpbmcoZ2VvbS5jb29yZGluYXRlc1swXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChnZW9tLnR5cGUgPT09ICdNdWx0aVBvbHlnb24nKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5kZWZhdWx0X3dpbmRpbmcgPSBHZW8ucmluZ1dpbmRpbmcoZ2VvbS5jb29yZGluYXRlc1swXVswXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuZGVmYXVsdF93aW5kaW5nO1xuICAgIH1cblxuICAgIC8vIEFsbCBkYXRhIHNvdXJjZXMgc3VwcG9ydCBhIG1pbiB6b29tLCB0aWxlZCBzb3VyY2VzIGNhbiBzdWJjbGFzcyBmb3IgbW9yZSBzcGVjaWZpYyBsaW1pdHMgKGUuZy4gYm91bmRpbmcgYm94KVxuICAgIGluY2x1ZGVzVGlsZSAoY29vcmRzLCBzdHlsZV96b29tKSB7XG4gICAgICAgIC8vIExpbWl0IGJ5IHRoaXMgZGF0YSBzb3VyY2VcbiAgICAgICAgaWYgKGNvb3Jkcy56IDwgdGhpcy5taW5fZGlzcGxheV96b29tIHx8ICh0aGlzLm1heF9kaXNwbGF5X3pvb20gIT0gbnVsbCAmJiBzdHlsZV96b29tID4gdGhpcy5tYXhfZGlzcGxheV96b29tKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gTGltaXQgYnkgYW55IGRlcGVuZGVudCByYXN0ZXIgc291cmNlc1xuICAgICAgICBmb3IgKGxldCByPTA7IHIgPCB0aGlzLnJhc3RlcnMubGVuZ3RoOyByKyspIHtcbiAgICAgICAgICAgIGNvbnN0IHNvdXJjZV9uYW1lID0gdGhpcy5yYXN0ZXJzW3JdO1xuICAgICAgICAgICAgaWYgKHRoaXMuc291cmNlc1tzb3VyY2VfbmFtZV0gJiZcbiAgICAgICAgICAgICAgICB0aGlzLnNvdXJjZXNbc291cmNlX25hbWVdICE9PSB0aGlzICYmXG4gICAgICAgICAgICAgICAgIXRoaXMuc291cmNlc1tzb3VyY2VfbmFtZV0uaW5jbHVkZXNUaWxlKGNvb3JkcywgY29vcmRzLnopKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgLy8gUmVnaXN0ZXIgYSBuZXcgZGF0YSBzb3VyY2UgdHlwZSwgdW5kZXIgYSB0eXBlIG5hbWVcbiAgICBzdGF0aWMgcmVnaXN0ZXIodHlwZV9jbGFzcywgdHlwZV9uYW1lKSB7XG4gICAgICAgIGlmICghdHlwZV9jbGFzcyB8fCAhdHlwZV9uYW1lKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBEYXRhU291cmNlLnR5cGVzW3R5cGVfbmFtZV0gPSB0eXBlX2NsYXNzO1xuICAgIH1cblxufVxuXG5EYXRhU291cmNlLnR5cGVzID0ge307IC8vIHNldCBvZiBzdXBwb3J0ZWQgZGF0YSBzb3VyY2UgY2xhc3NlcywgcmVmZXJlbmNlZCBieSB0eXBlIG5hbWVcblxuXG4vKioqIEdlbmVyaWMgbmV0d29yayBsb2FkaW5nIHNvdXJjZSAtIGFic3RyYWN0IGNsYXNzICoqKi9cblxuZXhwb3J0IGNsYXNzIE5ldHdvcmtTb3VyY2UgZXh0ZW5kcyBEYXRhU291cmNlIHtcblxuICAgIGNvbnN0cnVjdG9yIChzb3VyY2UsIHNvdXJjZXMpIHtcbiAgICAgICAgc3VwZXIoc291cmNlLCBzb3VyY2VzKTtcbiAgICAgICAgdGhpcy51cmwgPSBVUkxzLmFkZFBhcmFtc1RvVVJMKHNvdXJjZS51cmwsIHNvdXJjZS51cmxfcGFyYW1zKTtcbiAgICAgICAgdGhpcy5yZXNwb25zZV90eXBlID0gXCJcIjsgLy8gdXNlIHRvIHNldCBleHBsaWNpdCBYSFIgdHlwZVxuXG4gICAgICAgIGlmICh0aGlzLnVybCA9PSBudWxsKSB7XG4gICAgICAgICAgICB0aHJvdyBFcnJvcignTmV0d29yayBkYXRhIHNvdXJjZSBtdXN0IHByb3ZpZGUgYSBgdXJsYCBwcm9wZXJ0eScpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgX2xvYWQgKGRlc3QpIHtcbiAgICAgICAgbGV0IHVybCA9IHRoaXMuZm9ybWF0VXJsKHRoaXMudXJsLCBkZXN0KTtcblxuICAgICAgICBsZXQgc291cmNlX2RhdGEgPSBkZXN0LnNvdXJjZV9kYXRhO1xuICAgICAgICBzb3VyY2VfZGF0YS51cmwgPSB1cmw7XG4gICAgICAgIGRlc3QuZGVidWcgPSBkZXN0LmRlYnVnIHx8IHt9O1xuICAgICAgICBkZXN0LmRlYnVnLm5ldHdvcmsgPSArbmV3IERhdGUoKTtcblxuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgc291cmNlX2RhdGEuZXJyb3IgPSBudWxsO1xuICAgICAgICAgICAgLy8gRm9yIHRlc3RpbmcgbmV0d29yayBlcnJvcnNcbiAgICAgICAgICAgIC8vIHZhciBwcm9taXNlID0gVXRpbHMuaW8odXJsLCA2MCAqIDEwMCwgdGhpcy5yZXNwb25zZV90eXBlKTtcbiAgICAgICAgICAgIC8vIGlmIChNYXRoLnJhbmRvbSgpIDwgLjcpIHtcbiAgICAgICAgICAgIC8vICAgICBwcm9taXNlID0gUHJvbWlzZS5yZWplY3QoRXJyb3IoJ2Zha2UgZGF0YSBzb3VyY2UgZXJyb3InKSk7XG4gICAgICAgICAgICAvLyB9XG4gICAgICAgICAgICAvLyBwcm9taXNlLnRoZW4oKGJvZHkpID0+IHtcbiAgICAgICAgICAgIGxldCBwcm9taXNlID0gVXRpbHMuaW8odXJsLCA2MCAqIDEwMDAsIHRoaXMucmVzcG9uc2VfdHlwZSk7XG4gICAgICAgICAgICBzb3VyY2VfZGF0YS5yZXF1ZXN0ID0gcHJvbWlzZS5yZXF1ZXN0O1xuXG4gICAgICAgICAgICBwcm9taXNlLnRoZW4oKGJvZHkpID0+IHtcbiAgICAgICAgICAgICAgICBkZXN0LmRlYnVnLnJlc3BvbnNlX3NpemUgPSBib2R5Lmxlbmd0aCB8fCBib2R5LmJ5dGVMZW5ndGg7XG4gICAgICAgICAgICAgICAgZGVzdC5kZWJ1Zy5uZXR3b3JrID0gK25ldyBEYXRlKCkgLSBkZXN0LmRlYnVnLm5ldHdvcms7XG4gICAgICAgICAgICAgICAgZGVzdC5kZWJ1Zy5wYXJzaW5nID0gK25ldyBEYXRlKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5wYXJzZVNvdXJjZURhdGEoZGVzdCwgc291cmNlX2RhdGEsIGJvZHkpO1xuICAgICAgICAgICAgICAgIGRlc3QuZGVidWcucGFyc2luZyA9ICtuZXcgRGF0ZSgpIC0gZGVzdC5kZWJ1Zy5wYXJzaW5nO1xuICAgICAgICAgICAgICAgIHJlc29sdmUoZGVzdCk7XG4gICAgICAgICAgICB9KS5jYXRjaCgoZXJyb3IpID0+IHtcbiAgICAgICAgICAgICAgICBzb3VyY2VfZGF0YS5lcnJvciA9IGVycm9yLnN0YWNrO1xuICAgICAgICAgICAgICAgIHJlc29sdmUoZGVzdCk7IC8vIHJlc29sdmUgcmVxdWVzdCBidXQgcGFzcyBhbG9uZyBlcnJvclxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIFN1Yi1jbGFzc2VzIG11c3QgaW1wbGVtZW50OlxuXG4gICAgZm9ybWF0VXJsICh1cmxfdGVtcGxhdGUsIGRlc3QpIHtcbiAgICAgICAgdGhyb3cgbmV3IE1ldGhvZE5vdEltcGxlbWVudGVkKCdmb3JtYXRVcmwnKTtcbiAgICB9XG5cbiAgICBwYXJzZVNvdXJjZURhdGEgKGRlc3QsIHNvdXJjZSwgcmVwb25zZSkge1xuICAgICAgICB0aHJvdyBuZXcgTWV0aG9kTm90SW1wbGVtZW50ZWQoJ3BhcnNlU291cmNlRGF0YScpO1xuICAgIH1cbn1cblxuXG4vKioqIEdlbmVyaWMgbmV0d29yayB0aWxlIGxvYWRpbmcgLSBhYnN0cmFjdCBjbGFzcyAqKiovXG5cbmV4cG9ydCBjbGFzcyBOZXR3b3JrVGlsZVNvdXJjZSBleHRlbmRzIE5ldHdvcmtTb3VyY2Uge1xuXG4gICAgY29uc3RydWN0b3IgKHNvdXJjZSwgc291cmNlcykge1xuICAgICAgICBzdXBlcihzb3VyY2UsIHNvdXJjZXMpO1xuXG4gICAgICAgIHRoaXMudGlsZWQgPSB0cnVlO1xuICAgICAgICB0aGlzLnBhcnNlQm91bmRzKHNvdXJjZSk7XG5cbiAgICAgICAgLy8gaW5kaWNhdGVzIGlmIHNvdXJjZSBzaG91bGQgYnVpbGQgZ2VvbWV0cnkgdGlsZXMsIGVuYWJsZWQgZm9yIHNvdXJjZXMgcmVmZXJlbmNlZCBpbiB0aGUgc2NlbmUncyBsYXllcnMsXG4gICAgICAgIC8vIGFuZCBsZWZ0IGRpc2FibGVkIGZvciBzb3VyY2VzIHRoYXQgYXJlIG5ldmVyIHJlZmVyZW5jZWQsIG9yIG9ubHkgdXNlZCBhcyByYXN0ZXIgdGV4dHVyZXNcbiAgICAgICAgdGhpcy5idWlsZHNfZ2VvbWV0cnlfdGlsZXMgPSBmYWxzZTtcblxuICAgICAgICB0aGlzLnRtcyA9IChzb3VyY2UudG1zID09PSB0cnVlKTsgLy8gb3B0aW9uYWxseSBmbGlwIHRpbGUgY29vcmRzIGZvciBUTVNcbiAgICAgICAgdGhpcy51cmxfaG9zdHMgPSBudWxsO1xuICAgICAgICB2YXIgaG9zdF9tYXRjaCA9IHRoaXMudXJsLm1hdGNoKC97czpcXFsoW159K10rKVxcXX0vKTtcbiAgICAgICAgaWYgKGhvc3RfbWF0Y2ggIT0gbnVsbCAmJiBob3N0X21hdGNoLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgICAgIHRoaXMudXJsX2hvc3RzID0gaG9zdF9tYXRjaFsxXS5zcGxpdCgnLCcpO1xuICAgICAgICAgICAgdGhpcy5uZXh0X2hvc3QgPSAwO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gR2V0IGJvdW5kcyBmcm9tIHNvdXJjZSBjb25maWcgcGFyYW1ldGVyc1xuICAgIHBhcnNlQm91bmRzIChzb3VyY2UpIHtcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoc291cmNlLmJvdW5kcykgJiYgc291cmNlLmJvdW5kcy5sZW5ndGggPT09IDQpIHtcbiAgICAgICAgICAgIHRoaXMuYm91bmRzID0gc291cmNlLmJvdW5kcztcbiAgICAgICAgICAgIGxldCBbdywgcywgZSwgbl0gPSB0aGlzLmJvdW5kcztcbiAgICAgICAgICAgIHRoaXMuYm91bmRzX21ldGVycyA9IHtcbiAgICAgICAgICAgICAgICBtaW46IEdlby5sYXRMbmdUb01ldGVycyhbdywgbl0pLFxuICAgICAgICAgICAgICAgIG1heDogR2VvLmxhdExuZ1RvTWV0ZXJzKFtlLCBzXSksXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgdGhpcy5ib3VuZHNfdGlsZXMgPSB7IG1pbjoge30sIG1heDoge30gfTsgLy8gbWF4IHRpbGUgYm91bmRzIHBlciB6b29tIChsYXppbHkgZXZhbHVhdGVkKVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gUmV0dXJucyBmYWxzZSBpZiB0aWxlIGlzIG91dHNpZGUgZGF0YSBzb3VyY2UncyBib3VuZHMsIHRydWUgaWYgd2l0aGluXG4gICAgY2hlY2tCb3VuZHMgKGNvb3Jkcykge1xuICAgICAgICAvLyBDaGVjayB0aWxlIGJvdW5kc1xuICAgICAgICBpZiAodGhpcy5ib3VuZHMpIHtcbiAgICAgICAgICAgIGNvb3JkcyA9IEdlby53cmFwVGlsZShjb29yZHMsIHsgeDogdHJ1ZSB9KTtcblxuICAgICAgICAgICAgbGV0IG1pbiA9IHRoaXMuYm91bmRzX3RpbGVzLm1pbltjb29yZHMuel07XG4gICAgICAgICAgICBpZiAoIW1pbikge1xuICAgICAgICAgICAgICAgIG1pbiA9IHRoaXMuYm91bmRzX3RpbGVzLm1pbltjb29yZHMuel0gPSBHZW8udGlsZUZvck1ldGVycyh0aGlzLmJvdW5kc19tZXRlcnMubWluLCBjb29yZHMueik7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGxldCBtYXggPSB0aGlzLmJvdW5kc190aWxlcy5tYXhbY29vcmRzLnpdO1xuICAgICAgICAgICAgaWYgKCFtYXgpIHtcbiAgICAgICAgICAgICAgICBtYXggPSB0aGlzLmJvdW5kc190aWxlcy5tYXhbY29vcmRzLnpdID0gR2VvLnRpbGVGb3JNZXRlcnModGhpcy5ib3VuZHNfbWV0ZXJzLm1heCwgY29vcmRzLnopO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoY29vcmRzLnggPCBtaW4ueCB8fCBjb29yZHMueCA+IG1heC54IHx8XG4gICAgICAgICAgICAgICAgY29vcmRzLnkgPCBtaW4ueSB8fCBjb29yZHMueSA+IG1heC55KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGluY2x1ZGVzVGlsZSAoY29vcmRzLCBzdHlsZV96b29tKSB7XG4gICAgICAgIGlmICghc3VwZXIuaW5jbHVkZXNUaWxlKGNvb3Jkcywgc3R5bGVfem9vbSkpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENoZWNrIHRpbGUgYm91bmRzXG4gICAgICAgIGlmICghdGhpcy5jaGVja0JvdW5kcyhjb29yZHMpKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgZm9ybWF0VXJsKHVybF90ZW1wbGF0ZSwgdGlsZSkge1xuICAgICAgICBsZXQgY29vcmRzID0gR2VvLndyYXBUaWxlKHRpbGUuY29vcmRzLCB7IHg6IHRydWUgfSk7XG5cbiAgICAgICAgaWYgKHRoaXMudG1zKSB7XG4gICAgICAgICAgICBjb29yZHMueSA9IE1hdGgucG93KDIsIGNvb3Jkcy56KSAtIDEgLSBjb29yZHMueTsgLy8gb3B0aW9uYWxseSBmbGlwIHRpbGUgY29vcmRzIGZvciBUTVNcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCB1cmwgPSB1cmxfdGVtcGxhdGUucmVwbGFjZSgne3h9JywgY29vcmRzLngpLnJlcGxhY2UoJ3t5fScsIGNvb3Jkcy55KS5yZXBsYWNlKCd7en0nLCBjb29yZHMueik7XG5cbiAgICAgICAgaWYgKHRoaXMudXJsX2hvc3RzICE9IG51bGwpIHtcbiAgICAgICAgICAgIHVybCA9IHVybC5yZXBsYWNlKC97czpcXFsoW159K10rKVxcXX0vLCB0aGlzLnVybF9ob3N0c1t0aGlzLm5leHRfaG9zdF0pO1xuICAgICAgICAgICAgdGhpcy5uZXh0X2hvc3QgPSAodGhpcy5uZXh0X2hvc3QgKyAxKSAlIHRoaXMudXJsX2hvc3RzLmxlbmd0aDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdXJsO1xuICAgIH1cblxuICAgIC8vIENoZWNrcyBmb3IgdGhlIHgveS96IHRpbGUgcGF0dGVybiBpbiBVUkwgdGVtcGxhdGVcbiAgICB1cmxIYXNUaWxlUGF0dGVybih1cmwpIHtcbiAgICAgICAgcmV0dXJuIHVybCAmJlxuICAgICAgICAgICAgdXJsLnNlYXJjaCgne3h9JykgPiAtMSAmJlxuICAgICAgICAgICAgdXJsLnNlYXJjaCgne3l9JykgPiAtMSAmJlxuICAgICAgICAgICAgdXJsLnNlYXJjaCgne3p9JykgPiAtMTtcbiAgICB9XG5cbn1cbiIsImltcG9ydCBsb2cgZnJvbSAnLi4vdXRpbHMvbG9nJztcbmltcG9ydCBEYXRhU291cmNlLCB7TmV0d29ya1NvdXJjZSwgTmV0d29ya1RpbGVTb3VyY2V9IGZyb20gJy4vZGF0YV9zb3VyY2UnO1xuaW1wb3J0IHtkZWNvZGVNdWx0aVBvbHlnb259IGZyb20gJy4vbXZ0JztcbmltcG9ydCBHZW8gZnJvbSAnLi4vZ2VvJztcblxuLy8gRm9yIHRpbGluZyBHZW9KU09OIGNsaWVudC1zaWRlXG5pbXBvcnQgZ2VvanNvbnZ0IGZyb20gJ2dlb2pzb24tdnQnO1xuXG4vKipcbiBHZW9KU09OIHN0YW5kYWxvbmUgKG5vbi10aWxlZCkgc291cmNlXG4gVXNlcyBnZW9qc29uLXZ0IHNwbGl0IGludG8gdGlsZXMgY2xpZW50LXNpZGVcbiovXG5cbmV4cG9ydCBjbGFzcyBHZW9KU09OU291cmNlIGV4dGVuZHMgTmV0d29ya1NvdXJjZSB7XG5cbiAgICBjb25zdHJ1Y3Rvcihzb3VyY2UsIHNvdXJjZXMpIHtcbiAgICAgICAgc3VwZXIoc291cmNlLCBzb3VyY2VzKTtcbiAgICAgICAgdGhpcy5sb2FkX2RhdGEgPSBudWxsO1xuICAgICAgICB0aGlzLnRpbGVfaW5kZXhlcyA9IHt9OyAvLyBnZW9qc29uLXZ0IHRpbGUgaW5kaWNlcywgYnkgbGF5ZXIgbmFtZVxuICAgICAgICB0aGlzLm1heF96b29tID0gTWF0aC5tYXgodGhpcy5tYXhfem9vbSB8fCAwLCAxNSk7IC8vIFRPRE86IG1heCB6b29tIDwgMTUgY2F1c2VzIGFydGlmYWN0cy9uby1kcmF3IGF0IDIwLCBpbnZlc3RpZ2F0ZVxuICAgICAgICB0aGlzLnBhZF9zY2FsZSA9IDA7IC8vIHdlIGRvbid0IHdhbnQgcGFkZGluZyBvbiBhdXRvLXRpbGVkIHNvdXJjZXNcbiAgICB9XG5cbiAgICBfbG9hZChkZXN0KSB7XG4gICAgICAgIGlmICghdGhpcy5sb2FkX2RhdGEpIHtcbiAgICAgICAgICAgIHRoaXMubG9hZF9kYXRhID0gc3VwZXIuX2xvYWQoeyBzb3VyY2VfZGF0YTogeyBsYXllcnM6IHt9IH0gfSkudGhlbihkYXRhID0+IHtcbiAgICAgICAgICAgICAgICAvLyBXYXJuIGFuZCBjb250aW51ZSBvbiBkYXRhIHNvdXJjZSBlcnJvclxuICAgICAgICAgICAgICAgIGlmIChkYXRhLnNvdXJjZV9kYXRhLmVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgIGxvZygnd2FybicsIGBkYXRhIHNvdXJjZSBsb2FkIGVycm9yKHMpIGZvciBzb3VyY2UgJyR7dGhpcy5uYW1lfScsIFVSTCAnJHt0aGlzLnVybH0nOiAke2RhdGEuc291cmNlX2RhdGEuZXJyb3J9YCk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgbGV0IGxheWVycyA9IGRhdGEuc291cmNlX2RhdGEubGF5ZXJzO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGxheWVyX25hbWUgaW4gbGF5ZXJzKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudGlsZV9pbmRleGVzW2xheWVyX25hbWVdID0gZ2VvanNvbnZ0KGxheWVyc1tsYXllcl9uYW1lXSwge1xuICAgICAgICAgICAgICAgICAgICAgICAgbWF4Wm9vbTogdGhpcy5tYXhfem9vbSwgIC8vIG1heCB6b29tIHRvIHByZXNlcnZlIGRldGFpbCBvblxuICAgICAgICAgICAgICAgICAgICAgICAgdG9sZXJhbmNlOiAzLCAvLyBzaW1wbGlmaWNhdGlvbiB0b2xlcmFuY2UgKGhpZ2hlciBtZWFucyBzaW1wbGVyKVxuICAgICAgICAgICAgICAgICAgICAgICAgZXh0ZW50OiBHZW8udGlsZV9zY2FsZSwgLy8gdGlsZSBleHRlbnQgKGJvdGggd2lkdGggYW5kIGhlaWdodClcbiAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlcjogMC4wMDAxICAgICAvLyB0aWxlIGJ1ZmZlciBvbiBlYWNoIHNpZGVcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgdGhpcy5sb2FkZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIHJldHVybiBkYXRhO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy5sb2FkX2RhdGEudGhlbigoKSA9PiB7XG4gICAgICAgICAgICBmb3IgKGxldCBsYXllcl9uYW1lIGluIHRoaXMudGlsZV9pbmRleGVzKSB7XG4gICAgICAgICAgICAgICAgZGVzdC5zb3VyY2VfZGF0YS5sYXllcnNbbGF5ZXJfbmFtZV0gPSB0aGlzLmdldFRpbGVGZWF0dXJlcyhkZXN0LCBsYXllcl9uYW1lKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBkZXN0O1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBnZXRUaWxlRmVhdHVyZXModGlsZSwgbGF5ZXJfbmFtZSkge1xuICAgICAgICBsZXQgY29vcmRzID0gR2VvLndyYXBUaWxlKHRpbGUuY29vcmRzLCB7IHg6IHRydWUgfSk7XG5cbiAgICAgICAgLy8gcmVxdWVzdCBhIHBhcnRpY3VsYXIgdGlsZVxuICAgICAgICBsZXQgdCA9IHRoaXMudGlsZV9pbmRleGVzW2xheWVyX25hbWVdLmdldFRpbGUoY29vcmRzLnosIGNvb3Jkcy54LCBjb29yZHMueSk7XG5cbiAgICAgICAgLy8gQ29udmVydCBmcm9tIE1WVC1zdHlsZSBKU09OIHN0cnVjdCB0byBHZW9KU09OXG4gICAgICAgIGxldCBjb2xsZWN0aW9uO1xuICAgICAgICBpZiAodCAmJiB0LmZlYXR1cmVzKSB7XG4gICAgICAgICAgICBjb2xsZWN0aW9uID0ge1xuICAgICAgICAgICAgICAgIHR5cGU6ICdGZWF0dXJlQ29sbGVjdGlvbicsXG4gICAgICAgICAgICAgICAgZmVhdHVyZXM6IFtdXG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICBmb3IgKGxldCBpPTA7IGkgPCB0LmZlYXR1cmVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZmVhdHVyZSA9IHQuZmVhdHVyZXNbaV07XG5cbiAgICAgICAgICAgICAgICAvLyBHZW9KU09OIGZlYXR1cmVcbiAgICAgICAgICAgICAgICBsZXQgZiA9IHtcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogJ0ZlYXR1cmUnLFxuICAgICAgICAgICAgICAgICAgICBnZW9tZXRyeToge30sXG4gICAgICAgICAgICAgICAgICAgIHByb3BlcnRpZXM6IGZlYXR1cmUudGFnc1xuICAgICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgICBpZiAoZmVhdHVyZS50eXBlID09PSAxKSB7XG4gICAgICAgICAgICAgICAgICAgIGYuZ2VvbWV0cnkuY29vcmRpbmF0ZXMgPSBmZWF0dXJlLmdlb21ldHJ5Lm1hcChjb29yZCA9PiBbY29vcmRbMF0sIGNvb3JkWzFdXSk7XG4gICAgICAgICAgICAgICAgICAgIGYuZ2VvbWV0cnkudHlwZSA9ICdNdWx0aVBvaW50JztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoZmVhdHVyZS50eXBlID09PSAyIHx8IGZlYXR1cmUudHlwZSA9PT0gMykge1xuICAgICAgICAgICAgICAgICAgICBmLmdlb21ldHJ5LmNvb3JkaW5hdGVzID0gZmVhdHVyZS5nZW9tZXRyeS5tYXAocmluZyA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgcmluZy5tYXAoY29vcmQgPT4gW2Nvb3JkWzBdLCBjb29yZFsxXV0pXG4gICAgICAgICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKGZlYXR1cmUudHlwZSA9PT0gMikge1xuICAgICAgICAgICAgICAgICAgICAgICAgZi5nZW9tZXRyeS50eXBlID0gJ011bHRpTGluZVN0cmluZyc7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSAge1xuICAgICAgICAgICAgICAgICAgICAgICAgZi5nZW9tZXRyeSA9IGRlY29kZU11bHRpUG9seWdvbihmLmdlb21ldHJ5KTsgLy8gdW4tZmxhdHRlbiByaW5nc1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGYuZ2VvbWV0cnkgPT0gbnVsbCkgeyAvLyBza2lwIHBvbHlzIHRoYXQgY291bGRuJ3QgYmUgZGVjb2RlZCAoZS5nLiBkZWdlbmVyYXRlKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBjb2xsZWN0aW9uLmZlYXR1cmVzLnB1c2goZik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gY29sbGVjdGlvbjtcbiAgICB9XG5cbiAgICBmb3JtYXRVcmwgKGRlc3QpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudXJsO1xuICAgIH1cblxuICAgIHBhcnNlU291cmNlRGF0YSAodGlsZSwgc291cmNlLCByZXNwb25zZSkge1xuICAgICAgICBsZXQgcGFyc2VkX3Jlc3BvbnNlID0gSlNPTi5wYXJzZShyZXNwb25zZSk7XG4gICAgICAgIGxldCBsYXllcnMgPSB0aGlzLmdldExheWVycyhwYXJzZWRfcmVzcG9uc2UpO1xuICAgICAgICBzb3VyY2UubGF5ZXJzID0gdGhpcy5wcmVwcm9jZXNzTGF5ZXJzKGxheWVycyk7XG4gICAgfVxuXG4gICAgcHJlcHJvY2Vzc0xheWVycyAobGF5ZXJzKXtcbiAgICAgICAgZm9yIChsZXQga2V5IGluIGxheWVycykge1xuICAgICAgICAgICAgbGV0IGxheWVyID0gbGF5ZXJzW2tleV07XG4gICAgICAgICAgICB0aGlzLnByZXByb2Nlc3NGZWF0dXJlcyhsYXllci5mZWF0dXJlcyk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBBcHBseSBvcHRpb25hbCBkYXRhIHRyYW5zZm9ybVxuICAgICAgICBpZiAodHlwZW9mIHRoaXMudHJhbnNmb3JtID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICBpZiAoT2JqZWN0LmtleXMobGF5ZXJzKS5sZW5ndGggPT09IDEgJiYgbGF5ZXJzLl9kZWZhdWx0KSB7XG4gICAgICAgICAgICAgICAgbGF5ZXJzLl9kZWZhdWx0ID0gdGhpcy50cmFuc2Zvcm0obGF5ZXJzLl9kZWZhdWx0LCB0aGlzLmV4dHJhX2RhdGEpOyAvLyBzaW5nbGUtbGF5ZXJcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGxheWVycyA9IHRoaXMudHJhbnNmb3JtKGxheWVycywgdGhpcy5leHRyYV9kYXRhKTsgLy8gbXVsdGlwbGUgbGF5ZXJzXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbGF5ZXJzO1xuICAgIH1cblxuICAgIC8vIFByZXByb2Nlc3MgZmVhdHVyZXMuIEN1cnJlbnRseSB1c2VkIHRvIGFkZCBhIG5ldyBcImNlbnRyb2lkXCIgZmVhdHVyZSBmb3IgcG9seWdvbiBsYWJlbGluZ1xuICAgIHByZXByb2Nlc3NGZWF0dXJlcyAoZmVhdHVyZXMpIHtcbiAgICAgICAgLy8gRGVmaW5lIGNlbnRyb2lkcyBmb3IgcG9seWdvbnMgZm9yIGNlbnRyb2lkIGxhYmVsIHBsYWNlbWVudFxuICAgICAgICAvLyBBdm9pZHMgcmVkdW5kYW50IGxhYmVsIHBsYWNlbWVudCBmb3IgZWFjaCBnZW5lcmF0ZWQgdGlsZSBhdCBoaWdoZXIgem9vbSBsZXZlbHNcbiAgICAgICAgaWYgKHRoaXMuY29uZmlnLmdlbmVyYXRlX2xhYmVsX2NlbnRyb2lkcyl7XG4gICAgICAgICAgICBsZXQgZmVhdHVyZXNfY2VudHJvaWQgPSBbXTtcbiAgICAgICAgICAgIGxldCBjZW50cm9pZF9wcm9wZXJ0aWVzID0ge1wibGFiZWxfcGxhY2VtZW50XCIgOiB0cnVlfTtcblxuICAgICAgICAgICAgZmVhdHVyZXMuZm9yRWFjaChmZWF0dXJlID0+IHtcbiAgICAgICAgICAgICAgICBsZXQgY29vcmRpbmF0ZXMsIGNlbnRyb2lkX2ZlYXR1cmU7XG4gICAgICAgICAgICAgICAgc3dpdGNoIChmZWF0dXJlLmdlb21ldHJ5LnR5cGUpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAnUG9seWdvbic6XG4gICAgICAgICAgICAgICAgICAgICAgICBjb29yZGluYXRlcyA9IGZlYXR1cmUuZ2VvbWV0cnkuY29vcmRpbmF0ZXM7XG4gICAgICAgICAgICAgICAgICAgICAgICBjZW50cm9pZF9mZWF0dXJlID0gZ2V0Q2VudHJvaWRGZWF0dXJlRm9yUG9seWdvbihjb29yZGluYXRlcywgZmVhdHVyZS5wcm9wZXJ0aWVzLCBjZW50cm9pZF9wcm9wZXJ0aWVzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZlYXR1cmVzX2NlbnRyb2lkLnB1c2goY2VudHJvaWRfZmVhdHVyZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAnTXVsdGlQb2x5Z29uJzpcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEFkZCBjZW50cm9pZCBmZWF0dXJlIGZvciBsYXJnZXN0IHBvbHlnb25cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvb3JkaW5hdGVzID0gZmVhdHVyZS5nZW9tZXRyeS5jb29yZGluYXRlcztcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBtYXhfYXJlYSA9IC1JbmZpbml0eTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBtYXhfYXJlYV9pbmRleCA9IDA7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgY29vcmRpbmF0ZXMubGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGFyZWEgPSBHZW8ucG9seWdvbkFyZWEoY29vcmRpbmF0ZXNbaW5kZXhdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYXJlYSA+IG1heF9hcmVhKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heF9hcmVhID0gYXJlYTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4X2FyZWFfaW5kZXggPSBpbmRleDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBjZW50cm9pZF9mZWF0dXJlID0gZ2V0Q2VudHJvaWRGZWF0dXJlRm9yUG9seWdvbihjb29yZGluYXRlc1ttYXhfYXJlYV9pbmRleF0sIGZlYXR1cmUucHJvcGVydGllcywgY2VudHJvaWRfcHJvcGVydGllcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBmZWF0dXJlc19jZW50cm9pZC5wdXNoKGNlbnRyb2lkX2ZlYXR1cmUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIC8vIGFwcGVuZCBjZW50cm9pZCBmZWF0dXJlcyB0byBmZWF0dXJlcyBhcnJheVxuICAgICAgICAgICAgQXJyYXkucHJvdG90eXBlLnB1c2guYXBwbHkoZmVhdHVyZXMsIGZlYXR1cmVzX2NlbnRyb2lkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBmZWF0dXJlcztcbiAgICB9XG5cbiAgICAvLyBEZXRlY3Qgc2luZ2xlIG9yIG11bHRpcGxlIGxheWVycyBpbiByZXR1cm5lZCBkYXRhXG4gICAgZ2V0TGF5ZXJzIChkYXRhKSB7XG4gICAgICAgIGlmIChkYXRhLnR5cGUgPT09ICdGZWF0dXJlJykge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBfZGVmYXVsdDoge1xuICAgICAgICAgICAgICAgICAgICB0eXBlOiAnRmVhdHVyZUNvbGxlY3Rpb24nLFxuICAgICAgICAgICAgICAgICAgICBmZWF0dXJlczogW2RhdGFdXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChkYXRhLnR5cGUgPT09ICdGZWF0dXJlQ29sbGVjdGlvbicpIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgX2RlZmF1bHQ6IGRhdGFcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gZGF0YTtcbiAgICAgICAgfVxuICAgIH1cblxufVxuXG4vKipcbiBHZW9KU09OIHZlY3RvciB0aWxlc1xuIEBjbGFzcyBHZW9KU09OVGlsZVNvdXJjZVxuKi9cbmV4cG9ydCBjbGFzcyBHZW9KU09OVGlsZVNvdXJjZSBleHRlbmRzIE5ldHdvcmtUaWxlU291cmNlIHtcblxuICAgIGNvbnN0cnVjdG9yKHNvdXJjZSwgc291cmNlcykge1xuICAgICAgICBzdXBlcihzb3VyY2UsIHNvdXJjZXMpO1xuXG4gICAgICAgIC8vIENoZWNrIGZvciBVUkwgdGlsZSBwYXR0ZXJuLCBpZiBub3QgZm91bmQsIHRyZWF0IGFzIHN0YW5kYWxvbmUgR2VvSlNPTi9Ub3BvSlNPTiBvYmplY3RcbiAgICAgICAgaWYgKCF0aGlzLnVybEhhc1RpbGVQYXR0ZXJuKHRoaXMudXJsKSkge1xuICAgICAgICAgICAgLy8gQ2hlY2sgaW5zdGFuY2UgdHlwZSBmcm9tIHBhcmVudCBjbGFzc1xuICAgICAgICAgICAgaWYgKHNvdXJjZS50eXBlID09PSAnR2VvSlNPTicpIHtcbiAgICAgICAgICAgICAgICAvLyBSZXBsYWNlIGluc3RhbmNlIHR5cGVcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEdlb0pTT05Tb3VyY2Uoc291cmNlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIFBhc3MgYmFjayB0byBwYXJlbnQgY2xhc3MgdG8gaW5zdGFudGlhdGVcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwYXJzZVNvdXJjZURhdGEgKHRpbGUsIHNvdXJjZSwgcmVzcG9uc2UpIHtcbiAgICAgICAgbGV0IGRhdGEgPSBKU09OLnBhcnNlKHJlc3BvbnNlKTtcbiAgICAgICAgdGhpcy5wcmVwYXJlR2VvSlNPTihkYXRhLCB0aWxlLCBzb3VyY2UpO1xuICAgIH1cblxuICAgIHByZXBhcmVHZW9KU09OIChkYXRhLCB0aWxlLCBzb3VyY2UpIHtcbiAgICAgICAgLy8gQXBwbHkgb3B0aW9uYWwgZGF0YSB0cmFuc2Zvcm1cbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLnRyYW5zZm9ybSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgZGF0YSA9IHRoaXMudHJhbnNmb3JtKGRhdGEsIHRoaXMuZXh0cmFfZGF0YSk7XG4gICAgICAgIH1cblxuICAgICAgICBzb3VyY2UubGF5ZXJzID0gR2VvSlNPTlNvdXJjZS5wcm90b3R5cGUuZ2V0TGF5ZXJzKGRhdGEpO1xuXG4gICAgICAgIC8vIEEgXCJzeW50aGV0aWNcIiB0aWxlIHRoYXQgYWRqdXN0cyB0aGUgdGlsZSBtaW4gYW5jaG9yIHRvIGFjY291bnQgZm9yIHRpbGUgbG9uZ2l0dWRlIHdyYXBwaW5nXG4gICAgICAgIGxldCBhbmNob3IgPSB7XG4gICAgICAgICAgICBjb29yZHM6IHRpbGUuY29vcmRzLFxuICAgICAgICAgICAgbWluOiBHZW8ubWV0ZXJzRm9yVGlsZShHZW8ud3JhcFRpbGUodGlsZS5jb29yZHMsIHsgeDogdHJ1ZSB9KSlcbiAgICAgICAgfTtcblxuICAgICAgICBEYXRhU291cmNlLnByb2plY3REYXRhKHNvdXJjZSk7IC8vIG1lcmNhdG9yIHByb2plY3Rpb25cbiAgICAgICAgRGF0YVNvdXJjZS5zY2FsZURhdGEoc291cmNlLCBhbmNob3IpOyAvLyByZS1zY2FsZSBmcm9tIG1ldGVycyB0byBsb2NhbCB0aWxlIGNvb3Jkc1xuICAgIH1cblxufVxuXG5EYXRhU291cmNlLnJlZ2lzdGVyKEdlb0pTT05UaWxlU291cmNlLCAnR2VvSlNPTicpOyAgICAgIC8vIHByZWZlcmVkIHNob3J0ZXIgbmFtZVxuXG4vLyBIZWxwZXIgZnVuY3Rpb24gdG8gY3JlYXRlIGNlbnRyb2lkIHBvaW50IGZlYXR1cmUgZnJvbSBwb2x5Z29uIGNvb3JkaW5hdGVzIGFuZCBwcm92aWRlZCBmZWF0dXJlIG1ldGEtZGF0YVxuZnVuY3Rpb24gZ2V0Q2VudHJvaWRGZWF0dXJlRm9yUG9seWdvbiAoY29vcmRpbmF0ZXMsIHByb3BlcnRpZXMsIG5ld1Byb3BlcnRpZXMpIHtcbiAgICBsZXQgY2VudHJvaWQgPSBHZW8uY2VudHJvaWQoY29vcmRpbmF0ZXMpO1xuXG4gICAgLy8gY2xvbmUgcHJvcGVydGllcyBhbmQgbWl4aXggbmV3UHJvcGVydGllc1xuICAgIGxldCBjZW50cm9pZF9wcm9wZXJ0aWVzID0ge307XG4gICAgT2JqZWN0LmFzc2lnbihjZW50cm9pZF9wcm9wZXJ0aWVzLCBwcm9wZXJ0aWVzLCBuZXdQcm9wZXJ0aWVzKTtcblxuICAgIHJldHVybiB7XG4gICAgICAgIHR5cGU6IFwiRmVhdHVyZVwiLFxuICAgICAgICBwcm9wZXJ0aWVzOiBjZW50cm9pZF9wcm9wZXJ0aWVzLFxuICAgICAgICBnZW9tZXRyeToge1xuICAgICAgICAgICAgdHlwZTogXCJQb2ludFwiLFxuICAgICAgICAgICAgY29vcmRpbmF0ZXM6IGNlbnRyb2lkXG4gICAgICAgIH1cbiAgICB9O1xufVxuIiwiaW1wb3J0IERhdGFTb3VyY2UsIHtOZXR3b3JrVGlsZVNvdXJjZX0gZnJvbSAnLi9kYXRhX3NvdXJjZSc7XG5pbXBvcnQgR2VvIGZyb20gJy4uL2dlbyc7XG5cbmltcG9ydCBQYmYgZnJvbSAncGJmJztcbmltcG9ydCB7VmVjdG9yVGlsZSwgVmVjdG9yVGlsZUZlYXR1cmV9IGZyb20gJ3ZlY3Rvci10aWxlJztcblxuLyoqXG4gTWFwYm94IFZlY3RvciBUaWxlIGZvcm1hdFxuIEBjbGFzcyBNVlRTb3VyY2VcbiovXG5leHBvcnQgY2xhc3MgTVZUU291cmNlIGV4dGVuZHMgTmV0d29ya1RpbGVTb3VyY2Uge1xuXG4gICAgY29uc3RydWN0b3IgKHNvdXJjZSwgc291cmNlcykge1xuICAgICAgICBzdXBlcihzb3VyY2UsIHNvdXJjZXMpO1xuICAgICAgICB0aGlzLnJlc3BvbnNlX3R5cGUgPSBcImFycmF5YnVmZmVyXCI7IC8vIGJpbmFyeSBkYXRhXG4gICAgfVxuXG4gICAgcGFyc2VTb3VyY2VEYXRhICh0aWxlLCBzb3VyY2UsIHJlc3BvbnNlKSB7XG4gICAgICAgIC8vIENvbnZlcnQgTWFwYm94IHZlY3RvciB0aWxlIHRvIEdlb0pTT05cbiAgICAgICAgdmFyIGRhdGEgPSBuZXcgVWludDhBcnJheShyZXNwb25zZSk7XG4gICAgICAgIHZhciBidWZmZXIgPSBuZXcgUGJmKGRhdGEpO1xuICAgICAgICBzb3VyY2UuZGF0YSA9IG5ldyBWZWN0b3JUaWxlKGJ1ZmZlcik7XG4gICAgICAgIHNvdXJjZS5sYXllcnMgPSB0aGlzLnRvR2VvSlNPTihzb3VyY2UuZGF0YSk7XG5cbiAgICAgICAgLy8gQXBwbHkgb3B0aW9uYWwgZGF0YSB0cmFuc2Zvcm1cbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLnRyYW5zZm9ybSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgc291cmNlLmxheWVycyA9IHRoaXMudHJhbnNmb3JtKHNvdXJjZS5sYXllcnMsIHRoaXMuZXh0cmFfZGF0YSk7XG4gICAgICAgIH1cblxuICAgICAgICBkZWxldGUgc291cmNlLmRhdGE7IC8vIGNvbW1lbnQgb3V0IHRvIHNhdmUgcmF3IGRhdGEgZm9yIGRlYnVnZ2luZ1xuICAgIH1cblxuICAgIC8vIExvb3AgdGhyb3VnaCBsYXllcnMvZmVhdHVyZXMgdXNpbmcgTWFwYm94IGxpYiBBUEksIGNvbnZlcnQgdG8gR2VvSlNPTiBmZWF0dXJlc1xuICAgIC8vIFJldHVybnMgYW4gb2JqZWN0IHdpdGgga2V5cyBmb3IgZWFjaCBsYXllciwgZS5nLiB7IGxheWVyOiBnZW9qc29uIH1cbiAgICB0b0dlb0pTT04gKHRpbGUpIHtcbiAgICAgICAgdmFyIGxheWVycyA9IHt9O1xuICAgICAgICBmb3IgKHZhciBsIGluIHRpbGUubGF5ZXJzKSB7XG4gICAgICAgICAgICB2YXIgbGF5ZXIgPSB0aWxlLmxheWVyc1tsXTtcbiAgICAgICAgICAgIHZhciBsYXllcl9nZW9qc29uID0ge1xuICAgICAgICAgICAgICAgIHR5cGU6ICdGZWF0dXJlQ29sbGVjdGlvbicsXG4gICAgICAgICAgICAgICAgZmVhdHVyZXM6IFtdXG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICBmb3IgKHZhciBmPTA7IGYgPCBsYXllci5sZW5ndGg7IGYrKykge1xuICAgICAgICAgICAgICAgIHZhciBmZWF0dXJlID0gbGF5ZXIuZmVhdHVyZShmKTtcbiAgICAgICAgICAgICAgICB2YXIgZmVhdHVyZV9nZW9qc29uID0ge1xuICAgICAgICAgICAgICAgICAgICB0eXBlOiAnRmVhdHVyZScsXG4gICAgICAgICAgICAgICAgICAgIGdlb21ldHJ5OiB7fSxcbiAgICAgICAgICAgICAgICAgICAgcHJvcGVydGllczogZmVhdHVyZS5wcm9wZXJ0aWVzXG4gICAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgICAgIHZhciBnZW9tZXRyeSA9IGZlYXR1cmVfZ2VvanNvbi5nZW9tZXRyeTtcbiAgICAgICAgICAgICAgICB2YXIgY29vcmRpbmF0ZXMgPSBmZWF0dXJlLmxvYWRHZW9tZXRyeSgpO1xuICAgICAgICAgICAgICAgIGZvciAodmFyIHI9MDsgciA8IGNvb3JkaW5hdGVzLmxlbmd0aDsgcisrKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciByaW5nID0gY29vcmRpbmF0ZXNbcl07XG4gICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGM9MDsgYyA8IHJpbmcubGVuZ3RoOyBjKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJpbmdbY10gPSBbXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmluZ1tjXS54LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJpbmdbY10ueVxuICAgICAgICAgICAgICAgICAgICAgICAgXTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBnZW9tZXRyeS5jb29yZGluYXRlcyA9IGNvb3JkaW5hdGVzO1xuXG4gICAgICAgICAgICAgICAgaWYgKFZlY3RvclRpbGVGZWF0dXJlLnR5cGVzW2ZlYXR1cmUudHlwZV0gPT09ICdQb2ludCcpIHtcbiAgICAgICAgICAgICAgICAgICAgZ2VvbWV0cnkudHlwZSA9ICdQb2ludCc7XG4gICAgICAgICAgICAgICAgICAgIGdlb21ldHJ5LmNvb3JkaW5hdGVzID0gZ2VvbWV0cnkuY29vcmRpbmF0ZXNbMF1bMF07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKFZlY3RvclRpbGVGZWF0dXJlLnR5cGVzW2ZlYXR1cmUudHlwZV0gPT09ICdMaW5lU3RyaW5nJykge1xuICAgICAgICAgICAgICAgICAgICBpZiAoY29vcmRpbmF0ZXMubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBnZW9tZXRyeS50eXBlID0gJ0xpbmVTdHJpbmcnO1xuICAgICAgICAgICAgICAgICAgICAgICAgZ2VvbWV0cnkuY29vcmRpbmF0ZXMgPSBnZW9tZXRyeS5jb29yZGluYXRlc1swXTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGdlb21ldHJ5LnR5cGUgPSAnTXVsdGlMaW5lU3RyaW5nJztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChWZWN0b3JUaWxlRmVhdHVyZS50eXBlc1tmZWF0dXJlLnR5cGVdID09PSAnUG9seWdvbicpIHtcbiAgICAgICAgICAgICAgICAgICAgZ2VvbWV0cnkgPSBkZWNvZGVNdWx0aVBvbHlnb24oZ2VvbWV0cnkpOyAvLyB1bi1mbGF0dGVuIHJpbmdzXG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgbGF5ZXJfZ2VvanNvbi5mZWF0dXJlcy5wdXNoKGZlYXR1cmVfZ2VvanNvbik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsYXllcnNbbF0gPSBsYXllcl9nZW9qc29uO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBsYXllcnM7XG4gICAgfVxuXG59XG5cbi8vIERlY29kZSBtdWx0aXBvbHlnb25zLCB3aGljaCBhcmUgZW5jb2RlZCBhcyBhIHNpbmdsZSBzZXQgb2YgcmluZ3Ncbi8vIFdpbmRpbmcgb3JkZXIgb2YgZmlyc3QgcmluZyBpcyBhc3N1bWVkIHRvIGluZGljYXRlIGV4dGVyaW9yIHJpbmcsXG4vLyB0aGUgb3Bwb3NpdGUgd2luZGluZyBvcmRlciBpbmRpY2F0ZXMgdGhlIHN0YXJ0IG9mIGEgbmV3IHBvbHlnb24uXG5leHBvcnQgZnVuY3Rpb24gZGVjb2RlTXVsdGlQb2x5Z29uIChnZW9tKSB7XG4gICAgbGV0IHBvbHlzID0gW107XG4gICAgbGV0IHBvbHkgPSBbXTtcbiAgICBsZXQgb3V0ZXJfd2luZGluZztcbiAgICBmb3IgKGxldCByPTA7IHIgPCBnZW9tLmNvb3JkaW5hdGVzLmxlbmd0aDsgcisrKSB7XG4gICAgICAgIGxldCByaW5nID0gZ2VvbS5jb29yZGluYXRlc1tyXTtcbiAgICAgICAgbGV0IHdpbmRpbmcgPSBHZW8ucmluZ1dpbmRpbmcocmluZyk7XG4gICAgICAgIGlmICh3aW5kaW5nID09IG51bGwpIHtcbiAgICAgICAgICAgIGNvbnRpbnVlOyAvLyBza2lwIHplcm8tYXJlYSByaW5nc1xuICAgICAgICB9XG5cbiAgICAgICAgb3V0ZXJfd2luZGluZyA9IG91dGVyX3dpbmRpbmcgfHwgd2luZGluZzsgLy8gYXNzdW1lIGZpcnN0IHJpbmcgaW5kaWNhdGVzIG91dGVyIHJpbmcgd2luZGluZ1xuXG4gICAgICAgIGlmICh3aW5kaW5nID09PSBvdXRlcl93aW5kaW5nICYmIHBvbHkubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgcG9seXMucHVzaChwb2x5KTtcbiAgICAgICAgICAgIHBvbHkgPSBbXTtcbiAgICAgICAgfVxuICAgICAgICBwb2x5LnB1c2gocmluZyk7XG4gICAgfVxuICAgIGlmIChwb2x5Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgcG9seXMucHVzaChwb2x5KTtcbiAgICB9XG5cbiAgICAvLyBTaW5nbGUgb3IgbXVsdGk/XG4gICAgaWYgKHBvbHlzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICBnZW9tLnR5cGUgPSAnUG9seWdvbic7XG4gICAgICAgIGdlb20uY29vcmRpbmF0ZXMgPSBwb2x5c1swXTtcbiAgICB9XG4gICAgZWxzZSBpZiAocG9seXMubGVuZ3RoID4gMSkge1xuICAgICAgICBnZW9tLnR5cGUgPSAnTXVsdGlQb2x5Z29uJztcbiAgICAgICAgZ2VvbS5jb29yZGluYXRlcyA9IHBvbHlzO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgZ2VvbSA9IG51bGw7XG4gICAgfVxuXG4gICAgcmV0dXJuIGdlb207XG59XG5cbkRhdGFTb3VyY2UucmVnaXN0ZXIoTVZUU291cmNlLCAnTVZUJyk7XG4iLCJpbXBvcnQgRGF0YVNvdXJjZSwge05ldHdvcmtUaWxlU291cmNlfSBmcm9tICcuL2RhdGFfc291cmNlJztcbmltcG9ydCBUaWxlIGZyb20gJy4uL3RpbGUnO1xuaW1wb3J0IEdlbyBmcm9tICcuLi9nZW8nO1xuXG5leHBvcnQgY2xhc3MgUmFzdGVyVGlsZVNvdXJjZSBleHRlbmRzIE5ldHdvcmtUaWxlU291cmNlIHtcblxuICAgIGNvbnN0cnVjdG9yKHNvdXJjZSwgc291cmNlcykge1xuICAgICAgICBzdXBlcihzb3VyY2UsIHNvdXJjZXMpO1xuXG4gICAgICAgIGlmICh0aGlzLnJhc3RlcnMuaW5kZXhPZih0aGlzLm5hbWUpID09PSAtMSkge1xuICAgICAgICAgICAgdGhpcy5yYXN0ZXJzLnVuc2hpZnQodGhpcy5uYW1lKTsgLy8gYWRkIHRoaXMgcmFzdGVyIGFzIHRoZSBmaXJzdFxuICAgICAgICB9XG4gICAgICAgIHRoaXMuZmlsdGVyaW5nID0gc291cmNlLmZpbHRlcmluZzsgLy8gb3B0aW9uYWwgdGV4dHVyZSBmaWx0ZXJpbmcgKG5lYXJlc3QsIGxpbmVhciwgbWlwbWFwKVxuXG4gICAgICAgIC8vIHNhdmUgdGV4dHVyZSBvYmplY3RzIGJ5IHRpbGUga2V5LCBzbyBVUkwgcmVtYWlucyBzdGFibGUgaWYgdGlsZSBpcyBidWlsdCBtdWx0aXBsZSB0aW1lcyxcbiAgICAgICAgLy8gZS5nLiBhdm9pZCByZS1sb2FkaW5nIHRoZSBzYW1lIHRpbGUgdGV4dHVyZSB1bmRlciBhIGRpZmZlcmVudCBzdWJkb21haW4gd2hlbiB1c2luZyB0aWxlIGhvc3RzXG4gICAgICAgIHRoaXMudGV4dHVyZXMgPSB7fTtcbiAgICB9XG5cbiAgICBsb2FkKHRpbGUpIHtcbiAgICAgICAgdGlsZS5zb3VyY2VfZGF0YSA9IHt9O1xuICAgICAgICB0aWxlLnNvdXJjZV9kYXRhLmxheWVycyA9IHt9O1xuICAgICAgICB0aWxlLnBhZF9zY2FsZSA9IHRoaXMucGFkX3NjYWxlO1xuICAgICAgICB0aWxlLnJhc3RlcnMgPSBbLi4udGhpcy5yYXN0ZXJzXTsgLy8gY29weSBsaXN0IG9mIHJhc3RlcnMgdG8gbG9hZCBmb3IgdGlsZVxuXG4gICAgICAgIC8vIEdlbmVyYXRlIGEgc2luZ2xlIHF1YWQgdGhhdCBmaWxscyB0aGUgZW50aXJlIHRpbGVcbiAgICAgICAgbGV0IHNjYWxlID0gR2VvLnRpbGVfc2NhbGU7XG4gICAgICAgIHRpbGUuc291cmNlX2RhdGEubGF5ZXJzID0ge1xuICAgICAgICAgICAgX2RlZmF1bHQ6IHtcbiAgICAgICAgICAgICAgICB0eXBlOiAnRmVhdHVyZUNvbGxlY3Rpb24nLFxuICAgICAgICAgICAgICAgIGZlYXR1cmVzOiBbe1xuICAgICAgICAgICAgICAgICAgICBnZW9tZXRyeToge1xuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ1BvbHlnb24nLFxuICAgICAgICAgICAgICAgICAgICAgICAgY29vcmRpbmF0ZXM6IFtbXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgWzAsIDBdLCBbc2NhbGUsIDBdLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzY2FsZSwgLXNjYWxlXSwgWzAsIC1zY2FsZV0sIFswLCAwXVxuICAgICAgICAgICAgICAgICAgICAgICAgXV1cbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgcHJvcGVydGllczoge31cbiAgICAgICAgICAgICAgICB9XVxuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuXG4gICAgICAgIHRpbGUuZGVmYXVsdF93aW5kaW5nID0gJ0NXJztcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh0aWxlKTtcbiAgICB9XG5cbiAgICAvLyBSZXR1cm4gdGV4dHVyZSBpbmZvIGZvciBhIHJhc3RlciB0aWxlXG4gICAgdGlsZVRleHR1cmUgKHRpbGUpIHtcbiAgICAgICAgbGV0IGtleSA9IHRpbGUuY29vcmRzLmtleTtcbiAgICAgICAgaWYgKCF0aGlzLnRleHR1cmVzW2tleV0pIHtcbiAgICAgICAgICAgIGxldCBjb29yZHMgPSBUaWxlLmNvb3JkaW5hdGVXaXRoTWF4Wm9vbSh0aWxlLmNvb3JkcywgdGhpcy5tYXhfem9vbSk7XG4gICAgICAgICAgICBsZXQgdXJsID0gdGhpcy5mb3JtYXRVcmwodGhpcy51cmwsIHsgY29vcmRzIH0pO1xuICAgICAgICAgICAgdGhpcy50ZXh0dXJlc1trZXldID0geyB1cmwsIGZpbHRlcmluZzogdGhpcy5maWx0ZXJpbmcsIGNvb3JkcyB9O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLnRleHR1cmVzW2tleV07XG4gICAgfVxuXG59XG5cbkRhdGFTb3VyY2UucmVnaXN0ZXIoUmFzdGVyVGlsZVNvdXJjZSwgJ1Jhc3RlcicpO1xuIiwiaW1wb3J0IERhdGFTb3VyY2UgZnJvbSAnLi9kYXRhX3NvdXJjZSc7XG5pbXBvcnQge0dlb0pTT05Tb3VyY2UsIEdlb0pTT05UaWxlU291cmNlfSBmcm9tICcuL2dlb2pzb24nO1xuXG5pbXBvcnQgKiBhcyB0b3BvanNvbiBmcm9tICd0b3BvanNvbi1jbGllbnQnO1xuXG4vKipcbiBUb3BvSlNPTiBzdGFuZGFsb25lIChub24tdGlsZWQpIHNvdXJjZVxuIFVzZXMgZ2VvanNvbi12dCBzcGxpdCBpbnRvIHRpbGVzIGNsaWVudC1zaWRlXG4qL1xuXG5leHBvcnQgY2xhc3MgVG9wb0pTT05Tb3VyY2UgZXh0ZW5kcyBHZW9KU09OU291cmNlIHtcblxuICAgIHBhcnNlU291cmNlRGF0YSAodGlsZSwgc291cmNlLCByZXNwb25zZSkge1xuICAgICAgICBsZXQgZGF0YSA9IEpTT04ucGFyc2UocmVzcG9uc2UpO1xuICAgICAgICBkYXRhID0gdGhpcy50b0dlb0pTT04oZGF0YSk7XG5cbiAgICAgICAgbGV0IGxheWVycyA9IHRoaXMuZ2V0TGF5ZXJzKGRhdGEpO1xuICAgICAgICBzdXBlci5wcmVwcm9jZXNzTGF5ZXJzKGxheWVycyk7XG4gICAgICAgIHNvdXJjZS5sYXllcnMgPSBsYXllcnM7XG4gICAgfVxuXG4gICAgdG9HZW9KU09OIChkYXRhKSB7XG4gICAgICAgIC8vIFNpbmdsZSBsYXllclxuICAgICAgICBpZiAoZGF0YS5vYmplY3RzICYmXG4gICAgICAgICAgICBPYmplY3Qua2V5cyhkYXRhLm9iamVjdHMpLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgICAgbGV0IGxheWVyID0gT2JqZWN0LmtleXMoZGF0YS5vYmplY3RzKVswXTtcbiAgICAgICAgICAgIGRhdGEgPSBnZXRUb3BvSlNPTkZlYXR1cmUoZGF0YSwgZGF0YS5vYmplY3RzW2xheWVyXSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gTXVsdGlwbGUgbGF5ZXJzXG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgbGV0IGxheWVycyA9IHt9O1xuICAgICAgICAgICAgZm9yIChsZXQga2V5IGluIGRhdGEub2JqZWN0cykge1xuICAgICAgICAgICAgICAgIGxheWVyc1trZXldID0gZ2V0VG9wb0pTT05GZWF0dXJlKGRhdGEsIGRhdGEub2JqZWN0c1trZXldKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGRhdGEgPSBsYXllcnM7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGRhdGE7XG4gICAgfVxuXG59XG5cbmZ1bmN0aW9uIGdldFRvcG9KU09ORmVhdHVyZSAodG9wb2xvZ3ksIG9iamVjdCkge1xuICAgIGxldCBmZWF0dXJlID0gdG9wb2pzb24uZmVhdHVyZSh0b3BvbG9neSwgb2JqZWN0KTtcblxuICAgIC8vIENvbnZlcnQgc2luZ2xlIGZlYXR1cmUgdG8gYSBmZWF0dXJlIGNvbGxlY3Rpb25cbiAgICBpZiAoZmVhdHVyZS50eXBlID09PSAnRmVhdHVyZScpIHtcbiAgICAgICAgZmVhdHVyZSA9IHtcbiAgICAgICAgICAgIHR5cGU6ICdGZWF0dXJlQ29sbGVjdGlvbicsXG4gICAgICAgICAgICBmZWF0dXJlczogW2ZlYXR1cmVdXG4gICAgICAgIH07XG4gICAgfVxuICAgIHJldHVybiBmZWF0dXJlO1xufVxuXG5cbi8qKlxuIFRvcG9KU09OIHZlY3RvciB0aWxlc1xuIEBjbGFzcyBUb3BvSlNPTlRpbGVTb3VyY2VcbiovXG5leHBvcnQgY2xhc3MgVG9wb0pTT05UaWxlU291cmNlIGV4dGVuZHMgR2VvSlNPTlRpbGVTb3VyY2Uge1xuXG4gICAgY29uc3RydWN0b3Ioc291cmNlLCBzb3VyY2VzKSB7XG4gICAgICAgIHN1cGVyKHNvdXJjZSwgc291cmNlcyk7XG5cbiAgICAgICAgLy8gUmVwbGFjZSB3aXRoIG5vbi10aWxlZCBzb3VyY2UgaWYgdGlsZWQgc291cmNlIGZhaWxlZCB0byBpbnN0YW50aWF0ZVxuICAgICAgICBpZiAoIXRoaXMudXJsSGFzVGlsZVBhdHRlcm4odGhpcy51cmwpKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFRvcG9KU09OU291cmNlKHNvdXJjZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwYXJzZVNvdXJjZURhdGEgKHRpbGUsIHNvdXJjZSwgcmVzcG9uc2UpIHtcbiAgICAgICAgbGV0IGRhdGEgPSBKU09OLnBhcnNlKHJlc3BvbnNlKTtcbiAgICAgICAgZGF0YSA9IFRvcG9KU09OU291cmNlLnByb3RvdHlwZS50b0dlb0pTT04oZGF0YSk7XG4gICAgICAgIHRoaXMucHJlcGFyZUdlb0pTT04oZGF0YSwgdGlsZSwgc291cmNlKTtcbiAgICB9XG5cbn1cblxuRGF0YVNvdXJjZS5yZWdpc3RlcihUb3BvSlNPTlRpbGVTb3VyY2UsICdUb3BvSlNPTicpOyAgICAgICAgLy8gcHJlZmVyZWQgc2hvcnRlciBuYW1lXG4iLCJpbXBvcnQge1N0eWxlUGFyc2VyfSBmcm9tICcuL3N0eWxlX3BhcnNlcic7XG5pbXBvcnQgVXRpbHMgZnJvbSAnLi4vdXRpbHMvdXRpbHMnO1xuaW1wb3J0IGxvZyBmcm9tICcuLi91dGlscy9sb2cnO1xuaW1wb3J0IG1lcmdlT2JqZWN0cyBmcm9tICcuLi91dGlscy9tZXJnZSc7XG5pbXBvcnQge21hdGNofSBmcm9tICdtYXRjaC1mZWF0dXJlJztcblxuZXhwb3J0IGNvbnN0IHdoaXRlTGlzdCA9IFsnZmlsdGVyJywgJ2RyYXcnLCAndmlzaWJsZScsICdkYXRhJ107XG5cbmV4cG9ydCBjb25zdCBsYXllcl9jYWNoZSA9IHt9O1xuXG5mdW5jdGlvbiBjYWNoZUtleSAobGF5ZXJzKSB7XG4gICAgaWYgKGxheWVycy5sZW5ndGggPiAxKSB7XG4gICAgICAgIHZhciBrID0gbGF5ZXJzWzBdO1xuICAgICAgICBmb3IgKHZhciBpPTE7IGkgPCBsYXllcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGsgKz0gJy8nICsgbGF5ZXJzW2ldO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGs7XG4gICAgfVxuICAgIHJldHVybiBsYXllcnNbMF07XG59XG5cbi8vIE1lcmdlIG1hdGNoaW5nIGxheWVyIHRyZWVzIGludG8gYSBmaW5hbCBkcmF3IGdyb3VwXG5leHBvcnQgZnVuY3Rpb24gbWVyZ2VUcmVlcyhtYXRjaGluZ1RyZWVzLCBncm91cCkge1xuICAgIGxldCBkcmF3cywgdHJlZURlcHRoID0gMDtcblxuICAgIGxldCBkcmF3ID0ge1xuICAgICAgICB2aXNpYmxlOiB0cnVlIC8vIHZpc2libGUgYnkgZGVmYXVsdFxuICAgIH07XG5cbiAgICAvLyBGaW5kIGRlZXBlc3QgdHJlZVxuICAgIGZvciAobGV0IHQ9MDsgdCA8IG1hdGNoaW5nVHJlZXMubGVuZ3RoOyB0KyspIHtcbiAgICAgICAgaWYgKG1hdGNoaW5nVHJlZXNbdF0ubGVuZ3RoID4gdHJlZURlcHRoKSB7XG4gICAgICAgICAgICB0cmVlRGVwdGggPSBtYXRjaGluZ1RyZWVzW3RdLmxlbmd0aDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIE5vIGxheWVycyB0byBwYXJzZVxuICAgIGlmICh0cmVlRGVwdGggPT09IDApIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgLy8gSXRlcmF0ZSB0cmVlcyBpbiBwYXJhbGxlbFxuICAgIGZvciAobGV0IHg9MDsgeCA8IHRyZWVEZXB0aDsgeCsrKSB7XG4gICAgICAgIC8vIFB1bGwgb3V0IHRoZSByZXF1ZXN0ZWQgZHJhdyBncm91cCwgZm9yIGVhY2ggdHJlZSwgYXQgdGhpcyBkZXB0aFxuICAgICAgICBkcmF3cyA9IG1hdGNoaW5nVHJlZXMubWFwKHRyZWUgPT4gdHJlZVt4XSAmJiB0cmVlW3hdW2dyb3VwXSk7XG4gICAgICAgIGlmIChkcmF3cy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gU29ydCBieSBsYXllciBuYW1lIGJlZm9yZSBtZXJnaW5nLCBzbyBsYXllcnMgYXJlIGFwcGxpZWQgZGV0ZXJtaW5pc3RpY2FsbHlcbiAgICAgICAgLy8gd2hlbiBtdWx0aXBsZSBsYXllcnMgbW9kaWZ5IHRoZSBzYW1lIHByb3BlcnRpZXNcbiAgICAgICAgZHJhd3Muc29ydCgoYSwgYikgPT4gKGEgJiYgYS5sYXllcl9uYW1lKSA+IChiICYmIGIubGF5ZXJfbmFtZSkgPyAxIDogLTEpO1xuXG4gICAgICAgIC8vIE1lcmdlIGRyYXcgb2JqZWN0c1xuICAgICAgICBtZXJnZU9iamVjdHMoZHJhdywgLi4uZHJhd3MpO1xuXG4gICAgICAgIC8vIFJlbW92ZSBsYXllciBuYW1lcywgdGhleSB3ZXJlIG9ubHkgdXNlZCB0cmFuc2llbnRseSB0byBzb3J0IGFuZCBjYWxjdWxhdGUgZmluYWwgbGF5ZXJcbiAgICAgICAgLy8gKGZpbmFsIG1lcmdlZCBuYW1lcyB3aWxsIG5vdCBiZSBhY2N1cmF0ZSBzaW5jZSBvbmx5IG9uZSB0cmVlIGNhbiB3aW4pXG4gICAgICAgIGRlbGV0ZSBkcmF3LmxheWVyX25hbWU7XG4gICAgfVxuXG4gICAgLy8gU2hvcnQtY2lyY3VpdCBpZiBub3QgdmlzaWJsZVxuICAgIGlmIChkcmF3LnZpc2libGUgPT09IGZhbHNlKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHJldHVybiBkcmF3O1xufVxuXG5jb25zdCBibGFja2xpc3QgPSBbJ2FueScsICdhbGwnLCAnbm90JywgJ25vbmUnXTtcblxuY2xhc3MgTGF5ZXIge1xuXG4gICAgY29uc3RydWN0b3IoeyBsYXllciwgbmFtZSwgcGFyZW50LCBkcmF3LCB2aXNpYmxlLCBmaWx0ZXIgfSkge1xuICAgICAgICB0aGlzLmlkID0gTGF5ZXIuaWQrKztcbiAgICAgICAgdGhpcy5jb25maWcgPSBsYXllcjtcbiAgICAgICAgdGhpcy5wYXJlbnQgPSBwYXJlbnQ7XG4gICAgICAgIHRoaXMubmFtZSA9IG5hbWU7XG4gICAgICAgIHRoaXMuZnVsbF9uYW1lID0gdGhpcy5wYXJlbnQgPyAodGhpcy5wYXJlbnQuZnVsbF9uYW1lICsgJzonICsgdGhpcy5uYW1lKSA6IHRoaXMubmFtZTtcbiAgICAgICAgdGhpcy5kcmF3ID0gZHJhdztcbiAgICAgICAgdGhpcy5maWx0ZXIgPSBmaWx0ZXI7XG4gICAgICAgIHRoaXMuaXNfYnVpbHQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy52aXNpYmxlID0gdmlzaWJsZSAhPT0gdW5kZWZpbmVkID8gdmlzaWJsZSA6ICh0aGlzLnBhcmVudCAmJiB0aGlzLnBhcmVudC52aXNpYmxlKTtcblxuICAgICAgICAvLyBEZW5vcm1hbGl6ZSBsYXllciBuYW1lIHRvIGRyYXcgZ3JvdXBzXG4gICAgICAgIGlmICh0aGlzLmRyYXcpIHtcbiAgICAgICAgICAgIGZvciAobGV0IGdyb3VwIGluIHRoaXMuZHJhdykge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmRyYXdbZ3JvdXBdID09IG51bGwgfHwgdHlwZW9mIHRoaXMuZHJhd1tncm91cF0gIT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIEludmFsaWQgZHJhdyBncm91cFxuICAgICAgICAgICAgICAgICAgICBsZXQgbXNnID0gYERyYXcgZ3JvdXAgJyR7Z3JvdXB9JyBmb3IgbGF5ZXIgJHt0aGlzLmZ1bGxfbmFtZX0gaXMgaW52YWxpZCwgbXVzdCBiZSBhbiBvYmplY3QsIGA7XG4gICAgICAgICAgICAgICAgICAgIG1zZyArPSBgYnV0IHdhcyBzZXQgdG8gXFxgJHtncm91cH06ICR7dGhpcy5kcmF3W2dyb3VwXX1cXGAgaW5zdGVhZGA7XG4gICAgICAgICAgICAgICAgICAgIGxvZygnd2FybicsIG1zZyk7IC8vIFRPRE86IGZpcmUgZXh0ZXJuYWwgZXZlbnQgdGhhdCBjbGllbnRzIHRvIHN1YnNjcmliZSB0b1xuXG4gICAgICAgICAgICAgICAgICAgIGRlbGV0ZSB0aGlzLmRyYXdbZ3JvdXBdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kcmF3W2dyb3VwXS5sYXllcl9uYW1lID0gdGhpcy5mdWxsX25hbWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgYnVpbGQgKCkge1xuICAgICAgICBsb2coJ3RyYWNlJywgYEJ1aWxkaW5nIGxheWVyICcke3RoaXMuZnVsbF9uYW1lfSdgKTtcbiAgICAgICAgdGhpcy5idWlsZEZpbHRlcigpO1xuICAgICAgICB0aGlzLmJ1aWxkRHJhdygpO1xuICAgICAgICB0aGlzLmlzX2J1aWx0ID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBidWlsZERyYXcoKSB7XG4gICAgICAgIHRoaXMuZHJhdyA9IFV0aWxzLnN0cmluZ3NUb0Z1bmN0aW9ucyh0aGlzLmRyYXcsIFN0eWxlUGFyc2VyLndyYXBGdW5jdGlvbik7XG4gICAgICAgIHRoaXMuY2FsY3VsYXRlZERyYXcgPSBjYWxjdWxhdGVEcmF3KHRoaXMpO1xuICAgIH1cblxuICAgIGJ1aWxkRmlsdGVyKCkge1xuICAgICAgICB0aGlzLmZpbHRlcl9vcmlnaW5hbCA9IHRoaXMuZmlsdGVyO1xuICAgICAgICB0aGlzLmZpbHRlciA9IFV0aWxzLnN0cmluZ3NUb0Z1bmN0aW9ucyh0aGlzLmZpbHRlciwgU3R5bGVQYXJzZXIud3JhcEZ1bmN0aW9uKTtcblxuICAgICAgICBsZXQgdHlwZSA9IHR5cGVvZiB0aGlzLmZpbHRlcjtcbiAgICAgICAgaWYgKHRoaXMuZmlsdGVyICE9IG51bGwgJiYgdHlwZSAhPT0gJ29iamVjdCcgJiYgdHlwZSAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgLy8gSW52YWxpZCBmaWx0ZXJcbiAgICAgICAgICAgIGxldCBtc2cgPSBgRmlsdGVyIGZvciBsYXllciAke3RoaXMuZnVsbF9uYW1lfSBpcyBpbnZhbGlkLCBmaWx0ZXIgdmFsdWUgbXVzdCBiZSBhbiBvYmplY3Qgb3IgZnVuY3Rpb24sIGA7XG4gICAgICAgICAgICBtc2cgKz0gYGJ1dCB3YXMgc2V0IHRvIFxcYGZpbHRlcjogJHt0aGlzLmZpbHRlcn1cXGAgaW5zdGVhZGA7XG4gICAgICAgICAgICBsb2coJ3dhcm4nLCBtc2cpOyAvLyBUT0RPOiBmaXJlIGV4dGVybmFsIGV2ZW50IHRoYXQgY2xpZW50cyB0byBzdWJzY3JpYmUgdG9cbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICB0aGlzLmJ1aWxkWm9vbXMoKTtcbiAgICAgICAgICAgIHRoaXMuYnVpbGRQcm9wTWF0Y2hlcygpO1xuICAgICAgICAgICAgaWYgKHRoaXMuZmlsdGVyICE9IG51bGwgJiYgKHR5cGVvZiB0aGlzLmZpbHRlciA9PT0gJ2Z1bmN0aW9uJyB8fCBPYmplY3Qua2V5cyh0aGlzLmZpbHRlcikubGVuZ3RoID4gMCkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmZpbHRlciA9IG1hdGNoKHRoaXMuZmlsdGVyLCBGaWx0ZXJPcHRpb25zKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuZmlsdGVyID0gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjYXRjaChlKSB7XG4gICAgICAgICAgICAvLyBJbnZhbGlkIGZpbHRlclxuICAgICAgICAgICAgbGV0IG1zZyA9IGBGaWx0ZXIgZm9yIGxheWVyICR7dGhpcy5mdWxsX25hbWV9IGlzIGludmFsaWQsIFxcYGZpbHRlcjogJHtKU09OLnN0cmluZ2lmeSh0aGlzLmZpbHRlcil9XFxgIGA7XG4gICAgICAgICAgICBtc2cgKz0gYGZhaWxlZCB3aXRoIGVycm9yICcke2UubWVzc2FnZX0nLCBzdGFjayB0cmFjZTogJHtlLnN0YWNrfWA7XG4gICAgICAgICAgICBsb2coJ3dhcm4nLCBtc2cpOyAvLyBUT0RPOiBmaXJlIGV4dGVybmFsIGV2ZW50IHRoYXQgY2xpZW50cyB0byBzdWJzY3JpYmUgdG9cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIFpvb21zIG9mdGVuIGN1bGwgbGFyZ2Ugc3dhdGhzIG9mIHRoZSBsYXllciB0cmVlLCBzbyB0aGV5IGdldCBzcGVjaWFsIHRyZWF0bWVudCBhbmQgYXJlIGNoZWNrZWQgZmlyc3RcbiAgICBidWlsZFpvb21zKCkge1xuICAgICAgICBsZXQgem9vbSA9IHRoaXMuZmlsdGVyICYmIHRoaXMuZmlsdGVyLiR6b29tO1xuICAgICAgICBsZXQgenR5cGUgPSB0eXBlb2Ygem9vbTtcbiAgICAgICAgaWYgKHpvb20gIT0gbnVsbCAmJiB6dHlwZSAhPT0gJ2Z1bmN0aW9uJykgeyAvLyBkb24ndCBhY2NlbGVyYXRlIGZ1bmN0aW9uLWJhc2VkIGZpbHRlcnNcbiAgICAgICAgICAgIHRoaXMuem9vbXMgPSB7fTtcblxuICAgICAgICAgICAgaWYgKHp0eXBlID09PSAnbnVtYmVyJykge1xuICAgICAgICAgICAgICAgIHRoaXMuem9vbXNbem9vbV0gPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoQXJyYXkuaXNBcnJheSh6b29tKSkge1xuICAgICAgICAgICAgICAgIGZvciAobGV0IHo9MDsgeiA8IHpvb20ubGVuZ3RoOyB6KyspIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy56b29tc1t6b29tW3pdXSA9IHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoenR5cGUgPT09ICdvYmplY3QnICYmICh6b29tLm1pbiAhPSBudWxsIHx8IHpvb20ubWF4ICE9IG51bGwpKSB7XG4gICAgICAgICAgICAgICAgbGV0IHptaW4gPSB6b29tLm1pbiB8fCAwO1xuICAgICAgICAgICAgICAgIGxldCB6bWF4ID0gem9vbS5tYXggfHwgMjU7IC8vIFRPRE86IHJlcGxhY2UgY29uc3RhbnQgZm9yIG1heCBwb3NzaWJsZSB6b29tXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgej16bWluOyB6IDwgem1heDsgeisrKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuem9vbXNbel0gPSB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZGVsZXRlIHRoaXMuZmlsdGVyLiR6b29tOyAvLyBkb24ndCBwcm9jZXNzIHpvb20gdGhyb3VnaCB1c3VhbCBnZW5lcmljIGZpbHRlciBsb2dpY1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgYnVpbGRQcm9wTWF0Y2hlcygpIHtcbiAgICAgICAgaWYgKCF0aGlzLmZpbHRlciB8fCBBcnJheS5pc0FycmF5KHRoaXMuZmlsdGVyKSB8fCB0eXBlb2YgdGhpcy5maWx0ZXIgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIE9iamVjdC5rZXlzKHRoaXMuZmlsdGVyKS5mb3JFYWNoKGtleSA9PiB7XG4gICAgICAgICAgICBpZiAoYmxhY2tsaXN0LmluZGV4T2Yoa2V5KSA9PT0gLTEpIHtcbiAgICAgICAgICAgICAgICBsZXQgdmFsID0gdGhpcy5maWx0ZXJba2V5XTtcbiAgICAgICAgICAgICAgICBsZXQgdHlwZSA9IHR5cGVvZiB2YWw7XG4gICAgICAgICAgICAgICAgbGV0IGFycmF5ID0gQXJyYXkuaXNBcnJheSh2YWwpO1xuXG4gICAgICAgICAgICAgICAgaWYgKCEoYXJyYXkgfHwgdHlwZSA9PT0gJ3N0cmluZycgfHwgdHlwZSA9PT0gJ251bWJlcicpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAoa2V5WzBdID09PSAnJCcpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gQ29udGV4dCBwcm9wZXJ0eVxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbnRleHRfcHJvcF9tYXRjaGVzID0gdGhpcy5jb250ZXh0X3Byb3BfbWF0Y2hlcyB8fCBbXTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jb250ZXh0X3Byb3BfbWF0Y2hlcy5wdXNoKFtrZXkuc3Vic3RyaW5nKDEpLCBhcnJheSA/IHZhbCA6IFt2YWxdXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAvLyBGZWF0dXJlIHByb3BlcnR5XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZmVhdHVyZV9wcm9wX21hdGNoZXMgPSB0aGlzLmZlYXR1cmVfcHJvcF9tYXRjaGVzIHx8IFtdO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmZlYXR1cmVfcHJvcF9tYXRjaGVzLnB1c2goW2tleSwgYXJyYXkgPyB2YWwgOiBbdmFsXV0pO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGRlbGV0ZSB0aGlzLmZpbHRlcltrZXldO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBkb1Byb3BNYXRjaGVzIChjb250ZXh0KSB7XG4gICAgICAgIGlmICh0aGlzLmZlYXR1cmVfcHJvcF9tYXRjaGVzKSB7XG4gICAgICAgICAgICBmb3IgKGxldCByPTA7IHIgPCB0aGlzLmZlYXR1cmVfcHJvcF9tYXRjaGVzLmxlbmd0aDsgcisrKSB7XG4gICAgICAgICAgICAgICAgbGV0IG1hdGNoID0gdGhpcy5mZWF0dXJlX3Byb3BfbWF0Y2hlc1tyXTtcbiAgICAgICAgICAgICAgICBsZXQgdmFsID0gY29udGV4dC5mZWF0dXJlLnByb3BlcnRpZXNbbWF0Y2hbMF1dO1xuICAgICAgICAgICAgICAgIGlmICh2YWwgPT0gbnVsbCB8fCBtYXRjaFsxXS5pbmRleE9mKHZhbCkgPT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5jb250ZXh0X3Byb3BfbWF0Y2hlcykge1xuICAgICAgICAgICAgZm9yIChsZXQgcj0wOyByIDwgdGhpcy5jb250ZXh0X3Byb3BfbWF0Y2hlcy5sZW5ndGg7IHIrKykge1xuICAgICAgICAgICAgICAgIGxldCBtYXRjaCA9IHRoaXMuY29udGV4dF9wcm9wX21hdGNoZXNbcl07XG4gICAgICAgICAgICAgICAgbGV0IHZhbCA9IGNvbnRleHRbbWF0Y2hbMF1dO1xuICAgICAgICAgICAgICAgIGlmICh2YWwgPT0gbnVsbCB8fCBtYXRjaFsxXS5pbmRleE9mKHZhbCkgPT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBkb2VzTWF0Y2ggKGNvbnRleHQpIHtcbiAgICAgICAgaWYgKCF0aGlzLmlzX2J1aWx0KSB7XG4gICAgICAgICAgICB0aGlzLmJ1aWxkKCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyB6b29tIHByZS1maWx0ZXI6IHNraXAgcmVzdCBvZiBmaWx0ZXIgaWYgb3V0IG9mIGxheWVyIHpvb20gcmFuZ2VcbiAgICAgICAgaWYgKHRoaXMuem9vbXMgIT0gbnVsbCAmJiAhdGhpcy56b29tc1tjb250ZXh0Lnpvb21dKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBkaXJlY3QgZmVhdHVyZSBwcm9wZXJ0eSBtYXRjaGVzXG4gICAgICAgIGlmICghdGhpcy5kb1Byb3BNYXRjaGVzKGNvbnRleHQpKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBhbnkgcmVtYWluaW5nIGZpbHRlciAobW9yZSBjb21wbGV4IG1hdGNoZXMgb3IgZHluYW1pYyBmdW5jdGlvbilcbiAgICAgICAgaWYgKHRoaXMuZmlsdGVyIGluc3RhbmNlb2YgRnVuY3Rpb24pe1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5maWx0ZXIoY29udGV4dCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICAvLyBGaWx0ZXIgZnVuY3Rpb24gZXJyb3JcbiAgICAgICAgICAgICAgICBsZXQgbXNnID0gYEZpbHRlciBmb3IgdGhpcyAke3RoaXMuZnVsbF9uYW1lfTogXFxgZmlsdGVyOiAke3RoaXMuZmlsdGVyX29yaWdpbmFsfVxcYCBgO1xuICAgICAgICAgICAgICAgIG1zZyArPSBgZmFpbGVkIHdpdGggZXJyb3IgJyR7ZXJyb3IubWVzc2FnZX0nLCBzdGFjayB0cmFjZTogJHtlcnJvci5zdGFja31gO1xuICAgICAgICAgICAgICAgIGxvZygnZXJyb3InLCBtc2csIGNvbnRleHQuZmVhdHVyZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5maWx0ZXIgPT0gbnVsbDtcbiAgICAgICAgfVxuICAgIH1cblxufVxuXG5MYXllci5pZCA9IDA7XG5cblxuZXhwb3J0IGNsYXNzIExheWVyTGVhZiBleHRlbmRzIExheWVyIHtcbiAgICBjb25zdHJ1Y3RvciAoY29uZmlnKSB7XG4gICAgICAgIHN1cGVyKGNvbmZpZyk7XG4gICAgICAgIHRoaXMuaXNfbGVhZiA9IHRydWU7XG4gICAgfVxuXG59XG5cbmV4cG9ydCBjbGFzcyBMYXllclRyZWUgZXh0ZW5kcyBMYXllciB7XG4gICAgY29uc3RydWN0b3IgKGNvbmZpZykge1xuICAgICAgICBzdXBlcihjb25maWcpO1xuICAgICAgICB0aGlzLmlzX3RyZWUgPSB0cnVlO1xuICAgICAgICB0aGlzLmxheWVycyA9IGNvbmZpZy5sYXllcnMgfHwgW107XG4gICAgfVxuXG4gICAgYWRkTGF5ZXIgKGxheWVyKSB7XG4gICAgICAgIHRoaXMubGF5ZXJzLnB1c2gobGF5ZXIpO1xuICAgIH1cblxuICAgIGJ1aWxkRHJhd0dyb3VwcyAoY29udGV4dCkge1xuICAgICAgICBsZXQgbGF5ZXJzID0gW10sIGxheWVyX2lkcyA9IFtdO1xuICAgICAgICBtYXRjaEZlYXR1cmUoY29udGV4dCwgW3RoaXNdLCBsYXllcnMsIGxheWVyX2lkcyk7XG5cbiAgICAgICAgaWYgKGxheWVycy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBsZXQgY2FjaGVfa2V5ID0gY2FjaGVLZXkobGF5ZXJfaWRzKTtcblxuICAgICAgICAgICAgLy8gT25seSBldmFsdWF0ZSBlYWNoIGxheWVyIGNvbWJpbmF0aW9uIG9uY2UgKHVuZGVmaW5lZCBtZWFucyBub3QgeWV0IGV2YWx1YXRlZCxcbiAgICAgICAgICAgIC8vIG51bGwgbWVhbnMgZXZhbHVhdGVkIHdpdGggbm8gZHJhdyBvYmplY3QpXG4gICAgICAgICAgICBpZiAobGF5ZXJfY2FjaGVbY2FjaGVfa2V5XSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgLy8gRmluZCBhbGwgdGhlIHVuaXF1ZSB2aXNpYmxlIGRyYXcgYmxvY2tzIGZvciB0aGlzIGxheWVyIHRyZWVcbiAgICAgICAgICAgICAgICBsZXQgZHJhd19ncm91cHMgPSBsYXllcnMubWFwKHggPT4geCAmJiB4LnZpc2libGUgIT09IGZhbHNlICYmIHguY2FsY3VsYXRlZERyYXcpO1xuICAgICAgICAgICAgICAgIGxldCBkcmF3X2tleXMgPSB7fTtcblxuICAgICAgICAgICAgICAgIGZvciAobGV0IHI9MDsgciA8IGRyYXdfZ3JvdXBzLmxlbmd0aDsgcisrKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBsYXllciA9IGRyYXdfZ3JvdXBzW3JdO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWxheWVyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBnPTA7IGcgPCBsYXllci5sZW5ndGg7IGcrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGdyb3VwID0gbGF5ZXJbZ107XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBrZXkgaW4gZ3JvdXApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkcmF3X2tleXNba2V5XSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyBDYWxjdWxhdGUgZWFjaCBkcmF3IGdyb3VwXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgZHJhd19rZXkgaW4gZHJhd19rZXlzKSB7XG4gICAgICAgICAgICAgICAgICAgIGxheWVyX2NhY2hlW2NhY2hlX2tleV0gPSBsYXllcl9jYWNoZVtjYWNoZV9rZXldIHx8IHt9O1xuICAgICAgICAgICAgICAgICAgICBsYXllcl9jYWNoZVtjYWNoZV9rZXldW2RyYXdfa2V5XSA9IG1lcmdlVHJlZXMoZHJhd19ncm91cHMsIGRyYXdfa2V5KTtcblxuICAgICAgICAgICAgICAgICAgICAvLyBPbmx5IHNhdmUgdGhlIG9uZXMgdGhhdCB3ZXJlbid0IG51bGxcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFsYXllcl9jYWNoZVtjYWNoZV9rZXldW2RyYXdfa2V5XSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlIGxheWVyX2NhY2hlW2NhY2hlX2tleV1bZHJhd19rZXldO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGF5ZXJfY2FjaGVbY2FjaGVfa2V5XVtkcmF3X2tleV0ua2V5ID0gY2FjaGVfa2V5ICsgJy8nICsgZHJhd19rZXk7XG4gICAgICAgICAgICAgICAgICAgICAgICBsYXllcl9jYWNoZVtjYWNoZV9rZXldW2RyYXdfa2V5XS5sYXllcnMgPSBsYXllcnMubWFwKHggPT4geCAmJiB4LmZ1bGxfbmFtZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyBObyBsYXllcnMgZXZhbHVhdGVkXG4gICAgICAgICAgICAgICAgaWYgKGxheWVyX2NhY2hlW2NhY2hlX2tleV0gJiYgT2JqZWN0LmtleXMobGF5ZXJfY2FjaGVbY2FjaGVfa2V5XSkubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGxheWVyX2NhY2hlW2NhY2hlX2tleV0gPSBudWxsO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBsYXllcl9jYWNoZVtjYWNoZV9rZXldO1xuICAgICAgICB9XG4gICAgfVxuXG59XG5cbmNvbnN0IEZpbHRlck9wdGlvbnMgPSB7XG4gICAgLy8gSGFuZGxlIHVuaXQgY29udmVyc2lvbnMgb24gZmlsdGVyIHJhbmdlc1xuICAgIHJhbmdlVHJhbnNmb3JtKHZhbCkge1xuICAgICAgICBpZiAodHlwZW9mIHZhbCA9PT0gJ3N0cmluZycgJiYgdmFsLnRyaW0oKS5zbGljZSgtMykgPT09ICdweDInKSB7XG4gICAgICAgICAgICByZXR1cm4gYCR7cGFyc2VGbG9hdCh2YWwpfSAqIGNvbnRleHQubWV0ZXJzX3Blcl9waXhlbF9zcWA7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHZhbDtcbiAgICB9XG59O1xuXG5mdW5jdGlvbiBpc1doaXRlTGlzdGVkKGtleSkge1xuICAgIHJldHVybiB3aGl0ZUxpc3QuaW5kZXhPZihrZXkpID4gLTE7XG59XG5cbmZ1bmN0aW9uIGlzRW1wdHkob2JqKSB7XG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKG9iaikubGVuZ3RoID09PSAwO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ3JvdXBQcm9wcyhvYmopIHtcbiAgICBsZXQgd2hpdGVMaXN0ZWQgPSB7fSwgbm9uV2hpdGVMaXN0ZWQgPSB7fTtcblxuICAgIGZvciAobGV0IGtleSBpbiBvYmopIHtcbiAgICAgICAgaWYgKGlzV2hpdGVMaXN0ZWQoa2V5KSkge1xuICAgICAgICAgICAgd2hpdGVMaXN0ZWRba2V5XSA9IG9ialtrZXldO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbm9uV2hpdGVMaXN0ZWRba2V5XSA9IG9ialtrZXldO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBbd2hpdGVMaXN0ZWQsIG5vbldoaXRlTGlzdGVkXTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNhbGN1bGF0ZURyYXcobGF5ZXIpIHtcblxuICAgIGxldCBkcmF3ICA9IFtdO1xuXG4gICAgaWYgKGxheWVyLnBhcmVudCkge1xuICAgICAgICBsZXQgY3MgPSBsYXllci5wYXJlbnQuY2FsY3VsYXRlZERyYXcgfHwgW107XG4gICAgICAgIGRyYXcucHVzaCguLi5jcyk7XG4gICAgfVxuXG4gICAgZHJhdy5wdXNoKGxheWVyLmRyYXcpO1xuICAgIHJldHVybiBkcmF3O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VMYXllclRyZWUobmFtZSwgbGF5ZXIsIHBhcmVudCwgc3R5bGVzKSB7XG5cbiAgICBsZXQgcHJvcGVydGllcyA9IHsgbmFtZSwgbGF5ZXIsIHBhcmVudCB9O1xuICAgIGxldCBbd2hpdGVMaXN0ZWQsIG5vbldoaXRlTGlzdGVkXSA9IGdyb3VwUHJvcHMobGF5ZXIpO1xuICAgIGxldCBlbXB0eSA9IGlzRW1wdHkobm9uV2hpdGVMaXN0ZWQpO1xuICAgIGxldCBDcmVhdGU7XG5cbiAgICBpZiAoZW1wdHkgJiYgcGFyZW50ICE9IG51bGwpIHtcbiAgICAgICAgQ3JlYXRlID0gTGF5ZXJMZWFmO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIENyZWF0ZSA9IExheWVyVHJlZTtcbiAgICB9XG5cbiAgICBsZXQgciA9IG5ldyBDcmVhdGUoT2JqZWN0LmFzc2lnbihwcm9wZXJ0aWVzLCB3aGl0ZUxpc3RlZCkpO1xuXG4gICAgaWYgKHBhcmVudCkge1xuICAgICAgICBwYXJlbnQuYWRkTGF5ZXIocik7XG4gICAgfVxuXG4gICAgaWYgKCFlbXB0eSkge1xuICAgICAgICBmb3IgKGxldCBrZXkgaW4gbm9uV2hpdGVMaXN0ZWQpIHtcbiAgICAgICAgICAgIGxldCBwcm9wZXJ0eSA9IG5vbldoaXRlTGlzdGVkW2tleV07XG4gICAgICAgICAgICBpZiAodHlwZW9mIHByb3BlcnR5ID09PSAnb2JqZWN0JyAmJiAhQXJyYXkuaXNBcnJheShwcm9wZXJ0eSkpIHtcbiAgICAgICAgICAgICAgICBwYXJzZUxheWVyVHJlZShrZXksIHByb3BlcnR5LCByLCBzdHlsZXMpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBJbnZhbGlkIGxheWVyXG4gICAgICAgICAgICAgICAgbGV0IG1zZyA9IGBMYXllciB2YWx1ZSBtdXN0IGJlIGFuIG9iamVjdDogY2Fubm90IGNyZWF0ZSBsYXllciAnJHtrZXl9OiAke0pTT04uc3RyaW5naWZ5KHByb3BlcnR5KX0nYDtcbiAgICAgICAgICAgICAgICBtc2cgKz0gYCwgdW5kZXIgcGFyZW50IGxheWVyICcke3IuZnVsbF9uYW1lfScuYDtcblxuICAgICAgICAgICAgICAgIC8vIElmIHRoZSBwYXJlbnQgaXMgYSBzdHlsZSBuYW1lLCB0aGlzIG1heSBiZSBhbiBpbmNvcnJlY3RseSBuZXN0ZWQgbGF5ZXJcbiAgICAgICAgICAgICAgICBpZiAoc3R5bGVzW3IubmFtZV0pIHtcbiAgICAgICAgICAgICAgICAgICAgbXNnICs9IGAgVGhlIHBhcmVudCBuYW1lICcke3IubmFtZX0nIGlzIGFsc28gdGhlIG5hbWUgb2YgYSBzdHlsZSwgZGlkIHlvdSBtZWFuIHRvIGNyZWF0ZSBhICdkcmF3JyBncm91cGA7XG4gICAgICAgICAgICAgICAgICAgIGlmIChwYXJlbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1zZyArPSBgIHVuZGVyICcke3BhcmVudC5uYW1lfSdgO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIG1zZyArPSBgIGluc3RlYWQ/YDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbG9nKCd3YXJuJywgbXNnKTsgLy8gVE9ETzogZmlyZSBleHRlcm5hbCBldmVudCB0aGF0IGNsaWVudHMgdG8gc3Vic2NyaWJlIHRvXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgIH1cblxuICAgIHJldHVybiByO1xufVxuXG5cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZUxheWVycyAobGF5ZXJzLCBzdHlsZXMpIHtcbiAgICBsZXQgbGF5ZXJfdHJlZXMgPSB7fTtcblxuICAgIGZvciAobGV0IGtleSBpbiBsYXllcnMpIHtcbiAgICAgICAgbGV0IGxheWVyID0gbGF5ZXJzW2tleV07XG4gICAgICAgIGlmIChsYXllcikge1xuICAgICAgICAgICAgbGF5ZXJfdHJlZXNba2V5XSA9IHBhcnNlTGF5ZXJUcmVlKGtleSwgbGF5ZXIsIG51bGwsIHN0eWxlcyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gbGF5ZXJfdHJlZXM7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBtYXRjaEZlYXR1cmUoY29udGV4dCwgbGF5ZXJzLCBjb2xsZWN0ZWRfbGF5ZXJzLCBjb2xsZWN0ZWRfbGF5ZXJzX2lkcykge1xuICAgIGxldCBtYXRjaGVkID0gZmFsc2U7XG4gICAgbGV0IGNoaWxkTWF0Y2hlZCA9IGZhbHNlO1xuXG4gICAgaWYgKGxheWVycy5sZW5ndGggPT09IDApIHsgcmV0dXJuOyB9XG5cbiAgICBmb3IgKGxldCByPTA7IHIgPCBsYXllcnMubGVuZ3RoOyByKyspIHtcbiAgICAgICAgbGV0IGN1cnJlbnQgPSBsYXllcnNbcl07XG5cbiAgICAgICAgaWYgKGN1cnJlbnQuaXNfbGVhZikge1xuICAgICAgICAgICAgaWYgKGN1cnJlbnQuZG9lc01hdGNoKGNvbnRleHQpKSB7XG4gICAgICAgICAgICAgICAgbWF0Y2hlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgY29sbGVjdGVkX2xheWVycy5wdXNoKGN1cnJlbnQpO1xuICAgICAgICAgICAgICAgIGNvbGxlY3RlZF9sYXllcnNfaWRzLnB1c2goY3VycmVudC5pZCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgfSBlbHNlIGlmIChjdXJyZW50LmlzX3RyZWUpIHtcbiAgICAgICAgICAgIGlmIChjdXJyZW50LmRvZXNNYXRjaChjb250ZXh0KSkge1xuICAgICAgICAgICAgICAgIG1hdGNoZWQgPSB0cnVlO1xuXG4gICAgICAgICAgICAgICAgY2hpbGRNYXRjaGVkID0gbWF0Y2hGZWF0dXJlKFxuICAgICAgICAgICAgICAgICAgICBjb250ZXh0LFxuICAgICAgICAgICAgICAgICAgICBjdXJyZW50LmxheWVycyxcbiAgICAgICAgICAgICAgICAgICAgY29sbGVjdGVkX2xheWVycyxcbiAgICAgICAgICAgICAgICAgICAgY29sbGVjdGVkX2xheWVyc19pZHNcbiAgICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgICAgaWYgKCFjaGlsZE1hdGNoZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgY29sbGVjdGVkX2xheWVycy5wdXNoKGN1cnJlbnQpO1xuICAgICAgICAgICAgICAgICAgICBjb2xsZWN0ZWRfbGF5ZXJzX2lkcy5wdXNoKGN1cnJlbnQuaWQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBtYXRjaGVkO1xufVxuIiwiLy8gUmVuZGVycyBhbiBhcnJheSBzcGVjaWZ5aW5nIGEgbGluZSBwYXR0ZXJuIG9mIGFsdGVybmF0aW5nIGRhc2hlcyBhbmQgc3BhY2VzLFxuLy8gc2ltaWxhciB0byBhbiBTVkcgYGRhc2hhcnJheWAgb3IgQ2FudmFzIHNldExpbmVEYXNoKCksIGludG8gYSBieXRlIGFycmF5IG9mIFJHQkEgcGl4ZWxzXG4vLyBSZXR1cm5zOlxuLy8ge1xuLy8gICAgcGl4ZWw6IHJlbmRlcmVkIGltYWdlIGluIFVpbnQ4QXJyYXkgYnVmZmVyXG4vLyAgICBsZW5ndGg6IHBpeGVsIGxlbmd0aCBvZiByZW5kZXJlZCBkYXNoIHBhdHRlcm4gKHN1bSBvZiBhbGwgZGFzaGVzIGFuZCBzcGFjZXMpXG4vLyB9XG4vL1xuLy8gaHR0cHM6Ly93d3cudzMub3JnL1RSL1NWRy9wYWludGluZy5odG1sI1N0cm9rZURhc2hhcnJheVByb3BlcnR5XG4vLyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9TVkcvQXR0cmlidXRlL3N0cm9rZS1kYXNoYXJyYXlcbi8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9DYW52YXNSZW5kZXJpbmdDb250ZXh0MkQvc2V0TGluZURhc2hcblxuY29uc3QgZGVmYXVsdF9kYXNoX2NvbG9yID0gWzI1NSwgMjU1LCAyNTUsIDI1NV07XG5jb25zdCBkZWZhdWx0X2JhY2tncm91bmRfY29sb3IgPSBbMCwgMCwgMCwgMF07XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHJlbmRlckRhc2hBcnJheSAocGF0dGVybiwgb3B0aW9ucyA9IHt9KSB7XG4gICAgY29uc3QgZGFzaF9waXhlbCA9IG9wdGlvbnMuZGFzaF9jb2xvciB8fCBkZWZhdWx0X2Rhc2hfY29sb3I7XG4gICAgY29uc3QgYmFja2dyb3VuZF9jb2xvciA9IG9wdGlvbnMuYmFja2dyb3VuZF9jb2xvciB8fCBkZWZhdWx0X2JhY2tncm91bmRfY29sb3I7XG4gICAgY29uc3QgZGFzaGVzID0gcGF0dGVybjtcbiAgICBjb25zdCBzY2FsZSA9IG9wdGlvbnMuc2NhbGUgfHwgMTtcblxuICAgIC8vIElmIHBhdHRlcm4gaXMgb2RkLCByZXBlYXQgaXQgdG8gbWFrZSBpdCBldmVuIChzZWUgU1ZHIHNwZWMpXG4gICAgaWYgKGRhc2hlcy5sZW5ndGggJSAyID09PSAxKSB7XG4gICAgICAgIEFycmF5LnByb3RvdHlwZS5wdXNoLmFwcGx5KGRhc2hlcywgZGFzaGVzKTtcbiAgICB9XG5cbiAgICBsZXQgZGFzaCA9IHRydWU7XG4gICAgbGV0IHBpeGVscyA9IFtdO1xuICAgIGZvciAobGV0IGk9MDsgaSA8IGRhc2hlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICBsZXQgc2VnbWVudCA9IE1hdGguZmxvb3IoZGFzaGVzW2ldICogc2NhbGUpO1xuICAgICAgICBmb3IgKGxldCBzPTA7IHMgPCBzZWdtZW50OyBzKyspIHtcbiAgICAgICAgICAgIEFycmF5LnByb3RvdHlwZS5wdXNoLmFwcGx5KHBpeGVscywgZGFzaCA/IGRhc2hfcGl4ZWwgOiBiYWNrZ3JvdW5kX2NvbG9yKTtcbiAgICAgICAgfVxuICAgICAgICBkYXNoID0gIWRhc2g7IC8vIGFsdGVybmF0ZSBiZXR3ZWVuIGRhc2hlcyBhbmQgc3BhY2VzXG4gICAgfVxuXG4gICAgcGl4ZWxzID0gbmV3IFVpbnQ4QXJyYXkocGl4ZWxzKTsgLy8gY29udmVydCB0byB0eXBlZCBhcnJheVxuICAgIGNvbnN0IGxlbmd0aCA9IHBpeGVscy5sZW5ndGggLyA0OyAvLyBvbmUgUkdCQSBieXRlIHNlcXVlbmNlcyB0byBvbmUgcGl4ZWxcblxuICAgIHJldHVybiB7IHBpeGVscywgbGVuZ3RoIH07XG59XG4iLCIvLyBMaW5lIHJlbmRlcmluZyBzdHlsZVxuXG5pbXBvcnQge1N0eWxlfSBmcm9tICcuLi9zdHlsZSc7XG5pbXBvcnQge1N0eWxlUGFyc2VyfSBmcm9tICcuLi9zdHlsZV9wYXJzZXInO1xuaW1wb3J0IGdsIGZyb20gJy4uLy4uL2dsL2NvbnN0YW50cyc7IC8vIHdlYiB3b3JrZXJzIGRvbid0IGhhdmUgYWNjZXNzIHRvIEdMIGNvbnRleHQsIHNvIGltcG9ydCBhbGwgR0wgY29uc3RhbnRzXG5pbXBvcnQgVGV4dHVyZSBmcm9tICcuLi8uLi9nbC90ZXh0dXJlJztcbmltcG9ydCBWZXJ0ZXhMYXlvdXQgZnJvbSAnLi4vLi4vZ2wvdmVydGV4X2xheW91dCc7XG5pbXBvcnQge2J1aWxkUG9seWxpbmVzfSBmcm9tICcuLi8uLi9idWlsZGVycy9wb2x5bGluZXMnO1xuaW1wb3J0IHJlbmRlckRhc2hBcnJheSBmcm9tICcuL2Rhc2hhcnJheSc7XG5pbXBvcnQgR2VvIGZyb20gJy4uLy4uL2dlbyc7XG5pbXBvcnQge3NoYWRlclNyY19wb2x5Z29uc1ZlcnRleCwgc2hhZGVyU3JjX3BvbHlnb25zRnJhZ21lbnR9IGZyb20gJy4uL3BvbHlnb25zL3BvbHlnb25zJztcblxuZXhwb3J0IHZhciBMaW5lcyA9IE9iamVjdC5jcmVhdGUoU3R5bGUpO1xuXG5PYmplY3QuYXNzaWduKExpbmVzLCB7XG4gICAgbmFtZTogJ2xpbmVzJyxcbiAgICBidWlsdF9pbjogdHJ1ZSxcbiAgICB2ZXJ0ZXhfc2hhZGVyX3NyYzogc2hhZGVyU3JjX3BvbHlnb25zVmVydGV4LFxuICAgIGZyYWdtZW50X3NoYWRlcl9zcmM6IHNoYWRlclNyY19wb2x5Z29uc0ZyYWdtZW50LFxuICAgIHNlbGVjdGlvbjogdHJ1ZSwgLy8gdHVybiBmZWF0dXJlIHNlbGVjdGlvbiBvblxuXG4gICAgaW5pdCgpIHtcbiAgICAgICAgU3R5bGUuaW5pdC5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuXG4gICAgICAgIC8vIEJhc2ljIGF0dHJpYnV0ZXMsIG90aGVycyBjYW4gYmUgYWRkZWQgKHNlZSB0ZXh0dXJlIFVWcyBiZWxvdylcbiAgICAgICAgdmFyIGF0dHJpYnMgPSBbXG4gICAgICAgICAgICB7IG5hbWU6ICdhX3Bvc2l0aW9uJywgc2l6ZTogNCwgdHlwZTogZ2wuU0hPUlQsIG5vcm1hbGl6ZWQ6IGZhbHNlIH0sXG4gICAgICAgICAgICB7IG5hbWU6ICdhX2V4dHJ1ZGUnLCBzaXplOiA0LCB0eXBlOiBnbC5TSE9SVCwgbm9ybWFsaXplZDogZmFsc2UgfSxcbiAgICAgICAgICAgIHsgbmFtZTogJ2FfY29sb3InLCBzaXplOiA0LCB0eXBlOiBnbC5VTlNJR05FRF9CWVRFLCBub3JtYWxpemVkOiB0cnVlIH1cbiAgICAgICAgXTtcblxuICAgICAgICAvLyBUZWxsIHRoZSBzaGFkZXIgd2Ugd2FudCBhIG9yZGVyIGluIHZlcnRleCBhdHRyaWJ1dGVzLCBhbmQgdG8gZXh0cnVkZSBsaW5lc1xuICAgICAgICB0aGlzLmRlZmluZXMuVEFOR1JBTV9MQVlFUl9PUkRFUiA9IHRydWU7XG4gICAgICAgIHRoaXMuZGVmaW5lcy5UQU5HUkFNX0VYVFJVREVfTElORVMgPSB0cnVlO1xuXG4gICAgICAgIC8vIE9wdGlvbmFsIGZlYXR1cmUgc2VsZWN0aW9uXG4gICAgICAgIGlmICh0aGlzLnNlbGVjdGlvbikge1xuICAgICAgICAgICAgYXR0cmlicy5wdXNoKHsgbmFtZTogJ2Ffc2VsZWN0aW9uX2NvbG9yJywgc2l6ZTogNCwgdHlwZTogZ2wuVU5TSUdORURfQllURSwgbm9ybWFsaXplZDogdHJ1ZSB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIE9wdGlvbmFsIGxpbmUgdGV4dHVyZSBvciBkYXNoIGFycmF5XG4gICAgICAgIC8vIChsYXR0ZXIgd2lsbCBiZSByZW5kZXJlZCBhdCBjb21waWxlLXRpbWUsIHdoZW4gR0wgY29udGV4dCBhdmFpbGFibGUpXG4gICAgICAgIGlmICh0aGlzLnRleHR1cmUgfHwgdGhpcy5kYXNoKSB7XG4gICAgICAgICAgICB0aGlzLnRleGNvb3JkcyA9IHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBPcHRpb25hbCB0ZXh0dXJlIFVWc1xuICAgICAgICBpZiAodGhpcy50ZXhjb29yZHMpIHtcbiAgICAgICAgICAgIHRoaXMuZGVmaW5lcy5UQU5HUkFNX1RFWFRVUkVfQ09PUkRTID0gdHJ1ZTtcblxuICAgICAgICAgICAgLy8gU2NhbGluZyBmYWN0b3IgdG8gYWRkIHByZWNpc2lvbiB0byBsaW5lIHRleHR1cmUgViBjb29yZGluYXRlIHBhY2tlZCBhcyBub3JtYWxpemVkIHNob3J0XG4gICAgICAgICAgICB0aGlzLmRlZmluZXMuVEFOR1JBTV9EQVNIX1NDQUxFID0gMTtcbiAgICAgICAgICAgIHRoaXMuZGVmaW5lcy5UQU5HUkFNX1ZfU0NBTEVfQURKVVNUID0gR2VvLnRpbGVfc2NhbGUgKiB0aGlzLmRlZmluZXMuVEFOR1JBTV9EQVNIX1NDQUxFO1xuXG4gICAgICAgICAgICAvLyBBZGQgdmVydGV4IGF0dHJpYnV0ZSBmb3IgVVZzIG9ubHkgd2hlbiBuZWVkZWRcbiAgICAgICAgICAgIGF0dHJpYnMucHVzaCh7IG5hbWU6ICdhX3RleGNvb3JkJywgc2l6ZTogMiwgdHlwZTogZ2wuVU5TSUdORURfU0hPUlQsIG5vcm1hbGl6ZWQ6IHRydWUgfSk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnZlcnRleF9sYXlvdXQgPSBuZXcgVmVydGV4TGF5b3V0KGF0dHJpYnMpO1xuXG4gICAgICAgIC8vIEFkZGl0aW9uYWwgc2luZ2xlLWFsbG9jYXRlZCBvYmplY3QgdXNlZCBmb3IgaG9sZGluZyBvdXRsaW5lIHN0eWxlIGFzIGl0IGlzIHByb2Nlc3NlZFxuICAgICAgICAvLyBTZXBhcmF0ZSBmcm9tIHRoaXMuZmVhdHVyZV9zdHlsZSBzbyB0aGF0IG91dGxpbmUgcHJvcGVydGllcyBkbyBub3Qgb3ZlcndyaXRlIGNhbGN1bGF0ZWRcbiAgICAgICAgLy8gaW5saW5lIHByb3BlcnRpZXMgKG91dGxpbmUgY2FsbCBpcyBtYWRlICp3aXRoaW4qIHRoZSBpbmxpbmUgY2FsbClcbiAgICAgICAgdGhpcy5vdXRsaW5lX2ZlYXR1cmVfc3R5bGUgPSB7fTtcbiAgICAgICAgdGhpcy5pbmxpbmVfZmVhdHVyZV9zdHlsZSA9IHRoaXMuZmVhdHVyZV9zdHlsZTsgLy8gc2F2ZSByZWZlcmVuY2UgdG8gbWFpbiBjb21wdXRlZCBzdHlsZSBvYmplY3RcbiAgICB9LFxuXG4gICAgLy8gT3ZlcnJpZGVcbiAgICBjb21waWxlU2V0dXAgKCkge1xuICAgICAgICBpZiAoIXRoaXMuY29tcGlsZV9zZXR1cCkge1xuICAgICAgICAgICAgdGhpcy5wYXJzZUxpbmVUZXh0dXJlKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFN0eWxlLmNvbXBpbGVTZXR1cC5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIH0sXG5cbiAgICAvLyBPcHRpb25hbGx5IGFwcGx5IGEgZGFzaCBhcnJheSBwYXR0ZXJuIHRvIHRoaXMgbGluZVxuICAgIHBhcnNlTGluZVRleHR1cmUgKCkge1xuICAgICAgICAvLyBTcGVjaWZ5IGEgbGluZSBwYXR0ZXJuXG4gICAgICAgIGlmICh0aGlzLmRhc2gpIHtcbiAgICAgICAgICAgIC8vIE9wdGlvbmFsIGJhY2tncm91bmQgY29sb3IgZm9yIGRhc2ggcGF0dGVybiAoZGVmYXVsdHMgdHJhbnNwYXJlbnQpXG4gICAgICAgICAgICBpZiAodGhpcy5kYXNoX2JhY2tncm91bmRfY29sb3IpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmRhc2hfYmFja2dyb3VuZF9jb2xvciA9IFN0eWxlUGFyc2VyLnBhcnNlQ29sb3IodGhpcy5kYXNoX2JhY2tncm91bmRfY29sb3IpO1xuICAgICAgICAgICAgICAgIHRoaXMuZGVmaW5lcy5UQU5HUkFNX0xJTkVfQkFDS0dST1VORF9DT0xPUiA9XG4gICAgICAgICAgICAgICAgICAgIGB2ZWMzKCR7dGhpcy5kYXNoX2JhY2tncm91bmRfY29sb3Iuc2xpY2UoMCwgMykuam9pbignLCAnKX0pYDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gQWRqdXN0IHRleGNvb3JkIHNjYWxlIHRvIGFsbG93IGZvciBkYXNoIHBhdHRlcm5zIHRoYXQgYXJlIGEgZnJhY3Rpb24gb2YgbGluZSB3aWR0aFxuICAgICAgICAgICAgdGhpcy5kZWZpbmVzLlRBTkdSQU1fREFTSF9TQ0FMRSA9IDIwO1xuICAgICAgICAgICAgdGhpcy5kZWZpbmVzLlRBTkdSQU1fVl9TQ0FMRV9BREpVU1QgPSBHZW8udGlsZV9zY2FsZSAqIHRoaXMuZGVmaW5lcy5UQU5HUkFNX0RBU0hfU0NBTEU7XG5cbiAgICAgICAgICAgIC8vIFJlbmRlciBsaW5lIHBhdHRlcm5cbiAgICAgICAgICAgIGNvbnN0IGRhc2ggPSByZW5kZXJEYXNoQXJyYXkodGhpcy5kYXNoLCB7IHNjYWxlOiB0aGlzLmRlZmluZXMuVEFOR1JBTV9EQVNIX1NDQUxFIH0pO1xuICAgICAgICAgICAgdGhpcy50ZXh0dXJlID0gJ18nICsgdGhpcy5uYW1lICsgJ19kYXNoYXJyYXknO1xuICAgICAgICAgICAgVGV4dHVyZS5jcmVhdGUodGhpcy5nbCwgdGhpcy50ZXh0dXJlLCB7XG4gICAgICAgICAgICAgICAgZGF0YTogZGFzaC5waXhlbHMsXG4gICAgICAgICAgICAgICAgaGVpZ2h0OiBkYXNoLmxlbmd0aCxcbiAgICAgICAgICAgICAgICB3aWR0aDogMSxcbiAgICAgICAgICAgICAgICBmaWx0ZXJpbmc6ICduZWFyZXN0J1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBTcGVjaWZ5IGEgbGluZSB0ZXh0dXJlIChlaXRoZXIgZGlyZWN0bHksIG9yIHJlbmRlcmVkIGRhc2ggcGF0dGVybiBmcm9tIGFib3ZlKVxuICAgICAgICBpZiAodGhpcy50ZXh0dXJlKSB7XG4gICAgICAgICAgICB0aGlzLmRlZmluZXMuVEFOR1JBTV9MSU5FX1RFWFRVUkUgPSB0cnVlO1xuICAgICAgICAgICAgdGhpcy5kZWZpbmVzLlRBTkdSQU1fQUxQSEFfVEVTVCA9IDAuNTsgLy8gcGl4ZWxzIGJlbG93IHRoaXMgdGhyZXNob2xkIGFyZSB0cmFuc3BhcmVudFxuICAgICAgICAgICAgdGhpcy5zaGFkZXJzLnVuaWZvcm1zID0gdGhpcy5zaGFkZXJzLnVuaWZvcm1zIHx8IHt9O1xuICAgICAgICAgICAgdGhpcy5zaGFkZXJzLnVuaWZvcm1zLnVfdGV4dHVyZSA9IHRoaXMudGV4dHVyZTtcbiAgICAgICAgICAgIHRoaXMuc2hhZGVycy51bmlmb3Jtcy51X3RleHR1cmVfcmF0aW8gPSAxO1xuXG4gICAgICAgICAgICAvLyB1cGRhdGUgbGluZSBwYXR0ZXJuIGFzcGVjdCByYXRpbyBhZnRlciB0ZXh0dXJlIGxvYWRzXG4gICAgICAgICAgICBUZXh0dXJlLmdldEluZm8odGhpcy50ZXh0dXJlKS50aGVuKHRleHR1cmUgPT4ge1xuICAgICAgICAgICAgICAgIGlmICh0ZXh0dXJlKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2hhZGVycy51bmlmb3Jtcy51X3RleHR1cmVfcmF0aW8gPSB0ZXh0dXJlLmhlaWdodCAvIHRleHR1cmUud2lkdGg7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgLy8gQ2FsY3VsYXRlIHdpZHRoIGF0IHpvb20gZ2l2ZW4gaW4gYGNvbnRleHRgXG4gICAgY2FsY1dpZHRoICh3aWR0aCwgY29udGV4dCkge1xuICAgICAgICByZXR1cm4gKHdpZHRoICYmIFN0eWxlUGFyc2VyLmV2YWxDYWNoZWREaXN0YW5jZVByb3BlcnR5KHdpZHRoLCBjb250ZXh0KSkgfHwgMDtcbiAgICB9LFxuXG4gICAgLy8gQ2FsY3VsYXRlIHdpZHRoIGF0IG5leHQgem9vbSAodXNlZCBmb3IgbGluZSB3aWR0aCBpbnRlcnBvbGF0aW9uKVxuICAgIGNhbGNXaWR0aE5leHRab29tICh3aWR0aCwgY29udGV4dCkge1xuICAgICAgICBjb250ZXh0Lnpvb20rKztcbiAgICAgICAgbGV0IHZhbCA9IHRoaXMuY2FsY1dpZHRoKHdpZHRoLCBjb250ZXh0KTtcbiAgICAgICAgY29udGV4dC56b29tLS07XG4gICAgICAgIHJldHVybiB2YWw7XG4gICAgfSxcblxuICAgIF9wYXJzZUZlYXR1cmUgKGZlYXR1cmUsIGRyYXcsIGNvbnRleHQpIHtcbiAgICAgICAgdmFyIHN0eWxlID0gdGhpcy5mZWF0dXJlX3N0eWxlO1xuXG4gICAgICAgIC8vIGxpbmUgd2lkdGggaW4gbWV0ZXJzXG4gICAgICAgIGxldCB3aWR0aCA9IHRoaXMuY2FsY1dpZHRoKGRyYXcud2lkdGgsIGNvbnRleHQpO1xuICAgICAgICBpZiAod2lkdGggPCAwKSB7XG4gICAgICAgICAgICByZXR1cm47IC8vIHNraXAgbGluZXMgd2l0aCBuZWdhdGl2ZSB3aWR0aFxuICAgICAgICB9XG4gICAgICAgIGxldCBuZXh0X3dpZHRoID0gdGhpcy5jYWxjV2lkdGhOZXh0Wm9vbShkcmF3Lm5leHRfd2lkdGgsIGNvbnRleHQpO1xuXG4gICAgICAgIGlmICgod2lkdGggPT09IDAgJiYgbmV4dF93aWR0aCA9PT0gMCkgfHwgbmV4dF93aWR0aCA8IDApIHtcbiAgICAgICAgICAgIHJldHVybjsgLy8gc2tpcCBsaW5lcyB0aGF0IGRvbid0IGludGVycG9sYXRlIHRvIGEgcG9zaXRpdmUgdmFsdWUgYXQgbmV4dCB6b29tXG4gICAgICAgIH1cblxuICAgICAgICAvLyBjb252ZXJ0IHRvIHVuaXRzIGFuZCByZWxhdGl2ZSBjaGFuZ2UgZnJvbSBwcmV2aW91cyB6b29tXG4gICAgICAgIC8vIE5COiBtdWx0aXBseSBieSAyIGJlY2F1c2UgYSBnaXZlbiB3aWR0aCBpcyB0d2ljZSBhcyBiaWcgaW4gc2NyZWVuIHNwYWNlIGF0IHRoZSBuZXh0IHpvb21cbiAgICAgICAgc3R5bGUud2lkdGggPSB3aWR0aCAqIGNvbnRleHQudW5pdHNfcGVyX21ldGVyX292ZXJ6b29tO1xuICAgICAgICBzdHlsZS5uZXh0X3dpZHRoID0gKG5leHRfd2lkdGggKiAyKSAtIHdpZHRoO1xuICAgICAgICBzdHlsZS5uZXh0X3dpZHRoICo9IGNvbnRleHQudW5pdHNfcGVyX21ldGVyX292ZXJ6b29tO1xuICAgICAgICBzdHlsZS5uZXh0X3dpZHRoIC89IDI7IC8vIE5COiBkaXZpZGUgYnkgMiBiZWNhdXNlIGV4dHJ1c2lvbiB3aWR0aCBpcyBoYWx2ZWQgaW4gYnVpbGRlciAtIHJlbW92ZT9cblxuICAgICAgICBzdHlsZS5jb2xvciA9IHRoaXMucGFyc2VDb2xvcihkcmF3LmNvbG9yLCBjb250ZXh0KTtcbiAgICAgICAgaWYgKCFzdHlsZS5jb2xvcikge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gaGVpZ2h0IGRlZmF1bHRzIHRvIGZlYXR1cmUgaGVpZ2h0LCBidXQgZXh0cnVkZSBzdHlsZSBjYW4gZHluYW1pY2FsbHkgYWRqdXN0IGhlaWdodCBieSByZXR1cm5pbmcgYSBudW1iZXIgb3IgYXJyYXkgKGluc3RlYWQgb2YgYSBib29sZWFuKVxuICAgICAgICBzdHlsZS56ID0gKGRyYXcueiAmJiBTdHlsZVBhcnNlci5ldmFsQ2FjaGVkRGlzdGFuY2VQcm9wZXJ0eShkcmF3LnogfHwgMCwgY29udGV4dCkpIHx8IFN0eWxlUGFyc2VyLmRlZmF1bHRzLno7XG4gICAgICAgIHN0eWxlLmhlaWdodCA9IGZlYXR1cmUucHJvcGVydGllcy5oZWlnaHQgfHwgU3R5bGVQYXJzZXIuZGVmYXVsdHMuaGVpZ2h0O1xuICAgICAgICBzdHlsZS5leHRydWRlID0gU3R5bGVQYXJzZXIuZXZhbFByb3BlcnR5KGRyYXcuZXh0cnVkZSwgY29udGV4dCk7XG4gICAgICAgIGlmIChzdHlsZS5leHRydWRlKSB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIHN0eWxlLmV4dHJ1ZGUgPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgICAgICAgc3R5bGUuaGVpZ2h0ID0gc3R5bGUuZXh0cnVkZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKEFycmF5LmlzQXJyYXkoc3R5bGUuZXh0cnVkZSkpIHtcbiAgICAgICAgICAgICAgICBzdHlsZS5oZWlnaHQgPSBzdHlsZS5leHRydWRlWzFdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gUmFpc2UgbGluZSBoZWlnaHQgaWYgZXh0cnVkZWRcbiAgICAgICAgaWYgKHN0eWxlLmV4dHJ1ZGUgJiYgc3R5bGUuaGVpZ2h0KSB7XG4gICAgICAgICAgICBzdHlsZS56ICs9IHN0eWxlLmhlaWdodDtcbiAgICAgICAgfVxuXG4gICAgICAgIHN0eWxlLnogKj0gR2VvLmhlaWdodF9zY2FsZTsgICAgICAgIC8vIHByb3ZpZGUgc3ViLW1ldGVyIHByZWNpc2lvbiBvZiBoZWlnaHQgdmFsdWVzXG4gICAgICAgIHN0eWxlLmhlaWdodCAqPSBHZW8uaGVpZ2h0X3NjYWxlO1xuXG4gICAgICAgIHN0eWxlLmNhcCA9IGRyYXcuY2FwO1xuICAgICAgICBzdHlsZS5qb2luID0gZHJhdy5qb2luO1xuICAgICAgICBzdHlsZS5taXRlcl9saW1pdCA9IGRyYXcubWl0ZXJfbGltaXQ7XG4gICAgICAgIHN0eWxlLnRpbGVfZWRnZXMgPSBkcmF3LnRpbGVfZWRnZXM7IC8vIHVzdWFsbHkgYWN0aXZhdGVkIGZvciBkZWJ1Z2dpbmcsIG9yIHJhcmUgdmlzdWFsaXphdGlvbiBuZWVkc1xuXG4gICAgICAgIC8vIENvbnN0cnVjdCBhbiBvdXRsaW5lIHN0eWxlXG4gICAgICAgIC8vIFJldXNhYmxlIG91dGxpbmUgc3R5bGUgb2JqZWN0LCBtYXJrZWQgYXMgYWxyZWFkeSB3cmFwcGVkIGluIGNhY2hlIG9iamVjdHMgKHByZXByb2Nlc3NlZCA9IHRydWUpXG4gICAgICAgIHN0eWxlLm91dGxpbmUgPSBzdHlsZS5vdXRsaW5lIHx8IHsgd2lkdGg6IHt9LCBuZXh0X3dpZHRoOiB7fSwgcHJlcHJvY2Vzc2VkOiB0cnVlIH07XG5cbiAgICAgICAgaWYgKGRyYXcub3V0bGluZSAmJiBkcmF3Lm91dGxpbmUudmlzaWJsZSAhPT0gZmFsc2UgJiYgZHJhdy5vdXRsaW5lLmNvbG9yICYmIGRyYXcub3V0bGluZS53aWR0aCkge1xuICAgICAgICAgICAgLy8gb3V0bGluZSB3aWR0aCBpbiBtZXRlcnNcbiAgICAgICAgICAgIC8vIE5COiBtdWx0aXBseSBieSAyIGJlY2F1c2Ugb3V0bGluZSBpcyBhcHBsaWVkIG9uIGJvdGggc2lkZXMgb2YgbGluZVxuICAgICAgICAgICAgbGV0IG91dGxpbmVfd2lkdGggPSB0aGlzLmNhbGNXaWR0aChkcmF3Lm91dGxpbmUud2lkdGgsIGNvbnRleHQpICogMjtcbiAgICAgICAgICAgIGxldCBvdXRsaW5lX25leHRfd2lkdGggPSB0aGlzLmNhbGNXaWR0aE5leHRab29tKGRyYXcub3V0bGluZS5uZXh0X3dpZHRoLCBjb250ZXh0KSAqIDI7XG5cbiAgICAgICAgICAgIGlmICgob3V0bGluZV93aWR0aCA9PT0gMCAmJiBvdXRsaW5lX25leHRfd2lkdGggPT09IDApIHx8IG91dGxpbmVfd2lkdGggPCAwIHx8IG91dGxpbmVfbmV4dF93aWR0aCA8IDApIHtcbiAgICAgICAgICAgICAgICAvLyBza2lwIGxpbmVzIHRoYXQgZG9uJ3QgaW50ZXJwb2xhdGUgYmV0d2VlbiB6ZXJvIG9yIGdyZWF0ZXIgd2lkdGhcbiAgICAgICAgICAgICAgICBzdHlsZS5vdXRsaW5lLndpZHRoLnZhbHVlID0gbnVsbDtcbiAgICAgICAgICAgICAgICBzdHlsZS5vdXRsaW5lLm5leHRfd2lkdGgudmFsdWUgPSBudWxsO1xuICAgICAgICAgICAgICAgIHN0eWxlLm91dGxpbmUuY29sb3IgPSBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gTWFpbnRhaW4gY29uc2lzdGVudCBvdXRsaW5lIHdpZHRoIGFyb3VuZCB0aGUgbGluZSBmaWxsXG4gICAgICAgICAgICAgICAgc3R5bGUub3V0bGluZS53aWR0aC52YWx1ZSA9IG91dGxpbmVfd2lkdGggKyB3aWR0aDtcbiAgICAgICAgICAgICAgICBzdHlsZS5vdXRsaW5lLm5leHRfd2lkdGgudmFsdWUgPSBvdXRsaW5lX25leHRfd2lkdGggKyBuZXh0X3dpZHRoO1xuXG4gICAgICAgICAgICAgICAgc3R5bGUub3V0bGluZS5jb2xvciA9IGRyYXcub3V0bGluZS5jb2xvcjtcbiAgICAgICAgICAgICAgICBzdHlsZS5vdXRsaW5lLmNhcCA9IGRyYXcub3V0bGluZS5jYXAgfHwgZHJhdy5jYXA7XG4gICAgICAgICAgICAgICAgc3R5bGUub3V0bGluZS5qb2luID0gZHJhdy5vdXRsaW5lLmpvaW4gfHwgZHJhdy5qb2luO1xuICAgICAgICAgICAgICAgIHN0eWxlLm91dGxpbmUubWl0ZXJfbGltaXQgPSBkcmF3Lm91dGxpbmUubWl0ZXJfbGltaXQgfHwgZHJhdy5taXRlcl9saW1pdDtcbiAgICAgICAgICAgICAgICBzdHlsZS5vdXRsaW5lLnN0eWxlID0gZHJhdy5vdXRsaW5lLnN0eWxlIHx8IHRoaXMubmFtZTtcblxuICAgICAgICAgICAgICAgIC8vIEV4cGxpY2l0bHkgZGVmaW5lZCBvdXRsaW5lIG9yZGVyLCBvciBpbmhlcml0ZWQgZnJvbSBpbm5lciBsaW5lXG4gICAgICAgICAgICAgICAgaWYgKGRyYXcub3V0bGluZS5vcmRlcikge1xuICAgICAgICAgICAgICAgICAgICBzdHlsZS5vdXRsaW5lLm9yZGVyID0gdGhpcy5wYXJzZU9yZGVyKGRyYXcub3V0bGluZS5vcmRlciwgY29udGV4dCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBzdHlsZS5vdXRsaW5lLm9yZGVyID0gc3R5bGUub3JkZXI7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gRG9uJ3QgbGV0IG91dGxpbmUgYmUgYWJvdmUgaW5uZXIgbGluZVxuICAgICAgICAgICAgICAgIGlmIChzdHlsZS5vdXRsaW5lLm9yZGVyID4gc3R5bGUub3JkZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgc3R5bGUub3V0bGluZS5vcmRlciA9IHN0eWxlLm9yZGVyO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIE91dGxpbmVzIGFyZSBhbHdheXMgYXQgaGFsZi1sYXllciBpbnRlcnZhbHMgdG8gYXZvaWQgY29uZmxpY3Rpbmcgd2l0aCBpbm5lciBsaW5lc1xuICAgICAgICAgICAgICAgIHN0eWxlLm91dGxpbmUub3JkZXIgLT0gMC41O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgc3R5bGUub3V0bGluZS53aWR0aC52YWx1ZSA9IG51bGw7XG4gICAgICAgICAgICBzdHlsZS5vdXRsaW5lLm5leHRfd2lkdGgudmFsdWUgPSBudWxsO1xuICAgICAgICAgICAgc3R5bGUub3V0bGluZS5jb2xvciA9IG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gc3R5bGU7XG4gICAgfSxcblxuICAgIF9wcmVwcm9jZXNzIChkcmF3KSB7XG4gICAgICAgIGRyYXcuY29sb3IgPSBTdHlsZVBhcnNlci5jcmVhdGVDb2xvclByb3BlcnR5Q2FjaGUoZHJhdy5jb2xvcik7XG4gICAgICAgIGRyYXcud2lkdGggPSBTdHlsZVBhcnNlci5jcmVhdGVQcm9wZXJ0eUNhY2hlKGRyYXcud2lkdGgsIFN0eWxlUGFyc2VyLnBhcnNlVW5pdHMpO1xuICAgICAgICBkcmF3Lm5leHRfd2lkdGggPSBTdHlsZVBhcnNlci5jcmVhdGVQcm9wZXJ0eUNhY2hlKGRyYXcud2lkdGgsIFN0eWxlUGFyc2VyLnBhcnNlVW5pdHMpOyAvLyB3aWR0aCB3aWxsIGJlIGNvbXB1dGVkIGZvciBuZXh0IHpvb21cbiAgICAgICAgZHJhdy56ID0gU3R5bGVQYXJzZXIuY3JlYXRlUHJvcGVydHlDYWNoZShkcmF3LnosIFN0eWxlUGFyc2VyLnBhcnNlVW5pdHMpO1xuXG4gICAgICAgIGlmIChkcmF3Lm91dGxpbmUpIHtcbiAgICAgICAgICAgIGRyYXcub3V0bGluZS5jb2xvciA9IFN0eWxlUGFyc2VyLmNyZWF0ZUNvbG9yUHJvcGVydHlDYWNoZShkcmF3Lm91dGxpbmUuY29sb3IpO1xuICAgICAgICAgICAgZHJhdy5vdXRsaW5lLndpZHRoID0gU3R5bGVQYXJzZXIuY3JlYXRlUHJvcGVydHlDYWNoZShkcmF3Lm91dGxpbmUud2lkdGgsIFN0eWxlUGFyc2VyLnBhcnNlVW5pdHMpO1xuICAgICAgICAgICAgZHJhdy5vdXRsaW5lLm5leHRfd2lkdGggPSBTdHlsZVBhcnNlci5jcmVhdGVQcm9wZXJ0eUNhY2hlKGRyYXcub3V0bGluZS53aWR0aCwgU3R5bGVQYXJzZXIucGFyc2VVbml0cyk7IC8vIHdpZHRoIHJlLWNvbXB1dGVkIGZvciBuZXh0IHpvb21cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZHJhdztcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogQSBcInRlbXBsYXRlXCIgdGhhdCBzZXRzIGNvbnN0YW50IGF0dGlidXRlcyBmb3IgZWFjaCB2ZXJ0ZXgsIHdoaWNoIGlzIHRoZW4gbW9kaWZpZWQgcGVyIHZlcnRleCBvciBwZXIgZmVhdHVyZS5cbiAgICAgKiBBIHBsYWluIEpTIGFycmF5IG1hdGNoaW5nIHRoZSBvcmRlciBvZiB0aGUgdmVydGV4IGxheW91dC5cbiAgICAgKi9cbiAgICBtYWtlVmVydGV4VGVtcGxhdGUoc3R5bGUpIHtcbiAgICAgICAgbGV0IGkgPSAwO1xuXG4gICAgICAgIC8vIHBvc2l0aW9uIC0geCAmIHkgY29vcmRzIHdpbGwgYmUgZmlsbGVkIGluIHBlci12ZXJ0ZXggYmVsb3dcbiAgICAgICAgdGhpcy52ZXJ0ZXhfdGVtcGxhdGVbaSsrXSA9IDA7XG4gICAgICAgIHRoaXMudmVydGV4X3RlbXBsYXRlW2krK10gPSAwO1xuICAgICAgICB0aGlzLnZlcnRleF90ZW1wbGF0ZVtpKytdID0gc3R5bGUueiB8fCAwO1xuXG4gICAgICAgIC8vIGxheWVyIG9yZGVyIC0gdyBjb29yZCBvZiAncG9zaXRpb24nIGF0dHJpYnV0ZSAoZm9yIHBhY2tpbmcgZWZmaWNpZW5jeSlcbiAgICAgICAgdGhpcy52ZXJ0ZXhfdGVtcGxhdGVbaSsrXSA9IHRoaXMuc2NhbGVPcmRlcihzdHlsZS5vcmRlcik7XG5cbiAgICAgICAgLy8gZXh0cnVzaW9uIHZlY3RvclxuICAgICAgICB0aGlzLnZlcnRleF90ZW1wbGF0ZVtpKytdID0gMDtcbiAgICAgICAgdGhpcy52ZXJ0ZXhfdGVtcGxhdGVbaSsrXSA9IDA7XG4gICAgICAgIHRoaXMudmVydGV4X3RlbXBsYXRlW2krK10gPSAwO1xuXG4gICAgICAgIC8vIHNjYWxpbmcgdG8gcHJldmlvdXMgYW5kIG5leHQgem9vbVxuICAgICAgICB0aGlzLnZlcnRleF90ZW1wbGF0ZVtpKytdID0gc3R5bGUubmV4dF93aWR0aDtcblxuICAgICAgICAvLyBjb2xvclxuICAgICAgICB0aGlzLnZlcnRleF90ZW1wbGF0ZVtpKytdID0gc3R5bGUuY29sb3JbMF0gKiAyNTU7XG4gICAgICAgIHRoaXMudmVydGV4X3RlbXBsYXRlW2krK10gPSBzdHlsZS5jb2xvclsxXSAqIDI1NTtcbiAgICAgICAgdGhpcy52ZXJ0ZXhfdGVtcGxhdGVbaSsrXSA9IHN0eWxlLmNvbG9yWzJdICogMjU1O1xuICAgICAgICB0aGlzLnZlcnRleF90ZW1wbGF0ZVtpKytdID0gc3R5bGUuY29sb3JbM10gKiAyNTU7XG5cbiAgICAgICAgLy8gc2VsZWN0aW9uIGNvbG9yXG4gICAgICAgIGlmICh0aGlzLnNlbGVjdGlvbikge1xuICAgICAgICAgICAgdGhpcy52ZXJ0ZXhfdGVtcGxhdGVbaSsrXSA9IHN0eWxlLnNlbGVjdGlvbl9jb2xvclswXSAqIDI1NTtcbiAgICAgICAgICAgIHRoaXMudmVydGV4X3RlbXBsYXRlW2krK10gPSBzdHlsZS5zZWxlY3Rpb25fY29sb3JbMV0gKiAyNTU7XG4gICAgICAgICAgICB0aGlzLnZlcnRleF90ZW1wbGF0ZVtpKytdID0gc3R5bGUuc2VsZWN0aW9uX2NvbG9yWzJdICogMjU1O1xuICAgICAgICAgICAgdGhpcy52ZXJ0ZXhfdGVtcGxhdGVbaSsrXSA9IHN0eWxlLnNlbGVjdGlvbl9jb2xvclszXSAqIDI1NTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEFkZCB0ZXh0dXJlIFVWcyB0byB0ZW1wbGF0ZSBvbmx5IGlmIG5lZWRlZFxuICAgICAgICBpZiAodGhpcy50ZXhjb29yZHMpIHtcbiAgICAgICAgICAgIHRoaXMudmVydGV4X3RlbXBsYXRlW2krK10gPSAwO1xuICAgICAgICAgICAgdGhpcy52ZXJ0ZXhfdGVtcGxhdGVbaSsrXSA9IDA7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy52ZXJ0ZXhfdGVtcGxhdGU7XG4gICAgfSxcblxuICAgIGJ1aWxkTGluZXMobGluZXMsIHN0eWxlLCB2ZXJ0ZXhfZGF0YSwgY29udGV4dCwgb3B0aW9ucykge1xuICAgICAgICAvLyBPdXRsaW5lIChidWlsZCBmaXJzdCBzbyB0aGF0IGJsZW5kZWQgZ2VvbWV0cnkgd2l0aG91dCBhIGRlcHRoIHRlc3QgaXMgZHJhd24gZmlyc3QvdW5kZXIgdGhlIGlubmVyIGxpbmUpXG4gICAgICAgIHRoaXMuZmVhdHVyZV9zdHlsZSA9IHRoaXMub3V0bGluZV9mZWF0dXJlX3N0eWxlOyAvLyBzd2FwIGluIG91dGxpbmUtc3BlY2lmaWMgc3R5bGUgaG9sZGVyXG4gICAgICAgIGlmIChzdHlsZS5vdXRsaW5lICYmIHN0eWxlLm91dGxpbmUuY29sb3IgIT0gbnVsbCAmJiBzdHlsZS5vdXRsaW5lLndpZHRoLnZhbHVlICE9IG51bGwpIHtcbiAgICAgICAgICAgIHZhciBvdXRsaW5lX3N0eWxlID0gdGhpcy5zdHlsZXNbc3R5bGUub3V0bGluZS5zdHlsZV07XG4gICAgICAgICAgICBpZiAob3V0bGluZV9zdHlsZSkge1xuICAgICAgICAgICAgICAgIG91dGxpbmVfc3R5bGUuYWRkRmVhdHVyZShjb250ZXh0LmZlYXR1cmUsIHN0eWxlLm91dGxpbmUsIGNvbnRleHQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gTWFpbiBsaW5lXG4gICAgICAgIHRoaXMuZmVhdHVyZV9zdHlsZSA9IHRoaXMuaW5saW5lX2ZlYXR1cmVfc3R5bGU7IC8vIHJlc3RvcmUgY2FsY3VsYXRlZCBzdHlsZSBmb3IgaW5saW5lXG4gICAgICAgIGxldCB2ZXJ0ZXhfdGVtcGxhdGUgPSB0aGlzLm1ha2VWZXJ0ZXhUZW1wbGF0ZShzdHlsZSk7XG4gICAgICAgIGJ1aWxkUG9seWxpbmVzKFxuICAgICAgICAgICAgbGluZXMsXG4gICAgICAgICAgICBzdHlsZS53aWR0aCxcbiAgICAgICAgICAgIHZlcnRleF9kYXRhLFxuICAgICAgICAgICAgdmVydGV4X3RlbXBsYXRlLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGNhcDogc3R5bGUuY2FwLFxuICAgICAgICAgICAgICAgIGpvaW46IHN0eWxlLmpvaW4sXG4gICAgICAgICAgICAgICAgbWl0ZXJfbGltaXQ6IHN0eWxlLm1pdGVyX2xpbWl0LFxuICAgICAgICAgICAgICAgIHNjYWxpbmdfaW5kZXg6IHRoaXMudmVydGV4X2xheW91dC5pbmRleC5hX2V4dHJ1ZGUsXG4gICAgICAgICAgICAgICAgc2NhbGluZ19ub3JtYWxpemU6IDI1NiwgLy8gdmFsdWVzIGhhdmUgYW4gOC1iaXQgZnJhY3Rpb25cbiAgICAgICAgICAgICAgICB0ZXhjb29yZF9pbmRleDogdGhpcy52ZXJ0ZXhfbGF5b3V0LmluZGV4LmFfdGV4Y29vcmQsXG4gICAgICAgICAgICAgICAgdGV4Y29vcmRfd2lkdGg6IChzdHlsZS53aWR0aCB8fCBzdHlsZS5uZXh0X3dpZHRoKSAvIGNvbnRleHQudGlsZS5vdmVyem9vbTIsIC8vIFVWcyBjYW4ndCBjYWxjIGZvciB6ZXJvLXdpZHRoLCB1c2UgbmV4dCB6b29tIHdpZHRoIGluIHRoYXQgY2FzZVxuICAgICAgICAgICAgICAgIHRleGNvb3JkX25vcm1hbGl6ZTogNjU1MzUsIC8vIHNjYWxlIFVWcyB0byB1bnNpZ25lZCBzaG9ydHNcbiAgICAgICAgICAgICAgICBjbG9zZWRfcG9seWdvbjogb3B0aW9ucyAmJiBvcHRpb25zLmNsb3NlZF9wb2x5Z29uLFxuICAgICAgICAgICAgICAgIHJlbW92ZV90aWxlX2VkZ2VzOiAhc3R5bGUudGlsZV9lZGdlcyAmJiBvcHRpb25zICYmIG9wdGlvbnMucmVtb3ZlX3RpbGVfZWRnZXMsXG4gICAgICAgICAgICAgICAgdGlsZV9lZGdlX3RvbGVyYW5jZTogR2VvLnRpbGVfc2NhbGUgKiBjb250ZXh0LnRpbGUucGFkX3NjYWxlICogNFxuICAgICAgICAgICAgfVxuICAgICAgICApO1xuICAgIH0sXG5cbiAgICBidWlsZFBvbHlnb25zKHBvbHlnb25zLCBzdHlsZSwgdmVydGV4X2RhdGEsIGNvbnRleHQpIHtcbiAgICAgICAgLy8gUmVuZGVyIHBvbHlnb25zIGFzIGluZGl2aWR1YWwgbGluZXNcbiAgICAgICAgZm9yIChsZXQgcD0wOyBwIDwgcG9seWdvbnMubGVuZ3RoOyBwKyspIHtcbiAgICAgICAgICAgIHRoaXMuYnVpbGRMaW5lcyhwb2x5Z29uc1twXSwgc3R5bGUsIHZlcnRleF9kYXRhLCBjb250ZXh0LCB7IGNsb3NlZF9wb2x5Z29uOiB0cnVlLCByZW1vdmVfdGlsZV9lZGdlczogdHJ1ZSB9KTtcbiAgICAgICAgfVxuICAgIH1cblxufSk7XG4iLCIvLyBQb2ludCArIHRleHQgbGFiZWwgcmVuZGVyaW5nIHN0eWxlXG5cbmltcG9ydCBsb2cgZnJvbSAnLi4vLi4vdXRpbHMvbG9nJztcbmltcG9ydCB7U3R5bGV9IGZyb20gJy4uL3N0eWxlJztcbmltcG9ydCB7U3R5bGVQYXJzZXJ9IGZyb20gJy4uL3N0eWxlX3BhcnNlcic7XG5pbXBvcnQgZ2wgZnJvbSAnLi4vLi4vZ2wvY29uc3RhbnRzJzsgLy8gd2ViIHdvcmtlcnMgZG9uJ3QgaGF2ZSBhY2Nlc3MgdG8gR0wgY29udGV4dCwgc28gaW1wb3J0IGFsbCBHTCBjb25zdGFudHNcbmltcG9ydCBWZXJ0ZXhMYXlvdXQgZnJvbSAnLi4vLi4vZ2wvdmVydGV4X2xheW91dCc7XG5pbXBvcnQge2J1aWxkUXVhZHNGb3JQb2ludHN9IGZyb20gJy4uLy4uL2J1aWxkZXJzL3BvaW50cyc7XG5pbXBvcnQgVGV4dHVyZSBmcm9tICcuLi8uLi9nbC90ZXh0dXJlJztcbmltcG9ydCBHZW8gZnJvbSAnLi4vLi4vZ2VvJztcbmltcG9ydCBWZWN0b3IgZnJvbSAnLi4vLi4vdmVjdG9yJztcbmltcG9ydCBDb2xsaXNpb24gZnJvbSAnLi4vLi4vbGFiZWxzL2NvbGxpc2lvbic7XG5pbXBvcnQgTGFiZWxQb2ludCBmcm9tICcuLi8uLi9sYWJlbHMvbGFiZWxfcG9pbnQnO1xuaW1wb3J0IHBsYWNlUG9pbnRzT25MaW5lIGZyb20gJy4uLy4uL2xhYmVscy9wb2ludF9wbGFjZW1lbnQnO1xuaW1wb3J0IHtUZXh0TGFiZWxzfSBmcm9tICcuLi90ZXh0L3RleHRfbGFiZWxzJztcbmltcG9ydCB7VklFV19QQU5fU05BUF9USU1FfSBmcm9tICcuLi8uLi92aWV3JztcbmltcG9ydCBkZWJ1Z1NldHRpbmdzIGZyb20gJy4uLy4uL3V0aWxzL2RlYnVnX3NldHRpbmdzJztcblxubGV0IGZzID0gcmVxdWlyZSgnZnMnKTtcbmNvbnN0IHNoYWRlclNyY19wb2ludHNWZXJ0ZXggPSBmcy5yZWFkRmlsZVN5bmMoX19kaXJuYW1lICsgJy9wb2ludHNfdmVydGV4Lmdsc2wnLCAndXRmOCcpO1xuY29uc3Qgc2hhZGVyU3JjX3BvaW50c0ZyYWdtZW50ID0gZnMucmVhZEZpbGVTeW5jKF9fZGlybmFtZSArICcvcG9pbnRzX2ZyYWdtZW50Lmdsc2wnLCAndXRmOCcpO1xuXG5jb25zdCBQTEFDRU1FTlQgPSBMYWJlbFBvaW50LlBMQUNFTUVOVDtcblxuZXhwb3J0IHZhciBQb2ludHMgPSBPYmplY3QuY3JlYXRlKFN0eWxlKTtcblxuLy8gTWl4aW4gdGV4dCBsYWJlbCBtZXRob2RzXG5PYmplY3QuYXNzaWduKFBvaW50cywgVGV4dExhYmVscyk7XG5cbk9iamVjdC5hc3NpZ24oUG9pbnRzLCB7XG4gICAgbmFtZTogJ3BvaW50cycsXG4gICAgYnVpbHRfaW46IHRydWUsXG4gICAgY29sbGlzaW9uOiB0cnVlLCAgLy8gc3R5bGUgaW5jbHVkZXMgYSBjb2xsaXNpb24gcGFzc1xuICAgIGJsZW5kOiAnb3ZlcmxheScsIC8vIG92ZXJsYXlzIGRyYXduIG9uIHRvcCBvZiBhbGwgb3RoZXIgc3R5bGVzLCB3aXRoIGJsZW5kaW5nXG5cbiAgICBpbml0KG9wdGlvbnMgPSB7fSkge1xuICAgICAgICBTdHlsZS5pbml0LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG5cbiAgICAgICAgLy8gQmFzZSBzaGFkZXJzXG4gICAgICAgIHRoaXMudmVydGV4X3NoYWRlcl9zcmMgPSBzaGFkZXJTcmNfcG9pbnRzVmVydGV4O1xuICAgICAgICB0aGlzLmZyYWdtZW50X3NoYWRlcl9zcmMgPSBzaGFkZXJTcmNfcG9pbnRzRnJhZ21lbnQ7XG5cbiAgICAgICAgdmFyIGF0dHJpYnMgPSBbXG4gICAgICAgICAgICB7IG5hbWU6ICdhX3Bvc2l0aW9uJywgc2l6ZTogNCwgdHlwZTogZ2wuU0hPUlQsIG5vcm1hbGl6ZWQ6IGZhbHNlIH0sXG4gICAgICAgICAgICB7IG5hbWU6ICdhX3NoYXBlJywgc2l6ZTogNCwgdHlwZTogZ2wuU0hPUlQsIG5vcm1hbGl6ZWQ6IGZhbHNlIH0sXG4gICAgICAgICAgICB7IG5hbWU6ICdhX3RleGNvb3JkJywgc2l6ZTogMiwgdHlwZTogZ2wuVU5TSUdORURfU0hPUlQsIG5vcm1hbGl6ZWQ6IHRydWUgfSxcbiAgICAgICAgICAgIHsgbmFtZTogJ2Ffb2Zmc2V0Jywgc2l6ZTogMiwgdHlwZTogZ2wuU0hPUlQsIG5vcm1hbGl6ZWQ6IGZhbHNlIH0sXG4gICAgICAgICAgICB7IG5hbWU6ICdhX2NvbG9yJywgc2l6ZTogNCwgdHlwZTogZ2wuVU5TSUdORURfQllURSwgbm9ybWFsaXplZDogdHJ1ZSB9XG4gICAgICAgIF07XG5cbiAgICAgICAgLy8gRmVhdHVyZSBzZWxlY3Rpb25cbiAgICAgICAgdGhpcy5zZWxlY3Rpb24gPSB0cnVlO1xuICAgICAgICBhdHRyaWJzLnB1c2goeyBuYW1lOiAnYV9zZWxlY3Rpb25fY29sb3InLCBzaXplOiA0LCB0eXBlOiBnbC5VTlNJR05FRF9CWVRFLCBub3JtYWxpemVkOiB0cnVlIH0pO1xuXG4gICAgICAgIHRoaXMudmVydGV4X2xheW91dCA9IG5ldyBWZXJ0ZXhMYXlvdXQoYXR0cmlicyk7XG5cbiAgICAgICAgLy8gSWYgd2UncmUgbm90IHJlbmRlcmluZyBhcyBvdmVybGF5LCB3ZSBuZWVkIGEgbGF5ZXIgYXR0cmlidXRlXG4gICAgICAgIGlmICh0aGlzLmJsZW5kICE9PSAnb3ZlcmxheScpIHtcbiAgICAgICAgICAgIHRoaXMuZGVmaW5lcy5UQU5HUkFNX0xBWUVSX09SREVSID0gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGVuc3VyZSBhIGxhYmVsIHRleHR1cmUgaXMgYWx3YXlzIGJvdW5kIChhdm9pZCBDaHJvbWUgJ25vIHRleHR1cmUgYm91bmQgdG8gdW5pdCcgd2FybmluZ3MpXG4gICAgICAgIHRoaXMuc2hhZGVycy51bmlmb3JtcyA9IHRoaXMuc2hhZGVycy51bmlmb3JtcyB8fCB7fTtcbiAgICAgICAgdGhpcy5zaGFkZXJzLnVuaWZvcm1zLnVfbGFiZWxfdGV4dHVyZSA9IFRleHR1cmUuZGVmYXVsdDtcblxuICAgICAgICBpZiAodGhpcy50ZXh0dXJlKSB7XG4gICAgICAgICAgICB0aGlzLmRlZmluZXMuVEFOR1JBTV9QT0lOVF9URVhUVVJFID0gdHJ1ZTtcbiAgICAgICAgICAgIHRoaXMuc2hhZGVycy51bmlmb3Jtcy51X3RleHR1cmUgPSB0aGlzLnRleHR1cmU7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBFbmFibGUgZHVhbCBwb2ludC90ZXh0IG1vZGVcbiAgICAgICAgdGhpcy5kZWZpbmVzLlRBTkdSQU1fTVVMVElfU0FNUExFUiA9IHRydWU7XG5cbiAgICAgICAgLy8gRmFkZSBvdXQgd2hlbiB0aWxlIGlzIHpvb21pbmcgb3V0LCBlLmcuIGFjdGluZyBhcyBwcm94eSB0aWxlc1xuICAgICAgICB0aGlzLmRlZmluZXMuVEFOR1JBTV9GQURFX09OX1pPT01fT1VUID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5kZWZpbmVzLlRBTkdSQU1fRkFERV9PTl9aT09NX09VVF9SQVRFID0gMjsgLy8gZmFkZSBhdCAyeCwgZS5nLiBmdWxseSB0cmFuc3BhcmVudCBhdCAwLjUgem9vbSBsZXZlbCBhd2F5XG5cbiAgICAgICAgLy8gRmFkZSBpbiAoZGVwZW5kaW5nIG9uIHRpbGUgcHJveHkgc3RhdHVzKVxuICAgICAgICBpZiAoZGVidWdTZXR0aW5ncy5zdXBwcmVzc19sYWJlbF9mYWRlX2luID09PSB0cnVlKSB7XG4gICAgICAgICAgICB0aGlzLmZhZGVfaW5fdGltZSA9IDA7XG4gICAgICAgICAgICB0aGlzLmRlZmluZXMuVEFOR1JBTV9GQURFX0lOX1JBVEUgPSBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5mYWRlX2luX3RpbWUgPSAwLjE1OyAvLyB0aW1lIGluIHNlY29uZHNcbiAgICAgICAgICAgIHRoaXMuZGVmaW5lcy5UQU5HUkFNX0ZBREVfSU5fUkFURSA9IDEgLyB0aGlzLmZhZGVfaW5fdGltZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFNuYXAgcG9pbnRzIHRvIHBpeGVsIGdyaWQgYWZ0ZXIgcGFubmluZyBzdG9wXG4gICAgICAgIGlmIChkZWJ1Z1NldHRpbmdzLnN1cHByZXNzX2xhYmVsX3NuYXBfYW5pbWF0aW9uICE9PSB0cnVlKSB7XG4gICAgICAgICAgICB0aGlzLmRlZmluZXMuVEFOR1JBTV9WSUVXX1BBTl9TTkFQX1JBVEUgPSAxIC8gVklFV19QQU5fU05BUF9USU1FOyAvLyBpbnZlcnNlIHRpbWUgaW4gc2Vjb25kc1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5jb2xsaXNpb25fZ3JvdXBfcG9pbnRzID0gdGhpcy5uYW1lKyctcG9pbnRzJztcbiAgICAgICAgdGhpcy5jb2xsaXNpb25fZ3JvdXBfdGV4dCA9IHRoaXMubmFtZSsnLXRleHQnO1xuXG4gICAgICAgIHRoaXMucmVzZXQoKTtcbiAgICB9LFxuXG4gICAgcmVzZXQgKCkge1xuICAgICAgICB0aGlzLnF1ZXVlcyA9IHt9O1xuICAgICAgICB0aGlzLnJlc2V0VGV4dCgpO1xuICAgICAgICB0aGlzLnRleHR1cmVfbWlzc2luZ19zcHJpdGVzID0ge307IC8vIHRyYWNrIHdoaWNoIG1pc3Npbmcgc3ByaXRlcyB3ZSd2ZSBmb3VuZCAocmVkdWNlIGR1cGUgbG9nIG1lc3NhZ2VzKVxuICAgIH0sXG5cbiAgICAvLyBPdmVycmlkZSB0byBxdWV1ZSBmZWF0dXJlcyBpbnN0ZWFkIG9mIHByb2Nlc3NpbmcgaW1tZWRpYXRlbHlcbiAgICBhZGRGZWF0dXJlIChmZWF0dXJlLCBkcmF3LCBjb250ZXh0KSB7XG4gICAgICAgIGxldCB0aWxlID0gY29udGV4dC50aWxlO1xuICAgICAgICBpZiAodGlsZS5nZW5lcmF0aW9uICE9PSB0aGlzLmdlbmVyYXRpb24pIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENhbGxlZCBoZXJlIGJlY2F1c2Ugb3RoZXJ3aXNlIGl0IHdpbGwgYmUgZGVsYXllZCB1bnRpbCB0aGUgZmVhdHVyZSBxdWV1ZSBpcyBwYXJzZWQsXG4gICAgICAgIC8vIGFuZCB3ZSB3YW50IHRoZSBwcmVwcm9jZXNzaW5nIGRvbmUgYmVmb3JlIHdlIGV2YWx1YXRlIHRleHQgc3R5bGUgYmVsb3dcbiAgICAgICAgZHJhdyA9IHRoaXMucHJlcHJvY2VzcyhkcmF3KTtcbiAgICAgICAgaWYgKCFkcmF3KSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgc3R5bGUgPSB7fTtcbiAgICAgICAgc3R5bGUuY29sb3IgPSB0aGlzLnBhcnNlQ29sb3IoZHJhdy5jb2xvciwgY29udGV4dCk7XG5cbiAgICAgICAgLy8gUG9pbnQgc3R5bGluZ1xuXG4gICAgICAgIC8vIHJlcXVpcmUgY29sb3Igb3IgdGV4dHVyZVxuICAgICAgICBpZiAoIXN0eWxlLmNvbG9yICYmICF0aGlzLnRleHR1cmUpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHNwcml0ZSA9IHN0eWxlLnNwcml0ZSA9IFN0eWxlUGFyc2VyLmV2YWxQcm9wZXJ0eShkcmF3LnNwcml0ZSwgY29udGV4dCk7XG4gICAgICAgIHN0eWxlLnNwcml0ZV9kZWZhdWx0ID0gZHJhdy5zcHJpdGVfZGVmYXVsdDsgLy8gb3B0aW9uYWwgZmFsbGJhY2sgaWYgJ3Nwcml0ZScgbm90IGZvdW5kXG5cbiAgICAgICAgLy8gaWYgcG9pbnQgaGFzIHRleHR1cmUgYW5kIHNwcml0ZXMsIHJlcXVpcmUgYSB2YWxpZCBzcHJpdGUgdG8gZHJhd1xuICAgICAgICBpZiAodGhpcy50ZXh0dXJlICYmIFRleHR1cmUudGV4dHVyZXNbdGhpcy50ZXh0dXJlXSAmJiBUZXh0dXJlLnRleHR1cmVzW3RoaXMudGV4dHVyZV0uc3ByaXRlcykge1xuICAgICAgICAgICAgaWYgKCFzcHJpdGUgJiYgIXN0eWxlLnNwcml0ZV9kZWZhdWx0KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoIVRleHR1cmUudGV4dHVyZXNbdGhpcy50ZXh0dXJlXS5zcHJpdGVzW3Nwcml0ZV0pIHtcbiAgICAgICAgICAgICAgICAvLyBJZiBzcHJpdGUgbm90IGZvdW5kLCBjaGVjayBmb3IgZGVmYXVsdCBzcHJpdGVcbiAgICAgICAgICAgICAgICBpZiAoc3R5bGUuc3ByaXRlX2RlZmF1bHQpIHtcbiAgICAgICAgICAgICAgICAgICAgc3ByaXRlID0gc3R5bGUuc3ByaXRlX2RlZmF1bHQ7XG4gICAgICAgICAgICAgICAgICAgIGlmICghVGV4dHVyZS50ZXh0dXJlc1t0aGlzLnRleHR1cmVdLnNwcml0ZXNbc3ByaXRlXSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbG9nKCd3YXJuJywgYFN0eWxlOiBpbiBzdHlsZSAnJHt0aGlzLm5hbWV9JywgY291bGQgbm90IGZpbmQgZGVmYXVsdCBzcHJpdGUgJyR7c3ByaXRlfScgZm9yIHRleHR1cmUgJyR7dGhpcy50ZXh0dXJlfSdgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLnRleHR1cmVfbWlzc2luZ19zcHJpdGVzW3Nwcml0ZV0pIHsgLy8gb25seSBsb2cgZWFjaCBtaXNzaW5nIHNwcml0ZSBvbmNlXG4gICAgICAgICAgICAgICAgICAgICAgICBsb2coJ2RlYnVnJywgYFN0eWxlOiBpbiBzdHlsZSAnJHt0aGlzLm5hbWV9JywgY291bGQgbm90IGZpbmQgc3ByaXRlICcke3Nwcml0ZX0nIGZvciB0ZXh0dXJlICcke3RoaXMudGV4dHVyZX0nYCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnRleHR1cmVfbWlzc2luZ19zcHJpdGVzW3Nwcml0ZV0gPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoc3ByaXRlKSB7XG4gICAgICAgICAgICBsb2coJ3dhcm4nLCBgU3R5bGU6IGluIHN0eWxlICcke3RoaXMubmFtZX0nLCBzcHJpdGUgJyR7c3ByaXRlfScgd2FzIHNwZWNpZmllZCwgYnV0IHRleHR1cmUgJyR7dGhpcy50ZXh0dXJlfScgaGFzIG5vIHNwcml0ZXNgKTtcbiAgICAgICAgICAgIHNwcml0ZSA9IG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBTZXRzIHRleGNvb3JkIHNjYWxlIGlmIG5lZWRlZCAoZS5nLiBmb3Igc3ByaXRlIHN1Yi1hcmVhKVxuICAgICAgICBsZXQgc3ByaXRlX2luZm87XG4gICAgICAgIGlmICh0aGlzLnRleHR1cmUgJiYgc3ByaXRlKSB7XG4gICAgICAgICAgICBzcHJpdGVfaW5mbyA9IFRleHR1cmUuZ2V0U3ByaXRlSW5mbyh0aGlzLnRleHR1cmUsIHNwcml0ZSk7XG4gICAgICAgICAgICBzdHlsZS50ZXhjb29yZHMgPSBzcHJpdGVfaW5mby50ZXhjb29yZHM7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBzdHlsZS50ZXhjb29yZHMgPSBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gcG9pbnRzIGNhbiBiZSBwbGFjZWQgb2ZmIHRoZSBncm91bmRcbiAgICAgICAgc3R5bGUueiA9IChkcmF3LnogJiYgU3R5bGVQYXJzZXIuZXZhbENhY2hlZERpc3RhbmNlUHJvcGVydHkoZHJhdy56LCBjb250ZXh0KSkgfHwgU3R5bGVQYXJzZXIuZGVmYXVsdHMuejtcblxuICAgICAgICAvLyBwb2ludCBzaXplIGRlZmluZWQgZXhwbGljaXRseSwgb3IgZGVmYXVsdHMgdG8gc3ByaXRlIHNpemUsIG9yIGdlbmVyaWMgZmFsbGJhY2tcbiAgICAgICAgc3R5bGUuc2l6ZSA9IGRyYXcuc2l6ZTtcbiAgICAgICAgaWYgKCFzdHlsZS5zaXplKSB7XG4gICAgICAgICAgICBpZiAoc3ByaXRlX2luZm8pIHtcbiAgICAgICAgICAgICAgICBzdHlsZS5zaXplID0gc3ByaXRlX2luZm8uc2l6ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHN0eWxlLnNpemUgPSBbMTYsIDE2XTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHN0eWxlLnNpemUgPSBTdHlsZVBhcnNlci5ldmFsQ2FjaGVkUHJvcGVydHkoc3R5bGUuc2l6ZSwgY29udGV4dCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBzaXplIHdpbGwgYmUgc2NhbGVkIHRvIDE2LWJpdCBzaWduZWQgaW50LCBzbyBtYXggYWxsb3dlZCB3aWR0aCArIGhlaWdodCBvZiAyNTYgcGl4ZWxzXG4gICAgICAgIHN0eWxlLnNpemUgPSBbXG4gICAgICAgICAgICBNYXRoLm1pbigoc3R5bGUuc2l6ZVswXSB8fCBzdHlsZS5zaXplKSwgMjU2KSxcbiAgICAgICAgICAgIE1hdGgubWluKChzdHlsZS5zaXplWzFdIHx8IHN0eWxlLnNpemUpLCAyNTYpXG4gICAgICAgIF07XG5cbiAgICAgICAgLy8gUGxhY2VtZW50IHN0cmF0ZWd5XG4gICAgICAgIHN0eWxlLnBsYWNlbWVudCA9IGRyYXcucGxhY2VtZW50O1xuICAgICAgICBzdHlsZS5wbGFjZW1lbnRfbWluX2xlbmd0aF9yYXRpbyA9IFN0eWxlUGFyc2VyLmV2YWxDYWNoZWRQcm9wZXJ0eShkcmF3LnBsYWNlbWVudF9taW5fbGVuZ3RoX3JhdGlvLCBjb250ZXh0KTtcblxuICAgICAgICAvLyBTcGFjaW5nIHBhcmFtZXRlciAoaW4gcGl4ZWxzKSB0byBlcXVhbGx5IHNwYWNlIHBvaW50cyBhbG9uZyBhIGxpbmVcbiAgICAgICAgaWYgKHN0eWxlLnBsYWNlbWVudCA9PT0gUExBQ0VNRU5ULlNQQUNFRCAmJiBkcmF3LnBsYWNlbWVudF9zcGFjaW5nKSB7XG4gICAgICAgICAgICBzdHlsZS5wbGFjZW1lbnRfc3BhY2luZyA9IFN0eWxlUGFyc2VyLmV2YWxDYWNoZWRQcm9wZXJ0eShkcmF3LnBsYWNlbWVudF9zcGFjaW5nLCBjb250ZXh0KTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEFuZ2xlIHBhcmFtZXRlciAoY2FuIGJlIGEgbnVtYmVyIG9yIHRoZSBzdHJpbmcgXCJhdXRvXCIpXG4gICAgICAgIHN0eWxlLmFuZ2xlID0gU3R5bGVQYXJzZXIuZXZhbFByb3BlcnR5KGRyYXcuYW5nbGUsIGNvbnRleHQpO1xuXG4gICAgICAgIHN0eWxlLnRpbGVfZWRnZXMgPSBkcmF3LnRpbGVfZWRnZXM7IC8vIHVzdWFsbHkgYWN0aXZhdGVkIGZvciBkZWJ1Z2dpbmcsIG9yIHJhcmUgdmlzdWFsaXphdGlvbiBuZWVkc1xuXG4gICAgICAgIHN0eWxlLnNhbXBsZXIgPSAwOyAvLyAwID0gc3ByaXRlc1xuXG4gICAgICAgIHRoaXMuY29tcHV0ZUxheW91dChzdHlsZSwgZmVhdHVyZSwgZHJhdywgY29udGV4dCwgdGlsZSk7XG5cbiAgICAgICAgLy8gVGV4dCBzdHlsaW5nXG4gICAgICAgIGxldCB0ZiA9XG4gICAgICAgICAgICBkcmF3LnRleHQgJiZcbiAgICAgICAgICAgIGRyYXcudGV4dC52aXNpYmxlICE9PSBmYWxzZSAmJiAvLyBleHBsaWNpdGx5IGhhbmRsZSBgdmlzaWJsZWAgcHJvcGVydHkgZm9yIG5lc3RlZCB0ZXh0XG4gICAgICAgICAgICB0aGlzLnBhcnNlVGV4dEZlYXR1cmUoZmVhdHVyZSwgZHJhdy50ZXh0LCBjb250ZXh0LCB0aWxlKTtcblxuICAgICAgICBpZiAodGYpIHtcbiAgICAgICAgICAgIHRmLmxheW91dC5wYXJlbnQgPSBzdHlsZTsgLy8gcGFyZW50IHBvaW50IHdpbGwgYXBwbHkgYWRkaXRpb25hbCBhbmNob3Ivb2Zmc2V0IHRvIHRleHRcblxuICAgICAgICAgICAgLy8gVGV4dCBsYWJlbHMgaGF2ZSBhIGRlZmF1bHQgcHJpb3JpdHkgb2YgMC41IGJlbG93IHRoZWlyIHBhcmVudCBwb2ludCAoKzAuNSwgcHJpb3JpdHkgaXMgbG93ZXItaXMtYmV0dGVyKVxuICAgICAgICAgICAgLy8gVGhpcyBjYW4gYmUgb3ZlcnJpZGVuLCBhcyBsb25nIGFzIGl0IGlzIGxlc3MgdGhhbiBvciBlcXVhbCB0byB0aGUgZGVmYXVsdFxuICAgICAgICAgICAgdGYubGF5b3V0LnByaW9yaXR5ID0gZHJhdy50ZXh0LnByaW9yaXR5ID8gTWF0aC5tYXgodGYubGF5b3V0LnByaW9yaXR5LCBzdHlsZS5wcmlvcml0eSArIDAuNSkgOiAoc3R5bGUucHJpb3JpdHkgKyAwLjUpO1xuXG4gICAgICAgICAgICAvLyBUZXh0IGxhYmVscyBhdHRhY2hlZCB0byBwb2ludHMgc2hvdWxkIG5vdCBiZSBtb3ZlZCBpbnRvIHRpbGVcbiAgICAgICAgICAgIC8vICh0aGV5IHNob3VsZCBzdGF5IGZpeGVkIHJlbGF0aXZlIHRvIHRoZSBwb2ludClcbiAgICAgICAgICAgIHRmLmxheW91dC5tb3ZlX2ludG9fdGlsZSA9IGZhbHNlO1xuXG4gICAgICAgICAgICBDb2xsaXNpb24uYWRkU3R5bGUodGhpcy5jb2xsaXNpb25fZ3JvdXBfdGV4dCwgdGlsZS5rZXkpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gUXVldWUgdGhlIGZlYXR1cmUgZm9yIHByb2Nlc3NpbmdcbiAgICAgICAgaWYgKCF0aGlzLnRpbGVfZGF0YVt0aWxlLmtleV0pIHtcbiAgICAgICAgICAgIHRoaXMuc3RhcnREYXRhKHRpbGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5xdWV1ZXNbdGlsZS5rZXldLnB1c2goe1xuICAgICAgICAgICAgZmVhdHVyZSwgZHJhdywgY29udGV4dCwgc3R5bGUsXG4gICAgICAgICAgICB0ZXh0X2ZlYXR1cmU6IHRmXG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIFJlZ2lzdGVyIHdpdGggY29sbGlzaW9uIG1hbmFnZXJcbiAgICAgICAgQ29sbGlzaW9uLmFkZFN0eWxlKHRoaXMuY29sbGlzaW9uX2dyb3VwX3BvaW50cywgdGlsZS5rZXkpO1xuICAgIH0sXG5cbiAgICAvLyBPdmVycmlkZVxuICAgIHN0YXJ0RGF0YSAodGlsZSkge1xuICAgICAgICB0aGlzLnF1ZXVlc1t0aWxlLmtleV0gPSBbXTtcbiAgICAgICAgcmV0dXJuIFN0eWxlLnN0YXJ0RGF0YS5jYWxsKHRoaXMsIHRpbGUpO1xuICAgIH0sXG5cbiAgICAvLyBPdmVycmlkZVxuICAgIGVuZERhdGEgKHRpbGUpIHtcbiAgICAgICAgaWYgKHRpbGUuY2FuY2VsZWQpIHtcbiAgICAgICAgICAgIGxvZygndHJhY2UnLCBgU3R5bGUgJHt0aGlzLm5hbWV9OiBzdG9wIHRpbGUgYnVpbGQgYmVjYXVzZSB0aWxlIHdhcyBjYW5jZWxlZDogJHt0aWxlLmtleX1gKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBxdWV1ZSA9IHRoaXMucXVldWVzW3RpbGUua2V5XTtcbiAgICAgICAgdGhpcy5xdWV1ZXNbdGlsZS5rZXldID0gW107XG5cbiAgICAgICAgLy8gRm9yIGVhY2ggcG9pbnQgZmVhdHVyZSwgY3JlYXRlIG9uZSBvciBtb3JlIGxhYmVsc1xuICAgICAgICBsZXQgdGV4dF9vYmpzID0gW107XG4gICAgICAgIGxldCBwb2ludF9vYmpzID0gW107XG5cbiAgICAgICAgcXVldWUuZm9yRWFjaChxID0+IHtcbiAgICAgICAgICAgIGxldCBzdHlsZSA9IHEuc3R5bGU7XG4gICAgICAgICAgICBsZXQgZmVhdHVyZSA9IHEuZmVhdHVyZTtcbiAgICAgICAgICAgIGxldCBnZW9tZXRyeSA9IGZlYXR1cmUuZ2VvbWV0cnk7XG5cbiAgICAgICAgICAgIGxldCBmZWF0dXJlX2xhYmVscyA9IHRoaXMuYnVpbGRMYWJlbHMoc3R5bGUuc2l6ZSwgZ2VvbWV0cnksIHN0eWxlKTtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZmVhdHVyZV9sYWJlbHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBsZXQgbGFiZWwgPSBmZWF0dXJlX2xhYmVsc1tpXTtcbiAgICAgICAgICAgICAgICBsZXQgcG9pbnRfb2JqID0ge1xuICAgICAgICAgICAgICAgICAgICBmZWF0dXJlLFxuICAgICAgICAgICAgICAgICAgICBkcmF3OiBxLmRyYXcsXG4gICAgICAgICAgICAgICAgICAgIGNvbnRleHQ6IHEuY29udGV4dCxcbiAgICAgICAgICAgICAgICAgICAgc3R5bGUsXG4gICAgICAgICAgICAgICAgICAgIGxhYmVsXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBwb2ludF9vYmpzLnB1c2gocG9pbnRfb2JqKTtcblxuICAgICAgICAgICAgICAgIGlmIChxLnRleHRfZmVhdHVyZSkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgdGV4dF9vYmogPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBmZWF0dXJlLFxuICAgICAgICAgICAgICAgICAgICAgICAgZHJhdzogcS50ZXh0X2ZlYXR1cmUuZHJhdyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQ6IHEuY29udGV4dCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRleHQ6IHEudGV4dF9mZWF0dXJlLnRleHQsXG4gICAgICAgICAgICAgICAgICAgICAgICB0ZXh0X3NldHRpbmdzX2tleTogcS50ZXh0X2ZlYXR1cmUudGV4dF9zZXR0aW5nc19rZXksXG4gICAgICAgICAgICAgICAgICAgICAgICBsYXlvdXQ6IHEudGV4dF9mZWF0dXJlLmxheW91dCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHBvaW50X2xhYmVsOiBsYWJlbCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGxpbmtlZDogcG9pbnRfb2JqICAgLy8gbGluayBzbyB0ZXh0IG9ubHkgcmVuZGVycyB3aGVuIHBhcmVudCBwb2ludCBpcyBwbGFjZWRcbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgdGV4dF9vYmpzLnB1c2godGV4dF9vYmopO1xuXG4gICAgICAgICAgICAgICAgICAgIC8vIFVubGVzcyB0ZXh0IGZlYXR1cmUgaXMgb3B0aW9uYWwsIGNyZWF0ZSBhIHR3by13YXkgbGluayBzbyB0aGF0IHBhcmVudFxuICAgICAgICAgICAgICAgICAgICAvLyBwb2ludCB3aWxsIG9ubHkgcmVuZGVyIHdoZW4gdGV4dCBpcyBhbHNvIHBsYWNlZFxuICAgICAgICAgICAgICAgICAgICBpZiAoIXEuZHJhdy50ZXh0Lm9wdGlvbmFsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwb2ludF9vYmoubGlua2VkID0gdGV4dF9vYmo7IC8vIHR3by13YXkgbGlua1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICAvLyBDb2xsaWRlIGJvdGggcG9pbnRzIGFuZCB0ZXh0LCB0aGVuIGJ1aWxkIGZlYXR1cmVzXG4gICAgICAgIHJldHVybiBQcm9taXNlLlxuICAgICAgICAgICAgYWxsKFtcbiAgICAgICAgICAgICAgICAvLyBQb2ludHNcbiAgICAgICAgICAgICAgICBDb2xsaXNpb24uY29sbGlkZShwb2ludF9vYmpzLCB0aGlzLmNvbGxpc2lvbl9ncm91cF9wb2ludHMsIHRpbGUua2V5KS50aGVuKHBvaW50X29ianMgPT4ge1xuICAgICAgICAgICAgICAgICAgICBwb2ludF9vYmpzLmZvckVhY2gocSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmZlYXR1cmVfc3R5bGUgPSBxLnN0eWxlO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5mZWF0dXJlX3N0eWxlLmxhYmVsID0gcS5sYWJlbDtcbiAgICAgICAgICAgICAgICAgICAgICAgIFN0eWxlLmFkZEZlYXR1cmUuY2FsbCh0aGlzLCBxLmZlYXR1cmUsIHEuZHJhdywgcS5jb250ZXh0KTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgLy8gTGFiZWxzXG4gICAgICAgICAgICAgICAgdGhpcy5wcmVwYXJlVGV4dExhYmVscyh0aWxlLCB0aGlzLmNvbGxpc2lvbl9ncm91cF90ZXh0LCB0ZXh0X29ianMpLlxuICAgICAgICAgICAgICAgICAgICB0aGVuKGxhYmVscyA9PiB0aGlzLmNvbGxpZGVBbmRSZW5kZXJUZXh0TGFiZWxzKHRpbGUsIHRoaXMuY29sbGlzaW9uX2dyb3VwX3RleHQsIGxhYmVscykpXG4gICAgICAgICAgICBdKS50aGVuKChbLCB7IGxhYmVscywgdGV4dHMsIHRleHR1cmUgfV0pID0+IHtcbiAgICAgICAgICAgICAgICAvLyBQcm9jZXNzIGxhYmVsc1xuICAgICAgICAgICAgICAgIGlmIChsYWJlbHMgJiYgdGV4dHMpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gQnVpbGQgcXVldWVkIGZlYXR1cmVzXG4gICAgICAgICAgICAgICAgICAgIGxhYmVscy5mb3JFYWNoKHEgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHRleHRfc2V0dGluZ3Nfa2V5ID0gcS50ZXh0X3NldHRpbmdzX2tleTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCB0ZXh0X2luZm8gPSB0ZXh0c1t0ZXh0X3NldHRpbmdzX2tleV0gJiYgdGV4dHNbdGV4dF9zZXR0aW5nc19rZXldW3EudGV4dF07XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNldHVwIHN0eWxpbmcgb2JqZWN0IGV4cGVjdGVkIGJ5IFN0eWxlIGNsYXNzXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgc3R5bGUgPSB0aGlzLmZlYXR1cmVfc3R5bGU7XG4gICAgICAgICAgICAgICAgICAgICAgICBzdHlsZS5sYWJlbCA9IHEubGFiZWw7XG4gICAgICAgICAgICAgICAgICAgICAgICBzdHlsZS5zaXplID0gdGV4dF9pbmZvLnNpemUubG9naWNhbF9zaXplO1xuICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGUudGV4Y29vcmRzID0gdGV4dF9pbmZvLmFsaWduW3EubGFiZWwuYWxpZ25dLnRleGNvb3JkcztcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlLmFuZ2xlID0gcS5sYWJlbC5hbmdsZSB8fCAwO1xuICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGUuc2FtcGxlciA9IDE7IC8vIG5vbi0wID0gbGFiZWxzXG5cbiAgICAgICAgICAgICAgICAgICAgICAgIFN0eWxlLmFkZEZlYXR1cmUuY2FsbCh0aGlzLCBxLmZlYXR1cmUsIHEuZHJhdywgcS5jb250ZXh0KTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMuZnJlZVRleHQodGlsZSk7XG5cbiAgICAgICAgICAgICAgICAvLyBGaW5pc2ggdGlsZSBtZXNoXG4gICAgICAgICAgICAgICAgcmV0dXJuIFN0eWxlLmVuZERhdGEuY2FsbCh0aGlzLCB0aWxlKS50aGVuKHRpbGVfZGF0YSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIC8vIEF0dGFjaCB0aWxlLXNwZWNpZmljIGxhYmVsIGF0bGFzIHRvIG1lc2ggYXMgYSB0ZXh0dXJlIHVuaWZvcm1cbiAgICAgICAgICAgICAgICAgICAgaWYgKHRleHR1cmUgJiYgdGlsZV9kYXRhKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aWxlX2RhdGEudW5pZm9ybXMgPSB0aWxlX2RhdGEudW5pZm9ybXMgfHwge307XG4gICAgICAgICAgICAgICAgICAgICAgICB0aWxlX2RhdGEudGV4dHVyZXMgPSB0aWxlX2RhdGEudGV4dHVyZXMgfHwgW107XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHRpbGVfZGF0YS51bmlmb3Jtcy51X2xhYmVsX3RleHR1cmUgPSB0ZXh0dXJlO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGlsZV9kYXRhLnRleHR1cmVzLnB1c2godGV4dHVyZSk7IC8vIGFzc2lnbiB0ZXh0dXJlIG93bmVyc2hpcCB0byB0aWxlXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRpbGVfZGF0YTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pO1xuICAgIH0sXG5cbiAgICBfcHJlcHJvY2VzcyAoZHJhdykge1xuICAgICAgICBkcmF3LmNvbG9yID0gU3R5bGVQYXJzZXIuY3JlYXRlQ29sb3JQcm9wZXJ0eUNhY2hlKGRyYXcuY29sb3IpO1xuICAgICAgICBkcmF3LnogPSBTdHlsZVBhcnNlci5jcmVhdGVQcm9wZXJ0eUNhY2hlKGRyYXcueiwgU3R5bGVQYXJzZXIucGFyc2VVbml0cyk7XG5cbiAgICAgICAgLy8gU2l6ZSAoMWQgdmFsdWUgb3IgMmQgYXJyYXkpXG4gICAgICAgIGRyYXcuc2l6ZSA9IFN0eWxlUGFyc2VyLmNyZWF0ZVByb3BlcnR5Q2FjaGUoZHJhdy5zaXplLCB2ID0+IEFycmF5LmlzQXJyYXkodikgPyB2Lm1hcChwYXJzZUZsb2F0KSA6IHBhcnNlRmxvYXQodikpO1xuXG4gICAgICAgIC8vIE9mZnNldCAoMmQgYXJyYXkpXG4gICAgICAgIGRyYXcub2Zmc2V0ID0gU3R5bGVQYXJzZXIuY3JlYXRlUHJvcGVydHlDYWNoZShkcmF3Lm9mZnNldCwgdiA9PiAoQXJyYXkuaXNBcnJheSh2KSAmJiB2Lm1hcChwYXJzZUZsb2F0KSkgfHwgMCk7XG5cbiAgICAgICAgLy8gQnVmZmVyICgxZCB2YWx1ZSBvciAyZCBhcnJheSwgZXhwYW5kIDFkIHRvIDJkKVxuICAgICAgICBkcmF3LmJ1ZmZlciA9IFN0eWxlUGFyc2VyLmNyZWF0ZVByb3BlcnR5Q2FjaGUoZHJhdy5idWZmZXIsIHYgPT4gKEFycmF5LmlzQXJyYXkodikgPyB2IDogW3YsIHZdKS5tYXAocGFyc2VGbG9hdCkgfHwgMCk7XG5cbiAgICAgICAgLy8gUmVwZWF0IHJ1bGVzIC0gbm8gcmVwZWF0IGxpbWl0YXRpb24gZm9yIHBvaW50cyBieSBkZWZhdWx0XG4gICAgICAgIGRyYXcucmVwZWF0X2Rpc3RhbmNlID0gU3R5bGVQYXJzZXIuY3JlYXRlUHJvcGVydHlDYWNoZShkcmF3LnJlcGVhdF9kaXN0YW5jZSwgcGFyc2VGbG9hdCk7XG5cbiAgICAgICAgLy8gUGxhY2VtZW50IHN0cmF0ZWdpZXNcbiAgICAgICAgZHJhdy5wbGFjZW1lbnQgPSBQTEFDRU1FTlRbZHJhdy5wbGFjZW1lbnQgJiYgZHJhdy5wbGFjZW1lbnQudG9VcHBlckNhc2UoKV07XG4gICAgICAgIGlmIChkcmF3LnBsYWNlbWVudCA9PSBudWxsKSB7XG4gICAgICAgICAgICBkcmF3LnBsYWNlbWVudCA9IFBMQUNFTUVOVC5WRVJURVg7XG4gICAgICAgIH1cblxuICAgICAgICBkcmF3LnBsYWNlbWVudF9zcGFjaW5nID0gZHJhdy5wbGFjZW1lbnRfc3BhY2luZyAhPSBudWxsID8gZHJhdy5wbGFjZW1lbnRfc3BhY2luZyA6IDgwOyAvLyBkZWZhdWx0IHNwYWNpbmdcbiAgICAgICAgZHJhdy5wbGFjZW1lbnRfc3BhY2luZyA9IFN0eWxlUGFyc2VyLmNyZWF0ZVByb3BlcnR5Q2FjaGUoZHJhdy5wbGFjZW1lbnRfc3BhY2luZywgcGFyc2VGbG9hdCk7XG5cbiAgICAgICAgZHJhdy5wbGFjZW1lbnRfbWluX2xlbmd0aF9yYXRpbyA9IGRyYXcucGxhY2VtZW50X21pbl9sZW5ndGhfcmF0aW8gIT0gbnVsbCA/IGRyYXcucGxhY2VtZW50X21pbl9sZW5ndGhfcmF0aW8gOiAxO1xuICAgICAgICBkcmF3LnBsYWNlbWVudF9taW5fbGVuZ3RoX3JhdGlvID0gU3R5bGVQYXJzZXIuY3JlYXRlUHJvcGVydHlDYWNoZShkcmF3LnBsYWNlbWVudF9taW5fbGVuZ3RoX3JhdGlvLCBwYXJzZUZsb2F0KTtcblxuICAgICAgICBpZiAodHlwZW9mIGRyYXcuYW5nbGUgPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgICBkcmF3LmFuZ2xlID0gZHJhdy5hbmdsZSAqIE1hdGguUEkgLyAxODA7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBkcmF3LmFuZ2xlID0gZHJhdy5hbmdsZSB8fCAwOyAvLyBhbmdsZSBjYW4gYmUgYSBzdHJpbmcgbGlrZSBcImF1dG9cIiAodXNlIGFuZ2xlIG9mIGdlb21ldHJ5KVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gT3B0aW9uYWwgdGV4dCBzdHlsaW5nXG4gICAgICAgIGRyYXcudGV4dCA9IHRoaXMucHJlcHJvY2Vzc1RleHQoZHJhdy50ZXh0KTsgLy8gd2lsbCByZXR1cm4gbnVsbCBpZiB2YWxpZCB0ZXh0IHN0eWxpbmcgd2Fzbid0IHByb3ZpZGVkXG4gICAgICAgIGlmIChkcmF3LnRleHQpIHtcbiAgICAgICAgICAgIGRyYXcudGV4dC5rZXkgPSBkcmF3LmtleTsgLy8gY29weSBsYXllciBrZXkgZm9yIHVzZSBhcyBsYWJlbCByZXBlYXQgZ3JvdXBcbiAgICAgICAgICAgIGRyYXcudGV4dC5yZXBlYXRfZ3JvdXAgPSBkcmF3LnRleHQucmVwZWF0X2dyb3VwIHx8IGRyYXcucmVwZWF0X2dyb3VwOyAvLyBpbmhlcml0IHJlcGVhdCBncm91cCBieSBkZWZhdWx0XG4gICAgICAgICAgICBkcmF3LnRleHQuYW5jaG9yID0gZHJhdy50ZXh0LmFuY2hvciB8fCB0aGlzLmRlZmF1bHRfYW5jaG9yO1xuICAgICAgICAgICAgZHJhdy50ZXh0Lm9wdGlvbmFsID0gKHR5cGVvZiBkcmF3LnRleHQub3B0aW9uYWwgPT09ICdib29sZWFuJykgPyBkcmF3LnRleHQub3B0aW9uYWwgOiBmYWxzZTsgLy8gZGVmYXVsdCB0ZXh0IHRvIHJlcXVpcmVkXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZHJhdztcbiAgICB9LFxuXG4gICAgLy8gRGVmYXVsdCB0byB0cnlpbmcgYWxsIGFuY2hvciBwbGFjZW1lbnRzXG4gICAgZGVmYXVsdF9hbmNob3I6IFsnYm90dG9tJywgJ3RvcCcsICdyaWdodCcsICdsZWZ0J10sXG5cbiAgICAvLyBDb21wdXRlIGxhYmVsIGxheW91dC1yZWxhdGVkIHByb3BlcnRpZXNcbiAgICBjb21wdXRlTGF5b3V0ICh0YXJnZXQsIGZlYXR1cmUsIGRyYXcsIGNvbnRleHQsIHRpbGUpIHtcbiAgICAgICAgbGV0IGxheW91dCA9IHRhcmdldCB8fCB7fTtcbiAgICAgICAgbGF5b3V0LmlkID0gZmVhdHVyZTtcbiAgICAgICAgbGF5b3V0LnVuaXRzX3Blcl9waXhlbCA9IHRpbGUudW5pdHNfcGVyX3BpeGVsIHx8IDE7XG5cbiAgICAgICAgLy8gY29sbGlzaW9uIGZsYWdcbiAgICAgICAgbGF5b3V0LmNvbGxpZGUgPSAoZHJhdy5jb2xsaWRlID09PSBmYWxzZSkgPyBmYWxzZSA6IHRydWU7XG5cbiAgICAgICAgLy8gdGlsZSBib3VuZGFyeSBoYW5kbGluZ1xuICAgICAgICBsYXlvdXQuY3VsbF9mcm9tX3RpbGUgPSAoZHJhdy5jdWxsX2Zyb21fdGlsZSAhPSBudWxsKSA/IGRyYXcuY3VsbF9mcm9tX3RpbGUgOiBmYWxzZTtcblxuICAgICAgICAvLyBwb2ludHMgc2hvdWxkIG5vdCBtb3ZlIGludG8gdGlsZSBpZiBvdmVyIHRpbGUgYm91bmRhcnlcbiAgICAgICAgbGF5b3V0Lm1vdmVfaW50b190aWxlID0gZmFsc2U7XG5cbiAgICAgICAgLy8gbGFiZWwgYW5jaG9ycyAocG9pbnQgbGFiZWxzIG9ubHkpXG4gICAgICAgIC8vIGxhYmVsIHBvc2l0aW9uIHdpbGwgYmUgYWRqdXN0ZWQgaW4gdGhlIGdpdmVuIGRpcmVjdGlvbiwgcmVsYXRpdmUgdG8gaXRzIG9yaWdpbmFsIHBvaW50XG4gICAgICAgIC8vIG9uZSBvZjogbGVmdCwgcmlnaHQsIHRvcCwgYm90dG9tLCB0b3AtbGVmdCwgdG9wLXJpZ2h0LCBib3R0b20tbGVmdCwgYm90dG9tLXJpZ2h0XG4gICAgICAgIGxheW91dC5hbmNob3IgPSBkcmF3LmFuY2hvcjtcblxuICAgICAgICAvLyBsYWJlbCBvZmZzZXQgYW5kIGJ1ZmZlciBpbiBwaXhlbCAoYXBwbGllZCBpbiBzY3JlZW4gc3BhY2UpXG4gICAgICAgIGxheW91dC5vZmZzZXQgPSBTdHlsZVBhcnNlci5ldmFsQ2FjaGVkUHJvcGVydHkoZHJhdy5vZmZzZXQsIGNvbnRleHQpIHx8IFN0eWxlUGFyc2VyLnplcm9QYWlyO1xuICAgICAgICBsYXlvdXQuYnVmZmVyID0gU3R5bGVQYXJzZXIuZXZhbENhY2hlZFByb3BlcnR5KGRyYXcuYnVmZmVyLCBjb250ZXh0KSB8fCBTdHlsZVBhcnNlci56ZXJvUGFpcjtcblxuICAgICAgICAvLyByZXBlYXQgcnVsZXNcbiAgICAgICAgbGF5b3V0LnJlcGVhdF9kaXN0YW5jZSA9IFN0eWxlUGFyc2VyLmV2YWxDYWNoZWRQcm9wZXJ0eShkcmF3LnJlcGVhdF9kaXN0YW5jZSwgY29udGV4dCk7XG4gICAgICAgIGlmIChsYXlvdXQucmVwZWF0X2Rpc3RhbmNlKSB7XG4gICAgICAgICAgICBsYXlvdXQucmVwZWF0X2Rpc3RhbmNlICo9IGxheW91dC51bml0c19wZXJfcGl4ZWw7XG5cbiAgICAgICAgICAgIGlmICh0eXBlb2YgZHJhdy5yZXBlYXRfZ3JvdXAgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICBsYXlvdXQucmVwZWF0X2dyb3VwID0gZHJhdy5yZXBlYXRfZ3JvdXAoY29udGV4dCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmICh0eXBlb2YgZHJhdy5yZXBlYXRfZ3JvdXAgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgbGF5b3V0LnJlcGVhdF9ncm91cCA9IGRyYXcucmVwZWF0X2dyb3VwO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgbGF5b3V0LnJlcGVhdF9ncm91cCA9IGRyYXcua2V5OyAvLyBkZWZhdWx0IHRvIHVuaXF1ZSBzZXQgb2YgbWF0Y2hpbmcgbGF5ZXJzXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBsYWJlbCBwcmlvcml0eSAobG93ZXIgaXMgaGlnaGVyKVxuICAgICAgICBsZXQgcHJpb3JpdHkgPSBkcmF3LnByaW9yaXR5O1xuICAgICAgICBpZiAocHJpb3JpdHkgIT0gbnVsbCkge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBwcmlvcml0eSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgIHByaW9yaXR5ID0gcHJpb3JpdHkoY29udGV4dCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBwcmlvcml0eSA9IC0xID4+PiAwOyAvLyBkZWZhdWx0IHRvIG1heCBwcmlvcml0eSB2YWx1ZSBpZiBub25lIHNldFxuICAgICAgICB9XG4gICAgICAgIGxheW91dC5wcmlvcml0eSA9IHByaW9yaXR5O1xuXG4gICAgICAgIHJldHVybiBsYXlvdXQ7XG4gICAgfSxcblxuICAgIC8vIEltcGxlbWVudHMgbGFiZWwgYnVpbGRpbmcgZm9yIFRleHRMYWJlbHMgbWl4aW5cbiAgICBidWlsZFRleHRMYWJlbHMgKHRpbGVfa2V5LCBmZWF0dXJlX3F1ZXVlKSB7XG4gICAgICAgIGxldCBsYWJlbHMgPSBbXTtcbiAgICAgICAgZm9yIChsZXQgZj0wOyBmIDwgZmVhdHVyZV9xdWV1ZS5sZW5ndGg7IGYrKykge1xuICAgICAgICAgICAgbGV0IGZxID0gZmVhdHVyZV9xdWV1ZVtmXTtcbiAgICAgICAgICAgIGxldCB0ZXh0X2luZm8gPSB0aGlzLnRleHRzW3RpbGVfa2V5XVtmcS50ZXh0X3NldHRpbmdzX2tleV1bZnEudGV4dF07XG4gICAgICAgICAgICBsZXQgc2l6ZSA9IHRleHRfaW5mby5zaXplLmNvbGxpc2lvbl9zaXplO1xuICAgICAgICAgICAgZnEubGFiZWwgPSBuZXcgTGFiZWxQb2ludChmcS5wb2ludF9sYWJlbC5wb3NpdGlvbiwgc2l6ZSwgZnEubGF5b3V0KTtcbiAgICAgICAgICAgIGxhYmVscy5wdXNoKGZxKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbGFiZWxzO1xuICAgIH0sXG5cbiAgICAvLyBCdWlsZHMgb25lIG9yIG1vcmUgcG9pbnQgbGFiZWxzIGZvciBhIGdlb21ldHJ5XG4gICAgYnVpbGRMYWJlbHMgKHNpemUsIGdlb21ldHJ5LCBvcHRpb25zKSB7XG4gICAgICAgIGxldCBsYWJlbHMgPSBbXTtcblxuICAgICAgICBpZiAoZ2VvbWV0cnkudHlwZSA9PT0gXCJQb2ludFwiKSB7XG4gICAgICAgICAgICBsYWJlbHMucHVzaChuZXcgTGFiZWxQb2ludChnZW9tZXRyeS5jb29yZGluYXRlcywgc2l6ZSwgb3B0aW9ucykpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGdlb21ldHJ5LnR5cGUgPT09IFwiTXVsdGlQb2ludFwiKSB7XG4gICAgICAgICAgICBsZXQgcG9pbnRzID0gZ2VvbWV0cnkuY29vcmRpbmF0ZXM7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBvaW50cy5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgICAgIGxldCBwb2ludCA9IHBvaW50c1tpXTtcbiAgICAgICAgICAgICAgICBsYWJlbHMucHVzaChuZXcgTGFiZWxQb2ludChwb2ludCwgc2l6ZSwgb3B0aW9ucykpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGdlb21ldHJ5LnR5cGUgPT09IFwiTGluZVN0cmluZ1wiKSB7XG4gICAgICAgICAgICBsZXQgbGluZSA9IGdlb21ldHJ5LmNvb3JkaW5hdGVzO1xuICAgICAgICAgICAgbGV0IHBvaW50X2xhYmVscyA9IHBsYWNlUG9pbnRzT25MaW5lKGxpbmUsIHNpemUsIG9wdGlvbnMpO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwb2ludF9sYWJlbHMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICAgICAgICBsYWJlbHMucHVzaChwb2ludF9sYWJlbHNbaV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGdlb21ldHJ5LnR5cGUgPT09IFwiTXVsdGlMaW5lU3RyaW5nXCIpIHtcbiAgICAgICAgICAgIGxldCBsaW5lcyA9IGdlb21ldHJ5LmNvb3JkaW5hdGVzO1xuICAgICAgICAgICAgZm9yIChsZXQgbG4gPSAwOyBsbiA8IGxpbmVzLmxlbmd0aDsgbG4rKykge1xuICAgICAgICAgICAgICAgIGxldCBsaW5lID0gbGluZXNbbG5dO1xuICAgICAgICAgICAgICAgIGxldCBwb2ludF9sYWJlbHMgPSBwbGFjZVBvaW50c09uTGluZShsaW5lLCBzaXplLCBvcHRpb25zKTtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBvaW50X2xhYmVscy5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgICAgICAgICBsYWJlbHMucHVzaChwb2ludF9sYWJlbHNbaV0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChnZW9tZXRyeS50eXBlID09PSBcIlBvbHlnb25cIikge1xuICAgICAgICAgICAgLy8gUG9pbnQgYXQgcG9seWdvbiBjZW50cm9pZCAob2Ygb3V0ZXIgcmluZylcbiAgICAgICAgICAgIGlmIChvcHRpb25zLnBsYWNlbWVudCA9PT0gUExBQ0VNRU5ULkNFTlRST0lEKSB7XG4gICAgICAgICAgICAgICAgbGV0IGNlbnRyb2lkID0gR2VvLmNlbnRyb2lkKGdlb21ldHJ5LmNvb3JkaW5hdGVzKTtcbiAgICAgICAgICAgICAgICBsYWJlbHMucHVzaChuZXcgTGFiZWxQb2ludChjZW50cm9pZCwgc2l6ZSwgb3B0aW9ucykpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gUG9pbnQgYXQgZWFjaCBwb2x5Z29uIHZlcnRleCAoYWxsIHJpbmdzKVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgbGV0IHJpbmdzID0gZ2VvbWV0cnkuY29vcmRpbmF0ZXM7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgbG4gPSAwOyBsbiA8IHJpbmdzLmxlbmd0aDsgbG4rKykge1xuICAgICAgICAgICAgICAgICAgICBsZXQgcG9pbnRfbGFiZWxzID0gcGxhY2VQb2ludHNPbkxpbmUocmluZ3NbbG5dLCBzaXplLCBvcHRpb25zKTtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwb2ludF9sYWJlbHMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVscy5wdXNoKHBvaW50X2xhYmVsc1tpXSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoZ2VvbWV0cnkudHlwZSA9PT0gXCJNdWx0aVBvbHlnb25cIikge1xuICAgICAgICAgICAgaWYgKG9wdGlvbnMucGxhY2VtZW50ID09PSBQTEFDRU1FTlQuQ0VOVFJPSUQpIHtcbiAgICAgICAgICAgICAgICBsZXQgY2VudHJvaWQgPSBHZW8ubXVsdGlDZW50cm9pZChnZW9tZXRyeS5jb29yZGluYXRlcyk7XG4gICAgICAgICAgICAgICAgbGFiZWxzLnB1c2gobmV3IExhYmVsUG9pbnQoY2VudHJvaWQsIHNpemUsIG9wdGlvbnMpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGxldCBwb2x5cyA9IGdlb21ldHJ5LmNvb3JkaW5hdGVzO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IHAgPSAwOyBwIDwgcG9seXMubGVuZ3RoOyBwKyspIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHJpbmdzID0gcG9seXNbcF07XG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGxuID0gMDsgbG4gPCByaW5ncy5sZW5ndGg7IGxuKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBwb2ludF9sYWJlbHMgPSBwbGFjZVBvaW50c09uTGluZShyaW5nc1tsbl0sIHNpemUsIG9wdGlvbnMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwb2ludF9sYWJlbHMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbHMucHVzaChwb2ludF9sYWJlbHNbaV0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGxhYmVscztcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogQSBcInRlbXBsYXRlXCIgdGhhdCBzZXRzIGNvbnN0YW50IGF0dGlidXRlcyBmb3IgZWFjaCB2ZXJ0ZXgsIHdoaWNoIGlzIHRoZW4gbW9kaWZpZWQgcGVyIHZlcnRleCBvciBwZXIgZmVhdHVyZS5cbiAgICAgKiBBIHBsYWluIEpTIGFycmF5IG1hdGNoaW5nIHRoZSBvcmRlciBvZiB0aGUgdmVydGV4IGxheW91dC5cbiAgICAgKi9cbiAgICBtYWtlVmVydGV4VGVtcGxhdGUoc3R5bGUpIHtcbiAgICAgICAgbGV0IGNvbG9yID0gc3R5bGUuY29sb3IgfHwgU3R5bGVQYXJzZXIuZGVmYXVsdHMuY29sb3I7XG5cbiAgICAgICAgLy8gcG9zaXRpb24gLSB4ICYgeSBjb29yZHMgd2lsbCBiZSBmaWxsZWQgaW4gcGVyLXZlcnRleCBiZWxvd1xuICAgICAgICB0aGlzLmZpbGxWZXJ0ZXhUZW1wbGF0ZSgnYV9wb3NpdGlvbicsIDAsIHsgc2l6ZTogMiB9KTtcbiAgICAgICAgdGhpcy5maWxsVmVydGV4VGVtcGxhdGUoJ2FfcG9zaXRpb24nLCBzdHlsZS56IHx8IDAsIHsgc2l6ZTogMSwgb2Zmc2V0OiAyIH0pO1xuICAgICAgICAvLyBsYXllciBvcmRlciAtIHcgY29vcmQgb2YgJ3Bvc2l0aW9uJyBhdHRyaWJ1dGUgKGZvciBwYWNraW5nIGVmZmljaWVuY3kpXG4gICAgICAgIHRoaXMuZmlsbFZlcnRleFRlbXBsYXRlKCdhX3Bvc2l0aW9uJywgdGhpcy5zY2FsZU9yZGVyKHN0eWxlLm9yZGVyKSwgeyBzaXplOiAxLCBvZmZzZXQ6IDMgfSk7XG5cbiAgICAgICAgLy8gc2NhbGluZyB2ZWN0b3IgLSAoeCwgeSkgY29tcG9uZW50cyBwZXIgcGl4ZWwsIHogPSBhbmdsZSwgdyA9IHNjYWxpbmcgZmFjdG9yXG4gICAgICAgIHRoaXMuZmlsbFZlcnRleFRlbXBsYXRlKCdhX3NoYXBlJywgMCwgeyBzaXplOiA0IH0pO1xuXG4gICAgICAgIC8vIHRleHR1cmUgY29vcmRzXG4gICAgICAgIHRoaXMuZmlsbFZlcnRleFRlbXBsYXRlKCdhX3RleGNvb3JkJywgMCwgeyBzaXplOiAyIH0pO1xuXG4gICAgICAgIC8vIG9mZnNldHNcbiAgICAgICAgdGhpcy5maWxsVmVydGV4VGVtcGxhdGUoJ2Ffb2Zmc2V0JywgMCwgeyBzaXplOiAyIH0pO1xuXG4gICAgICAgIC8vIGNvbG9yXG4gICAgICAgIHRoaXMuZmlsbFZlcnRleFRlbXBsYXRlKCdhX2NvbG9yJywgVmVjdG9yLm11bHQoY29sb3IsIDI1NSksIHsgc2l6ZTogNCB9KTtcblxuICAgICAgICAvLyBzZWxlY3Rpb24gY29sb3JcbiAgICAgICAgaWYgKHRoaXMuc2VsZWN0aW9uKSB7XG4gICAgICAgICAgICB0aGlzLmZpbGxWZXJ0ZXhUZW1wbGF0ZSgnYV9zZWxlY3Rpb25fY29sb3InLCBWZWN0b3IubXVsdChzdHlsZS5zZWxlY3Rpb25fY29sb3IsIDI1NSksIHsgc2l6ZTogNCB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLnZlcnRleF90ZW1wbGF0ZTtcbiAgICB9LFxuXG4gICAgYnVpbGRRdWFkKHBvaW50cywgc2l6ZSwgYW5nbGUsIHNhbXBsZXIsIG9mZnNldCwgdGV4Y29vcmRfc2NhbGUsIHZlcnRleF9kYXRhLCB2ZXJ0ZXhfdGVtcGxhdGUpIHtcbiAgICAgICAgYnVpbGRRdWFkc0ZvclBvaW50cyhcbiAgICAgICAgICAgIHBvaW50cyxcbiAgICAgICAgICAgIHZlcnRleF9kYXRhLFxuICAgICAgICAgICAgdmVydGV4X3RlbXBsYXRlLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHRleGNvb3JkX2luZGV4OiB0aGlzLnZlcnRleF9sYXlvdXQuaW5kZXguYV90ZXhjb29yZCxcbiAgICAgICAgICAgICAgICBwb3NpdGlvbl9pbmRleDogdGhpcy52ZXJ0ZXhfbGF5b3V0LmluZGV4LmFfcG9zaXRpb24sXG4gICAgICAgICAgICAgICAgc2hhcGVfaW5kZXg6IHRoaXMudmVydGV4X2xheW91dC5pbmRleC5hX3NoYXBlLFxuICAgICAgICAgICAgICAgIG9mZnNldF9pbmRleDogdGhpcy52ZXJ0ZXhfbGF5b3V0LmluZGV4LmFfb2Zmc2V0XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHF1YWQ6IHNpemUsXG4gICAgICAgICAgICAgICAgcXVhZF9ub3JtYWxpemU6IDI1NiwgICAgLy8gdmFsdWVzIGhhdmUgYW4gOC1iaXQgZnJhY3Rpb25cbiAgICAgICAgICAgICAgICBvZmZzZXQsXG4gICAgICAgICAgICAgICAgYW5nbGU6IGFuZ2xlICogNDA5NiwgICAgLy8gdmFsdWVzIGhhdmUgYSAxMi1iaXQgZnJhY3Rpb25cbiAgICAgICAgICAgICAgICBzaGFwZV93OiBzYW1wbGVyLFxuICAgICAgICAgICAgICAgIHRleGNvb3JkX3NjYWxlLFxuICAgICAgICAgICAgICAgIHRleGNvb3JkX25vcm1hbGl6ZTogNjU1MzVcbiAgICAgICAgICAgIH1cbiAgICAgICAgKTtcbiAgICB9LFxuXG4gICAgLy8gQnVpbGQgcXVhZCBmb3IgcG9pbnQgc3ByaXRlXG4gICAgYnVpbGQgKHN0eWxlLCB2ZXJ0ZXhfZGF0YSkge1xuICAgICAgICBsZXQgbGFiZWwgPSBzdHlsZS5sYWJlbDtcbiAgICAgICAgaWYgKGxhYmVsLm51bV9zZWdtZW50cykge1xuICAgICAgICAgICAgdGhpcy5idWlsZEFydGljdWxhdGVkTGFiZWwobGFiZWwsIHN0eWxlLCB2ZXJ0ZXhfZGF0YSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmJ1aWxkTGFiZWwobGFiZWwsIHN0eWxlLCB2ZXJ0ZXhfZGF0YSk7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgYnVpbGRMYWJlbCAobGFiZWwsIHN0eWxlLCB2ZXJ0ZXhfZGF0YSkge1xuICAgICAgICBsZXQgdmVydGV4X3RlbXBsYXRlID0gdGhpcy5tYWtlVmVydGV4VGVtcGxhdGUoc3R5bGUpO1xuICAgICAgICBsZXQgYW5nbGUgPSBsYWJlbC5hbmdsZSB8fCBzdHlsZS5hbmdsZTtcblxuICAgICAgICB0aGlzLmJ1aWxkUXVhZChcbiAgICAgICAgICAgIFtsYWJlbC5wb3NpdGlvbl0sICAgICAgICAgICAgICAgLy8gcG9zaXRpb25cbiAgICAgICAgICAgIHN0eWxlLnNpemUsICAgICAgICAgICAgICAgICAgICAgLy8gc2l6ZSBpbiBwaXhlbHNcbiAgICAgICAgICAgIGFuZ2xlLCAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYW5nbGUgaW4gcmFkaWFuc1xuICAgICAgICAgICAgc3R5bGUuc2FtcGxlciwgICAgICAgICAgICAgICAgICAvLyB0ZXh0dXJlIHNhbXBsZXIgdG8gdXNlXG4gICAgICAgICAgICBsYWJlbC5vZmZzZXQsICAgICAgICAgICAgICAgICAgIC8vIG9mZnNldCBmcm9tIGNlbnRlciBpbiBwaXhlbHNcbiAgICAgICAgICAgIHN0eWxlLnRleGNvb3JkcywgICAgICAgICAgICAgICAgLy8gdGV4dHVyZSBVVnNcbiAgICAgICAgICAgIHZlcnRleF9kYXRhLCB2ZXJ0ZXhfdGVtcGxhdGUgICAgLy8gVkJPIGFuZCBkYXRhIGZvciBjdXJyZW50IHZlcnRleFxuICAgICAgICApO1xuICAgIH0sXG5cbiAgICBidWlsZEFydGljdWxhdGVkTGFiZWwgKGxhYmVsLCBzdHlsZSwgdmVydGV4X2RhdGEpIHtcbiAgICAgICAgbGV0IHZlcnRleF90ZW1wbGF0ZSA9IHRoaXMubWFrZVZlcnRleFRlbXBsYXRlKHN0eWxlKTtcblxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxhYmVsLm51bV9zZWdtZW50czsgaSsrKXtcbiAgICAgICAgICAgIGxldCBhbmdsZSA9IGxhYmVsLmFuZ2xlW2ldO1xuICAgICAgICAgICAgbGV0IHNpemUgPSBzdHlsZS5zaXplW2ldO1xuICAgICAgICAgICAgbGV0IG9mZnNldCA9IGxhYmVsLm9mZnNldHNbaV07XG4gICAgICAgICAgICBsZXQgdGV4Y29vcmQgPSBzdHlsZS50ZXhjb29yZHNbaV07XG5cbiAgICAgICAgICAgIHRoaXMuYnVpbGRRdWFkKFxuICAgICAgICAgICAgICAgIFtsYWJlbC5wb3NpdGlvbl0sICAgICAgICAgICAgICAgLy8gcG9zaXRpb25cbiAgICAgICAgICAgICAgICBzaXplLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNpemUgaW4gcGl4ZWxzXG4gICAgICAgICAgICAgICAgYW5nbGUsICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhbmdsZSBpbiBkZWdyZWVzXG4gICAgICAgICAgICAgICAgc3R5bGUuc2FtcGxlciwgICAgICAgICAgICAgICAgICAvLyB0ZXh0dXJlIHNhbXBsZXIgdG8gdXNlXG4gICAgICAgICAgICAgICAgb2Zmc2V0LCAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvZmZzZXQgZnJvbSBjZW50ZXIgaW4gcGl4ZWxzXG4gICAgICAgICAgICAgICAgdGV4Y29vcmQsICAgICAgICAgICAgICAgICAgICAgICAvLyB0ZXh0dXJlIFVWc1xuICAgICAgICAgICAgICAgIHZlcnRleF9kYXRhLCB2ZXJ0ZXhfdGVtcGxhdGUgICAgLy8gVkJPIGFuZCBkYXRhIGZvciBjdXJyZW50IHZlcnRleFxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvLyBPdmVycmlkZSB0byBwYXNzLXRocm91Z2ggdG8gZ2VuZXJpYyBwb2ludCBidWlsZGVyXG4gICAgYnVpbGRMaW5lcyAobGluZXMsIHN0eWxlLCB2ZXJ0ZXhfZGF0YSwgY29udGV4dCkge1xuICAgICAgICB0aGlzLmJ1aWxkKHN0eWxlLCB2ZXJ0ZXhfZGF0YSk7XG4gICAgfSxcblxuICAgIGJ1aWxkUG9pbnRzIChwb2ludHMsIHN0eWxlLCB2ZXJ0ZXhfZGF0YSwgY29udGV4dCkge1xuICAgICAgICB0aGlzLmJ1aWxkKHN0eWxlLCB2ZXJ0ZXhfZGF0YSk7XG4gICAgfSxcblxuICAgIGJ1aWxkUG9seWdvbnMgKHBvaW50cywgc3R5bGUsIHZlcnRleF9kYXRhLCBjb250ZXh0KSB7XG4gICAgICAgIHRoaXMuYnVpbGQoc3R5bGUsIHZlcnRleF9kYXRhKTtcbiAgICB9LFxuXG4gICAgbWFrZU1lc2ggKHZlcnRleF9kYXRhLCB2ZXJ0ZXhfZWxlbWVudHMsIG9wdGlvbnMgPSB7fSkge1xuICAgICAgICAvLyBBZGQgbGFiZWwgZmFkZSB0aW1lXG4gICAgICAgIG9wdGlvbnMgPSBPYmplY3QuYXNzaWduKHt9LCBvcHRpb25zLCB7IGZhZGVfaW5fdGltZTogdGhpcy5mYWRlX2luX3RpbWUgfSk7XG4gICAgICAgIHJldHVybiBTdHlsZS5tYWtlTWVzaC5jYWxsKHRoaXMsIHZlcnRleF9kYXRhLCB2ZXJ0ZXhfZWxlbWVudHMsIG9wdGlvbnMpO1xuICAgIH1cblxufSk7XG4iLCIvLyBQb2x5Z29uIHJlbmRlcmluZyBzdHlsZVxuXG5pbXBvcnQge1N0eWxlfSBmcm9tICcuLi9zdHlsZSc7XG5pbXBvcnQge1N0eWxlUGFyc2VyfSBmcm9tICcuLi9zdHlsZV9wYXJzZXInO1xuaW1wb3J0IGdsIGZyb20gJy4uLy4uL2dsL2NvbnN0YW50cyc7IC8vIHdlYiB3b3JrZXJzIGRvbid0IGhhdmUgYWNjZXNzIHRvIEdMIGNvbnRleHQsIHNvIGltcG9ydCBhbGwgR0wgY29uc3RhbnRzXG5pbXBvcnQgVmVydGV4TGF5b3V0IGZyb20gJy4uLy4uL2dsL3ZlcnRleF9sYXlvdXQnO1xuaW1wb3J0IHtidWlsZFBvbHlnb25zLCBidWlsZEV4dHJ1ZGVkUG9seWdvbnN9IGZyb20gJy4uLy4uL2J1aWxkZXJzL3BvbHlnb25zJztcbmltcG9ydCBHZW8gZnJvbSAnLi4vLi4vZ2VvJztcblxubGV0IGZzID0gcmVxdWlyZSgnZnMnKTtcbmNvbnN0IHNoYWRlclNyY19wb2x5Z29uc1ZlcnRleCA9IGZzLnJlYWRGaWxlU3luYyhfX2Rpcm5hbWUgKyAnL3BvbHlnb25zX3ZlcnRleC5nbHNsJywgJ3V0ZjgnKTtcbmNvbnN0IHNoYWRlclNyY19wb2x5Z29uc0ZyYWdtZW50ID0gZnMucmVhZEZpbGVTeW5jKF9fZGlybmFtZSArICcvcG9seWdvbnNfZnJhZ21lbnQuZ2xzbCcsICd1dGY4Jyk7XG5cbmV4cG9ydCB2YXIgUG9seWdvbnMgPSBPYmplY3QuY3JlYXRlKFN0eWxlKTtcblxuLy8gZXhwb3J0IHNoYWRlcnMgZm9yIHVzZSBpbiBsaW5lcy5qc1xuZXhwb3J0IHtcbiAgICBzaGFkZXJTcmNfcG9seWdvbnNWZXJ0ZXgsXG4gICAgc2hhZGVyU3JjX3BvbHlnb25zRnJhZ21lbnRcbn07XG5cbk9iamVjdC5hc3NpZ24oUG9seWdvbnMsIHtcbiAgICBuYW1lOiAncG9seWdvbnMnLFxuICAgIGJ1aWx0X2luOiB0cnVlLFxuICAgIHZlcnRleF9zaGFkZXJfc3JjOiBzaGFkZXJTcmNfcG9seWdvbnNWZXJ0ZXgsXG4gICAgZnJhZ21lbnRfc2hhZGVyX3NyYzogc2hhZGVyU3JjX3BvbHlnb25zRnJhZ21lbnQsXG5cbiAgICBpbml0KCkge1xuICAgICAgICBTdHlsZS5pbml0LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG5cbiAgICAgICAgLy8gQmFzaWMgYXR0cmlidXRlcywgb3RoZXJzIGNhbiBiZSBhZGRlZCAoc2VlIHRleHR1cmUgVVZzIGJlbG93KVxuICAgICAgICB2YXIgYXR0cmlicyA9IFtcbiAgICAgICAgICAgIHsgbmFtZTogJ2FfcG9zaXRpb24nLCBzaXplOiA0LCB0eXBlOiBnbC5TSE9SVCwgbm9ybWFsaXplZDogZmFsc2UgfSxcbiAgICAgICAgICAgIHsgbmFtZTogJ2Ffbm9ybWFsJywgc2l6ZTogMywgdHlwZTogZ2wuQllURSwgbm9ybWFsaXplZDogdHJ1ZSB9LCAvLyBnZXRzIHBhZGRlZCB0byA0LWJ5dGVzXG4gICAgICAgICAgICB7IG5hbWU6ICdhX2NvbG9yJywgc2l6ZTogNCwgdHlwZTogZ2wuVU5TSUdORURfQllURSwgbm9ybWFsaXplZDogdHJ1ZSB9XG4gICAgICAgIF07XG5cbiAgICAgICAgLy8gVGVsbCB0aGUgc2hhZGVyIHdlIGhhdmUgYSBub3JtYWwgYW5kIG9yZGVyIGF0dHJpYnV0ZXNcbiAgICAgICAgdGhpcy5kZWZpbmVzLlRBTkdSQU1fTk9STUFMX0FUVFJJQlVURSA9IHRydWU7XG4gICAgICAgIHRoaXMuZGVmaW5lcy5UQU5HUkFNX0xBWUVSX09SREVSID0gdHJ1ZTtcblxuICAgICAgICAvLyBGZWF0dXJlIHNlbGVjdGlvblxuICAgICAgICB0aGlzLnNlbGVjdGlvbiA9IHRydWU7XG4gICAgICAgIGF0dHJpYnMucHVzaCh7IG5hbWU6ICdhX3NlbGVjdGlvbl9jb2xvcicsIHNpemU6IDQsIHR5cGU6IGdsLlVOU0lHTkVEX0JZVEUsIG5vcm1hbGl6ZWQ6IHRydWUgfSk7XG5cbiAgICAgICAgLy8gT3B0aW9uYWwgdGV4dHVyZSBVVnNcbiAgICAgICAgaWYgKHRoaXMudGV4Y29vcmRzKSB7XG4gICAgICAgICAgICB0aGlzLmRlZmluZXMuVEFOR1JBTV9URVhUVVJFX0NPT1JEUyA9IHRydWU7XG5cbiAgICAgICAgICAgIC8vIEFkZCB2ZXJ0ZXggYXR0cmlidXRlIGZvciBVVnMgb25seSB3aGVuIG5lZWRlZFxuICAgICAgICAgICAgYXR0cmlicy5wdXNoKHsgbmFtZTogJ2FfdGV4Y29vcmQnLCBzaXplOiAyLCB0eXBlOiBnbC5VTlNJR05FRF9TSE9SVCwgbm9ybWFsaXplZDogdHJ1ZSB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMudmVydGV4X2xheW91dCA9IG5ldyBWZXJ0ZXhMYXlvdXQoYXR0cmlicyk7XG4gICAgfSxcblxuICAgIF9wYXJzZUZlYXR1cmUgKGZlYXR1cmUsIGRyYXcsIGNvbnRleHQpIHtcbiAgICAgICAgdmFyIHN0eWxlID0gdGhpcy5mZWF0dXJlX3N0eWxlO1xuXG4gICAgICAgIHN0eWxlLmNvbG9yID0gdGhpcy5wYXJzZUNvbG9yKGRyYXcuY29sb3IsIGNvbnRleHQpO1xuICAgICAgICBpZiAoIXN0eWxlLmNvbG9yKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIHN0eWxlLnogPSAoZHJhdy56ICYmIFN0eWxlUGFyc2VyLmV2YWxDYWNoZWREaXN0YW5jZVByb3BlcnR5KGRyYXcueiwgY29udGV4dCkpIHx8IFN0eWxlUGFyc2VyLmRlZmF1bHRzLno7XG4gICAgICAgIHN0eWxlLnogKj0gR2VvLmhlaWdodF9zY2FsZTsgLy8gcHJvdmlkZSBzdWItbWV0ZXIgcHJlY2lzaW9uIG9mIGhlaWdodCB2YWx1ZXNcblxuICAgICAgICBzdHlsZS5leHRydWRlID0gU3R5bGVQYXJzZXIuZXZhbFByb3BlcnR5KGRyYXcuZXh0cnVkZSwgY29udGV4dCk7XG4gICAgICAgIGlmIChzdHlsZS5leHRydWRlKSB7XG4gICAgICAgICAgICAvLyB1c2UgZmVhdHVyZSdzIGhlaWdodCBhbmQgbWluX2hlaWdodCBwcm9wZXJ0aWVzXG4gICAgICAgICAgICBpZiAoc3R5bGUuZXh0cnVkZSA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgICAgIHN0eWxlLmhlaWdodCA9IGZlYXR1cmUucHJvcGVydGllcy5oZWlnaHQgfHwgU3R5bGVQYXJzZXIuZGVmYXVsdHMuaGVpZ2h0O1xuICAgICAgICAgICAgICAgIHN0eWxlLm1pbl9oZWlnaHQgPSBmZWF0dXJlLnByb3BlcnRpZXMubWluX2hlaWdodCB8fCBTdHlsZVBhcnNlci5kZWZhdWx0cy5taW5faGVpZ2h0O1xuXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBleHBsaWNpdCBoZWlnaHQsIG5vIG1pbl9oZWlnaHRcbiAgICAgICAgICAgIGVsc2UgaWYgKHR5cGVvZiBzdHlsZS5leHRydWRlID09PSAnbnVtYmVyJykge1xuICAgICAgICAgICAgICAgIHN0eWxlLmhlaWdodCA9IHN0eWxlLmV4dHJ1ZGU7XG4gICAgICAgICAgICAgICAgc3R5bGUubWluX2hlaWdodCA9IDA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBleHBsaWNpdCBoZWlnaHQgYW5kIG1pbl9oZWlnaHRcbiAgICAgICAgICAgIGVsc2UgaWYgKEFycmF5LmlzQXJyYXkoc3R5bGUuZXh0cnVkZSkpIHtcbiAgICAgICAgICAgICAgICBzdHlsZS5taW5faGVpZ2h0ID0gc3R5bGUuZXh0cnVkZVswXTtcbiAgICAgICAgICAgICAgICBzdHlsZS5oZWlnaHQgPSBzdHlsZS5leHRydWRlWzFdO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBzdHlsZS5oZWlnaHQgKj0gR2VvLmhlaWdodF9zY2FsZTsgICAgICAgLy8gcHJvdmlkZSBzdWItbWV0ZXIgcHJlY2lzaW9uIG9mIGhlaWdodCB2YWx1ZXNcbiAgICAgICAgICAgIHN0eWxlLm1pbl9oZWlnaHQgKj0gR2VvLmhlaWdodF9zY2FsZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHN0eWxlLnRpbGVfZWRnZXMgPSBkcmF3LnRpbGVfZWRnZXM7IC8vIHVzdWFsbHkgYWN0aXZhdGVkIGZvciBkZWJ1Z2dpbmcsIG9yIHJhcmUgdmlzdWFsaXphdGlvbiBuZWVkc1xuXG4gICAgICAgIHJldHVybiBzdHlsZTtcbiAgICB9LFxuXG4gICAgX3ByZXByb2Nlc3MgKGRyYXcpIHtcbiAgICAgICAgZHJhdy5jb2xvciA9IFN0eWxlUGFyc2VyLmNyZWF0ZUNvbG9yUHJvcGVydHlDYWNoZShkcmF3LmNvbG9yKTtcbiAgICAgICAgZHJhdy56ID0gU3R5bGVQYXJzZXIuY3JlYXRlUHJvcGVydHlDYWNoZShkcmF3LnosIFN0eWxlUGFyc2VyLnBhcnNlVW5pdHMpO1xuICAgICAgICByZXR1cm4gZHJhdztcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogQSBcInRlbXBsYXRlXCIgdGhhdCBzZXRzIGNvbnN0YW50IGF0dGlidXRlcyBmb3IgZWFjaCB2ZXJ0ZXgsIHdoaWNoIGlzIHRoZW4gbW9kaWZpZWQgcGVyIHZlcnRleCBvciBwZXIgZmVhdHVyZS5cbiAgICAgKiBBIHBsYWluIEpTIGFycmF5IG1hdGNoaW5nIHRoZSBvcmRlciBvZiB0aGUgdmVydGV4IGxheW91dC5cbiAgICAgKi9cbiAgICBtYWtlVmVydGV4VGVtcGxhdGUoc3R5bGUpIHtcbiAgICAgICAgbGV0IGkgPSAwO1xuXG4gICAgICAgIC8vIHBvc2l0aW9uIC0geCAmIHkgY29vcmRzIHdpbGwgYmUgZmlsbGVkIGluIHBlci12ZXJ0ZXggYmVsb3dcbiAgICAgICAgdGhpcy52ZXJ0ZXhfdGVtcGxhdGVbaSsrXSA9IDA7XG4gICAgICAgIHRoaXMudmVydGV4X3RlbXBsYXRlW2krK10gPSAwO1xuICAgICAgICB0aGlzLnZlcnRleF90ZW1wbGF0ZVtpKytdID0gc3R5bGUueiB8fCAwO1xuXG4gICAgICAgIC8vIGxheWVyIG9yZGVyIC0gdyBjb29yZCBvZiAncG9zaXRpb24nIGF0dHJpYnV0ZSAoZm9yIHBhY2tpbmcgZWZmaWNpZW5jeSlcbiAgICAgICAgdGhpcy52ZXJ0ZXhfdGVtcGxhdGVbaSsrXSA9IHRoaXMuc2NhbGVPcmRlcihzdHlsZS5vcmRlcik7XG5cbiAgICAgICAgLy8gbm9ybWFsXG4gICAgICAgIHRoaXMudmVydGV4X3RlbXBsYXRlW2krK10gPSAwO1xuICAgICAgICB0aGlzLnZlcnRleF90ZW1wbGF0ZVtpKytdID0gMDtcbiAgICAgICAgdGhpcy52ZXJ0ZXhfdGVtcGxhdGVbaSsrXSA9IDEgKiAxMjc7XG5cbiAgICAgICAgLy8gY29sb3JcbiAgICAgICAgdGhpcy52ZXJ0ZXhfdGVtcGxhdGVbaSsrXSA9IHN0eWxlLmNvbG9yWzBdICogMjU1O1xuICAgICAgICB0aGlzLnZlcnRleF90ZW1wbGF0ZVtpKytdID0gc3R5bGUuY29sb3JbMV0gKiAyNTU7XG4gICAgICAgIHRoaXMudmVydGV4X3RlbXBsYXRlW2krK10gPSBzdHlsZS5jb2xvclsyXSAqIDI1NTtcbiAgICAgICAgdGhpcy52ZXJ0ZXhfdGVtcGxhdGVbaSsrXSA9IHN0eWxlLmNvbG9yWzNdICogMjU1O1xuXG4gICAgICAgIC8vIHNlbGVjdGlvbiBjb2xvclxuICAgICAgICBpZiAodGhpcy5zZWxlY3Rpb24pIHtcbiAgICAgICAgICAgIHRoaXMudmVydGV4X3RlbXBsYXRlW2krK10gPSBzdHlsZS5zZWxlY3Rpb25fY29sb3JbMF0gKiAyNTU7XG4gICAgICAgICAgICB0aGlzLnZlcnRleF90ZW1wbGF0ZVtpKytdID0gc3R5bGUuc2VsZWN0aW9uX2NvbG9yWzFdICogMjU1O1xuICAgICAgICAgICAgdGhpcy52ZXJ0ZXhfdGVtcGxhdGVbaSsrXSA9IHN0eWxlLnNlbGVjdGlvbl9jb2xvclsyXSAqIDI1NTtcbiAgICAgICAgICAgIHRoaXMudmVydGV4X3RlbXBsYXRlW2krK10gPSBzdHlsZS5zZWxlY3Rpb25fY29sb3JbM10gKiAyNTU7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBBZGQgdGV4dHVyZSBVVnMgdG8gdGVtcGxhdGUgb25seSBpZiBuZWVkZWRcbiAgICAgICAgaWYgKHRoaXMudGV4Y29vcmRzKSB7XG4gICAgICAgICAgICB0aGlzLnZlcnRleF90ZW1wbGF0ZVtpKytdID0gMDtcbiAgICAgICAgICAgIHRoaXMudmVydGV4X3RlbXBsYXRlW2krK10gPSAwO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMudmVydGV4X3RlbXBsYXRlO1xuICAgIH0sXG5cbiAgICBidWlsZFBvbHlnb25zKHBvbHlnb25zLCBzdHlsZSwgdmVydGV4X2RhdGEsIGNvbnRleHQpIHtcbiAgICAgICAgbGV0IHZlcnRleF90ZW1wbGF0ZSA9IHRoaXMubWFrZVZlcnRleFRlbXBsYXRlKHN0eWxlKTtcbiAgICAgICAgbGV0IG9wdGlvbnMgPSB7XG4gICAgICAgICAgICB0ZXhjb29yZF9pbmRleDogdGhpcy52ZXJ0ZXhfbGF5b3V0LmluZGV4LmFfdGV4Y29vcmQsXG4gICAgICAgICAgICB0ZXhjb29yZF9ub3JtYWxpemU6IDY1NTM1LCAvLyBzY2FsZSBVVnMgdG8gdW5zaWduZWQgc2hvcnRzXG4gICAgICAgICAgICByZW1vdmVfdGlsZV9lZGdlczogIXN0eWxlLnRpbGVfZWRnZXMsXG4gICAgICAgICAgICB0aWxlX2VkZ2VfdG9sZXJhbmNlOiBHZW8udGlsZV9zY2FsZSAqIGNvbnRleHQudGlsZS5wYWRfc2NhbGUgKiA0LFxuICAgICAgICAgICAgd2luZGluZzogY29udGV4dC53aW5kaW5nXG4gICAgICAgIH07XG5cbiAgICAgICAgLy8gRXh0cnVkZWQgcG9seWdvbnMgKGUuZy4gM0QgYnVpbGRpbmdzKVxuICAgICAgICBpZiAoc3R5bGUuZXh0cnVkZSAmJiBzdHlsZS5oZWlnaHQpIHtcbiAgICAgICAgICAgIGJ1aWxkRXh0cnVkZWRQb2x5Z29ucyhcbiAgICAgICAgICAgICAgICBwb2x5Z29ucyxcbiAgICAgICAgICAgICAgICBzdHlsZS56LCBzdHlsZS5oZWlnaHQsIHN0eWxlLm1pbl9oZWlnaHQsXG4gICAgICAgICAgICAgICAgdmVydGV4X2RhdGEsIHZlcnRleF90ZW1wbGF0ZSxcbiAgICAgICAgICAgICAgICB0aGlzLnZlcnRleF9sYXlvdXQuaW5kZXguYV9ub3JtYWwsXG4gICAgICAgICAgICAgICAgMTI3LCAvLyBzY2FsZSBub3JtYWxzIHRvIHNpZ25lZCBieXRlc1xuICAgICAgICAgICAgICAgIG9wdGlvbnNcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gUmVndWxhciBwb2x5Z29uc1xuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGJ1aWxkUG9seWdvbnMoXG4gICAgICAgICAgICAgICAgcG9seWdvbnMsXG4gICAgICAgICAgICAgICAgdmVydGV4X2RhdGEsIHZlcnRleF90ZW1wbGF0ZSxcbiAgICAgICAgICAgICAgICBvcHRpb25zXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgfVxuXG59KTtcbiIsIi8vIFJhc3RlciB0aWxlIHJlbmRlcmluZyBzdHlsZVxuXG5pbXBvcnQge1N0eWxlUGFyc2VyfSBmcm9tICcuLi9zdHlsZV9wYXJzZXInO1xuaW1wb3J0IHtQb2x5Z29uc30gZnJvbSAnLi4vcG9seWdvbnMvcG9seWdvbnMnO1xuXG5leHBvcnQgbGV0IFJhc3RlclN0eWxlID0gT2JqZWN0LmNyZWF0ZShQb2x5Z29ucyk7XG5cbk9iamVjdC5hc3NpZ24oUmFzdGVyU3R5bGUsIHtcbiAgICBuYW1lOiAncmFzdGVyJyxcbiAgICBzdXBlcjogUG9seWdvbnMsXG4gICAgYnVpbHRfaW46IHRydWUsXG5cbiAgICBpbml0KCkge1xuICAgICAgICAvLyBSZXF1aXJlZCBmb3IgcmFzdGVyIHRpbGVzXG4gICAgICAgIHRoaXMucmFzdGVyID0gdGhpcy5yYXN0ZXIgfHwgJ2NvbG9yJztcblxuICAgICAgICB0aGlzLnN1cGVyLmluaXQuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcblxuICAgICAgICB0aGlzLnNlbGVjdGlvbiA9IGZhbHNlOyAvLyByYXN0ZXIgc3R5bGVzIGNhbid0IHN1cHBvcnQgZmVhdHVyZSBzZWxlY3Rpb25cbiAgICB9LFxuXG4gICAgX3ByZXByb2Nlc3MgKGRyYXcpIHtcbiAgICAgICAgLy8gUmFzdGVyIHRpbGVzIGRlZmF1bHQgdG8gd2hpdGUgdmVydGV4IGNvbG9yLCBhcyB0aGlzIGNvbG9yIHdpbGwgdGludCB0aGUgdW5kZXJseWluZyB0ZXh0dXJlXG4gICAgICAgIGRyYXcuY29sb3IgPSBkcmF3LmNvbG9yIHx8IFN0eWxlUGFyc2VyLmRlZmF1bHRzLmNvbG9yO1xuICAgICAgICByZXR1cm4gdGhpcy5zdXBlci5fcHJlcHJvY2Vzcy5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIH1cblxufSk7XG4iLCIvLyBSZW5kZXJpbmcgc3R5bGVzXG5cbmltcG9ydCB7U3R5bGVQYXJzZXJ9IGZyb20gJy4vc3R5bGVfcGFyc2VyJztcbmltcG9ydCBGZWF0dXJlU2VsZWN0aW9uIGZyb20gJy4uL3NlbGVjdGlvbic7XG5pbXBvcnQgU2hhZGVyUHJvZ3JhbSBmcm9tICcuLi9nbC9zaGFkZXJfcHJvZ3JhbSc7XG5pbXBvcnQgVkJPTWVzaCBmcm9tICcuLi9nbC92Ym9fbWVzaCc7XG5pbXBvcnQgVGV4dHVyZSBmcm9tICcuLi9nbC90ZXh0dXJlJztcbmltcG9ydCBNYXRlcmlhbCBmcm9tICcuLi9tYXRlcmlhbCc7XG5pbXBvcnQgTGlnaHQgZnJvbSAnLi4vbGlnaHQnO1xuaW1wb3J0IHtSYXN0ZXJUaWxlU291cmNlfSBmcm9tICcuLi9zb3VyY2VzL3Jhc3Rlcic7XG5pbXBvcnQgbG9nIGZyb20gJy4uL3V0aWxzL2xvZyc7XG5pbXBvcnQgVGhyZWFkIGZyb20gJy4uL3V0aWxzL3RocmVhZCc7XG5pbXBvcnQgV29ya2VyQnJva2VyIGZyb20gJy4uL3V0aWxzL3dvcmtlcl9icm9rZXInO1xuXG5sZXQgZnMgPSByZXF1aXJlKCdmcycpO1xuY29uc3Qgc2hhZGVyU3JjX3NlbGVjdGlvbkZyYWdtZW50ID0gZnMucmVhZEZpbGVTeW5jKF9fZGlybmFtZSArICcvLi4vZ2wvc2hhZGVycy9zZWxlY3Rpb25fZnJhZ21lbnQuZ2xzbCcsICd1dGY4Jyk7XG5jb25zdCBzaGFkZXJTcmNfcmFzdGVycyA9IGZzLnJlYWRGaWxlU3luYyhfX2Rpcm5hbWUgKyAnLy4uL2dsL3NoYWRlcnMvcmFzdGVycy5nbHNsJywgJ3V0ZjgnKTtcblxuLy8gQmFzZSBjbGFzc1xuXG5leHBvcnQgdmFyIFN0eWxlID0ge1xuICAgIGluaXQgKHsgZ2VuZXJhdGlvbiwgc3R5bGVzLCBzb3VyY2VzID0ge30sIGludHJvc3BlY3Rpb24gfSA9IHt9KSB7XG4gICAgICAgIHRoaXMuZ2VuZXJhdGlvbiA9IGdlbmVyYXRpb247ICAgICAgICAgICAgICAgLy8gc2NlbmUgZ2VuZXJhdGlvbiBpZCB0aGlzIHN0eWxlIHdhcyBjcmVhdGVkIGZvclxuICAgICAgICB0aGlzLnN0eWxlcyA9IHN0eWxlczsgICAgICAgICAgICAgICAgICAgICAgIC8vIHN0eWxlcyBmb3Igc2NlbmVcbiAgICAgICAgdGhpcy5zb3VyY2VzID0gc291cmNlczsgICAgICAgICAgICAgICAgICAgICAvLyBkYXRhIHNvdXJjZXMgZm9yIHNjZW5lXG4gICAgICAgIHRoaXMuZGVmaW5lcyA9ICh0aGlzLmhhc093blByb3BlcnR5KCdkZWZpbmVzJykgJiYgdGhpcy5kZWZpbmVzKSB8fCB7fTsgLy8gI2RlZmluZXMgdG8gYmUgaW5qZWN0ZWQgaW50byB0aGUgc2hhZGVyc1xuICAgICAgICB0aGlzLnNoYWRlcnMgPSAodGhpcy5oYXNPd25Qcm9wZXJ0eSgnc2hhZGVycycpICYmIHRoaXMuc2hhZGVycykgfHwge307IC8vIHNoYWRlciBjdXN0b21pemF0aW9uICh1bmlmb3JtcywgZGVmaW5lcywgYmxvY2tzLCBldGMuKVxuICAgICAgICB0aGlzLmludHJvc3BlY3Rpb24gPSBpbnRyb3NwZWN0aW9uIHx8IGZhbHNlO1xuICAgICAgICB0aGlzLnNlbGVjdGlvbiA9IHRoaXMuc2VsZWN0aW9uIHx8IHRoaXMuaW50cm9zcGVjdGlvbiB8fCBmYWxzZTsgICAvLyBmbGFnIGluZGljYXRpbmcgaWYgdGhpcyBzdHlsZSBzdXBwb3J0cyBmZWF0dXJlIHNlbGVjdGlvblxuICAgICAgICB0aGlzLmNvbXBpbGVfc2V0dXAgPSBmYWxzZTsgICAgICAgICAgICAgICAgIC8vIG9uZS10aW1lIHNldHVwIHN0ZXBzIGZvciBwcm9ncmFtIGNvbXBpbGF0aW9uXG4gICAgICAgIHRoaXMucHJvZ3JhbSA9IG51bGw7ICAgICAgICAgICAgICAgICAgICAgICAgLy8gR0wgcHJvZ3JhbSByZWZlcmVuY2UgKGZvciBtYWluIHJlbmRlciBwYXNzKVxuICAgICAgICB0aGlzLnNlbGVjdGlvbl9wcm9ncmFtID0gbnVsbDsgICAgICAgICAgICAgIC8vIEdMIHByb2dyYW0gcmVmZXJlbmNlIGZvciBmZWF0dXJlIHNlbGVjdGlvbiByZW5kZXIgcGFzc1xuICAgICAgICB0aGlzLmZlYXR1cmVfc3R5bGUgPSB7fTsgICAgICAgICAgICAgICAgICAgIC8vIHN0eWxlIGZvciBmZWF0dXJlIGN1cnJlbnRseSBiZWluZyBwYXJzZWQsIHNoYXJlZCB0byBsZXNzZW4gR0MvbWVtb3J5IHRocmFzaFxuICAgICAgICB0aGlzLnZlcnRleF90ZW1wbGF0ZSA9IFtdOyAgICAgICAgICAgICAgICAgIC8vIHNoYXJlZCBzaW5nbGUtdmVydGV4IHRlbXBsYXRlLCBmaWxsZWQgb3V0IGJ5IGVhY2ggc3R5bGVcbiAgICAgICAgdGhpcy50aWxlX2RhdGEgPSB7fTtcblxuICAgICAgICAvLyBQcm92aWRlIGEgaG9vayBmb3IgdGhpcyBvYmplY3QgdG8gYmUgY2FsbGVkIGZyb20gd29ya2VyIHRocmVhZHNcbiAgICAgICAgdGhpcy5tYWluX3RocmVhZF90YXJnZXQgPSBbJ1N0eWxlJywgdGhpcy5uYW1lLCB0aGlzLmdlbmVyYXRpb25dLmpvaW4oJy8nKTtcbiAgICAgICAgaWYgKFRocmVhZC5pc19tYWluKSB7XG4gICAgICAgICAgICBXb3JrZXJCcm9rZXIuYWRkVGFyZ2V0KHRoaXMubWFpbl90aHJlYWRfdGFyZ2V0LCB0aGlzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIERlZmF1bHQgd29ybGQgY29vcmRzIHRvIHdyYXAgZXZlcnkgMTAwLDAwMCBtZXRlcnMsIGNhbiB0dXJuIG9mZiBieSBzZXR0aW5nIHRoaXMgdG8gJ2ZhbHNlJ1xuICAgICAgICB0aGlzLmRlZmluZXMuVEFOR1JBTV9XT1JMRF9QT1NJVElPTl9XUkFQID0gMTAwMDAwO1xuXG4gICAgICAgIC8vIEJsZW5kaW5nXG4gICAgICAgIHRoaXMuYmxlbmQgPSB0aGlzLmJsZW5kIHx8ICdvcGFxdWUnOyAgICAgICAgLy8gZGVmYXVsdDogb3BhcXVlIHN0eWxlcyBhcmUgZHJhd24gZmlyc3QsIHdpdGhvdXQgYmxlbmRpbmdcbiAgICAgICAgdGhpcy5kZWZpbmVzW2BUQU5HUkFNX0JMRU5EXyR7dGhpcy5ibGVuZC50b1VwcGVyQ2FzZSgpfWBdID0gdHJ1ZTtcbiAgICAgICAgaWYgKHRoaXMuYmxlbmRfb3JkZXIgPT0gbnVsbCkgeyAvLyBjb250cm9scyBvcmRlciBvZiByZW5kZXJpbmcgZm9yIHN0eWxlcyB3L25vbi1vcGFxdWUgYmxlbmRpbmdcbiAgICAgICAgICAgIHRoaXMuYmxlbmRfb3JkZXIgPSAtMTsgLy8gZGVmYXVsdHMgdG8gZmlyc3RcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIElmIHRoZSBzdHlsZSBkZWZpbmVzIGl0cyBvd24gbWF0ZXJpYWwsIHJlcGxhY2UgdGhlIGluaGVyaXRlZCBtYXRlcmlhbCBpbnN0YW5jZVxuICAgICAgICBpZiAoISh0aGlzLm1hdGVyaWFsIGluc3RhbmNlb2YgTWF0ZXJpYWwpKSB7XG4gICAgICAgICAgICBpZiAoIU1hdGVyaWFsLmlzVmFsaWQodGhpcy5tYXRlcmlhbCkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLm1hdGVyaWFsID0gU3R5bGVQYXJzZXIuZGVmYXVsdHMubWF0ZXJpYWw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLm1hdGVyaWFsID0gbmV3IE1hdGVyaWFsKHRoaXMubWF0ZXJpYWwpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMubWF0ZXJpYWwuaW5qZWN0KHRoaXMpO1xuXG4gICAgICAgIC8vIFNldCBsaWdodGluZyBtb2RlOiBmcmFnbWVudCwgdmVydGV4LCBvciBub25lIChzcGVjaWZpZWQgYXMgJ2ZhbHNlJylcbiAgICAgICAgTGlnaHQuc2V0TW9kZSh0aGlzLmxpZ2h0aW5nLCB0aGlzKTtcblxuICAgICAgICAvLyBTZXR1cCByYXN0ZXIgc2FtcGxlcnMgaWYgbmVlZGVkXG4gICAgICAgIHRoaXMuc2V0dXBSYXN0ZXJzKCk7XG5cbiAgICAgICAgdGhpcy5pbml0aWFsaXplZCA9IHRydWU7XG4gICAgfSxcblxuICAgIGRlc3Ryb3kgKCkge1xuICAgICAgICBpZiAodGhpcy5wcm9ncmFtKSB7XG4gICAgICAgICAgICB0aGlzLnByb2dyYW0uZGVzdHJveSgpO1xuICAgICAgICAgICAgdGhpcy5wcm9ncmFtID0gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLnNlbGVjdGlvbl9wcm9ncmFtKSB7XG4gICAgICAgICAgICB0aGlzLnNlbGVjdGlvbl9wcm9ncmFtLmRlc3Ryb3koKTtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uX3Byb2dyYW0gPSBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5nbCA9IG51bGw7XG4gICAgICAgIHRoaXMuaW5pdGlhbGl6ZWQgPSBmYWxzZTtcbiAgICB9LFxuXG4gICAgcmVzZXQgKCkge1xuICAgIH0sXG5cbiAgICBiYXNlU3R5bGUgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5iYXNlIHx8IHRoaXMubmFtZTtcbiAgICB9LFxuXG4gICAgZmlsbFZlcnRleFRlbXBsYXRlKGF0dHJpYnV0ZSwgdmFsdWUsIHsgc2l6ZSwgb2Zmc2V0IH0pIHtcbiAgICAgICAgb2Zmc2V0ID0gKG9mZnNldCA9PT0gdW5kZWZpbmVkKSA/IDAgOiBvZmZzZXQ7XG5cbiAgICAgICAgbGV0IGluZGV4ID0gdGhpcy52ZXJ0ZXhfbGF5b3V0LmluZGV4W2F0dHJpYnV0ZV07XG4gICAgICAgIGlmIChpbmRleCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBsb2coJ3dhcm4nLCBgU3R5bGU6IGluIHN0eWxlICcke3RoaXMubmFtZX0nLCBubyBpbmRleCBmb3VuZCBpbiB2ZXJ0ZXggbGF5b3V0IGZvciBhdHRyaWJ1dGUgJyR7YXR0cmlidXRlfSdgKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc2l6ZTsgKytpKSB7XG4gICAgICAgICAgICBsZXQgdiA9IHZhbHVlLmxlbmd0aCA+IGkgPyB2YWx1ZVtpXSA6IHZhbHVlO1xuICAgICAgICAgICAgdGhpcy52ZXJ0ZXhfdGVtcGxhdGVbaW5kZXggKyBpICsgb2Zmc2V0XSA9IHY7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgLyoqKiBTdHlsZSBwYXJzaW5nIGFuZCBnZW9tZXRyeSBjb25zdHJ1Y3Rpb24gKioqL1xuXG4gICAgLy8gUmV0dXJucyBhbiBvYmplY3QgdG8gaG9sZCBmZWF0dXJlIGRhdGEgKGZvciBhIHRpbGUgb3Igb3RoZXIgb2JqZWN0KVxuICAgIHN0YXJ0RGF0YSAodGlsZSkge1xuICAgICAgICB0aGlzLnRpbGVfZGF0YVt0aWxlLmtleV0gPSB7XG4gICAgICAgICAgICB2ZXJ0ZXhfZGF0YTogbnVsbCxcbiAgICAgICAgICAgIHVuaWZvcm1zOiB7fSxcbiAgICAgICAgICAgIHRleHR1cmVzOiBbXVxuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gdGhpcy50aWxlX2RhdGFbdGlsZS5rZXldO1xuICAgIH0sXG5cbiAgICAvLyBGaW5hbGl6ZXMgYW4gb2JqZWN0IGhvbGRpbmcgZmVhdHVyZSBkYXRhIChmb3IgYSB0aWxlIG9yIG90aGVyIG9iamVjdClcbiAgICBlbmREYXRhICh0aWxlKSB7XG4gICAgICAgIHZhciB0aWxlX2RhdGEgPSB0aGlzLnRpbGVfZGF0YVt0aWxlLmtleV07XG4gICAgICAgIHRoaXMudGlsZV9kYXRhW3RpbGUua2V5XSA9IG51bGw7XG5cbiAgICAgICAgaWYgKHRpbGVfZGF0YSAmJiB0aWxlX2RhdGEudmVydGV4X2RhdGEgJiYgdGlsZV9kYXRhLnZlcnRleF9kYXRhLnZlcnRleF9jb3VudCA+IDApIHtcbiAgICAgICAgICAgIC8vIE9ubHkga2VlcCBmaW5hbCBieXRlIGJ1ZmZlclxuICAgICAgICAgICAgdGlsZV9kYXRhLnZlcnRleF9kYXRhLmVuZCgpO1xuICAgICAgICAgICAgdGlsZV9kYXRhLnZlcnRleF9lbGVtZW50cyA9IHRpbGVfZGF0YS52ZXJ0ZXhfZGF0YS5lbGVtZW50X2J1ZmZlcjtcbiAgICAgICAgICAgIHRpbGVfZGF0YS52ZXJ0ZXhfZGF0YSA9IHRpbGVfZGF0YS52ZXJ0ZXhfZGF0YS52ZXJ0ZXhfYnVmZmVyOyAvLyBjb252ZXJ0IGZyb20gaW5zdGFuY2UgdG8gcmF3IHR5cGVkIGFycmF5XG5cbiAgICAgICAgICAgIC8vIExvYWQgcmFzdGVyIHRpbGVzIHBhc3NlZCBmcm9tIGRhdGEgc291cmNlXG4gICAgICAgICAgICAvLyBCbG9ja3MgbWVzaCBjb21wbGV0aW9uIHRvIGF2b2lkIGZsaWNrZXJpbmdcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmJ1aWxkUmFzdGVyVGV4dHVyZXModGlsZSwgdGlsZV9kYXRhKS50aGVuKCgpID0+IHRpbGVfZGF0YSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKG51bGwpOyAvLyBkb24ndCBzZW5kIHRpbGUgZGF0YSBiYWNrIGlmIGRvZXNuJ3QgaGF2ZSBnZW9tZXRyeVxuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8vIEhhcyBtZXNoIGRhdGEgZm9yIGEgZ2l2ZW4gdGlsZT9cbiAgICBoYXNEYXRhRm9yVGlsZSAodGlsZV9rZXkpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudGlsZV9kYXRhW3RpbGVfa2V5XSAhPSBudWxsO1xuICAgIH0sXG5cbiAgICBhZGRGZWF0dXJlIChmZWF0dXJlLCBkcmF3LCBjb250ZXh0KSB7XG4gICAgICAgIGxldCB0aWxlID0gY29udGV4dC50aWxlO1xuICAgICAgICBpZiAodGlsZS5nZW5lcmF0aW9uICE9PSB0aGlzLmdlbmVyYXRpb24pIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghdGhpcy50aWxlX2RhdGFbdGlsZS5rZXldKSB7XG4gICAgICAgICAgICB0aGlzLnN0YXJ0RGF0YSh0aWxlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBzdHlsZSA9IHRoaXMucGFyc2VGZWF0dXJlKGZlYXR1cmUsIGRyYXcsIGNvbnRleHQpO1xuXG4gICAgICAgIC8vIFNraXAgZmVhdHVyZT9cbiAgICAgICAgaWYgKCFzdHlsZSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gRmlyc3QgZmVhdHVyZSBpbiB0aGlzIHJlbmRlciBzdHlsZT9cbiAgICAgICAgaWYgKCF0aGlzLnRpbGVfZGF0YVt0aWxlLmtleV0udmVydGV4X2RhdGEpIHtcbiAgICAgICAgICAgIHRoaXMudGlsZV9kYXRhW3RpbGUua2V5XS52ZXJ0ZXhfZGF0YSA9IHRoaXMudmVydGV4X2xheW91dC5jcmVhdGVWZXJ0ZXhEYXRhKCk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmJ1aWxkR2VvbWV0cnkoZmVhdHVyZS5nZW9tZXRyeSwgc3R5bGUsIHRoaXMudGlsZV9kYXRhW3RpbGUua2V5XS52ZXJ0ZXhfZGF0YSwgY29udGV4dCk7XG4gICAgfSxcblxuICAgIGJ1aWxkR2VvbWV0cnkgKGdlb21ldHJ5LCBzdHlsZSwgdmVydGV4X2RhdGEsIGNvbnRleHQpIHtcbiAgICAgICAgaWYgKGdlb21ldHJ5LnR5cGUgPT09ICdQb2x5Z29uJykge1xuICAgICAgICAgICAgdGhpcy5idWlsZFBvbHlnb25zKFtnZW9tZXRyeS5jb29yZGluYXRlc10sIHN0eWxlLCB2ZXJ0ZXhfZGF0YSwgY29udGV4dCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoZ2VvbWV0cnkudHlwZSA9PT0gJ011bHRpUG9seWdvbicpIHtcbiAgICAgICAgICAgIHRoaXMuYnVpbGRQb2x5Z29ucyhnZW9tZXRyeS5jb29yZGluYXRlcywgc3R5bGUsIHZlcnRleF9kYXRhLCBjb250ZXh0KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChnZW9tZXRyeS50eXBlID09PSAnTGluZVN0cmluZycpIHtcbiAgICAgICAgICAgIHRoaXMuYnVpbGRMaW5lcyhbZ2VvbWV0cnkuY29vcmRpbmF0ZXNdLCBzdHlsZSwgdmVydGV4X2RhdGEsIGNvbnRleHQpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGdlb21ldHJ5LnR5cGUgPT09ICdNdWx0aUxpbmVTdHJpbmcnKSB7XG4gICAgICAgICAgICB0aGlzLmJ1aWxkTGluZXMoZ2VvbWV0cnkuY29vcmRpbmF0ZXMsIHN0eWxlLCB2ZXJ0ZXhfZGF0YSwgY29udGV4dCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoZ2VvbWV0cnkudHlwZSA9PT0gJ1BvaW50Jykge1xuICAgICAgICAgICAgdGhpcy5idWlsZFBvaW50cyhbZ2VvbWV0cnkuY29vcmRpbmF0ZXNdLCBzdHlsZSwgdmVydGV4X2RhdGEsIGNvbnRleHQpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGdlb21ldHJ5LnR5cGUgPT09ICdNdWx0aVBvaW50Jykge1xuICAgICAgICAgICAgdGhpcy5idWlsZFBvaW50cyhnZW9tZXRyeS5jb29yZGluYXRlcywgc3R5bGUsIHZlcnRleF9kYXRhLCBjb250ZXh0KTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICBwYXJzZUZlYXR1cmUgKGZlYXR1cmUsIGRyYXcsIGNvbnRleHQpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHZhciBzdHlsZSA9IHRoaXMuZmVhdHVyZV9zdHlsZTtcblxuICAgICAgICAgICAgZHJhdyA9IHRoaXMucHJlcHJvY2VzcyhkcmF3KTtcbiAgICAgICAgICAgIGlmICghZHJhdykge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gQ2FsY3VsYXRlIG9yZGVyIGlmIGl0IHdhcyBub3QgY2FjaGVkXG4gICAgICAgICAgICBzdHlsZS5vcmRlciA9IHRoaXMucGFyc2VPcmRlcihkcmF3Lm9yZGVyLCBjb250ZXh0KTtcblxuICAgICAgICAgICAgLy8gRmVhdHVyZSBzZWxlY3Rpb24gKG9ubHkgaWYgc3R5bGUgc3VwcG9ydHMgaXQpXG4gICAgICAgICAgICB2YXIgc2VsZWN0YWJsZSA9IGZhbHNlO1xuICAgICAgICAgICAgc3R5bGUuaW50ZXJhY3RpdmUgPSB0aGlzLmludHJvc3BlY3Rpb24gfHwgZHJhdy5pbnRlcmFjdGl2ZTtcbiAgICAgICAgICAgIGlmICh0aGlzLnNlbGVjdGlvbikge1xuICAgICAgICAgICAgICAgIHNlbGVjdGFibGUgPSBTdHlsZVBhcnNlci5ldmFsUHJvcGVydHkoc3R5bGUuaW50ZXJhY3RpdmUsIGNvbnRleHQpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBJZiBmZWF0dXJlIGlzIG1hcmtlZCBhcyBzZWxlY3RhYmxlXG4gICAgICAgICAgICBpZiAoc2VsZWN0YWJsZSkge1xuICAgICAgICAgICAgICAgIHN0eWxlLnNlbGVjdGlvbl9jb2xvciA9IEZlYXR1cmVTZWxlY3Rpb24ubWFrZUNvbG9yKGZlYXR1cmUsIGNvbnRleHQudGlsZSwgY29udGV4dCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBzdHlsZS5zZWxlY3Rpb25fY29sb3IgPSBGZWF0dXJlU2VsZWN0aW9uLmRlZmF1bHRDb2xvcjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gU3ViY2xhc3MgaW1wbGVtZW50YXRpb25cbiAgICAgICAgICAgIHN0eWxlID0gdGhpcy5fcGFyc2VGZWF0dXJlKGZlYXR1cmUsIGRyYXcsIGNvbnRleHQpO1xuXG4gICAgICAgICAgICByZXR1cm4gc3R5bGU7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2goZXJyb3IpIHtcbiAgICAgICAgICAgIGxvZygnZXJyb3InLCAnU3R5bGUucGFyc2VGZWF0dXJlOiBzdHlsZSBwYXJzaW5nIGVycm9yJywgZmVhdHVyZSwgc3R5bGUsIGVycm9yKTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICBfcGFyc2VGZWF0dXJlIChmZWF0dXJlLCBkcmF3LCBjb250ZXh0KSB7XG4gICAgICAgIHJldHVybiB0aGlzLmZlYXR1cmVfc3R5bGU7XG4gICAgfSxcblxuICAgIHByZXByb2Nlc3MgKGRyYXcpIHtcbiAgICAgICAgLy8gUHJlcHJvY2VzcyBmaXJzdCB0aW1lXG4gICAgICAgIGlmICghZHJhdy5wcmVwcm9jZXNzZWQpIHtcbiAgICAgICAgICAgIGRyYXcgPSB0aGlzLl9wcmVwcm9jZXNzKGRyYXcpOyAvLyBvcHRpb25hbCBzdWJjbGFzcyBpbXBsZW1lbnRhdGlvblxuICAgICAgICAgICAgaWYgKCFkcmF3KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZHJhdy5wcmVwcm9jZXNzZWQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBkcmF3O1xuICAgIH0sXG5cbiAgICAvLyBvcHRpb25hbGx5IGltcGxlbWVudGVkIGJ5IHN1YmNsYXNzXG4gICAgX3ByZXByb2Nlc3MgKGRyYXcpIHtcbiAgICAgICAgcmV0dXJuIGRyYXc7XG4gICAgfSxcblxuICAgIC8vIFBhcnNlIGFuIG9yZGVyIHZhbHVlXG4gICAgcGFyc2VPcmRlciAob3JkZXIsIGNvbnRleHQpIHtcbiAgICAgICAgLy8gQ2FsY3VsYXRlIG9yZGVyIGlmIGl0IHdhcyBub3QgY2FjaGVkXG4gICAgICAgIGlmICh0eXBlb2Ygb3JkZXIgIT09ICdudW1iZXInKSB7XG4gICAgICAgICAgICByZXR1cm4gU3R5bGVQYXJzZXIuY2FsY3VsYXRlT3JkZXIob3JkZXIsIGNvbnRleHQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBvcmRlcjtcbiAgICB9LFxuXG4gICAgLy8gRXhwYW5kIGZpbmFsIHByZWNpc2lvbiBmb3IgaGFsZi1sYXllcnMgKGZvciBvdXRsaW5lcylcbiAgICBzY2FsZU9yZGVyIChvcmRlcikge1xuICAgICAgICByZXR1cm4gb3JkZXIgKiAyO1xuICAgIH0sXG5cbiAgICAvLyBQYXJzZSBhIGNvbG9yIG9mIGNob29zZSBhIGRlZmF1bHQgaWYgYWNjZXB0YWJsZSwgcmV0dXJuIHVuZGVmaW5lZCBpZiBjb2xvciBtaXNzaW5nXG4gICAgcGFyc2VDb2xvcihjb2xvciwgY29udGV4dCkge1xuICAgICAgICAvLyBOZWVkIGVpdGhlciBhIGNvbG9yLCBvciBhIHNoYWRlciBibG9jayBmb3IgJ2NvbG9yJyBvciAnZmlsdGVyJ1xuICAgICAgICBpZiAoY29sb3IpIHtcbiAgICAgICAgICAgIHJldHVybiBTdHlsZVBhcnNlci5ldmFsQ2FjaGVkQ29sb3JQcm9wZXJ0eShjb2xvciwgY29udGV4dCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodGhpcy5zaGFkZXJzLmJsb2Nrcy5jb2xvciB8fCB0aGlzLnNoYWRlcnMuYmxvY2tzLmZpbHRlcikge1xuICAgICAgICAgICAgcmV0dXJuIFN0eWxlUGFyc2VyLmRlZmF1bHRzLmNvbG9yO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8vIEJ1aWxkIGZ1bmN0aW9ucyBhcmUgbm8tb3BzIHVudGlsIG92ZXJyaWRlblxuICAgIGJ1aWxkUG9seWdvbnMgKCkge30sXG4gICAgYnVpbGRMaW5lcyAoKSB7fSxcbiAgICBidWlsZFBvaW50cyAoKSB7fSxcblxuXG4gICAgLyoqKiBHTCBzdGF0ZSBhbmQgcmVuZGVyaW5nICoqKi9cblxuICAgIHNldEdMIChnbCkge1xuICAgICAgICB0aGlzLmdsID0gZ2w7XG4gICAgICAgIHRoaXMubWF4X3RleHR1cmVfc2l6ZSA9IFRleHR1cmUuZ2V0TWF4VGV4dHVyZVNpemUodGhpcy5nbCk7XG4gICAgfSxcblxuICAgIG1ha2VNZXNoICh2ZXJ0ZXhfZGF0YSwgdmVydGV4X2VsZW1lbnRzLCBvcHRpb25zID0ge30pIHtcbiAgICAgICAgcmV0dXJuIG5ldyBWQk9NZXNoKHRoaXMuZ2wsIHZlcnRleF9kYXRhLCB2ZXJ0ZXhfZWxlbWVudHMsIHRoaXMudmVydGV4X2xheW91dCwgb3B0aW9ucyk7XG4gICAgfSxcblxuICAgIHJlbmRlciAobWVzaCkge1xuICAgICAgICByZXR1cm4gbWVzaC5yZW5kZXIoKTtcbiAgICB9LFxuXG4gICAgLy8gR2V0IGEgc3BlY2lmaWMgcHJvZ3JhbSwgY29tcGlsaW5nIGlmIG5lY2Vzc2FyeVxuICAgIGdldFByb2dyYW0gKGtleSA9ICdwcm9ncmFtJykge1xuICAgICAgICB0aGlzLmNvbXBpbGVTZXR1cCgpO1xuXG4gICAgICAgIGNvbnN0IHByb2dyYW0gPSB0aGlzW2tleV07XG4gICAgICAgIGlmICghcHJvZ3JhbSB8fCBwcm9ncmFtLmVycm9yKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXByb2dyYW0uY29tcGlsZWQpIHtcbiAgICAgICAgICAgIGxvZygnZGVidWcnLCBgQ29tcGlsaW5nIHN0eWxlICcke3RoaXMubmFtZX0nLCBwcm9ncmFtIGtleSAnJHtrZXl9J2ApO1xuICAgICAgICAgICAgcHJvZ3JhbS5jb21waWxlKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHByb2dyYW07XG4gICAgfSxcblxuICAgIC8vIE9uZS10aW1lIHNldHVwIGZvciBjb21waWxpbmcgc3R5bGUncyBwcm9ncmFtc1xuICAgIGNvbXBpbGVTZXR1cCAoKSB7XG4gICAgICAgIGlmICh0aGlzLmNvbXBpbGVfc2V0dXApIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghdGhpcy5nbCkge1xuICAgICAgICAgICAgdGhyb3cobmV3IEVycm9yKGBzdHlsZS5jb21waWxlKCk6IHNraXBwaW5nIGZvciAke3RoaXMubmFtZX0gYmVjYXVzZSBubyBHTCBjb250ZXh0YCkpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQnVpbGQgZGVmaW5lcyAmIGZvciBzZWxlY3Rpb24gKG5lZWQgdG8gY3JlYXRlIGEgbmV3IG9iamVjdCBzaW5jZSB0aGUgZmlyc3QgaXMgc3RvcmVkIGFzIGEgcmVmZXJlbmNlIGJ5IHRoZSBwcm9ncmFtKVxuICAgICAgICB2YXIgZGVmaW5lcyA9IHRoaXMuYnVpbGREZWZpbmVMaXN0KCk7XG4gICAgICAgIGlmICh0aGlzLnNlbGVjdGlvbikge1xuICAgICAgICAgICAgdmFyIHNlbGVjdGlvbl9kZWZpbmVzID0gT2JqZWN0LmFzc2lnbih7fSwgZGVmaW5lcyk7XG4gICAgICAgICAgICBzZWxlY3Rpb25fZGVmaW5lcy5UQU5HUkFNX0ZFQVRVUkVfU0VMRUNUSU9OID0gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEdldCBhbnkgY3VzdG9tIGNvZGUgYmxvY2tzLCB1bmlmb3JtIGRlcGVuZGVuY2llcywgZXRjLlxuICAgICAgICB2YXIgYmxvY2tzID0gKHRoaXMuc2hhZGVycyAmJiB0aGlzLnNoYWRlcnMuYmxvY2tzKTtcbiAgICAgICAgdmFyIGJsb2NrX3Njb3BlcyA9ICh0aGlzLnNoYWRlcnMgJiYgdGhpcy5zaGFkZXJzLmJsb2NrX3Njb3Blcyk7XG4gICAgICAgIHZhciB1bmlmb3JtcyA9IE9iamVjdC5hc3NpZ24oe30sIHRoaXMuc2hhZGVycyAmJiB0aGlzLnNoYWRlcnMudW5pZm9ybXMpO1xuXG4gICAgICAgIC8vIEFjY2VwdCBhIHNpbmdsZSBleHRlbnNpb24sIG9yIGFuIGFycmF5IG9mIGV4dGVuc2lvbnNcbiAgICAgICAgdmFyIGV4dGVuc2lvbnMgPSAodGhpcy5zaGFkZXJzICYmIHRoaXMuc2hhZGVycy5leHRlbnNpb25zKTtcbiAgICAgICAgaWYgKHR5cGVvZiBleHRlbnNpb25zID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgZXh0ZW5zaW9ucyA9IFtleHRlbnNpb25zXTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENyZWF0ZSBzaGFkZXJzXG4gICAgICAgIHRoaXMucHJvZ3JhbSA9IG5ldyBTaGFkZXJQcm9ncmFtKFxuICAgICAgICAgICAgdGhpcy5nbCxcbiAgICAgICAgICAgIHRoaXMudmVydGV4X3NoYWRlcl9zcmMsXG4gICAgICAgICAgICB0aGlzLmZyYWdtZW50X3NoYWRlcl9zcmMsXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgbmFtZTogdGhpcy5uYW1lLFxuICAgICAgICAgICAgICAgIGRlZmluZXMsXG4gICAgICAgICAgICAgICAgdW5pZm9ybXMsXG4gICAgICAgICAgICAgICAgYmxvY2tzLFxuICAgICAgICAgICAgICAgIGJsb2NrX3Njb3BlcyxcbiAgICAgICAgICAgICAgICBleHRlbnNpb25zXG4gICAgICAgICAgICB9XG4gICAgICAgICk7XG5cbiAgICAgICAgaWYgKHRoaXMuc2VsZWN0aW9uKSB7XG4gICAgICAgICAgICB0aGlzLnNlbGVjdGlvbl9wcm9ncmFtID0gbmV3IFNoYWRlclByb2dyYW0oXG4gICAgICAgICAgICAgICAgdGhpcy5nbCxcbiAgICAgICAgICAgICAgICB0aGlzLnZlcnRleF9zaGFkZXJfc3JjLFxuICAgICAgICAgICAgICAgIHNoYWRlclNyY19zZWxlY3Rpb25GcmFnbWVudCxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6ICh0aGlzLm5hbWUgKyAnIChzZWxlY3Rpb24pJyksXG4gICAgICAgICAgICAgICAgICAgIGRlZmluZXM6IHNlbGVjdGlvbl9kZWZpbmVzLFxuICAgICAgICAgICAgICAgICAgICB1bmlmb3JtcyxcbiAgICAgICAgICAgICAgICAgICAgYmxvY2tzLFxuICAgICAgICAgICAgICAgICAgICBibG9ja19zY29wZXMsXG4gICAgICAgICAgICAgICAgICAgIGV4dGVuc2lvbnNcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb25fcHJvZ3JhbSA9IG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmNvbXBpbGVfc2V0dXAgPSB0cnVlO1xuICAgIH0sXG5cbiAgICAvLyBBZGQgYSBzaGFkZXIgYmxvY2tcbiAgICBhZGRTaGFkZXJCbG9jayAoa2V5LCBibG9jaywgc2NvcGUgPSBudWxsKSB7XG4gICAgICAgIHRoaXMuc2hhZGVycy5ibG9ja3MgPSB0aGlzLnNoYWRlcnMuYmxvY2tzIHx8IHt9O1xuICAgICAgICB0aGlzLnNoYWRlcnMuYmxvY2tzW2tleV0gPSB0aGlzLnNoYWRlcnMuYmxvY2tzW2tleV0gfHwgW107XG4gICAgICAgIHRoaXMuc2hhZGVycy5ibG9ja3Nba2V5XS5wdXNoKGJsb2NrKTtcblxuICAgICAgICB0aGlzLnNoYWRlcnMuYmxvY2tfc2NvcGVzID0gdGhpcy5zaGFkZXJzLmJsb2NrX3Njb3BlcyB8fCB7fTtcbiAgICAgICAgdGhpcy5zaGFkZXJzLmJsb2NrX3Njb3Blc1trZXldID0gdGhpcy5zaGFkZXJzLmJsb2NrX3Njb3Blc1trZXldIHx8IFtdO1xuICAgICAgICB0aGlzLnNoYWRlcnMuYmxvY2tfc2NvcGVzW2tleV0ucHVzaChzY29wZSk7XG4gICAgfSxcblxuICAgIC8vIFJlbW92ZSBhbGwgc2hhZGVyIGJsb2NrcyBmb3Iga2V5XG4gICAgcmVtb3ZlU2hhZGVyQmxvY2sgKGtleSkge1xuICAgICAgICBpZiAodGhpcy5zaGFkZXJzLmJsb2Nrcykge1xuICAgICAgICAgICAgdGhpcy5zaGFkZXJzLmJsb2Nrc1trZXldID0gbnVsbDtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICByZXBsYWNlU2hhZGVyQmxvY2sgKGtleSwgYmxvY2ssIHNjb3BlID0gbnVsbCkge1xuICAgICAgICB0aGlzLnJlbW92ZVNoYWRlckJsb2NrKGtleSk7XG4gICAgICAgIHRoaXMuYWRkU2hhZGVyQmxvY2soa2V5LCBibG9jaywgc2NvcGUpO1xuICAgIH0sXG5cbiAgICAvKiogVE9ETzogY291bGQgcHJvYmFibHkgY29tYmluZSBhbmQgZ2VuZXJhbGl6ZSB0aGlzIHdpdGggc2ltaWxhciBtZXRob2QgaW4gU2hhZGVyUHJvZ3JhbVxuICAgICAqIChsaXN0IG9mIGRlZmluZSBvYmplY3RzIHRoYXQgaW5oZXJpdCBmcm9tIGVhY2ggb3RoZXIpXG4gICAgICovXG4gICAgYnVpbGREZWZpbmVMaXN0ICgpIHtcbiAgICAgICAgLy8gQWRkIGFueSBjdXN0b20gZGVmaW5lcyB0byBidWlsdC1pbiBzdHlsZSBkZWZpbmVzXG4gICAgICAgIHZhciBkZWZpbmVzID0ge307IC8vIGNyZWF0ZSBhIG5ldyBvYmplY3QgdG8gYXZvaWQgbXV0YXRpbmcgYSBwcm90b3R5cGUgdmFsdWUgdGhhdCBtYXkgYmUgc2hhcmVkIHdpdGggb3RoZXIgc3R5bGVzXG4gICAgICAgIGlmICh0aGlzLmRlZmluZXMgIT0gbnVsbCkge1xuICAgICAgICAgICAgZm9yICh2YXIgZCBpbiB0aGlzLmRlZmluZXMpIHtcbiAgICAgICAgICAgICAgICBkZWZpbmVzW2RdID0gdGhpcy5kZWZpbmVzW2RdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLnNoYWRlcnMgIT0gbnVsbCAmJiB0aGlzLnNoYWRlcnMuZGVmaW5lcyAhPSBudWxsKSB7XG4gICAgICAgICAgICBmb3IgKGQgaW4gdGhpcy5zaGFkZXJzLmRlZmluZXMpIHtcbiAgICAgICAgICAgICAgICBkZWZpbmVzW2RdID0gdGhpcy5zaGFkZXJzLmRlZmluZXNbZF07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGRlZmluZXM7XG5cbiAgICB9LFxuXG4gICAgLy8gRGV0ZXJtaW5lcyBpZiAncmFzdGVyJyBwYXJhbWV0ZXIgaXMgc2V0IHRvIGEgdmFsaWQgdmFsdWVcbiAgICBoYXNSYXN0ZXJzICgpIHtcbiAgICAgICAgcmV0dXJuIChbJ2NvbG9yJywgJ25vcm1hbCcsICdjdXN0b20nXS5pbmRleE9mKHRoaXMucmFzdGVyKSA+IC0xKTtcbiAgICB9LFxuXG4gICAgLy8gU2V0dXAgcmFzdGVyIGFjY2VzcyBpbiBzaGFkZXJzXG4gICAgc2V0dXBSYXN0ZXJzICgpIHtcbiAgICAgICAgaWYgKCF0aGlzLmhhc1Jhc3RlcnMoKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gRW5hYmxlIHJhc3RlciB0ZXh0dXJlcyBhbmQgY29uZmlndXJlIGhvdyBmaXJzdCByYXN0ZXIgaXMgYXBwbGllZFxuICAgICAgICBpZiAodGhpcy5yYXN0ZXIgPT09ICdjb2xvcicpIHtcbiAgICAgICAgICAgIHRoaXMuZGVmaW5lcy5UQU5HUkFNX1JBU1RFUl9URVhUVVJFX0NPTE9SID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0aGlzLnJhc3RlciA9PT0gJ25vcm1hbCcpIHtcbiAgICAgICAgICAgIHRoaXMuZGVmaW5lcy5UQU5HUkFNX1JBU1RFUl9URVhUVVJFX05PUk1BTCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgLy8gZWxzZSBjdXN0b20gcmFzdGVyIChzYW1wbGVycyB3aWxsIGJlIG1hZGUgYXZhaWxhYmxlIGJ1dCBub3QgYXV0b21hdGljYWxseSBhcHBsaWVkKVxuXG4gICAgICAgIC8vIEEgZ2l2ZW4gc3R5bGUgbWF5IGJlIGJ1aWx0IHdpdGggbXVsdGlwbGUgZGF0YSBzb3VyY2VzLCBlYWNoIG9mIHdoaWNoIG1heSBhdHRhY2hcbiAgICAgICAgLy8gYSB2YXJpYWJsZSBudW1iZXIgb2YgcmFzdGVyIHNvdXJjZXMgKDAgdG8gTiwgd2hlcmUgTiBpcyB0aGUgbWF4IG51bWJlciBvZiByYXN0ZXIgc291cmNlc1xuICAgICAgICAvLyBkZWZpbmVkIGZvciB0aGUgc2NlbmUpLiBUaGlzIG1lYW5zIHdlIGRvbid0IGtub3cgKndoaWNoKiBvciAqaG93IG1hbnkqIHJhc3RlcnMgd2lsbCBiZVxuICAgICAgICAvLyBib3VuZCBub3csIGF0IGluaXRpYWwgY29tcGlsZS10aW1lOyB3ZSBvbmx5IGtub3cgdGhpcyBhdCBnZW9tZXRyeSBidWlsZC10aW1lLiBUbyBlbnN1cmVcbiAgICAgICAgLy8gdGhhdCB3ZSBjYW4gYmluZCBhcyBtYW55IHJhc3RlciBzb3VyY2VzIGFzIG5lZWRlZCwgd2UgZGVjbGFyZSBvdXIgdW5pZm9ybSBhcnJheXMgdG8gaG9sZFxuICAgICAgICAvLyB0aGUgbWF4aW11bSBudW1iZXIgb2YgcG9zc2libGUgc291cmNlcy4gQXQgcmVuZGVyIHRpbWUsIG9ubHkgdGhlIG5lY2Vzc2FyeSBudW1iZXIgb2YgcmFzdGVyc1xuICAgICAgICAvLyBhcmUgYm91bmQgKHRoZSByZW1haW5pbmcgc2xvdHMgYXJlbid0IGludGVuZGVkIHRvIGJlIGFjY2Vzc2VkKS5cbiAgICAgICAgbGV0IG51bV9yYXN0ZXJfc291cmNlcyA9XG4gICAgICAgICAgICBPYmplY3Qua2V5cyh0aGlzLnNvdXJjZXMpXG4gICAgICAgICAgICAuZmlsdGVyKHMgPT4gdGhpcy5zb3VyY2VzW3NdIGluc3RhbmNlb2YgUmFzdGVyVGlsZVNvdXJjZSlcbiAgICAgICAgICAgIC5sZW5ndGg7XG5cbiAgICAgICAgdGhpcy5kZWZpbmVzLlRBTkdSQU1fTlVNX1JBU1RFUl9TT1VSQ0VTID0gYGludCgke251bV9yYXN0ZXJfc291cmNlc30pYDtcbiAgICAgICAgaWYgKG51bV9yYXN0ZXJfc291cmNlcyA+IDApIHtcbiAgICAgICAgICAgIC8vIFVzZSBtb2RlbCBwb3NpdGlvbiBvZiB0aWxlJ3MgY29vcmRpbmF0ZSB6b29tIGZvciByYXN0ZXIgdGlsZSB0ZXh0dXJlIFVWc1xuICAgICAgICAgICAgdGhpcy5kZWZpbmVzLlRBTkdSQU1fTU9ERUxfUE9TSVRJT05fQkFTRV9aT09NX1ZBUllJTkcgPSB0cnVlO1xuXG4gICAgICAgICAgICAvLyBVbmlmb3JtcyBhbmQgbWFjcm9zIGZvciByYXN0ZXIgc2FtcGxlcnNcbiAgICAgICAgICAgIHRoaXMucmVwbGFjZVNoYWRlckJsb2NrKCdyYXN0ZXInLCBzaGFkZXJTcmNfcmFzdGVycywgJ1Jhc3RlcicpO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8vIExvYWQgcmFzdGVyIHRpbGUgdGV4dHVyZXMgYW5kIHNldCB1bmlmb3Jtc1xuICAgIGJ1aWxkUmFzdGVyVGV4dHVyZXMgKHRpbGUsIHRpbGVfZGF0YSkge1xuICAgICAgICBpZiAoIXRoaXMuaGFzUmFzdGVycygpKSB7XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHRpbGVfZGF0YSk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgY29uZmlncyA9IHt9OyAvLyB0ZXh0dXJlIGNvbmZpZ3MgdG8gcGFzcyB0byB0ZXh0dXJlIGJ1aWxkZXIsIGtleWVkIGJ5IHRleHR1cmUgbmFtZVxuICAgICAgICBsZXQgaW5kZXggPSB7fTsgICAvLyBpbmRleCBpbnRvIHJhc3RlciBzYW1wbGVyIGFycmF5LCBrZXllZCBieSB0ZXh0dXJlIG5hbWVcblxuICAgICAgICAvLyBUT0RPOiBkYXRhIHNvdXJjZSBjb3VsZCByZXRyaWV2ZSByYXN0ZXIgdGV4dHVyZSBVUkxzXG4gICAgICAgIHRpbGUucmFzdGVycy5tYXAociA9PiB0aGlzLnNvdXJjZXNbcl0pLmZpbHRlcih4ID0+IHgpLmZvckVhY2goKHNvdXJjZSwgaSkgPT4ge1xuICAgICAgICAgICAgaWYgKHNvdXJjZSBpbnN0YW5jZW9mIFJhc3RlclRpbGVTb3VyY2UpIHtcbiAgICAgICAgICAgICAgICBsZXQgY29uZmlnID0gc291cmNlLnRpbGVUZXh0dXJlKHRpbGUpO1xuICAgICAgICAgICAgICAgIGNvbmZpZ3NbY29uZmlnLnVybF0gPSBjb25maWc7XG4gICAgICAgICAgICAgICAgaW5kZXhbY29uZmlnLnVybF0gPSBpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICBpZiAoT2JqZWN0LmtleXMoY29uZmlncykubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHRpbGVfZGF0YSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBMb2FkIHRleHR1cmVzIG9uIG1haW4gdGhyZWFkIGFuZCByZXR1cm4gd2hlbiBkb25lXG4gICAgICAgIC8vIFdlIHdhbnQgdG8gYmxvY2sgdGhlIGJ1aWxkaW5nIG9mIGEgcmFzdGVyIHRpbGUgbWVzaCB1bnRpbCBpdHMgdGV4dHVyZSBpcyBsb2FkZWQsXG4gICAgICAgIC8vIHRvIGF2b2lkIGZsaWNrZXJpbmcgd2hpbGUgbG9hZGluZyAodGV4dHVyZSB3aWxsIHJlbmRlciBhcyBibGFjaylcbiAgICAgICAgcmV0dXJuIFdvcmtlckJyb2tlci5wb3N0TWVzc2FnZSh0aGlzLm1haW5fdGhyZWFkX3RhcmdldCsnLmxvYWRUZXh0dXJlcycsIGNvbmZpZ3MpXG4gICAgICAgICAgICAudGhlbih0ZXh0dXJlcyA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKCF0ZXh0dXJlcyB8fCB0ZXh0dXJlcy5sZW5ndGggPCAxKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IHdhcm5pbmdcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRpbGVfZGF0YTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyBTZXQgdGV4dHVyZSB1bmlmb3JtcyAocmV0dXJuZWQgYWZ0ZXIgbG9hZGluZyBmcm9tIG1haW4gdGhyZWFkKVxuICAgICAgICAgICAgICAgIHRpbGVfZGF0YS51bmlmb3JtcyA9IHRpbGVfZGF0YS51bmlmb3JtcyB8fCB7fTtcbiAgICAgICAgICAgICAgICB0aWxlX2RhdGEudGV4dHVyZXMgPSB0aWxlX2RhdGEudGV4dHVyZXMgfHwgW107XG5cbiAgICAgICAgICAgICAgICBsZXQgdV9zYW1wbGVycyA9IHRpbGVfZGF0YS51bmlmb3Jtc1sndV9yYXN0ZXJzJ10gPSBbXTtcbiAgICAgICAgICAgICAgICBsZXQgdV9zaXplcyA9IHRpbGVfZGF0YS51bmlmb3Jtc1sndV9yYXN0ZXJfc2l6ZXMnXSA9IFtdO1xuICAgICAgICAgICAgICAgIGxldCB1X29mZnNldHMgPSB0aWxlX2RhdGEudW5pZm9ybXNbJ3VfcmFzdGVyX29mZnNldHMnXSA9IFtdO1xuXG4gICAgICAgICAgICAgICAgdGV4dHVyZXMuZm9yRWFjaCgoW3RuYW1lLCB0d2lkdGgsIHRoZWlnaHRdKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBpID0gaW5kZXhbdG5hbWVdO1xuICAgICAgICAgICAgICAgICAgICBsZXQgcmFzdGVyX2Nvb3JkcyA9IGNvbmZpZ3NbdG5hbWVdLmNvb3JkczsgLy8gdGlsZSBjb29yZHMgb2YgcmFzdGVyIHRpbGVcblxuICAgICAgICAgICAgICAgICAgICB1X3NhbXBsZXJzW2ldID0gdG5hbWU7XG4gICAgICAgICAgICAgICAgICAgIHRpbGVfZGF0YS50ZXh0dXJlcy5wdXNoKHRuYW1lKTtcblxuICAgICAgICAgICAgICAgICAgICB1X3NpemVzW2ldID0gW3R3aWR0aCwgdGhlaWdodF07XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gVGlsZSBnZW9tZXRyeSBtYXkgYmUgYXQgYSBoaWdoZXIgem9vbSB0aGFuIHRoZSByYXN0ZXIgdGlsZSB0ZXh0dXJlLFxuICAgICAgICAgICAgICAgICAgICAvLyAoZS5nLiBhbiBvdmVyem9vbWVkIHJhc3RlciB0aWxlKSwgaW4gd2hpY2ggY2FzZSB3ZSBuZWVkIHRvIGFkanVzdCB0aGVcbiAgICAgICAgICAgICAgICAgICAgLy8gcmFzdGVyIHRleHR1cmUgVVZzIHRvIG9mZnNldCB0byB0aGUgYXBwcm9wcmlhdGUgc3RhcnRpbmcgcG9pbnQgZm9yXG4gICAgICAgICAgICAgICAgICAgIC8vIHRoaXMgZ2VvbWV0cnkgdGlsZS5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHRpbGUuY29vcmRzLnogPiByYXN0ZXJfY29vcmRzLnopIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBkeiA9IHRpbGUuY29vcmRzLnogLSByYXN0ZXJfY29vcmRzLno7IC8vICMgb2YgbGV2ZWxzIHJhc3RlciBzb3VyY2UgaXMgb3Zlcnpvb21lZFxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGR6MiA9IE1hdGgucG93KDIsIGR6KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHVfb2Zmc2V0c1tpXSA9IFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAodGlsZS5jb29yZHMueCAlIGR6MikgLyBkejIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGR6MiAtIDEgLSAodGlsZS5jb29yZHMueSAlIGR6MikpIC8gZHoyLCAvLyBHTCB0ZXh0dXJlIGNvb3JkcyBhcmUgK1kgdXBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAxIC8gZHoyXG4gICAgICAgICAgICAgICAgICAgICAgICBdO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgdV9vZmZzZXRzW2ldID0gWzAsIDAsIDFdO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gdGlsZV9kYXRhO1xuICAgICAgICAgICAgfVxuICAgICAgICApO1xuICAgIH0sXG5cbiAgICAvLyBDYWxsZWQgb24gbWFpbiB0aHJlYWRcbiAgICBsb2FkVGV4dHVyZXMgKHRleHR1cmVzKSB7XG4gICAgICAgIC8vIE5COiBvbmx5IHJldHVybiBuYW1lIGFuZCBzaXplIG9mIHRleHR1cmVzIGxvYWRlZCwgYmVjYXVzZSB3ZSBjYW4ndCBzZW5kIGFjdHVhbCB0ZXh0dXJlIG9iamVjdHMgdG8gd29ya2VyXG4gICAgICAgIHJldHVybiBUZXh0dXJlLmNyZWF0ZUZyb21PYmplY3QodGhpcy5nbCwgdGV4dHVyZXMpXG4gICAgICAgICAgICAudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFByb21pc2UuYWxsKE9iamVjdC5rZXlzKHRleHR1cmVzKS5tYXAodCA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBUZXh0dXJlLnRleHR1cmVzW3RdICYmIFRleHR1cmUudGV4dHVyZXNbdF0ubG9hZCgpO1xuICAgICAgICAgICAgICAgIH0pLmZpbHRlcih4ID0+IHgpKTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAudGhlbih0ZXh0dXJlcyA9PiB7XG4gICAgICAgICAgICAgICAgdGV4dHVyZXMuZm9yRWFjaCh0ID0+IHQucmV0YWluKCkpO1xuICAgICAgICAgICAgICAgIHJldHVybiB0ZXh0dXJlcy5tYXAodCA9PiBbdC5uYW1lLCB0LndpZHRoLCB0LmhlaWdodF0pO1xuICAgICAgICAgICAgfSk7XG4gICAgfSxcblxuICAgIC8vIFNldHVwIGFueSBHTCBzdGF0ZSBmb3IgcmVuZGVyaW5nXG4gICAgc2V0dXAgKCkge1xuICAgICAgICB0aGlzLnNldFVuaWZvcm1zKCk7XG4gICAgICAgIHRoaXMubWF0ZXJpYWwuc2V0dXBQcm9ncmFtKFNoYWRlclByb2dyYW0uY3VycmVudCk7XG4gICAgfSxcblxuICAgIC8vIFNldCBzdHlsZSB1bmlmb3JtcyBvbiBjdXJyZW50bHkgYm91bmQgcHJvZ3JhbVxuICAgIHNldFVuaWZvcm1zICgpIHtcbiAgICAgICAgdmFyIHByb2dyYW0gPSBTaGFkZXJQcm9ncmFtLmN1cnJlbnQ7XG4gICAgICAgIGlmICghcHJvZ3JhbSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgcHJvZ3JhbS5zZXRVbmlmb3Jtcyh0aGlzLnNoYWRlcnMgJiYgdGhpcy5zaGFkZXJzLnVuaWZvcm1zLCB0cnVlKTsgLy8gcmVzZXQgdGV4dHVyZSB1bml0IHRvIDBcbiAgICB9LFxuXG4gICAgLy8gUmVuZGVyIHN0YXRlIHNldHRpbmdzIGJ5IGJsZW5kIG1vZGVcbiAgICByZW5kZXJfc3RhdGVzOiB7XG4gICAgICAgIG9wYXF1ZTogeyBkZXB0aF90ZXN0OiB0cnVlLCBkZXB0aF93cml0ZTogdHJ1ZSB9LFxuICAgICAgICBhZGQ6IHsgZGVwdGhfdGVzdDogdHJ1ZSwgZGVwdGhfd3JpdGU6IGZhbHNlIH0sXG4gICAgICAgIG11bHRpcGx5OiB7IGRlcHRoX3Rlc3Q6IHRydWUsIGRlcHRoX3dyaXRlOiBmYWxzZSB9LFxuICAgICAgICBpbmxheTogeyBkZXB0aF90ZXN0OiB0cnVlLCBkZXB0aF93cml0ZTogZmFsc2UgfSxcbiAgICAgICAgb3ZlcmxheTogeyBkZXB0aF90ZXN0OiBmYWxzZSwgZGVwdGhfd3JpdGU6IGZhbHNlIH1cbiAgICB9LFxuXG4gICAgLy8gRGVmYXVsdCBzb3J0IG9yZGVyIGZvciBibGVuZCBtb2Rlc1xuICAgIGRlZmF1bHRfYmxlbmRfb3JkZXJzOiB7XG4gICAgICAgIG9wYXF1ZTogMCxcbiAgICAgICAgYWRkOiAxLFxuICAgICAgICBtdWx0aXBseTogMixcbiAgICAgICAgaW5sYXk6IDMsXG4gICAgICAgIG92ZXJsYXk6IDRcbiAgICB9LFxuXG4gICAgLy8gQ29tcGFyaXNvbiBmdW5jdGlvbiBmb3Igc29ydGluZyBzdHlsZXMgYnkgYmxlbmRcbiAgICBibGVuZE9yZGVyU29ydCAoYSwgYikge1xuICAgICAgICAvLyBvcGFxdWUgYWx3YXlzIGNvbWVzIGZpcnN0XG4gICAgICAgIGlmIChhLmJsZW5kID09PSAnb3BhcXVlJyB8fCBiLmJsZW5kID09PSAnb3BhcXVlJykge1xuICAgICAgICAgICAgaWYgKGEuYmxlbmQgPT09ICdvcGFxdWUnICYmIGIuYmxlbmQgPT09ICdvcGFxdWUnKSB7IC8vIGlmIGJvdGggYXJlIG9wYXF1ZVxuICAgICAgICAgICAgICAgIHJldHVybiBhLm5hbWUgPCBiLm5hbWUgPyAtMSA6IDE7IC8vIHVzZSBuYW1lIGFzIHRpZSBicmVha2VyXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChhLmJsZW5kID09PSAnb3BhcXVlJykge1xuICAgICAgICAgICAgICAgIHJldHVybiAtMTsgLy8gb25seSBgYWAgd2FzIG9wYXF1ZVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIDE7IC8vIG9ubHkgYGJgIHdhcyBvcGFxdWVcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHVzZSBleHBsaWNpdCBibGVuZCBvcmRlciBpZiBwb3NzaWJsZVxuICAgICAgICBpZiAoYS5ibGVuZF9vcmRlciA8IGIuYmxlbmRfb3JkZXIpIHtcbiAgICAgICAgICAgIHJldHVybiAtMTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChhLmJsZW5kX29yZGVyID4gYi5ibGVuZF9vcmRlcikge1xuICAgICAgICAgICAgcmV0dXJuIDE7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBpZiBibGVuZCBvcmRlcnMgYXJlIGVxdWFsLCB1c2UgZGVmYXVsdCBvcmRlciBieSBibGVuZCBtb2RlXG4gICAgICAgIGlmIChTdHlsZS5kZWZhdWx0X2JsZW5kX29yZGVyc1thLmJsZW5kXSA8IFN0eWxlLmRlZmF1bHRfYmxlbmRfb3JkZXJzW2IuYmxlbmRdKSB7XG4gICAgICAgICAgICByZXR1cm4gLTE7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoU3R5bGUuZGVmYXVsdF9ibGVuZF9vcmRlcnNbYS5ibGVuZF0gPiBTdHlsZS5kZWZhdWx0X2JsZW5kX29yZGVyc1tiLmJsZW5kXSkge1xuICAgICAgICAgICAgcmV0dXJuIDE7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gYS5uYW1lIDwgYi5uYW1lID8gLTEgOiAxOyAvLyB1c2UgbmFtZSBhcyB0aWUgYnJlYWtlclxuICAgIH1cblxufTtcbiIsIi8vIE1hbmFnZSByZW5kZXJpbmcgc3R5bGVzXG5pbXBvcnQgU2hhZGVyUHJvZ3JhbSBmcm9tICcuLi9nbC9zaGFkZXJfcHJvZ3JhbSc7XG5pbXBvcnQgbWVyZ2VPYmplY3RzIGZyb20gJy4uL3V0aWxzL21lcmdlJztcbmltcG9ydCBHZW8gZnJvbSAnLi4vZ2VvJztcbmltcG9ydCBsb2cgZnJvbSAnLi4vdXRpbHMvbG9nJztcblxuaW1wb3J0IHtQb2x5Z29uc30gZnJvbSAnLi9wb2x5Z29ucy9wb2x5Z29ucyc7XG5pbXBvcnQge0xpbmVzfSBmcm9tICcuL2xpbmVzL2xpbmVzJztcbmltcG9ydCB7UG9pbnRzfSBmcm9tICcuL3BvaW50cy9wb2ludHMnO1xuaW1wb3J0IHtUZXh0U3R5bGV9IGZyb20gJy4vdGV4dC90ZXh0JztcbmltcG9ydCB7UmFzdGVyU3R5bGV9IGZyb20gJy4vcmFzdGVyL3Jhc3Rlcic7XG5cbmxldCBmcyA9IHJlcXVpcmUoJ2ZzJyk7XG5jb25zdCBzaGFkZXJTcmNfYWNjZXNzb3JzID0gZnMucmVhZEZpbGVTeW5jKF9fZGlybmFtZSArICcvLi4vZ2wvc2hhZGVycy9hY2Nlc3NvcnMuZ2xzbCcsICd1dGY4Jyk7XG5jb25zdCBzaGFkZXJTcmNfbGF5ZXJPcmRlciA9IGZzLnJlYWRGaWxlU3luYyhfX2Rpcm5hbWUgKyAnLy4uL2dsL3NoYWRlcnMvbGF5ZXJfb3JkZXIuZ2xzbCcsICd1dGY4Jyk7XG5jb25zdCBzaGFkZXJTcmNfc2VsZWN0aW9uR2xvYmFscyA9IGZzLnJlYWRGaWxlU3luYyhfX2Rpcm5hbWUgKyAnLy4uL2dsL3NoYWRlcnMvc2VsZWN0aW9uX2dsb2JhbHMuZ2xzbCcsICd1dGY4Jyk7XG5jb25zdCBzaGFkZXJTcmNfc2VsZWN0aW9uVmVydGV4ID0gZnMucmVhZEZpbGVTeW5jKF9fZGlybmFtZSArICcvLi4vZ2wvc2hhZGVycy9zZWxlY3Rpb25fdmVydGV4Lmdsc2wnLCAndXRmOCcpO1xuXG5leHBvcnQgY2xhc3MgU3R5bGVNYW5hZ2VyIHtcblxuICAgIGNvbnN0cnVjdG9yICgpIHtcbiAgICAgICAgdGhpcy5zdHlsZXMgPSB7fTtcbiAgICAgICAgdGhpcy5iYXNlX3N0eWxlcyA9IHt9O1xuXG4gICAgICAgIC8vIEFkZCBidWlsdC1pbiByZW5kZXJpbmcgc3R5bGVzXG4gICAgICAgIHRoaXMucmVnaXN0ZXIoT2JqZWN0LmNyZWF0ZShQb2x5Z29ucykpO1xuICAgICAgICB0aGlzLnJlZ2lzdGVyKE9iamVjdC5jcmVhdGUoTGluZXMpKTtcbiAgICAgICAgdGhpcy5yZWdpc3RlcihPYmplY3QuY3JlYXRlKFBvaW50cykpO1xuICAgICAgICB0aGlzLnJlZ2lzdGVyKE9iamVjdC5jcmVhdGUoVGV4dFN0eWxlKSk7XG4gICAgICAgIHRoaXMucmVnaXN0ZXIoT2JqZWN0LmNyZWF0ZShSYXN0ZXJTdHlsZSkpO1xuICAgIH1cblxuICAgIC8vIEdsb2JhbCBjb25maWd1cmF0aW9uIGZvciBhbGwgc3R5bGVzXG4gICAgaW5pdCAoKSB7XG4gICAgICAgIFNoYWRlclByb2dyYW0ucmVtb3ZlQmxvY2soJ2dsb2JhbCcpO1xuICAgICAgICBTaGFkZXJQcm9ncmFtLnJlbW92ZUJsb2NrKCdzZXR1cCcpO1xuXG4gICAgICAgIC8vIE1vZGVsIGFuZCB3b3JsZCBwb3NpdGlvbiBhY2Nlc3NvcnNcbiAgICAgICAgU2hhZGVyUHJvZ3JhbS5hZGRCbG9jaygnZ2xvYmFsJywgc2hhZGVyU3JjX2FjY2Vzc29ycyk7XG5cbiAgICAgICAgLy8gTGF5ZXIgcmUtb3JkZXJpbmcgZnVuY3Rpb25cbiAgICAgICAgU2hhZGVyUHJvZ3JhbS5hZGRCbG9jaygnZ2xvYmFsJywgc2hhZGVyU3JjX2xheWVyT3JkZXIpO1xuXG4gICAgICAgIC8vIEZlYXR1cmUgc2VsZWN0aW9uIGdsb2JhbFxuICAgICAgICBTaGFkZXJQcm9ncmFtLmFkZEJsb2NrKCdnbG9iYWwnLCBzaGFkZXJTcmNfc2VsZWN0aW9uR2xvYmFscyk7XG5cbiAgICAgICAgLy8gRmVhdHVyZSBzZWxlY3Rpb24gdmVydGV4IHNoYWRlciBzdXBwb3J0XG4gICAgICAgIFNoYWRlclByb2dyYW0ucmVwbGFjZUJsb2NrKCdzZXR1cCcsIHNoYWRlclNyY19zZWxlY3Rpb25WZXJ0ZXgpO1xuXG4gICAgICAgIC8vIE1pbmltdW0gdmFsdWUgZm9yIGZsb2F0IGNvbXBhcmlzb25zXG4gICAgICAgIFNoYWRlclByb2dyYW0uZGVmaW5lcy5UQU5HUkFNX0VQU0lMT04gPSAwLjAwMDAxO1xuXG4gICAgICAgIC8vIE1pbmltdW0gZGVwdGggYnVmZmVyIHZhbHVlIHNlcGFyYXRpbmcgZWFjaCBgb3JkZXJgIHVuaXRcbiAgICAgICAgLy8gQXNzdW1lIG1pbiAxNi1iaXQgZGVwdGggYnVmZmVyLCBpbiBwcmFjdGljZSB1c2VzIDE0LWJpdHMsIDEgZXh0cmEgYml0IHRvIGhhbmRsZSB2aXJ0dWFsIGhhbGYtbGF5ZXJzXG4gICAgICAgIC8vIGZvciBvdXRsaW5lcyAoaW5zZXJ0ZWQgaW4gYmV0d2VlbiBsYXllcnMpLCBhbm90aGVyIGV4dHJhIGJpdCB0byBwcmV2ZW50IHByZWNpc2lvbiBsb3NzXG4gICAgICAgIFNoYWRlclByb2dyYW0uZGVmaW5lcy5UQU5HUkFNX0xBWUVSX0RFTFRBID0gMSAvICgxIDw8IDE0KTtcblxuICAgICAgICAvLyBJbnRlcm5hbCB0aWxlIHNjYWxlXG4gICAgICAgIFNoYWRlclByb2dyYW0uZGVmaW5lcy5UQU5HUkFNX1RJTEVfU0NBTEUgPVxuICAgICAgICAgICAgYHZlYzMoJHtHZW8udGlsZV9zY2FsZX0uLCAke0dlby50aWxlX3NjYWxlfS4sIHVfbWV0ZXJzX3Blcl9waXhlbCAqICR7R2VvLnRpbGVfc2l6ZX0uKWA7XG5cbiAgICAgICAgLy8gSW5jcmVhc2VzIHByZWNpc2lvbiBmb3IgaGVpZ2h0IHZhbHVlc1xuICAgICAgICBTaGFkZXJQcm9ncmFtLmRlZmluZXMuVEFOR1JBTV9IRUlHSFRfU0NBTEUgPSBHZW8uaGVpZ2h0X3NjYWxlO1xuICAgIH1cblxuICAgIC8vIERlc3Ryb3kgYWxsIHN0eWxlcyBmb3IgYSBnaXZlbiBHTCBjb250ZXh0XG4gICAgZGVzdHJveSAoZ2wpIHtcbiAgICAgICAgT2JqZWN0LmtleXModGhpcy5zdHlsZXMpLmZvckVhY2goKF9uYW1lKSA9PiB7XG4gICAgICAgICAgICBsZXQgc3R5bGUgPSB0aGlzLnN0eWxlc1tfbmFtZV07XG4gICAgICAgICAgICBpZiAoc3R5bGUuZ2wgPT09IGdsKSB7XG4gICAgICAgICAgICAgICAgbG9nKCd0cmFjZScsIGBTdHlsZU1hbmFnZXIuZGVzdHJveTogZGVzdHJveWluZyByZW5kZXIgc3R5bGUgJHtzdHlsZS5uYW1lfWApO1xuXG4gICAgICAgICAgICAgICAgaWYgKHN0eWxlLmJhc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZW1vdmUoc3R5bGUubmFtZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHN0eWxlLmRlc3Ryb3koKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gUmVnaXN0ZXIgYSBzdHlsZVxuICAgIHJlZ2lzdGVyIChzdHlsZSkge1xuICAgICAgICB0aGlzLnN0eWxlc1tzdHlsZS5uYW1lXSA9IHN0eWxlO1xuICAgICAgICB0aGlzLmJhc2Vfc3R5bGVzW3N0eWxlLm5hbWVdID0gc3R5bGU7XG4gICAgfVxuXG4gICAgLy8gUmVtb3ZlIGEgc3R5bGVcbiAgICByZW1vdmUgKG5hbWUpIHtcbiAgICAgICAgZGVsZXRlIHRoaXMuc3R5bGVzW25hbWVdO1xuICAgIH1cblxuICAgIG1peCAoc3R5bGUsIHN0eWxlcykge1xuICAgICAgICAvLyBFeGl0IGVhcmx5IGlmIHdlIGhhdmUgYWxyZWFkeSBhcHBsaWVkIG1peGlucyB0byB0aGlzIHN0eWxlXG4gICAgICAgIGlmIChzdHlsZS5taXhlZCkge1xuICAgICAgICAgICAgcmV0dXJuIHN0eWxlO1xuICAgICAgICB9XG4gICAgICAgIHN0eWxlLm1peGVkID0ge307XG5cbiAgICAgICAgLy8gTWl4aW4gc291cmNlcywgaW4gb3JkZXJcbiAgICAgICAgbGV0IHNvdXJjZXMgPSBbXTtcbiAgICAgICAgaWYgKHN0eWxlLm1peCkge1xuICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoc3R5bGUubWl4KSkge1xuICAgICAgICAgICAgICAgIHNvdXJjZXMucHVzaCguLi5zdHlsZS5taXgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgc291cmNlcy5wdXNoKHN0eWxlLm1peCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzb3VyY2VzID0gc291cmNlcy5tYXAoeCA9PiBzdHlsZXNbeF0pLmZpbHRlcih4ID0+IHggJiYgeCAhPT0gc3R5bGUpOyAvLyBUT0RPOiB3YXJuaW5nIG9uIHRyeWluZyB0byBtaXggaW50byBzZWxmXG5cbiAgICAgICAgICAgIC8vIFRyYWNrIHdoaWNoIHN0eWxlcyB3ZXJlIG1peGVkIGludG8gdGhpcyBvbmVcbiAgICAgICAgICAgIHNvdXJjZXMuZm9yRWFjaChzID0+IHN0eWxlLm1peGVkW3MubmFtZV0gPSB0cnVlKTtcbiAgICAgICAgfVxuICAgICAgICBzb3VyY2VzLnB1c2goc3R5bGUpO1xuXG4gICAgICAgIC8vIEZsYWdzIC0gT1InZCwgdHJ1ZSBpZiBhbnkgc3R5bGUgaGFzIGl0IHNldFxuICAgICAgICBzdHlsZS5hbmltYXRlZCA9IHNvdXJjZXMuc29tZSh4ID0+IHggJiYgeC5hbmltYXRlZCk7XG4gICAgICAgIHN0eWxlLnRleGNvb3JkcyA9IHNvdXJjZXMuc29tZSh4ID0+IHggJiYgeC50ZXhjb29yZHMpO1xuXG4gICAgICAgIC8vIE92ZXJ3cml0ZXMgLSBsYXN0IGRlZmluaXRpb24gd2luc1xuICAgICAgICBzdHlsZS5iYXNlID0gc291cmNlcy5tYXAoeCA9PiB4LmJhc2UpLmZpbHRlcih4ID0+IHgpLnBvcCgpO1xuICAgICAgICBzdHlsZS5saWdodGluZyA9IHNvdXJjZXMubWFwKHggPT4geC5saWdodGluZykuZmlsdGVyKHggPT4geCAhPSBudWxsKS5wb3AoKTtcbiAgICAgICAgc3R5bGUudGV4dHVyZSA9IHNvdXJjZXMubWFwKHggPT4geC50ZXh0dXJlKS5maWx0ZXIoeCA9PiB4KS5wb3AoKTtcbiAgICAgICAgc3R5bGUucmFzdGVyID0gc291cmNlcy5tYXAoeCA9PiB4LnJhc3RlcikuZmlsdGVyKHggPT4geCAhPSBudWxsKS5wb3AoKTtcbiAgICAgICAgc3R5bGUuZGFzaCA9IHNvdXJjZXMubWFwKHggPT4geC5kYXNoKS5maWx0ZXIoeCA9PiB4ICE9IG51bGwpLnBvcCgpO1xuICAgICAgICBzdHlsZS5kYXNoX2JhY2tncm91bmRfY29sb3IgPSBzb3VyY2VzLm1hcCh4ID0+IHguZGFzaF9iYWNrZ3JvdW5kX2NvbG9yKS5maWx0ZXIoeCA9PiB4ICE9IG51bGwpLnBvcCgpO1xuICAgICAgICBpZiAoc291cmNlcy5zb21lKHggPT4geC5oYXNPd25Qcm9wZXJ0eSgnYmxlbmQnKSAmJiB4LmJsZW5kKSkge1xuICAgICAgICAgICAgLy8gb25seSBtaXggYmxlbmQgaWYgZXhwbGljaXRseSBzZXQsIG90aGVyd2lzZSBsZXQgYmFzZSBzdHlsZSBjaG9vc2UgYmxlbmRpbmcgbW9kZVxuICAgICAgICAgICAgLy8gaGFzT3duUHJvcGVydHkgY2hlY2sgZ2l2ZXMgcHJlZmVyZW5jZSB0byBiYXNlIHN0eWxlIHByb3RvdHlwZVxuICAgICAgICAgICAgc3R5bGUuYmxlbmQgPSBzb3VyY2VzLm1hcCh4ID0+IHguaGFzT3duUHJvcGVydHkoJ2JsZW5kJykgJiYgeC5ibGVuZCkuZmlsdGVyKHggPT4geCkucG9wKCk7XG4gICAgICAgIH1cbiAgICAgICAgc3R5bGUuYmxlbmRfb3JkZXIgPSBzb3VyY2VzLm1hcCh4ID0+IHguYmxlbmRfb3JkZXIpLmZpbHRlcih4ID0+IHggIT0gbnVsbCkucG9wKCk7XG5cbiAgICAgICAgLy8gTWVyZ2VzIC0gcHJvcGVydHktc3BlY2lmaWMgcnVsZXMgZm9yIG1lcmdpbmcgdmFsdWVzXG4gICAgICAgIHN0eWxlLmRlZmluZXMgPSBPYmplY3QuYXNzaWduKHt9LCAuLi5zb3VyY2VzLm1hcCh4ID0+IHguZGVmaW5lcykuZmlsdGVyKHggPT4geCkpOyAvLyBpbnRlcm5hbCBkZWZpbmVzIChub3QgdXNlci1kZWZpbmVkKVxuICAgICAgICBzdHlsZS5tYXRlcmlhbCA9IE9iamVjdC5hc3NpZ24oe30sIC4uLnNvdXJjZXMubWFwKHggPT4geC5tYXRlcmlhbCkuZmlsdGVyKHggPT4geCkpO1xuXG4gICAgICAgIC8vIE1peCBzaGFkZXIgcHJvcGVydGllc1xuICAgICAgICB0aGlzLm1peFNoYWRlcnMoc3R5bGUsIHN0eWxlcywgc291cmNlcyk7XG4gICAgICAgIHJldHVybiBzdHlsZTtcbiAgICB9XG5cbiAgICAvLyBNaXggdGhlIHByb3BlcnRlcyBpbiB0aGUgXCJzaGFkZXJzXCIgYmxvY2tcbiAgICBtaXhTaGFkZXJzIChzdHlsZSwgc3R5bGVzLCBzb3VyY2VzKSB7XG4gICAgICAgIGxldCBzaGFkZXJzID0ge307IC8vIG5ld2x5IG1peGVkIHNoYWRlcnMgcHJvcGVydGllc1xuICAgICAgICBsZXQgc2hhZGVyX21lcmdlcyA9IHNvdXJjZXMubWFwKHggPT4geC5zaGFkZXJzKS5maWx0ZXIoeCA9PiB4KTsgLy8ganVzdCB0aGUgc291cmNlIHN0eWxlcyB3aXRoIHNoYWRlciBwcm9wZXJ0aWVzXG5cbiAgICAgICAgLy8gRGVmaW5lc1xuICAgICAgICBzaGFkZXJzLmRlZmluZXMgPSBPYmplY3QuYXNzaWduKHt9LCAuLi5zaGFkZXJfbWVyZ2VzLm1hcCh4ID0+IHguZGVmaW5lcykuZmlsdGVyKHggPT4geCkpO1xuXG4gICAgICAgIC8vIFVuaWZvcm1zXG4gICAgICAgIHNoYWRlcnMudW5pZm9ybXMgPSB7fTsgIC8vIHVuaWZvcm1zIGZvciB0aGlzIHN0eWxlLCBib3RoIGV4cGxpY2l0bHkgZGVmaW5lZCwgYW5kIG1peGVkIGZyb20gb3RoZXIgc3R5bGVzXG4gICAgICAgIHNoYWRlcnMuX3VuaWZvcm1zID0gKHN0eWxlLnNoYWRlcnMgJiYgc3R5bGUuc2hhZGVycy51bmlmb3JtcykgfHwge307IC8vIHVuaWZvcm1zIGV4cGxpY2l0bHkgZGVmaW5lZCBieSAqdGhpcyogc3R5bGVcbiAgICAgICAgc2hhZGVycy5fdW5pZm9ybV9zY29wZXMgPSB7fTsgLy8gdHJhY2tzIHdoaWNoIHN0eWxlIGVhY2ggdW5pZm9ybSBvcmlnaW5hdGVkIGZyb20gKHRoaXMgb25lLCBvciBhbmNlc3RvcilcblxuICAgICAgICAvLyBNaXggaW4gdW5pZm9ybXMgZnJvbSBhbmNlc3RvcnMsIHByb3ZpZGluZyBtZWFucyB0byBhY2Nlc3NcbiAgICAgICAgc291cmNlc1xuICAgICAgICAgICAgLmZpbHRlcih4ID0+IHguc2hhZGVycyAmJiB4LnNoYWRlcnMudW5pZm9ybXMpXG4gICAgICAgICAgICAuZm9yRWFjaCh4ID0+IHtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCB1IGluIHguc2hhZGVycy51bmlmb3Jtcykge1xuICAgICAgICAgICAgICAgICAgICBzaGFkZXJzLl91bmlmb3JtX3Njb3Blc1t1XSA9IHgubmFtZTtcblxuICAgICAgICAgICAgICAgICAgICAvLyBEZWZpbmUgZ2V0dGVyIGFuZCBzZXR0ZXIgZm9yIHRoaXMgdW5pZm9ybVxuICAgICAgICAgICAgICAgICAgICAvLyBHZXR0ZXIgcmV0dXJucyB2YWx1ZSBmb3IgdGhpcyBzdHlsZSBpZiBwcmVzZW50LCBvdGhlcndpc2UgYXNrcyBhcHByb3ByaWF0ZSBhbmNlc3RvciBmb3IgaXRcbiAgICAgICAgICAgICAgICAgICAgLy8gU2V0dGVyIHNldHMgdGhlIHZhbHVlIGZvciB0aGlzIHN0eWxlICh3aGV0aGVyIHByZXZpb3VzbHkgcHJlc2VudCBpbiB0aGlzIHN0eWxlIG9yIG5vdClcbiAgICAgICAgICAgICAgICAgICAgLy8gTWltaWNzIEpTIHByb3RvdHlwZS9oYXNPd25Qcm9wZXJ0eSBiZWhhdmlvciwgYnV0IHdpdGggbXVsdGlwbGUgYW5jZXN0b3JzICh2aWEgbWl4aW5zKVxuICAgICAgICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoc2hhZGVycy51bmlmb3JtcywgdSwge1xuICAgICAgICAgICAgICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFVuaWZvcm0gaXMgZXhwbGljaXRseSBkZWZpbmVkIG9uIHRoaXMgc3R5bGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2hhZGVycy5fdW5pZm9ybXNbdV0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2hhZGVycy5fdW5pZm9ybXNbdV07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFVuaWZvcm0gd2FzIG1peGVkIGZyb20gYW5vdGhlciBzdHlsZSwgZm9yd2FyZCByZXF1ZXN0IHRoZXJlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWRlbnRpZnkgY2hlY2sgaXMgbmVlZGVkIHRvIHByZXZlbnQgaW5maW5pdGUgcmVjdXJzaW9uIGlmIGEgcHJldmlvdXNseSBkZWZpbmVkIHVuaWZvcm1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpcyBzZXQgdG8gdW5kZWZpbmVkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoc3R5bGVzW3NoYWRlcnMuX3VuaWZvcm1fc2NvcGVzW3VdXS5zaGFkZXJzLnVuaWZvcm1zICE9PSBzaGFkZXJzLnVuaWZvcm1zKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzdHlsZXNbc2hhZGVycy5fdW5pZm9ybV9zY29wZXNbdV1dLnNoYWRlcnMudW5pZm9ybXNbdV07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHNldDogZnVuY3Rpb24gKHYpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaGFkZXJzLl91bmlmb3Jtc1t1XSA9IHY7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgIC8vIEV4dGVuc2lvbnM6IGJ1aWxkIGEgbGlzdCBvZiB1bmlxdWUgZXh0ZW5zaW9uc1xuICAgICAgICBzaGFkZXJzLmV4dGVuc2lvbnMgPSBPYmplY3Qua2V5cyhzaGFkZXJfbWVyZ2VzXG4gICAgICAgICAgICAubWFwKHggPT4geC5leHRlbnNpb25zKVxuICAgICAgICAgICAgLmZpbHRlcih4ID0+IHgpXG4gICAgICAgICAgICAucmVkdWNlKChwcmV2LCBjdXIpID0+IHtcbiAgICAgICAgICAgICAgICAvLyBzaW5nbGUgZXh0ZW5zaW9uXG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBjdXIgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgICAgIHByZXZbY3VyXSA9IHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIGFycmF5IG9mIGV4dGVuc2lvbnNcbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgY3VyLmZvckVhY2goeCA9PiBwcmV2W3hdID0gdHJ1ZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBwcmV2O1xuICAgICAgICAgICAgfSwge30pIHx8IHt9XG4gICAgICAgICk7XG5cbiAgICAgICAgLy8gU2hhZGVyIGJsb2Nrc1xuICAgICAgICAvLyBNYXJrIGFsbCBzaGFkZXIgYmxvY2tzIGZvciB0aGUgdGFyZ2V0IHN0eWxlIGFzIG9yaWdpbmF0aW5nIHdpdGggaXRzIG93biBuYW1lXG4gICAgICAgIGlmIChzdHlsZS5zaGFkZXJzICYmIHN0eWxlLnNoYWRlcnMuYmxvY2tzKSB7XG4gICAgICAgICAgICBzdHlsZS5zaGFkZXJzLmJsb2NrX3Njb3BlcyA9IHN0eWxlLnNoYWRlcnMuYmxvY2tfc2NvcGVzIHx8IHt9O1xuICAgICAgICAgICAgZm9yIChsZXQgayBpbiBzdHlsZS5zaGFkZXJzLmJsb2Nrcykge1xuICAgICAgICAgICAgICAgIGxldCBibG9jayA9IHN0eWxlLnNoYWRlcnMuYmxvY2tzW2tdO1xuICAgICAgICAgICAgICAgIHN0eWxlLnNoYWRlcnMuYmxvY2tfc2NvcGVzW2tdID0gc3R5bGUuc2hhZGVycy5ibG9ja19zY29wZXNba10gfHwgW107XG4gICAgICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoYmxvY2spKSB7XG4gICAgICAgICAgICAgICAgICAgIHN0eWxlLnNoYWRlcnMuYmxvY2tfc2NvcGVzW2tdLnB1c2goLi4uYmxvY2subWFwKCgpID0+IHN0eWxlLm5hbWUpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHN0eWxlLnNoYWRlcnMuYmxvY2tfc2NvcGVzW2tdLnB1c2goc3R5bGUubmFtZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gTWVyZ2Ugc2hhZGVyIGJsb2Nrcywga2VlcGluZyB0cmFjayBvZiB3aGljaCBzdHlsZSBlYWNoIGJsb2NrIG9yaWdpbmF0ZWQgZnJvbVxuICAgICAgICBsZXQgbWl4ZWQgPSB7fTsgLy8gYWxsIHNjb3BlcyBtaXhlZCBzbyBmYXJcbiAgICAgICAgc2hhZGVyX21lcmdlcy5mb3JFYWNoKHNvdXJjZSA9PiB7XG4gICAgICAgICAgICBpZiAoIXNvdXJjZS5ibG9ja3MpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHNoYWRlcnMuYmxvY2tzID0gc2hhZGVycy5ibG9ja3MgfHwge307XG4gICAgICAgICAgICBzaGFkZXJzLmJsb2NrX3Njb3BlcyA9IHNoYWRlcnMuYmxvY2tfc2NvcGVzIHx8IHt9O1xuICAgICAgICAgICAgbGV0IG1peGVkX3NvdXJjZSA9IHt9OyAvLyBzY29wZXMgbWl4ZWQgZm9yIHRoaXMgc291cmNlIHN0eWxlXG5cbiAgICAgICAgICAgIGZvciAobGV0IHQgaW4gc291cmNlLmJsb2Nrcykge1xuICAgICAgICAgICAgICAgIGxldCBibG9jayA9IHNvdXJjZS5ibG9ja3NbdF07XG4gICAgICAgICAgICAgICAgbGV0IGJsb2NrX3Njb3BlID0gc291cmNlLmJsb2NrX3Njb3Blc1t0XTtcblxuICAgICAgICAgICAgICAgIHNoYWRlcnMuYmxvY2tzW3RdID0gc2hhZGVycy5ibG9ja3NbdF0gfHwgW107XG4gICAgICAgICAgICAgICAgc2hhZGVycy5ibG9ja19zY29wZXNbdF0gPSBzaGFkZXJzLmJsb2NrX3Njb3Blc1t0XSB8fCBbXTtcblxuICAgICAgICAgICAgICAgIC8vIHN0YW5kYXJkaXplIG9uIGFycmF5cyAoYmxvY2sgY2FuIGJlIHNpbmdsZSBvciBtdWx0aS12YWx1ZSlcbiAgICAgICAgICAgICAgICBibG9jayA9IEFycmF5LmlzQXJyYXkoYmxvY2spID8gYmxvY2sgOiBbYmxvY2tdO1xuICAgICAgICAgICAgICAgIGJsb2NrX3Njb3BlID0gQXJyYXkuaXNBcnJheShibG9ja19zY29wZSkgPyBibG9ja19zY29wZSA6IFtibG9ja19zY29wZV07XG5cbiAgICAgICAgICAgICAgICBmb3IgKGxldCBiPTA7IGIgPCBibG9jay5sZW5ndGg7IGIrKykge1xuICAgICAgICAgICAgICAgICAgICAvLyBTa2lwIGJsb2NrcyB3ZSd2ZSBhbHJlYWR5IG1peGVkIGluIGZyb20gdGhlIHNhbWUgc2NvcGVcbiAgICAgICAgICAgICAgICAgICAgLy8gUmVwZWF0aW5nIHNjb3BlIGluZGljYXRlcyBhIGRpYW1vbmQgcGF0dGVybiB3aGVyZSBhIHN0eWxlIGlzIGJlaW5nIG1peGVkIG11bHRpcGxlIHRpbWVzXG4gICAgICAgICAgICAgICAgICAgIGlmIChtaXhlZFtibG9ja19zY29wZVtiXV0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIG1peGVkX3NvdXJjZVtibG9ja19zY29wZVtiXV0gPSB0cnVlO1xuXG4gICAgICAgICAgICAgICAgICAgIHNoYWRlcnMuYmxvY2tzW3RdLnB1c2goYmxvY2tbYl0pO1xuICAgICAgICAgICAgICAgICAgICBzaGFkZXJzLmJsb2NrX3Njb3Blc1t0XS5wdXNoKGJsb2NrX3Njb3BlW2JdKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIEFkZCBzdHlsZXMgbWl4ZWQgaW4gZnJvbSB0aGlzIHNvdXJjZSAtIHRoZXkgY291bGQgYmUgbXVsdGktbGV2ZWwgYW5jZXN0b3JzLFxuICAgICAgICAgICAgLy8gYmV5b25kIHRoZSBmaXJzdC1sZXZlbCBcInBhcmVudHNcIiBkZWZpbmVkIGluIHRoaXMgc3R5bGUncyBgbWl4YCBsaXN0XG4gICAgICAgICAgICBPYmplY3QuYXNzaWduKG1peGVkLCBtaXhlZF9zb3VyY2UpO1xuICAgICAgICB9KTtcblxuICAgICAgICBPYmplY3QuYXNzaWduKHN0eWxlLm1peGVkLCBtaXhlZCk7IC8vIGFkZCBhbGwgbmV3bHkgbWl4ZWQgc3R5bGVzXG5cbiAgICAgICAgc3R5bGUuc2hhZGVycyA9IHNoYWRlcnM7IC8vIGFzc2lnbiBiYWNrIHRvIHN0eWxlXG4gICAgICAgIHJldHVybiBzdHlsZTtcbiAgICB9XG5cbiAgICAvLyBDcmVhdGUgYSBuZXcgc3R5bGVcbiAgICAvLyBuYW1lOiBuYW1lIG9mIG5ldyBzdHlsZVxuICAgIC8vIGNvbmZpZzogcHJvcGVydGllcyBvZiBuZXcgc3R5bGVcbiAgICAvLyBzdHlsZXM6IHdvcmtpbmcgc2V0IG9mIHN0eWxlcyBiZWluZyBidWlsdCAodXNlZCBmb3IgbWl4aW5nIGluIGV4aXN0aW5nIHN0eWxlcylcbiAgICBjcmVhdGUgKG5hbWUsIGNvbmZpZywgc3R5bGVzID0ge30pIHtcbiAgICAgICAgbGV0IHN0eWxlID0gbWVyZ2VPYmplY3RzKHt9LCBjb25maWcpOyAvLyBkZWVwIGNvcHlcbiAgICAgICAgc3R5bGUubmFtZSA9IG5hbWU7XG5cbiAgICAgICAgLy8gU3R5bGUgbWl4aW5zXG4gICAgICAgIHN0eWxlID0gdGhpcy5taXgoc3R5bGUsIHN0eWxlcyk7XG5cbiAgICAgICAgLy8gSGFzIGJhc2Ugc3R5bGU/XG4gICAgICAgIC8vIE9ubHkgcmVuZGVyYWJsZSAoaW5zdGFudGlhdGVkKSBzdHlsZXMgc2hvdWxkIGJlIGluY2x1ZGVkIGZvciBydW4tdGltZSB1c2VcbiAgICAgICAgLy8gT3RoZXJzIGFyZSBpbnRlcm1lZGlhcnkvYWJzdHJhY3QsIHVzZWQgZHVyaW5nIHN0eWxlIGNvbXBvc2l0aW9uIGJ1dCBub3QgZXhlY3V0aW9uXG4gICAgICAgIGlmIChzdHlsZS5iYXNlICYmIHRoaXMuYmFzZV9zdHlsZXNbc3R5bGUuYmFzZV0pIHtcbiAgICAgICAgICAgIHRoaXMuc3R5bGVzW25hbWVdID0gc3R5bGUgPSBPYmplY3QuYXNzaWduKE9iamVjdC5jcmVhdGUodGhpcy5iYXNlX3N0eWxlc1tzdHlsZS5iYXNlXSksIHN0eWxlKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHN0eWxlLmJhc2UgPSBudWxsOyAvLyBudWxsIG91dCBpbnZhbGlkIGJhc2Ugc3R5bGVcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBzdHlsZTtcbiAgICB9XG5cbiAgICAvLyBDYWxsZWQgdG8gY3JlYXRlIGFuZCBpbml0aWFsaXplIHN0eWxlc1xuICAgIGJ1aWxkIChzdHlsZXMpIHtcbiAgICAgICAgLy8gU29ydCBzdHlsZXMgYnkgZGVwZW5kZW5jeSwgdGhlbiBidWlsZCB0aGVtXG4gICAgICAgIGxldCBzdHlsZV9kZXBzID0gT2JqZWN0LmtleXMoc3R5bGVzKS5zb3J0KFxuICAgICAgICAgICAgKGEsIGIpID0+IHRoaXMuaW5oZXJpdGFuY2VEZXB0aChhLCBzdHlsZXMpIC0gdGhpcy5pbmhlcml0YW5jZURlcHRoKGIsIHN0eWxlcylcbiAgICAgICAgKTtcblxuICAgICAgICAvLyBPbmx5IGtlZXAgYnVpbHQtaW4gYmFzZSBzdHlsZXNcbiAgICAgICAgZm9yIChsZXQgc25hbWUgaW4gdGhpcy5zdHlsZXMpIHtcbiAgICAgICAgICAgIGlmICghdGhpcy5iYXNlX3N0eWxlc1tzbmFtZV0pIHtcbiAgICAgICAgICAgICAgICBkZWxldGUgdGhpcy5zdHlsZXNbc25hbWVdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zdHlsZXNbc25hbWVdLnJlc2V0KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBXb3JraW5nIHNldCBvZiBzdHlsZXMgYmVpbmcgYnVpbHRcbiAgICAgICAgbGV0IHdzID0ge307XG4gICAgICAgIHN0eWxlX2RlcHMuZm9yRWFjaChzbmFtZSA9PiB7XG4gICAgICAgICAgICB3c1tzbmFtZV0gPSB0aGlzLmNyZWF0ZShzbmFtZSwgc3R5bGVzW3NuYW1lXSwgd3MpO1xuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gdGhpcy5zdHlsZXM7XG4gICAgfVxuXG4gICAgLy8gSW5pdGlhbGl6ZSBhbGwgc3R5bGVzXG4gICAgaW5pdFN0eWxlcyAoc2NlbmUgPSB7fSkge1xuICAgICAgICAvLyBJbml0aWFsaXplIGFsbFxuICAgICAgICBmb3IgKGxldCBzbmFtZSBpbiB0aGlzLnN0eWxlcykge1xuICAgICAgICAgICAgdGhpcy5zdHlsZXNbc25hbWVdLmluaXQoc2NlbmUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gR2l2ZW4gYSBzdHlsZSBrZXkgaW4gYSBzZXQgb2Ygc3R5bGVzIHRvIGFkZCwgY291bnQgdGhlIGxlbmd0aCBvZiB0aGUgaW5oZXJpdGFuY2UgY2hhaW5cbiAgICBpbmhlcml0YW5jZURlcHRoIChrZXksIHN0eWxlcykge1xuICAgICAgICBsZXQgcGFyZW50cyA9IDA7XG5cbiAgICAgICAgd2hpbGUodHJ1ZSkge1xuICAgICAgICAgICAgbGV0IHN0eWxlID0gc3R5bGVzW2tleV07XG4gICAgICAgICAgICBpZiAoIXN0eWxlKSB7XG4gICAgICAgICAgICAgICAgLy8gdGhpcyBpcyBhIHNjZW5lIGRlZiBlcnJvciwgdHJ5aW5nIHRvIGV4dGVuZCBhIHN0eWxlIHRoYXQgZG9lc24ndCBleGlzdFxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBEZXBlbmRlbmN5IGNoYWluIGVuZHMgd2hlbiB0aGlzIHN0eWxlIGlzbid0IG1peGluZyBpbiBhbnkgb3RoZXJzXG4gICAgICAgICAgICBpZiAoIXN0eWxlLm1peCkge1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBUcmF2ZXJzZSBuZXh0IHBhcmVudCBzdHlsZVxuICAgICAgICAgICAgcGFyZW50cysrO1xuXG4gICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShzdHlsZS5taXgpKSB7XG4gICAgICAgICAgICAgICAgLy8gSWYgbXVsdGlwbGUgbWl4aW5zLCBmaW5kIHRoZSBkZWVwZXN0IG9uZVxuICAgICAgICAgICAgICAgIHBhcmVudHMgKz0gTWF0aC5tYXgoLi4uc3R5bGUubWl4Lm1hcChzID0+IHtcbiAgICAgICAgICAgICAgICAgICAgLy8gVHJ5aW5nIHRvIG1peCBpbnRvIGl0c2VsZiFcbiAgICAgICAgICAgICAgICAgICAgaWYgKGtleSA9PT0gcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuaW5oZXJpdGFuY2VEZXB0aChzLCBzdHlsZXMpO1xuICAgICAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIFRyeWluZyB0byBtaXggaW50byBpdHNlbGYhXG4gICAgICAgICAgICAgICAgaWYgKGtleSA9PT0gc3R5bGUubWl4KSB7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIElmIHNpbmdsZSBtaXhpbiwgY29udGludWUgbG9vcCB1cCB0aGUgdHJlZVxuICAgICAgICAgICAgICAgIGtleSA9IHN0eWxlLm1peDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcGFyZW50cztcbiAgICB9XG5cbn1cbiIsImltcG9ydCBVdGlscyBmcm9tICcuLi91dGlscy91dGlscyc7XG5pbXBvcnQgR2VvIGZyb20gJy4uL2dlbyc7XG5cbmltcG9ydCBwYXJzZUNTU0NvbG9yIGZyb20gJ2Nzc2NvbG9ycGFyc2VyJztcblxuZXhwb3J0IHZhciBTdHlsZVBhcnNlciA9IHt9O1xuXG4vLyBXcmFwcyBzdHlsZSBmdW5jdGlvbnMgYW5kIHByb3ZpZGVzIGEgc2NvcGUgb2YgY29tbW9ubHkgYWNjZXNzaWJsZSBkYXRhOlxuLy8gLSBmZWF0dXJlOiB0aGUgJ3Byb3BlcnRpZXMnIG9mIHRoZSBmZWF0dXJlLCBlLmcuIGFjY2Vzc2VkIGFzICdmZWF0dXJlLm5hbWUnXG4vLyAtIGdsb2JhbDogdXNlci1kZWZpbmVkIHByb3BlcnRpZXMgb24gdGhlIGBnbG9iYWxgIG9iamVjdCBpbiB0aGUgc2NlbmUgZmlsZVxuLy8gLSAkem9vbTogdGhlIGN1cnJlbnQgbWFwIHpvb20gbGV2ZWxcbi8vIC0gJGdlb21ldHJ5OiB0aGUgdHlwZSBvZiBnZW9tZXRyeSwgJ3BvaW50JywgJ2xpbmUnLCBvciAncG9seWdvbidcbi8vIC0gJG1ldGVyc19wZXJfcGl4ZWw6IGNvbnZlcnNpb24gZm9yIG1ldGVycy9waXhlbHMgYXQgY3VycmVudCBtYXAgem9vbVxuU3R5bGVQYXJzZXIud3JhcEZ1bmN0aW9uID0gZnVuY3Rpb24gKGZ1bmMpIHtcbiAgICB2YXIgZiA9IGBcbiAgICAgICAgdmFyIGZlYXR1cmUgPSBjb250ZXh0LmZlYXR1cmUucHJvcGVydGllcztcbiAgICAgICAgdmFyIGdsb2JhbCA9IGNvbnRleHQuZ2xvYmFsO1xuICAgICAgICB2YXIgJHpvb20gPSBjb250ZXh0Lnpvb207XG4gICAgICAgIHZhciAkbGF5ZXIgPSBjb250ZXh0LmxheWVyO1xuICAgICAgICB2YXIgJGdlb21ldHJ5ID0gY29udGV4dC5nZW9tZXRyeTtcbiAgICAgICAgdmFyICRtZXRlcnNfcGVyX3BpeGVsID0gY29udGV4dC5tZXRlcnNfcGVyX3BpeGVsO1xuXG4gICAgICAgIHZhciB2YWwgPSAoZnVuY3Rpb24oKXsgJHtmdW5jfSB9KCkpO1xuXG4gICAgICAgIGlmICh0eXBlb2YgdmFsID09PSAnbnVtYmVyJyAmJiBpc05hTih2YWwpKSB7XG4gICAgICAgICAgICB2YWwgPSBudWxsOyAvLyBjb252ZXJ0IE5hTnMgdG8gbnVsbHNcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB2YWw7XG4gICAgYDtcbiAgICByZXR1cm4gZjtcbn07XG5cblxuLy8gU3R5bGUgcGFyc2luZ1xuXG5TdHlsZVBhcnNlci56ZXJvUGFpciA9IE9iamVjdC5mcmVlemUoWzAsIDBdKTsgLy8gc2luZ2xlIGFsbG9jYXRpb24gZm9yIHplcm8gdmFsdWVzIHRoYXQgd29uJ3QgYmUgbW9kaWZpZWRcblxuLy8gU3R5bGUgZGVmYXVsdHNcblN0eWxlUGFyc2VyLmRlZmF1bHRzID0ge1xuICAgIGNvbG9yOiBbMSwgMSwgMSwgMV0sXG4gICAgd2lkdGg6IDEsXG4gICAgc2l6ZTogMSxcbiAgICBleHRydWRlOiBmYWxzZSxcbiAgICBoZWlnaHQ6IDIwLFxuICAgIG1pbl9oZWlnaHQ6IDAsXG4gICAgb3JkZXI6IDAsXG4gICAgejogMCxcbiAgICBtYXRlcmlhbDoge1xuICAgICAgICBhbWJpZW50OiAxLFxuICAgICAgICBkaWZmdXNlOiAxXG4gICAgfVxufTtcblxuLy8gU3R5bGUgbWFjcm9zXG5TdHlsZVBhcnNlci5tYWNyb3MgPSB7XG4gICAgLy8gcHNldWRvLXJhbmRvbSBjb2xvciBieSBnZW9tZXRyeSBpZFxuICAgICdTdHlsZS5jb2xvci5wc2V1ZG9SYW5kb21Db2xvcic6IGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgMC43ICogKHBhcnNlSW50KGZlYXR1cmUuaWQsIDE2KSAvIDEwMCAlIDEpLCAgICAgLy8ganNoaW50IGlnbm9yZTpsaW5lXG4gICAgICAgICAgICAwLjcgKiAocGFyc2VJbnQoZmVhdHVyZS5pZCwgMTYpIC8gMTAwMDAgJSAxKSwgICAvLyBqc2hpbnQgaWdub3JlOmxpbmVcbiAgICAgICAgICAgIDAuNyAqIChwYXJzZUludChmZWF0dXJlLmlkLCAxNikgLyAxMDAwMDAwICUgMSksIC8vIGpzaGludCBpZ25vcmU6bGluZVxuICAgICAgICAgICAgMVxuICAgICAgICBdO1xuICAgIH0sXG5cbiAgICAvLyByYW5kb20gY29sb3JcbiAgICAnU3R5bGUuY29sb3IucmFuZG9tQ29sb3InOiBmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIFswLjcgKiBNYXRoLnJhbmRvbSgpLCAwLjcgKiBNYXRoLnJhbmRvbSgpLCAwLjcgKiBNYXRoLnJhbmRvbSgpLCAxXTtcbiAgICB9XG59O1xuXG4vLyBBIGNvbnRleHQgb2JqZWN0IHRoYXQgaXMgcGFzc2VkIHRvIHN0eWxlIHBhcnNpbmcgZnVuY3Rpb25zIHRvIHByb3ZpZGUgYSBzY29wZSBvZiBjb21tb25seSB1c2VkIHZhbHVlc1xuU3R5bGVQYXJzZXIuZ2V0RmVhdHVyZVBhcnNlQ29udGV4dCA9IGZ1bmN0aW9uIChmZWF0dXJlLCB0aWxlLCBnbG9iYWwpIHtcbiAgICByZXR1cm4ge1xuICAgICAgICBmZWF0dXJlLFxuICAgICAgICB0aWxlLFxuICAgICAgICBnbG9iYWwsXG4gICAgICAgIHpvb206IHRpbGUuc3R5bGVfem9vbSxcbiAgICAgICAgZ2VvbWV0cnk6IEdlby5nZW9tZXRyeVR5cGUoZmVhdHVyZS5nZW9tZXRyeS50eXBlKSxcbiAgICAgICAgbWV0ZXJzX3Blcl9waXhlbDogdGlsZS5tZXRlcnNfcGVyX3BpeGVsLFxuICAgICAgICBtZXRlcnNfcGVyX3BpeGVsX3NxOiB0aWxlLm1ldGVyc19wZXJfcGl4ZWxfc3EsXG4gICAgICAgIHVuaXRzX3Blcl9tZXRlcl9vdmVyem9vbTogdGlsZS51bml0c19wZXJfbWV0ZXJfb3Zlcnpvb21cbiAgICB9O1xufTtcblxuLy8gQnVpbGQgYSBzdHlsZSBwYXJhbSBjYWNoZSBvYmplY3Rcbi8vIGB2YWx1ZWAgaXMgcmF3IHZhbHVlLCBjYWNoZSBtZXRob2RzIHdpbGwgYWRkIG90aGVyIHByb3BlcnRpZXMgYXMgbmVlZGVkXG4vLyBgdHJhbnNmb3JtYCBpcyBvcHRpb25hbCB0cmFuc2Zvcm0gZnVuY3Rpb24gdG8gcnVuIG9uIHZhbHVlcyAoZXhjZXB0IGZ1bmN0aW9uIHZhbHVlcylcblN0eWxlUGFyc2VyLmNyZWF0ZVByb3BlcnR5Q2FjaGUgPSBmdW5jdGlvbiAob2JqLCB0cmFuc2Zvcm0gPSBudWxsKSB7XG4gICAgaWYgKG9iaiA9PSBudWxsKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAob2JqLnZhbHVlKSB7XG4gICAgICAgIHJldHVybiB7IHZhbHVlOiBvYmoudmFsdWUsIHpvb206IChvYmouem9vbSA/IHt9IDogbnVsbCkgfTsgLy8gY2xvbmUgZXhpc3RpbmcgY2FjaGUgb2JqZWN0XG4gICAgfVxuXG4gICAgbGV0IGMgPSB7IHZhbHVlOiBvYmogfTtcblxuICAgIC8vIGRvZXMgdmFsdWUgY29udGFpbiB6b29tIHN0b3BzIHRvIGJlIGludGVycG9sYXRlZD9cbiAgICBpZiAoQXJyYXkuaXNBcnJheShjLnZhbHVlKSAmJiBBcnJheS5pc0FycmF5KGMudmFsdWVbMF0pKSB7XG4gICAgICAgIGMuem9vbSA9IHt9OyAvLyB3aWxsIGhvbGQgdmFsdWVzIGludGVycG9sYXRlZCBieSB6b29tXG4gICAgfVxuXG4gICAgLy8gYXBwbHkgb3B0aW9uYWwgdHJhbnNmb3JtIGZ1bmN0aW9uXG4gICAgaWYgKHR5cGVvZiB0cmFuc2Zvcm0gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgaWYgKGMuem9vbSkgeyAvLyBhcHBseSB0byBlYWNoIHpvb20gc3RvcCB2YWx1ZVxuICAgICAgICAgICAgYy52YWx1ZSA9IGMudmFsdWUubWFwKHYgPT4gW3ZbMF0sIHRyYW5zZm9ybSh2WzFdKV0pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHR5cGVvZiBjLnZhbHVlICE9PSAnZnVuY3Rpb24nKSB7IC8vIGRvbid0IHRyYW5zZm9ybSBmdW5jdGlvbnNcbiAgICAgICAgICAgIGMudmFsdWUgPSB0cmFuc2Zvcm0oYy52YWx1ZSk7IC8vIHNpbmdsZSB2YWx1ZVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGM7XG59O1xuXG4vLyBDb252ZXJ0IG9sZC1zdHlsZSBjb2xvciBtYWNybyBpbnRvIGEgZnVuY3Rpb25cbi8vIFRPRE86IGRlcHJlY2F0ZSB0aGlzIG1hY3JvIHN5bnRheFxuU3R5bGVQYXJzZXIuY3JlYXRlQ29sb3JQcm9wZXJ0eUNhY2hlID0gZnVuY3Rpb24gKG9iaikge1xuICAgIHJldHVybiBTdHlsZVBhcnNlci5jcmVhdGVQcm9wZXJ0eUNhY2hlKG9iaiwgdiA9PiB7XG4gICAgICAgIGlmICh2ID09PSAnU3R5bGUuY29sb3IucHNldWRvUmFuZG9tQ29sb3InKSB7XG4gICAgICAgICAgICByZXR1cm4gVXRpbHMuc3RyaW5nVG9GdW5jdGlvbihTdHlsZVBhcnNlci53cmFwRnVuY3Rpb24oU3R5bGVQYXJzZXIubWFjcm9zWydTdHlsZS5jb2xvci5wc2V1ZG9SYW5kb21Db2xvciddKSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodiA9PT0gJ1N0eWxlLmNvbG9yLnJhbmRvbUNvbG9yJykge1xuICAgICAgICAgICAgcmV0dXJuIFN0eWxlUGFyc2VyLm1hY3Jvc1snU3R5bGUuY29sb3IucmFuZG9tQ29sb3InXTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB2O1xuICAgIH0pO1xufTtcblxuLy8gSW50ZXJwb2xhdGlvbiBhbmQgY2FjaGluZyBmb3IgYSBnZW5lcmljIHByb3BlcnR5IChub3QgYSBjb2xvciBvciBkaXN0YW5jZSlcbi8vIHsgdmFsdWU6IG9yaWdpbmFsLCBzdGF0aWM6IHZhbCwgem9vbTogeyAxOiB2YWwxLCAyOiB2YWwyLCAuLi4gfSwgZHluYW1pYzogZnVuY3Rpb24oKXsuLi59IH1cblN0eWxlUGFyc2VyLmV2YWxDYWNoZWRQcm9wZXJ0eSA9IGZ1bmN0aW9uKHZhbCwgY29udGV4dCkge1xuICAgIGlmICh2YWwgPT0gbnVsbCkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGVsc2UgaWYgKHZhbC5keW5hbWljKSB7IC8vIGZ1bmN0aW9uLCBjb21wdXRlIGVhY2ggdGltZSAobm8gY2FjaGluZylcbiAgICAgICAgbGV0IHYgPSB2YWwuZHluYW1pYyhjb250ZXh0KTtcbiAgICAgICAgcmV0dXJuIHY7XG4gICAgfVxuICAgIGVsc2UgaWYgKHZhbC5zdGF0aWMpIHsgLy8gc2luZ2xlIHN0YXRpYyB2YWx1ZVxuICAgICAgICByZXR1cm4gdmFsLnN0YXRpYztcbiAgICB9XG4gICAgZWxzZSBpZiAodmFsLnpvb20gJiYgdmFsLnpvb21bY29udGV4dC56b29tXSkgeyAvLyBpbnRlcnBvbGF0ZWQsIGNhY2hlZFxuICAgICAgICByZXR1cm4gdmFsLnpvb21bY29udGV4dC56b29tXTtcbiAgICB9XG4gICAgZWxzZSB7IC8vIG5vdCB5ZXQgZXZhdWxhdGVkIGZvciBjYWNoZVxuICAgICAgICAvLyBEeW5hbWljIGZ1bmN0aW9uLWJhc2VkXG4gICAgICAgIGlmICh0eXBlb2YgdmFsLnZhbHVlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICB2YWwuZHluYW1pYyA9IHZhbC52YWx1ZTtcbiAgICAgICAgICAgIGxldCB2ID0gdmFsLmR5bmFtaWMoY29udGV4dCk7XG4gICAgICAgICAgICByZXR1cm4gdjtcbiAgICAgICAgfVxuICAgICAgICAvLyBBcnJheSBvZiB6b29tLWludGVycG9sYXRlZCBzdG9wcywgZS5nLiBbem9vbSwgdmFsdWVdIHBhaXJzXG4gICAgICAgIGVsc2UgaWYgKEFycmF5LmlzQXJyYXkodmFsLnZhbHVlKSAmJiBBcnJheS5pc0FycmF5KHZhbC52YWx1ZVswXSkpIHtcbiAgICAgICAgICAgIC8vIENhbGN1bGF0ZSB2YWx1ZSBmb3IgY3VycmVudCB6b29tXG4gICAgICAgICAgICB2YWwuem9vbSA9IHZhbC56b29tIHx8IHt9O1xuICAgICAgICAgICAgdmFsLnpvb20gPSB7fTtcbiAgICAgICAgICAgIHZhbC56b29tW2NvbnRleHQuem9vbV0gPSBVdGlscy5pbnRlcnBvbGF0ZShjb250ZXh0Lnpvb20sIHZhbC52YWx1ZSk7XG4gICAgICAgICAgICByZXR1cm4gdmFsLnpvb21bY29udGV4dC56b29tXTtcbiAgICAgICAgfVxuICAgICAgICAvLyBTaW5nbGUgc3RhdGljIHZhbHVlXG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdmFsLnN0YXRpYyA9IHZhbC52YWx1ZTtcbiAgICAgICAgICAgIHJldHVybiB2YWwuc3RhdGljO1xuICAgICAgICB9XG4gICAgfVxufTtcblxuU3R5bGVQYXJzZXIuY29udmVydFVuaXRzID0gZnVuY3Rpb24odmFsLCBjb250ZXh0KSB7XG4gICAgLy8gcHJlLXBhcnNlZCB1bml0c1xuICAgIGlmICh2YWwudmFsICE9IG51bGwpIHtcbiAgICAgICAgaWYgKHZhbC51bml0cyA9PT0gJ3B4JykgeyAvLyBjb252ZXJ0IGZyb20gcGl4ZWxzXG4gICAgICAgICAgICByZXR1cm4gdmFsLnZhbCAqIEdlby5tZXRlcnNQZXJQaXhlbChjb250ZXh0Lnpvb20pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB2YWwudmFsO1xuICAgIH1cbiAgICAvLyB1bi1wYXJzZWQgdW5pdCBzdHJpbmdcbiAgICBlbHNlIGlmICh0eXBlb2YgdmFsID09PSAnc3RyaW5nJykge1xuICAgICAgICB2YXIgdW5pdHMgPSB2YWwubWF0Y2goLyhbMC05Li1dKykoW2Etel0rKS8pO1xuICAgICAgICBpZiAodW5pdHMgJiYgdW5pdHMubGVuZ3RoID09PSAzKSB7XG4gICAgICAgICAgICB2YWwgPSBwYXJzZUZsb2F0KHVuaXRzWzFdKTtcbiAgICAgICAgICAgIHVuaXRzID0gdW5pdHNbMl07XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodW5pdHMgPT09ICdweCcpIHsgLy8gY29udmVydCBmcm9tIHBpeGVsc1xuICAgICAgICAgICAgdmFsICo9IEdlby5tZXRlcnNQZXJQaXhlbChjb250ZXh0Lnpvb20pO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8vIG11bHRpcGxlIHZhbHVlcyBvciBzdG9wc1xuICAgIGVsc2UgaWYgKEFycmF5LmlzQXJyYXkodmFsKSkge1xuICAgICAgICAvLyBBcnJheSBvZiBhcnJheXMsIGUuZy4gem9vbS1pbnRlcnBvbGF0ZWQgc3RvcHNcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsWzBdKSkge1xuICAgICAgICAgICAgcmV0dXJuIHZhbC5tYXAodiA9PiBbdlswXSwgU3R5bGVQYXJzZXIuY29udmVydFVuaXRzKHZbMV0sIGNvbnRleHQpXSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gQXJyYXkgb2YgdmFsdWVzXG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIHZhbC5tYXAodiA9PiBTdHlsZVBhcnNlci5jb252ZXJ0VW5pdHModiwgY29udGV4dCkpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiB2YWw7XG59O1xuXG4vLyBQcmUtcGFyc2UgdW5pdHMgZnJvbSBzdHJpbmcgdmFsdWVzXG5TdHlsZVBhcnNlci5wYXJzZVVuaXRzID0gZnVuY3Rpb24gKHZhbCkge1xuICAgIHZhciBvYmogPSB7IHZhbDogcGFyc2VGbG9hdCh2YWwpIH07XG4gICAgaWYgKG9iai52YWwgIT09IDAgJiYgdHlwZW9mIHZhbCA9PT0gJ3N0cmluZycgJiYgdmFsLnRyaW0oKS5zbGljZSgtMikgPT09ICdweCcpIHtcbiAgICAgICAgb2JqLnVuaXRzID0gJ3B4JztcbiAgICB9XG4gICAgcmV0dXJuIG9iajtcbn07XG5cbi8vIFRha2VzIGEgZGlzdGFuY2UgY2FjaGUgb2JqZWN0IGFuZCByZXR1cm5zIGEgZGlzdGFuY2UgdmFsdWUgZm9yIHRoaXMgem9vbVxuLy8gKGNhY2hpbmcgdGhlIHJlc3VsdCBmb3IgZnV0dXJlIHVzZSlcbi8vIHsgdmFsdWU6IG9yaWdpbmFsLCB6b29tOiB7IHo6IG1ldGVycyB9LCBkeW5hbWljOiBmdW5jdGlvbigpey4uLn0gfVxuU3R5bGVQYXJzZXIuZXZhbENhY2hlZERpc3RhbmNlUHJvcGVydHkgPSBmdW5jdGlvbih2YWwsIGNvbnRleHQpIHtcbiAgICBpZiAodmFsLmR5bmFtaWMpIHtcbiAgICAgICAgbGV0IHYgPSB2YWwuZHluYW1pYyhjb250ZXh0KTtcbiAgICAgICAgcmV0dXJuIHY7XG4gICAgfVxuICAgIGVsc2UgaWYgKHZhbC56b29tICYmIHZhbC56b29tW2NvbnRleHQuem9vbV0pIHtcbiAgICAgICAgcmV0dXJuIHZhbC56b29tW2NvbnRleHQuem9vbV07XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICAvLyBEeW5hbWljIGZ1bmN0aW9uLWJhc2VkXG4gICAgICAgIGlmICh0eXBlb2YgdmFsLnZhbHVlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICB2YWwuZHluYW1pYyA9IHZhbC52YWx1ZTtcbiAgICAgICAgICAgIGxldCB2ID0gdmFsLmR5bmFtaWMoY29udGV4dCk7XG4gICAgICAgICAgICByZXR1cm4gdjtcbiAgICAgICAgfVxuICAgICAgICAvLyBBcnJheSBvZiB6b29tLWludGVycG9sYXRlZCBzdG9wcywgZS5nLiBbem9vbSwgdmFsdWVdIHBhaXJzXG4gICAgICAgIGVsc2UgaWYgKHZhbC56b29tKSB7XG4gICAgICAgICAgICAvLyBDYWxjdWxhdGUgdmFsdWUgZm9yIGN1cnJlbnQgem9vbVxuICAgICAgICAgICAgLy8gRG8gZmluYWwgdW5pdCBjb252ZXJzaW9uIGFzIGxhdGUgYXMgcG9zc2libGUsIHdoZW4gaW50ZXJwb2xhdGlvbiB2YWx1ZXMgaGF2ZSBiZWVuIGRldGVybWluZWRcbiAgICAgICAgICAgIHZhbC56b29tW2NvbnRleHQuem9vbV0gPSBVdGlscy5pbnRlcnBvbGF0ZShjb250ZXh0Lnpvb20sIHZhbC52YWx1ZSxcbiAgICAgICAgICAgICAgICB2ID0+IFN0eWxlUGFyc2VyLmNvbnZlcnRVbml0cyh2LCBjb250ZXh0KSk7XG5cbiAgICAgICAgICAgIHJldHVybiB2YWwuem9vbVtjb250ZXh0Lnpvb21dO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIFN0eWxlUGFyc2VyLmNvbnZlcnRVbml0cyh2YWwudmFsdWUsIGNvbnRleHQpO1xuICAgICAgICB9XG4gICAgfVxufTtcblxuLy8gQ2FjaGUgcHJldmlvdXNseSBwYXJzZWQgY29sb3Igc3RyaW5nc1xuU3R5bGVQYXJzZXIuc3RyaW5nX2NvbG9ycyA9IHt9O1xuU3R5bGVQYXJzZXIuY29sb3JGb3JTdHJpbmcgPSBmdW5jdGlvbihzdHJpbmcpIHtcbiAgICAvLyBDYWNoZWRcbiAgICBpZiAoU3R5bGVQYXJzZXIuc3RyaW5nX2NvbG9yc1tzdHJpbmddKSB7XG4gICAgICAgIHJldHVybiBTdHlsZVBhcnNlci5zdHJpbmdfY29sb3JzW3N0cmluZ107XG4gICAgfVxuXG4gICAgLy8gQ2FsY3VsYXRlIGFuZCBjYWNoZVxuICAgIGxldCBjb2xvciA9IHBhcnNlQ1NTQ29sb3IucGFyc2VDU1NDb2xvcihzdHJpbmcpO1xuICAgIGlmIChjb2xvciAmJiBjb2xvci5sZW5ndGggPT09IDQpIHtcbiAgICAgICAgY29sb3JbMF0gLz0gMjU1O1xuICAgICAgICBjb2xvclsxXSAvPSAyNTU7XG4gICAgICAgIGNvbG9yWzJdIC89IDI1NTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIGNvbG9yID0gU3R5bGVQYXJzZXIuZGVmYXVsdHMuY29sb3I7XG4gICAgfVxuICAgIFN0eWxlUGFyc2VyLnN0cmluZ19jb2xvcnNbc3RyaW5nXSA9IGNvbG9yO1xuICAgIHJldHVybiBjb2xvcjtcbn07XG5cbi8vIFRha2VzIGEgY29sb3IgY2FjaGUgb2JqZWN0IGFuZCByZXR1cm5zIGEgY29sb3IgdmFsdWUgZm9yIHRoaXMgem9vbVxuLy8gKGNhY2hpbmcgdGhlIHJlc3VsdCBmb3IgZnV0dXJlIHVzZSlcbi8vIHsgdmFsdWU6IG9yaWdpbmFsLCBzdGF0aWM6IFtyLGcsYixhXSwgem9vbTogeyB6OiBbcixnLGIsYV0gfSwgZHluYW1pYzogZnVuY3Rpb24oKXsuLi59IH1cblN0eWxlUGFyc2VyLmV2YWxDYWNoZWRDb2xvclByb3BlcnR5ID0gZnVuY3Rpb24odmFsLCBjb250ZXh0ID0ge30pIHtcbiAgICBpZiAodmFsLmR5bmFtaWMpIHtcbiAgICAgICAgbGV0IHYgPSB2YWwuZHluYW1pYyhjb250ZXh0KTtcblxuICAgICAgICBpZiAodHlwZW9mIHYgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICB2ID0gU3R5bGVQYXJzZXIuY29sb3JGb3JTdHJpbmcodik7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodiAmJiB2WzNdID09IG51bGwpIHtcbiAgICAgICAgICAgIHZbM10gPSAxOyAvLyBkZWZhdWx0IGFscGhhXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHY7XG4gICAgfVxuICAgIGVsc2UgaWYgKHZhbC5zdGF0aWMpIHtcbiAgICAgICAgcmV0dXJuIHZhbC5zdGF0aWM7XG4gICAgfVxuICAgIGVsc2UgaWYgKHZhbC56b29tICYmIHZhbC56b29tW2NvbnRleHQuem9vbV0pIHtcbiAgICAgICAgcmV0dXJuIHZhbC56b29tW2NvbnRleHQuem9vbV07XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICAvLyBEeW5hbWljIGZ1bmN0aW9uLWJhc2VkIGNvbG9yXG4gICAgICAgIGlmICh0eXBlb2YgdmFsLnZhbHVlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICB2YWwuZHluYW1pYyA9IHZhbC52YWx1ZTtcbiAgICAgICAgICAgIGxldCB2ID0gdmFsLmR5bmFtaWMoY29udGV4dCk7XG5cbiAgICAgICAgICAgIGlmICh0eXBlb2YgdiA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICB2ID0gU3R5bGVQYXJzZXIuY29sb3JGb3JTdHJpbmcodik7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh2ICYmIHZbM10gPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHZbM10gPSAxOyAvLyBkZWZhdWx0IGFscGhhXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdjtcbiAgICAgICAgfVxuICAgICAgICAvLyBTaW5nbGUgc3RyaW5nIGNvbG9yXG4gICAgICAgIGVsc2UgaWYgKHR5cGVvZiB2YWwudmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICB2YWwuc3RhdGljID0gU3R5bGVQYXJzZXIuY29sb3JGb3JTdHJpbmcodmFsLnZhbHVlKTtcbiAgICAgICAgICAgIHJldHVybiB2YWwuc3RhdGljO1xuICAgICAgICB9XG4gICAgICAgIC8vIEFycmF5IG9mIHpvb20taW50ZXJwb2xhdGVkIHN0b3BzLCBlLmcuIFt6b29tLCBjb2xvcl0gcGFpcnNcbiAgICAgICAgZWxzZSBpZiAodmFsLnpvb20pIHtcbiAgICAgICAgICAgIC8vIFBhcnNlIGFueSBzdHJpbmcgY29sb3JzIGluc2lkZSBzdG9wcywgdGhlIGZpcnN0IHRpbWUgd2UgZW5jb3VudGVyIHRoaXMgcHJvcGVydHlcbiAgICAgICAgICAgIGlmICghdmFsLnpvb21fcHJlcHJvY2Vzc2VkKSB7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaT0wOyBpIDwgdmFsLnZhbHVlLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCB2ID0gdmFsLnZhbHVlW2ldO1xuICAgICAgICAgICAgICAgICAgICBpZiAodiAmJiB0eXBlb2YgdlsxXSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZbMV0gPSBTdHlsZVBhcnNlci5jb2xvckZvclN0cmluZyh2WzFdKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB2YWwuem9vbV9wcmVwcm9jZXNzZWQgPSB0cnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBDYWxjdWxhdGUgY29sb3IgZm9yIGN1cnJlbnQgem9vbVxuICAgICAgICAgICAgdmFsLnpvb21bY29udGV4dC56b29tXSA9IFV0aWxzLmludGVycG9sYXRlKGNvbnRleHQuem9vbSwgdmFsLnZhbHVlKTtcbiAgICAgICAgICAgIHZhbC56b29tW2NvbnRleHQuem9vbV1bM10gPSB2YWwuem9vbVtjb250ZXh0Lnpvb21dWzNdIHx8IDE7IC8vIGRlZmF1bHQgYWxwaGFcbiAgICAgICAgICAgIHJldHVybiB2YWwuem9vbVtjb250ZXh0Lnpvb21dO1xuICAgICAgICB9XG4gICAgICAgIC8vIFNpbmdsZSBhcnJheSBjb2xvclxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHZhbC5zdGF0aWMgPSB2YWwudmFsdWU7XG4gICAgICAgICAgICBpZiAodmFsLnN0YXRpYyAmJiB2YWwuc3RhdGljWzNdID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICB2YWwuc3RhdGljWzNdID0gMTsgLy8gZGVmYXVsdCBhbHBoYVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHZhbC5zdGF0aWM7XG4gICAgICAgIH1cbiAgICB9XG59O1xuXG5TdHlsZVBhcnNlci5wYXJzZUNvbG9yID0gZnVuY3Rpb24odmFsLCBjb250ZXh0ID0ge30pIHtcbiAgICBpZiAodHlwZW9mIHZhbCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICB2YWwgPSB2YWwoY29udGV4dCk7XG4gICAgfVxuXG4gICAgLy8gUGFyc2UgQ1NTLXN0eWxlIGNvbG9yc1xuICAgIC8vIFRPRE86IGNoYW5nZSBhbGwgY29sb3JzIHRvIHVzZSAwLTI1NSByYW5nZSBpbnRlcm5hbGx5IHRvIGF2b2lkIGRpdmlkaW5nIGFuZCB0aGVuIHJlLW11bHRpcGx5aW5nIGluIGdlb20gYnVpbGRlclxuICAgIGlmICh0eXBlb2YgdmFsID09PSAnc3RyaW5nJykge1xuICAgICAgICB2YWwgPSBTdHlsZVBhcnNlci5jb2xvckZvclN0cmluZyh2YWwpO1xuICAgIH1cbiAgICBlbHNlIGlmIChBcnJheS5pc0FycmF5KHZhbCkgJiYgQXJyYXkuaXNBcnJheSh2YWxbMF0pKSB7XG4gICAgICAgIC8vIEFycmF5IG9mIHpvb20taW50ZXJwb2xhdGVkIHN0b3BzLCBlLmcuIFt6b29tLCBjb2xvcl0gcGFpcnNcbiAgICAgICAgZm9yIChsZXQgaT0wOyBpIDwgdmFsLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBsZXQgdiA9IHZhbFtpXTtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgdlsxXSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICB2WzFdID0gU3R5bGVQYXJzZXIuY29sb3JGb3JTdHJpbmcodlsxXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29udGV4dC56b29tKSB7XG4gICAgICAgICAgICB2YWwgPSBVdGlscy5pbnRlcnBvbGF0ZShjb250ZXh0Lnpvb20sIHZhbCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBEZWZhdWx0c1xuICAgIGlmICh2YWwpIHtcbiAgICAgICAgLy8gYWxwaGFcbiAgICAgICAgaWYgKHZhbFszXSA9PSBudWxsKSB7XG4gICAgICAgICAgICB2YWxbM10gPSAxO1xuICAgICAgICB9XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICB2YWwgPSBbMCwgMCwgMCwgMV07XG4gICAgfVxuXG4gICAgcmV0dXJuIHZhbDtcbn07XG5cblN0eWxlUGFyc2VyLmNhbGN1bGF0ZU9yZGVyID0gZnVuY3Rpb24ob3JkZXIsIGNvbnRleHQpIHtcbiAgICAvLyBDb21wdXRlZCBvcmRlclxuICAgIGlmICh0eXBlb2Ygb3JkZXIgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgb3JkZXIgPSBvcmRlcihjb250ZXh0KTtcbiAgICB9XG4gICAgZWxzZSBpZiAodHlwZW9mIG9yZGVyID09PSAnc3RyaW5nJykge1xuICAgICAgICAvLyBPcmRlciB0aWVkIHRvIGZlYXR1cmUgcHJvcGVydHlcbiAgICAgICAgaWYgKGNvbnRleHQuZmVhdHVyZS5wcm9wZXJ0aWVzW29yZGVyXSkge1xuICAgICAgICAgICAgb3JkZXIgPSBjb250ZXh0LmZlYXR1cmUucHJvcGVydGllc1tvcmRlcl07XG4gICAgICAgIH1cbiAgICAgICAgLy8gRXhwbGljaXQgb3JkZXIgdmFsdWVcbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBvcmRlciA9IHBhcnNlRmxvYXQob3JkZXIpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG9yZGVyO1xufTtcblxuLy8gRXZhbHVhdGUgYSBmdW5jdGlvbi1iYXNlZCBwcm9wZXJ0eSwgb3IgcGFzcy10aHJvdWdoIHN0YXRpYyB2YWx1ZVxuU3R5bGVQYXJzZXIuZXZhbFByb3BlcnR5ID0gZnVuY3Rpb24ocHJvcCwgY29udGV4dCkge1xuICAgIGlmICh0eXBlb2YgcHJvcCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICByZXR1cm4gcHJvcChjb250ZXh0KTtcbiAgICB9XG4gICAgcmV0dXJuIHByb3A7XG59O1xuIiwiaW1wb3J0IFV0aWxzIGZyb20gJy4uLy4uL3V0aWxzL3V0aWxzJztcbmltcG9ydCBUZXh0dXJlIGZyb20gJy4uLy4uL2dsL3RleHR1cmUnO1xuaW1wb3J0IEZvbnRNYW5hZ2VyIGZyb20gJy4vZm9udF9tYW5hZ2VyJztcbmltcG9ydCBkZWJ1Z1NldHRpbmdzIGZyb20gJy4uLy4uL3V0aWxzL2RlYnVnX3NldHRpbmdzJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQ2FudmFzVGV4dCB7XG5cbiAgICBjb25zdHJ1Y3RvciAoKSB7XG4gICAgICAgIHRoaXMuY2FudmFzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJyk7XG4gICAgICAgIHRoaXMuY2FudmFzLnN0eWxlLmJhY2tncm91bmRDb2xvciA9ICd0cmFuc3BhcmVudCc7IC8vIHJlbmRlciB0ZXh0IG9uIHRyYW5zcGFyZW50IGJhY2tncm91bmRcbiAgICAgICAgdGhpcy5jb250ZXh0ID0gdGhpcy5jYW52YXMuZ2V0Q29udGV4dCgnMmQnKTtcbiAgICAgICAgdGhpcy52ZXJ0aWNhbF90ZXh0X2J1ZmZlciA9IDg7IC8vIHZlcnRpY2FsIHBpeGVsIHBhZGRpbmcgYXJvdW5kIHRleHRcbiAgICAgICAgdGhpcy5ob3Jpem9udGFsX3RleHRfYnVmZmVyID0gNDsgLy8gdGV4dCBzdHlsaW5nIHN1Y2ggYXMgaXRhbGljIGVtcGhhc2lzIGlzIG5vdCBtZWFzdXJlZCBieSB0aGUgQ2FudmFzIEFQSSwgc28gcGFkZGluZyBpcyBuZWNlc3NhcnlcbiAgICB9XG5cbiAgICByZXNpemUgKHdpZHRoLCBoZWlnaHQpIHtcbiAgICAgICAgdGhpcy5jYW52YXMud2lkdGggPSB3aWR0aDtcbiAgICAgICAgdGhpcy5jYW52YXMuaGVpZ2h0ID0gaGVpZ2h0O1xuICAgICAgICB0aGlzLmNvbnRleHQuY2xlYXJSZWN0KDAsIDAsIHdpZHRoLCBoZWlnaHQpO1xuICAgIH1cblxuICAgIC8vIFNldCBmb250IHN0eWxlIHBhcmFtcyBmb3IgY2FudmFzIGRyYXdpbmdcbiAgICBzZXRGb250ICh7IGZvbnRfY3NzLCBmaWxsLCBzdHJva2UsIHN0cm9rZV93aWR0aCwgcHhfc2l6ZSB9KSB7XG4gICAgICAgIHRoaXMucHhfc2l6ZSA9IHB4X3NpemU7XG4gICAgICAgIGxldCBjdHggPSB0aGlzLmNvbnRleHQ7XG4gICAgICAgIGxldCBkcHIgPSBVdGlscy5kZXZpY2VfcGl4ZWxfcmF0aW87XG5cbiAgICAgICAgaWYgKHN0cm9rZSAmJiBzdHJva2Vfd2lkdGggPiAwKSB7XG4gICAgICAgICAgICBjdHguc3Ryb2tlU3R5bGUgPSBzdHJva2U7XG4gICAgICAgICAgICBjdHgubGluZVdpZHRoID0gc3Ryb2tlX3dpZHRoICogZHByO1xuICAgICAgICB9XG4gICAgICAgIGN0eC5maWxsU3R5bGUgPSBmaWxsO1xuXG4gICAgICAgIGN0eC5mb250ID0gZm9udF9jc3M7XG4gICAgICAgIGN0eC5taXRlckxpbWl0ID0gMjtcbiAgICB9XG5cbiAgICB0ZXh0U2l6ZXMgKHRleHRzKSB7XG4gICAgICAgIGxldCBkcHIgPSBVdGlscy5kZXZpY2VfcGl4ZWxfcmF0aW87XG4gICAgICAgIHJldHVybiBGb250TWFuYWdlci5sb2FkRm9udHMoKS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgIGZvciAobGV0IHN0eWxlIGluIHRleHRzKSB7XG4gICAgICAgICAgICAgICAgQ2FudmFzVGV4dC50ZXh0X2NhY2hlW3N0eWxlXSA9IENhbnZhc1RleHQudGV4dF9jYWNoZVtzdHlsZV0gfHwge307XG5cbiAgICAgICAgICAgICAgICBsZXQgdGV4dF9pbmZvcyA9IHRleHRzW3N0eWxlXTtcbiAgICAgICAgICAgICAgICBsZXQgZmlyc3QgPSB0cnVlO1xuICAgICAgICAgICAgICAgIGxldCBzcGFjZV93aWR0aDtcblxuICAgICAgICAgICAgICAgIGZvciAobGV0IHRleHQgaW4gdGV4dF9pbmZvcykge1xuICAgICAgICAgICAgICAgICAgICBsZXQgdGV4dF9pbmZvID0gdGV4dF9pbmZvc1t0ZXh0XTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHRleHRfc2V0dGluZ3MgPSB0ZXh0X2luZm8udGV4dF9zZXR0aW5ncztcblxuICAgICAgICAgICAgICAgICAgICBpZiAoZmlyc3QpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0Rm9udCh0ZXh0X3NldHRpbmdzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNwYWNlX3dpZHRoID0gdGhpcy5jb250ZXh0Lm1lYXN1cmVUZXh0KCcgJykud2lkdGggLyBkcHI7XG4gICAgICAgICAgICAgICAgICAgICAgICBmaXJzdCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgdGV4dF9pbmZvLnNwYWNlX3dpZHRoID0gc3BhY2Vfd2lkdGg7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHRleHRfc2V0dGluZ3MuY2FuX2FydGljdWxhdGUpe1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHNlZ21lbnRzID0gc3BsaXRMYWJlbFRleHQodGV4dCk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHRleHRfaW5mby5zZWdtZW50cyA9IHNlZ21lbnRzO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGV4dF9pbmZvLnNpemUgPSBbXTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzZWdtZW50cy5sZW5ndGg7IGkrKyl7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHNlZ21lbnQgPSBzZWdtZW50c1tpXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIUNhbnZhc1RleHQudGV4dF9jYWNoZVtzdHlsZV1bc2VnbWVudF0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2FudmFzVGV4dC50ZXh0X2NhY2hlW3N0eWxlXVtzZWdtZW50XSA9IHRoaXMudGV4dFNpemUoc2VnbWVudCwgdGV4dF9zZXR0aW5ncyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENhbnZhc1RleHQuY2FjaGVfc3RhdHMubWlzc2VzKys7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDYW52YXNUZXh0LmNhY2hlX3N0YXRzLmhpdHMrKztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dF9pbmZvLnNpemUucHVzaChDYW52YXNUZXh0LnRleHRfY2FjaGVbc3R5bGVdW3NlZ21lbnRdLnNpemUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFDYW52YXNUZXh0LnRleHRfY2FjaGVbc3R5bGVdW3RleHRdKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2FudmFzVGV4dC50ZXh0X2NhY2hlW3N0eWxlXVt0ZXh0XSA9IHRoaXMudGV4dFNpemUodGV4dCwgdGV4dF9zZXR0aW5ncyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2FudmFzVGV4dC5jYWNoZV9zdGF0cy5taXNzZXMrKztcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIENhbnZhc1RleHQuY2FjaGVfc3RhdHMuaGl0cysrO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gT25seSBzZW5kIHRleHQgc2l6ZXMgYmFjayB0byB3b3JrZXIgKGtlZXAgY29tcHV0ZWQgdGV4dCBsaW5lIGluZm9cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9uIG1haW4gdGhyZWFkLCBmb3IgZnV0dXJlIHJlbmRlcmluZylcbiAgICAgICAgICAgICAgICAgICAgICAgIHRleHRfaW5mby5zaXplID0gQ2FudmFzVGV4dC50ZXh0X2NhY2hlW3N0eWxlXVt0ZXh0XS5zaXplO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gdGV4dHM7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIENvbXB1dGVzIHdpZHRoIGFuZCBoZWlnaHQgb2YgdGV4dCBiYXNlZCBvbiBjdXJyZW50IGZvbnQgc3R5bGVcbiAgICAvLyBJbmNsdWRlcyB3b3JkIHdyYXBwaW5nLCByZXR1cm5zIHNpemUgaW5mbyBmb3Igd2hvbGUgdGV4dCBibG9jayBhbmQgaW5kaXZpZHVhbCBsaW5lc1xuICAgIHRleHRTaXplICh0ZXh0LCB7dHJhbnNmb3JtLCB0ZXh0X3dyYXAsIG1heF9saW5lcywgc3Ryb2tlX3dpZHRoID0gMH0pIHtcbiAgICAgICAgbGV0IGRwciA9IFV0aWxzLmRldmljZV9waXhlbF9yYXRpbztcbiAgICAgICAgbGV0IHN0ciA9IHRoaXMuYXBwbHlUZXh0VHJhbnNmb3JtKHRleHQsIHRyYW5zZm9ybSk7XG4gICAgICAgIGxldCBjdHggPSB0aGlzLmNvbnRleHQ7XG4gICAgICAgIGxldCB2ZXJ0aWNhbF9idWZmZXIgPSB0aGlzLnZlcnRpY2FsX3RleHRfYnVmZmVyICogZHByO1xuICAgICAgICBsZXQgaG9yaXpvbnRhbF9idWZmZXIgPSBkcHIgKiAoc3Ryb2tlX3dpZHRoICsgdGhpcy5ob3Jpem9udGFsX3RleHRfYnVmZmVyKTtcbiAgICAgICAgbGV0IGxlYWRpbmcgPSAyICogZHByOyAvLyBtYWtlIGNvbmZpZ3VyYWJsZSBhbmQvb3IgdXNlIENhbnZhcyBUZXh0TWV0cmljcyB3aGVuIGF2YWlsYWJsZVxuICAgICAgICBsZXQgbGluZV9oZWlnaHQgPSB0aGlzLnB4X3NpemUgKyBsZWFkaW5nOyAvLyBweF9zaXplIGFscmVhZHkgaW4gZGV2aWNlIHBpeGVsc1xuXG4gICAgICAgIC8vIFBhcnNlIHN0cmluZyBpbnRvIHNlcmllcyBvZiBsaW5lcyBpZiBpdCBleGNlZWRzIHRoZSB0ZXh0IHdyYXBwaW5nIHZhbHVlIG9yIGNvbnRhaW5zIGxpbmUgYnJlYWtzXG4gICAgICAgIGxldCBtdWx0aWxpbmUgPSBNdWx0aUxpbmUucGFyc2Uoc3RyLCB0ZXh0X3dyYXAsIG1heF9saW5lcywgbGluZV9oZWlnaHQsIGN0eCk7XG5cbiAgICAgICAgLy8gRmluYWwgZGltZW5zaW9ucyBvZiB0ZXh0XG4gICAgICAgIGxldCBoZWlnaHQgPSBtdWx0aWxpbmUuaGVpZ2h0O1xuICAgICAgICBsZXQgd2lkdGggPSBtdWx0aWxpbmUud2lkdGg7XG4gICAgICAgIGxldCBsaW5lcyA9IG11bHRpbGluZS5saW5lcztcblxuICAgICAgICBsZXQgY29sbGlzaW9uX3NpemUgPSBbXG4gICAgICAgICAgICB3aWR0aCAvIGRwcixcbiAgICAgICAgICAgIGhlaWdodCAvIGRwclxuICAgICAgICBdO1xuXG4gICAgICAgIGxldCB0ZXh0dXJlX3NpemUgPSBbXG4gICAgICAgICAgICB3aWR0aCArIDIgKiBob3Jpem9udGFsX2J1ZmZlcixcbiAgICAgICAgICAgIGhlaWdodCArIDIgKiB2ZXJ0aWNhbF9idWZmZXJcbiAgICAgICAgXTtcblxuICAgICAgICBsZXQgbG9naWNhbF9zaXplID0gW1xuICAgICAgICAgICAgdGV4dHVyZV9zaXplWzBdIC8gZHByLFxuICAgICAgICAgICAgdGV4dHVyZV9zaXplWzFdIC8gZHByLFxuICAgICAgICBdO1xuXG4gICAgICAgIC8vIFJldHVybnMgbGluZXMgKHcvcGVyLWxpbmUgaW5mbyBmb3IgZHJhd2luZykgYW5kIHRleHQncyBvdmVyYWxsIGJvdW5kaW5nIGJveCArIGNhbnZhcyBzaXplXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBsaW5lcyxcbiAgICAgICAgICAgIHNpemU6IHsgY29sbGlzaW9uX3NpemUsIHRleHR1cmVfc2l6ZSwgbG9naWNhbF9zaXplLCBsaW5lX2hlaWdodCB9XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgLy8gRHJhdyBtdWx0aXBsZSBsaW5lcyBvZiB0ZXh0XG4gICAgZHJhd1RleHRNdWx0aUxpbmUgKGxpbmVzLCBbeCwgeV0sIHNpemUsIHsgc3Ryb2tlLCBzdHJva2Vfd2lkdGggPSAwLCB0cmFuc2Zvcm0sIGFsaWduIH0pIHtcbiAgICAgICAgbGV0IGxpbmVfaGVpZ2h0ID0gc2l6ZS5saW5lX2hlaWdodDtcbiAgICAgICAgbGV0IGhlaWdodCA9IHk7XG4gICAgICAgIGZvciAobGV0IGxpbmVfbnVtPTA7IGxpbmVfbnVtIDwgbGluZXMubGVuZ3RoOyBsaW5lX251bSsrKSB7XG4gICAgICAgICAgICBsZXQgbGluZSA9IGxpbmVzW2xpbmVfbnVtXTtcbiAgICAgICAgICAgIHRoaXMuZHJhd1RleHRMaW5lKGxpbmUsIFt4LCBoZWlnaHRdLCBzaXplLCB7IHN0cm9rZSwgc3Ryb2tlX3dpZHRoLCB0cmFuc2Zvcm0sIGFsaWduIH0pO1xuICAgICAgICAgICAgaGVpZ2h0ICs9IGxpbmVfaGVpZ2h0O1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gRHJhdyBib3VuZGluZyBib3hlcyBmb3IgZGVidWdnaW5nXG4gICAgICAgIGlmIChkZWJ1Z1NldHRpbmdzLmRyYXdfbGFiZWxfY29sbGlzaW9uX2JveGVzKSB7XG4gICAgICAgICAgICB0aGlzLmNvbnRleHQuc2F2ZSgpO1xuXG4gICAgICAgICAgICBsZXQgZHByID0gVXRpbHMuZGV2aWNlX3BpeGVsX3JhdGlvO1xuICAgICAgICAgICAgbGV0IGhvcml6b250YWxfYnVmZmVyID0gZHByICogKHRoaXMuaG9yaXpvbnRhbF90ZXh0X2J1ZmZlciArIHN0cm9rZV93aWR0aCk7XG4gICAgICAgICAgICBsZXQgdmVydGljYWxfYnVmZmVyID0gZHByICogdGhpcy52ZXJ0aWNhbF90ZXh0X2J1ZmZlcjtcbiAgICAgICAgICAgIGxldCBjb2xsaXNpb25fc2l6ZSA9IHNpemUuY29sbGlzaW9uX3NpemU7XG4gICAgICAgICAgICBsZXQgbGluZVdpZHRoID0gMjtcblxuICAgICAgICAgICAgdGhpcy5jb250ZXh0LnN0cm9rZVN0eWxlID0gJ2JsdWUnO1xuICAgICAgICAgICAgdGhpcy5jb250ZXh0LmxpbmVXaWR0aCA9IGxpbmVXaWR0aDtcbiAgICAgICAgICAgIHRoaXMuY29udGV4dC5zdHJva2VSZWN0KHggKyBob3Jpem9udGFsX2J1ZmZlciwgeSArIHZlcnRpY2FsX2J1ZmZlciwgZHByICogY29sbGlzaW9uX3NpemVbMF0sIGRwciAqIGNvbGxpc2lvbl9zaXplWzFdKTtcblxuICAgICAgICAgICAgdGhpcy5jb250ZXh0LnJlc3RvcmUoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChkZWJ1Z1NldHRpbmdzLmRyYXdfbGFiZWxfdGV4dHVyZV9ib3hlcykge1xuICAgICAgICAgICAgdGhpcy5jb250ZXh0LnNhdmUoKTtcblxuICAgICAgICAgICAgbGV0IHRleHR1cmVfc2l6ZSA9IHNpemUudGV4dHVyZV9zaXplO1xuICAgICAgICAgICAgbGV0IGxpbmVXaWR0aCA9IDI7XG5cbiAgICAgICAgICAgIHRoaXMuY29udGV4dC5zdHJva2VTdHlsZSA9ICdncmVlbic7XG4gICAgICAgICAgICB0aGlzLmNvbnRleHQubGluZVdpZHRoID0gbGluZVdpZHRoO1xuICAgICAgICAgICAgLy8gc3Ryb2tlIGlzIGFwcGxpZWQgaW50ZXJuYWxseSwgc28gdGhlIG91dGVyIGJvcmRlciBpcyB0aGUgZWRnZSBvZiB0aGUgdGV4dHVyZVxuICAgICAgICAgICAgdGhpcy5jb250ZXh0LnN0cm9rZVJlY3QoeCArIGxpbmVXaWR0aCwgeSArIGxpbmVXaWR0aCwgdGV4dHVyZV9zaXplWzBdIC0gMiAqIGxpbmVXaWR0aCwgdGV4dHVyZV9zaXplWzFdIC0gMiAqIGxpbmVXaWR0aCk7XG5cbiAgICAgICAgICAgIHRoaXMuY29udGV4dC5yZXN0b3JlKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBEcmF3IHNpbmdsZSBsaW5lIG9mIHRleHQgYXQgc3BlY2lmaWVkIGxvY2F0aW9uLCBhZGp1c3RpbmcgZm9yIGJ1ZmZlciBhbmQgYmFzZWxpbmVcbiAgICBkcmF3VGV4dExpbmUgKGxpbmUsIFt4LCB5XSwgc2l6ZSwgeyBzdHJva2UsIHN0cm9rZV93aWR0aCA9IDAsIHRyYW5zZm9ybSwgYWxpZ24gfSkge1xuICAgICAgICBsZXQgZHByID0gVXRpbHMuZGV2aWNlX3BpeGVsX3JhdGlvO1xuICAgICAgICBhbGlnbiA9IGFsaWduIHx8ICdjZW50ZXInO1xuXG4gICAgICAgIGxldCB2ZXJ0aWNhbF9idWZmZXIgPSB0aGlzLnZlcnRpY2FsX3RleHRfYnVmZmVyICogZHByO1xuICAgICAgICBsZXQgdGV4dHVyZV9zaXplID0gc2l6ZS50ZXh0dXJlX3NpemU7XG4gICAgICAgIGxldCBsaW5lX2hlaWdodCA9IHNpemUubGluZV9oZWlnaHQ7XG4gICAgICAgIGxldCBob3Jpem9udGFsX2J1ZmZlciA9IGRwciAqIChzdHJva2Vfd2lkdGggKyB0aGlzLmhvcml6b250YWxfdGV4dF9idWZmZXIpO1xuXG4gICAgICAgIGxldCBzdHIgPSB0aGlzLmFwcGx5VGV4dFRyYW5zZm9ybShsaW5lLnRleHQsIHRyYW5zZm9ybSk7XG5cbiAgICAgICAgLy8gVGV4dCBhbGlnbm1lbnRcbiAgICAgICAgbGV0IHR4O1xuICAgICAgICBpZiAoYWxpZ24gPT09ICdsZWZ0Jykge1xuICAgICAgICAgICAgdHggPSB4ICsgaG9yaXpvbnRhbF9idWZmZXI7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoYWxpZ24gPT09ICdjZW50ZXInKSB7XG4gICAgICAgICAgICB0eCA9IHggKyB0ZXh0dXJlX3NpemVbMF0vMiAtIGxpbmUud2lkdGgvMjtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChhbGlnbiA9PT0gJ3JpZ2h0Jykge1xuICAgICAgICAgICAgdHggPSB4ICsgdGV4dHVyZV9zaXplWzBdIC0gbGluZS53aWR0aCAtIGhvcml6b250YWxfYnVmZmVyO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gSW4gdGhlIGFic2VuY2Ugb2YgYmV0dGVyIENhbnZhcyBUZXh0TWV0cmljcyAobm90IHN1cHBvcnRlZCBieSBicm93c2VycyB5ZXQpLFxuICAgICAgICAvLyAwLjc1IGJ1ZmZlciBwcm9kdWNlcyBhIGJldHRlciBhcHByb3hpbWF0ZSB2ZXJ0aWNhbCBjZW50ZXJpbmcgb2YgdGV4dFxuICAgICAgICBsZXQgdHkgPSB5ICsgdmVydGljYWxfYnVmZmVyICogMC43NSArIGxpbmVfaGVpZ2h0O1xuXG4gICAgICAgIGlmIChzdHJva2UgJiYgc3Ryb2tlX3dpZHRoID4gMCkge1xuICAgICAgICAgICAgdGhpcy5jb250ZXh0LnN0cm9rZVRleHQoc3RyLCB0eCwgdHkpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuY29udGV4dC5maWxsVGV4dChzdHIsIHR4LCB0eSk7XG4gICAgfVxuXG4gICAgcmFzdGVyaXplICh0ZXh0cywgdGV4dHVyZV9zaXplLCB0aWxlX2tleSkge1xuICAgICAgICBmb3IgKGxldCBzdHlsZSBpbiB0ZXh0cykge1xuICAgICAgICAgICAgbGV0IHRleHRfaW5mb3MgPSB0ZXh0c1tzdHlsZV07XG4gICAgICAgICAgICBsZXQgZmlyc3QgPSB0cnVlO1xuXG4gICAgICAgICAgICBmb3IgKGxldCB0ZXh0IGluIHRleHRfaW5mb3MpIHtcbiAgICAgICAgICAgICAgICBsZXQgdGV4dF9pbmZvID0gdGV4dF9pbmZvc1t0ZXh0XTtcbiAgICAgICAgICAgICAgICBsZXQgdGV4dF9zZXR0aW5ncyA9IHRleHRfaW5mby50ZXh0X3NldHRpbmdzO1xuXG4gICAgICAgICAgICAgICAgLy8gc2V0IGZvbnQgb24gZmlyc3Qgb2NjdXJlbmNlIG9mIG5ldyBmb250IHN0eWxlXG4gICAgICAgICAgICAgICAgaWYgKGZpcnN0KSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0Rm9udCh0ZXh0X3NldHRpbmdzKTtcbiAgICAgICAgICAgICAgICAgICAgZmlyc3QgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAodGV4dF9zZXR0aW5ncy5jYW5fYXJ0aWN1bGF0ZSl7XG4gICAgICAgICAgICAgICAgICAgIGxldCB3b3JkcyA9IHRleHRfaW5mby5zZWdtZW50cztcbiAgICAgICAgICAgICAgICAgICAgdGV4dF9pbmZvLnRleGNvb3JkcyA9IFtdO1xuXG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgd29yZHMubGVuZ3RoOyBpKyspe1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHdvcmQgPSB3b3Jkc1tpXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCB0ZXhjb29yZDtcblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKENhbnZhc1RleHQudGV4Y29vcmRfY2FjaGVbdGlsZV9rZXldW3N0eWxlXVt3b3JkXS50ZXhjb29yZCl7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4Y29vcmQgPSBDYW52YXNUZXh0LnRleGNvb3JkX2NhY2hlW3RpbGVfa2V5XVtzdHlsZV1bd29yZF0udGV4Y29vcmQ7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgdGV4dHVyZV9wb3NpdGlvbiA9IENhbnZhc1RleHQudGV4Y29vcmRfY2FjaGVbdGlsZV9rZXldW3N0eWxlXVt3b3JkXS50ZXh0dXJlX3Bvc2l0aW9uO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBzaXplID0gQ2FudmFzVGV4dC50ZXh0X2NhY2hlW3N0eWxlXVt3b3JkXS5zaXplO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBsaW5lID0gQ2FudmFzVGV4dC50ZXh0X2NhY2hlW3N0eWxlXVt3b3JkXS5saW5lcztcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZHJhd1RleHRNdWx0aUxpbmUobGluZSwgdGV4dHVyZV9wb3NpdGlvbiwgc2l6ZSwgdGV4dF9zZXR0aW5ncyk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXhjb29yZCA9IFRleHR1cmUuZ2V0VGV4Y29vcmRzRm9yU3ByaXRlKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0dXJlX3Bvc2l0aW9uLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplLnRleHR1cmVfc2l6ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dHVyZV9zaXplXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIENhbnZhc1RleHQudGV4Y29vcmRfY2FjaGVbdGlsZV9rZXldW3N0eWxlXVt3b3JkXS50ZXhjb29yZCA9IHRleGNvb3JkO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICB0ZXh0X2luZm8udGV4Y29vcmRzLnB1c2godGV4Y29vcmQpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBsZXQgbGluZXMgPSBDYW52YXNUZXh0LnRleHRfY2FjaGVbc3R5bGVdW3RleHRdLmxpbmVzOyAvLyBnZXQgcHJldmlvdXNseSBjb21wdXRlZCBsaW5lcyBvZiB0ZXh0XG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGFsaWduIGluIHRleHRfaW5mby5hbGlnbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kcmF3VGV4dE11bHRpTGluZShsaW5lcywgdGV4dF9pbmZvLmFsaWduW2FsaWduXS50ZXh0dXJlX3Bvc2l0aW9uLCB0ZXh0X2luZm8uc2l6ZSwge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZTogdGV4dF9zZXR0aW5ncy5zdHJva2UsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlX3dpZHRoOiB0ZXh0X3NldHRpbmdzLnN0cm9rZV93aWR0aCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2Zvcm06IHRleHRfc2V0dGluZ3MudHJhbnNmb3JtLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsaWduOiBhbGlnblxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHRleHRfaW5mby5hbGlnblthbGlnbl0udGV4Y29vcmRzID0gVGV4dHVyZS5nZXRUZXhjb29yZHNGb3JTcHJpdGUoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dF9pbmZvLmFsaWduW2FsaWduXS50ZXh0dXJlX3Bvc2l0aW9uLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHRfaW5mby5zaXplLnRleHR1cmVfc2l6ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0dXJlX3NpemVcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBQbGFjZSB0ZXh0IGxhYmVscyB3aXRoaW4gYW4gYXRsYXMgb2YgdGhlIGdpdmVuIG1heCBzaXplXG4gICAgc2V0VGV4dHVyZVRleHRQb3NpdGlvbnMgKHRleHRzLCBtYXhfdGV4dHVyZV9zaXplLCB0aWxlX2tleSkge1xuICAgICAgICBpZiAoIUNhbnZhc1RleHQudGV4Y29vcmRfY2FjaGVbdGlsZV9rZXldKSB7XG4gICAgICAgICAgICBDYW52YXNUZXh0LnRleGNvb3JkX2NhY2hlW3RpbGVfa2V5XSA9IHt9O1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gS2VlcCB0cmFjayBvZiBjb2x1bW4gd2lkdGhcbiAgICAgICAgbGV0IGNvbHVtbl93aWR0aCA9IDA7XG5cbiAgICAgICAgLy8gTGF5b3V0IGxhYmVscywgc3RhY2tlZCBpbiBjb2x1bW5zXG4gICAgICAgIGxldCBjeCA9IDAsIGN5ID0gMDsgLy8gY3VycmVudCB4L3kgcG9zaXRpb24gaW4gYXRsYXNcbiAgICAgICAgbGV0IGhlaWdodCA9IDA7ICAgICAvLyBvdmVyYWxsIGF0bGFzIGhlaWdodFxuICAgICAgICBmb3IgKGxldCBzdHlsZSBpbiB0ZXh0cykge1xuICAgICAgICAgICAgaWYgKCFDYW52YXNUZXh0LnRleGNvb3JkX2NhY2hlW3RpbGVfa2V5XVtzdHlsZV0pIHtcbiAgICAgICAgICAgICAgIENhbnZhc1RleHQudGV4Y29vcmRfY2FjaGVbdGlsZV9rZXldW3N0eWxlXSA9IHt9O1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBsZXQgdGV4dF9pbmZvcyA9IHRleHRzW3N0eWxlXTtcblxuICAgICAgICAgICAgZm9yIChsZXQgdGV4dCBpbiB0ZXh0X2luZm9zKSB7XG4gICAgICAgICAgICAgICAgbGV0IHRleHRfaW5mbyA9IHRleHRfaW5mb3NbdGV4dF07XG5cbiAgICAgICAgICAgICAgICBpZiAodGV4dF9pbmZvLnRleHRfc2V0dGluZ3MuY2FuX2FydGljdWxhdGUpe1xuICAgICAgICAgICAgICAgICAgICBsZXQgdGV4dHVyZV9wb3NpdGlvbjtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0ZXh0X2luZm8uc2l6ZS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHdvcmQgPSB0ZXh0X2luZm8uc2VnbWVudHNbaV07XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghQ2FudmFzVGV4dC50ZXhjb29yZF9jYWNoZVt0aWxlX2tleV1bc3R5bGVdW3dvcmRdKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHNpemUgPSB0ZXh0X2luZm8uc2l6ZVtpXS50ZXh0dXJlX3NpemU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNpemVbMF0gPiBjb2x1bW5fd2lkdGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sdW1uX3dpZHRoID0gc2l6ZVswXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGN5ICsgc2l6ZVsxXSA8IG1heF90ZXh0dXJlX3NpemUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dHVyZV9wb3NpdGlvbiA9IFtjeCwgY3ldO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN5ICs9IHNpemVbMV07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjeSA+IGhlaWdodCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0ID0gY3k7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7IC8vIHN0YXJ0IG5ldyBjb2x1bW4gaWYgdGFsbGVyIHRoYW4gdGV4dHVyZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjeCArPSBjb2x1bW5fd2lkdGg7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbl93aWR0aCA9IDA7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN5ID0gMDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dHVyZV9wb3NpdGlvbiA9IFtjeCwgY3ldO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIENhbnZhc1RleHQudGV4Y29vcmRfY2FjaGVbdGlsZV9rZXldW3N0eWxlXVt3b3JkXSA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dHVyZV9wb3NpdGlvbjogdGV4dHVyZV9wb3NpdGlvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIHJlbmRlcmVkIHNpemUgaXMgc2FtZSBmb3IgYWxsIGFsaWdubWVudHNcbiAgICAgICAgICAgICAgICAgICAgbGV0IHNpemUgPSB0ZXh0X2luZm8uc2l6ZS50ZXh0dXJlX3NpemU7XG4gICAgICAgICAgICAgICAgICAgIGlmIChzaXplWzBdID4gY29sdW1uX3dpZHRoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW5fd2lkdGggPSBzaXplWzBdO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gYnV0IGVhY2ggYWxpZ25tZW50IG5lZWRzIHRvIGJlIHJlbmRlcmVkIHNlcGFyYXRlbHlcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgYWxpZ24gaW4gdGV4dF9pbmZvLmFsaWduKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY3kgKyBzaXplWzFdIDwgbWF4X3RleHR1cmVfc2l6ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHRfaW5mby5hbGlnblthbGlnbl0udGV4dHVyZV9wb3NpdGlvbiA9IFtjeCwgY3ldOyAvLyBhZGQgbGFiZWwgdG8gY3VycmVudCBjb2x1bW5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjeSArPSBzaXplWzFdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjeSA+IGhlaWdodCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQgPSBjeTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsgLy8gc3RhcnQgbmV3IGNvbHVtbiBpZiB0YWxsZXIgdGhhbiB0ZXh0dXJlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY3ggKz0gY29sdW1uX3dpZHRoO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbl93aWR0aCA9IDA7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY3kgPSAwO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHRfaW5mby5hbGlnblthbGlnbl0udGV4dHVyZV9wb3NpdGlvbiA9IFtjeCwgY3ldO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIFtjeCArIGNvbHVtbl93aWR0aCwgaGVpZ2h0XTsgLy8gb3ZlcmFsbCBhdGxhcyBzaXplXG4gICAgfVxuXG4gICAgLy8gQ2FsbGVkIGJlZm9yZSByYXN0ZXJpemF0aW9uXG4gICAgYXBwbHlUZXh0VHJhbnNmb3JtICh0ZXh0LCB0cmFuc2Zvcm0pIHtcbiAgICAgICAgaWYgKHRyYW5zZm9ybSA9PT0gJ2NhcGl0YWxpemUnKSB7XG4gICAgICAgICAgICByZXR1cm4gdGV4dC5yZXBsYWNlKC9cXHdcXFMqL2csIGZ1bmN0aW9uICh0eHQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHh0LmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsgdHh0LnN1YnN0cigxKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHRyYW5zZm9ybSA9PT0gJ3VwcGVyY2FzZScpIHtcbiAgICAgICAgICAgIHJldHVybiB0ZXh0LnRvVXBwZXJDYXNlKCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodHJhbnNmb3JtID09PSAnbG93ZXJjYXNlJykge1xuICAgICAgICAgICAgcmV0dXJuIHRleHQudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGV4dDtcbiAgICB9XG5cbiAgICAvLyBDb252ZXJ0IGZvbnQgQ1NTLXN0eWxlIHNpemUgKCcxMnB4JywgJzE0cHQnLCAnMS41ZW0nLCBldGMuKSB0byBwaXhlbCBzaXplIChhZGp1c3RlZCBmb3IgZGV2aWNlIHBpeGVsIHJhdGlvKVxuICAgIC8vIERlZmF1bHRzIHVuaXRzIHRvIHBpeGVscyBpZiBub3Qgc3BlY2lmaWVkXG4gICAgc3RhdGljIGZvbnRQaXhlbFNpemUgKHNpemUpIHtcbiAgICAgICAgaWYgKHNpemUgPT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHNpemUgPSAodHlwZW9mIHNpemUgPT09ICdzdHJpbmcnKSA/IHNpemUgOiBTdHJpbmcoc2l6ZSk7IC8vIG5lZWQgYSBzdHJpbmcgZm9yIHJlZ2V4XG5cbiAgICAgICAgbGV0IFssIHB4X3NpemUsIHVuaXRzXSA9IHNpemUubWF0Y2goQ2FudmFzVGV4dC5mb250X3NpemVfcmUpIHx8IFtdO1xuICAgICAgICB1bml0cyA9IHVuaXRzIHx8ICdweCc7XG5cbiAgICAgICAgaWYgKHVuaXRzID09PSBcImVtXCIpIHtcbiAgICAgICAgICAgIHB4X3NpemUgKj0gMTY7XG4gICAgICAgIH0gZWxzZSBpZiAodW5pdHMgPT09IFwicHRcIikge1xuICAgICAgICAgICAgcHhfc2l6ZSAvPSAwLjc1O1xuICAgICAgICB9IGVsc2UgaWYgKHVuaXRzID09PSBcIiVcIikge1xuICAgICAgICAgICAgcHhfc2l6ZSAvPSA2LjI1O1xuICAgICAgICB9XG5cbiAgICAgICAgcHhfc2l6ZSA9IHBhcnNlRmxvYXQocHhfc2l6ZSk7XG4gICAgICAgIHB4X3NpemUgKj0gVXRpbHMuZGV2aWNlX3BpeGVsX3JhdGlvO1xuICAgICAgICByZXR1cm4gcHhfc2l6ZTtcbiAgICB9XG5cbiAgICBjbGVhclRleGNvb3JkQ2FjaGUgKHRpbGVfa2V5KSB7XG4gICAgICAgIENhbnZhc1RleHQudGV4Y29vcmRfY2FjaGVbdGlsZV9rZXldID0ge307XG4gICAgfVxuXG59XG5cbi8vIEV4dHJhY3QgZm9udCBzaXplIGFuZCB1bml0c1xuQ2FudmFzVGV4dC5mb250X3NpemVfcmUgPSAvKCg/OlswLTldKlxcLik/WzAtOV0rKVxccyoocHh8cHR8ZW18JSk/LztcblxuLy8gQ2FjaGUgc2l6ZXMgb2YgcmVuZGVyZWQgdGV4dFxuQ2FudmFzVGV4dC50ZXh0X2NhY2hlID0ge307IC8vIGJ5IHRleHQgc3R5bGUsIHRoZW4gdGV4dCBzdHJpbmdcbkNhbnZhc1RleHQuY2FjaGVfc3RhdHMgPSB7IGhpdHM6IDAsIG1pc3NlczogMCB9O1xuQ2FudmFzVGV4dC50ZXhjb29yZF9jYWNoZSA9IHt9O1xuXG4vLyBSaWdodC10by1sZWZ0IC8gYmktZGlyZWN0aW9uYWwgdGV4dCBoYW5kbGluZ1xuLy8gVGFrZW4gZnJvbSBodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzEyMDA2MDk1L2phdmFzY3JpcHQtaG93LXRvLWNoZWNrLWlmLWNoYXJhY3Rlci1pcy1ydGwjYW5zd2VyLTE5MTQzMjU0XG5sZXQgcnRsUmVnRXggPSAvXlteXFx1MDU5MS1cXHUwN0ZGXFx1MjAwRlxcdTIwMkJcXHUyMDJFXFx1RkIxRC1cXHVGREZEXFx1RkU3MC1cXHVGRUZDXSo/W1xcdTA1OTEtXFx1MDdGRlxcdTIwMEZcXHUyMDJCXFx1MjAyRVxcdUZCMUQtXFx1RkRGRFxcdUZFNzAtXFx1RkVGQ10vO1xuZnVuY3Rpb24gaXNSVEwocyl7XG4gICAgcmV0dXJuIHJ0bFJlZ0V4LnRlc3Qocyk7XG59XG5cbmZ1bmN0aW9uIHJlb3JkZXJXb3Jkc0xUUih3b3Jkcykge1xuICAgIGxldCB3b3Jkc19MVFIgPSBbXTtcbiAgICBsZXQgd29yZHNfUlRMID0gW107XG5cbiAgICAvLyBsb29wIHRocm91Z2ggd29yZHMgYW5kIHJlLW9yZGVyIFJUTCBncm91cHMgaW4gcmV2ZXJzZSBvcmRlciAoYnV0IGluIExUUiB2aXN1YWwgb3JkZXIpXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB3b3Jkcy5sZW5ndGg7IGkrKyl7XG4gICAgICAgIHZhciBzdHIgPSB3b3Jkc1tpXTtcbiAgICAgICAgdmFyIHJ0bCA9IGlzUlRMKHN0cik7XG4gICAgICAgIGlmIChydGwpe1xuICAgICAgICAgICAgd29yZHNfUlRMLnB1c2goc3RyKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHdoaWxlICh3b3Jkc19SVEwubGVuZ3RoID4gMCl7XG4gICAgICAgICAgICAgICAgd29yZHNfTFRSLnB1c2god29yZHNfUlRMLnBvcCgpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHdvcmRzX0xUUi5wdXNoKHN0cik7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICB3aGlsZSAod29yZHNfUlRMLmxlbmd0aCA+IDApe1xuICAgICAgICB3b3Jkc19MVFIucHVzaCh3b3Jkc19SVEwucG9wKCkpO1xuICAgIH1cblxuICAgIHJldHVybiB3b3Jkc19MVFI7XG59XG5cbi8vIFNwbGl0dGluZyBzdHJhdGVneSBmb3IgY2hvcHBpbmcgYSBsYWJlbCBpbnRvIHNlZ21lbnRzXG5mdW5jdGlvbiBzcGxpdExhYmVsVGV4dCh0ZXh0KXtcbiAgICBsZXQgd29yZHMgPSB0ZXh0LnNwbGl0KCcgJyk7XG4gICAgcmV0dXJuIHJlb3JkZXJXb3Jkc0xUUih3b3Jkcyk7XG59XG5cbi8vIFByaXZhdGUgY2xhc3MgdG8gYXJyYW5nZSB0ZXh0IGxhYmVscyBpbnRvIG11bHRpcGxlIGxpbmVzIGJhc2VkIG9uXG4vLyBcInRleHQgd3JhcFwiIGFuZCBcIm1heCBsaW5lXCIgdmFsdWVzXG5jbGFzcyBNdWx0aUxpbmUge1xuICAgIGNvbnN0cnVjdG9yIChjb250ZXh0LCBtYXhfbGluZXMgPSBJbmZpbml0eSwgdGV4dF93cmFwID0gSW5maW5pdHkpIHtcbiAgICAgICAgdGhpcy53aWR0aCA9IDA7XG4gICAgICAgIHRoaXMuaGVpZ2h0ID0gMDtcbiAgICAgICAgdGhpcy5saW5lcyA9IFtdO1xuXG4gICAgICAgIHRoaXMuZWxsaXBzaXMgPSAnLi4uJztcbiAgICAgICAgdGhpcy5lbGxpcHNpc193aWR0aCA9IE1hdGguY2VpbChjb250ZXh0Lm1lYXN1cmVUZXh0KHRoaXMuZWxsaXBzaXMpLndpZHRoKTtcblxuICAgICAgICB0aGlzLm1heF9saW5lcyA9IG1heF9saW5lcztcbiAgICAgICAgdGhpcy50ZXh0X3dyYXAgPSB0ZXh0X3dyYXA7XG4gICAgICAgIHRoaXMuY29udGV4dCA9IGNvbnRleHQ7XG4gICAgfVxuXG4gICAgY3JlYXRlTGluZSAobGluZV9oZWlnaHQpe1xuICAgICAgICBpZiAodGhpcy5saW5lcy5sZW5ndGggPCB0aGlzLm1heF9saW5lcyl7XG4gICAgICAgICAgICByZXR1cm4gbmV3IExpbmUobGluZV9oZWlnaHQsIHRoaXMudGV4dF93cmFwKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1c2ggKGxpbmUpe1xuICAgICAgICBpZiAodGhpcy5saW5lcy5sZW5ndGggPCB0aGlzLm1heF9saW5lcyl7XG4gICAgICAgICAgICAvLyBtZWFzdXJlIGxpbmUgd2lkdGhcbiAgICAgICAgICAgIGxldCBsaW5lX3dpZHRoID0gdGhpcy5jb250ZXh0Lm1lYXN1cmVUZXh0KGxpbmUudGV4dCkud2lkdGg7XG4gICAgICAgICAgICBsaW5lLndpZHRoID0gbGluZV93aWR0aDtcblxuICAgICAgICAgICAgaWYgKGxpbmVfd2lkdGggPiB0aGlzLndpZHRoKXtcbiAgICAgICAgICAgICAgICB0aGlzLndpZHRoID0gTWF0aC5jZWlsKGxpbmVfd2lkdGgpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBhZGQgdG8gbGluZXMgYW5kIGluY3JlbWVudCBoZWlnaHRcbiAgICAgICAgICAgIHRoaXMubGluZXMucHVzaChsaW5lKTtcbiAgICAgICAgICAgIHRoaXMuaGVpZ2h0ICs9IGxpbmUuaGVpZ2h0O1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmFkZEVsbGlwc2lzKCk7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBwdXNoZXMgdG8gdGhlIGxpbmVzIGFycmF5IGFuZCByZXR1cm5zIGEgbmV3IGxpbmUgaWYgcG9zc2libGUgKGZhbHNlIG90aGVyd2lzZSlcbiAgICBhZHZhbmNlIChsaW5lLCBsaW5lX2hlaWdodCkge1xuICAgICAgICBsZXQgY2FuX3B1c2ggPSB0aGlzLnB1c2gobGluZSk7XG4gICAgICAgIGlmIChjYW5fcHVzaCl7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5jcmVhdGVMaW5lKGxpbmVfaGVpZ2h0KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGFkZEVsbGlwc2lzICgpe1xuICAgICAgICBsZXQgbGFzdF9saW5lID0gdGhpcy5saW5lc1t0aGlzLmxpbmVzLmxlbmd0aCAtIDFdO1xuXG4gICAgICAgIGxhc3RfbGluZS5hcHBlbmQodGhpcy5lbGxpcHNpcyk7XG4gICAgICAgIGxhc3RfbGluZS53aWR0aCArPSB0aGlzLmVsbGlwc2lzX3dpZHRoO1xuXG4gICAgICAgIGlmIChsYXN0X2xpbmUud2lkdGggPiB0aGlzLndpZHRoKSB7XG4gICAgICAgICAgICB0aGlzLndpZHRoID0gbGFzdF9saW5lLndpZHRoO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZmluaXNoIChsaW5lKXtcbiAgICAgICAgaWYgKGxpbmUpe1xuICAgICAgICAgICAgdGhpcy5wdXNoKGxpbmUpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5hZGRFbGxpcHNpcygpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgc3RhdGljIHBhcnNlIChzdHIsIHRleHRfd3JhcCwgbWF4X2xpbmVzLCBsaW5lX2hlaWdodCwgY3R4KSB7XG4gICAgICAgIC8vIFdvcmQgd3JhcHBpbmdcbiAgICAgICAgLy8gTGluZSBicmVha3MgY2FuIGJlIGNhdXNlZCBieTpcbiAgICAgICAgLy8gIC0gaW1wbGljaXQgbGluZSBicmVhayB3aGVuIGEgbWF4aW11bSBjaGFyYWN0ZXIgdGhyZXNob2xkIGlzIGV4Y2VlZGVkIHBlciBsaW5lICh0ZXh0X3dyYXApXG4gICAgICAgIC8vICAtIGV4cGxpY2l0IGxpbmUgYnJlYWsgaW4gdGhlIGxhYmVsIHRleHQgKFxcbilcbiAgICAgICAgbGV0IHdvcmRzO1xuICAgICAgICBpZiAodHlwZW9mIHRleHRfd3JhcCA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgICAgIHdvcmRzID0gc3RyLnNwbGl0KCcgJyk7IC8vIHNwbGl0IHdvcmRzIG9uIHNwYWNlc1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgd29yZHMgPSBbc3RyXTsgLy8gbm8gbWF4IGxpbmUgd29yZCB3cmFwcGluZyAoYnV0IG5ldyBsaW5lcyB3aWxsIHN0aWxsIGJlIGluIGVmZmVjdClcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBtdWx0aWxpbmUgPSBuZXcgTXVsdGlMaW5lKGN0eCwgbWF4X2xpbmVzLCB0ZXh0X3dyYXApO1xuICAgICAgICBsZXQgbGluZSA9IG11bHRpbGluZS5jcmVhdGVMaW5lKGxpbmVfaGVpZ2h0KTtcblxuICAgICAgICAvLyBGaXJzdCBpdGVyYXRlIG9uIHNwYWNlLWJyZWFrIGdyb3VwcyAod2lsbCBiZSBvbmUgaWYgbWF4IGxpbmUgbGVuZ3RoIG9mZiksIHRoZW4gaXRlcmF0ZSBvbiBsaW5lLWJyZWFrIGdyb3Vwc1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHdvcmRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBsZXQgYnJlYWtzID0gd29yZHNbaV0uc3BsaXQoJ1xcbicpOyAvLyBzcGxpdCBvbiBsaW5lIGJyZWFrc1xuICAgICAgICAgICAgbGV0IG5ld19saW5lID0gKGkgPT09IDApID8gdHJ1ZSA6IGZhbHNlO1xuXG4gICAgICAgICAgICBmb3IgKGxldCBuPTA7IG4gPCBicmVha3MubGVuZ3RoOyBuKyspIHtcbiAgICAgICAgICAgICAgICBpZiAoIWxpbmUpe1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBsZXQgd29yZCA9IGJyZWFrc1tuXS50cmltKCk7XG5cbiAgICAgICAgICAgICAgICBpZiAoIXdvcmQpIHtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgbGV0IHNwYWNlZF93b3JkID0gKG5ld19saW5lKSA/IHdvcmQgOiAnICcgKyB3b3JkO1xuXG4gICAgICAgICAgICAgICAgLy8gaWYgYWRkaW5nIGN1cnJlbnQgd29yZCB3b3VsZCBvdmVyZmxvdywgYWRkIGEgbmV3IGxpbmUgaW5zdGVhZFxuICAgICAgICAgICAgICAgIC8vIGZpcnN0IHdvcmQgKGkgPT09IDApIGFsd2F5cyBhcHBlbmRzXG4gICAgICAgICAgICAgICAgaWYgKHRleHRfd3JhcCAmJiBpID4gMCAmJiBsaW5lLmV4Y2VlZHNUZXh0d3JhcChzcGFjZWRfd29yZCkpIHtcbiAgICAgICAgICAgICAgICAgICAgbGluZSA9IG11bHRpbGluZS5hZHZhbmNlKGxpbmUsIGxpbmVfaGVpZ2h0KTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFsaW5lKXtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGxpbmUuYXBwZW5kKHdvcmQpO1xuICAgICAgICAgICAgICAgICAgICBuZXdfbGluZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBsaW5lLmFwcGVuZChzcGFjZWRfd29yZCk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gaWYgbGluZSBicmVha3MgcHJlc2VudCwgYWRkIG5ldyBsaW5lICh1bmxlc3Mgb24gbGFzdCBsaW5lKVxuICAgICAgICAgICAgICAgIGlmIChuIDwgYnJlYWtzLmxlbmd0aCAtIDEpIHtcbiAgICAgICAgICAgICAgICAgICAgbGluZSA9IG11bHRpbGluZS5hZHZhbmNlKGxpbmUsIGxpbmVfaGVpZ2h0KTtcbiAgICAgICAgICAgICAgICAgICAgbmV3X2xpbmUgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGkgPT09IHdvcmRzLmxlbmd0aCAtIDEpe1xuICAgICAgICAgICAgICAgIG11bHRpbGluZS5maW5pc2gobGluZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG11bHRpbGluZTtcbiAgICB9XG59XG5cbi8vIEEgUHJpdmF0ZSBjbGFzcyB1c2VkIGJ5IE11bHRpTGluZSB0byBjb250YWluIHRoZSBsb2dpYyBmb3IgYSBzaW5nbGUgbGluZVxuLy8gaW5jbHVkaW5nIGNoYXJhY3RlciBjb3VudCwgd2lkdGgsIGhlaWdodCBhbmQgdGV4dFxuY2xhc3MgTGluZSB7XG4gICAgY29uc3RydWN0b3IgKGhlaWdodCA9IDAsIHRleHRfd3JhcCA9IDApe1xuICAgICAgICB0aGlzLmNoYXJzID0gMDtcbiAgICAgICAgdGhpcy50ZXh0ID0gJyc7XG5cbiAgICAgICAgdGhpcy5oZWlnaHQgPSBNYXRoLmNlaWwoaGVpZ2h0KTtcbiAgICAgICAgdGhpcy50ZXh0X3dyYXAgPSB0ZXh0X3dyYXA7XG4gICAgfVxuXG4gICAgYXBwZW5kICh0ZXh0KXtcbiAgICAgICAgdGhpcy5jaGFycyArPSB0ZXh0Lmxlbmd0aDtcbiAgICAgICAgdGhpcy50ZXh0ICs9IHRleHQ7XG4gICAgfVxuXG4gICAgZXhjZWVkc1RleHR3cmFwICh0ZXh0KXtcbiAgICAgICAgcmV0dXJuIHRleHQubGVuZ3RoICsgdGhpcy5jaGFycyA+IHRoaXMudGV4dF93cmFwO1xuICAgIH1cbn1cbiIsIi8qIGdsb2JhbCBGb250RmFjZSAqL1xuaW1wb3J0IGxvZyBmcm9tICcuLi8uLi91dGlscy9sb2cnO1xuaW1wb3J0IFV0aWxzIGZyb20gJy4uLy4uL3V0aWxzL3V0aWxzJztcbmltcG9ydCBGb250RmFjZU9ic2VydmVyIGZyb20gJ2ZvbnRmYWNlb2JzZXJ2ZXInO1xuXG5jb25zdCBGb250TWFuYWdlciA9IHtcblxuICAgIC8vIEZvbnQgZGV0ZWN0aW9uXG4gICAgZm9udHNfbG9hZGVkOiBQcm9taXNlLnJlc29sdmUoKSwgLy8gcmVzb2x2ZXMgd2hlbiBhbGwgcmVxdWVzdGVkIGZvbnRzIGhhdmUgYmVlbiBkZXRlY3RlZFxuXG4gICAgLy8gTG9hZCBzZXQgb2YgY3VzdG9tIGZvbnQgZmFjZXNcbiAgICAvLyBgZm9udHNgIGlzIGFuIG9iamVjdCB3aGVyZSB0aGUga2V5IGlzIGEgZm9udCBmYW1pbHkgbmFtZSwgYW5kIHRoZSB2YWx1ZSBpcyBvbmUgb3IgbW9yZSBmb250IGZhY2VcbiAgICAvLyBkZWZpbml0aW9ucy4gVGhlIHZhbHVlIGNhbiBiZSBlaXRoZXIgYSBzaW5nbGUgb2JqZWN0LCBvciBhbiBhcnJheSBvZiBzdWNoIG9iamVjdHMuXG4gICAgLy8gSWYgdGhlIHNwZWNpYWwgc3RyaW5nIHZhbHVlICdleHRlcm5hbCcgaXMgdXNlZCwgaXQgaW5kaWNhdGVzIHRoZSB0aGUgZm9udCB3aWxsIGJlIGxvYWRlZCB2aWEgZXh0ZXJuYWwgQ1NTLlxuICAgIGxvYWRGb250cyAoZm9udHMpIHtcbiAgICAgICAgaWYgKGZvbnRzKSB7XG4gICAgICAgICAgICBsZXQgcXVldWUgPSBbXTtcbiAgICAgICAgICAgIGZvciAobGV0IGZhbWlseSBpbiBmb250cykge1xuICAgICAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KGZvbnRzW2ZhbWlseV0pKSB7XG4gICAgICAgICAgICAgICAgICAgIGZvbnRzW2ZhbWlseV0uZm9yRWFjaChmYWNlID0+IHF1ZXVlLnB1c2godGhpcy5sb2FkRm9udEZhY2UoZmFtaWx5LCBmYWNlKSkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcXVldWUucHVzaCh0aGlzLmxvYWRGb250RmFjZShmYW1pbHksIGZvbnRzW2ZhbWlseV0pKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMuZm9udHNfbG9hZGVkID0gUHJvbWlzZS5hbGwocXVldWUuZmlsdGVyKHggPT4geCkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLmZvbnRzX2xvYWRlZDtcbiAgICB9LFxuXG4gICAgLy8gTG9hZCBhIHNpbmdsZSBmb250IGZhY2VcbiAgICAvLyBgZmFjZWAgY29udGFpbnMgdGhlIGZvbnQgZmFjZSBkZWZpbml0aW9uLCB3aXRoIG9wdGlvbmFsIHBhcmFtZXRlcnMgZm9yIGB3ZWlnaHRgLCBgc3R5bGVgLCBhbmQgYHVybGAuXG4gICAgLy8gSWYgdGhlIGB1cmxgIGlzIGRlZmluZWQsIHRoZSBmb250IGlzIGluamVjdGVkIGludG8gdGhlIGRvY3VtZW50IGFzIGEgQ1NTIGZvbnQtZmFjZS5cbiAgICAvLyBJZiB0aGUgb2JqZWN0J3MgdmFsdWUgaXMgdGhlIHNwZWNpYWwgc3RyaW5nICdleHRlcm5hbCcsIG9yIGlmIG5vIGB1cmxgIGlzIGRlZmluZWQsIHRoZW4gdGhlIGZvbnQgZmFjZVxuICAgIC8vIGlzIGFzc3VtZWQgaXMgYXNzdW1lZCB0byBiZWVuIGxvYWRlZCB2aWEgZXh0ZXJuYWwgQ1NTLiBJbiBlaXRoZXIgY2FzZSwgdGhlIGZ1bmN0aW9uIHJldHVybnMgYSBwcm9taXNlXG4gICAgLy8gdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBmb250IGZhY2UgaGFzIGxvYWRlZCwgb3IgdGltZXMgb3V0LlxuICAgIGxvYWRGb250RmFjZSAoZmFtaWx5LCBmYWNlKSB7XG4gICAgICAgIGlmIChmYWNlID09IG51bGwgfHwgKHR5cGVvZiBmYWNlICE9PSAnb2JqZWN0JyAmJiBmYWNlICE9PSAnZXh0ZXJuYWwnKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IG9wdGlvbnMgPSB7IGZhbWlseSB9O1xuICAgICAgICBsZXQgaW5qZWN0ID0gUHJvbWlzZS5yZXNvbHZlKCk7XG5cbiAgICAgICAgaWYgKHR5cGVvZiBmYWNlID09PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgT2JqZWN0LmFzc2lnbihvcHRpb25zLCBmYWNlKTtcblxuICAgICAgICAgICAgLy8gSWYgVVJMIGlzIGRlZmluZWQsIGluamVjdCBmb250IGludG8gZG9jdW1lbnRcbiAgICAgICAgICAgIGlmICh0eXBlb2YgZmFjZS51cmwgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgaW5qZWN0ID0gdGhpcy5pbmplY3RGb250RmFjZShvcHRpb25zKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFdhaXQgZm9yIGZvbnQgdG8gbG9hZFxuICAgICAgICBsZXQgb2JzZXJ2ZXIgPSBuZXcgRm9udEZhY2VPYnNlcnZlcihmYW1pbHksIG9wdGlvbnMpO1xuICAgICAgICByZXR1cm4gaW5qZWN0LnRoZW4oKCkgPT4gb2JzZXJ2ZXIubG9hZCgpKS50aGVuKFxuICAgICAgICAgICAgKCkgPT4ge1xuICAgICAgICAgICAgICAgIC8vIFByb21pc2UgcmVzb2x2ZXMsIGZvbnQgaXMgYXZhaWxhYmxlXG4gICAgICAgICAgICAgICAgbG9nKCdkZWJ1ZycsIGBGb250IGZhY2UgJyR7ZmFtaWx5fScgaXMgYXZhaWxhYmxlYCwgb3B0aW9ucyk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgKCkgPT4ge1xuICAgICAgICAgICAgICAgIC8vIFByb21pc2UgcmVqZWN0cywgZm9udCBpcyBub3QgYXZhaWxhYmxlXG4gICAgICAgICAgICAgICAgbG9nKCdkZWJ1ZycsIGBGb250IGZhY2UgJyR7ZmFtaWx5fScgaXMgTk9UIGF2YWlsYWJsZWAsIG9wdGlvbnMpO1xuICAgICAgICAgICAgfVxuICAgICAgICApO1xuICAgIH0sXG5cbiAgICAvLyBMb2FkcyBhIGZvbnQgZmFjZSB2aWEgZWl0aGVyIHRoZSBuYXRpdmUgRm9udEZhY2UgQVBJLCBvciBDU1MgaW5qZWN0aW9uXG4gICAgLy8gVE9ETzogY29uc2lkZXIgc3VwcG9ydCBmb3IgbXVsdGlwbGUgZm9ybWF0IFVSTHMgcGVyIGZhY2UsIHVuaWNvZGUgcmFuZ2VzXG4gICAgaW5qZWN0Rm9udEZhY2UgKHsgZmFtaWx5LCB1cmwsIHdlaWdodCwgc3R5bGUgfSkge1xuICAgICAgICBpZiAodGhpcy5zdXBwb3J0c19uYXRpdmVfZm9udF9sb2FkaW5nID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRoaXMuc3VwcG9ydHNfbmF0aXZlX2ZvbnRfbG9hZGluZyA9ICh3aW5kb3cuRm9udEZhY2UgIT09IHVuZGVmaW5lZCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDb252ZXJ0IGJsb2IgVVJMcywgZGVwZW5kaW5nIG9uIHdoZXRoZXIgdGhlIG5hdGl2ZSBGb250RmFjZSBBUEkgd2lsbCBiZSB1c2VkIG9yIG5vdC5cbiAgICAgICAgLy9cbiAgICAgICAgLy8gV2hlbiB0aGUgRm9udEZhY2UgQVBJICppcyogc3VwcG9ydGVkLCB0aGUgYmxvYiBVUkwgaXMgcmVhZCBpbnRvIGEgcmF3IGRhdGEgYXJyYXkuXG4gICAgICAgIC8vIE5COiBpdCdzIGluZWZmaWNpZW50IHRvIGJlIGNvbnZlcnRpbmcgYmxvYiBVUkxzIGludG8gdHlwZWQgYXJyYXlzIGhlcmUsIHNpbmNlIHRoZXkgb3JpZ2luYXRlZFxuICAgICAgICAvLyBhcyByYXcgZGF0YSAqYmVmb3JlKiB0aGV5IHdlcmUgY29udmVydGVkIGludG8gYmxvYiBVUkxzLiBIb3dldmVyLCB0aGlzIHByb2Nlc3Mgc2hvdWxkIGJlIGZhc3Qgc2luY2VcbiAgICAgICAgLy8gdGhlc2UgYXJlIG5hdGl2ZSBicm93c2VyIGZ1bmN0aW9ucyBhbmQgYWxsIGRhdGEgaXMgbG9jYWwgKG5vIG5ldHdvcmsgcmVxdWVzdCksIGFuZCBpdCBrZWVwcyB0aGVcbiAgICAgICAgLy8gbG9naWMgc3RyZWFtbGluZWQgYnkgYWxsb3dpbmcgdXMgdG8gY29udGludWUgdG8gdXNlIGEgVVJMLWJhc2VkIGludGVyZmFjZSBmb3IgYWxsIHNjZW5lIHJlc291cmNlcy5cbiAgICAgICAgLy9cbiAgICAgICAgLy8gV2hlbiB0aGUgRm9udEZhY2UgQVBJIGlzICpub3QqIHN1cHBvcnRlZCwgdGhlIGJsb2IgVVJMIGRhdGEgaXMgY29udmVydGVkIHRvIGEgYmFzZTY0IGRhdGEgVVJMLlxuICAgICAgICAvLyBUaGlzIGF2b2lkcyBzZWN1cml0eSByZXN0cmljaW9ucyBpbiBzb21lIGJyb3dzZXJzLlxuICAgICAgICAvLyBBbHNvIHNlZSBodHRwczovL2dpdGh1Yi5jb20vYnJhbXN0ZWluL2ZvbnRsb2FkZXIvYmxvYi81OThlOTM5OTExN2JkYzk0NmZmNzg2ZmEyYzUwMDdhNmJkN2QzYjllL3NyYy9mb250ZmFjZS5qcyNMMTQ1LUwxNTNcbiAgICAgICAgbGV0IHByZXByb2Nlc3MgPSBQcm9taXNlLnJlc29sdmUodXJsKTtcbiAgICAgICAgaWYgKHVybC5zbGljZSgwLCA1KSA9PT0gJ2Jsb2I6Jykge1xuICAgICAgICAgICAgcHJlcHJvY2VzcyA9IFV0aWxzLmlvKHVybCwgNjAwMDAsICdhcnJheWJ1ZmZlcicpLnRoZW4oZGF0YSA9PiB7XG4gICAgICAgICAgICAgICAgbGV0IGJ5dGVzID0gbmV3IFVpbnQ4QXJyYXkoZGF0YSk7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuc3VwcG9ydHNfbmF0aXZlX2ZvbnRfbG9hZGluZykge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYnl0ZXM7IC8vIHVzZSByYXcgYmluYXJ5IGRhdGFcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBzdHIgPSAnJztcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBieXRlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgc3RyICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoYnl0ZXNbaV0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAnZGF0YTpmb250L29wZW50eXBlO2Jhc2U2NCwnICsgYnRvYShzdHIpOyAvLyBiYXNlNjQgZW5jb2RlIGFzIGRhdGEgVVJMXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcHJlcHJvY2Vzcy50aGVuKGRhdGEgPT4ge1xuICAgICAgICAgICAgaWYgKHRoaXMuc3VwcG9ydHNfbmF0aXZlX2ZvbnRfbG9hZGluZykge1xuICAgICAgICAgICAgICAgIC8vIFVzZSBuYXRpdmUgRm9udEZhY2UgQVBJXG4gICAgICAgICAgICAgICAgbGV0IGZhY2U7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBkYXRhID09PSAnc3RyaW5nJykgeyAvLyBhZGQgYXMgVVJMXG4gICAgICAgICAgICAgICAgICAgIGZhY2UgPSBuZXcgRm9udEZhY2UoZmFtaWx5LCBgdXJsKCR7ZW5jb2RlVVJJKGRhdGEpfSlgLCB7IHdlaWdodCwgc3R5bGUgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKGRhdGEgaW5zdGFuY2VvZiBVaW50OEFycmF5KSB7IC8vIGFkZCBhcyBiaW5hcnkgZGF0YVxuICAgICAgICAgICAgICAgICAgICBmYWNlID0gbmV3IEZvbnRGYWNlKGZhbWlseSwgZGF0YSwgeyB3ZWlnaHQsIHN0eWxlIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBkb2N1bWVudC5mb250cy5hZGQoZmFjZSk7XG4gICAgICAgICAgICAgICAgbG9nKCd0cmFjZScsICdBZGRpbmcgRm9udEZhY2UgdG8gZG9jdW1lbnQuZm9udHM6JywgZmFjZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBVc2UgQ1NTIGluamVjdGlvblxuICAgICAgICAgICAgICAgIGxldCBjc3MgPSBgXG4gICAgICAgICAgICAgICAgICAgIEBmb250LWZhY2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgZm9udC1mYW1pbHk6ICcke2ZhbWlseX0nO1xuICAgICAgICAgICAgICAgICAgICAgICAgZm9udC13ZWlnaHQ6ICR7d2VpZ2h0IHx8ICdub3JtYWwnfTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvbnQtc3R5bGU6ICR7c3R5bGUgfHwgJ25vcm1hbCd9O1xuICAgICAgICAgICAgICAgICAgICAgICAgc3JjOiB1cmwoJHtlbmNvZGVVUkkoZGF0YSl9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGA7XG5cbiAgICAgICAgICAgICAgICBsZXQgc3R5bGVfZWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzdHlsZScpO1xuICAgICAgICAgICAgICAgIHN0eWxlX2VsLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKFwiXCIpKTtcbiAgICAgICAgICAgICAgICBkb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKHN0eWxlX2VsKTtcbiAgICAgICAgICAgICAgICBzdHlsZV9lbC5zaGVldC5pbnNlcnRSdWxlKGNzcywgMCk7XG4gICAgICAgICAgICAgICAgbG9nKCd0cmFjZScsICdJbmplY3RpbmcgQ1NTIGZvbnQgZmFjZTonLCBjc3MpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbn07XG5cbmV4cG9ydCBkZWZhdWx0IEZvbnRNYW5hZ2VyO1xuIiwiLy8gVGV4dCByZW5kZXJpbmcgc3R5bGVcblxuaW1wb3J0IEdlbyBmcm9tICcuLi8uLi9nZW8nO1xuaW1wb3J0IHtTdHlsZX0gZnJvbSAnLi4vc3R5bGUnO1xuaW1wb3J0IHtQb2ludHN9IGZyb20gJy4uL3BvaW50cy9wb2ludHMnO1xuaW1wb3J0IENvbGxpc2lvbiBmcm9tICcuLi8uLi9sYWJlbHMvY29sbGlzaW9uJztcbmltcG9ydCBMYWJlbFBvaW50IGZyb20gJy4uLy4uL2xhYmVscy9sYWJlbF9wb2ludCc7XG5pbXBvcnQgTGFiZWxMaW5lIGZyb20gJy4uLy4uL2xhYmVscy9sYWJlbF9saW5lJztcblxuZXhwb3J0IGxldCBUZXh0U3R5bGUgPSBPYmplY3QuY3JlYXRlKFBvaW50cyk7XG5cbk9iamVjdC5hc3NpZ24oVGV4dFN0eWxlLCB7XG4gICAgbmFtZTogJ3RleHQnLFxuICAgIHN1cGVyOiBQb2ludHMsXG4gICAgYnVpbHRfaW46IHRydWUsXG5cbiAgICBpbml0KCkge1xuICAgICAgICB0aGlzLnN1cGVyLmluaXQuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcblxuICAgICAgICAvLyBQb2ludCBzdHlsZSAocGFyZW50IGNsYXNzKSByZXF1aXJlcyB0ZXh0dXJpbmcgdG8gYmUgdHVybmVkIG9uXG4gICAgICAgIC8vIChsYWJlbHMgYXJlIGFsd2F5cyBkcmF3biB3aXRoIHRleHR1cmVzKVxuICAgICAgICB0aGlzLmRlZmluZXMuVEFOR1JBTV9QT0lOVF9URVhUVVJFID0gdHJ1ZTtcblxuICAgICAgICAvLyBEaXNhYmxlIGR1YWwgcG9pbnQvdGV4dCBtb2RlXG4gICAgICAgIHRoaXMuZGVmaW5lcy5UQU5HUkFNX01VTFRJX1NBTVBMRVIgPSBmYWxzZTtcblxuICAgICAgICAvLyBNYW51YWxseSB1bi1tdWx0aXBseSBhbHBoYSwgYmVjYXVzZSBDYW52YXMgdGV4dCByYXN0ZXJpemF0aW9uIGlzIHByZS1tdWx0aXBsaWVkXG4gICAgICAgIHRoaXMuZGVmaW5lcy5UQU5HUkFNX1VOTVVMVElQTFlfQUxQSEEgPSB0cnVlO1xuXG4gICAgICAgIC8vIEZhZGUgb3V0IHRleHQgd2hlbiB0aWxlIGlzIHpvb21pbmcgb3V0LCBlLmcuIGFjdGluZyBhcyBwcm94eSB0aWxlc1xuICAgICAgICB0aGlzLmRlZmluZXMuVEFOR1JBTV9GQURFX09OX1pPT01fT1VUID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5kZWZpbmVzLlRBTkdSQU1fRkFERV9PTl9aT09NX09VVF9SQVRFID0gMjsgLy8gZmFkZSBhdCAyeCwgZS5nLiBmdWxseSB0cmFuc3BhcmVudCBhdCAwLjUgem9vbSBsZXZlbCBhd2F5XG5cbiAgICAgICAgdGhpcy5yZXNldCgpO1xuICAgIH0sXG5cbiAgICByZXNldCgpIHtcbiAgICAgICAgdGhpcy5xdWV1ZXMgPSB7fTtcbiAgICAgICAgdGhpcy5yZXNldFRleHQoKTtcbiAgICB9LFxuXG4gICAgLy8gT3ZlcnJpZGUgdG8gcXVldWUgZmVhdHVyZXMgaW5zdGVhZCBvZiBwcm9jZXNzaW5nIGltbWVkaWF0ZWx5XG4gICAgYWRkRmVhdHVyZSAoZmVhdHVyZSwgZHJhdywgY29udGV4dCkge1xuICAgICAgICBsZXQgdGlsZSA9IGNvbnRleHQudGlsZTtcbiAgICAgICAgaWYgKHRpbGUuZ2VuZXJhdGlvbiAhPT0gdGhpcy5nZW5lcmF0aW9uKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDYWxsZWQgaGVyZSBiZWNhdXNlIG90aGVyd2lzZSBpdCB3aWxsIGJlIGRlbGF5ZWQgdW50aWwgdGhlIGZlYXR1cmUgcXVldWUgaXMgcGFyc2VkLFxuICAgICAgICAvLyBhbmQgd2Ugd2FudCB0aGUgcHJlcHJvY2Vzc2luZyBkb25lIGJlZm9yZSB3ZSBldmFsdWF0ZSB0ZXh0IHN0eWxlIGJlbG93XG4gICAgICAgIGRyYXcgPSB0aGlzLnByZXByb2Nlc3MoZHJhdyk7XG4gICAgICAgIGlmICghZHJhdykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHR5cGUgPSBmZWF0dXJlLmdlb21ldHJ5LnR5cGU7XG4gICAgICAgIGRyYXcuY2FuX2FydGljdWxhdGUgPSAodHlwZSA9PT0gXCJMaW5lU3RyaW5nXCIgfHwgdHlwZSA9PT0gXCJNdWx0aUxpbmVTdHJpbmdcIik7XG5cbiAgICAgICAgbGV0IHEgPSB0aGlzLnBhcnNlVGV4dEZlYXR1cmUoZmVhdHVyZSwgZHJhdywgY29udGV4dCwgdGlsZSk7XG4gICAgICAgIGlmICghcSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgcS5mZWF0dXJlID0gZmVhdHVyZTtcbiAgICAgICAgcS5jb250ZXh0ID0gY29udGV4dDtcbiAgICAgICAgcS5sYXlvdXQudmVydGV4ID0gZmFsc2U7IC8vIHZlcnRleCBwbGFjZW1lbnQgb3B0aW9uIG5vdCBhcHBsaWNhYmxlIHRvIHN0YW5kYWxvbmUgbGFiZWxzXG5cbiAgICAgICAgLy8gUXVldWUgdGhlIGZlYXR1cmUgZm9yIHByb2Nlc3NpbmdcbiAgICAgICAgaWYgKCF0aGlzLnRpbGVfZGF0YVt0aWxlLmtleV0pIHtcbiAgICAgICAgICAgIHRoaXMuc3RhcnREYXRhKHRpbGUpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMucXVldWVzW3RpbGUua2V5XS5wdXNoKHEpO1xuXG4gICAgICAgIC8vIFJlZ2lzdGVyIHdpdGggY29sbGlzaW9uIG1hbmFnZXJcbiAgICAgICAgQ29sbGlzaW9uLmFkZFN0eWxlKHRoaXMubmFtZSwgdGlsZS5rZXkpO1xuICAgIH0sXG5cbiAgICAvLyBPdmVycmlkZVxuICAgIHN0YXJ0RGF0YSAodGlsZSkge1xuICAgICAgICB0aGlzLnF1ZXVlc1t0aWxlLmtleV0gPSBbXTtcbiAgICAgICAgcmV0dXJuIFN0eWxlLnN0YXJ0RGF0YS5jYWxsKHRoaXMsIHRpbGUpO1xuICAgIH0sXG5cbiAgICAvLyBPdmVycmlkZVxuICAgIGVuZERhdGEgKHRpbGUpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucHJlcGFyZVRleHRMYWJlbHModGlsZSwgdGhpcy5uYW1lLCB0aGlzLnF1ZXVlc1t0aWxlLmtleV0pLlxuICAgICAgICAgICAgdGhlbihsYWJlbHMgPT4gdGhpcy5jb2xsaWRlQW5kUmVuZGVyVGV4dExhYmVscyh0aWxlLCB0aGlzLm5hbWUsIGxhYmVscykpLlxuICAgICAgICAgICAgdGhlbigoeyBsYWJlbHMsIHRleHRzLCB0ZXh0dXJlIH0pID0+IHtcbiAgICAgICAgICAgICAgICBpZiAodGV4dHMpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy50ZXh0c1t0aWxlLmtleV0gPSB0ZXh0cztcblxuICAgICAgICAgICAgICAgICAgICAvLyBCdWlsZCBxdWV1ZWQgZmVhdHVyZXNcbiAgICAgICAgICAgICAgICAgICAgbGFiZWxzLmZvckVhY2gocSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgdGV4dF9zZXR0aW5nc19rZXkgPSBxLnRleHRfc2V0dGluZ3Nfa2V5O1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHRleHRfaW5mbyA9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy50ZXh0c1t0aWxlLmtleV1bdGV4dF9zZXR0aW5nc19rZXldICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy50ZXh0c1t0aWxlLmtleV1bdGV4dF9zZXR0aW5nc19rZXldW3EudGV4dF07XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNldHVwIHN0eWxpbmcgb2JqZWN0IGV4cGVjdGVkIGJ5IFN0eWxlIGNsYXNzXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgc3R5bGUgPSB0aGlzLmZlYXR1cmVfc3R5bGU7XG4gICAgICAgICAgICAgICAgICAgICAgICBzdHlsZS5sYWJlbCA9IHEubGFiZWw7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0ZXh0X2luZm8udGV4dF9zZXR0aW5ncy5jYW5fYXJ0aWN1bGF0ZSl7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdW5wYWNrIGxvZ2ljYWwgc2l6ZXMgb2YgZWFjaCBzZWdtZW50IGludG8gYW4gYXJyYXkgZm9yIHRoZSBzdHlsZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlLnNpemUgPSB0ZXh0X2luZm8uc2l6ZS5tYXAoZnVuY3Rpb24oc2l6ZSl7IHJldHVybiBzaXplLmxvZ2ljYWxfc2l6ZTsgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGUudGV4Y29vcmRzID0gdGV4dF9pbmZvLnRleGNvb3JkcztcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlLnNpemUgPSB0ZXh0X2luZm8uc2l6ZS5sb2dpY2FsX3NpemU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGUuYW5nbGUgPSBxLmxhYmVsLmFuZ2xlIHx8IDA7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGUudGV4Y29vcmRzID0gdGV4dF9pbmZvLmFsaWduW3EubGFiZWwuYWxpZ25dLnRleGNvb3JkcztcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgU3R5bGUuYWRkRmVhdHVyZS5jYWxsKHRoaXMsIHEuZmVhdHVyZSwgcS5kcmF3LCBxLmNvbnRleHQpO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy5mcmVlVGV4dCh0aWxlKTtcblxuICAgICAgICAgICAgICAgIC8vIEZpbmlzaCB0aWxlIG1lc2hcbiAgICAgICAgICAgICAgICByZXR1cm4gU3R5bGUuZW5kRGF0YS5jYWxsKHRoaXMsIHRpbGUpLnRoZW4odGlsZV9kYXRhID0+IHtcbiAgICAgICAgICAgICAgICAgICAgLy8gQXR0YWNoIHRpbGUtc3BlY2lmaWMgbGFiZWwgYXRsYXMgdG8gbWVzaCBhcyBhIHRleHR1cmUgdW5pZm9ybVxuICAgICAgICAgICAgICAgICAgICBpZiAodGV4dHVyZSAmJiB0aWxlX2RhdGEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRpbGVfZGF0YS51bmlmb3Jtcy51X3RleHR1cmUgPSB0ZXh0dXJlO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGlsZV9kYXRhLnRleHR1cmVzLnB1c2godGV4dHVyZSk7IC8vIGFzc2lnbiB0ZXh0dXJlIG93bmVyc2hpcCB0byB0aWxlXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGlsZV9kYXRhO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICB9LFxuXG4gICAgLy8gU2V0cyB1cCBjYWNoaW5nIGZvciBkcmF3IHByb3BlcnRpZXNcbiAgICBfcHJlcHJvY2VzcyAoZHJhdykge1xuICAgICAgICByZXR1cm4gdGhpcy5wcmVwcm9jZXNzVGV4dChkcmF3KTtcbiAgICB9LFxuXG4gICAgLy8gSW1wbGVtZW50cyBsYWJlbCBidWlsZGluZyBmb3IgVGV4dExhYmVscyBtaXhpblxuICAgIGJ1aWxkVGV4dExhYmVscyAodGlsZV9rZXksIGZlYXR1cmVfcXVldWUpIHtcbiAgICAgICAgbGV0IGxhYmVscyA9IFtdO1xuICAgICAgICBmb3IgKGxldCBmPTA7IGYgPCBmZWF0dXJlX3F1ZXVlLmxlbmd0aDsgZisrKSB7XG4gICAgICAgICAgICBsZXQgZnEgPSBmZWF0dXJlX3F1ZXVlW2ZdO1xuICAgICAgICAgICAgbGV0IHRleHRfaW5mbyA9IHRoaXMudGV4dHNbdGlsZV9rZXldW2ZxLnRleHRfc2V0dGluZ3Nfa2V5XVtmcS50ZXh0XTtcbiAgICAgICAgICAgIGxldCBmZWF0dXJlX2xhYmVscztcbiAgICAgICAgICAgIGlmICh0ZXh0X2luZm8udGV4dF9zZXR0aW5ncy5jYW5fYXJ0aWN1bGF0ZSl7XG4gICAgICAgICAgICAgICAgdmFyIHNpemVzID0gdGV4dF9pbmZvLnNpemUubWFwKGZ1bmN0aW9uKHNpemUpeyByZXR1cm4gc2l6ZS5jb2xsaXNpb25fc2l6ZTsgfSk7XG4gICAgICAgICAgICAgICAgZnEubGF5b3V0LnNwYWNlX3dpZHRoID0gdGV4dF9pbmZvLnNwYWNlX3dpZHRoO1xuICAgICAgICAgICAgICAgIGZlYXR1cmVfbGFiZWxzID0gdGhpcy5idWlsZExhYmVscyhzaXplcywgZnEuZmVhdHVyZS5nZW9tZXRyeSwgZnEubGF5b3V0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGZlYXR1cmVfbGFiZWxzID0gdGhpcy5idWlsZExhYmVscyh0ZXh0X2luZm8uc2l6ZS5jb2xsaXNpb25fc2l6ZSwgZnEuZmVhdHVyZS5nZW9tZXRyeSwgZnEubGF5b3V0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZmVhdHVyZV9sYWJlbHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBsZXQgZnFsID0gT2JqZWN0LmNyZWF0ZShmcSk7XG4gICAgICAgICAgICAgICAgZnFsLmxhYmVsID0gZmVhdHVyZV9sYWJlbHNbaV07XG4gICAgICAgICAgICAgICAgbGFiZWxzLnB1c2goZnFsKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbGFiZWxzO1xuICAgIH0sXG5cbiAgICAvLyBCdWlsZHMgb25lIG9yIG1vcmUgbGFiZWxzIGZvciBhIGdlb21ldHJ5XG4gICAgYnVpbGRMYWJlbHMgKHNpemUsIGdlb21ldHJ5LCBsYXlvdXQpIHtcbiAgICAgICAgbGV0IGxhYmVscyA9IFtdO1xuXG4gICAgICAgIGlmIChnZW9tZXRyeS50eXBlID09PSBcIkxpbmVTdHJpbmdcIikge1xuICAgICAgICAgICAgdGhpcy5idWlsZExpbmVMYWJlbHMoZ2VvbWV0cnkuY29vcmRpbmF0ZXMsIHNpemUsIGxheW91dCwgbGFiZWxzKTtcbiAgICAgICAgfSBlbHNlIGlmIChnZW9tZXRyeS50eXBlID09PSBcIk11bHRpTGluZVN0cmluZ1wiKSB7XG4gICAgICAgICAgICBsZXQgbGluZXMgPSBnZW9tZXRyeS5jb29yZGluYXRlcztcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGluZXMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmJ1aWxkTGluZUxhYmVscyhsaW5lc1tpXSwgc2l6ZSwgbGF5b3V0LCBsYWJlbHMpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKGdlb21ldHJ5LnR5cGUgPT09IFwiUG9pbnRcIikge1xuICAgICAgICAgICAgbGFiZWxzLnB1c2gobmV3IExhYmVsUG9pbnQoZ2VvbWV0cnkuY29vcmRpbmF0ZXMsIHNpemUsIGxheW91dCkpO1xuICAgICAgICB9IGVsc2UgaWYgKGdlb21ldHJ5LnR5cGUgPT09IFwiTXVsdGlQb2ludFwiKSB7XG4gICAgICAgICAgICBsZXQgcG9pbnRzID0gZ2VvbWV0cnkuY29vcmRpbmF0ZXM7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBvaW50cy5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgICAgIGxhYmVscy5wdXNoKG5ldyBMYWJlbFBvaW50KHBvaW50c1tpXSwgc2l6ZSwgbGF5b3V0KSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoZ2VvbWV0cnkudHlwZSA9PT0gXCJQb2x5Z29uXCIpIHtcbiAgICAgICAgICAgIGxldCBjZW50cm9pZCA9IEdlby5jZW50cm9pZChnZW9tZXRyeS5jb29yZGluYXRlcyk7XG4gICAgICAgICAgICBsYWJlbHMucHVzaChuZXcgTGFiZWxQb2ludChjZW50cm9pZCwgc2l6ZSwgbGF5b3V0KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoZ2VvbWV0cnkudHlwZSA9PT0gXCJNdWx0aVBvbHlnb25cIikge1xuICAgICAgICAgICAgbGV0IGNlbnRyb2lkID0gR2VvLm11bHRpQ2VudHJvaWQoZ2VvbWV0cnkuY29vcmRpbmF0ZXMpO1xuICAgICAgICAgICAgbGFiZWxzLnB1c2gobmV3IExhYmVsUG9pbnQoY2VudHJvaWQsIHNpemUsIGxheW91dCkpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGxhYmVscztcbiAgICB9LFxuXG4gICAgLy8gQnVpbGQgb25lIG9yIG1vcmUgbGFiZWxzIGZvciBhIGxpbmUgZ2VvbWV0cnlcbiAgICBidWlsZExpbmVMYWJlbHMgKGxpbmUsIHNpemUsIGxheW91dCwgbGFiZWxzKSB7XG4gICAgICAgIGxldCBzdWJkaXYgPSBNYXRoLm1pbihsYXlvdXQuc3ViZGl2LCBsaW5lLmxlbmd0aCAtIDEpO1xuICAgICAgICBpZiAoc3ViZGl2ID4gMSkge1xuICAgICAgICAgICAgLy8gQ3JlYXRlIG11bHRpcGxlIGxhYmVscyBmb3IgbGluZSwgd2l0aCBlYWNoIGFsbG90dGVkIGEgcmFuZ2Ugb2Ygc2VnbWVudHNcbiAgICAgICAgICAgIC8vIGluIHdoaWNoIGl0IHdpbGwgYXR0ZW1wdCB0byBwbGFjZVxuICAgICAgICAgICAgbGV0IHNlZ19wZXJfZGl2ID0gKGxpbmUubGVuZ3RoIC0gMSkgLyBzdWJkaXY7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHN1YmRpdjsgaSsrKSB7XG4gICAgICAgICAgICAgICAgbGF5b3V0LnNlZ21lbnRfc3RhcnQgPSBNYXRoLmZsb29yKGkgKiBzZWdfcGVyX2Rpdik7XG4gICAgICAgICAgICAgICAgbGF5b3V0LnNlZ21lbnRfZW5kID0gTWF0aC5mbG9vcigoaSArIDEpICogc2VnX3Blcl9kaXYpO1xuXG4gICAgICAgICAgICAgICAgbGFiZWxzLnB1c2gobmV3IExhYmVsTGluZShzaXplLCBsaW5lLCBsYXlvdXQpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxheW91dC5zZWdtZW50X3N0YXJ0ID0gbnVsbDtcbiAgICAgICAgICAgIGxheW91dC5zZWdtZW50X2VuZCA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBsZXQgbGFiZWwgPSBuZXcgTGFiZWxMaW5lKHNpemUsIGxpbmUsIGxheW91dCk7XG4gICAgICAgICAgICBpZiAoIWxhYmVsLnRocm93X2F3YXkpe1xuICAgICAgICAgICAgICAgIGxldCBjaG9zZW5fbGFiZWwgPSBwbGFjZW1lbnRTdHJhdGVneShsYWJlbCk7XG4gICAgICAgICAgICAgICAgaWYgKGNob3Nlbl9sYWJlbCl7XG4gICAgICAgICAgICAgICAgICAgIGxhYmVscy5wdXNoKGNob3Nlbl9sYWJlbCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG59KTtcblxuY29uc3QgVEFSR0VUX1NUUkFJR0hUID0gMC40OyAvLyBPcHRpbWlzdGljIHRhcmdldCByYXRpbyBmb3Igc3RyYWlnaHQgbGFiZWxzIChsYWJlbCBsZW5ndGggLyBsaW5lIGxlbmd0aClcbmNvbnN0IFRBUkdFVF9LSU5LRUQgPSAwLjU7IC8vIE9wdGltaXN0aWMgdGFyZ2V0IHJhdGlvIGZvciBraW5rZWQgbGFiZWxzIChsYWJlbCBsZW5ndGggLyBsaW5lIGxlbmd0aClcblxuLy8gUGxhY2UgbGFiZWxzIGFjY29yZGluZyB0byB0aGUgZm9sbG93aW5nIHN0cmF0ZWd5OlxuLy8gLSBjaG9vc2UgdGhlIGJlc3Qgc3RyYWlnaHQgbGFiZWwgdGhhdCBzYXRpc2ZpZXMgdGhlIG9wdGltaXN0aWMgc3RyYWlnaHQgY3V0b2ZmIChpZiBhbnkpXG4vLyAtIGVsc2UgY2hvb3NlIHRoZSBiZXN0IGtpbmtlZCBsYWJlbCB0aGF0IHNhdGlzZmllcyB0aGUgb3B0aW1pc3RpYyBraW5rZWQgY3V0b2ZmIChpZiBhbnkpXG4vLyAtIGVsc2UgY2hvb3NlIHRoZSBiZXN0IHN0cmFpZ2h0IGxhYmVsIHRoYXQgc2F0aXNmaWVzIGl0cyBpbnRlcm5hbCAobGVzcyBvcHRpbWlzdGljKSBjdXRvZmYgKGlmIGFueSlcbi8vIC0gZWxzZSBjaG9vc2UgdGhlIGJlc3Qga2lua2VkIGxhYmVscyB0aGF0IHNhdGlzZmllcyBpdHMgaW50ZXJuYWwgKGxlc3Mgb3B0aW1pc3RpYykgY3V0b2ZmIChpZiBhbnkpXG4vLyAtIGVsc2UgZG9uJ3QgcGxhY2UgYSBsYWJlbFxuZnVuY3Rpb24gcGxhY2VtZW50U3RyYXRlZ3kobGFiZWwpe1xuICAgIGxldCBsYWJlbHNfc3RyYWlnaHQgPSBbXTtcbiAgICBsZXQgbGFiZWxzX2tpbmtlZCA9IFtdO1xuICAgIGxldCBiZXN0X3N0cmFpZ2h0X2ZpdG5lc3MgPSBJbmZpbml0eTtcbiAgICBsZXQgYmVzdF9raW5rZWRfZml0bmVzcyA9IEluZmluaXR5O1xuXG4gICAgLy8gbG9vcCB0aHJvdWdoIGFsbCBsYWJlbHNcbiAgICB3aGlsZSAobGFiZWwgJiYgIWxhYmVsLnRocm93X2F3YXkpIHtcbiAgICAgICAgaWYgKGxhYmVsLmtpbmtfaW5kZXggPiAwKXtcbiAgICAgICAgICAgIC8vIGNoZWNrIGlmIGFydGljdWxhdGVkIGxhYmVsIGlzIGFib3ZlIGxvd2VzdCBjdXRvZmZcbiAgICAgICAgICAgIGlmIChsYWJlbC5maXRuZXNzIDwgYmVzdF9raW5rZWRfZml0bmVzcyl7XG4gICAgICAgICAgICAgICAgYmVzdF9raW5rZWRfZml0bmVzcyA9IGxhYmVsLmZpdG5lc3M7XG4gICAgICAgICAgICAgICAgbGFiZWxzX2tpbmtlZC51bnNoaWZ0KGxhYmVsKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIC8vIGNoZWNrIGlmIHN0cmFpZ2h0IGxhYmVsIGlzIGFib3ZlIGxvd2VzdCBzdHJhaWdodCBjdXRvZmZcbiAgICAgICAgICAgIGlmIChsYWJlbC5maXRuZXNzIDwgYmVzdF9zdHJhaWdodF9maXRuZXNzKXtcbiAgICAgICAgICAgICAgICBiZXN0X3N0cmFpZ2h0X2ZpdG5lc3MgPSBsYWJlbC5maXRuZXNzO1xuICAgICAgICAgICAgICAgIGxhYmVsc19zdHJhaWdodC51bnNoaWZ0KGxhYmVsKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGxhYmVsID0gTGFiZWxMaW5lLm5leHRMYWJlbChsYWJlbCk7XG4gICAgfVxuXG4gICAgbGV0IGJlc3Rfc3RyYWlnaHQgPSBsYWJlbHNfc3RyYWlnaHRbMF07XG4gICAgbGV0IGJlc3Rfa2lua2VkID0gbGFiZWxzX2tpbmtlZFswXTtcblxuICAgIGlmIChsYWJlbHNfc3RyYWlnaHQubGVuZ3RoICYmIGJlc3Rfc3RyYWlnaHQuZml0bmVzcyA8IFRBUkdFVF9TVFJBSUdIVCl7XG4gICAgICAgIC8vIHJldHVybiB0aGUgYmVzdCBzdHJhaWdodCBzZWdtZW50IGlmIGl0IGlzIGFib3ZlIHRoZSBzdHJpY3RlciBzdHJhaWdodCBjdXRvZmZcbiAgICAgICAgcmV0dXJuIGJlc3Rfc3RyYWlnaHQ7XG4gICAgfVxuICAgIGVsc2UgaWYgKGxhYmVsc19raW5rZWQubGVuZ3RoICYmIGJlc3Rfa2lua2VkLmZpdG5lc3MgPCBUQVJHRVRfS0lOS0VEKXtcbiAgICAgICAgLy8gcmV0dXJuIHRoZSBiZXN0IGtpbmtlZCBzZWdtZW50IGlmIGl0IGlzIGFib3ZlIHRoZSBzdHJpY3RlciBraW5rZWQgY3V0b2ZmXG4gICAgICAgIHJldHVybiBiZXN0X2tpbmtlZDtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIC8vIG90aGVyd2lzZSByZXR1cm4gYmVzdCBvZiB3aGF0J3MgbGVmdCAoaWYgYW55KVxuICAgICAgICByZXR1cm4gYmVzdF9zdHJhaWdodCB8fCBiZXN0X2tpbmtlZDtcbiAgICB9XG59XG5cblRleHRTdHlsZS50ZXh0dXJlX2lkID0gMDsgLy8gbmFtZXNwYWNlcyBwZXItdGlsZSBsYWJlbCB0ZXh0dXJlc1xuIiwiLy8gVGV4dCBsYWJlbCByZW5kZXJpbmcgbWV0aG9kcywgY2FuIGJlIG1peGVkIGludG8gYSByZW5kZXJpbmcgc3R5bGVcblxuaW1wb3J0IHtTdHlsZVBhcnNlcn0gZnJvbSAnLi4vc3R5bGVfcGFyc2VyJztcbmltcG9ydCBUZXh0dXJlIGZyb20gJy4uLy4uL2dsL3RleHR1cmUnO1xuaW1wb3J0IEdlbyBmcm9tICcuLi8uLi9nZW8nO1xuaW1wb3J0IGxvZyBmcm9tICcuLi8uLi91dGlscy9sb2cnO1xuaW1wb3J0IFRocmVhZCBmcm9tICcuLi8uLi91dGlscy90aHJlYWQnO1xuaW1wb3J0IFdvcmtlckJyb2tlciBmcm9tICcuLi8uLi91dGlscy93b3JrZXJfYnJva2VyJztcbmltcG9ydCBDb2xsaXNpb24gZnJvbSAnLi4vLi4vbGFiZWxzL2NvbGxpc2lvbic7XG5pbXBvcnQgVGV4dFNldHRpbmdzIGZyb20gJy4uL3RleHQvdGV4dF9zZXR0aW5ncyc7XG5pbXBvcnQgQ2FudmFzVGV4dCBmcm9tICcuLi90ZXh0L2NhbnZhc190ZXh0JztcblxuLy8gbmFtZXNwYWNlcyBsYWJlbCB0ZXh0dXJlcyAoZW5zdXJlcyBuZXcgdGV4dHVyZSBuYW1lIHdoZW4gYSB0aWxlIGlzIGJ1aWx0IG11bHRpcGxlIHRpbWVzKVxubGV0IHRleHRfdGV4dHVyZV9pZCA9IDA7XG5cbmV4cG9ydCBjb25zdCBUZXh0TGFiZWxzID0ge1xuXG4gICAgcmVzZXRUZXh0ICgpIHtcbiAgICAgICAgaWYgKFRocmVhZC5pc19tYWluKSB7XG4gICAgICAgICAgICB0aGlzLmNhbnZhcyA9IG5ldyBDYW52YXNUZXh0KCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoVGhyZWFkLmlzX3dvcmtlcikge1xuICAgICAgICAgICAgdGhpcy50ZXh0cyA9IHt9OyAvLyB1bmlxdWUgdGV4dHMsIGdyb3VwZWQgYnkgdGlsZSwgYnkgc3R5bGVcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICBmcmVlVGV4dCAodGlsZSkge1xuICAgICAgICBkZWxldGUgdGhpcy50ZXh0c1t0aWxlLmtleV07XG4gICAgfSxcblxuICAgIHBhcnNlVGV4dEZlYXR1cmUgKGZlYXR1cmUsIGRyYXcsIGNvbnRleHQsIHRpbGUpIHtcbiAgICAgICAgLy8gQ29tcHV0ZSBsYWJlbCB0ZXh0XG4gICAgICAgIGxldCB0ZXh0ID0gdGhpcy5wYXJzZVRleHRTb3VyY2UoZmVhdHVyZSwgZHJhdywgY29udGV4dCk7XG4gICAgICAgIGlmICh0ZXh0ID09IG51bGwgfHwgdGV4dCA9PT0gJycpIHtcbiAgICAgICAgICAgIHJldHVybjsgLy8gbm8gdGV4dCBmb3IgdGhpcyBmZWF0dXJlXG4gICAgICAgIH1cblxuICAgICAgICAvLyBDb21wdXRlIHRleHQgc3R5bGUgYW5kIGxheW91dCBzZXR0aW5ncyBmb3IgdGhpcyBmZWF0dXJlIGxhYmVsXG4gICAgICAgIGxldCB0ZXh0X3NldHRpbmdzID0gVGV4dFNldHRpbmdzLmNvbXB1dGUoZmVhdHVyZSwgZHJhdywgY29udGV4dCk7XG4gICAgICAgIGxldCB0ZXh0X3NldHRpbmdzX2tleSA9IFRleHRTZXR0aW5ncy5rZXkodGV4dF9zZXR0aW5ncyk7XG4gICAgICAgIGxldCBsYXlvdXQgPSB0aGlzLmNvbXB1dGVUZXh0TGF5b3V0KHt9LCBmZWF0dXJlLCBkcmF3LCBjb250ZXh0LCB0aWxlLCB0ZXh0LCB0ZXh0X3NldHRpbmdzKTtcblxuICAgICAgICAvLyBmaXJzdCBsYWJlbCBpbiB0aWxlLCBvciB3aXRoIHRoaXMgc3R5bGU/XG4gICAgICAgIHRoaXMudGV4dHNbdGlsZS5rZXldID0gdGhpcy50ZXh0c1t0aWxlLmtleV0gfHwge307XG4gICAgICAgIGxldCBzaXplcyA9IHRoaXMudGV4dHNbdGlsZS5rZXldW3RleHRfc2V0dGluZ3Nfa2V5XSA9IHRoaXMudGV4dHNbdGlsZS5rZXldW3RleHRfc2V0dGluZ3Nfa2V5XSB8fCB7fTtcblxuICAgICAgICAvLyB1bmlxdWUgdGV4dCBzdHJpbmdzLCBncm91cGVkIGJ5IHRleHQgZHJhd2luZyBzdHlsZVxuICAgICAgICBpZiAoIXNpemVzW3RleHRdKSB7XG4gICAgICAgICAgICAvLyBmaXJzdCBsYWJlbCB3aXRoIHRoaXMgdGV4dC9zdHlsZS90aWxlIGNvbWJpbmF0aW9uLCBtYWtlIGEgbmV3IGxhYmVsIGVudHJ5XG4gICAgICAgICAgICBzaXplc1t0ZXh0XSA9IHtcbiAgICAgICAgICAgICAgICB0ZXh0X3NldHRpbmdzLFxuICAgICAgICAgICAgICAgIHJlZjogMCAvLyAjIG9mIHRpbWVzIHRoaXMgdGV4dC9zdHlsZSBjb21ibyBhcHBlYXJzIGluIHRpbGVcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgZHJhdywgdGV4dCwgdGV4dF9zZXR0aW5nc19rZXksIGxheW91dFxuICAgICAgICB9O1xuICAgIH0sXG5cbiAgICAvLyBDb21wdXRlIHRoZSBsYWJlbCB0ZXh0LCBkZWZhdWx0IGlzIHZhbHVlIG9mIGZlYXR1cmUucHJvcGVydGllcy5uYW1lXG4gICAgLy8gLSBTdHJpbmcgdmFsdWUgaW5kaWNhdGVzIGEgZmVhdHVyZSBwcm9wZXJ0eSBsb29rLXVwLCBlLmcuIGBzaG9ydF9uYW1lYCBtZWFucyB1c2UgZmVhdHVyZS5wcm9wZXJ0aWVzLnNob3J0X25hbWVcbiAgICAvLyAtIEZ1bmN0aW9uIHdpbGwgdXNlIHRoZSByZXR1cm4gdmFsdWUgYXMgdGhlIGxhYmVsIHRleHQgKGZvciBjdXN0b20gbGFiZWxzKVxuICAgIC8vIC0gQXJyYXkgKG9mIHN0cmluZ3MgYW5kL29yIGZ1bmN0aW9ucykgZGVmaW5lcyBhIGxpc3Qgb2YgZmFsbGJhY2tzLCBldmFsdWF0ZWQgYWNjb3JkaW5nIHRvIHRoZSBhYm92ZSBydWxlcyxcbiAgICAvLyAgIHdpdGggdGhlIGZpcnN0IG5vbi1udWxsIHZhbHVlIHVzZWQgYXMgdGhlIGxhYmVsIHRleHRcbiAgICAvLyAgIGUuZy4gYFtuYW1lOmVzLCBuYW1lOmVuLCBuYW1lXWAgcHJlZmVycyBTcGFuaXNoIG5hbWVzLCBmb2xsb3dlZCBieSBFbmdsaXNoLCBhbmQgbGFzdCB0aGUgZGVmYXVsdCBsb2NhbCBuYW1lXG4gICAgcGFyc2VUZXh0U291cmNlIChmZWF0dXJlLCBkcmF3LCBjb250ZXh0KSB7XG4gICAgICAgIGxldCB0ZXh0O1xuICAgICAgICBsZXQgc291cmNlID0gZHJhdy50ZXh0X3NvdXJjZSB8fCAnbmFtZSc7XG5cbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoc291cmNlKSkge1xuICAgICAgICAgICAgZm9yIChsZXQgcz0wOyBzIDwgc291cmNlLmxlbmd0aDsgcysrKSB7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBzb3VyY2Vbc10gPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgICAgIHRleHQgPSBmZWF0dXJlLnByb3BlcnRpZXNbc291cmNlW3NdXTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiBzb3VyY2Vbc10gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICAgICAgdGV4dCA9IHNvdXJjZVtzXShjb250ZXh0KTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAodGV4dCkge1xuICAgICAgICAgICAgICAgICAgICBicmVhazsgLy8gc3RvcCBpZiB3ZSBmb3VuZCBhIHRleHQgcHJvcGVydHlcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodHlwZW9mIHNvdXJjZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIHRleHQgPSBmZWF0dXJlLnByb3BlcnRpZXNbc291cmNlXTtcbiAgICAgICAgfSBlbHNlIGlmICh0eXBlb2Ygc291cmNlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICB0ZXh0ID0gc291cmNlKGNvbnRleHQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0ZXh0O1xuICAgIH0sXG5cbiAgICBwcmVwYXJlVGV4dExhYmVscyAodGlsZSwgY29sbGlzaW9uX2dyb3VwLCBxdWV1ZSkge1xuICAgICAgICBpZiAoT2JqZWN0LmtleXModGhpcy50ZXh0c1t0aWxlLmtleV18fHt9KS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoe30pO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gZmlyc3QgY2FsbCB0byBtYWluIHRocmVhZCwgYXNrIGZvciB0ZXh0IHBpeGVsIHNpemVzXG4gICAgICAgIHJldHVybiBXb3JrZXJCcm9rZXIucG9zdE1lc3NhZ2UodGhpcy5tYWluX3RocmVhZF90YXJnZXQrJy5jYWxjVGV4dFNpemVzJywgdGhpcy50ZXh0c1t0aWxlLmtleV0pLnRoZW4odGV4dHMgPT4ge1xuXG4gICAgICAgICAgICBpZiAodGlsZS5jYW5jZWxlZCkge1xuICAgICAgICAgICAgICAgIGxvZygndHJhY2UnLCBgU3R5bGUgJHt0aGlzLm5hbWV9OiBzdG9wIHRpbGUgYnVpbGQgYmVjYXVzZSB0aWxlIHdhcyBjYW5jZWxlZDogJHt0aWxlLmtleX0sIHBvc3QtY2FsY1RleHRTaXplcygpYCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLnRleHRzW3RpbGUua2V5XSA9IHRleHRzO1xuICAgICAgICAgICAgaWYgKCF0ZXh0cykge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuYnVpbGRUZXh0TGFiZWxzKHRpbGUua2V5LCBxdWV1ZSk7XG4gICAgICAgIH0pO1xuICAgIH0sXG5cbiAgICBjb2xsaWRlQW5kUmVuZGVyVGV4dExhYmVscyAodGlsZSwgY29sbGlzaW9uX2dyb3VwLCBsYWJlbHMpIHtcbiAgICAgICAgaWYgKCFsYWJlbHMpIHtcbiAgICAgICAgICAgIENvbGxpc2lvbi5jb2xsaWRlKHt9LCBjb2xsaXNpb25fZ3JvdXAsIHRpbGUua2V5KTtcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoe30pO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIENvbGxpc2lvbi5jb2xsaWRlKGxhYmVscywgY29sbGlzaW9uX2dyb3VwLCB0aWxlLmtleSkudGhlbihsYWJlbHMgPT4ge1xuICAgICAgICAgICAgaWYgKHRpbGUuY2FuY2VsZWQpIHtcbiAgICAgICAgICAgICAgICBsb2coJ3RyYWNlJywgYHN0b3AgdGlsZSBidWlsZCBiZWNhdXNlIHRpbGUgd2FzIGNhbmNlbGVkOiAke3RpbGUua2V5fSwgcG9zdC1jb2xsaWRlKClgKTtcbiAgICAgICAgICAgICAgICByZXR1cm4ge307XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChsYWJlbHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHt9O1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBsZXQgdGV4dHMgPSB0aGlzLnRleHRzW3RpbGUua2V5XTtcbiAgICAgICAgICAgIHRoaXMuY3VsbFRleHRTdHlsZXModGV4dHMsIGxhYmVscyk7XG5cbiAgICAgICAgICAgIC8vIHNldCBhbGlnbm1lbnRzXG4gICAgICAgICAgICBsYWJlbHMuZm9yRWFjaChxID0+IHtcbiAgICAgICAgICAgICAgICBsZXQgdGV4dF9zZXR0aW5nc19rZXkgPSBxLnRleHRfc2V0dGluZ3Nfa2V5O1xuICAgICAgICAgICAgICAgIGxldCB0ZXh0X2luZm8gPSB0ZXh0c1t0ZXh0X3NldHRpbmdzX2tleV0gJiYgdGV4dHNbdGV4dF9zZXR0aW5nc19rZXldW3EudGV4dF07XG4gICAgICAgICAgICAgICAgaWYgKCF0ZXh0X2luZm8udGV4dF9zZXR0aW5ncy5jYW5fYXJ0aWN1bGF0ZSl7XG4gICAgICAgICAgICAgICAgICAgIHRleHRfaW5mby5hbGlnbiA9IHRleHRfaW5mby5hbGlnbiB8fCB7fTtcbiAgICAgICAgICAgICAgICAgICAgdGV4dF9pbmZvLmFsaWduW3EubGFiZWwuYWxpZ25dID0ge307XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIC8vIHNlY29uZCBjYWxsIHRvIG1haW4gdGhyZWFkLCBmb3IgcmFzdGVyaXppbmcgdGhlIHNldCBvZiB0ZXh0c1xuICAgICAgICAgICAgcmV0dXJuIFdvcmtlckJyb2tlci5wb3N0TWVzc2FnZSh0aGlzLm1haW5fdGhyZWFkX3RhcmdldCsnLnJhc3Rlcml6ZVRleHRzJywgdGlsZS5rZXksIHRleHRzKS50aGVuKCh7IHRleHRzLCB0ZXh0dXJlIH0pID0+IHtcbiAgICAgICAgICAgICAgICBpZiAodGlsZS5jYW5jZWxlZCkge1xuICAgICAgICAgICAgICAgICAgICBsb2coJ3RyYWNlJywgYHN0b3AgdGlsZSBidWlsZCBiZWNhdXNlIHRpbGUgd2FzIGNhbmNlbGVkOiAke3RpbGUua2V5fSwgcG9zdC1yYXN0ZXJpemVUZXh0cygpYCk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7fTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICByZXR1cm4geyBsYWJlbHMsIHRleHRzLCB0ZXh0dXJlIH07XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfSxcblxuICAgIC8vIFJlbW92ZSB1bnVzZWQgdGV4dC9zdHlsZSBjb21iaW5hdGlvbnMgdG8gYXZvaWQgdW5uZWNlc3NhcnkgcmFzdGVyaXphdGlvblxuICAgIGN1bGxUZXh0U3R5bGVzKHRleHRzLCBsYWJlbHMpIHtcbiAgICAgICAgLy8gQ291bnQgaG93IG1hbnkgdGltZXMgZWFjaCB0ZXh0L3N0eWxlIGNvbWJpbmF0aW9uIGlzIHVzZWRcbiAgICAgICAgZm9yIChsZXQgaT0wOyBpIDwgbGFiZWxzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBsZXQgbGFiZWwgPSBsYWJlbHNbaV07XG4gICAgICAgICAgICB0ZXh0c1tsYWJlbC50ZXh0X3NldHRpbmdzX2tleV1bbGFiZWwudGV4dF0ucmVmKys7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBSZW1vdmUgdGV4dC9zdHlsZSBjb21iaW5hdGlvbnMgdGhhdCBoYXZlIG5vIHZpc2libGUgbGFiZWxzXG4gICAgICAgIGZvciAobGV0IHN0eWxlIGluIHRleHRzKSB7XG4gICAgICAgICAgICBmb3IgKGxldCB0ZXh0IGluIHRleHRzW3N0eWxlXSkge1xuICAgICAgICAgICAgICAgIC8vIG5vIGxhYmVscyBmb3IgdGhpcyB0ZXh0XG4gICAgICAgICAgICAgICAgaWYgKHRleHRzW3N0eWxlXVt0ZXh0XS5yZWYgPCAxKSB7XG4gICAgICAgICAgICAgICAgICAgIGRlbGV0ZSB0ZXh0c1tzdHlsZV1bdGV4dF07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChsZXQgc3R5bGUgaW4gdGV4dHMpIHtcbiAgICAgICAgICAgIC8vIG5vIGxhYmVscyBmb3IgdGhpcyBzdHlsZVxuICAgICAgICAgICAgaWYgKE9iamVjdC5rZXlzKHRleHRzW3N0eWxlXSkubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgZGVsZXRlIHRleHRzW3N0eWxlXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvLyBDYWxsZWQgb24gbWFpbiB0aHJlYWQgZnJvbSB3b3JrZXIsIHRvIGNvbXB1dGUgdGhlIHNpemUgb2YgZWFjaCB0ZXh0IHN0cmluZyxcbiAgICAvLyB3ZXJlIGl0IHRvIGJlIHJlbmRlcmVkLiBUaGlzIGluZm8gaXMgdGhlbiB1c2VkIHRvIHBlcmZvcm0gaW5pdGlhbCBsYWJlbCBjdWxsaW5nLCAqYmVmb3JlKlxuICAgIC8vIGxhYmVscyBhcmUgYWN0dWFsbHkgcmVuZGVyZWQuXG4gICAgY2FsY1RleHRTaXplcyAodGV4dHMpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2FudmFzLnRleHRTaXplcyh0ZXh0cyk7XG4gICAgfSxcblxuICAgIC8vIENhbGxlZCBvbiBtYWluIHRocmVhZCBmcm9tIHdvcmtlciwgdG8gY3JlYXRlIGF0bGFzIG9mIGxhYmVscyBmb3IgYSB0aWxlXG4gICAgcmFzdGVyaXplVGV4dHMgKHRpbGVfa2V5LCB0ZXh0cykge1xuICAgICAgICBsZXQgY2FudmFzID0gbmV3IENhbnZhc1RleHQoKTtcbiAgICAgICAgY2FudmFzLmNsZWFyVGV4Y29vcmRDYWNoZSh0aWxlX2tleSk7XG5cbiAgICAgICAgbGV0IHRleHR1cmVfc2l6ZSA9IGNhbnZhcy5zZXRUZXh0dXJlVGV4dFBvc2l0aW9ucyh0ZXh0cywgdGhpcy5tYXhfdGV4dHVyZV9zaXplLCB0aWxlX2tleSk7XG4gICAgICAgIGxvZygndHJhY2UnLCBgdGV4dCBzdW1tYXJ5IGZvciB0aWxlICR7dGlsZV9rZXl9OiBmaXRzIGluICR7dGV4dHVyZV9zaXplWzBdfXgke3RleHR1cmVfc2l6ZVsxXX1weGApO1xuXG4gICAgICAgIC8vIGZpdHMgaW4gbWF4IHRleHR1cmUgc2l6ZT9cbiAgICAgICAgaWYgKHRleHR1cmVfc2l6ZVswXSA8IHRoaXMubWF4X3RleHR1cmVfc2l6ZSAmJiB0ZXh0dXJlX3NpemVbMV0gPCB0aGlzLm1heF90ZXh0dXJlX3NpemUpIHtcbiAgICAgICAgICAgIC8vIHVwZGF0ZSBjYW52YXMgc2l6ZSAmIHJhc3Rlcml6ZSBhbGwgdGhlIHRleHQgc3RyaW5ncyB3ZSBuZWVkXG4gICAgICAgICAgICBjYW52YXMucmVzaXplKC4uLnRleHR1cmVfc2l6ZSk7XG4gICAgICAgICAgICBjYW52YXMucmFzdGVyaXplKHRleHRzLCB0ZXh0dXJlX3NpemUsIHRpbGVfa2V5KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGxvZygnZXJyb3InLCBbXG4gICAgICAgICAgICAgICAgYExhYmVsIGF0bGFzIGZvciB0aWxlICR7dGlsZV9rZXl9IGlzICR7dGV4dHVyZV9zaXplWzBdfXgke3RleHR1cmVfc2l6ZVsxXX1weCwgYCxcbiAgICAgICAgICAgICAgICBgYnV0IG1heCBHTCB0ZXh0dXJlIHNpemUgaXMgJHt0aGlzLm1heF90ZXh0dXJlX3NpemV9eCR7dGhpcy5tYXhfdGV4dHVyZV9zaXplfXB4YF0uam9pbignJykpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gY3JlYXRlIGEgdGV4dHVyZVxuICAgICAgICBsZXQgdCA9ICdsYWJlbHMtJyArIHRpbGVfa2V5ICsgJy0nICsgKHRleHRfdGV4dHVyZV9pZCsrKTtcbiAgICAgICAgVGV4dHVyZS5jcmVhdGUodGhpcy5nbCwgdCwge1xuICAgICAgICAgICAgZWxlbWVudDogY2FudmFzLmNhbnZhcyxcbiAgICAgICAgICAgIGZpbHRlcmluZzogJ2xpbmVhcicsXG4gICAgICAgICAgICBVTlBBQ0tfUFJFTVVMVElQTFlfQUxQSEFfV0VCR0w6IHRydWVcbiAgICAgICAgfSk7XG4gICAgICAgIFRleHR1cmUucmV0YWluKHQpO1xuXG4gICAgICAgIHJldHVybiB7IHRleHRzLCB0ZXh0dXJlOiB0IH07IC8vIHRleHR1cmUgaXMgcmV0dXJuZWQgYnkgbmFtZSAobm90IGluc3RhbmNlKVxuICAgIH0sXG5cbiAgICBwcmVwcm9jZXNzVGV4dCAoZHJhdykge1xuICAgICAgICAvLyBGb250IHNldHRpbmdzIGFyZSByZXF1aXJlZFxuICAgICAgICBpZiAoIWRyYXcgfHwgIWRyYXcuZm9udCB8fCB0eXBlb2YgZHJhdy5mb250ICE9PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ29sb3JzXG4gICAgICAgIGRyYXcuZm9udC5maWxsID0gU3R5bGVQYXJzZXIuY3JlYXRlUHJvcGVydHlDYWNoZShkcmF3LmZvbnQuZmlsbCk7XG4gICAgICAgIGlmIChkcmF3LmZvbnQuc3Ryb2tlKSB7XG4gICAgICAgICAgICBkcmF3LmZvbnQuc3Ryb2tlLmNvbG9yID0gU3R5bGVQYXJzZXIuY3JlYXRlUHJvcGVydHlDYWNoZShkcmF3LmZvbnQuc3Ryb2tlLmNvbG9yKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENvbnZlcnQgZm9udCBhbmQgdGV4dCBzdHJva2Ugc2l6ZXNcbiAgICAgICAgZHJhdy5mb250LnB4X3NpemUgPSBTdHlsZVBhcnNlci5jcmVhdGVQcm9wZXJ0eUNhY2hlKGRyYXcuZm9udC5zaXplIHx8IFRleHRTZXR0aW5ncy5kZWZhdWx0cy5zaXplLCBDYW52YXNUZXh0LmZvbnRQaXhlbFNpemUpO1xuICAgICAgICBpZiAoZHJhdy5mb250LnN0cm9rZSAmJiBkcmF3LmZvbnQuc3Ryb2tlLndpZHRoICE9IG51bGwpIHtcbiAgICAgICAgICAgIGRyYXcuZm9udC5zdHJva2Uud2lkdGggPSBTdHlsZVBhcnNlci5jcmVhdGVQcm9wZXJ0eUNhY2hlKGRyYXcuZm9udC5zdHJva2Uud2lkdGgsIHBhcnNlRmxvYXQpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gT2Zmc2V0ICgyZCBhcnJheSlcbiAgICAgICAgZHJhdy5vZmZzZXQgPSBTdHlsZVBhcnNlci5jcmVhdGVQcm9wZXJ0eUNhY2hlKGRyYXcub2Zmc2V0LCB2ID0+IChBcnJheS5pc0FycmF5KHYpICYmIHYubWFwKHBhcnNlRmxvYXQpKSB8fCAwKTtcblxuICAgICAgICAvLyBCdWZmZXIgKDFkIHZhbHVlIG9yIG9yIDJkIGFycmF5KVxuICAgICAgICBkcmF3LmJ1ZmZlciA9IFN0eWxlUGFyc2VyLmNyZWF0ZVByb3BlcnR5Q2FjaGUoZHJhdy5idWZmZXIsIHYgPT4gKEFycmF5LmlzQXJyYXkodikgPyB2IDogW3YsIHZdKS5tYXAocGFyc2VGbG9hdCkgfHwgMCk7XG5cbiAgICAgICAgLy8gUmVwZWF0IHJ1bGVzIC0gZm9yIHRleHQgbGFiZWxzLCBkZWZhdWx0cyB0byB0aWxlIHNpemVcbiAgICAgICAgZHJhdy5yZXBlYXRfZGlzdGFuY2UgPSBTdHlsZVBhcnNlci5jcmVhdGVQcm9wZXJ0eUNhY2hlKGRyYXcucmVwZWF0X2Rpc3RhbmNlIHx8IEdlby50aWxlX3NpemUsIHBhcnNlRmxvYXQpO1xuXG4gICAgICAgIHJldHVybiBkcmF3O1xuICAgIH0sXG5cbiAgICAvLyBBZGRpdGlvbmFsIHRleHQtc3BlY2lmaWMgbGF5b3V0IHNldHRpbmdzXG4gICAgY29tcHV0ZVRleHRMYXlvdXQgKHRhcmdldCwgZmVhdHVyZSwgZHJhdywgY29udGV4dCwgdGlsZSwgdGV4dCwgdGV4dF9zZXR0aW5ncykge1xuICAgICAgICBsZXQgbGF5b3V0ID0gdGFyZ2V0IHx8IHt9O1xuXG4gICAgICAgIC8vIGNvbW1vbiBzZXR0aW5ncyB3L3BvaW50c1xuICAgICAgICBsYXlvdXQgPSB0aGlzLmNvbXB1dGVMYXlvdXQobGF5b3V0LCBmZWF0dXJlLCBkcmF3LCBjb250ZXh0LCB0aWxlKTtcblxuICAgICAgICAvLyB0aWxlIGJvdW5kYXJ5IGhhbmRsaW5nXG4gICAgICAgIGxheW91dC5jdWxsX2Zyb21fdGlsZSA9IChkcmF3LmN1bGxfZnJvbV90aWxlICE9IG51bGwpID8gZHJhdy5jdWxsX2Zyb21fdGlsZSA6IHRydWU7XG5cbiAgICAgICAgLy8gc3RhbmRhbG9uZSB0ZXh0IGNhbiBtb3ZlIGludG8gdGlsZSBpZiBzcGVjaWZpZWRcbiAgICAgICAgbGF5b3V0Lm1vdmVfaW50b190aWxlID0gKGRyYXcubW92ZV9pbnRvX3RpbGUgIT0gbnVsbCkgPyBkcmF3Lm1vdmVfaW50b190aWxlIDogdHJ1ZTtcblxuICAgICAgICAvLyByZXBlYXQgcnVsZXMgaW5jbHVkZSB0aGUgdGV4dFxuICAgICAgICBpZiAobGF5b3V0LnJlcGVhdF9kaXN0YW5jZSkge1xuICAgICAgICAgICAgbGF5b3V0LnJlcGVhdF9ncm91cCArPSAnLycgKyB0ZXh0O1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gTWF4IG51bWJlciBvZiBzdWJkaXZpc2lvbnMgdG8gdHJ5XG4gICAgICAgIGxheW91dC5zdWJkaXYgPSB0aWxlLm92ZXJ6b29tMjtcblxuICAgICAgICBsYXlvdXQuYWxpZ24gPSBkcmF3LmFsaWduO1xuXG4gICAgICAgIC8vIHVzZWQgdG8gZnVkZ2Ugd2lkdGggdmFsdWUgYXMgdGV4dCBtYXkgb3ZlcmZsb3cgYm91bmRpbmcgYm94IGlmIGl0IGhhcyBpdGFsaWMsIGJvbGQsIGV0YyBzdHlsZVxuICAgICAgICBsYXlvdXQuaXRhbGljID0gKHRleHRfc2V0dGluZ3Muc3R5bGUgIT09ICdub3JtYWwnKTtcblxuICAgICAgICByZXR1cm4gbGF5b3V0O1xuICAgIH1cblxufTtcbiIsImltcG9ydCBVdGlscyBmcm9tICcuLi8uLi91dGlscy91dGlscyc7XG5pbXBvcnQgR2VvIGZyb20gJy4uLy4uL2dlbyc7XG5pbXBvcnQge1N0eWxlUGFyc2VyfSBmcm9tICcuLi9zdHlsZV9wYXJzZXInO1xuXG52YXIgVGV4dFNldHRpbmdzO1xuXG5leHBvcnQgZGVmYXVsdCBUZXh0U2V0dGluZ3MgPSB7XG5cbiAgICAvLyBBIGtleSBmb3IgZ3JvdXBpbmcgYWxsIGxhYmVscyBvZiB0aGUgc2FtZSB0ZXh0IHN0eWxlIChlLmcuIHNhbWUgQ2FudmFzIHN0YXRlLCB0byBtaW5pbWl6ZSBzdGF0ZSBjaGFuZ2VzKVxuICAgIGtleSAoc2V0dGluZ3MpIHtcbiAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgIHNldHRpbmdzLnN0eWxlLFxuICAgICAgICAgICAgc2V0dGluZ3Mud2VpZ2h0LFxuICAgICAgICAgICAgc2V0dGluZ3MuZmFtaWx5LFxuICAgICAgICAgICAgc2V0dGluZ3MucHhfc2l6ZSxcbiAgICAgICAgICAgIHNldHRpbmdzLmZpbGwsXG4gICAgICAgICAgICBzZXR0aW5ncy5zdHJva2UsXG4gICAgICAgICAgICBzZXR0aW5ncy5zdHJva2Vfd2lkdGgsXG4gICAgICAgICAgICBzZXR0aW5ncy50cmFuc2Zvcm0sXG4gICAgICAgICAgICBzZXR0aW5ncy50ZXh0X3dyYXAsXG4gICAgICAgICAgICBzZXR0aW5ncy5tYXhfbGluZXMsXG4gICAgICAgICAgICBVdGlscy5kZXZpY2VfcGl4ZWxfcmF0aW9cbiAgICAgICAgXS5qb2luKCcvJyk7XG4gICAgfSxcblxuICAgIGRlZmF1bHRzOiB7XG4gICAgICAgIHN0eWxlOiAnbm9ybWFsJyxcbiAgICAgICAgd2VpZ2h0OiBudWxsLFxuICAgICAgICBzaXplOiAnMTJweCcsXG4gICAgICAgIHB4X3NpemU6IDEyLFxuICAgICAgICBmYW1pbHk6ICdIZWx2ZXRpY2EnLFxuICAgICAgICBmaWxsOiAnd2hpdGUnLFxuICAgICAgICB0ZXh0X3dyYXA6IDE1LFxuICAgICAgICBtYXhfbGluZXM6IDUsXG4gICAgICAgIGFsaWduOiAnY2VudGVyJyxcbiAgICAgICAgc3Ryb2tlOiBudWxsLFxuICAgICAgICBzdHJva2Vfd2lkdGg6IDBcbiAgICB9LFxuXG4gICAgY29tcHV0ZSAoZmVhdHVyZSwgZHJhdywgY29udGV4dCkge1xuICAgICAgICBsZXQgc3R5bGUgPSB7fTtcblxuICAgICAgICBkcmF3LmZvbnQgPSBkcmF3LmZvbnQgfHwgdGhpcy5kZWZhdWx0cztcblxuICAgICAgICAvLyBMaW5lU3RyaW5nIGxhYmVscyBjYW4gYXJ0aWN1bGF0ZSB3aGlsZSBwb2ludCBsYWJlbHMgY2Fubm90LiBOZWVkZWQgZm9yIGZ1dHVyZSB0ZXh0dXJlIGNvb3JkaW5hdGUgY2FsY3VsYXRpb25zLlxuICAgICAgICBzdHlsZS5jYW5fYXJ0aWN1bGF0ZSA9IGRyYXcuY2FuX2FydGljdWxhdGU7XG5cbiAgICAgICAgLy8gVXNlIGZpbGwgaWYgc3BlY2lmaWVkLCBvciBkZWZhdWx0XG4gICAgICAgIHN0eWxlLmZpbGwgPSAoZHJhdy5mb250LmZpbGwgJiYgVXRpbHMudG9DU1NDb2xvcihTdHlsZVBhcnNlci5ldmFsQ2FjaGVkQ29sb3JQcm9wZXJ0eShkcmF3LmZvbnQuZmlsbCwgY29udGV4dCkpKSB8fCB0aGlzLmRlZmF1bHRzLmZpbGw7XG5cbiAgICAgICAgLy8gRm9udCBwcm9wZXJ0aWVzIGFyZSBtb2RlbGVkIGFmdGVyIENTUyBuYW1lczpcbiAgICAgICAgLy8gLSBmYW1pbHk6IEhlbHZldGljYSwgRnV0dXJhLCBldGMuXG4gICAgICAgIC8vIC0gc2l6ZTogaW4gcHQsIHB4LCBvciBlbVxuICAgICAgICAvLyAtIHN0eWxlOiBub3JtYWwsIGl0YWxpYywgb2JsaXF1ZVxuICAgICAgICAvLyAtIHdlaWdodDogbm9ybWFsLCBib2xkLCBldGMuXG4gICAgICAgIC8vIC0gdHJhbnNmb3JtOiBjYXBpdGFsaXplLCB1cHBlcmNhc2UsIGxvd2VyY2FzZVxuICAgICAgICBzdHlsZS5zdHlsZSA9IGRyYXcuZm9udC5zdHlsZSB8fCB0aGlzLmRlZmF1bHRzLnN0eWxlO1xuICAgICAgICBzdHlsZS53ZWlnaHQgPSBkcmF3LmZvbnQud2VpZ2h0IHx8IHRoaXMuZGVmYXVsdHMud2VpZ2h0O1xuICAgICAgICBpZiAoZHJhdy5mb250LmZhbWlseSkge1xuICAgICAgICAgICAgc3R5bGUuZmFtaWx5ID0gZHJhdy5mb250LmZhbWlseTtcbiAgICAgICAgICAgIGlmIChzdHlsZS5mYW1pbHkgIT09IHRoaXMuZGVmYXVsdHMuZmFtaWx5KSB7XG4gICAgICAgICAgICAgICAgc3R5bGUuZmFtaWx5ICs9ICcsICcgKyB0aGlzLmRlZmF1bHRzLmZhbWlseTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHN0eWxlLmZhbWlseSA9IHRoaXMuZGVmYXVsdHMuZmFtaWx5O1xuICAgICAgICB9XG5cbiAgICAgICAgc3R5bGUudHJhbnNmb3JtID0gZHJhdy5mb250LnRyYW5zZm9ybTtcblxuICAgICAgICAvLyBvcmlnaW5hbCBzaXplIChub3QgY3VycmVudGx5IHVzZWQsIGJ1dCB1c2VmdWwgZm9yIGRlYnVnZ2luZylcbiAgICAgICAgc3R5bGUuc2l6ZSA9IGRyYXcuZm9udC5zaXplIHx8IHRoaXMuZGVmYXVsdHMuc2l6ZTtcblxuICAgICAgICAvLyBjYWxjdWxhdGVkIHBpeGVsIHNpemVcbiAgICAgICAgc3R5bGUucHhfc2l6ZSA9IFN0eWxlUGFyc2VyLmV2YWxDYWNoZWRQcm9wZXJ0eShkcmF3LmZvbnQucHhfc2l6ZSwgY29udGV4dCk7XG5cbiAgICAgICAgLy8gVXNlIHN0cm9rZSBpZiBzcGVjaWZpZWRcbiAgICAgICAgaWYgKGRyYXcuZm9udC5zdHJva2UgJiYgZHJhdy5mb250LnN0cm9rZS5jb2xvcikge1xuICAgICAgICAgICAgc3R5bGUuc3Ryb2tlID0gVXRpbHMudG9DU1NDb2xvcihTdHlsZVBhcnNlci5ldmFsQ2FjaGVkQ29sb3JQcm9wZXJ0eShkcmF3LmZvbnQuc3Ryb2tlLmNvbG9yLCBjb250ZXh0KSB8fCB0aGlzLmRlZmF1bHRzLnN0cm9rZSk7XG4gICAgICAgICAgICBzdHlsZS5zdHJva2Vfd2lkdGggPSBTdHlsZVBhcnNlci5ldmFsQ2FjaGVkUHJvcGVydHkoZHJhdy5mb250LnN0cm9rZS53aWR0aCwgY29udGV4dCkgfHwgdGhpcy5kZWZhdWx0cy5zdHJva2Vfd2lkdGg7XG4gICAgICAgIH1cblxuICAgICAgICBzdHlsZS5mb250X2NzcyA9IHRoaXMuZm9udENTUyhzdHlsZSk7XG5cbiAgICAgICAgLy8gV29yZCB3cmFwIGFuZCB0ZXh0IGFsaWdubWVudFxuICAgICAgICAvLyBOb3QgYSBmb250IHByb3BlcnRpZXMsIGJ1dCBhZmZlY3QgYXRsYXMgb2YgdW5pcXVlIHRleHQgdGV4dHVyZXNcbiAgICAgICAgbGV0IHRleHRfd3JhcCA9IGRyYXcudGV4dF93cmFwOyAvLyB1c2UgZXhwbGljaXRseSBzZXQgdmFsdWVcblxuICAgICAgICBpZiAodGV4dF93cmFwID09IG51bGwgJiYgR2VvLmdlb21ldHJ5VHlwZShmZWF0dXJlLmdlb21ldHJ5LnR5cGUpICE9PSAnbGluZScpIHtcbiAgICAgICAgICAgIC8vIHBvaW50IGxhYmVscyAoZm9yIHBvaW50IGFuZCBwb2x5Z29uIGZlYXR1cmVzKSBoYXZlIHdvcmQgd3JhcCBvbiB3L2RlZmF1bHQgbWF4IGxlbmd0aCxcbiAgICAgICAgICAgIC8vIGxpbmUgbGFiZWxzIGRlZmF1bHQgb2ZmXG4gICAgICAgICAgICB0ZXh0X3dyYXAgPSB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gc2V0dGluZyB0byAndHJ1ZScgY2F1c2VzIGRlZmF1bHQgd3JhcCB2YWx1ZSB0byBiZSB1c2VkXG4gICAgICAgIGlmICh0ZXh0X3dyYXAgPT09IHRydWUpIHtcbiAgICAgICAgICAgIHRleHRfd3JhcCA9IHRoaXMuZGVmYXVsdHMudGV4dF93cmFwO1xuICAgICAgICB9XG4gICAgICAgIHN0eWxlLnRleHRfd3JhcCA9IHRleHRfd3JhcDtcblxuICAgICAgICAvLyBtYXhfbGluZXMgc2V0dGluZyB0byB0cnVuY2F0ZSB2ZXJ5IGxvbmcgbGFiZWxzIHdpdGggYW4gZWxsaXBzaXNcbiAgICAgICAgc3R5bGUubWF4X2xpbmVzID0gZHJhdy5tYXhfbGluZXMgfHwgdGhpcy5kZWZhdWx0cy5tYXhfbGluZXM7XG5cbiAgICAgICAgcmV0dXJuIHN0eWxlO1xuICAgIH0sXG5cbiAgICAvLyBCdWlsZCBDU1Mtc3R5bGUgZm9udCBzdHJpbmcgKHRvIHNldCBDYW52YXMgZHJhdyBzdGF0ZSlcbiAgICBmb250Q1NTICh7IHN0eWxlLCB3ZWlnaHQsIHB4X3NpemUsIGZhbWlseSB9KSB7XG4gICAgICAgIHJldHVybiBbc3R5bGUsIHdlaWdodCwgcHhfc2l6ZSArICdweCcsIGZhbWlseV1cbiAgICAgICAgICAgIC5maWx0ZXIoeCA9PiB4KSAvLyByZW1vdmUgbnVsbCBwcm9wc1xuICAgICAgICAgICAgLmpvaW4oJyAnKTtcbiAgICB9XG5cbn07XG4iLCJpbXBvcnQgbG9nIGZyb20gJy4vdXRpbHMvbG9nJztcbmltcG9ydCBHZW8gZnJvbSAnLi9nZW8nO1xuaW1wb3J0IHtTdHlsZVBhcnNlcn0gZnJvbSAnLi9zdHlsZXMvc3R5bGVfcGFyc2VyJztcbmltcG9ydCBDb2xsaXNpb24gZnJvbSAnLi9sYWJlbHMvY29sbGlzaW9uJztcbmltcG9ydCBXb3JrZXJCcm9rZXIgZnJvbSAnLi91dGlscy93b3JrZXJfYnJva2VyJztcbmltcG9ydCBUZXh0dXJlIGZyb20gJy4vZ2wvdGV4dHVyZSc7XG5cbmltcG9ydCB7bWF0NCwgdmVjM30gZnJvbSAnLi91dGlscy9nbC1tYXRyaXgnO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBUaWxlIHtcblxuICAgIC8qKlxuICAgICAgICBUaWxlXG4gICAgICAgIEBjb25zdHJ1Y3RvclxuICAgICAgICBSZXF1aXJlZCBwcm9wZXJ0aWVzOlxuICAgICAgICBjb29yZHM6IG9iamVjdCB3aXRoIHt4LCB5LCB6fSBwcm9wZXJ0aWVzIGlkZW50aWZ5aW5nIHRpbGUgY29vcmRpbmF0ZSBsb2NhdGlvblxuICAgICAgICB3b3JrZXI6IHdlYiB3b3JrZXIgdG8gaGFuZGxlIHRpbGUgY29uc3RydWN0aW9uXG4gICAgKi9cbiAgICBjb25zdHJ1Y3Rvcih7IGNvb3Jkcywgc3R5bGVfem9vbSwgc291cmNlLCB3b3JrZXIsIHZpZXcgfSkge1xuICAgICAgICB0aGlzLndvcmtlciA9IHdvcmtlcjtcbiAgICAgICAgdGhpcy52aWV3ID0gdmlldztcbiAgICAgICAgdGhpcy5zb3VyY2UgPSBzb3VyY2U7XG4gICAgICAgIHRoaXMuZ2VuZXJhdGlvbiA9IG51bGw7XG5cbiAgICAgICAgdGhpcy52aXNpYmxlID0gZmFsc2U7XG4gICAgICAgIHRoaXMucHJveHlfZm9yID0gbnVsbDtcbiAgICAgICAgdGhpcy5wcm94eV9kZXB0aCA9IDA7XG4gICAgICAgIHRoaXMucHJveGllZF9hcyA9IG51bGw7XG4gICAgICAgIHRoaXMuZmFkZV9pbiA9IHRydWU7XG4gICAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlO1xuICAgICAgICB0aGlzLmxvYWRlZCA9IGZhbHNlO1xuICAgICAgICB0aGlzLmJ1aWx0ID0gZmFsc2U7XG4gICAgICAgIHRoaXMuZXJyb3IgPSBudWxsO1xuICAgICAgICB0aGlzLmRlYnVnID0ge307XG5cbiAgICAgICAgdGhpcy5jb29yZHMgPSBUaWxlLmNvb3JkaW5hdGVXaXRoTWF4Wm9vbShjb29yZHMsIHRoaXMuc291cmNlLm1heF96b29tKTtcbiAgICAgICAgdGhpcy5zdHlsZV96b29tID0gc3R5bGVfem9vbTsgLy8gem9vbSBsZXZlbCB0byBiZSB1c2VkIGZvciBzdHlsaW5nXG4gICAgICAgIHRoaXMub3Zlcnpvb20gPSBNYXRoLm1heCh0aGlzLnN0eWxlX3pvb20gLSB0aGlzLmNvb3Jkcy56LCAwKTsgLy8gbnVtYmVyIG9mIGxldmVscyBvZiBvdmVyem9vbWluZ1xuICAgICAgICB0aGlzLm92ZXJ6b29tMiA9IE1hdGgucG93KDIsIHRoaXMub3Zlcnpvb20pO1xuICAgICAgICB0aGlzLmtleSA9IFRpbGUua2V5KHRoaXMuY29vcmRzLCB0aGlzLnNvdXJjZSwgdGhpcy5zdHlsZV96b29tKTtcbiAgICAgICAgdGhpcy5taW4gPSBHZW8ubWV0ZXJzRm9yVGlsZSh0aGlzLmNvb3Jkcyk7XG4gICAgICAgIHRoaXMubWF4ID0gR2VvLm1ldGVyc0ZvclRpbGUoe3g6IHRoaXMuY29vcmRzLnggKyAxLCB5OiB0aGlzLmNvb3Jkcy55ICsgMSwgejogdGhpcy5jb29yZHMueiB9KSxcbiAgICAgICAgdGhpcy5zcGFuID0geyB4OiAodGhpcy5tYXgueCAtIHRoaXMubWluLngpLCB5OiAodGhpcy5tYXgueSAtIHRoaXMubWluLnkpIH07XG4gICAgICAgIHRoaXMuYm91bmRzID0geyBzdzogeyB4OiB0aGlzLm1pbi54LCB5OiB0aGlzLm1heC55IH0sIG5lOiB7IHg6IHRoaXMubWF4LngsIHk6IHRoaXMubWluLnkgfSB9O1xuICAgICAgICB0aGlzLmNlbnRlcl9kaXN0ID0gMDtcblxuICAgICAgICB0aGlzLm1ldGVyc19wZXJfcGl4ZWwgPSBHZW8ubWV0ZXJzUGVyUGl4ZWwodGhpcy5zdHlsZV96b29tKTtcbiAgICAgICAgdGhpcy5tZXRlcnNfcGVyX3BpeGVsX3NxID0gdGhpcy5tZXRlcnNfcGVyX3BpeGVsICogdGhpcy5tZXRlcnNfcGVyX3BpeGVsO1xuICAgICAgICB0aGlzLnVuaXRzX3Blcl9waXhlbCA9IEdlby51bml0c19wZXJfcGl4ZWwgLyB0aGlzLm92ZXJ6b29tMjsgLy8gYWRqdXN0ZWQgZm9yIG92ZXJ6b29tXG4gICAgICAgIHRoaXMudW5pdHNfcGVyX21ldGVyX292ZXJ6b29tID0gR2VvLnVuaXRzUGVyTWV0ZXIodGhpcy5jb29yZHMueikgKiB0aGlzLm92ZXJ6b29tMjsgLy8gYWRqdXN0ZWQgZm9yIG92ZXJ6b29tXG5cbiAgICAgICAgdGhpcy5tZXNoZXMgPSB7fTsgLy8gcmVuZGVyYWJsZSBWQk8gbWVzaGVzIGtleWVkIGJ5IHN0eWxlXG4gICAgICAgIHRoaXMudGV4dHVyZXMgPSBbXTsgLy8gdGV4dHVyZXMgdGhhdCB0aGUgdGlsZSBvd25zIChsYWJlbHMsIGV0Yy4pXG4gICAgICAgIHRoaXMucHJldmlvdXNfdGV4dHVyZXMgPSBbXTsgLy8gdGV4dHVyZXMgcmV0YWluZWQgYnkgdGhlIHRpbGUgaW4gdGhlIHByZXZpb3VzIGJ1aWxkIGdlbmVyYXRpb25cbiAgICAgICAgdGhpcy5uZXdfbWVzaF9zdHlsZXMgPSBbXTsgLy8gbWVzaGVzIHRoYXQgaGF2ZSBiZWVuIGJ1aWx0IHNvIGZhciBpbiBjdXJyZW50IGJ1aWxkIGdlbmVyYXRpb25cbiAgICB9XG5cbiAgICBzdGF0aWMgY3JlYXRlKHNwZWMpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBUaWxlKHNwZWMpO1xuICAgIH1cblxuICAgIHN0YXRpYyBjb29yZChjKSB7XG4gICAgICAgIHJldHVybiB7eDogYy54LCB5OiBjLnksIHo6IGMueiwga2V5OiBUaWxlLmNvb3JkS2V5KGMpfTtcbiAgICB9XG5cbiAgICBzdGF0aWMgY29vcmRLZXkoe3gsIHksIHp9KSB7XG4gICAgICAgIHJldHVybiB4ICsgJy8nICsgeSArICcvJyArIHo7XG4gICAgfVxuXG4gICAgc3RhdGljIGtleSAoY29vcmRzLCBzb3VyY2UsIHN0eWxlX3pvb20pIHtcbiAgICAgICAgY29vcmRzID0gVGlsZS5jb29yZGluYXRlV2l0aE1heFpvb20oY29vcmRzLCBzb3VyY2UubWF4X3pvb20pO1xuICAgICAgICBpZiAoY29vcmRzLnkgPCAwIHx8IGNvb3Jkcy55ID49ICgxIDw8IGNvb3Jkcy56KSB8fCBjb29yZHMueiA8IDApIHtcbiAgICAgICAgICAgIHJldHVybjsgLy8gY3VsbCB0aWxlcyBvdXQgb2YgcmFuZ2UgKHggd2lsbCB3cmFwKVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBbc291cmNlLm5hbWUsIHN0eWxlX3pvb20sIGNvb3Jkcy54LCBjb29yZHMueSwgY29vcmRzLnpdLmpvaW4oJy8nKTtcbiAgICB9XG5cbiAgICBzdGF0aWMgY29vcmRpbmF0ZUF0Wm9vbSh7eCwgeSwgeiwga2V5fSwgem9vbSkge1xuICAgICAgICBpZiAoeiAhPT0gem9vbSkge1xuICAgICAgICAgICAgbGV0IHpzY2FsZSA9IE1hdGgucG93KDIsIHogLSB6b29tKTtcbiAgICAgICAgICAgIHggPSBNYXRoLmZsb29yKHggLyB6c2NhbGUpO1xuICAgICAgICAgICAgeSA9IE1hdGguZmxvb3IoeSAvIHpzY2FsZSk7XG4gICAgICAgICAgICB6ID0gem9vbTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gVGlsZS5jb29yZCh7eCwgeSwgen0pO1xuICAgIH1cblxuICAgIHN0YXRpYyBjb29yZGluYXRlV2l0aE1heFpvb20oe3gsIHksIHp9LCBtYXhfem9vbSkge1xuICAgICAgICBpZiAobWF4X3pvb20gIT09IHVuZGVmaW5lZCAmJiB6ID4gbWF4X3pvb20pIHtcbiAgICAgICAgICAgIHJldHVybiBUaWxlLmNvb3JkaW5hdGVBdFpvb20oe3gsIHksIHp9LCBtYXhfem9vbSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFRpbGUuY29vcmQoe3gsIHksIHp9KTtcbiAgICB9XG5cbiAgICBzdGF0aWMgY2hpbGRyZW5Gb3JDb29yZGluYXRlKHt4LCB5LCB6LCBrZXl9KSB7XG4gICAgICAgIGlmICghVGlsZS5jb29yZF9jaGlsZHJlbltrZXldKSB7XG4gICAgICAgICAgICB6Kys7XG4gICAgICAgICAgICB4ICo9IDI7XG4gICAgICAgICAgICB5ICo9IDI7XG4gICAgICAgICAgICBUaWxlLmNvb3JkX2NoaWxkcmVuW2tleV0gPSBbXG4gICAgICAgICAgICAgICAgVGlsZS5jb29yZCh7eCwgeSwgICAgICB6fSksIFRpbGUuY29vcmQoe3g6IHgrMSwgeSwgICAgICB6fSksXG4gICAgICAgICAgICAgICAgVGlsZS5jb29yZCh7eCwgeTogeSsxLCB6fSksIFRpbGUuY29vcmQoe3g6IHgrMSwgeTogeSsxLCB6fSlcbiAgICAgICAgICAgIF07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFRpbGUuY29vcmRfY2hpbGRyZW5ba2V5XTtcbiAgICB9XG5cbiAgICBzdGF0aWMgaXNEZXNjZW5kYW50KHBhcmVudCwgZGVzY2VuZGFudCkge1xuICAgICAgICBpZiAoZGVzY2VuZGFudC56ID4gcGFyZW50LnopIHtcbiAgICAgICAgICAgIGxldCB7eCwgeX0gPSBUaWxlLmNvb3JkaW5hdGVBdFpvb20oZGVzY2VuZGFudCwgcGFyZW50LnopO1xuICAgICAgICAgICAgcmV0dXJuIChwYXJlbnQueCA9PT0geCAmJiBwYXJlbnQueSA9PT0geSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8vIFNvcnQgYSBzZXQgb2YgdGlsZSBpbnN0YW5jZXMgKHdoaWNoIGFscmVhZHkgaGF2ZSBhIGRpc3RhbmNlIGZyb20gY2VudGVyIHRpbGUgY29tcHV0ZWQpXG4gICAgc3RhdGljIHNvcnQodGlsZXMpIHtcbiAgICAgICAgcmV0dXJuIHRpbGVzLnNvcnQoKGEsIGIpID0+IHtcbiAgICAgICAgICAgIGxldCBhZCA9IGEuY2VudGVyX2Rpc3Q7XG4gICAgICAgICAgICBsZXQgYmQgPSBiLmNlbnRlcl9kaXN0O1xuICAgICAgICAgICAgcmV0dXJuIChiZCA+IGFkID8gLTEgOiAoYmQgPT09IGFkID8gMCA6IDEpKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gRnJlZSByZXNvdXJjZXMgb3duZWQgYnkgdGlsZVxuICAgIGZyZWVSZXNvdXJjZXMgKCkge1xuICAgICAgICBmb3IgKGxldCBtIGluIHRoaXMubWVzaGVzKSB7XG4gICAgICAgICAgICB0aGlzLm1lc2hlc1ttXS5kZXN0cm95KCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5tZXNoZXMgPSB7fTtcblxuICAgICAgICB0aGlzLnRleHR1cmVzLmZvckVhY2godCA9PiBUZXh0dXJlLnJlbGVhc2UodCkpO1xuICAgICAgICB0aGlzLnRleHR1cmVzID0gW107XG5cbiAgICAgICAgdGhpcy5wcmV2aW91c190ZXh0dXJlcy5mb3JFYWNoKHQgPT4gVGV4dHVyZS5yZWxlYXNlKHQpKTtcbiAgICAgICAgdGhpcy5wcmV2aW91c190ZXh0dXJlcyA9IFtdO1xuICAgIH1cblxuICAgIGRlc3Ryb3koKSB7XG4gICAgICAgIHRoaXMud29ya2VyTWVzc2FnZSgnc2VsZi5yZW1vdmVUaWxlJywgdGhpcy5rZXkpO1xuICAgICAgICB0aGlzLmZyZWVSZXNvdXJjZXMoKTtcbiAgICAgICAgdGhpcy53b3JrZXIgPSBudWxsO1xuICAgIH1cblxuICAgIGJ1aWxkQXNNZXNzYWdlKCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAga2V5OiB0aGlzLmtleSxcbiAgICAgICAgICAgIHNvdXJjZTogdGhpcy5zb3VyY2UubmFtZSxcbiAgICAgICAgICAgIGNvb3JkczogdGhpcy5jb29yZHMsXG4gICAgICAgICAgICBtaW46IHRoaXMubWluLFxuICAgICAgICAgICAgbWF4OiB0aGlzLm1heCxcbiAgICAgICAgICAgIHVuaXRzX3Blcl9waXhlbDogdGhpcy51bml0c19wZXJfcGl4ZWwsXG4gICAgICAgICAgICBtZXRlcnNfcGVyX3BpeGVsOiB0aGlzLm1ldGVyc19wZXJfcGl4ZWwsXG4gICAgICAgICAgICBtZXRlcnNfcGVyX3BpeGVsX3NxOiB0aGlzLm1ldGVyc19wZXJfcGl4ZWxfc3EsXG4gICAgICAgICAgICB1bml0c19wZXJfbWV0ZXJfb3Zlcnpvb206IHRoaXMudW5pdHNfcGVyX21ldGVyX292ZXJ6b29tLFxuICAgICAgICAgICAgc3R5bGVfem9vbTogdGhpcy5zdHlsZV96b29tLFxuICAgICAgICAgICAgb3Zlcnpvb206IHRoaXMub3Zlcnpvb20sXG4gICAgICAgICAgICBvdmVyem9vbTI6IHRoaXMub3Zlcnpvb20yLFxuICAgICAgICAgICAgZ2VuZXJhdGlvbjogdGhpcy5nZW5lcmF0aW9uLFxuICAgICAgICAgICAgZGVidWc6IHRoaXMuZGVidWdcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICB3b3JrZXJNZXNzYWdlICguLi5tZXNzYWdlKSB7XG4gICAgICAgIHJldHVybiBXb3JrZXJCcm9rZXIucG9zdE1lc3NhZ2UodGhpcy53b3JrZXIsIC4uLm1lc3NhZ2UpO1xuICAgIH1cblxuICAgIGJ1aWxkKGdlbmVyYXRpb24sIHsgZmFkZV9pbiA9IHRydWUgfSA9IHt9KSB7XG4gICAgICAgIHRoaXMuZ2VuZXJhdGlvbiA9IGdlbmVyYXRpb247XG4gICAgICAgIHRoaXMuZmFkZV9pbiA9IGZhZGVfaW47XG4gICAgICAgIGlmICghdGhpcy5sb2FkZWQpIHtcbiAgICAgICAgICAgIHRoaXMubG9hZGluZyA9IHRydWU7XG4gICAgICAgICAgICB0aGlzLmJ1aWx0ID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMud29ya2VyTWVzc2FnZSgnc2VsZi5idWlsZFRpbGUnLCB7IHRpbGU6IHRoaXMuYnVpbGRBc01lc3NhZ2UoKSB9KS5jYXRjaChlID0+IHsgdGhyb3cgZTsgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICAgIENhbGxlZCBvbiB3b3JrZXIgdG8gY2FuY2VsIGxvYWRpbmdcbiAgICAgICAgU3RhdGljIG1ldGhvZCBiZWNhdXNlIHRoZSB3b3JrZXIgb25seSBoYXMgb2JqZWN0IHJlcHJlc2VudGF0aW9ucyBvZiB0aWxlIGRhdGEsIHRoZXJlIGlzIG5vXG4gICAgICAgIHRpbGUgaW5zdGFuY2UgY3JlYXRlZCB5ZXQuXG4gICAgKi9cbiAgICBzdGF0aWMgY2FuY2VsKHRpbGUpIHtcbiAgICAgICAgaWYgKHRpbGUpIHtcbiAgICAgICAgICAgIHRpbGUuY2FuY2VsZWQgPSB0cnVlO1xuICAgICAgICAgICAgaWYgKHRpbGUuc291cmNlX2RhdGEgJiYgdGlsZS5zb3VyY2VfZGF0YS5yZXF1ZXN0KSB7XG4gICAgICAgICAgICAgICAgdGlsZS5zb3VyY2VfZGF0YS5yZXF1ZXN0LmFib3J0KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBUaWxlLmFib3J0QnVpbGQodGlsZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBQcm9jZXNzIGdlb21ldHJ5IGZvciB0aWxlIC0gY2FsbGVkIGJ5IHdlYiB3b3JrZXJcbiAgICAvLyBSZXR1cm5zIGEgc2V0IG9mIHRpbGUga2V5cyB0aGF0IHNob3VsZCBiZSBzZW50IHRvIHRoZSBtYWluIHRocmVhZCAoc28gdGhhdCB3ZSBjYW4gbWluaW1pemUgZGF0YSBleGNoYW5nZSBiZXR3ZWVuIHdvcmtlciBhbmQgbWFpbiB0aHJlYWQpXG4gICAgc3RhdGljIGJ1aWxkR2VvbWV0cnkgKHRpbGUsIHsgc2NlbmVfaWQsIGxheWVycywgc3R5bGVzLCBnbG9iYWwgfSkge1xuICAgICAgICB0aWxlLmRlYnVnLnJlbmRlcmluZyA9ICtuZXcgRGF0ZSgpO1xuICAgICAgICB0aWxlLmRlYnVnLmZlYXR1cmVzID0gMDtcblxuICAgICAgICBsZXQgZGF0YSA9IHRpbGUuc291cmNlX2RhdGE7XG5cbiAgICAgICAgQ29sbGlzaW9uLnN0YXJ0VGlsZSh0aWxlLmtleSk7XG5cbiAgICAgICAgLy8gUHJvY2VzcyBlYWNoIHRvcC1sZXZlbCBsYXllclxuICAgICAgICBmb3IgKGxldCBsYXllcl9uYW1lIGluIGxheWVycykge1xuICAgICAgICAgICAgbGV0IGxheWVyID0gbGF5ZXJzW2xheWVyX25hbWVdO1xuICAgICAgICAgICAgLy8gU2tpcCBsYXllcnMgd2l0aCBubyBkYXRhIHNvdXJjZSBkZWZpbmVkXG4gICAgICAgICAgICBpZiAoIWxheWVyIHx8ICFsYXllci5jb25maWcuZGF0YSkge1xuICAgICAgICAgICAgICAgIGxvZygnd2FybicsIGBMYXllciAke2xheWVyX25hbWV9IHdhcyBkZWZpbmVkIHdpdGhvdXQgYSBnZW9tZXRyeSBkYXRhIHNvdXJjZSBhbmQgd2lsbCBub3QgYmUgcmVuZGVyZWQuYCk7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIFNvdXJjZSBuYW1lcyBkb24ndCBtYXRjaFxuICAgICAgICAgICAgaWYgKGxheWVyLmNvbmZpZy5kYXRhLnNvdXJjZSAhPT0gdGlsZS5zb3VyY2UpIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gR2V0IGRhdGEgZm9yIG9uZSBvciBtb3JlIGxheWVycyBmcm9tIHNvdXJjZVxuICAgICAgICAgICAgbGV0IHNvdXJjZV9sYXllcnMgPSBUaWxlLmdldERhdGFGb3JTb3VyY2UoZGF0YSwgbGF5ZXIuY29uZmlnLmRhdGEsIGxheWVyX25hbWUpO1xuXG4gICAgICAgICAgICAvLyBSZW5kZXIgZmVhdHVyZXMgaW4gbGF5ZXJcbiAgICAgICAgICAgIGZvciAobGV0IHM9MDsgcyA8IHNvdXJjZV9sYXllcnMubGVuZ3RoOyBzKyspIHtcbiAgICAgICAgICAgICAgICBsZXQgc291cmNlX2xheWVyID0gc291cmNlX2xheWVyc1tzXTtcbiAgICAgICAgICAgICAgICBsZXQgZ2VvbSA9IHNvdXJjZV9sYXllci5nZW9tO1xuICAgICAgICAgICAgICAgIGlmICghZ2VvbSkge1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBmb3IgKGxldCBmID0gMDsgZiA8IGdlb20uZmVhdHVyZXMubGVuZ3RoOyBmKyspIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGZlYXR1cmUgPSBnZW9tLmZlYXR1cmVzW2ZdO1xuICAgICAgICAgICAgICAgICAgICBpZiAoZmVhdHVyZS5nZW9tZXRyeSA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsgLy8gc2tpcCBmZWF0dXJlcyB3L28gZ2VvbWV0cnkgKHZhbGlkIEdlb0pTT04pXG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBsZXQgY29udGV4dCA9IFN0eWxlUGFyc2VyLmdldEZlYXR1cmVQYXJzZUNvbnRleHQoZmVhdHVyZSwgdGlsZSwgZ2xvYmFsKTtcbiAgICAgICAgICAgICAgICAgICAgY29udGV4dC53aW5kaW5nID0gdGlsZS5kZWZhdWx0X3dpbmRpbmc7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRleHQuc291cmNlID0gdGlsZS5zb3VyY2U7ICAgICAgICAvLyBhZGQgZGF0YSBzb3VyY2UgbmFtZVxuICAgICAgICAgICAgICAgICAgICBjb250ZXh0LmxheWVyID0gc291cmNlX2xheWVyLmxheWVyOyAgLy8gYWRkIGRhdGEgc291cmNlIGxheWVyIG5hbWVcblxuICAgICAgICAgICAgICAgICAgICAvLyBHZXQgZHJhdyBncm91cHMgZm9yIHRoaXMgZmVhdHVyZVxuICAgICAgICAgICAgICAgICAgICBsZXQgZHJhd19ncm91cHMgPSBsYXllci5idWlsZERyYXdHcm91cHMoY29udGV4dCwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgIGlmICghZHJhd19ncm91cHMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gUmVuZGVyIGRyYXcgZ3JvdXBzXG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGdyb3VwX25hbWUgaW4gZHJhd19ncm91cHMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBncm91cCA9IGRyYXdfZ3JvdXBzW2dyb3VwX25hbWVdO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFncm91cC52aXNpYmxlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEFkZCB0byBzdHlsZVxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHN0eWxlX25hbWUgPSBncm91cC5zdHlsZSB8fCBncm91cF9uYW1lO1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHN0eWxlID0gc3R5bGVzW3N0eWxlX25hbWVdO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXN0eWxlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nKCd3YXJuJywgYFN0eWxlICcke3N0eWxlX25hbWV9JyBub3QgZm91bmQsIHNraXBwaW5nIGxheWVyICcke2xheWVyX25hbWV9JzpgLCBncm91cCwgZmVhdHVyZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQubGF5ZXJzID0gZ3JvdXAubGF5ZXJzOyAgLy8gYWRkIG1hdGNoaW5nIGRyYXcgbGF5ZXJzXG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlLmFkZEZlYXR1cmUoZmVhdHVyZSwgZ3JvdXAsIGNvbnRleHQpO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgdGlsZS5kZWJ1Zy5mZWF0dXJlcysrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aWxlLmRlYnVnLnJlbmRlcmluZyA9ICtuZXcgRGF0ZSgpIC0gdGlsZS5kZWJ1Zy5yZW5kZXJpbmc7XG5cbiAgICAgICAgLy8gU2VuZCBzdHlsZXMgYmFjayB0byBtYWluIHRocmVhZCBhcyB0aGV5IGZpbmlzaCBidWlsZGluZywgaW4gdHdvIGdyb3VwczogY29sbGlzaW9uIHZzLiBub24tY29sbGlzaW9uXG4gICAgICAgIGxldCB0aWxlX3N0eWxlcyA9IHRoaXMuc3R5bGVzRm9yVGlsZSh0aWxlLmtleSwgc3R5bGVzKS5tYXAocyA9PiBzdHlsZXNbc10pO1xuICAgICAgICBUaWxlLnNlbmRTdHlsZUdyb3Vwcyh0aWxlLCB0aWxlX3N0eWxlcywgeyBzY2VuZV9pZCB9LCBzdHlsZSA9PiBzdHlsZS5jb2xsaXNpb24gPyAnY29sbGlzaW9uJyA6ICdub24tY29sbGlzaW9uJyk7XG4gICAgICAgIC8vIFRpbGUuc2VuZFN0eWxlR3JvdXBzKHRpbGUsIHRpbGVfc3R5bGVzLCB7IHNjZW5lX2lkIH0sIHN0eWxlID0+IHN0eWxlLm5hbWUpOyAvLyBjYWxsIGZvciBlYWNoIHN0eWxlXG4gICAgICAgIC8vIFRpbGUuc2VuZFN0eWxlR3JvdXBzKHRpbGUsIHRpbGVfc3R5bGVzLCB7IHNjZW5lX2lkIH0sIHN0eWxlID0+ICdzdHlsZXMnKTsgLy8gYWxsIHN0eWxlcyBpbiBzaW5nbGUgY2FsbCAocHJldmlvdXMgYmVoYXZpb3IpXG4gICAgfVxuXG4gICAgc3RhdGljIHN0eWxlc0ZvclRpbGUgKHRpbGVfa2V5LCBzdHlsZXMpIHtcbiAgICAgICAgbGV0IHRpbGVfc3R5bGVzID0gW107XG4gICAgICAgIGZvciAobGV0IHMgaW4gc3R5bGVzKSB7XG4gICAgICAgICAgICBpZiAoc3R5bGVzW3NdLmhhc0RhdGFGb3JUaWxlKHRpbGVfa2V5KSkge1xuICAgICAgICAgICAgICAgIHRpbGVfc3R5bGVzLnB1c2gocyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRpbGVfc3R5bGVzO1xuICAgIH1cblxuICAgIC8vIFNlbmQgZ3JvdXBzIG9mIHN0eWxlcyBiYWNrIHRvIG1haW4gdGhyZWFkLCBhc3luY2hyb25vdXNseSAoYXMgdGhleSBmaW5pc2ggYnVpbGRpbmcpLFxuICAgIC8vIGdyb3VwZWQgYnkgdGhlIHByb3ZpZGVkIGZ1bmN0aW9uXG4gICAgc3RhdGljIHNlbmRTdHlsZUdyb3Vwcyh0aWxlLCBzdHlsZXMsIHsgc2NlbmVfaWQgfSwgZ3JvdXBfYnkpIHtcbiAgICAgICAgLy8gR3JvdXAgc3R5bGVzXG4gICAgICAgIGxldCBncm91cHMgPSB7fTtcbiAgICAgICAgc3R5bGVzLmZvckVhY2gocyA9PiB7XG4gICAgICAgICAgICBsZXQgZ3JvdXBfbmFtZSA9IGdyb3VwX2J5KHMpO1xuICAgICAgICAgICAgZ3JvdXBzW2dyb3VwX25hbWVdID0gZ3JvdXBzW2dyb3VwX25hbWVdIHx8IFtdO1xuICAgICAgICAgICAgZ3JvdXBzW2dyb3VwX25hbWVdLnB1c2gocyk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmIChPYmplY3Qua2V5cyhncm91cHMpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGxldCBwcm9ncmVzcyA9IHsgc3RhcnQ6IHRydWUgfTtcbiAgICAgICAgICAgIHRpbGUubWVzaF9kYXRhID0ge307XG5cbiAgICAgICAgICAgIGZvciAobGV0IGdyb3VwX25hbWUgaW4gZ3JvdXBzKSB7XG4gICAgICAgICAgICAgICAgbGV0IGdyb3VwID0gZ3JvdXBzW2dyb3VwX25hbWVdO1xuXG4gICAgICAgICAgICAgICAgUHJvbWlzZS5hbGwoZ3JvdXAubWFwKHN0eWxlID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN0eWxlLmVuZERhdGEodGlsZSkudGhlbihzdHlsZV9kYXRhID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdHlsZV9kYXRhKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGlsZS5tZXNoX2RhdGFbc3R5bGUubmFtZV0gPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlcnRleF9kYXRhOiBzdHlsZV9kYXRhLnZlcnRleF9kYXRhLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZXJ0ZXhfZWxlbWVudHM6IHN0eWxlX2RhdGEudmVydGV4X2VsZW1lbnRzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmlmb3Jtczogc3R5bGVfZGF0YS51bmlmb3JtcyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dHVyZXM6IHN0eWxlX2RhdGEudGV4dHVyZXNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9KSlcbiAgICAgICAgICAgICAgICAudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGxvZygndHJhY2UnLCBgRmluaXNoZWQgc3R5bGUgZ3JvdXAgJyR7Z3JvdXBfbmFtZX0nIGZvciB0aWxlICR7dGlsZS5rZXl9YCk7XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gQ2xlYXIgZ3JvdXAgYW5kIGNoZWNrIGlmIGFsbCBncm91cHMgZmluaXNoZWRcbiAgICAgICAgICAgICAgICAgICAgZ3JvdXBzW2dyb3VwX25hbWVdID0gW107XG4gICAgICAgICAgICAgICAgICAgIGlmIChPYmplY3Qua2V5cyhncm91cHMpLmV2ZXJ5KGcgPT4gZ3JvdXBzW2ddLmxlbmd0aCA9PT0gMCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb2dyZXNzLmRvbmUgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gU2VuZCBtZXNoZXMgdG8gbWFpbiB0aHJlYWRcbiAgICAgICAgICAgICAgICAgICAgV29ya2VyQnJva2VyLnBvc3RNZXNzYWdlKFxuICAgICAgICAgICAgICAgICAgICAgICAgYFRpbGVNYW5hZ2VyXyR7c2NlbmVfaWR9LmJ1aWxkVGlsZVN0eWxlc0NvbXBsZXRlZGAsXG4gICAgICAgICAgICAgICAgICAgICAgICBXb3JrZXJCcm9rZXIud2l0aFRyYW5zZmVyYWJsZXMoeyB0aWxlOiBUaWxlLnNsaWNlKHRpbGUsIFsnbWVzaF9kYXRhJ10pLCBwcm9ncmVzcyB9KVxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICBwcm9ncmVzcy5zdGFydCA9IG51bGw7XG4gICAgICAgICAgICAgICAgICAgIHRpbGUubWVzaF9kYXRhID0ge307IC8vIHJlc2V0IHNvIGVhY2ggZ3JvdXAgc2VuZHMgc2VwYXJhdGUgc2V0IG9mIHN0eWxlIG1lc2hlc1xuXG4gICAgICAgICAgICAgICAgICAgIGlmIChwcm9ncmVzcy5kb25lKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBDb2xsaXNpb24ucmVzZXRUaWxlKHRpbGUua2V5KTsgLy8gY2xlYXIgY29sbGlzaW9uIGlmIHdlJ3JlIGRvbmUgd2l0aCB0aGUgdGlsZVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAvLyBOb3RoaW5nIHRvIGJ1aWxkLCByZXR1cm4gZW1wdHkgdGlsZSB0byBtYWluIHRocmVhZFxuICAgICAgICAgICAgV29ya2VyQnJva2VyLnBvc3RNZXNzYWdlKFxuICAgICAgICAgICAgICAgIGBUaWxlTWFuYWdlcl8ke3NjZW5lX2lkfS5idWlsZFRpbGVTdHlsZXNDb21wbGV0ZWRgLFxuICAgICAgICAgICAgICAgIFdvcmtlckJyb2tlci53aXRoVHJhbnNmZXJhYmxlcyh7IHRpbGU6IFRpbGUuc2xpY2UodGlsZSksIHByb2dyZXNzOiB7IHN0YXJ0OiB0cnVlLCBkb25lOiB0cnVlIH0gfSlcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBDb2xsaXNpb24ucmVzZXRUaWxlKHRpbGUua2V5KTsgLy8gY2xlYXIgY29sbGlzaW9uIGlmIHdlJ3JlIGRvbmUgd2l0aCB0aGUgdGlsZVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICAgIFJldHJpZXZlcyBnZW9tZXRyeSBmcm9tIGEgdGlsZSBhY2NvcmRpbmcgdG8gYSBkYXRhIHNvdXJjZSBkZWZpbml0aW9uXG4gICAgICAgIFJldHVybnMgYW4gYXJyYXkgb2Ygb2JqZWN0cyB3aXRoOlxuICAgICAgICAgICAgbGF5ZXI6IHNvdXJjZSBsYXllciBuYW1lXG4gICAgICAgICAgICBnZW9tOiBHZW9KU09OIEZlYXR1cmVDb2xsZWN0aW9uXG4gICAgKi9cbiAgICBzdGF0aWMgZ2V0RGF0YUZvclNvdXJjZSAoc291cmNlX2RhdGEsIHNvdXJjZV9jb25maWcsIGRlZmF1bHRfbGF5ZXIgPSBudWxsKSB7XG4gICAgICAgIHZhciBsYXllcnMgPSBbXTtcblxuICAgICAgICBpZiAoc291cmNlX2NvbmZpZyAhPSBudWxsKSB7XG4gICAgICAgICAgICAvLyBJZiBubyBsYXllciBzcGVjaWZpZWQsIGFuZCBhIGRlZmF1bHQgc291cmNlIGxheWVyIGV4aXN0c1xuICAgICAgICAgICAgaWYgKCFzb3VyY2VfY29uZmlnLmxheWVyICYmIHNvdXJjZV9kYXRhLmxheWVycy5fZGVmYXVsdCkge1xuICAgICAgICAgICAgICAgIGxheWVycy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgZ2VvbTogc291cmNlX2RhdGEubGF5ZXJzLl9kZWZhdWx0XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBJZiBubyBsYXllciBzcGVjaWZpZWQsIGFuZCBhIGRlZmF1bHQgcmVxdWVzdGVkIGxheWVyIGV4aXN0c1xuICAgICAgICAgICAgZWxzZSBpZiAoIXNvdXJjZV9jb25maWcubGF5ZXIgJiYgZGVmYXVsdF9sYXllcikge1xuICAgICAgICAgICAgICAgIGxheWVycy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgbGF5ZXI6IGRlZmF1bHRfbGF5ZXIsXG4gICAgICAgICAgICAgICAgICAgIGdlb206IHNvdXJjZV9kYXRhLmxheWVyc1tkZWZhdWx0X2xheWVyXVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gSWYgYSBsYXllciBpcyBzcGVjaWZpZWQgYnkgbmFtZSwgdXNlIGl0XG4gICAgICAgICAgICBlbHNlIGlmICh0eXBlb2Ygc291cmNlX2NvbmZpZy5sYXllciA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICBsYXllcnMucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgIGxheWVyOiBzb3VyY2VfY29uZmlnLmxheWVyLFxuICAgICAgICAgICAgICAgICAgICBnZW9tOiBzb3VyY2VfZGF0YS5sYXllcnNbc291cmNlX2NvbmZpZy5sYXllcl1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIElmIG11bHRpcGxlIGxheWVycyBhcmUgc3BlY2lmaWVkIGJ5IG5hbWUsIGNvbWJpbmUgdGhlbVxuICAgICAgICAgICAgZWxzZSBpZiAoQXJyYXkuaXNBcnJheShzb3VyY2VfY29uZmlnLmxheWVyKSkge1xuICAgICAgICAgICAgICAgIHNvdXJjZV9jb25maWcubGF5ZXIuZm9yRWFjaChsYXllciA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChzb3VyY2VfZGF0YS5sYXllcnNbbGF5ZXJdICYmIHNvdXJjZV9kYXRhLmxheWVyc1tsYXllcl0uZmVhdHVyZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxheWVycy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXllcixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZW9tOiBzb3VyY2VfZGF0YS5sYXllcnNbbGF5ZXJdXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGxheWVycztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgICBDYWxsZWQgb24gbWFpbiB0aHJlYWQgd2hlbiBhIHdlYiB3b3JrZXIgY29tcGxldGVzIHByb2Nlc3NpbmdcbiAgICAgICBmb3IgYSBzaW5nbGUgdGlsZS5cbiAgICAqL1xuICAgIGJ1aWxkTWVzaGVzKHN0eWxlcywgcHJvZ3Jlc3MpIHtcbiAgICAgICAgaWYgKHRoaXMuZXJyb3IpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIERlYnVnXG4gICAgICAgIHRoaXMuZGVidWcuZ2VvbWV0cmllcyA9IDA7XG4gICAgICAgIHRoaXMuZGVidWcuYnVmZmVyX3NpemUgPSAwO1xuXG4gICAgICAgIC8vIENyZWF0ZSBWQk9zXG4gICAgICAgIGxldCBtZXNoZXMgPSB7fSwgdGV4dHVyZXMgPSBbXTsgLy8gbmV3IGRhdGEgdG8gYmUgYWRkZWQgdG8gdGlsZVxuICAgICAgICBsZXQgbWVzaF9kYXRhID0gdGhpcy5tZXNoX2RhdGE7XG4gICAgICAgIGlmIChtZXNoX2RhdGEpIHtcbiAgICAgICAgICAgIGZvciAodmFyIHMgaW4gbWVzaF9kYXRhKSB7XG4gICAgICAgICAgICAgICAgaWYgKG1lc2hfZGF0YVtzXS52ZXJ0ZXhfZGF0YSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRlYnVnLmJ1ZmZlcl9zaXplICs9IG1lc2hfZGF0YVtzXS52ZXJ0ZXhfZGF0YS5ieXRlTGVuZ3RoO1xuICAgICAgICAgICAgICAgICAgICBpZiAobWVzaF9kYXRhW3NdLnZlcnRleF9lbGVtZW50cykge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kZWJ1Zy5idWZmZXJfc2l6ZSArPSBtZXNoX2RhdGFbc10udmVydGV4X2VsZW1lbnRzLmJ5dGVMZW5ndGg7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKCFzdHlsZXNbc10pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxvZygnd2FybicsIGBDb3VsZCBub3QgY3JlYXRlIG1lc2ggYmVjYXVzZSBzdHlsZSAnJHtzfScgbm90IGZvdW5kLCBmb3IgdGlsZSAke3RoaXMua2V5fSwgYWJvcnRpbmcgdGlsZWApO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgbWVzaGVzW3NdID0gc3R5bGVzW3NdLm1ha2VNZXNoKG1lc2hfZGF0YVtzXS52ZXJ0ZXhfZGF0YSwgbWVzaF9kYXRhW3NdLnZlcnRleF9lbGVtZW50cywgbWVzaF9kYXRhW3NdKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kZWJ1Zy5nZW9tZXRyaWVzICs9IG1lc2hlc1tzXS5nZW9tZXRyeV9jb3VudDtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyBBc3NpZ24gdGV4dHVyZSBvd25lcnNoaXAgdG8gdGlsZXNcbiAgICAgICAgICAgICAgICAvLyBOb3RlIHRoYXQgaXQncyB2YWxpZCBmb3IgYSBzaW5nbGUgdGV4dHVyZSB0byBiZSByZWZlcmVuY2VkIGZyb20gbXVsdGlwbGUgc3R5bGVzXG4gICAgICAgICAgICAgICAgLy8gKGUuZy4gc2FtZSByYXN0ZXIgdGV4dHVyZSBhdHRhY2hlZCB0byBtdWx0aXBsZSBzb3VyY2VzKS4gVGhpcyBtZWFucyB0aGUgc2FtZVxuICAgICAgICAgICAgICAgIC8vIHRleHR1cmUgbWF5IGJlIGFkZGVkIHRvIHRoZSB0aWxlJ3MgdGV4dHVyZSBsaXN0IG1vcmUgdGhhbiBvbmNlLCB3aGljaCBlbnN1cmVzXG4gICAgICAgICAgICAgICAgLy8gdGhhdCBpdCBpcyBwcm9wZXJseSByZWxlYXNlZCAodG8gbWF0Y2ggaXRzIHJldGFpbiBjb3VudCkuXG4gICAgICAgICAgICAgICAgaWYgKG1lc2hfZGF0YVtzXS50ZXh0dXJlcykge1xuICAgICAgICAgICAgICAgICAgICB0ZXh0dXJlcy5wdXNoKC4uLm1lc2hfZGF0YVtzXS50ZXh0dXJlcyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGRlbGV0ZSB0aGlzLm1lc2hfZGF0YTtcblxuICAgICAgICAvLyBJbml0aWFsaXplIHRyYWNraW5nIGZvciB0aGlzIHRpbGUgZ2VuZXJhdGlvblxuICAgICAgICBpZiAocHJvZ3Jlc3Muc3RhcnQpIHtcbiAgICAgICAgICAgIHRoaXMubmV3X21lc2hfc3R5bGVzID0gW107IC8vIGtlZXAgdHJhY2sgb2Ygd2hpY2ggbWVzaGVzIHdlcmUgYnVpbHQgYXMgcGFydCBvZiBjdXJyZW50IGdlbmVyYXRpb25cbiAgICAgICAgICAgIHRoaXMucHJldmlvdXNfdGV4dHVyZXMgPSBbLi4udGhpcy50ZXh0dXJlc107IC8vIGNvcHkgb2xkIGxpc3Qgb2YgdGV4dHVyZXNcbiAgICAgICAgICAgIHRoaXMudGV4dHVyZXMgPSBbXTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIE5ldyBtZXNoZXNcbiAgICAgICAgZm9yIChsZXQgbSBpbiBtZXNoZXMpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLm1lc2hlc1ttXSkge1xuICAgICAgICAgICAgICAgIHRoaXMubWVzaGVzW21dLmRlc3Ryb3koKTsgLy8gZnJlZSBvbGQgbWVzaFxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5tZXNoZXNbbV0gPSBtZXNoZXNbbV07IC8vIHNldCBuZXcgbWVzaFxuICAgICAgICAgICAgdGhpcy5uZXdfbWVzaF9zdHlsZXMucHVzaChtKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIE5ldyB0ZXh0dXJlc1xuICAgICAgICB0aGlzLnRleHR1cmVzLnB1c2goLi4udGV4dHVyZXMpO1xuXG4gICAgICAgIGlmIChwcm9ncmVzcy5kb25lKSB7XG4gICAgICAgICAgICAvLyBSZWxlYXNlIHVuLXJlcGxhY2VkIG1lc2hlcyAoZXhpc3RpbmcgaW4gcHJldmlvdXMgZ2VuZXJhdGlvbiwgYnV0IHdlcmVuJ3QgYnVpbHQgZm9yIHRoaXMgb25lKVxuICAgICAgICAgICAgZm9yIChsZXQgbSBpbiB0aGlzLm1lc2hlcykge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLm5ld19tZXNoX3N0eWxlcy5pbmRleE9mKG0pID09PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm1lc2hlc1ttXS5kZXN0cm95KCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5uZXdfbWVzaF9zdHlsZXMgPSBbXTtcblxuICAgICAgICAgICAgLy8gUmVsZWFzZSBvbGQgdGV4dHVyZXNcbiAgICAgICAgICAgIHRoaXMucHJldmlvdXNfdGV4dHVyZXMuZm9yRWFjaCh0ID0+IFRleHR1cmUucmVsZWFzZSh0KSk7XG4gICAgICAgICAgICB0aGlzLnByZXZpb3VzX3RleHR1cmVzID0gW107XG5cbiAgICAgICAgICAgIHRoaXMuZGVidWcuZ2VvbV9yYXRpbyA9ICh0aGlzLmRlYnVnLmdlb21ldHJpZXMgLyB0aGlzLmRlYnVnLmZlYXR1cmVzKS50b0ZpeGVkKDEpO1xuICAgICAgICAgICAgdGhpcy5wcmludERlYnVnKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgICAgQ2FsbGVkIG9uIG1haW4gdGhyZWFkIHdoZW4gd2ViIHdvcmtlciBjb21wbGV0ZXMgcHJvY2Vzc2luZywgYnV0IHRpbGUgaGFzIHNpbmNlIGJlZW4gZGlzY2FyZGVkXG4gICAgICAgIEZyZWVzIHJlc291cmNlcyB0aGF0IHdvdWxkIGhhdmUgYmVlbiB0cmFuc2ZlcnJlZCB0byB0aGUgdGlsZSBvYmplY3QuXG4gICAgICAgIFN0YXRpYyBtZXRob2QgYmVjYXVzZSB0aGUgdGlsZSBvYmplY3Qgbm8gbG9uZ2VyIGV4aXN0cyAodGhlIHRpbGUgZGF0YSByZXR1cm5lZCBieSB0aGUgd29ya2VyIGlzIHBhc3NlZCBpbnN0ZWFkKS5cbiAgICAqL1xuICAgIHN0YXRpYyBhYm9ydEJ1aWxkICh0aWxlKSB7XG4gICAgICAgIC8vIFJlbGVhc2VzIG1lc2hlc1xuICAgICAgICBpZiAodGlsZS5tZXNoX2RhdGEpIHtcbiAgICAgICAgICAgIGZvciAobGV0IHMgaW4gdGlsZS5tZXNoX2RhdGEpIHtcbiAgICAgICAgICAgICAgICBsZXQgdGV4dHVyZXMgPSB0aWxlLm1lc2hfZGF0YVtzXS50ZXh0dXJlcztcbiAgICAgICAgICAgICAgICBpZiAodGV4dHVyZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgdGV4dHVyZXMuZm9yRWFjaCh0ID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCB0ZXh0dXJlID0gVGV4dHVyZS50ZXh0dXJlc1t0XTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0ZXh0dXJlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nKCd0cmFjZScsIGByZWxlYXNpbmcgdGV4dHVyZSAke3R9IGZvciB0aWxlICR7dGlsZS5rZXl9YCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dHVyZS5yZWxlYXNlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIFVwZGF0ZSByZWxhdGl2ZSB0byB2aWV3XG4gICAgdXBkYXRlICgpIHtcbiAgICAgICAgbGV0IGNvb3JkcyA9IHRoaXMuY29vcmRzO1xuICAgICAgICBpZiAoY29vcmRzLnogIT09IHRoaXMudmlldy5jZW50ZXIudGlsZS56KSB7XG4gICAgICAgICAgICBjb29yZHMgPSBUaWxlLmNvb3JkaW5hdGVBdFpvb20oY29vcmRzLCB0aGlzLnZpZXcuY2VudGVyLnRpbGUueik7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5jZW50ZXJfZGlzdCA9IE1hdGguYWJzKHRoaXMudmlldy5jZW50ZXIudGlsZS54IC0gY29vcmRzLngpICsgTWF0aC5hYnModGhpcy52aWV3LmNlbnRlci50aWxlLnkgLSBjb29yZHMueSk7XG4gICAgfVxuXG4gICAgLy8gU2V0IGFzIGEgcHJveHkgdGlsZSBmb3IgYW5vdGhlciB0aWxlXG4gICAgc2V0UHJveHlGb3IgKHRpbGUpIHtcbiAgICAgICAgaWYgKHRpbGUpIHtcbiAgICAgICAgICAgIHRoaXMudmlzaWJsZSA9IHRydWU7XG4gICAgICAgICAgICB0aGlzLnByb3h5X2ZvciA9IHRoaXMucHJveHlfZm9yIHx8IFtdO1xuICAgICAgICAgICAgdGhpcy5wcm94eV9mb3IucHVzaCh0aWxlKTtcbiAgICAgICAgICAgIHRoaXMucHJveHlfZGVwdGggPSAxOyAvLyBkcmF3IHByb3hpZXMgYSBoYWxmLWxheWVyIGJhY2sgKG9yZGVyIGlzIHNjYWxlZCAyeCB0byBhdm9pZCBpbnRlZ2VyIHRydW5jYXRpb24pXG4gICAgICAgICAgICB0aWxlLnByb3hpZWRfYXMgPSAodGlsZS5zdHlsZV96b29tID4gdGhpcy5zdHlsZV96b29tID8gJ2NoaWxkJyA6ICdwYXJlbnQnKTtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlKCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnByb3h5X2ZvciA9IG51bGw7XG4gICAgICAgICAgICB0aGlzLnByb3h5X2RlcHRoID0gMDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIFByb3h5IHRpbGVzIG9ubHkgbmVlZCB0byByZW5kZXIgYSBzcGVjaWZpYyBzdHlsZSBpZiBhbnkgb2YgdGhlIHRpbGVzIHRoZXkgYXJlIHByb3h5aW5nICpmb3IqXG4gICAgLy8gaGF2ZW4ndCBmaW5pc2hlZCBsb2FkaW5nIHRoYXQgc3R5bGUgeWV0LiBJZiBhbGwgcHJveGllZCB0aWxlcyAqaGF2ZSogZGF0YSBmb3IgdGhhdCBzdHlsZSwgdGhlbiBpdCdzXG4gICAgLy8gc2FmZSB0byBoaWRlIHRoZSBwcm94eSB0aWxlJ3MgdmVyc2lvbi5cbiAgICBzaG91bGRQcm94eUZvclN0eWxlIChzdHlsZSkge1xuICAgICAgICByZXR1cm4gIXRoaXMucHJveHlfZm9yIHx8IHRoaXMucHJveHlfZm9yLnNvbWUodCA9PiB0Lm1lc2hlc1tzdHlsZV0gPT0gbnVsbCk7XG4gICAgfVxuXG4gICAgLy8gVXBkYXRlIG1vZGVsIG1hdHJpeCBhbmQgdGlsZSB1bmlmb3Jtc1xuICAgIHNldHVwUHJvZ3JhbSAoeyBtb2RlbCwgbW9kZWwzMiB9LCBwcm9ncmFtKSB7XG4gICAgICAgIC8vIFRpbGUgb3JpZ2luXG4gICAgICAgIHByb2dyYW0udW5pZm9ybSgnNGZ2JywgJ3VfdGlsZV9vcmlnaW4nLCBbdGhpcy5taW4ueCwgdGhpcy5taW4ueSwgdGhpcy5zdHlsZV96b29tLCB0aGlzLmNvb3Jkcy56XSk7XG4gICAgICAgIHByb2dyYW0udW5pZm9ybSgnMWYnLCAndV90aWxlX3Byb3h5X2RlcHRoJywgdGhpcy5wcm94eV9kZXB0aCk7XG5cbiAgICAgICAgLy8gTW9kZWwgLSB0cmFuc2Zvcm0gdGlsZSBzcGFjZSBpbnRvIHdvcmxkIHNwYWNlIChtZXRlcnMsIGFic29sdXRlIG1lcmNhdG9yIHBvc2l0aW9uKVxuICAgICAgICBtYXQ0LmlkZW50aXR5KG1vZGVsKTtcbiAgICAgICAgbWF0NC50cmFuc2xhdGUobW9kZWwsIG1vZGVsLCB2ZWMzLmZyb21WYWx1ZXModGhpcy5taW4ueCwgdGhpcy5taW4ueSwgMCkpO1xuICAgICAgICBtYXQ0LnNjYWxlKG1vZGVsLCBtb2RlbCwgdmVjMy5mcm9tVmFsdWVzKHRoaXMuc3Bhbi54IC8gR2VvLnRpbGVfc2NhbGUsIC0xICogdGhpcy5zcGFuLnkgLyBHZW8udGlsZV9zY2FsZSwgMSkpOyAvLyBzY2FsZSB0aWxlIGxvY2FsIGNvb3JkcyB0byBtZXRlcnNcbiAgICAgICAgbWF0NC5jb3B5KG1vZGVsMzIsIG1vZGVsKTtcbiAgICAgICAgcHJvZ3JhbS51bmlmb3JtKCdNYXRyaXg0ZnYnLCAndV9tb2RlbCcsIG1vZGVsMzIpO1xuXG4gICAgICAgIC8vIEZhZGUgaW4gbGFiZWxzIGFjY29yZGluZyB0byBwcm94eSBzdGF0dXMsIGF2b2lkaW5nIFwiZmxpY2tlcmluZ1wiIHdoZXJlXG4gICAgICAgIC8vIGxhYmVscyBxdWlja2x5IGdvIGZyb20gaW52aXNpYmxlIGJhY2sgdG8gdmlzaWJsZVxuICAgICAgICBwcm9ncmFtLnVuaWZvcm0oJzFpJywgJ3VfdGlsZV9mYWRlX2luJywgdGhpcy5mYWRlX2luICYmIHRoaXMucHJveGllZF9hcyAhPT0gJ2NoaWxkJyk7XG4gICAgfVxuXG4gICAgLy8gU2xpY2UgYSBzdWJzZXQgb2Yga2V5cyBvdXQgb2YgYSB0aWxlXG4gICAgLy8gSW5jbHVkZXMgYSBtaW5pbXVtIHNldCBvZiBwcmUtZGVmaW5lZCBrZXlzIGZvciBsb2FkIHN0YXRlLCBkZWJ1Zy4gZXRjLlxuICAgIC8vIFdlIHVzZSB0aGlzIHRvIHNlbmQgYSBzdWJzZXQgb2YgdGhlIHRpbGUgYmFjayB0byB0aGUgbWFpbiB0aHJlYWQsIHRvIG1pbmltaXplIHVubmVjZXNzYXJ5IGRhdGEgdHJhbnNmZXJcbiAgICAvLyAoZS5nLiB2ZXJ5IGxhcmdlIGl0ZW1zIGxpa2UgZmVhdHVyZSBnZW9tZXRyeSBhcmUgbm90IG5lZWRlZCBvbiB0aGUgbWFpbiB0aHJlYWQpXG4gICAgc3RhdGljIHNsaWNlICh0aWxlLCBrZXlzKSB7XG4gICAgICAgIGxldCBrZWVwID0gW1xuICAgICAgICAgICAgJ2tleScsXG4gICAgICAgICAgICAnbG9hZGluZycsXG4gICAgICAgICAgICAnbG9hZGVkJyxcbiAgICAgICAgICAgICdnZW5lcmF0aW9uJyxcbiAgICAgICAgICAgICdlcnJvcicsXG4gICAgICAgICAgICAnZGVidWcnXG4gICAgICAgIF07XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KGtleXMpKSB7XG4gICAgICAgICAgICBrZWVwLnB1c2goLi4ua2V5cyk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBCdWlsZCB0aGUgdGlsZSBzdWJzZXRcbiAgICAgICAgdmFyIHRpbGVfc3Vic2V0ID0ge307XG4gICAgICAgIGZvciAobGV0IGs9MDsgayA8IGtlZXAubGVuZ3RoOyBrKyspIHtcbiAgICAgICAgICAgIGNvbnN0IGtleSA9IGtlZXBba107XG4gICAgICAgICAgICB0aWxlX3N1YnNldFtrZXldID0gdGlsZVtrZXldO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRpbGVfc3Vic2V0O1xuICAgIH1cblxuICAgIG1lcmdlKG90aGVyKSB7XG4gICAgICAgIGZvciAodmFyIGtleSBpbiBvdGhlcikge1xuICAgICAgICAgICAgaWYgKGtleSAhPT0gJ2tleScpIHtcbiAgICAgICAgICAgICAgICB0aGlzW2tleV0gPSBvdGhlcltrZXldO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHByaW50RGVidWcgKCkge1xuICAgICAgICBsb2coJ2RlYnVnJywgYFRpbGU6IGRlYnVnIGZvciAke3RoaXMua2V5fTogWyAgJHtKU09OLnN0cmluZ2lmeSh0aGlzLmRlYnVnKX0gXWApO1xuICAgIH1cblxufVxuXG5UaWxlLmNvb3JkX2NoaWxkcmVuID0ge307IC8vIG9ubHkgYWxsb2NhdGUgY2hpbGRyZW4gY29vcmRpbmF0ZXMgb25jZSBwZXIgY29vcmRpbmF0ZVxuIiwiaW1wb3J0IFRpbGUgZnJvbSAnLi90aWxlJztcbmltcG9ydCBUaWxlUHlyYW1pZCBmcm9tICcuL3RpbGVfcHlyYW1pZCc7XG5pbXBvcnQgbG9nIGZyb20gJy4vdXRpbHMvbG9nJztcbmltcG9ydCBXb3JrZXJCcm9rZXIgZnJvbSAnLi91dGlscy93b3JrZXJfYnJva2VyJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVGlsZU1hbmFnZXIge1xuXG4gICAgY29uc3RydWN0b3IoeyBzY2VuZSwgdmlldyB9KSB7XG4gICAgICAgIHRoaXMuc2NlbmUgPSBzY2VuZTtcbiAgICAgICAgdGhpcy52aWV3ID0gdmlldztcbiAgICAgICAgdGhpcy50aWxlcyA9IHt9O1xuICAgICAgICB0aGlzLnB5cmFtaWQgPSBuZXcgVGlsZVB5cmFtaWQoKTtcbiAgICAgICAgdGhpcy52aXNpYmxlX2Nvb3JkcyA9IHt9O1xuICAgICAgICB0aGlzLnF1ZXVlZF9jb29yZHMgPSBbXTtcbiAgICAgICAgdGhpcy5idWlsZGluZ190aWxlcyA9IG51bGw7XG4gICAgICAgIHRoaXMucmVuZGVyYWJsZV90aWxlcyA9IFtdO1xuICAgICAgICB0aGlzLmFjdGl2ZV9zdHlsZXMgPSBbXTtcblxuICAgICAgICAvLyBQcm92aWRlIGEgaG9vayBmb3IgdGhpcyBvYmplY3QgdG8gYmUgY2FsbGVkIGZyb20gd29ya2VyIHRocmVhZHNcbiAgICAgICAgdGhpcy5tYWluX3RocmVhZF90YXJnZXQgPSBbJ1RpbGVNYW5hZ2VyJywgdGhpcy5zY2VuZS5pZF0uam9pbignXycpO1xuICAgICAgICBXb3JrZXJCcm9rZXIuYWRkVGFyZ2V0KHRoaXMubWFpbl90aHJlYWRfdGFyZ2V0LCB0aGlzKTtcbiAgICB9XG5cbiAgICBkZXN0cm95KCkge1xuICAgICAgICB0aGlzLmZvckVhY2hUaWxlKHRpbGUgPT4gdGlsZS5kZXN0cm95KCkpO1xuICAgICAgICB0aGlzLnRpbGVzID0ge307XG4gICAgICAgIHRoaXMucHlyYW1pZCA9IG51bGw7XG4gICAgICAgIHRoaXMudmlzaWJsZV9jb29yZHMgPSB7fTtcbiAgICAgICAgdGhpcy5xdWV1ZWRfY29vcmRzID0gW107XG4gICAgICAgIHRoaXMuc2NlbmUgPSBudWxsO1xuICAgICAgICB0aGlzLnZpZXcgPSBudWxsO1xuICAgIH1cblxuICAgIGtlZXBUaWxlKHRpbGUpIHtcbiAgICAgICAgdGhpcy50aWxlc1t0aWxlLmtleV0gPSB0aWxlO1xuICAgICAgICB0aGlzLnB5cmFtaWQuYWRkVGlsZSh0aWxlKTtcbiAgICB9XG5cbiAgICBoYXNUaWxlKGtleSkge1xuICAgICAgICByZXR1cm4gdGhpcy50aWxlc1trZXldICE9PSB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgZm9yZ2V0VGlsZShrZXkpIHtcbiAgICAgICAgaWYgKHRoaXMuaGFzVGlsZShrZXkpKSB7XG4gICAgICAgICAgICBsZXQgdGlsZSA9IHRoaXMudGlsZXNba2V5XTtcbiAgICAgICAgICAgIHRoaXMucHlyYW1pZC5yZW1vdmVUaWxlKHRpbGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgZGVsZXRlIHRoaXMudGlsZXNba2V5XTtcbiAgICAgICAgdGhpcy50aWxlQnVpbGRTdG9wKGtleSk7XG4gICAgfVxuXG4gICAgLy8gUmVtb3ZlIGEgc2luZ2xlIHRpbGVcbiAgICByZW1vdmVUaWxlKGtleSkge1xuICAgICAgICBsb2coJ3RyYWNlJywgYHRpbGUgdW5sb2FkIGZvciAke2tleX1gKTtcblxuICAgICAgICB2YXIgdGlsZSA9IHRoaXMudGlsZXNba2V5XTtcblxuICAgICAgICBpZiAodGlsZSAhPSBudWxsKSB7XG4gICAgICAgICAgICB0aWxlLmRlc3Ryb3koKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuZm9yZ2V0VGlsZSh0aWxlLmtleSk7XG4gICAgICAgIHRoaXMuc2NlbmUucmVxdWVzdFJlZHJhdygpO1xuICAgIH1cblxuICAgIC8vIFJ1biBhIGZ1bmN0aW9uIG9uIGVhY2ggdGlsZVxuICAgIGZvckVhY2hUaWxlKGZ1bmMpIHtcbiAgICAgICAgZm9yIChsZXQgdCBpbiB0aGlzLnRpbGVzKSB7XG4gICAgICAgICAgICBmdW5jKHRoaXMudGlsZXNbdF0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gUmVtb3ZlIHRpbGVzIHRoYXQgcGFzcyBhIGZpbHRlciBjb25kaXRpb25cbiAgICByZW1vdmVUaWxlcyhmaWx0ZXIpIHtcbiAgICAgICAgbGV0IHJlbW92ZV90aWxlcyA9IFtdO1xuICAgICAgICBmb3IgKGxldCB0IGluIHRoaXMudGlsZXMpIHtcbiAgICAgICAgICAgIGxldCB0aWxlID0gdGhpcy50aWxlc1t0XTtcbiAgICAgICAgICAgIGlmIChmaWx0ZXIodGlsZSkpIHtcbiAgICAgICAgICAgICAgICByZW1vdmVfdGlsZXMucHVzaCh0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBmb3IgKGxldCByPTA7IHIgPCByZW1vdmVfdGlsZXMubGVuZ3RoOyByKyspIHtcbiAgICAgICAgICAgIGxldCBrZXkgPSByZW1vdmVfdGlsZXNbcl07XG4gICAgICAgICAgICB0aGlzLnJlbW92ZVRpbGUoa2V5KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHVwZGF0ZVRpbGVzRm9yVmlldygpIHtcbiAgICAgICAgLy8gRmluZCB2aXNpYmxlIHRpbGVzIGFuZCBsb2FkIG5ldyBvbmVzXG4gICAgICAgIGxldCBwcmV2X2Nvb3JkcyA9IE9iamVjdC5rZXlzKHRoaXMudmlzaWJsZV9jb29yZHMpO1xuICAgICAgICB0aGlzLnZpc2libGVfY29vcmRzID0ge307XG4gICAgICAgIGxldCB0aWxlX2Nvb3JkcyA9IHRoaXMudmlldy5maW5kVmlzaWJsZVRpbGVDb29yZGluYXRlcygpO1xuICAgICAgICBmb3IgKGxldCBjPTA7IGMgPCB0aWxlX2Nvb3Jkcy5sZW5ndGg7IGMrKykge1xuICAgICAgICAgICAgY29uc3QgY29vcmRzID0gdGlsZV9jb29yZHNbY107XG4gICAgICAgICAgICB0aGlzLnF1ZXVlQ29vcmRpbmF0ZShjb29yZHMpO1xuICAgICAgICAgICAgdGhpcy52aXNpYmxlX2Nvb3Jkc1tjb29yZHMua2V5XSA9IGNvb3JkcztcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENoZWNrIGlmIHZpc2libGUgY29vcmRzIGNoYW5nZWRcbiAgICAgICAgLy8gVE9ETzogbW92ZSB0byBhIG5ldyB2aWV3IG1hbmFnZXIgb2JqZWN0XG4gICAgICAgIGxldCBuZXdfY29vcmRzID0gT2JqZWN0LmtleXModGhpcy52aXNpYmxlX2Nvb3Jkcyk7XG4gICAgICAgIGxldCBjb29yZHNfY2hhbmdlZCA9IGZhbHNlO1xuICAgICAgICBpZiAocHJldl9jb29yZHMubGVuZ3RoICE9PSBuZXdfY29vcmRzLmxlbmd0aCkge1xuICAgICAgICAgICAgY29vcmRzX2NoYW5nZWQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcHJldl9jb29yZHMuc29ydCgpO1xuICAgICAgICAgICAgbmV3X2Nvb3Jkcy5zb3J0KCk7XG4gICAgICAgICAgICBpZiAoIXByZXZfY29vcmRzLmV2ZXJ5KChjLCBpKSA9PiBuZXdfY29vcmRzW2ldID09PSBjKSkge1xuICAgICAgICAgICAgICAgIGNvb3Jkc19jaGFuZ2VkID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMudXBkYXRlVGlsZVN0YXRlcygpO1xuICAgIH1cblxuICAgIHVwZGF0ZVRpbGVTdGF0ZXMgKCkge1xuICAgICAgICB0aGlzLmZvckVhY2hUaWxlKHRpbGUgPT4ge1xuICAgICAgICAgICAgdGhpcy51cGRhdGVWaXNpYmlsaXR5KHRpbGUpO1xuICAgICAgICAgICAgdGlsZS51cGRhdGUoKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5sb2FkUXVldWVkQ29vcmRpbmF0ZXMoKTtcbiAgICAgICAgdGhpcy51cGRhdGVQcm94eVRpbGVzKCk7XG4gICAgICAgIHRoaXMudmlldy5wcnVuZVRpbGVzRm9yVmlldygpO1xuICAgICAgICB0aGlzLnVwZGF0ZVJlbmRlcmFibGVUaWxlcygpO1xuICAgICAgICB0aGlzLnVwZGF0ZUFjdGl2ZVN0eWxlcygpO1xuICAgIH1cblxuICAgIHVwZGF0ZVByb3h5VGlsZXMgKCkge1xuICAgICAgICBpZiAodGhpcy52aWV3Lnpvb21fZGlyZWN0aW9uID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDbGVhciBwcmV2aW91cyBwcm94aWVzXG4gICAgICAgIHRoaXMuZm9yRWFjaFRpbGUodGlsZSA9PiB0aWxlLnNldFByb3h5Rm9yKG51bGwpKTtcblxuICAgICAgICBsZXQgcHJveHkgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5mb3JFYWNoVGlsZSh0aWxlID0+IHtcbiAgICAgICAgICAgIGlmICh0aGlzLnZpZXcuem9vbV9kaXJlY3Rpb24gPT09IDEpIHtcbiAgICAgICAgICAgICAgICBpZiAodGlsZS52aXNpYmxlICYmICF0aWxlLmJ1aWx0ICYmIHRpbGUuY29vcmRzLnogPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHBhcmVudCA9IHRoaXMucHlyYW1pZC5nZXRBbmNlc3Rvcih0aWxlKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHBhcmVudCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50LnNldFByb3h5Rm9yKHRpbGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcHJveHkgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAodGhpcy52aWV3Lnpvb21fZGlyZWN0aW9uID09PSAtMSkge1xuICAgICAgICAgICAgICAgIGlmICh0aWxlLnZpc2libGUgJiYgIXRpbGUuYnVpbHQpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZGVzY2VuZGFudHMgPSB0aGlzLnB5cmFtaWQuZ2V0RGVzY2VuZGFudHModGlsZSk7XG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGk9MDsgaSA8IGRlc2NlbmRhbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBkZXNjZW5kYW50c1tpXS5zZXRQcm94eUZvcih0aWxlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb3h5ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKCFwcm94eSkge1xuICAgICAgICAgICAgdGhpcy52aWV3Lnpvb21fZGlyZWN0aW9uID0gMDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHVwZGF0ZVZpc2liaWxpdHkodGlsZSkge1xuICAgICAgICB0aWxlLnZpc2libGUgPSBmYWxzZTtcbiAgICAgICAgaWYgKHRpbGUuc3R5bGVfem9vbSA9PT0gdGhpcy52aWV3LnRpbGVfem9vbSkge1xuICAgICAgICAgICAgaWYgKHRoaXMudmlzaWJsZV9jb29yZHNbdGlsZS5jb29yZHMua2V5XSkge1xuICAgICAgICAgICAgICAgIHRpbGUudmlzaWJsZSA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBicnV0ZSBmb3JjZVxuICAgICAgICAgICAgICAgIGZvciAobGV0IGtleSBpbiB0aGlzLnZpc2libGVfY29vcmRzKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChUaWxlLmlzRGVzY2VuZGFudCh0aWxlLmNvb3JkcywgdGhpcy52aXNpYmxlX2Nvb3Jkc1trZXldKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGlsZS52aXNpYmxlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gUmVtb3ZlIHRpbGVzIHRoYXQgYXJlbid0IHZpc2libGUsIGFuZCBmbGFnIHJlbWFpbmluZyB2aXNpYmxlIG9uZXMgdG8gYmUgdXBkYXRlZCAoZm9yIGxvYWRpbmcsIHByb3h5LCBldGMuKVxuICAgIHBydW5lVG9WaXNpYmxlVGlsZXMgKCkge1xuICAgICAgICB0aGlzLnJlbW92ZVRpbGVzKHRpbGUgPT4gIXRpbGUudmlzaWJsZSk7XG4gICAgfVxuXG4gICAgZ2V0UmVuZGVyYWJsZVRpbGVzICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucmVuZGVyYWJsZV90aWxlcztcbiAgICB9XG5cbiAgICB1cGRhdGVSZW5kZXJhYmxlVGlsZXMoKSB7XG4gICAgICAgIHRoaXMucmVuZGVyYWJsZV90aWxlcyA9IFtdO1xuICAgICAgICBmb3IgKGxldCB0IGluIHRoaXMudGlsZXMpIHtcbiAgICAgICAgICAgIGxldCB0aWxlID0gdGhpcy50aWxlc1t0XTtcbiAgICAgICAgICAgIGlmICh0aWxlLnZpc2libGUgJiYgdGlsZS5sb2FkZWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnJlbmRlcmFibGVfdGlsZXMucHVzaCh0aWxlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5yZW5kZXJhYmxlX3RpbGVzO1xuICAgIH1cblxuICAgIGdldEFjdGl2ZVN0eWxlcyAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmFjdGl2ZV9zdHlsZXM7XG4gICAgfVxuXG4gICAgdXBkYXRlQWN0aXZlU3R5bGVzICgpIHtcbiAgICAgICAgbGV0IHRpbGVzID0gdGhpcy5yZW5kZXJhYmxlX3RpbGVzO1xuICAgICAgICBsZXQgYWN0aXZlID0ge307XG4gICAgICAgIGZvciAobGV0IHQ9MDsgdCA8IHRpbGVzLmxlbmd0aDsgdCsrKSB7XG4gICAgICAgICAgICBsZXQgdGlsZSA9IHRpbGVzW3RdO1xuICAgICAgICAgICAgT2JqZWN0LmtleXModGlsZS5tZXNoZXMpLmZvckVhY2gocyA9PiBhY3RpdmVbc10gPSB0cnVlKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmFjdGl2ZV9zdHlsZXMgPSBPYmplY3Qua2V5cyhhY3RpdmUpO1xuICAgICAgICByZXR1cm4gdGhpcy5hY3RpdmVfc3R5bGVzO1xuICAgIH1cblxuICAgIGlzTG9hZGluZ1Zpc2libGVUaWxlcygpIHtcbiAgICAgICAgcmV0dXJuIE9iamVjdC5rZXlzKHRoaXMudGlsZXMpLnNvbWUoayA9PiB0aGlzLnRpbGVzW2tdLnZpc2libGUgJiYgIXRoaXMudGlsZXNba10uYnVpbHQpO1xuICAgIH1cblxuICAgIC8vIFF1ZXVlIGEgdGlsZSBmb3IgbG9hZFxuICAgIHF1ZXVlQ29vcmRpbmF0ZShjb29yZHMpIHtcbiAgICAgICAgdGhpcy5xdWV1ZWRfY29vcmRzW3RoaXMucXVldWVkX2Nvb3Jkcy5sZW5ndGhdID0gY29vcmRzO1xuICAgIH1cblxuICAgIC8vIExvYWQgYWxsIHF1ZXVlZCB0aWxlc1xuICAgIGxvYWRRdWV1ZWRDb29yZGluYXRlcygpIHtcbiAgICAgICAgaWYgKHRoaXMucXVldWVkX2Nvb3Jkcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFNvcnQgcXVldWVkIHRpbGVzIGZyb20gY2VudGVyIHRpbGVcbiAgICAgICAgdGhpcy5xdWV1ZWRfY29vcmRzLnNvcnQoKGEsIGIpID0+IHtcbiAgICAgICAgICAgIGxldCBhZCA9IE1hdGguYWJzKHRoaXMudmlldy5jZW50ZXIudGlsZS54IC0gYS54KSArIE1hdGguYWJzKHRoaXMudmlldy5jZW50ZXIudGlsZS55IC0gYS55KTtcbiAgICAgICAgICAgIGxldCBiZCA9IE1hdGguYWJzKHRoaXMudmlldy5jZW50ZXIudGlsZS54IC0gYi54KSArIE1hdGguYWJzKHRoaXMudmlldy5jZW50ZXIudGlsZS55IC0gYi55KTtcbiAgICAgICAgICAgIHJldHVybiAoYmQgPiBhZCA/IC0xIDogKGJkID09PSBhZCA/IDAgOiAxKSk7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLnF1ZXVlZF9jb29yZHMuZm9yRWFjaChjb29yZHMgPT4gdGhpcy5sb2FkQ29vcmRpbmF0ZShjb29yZHMpKTtcbiAgICAgICAgdGhpcy5xdWV1ZWRfY29vcmRzID0gW107XG4gICAgfVxuXG4gICAgLy8gTG9hZCBhbGwgdGlsZXMgdG8gY292ZXIgYSBnaXZlbiBsb2dpY2FsIHRpbGUgY29vcmRpbmF0ZVxuICAgIGxvYWRDb29yZGluYXRlKGNvb3Jkcykge1xuICAgICAgICAvLyBTa2lwIGlmIG5vdCBhdCBjdXJyZW50IHNjZW5lIHpvb21cbiAgICAgICAgaWYgKGNvb3Jkcy56ICE9PSB0aGlzLnZpZXcuY2VudGVyLnRpbGUueikge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gRGV0ZXJtaW5lIG5lY2Vzc2FyeSB0aWxlcyBmb3IgZWFjaCBzb3VyY2VcbiAgICAgICAgZm9yIChsZXQgcyBpbiB0aGlzLnNjZW5lLnNvdXJjZXMpIHtcbiAgICAgICAgICAgIGxldCBzb3VyY2UgPSB0aGlzLnNjZW5lLnNvdXJjZXNbc107XG4gICAgICAgICAgICAvLyBDaGVjayBpZiBkYXRhIHNvdXJjZSBzaG91bGQgYnVpbGQgdGhpcyB0aWxlXG4gICAgICAgICAgICBpZiAoIXNvdXJjZS5idWlsZHNfZ2VvbWV0cnlfdGlsZXMgfHwgIXNvdXJjZS5pbmNsdWRlc1RpbGUoY29vcmRzLCB0aGlzLnZpZXcudGlsZV96b29tKSkge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBsZXQga2V5ID0gVGlsZS5rZXkoY29vcmRzLCBzb3VyY2UsIHRoaXMudmlldy50aWxlX3pvb20pO1xuICAgICAgICAgICAgaWYgKGtleSAmJiAhdGhpcy5oYXNUaWxlKGtleSkpIHtcbiAgICAgICAgICAgICAgICBsZXQgdGlsZSA9IFRpbGUuY3JlYXRlKHtcbiAgICAgICAgICAgICAgICAgICAgc291cmNlLFxuICAgICAgICAgICAgICAgICAgICBjb29yZHMsXG4gICAgICAgICAgICAgICAgICAgIHdvcmtlcjogdGhpcy5zY2VuZS5nZXRXb3JrZXJGb3JEYXRhU291cmNlKHNvdXJjZSksXG4gICAgICAgICAgICAgICAgICAgIHN0eWxlX3pvb206IHRoaXMudmlldy5zdHlsZVpvb20oY29vcmRzLnopLFxuICAgICAgICAgICAgICAgICAgICB2aWV3OiB0aGlzLnZpZXdcbiAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgIHRoaXMua2VlcFRpbGUodGlsZSk7XG4gICAgICAgICAgICAgICAgdGhpcy5idWlsZFRpbGUodGlsZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBTb3J0IGFuZCBidWlsZCBhIGxpc3Qgb2YgdGlsZXNcbiAgICBidWlsZFRpbGVzKHRpbGVzKSB7XG4gICAgICAgIFRpbGUuc29ydCh0aWxlcykuZm9yRWFjaCh0aWxlID0+IHRoaXMuYnVpbGRUaWxlKHRpbGUpKTtcbiAgICAgICAgdGhpcy5jaGVja0J1aWxkUXVldWUoKTtcbiAgICB9XG5cbiAgICBidWlsZFRpbGUodGlsZSwgb3B0aW9ucykge1xuICAgICAgICB0aGlzLnRpbGVCdWlsZFN0YXJ0KHRpbGUua2V5KTtcbiAgICAgICAgdGhpcy51cGRhdGVWaXNpYmlsaXR5KHRpbGUpO1xuICAgICAgICB0aWxlLnVwZGF0ZSgpO1xuICAgICAgICB0aWxlLmJ1aWxkKHRoaXMuc2NlbmUuZ2VuZXJhdGlvbiwgb3B0aW9ucyk7XG4gICAgfVxuXG4gICAgLy8gQ2FsbGVkIG9uIG1haW4gdGhyZWFkIHdoZW4gYSB3ZWIgd29ya2VyIGNvbXBsZXRlcyBwcm9jZXNzaW5nIGZvciBhIHNpbmdsZSB0aWxlIChpbml0aWFsIGxvYWQsIG9yIHJlYnVpbGQpXG4gICAgYnVpbGRUaWxlU3R5bGVzQ29tcGxldGVkKHsgdGlsZSwgcHJvZ3Jlc3MgfSkge1xuICAgICAgICAvLyBSZW1vdmVkIHRoaXMgdGlsZSBkdXJpbmcgbG9hZD9cbiAgICAgICAgaWYgKHRoaXMudGlsZXNbdGlsZS5rZXldID09IG51bGwpIHtcbiAgICAgICAgICAgIGxvZygndHJhY2UnLCBgZGlzY2FyZGVkIHRpbGUgJHt0aWxlLmtleX0gaW4gVGlsZU1hbmFnZXIuYnVpbGRUaWxlU3R5bGVzQ29tcGxldGVkIGJlY2F1c2UgcHJldmlvdXNseSByZW1vdmVkYCk7XG4gICAgICAgICAgICBUaWxlLmFib3J0QnVpbGQodGlsZSk7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZVRpbGVTdGF0ZXMoKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBCdWlsdCB3aXRoIGFuIG91dGRhdGVkIHNjZW5lIGNvbmZpZ3VyYXRpb24/XG4gICAgICAgIGVsc2UgaWYgKHRpbGUuZ2VuZXJhdGlvbiAhPT0gdGhpcy5zY2VuZS5nZW5lcmF0aW9uKSB7XG4gICAgICAgICAgICBsb2coJ2RlYnVnJywgYGRpc2NhcmRlZCB0aWxlICR7dGlsZS5rZXl9IGluIFRpbGVNYW5hZ2VyLmJ1aWxkVGlsZVN0eWxlc0NvbXBsZXRlZCBiZWNhdXNlIGJ1aWx0IHdpdGggYCArXG4gICAgICAgICAgICAgICAgYHNjZW5lIGNvbmZpZyBnZW4gJHt0aWxlLmdlbmVyYXRpb259LCBjdXJyZW50ICR7dGhpcy5zY2VuZS5nZW5lcmF0aW9ufWApO1xuICAgICAgICAgICAgVGlsZS5hYm9ydEJ1aWxkKHRpbGUpO1xuICAgICAgICAgICAgdGhpcy51cGRhdGVUaWxlU3RhdGVzKCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAvLyBVcGRhdGUgdGlsZSB3aXRoIHByb3BlcnRpZXMgZnJvbSB3b3JrZXJcbiAgICAgICAgICAgIGlmICh0aGlzLnRpbGVzW3RpbGUua2V5XSkge1xuICAgICAgICAgICAgICAgIHRpbGUgPSB0aGlzLnRpbGVzW3RpbGUua2V5XS5tZXJnZSh0aWxlKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHByb2dyZXNzLmRvbmUpIHtcbiAgICAgICAgICAgICAgICB0aWxlLmJ1aWx0ID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGlsZS5idWlsZE1lc2hlcyh0aGlzLnNjZW5lLnN0eWxlcywgcHJvZ3Jlc3MpO1xuICAgICAgICAgICAgdGhpcy51cGRhdGVUaWxlU3RhdGVzKCk7XG4gICAgICAgICAgICB0aGlzLnNjZW5lLnJlcXVlc3RSZWRyYXcoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChwcm9ncmVzcy5kb25lKSB7XG4gICAgICAgICAgICB0aGlzLnRpbGVCdWlsZFN0b3AodGlsZS5rZXkpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gQ2FsbGVkIG9uIG1haW4gdGhyZWFkIHdoZW4gd2ViIHdvcmtlciBlbmNvdW50ZXJzIGFuIGVycm9yIGJ1aWxkaW5nIGEgdGlsZVxuICAgIGJ1aWxkVGlsZUVycm9yKHRpbGUpIHtcbiAgICAgICAgbG9nKCdlcnJvcicsIGBFcnJvciBidWlsZGluZyB0aWxlICR7dGlsZS5rZXl9OmAsIHRpbGUuZXJyb3IpO1xuICAgICAgICB0aGlzLmZvcmdldFRpbGUodGlsZS5rZXkpO1xuICAgICAgICBUaWxlLmFib3J0QnVpbGQodGlsZSk7XG4gICAgfVxuXG4gICAgLy8gVHJhY2sgdGlsZSBidWlsZCBzdGF0ZVxuICAgIHRpbGVCdWlsZFN0YXJ0KGtleSkge1xuICAgICAgICB0aGlzLmJ1aWxkaW5nX3RpbGVzID0gdGhpcy5idWlsZGluZ190aWxlcyB8fCB7fTtcbiAgICAgICAgdGhpcy5idWlsZGluZ190aWxlc1trZXldID0gdHJ1ZTtcbiAgICAgICAgbG9nKCd0cmFjZScsIGB0aWxlQnVpbGRTdGFydCBmb3IgJHtrZXl9OiAke09iamVjdC5rZXlzKHRoaXMuYnVpbGRpbmdfdGlsZXMpLmxlbmd0aH1gKTtcbiAgICB9XG5cbiAgICB0aWxlQnVpbGRTdG9wKGtleSkge1xuICAgICAgICAvLyBEb25lIGJ1aWxkaW5nP1xuICAgICAgICBpZiAodGhpcy5idWlsZGluZ190aWxlcykge1xuICAgICAgICAgICAgbG9nKCd0cmFjZScsIGB0aWxlQnVpbGRTdG9wIGZvciAke2tleX06ICR7T2JqZWN0LmtleXModGhpcy5idWlsZGluZ190aWxlcykubGVuZ3RofWApO1xuICAgICAgICAgICAgZGVsZXRlIHRoaXMuYnVpbGRpbmdfdGlsZXNba2V5XTtcbiAgICAgICAgICAgIHRoaXMuY2hlY2tCdWlsZFF1ZXVlKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBDaGVjayBzdGF0dXMgb2YgdGlsZSBidWlsZGluZyBxdWV1ZSBhbmQgbm90aWZ5IHNjZW5lIHdoZW4gd2UncmUgZG9uZVxuICAgIGNoZWNrQnVpbGRRdWV1ZSgpIHtcbiAgICAgICAgaWYgKCF0aGlzLmJ1aWxkaW5nX3RpbGVzIHx8IE9iamVjdC5rZXlzKHRoaXMuYnVpbGRpbmdfdGlsZXMpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgdGhpcy5idWlsZGluZ190aWxlcyA9IG51bGw7XG4gICAgICAgICAgICB0aGlzLnNjZW5lLnRpbGVNYW5hZ2VyQnVpbGREb25lKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBTdW0gb2YgYSBkZWJ1ZyBwcm9wZXJ0eSBhY3Jvc3MgdGlsZXNcbiAgICBnZXREZWJ1Z1N1bShwcm9wLCBmaWx0ZXIpIHtcbiAgICAgICAgdmFyIHN1bSA9IDA7XG4gICAgICAgIGZvciAodmFyIHQgaW4gdGhpcy50aWxlcykge1xuICAgICAgICAgICAgaWYgKHRoaXMudGlsZXNbdF0uZGVidWdbcHJvcF0gIT0gbnVsbCAmJiAodHlwZW9mIGZpbHRlciAhPT0gJ2Z1bmN0aW9uJyB8fCBmaWx0ZXIodGhpcy50aWxlc1t0XSkgPT09IHRydWUpKSB7XG4gICAgICAgICAgICAgICAgc3VtICs9IHRoaXMudGlsZXNbdF0uZGVidWdbcHJvcF07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHN1bTtcbiAgICB9XG5cbiAgICAvLyBBdmVyYWdlIG9mIGEgZGVidWcgcHJvcGVydHkgYWNyb3NzIHRpbGVzXG4gICAgZ2V0RGVidWdBdmVyYWdlKHByb3AsIGZpbHRlcikge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXREZWJ1Z1N1bShwcm9wLCBmaWx0ZXIpIC8gT2JqZWN0LmtleXModGhpcy50aWxlcykubGVuZ3RoO1xuICAgIH1cblxufVxuIiwiaW1wb3J0IEdlbyBmcm9tICcuL2dlbyc7XG5pbXBvcnQgVGlsZSBmcm9tICcuL3RpbGUnO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBUaWxlUHlyYW1pZCB7XG5cbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5jb29yZHMgPSB7fTtcbiAgICAgICAgdGhpcy5tYXhfcHJveHlfZGVzY2VuZGFudF9kZXB0aCA9IDM7IC8vICMgb2YgbGV2ZWxzIGRlZXAgdG8gc2VhcmNoIGZvciBkZXNjZW5kYW50IHByb3h5IHRpbGVzXG4gICAgfVxuXG4gICAgc291cmNlVGlsZXMoY29vcmQsIHNvdXJjZSkge1xuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgdGhpcy5jb29yZHNbY29vcmQua2V5XSAmJlxuICAgICAgICAgICAgdGhpcy5jb29yZHNbY29vcmQua2V5XS5zb3VyY2VzICYmXG4gICAgICAgICAgICB0aGlzLmNvb3Jkc1tjb29yZC5rZXldLnNvdXJjZXNbc291cmNlLm5hbWVdKTtcbiAgICB9XG5cbiAgICBhZGRUaWxlKHRpbGUpIHtcbiAgICAgICAgLy8gQWRkIHRhcmdldCB0aWxlXG4gICAgICAgIGxldCBrZXkgPSB0aWxlLmNvb3Jkcy5rZXk7XG4gICAgICAgIGxldCBjb29yZCA9IHRoaXMuY29vcmRzW2tleV07XG4gICAgICAgIGlmICghY29vcmQpIHtcbiAgICAgICAgICAgIGNvb3JkID0gdGhpcy5jb29yZHNba2V5XSA9IHsgZGVzY2VuZGFudHM6IDAgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghY29vcmQuc291cmNlcykge1xuICAgICAgICAgICAgY29vcmQuc291cmNlcyA9IHt9O1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFjb29yZC5zb3VyY2VzW3RpbGUuc291cmNlLm5hbWVdKSB7XG4gICAgICAgICAgICBjb29yZC5zb3VyY2VzW3RpbGUuc291cmNlLm5hbWVdID0ge307XG4gICAgICAgIH1cbiAgICAgICAgY29vcmQuc291cmNlc1t0aWxlLnNvdXJjZS5uYW1lXVt0aWxlLnN0eWxlX3pvb21dID0gdGlsZTtcblxuICAgICAgICAvLyBJbmNyZW1lbnQgcmVmZXJlbmNlIGNvdW50IHVwIHRoZSB0aWxlIHB5cmFtaWRcbiAgICAgICAgZm9yIChsZXQgeiA9IHRpbGUuY29vcmRzLnogLSAxOyB6ID49IDA7IHotLSkge1xuICAgICAgICAgICAgbGV0IHVwID0gVGlsZS5jb29yZGluYXRlQXRab29tKHRpbGUuY29vcmRzLCB6KTtcbiAgICAgICAgICAgIGlmICghdGhpcy5jb29yZHNbdXAua2V5XSkge1xuICAgICAgICAgICAgICAgIHRoaXMuY29vcmRzW3VwLmtleV0gPSB7IGRlc2NlbmRhbnRzOiAwIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmNvb3Jkc1t1cC5rZXldLmRlc2NlbmRhbnRzKys7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZW1vdmVUaWxlKHRpbGUpIHtcbiAgICAgICAgLy8gUmVtb3ZlIHRhcmdldCB0aWxlXG4gICAgICAgIGxldCBzb3VyY2VfdGlsZXMgPSB0aGlzLnNvdXJjZVRpbGVzKHRpbGUuY29vcmRzLCB0aWxlLnNvdXJjZSk7XG4gICAgICAgIGxldCBrZXkgPSB0aWxlLmNvb3Jkcy5rZXk7XG5cbiAgICAgICAgaWYgKHNvdXJjZV90aWxlcykge1xuICAgICAgICAgICAgZGVsZXRlIHNvdXJjZV90aWxlc1t0aWxlLnN0eWxlX3pvb21dO1xuICAgICAgICAgICAgaWYgKE9iamVjdC5rZXlzKHNvdXJjZV90aWxlcykubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgLy8gcmVtb3ZlIHNvdXJjZVxuICAgICAgICAgICAgICAgIGRlbGV0ZSB0aGlzLmNvb3Jkc1trZXldLnNvdXJjZXNbdGlsZS5zb3VyY2UubmFtZV07XG4gICAgICAgICAgICAgICAgaWYgKE9iamVjdC5rZXlzKHRoaXMuY29vcmRzW2tleV0uc291cmNlcykubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGRlbGV0ZSB0aGlzLmNvb3Jkc1trZXldLnNvdXJjZXM7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuY29vcmRzW2tleV0uZGVzY2VuZGFudHMgPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlbW92ZSB3aG9sZSBjb29yZFxuICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHRoaXMuY29vcmRzW2tleV07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBEZWNyZW1lbnQgcmVmZXJlbmNlIGNvdW50IHVwIHRoZSB0aWxlIHB5cmFtaWRcbiAgICAgICAgZm9yIChsZXQgeiA9IHRpbGUuY29vcmRzLnogLSAxOyB6ID49IDA7IHotLSkge1xuICAgICAgICAgICAgbGV0IGRvd24gPSBUaWxlLmNvb3JkaW5hdGVBdFpvb20odGlsZS5jb29yZHMsIHopO1xuICAgICAgICAgICAgaWYgKHRoaXMuY29vcmRzW2Rvd24ua2V5XSAmJiB0aGlzLmNvb3Jkc1tkb3duLmtleV0uZGVzY2VuZGFudHMgPiAwKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jb29yZHNbZG93bi5rZXldLmRlc2NlbmRhbnRzLS07XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuY29vcmRzW2Rvd24ua2V5XS5kZXNjZW5kYW50cyA9PT0gMCAmJiAhdGhpcy5jb29yZHNbZG93bi5rZXldLnNvdXJjZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHRoaXMuY29vcmRzW2Rvd24ua2V5XTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBnZXRBbmNlc3RvciAoeyBjb29yZHMsIHN0eWxlX3pvb20sIHNvdXJjZSB9KSB7XG4gICAgICAgIC8vIEZpcnN0IGNoZWNrIG92ZXJ6b29tZWQgdGlsZXMgYXQgc2FtZSBjb29yZGluYXRlIHpvb21cbiAgICAgICAgaWYgKHN0eWxlX3pvb20gPiBzb3VyY2UubWF4X3pvb20pIHtcbiAgICAgICAgICAgIGxldCBzb3VyY2VfdGlsZXMgPSB0aGlzLnNvdXJjZVRpbGVzKGNvb3Jkcywgc291cmNlKTtcbiAgICAgICAgICAgIGlmIChzb3VyY2VfdGlsZXMpIHtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCB6ID0gc3R5bGVfem9vbSAtIDE7IHogPj0gc291cmNlLm1heF96b29tOyB6LS0pIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHNvdXJjZV90aWxlc1t6XSAmJiBzb3VyY2VfdGlsZXNbel0ubG9hZGVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc291cmNlX3RpbGVzW3pdO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgc3R5bGVfem9vbSA9IHNvdXJjZS5tYXhfem9vbTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENoZWNrIHRpbGVzIGF0IG5leHQgem9vbSB1cFxuICAgICAgICBzdHlsZV96b29tLS07XG4gICAgICAgIGxldCBwYXJlbnQgPSBUaWxlLmNvb3JkaW5hdGVBdFpvb20oY29vcmRzLCBjb29yZHMueiAtIDEpO1xuICAgICAgICBsZXQgcGFyZW50X3RpbGVzID0gdGhpcy5zb3VyY2VUaWxlcyhwYXJlbnQsIHNvdXJjZSk7XG4gICAgICAgIGlmIChwYXJlbnRfdGlsZXMgJiYgcGFyZW50X3RpbGVzW3N0eWxlX3pvb21dICYmIHBhcmVudF90aWxlc1tzdHlsZV96b29tXS5sb2FkZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBwYXJlbnRfdGlsZXNbc3R5bGVfem9vbV07XG4gICAgICAgIH1cbiAgICAgICAgLy8gZGlkbid0IGZpbmQgYW5jZXN0b3IsIHRyeSBuZXh0IGxldmVsXG4gICAgICAgIC8vIFRPRE86IG1heCBkZXB0aCBsZXZlbHMgdG8gY2hlY2tcbiAgICAgICAgaWYgKHBhcmVudC56ID4gMCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0QW5jZXN0b3IoeyBjb29yZHM6IHBhcmVudCwgc3R5bGVfem9vbSwgc291cmNlIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZ2V0RGVzY2VuZGFudHMgKHsgY29vcmRzLCBzdHlsZV96b29tLCBzb3VyY2UgfSwgbGV2ZWwgPSAxKSB7XG4gICAgICAgIGxldCBkZXNjZW5kYW50cyA9IFtdO1xuXG4gICAgICAgIC8vIEZpcnN0IGNoZWNrIG92ZXJ6b29tZWQgdGlsZXMgYXQgc2FtZSBjb29yZGluYXRlIHpvb21cbiAgICAgICAgaWYgKHN0eWxlX3pvb20gPj0gc291cmNlLm1heF96b29tKSB7XG4gICAgICAgICAgICBsZXQgc291cmNlX3RpbGVzID0gdGhpcy5zb3VyY2VUaWxlcyhjb29yZHMsIHNvdXJjZSk7XG4gICAgICAgICAgICBpZiAoc291cmNlX3RpbGVzKSB7XG4gICAgICAgICAgICAgICAgbGV0IHNlYXJjaF9tYXhfem9vbSA9IE1hdGgubWF4KEdlby5kZWZhdWx0X3ZpZXdfbWF4X3pvb20sIHN0eWxlX3pvb20gKyB0aGlzLm1heF9wcm94eV9kZXNjZW5kYW50X2RlcHRoKTtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCB6ID0gc3R5bGVfem9vbSArIDE7IHogPD0gc2VhcmNoX21heF96b29tOyB6KyspIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHNvdXJjZV90aWxlc1t6XSAmJiBzb3VyY2VfdGlsZXNbel0ubG9hZGVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBkZXNjZW5kYW50cy5wdXNoKHNvdXJjZV90aWxlc1t6XSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGVzY2VuZGFudHM7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gZGVzY2VuZGFudHM7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDaGVjayB0aWxlcyBhdCBuZXh0IHpvb20gZG93blxuICAgICAgICBpZiAodGhpcy5jb29yZHNbY29vcmRzLmtleV0gJiYgdGhpcy5jb29yZHNbY29vcmRzLmtleV0uZGVzY2VuZGFudHMgPiAwKSB7XG4gICAgICAgICAgICBzdHlsZV96b29tKys7XG4gICAgICAgICAgICBjb25zdCBjaGlsZHJlbiA9IFRpbGUuY2hpbGRyZW5Gb3JDb29yZGluYXRlKGNvb3Jkcyk7XG4gICAgICAgICAgICBmb3IgKGxldCBjPTA7IGMgPCBjaGlsZHJlbi5sZW5ndGg7IGMrKykge1xuICAgICAgICAgICAgICAgIGNvbnN0IGNoaWxkID0gY2hpbGRyZW5bY107XG4gICAgICAgICAgICAgICAgbGV0IGNoaWxkX3RpbGVzID0gdGhpcy5zb3VyY2VUaWxlcyhjaGlsZCwgc291cmNlKTtcbiAgICAgICAgICAgICAgICBpZiAoY2hpbGRfdGlsZXMgJiYgY2hpbGRfdGlsZXNbc3R5bGVfem9vbV0gJiYgY2hpbGRfdGlsZXNbc3R5bGVfem9vbV0ubG9hZGVkKSB7XG4gICAgICAgICAgICAgICAgICAgIGRlc2NlbmRhbnRzLnB1c2goY2hpbGRfdGlsZXNbc3R5bGVfem9vbV0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBkaWRuJ3QgZmluZCBjaGlsZCwgdHJ5IG5leHQgbGV2ZWxcbiAgICAgICAgICAgICAgICBlbHNlIGlmIChsZXZlbCA8PSB0aGlzLm1heF9wcm94eV9kZXNjZW5kYW50X2RlcHRoICYmIGNoaWxkLnogPD0gc291cmNlLm1heF96b29tKSB7XG4gICAgICAgICAgICAgICAgICAgIGRlc2NlbmRhbnRzLnB1c2goLi4udGhpcy5nZXREZXNjZW5kYW50cyh7IGNvb3JkczogY2hpbGQsIHNvdXJjZSwgc3R5bGVfem9vbSB9LCBsZXZlbCArIDEpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZGVzY2VuZGFudHM7XG4gICAgfVxuXG59XG4iLCJleHBvcnQgZGVmYXVsdCB7XG4gICAgLy8gZHJhd3MgYSBibHVlIHJlY3RhbmdsZSBib3JkZXIgYXJvdW5kIHRoZSBjb2xsaXNpb24gYm94IG9mIGEgbGFiZWxcbiAgICBkcmF3X2xhYmVsX2NvbGxpc2lvbl9ib3hlczogZmFsc2UsXG4gICAgLy8gZHJhd3MgYSBncmVlbiByZWN0YW5nbGUgYm9yZGVyIHdpdGhpbiB0aGUgdGV4dHVyZSBib3ggb2YgYSBsYWJlbFxuICAgIGRyYXdfbGFiZWxfdGV4dHVyZV9ib3hlczogZmFsc2UsXG4gICAgLy8gc3VwcHJlc2VzIGZhZGUtaW4gb2YgbGFiZWxzXG4gICAgc3VwcHJlc3NfbGFiZWxfZmFkZV9pbjogZmFsc2UsXG4gICAgLy8gc3VwcHJlc3MgYW5pbWF0b24gb2YgbGFiZWwgc25hcCB0byBwaXhlbCBncmlkXG4gICAgc3VwcHJlc3NfbGFiZWxfc25hcF9hbmltYXRpb246IGZhbHNlXG59O1xuIiwiXG5cbmV4cG9ydCBjbGFzcyBNZXRob2ROb3RJbXBsZW1lbnRlZCBleHRlbmRzIEVycm9yIHtcbiAgICBjb25zdHJ1Y3RvcihtZXRob2ROYW1lKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMubmFtZSAgICA9ICdNZXRob2ROb3RJbXBsZW1lbnRlZCc7XG4gICAgICAgIHRoaXMubWVzc2FnZSA9ICdNZXRob2QgJyArIG1ldGhvZE5hbWUgKyAnIG11c3QgYmUgaW1wbGVtZW50ZWQgaW4gc3ViY2xhc3MnO1xuICAgIH1cbn1cbiIsIi8vIFBhcnRpYWwgaW1wb3J0IG9mIGdsLW1hdHJpeCB2aWEgbW9kdWxhcml6ZWQgc3RhY2stZ2wgZm9ya3Ncbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS90b2ppL2dsLW1hdHJpeFxuLy8gaHR0cHM6Ly9naXRodWIuY29tL3N0YWNrZ2xcblxuLy8gdmVjM1xuXG4vLyBTdWJzdGl0dXRlIDY0LWJpdCB2ZXJzaW9uXG4vLyBXZSBuZWVkIHRoZSBleHRyYSBwcmVjaXNpb24gd2hlbiBtdWx0aXBseWluZyBtYXRyaWNlcyB3L21lcmNhdG9yIHByb2plY3RlZCB2YWx1ZXNcbmNvbnN0IHZlYzMgPSB7XG4gICAgZnJvbVZhbHVlcyAoeCwgeSwgeikge1xuICAgICAgICB2YXIgb3V0ID0gbmV3IEZsb2F0NjRBcnJheSgzKTtcbiAgICAgICAgb3V0WzBdID0geDtcbiAgICAgICAgb3V0WzFdID0geTtcbiAgICAgICAgb3V0WzJdID0gejtcbiAgICAgICAgcmV0dXJuIG91dDtcbiAgICB9XG59O1xuXG5cbi8vIG1hdDNcblxuaW1wb3J0IHtkZWZhdWx0IGFzIG1hdDNfbm9ybWFsRnJvbU1hdDR9IGZyb20gJ2dsLW1hdDMvbm9ybWFsLWZyb20tbWF0NCc7XG5pbXBvcnQge2RlZmF1bHQgYXMgbWF0M19pbnZlcnR9IGZyb20gJ2dsLW1hdDMvaW52ZXJ0JztcblxuY29uc3QgbWF0MyA9IHtcbiAgICBub3JtYWxGcm9tTWF0NDogbWF0M19ub3JtYWxGcm9tTWF0NCxcbiAgICBpbnZlcnQ6IG1hdDNfaW52ZXJ0XG59O1xuXG5cbi8vIG1hdDRcblxuaW1wb3J0IHtkZWZhdWx0IGFzIG1hdDRfbXVsdGlwbHl9IGZyb20gJ2dsLW1hdDQvbXVsdGlwbHknO1xuaW1wb3J0IHtkZWZhdWx0IGFzIG1hdDRfdHJhbnNsYXRlfSBmcm9tICdnbC1tYXQ0L3RyYW5zbGF0ZSc7XG5pbXBvcnQge2RlZmF1bHQgYXMgbWF0NF9zY2FsZX0gZnJvbSAnZ2wtbWF0NC9zY2FsZSc7XG5pbXBvcnQge2RlZmF1bHQgYXMgbWF0NF9wZXJzcGVjdGl2ZX0gZnJvbSAnZ2wtbWF0NC9wZXJzcGVjdGl2ZSc7XG5pbXBvcnQge2RlZmF1bHQgYXMgbWF0NF9sb29rQXR9IGZyb20gJ2dsLW1hdDQvbG9va0F0JztcbmltcG9ydCB7ZGVmYXVsdCBhcyBtYXQ0X2lkZW50aXR5fSBmcm9tICdnbC1tYXQ0L2lkZW50aXR5JztcbmltcG9ydCB7ZGVmYXVsdCBhcyBtYXQ0X2NvcHl9IGZyb20gJ2dsLW1hdDQvY29weSc7XG5cbmNvbnN0IG1hdDQgPSB7XG4gICAgbXVsdGlwbHk6IG1hdDRfbXVsdGlwbHksXG4gICAgdHJhbnNsYXRlOiBtYXQ0X3RyYW5zbGF0ZSxcbiAgICBzY2FsZTogbWF0NF9zY2FsZSxcbiAgICBwZXJzcGVjdGl2ZTogbWF0NF9wZXJzcGVjdGl2ZSxcbiAgICBsb29rQXQ6IG1hdDRfbG9va0F0LFxuICAgIGlkZW50aXR5OiBtYXQ0X2lkZW50aXR5LFxuICAgIGNvcHk6IG1hdDRfY29weVxufTtcblxuXG5leHBvcnQge3ZlYzMsIG1hdDMsIG1hdDR9O1xuIiwiaW1wb3J0IHZlcnNpb24gZnJvbSAnLi92ZXJzaW9uJztcbmltcG9ydCBUaHJlYWQgZnJvbSAnLi90aHJlYWQnO1xuaW1wb3J0IFdvcmtlckJyb2tlciBmcm9tICcuL3dvcmtlcl9icm9rZXInO1xuXG5jb25zdCBMRVZFTFMgPSB7XG4gICAgc2lsZW50OiAtMSxcbiAgICBlcnJvcjogMCxcbiAgICB3YXJuOiAxLFxuICAgIGluZm86IDIsXG4gICAgZGVidWc6IDMsXG4gICAgdHJhY2U6IDRcbn07XG5cbmNvbnN0IG1ldGhvZHMgPSB7fTtcblxuZnVuY3Rpb24gbWV0aG9kRm9yTGV2ZWwgKGxldmVsKSB7XG4gICAgaWYgKFRocmVhZC5pc19tYWluKSB7XG4gICAgICAgIG1ldGhvZHNbbGV2ZWxdID0gbWV0aG9kc1tsZXZlbF0gfHwgKGNvbnNvbGVbbGV2ZWxdID8gY29uc29sZVtsZXZlbF0gOiBjb25zb2xlLmxvZykuYmluZChjb25zb2xlKTtcbiAgICAgICAgcmV0dXJuIG1ldGhvZHNbbGV2ZWxdO1xuICAgIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gbG9nIChtc2dfbGV2ZWwsIC4uLm1zZykge1xuICAgIGlmIChMRVZFTFNbbXNnX2xldmVsXSA8PSBMRVZFTFNbbG9nLmxldmVsXSkge1xuICAgICAgICBpZiAoVGhyZWFkLmlzX3dvcmtlcikge1xuICAgICAgICAgICAgLy8gUHJveHkgdG8gbWFpbiB0aHJlYWRcbiAgICAgICAgICAgIFdvcmtlckJyb2tlci5wb3N0TWVzc2FnZSgnX2xvZ1Byb3h5JywgbXNnX2xldmVsLCAuLi5tc2cpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgbGV0IGxvZ2dlciA9IG1ldGhvZEZvckxldmVsKG1zZ19sZXZlbCk7XG5cbiAgICAgICAgICAgIC8vIFdyaXRlIHRvIGNvbnNvbGUgKG9uIG1haW4gdGhyZWFkKVxuICAgICAgICAgICAgaWYgKG1zZy5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgICAgICAgbG9nZ2VyKGBUYW5ncmFtICR7dmVyc2lvbn0gWyR7bXNnX2xldmVsfV06ICR7bXNnWzBdfWAsIC4uLm1zZy5zbGljZSgxKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBsb2dnZXIoYFRhbmdyYW0gJHt2ZXJzaW9ufSBbJHttc2dfbGV2ZWx9XTogJHttc2dbMF19YCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59XG5cbmxvZy5sZXZlbCA9ICdpbmZvJztcbmxvZy53b3JrZXJzID0gbnVsbDtcblxubG9nLnNldExldmVsID0gZnVuY3Rpb24gKGxldmVsKSB7XG4gICAgbG9nLmxldmVsID0gbGV2ZWw7XG5cbiAgICBpZiAoVGhyZWFkLmlzX21haW4gJiYgQXJyYXkuaXNBcnJheShsb2cud29ya2VycykpIHtcbiAgICAgICAgV29ya2VyQnJva2VyLnBvc3RNZXNzYWdlKGxvZy53b3JrZXJzLCAnX2xvZ1NldExldmVsUHJveHknLCBsZXZlbCk7XG4gICAgfVxufTtcblxuaWYgKFRocmVhZC5pc19tYWluKSB7XG4gICAgbG9nLnNldFdvcmtlcnMgPSBmdW5jdGlvbiAod29ya2Vycykge1xuICAgICAgICBsb2cud29ya2VycyA9IHdvcmtlcnM7XG4gICAgfTtcblxuXG59XG5cbldvcmtlckJyb2tlci5hZGRUYXJnZXQoJ19sb2dQcm94eScsIGxvZyk7ICAgICAgICAgICAgICAgICAgIC8vIHByb3h5IGxvZyBtZXNzYWdlcyBmcm9tIHdvcmtlciB0byBtYWluIHRocmVhZFxuV29ya2VyQnJva2VyLmFkZFRhcmdldCgnX2xvZ1NldExldmVsUHJveHknLCBsb2cuc2V0TGV2ZWwpOyAgLy8gcHJveHkgbG9nIGxldmVsIHNldHRpbmcgZnJvbSBtYWluIHRvIHdvcmtlciB0aHJlYWRcbiIsIi8qIGdsb2JhbCBNZWRpYVJlY29yZGVyICovXG5pbXBvcnQgbG9nIGZyb20gJy4vbG9nJztcbmltcG9ydCB7Y3JlYXRlT2JqZWN0VVJMfSBmcm9tICcuL3VybHMnO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBNZWRpYUNhcHR1cmUge1xuXG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMucXVldWVfc2NyZWVuc2hvdCA9IG51bGw7XG4gICAgICAgIHRoaXMudmlkZW9fY2FwdHVyZSA9IG51bGw7XG4gICAgfVxuXG4gICAgc2V0Q2FudmFzIChjYW52YXMpIHtcbiAgICAgICAgdGhpcy5jYW52YXMgPSBjYW52YXM7XG4gICAgfVxuXG4gICAgLy8gVGFrZSBhIHNjcmVlbnNob3QsIHJldHVybnMgYSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2l0aCB0aGUgc2NyZWVuc2hvdCBkYXRhIHdoZW4gYXZhaWxhYmxlXG4gICAgc2NyZWVuc2hvdCAoKSB7XG4gICAgICAgIGlmICh0aGlzLnF1ZXVlX3NjcmVlbnNob3QgIT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMucXVldWVfc2NyZWVuc2hvdC5wcm9taXNlOyAvLyBvbmx5IGNhcHR1cmUgb25lIHNjcmVlbnNob3QgYXQgYSB0aW1lXG4gICAgICAgIH1cblxuICAgICAgICAvLyBXaWxsIHJlc29sdmUgb25jZSByZW5kZXJpbmcgaXMgY29tcGxldGUgYW5kIHJlbmRlciBidWZmZXIgaXMgY2FwdHVyZWRcbiAgICAgICAgdGhpcy5xdWV1ZV9zY3JlZW5zaG90ID0ge307XG4gICAgICAgIHRoaXMucXVldWVfc2NyZWVuc2hvdC5wcm9taXNlID0gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5xdWV1ZV9zY3JlZW5zaG90LnJlc29sdmUgPSByZXNvbHZlO1xuICAgICAgICAgICAgdGhpcy5xdWV1ZV9zY3JlZW5zaG90LnJlamVjdCA9IHJlamVjdDtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB0aGlzLnF1ZXVlX3NjcmVlbnNob3QucHJvbWlzZTtcbiAgICB9XG5cbiAgICAvLyBDYWxsZWQgYWZ0ZXIgcmVuZGVyaW5nLCBjYXB0dXJlcyByZW5kZXIgYnVmZmVyIGFuZCByZXNvbHZlcyBwcm9taXNlIHdpdGggdGhlIGltYWdlIGRhdGFcbiAgICBjb21wbGV0ZVNjcmVlbnNob3QgKCkge1xuICAgICAgICBpZiAodGhpcy5xdWV1ZV9zY3JlZW5zaG90ICE9IG51bGwpIHtcbiAgICAgICAgICAgIC8vIEdldCBkYXRhIFVSTCwgY29udmVydCB0byBibG9iXG4gICAgICAgICAgICAvLyBTdHJpcCBob3N0L21pbWV0eXBlL2V0Yy4sIGNvbnZlcnQgYmFzZTY0IHRvIGJpbmFyeSB3aXRob3V0IFVURi04IG1hbmdsaW5nXG4gICAgICAgICAgICAvLyBBZGFwdGVkIGZyb206IGh0dHBzOi8vZ2lzdC5naXRodWIuY29tL3VuY29uZWQvNDM3MDgyMlxuICAgICAgICAgICAgY29uc3QgdXJsID0gdGhpcy5jYW52YXMudG9EYXRhVVJMKCdpbWFnZS9wbmcnKTtcbiAgICAgICAgICAgIGNvbnN0IGRhdGEgPSBhdG9iKHVybC5zbGljZSgyMikpO1xuICAgICAgICAgICAgY29uc3QgYnVmZmVyID0gbmV3IFVpbnQ4QXJyYXkoZGF0YS5sZW5ndGgpO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBkYXRhLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICAgICAgYnVmZmVyW2ldID0gZGF0YS5jaGFyQ29kZUF0KGkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgYmxvYiA9IG5ldyBCbG9iKFtidWZmZXJdLCB7IHR5cGU6ICdpbWFnZS9wbmcnIH0pO1xuXG4gICAgICAgICAgICAvLyBSZXNvbHZlIHdpdGggc2NyZWVuc2hvdCBkYXRhXG4gICAgICAgICAgICB0aGlzLnF1ZXVlX3NjcmVlbnNob3QucmVzb2x2ZSh7IHVybCwgYmxvYiwgdHlwZTogJ3BuZycgfSk7XG4gICAgICAgICAgICB0aGlzLnF1ZXVlX3NjcmVlbnNob3QgPSBudWxsO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gU3RhcnRzIGNhcHR1cmluZyBhIHZpZGVvIHN0cmVhbSBmcm9tIHRoZSBjYW52YXNcbiAgICBzdGFydFZpZGVvQ2FwdHVyZSAoKSB7XG4gICAgICAgIGlmICh0eXBlb2Ygd2luZG93Lk1lZGlhUmVjb3JkZXIgIT09ICdmdW5jdGlvbicgfHwgIXRoaXMuY2FudmFzIHx8IHR5cGVvZiB0aGlzLmNhbnZhcy5jYXB0dXJlU3RyZWFtICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICBsb2coJ3dhcm4nLCAnVmlkZW8gY2FwdHVyZSAoQ2FudmFzLmNhcHR1cmVTdHJlYW0gYW5kL29yIE1lZGlhUmVjb3JkZXIgQVBJcykgbm90IHN1cHBvcnRlZCBieSBicm93c2VyJyk7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodGhpcy52aWRlb19jYXB0dXJlKSB7XG4gICAgICAgICAgICBsb2coJ3dhcm4nLCAnVmlkZW8gY2FwdHVyZSBhbHJlYWR5IGluIHByb2dyZXNzLCBjYWxsIFNjZW5lLnN0b3BWaWRlb0NhcHR1cmUoKSBmaXJzdCcpO1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gU3RhcnQgYSBuZXcgY2FwdHVyZVxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgbGV0IGNhcCA9IHRoaXMudmlkZW9fY2FwdHVyZSA9IHt9O1xuICAgICAgICAgICAgY2FwLmNodW5rcyA9IFtdO1xuICAgICAgICAgICAgY2FwLnN0cmVhbSA9IHRoaXMuY2FudmFzLmNhcHR1cmVTdHJlYW0oKTtcbiAgICAgICAgICAgIGNhcC5vcHRpb25zID0geyBtaW1lVHlwZTogJ3ZpZGVvL3dlYm0nIH07IC8vIFRPRE86IHN1cHBvcnQgb3RoZXIgZm9ybWF0IG9wdGlvbnNcbiAgICAgICAgICAgIGNhcC5tZWRpYV9yZWNvcmRlciA9IG5ldyBNZWRpYVJlY29yZGVyKGNhcC5zdHJlYW0sIGNhcC5vcHRpb25zKTtcbiAgICAgICAgICAgIGNhcC5tZWRpYV9yZWNvcmRlci5vbmRhdGFhdmFpbGFibGUgPSAoZXZlbnQpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoZXZlbnQuZGF0YS5zaXplID4gMCkge1xuICAgICAgICAgICAgICAgICAgIGNhcC5jaHVua3MucHVzaChldmVudC5kYXRhKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyBTdG9wcGVkIHJlY29yZGluZz8gQ3JlYXRlIHRoZSBmaW5hbCBjYXB0dXJlIGZpbGUgYmxvYlxuICAgICAgICAgICAgICAgIGlmIChjYXAucmVzb2x2ZSkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgYmxvYiA9IG5ldyBCbG9iKGNhcC5jaHVua3MsIHsgdHlwZTogY2FwLm9wdGlvbnMubWltZVR5cGUgfSk7XG4gICAgICAgICAgICAgICAgICAgIGxldCB1cmwgPSBjcmVhdGVPYmplY3RVUkwoYmxvYik7XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gRXhwbGljaXRseSByZW1vdmUgYWxsIHN0cmVhbSB0cmFja3MsIGFuZCBzZXQgb2JqZWN0cyB0byBudWxsXG4gICAgICAgICAgICAgICAgICAgIGlmIChjYXAuc3RyZWFtKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgdHJhY2tzID0gY2FwLnN0cmVhbS5nZXRUcmFja3MoKSB8fCBbXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNrcy5mb3JFYWNoKHRyYWNrID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFjay5zdG9wKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FwLnN0cmVhbS5yZW1vdmVUcmFjayh0cmFjayk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjYXAuc3RyZWFtID0gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgY2FwLm1lZGlhX3JlY29yZGVyID0gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy52aWRlb19jYXB0dXJlID0gbnVsbDtcblxuICAgICAgICAgICAgICAgICAgICBjYXAucmVzb2x2ZSh7IHVybCwgYmxvYiwgdHlwZTogJ3dlYm0nIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBjYXAubWVkaWFfcmVjb3JkZXIuc3RhcnQoKTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgdGhpcy52aWRlb19jYXB0dXJlID0gbnVsbDtcbiAgICAgICAgICAgIGxvZygnZXJyb3InLCAnU2NlbmUgdmlkZW8gY2FwdHVyZSBmYWlsZWQnLCBlKTtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICAvLyBTdG9wcyBjYXB0dXJpbmcgYSB2aWRlbyBzdHJlYW0gZnJvbSB0aGUgY2FudmFzLCByZXR1cm5zIGEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdpdGggdGhlIHZpZGVvIHdoZW4gYXZhaWxhYmxlXG4gICAgc3RvcFZpZGVvQ2FwdHVyZSAoKSB7XG4gICAgICAgIGlmICghdGhpcy52aWRlb19jYXB0dXJlKSB7XG4gICAgICAgICAgICBsb2coJ3dhcm4nLCAnTm8gc2NlbmUgdmlkZW8gY2FwdHVyZSBpbiBwcm9ncmVzcywgY2FsbCBTY2VuZS5zdGFydFZpZGVvQ2FwdHVyZSgpIGZpcnN0Jyk7XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHt9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFByb21pc2UgdGhhdCB3aWxsIHJlc29sdmUgd2hlbiBmaW5hbCBzdHJlYW0gaXMgYXZhaWxhYmxlXG4gICAgICAgIHRoaXMudmlkZW9fY2FwdHVyZS5wcm9taXNlID0gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgdGhpcy52aWRlb19jYXB0dXJlLnJlc29sdmUgPSByZXNvbHZlO1xuICAgICAgICAgICAgdGhpcy52aWRlb19jYXB0dXJlLnJlamVjdCA9IHJlamVjdDtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gU3RvcCByZWNvcmRpbmdcbiAgICAgICAgdGhpcy52aWRlb19jYXB0dXJlLm1lZGlhX3JlY29yZGVyLnN0b3AoKTtcblxuICAgICAgICByZXR1cm4gdGhpcy52aWRlb19jYXB0dXJlLnByb21pc2U7XG4gICAgfVxuXG59XG4iLCIvLyBEZWVwL3JlY3Vyc2l2ZSBtZXJnZSBvZiBvbmUgb3IgbW9yZSBzb3VyY2Ugb2JqZWN0cyBpbnRvIGEgZGVzdGluYXRpb24gb2JqZWN0XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBtZXJnZU9iamVjdHMgKGRlc3QsIC4uLnNvdXJjZXMpIHtcbiAgICBmb3IgKGxldCBzPTA7IHMgPCBzb3VyY2VzLmxlbmd0aDsgcysrKSB7XG4gICAgICAgIGxldCBzb3VyY2UgPSBzb3VyY2VzW3NdO1xuICAgICAgICBpZiAoIXNvdXJjZSkge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChsZXQga2V5IGluIHNvdXJjZSkge1xuICAgICAgICAgICAgbGV0IHZhbHVlID0gc291cmNlW2tleV07XG4gICAgICAgICAgICAvLyBSZWN1cnNpdmVseSBtZXJnZSB0aGUgc291cmNlIGludG8gdGhlIGRlc3RpbmF0aW9uIGlmIGl0IGlzIGEgYSBub24tbnVsbCBrZXkvdmFsdWUgb2JqZWN0XG4gICAgICAgICAgICAvLyAoZS5nLiBkb24ndCBtZXJnZSBhcnJheXMsIHRob3NlIGFyZSB0cmVhdGVkIGFzIHNjYWxhciB2YWx1ZXM7IG51bGwgdmFsdWVzIHdpbGwgb3ZlcndyaXRlL2VyYXNlXG4gICAgICAgICAgICAvLyB0aGUgcHJldmlvdXMgZGVzdGluYXRpb24gdmFsdWUpXG4gICAgICAgICAgICBpZiAodmFsdWUgIT09IG51bGwgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiAhQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICBpZiAoZGVzdFtrZXldICE9PSBudWxsICYmIHR5cGVvZiBkZXN0W2tleV0gPT09ICdvYmplY3QnICYmICFBcnJheS5pc0FycmF5KGRlc3Rba2V5XSkpIHtcbiAgICAgICAgICAgICAgICAgICAgZGVzdFtrZXldID0gbWVyZ2VPYmplY3RzKGRlc3Rba2V5XSwgdmFsdWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgZGVzdFtrZXldID0gbWVyZ2VPYmplY3RzKHt9LCB2YWx1ZSk7IC8vIGRlc3RpbmF0aW9uIG5vdCBhbiBvYmplY3QsIG92ZXJ3cml0ZVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIE92ZXJ3cml0ZSB0aGUgcHJldmlvdXMgZGVzdGluYXRpb24gdmFsdWUgaWYgdGhlIHNvdXJjZSBwcm9wZXJ0eSBpczogYSBzY2FsYXIgKG51bWJlci9zdHJpbmcpLFxuICAgICAgICAgICAgLy8gYW4gYXJyYXksIG9yIGEgbnVsbCB2YWx1ZVxuICAgICAgICAgICAgZWxzZSBpZiAodmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIGRlc3Rba2V5XSA9IHZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gVW5kZWZpbmVkIHNvdXJjZSBwcm9wZXJ0aWVzIGFyZSBpZ25vcmVkXG4gICAgICAgIH1cblxuICAgIH1cbiAgICByZXR1cm4gZGVzdDtcbn1cbiIsImltcG9ydCBWZWN0b3IgZnJvbSAnLi4vdmVjdG9yJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgT0JCIHtcblxuICAgIGNvbnN0cnVjdG9yICh4LCB5LCBhLCB3LCBoKSB7XG4gICAgICAgIHRoaXMuZGltZW5zaW9uID0gW3csIGhdO1xuICAgICAgICB0aGlzLmFuZ2xlID0gYTtcbiAgICAgICAgdGhpcy5jZW50cm9pZCA9IFt4LCB5XTtcbiAgICAgICAgdGhpcy5xdWFkID0gW107XG4gICAgICAgIHRoaXMuYXhlcyA9IFtdO1xuXG4gICAgICAgIHRoaXMudXBkYXRlKCk7XG4gICAgfVxuXG4gICAgbW92ZSAocHgsIHB5KSB7XG4gICAgXHR0aGlzLmNlbnRyb2lkID0gW3B4LCBweV07XG5cbiAgICBcdHRoaXMudXBkYXRlKCk7XG4gICAgfVxuXG4gICAgZ2V0RXh0ZW50ICgpIHtcbiAgICBcdGxldCBpbmYgPSAxZTY7XG4gICAgXHRsZXQgYWFiYiA9IFtpbmYsIGluZiwgLWluZiwgLWluZl07XG5cbiAgICBcdGZvciAobGV0IGkgPSAwOyBpIDwgNDsgKytpKSB7XG4gICAgICAgICAgICBhYWJiWzBdID0gTWF0aC5taW4odGhpcy5xdWFkW2ldWzBdLCBhYWJiWzBdKTtcbiAgICAgICAgICAgIGFhYmJbMV0gPSBNYXRoLm1pbih0aGlzLnF1YWRbaV1bMV0sIGFhYmJbMV0pO1xuICAgICAgICAgICAgYWFiYlsyXSA9IE1hdGgubWF4KHRoaXMucXVhZFtpXVswXSwgYWFiYlsyXSk7XG4gICAgICAgICAgICBhYWJiWzNdID0gTWF0aC5tYXgodGhpcy5xdWFkW2ldWzFdLCBhYWJiWzNdKTtcbiAgICBcdH1cblxuICAgIFx0cmV0dXJuIGFhYmI7XG4gICAgfVxuXG4gICAgcGVycEF4ZXMgKCkge1xuICAgIFx0dGhpcy5heGVzWzBdID0gVmVjdG9yLm5vcm1hbGl6ZShWZWN0b3Iuc3ViKHRoaXMucXVhZFsyXSwgdGhpcy5xdWFkWzNdKSk7XG4gICAgXHR0aGlzLmF4ZXNbMV0gPSBWZWN0b3Iubm9ybWFsaXplKFZlY3Rvci5zdWIodGhpcy5xdWFkWzJdLCB0aGlzLnF1YWRbMV0pKTtcbiAgICB9XG5cbiAgICB1cGRhdGUgKCkge1xuICAgIFx0bGV0IHggPSBbIE1hdGguY29zKHRoaXMuYW5nbGUpLCBNYXRoLnNpbih0aGlzLmFuZ2xlKV07XG4gICAgXHRsZXQgeSA9IFstTWF0aC5zaW4odGhpcy5hbmdsZSksIE1hdGguY29zKHRoaXMuYW5nbGUpXTtcblxuICAgIFx0eCA9IFZlY3Rvci5tdWx0KHgsIHRoaXMuZGltZW5zaW9uWzBdIC8gMi4wKTtcbiAgICBcdHkgPSBWZWN0b3IubXVsdCh5LCB0aGlzLmRpbWVuc2lvblsxXSAvIDIuMCk7XG5cbiAgICBcdHRoaXMucXVhZFswXSA9IFZlY3Rvci5zdWIoVmVjdG9yLnN1Yih0aGlzLmNlbnRyb2lkLCB4KSwgeSk7IC8vIGxvd2VyLWxlZnRcbiAgICBcdHRoaXMucXVhZFsxXSA9IFZlY3Rvci5zdWIoVmVjdG9yLmFkZCh0aGlzLmNlbnRyb2lkLCB4KSwgeSk7IC8vIGxvd2VyLXJpZ2h0XG4gICAgXHR0aGlzLnF1YWRbMl0gPSBWZWN0b3IuYWRkKFZlY3Rvci5hZGQodGhpcy5jZW50cm9pZCwgeCksIHkpOyAvLyB1cGVyLXJpZ2h0XG4gICAgXHR0aGlzLnF1YWRbM10gPSBWZWN0b3IuYWRkKFZlY3Rvci5zdWIodGhpcy5jZW50cm9pZCwgeCksIHkpOyAvLyB1cGVyLWxlZnRcblxuICAgIFx0dGhpcy5wZXJwQXhlcygpO1xuICAgIH1cblxuICAgIHN0YXRpYyBwcm9qZWN0VG9BeGlzIChvYmIsIGF4aXMpIHtcbiAgICBcdGxldCBpbmYgPSAxZTY7XG4gICAgXHRsZXQgbWluID0gaW5mO1xuICAgIFx0bGV0IG1heCA9IC1pbmY7XG5cbiAgICBcdGxldCBxdWFkID0gb2JiLnF1YWQ7XG5cbiAgICBcdC8vIGZvciBlYWNoIGF4aXMsIHByb2plY3Qgb2JiIHF1YWQgdG8gaXQgYW5kIGZpbmQgbWluIGFuZCBtYXggdmFsdWVzXG4gICAgXHRmb3IgKGxldCBpID0gMDsgaSA8IDQ7ICsraSkge1xuICAgICAgICAgICAgbGV0IGQgPSAgVmVjdG9yLmRvdChxdWFkW2ldLCBheGlzKTtcbiAgICAgICAgICAgIG1pbiA9IE1hdGgubWluKG1pbiwgZCk7XG4gICAgICAgICAgICBtYXggPSBNYXRoLm1heChtYXgsIGQpO1xuICAgIFx0fVxuXG4gICAgXHRyZXR1cm4gW21pbiwgbWF4XTtcbiAgICB9XG5cbiAgICBzdGF0aWMgYXhpc0NvbGxpZGUgKG9iYl9hLCBvYmJfYiwgYXhlcykge1xuICAgIFx0Zm9yIChsZXQgaSA9IDA7IGkgPCAyOyArK2kpIHtcbiAgICBcdFx0bGV0IGFfcHJvaiA9IE9CQi5wcm9qZWN0VG9BeGlzKG9iYl9hLCBheGVzW2ldKTtcbiAgICBcdFx0bGV0IGJfcHJvaiA9IE9CQi5wcm9qZWN0VG9BeGlzKG9iYl9iLCBheGVzW2ldKTtcblxuICAgIFx0XHRpZiAoYl9wcm9qWzBdID4gYV9wcm9qWzFdIHx8IGJfcHJvalsxXSA8IGFfcHJvalswXSkge1xuICAgIFx0XHRcdHJldHVybiBmYWxzZTtcbiAgICBcdFx0fVxuICAgIFx0fVxuICAgIFx0cmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgc3RhdGljIGludGVyc2VjdChvYmJfYSwgb2JiX2IpIHtcbiAgICBcdHJldHVybiBPQkIuYXhpc0NvbGxpZGUob2JiX2EsIG9iYl9iLCBvYmJfYS5heGVzKSAmJiBPQkIuYXhpc0NvbGxpZGUob2JiX2EsIG9iYl9iLCBvYmJfYi5heGVzKTtcbiAgICB9XG5cbn1cblxuIiwiLy8gUHJvbWlzZXMgcG9seWZpbGxcbmltcG9ydCAnY29yZS1qcy9lczYvcHJvbWlzZSc7XG5cbi8vIE9iamVjdC5hc3NpZ24gcG9seWZpbGxcbi8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL09iamVjdC9hc3NpZ25cbmlmICh0eXBlb2YgT2JqZWN0LmFzc2lnbiAhPT0gJ2Z1bmN0aW9uJykge1xuICAgIChmdW5jdGlvbiAoKSB7XG4gICAgICAgIE9iamVjdC5hc3NpZ24gPSBmdW5jdGlvbiAodGFyZ2V0KSB7XG4gICAgICAgICAgICAndXNlIHN0cmljdCc7XG4gICAgICAgICAgICAvLyBXZSBtdXN0IGNoZWNrIGFnYWluc3QgdGhlc2Ugc3BlY2lmaWMgY2FzZXMuXG4gICAgICAgICAgICBpZiAodGFyZ2V0ID09PSB1bmRlZmluZWQgfHwgdGFyZ2V0ID09PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignQ2Fubm90IGNvbnZlcnQgdW5kZWZpbmVkIG9yIG51bGwgdG8gb2JqZWN0Jyk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHZhciBvdXRwdXQgPSBPYmplY3QodGFyZ2V0KTtcbiAgICAgICAgICAgIGZvciAodmFyIGluZGV4ID0gMTsgaW5kZXggPCBhcmd1bWVudHMubGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgICAgICAgICAgICAgdmFyIHNvdXJjZSA9IGFyZ3VtZW50c1tpbmRleF07XG4gICAgICAgICAgICAgICAgaWYgKHNvdXJjZSAhPT0gdW5kZWZpbmVkICYmIHNvdXJjZSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBuZXh0S2V5IGluIHNvdXJjZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNvdXJjZS5oYXNPd25Qcm9wZXJ0eShuZXh0S2V5KSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dFtuZXh0S2V5XSA9IHNvdXJjZVtuZXh0S2V5XTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBvdXRwdXQ7XG4gICAgICAgIH07XG4gICAgfSkoKTtcbn1cbiIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHN1YnNjcmliZU1peGluICh0YXJnZXQpIHtcblxuICAgIGxldCBsaXN0ZW5lcnMgPSBbXTtcblxuICAgIHJldHVybiBPYmplY3QuYXNzaWduKHRhcmdldCwge1xuXG4gICAgICAgIHN1YnNjcmliZShsaXN0ZW5lcikge1xuICAgICAgICAgICAgaWYgKGxpc3RlbmVycy5pbmRleE9mKGxpc3RlbmVyKSA9PT0gLTEpIHtcbiAgICAgICAgICAgICAgICBsaXN0ZW5lcnMucHVzaChsaXN0ZW5lcik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG5cbiAgICAgICAgdW5zdWJzY3JpYmUobGlzdGVuZXIpIHtcbiAgICAgICAgICAgIGxldCBpbmRleCA9IGxpc3RlbmVycy5pbmRleE9mKGxpc3RlbmVyKTtcbiAgICAgICAgICAgIGlmIChpbmRleCA+IC0xKSB7XG4gICAgICAgICAgICAgICAgbGlzdGVuZXJzLnNwbGljZShpbmRleCwgMSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG5cbiAgICAgICAgdW5zdWJzY3JpYmVBbGwoKSB7XG4gICAgICAgICAgICBsaXN0ZW5lcnMgPSBbXTtcbiAgICAgICAgfSxcblxuICAgICAgICB0cmlnZ2VyKGV2ZW50LCAuLi5kYXRhKSB7XG4gICAgICAgICAgICBsaXN0ZW5lcnMuZm9yRWFjaChsaXN0ZW5lciA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBsaXN0ZW5lcltldmVudF0gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICAgICAgbGlzdGVuZXJbZXZlbnRdKC4uLmRhdGEpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9LFxuXG4gICAgICAgIGhhc1N1YnNjcmliZXJzRm9yKGV2ZW50KSB7XG4gICAgICAgICAgICBsZXQgaGFzID0gZmFsc2U7XG4gICAgICAgICAgICBsaXN0ZW5lcnMuZm9yRWFjaChsaXN0ZW5lciA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBsaXN0ZW5lcltldmVudF0gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICAgICAgaGFzID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiBoYXM7XG4gICAgICAgIH1cblxuICAgIH0pO1xuXG59XG4iLCIvKmpzaGludCB3b3JrZXI6IHRydWUqL1xuXG4vLyBNYXJrIHRocmVhZCBhcyBtYWluIG9yIHdvcmtlclxuY29uc3QgVGhyZWFkID0ge307XG5cbmV4cG9ydCBkZWZhdWx0IFRocmVhZDtcblxudHJ5IHtcbiAgICBpZiAod2luZG93LmRvY3VtZW50ICE9PSBIVE1MRG9jdW1lbnQpIHsgLy8ganNoaW50IGlnbm9yZTpsaW5lXG4gICAgICAgIFRocmVhZC5pc193b3JrZXIgPSBmYWxzZTtcbiAgICAgICAgVGhyZWFkLmlzX21haW4gICA9IHRydWU7XG4gICAgfVxufVxuY2F0Y2ggKGUpIHtcbiAgICBpZiAoc2VsZiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIFRocmVhZC5pc193b3JrZXIgPSB0cnVlO1xuICAgICAgICBUaHJlYWQuaXNfbWFpbiAgID0gZmFsc2U7XG5cbiAgICAgICAgLy8gUGF0Y2ggZm9yIDNyZCBwYXJ0eSBsaWJzIHRoYXQgcmVxdWlyZSB0aGVzZSBnbG9iYWxzIHRvIGJlIHByZXNlbnQuIFNwZWNpZmljYWxseSwgRm9udEZhY2VPYnNlcnZlci5cbiAgICAgICAgLy8gQnJpdHRsZSBzb2x1dGlvbiBidXQgYWxsb3dzIHRoYXQgbGlicmFyeSB0byBsb2FkIG9uIHdvcmtlciB0aHJlYWRzLlxuICAgICAgICBzZWxmLndpbmRvdyA9IHsgZG9jdW1lbnQ6IHt9IH07XG4gICAgICAgIHNlbGYuZG9jdW1lbnQgPSBzZWxmLndpbmRvdy5kb2N1bWVudDtcbiAgICB9XG59XG4iLCJpbXBvcnQgbG9nIGZyb20gJy4vbG9nJztcblxuLy8gQWRkIGEgYmFzZSBVUkwgZm9yIHNjaGVtZWxlc3Mgb3IgcHJvdG9jb2wtbGVzcyBVUkxzXG4vLyBEZWZhdWx0cyB0byBhZGRpbmcgY3VycmVudCB3aW5kb3cgcHJvdG9jb2wgYW5kIGJhc2UsIG9yIGFkZHMgYSBjdXN0b20gYmFzZSBpZiBzcGVjaWZpZWRcbi8vIE1heWJlIHVzZSBodHRwczovL2dpdGh1Yi5jb20vbWVkaWFsaXplL1VSSS5qcyBpZiBtb3JlIHJvYnVzdCBmdW5jdGlvbmFsaXR5IGlzIG5lZWRlZFxuZXhwb3J0IGZ1bmN0aW9uIGFkZEJhc2VVUkwgKHVybCwgYmFzZSkge1xuICAgIGlmICghdXJsKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBTY2hlbWVsZXNzLCBhZGQgcHJvdG9jb2xcbiAgICBpZiAodXJsLnN1YnN0cigwLCAyKSA9PT0gJy8vJykge1xuICAgICAgICB1cmwgPSB3aW5kb3cubG9jYXRpb24ucHJvdG9jb2wgKyB1cmw7XG4gICAgfVxuICAgIC8vIE5vIGh0dHAocykgb3IgZGF0YSwgYWRkIGJhc2VcbiAgICBlbHNlIGlmICh1cmwuc2VhcmNoKC9eKGh0dHB8aHR0cHN8ZGF0YXxibG9iKTovKSA8IDApIHtcbiAgICAgICAgdmFyIHJlbGF0aXZlID0gKHVybFswXSAhPT0gJy8nKTtcbiAgICAgICAgdmFyIGJhc2VfaW5mbztcbiAgICAgICAgaWYgKGJhc2UpIHtcbiAgICAgICAgICAgIGJhc2VfaW5mbyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKTsgLy8gdXNlIGEgdGVtcG9yYXJ5IGVsZW1lbnQgdG8gcGFyc2UgVVJMXG4gICAgICAgICAgICBiYXNlX2luZm8uaHJlZiA9IGJhc2U7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBiYXNlX2luZm8gPSB3aW5kb3cubG9jYXRpb247XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocmVsYXRpdmUpIHtcbiAgICAgICAgICAgIGxldCBwYXRoID0gcGF0aEZvclVSTChiYXNlX2luZm8uaHJlZik7XG4gICAgICAgICAgICB1cmwgPSBwYXRoICsgdXJsO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgLy8gRWFzeSB3YXlcbiAgICAgICAgICAgIGlmIChiYXNlX2luZm8ub3JpZ2luKSB7XG4gICAgICAgICAgICAgICAgdXJsID0gYmFzZV9pbmZvLm9yaWdpbiArICcvJyArIHVybDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIEhhcmQgd2F5IChJRTExKVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdmFyIG9yaWdpbiA9IHVybC5tYXRjaCgvXigoaHR0cHxodHRwc3xkYXRhfGJsb2IpOlxcL1xcL1teXFwvXSpcXC8pLyk7XG4gICAgICAgICAgICAgICAgb3JpZ2luID0gKG9yaWdpbiAmJiBvcmlnaW4ubGVuZ3RoID4gMSkgPyBvcmlnaW5bMF0gOiAnJztcbiAgICAgICAgICAgICAgICB1cmwgPSBvcmlnaW4gKyB1cmw7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHVybDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHBhdGhGb3JVUkwgKHVybCkge1xuICAgIGlmICh0eXBlb2YgdXJsID09PSAnc3RyaW5nJyAmJiB1cmwuc2VhcmNoKC9eKGRhdGF8YmxvYik6LykgPT09IC0xKSB7XG4gICAgICAgIGxldCBxcyA9IHVybC5pbmRleE9mKCc/Jyk7XG4gICAgICAgIGlmIChxcyA+IC0xKSB7XG4gICAgICAgICAgICB1cmwgPSB1cmwuc3Vic3RyKDAsIHFzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBoYXNoID0gdXJsLmluZGV4T2YoJyMnKTtcbiAgICAgICAgaWYgKGhhc2ggPiAtMSkge1xuICAgICAgICAgICAgdXJsID0gdXJsLnN1YnN0cigwLCBoYXNoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB1cmwuc3Vic3RyKDAsIHVybC5sYXN0SW5kZXhPZignLycpICsgMSkgfHwgJyc7XG4gICAgfVxuICAgIHJldHVybiAnJztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGV4dGVuc2lvbkZvclVSTCAodXJsKSB7XG4gICAgdXJsID0gdXJsLnNwbGl0KCcvJykucG9wKCk7XG4gICAgbGV0IGxhc3RfZG90ID0gdXJsLmxhc3RJbmRleE9mKCcuJyk7XG4gICAgaWYgKGxhc3RfZG90ID4gLTEpIHtcbiAgICAgICAgcmV0dXJuIHVybC5zdWJzdHJpbmcobGFzdF9kb3QgKyAxKTtcbiAgICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc1JlbGF0aXZlVVJMICh1cmwpIHtcbiAgICBpZiAodHlwZW9mIHVybCAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICByZXR1cm4gISh1cmwuc2VhcmNoKC9eKGh0dHB8aHR0cHN8ZGF0YXxibG9iKTovKSA+IC0xIHx8IHVybC5zdWJzdHIoMCwgMikgPT09ICcvLycpO1xufVxuXG4vLyBSZXNvbHZlcyAnLi8nIGFuZCAnLi4vJyBjb21wb25lbnRzIGZyb20gcmVsYXRpdmUgcGF0aCwgdG8gZ2V0IGEgXCJmbGF0dGVuZWRcIiBwYXRoXG5leHBvcnQgZnVuY3Rpb24gZmxhdHRlblJlbGF0aXZlVVJMICh1cmwpIHtcbiAgICBsZXQgZGlycyA9ICh1cmwgfHwgJycpLnNwbGl0KCcvJyk7XG4gICAgZm9yIChsZXQgZCA9IDE7IGQgPCBkaXJzLmxlbmd0aDsgZCsrKSB7XG4gICAgICAgIGlmIChkaXJzW2RdID09PSAnLicpIHtcbiAgICAgICAgICAgIGRpcnMuc3BsaWNlKGQsIDEpO1xuICAgICAgICAgICAgZC0tO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGRpcnNbZF0gPT09ICcuLicpIHtcbiAgICAgICAgICAgIGQgPSBkICsgMDtcbiAgICAgICAgICAgIGRpcnMuc3BsaWNlKGQtMSwgMik7XG4gICAgICAgICAgICBkLS07XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGRpcnMuam9pbignLycpO1xufVxuXG4vLyBBZGQgYSBzZXQgb2YgcXVlcnkgc3RyaW5nIHBhcmFtcyB0byBhIFVSTFxuLy8gcGFyYW1zOiBoYXNoIG9mIGtleS92YWx1ZSBwYWlycyBvZiBxdWVyeSBzdHJpbmcgcGFyYW1ldGVyc1xuZXhwb3J0IGZ1bmN0aW9uIGFkZFBhcmFtc1RvVVJMICh1cmwsIHBhcmFtcykge1xuICAgIGlmICghcGFyYW1zIHx8IE9iamVjdC5rZXlzKHBhcmFtcykubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHJldHVybiB1cmw7XG4gICAgfVxuXG4gICAgdmFyIHFzX2luZGV4ID0gdXJsLmluZGV4T2YoJz8nKTtcbiAgICB2YXIgaGFzaF9pbmRleCA9IHVybC5pbmRleE9mKCcjJyk7XG5cbiAgICAvLyBTYXZlIGFuZCB0cmltIGhhc2hcbiAgICB2YXIgaGFzaCA9ICcnO1xuICAgIGlmIChoYXNoX2luZGV4ID4gLTEpIHtcbiAgICAgICAgaGFzaCA9IHVybC5zbGljZShoYXNoX2luZGV4KTtcbiAgICAgICAgdXJsID0gdXJsLnNsaWNlKDAsIGhhc2hfaW5kZXgpO1xuICAgIH1cblxuICAgIC8vIFN0YXJ0IHF1ZXJ5IHN0cmluZ1xuICAgIGlmIChxc19pbmRleCA9PT0gLTEpIHtcbiAgICAgICAgcXNfaW5kZXggPSB1cmwubGVuZ3RoO1xuICAgICAgICB1cmwgKz0gJz8nO1xuICAgIH1cbiAgICBxc19pbmRleCsrOyAvLyBhZHZhbmNlZCBwYXN0ICc/J1xuXG4gICAgLy8gQnVpbGQgcXVlcnkgc3RyaW5nIHBhcmFtc1xuICAgIHZhciB1cmxfcGFyYW1zID0gJyc7XG4gICAgZm9yICh2YXIgcCBpbiBwYXJhbXMpIHtcbiAgICAgICAgdXJsX3BhcmFtcyArPSBgJHtwfT0ke3BhcmFtc1twXX0mYDtcbiAgICB9XG5cbiAgICAvLyBJbnNlcnQgbmV3IHF1ZXJ5IHN0cmluZyBwYXJhbXMgYW5kIHJlc3RvcmUgaGFzaFxuICAgIC8vIE5PVEU6IGRvZXNuJ3QgcmVwbGFjZSBhbnkgdmFsdWVzIGFscmVhZHkgcHJlc2VudCBvbiBxdWVyeSBzdHJpbmcsIGp1c3QgaW5zZXJ0cyBkdXBlIHZhbHVlc1xuICAgIHVybCA9IHVybC5zbGljZSgwLCBxc19pbmRleCkgKyB1cmxfcGFyYW1zICsgdXJsLnNsaWNlKHFzX2luZGV4KSArIGhhc2g7XG5cbiAgICByZXR1cm4gdXJsO1xufVxuXG4vLyBQb2x5ZmlsbCAoZm9yIFNhZmFyaSBjb21wYXRpYmlsaXR5KVxubGV0IF9jcmVhdGVPYmplY3RVUkw7XG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlT2JqZWN0VVJMICh1cmwpIHtcbiAgICBpZiAoX2NyZWF0ZU9iamVjdFVSTCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIF9jcmVhdGVPYmplY3RVUkwgPSAod2luZG93LlVSTCAmJiB3aW5kb3cuVVJMLmNyZWF0ZU9iamVjdFVSTCkgfHwgKHdpbmRvdy53ZWJraXRVUkwgJiYgd2luZG93LndlYmtpdFVSTC5jcmVhdGVPYmplY3RVUkwpO1xuXG4gICAgICAgIGlmICh0eXBlb2YgX2NyZWF0ZU9iamVjdFVSTCAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgX2NyZWF0ZU9iamVjdFVSTCA9IG51bGw7XG4gICAgICAgICAgICBsb2coJ3dhcm4nLCBgd2luZG93LlVSTC5jcmVhdGVPYmplY3RVUkwgKG9yIHZlbmRvciBwcmVmaXgpIG5vdCBmb3VuZCwgdW5hYmxlIHRvIGNyZWF0ZSBsb2NhbCBibG9iIFVSTHNgKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGlmIChfY3JlYXRlT2JqZWN0VVJMKSB7XG4gICAgICAgIHJldHVybiBfY3JlYXRlT2JqZWN0VVJMKHVybCk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICByZXR1cm4gdXJsO1xuICAgIH1cbn1cblxuLy8gR2V0IFVSTCB0aGF0IHRoZSBjdXJyZW50IHNjcmlwdCB3YXMgbG9hZGVkIGZyb21cbi8vIElmIGN1cnJlbnRTY3JpcHQgaXMgbm90IGF2YWlsYWJsZSwgbG9vcHMgdGhyb3VnaCA8c2NyaXB0PiBlbGVtZW50cyBzZWFyY2hpbmcgZm9yIGEgbGlzdCBvZiBwcm92aWRlZCBwYXRoc1xuLy8gZS5nLiBmaW5kQ3VycmVudFVSTCgndGFuZ3JhbS5kZWJ1Zy5qcycsICd0YW5ncmFtLm1pbi5qcycpO1xuZXhwb3J0IGZ1bmN0aW9uIGZpbmRDdXJyZW50VVJMICguLi5wYXRocykge1xuICAgIC8vIEZpbmQgY3VycmVudGx5IGV4ZWN1dGluZyBzY3JpcHRcbiAgICB2YXIgc2NyaXB0ID0gZG9jdW1lbnQuY3VycmVudFNjcmlwdDtcbiAgICBpZiAoc2NyaXB0KSB7XG4gICAgICAgIHJldHVybiBzY3JpcHQuc3JjO1xuICAgIH1cbiAgICBlbHNlIGlmIChBcnJheS5pc0FycmF5KHBhdGhzKSkge1xuICAgICAgICAvLyBGYWxsYmFjayBvbiBsb29waW5nIHRocm91Z2ggPHNjcmlwdD4gZWxlbWVudHMgaWYgZG9jdW1lbnQuY3VycmVudFNjcmlwdCBpcyBub3Qgc3VwcG9ydGVkXG4gICAgICAgIHZhciBzY3JpcHRzID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ3NjcmlwdCcpO1xuICAgICAgICBmb3IgKHZhciBzPTA7IHMgPCBzY3JpcHRzLmxlbmd0aDsgcysrKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBwPTA7IHAgPCBwYXRocy5sZW5ndGg7IHArKykge1xuICAgICAgICAgICAgICAgIGlmIChzY3JpcHRzW3NdLnNyYy5pbmRleE9mKHBhdGhzW3BdKSA+IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgcmV0dXJuIHNjcmlwdHNbc10uc3JjO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn1cbiIsIi8vIE1pc2NlbGxhbmVvdXMgdXRpbGl0aWVzXG4vKmpzaGludCB3b3JrZXI6IHRydWUqL1xuXG5pbXBvcnQgbG9nIGZyb20gJy4vbG9nJztcbmltcG9ydCBUaHJlYWQgZnJvbSAnLi90aHJlYWQnO1xuaW1wb3J0IFdvcmtlckJyb2tlciBmcm9tICcuL3dvcmtlcl9icm9rZXInO1xuaW1wb3J0IEdlbyBmcm9tICcuLi9nZW8nO1xuXG5pbXBvcnQgeWFtbCBmcm9tICdqcy15YW1sJztcblxudmFyIFV0aWxzO1xuZXhwb3J0IGRlZmF1bHQgVXRpbHMgPSB7fTtcblxuV29ya2VyQnJva2VyLmFkZFRhcmdldCgnVXRpbHMnLCBVdGlscyk7XG5cbi8vIEJhc2ljIFNhZmFyaSBkZXRlY3Rpb25cbi8vIGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvNzk0NDQ2MC9kZXRlY3Qtc2FmYXJpLWJyb3dzZXJcblV0aWxzLmlzU2FmYXJpID0gZnVuY3Rpb24gKCkge1xuICAgIHJldHVybiAvXigoPyFjaHJvbWV8YW5kcm9pZCkuKSpzYWZhcmkvaS50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpO1xufTtcblxuLy8gQmFzaWMgSUUxMSBvciBFZGdlIGRldGVjdGlvblxuVXRpbHMuaXNNaWNyb3NvZnQgPSBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIC8oVHJpZGVudFxcLzcuMHxFZGdlWyAvXShcXGQrW1xcLlxcZF0rKSkvaS50ZXN0KG5hdmlnYXRvci51c2VyQWdlbnQpO1xufTtcblxuVXRpbHMuaW8gPSBmdW5jdGlvbiAodXJsLCB0aW1lb3V0ID0gNjAwMDAsIHJlc3BvbnNlVHlwZSA9ICd0ZXh0JywgbWV0aG9kID0gJ0dFVCcsIGhlYWRlcnMgPSB7fSwgcHJveHkgPSBmYWxzZSkge1xuICAgIGlmIChUaHJlYWQuaXNfd29ya2VyICYmIFV0aWxzLmlzTWljcm9zb2Z0KCkpIHtcbiAgICAgICAgLy8gU29tZSB2ZXJzaW9ucyBvZiBJRTExIGFuZCBFZGdlIHdpbGwgaGFuZyB3ZWIgd29ya2VycyB3aGVuIHBlcmZvcm1pbmcgWEhSIHJlcXVlc3RzXG4gICAgICAgIC8vIFRoZXNlIHJlcXVlc3RzIGNhbiBiZSBwcm94aWVkIHRocm91Z2ggdGhlIG1haW4gdGhyZWFkXG4gICAgICAgIC8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1pY3Jvc29mdC5jb20vZW4tdXMvbWljcm9zb2Z0LWVkZ2UvcGxhdGZvcm0vaXNzdWVzLzk1NDU4NjYvXG4gICAgICAgIGxvZygnZGVidWcnLCAnUHJveHlpbmcgcmVxdWVzdCBmb3IgVVJMIHRvIHdvcmtlcicsIHVybCk7XG4gICAgICAgIHJldHVybiBXb3JrZXJCcm9rZXIucG9zdE1lc3NhZ2UoJ1V0aWxzLmlvJywgdXJsLCB0aW1lb3V0LCByZXNwb25zZVR5cGUsIG1ldGhvZCwgaGVhZGVycywgdHJ1ZSk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICB2YXIgcmVxdWVzdCA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpO1xuICAgICAgICB2YXIgcHJvbWlzZSA9IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgIHJlcXVlc3Qub3BlbihtZXRob2QsIHVybCwgdHJ1ZSk7XG4gICAgICAgICAgICByZXF1ZXN0LnRpbWVvdXQgPSB0aW1lb3V0O1xuICAgICAgICAgICAgcmVxdWVzdC5yZXNwb25zZVR5cGUgPSByZXNwb25zZVR5cGU7XG4gICAgICAgICAgICByZXF1ZXN0Lm9ubG9hZCA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAocmVxdWVzdC5zdGF0dXMgPT09IDIwMCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoWyd0ZXh0JywgJ2pzb24nXS5pbmRleE9mKHJlcXVlc3QucmVzcG9uc2VUeXBlKSA+IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXNvbHZlKHJlcXVlc3QucmVzcG9uc2VUZXh0KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUocmVxdWVzdC5yZXNwb25zZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICByZWplY3QoRXJyb3IoJ1JlcXVlc3QgZXJyb3Igd2l0aCBhIHN0YXR1cyBvZiAnICsgcmVxdWVzdC5zdGF0dXNUZXh0KSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHJlcXVlc3Qub25lcnJvciA9IChldnQpID0+IHtcbiAgICAgICAgICAgICAgICByZWplY3QoRXJyb3IoJ1RoZXJlIHdhcyBhIG5ldHdvcmsgZXJyb3InICsgZXZ0LnRvU3RyaW5nKCkpKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICByZXF1ZXN0Lm9udGltZW91dCA9IChldnQpID0+IHtcbiAgICAgICAgICAgICAgICByZWplY3QoRXJyb3IoJ3RpbWVvdXQgJysgZXZ0LnRvU3RyaW5nKCkpKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICByZXF1ZXN0LnNlbmQoKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHByb21pc2UsICdyZXF1ZXN0Jywge1xuICAgICAgICAgICAgdmFsdWU6IHJlcXVlc3RcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIHByb21pc2UudGhlbihyZXNwb25zZSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gKHByb3h5ICYmIFdvcmtlckJyb2tlci53aXRoVHJhbnNmZXJhYmxlcyhyZXNwb25zZSkpIHx8IHJlc3BvbnNlO1xuICAgICAgICB9KTtcbiAgICB9XG59O1xuXG5VdGlscy5wYXJzZVJlc291cmNlID0gZnVuY3Rpb24gKGJvZHkpIHtcbiAgICB2YXIgZGF0YTtcbiAgICB0cnkge1xuICAgICAgICAvLyBqc3lhbWwgJ2pzb24nIG9wdGlvbiBhbGxvd3MgZHVwbGljYXRlIGtleXNcbiAgICAgICAgLy8gS2VlcGluZyB0aGlzIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eSwgYnV0IHNob3VsZCBjb25zaWRlciBtaWdyYXRpbmcgdG8gcmVxdWlyaW5nXG4gICAgICAgIC8vIHVuaXF1ZSBrZXlzLCBhcyB0aGlzIGlzIFlBTUwgc3BlYy4gQnV0IFRhbmdyYW0gRVMgY3VycmVudGx5IGFjY2VwdHMgZHVwZSBrZXlzIGFzIHdlbGwsXG4gICAgICAgIC8vIHNvIHNob3VsZCBjb25zaWRlciBob3cgYmVzdCB0byB1bmlmeS5cbiAgICAgICAgZGF0YSA9IHlhbWwuc2FmZUxvYWQoYm9keSwgeyBqc29uOiB0cnVlIH0pO1xuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgdGhyb3cgZTtcbiAgICB9XG4gICAgcmV0dXJuIGRhdGE7XG59O1xuXG5VdGlscy5sb2FkUmVzb3VyY2UgPSBmdW5jdGlvbiAoc291cmNlKSB7XG4gICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgaWYgKHR5cGVvZiBzb3VyY2UgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICBVdGlscy5pbyhzb3VyY2UpLnRoZW4oKGJvZHkpID0+IHtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgZGF0YSA9IFV0aWxzLnBhcnNlUmVzb3VyY2UoYm9keSk7XG4gICAgICAgICAgICAgICAgICAgIHJlc29sdmUoZGF0YSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNhdGNoKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVqZWN0KGUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sIHJlamVjdCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICByZXNvbHZlKHNvdXJjZSk7XG4gICAgICAgIH1cbiAgICB9KTtcbn07XG5cbi8vIE5lZWRlZCBmb3Igb2xkZXIgYnJvd3NlcnMgdGhhdCBzdGlsbCBzdXBwb3J0IFdlYkdMIChTYWZhcmkgNiBldGMuKVxuVXRpbHMucmVxdWVzdEFuaW1hdGlvbkZyYW1lUG9seWZpbGwgPSBmdW5jdGlvbiAoKSB7XG4gICAgaWYgKHR5cGVvZiB3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUgPVxuICAgICAgICAgICAgd2luZG93LndlYmtpdFJlcXVlc3RBbmltYXRpb25GcmFtZSB8fFxuICAgICAgICAgICAgd2luZG93Lm1velJlcXVlc3RBbmltYXRpb25GcmFtZSAgICB8fFxuICAgICAgICAgICAgd2luZG93Lm9SZXF1ZXN0QW5pbWF0aW9uRnJhbWUgICAgICB8fFxuICAgICAgICAgICAgd2luZG93Lm1zUmVxdWVzdEFuaW1hdGlvbkZyYW1lICAgICB8fFxuICAgICAgICAgICAgZnVuY3Rpb24gKGNiKSB7XG4gICAgICAgICAgICAgICAgc2V0VGltZW91dChjYiwgMTAwMCAvNjApO1xuICAgICAgICAgICAgfTtcbiAgICB9XG59O1xuXG4vLyBTdHJpbmdpZnkgYW4gb2JqZWN0IGludG8gSlNPTiwgYnV0IGNvbnZlcnQgZnVuY3Rpb25zIHRvIHN0cmluZ3NcblV0aWxzLnNlcmlhbGl6ZVdpdGhGdW5jdGlvbnMgPSBmdW5jdGlvbiAob2JqKSB7XG4gICAgdmFyIHNlcmlhbGl6ZWQgPSBKU09OLnN0cmluZ2lmeShvYmosIGZ1bmN0aW9uKGssIHYpIHtcbiAgICAgICAgLy8gQ29udmVydCBmdW5jdGlvbnMgdG8gc3RyaW5nc1xuICAgICAgICBpZiAodHlwZW9mIHYgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHJldHVybiB2LnRvU3RyaW5nKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHY7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gc2VyaWFsaXplZDtcbn07XG5cbi8vIFJlY3Vyc2l2ZWx5IHBhcnNlIGFuIG9iamVjdCwgYXR0ZW1wdGluZyB0byBjb252ZXJ0IHN0cmluZyBwcm9wZXJ0aWVzIHRoYXQgbG9vayBsaWtlIGZ1bmN0aW9ucyBiYWNrIGludG8gZnVuY3Rpb25zXG5VdGlscy5zdHJpbmdzVG9GdW5jdGlvbnMgPSBmdW5jdGlvbihvYmosIHdyYXApIHtcbiAgICAvLyBDb252ZXJ0IHN0cmluZ1xuICAgIGlmICh0eXBlb2Ygb2JqID09PSAnc3RyaW5nJykge1xuICAgICAgICBvYmogPSBVdGlscy5zdHJpbmdUb0Z1bmN0aW9uKG9iaiwgd3JhcCk7XG4gICAgfVxuICAgIC8vIExvb3AgdGhyb3VnaCBvYmplY3QgcHJvcGVydGllc1xuICAgIGVsc2UgaWYgKG9iaiAhPSBudWxsICYmIHR5cGVvZiBvYmogPT09ICdvYmplY3QnKSB7XG4gICAgICAgIGZvciAobGV0IHAgaW4gb2JqKSB7XG4gICAgICAgICAgICBvYmpbcF0gPSBVdGlscy5zdHJpbmdzVG9GdW5jdGlvbnMob2JqW3BdLCB3cmFwKTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gb2JqO1xufTtcblxuLy8gQ29udmVydCBzdHJpbmcgYmFjayBpbnRvIGEgZnVuY3Rpb25cblV0aWxzLnN0cmluZ1RvRnVuY3Rpb24gPSBmdW5jdGlvbih2YWwsIHdyYXApIHtcbiAgICAvLyBQYXJzZSBmdW5jdGlvbiBzaWduYXR1cmUgYW5kIGJvZHlcbiAgICBsZXQgZm1hdGNoID1cbiAgICAgICAgKHR5cGVvZiB2YWwgPT09ICdzdHJpbmcnKSAmJlxuICAgICAgICB2YWwubWF0Y2goL15cXHMqZnVuY3Rpb25bXihdKlxcKChbXildKilcXClcXHMqP1xceyhbXFxzXFxTXSopXFx9JC9tKTtcblxuICAgIGlmIChmbWF0Y2ggJiYgZm1hdGNoLmxlbmd0aCA+IDIpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIGxldCBzcmMgPSBmbWF0Y2hbMl07XG4gICAgICAgICAgICBsZXQgYXJncyA9IGZtYXRjaFsxXS5sZW5ndGggPiAwICYmIGZtYXRjaFsxXS5zcGxpdCgnLCcpLm1hcCh4ID0+IHgudHJpbSgpKS5maWx0ZXIoeCA9PiB4KTtcbiAgICAgICAgICAgIGFyZ3MgPSBhcmdzLmxlbmd0aCA+IDAgPyBhcmdzIDogWydjb250ZXh0J107IC8vIGRlZmF1bHQgdG8gc2luZ2xlICdjb250ZXh0JyBhcmd1bWVudFxuXG4gICAgICAgICAgICBpZiAodHlwZW9mIHdyYXAgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEZ1bmN0aW9uKC4uLmFyZ3MsIHdyYXAoc3JjKSk7IC8vIGpzaGludCBpZ25vcmU6bGluZVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBGdW5jdGlvbiguLi5hcmdzLCBzcmMpOyAvLyBqc2hpbnQgaWdub3JlOmxpbmVcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgLy8gZmFsbC1iYWNrIHRvIG9yaWdpbmFsIHZhbHVlIGlmIHBhcnNpbmcgZmFpbGVkXG4gICAgICAgICAgICByZXR1cm4gdmFsO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiB2YWw7XG59O1xuXG4vLyBEZWZhdWx0IHRvIGFsbG93aW5nIGhpZ2ggcGl4ZWwgZGVuc2l0eVxuLy8gUmV0dXJucyB0cnVlIGlmIGRpc3BsYXkgZGVuc2l0eSBjaGFuZ2VkXG5VdGlscy51c2VfaGlnaF9kZW5zaXR5X2Rpc3BsYXkgPSB0cnVlO1xuVXRpbHMudXBkYXRlRGV2aWNlUGl4ZWxSYXRpbyA9IGZ1bmN0aW9uICgpIHtcbiAgICBsZXQgcHJldiA9IFV0aWxzLmRldmljZV9waXhlbF9yYXRpbztcbiAgICBVdGlscy5kZXZpY2VfcGl4ZWxfcmF0aW8gPSAoVXRpbHMudXNlX2hpZ2hfZGVuc2l0eV9kaXNwbGF5ICYmIHdpbmRvdy5kZXZpY2VQaXhlbFJhdGlvKSB8fCAxO1xuICAgIHJldHVybiBVdGlscy5kZXZpY2VfcGl4ZWxfcmF0aW8gIT09IHByZXY7XG59O1xuXG5pZiAoVGhyZWFkLmlzX21haW4pIHtcbiAgICBVdGlscy51cGRhdGVEZXZpY2VQaXhlbFJhdGlvKCk7XG59XG5cbi8vIFVzZWQgZm9yIGRpZmZlcmVudGlhdGluZyBiZXR3ZWVuIHBvd2VyLW9mLTIgYW5kIG5vbi1wb3dlci1vZi0yIHRleHR1cmVzXG4vLyBWaWE6IGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvMTk3MjIyNDcvd2ViZ2wtd2FpdC1mb3ItdGV4dHVyZS10by1sb2FkXG5VdGlscy5pc1Bvd2VyT2YyID0gZnVuY3Rpb24odmFsdWUpIHtcbiAgICByZXR1cm4gKHZhbHVlICYgKHZhbHVlIC0gMSkpID09PSAwO1xufTtcblxuLy8gSW50ZXJwb2xhdGUgJ3gnIGFsb25nIGEgc2VyaWVzIG9mIGNvbnRyb2wgcG9pbnRzXG4vLyAncG9pbnRzJyBpcyBhbiBhcnJheSBvZiBjb250cm9sIHBvaW50cyBpbiB0aGUgZm9ybSBbeCwgeV1cbi8vXG4vLyBFeGFtcGxlOlxuLy8gICAgIENvbnRyb2wgcG9pbnRzOlxuLy8gICAgICAgICBbMCwgNV06ICB3aGVuIHg9MCwgeT01XG4vLyAgICAgICAgIFs0LCAxMF06IHdoZW4geD00LCB5PTEwXG4vL1xuLy8gICAgIFV0aWxzLmludGVycG9sYXRlKDIsIFtbMCwgNV0sIFs0LCAxMF1dKTtcbi8vICAgICAtPiBjb21wdXRlcyB4PTIsIGhhbGZ3YXkgYmV0d2VlbiB4PTAgYW5kIHg9NDogKDEwIC0gNSkgLyAyICs1XG4vLyAgICAgLT4gcmV0dXJucyA3LjVcbi8vXG4vLyBUT0RPOiBhZGQgb3RoZXIgaW50ZXJwb2xhdGlvbiBtZXRob2RzIGJlc2lkZXMgbGluZWFyXG4vL1xuVXRpbHMuaW50ZXJwb2xhdGUgPSBmdW5jdGlvbih4LCBwb2ludHMsIHRyYW5zZm9ybSkge1xuICAgIC8vIElmIHRoaXMgZG9lc24ndCByZXNlbWJsZSBhIGxpc3Qgb2YgY29udHJvbCBwb2ludHMsIGp1c3QgcmV0dXJuIHRoZSBvcmlnaW5hbCB2YWx1ZVxuICAgIGlmICghQXJyYXkuaXNBcnJheShwb2ludHMpIHx8ICFBcnJheS5pc0FycmF5KHBvaW50c1swXSkpIHtcbiAgICAgICAgcmV0dXJuIHBvaW50cztcbiAgICB9XG4gICAgZWxzZSBpZiAocG9pbnRzLmxlbmd0aCA8IDEpIHtcbiAgICAgICAgcmV0dXJuIHBvaW50cztcbiAgICB9XG5cbiAgICB2YXIgeDEsIHgyLCBkLCB5LCB5MSwgeTI7XG5cbiAgICAvLyBNaW4gYm91bmRzXG4gICAgaWYgKHggPD0gcG9pbnRzWzBdWzBdKSB7XG4gICAgICAgIHkgPSBwb2ludHNbMF1bMV07XG4gICAgICAgIGlmICh0eXBlb2YgdHJhbnNmb3JtID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICB5ID0gdHJhbnNmb3JtKHkpO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8vIE1heCBib3VuZHNcbiAgICBlbHNlIGlmICh4ID49IHBvaW50c1twb2ludHMubGVuZ3RoLTFdWzBdKSB7XG4gICAgICAgIHkgPSBwb2ludHNbcG9pbnRzLmxlbmd0aC0xXVsxXTtcbiAgICAgICAgaWYgKHR5cGVvZiB0cmFuc2Zvcm0gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHkgPSB0cmFuc2Zvcm0oeSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gRmluZCB3aGljaCBjb250cm9sIHBvaW50cyB4IGlzIGJldHdlZW5cbiAgICBlbHNlIHtcbiAgICAgICAgZm9yICh2YXIgaT0wOyBpIDwgcG9pbnRzLmxlbmd0aCAtIDE7IGkrKykge1xuICAgICAgICAgICAgaWYgKHggPj0gcG9pbnRzW2ldWzBdICYmIHggPCBwb2ludHNbaSsxXVswXSkge1xuICAgICAgICAgICAgICAgIC8vIExpbmVhciBpbnRlcnBvbGF0aW9uXG4gICAgICAgICAgICAgICAgeDEgPSBwb2ludHNbaV1bMF07XG4gICAgICAgICAgICAgICAgeDIgPSBwb2ludHNbaSsxXVswXTtcblxuICAgICAgICAgICAgICAgIC8vIE11bHRpcGxlIHZhbHVlc1xuICAgICAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KHBvaW50c1tpXVsxXSkpIHtcbiAgICAgICAgICAgICAgICAgICAgeSA9IFtdO1xuICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBjPTA7IGMgPCBwb2ludHNbaV1bMV0ubGVuZ3RoOyBjKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgdHJhbnNmb3JtID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgeTEgPSB0cmFuc2Zvcm0ocG9pbnRzW2ldWzFdW2NdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB5MiA9IHRyYW5zZm9ybShwb2ludHNbaSsxXVsxXVtjXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZCA9IHkyIC0geTE7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgeVtjXSA9IGQgKiAoeCAtIHgxKSAvICh4MiAtIHgxKSArIHkxO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZCA9IHBvaW50c1tpKzFdWzFdW2NdIC0gcG9pbnRzW2ldWzFdW2NdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHlbY10gPSBkICogKHggLSB4MSkgLyAoeDIgLSB4MSkgKyBwb2ludHNbaV1bMV1bY107XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gU2luZ2xlIHZhbHVlXG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgdHJhbnNmb3JtID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB5MSA9IHRyYW5zZm9ybShwb2ludHNbaV1bMV0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgeTIgPSB0cmFuc2Zvcm0ocG9pbnRzW2krMV1bMV0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgZCA9IHkyIC0geTE7XG4gICAgICAgICAgICAgICAgICAgICAgICB5ID0gZCAqICh4IC0geDEpIC8gKHgyIC0geDEpICsgeTE7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBkID0gcG9pbnRzW2krMV1bMV0gLSBwb2ludHNbaV1bMV07XG4gICAgICAgICAgICAgICAgICAgICAgICB5ID0gZCAqICh4IC0geDEpIC8gKHgyIC0geDEpICsgcG9pbnRzW2ldWzFdO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiB5O1xufTtcblxuVXRpbHMudG9DU1NDb2xvciA9IGZ1bmN0aW9uIChjb2xvcikge1xuICAgIGlmIChjb2xvclszXSA9PT0gMSkgeyAvLyBmdWxsIG9wYWNpdHlcbiAgICAgICAgcmV0dXJuIGByZ2IoJHtjb2xvci5zbGljZSgwLCAzKS5tYXAoYyA9PiBNYXRoLnJvdW5kKGMgKiAyNTUpKS5qb2luKCcsICcpfSlgO1xuICAgIH1cbiAgICAvLyBSR0IgaXMgYmV0d2VlbiBbMCwgMjU1XSBvcGFjaXR5IGlzIGJldHdlZW4gWzAsIDFdXG4gICAgcmV0dXJuIGByZ2JhKCR7Y29sb3IubWFwKChjLCBpKSA9PiAoaSA8IDMgJiYgTWF0aC5yb3VuZChjICogMjU1KSkgfHwgYykuam9pbignLCAnKX0pYDtcbn07XG5cblV0aWxzLnBvaW50SW5UaWxlID0gZnVuY3Rpb24gKHBvaW50KSB7XG4gICAgcmV0dXJuIHBvaW50WzBdID49IDAgJibCoHBvaW50WzFdID4gLUdlby50aWxlX3NjYWxlICYmIHBvaW50WzBdIDwgR2VvLnRpbGVfc2NhbGUgJiYgcG9pbnRbMV0gPD0gMDtcbn07XG4iLCJsZXQgZnMgPSByZXF1aXJlKCdmcycpO1xubGV0IHBrZyA9IEpTT04ucGFyc2UoZnMucmVhZEZpbGVTeW5jKF9fZGlybmFtZSArICcvLi4vLi4vcGFja2FnZS5qc29uJywgJ3V0ZjgnKSk7XG5sZXQgdmVyc2lvbjtcbmV4cG9ydCBkZWZhdWx0IHZlcnNpb24gPSAndicgKyBwa2cudmVyc2lvbjtcbiIsIi8qanNoaW50IHdvcmtlcjogdHJ1ZSovXG5cbi8vIFdvcmtlckJyb2tlciByb3V0ZXMgbWVzc2FnZXMgYmV0d2VlbiB3ZWIgd29ya2VycyBhbmQgdGhlIG1haW4gdGhyZWFkLCBhbGxvd2luZyBmb3Igc2ltcGxlclxuLy8gYXN5bmMgY29kZSB2aWEgcHJvbWlzZXMuIEV4YW1wbGUgdXNhZ2U6XG4vL1xuLy8gSW4gd2ViIHdvcmtlciwgcmVnaXN0ZXIgc2VsZiBhcyBhIGNhbGxhYmxlIFwidGFyZ2V0XCIsIGFuZCBkZWZpbmUgYSBtZXRob2Q6XG4vL1xuLy8gICAgIFdvcmtlckJyb2tlci5hZGRUYXJnZXQoJ3NlbGYnLCBzZWxmKTtcbi8vXG4vLyAgICAgc2VsZi5zcXVhcmUgPSBmdW5jdGlvbiAoeCkge1xuLy8gICAgICAgICByZXR1cm4geCAqIHg7XG4vLyAgICAgfTtcbi8vXG4vLyBJbiBtYWluIHRocmVhZCwgaW52b2tlIHRoYXQgbWV0aG9kIGFuZCByZWNlaXZlIHRoZSByZXN1bHQgKGlmIGFueSkgYXMgYSBwcm9taXNlLlxuLy9cbi8vICAgICB3b3JrZXIgPSBuZXcgV29ya2VyKC4uLik7XG4vLyAgICAgV29ya2VyQnJva2VyLmFkZFdvcmtlcih3b3JrZXIpO1xuLy9cbi8vICAgICBXb3JrZXJCcm9rZXIucG9zdE1lc3NhZ2Uod29ya2VyLCAnc2VsZi5zcXVhcmUnLCA1KS50aGVuKGZ1bmN0aW9uKHkpIHtcbi8vICAgICAgICAgY29uc29sZS5sb2coeSk7XG4vLyAgICAgfSk7XG4vL1xuLy8gICAgIC0+IHByaW50cyAyNVxuLy9cbi8vIEFzeW5jIGNvZGU6XG4vL1xuLy8gRm9yIHN5bmNocm9ub3VzIGNvZGUgdGhhdCBtdXN0IHBhc3MgYSByZXR1cm4gdmFsdWUgdG8gdGhlIG1haW4gdGhyZWFkLCB0aGUgZnVuY3Rpb24gY2FuIHNpbXBseVxuLy8gcmV0dXJuIGFuIGltbWVkaWF0ZSB2YWx1ZSAoc2VlIGV4YW1wbGUgYWJvdmUpLiBGb3IgY2FzZXMgd2hlcmUgdGhlIHdvcmtlciBtZXRob2QgbmVlZHMgdG8gcnVuXG4vLyBhc3luY2hyb25vdXMgY29kZSwgdGhlIGZ1bmN0aW9uIGNhbiByZXR1cm4gYSBwcm9taXNlLCBhbmQgdGhlIHJlc29sdmVkIG9yIHJlamVjdGVkIHZhbHVlIHdpbGxcbi8vIGJlIHNlbnQgYmFjayB0byB0aGUgbWFpbiB0aHJlYWQgd2hlbiB0aGUgcHJvbWlzZSBpcyBmdWxmaWxsZWQuXG4vL1xuLy8gRXJyb3IgaGFuZGxpbmc6XG4vL1xuLy8gSWYgdGhlIHdvcmtlciBtZXRob2QgZWl0aGVyIHRocm93cyBhbiBlcnJvciwgb3IgcmV0dXJucyBhIHByb21pc2UgdGhhdCBpcyByZWplY3RlZCwgaXQgd2lsbCBiZVxuLy8gc2VudCBiYWNrIHRvIHRoZSBtYWluIHRocmVhZCBhcyBhIHByb21pc2UgcmVqZWN0aW9uLiBUaGVzZSB0d28gZXhhbXBsZXMgYXJlIGVxdWl2YWxlbnQ6XG4vL1xuLy8gICAgIEluIHdvcmtlciwgdGhyb3dpbmcgYW4gZXJyb3I6XG4vL1xuLy8gICAgICAgICBzZWxmLmJyb2tlbiA9IGZ1bmN0aW9uICgpIHtcbi8vICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcignZXJyb3IgaW4gd29ya2VyIScpO1xuLy8gICAgICAgICB9O1xuLy9cbi8vICAgICBJbiB3b3JrZXIsIHJldHVybmluZyBhIHJlamVjdGVkIHByb21pc2U6XG4vL1xuLy8gICAgICAgICBzZWxmLmJyb2tlbiA9IGZ1bmN0aW9uICgpIHtcbi8vICAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChuZXcgRXJyb3IoJ2Vycm9yIGluIHdvcmtlciEnKSk7XG4vLyAgICAgICAgIH07XG4vL1xuLy8gICAgIEluIG1haW4gdGhyZWFkLCBib3RoIGVycm9ycyBhcmUgcmVjZWl2ZWQgYXMgYSBwcm9taXNlIHJlamVjdGlvbjpcbi8vXG4vLyAgICAgICAgIFdvcmtlckJyb2tlci5wb3N0TWVzc2FnZSh3b3JrZXIsICdzZWxmLmJyb2tlbicpLnRoZW4oXG4vLyAgICAgICAgICAgICAvLyBQcm9taXNlIHJlc29sdmVkXG4vLyAgICAgICAgICAgICBmdW5jdGlvbigpIHtcbi8vICAgICAgICAgICAgICAgICBjb25zb2xlLmxvZygnc3VjY2VzcyEnKTtcbi8vICAgICAgICAgICAgIH0sXG4vLyAgICAgICAgICAgICAvLyBQcm9taXNlIHJlamVjdGVkXG4vLyAgICAgICAgICAgICBmdW5jdGlvbihlcnJvcikge1xuLy8gICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdlcnJvciEnLCBlcnJvcik7XG4vLyAgICAgICAgICAgICB9KTtcbi8vXG4vLyAgICAgICAgIC0+IHByaW50cyAnZXJyb3IhIGVycm9yIGluIHdvcmtlcidcbi8vXG4vLyBDYWxsaW5nIGZyb20gd29ya2VyIHRvIG1haW4gdGhyZWFkOlxuLy9cbi8vIFRoZSBzYW1lIHN0eWxlIG9mIGNhbGxzIGNhbiBiZSBtYWRlICpmcm9tKiBhIHdlYiB3b3JrZXIsIHRvIHRoZSBtYWluIHRocmVhZC4gVGhlIEFQSSBpcyB0aGUgc2FtZVxuLy8gd2l0aCB0aGUgZXhjZXB0aW9uIHRoYXQgdGhlIGZpcnN0IGFyZ3VtZW50LCAnd29ya2VyJywgaXMgbm90IG5lZWRlZCBmb3IgV29ya2VyQnJva2VyLnBvc3RNZXNzYWdlKCksXG4vLyBzaW5jZSB0aGUgbWFpbiB0aHJlYWQgaXMgdGhlIGltcGxpY2l0IHRhcmdldC5cbi8vXG4vLyBJbiBtYWluIHRocmVhZCwgZGVmaW5lIGEgbWV0aG9kIGFuZCByZWdpc3RlciBpdDpcbi8vXG4vLyAgICAgdmFyIGdlb21ldHJ5ID0ge1xuLy8gICAgICAgICBsZW5ndGg6IGZ1bmN0aW9uKHgsIHkpIHtcbi8vICAgICAgICAgICAgIHJldHVybiBNYXRoLnNxcnQoeCAqIHggKyB5ICogeSk7XG4vLyAgICAgICAgIH1cbi8vICAgICB9O1xuLy9cbi8vICAgICBXb3JrZXJCcm9rZXIuYWRkVGFyZ2V0KCdnZW9tZXRyeScsIGdlb21ldHJ5KTtcbi8vXG4vLyBJbiB3b3JrZXIgdGhyZWFkKTpcbi8vXG4vLyAgICAgV29ya2VyQnJva2VyLnBvc3RNZXNzYWdlKCdnZW9tZXRyeS5sZW5ndGgnLCAzLCA0KS50aGVuKGZ1bmN0aW9uKGQpIHtcbi8vICAgICAgICAgY29uc29sZS5sb2coZCk7XG4vLyAgICAgfSk7XG4vL1xuLy8gICAgIC0+IHByaW50cyA1XG4vL1xuXG5pbXBvcnQgVGhyZWFkIGZyb20gJy4vdGhyZWFkJztcbmltcG9ydCBsb2cgZnJvbSAnLi9sb2cnO1xuXG52YXIgV29ya2VyQnJva2VyO1xuZXhwb3J0IGRlZmF1bHQgV29ya2VyQnJva2VyID0ge307XG5cbi8vIEdsb2JhbCBsaXN0IG9mIGFsbCB3b3JrZXIgbWVzc2FnZXNcbi8vIFVuaXF1ZWx5IHRyYWNrcyBldmVyeSBjYWxsIG1hZGUgYmV0d2VlbiBtYWluIHRocmVhZCBhbmQgYSB3b3JrZXJcbnZhciBtZXNzYWdlX2lkID0gMDtcbnZhciBtZXNzYWdlcyA9IHt9O1xuXG4vLyBSZWdpc3RlciBhbiBvYmplY3QgdG8gcmVjZWl2ZSBjYWxscyBmcm9tIG90aGVyIHRocmVhZFxudmFyIHRhcmdldHMgPSB7fTtcbldvcmtlckJyb2tlci5hZGRUYXJnZXQgPSBmdW5jdGlvbiAobmFtZSwgdGFyZ2V0KSB7XG4gICAgdGFyZ2V0c1tuYW1lXSA9IHRhcmdldDtcbn07XG5cbi8vIEdpdmVuIGEgZG90LW5vdGF0aW9uLXN0eWxlIG1ldGhvZCBuYW1lLCBlLmcuICdPYmplY3Qub2JqZWN0Lm1ldGhvZCcsXG4vLyBmaW5kIHRoZSBvYmplY3QgdG8gY2FsbCB0aGUgbWV0aG9kIG9uIGZyb20gdGhlIGxpc3Qgb2YgcmVnaXN0ZXJlZCB0YXJnZXRzXG5mdW5jdGlvbiBmaW5kVGFyZ2V0IChtZXRob2QpIHtcbiAgICB2YXIgY2hhaW4gPSBbXTtcbiAgICBpZiAodHlwZW9mIG1ldGhvZCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgY2hhaW4gPSBtZXRob2Quc3BsaXQoJy4nKTtcbiAgICAgICAgbWV0aG9kID0gY2hhaW4ucG9wKCk7XG4gICAgfVxuXG4gICAgdmFyIHRhcmdldCA9IHRhcmdldHM7XG5cbiAgICBmb3IgKGxldCBtPTA7IG0gPCBjaGFpbi5sZW5ndGg7IG0rKykge1xuICAgICAgICBpZiAodGFyZ2V0W2NoYWluW21dXSkge1xuICAgICAgICAgICAgdGFyZ2V0ID0gdGFyZ2V0W2NoYWluW21dXTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBbbWV0aG9kLCB0YXJnZXRdO1xufVxuXG4vLyBNYWluIHRocmVhZDpcbi8vIC0gU2VuZCBtZXNzYWdlcyB0byB3b3JrZXJzLCBhbmQgb3B0aW9uYWxseSByZWNlaXZlIGFuIGFzeW5jIHJlc3BvbnNlIGFzIGEgcHJvbWlzZVxuLy8gLSBSZWNlaXZlIG1lc3NhZ2VzIGZyb20gd29ya2VycywgYW5kIG9wdGlvbmFsbHkgc2VuZCBhbiBhc3luYyByZXNwb25zZSBiYWNrIGFzIGEgcHJvbWlzZVxuZnVuY3Rpb24gc2V0dXBNYWluVGhyZWFkICgpIHtcblxuICAgIC8vIFNlbmQgYSBtZXNzYWdlIHRvIGEgd29ya2VyLCBhbmQgb3B0aW9uYWxseSBnZXQgYW4gYXN5bmMgcmVzcG9uc2VcbiAgICAvLyBBcmd1bWVudHM6XG4gICAgLy8gICAtIHdvcmtlcjogb25lIG9yIG1vcmUgd2ViIHdvcmtlciBpbnN0YW5jZXMgdG8gc2VuZCB0aGUgbWVzc2FnZSB0byAoc2luZ2xlIHZhbHVlIG9yIGFycmF5KVxuICAgIC8vICAgLSBtZXRob2Q6IHRoZSBtZXRob2Qgd2l0aCB0aGlzIG5hbWUsIHNwZWNpZmllZCB3aXRoIGRvdC1ub3RhdGlvbiwgd2lsbCBiZSBpbnZva2VkIGluIHRoZSB3b3JrZXJcbiAgICAvLyAgIC0gbWVzc2FnZTogc3ByZWFkIG9mIGFyZ3VtZW50cyB0byBjYWxsIHRoZSBtZXRob2Qgd2l0aFxuICAgIC8vIFJldHVybnM6XG4gICAgLy8gICAtIGEgcHJvbWlzZSB0aGF0IHdpbGwgYmUgZnVsZmlsbGVkIGlmIHRoZSB3b3JrZXIgbWV0aG9kIHJldHVybnMgYSB2YWx1ZSAoY291bGQgYmUgaW1tZWRpYXRlbHksIG9yIGFzeW5jKVxuICAgIC8vXG4gICAgV29ya2VyQnJva2VyLnBvc3RNZXNzYWdlID0gZnVuY3Rpb24gKHdvcmtlciwgbWV0aG9kLCAuLi5tZXNzYWdlKSB7XG4gICAgICAgIC8vIElmIG1vcmUgdGhhbiBvbmUgd29ya2VyIHNwZWNpZmllZCwgcG9zdCB0byBtdWx0aXBsZVxuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh3b3JrZXIpKSB7XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5hbGwoXG4gICAgICAgICAgICAgICAgd29ya2VyLm1hcCh3ID0+IFdvcmtlckJyb2tlci5wb3N0TWVzc2FnZSh3LCBtZXRob2QsIC4uLm1lc3NhZ2UpKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFRyYWNrIHN0YXRlIG9mIHRoaXMgbWVzc2FnZVxuICAgICAgICB2YXIgcHJvbWlzZSA9IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgIG1lc3NhZ2VzW21lc3NhZ2VfaWRdID0geyBtZXRob2QsIG1lc3NhZ2UsIHJlc29sdmUsIHJlamVjdCB9O1xuICAgICAgICB9KTtcblxuXG4gICAgICAgIGxldCBwYXlsb2FkLCB0cmFuc2ZlcmFibGVzID0gW107XG5cbiAgICAgICAgaWYgKG1lc3NhZ2UgJiYgbWVzc2FnZS5sZW5ndGggPT09IDEgJiYgbWVzc2FnZVswXSBpbnN0YW5jZW9mIFdvcmtlckJyb2tlci53aXRoVHJhbnNmZXJhYmxlcykge1xuICAgICAgICAgICAgdHJhbnNmZXJhYmxlcyA9IG1lc3NhZ2VbMF0udHJhbnNmZXJhYmxlcztcbiAgICAgICAgICAgIG1lc3NhZ2UgPSBtZXNzYWdlWzBdLnZhbHVlO1xuICAgICAgICB9XG5cbiAgICAgICAgcGF5bG9hZCA9IHtcbiAgICAgICAgICAgIHR5cGU6ICdtYWluX3NlbmQnLCAgICAgIC8vIG1hcmsgbWVzc2FnZSBhcyBtZXRob2QgaW52b2NhdGlvbiBmcm9tIG1haW4gdGhyZWFkXG4gICAgICAgICAgICBtZXNzYWdlX2lkLCAgICAgICAgICAgICAvLyB1bmlxdWUgaWQgZm9yIHRoaXMgbWVzc2FnZSwgZm9yIGxpZmUgb2YgcHJvZ3JhbVxuICAgICAgICAgICAgbWV0aG9kLCAgICAgICAgICAgICAgICAgLy8gd2lsbCBkaXNwYXRjaCB0byBhIGZ1bmN0aW9uIG9mIHRoaXMgbmFtZSB3aXRoaW4gdGhlIHdvcmtlclxuICAgICAgICAgICAgbWVzc2FnZSAgICAgICAgICAgICAgICAgLy8gbWVzc2FnZSBwYXlsb2FkXG4gICAgICAgIH07XG5cbiAgICAgICAgcGF5bG9hZCA9IG1heWJlRW5jb2RlKHBheWxvYWQsIHRyYW5zZmVyYWJsZXMpO1xuICAgICAgICB3b3JrZXIucG9zdE1lc3NhZ2UocGF5bG9hZCwgdHJhbnNmZXJhYmxlcy5tYXAodCA9PiB0Lm9iamVjdCkpO1xuICAgICAgICBmcmVlVHJhbnNmZXJhYmxlcyh0cmFuc2ZlcmFibGVzKTtcbiAgICAgICAgaWYgKHRyYW5zZmVyYWJsZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgbG9nKCd0cmFjZScsIGAnJHttZXRob2R9JyB0cmFuc2ZlcnJlZCAke3RyYW5zZmVyYWJsZXMubGVuZ3RofSBvYmplY3RzIHRvIHdvcmtlciB0aHJlYWRgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIG1lc3NhZ2VfaWQrKztcbiAgICAgICAgcmV0dXJuIHByb21pc2U7XG4gICAgfTtcblxuICAgIC8vIEFkZCBhIHdvcmtlciB0byBjb21tdW5pY2F0ZSB3aXRoIC0gZWFjaCB3b3JrZXIgbXVzdCBiZSByZWdpc3RlcmVkIGZyb20gdGhlIG1haW4gdGhyZWFkXG4gICAgV29ya2VyQnJva2VyLmFkZFdvcmtlciA9IGZ1bmN0aW9uICh3b3JrZXIpIHtcbiAgICAgICAgaWYgKCEod29ya2VyIGluc3RhbmNlb2YgV29ya2VyKSkge1xuICAgICAgICAgICAgdGhyb3cgRXJyb3IoYFdvcmtlciBicm9rZXIgY291bGQgbm90IGFkZCBub24tV29ya2VyIG9iamVjdGAsIHdvcmtlcik7XG4gICAgICAgIH1cblxuICAgICAgICB3b3JrZXIuYWRkRXZlbnRMaXN0ZW5lcignbWVzc2FnZScsIGZ1bmN0aW9uIFdvcmtlckJyb2tlck1haW5UaHJlYWRIYW5kbGVyKGV2ZW50KSB7XG4gICAgICAgICAgICBsZXQgZGF0YSA9IG1heWJlRGVjb2RlKGV2ZW50LmRhdGEpO1xuICAgICAgICAgICAgbGV0IGlkID0gZGF0YS5tZXNzYWdlX2lkO1xuXG4gICAgICAgICAgICAvLyBMaXN0ZW4gZm9yIG1lc3NhZ2VzIGNvbWluZyBiYWNrIGZyb20gdGhlIHdvcmtlciwgYW5kIGZ1bGZpbGwgdGhhdCBtZXNzYWdlJ3MgcHJvbWlzZVxuICAgICAgICAgICAgaWYgKGRhdGEudHlwZSA9PT0gJ3dvcmtlcl9yZXBseScpIHtcbiAgICAgICAgICAgICAgICAvLyBQYXNzIHRoZSByZXN1bHQgdG8gdGhlIHByb21pc2VcbiAgICAgICAgICAgICAgICBpZiAobWVzc2FnZXNbaWRdKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChkYXRhLmVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlc1tpZF0ucmVqZWN0KGRhdGEuZXJyb3IpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZXNbaWRdLnJlc29sdmUoZGF0YS5tZXNzYWdlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBkZWxldGUgbWVzc2FnZXNbaWRdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIExpc3RlbiBmb3IgbWVzc2FnZXMgaW5pdGlhdGluZyBhIGNhbGwgZnJvbSB0aGUgd29ya2VyLCBkaXNwYXRjaCB0aGVtLFxuICAgICAgICAgICAgLy8gYW5kIHNlbmQgYW55IHJldHVybiB2YWx1ZSBiYWNrIHRvIHRoZSB3b3JrZXJcbiAgICAgICAgICAgIC8vIFVuaXF1ZSBpZCBmb3IgdGhpcyBtZXNzYWdlICYgcmV0dXJuIGNhbGwgdG8gbWFpbiB0aHJlYWRcbiAgICAgICAgICAgIGVsc2UgaWYgKGRhdGEudHlwZSA9PT0gJ3dvcmtlcl9zZW5kJyAmJiBpZCAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgLy8gQ2FsbCB0aGUgcmVxdWVzdGVkIG1ldGhvZCBhbmQgc2F2ZSB0aGUgcmV0dXJuIHZhbHVlXG4gICAgICAgICAgICAgICAgdmFyIFttZXRob2RfbmFtZSwgdGFyZ2V0XSA9IGZpbmRUYXJnZXQoZGF0YS5tZXRob2QpO1xuICAgICAgICAgICAgICAgIGlmICghdGFyZ2V0KSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IEVycm9yKGBXb3JrZXIgYnJva2VyIGNvdWxkIG5vdCBkaXNwYXRjaCBtZXNzYWdlIHR5cGUgJHtkYXRhLm1ldGhvZH0gb24gdGFyZ2V0ICR7ZGF0YS50YXJnZXR9IGJlY2F1c2Ugbm8gb2JqZWN0IHdpdGggdGhhdCBuYW1lIGlzIHJlZ2lzdGVyZWQgb24gbWFpbiB0aHJlYWRgKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICB2YXIgbWV0aG9kID0gKHR5cGVvZiB0YXJnZXRbbWV0aG9kX25hbWVdID09PSAnZnVuY3Rpb24nKSAmJiB0YXJnZXRbbWV0aG9kX25hbWVdO1xuICAgICAgICAgICAgICAgIGlmICghbWV0aG9kKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IEVycm9yKGBXb3JrZXIgYnJva2VyIGNvdWxkIG5vdCBkaXNwYXRjaCBtZXNzYWdlIHR5cGUgJHtkYXRhLm1ldGhvZH0gb24gdGFyZ2V0ICR7ZGF0YS50YXJnZXR9IGJlY2F1c2Ugb2JqZWN0IGhhcyBubyBtZXRob2Qgd2l0aCB0aGF0IG5hbWVgKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICB2YXIgcmVzdWx0LCBlcnJvcjtcbiAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBtZXRob2QuYXBwbHkodGFyZ2V0LCBkYXRhLm1lc3NhZ2UpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjYXRjaChlKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIFRocm93biBlcnJvcnMgd2lsbCBiZSBwYXNzZWQgYmFjayAoaW4gc3RyaW5nIGZvcm0pIHRvIHdvcmtlclxuICAgICAgICAgICAgICAgICAgICBlcnJvciA9IGU7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gU2VuZCByZXR1cm4gdmFsdWUgdG8gd29ya2VyXG4gICAgICAgICAgICAgICAgbGV0IHBheWxvYWQsIHRyYW5zZmVyYWJsZXMgPSBbXTtcblxuICAgICAgICAgICAgICAgIC8vIEFzeW5jIHJlc3VsdFxuICAgICAgICAgICAgICAgIGlmIChyZXN1bHQgaW5zdGFuY2VvZiBQcm9taXNlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdC50aGVuKCh2YWx1ZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgV29ya2VyQnJva2VyLndpdGhUcmFuc2ZlcmFibGVzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNmZXJhYmxlcyA9IHZhbHVlLnRyYW5zZmVyYWJsZXM7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZS52YWx1ZVswXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgcGF5bG9hZCA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAnbWFpbl9yZXBseScsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZV9pZDogaWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogdmFsdWVcbiAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgICAgICBwYXlsb2FkID0gbWF5YmVFbmNvZGUocGF5bG9hZCwgdHJhbnNmZXJhYmxlcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB3b3JrZXIucG9zdE1lc3NhZ2UocGF5bG9hZCwgdHJhbnNmZXJhYmxlcy5tYXAodCA9PiB0Lm9iamVjdCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZnJlZVRyYW5zZmVyYWJsZXModHJhbnNmZXJhYmxlcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodHJhbnNmZXJhYmxlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nKCd0cmFjZScsIGAnJHttZXRob2RfbmFtZX0nIHRyYW5zZmVycmVkICR7dHJhbnNmZXJhYmxlcy5sZW5ndGh9IG9iamVjdHMgdG8gd29ya2VyIHRocmVhZGApO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIH0sIChlcnJvcikgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgd29ya2VyLnBvc3RNZXNzYWdlKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAnbWFpbl9yZXBseScsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZV9pZDogaWQsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3I6IChlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gYCR7ZXJyb3IubWVzc2FnZX06ICR7ZXJyb3Iuc3RhY2t9YCA6IGVycm9yKVxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBJbW1lZGlhdGUgcmVzdWx0XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChyZXN1bHQgaW5zdGFuY2VvZiBXb3JrZXJCcm9rZXIud2l0aFRyYW5zZmVyYWJsZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zZmVyYWJsZXMgPSByZXN1bHQudHJhbnNmZXJhYmxlcztcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdC52YWx1ZVswXTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIHBheWxvYWQgPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAnbWFpbl9yZXBseScsXG4gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlX2lkOiBpZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IHJlc3VsdCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yOiAoZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGAke2Vycm9yLm1lc3NhZ2V9OiAke2Vycm9yLnN0YWNrfWAgOiBlcnJvcilcbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgcGF5bG9hZCA9IG1heWJlRW5jb2RlKHBheWxvYWQsIHRyYW5zZmVyYWJsZXMpO1xuICAgICAgICAgICAgICAgICAgICB3b3JrZXIucG9zdE1lc3NhZ2UocGF5bG9hZCwgdHJhbnNmZXJhYmxlcy5tYXAodCA9PiB0Lm9iamVjdCkpO1xuICAgICAgICAgICAgICAgICAgICBmcmVlVHJhbnNmZXJhYmxlcyh0cmFuc2ZlcmFibGVzKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRyYW5zZmVyYWJsZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbG9nKCd0cmFjZScsIGAnJHttZXRob2RfbmFtZX0nIHRyYW5zZmVycmVkICR7dHJhbnNmZXJhYmxlcy5sZW5ndGh9IG9iamVjdHMgdG8gd29ya2VyIHRocmVhZGApO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgIH07XG5cbiAgICAvLyBFeHBvc2UgZm9yIGRlYnVnZ2luZ1xuICAgIFdvcmtlckJyb2tlci5nZXRNZXNzYWdlcyA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIG1lc3NhZ2VzO1xuICAgIH07XG5cbiAgICBXb3JrZXJCcm9rZXIuZ2V0TWVzc2FnZUlkID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gbWVzc2FnZV9pZDtcbiAgICB9O1xuXG59XG5cbi8vIFdvcmtlciB0aHJlYWRzOlxuLy8gLSBSZWNlaXZlIG1lc3NhZ2VzIGZyb20gbWFpbiB0aHJlYWQsIGFuZCBvcHRpb25hbGx5IHNlbmQgYW4gYXN5bmMgcmVzcG9uc2UgYmFjayBhcyBhIHByb21pc2Vcbi8vIC0gU2VuZCBtZXNzYWdlcyB0byBtYWluIHRocmVhZCwgYW5kIG9wdGlvbmFsbHkgcmVjZWl2ZSBhbiBhc3luYyByZXNwb25zZSBhcyBhIHByb21pc2VcbmZ1bmN0aW9uIHNldHVwV29ya2VyVGhyZWFkICgpIHtcblxuICAgIC8vIFNlbmQgYSBtZXNzYWdlIHRvIHRoZSBtYWluIHRocmVhZCwgYW5kIG9wdGlvbmFsbHkgZ2V0IGFuIGFzeW5jIHJlc3BvbnNlIGFzIGEgcHJvbWlzZVxuICAgIC8vIEFyZ3VtZW50czpcbiAgICAvLyAgIC0gbWV0aG9kOiB0aGUgbWV0aG9kIHdpdGggdGhpcyBuYW1lLCBzcGVjaWZpZWQgd2l0aCBkb3Qtbm90YXRpb24sIHdpbGwgYmUgaW52b2tlZCBvbiB0aGUgbWFpbiB0aHJlYWRcbiAgICAvLyAgIC0gbWVzc2FnZTogYXJyYXkgb2YgYXJndW1lbnRzIHRvIGNhbGwgdGhlIG1ldGhvZCB3aXRoXG4gICAgLy8gUmV0dXJuczpcbiAgICAvLyAgIC0gYSBwcm9taXNlIHRoYXQgd2lsbCBiZSBmdWxmaWxsZWQgaWYgdGhlIG1haW4gdGhyZWFkIG1ldGhvZCByZXR1cm5zIGEgdmFsdWUgKGNvdWxkIGJlIGltbWVkaWF0ZWx5LCBvciBhc3luYylcbiAgICAvL1xuICAgIFdvcmtlckJyb2tlci5wb3N0TWVzc2FnZSA9IGZ1bmN0aW9uIChtZXRob2QsIC4uLm1lc3NhZ2UpIHtcbiAgICAgICAgLy8gVHJhY2sgc3RhdGUgb2YgdGhpcyBtZXNzYWdlXG4gICAgICAgIHZhciBwcm9taXNlID0gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgbWVzc2FnZXNbbWVzc2FnZV9pZF0gPSB7IG1ldGhvZCwgbWVzc2FnZSwgcmVzb2x2ZSwgcmVqZWN0IH07XG4gICAgICAgIH0pO1xuXG4gICAgICAgbGV0IHBheWxvYWQsIHRyYW5zZmVyYWJsZXMgPSBbXTtcblxuICAgICAgICBpZiAobWVzc2FnZSAmJiBtZXNzYWdlLmxlbmd0aCA9PT0gMSAmJiBtZXNzYWdlWzBdIGluc3RhbmNlb2YgV29ya2VyQnJva2VyLndpdGhUcmFuc2ZlcmFibGVzKSB7XG4gICAgICAgICAgICB0cmFuc2ZlcmFibGVzID0gbWVzc2FnZVswXS50cmFuc2ZlcmFibGVzO1xuICAgICAgICAgICAgbWVzc2FnZSA9IG1lc3NhZ2VbMF0udmFsdWU7XG4gICAgICAgIH1cblxuICAgICAgICBwYXlsb2FkID0ge1xuICAgICAgICAgICAgdHlwZTogJ3dvcmtlcl9zZW5kJywgICAgLy8gbWFyayBtZXNzYWdlIGFzIG1ldGhvZCBpbnZvY2F0aW9uIGZyb20gd29ya2VyXG4gICAgICAgICAgICBtZXNzYWdlX2lkLCAgICAgICAgICAgICAvLyB1bmlxdWUgaWQgZm9yIHRoaXMgbWVzc2FnZSwgZm9yIGxpZmUgb2YgcHJvZ3JhbVxuICAgICAgICAgICAgbWV0aG9kLCAgICAgICAgICAgICAgICAgLy8gd2lsbCBkaXNwYXRjaCB0byBhIG1ldGhvZCBvZiB0aGlzIG5hbWUgb24gdGhlIG1haW4gdGhyZWFkXG4gICAgICAgICAgICBtZXNzYWdlICAgICAgICAgICAgICAgICAvLyBtZXNzYWdlIHBheWxvYWRcbiAgICAgICAgfTtcblxuICAgICAgICBwYXlsb2FkID0gbWF5YmVFbmNvZGUocGF5bG9hZCwgdHJhbnNmZXJhYmxlcyk7XG4gICAgICAgIHNlbGYucG9zdE1lc3NhZ2UocGF5bG9hZCwgdHJhbnNmZXJhYmxlcy5tYXAodCA9PiB0Lm9iamVjdCkpO1xuICAgICAgICBmcmVlVHJhbnNmZXJhYmxlcyh0cmFuc2ZlcmFibGVzKTtcbiAgICAgICAgaWYgKHRyYW5zZmVyYWJsZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgbG9nKCd0cmFjZScsIGAnJHttZXRob2R9JyB0cmFuc2ZlcnJlZCAke3RyYW5zZmVyYWJsZXMubGVuZ3RofSBvYmplY3RzIHRvIG1haW4gdGhyZWFkYCk7XG4gICAgICAgIH1cblxuICAgICAgICBtZXNzYWdlX2lkKys7XG4gICAgICAgIHJldHVybiBwcm9taXNlO1xuICAgIH07XG5cbiAgICBzZWxmLmFkZEV2ZW50TGlzdGVuZXIoJ21lc3NhZ2UnLCBmdW5jdGlvbiBXb3JrZXJCcm9rZXJXb3JrZXJUaHJlYWRIYW5kbGVyKGV2ZW50KSB7XG4gICAgICAgIGxldCBkYXRhID0gbWF5YmVEZWNvZGUoZXZlbnQuZGF0YSk7XG4gICAgICAgIGxldCBpZCA9IGRhdGEubWVzc2FnZV9pZDtcblxuICAgICAgICAvLyBMaXN0ZW4gZm9yIG1lc3NhZ2VzIGNvbWluZyBiYWNrIGZyb20gdGhlIG1haW4gdGhyZWFkLCBhbmQgZnVsZmlsbCB0aGF0IG1lc3NhZ2UncyBwcm9taXNlXG4gICAgICAgIGlmIChkYXRhLnR5cGUgPT09ICdtYWluX3JlcGx5Jykge1xuICAgICAgICAgICAgLy8gUGFzcyB0aGUgcmVzdWx0IHRvIHRoZSBwcm9taXNlXG4gICAgICAgICAgICBpZiAobWVzc2FnZXNbaWRdKSB7XG4gICAgICAgICAgICAgICAgaWYgKGRhdGEuZXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZXNbaWRdLnJlamVjdChkYXRhLmVycm9yKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VzW2lkXS5yZXNvbHZlKGRhdGEubWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGRlbGV0ZSBtZXNzYWdlc1tpZF07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gUmVjZWl2ZSBtZXNzYWdlcyBmcm9tIG1haW4gdGhyZWFkLCBkaXNwYXRjaCB0aGVtLCBhbmQgc2VuZCBiYWNrIGEgcmVwbHlcbiAgICAgICAgLy8gVW5pcXVlIGlkIGZvciB0aGlzIG1lc3NhZ2UgJiByZXR1cm4gY2FsbCB0byBtYWluIHRocmVhZFxuICAgICAgICBlbHNlIGlmIChkYXRhLnR5cGUgPT09ICdtYWluX3NlbmQnICYmIGlkICE9IG51bGwpIHtcbiAgICAgICAgICAgIC8vIENhbGwgdGhlIHJlcXVlc3RlZCB3b3JrZXIgbWV0aG9kIGFuZCBzYXZlIHRoZSByZXR1cm4gdmFsdWVcbiAgICAgICAgICAgIHZhciBbbWV0aG9kX25hbWUsIHRhcmdldF0gPSBmaW5kVGFyZ2V0KGRhdGEubWV0aG9kKTtcbiAgICAgICAgICAgIGlmICghdGFyZ2V0KSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgRXJyb3IoYFdvcmtlciBicm9rZXIgY291bGQgbm90IGRpc3BhdGNoIG1lc3NhZ2UgdHlwZSAke2RhdGEubWV0aG9kfSBvbiB0YXJnZXQgJHtkYXRhLnRhcmdldH0gYmVjYXVzZSBubyBvYmplY3Qgd2l0aCB0aGF0IG5hbWUgaXMgcmVnaXN0ZXJlZCBvbiBtYWluIHRocmVhZGApO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB2YXIgbWV0aG9kID0gKHR5cGVvZiB0YXJnZXRbbWV0aG9kX25hbWVdID09PSAnZnVuY3Rpb24nKSAmJiB0YXJnZXRbbWV0aG9kX25hbWVdO1xuXG4gICAgICAgICAgICBpZiAoIW1ldGhvZCkge1xuICAgICAgICAgICAgICAgIHRocm93IEVycm9yKGBXb3JrZXIgYnJva2VyIGNvdWxkIG5vdCBkaXNwYXRjaCBtZXNzYWdlIHR5cGUgJHtkYXRhLm1ldGhvZH0gYmVjYXVzZSB3b3JrZXIgaGFzIG5vIG1ldGhvZCB3aXRoIHRoYXQgbmFtZWApO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB2YXIgcmVzdWx0LCBlcnJvcjtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0ID0gbWV0aG9kLmFwcGx5KHRhcmdldCwgZGF0YS5tZXNzYWdlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoKGUpIHtcbiAgICAgICAgICAgICAgICAvLyBUaHJvd24gZXJyb3JzIHdpbGwgYmUgcGFzc2VkIGJhY2sgKGluIHN0cmluZyBmb3JtKSB0byBtYWluIHRocmVhZFxuICAgICAgICAgICAgICAgIGVycm9yID0gZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gU2VuZCByZXR1cm4gdmFsdWUgdG8gbWFpbiB0aHJlYWRcbiAgICAgICAgICAgIGxldCBwYXlsb2FkLCB0cmFuc2ZlcmFibGVzID0gW107XG5cbiAgICAgICAgICAgIC8vIEFzeW5jIHJlc3VsdFxuICAgICAgICAgICAgaWYgKHJlc3VsdCBpbnN0YW5jZW9mIFByb21pc2UpIHtcbiAgICAgICAgICAgICAgICByZXN1bHQudGhlbigodmFsdWUpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgV29ya2VyQnJva2VyLndpdGhUcmFuc2ZlcmFibGVzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2ZlcmFibGVzID0gdmFsdWUudHJhbnNmZXJhYmxlcztcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gdmFsdWUudmFsdWVbMF07XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBwYXlsb2FkID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ3dvcmtlcl9yZXBseScsXG4gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlX2lkOiBpZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2U6IHZhbHVlXG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgIHBheWxvYWQgPSBtYXliZUVuY29kZShwYXlsb2FkLCB0cmFuc2ZlcmFibGVzKTtcbiAgICAgICAgICAgICAgICAgICAgc2VsZi5wb3N0TWVzc2FnZShwYXlsb2FkLCB0cmFuc2ZlcmFibGVzLm1hcCh0ID0+IHQub2JqZWN0KSk7XG4gICAgICAgICAgICAgICAgICAgIGZyZWVUcmFuc2ZlcmFibGVzKHRyYW5zZmVyYWJsZXMpO1xuICAgICAgICAgICAgICAgICAgICBpZiAodHJhbnNmZXJhYmxlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsb2coJ3RyYWNlJywgYCcke21ldGhvZF9uYW1lfScgdHJhbnNmZXJyZWQgJHt0cmFuc2ZlcmFibGVzLmxlbmd0aH0gb2JqZWN0cyB0byBtYWluIHRocmVhZGApO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSwgKGVycm9yKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHNlbGYucG9zdE1lc3NhZ2Uoe1xuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ3dvcmtlcl9yZXBseScsXG4gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlX2lkOiBpZCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yOiAoZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGAke2Vycm9yLm1lc3NhZ2V9OiAke2Vycm9yLnN0YWNrfWAgOiBlcnJvcilcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBJbW1lZGlhdGUgcmVzdWx0XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBpZiAocmVzdWx0IGluc3RhbmNlb2YgV29ya2VyQnJva2VyLndpdGhUcmFuc2ZlcmFibGVzKSB7XG4gICAgICAgICAgICAgICAgICAgIHRyYW5zZmVyYWJsZXMgPSByZXN1bHQudHJhbnNmZXJhYmxlcztcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0LnZhbHVlWzBdO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHBheWxvYWQgPSB7XG4gICAgICAgICAgICAgICAgICAgIHR5cGU6ICd3b3JrZXJfcmVwbHknLFxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlX2lkOiBpZCxcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogcmVzdWx0LFxuICAgICAgICAgICAgICAgICAgICBlcnJvcjogKGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBgJHtlcnJvci5tZXNzYWdlfTogJHtlcnJvci5zdGFja31gIDogZXJyb3IpXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBwYXlsb2FkID0gbWF5YmVFbmNvZGUocGF5bG9hZCwgdHJhbnNmZXJhYmxlcyk7XG4gICAgICAgICAgICAgICAgc2VsZi5wb3N0TWVzc2FnZShwYXlsb2FkLCB0cmFuc2ZlcmFibGVzLm1hcCh0ID0+IHQub2JqZWN0KSk7XG4gICAgICAgICAgICAgICAgZnJlZVRyYW5zZmVyYWJsZXModHJhbnNmZXJhYmxlcyk7XG4gICAgICAgICAgICAgICAgaWYgKHRyYW5zZmVyYWJsZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgICAgICBsb2coJ3RyYWNlJywgYCcke21ldGhvZF9uYW1lfScgdHJhbnNmZXJyZWQgJHt0cmFuc2ZlcmFibGVzLmxlbmd0aH0gb2JqZWN0cyB0byBtYWluIHRocmVhZGApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0pO1xuXG59XG5cbi8vIFNwZWNpYWwgdmFsdWUgd3JhcHBlciwgdG8gaW5kaWNhdGUgdGhhdCB3ZSB3YW50IHRvIGZpbmQgYW5kIGluY2x1ZGUgdHJhbnNmZXJhYmxlIG9iamVjdHMgaW4gdGhlIG1lc3NhZ2VcbldvcmtlckJyb2tlci53aXRoVHJhbnNmZXJhYmxlcyA9IGZ1bmN0aW9uICguLi52YWx1ZSkge1xuICAgIGlmICghKHRoaXMgaW5zdGFuY2VvZiBXb3JrZXJCcm9rZXIud2l0aFRyYW5zZmVyYWJsZXMpKSB7XG4gICAgICAgIHJldHVybiBuZXcgV29ya2VyQnJva2VyLndpdGhUcmFuc2ZlcmFibGVzKC4uLnZhbHVlKTtcbiAgICB9XG5cbiAgICB0aGlzLnZhbHVlID0gdmFsdWU7XG4gICAgdGhpcy50cmFuc2ZlcmFibGVzID0gZmluZFRyYW5zZmVyYWJsZXModGhpcy52YWx1ZSk7XG59O1xuXG4vLyBCdWlsZCBhIGxpc3Qgb2YgdHJhbnNmZXJhYmxlIG9iamVjdHMgZnJvbSBhIHNvdXJjZSBvYmplY3Rcbi8vIFJldHVybnMgYSBsaXN0IG9mIGluZm8gYWJvdXQgZWFjaCB0cmFuc2ZlcmFibGU6XG4vLyAgIC0gb2JqZWN0OiB0aGUgYWN0dWFsIHRyYW5zZmVyYWJsZSBvYmplY3Rcbi8vICAgLSBwYXJlbnQ6IHRoZSBwYXJlbnQgb2JqZWN0IHRoYXQgdGhlIHRyYW5zZmVyYWJsZSBpcyBhIHByb3BlcnR5IG9mIChpZiBhbnkpXG4vLyAgIC0gcHJvcGVydHk6IHRoZSBwcm9wZXJ0eSBuYW1lIG9mIHRoZSB0cmFuc2ZlcmFibGUgb24gdGhlIHBhcmVudCBvYmplY3QgKGlmIGFueSlcbi8vIFRPRE86IGFkZCBvcHRpb24gaW4gY2FzZSB5b3UgRE9OJ1Qgd2FudCB0byB0cmFuc2ZlciBvYmplY3RzXG5mdW5jdGlvbiBmaW5kVHJhbnNmZXJhYmxlcyhzb3VyY2UsIHBhcmVudCA9IG51bGwsIHByb3BlcnR5ID0gbnVsbCwgbGlzdCA9IFtdKSB7XG4gICAgaWYgKCFzb3VyY2UpIHtcbiAgICAgICAgIHJldHVybiBsaXN0O1xuICAgIH1cblxuICAgIGlmIChBcnJheS5pc0FycmF5KHNvdXJjZSkpIHtcbiAgICAgICAgLy8gQ2hlY2sgZWFjaCBhcnJheSBlbGVtZW50XG4gICAgICAgIHNvdXJjZS5mb3JFYWNoKCh4LCBpKSA9PiBmaW5kVHJhbnNmZXJhYmxlcyh4LCBzb3VyY2UsIGksIGxpc3QpKTtcbiAgICB9XG4gICAgZWxzZSBpZiAodHlwZW9mIHNvdXJjZSA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgLy8gSXMgdGhlIG9iamVjdCBhIHRyYW5zZmVyYWJsZSBhcnJheSBidWZmZXI/XG4gICAgICAgIGlmIChzb3VyY2UgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcikge1xuICAgICAgICAgICAgbGlzdC5wdXNoKHsgb2JqZWN0OiBzb3VyY2UsIHBhcmVudCwgcHJvcGVydHkgfSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gT3IgbG9va3MgbGlrZSBhIHR5cGVkIGFycmF5IChoYXMgYW4gYXJyYXkgYnVmZmVyIHByb3BlcnR5KT9cbiAgICAgICAgZWxzZSBpZiAoc291cmNlLmJ1ZmZlciBpbnN0YW5jZW9mIEFycmF5QnVmZmVyKSB7XG4gICAgICAgICAgICBsaXN0LnB1c2goeyBvYmplY3Q6IHNvdXJjZS5idWZmZXIsIHBhcmVudCwgcHJvcGVydHkgfSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gT3RoZXJ3aXNlIGNoZWNrIGVhY2ggcHJvcGVydHlcbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBmb3IgKGxldCBwcm9wIGluIHNvdXJjZSkge1xuICAgICAgICAgICAgICAgIGZpbmRUcmFuc2ZlcmFibGVzKHNvdXJjZVtwcm9wXSwgc291cmNlLCBwcm9wLCBsaXN0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbGlzdDtcbn1cblxuLy8gUmVtb3ZlIG5ldXRlcmVkIHRyYW5zZmVyYWJsZXMgZnJvbSBwYXJlbnQgb2JqZWN0cywgYXMgdGhleSBzaG91bGQgbm8gbG9uZ2VyIGJlIGFjY2Vzc2VkIGFmdGVyIHRyYW5zZmVyXG5mdW5jdGlvbiBmcmVlVHJhbnNmZXJhYmxlcyh0cmFuc2ZlcmFibGVzKSB7XG4gICAgaWYgKCFBcnJheS5pc0FycmF5KHRyYW5zZmVyYWJsZXMpKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdHJhbnNmZXJhYmxlcy5maWx0ZXIodCA9PiB0LnBhcmVudCAmJiB0LnByb3BlcnR5KS5mb3JFYWNoKHQgPT4gZGVsZXRlIHQucGFyZW50W3QucHJvcGVydHldKTtcbn1cblxuLy8gTWVzc2FnZSBwYXlsb2FkIGNhbiBiZSBzdHJpbmdpZmllZCBmb3IgZmFzdGVyIHRyYW5zZmVyLCBpZiBpdCBkb2VzIG5vdCBpbmNsdWRlIHRyYW5zZmVyYWJsZSBvYmplY3RzXG5mdW5jdGlvbiBtYXliZUVuY29kZSAocGF5bG9hZCwgdHJhbnNmZXJhYmxlcykge1xuICAgIGlmICh0cmFuc2ZlcmFibGVzLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICBwYXlsb2FkID0gSlNPTi5zdHJpbmdpZnkocGF5bG9hZCk7XG4gICAgfVxuICAgIHJldHVybiBwYXlsb2FkO1xufVxuXG4vLyBQYXJzZSBzdHJpbmdpZmllZCBtZXNzYWdlIHBheWxvYWRcbmZ1bmN0aW9uIG1heWJlRGVjb2RlIChkYXRhKSB7XG4gICAgcmV0dXJuICh0eXBlb2YgZGF0YSA9PT0gJ3N0cmluZycgPyBKU09OLnBhcnNlKGRhdGEpIDogZGF0YSk7XG59XG5cbi8vIFNldHVwIHRoaXMgdGhyZWFkIGFzIGFwcHJvcHJpYXRlXG5pZiAoVGhyZWFkLmlzX21haW4pIHtcbiAgICBzZXR1cE1haW5UaHJlYWQoKTtcbn1cblxuaWYgKFRocmVhZC5pc193b3JrZXIpIHtcbiAgICBzZXR1cFdvcmtlclRocmVhZCgpO1xufVxuIiwiLyoqKiBWZWN0b3IgZnVuY3Rpb25zIC0gdmVjdG9ycyBwcm92aWRlZCBhcyBbeCwgeSwgel0gYXJyYXlzICoqKi9cblxudmFyIFZlY3RvcjtcbmV4cG9ydCBkZWZhdWx0IFZlY3RvciA9IHt9O1xuXG5WZWN0b3Iuc2V0ID0gZnVuY3Rpb24gKHYpIHtcbiAgICB2YXIgViA9IFtdO1xuICAgIHZhciBsaW0gPSB2Lmxlbmd0aDtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxpbTsgaSsrKSB7XG4gICAgICAgIFZbaV0gPSB2W2ldO1xuICAgIH1cbiAgICByZXR1cm4gVjtcbn07XG5cblZlY3Rvci5uZWcgPSBmdW5jdGlvbiAodikge1xuICAgIHZhciBWID0gW107XG4gICAgdmFyIGxpbSA9IHYubGVuZ3RoO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGltOyBpKyspIHtcbiAgICAgICAgVltpXSA9IHZbaV0gKiAtMTtcbiAgICB9XG4gICAgcmV0dXJuIFY7XG59O1xuXG4vLyBBZGRpdGlvbiBvZiB0d28gdmVjdG9yc1xuVmVjdG9yLmFkZCA9IGZ1bmN0aW9uICh2MSwgdjIpIHtcbiAgICB2YXIgdiA9IFtdO1xuICAgIHZhciBsaW0gPSBNYXRoLm1pbih2MS5sZW5ndGgsdjIubGVuZ3RoKTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxpbTsgaSsrKSB7XG4gICAgICAgIHZbaV0gPSB2MVtpXSArIHYyW2ldO1xuICAgIH1cbiAgICByZXR1cm4gdjtcbn07XG5cbi8vIFN1YnN0cmFjdGlvbiBvZiB0d28gdmVjdG9yc1xuVmVjdG9yLnN1YiA9IGZ1bmN0aW9uICh2MSwgdjIpIHtcbiAgICB2YXIgdiA9IFtdO1xuICAgIHZhciBsaW0gPSBNYXRoLm1pbih2MS5sZW5ndGgsdjIubGVuZ3RoKTtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGltOyBpKyspIHtcbiAgICAgICAgdltpXSA9IHYxW2ldIC0gdjJbaV07XG4gICAgfVxuICAgIHJldHVybiB2O1xufTtcblxuVmVjdG9yLnNpZ25lZF9hcmVhID0gZnVuY3Rpb24gKHYxLCB2MiwgdjMpIHtcbiAgICByZXR1cm4gKHYyWzBdLXYxWzBdKSoodjNbMV0tdjFbMV0pIC0gKHYzWzBdLXYxWzBdKSoodjJbMV0tdjFbMV0pO1xufTtcblxuLy8gTXVsdGlwbGljYXRpb24gb2YgdHdvIHZlY3RvcnNcblZlY3Rvci5tdWx0ID0gZnVuY3Rpb24gKHYxLCB2Mikge1xuICAgIHZhciB2ID0gW10sXG4gICAgICAgIGxlbiA9IHYxLmxlbmd0aCxcbiAgICAgICAgaTtcblxuICAgIGlmICh0eXBlb2YgdjIgPT09ICdudW1iZXInKSB7XG4gICAgICAgIC8vIE11bGl0cGx5IGJ5IHNjYWxhclxuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgICAgIHZbaV0gPSB2MVtpXSAqIHYyO1xuICAgICAgICB9XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICAvLyBNdWx0aXBseSB0d28gdmVjdG9yc1xuICAgICAgICBsZW4gPSBNYXRoLm1pbih2MS5sZW5ndGgsdjIubGVuZ3RoKTtcbiAgICAgICAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgICAgICB2W2ldID0gdjFbaV0gKiB2MltpXTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdjtcbn07XG5cbi8vIERpdmlzaW9uIG9mIHR3byB2ZWN0b3JzXG5WZWN0b3IuZGl2ID0gZnVuY3Rpb24gKHYxLCB2Mikge1xuICAgIHZhciB2ID0gW10sXG4gICAgICAgIGk7XG4gICAgaWYodHlwZW9mIHYyID09PSAnbnVtYmVyJyl7XG4gICAgICAgIC8vIERpdmlkZSBieSBzY2FsYXJcbiAgICAgICAgZm9yIChpID0gMDsgaSA8IHYxLmxlbmd0aDsgaSsrKXtcbiAgICAgICAgICAgIHZbaV0gPSB2MVtpXSAvIHYyO1xuICAgICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgICAgLy8gRGl2aWRlIHRvIHZlY3RvcnNcbiAgICAgICAgdmFyIGxlbiA9IE1hdGgubWluKHYxLmxlbmd0aCx2Mi5sZW5ndGgpO1xuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgICAgIHZbaV0gPSB2MVtpXSAvIHYyW2ldO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiB2O1xufTtcblxuLy8gR2V0IDJEIHBlcnBlbmRpY3VsYXJcblZlY3Rvci5wZXJwID0gZnVuY3Rpb24gKHYxLCB2Mikge1xuICAgIHJldHVybiBbIHYyWzFdIC0gdjFbMV0sXG4gICAgICAgICAgICAgdjFbMF0gLSB2MlswXSBdO1xufTtcblxuLy8gR2V0IDJEIHZlY3RvciByb3RhdGVkXG5WZWN0b3Iucm90ID0gZnVuY3Rpb24gKHYsIGEpIHtcbiAgICB2YXIgYyA9IE1hdGguY29zKGEpO1xuICAgIHZhciBzID0gTWF0aC5zaW4oYSk7XG4gICAgcmV0dXJuIFt2WzBdICogYyAtIHZbMV0gKiBzLFxuICAgICAgICAgICAgdlswXSAqIHMgKyB2WzFdICogY107XG59O1xuXG4vLyBHZXQgMkQgaGVhZGluZyBhbmdsZVxuVmVjdG9yLmFuZ2xlID0gZnVuY3Rpb24gKFt4LCB5XSkge1xuICAgIHJldHVybiBNYXRoLmF0YW4yKHkseCk7XG59O1xuXG4vLyBHZXQgYW5nbGUgYmV0d2VlbiB0d28gdmVjdG9yc1xuVmVjdG9yLmFuZ2xlQmV0d2VlbiA9IGZ1bmN0aW9uKEEsIEIpe1xuICAgIHZhciBkZWx0YSA9IFZlY3Rvci5kb3QoQSwgQik7XG4gICAgaWYgKGRlbHRhIDwgLTEpIHtcbiAgICAgICAgZGVsdGEgPSAtMTtcbiAgICB9XG4gICAgcmV0dXJuIE1hdGguYWNvcyhkZWx0YSk7XG59O1xuXG4vLyBDb21wYXJlIHR3byBwb2ludHNcblZlY3Rvci5pc0VxdWFsID0gZnVuY3Rpb24gKHYxLCB2Mikge1xuICAgIHZhciBsZW4gPSB2MS5sZW5ndGg7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47IGkrKykge1xuICAgICAgICBpZiAodjFbaV0gIT09IHYyW2ldKXtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbn07XG5cbi8vIFZlY3RvciBsZW5ndGggc3F1YXJlZFxuVmVjdG9yLmxlbmd0aFNxID0gZnVuY3Rpb24gKHYpIHtcbiAgICBpZiAodi5sZW5ndGggPT09IDIpIHtcbiAgICAgICAgcmV0dXJuICh2WzBdKnZbMF0gKyB2WzFdKnZbMV0pO1xuICAgIH1cbiAgICBlbHNlIGlmICh2Lmxlbmd0aCA+PSAzKSB7XG4gICAgICAgIHJldHVybiAodlswXSp2WzBdICsgdlsxXSp2WzFdICsgdlsyXSp2WzJdKTtcbiAgICB9XG4gICAgcmV0dXJuIDA7XG59O1xuXG4vLyBWZWN0b3IgbGVuZ3RoXG5WZWN0b3IubGVuZ3RoID0gZnVuY3Rpb24gKHYpIHtcbiAgICByZXR1cm4gTWF0aC5zcXJ0KFZlY3Rvci5sZW5ndGhTcSh2KSk7XG59O1xuXG4vLyBOb3JtYWxpemUgYSB2ZWN0b3JcblZlY3Rvci5ub3JtYWxpemUgPSBmdW5jdGlvbiAodikge1xuICAgIHZhciBkO1xuICAgIGlmICh2Lmxlbmd0aCA9PT0gMikge1xuICAgICAgICBkID0gdlswXSp2WzBdICsgdlsxXSp2WzFdO1xuICAgICAgICBkID0gTWF0aC5zcXJ0KGQpO1xuXG4gICAgICAgIGlmIChkICE9PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gW3ZbMF0gLyBkLCB2WzFdIC8gZF07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFswLCAwXTtcbiAgICB9IGVsc2UgaWYgKHYubGVuZ3RoID49IDMpIHtcbiAgICAgICAgZCA9IHZbMF0qdlswXSArIHZbMV0qdlsxXSArIHZbMl0qdlsyXTtcbiAgICAgICAgZCA9IE1hdGguc3FydChkKTtcblxuICAgICAgICBpZiAoZCAhPT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIFt2WzBdIC8gZCwgdlsxXSAvIGQsIHZbMl0gLyBkXTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gWzAsIDAsIDBdO1xufTtcblxuLy8gQ3Jvc3MgcHJvZHVjdCBvZiB0d28gdmVjdG9yc1xuVmVjdG9yLmNyb3NzICA9IGZ1bmN0aW9uICh2MSwgdjIpIHtcbiAgICByZXR1cm4gW1xuICAgICAgICAodjFbMV0gKiB2MlsyXSkgLSAodjFbMl0gKiB2MlsxXSksXG4gICAgICAgICh2MVsyXSAqIHYyWzBdKSAtICh2MVswXSAqIHYyWzJdKSxcbiAgICAgICAgKHYxWzBdICogdjJbMV0pIC0gKHYxWzFdICogdjJbMF0pXG4gICAgXTtcbn07XG5cbi8vIERvdCBwcm9kdWN0IG9mIHR3byB2ZWN0b3JzXG5WZWN0b3IuZG90ID0gZnVuY3Rpb24gKHYxLCB2Mikge1xuICAgIHZhciBuID0gMDtcbiAgICB2YXIgbGltID0gTWF0aC5taW4odjEubGVuZ3RoLCB2Mi5sZW5ndGgpO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGltOyBpKyspIHtcbiAgICAgICAgbiArPSB2MVtpXSAqIHYyW2ldO1xuICAgIH1cbiAgICByZXR1cm4gbjtcbn07XG4iLCJpbXBvcnQgR2VvIGZyb20gJy4vZ2VvJztcbmltcG9ydCBUaWxlIGZyb20gJy4vdGlsZSc7XG5pbXBvcnQgQ2FtZXJhIGZyb20gJy4vY2FtZXJhJztcbmltcG9ydCBVdGlscyBmcm9tICcuL3V0aWxzL3V0aWxzJztcbmltcG9ydCBzdWJzY3JpYmVNaXhpbiBmcm9tICcuL3V0aWxzL3N1YnNjcmliZSc7XG5pbXBvcnQgbG9nIGZyb20gJy4vdXRpbHMvbG9nJztcblxuZXhwb3J0IGNvbnN0IFZJRVdfUEFOX1NOQVBfVElNRSA9IDAuNTtcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVmlldyB7XG5cbiAgICBjb25zdHJ1Y3RvciAoc2NlbmUsIG9wdGlvbnMpIHtcbiAgICAgICAgc3Vic2NyaWJlTWl4aW4odGhpcyk7XG5cbiAgICAgICAgdGhpcy5zY2VuZSA9IHNjZW5lO1xuICAgICAgICB0aGlzLmNyZWF0ZU1hdHJpY2VzKCk7XG5cbiAgICAgICAgdGhpcy56b29tID0gbnVsbDtcbiAgICAgICAgdGhpcy5jZW50ZXIgPSBudWxsO1xuICAgICAgICB0aGlzLmJvdW5kcyA9IG51bGw7XG4gICAgICAgIHRoaXMubWV0ZXJzX3Blcl9waXhlbCA9IG51bGw7XG5cbiAgICAgICAgdGhpcy5wYW5uaW5nID0gZmFsc2U7XG4gICAgICAgIHRoaXMucGFubmluZ19zdG9wX2F0ID0gMDtcbiAgICAgICAgdGhpcy5wYW5fc25hcF90aW1lciA9IDA7XG4gICAgICAgIHRoaXMuem9vbWluZyA9IGZhbHNlO1xuICAgICAgICB0aGlzLnpvb21fZGlyZWN0aW9uID0gMDtcblxuICAgICAgICAvLyBTaXplIG9mIHZpZXdwb3J0IGluIENTUyBwaXhlbHMsIGRldmljZSBwaXhlbHMsIGFuZCBtZXJjYXRvciBtZXRlcnNcbiAgICAgICAgdGhpcy5zaXplID0ge1xuICAgICAgICAgICAgY3NzOiB7fSxcbiAgICAgICAgICAgIGRldmljZToge30sXG4gICAgICAgICAgICBtZXRlcnM6IHt9XG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuYXNwZWN0ID0gbnVsbDtcblxuICAgICAgICB0aGlzLmJ1ZmZlciA9IDA7XG4gICAgICAgIHRoaXMuY29udGludW91c196b29tID0gKHR5cGVvZiBvcHRpb25zLmNvbnRpbnVvdXNab29tID09PSAnYm9vbGVhbicpID8gb3B0aW9ucy5jb250aW51b3VzWm9vbSA6IHRydWU7XG4gICAgICAgIHRoaXMudGlsZV9zaW1wbGlmaWNhdGlvbl9sZXZlbCA9IDA7IC8vIGxldmVsLW9mLWRldGFpbCBkb3duc2FtcGxpbmcgdG8gYXBwbHkgdG8gdGlsZSBsb2FkaW5nXG4gICAgICAgIHRoaXMucHJlc2VydmVfdGlsZXNfd2l0aGluX3pvb20gPSAxO1xuXG4gICAgICAgIHRoaXMucmVzZXQoKTtcbiAgICB9XG5cbiAgICAvLyBSZXNldCBzdGF0ZSBiZWZvcmUgc2NlbmUgY29uZmlnIGlzIHVwZGF0ZWRcbiAgICByZXNldCAoKSB7XG4gICAgICAgIHRoaXMuY3JlYXRlQ2FtZXJhKCk7XG4gICAgfVxuXG4gICAgLy8gQ3JlYXRlIGNhbWVyYVxuICAgIGNyZWF0ZUNhbWVyYSAoKSB7XG4gICAgICAgIGxldCBhY3RpdmVfY2FtZXJhID0gdGhpcy5nZXRBY3RpdmVDYW1lcmEoKTtcbiAgICAgICAgaWYgKGFjdGl2ZV9jYW1lcmEpIHtcbiAgICAgICAgICAgIHRoaXMuY2FtZXJhID0gQ2FtZXJhLmNyZWF0ZShhY3RpdmVfY2FtZXJhLCB0aGlzLCB0aGlzLnNjZW5lLmNvbmZpZy5jYW1lcmFzW2FjdGl2ZV9jYW1lcmFdKTtcbiAgICAgICAgICAgIHRoaXMuY2FtZXJhLnVwZGF0ZVZpZXcoKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIEdldCBhY3RpdmUgY2FtZXJhIC0gZm9yIHB1YmxpYyBBUElcbiAgICBnZXRBY3RpdmVDYW1lcmEgKCkge1xuICAgICAgICBpZiAodGhpcy5zY2VuZS5jb25maWcgJiYgdGhpcy5zY2VuZS5jb25maWcuY2FtZXJhcykge1xuICAgICAgICAgICAgZm9yIChsZXQgbmFtZSBpbiB0aGlzLnNjZW5lLmNvbmZpZy5jYW1lcmFzKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuc2NlbmUuY29uZmlnLmNhbWVyYXNbbmFtZV0uYWN0aXZlKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBuYW1lO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gSWYgbm8gY2FtZXJhIHNldCBhcyBhY3RpdmUsIHVzZSBmaXJzdCBvbmVcbiAgICAgICAgICAgIGxldCBrZXlzID0gT2JqZWN0LmtleXModGhpcy5zY2VuZS5jb25maWcuY2FtZXJhcyk7XG4gICAgICAgICAgICByZXR1cm4ga2V5cy5sZW5ndGggJiYga2V5c1swXTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIFNldCBhY3RpdmUgY2FtZXJhIGFuZCByZWNvbXBpbGUgLSBmb3IgcHVibGljIEFQSVxuICAgIHNldEFjdGl2ZUNhbWVyYSAobmFtZSkge1xuICAgICAgICBsZXQgcHJldiA9IHRoaXMuZ2V0QWN0aXZlQ2FtZXJhKCk7XG4gICAgICAgIGlmICh0aGlzLnNjZW5lLmNvbmZpZy5jYW1lcmFzW25hbWVdKSB7XG4gICAgICAgICAgICB0aGlzLnNjZW5lLmNvbmZpZy5jYW1lcmFzW25hbWVdLmFjdGl2ZSA9IHRydWU7XG5cbiAgICAgICAgICAgIC8vIENsZWFyIHByZXZpb3VzbHkgYWN0aXZlIGNhbWVyYVxuICAgICAgICAgICAgaWYgKHByZXYgJiYgcHJldiAhPT0gbmFtZSAmJiB0aGlzLnNjZW5lLmNvbmZpZy5jYW1lcmFzW3ByZXZdKSB7XG4gICAgICAgICAgICAgICAgZGVsZXRlIHRoaXMuc2NlbmUuY29uZmlnLmNhbWVyYXNbcHJldl0uYWN0aXZlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5zY2VuZS51cGRhdGVDb25maWcoeyByZWJ1aWxkOiBmYWxzZSB9KTtcbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0QWN0aXZlQ2FtZXJhKCk7XG4gICAgfVxuXG4gICAgLy8gVXBkYXRlIG1ldGhvZCBjYWxsZWQgb25jZSBwZXIgZnJhbWVcbiAgICB1cGRhdGUgKCkge1xuICAgICAgICB0aGlzLmNhbWVyYS51cGRhdGUoKTtcbiAgICAgICAgdGhpcy5wYW5fc25hcF90aW1lciA9ICgoK25ldyBEYXRlKCkpIC0gdGhpcy5wYW5uaW5nX3N0b3BfYXQpIC8gMTAwMDtcbiAgICB9XG5cbiAgICAvLyBTZXQgbG9naWNhbCBwaXhlbCBzaXplIG9mIHZpZXdwb3J0XG4gICAgc2V0Vmlld3BvcnRTaXplICh3aWR0aCwgaGVpZ2h0KSB7XG4gICAgICAgIHRoaXMuc2l6ZS5jc3MgPSB7IHdpZHRoLCBoZWlnaHQgfTtcbiAgICAgICAgdGhpcy5zaXplLmRldmljZSA9IHtcbiAgICAgICAgICAgIHdpZHRoOiBNYXRoLnJvdW5kKHRoaXMuc2l6ZS5jc3Mud2lkdGggKiBVdGlscy5kZXZpY2VfcGl4ZWxfcmF0aW8pLFxuICAgICAgICAgICAgaGVpZ2h0OiBNYXRoLnJvdW5kKHRoaXMuc2l6ZS5jc3MuaGVpZ2h0ICogVXRpbHMuZGV2aWNlX3BpeGVsX3JhdGlvKVxuICAgICAgICB9O1xuICAgICAgICB0aGlzLmFzcGVjdCA9IHRoaXMuc2l6ZS5jc3Mud2lkdGggLyB0aGlzLnNpemUuY3NzLmhlaWdodDtcbiAgICAgICAgdGhpcy51cGRhdGVCb3VuZHMoKTtcbiAgICB9XG5cbiAgICAvLyBTZXQgdGhlIG1hcCB2aWV3LCBjYW4gYmUgcGFzc2VkIGFuIG9iamVjdCB3aXRoIGxhdC9sbmcgYW5kL29yIHpvb21cbiAgICBzZXRWaWV3ICh7IGxuZywgbGF0LCB6b29tIH0gPSB7fSkge1xuICAgICAgICB2YXIgY2hhbmdlZCA9IGZhbHNlO1xuXG4gICAgICAgIC8vIFNldCBjZW50ZXJcbiAgICAgICAgaWYgKHR5cGVvZiBsbmcgPT09ICdudW1iZXInICYmIHR5cGVvZiBsYXQgPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgICBpZiAoIXRoaXMuY2VudGVyIHx8IGxuZyAhPT0gdGhpcy5jZW50ZXIubG5nIHx8IGxhdCAhPT0gdGhpcy5jZW50ZXIubGF0KSB7XG4gICAgICAgICAgICAgICAgY2hhbmdlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgdGhpcy5jZW50ZXIgPSB7IGxuZzogR2VvLndyYXBMbmcobG5nKSwgbGF0IH07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBTZXQgem9vbVxuICAgICAgICBpZiAodHlwZW9mIHpvb20gPT09ICdudW1iZXInICYmIHpvb20gIT09IHRoaXMuem9vbSkge1xuICAgICAgICAgICAgY2hhbmdlZCA9IHRydWU7XG4gICAgICAgICAgICB0aGlzLnNldFpvb20oem9vbSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY2hhbmdlZCkge1xuICAgICAgICAgICAgdGhpcy51cGRhdGVCb3VuZHMoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gY2hhbmdlZDtcbiAgICB9XG5cbiAgICBzZXRab29tICh6b29tKSB7XG4gICAgICAgIGlmICh0aGlzLnpvb21pbmcpIHtcbiAgICAgICAgICAgIHRoaXMuem9vbWluZyA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5sYXN0X3pvb20gPSB0aGlzLnpvb207XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgbGFzdF90aWxlX3pvb20gPSB0aGlzLnRpbGVfem9vbTtcbiAgICAgICAgbGV0IHRpbGVfem9vbSA9IHRoaXMudGlsZVpvb20oem9vbSk7XG4gICAgICAgIGlmICghdGhpcy5jb250aW51b3VzX3pvb20pIHtcbiAgICAgICAgICAgIHpvb20gPSB0aWxlX3pvb207XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGlsZV96b29tICE9PSBsYXN0X3RpbGVfem9vbSkge1xuICAgICAgICAgICAgdGhpcy56b29tX2RpcmVjdGlvbiA9IHRpbGVfem9vbSA+IGxhc3RfdGlsZV96b29tID8gMSA6IC0xO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5sYXN0X3pvb20gPSB0aGlzLnpvb207XG4gICAgICAgIHRoaXMuem9vbSA9IHpvb207XG4gICAgICAgIHRoaXMudGlsZV96b29tID0gdGlsZV96b29tO1xuXG4gICAgICAgIHRoaXMudXBkYXRlQm91bmRzKCk7XG4gICAgICAgIHRoaXMuc2NlbmUucmVxdWVzdFJlZHJhdygpO1xuICAgIH1cblxuICAgIHN0YXJ0Wm9vbSAoKSB7XG4gICAgICAgIHRoaXMubGFzdF96b29tID0gdGhpcy56b29tO1xuICAgICAgICB0aGlzLnpvb21pbmcgPSB0cnVlO1xuICAgIH1cblxuICAgIC8vIENob29zZSB0aGUgYmFzZSB6b29tIGxldmVsIHRvIHVzZSBmb3IgYSBnaXZlbiBmcmFjdGlvbmFsIHpvb21cbiAgICBiYXNlWm9vbSAoem9vbSkge1xuICAgICAgICByZXR1cm4gTWF0aC5mbG9vcih6b29tKTtcbiAgICB9XG5cbiAgICAvLyBGb3IgYSBnaXZlbiB2aWV3IHpvb20sIHdoYXQgdGlsZSB6b29tIHNob3VsZCBiZSBsb2FkZWQ/XG4gICAgdGlsZVpvb20gKHZpZXdfem9vbSkge1xuICAgICAgICByZXR1cm4gdGhpcy5iYXNlWm9vbSh2aWV3X3pvb20pIC0gdGhpcy50aWxlX3NpbXBsaWZpY2F0aW9uX2xldmVsO1xuICAgIH1cblxuICAgIC8vIEZvciBhIGdpdmVuIHRpbGUgem9vbSwgd2hhdCBzdHlsZSB6b29tIHNob3VsZCBiZSB1c2VkP1xuICAgIHN0eWxlWm9vbSAodGlsZV96b29tKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmJhc2Vab29tKHRpbGVfem9vbSkgKyB0aGlzLnRpbGVfc2ltcGxpZmljYXRpb25fbGV2ZWw7XG4gICAgfVxuXG4gICAgc2V0UGFubmluZyAocGFubmluZykge1xuICAgICAgICB0aGlzLnBhbm5pbmcgPSBwYW5uaW5nO1xuICAgICAgICBpZiAoIXRoaXMucGFubmluZykge1xuICAgICAgICAgICAgdGhpcy5wYW5uaW5nX3N0b3BfYXQgPSAoK25ldyBEYXRlKCkpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmVhZHkgKCkge1xuICAgICAgICAvLyBUT0RPOiBiZXR0ZXIgY29uY2VwdCBvZiBcInJlYWRpbmVzc1wiIHN0YXRlP1xuICAgICAgICBpZiAodHlwZW9mIHRoaXMuc2l6ZS5jc3Mud2lkdGggIT09ICdudW1iZXInIHx8XG4gICAgICAgICAgICB0eXBlb2YgdGhpcy5zaXplLmNzcy5oZWlnaHQgIT09ICdudW1iZXInIHx8XG4gICAgICAgICAgICB0aGlzLmNlbnRlciA9PSBudWxsIHx8XG4gICAgICAgICAgICB0eXBlb2YgdGhpcy56b29tICE9PSAnbnVtYmVyJykge1xuICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICAvLyBDYWxjdWxhdGUgdmlld3BvcnQgYm91bmRzIGJhc2VkIG9uIGN1cnJlbnQgY2VudGVyIGFuZCB6b29tXG4gICAgdXBkYXRlQm91bmRzICgpIHtcbiAgICAgICAgaWYgKCF0aGlzLnJlYWR5KCkpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMubWV0ZXJzX3Blcl9waXhlbCA9IEdlby5tZXRlcnNQZXJQaXhlbCh0aGlzLnpvb20pO1xuXG4gICAgICAgIC8vIFNpemUgb2YgdGhlIGhhbGYtdmlld3BvcnQgaW4gbWV0ZXJzIGF0IGN1cnJlbnQgem9vbVxuICAgICAgICB0aGlzLnNpemUubWV0ZXJzID0ge1xuICAgICAgICAgICAgeDogdGhpcy5zaXplLmNzcy53aWR0aCAqIHRoaXMubWV0ZXJzX3Blcl9waXhlbCxcbiAgICAgICAgICAgIHk6IHRoaXMuc2l6ZS5jc3MuaGVpZ2h0ICogdGhpcy5tZXRlcnNfcGVyX3BpeGVsXG4gICAgICAgIH07XG5cbiAgICAgICAgLy8gQ2VudGVyIG9mIHZpZXdwb3J0IGluIG1ldGVycywgYW5kIHRpbGVcbiAgICAgICAgbGV0IFt4LCB5XSA9IEdlby5sYXRMbmdUb01ldGVycyhbdGhpcy5jZW50ZXIubG5nLCB0aGlzLmNlbnRlci5sYXRdKTtcbiAgICAgICAgdGhpcy5jZW50ZXIubWV0ZXJzID0geyB4LCB5IH07XG5cbiAgICAgICAgdGhpcy5jZW50ZXIudGlsZSA9IEdlby50aWxlRm9yTWV0ZXJzKFt0aGlzLmNlbnRlci5tZXRlcnMueCwgdGhpcy5jZW50ZXIubWV0ZXJzLnldLCB0aGlzLnRpbGVfem9vbSk7XG5cbiAgICAgICAgLy8gQm91bmRzIGluIG1ldGVyc1xuICAgICAgICB0aGlzLmJvdW5kcyA9IHtcbiAgICAgICAgICAgIHN3OiB7XG4gICAgICAgICAgICAgICAgeDogdGhpcy5jZW50ZXIubWV0ZXJzLnggLSB0aGlzLnNpemUubWV0ZXJzLnggLyAyLFxuICAgICAgICAgICAgICAgIHk6IHRoaXMuY2VudGVyLm1ldGVycy55IC0gdGhpcy5zaXplLm1ldGVycy55IC8gMlxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG5lOiB7XG4gICAgICAgICAgICAgICAgeDogdGhpcy5jZW50ZXIubWV0ZXJzLnggKyB0aGlzLnNpemUubWV0ZXJzLnggLyAyLFxuICAgICAgICAgICAgICAgIHk6IHRoaXMuY2VudGVyLm1ldGVycy55ICsgdGhpcy5zaXplLm1ldGVycy55IC8gMlxuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuXG4gICAgICAgIHRoaXMuc2NlbmUudGlsZV9tYW5hZ2VyLnVwZGF0ZVRpbGVzRm9yVmlldygpO1xuXG4gICAgICAgIHRoaXMudHJpZ2dlcignbW92ZScpO1xuICAgICAgICB0aGlzLnNjZW5lLnJlcXVlc3RSZWRyYXcoKTsgLy8gVE9ETyBhdXRvbWF0ZSB2aWEgbW92ZSBldmVudD9cbiAgICB9XG5cbiAgICBmaW5kVmlzaWJsZVRpbGVDb29yZGluYXRlcyAoKSB7XG4gICAgICAgIGlmICghdGhpcy5ib3VuZHMpIHtcbiAgICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCB6ID0gdGhpcy50aWxlX3pvb207XG4gICAgICAgIGxldCBzdyA9IEdlby50aWxlRm9yTWV0ZXJzKFt0aGlzLmJvdW5kcy5zdy54LCB0aGlzLmJvdW5kcy5zdy55XSwgeik7XG4gICAgICAgIGxldCBuZSA9IEdlby50aWxlRm9yTWV0ZXJzKFt0aGlzLmJvdW5kcy5uZS54LCB0aGlzLmJvdW5kcy5uZS55XSwgeik7XG5cbiAgICAgICAgbGV0IGNvb3JkcyA9IFtdO1xuICAgICAgICBmb3IgKGxldCB4ID0gc3cueCAtIHRoaXMuYnVmZmVyOyB4IDw9IG5lLnggKyB0aGlzLmJ1ZmZlcjsgeCsrKSB7XG4gICAgICAgICAgICBmb3IgKGxldCB5ID0gbmUueSAtIHRoaXMuYnVmZmVyOyB5IDw9IHN3LnkgKyB0aGlzLmJ1ZmZlcjsgeSsrKSB7XG4gICAgICAgICAgICAgICAgY29vcmRzLnB1c2goVGlsZS5jb29yZCh7IHgsIHksIHogfSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjb29yZHM7XG4gICAgfVxuXG4gICAgLy8gUmVtb3ZlIHRpbGVzIHRvbyBmYXIgb3V0c2lkZSBvZiB2aWV3XG4gICAgcHJ1bmVUaWxlc0ZvclZpZXcgKCkge1xuICAgICAgICAvLyBUT0RPOiB3aWxsIHRoaXMgZnVuY3Rpb24gZXZlciBiZSBjYWxsZWQgd2hlbiB2aWV3IGlzbid0IHJlYWR5P1xuICAgICAgICBpZiAoIXRoaXMucmVhZHkoKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gUmVtb3ZlIHRpbGVzIHRoYXQgYXJlIGEgc3BlY2lmaWVkICMgb2YgdGlsZXMgb3V0c2lkZSBvZiB0aGUgdmlld3BvcnQgYm9yZGVyXG4gICAgICAgIGxldCBib3JkZXJfdGlsZXMgPSBbXG4gICAgICAgICAgICBNYXRoLmNlaWwoKE1hdGguZmxvb3IodGhpcy5zaXplLmNzcy53aWR0aCAvIEdlby50aWxlX3NpemUpICsgMikgLyAyKSxcbiAgICAgICAgICAgIE1hdGguY2VpbCgoTWF0aC5mbG9vcih0aGlzLnNpemUuY3NzLmhlaWdodCAvIEdlby50aWxlX3NpemUpICsgMikgLyAyKVxuICAgICAgICBdO1xuXG4gICAgICAgIHRoaXMuc2NlbmUudGlsZV9tYW5hZ2VyLnJlbW92ZVRpbGVzKHRpbGUgPT4ge1xuICAgICAgICAgICAgLy8gSWdub3JlIHZpc2libGUgdGlsZXNcbiAgICAgICAgICAgIGlmICh0aWxlLnZpc2libGUgfHwgdGlsZS5wcm94eV9mb3IpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIFJlbW92ZSB0aWxlcyBvdXRzaWRlIGdpdmVuIHpvb20gdGhhdCBhcmUgc3RpbGwgbG9hZGluZ1xuICAgICAgICAgICAgaWYgKHRpbGUubG9hZGluZyAmJiB0aWxlLnN0eWxlX3pvb20gIT09IHRoaXMudGlsZV96b29tKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIERpc2NhcmQgaWYgdG9vIGZhciBmcm9tIGN1cnJlbnQgem9vbVxuICAgICAgICAgICAgbGV0IHpkaWZmID0gTWF0aC5hYnModGlsZS5zdHlsZV96b29tIC0gdGhpcy50aWxlX3pvb20pO1xuICAgICAgICAgICAgaWYgKHpkaWZmID4gdGhpcy5wcmVzZXJ2ZV90aWxlc193aXRoaW5fem9vbSkge1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBIYW5kbGUgdGlsZXMgYXQgZGlmZmVyZW50IHpvb21zXG4gICAgICAgICAgICBsZXQgY29vcmRzID0gVGlsZS5jb29yZGluYXRlQXRab29tKHRpbGUuY29vcmRzLCB0aGlzLnRpbGVfem9vbSk7XG5cbiAgICAgICAgICAgIC8vIERpc2NhcmQgdGlsZXMgb3V0c2lkZSBhbiBhcmVhIHN1cnJvdW5kaW5nIHRoZSB2aWV3cG9ydFxuICAgICAgICAgICAgaWYgKE1hdGguYWJzKGNvb3Jkcy54IC0gdGhpcy5jZW50ZXIudGlsZS54KSAtIGJvcmRlcl90aWxlc1swXSA+IHRoaXMuYnVmZmVyKSB7XG4gICAgICAgICAgICAgICAgbG9nKCd0cmFjZScsIGBWaWV3OiByZW1vdmUgdGlsZSAke3RpbGUua2V5fSAoYXMgJHtjb29yZHMueH0vJHtjb29yZHMueX0vJHt0aGlzLnRpbGVfem9vbX0pIGZvciBiZWluZyB0b28gZmFyIG91dCBvZiB2aXNpYmxlIGFyZWEgKioqYCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChNYXRoLmFicyhjb29yZHMueSAtIHRoaXMuY2VudGVyLnRpbGUueSkgLSBib3JkZXJfdGlsZXNbMV0gPiB0aGlzLmJ1ZmZlcikge1xuICAgICAgICAgICAgICAgIGxvZygndHJhY2UnLCBgVmlldzogcmVtb3ZlIHRpbGUgJHt0aWxlLmtleX0gKGFzICR7Y29vcmRzLnh9LyR7Y29vcmRzLnl9LyR7dGhpcy50aWxlX3pvb219KSBmb3IgYmVpbmcgdG9vIGZhciBvdXQgb2YgdmlzaWJsZSBhcmVhICoqKmApO1xuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBBbGxvY2F0ZSBtb2RlbC12aWV3IG1hdHJpY2VzXG4gICAgLy8gNjQtYml0IHZlcnNpb25zIGFyZSBmb3IgQ1BVIGNhbGN1YXRpb25zXG4gICAgLy8gMzItYml0IHZlcnNpb25zIGFyZSBkb3duc2FtcGxlZCBhbmQgc2VudCB0byBHUFVcbiAgICBjcmVhdGVNYXRyaWNlcyAoKSB7XG4gICAgICAgIHRoaXMubWF0cmljZXMgPSB7fTtcbiAgICAgICAgdGhpcy5tYXRyaWNlcy5tb2RlbCA9IG5ldyBGbG9hdDY0QXJyYXkoMTYpO1xuICAgICAgICB0aGlzLm1hdHJpY2VzLm1vZGVsMzIgPSBuZXcgRmxvYXQzMkFycmF5KDE2KTtcbiAgICAgICAgdGhpcy5tYXRyaWNlcy5tb2RlbF92aWV3ID0gbmV3IEZsb2F0NjRBcnJheSgxNik7XG4gICAgICAgIHRoaXMubWF0cmljZXMubW9kZWxfdmlldzMyID0gbmV3IEZsb2F0MzJBcnJheSgxNik7XG4gICAgICAgIHRoaXMubWF0cmljZXMubm9ybWFsID0gbmV3IEZsb2F0NjRBcnJheSg5KTtcbiAgICAgICAgdGhpcy5tYXRyaWNlcy5ub3JtYWwzMiA9IG5ldyBGbG9hdDMyQXJyYXkoOSk7XG4gICAgICAgIHRoaXMubWF0cmljZXMuaW52ZXJzZV9ub3JtYWwzMiA9IG5ldyBGbG9hdDMyQXJyYXkoOSk7XG4gICAgfVxuXG4gICAgLy8gQ2FsY3VsYXRlIGFuZCBzZXQgbW9kZWwvdmlldyBhbmQgbm9ybWFsIG1hdHJpY2VzIGZvciBhIHRpbGVcbiAgICBzZXR1cFRpbGUgKHRpbGUsIHByb2dyYW0pIHtcbiAgICAgICAgLy8gVGlsZS1zcGVjaWZpYyBzdGF0ZVxuICAgICAgICAvLyBUT0RPOiBjYWxjIHRoZXNlIG9uY2UgcGVyIHRpbGUgKGN1cnJlbnRseSBiZWluZyBuZWVkbGVzc2x5IHJlLWNhbGN1bGF0ZWQgcGVyLXRpbGUtcGVyLXN0eWxlKVxuICAgICAgICB0aWxlLnNldHVwUHJvZ3JhbSh0aGlzLm1hdHJpY2VzLCBwcm9ncmFtKTtcblxuICAgICAgICAvLyBNb2RlbC12aWV3IGFuZCBub3JtYWwgbWF0cmljZXNcbiAgICAgICAgdGhpcy5jYW1lcmEuc2V0dXBNYXRyaWNlcyh0aGlzLm1hdHJpY2VzLCBwcm9ncmFtKTtcbiAgICB9XG5cbiAgICAvLyBTZXQgZ2VuZXJhbCB1bmlmb3JtcyB0aGF0IG11c3QgYmUgdXBkYXRlZCBvbmNlIHBlciBwcm9ncmFtXG4gICAgc2V0dXBQcm9ncmFtIChwcm9ncmFtKSB7XG4gICAgICAgIHByb2dyYW0udW5pZm9ybSgnMmZ2JywgJ3VfcmVzb2x1dGlvbicsIFt0aGlzLnNpemUuZGV2aWNlLndpZHRoLCB0aGlzLnNpemUuZGV2aWNlLmhlaWdodF0pO1xuICAgICAgICBwcm9ncmFtLnVuaWZvcm0oJzNmdicsICd1X21hcF9wb3NpdGlvbicsIFt0aGlzLmNlbnRlci5tZXRlcnMueCwgdGhpcy5jZW50ZXIubWV0ZXJzLnksIHRoaXMuem9vbV0pO1xuICAgICAgICBwcm9ncmFtLnVuaWZvcm0oJzFmJywgJ3VfbWV0ZXJzX3Blcl9waXhlbCcsIHRoaXMubWV0ZXJzX3Blcl9waXhlbCk7XG4gICAgICAgIHByb2dyYW0udW5pZm9ybSgnMWYnLCAndV9kZXZpY2VfcGl4ZWxfcmF0aW8nLCBVdGlscy5kZXZpY2VfcGl4ZWxfcmF0aW8pO1xuICAgICAgICBwcm9ncmFtLnVuaWZvcm0oJzFmJywgJ3Vfdmlld19wYW5fc25hcF90aW1lcicsIHRoaXMucGFuX3NuYXBfdGltZXIpO1xuICAgICAgICBwcm9ncmFtLnVuaWZvcm0oJzFpJywgJ3Vfdmlld19wYW5uaW5nJywgdGhpcy5wYW5uaW5nKTtcblxuICAgICAgICB0aGlzLmNhbWVyYS5zZXR1cFByb2dyYW0ocHJvZ3JhbSk7XG4gICAgfVxuXG4gICAgLy8gVmlldyByZXF1aXJlcyBzb21lIGFuaW1hdGlvbiwgc3VjaCBhcyBhZnRlciBwYW5uaW5nIHN0b3BzXG4gICAgaXNBbmltYXRpbmcgKCkge1xuICAgICAgICByZXR1cm4gKHRoaXMucGFuX3NuYXBfdGltZXIgPD0gVklFV19QQU5fU05BUF9USU1FKTtcbiAgICB9XG5cbn1cbiJdfQ== +//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm5vZGVfbW9kdWxlcy9icm93c2VyLXBhY2svX3ByZWx1ZGUuanMiLCJub2RlX21vZHVsZXMvYXNhcC9icm93c2VyLWFzYXAuanMiLCJub2RlX21vZHVsZXMvYXNhcC9icm93c2VyLXJhdy5qcyIsIm5vZGVfbW9kdWxlcy9iYXNlNjQtanMvaW5kZXguanMiLCJub2RlX21vZHVsZXMvYnJvd3Nlci1yZXNvbHZlL2VtcHR5LmpzIiwibm9kZV9tb2R1bGVzL2J1ZmZlci9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL2VzNi9wcm9taXNlLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fYS1mdW5jdGlvbi5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX2FkZC10by11bnNjb3BhYmxlcy5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX2FuLWluc3RhbmNlLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fYW4tb2JqZWN0LmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fYXJyYXktaW5jbHVkZXMuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19jbGFzc29mLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fY29mLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fY29yZS5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX2N0eC5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX2RlZmluZWQuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19kZXNjcmlwdG9ycy5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX2RvbS1jcmVhdGUuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19lbnVtLWJ1Zy1rZXlzLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fZXhwb3J0LmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fZmFpbHMuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19mb3Itb2YuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19nbG9iYWwuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19oYXMuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19oaWRlLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9faHRtbC5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX2llOC1kb20tZGVmaW5lLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9faW52b2tlLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9faW9iamVjdC5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX2lzLWFycmF5LWl0ZXIuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19pcy1vYmplY3QuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19pdGVyLWNhbGwuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19pdGVyLWNyZWF0ZS5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX2l0ZXItZGVmaW5lLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9faXRlci1kZXRlY3QuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19pdGVyLXN0ZXAuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19pdGVyYXRvcnMuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19saWJyYXJ5LmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fbWljcm90YXNrLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fb2JqZWN0LWNyZWF0ZS5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX29iamVjdC1kcC5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX29iamVjdC1kcHMuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19vYmplY3QtZ3BvLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fb2JqZWN0LWtleXMtaW50ZXJuYWwuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19vYmplY3Qta2V5cy5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX3Byb3BlcnR5LWRlc2MuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19yZWRlZmluZS1hbGwuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19yZWRlZmluZS5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX3NldC1zcGVjaWVzLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fc2V0LXRvLXN0cmluZy10YWcuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL19zaGFyZWQta2V5LmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fc2hhcmVkLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fc3BlY2llcy1jb25zdHJ1Y3Rvci5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX3N0cmluZy1hdC5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX3Rhc2suanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL190by1pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvX3RvLWludGVnZXIuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL190by1pb2JqZWN0LmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fdG8tbGVuZ3RoLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fdG8tb2JqZWN0LmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fdG8tcHJpbWl0aXZlLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fdWlkLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9fd2tzLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9jb3JlLmdldC1pdGVyYXRvci1tZXRob2QuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi5hcnJheS5pdGVyYXRvci5qcyIsIm5vZGVfbW9kdWxlcy9jb3JlLWpzL21vZHVsZXMvZXM2Lm9iamVjdC50by1zdHJpbmcuanMiLCJub2RlX21vZHVsZXMvY29yZS1qcy9tb2R1bGVzL2VzNi5wcm9taXNlLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy9lczYuc3RyaW5nLml0ZXJhdG9yLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtanMvbW9kdWxlcy93ZWIuZG9tLml0ZXJhYmxlLmpzIiwibm9kZV9tb2R1bGVzL2NvcmUtdXRpbC1pcy9saWIvdXRpbC5qcyIsIm5vZGVfbW9kdWxlcy9jc3Njb2xvcnBhcnNlci9jc3Njb2xvcnBhcnNlci5qcyIsIm5vZGVfbW9kdWxlcy9lYXJjdXQvc3JjL2VhcmN1dC5qcyIsIm5vZGVfbW9kdWxlcy9ldmVudHMvZXZlbnRzLmpzIiwibm9kZV9tb2R1bGVzL2ZvbnRmYWNlb2JzZXJ2ZXIvZm9udGZhY2VvYnNlcnZlci5zdGFuZGFsb25lLmpzIiwibm9kZV9tb2R1bGVzL2dlb2pzb24tdnQvc3JjL2NsaXAuanMiLCJub2RlX21vZHVsZXMvZ2VvanNvbi12dC9zcmMvY29udmVydC5qcyIsIm5vZGVfbW9kdWxlcy9nZW9qc29uLXZ0L3NyYy9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9nZW9qc29uLXZ0L3NyYy9zaW1wbGlmeS5qcyIsIm5vZGVfbW9kdWxlcy9nZW9qc29uLXZ0L3NyYy90aWxlLmpzIiwibm9kZV9tb2R1bGVzL2dlb2pzb24tdnQvc3JjL3dyYXAuanMiLCJub2RlX21vZHVsZXMvZ2wtbWF0My9pbnZlcnQuanMiLCJub2RlX21vZHVsZXMvZ2wtbWF0My9ub3JtYWwtZnJvbS1tYXQ0LmpzIiwibm9kZV9tb2R1bGVzL2dsLW1hdDQvY29weS5qcyIsIm5vZGVfbW9kdWxlcy9nbC1tYXQ0L2lkZW50aXR5LmpzIiwibm9kZV9tb2R1bGVzL2dsLW1hdDQvbG9va0F0LmpzIiwibm9kZV9tb2R1bGVzL2dsLW1hdDQvbXVsdGlwbHkuanMiLCJub2RlX21vZHVsZXMvZ2wtbWF0NC9wZXJzcGVjdGl2ZS5qcyIsIm5vZGVfbW9kdWxlcy9nbC1tYXQ0L3NjYWxlLmpzIiwibm9kZV9tb2R1bGVzL2dsLW1hdDQvdHJhbnNsYXRlLmpzIiwibm9kZV9tb2R1bGVzL2dsLXNoYWRlci1lcnJvcnMvaW5kZXguanMiLCJub2RlX21vZHVsZXMvaWVlZTc1NC9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9pbmhlcml0cy9pbmhlcml0c19icm93c2VyLmpzIiwibm9kZV9tb2R1bGVzL2lzLWJ1ZmZlci9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9pc2FycmF5L2luZGV4LmpzIiwibm9kZV9tb2R1bGVzL2pzLXlhbWwvaW5kZXguanMiLCJub2RlX21vZHVsZXMvanMteWFtbC9saWIvanMteWFtbC5qcyIsIm5vZGVfbW9kdWxlcy9qcy15YW1sL2xpYi9qcy15YW1sL2NvbW1vbi5qcyIsIm5vZGVfbW9kdWxlcy9qcy15YW1sL2xpYi9qcy15YW1sL2V4Y2VwdGlvbi5qcyIsIm5vZGVfbW9kdWxlcy9qcy15YW1sL2xpYi9qcy15YW1sL2xvYWRlci5qcyIsIm5vZGVfbW9kdWxlcy9qcy15YW1sL2xpYi9qcy15YW1sL21hcmsuanMiLCJub2RlX21vZHVsZXMvanMteWFtbC9saWIvanMteWFtbC9zY2hlbWEuanMiLCJub2RlX21vZHVsZXMvanMteWFtbC9saWIvanMteWFtbC9zY2hlbWEvY29yZS5qcyIsIm5vZGVfbW9kdWxlcy9qcy15YW1sL2xpYi9qcy15YW1sL3NjaGVtYS9kZWZhdWx0X2Z1bGwuanMiLCJub2RlX21vZHVsZXMvanMteWFtbC9saWIvanMteWFtbC9zY2hlbWEvZGVmYXVsdF9zYWZlLmpzIiwibm9kZV9tb2R1bGVzL2pzLXlhbWwvbGliL2pzLXlhbWwvc2NoZW1hL2ZhaWxzYWZlLmpzIiwibm9kZV9tb2R1bGVzL2pzLXlhbWwvbGliL2pzLXlhbWwvc2NoZW1hL2pzb24uanMiLCJub2RlX21vZHVsZXMvanMteWFtbC9saWIvanMteWFtbC90eXBlLmpzIiwibm9kZV9tb2R1bGVzL2pzLXlhbWwvbGliL2pzLXlhbWwvdHlwZS9iaW5hcnkuanMiLCJub2RlX21vZHVsZXMvanMteWFtbC9saWIvanMteWFtbC90eXBlL2Jvb2wuanMiLCJub2RlX21vZHVsZXMvanMteWFtbC9saWIvanMteWFtbC90eXBlL2Zsb2F0LmpzIiwibm9kZV9tb2R1bGVzL2pzLXlhbWwvbGliL2pzLXlhbWwvdHlwZS9pbnQuanMiLCJub2RlX21vZHVsZXMvanMteWFtbC9saWIvanMteWFtbC90eXBlL2pzL2Z1bmN0aW9uLmpzIiwibm9kZV9tb2R1bGVzL2pzLXlhbWwvbGliL2pzLXlhbWwvdHlwZS9qcy9yZWdleHAuanMiLCJub2RlX21vZHVsZXMvanMteWFtbC9saWIvanMteWFtbC90eXBlL2pzL3VuZGVmaW5lZC5qcyIsIm5vZGVfbW9kdWxlcy9qcy15YW1sL2xpYi9qcy15YW1sL3R5cGUvbWFwLmpzIiwibm9kZV9tb2R1bGVzL2pzLXlhbWwvbGliL2pzLXlhbWwvdHlwZS9tZXJnZS5qcyIsIm5vZGVfbW9kdWxlcy9qcy15YW1sL2xpYi9qcy15YW1sL3R5cGUvbnVsbC5qcyIsIm5vZGVfbW9kdWxlcy9qcy15YW1sL2xpYi9qcy15YW1sL3R5cGUvb21hcC5qcyIsIm5vZGVfbW9kdWxlcy9qcy15YW1sL2xpYi9qcy15YW1sL3R5cGUvcGFpcnMuanMiLCJub2RlX21vZHVsZXMvanMteWFtbC9saWIvanMteWFtbC90eXBlL3NlcS5qcyIsIm5vZGVfbW9kdWxlcy9qcy15YW1sL2xpYi9qcy15YW1sL3R5cGUvc2V0LmpzIiwibm9kZV9tb2R1bGVzL2pzLXlhbWwvbGliL2pzLXlhbWwvdHlwZS9zdHIuanMiLCJub2RlX21vZHVsZXMvanMteWFtbC9saWIvanMteWFtbC90eXBlL3RpbWVzdGFtcC5qcyIsIm5vZGVfbW9kdWxlcy9qc3ppcC9saWIvYmFzZTY0LmpzIiwibm9kZV9tb2R1bGVzL2pzemlwL2xpYi9jb21wcmVzc2VkT2JqZWN0LmpzIiwibm9kZV9tb2R1bGVzL2pzemlwL2xpYi9jb21wcmVzc2lvbnMuanMiLCJub2RlX21vZHVsZXMvanN6aXAvbGliL2NyYzMyLmpzIiwibm9kZV9tb2R1bGVzL2pzemlwL2xpYi9kZWZhdWx0cy5qcyIsIm5vZGVfbW9kdWxlcy9qc3ppcC9saWIvZXh0ZXJuYWwuanMiLCJub2RlX21vZHVsZXMvanN6aXAvbGliL2ZsYXRlLmpzIiwibm9kZV9tb2R1bGVzL2pzemlwL2xpYi9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9qc3ppcC9saWIvbG9hZC5qcyIsIm5vZGVfbW9kdWxlcy9qc3ppcC9saWIvbm9kZWpzL05vZGVqc1N0cmVhbUlucHV0QWRhcHRlci5qcyIsIm5vZGVfbW9kdWxlcy9qc3ppcC9saWIvbm9kZWpzL05vZGVqc1N0cmVhbU91dHB1dEFkYXB0ZXIuanMiLCJub2RlX21vZHVsZXMvanN6aXAvbGliL25vZGVqc1V0aWxzLmpzIiwibm9kZV9tb2R1bGVzL2pzemlwL2xpYi9vYmplY3QuanMiLCJub2RlX21vZHVsZXMvanN6aXAvbGliL3JlYWRlci9BcnJheVJlYWRlci5qcyIsIm5vZGVfbW9kdWxlcy9qc3ppcC9saWIvcmVhZGVyL0RhdGFSZWFkZXIuanMiLCJub2RlX21vZHVsZXMvanN6aXAvbGliL3JlYWRlci9Ob2RlQnVmZmVyUmVhZGVyLmpzIiwibm9kZV9tb2R1bGVzL2pzemlwL2xpYi9yZWFkZXIvU3RyaW5nUmVhZGVyLmpzIiwibm9kZV9tb2R1bGVzL2pzemlwL2xpYi9yZWFkZXIvVWludDhBcnJheVJlYWRlci5qcyIsIm5vZGVfbW9kdWxlcy9qc3ppcC9saWIvcmVhZGVyL3JlYWRlckZvci5qcyIsIm5vZGVfbW9kdWxlcy9qc3ppcC9saWIvc2lnbmF0dXJlLmpzIiwibm9kZV9tb2R1bGVzL2pzemlwL2xpYi9zdHJlYW0vQ29udmVydFdvcmtlci5qcyIsIm5vZGVfbW9kdWxlcy9qc3ppcC9saWIvc3RyZWFtL0NyYzMyUHJvYmUuanMiLCJub2RlX21vZHVsZXMvanN6aXAvbGliL3N0cmVhbS9EYXRhTGVuZ3RoUHJvYmUuanMiLCJub2RlX21vZHVsZXMvanN6aXAvbGliL3N0cmVhbS9EYXRhV29ya2VyLmpzIiwibm9kZV9tb2R1bGVzL2pzemlwL2xpYi9zdHJlYW0vR2VuZXJpY1dvcmtlci5qcyIsIm5vZGVfbW9kdWxlcy9qc3ppcC9saWIvc3RyZWFtL1N0cmVhbUhlbHBlci5qcyIsIm5vZGVfbW9kdWxlcy9qc3ppcC9saWIvc3VwcG9ydC5qcyIsIm5vZGVfbW9kdWxlcy9qc3ppcC9saWIvdXRmOC5qcyIsIm5vZGVfbW9kdWxlcy9qc3ppcC9saWIvdXRpbHMuanMiLCJub2RlX21vZHVsZXMvanN6aXAvbGliL3ppcEVudHJpZXMuanMiLCJub2RlX21vZHVsZXMvanN6aXAvbGliL3ppcEVudHJ5LmpzIiwibm9kZV9tb2R1bGVzL2pzemlwL2xpYi96aXBPYmplY3QuanMiLCJub2RlX21vZHVsZXMvcGFrby9pbmRleC5qcyIsIm5vZGVfbW9kdWxlcy9wYWtvL2xpYi9kZWZsYXRlLmpzIiwibm9kZV9tb2R1bGVzL3Bha28vbGliL2luZmxhdGUuanMiLCJub2RlX21vZHVsZXMvcGFrby9saWIvdXRpbHMvY29tbW9uLmpzIiwibm9kZV9tb2R1bGVzL3Bha28vbGliL3V0aWxzL3N0cmluZ3MuanMiLCJub2RlX21vZHVsZXMvcGFrby9saWIvemxpYi9hZGxlcjMyLmpzIiwibm9kZV9tb2R1bGVzL3Bha28vbGliL3psaWIvY29uc3RhbnRzLmpzIiwibm9kZV9tb2R1bGVzL3Bha28vbGliL3psaWIvY3JjMzIuanMiLCJub2RlX21vZHVsZXMvcGFrby9saWIvemxpYi9kZWZsYXRlLmpzIiwibm9kZV9tb2R1bGVzL3Bha28vbGliL3psaWIvZ3poZWFkZXIuanMiLCJub2RlX21vZHVsZXMvcGFrby9saWIvemxpYi9pbmZmYXN0LmpzIiwibm9kZV9tb2R1bGVzL3Bha28vbGliL3psaWIvaW5mbGF0ZS5qcyIsIm5vZGVfbW9kdWxlcy9wYWtvL2xpYi96bGliL2luZnRyZWVzLmpzIiwibm9kZV9tb2R1bGVzL3Bha28vbGliL3psaWIvbWVzc2FnZXMuanMiLCJub2RlX21vZHVsZXMvcGFrby9saWIvemxpYi90cmVlcy5qcyIsIm5vZGVfbW9kdWxlcy9wYWtvL2xpYi96bGliL3pzdHJlYW0uanMiLCJub2RlX21vZHVsZXMvcGJmL2J1ZmZlci5qcyIsIm5vZGVfbW9kdWxlcy9wYmYvaW5kZXguanMiLCJub2RlX21vZHVsZXMvcG9pbnQtZ2VvbWV0cnkvaW5kZXguanMiLCJub2RlX21vZHVsZXMvcHJvY2Vzcy1uZXh0aWNrLWFyZ3MvaW5kZXguanMiLCJub2RlX21vZHVsZXMvcHJvY2Vzcy9icm93c2VyLmpzIiwibm9kZV9tb2R1bGVzL3JlYWRhYmxlLXN0cmVhbS9saWIvX3N0cmVhbV9kdXBsZXguanMiLCJub2RlX21vZHVsZXMvcmVhZGFibGUtc3RyZWFtL2xpYi9fc3RyZWFtX3Bhc3N0aHJvdWdoLmpzIiwibm9kZV9tb2R1bGVzL3JlYWRhYmxlLXN0cmVhbS9saWIvX3N0cmVhbV9yZWFkYWJsZS5qcyIsIm5vZGVfbW9kdWxlcy9yZWFkYWJsZS1zdHJlYW0vbGliL19zdHJlYW1fdHJhbnNmb3JtLmpzIiwibm9kZV9tb2R1bGVzL3JlYWRhYmxlLXN0cmVhbS9saWIvX3N0cmVhbV93cml0YWJsZS5qcyIsIm5vZGVfbW9kdWxlcy9yZWFkYWJsZS1zdHJlYW0vcmVhZGFibGUuanMiLCJub2RlX21vZHVsZXMvc3RyaW5nX2RlY29kZXIvaW5kZXguanMiLCJub2RlX21vZHVsZXMvc3RyaXAtY29tbWVudHMvaW5kZXguanMiLCJub2RlX21vZHVsZXMvdG9wb2pzb24tY2xpZW50L2Rpc3QvdG9wb2pzb24tY2xpZW50LmpzIiwibm9kZV9tb2R1bGVzL3V0aWwtZGVwcmVjYXRlL2Jyb3dzZXIuanMiLCJub2RlX21vZHVsZXMvdXRpbC9zdXBwb3J0L2lzQnVmZmVyQnJvd3Nlci5qcyIsIm5vZGVfbW9kdWxlcy91dGlsL3V0aWwuanMiLCJub2RlX21vZHVsZXMvdmVjdG9yLXRpbGUvaW5kZXguanMiLCJub2RlX21vZHVsZXMvdmVjdG9yLXRpbGUvbGliL3ZlY3RvcnRpbGUuanMiLCJub2RlX21vZHVsZXMvdmVjdG9yLXRpbGUvbGliL3ZlY3RvcnRpbGVmZWF0dXJlLmpzIiwibm9kZV9tb2R1bGVzL3ZlY3Rvci10aWxlL2xpYi92ZWN0b3J0aWxlbGF5ZXIuanMiLCJzcmMvYnVpbGRlcnMvY29tbW9uLmpzIiwic3JjL2J1aWxkZXJzL3BvaW50cy5qcyIsInNyYy9idWlsZGVycy9wb2x5Z29ucy5qcyIsInNyYy9idWlsZGVycy9wb2x5bGluZXMuanMiLCJzcmMvY2FtZXJhLmpzIiwic3JjL2dlby5qcyIsInNyYy9nbC9jb25zdGFudHMuanMiLCJzcmMvZ2wvY29udGV4dC5qcyIsInNyYy9nbC9leHRlbnNpb25zLmpzIiwic3JjL2dsL2dsc2wuanMiLCJzcmMvZ2wvcmVuZGVyX3N0YXRlLmpzIiwic3JjL2dsL3NoYWRlcl9wcm9ncmFtLmpzIiwic3JjL2dsL3RleHR1cmUuanMiLCJzcmMvZ2wvdmFvLmpzIiwic3JjL2dsL3Zib19tZXNoLmpzIiwic3JjL2dsL3ZlcnRleF9kYXRhLmpzIiwic3JjL2dsL3ZlcnRleF9lbGVtZW50cy5qcyIsInNyYy9nbC92ZXJ0ZXhfbGF5b3V0LmpzIiwic3JjL2xhYmVscy9jb2xsaXNpb24uanMiLCJzcmMvbGFiZWxzL2ludGVyc2VjdC5qcyIsInNyYy9sYWJlbHMvbGFiZWwuanMiLCJzcmMvbGFiZWxzL2xhYmVsX2xpbmUuanMiLCJzcmMvbGFiZWxzL2xhYmVsX3BvaW50LmpzIiwic3JjL2xhYmVscy9wb2ludF9hbmNob3IuanMiLCJzcmMvbGFiZWxzL3BvaW50X3BsYWNlbWVudC5qcyIsInNyYy9sYWJlbHMvcmVwZWF0X2dyb3VwLmpzIiwic3JjL2xlYWZsZXRfbGF5ZXIuanMiLCJzcmMvbGlnaHQuanMiLCJzcmMvbWF0ZXJpYWwuanMiLCJzcmMvbW9kdWxlLmpzIiwic3JjL3NjZW5lLmpzIiwic3JjL3NjZW5lX2J1bmRsZS5qcyIsInNyYy9zY2VuZV9sb2FkZXIuanMiLCJzcmMvc2NlbmVfd29ya2VyLmpzIiwic3JjL3NlbGVjdGlvbi5qcyIsInNyYy9zb3VyY2VzL2RhdGFfc291cmNlLmpzIiwic3JjL3NvdXJjZXMvZ2VvanNvbi5qcyIsInNyYy9zb3VyY2VzL212dC5qcyIsInNyYy9zb3VyY2VzL3Jhc3Rlci5qcyIsInNyYy9zb3VyY2VzL3RvcG9qc29uLmpzIiwic3JjL3N0eWxlcy9maWx0ZXIuanMiLCJzcmMvc3R5bGVzL2xheWVyLmpzIiwic3JjL3N0eWxlcy9saW5lcy9kYXNoYXJyYXkuanMiLCJzcmMvc3R5bGVzL2xpbmVzL2xpbmVzLmpzIiwic3JjL3N0eWxlcy9wb2ludHMvcG9pbnRzLmpzIiwic3JjL3N0eWxlcy9wb2x5Z29ucy9wb2x5Z29ucy5qcyIsInNyYy9zdHlsZXMvcmFzdGVyL3Jhc3Rlci5qcyIsInNyYy9zdHlsZXMvc3R5bGUuanMiLCJzcmMvc3R5bGVzL3N0eWxlX21hbmFnZXIuanMiLCJzcmMvc3R5bGVzL3N0eWxlX3BhcnNlci5qcyIsInNyYy9zdHlsZXMvdGV4dC9jYW52YXNfdGV4dC5qcyIsInNyYy9zdHlsZXMvdGV4dC9mb250X21hbmFnZXIuanMiLCJzcmMvc3R5bGVzL3RleHQvdGV4dC5qcyIsInNyYy9zdHlsZXMvdGV4dC90ZXh0X2xhYmVscy5qcyIsInNyYy9zdHlsZXMvdGV4dC90ZXh0X3NldHRpbmdzLmpzIiwic3JjL3RpbGUuanMiLCJzcmMvdGlsZV9tYW5hZ2VyLmpzIiwic3JjL3RpbGVfcHlyYW1pZC5qcyIsInNyYy91dGlscy9kZWJ1Z19zZXR0aW5ncy5qcyIsInNyYy91dGlscy9lcnJvcnMuanMiLCJzcmMvdXRpbHMvZ2wtbWF0cml4LmpzIiwic3JjL3V0aWxzL2xvZy5qcyIsInNyYy91dGlscy9tZWRpYV9jYXB0dXJlLmpzIiwic3JjL3V0aWxzL21lcmdlLmpzIiwic3JjL3V0aWxzL29iYi5qcyIsInNyYy91dGlscy9wb2x5ZmlsbHMuanMiLCJzcmMvdXRpbHMvc3Vic2NyaWJlLmpzIiwic3JjL3V0aWxzL3RocmVhZC5qcyIsInNyYy91dGlscy91cmxzLmpzIiwic3JjL3V0aWxzL3V0aWxzLmpzIiwic3JjL3V0aWxzL3ZlcnNpb24uanMiLCJzcmMvdXRpbHMvd29ya2VyX2Jyb2tlci5qcyIsInNyYy92ZWN0b3IuanMiLCJzcmMvdmlldy5qcyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQTtBQ0FBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUNsRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztBQy9OQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNsSEE7OztBQ0FBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7QUM3dkRBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDSkE7QUFDQTtBQUNBO0FBQ0E7O0FDSEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDTkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNKQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ0pBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNwQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN0QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNKQTtBQUNBOztBQ0RBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbkJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDSkE7QUFDQTtBQUNBO0FBQ0E7O0FDSEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDTkE7QUFDQTtBQUNBO0FBQ0E7O0FDSEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDMUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ05BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3hCQTtBQUNBO0FBQ0E7QUFDQTs7QUNIQTtBQUNBO0FBQ0E7QUFDQTs7QUNIQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1BBOztBQ0FBO0FBQ0E7QUFDQTs7QUNGQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNmQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ0pBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDUEE7QUFDQTtBQUNBOztBQ0ZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNYQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNaQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNyRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3BCQTtBQUNBO0FBQ0E7O0FDRkE7O0FDQUE7O0FDQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNuRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3pDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNmQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNaQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNaQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2hCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNOQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1BBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDSkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMvQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDWkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDTkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNKQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDTEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNQQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2hCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDMUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ05BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNMQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDTEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ0xBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDSkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1hBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDSkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNWQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1BBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2pDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNUQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzFTQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2hCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FDckJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztBQzNHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN6TUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3BvQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzlTQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1BBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdkpBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2hKQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3pRQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDMUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDckZBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDN0RBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDckNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdkRBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzNCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDMUJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN6RkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3pDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDaENBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzlCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3JDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDMUJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3BGQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdkJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3JCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDTEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNQQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN2Q0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzNEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzNDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbGpEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzVFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDeEdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2xCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3pCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzVCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDakJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDekJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDN0RBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbElBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNuQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDekdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3hLQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNwRkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDNURBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDNUJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNSQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNaQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2xDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDNUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNyREE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM3QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ1JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2pGQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3JGQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMzRUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2RBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzlFQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDWEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNWQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDcEVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2hEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2xGQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDMUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUMxQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztBQ2xDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNuWUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDekRBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNwSEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNuQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3RDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3RCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM5QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNQQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDMUJBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN2QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzdCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDcEhBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FDdlFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7O0FDN01BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7Ozs7QUNsQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ25SQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNqZEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUN0UUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNwU0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM1SEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2RBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDaFpBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDbGFBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3RHQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDekxBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNoQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2xEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDekNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDL3pEQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3hDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDdFVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNsZ0RBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3ZVQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2JBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNsckNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUM3QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQy9KQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztBQ3ZhQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQ25JQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7O0FDM0NBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3BMQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDMUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7OztBQ3pCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztBQy8yQkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUNuTEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7O0FDbmdCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNaQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDN05BO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDekVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7QUNsSEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7Ozs7O0FDbkVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7O0FDTEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7OztBQzFrQkE7QUFDQTtBQUNBO0FBQ0E7O0FDSEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2pCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUNsS0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtB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QUVEOzs7O3NDQUNlO0FBQ1gsbUJBQVEsS0FBSyxjQUFMLElBQXVCLGtCQUEvQjtBQUNIOzs7Ozs7a0JBdFVnQixJIiwiZmlsZSI6ImdlbmVyYXRlZC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzQ29udGVudCI6WyIoZnVuY3Rpb24gZSh0LG4scil7ZnVuY3Rpb24gcyhvLHUpe2lmKCFuW29dKXtpZighdFtvXSl7dmFyIGE9dHlwZW9mIHJlcXVpcmU9PVwiZnVuY3Rpb25cIiYmcmVxdWlyZTtpZighdSYmYSlyZXR1cm4gYShvLCEwKTtpZihpKXJldHVybiBpKG8sITApO3ZhciBmPW5ldyBFcnJvcihcIkNhbm5vdCBmaW5kIG1vZHVsZSAnXCIrbytcIidcIik7dGhyb3cgZi5jb2RlPVwiTU9EVUxFX05PVF9GT1VORFwiLGZ9dmFyIGw9bltvXT17ZXhwb3J0czp7fX07dFtvXVswXS5jYWxsKGwuZXhwb3J0cyxmdW5jdGlvbihlKXt2YXIgbj10W29dWzFdW2VdO3JldHVybiBzKG4/bjplKX0sbCxsLmV4cG9ydHMsZSx0LG4scil9cmV0dXJuIG5bb10uZXhwb3J0c312YXIgaT10eXBlb2YgcmVxdWlyZT09XCJmdW5jdGlvblwiJiZyZXF1aXJlO2Zvcih2YXIgbz0wO288ci5sZW5ndGg7bysrKXMocltvXSk7cmV0dXJuIHN9KSIsIlwidXNlIHN0cmljdFwiO1xuXG4vLyByYXdBc2FwIHByb3ZpZGVzIGV2ZXJ5dGhpbmcgd2UgbmVlZCBleGNlcHQgZXhjZXB0aW9uIG1hbmFnZW1lbnQuXG52YXIgcmF3QXNhcCA9IHJlcXVpcmUoXCIuL3Jhd1wiKTtcbi8vIFJhd1Rhc2tzIGFyZSByZWN5Y2xlZCB0byByZWR1Y2UgR0MgY2h1cm4uXG52YXIgZnJlZVRhc2tzID0gW107XG4vLyBXZSBxdWV1ZSBlcnJvcnMgdG8gZW5zdXJlIHRoZXkgYXJlIHRocm93biBpbiByaWdodCBvcmRlciAoRklGTykuXG4vLyBBcnJheS1hcy1xdWV1ZSBpcyBnb29kIGVub3VnaCBoZXJlLCBzaW5jZSB3ZSBhcmUganVzdCBkZWFsaW5nIHdpdGggZXhjZXB0aW9ucy5cbnZhciBwZW5kaW5nRXJyb3JzID0gW107XG52YXIgcmVxdWVzdEVycm9yVGhyb3cgPSByYXdBc2FwLm1ha2VSZXF1ZXN0Q2FsbEZyb21UaW1lcih0aHJvd0ZpcnN0RXJyb3IpO1xuXG5mdW5jdGlvbiB0aHJvd0ZpcnN0RXJyb3IoKSB7XG4gICAgaWYgKHBlbmRpbmdFcnJvcnMubGVuZ3RoKSB7XG4gICAgICAgIHRocm93IHBlbmRpbmdFcnJvcnMuc2hpZnQoKTtcbiAgICB9XG59XG5cbi8qKlxuICogQ2FsbHMgYSB0YXNrIGFzIHNvb24gYXMgcG9zc2libGUgYWZ0ZXIgcmV0dXJuaW5nLCBpbiBpdHMgb3duIGV2ZW50LCB3aXRoIHByaW9yaXR5XG4gKiBvdmVyIG90aGVyIGV2ZW50cyBsaWtlIGFuaW1hdGlvbiwgcmVmbG93LCBhbmQgcmVwYWludC4gQW4gZXJyb3IgdGhyb3duIGZyb20gYW5cbiAqIGV2ZW50IHdpbGwgbm90IGludGVycnVwdCwgbm9yIGV2ZW4gc3Vic3RhbnRpYWxseSBzbG93IGRvd24gdGhlIHByb2Nlc3Npbmcgb2ZcbiAqIG90aGVyIGV2ZW50cywgYnV0IHdpbGwgYmUgcmF0aGVyIHBvc3Rwb25lZCB0byBhIGxvd2VyIHByaW9yaXR5IGV2ZW50LlxuICogQHBhcmFtIHt7Y2FsbH19IHRhc2sgQSBjYWxsYWJsZSBvYmplY3QsIHR5cGljYWxseSBhIGZ1bmN0aW9uIHRoYXQgdGFrZXMgbm9cbiAqIGFyZ3VtZW50cy5cbiAqL1xubW9kdWxlLmV4cG9ydHMgPSBhc2FwO1xuZnVuY3Rpb24gYXNhcCh0YXNrKSB7XG4gICAgdmFyIHJhd1Rhc2s7XG4gICAgaWYgKGZyZWVUYXNrcy5sZW5ndGgpIHtcbiAgICAgICAgcmF3VGFzayA9IGZyZWVUYXNrcy5wb3AoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICByYXdUYXNrID0gbmV3IFJhd1Rhc2soKTtcbiAgICB9XG4gICAgcmF3VGFzay50YXNrID0gdGFzaztcbiAgICByYXdBc2FwKHJhd1Rhc2spO1xufVxuXG4vLyBXZSB3cmFwIHRhc2tzIHdpdGggcmVjeWNsYWJsZSB0YXNrIG9iamVjdHMuICBBIHRhc2sgb2JqZWN0IGltcGxlbWVudHNcbi8vIGBjYWxsYCwganVzdCBsaWtlIGEgZnVuY3Rpb24uXG5mdW5jdGlvbiBSYXdUYXNrKCkge1xuICAgIHRoaXMudGFzayA9IG51bGw7XG59XG5cbi8vIFRoZSBzb2xlIHB1cnBvc2Ugb2Ygd3JhcHBpbmcgdGhlIHRhc2sgaXMgdG8gY2F0Y2ggdGhlIGV4Y2VwdGlvbiBhbmQgcmVjeWNsZVxuLy8gdGhlIHRhc2sgb2JqZWN0IGFmdGVyIGl0cyBzaW5nbGUgdXNlLlxuUmF3VGFzay5wcm90b3R5cGUuY2FsbCA9IGZ1bmN0aW9uICgpIHtcbiAgICB0cnkge1xuICAgICAgICB0aGlzLnRhc2suY2FsbCgpO1xuICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4gICAgICAgIGlmIChhc2FwLm9uZXJyb3IpIHtcbiAgICAgICAgICAgIC8vIFRoaXMgaG9vayBleGlzdHMgcHVyZWx5IGZvciB0ZXN0aW5nIHB1cnBvc2VzLlxuICAgICAgICAgICAgLy8gSXRzIG5hbWUgd2lsbCBiZSBwZXJpb2RpY2FsbHkgcmFuZG9taXplZCB0byBicmVhayBhbnkgY29kZSB0aGF0XG4gICAgICAgICAgICAvLyBkZXBlbmRzIG9uIGl0cyBleGlzdGVuY2UuXG4gICAgICAgICAgICBhc2FwLm9uZXJyb3IoZXJyb3IpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLy8gSW4gYSB3ZWIgYnJvd3NlciwgZXhjZXB0aW9ucyBhcmUgbm90IGZhdGFsLiBIb3dldmVyLCB0byBhdm9pZFxuICAgICAgICAgICAgLy8gc2xvd2luZyBkb3duIHRoZSBxdWV1ZSBvZiBwZW5kaW5nIHRhc2tzLCB3ZSByZXRocm93IHRoZSBlcnJvciBpbiBhXG4gICAgICAgICAgICAvLyBsb3dlciBwcmlvcml0eSB0dXJuLlxuICAgICAgICAgICAgcGVuZGluZ0Vycm9ycy5wdXNoKGVycm9yKTtcbiAgICAgICAgICAgIHJlcXVlc3RFcnJvclRocm93KCk7XG4gICAgICAgIH1cbiAgICB9IGZpbmFsbHkge1xuICAgICAgICB0aGlzLnRhc2sgPSBudWxsO1xuICAgICAgICBmcmVlVGFza3NbZnJlZVRhc2tzLmxlbmd0aF0gPSB0aGlzO1xuICAgIH1cbn07XG4iLCJcInVzZSBzdHJpY3RcIjtcblxuLy8gVXNlIHRoZSBmYXN0ZXN0IG1lYW5zIHBvc3NpYmxlIHRvIGV4ZWN1dGUgYSB0YXNrIGluIGl0cyBvd24gdHVybiwgd2l0aFxuLy8gcHJpb3JpdHkgb3ZlciBvdGhlciBldmVudHMgaW5jbHVkaW5nIElPLCBhbmltYXRpb24sIHJlZmxvdywgYW5kIHJlZHJhd1xuLy8gZXZlbnRzIGluIGJyb3dzZXJzLlxuLy9cbi8vIEFuIGV4Y2VwdGlvbiB0aHJvd24gYnkgYSB0YXNrIHdpbGwgcGVybWFuZW50bHkgaW50ZXJydXB0IHRoZSBwcm9jZXNzaW5nIG9mXG4vLyBzdWJzZXF1ZW50IHRhc2tzLiBUaGUgaGlnaGVyIGxldmVsIGBhc2FwYCBmdW5jdGlvbiBlbnN1cmVzIHRoYXQgaWYgYW5cbi8vIGV4Y2VwdGlvbiBpcyB0aHJvd24gYnkgYSB0YXNrLCB0aGF0IHRoZSB0YXNrIHF1ZXVlIHdpbGwgY29udGludWUgZmx1c2hpbmcgYXNcbi8vIHNvb24gYXMgcG9zc2libGUsIGJ1dCBpZiB5b3UgdXNlIGByYXdBc2FwYCBkaXJlY3RseSwgeW91IGFyZSByZXNwb25zaWJsZSB0b1xuLy8gZWl0aGVyIGVuc3VyZSB0aGF0IG5vIGV4Y2VwdGlvbnMgYXJlIHRocm93biBmcm9tIHlvdXIgdGFzaywgb3IgdG8gbWFudWFsbHlcbi8vIGNhbGwgYHJhd0FzYXAucmVxdWVzdEZsdXNoYCBpZiBhbiBleGNlcHRpb24gaXMgdGhyb3duLlxubW9kdWxlLmV4cG9ydHMgPSByYXdBc2FwO1xuZnVuY3Rpb24gcmF3QXNhcCh0YXNrKSB7XG4gICAgaWYgKCFxdWV1ZS5sZW5ndGgpIHtcbiAgICAgICAgcmVxdWVzdEZsdXNoKCk7XG4gICAgICAgIGZsdXNoaW5nID0gdHJ1ZTtcbiAgICB9XG4gICAgLy8gRXF1aXZhbGVudCB0byBwdXNoLCBidXQgYXZvaWRzIGEgZnVuY3Rpb24gY2FsbC5cbiAgICBxdWV1ZVtxdWV1ZS5sZW5ndGhdID0gdGFzaztcbn1cblxudmFyIHF1ZXVlID0gW107XG4vLyBPbmNlIGEgZmx1c2ggaGFzIGJlZW4gcmVxdWVzdGVkLCBubyBmdXJ0aGVyIGNhbGxzIHRvIGByZXF1ZXN0Rmx1c2hgIGFyZVxuLy8gbmVjZXNzYXJ5IHVudGlsIHRoZSBuZXh0IGBmbHVzaGAgY29tcGxldGVzLlxudmFyIGZsdXNoaW5nID0gZmFsc2U7XG4vLyBgcmVxdWVzdEZsdXNoYCBpcyBhbiBpbXBsZW1lbnRhdGlvbi1zcGVjaWZpYyBtZXRob2QgdGhhdCBhdHRlbXB0cyB0byBraWNrXG4vLyBvZmYgYSBgZmx1c2hgIGV2ZW50IGFzIHF1aWNrbHkgYXMgcG9zc2libGUuIGBmbHVzaGAgd2lsbCBhdHRlbXB0IHRvIGV4aGF1c3Rcbi8vIHRoZSBldmVudCBxdWV1ZSBiZWZvcmUgeWllbGRpbmcgdG8gdGhlIGJyb3dzZXIncyBvd24gZXZlbnQgbG9vcC5cbnZhciByZXF1ZXN0Rmx1c2g7XG4vLyBUaGUgcG9zaXRpb24gb2YgdGhlIG5leHQgdGFzayB0byBleGVjdXRlIGluIHRoZSB0YXNrIHF1ZXVlLiBUaGlzIGlzXG4vLyBwcmVzZXJ2ZWQgYmV0d2VlbiBjYWxscyB0byBgZmx1c2hgIHNvIHRoYXQgaXQgY2FuIGJlIHJlc3VtZWQgaWZcbi8vIGEgdGFzayB0aHJvd3MgYW4gZXhjZXB0aW9uLlxudmFyIGluZGV4ID0gMDtcbi8vIElmIGEgdGFzayBzY2hlZHVsZXMgYWRkaXRpb25hbCB0YXNrcyByZWN1cnNpdmVseSwgdGhlIHRhc2sgcXVldWUgY2FuIGdyb3dcbi8vIHVuYm91bmRlZC4gVG8gcHJldmVudCBtZW1vcnkgZXhoYXVzdGlvbiwgdGhlIHRhc2sgcXVldWUgd2lsbCBwZXJpb2RpY2FsbHlcbi8vIHRydW5jYXRlIGFscmVhZHktY29tcGxldGVkIHRhc2tzLlxudmFyIGNhcGFjaXR5ID0gMTAyNDtcblxuLy8gVGhlIGZsdXNoIGZ1bmN0aW9uIHByb2Nlc3NlcyBhbGwgdGFza3MgdGhhdCBoYXZlIGJlZW4gc2NoZWR1bGVkIHdpdGhcbi8vIGByYXdBc2FwYCB1bmxlc3MgYW5kIHVudGlsIG9uZSBvZiB0aG9zZSB0YXNrcyB0aHJvd3MgYW4gZXhjZXB0aW9uLlxuLy8gSWYgYSB0YXNrIHRocm93cyBhbiBleGNlcHRpb24sIGBmbHVzaGAgZW5zdXJlcyB0aGF0IGl0cyBzdGF0ZSB3aWxsIHJlbWFpblxuLy8gY29uc2lzdGVudCBhbmQgd2lsbCByZXN1bWUgd2hlcmUgaXQgbGVmdCBvZmYgd2hlbiBjYWxsZWQgYWdhaW4uXG4vLyBIb3dldmVyLCBgZmx1c2hgIGRvZXMgbm90IG1ha2UgYW55IGFycmFuZ2VtZW50cyB0byBiZSBjYWxsZWQgYWdhaW4gaWYgYW5cbi8vIGV4Y2VwdGlvbiBpcyB0aHJvd24uXG5mdW5jdGlvbiBmbHVzaCgpIHtcbiAgICB3aGlsZSAoaW5kZXggPCBxdWV1ZS5sZW5ndGgpIHtcbiAgICAgICAgdmFyIGN1cnJlbnRJbmRleCA9IGluZGV4O1xuICAgICAgICAvLyBBZHZhbmNlIHRoZSBpbmRleCBiZWZvcmUgY2FsbGluZyB0aGUgdGFzay4gVGhpcyBlbnN1cmVzIHRoYXQgd2Ugd2lsbFxuICAgICAgICAvLyBiZWdpbiBmbHVzaGluZyBvbiB0aGUgbmV4dCB0YXNrIHRoZSB0YXNrIHRocm93cyBhbiBlcnJvci5cbiAgICAgICAgaW5kZXggPSBpbmRleCArIDE7XG4gICAgICAgIHF1ZXVlW2N1cnJlbnRJbmRleF0uY2FsbCgpO1xuICAgICAgICAvLyBQcmV2ZW50IGxlYWtpbmcgbWVtb3J5IGZvciBsb25nIGNoYWlucyBvZiByZWN1cnNpdmUgY2FsbHMgdG8gYGFzYXBgLlxuICAgICAgICAvLyBJZiB3ZSBjYWxsIGBhc2FwYCB3aXRoaW4gdGFza3Mgc2NoZWR1bGVkIGJ5IGBhc2FwYCwgdGhlIHF1ZXVlIHdpbGxcbiAgICAgICAgLy8gZ3JvdywgYnV0IHRvIGF2b2lkIGFuIE8obikgd2FsayBmb3IgZXZlcnkgdGFzayB3ZSBleGVjdXRlLCB3ZSBkb24ndFxuICAgICAgICAvLyBzaGlmdCB0YXNrcyBvZmYgdGhlIHF1ZXVlIGFmdGVyIHRoZXkgaGF2ZSBiZWVuIGV4ZWN1dGVkLlxuICAgICAgICAvLyBJbnN0ZWFkLCB3ZSBwZXJpb2RpY2FsbHkgc2hpZnQgMTAyNCB0YXNrcyBvZmYgdGhlIHF1ZXVlLlxuICAgICAgICBpZiAoaW5kZXggPiBjYXBhY2l0eSkge1xuICAgICAgICAgICAgLy8gTWFudWFsbHkgc2hpZnQgYWxsIHZhbHVlcyBzdGFydGluZyBhdCB0aGUgaW5kZXggYmFjayB0byB0aGVcbiAgICAgICAgICAgIC8vIGJlZ2lubmluZyBvZiB0aGUgcXVldWUuXG4gICAgICAgICAgICBmb3IgKHZhciBzY2FuID0gMCwgbmV3TGVuZ3RoID0gcXVldWUubGVuZ3RoIC0gaW5kZXg7IHNjYW4gPCBuZXdMZW5ndGg7IHNjYW4rKykge1xuICAgICAgICAgICAgICAgIHF1ZXVlW3NjYW5dID0gcXVldWVbc2NhbiArIGluZGV4XTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHF1ZXVlLmxlbmd0aCAtPSBpbmRleDtcbiAgICAgICAgICAgIGluZGV4ID0gMDtcbiAgICAgICAgfVxuICAgIH1cbiAgICBxdWV1ZS5sZW5ndGggPSAwO1xuICAgIGluZGV4ID0gMDtcbiAgICBmbHVzaGluZyA9IGZhbHNlO1xufVxuXG4vLyBgcmVxdWVzdEZsdXNoYCBpcyBpbXBsZW1lbnRlZCB1c2luZyBhIHN0cmF0ZWd5IGJhc2VkIG9uIGRhdGEgY29sbGVjdGVkIGZyb21cbi8vIGV2ZXJ5IGF2YWlsYWJsZSBTYXVjZUxhYnMgU2VsZW5pdW0gd2ViIGRyaXZlciB3b3JrZXIgYXQgdGltZSBvZiB3cml0aW5nLlxuLy8gaHR0cHM6Ly9kb2NzLmdvb2dsZS5jb20vc3ByZWFkc2hlZXRzL2QvMW1HLTVVWUd1cDVxeEdkRU1Xa2hQNkJXQ3owNTNOVWIyRTFRb1VUVTE2dUEvZWRpdCNnaWQ9NzgzNzI0NTkzXG5cbi8vIFNhZmFyaSA2IGFuZCA2LjEgZm9yIGRlc2t0b3AsIGlQYWQsIGFuZCBpUGhvbmUgYXJlIHRoZSBvbmx5IGJyb3dzZXJzIHRoYXRcbi8vIGhhdmUgV2ViS2l0TXV0YXRpb25PYnNlcnZlciBidXQgbm90IHVuLXByZWZpeGVkIE11dGF0aW9uT2JzZXJ2ZXIuXG4vLyBNdXN0IHVzZSBgZ2xvYmFsYCBvciBgc2VsZmAgaW5zdGVhZCBvZiBgd2luZG93YCB0byB3b3JrIGluIGJvdGggZnJhbWVzIGFuZCB3ZWJcbi8vIHdvcmtlcnMuIGBnbG9iYWxgIGlzIGEgcHJvdmlzaW9uIG9mIEJyb3dzZXJpZnksIE1yLCBNcnMsIG9yIE1vcC5cblxuLyogZ2xvYmFscyBzZWxmICovXG52YXIgc2NvcGUgPSB0eXBlb2YgZ2xvYmFsICE9PSBcInVuZGVmaW5lZFwiID8gZ2xvYmFsIDogc2VsZjtcbnZhciBCcm93c2VyTXV0YXRpb25PYnNlcnZlciA9IHNjb3BlLk11dGF0aW9uT2JzZXJ2ZXIgfHwgc2NvcGUuV2ViS2l0TXV0YXRpb25PYnNlcnZlcjtcblxuLy8gTXV0YXRpb25PYnNlcnZlcnMgYXJlIGRlc2lyYWJsZSBiZWNhdXNlIHRoZXkgaGF2ZSBoaWdoIHByaW9yaXR5IGFuZCB3b3JrXG4vLyByZWxpYWJseSBldmVyeXdoZXJlIHRoZXkgYXJlIGltcGxlbWVudGVkLlxuLy8gVGhleSBhcmUgaW1wbGVtZW50ZWQgaW4gYWxsIG1vZGVybiBicm93c2Vycy5cbi8vXG4vLyAtIEFuZHJvaWQgNC00LjNcbi8vIC0gQ2hyb21lIDI2LTM0XG4vLyAtIEZpcmVmb3ggMTQtMjlcbi8vIC0gSW50ZXJuZXQgRXhwbG9yZXIgMTFcbi8vIC0gaVBhZCBTYWZhcmkgNi03LjFcbi8vIC0gaVBob25lIFNhZmFyaSA3LTcuMVxuLy8gLSBTYWZhcmkgNi03XG5pZiAodHlwZW9mIEJyb3dzZXJNdXRhdGlvbk9ic2VydmVyID09PSBcImZ1bmN0aW9uXCIpIHtcbiAgICByZXF1ZXN0Rmx1c2ggPSBtYWtlUmVxdWVzdENhbGxGcm9tTXV0YXRpb25PYnNlcnZlcihmbHVzaCk7XG5cbi8vIE1lc3NhZ2VDaGFubmVscyBhcmUgZGVzaXJhYmxlIGJlY2F1c2UgdGhleSBnaXZlIGRpcmVjdCBhY2Nlc3MgdG8gdGhlIEhUTUxcbi8vIHRhc2sgcXVldWUsIGFyZSBpbXBsZW1lbnRlZCBpbiBJbnRlcm5ldCBFeHBsb3JlciAxMCwgU2FmYXJpIDUuMC0xLCBhbmQgT3BlcmFcbi8vIDExLTEyLCBhbmQgaW4gd2ViIHdvcmtlcnMgaW4gbWFueSBlbmdpbmVzLlxuLy8gQWx0aG91Z2ggbWVzc2FnZSBjaGFubmVscyB5aWVsZCB0byBhbnkgcXVldWVkIHJlbmRlcmluZyBhbmQgSU8gdGFza3MsIHRoZXlcbi8vIHdvdWxkIGJlIGJldHRlciB0aGFuIGltcG9zaW5nIHRoZSA0bXMgZGVsYXkgb2YgdGltZXJzLlxuLy8gSG93ZXZlciwgdGhleSBkbyBub3Qgd29yayByZWxpYWJseSBpbiBJbnRlcm5ldCBFeHBsb3JlciBvciBTYWZhcmkuXG5cbi8vIEludGVybmV0IEV4cGxvcmVyIDEwIGlzIHRoZSBvbmx5IGJyb3dzZXIgdGhhdCBoYXMgc2V0SW1tZWRpYXRlIGJ1dCBkb2VzXG4vLyBub3QgaGF2ZSBNdXRhdGlvbk9ic2VydmVycy5cbi8vIEFsdGhvdWdoIHNldEltbWVkaWF0ZSB5aWVsZHMgdG8gdGhlIGJyb3dzZXIncyByZW5kZXJlciwgaXQgd291bGQgYmVcbi8vIHByZWZlcnJhYmxlIHRvIGZhbGxpbmcgYmFjayB0byBzZXRUaW1lb3V0IHNpbmNlIGl0IGRvZXMgbm90IGhhdmVcbi8vIHRoZSBtaW5pbXVtIDRtcyBwZW5hbHR5LlxuLy8gVW5mb3J0dW5hdGVseSB0aGVyZSBhcHBlYXJzIHRvIGJlIGEgYnVnIGluIEludGVybmV0IEV4cGxvcmVyIDEwIE1vYmlsZSAoYW5kXG4vLyBEZXNrdG9wIHRvIGEgbGVzc2VyIGV4dGVudCkgdGhhdCByZW5kZXJzIGJvdGggc2V0SW1tZWRpYXRlIGFuZFxuLy8gTWVzc2FnZUNoYW5uZWwgdXNlbGVzcyBmb3IgdGhlIHB1cnBvc2VzIG9mIEFTQVAuXG4vLyBodHRwczovL2dpdGh1Yi5jb20va3Jpc2tvd2FsL3EvaXNzdWVzLzM5NlxuXG4vLyBUaW1lcnMgYXJlIGltcGxlbWVudGVkIHVuaXZlcnNhbGx5LlxuLy8gV2UgZmFsbCBiYWNrIHRvIHRpbWVycyBpbiB3b3JrZXJzIGluIG1vc3QgZW5naW5lcywgYW5kIGluIGZvcmVncm91bmRcbi8vIGNvbnRleHRzIGluIHRoZSBmb2xsb3dpbmcgYnJvd3NlcnMuXG4vLyBIb3dldmVyLCBub3RlIHRoYXQgZXZlbiB0aGlzIHNpbXBsZSBjYXNlIHJlcXVpcmVzIG51YW5jZXMgdG8gb3BlcmF0ZSBpbiBhXG4vLyBicm9hZCBzcGVjdHJ1bSBvZiBicm93c2Vycy5cbi8vXG4vLyAtIEZpcmVmb3ggMy0xM1xuLy8gLSBJbnRlcm5ldCBFeHBsb3JlciA2LTlcbi8vIC0gaVBhZCBTYWZhcmkgNC4zXG4vLyAtIEx5bnggMi44Ljdcbn0gZWxzZSB7XG4gICAgcmVxdWVzdEZsdXNoID0gbWFrZVJlcXVlc3RDYWxsRnJvbVRpbWVyKGZsdXNoKTtcbn1cblxuLy8gYHJlcXVlc3RGbHVzaGAgcmVxdWVzdHMgdGhhdCB0aGUgaGlnaCBwcmlvcml0eSBldmVudCBxdWV1ZSBiZSBmbHVzaGVkIGFzXG4vLyBzb29uIGFzIHBvc3NpYmxlLlxuLy8gVGhpcyBpcyB1c2VmdWwgdG8gcHJldmVudCBhbiBlcnJvciB0aHJvd24gaW4gYSB0YXNrIGZyb20gc3RhbGxpbmcgdGhlIGV2ZW50XG4vLyBxdWV1ZSBpZiB0aGUgZXhjZXB0aW9uIGhhbmRsZWQgYnkgTm9kZS5qc+KAmXNcbi8vIGBwcm9jZXNzLm9uKFwidW5jYXVnaHRFeGNlcHRpb25cIilgIG9yIGJ5IGEgZG9tYWluLlxucmF3QXNhcC5yZXF1ZXN0Rmx1c2ggPSByZXF1ZXN0Rmx1c2g7XG5cbi8vIFRvIHJlcXVlc3QgYSBoaWdoIHByaW9yaXR5IGV2ZW50LCB3ZSBpbmR1Y2UgYSBtdXRhdGlvbiBvYnNlcnZlciBieSB0b2dnbGluZ1xuLy8gdGhlIHRleHQgb2YgYSB0ZXh0IG5vZGUgYmV0d2VlbiBcIjFcIiBhbmQgXCItMVwiLlxuZnVuY3Rpb24gbWFrZVJlcXVlc3RDYWxsRnJvbU11dGF0aW9uT2JzZXJ2ZXIoY2FsbGJhY2spIHtcbiAgICB2YXIgdG9nZ2xlID0gMTtcbiAgICB2YXIgb2JzZXJ2ZXIgPSBuZXcgQnJvd3Nlck11dGF0aW9uT2JzZXJ2ZXIoY2FsbGJhY2spO1xuICAgIHZhciBub2RlID0gZG9jdW1lbnQuY3JlYXRlVGV4dE5vZGUoXCJcIik7XG4gICAgb2JzZXJ2ZXIub2JzZXJ2ZShub2RlLCB7Y2hhcmFjdGVyRGF0YTogdHJ1ZX0pO1xuICAgIHJldHVybiBmdW5jdGlvbiByZXF1ZXN0Q2FsbCgpIHtcbiAgICAgICAgdG9nZ2xlID0gLXRvZ2dsZTtcbiAgICAgICAgbm9kZS5kYXRhID0gdG9nZ2xlO1xuICAgIH07XG59XG5cbi8vIFRoZSBtZXNzYWdlIGNoYW5uZWwgdGVjaG5pcXVlIHdhcyBkaXNjb3ZlcmVkIGJ5IE1hbHRlIFVibCBhbmQgd2FzIHRoZVxuLy8gb3JpZ2luYWwgZm91bmRhdGlvbiBmb3IgdGhpcyBsaWJyYXJ5LlxuLy8gaHR0cDovL3d3dy5ub25ibG9ja2luZy5pby8yMDExLzA2L3dpbmRvd25leHR0aWNrLmh0bWxcblxuLy8gU2FmYXJpIDYuMC41IChhdCBsZWFzdCkgaW50ZXJtaXR0ZW50bHkgZmFpbHMgdG8gY3JlYXRlIG1lc3NhZ2UgcG9ydHMgb24gYVxuLy8gcGFnZSdzIGZpcnN0IGxvYWQuIFRoYW5rZnVsbHksIHRoaXMgdmVyc2lvbiBvZiBTYWZhcmkgc3VwcG9ydHNcbi8vIE11dGF0aW9uT2JzZXJ2ZXJzLCBzbyB3ZSBkb24ndCBuZWVkIHRvIGZhbGwgYmFjayBpbiB0aGF0IGNhc2UuXG5cbi8vIGZ1bmN0aW9uIG1ha2VSZXF1ZXN0Q2FsbEZyb21NZXNzYWdlQ2hhbm5lbChjYWxsYmFjaykge1xuLy8gICAgIHZhciBjaGFubmVsID0gbmV3IE1lc3NhZ2VDaGFubmVsKCk7XG4vLyAgICAgY2hhbm5lbC5wb3J0MS5vbm1lc3NhZ2UgPSBjYWxsYmFjaztcbi8vICAgICByZXR1cm4gZnVuY3Rpb24gcmVxdWVzdENhbGwoKSB7XG4vLyAgICAgICAgIGNoYW5uZWwucG9ydDIucG9zdE1lc3NhZ2UoMCk7XG4vLyAgICAgfTtcbi8vIH1cblxuLy8gRm9yIHJlYXNvbnMgZXhwbGFpbmVkIGFib3ZlLCB3ZSBhcmUgYWxzbyB1bmFibGUgdG8gdXNlIGBzZXRJbW1lZGlhdGVgXG4vLyB1bmRlciBhbnkgY2lyY3Vtc3RhbmNlcy5cbi8vIEV2ZW4gaWYgd2Ugd2VyZSwgdGhlcmUgaXMgYW5vdGhlciBidWcgaW4gSW50ZXJuZXQgRXhwbG9yZXIgMTAuXG4vLyBJdCBpcyBub3Qgc3VmZmljaWVudCB0byBhc3NpZ24gYHNldEltbWVkaWF0ZWAgdG8gYHJlcXVlc3RGbHVzaGAgYmVjYXVzZVxuLy8gYHNldEltbWVkaWF0ZWAgbXVzdCBiZSBjYWxsZWQgKmJ5IG5hbWUqIGFuZCB0aGVyZWZvcmUgbXVzdCBiZSB3cmFwcGVkIGluIGFcbi8vIGNsb3N1cmUuXG4vLyBOZXZlciBmb3JnZXQuXG5cbi8vIGZ1bmN0aW9uIG1ha2VSZXF1ZXN0Q2FsbEZyb21TZXRJbW1lZGlhdGUoY2FsbGJhY2spIHtcbi8vICAgICByZXR1cm4gZnVuY3Rpb24gcmVxdWVzdENhbGwoKSB7XG4vLyAgICAgICAgIHNldEltbWVkaWF0ZShjYWxsYmFjayk7XG4vLyAgICAgfTtcbi8vIH1cblxuLy8gU2FmYXJpIDYuMCBoYXMgYSBwcm9ibGVtIHdoZXJlIHRpbWVycyB3aWxsIGdldCBsb3N0IHdoaWxlIHRoZSB1c2VyIGlzXG4vLyBzY3JvbGxpbmcuIFRoaXMgcHJvYmxlbSBkb2VzIG5vdCBpbXBhY3QgQVNBUCBiZWNhdXNlIFNhZmFyaSA2LjAgc3VwcG9ydHNcbi8vIG11dGF0aW9uIG9ic2VydmVycywgc28gdGhhdCBpbXBsZW1lbnRhdGlvbiBpcyB1c2VkIGluc3RlYWQuXG4vLyBIb3dldmVyLCBpZiB3ZSBldmVyIGVsZWN0IHRvIHVzZSB0aW1lcnMgaW4gU2FmYXJpLCB0aGUgcHJldmFsZW50IHdvcmstYXJvdW5kXG4vLyBpcyB0byBhZGQgYSBzY3JvbGwgZXZlbnQgbGlzdGVuZXIgdGhhdCBjYWxscyBmb3IgYSBmbHVzaC5cblxuLy8gYHNldFRpbWVvdXRgIGRvZXMgbm90IGNhbGwgdGhlIHBhc3NlZCBjYWxsYmFjayBpZiB0aGUgZGVsYXkgaXMgbGVzcyB0aGFuXG4vLyBhcHByb3hpbWF0ZWx5IDcgaW4gd2ViIHdvcmtlcnMgaW4gRmlyZWZveCA4IHRocm91Z2ggMTgsIGFuZCBzb21ldGltZXMgbm90XG4vLyBldmVuIHRoZW4uXG5cbmZ1bmN0aW9uIG1ha2VSZXF1ZXN0Q2FsbEZyb21UaW1lcihjYWxsYmFjaykge1xuICAgIHJldHVybiBmdW5jdGlvbiByZXF1ZXN0Q2FsbCgpIHtcbiAgICAgICAgLy8gV2UgZGlzcGF0Y2ggYSB0aW1lb3V0IHdpdGggYSBzcGVjaWZpZWQgZGVsYXkgb2YgMCBmb3IgZW5naW5lcyB0aGF0XG4gICAgICAgIC8vIGNhbiByZWxpYWJseSBhY2NvbW1vZGF0ZSB0aGF0IHJlcXVlc3QuIFRoaXMgd2lsbCB1c3VhbGx5IGJlIHNuYXBwZWRcbiAgICAgICAgLy8gdG8gYSA0IG1pbGlzZWNvbmQgZGVsYXksIGJ1dCBvbmNlIHdlJ3JlIGZsdXNoaW5nLCB0aGVyZSdzIG5vIGRlbGF5XG4gICAgICAgIC8vIGJldHdlZW4gZXZlbnRzLlxuICAgICAgICB2YXIgdGltZW91dEhhbmRsZSA9IHNldFRpbWVvdXQoaGFuZGxlVGltZXIsIDApO1xuICAgICAgICAvLyBIb3dldmVyLCBzaW5jZSB0aGlzIHRpbWVyIGdldHMgZnJlcXVlbnRseSBkcm9wcGVkIGluIEZpcmVmb3hcbiAgICAgICAgLy8gd29ya2Vycywgd2UgZW5saXN0IGFuIGludGVydmFsIGhhbmRsZSB0aGF0IHdpbGwgdHJ5IHRvIGZpcmVcbiAgICAgICAgLy8gYW4gZXZlbnQgMjAgdGltZXMgcGVyIHNlY29uZCB1bnRpbCBpdCBzdWNjZWVkcy5cbiAgICAgICAgdmFyIGludGVydmFsSGFuZGxlID0gc2V0SW50ZXJ2YWwoaGFuZGxlVGltZXIsIDUwKTtcblxuICAgICAgICBmdW5jdGlvbiBoYW5kbGVUaW1lcigpIHtcbiAgICAgICAgICAgIC8vIFdoaWNoZXZlciB0aW1lciBzdWNjZWVkcyB3aWxsIGNhbmNlbCBib3RoIHRpbWVycyBhbmRcbiAgICAgICAgICAgIC8vIGV4ZWN1dGUgdGhlIGNhbGxiYWNrLlxuICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVvdXRIYW5kbGUpO1xuICAgICAgICAgICAgY2xlYXJJbnRlcnZhbChpbnRlcnZhbEhhbmRsZSk7XG4gICAgICAgICAgICBjYWxsYmFjaygpO1xuICAgICAgICB9XG4gICAgfTtcbn1cblxuLy8gVGhpcyBpcyBmb3IgYGFzYXAuanNgIG9ubHkuXG4vLyBJdHMgbmFtZSB3aWxsIGJlIHBlcmlvZGljYWxseSByYW5kb21pemVkIHRvIGJyZWFrIGFueSBjb2RlIHRoYXQgZGVwZW5kcyBvblxuLy8gaXRzIGV4aXN0ZW5jZS5cbnJhd0FzYXAubWFrZVJlcXVlc3RDYWxsRnJvbVRpbWVyID0gbWFrZVJlcXVlc3RDYWxsRnJvbVRpbWVyO1xuXG4vLyBBU0FQIHdhcyBvcmlnaW5hbGx5IGEgbmV4dFRpY2sgc2hpbSBpbmNsdWRlZCBpbiBRLiBUaGlzIHdhcyBmYWN0b3JlZCBvdXRcbi8vIGludG8gdGhpcyBBU0FQIHBhY2thZ2UuIEl0IHdhcyBsYXRlciBhZGFwdGVkIHRvIFJTVlAgd2hpY2ggbWFkZSBmdXJ0aGVyXG4vLyBhbWVuZG1lbnRzLiBUaGVzZSBkZWNpc2lvbnMsIHBhcnRpY3VsYXJseSB0byBtYXJnaW5hbGl6ZSBNZXNzYWdlQ2hhbm5lbCBhbmRcbi8vIHRvIGNhcHR1cmUgdGhlIE11dGF0aW9uT2JzZXJ2ZXIgaW1wbGVtZW50YXRpb24gaW4gYSBjbG9zdXJlLCB3ZXJlIGludGVncmF0ZWRcbi8vIGJhY2sgaW50byBBU0FQIHByb3Blci5cbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS90aWxkZWlvL3JzdnAuanMvYmxvYi9jZGRmNzIzMjU0NmE5Y2Y4NTg1MjRiNzVjZGU2ZjllZGY3MjYyMGE3L2xpYi9yc3ZwL2FzYXAuanNcbiIsIid1c2Ugc3RyaWN0J1xuXG5leHBvcnRzLmJ5dGVMZW5ndGggPSBieXRlTGVuZ3RoXG5leHBvcnRzLnRvQnl0ZUFycmF5ID0gdG9CeXRlQXJyYXlcbmV4cG9ydHMuZnJvbUJ5dGVBcnJheSA9IGZyb21CeXRlQXJyYXlcblxudmFyIGxvb2t1cCA9IFtdXG52YXIgcmV2TG9va3VwID0gW11cbnZhciBBcnIgPSB0eXBlb2YgVWludDhBcnJheSAhPT0gJ3VuZGVmaW5lZCcgPyBVaW50OEFycmF5IDogQXJyYXlcblxudmFyIGNvZGUgPSAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLydcbmZvciAodmFyIGkgPSAwLCBsZW4gPSBjb2RlLmxlbmd0aDsgaSA8IGxlbjsgKytpKSB7XG4gIGxvb2t1cFtpXSA9IGNvZGVbaV1cbiAgcmV2TG9va3VwW2NvZGUuY2hhckNvZGVBdChpKV0gPSBpXG59XG5cbnJldkxvb2t1cFsnLScuY2hhckNvZGVBdCgwKV0gPSA2MlxucmV2TG9va3VwWydfJy5jaGFyQ29kZUF0KDApXSA9IDYzXG5cbmZ1bmN0aW9uIHBsYWNlSG9sZGVyc0NvdW50IChiNjQpIHtcbiAgdmFyIGxlbiA9IGI2NC5sZW5ndGhcbiAgaWYgKGxlbiAlIDQgPiAwKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIHN0cmluZy4gTGVuZ3RoIG11c3QgYmUgYSBtdWx0aXBsZSBvZiA0JylcbiAgfVxuXG4gIC8vIHRoZSBudW1iZXIgb2YgZXF1YWwgc2lnbnMgKHBsYWNlIGhvbGRlcnMpXG4gIC8vIGlmIHRoZXJlIGFyZSB0d28gcGxhY2Vob2xkZXJzLCB0aGFuIHRoZSB0d28gY2hhcmFjdGVycyBiZWZvcmUgaXRcbiAgLy8gcmVwcmVzZW50IG9uZSBieXRlXG4gIC8vIGlmIHRoZXJlIGlzIG9ubHkgb25lLCB0aGVuIHRoZSB0aHJlZSBjaGFyYWN0ZXJzIGJlZm9yZSBpdCByZXByZXNlbnQgMiBieXRlc1xuICAvLyB0aGlzIGlzIGp1c3QgYSBjaGVhcCBoYWNrIHRvIG5vdCBkbyBpbmRleE9mIHR3aWNlXG4gIHJldHVybiBiNjRbbGVuIC0gMl0gPT09ICc9JyA/IDIgOiBiNjRbbGVuIC0gMV0gPT09ICc9JyA/IDEgOiAwXG59XG5cbmZ1bmN0aW9uIGJ5dGVMZW5ndGggKGI2NCkge1xuICAvLyBiYXNlNjQgaXMgNC8zICsgdXAgdG8gdHdvIGNoYXJhY3RlcnMgb2YgdGhlIG9yaWdpbmFsIGRhdGFcbiAgcmV0dXJuIGI2NC5sZW5ndGggKiAzIC8gNCAtIHBsYWNlSG9sZGVyc0NvdW50KGI2NClcbn1cblxuZnVuY3Rpb24gdG9CeXRlQXJyYXkgKGI2NCkge1xuICB2YXIgaSwgaiwgbCwgdG1wLCBwbGFjZUhvbGRlcnMsIGFyclxuICB2YXIgbGVuID0gYjY0Lmxlbmd0aFxuICBwbGFjZUhvbGRlcnMgPSBwbGFjZUhvbGRlcnNDb3VudChiNjQpXG5cbiAgYXJyID0gbmV3IEFycihsZW4gKiAzIC8gNCAtIHBsYWNlSG9sZGVycylcblxuICAvLyBpZiB0aGVyZSBhcmUgcGxhY2Vob2xkZXJzLCBvbmx5IGdldCB1cCB0byB0aGUgbGFzdCBjb21wbGV0ZSA0IGNoYXJzXG4gIGwgPSBwbGFjZUhvbGRlcnMgPiAwID8gbGVuIC0gNCA6IGxlblxuXG4gIHZhciBMID0gMFxuXG4gIGZvciAoaSA9IDAsIGogPSAwOyBpIDwgbDsgaSArPSA0LCBqICs9IDMpIHtcbiAgICB0bXAgPSAocmV2TG9va3VwW2I2NC5jaGFyQ29kZUF0KGkpXSA8PCAxOCkgfCAocmV2TG9va3VwW2I2NC5jaGFyQ29kZUF0KGkgKyAxKV0gPDwgMTIpIHwgKHJldkxvb2t1cFtiNjQuY2hhckNvZGVBdChpICsgMildIDw8IDYpIHwgcmV2TG9va3VwW2I2NC5jaGFyQ29kZUF0KGkgKyAzKV1cbiAgICBhcnJbTCsrXSA9ICh0bXAgPj4gMTYpICYgMHhGRlxuICAgIGFycltMKytdID0gKHRtcCA+PiA4KSAmIDB4RkZcbiAgICBhcnJbTCsrXSA9IHRtcCAmIDB4RkZcbiAgfVxuXG4gIGlmIChwbGFjZUhvbGRlcnMgPT09IDIpIHtcbiAgICB0bXAgPSAocmV2TG9va3VwW2I2NC5jaGFyQ29kZUF0KGkpXSA8PCAyKSB8IChyZXZMb29rdXBbYjY0LmNoYXJDb2RlQXQoaSArIDEpXSA+PiA0KVxuICAgIGFycltMKytdID0gdG1wICYgMHhGRlxuICB9IGVsc2UgaWYgKHBsYWNlSG9sZGVycyA9PT0gMSkge1xuICAgIHRtcCA9IChyZXZMb29rdXBbYjY0LmNoYXJDb2RlQXQoaSldIDw8IDEwKSB8IChyZXZMb29rdXBbYjY0LmNoYXJDb2RlQXQoaSArIDEpXSA8PCA0KSB8IChyZXZMb29rdXBbYjY0LmNoYXJDb2RlQXQoaSArIDIpXSA+PiAyKVxuICAgIGFycltMKytdID0gKHRtcCA+PiA4KSAmIDB4RkZcbiAgICBhcnJbTCsrXSA9IHRtcCAmIDB4RkZcbiAgfVxuXG4gIHJldHVybiBhcnJcbn1cblxuZnVuY3Rpb24gdHJpcGxldFRvQmFzZTY0IChudW0pIHtcbiAgcmV0dXJuIGxvb2t1cFtudW0gPj4gMTggJiAweDNGXSArIGxvb2t1cFtudW0gPj4gMTIgJiAweDNGXSArIGxvb2t1cFtudW0gPj4gNiAmIDB4M0ZdICsgbG9va3VwW251bSAmIDB4M0ZdXG59XG5cbmZ1bmN0aW9uIGVuY29kZUNodW5rICh1aW50OCwgc3RhcnQsIGVuZCkge1xuICB2YXIgdG1wXG4gIHZhciBvdXRwdXQgPSBbXVxuICBmb3IgKHZhciBpID0gc3RhcnQ7IGkgPCBlbmQ7IGkgKz0gMykge1xuICAgIHRtcCA9ICh1aW50OFtpXSA8PCAxNikgKyAodWludDhbaSArIDFdIDw8IDgpICsgKHVpbnQ4W2kgKyAyXSlcbiAgICBvdXRwdXQucHVzaCh0cmlwbGV0VG9CYXNlNjQodG1wKSlcbiAgfVxuICByZXR1cm4gb3V0cHV0LmpvaW4oJycpXG59XG5cbmZ1bmN0aW9uIGZyb21CeXRlQXJyYXkgKHVpbnQ4KSB7XG4gIHZhciB0bXBcbiAgdmFyIGxlbiA9IHVpbnQ4Lmxlbmd0aFxuICB2YXIgZXh0cmFCeXRlcyA9IGxlbiAlIDMgLy8gaWYgd2UgaGF2ZSAxIGJ5dGUgbGVmdCwgcGFkIDIgYnl0ZXNcbiAgdmFyIG91dHB1dCA9ICcnXG4gIHZhciBwYXJ0cyA9IFtdXG4gIHZhciBtYXhDaHVua0xlbmd0aCA9IDE2MzgzIC8vIG11c3QgYmUgbXVsdGlwbGUgb2YgM1xuXG4gIC8vIGdvIHRocm91Z2ggdGhlIGFycmF5IGV2ZXJ5IHRocmVlIGJ5dGVzLCB3ZSdsbCBkZWFsIHdpdGggdHJhaWxpbmcgc3R1ZmYgbGF0ZXJcbiAgZm9yICh2YXIgaSA9IDAsIGxlbjIgPSBsZW4gLSBleHRyYUJ5dGVzOyBpIDwgbGVuMjsgaSArPSBtYXhDaHVua0xlbmd0aCkge1xuICAgIHBhcnRzLnB1c2goZW5jb2RlQ2h1bmsodWludDgsIGksIChpICsgbWF4Q2h1bmtMZW5ndGgpID4gbGVuMiA/IGxlbjIgOiAoaSArIG1heENodW5rTGVuZ3RoKSkpXG4gIH1cblxuICAvLyBwYWQgdGhlIGVuZCB3aXRoIHplcm9zLCBidXQgbWFrZSBzdXJlIHRvIG5vdCBmb3JnZXQgdGhlIGV4dHJhIGJ5dGVzXG4gIGlmIChleHRyYUJ5dGVzID09PSAxKSB7XG4gICAgdG1wID0gdWludDhbbGVuIC0gMV1cbiAgICBvdXRwdXQgKz0gbG9va3VwW3RtcCA+PiAyXVxuICAgIG91dHB1dCArPSBsb29rdXBbKHRtcCA8PCA0KSAmIDB4M0ZdXG4gICAgb3V0cHV0ICs9ICc9PSdcbiAgfSBlbHNlIGlmIChleHRyYUJ5dGVzID09PSAyKSB7XG4gICAgdG1wID0gKHVpbnQ4W2xlbiAtIDJdIDw8IDgpICsgKHVpbnQ4W2xlbiAtIDFdKVxuICAgIG91dHB1dCArPSBsb29rdXBbdG1wID4+IDEwXVxuICAgIG91dHB1dCArPSBsb29rdXBbKHRtcCA+PiA0KSAmIDB4M0ZdXG4gICAgb3V0cHV0ICs9IGxvb2t1cFsodG1wIDw8IDIpICYgMHgzRl1cbiAgICBvdXRwdXQgKz0gJz0nXG4gIH1cblxuICBwYXJ0cy5wdXNoKG91dHB1dClcblxuICByZXR1cm4gcGFydHMuam9pbignJylcbn1cbiIsIiIsIi8qIVxuICogVGhlIGJ1ZmZlciBtb2R1bGUgZnJvbSBub2RlLmpzLCBmb3IgdGhlIGJyb3dzZXIuXG4gKlxuICogQGF1dGhvciAgIEZlcm9zcyBBYm91a2hhZGlqZWggPGZlcm9zc0BmZXJvc3Mub3JnPiA8aHR0cDovL2Zlcm9zcy5vcmc+XG4gKiBAbGljZW5zZSAgTUlUXG4gKi9cbi8qIGVzbGludC1kaXNhYmxlIG5vLXByb3RvICovXG5cbid1c2Ugc3RyaWN0J1xuXG52YXIgYmFzZTY0ID0gcmVxdWlyZSgnYmFzZTY0LWpzJylcbnZhciBpZWVlNzU0ID0gcmVxdWlyZSgnaWVlZTc1NCcpXG52YXIgaXNBcnJheSA9IHJlcXVpcmUoJ2lzYXJyYXknKVxuXG5leHBvcnRzLkJ1ZmZlciA9IEJ1ZmZlclxuZXhwb3J0cy5TbG93QnVmZmVyID0gU2xvd0J1ZmZlclxuZXhwb3J0cy5JTlNQRUNUX01BWF9CWVRFUyA9IDUwXG5cbi8qKlxuICogSWYgYEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUYDpcbiAqICAgPT09IHRydWUgICAgVXNlIFVpbnQ4QXJyYXkgaW1wbGVtZW50YXRpb24gKGZhc3Rlc3QpXG4gKiAgID09PSBmYWxzZSAgIFVzZSBPYmplY3QgaW1wbGVtZW50YXRpb24gKG1vc3QgY29tcGF0aWJsZSwgZXZlbiBJRTYpXG4gKlxuICogQnJvd3NlcnMgdGhhdCBzdXBwb3J0IHR5cGVkIGFycmF5cyBhcmUgSUUgMTArLCBGaXJlZm94IDQrLCBDaHJvbWUgNyssIFNhZmFyaSA1LjErLFxuICogT3BlcmEgMTEuNissIGlPUyA0LjIrLlxuICpcbiAqIER1ZSB0byB2YXJpb3VzIGJyb3dzZXIgYnVncywgc29tZXRpbWVzIHRoZSBPYmplY3QgaW1wbGVtZW50YXRpb24gd2lsbCBiZSB1c2VkIGV2ZW5cbiAqIHdoZW4gdGhlIGJyb3dzZXIgc3VwcG9ydHMgdHlwZWQgYXJyYXlzLlxuICpcbiAqIE5vdGU6XG4gKlxuICogICAtIEZpcmVmb3ggNC0yOSBsYWNrcyBzdXBwb3J0IGZvciBhZGRpbmcgbmV3IHByb3BlcnRpZXMgdG8gYFVpbnQ4QXJyYXlgIGluc3RhbmNlcyxcbiAqICAgICBTZWU6IGh0dHBzOi8vYnVnemlsbGEubW96aWxsYS5vcmcvc2hvd19idWcuY2dpP2lkPTY5NTQzOC5cbiAqXG4gKiAgIC0gQ2hyb21lIDktMTAgaXMgbWlzc2luZyB0aGUgYFR5cGVkQXJyYXkucHJvdG90eXBlLnN1YmFycmF5YCBmdW5jdGlvbi5cbiAqXG4gKiAgIC0gSUUxMCBoYXMgYSBicm9rZW4gYFR5cGVkQXJyYXkucHJvdG90eXBlLnN1YmFycmF5YCBmdW5jdGlvbiB3aGljaCByZXR1cm5zIGFycmF5cyBvZlxuICogICAgIGluY29ycmVjdCBsZW5ndGggaW4gc29tZSBzaXR1YXRpb25zLlxuXG4gKiBXZSBkZXRlY3QgdGhlc2UgYnVnZ3kgYnJvd3NlcnMgYW5kIHNldCBgQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlRgIHRvIGBmYWxzZWAgc28gdGhleVxuICogZ2V0IHRoZSBPYmplY3QgaW1wbGVtZW50YXRpb24sIHdoaWNoIGlzIHNsb3dlciBidXQgYmVoYXZlcyBjb3JyZWN0bHkuXG4gKi9cbkJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUID0gZ2xvYmFsLlRZUEVEX0FSUkFZX1NVUFBPUlQgIT09IHVuZGVmaW5lZFxuICA/IGdsb2JhbC5UWVBFRF9BUlJBWV9TVVBQT1JUXG4gIDogdHlwZWRBcnJheVN1cHBvcnQoKVxuXG4vKlxuICogRXhwb3J0IGtNYXhMZW5ndGggYWZ0ZXIgdHlwZWQgYXJyYXkgc3VwcG9ydCBpcyBkZXRlcm1pbmVkLlxuICovXG5leHBvcnRzLmtNYXhMZW5ndGggPSBrTWF4TGVuZ3RoKClcblxuZnVuY3Rpb24gdHlwZWRBcnJheVN1cHBvcnQgKCkge1xuICB0cnkge1xuICAgIHZhciBhcnIgPSBuZXcgVWludDhBcnJheSgxKVxuICAgIGFyci5fX3Byb3RvX18gPSB7X19wcm90b19fOiBVaW50OEFycmF5LnByb3RvdHlwZSwgZm9vOiBmdW5jdGlvbiAoKSB7IHJldHVybiA0MiB9fVxuICAgIHJldHVybiBhcnIuZm9vKCkgPT09IDQyICYmIC8vIHR5cGVkIGFycmF5IGluc3RhbmNlcyBjYW4gYmUgYXVnbWVudGVkXG4gICAgICAgIHR5cGVvZiBhcnIuc3ViYXJyYXkgPT09ICdmdW5jdGlvbicgJiYgLy8gY2hyb21lIDktMTAgbGFjayBgc3ViYXJyYXlgXG4gICAgICAgIGFyci5zdWJhcnJheSgxLCAxKS5ieXRlTGVuZ3RoID09PSAwIC8vIGllMTAgaGFzIGJyb2tlbiBgc3ViYXJyYXlgXG4gIH0gY2F0Y2ggKGUpIHtcbiAgICByZXR1cm4gZmFsc2VcbiAgfVxufVxuXG5mdW5jdGlvbiBrTWF4TGVuZ3RoICgpIHtcbiAgcmV0dXJuIEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUXG4gICAgPyAweDdmZmZmZmZmXG4gICAgOiAweDNmZmZmZmZmXG59XG5cbmZ1bmN0aW9uIGNyZWF0ZUJ1ZmZlciAodGhhdCwgbGVuZ3RoKSB7XG4gIGlmIChrTWF4TGVuZ3RoKCkgPCBsZW5ndGgpIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignSW52YWxpZCB0eXBlZCBhcnJheSBsZW5ndGgnKVxuICB9XG4gIGlmIChCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCkge1xuICAgIC8vIFJldHVybiBhbiBhdWdtZW50ZWQgYFVpbnQ4QXJyYXlgIGluc3RhbmNlLCBmb3IgYmVzdCBwZXJmb3JtYW5jZVxuICAgIHRoYXQgPSBuZXcgVWludDhBcnJheShsZW5ndGgpXG4gICAgdGhhdC5fX3Byb3RvX18gPSBCdWZmZXIucHJvdG90eXBlXG4gIH0gZWxzZSB7XG4gICAgLy8gRmFsbGJhY2s6IFJldHVybiBhbiBvYmplY3QgaW5zdGFuY2Ugb2YgdGhlIEJ1ZmZlciBjbGFzc1xuICAgIGlmICh0aGF0ID09PSBudWxsKSB7XG4gICAgICB0aGF0ID0gbmV3IEJ1ZmZlcihsZW5ndGgpXG4gICAgfVxuICAgIHRoYXQubGVuZ3RoID0gbGVuZ3RoXG4gIH1cblxuICByZXR1cm4gdGhhdFxufVxuXG4vKipcbiAqIFRoZSBCdWZmZXIgY29uc3RydWN0b3IgcmV0dXJucyBpbnN0YW5jZXMgb2YgYFVpbnQ4QXJyYXlgIHRoYXQgaGF2ZSB0aGVpclxuICogcHJvdG90eXBlIGNoYW5nZWQgdG8gYEJ1ZmZlci5wcm90b3R5cGVgLiBGdXJ0aGVybW9yZSwgYEJ1ZmZlcmAgaXMgYSBzdWJjbGFzcyBvZlxuICogYFVpbnQ4QXJyYXlgLCBzbyB0aGUgcmV0dXJuZWQgaW5zdGFuY2VzIHdpbGwgaGF2ZSBhbGwgdGhlIG5vZGUgYEJ1ZmZlcmAgbWV0aG9kc1xuICogYW5kIHRoZSBgVWludDhBcnJheWAgbWV0aG9kcy4gU3F1YXJlIGJyYWNrZXQgbm90YXRpb24gd29ya3MgYXMgZXhwZWN0ZWQgLS0gaXRcbiAqIHJldHVybnMgYSBzaW5nbGUgb2N0ZXQuXG4gKlxuICogVGhlIGBVaW50OEFycmF5YCBwcm90b3R5cGUgcmVtYWlucyB1bm1vZGlmaWVkLlxuICovXG5cbmZ1bmN0aW9uIEJ1ZmZlciAoYXJnLCBlbmNvZGluZ09yT2Zmc2V0LCBsZW5ndGgpIHtcbiAgaWYgKCFCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCAmJiAhKHRoaXMgaW5zdGFuY2VvZiBCdWZmZXIpKSB7XG4gICAgcmV0dXJuIG5ldyBCdWZmZXIoYXJnLCBlbmNvZGluZ09yT2Zmc2V0LCBsZW5ndGgpXG4gIH1cblxuICAvLyBDb21tb24gY2FzZS5cbiAgaWYgKHR5cGVvZiBhcmcgPT09ICdudW1iZXInKSB7XG4gICAgaWYgKHR5cGVvZiBlbmNvZGluZ09yT2Zmc2V0ID09PSAnc3RyaW5nJykge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKFxuICAgICAgICAnSWYgZW5jb2RpbmcgaXMgc3BlY2lmaWVkIHRoZW4gdGhlIGZpcnN0IGFyZ3VtZW50IG11c3QgYmUgYSBzdHJpbmcnXG4gICAgICApXG4gICAgfVxuICAgIHJldHVybiBhbGxvY1Vuc2FmZSh0aGlzLCBhcmcpXG4gIH1cbiAgcmV0dXJuIGZyb20odGhpcywgYXJnLCBlbmNvZGluZ09yT2Zmc2V0LCBsZW5ndGgpXG59XG5cbkJ1ZmZlci5wb29sU2l6ZSA9IDgxOTIgLy8gbm90IHVzZWQgYnkgdGhpcyBpbXBsZW1lbnRhdGlvblxuXG4vLyBUT0RPOiBMZWdhY3ksIG5vdCBuZWVkZWQgYW55bW9yZS4gUmVtb3ZlIGluIG5leHQgbWFqb3IgdmVyc2lvbi5cbkJ1ZmZlci5fYXVnbWVudCA9IGZ1bmN0aW9uIChhcnIpIHtcbiAgYXJyLl9fcHJvdG9fXyA9IEJ1ZmZlci5wcm90b3R5cGVcbiAgcmV0dXJuIGFyclxufVxuXG5mdW5jdGlvbiBmcm9tICh0aGF0LCB2YWx1ZSwgZW5jb2RpbmdPck9mZnNldCwgbGVuZ3RoKSB7XG4gIGlmICh0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignXCJ2YWx1ZVwiIGFyZ3VtZW50IG11c3Qgbm90IGJlIGEgbnVtYmVyJylcbiAgfVxuXG4gIGlmICh0eXBlb2YgQXJyYXlCdWZmZXIgIT09ICd1bmRlZmluZWQnICYmIHZhbHVlIGluc3RhbmNlb2YgQXJyYXlCdWZmZXIpIHtcbiAgICByZXR1cm4gZnJvbUFycmF5QnVmZmVyKHRoYXQsIHZhbHVlLCBlbmNvZGluZ09yT2Zmc2V0LCBsZW5ndGgpXG4gIH1cblxuICBpZiAodHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJykge1xuICAgIHJldHVybiBmcm9tU3RyaW5nKHRoYXQsIHZhbHVlLCBlbmNvZGluZ09yT2Zmc2V0KVxuICB9XG5cbiAgcmV0dXJuIGZyb21PYmplY3QodGhhdCwgdmFsdWUpXG59XG5cbi8qKlxuICogRnVuY3Rpb25hbGx5IGVxdWl2YWxlbnQgdG8gQnVmZmVyKGFyZywgZW5jb2RpbmcpIGJ1dCB0aHJvd3MgYSBUeXBlRXJyb3JcbiAqIGlmIHZhbHVlIGlzIGEgbnVtYmVyLlxuICogQnVmZmVyLmZyb20oc3RyWywgZW5jb2RpbmddKVxuICogQnVmZmVyLmZyb20oYXJyYXkpXG4gKiBCdWZmZXIuZnJvbShidWZmZXIpXG4gKiBCdWZmZXIuZnJvbShhcnJheUJ1ZmZlclssIGJ5dGVPZmZzZXRbLCBsZW5ndGhdXSlcbiAqKi9cbkJ1ZmZlci5mcm9tID0gZnVuY3Rpb24gKHZhbHVlLCBlbmNvZGluZ09yT2Zmc2V0LCBsZW5ndGgpIHtcbiAgcmV0dXJuIGZyb20obnVsbCwgdmFsdWUsIGVuY29kaW5nT3JPZmZzZXQsIGxlbmd0aClcbn1cblxuaWYgKEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB7XG4gIEJ1ZmZlci5wcm90b3R5cGUuX19wcm90b19fID0gVWludDhBcnJheS5wcm90b3R5cGVcbiAgQnVmZmVyLl9fcHJvdG9fXyA9IFVpbnQ4QXJyYXlcbiAgaWYgKHR5cGVvZiBTeW1ib2wgIT09ICd1bmRlZmluZWQnICYmIFN5bWJvbC5zcGVjaWVzICYmXG4gICAgICBCdWZmZXJbU3ltYm9sLnNwZWNpZXNdID09PSBCdWZmZXIpIHtcbiAgICAvLyBGaXggc3ViYXJyYXkoKSBpbiBFUzIwMTYuIFNlZTogaHR0cHM6Ly9naXRodWIuY29tL2Zlcm9zcy9idWZmZXIvcHVsbC85N1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShCdWZmZXIsIFN5bWJvbC5zcGVjaWVzLCB7XG4gICAgICB2YWx1ZTogbnVsbCxcbiAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZVxuICAgIH0pXG4gIH1cbn1cblxuZnVuY3Rpb24gYXNzZXJ0U2l6ZSAoc2l6ZSkge1xuICBpZiAodHlwZW9mIHNpemUgIT09ICdudW1iZXInKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignXCJzaXplXCIgYXJndW1lbnQgbXVzdCBiZSBhIG51bWJlcicpXG4gIH0gZWxzZSBpZiAoc2l6ZSA8IDApIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignXCJzaXplXCIgYXJndW1lbnQgbXVzdCBub3QgYmUgbmVnYXRpdmUnKVxuICB9XG59XG5cbmZ1bmN0aW9uIGFsbG9jICh0aGF0LCBzaXplLCBmaWxsLCBlbmNvZGluZykge1xuICBhc3NlcnRTaXplKHNpemUpXG4gIGlmIChzaXplIDw9IDApIHtcbiAgICByZXR1cm4gY3JlYXRlQnVmZmVyKHRoYXQsIHNpemUpXG4gIH1cbiAgaWYgKGZpbGwgIT09IHVuZGVmaW5lZCkge1xuICAgIC8vIE9ubHkgcGF5IGF0dGVudGlvbiB0byBlbmNvZGluZyBpZiBpdCdzIGEgc3RyaW5nLiBUaGlzXG4gICAgLy8gcHJldmVudHMgYWNjaWRlbnRhbGx5IHNlbmRpbmcgaW4gYSBudW1iZXIgdGhhdCB3b3VsZFxuICAgIC8vIGJlIGludGVycHJldHRlZCBhcyBhIHN0YXJ0IG9mZnNldC5cbiAgICByZXR1cm4gdHlwZW9mIGVuY29kaW5nID09PSAnc3RyaW5nJ1xuICAgICAgPyBjcmVhdGVCdWZmZXIodGhhdCwgc2l6ZSkuZmlsbChmaWxsLCBlbmNvZGluZylcbiAgICAgIDogY3JlYXRlQnVmZmVyKHRoYXQsIHNpemUpLmZpbGwoZmlsbClcbiAgfVxuICByZXR1cm4gY3JlYXRlQnVmZmVyKHRoYXQsIHNpemUpXG59XG5cbi8qKlxuICogQ3JlYXRlcyBhIG5ldyBmaWxsZWQgQnVmZmVyIGluc3RhbmNlLlxuICogYWxsb2Moc2l6ZVssIGZpbGxbLCBlbmNvZGluZ11dKVxuICoqL1xuQnVmZmVyLmFsbG9jID0gZnVuY3Rpb24gKHNpemUsIGZpbGwsIGVuY29kaW5nKSB7XG4gIHJldHVybiBhbGxvYyhudWxsLCBzaXplLCBmaWxsLCBlbmNvZGluZylcbn1cblxuZnVuY3Rpb24gYWxsb2NVbnNhZmUgKHRoYXQsIHNpemUpIHtcbiAgYXNzZXJ0U2l6ZShzaXplKVxuICB0aGF0ID0gY3JlYXRlQnVmZmVyKHRoYXQsIHNpemUgPCAwID8gMCA6IGNoZWNrZWQoc2l6ZSkgfCAwKVxuICBpZiAoIUJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzaXplOyArK2kpIHtcbiAgICAgIHRoYXRbaV0gPSAwXG4gICAgfVxuICB9XG4gIHJldHVybiB0aGF0XG59XG5cbi8qKlxuICogRXF1aXZhbGVudCB0byBCdWZmZXIobnVtKSwgYnkgZGVmYXVsdCBjcmVhdGVzIGEgbm9uLXplcm8tZmlsbGVkIEJ1ZmZlciBpbnN0YW5jZS5cbiAqICovXG5CdWZmZXIuYWxsb2NVbnNhZmUgPSBmdW5jdGlvbiAoc2l6ZSkge1xuICByZXR1cm4gYWxsb2NVbnNhZmUobnVsbCwgc2l6ZSlcbn1cbi8qKlxuICogRXF1aXZhbGVudCB0byBTbG93QnVmZmVyKG51bSksIGJ5IGRlZmF1bHQgY3JlYXRlcyBhIG5vbi16ZXJvLWZpbGxlZCBCdWZmZXIgaW5zdGFuY2UuXG4gKi9cbkJ1ZmZlci5hbGxvY1Vuc2FmZVNsb3cgPSBmdW5jdGlvbiAoc2l6ZSkge1xuICByZXR1cm4gYWxsb2NVbnNhZmUobnVsbCwgc2l6ZSlcbn1cblxuZnVuY3Rpb24gZnJvbVN0cmluZyAodGhhdCwgc3RyaW5nLCBlbmNvZGluZykge1xuICBpZiAodHlwZW9mIGVuY29kaW5nICE9PSAnc3RyaW5nJyB8fCBlbmNvZGluZyA9PT0gJycpIHtcbiAgICBlbmNvZGluZyA9ICd1dGY4J1xuICB9XG5cbiAgaWYgKCFCdWZmZXIuaXNFbmNvZGluZyhlbmNvZGluZykpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdcImVuY29kaW5nXCIgbXVzdCBiZSBhIHZhbGlkIHN0cmluZyBlbmNvZGluZycpXG4gIH1cblxuICB2YXIgbGVuZ3RoID0gYnl0ZUxlbmd0aChzdHJpbmcsIGVuY29kaW5nKSB8IDBcbiAgdGhhdCA9IGNyZWF0ZUJ1ZmZlcih0aGF0LCBsZW5ndGgpXG5cbiAgdmFyIGFjdHVhbCA9IHRoYXQud3JpdGUoc3RyaW5nLCBlbmNvZGluZylcblxuICBpZiAoYWN0dWFsICE9PSBsZW5ndGgpIHtcbiAgICAvLyBXcml0aW5nIGEgaGV4IHN0cmluZywgZm9yIGV4YW1wbGUsIHRoYXQgY29udGFpbnMgaW52YWxpZCBjaGFyYWN0ZXJzIHdpbGxcbiAgICAvLyBjYXVzZSBldmVyeXRoaW5nIGFmdGVyIHRoZSBmaXJzdCBpbnZhbGlkIGNoYXJhY3RlciB0byBiZSBpZ25vcmVkLiAoZS5nLlxuICAgIC8vICdhYnh4Y2QnIHdpbGwgYmUgdHJlYXRlZCBhcyAnYWInKVxuICAgIHRoYXQgPSB0aGF0LnNsaWNlKDAsIGFjdHVhbClcbiAgfVxuXG4gIHJldHVybiB0aGF0XG59XG5cbmZ1bmN0aW9uIGZyb21BcnJheUxpa2UgKHRoYXQsIGFycmF5KSB7XG4gIHZhciBsZW5ndGggPSBhcnJheS5sZW5ndGggPCAwID8gMCA6IGNoZWNrZWQoYXJyYXkubGVuZ3RoKSB8IDBcbiAgdGhhdCA9IGNyZWF0ZUJ1ZmZlcih0aGF0LCBsZW5ndGgpXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuZ3RoOyBpICs9IDEpIHtcbiAgICB0aGF0W2ldID0gYXJyYXlbaV0gJiAyNTVcbiAgfVxuICByZXR1cm4gdGhhdFxufVxuXG5mdW5jdGlvbiBmcm9tQXJyYXlCdWZmZXIgKHRoYXQsIGFycmF5LCBieXRlT2Zmc2V0LCBsZW5ndGgpIHtcbiAgYXJyYXkuYnl0ZUxlbmd0aCAvLyB0aGlzIHRocm93cyBpZiBgYXJyYXlgIGlzIG5vdCBhIHZhbGlkIEFycmF5QnVmZmVyXG5cbiAgaWYgKGJ5dGVPZmZzZXQgPCAwIHx8IGFycmF5LmJ5dGVMZW5ndGggPCBieXRlT2Zmc2V0KSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ1xcJ29mZnNldFxcJyBpcyBvdXQgb2YgYm91bmRzJylcbiAgfVxuXG4gIGlmIChhcnJheS5ieXRlTGVuZ3RoIDwgYnl0ZU9mZnNldCArIChsZW5ndGggfHwgMCkpIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignXFwnbGVuZ3RoXFwnIGlzIG91dCBvZiBib3VuZHMnKVxuICB9XG5cbiAgaWYgKGJ5dGVPZmZzZXQgPT09IHVuZGVmaW5lZCAmJiBsZW5ndGggPT09IHVuZGVmaW5lZCkge1xuICAgIGFycmF5ID0gbmV3IFVpbnQ4QXJyYXkoYXJyYXkpXG4gIH0gZWxzZSBpZiAobGVuZ3RoID09PSB1bmRlZmluZWQpIHtcbiAgICBhcnJheSA9IG5ldyBVaW50OEFycmF5KGFycmF5LCBieXRlT2Zmc2V0KVxuICB9IGVsc2Uge1xuICAgIGFycmF5ID0gbmV3IFVpbnQ4QXJyYXkoYXJyYXksIGJ5dGVPZmZzZXQsIGxlbmd0aClcbiAgfVxuXG4gIGlmIChCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCkge1xuICAgIC8vIFJldHVybiBhbiBhdWdtZW50ZWQgYFVpbnQ4QXJyYXlgIGluc3RhbmNlLCBmb3IgYmVzdCBwZXJmb3JtYW5jZVxuICAgIHRoYXQgPSBhcnJheVxuICAgIHRoYXQuX19wcm90b19fID0gQnVmZmVyLnByb3RvdHlwZVxuICB9IGVsc2Uge1xuICAgIC8vIEZhbGxiYWNrOiBSZXR1cm4gYW4gb2JqZWN0IGluc3RhbmNlIG9mIHRoZSBCdWZmZXIgY2xhc3NcbiAgICB0aGF0ID0gZnJvbUFycmF5TGlrZSh0aGF0LCBhcnJheSlcbiAgfVxuICByZXR1cm4gdGhhdFxufVxuXG5mdW5jdGlvbiBmcm9tT2JqZWN0ICh0aGF0LCBvYmopIHtcbiAgaWYgKEJ1ZmZlci5pc0J1ZmZlcihvYmopKSB7XG4gICAgdmFyIGxlbiA9IGNoZWNrZWQob2JqLmxlbmd0aCkgfCAwXG4gICAgdGhhdCA9IGNyZWF0ZUJ1ZmZlcih0aGF0LCBsZW4pXG5cbiAgICBpZiAodGhhdC5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiB0aGF0XG4gICAgfVxuXG4gICAgb2JqLmNvcHkodGhhdCwgMCwgMCwgbGVuKVxuICAgIHJldHVybiB0aGF0XG4gIH1cblxuICBpZiAob2JqKSB7XG4gICAgaWYgKCh0eXBlb2YgQXJyYXlCdWZmZXIgIT09ICd1bmRlZmluZWQnICYmXG4gICAgICAgIG9iai5idWZmZXIgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcikgfHwgJ2xlbmd0aCcgaW4gb2JqKSB7XG4gICAgICBpZiAodHlwZW9mIG9iai5sZW5ndGggIT09ICdudW1iZXInIHx8IGlzbmFuKG9iai5sZW5ndGgpKSB7XG4gICAgICAgIHJldHVybiBjcmVhdGVCdWZmZXIodGhhdCwgMClcbiAgICAgIH1cbiAgICAgIHJldHVybiBmcm9tQXJyYXlMaWtlKHRoYXQsIG9iailcbiAgICB9XG5cbiAgICBpZiAob2JqLnR5cGUgPT09ICdCdWZmZXInICYmIGlzQXJyYXkob2JqLmRhdGEpKSB7XG4gICAgICByZXR1cm4gZnJvbUFycmF5TGlrZSh0aGF0LCBvYmouZGF0YSlcbiAgICB9XG4gIH1cblxuICB0aHJvdyBuZXcgVHlwZUVycm9yKCdGaXJzdCBhcmd1bWVudCBtdXN0IGJlIGEgc3RyaW5nLCBCdWZmZXIsIEFycmF5QnVmZmVyLCBBcnJheSwgb3IgYXJyYXktbGlrZSBvYmplY3QuJylcbn1cblxuZnVuY3Rpb24gY2hlY2tlZCAobGVuZ3RoKSB7XG4gIC8vIE5vdGU6IGNhbm5vdCB1c2UgYGxlbmd0aCA8IGtNYXhMZW5ndGgoKWAgaGVyZSBiZWNhdXNlIHRoYXQgZmFpbHMgd2hlblxuICAvLyBsZW5ndGggaXMgTmFOICh3aGljaCBpcyBvdGhlcndpc2UgY29lcmNlZCB0byB6ZXJvLilcbiAgaWYgKGxlbmd0aCA+PSBrTWF4TGVuZ3RoKCkpIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignQXR0ZW1wdCB0byBhbGxvY2F0ZSBCdWZmZXIgbGFyZ2VyIHRoYW4gbWF4aW11bSAnICtcbiAgICAgICAgICAgICAgICAgICAgICAgICAnc2l6ZTogMHgnICsga01heExlbmd0aCgpLnRvU3RyaW5nKDE2KSArICcgYnl0ZXMnKVxuICB9XG4gIHJldHVybiBsZW5ndGggfCAwXG59XG5cbmZ1bmN0aW9uIFNsb3dCdWZmZXIgKGxlbmd0aCkge1xuICBpZiAoK2xlbmd0aCAhPSBsZW5ndGgpIHsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBlcWVxZXFcbiAgICBsZW5ndGggPSAwXG4gIH1cbiAgcmV0dXJuIEJ1ZmZlci5hbGxvYygrbGVuZ3RoKVxufVxuXG5CdWZmZXIuaXNCdWZmZXIgPSBmdW5jdGlvbiBpc0J1ZmZlciAoYikge1xuICByZXR1cm4gISEoYiAhPSBudWxsICYmIGIuX2lzQnVmZmVyKVxufVxuXG5CdWZmZXIuY29tcGFyZSA9IGZ1bmN0aW9uIGNvbXBhcmUgKGEsIGIpIHtcbiAgaWYgKCFCdWZmZXIuaXNCdWZmZXIoYSkgfHwgIUJ1ZmZlci5pc0J1ZmZlcihiKSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ0FyZ3VtZW50cyBtdXN0IGJlIEJ1ZmZlcnMnKVxuICB9XG5cbiAgaWYgKGEgPT09IGIpIHJldHVybiAwXG5cbiAgdmFyIHggPSBhLmxlbmd0aFxuICB2YXIgeSA9IGIubGVuZ3RoXG5cbiAgZm9yICh2YXIgaSA9IDAsIGxlbiA9IE1hdGgubWluKHgsIHkpOyBpIDwgbGVuOyArK2kpIHtcbiAgICBpZiAoYVtpXSAhPT0gYltpXSkge1xuICAgICAgeCA9IGFbaV1cbiAgICAgIHkgPSBiW2ldXG4gICAgICBicmVha1xuICAgIH1cbiAgfVxuXG4gIGlmICh4IDwgeSkgcmV0dXJuIC0xXG4gIGlmICh5IDwgeCkgcmV0dXJuIDFcbiAgcmV0dXJuIDBcbn1cblxuQnVmZmVyLmlzRW5jb2RpbmcgPSBmdW5jdGlvbiBpc0VuY29kaW5nIChlbmNvZGluZykge1xuICBzd2l0Y2ggKFN0cmluZyhlbmNvZGluZykudG9Mb3dlckNhc2UoKSkge1xuICAgIGNhc2UgJ2hleCc6XG4gICAgY2FzZSAndXRmOCc6XG4gICAgY2FzZSAndXRmLTgnOlxuICAgIGNhc2UgJ2FzY2lpJzpcbiAgICBjYXNlICdsYXRpbjEnOlxuICAgIGNhc2UgJ2JpbmFyeSc6XG4gICAgY2FzZSAnYmFzZTY0JzpcbiAgICBjYXNlICd1Y3MyJzpcbiAgICBjYXNlICd1Y3MtMic6XG4gICAgY2FzZSAndXRmMTZsZSc6XG4gICAgY2FzZSAndXRmLTE2bGUnOlxuICAgICAgcmV0dXJuIHRydWVcbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIGZhbHNlXG4gIH1cbn1cblxuQnVmZmVyLmNvbmNhdCA9IGZ1bmN0aW9uIGNvbmNhdCAobGlzdCwgbGVuZ3RoKSB7XG4gIGlmICghaXNBcnJheShsaXN0KSkge1xuICAgIHRocm93IG5ldyBUeXBlRXJyb3IoJ1wibGlzdFwiIGFyZ3VtZW50IG11c3QgYmUgYW4gQXJyYXkgb2YgQnVmZmVycycpXG4gIH1cblxuICBpZiAobGlzdC5sZW5ndGggPT09IDApIHtcbiAgICByZXR1cm4gQnVmZmVyLmFsbG9jKDApXG4gIH1cblxuICB2YXIgaVxuICBpZiAobGVuZ3RoID09PSB1bmRlZmluZWQpIHtcbiAgICBsZW5ndGggPSAwXG4gICAgZm9yIChpID0gMDsgaSA8IGxpc3QubGVuZ3RoOyArK2kpIHtcbiAgICAgIGxlbmd0aCArPSBsaXN0W2ldLmxlbmd0aFxuICAgIH1cbiAgfVxuXG4gIHZhciBidWZmZXIgPSBCdWZmZXIuYWxsb2NVbnNhZmUobGVuZ3RoKVxuICB2YXIgcG9zID0gMFxuICBmb3IgKGkgPSAwOyBpIDwgbGlzdC5sZW5ndGg7ICsraSkge1xuICAgIHZhciBidWYgPSBsaXN0W2ldXG4gICAgaWYgKCFCdWZmZXIuaXNCdWZmZXIoYnVmKSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignXCJsaXN0XCIgYXJndW1lbnQgbXVzdCBiZSBhbiBBcnJheSBvZiBCdWZmZXJzJylcbiAgICB9XG4gICAgYnVmLmNvcHkoYnVmZmVyLCBwb3MpXG4gICAgcG9zICs9IGJ1Zi5sZW5ndGhcbiAgfVxuICByZXR1cm4gYnVmZmVyXG59XG5cbmZ1bmN0aW9uIGJ5dGVMZW5ndGggKHN0cmluZywgZW5jb2RpbmcpIHtcbiAgaWYgKEJ1ZmZlci5pc0J1ZmZlcihzdHJpbmcpKSB7XG4gICAgcmV0dXJuIHN0cmluZy5sZW5ndGhcbiAgfVxuICBpZiAodHlwZW9mIEFycmF5QnVmZmVyICE9PSAndW5kZWZpbmVkJyAmJiB0eXBlb2YgQXJyYXlCdWZmZXIuaXNWaWV3ID09PSAnZnVuY3Rpb24nICYmXG4gICAgICAoQXJyYXlCdWZmZXIuaXNWaWV3KHN0cmluZykgfHwgc3RyaW5nIGluc3RhbmNlb2YgQXJyYXlCdWZmZXIpKSB7XG4gICAgcmV0dXJuIHN0cmluZy5ieXRlTGVuZ3RoXG4gIH1cbiAgaWYgKHR5cGVvZiBzdHJpbmcgIT09ICdzdHJpbmcnKSB7XG4gICAgc3RyaW5nID0gJycgKyBzdHJpbmdcbiAgfVxuXG4gIHZhciBsZW4gPSBzdHJpbmcubGVuZ3RoXG4gIGlmIChsZW4gPT09IDApIHJldHVybiAwXG5cbiAgLy8gVXNlIGEgZm9yIGxvb3AgdG8gYXZvaWQgcmVjdXJzaW9uXG4gIHZhciBsb3dlcmVkQ2FzZSA9IGZhbHNlXG4gIGZvciAoOzspIHtcbiAgICBzd2l0Y2ggKGVuY29kaW5nKSB7XG4gICAgICBjYXNlICdhc2NpaSc6XG4gICAgICBjYXNlICdsYXRpbjEnOlxuICAgICAgY2FzZSAnYmluYXJ5JzpcbiAgICAgICAgcmV0dXJuIGxlblxuICAgICAgY2FzZSAndXRmOCc6XG4gICAgICBjYXNlICd1dGYtOCc6XG4gICAgICBjYXNlIHVuZGVmaW5lZDpcbiAgICAgICAgcmV0dXJuIHV0ZjhUb0J5dGVzKHN0cmluZykubGVuZ3RoXG4gICAgICBjYXNlICd1Y3MyJzpcbiAgICAgIGNhc2UgJ3Vjcy0yJzpcbiAgICAgIGNhc2UgJ3V0ZjE2bGUnOlxuICAgICAgY2FzZSAndXRmLTE2bGUnOlxuICAgICAgICByZXR1cm4gbGVuICogMlxuICAgICAgY2FzZSAnaGV4JzpcbiAgICAgICAgcmV0dXJuIGxlbiA+Pj4gMVxuICAgICAgY2FzZSAnYmFzZTY0JzpcbiAgICAgICAgcmV0dXJuIGJhc2U2NFRvQnl0ZXMoc3RyaW5nKS5sZW5ndGhcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGlmIChsb3dlcmVkQ2FzZSkgcmV0dXJuIHV0ZjhUb0J5dGVzKHN0cmluZykubGVuZ3RoIC8vIGFzc3VtZSB1dGY4XG4gICAgICAgIGVuY29kaW5nID0gKCcnICsgZW5jb2RpbmcpLnRvTG93ZXJDYXNlKClcbiAgICAgICAgbG93ZXJlZENhc2UgPSB0cnVlXG4gICAgfVxuICB9XG59XG5CdWZmZXIuYnl0ZUxlbmd0aCA9IGJ5dGVMZW5ndGhcblxuZnVuY3Rpb24gc2xvd1RvU3RyaW5nIChlbmNvZGluZywgc3RhcnQsIGVuZCkge1xuICB2YXIgbG93ZXJlZENhc2UgPSBmYWxzZVxuXG4gIC8vIE5vIG5lZWQgdG8gdmVyaWZ5IHRoYXQgXCJ0aGlzLmxlbmd0aCA8PSBNQVhfVUlOVDMyXCIgc2luY2UgaXQncyBhIHJlYWQtb25seVxuICAvLyBwcm9wZXJ0eSBvZiBhIHR5cGVkIGFycmF5LlxuXG4gIC8vIFRoaXMgYmVoYXZlcyBuZWl0aGVyIGxpa2UgU3RyaW5nIG5vciBVaW50OEFycmF5IGluIHRoYXQgd2Ugc2V0IHN0YXJ0L2VuZFxuICAvLyB0byB0aGVpciB1cHBlci9sb3dlciBib3VuZHMgaWYgdGhlIHZhbHVlIHBhc3NlZCBpcyBvdXQgb2YgcmFuZ2UuXG4gIC8vIHVuZGVmaW5lZCBpcyBoYW5kbGVkIHNwZWNpYWxseSBhcyBwZXIgRUNNQS0yNjIgNnRoIEVkaXRpb24sXG4gIC8vIFNlY3Rpb24gMTMuMy4zLjcgUnVudGltZSBTZW1hbnRpY3M6IEtleWVkQmluZGluZ0luaXRpYWxpemF0aW9uLlxuICBpZiAoc3RhcnQgPT09IHVuZGVmaW5lZCB8fCBzdGFydCA8IDApIHtcbiAgICBzdGFydCA9IDBcbiAgfVxuICAvLyBSZXR1cm4gZWFybHkgaWYgc3RhcnQgPiB0aGlzLmxlbmd0aC4gRG9uZSBoZXJlIHRvIHByZXZlbnQgcG90ZW50aWFsIHVpbnQzMlxuICAvLyBjb2VyY2lvbiBmYWlsIGJlbG93LlxuICBpZiAoc3RhcnQgPiB0aGlzLmxlbmd0aCkge1xuICAgIHJldHVybiAnJ1xuICB9XG5cbiAgaWYgKGVuZCA9PT0gdW5kZWZpbmVkIHx8IGVuZCA+IHRoaXMubGVuZ3RoKSB7XG4gICAgZW5kID0gdGhpcy5sZW5ndGhcbiAgfVxuXG4gIGlmIChlbmQgPD0gMCkge1xuICAgIHJldHVybiAnJ1xuICB9XG5cbiAgLy8gRm9yY2UgY29lcnNpb24gdG8gdWludDMyLiBUaGlzIHdpbGwgYWxzbyBjb2VyY2UgZmFsc2V5L05hTiB2YWx1ZXMgdG8gMC5cbiAgZW5kID4+Pj0gMFxuICBzdGFydCA+Pj49IDBcblxuICBpZiAoZW5kIDw9IHN0YXJ0KSB7XG4gICAgcmV0dXJuICcnXG4gIH1cblxuICBpZiAoIWVuY29kaW5nKSBlbmNvZGluZyA9ICd1dGY4J1xuXG4gIHdoaWxlICh0cnVlKSB7XG4gICAgc3dpdGNoIChlbmNvZGluZykge1xuICAgICAgY2FzZSAnaGV4JzpcbiAgICAgICAgcmV0dXJuIGhleFNsaWNlKHRoaXMsIHN0YXJ0LCBlbmQpXG5cbiAgICAgIGNhc2UgJ3V0ZjgnOlxuICAgICAgY2FzZSAndXRmLTgnOlxuICAgICAgICByZXR1cm4gdXRmOFNsaWNlKHRoaXMsIHN0YXJ0LCBlbmQpXG5cbiAgICAgIGNhc2UgJ2FzY2lpJzpcbiAgICAgICAgcmV0dXJuIGFzY2lpU2xpY2UodGhpcywgc3RhcnQsIGVuZClcblxuICAgICAgY2FzZSAnbGF0aW4xJzpcbiAgICAgIGNhc2UgJ2JpbmFyeSc6XG4gICAgICAgIHJldHVybiBsYXRpbjFTbGljZSh0aGlzLCBzdGFydCwgZW5kKVxuXG4gICAgICBjYXNlICdiYXNlNjQnOlxuICAgICAgICByZXR1cm4gYmFzZTY0U2xpY2UodGhpcywgc3RhcnQsIGVuZClcblxuICAgICAgY2FzZSAndWNzMic6XG4gICAgICBjYXNlICd1Y3MtMic6XG4gICAgICBjYXNlICd1dGYxNmxlJzpcbiAgICAgIGNhc2UgJ3V0Zi0xNmxlJzpcbiAgICAgICAgcmV0dXJuIHV0ZjE2bGVTbGljZSh0aGlzLCBzdGFydCwgZW5kKVxuXG4gICAgICBkZWZhdWx0OlxuICAgICAgICBpZiAobG93ZXJlZENhc2UpIHRocm93IG5ldyBUeXBlRXJyb3IoJ1Vua25vd24gZW5jb2Rpbmc6ICcgKyBlbmNvZGluZylcbiAgICAgICAgZW5jb2RpbmcgPSAoZW5jb2RpbmcgKyAnJykudG9Mb3dlckNhc2UoKVxuICAgICAgICBsb3dlcmVkQ2FzZSA9IHRydWVcbiAgICB9XG4gIH1cbn1cblxuLy8gVGhlIHByb3BlcnR5IGlzIHVzZWQgYnkgYEJ1ZmZlci5pc0J1ZmZlcmAgYW5kIGBpcy1idWZmZXJgIChpbiBTYWZhcmkgNS03KSB0byBkZXRlY3Rcbi8vIEJ1ZmZlciBpbnN0YW5jZXMuXG5CdWZmZXIucHJvdG90eXBlLl9pc0J1ZmZlciA9IHRydWVcblxuZnVuY3Rpb24gc3dhcCAoYiwgbiwgbSkge1xuICB2YXIgaSA9IGJbbl1cbiAgYltuXSA9IGJbbV1cbiAgYlttXSA9IGlcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5zd2FwMTYgPSBmdW5jdGlvbiBzd2FwMTYgKCkge1xuICB2YXIgbGVuID0gdGhpcy5sZW5ndGhcbiAgaWYgKGxlbiAlIDIgIT09IDApIHtcbiAgICB0aHJvdyBuZXcgUmFuZ2VFcnJvcignQnVmZmVyIHNpemUgbXVzdCBiZSBhIG11bHRpcGxlIG9mIDE2LWJpdHMnKVxuICB9XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyBpICs9IDIpIHtcbiAgICBzd2FwKHRoaXMsIGksIGkgKyAxKVxuICB9XG4gIHJldHVybiB0aGlzXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUuc3dhcDMyID0gZnVuY3Rpb24gc3dhcDMyICgpIHtcbiAgdmFyIGxlbiA9IHRoaXMubGVuZ3RoXG4gIGlmIChsZW4gJSA0ICE9PSAwKSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ0J1ZmZlciBzaXplIG11c3QgYmUgYSBtdWx0aXBsZSBvZiAzMi1iaXRzJylcbiAgfVxuICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgaSArPSA0KSB7XG4gICAgc3dhcCh0aGlzLCBpLCBpICsgMylcbiAgICBzd2FwKHRoaXMsIGkgKyAxLCBpICsgMilcbiAgfVxuICByZXR1cm4gdGhpc1xufVxuXG5CdWZmZXIucHJvdG90eXBlLnN3YXA2NCA9IGZ1bmN0aW9uIHN3YXA2NCAoKSB7XG4gIHZhciBsZW4gPSB0aGlzLmxlbmd0aFxuICBpZiAobGVuICUgOCAhPT0gMCkge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdCdWZmZXIgc2l6ZSBtdXN0IGJlIGEgbXVsdGlwbGUgb2YgNjQtYml0cycpXG4gIH1cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47IGkgKz0gOCkge1xuICAgIHN3YXAodGhpcywgaSwgaSArIDcpXG4gICAgc3dhcCh0aGlzLCBpICsgMSwgaSArIDYpXG4gICAgc3dhcCh0aGlzLCBpICsgMiwgaSArIDUpXG4gICAgc3dhcCh0aGlzLCBpICsgMywgaSArIDQpXG4gIH1cbiAgcmV0dXJuIHRoaXNcbn1cblxuQnVmZmVyLnByb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uIHRvU3RyaW5nICgpIHtcbiAgdmFyIGxlbmd0aCA9IHRoaXMubGVuZ3RoIHwgMFxuICBpZiAobGVuZ3RoID09PSAwKSByZXR1cm4gJydcbiAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDApIHJldHVybiB1dGY4U2xpY2UodGhpcywgMCwgbGVuZ3RoKVxuICByZXR1cm4gc2xvd1RvU3RyaW5nLmFwcGx5KHRoaXMsIGFyZ3VtZW50cylcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5lcXVhbHMgPSBmdW5jdGlvbiBlcXVhbHMgKGIpIHtcbiAgaWYgKCFCdWZmZXIuaXNCdWZmZXIoYikpIHRocm93IG5ldyBUeXBlRXJyb3IoJ0FyZ3VtZW50IG11c3QgYmUgYSBCdWZmZXInKVxuICBpZiAodGhpcyA9PT0gYikgcmV0dXJuIHRydWVcbiAgcmV0dXJuIEJ1ZmZlci5jb21wYXJlKHRoaXMsIGIpID09PSAwXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUuaW5zcGVjdCA9IGZ1bmN0aW9uIGluc3BlY3QgKCkge1xuICB2YXIgc3RyID0gJydcbiAgdmFyIG1heCA9IGV4cG9ydHMuSU5TUEVDVF9NQVhfQllURVNcbiAgaWYgKHRoaXMubGVuZ3RoID4gMCkge1xuICAgIHN0ciA9IHRoaXMudG9TdHJpbmcoJ2hleCcsIDAsIG1heCkubWF0Y2goLy57Mn0vZykuam9pbignICcpXG4gICAgaWYgKHRoaXMubGVuZ3RoID4gbWF4KSBzdHIgKz0gJyAuLi4gJ1xuICB9XG4gIHJldHVybiAnPEJ1ZmZlciAnICsgc3RyICsgJz4nXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUuY29tcGFyZSA9IGZ1bmN0aW9uIGNvbXBhcmUgKHRhcmdldCwgc3RhcnQsIGVuZCwgdGhpc1N0YXJ0LCB0aGlzRW5kKSB7XG4gIGlmICghQnVmZmVyLmlzQnVmZmVyKHRhcmdldCkpIHtcbiAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdBcmd1bWVudCBtdXN0IGJlIGEgQnVmZmVyJylcbiAgfVxuXG4gIGlmIChzdGFydCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgc3RhcnQgPSAwXG4gIH1cbiAgaWYgKGVuZCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgZW5kID0gdGFyZ2V0ID8gdGFyZ2V0Lmxlbmd0aCA6IDBcbiAgfVxuICBpZiAodGhpc1N0YXJ0ID09PSB1bmRlZmluZWQpIHtcbiAgICB0aGlzU3RhcnQgPSAwXG4gIH1cbiAgaWYgKHRoaXNFbmQgPT09IHVuZGVmaW5lZCkge1xuICAgIHRoaXNFbmQgPSB0aGlzLmxlbmd0aFxuICB9XG5cbiAgaWYgKHN0YXJ0IDwgMCB8fCBlbmQgPiB0YXJnZXQubGVuZ3RoIHx8IHRoaXNTdGFydCA8IDAgfHwgdGhpc0VuZCA+IHRoaXMubGVuZ3RoKSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ291dCBvZiByYW5nZSBpbmRleCcpXG4gIH1cblxuICBpZiAodGhpc1N0YXJ0ID49IHRoaXNFbmQgJiYgc3RhcnQgPj0gZW5kKSB7XG4gICAgcmV0dXJuIDBcbiAgfVxuICBpZiAodGhpc1N0YXJ0ID49IHRoaXNFbmQpIHtcbiAgICByZXR1cm4gLTFcbiAgfVxuICBpZiAoc3RhcnQgPj0gZW5kKSB7XG4gICAgcmV0dXJuIDFcbiAgfVxuXG4gIHN0YXJ0ID4+Pj0gMFxuICBlbmQgPj4+PSAwXG4gIHRoaXNTdGFydCA+Pj49IDBcbiAgdGhpc0VuZCA+Pj49IDBcblxuICBpZiAodGhpcyA9PT0gdGFyZ2V0KSByZXR1cm4gMFxuXG4gIHZhciB4ID0gdGhpc0VuZCAtIHRoaXNTdGFydFxuICB2YXIgeSA9IGVuZCAtIHN0YXJ0XG4gIHZhciBsZW4gPSBNYXRoLm1pbih4LCB5KVxuXG4gIHZhciB0aGlzQ29weSA9IHRoaXMuc2xpY2UodGhpc1N0YXJ0LCB0aGlzRW5kKVxuICB2YXIgdGFyZ2V0Q29weSA9IHRhcmdldC5zbGljZShzdGFydCwgZW5kKVxuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyArK2kpIHtcbiAgICBpZiAodGhpc0NvcHlbaV0gIT09IHRhcmdldENvcHlbaV0pIHtcbiAgICAgIHggPSB0aGlzQ29weVtpXVxuICAgICAgeSA9IHRhcmdldENvcHlbaV1cbiAgICAgIGJyZWFrXG4gICAgfVxuICB9XG5cbiAgaWYgKHggPCB5KSByZXR1cm4gLTFcbiAgaWYgKHkgPCB4KSByZXR1cm4gMVxuICByZXR1cm4gMFxufVxuXG4vLyBGaW5kcyBlaXRoZXIgdGhlIGZpcnN0IGluZGV4IG9mIGB2YWxgIGluIGBidWZmZXJgIGF0IG9mZnNldCA+PSBgYnl0ZU9mZnNldGAsXG4vLyBPUiB0aGUgbGFzdCBpbmRleCBvZiBgdmFsYCBpbiBgYnVmZmVyYCBhdCBvZmZzZXQgPD0gYGJ5dGVPZmZzZXRgLlxuLy9cbi8vIEFyZ3VtZW50czpcbi8vIC0gYnVmZmVyIC0gYSBCdWZmZXIgdG8gc2VhcmNoXG4vLyAtIHZhbCAtIGEgc3RyaW5nLCBCdWZmZXIsIG9yIG51bWJlclxuLy8gLSBieXRlT2Zmc2V0IC0gYW4gaW5kZXggaW50byBgYnVmZmVyYDsgd2lsbCBiZSBjbGFtcGVkIHRvIGFuIGludDMyXG4vLyAtIGVuY29kaW5nIC0gYW4gb3B0aW9uYWwgZW5jb2RpbmcsIHJlbGV2YW50IGlzIHZhbCBpcyBhIHN0cmluZ1xuLy8gLSBkaXIgLSB0cnVlIGZvciBpbmRleE9mLCBmYWxzZSBmb3IgbGFzdEluZGV4T2ZcbmZ1bmN0aW9uIGJpZGlyZWN0aW9uYWxJbmRleE9mIChidWZmZXIsIHZhbCwgYnl0ZU9mZnNldCwgZW5jb2RpbmcsIGRpcikge1xuICAvLyBFbXB0eSBidWZmZXIgbWVhbnMgbm8gbWF0Y2hcbiAgaWYgKGJ1ZmZlci5sZW5ndGggPT09IDApIHJldHVybiAtMVxuXG4gIC8vIE5vcm1hbGl6ZSBieXRlT2Zmc2V0XG4gIGlmICh0eXBlb2YgYnl0ZU9mZnNldCA9PT0gJ3N0cmluZycpIHtcbiAgICBlbmNvZGluZyA9IGJ5dGVPZmZzZXRcbiAgICBieXRlT2Zmc2V0ID0gMFxuICB9IGVsc2UgaWYgKGJ5dGVPZmZzZXQgPiAweDdmZmZmZmZmKSB7XG4gICAgYnl0ZU9mZnNldCA9IDB4N2ZmZmZmZmZcbiAgfSBlbHNlIGlmIChieXRlT2Zmc2V0IDwgLTB4ODAwMDAwMDApIHtcbiAgICBieXRlT2Zmc2V0ID0gLTB4ODAwMDAwMDBcbiAgfVxuICBieXRlT2Zmc2V0ID0gK2J5dGVPZmZzZXQgIC8vIENvZXJjZSB0byBOdW1iZXIuXG4gIGlmIChpc05hTihieXRlT2Zmc2V0KSkge1xuICAgIC8vIGJ5dGVPZmZzZXQ6IGl0IGl0J3MgdW5kZWZpbmVkLCBudWxsLCBOYU4sIFwiZm9vXCIsIGV0Yywgc2VhcmNoIHdob2xlIGJ1ZmZlclxuICAgIGJ5dGVPZmZzZXQgPSBkaXIgPyAwIDogKGJ1ZmZlci5sZW5ndGggLSAxKVxuICB9XG5cbiAgLy8gTm9ybWFsaXplIGJ5dGVPZmZzZXQ6IG5lZ2F0aXZlIG9mZnNldHMgc3RhcnQgZnJvbSB0aGUgZW5kIG9mIHRoZSBidWZmZXJcbiAgaWYgKGJ5dGVPZmZzZXQgPCAwKSBieXRlT2Zmc2V0ID0gYnVmZmVyLmxlbmd0aCArIGJ5dGVPZmZzZXRcbiAgaWYgKGJ5dGVPZmZzZXQgPj0gYnVmZmVyLmxlbmd0aCkge1xuICAgIGlmIChkaXIpIHJldHVybiAtMVxuICAgIGVsc2UgYnl0ZU9mZnNldCA9IGJ1ZmZlci5sZW5ndGggLSAxXG4gIH0gZWxzZSBpZiAoYnl0ZU9mZnNldCA8IDApIHtcbiAgICBpZiAoZGlyKSBieXRlT2Zmc2V0ID0gMFxuICAgIGVsc2UgcmV0dXJuIC0xXG4gIH1cblxuICAvLyBOb3JtYWxpemUgdmFsXG4gIGlmICh0eXBlb2YgdmFsID09PSAnc3RyaW5nJykge1xuICAgIHZhbCA9IEJ1ZmZlci5mcm9tKHZhbCwgZW5jb2RpbmcpXG4gIH1cblxuICAvLyBGaW5hbGx5LCBzZWFyY2ggZWl0aGVyIGluZGV4T2YgKGlmIGRpciBpcyB0cnVlKSBvciBsYXN0SW5kZXhPZlxuICBpZiAoQnVmZmVyLmlzQnVmZmVyKHZhbCkpIHtcbiAgICAvLyBTcGVjaWFsIGNhc2U6IGxvb2tpbmcgZm9yIGVtcHR5IHN0cmluZy9idWZmZXIgYWx3YXlzIGZhaWxzXG4gICAgaWYgKHZhbC5sZW5ndGggPT09IDApIHtcbiAgICAgIHJldHVybiAtMVxuICAgIH1cbiAgICByZXR1cm4gYXJyYXlJbmRleE9mKGJ1ZmZlciwgdmFsLCBieXRlT2Zmc2V0LCBlbmNvZGluZywgZGlyKVxuICB9IGVsc2UgaWYgKHR5cGVvZiB2YWwgPT09ICdudW1iZXInKSB7XG4gICAgdmFsID0gdmFsICYgMHhGRiAvLyBTZWFyY2ggZm9yIGEgYnl0ZSB2YWx1ZSBbMC0yNTVdXG4gICAgaWYgKEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUICYmXG4gICAgICAgIHR5cGVvZiBVaW50OEFycmF5LnByb3RvdHlwZS5pbmRleE9mID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICBpZiAoZGlyKSB7XG4gICAgICAgIHJldHVybiBVaW50OEFycmF5LnByb3RvdHlwZS5pbmRleE9mLmNhbGwoYnVmZmVyLCB2YWwsIGJ5dGVPZmZzZXQpXG4gICAgICB9IGVsc2Uge1xuICAgICAgICByZXR1cm4gVWludDhBcnJheS5wcm90b3R5cGUubGFzdEluZGV4T2YuY2FsbChidWZmZXIsIHZhbCwgYnl0ZU9mZnNldClcbiAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGFycmF5SW5kZXhPZihidWZmZXIsIFsgdmFsIF0sIGJ5dGVPZmZzZXQsIGVuY29kaW5nLCBkaXIpXG4gIH1cblxuICB0aHJvdyBuZXcgVHlwZUVycm9yKCd2YWwgbXVzdCBiZSBzdHJpbmcsIG51bWJlciBvciBCdWZmZXInKVxufVxuXG5mdW5jdGlvbiBhcnJheUluZGV4T2YgKGFyciwgdmFsLCBieXRlT2Zmc2V0LCBlbmNvZGluZywgZGlyKSB7XG4gIHZhciBpbmRleFNpemUgPSAxXG4gIHZhciBhcnJMZW5ndGggPSBhcnIubGVuZ3RoXG4gIHZhciB2YWxMZW5ndGggPSB2YWwubGVuZ3RoXG5cbiAgaWYgKGVuY29kaW5nICE9PSB1bmRlZmluZWQpIHtcbiAgICBlbmNvZGluZyA9IFN0cmluZyhlbmNvZGluZykudG9Mb3dlckNhc2UoKVxuICAgIGlmIChlbmNvZGluZyA9PT0gJ3VjczInIHx8IGVuY29kaW5nID09PSAndWNzLTInIHx8XG4gICAgICAgIGVuY29kaW5nID09PSAndXRmMTZsZScgfHwgZW5jb2RpbmcgPT09ICd1dGYtMTZsZScpIHtcbiAgICAgIGlmIChhcnIubGVuZ3RoIDwgMiB8fCB2YWwubGVuZ3RoIDwgMikge1xuICAgICAgICByZXR1cm4gLTFcbiAgICAgIH1cbiAgICAgIGluZGV4U2l6ZSA9IDJcbiAgICAgIGFyckxlbmd0aCAvPSAyXG4gICAgICB2YWxMZW5ndGggLz0gMlxuICAgICAgYnl0ZU9mZnNldCAvPSAyXG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gcmVhZCAoYnVmLCBpKSB7XG4gICAgaWYgKGluZGV4U2l6ZSA9PT0gMSkge1xuICAgICAgcmV0dXJuIGJ1ZltpXVxuICAgIH0gZWxzZSB7XG4gICAgICByZXR1cm4gYnVmLnJlYWRVSW50MTZCRShpICogaW5kZXhTaXplKVxuICAgIH1cbiAgfVxuXG4gIHZhciBpXG4gIGlmIChkaXIpIHtcbiAgICB2YXIgZm91bmRJbmRleCA9IC0xXG4gICAgZm9yIChpID0gYnl0ZU9mZnNldDsgaSA8IGFyckxlbmd0aDsgaSsrKSB7XG4gICAgICBpZiAocmVhZChhcnIsIGkpID09PSByZWFkKHZhbCwgZm91bmRJbmRleCA9PT0gLTEgPyAwIDogaSAtIGZvdW5kSW5kZXgpKSB7XG4gICAgICAgIGlmIChmb3VuZEluZGV4ID09PSAtMSkgZm91bmRJbmRleCA9IGlcbiAgICAgICAgaWYgKGkgLSBmb3VuZEluZGV4ICsgMSA9PT0gdmFsTGVuZ3RoKSByZXR1cm4gZm91bmRJbmRleCAqIGluZGV4U2l6ZVxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgaWYgKGZvdW5kSW5kZXggIT09IC0xKSBpIC09IGkgLSBmb3VuZEluZGV4XG4gICAgICAgIGZvdW5kSW5kZXggPSAtMVxuICAgICAgfVxuICAgIH1cbiAgfSBlbHNlIHtcbiAgICBpZiAoYnl0ZU9mZnNldCArIHZhbExlbmd0aCA+IGFyckxlbmd0aCkgYnl0ZU9mZnNldCA9IGFyckxlbmd0aCAtIHZhbExlbmd0aFxuICAgIGZvciAoaSA9IGJ5dGVPZmZzZXQ7IGkgPj0gMDsgaS0tKSB7XG4gICAgICB2YXIgZm91bmQgPSB0cnVlXG4gICAgICBmb3IgKHZhciBqID0gMDsgaiA8IHZhbExlbmd0aDsgaisrKSB7XG4gICAgICAgIGlmIChyZWFkKGFyciwgaSArIGopICE9PSByZWFkKHZhbCwgaikpIHtcbiAgICAgICAgICBmb3VuZCA9IGZhbHNlXG4gICAgICAgICAgYnJlYWtcbiAgICAgICAgfVxuICAgICAgfVxuICAgICAgaWYgKGZvdW5kKSByZXR1cm4gaVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiAtMVxufVxuXG5CdWZmZXIucHJvdG90eXBlLmluY2x1ZGVzID0gZnVuY3Rpb24gaW5jbHVkZXMgKHZhbCwgYnl0ZU9mZnNldCwgZW5jb2RpbmcpIHtcbiAgcmV0dXJuIHRoaXMuaW5kZXhPZih2YWwsIGJ5dGVPZmZzZXQsIGVuY29kaW5nKSAhPT0gLTFcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5pbmRleE9mID0gZnVuY3Rpb24gaW5kZXhPZiAodmFsLCBieXRlT2Zmc2V0LCBlbmNvZGluZykge1xuICByZXR1cm4gYmlkaXJlY3Rpb25hbEluZGV4T2YodGhpcywgdmFsLCBieXRlT2Zmc2V0LCBlbmNvZGluZywgdHJ1ZSlcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5sYXN0SW5kZXhPZiA9IGZ1bmN0aW9uIGxhc3RJbmRleE9mICh2YWwsIGJ5dGVPZmZzZXQsIGVuY29kaW5nKSB7XG4gIHJldHVybiBiaWRpcmVjdGlvbmFsSW5kZXhPZih0aGlzLCB2YWwsIGJ5dGVPZmZzZXQsIGVuY29kaW5nLCBmYWxzZSlcbn1cblxuZnVuY3Rpb24gaGV4V3JpdGUgKGJ1Ziwgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aCkge1xuICBvZmZzZXQgPSBOdW1iZXIob2Zmc2V0KSB8fCAwXG4gIHZhciByZW1haW5pbmcgPSBidWYubGVuZ3RoIC0gb2Zmc2V0XG4gIGlmICghbGVuZ3RoKSB7XG4gICAgbGVuZ3RoID0gcmVtYWluaW5nXG4gIH0gZWxzZSB7XG4gICAgbGVuZ3RoID0gTnVtYmVyKGxlbmd0aClcbiAgICBpZiAobGVuZ3RoID4gcmVtYWluaW5nKSB7XG4gICAgICBsZW5ndGggPSByZW1haW5pbmdcbiAgICB9XG4gIH1cblxuICAvLyBtdXN0IGJlIGFuIGV2ZW4gbnVtYmVyIG9mIGRpZ2l0c1xuICB2YXIgc3RyTGVuID0gc3RyaW5nLmxlbmd0aFxuICBpZiAoc3RyTGVuICUgMiAhPT0gMCkgdGhyb3cgbmV3IFR5cGVFcnJvcignSW52YWxpZCBoZXggc3RyaW5nJylcblxuICBpZiAobGVuZ3RoID4gc3RyTGVuIC8gMikge1xuICAgIGxlbmd0aCA9IHN0ckxlbiAvIDJcbiAgfVxuICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbmd0aDsgKytpKSB7XG4gICAgdmFyIHBhcnNlZCA9IHBhcnNlSW50KHN0cmluZy5zdWJzdHIoaSAqIDIsIDIpLCAxNilcbiAgICBpZiAoaXNOYU4ocGFyc2VkKSkgcmV0dXJuIGlcbiAgICBidWZbb2Zmc2V0ICsgaV0gPSBwYXJzZWRcbiAgfVxuICByZXR1cm4gaVxufVxuXG5mdW5jdGlvbiB1dGY4V3JpdGUgKGJ1Ziwgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aCkge1xuICByZXR1cm4gYmxpdEJ1ZmZlcih1dGY4VG9CeXRlcyhzdHJpbmcsIGJ1Zi5sZW5ndGggLSBvZmZzZXQpLCBidWYsIG9mZnNldCwgbGVuZ3RoKVxufVxuXG5mdW5jdGlvbiBhc2NpaVdyaXRlIChidWYsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpIHtcbiAgcmV0dXJuIGJsaXRCdWZmZXIoYXNjaWlUb0J5dGVzKHN0cmluZyksIGJ1Ziwgb2Zmc2V0LCBsZW5ndGgpXG59XG5cbmZ1bmN0aW9uIGxhdGluMVdyaXRlIChidWYsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpIHtcbiAgcmV0dXJuIGFzY2lpV3JpdGUoYnVmLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKVxufVxuXG5mdW5jdGlvbiBiYXNlNjRXcml0ZSAoYnVmLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKSB7XG4gIHJldHVybiBibGl0QnVmZmVyKGJhc2U2NFRvQnl0ZXMoc3RyaW5nKSwgYnVmLCBvZmZzZXQsIGxlbmd0aClcbn1cblxuZnVuY3Rpb24gdWNzMldyaXRlIChidWYsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpIHtcbiAgcmV0dXJuIGJsaXRCdWZmZXIodXRmMTZsZVRvQnl0ZXMoc3RyaW5nLCBidWYubGVuZ3RoIC0gb2Zmc2V0KSwgYnVmLCBvZmZzZXQsIGxlbmd0aClcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZSA9IGZ1bmN0aW9uIHdyaXRlIChzdHJpbmcsIG9mZnNldCwgbGVuZ3RoLCBlbmNvZGluZykge1xuICAvLyBCdWZmZXIjd3JpdGUoc3RyaW5nKVxuICBpZiAob2Zmc2V0ID09PSB1bmRlZmluZWQpIHtcbiAgICBlbmNvZGluZyA9ICd1dGY4J1xuICAgIGxlbmd0aCA9IHRoaXMubGVuZ3RoXG4gICAgb2Zmc2V0ID0gMFxuICAvLyBCdWZmZXIjd3JpdGUoc3RyaW5nLCBlbmNvZGluZylcbiAgfSBlbHNlIGlmIChsZW5ndGggPT09IHVuZGVmaW5lZCAmJiB0eXBlb2Ygb2Zmc2V0ID09PSAnc3RyaW5nJykge1xuICAgIGVuY29kaW5nID0gb2Zmc2V0XG4gICAgbGVuZ3RoID0gdGhpcy5sZW5ndGhcbiAgICBvZmZzZXQgPSAwXG4gIC8vIEJ1ZmZlciN3cml0ZShzdHJpbmcsIG9mZnNldFssIGxlbmd0aF1bLCBlbmNvZGluZ10pXG4gIH0gZWxzZSBpZiAoaXNGaW5pdGUob2Zmc2V0KSkge1xuICAgIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgICBpZiAoaXNGaW5pdGUobGVuZ3RoKSkge1xuICAgICAgbGVuZ3RoID0gbGVuZ3RoIHwgMFxuICAgICAgaWYgKGVuY29kaW5nID09PSB1bmRlZmluZWQpIGVuY29kaW5nID0gJ3V0ZjgnXG4gICAgfSBlbHNlIHtcbiAgICAgIGVuY29kaW5nID0gbGVuZ3RoXG4gICAgICBsZW5ndGggPSB1bmRlZmluZWRcbiAgICB9XG4gIC8vIGxlZ2FjeSB3cml0ZShzdHJpbmcsIGVuY29kaW5nLCBvZmZzZXQsIGxlbmd0aCkgLSByZW1vdmUgaW4gdjAuMTNcbiAgfSBlbHNlIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoXG4gICAgICAnQnVmZmVyLndyaXRlKHN0cmluZywgZW5jb2RpbmcsIG9mZnNldFssIGxlbmd0aF0pIGlzIG5vIGxvbmdlciBzdXBwb3J0ZWQnXG4gICAgKVxuICB9XG5cbiAgdmFyIHJlbWFpbmluZyA9IHRoaXMubGVuZ3RoIC0gb2Zmc2V0XG4gIGlmIChsZW5ndGggPT09IHVuZGVmaW5lZCB8fCBsZW5ndGggPiByZW1haW5pbmcpIGxlbmd0aCA9IHJlbWFpbmluZ1xuXG4gIGlmICgoc3RyaW5nLmxlbmd0aCA+IDAgJiYgKGxlbmd0aCA8IDAgfHwgb2Zmc2V0IDwgMCkpIHx8IG9mZnNldCA+IHRoaXMubGVuZ3RoKSB7XG4gICAgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ0F0dGVtcHQgdG8gd3JpdGUgb3V0c2lkZSBidWZmZXIgYm91bmRzJylcbiAgfVxuXG4gIGlmICghZW5jb2RpbmcpIGVuY29kaW5nID0gJ3V0ZjgnXG5cbiAgdmFyIGxvd2VyZWRDYXNlID0gZmFsc2VcbiAgZm9yICg7Oykge1xuICAgIHN3aXRjaCAoZW5jb2RpbmcpIHtcbiAgICAgIGNhc2UgJ2hleCc6XG4gICAgICAgIHJldHVybiBoZXhXcml0ZSh0aGlzLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKVxuXG4gICAgICBjYXNlICd1dGY4JzpcbiAgICAgIGNhc2UgJ3V0Zi04JzpcbiAgICAgICAgcmV0dXJuIHV0ZjhXcml0ZSh0aGlzLCBzdHJpbmcsIG9mZnNldCwgbGVuZ3RoKVxuXG4gICAgICBjYXNlICdhc2NpaSc6XG4gICAgICAgIHJldHVybiBhc2NpaVdyaXRlKHRoaXMsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpXG5cbiAgICAgIGNhc2UgJ2xhdGluMSc6XG4gICAgICBjYXNlICdiaW5hcnknOlxuICAgICAgICByZXR1cm4gbGF0aW4xV3JpdGUodGhpcywgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aClcblxuICAgICAgY2FzZSAnYmFzZTY0JzpcbiAgICAgICAgLy8gV2FybmluZzogbWF4TGVuZ3RoIG5vdCB0YWtlbiBpbnRvIGFjY291bnQgaW4gYmFzZTY0V3JpdGVcbiAgICAgICAgcmV0dXJuIGJhc2U2NFdyaXRlKHRoaXMsIHN0cmluZywgb2Zmc2V0LCBsZW5ndGgpXG5cbiAgICAgIGNhc2UgJ3VjczInOlxuICAgICAgY2FzZSAndWNzLTInOlxuICAgICAgY2FzZSAndXRmMTZsZSc6XG4gICAgICBjYXNlICd1dGYtMTZsZSc6XG4gICAgICAgIHJldHVybiB1Y3MyV3JpdGUodGhpcywgc3RyaW5nLCBvZmZzZXQsIGxlbmd0aClcblxuICAgICAgZGVmYXVsdDpcbiAgICAgICAgaWYgKGxvd2VyZWRDYXNlKSB0aHJvdyBuZXcgVHlwZUVycm9yKCdVbmtub3duIGVuY29kaW5nOiAnICsgZW5jb2RpbmcpXG4gICAgICAgIGVuY29kaW5nID0gKCcnICsgZW5jb2RpbmcpLnRvTG93ZXJDYXNlKClcbiAgICAgICAgbG93ZXJlZENhc2UgPSB0cnVlXG4gICAgfVxuICB9XG59XG5cbkJ1ZmZlci5wcm90b3R5cGUudG9KU09OID0gZnVuY3Rpb24gdG9KU09OICgpIHtcbiAgcmV0dXJuIHtcbiAgICB0eXBlOiAnQnVmZmVyJyxcbiAgICBkYXRhOiBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbCh0aGlzLl9hcnIgfHwgdGhpcywgMClcbiAgfVxufVxuXG5mdW5jdGlvbiBiYXNlNjRTbGljZSAoYnVmLCBzdGFydCwgZW5kKSB7XG4gIGlmIChzdGFydCA9PT0gMCAmJiBlbmQgPT09IGJ1Zi5sZW5ndGgpIHtcbiAgICByZXR1cm4gYmFzZTY0LmZyb21CeXRlQXJyYXkoYnVmKVxuICB9IGVsc2Uge1xuICAgIHJldHVybiBiYXNlNjQuZnJvbUJ5dGVBcnJheShidWYuc2xpY2Uoc3RhcnQsIGVuZCkpXG4gIH1cbn1cblxuZnVuY3Rpb24gdXRmOFNsaWNlIChidWYsIHN0YXJ0LCBlbmQpIHtcbiAgZW5kID0gTWF0aC5taW4oYnVmLmxlbmd0aCwgZW5kKVxuICB2YXIgcmVzID0gW11cblxuICB2YXIgaSA9IHN0YXJ0XG4gIHdoaWxlIChpIDwgZW5kKSB7XG4gICAgdmFyIGZpcnN0Qnl0ZSA9IGJ1ZltpXVxuICAgIHZhciBjb2RlUG9pbnQgPSBudWxsXG4gICAgdmFyIGJ5dGVzUGVyU2VxdWVuY2UgPSAoZmlyc3RCeXRlID4gMHhFRikgPyA0XG4gICAgICA6IChmaXJzdEJ5dGUgPiAweERGKSA/IDNcbiAgICAgIDogKGZpcnN0Qnl0ZSA+IDB4QkYpID8gMlxuICAgICAgOiAxXG5cbiAgICBpZiAoaSArIGJ5dGVzUGVyU2VxdWVuY2UgPD0gZW5kKSB7XG4gICAgICB2YXIgc2Vjb25kQnl0ZSwgdGhpcmRCeXRlLCBmb3VydGhCeXRlLCB0ZW1wQ29kZVBvaW50XG5cbiAgICAgIHN3aXRjaCAoYnl0ZXNQZXJTZXF1ZW5jZSkge1xuICAgICAgICBjYXNlIDE6XG4gICAgICAgICAgaWYgKGZpcnN0Qnl0ZSA8IDB4ODApIHtcbiAgICAgICAgICAgIGNvZGVQb2ludCA9IGZpcnN0Qnl0ZVxuICAgICAgICAgIH1cbiAgICAgICAgICBicmVha1xuICAgICAgICBjYXNlIDI6XG4gICAgICAgICAgc2Vjb25kQnl0ZSA9IGJ1ZltpICsgMV1cbiAgICAgICAgICBpZiAoKHNlY29uZEJ5dGUgJiAweEMwKSA9PT0gMHg4MCkge1xuICAgICAgICAgICAgdGVtcENvZGVQb2ludCA9IChmaXJzdEJ5dGUgJiAweDFGKSA8PCAweDYgfCAoc2Vjb25kQnl0ZSAmIDB4M0YpXG4gICAgICAgICAgICBpZiAodGVtcENvZGVQb2ludCA+IDB4N0YpIHtcbiAgICAgICAgICAgICAgY29kZVBvaW50ID0gdGVtcENvZGVQb2ludFxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBicmVha1xuICAgICAgICBjYXNlIDM6XG4gICAgICAgICAgc2Vjb25kQnl0ZSA9IGJ1ZltpICsgMV1cbiAgICAgICAgICB0aGlyZEJ5dGUgPSBidWZbaSArIDJdXG4gICAgICAgICAgaWYgKChzZWNvbmRCeXRlICYgMHhDMCkgPT09IDB4ODAgJiYgKHRoaXJkQnl0ZSAmIDB4QzApID09PSAweDgwKSB7XG4gICAgICAgICAgICB0ZW1wQ29kZVBvaW50ID0gKGZpcnN0Qnl0ZSAmIDB4RikgPDwgMHhDIHwgKHNlY29uZEJ5dGUgJiAweDNGKSA8PCAweDYgfCAodGhpcmRCeXRlICYgMHgzRilcbiAgICAgICAgICAgIGlmICh0ZW1wQ29kZVBvaW50ID4gMHg3RkYgJiYgKHRlbXBDb2RlUG9pbnQgPCAweEQ4MDAgfHwgdGVtcENvZGVQb2ludCA+IDB4REZGRikpIHtcbiAgICAgICAgICAgICAgY29kZVBvaW50ID0gdGVtcENvZGVQb2ludFxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgICAgICBicmVha1xuICAgICAgICBjYXNlIDQ6XG4gICAgICAgICAgc2Vjb25kQnl0ZSA9IGJ1ZltpICsgMV1cbiAgICAgICAgICB0aGlyZEJ5dGUgPSBidWZbaSArIDJdXG4gICAgICAgICAgZm91cnRoQnl0ZSA9IGJ1ZltpICsgM11cbiAgICAgICAgICBpZiAoKHNlY29uZEJ5dGUgJiAweEMwKSA9PT0gMHg4MCAmJiAodGhpcmRCeXRlICYgMHhDMCkgPT09IDB4ODAgJiYgKGZvdXJ0aEJ5dGUgJiAweEMwKSA9PT0gMHg4MCkge1xuICAgICAgICAgICAgdGVtcENvZGVQb2ludCA9IChmaXJzdEJ5dGUgJiAweEYpIDw8IDB4MTIgfCAoc2Vjb25kQnl0ZSAmIDB4M0YpIDw8IDB4QyB8ICh0aGlyZEJ5dGUgJiAweDNGKSA8PCAweDYgfCAoZm91cnRoQnl0ZSAmIDB4M0YpXG4gICAgICAgICAgICBpZiAodGVtcENvZGVQb2ludCA+IDB4RkZGRiAmJiB0ZW1wQ29kZVBvaW50IDwgMHgxMTAwMDApIHtcbiAgICAgICAgICAgICAgY29kZVBvaW50ID0gdGVtcENvZGVQb2ludFxuICAgICAgICAgICAgfVxuICAgICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoY29kZVBvaW50ID09PSBudWxsKSB7XG4gICAgICAvLyB3ZSBkaWQgbm90IGdlbmVyYXRlIGEgdmFsaWQgY29kZVBvaW50IHNvIGluc2VydCBhXG4gICAgICAvLyByZXBsYWNlbWVudCBjaGFyIChVK0ZGRkQpIGFuZCBhZHZhbmNlIG9ubHkgMSBieXRlXG4gICAgICBjb2RlUG9pbnQgPSAweEZGRkRcbiAgICAgIGJ5dGVzUGVyU2VxdWVuY2UgPSAxXG4gICAgfSBlbHNlIGlmIChjb2RlUG9pbnQgPiAweEZGRkYpIHtcbiAgICAgIC8vIGVuY29kZSB0byB1dGYxNiAoc3Vycm9nYXRlIHBhaXIgZGFuY2UpXG4gICAgICBjb2RlUG9pbnQgLT0gMHgxMDAwMFxuICAgICAgcmVzLnB1c2goY29kZVBvaW50ID4+PiAxMCAmIDB4M0ZGIHwgMHhEODAwKVxuICAgICAgY29kZVBvaW50ID0gMHhEQzAwIHwgY29kZVBvaW50ICYgMHgzRkZcbiAgICB9XG5cbiAgICByZXMucHVzaChjb2RlUG9pbnQpXG4gICAgaSArPSBieXRlc1BlclNlcXVlbmNlXG4gIH1cblxuICByZXR1cm4gZGVjb2RlQ29kZVBvaW50c0FycmF5KHJlcylcbn1cblxuLy8gQmFzZWQgb24gaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL2EvMjI3NDcyNzIvNjgwNzQyLCB0aGUgYnJvd3NlciB3aXRoXG4vLyB0aGUgbG93ZXN0IGxpbWl0IGlzIENocm9tZSwgd2l0aCAweDEwMDAwIGFyZ3MuXG4vLyBXZSBnbyAxIG1hZ25pdHVkZSBsZXNzLCBmb3Igc2FmZXR5XG52YXIgTUFYX0FSR1VNRU5UU19MRU5HVEggPSAweDEwMDBcblxuZnVuY3Rpb24gZGVjb2RlQ29kZVBvaW50c0FycmF5IChjb2RlUG9pbnRzKSB7XG4gIHZhciBsZW4gPSBjb2RlUG9pbnRzLmxlbmd0aFxuICBpZiAobGVuIDw9IE1BWF9BUkdVTUVOVFNfTEVOR1RIKSB7XG4gICAgcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkoU3RyaW5nLCBjb2RlUG9pbnRzKSAvLyBhdm9pZCBleHRyYSBzbGljZSgpXG4gIH1cblxuICAvLyBEZWNvZGUgaW4gY2h1bmtzIHRvIGF2b2lkIFwiY2FsbCBzdGFjayBzaXplIGV4Y2VlZGVkXCIuXG4gIHZhciByZXMgPSAnJ1xuICB2YXIgaSA9IDBcbiAgd2hpbGUgKGkgPCBsZW4pIHtcbiAgICByZXMgKz0gU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShcbiAgICAgIFN0cmluZyxcbiAgICAgIGNvZGVQb2ludHMuc2xpY2UoaSwgaSArPSBNQVhfQVJHVU1FTlRTX0xFTkdUSClcbiAgICApXG4gIH1cbiAgcmV0dXJuIHJlc1xufVxuXG5mdW5jdGlvbiBhc2NpaVNsaWNlIChidWYsIHN0YXJ0LCBlbmQpIHtcbiAgdmFyIHJldCA9ICcnXG4gIGVuZCA9IE1hdGgubWluKGJ1Zi5sZW5ndGgsIGVuZClcblxuICBmb3IgKHZhciBpID0gc3RhcnQ7IGkgPCBlbmQ7ICsraSkge1xuICAgIHJldCArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGJ1ZltpXSAmIDB4N0YpXG4gIH1cbiAgcmV0dXJuIHJldFxufVxuXG5mdW5jdGlvbiBsYXRpbjFTbGljZSAoYnVmLCBzdGFydCwgZW5kKSB7XG4gIHZhciByZXQgPSAnJ1xuICBlbmQgPSBNYXRoLm1pbihidWYubGVuZ3RoLCBlbmQpXG5cbiAgZm9yICh2YXIgaSA9IHN0YXJ0OyBpIDwgZW5kOyArK2kpIHtcbiAgICByZXQgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShidWZbaV0pXG4gIH1cbiAgcmV0dXJuIHJldFxufVxuXG5mdW5jdGlvbiBoZXhTbGljZSAoYnVmLCBzdGFydCwgZW5kKSB7XG4gIHZhciBsZW4gPSBidWYubGVuZ3RoXG5cbiAgaWYgKCFzdGFydCB8fCBzdGFydCA8IDApIHN0YXJ0ID0gMFxuICBpZiAoIWVuZCB8fCBlbmQgPCAwIHx8IGVuZCA+IGxlbikgZW5kID0gbGVuXG5cbiAgdmFyIG91dCA9ICcnXG4gIGZvciAodmFyIGkgPSBzdGFydDsgaSA8IGVuZDsgKytpKSB7XG4gICAgb3V0ICs9IHRvSGV4KGJ1ZltpXSlcbiAgfVxuICByZXR1cm4gb3V0XG59XG5cbmZ1bmN0aW9uIHV0ZjE2bGVTbGljZSAoYnVmLCBzdGFydCwgZW5kKSB7XG4gIHZhciBieXRlcyA9IGJ1Zi5zbGljZShzdGFydCwgZW5kKVxuICB2YXIgcmVzID0gJydcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBieXRlcy5sZW5ndGg7IGkgKz0gMikge1xuICAgIHJlcyArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGJ5dGVzW2ldICsgYnl0ZXNbaSArIDFdICogMjU2KVxuICB9XG4gIHJldHVybiByZXNcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5zbGljZSA9IGZ1bmN0aW9uIHNsaWNlIChzdGFydCwgZW5kKSB7XG4gIHZhciBsZW4gPSB0aGlzLmxlbmd0aFxuICBzdGFydCA9IH5+c3RhcnRcbiAgZW5kID0gZW5kID09PSB1bmRlZmluZWQgPyBsZW4gOiB+fmVuZFxuXG4gIGlmIChzdGFydCA8IDApIHtcbiAgICBzdGFydCArPSBsZW5cbiAgICBpZiAoc3RhcnQgPCAwKSBzdGFydCA9IDBcbiAgfSBlbHNlIGlmIChzdGFydCA+IGxlbikge1xuICAgIHN0YXJ0ID0gbGVuXG4gIH1cblxuICBpZiAoZW5kIDwgMCkge1xuICAgIGVuZCArPSBsZW5cbiAgICBpZiAoZW5kIDwgMCkgZW5kID0gMFxuICB9IGVsc2UgaWYgKGVuZCA+IGxlbikge1xuICAgIGVuZCA9IGxlblxuICB9XG5cbiAgaWYgKGVuZCA8IHN0YXJ0KSBlbmQgPSBzdGFydFxuXG4gIHZhciBuZXdCdWZcbiAgaWYgKEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB7XG4gICAgbmV3QnVmID0gdGhpcy5zdWJhcnJheShzdGFydCwgZW5kKVxuICAgIG5ld0J1Zi5fX3Byb3RvX18gPSBCdWZmZXIucHJvdG90eXBlXG4gIH0gZWxzZSB7XG4gICAgdmFyIHNsaWNlTGVuID0gZW5kIC0gc3RhcnRcbiAgICBuZXdCdWYgPSBuZXcgQnVmZmVyKHNsaWNlTGVuLCB1bmRlZmluZWQpXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzbGljZUxlbjsgKytpKSB7XG4gICAgICBuZXdCdWZbaV0gPSB0aGlzW2kgKyBzdGFydF1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gbmV3QnVmXG59XG5cbi8qXG4gKiBOZWVkIHRvIG1ha2Ugc3VyZSB0aGF0IGJ1ZmZlciBpc24ndCB0cnlpbmcgdG8gd3JpdGUgb3V0IG9mIGJvdW5kcy5cbiAqL1xuZnVuY3Rpb24gY2hlY2tPZmZzZXQgKG9mZnNldCwgZXh0LCBsZW5ndGgpIHtcbiAgaWYgKChvZmZzZXQgJSAxKSAhPT0gMCB8fCBvZmZzZXQgPCAwKSB0aHJvdyBuZXcgUmFuZ2VFcnJvcignb2Zmc2V0IGlzIG5vdCB1aW50JylcbiAgaWYgKG9mZnNldCArIGV4dCA+IGxlbmd0aCkgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ1RyeWluZyB0byBhY2Nlc3MgYmV5b25kIGJ1ZmZlciBsZW5ndGgnKVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRVSW50TEUgPSBmdW5jdGlvbiByZWFkVUludExFIChvZmZzZXQsIGJ5dGVMZW5ndGgsIG5vQXNzZXJ0KSB7XG4gIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgYnl0ZUxlbmd0aCA9IGJ5dGVMZW5ndGggfCAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgYnl0ZUxlbmd0aCwgdGhpcy5sZW5ndGgpXG5cbiAgdmFyIHZhbCA9IHRoaXNbb2Zmc2V0XVxuICB2YXIgbXVsID0gMVxuICB2YXIgaSA9IDBcbiAgd2hpbGUgKCsraSA8IGJ5dGVMZW5ndGggJiYgKG11bCAqPSAweDEwMCkpIHtcbiAgICB2YWwgKz0gdGhpc1tvZmZzZXQgKyBpXSAqIG11bFxuICB9XG5cbiAgcmV0dXJuIHZhbFxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRVSW50QkUgPSBmdW5jdGlvbiByZWFkVUludEJFIChvZmZzZXQsIGJ5dGVMZW5ndGgsIG5vQXNzZXJ0KSB7XG4gIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgYnl0ZUxlbmd0aCA9IGJ5dGVMZW5ndGggfCAwXG4gIGlmICghbm9Bc3NlcnQpIHtcbiAgICBjaGVja09mZnNldChvZmZzZXQsIGJ5dGVMZW5ndGgsIHRoaXMubGVuZ3RoKVxuICB9XG5cbiAgdmFyIHZhbCA9IHRoaXNbb2Zmc2V0ICsgLS1ieXRlTGVuZ3RoXVxuICB2YXIgbXVsID0gMVxuICB3aGlsZSAoYnl0ZUxlbmd0aCA+IDAgJiYgKG11bCAqPSAweDEwMCkpIHtcbiAgICB2YWwgKz0gdGhpc1tvZmZzZXQgKyAtLWJ5dGVMZW5ndGhdICogbXVsXG4gIH1cblxuICByZXR1cm4gdmFsXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZFVJbnQ4ID0gZnVuY3Rpb24gcmVhZFVJbnQ4IChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgMSwgdGhpcy5sZW5ndGgpXG4gIHJldHVybiB0aGlzW29mZnNldF1cbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkVUludDE2TEUgPSBmdW5jdGlvbiByZWFkVUludDE2TEUgKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCAyLCB0aGlzLmxlbmd0aClcbiAgcmV0dXJuIHRoaXNbb2Zmc2V0XSB8ICh0aGlzW29mZnNldCArIDFdIDw8IDgpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZFVJbnQxNkJFID0gZnVuY3Rpb24gcmVhZFVJbnQxNkJFIChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgMiwgdGhpcy5sZW5ndGgpXG4gIHJldHVybiAodGhpc1tvZmZzZXRdIDw8IDgpIHwgdGhpc1tvZmZzZXQgKyAxXVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRVSW50MzJMRSA9IGZ1bmN0aW9uIHJlYWRVSW50MzJMRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDQsIHRoaXMubGVuZ3RoKVxuXG4gIHJldHVybiAoKHRoaXNbb2Zmc2V0XSkgfFxuICAgICAgKHRoaXNbb2Zmc2V0ICsgMV0gPDwgOCkgfFxuICAgICAgKHRoaXNbb2Zmc2V0ICsgMl0gPDwgMTYpKSArXG4gICAgICAodGhpc1tvZmZzZXQgKyAzXSAqIDB4MTAwMDAwMClcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkVUludDMyQkUgPSBmdW5jdGlvbiByZWFkVUludDMyQkUgKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCA0LCB0aGlzLmxlbmd0aClcblxuICByZXR1cm4gKHRoaXNbb2Zmc2V0XSAqIDB4MTAwMDAwMCkgK1xuICAgICgodGhpc1tvZmZzZXQgKyAxXSA8PCAxNikgfFxuICAgICh0aGlzW29mZnNldCArIDJdIDw8IDgpIHxcbiAgICB0aGlzW29mZnNldCArIDNdKVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRJbnRMRSA9IGZ1bmN0aW9uIHJlYWRJbnRMRSAob2Zmc2V0LCBieXRlTGVuZ3RoLCBub0Fzc2VydCkge1xuICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gIGJ5dGVMZW5ndGggPSBieXRlTGVuZ3RoIHwgMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIGJ5dGVMZW5ndGgsIHRoaXMubGVuZ3RoKVxuXG4gIHZhciB2YWwgPSB0aGlzW29mZnNldF1cbiAgdmFyIG11bCA9IDFcbiAgdmFyIGkgPSAwXG4gIHdoaWxlICgrK2kgPCBieXRlTGVuZ3RoICYmIChtdWwgKj0gMHgxMDApKSB7XG4gICAgdmFsICs9IHRoaXNbb2Zmc2V0ICsgaV0gKiBtdWxcbiAgfVxuICBtdWwgKj0gMHg4MFxuXG4gIGlmICh2YWwgPj0gbXVsKSB2YWwgLT0gTWF0aC5wb3coMiwgOCAqIGJ5dGVMZW5ndGgpXG5cbiAgcmV0dXJuIHZhbFxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRJbnRCRSA9IGZ1bmN0aW9uIHJlYWRJbnRCRSAob2Zmc2V0LCBieXRlTGVuZ3RoLCBub0Fzc2VydCkge1xuICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gIGJ5dGVMZW5ndGggPSBieXRlTGVuZ3RoIHwgMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIGJ5dGVMZW5ndGgsIHRoaXMubGVuZ3RoKVxuXG4gIHZhciBpID0gYnl0ZUxlbmd0aFxuICB2YXIgbXVsID0gMVxuICB2YXIgdmFsID0gdGhpc1tvZmZzZXQgKyAtLWldXG4gIHdoaWxlIChpID4gMCAmJiAobXVsICo9IDB4MTAwKSkge1xuICAgIHZhbCArPSB0aGlzW29mZnNldCArIC0taV0gKiBtdWxcbiAgfVxuICBtdWwgKj0gMHg4MFxuXG4gIGlmICh2YWwgPj0gbXVsKSB2YWwgLT0gTWF0aC5wb3coMiwgOCAqIGJ5dGVMZW5ndGgpXG5cbiAgcmV0dXJuIHZhbFxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRJbnQ4ID0gZnVuY3Rpb24gcmVhZEludDggKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCAxLCB0aGlzLmxlbmd0aClcbiAgaWYgKCEodGhpc1tvZmZzZXRdICYgMHg4MCkpIHJldHVybiAodGhpc1tvZmZzZXRdKVxuICByZXR1cm4gKCgweGZmIC0gdGhpc1tvZmZzZXRdICsgMSkgKiAtMSlcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkSW50MTZMRSA9IGZ1bmN0aW9uIHJlYWRJbnQxNkxFIChvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrT2Zmc2V0KG9mZnNldCwgMiwgdGhpcy5sZW5ndGgpXG4gIHZhciB2YWwgPSB0aGlzW29mZnNldF0gfCAodGhpc1tvZmZzZXQgKyAxXSA8PCA4KVxuICByZXR1cm4gKHZhbCAmIDB4ODAwMCkgPyB2YWwgfCAweEZGRkYwMDAwIDogdmFsXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUucmVhZEludDE2QkUgPSBmdW5jdGlvbiByZWFkSW50MTZCRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDIsIHRoaXMubGVuZ3RoKVxuICB2YXIgdmFsID0gdGhpc1tvZmZzZXQgKyAxXSB8ICh0aGlzW29mZnNldF0gPDwgOClcbiAgcmV0dXJuICh2YWwgJiAweDgwMDApID8gdmFsIHwgMHhGRkZGMDAwMCA6IHZhbFxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRJbnQzMkxFID0gZnVuY3Rpb24gcmVhZEludDMyTEUgKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCA0LCB0aGlzLmxlbmd0aClcblxuICByZXR1cm4gKHRoaXNbb2Zmc2V0XSkgfFxuICAgICh0aGlzW29mZnNldCArIDFdIDw8IDgpIHxcbiAgICAodGhpc1tvZmZzZXQgKyAyXSA8PCAxNikgfFxuICAgICh0aGlzW29mZnNldCArIDNdIDw8IDI0KVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRJbnQzMkJFID0gZnVuY3Rpb24gcmVhZEludDMyQkUgKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCA0LCB0aGlzLmxlbmd0aClcblxuICByZXR1cm4gKHRoaXNbb2Zmc2V0XSA8PCAyNCkgfFxuICAgICh0aGlzW29mZnNldCArIDFdIDw8IDE2KSB8XG4gICAgKHRoaXNbb2Zmc2V0ICsgMl0gPDwgOCkgfFxuICAgICh0aGlzW29mZnNldCArIDNdKVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRGbG9hdExFID0gZnVuY3Rpb24gcmVhZEZsb2F0TEUgKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCA0LCB0aGlzLmxlbmd0aClcbiAgcmV0dXJuIGllZWU3NTQucmVhZCh0aGlzLCBvZmZzZXQsIHRydWUsIDIzLCA0KVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWRGbG9hdEJFID0gZnVuY3Rpb24gcmVhZEZsb2F0QkUgKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCA0LCB0aGlzLmxlbmd0aClcbiAgcmV0dXJuIGllZWU3NTQucmVhZCh0aGlzLCBvZmZzZXQsIGZhbHNlLCAyMywgNClcbn1cblxuQnVmZmVyLnByb3RvdHlwZS5yZWFkRG91YmxlTEUgPSBmdW5jdGlvbiByZWFkRG91YmxlTEUgKG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tPZmZzZXQob2Zmc2V0LCA4LCB0aGlzLmxlbmd0aClcbiAgcmV0dXJuIGllZWU3NTQucmVhZCh0aGlzLCBvZmZzZXQsIHRydWUsIDUyLCA4KVxufVxuXG5CdWZmZXIucHJvdG90eXBlLnJlYWREb3VibGVCRSA9IGZ1bmN0aW9uIHJlYWREb3VibGVCRSAob2Zmc2V0LCBub0Fzc2VydCkge1xuICBpZiAoIW5vQXNzZXJ0KSBjaGVja09mZnNldChvZmZzZXQsIDgsIHRoaXMubGVuZ3RoKVxuICByZXR1cm4gaWVlZTc1NC5yZWFkKHRoaXMsIG9mZnNldCwgZmFsc2UsIDUyLCA4KVxufVxuXG5mdW5jdGlvbiBjaGVja0ludCAoYnVmLCB2YWx1ZSwgb2Zmc2V0LCBleHQsIG1heCwgbWluKSB7XG4gIGlmICghQnVmZmVyLmlzQnVmZmVyKGJ1ZikpIHRocm93IG5ldyBUeXBlRXJyb3IoJ1wiYnVmZmVyXCIgYXJndW1lbnQgbXVzdCBiZSBhIEJ1ZmZlciBpbnN0YW5jZScpXG4gIGlmICh2YWx1ZSA+IG1heCB8fCB2YWx1ZSA8IG1pbikgdGhyb3cgbmV3IFJhbmdlRXJyb3IoJ1widmFsdWVcIiBhcmd1bWVudCBpcyBvdXQgb2YgYm91bmRzJylcbiAgaWYgKG9mZnNldCArIGV4dCA+IGJ1Zi5sZW5ndGgpIHRocm93IG5ldyBSYW5nZUVycm9yKCdJbmRleCBvdXQgb2YgcmFuZ2UnKVxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlVUludExFID0gZnVuY3Rpb24gd3JpdGVVSW50TEUgKHZhbHVlLCBvZmZzZXQsIGJ5dGVMZW5ndGgsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgYnl0ZUxlbmd0aCA9IGJ5dGVMZW5ndGggfCAwXG4gIGlmICghbm9Bc3NlcnQpIHtcbiAgICB2YXIgbWF4Qnl0ZXMgPSBNYXRoLnBvdygyLCA4ICogYnl0ZUxlbmd0aCkgLSAxXG4gICAgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgYnl0ZUxlbmd0aCwgbWF4Qnl0ZXMsIDApXG4gIH1cblxuICB2YXIgbXVsID0gMVxuICB2YXIgaSA9IDBcbiAgdGhpc1tvZmZzZXRdID0gdmFsdWUgJiAweEZGXG4gIHdoaWxlICgrK2kgPCBieXRlTGVuZ3RoICYmIChtdWwgKj0gMHgxMDApKSB7XG4gICAgdGhpc1tvZmZzZXQgKyBpXSA9ICh2YWx1ZSAvIG11bCkgJiAweEZGXG4gIH1cblxuICByZXR1cm4gb2Zmc2V0ICsgYnl0ZUxlbmd0aFxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlVUludEJFID0gZnVuY3Rpb24gd3JpdGVVSW50QkUgKHZhbHVlLCBvZmZzZXQsIGJ5dGVMZW5ndGgsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgYnl0ZUxlbmd0aCA9IGJ5dGVMZW5ndGggfCAwXG4gIGlmICghbm9Bc3NlcnQpIHtcbiAgICB2YXIgbWF4Qnl0ZXMgPSBNYXRoLnBvdygyLCA4ICogYnl0ZUxlbmd0aCkgLSAxXG4gICAgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgYnl0ZUxlbmd0aCwgbWF4Qnl0ZXMsIDApXG4gIH1cblxuICB2YXIgaSA9IGJ5dGVMZW5ndGggLSAxXG4gIHZhciBtdWwgPSAxXG4gIHRoaXNbb2Zmc2V0ICsgaV0gPSB2YWx1ZSAmIDB4RkZcbiAgd2hpbGUgKC0taSA+PSAwICYmIChtdWwgKj0gMHgxMDApKSB7XG4gICAgdGhpc1tvZmZzZXQgKyBpXSA9ICh2YWx1ZSAvIG11bCkgJiAweEZGXG4gIH1cblxuICByZXR1cm4gb2Zmc2V0ICsgYnl0ZUxlbmd0aFxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlVUludDggPSBmdW5jdGlvbiB3cml0ZVVJbnQ4ICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIDEsIDB4ZmYsIDApXG4gIGlmICghQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHZhbHVlID0gTWF0aC5mbG9vcih2YWx1ZSlcbiAgdGhpc1tvZmZzZXRdID0gKHZhbHVlICYgMHhmZilcbiAgcmV0dXJuIG9mZnNldCArIDFcbn1cblxuZnVuY3Rpb24gb2JqZWN0V3JpdGVVSW50MTYgKGJ1ZiwgdmFsdWUsIG9mZnNldCwgbGl0dGxlRW5kaWFuKSB7XG4gIGlmICh2YWx1ZSA8IDApIHZhbHVlID0gMHhmZmZmICsgdmFsdWUgKyAxXG4gIGZvciAodmFyIGkgPSAwLCBqID0gTWF0aC5taW4oYnVmLmxlbmd0aCAtIG9mZnNldCwgMik7IGkgPCBqOyArK2kpIHtcbiAgICBidWZbb2Zmc2V0ICsgaV0gPSAodmFsdWUgJiAoMHhmZiA8PCAoOCAqIChsaXR0bGVFbmRpYW4gPyBpIDogMSAtIGkpKSkpID4+PlxuICAgICAgKGxpdHRsZUVuZGlhbiA/IGkgOiAxIC0gaSkgKiA4XG4gIH1cbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZVVJbnQxNkxFID0gZnVuY3Rpb24gd3JpdGVVSW50MTZMRSAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCAyLCAweGZmZmYsIDApXG4gIGlmIChCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCkge1xuICAgIHRoaXNbb2Zmc2V0XSA9ICh2YWx1ZSAmIDB4ZmYpXG4gICAgdGhpc1tvZmZzZXQgKyAxXSA9ICh2YWx1ZSA+Pj4gOClcbiAgfSBlbHNlIHtcbiAgICBvYmplY3RXcml0ZVVJbnQxNih0aGlzLCB2YWx1ZSwgb2Zmc2V0LCB0cnVlKVxuICB9XG4gIHJldHVybiBvZmZzZXQgKyAyXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVVSW50MTZCRSA9IGZ1bmN0aW9uIHdyaXRlVUludDE2QkUgKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgMiwgMHhmZmZmLCAwKVxuICBpZiAoQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHtcbiAgICB0aGlzW29mZnNldF0gPSAodmFsdWUgPj4+IDgpXG4gICAgdGhpc1tvZmZzZXQgKyAxXSA9ICh2YWx1ZSAmIDB4ZmYpXG4gIH0gZWxzZSB7XG4gICAgb2JqZWN0V3JpdGVVSW50MTYodGhpcywgdmFsdWUsIG9mZnNldCwgZmFsc2UpXG4gIH1cbiAgcmV0dXJuIG9mZnNldCArIDJcbn1cblxuZnVuY3Rpb24gb2JqZWN0V3JpdGVVSW50MzIgKGJ1ZiwgdmFsdWUsIG9mZnNldCwgbGl0dGxlRW5kaWFuKSB7XG4gIGlmICh2YWx1ZSA8IDApIHZhbHVlID0gMHhmZmZmZmZmZiArIHZhbHVlICsgMVxuICBmb3IgKHZhciBpID0gMCwgaiA9IE1hdGgubWluKGJ1Zi5sZW5ndGggLSBvZmZzZXQsIDQpOyBpIDwgajsgKytpKSB7XG4gICAgYnVmW29mZnNldCArIGldID0gKHZhbHVlID4+PiAobGl0dGxlRW5kaWFuID8gaSA6IDMgLSBpKSAqIDgpICYgMHhmZlxuICB9XG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVVSW50MzJMRSA9IGZ1bmN0aW9uIHdyaXRlVUludDMyTEUgKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgNCwgMHhmZmZmZmZmZiwgMClcbiAgaWYgKEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB7XG4gICAgdGhpc1tvZmZzZXQgKyAzXSA9ICh2YWx1ZSA+Pj4gMjQpXG4gICAgdGhpc1tvZmZzZXQgKyAyXSA9ICh2YWx1ZSA+Pj4gMTYpXG4gICAgdGhpc1tvZmZzZXQgKyAxXSA9ICh2YWx1ZSA+Pj4gOClcbiAgICB0aGlzW29mZnNldF0gPSAodmFsdWUgJiAweGZmKVxuICB9IGVsc2Uge1xuICAgIG9iamVjdFdyaXRlVUludDMyKHRoaXMsIHZhbHVlLCBvZmZzZXQsIHRydWUpXG4gIH1cbiAgcmV0dXJuIG9mZnNldCArIDRcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZVVJbnQzMkJFID0gZnVuY3Rpb24gd3JpdGVVSW50MzJCRSAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICBpZiAoIW5vQXNzZXJ0KSBjaGVja0ludCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCA0LCAweGZmZmZmZmZmLCAwKVxuICBpZiAoQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHtcbiAgICB0aGlzW29mZnNldF0gPSAodmFsdWUgPj4+IDI0KVxuICAgIHRoaXNbb2Zmc2V0ICsgMV0gPSAodmFsdWUgPj4+IDE2KVxuICAgIHRoaXNbb2Zmc2V0ICsgMl0gPSAodmFsdWUgPj4+IDgpXG4gICAgdGhpc1tvZmZzZXQgKyAzXSA9ICh2YWx1ZSAmIDB4ZmYpXG4gIH0gZWxzZSB7XG4gICAgb2JqZWN0V3JpdGVVSW50MzIodGhpcywgdmFsdWUsIG9mZnNldCwgZmFsc2UpXG4gIH1cbiAgcmV0dXJuIG9mZnNldCArIDRcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZUludExFID0gZnVuY3Rpb24gd3JpdGVJbnRMRSAodmFsdWUsIG9mZnNldCwgYnl0ZUxlbmd0aCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICBpZiAoIW5vQXNzZXJ0KSB7XG4gICAgdmFyIGxpbWl0ID0gTWF0aC5wb3coMiwgOCAqIGJ5dGVMZW5ndGggLSAxKVxuXG4gICAgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgYnl0ZUxlbmd0aCwgbGltaXQgLSAxLCAtbGltaXQpXG4gIH1cblxuICB2YXIgaSA9IDBcbiAgdmFyIG11bCA9IDFcbiAgdmFyIHN1YiA9IDBcbiAgdGhpc1tvZmZzZXRdID0gdmFsdWUgJiAweEZGXG4gIHdoaWxlICgrK2kgPCBieXRlTGVuZ3RoICYmIChtdWwgKj0gMHgxMDApKSB7XG4gICAgaWYgKHZhbHVlIDwgMCAmJiBzdWIgPT09IDAgJiYgdGhpc1tvZmZzZXQgKyBpIC0gMV0gIT09IDApIHtcbiAgICAgIHN1YiA9IDFcbiAgICB9XG4gICAgdGhpc1tvZmZzZXQgKyBpXSA9ICgodmFsdWUgLyBtdWwpID4+IDApIC0gc3ViICYgMHhGRlxuICB9XG5cbiAgcmV0dXJuIG9mZnNldCArIGJ5dGVMZW5ndGhcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZUludEJFID0gZnVuY3Rpb24gd3JpdGVJbnRCRSAodmFsdWUsIG9mZnNldCwgYnl0ZUxlbmd0aCwgbm9Bc3NlcnQpIHtcbiAgdmFsdWUgPSArdmFsdWVcbiAgb2Zmc2V0ID0gb2Zmc2V0IHwgMFxuICBpZiAoIW5vQXNzZXJ0KSB7XG4gICAgdmFyIGxpbWl0ID0gTWF0aC5wb3coMiwgOCAqIGJ5dGVMZW5ndGggLSAxKVxuXG4gICAgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgYnl0ZUxlbmd0aCwgbGltaXQgLSAxLCAtbGltaXQpXG4gIH1cblxuICB2YXIgaSA9IGJ5dGVMZW5ndGggLSAxXG4gIHZhciBtdWwgPSAxXG4gIHZhciBzdWIgPSAwXG4gIHRoaXNbb2Zmc2V0ICsgaV0gPSB2YWx1ZSAmIDB4RkZcbiAgd2hpbGUgKC0taSA+PSAwICYmIChtdWwgKj0gMHgxMDApKSB7XG4gICAgaWYgKHZhbHVlIDwgMCAmJiBzdWIgPT09IDAgJiYgdGhpc1tvZmZzZXQgKyBpICsgMV0gIT09IDApIHtcbiAgICAgIHN1YiA9IDFcbiAgICB9XG4gICAgdGhpc1tvZmZzZXQgKyBpXSA9ICgodmFsdWUgLyBtdWwpID4+IDApIC0gc3ViICYgMHhGRlxuICB9XG5cbiAgcmV0dXJuIG9mZnNldCArIGJ5dGVMZW5ndGhcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZUludDggPSBmdW5jdGlvbiB3cml0ZUludDggKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgMSwgMHg3ZiwgLTB4ODApXG4gIGlmICghQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHZhbHVlID0gTWF0aC5mbG9vcih2YWx1ZSlcbiAgaWYgKHZhbHVlIDwgMCkgdmFsdWUgPSAweGZmICsgdmFsdWUgKyAxXG4gIHRoaXNbb2Zmc2V0XSA9ICh2YWx1ZSAmIDB4ZmYpXG4gIHJldHVybiBvZmZzZXQgKyAxXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVJbnQxNkxFID0gZnVuY3Rpb24gd3JpdGVJbnQxNkxFICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIDIsIDB4N2ZmZiwgLTB4ODAwMClcbiAgaWYgKEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB7XG4gICAgdGhpc1tvZmZzZXRdID0gKHZhbHVlICYgMHhmZilcbiAgICB0aGlzW29mZnNldCArIDFdID0gKHZhbHVlID4+PiA4KVxuICB9IGVsc2Uge1xuICAgIG9iamVjdFdyaXRlVUludDE2KHRoaXMsIHZhbHVlLCBvZmZzZXQsIHRydWUpXG4gIH1cbiAgcmV0dXJuIG9mZnNldCArIDJcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZUludDE2QkUgPSBmdW5jdGlvbiB3cml0ZUludDE2QkUgKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgMiwgMHg3ZmZmLCAtMHg4MDAwKVxuICBpZiAoQnVmZmVyLlRZUEVEX0FSUkFZX1NVUFBPUlQpIHtcbiAgICB0aGlzW29mZnNldF0gPSAodmFsdWUgPj4+IDgpXG4gICAgdGhpc1tvZmZzZXQgKyAxXSA9ICh2YWx1ZSAmIDB4ZmYpXG4gIH0gZWxzZSB7XG4gICAgb2JqZWN0V3JpdGVVSW50MTYodGhpcywgdmFsdWUsIG9mZnNldCwgZmFsc2UpXG4gIH1cbiAgcmV0dXJuIG9mZnNldCArIDJcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZUludDMyTEUgPSBmdW5jdGlvbiB3cml0ZUludDMyTEUgKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHZhbHVlID0gK3ZhbHVlXG4gIG9mZnNldCA9IG9mZnNldCB8IDBcbiAgaWYgKCFub0Fzc2VydCkgY2hlY2tJbnQodGhpcywgdmFsdWUsIG9mZnNldCwgNCwgMHg3ZmZmZmZmZiwgLTB4ODAwMDAwMDApXG4gIGlmIChCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCkge1xuICAgIHRoaXNbb2Zmc2V0XSA9ICh2YWx1ZSAmIDB4ZmYpXG4gICAgdGhpc1tvZmZzZXQgKyAxXSA9ICh2YWx1ZSA+Pj4gOClcbiAgICB0aGlzW29mZnNldCArIDJdID0gKHZhbHVlID4+PiAxNilcbiAgICB0aGlzW29mZnNldCArIDNdID0gKHZhbHVlID4+PiAyNClcbiAgfSBlbHNlIHtcbiAgICBvYmplY3RXcml0ZVVJbnQzMih0aGlzLCB2YWx1ZSwgb2Zmc2V0LCB0cnVlKVxuICB9XG4gIHJldHVybiBvZmZzZXQgKyA0XG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVJbnQzMkJFID0gZnVuY3Rpb24gd3JpdGVJbnQzMkJFICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICB2YWx1ZSA9ICt2YWx1ZVxuICBvZmZzZXQgPSBvZmZzZXQgfCAwXG4gIGlmICghbm9Bc3NlcnQpIGNoZWNrSW50KHRoaXMsIHZhbHVlLCBvZmZzZXQsIDQsIDB4N2ZmZmZmZmYsIC0weDgwMDAwMDAwKVxuICBpZiAodmFsdWUgPCAwKSB2YWx1ZSA9IDB4ZmZmZmZmZmYgKyB2YWx1ZSArIDFcbiAgaWYgKEJ1ZmZlci5UWVBFRF9BUlJBWV9TVVBQT1JUKSB7XG4gICAgdGhpc1tvZmZzZXRdID0gKHZhbHVlID4+PiAyNClcbiAgICB0aGlzW29mZnNldCArIDFdID0gKHZhbHVlID4+PiAxNilcbiAgICB0aGlzW29mZnNldCArIDJdID0gKHZhbHVlID4+PiA4KVxuICAgIHRoaXNbb2Zmc2V0ICsgM10gPSAodmFsdWUgJiAweGZmKVxuICB9IGVsc2Uge1xuICAgIG9iamVjdFdyaXRlVUludDMyKHRoaXMsIHZhbHVlLCBvZmZzZXQsIGZhbHNlKVxuICB9XG4gIHJldHVybiBvZmZzZXQgKyA0XG59XG5cbmZ1bmN0aW9uIGNoZWNrSUVFRTc1NCAoYnVmLCB2YWx1ZSwgb2Zmc2V0LCBleHQsIG1heCwgbWluKSB7XG4gIGlmIChvZmZzZXQgKyBleHQgPiBidWYubGVuZ3RoKSB0aHJvdyBuZXcgUmFuZ2VFcnJvcignSW5kZXggb3V0IG9mIHJhbmdlJylcbiAgaWYgKG9mZnNldCA8IDApIHRocm93IG5ldyBSYW5nZUVycm9yKCdJbmRleCBvdXQgb2YgcmFuZ2UnKVxufVxuXG5mdW5jdGlvbiB3cml0ZUZsb2F0IChidWYsIHZhbHVlLCBvZmZzZXQsIGxpdHRsZUVuZGlhbiwgbm9Bc3NlcnQpIHtcbiAgaWYgKCFub0Fzc2VydCkge1xuICAgIGNoZWNrSUVFRTc1NChidWYsIHZhbHVlLCBvZmZzZXQsIDQsIDMuNDAyODIzNDY2Mzg1Mjg4NmUrMzgsIC0zLjQwMjgyMzQ2NjM4NTI4ODZlKzM4KVxuICB9XG4gIGllZWU3NTQud3JpdGUoYnVmLCB2YWx1ZSwgb2Zmc2V0LCBsaXR0bGVFbmRpYW4sIDIzLCA0KVxuICByZXR1cm4gb2Zmc2V0ICsgNFxufVxuXG5CdWZmZXIucHJvdG90eXBlLndyaXRlRmxvYXRMRSA9IGZ1bmN0aW9uIHdyaXRlRmxvYXRMRSAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgcmV0dXJuIHdyaXRlRmxvYXQodGhpcywgdmFsdWUsIG9mZnNldCwgdHJ1ZSwgbm9Bc3NlcnQpXG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVGbG9hdEJFID0gZnVuY3Rpb24gd3JpdGVGbG9hdEJFICh2YWx1ZSwgb2Zmc2V0LCBub0Fzc2VydCkge1xuICByZXR1cm4gd3JpdGVGbG9hdCh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCBmYWxzZSwgbm9Bc3NlcnQpXG59XG5cbmZ1bmN0aW9uIHdyaXRlRG91YmxlIChidWYsIHZhbHVlLCBvZmZzZXQsIGxpdHRsZUVuZGlhbiwgbm9Bc3NlcnQpIHtcbiAgaWYgKCFub0Fzc2VydCkge1xuICAgIGNoZWNrSUVFRTc1NChidWYsIHZhbHVlLCBvZmZzZXQsIDgsIDEuNzk3NjkzMTM0ODYyMzE1N0UrMzA4LCAtMS43OTc2OTMxMzQ4NjIzMTU3RSszMDgpXG4gIH1cbiAgaWVlZTc1NC53cml0ZShidWYsIHZhbHVlLCBvZmZzZXQsIGxpdHRsZUVuZGlhbiwgNTIsIDgpXG4gIHJldHVybiBvZmZzZXQgKyA4XG59XG5cbkJ1ZmZlci5wcm90b3R5cGUud3JpdGVEb3VibGVMRSA9IGZ1bmN0aW9uIHdyaXRlRG91YmxlTEUgKHZhbHVlLCBvZmZzZXQsIG5vQXNzZXJ0KSB7XG4gIHJldHVybiB3cml0ZURvdWJsZSh0aGlzLCB2YWx1ZSwgb2Zmc2V0LCB0cnVlLCBub0Fzc2VydClcbn1cblxuQnVmZmVyLnByb3RvdHlwZS53cml0ZURvdWJsZUJFID0gZnVuY3Rpb24gd3JpdGVEb3VibGVCRSAodmFsdWUsIG9mZnNldCwgbm9Bc3NlcnQpIHtcbiAgcmV0dXJuIHdyaXRlRG91YmxlKHRoaXMsIHZhbHVlLCBvZmZzZXQsIGZhbHNlLCBub0Fzc2VydClcbn1cblxuLy8gY29weSh0YXJnZXRCdWZmZXIsIHRhcmdldFN0YXJ0PTAsIHNvdXJjZVN0YXJ0PTAsIHNvdXJjZUVuZD1idWZmZXIubGVuZ3RoKVxuQnVmZmVyLnByb3RvdHlwZS5jb3B5ID0gZnVuY3Rpb24gY29weSAodGFyZ2V0LCB0YXJnZXRTdGFydCwgc3RhcnQsIGVuZCkge1xuICBpZiAoIXN0YXJ0KSBzdGFydCA9IDBcbiAgaWYgKCFlbmQgJiYgZW5kICE9PSAwKSBlbmQgPSB0aGlzLmxlbmd0aFxuICBpZiAodGFyZ2V0U3RhcnQgPj0gdGFyZ2V0Lmxlbmd0aCkgdGFyZ2V0U3RhcnQgPSB0YXJnZXQubGVuZ3RoXG4gIGlmICghdGFyZ2V0U3RhcnQpIHRhcmdldFN0YXJ0ID0gMFxuICBpZiAoZW5kID4gMCAmJiBlbmQgPCBzdGFydCkgZW5kID0gc3RhcnRcblxuICAvLyBDb3B5IDAgYnl0ZXM7IHdlJ3JlIGRvbmVcbiAgaWYgKGVuZCA9PT0gc3RhcnQpIHJldHVybiAwXG4gIGlmICh0YXJnZXQubGVuZ3RoID09PSAwIHx8IHRoaXMubGVuZ3RoID09PSAwKSByZXR1cm4gMFxuXG4gIC8vIEZhdGFsIGVycm9yIGNvbmRpdGlvbnNcbiAgaWYgKHRhcmdldFN0YXJ0IDwgMCkge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCd0YXJnZXRTdGFydCBvdXQgb2YgYm91bmRzJylcbiAgfVxuICBpZiAoc3RhcnQgPCAwIHx8IHN0YXJ0ID49IHRoaXMubGVuZ3RoKSB0aHJvdyBuZXcgUmFuZ2VFcnJvcignc291cmNlU3RhcnQgb3V0IG9mIGJvdW5kcycpXG4gIGlmIChlbmQgPCAwKSB0aHJvdyBuZXcgUmFuZ2VFcnJvcignc291cmNlRW5kIG91dCBvZiBib3VuZHMnKVxuXG4gIC8vIEFyZSB3ZSBvb2I/XG4gIGlmIChlbmQgPiB0aGlzLmxlbmd0aCkgZW5kID0gdGhpcy5sZW5ndGhcbiAgaWYgKHRhcmdldC5sZW5ndGggLSB0YXJnZXRTdGFydCA8IGVuZCAtIHN0YXJ0KSB7XG4gICAgZW5kID0gdGFyZ2V0Lmxlbmd0aCAtIHRhcmdldFN0YXJ0ICsgc3RhcnRcbiAgfVxuXG4gIHZhciBsZW4gPSBlbmQgLSBzdGFydFxuICB2YXIgaVxuXG4gIGlmICh0aGlzID09PSB0YXJnZXQgJiYgc3RhcnQgPCB0YXJnZXRTdGFydCAmJiB0YXJnZXRTdGFydCA8IGVuZCkge1xuICAgIC8vIGRlc2NlbmRpbmcgY29weSBmcm9tIGVuZFxuICAgIGZvciAoaSA9IGxlbiAtIDE7IGkgPj0gMDsgLS1pKSB7XG4gICAgICB0YXJnZXRbaSArIHRhcmdldFN0YXJ0XSA9IHRoaXNbaSArIHN0YXJ0XVxuICAgIH1cbiAgfSBlbHNlIGlmIChsZW4gPCAxMDAwIHx8ICFCdWZmZXIuVFlQRURfQVJSQVlfU1VQUE9SVCkge1xuICAgIC8vIGFzY2VuZGluZyBjb3B5IGZyb20gc3RhcnRcbiAgICBmb3IgKGkgPSAwOyBpIDwgbGVuOyArK2kpIHtcbiAgICAgIHRhcmdldFtpICsgdGFyZ2V0U3RhcnRdID0gdGhpc1tpICsgc3RhcnRdXG4gICAgfVxuICB9IGVsc2Uge1xuICAgIFVpbnQ4QXJyYXkucHJvdG90eXBlLnNldC5jYWxsKFxuICAgICAgdGFyZ2V0LFxuICAgICAgdGhpcy5zdWJhcnJheShzdGFydCwgc3RhcnQgKyBsZW4pLFxuICAgICAgdGFyZ2V0U3RhcnRcbiAgICApXG4gIH1cblxuICByZXR1cm4gbGVuXG59XG5cbi8vIFVzYWdlOlxuLy8gICAgYnVmZmVyLmZpbGwobnVtYmVyWywgb2Zmc2V0WywgZW5kXV0pXG4vLyAgICBidWZmZXIuZmlsbChidWZmZXJbLCBvZmZzZXRbLCBlbmRdXSlcbi8vICAgIGJ1ZmZlci5maWxsKHN0cmluZ1ssIG9mZnNldFssIGVuZF1dWywgZW5jb2RpbmddKVxuQnVmZmVyLnByb3RvdHlwZS5maWxsID0gZnVuY3Rpb24gZmlsbCAodmFsLCBzdGFydCwgZW5kLCBlbmNvZGluZykge1xuICAvLyBIYW5kbGUgc3RyaW5nIGNhc2VzOlxuICBpZiAodHlwZW9mIHZhbCA9PT0gJ3N0cmluZycpIHtcbiAgICBpZiAodHlwZW9mIHN0YXJ0ID09PSAnc3RyaW5nJykge1xuICAgICAgZW5jb2RpbmcgPSBzdGFydFxuICAgICAgc3RhcnQgPSAwXG4gICAgICBlbmQgPSB0aGlzLmxlbmd0aFxuICAgIH0gZWxzZSBpZiAodHlwZW9mIGVuZCA9PT0gJ3N0cmluZycpIHtcbiAgICAgIGVuY29kaW5nID0gZW5kXG4gICAgICBlbmQgPSB0aGlzLmxlbmd0aFxuICAgIH1cbiAgICBpZiAodmFsLmxlbmd0aCA9PT0gMSkge1xuICAgICAgdmFyIGNvZGUgPSB2YWwuY2hhckNvZGVBdCgwKVxuICAgICAgaWYgKGNvZGUgPCAyNTYpIHtcbiAgICAgICAgdmFsID0gY29kZVxuICAgICAgfVxuICAgIH1cbiAgICBpZiAoZW5jb2RpbmcgIT09IHVuZGVmaW5lZCAmJiB0eXBlb2YgZW5jb2RpbmcgIT09ICdzdHJpbmcnKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKCdlbmNvZGluZyBtdXN0IGJlIGEgc3RyaW5nJylcbiAgICB9XG4gICAgaWYgKHR5cGVvZiBlbmNvZGluZyA9PT0gJ3N0cmluZycgJiYgIUJ1ZmZlci5pc0VuY29kaW5nKGVuY29kaW5nKSkge1xuICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignVW5rbm93biBlbmNvZGluZzogJyArIGVuY29kaW5nKVxuICAgIH1cbiAgfSBlbHNlIGlmICh0eXBlb2YgdmFsID09PSAnbnVtYmVyJykge1xuICAgIHZhbCA9IHZhbCAmIDI1NVxuICB9XG5cbiAgLy8gSW52YWxpZCByYW5nZXMgYXJlIG5vdCBzZXQgdG8gYSBkZWZhdWx0LCBzbyBjYW4gcmFuZ2UgY2hlY2sgZWFybHkuXG4gIGlmIChzdGFydCA8IDAgfHwgdGhpcy5sZW5ndGggPCBzdGFydCB8fCB0aGlzLmxlbmd0aCA8IGVuZCkge1xuICAgIHRocm93IG5ldyBSYW5nZUVycm9yKCdPdXQgb2YgcmFuZ2UgaW5kZXgnKVxuICB9XG5cbiAgaWYgKGVuZCA8PSBzdGFydCkge1xuICAgIHJldHVybiB0aGlzXG4gIH1cblxuICBzdGFydCA9IHN0YXJ0ID4+PiAwXG4gIGVuZCA9IGVuZCA9PT0gdW5kZWZpbmVkID8gdGhpcy5sZW5ndGggOiBlbmQgPj4+IDBcblxuICBpZiAoIXZhbCkgdmFsID0gMFxuXG4gIHZhciBpXG4gIGlmICh0eXBlb2YgdmFsID09PSAnbnVtYmVyJykge1xuICAgIGZvciAoaSA9IHN0YXJ0OyBpIDwgZW5kOyArK2kpIHtcbiAgICAgIHRoaXNbaV0gPSB2YWxcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgdmFyIGJ5dGVzID0gQnVmZmVyLmlzQnVmZmVyKHZhbClcbiAgICAgID8gdmFsXG4gICAgICA6IHV0ZjhUb0J5dGVzKG5ldyBCdWZmZXIodmFsLCBlbmNvZGluZykudG9TdHJpbmcoKSlcbiAgICB2YXIgbGVuID0gYnl0ZXMubGVuZ3RoXG4gICAgZm9yIChpID0gMDsgaSA8IGVuZCAtIHN0YXJ0OyArK2kpIHtcbiAgICAgIHRoaXNbaSArIHN0YXJ0XSA9IGJ5dGVzW2kgJSBsZW5dXG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHRoaXNcbn1cblxuLy8gSEVMUEVSIEZVTkNUSU9OU1xuLy8gPT09PT09PT09PT09PT09PVxuXG52YXIgSU5WQUxJRF9CQVNFNjRfUkUgPSAvW14rXFwvMC05QS1aYS16LV9dL2dcblxuZnVuY3Rpb24gYmFzZTY0Y2xlYW4gKHN0cikge1xuICAvLyBOb2RlIHN0cmlwcyBvdXQgaW52YWxpZCBjaGFyYWN0ZXJzIGxpa2UgXFxuIGFuZCBcXHQgZnJvbSB0aGUgc3RyaW5nLCBiYXNlNjQtanMgZG9lcyBub3RcbiAgc3RyID0gc3RyaW5ndHJpbShzdHIpLnJlcGxhY2UoSU5WQUxJRF9CQVNFNjRfUkUsICcnKVxuICAvLyBOb2RlIGNvbnZlcnRzIHN0cmluZ3Mgd2l0aCBsZW5ndGggPCAyIHRvICcnXG4gIGlmIChzdHIubGVuZ3RoIDwgMikgcmV0dXJuICcnXG4gIC8vIE5vZGUgYWxsb3dzIGZvciBub24tcGFkZGVkIGJhc2U2NCBzdHJpbmdzIChtaXNzaW5nIHRyYWlsaW5nID09PSksIGJhc2U2NC1qcyBkb2VzIG5vdFxuICB3aGlsZSAoc3RyLmxlbmd0aCAlIDQgIT09IDApIHtcbiAgICBzdHIgPSBzdHIgKyAnPSdcbiAgfVxuICByZXR1cm4gc3RyXG59XG5cbmZ1bmN0aW9uIHN0cmluZ3RyaW0gKHN0cikge1xuICBpZiAoc3RyLnRyaW0pIHJldHVybiBzdHIudHJpbSgpXG4gIHJldHVybiBzdHIucmVwbGFjZSgvXlxccyt8XFxzKyQvZywgJycpXG59XG5cbmZ1bmN0aW9uIHRvSGV4IChuKSB7XG4gIGlmIChuIDwgMTYpIHJldHVybiAnMCcgKyBuLnRvU3RyaW5nKDE2KVxuICByZXR1cm4gbi50b1N0cmluZygxNilcbn1cblxuZnVuY3Rpb24gdXRmOFRvQnl0ZXMgKHN0cmluZywgdW5pdHMpIHtcbiAgdW5pdHMgPSB1bml0cyB8fCBJbmZpbml0eVxuICB2YXIgY29kZVBvaW50XG4gIHZhciBsZW5ndGggPSBzdHJpbmcubGVuZ3RoXG4gIHZhciBsZWFkU3Vycm9nYXRlID0gbnVsbFxuICB2YXIgYnl0ZXMgPSBbXVxuXG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuZ3RoOyArK2kpIHtcbiAgICBjb2RlUG9pbnQgPSBzdHJpbmcuY2hhckNvZGVBdChpKVxuXG4gICAgLy8gaXMgc3Vycm9nYXRlIGNvbXBvbmVudFxuICAgIGlmIChjb2RlUG9pbnQgPiAweEQ3RkYgJiYgY29kZVBvaW50IDwgMHhFMDAwKSB7XG4gICAgICAvLyBsYXN0IGNoYXIgd2FzIGEgbGVhZFxuICAgICAgaWYgKCFsZWFkU3Vycm9nYXRlKSB7XG4gICAgICAgIC8vIG5vIGxlYWQgeWV0XG4gICAgICAgIGlmIChjb2RlUG9pbnQgPiAweERCRkYpIHtcbiAgICAgICAgICAvLyB1bmV4cGVjdGVkIHRyYWlsXG4gICAgICAgICAgaWYgKCh1bml0cyAtPSAzKSA+IC0xKSBieXRlcy5wdXNoKDB4RUYsIDB4QkYsIDB4QkQpXG4gICAgICAgICAgY29udGludWVcbiAgICAgICAgfSBlbHNlIGlmIChpICsgMSA9PT0gbGVuZ3RoKSB7XG4gICAgICAgICAgLy8gdW5wYWlyZWQgbGVhZFxuICAgICAgICAgIGlmICgodW5pdHMgLT0gMykgPiAtMSkgYnl0ZXMucHVzaCgweEVGLCAweEJGLCAweEJEKVxuICAgICAgICAgIGNvbnRpbnVlXG4gICAgICAgIH1cblxuICAgICAgICAvLyB2YWxpZCBsZWFkXG4gICAgICAgIGxlYWRTdXJyb2dhdGUgPSBjb2RlUG9pbnRcblxuICAgICAgICBjb250aW51ZVxuICAgICAgfVxuXG4gICAgICAvLyAyIGxlYWRzIGluIGEgcm93XG4gICAgICBpZiAoY29kZVBvaW50IDwgMHhEQzAwKSB7XG4gICAgICAgIGlmICgodW5pdHMgLT0gMykgPiAtMSkgYnl0ZXMucHVzaCgweEVGLCAweEJGLCAweEJEKVxuICAgICAgICBsZWFkU3Vycm9nYXRlID0gY29kZVBvaW50XG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIC8vIHZhbGlkIHN1cnJvZ2F0ZSBwYWlyXG4gICAgICBjb2RlUG9pbnQgPSAobGVhZFN1cnJvZ2F0ZSAtIDB4RDgwMCA8PCAxMCB8IGNvZGVQb2ludCAtIDB4REMwMCkgKyAweDEwMDAwXG4gICAgfSBlbHNlIGlmIChsZWFkU3Vycm9nYXRlKSB7XG4gICAgICAvLyB2YWxpZCBibXAgY2hhciwgYnV0IGxhc3QgY2hhciB3YXMgYSBsZWFkXG4gICAgICBpZiAoKHVuaXRzIC09IDMpID4gLTEpIGJ5dGVzLnB1c2goMHhFRiwgMHhCRiwgMHhCRClcbiAgICB9XG5cbiAgICBsZWFkU3Vycm9nYXRlID0gbnVsbFxuXG4gICAgLy8gZW5jb2RlIHV0ZjhcbiAgICBpZiAoY29kZVBvaW50IDwgMHg4MCkge1xuICAgICAgaWYgKCh1bml0cyAtPSAxKSA8IDApIGJyZWFrXG4gICAgICBieXRlcy5wdXNoKGNvZGVQb2ludClcbiAgICB9IGVsc2UgaWYgKGNvZGVQb2ludCA8IDB4ODAwKSB7XG4gICAgICBpZiAoKHVuaXRzIC09IDIpIDwgMCkgYnJlYWtcbiAgICAgIGJ5dGVzLnB1c2goXG4gICAgICAgIGNvZGVQb2ludCA+PiAweDYgfCAweEMwLFxuICAgICAgICBjb2RlUG9pbnQgJiAweDNGIHwgMHg4MFxuICAgICAgKVxuICAgIH0gZWxzZSBpZiAoY29kZVBvaW50IDwgMHgxMDAwMCkge1xuICAgICAgaWYgKCh1bml0cyAtPSAzKSA8IDApIGJyZWFrXG4gICAgICBieXRlcy5wdXNoKFxuICAgICAgICBjb2RlUG9pbnQgPj4gMHhDIHwgMHhFMCxcbiAgICAgICAgY29kZVBvaW50ID4+IDB4NiAmIDB4M0YgfCAweDgwLFxuICAgICAgICBjb2RlUG9pbnQgJiAweDNGIHwgMHg4MFxuICAgICAgKVxuICAgIH0gZWxzZSBpZiAoY29kZVBvaW50IDwgMHgxMTAwMDApIHtcbiAgICAgIGlmICgodW5pdHMgLT0gNCkgPCAwKSBicmVha1xuICAgICAgYnl0ZXMucHVzaChcbiAgICAgICAgY29kZVBvaW50ID4+IDB4MTIgfCAweEYwLFxuICAgICAgICBjb2RlUG9pbnQgPj4gMHhDICYgMHgzRiB8IDB4ODAsXG4gICAgICAgIGNvZGVQb2ludCA+PiAweDYgJiAweDNGIHwgMHg4MCxcbiAgICAgICAgY29kZVBvaW50ICYgMHgzRiB8IDB4ODBcbiAgICAgIClcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3cgbmV3IEVycm9yKCdJbnZhbGlkIGNvZGUgcG9pbnQnKVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiBieXRlc1xufVxuXG5mdW5jdGlvbiBhc2NpaVRvQnl0ZXMgKHN0cikge1xuICB2YXIgYnl0ZUFycmF5ID0gW11cbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBzdHIubGVuZ3RoOyArK2kpIHtcbiAgICAvLyBOb2RlJ3MgY29kZSBzZWVtcyB0byBiZSBkb2luZyB0aGlzIGFuZCBub3QgJiAweDdGLi5cbiAgICBieXRlQXJyYXkucHVzaChzdHIuY2hhckNvZGVBdChpKSAmIDB4RkYpXG4gIH1cbiAgcmV0dXJuIGJ5dGVBcnJheVxufVxuXG5mdW5jdGlvbiB1dGYxNmxlVG9CeXRlcyAoc3RyLCB1bml0cykge1xuICB2YXIgYywgaGksIGxvXG4gIHZhciBieXRlQXJyYXkgPSBbXVxuICBmb3IgKHZhciBpID0gMDsgaSA8IHN0ci5sZW5ndGg7ICsraSkge1xuICAgIGlmICgodW5pdHMgLT0gMikgPCAwKSBicmVha1xuXG4gICAgYyA9IHN0ci5jaGFyQ29kZUF0KGkpXG4gICAgaGkgPSBjID4+IDhcbiAgICBsbyA9IGMgJSAyNTZcbiAgICBieXRlQXJyYXkucHVzaChsbylcbiAgICBieXRlQXJyYXkucHVzaChoaSlcbiAgfVxuXG4gIHJldHVybiBieXRlQXJyYXlcbn1cblxuZnVuY3Rpb24gYmFzZTY0VG9CeXRlcyAoc3RyKSB7XG4gIHJldHVybiBiYXNlNjQudG9CeXRlQXJyYXkoYmFzZTY0Y2xlYW4oc3RyKSlcbn1cblxuZnVuY3Rpb24gYmxpdEJ1ZmZlciAoc3JjLCBkc3QsIG9mZnNldCwgbGVuZ3RoKSB7XG4gIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuZ3RoOyArK2kpIHtcbiAgICBpZiAoKGkgKyBvZmZzZXQgPj0gZHN0Lmxlbmd0aCkgfHwgKGkgPj0gc3JjLmxlbmd0aCkpIGJyZWFrXG4gICAgZHN0W2kgKyBvZmZzZXRdID0gc3JjW2ldXG4gIH1cbiAgcmV0dXJuIGlcbn1cblxuZnVuY3Rpb24gaXNuYW4gKHZhbCkge1xuICByZXR1cm4gdmFsICE9PSB2YWwgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1zZWxmLWNvbXBhcmVcbn1cbiIsInJlcXVpcmUoJy4uL21vZHVsZXMvZXM2Lm9iamVjdC50by1zdHJpbmcnKTtcbnJlcXVpcmUoJy4uL21vZHVsZXMvZXM2LnN0cmluZy5pdGVyYXRvcicpO1xucmVxdWlyZSgnLi4vbW9kdWxlcy93ZWIuZG9tLml0ZXJhYmxlJyk7XG5yZXF1aXJlKCcuLi9tb2R1bGVzL2VzNi5wcm9taXNlJyk7XG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4uL21vZHVsZXMvX2NvcmUnKS5Qcm9taXNlOyIsIm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oaXQpe1xuICBpZih0eXBlb2YgaXQgIT0gJ2Z1bmN0aW9uJyl0aHJvdyBUeXBlRXJyb3IoaXQgKyAnIGlzIG5vdCBhIGZ1bmN0aW9uIScpO1xuICByZXR1cm4gaXQ7XG59OyIsIi8vIDIyLjEuMy4zMSBBcnJheS5wcm90b3R5cGVbQEB1bnNjb3BhYmxlc11cbnZhciBVTlNDT1BBQkxFUyA9IHJlcXVpcmUoJy4vX3drcycpKCd1bnNjb3BhYmxlcycpXG4gICwgQXJyYXlQcm90byAgPSBBcnJheS5wcm90b3R5cGU7XG5pZihBcnJheVByb3RvW1VOU0NPUEFCTEVTXSA9PSB1bmRlZmluZWQpcmVxdWlyZSgnLi9faGlkZScpKEFycmF5UHJvdG8sIFVOU0NPUEFCTEVTLCB7fSk7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGtleSl7XG4gIEFycmF5UHJvdG9bVU5TQ09QQUJMRVNdW2tleV0gPSB0cnVlO1xufTsiLCJtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGl0LCBDb25zdHJ1Y3RvciwgbmFtZSwgZm9yYmlkZGVuRmllbGQpe1xuICBpZighKGl0IGluc3RhbmNlb2YgQ29uc3RydWN0b3IpIHx8IChmb3JiaWRkZW5GaWVsZCAhPT0gdW5kZWZpbmVkICYmIGZvcmJpZGRlbkZpZWxkIGluIGl0KSl7XG4gICAgdGhyb3cgVHlwZUVycm9yKG5hbWUgKyAnOiBpbmNvcnJlY3QgaW52b2NhdGlvbiEnKTtcbiAgfSByZXR1cm4gaXQ7XG59OyIsInZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4vX2lzLW9iamVjdCcpO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihpdCl7XG4gIGlmKCFpc09iamVjdChpdCkpdGhyb3cgVHlwZUVycm9yKGl0ICsgJyBpcyBub3QgYW4gb2JqZWN0IScpO1xuICByZXR1cm4gaXQ7XG59OyIsIi8vIGZhbHNlIC0+IEFycmF5I2luZGV4T2Zcbi8vIHRydWUgIC0+IEFycmF5I2luY2x1ZGVzXG52YXIgdG9JT2JqZWN0ID0gcmVxdWlyZSgnLi9fdG8taW9iamVjdCcpXG4gICwgdG9MZW5ndGggID0gcmVxdWlyZSgnLi9fdG8tbGVuZ3RoJylcbiAgLCB0b0luZGV4ICAgPSByZXF1aXJlKCcuL190by1pbmRleCcpO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihJU19JTkNMVURFUyl7XG4gIHJldHVybiBmdW5jdGlvbigkdGhpcywgZWwsIGZyb21JbmRleCl7XG4gICAgdmFyIE8gICAgICA9IHRvSU9iamVjdCgkdGhpcylcbiAgICAgICwgbGVuZ3RoID0gdG9MZW5ndGgoTy5sZW5ndGgpXG4gICAgICAsIGluZGV4ICA9IHRvSW5kZXgoZnJvbUluZGV4LCBsZW5ndGgpXG4gICAgICAsIHZhbHVlO1xuICAgIC8vIEFycmF5I2luY2x1ZGVzIHVzZXMgU2FtZVZhbHVlWmVybyBlcXVhbGl0eSBhbGdvcml0aG1cbiAgICBpZihJU19JTkNMVURFUyAmJiBlbCAhPSBlbCl3aGlsZShsZW5ndGggPiBpbmRleCl7XG4gICAgICB2YWx1ZSA9IE9baW5kZXgrK107XG4gICAgICBpZih2YWx1ZSAhPSB2YWx1ZSlyZXR1cm4gdHJ1ZTtcbiAgICAvLyBBcnJheSN0b0luZGV4IGlnbm9yZXMgaG9sZXMsIEFycmF5I2luY2x1ZGVzIC0gbm90XG4gICAgfSBlbHNlIGZvcig7bGVuZ3RoID4gaW5kZXg7IGluZGV4KyspaWYoSVNfSU5DTFVERVMgfHwgaW5kZXggaW4gTyl7XG4gICAgICBpZihPW2luZGV4XSA9PT0gZWwpcmV0dXJuIElTX0lOQ0xVREVTIHx8IGluZGV4IHx8IDA7XG4gICAgfSByZXR1cm4gIUlTX0lOQ0xVREVTICYmIC0xO1xuICB9O1xufTsiLCIvLyBnZXR0aW5nIHRhZyBmcm9tIDE5LjEuMy42IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcoKVxudmFyIGNvZiA9IHJlcXVpcmUoJy4vX2NvZicpXG4gICwgVEFHID0gcmVxdWlyZSgnLi9fd2tzJykoJ3RvU3RyaW5nVGFnJylcbiAgLy8gRVMzIHdyb25nIGhlcmVcbiAgLCBBUkcgPSBjb2YoZnVuY3Rpb24oKXsgcmV0dXJuIGFyZ3VtZW50czsgfSgpKSA9PSAnQXJndW1lbnRzJztcblxuLy8gZmFsbGJhY2sgZm9yIElFMTEgU2NyaXB0IEFjY2VzcyBEZW5pZWQgZXJyb3JcbnZhciB0cnlHZXQgPSBmdW5jdGlvbihpdCwga2V5KXtcbiAgdHJ5IHtcbiAgICByZXR1cm4gaXRba2V5XTtcbiAgfSBjYXRjaChlKXsgLyogZW1wdHkgKi8gfVxufTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihpdCl7XG4gIHZhciBPLCBULCBCO1xuICByZXR1cm4gaXQgPT09IHVuZGVmaW5lZCA/ICdVbmRlZmluZWQnIDogaXQgPT09IG51bGwgPyAnTnVsbCdcbiAgICAvLyBAQHRvU3RyaW5nVGFnIGNhc2VcbiAgICA6IHR5cGVvZiAoVCA9IHRyeUdldChPID0gT2JqZWN0KGl0KSwgVEFHKSkgPT0gJ3N0cmluZycgPyBUXG4gICAgLy8gYnVpbHRpblRhZyBjYXNlXG4gICAgOiBBUkcgPyBjb2YoTylcbiAgICAvLyBFUzMgYXJndW1lbnRzIGZhbGxiYWNrXG4gICAgOiAoQiA9IGNvZihPKSkgPT0gJ09iamVjdCcgJiYgdHlwZW9mIE8uY2FsbGVlID09ICdmdW5jdGlvbicgPyAnQXJndW1lbnRzJyA6IEI7XG59OyIsInZhciB0b1N0cmluZyA9IHt9LnRvU3RyaW5nO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGl0KXtcbiAgcmV0dXJuIHRvU3RyaW5nLmNhbGwoaXQpLnNsaWNlKDgsIC0xKTtcbn07IiwidmFyIGNvcmUgPSBtb2R1bGUuZXhwb3J0cyA9IHt2ZXJzaW9uOiAnMi40LjAnfTtcbmlmKHR5cGVvZiBfX2UgPT0gJ251bWJlcicpX19lID0gY29yZTsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby11bmRlZiIsIi8vIG9wdGlvbmFsIC8gc2ltcGxlIGNvbnRleHQgYmluZGluZ1xudmFyIGFGdW5jdGlvbiA9IHJlcXVpcmUoJy4vX2EtZnVuY3Rpb24nKTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oZm4sIHRoYXQsIGxlbmd0aCl7XG4gIGFGdW5jdGlvbihmbik7XG4gIGlmKHRoYXQgPT09IHVuZGVmaW5lZClyZXR1cm4gZm47XG4gIHN3aXRjaChsZW5ndGgpe1xuICAgIGNhc2UgMTogcmV0dXJuIGZ1bmN0aW9uKGEpe1xuICAgICAgcmV0dXJuIGZuLmNhbGwodGhhdCwgYSk7XG4gICAgfTtcbiAgICBjYXNlIDI6IHJldHVybiBmdW5jdGlvbihhLCBiKXtcbiAgICAgIHJldHVybiBmbi5jYWxsKHRoYXQsIGEsIGIpO1xuICAgIH07XG4gICAgY2FzZSAzOiByZXR1cm4gZnVuY3Rpb24oYSwgYiwgYyl7XG4gICAgICByZXR1cm4gZm4uY2FsbCh0aGF0LCBhLCBiLCBjKTtcbiAgICB9O1xuICB9XG4gIHJldHVybiBmdW5jdGlvbigvKiAuLi5hcmdzICovKXtcbiAgICByZXR1cm4gZm4uYXBwbHkodGhhdCwgYXJndW1lbnRzKTtcbiAgfTtcbn07IiwiLy8gNy4yLjEgUmVxdWlyZU9iamVjdENvZXJjaWJsZShhcmd1bWVudClcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oaXQpe1xuICBpZihpdCA9PSB1bmRlZmluZWQpdGhyb3cgVHlwZUVycm9yKFwiQ2FuJ3QgY2FsbCBtZXRob2Qgb24gIFwiICsgaXQpO1xuICByZXR1cm4gaXQ7XG59OyIsIi8vIFRoYW5rJ3MgSUU4IGZvciBoaXMgZnVubnkgZGVmaW5lUHJvcGVydHlcbm1vZHVsZS5leHBvcnRzID0gIXJlcXVpcmUoJy4vX2ZhaWxzJykoZnVuY3Rpb24oKXtcbiAgcmV0dXJuIE9iamVjdC5kZWZpbmVQcm9wZXJ0eSh7fSwgJ2EnLCB7Z2V0OiBmdW5jdGlvbigpeyByZXR1cm4gNzsgfX0pLmEgIT0gNztcbn0pOyIsInZhciBpc09iamVjdCA9IHJlcXVpcmUoJy4vX2lzLW9iamVjdCcpXG4gICwgZG9jdW1lbnQgPSByZXF1aXJlKCcuL19nbG9iYWwnKS5kb2N1bWVudFxuICAvLyBpbiBvbGQgSUUgdHlwZW9mIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQgaXMgJ29iamVjdCdcbiAgLCBpcyA9IGlzT2JqZWN0KGRvY3VtZW50KSAmJiBpc09iamVjdChkb2N1bWVudC5jcmVhdGVFbGVtZW50KTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oaXQpe1xuICByZXR1cm4gaXMgPyBkb2N1bWVudC5jcmVhdGVFbGVtZW50KGl0KSA6IHt9O1xufTsiLCIvLyBJRSA4LSBkb24ndCBlbnVtIGJ1ZyBrZXlzXG5tb2R1bGUuZXhwb3J0cyA9IChcbiAgJ2NvbnN0cnVjdG9yLGhhc093blByb3BlcnR5LGlzUHJvdG90eXBlT2YscHJvcGVydHlJc0VudW1lcmFibGUsdG9Mb2NhbGVTdHJpbmcsdG9TdHJpbmcsdmFsdWVPZidcbikuc3BsaXQoJywnKTsiLCJ2YXIgZ2xvYmFsICAgID0gcmVxdWlyZSgnLi9fZ2xvYmFsJylcbiAgLCBjb3JlICAgICAgPSByZXF1aXJlKCcuL19jb3JlJylcbiAgLCBoaWRlICAgICAgPSByZXF1aXJlKCcuL19oaWRlJylcbiAgLCByZWRlZmluZSAgPSByZXF1aXJlKCcuL19yZWRlZmluZScpXG4gICwgY3R4ICAgICAgID0gcmVxdWlyZSgnLi9fY3R4JylcbiAgLCBQUk9UT1RZUEUgPSAncHJvdG90eXBlJztcblxudmFyICRleHBvcnQgPSBmdW5jdGlvbih0eXBlLCBuYW1lLCBzb3VyY2Upe1xuICB2YXIgSVNfRk9SQ0VEID0gdHlwZSAmICRleHBvcnQuRlxuICAgICwgSVNfR0xPQkFMID0gdHlwZSAmICRleHBvcnQuR1xuICAgICwgSVNfU1RBVElDID0gdHlwZSAmICRleHBvcnQuU1xuICAgICwgSVNfUFJPVE8gID0gdHlwZSAmICRleHBvcnQuUFxuICAgICwgSVNfQklORCAgID0gdHlwZSAmICRleHBvcnQuQlxuICAgICwgdGFyZ2V0ICAgID0gSVNfR0xPQkFMID8gZ2xvYmFsIDogSVNfU1RBVElDID8gZ2xvYmFsW25hbWVdIHx8IChnbG9iYWxbbmFtZV0gPSB7fSkgOiAoZ2xvYmFsW25hbWVdIHx8IHt9KVtQUk9UT1RZUEVdXG4gICAgLCBleHBvcnRzICAgPSBJU19HTE9CQUwgPyBjb3JlIDogY29yZVtuYW1lXSB8fCAoY29yZVtuYW1lXSA9IHt9KVxuICAgICwgZXhwUHJvdG8gID0gZXhwb3J0c1tQUk9UT1RZUEVdIHx8IChleHBvcnRzW1BST1RPVFlQRV0gPSB7fSlcbiAgICAsIGtleSwgb3duLCBvdXQsIGV4cDtcbiAgaWYoSVNfR0xPQkFMKXNvdXJjZSA9IG5hbWU7XG4gIGZvcihrZXkgaW4gc291cmNlKXtcbiAgICAvLyBjb250YWlucyBpbiBuYXRpdmVcbiAgICBvd24gPSAhSVNfRk9SQ0VEICYmIHRhcmdldCAmJiB0YXJnZXRba2V5XSAhPT0gdW5kZWZpbmVkO1xuICAgIC8vIGV4cG9ydCBuYXRpdmUgb3IgcGFzc2VkXG4gICAgb3V0ID0gKG93biA/IHRhcmdldCA6IHNvdXJjZSlba2V5XTtcbiAgICAvLyBiaW5kIHRpbWVycyB0byBnbG9iYWwgZm9yIGNhbGwgZnJvbSBleHBvcnQgY29udGV4dFxuICAgIGV4cCA9IElTX0JJTkQgJiYgb3duID8gY3R4KG91dCwgZ2xvYmFsKSA6IElTX1BST1RPICYmIHR5cGVvZiBvdXQgPT0gJ2Z1bmN0aW9uJyA/IGN0eChGdW5jdGlvbi5jYWxsLCBvdXQpIDogb3V0O1xuICAgIC8vIGV4dGVuZCBnbG9iYWxcbiAgICBpZih0YXJnZXQpcmVkZWZpbmUodGFyZ2V0LCBrZXksIG91dCwgdHlwZSAmICRleHBvcnQuVSk7XG4gICAgLy8gZXhwb3J0XG4gICAgaWYoZXhwb3J0c1trZXldICE9IG91dCloaWRlKGV4cG9ydHMsIGtleSwgZXhwKTtcbiAgICBpZihJU19QUk9UTyAmJiBleHBQcm90b1trZXldICE9IG91dClleHBQcm90b1trZXldID0gb3V0O1xuICB9XG59O1xuZ2xvYmFsLmNvcmUgPSBjb3JlO1xuLy8gdHlwZSBiaXRtYXBcbiRleHBvcnQuRiA9IDE7ICAgLy8gZm9yY2VkXG4kZXhwb3J0LkcgPSAyOyAgIC8vIGdsb2JhbFxuJGV4cG9ydC5TID0gNDsgICAvLyBzdGF0aWNcbiRleHBvcnQuUCA9IDg7ICAgLy8gcHJvdG9cbiRleHBvcnQuQiA9IDE2OyAgLy8gYmluZFxuJGV4cG9ydC5XID0gMzI7ICAvLyB3cmFwXG4kZXhwb3J0LlUgPSA2NDsgIC8vIHNhZmVcbiRleHBvcnQuUiA9IDEyODsgLy8gcmVhbCBwcm90byBtZXRob2QgZm9yIGBsaWJyYXJ5YCBcbm1vZHVsZS5leHBvcnRzID0gJGV4cG9ydDsiLCJtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGV4ZWMpe1xuICB0cnkge1xuICAgIHJldHVybiAhIWV4ZWMoKTtcbiAgfSBjYXRjaChlKXtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxufTsiLCJ2YXIgY3R4ICAgICAgICAgPSByZXF1aXJlKCcuL19jdHgnKVxuICAsIGNhbGwgICAgICAgID0gcmVxdWlyZSgnLi9faXRlci1jYWxsJylcbiAgLCBpc0FycmF5SXRlciA9IHJlcXVpcmUoJy4vX2lzLWFycmF5LWl0ZXInKVxuICAsIGFuT2JqZWN0ICAgID0gcmVxdWlyZSgnLi9fYW4tb2JqZWN0JylcbiAgLCB0b0xlbmd0aCAgICA9IHJlcXVpcmUoJy4vX3RvLWxlbmd0aCcpXG4gICwgZ2V0SXRlckZuICAgPSByZXF1aXJlKCcuL2NvcmUuZ2V0LWl0ZXJhdG9yLW1ldGhvZCcpXG4gICwgQlJFQUsgICAgICAgPSB7fVxuICAsIFJFVFVSTiAgICAgID0ge307XG52YXIgZXhwb3J0cyA9IG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oaXRlcmFibGUsIGVudHJpZXMsIGZuLCB0aGF0LCBJVEVSQVRPUil7XG4gIHZhciBpdGVyRm4gPSBJVEVSQVRPUiA/IGZ1bmN0aW9uKCl7IHJldHVybiBpdGVyYWJsZTsgfSA6IGdldEl0ZXJGbihpdGVyYWJsZSlcbiAgICAsIGYgICAgICA9IGN0eChmbiwgdGhhdCwgZW50cmllcyA/IDIgOiAxKVxuICAgICwgaW5kZXggID0gMFxuICAgICwgbGVuZ3RoLCBzdGVwLCBpdGVyYXRvciwgcmVzdWx0O1xuICBpZih0eXBlb2YgaXRlckZuICE9ICdmdW5jdGlvbicpdGhyb3cgVHlwZUVycm9yKGl0ZXJhYmxlICsgJyBpcyBub3QgaXRlcmFibGUhJyk7XG4gIC8vIGZhc3QgY2FzZSBmb3IgYXJyYXlzIHdpdGggZGVmYXVsdCBpdGVyYXRvclxuICBpZihpc0FycmF5SXRlcihpdGVyRm4pKWZvcihsZW5ndGggPSB0b0xlbmd0aChpdGVyYWJsZS5sZW5ndGgpOyBsZW5ndGggPiBpbmRleDsgaW5kZXgrKyl7XG4gICAgcmVzdWx0ID0gZW50cmllcyA/IGYoYW5PYmplY3Qoc3RlcCA9IGl0ZXJhYmxlW2luZGV4XSlbMF0sIHN0ZXBbMV0pIDogZihpdGVyYWJsZVtpbmRleF0pO1xuICAgIGlmKHJlc3VsdCA9PT0gQlJFQUsgfHwgcmVzdWx0ID09PSBSRVRVUk4pcmV0dXJuIHJlc3VsdDtcbiAgfSBlbHNlIGZvcihpdGVyYXRvciA9IGl0ZXJGbi5jYWxsKGl0ZXJhYmxlKTsgIShzdGVwID0gaXRlcmF0b3IubmV4dCgpKS5kb25lOyApe1xuICAgIHJlc3VsdCA9IGNhbGwoaXRlcmF0b3IsIGYsIHN0ZXAudmFsdWUsIGVudHJpZXMpO1xuICAgIGlmKHJlc3VsdCA9PT0gQlJFQUsgfHwgcmVzdWx0ID09PSBSRVRVUk4pcmV0dXJuIHJlc3VsdDtcbiAgfVxufTtcbmV4cG9ydHMuQlJFQUsgID0gQlJFQUs7XG5leHBvcnRzLlJFVFVSTiA9IFJFVFVSTjsiLCIvLyBodHRwczovL2dpdGh1Yi5jb20vemxvaXJvY2svY29yZS1qcy9pc3N1ZXMvODYjaXNzdWVjb21tZW50LTExNTc1OTAyOFxudmFyIGdsb2JhbCA9IG1vZHVsZS5leHBvcnRzID0gdHlwZW9mIHdpbmRvdyAhPSAndW5kZWZpbmVkJyAmJiB3aW5kb3cuTWF0aCA9PSBNYXRoXG4gID8gd2luZG93IDogdHlwZW9mIHNlbGYgIT0gJ3VuZGVmaW5lZCcgJiYgc2VsZi5NYXRoID09IE1hdGggPyBzZWxmIDogRnVuY3Rpb24oJ3JldHVybiB0aGlzJykoKTtcbmlmKHR5cGVvZiBfX2cgPT0gJ251bWJlcicpX19nID0gZ2xvYmFsOyAvLyBlc2xpbnQtZGlzYWJsZS1saW5lIG5vLXVuZGVmIiwidmFyIGhhc093blByb3BlcnR5ID0ge30uaGFzT3duUHJvcGVydHk7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGl0LCBrZXkpe1xuICByZXR1cm4gaGFzT3duUHJvcGVydHkuY2FsbChpdCwga2V5KTtcbn07IiwidmFyIGRQICAgICAgICAgPSByZXF1aXJlKCcuL19vYmplY3QtZHAnKVxuICAsIGNyZWF0ZURlc2MgPSByZXF1aXJlKCcuL19wcm9wZXJ0eS1kZXNjJyk7XG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vX2Rlc2NyaXB0b3JzJykgPyBmdW5jdGlvbihvYmplY3QsIGtleSwgdmFsdWUpe1xuICByZXR1cm4gZFAuZihvYmplY3QsIGtleSwgY3JlYXRlRGVzYygxLCB2YWx1ZSkpO1xufSA6IGZ1bmN0aW9uKG9iamVjdCwga2V5LCB2YWx1ZSl7XG4gIG9iamVjdFtrZXldID0gdmFsdWU7XG4gIHJldHVybiBvYmplY3Q7XG59OyIsIm1vZHVsZS5leHBvcnRzID0gcmVxdWlyZSgnLi9fZ2xvYmFsJykuZG9jdW1lbnQgJiYgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50OyIsIm1vZHVsZS5leHBvcnRzID0gIXJlcXVpcmUoJy4vX2Rlc2NyaXB0b3JzJykgJiYgIXJlcXVpcmUoJy4vX2ZhaWxzJykoZnVuY3Rpb24oKXtcbiAgcmV0dXJuIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShyZXF1aXJlKCcuL19kb20tY3JlYXRlJykoJ2RpdicpLCAnYScsIHtnZXQ6IGZ1bmN0aW9uKCl7IHJldHVybiA3OyB9fSkuYSAhPSA3O1xufSk7IiwiLy8gZmFzdCBhcHBseSwgaHR0cDovL2pzcGVyZi5sbmtpdC5jb20vZmFzdC1hcHBseS81XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGZuLCBhcmdzLCB0aGF0KXtcbiAgdmFyIHVuID0gdGhhdCA9PT0gdW5kZWZpbmVkO1xuICBzd2l0Y2goYXJncy5sZW5ndGgpe1xuICAgIGNhc2UgMDogcmV0dXJuIHVuID8gZm4oKVxuICAgICAgICAgICAgICAgICAgICAgIDogZm4uY2FsbCh0aGF0KTtcbiAgICBjYXNlIDE6IHJldHVybiB1biA/IGZuKGFyZ3NbMF0pXG4gICAgICAgICAgICAgICAgICAgICAgOiBmbi5jYWxsKHRoYXQsIGFyZ3NbMF0pO1xuICAgIGNhc2UgMjogcmV0dXJuIHVuID8gZm4oYXJnc1swXSwgYXJnc1sxXSlcbiAgICAgICAgICAgICAgICAgICAgICA6IGZuLmNhbGwodGhhdCwgYXJnc1swXSwgYXJnc1sxXSk7XG4gICAgY2FzZSAzOiByZXR1cm4gdW4gPyBmbihhcmdzWzBdLCBhcmdzWzFdLCBhcmdzWzJdKVxuICAgICAgICAgICAgICAgICAgICAgIDogZm4uY2FsbCh0aGF0LCBhcmdzWzBdLCBhcmdzWzFdLCBhcmdzWzJdKTtcbiAgICBjYXNlIDQ6IHJldHVybiB1biA/IGZuKGFyZ3NbMF0sIGFyZ3NbMV0sIGFyZ3NbMl0sIGFyZ3NbM10pXG4gICAgICAgICAgICAgICAgICAgICAgOiBmbi5jYWxsKHRoYXQsIGFyZ3NbMF0sIGFyZ3NbMV0sIGFyZ3NbMl0sIGFyZ3NbM10pO1xuICB9IHJldHVybiAgICAgICAgICAgICAgZm4uYXBwbHkodGhhdCwgYXJncyk7XG59OyIsIi8vIGZhbGxiYWNrIGZvciBub24tYXJyYXktbGlrZSBFUzMgYW5kIG5vbi1lbnVtZXJhYmxlIG9sZCBWOCBzdHJpbmdzXG52YXIgY29mID0gcmVxdWlyZSgnLi9fY29mJyk7XG5tb2R1bGUuZXhwb3J0cyA9IE9iamVjdCgneicpLnByb3BlcnR5SXNFbnVtZXJhYmxlKDApID8gT2JqZWN0IDogZnVuY3Rpb24oaXQpe1xuICByZXR1cm4gY29mKGl0KSA9PSAnU3RyaW5nJyA/IGl0LnNwbGl0KCcnKSA6IE9iamVjdChpdCk7XG59OyIsIi8vIGNoZWNrIG9uIGRlZmF1bHQgQXJyYXkgaXRlcmF0b3JcbnZhciBJdGVyYXRvcnMgID0gcmVxdWlyZSgnLi9faXRlcmF0b3JzJylcbiAgLCBJVEVSQVRPUiAgID0gcmVxdWlyZSgnLi9fd2tzJykoJ2l0ZXJhdG9yJylcbiAgLCBBcnJheVByb3RvID0gQXJyYXkucHJvdG90eXBlO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGl0KXtcbiAgcmV0dXJuIGl0ICE9PSB1bmRlZmluZWQgJiYgKEl0ZXJhdG9ycy5BcnJheSA9PT0gaXQgfHwgQXJyYXlQcm90b1tJVEVSQVRPUl0gPT09IGl0KTtcbn07IiwibW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihpdCl7XG4gIHJldHVybiB0eXBlb2YgaXQgPT09ICdvYmplY3QnID8gaXQgIT09IG51bGwgOiB0eXBlb2YgaXQgPT09ICdmdW5jdGlvbic7XG59OyIsIi8vIGNhbGwgc29tZXRoaW5nIG9uIGl0ZXJhdG9yIHN0ZXAgd2l0aCBzYWZlIGNsb3Npbmcgb24gZXJyb3JcbnZhciBhbk9iamVjdCA9IHJlcXVpcmUoJy4vX2FuLW9iamVjdCcpO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihpdGVyYXRvciwgZm4sIHZhbHVlLCBlbnRyaWVzKXtcbiAgdHJ5IHtcbiAgICByZXR1cm4gZW50cmllcyA/IGZuKGFuT2JqZWN0KHZhbHVlKVswXSwgdmFsdWVbMV0pIDogZm4odmFsdWUpO1xuICAvLyA3LjQuNiBJdGVyYXRvckNsb3NlKGl0ZXJhdG9yLCBjb21wbGV0aW9uKVxuICB9IGNhdGNoKGUpe1xuICAgIHZhciByZXQgPSBpdGVyYXRvclsncmV0dXJuJ107XG4gICAgaWYocmV0ICE9PSB1bmRlZmluZWQpYW5PYmplY3QocmV0LmNhbGwoaXRlcmF0b3IpKTtcbiAgICB0aHJvdyBlO1xuICB9XG59OyIsIid1c2Ugc3RyaWN0JztcbnZhciBjcmVhdGUgICAgICAgICA9IHJlcXVpcmUoJy4vX29iamVjdC1jcmVhdGUnKVxuICAsIGRlc2NyaXB0b3IgICAgID0gcmVxdWlyZSgnLi9fcHJvcGVydHktZGVzYycpXG4gICwgc2V0VG9TdHJpbmdUYWcgPSByZXF1aXJlKCcuL19zZXQtdG8tc3RyaW5nLXRhZycpXG4gICwgSXRlcmF0b3JQcm90b3R5cGUgPSB7fTtcblxuLy8gMjUuMS4yLjEuMSAlSXRlcmF0b3JQcm90b3R5cGUlW0BAaXRlcmF0b3JdKClcbnJlcXVpcmUoJy4vX2hpZGUnKShJdGVyYXRvclByb3RvdHlwZSwgcmVxdWlyZSgnLi9fd2tzJykoJ2l0ZXJhdG9yJyksIGZ1bmN0aW9uKCl7IHJldHVybiB0aGlzOyB9KTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihDb25zdHJ1Y3RvciwgTkFNRSwgbmV4dCl7XG4gIENvbnN0cnVjdG9yLnByb3RvdHlwZSA9IGNyZWF0ZShJdGVyYXRvclByb3RvdHlwZSwge25leHQ6IGRlc2NyaXB0b3IoMSwgbmV4dCl9KTtcbiAgc2V0VG9TdHJpbmdUYWcoQ29uc3RydWN0b3IsIE5BTUUgKyAnIEl0ZXJhdG9yJyk7XG59OyIsIid1c2Ugc3RyaWN0JztcbnZhciBMSUJSQVJZICAgICAgICA9IHJlcXVpcmUoJy4vX2xpYnJhcnknKVxuICAsICRleHBvcnQgICAgICAgID0gcmVxdWlyZSgnLi9fZXhwb3J0JylcbiAgLCByZWRlZmluZSAgICAgICA9IHJlcXVpcmUoJy4vX3JlZGVmaW5lJylcbiAgLCBoaWRlICAgICAgICAgICA9IHJlcXVpcmUoJy4vX2hpZGUnKVxuICAsIGhhcyAgICAgICAgICAgID0gcmVxdWlyZSgnLi9faGFzJylcbiAgLCBJdGVyYXRvcnMgICAgICA9IHJlcXVpcmUoJy4vX2l0ZXJhdG9ycycpXG4gICwgJGl0ZXJDcmVhdGUgICAgPSByZXF1aXJlKCcuL19pdGVyLWNyZWF0ZScpXG4gICwgc2V0VG9TdHJpbmdUYWcgPSByZXF1aXJlKCcuL19zZXQtdG8tc3RyaW5nLXRhZycpXG4gICwgZ2V0UHJvdG90eXBlT2YgPSByZXF1aXJlKCcuL19vYmplY3QtZ3BvJylcbiAgLCBJVEVSQVRPUiAgICAgICA9IHJlcXVpcmUoJy4vX3drcycpKCdpdGVyYXRvcicpXG4gICwgQlVHR1kgICAgICAgICAgPSAhKFtdLmtleXMgJiYgJ25leHQnIGluIFtdLmtleXMoKSkgLy8gU2FmYXJpIGhhcyBidWdneSBpdGVyYXRvcnMgdy9vIGBuZXh0YFxuICAsIEZGX0lURVJBVE9SICAgID0gJ0BAaXRlcmF0b3InXG4gICwgS0VZUyAgICAgICAgICAgPSAna2V5cydcbiAgLCBWQUxVRVMgICAgICAgICA9ICd2YWx1ZXMnO1xuXG52YXIgcmV0dXJuVGhpcyA9IGZ1bmN0aW9uKCl7IHJldHVybiB0aGlzOyB9O1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKEJhc2UsIE5BTUUsIENvbnN0cnVjdG9yLCBuZXh0LCBERUZBVUxULCBJU19TRVQsIEZPUkNFRCl7XG4gICRpdGVyQ3JlYXRlKENvbnN0cnVjdG9yLCBOQU1FLCBuZXh0KTtcbiAgdmFyIGdldE1ldGhvZCA9IGZ1bmN0aW9uKGtpbmQpe1xuICAgIGlmKCFCVUdHWSAmJiBraW5kIGluIHByb3RvKXJldHVybiBwcm90b1traW5kXTtcbiAgICBzd2l0Y2goa2luZCl7XG4gICAgICBjYXNlIEtFWVM6IHJldHVybiBmdW5jdGlvbiBrZXlzKCl7IHJldHVybiBuZXcgQ29uc3RydWN0b3IodGhpcywga2luZCk7IH07XG4gICAgICBjYXNlIFZBTFVFUzogcmV0dXJuIGZ1bmN0aW9uIHZhbHVlcygpeyByZXR1cm4gbmV3IENvbnN0cnVjdG9yKHRoaXMsIGtpbmQpOyB9O1xuICAgIH0gcmV0dXJuIGZ1bmN0aW9uIGVudHJpZXMoKXsgcmV0dXJuIG5ldyBDb25zdHJ1Y3Rvcih0aGlzLCBraW5kKTsgfTtcbiAgfTtcbiAgdmFyIFRBRyAgICAgICAgPSBOQU1FICsgJyBJdGVyYXRvcidcbiAgICAsIERFRl9WQUxVRVMgPSBERUZBVUxUID09IFZBTFVFU1xuICAgICwgVkFMVUVTX0JVRyA9IGZhbHNlXG4gICAgLCBwcm90byAgICAgID0gQmFzZS5wcm90b3R5cGVcbiAgICAsICRuYXRpdmUgICAgPSBwcm90b1tJVEVSQVRPUl0gfHwgcHJvdG9bRkZfSVRFUkFUT1JdIHx8IERFRkFVTFQgJiYgcHJvdG9bREVGQVVMVF1cbiAgICAsICRkZWZhdWx0ICAgPSAkbmF0aXZlIHx8IGdldE1ldGhvZChERUZBVUxUKVxuICAgICwgJGVudHJpZXMgICA9IERFRkFVTFQgPyAhREVGX1ZBTFVFUyA/ICRkZWZhdWx0IDogZ2V0TWV0aG9kKCdlbnRyaWVzJykgOiB1bmRlZmluZWRcbiAgICAsICRhbnlOYXRpdmUgPSBOQU1FID09ICdBcnJheScgPyBwcm90by5lbnRyaWVzIHx8ICRuYXRpdmUgOiAkbmF0aXZlXG4gICAgLCBtZXRob2RzLCBrZXksIEl0ZXJhdG9yUHJvdG90eXBlO1xuICAvLyBGaXggbmF0aXZlXG4gIGlmKCRhbnlOYXRpdmUpe1xuICAgIEl0ZXJhdG9yUHJvdG90eXBlID0gZ2V0UHJvdG90eXBlT2YoJGFueU5hdGl2ZS5jYWxsKG5ldyBCYXNlKSk7XG4gICAgaWYoSXRlcmF0b3JQcm90b3R5cGUgIT09IE9iamVjdC5wcm90b3R5cGUpe1xuICAgICAgLy8gU2V0IEBAdG9TdHJpbmdUYWcgdG8gbmF0aXZlIGl0ZXJhdG9yc1xuICAgICAgc2V0VG9TdHJpbmdUYWcoSXRlcmF0b3JQcm90b3R5cGUsIFRBRywgdHJ1ZSk7XG4gICAgICAvLyBmaXggZm9yIHNvbWUgb2xkIGVuZ2luZXNcbiAgICAgIGlmKCFMSUJSQVJZICYmICFoYXMoSXRlcmF0b3JQcm90b3R5cGUsIElURVJBVE9SKSloaWRlKEl0ZXJhdG9yUHJvdG90eXBlLCBJVEVSQVRPUiwgcmV0dXJuVGhpcyk7XG4gICAgfVxuICB9XG4gIC8vIGZpeCBBcnJheSN7dmFsdWVzLCBAQGl0ZXJhdG9yfS5uYW1lIGluIFY4IC8gRkZcbiAgaWYoREVGX1ZBTFVFUyAmJiAkbmF0aXZlICYmICRuYXRpdmUubmFtZSAhPT0gVkFMVUVTKXtcbiAgICBWQUxVRVNfQlVHID0gdHJ1ZTtcbiAgICAkZGVmYXVsdCA9IGZ1bmN0aW9uIHZhbHVlcygpeyByZXR1cm4gJG5hdGl2ZS5jYWxsKHRoaXMpOyB9O1xuICB9XG4gIC8vIERlZmluZSBpdGVyYXRvclxuICBpZigoIUxJQlJBUlkgfHwgRk9SQ0VEKSAmJiAoQlVHR1kgfHwgVkFMVUVTX0JVRyB8fCAhcHJvdG9bSVRFUkFUT1JdKSl7XG4gICAgaGlkZShwcm90bywgSVRFUkFUT1IsICRkZWZhdWx0KTtcbiAgfVxuICAvLyBQbHVnIGZvciBsaWJyYXJ5XG4gIEl0ZXJhdG9yc1tOQU1FXSA9ICRkZWZhdWx0O1xuICBJdGVyYXRvcnNbVEFHXSAgPSByZXR1cm5UaGlzO1xuICBpZihERUZBVUxUKXtcbiAgICBtZXRob2RzID0ge1xuICAgICAgdmFsdWVzOiAgREVGX1ZBTFVFUyA/ICRkZWZhdWx0IDogZ2V0TWV0aG9kKFZBTFVFUyksXG4gICAgICBrZXlzOiAgICBJU19TRVQgICAgID8gJGRlZmF1bHQgOiBnZXRNZXRob2QoS0VZUyksXG4gICAgICBlbnRyaWVzOiAkZW50cmllc1xuICAgIH07XG4gICAgaWYoRk9SQ0VEKWZvcihrZXkgaW4gbWV0aG9kcyl7XG4gICAgICBpZighKGtleSBpbiBwcm90bykpcmVkZWZpbmUocHJvdG8sIGtleSwgbWV0aG9kc1trZXldKTtcbiAgICB9IGVsc2UgJGV4cG9ydCgkZXhwb3J0LlAgKyAkZXhwb3J0LkYgKiAoQlVHR1kgfHwgVkFMVUVTX0JVRyksIE5BTUUsIG1ldGhvZHMpO1xuICB9XG4gIHJldHVybiBtZXRob2RzO1xufTsiLCJ2YXIgSVRFUkFUT1IgICAgID0gcmVxdWlyZSgnLi9fd2tzJykoJ2l0ZXJhdG9yJylcbiAgLCBTQUZFX0NMT1NJTkcgPSBmYWxzZTtcblxudHJ5IHtcbiAgdmFyIHJpdGVyID0gWzddW0lURVJBVE9SXSgpO1xuICByaXRlclsncmV0dXJuJ10gPSBmdW5jdGlvbigpeyBTQUZFX0NMT1NJTkcgPSB0cnVlOyB9O1xuICBBcnJheS5mcm9tKHJpdGVyLCBmdW5jdGlvbigpeyB0aHJvdyAyOyB9KTtcbn0gY2F0Y2goZSl7IC8qIGVtcHR5ICovIH1cblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihleGVjLCBza2lwQ2xvc2luZyl7XG4gIGlmKCFza2lwQ2xvc2luZyAmJiAhU0FGRV9DTE9TSU5HKXJldHVybiBmYWxzZTtcbiAgdmFyIHNhZmUgPSBmYWxzZTtcbiAgdHJ5IHtcbiAgICB2YXIgYXJyICA9IFs3XVxuICAgICAgLCBpdGVyID0gYXJyW0lURVJBVE9SXSgpO1xuICAgIGl0ZXIubmV4dCA9IGZ1bmN0aW9uKCl7IHJldHVybiB7ZG9uZTogc2FmZSA9IHRydWV9OyB9O1xuICAgIGFycltJVEVSQVRPUl0gPSBmdW5jdGlvbigpeyByZXR1cm4gaXRlcjsgfTtcbiAgICBleGVjKGFycik7XG4gIH0gY2F0Y2goZSl7IC8qIGVtcHR5ICovIH1cbiAgcmV0dXJuIHNhZmU7XG59OyIsIm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oZG9uZSwgdmFsdWUpe1xuICByZXR1cm4ge3ZhbHVlOiB2YWx1ZSwgZG9uZTogISFkb25lfTtcbn07IiwibW9kdWxlLmV4cG9ydHMgPSB7fTsiLCJtb2R1bGUuZXhwb3J0cyA9IGZhbHNlOyIsInZhciBnbG9iYWwgICAgPSByZXF1aXJlKCcuL19nbG9iYWwnKVxuICAsIG1hY3JvdGFzayA9IHJlcXVpcmUoJy4vX3Rhc2snKS5zZXRcbiAgLCBPYnNlcnZlciAgPSBnbG9iYWwuTXV0YXRpb25PYnNlcnZlciB8fCBnbG9iYWwuV2ViS2l0TXV0YXRpb25PYnNlcnZlclxuICAsIHByb2Nlc3MgICA9IGdsb2JhbC5wcm9jZXNzXG4gICwgUHJvbWlzZSAgID0gZ2xvYmFsLlByb21pc2VcbiAgLCBpc05vZGUgICAgPSByZXF1aXJlKCcuL19jb2YnKShwcm9jZXNzKSA9PSAncHJvY2Vzcyc7XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oKXtcbiAgdmFyIGhlYWQsIGxhc3QsIG5vdGlmeTtcblxuICB2YXIgZmx1c2ggPSBmdW5jdGlvbigpe1xuICAgIHZhciBwYXJlbnQsIGZuO1xuICAgIGlmKGlzTm9kZSAmJiAocGFyZW50ID0gcHJvY2Vzcy5kb21haW4pKXBhcmVudC5leGl0KCk7XG4gICAgd2hpbGUoaGVhZCl7XG4gICAgICBmbiAgID0gaGVhZC5mbjtcbiAgICAgIGhlYWQgPSBoZWFkLm5leHQ7XG4gICAgICB0cnkge1xuICAgICAgICBmbigpO1xuICAgICAgfSBjYXRjaChlKXtcbiAgICAgICAgaWYoaGVhZClub3RpZnkoKTtcbiAgICAgICAgZWxzZSBsYXN0ID0gdW5kZWZpbmVkO1xuICAgICAgICB0aHJvdyBlO1xuICAgICAgfVxuICAgIH0gbGFzdCA9IHVuZGVmaW5lZDtcbiAgICBpZihwYXJlbnQpcGFyZW50LmVudGVyKCk7XG4gIH07XG5cbiAgLy8gTm9kZS5qc1xuICBpZihpc05vZGUpe1xuICAgIG5vdGlmeSA9IGZ1bmN0aW9uKCl7XG4gICAgICBwcm9jZXNzLm5leHRUaWNrKGZsdXNoKTtcbiAgICB9O1xuICAvLyBicm93c2VycyB3aXRoIE11dGF0aW9uT2JzZXJ2ZXJcbiAgfSBlbHNlIGlmKE9ic2VydmVyKXtcbiAgICB2YXIgdG9nZ2xlID0gdHJ1ZVxuICAgICAgLCBub2RlICAgPSBkb2N1bWVudC5jcmVhdGVUZXh0Tm9kZSgnJyk7XG4gICAgbmV3IE9ic2VydmVyKGZsdXNoKS5vYnNlcnZlKG5vZGUsIHtjaGFyYWN0ZXJEYXRhOiB0cnVlfSk7IC8vIGVzbGludC1kaXNhYmxlLWxpbmUgbm8tbmV3XG4gICAgbm90aWZ5ID0gZnVuY3Rpb24oKXtcbiAgICAgIG5vZGUuZGF0YSA9IHRvZ2dsZSA9ICF0b2dnbGU7XG4gICAgfTtcbiAgLy8gZW52aXJvbm1lbnRzIHdpdGggbWF5YmUgbm9uLWNvbXBsZXRlbHkgY29ycmVjdCwgYnV0IGV4aXN0ZW50IFByb21pc2VcbiAgfSBlbHNlIGlmKFByb21pc2UgJiYgUHJvbWlzZS5yZXNvbHZlKXtcbiAgICB2YXIgcHJvbWlzZSA9IFByb21pc2UucmVzb2x2ZSgpO1xuICAgIG5vdGlmeSA9IGZ1bmN0aW9uKCl7XG4gICAgICBwcm9taXNlLnRoZW4oZmx1c2gpO1xuICAgIH07XG4gIC8vIGZvciBvdGhlciBlbnZpcm9ubWVudHMgLSBtYWNyb3Rhc2sgYmFzZWQgb246XG4gIC8vIC0gc2V0SW1tZWRpYXRlXG4gIC8vIC0gTWVzc2FnZUNoYW5uZWxcbiAgLy8gLSB3aW5kb3cucG9zdE1lc3NhZ1xuICAvLyAtIG9ucmVhZHlzdGF0ZWNoYW5nZVxuICAvLyAtIHNldFRpbWVvdXRcbiAgfSBlbHNlIHtcbiAgICBub3RpZnkgPSBmdW5jdGlvbigpe1xuICAgICAgLy8gc3RyYW5nZSBJRSArIHdlYnBhY2sgZGV2IHNlcnZlciBidWcgLSB1c2UgLmNhbGwoZ2xvYmFsKVxuICAgICAgbWFjcm90YXNrLmNhbGwoZ2xvYmFsLCBmbHVzaCk7XG4gICAgfTtcbiAgfVxuXG4gIHJldHVybiBmdW5jdGlvbihmbil7XG4gICAgdmFyIHRhc2sgPSB7Zm46IGZuLCBuZXh0OiB1bmRlZmluZWR9O1xuICAgIGlmKGxhc3QpbGFzdC5uZXh0ID0gdGFzaztcbiAgICBpZighaGVhZCl7XG4gICAgICBoZWFkID0gdGFzaztcbiAgICAgIG5vdGlmeSgpO1xuICAgIH0gbGFzdCA9IHRhc2s7XG4gIH07XG59OyIsIi8vIDE5LjEuMi4yIC8gMTUuMi4zLjUgT2JqZWN0LmNyZWF0ZShPIFssIFByb3BlcnRpZXNdKVxudmFyIGFuT2JqZWN0ICAgID0gcmVxdWlyZSgnLi9fYW4tb2JqZWN0JylcbiAgLCBkUHMgICAgICAgICA9IHJlcXVpcmUoJy4vX29iamVjdC1kcHMnKVxuICAsIGVudW1CdWdLZXlzID0gcmVxdWlyZSgnLi9fZW51bS1idWcta2V5cycpXG4gICwgSUVfUFJPVE8gICAgPSByZXF1aXJlKCcuL19zaGFyZWQta2V5JykoJ0lFX1BST1RPJylcbiAgLCBFbXB0eSAgICAgICA9IGZ1bmN0aW9uKCl7IC8qIGVtcHR5ICovIH1cbiAgLCBQUk9UT1RZUEUgICA9ICdwcm90b3R5cGUnO1xuXG4vLyBDcmVhdGUgb2JqZWN0IHdpdGggZmFrZSBgbnVsbGAgcHJvdG90eXBlOiB1c2UgaWZyYW1lIE9iamVjdCB3aXRoIGNsZWFyZWQgcHJvdG90eXBlXG52YXIgY3JlYXRlRGljdCA9IGZ1bmN0aW9uKCl7XG4gIC8vIFRocmFzaCwgd2FzdGUgYW5kIHNvZG9teTogSUUgR0MgYnVnXG4gIHZhciBpZnJhbWUgPSByZXF1aXJlKCcuL19kb20tY3JlYXRlJykoJ2lmcmFtZScpXG4gICAgLCBpICAgICAgPSBlbnVtQnVnS2V5cy5sZW5ndGhcbiAgICAsIGx0ICAgICA9ICc8J1xuICAgICwgZ3QgICAgID0gJz4nXG4gICAgLCBpZnJhbWVEb2N1bWVudDtcbiAgaWZyYW1lLnN0eWxlLmRpc3BsYXkgPSAnbm9uZSc7XG4gIHJlcXVpcmUoJy4vX2h0bWwnKS5hcHBlbmRDaGlsZChpZnJhbWUpO1xuICBpZnJhbWUuc3JjID0gJ2phdmFzY3JpcHQ6JzsgLy8gZXNsaW50LWRpc2FibGUtbGluZSBuby1zY3JpcHQtdXJsXG4gIC8vIGNyZWF0ZURpY3QgPSBpZnJhbWUuY29udGVudFdpbmRvdy5PYmplY3Q7XG4gIC8vIGh0bWwucmVtb3ZlQ2hpbGQoaWZyYW1lKTtcbiAgaWZyYW1lRG9jdW1lbnQgPSBpZnJhbWUuY29udGVudFdpbmRvdy5kb2N1bWVudDtcbiAgaWZyYW1lRG9jdW1lbnQub3BlbigpO1xuICBpZnJhbWVEb2N1bWVudC53cml0ZShsdCArICdzY3JpcHQnICsgZ3QgKyAnZG9jdW1lbnQuRj1PYmplY3QnICsgbHQgKyAnL3NjcmlwdCcgKyBndCk7XG4gIGlmcmFtZURvY3VtZW50LmNsb3NlKCk7XG4gIGNyZWF0ZURpY3QgPSBpZnJhbWVEb2N1bWVudC5GO1xuICB3aGlsZShpLS0pZGVsZXRlIGNyZWF0ZURpY3RbUFJPVE9UWVBFXVtlbnVtQnVnS2V5c1tpXV07XG4gIHJldHVybiBjcmVhdGVEaWN0KCk7XG59O1xuXG5tb2R1bGUuZXhwb3J0cyA9IE9iamVjdC5jcmVhdGUgfHwgZnVuY3Rpb24gY3JlYXRlKE8sIFByb3BlcnRpZXMpe1xuICB2YXIgcmVzdWx0O1xuICBpZihPICE9PSBudWxsKXtcbiAgICBFbXB0eVtQUk9UT1RZUEVdID0gYW5PYmplY3QoTyk7XG4gICAgcmVzdWx0ID0gbmV3IEVtcHR5O1xuICAgIEVtcHR5W1BST1RPVFlQRV0gPSBudWxsO1xuICAgIC8vIGFkZCBcIl9fcHJvdG9fX1wiIGZvciBPYmplY3QuZ2V0UHJvdG90eXBlT2YgcG9seWZpbGxcbiAgICByZXN1bHRbSUVfUFJPVE9dID0gTztcbiAgfSBlbHNlIHJlc3VsdCA9IGNyZWF0ZURpY3QoKTtcbiAgcmV0dXJuIFByb3BlcnRpZXMgPT09IHVuZGVmaW5lZCA/IHJlc3VsdCA6IGRQcyhyZXN1bHQsIFByb3BlcnRpZXMpO1xufTtcbiIsInZhciBhbk9iamVjdCAgICAgICA9IHJlcXVpcmUoJy4vX2FuLW9iamVjdCcpXG4gICwgSUU4X0RPTV9ERUZJTkUgPSByZXF1aXJlKCcuL19pZTgtZG9tLWRlZmluZScpXG4gICwgdG9QcmltaXRpdmUgICAgPSByZXF1aXJlKCcuL190by1wcmltaXRpdmUnKVxuICAsIGRQICAgICAgICAgICAgID0gT2JqZWN0LmRlZmluZVByb3BlcnR5O1xuXG5leHBvcnRzLmYgPSByZXF1aXJlKCcuL19kZXNjcmlwdG9ycycpID8gT2JqZWN0LmRlZmluZVByb3BlcnR5IDogZnVuY3Rpb24gZGVmaW5lUHJvcGVydHkoTywgUCwgQXR0cmlidXRlcyl7XG4gIGFuT2JqZWN0KE8pO1xuICBQID0gdG9QcmltaXRpdmUoUCwgdHJ1ZSk7XG4gIGFuT2JqZWN0KEF0dHJpYnV0ZXMpO1xuICBpZihJRThfRE9NX0RFRklORSl0cnkge1xuICAgIHJldHVybiBkUChPLCBQLCBBdHRyaWJ1dGVzKTtcbiAgfSBjYXRjaChlKXsgLyogZW1wdHkgKi8gfVxuICBpZignZ2V0JyBpbiBBdHRyaWJ1dGVzIHx8ICdzZXQnIGluIEF0dHJpYnV0ZXMpdGhyb3cgVHlwZUVycm9yKCdBY2Nlc3NvcnMgbm90IHN1cHBvcnRlZCEnKTtcbiAgaWYoJ3ZhbHVlJyBpbiBBdHRyaWJ1dGVzKU9bUF0gPSBBdHRyaWJ1dGVzLnZhbHVlO1xuICByZXR1cm4gTztcbn07IiwidmFyIGRQICAgICAgID0gcmVxdWlyZSgnLi9fb2JqZWN0LWRwJylcbiAgLCBhbk9iamVjdCA9IHJlcXVpcmUoJy4vX2FuLW9iamVjdCcpXG4gICwgZ2V0S2V5cyAgPSByZXF1aXJlKCcuL19vYmplY3Qta2V5cycpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vX2Rlc2NyaXB0b3JzJykgPyBPYmplY3QuZGVmaW5lUHJvcGVydGllcyA6IGZ1bmN0aW9uIGRlZmluZVByb3BlcnRpZXMoTywgUHJvcGVydGllcyl7XG4gIGFuT2JqZWN0KE8pO1xuICB2YXIga2V5cyAgID0gZ2V0S2V5cyhQcm9wZXJ0aWVzKVxuICAgICwgbGVuZ3RoID0ga2V5cy5sZW5ndGhcbiAgICAsIGkgPSAwXG4gICAgLCBQO1xuICB3aGlsZShsZW5ndGggPiBpKWRQLmYoTywgUCA9IGtleXNbaSsrXSwgUHJvcGVydGllc1tQXSk7XG4gIHJldHVybiBPO1xufTsiLCIvLyAxOS4xLjIuOSAvIDE1LjIuMy4yIE9iamVjdC5nZXRQcm90b3R5cGVPZihPKVxudmFyIGhhcyAgICAgICAgID0gcmVxdWlyZSgnLi9faGFzJylcbiAgLCB0b09iamVjdCAgICA9IHJlcXVpcmUoJy4vX3RvLW9iamVjdCcpXG4gICwgSUVfUFJPVE8gICAgPSByZXF1aXJlKCcuL19zaGFyZWQta2V5JykoJ0lFX1BST1RPJylcbiAgLCBPYmplY3RQcm90byA9IE9iamVjdC5wcm90b3R5cGU7XG5cbm1vZHVsZS5leHBvcnRzID0gT2JqZWN0LmdldFByb3RvdHlwZU9mIHx8IGZ1bmN0aW9uKE8pe1xuICBPID0gdG9PYmplY3QoTyk7XG4gIGlmKGhhcyhPLCBJRV9QUk9UTykpcmV0dXJuIE9bSUVfUFJPVE9dO1xuICBpZih0eXBlb2YgTy5jb25zdHJ1Y3RvciA9PSAnZnVuY3Rpb24nICYmIE8gaW5zdGFuY2VvZiBPLmNvbnN0cnVjdG9yKXtcbiAgICByZXR1cm4gTy5jb25zdHJ1Y3Rvci5wcm90b3R5cGU7XG4gIH0gcmV0dXJuIE8gaW5zdGFuY2VvZiBPYmplY3QgPyBPYmplY3RQcm90byA6IG51bGw7XG59OyIsInZhciBoYXMgICAgICAgICAgPSByZXF1aXJlKCcuL19oYXMnKVxuICAsIHRvSU9iamVjdCAgICA9IHJlcXVpcmUoJy4vX3RvLWlvYmplY3QnKVxuICAsIGFycmF5SW5kZXhPZiA9IHJlcXVpcmUoJy4vX2FycmF5LWluY2x1ZGVzJykoZmFsc2UpXG4gICwgSUVfUFJPVE8gICAgID0gcmVxdWlyZSgnLi9fc2hhcmVkLWtleScpKCdJRV9QUk9UTycpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKG9iamVjdCwgbmFtZXMpe1xuICB2YXIgTyAgICAgID0gdG9JT2JqZWN0KG9iamVjdClcbiAgICAsIGkgICAgICA9IDBcbiAgICAsIHJlc3VsdCA9IFtdXG4gICAgLCBrZXk7XG4gIGZvcihrZXkgaW4gTylpZihrZXkgIT0gSUVfUFJPVE8paGFzKE8sIGtleSkgJiYgcmVzdWx0LnB1c2goa2V5KTtcbiAgLy8gRG9uJ3QgZW51bSBidWcgJiBoaWRkZW4ga2V5c1xuICB3aGlsZShuYW1lcy5sZW5ndGggPiBpKWlmKGhhcyhPLCBrZXkgPSBuYW1lc1tpKytdKSl7XG4gICAgfmFycmF5SW5kZXhPZihyZXN1bHQsIGtleSkgfHwgcmVzdWx0LnB1c2goa2V5KTtcbiAgfVxuICByZXR1cm4gcmVzdWx0O1xufTsiLCIvLyAxOS4xLjIuMTQgLyAxNS4yLjMuMTQgT2JqZWN0LmtleXMoTylcbnZhciAka2V5cyAgICAgICA9IHJlcXVpcmUoJy4vX29iamVjdC1rZXlzLWludGVybmFsJylcbiAgLCBlbnVtQnVnS2V5cyA9IHJlcXVpcmUoJy4vX2VudW0tYnVnLWtleXMnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBPYmplY3Qua2V5cyB8fCBmdW5jdGlvbiBrZXlzKE8pe1xuICByZXR1cm4gJGtleXMoTywgZW51bUJ1Z0tleXMpO1xufTsiLCJtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGJpdG1hcCwgdmFsdWUpe1xuICByZXR1cm4ge1xuICAgIGVudW1lcmFibGUgIDogIShiaXRtYXAgJiAxKSxcbiAgICBjb25maWd1cmFibGU6ICEoYml0bWFwICYgMiksXG4gICAgd3JpdGFibGUgICAgOiAhKGJpdG1hcCAmIDQpLFxuICAgIHZhbHVlICAgICAgIDogdmFsdWVcbiAgfTtcbn07IiwidmFyIHJlZGVmaW5lID0gcmVxdWlyZSgnLi9fcmVkZWZpbmUnKTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24odGFyZ2V0LCBzcmMsIHNhZmUpe1xuICBmb3IodmFyIGtleSBpbiBzcmMpcmVkZWZpbmUodGFyZ2V0LCBrZXksIHNyY1trZXldLCBzYWZlKTtcbiAgcmV0dXJuIHRhcmdldDtcbn07IiwidmFyIGdsb2JhbCAgICA9IHJlcXVpcmUoJy4vX2dsb2JhbCcpXG4gICwgaGlkZSAgICAgID0gcmVxdWlyZSgnLi9faGlkZScpXG4gICwgaGFzICAgICAgID0gcmVxdWlyZSgnLi9faGFzJylcbiAgLCBTUkMgICAgICAgPSByZXF1aXJlKCcuL191aWQnKSgnc3JjJylcbiAgLCBUT19TVFJJTkcgPSAndG9TdHJpbmcnXG4gICwgJHRvU3RyaW5nID0gRnVuY3Rpb25bVE9fU1RSSU5HXVxuICAsIFRQTCAgICAgICA9ICgnJyArICR0b1N0cmluZykuc3BsaXQoVE9fU1RSSU5HKTtcblxucmVxdWlyZSgnLi9fY29yZScpLmluc3BlY3RTb3VyY2UgPSBmdW5jdGlvbihpdCl7XG4gIHJldHVybiAkdG9TdHJpbmcuY2FsbChpdCk7XG59O1xuXG4obW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihPLCBrZXksIHZhbCwgc2FmZSl7XG4gIHZhciBpc0Z1bmN0aW9uID0gdHlwZW9mIHZhbCA9PSAnZnVuY3Rpb24nO1xuICBpZihpc0Z1bmN0aW9uKWhhcyh2YWwsICduYW1lJykgfHwgaGlkZSh2YWwsICduYW1lJywga2V5KTtcbiAgaWYoT1trZXldID09PSB2YWwpcmV0dXJuO1xuICBpZihpc0Z1bmN0aW9uKWhhcyh2YWwsIFNSQykgfHwgaGlkZSh2YWwsIFNSQywgT1trZXldID8gJycgKyBPW2tleV0gOiBUUEwuam9pbihTdHJpbmcoa2V5KSkpO1xuICBpZihPID09PSBnbG9iYWwpe1xuICAgIE9ba2V5XSA9IHZhbDtcbiAgfSBlbHNlIHtcbiAgICBpZighc2FmZSl7XG4gICAgICBkZWxldGUgT1trZXldO1xuICAgICAgaGlkZShPLCBrZXksIHZhbCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGlmKE9ba2V5XSlPW2tleV0gPSB2YWw7XG4gICAgICBlbHNlIGhpZGUoTywga2V5LCB2YWwpO1xuICAgIH1cbiAgfVxuLy8gYWRkIGZha2UgRnVuY3Rpb24jdG9TdHJpbmcgZm9yIGNvcnJlY3Qgd29yayB3cmFwcGVkIG1ldGhvZHMgLyBjb25zdHJ1Y3RvcnMgd2l0aCBtZXRob2RzIGxpa2UgTG9EYXNoIGlzTmF0aXZlXG59KShGdW5jdGlvbi5wcm90b3R5cGUsIFRPX1NUUklORywgZnVuY3Rpb24gdG9TdHJpbmcoKXtcbiAgcmV0dXJuIHR5cGVvZiB0aGlzID09ICdmdW5jdGlvbicgJiYgdGhpc1tTUkNdIHx8ICR0b1N0cmluZy5jYWxsKHRoaXMpO1xufSk7IiwiJ3VzZSBzdHJpY3QnO1xudmFyIGdsb2JhbCAgICAgID0gcmVxdWlyZSgnLi9fZ2xvYmFsJylcbiAgLCBkUCAgICAgICAgICA9IHJlcXVpcmUoJy4vX29iamVjdC1kcCcpXG4gICwgREVTQ1JJUFRPUlMgPSByZXF1aXJlKCcuL19kZXNjcmlwdG9ycycpXG4gICwgU1BFQ0lFUyAgICAgPSByZXF1aXJlKCcuL193a3MnKSgnc3BlY2llcycpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKEtFWSl7XG4gIHZhciBDID0gZ2xvYmFsW0tFWV07XG4gIGlmKERFU0NSSVBUT1JTICYmIEMgJiYgIUNbU1BFQ0lFU10pZFAuZihDLCBTUEVDSUVTLCB7XG4gICAgY29uZmlndXJhYmxlOiB0cnVlLFxuICAgIGdldDogZnVuY3Rpb24oKXsgcmV0dXJuIHRoaXM7IH1cbiAgfSk7XG59OyIsInZhciBkZWYgPSByZXF1aXJlKCcuL19vYmplY3QtZHAnKS5mXG4gICwgaGFzID0gcmVxdWlyZSgnLi9faGFzJylcbiAgLCBUQUcgPSByZXF1aXJlKCcuL193a3MnKSgndG9TdHJpbmdUYWcnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihpdCwgdGFnLCBzdGF0KXtcbiAgaWYoaXQgJiYgIWhhcyhpdCA9IHN0YXQgPyBpdCA6IGl0LnByb3RvdHlwZSwgVEFHKSlkZWYoaXQsIFRBRywge2NvbmZpZ3VyYWJsZTogdHJ1ZSwgdmFsdWU6IHRhZ30pO1xufTsiLCJ2YXIgc2hhcmVkID0gcmVxdWlyZSgnLi9fc2hhcmVkJykoJ2tleXMnKVxuICAsIHVpZCAgICA9IHJlcXVpcmUoJy4vX3VpZCcpO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihrZXkpe1xuICByZXR1cm4gc2hhcmVkW2tleV0gfHwgKHNoYXJlZFtrZXldID0gdWlkKGtleSkpO1xufTsiLCJ2YXIgZ2xvYmFsID0gcmVxdWlyZSgnLi9fZ2xvYmFsJylcbiAgLCBTSEFSRUQgPSAnX19jb3JlLWpzX3NoYXJlZF9fJ1xuICAsIHN0b3JlICA9IGdsb2JhbFtTSEFSRURdIHx8IChnbG9iYWxbU0hBUkVEXSA9IHt9KTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oa2V5KXtcbiAgcmV0dXJuIHN0b3JlW2tleV0gfHwgKHN0b3JlW2tleV0gPSB7fSk7XG59OyIsIi8vIDcuMy4yMCBTcGVjaWVzQ29uc3RydWN0b3IoTywgZGVmYXVsdENvbnN0cnVjdG9yKVxudmFyIGFuT2JqZWN0ICA9IHJlcXVpcmUoJy4vX2FuLW9iamVjdCcpXG4gICwgYUZ1bmN0aW9uID0gcmVxdWlyZSgnLi9fYS1mdW5jdGlvbicpXG4gICwgU1BFQ0lFUyAgID0gcmVxdWlyZSgnLi9fd2tzJykoJ3NwZWNpZXMnKTtcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oTywgRCl7XG4gIHZhciBDID0gYW5PYmplY3QoTykuY29uc3RydWN0b3IsIFM7XG4gIHJldHVybiBDID09PSB1bmRlZmluZWQgfHwgKFMgPSBhbk9iamVjdChDKVtTUEVDSUVTXSkgPT0gdW5kZWZpbmVkID8gRCA6IGFGdW5jdGlvbihTKTtcbn07IiwidmFyIHRvSW50ZWdlciA9IHJlcXVpcmUoJy4vX3RvLWludGVnZXInKVxuICAsIGRlZmluZWQgICA9IHJlcXVpcmUoJy4vX2RlZmluZWQnKTtcbi8vIHRydWUgIC0+IFN0cmluZyNhdFxuLy8gZmFsc2UgLT4gU3RyaW5nI2NvZGVQb2ludEF0XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKFRPX1NUUklORyl7XG4gIHJldHVybiBmdW5jdGlvbih0aGF0LCBwb3Mpe1xuICAgIHZhciBzID0gU3RyaW5nKGRlZmluZWQodGhhdCkpXG4gICAgICAsIGkgPSB0b0ludGVnZXIocG9zKVxuICAgICAgLCBsID0gcy5sZW5ndGhcbiAgICAgICwgYSwgYjtcbiAgICBpZihpIDwgMCB8fCBpID49IGwpcmV0dXJuIFRPX1NUUklORyA/ICcnIDogdW5kZWZpbmVkO1xuICAgIGEgPSBzLmNoYXJDb2RlQXQoaSk7XG4gICAgcmV0dXJuIGEgPCAweGQ4MDAgfHwgYSA+IDB4ZGJmZiB8fCBpICsgMSA9PT0gbCB8fCAoYiA9IHMuY2hhckNvZGVBdChpICsgMSkpIDwgMHhkYzAwIHx8IGIgPiAweGRmZmZcbiAgICAgID8gVE9fU1RSSU5HID8gcy5jaGFyQXQoaSkgOiBhXG4gICAgICA6IFRPX1NUUklORyA/IHMuc2xpY2UoaSwgaSArIDIpIDogKGEgLSAweGQ4MDAgPDwgMTApICsgKGIgLSAweGRjMDApICsgMHgxMDAwMDtcbiAgfTtcbn07IiwidmFyIGN0eCAgICAgICAgICAgICAgICA9IHJlcXVpcmUoJy4vX2N0eCcpXG4gICwgaW52b2tlICAgICAgICAgICAgID0gcmVxdWlyZSgnLi9faW52b2tlJylcbiAgLCBodG1sICAgICAgICAgICAgICAgPSByZXF1aXJlKCcuL19odG1sJylcbiAgLCBjZWwgICAgICAgICAgICAgICAgPSByZXF1aXJlKCcuL19kb20tY3JlYXRlJylcbiAgLCBnbG9iYWwgICAgICAgICAgICAgPSByZXF1aXJlKCcuL19nbG9iYWwnKVxuICAsIHByb2Nlc3MgICAgICAgICAgICA9IGdsb2JhbC5wcm9jZXNzXG4gICwgc2V0VGFzayAgICAgICAgICAgID0gZ2xvYmFsLnNldEltbWVkaWF0ZVxuICAsIGNsZWFyVGFzayAgICAgICAgICA9IGdsb2JhbC5jbGVhckltbWVkaWF0ZVxuICAsIE1lc3NhZ2VDaGFubmVsICAgICA9IGdsb2JhbC5NZXNzYWdlQ2hhbm5lbFxuICAsIGNvdW50ZXIgICAgICAgICAgICA9IDBcbiAgLCBxdWV1ZSAgICAgICAgICAgICAgPSB7fVxuICAsIE9OUkVBRFlTVEFURUNIQU5HRSA9ICdvbnJlYWR5c3RhdGVjaGFuZ2UnXG4gICwgZGVmZXIsIGNoYW5uZWwsIHBvcnQ7XG52YXIgcnVuID0gZnVuY3Rpb24oKXtcbiAgdmFyIGlkID0gK3RoaXM7XG4gIGlmKHF1ZXVlLmhhc093blByb3BlcnR5KGlkKSl7XG4gICAgdmFyIGZuID0gcXVldWVbaWRdO1xuICAgIGRlbGV0ZSBxdWV1ZVtpZF07XG4gICAgZm4oKTtcbiAgfVxufTtcbnZhciBsaXN0ZW5lciA9IGZ1bmN0aW9uKGV2ZW50KXtcbiAgcnVuLmNhbGwoZXZlbnQuZGF0YSk7XG59O1xuLy8gTm9kZS5qcyAwLjkrICYgSUUxMCsgaGFzIHNldEltbWVkaWF0ZSwgb3RoZXJ3aXNlOlxuaWYoIXNldFRhc2sgfHwgIWNsZWFyVGFzayl7XG4gIHNldFRhc2sgPSBmdW5jdGlvbiBzZXRJbW1lZGlhdGUoZm4pe1xuICAgIHZhciBhcmdzID0gW10sIGkgPSAxO1xuICAgIHdoaWxlKGFyZ3VtZW50cy5sZW5ndGggPiBpKWFyZ3MucHVzaChhcmd1bWVudHNbaSsrXSk7XG4gICAgcXVldWVbKytjb3VudGVyXSA9IGZ1bmN0aW9uKCl7XG4gICAgICBpbnZva2UodHlwZW9mIGZuID09ICdmdW5jdGlvbicgPyBmbiA6IEZ1bmN0aW9uKGZuKSwgYXJncyk7XG4gICAgfTtcbiAgICBkZWZlcihjb3VudGVyKTtcbiAgICByZXR1cm4gY291bnRlcjtcbiAgfTtcbiAgY2xlYXJUYXNrID0gZnVuY3Rpb24gY2xlYXJJbW1lZGlhdGUoaWQpe1xuICAgIGRlbGV0ZSBxdWV1ZVtpZF07XG4gIH07XG4gIC8vIE5vZGUuanMgMC44LVxuICBpZihyZXF1aXJlKCcuL19jb2YnKShwcm9jZXNzKSA9PSAncHJvY2Vzcycpe1xuICAgIGRlZmVyID0gZnVuY3Rpb24oaWQpe1xuICAgICAgcHJvY2Vzcy5uZXh0VGljayhjdHgocnVuLCBpZCwgMSkpO1xuICAgIH07XG4gIC8vIEJyb3dzZXJzIHdpdGggTWVzc2FnZUNoYW5uZWwsIGluY2x1ZGVzIFdlYldvcmtlcnNcbiAgfSBlbHNlIGlmKE1lc3NhZ2VDaGFubmVsKXtcbiAgICBjaGFubmVsID0gbmV3IE1lc3NhZ2VDaGFubmVsO1xuICAgIHBvcnQgICAgPSBjaGFubmVsLnBvcnQyO1xuICAgIGNoYW5uZWwucG9ydDEub25tZXNzYWdlID0gbGlzdGVuZXI7XG4gICAgZGVmZXIgPSBjdHgocG9ydC5wb3N0TWVzc2FnZSwgcG9ydCwgMSk7XG4gIC8vIEJyb3dzZXJzIHdpdGggcG9zdE1lc3NhZ2UsIHNraXAgV2ViV29ya2Vyc1xuICAvLyBJRTggaGFzIHBvc3RNZXNzYWdlLCBidXQgaXQncyBzeW5jICYgdHlwZW9mIGl0cyBwb3N0TWVzc2FnZSBpcyAnb2JqZWN0J1xuICB9IGVsc2UgaWYoZ2xvYmFsLmFkZEV2ZW50TGlzdGVuZXIgJiYgdHlwZW9mIHBvc3RNZXNzYWdlID09ICdmdW5jdGlvbicgJiYgIWdsb2JhbC5pbXBvcnRTY3JpcHRzKXtcbiAgICBkZWZlciA9IGZ1bmN0aW9uKGlkKXtcbiAgICAgIGdsb2JhbC5wb3N0TWVzc2FnZShpZCArICcnLCAnKicpO1xuICAgIH07XG4gICAgZ2xvYmFsLmFkZEV2ZW50TGlzdGVuZXIoJ21lc3NhZ2UnLCBsaXN0ZW5lciwgZmFsc2UpO1xuICAvLyBJRTgtXG4gIH0gZWxzZSBpZihPTlJFQURZU1RBVEVDSEFOR0UgaW4gY2VsKCdzY3JpcHQnKSl7XG4gICAgZGVmZXIgPSBmdW5jdGlvbihpZCl7XG4gICAgICBodG1sLmFwcGVuZENoaWxkKGNlbCgnc2NyaXB0JykpW09OUkVBRFlTVEFURUNIQU5HRV0gPSBmdW5jdGlvbigpe1xuICAgICAgICBodG1sLnJlbW92ZUNoaWxkKHRoaXMpO1xuICAgICAgICBydW4uY2FsbChpZCk7XG4gICAgICB9O1xuICAgIH07XG4gIC8vIFJlc3Qgb2xkIGJyb3dzZXJzXG4gIH0gZWxzZSB7XG4gICAgZGVmZXIgPSBmdW5jdGlvbihpZCl7XG4gICAgICBzZXRUaW1lb3V0KGN0eChydW4sIGlkLCAxKSwgMCk7XG4gICAgfTtcbiAgfVxufVxubW9kdWxlLmV4cG9ydHMgPSB7XG4gIHNldDogICBzZXRUYXNrLFxuICBjbGVhcjogY2xlYXJUYXNrXG59OyIsInZhciB0b0ludGVnZXIgPSByZXF1aXJlKCcuL190by1pbnRlZ2VyJylcbiAgLCBtYXggICAgICAgPSBNYXRoLm1heFxuICAsIG1pbiAgICAgICA9IE1hdGgubWluO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihpbmRleCwgbGVuZ3RoKXtcbiAgaW5kZXggPSB0b0ludGVnZXIoaW5kZXgpO1xuICByZXR1cm4gaW5kZXggPCAwID8gbWF4KGluZGV4ICsgbGVuZ3RoLCAwKSA6IG1pbihpbmRleCwgbGVuZ3RoKTtcbn07IiwiLy8gNy4xLjQgVG9JbnRlZ2VyXG52YXIgY2VpbCAgPSBNYXRoLmNlaWxcbiAgLCBmbG9vciA9IE1hdGguZmxvb3I7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGl0KXtcbiAgcmV0dXJuIGlzTmFOKGl0ID0gK2l0KSA/IDAgOiAoaXQgPiAwID8gZmxvb3IgOiBjZWlsKShpdCk7XG59OyIsIi8vIHRvIGluZGV4ZWQgb2JqZWN0LCB0b09iamVjdCB3aXRoIGZhbGxiYWNrIGZvciBub24tYXJyYXktbGlrZSBFUzMgc3RyaW5nc1xudmFyIElPYmplY3QgPSByZXF1aXJlKCcuL19pb2JqZWN0JylcbiAgLCBkZWZpbmVkID0gcmVxdWlyZSgnLi9fZGVmaW5lZCcpO1xubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihpdCl7XG4gIHJldHVybiBJT2JqZWN0KGRlZmluZWQoaXQpKTtcbn07IiwiLy8gNy4xLjE1IFRvTGVuZ3RoXG52YXIgdG9JbnRlZ2VyID0gcmVxdWlyZSgnLi9fdG8taW50ZWdlcicpXG4gICwgbWluICAgICAgID0gTWF0aC5taW47XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGl0KXtcbiAgcmV0dXJuIGl0ID4gMCA/IG1pbih0b0ludGVnZXIoaXQpLCAweDFmZmZmZmZmZmZmZmZmKSA6IDA7IC8vIHBvdygyLCA1MykgLSAxID09IDkwMDcxOTkyNTQ3NDA5OTFcbn07IiwiLy8gNy4xLjEzIFRvT2JqZWN0KGFyZ3VtZW50KVxudmFyIGRlZmluZWQgPSByZXF1aXJlKCcuL19kZWZpbmVkJyk7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGl0KXtcbiAgcmV0dXJuIE9iamVjdChkZWZpbmVkKGl0KSk7XG59OyIsIi8vIDcuMS4xIFRvUHJpbWl0aXZlKGlucHV0IFssIFByZWZlcnJlZFR5cGVdKVxudmFyIGlzT2JqZWN0ID0gcmVxdWlyZSgnLi9faXMtb2JqZWN0Jyk7XG4vLyBpbnN0ZWFkIG9mIHRoZSBFUzYgc3BlYyB2ZXJzaW9uLCB3ZSBkaWRuJ3QgaW1wbGVtZW50IEBAdG9QcmltaXRpdmUgY2FzZVxuLy8gYW5kIHRoZSBzZWNvbmQgYXJndW1lbnQgLSBmbGFnIC0gcHJlZmVycmVkIHR5cGUgaXMgYSBzdHJpbmdcbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24oaXQsIFMpe1xuICBpZighaXNPYmplY3QoaXQpKXJldHVybiBpdDtcbiAgdmFyIGZuLCB2YWw7XG4gIGlmKFMgJiYgdHlwZW9mIChmbiA9IGl0LnRvU3RyaW5nKSA9PSAnZnVuY3Rpb24nICYmICFpc09iamVjdCh2YWwgPSBmbi5jYWxsKGl0KSkpcmV0dXJuIHZhbDtcbiAgaWYodHlwZW9mIChmbiA9IGl0LnZhbHVlT2YpID09ICdmdW5jdGlvbicgJiYgIWlzT2JqZWN0KHZhbCA9IGZuLmNhbGwoaXQpKSlyZXR1cm4gdmFsO1xuICBpZighUyAmJiB0eXBlb2YgKGZuID0gaXQudG9TdHJpbmcpID09ICdmdW5jdGlvbicgJiYgIWlzT2JqZWN0KHZhbCA9IGZuLmNhbGwoaXQpKSlyZXR1cm4gdmFsO1xuICB0aHJvdyBUeXBlRXJyb3IoXCJDYW4ndCBjb252ZXJ0IG9iamVjdCB0byBwcmltaXRpdmUgdmFsdWVcIik7XG59OyIsInZhciBpZCA9IDBcbiAgLCBweCA9IE1hdGgucmFuZG9tKCk7XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGtleSl7XG4gIHJldHVybiAnU3ltYm9sKCcuY29uY2F0KGtleSA9PT0gdW5kZWZpbmVkID8gJycgOiBrZXksICcpXycsICgrK2lkICsgcHgpLnRvU3RyaW5nKDM2KSk7XG59OyIsInZhciBzdG9yZSAgICAgID0gcmVxdWlyZSgnLi9fc2hhcmVkJykoJ3drcycpXG4gICwgdWlkICAgICAgICA9IHJlcXVpcmUoJy4vX3VpZCcpXG4gICwgU3ltYm9sICAgICA9IHJlcXVpcmUoJy4vX2dsb2JhbCcpLlN5bWJvbFxuICAsIFVTRV9TWU1CT0wgPSB0eXBlb2YgU3ltYm9sID09ICdmdW5jdGlvbic7XG5cbnZhciAkZXhwb3J0cyA9IG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24obmFtZSl7XG4gIHJldHVybiBzdG9yZVtuYW1lXSB8fCAoc3RvcmVbbmFtZV0gPVxuICAgIFVTRV9TWU1CT0wgJiYgU3ltYm9sW25hbWVdIHx8IChVU0VfU1lNQk9MID8gU3ltYm9sIDogdWlkKSgnU3ltYm9sLicgKyBuYW1lKSk7XG59O1xuXG4kZXhwb3J0cy5zdG9yZSA9IHN0b3JlOyIsInZhciBjbGFzc29mICAgPSByZXF1aXJlKCcuL19jbGFzc29mJylcbiAgLCBJVEVSQVRPUiAgPSByZXF1aXJlKCcuL193a3MnKSgnaXRlcmF0b3InKVxuICAsIEl0ZXJhdG9ycyA9IHJlcXVpcmUoJy4vX2l0ZXJhdG9ycycpO1xubW9kdWxlLmV4cG9ydHMgPSByZXF1aXJlKCcuL19jb3JlJykuZ2V0SXRlcmF0b3JNZXRob2QgPSBmdW5jdGlvbihpdCl7XG4gIGlmKGl0ICE9IHVuZGVmaW5lZClyZXR1cm4gaXRbSVRFUkFUT1JdXG4gICAgfHwgaXRbJ0BAaXRlcmF0b3InXVxuICAgIHx8IEl0ZXJhdG9yc1tjbGFzc29mKGl0KV07XG59OyIsIid1c2Ugc3RyaWN0JztcbnZhciBhZGRUb1Vuc2NvcGFibGVzID0gcmVxdWlyZSgnLi9fYWRkLXRvLXVuc2NvcGFibGVzJylcbiAgLCBzdGVwICAgICAgICAgICAgID0gcmVxdWlyZSgnLi9faXRlci1zdGVwJylcbiAgLCBJdGVyYXRvcnMgICAgICAgID0gcmVxdWlyZSgnLi9faXRlcmF0b3JzJylcbiAgLCB0b0lPYmplY3QgICAgICAgID0gcmVxdWlyZSgnLi9fdG8taW9iamVjdCcpO1xuXG4vLyAyMi4xLjMuNCBBcnJheS5wcm90b3R5cGUuZW50cmllcygpXG4vLyAyMi4xLjMuMTMgQXJyYXkucHJvdG90eXBlLmtleXMoKVxuLy8gMjIuMS4zLjI5IEFycmF5LnByb3RvdHlwZS52YWx1ZXMoKVxuLy8gMjIuMS4zLjMwIEFycmF5LnByb3RvdHlwZVtAQGl0ZXJhdG9yXSgpXG5tb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vX2l0ZXItZGVmaW5lJykoQXJyYXksICdBcnJheScsIGZ1bmN0aW9uKGl0ZXJhdGVkLCBraW5kKXtcbiAgdGhpcy5fdCA9IHRvSU9iamVjdChpdGVyYXRlZCk7IC8vIHRhcmdldFxuICB0aGlzLl9pID0gMDsgICAgICAgICAgICAgICAgICAgLy8gbmV4dCBpbmRleFxuICB0aGlzLl9rID0ga2luZDsgICAgICAgICAgICAgICAgLy8ga2luZFxuLy8gMjIuMS41LjIuMSAlQXJyYXlJdGVyYXRvclByb3RvdHlwZSUubmV4dCgpXG59LCBmdW5jdGlvbigpe1xuICB2YXIgTyAgICAgPSB0aGlzLl90XG4gICAgLCBraW5kICA9IHRoaXMuX2tcbiAgICAsIGluZGV4ID0gdGhpcy5faSsrO1xuICBpZighTyB8fCBpbmRleCA+PSBPLmxlbmd0aCl7XG4gICAgdGhpcy5fdCA9IHVuZGVmaW5lZDtcbiAgICByZXR1cm4gc3RlcCgxKTtcbiAgfVxuICBpZihraW5kID09ICdrZXlzJyAgKXJldHVybiBzdGVwKDAsIGluZGV4KTtcbiAgaWYoa2luZCA9PSAndmFsdWVzJylyZXR1cm4gc3RlcCgwLCBPW2luZGV4XSk7XG4gIHJldHVybiBzdGVwKDAsIFtpbmRleCwgT1tpbmRleF1dKTtcbn0sICd2YWx1ZXMnKTtcblxuLy8gYXJndW1lbnRzTGlzdFtAQGl0ZXJhdG9yXSBpcyAlQXJyYXlQcm90b192YWx1ZXMlICg5LjQuNC42LCA5LjQuNC43KVxuSXRlcmF0b3JzLkFyZ3VtZW50cyA9IEl0ZXJhdG9ycy5BcnJheTtcblxuYWRkVG9VbnNjb3BhYmxlcygna2V5cycpO1xuYWRkVG9VbnNjb3BhYmxlcygndmFsdWVzJyk7XG5hZGRUb1Vuc2NvcGFibGVzKCdlbnRyaWVzJyk7IiwiJ3VzZSBzdHJpY3QnO1xuLy8gMTkuMS4zLjYgT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZygpXG52YXIgY2xhc3NvZiA9IHJlcXVpcmUoJy4vX2NsYXNzb2YnKVxuICAsIHRlc3QgICAgPSB7fTtcbnRlc3RbcmVxdWlyZSgnLi9fd2tzJykoJ3RvU3RyaW5nVGFnJyldID0gJ3onO1xuaWYodGVzdCArICcnICE9ICdbb2JqZWN0IHpdJyl7XG4gIHJlcXVpcmUoJy4vX3JlZGVmaW5lJykoT2JqZWN0LnByb3RvdHlwZSwgJ3RvU3RyaW5nJywgZnVuY3Rpb24gdG9TdHJpbmcoKXtcbiAgICByZXR1cm4gJ1tvYmplY3QgJyArIGNsYXNzb2YodGhpcykgKyAnXSc7XG4gIH0sIHRydWUpO1xufSIsIid1c2Ugc3RyaWN0JztcbnZhciBMSUJSQVJZICAgICAgICAgICAgPSByZXF1aXJlKCcuL19saWJyYXJ5JylcbiAgLCBnbG9iYWwgICAgICAgICAgICAgPSByZXF1aXJlKCcuL19nbG9iYWwnKVxuICAsIGN0eCAgICAgICAgICAgICAgICA9IHJlcXVpcmUoJy4vX2N0eCcpXG4gICwgY2xhc3NvZiAgICAgICAgICAgID0gcmVxdWlyZSgnLi9fY2xhc3NvZicpXG4gICwgJGV4cG9ydCAgICAgICAgICAgID0gcmVxdWlyZSgnLi9fZXhwb3J0JylcbiAgLCBpc09iamVjdCAgICAgICAgICAgPSByZXF1aXJlKCcuL19pcy1vYmplY3QnKVxuICAsIGFGdW5jdGlvbiAgICAgICAgICA9IHJlcXVpcmUoJy4vX2EtZnVuY3Rpb24nKVxuICAsIGFuSW5zdGFuY2UgICAgICAgICA9IHJlcXVpcmUoJy4vX2FuLWluc3RhbmNlJylcbiAgLCBmb3JPZiAgICAgICAgICAgICAgPSByZXF1aXJlKCcuL19mb3Itb2YnKVxuICAsIHNwZWNpZXNDb25zdHJ1Y3RvciA9IHJlcXVpcmUoJy4vX3NwZWNpZXMtY29uc3RydWN0b3InKVxuICAsIHRhc2sgICAgICAgICAgICAgICA9IHJlcXVpcmUoJy4vX3Rhc2snKS5zZXRcbiAgLCBtaWNyb3Rhc2sgICAgICAgICAgPSByZXF1aXJlKCcuL19taWNyb3Rhc2snKSgpXG4gICwgUFJPTUlTRSAgICAgICAgICAgID0gJ1Byb21pc2UnXG4gICwgVHlwZUVycm9yICAgICAgICAgID0gZ2xvYmFsLlR5cGVFcnJvclxuICAsIHByb2Nlc3MgICAgICAgICAgICA9IGdsb2JhbC5wcm9jZXNzXG4gICwgJFByb21pc2UgICAgICAgICAgID0gZ2xvYmFsW1BST01JU0VdXG4gICwgcHJvY2VzcyAgICAgICAgICAgID0gZ2xvYmFsLnByb2Nlc3NcbiAgLCBpc05vZGUgICAgICAgICAgICAgPSBjbGFzc29mKHByb2Nlc3MpID09ICdwcm9jZXNzJ1xuICAsIGVtcHR5ICAgICAgICAgICAgICA9IGZ1bmN0aW9uKCl7IC8qIGVtcHR5ICovIH1cbiAgLCBJbnRlcm5hbCwgR2VuZXJpY1Byb21pc2VDYXBhYmlsaXR5LCBXcmFwcGVyO1xuXG52YXIgVVNFX05BVElWRSA9ICEhZnVuY3Rpb24oKXtcbiAgdHJ5IHtcbiAgICAvLyBjb3JyZWN0IHN1YmNsYXNzaW5nIHdpdGggQEBzcGVjaWVzIHN1cHBvcnRcbiAgICB2YXIgcHJvbWlzZSAgICAgPSAkUHJvbWlzZS5yZXNvbHZlKDEpXG4gICAgICAsIEZha2VQcm9taXNlID0gKHByb21pc2UuY29uc3RydWN0b3IgPSB7fSlbcmVxdWlyZSgnLi9fd2tzJykoJ3NwZWNpZXMnKV0gPSBmdW5jdGlvbihleGVjKXsgZXhlYyhlbXB0eSwgZW1wdHkpOyB9O1xuICAgIC8vIHVuaGFuZGxlZCByZWplY3Rpb25zIHRyYWNraW5nIHN1cHBvcnQsIE5vZGVKUyBQcm9taXNlIHdpdGhvdXQgaXQgZmFpbHMgQEBzcGVjaWVzIHRlc3RcbiAgICByZXR1cm4gKGlzTm9kZSB8fCB0eXBlb2YgUHJvbWlzZVJlamVjdGlvbkV2ZW50ID09ICdmdW5jdGlvbicpICYmIHByb21pc2UudGhlbihlbXB0eSkgaW5zdGFuY2VvZiBGYWtlUHJvbWlzZTtcbiAgfSBjYXRjaChlKXsgLyogZW1wdHkgKi8gfVxufSgpO1xuXG4vLyBoZWxwZXJzXG52YXIgc2FtZUNvbnN0cnVjdG9yID0gZnVuY3Rpb24oYSwgYil7XG4gIC8vIHdpdGggbGlicmFyeSB3cmFwcGVyIHNwZWNpYWwgY2FzZVxuICByZXR1cm4gYSA9PT0gYiB8fCBhID09PSAkUHJvbWlzZSAmJiBiID09PSBXcmFwcGVyO1xufTtcbnZhciBpc1RoZW5hYmxlID0gZnVuY3Rpb24oaXQpe1xuICB2YXIgdGhlbjtcbiAgcmV0dXJuIGlzT2JqZWN0KGl0KSAmJiB0eXBlb2YgKHRoZW4gPSBpdC50aGVuKSA9PSAnZnVuY3Rpb24nID8gdGhlbiA6IGZhbHNlO1xufTtcbnZhciBuZXdQcm9taXNlQ2FwYWJpbGl0eSA9IGZ1bmN0aW9uKEMpe1xuICByZXR1cm4gc2FtZUNvbnN0cnVjdG9yKCRQcm9taXNlLCBDKVxuICAgID8gbmV3IFByb21pc2VDYXBhYmlsaXR5KEMpXG4gICAgOiBuZXcgR2VuZXJpY1Byb21pc2VDYXBhYmlsaXR5KEMpO1xufTtcbnZhciBQcm9taXNlQ2FwYWJpbGl0eSA9IEdlbmVyaWNQcm9taXNlQ2FwYWJpbGl0eSA9IGZ1bmN0aW9uKEMpe1xuICB2YXIgcmVzb2x2ZSwgcmVqZWN0O1xuICB0aGlzLnByb21pc2UgPSBuZXcgQyhmdW5jdGlvbigkJHJlc29sdmUsICQkcmVqZWN0KXtcbiAgICBpZihyZXNvbHZlICE9PSB1bmRlZmluZWQgfHwgcmVqZWN0ICE9PSB1bmRlZmluZWQpdGhyb3cgVHlwZUVycm9yKCdCYWQgUHJvbWlzZSBjb25zdHJ1Y3RvcicpO1xuICAgIHJlc29sdmUgPSAkJHJlc29sdmU7XG4gICAgcmVqZWN0ICA9ICQkcmVqZWN0O1xuICB9KTtcbiAgdGhpcy5yZXNvbHZlID0gYUZ1bmN0aW9uKHJlc29sdmUpO1xuICB0aGlzLnJlamVjdCAgPSBhRnVuY3Rpb24ocmVqZWN0KTtcbn07XG52YXIgcGVyZm9ybSA9IGZ1bmN0aW9uKGV4ZWMpe1xuICB0cnkge1xuICAgIGV4ZWMoKTtcbiAgfSBjYXRjaChlKXtcbiAgICByZXR1cm4ge2Vycm9yOiBlfTtcbiAgfVxufTtcbnZhciBub3RpZnkgPSBmdW5jdGlvbihwcm9taXNlLCBpc1JlamVjdCl7XG4gIGlmKHByb21pc2UuX24pcmV0dXJuO1xuICBwcm9taXNlLl9uID0gdHJ1ZTtcbiAgdmFyIGNoYWluID0gcHJvbWlzZS5fYztcbiAgbWljcm90YXNrKGZ1bmN0aW9uKCl7XG4gICAgdmFyIHZhbHVlID0gcHJvbWlzZS5fdlxuICAgICAgLCBvayAgICA9IHByb21pc2UuX3MgPT0gMVxuICAgICAgLCBpICAgICA9IDA7XG4gICAgdmFyIHJ1biA9IGZ1bmN0aW9uKHJlYWN0aW9uKXtcbiAgICAgIHZhciBoYW5kbGVyID0gb2sgPyByZWFjdGlvbi5vayA6IHJlYWN0aW9uLmZhaWxcbiAgICAgICAgLCByZXNvbHZlID0gcmVhY3Rpb24ucmVzb2x2ZVxuICAgICAgICAsIHJlamVjdCAgPSByZWFjdGlvbi5yZWplY3RcbiAgICAgICAgLCBkb21haW4gID0gcmVhY3Rpb24uZG9tYWluXG4gICAgICAgICwgcmVzdWx0LCB0aGVuO1xuICAgICAgdHJ5IHtcbiAgICAgICAgaWYoaGFuZGxlcil7XG4gICAgICAgICAgaWYoIW9rKXtcbiAgICAgICAgICAgIGlmKHByb21pc2UuX2ggPT0gMilvbkhhbmRsZVVuaGFuZGxlZChwcm9taXNlKTtcbiAgICAgICAgICAgIHByb21pc2UuX2ggPSAxO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZihoYW5kbGVyID09PSB0cnVlKXJlc3VsdCA9IHZhbHVlO1xuICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgaWYoZG9tYWluKWRvbWFpbi5lbnRlcigpO1xuICAgICAgICAgICAgcmVzdWx0ID0gaGFuZGxlcih2YWx1ZSk7XG4gICAgICAgICAgICBpZihkb21haW4pZG9tYWluLmV4aXQoKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaWYocmVzdWx0ID09PSByZWFjdGlvbi5wcm9taXNlKXtcbiAgICAgICAgICAgIHJlamVjdChUeXBlRXJyb3IoJ1Byb21pc2UtY2hhaW4gY3ljbGUnKSk7XG4gICAgICAgICAgfSBlbHNlIGlmKHRoZW4gPSBpc1RoZW5hYmxlKHJlc3VsdCkpe1xuICAgICAgICAgICAgdGhlbi5jYWxsKHJlc3VsdCwgcmVzb2x2ZSwgcmVqZWN0KTtcbiAgICAgICAgICB9IGVsc2UgcmVzb2x2ZShyZXN1bHQpO1xuICAgICAgICB9IGVsc2UgcmVqZWN0KHZhbHVlKTtcbiAgICAgIH0gY2F0Y2goZSl7XG4gICAgICAgIHJlamVjdChlKTtcbiAgICAgIH1cbiAgICB9O1xuICAgIHdoaWxlKGNoYWluLmxlbmd0aCA+IGkpcnVuKGNoYWluW2krK10pOyAvLyB2YXJpYWJsZSBsZW5ndGggLSBjYW4ndCB1c2UgZm9yRWFjaFxuICAgIHByb21pc2UuX2MgPSBbXTtcbiAgICBwcm9taXNlLl9uID0gZmFsc2U7XG4gICAgaWYoaXNSZWplY3QgJiYgIXByb21pc2UuX2gpb25VbmhhbmRsZWQocHJvbWlzZSk7XG4gIH0pO1xufTtcbnZhciBvblVuaGFuZGxlZCA9IGZ1bmN0aW9uKHByb21pc2Upe1xuICB0YXNrLmNhbGwoZ2xvYmFsLCBmdW5jdGlvbigpe1xuICAgIHZhciB2YWx1ZSA9IHByb21pc2UuX3ZcbiAgICAgICwgYWJydXB0LCBoYW5kbGVyLCBjb25zb2xlO1xuICAgIGlmKGlzVW5oYW5kbGVkKHByb21pc2UpKXtcbiAgICAgIGFicnVwdCA9IHBlcmZvcm0oZnVuY3Rpb24oKXtcbiAgICAgICAgaWYoaXNOb2RlKXtcbiAgICAgICAgICBwcm9jZXNzLmVtaXQoJ3VuaGFuZGxlZFJlamVjdGlvbicsIHZhbHVlLCBwcm9taXNlKTtcbiAgICAgICAgfSBlbHNlIGlmKGhhbmRsZXIgPSBnbG9iYWwub251bmhhbmRsZWRyZWplY3Rpb24pe1xuICAgICAgICAgIGhhbmRsZXIoe3Byb21pc2U6IHByb21pc2UsIHJlYXNvbjogdmFsdWV9KTtcbiAgICAgICAgfSBlbHNlIGlmKChjb25zb2xlID0gZ2xvYmFsLmNvbnNvbGUpICYmIGNvbnNvbGUuZXJyb3Ipe1xuICAgICAgICAgIGNvbnNvbGUuZXJyb3IoJ1VuaGFuZGxlZCBwcm9taXNlIHJlamVjdGlvbicsIHZhbHVlKTtcbiAgICAgICAgfVxuICAgICAgfSk7XG4gICAgICAvLyBCcm93c2VycyBzaG91bGQgbm90IHRyaWdnZXIgYHJlamVjdGlvbkhhbmRsZWRgIGV2ZW50IGlmIGl0IHdhcyBoYW5kbGVkIGhlcmUsIE5vZGVKUyAtIHNob3VsZFxuICAgICAgcHJvbWlzZS5faCA9IGlzTm9kZSB8fCBpc1VuaGFuZGxlZChwcm9taXNlKSA/IDIgOiAxO1xuICAgIH0gcHJvbWlzZS5fYSA9IHVuZGVmaW5lZDtcbiAgICBpZihhYnJ1cHQpdGhyb3cgYWJydXB0LmVycm9yO1xuICB9KTtcbn07XG52YXIgaXNVbmhhbmRsZWQgPSBmdW5jdGlvbihwcm9taXNlKXtcbiAgaWYocHJvbWlzZS5faCA9PSAxKXJldHVybiBmYWxzZTtcbiAgdmFyIGNoYWluID0gcHJvbWlzZS5fYSB8fCBwcm9taXNlLl9jXG4gICAgLCBpICAgICA9IDBcbiAgICAsIHJlYWN0aW9uO1xuICB3aGlsZShjaGFpbi5sZW5ndGggPiBpKXtcbiAgICByZWFjdGlvbiA9IGNoYWluW2krK107XG4gICAgaWYocmVhY3Rpb24uZmFpbCB8fCAhaXNVbmhhbmRsZWQocmVhY3Rpb24ucHJvbWlzZSkpcmV0dXJuIGZhbHNlO1xuICB9IHJldHVybiB0cnVlO1xufTtcbnZhciBvbkhhbmRsZVVuaGFuZGxlZCA9IGZ1bmN0aW9uKHByb21pc2Upe1xuICB0YXNrLmNhbGwoZ2xvYmFsLCBmdW5jdGlvbigpe1xuICAgIHZhciBoYW5kbGVyO1xuICAgIGlmKGlzTm9kZSl7XG4gICAgICBwcm9jZXNzLmVtaXQoJ3JlamVjdGlvbkhhbmRsZWQnLCBwcm9taXNlKTtcbiAgICB9IGVsc2UgaWYoaGFuZGxlciA9IGdsb2JhbC5vbnJlamVjdGlvbmhhbmRsZWQpe1xuICAgICAgaGFuZGxlcih7cHJvbWlzZTogcHJvbWlzZSwgcmVhc29uOiBwcm9taXNlLl92fSk7XG4gICAgfVxuICB9KTtcbn07XG52YXIgJHJlamVjdCA9IGZ1bmN0aW9uKHZhbHVlKXtcbiAgdmFyIHByb21pc2UgPSB0aGlzO1xuICBpZihwcm9taXNlLl9kKXJldHVybjtcbiAgcHJvbWlzZS5fZCA9IHRydWU7XG4gIHByb21pc2UgPSBwcm9taXNlLl93IHx8IHByb21pc2U7IC8vIHVud3JhcFxuICBwcm9taXNlLl92ID0gdmFsdWU7XG4gIHByb21pc2UuX3MgPSAyO1xuICBpZighcHJvbWlzZS5fYSlwcm9taXNlLl9hID0gcHJvbWlzZS5fYy5zbGljZSgpO1xuICBub3RpZnkocHJvbWlzZSwgdHJ1ZSk7XG59O1xudmFyICRyZXNvbHZlID0gZnVuY3Rpb24odmFsdWUpe1xuICB2YXIgcHJvbWlzZSA9IHRoaXNcbiAgICAsIHRoZW47XG4gIGlmKHByb21pc2UuX2QpcmV0dXJuO1xuICBwcm9taXNlLl9kID0gdHJ1ZTtcbiAgcHJvbWlzZSA9IHByb21pc2UuX3cgfHwgcHJvbWlzZTsgLy8gdW53cmFwXG4gIHRyeSB7XG4gICAgaWYocHJvbWlzZSA9PT0gdmFsdWUpdGhyb3cgVHlwZUVycm9yKFwiUHJvbWlzZSBjYW4ndCBiZSByZXNvbHZlZCBpdHNlbGZcIik7XG4gICAgaWYodGhlbiA9IGlzVGhlbmFibGUodmFsdWUpKXtcbiAgICAgIG1pY3JvdGFzayhmdW5jdGlvbigpe1xuICAgICAgICB2YXIgd3JhcHBlciA9IHtfdzogcHJvbWlzZSwgX2Q6IGZhbHNlfTsgLy8gd3JhcFxuICAgICAgICB0cnkge1xuICAgICAgICAgIHRoZW4uY2FsbCh2YWx1ZSwgY3R4KCRyZXNvbHZlLCB3cmFwcGVyLCAxKSwgY3R4KCRyZWplY3QsIHdyYXBwZXIsIDEpKTtcbiAgICAgICAgfSBjYXRjaChlKXtcbiAgICAgICAgICAkcmVqZWN0LmNhbGwod3JhcHBlciwgZSk7XG4gICAgICAgIH1cbiAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICBwcm9taXNlLl92ID0gdmFsdWU7XG4gICAgICBwcm9taXNlLl9zID0gMTtcbiAgICAgIG5vdGlmeShwcm9taXNlLCBmYWxzZSk7XG4gICAgfVxuICB9IGNhdGNoKGUpe1xuICAgICRyZWplY3QuY2FsbCh7X3c6IHByb21pc2UsIF9kOiBmYWxzZX0sIGUpOyAvLyB3cmFwXG4gIH1cbn07XG5cbi8vIGNvbnN0cnVjdG9yIHBvbHlmaWxsXG5pZighVVNFX05BVElWRSl7XG4gIC8vIDI1LjQuMy4xIFByb21pc2UoZXhlY3V0b3IpXG4gICRQcm9taXNlID0gZnVuY3Rpb24gUHJvbWlzZShleGVjdXRvcil7XG4gICAgYW5JbnN0YW5jZSh0aGlzLCAkUHJvbWlzZSwgUFJPTUlTRSwgJ19oJyk7XG4gICAgYUZ1bmN0aW9uKGV4ZWN1dG9yKTtcbiAgICBJbnRlcm5hbC5jYWxsKHRoaXMpO1xuICAgIHRyeSB7XG4gICAgICBleGVjdXRvcihjdHgoJHJlc29sdmUsIHRoaXMsIDEpLCBjdHgoJHJlamVjdCwgdGhpcywgMSkpO1xuICAgIH0gY2F0Y2goZXJyKXtcbiAgICAgICRyZWplY3QuY2FsbCh0aGlzLCBlcnIpO1xuICAgIH1cbiAgfTtcbiAgSW50ZXJuYWwgPSBmdW5jdGlvbiBQcm9taXNlKGV4ZWN1dG9yKXtcbiAgICB0aGlzLl9jID0gW107ICAgICAgICAgICAgIC8vIDwtIGF3YWl0aW5nIHJlYWN0aW9uc1xuICAgIHRoaXMuX2EgPSB1bmRlZmluZWQ7ICAgICAgLy8gPC0gY2hlY2tlZCBpbiBpc1VuaGFuZGxlZCByZWFjdGlvbnNcbiAgICB0aGlzLl9zID0gMDsgICAgICAgICAgICAgIC8vIDwtIHN0YXRlXG4gICAgdGhpcy5fZCA9IGZhbHNlOyAgICAgICAgICAvLyA8LSBkb25lXG4gICAgdGhpcy5fdiA9IHVuZGVmaW5lZDsgICAgICAvLyA8LSB2YWx1ZVxuICAgIHRoaXMuX2ggPSAwOyAgICAgICAgICAgICAgLy8gPC0gcmVqZWN0aW9uIHN0YXRlLCAwIC0gZGVmYXVsdCwgMSAtIGhhbmRsZWQsIDIgLSB1bmhhbmRsZWRcbiAgICB0aGlzLl9uID0gZmFsc2U7ICAgICAgICAgIC8vIDwtIG5vdGlmeVxuICB9O1xuICBJbnRlcm5hbC5wcm90b3R5cGUgPSByZXF1aXJlKCcuL19yZWRlZmluZS1hbGwnKSgkUHJvbWlzZS5wcm90b3R5cGUsIHtcbiAgICAvLyAyNS40LjUuMyBQcm9taXNlLnByb3RvdHlwZS50aGVuKG9uRnVsZmlsbGVkLCBvblJlamVjdGVkKVxuICAgIHRoZW46IGZ1bmN0aW9uIHRoZW4ob25GdWxmaWxsZWQsIG9uUmVqZWN0ZWQpe1xuICAgICAgdmFyIHJlYWN0aW9uICAgID0gbmV3UHJvbWlzZUNhcGFiaWxpdHkoc3BlY2llc0NvbnN0cnVjdG9yKHRoaXMsICRQcm9taXNlKSk7XG4gICAgICByZWFjdGlvbi5vayAgICAgPSB0eXBlb2Ygb25GdWxmaWxsZWQgPT0gJ2Z1bmN0aW9uJyA/IG9uRnVsZmlsbGVkIDogdHJ1ZTtcbiAgICAgIHJlYWN0aW9uLmZhaWwgICA9IHR5cGVvZiBvblJlamVjdGVkID09ICdmdW5jdGlvbicgJiYgb25SZWplY3RlZDtcbiAgICAgIHJlYWN0aW9uLmRvbWFpbiA9IGlzTm9kZSA/IHByb2Nlc3MuZG9tYWluIDogdW5kZWZpbmVkO1xuICAgICAgdGhpcy5fYy5wdXNoKHJlYWN0aW9uKTtcbiAgICAgIGlmKHRoaXMuX2EpdGhpcy5fYS5wdXNoKHJlYWN0aW9uKTtcbiAgICAgIGlmKHRoaXMuX3Mpbm90aWZ5KHRoaXMsIGZhbHNlKTtcbiAgICAgIHJldHVybiByZWFjdGlvbi5wcm9taXNlO1xuICAgIH0sXG4gICAgLy8gMjUuNC41LjEgUHJvbWlzZS5wcm90b3R5cGUuY2F0Y2gob25SZWplY3RlZClcbiAgICAnY2F0Y2gnOiBmdW5jdGlvbihvblJlamVjdGVkKXtcbiAgICAgIHJldHVybiB0aGlzLnRoZW4odW5kZWZpbmVkLCBvblJlamVjdGVkKTtcbiAgICB9XG4gIH0pO1xuICBQcm9taXNlQ2FwYWJpbGl0eSA9IGZ1bmN0aW9uKCl7XG4gICAgdmFyIHByb21pc2UgID0gbmV3IEludGVybmFsO1xuICAgIHRoaXMucHJvbWlzZSA9IHByb21pc2U7XG4gICAgdGhpcy5yZXNvbHZlID0gY3R4KCRyZXNvbHZlLCBwcm9taXNlLCAxKTtcbiAgICB0aGlzLnJlamVjdCAgPSBjdHgoJHJlamVjdCwgcHJvbWlzZSwgMSk7XG4gIH07XG59XG5cbiRleHBvcnQoJGV4cG9ydC5HICsgJGV4cG9ydC5XICsgJGV4cG9ydC5GICogIVVTRV9OQVRJVkUsIHtQcm9taXNlOiAkUHJvbWlzZX0pO1xucmVxdWlyZSgnLi9fc2V0LXRvLXN0cmluZy10YWcnKSgkUHJvbWlzZSwgUFJPTUlTRSk7XG5yZXF1aXJlKCcuL19zZXQtc3BlY2llcycpKFBST01JU0UpO1xuV3JhcHBlciA9IHJlcXVpcmUoJy4vX2NvcmUnKVtQUk9NSVNFXTtcblxuLy8gc3RhdGljc1xuJGV4cG9ydCgkZXhwb3J0LlMgKyAkZXhwb3J0LkYgKiAhVVNFX05BVElWRSwgUFJPTUlTRSwge1xuICAvLyAyNS40LjQuNSBQcm9taXNlLnJlamVjdChyKVxuICByZWplY3Q6IGZ1bmN0aW9uIHJlamVjdChyKXtcbiAgICB2YXIgY2FwYWJpbGl0eSA9IG5ld1Byb21pc2VDYXBhYmlsaXR5KHRoaXMpXG4gICAgICAsICQkcmVqZWN0ICAgPSBjYXBhYmlsaXR5LnJlamVjdDtcbiAgICAkJHJlamVjdChyKTtcbiAgICByZXR1cm4gY2FwYWJpbGl0eS5wcm9taXNlO1xuICB9XG59KTtcbiRleHBvcnQoJGV4cG9ydC5TICsgJGV4cG9ydC5GICogKExJQlJBUlkgfHwgIVVTRV9OQVRJVkUpLCBQUk9NSVNFLCB7XG4gIC8vIDI1LjQuNC42IFByb21pc2UucmVzb2x2ZSh4KVxuICByZXNvbHZlOiBmdW5jdGlvbiByZXNvbHZlKHgpe1xuICAgIC8vIGluc3RhbmNlb2YgaW5zdGVhZCBvZiBpbnRlcm5hbCBzbG90IGNoZWNrIGJlY2F1c2Ugd2Ugc2hvdWxkIGZpeCBpdCB3aXRob3V0IHJlcGxhY2VtZW50IG5hdGl2ZSBQcm9taXNlIGNvcmVcbiAgICBpZih4IGluc3RhbmNlb2YgJFByb21pc2UgJiYgc2FtZUNvbnN0cnVjdG9yKHguY29uc3RydWN0b3IsIHRoaXMpKXJldHVybiB4O1xuICAgIHZhciBjYXBhYmlsaXR5ID0gbmV3UHJvbWlzZUNhcGFiaWxpdHkodGhpcylcbiAgICAgICwgJCRyZXNvbHZlICA9IGNhcGFiaWxpdHkucmVzb2x2ZTtcbiAgICAkJHJlc29sdmUoeCk7XG4gICAgcmV0dXJuIGNhcGFiaWxpdHkucHJvbWlzZTtcbiAgfVxufSk7XG4kZXhwb3J0KCRleHBvcnQuUyArICRleHBvcnQuRiAqICEoVVNFX05BVElWRSAmJiByZXF1aXJlKCcuL19pdGVyLWRldGVjdCcpKGZ1bmN0aW9uKGl0ZXIpe1xuICAkUHJvbWlzZS5hbGwoaXRlcilbJ2NhdGNoJ10oZW1wdHkpO1xufSkpLCBQUk9NSVNFLCB7XG4gIC8vIDI1LjQuNC4xIFByb21pc2UuYWxsKGl0ZXJhYmxlKVxuICBhbGw6IGZ1bmN0aW9uIGFsbChpdGVyYWJsZSl7XG4gICAgdmFyIEMgICAgICAgICAgPSB0aGlzXG4gICAgICAsIGNhcGFiaWxpdHkgPSBuZXdQcm9taXNlQ2FwYWJpbGl0eShDKVxuICAgICAgLCByZXNvbHZlICAgID0gY2FwYWJpbGl0eS5yZXNvbHZlXG4gICAgICAsIHJlamVjdCAgICAgPSBjYXBhYmlsaXR5LnJlamVjdDtcbiAgICB2YXIgYWJydXB0ID0gcGVyZm9ybShmdW5jdGlvbigpe1xuICAgICAgdmFyIHZhbHVlcyAgICA9IFtdXG4gICAgICAgICwgaW5kZXggICAgID0gMFxuICAgICAgICAsIHJlbWFpbmluZyA9IDE7XG4gICAgICBmb3JPZihpdGVyYWJsZSwgZmFsc2UsIGZ1bmN0aW9uKHByb21pc2Upe1xuICAgICAgICB2YXIgJGluZGV4ICAgICAgICA9IGluZGV4KytcbiAgICAgICAgICAsIGFscmVhZHlDYWxsZWQgPSBmYWxzZTtcbiAgICAgICAgdmFsdWVzLnB1c2godW5kZWZpbmVkKTtcbiAgICAgICAgcmVtYWluaW5nKys7XG4gICAgICAgIEMucmVzb2x2ZShwcm9taXNlKS50aGVuKGZ1bmN0aW9uKHZhbHVlKXtcbiAgICAgICAgICBpZihhbHJlYWR5Q2FsbGVkKXJldHVybjtcbiAgICAgICAgICBhbHJlYWR5Q2FsbGVkICA9IHRydWU7XG4gICAgICAgICAgdmFsdWVzWyRpbmRleF0gPSB2YWx1ZTtcbiAgICAgICAgICAtLXJlbWFpbmluZyB8fCByZXNvbHZlKHZhbHVlcyk7XG4gICAgICAgIH0sIHJlamVjdCk7XG4gICAgICB9KTtcbiAgICAgIC0tcmVtYWluaW5nIHx8IHJlc29sdmUodmFsdWVzKTtcbiAgICB9KTtcbiAgICBpZihhYnJ1cHQpcmVqZWN0KGFicnVwdC5lcnJvcik7XG4gICAgcmV0dXJuIGNhcGFiaWxpdHkucHJvbWlzZTtcbiAgfSxcbiAgLy8gMjUuNC40LjQgUHJvbWlzZS5yYWNlKGl0ZXJhYmxlKVxuICByYWNlOiBmdW5jdGlvbiByYWNlKGl0ZXJhYmxlKXtcbiAgICB2YXIgQyAgICAgICAgICA9IHRoaXNcbiAgICAgICwgY2FwYWJpbGl0eSA9IG5ld1Byb21pc2VDYXBhYmlsaXR5KEMpXG4gICAgICAsIHJlamVjdCAgICAgPSBjYXBhYmlsaXR5LnJlamVjdDtcbiAgICB2YXIgYWJydXB0ID0gcGVyZm9ybShmdW5jdGlvbigpe1xuICAgICAgZm9yT2YoaXRlcmFibGUsIGZhbHNlLCBmdW5jdGlvbihwcm9taXNlKXtcbiAgICAgICAgQy5yZXNvbHZlKHByb21pc2UpLnRoZW4oY2FwYWJpbGl0eS5yZXNvbHZlLCByZWplY3QpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gICAgaWYoYWJydXB0KXJlamVjdChhYnJ1cHQuZXJyb3IpO1xuICAgIHJldHVybiBjYXBhYmlsaXR5LnByb21pc2U7XG4gIH1cbn0pOyIsIid1c2Ugc3RyaWN0JztcbnZhciAkYXQgID0gcmVxdWlyZSgnLi9fc3RyaW5nLWF0JykodHJ1ZSk7XG5cbi8vIDIxLjEuMy4yNyBTdHJpbmcucHJvdG90eXBlW0BAaXRlcmF0b3JdKClcbnJlcXVpcmUoJy4vX2l0ZXItZGVmaW5lJykoU3RyaW5nLCAnU3RyaW5nJywgZnVuY3Rpb24oaXRlcmF0ZWQpe1xuICB0aGlzLl90ID0gU3RyaW5nKGl0ZXJhdGVkKTsgLy8gdGFyZ2V0XG4gIHRoaXMuX2kgPSAwOyAgICAgICAgICAgICAgICAvLyBuZXh0IGluZGV4XG4vLyAyMS4xLjUuMi4xICVTdHJpbmdJdGVyYXRvclByb3RvdHlwZSUubmV4dCgpXG59LCBmdW5jdGlvbigpe1xuICB2YXIgTyAgICAgPSB0aGlzLl90XG4gICAgLCBpbmRleCA9IHRoaXMuX2lcbiAgICAsIHBvaW50O1xuICBpZihpbmRleCA+PSBPLmxlbmd0aClyZXR1cm4ge3ZhbHVlOiB1bmRlZmluZWQsIGRvbmU6IHRydWV9O1xuICBwb2ludCA9ICRhdChPLCBpbmRleCk7XG4gIHRoaXMuX2kgKz0gcG9pbnQubGVuZ3RoO1xuICByZXR1cm4ge3ZhbHVlOiBwb2ludCwgZG9uZTogZmFsc2V9O1xufSk7IiwidmFyICRpdGVyYXRvcnMgICAgPSByZXF1aXJlKCcuL2VzNi5hcnJheS5pdGVyYXRvcicpXG4gICwgcmVkZWZpbmUgICAgICA9IHJlcXVpcmUoJy4vX3JlZGVmaW5lJylcbiAgLCBnbG9iYWwgICAgICAgID0gcmVxdWlyZSgnLi9fZ2xvYmFsJylcbiAgLCBoaWRlICAgICAgICAgID0gcmVxdWlyZSgnLi9faGlkZScpXG4gICwgSXRlcmF0b3JzICAgICA9IHJlcXVpcmUoJy4vX2l0ZXJhdG9ycycpXG4gICwgd2tzICAgICAgICAgICA9IHJlcXVpcmUoJy4vX3drcycpXG4gICwgSVRFUkFUT1IgICAgICA9IHdrcygnaXRlcmF0b3InKVxuICAsIFRPX1NUUklOR19UQUcgPSB3a3MoJ3RvU3RyaW5nVGFnJylcbiAgLCBBcnJheVZhbHVlcyAgID0gSXRlcmF0b3JzLkFycmF5O1xuXG5mb3IodmFyIGNvbGxlY3Rpb25zID0gWydOb2RlTGlzdCcsICdET01Ub2tlbkxpc3QnLCAnTWVkaWFMaXN0JywgJ1N0eWxlU2hlZXRMaXN0JywgJ0NTU1J1bGVMaXN0J10sIGkgPSAwOyBpIDwgNTsgaSsrKXtcbiAgdmFyIE5BTUUgICAgICAgPSBjb2xsZWN0aW9uc1tpXVxuICAgICwgQ29sbGVjdGlvbiA9IGdsb2JhbFtOQU1FXVxuICAgICwgcHJvdG8gICAgICA9IENvbGxlY3Rpb24gJiYgQ29sbGVjdGlvbi5wcm90b3R5cGVcbiAgICAsIGtleTtcbiAgaWYocHJvdG8pe1xuICAgIGlmKCFwcm90b1tJVEVSQVRPUl0paGlkZShwcm90bywgSVRFUkFUT1IsIEFycmF5VmFsdWVzKTtcbiAgICBpZighcHJvdG9bVE9fU1RSSU5HX1RBR10paGlkZShwcm90bywgVE9fU1RSSU5HX1RBRywgTkFNRSk7XG4gICAgSXRlcmF0b3JzW05BTUVdID0gQXJyYXlWYWx1ZXM7XG4gICAgZm9yKGtleSBpbiAkaXRlcmF0b3JzKWlmKCFwcm90b1trZXldKXJlZGVmaW5lKHByb3RvLCBrZXksICRpdGVyYXRvcnNba2V5XSwgdHJ1ZSk7XG4gIH1cbn0iLCIvLyBDb3B5cmlnaHQgSm95ZW50LCBJbmMuIGFuZCBvdGhlciBOb2RlIGNvbnRyaWJ1dG9ycy5cbi8vXG4vLyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYVxuLy8gY29weSBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZVxuLy8gXCJTb2Z0d2FyZVwiKSwgdG8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nXG4vLyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsXG4vLyBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0XG4vLyBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGVcbi8vIGZvbGxvd2luZyBjb25kaXRpb25zOlxuLy9cbi8vIFRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlIGFuZCB0aGlzIHBlcm1pc3Npb24gbm90aWNlIHNoYWxsIGJlIGluY2x1ZGVkXG4vLyBpbiBhbGwgY29waWVzIG9yIHN1YnN0YW50aWFsIHBvcnRpb25zIG9mIHRoZSBTb2Z0d2FyZS5cbi8vXG4vLyBUSEUgU09GVFdBUkUgSVMgUFJPVklERUQgXCJBUyBJU1wiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTXG4vLyBPUiBJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GXG4vLyBNRVJDSEFOVEFCSUxJVFksIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOXG4vLyBOTyBFVkVOVCBTSEFMTCBUSEUgQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSxcbi8vIERBTUFHRVMgT1IgT1RIRVIgTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUlxuLy8gT1RIRVJXSVNFLCBBUklTSU5HIEZST00sIE9VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRVxuLy8gVVNFIE9SIE9USEVSIERFQUxJTkdTIElOIFRIRSBTT0ZUV0FSRS5cblxuLy8gTk9URTogVGhlc2UgdHlwZSBjaGVja2luZyBmdW5jdGlvbnMgaW50ZW50aW9uYWxseSBkb24ndCB1c2UgYGluc3RhbmNlb2ZgXG4vLyBiZWNhdXNlIGl0IGlzIGZyYWdpbGUgYW5kIGNhbiBiZSBlYXNpbHkgZmFrZWQgd2l0aCBgT2JqZWN0LmNyZWF0ZSgpYC5cblxuZnVuY3Rpb24gaXNBcnJheShhcmcpIHtcbiAgaWYgKEFycmF5LmlzQXJyYXkpIHtcbiAgICByZXR1cm4gQXJyYXkuaXNBcnJheShhcmcpO1xuICB9XG4gIHJldHVybiBvYmplY3RUb1N0cmluZyhhcmcpID09PSAnW29iamVjdCBBcnJheV0nO1xufVxuZXhwb3J0cy5pc0FycmF5ID0gaXNBcnJheTtcblxuZnVuY3Rpb24gaXNCb29sZWFuKGFyZykge1xuICByZXR1cm4gdHlwZW9mIGFyZyA9PT0gJ2Jvb2xlYW4nO1xufVxuZXhwb3J0cy5pc0Jvb2xlYW4gPSBpc0Jvb2xlYW47XG5cbmZ1bmN0aW9uIGlzTnVsbChhcmcpIHtcbiAgcmV0dXJuIGFyZyA9PT0gbnVsbDtcbn1cbmV4cG9ydHMuaXNOdWxsID0gaXNOdWxsO1xuXG5mdW5jdGlvbiBpc051bGxPclVuZGVmaW5lZChhcmcpIHtcbiAgcmV0dXJuIGFyZyA9PSBudWxsO1xufVxuZXhwb3J0cy5pc051bGxPclVuZGVmaW5lZCA9IGlzTnVsbE9yVW5kZWZpbmVkO1xuXG5mdW5jdGlvbiBpc051bWJlcihhcmcpIHtcbiAgcmV0dXJuIHR5cGVvZiBhcmcgPT09ICdudW1iZXInO1xufVxuZXhwb3J0cy5pc051bWJlciA9IGlzTnVtYmVyO1xuXG5mdW5jdGlvbiBpc1N0cmluZyhhcmcpIHtcbiAgcmV0dXJuIHR5cGVvZiBhcmcgPT09ICdzdHJpbmcnO1xufVxuZXhwb3J0cy5pc1N0cmluZyA9IGlzU3RyaW5nO1xuXG5mdW5jdGlvbiBpc1N5bWJvbChhcmcpIHtcbiAgcmV0dXJuIHR5cGVvZiBhcmcgPT09ICdzeW1ib2wnO1xufVxuZXhwb3J0cy5pc1N5bWJvbCA9IGlzU3ltYm9sO1xuXG5mdW5jdGlvbiBpc1VuZGVmaW5lZChhcmcpIHtcbiAgcmV0dXJuIGFyZyA9PT0gdm9pZCAwO1xufVxuZXhwb3J0cy5pc1VuZGVmaW5lZCA9IGlzVW5kZWZpbmVkO1xuXG5mdW5jdGlvbiBpc1JlZ0V4cChyZSkge1xuICByZXR1cm4gb2JqZWN0VG9TdHJpbmcocmUpID09PSAnW29iamVjdCBSZWdFeHBdJztcbn1cbmV4cG9ydHMuaXNSZWdFeHAgPSBpc1JlZ0V4cDtcblxuZnVuY3Rpb24gaXNPYmplY3QoYXJnKSB7XG4gIHJldHVybiB0eXBlb2YgYXJnID09PSAnb2JqZWN0JyAmJiBhcmcgIT09IG51bGw7XG59XG5leHBvcnRzLmlzT2JqZWN0ID0gaXNPYmplY3Q7XG5cbmZ1bmN0aW9uIGlzRGF0ZShkKSB7XG4gIHJldHVybiBvYmplY3RUb1N0cmluZyhkKSA9PT0gJ1tvYmplY3QgRGF0ZV0nO1xufVxuZXhwb3J0cy5pc0RhdGUgPSBpc0RhdGU7XG5cbmZ1bmN0aW9uIGlzRXJyb3IoZSkge1xuICByZXR1cm4gKG9iamVjdFRvU3RyaW5nKGUpID09PSAnW29iamVjdCBFcnJvcl0nIHx8IGUgaW5zdGFuY2VvZiBFcnJvcik7XG59XG5leHBvcnRzLmlzRXJyb3IgPSBpc0Vycm9yO1xuXG5mdW5jdGlvbiBpc0Z1bmN0aW9uKGFyZykge1xuICByZXR1cm4gdHlwZW9mIGFyZyA9PT0gJ2Z1bmN0aW9uJztcbn1cbmV4cG9ydHMuaXNGdW5jdGlvbiA9IGlzRnVuY3Rpb247XG5cbmZ1bmN0aW9uIGlzUHJpbWl0aXZlKGFyZykge1xuICByZXR1cm4gYXJnID09PSBudWxsIHx8XG4gICAgICAgICB0eXBlb2YgYXJnID09PSAnYm9vbGVhbicgfHxcbiAgICAgICAgIHR5cGVvZiBhcmcgPT09ICdudW1iZXInIHx8XG4gICAgICAgICB0eXBlb2YgYXJnID09PSAnc3RyaW5nJyB8fFxuICAgICAgICAgdHlwZW9mIGFyZyA9PT0gJ3N5bWJvbCcgfHwgIC8vIEVTNiBzeW1ib2xcbiAgICAgICAgIHR5cGVvZiBhcmcgPT09ICd1bmRlZmluZWQnO1xufVxuZXhwb3J0cy5pc1ByaW1pdGl2ZSA9IGlzUHJpbWl0aXZlO1xuXG5leHBvcnRzLmlzQnVmZmVyID0gQnVmZmVyLmlzQnVmZmVyO1xuXG5mdW5jdGlvbiBvYmplY3RUb1N0cmluZyhvKSB7XG4gIHJldHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwobyk7XG59XG4iLCIvLyAoYykgRGVhbiBNY05hbWVlIDxkZWFuQGdtYWlsLmNvbT4sIDIwMTIuXG4vL1xuLy8gaHR0cHM6Ly9naXRodWIuY29tL2RlYW5tL2Nzcy1jb2xvci1wYXJzZXItanNcbi8vXG4vLyBQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5XG4vLyBvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSBcIlNvZnR3YXJlXCIpLCB0b1xuLy8gZGVhbCBpbiB0aGUgU29mdHdhcmUgd2l0aG91dCByZXN0cmljdGlvbiwgaW5jbHVkaW5nIHdpdGhvdXQgbGltaXRhdGlvbiB0aGVcbi8vIHJpZ2h0cyB0byB1c2UsIGNvcHksIG1vZGlmeSwgbWVyZ2UsIHB1Ymxpc2gsIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vclxuLy8gc2VsbCBjb3BpZXMgb2YgdGhlIFNvZnR3YXJlLCBhbmQgdG8gcGVybWl0IHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXNcbi8vIGZ1cm5pc2hlZCB0byBkbyBzbywgc3ViamVjdCB0byB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4vL1xuLy8gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWQgaW5cbi8vIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuLy9cbi8vIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1Jcbi8vIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLFxuLy8gRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFXG4vLyBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSXG4vLyBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lOR1xuLy8gRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HU1xuLy8gSU4gVEhFIFNPRlRXQVJFLlxuXG4vLyBodHRwOi8vd3d3LnczLm9yZy9UUi9jc3MzLWNvbG9yL1xudmFyIGtDU1NDb2xvclRhYmxlID0ge1xuICBcInRyYW5zcGFyZW50XCI6IFswLDAsMCwwXSwgXCJhbGljZWJsdWVcIjogWzI0MCwyNDgsMjU1LDFdLFxuICBcImFudGlxdWV3aGl0ZVwiOiBbMjUwLDIzNSwyMTUsMV0sIFwiYXF1YVwiOiBbMCwyNTUsMjU1LDFdLFxuICBcImFxdWFtYXJpbmVcIjogWzEyNywyNTUsMjEyLDFdLCBcImF6dXJlXCI6IFsyNDAsMjU1LDI1NSwxXSxcbiAgXCJiZWlnZVwiOiBbMjQ1LDI0NSwyMjAsMV0sIFwiYmlzcXVlXCI6IFsyNTUsMjI4LDE5NiwxXSxcbiAgXCJibGFja1wiOiBbMCwwLDAsMV0sIFwiYmxhbmNoZWRhbG1vbmRcIjogWzI1NSwyMzUsMjA1LDFdLFxuICBcImJsdWVcIjogWzAsMCwyNTUsMV0sIFwiYmx1ZXZpb2xldFwiOiBbMTM4LDQzLDIyNiwxXSxcbiAgXCJicm93blwiOiBbMTY1LDQyLDQyLDFdLCBcImJ1cmx5d29vZFwiOiBbMjIyLDE4NCwxMzUsMV0sXG4gIFwiY2FkZXRibHVlXCI6IFs5NSwxNTgsMTYwLDFdLCBcImNoYXJ0cmV1c2VcIjogWzEyNywyNTUsMCwxXSxcbiAgXCJjaG9jb2xhdGVcIjogWzIxMCwxMDUsMzAsMV0sIFwiY29yYWxcIjogWzI1NSwxMjcsODAsMV0sXG4gIFwiY29ybmZsb3dlcmJsdWVcIjogWzEwMCwxNDksMjM3LDFdLCBcImNvcm5zaWxrXCI6IFsyNTUsMjQ4LDIyMCwxXSxcbiAgXCJjcmltc29uXCI6IFsyMjAsMjAsNjAsMV0sIFwiY3lhblwiOiBbMCwyNTUsMjU1LDFdLFxuICBcImRhcmtibHVlXCI6IFswLDAsMTM5LDFdLCBcImRhcmtjeWFuXCI6IFswLDEzOSwxMzksMV0sXG4gIFwiZGFya2dvbGRlbnJvZFwiOiBbMTg0LDEzNCwxMSwxXSwgXCJkYXJrZ3JheVwiOiBbMTY5LDE2OSwxNjksMV0sXG4gIFwiZGFya2dyZWVuXCI6IFswLDEwMCwwLDFdLCBcImRhcmtncmV5XCI6IFsxNjksMTY5LDE2OSwxXSxcbiAgXCJkYXJra2hha2lcIjogWzE4OSwxODMsMTA3LDFdLCBcImRhcmttYWdlbnRhXCI6IFsxMzksMCwxMzksMV0sXG4gIFwiZGFya29saXZlZ3JlZW5cIjogWzg1LDEwNyw0NywxXSwgXCJkYXJrb3JhbmdlXCI6IFsyNTUsMTQwLDAsMV0sXG4gIFwiZGFya29yY2hpZFwiOiBbMTUzLDUwLDIwNCwxXSwgXCJkYXJrcmVkXCI6IFsxMzksMCwwLDFdLFxuICBcImRhcmtzYWxtb25cIjogWzIzMywxNTAsMTIyLDFdLCBcImRhcmtzZWFncmVlblwiOiBbMTQzLDE4OCwxNDMsMV0sXG4gIFwiZGFya3NsYXRlYmx1ZVwiOiBbNzIsNjEsMTM5LDFdLCBcImRhcmtzbGF0ZWdyYXlcIjogWzQ3LDc5LDc5LDFdLFxuICBcImRhcmtzbGF0ZWdyZXlcIjogWzQ3LDc5LDc5LDFdLCBcImRhcmt0dXJxdW9pc2VcIjogWzAsMjA2LDIwOSwxXSxcbiAgXCJkYXJrdmlvbGV0XCI6IFsxNDgsMCwyMTEsMV0sIFwiZGVlcHBpbmtcIjogWzI1NSwyMCwxNDcsMV0sXG4gIFwiZGVlcHNreWJsdWVcIjogWzAsMTkxLDI1NSwxXSwgXCJkaW1ncmF5XCI6IFsxMDUsMTA1LDEwNSwxXSxcbiAgXCJkaW1ncmV5XCI6IFsxMDUsMTA1LDEwNSwxXSwgXCJkb2RnZXJibHVlXCI6IFszMCwxNDQsMjU1LDFdLFxuICBcImZpcmVicmlja1wiOiBbMTc4LDM0LDM0LDFdLCBcImZsb3JhbHdoaXRlXCI6IFsyNTUsMjUwLDI0MCwxXSxcbiAgXCJmb3Jlc3RncmVlblwiOiBbMzQsMTM5LDM0LDFdLCBcImZ1Y2hzaWFcIjogWzI1NSwwLDI1NSwxXSxcbiAgXCJnYWluc2Jvcm9cIjogWzIyMCwyMjAsMjIwLDFdLCBcImdob3N0d2hpdGVcIjogWzI0OCwyNDgsMjU1LDFdLFxuICBcImdvbGRcIjogWzI1NSwyMTUsMCwxXSwgXCJnb2xkZW5yb2RcIjogWzIxOCwxNjUsMzIsMV0sXG4gIFwiZ3JheVwiOiBbMTI4LDEyOCwxMjgsMV0sIFwiZ3JlZW5cIjogWzAsMTI4LDAsMV0sXG4gIFwiZ3JlZW55ZWxsb3dcIjogWzE3MywyNTUsNDcsMV0sIFwiZ3JleVwiOiBbMTI4LDEyOCwxMjgsMV0sXG4gIFwiaG9uZXlkZXdcIjogWzI0MCwyNTUsMjQwLDFdLCBcImhvdHBpbmtcIjogWzI1NSwxMDUsMTgwLDFdLFxuICBcImluZGlhbnJlZFwiOiBbMjA1LDkyLDkyLDFdLCBcImluZGlnb1wiOiBbNzUsMCwxMzAsMV0sXG4gIFwiaXZvcnlcIjogWzI1NSwyNTUsMjQwLDFdLCBcImtoYWtpXCI6IFsyNDAsMjMwLDE0MCwxXSxcbiAgXCJsYXZlbmRlclwiOiBbMjMwLDIzMCwyNTAsMV0sIFwibGF2ZW5kZXJibHVzaFwiOiBbMjU1LDI0MCwyNDUsMV0sXG4gIFwibGF3bmdyZWVuXCI6IFsxMjQsMjUyLDAsMV0sIFwibGVtb25jaGlmZm9uXCI6IFsyNTUsMjUwLDIwNSwxXSxcbiAgXCJsaWdodGJsdWVcIjogWzE3MywyMTYsMjMwLDFdLCBcImxpZ2h0Y29yYWxcIjogWzI0MCwxMjgsMTI4LDFdLFxuICBcImxpZ2h0Y3lhblwiOiBbMjI0LDI1NSwyNTUsMV0sIFwibGlnaHRnb2xkZW5yb2R5ZWxsb3dcIjogWzI1MCwyNTAsMjEwLDFdLFxuICBcImxpZ2h0Z3JheVwiOiBbMjExLDIxMSwyMTEsMV0sIFwibGlnaHRncmVlblwiOiBbMTQ0LDIzOCwxNDQsMV0sXG4gIFwibGlnaHRncmV5XCI6IFsyMTEsMjExLDIxMSwxXSwgXCJsaWdodHBpbmtcIjogWzI1NSwxODIsMTkzLDFdLFxuICBcImxpZ2h0c2FsbW9uXCI6IFsyNTUsMTYwLDEyMiwxXSwgXCJsaWdodHNlYWdyZWVuXCI6IFszMiwxNzgsMTcwLDFdLFxuICBcImxpZ2h0c2t5Ymx1ZVwiOiBbMTM1LDIwNiwyNTAsMV0sIFwibGlnaHRzbGF0ZWdyYXlcIjogWzExOSwxMzYsMTUzLDFdLFxuICBcImxpZ2h0c2xhdGVncmV5XCI6IFsxMTksMTM2LDE1MywxXSwgXCJsaWdodHN0ZWVsYmx1ZVwiOiBbMTc2LDE5NiwyMjIsMV0sXG4gIFwibGlnaHR5ZWxsb3dcIjogWzI1NSwyNTUsMjI0LDFdLCBcImxpbWVcIjogWzAsMjU1LDAsMV0sXG4gIFwibGltZWdyZWVuXCI6IFs1MCwyMDUsNTAsMV0sIFwibGluZW5cIjogWzI1MCwyNDAsMjMwLDFdLFxuICBcIm1hZ2VudGFcIjogWzI1NSwwLDI1NSwxXSwgXCJtYXJvb25cIjogWzEyOCwwLDAsMV0sXG4gIFwibWVkaXVtYXF1YW1hcmluZVwiOiBbMTAyLDIwNSwxNzAsMV0sIFwibWVkaXVtYmx1ZVwiOiBbMCwwLDIwNSwxXSxcbiAgXCJtZWRpdW1vcmNoaWRcIjogWzE4Niw4NSwyMTEsMV0sIFwibWVkaXVtcHVycGxlXCI6IFsxNDcsMTEyLDIxOSwxXSxcbiAgXCJtZWRpdW1zZWFncmVlblwiOiBbNjAsMTc5LDExMywxXSwgXCJtZWRpdW1zbGF0ZWJsdWVcIjogWzEyMywxMDQsMjM4LDFdLFxuICBcIm1lZGl1bXNwcmluZ2dyZWVuXCI6IFswLDI1MCwxNTQsMV0sIFwibWVkaXVtdHVycXVvaXNlXCI6IFs3MiwyMDksMjA0LDFdLFxuICBcIm1lZGl1bXZpb2xldHJlZFwiOiBbMTk5LDIxLDEzMywxXSwgXCJtaWRuaWdodGJsdWVcIjogWzI1LDI1LDExMiwxXSxcbiAgXCJtaW50Y3JlYW1cIjogWzI0NSwyNTUsMjUwLDFdLCBcIm1pc3R5cm9zZVwiOiBbMjU1LDIyOCwyMjUsMV0sXG4gIFwibW9jY2FzaW5cIjogWzI1NSwyMjgsMTgxLDFdLCBcIm5hdmFqb3doaXRlXCI6IFsyNTUsMjIyLDE3MywxXSxcbiAgXCJuYXZ5XCI6IFswLDAsMTI4LDFdLCBcIm9sZGxhY2VcIjogWzI1MywyNDUsMjMwLDFdLFxuICBcIm9saXZlXCI6IFsxMjgsMTI4LDAsMV0sIFwib2xpdmVkcmFiXCI6IFsxMDcsMTQyLDM1LDFdLFxuICBcIm9yYW5nZVwiOiBbMjU1LDE2NSwwLDFdLCBcIm9yYW5nZXJlZFwiOiBbMjU1LDY5LDAsMV0sXG4gIFwib3JjaGlkXCI6IFsyMTgsMTEyLDIxNCwxXSwgXCJwYWxlZ29sZGVucm9kXCI6IFsyMzgsMjMyLDE3MCwxXSxcbiAgXCJwYWxlZ3JlZW5cIjogWzE1MiwyNTEsMTUyLDFdLCBcInBhbGV0dXJxdW9pc2VcIjogWzE3NSwyMzgsMjM4LDFdLFxuICBcInBhbGV2aW9sZXRyZWRcIjogWzIxOSwxMTIsMTQ3LDFdLCBcInBhcGF5YXdoaXBcIjogWzI1NSwyMzksMjEzLDFdLFxuICBcInBlYWNocHVmZlwiOiBbMjU1LDIxOCwxODUsMV0sIFwicGVydVwiOiBbMjA1LDEzMyw2MywxXSxcbiAgXCJwaW5rXCI6IFsyNTUsMTkyLDIwMywxXSwgXCJwbHVtXCI6IFsyMjEsMTYwLDIyMSwxXSxcbiAgXCJwb3dkZXJibHVlXCI6IFsxNzYsMjI0LDIzMCwxXSwgXCJwdXJwbGVcIjogWzEyOCwwLDEyOCwxXSxcbiAgXCJyZWJlY2NhcHVycGxlXCI6IFsxMDIsNTEsMTUzLDFdLFxuICBcInJlZFwiOiBbMjU1LDAsMCwxXSwgXCJyb3N5YnJvd25cIjogWzE4OCwxNDMsMTQzLDFdLFxuICBcInJveWFsYmx1ZVwiOiBbNjUsMTA1LDIyNSwxXSwgXCJzYWRkbGVicm93blwiOiBbMTM5LDY5LDE5LDFdLFxuICBcInNhbG1vblwiOiBbMjUwLDEyOCwxMTQsMV0sIFwic2FuZHlicm93blwiOiBbMjQ0LDE2NCw5NiwxXSxcbiAgXCJzZWFncmVlblwiOiBbNDYsMTM5LDg3LDFdLCBcInNlYXNoZWxsXCI6IFsyNTUsMjQ1LDIzOCwxXSxcbiAgXCJzaWVubmFcIjogWzE2MCw4Miw0NSwxXSwgXCJzaWx2ZXJcIjogWzE5MiwxOTIsMTkyLDFdLFxuICBcInNreWJsdWVcIjogWzEzNSwyMDYsMjM1LDFdLCBcInNsYXRlYmx1ZVwiOiBbMTA2LDkwLDIwNSwxXSxcbiAgXCJzbGF0ZWdyYXlcIjogWzExMiwxMjgsMTQ0LDFdLCBcInNsYXRlZ3JleVwiOiBbMTEyLDEyOCwxNDQsMV0sXG4gIFwic25vd1wiOiBbMjU1LDI1MCwyNTAsMV0sIFwic3ByaW5nZ3JlZW5cIjogWzAsMjU1LDEyNywxXSxcbiAgXCJzdGVlbGJsdWVcIjogWzcwLDEzMCwxODAsMV0sIFwidGFuXCI6IFsyMTAsMTgwLDE0MCwxXSxcbiAgXCJ0ZWFsXCI6IFswLDEyOCwxMjgsMV0sIFwidGhpc3RsZVwiOiBbMjE2LDE5MSwyMTYsMV0sXG4gIFwidG9tYXRvXCI6IFsyNTUsOTksNzEsMV0sIFwidHVycXVvaXNlXCI6IFs2NCwyMjQsMjA4LDFdLFxuICBcInZpb2xldFwiOiBbMjM4LDEzMCwyMzgsMV0sIFwid2hlYXRcIjogWzI0NSwyMjIsMTc5LDFdLFxuICBcIndoaXRlXCI6IFsyNTUsMjU1LDI1NSwxXSwgXCJ3aGl0ZXNtb2tlXCI6IFsyNDUsMjQ1LDI0NSwxXSxcbiAgXCJ5ZWxsb3dcIjogWzI1NSwyNTUsMCwxXSwgXCJ5ZWxsb3dncmVlblwiOiBbMTU0LDIwNSw1MCwxXX1cblxuZnVuY3Rpb24gY2xhbXBfY3NzX2J5dGUoaSkgeyAgLy8gQ2xhbXAgdG8gaW50ZWdlciAwIC4uIDI1NS5cbiAgaSA9IE1hdGgucm91bmQoaSk7ICAvLyBTZWVtcyB0byBiZSB3aGF0IENocm9tZSBkb2VzICh2cyB0cnVuY2F0aW9uKS5cbiAgcmV0dXJuIGkgPCAwID8gMCA6IGkgPiAyNTUgPyAyNTUgOiBpO1xufVxuXG5mdW5jdGlvbiBjbGFtcF9jc3NfZmxvYXQoZikgeyAgLy8gQ2xhbXAgdG8gZmxvYXQgMC4wIC4uIDEuMC5cbiAgcmV0dXJuIGYgPCAwID8gMCA6IGYgPiAxID8gMSA6IGY7XG59XG5cbmZ1bmN0aW9uIHBhcnNlX2Nzc19pbnQoc3RyKSB7ICAvLyBpbnQgb3IgcGVyY2VudGFnZS5cbiAgaWYgKHN0cltzdHIubGVuZ3RoIC0gMV0gPT09ICclJylcbiAgICByZXR1cm4gY2xhbXBfY3NzX2J5dGUocGFyc2VGbG9hdChzdHIpIC8gMTAwICogMjU1KTtcbiAgcmV0dXJuIGNsYW1wX2Nzc19ieXRlKHBhcnNlSW50KHN0cikpO1xufVxuXG5mdW5jdGlvbiBwYXJzZV9jc3NfZmxvYXQoc3RyKSB7ICAvLyBmbG9hdCBvciBwZXJjZW50YWdlLlxuICBpZiAoc3RyW3N0ci5sZW5ndGggLSAxXSA9PT0gJyUnKVxuICAgIHJldHVybiBjbGFtcF9jc3NfZmxvYXQocGFyc2VGbG9hdChzdHIpIC8gMTAwKTtcbiAgcmV0dXJuIGNsYW1wX2Nzc19mbG9hdChwYXJzZUZsb2F0KHN0cikpO1xufVxuXG5mdW5jdGlvbiBjc3NfaHVlX3RvX3JnYihtMSwgbTIsIGgpIHtcbiAgaWYgKGggPCAwKSBoICs9IDE7XG4gIGVsc2UgaWYgKGggPiAxKSBoIC09IDE7XG5cbiAgaWYgKGggKiA2IDwgMSkgcmV0dXJuIG0xICsgKG0yIC0gbTEpICogaCAqIDY7XG4gIGlmIChoICogMiA8IDEpIHJldHVybiBtMjtcbiAgaWYgKGggKiAzIDwgMikgcmV0dXJuIG0xICsgKG0yIC0gbTEpICogKDIvMyAtIGgpICogNjtcbiAgcmV0dXJuIG0xO1xufVxuXG5mdW5jdGlvbiBwYXJzZUNTU0NvbG9yKGNzc19zdHIpIHtcbiAgLy8gUmVtb3ZlIGFsbCB3aGl0ZXNwYWNlLCBub3QgY29tcGxpYW50LCBidXQgc2hvdWxkIGp1c3QgYmUgbW9yZSBhY2NlcHRpbmcuXG4gIHZhciBzdHIgPSBjc3Nfc3RyLnJlcGxhY2UoLyAvZywgJycpLnRvTG93ZXJDYXNlKCk7XG5cbiAgLy8gQ29sb3Iga2V5d29yZHMgKGFuZCB0cmFuc3BhcmVudCkgbG9va3VwLlxuICBpZiAoc3RyIGluIGtDU1NDb2xvclRhYmxlKSByZXR1cm4ga0NTU0NvbG9yVGFibGVbc3RyXS5zbGljZSgpOyAgLy8gZHVwLlxuXG4gIC8vICNhYmMgYW5kICNhYmMxMjMgc3ludGF4LlxuICBpZiAoc3RyWzBdID09PSAnIycpIHtcbiAgICBpZiAoc3RyLmxlbmd0aCA9PT0gNCkge1xuICAgICAgdmFyIGl2ID0gcGFyc2VJbnQoc3RyLnN1YnN0cigxKSwgMTYpOyAgLy8gVE9ETyhkZWFubSk6IFN0cmljdGVyIHBhcnNpbmcuXG4gICAgICBpZiAoIShpdiA+PSAwICYmIGl2IDw9IDB4ZmZmKSkgcmV0dXJuIG51bGw7ICAvLyBDb3ZlcnMgTmFOLlxuICAgICAgcmV0dXJuIFsoKGl2ICYgMHhmMDApID4+IDQpIHwgKChpdiAmIDB4ZjAwKSA+PiA4KSxcbiAgICAgICAgICAgICAgKGl2ICYgMHhmMCkgfCAoKGl2ICYgMHhmMCkgPj4gNCksXG4gICAgICAgICAgICAgIChpdiAmIDB4ZikgfCAoKGl2ICYgMHhmKSA8PCA0KSxcbiAgICAgICAgICAgICAgMV07XG4gICAgfSBlbHNlIGlmIChzdHIubGVuZ3RoID09PSA3KSB7XG4gICAgICB2YXIgaXYgPSBwYXJzZUludChzdHIuc3Vic3RyKDEpLCAxNik7ICAvLyBUT0RPKGRlYW5tKTogU3RyaWN0ZXIgcGFyc2luZy5cbiAgICAgIGlmICghKGl2ID49IDAgJiYgaXYgPD0gMHhmZmZmZmYpKSByZXR1cm4gbnVsbDsgIC8vIENvdmVycyBOYU4uXG4gICAgICByZXR1cm4gWyhpdiAmIDB4ZmYwMDAwKSA+PiAxNixcbiAgICAgICAgICAgICAgKGl2ICYgMHhmZjAwKSA+PiA4LFxuICAgICAgICAgICAgICBpdiAmIDB4ZmYsXG4gICAgICAgICAgICAgIDFdO1xuICAgIH1cblxuICAgIHJldHVybiBudWxsO1xuICB9XG5cbiAgdmFyIG9wID0gc3RyLmluZGV4T2YoJygnKSwgZXAgPSBzdHIuaW5kZXhPZignKScpO1xuICBpZiAob3AgIT09IC0xICYmIGVwICsgMSA9PT0gc3RyLmxlbmd0aCkge1xuICAgIHZhciBmbmFtZSA9IHN0ci5zdWJzdHIoMCwgb3ApO1xuICAgIHZhciBwYXJhbXMgPSBzdHIuc3Vic3RyKG9wKzEsIGVwLShvcCsxKSkuc3BsaXQoJywnKTtcbiAgICB2YXIgYWxwaGEgPSAxOyAgLy8gVG8gYWxsb3cgY2FzZSBmYWxsdGhyb3VnaC5cbiAgICBzd2l0Y2ggKGZuYW1lKSB7XG4gICAgICBjYXNlICdyZ2JhJzpcbiAgICAgICAgaWYgKHBhcmFtcy5sZW5ndGggIT09IDQpIHJldHVybiBudWxsO1xuICAgICAgICBhbHBoYSA9IHBhcnNlX2Nzc19mbG9hdChwYXJhbXMucG9wKCkpO1xuICAgICAgICAvLyBGYWxsIHRocm91Z2guXG4gICAgICBjYXNlICdyZ2InOlxuICAgICAgICBpZiAocGFyYW1zLmxlbmd0aCAhPT0gMykgcmV0dXJuIG51bGw7XG4gICAgICAgIHJldHVybiBbcGFyc2VfY3NzX2ludChwYXJhbXNbMF0pLFxuICAgICAgICAgICAgICAgIHBhcnNlX2Nzc19pbnQocGFyYW1zWzFdKSxcbiAgICAgICAgICAgICAgICBwYXJzZV9jc3NfaW50KHBhcmFtc1syXSksXG4gICAgICAgICAgICAgICAgYWxwaGFdO1xuICAgICAgY2FzZSAnaHNsYSc6XG4gICAgICAgIGlmIChwYXJhbXMubGVuZ3RoICE9PSA0KSByZXR1cm4gbnVsbDtcbiAgICAgICAgYWxwaGEgPSBwYXJzZV9jc3NfZmxvYXQocGFyYW1zLnBvcCgpKTtcbiAgICAgICAgLy8gRmFsbCB0aHJvdWdoLlxuICAgICAgY2FzZSAnaHNsJzpcbiAgICAgICAgaWYgKHBhcmFtcy5sZW5ndGggIT09IDMpIHJldHVybiBudWxsO1xuICAgICAgICB2YXIgaCA9ICgoKHBhcnNlRmxvYXQocGFyYW1zWzBdKSAlIDM2MCkgKyAzNjApICUgMzYwKSAvIDM2MDsgIC8vIDAgLi4gMVxuICAgICAgICAvLyBOT1RFKGRlYW5tKTogQWNjb3JkaW5nIHRvIHRoZSBDU1Mgc3BlYyBzL2wgc2hvdWxkIG9ubHkgYmVcbiAgICAgICAgLy8gcGVyY2VudGFnZXMsIGJ1dCB3ZSBkb24ndCBib3RoZXIgYW5kIGxldCBmbG9hdCBvciBwZXJjZW50YWdlLlxuICAgICAgICB2YXIgcyA9IHBhcnNlX2Nzc19mbG9hdChwYXJhbXNbMV0pO1xuICAgICAgICB2YXIgbCA9IHBhcnNlX2Nzc19mbG9hdChwYXJhbXNbMl0pO1xuICAgICAgICB2YXIgbTIgPSBsIDw9IDAuNSA/IGwgKiAocyArIDEpIDogbCArIHMgLSBsICogcztcbiAgICAgICAgdmFyIG0xID0gbCAqIDIgLSBtMjtcbiAgICAgICAgcmV0dXJuIFtjbGFtcF9jc3NfYnl0ZShjc3NfaHVlX3RvX3JnYihtMSwgbTIsIGgrMS8zKSAqIDI1NSksXG4gICAgICAgICAgICAgICAgY2xhbXBfY3NzX2J5dGUoY3NzX2h1ZV90b19yZ2IobTEsIG0yLCBoKSAqIDI1NSksXG4gICAgICAgICAgICAgICAgY2xhbXBfY3NzX2J5dGUoY3NzX2h1ZV90b19yZ2IobTEsIG0yLCBoLTEvMykgKiAyNTUpLFxuICAgICAgICAgICAgICAgIGFscGhhXTtcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBudWxsO1xufVxuXG50cnkgeyBleHBvcnRzLnBhcnNlQ1NTQ29sb3IgPSBwYXJzZUNTU0NvbG9yIH0gY2F0Y2goZSkgeyB9XG4iLCIndXNlIHN0cmljdCc7XG5cbm1vZHVsZS5leHBvcnRzID0gZWFyY3V0O1xuXG5mdW5jdGlvbiBlYXJjdXQoZGF0YSwgaG9sZUluZGljZXMsIGRpbSkge1xuXG4gICAgZGltID0gZGltIHx8IDI7XG5cbiAgICB2YXIgaGFzSG9sZXMgPSBob2xlSW5kaWNlcyAmJiBob2xlSW5kaWNlcy5sZW5ndGgsXG4gICAgICAgIG91dGVyTGVuID0gaGFzSG9sZXMgPyBob2xlSW5kaWNlc1swXSAqIGRpbSA6IGRhdGEubGVuZ3RoLFxuICAgICAgICBvdXRlck5vZGUgPSBsaW5rZWRMaXN0KGRhdGEsIDAsIG91dGVyTGVuLCBkaW0sIHRydWUpLFxuICAgICAgICB0cmlhbmdsZXMgPSBbXTtcblxuICAgIGlmICghb3V0ZXJOb2RlKSByZXR1cm4gdHJpYW5nbGVzO1xuXG4gICAgdmFyIG1pblgsIG1pblksIG1heFgsIG1heFksIHgsIHksIHNpemU7XG5cbiAgICBpZiAoaGFzSG9sZXMpIG91dGVyTm9kZSA9IGVsaW1pbmF0ZUhvbGVzKGRhdGEsIGhvbGVJbmRpY2VzLCBvdXRlck5vZGUsIGRpbSk7XG5cbiAgICAvLyBpZiB0aGUgc2hhcGUgaXMgbm90IHRvbyBzaW1wbGUsIHdlJ2xsIHVzZSB6LW9yZGVyIGN1cnZlIGhhc2ggbGF0ZXI7IGNhbGN1bGF0ZSBwb2x5Z29uIGJib3hcbiAgICBpZiAoZGF0YS5sZW5ndGggPiA4MCAqIGRpbSkge1xuICAgICAgICBtaW5YID0gbWF4WCA9IGRhdGFbMF07XG4gICAgICAgIG1pblkgPSBtYXhZID0gZGF0YVsxXTtcblxuICAgICAgICBmb3IgKHZhciBpID0gZGltOyBpIDwgb3V0ZXJMZW47IGkgKz0gZGltKSB7XG4gICAgICAgICAgICB4ID0gZGF0YVtpXTtcbiAgICAgICAgICAgIHkgPSBkYXRhW2kgKyAxXTtcbiAgICAgICAgICAgIGlmICh4IDwgbWluWCkgbWluWCA9IHg7XG4gICAgICAgICAgICBpZiAoeSA8IG1pblkpIG1pblkgPSB5O1xuICAgICAgICAgICAgaWYgKHggPiBtYXhYKSBtYXhYID0geDtcbiAgICAgICAgICAgIGlmICh5ID4gbWF4WSkgbWF4WSA9IHk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBtaW5YLCBtaW5ZIGFuZCBzaXplIGFyZSBsYXRlciB1c2VkIHRvIHRyYW5zZm9ybSBjb29yZHMgaW50byBpbnRlZ2VycyBmb3Igei1vcmRlciBjYWxjdWxhdGlvblxuICAgICAgICBzaXplID0gTWF0aC5tYXgobWF4WCAtIG1pblgsIG1heFkgLSBtaW5ZKTtcbiAgICB9XG5cbiAgICBlYXJjdXRMaW5rZWQob3V0ZXJOb2RlLCB0cmlhbmdsZXMsIGRpbSwgbWluWCwgbWluWSwgc2l6ZSk7XG5cbiAgICByZXR1cm4gdHJpYW5nbGVzO1xufVxuXG4vLyBjcmVhdGUgYSBjaXJjdWxhciBkb3VibHkgbGlua2VkIGxpc3QgZnJvbSBwb2x5Z29uIHBvaW50cyBpbiB0aGUgc3BlY2lmaWVkIHdpbmRpbmcgb3JkZXJcbmZ1bmN0aW9uIGxpbmtlZExpc3QoZGF0YSwgc3RhcnQsIGVuZCwgZGltLCBjbG9ja3dpc2UpIHtcbiAgICB2YXIgaSwgbGFzdDtcblxuICAgIGlmIChjbG9ja3dpc2UgPT09IChzaWduZWRBcmVhKGRhdGEsIHN0YXJ0LCBlbmQsIGRpbSkgPiAwKSkge1xuICAgICAgICBmb3IgKGkgPSBzdGFydDsgaSA8IGVuZDsgaSArPSBkaW0pIGxhc3QgPSBpbnNlcnROb2RlKGksIGRhdGFbaV0sIGRhdGFbaSArIDFdLCBsYXN0KTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBmb3IgKGkgPSBlbmQgLSBkaW07IGkgPj0gc3RhcnQ7IGkgLT0gZGltKSBsYXN0ID0gaW5zZXJ0Tm9kZShpLCBkYXRhW2ldLCBkYXRhW2kgKyAxXSwgbGFzdCk7XG4gICAgfVxuXG4gICAgaWYgKGxhc3QgJiYgZXF1YWxzKGxhc3QsIGxhc3QubmV4dCkpIHtcbiAgICAgICAgcmVtb3ZlTm9kZShsYXN0KTtcbiAgICAgICAgbGFzdCA9IGxhc3QubmV4dDtcbiAgICB9XG5cbiAgICByZXR1cm4gbGFzdDtcbn1cblxuLy8gZWxpbWluYXRlIGNvbGluZWFyIG9yIGR1cGxpY2F0ZSBwb2ludHNcbmZ1bmN0aW9uIGZpbHRlclBvaW50cyhzdGFydCwgZW5kKSB7XG4gICAgaWYgKCFzdGFydCkgcmV0dXJuIHN0YXJ0O1xuICAgIGlmICghZW5kKSBlbmQgPSBzdGFydDtcblxuICAgIHZhciBwID0gc3RhcnQsXG4gICAgICAgIGFnYWluO1xuICAgIGRvIHtcbiAgICAgICAgYWdhaW4gPSBmYWxzZTtcblxuICAgICAgICBpZiAoIXAuc3RlaW5lciAmJiAoZXF1YWxzKHAsIHAubmV4dCkgfHwgYXJlYShwLnByZXYsIHAsIHAubmV4dCkgPT09IDApKSB7XG4gICAgICAgICAgICByZW1vdmVOb2RlKHApO1xuICAgICAgICAgICAgcCA9IGVuZCA9IHAucHJldjtcbiAgICAgICAgICAgIGlmIChwID09PSBwLm5leHQpIHJldHVybiBudWxsO1xuICAgICAgICAgICAgYWdhaW4gPSB0cnVlO1xuXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBwID0gcC5uZXh0O1xuICAgICAgICB9XG4gICAgfSB3aGlsZSAoYWdhaW4gfHwgcCAhPT0gZW5kKTtcblxuICAgIHJldHVybiBlbmQ7XG59XG5cbi8vIG1haW4gZWFyIHNsaWNpbmcgbG9vcCB3aGljaCB0cmlhbmd1bGF0ZXMgYSBwb2x5Z29uIChnaXZlbiBhcyBhIGxpbmtlZCBsaXN0KVxuZnVuY3Rpb24gZWFyY3V0TGlua2VkKGVhciwgdHJpYW5nbGVzLCBkaW0sIG1pblgsIG1pblksIHNpemUsIHBhc3MpIHtcbiAgICBpZiAoIWVhcikgcmV0dXJuO1xuXG4gICAgLy8gaW50ZXJsaW5rIHBvbHlnb24gbm9kZXMgaW4gei1vcmRlclxuICAgIGlmICghcGFzcyAmJiBzaXplKSBpbmRleEN1cnZlKGVhciwgbWluWCwgbWluWSwgc2l6ZSk7XG5cbiAgICB2YXIgc3RvcCA9IGVhcixcbiAgICAgICAgcHJldiwgbmV4dDtcblxuICAgIC8vIGl0ZXJhdGUgdGhyb3VnaCBlYXJzLCBzbGljaW5nIHRoZW0gb25lIGJ5IG9uZVxuICAgIHdoaWxlIChlYXIucHJldiAhPT0gZWFyLm5leHQpIHtcbiAgICAgICAgcHJldiA9IGVhci5wcmV2O1xuICAgICAgICBuZXh0ID0gZWFyLm5leHQ7XG5cbiAgICAgICAgaWYgKHNpemUgPyBpc0Vhckhhc2hlZChlYXIsIG1pblgsIG1pblksIHNpemUpIDogaXNFYXIoZWFyKSkge1xuICAgICAgICAgICAgLy8gY3V0IG9mZiB0aGUgdHJpYW5nbGVcbiAgICAgICAgICAgIHRyaWFuZ2xlcy5wdXNoKHByZXYuaSAvIGRpbSk7XG4gICAgICAgICAgICB0cmlhbmdsZXMucHVzaChlYXIuaSAvIGRpbSk7XG4gICAgICAgICAgICB0cmlhbmdsZXMucHVzaChuZXh0LmkgLyBkaW0pO1xuXG4gICAgICAgICAgICByZW1vdmVOb2RlKGVhcik7XG5cbiAgICAgICAgICAgIC8vIHNraXBwaW5nIHRoZSBuZXh0IHZlcnRpY2UgbGVhZHMgdG8gbGVzcyBzbGl2ZXIgdHJpYW5nbGVzXG4gICAgICAgICAgICBlYXIgPSBuZXh0Lm5leHQ7XG4gICAgICAgICAgICBzdG9wID0gbmV4dC5uZXh0O1xuXG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGVhciA9IG5leHQ7XG5cbiAgICAgICAgLy8gaWYgd2UgbG9vcGVkIHRocm91Z2ggdGhlIHdob2xlIHJlbWFpbmluZyBwb2x5Z29uIGFuZCBjYW4ndCBmaW5kIGFueSBtb3JlIGVhcnNcbiAgICAgICAgaWYgKGVhciA9PT0gc3RvcCkge1xuICAgICAgICAgICAgLy8gdHJ5IGZpbHRlcmluZyBwb2ludHMgYW5kIHNsaWNpbmcgYWdhaW5cbiAgICAgICAgICAgIGlmICghcGFzcykge1xuICAgICAgICAgICAgICAgIGVhcmN1dExpbmtlZChmaWx0ZXJQb2ludHMoZWFyKSwgdHJpYW5nbGVzLCBkaW0sIG1pblgsIG1pblksIHNpemUsIDEpO1xuXG4gICAgICAgICAgICAvLyBpZiB0aGlzIGRpZG4ndCB3b3JrLCB0cnkgY3VyaW5nIGFsbCBzbWFsbCBzZWxmLWludGVyc2VjdGlvbnMgbG9jYWxseVxuICAgICAgICAgICAgfSBlbHNlIGlmIChwYXNzID09PSAxKSB7XG4gICAgICAgICAgICAgICAgZWFyID0gY3VyZUxvY2FsSW50ZXJzZWN0aW9ucyhlYXIsIHRyaWFuZ2xlcywgZGltKTtcbiAgICAgICAgICAgICAgICBlYXJjdXRMaW5rZWQoZWFyLCB0cmlhbmdsZXMsIGRpbSwgbWluWCwgbWluWSwgc2l6ZSwgMik7XG5cbiAgICAgICAgICAgIC8vIGFzIGEgbGFzdCByZXNvcnQsIHRyeSBzcGxpdHRpbmcgdGhlIHJlbWFpbmluZyBwb2x5Z29uIGludG8gdHdvXG4gICAgICAgICAgICB9IGVsc2UgaWYgKHBhc3MgPT09IDIpIHtcbiAgICAgICAgICAgICAgICBzcGxpdEVhcmN1dChlYXIsIHRyaWFuZ2xlcywgZGltLCBtaW5YLCBtaW5ZLCBzaXplKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbi8vIGNoZWNrIHdoZXRoZXIgYSBwb2x5Z29uIG5vZGUgZm9ybXMgYSB2YWxpZCBlYXIgd2l0aCBhZGphY2VudCBub2Rlc1xuZnVuY3Rpb24gaXNFYXIoZWFyKSB7XG4gICAgdmFyIGEgPSBlYXIucHJldixcbiAgICAgICAgYiA9IGVhcixcbiAgICAgICAgYyA9IGVhci5uZXh0O1xuXG4gICAgaWYgKGFyZWEoYSwgYiwgYykgPj0gMCkgcmV0dXJuIGZhbHNlOyAvLyByZWZsZXgsIGNhbid0IGJlIGFuIGVhclxuXG4gICAgLy8gbm93IG1ha2Ugc3VyZSB3ZSBkb24ndCBoYXZlIG90aGVyIHBvaW50cyBpbnNpZGUgdGhlIHBvdGVudGlhbCBlYXJcbiAgICB2YXIgcCA9IGVhci5uZXh0Lm5leHQ7XG5cbiAgICB3aGlsZSAocCAhPT0gZWFyLnByZXYpIHtcbiAgICAgICAgaWYgKHBvaW50SW5UcmlhbmdsZShhLngsIGEueSwgYi54LCBiLnksIGMueCwgYy55LCBwLngsIHAueSkgJiZcbiAgICAgICAgICAgIGFyZWEocC5wcmV2LCBwLCBwLm5leHQpID49IDApIHJldHVybiBmYWxzZTtcbiAgICAgICAgcCA9IHAubmV4dDtcbiAgICB9XG5cbiAgICByZXR1cm4gdHJ1ZTtcbn1cblxuZnVuY3Rpb24gaXNFYXJIYXNoZWQoZWFyLCBtaW5YLCBtaW5ZLCBzaXplKSB7XG4gICAgdmFyIGEgPSBlYXIucHJldixcbiAgICAgICAgYiA9IGVhcixcbiAgICAgICAgYyA9IGVhci5uZXh0O1xuXG4gICAgaWYgKGFyZWEoYSwgYiwgYykgPj0gMCkgcmV0dXJuIGZhbHNlOyAvLyByZWZsZXgsIGNhbid0IGJlIGFuIGVhclxuXG4gICAgLy8gdHJpYW5nbGUgYmJveDsgbWluICYgbWF4IGFyZSBjYWxjdWxhdGVkIGxpa2UgdGhpcyBmb3Igc3BlZWRcbiAgICB2YXIgbWluVFggPSBhLnggPCBiLnggPyAoYS54IDwgYy54ID8gYS54IDogYy54KSA6IChiLnggPCBjLnggPyBiLnggOiBjLngpLFxuICAgICAgICBtaW5UWSA9IGEueSA8IGIueSA/IChhLnkgPCBjLnkgPyBhLnkgOiBjLnkpIDogKGIueSA8IGMueSA/IGIueSA6IGMueSksXG4gICAgICAgIG1heFRYID0gYS54ID4gYi54ID8gKGEueCA+IGMueCA/IGEueCA6IGMueCkgOiAoYi54ID4gYy54ID8gYi54IDogYy54KSxcbiAgICAgICAgbWF4VFkgPSBhLnkgPiBiLnkgPyAoYS55ID4gYy55ID8gYS55IDogYy55KSA6IChiLnkgPiBjLnkgPyBiLnkgOiBjLnkpO1xuXG4gICAgLy8gei1vcmRlciByYW5nZSBmb3IgdGhlIGN1cnJlbnQgdHJpYW5nbGUgYmJveDtcbiAgICB2YXIgbWluWiA9IHpPcmRlcihtaW5UWCwgbWluVFksIG1pblgsIG1pblksIHNpemUpLFxuICAgICAgICBtYXhaID0gek9yZGVyKG1heFRYLCBtYXhUWSwgbWluWCwgbWluWSwgc2l6ZSk7XG5cbiAgICAvLyBmaXJzdCBsb29rIGZvciBwb2ludHMgaW5zaWRlIHRoZSB0cmlhbmdsZSBpbiBpbmNyZWFzaW5nIHotb3JkZXJcbiAgICB2YXIgcCA9IGVhci5uZXh0WjtcblxuICAgIHdoaWxlIChwICYmIHAueiA8PSBtYXhaKSB7XG4gICAgICAgIGlmIChwICE9PSBlYXIucHJldiAmJiBwICE9PSBlYXIubmV4dCAmJlxuICAgICAgICAgICAgcG9pbnRJblRyaWFuZ2xlKGEueCwgYS55LCBiLngsIGIueSwgYy54LCBjLnksIHAueCwgcC55KSAmJlxuICAgICAgICAgICAgYXJlYShwLnByZXYsIHAsIHAubmV4dCkgPj0gMCkgcmV0dXJuIGZhbHNlO1xuICAgICAgICBwID0gcC5uZXh0WjtcbiAgICB9XG5cbiAgICAvLyB0aGVuIGxvb2sgZm9yIHBvaW50cyBpbiBkZWNyZWFzaW5nIHotb3JkZXJcbiAgICBwID0gZWFyLnByZXZaO1xuXG4gICAgd2hpbGUgKHAgJiYgcC56ID49IG1pblopIHtcbiAgICAgICAgaWYgKHAgIT09IGVhci5wcmV2ICYmIHAgIT09IGVhci5uZXh0ICYmXG4gICAgICAgICAgICBwb2ludEluVHJpYW5nbGUoYS54LCBhLnksIGIueCwgYi55LCBjLngsIGMueSwgcC54LCBwLnkpICYmXG4gICAgICAgICAgICBhcmVhKHAucHJldiwgcCwgcC5uZXh0KSA+PSAwKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIHAgPSBwLnByZXZaO1xuICAgIH1cblxuICAgIHJldHVybiB0cnVlO1xufVxuXG4vLyBnbyB0aHJvdWdoIGFsbCBwb2x5Z29uIG5vZGVzIGFuZCBjdXJlIHNtYWxsIGxvY2FsIHNlbGYtaW50ZXJzZWN0aW9uc1xuZnVuY3Rpb24gY3VyZUxvY2FsSW50ZXJzZWN0aW9ucyhzdGFydCwgdHJpYW5nbGVzLCBkaW0pIHtcbiAgICB2YXIgcCA9IHN0YXJ0O1xuICAgIGRvIHtcbiAgICAgICAgdmFyIGEgPSBwLnByZXYsXG4gICAgICAgICAgICBiID0gcC5uZXh0Lm5leHQ7XG5cbiAgICAgICAgaWYgKCFlcXVhbHMoYSwgYikgJiYgaW50ZXJzZWN0cyhhLCBwLCBwLm5leHQsIGIpICYmIGxvY2FsbHlJbnNpZGUoYSwgYikgJiYgbG9jYWxseUluc2lkZShiLCBhKSkge1xuXG4gICAgICAgICAgICB0cmlhbmdsZXMucHVzaChhLmkgLyBkaW0pO1xuICAgICAgICAgICAgdHJpYW5nbGVzLnB1c2gocC5pIC8gZGltKTtcbiAgICAgICAgICAgIHRyaWFuZ2xlcy5wdXNoKGIuaSAvIGRpbSk7XG5cbiAgICAgICAgICAgIC8vIHJlbW92ZSB0d28gbm9kZXMgaW52b2x2ZWRcbiAgICAgICAgICAgIHJlbW92ZU5vZGUocCk7XG4gICAgICAgICAgICByZW1vdmVOb2RlKHAubmV4dCk7XG5cbiAgICAgICAgICAgIHAgPSBzdGFydCA9IGI7XG4gICAgICAgIH1cbiAgICAgICAgcCA9IHAubmV4dDtcbiAgICB9IHdoaWxlIChwICE9PSBzdGFydCk7XG5cbiAgICByZXR1cm4gcDtcbn1cblxuLy8gdHJ5IHNwbGl0dGluZyBwb2x5Z29uIGludG8gdHdvIGFuZCB0cmlhbmd1bGF0ZSB0aGVtIGluZGVwZW5kZW50bHlcbmZ1bmN0aW9uIHNwbGl0RWFyY3V0KHN0YXJ0LCB0cmlhbmdsZXMsIGRpbSwgbWluWCwgbWluWSwgc2l6ZSkge1xuICAgIC8vIGxvb2sgZm9yIGEgdmFsaWQgZGlhZ29uYWwgdGhhdCBkaXZpZGVzIHRoZSBwb2x5Z29uIGludG8gdHdvXG4gICAgdmFyIGEgPSBzdGFydDtcbiAgICBkbyB7XG4gICAgICAgIHZhciBiID0gYS5uZXh0Lm5leHQ7XG4gICAgICAgIHdoaWxlIChiICE9PSBhLnByZXYpIHtcbiAgICAgICAgICAgIGlmIChhLmkgIT09IGIuaSAmJiBpc1ZhbGlkRGlhZ29uYWwoYSwgYikpIHtcbiAgICAgICAgICAgICAgICAvLyBzcGxpdCB0aGUgcG9seWdvbiBpbiB0d28gYnkgdGhlIGRpYWdvbmFsXG4gICAgICAgICAgICAgICAgdmFyIGMgPSBzcGxpdFBvbHlnb24oYSwgYik7XG5cbiAgICAgICAgICAgICAgICAvLyBmaWx0ZXIgY29saW5lYXIgcG9pbnRzIGFyb3VuZCB0aGUgY3V0c1xuICAgICAgICAgICAgICAgIGEgPSBmaWx0ZXJQb2ludHMoYSwgYS5uZXh0KTtcbiAgICAgICAgICAgICAgICBjID0gZmlsdGVyUG9pbnRzKGMsIGMubmV4dCk7XG5cbiAgICAgICAgICAgICAgICAvLyBydW4gZWFyY3V0IG9uIGVhY2ggaGFsZlxuICAgICAgICAgICAgICAgIGVhcmN1dExpbmtlZChhLCB0cmlhbmdsZXMsIGRpbSwgbWluWCwgbWluWSwgc2l6ZSk7XG4gICAgICAgICAgICAgICAgZWFyY3V0TGlua2VkKGMsIHRyaWFuZ2xlcywgZGltLCBtaW5YLCBtaW5ZLCBzaXplKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBiID0gYi5uZXh0O1xuICAgICAgICB9XG4gICAgICAgIGEgPSBhLm5leHQ7XG4gICAgfSB3aGlsZSAoYSAhPT0gc3RhcnQpO1xufVxuXG4vLyBsaW5rIGV2ZXJ5IGhvbGUgaW50byB0aGUgb3V0ZXIgbG9vcCwgcHJvZHVjaW5nIGEgc2luZ2xlLXJpbmcgcG9seWdvbiB3aXRob3V0IGhvbGVzXG5mdW5jdGlvbiBlbGltaW5hdGVIb2xlcyhkYXRhLCBob2xlSW5kaWNlcywgb3V0ZXJOb2RlLCBkaW0pIHtcbiAgICB2YXIgcXVldWUgPSBbXSxcbiAgICAgICAgaSwgbGVuLCBzdGFydCwgZW5kLCBsaXN0O1xuXG4gICAgZm9yIChpID0gMCwgbGVuID0gaG9sZUluZGljZXMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgc3RhcnQgPSBob2xlSW5kaWNlc1tpXSAqIGRpbTtcbiAgICAgICAgZW5kID0gaSA8IGxlbiAtIDEgPyBob2xlSW5kaWNlc1tpICsgMV0gKiBkaW0gOiBkYXRhLmxlbmd0aDtcbiAgICAgICAgbGlzdCA9IGxpbmtlZExpc3QoZGF0YSwgc3RhcnQsIGVuZCwgZGltLCBmYWxzZSk7XG4gICAgICAgIGlmIChsaXN0ID09PSBsaXN0Lm5leHQpIGxpc3Quc3RlaW5lciA9IHRydWU7XG4gICAgICAgIHF1ZXVlLnB1c2goZ2V0TGVmdG1vc3QobGlzdCkpO1xuICAgIH1cblxuICAgIHF1ZXVlLnNvcnQoY29tcGFyZVgpO1xuXG4gICAgLy8gcHJvY2VzcyBob2xlcyBmcm9tIGxlZnQgdG8gcmlnaHRcbiAgICBmb3IgKGkgPSAwOyBpIDwgcXVldWUubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgZWxpbWluYXRlSG9sZShxdWV1ZVtpXSwgb3V0ZXJOb2RlKTtcbiAgICAgICAgb3V0ZXJOb2RlID0gZmlsdGVyUG9pbnRzKG91dGVyTm9kZSwgb3V0ZXJOb2RlLm5leHQpO1xuICAgIH1cblxuICAgIHJldHVybiBvdXRlck5vZGU7XG59XG5cbmZ1bmN0aW9uIGNvbXBhcmVYKGEsIGIpIHtcbiAgICByZXR1cm4gYS54IC0gYi54O1xufVxuXG4vLyBmaW5kIGEgYnJpZGdlIGJldHdlZW4gdmVydGljZXMgdGhhdCBjb25uZWN0cyBob2xlIHdpdGggYW4gb3V0ZXIgcmluZyBhbmQgYW5kIGxpbmsgaXRcbmZ1bmN0aW9uIGVsaW1pbmF0ZUhvbGUoaG9sZSwgb3V0ZXJOb2RlKSB7XG4gICAgb3V0ZXJOb2RlID0gZmluZEhvbGVCcmlkZ2UoaG9sZSwgb3V0ZXJOb2RlKTtcbiAgICBpZiAob3V0ZXJOb2RlKSB7XG4gICAgICAgIHZhciBiID0gc3BsaXRQb2x5Z29uKG91dGVyTm9kZSwgaG9sZSk7XG4gICAgICAgIGZpbHRlclBvaW50cyhiLCBiLm5leHQpO1xuICAgIH1cbn1cblxuLy8gRGF2aWQgRWJlcmx5J3MgYWxnb3JpdGhtIGZvciBmaW5kaW5nIGEgYnJpZGdlIGJldHdlZW4gaG9sZSBhbmQgb3V0ZXIgcG9seWdvblxuZnVuY3Rpb24gZmluZEhvbGVCcmlkZ2UoaG9sZSwgb3V0ZXJOb2RlKSB7XG4gICAgdmFyIHAgPSBvdXRlck5vZGUsXG4gICAgICAgIGh4ID0gaG9sZS54LFxuICAgICAgICBoeSA9IGhvbGUueSxcbiAgICAgICAgcXggPSAtSW5maW5pdHksXG4gICAgICAgIG07XG5cbiAgICAvLyBmaW5kIGEgc2VnbWVudCBpbnRlcnNlY3RlZCBieSBhIHJheSBmcm9tIHRoZSBob2xlJ3MgbGVmdG1vc3QgcG9pbnQgdG8gdGhlIGxlZnQ7XG4gICAgLy8gc2VnbWVudCdzIGVuZHBvaW50IHdpdGggbGVzc2VyIHggd2lsbCBiZSBwb3RlbnRpYWwgY29ubmVjdGlvbiBwb2ludFxuICAgIGRvIHtcbiAgICAgICAgaWYgKGh5IDw9IHAueSAmJiBoeSA+PSBwLm5leHQueSkge1xuICAgICAgICAgICAgdmFyIHggPSBwLnggKyAoaHkgLSBwLnkpICogKHAubmV4dC54IC0gcC54KSAvIChwLm5leHQueSAtIHAueSk7XG4gICAgICAgICAgICBpZiAoeCA8PSBoeCAmJiB4ID4gcXgpIHtcbiAgICAgICAgICAgICAgICBxeCA9IHg7XG4gICAgICAgICAgICAgICAgaWYgKHggPT09IGh4KSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChoeSA9PT0gcC55KSByZXR1cm4gcDtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGh5ID09PSBwLm5leHQueSkgcmV0dXJuIHAubmV4dDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbSA9IHAueCA8IHAubmV4dC54ID8gcCA6IHAubmV4dDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBwID0gcC5uZXh0O1xuICAgIH0gd2hpbGUgKHAgIT09IG91dGVyTm9kZSk7XG5cbiAgICBpZiAoIW0pIHJldHVybiBudWxsO1xuXG4gICAgaWYgKGh4ID09PSBxeCkgcmV0dXJuIG0ucHJldjsgLy8gaG9sZSB0b3VjaGVzIG91dGVyIHNlZ21lbnQ7IHBpY2sgbG93ZXIgZW5kcG9pbnRcblxuICAgIC8vIGxvb2sgZm9yIHBvaW50cyBpbnNpZGUgdGhlIHRyaWFuZ2xlIG9mIGhvbGUgcG9pbnQsIHNlZ21lbnQgaW50ZXJzZWN0aW9uIGFuZCBlbmRwb2ludDtcbiAgICAvLyBpZiB0aGVyZSBhcmUgbm8gcG9pbnRzIGZvdW5kLCB3ZSBoYXZlIGEgdmFsaWQgY29ubmVjdGlvbjtcbiAgICAvLyBvdGhlcndpc2UgY2hvb3NlIHRoZSBwb2ludCBvZiB0aGUgbWluaW11bSBhbmdsZSB3aXRoIHRoZSByYXkgYXMgY29ubmVjdGlvbiBwb2ludFxuXG4gICAgdmFyIHN0b3AgPSBtLFxuICAgICAgICBteCA9IG0ueCxcbiAgICAgICAgbXkgPSBtLnksXG4gICAgICAgIHRhbk1pbiA9IEluZmluaXR5LFxuICAgICAgICB0YW47XG5cbiAgICBwID0gbS5uZXh0O1xuXG4gICAgd2hpbGUgKHAgIT09IHN0b3ApIHtcbiAgICAgICAgaWYgKGh4ID49IHAueCAmJiBwLnggPj0gbXggJiZcbiAgICAgICAgICAgICAgICBwb2ludEluVHJpYW5nbGUoaHkgPCBteSA/IGh4IDogcXgsIGh5LCBteCwgbXksIGh5IDwgbXkgPyBxeCA6IGh4LCBoeSwgcC54LCBwLnkpKSB7XG5cbiAgICAgICAgICAgIHRhbiA9IE1hdGguYWJzKGh5IC0gcC55KSAvIChoeCAtIHAueCk7IC8vIHRhbmdlbnRpYWxcblxuICAgICAgICAgICAgaWYgKCh0YW4gPCB0YW5NaW4gfHwgKHRhbiA9PT0gdGFuTWluICYmIHAueCA+IG0ueCkpICYmIGxvY2FsbHlJbnNpZGUocCwgaG9sZSkpIHtcbiAgICAgICAgICAgICAgICBtID0gcDtcbiAgICAgICAgICAgICAgICB0YW5NaW4gPSB0YW47XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBwID0gcC5uZXh0O1xuICAgIH1cblxuICAgIHJldHVybiBtO1xufVxuXG4vLyBpbnRlcmxpbmsgcG9seWdvbiBub2RlcyBpbiB6LW9yZGVyXG5mdW5jdGlvbiBpbmRleEN1cnZlKHN0YXJ0LCBtaW5YLCBtaW5ZLCBzaXplKSB7XG4gICAgdmFyIHAgPSBzdGFydDtcbiAgICBkbyB7XG4gICAgICAgIGlmIChwLnogPT09IG51bGwpIHAueiA9IHpPcmRlcihwLngsIHAueSwgbWluWCwgbWluWSwgc2l6ZSk7XG4gICAgICAgIHAucHJldlogPSBwLnByZXY7XG4gICAgICAgIHAubmV4dFogPSBwLm5leHQ7XG4gICAgICAgIHAgPSBwLm5leHQ7XG4gICAgfSB3aGlsZSAocCAhPT0gc3RhcnQpO1xuXG4gICAgcC5wcmV2Wi5uZXh0WiA9IG51bGw7XG4gICAgcC5wcmV2WiA9IG51bGw7XG5cbiAgICBzb3J0TGlua2VkKHApO1xufVxuXG4vLyBTaW1vbiBUYXRoYW0ncyBsaW5rZWQgbGlzdCBtZXJnZSBzb3J0IGFsZ29yaXRobVxuLy8gaHR0cDovL3d3dy5jaGlhcmsuZ3JlZW5lbmQub3JnLnVrL35zZ3RhdGhhbS9hbGdvcml0aG1zL2xpc3Rzb3J0Lmh0bWxcbmZ1bmN0aW9uIHNvcnRMaW5rZWQobGlzdCkge1xuICAgIHZhciBpLCBwLCBxLCBlLCB0YWlsLCBudW1NZXJnZXMsIHBTaXplLCBxU2l6ZSxcbiAgICAgICAgaW5TaXplID0gMTtcblxuICAgIGRvIHtcbiAgICAgICAgcCA9IGxpc3Q7XG4gICAgICAgIGxpc3QgPSBudWxsO1xuICAgICAgICB0YWlsID0gbnVsbDtcbiAgICAgICAgbnVtTWVyZ2VzID0gMDtcblxuICAgICAgICB3aGlsZSAocCkge1xuICAgICAgICAgICAgbnVtTWVyZ2VzKys7XG4gICAgICAgICAgICBxID0gcDtcbiAgICAgICAgICAgIHBTaXplID0gMDtcbiAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBpblNpemU7IGkrKykge1xuICAgICAgICAgICAgICAgIHBTaXplKys7XG4gICAgICAgICAgICAgICAgcSA9IHEubmV4dFo7XG4gICAgICAgICAgICAgICAgaWYgKCFxKSBicmVhaztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcVNpemUgPSBpblNpemU7XG5cbiAgICAgICAgICAgIHdoaWxlIChwU2l6ZSA+IDAgfHwgKHFTaXplID4gMCAmJiBxKSkge1xuXG4gICAgICAgICAgICAgICAgaWYgKHBTaXplID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGUgPSBxO1xuICAgICAgICAgICAgICAgICAgICBxID0gcS5uZXh0WjtcbiAgICAgICAgICAgICAgICAgICAgcVNpemUtLTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHFTaXplID09PSAwIHx8ICFxKSB7XG4gICAgICAgICAgICAgICAgICAgIGUgPSBwO1xuICAgICAgICAgICAgICAgICAgICBwID0gcC5uZXh0WjtcbiAgICAgICAgICAgICAgICAgICAgcFNpemUtLTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHAueiA8PSBxLnopIHtcbiAgICAgICAgICAgICAgICAgICAgZSA9IHA7XG4gICAgICAgICAgICAgICAgICAgIHAgPSBwLm5leHRaO1xuICAgICAgICAgICAgICAgICAgICBwU2l6ZS0tO1xuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGUgPSBxO1xuICAgICAgICAgICAgICAgICAgICBxID0gcS5uZXh0WjtcbiAgICAgICAgICAgICAgICAgICAgcVNpemUtLTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAodGFpbCkgdGFpbC5uZXh0WiA9IGU7XG4gICAgICAgICAgICAgICAgZWxzZSBsaXN0ID0gZTtcblxuICAgICAgICAgICAgICAgIGUucHJldlogPSB0YWlsO1xuICAgICAgICAgICAgICAgIHRhaWwgPSBlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBwID0gcTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRhaWwubmV4dFogPSBudWxsO1xuICAgICAgICBpblNpemUgKj0gMjtcblxuICAgIH0gd2hpbGUgKG51bU1lcmdlcyA+IDEpO1xuXG4gICAgcmV0dXJuIGxpc3Q7XG59XG5cbi8vIHotb3JkZXIgb2YgYSBwb2ludCBnaXZlbiBjb29yZHMgYW5kIHNpemUgb2YgdGhlIGRhdGEgYm91bmRpbmcgYm94XG5mdW5jdGlvbiB6T3JkZXIoeCwgeSwgbWluWCwgbWluWSwgc2l6ZSkge1xuICAgIC8vIGNvb3JkcyBhcmUgdHJhbnNmb3JtZWQgaW50byBub24tbmVnYXRpdmUgMTUtYml0IGludGVnZXIgcmFuZ2VcbiAgICB4ID0gMzI3NjcgKiAoeCAtIG1pblgpIC8gc2l6ZTtcbiAgICB5ID0gMzI3NjcgKiAoeSAtIG1pblkpIC8gc2l6ZTtcblxuICAgIHggPSAoeCB8ICh4IDw8IDgpKSAmIDB4MDBGRjAwRkY7XG4gICAgeCA9ICh4IHwgKHggPDwgNCkpICYgMHgwRjBGMEYwRjtcbiAgICB4ID0gKHggfCAoeCA8PCAyKSkgJiAweDMzMzMzMzMzO1xuICAgIHggPSAoeCB8ICh4IDw8IDEpKSAmIDB4NTU1NTU1NTU7XG5cbiAgICB5ID0gKHkgfCAoeSA8PCA4KSkgJiAweDAwRkYwMEZGO1xuICAgIHkgPSAoeSB8ICh5IDw8IDQpKSAmIDB4MEYwRjBGMEY7XG4gICAgeSA9ICh5IHwgKHkgPDwgMikpICYgMHgzMzMzMzMzMztcbiAgICB5ID0gKHkgfCAoeSA8PCAxKSkgJiAweDU1NTU1NTU1O1xuXG4gICAgcmV0dXJuIHggfCAoeSA8PCAxKTtcbn1cblxuLy8gZmluZCB0aGUgbGVmdG1vc3Qgbm9kZSBvZiBhIHBvbHlnb24gcmluZ1xuZnVuY3Rpb24gZ2V0TGVmdG1vc3Qoc3RhcnQpIHtcbiAgICB2YXIgcCA9IHN0YXJ0LFxuICAgICAgICBsZWZ0bW9zdCA9IHN0YXJ0O1xuICAgIGRvIHtcbiAgICAgICAgaWYgKHAueCA8IGxlZnRtb3N0LngpIGxlZnRtb3N0ID0gcDtcbiAgICAgICAgcCA9IHAubmV4dDtcbiAgICB9IHdoaWxlIChwICE9PSBzdGFydCk7XG5cbiAgICByZXR1cm4gbGVmdG1vc3Q7XG59XG5cbi8vIGNoZWNrIGlmIGEgcG9pbnQgbGllcyB3aXRoaW4gYSBjb252ZXggdHJpYW5nbGVcbmZ1bmN0aW9uIHBvaW50SW5UcmlhbmdsZShheCwgYXksIGJ4LCBieSwgY3gsIGN5LCBweCwgcHkpIHtcbiAgICByZXR1cm4gKGN4IC0gcHgpICogKGF5IC0gcHkpIC0gKGF4IC0gcHgpICogKGN5IC0gcHkpID49IDAgJiZcbiAgICAgICAgICAgKGF4IC0gcHgpICogKGJ5IC0gcHkpIC0gKGJ4IC0gcHgpICogKGF5IC0gcHkpID49IDAgJiZcbiAgICAgICAgICAgKGJ4IC0gcHgpICogKGN5IC0gcHkpIC0gKGN4IC0gcHgpICogKGJ5IC0gcHkpID49IDA7XG59XG5cbi8vIGNoZWNrIGlmIGEgZGlhZ29uYWwgYmV0d2VlbiB0d28gcG9seWdvbiBub2RlcyBpcyB2YWxpZCAobGllcyBpbiBwb2x5Z29uIGludGVyaW9yKVxuZnVuY3Rpb24gaXNWYWxpZERpYWdvbmFsKGEsIGIpIHtcbiAgICByZXR1cm4gYS5uZXh0LmkgIT09IGIuaSAmJiBhLnByZXYuaSAhPT0gYi5pICYmICFpbnRlcnNlY3RzUG9seWdvbihhLCBiKSAmJlxuICAgICAgICAgICBsb2NhbGx5SW5zaWRlKGEsIGIpICYmIGxvY2FsbHlJbnNpZGUoYiwgYSkgJiYgbWlkZGxlSW5zaWRlKGEsIGIpO1xufVxuXG4vLyBzaWduZWQgYXJlYSBvZiBhIHRyaWFuZ2xlXG5mdW5jdGlvbiBhcmVhKHAsIHEsIHIpIHtcbiAgICByZXR1cm4gKHEueSAtIHAueSkgKiAoci54IC0gcS54KSAtIChxLnggLSBwLngpICogKHIueSAtIHEueSk7XG59XG5cbi8vIGNoZWNrIGlmIHR3byBwb2ludHMgYXJlIGVxdWFsXG5mdW5jdGlvbiBlcXVhbHMocDEsIHAyKSB7XG4gICAgcmV0dXJuIHAxLnggPT09IHAyLnggJiYgcDEueSA9PT0gcDIueTtcbn1cblxuLy8gY2hlY2sgaWYgdHdvIHNlZ21lbnRzIGludGVyc2VjdFxuZnVuY3Rpb24gaW50ZXJzZWN0cyhwMSwgcTEsIHAyLCBxMikge1xuICAgIGlmICgoZXF1YWxzKHAxLCBxMSkgJiYgZXF1YWxzKHAyLCBxMikpIHx8XG4gICAgICAgIChlcXVhbHMocDEsIHEyKSAmJiBlcXVhbHMocDIsIHExKSkpIHJldHVybiB0cnVlO1xuICAgIHJldHVybiBhcmVhKHAxLCBxMSwgcDIpID4gMCAhPT0gYXJlYShwMSwgcTEsIHEyKSA+IDAgJiZcbiAgICAgICAgICAgYXJlYShwMiwgcTIsIHAxKSA+IDAgIT09IGFyZWEocDIsIHEyLCBxMSkgPiAwO1xufVxuXG4vLyBjaGVjayBpZiBhIHBvbHlnb24gZGlhZ29uYWwgaW50ZXJzZWN0cyBhbnkgcG9seWdvbiBzZWdtZW50c1xuZnVuY3Rpb24gaW50ZXJzZWN0c1BvbHlnb24oYSwgYikge1xuICAgIHZhciBwID0gYTtcbiAgICBkbyB7XG4gICAgICAgIGlmIChwLmkgIT09IGEuaSAmJiBwLm5leHQuaSAhPT0gYS5pICYmIHAuaSAhPT0gYi5pICYmIHAubmV4dC5pICE9PSBiLmkgJiZcbiAgICAgICAgICAgICAgICBpbnRlcnNlY3RzKHAsIHAubmV4dCwgYSwgYikpIHJldHVybiB0cnVlO1xuICAgICAgICBwID0gcC5uZXh0O1xuICAgIH0gd2hpbGUgKHAgIT09IGEpO1xuXG4gICAgcmV0dXJuIGZhbHNlO1xufVxuXG4vLyBjaGVjayBpZiBhIHBvbHlnb24gZGlhZ29uYWwgaXMgbG9jYWxseSBpbnNpZGUgdGhlIHBvbHlnb25cbmZ1bmN0aW9uIGxvY2FsbHlJbnNpZGUoYSwgYikge1xuICAgIHJldHVybiBhcmVhKGEucHJldiwgYSwgYS5uZXh0KSA8IDAgP1xuICAgICAgICBhcmVhKGEsIGIsIGEubmV4dCkgPj0gMCAmJiBhcmVhKGEsIGEucHJldiwgYikgPj0gMCA6XG4gICAgICAgIGFyZWEoYSwgYiwgYS5wcmV2KSA8IDAgfHwgYXJlYShhLCBhLm5leHQsIGIpIDwgMDtcbn1cblxuLy8gY2hlY2sgaWYgdGhlIG1pZGRsZSBwb2ludCBvZiBhIHBvbHlnb24gZGlhZ29uYWwgaXMgaW5zaWRlIHRoZSBwb2x5Z29uXG5mdW5jdGlvbiBtaWRkbGVJbnNpZGUoYSwgYikge1xuICAgIHZhciBwID0gYSxcbiAgICAgICAgaW5zaWRlID0gZmFsc2UsXG4gICAgICAgIHB4ID0gKGEueCArIGIueCkgLyAyLFxuICAgICAgICBweSA9IChhLnkgKyBiLnkpIC8gMjtcbiAgICBkbyB7XG4gICAgICAgIGlmICgoKHAueSA+IHB5KSAhPT0gKHAubmV4dC55ID4gcHkpKSAmJiAocHggPCAocC5uZXh0LnggLSBwLngpICogKHB5IC0gcC55KSAvIChwLm5leHQueSAtIHAueSkgKyBwLngpKVxuICAgICAgICAgICAgaW5zaWRlID0gIWluc2lkZTtcbiAgICAgICAgcCA9IHAubmV4dDtcbiAgICB9IHdoaWxlIChwICE9PSBhKTtcblxuICAgIHJldHVybiBpbnNpZGU7XG59XG5cbi8vIGxpbmsgdHdvIHBvbHlnb24gdmVydGljZXMgd2l0aCBhIGJyaWRnZTsgaWYgdGhlIHZlcnRpY2VzIGJlbG9uZyB0byB0aGUgc2FtZSByaW5nLCBpdCBzcGxpdHMgcG9seWdvbiBpbnRvIHR3bztcbi8vIGlmIG9uZSBiZWxvbmdzIHRvIHRoZSBvdXRlciByaW5nIGFuZCBhbm90aGVyIHRvIGEgaG9sZSwgaXQgbWVyZ2VzIGl0IGludG8gYSBzaW5nbGUgcmluZ1xuZnVuY3Rpb24gc3BsaXRQb2x5Z29uKGEsIGIpIHtcbiAgICB2YXIgYTIgPSBuZXcgTm9kZShhLmksIGEueCwgYS55KSxcbiAgICAgICAgYjIgPSBuZXcgTm9kZShiLmksIGIueCwgYi55KSxcbiAgICAgICAgYW4gPSBhLm5leHQsXG4gICAgICAgIGJwID0gYi5wcmV2O1xuXG4gICAgYS5uZXh0ID0gYjtcbiAgICBiLnByZXYgPSBhO1xuXG4gICAgYTIubmV4dCA9IGFuO1xuICAgIGFuLnByZXYgPSBhMjtcblxuICAgIGIyLm5leHQgPSBhMjtcbiAgICBhMi5wcmV2ID0gYjI7XG5cbiAgICBicC5uZXh0ID0gYjI7XG4gICAgYjIucHJldiA9IGJwO1xuXG4gICAgcmV0dXJuIGIyO1xufVxuXG4vLyBjcmVhdGUgYSBub2RlIGFuZCBvcHRpb25hbGx5IGxpbmsgaXQgd2l0aCBwcmV2aW91cyBvbmUgKGluIGEgY2lyY3VsYXIgZG91Ymx5IGxpbmtlZCBsaXN0KVxuZnVuY3Rpb24gaW5zZXJ0Tm9kZShpLCB4LCB5LCBsYXN0KSB7XG4gICAgdmFyIHAgPSBuZXcgTm9kZShpLCB4LCB5KTtcblxuICAgIGlmICghbGFzdCkge1xuICAgICAgICBwLnByZXYgPSBwO1xuICAgICAgICBwLm5leHQgPSBwO1xuXG4gICAgfSBlbHNlIHtcbiAgICAgICAgcC5uZXh0ID0gbGFzdC5uZXh0O1xuICAgICAgICBwLnByZXYgPSBsYXN0O1xuICAgICAgICBsYXN0Lm5leHQucHJldiA9IHA7XG4gICAgICAgIGxhc3QubmV4dCA9IHA7XG4gICAgfVxuICAgIHJldHVybiBwO1xufVxuXG5mdW5jdGlvbiByZW1vdmVOb2RlKHApIHtcbiAgICBwLm5leHQucHJldiA9IHAucHJldjtcbiAgICBwLnByZXYubmV4dCA9IHAubmV4dDtcblxuICAgIGlmIChwLnByZXZaKSBwLnByZXZaLm5leHRaID0gcC5uZXh0WjtcbiAgICBpZiAocC5uZXh0WikgcC5uZXh0Wi5wcmV2WiA9IHAucHJldlo7XG59XG5cbmZ1bmN0aW9uIE5vZGUoaSwgeCwgeSkge1xuICAgIC8vIHZlcnRpY2UgaW5kZXggaW4gY29vcmRpbmF0ZXMgYXJyYXlcbiAgICB0aGlzLmkgPSBpO1xuXG4gICAgLy8gdmVydGV4IGNvb3JkaW5hdGVzXG4gICAgdGhpcy54ID0geDtcbiAgICB0aGlzLnkgPSB5O1xuXG4gICAgLy8gcHJldmlvdXMgYW5kIG5leHQgdmVydGljZSBub2RlcyBpbiBhIHBvbHlnb24gcmluZ1xuICAgIHRoaXMucHJldiA9IG51bGw7XG4gICAgdGhpcy5uZXh0ID0gbnVsbDtcblxuICAgIC8vIHotb3JkZXIgY3VydmUgdmFsdWVcbiAgICB0aGlzLnogPSBudWxsO1xuXG4gICAgLy8gcHJldmlvdXMgYW5kIG5leHQgbm9kZXMgaW4gei1vcmRlclxuICAgIHRoaXMucHJldlogPSBudWxsO1xuICAgIHRoaXMubmV4dFogPSBudWxsO1xuXG4gICAgLy8gaW5kaWNhdGVzIHdoZXRoZXIgdGhpcyBpcyBhIHN0ZWluZXIgcG9pbnRcbiAgICB0aGlzLnN0ZWluZXIgPSBmYWxzZTtcbn1cblxuLy8gcmV0dXJuIGEgcGVyY2VudGFnZSBkaWZmZXJlbmNlIGJldHdlZW4gdGhlIHBvbHlnb24gYXJlYSBhbmQgaXRzIHRyaWFuZ3VsYXRpb24gYXJlYTtcbi8vIHVzZWQgdG8gdmVyaWZ5IGNvcnJlY3RuZXNzIG9mIHRyaWFuZ3VsYXRpb25cbmVhcmN1dC5kZXZpYXRpb24gPSBmdW5jdGlvbiAoZGF0YSwgaG9sZUluZGljZXMsIGRpbSwgdHJpYW5nbGVzKSB7XG4gICAgdmFyIGhhc0hvbGVzID0gaG9sZUluZGljZXMgJiYgaG9sZUluZGljZXMubGVuZ3RoO1xuICAgIHZhciBvdXRlckxlbiA9IGhhc0hvbGVzID8gaG9sZUluZGljZXNbMF0gKiBkaW0gOiBkYXRhLmxlbmd0aDtcblxuICAgIHZhciBwb2x5Z29uQXJlYSA9IE1hdGguYWJzKHNpZ25lZEFyZWEoZGF0YSwgMCwgb3V0ZXJMZW4sIGRpbSkpO1xuICAgIGlmIChoYXNIb2xlcykge1xuICAgICAgICBmb3IgKHZhciBpID0gMCwgbGVuID0gaG9sZUluZGljZXMubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgICAgIHZhciBzdGFydCA9IGhvbGVJbmRpY2VzW2ldICogZGltO1xuICAgICAgICAgICAgdmFyIGVuZCA9IGkgPCBsZW4gLSAxID8gaG9sZUluZGljZXNbaSArIDFdICogZGltIDogZGF0YS5sZW5ndGg7XG4gICAgICAgICAgICBwb2x5Z29uQXJlYSAtPSBNYXRoLmFicyhzaWduZWRBcmVhKGRhdGEsIHN0YXJ0LCBlbmQsIGRpbSkpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgdmFyIHRyaWFuZ2xlc0FyZWEgPSAwO1xuICAgIGZvciAoaSA9IDA7IGkgPCB0cmlhbmdsZXMubGVuZ3RoOyBpICs9IDMpIHtcbiAgICAgICAgdmFyIGEgPSB0cmlhbmdsZXNbaV0gKiBkaW07XG4gICAgICAgIHZhciBiID0gdHJpYW5nbGVzW2kgKyAxXSAqIGRpbTtcbiAgICAgICAgdmFyIGMgPSB0cmlhbmdsZXNbaSArIDJdICogZGltO1xuICAgICAgICB0cmlhbmdsZXNBcmVhICs9IE1hdGguYWJzKFxuICAgICAgICAgICAgKGRhdGFbYV0gLSBkYXRhW2NdKSAqIChkYXRhW2IgKyAxXSAtIGRhdGFbYSArIDFdKSAtXG4gICAgICAgICAgICAoZGF0YVthXSAtIGRhdGFbYl0pICogKGRhdGFbYyArIDFdIC0gZGF0YVthICsgMV0pKTtcbiAgICB9XG5cbiAgICByZXR1cm4gcG9seWdvbkFyZWEgPT09IDAgJiYgdHJpYW5nbGVzQXJlYSA9PT0gMCA/IDAgOlxuICAgICAgICBNYXRoLmFicygodHJpYW5nbGVzQXJlYSAtIHBvbHlnb25BcmVhKSAvIHBvbHlnb25BcmVhKTtcbn07XG5cbmZ1bmN0aW9uIHNpZ25lZEFyZWEoZGF0YSwgc3RhcnQsIGVuZCwgZGltKSB7XG4gICAgdmFyIHN1bSA9IDA7XG4gICAgZm9yICh2YXIgaSA9IHN0YXJ0LCBqID0gZW5kIC0gZGltOyBpIDwgZW5kOyBpICs9IGRpbSkge1xuICAgICAgICBzdW0gKz0gKGRhdGFbal0gLSBkYXRhW2ldKSAqIChkYXRhW2kgKyAxXSArIGRhdGFbaiArIDFdKTtcbiAgICAgICAgaiA9IGk7XG4gICAgfVxuICAgIHJldHVybiBzdW07XG59XG5cbi8vIHR1cm4gYSBwb2x5Z29uIGluIGEgbXVsdGktZGltZW5zaW9uYWwgYXJyYXkgZm9ybSAoZS5nLiBhcyBpbiBHZW9KU09OKSBpbnRvIGEgZm9ybSBFYXJjdXQgYWNjZXB0c1xuZWFyY3V0LmZsYXR0ZW4gPSBmdW5jdGlvbiAoZGF0YSkge1xuICAgIHZhciBkaW0gPSBkYXRhWzBdWzBdLmxlbmd0aCxcbiAgICAgICAgcmVzdWx0ID0ge3ZlcnRpY2VzOiBbXSwgaG9sZXM6IFtdLCBkaW1lbnNpb25zOiBkaW19LFxuICAgICAgICBob2xlSW5kZXggPSAwO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBkYXRhLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgZGF0YVtpXS5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgZm9yICh2YXIgZCA9IDA7IGQgPCBkaW07IGQrKykgcmVzdWx0LnZlcnRpY2VzLnB1c2goZGF0YVtpXVtqXVtkXSk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGkgPiAwKSB7XG4gICAgICAgICAgICBob2xlSW5kZXggKz0gZGF0YVtpIC0gMV0ubGVuZ3RoO1xuICAgICAgICAgICAgcmVzdWx0LmhvbGVzLnB1c2goaG9sZUluZGV4KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gcmVzdWx0O1xufTtcbiIsIi8vIENvcHlyaWdodCBKb3llbnQsIEluYy4gYW5kIG90aGVyIE5vZGUgY29udHJpYnV0b3JzLlxuLy9cbi8vIFBlcm1pc3Npb24gaXMgaGVyZWJ5IGdyYW50ZWQsIGZyZWUgb2YgY2hhcmdlLCB0byBhbnkgcGVyc29uIG9idGFpbmluZyBhXG4vLyBjb3B5IG9mIHRoaXMgc29mdHdhcmUgYW5kIGFzc29jaWF0ZWQgZG9jdW1lbnRhdGlvbiBmaWxlcyAodGhlXG4vLyBcIlNvZnR3YXJlXCIpLCB0byBkZWFsIGluIHRoZSBTb2Z0d2FyZSB3aXRob3V0IHJlc3RyaWN0aW9uLCBpbmNsdWRpbmdcbi8vIHdpdGhvdXQgbGltaXRhdGlvbiB0aGUgcmlnaHRzIHRvIHVzZSwgY29weSwgbW9kaWZ5LCBtZXJnZSwgcHVibGlzaCxcbi8vIGRpc3RyaWJ1dGUsIHN1YmxpY2Vuc2UsIGFuZC9vciBzZWxsIGNvcGllcyBvZiB0aGUgU29mdHdhcmUsIGFuZCB0byBwZXJtaXRcbi8vIHBlcnNvbnMgdG8gd2hvbSB0aGUgU29mdHdhcmUgaXMgZnVybmlzaGVkIHRvIGRvIHNvLCBzdWJqZWN0IHRvIHRoZVxuLy8gZm9sbG93aW5nIGNvbmRpdGlvbnM6XG4vL1xuLy8gVGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UgYW5kIHRoaXMgcGVybWlzc2lvbiBub3RpY2Ugc2hhbGwgYmUgaW5jbHVkZWRcbi8vIGluIGFsbCBjb3BpZXMgb3Igc3Vic3RhbnRpYWwgcG9ydGlvbnMgb2YgdGhlIFNvZnR3YXJlLlxuLy9cbi8vIFRIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCBcIkFTIElTXCIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1Ncbi8vIE9SIElNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0Zcbi8vIE1FUkNIQU5UQUJJTElUWSwgRklUTkVTUyBGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gSU5cbi8vIE5PIEVWRU5UIFNIQUxMIFRIRSBBVVRIT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLFxuLy8gREFNQUdFUyBPUiBPVEhFUiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SXG4vLyBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwgT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFXG4vLyBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4gVEhFIFNPRlRXQVJFLlxuXG5mdW5jdGlvbiBFdmVudEVtaXR0ZXIoKSB7XG4gIHRoaXMuX2V2ZW50cyA9IHRoaXMuX2V2ZW50cyB8fCB7fTtcbiAgdGhpcy5fbWF4TGlzdGVuZXJzID0gdGhpcy5fbWF4TGlzdGVuZXJzIHx8IHVuZGVmaW5lZDtcbn1cbm1vZHVsZS5leHBvcnRzID0gRXZlbnRFbWl0dGVyO1xuXG4vLyBCYWNrd2FyZHMtY29tcGF0IHdpdGggbm9kZSAwLjEwLnhcbkV2ZW50RW1pdHRlci5FdmVudEVtaXR0ZXIgPSBFdmVudEVtaXR0ZXI7XG5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUuX2V2ZW50cyA9IHVuZGVmaW5lZDtcbkV2ZW50RW1pdHRlci5wcm90b3R5cGUuX21heExpc3RlbmVycyA9IHVuZGVmaW5lZDtcblxuLy8gQnkgZGVmYXVsdCBFdmVudEVtaXR0ZXJzIHdpbGwgcHJpbnQgYSB3YXJuaW5nIGlmIG1vcmUgdGhhbiAxMCBsaXN0ZW5lcnMgYXJlXG4vLyBhZGRlZCB0byBpdC4gVGhpcyBpcyBhIHVzZWZ1bCBkZWZhdWx0IHdoaWNoIGhlbHBzIGZpbmRpbmcgbWVtb3J5IGxlYWtzLlxuRXZlbnRFbWl0dGVyLmRlZmF1bHRNYXhMaXN0ZW5lcnMgPSAxMDtcblxuLy8gT2J2aW91c2x5IG5vdCBhbGwgRW1pdHRlcnMgc2hvdWxkIGJlIGxpbWl0ZWQgdG8gMTAuIFRoaXMgZnVuY3Rpb24gYWxsb3dzXG4vLyB0aGF0IHRvIGJlIGluY3JlYXNlZC4gU2V0IHRvIHplcm8gZm9yIHVubGltaXRlZC5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUuc2V0TWF4TGlzdGVuZXJzID0gZnVuY3Rpb24obikge1xuICBpZiAoIWlzTnVtYmVyKG4pIHx8IG4gPCAwIHx8IGlzTmFOKG4pKVxuICAgIHRocm93IFR5cGVFcnJvcignbiBtdXN0IGJlIGEgcG9zaXRpdmUgbnVtYmVyJyk7XG4gIHRoaXMuX21heExpc3RlbmVycyA9IG47XG4gIHJldHVybiB0aGlzO1xufTtcblxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5lbWl0ID0gZnVuY3Rpb24odHlwZSkge1xuICB2YXIgZXIsIGhhbmRsZXIsIGxlbiwgYXJncywgaSwgbGlzdGVuZXJzO1xuXG4gIGlmICghdGhpcy5fZXZlbnRzKVxuICAgIHRoaXMuX2V2ZW50cyA9IHt9O1xuXG4gIC8vIElmIHRoZXJlIGlzIG5vICdlcnJvcicgZXZlbnQgbGlzdGVuZXIgdGhlbiB0aHJvdy5cbiAgaWYgKHR5cGUgPT09ICdlcnJvcicpIHtcbiAgICBpZiAoIXRoaXMuX2V2ZW50cy5lcnJvciB8fFxuICAgICAgICAoaXNPYmplY3QodGhpcy5fZXZlbnRzLmVycm9yKSAmJiAhdGhpcy5fZXZlbnRzLmVycm9yLmxlbmd0aCkpIHtcbiAgICAgIGVyID0gYXJndW1lbnRzWzFdO1xuICAgICAgaWYgKGVyIGluc3RhbmNlb2YgRXJyb3IpIHtcbiAgICAgICAgdGhyb3cgZXI7IC8vIFVuaGFuZGxlZCAnZXJyb3InIGV2ZW50XG4gICAgICB9IGVsc2Uge1xuICAgICAgICAvLyBBdCBsZWFzdCBnaXZlIHNvbWUga2luZCBvZiBjb250ZXh0IHRvIHRoZSB1c2VyXG4gICAgICAgIHZhciBlcnIgPSBuZXcgRXJyb3IoJ1VuY2F1Z2h0LCB1bnNwZWNpZmllZCBcImVycm9yXCIgZXZlbnQuICgnICsgZXIgKyAnKScpO1xuICAgICAgICBlcnIuY29udGV4dCA9IGVyO1xuICAgICAgICB0aHJvdyBlcnI7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgaGFuZGxlciA9IHRoaXMuX2V2ZW50c1t0eXBlXTtcblxuICBpZiAoaXNVbmRlZmluZWQoaGFuZGxlcikpXG4gICAgcmV0dXJuIGZhbHNlO1xuXG4gIGlmIChpc0Z1bmN0aW9uKGhhbmRsZXIpKSB7XG4gICAgc3dpdGNoIChhcmd1bWVudHMubGVuZ3RoKSB7XG4gICAgICAvLyBmYXN0IGNhc2VzXG4gICAgICBjYXNlIDE6XG4gICAgICAgIGhhbmRsZXIuY2FsbCh0aGlzKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIDI6XG4gICAgICAgIGhhbmRsZXIuY2FsbCh0aGlzLCBhcmd1bWVudHNbMV0pO1xuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgMzpcbiAgICAgICAgaGFuZGxlci5jYWxsKHRoaXMsIGFyZ3VtZW50c1sxXSwgYXJndW1lbnRzWzJdKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICAvLyBzbG93ZXJcbiAgICAgIGRlZmF1bHQ6XG4gICAgICAgIGFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIDEpO1xuICAgICAgICBoYW5kbGVyLmFwcGx5KHRoaXMsIGFyZ3MpO1xuICAgIH1cbiAgfSBlbHNlIGlmIChpc09iamVjdChoYW5kbGVyKSkge1xuICAgIGFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIDEpO1xuICAgIGxpc3RlbmVycyA9IGhhbmRsZXIuc2xpY2UoKTtcbiAgICBsZW4gPSBsaXN0ZW5lcnMubGVuZ3RoO1xuICAgIGZvciAoaSA9IDA7IGkgPCBsZW47IGkrKylcbiAgICAgIGxpc3RlbmVyc1tpXS5hcHBseSh0aGlzLCBhcmdzKTtcbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufTtcblxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5hZGRMaXN0ZW5lciA9IGZ1bmN0aW9uKHR5cGUsIGxpc3RlbmVyKSB7XG4gIHZhciBtO1xuXG4gIGlmICghaXNGdW5jdGlvbihsaXN0ZW5lcikpXG4gICAgdGhyb3cgVHlwZUVycm9yKCdsaXN0ZW5lciBtdXN0IGJlIGEgZnVuY3Rpb24nKTtcblxuICBpZiAoIXRoaXMuX2V2ZW50cylcbiAgICB0aGlzLl9ldmVudHMgPSB7fTtcblxuICAvLyBUbyBhdm9pZCByZWN1cnNpb24gaW4gdGhlIGNhc2UgdGhhdCB0eXBlID09PSBcIm5ld0xpc3RlbmVyXCIhIEJlZm9yZVxuICAvLyBhZGRpbmcgaXQgdG8gdGhlIGxpc3RlbmVycywgZmlyc3QgZW1pdCBcIm5ld0xpc3RlbmVyXCIuXG4gIGlmICh0aGlzLl9ldmVudHMubmV3TGlzdGVuZXIpXG4gICAgdGhpcy5lbWl0KCduZXdMaXN0ZW5lcicsIHR5cGUsXG4gICAgICAgICAgICAgIGlzRnVuY3Rpb24obGlzdGVuZXIubGlzdGVuZXIpID9cbiAgICAgICAgICAgICAgbGlzdGVuZXIubGlzdGVuZXIgOiBsaXN0ZW5lcik7XG5cbiAgaWYgKCF0aGlzLl9ldmVudHNbdHlwZV0pXG4gICAgLy8gT3B0aW1pemUgdGhlIGNhc2Ugb2Ygb25lIGxpc3RlbmVyLiBEb24ndCBuZWVkIHRoZSBleHRyYSBhcnJheSBvYmplY3QuXG4gICAgdGhpcy5fZXZlbnRzW3R5cGVdID0gbGlzdGVuZXI7XG4gIGVsc2UgaWYgKGlzT2JqZWN0KHRoaXMuX2V2ZW50c1t0eXBlXSkpXG4gICAgLy8gSWYgd2UndmUgYWxyZWFkeSBnb3QgYW4gYXJyYXksIGp1c3QgYXBwZW5kLlxuICAgIHRoaXMuX2V2ZW50c1t0eXBlXS5wdXNoKGxpc3RlbmVyKTtcbiAgZWxzZVxuICAgIC8vIEFkZGluZyB0aGUgc2Vjb25kIGVsZW1lbnQsIG5lZWQgdG8gY2hhbmdlIHRvIGFycmF5LlxuICAgIHRoaXMuX2V2ZW50c1t0eXBlXSA9IFt0aGlzLl9ldmVudHNbdHlwZV0sIGxpc3RlbmVyXTtcblxuICAvLyBDaGVjayBmb3IgbGlzdGVuZXIgbGVha1xuICBpZiAoaXNPYmplY3QodGhpcy5fZXZlbnRzW3R5cGVdKSAmJiAhdGhpcy5fZXZlbnRzW3R5cGVdLndhcm5lZCkge1xuICAgIGlmICghaXNVbmRlZmluZWQodGhpcy5fbWF4TGlzdGVuZXJzKSkge1xuICAgICAgbSA9IHRoaXMuX21heExpc3RlbmVycztcbiAgICB9IGVsc2Uge1xuICAgICAgbSA9IEV2ZW50RW1pdHRlci5kZWZhdWx0TWF4TGlzdGVuZXJzO1xuICAgIH1cblxuICAgIGlmIChtICYmIG0gPiAwICYmIHRoaXMuX2V2ZW50c1t0eXBlXS5sZW5ndGggPiBtKSB7XG4gICAgICB0aGlzLl9ldmVudHNbdHlwZV0ud2FybmVkID0gdHJ1ZTtcbiAgICAgIGNvbnNvbGUuZXJyb3IoJyhub2RlKSB3YXJuaW5nOiBwb3NzaWJsZSBFdmVudEVtaXR0ZXIgbWVtb3J5ICcgK1xuICAgICAgICAgICAgICAgICAgICAnbGVhayBkZXRlY3RlZC4gJWQgbGlzdGVuZXJzIGFkZGVkLiAnICtcbiAgICAgICAgICAgICAgICAgICAgJ1VzZSBlbWl0dGVyLnNldE1heExpc3RlbmVycygpIHRvIGluY3JlYXNlIGxpbWl0LicsXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX2V2ZW50c1t0eXBlXS5sZW5ndGgpO1xuICAgICAgaWYgKHR5cGVvZiBjb25zb2xlLnRyYWNlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIC8vIG5vdCBzdXBwb3J0ZWQgaW4gSUUgMTBcbiAgICAgICAgY29uc29sZS50cmFjZSgpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiB0aGlzO1xufTtcblxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5vbiA9IEV2ZW50RW1pdHRlci5wcm90b3R5cGUuYWRkTGlzdGVuZXI7XG5cbkV2ZW50RW1pdHRlci5wcm90b3R5cGUub25jZSA9IGZ1bmN0aW9uKHR5cGUsIGxpc3RlbmVyKSB7XG4gIGlmICghaXNGdW5jdGlvbihsaXN0ZW5lcikpXG4gICAgdGhyb3cgVHlwZUVycm9yKCdsaXN0ZW5lciBtdXN0IGJlIGEgZnVuY3Rpb24nKTtcblxuICB2YXIgZmlyZWQgPSBmYWxzZTtcblxuICBmdW5jdGlvbiBnKCkge1xuICAgIHRoaXMucmVtb3ZlTGlzdGVuZXIodHlwZSwgZyk7XG5cbiAgICBpZiAoIWZpcmVkKSB7XG4gICAgICBmaXJlZCA9IHRydWU7XG4gICAgICBsaXN0ZW5lci5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIH1cbiAgfVxuXG4gIGcubGlzdGVuZXIgPSBsaXN0ZW5lcjtcbiAgdGhpcy5vbih0eXBlLCBnKTtcblxuICByZXR1cm4gdGhpcztcbn07XG5cbi8vIGVtaXRzIGEgJ3JlbW92ZUxpc3RlbmVyJyBldmVudCBpZmYgdGhlIGxpc3RlbmVyIHdhcyByZW1vdmVkXG5FdmVudEVtaXR0ZXIucHJvdG90eXBlLnJlbW92ZUxpc3RlbmVyID0gZnVuY3Rpb24odHlwZSwgbGlzdGVuZXIpIHtcbiAgdmFyIGxpc3QsIHBvc2l0aW9uLCBsZW5ndGgsIGk7XG5cbiAgaWYgKCFpc0Z1bmN0aW9uKGxpc3RlbmVyKSlcbiAgICB0aHJvdyBUeXBlRXJyb3IoJ2xpc3RlbmVyIG11c3QgYmUgYSBmdW5jdGlvbicpO1xuXG4gIGlmICghdGhpcy5fZXZlbnRzIHx8ICF0aGlzLl9ldmVudHNbdHlwZV0pXG4gICAgcmV0dXJuIHRoaXM7XG5cbiAgbGlzdCA9IHRoaXMuX2V2ZW50c1t0eXBlXTtcbiAgbGVuZ3RoID0gbGlzdC5sZW5ndGg7XG4gIHBvc2l0aW9uID0gLTE7XG5cbiAgaWYgKGxpc3QgPT09IGxpc3RlbmVyIHx8XG4gICAgICAoaXNGdW5jdGlvbihsaXN0Lmxpc3RlbmVyKSAmJiBsaXN0Lmxpc3RlbmVyID09PSBsaXN0ZW5lcikpIHtcbiAgICBkZWxldGUgdGhpcy5fZXZlbnRzW3R5cGVdO1xuICAgIGlmICh0aGlzLl9ldmVudHMucmVtb3ZlTGlzdGVuZXIpXG4gICAgICB0aGlzLmVtaXQoJ3JlbW92ZUxpc3RlbmVyJywgdHlwZSwgbGlzdGVuZXIpO1xuXG4gIH0gZWxzZSBpZiAoaXNPYmplY3QobGlzdCkpIHtcbiAgICBmb3IgKGkgPSBsZW5ndGg7IGktLSA+IDA7KSB7XG4gICAgICBpZiAobGlzdFtpXSA9PT0gbGlzdGVuZXIgfHxcbiAgICAgICAgICAobGlzdFtpXS5saXN0ZW5lciAmJiBsaXN0W2ldLmxpc3RlbmVyID09PSBsaXN0ZW5lcikpIHtcbiAgICAgICAgcG9zaXRpb24gPSBpO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAocG9zaXRpb24gPCAwKVxuICAgICAgcmV0dXJuIHRoaXM7XG5cbiAgICBpZiAobGlzdC5sZW5ndGggPT09IDEpIHtcbiAgICAgIGxpc3QubGVuZ3RoID0gMDtcbiAgICAgIGRlbGV0ZSB0aGlzLl9ldmVudHNbdHlwZV07XG4gICAgfSBlbHNlIHtcbiAgICAgIGxpc3Quc3BsaWNlKHBvc2l0aW9uLCAxKTtcbiAgICB9XG5cbiAgICBpZiAodGhpcy5fZXZlbnRzLnJlbW92ZUxpc3RlbmVyKVxuICAgICAgdGhpcy5lbWl0KCdyZW1vdmVMaXN0ZW5lcicsIHR5cGUsIGxpc3RlbmVyKTtcbiAgfVxuXG4gIHJldHVybiB0aGlzO1xufTtcblxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5yZW1vdmVBbGxMaXN0ZW5lcnMgPSBmdW5jdGlvbih0eXBlKSB7XG4gIHZhciBrZXksIGxpc3RlbmVycztcblxuICBpZiAoIXRoaXMuX2V2ZW50cylcbiAgICByZXR1cm4gdGhpcztcblxuICAvLyBub3QgbGlzdGVuaW5nIGZvciByZW1vdmVMaXN0ZW5lciwgbm8gbmVlZCB0byBlbWl0XG4gIGlmICghdGhpcy5fZXZlbnRzLnJlbW92ZUxpc3RlbmVyKSB7XG4gICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDApXG4gICAgICB0aGlzLl9ldmVudHMgPSB7fTtcbiAgICBlbHNlIGlmICh0aGlzLl9ldmVudHNbdHlwZV0pXG4gICAgICBkZWxldGUgdGhpcy5fZXZlbnRzW3R5cGVdO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLy8gZW1pdCByZW1vdmVMaXN0ZW5lciBmb3IgYWxsIGxpc3RlbmVycyBvbiBhbGwgZXZlbnRzXG4gIGlmIChhcmd1bWVudHMubGVuZ3RoID09PSAwKSB7XG4gICAgZm9yIChrZXkgaW4gdGhpcy5fZXZlbnRzKSB7XG4gICAgICBpZiAoa2V5ID09PSAncmVtb3ZlTGlzdGVuZXInKSBjb250aW51ZTtcbiAgICAgIHRoaXMucmVtb3ZlQWxsTGlzdGVuZXJzKGtleSk7XG4gICAgfVxuICAgIHRoaXMucmVtb3ZlQWxsTGlzdGVuZXJzKCdyZW1vdmVMaXN0ZW5lcicpO1xuICAgIHRoaXMuX2V2ZW50cyA9IHt9O1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgbGlzdGVuZXJzID0gdGhpcy5fZXZlbnRzW3R5cGVdO1xuXG4gIGlmIChpc0Z1bmN0aW9uKGxpc3RlbmVycykpIHtcbiAgICB0aGlzLnJlbW92ZUxpc3RlbmVyKHR5cGUsIGxpc3RlbmVycyk7XG4gIH0gZWxzZSBpZiAobGlzdGVuZXJzKSB7XG4gICAgLy8gTElGTyBvcmRlclxuICAgIHdoaWxlIChsaXN0ZW5lcnMubGVuZ3RoKVxuICAgICAgdGhpcy5yZW1vdmVMaXN0ZW5lcih0eXBlLCBsaXN0ZW5lcnNbbGlzdGVuZXJzLmxlbmd0aCAtIDFdKTtcbiAgfVxuICBkZWxldGUgdGhpcy5fZXZlbnRzW3R5cGVdO1xuXG4gIHJldHVybiB0aGlzO1xufTtcblxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5saXN0ZW5lcnMgPSBmdW5jdGlvbih0eXBlKSB7XG4gIHZhciByZXQ7XG4gIGlmICghdGhpcy5fZXZlbnRzIHx8ICF0aGlzLl9ldmVudHNbdHlwZV0pXG4gICAgcmV0ID0gW107XG4gIGVsc2UgaWYgKGlzRnVuY3Rpb24odGhpcy5fZXZlbnRzW3R5cGVdKSlcbiAgICByZXQgPSBbdGhpcy5fZXZlbnRzW3R5cGVdXTtcbiAgZWxzZVxuICAgIHJldCA9IHRoaXMuX2V2ZW50c1t0eXBlXS5zbGljZSgpO1xuICByZXR1cm4gcmV0O1xufTtcblxuRXZlbnRFbWl0dGVyLnByb3RvdHlwZS5saXN0ZW5lckNvdW50ID0gZnVuY3Rpb24odHlwZSkge1xuICBpZiAodGhpcy5fZXZlbnRzKSB7XG4gICAgdmFyIGV2bGlzdGVuZXIgPSB0aGlzLl9ldmVudHNbdHlwZV07XG5cbiAgICBpZiAoaXNGdW5jdGlvbihldmxpc3RlbmVyKSlcbiAgICAgIHJldHVybiAxO1xuICAgIGVsc2UgaWYgKGV2bGlzdGVuZXIpXG4gICAgICByZXR1cm4gZXZsaXN0ZW5lci5sZW5ndGg7XG4gIH1cbiAgcmV0dXJuIDA7XG59O1xuXG5FdmVudEVtaXR0ZXIubGlzdGVuZXJDb3VudCA9IGZ1bmN0aW9uKGVtaXR0ZXIsIHR5cGUpIHtcbiAgcmV0dXJuIGVtaXR0ZXIubGlzdGVuZXJDb3VudCh0eXBlKTtcbn07XG5cbmZ1bmN0aW9uIGlzRnVuY3Rpb24oYXJnKSB7XG4gIHJldHVybiB0eXBlb2YgYXJnID09PSAnZnVuY3Rpb24nO1xufVxuXG5mdW5jdGlvbiBpc051bWJlcihhcmcpIHtcbiAgcmV0dXJuIHR5cGVvZiBhcmcgPT09ICdudW1iZXInO1xufVxuXG5mdW5jdGlvbiBpc09iamVjdChhcmcpIHtcbiAgcmV0dXJuIHR5cGVvZiBhcmcgPT09ICdvYmplY3QnICYmIGFyZyAhPT0gbnVsbDtcbn1cblxuZnVuY3Rpb24gaXNVbmRlZmluZWQoYXJnKSB7XG4gIHJldHVybiBhcmcgPT09IHZvaWQgMDtcbn1cbiIsIihmdW5jdGlvbigpe3ZhciBrPSEhZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcjtmdW5jdGlvbiBsKGEsYil7az9hLmFkZEV2ZW50TGlzdGVuZXIoXCJzY3JvbGxcIixiLCExKTphLmF0dGFjaEV2ZW50KFwic2Nyb2xsXCIsYil9ZnVuY3Rpb24gdihhKXtkb2N1bWVudC5ib2R5P2EoKTprP2RvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoXCJET01Db250ZW50TG9hZGVkXCIsYSk6ZG9jdW1lbnQuYXR0YWNoRXZlbnQoXCJvbnJlYWR5c3RhdGVjaGFuZ2VcIixmdW5jdGlvbigpe1wiaW50ZXJhY3RpdmVcIiE9ZG9jdW1lbnQucmVhZHlTdGF0ZSYmXCJjb21wbGV0ZVwiIT1kb2N1bWVudC5yZWFkeVN0YXRlfHxhKCl9KX07ZnVuY3Rpb24gdyhhKXt0aGlzLmE9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImRpdlwiKTt0aGlzLmEuc2V0QXR0cmlidXRlKFwiYXJpYS1oaWRkZW5cIixcInRydWVcIik7dGhpcy5hLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKGEpKTt0aGlzLmI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInNwYW5cIik7dGhpcy5jPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJzcGFuXCIpO3RoaXMuaD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KFwic3BhblwiKTt0aGlzLmY9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcInNwYW5cIik7dGhpcy5nPS0xO3RoaXMuYi5zdHlsZS5jc3NUZXh0PVwibWF4LXdpZHRoOm5vbmU7ZGlzcGxheTppbmxpbmUtYmxvY2s7cG9zaXRpb246YWJzb2x1dGU7aGVpZ2h0OjEwMCU7d2lkdGg6MTAwJTtvdmVyZmxvdzpzY3JvbGw7Zm9udC1zaXplOjE2cHg7XCI7dGhpcy5jLnN0eWxlLmNzc1RleHQ9XCJtYXgtd2lkdGg6bm9uZTtkaXNwbGF5OmlubGluZS1ibG9jaztwb3NpdGlvbjphYnNvbHV0ZTtoZWlnaHQ6MTAwJTt3aWR0aDoxMDAlO292ZXJmbG93OnNjcm9sbDtmb250LXNpemU6MTZweDtcIjtcbnRoaXMuZi5zdHlsZS5jc3NUZXh0PVwibWF4LXdpZHRoOm5vbmU7ZGlzcGxheTppbmxpbmUtYmxvY2s7cG9zaXRpb246YWJzb2x1dGU7aGVpZ2h0OjEwMCU7d2lkdGg6MTAwJTtvdmVyZmxvdzpzY3JvbGw7Zm9udC1zaXplOjE2cHg7XCI7dGhpcy5oLnN0eWxlLmNzc1RleHQ9XCJkaXNwbGF5OmlubGluZS1ibG9jazt3aWR0aDoyMDAlO2hlaWdodDoyMDAlO2ZvbnQtc2l6ZToxNnB4O21heC13aWR0aDpub25lO1wiO3RoaXMuYi5hcHBlbmRDaGlsZCh0aGlzLmgpO3RoaXMuYy5hcHBlbmRDaGlsZCh0aGlzLmYpO3RoaXMuYS5hcHBlbmRDaGlsZCh0aGlzLmIpO3RoaXMuYS5hcHBlbmRDaGlsZCh0aGlzLmMpfVxuZnVuY3Rpb24geShhLGIpe2EuYS5zdHlsZS5jc3NUZXh0PVwibWF4LXdpZHRoOm5vbmU7bWluLXdpZHRoOjIwcHg7bWluLWhlaWdodDoyMHB4O2Rpc3BsYXk6aW5saW5lLWJsb2NrO292ZXJmbG93OmhpZGRlbjtwb3NpdGlvbjphYnNvbHV0ZTt3aWR0aDphdXRvO21hcmdpbjowO3BhZGRpbmc6MDt0b3A6LTk5OXB4O2xlZnQ6LTk5OXB4O3doaXRlLXNwYWNlOm5vd3JhcDtmb250OlwiK2IrXCI7XCJ9ZnVuY3Rpb24geihhKXt2YXIgYj1hLmEub2Zmc2V0V2lkdGgsYz1iKzEwMDthLmYuc3R5bGUud2lkdGg9YytcInB4XCI7YS5jLnNjcm9sbExlZnQ9YzthLmIuc2Nyb2xsTGVmdD1hLmIuc2Nyb2xsV2lkdGgrMTAwO3JldHVybiBhLmchPT1iPyhhLmc9YiwhMCk6ITF9ZnVuY3Rpb24gQShhLGIpe2Z1bmN0aW9uIGMoKXt2YXIgYT1tO3ooYSkmJm51bGwhPT1hLmEucGFyZW50Tm9kZSYmYihhLmcpfXZhciBtPWE7bChhLmIsYyk7bChhLmMsYyk7eihhKX07ZnVuY3Rpb24gQihhLGIpe3ZhciBjPWJ8fHt9O3RoaXMuZmFtaWx5PWE7dGhpcy5zdHlsZT1jLnN0eWxlfHxcIm5vcm1hbFwiO3RoaXMud2VpZ2h0PWMud2VpZ2h0fHxcIm5vcm1hbFwiO3RoaXMuc3RyZXRjaD1jLnN0cmV0Y2h8fFwibm9ybWFsXCJ9dmFyIEM9bnVsbCxEPW51bGwsSD0hIXdpbmRvdy5Gb250RmFjZTtmdW5jdGlvbiBJKCl7aWYobnVsbD09PUQpe3ZhciBhPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIik7dHJ5e2Euc3R5bGUuZm9udD1cImNvbmRlbnNlZCAxMDBweCBzYW5zLXNlcmlmXCJ9Y2F0Y2goYil7fUQ9XCJcIiE9PWEuc3R5bGUuZm9udH1yZXR1cm4gRH1mdW5jdGlvbiBKKGEsYil7cmV0dXJuW2Euc3R5bGUsYS53ZWlnaHQsSSgpP2Euc3RyZXRjaDpcIlwiLFwiMTAwcHhcIixiXS5qb2luKFwiIFwiKX1cbkIucHJvdG90eXBlLmxvYWQ9ZnVuY3Rpb24oYSxiKXt2YXIgYz10aGlzLG09YXx8XCJCRVNic3d5XCIseD1ifHwzRTMsRT0obmV3IERhdGUpLmdldFRpbWUoKTtyZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24oYSxiKXtpZihIKXt2YXIgSz1uZXcgUHJvbWlzZShmdW5jdGlvbihhLGIpe2Z1bmN0aW9uIGUoKXsobmV3IERhdGUpLmdldFRpbWUoKS1FPj14P2IoKTpkb2N1bWVudC5mb250cy5sb2FkKEooYyxjLmZhbWlseSksbSkudGhlbihmdW5jdGlvbihjKXsxPD1jLmxlbmd0aD9hKCk6c2V0VGltZW91dChlLDI1KX0sZnVuY3Rpb24oKXtiKCl9KX1lKCl9KSxMPW5ldyBQcm9taXNlKGZ1bmN0aW9uKGEsYyl7c2V0VGltZW91dChjLHgpfSk7UHJvbWlzZS5yYWNlKFtMLEtdKS50aGVuKGZ1bmN0aW9uKCl7YShjKX0sZnVuY3Rpb24oKXtiKGMpfSl9ZWxzZSB2KGZ1bmN0aW9uKCl7ZnVuY3Rpb24gcSgpe3ZhciBiO2lmKGI9LTEhPWYmJi0xIT1nfHwtMSE9ZiYmLTEhPWh8fC0xIT1nJiYtMSE9XG5oKShiPWYhPWcmJmYhPWgmJmchPWgpfHwobnVsbD09PUMmJihiPS9BcHBsZVdlYktpdFxcLyhbMC05XSspKD86XFwuKFswLTldKykpLy5leGVjKHdpbmRvdy5uYXZpZ2F0b3IudXNlckFnZW50KSxDPSEhYiYmKDUzNj5wYXJzZUludChiWzFdLDEwKXx8NTM2PT09cGFyc2VJbnQoYlsxXSwxMCkmJjExPj1wYXJzZUludChiWzJdLDEwKSkpLGI9QyYmKGY9PXImJmc9PXImJmg9PXJ8fGY9PXQmJmc9PXQmJmg9PXR8fGY9PXUmJmc9PXUmJmg9PXUpKSxiPSFiO2ImJihudWxsIT09ZC5wYXJlbnROb2RlJiZkLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoZCksY2xlYXJUaW1lb3V0KEcpLGEoYykpfWZ1bmN0aW9uIEYoKXtpZigobmV3IERhdGUpLmdldFRpbWUoKS1FPj14KW51bGwhPT1kLnBhcmVudE5vZGUmJmQucGFyZW50Tm9kZS5yZW1vdmVDaGlsZChkKSxiKGMpO2Vsc2V7dmFyIGE9ZG9jdW1lbnQuaGlkZGVuO2lmKCEwPT09YXx8dm9pZCAwPT09YSlmPWUuYS5vZmZzZXRXaWR0aCxnPW4uYS5vZmZzZXRXaWR0aCxcbmg9cC5hLm9mZnNldFdpZHRoLHEoKTtHPXNldFRpbWVvdXQoRiw1MCl9fXZhciBlPW5ldyB3KG0pLG49bmV3IHcobSkscD1uZXcgdyhtKSxmPS0xLGc9LTEsaD0tMSxyPS0xLHQ9LTEsdT0tMSxkPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIiksRz0wO2QuZGlyPVwibHRyXCI7eShlLEooYyxcInNhbnMtc2VyaWZcIikpO3kobixKKGMsXCJzZXJpZlwiKSk7eShwLEooYyxcIm1vbm9zcGFjZVwiKSk7ZC5hcHBlbmRDaGlsZChlLmEpO2QuYXBwZW5kQ2hpbGQobi5hKTtkLmFwcGVuZENoaWxkKHAuYSk7ZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChkKTtyPWUuYS5vZmZzZXRXaWR0aDt0PW4uYS5vZmZzZXRXaWR0aDt1PXAuYS5vZmZzZXRXaWR0aDtGKCk7QShlLGZ1bmN0aW9uKGEpe2Y9YTtxKCl9KTt5KGUsSihjLCdcIicrYy5mYW1pbHkrJ1wiLHNhbnMtc2VyaWYnKSk7QShuLGZ1bmN0aW9uKGEpe2c9YTtxKCl9KTt5KG4sSihjLCdcIicrYy5mYW1pbHkrJ1wiLHNlcmlmJykpO0EocCxmdW5jdGlvbihhKXtoPVxuYTtxKCl9KTt5KHAsSihjLCdcIicrYy5mYW1pbHkrJ1wiLG1vbm9zcGFjZScpKX0pfSl9O3dpbmRvdy5Gb250RmFjZU9ic2VydmVyPUI7d2luZG93LkZvbnRGYWNlT2JzZXJ2ZXIucHJvdG90eXBlLmNoZWNrPXdpbmRvdy5Gb250RmFjZU9ic2VydmVyLnByb3RvdHlwZS5sb2FkPUIucHJvdG90eXBlLmxvYWQ7XCJ1bmRlZmluZWRcIiE9PXR5cGVvZiBtb2R1bGUmJihtb2R1bGUuZXhwb3J0cz13aW5kb3cuRm9udEZhY2VPYnNlcnZlcik7fSgpKTtcbiIsIid1c2Ugc3RyaWN0JztcblxubW9kdWxlLmV4cG9ydHMgPSBjbGlwO1xuXG4vKiBjbGlwIGZlYXR1cmVzIGJldHdlZW4gdHdvIGF4aXMtcGFyYWxsZWwgbGluZXM6XG4gKiAgICAgfCAgICAgICAgfFxuICogIF9fX3xfX18gICAgIHwgICAgIC9cbiAqIC8gICB8ICAgXFxfX19ffF9fX18vXG4gKiAgICAgfCAgICAgICAgfFxuICovXG5cbmZ1bmN0aW9uIGNsaXAoZmVhdHVyZXMsIHNjYWxlLCBrMSwgazIsIGF4aXMsIGludGVyc2VjdCwgbWluQWxsLCBtYXhBbGwpIHtcblxuICAgIGsxIC89IHNjYWxlO1xuICAgIGsyIC89IHNjYWxlO1xuXG4gICAgaWYgKG1pbkFsbCA+PSBrMSAmJiBtYXhBbGwgPD0gazIpIHJldHVybiBmZWF0dXJlczsgLy8gdHJpdmlhbCBhY2NlcHRcbiAgICBlbHNlIGlmIChtaW5BbGwgPiBrMiB8fCBtYXhBbGwgPCBrMSkgcmV0dXJuIG51bGw7IC8vIHRyaXZpYWwgcmVqZWN0XG5cbiAgICB2YXIgY2xpcHBlZCA9IFtdO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBmZWF0dXJlcy5sZW5ndGg7IGkrKykge1xuXG4gICAgICAgIHZhciBmZWF0dXJlID0gZmVhdHVyZXNbaV0sXG4gICAgICAgICAgICBnZW9tZXRyeSA9IGZlYXR1cmUuZ2VvbWV0cnksXG4gICAgICAgICAgICB0eXBlID0gZmVhdHVyZS50eXBlLFxuICAgICAgICAgICAgbWluLCBtYXg7XG5cbiAgICAgICAgbWluID0gZmVhdHVyZS5taW5bYXhpc107XG4gICAgICAgIG1heCA9IGZlYXR1cmUubWF4W2F4aXNdO1xuXG4gICAgICAgIGlmIChtaW4gPj0gazEgJiYgbWF4IDw9IGsyKSB7IC8vIHRyaXZpYWwgYWNjZXB0XG4gICAgICAgICAgICBjbGlwcGVkLnB1c2goZmVhdHVyZSk7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfSBlbHNlIGlmIChtaW4gPiBrMiB8fCBtYXggPCBrMSkgY29udGludWU7IC8vIHRyaXZpYWwgcmVqZWN0XG5cbiAgICAgICAgdmFyIHNsaWNlcyA9IHR5cGUgPT09IDEgP1xuICAgICAgICAgICAgICAgIGNsaXBQb2ludHMoZ2VvbWV0cnksIGsxLCBrMiwgYXhpcykgOlxuICAgICAgICAgICAgICAgIGNsaXBHZW9tZXRyeShnZW9tZXRyeSwgazEsIGsyLCBheGlzLCBpbnRlcnNlY3QsIHR5cGUgPT09IDMpO1xuXG4gICAgICAgIGlmIChzbGljZXMubGVuZ3RoKSB7XG4gICAgICAgICAgICAvLyBpZiBhIGZlYXR1cmUgZ290IGNsaXBwZWQsIGl0IHdpbGwgbGlrZWx5IGdldCBjbGlwcGVkIG9uIHRoZSBuZXh0IHpvb20gbGV2ZWwgYXMgd2VsbCxcbiAgICAgICAgICAgIC8vIHNvIHRoZXJlJ3Mgbm8gbmVlZCB0byByZWNhbGN1bGF0ZSBiYm94ZXNcbiAgICAgICAgICAgIGNsaXBwZWQucHVzaCh7XG4gICAgICAgICAgICAgICAgZ2VvbWV0cnk6IHNsaWNlcyxcbiAgICAgICAgICAgICAgICB0eXBlOiB0eXBlLFxuICAgICAgICAgICAgICAgIHRhZ3M6IGZlYXR1cmVzW2ldLnRhZ3MgfHwgbnVsbCxcbiAgICAgICAgICAgICAgICBtaW46IGZlYXR1cmUubWluLFxuICAgICAgICAgICAgICAgIG1heDogZmVhdHVyZS5tYXhcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGNsaXBwZWQubGVuZ3RoID8gY2xpcHBlZCA6IG51bGw7XG59XG5cbmZ1bmN0aW9uIGNsaXBQb2ludHMoZ2VvbWV0cnksIGsxLCBrMiwgYXhpcykge1xuICAgIHZhciBzbGljZSA9IFtdO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBnZW9tZXRyeS5sZW5ndGg7IGkrKykge1xuICAgICAgICB2YXIgYSA9IGdlb21ldHJ5W2ldLFxuICAgICAgICAgICAgYWsgPSBhW2F4aXNdO1xuXG4gICAgICAgIGlmIChhayA+PSBrMSAmJiBhayA8PSBrMikgc2xpY2UucHVzaChhKTtcbiAgICB9XG4gICAgcmV0dXJuIHNsaWNlO1xufVxuXG5mdW5jdGlvbiBjbGlwR2VvbWV0cnkoZ2VvbWV0cnksIGsxLCBrMiwgYXhpcywgaW50ZXJzZWN0LCBjbG9zZWQpIHtcblxuICAgIHZhciBzbGljZXMgPSBbXTtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZ2VvbWV0cnkubGVuZ3RoOyBpKyspIHtcblxuICAgICAgICB2YXIgYWsgPSAwLFxuICAgICAgICAgICAgYmsgPSAwLFxuICAgICAgICAgICAgYiA9IG51bGwsXG4gICAgICAgICAgICBwb2ludHMgPSBnZW9tZXRyeVtpXSxcbiAgICAgICAgICAgIGFyZWEgPSBwb2ludHMuYXJlYSxcbiAgICAgICAgICAgIGRpc3QgPSBwb2ludHMuZGlzdCxcbiAgICAgICAgICAgIGxlbiA9IHBvaW50cy5sZW5ndGgsXG4gICAgICAgICAgICBhLCBqLCBsYXN0O1xuXG4gICAgICAgIHZhciBzbGljZSA9IFtdO1xuXG4gICAgICAgIGZvciAoaiA9IDA7IGogPCBsZW4gLSAxOyBqKyspIHtcbiAgICAgICAgICAgIGEgPSBiIHx8IHBvaW50c1tqXTtcbiAgICAgICAgICAgIGIgPSBwb2ludHNbaiArIDFdO1xuICAgICAgICAgICAgYWsgPSBiayB8fCBhW2F4aXNdO1xuICAgICAgICAgICAgYmsgPSBiW2F4aXNdO1xuXG4gICAgICAgICAgICBpZiAoYWsgPCBrMSkge1xuXG4gICAgICAgICAgICAgICAgaWYgKChiayA+IGsyKSkgeyAvLyAtLS18LS0tLS18LS0+XG4gICAgICAgICAgICAgICAgICAgIHNsaWNlLnB1c2goaW50ZXJzZWN0KGEsIGIsIGsxKSwgaW50ZXJzZWN0KGEsIGIsIGsyKSk7XG4gICAgICAgICAgICAgICAgICAgIGlmICghY2xvc2VkKSBzbGljZSA9IG5ld1NsaWNlKHNsaWNlcywgc2xpY2UsIGFyZWEsIGRpc3QpO1xuXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChiayA+PSBrMSkgc2xpY2UucHVzaChpbnRlcnNlY3QoYSwgYiwgazEpKTsgLy8gLS0tfC0tPiAgfFxuXG4gICAgICAgICAgICB9IGVsc2UgaWYgKGFrID4gazIpIHtcblxuICAgICAgICAgICAgICAgIGlmICgoYmsgPCBrMSkpIHsgLy8gPC0tfC0tLS0tfC0tLVxuICAgICAgICAgICAgICAgICAgICBzbGljZS5wdXNoKGludGVyc2VjdChhLCBiLCBrMiksIGludGVyc2VjdChhLCBiLCBrMSkpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWNsb3NlZCkgc2xpY2UgPSBuZXdTbGljZShzbGljZXMsIHNsaWNlLCBhcmVhLCBkaXN0KTtcblxuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYmsgPD0gazIpIHNsaWNlLnB1c2goaW50ZXJzZWN0KGEsIGIsIGsyKSk7IC8vIHwgIDwtLXwtLS1cblxuICAgICAgICAgICAgfSBlbHNlIHtcblxuICAgICAgICAgICAgICAgIHNsaWNlLnB1c2goYSk7XG5cbiAgICAgICAgICAgICAgICBpZiAoYmsgPCBrMSkgeyAvLyA8LS18LS0tICB8XG4gICAgICAgICAgICAgICAgICAgIHNsaWNlLnB1c2goaW50ZXJzZWN0KGEsIGIsIGsxKSk7XG4gICAgICAgICAgICAgICAgICAgIGlmICghY2xvc2VkKSBzbGljZSA9IG5ld1NsaWNlKHNsaWNlcywgc2xpY2UsIGFyZWEsIGRpc3QpO1xuXG4gICAgICAgICAgICAgICAgfSBlbHNlIGlmIChiayA+IGsyKSB7IC8vIHwgIC0tLXwtLT5cbiAgICAgICAgICAgICAgICAgICAgc2xpY2UucHVzaChpbnRlcnNlY3QoYSwgYiwgazIpKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFjbG9zZWQpIHNsaWNlID0gbmV3U2xpY2Uoc2xpY2VzLCBzbGljZSwgYXJlYSwgZGlzdCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIHwgLS0+IHxcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGFkZCB0aGUgbGFzdCBwb2ludFxuICAgICAgICBhID0gcG9pbnRzW2xlbiAtIDFdO1xuICAgICAgICBhayA9IGFbYXhpc107XG4gICAgICAgIGlmIChhayA+PSBrMSAmJiBhayA8PSBrMikgc2xpY2UucHVzaChhKTtcblxuICAgICAgICAvLyBjbG9zZSB0aGUgcG9seWdvbiBpZiBpdHMgZW5kcG9pbnRzIGFyZSBub3QgdGhlIHNhbWUgYWZ0ZXIgY2xpcHBpbmdcblxuICAgICAgICBsYXN0ID0gc2xpY2Vbc2xpY2UubGVuZ3RoIC0gMV07XG4gICAgICAgIGlmIChjbG9zZWQgJiYgbGFzdCAmJiAoc2xpY2VbMF1bMF0gIT09IGxhc3RbMF0gfHwgc2xpY2VbMF1bMV0gIT09IGxhc3RbMV0pKSBzbGljZS5wdXNoKHNsaWNlWzBdKTtcblxuICAgICAgICAvLyBhZGQgdGhlIGZpbmFsIHNsaWNlXG4gICAgICAgIG5ld1NsaWNlKHNsaWNlcywgc2xpY2UsIGFyZWEsIGRpc3QpO1xuICAgIH1cblxuICAgIHJldHVybiBzbGljZXM7XG59XG5cbmZ1bmN0aW9uIG5ld1NsaWNlKHNsaWNlcywgc2xpY2UsIGFyZWEsIGRpc3QpIHtcbiAgICBpZiAoc2xpY2UubGVuZ3RoKSB7XG4gICAgICAgIC8vIHdlIGRvbid0IHJlY2FsY3VsYXRlIHRoZSBhcmVhL2xlbmd0aCBvZiB0aGUgdW5jbGlwcGVkIGdlb21ldHJ5IGJlY2F1c2UgdGhlIGNhc2Ugd2hlcmUgaXQgZ29lc1xuICAgICAgICAvLyBiZWxvdyB0aGUgdmlzaWJpbGl0eSB0aHJlc2hvbGQgYXMgYSByZXN1bHQgb2YgY2xpcHBpbmcgaXMgcmFyZSwgc28gd2UgYXZvaWQgZG9pbmcgdW5uZWNlc3Nhcnkgd29ya1xuICAgICAgICBzbGljZS5hcmVhID0gYXJlYTtcbiAgICAgICAgc2xpY2UuZGlzdCA9IGRpc3Q7XG5cbiAgICAgICAgc2xpY2VzLnB1c2goc2xpY2UpO1xuICAgIH1cbiAgICByZXR1cm4gW107XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbm1vZHVsZS5leHBvcnRzID0gY29udmVydDtcblxudmFyIHNpbXBsaWZ5ID0gcmVxdWlyZSgnLi9zaW1wbGlmeScpO1xuXG4vLyBjb252ZXJ0cyBHZW9KU09OIGZlYXR1cmUgaW50byBhbiBpbnRlcm1lZGlhdGUgcHJvamVjdGVkIEpTT04gdmVjdG9yIGZvcm1hdCB3aXRoIHNpbXBsaWZpY2F0aW9uIGRhdGFcblxuZnVuY3Rpb24gY29udmVydChkYXRhLCB0b2xlcmFuY2UpIHtcbiAgICB2YXIgZmVhdHVyZXMgPSBbXTtcblxuICAgIGlmIChkYXRhLnR5cGUgPT09ICdGZWF0dXJlQ29sbGVjdGlvbicpIHtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBkYXRhLmZlYXR1cmVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBjb252ZXJ0RmVhdHVyZShmZWF0dXJlcywgZGF0YS5mZWF0dXJlc1tpXSwgdG9sZXJhbmNlKTtcbiAgICAgICAgfVxuICAgIH0gZWxzZSBpZiAoZGF0YS50eXBlID09PSAnRmVhdHVyZScpIHtcbiAgICAgICAgY29udmVydEZlYXR1cmUoZmVhdHVyZXMsIGRhdGEsIHRvbGVyYW5jZSk7XG5cbiAgICB9IGVsc2Uge1xuICAgICAgICAvLyBzaW5nbGUgZ2VvbWV0cnkgb3IgYSBnZW9tZXRyeSBjb2xsZWN0aW9uXG4gICAgICAgIGNvbnZlcnRGZWF0dXJlKGZlYXR1cmVzLCB7Z2VvbWV0cnk6IGRhdGF9LCB0b2xlcmFuY2UpO1xuICAgIH1cbiAgICByZXR1cm4gZmVhdHVyZXM7XG59XG5cbmZ1bmN0aW9uIGNvbnZlcnRGZWF0dXJlKGZlYXR1cmVzLCBmZWF0dXJlLCB0b2xlcmFuY2UpIHtcbiAgICB2YXIgZ2VvbSA9IGZlYXR1cmUuZ2VvbWV0cnksXG4gICAgICAgIHR5cGUgPSBnZW9tLnR5cGUsXG4gICAgICAgIGNvb3JkcyA9IGdlb20uY29vcmRpbmF0ZXMsXG4gICAgICAgIHRhZ3MgPSBmZWF0dXJlLnByb3BlcnRpZXMsXG4gICAgICAgIGksIGosIHJpbmdzO1xuXG4gICAgaWYgKHR5cGUgPT09ICdQb2ludCcpIHtcbiAgICAgICAgZmVhdHVyZXMucHVzaChjcmVhdGUodGFncywgMSwgW3Byb2plY3RQb2ludChjb29yZHMpXSkpO1xuXG4gICAgfSBlbHNlIGlmICh0eXBlID09PSAnTXVsdGlQb2ludCcpIHtcbiAgICAgICAgZmVhdHVyZXMucHVzaChjcmVhdGUodGFncywgMSwgcHJvamVjdChjb29yZHMpKSk7XG5cbiAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdMaW5lU3RyaW5nJykge1xuICAgICAgICBmZWF0dXJlcy5wdXNoKGNyZWF0ZSh0YWdzLCAyLCBbcHJvamVjdChjb29yZHMsIHRvbGVyYW5jZSldKSk7XG5cbiAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdNdWx0aUxpbmVTdHJpbmcnIHx8IHR5cGUgPT09ICdQb2x5Z29uJykge1xuICAgICAgICByaW5ncyA9IFtdO1xuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgY29vcmRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICByaW5ncy5wdXNoKHByb2plY3QoY29vcmRzW2ldLCB0b2xlcmFuY2UpKTtcbiAgICAgICAgfVxuICAgICAgICBmZWF0dXJlcy5wdXNoKGNyZWF0ZSh0YWdzLCB0eXBlID09PSAnUG9seWdvbicgPyAzIDogMiwgcmluZ3MpKTtcblxuICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ011bHRpUG9seWdvbicpIHtcbiAgICAgICAgcmluZ3MgPSBbXTtcbiAgICAgICAgZm9yIChpID0gMDsgaSA8IGNvb3Jkcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IGNvb3Jkc1tpXS5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgICAgIHJpbmdzLnB1c2gocHJvamVjdChjb29yZHNbaV1bal0sIHRvbGVyYW5jZSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGZlYXR1cmVzLnB1c2goY3JlYXRlKHRhZ3MsIDMsIHJpbmdzKSk7XG5cbiAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdHZW9tZXRyeUNvbGxlY3Rpb24nKSB7XG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCBnZW9tLmdlb21ldHJpZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGNvbnZlcnRGZWF0dXJlKGZlYXR1cmVzLCB7XG4gICAgICAgICAgICAgICAgZ2VvbWV0cnk6IGdlb20uZ2VvbWV0cmllc1tpXSxcbiAgICAgICAgICAgICAgICBwcm9wZXJ0aWVzOiB0YWdzXG4gICAgICAgICAgICB9LCB0b2xlcmFuY2UpO1xuICAgICAgICB9XG5cbiAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ0lucHV0IGRhdGEgaXMgbm90IGEgdmFsaWQgR2VvSlNPTiBvYmplY3QuJyk7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBjcmVhdGUodGFncywgdHlwZSwgZ2VvbWV0cnkpIHtcbiAgICB2YXIgZmVhdHVyZSA9IHtcbiAgICAgICAgZ2VvbWV0cnk6IGdlb21ldHJ5LFxuICAgICAgICB0eXBlOiB0eXBlLFxuICAgICAgICB0YWdzOiB0YWdzIHx8IG51bGwsXG4gICAgICAgIG1pbjogWzIsIDFdLCAvLyBpbml0aWFsIGJib3ggdmFsdWVzO1xuICAgICAgICBtYXg6IFstMSwgMF0gIC8vIG5vdGUgdGhhdCBjb29yZHMgYXJlIHVzdWFsbHkgaW4gWzAuLjFdIHJhbmdlXG4gICAgfTtcbiAgICBjYWxjQkJveChmZWF0dXJlKTtcbiAgICByZXR1cm4gZmVhdHVyZTtcbn1cblxuZnVuY3Rpb24gcHJvamVjdChsb25sYXRzLCB0b2xlcmFuY2UpIHtcbiAgICB2YXIgcHJvamVjdGVkID0gW107XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsb25sYXRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHByb2plY3RlZC5wdXNoKHByb2plY3RQb2ludChsb25sYXRzW2ldKSk7XG4gICAgfVxuICAgIGlmICh0b2xlcmFuY2UpIHtcbiAgICAgICAgc2ltcGxpZnkocHJvamVjdGVkLCB0b2xlcmFuY2UpO1xuICAgICAgICBjYWxjU2l6ZShwcm9qZWN0ZWQpO1xuICAgIH1cbiAgICByZXR1cm4gcHJvamVjdGVkO1xufVxuXG5mdW5jdGlvbiBwcm9qZWN0UG9pbnQocCkge1xuICAgIHZhciBzaW4gPSBNYXRoLnNpbihwWzFdICogTWF0aC5QSSAvIDE4MCksXG4gICAgICAgIHggPSAocFswXSAvIDM2MCArIDAuNSksXG4gICAgICAgIHkgPSAoMC41IC0gMC4yNSAqIE1hdGgubG9nKCgxICsgc2luKSAvICgxIC0gc2luKSkgLyBNYXRoLlBJKTtcblxuICAgIHkgPSB5IDwgLTEgPyAtMSA6XG4gICAgICAgIHkgPiAxID8gMSA6IHk7XG5cbiAgICByZXR1cm4gW3gsIHksIDBdO1xufVxuXG4vLyBjYWxjdWxhdGUgYXJlYSBhbmQgbGVuZ3RoIG9mIHRoZSBwb2x5XG5mdW5jdGlvbiBjYWxjU2l6ZShwb2ludHMpIHtcbiAgICB2YXIgYXJlYSA9IDAsXG4gICAgICAgIGRpc3QgPSAwO1xuXG4gICAgZm9yICh2YXIgaSA9IDAsIGEsIGI7IGkgPCBwb2ludHMubGVuZ3RoIC0gMTsgaSsrKSB7XG4gICAgICAgIGEgPSBiIHx8IHBvaW50c1tpXTtcbiAgICAgICAgYiA9IHBvaW50c1tpICsgMV07XG5cbiAgICAgICAgYXJlYSArPSBhWzBdICogYlsxXSAtIGJbMF0gKiBhWzFdO1xuXG4gICAgICAgIC8vIHVzZSBNYW5oYXR0YW4gZGlzdGFuY2UgaW5zdGVhZCBvZiBFdWNsaWRpYW4gb25lIHRvIGF2b2lkIGV4cGVuc2l2ZSBzcXVhcmUgcm9vdCBjb21wdXRhdGlvblxuICAgICAgICBkaXN0ICs9IE1hdGguYWJzKGJbMF0gLSBhWzBdKSArIE1hdGguYWJzKGJbMV0gLSBhWzFdKTtcbiAgICB9XG4gICAgcG9pbnRzLmFyZWEgPSBNYXRoLmFicyhhcmVhIC8gMik7XG4gICAgcG9pbnRzLmRpc3QgPSBkaXN0O1xufVxuXG4vLyBjYWxjdWxhdGUgdGhlIGZlYXR1cmUgYm91bmRpbmcgYm94IGZvciBmYXN0ZXIgY2xpcHBpbmcgbGF0ZXJcbmZ1bmN0aW9uIGNhbGNCQm94KGZlYXR1cmUpIHtcbiAgICB2YXIgZ2VvbWV0cnkgPSBmZWF0dXJlLmdlb21ldHJ5LFxuICAgICAgICBtaW4gPSBmZWF0dXJlLm1pbixcbiAgICAgICAgbWF4ID0gZmVhdHVyZS5tYXg7XG5cbiAgICBpZiAoZmVhdHVyZS50eXBlID09PSAxKSBjYWxjUmluZ0JCb3gobWluLCBtYXgsIGdlb21ldHJ5KTtcbiAgICBlbHNlIGZvciAodmFyIGkgPSAwOyBpIDwgZ2VvbWV0cnkubGVuZ3RoOyBpKyspIGNhbGNSaW5nQkJveChtaW4sIG1heCwgZ2VvbWV0cnlbaV0pO1xuXG4gICAgcmV0dXJuIGZlYXR1cmU7XG59XG5cbmZ1bmN0aW9uIGNhbGNSaW5nQkJveChtaW4sIG1heCwgcG9pbnRzKSB7XG4gICAgZm9yICh2YXIgaSA9IDAsIHA7IGkgPCBwb2ludHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgcCA9IHBvaW50c1tpXTtcbiAgICAgICAgbWluWzBdID0gTWF0aC5taW4ocFswXSwgbWluWzBdKTtcbiAgICAgICAgbWF4WzBdID0gTWF0aC5tYXgocFswXSwgbWF4WzBdKTtcbiAgICAgICAgbWluWzFdID0gTWF0aC5taW4ocFsxXSwgbWluWzFdKTtcbiAgICAgICAgbWF4WzFdID0gTWF0aC5tYXgocFsxXSwgbWF4WzFdKTtcbiAgICB9XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbm1vZHVsZS5leHBvcnRzID0gZ2VvanNvbnZ0O1xuXG52YXIgY29udmVydCA9IHJlcXVpcmUoJy4vY29udmVydCcpLCAvLyBHZW9KU09OIGNvbnZlcnNpb24gYW5kIHByZXByb2Nlc3NpbmdcbiAgICBjbGlwID0gcmVxdWlyZSgnLi9jbGlwJyksICAgICAgIC8vIHN0cmlwZSBjbGlwcGluZyBhbGdvcml0aG1cbiAgICB3cmFwID0gcmVxdWlyZSgnLi93cmFwJyksICAgICAgIC8vIGRhdGUgbGluZSBwcm9jZXNzaW5nXG4gICAgY3JlYXRlVGlsZSA9IHJlcXVpcmUoJy4vdGlsZScpOyAvLyBmaW5hbCBzaW1wbGlmaWVkIHRpbGUgZ2VuZXJhdGlvblxuXG5cbmZ1bmN0aW9uIGdlb2pzb252dChkYXRhLCBvcHRpb25zKSB7XG4gICAgcmV0dXJuIG5ldyBHZW9KU09OVlQoZGF0YSwgb3B0aW9ucyk7XG59XG5cbmZ1bmN0aW9uIEdlb0pTT05WVChkYXRhLCBvcHRpb25zKSB7XG4gICAgb3B0aW9ucyA9IHRoaXMub3B0aW9ucyA9IGV4dGVuZChPYmplY3QuY3JlYXRlKHRoaXMub3B0aW9ucyksIG9wdGlvbnMpO1xuXG4gICAgdmFyIGRlYnVnID0gb3B0aW9ucy5kZWJ1ZztcblxuICAgIGlmIChkZWJ1ZykgY29uc29sZS50aW1lKCdwcmVwcm9jZXNzIGRhdGEnKTtcblxuICAgIHZhciB6MiA9IDEgPDwgb3B0aW9ucy5tYXhab29tLCAvLyAyXnpcbiAgICAgICAgZmVhdHVyZXMgPSBjb252ZXJ0KGRhdGEsIG9wdGlvbnMudG9sZXJhbmNlIC8gKHoyICogb3B0aW9ucy5leHRlbnQpKTtcblxuICAgIHRoaXMudGlsZXMgPSB7fTtcbiAgICB0aGlzLnRpbGVDb29yZHMgPSBbXTtcblxuICAgIGlmIChkZWJ1Zykge1xuICAgICAgICBjb25zb2xlLnRpbWVFbmQoJ3ByZXByb2Nlc3MgZGF0YScpO1xuICAgICAgICBjb25zb2xlLmxvZygnaW5kZXg6IG1heFpvb206ICVkLCBtYXhQb2ludHM6ICVkJywgb3B0aW9ucy5pbmRleE1heFpvb20sIG9wdGlvbnMuaW5kZXhNYXhQb2ludHMpO1xuICAgICAgICBjb25zb2xlLnRpbWUoJ2dlbmVyYXRlIHRpbGVzJyk7XG4gICAgICAgIHRoaXMuc3RhdHMgPSB7fTtcbiAgICAgICAgdGhpcy50b3RhbCA9IDA7XG4gICAgfVxuXG4gICAgZmVhdHVyZXMgPSB3cmFwKGZlYXR1cmVzLCBvcHRpb25zLmJ1ZmZlciAvIG9wdGlvbnMuZXh0ZW50LCBpbnRlcnNlY3RYKTtcblxuICAgIC8vIHN0YXJ0IHNsaWNpbmcgZnJvbSB0aGUgdG9wIHRpbGUgZG93blxuICAgIGlmIChmZWF0dXJlcy5sZW5ndGgpIHRoaXMuc3BsaXRUaWxlKGZlYXR1cmVzLCAwLCAwLCAwKTtcblxuICAgIGlmIChkZWJ1Zykge1xuICAgICAgICBpZiAoZmVhdHVyZXMubGVuZ3RoKSBjb25zb2xlLmxvZygnZmVhdHVyZXM6ICVkLCBwb2ludHM6ICVkJywgdGhpcy50aWxlc1swXS5udW1GZWF0dXJlcywgdGhpcy50aWxlc1swXS5udW1Qb2ludHMpO1xuICAgICAgICBjb25zb2xlLnRpbWVFbmQoJ2dlbmVyYXRlIHRpbGVzJyk7XG4gICAgICAgIGNvbnNvbGUubG9nKCd0aWxlcyBnZW5lcmF0ZWQ6JywgdGhpcy50b3RhbCwgSlNPTi5zdHJpbmdpZnkodGhpcy5zdGF0cykpO1xuICAgIH1cbn1cblxuR2VvSlNPTlZULnByb3RvdHlwZS5vcHRpb25zID0ge1xuICAgIG1heFpvb206IDE0LCAgICAgICAgICAgIC8vIG1heCB6b29tIHRvIHByZXNlcnZlIGRldGFpbCBvblxuICAgIGluZGV4TWF4Wm9vbTogNSwgICAgICAgIC8vIG1heCB6b29tIGluIHRoZSB0aWxlIGluZGV4XG4gICAgaW5kZXhNYXhQb2ludHM6IDEwMDAwMCwgLy8gbWF4IG51bWJlciBvZiBwb2ludHMgcGVyIHRpbGUgaW4gdGhlIHRpbGUgaW5kZXhcbiAgICBzb2xpZENoaWxkcmVuOiBmYWxzZSwgICAvLyB3aGV0aGVyIHRvIHRpbGUgc29saWQgc3F1YXJlIHRpbGVzIGZ1cnRoZXJcbiAgICB0b2xlcmFuY2U6IDMsICAgICAgICAgICAvLyBzaW1wbGlmaWNhdGlvbiB0b2xlcmFuY2UgKGhpZ2hlciBtZWFucyBzaW1wbGVyKVxuICAgIGV4dGVudDogNDA5NiwgICAgICAgICAgIC8vIHRpbGUgZXh0ZW50XG4gICAgYnVmZmVyOiA2NCwgICAgICAgICAgICAgLy8gdGlsZSBidWZmZXIgb24gZWFjaCBzaWRlXG4gICAgZGVidWc6IDAgICAgICAgICAgICAgICAgLy8gbG9nZ2luZyBsZXZlbCAoMCwgMSBvciAyKVxufTtcblxuR2VvSlNPTlZULnByb3RvdHlwZS5zcGxpdFRpbGUgPSBmdW5jdGlvbiAoZmVhdHVyZXMsIHosIHgsIHksIGN6LCBjeCwgY3kpIHtcblxuICAgIHZhciBzdGFjayA9IFtmZWF0dXJlcywgeiwgeCwgeV0sXG4gICAgICAgIG9wdGlvbnMgPSB0aGlzLm9wdGlvbnMsXG4gICAgICAgIGRlYnVnID0gb3B0aW9ucy5kZWJ1ZztcblxuICAgIC8vIGF2b2lkIHJlY3Vyc2lvbiBieSB1c2luZyBhIHByb2Nlc3NpbmcgcXVldWVcbiAgICB3aGlsZSAoc3RhY2subGVuZ3RoKSB7XG4gICAgICAgIHkgPSBzdGFjay5wb3AoKTtcbiAgICAgICAgeCA9IHN0YWNrLnBvcCgpO1xuICAgICAgICB6ID0gc3RhY2sucG9wKCk7XG4gICAgICAgIGZlYXR1cmVzID0gc3RhY2sucG9wKCk7XG5cbiAgICAgICAgdmFyIHoyID0gMSA8PCB6LFxuICAgICAgICAgICAgaWQgPSB0b0lEKHosIHgsIHkpLFxuICAgICAgICAgICAgdGlsZSA9IHRoaXMudGlsZXNbaWRdLFxuICAgICAgICAgICAgdGlsZVRvbGVyYW5jZSA9IHogPT09IG9wdGlvbnMubWF4Wm9vbSA/IDAgOiBvcHRpb25zLnRvbGVyYW5jZSAvICh6MiAqIG9wdGlvbnMuZXh0ZW50KTtcblxuICAgICAgICBpZiAoIXRpbGUpIHtcbiAgICAgICAgICAgIGlmIChkZWJ1ZyA+IDEpIGNvbnNvbGUudGltZSgnY3JlYXRpb24nKTtcblxuICAgICAgICAgICAgdGlsZSA9IHRoaXMudGlsZXNbaWRdID0gY3JlYXRlVGlsZShmZWF0dXJlcywgejIsIHgsIHksIHRpbGVUb2xlcmFuY2UsIHogPT09IG9wdGlvbnMubWF4Wm9vbSk7XG4gICAgICAgICAgICB0aGlzLnRpbGVDb29yZHMucHVzaCh7ejogeiwgeDogeCwgeTogeX0pO1xuXG4gICAgICAgICAgICBpZiAoZGVidWcpIHtcbiAgICAgICAgICAgICAgICBpZiAoZGVidWcgPiAxKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCd0aWxlIHolZC0lZC0lZCAoZmVhdHVyZXM6ICVkLCBwb2ludHM6ICVkLCBzaW1wbGlmaWVkOiAlZCknLFxuICAgICAgICAgICAgICAgICAgICAgICAgeiwgeCwgeSwgdGlsZS5udW1GZWF0dXJlcywgdGlsZS5udW1Qb2ludHMsIHRpbGUubnVtU2ltcGxpZmllZCk7XG4gICAgICAgICAgICAgICAgICAgIGNvbnNvbGUudGltZUVuZCgnY3JlYXRpb24nKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdmFyIGtleSA9ICd6JyArIHo7XG4gICAgICAgICAgICAgICAgdGhpcy5zdGF0c1trZXldID0gKHRoaXMuc3RhdHNba2V5XSB8fCAwKSArIDE7XG4gICAgICAgICAgICAgICAgdGhpcy50b3RhbCsrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gc2F2ZSByZWZlcmVuY2UgdG8gb3JpZ2luYWwgZ2VvbWV0cnkgaW4gdGlsZSBzbyB0aGF0IHdlIGNhbiBkcmlsbCBkb3duIGxhdGVyIGlmIHdlIHN0b3Agbm93XG4gICAgICAgIHRpbGUuc291cmNlID0gZmVhdHVyZXM7XG5cbiAgICAgICAgLy8gc3RvcCB0aWxpbmcgaWYgdGhlIHRpbGUgaXMgc29saWQgY2xpcHBlZCBzcXVhcmVcbiAgICAgICAgaWYgKCFvcHRpb25zLnNvbGlkQ2hpbGRyZW4gJiYgaXNDbGlwcGVkU3F1YXJlKHRpbGUsIG9wdGlvbnMuZXh0ZW50LCBvcHRpb25zLmJ1ZmZlcikpIGNvbnRpbnVlO1xuXG4gICAgICAgIC8vIGlmIGl0J3MgdGhlIGZpcnN0LXBhc3MgdGlsaW5nXG4gICAgICAgIGlmICghY3opIHtcbiAgICAgICAgICAgIC8vIHN0b3AgdGlsaW5nIGlmIHdlIHJlYWNoZWQgbWF4IHpvb20sIG9yIGlmIHRoZSB0aWxlIGlzIHRvbyBzaW1wbGVcbiAgICAgICAgICAgIGlmICh6ID09PSBvcHRpb25zLmluZGV4TWF4Wm9vbSB8fCB0aWxlLm51bVBvaW50cyA8PSBvcHRpb25zLmluZGV4TWF4UG9pbnRzKSBjb250aW51ZTtcblxuICAgICAgICAvLyBpZiBhIGRyaWxsZG93biB0byBhIHNwZWNpZmljIHRpbGVcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIC8vIHN0b3AgdGlsaW5nIGlmIHdlIHJlYWNoZWQgYmFzZSB6b29tIG9yIG91ciB0YXJnZXQgdGlsZSB6b29tXG4gICAgICAgICAgICBpZiAoeiA9PT0gb3B0aW9ucy5tYXhab29tIHx8IHogPT09IGN6KSBjb250aW51ZTtcblxuICAgICAgICAgICAgLy8gc3RvcCB0aWxpbmcgaWYgaXQncyBub3QgYW4gYW5jZXN0b3Igb2YgdGhlIHRhcmdldCB0aWxlXG4gICAgICAgICAgICB2YXIgbSA9IDEgPDwgKGN6IC0geik7XG4gICAgICAgICAgICBpZiAoeCAhPT0gTWF0aC5mbG9vcihjeCAvIG0pIHx8IHkgIT09IE1hdGguZmxvb3IoY3kgLyBtKSkgY29udGludWU7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBpZiB3ZSBzbGljZSBmdXJ0aGVyIGRvd24sIG5vIG5lZWQgdG8ga2VlcCBzb3VyY2UgZ2VvbWV0cnlcbiAgICAgICAgdGlsZS5zb3VyY2UgPSBudWxsO1xuXG4gICAgICAgIGlmIChkZWJ1ZyA+IDEpIGNvbnNvbGUudGltZSgnY2xpcHBpbmcnKTtcblxuICAgICAgICAvLyB2YWx1ZXMgd2UnbGwgdXNlIGZvciBjbGlwcGluZ1xuICAgICAgICB2YXIgazEgPSAwLjUgKiBvcHRpb25zLmJ1ZmZlciAvIG9wdGlvbnMuZXh0ZW50LFxuICAgICAgICAgICAgazIgPSAwLjUgLSBrMSxcbiAgICAgICAgICAgIGszID0gMC41ICsgazEsXG4gICAgICAgICAgICBrNCA9IDEgKyBrMSxcbiAgICAgICAgICAgIHRsLCBibCwgdHIsIGJyLCBsZWZ0LCByaWdodDtcblxuICAgICAgICB0bCA9IGJsID0gdHIgPSBiciA9IG51bGw7XG5cbiAgICAgICAgbGVmdCAgPSBjbGlwKGZlYXR1cmVzLCB6MiwgeCAtIGsxLCB4ICsgazMsIDAsIGludGVyc2VjdFgsIHRpbGUubWluWzBdLCB0aWxlLm1heFswXSk7XG4gICAgICAgIHJpZ2h0ID0gY2xpcChmZWF0dXJlcywgejIsIHggKyBrMiwgeCArIGs0LCAwLCBpbnRlcnNlY3RYLCB0aWxlLm1pblswXSwgdGlsZS5tYXhbMF0pO1xuXG4gICAgICAgIGlmIChsZWZ0KSB7XG4gICAgICAgICAgICB0bCA9IGNsaXAobGVmdCwgejIsIHkgLSBrMSwgeSArIGszLCAxLCBpbnRlcnNlY3RZLCB0aWxlLm1pblsxXSwgdGlsZS5tYXhbMV0pO1xuICAgICAgICAgICAgYmwgPSBjbGlwKGxlZnQsIHoyLCB5ICsgazIsIHkgKyBrNCwgMSwgaW50ZXJzZWN0WSwgdGlsZS5taW5bMV0sIHRpbGUubWF4WzFdKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChyaWdodCkge1xuICAgICAgICAgICAgdHIgPSBjbGlwKHJpZ2h0LCB6MiwgeSAtIGsxLCB5ICsgazMsIDEsIGludGVyc2VjdFksIHRpbGUubWluWzFdLCB0aWxlLm1heFsxXSk7XG4gICAgICAgICAgICBiciA9IGNsaXAocmlnaHQsIHoyLCB5ICsgazIsIHkgKyBrNCwgMSwgaW50ZXJzZWN0WSwgdGlsZS5taW5bMV0sIHRpbGUubWF4WzFdKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChkZWJ1ZyA+IDEpIGNvbnNvbGUudGltZUVuZCgnY2xpcHBpbmcnKTtcblxuICAgICAgICBpZiAodGwpIHN0YWNrLnB1c2godGwsIHogKyAxLCB4ICogMiwgICAgIHkgKiAyKTtcbiAgICAgICAgaWYgKGJsKSBzdGFjay5wdXNoKGJsLCB6ICsgMSwgeCAqIDIsICAgICB5ICogMiArIDEpO1xuICAgICAgICBpZiAodHIpIHN0YWNrLnB1c2godHIsIHogKyAxLCB4ICogMiArIDEsIHkgKiAyKTtcbiAgICAgICAgaWYgKGJyKSBzdGFjay5wdXNoKGJyLCB6ICsgMSwgeCAqIDIgKyAxLCB5ICogMiArIDEpO1xuICAgIH1cbn07XG5cbkdlb0pTT05WVC5wcm90b3R5cGUuZ2V0VGlsZSA9IGZ1bmN0aW9uICh6LCB4LCB5KSB7XG4gICAgdmFyIG9wdGlvbnMgPSB0aGlzLm9wdGlvbnMsXG4gICAgICAgIGV4dGVudCA9IG9wdGlvbnMuZXh0ZW50LFxuICAgICAgICBkZWJ1ZyA9IG9wdGlvbnMuZGVidWc7XG5cbiAgICB2YXIgejIgPSAxIDw8IHo7XG4gICAgeCA9ICgoeCAlIHoyKSArIHoyKSAlIHoyOyAvLyB3cmFwIHRpbGUgeCBjb29yZGluYXRlXG5cbiAgICB2YXIgaWQgPSB0b0lEKHosIHgsIHkpO1xuICAgIGlmICh0aGlzLnRpbGVzW2lkXSkgcmV0dXJuIHRyYW5zZm9ybVRpbGUodGhpcy50aWxlc1tpZF0sIGV4dGVudCk7XG5cbiAgICBpZiAoZGVidWcgPiAxKSBjb25zb2xlLmxvZygnZHJpbGxpbmcgZG93biB0byB6JWQtJWQtJWQnLCB6LCB4LCB5KTtcblxuICAgIHZhciB6MCA9IHosXG4gICAgICAgIHgwID0geCxcbiAgICAgICAgeTAgPSB5LFxuICAgICAgICBwYXJlbnQ7XG5cbiAgICB3aGlsZSAoIXBhcmVudCAmJiB6MCA+IDApIHtcbiAgICAgICAgejAtLTtcbiAgICAgICAgeDAgPSBNYXRoLmZsb29yKHgwIC8gMik7XG4gICAgICAgIHkwID0gTWF0aC5mbG9vcih5MCAvIDIpO1xuICAgICAgICBwYXJlbnQgPSB0aGlzLnRpbGVzW3RvSUQoejAsIHgwLCB5MCldO1xuICAgIH1cblxuICAgIGlmICghcGFyZW50KSByZXR1cm4gbnVsbDtcblxuICAgIGlmIChkZWJ1ZyA+IDEpIGNvbnNvbGUubG9nKCdmb3VuZCBwYXJlbnQgdGlsZSB6JWQtJWQtJWQnLCB6MCwgeDAsIHkwKTtcblxuICAgIC8vIGlmIHdlIGZvdW5kIGEgcGFyZW50IHRpbGUgY29udGFpbmluZyB0aGUgb3JpZ2luYWwgZ2VvbWV0cnksIHdlIGNhbiBkcmlsbCBkb3duIGZyb20gaXRcbiAgICBpZiAocGFyZW50LnNvdXJjZSkge1xuICAgICAgICBpZiAoaXNDbGlwcGVkU3F1YXJlKHBhcmVudCwgZXh0ZW50LCBvcHRpb25zLmJ1ZmZlcikpIHJldHVybiB0cmFuc2Zvcm1UaWxlKHBhcmVudCwgZXh0ZW50KTtcblxuICAgICAgICBpZiAoZGVidWcgPiAxKSBjb25zb2xlLnRpbWUoJ2RyaWxsaW5nIGRvd24nKTtcbiAgICAgICAgdGhpcy5zcGxpdFRpbGUocGFyZW50LnNvdXJjZSwgejAsIHgwLCB5MCwgeiwgeCwgeSk7XG4gICAgICAgIGlmIChkZWJ1ZyA+IDEpIGNvbnNvbGUudGltZUVuZCgnZHJpbGxpbmcgZG93bicpO1xuICAgIH1cblxuICAgIGlmICghdGhpcy50aWxlc1tpZF0pIHJldHVybiBudWxsO1xuXG4gICAgcmV0dXJuIHRyYW5zZm9ybVRpbGUodGhpcy50aWxlc1tpZF0sIGV4dGVudCk7XG59O1xuXG5mdW5jdGlvbiB0cmFuc2Zvcm1UaWxlKHRpbGUsIGV4dGVudCkge1xuICAgIGlmICh0aWxlLnRyYW5zZm9ybWVkKSByZXR1cm4gdGlsZTtcblxuICAgIHZhciB6MiA9IHRpbGUuejIsXG4gICAgICAgIHR4ID0gdGlsZS54LFxuICAgICAgICB0eSA9IHRpbGUueSxcbiAgICAgICAgaSwgaiwgaztcblxuICAgIGZvciAoaSA9IDA7IGkgPCB0aWxlLmZlYXR1cmVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHZhciBmZWF0dXJlID0gdGlsZS5mZWF0dXJlc1tpXSxcbiAgICAgICAgICAgIGdlb20gPSBmZWF0dXJlLmdlb21ldHJ5LFxuICAgICAgICAgICAgdHlwZSA9IGZlYXR1cmUudHlwZTtcblxuICAgICAgICBpZiAodHlwZSA9PT0gMSkge1xuICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IGdlb20ubGVuZ3RoOyBqKyspIGdlb21bal0gPSB0cmFuc2Zvcm1Qb2ludChnZW9tW2pdLCBleHRlbnQsIHoyLCB0eCwgdHkpO1xuXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgZ2VvbS5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgICAgIHZhciByaW5nID0gZ2VvbVtqXTtcbiAgICAgICAgICAgICAgICBmb3IgKGsgPSAwOyBrIDwgcmluZy5sZW5ndGg7IGsrKykgcmluZ1trXSA9IHRyYW5zZm9ybVBvaW50KHJpbmdba10sIGV4dGVudCwgejIsIHR4LCB0eSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICB0aWxlLnRyYW5zZm9ybWVkID0gdHJ1ZTtcblxuICAgIHJldHVybiB0aWxlO1xufVxuXG5mdW5jdGlvbiB0cmFuc2Zvcm1Qb2ludChwLCBleHRlbnQsIHoyLCB0eCwgdHkpIHtcbiAgICB2YXIgeCA9IE1hdGgucm91bmQoZXh0ZW50ICogKHBbMF0gKiB6MiAtIHR4KSksXG4gICAgICAgIHkgPSBNYXRoLnJvdW5kKGV4dGVudCAqIChwWzFdICogejIgLSB0eSkpO1xuICAgIHJldHVybiBbeCwgeV07XG59XG5cbmZ1bmN0aW9uIHRvSUQoeiwgeCwgeSkge1xuICAgIHJldHVybiAoKCgxIDw8IHopICogeSArIHgpICogMzIpICsgejtcbn1cblxuZnVuY3Rpb24gaW50ZXJzZWN0WChhLCBiLCB4KSB7XG4gICAgcmV0dXJuIFt4LCAoeCAtIGFbMF0pICogKGJbMV0gLSBhWzFdKSAvIChiWzBdIC0gYVswXSkgKyBhWzFdLCAxXTtcbn1cbmZ1bmN0aW9uIGludGVyc2VjdFkoYSwgYiwgeSkge1xuICAgIHJldHVybiBbKHkgLSBhWzFdKSAqIChiWzBdIC0gYVswXSkgLyAoYlsxXSAtIGFbMV0pICsgYVswXSwgeSwgMV07XG59XG5cbmZ1bmN0aW9uIGV4dGVuZChkZXN0LCBzcmMpIHtcbiAgICBmb3IgKHZhciBpIGluIHNyYykgZGVzdFtpXSA9IHNyY1tpXTtcbiAgICByZXR1cm4gZGVzdDtcbn1cblxuLy8gY2hlY2tzIHdoZXRoZXIgYSB0aWxlIGlzIGEgd2hvbGUtYXJlYSBmaWxsIGFmdGVyIGNsaXBwaW5nOyBpZiBpdCBpcywgdGhlcmUncyBubyBzZW5zZSBzbGljaW5nIGl0IGZ1cnRoZXJcbmZ1bmN0aW9uIGlzQ2xpcHBlZFNxdWFyZSh0aWxlLCBleHRlbnQsIGJ1ZmZlcikge1xuXG4gICAgdmFyIGZlYXR1cmVzID0gdGlsZS5zb3VyY2U7XG4gICAgaWYgKGZlYXR1cmVzLmxlbmd0aCAhPT0gMSkgcmV0dXJuIGZhbHNlO1xuXG4gICAgdmFyIGZlYXR1cmUgPSBmZWF0dXJlc1swXTtcbiAgICBpZiAoZmVhdHVyZS50eXBlICE9PSAzIHx8IGZlYXR1cmUuZ2VvbWV0cnkubGVuZ3RoID4gMSkgcmV0dXJuIGZhbHNlO1xuXG4gICAgdmFyIGxlbiA9IGZlYXR1cmUuZ2VvbWV0cnlbMF0ubGVuZ3RoO1xuICAgIGlmIChsZW4gIT09IDUpIHJldHVybiBmYWxzZTtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgdmFyIHAgPSB0cmFuc2Zvcm1Qb2ludChmZWF0dXJlLmdlb21ldHJ5WzBdW2ldLCBleHRlbnQsIHRpbGUuejIsIHRpbGUueCwgdGlsZS55KTtcbiAgICAgICAgaWYgKChwWzBdICE9PSAtYnVmZmVyICYmIHBbMF0gIT09IGV4dGVudCArIGJ1ZmZlcikgfHxcbiAgICAgICAgICAgIChwWzFdICE9PSAtYnVmZmVyICYmIHBbMV0gIT09IGV4dGVudCArIGJ1ZmZlcikpIHJldHVybiBmYWxzZTtcbiAgICB9XG5cbiAgICByZXR1cm4gdHJ1ZTtcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxubW9kdWxlLmV4cG9ydHMgPSBzaW1wbGlmeTtcblxuLy8gY2FsY3VsYXRlIHNpbXBsaWZpY2F0aW9uIGRhdGEgdXNpbmcgb3B0aW1pemVkIERvdWdsYXMtUGV1Y2tlciBhbGdvcml0aG1cblxuZnVuY3Rpb24gc2ltcGxpZnkocG9pbnRzLCB0b2xlcmFuY2UpIHtcblxuICAgIHZhciBzcVRvbGVyYW5jZSA9IHRvbGVyYW5jZSAqIHRvbGVyYW5jZSxcbiAgICAgICAgbGVuID0gcG9pbnRzLmxlbmd0aCxcbiAgICAgICAgZmlyc3QgPSAwLFxuICAgICAgICBsYXN0ID0gbGVuIC0gMSxcbiAgICAgICAgc3RhY2sgPSBbXSxcbiAgICAgICAgaSwgbWF4U3FEaXN0LCBzcURpc3QsIGluZGV4O1xuXG4gICAgLy8gYWx3YXlzIHJldGFpbiB0aGUgZW5kcG9pbnRzICgxIGlzIHRoZSBtYXggdmFsdWUpXG4gICAgcG9pbnRzW2ZpcnN0XVsyXSA9IDE7XG4gICAgcG9pbnRzW2xhc3RdWzJdID0gMTtcblxuICAgIC8vIGF2b2lkIHJlY3Vyc2lvbiBieSB1c2luZyBhIHN0YWNrXG4gICAgd2hpbGUgKGxhc3QpIHtcblxuICAgICAgICBtYXhTcURpc3QgPSAwO1xuXG4gICAgICAgIGZvciAoaSA9IGZpcnN0ICsgMTsgaSA8IGxhc3Q7IGkrKykge1xuICAgICAgICAgICAgc3FEaXN0ID0gZ2V0U3FTZWdEaXN0KHBvaW50c1tpXSwgcG9pbnRzW2ZpcnN0XSwgcG9pbnRzW2xhc3RdKTtcblxuICAgICAgICAgICAgaWYgKHNxRGlzdCA+IG1heFNxRGlzdCkge1xuICAgICAgICAgICAgICAgIGluZGV4ID0gaTtcbiAgICAgICAgICAgICAgICBtYXhTcURpc3QgPSBzcURpc3Q7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAobWF4U3FEaXN0ID4gc3FUb2xlcmFuY2UpIHtcbiAgICAgICAgICAgIHBvaW50c1tpbmRleF1bMl0gPSBtYXhTcURpc3Q7IC8vIHNhdmUgdGhlIHBvaW50IGltcG9ydGFuY2UgaW4gc3F1YXJlZCBwaXhlbHMgYXMgYSB6IGNvb3JkaW5hdGVcbiAgICAgICAgICAgIHN0YWNrLnB1c2goZmlyc3QpO1xuICAgICAgICAgICAgc3RhY2sucHVzaChpbmRleCk7XG4gICAgICAgICAgICBmaXJzdCA9IGluZGV4O1xuXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBsYXN0ID0gc3RhY2sucG9wKCk7XG4gICAgICAgICAgICBmaXJzdCA9IHN0YWNrLnBvcCgpO1xuICAgICAgICB9XG4gICAgfVxufVxuXG4vLyBzcXVhcmUgZGlzdGFuY2UgZnJvbSBhIHBvaW50IHRvIGEgc2VnbWVudFxuZnVuY3Rpb24gZ2V0U3FTZWdEaXN0KHAsIGEsIGIpIHtcblxuICAgIHZhciB4ID0gYVswXSwgeSA9IGFbMV0sXG4gICAgICAgIGJ4ID0gYlswXSwgYnkgPSBiWzFdLFxuICAgICAgICBweCA9IHBbMF0sIHB5ID0gcFsxXSxcbiAgICAgICAgZHggPSBieCAtIHgsXG4gICAgICAgIGR5ID0gYnkgLSB5O1xuXG4gICAgaWYgKGR4ICE9PSAwIHx8IGR5ICE9PSAwKSB7XG5cbiAgICAgICAgdmFyIHQgPSAoKHB4IC0geCkgKiBkeCArIChweSAtIHkpICogZHkpIC8gKGR4ICogZHggKyBkeSAqIGR5KTtcblxuICAgICAgICBpZiAodCA+IDEpIHtcbiAgICAgICAgICAgIHggPSBieDtcbiAgICAgICAgICAgIHkgPSBieTtcblxuICAgICAgICB9IGVsc2UgaWYgKHQgPiAwKSB7XG4gICAgICAgICAgICB4ICs9IGR4ICogdDtcbiAgICAgICAgICAgIHkgKz0gZHkgKiB0O1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZHggPSBweCAtIHg7XG4gICAgZHkgPSBweSAtIHk7XG5cbiAgICByZXR1cm4gZHggKiBkeCArIGR5ICogZHk7XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbm1vZHVsZS5leHBvcnRzID0gY3JlYXRlVGlsZTtcblxuZnVuY3Rpb24gY3JlYXRlVGlsZShmZWF0dXJlcywgejIsIHR4LCB0eSwgdG9sZXJhbmNlLCBub1NpbXBsaWZ5KSB7XG4gICAgdmFyIHRpbGUgPSB7XG4gICAgICAgIGZlYXR1cmVzOiBbXSxcbiAgICAgICAgbnVtUG9pbnRzOiAwLFxuICAgICAgICBudW1TaW1wbGlmaWVkOiAwLFxuICAgICAgICBudW1GZWF0dXJlczogMCxcbiAgICAgICAgc291cmNlOiBudWxsLFxuICAgICAgICB4OiB0eCxcbiAgICAgICAgeTogdHksXG4gICAgICAgIHoyOiB6MixcbiAgICAgICAgdHJhbnNmb3JtZWQ6IGZhbHNlLFxuICAgICAgICBtaW46IFsyLCAxXSxcbiAgICAgICAgbWF4OiBbLTEsIDBdXG4gICAgfTtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGZlYXR1cmVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHRpbGUubnVtRmVhdHVyZXMrKztcbiAgICAgICAgYWRkRmVhdHVyZSh0aWxlLCBmZWF0dXJlc1tpXSwgdG9sZXJhbmNlLCBub1NpbXBsaWZ5KTtcblxuICAgICAgICB2YXIgbWluID0gZmVhdHVyZXNbaV0ubWluLFxuICAgICAgICAgICAgbWF4ID0gZmVhdHVyZXNbaV0ubWF4O1xuXG4gICAgICAgIGlmIChtaW5bMF0gPCB0aWxlLm1pblswXSkgdGlsZS5taW5bMF0gPSBtaW5bMF07XG4gICAgICAgIGlmIChtaW5bMV0gPCB0aWxlLm1pblsxXSkgdGlsZS5taW5bMV0gPSBtaW5bMV07XG4gICAgICAgIGlmIChtYXhbMF0gPiB0aWxlLm1heFswXSkgdGlsZS5tYXhbMF0gPSBtYXhbMF07XG4gICAgICAgIGlmIChtYXhbMV0gPiB0aWxlLm1heFsxXSkgdGlsZS5tYXhbMV0gPSBtYXhbMV07XG4gICAgfVxuICAgIHJldHVybiB0aWxlO1xufVxuXG5mdW5jdGlvbiBhZGRGZWF0dXJlKHRpbGUsIGZlYXR1cmUsIHRvbGVyYW5jZSwgbm9TaW1wbGlmeSkge1xuXG4gICAgdmFyIGdlb20gPSBmZWF0dXJlLmdlb21ldHJ5LFxuICAgICAgICB0eXBlID0gZmVhdHVyZS50eXBlLFxuICAgICAgICBzaW1wbGlmaWVkID0gW10sXG4gICAgICAgIHNxVG9sZXJhbmNlID0gdG9sZXJhbmNlICogdG9sZXJhbmNlLFxuICAgICAgICBpLCBqLCByaW5nLCBwO1xuXG4gICAgaWYgKHR5cGUgPT09IDEpIHtcbiAgICAgICAgZm9yIChpID0gMDsgaSA8IGdlb20ubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIHNpbXBsaWZpZWQucHVzaChnZW9tW2ldKTtcbiAgICAgICAgICAgIHRpbGUubnVtUG9pbnRzKys7XG4gICAgICAgICAgICB0aWxlLm51bVNpbXBsaWZpZWQrKztcbiAgICAgICAgfVxuXG4gICAgfSBlbHNlIHtcblxuICAgICAgICAvLyBzaW1wbGlmeSBhbmQgdHJhbnNmb3JtIHByb2plY3RlZCBjb29yZGluYXRlcyBmb3IgdGlsZSBnZW9tZXRyeVxuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgZ2VvbS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgcmluZyA9IGdlb21baV07XG5cbiAgICAgICAgICAgIC8vIGZpbHRlciBvdXQgdGlueSBwb2x5bGluZXMgJiBwb2x5Z29uc1xuICAgICAgICAgICAgaWYgKCFub1NpbXBsaWZ5ICYmICgodHlwZSA9PT0gMiAmJiByaW5nLmRpc3QgPCB0b2xlcmFuY2UpIHx8XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0eXBlID09PSAzICYmIHJpbmcuYXJlYSA8IHNxVG9sZXJhbmNlKSkpIHtcbiAgICAgICAgICAgICAgICB0aWxlLm51bVBvaW50cyArPSByaW5nLmxlbmd0aDtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdmFyIHNpbXBsaWZpZWRSaW5nID0gW107XG5cbiAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPCByaW5nLmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICAgICAgcCA9IHJpbmdbal07XG4gICAgICAgICAgICAgICAgLy8ga2VlcCBwb2ludHMgd2l0aCBpbXBvcnRhbmNlID4gdG9sZXJhbmNlXG4gICAgICAgICAgICAgICAgaWYgKG5vU2ltcGxpZnkgfHwgcFsyXSA+IHNxVG9sZXJhbmNlKSB7XG4gICAgICAgICAgICAgICAgICAgIHNpbXBsaWZpZWRSaW5nLnB1c2gocCk7XG4gICAgICAgICAgICAgICAgICAgIHRpbGUubnVtU2ltcGxpZmllZCsrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aWxlLm51bVBvaW50cysrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBzaW1wbGlmaWVkLnB1c2goc2ltcGxpZmllZFJpbmcpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgaWYgKHNpbXBsaWZpZWQubGVuZ3RoKSB7XG4gICAgICAgIHRpbGUuZmVhdHVyZXMucHVzaCh7XG4gICAgICAgICAgICBnZW9tZXRyeTogc2ltcGxpZmllZCxcbiAgICAgICAgICAgIHR5cGU6IHR5cGUsXG4gICAgICAgICAgICB0YWdzOiBmZWF0dXJlLnRhZ3MgfHwgbnVsbFxuICAgICAgICB9KTtcbiAgICB9XG59XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBjbGlwID0gcmVxdWlyZSgnLi9jbGlwJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gd3JhcDtcblxuZnVuY3Rpb24gd3JhcChmZWF0dXJlcywgYnVmZmVyLCBpbnRlcnNlY3RYKSB7XG4gICAgdmFyIG1lcmdlZCA9IGZlYXR1cmVzLFxuICAgICAgICBsZWZ0ICA9IGNsaXAoZmVhdHVyZXMsIDEsIC0xIC0gYnVmZmVyLCBidWZmZXIsICAgICAwLCBpbnRlcnNlY3RYLCAtMSwgMiksIC8vIGxlZnQgd29ybGQgY29weVxuICAgICAgICByaWdodCA9IGNsaXAoZmVhdHVyZXMsIDEsICAxIC0gYnVmZmVyLCAyICsgYnVmZmVyLCAwLCBpbnRlcnNlY3RYLCAtMSwgMik7IC8vIHJpZ2h0IHdvcmxkIGNvcHlcblxuICAgIGlmIChsZWZ0IHx8IHJpZ2h0KSB7XG4gICAgICAgIG1lcmdlZCA9IGNsaXAoZmVhdHVyZXMsIDEsIC1idWZmZXIsIDEgKyBidWZmZXIsIDAsIGludGVyc2VjdFgsIC0xLCAyKTsgLy8gY2VudGVyIHdvcmxkIGNvcHlcblxuICAgICAgICBpZiAobGVmdCkgbWVyZ2VkID0gc2hpZnRGZWF0dXJlQ29vcmRzKGxlZnQsIDEpLmNvbmNhdChtZXJnZWQpOyAvLyBtZXJnZSBsZWZ0IGludG8gY2VudGVyXG4gICAgICAgIGlmIChyaWdodCkgbWVyZ2VkID0gbWVyZ2VkLmNvbmNhdChzaGlmdEZlYXR1cmVDb29yZHMocmlnaHQsIC0xKSk7IC8vIG1lcmdlIHJpZ2h0IGludG8gY2VudGVyXG4gICAgfVxuXG4gICAgcmV0dXJuIG1lcmdlZDtcbn1cblxuZnVuY3Rpb24gc2hpZnRGZWF0dXJlQ29vcmRzKGZlYXR1cmVzLCBvZmZzZXQpIHtcbiAgICB2YXIgbmV3RmVhdHVyZXMgPSBbXTtcblxuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZmVhdHVyZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIGZlYXR1cmUgPSBmZWF0dXJlc1tpXSxcbiAgICAgICAgICAgIHR5cGUgPSBmZWF0dXJlLnR5cGU7XG5cbiAgICAgICAgdmFyIG5ld0dlb21ldHJ5O1xuXG4gICAgICAgIGlmICh0eXBlID09PSAxKSB7XG4gICAgICAgICAgICBuZXdHZW9tZXRyeSA9IHNoaWZ0Q29vcmRzKGZlYXR1cmUuZ2VvbWV0cnksIG9mZnNldCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBuZXdHZW9tZXRyeSA9IFtdO1xuICAgICAgICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBmZWF0dXJlLmdlb21ldHJ5Lmxlbmd0aDsgaisrKSB7XG4gICAgICAgICAgICAgICAgbmV3R2VvbWV0cnkucHVzaChzaGlmdENvb3JkcyhmZWF0dXJlLmdlb21ldHJ5W2pdLCBvZmZzZXQpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIG5ld0ZlYXR1cmVzLnB1c2goe1xuICAgICAgICAgICAgZ2VvbWV0cnk6IG5ld0dlb21ldHJ5LFxuICAgICAgICAgICAgdHlwZTogdHlwZSxcbiAgICAgICAgICAgIHRhZ3M6IGZlYXR1cmUudGFncyxcbiAgICAgICAgICAgIG1pbjogW2ZlYXR1cmUubWluWzBdICsgb2Zmc2V0LCBmZWF0dXJlLm1pblsxXV0sXG4gICAgICAgICAgICBtYXg6IFtmZWF0dXJlLm1heFswXSArIG9mZnNldCwgZmVhdHVyZS5tYXhbMV1dXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiBuZXdGZWF0dXJlcztcbn1cblxuZnVuY3Rpb24gc2hpZnRDb29yZHMocG9pbnRzLCBvZmZzZXQpIHtcbiAgICB2YXIgbmV3UG9pbnRzID0gW107XG4gICAgbmV3UG9pbnRzLmFyZWEgPSBwb2ludHMuYXJlYTtcbiAgICBuZXdQb2ludHMuZGlzdCA9IHBvaW50cy5kaXN0O1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBwb2ludHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgbmV3UG9pbnRzLnB1c2goW3BvaW50c1tpXVswXSArIG9mZnNldCwgcG9pbnRzW2ldWzFdLCBwb2ludHNbaV1bMl1dKTtcbiAgICB9XG4gICAgcmV0dXJuIG5ld1BvaW50cztcbn1cbiIsIm1vZHVsZS5leHBvcnRzID0gaW52ZXJ0XG5cbi8qKlxuICogSW52ZXJ0cyBhIG1hdDNcbiAqXG4gKiBAYWxpYXMgbWF0My5pbnZlcnRcbiAqIEBwYXJhbSB7bWF0M30gb3V0IHRoZSByZWNlaXZpbmcgbWF0cml4XG4gKiBAcGFyYW0ge21hdDN9IGEgdGhlIHNvdXJjZSBtYXRyaXhcbiAqIEByZXR1cm5zIHttYXQzfSBvdXRcbiAqL1xuZnVuY3Rpb24gaW52ZXJ0KG91dCwgYSkge1xuICB2YXIgYTAwID0gYVswXSwgYTAxID0gYVsxXSwgYTAyID0gYVsyXVxuICB2YXIgYTEwID0gYVszXSwgYTExID0gYVs0XSwgYTEyID0gYVs1XVxuICB2YXIgYTIwID0gYVs2XSwgYTIxID0gYVs3XSwgYTIyID0gYVs4XVxuXG4gIHZhciBiMDEgPSBhMjIgKiBhMTEgLSBhMTIgKiBhMjFcbiAgdmFyIGIxMSA9IC1hMjIgKiBhMTAgKyBhMTIgKiBhMjBcbiAgdmFyIGIyMSA9IGEyMSAqIGExMCAtIGExMSAqIGEyMFxuXG4gIC8vIENhbGN1bGF0ZSB0aGUgZGV0ZXJtaW5hbnRcbiAgdmFyIGRldCA9IGEwMCAqIGIwMSArIGEwMSAqIGIxMSArIGEwMiAqIGIyMVxuXG4gIGlmICghZGV0KSByZXR1cm4gbnVsbFxuICBkZXQgPSAxLjAgLyBkZXRcblxuICBvdXRbMF0gPSBiMDEgKiBkZXRcbiAgb3V0WzFdID0gKC1hMjIgKiBhMDEgKyBhMDIgKiBhMjEpICogZGV0XG4gIG91dFsyXSA9IChhMTIgKiBhMDEgLSBhMDIgKiBhMTEpICogZGV0XG4gIG91dFszXSA9IGIxMSAqIGRldFxuICBvdXRbNF0gPSAoYTIyICogYTAwIC0gYTAyICogYTIwKSAqIGRldFxuICBvdXRbNV0gPSAoLWExMiAqIGEwMCArIGEwMiAqIGExMCkgKiBkZXRcbiAgb3V0WzZdID0gYjIxICogZGV0XG4gIG91dFs3XSA9ICgtYTIxICogYTAwICsgYTAxICogYTIwKSAqIGRldFxuICBvdXRbOF0gPSAoYTExICogYTAwIC0gYTAxICogYTEwKSAqIGRldFxuXG4gIHJldHVybiBvdXRcbn1cbiIsIm1vZHVsZS5leHBvcnRzID0gbm9ybWFsRnJvbU1hdDRcblxuLyoqXG4qIENhbGN1bGF0ZXMgYSAzeDMgbm9ybWFsIG1hdHJpeCAodHJhbnNwb3NlIGludmVyc2UpIGZyb20gdGhlIDR4NCBtYXRyaXhcbipcbiogQGFsaWFzIG1hdDMubm9ybWFsRnJvbU1hdDRcbiogQHBhcmFtIHttYXQzfSBvdXQgbWF0MyByZWNlaXZpbmcgb3BlcmF0aW9uIHJlc3VsdFxuKiBAcGFyYW0ge21hdDR9IGEgTWF0NCB0byBkZXJpdmUgdGhlIG5vcm1hbCBtYXRyaXggZnJvbVxuKlxuKiBAcmV0dXJucyB7bWF0M30gb3V0XG4qL1xuZnVuY3Rpb24gbm9ybWFsRnJvbU1hdDQob3V0LCBhKSB7XG4gIHZhciBhMDAgPSBhWzBdLCBhMDEgPSBhWzFdLCBhMDIgPSBhWzJdLCBhMDMgPSBhWzNdXG4gIHZhciBhMTAgPSBhWzRdLCBhMTEgPSBhWzVdLCBhMTIgPSBhWzZdLCBhMTMgPSBhWzddXG4gIHZhciBhMjAgPSBhWzhdLCBhMjEgPSBhWzldLCBhMjIgPSBhWzEwXSwgYTIzID0gYVsxMV1cbiAgdmFyIGEzMCA9IGFbMTJdLCBhMzEgPSBhWzEzXSwgYTMyID0gYVsxNF0sIGEzMyA9IGFbMTVdXG5cbiAgdmFyIGIwMCA9IGEwMCAqIGExMSAtIGEwMSAqIGExMFxuICB2YXIgYjAxID0gYTAwICogYTEyIC0gYTAyICogYTEwXG4gIHZhciBiMDIgPSBhMDAgKiBhMTMgLSBhMDMgKiBhMTBcbiAgdmFyIGIwMyA9IGEwMSAqIGExMiAtIGEwMiAqIGExMVxuICB2YXIgYjA0ID0gYTAxICogYTEzIC0gYTAzICogYTExXG4gIHZhciBiMDUgPSBhMDIgKiBhMTMgLSBhMDMgKiBhMTJcbiAgdmFyIGIwNiA9IGEyMCAqIGEzMSAtIGEyMSAqIGEzMFxuICB2YXIgYjA3ID0gYTIwICogYTMyIC0gYTIyICogYTMwXG4gIHZhciBiMDggPSBhMjAgKiBhMzMgLSBhMjMgKiBhMzBcbiAgdmFyIGIwOSA9IGEyMSAqIGEzMiAtIGEyMiAqIGEzMVxuICB2YXIgYjEwID0gYTIxICogYTMzIC0gYTIzICogYTMxXG4gIHZhciBiMTEgPSBhMjIgKiBhMzMgLSBhMjMgKiBhMzJcblxuICAvLyBDYWxjdWxhdGUgdGhlIGRldGVybWluYW50XG4gIHZhciBkZXQgPSBiMDAgKiBiMTFcbiAgICAgICAgICAtIGIwMSAqIGIxMFxuICAgICAgICAgICsgYjAyICogYjA5XG4gICAgICAgICAgKyBiMDMgKiBiMDhcbiAgICAgICAgICAtIGIwNCAqIGIwN1xuICAgICAgICAgICsgYjA1ICogYjA2XG5cbiAgaWYgKCFkZXQpIHJldHVybiBudWxsXG4gIGRldCA9IDEuMCAvIGRldFxuXG4gIG91dFswXSA9IChhMTEgKiBiMTEgLSBhMTIgKiBiMTAgKyBhMTMgKiBiMDkpICogZGV0XG4gIG91dFsxXSA9IChhMTIgKiBiMDggLSBhMTAgKiBiMTEgLSBhMTMgKiBiMDcpICogZGV0XG4gIG91dFsyXSA9IChhMTAgKiBiMTAgLSBhMTEgKiBiMDggKyBhMTMgKiBiMDYpICogZGV0XG5cbiAgb3V0WzNdID0gKGEwMiAqIGIxMCAtIGEwMSAqIGIxMSAtIGEwMyAqIGIwOSkgKiBkZXRcbiAgb3V0WzRdID0gKGEwMCAqIGIxMSAtIGEwMiAqIGIwOCArIGEwMyAqIGIwNykgKiBkZXRcbiAgb3V0WzVdID0gKGEwMSAqIGIwOCAtIGEwMCAqIGIxMCAtIGEwMyAqIGIwNikgKiBkZXRcblxuICBvdXRbNl0gPSAoYTMxICogYjA1IC0gYTMyICogYjA0ICsgYTMzICogYjAzKSAqIGRldFxuICBvdXRbN10gPSAoYTMyICogYjAyIC0gYTMwICogYjA1IC0gYTMzICogYjAxKSAqIGRldFxuICBvdXRbOF0gPSAoYTMwICogYjA0IC0gYTMxICogYjAyICsgYTMzICogYjAwKSAqIGRldFxuXG4gIHJldHVybiBvdXRcbn1cbiIsIm1vZHVsZS5leHBvcnRzID0gY29weTtcblxuLyoqXG4gKiBDb3B5IHRoZSB2YWx1ZXMgZnJvbSBvbmUgbWF0NCB0byBhbm90aGVyXG4gKlxuICogQHBhcmFtIHttYXQ0fSBvdXQgdGhlIHJlY2VpdmluZyBtYXRyaXhcbiAqIEBwYXJhbSB7bWF0NH0gYSB0aGUgc291cmNlIG1hdHJpeFxuICogQHJldHVybnMge21hdDR9IG91dFxuICovXG5mdW5jdGlvbiBjb3B5KG91dCwgYSkge1xuICAgIG91dFswXSA9IGFbMF07XG4gICAgb3V0WzFdID0gYVsxXTtcbiAgICBvdXRbMl0gPSBhWzJdO1xuICAgIG91dFszXSA9IGFbM107XG4gICAgb3V0WzRdID0gYVs0XTtcbiAgICBvdXRbNV0gPSBhWzVdO1xuICAgIG91dFs2XSA9IGFbNl07XG4gICAgb3V0WzddID0gYVs3XTtcbiAgICBvdXRbOF0gPSBhWzhdO1xuICAgIG91dFs5XSA9IGFbOV07XG4gICAgb3V0WzEwXSA9IGFbMTBdO1xuICAgIG91dFsxMV0gPSBhWzExXTtcbiAgICBvdXRbMTJdID0gYVsxMl07XG4gICAgb3V0WzEzXSA9IGFbMTNdO1xuICAgIG91dFsxNF0gPSBhWzE0XTtcbiAgICBvdXRbMTVdID0gYVsxNV07XG4gICAgcmV0dXJuIG91dDtcbn07IiwibW9kdWxlLmV4cG9ydHMgPSBpZGVudGl0eTtcblxuLyoqXG4gKiBTZXQgYSBtYXQ0IHRvIHRoZSBpZGVudGl0eSBtYXRyaXhcbiAqXG4gKiBAcGFyYW0ge21hdDR9IG91dCB0aGUgcmVjZWl2aW5nIG1hdHJpeFxuICogQHJldHVybnMge21hdDR9IG91dFxuICovXG5mdW5jdGlvbiBpZGVudGl0eShvdXQpIHtcbiAgICBvdXRbMF0gPSAxO1xuICAgIG91dFsxXSA9IDA7XG4gICAgb3V0WzJdID0gMDtcbiAgICBvdXRbM10gPSAwO1xuICAgIG91dFs0XSA9IDA7XG4gICAgb3V0WzVdID0gMTtcbiAgICBvdXRbNl0gPSAwO1xuICAgIG91dFs3XSA9IDA7XG4gICAgb3V0WzhdID0gMDtcbiAgICBvdXRbOV0gPSAwO1xuICAgIG91dFsxMF0gPSAxO1xuICAgIG91dFsxMV0gPSAwO1xuICAgIG91dFsxMl0gPSAwO1xuICAgIG91dFsxM10gPSAwO1xuICAgIG91dFsxNF0gPSAwO1xuICAgIG91dFsxNV0gPSAxO1xuICAgIHJldHVybiBvdXQ7XG59OyIsInZhciBpZGVudGl0eSA9IHJlcXVpcmUoJy4vaWRlbnRpdHknKTtcblxubW9kdWxlLmV4cG9ydHMgPSBsb29rQXQ7XG5cbi8qKlxuICogR2VuZXJhdGVzIGEgbG9vay1hdCBtYXRyaXggd2l0aCB0aGUgZ2l2ZW4gZXllIHBvc2l0aW9uLCBmb2NhbCBwb2ludCwgYW5kIHVwIGF4aXNcbiAqXG4gKiBAcGFyYW0ge21hdDR9IG91dCBtYXQ0IGZydXN0dW0gbWF0cml4IHdpbGwgYmUgd3JpdHRlbiBpbnRvXG4gKiBAcGFyYW0ge3ZlYzN9IGV5ZSBQb3NpdGlvbiBvZiB0aGUgdmlld2VyXG4gKiBAcGFyYW0ge3ZlYzN9IGNlbnRlciBQb2ludCB0aGUgdmlld2VyIGlzIGxvb2tpbmcgYXRcbiAqIEBwYXJhbSB7dmVjM30gdXAgdmVjMyBwb2ludGluZyB1cFxuICogQHJldHVybnMge21hdDR9IG91dFxuICovXG5mdW5jdGlvbiBsb29rQXQob3V0LCBleWUsIGNlbnRlciwgdXApIHtcbiAgICB2YXIgeDAsIHgxLCB4MiwgeTAsIHkxLCB5MiwgejAsIHoxLCB6MiwgbGVuLFxuICAgICAgICBleWV4ID0gZXllWzBdLFxuICAgICAgICBleWV5ID0gZXllWzFdLFxuICAgICAgICBleWV6ID0gZXllWzJdLFxuICAgICAgICB1cHggPSB1cFswXSxcbiAgICAgICAgdXB5ID0gdXBbMV0sXG4gICAgICAgIHVweiA9IHVwWzJdLFxuICAgICAgICBjZW50ZXJ4ID0gY2VudGVyWzBdLFxuICAgICAgICBjZW50ZXJ5ID0gY2VudGVyWzFdLFxuICAgICAgICBjZW50ZXJ6ID0gY2VudGVyWzJdO1xuXG4gICAgaWYgKE1hdGguYWJzKGV5ZXggLSBjZW50ZXJ4KSA8IDAuMDAwMDAxICYmXG4gICAgICAgIE1hdGguYWJzKGV5ZXkgLSBjZW50ZXJ5KSA8IDAuMDAwMDAxICYmXG4gICAgICAgIE1hdGguYWJzKGV5ZXogLSBjZW50ZXJ6KSA8IDAuMDAwMDAxKSB7XG4gICAgICAgIHJldHVybiBpZGVudGl0eShvdXQpO1xuICAgIH1cblxuICAgIHowID0gZXlleCAtIGNlbnRlcng7XG4gICAgejEgPSBleWV5IC0gY2VudGVyeTtcbiAgICB6MiA9IGV5ZXogLSBjZW50ZXJ6O1xuXG4gICAgbGVuID0gMSAvIE1hdGguc3FydCh6MCAqIHowICsgejEgKiB6MSArIHoyICogejIpO1xuICAgIHowICo9IGxlbjtcbiAgICB6MSAqPSBsZW47XG4gICAgejIgKj0gbGVuO1xuXG4gICAgeDAgPSB1cHkgKiB6MiAtIHVweiAqIHoxO1xuICAgIHgxID0gdXB6ICogejAgLSB1cHggKiB6MjtcbiAgICB4MiA9IHVweCAqIHoxIC0gdXB5ICogejA7XG4gICAgbGVuID0gTWF0aC5zcXJ0KHgwICogeDAgKyB4MSAqIHgxICsgeDIgKiB4Mik7XG4gICAgaWYgKCFsZW4pIHtcbiAgICAgICAgeDAgPSAwO1xuICAgICAgICB4MSA9IDA7XG4gICAgICAgIHgyID0gMDtcbiAgICB9IGVsc2Uge1xuICAgICAgICBsZW4gPSAxIC8gbGVuO1xuICAgICAgICB4MCAqPSBsZW47XG4gICAgICAgIHgxICo9IGxlbjtcbiAgICAgICAgeDIgKj0gbGVuO1xuICAgIH1cblxuICAgIHkwID0gejEgKiB4MiAtIHoyICogeDE7XG4gICAgeTEgPSB6MiAqIHgwIC0gejAgKiB4MjtcbiAgICB5MiA9IHowICogeDEgLSB6MSAqIHgwO1xuXG4gICAgbGVuID0gTWF0aC5zcXJ0KHkwICogeTAgKyB5MSAqIHkxICsgeTIgKiB5Mik7XG4gICAgaWYgKCFsZW4pIHtcbiAgICAgICAgeTAgPSAwO1xuICAgICAgICB5MSA9IDA7XG4gICAgICAgIHkyID0gMDtcbiAgICB9IGVsc2Uge1xuICAgICAgICBsZW4gPSAxIC8gbGVuO1xuICAgICAgICB5MCAqPSBsZW47XG4gICAgICAgIHkxICo9IGxlbjtcbiAgICAgICAgeTIgKj0gbGVuO1xuICAgIH1cblxuICAgIG91dFswXSA9IHgwO1xuICAgIG91dFsxXSA9IHkwO1xuICAgIG91dFsyXSA9IHowO1xuICAgIG91dFszXSA9IDA7XG4gICAgb3V0WzRdID0geDE7XG4gICAgb3V0WzVdID0geTE7XG4gICAgb3V0WzZdID0gejE7XG4gICAgb3V0WzddID0gMDtcbiAgICBvdXRbOF0gPSB4MjtcbiAgICBvdXRbOV0gPSB5MjtcbiAgICBvdXRbMTBdID0gejI7XG4gICAgb3V0WzExXSA9IDA7XG4gICAgb3V0WzEyXSA9IC0oeDAgKiBleWV4ICsgeDEgKiBleWV5ICsgeDIgKiBleWV6KTtcbiAgICBvdXRbMTNdID0gLSh5MCAqIGV5ZXggKyB5MSAqIGV5ZXkgKyB5MiAqIGV5ZXopO1xuICAgIG91dFsxNF0gPSAtKHowICogZXlleCArIHoxICogZXlleSArIHoyICogZXlleik7XG4gICAgb3V0WzE1XSA9IDE7XG5cbiAgICByZXR1cm4gb3V0O1xufTsiLCJtb2R1bGUuZXhwb3J0cyA9IG11bHRpcGx5O1xuXG4vKipcbiAqIE11bHRpcGxpZXMgdHdvIG1hdDQnc1xuICpcbiAqIEBwYXJhbSB7bWF0NH0gb3V0IHRoZSByZWNlaXZpbmcgbWF0cml4XG4gKiBAcGFyYW0ge21hdDR9IGEgdGhlIGZpcnN0IG9wZXJhbmRcbiAqIEBwYXJhbSB7bWF0NH0gYiB0aGUgc2Vjb25kIG9wZXJhbmRcbiAqIEByZXR1cm5zIHttYXQ0fSBvdXRcbiAqL1xuZnVuY3Rpb24gbXVsdGlwbHkob3V0LCBhLCBiKSB7XG4gICAgdmFyIGEwMCA9IGFbMF0sIGEwMSA9IGFbMV0sIGEwMiA9IGFbMl0sIGEwMyA9IGFbM10sXG4gICAgICAgIGExMCA9IGFbNF0sIGExMSA9IGFbNV0sIGExMiA9IGFbNl0sIGExMyA9IGFbN10sXG4gICAgICAgIGEyMCA9IGFbOF0sIGEyMSA9IGFbOV0sIGEyMiA9IGFbMTBdLCBhMjMgPSBhWzExXSxcbiAgICAgICAgYTMwID0gYVsxMl0sIGEzMSA9IGFbMTNdLCBhMzIgPSBhWzE0XSwgYTMzID0gYVsxNV07XG5cbiAgICAvLyBDYWNoZSBvbmx5IHRoZSBjdXJyZW50IGxpbmUgb2YgdGhlIHNlY29uZCBtYXRyaXhcbiAgICB2YXIgYjAgID0gYlswXSwgYjEgPSBiWzFdLCBiMiA9IGJbMl0sIGIzID0gYlszXTsgIFxuICAgIG91dFswXSA9IGIwKmEwMCArIGIxKmExMCArIGIyKmEyMCArIGIzKmEzMDtcbiAgICBvdXRbMV0gPSBiMCphMDEgKyBiMSphMTEgKyBiMiphMjEgKyBiMyphMzE7XG4gICAgb3V0WzJdID0gYjAqYTAyICsgYjEqYTEyICsgYjIqYTIyICsgYjMqYTMyO1xuICAgIG91dFszXSA9IGIwKmEwMyArIGIxKmExMyArIGIyKmEyMyArIGIzKmEzMztcblxuICAgIGIwID0gYls0XTsgYjEgPSBiWzVdOyBiMiA9IGJbNl07IGIzID0gYls3XTtcbiAgICBvdXRbNF0gPSBiMCphMDAgKyBiMSphMTAgKyBiMiphMjAgKyBiMyphMzA7XG4gICAgb3V0WzVdID0gYjAqYTAxICsgYjEqYTExICsgYjIqYTIxICsgYjMqYTMxO1xuICAgIG91dFs2XSA9IGIwKmEwMiArIGIxKmExMiArIGIyKmEyMiArIGIzKmEzMjtcbiAgICBvdXRbN10gPSBiMCphMDMgKyBiMSphMTMgKyBiMiphMjMgKyBiMyphMzM7XG5cbiAgICBiMCA9IGJbOF07IGIxID0gYls5XTsgYjIgPSBiWzEwXTsgYjMgPSBiWzExXTtcbiAgICBvdXRbOF0gPSBiMCphMDAgKyBiMSphMTAgKyBiMiphMjAgKyBiMyphMzA7XG4gICAgb3V0WzldID0gYjAqYTAxICsgYjEqYTExICsgYjIqYTIxICsgYjMqYTMxO1xuICAgIG91dFsxMF0gPSBiMCphMDIgKyBiMSphMTIgKyBiMiphMjIgKyBiMyphMzI7XG4gICAgb3V0WzExXSA9IGIwKmEwMyArIGIxKmExMyArIGIyKmEyMyArIGIzKmEzMztcblxuICAgIGIwID0gYlsxMl07IGIxID0gYlsxM107IGIyID0gYlsxNF07IGIzID0gYlsxNV07XG4gICAgb3V0WzEyXSA9IGIwKmEwMCArIGIxKmExMCArIGIyKmEyMCArIGIzKmEzMDtcbiAgICBvdXRbMTNdID0gYjAqYTAxICsgYjEqYTExICsgYjIqYTIxICsgYjMqYTMxO1xuICAgIG91dFsxNF0gPSBiMCphMDIgKyBiMSphMTIgKyBiMiphMjIgKyBiMyphMzI7XG4gICAgb3V0WzE1XSA9IGIwKmEwMyArIGIxKmExMyArIGIyKmEyMyArIGIzKmEzMztcbiAgICByZXR1cm4gb3V0O1xufTsiLCJtb2R1bGUuZXhwb3J0cyA9IHBlcnNwZWN0aXZlO1xuXG4vKipcbiAqIEdlbmVyYXRlcyBhIHBlcnNwZWN0aXZlIHByb2plY3Rpb24gbWF0cml4IHdpdGggdGhlIGdpdmVuIGJvdW5kc1xuICpcbiAqIEBwYXJhbSB7bWF0NH0gb3V0IG1hdDQgZnJ1c3R1bSBtYXRyaXggd2lsbCBiZSB3cml0dGVuIGludG9cbiAqIEBwYXJhbSB7bnVtYmVyfSBmb3Z5IFZlcnRpY2FsIGZpZWxkIG9mIHZpZXcgaW4gcmFkaWFuc1xuICogQHBhcmFtIHtudW1iZXJ9IGFzcGVjdCBBc3BlY3QgcmF0aW8uIHR5cGljYWxseSB2aWV3cG9ydCB3aWR0aC9oZWlnaHRcbiAqIEBwYXJhbSB7bnVtYmVyfSBuZWFyIE5lYXIgYm91bmQgb2YgdGhlIGZydXN0dW1cbiAqIEBwYXJhbSB7bnVtYmVyfSBmYXIgRmFyIGJvdW5kIG9mIHRoZSBmcnVzdHVtXG4gKiBAcmV0dXJucyB7bWF0NH0gb3V0XG4gKi9cbmZ1bmN0aW9uIHBlcnNwZWN0aXZlKG91dCwgZm92eSwgYXNwZWN0LCBuZWFyLCBmYXIpIHtcbiAgICB2YXIgZiA9IDEuMCAvIE1hdGgudGFuKGZvdnkgLyAyKSxcbiAgICAgICAgbmYgPSAxIC8gKG5lYXIgLSBmYXIpO1xuICAgIG91dFswXSA9IGYgLyBhc3BlY3Q7XG4gICAgb3V0WzFdID0gMDtcbiAgICBvdXRbMl0gPSAwO1xuICAgIG91dFszXSA9IDA7XG4gICAgb3V0WzRdID0gMDtcbiAgICBvdXRbNV0gPSBmO1xuICAgIG91dFs2XSA9IDA7XG4gICAgb3V0WzddID0gMDtcbiAgICBvdXRbOF0gPSAwO1xuICAgIG91dFs5XSA9IDA7XG4gICAgb3V0WzEwXSA9IChmYXIgKyBuZWFyKSAqIG5mO1xuICAgIG91dFsxMV0gPSAtMTtcbiAgICBvdXRbMTJdID0gMDtcbiAgICBvdXRbMTNdID0gMDtcbiAgICBvdXRbMTRdID0gKDIgKiBmYXIgKiBuZWFyKSAqIG5mO1xuICAgIG91dFsxNV0gPSAwO1xuICAgIHJldHVybiBvdXQ7XG59OyIsIm1vZHVsZS5leHBvcnRzID0gc2NhbGU7XG5cbi8qKlxuICogU2NhbGVzIHRoZSBtYXQ0IGJ5IHRoZSBkaW1lbnNpb25zIGluIHRoZSBnaXZlbiB2ZWMzXG4gKlxuICogQHBhcmFtIHttYXQ0fSBvdXQgdGhlIHJlY2VpdmluZyBtYXRyaXhcbiAqIEBwYXJhbSB7bWF0NH0gYSB0aGUgbWF0cml4IHRvIHNjYWxlXG4gKiBAcGFyYW0ge3ZlYzN9IHYgdGhlIHZlYzMgdG8gc2NhbGUgdGhlIG1hdHJpeCBieVxuICogQHJldHVybnMge21hdDR9IG91dFxuICoqL1xuZnVuY3Rpb24gc2NhbGUob3V0LCBhLCB2KSB7XG4gICAgdmFyIHggPSB2WzBdLCB5ID0gdlsxXSwgeiA9IHZbMl07XG5cbiAgICBvdXRbMF0gPSBhWzBdICogeDtcbiAgICBvdXRbMV0gPSBhWzFdICogeDtcbiAgICBvdXRbMl0gPSBhWzJdICogeDtcbiAgICBvdXRbM10gPSBhWzNdICogeDtcbiAgICBvdXRbNF0gPSBhWzRdICogeTtcbiAgICBvdXRbNV0gPSBhWzVdICogeTtcbiAgICBvdXRbNl0gPSBhWzZdICogeTtcbiAgICBvdXRbN10gPSBhWzddICogeTtcbiAgICBvdXRbOF0gPSBhWzhdICogejtcbiAgICBvdXRbOV0gPSBhWzldICogejtcbiAgICBvdXRbMTBdID0gYVsxMF0gKiB6O1xuICAgIG91dFsxMV0gPSBhWzExXSAqIHo7XG4gICAgb3V0WzEyXSA9IGFbMTJdO1xuICAgIG91dFsxM10gPSBhWzEzXTtcbiAgICBvdXRbMTRdID0gYVsxNF07XG4gICAgb3V0WzE1XSA9IGFbMTVdO1xuICAgIHJldHVybiBvdXQ7XG59OyIsIm1vZHVsZS5leHBvcnRzID0gdHJhbnNsYXRlO1xuXG4vKipcbiAqIFRyYW5zbGF0ZSBhIG1hdDQgYnkgdGhlIGdpdmVuIHZlY3RvclxuICpcbiAqIEBwYXJhbSB7bWF0NH0gb3V0IHRoZSByZWNlaXZpbmcgbWF0cml4XG4gKiBAcGFyYW0ge21hdDR9IGEgdGhlIG1hdHJpeCB0byB0cmFuc2xhdGVcbiAqIEBwYXJhbSB7dmVjM30gdiB2ZWN0b3IgdG8gdHJhbnNsYXRlIGJ5XG4gKiBAcmV0dXJucyB7bWF0NH0gb3V0XG4gKi9cbmZ1bmN0aW9uIHRyYW5zbGF0ZShvdXQsIGEsIHYpIHtcbiAgICB2YXIgeCA9IHZbMF0sIHkgPSB2WzFdLCB6ID0gdlsyXSxcbiAgICAgICAgYTAwLCBhMDEsIGEwMiwgYTAzLFxuICAgICAgICBhMTAsIGExMSwgYTEyLCBhMTMsXG4gICAgICAgIGEyMCwgYTIxLCBhMjIsIGEyMztcblxuICAgIGlmIChhID09PSBvdXQpIHtcbiAgICAgICAgb3V0WzEyXSA9IGFbMF0gKiB4ICsgYVs0XSAqIHkgKyBhWzhdICogeiArIGFbMTJdO1xuICAgICAgICBvdXRbMTNdID0gYVsxXSAqIHggKyBhWzVdICogeSArIGFbOV0gKiB6ICsgYVsxM107XG4gICAgICAgIG91dFsxNF0gPSBhWzJdICogeCArIGFbNl0gKiB5ICsgYVsxMF0gKiB6ICsgYVsxNF07XG4gICAgICAgIG91dFsxNV0gPSBhWzNdICogeCArIGFbN10gKiB5ICsgYVsxMV0gKiB6ICsgYVsxNV07XG4gICAgfSBlbHNlIHtcbiAgICAgICAgYTAwID0gYVswXTsgYTAxID0gYVsxXTsgYTAyID0gYVsyXTsgYTAzID0gYVszXTtcbiAgICAgICAgYTEwID0gYVs0XTsgYTExID0gYVs1XTsgYTEyID0gYVs2XTsgYTEzID0gYVs3XTtcbiAgICAgICAgYTIwID0gYVs4XTsgYTIxID0gYVs5XTsgYTIyID0gYVsxMF07IGEyMyA9IGFbMTFdO1xuXG4gICAgICAgIG91dFswXSA9IGEwMDsgb3V0WzFdID0gYTAxOyBvdXRbMl0gPSBhMDI7IG91dFszXSA9IGEwMztcbiAgICAgICAgb3V0WzRdID0gYTEwOyBvdXRbNV0gPSBhMTE7IG91dFs2XSA9IGExMjsgb3V0WzddID0gYTEzO1xuICAgICAgICBvdXRbOF0gPSBhMjA7IG91dFs5XSA9IGEyMTsgb3V0WzEwXSA9IGEyMjsgb3V0WzExXSA9IGEyMztcblxuICAgICAgICBvdXRbMTJdID0gYTAwICogeCArIGExMCAqIHkgKyBhMjAgKiB6ICsgYVsxMl07XG4gICAgICAgIG91dFsxM10gPSBhMDEgKiB4ICsgYTExICogeSArIGEyMSAqIHogKyBhWzEzXTtcbiAgICAgICAgb3V0WzE0XSA9IGEwMiAqIHggKyBhMTIgKiB5ICsgYTIyICogeiArIGFbMTRdO1xuICAgICAgICBvdXRbMTVdID0gYTAzICogeCArIGExMyAqIHkgKyBhMjMgKiB6ICsgYVsxNV07XG4gICAgfVxuXG4gICAgcmV0dXJuIG91dDtcbn07IiwibW9kdWxlLmV4cG9ydHMgPSBwYXJzZUVycm9yc1xuXG5mdW5jdGlvbiBwYXJzZUVycm9ycyhsb2cpIHtcbiAgbG9nID0gU3RyaW5nKGxvZylcblxuICB2YXIgbG9ncyA9IFtdXG4gIHZhciByZXN1bHRcblxuICB3aGlsZSAocmVzdWx0ID0gbG9nLm1hdGNoKC9FUlJPUlxcOihbXlxcbl0rKS8pKSB7XG4gICAgbG9nID0gbG9nLnNsaWNlKHJlc3VsdC5pbmRleCArIDEpXG5cbiAgICB2YXIgbGluZSA9IHJlc3VsdFsxXS50cmltKClcbiAgICB2YXIgc2VwcyA9IGxpbmUuc3BsaXQoJzonKVxuICAgIHZhciBlbXNnID0gc2Vwcy5zbGljZSgyKS5qb2luKCc6JykudHJpbSgpXG4gICAgdmFyIGZpbGUgPSBwYXJzZUludChzZXBzWzBdLCAxMClcbiAgICB2YXIgbGluZSA9IHBhcnNlSW50KHNlcHNbMV0sIDEwKVxuXG4gICAgbG9ncy5wdXNoKHtcbiAgICAgICAgbWVzc2FnZTogZW1zZ1xuICAgICAgLCBmaWxlOiBmaWxlXG4gICAgICAsIGxpbmU6IGxpbmVcbiAgICB9KVxuICB9XG5cbiAgcmV0dXJuIGxvZ3Ncbn1cbiIsImV4cG9ydHMucmVhZCA9IGZ1bmN0aW9uIChidWZmZXIsIG9mZnNldCwgaXNMRSwgbUxlbiwgbkJ5dGVzKSB7XG4gIHZhciBlLCBtXG4gIHZhciBlTGVuID0gbkJ5dGVzICogOCAtIG1MZW4gLSAxXG4gIHZhciBlTWF4ID0gKDEgPDwgZUxlbikgLSAxXG4gIHZhciBlQmlhcyA9IGVNYXggPj4gMVxuICB2YXIgbkJpdHMgPSAtN1xuICB2YXIgaSA9IGlzTEUgPyAobkJ5dGVzIC0gMSkgOiAwXG4gIHZhciBkID0gaXNMRSA/IC0xIDogMVxuICB2YXIgcyA9IGJ1ZmZlcltvZmZzZXQgKyBpXVxuXG4gIGkgKz0gZFxuXG4gIGUgPSBzICYgKCgxIDw8ICgtbkJpdHMpKSAtIDEpXG4gIHMgPj49ICgtbkJpdHMpXG4gIG5CaXRzICs9IGVMZW5cbiAgZm9yICg7IG5CaXRzID4gMDsgZSA9IGUgKiAyNTYgKyBidWZmZXJbb2Zmc2V0ICsgaV0sIGkgKz0gZCwgbkJpdHMgLT0gOCkge31cblxuICBtID0gZSAmICgoMSA8PCAoLW5CaXRzKSkgLSAxKVxuICBlID4+PSAoLW5CaXRzKVxuICBuQml0cyArPSBtTGVuXG4gIGZvciAoOyBuQml0cyA+IDA7IG0gPSBtICogMjU2ICsgYnVmZmVyW29mZnNldCArIGldLCBpICs9IGQsIG5CaXRzIC09IDgpIHt9XG5cbiAgaWYgKGUgPT09IDApIHtcbiAgICBlID0gMSAtIGVCaWFzXG4gIH0gZWxzZSBpZiAoZSA9PT0gZU1heCkge1xuICAgIHJldHVybiBtID8gTmFOIDogKChzID8gLTEgOiAxKSAqIEluZmluaXR5KVxuICB9IGVsc2Uge1xuICAgIG0gPSBtICsgTWF0aC5wb3coMiwgbUxlbilcbiAgICBlID0gZSAtIGVCaWFzXG4gIH1cbiAgcmV0dXJuIChzID8gLTEgOiAxKSAqIG0gKiBNYXRoLnBvdygyLCBlIC0gbUxlbilcbn1cblxuZXhwb3J0cy53cml0ZSA9IGZ1bmN0aW9uIChidWZmZXIsIHZhbHVlLCBvZmZzZXQsIGlzTEUsIG1MZW4sIG5CeXRlcykge1xuICB2YXIgZSwgbSwgY1xuICB2YXIgZUxlbiA9IG5CeXRlcyAqIDggLSBtTGVuIC0gMVxuICB2YXIgZU1heCA9ICgxIDw8IGVMZW4pIC0gMVxuICB2YXIgZUJpYXMgPSBlTWF4ID4+IDFcbiAgdmFyIHJ0ID0gKG1MZW4gPT09IDIzID8gTWF0aC5wb3coMiwgLTI0KSAtIE1hdGgucG93KDIsIC03NykgOiAwKVxuICB2YXIgaSA9IGlzTEUgPyAwIDogKG5CeXRlcyAtIDEpXG4gIHZhciBkID0gaXNMRSA/IDEgOiAtMVxuICB2YXIgcyA9IHZhbHVlIDwgMCB8fCAodmFsdWUgPT09IDAgJiYgMSAvIHZhbHVlIDwgMCkgPyAxIDogMFxuXG4gIHZhbHVlID0gTWF0aC5hYnModmFsdWUpXG5cbiAgaWYgKGlzTmFOKHZhbHVlKSB8fCB2YWx1ZSA9PT0gSW5maW5pdHkpIHtcbiAgICBtID0gaXNOYU4odmFsdWUpID8gMSA6IDBcbiAgICBlID0gZU1heFxuICB9IGVsc2Uge1xuICAgIGUgPSBNYXRoLmZsb29yKE1hdGgubG9nKHZhbHVlKSAvIE1hdGguTE4yKVxuICAgIGlmICh2YWx1ZSAqIChjID0gTWF0aC5wb3coMiwgLWUpKSA8IDEpIHtcbiAgICAgIGUtLVxuICAgICAgYyAqPSAyXG4gICAgfVxuICAgIGlmIChlICsgZUJpYXMgPj0gMSkge1xuICAgICAgdmFsdWUgKz0gcnQgLyBjXG4gICAgfSBlbHNlIHtcbiAgICAgIHZhbHVlICs9IHJ0ICogTWF0aC5wb3coMiwgMSAtIGVCaWFzKVxuICAgIH1cbiAgICBpZiAodmFsdWUgKiBjID49IDIpIHtcbiAgICAgIGUrK1xuICAgICAgYyAvPSAyXG4gICAgfVxuXG4gICAgaWYgKGUgKyBlQmlhcyA+PSBlTWF4KSB7XG4gICAgICBtID0gMFxuICAgICAgZSA9IGVNYXhcbiAgICB9IGVsc2UgaWYgKGUgKyBlQmlhcyA+PSAxKSB7XG4gICAgICBtID0gKHZhbHVlICogYyAtIDEpICogTWF0aC5wb3coMiwgbUxlbilcbiAgICAgIGUgPSBlICsgZUJpYXNcbiAgICB9IGVsc2Uge1xuICAgICAgbSA9IHZhbHVlICogTWF0aC5wb3coMiwgZUJpYXMgLSAxKSAqIE1hdGgucG93KDIsIG1MZW4pXG4gICAgICBlID0gMFxuICAgIH1cbiAgfVxuXG4gIGZvciAoOyBtTGVuID49IDg7IGJ1ZmZlcltvZmZzZXQgKyBpXSA9IG0gJiAweGZmLCBpICs9IGQsIG0gLz0gMjU2LCBtTGVuIC09IDgpIHt9XG5cbiAgZSA9IChlIDw8IG1MZW4pIHwgbVxuICBlTGVuICs9IG1MZW5cbiAgZm9yICg7IGVMZW4gPiAwOyBidWZmZXJbb2Zmc2V0ICsgaV0gPSBlICYgMHhmZiwgaSArPSBkLCBlIC89IDI1NiwgZUxlbiAtPSA4KSB7fVxuXG4gIGJ1ZmZlcltvZmZzZXQgKyBpIC0gZF0gfD0gcyAqIDEyOFxufVxuIiwiaWYgKHR5cGVvZiBPYmplY3QuY3JlYXRlID09PSAnZnVuY3Rpb24nKSB7XG4gIC8vIGltcGxlbWVudGF0aW9uIGZyb20gc3RhbmRhcmQgbm9kZS5qcyAndXRpbCcgbW9kdWxlXG4gIG1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gaW5oZXJpdHMoY3Rvciwgc3VwZXJDdG9yKSB7XG4gICAgY3Rvci5zdXBlcl8gPSBzdXBlckN0b3JcbiAgICBjdG9yLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoc3VwZXJDdG9yLnByb3RvdHlwZSwge1xuICAgICAgY29uc3RydWN0b3I6IHtcbiAgICAgICAgdmFsdWU6IGN0b3IsXG4gICAgICAgIGVudW1lcmFibGU6IGZhbHNlLFxuICAgICAgICB3cml0YWJsZTogdHJ1ZSxcbiAgICAgICAgY29uZmlndXJhYmxlOiB0cnVlXG4gICAgICB9XG4gICAgfSk7XG4gIH07XG59IGVsc2Uge1xuICAvLyBvbGQgc2Nob29sIHNoaW0gZm9yIG9sZCBicm93c2Vyc1xuICBtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGluaGVyaXRzKGN0b3IsIHN1cGVyQ3Rvcikge1xuICAgIGN0b3Iuc3VwZXJfID0gc3VwZXJDdG9yXG4gICAgdmFyIFRlbXBDdG9yID0gZnVuY3Rpb24gKCkge31cbiAgICBUZW1wQ3Rvci5wcm90b3R5cGUgPSBzdXBlckN0b3IucHJvdG90eXBlXG4gICAgY3Rvci5wcm90b3R5cGUgPSBuZXcgVGVtcEN0b3IoKVxuICAgIGN0b3IucHJvdG90eXBlLmNvbnN0cnVjdG9yID0gY3RvclxuICB9XG59XG4iLCIvKiFcbiAqIERldGVybWluZSBpZiBhbiBvYmplY3QgaXMgYSBCdWZmZXJcbiAqXG4gKiBAYXV0aG9yICAgRmVyb3NzIEFib3VraGFkaWplaCA8ZmVyb3NzQGZlcm9zcy5vcmc+IDxodHRwOi8vZmVyb3NzLm9yZz5cbiAqIEBsaWNlbnNlICBNSVRcbiAqL1xuXG4vLyBUaGUgX2lzQnVmZmVyIGNoZWNrIGlzIGZvciBTYWZhcmkgNS03IHN1cHBvcnQsIGJlY2F1c2UgaXQncyBtaXNzaW5nXG4vLyBPYmplY3QucHJvdG90eXBlLmNvbnN0cnVjdG9yLiBSZW1vdmUgdGhpcyBldmVudHVhbGx5XG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChvYmopIHtcbiAgcmV0dXJuIG9iaiAhPSBudWxsICYmIChpc0J1ZmZlcihvYmopIHx8IGlzU2xvd0J1ZmZlcihvYmopIHx8ICEhb2JqLl9pc0J1ZmZlcilcbn1cblxuZnVuY3Rpb24gaXNCdWZmZXIgKG9iaikge1xuICByZXR1cm4gISFvYmouY29uc3RydWN0b3IgJiYgdHlwZW9mIG9iai5jb25zdHJ1Y3Rvci5pc0J1ZmZlciA9PT0gJ2Z1bmN0aW9uJyAmJiBvYmouY29uc3RydWN0b3IuaXNCdWZmZXIob2JqKVxufVxuXG4vLyBGb3IgTm9kZSB2MC4xMCBzdXBwb3J0LiBSZW1vdmUgdGhpcyBldmVudHVhbGx5LlxuZnVuY3Rpb24gaXNTbG93QnVmZmVyIChvYmopIHtcbiAgcmV0dXJuIHR5cGVvZiBvYmoucmVhZEZsb2F0TEUgPT09ICdmdW5jdGlvbicgJiYgdHlwZW9mIG9iai5zbGljZSA9PT0gJ2Z1bmN0aW9uJyAmJiBpc0J1ZmZlcihvYmouc2xpY2UoMCwgMCkpXG59XG4iLCJ2YXIgdG9TdHJpbmcgPSB7fS50b1N0cmluZztcblxubW9kdWxlLmV4cG9ydHMgPSBBcnJheS5pc0FycmF5IHx8IGZ1bmN0aW9uIChhcnIpIHtcbiAgcmV0dXJuIHRvU3RyaW5nLmNhbGwoYXJyKSA9PSAnW29iamVjdCBBcnJheV0nO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcblxuXG52YXIgeWFtbCA9IHJlcXVpcmUoJy4vbGliL2pzLXlhbWwuanMnKTtcblxuXG5tb2R1bGUuZXhwb3J0cyA9IHlhbWw7XG4iLCIndXNlIHN0cmljdCc7XG5cblxudmFyIGxvYWRlciA9IHJlcXVpcmUoJy4vanMteWFtbC9sb2FkZXInKTtcbi8vIHZhciBkdW1wZXIgPSByZXF1aXJlKCcuL2pzLXlhbWwvZHVtcGVyJyk7XG5cblxuZnVuY3Rpb24gZGVwcmVjYXRlZChuYW1lKSB7XG4gIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdGdW5jdGlvbiAnICsgbmFtZSArICcgaXMgZGVwcmVjYXRlZCBhbmQgY2Fubm90IGJlIHVzZWQuJyk7XG4gIH07XG59XG5cblxubW9kdWxlLmV4cG9ydHMuVHlwZSAgICAgICAgICAgICAgICA9IHJlcXVpcmUoJy4vanMteWFtbC90eXBlJyk7XG5tb2R1bGUuZXhwb3J0cy5TY2hlbWEgICAgICAgICAgICAgID0gcmVxdWlyZSgnLi9qcy15YW1sL3NjaGVtYScpO1xubW9kdWxlLmV4cG9ydHMuRkFJTFNBRkVfU0NIRU1BICAgICA9IHJlcXVpcmUoJy4vanMteWFtbC9zY2hlbWEvZmFpbHNhZmUnKTtcbm1vZHVsZS5leHBvcnRzLkpTT05fU0NIRU1BICAgICAgICAgPSByZXF1aXJlKCcuL2pzLXlhbWwvc2NoZW1hL2pzb24nKTtcbm1vZHVsZS5leHBvcnRzLkNPUkVfU0NIRU1BICAgICAgICAgPSByZXF1aXJlKCcuL2pzLXlhbWwvc2NoZW1hL2NvcmUnKTtcbm1vZHVsZS5leHBvcnRzLkRFRkFVTFRfU0FGRV9TQ0hFTUEgPSByZXF1aXJlKCcuL2pzLXlhbWwvc2NoZW1hL2RlZmF1bHRfc2FmZScpO1xubW9kdWxlLmV4cG9ydHMuREVGQVVMVF9GVUxMX1NDSEVNQSA9IHJlcXVpcmUoJy4vanMteWFtbC9zY2hlbWEvZGVmYXVsdF9mdWxsJyk7XG5tb2R1bGUuZXhwb3J0cy5sb2FkICAgICAgICAgICAgICAgID0gbG9hZGVyLmxvYWQ7XG5tb2R1bGUuZXhwb3J0cy5sb2FkQWxsICAgICAgICAgICAgID0gbG9hZGVyLmxvYWRBbGw7XG5tb2R1bGUuZXhwb3J0cy5zYWZlTG9hZCAgICAgICAgICAgID0gbG9hZGVyLnNhZmVMb2FkO1xubW9kdWxlLmV4cG9ydHMuc2FmZUxvYWRBbGwgICAgICAgICA9IGxvYWRlci5zYWZlTG9hZEFsbDtcbi8vIG1vZHVsZS5leHBvcnRzLmR1bXAgICAgICAgICAgICAgICAgPSBkdW1wZXIuZHVtcDtcbi8vIG1vZHVsZS5leHBvcnRzLnNhZmVEdW1wICAgICAgICAgICAgPSBkdW1wZXIuc2FmZUR1bXA7XG5tb2R1bGUuZXhwb3J0cy5ZQU1MRXhjZXB0aW9uICAgICAgID0gcmVxdWlyZSgnLi9qcy15YW1sL2V4Y2VwdGlvbicpO1xuXG4vLyBEZXByZWNhdGVkIHNjaGVtYSBuYW1lcyBmcm9tIEpTLVlBTUwgMi4wLnhcbm1vZHVsZS5leHBvcnRzLk1JTklNQUxfU0NIRU1BID0gcmVxdWlyZSgnLi9qcy15YW1sL3NjaGVtYS9mYWlsc2FmZScpO1xubW9kdWxlLmV4cG9ydHMuU0FGRV9TQ0hFTUEgICAgPSByZXF1aXJlKCcuL2pzLXlhbWwvc2NoZW1hL2RlZmF1bHRfc2FmZScpO1xubW9kdWxlLmV4cG9ydHMuREVGQVVMVF9TQ0hFTUEgPSByZXF1aXJlKCcuL2pzLXlhbWwvc2NoZW1hL2RlZmF1bHRfZnVsbCcpO1xuXG4vLyBEZXByZWNhdGVkIGZ1bmN0aW9ucyBmcm9tIEpTLVlBTUwgMS54Lnhcbm1vZHVsZS5leHBvcnRzLnNjYW4gICAgICAgICAgID0gZGVwcmVjYXRlZCgnc2NhbicpO1xubW9kdWxlLmV4cG9ydHMucGFyc2UgICAgICAgICAgPSBkZXByZWNhdGVkKCdwYXJzZScpO1xubW9kdWxlLmV4cG9ydHMuY29tcG9zZSAgICAgICAgPSBkZXByZWNhdGVkKCdjb21wb3NlJyk7XG5tb2R1bGUuZXhwb3J0cy5hZGRDb25zdHJ1Y3RvciA9IGRlcHJlY2F0ZWQoJ2FkZENvbnN0cnVjdG9yJyk7XG4iLCIndXNlIHN0cmljdCc7XG5cblxuZnVuY3Rpb24gaXNOb3RoaW5nKHN1YmplY3QpIHtcbiAgcmV0dXJuICh0eXBlb2Ygc3ViamVjdCA9PT0gJ3VuZGVmaW5lZCcpIHx8IChzdWJqZWN0ID09PSBudWxsKTtcbn1cblxuXG5mdW5jdGlvbiBpc09iamVjdChzdWJqZWN0KSB7XG4gIHJldHVybiAodHlwZW9mIHN1YmplY3QgPT09ICdvYmplY3QnKSAmJiAoc3ViamVjdCAhPT0gbnVsbCk7XG59XG5cblxuZnVuY3Rpb24gdG9BcnJheShzZXF1ZW5jZSkge1xuICBpZiAoQXJyYXkuaXNBcnJheShzZXF1ZW5jZSkpIHJldHVybiBzZXF1ZW5jZTtcbiAgZWxzZSBpZiAoaXNOb3RoaW5nKHNlcXVlbmNlKSkgcmV0dXJuIFtdO1xuXG4gIHJldHVybiBbIHNlcXVlbmNlIF07XG59XG5cblxuZnVuY3Rpb24gZXh0ZW5kKHRhcmdldCwgc291cmNlKSB7XG4gIHZhciBpbmRleCwgbGVuZ3RoLCBrZXksIHNvdXJjZUtleXM7XG5cbiAgaWYgKHNvdXJjZSkge1xuICAgIHNvdXJjZUtleXMgPSBPYmplY3Qua2V5cyhzb3VyY2UpO1xuXG4gICAgZm9yIChpbmRleCA9IDAsIGxlbmd0aCA9IHNvdXJjZUtleXMubGVuZ3RoOyBpbmRleCA8IGxlbmd0aDsgaW5kZXggKz0gMSkge1xuICAgICAga2V5ID0gc291cmNlS2V5c1tpbmRleF07XG4gICAgICB0YXJnZXRba2V5XSA9IHNvdXJjZVtrZXldO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB0YXJnZXQ7XG59XG5cblxuZnVuY3Rpb24gcmVwZWF0KHN0cmluZywgY291bnQpIHtcbiAgdmFyIHJlc3VsdCA9ICcnLCBjeWNsZTtcblxuICBmb3IgKGN5Y2xlID0gMDsgY3ljbGUgPCBjb3VudDsgY3ljbGUgKz0gMSkge1xuICAgIHJlc3VsdCArPSBzdHJpbmc7XG4gIH1cblxuICByZXR1cm4gcmVzdWx0O1xufVxuXG5cbmZ1bmN0aW9uIGlzTmVnYXRpdmVaZXJvKG51bWJlcikge1xuICByZXR1cm4gKG51bWJlciA9PT0gMCkgJiYgKE51bWJlci5ORUdBVElWRV9JTkZJTklUWSA9PT0gMSAvIG51bWJlcik7XG59XG5cblxubW9kdWxlLmV4cG9ydHMuaXNOb3RoaW5nICAgICAgPSBpc05vdGhpbmc7XG5tb2R1bGUuZXhwb3J0cy5pc09iamVjdCAgICAgICA9IGlzT2JqZWN0O1xubW9kdWxlLmV4cG9ydHMudG9BcnJheSAgICAgICAgPSB0b0FycmF5O1xubW9kdWxlLmV4cG9ydHMucmVwZWF0ICAgICAgICAgPSByZXBlYXQ7XG5tb2R1bGUuZXhwb3J0cy5pc05lZ2F0aXZlWmVybyA9IGlzTmVnYXRpdmVaZXJvO1xubW9kdWxlLmV4cG9ydHMuZXh0ZW5kICAgICAgICAgPSBleHRlbmQ7XG4iLCIvLyBZQU1MIGVycm9yIGNsYXNzLiBodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzg0NTg5ODRcbi8vXG4ndXNlIHN0cmljdCc7XG5cbmZ1bmN0aW9uIFlBTUxFeGNlcHRpb24ocmVhc29uLCBtYXJrKSB7XG4gIC8vIFN1cGVyIGNvbnN0cnVjdG9yXG4gIEVycm9yLmNhbGwodGhpcyk7XG5cbiAgLy8gSW5jbHVkZSBzdGFjayB0cmFjZSBpbiBlcnJvciBvYmplY3RcbiAgaWYgKEVycm9yLmNhcHR1cmVTdGFja1RyYWNlKSB7XG4gICAgLy8gQ2hyb21lIGFuZCBOb2RlSlNcbiAgICBFcnJvci5jYXB0dXJlU3RhY2tUcmFjZSh0aGlzLCB0aGlzLmNvbnN0cnVjdG9yKTtcbiAgfSBlbHNlIHtcbiAgICAvLyBGRiwgSUUgMTArIGFuZCBTYWZhcmkgNisuIEZhbGxiYWNrIGZvciBvdGhlcnNcbiAgICB0aGlzLnN0YWNrID0gKG5ldyBFcnJvcigpKS5zdGFjayB8fCAnJztcbiAgfVxuXG4gIHRoaXMubmFtZSA9ICdZQU1MRXhjZXB0aW9uJztcbiAgdGhpcy5yZWFzb24gPSByZWFzb247XG4gIHRoaXMubWFyayA9IG1hcms7XG4gIHRoaXMubWVzc2FnZSA9ICh0aGlzLnJlYXNvbiB8fCAnKHVua25vd24gcmVhc29uKScpICsgKHRoaXMubWFyayA/ICcgJyArIHRoaXMubWFyay50b1N0cmluZygpIDogJycpO1xufVxuXG5cbi8vIEluaGVyaXQgZnJvbSBFcnJvclxuWUFNTEV4Y2VwdGlvbi5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKEVycm9yLnByb3RvdHlwZSk7XG5ZQU1MRXhjZXB0aW9uLnByb3RvdHlwZS5jb25zdHJ1Y3RvciA9IFlBTUxFeGNlcHRpb247XG5cblxuWUFNTEV4Y2VwdGlvbi5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbiB0b1N0cmluZyhjb21wYWN0KSB7XG4gIHZhciByZXN1bHQgPSB0aGlzLm5hbWUgKyAnOiAnO1xuXG4gIHJlc3VsdCArPSB0aGlzLnJlYXNvbiB8fCAnKHVua25vd24gcmVhc29uKSc7XG5cbiAgaWYgKCFjb21wYWN0ICYmIHRoaXMubWFyaykge1xuICAgIHJlc3VsdCArPSAnICcgKyB0aGlzLm1hcmsudG9TdHJpbmcoKTtcbiAgfVxuXG4gIHJldHVybiByZXN1bHQ7XG59O1xuXG5cbm1vZHVsZS5leHBvcnRzID0gWUFNTEV4Y2VwdGlvbjtcbiIsIid1c2Ugc3RyaWN0JztcblxuLyplc2xpbnQtZGlzYWJsZSBtYXgtbGVuLG5vLXVzZS1iZWZvcmUtZGVmaW5lKi9cblxudmFyIGNvbW1vbiAgICAgICAgICAgICAgPSByZXF1aXJlKCcuL2NvbW1vbicpO1xudmFyIFlBTUxFeGNlcHRpb24gICAgICAgPSByZXF1aXJlKCcuL2V4Y2VwdGlvbicpO1xudmFyIE1hcmsgICAgICAgICAgICAgICAgPSByZXF1aXJlKCcuL21hcmsnKTtcbnZhciBERUZBVUxUX1NBRkVfU0NIRU1BID0gcmVxdWlyZSgnLi9zY2hlbWEvZGVmYXVsdF9zYWZlJyk7XG52YXIgREVGQVVMVF9GVUxMX1NDSEVNQSA9IHJlcXVpcmUoJy4vc2NoZW1hL2RlZmF1bHRfZnVsbCcpO1xuXG5cbnZhciBfaGFzT3duUHJvcGVydHkgPSBPYmplY3QucHJvdG90eXBlLmhhc093blByb3BlcnR5O1xuXG5cbnZhciBDT05URVhUX0ZMT1dfSU4gICA9IDE7XG52YXIgQ09OVEVYVF9GTE9XX09VVCAgPSAyO1xudmFyIENPTlRFWFRfQkxPQ0tfSU4gID0gMztcbnZhciBDT05URVhUX0JMT0NLX09VVCA9IDQ7XG5cblxudmFyIENIT01QSU5HX0NMSVAgID0gMTtcbnZhciBDSE9NUElOR19TVFJJUCA9IDI7XG52YXIgQ0hPTVBJTkdfS0VFUCAgPSAzO1xuXG5cbnZhciBQQVRURVJOX05PTl9QUklOVEFCTEUgICAgICAgICA9IC9bXFx4MDAtXFx4MDhcXHgwQlxceDBDXFx4MEUtXFx4MUZcXHg3Ri1cXHg4NFxceDg2LVxceDlGXFx1RkZGRVxcdUZGRkZdfFtcXHVEODAwLVxcdURCRkZdKD8hW1xcdURDMDAtXFx1REZGRl0pfCg/OlteXFx1RDgwMC1cXHVEQkZGXXxeKVtcXHVEQzAwLVxcdURGRkZdLztcbnZhciBQQVRURVJOX05PTl9BU0NJSV9MSU5FX0JSRUFLUyA9IC9bXFx4ODVcXHUyMDI4XFx1MjAyOV0vO1xudmFyIFBBVFRFUk5fRkxPV19JTkRJQ0FUT1JTICAgICAgID0gL1ssXFxbXFxdXFx7XFx9XS87XG52YXIgUEFUVEVSTl9UQUdfSEFORExFICAgICAgICAgICAgPSAvXig/OiF8ISF8IVthLXpcXC1dKyEpJC9pO1xudmFyIFBBVFRFUk5fVEFHX1VSSSAgICAgICAgICAgICAgID0gL14oPzohfFteLFxcW1xcXVxce1xcfV0pKD86JVswLTlhLWZdezJ9fFswLTlhLXpcXC0jO1xcL1xcPzpAJj1cXCtcXCQsX1xcLiF+XFwqJ1xcKFxcKVxcW1xcXV0pKiQvaTtcblxuXG5mdW5jdGlvbiBpc19FT0woYykge1xuICByZXR1cm4gKGMgPT09IDB4MEEvKiBMRiAqLykgfHwgKGMgPT09IDB4MEQvKiBDUiAqLyk7XG59XG5cbmZ1bmN0aW9uIGlzX1dISVRFX1NQQUNFKGMpIHtcbiAgcmV0dXJuIChjID09PSAweDA5LyogVGFiICovKSB8fCAoYyA9PT0gMHgyMC8qIFNwYWNlICovKTtcbn1cblxuZnVuY3Rpb24gaXNfV1NfT1JfRU9MKGMpIHtcbiAgcmV0dXJuIChjID09PSAweDA5LyogVGFiICovKSB8fFxuICAgICAgICAgKGMgPT09IDB4MjAvKiBTcGFjZSAqLykgfHxcbiAgICAgICAgIChjID09PSAweDBBLyogTEYgKi8pIHx8XG4gICAgICAgICAoYyA9PT0gMHgwRC8qIENSICovKTtcbn1cblxuZnVuY3Rpb24gaXNfRkxPV19JTkRJQ0FUT1IoYykge1xuICByZXR1cm4gYyA9PT0gMHgyQy8qICwgKi8gfHxcbiAgICAgICAgIGMgPT09IDB4NUIvKiBbICovIHx8XG4gICAgICAgICBjID09PSAweDVELyogXSAqLyB8fFxuICAgICAgICAgYyA9PT0gMHg3Qi8qIHsgKi8gfHxcbiAgICAgICAgIGMgPT09IDB4N0QvKiB9ICovO1xufVxuXG5mdW5jdGlvbiBmcm9tSGV4Q29kZShjKSB7XG4gIHZhciBsYztcblxuICBpZiAoKDB4MzAvKiAwICovIDw9IGMpICYmIChjIDw9IDB4MzkvKiA5ICovKSkge1xuICAgIHJldHVybiBjIC0gMHgzMDtcbiAgfVxuXG4gIC8qZXNsaW50LWRpc2FibGUgbm8tYml0d2lzZSovXG4gIGxjID0gYyB8IDB4MjA7XG5cbiAgaWYgKCgweDYxLyogYSAqLyA8PSBsYykgJiYgKGxjIDw9IDB4NjYvKiBmICovKSkge1xuICAgIHJldHVybiBsYyAtIDB4NjEgKyAxMDtcbiAgfVxuXG4gIHJldHVybiAtMTtcbn1cblxuZnVuY3Rpb24gZXNjYXBlZEhleExlbihjKSB7XG4gIGlmIChjID09PSAweDc4LyogeCAqLykgeyByZXR1cm4gMjsgfVxuICBpZiAoYyA9PT0gMHg3NS8qIHUgKi8pIHsgcmV0dXJuIDQ7IH1cbiAgaWYgKGMgPT09IDB4NTUvKiBVICovKSB7IHJldHVybiA4OyB9XG4gIHJldHVybiAwO1xufVxuXG5mdW5jdGlvbiBmcm9tRGVjaW1hbENvZGUoYykge1xuICBpZiAoKDB4MzAvKiAwICovIDw9IGMpICYmIChjIDw9IDB4MzkvKiA5ICovKSkge1xuICAgIHJldHVybiBjIC0gMHgzMDtcbiAgfVxuXG4gIHJldHVybiAtMTtcbn1cblxuZnVuY3Rpb24gc2ltcGxlRXNjYXBlU2VxdWVuY2UoYykge1xuICByZXR1cm4gKGMgPT09IDB4MzAvKiAwICovKSA/ICdcXHgwMCcgOlxuICAgICAgICAoYyA9PT0gMHg2MS8qIGEgKi8pID8gJ1xceDA3JyA6XG4gICAgICAgIChjID09PSAweDYyLyogYiAqLykgPyAnXFx4MDgnIDpcbiAgICAgICAgKGMgPT09IDB4NzQvKiB0ICovKSA/ICdcXHgwOScgOlxuICAgICAgICAoYyA9PT0gMHgwOS8qIFRhYiAqLykgPyAnXFx4MDknIDpcbiAgICAgICAgKGMgPT09IDB4NkUvKiBuICovKSA/ICdcXHgwQScgOlxuICAgICAgICAoYyA9PT0gMHg3Ni8qIHYgKi8pID8gJ1xceDBCJyA6XG4gICAgICAgIChjID09PSAweDY2LyogZiAqLykgPyAnXFx4MEMnIDpcbiAgICAgICAgKGMgPT09IDB4NzIvKiByICovKSA/ICdcXHgwRCcgOlxuICAgICAgICAoYyA9PT0gMHg2NS8qIGUgKi8pID8gJ1xceDFCJyA6XG4gICAgICAgIChjID09PSAweDIwLyogU3BhY2UgKi8pID8gJyAnIDpcbiAgICAgICAgKGMgPT09IDB4MjIvKiBcIiAqLykgPyAnXFx4MjInIDpcbiAgICAgICAgKGMgPT09IDB4MkYvKiAvICovKSA/ICcvJyA6XG4gICAgICAgIChjID09PSAweDVDLyogXFwgKi8pID8gJ1xceDVDJyA6XG4gICAgICAgIChjID09PSAweDRFLyogTiAqLykgPyAnXFx4ODUnIDpcbiAgICAgICAgKGMgPT09IDB4NUYvKiBfICovKSA/ICdcXHhBMCcgOlxuICAgICAgICAoYyA9PT0gMHg0Qy8qIEwgKi8pID8gJ1xcdTIwMjgnIDpcbiAgICAgICAgKGMgPT09IDB4NTAvKiBQICovKSA/ICdcXHUyMDI5JyA6ICcnO1xufVxuXG5mdW5jdGlvbiBjaGFyRnJvbUNvZGVwb2ludChjKSB7XG4gIGlmIChjIDw9IDB4RkZGRikge1xuICAgIHJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKGMpO1xuICB9XG4gIC8vIEVuY29kZSBVVEYtMTYgc3Vycm9nYXRlIHBhaXJcbiAgLy8gaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvVVRGLTE2I0NvZGVfcG9pbnRzX1UuMkIwMTAwMDBfdG9fVS4yQjEwRkZGRlxuICByZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZSgoKGMgLSAweDAxMDAwMCkgPj4gMTApICsgMHhEODAwLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKGMgLSAweDAxMDAwMCkgJiAweDAzRkYpICsgMHhEQzAwKTtcbn1cblxudmFyIHNpbXBsZUVzY2FwZUNoZWNrID0gbmV3IEFycmF5KDI1Nik7IC8vIGludGVnZXIsIGZvciBmYXN0IGFjY2Vzc1xudmFyIHNpbXBsZUVzY2FwZU1hcCA9IG5ldyBBcnJheSgyNTYpO1xuZm9yICh2YXIgaSA9IDA7IGkgPCAyNTY7IGkrKykge1xuICBzaW1wbGVFc2NhcGVDaGVja1tpXSA9IHNpbXBsZUVzY2FwZVNlcXVlbmNlKGkpID8gMSA6IDA7XG4gIHNpbXBsZUVzY2FwZU1hcFtpXSA9IHNpbXBsZUVzY2FwZVNlcXVlbmNlKGkpO1xufVxuXG5cbmZ1bmN0aW9uIFN0YXRlKGlucHV0LCBvcHRpb25zKSB7XG4gIHRoaXMuaW5wdXQgPSBpbnB1dDtcblxuICB0aGlzLmZpbGVuYW1lICA9IG9wdGlvbnNbJ2ZpbGVuYW1lJ10gIHx8IG51bGw7XG4gIHRoaXMuc2NoZW1hICAgID0gb3B0aW9uc1snc2NoZW1hJ10gICAgfHwgREVGQVVMVF9GVUxMX1NDSEVNQTtcbiAgdGhpcy5vbldhcm5pbmcgPSBvcHRpb25zWydvbldhcm5pbmcnXSB8fCBudWxsO1xuICB0aGlzLmxlZ2FjeSAgICA9IG9wdGlvbnNbJ2xlZ2FjeSddICAgIHx8IGZhbHNlO1xuICB0aGlzLmpzb24gICAgICA9IG9wdGlvbnNbJ2pzb24nXSAgICAgIHx8IGZhbHNlO1xuICB0aGlzLmxpc3RlbmVyICA9IG9wdGlvbnNbJ2xpc3RlbmVyJ10gIHx8IG51bGw7XG5cbiAgdGhpcy5pbXBsaWNpdFR5cGVzID0gdGhpcy5zY2hlbWEuY29tcGlsZWRJbXBsaWNpdDtcbiAgdGhpcy50eXBlTWFwICAgICAgID0gdGhpcy5zY2hlbWEuY29tcGlsZWRUeXBlTWFwO1xuXG4gIHRoaXMubGVuZ3RoICAgICA9IGlucHV0Lmxlbmd0aDtcbiAgdGhpcy5wb3NpdGlvbiAgID0gMDtcbiAgdGhpcy5saW5lICAgICAgID0gMDtcbiAgdGhpcy5saW5lU3RhcnQgID0gMDtcbiAgdGhpcy5saW5lSW5kZW50ID0gMDtcblxuICB0aGlzLmRvY3VtZW50cyA9IFtdO1xuXG4gIC8qXG4gIHRoaXMudmVyc2lvbjtcbiAgdGhpcy5jaGVja0xpbmVCcmVha3M7XG4gIHRoaXMudGFnTWFwO1xuICB0aGlzLmFuY2hvck1hcDtcbiAgdGhpcy50YWc7XG4gIHRoaXMuYW5jaG9yO1xuICB0aGlzLmtpbmQ7XG4gIHRoaXMucmVzdWx0OyovXG5cbn1cblxuXG5mdW5jdGlvbiBnZW5lcmF0ZUVycm9yKHN0YXRlLCBtZXNzYWdlKSB7XG4gIHJldHVybiBuZXcgWUFNTEV4Y2VwdGlvbihcbiAgICBtZXNzYWdlLFxuICAgIG5ldyBNYXJrKHN0YXRlLmZpbGVuYW1lLCBzdGF0ZS5pbnB1dCwgc3RhdGUucG9zaXRpb24sIHN0YXRlLmxpbmUsIChzdGF0ZS5wb3NpdGlvbiAtIHN0YXRlLmxpbmVTdGFydCkpKTtcbn1cblxuZnVuY3Rpb24gdGhyb3dFcnJvcihzdGF0ZSwgbWVzc2FnZSkge1xuICB0aHJvdyBnZW5lcmF0ZUVycm9yKHN0YXRlLCBtZXNzYWdlKTtcbn1cblxuZnVuY3Rpb24gdGhyb3dXYXJuaW5nKHN0YXRlLCBtZXNzYWdlKSB7XG4gIGlmIChzdGF0ZS5vbldhcm5pbmcpIHtcbiAgICBzdGF0ZS5vbldhcm5pbmcuY2FsbChudWxsLCBnZW5lcmF0ZUVycm9yKHN0YXRlLCBtZXNzYWdlKSk7XG4gIH1cbn1cblxuXG52YXIgZGlyZWN0aXZlSGFuZGxlcnMgPSB7XG5cbiAgWUFNTDogZnVuY3Rpb24gaGFuZGxlWWFtbERpcmVjdGl2ZShzdGF0ZSwgbmFtZSwgYXJncykge1xuXG4gICAgdmFyIG1hdGNoLCBtYWpvciwgbWlub3I7XG5cbiAgICBpZiAoc3RhdGUudmVyc2lvbiAhPT0gbnVsbCkge1xuICAgICAgdGhyb3dFcnJvcihzdGF0ZSwgJ2R1cGxpY2F0aW9uIG9mICVZQU1MIGRpcmVjdGl2ZScpO1xuICAgIH1cblxuICAgIGlmIChhcmdzLmxlbmd0aCAhPT0gMSkge1xuICAgICAgdGhyb3dFcnJvcihzdGF0ZSwgJ1lBTUwgZGlyZWN0aXZlIGFjY2VwdHMgZXhhY3RseSBvbmUgYXJndW1lbnQnKTtcbiAgICB9XG5cbiAgICBtYXRjaCA9IC9eKFswLTldKylcXC4oWzAtOV0rKSQvLmV4ZWMoYXJnc1swXSk7XG5cbiAgICBpZiAobWF0Y2ggPT09IG51bGwpIHtcbiAgICAgIHRocm93RXJyb3Ioc3RhdGUsICdpbGwtZm9ybWVkIGFyZ3VtZW50IG9mIHRoZSBZQU1MIGRpcmVjdGl2ZScpO1xuICAgIH1cblxuICAgIG1ham9yID0gcGFyc2VJbnQobWF0Y2hbMV0sIDEwKTtcbiAgICBtaW5vciA9IHBhcnNlSW50KG1hdGNoWzJdLCAxMCk7XG5cbiAgICBpZiAobWFqb3IgIT09IDEpIHtcbiAgICAgIHRocm93RXJyb3Ioc3RhdGUsICd1bmFjY2VwdGFibGUgWUFNTCB2ZXJzaW9uIG9mIHRoZSBkb2N1bWVudCcpO1xuICAgIH1cblxuICAgIHN0YXRlLnZlcnNpb24gPSBhcmdzWzBdO1xuICAgIHN0YXRlLmNoZWNrTGluZUJyZWFrcyA9IChtaW5vciA8IDIpO1xuXG4gICAgaWYgKG1pbm9yICE9PSAxICYmIG1pbm9yICE9PSAyKSB7XG4gICAgICB0aHJvd1dhcm5pbmcoc3RhdGUsICd1bnN1cHBvcnRlZCBZQU1MIHZlcnNpb24gb2YgdGhlIGRvY3VtZW50Jyk7XG4gICAgfVxuICB9LFxuXG4gIFRBRzogZnVuY3Rpb24gaGFuZGxlVGFnRGlyZWN0aXZlKHN0YXRlLCBuYW1lLCBhcmdzKSB7XG5cbiAgICB2YXIgaGFuZGxlLCBwcmVmaXg7XG5cbiAgICBpZiAoYXJncy5sZW5ndGggIT09IDIpIHtcbiAgICAgIHRocm93RXJyb3Ioc3RhdGUsICdUQUcgZGlyZWN0aXZlIGFjY2VwdHMgZXhhY3RseSB0d28gYXJndW1lbnRzJyk7XG4gICAgfVxuXG4gICAgaGFuZGxlID0gYXJnc1swXTtcbiAgICBwcmVmaXggPSBhcmdzWzFdO1xuXG4gICAgaWYgKCFQQVRURVJOX1RBR19IQU5ETEUudGVzdChoYW5kbGUpKSB7XG4gICAgICB0aHJvd0Vycm9yKHN0YXRlLCAnaWxsLWZvcm1lZCB0YWcgaGFuZGxlIChmaXJzdCBhcmd1bWVudCkgb2YgdGhlIFRBRyBkaXJlY3RpdmUnKTtcbiAgICB9XG5cbiAgICBpZiAoX2hhc093blByb3BlcnR5LmNhbGwoc3RhdGUudGFnTWFwLCBoYW5kbGUpKSB7XG4gICAgICB0aHJvd0Vycm9yKHN0YXRlLCAndGhlcmUgaXMgYSBwcmV2aW91c2x5IGRlY2xhcmVkIHN1ZmZpeCBmb3IgXCInICsgaGFuZGxlICsgJ1wiIHRhZyBoYW5kbGUnKTtcbiAgICB9XG5cbiAgICBpZiAoIVBBVFRFUk5fVEFHX1VSSS50ZXN0KHByZWZpeCkpIHtcbiAgICAgIHRocm93RXJyb3Ioc3RhdGUsICdpbGwtZm9ybWVkIHRhZyBwcmVmaXggKHNlY29uZCBhcmd1bWVudCkgb2YgdGhlIFRBRyBkaXJlY3RpdmUnKTtcbiAgICB9XG5cbiAgICBzdGF0ZS50YWdNYXBbaGFuZGxlXSA9IHByZWZpeDtcbiAgfVxufTtcblxuXG5mdW5jdGlvbiBjYXB0dXJlU2VnbWVudChzdGF0ZSwgc3RhcnQsIGVuZCwgY2hlY2tKc29uKSB7XG4gIHZhciBfcG9zaXRpb24sIF9sZW5ndGgsIF9jaGFyYWN0ZXIsIF9yZXN1bHQ7XG5cbiAgaWYgKHN0YXJ0IDwgZW5kKSB7XG4gICAgX3Jlc3VsdCA9IHN0YXRlLmlucHV0LnNsaWNlKHN0YXJ0LCBlbmQpO1xuXG4gICAgaWYgKGNoZWNrSnNvbikge1xuICAgICAgZm9yIChfcG9zaXRpb24gPSAwLCBfbGVuZ3RoID0gX3Jlc3VsdC5sZW5ndGg7XG4gICAgICAgICAgIF9wb3NpdGlvbiA8IF9sZW5ndGg7XG4gICAgICAgICAgIF9wb3NpdGlvbiArPSAxKSB7XG4gICAgICAgIF9jaGFyYWN0ZXIgPSBfcmVzdWx0LmNoYXJDb2RlQXQoX3Bvc2l0aW9uKTtcbiAgICAgICAgaWYgKCEoX2NoYXJhY3RlciA9PT0gMHgwOSB8fFxuICAgICAgICAgICAgICAoMHgyMCA8PSBfY2hhcmFjdGVyICYmIF9jaGFyYWN0ZXIgPD0gMHgxMEZGRkYpKSkge1xuICAgICAgICAgIHRocm93RXJyb3Ioc3RhdGUsICdleHBlY3RlZCB2YWxpZCBKU09OIGNoYXJhY3RlcicpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIGlmIChQQVRURVJOX05PTl9QUklOVEFCTEUudGVzdChfcmVzdWx0KSkge1xuICAgICAgdGhyb3dFcnJvcihzdGF0ZSwgJ3RoZSBzdHJlYW0gY29udGFpbnMgbm9uLXByaW50YWJsZSBjaGFyYWN0ZXJzJyk7XG4gICAgfVxuXG4gICAgc3RhdGUucmVzdWx0ICs9IF9yZXN1bHQ7XG4gIH1cbn1cblxuZnVuY3Rpb24gbWVyZ2VNYXBwaW5ncyhzdGF0ZSwgZGVzdGluYXRpb24sIHNvdXJjZSwgb3ZlcnJpZGFibGVLZXlzKSB7XG4gIHZhciBzb3VyY2VLZXlzLCBrZXksIGluZGV4LCBxdWFudGl0eTtcblxuICBpZiAoIWNvbW1vbi5pc09iamVjdChzb3VyY2UpKSB7XG4gICAgdGhyb3dFcnJvcihzdGF0ZSwgJ2Nhbm5vdCBtZXJnZSBtYXBwaW5nczsgdGhlIHByb3ZpZGVkIHNvdXJjZSBvYmplY3QgaXMgdW5hY2NlcHRhYmxlJyk7XG4gIH1cblxuICBzb3VyY2VLZXlzID0gT2JqZWN0LmtleXMoc291cmNlKTtcblxuICBmb3IgKGluZGV4ID0gMCwgcXVhbnRpdHkgPSBzb3VyY2VLZXlzLmxlbmd0aDsgaW5kZXggPCBxdWFudGl0eTsgaW5kZXggKz0gMSkge1xuICAgIGtleSA9IHNvdXJjZUtleXNbaW5kZXhdO1xuXG4gICAgaWYgKCFfaGFzT3duUHJvcGVydHkuY2FsbChkZXN0aW5hdGlvbiwga2V5KSkge1xuICAgICAgZGVzdGluYXRpb25ba2V5XSA9IHNvdXJjZVtrZXldO1xuICAgICAgb3ZlcnJpZGFibGVLZXlzW2tleV0gPSB0cnVlO1xuICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBzdG9yZU1hcHBpbmdQYWlyKHN0YXRlLCBfcmVzdWx0LCBvdmVycmlkYWJsZUtleXMsIGtleVRhZywga2V5Tm9kZSwgdmFsdWVOb2RlKSB7XG4gIHZhciBpbmRleCwgcXVhbnRpdHk7XG5cbiAga2V5Tm9kZSA9IFN0cmluZyhrZXlOb2RlKTtcblxuICBpZiAoX3Jlc3VsdCA9PT0gbnVsbCkge1xuICAgIF9yZXN1bHQgPSB7fTtcbiAgfVxuXG4gIGlmIChrZXlUYWcgPT09ICd0YWc6eWFtbC5vcmcsMjAwMjptZXJnZScpIHtcbiAgICBpZiAoQXJyYXkuaXNBcnJheSh2YWx1ZU5vZGUpKSB7XG4gICAgICBmb3IgKGluZGV4ID0gMCwgcXVhbnRpdHkgPSB2YWx1ZU5vZGUubGVuZ3RoOyBpbmRleCA8IHF1YW50aXR5OyBpbmRleCArPSAxKSB7XG4gICAgICAgIG1lcmdlTWFwcGluZ3Moc3RhdGUsIF9yZXN1bHQsIHZhbHVlTm9kZVtpbmRleF0sIG92ZXJyaWRhYmxlS2V5cyk7XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIG1lcmdlTWFwcGluZ3Moc3RhdGUsIF9yZXN1bHQsIHZhbHVlTm9kZSwgb3ZlcnJpZGFibGVLZXlzKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgaWYgKCFzdGF0ZS5qc29uICYmXG4gICAgICAgICFfaGFzT3duUHJvcGVydHkuY2FsbChvdmVycmlkYWJsZUtleXMsIGtleU5vZGUpICYmXG4gICAgICAgIF9oYXNPd25Qcm9wZXJ0eS5jYWxsKF9yZXN1bHQsIGtleU5vZGUpKSB7XG4gICAgICB0aHJvd0Vycm9yKHN0YXRlLCAnZHVwbGljYXRlZCBtYXBwaW5nIGtleScpO1xuICAgIH1cbiAgICBfcmVzdWx0W2tleU5vZGVdID0gdmFsdWVOb2RlO1xuICAgIGRlbGV0ZSBvdmVycmlkYWJsZUtleXNba2V5Tm9kZV07XG4gIH1cblxuICByZXR1cm4gX3Jlc3VsdDtcbn1cblxuZnVuY3Rpb24gcmVhZExpbmVCcmVhayhzdGF0ZSkge1xuICB2YXIgY2g7XG5cbiAgY2ggPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KHN0YXRlLnBvc2l0aW9uKTtcblxuICBpZiAoY2ggPT09IDB4MEEvKiBMRiAqLykge1xuICAgIHN0YXRlLnBvc2l0aW9uKys7XG4gIH0gZWxzZSBpZiAoY2ggPT09IDB4MEQvKiBDUiAqLykge1xuICAgIHN0YXRlLnBvc2l0aW9uKys7XG4gICAgaWYgKHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoc3RhdGUucG9zaXRpb24pID09PSAweDBBLyogTEYgKi8pIHtcbiAgICAgIHN0YXRlLnBvc2l0aW9uKys7XG4gICAgfVxuICB9IGVsc2Uge1xuICAgIHRocm93RXJyb3Ioc3RhdGUsICdhIGxpbmUgYnJlYWsgaXMgZXhwZWN0ZWQnKTtcbiAgfVxuXG4gIHN0YXRlLmxpbmUgKz0gMTtcbiAgc3RhdGUubGluZVN0YXJ0ID0gc3RhdGUucG9zaXRpb247XG59XG5cbmZ1bmN0aW9uIHNraXBTZXBhcmF0aW9uU3BhY2Uoc3RhdGUsIGFsbG93Q29tbWVudHMsIGNoZWNrSW5kZW50KSB7XG4gIHZhciBsaW5lQnJlYWtzID0gMCxcbiAgICAgIGNoID0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdChzdGF0ZS5wb3NpdGlvbik7XG5cbiAgd2hpbGUgKGNoICE9PSAwKSB7XG4gICAgd2hpbGUgKGlzX1dISVRFX1NQQUNFKGNoKSkge1xuICAgICAgY2ggPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KCsrc3RhdGUucG9zaXRpb24pO1xuICAgIH1cblxuICAgIGlmIChhbGxvd0NvbW1lbnRzICYmIGNoID09PSAweDIzLyogIyAqLykge1xuICAgICAgZG8ge1xuICAgICAgICBjaCA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoKytzdGF0ZS5wb3NpdGlvbik7XG4gICAgICB9IHdoaWxlIChjaCAhPT0gMHgwQS8qIExGICovICYmIGNoICE9PSAweDBELyogQ1IgKi8gJiYgY2ggIT09IDApO1xuICAgIH1cblxuICAgIGlmIChpc19FT0woY2gpKSB7XG4gICAgICByZWFkTGluZUJyZWFrKHN0YXRlKTtcblxuICAgICAgY2ggPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KHN0YXRlLnBvc2l0aW9uKTtcbiAgICAgIGxpbmVCcmVha3MrKztcbiAgICAgIHN0YXRlLmxpbmVJbmRlbnQgPSAwO1xuXG4gICAgICB3aGlsZSAoY2ggPT09IDB4MjAvKiBTcGFjZSAqLykge1xuICAgICAgICBzdGF0ZS5saW5lSW5kZW50Kys7XG4gICAgICAgIGNoID0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdCgrK3N0YXRlLnBvc2l0aW9uKTtcbiAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgYnJlYWs7XG4gICAgfVxuICB9XG5cbiAgaWYgKGNoZWNrSW5kZW50ICE9PSAtMSAmJiBsaW5lQnJlYWtzICE9PSAwICYmIHN0YXRlLmxpbmVJbmRlbnQgPCBjaGVja0luZGVudCkge1xuICAgIHRocm93V2FybmluZyhzdGF0ZSwgJ2RlZmljaWVudCBpbmRlbnRhdGlvbicpO1xuICB9XG5cbiAgcmV0dXJuIGxpbmVCcmVha3M7XG59XG5cbmZ1bmN0aW9uIHRlc3REb2N1bWVudFNlcGFyYXRvcihzdGF0ZSkge1xuICB2YXIgX3Bvc2l0aW9uID0gc3RhdGUucG9zaXRpb24sXG4gICAgICBjaDtcblxuICBjaCA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoX3Bvc2l0aW9uKTtcblxuICAvLyBDb25kaXRpb24gc3RhdGUucG9zaXRpb24gPT09IHN0YXRlLmxpbmVTdGFydCBpcyB0ZXN0ZWRcbiAgLy8gaW4gcGFyZW50IG9uIGVhY2ggY2FsbCwgZm9yIGVmZmljaWVuY3kuIE5vIG5lZWRzIHRvIHRlc3QgaGVyZSBhZ2Fpbi5cbiAgaWYgKChjaCA9PT0gMHgyRC8qIC0gKi8gfHwgY2ggPT09IDB4MkUvKiAuICovKSAmJlxuICAgICAgY2ggPT09IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoX3Bvc2l0aW9uICsgMSkgJiZcbiAgICAgIGNoID09PSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KF9wb3NpdGlvbiArIDIpKSB7XG5cbiAgICBfcG9zaXRpb24gKz0gMztcblxuICAgIGNoID0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdChfcG9zaXRpb24pO1xuXG4gICAgaWYgKGNoID09PSAwIHx8IGlzX1dTX09SX0VPTChjaCkpIHtcbiAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiBmYWxzZTtcbn1cblxuZnVuY3Rpb24gd3JpdGVGb2xkZWRMaW5lcyhzdGF0ZSwgY291bnQpIHtcbiAgaWYgKGNvdW50ID09PSAxKSB7XG4gICAgc3RhdGUucmVzdWx0ICs9ICcgJztcbiAgfSBlbHNlIGlmIChjb3VudCA+IDEpIHtcbiAgICBzdGF0ZS5yZXN1bHQgKz0gY29tbW9uLnJlcGVhdCgnXFxuJywgY291bnQgLSAxKTtcbiAgfVxufVxuXG5cbmZ1bmN0aW9uIHJlYWRQbGFpblNjYWxhcihzdGF0ZSwgbm9kZUluZGVudCwgd2l0aGluRmxvd0NvbGxlY3Rpb24pIHtcbiAgdmFyIHByZWNlZGluZyxcbiAgICAgIGZvbGxvd2luZyxcbiAgICAgIGNhcHR1cmVTdGFydCxcbiAgICAgIGNhcHR1cmVFbmQsXG4gICAgICBoYXNQZW5kaW5nQ29udGVudCxcbiAgICAgIF9saW5lLFxuICAgICAgX2xpbmVTdGFydCxcbiAgICAgIF9saW5lSW5kZW50LFxuICAgICAgX2tpbmQgPSBzdGF0ZS5raW5kLFxuICAgICAgX3Jlc3VsdCA9IHN0YXRlLnJlc3VsdCxcbiAgICAgIGNoO1xuXG4gIGNoID0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdChzdGF0ZS5wb3NpdGlvbik7XG5cbiAgaWYgKGlzX1dTX09SX0VPTChjaCkgICAgICB8fFxuICAgICAgaXNfRkxPV19JTkRJQ0FUT1IoY2gpIHx8XG4gICAgICBjaCA9PT0gMHgyMy8qICMgKi8gICAgfHxcbiAgICAgIGNoID09PSAweDI2LyogJiAqLyAgICB8fFxuICAgICAgY2ggPT09IDB4MkEvKiAqICovICAgIHx8XG4gICAgICBjaCA9PT0gMHgyMS8qICEgKi8gICAgfHxcbiAgICAgIGNoID09PSAweDdDLyogfCAqLyAgICB8fFxuICAgICAgY2ggPT09IDB4M0UvKiA+ICovICAgIHx8XG4gICAgICBjaCA9PT0gMHgyNy8qICcgKi8gICAgfHxcbiAgICAgIGNoID09PSAweDIyLyogXCIgKi8gICAgfHxcbiAgICAgIGNoID09PSAweDI1LyogJSAqLyAgICB8fFxuICAgICAgY2ggPT09IDB4NDAvKiBAICovICAgIHx8XG4gICAgICBjaCA9PT0gMHg2MC8qIGAgKi8pIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cblxuICBpZiAoY2ggPT09IDB4M0YvKiA/ICovIHx8IGNoID09PSAweDJELyogLSAqLykge1xuICAgIGZvbGxvd2luZyA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoc3RhdGUucG9zaXRpb24gKyAxKTtcblxuICAgIGlmIChpc19XU19PUl9FT0woZm9sbG93aW5nKSB8fFxuICAgICAgICB3aXRoaW5GbG93Q29sbGVjdGlvbiAmJiBpc19GTE9XX0lORElDQVRPUihmb2xsb3dpbmcpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICB9XG5cbiAgc3RhdGUua2luZCA9ICdzY2FsYXInO1xuICBzdGF0ZS5yZXN1bHQgPSAnJztcbiAgY2FwdHVyZVN0YXJ0ID0gY2FwdHVyZUVuZCA9IHN0YXRlLnBvc2l0aW9uO1xuICBoYXNQZW5kaW5nQ29udGVudCA9IGZhbHNlO1xuXG4gIHdoaWxlIChjaCAhPT0gMCkge1xuICAgIGlmIChjaCA9PT0gMHgzQS8qIDogKi8pIHtcbiAgICAgIGZvbGxvd2luZyA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoc3RhdGUucG9zaXRpb24gKyAxKTtcblxuICAgICAgaWYgKGlzX1dTX09SX0VPTChmb2xsb3dpbmcpIHx8XG4gICAgICAgICAgd2l0aGluRmxvd0NvbGxlY3Rpb24gJiYgaXNfRkxPV19JTkRJQ0FUT1IoZm9sbG93aW5nKSkge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgIH0gZWxzZSBpZiAoY2ggPT09IDB4MjMvKiAjICovKSB7XG4gICAgICBwcmVjZWRpbmcgPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KHN0YXRlLnBvc2l0aW9uIC0gMSk7XG5cbiAgICAgIGlmIChpc19XU19PUl9FT0wocHJlY2VkaW5nKSkge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgIH0gZWxzZSBpZiAoKHN0YXRlLnBvc2l0aW9uID09PSBzdGF0ZS5saW5lU3RhcnQgJiYgdGVzdERvY3VtZW50U2VwYXJhdG9yKHN0YXRlKSkgfHxcbiAgICAgICAgICAgICAgIHdpdGhpbkZsb3dDb2xsZWN0aW9uICYmIGlzX0ZMT1dfSU5ESUNBVE9SKGNoKSkge1xuICAgICAgYnJlYWs7XG5cbiAgICB9IGVsc2UgaWYgKGlzX0VPTChjaCkpIHtcbiAgICAgIF9saW5lID0gc3RhdGUubGluZTtcbiAgICAgIF9saW5lU3RhcnQgPSBzdGF0ZS5saW5lU3RhcnQ7XG4gICAgICBfbGluZUluZGVudCA9IHN0YXRlLmxpbmVJbmRlbnQ7XG4gICAgICBza2lwU2VwYXJhdGlvblNwYWNlKHN0YXRlLCBmYWxzZSwgLTEpO1xuXG4gICAgICBpZiAoc3RhdGUubGluZUluZGVudCA+PSBub2RlSW5kZW50KSB7XG4gICAgICAgIGhhc1BlbmRpbmdDb250ZW50ID0gdHJ1ZTtcbiAgICAgICAgY2ggPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KHN0YXRlLnBvc2l0aW9uKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzdGF0ZS5wb3NpdGlvbiA9IGNhcHR1cmVFbmQ7XG4gICAgICAgIHN0YXRlLmxpbmUgPSBfbGluZTtcbiAgICAgICAgc3RhdGUubGluZVN0YXJ0ID0gX2xpbmVTdGFydDtcbiAgICAgICAgc3RhdGUubGluZUluZGVudCA9IF9saW5lSW5kZW50O1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoaGFzUGVuZGluZ0NvbnRlbnQpIHtcbiAgICAgIGNhcHR1cmVTZWdtZW50KHN0YXRlLCBjYXB0dXJlU3RhcnQsIGNhcHR1cmVFbmQsIGZhbHNlKTtcbiAgICAgIHdyaXRlRm9sZGVkTGluZXMoc3RhdGUsIHN0YXRlLmxpbmUgLSBfbGluZSk7XG4gICAgICBjYXB0dXJlU3RhcnQgPSBjYXB0dXJlRW5kID0gc3RhdGUucG9zaXRpb247XG4gICAgICBoYXNQZW5kaW5nQ29udGVudCA9IGZhbHNlO1xuICAgIH1cblxuICAgIGlmICghaXNfV0hJVEVfU1BBQ0UoY2gpKSB7XG4gICAgICBjYXB0dXJlRW5kID0gc3RhdGUucG9zaXRpb24gKyAxO1xuICAgIH1cblxuICAgIGNoID0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdCgrK3N0YXRlLnBvc2l0aW9uKTtcbiAgfVxuXG4gIGNhcHR1cmVTZWdtZW50KHN0YXRlLCBjYXB0dXJlU3RhcnQsIGNhcHR1cmVFbmQsIGZhbHNlKTtcblxuICBpZiAoc3RhdGUucmVzdWx0KSB7XG4gICAgcmV0dXJuIHRydWU7XG4gIH1cblxuICBzdGF0ZS5raW5kID0gX2tpbmQ7XG4gIHN0YXRlLnJlc3VsdCA9IF9yZXN1bHQ7XG4gIHJldHVybiBmYWxzZTtcbn1cblxuZnVuY3Rpb24gcmVhZFNpbmdsZVF1b3RlZFNjYWxhcihzdGF0ZSwgbm9kZUluZGVudCkge1xuICB2YXIgY2gsXG4gICAgICBjYXB0dXJlU3RhcnQsIGNhcHR1cmVFbmQ7XG5cbiAgY2ggPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KHN0YXRlLnBvc2l0aW9uKTtcblxuICBpZiAoY2ggIT09IDB4MjcvKiAnICovKSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgc3RhdGUua2luZCA9ICdzY2FsYXInO1xuICBzdGF0ZS5yZXN1bHQgPSAnJztcbiAgc3RhdGUucG9zaXRpb24rKztcbiAgY2FwdHVyZVN0YXJ0ID0gY2FwdHVyZUVuZCA9IHN0YXRlLnBvc2l0aW9uO1xuXG4gIHdoaWxlICgoY2ggPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KHN0YXRlLnBvc2l0aW9uKSkgIT09IDApIHtcbiAgICBpZiAoY2ggPT09IDB4MjcvKiAnICovKSB7XG4gICAgICBjYXB0dXJlU2VnbWVudChzdGF0ZSwgY2FwdHVyZVN0YXJ0LCBzdGF0ZS5wb3NpdGlvbiwgdHJ1ZSk7XG4gICAgICBjaCA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoKytzdGF0ZS5wb3NpdGlvbik7XG5cbiAgICAgIGlmIChjaCA9PT0gMHgyNy8qICcgKi8pIHtcbiAgICAgICAgY2FwdHVyZVN0YXJ0ID0gY2FwdHVyZUVuZCA9IHN0YXRlLnBvc2l0aW9uO1xuICAgICAgICBzdGF0ZS5wb3NpdGlvbisrO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICB9XG5cbiAgICB9IGVsc2UgaWYgKGlzX0VPTChjaCkpIHtcbiAgICAgIGNhcHR1cmVTZWdtZW50KHN0YXRlLCBjYXB0dXJlU3RhcnQsIGNhcHR1cmVFbmQsIHRydWUpO1xuICAgICAgd3JpdGVGb2xkZWRMaW5lcyhzdGF0ZSwgc2tpcFNlcGFyYXRpb25TcGFjZShzdGF0ZSwgZmFsc2UsIG5vZGVJbmRlbnQpKTtcbiAgICAgIGNhcHR1cmVTdGFydCA9IGNhcHR1cmVFbmQgPSBzdGF0ZS5wb3NpdGlvbjtcblxuICAgIH0gZWxzZSBpZiAoc3RhdGUucG9zaXRpb24gPT09IHN0YXRlLmxpbmVTdGFydCAmJiB0ZXN0RG9jdW1lbnRTZXBhcmF0b3Ioc3RhdGUpKSB7XG4gICAgICB0aHJvd0Vycm9yKHN0YXRlLCAndW5leHBlY3RlZCBlbmQgb2YgdGhlIGRvY3VtZW50IHdpdGhpbiBhIHNpbmdsZSBxdW90ZWQgc2NhbGFyJyk7XG5cbiAgICB9IGVsc2Uge1xuICAgICAgc3RhdGUucG9zaXRpb24rKztcbiAgICAgIGNhcHR1cmVFbmQgPSBzdGF0ZS5wb3NpdGlvbjtcbiAgICB9XG4gIH1cblxuICB0aHJvd0Vycm9yKHN0YXRlLCAndW5leHBlY3RlZCBlbmQgb2YgdGhlIHN0cmVhbSB3aXRoaW4gYSBzaW5nbGUgcXVvdGVkIHNjYWxhcicpO1xufVxuXG5mdW5jdGlvbiByZWFkRG91YmxlUXVvdGVkU2NhbGFyKHN0YXRlLCBub2RlSW5kZW50KSB7XG4gIHZhciBjYXB0dXJlU3RhcnQsXG4gICAgICBjYXB0dXJlRW5kLFxuICAgICAgaGV4TGVuZ3RoLFxuICAgICAgaGV4UmVzdWx0LFxuICAgICAgdG1wLFxuICAgICAgY2g7XG5cbiAgY2ggPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KHN0YXRlLnBvc2l0aW9uKTtcblxuICBpZiAoY2ggIT09IDB4MjIvKiBcIiAqLykge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHN0YXRlLmtpbmQgPSAnc2NhbGFyJztcbiAgc3RhdGUucmVzdWx0ID0gJyc7XG4gIHN0YXRlLnBvc2l0aW9uKys7XG4gIGNhcHR1cmVTdGFydCA9IGNhcHR1cmVFbmQgPSBzdGF0ZS5wb3NpdGlvbjtcblxuICB3aGlsZSAoKGNoID0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdChzdGF0ZS5wb3NpdGlvbikpICE9PSAwKSB7XG4gICAgaWYgKGNoID09PSAweDIyLyogXCIgKi8pIHtcbiAgICAgIGNhcHR1cmVTZWdtZW50KHN0YXRlLCBjYXB0dXJlU3RhcnQsIHN0YXRlLnBvc2l0aW9uLCB0cnVlKTtcbiAgICAgIHN0YXRlLnBvc2l0aW9uKys7XG4gICAgICByZXR1cm4gdHJ1ZTtcblxuICAgIH0gZWxzZSBpZiAoY2ggPT09IDB4NUMvKiBcXCAqLykge1xuICAgICAgY2FwdHVyZVNlZ21lbnQoc3RhdGUsIGNhcHR1cmVTdGFydCwgc3RhdGUucG9zaXRpb24sIHRydWUpO1xuICAgICAgY2ggPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KCsrc3RhdGUucG9zaXRpb24pO1xuXG4gICAgICBpZiAoaXNfRU9MKGNoKSkge1xuICAgICAgICBza2lwU2VwYXJhdGlvblNwYWNlKHN0YXRlLCBmYWxzZSwgbm9kZUluZGVudCk7XG5cbiAgICAgICAgLy8gVE9ETzogcmV3b3JrIHRvIGlubGluZSBmbiB3aXRoIG5vIHR5cGUgY2FzdD9cbiAgICAgIH0gZWxzZSBpZiAoY2ggPCAyNTYgJiYgc2ltcGxlRXNjYXBlQ2hlY2tbY2hdKSB7XG4gICAgICAgIHN0YXRlLnJlc3VsdCArPSBzaW1wbGVFc2NhcGVNYXBbY2hdO1xuICAgICAgICBzdGF0ZS5wb3NpdGlvbisrO1xuXG4gICAgICB9IGVsc2UgaWYgKCh0bXAgPSBlc2NhcGVkSGV4TGVuKGNoKSkgPiAwKSB7XG4gICAgICAgIGhleExlbmd0aCA9IHRtcDtcbiAgICAgICAgaGV4UmVzdWx0ID0gMDtcblxuICAgICAgICBmb3IgKDsgaGV4TGVuZ3RoID4gMDsgaGV4TGVuZ3RoLS0pIHtcbiAgICAgICAgICBjaCA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoKytzdGF0ZS5wb3NpdGlvbik7XG5cbiAgICAgICAgICBpZiAoKHRtcCA9IGZyb21IZXhDb2RlKGNoKSkgPj0gMCkge1xuICAgICAgICAgICAgaGV4UmVzdWx0ID0gKGhleFJlc3VsdCA8PCA0KSArIHRtcDtcblxuICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aHJvd0Vycm9yKHN0YXRlLCAnZXhwZWN0ZWQgaGV4YWRlY2ltYWwgY2hhcmFjdGVyJyk7XG4gICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgc3RhdGUucmVzdWx0ICs9IGNoYXJGcm9tQ29kZXBvaW50KGhleFJlc3VsdCk7XG5cbiAgICAgICAgc3RhdGUucG9zaXRpb24rKztcblxuICAgICAgfSBlbHNlIHtcbiAgICAgICAgdGhyb3dFcnJvcihzdGF0ZSwgJ3Vua25vd24gZXNjYXBlIHNlcXVlbmNlJyk7XG4gICAgICB9XG5cbiAgICAgIGNhcHR1cmVTdGFydCA9IGNhcHR1cmVFbmQgPSBzdGF0ZS5wb3NpdGlvbjtcblxuICAgIH0gZWxzZSBpZiAoaXNfRU9MKGNoKSkge1xuICAgICAgY2FwdHVyZVNlZ21lbnQoc3RhdGUsIGNhcHR1cmVTdGFydCwgY2FwdHVyZUVuZCwgdHJ1ZSk7XG4gICAgICB3cml0ZUZvbGRlZExpbmVzKHN0YXRlLCBza2lwU2VwYXJhdGlvblNwYWNlKHN0YXRlLCBmYWxzZSwgbm9kZUluZGVudCkpO1xuICAgICAgY2FwdHVyZVN0YXJ0ID0gY2FwdHVyZUVuZCA9IHN0YXRlLnBvc2l0aW9uO1xuXG4gICAgfSBlbHNlIGlmIChzdGF0ZS5wb3NpdGlvbiA9PT0gc3RhdGUubGluZVN0YXJ0ICYmIHRlc3REb2N1bWVudFNlcGFyYXRvcihzdGF0ZSkpIHtcbiAgICAgIHRocm93RXJyb3Ioc3RhdGUsICd1bmV4cGVjdGVkIGVuZCBvZiB0aGUgZG9jdW1lbnQgd2l0aGluIGEgZG91YmxlIHF1b3RlZCBzY2FsYXInKTtcblxuICAgIH0gZWxzZSB7XG4gICAgICBzdGF0ZS5wb3NpdGlvbisrO1xuICAgICAgY2FwdHVyZUVuZCA9IHN0YXRlLnBvc2l0aW9uO1xuICAgIH1cbiAgfVxuXG4gIHRocm93RXJyb3Ioc3RhdGUsICd1bmV4cGVjdGVkIGVuZCBvZiB0aGUgc3RyZWFtIHdpdGhpbiBhIGRvdWJsZSBxdW90ZWQgc2NhbGFyJyk7XG59XG5cbmZ1bmN0aW9uIHJlYWRGbG93Q29sbGVjdGlvbihzdGF0ZSwgbm9kZUluZGVudCkge1xuICB2YXIgcmVhZE5leHQgPSB0cnVlLFxuICAgICAgX2xpbmUsXG4gICAgICBfdGFnICAgICA9IHN0YXRlLnRhZyxcbiAgICAgIF9yZXN1bHQsXG4gICAgICBfYW5jaG9yICA9IHN0YXRlLmFuY2hvcixcbiAgICAgIGZvbGxvd2luZyxcbiAgICAgIHRlcm1pbmF0b3IsXG4gICAgICBpc1BhaXIsXG4gICAgICBpc0V4cGxpY2l0UGFpcixcbiAgICAgIGlzTWFwcGluZyxcbiAgICAgIG92ZXJyaWRhYmxlS2V5cyA9IHt9LFxuICAgICAga2V5Tm9kZSxcbiAgICAgIGtleVRhZyxcbiAgICAgIHZhbHVlTm9kZSxcbiAgICAgIGNoO1xuXG4gIGNoID0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdChzdGF0ZS5wb3NpdGlvbik7XG5cbiAgaWYgKGNoID09PSAweDVCLyogWyAqLykge1xuICAgIHRlcm1pbmF0b3IgPSAweDVEOy8qIF0gKi9cbiAgICBpc01hcHBpbmcgPSBmYWxzZTtcbiAgICBfcmVzdWx0ID0gW107XG4gIH0gZWxzZSBpZiAoY2ggPT09IDB4N0IvKiB7ICovKSB7XG4gICAgdGVybWluYXRvciA9IDB4N0Q7LyogfSAqL1xuICAgIGlzTWFwcGluZyA9IHRydWU7XG4gICAgX3Jlc3VsdCA9IHt9O1xuICB9IGVsc2Uge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIGlmIChzdGF0ZS5hbmNob3IgIT09IG51bGwpIHtcbiAgICBzdGF0ZS5hbmNob3JNYXBbc3RhdGUuYW5jaG9yXSA9IF9yZXN1bHQ7XG4gIH1cblxuICBjaCA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoKytzdGF0ZS5wb3NpdGlvbik7XG5cbiAgd2hpbGUgKGNoICE9PSAwKSB7XG4gICAgc2tpcFNlcGFyYXRpb25TcGFjZShzdGF0ZSwgdHJ1ZSwgbm9kZUluZGVudCk7XG5cbiAgICBjaCA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoc3RhdGUucG9zaXRpb24pO1xuXG4gICAgaWYgKGNoID09PSB0ZXJtaW5hdG9yKSB7XG4gICAgICBzdGF0ZS5wb3NpdGlvbisrO1xuICAgICAgc3RhdGUudGFnID0gX3RhZztcbiAgICAgIHN0YXRlLmFuY2hvciA9IF9hbmNob3I7XG4gICAgICBzdGF0ZS5raW5kID0gaXNNYXBwaW5nID8gJ21hcHBpbmcnIDogJ3NlcXVlbmNlJztcbiAgICAgIHN0YXRlLnJlc3VsdCA9IF9yZXN1bHQ7XG4gICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9IGVsc2UgaWYgKCFyZWFkTmV4dCkge1xuICAgICAgdGhyb3dFcnJvcihzdGF0ZSwgJ21pc3NlZCBjb21tYSBiZXR3ZWVuIGZsb3cgY29sbGVjdGlvbiBlbnRyaWVzJyk7XG4gICAgfVxuXG4gICAga2V5VGFnID0ga2V5Tm9kZSA9IHZhbHVlTm9kZSA9IG51bGw7XG4gICAgaXNQYWlyID0gaXNFeHBsaWNpdFBhaXIgPSBmYWxzZTtcblxuICAgIGlmIChjaCA9PT0gMHgzRi8qID8gKi8pIHtcbiAgICAgIGZvbGxvd2luZyA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoc3RhdGUucG9zaXRpb24gKyAxKTtcblxuICAgICAgaWYgKGlzX1dTX09SX0VPTChmb2xsb3dpbmcpKSB7XG4gICAgICAgIGlzUGFpciA9IGlzRXhwbGljaXRQYWlyID0gdHJ1ZTtcbiAgICAgICAgc3RhdGUucG9zaXRpb24rKztcbiAgICAgICAgc2tpcFNlcGFyYXRpb25TcGFjZShzdGF0ZSwgdHJ1ZSwgbm9kZUluZGVudCk7XG4gICAgICB9XG4gICAgfVxuXG4gICAgX2xpbmUgPSBzdGF0ZS5saW5lO1xuICAgIGNvbXBvc2VOb2RlKHN0YXRlLCBub2RlSW5kZW50LCBDT05URVhUX0ZMT1dfSU4sIGZhbHNlLCB0cnVlKTtcbiAgICBrZXlUYWcgPSBzdGF0ZS50YWc7XG4gICAga2V5Tm9kZSA9IHN0YXRlLnJlc3VsdDtcbiAgICBza2lwU2VwYXJhdGlvblNwYWNlKHN0YXRlLCB0cnVlLCBub2RlSW5kZW50KTtcblxuICAgIGNoID0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdChzdGF0ZS5wb3NpdGlvbik7XG5cbiAgICBpZiAoKGlzRXhwbGljaXRQYWlyIHx8IHN0YXRlLmxpbmUgPT09IF9saW5lKSAmJiBjaCA9PT0gMHgzQS8qIDogKi8pIHtcbiAgICAgIGlzUGFpciA9IHRydWU7XG4gICAgICBjaCA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoKytzdGF0ZS5wb3NpdGlvbik7XG4gICAgICBza2lwU2VwYXJhdGlvblNwYWNlKHN0YXRlLCB0cnVlLCBub2RlSW5kZW50KTtcbiAgICAgIGNvbXBvc2VOb2RlKHN0YXRlLCBub2RlSW5kZW50LCBDT05URVhUX0ZMT1dfSU4sIGZhbHNlLCB0cnVlKTtcbiAgICAgIHZhbHVlTm9kZSA9IHN0YXRlLnJlc3VsdDtcbiAgICB9XG5cbiAgICBpZiAoaXNNYXBwaW5nKSB7XG4gICAgICBzdG9yZU1hcHBpbmdQYWlyKHN0YXRlLCBfcmVzdWx0LCBvdmVycmlkYWJsZUtleXMsIGtleVRhZywga2V5Tm9kZSwgdmFsdWVOb2RlKTtcbiAgICB9IGVsc2UgaWYgKGlzUGFpcikge1xuICAgICAgX3Jlc3VsdC5wdXNoKHN0b3JlTWFwcGluZ1BhaXIoc3RhdGUsIG51bGwsIG92ZXJyaWRhYmxlS2V5cywga2V5VGFnLCBrZXlOb2RlLCB2YWx1ZU5vZGUpKTtcbiAgICB9IGVsc2Uge1xuICAgICAgX3Jlc3VsdC5wdXNoKGtleU5vZGUpO1xuICAgIH1cblxuICAgIHNraXBTZXBhcmF0aW9uU3BhY2Uoc3RhdGUsIHRydWUsIG5vZGVJbmRlbnQpO1xuXG4gICAgY2ggPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KHN0YXRlLnBvc2l0aW9uKTtcblxuICAgIGlmIChjaCA9PT0gMHgyQy8qICwgKi8pIHtcbiAgICAgIHJlYWROZXh0ID0gdHJ1ZTtcbiAgICAgIGNoID0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdCgrK3N0YXRlLnBvc2l0aW9uKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmVhZE5leHQgPSBmYWxzZTtcbiAgICB9XG4gIH1cblxuICB0aHJvd0Vycm9yKHN0YXRlLCAndW5leHBlY3RlZCBlbmQgb2YgdGhlIHN0cmVhbSB3aXRoaW4gYSBmbG93IGNvbGxlY3Rpb24nKTtcbn1cblxuZnVuY3Rpb24gcmVhZEJsb2NrU2NhbGFyKHN0YXRlLCBub2RlSW5kZW50KSB7XG4gIHZhciBjYXB0dXJlU3RhcnQsXG4gICAgICBmb2xkaW5nLFxuICAgICAgY2hvbXBpbmcgICAgICAgPSBDSE9NUElOR19DTElQLFxuICAgICAgZGV0ZWN0ZWRJbmRlbnQgPSBmYWxzZSxcbiAgICAgIHRleHRJbmRlbnQgICAgID0gbm9kZUluZGVudCxcbiAgICAgIGVtcHR5TGluZXMgICAgID0gMCxcbiAgICAgIGF0TW9yZUluZGVudGVkID0gZmFsc2UsXG4gICAgICB0bXAsXG4gICAgICBjaDtcblxuICBjaCA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoc3RhdGUucG9zaXRpb24pO1xuXG4gIGlmIChjaCA9PT0gMHg3Qy8qIHwgKi8pIHtcbiAgICBmb2xkaW5nID0gZmFsc2U7XG4gIH0gZWxzZSBpZiAoY2ggPT09IDB4M0UvKiA+ICovKSB7XG4gICAgZm9sZGluZyA9IHRydWU7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIGZhbHNlO1xuICB9XG5cbiAgc3RhdGUua2luZCA9ICdzY2FsYXInO1xuICBzdGF0ZS5yZXN1bHQgPSAnJztcblxuICB3aGlsZSAoY2ggIT09IDApIHtcbiAgICBjaCA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoKytzdGF0ZS5wb3NpdGlvbik7XG5cbiAgICBpZiAoY2ggPT09IDB4MkIvKiArICovIHx8IGNoID09PSAweDJELyogLSAqLykge1xuICAgICAgaWYgKENIT01QSU5HX0NMSVAgPT09IGNob21waW5nKSB7XG4gICAgICAgIGNob21waW5nID0gKGNoID09PSAweDJCLyogKyAqLykgPyBDSE9NUElOR19LRUVQIDogQ0hPTVBJTkdfU1RSSVA7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICB0aHJvd0Vycm9yKHN0YXRlLCAncmVwZWF0IG9mIGEgY2hvbXBpbmcgbW9kZSBpZGVudGlmaWVyJyk7XG4gICAgICB9XG5cbiAgICB9IGVsc2UgaWYgKCh0bXAgPSBmcm9tRGVjaW1hbENvZGUoY2gpKSA+PSAwKSB7XG4gICAgICBpZiAodG1wID09PSAwKSB7XG4gICAgICAgIHRocm93RXJyb3Ioc3RhdGUsICdiYWQgZXhwbGljaXQgaW5kZW50YXRpb24gd2lkdGggb2YgYSBibG9jayBzY2FsYXI7IGl0IGNhbm5vdCBiZSBsZXNzIHRoYW4gb25lJyk7XG4gICAgICB9IGVsc2UgaWYgKCFkZXRlY3RlZEluZGVudCkge1xuICAgICAgICB0ZXh0SW5kZW50ID0gbm9kZUluZGVudCArIHRtcCAtIDE7XG4gICAgICAgIGRldGVjdGVkSW5kZW50ID0gdHJ1ZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93RXJyb3Ioc3RhdGUsICdyZXBlYXQgb2YgYW4gaW5kZW50YXRpb24gd2lkdGggaWRlbnRpZmllcicpO1xuICAgICAgfVxuXG4gICAgfSBlbHNlIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIGlmIChpc19XSElURV9TUEFDRShjaCkpIHtcbiAgICBkbyB7IGNoID0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdCgrK3N0YXRlLnBvc2l0aW9uKTsgfVxuICAgIHdoaWxlIChpc19XSElURV9TUEFDRShjaCkpO1xuXG4gICAgaWYgKGNoID09PSAweDIzLyogIyAqLykge1xuICAgICAgZG8geyBjaCA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoKytzdGF0ZS5wb3NpdGlvbik7IH1cbiAgICAgIHdoaWxlICghaXNfRU9MKGNoKSAmJiAoY2ggIT09IDApKTtcbiAgICB9XG4gIH1cblxuICB3aGlsZSAoY2ggIT09IDApIHtcbiAgICByZWFkTGluZUJyZWFrKHN0YXRlKTtcbiAgICBzdGF0ZS5saW5lSW5kZW50ID0gMDtcblxuICAgIGNoID0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdChzdGF0ZS5wb3NpdGlvbik7XG5cbiAgICB3aGlsZSAoKCFkZXRlY3RlZEluZGVudCB8fCBzdGF0ZS5saW5lSW5kZW50IDwgdGV4dEluZGVudCkgJiZcbiAgICAgICAgICAgKGNoID09PSAweDIwLyogU3BhY2UgKi8pKSB7XG4gICAgICBzdGF0ZS5saW5lSW5kZW50Kys7XG4gICAgICBjaCA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoKytzdGF0ZS5wb3NpdGlvbik7XG4gICAgfVxuXG4gICAgaWYgKCFkZXRlY3RlZEluZGVudCAmJiBzdGF0ZS5saW5lSW5kZW50ID4gdGV4dEluZGVudCkge1xuICAgICAgdGV4dEluZGVudCA9IHN0YXRlLmxpbmVJbmRlbnQ7XG4gICAgfVxuXG4gICAgaWYgKGlzX0VPTChjaCkpIHtcbiAgICAgIGVtcHR5TGluZXMrKztcbiAgICAgIGNvbnRpbnVlO1xuICAgIH1cblxuICAgIC8vIEVuZCBvZiB0aGUgc2NhbGFyLlxuICAgIGlmIChzdGF0ZS5saW5lSW5kZW50IDwgdGV4dEluZGVudCkge1xuXG4gICAgICAvLyBQZXJmb3JtIHRoZSBjaG9tcGluZy5cbiAgICAgIGlmIChjaG9tcGluZyA9PT0gQ0hPTVBJTkdfS0VFUCkge1xuICAgICAgICBzdGF0ZS5yZXN1bHQgKz0gY29tbW9uLnJlcGVhdCgnXFxuJywgZW1wdHlMaW5lcyk7XG4gICAgICB9IGVsc2UgaWYgKGNob21waW5nID09PSBDSE9NUElOR19DTElQKSB7XG4gICAgICAgIGlmIChkZXRlY3RlZEluZGVudCkgeyAvLyBpLmUuIG9ubHkgaWYgdGhlIHNjYWxhciBpcyBub3QgZW1wdHkuXG4gICAgICAgICAgc3RhdGUucmVzdWx0ICs9ICdcXG4nO1xuICAgICAgICB9XG4gICAgICB9XG5cbiAgICAgIC8vIEJyZWFrIHRoaXMgYHdoaWxlYCBjeWNsZSBhbmQgZ28gdG8gdGhlIGZ1bmNpdG9uJ3MgZXBpbG9ndWUuXG4gICAgICBicmVhaztcbiAgICB9XG5cbiAgICAvLyBGb2xkZWQgc3R5bGU6IHVzZSBmYW5jeSBydWxlcyB0byBoYW5kbGUgbGluZSBicmVha3MuXG4gICAgaWYgKGZvbGRpbmcpIHtcblxuICAgICAgLy8gTGluZXMgc3RhcnRpbmcgd2l0aCB3aGl0ZSBzcGFjZSBjaGFyYWN0ZXJzIChtb3JlLWluZGVudGVkIGxpbmVzKSBhcmUgbm90IGZvbGRlZC5cbiAgICAgIGlmIChpc19XSElURV9TUEFDRShjaCkpIHtcbiAgICAgICAgYXRNb3JlSW5kZW50ZWQgPSB0cnVlO1xuICAgICAgICBzdGF0ZS5yZXN1bHQgKz0gY29tbW9uLnJlcGVhdCgnXFxuJywgZW1wdHlMaW5lcyArIDEpO1xuXG4gICAgICAvLyBFbmQgb2YgbW9yZS1pbmRlbnRlZCBibG9jay5cbiAgICAgIH0gZWxzZSBpZiAoYXRNb3JlSW5kZW50ZWQpIHtcbiAgICAgICAgYXRNb3JlSW5kZW50ZWQgPSBmYWxzZTtcbiAgICAgICAgc3RhdGUucmVzdWx0ICs9IGNvbW1vbi5yZXBlYXQoJ1xcbicsIGVtcHR5TGluZXMgKyAxKTtcblxuICAgICAgLy8gSnVzdCBvbmUgbGluZSBicmVhayAtIHBlcmNlaXZlIGFzIHRoZSBzYW1lIGxpbmUuXG4gICAgICB9IGVsc2UgaWYgKGVtcHR5TGluZXMgPT09IDApIHtcbiAgICAgICAgaWYgKGRldGVjdGVkSW5kZW50KSB7IC8vIGkuZS4gb25seSBpZiB3ZSBoYXZlIGFscmVhZHkgcmVhZCBzb21lIHNjYWxhciBjb250ZW50LlxuICAgICAgICAgIHN0YXRlLnJlc3VsdCArPSAnICc7XG4gICAgICAgIH1cblxuICAgICAgLy8gU2V2ZXJhbCBsaW5lIGJyZWFrcyAtIHBlcmNlaXZlIGFzIGRpZmZlcmVudCBsaW5lcy5cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHN0YXRlLnJlc3VsdCArPSBjb21tb24ucmVwZWF0KCdcXG4nLCBlbXB0eUxpbmVzKTtcbiAgICAgIH1cblxuICAgIC8vIExpdGVyYWwgc3R5bGU6IGp1c3QgYWRkIGV4YWN0IG51bWJlciBvZiBsaW5lIGJyZWFrcyBiZXR3ZWVuIGNvbnRlbnQgbGluZXMuXG4gICAgfSBlbHNlIGlmIChkZXRlY3RlZEluZGVudCkge1xuICAgICAgLy8gSWYgY3VycmVudCBsaW5lIGlzbid0IHRoZSBmaXJzdCBvbmUgLSBjb3VudCBsaW5lIGJyZWFrIGZyb20gdGhlIGxhc3QgY29udGVudCBsaW5lLlxuICAgICAgc3RhdGUucmVzdWx0ICs9IGNvbW1vbi5yZXBlYXQoJ1xcbicsIGVtcHR5TGluZXMgKyAxKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLy8gSW4gY2FzZSBvZiB0aGUgZmlyc3QgY29udGVudCBsaW5lIC0gY291bnQgb25seSBlbXB0eSBsaW5lcy5cbiAgICAgIHN0YXRlLnJlc3VsdCArPSBjb21tb24ucmVwZWF0KCdcXG4nLCBlbXB0eUxpbmVzKTtcbiAgICB9XG5cbiAgICBkZXRlY3RlZEluZGVudCA9IHRydWU7XG4gICAgZW1wdHlMaW5lcyA9IDA7XG4gICAgY2FwdHVyZVN0YXJ0ID0gc3RhdGUucG9zaXRpb247XG5cbiAgICB3aGlsZSAoIWlzX0VPTChjaCkgJiYgKGNoICE9PSAwKSkge1xuICAgICAgY2ggPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KCsrc3RhdGUucG9zaXRpb24pO1xuICAgIH1cblxuICAgIGNhcHR1cmVTZWdtZW50KHN0YXRlLCBjYXB0dXJlU3RhcnQsIHN0YXRlLnBvc2l0aW9uLCBmYWxzZSk7XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn1cblxuZnVuY3Rpb24gcmVhZEJsb2NrU2VxdWVuY2Uoc3RhdGUsIG5vZGVJbmRlbnQpIHtcbiAgdmFyIF9saW5lLFxuICAgICAgX3RhZyAgICAgID0gc3RhdGUudGFnLFxuICAgICAgX2FuY2hvciAgID0gc3RhdGUuYW5jaG9yLFxuICAgICAgX3Jlc3VsdCAgID0gW10sXG4gICAgICBmb2xsb3dpbmcsXG4gICAgICBkZXRlY3RlZCAgPSBmYWxzZSxcbiAgICAgIGNoO1xuXG4gIGlmIChzdGF0ZS5hbmNob3IgIT09IG51bGwpIHtcbiAgICBzdGF0ZS5hbmNob3JNYXBbc3RhdGUuYW5jaG9yXSA9IF9yZXN1bHQ7XG4gIH1cblxuICBjaCA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoc3RhdGUucG9zaXRpb24pO1xuXG4gIHdoaWxlIChjaCAhPT0gMCkge1xuXG4gICAgaWYgKGNoICE9PSAweDJELyogLSAqLykge1xuICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgZm9sbG93aW5nID0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdChzdGF0ZS5wb3NpdGlvbiArIDEpO1xuXG4gICAgaWYgKCFpc19XU19PUl9FT0woZm9sbG93aW5nKSkge1xuICAgICAgYnJlYWs7XG4gICAgfVxuXG4gICAgZGV0ZWN0ZWQgPSB0cnVlO1xuICAgIHN0YXRlLnBvc2l0aW9uKys7XG5cbiAgICBpZiAoc2tpcFNlcGFyYXRpb25TcGFjZShzdGF0ZSwgdHJ1ZSwgLTEpKSB7XG4gICAgICBpZiAoc3RhdGUubGluZUluZGVudCA8PSBub2RlSW5kZW50KSB7XG4gICAgICAgIF9yZXN1bHQucHVzaChudWxsKTtcbiAgICAgICAgY2ggPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KHN0YXRlLnBvc2l0aW9uKTtcbiAgICAgICAgY29udGludWU7XG4gICAgICB9XG4gICAgfVxuXG4gICAgX2xpbmUgPSBzdGF0ZS5saW5lO1xuICAgIGNvbXBvc2VOb2RlKHN0YXRlLCBub2RlSW5kZW50LCBDT05URVhUX0JMT0NLX0lOLCBmYWxzZSwgdHJ1ZSk7XG4gICAgX3Jlc3VsdC5wdXNoKHN0YXRlLnJlc3VsdCk7XG4gICAgc2tpcFNlcGFyYXRpb25TcGFjZShzdGF0ZSwgdHJ1ZSwgLTEpO1xuXG4gICAgY2ggPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KHN0YXRlLnBvc2l0aW9uKTtcblxuICAgIGlmICgoc3RhdGUubGluZSA9PT0gX2xpbmUgfHwgc3RhdGUubGluZUluZGVudCA+IG5vZGVJbmRlbnQpICYmIChjaCAhPT0gMCkpIHtcbiAgICAgIHRocm93RXJyb3Ioc3RhdGUsICdiYWQgaW5kZW50YXRpb24gb2YgYSBzZXF1ZW5jZSBlbnRyeScpO1xuICAgIH0gZWxzZSBpZiAoc3RhdGUubGluZUluZGVudCA8IG5vZGVJbmRlbnQpIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIGlmIChkZXRlY3RlZCkge1xuICAgIHN0YXRlLnRhZyA9IF90YWc7XG4gICAgc3RhdGUuYW5jaG9yID0gX2FuY2hvcjtcbiAgICBzdGF0ZS5raW5kID0gJ3NlcXVlbmNlJztcbiAgICBzdGF0ZS5yZXN1bHQgPSBfcmVzdWx0O1xuICAgIHJldHVybiB0cnVlO1xuICB9XG4gIHJldHVybiBmYWxzZTtcbn1cblxuZnVuY3Rpb24gcmVhZEJsb2NrTWFwcGluZyhzdGF0ZSwgbm9kZUluZGVudCwgZmxvd0luZGVudCkge1xuICB2YXIgZm9sbG93aW5nLFxuICAgICAgYWxsb3dDb21wYWN0LFxuICAgICAgX2xpbmUsXG4gICAgICBfdGFnICAgICAgICAgID0gc3RhdGUudGFnLFxuICAgICAgX2FuY2hvciAgICAgICA9IHN0YXRlLmFuY2hvcixcbiAgICAgIF9yZXN1bHQgICAgICAgPSB7fSxcbiAgICAgIG92ZXJyaWRhYmxlS2V5cyA9IHt9LFxuICAgICAga2V5VGFnICAgICAgICA9IG51bGwsXG4gICAgICBrZXlOb2RlICAgICAgID0gbnVsbCxcbiAgICAgIHZhbHVlTm9kZSAgICAgPSBudWxsLFxuICAgICAgYXRFeHBsaWNpdEtleSA9IGZhbHNlLFxuICAgICAgZGV0ZWN0ZWQgICAgICA9IGZhbHNlLFxuICAgICAgY2g7XG5cbiAgaWYgKHN0YXRlLmFuY2hvciAhPT0gbnVsbCkge1xuICAgIHN0YXRlLmFuY2hvck1hcFtzdGF0ZS5hbmNob3JdID0gX3Jlc3VsdDtcbiAgfVxuXG4gIGNoID0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdChzdGF0ZS5wb3NpdGlvbik7XG5cbiAgd2hpbGUgKGNoICE9PSAwKSB7XG4gICAgZm9sbG93aW5nID0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdChzdGF0ZS5wb3NpdGlvbiArIDEpO1xuICAgIF9saW5lID0gc3RhdGUubGluZTsgLy8gU2F2ZSB0aGUgY3VycmVudCBsaW5lLlxuXG4gICAgLy9cbiAgICAvLyBFeHBsaWNpdCBub3RhdGlvbiBjYXNlLiBUaGVyZSBhcmUgdHdvIHNlcGFyYXRlIGJsb2NrczpcbiAgICAvLyBmaXJzdCBmb3IgdGhlIGtleSAoZGVub3RlZCBieSBcIj9cIikgYW5kIHNlY29uZCBmb3IgdGhlIHZhbHVlIChkZW5vdGVkIGJ5IFwiOlwiKVxuICAgIC8vXG4gICAgaWYgKChjaCA9PT0gMHgzRi8qID8gKi8gfHwgY2ggPT09IDB4M0EvKiA6ICovKSAmJiBpc19XU19PUl9FT0woZm9sbG93aW5nKSkge1xuXG4gICAgICBpZiAoY2ggPT09IDB4M0YvKiA/ICovKSB7XG4gICAgICAgIGlmIChhdEV4cGxpY2l0S2V5KSB7XG4gICAgICAgICAgc3RvcmVNYXBwaW5nUGFpcihzdGF0ZSwgX3Jlc3VsdCwgb3ZlcnJpZGFibGVLZXlzLCBrZXlUYWcsIGtleU5vZGUsIG51bGwpO1xuICAgICAgICAgIGtleVRhZyA9IGtleU5vZGUgPSB2YWx1ZU5vZGUgPSBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgZGV0ZWN0ZWQgPSB0cnVlO1xuICAgICAgICBhdEV4cGxpY2l0S2V5ID0gdHJ1ZTtcbiAgICAgICAgYWxsb3dDb21wYWN0ID0gdHJ1ZTtcblxuICAgICAgfSBlbHNlIGlmIChhdEV4cGxpY2l0S2V5KSB7XG4gICAgICAgIC8vIGkuZS4gMHgzQS8qIDogKi8gPT09IGNoYXJhY3RlciBhZnRlciB0aGUgZXhwbGljaXQga2V5LlxuICAgICAgICBhdEV4cGxpY2l0S2V5ID0gZmFsc2U7XG4gICAgICAgIGFsbG93Q29tcGFjdCA9IHRydWU7XG5cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRocm93RXJyb3Ioc3RhdGUsICdpbmNvbXBsZXRlIGV4cGxpY2l0IG1hcHBpbmcgcGFpcjsgYSBrZXkgbm9kZSBpcyBtaXNzZWQnKTtcbiAgICAgIH1cblxuICAgICAgc3RhdGUucG9zaXRpb24gKz0gMTtcbiAgICAgIGNoID0gZm9sbG93aW5nO1xuXG4gICAgLy9cbiAgICAvLyBJbXBsaWNpdCBub3RhdGlvbiBjYXNlLiBGbG93LXN0eWxlIG5vZGUgYXMgdGhlIGtleSBmaXJzdCwgdGhlbiBcIjpcIiwgYW5kIHRoZSB2YWx1ZS5cbiAgICAvL1xuICAgIH0gZWxzZSBpZiAoY29tcG9zZU5vZGUoc3RhdGUsIGZsb3dJbmRlbnQsIENPTlRFWFRfRkxPV19PVVQsIGZhbHNlLCB0cnVlKSkge1xuXG4gICAgICBpZiAoc3RhdGUubGluZSA9PT0gX2xpbmUpIHtcbiAgICAgICAgY2ggPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KHN0YXRlLnBvc2l0aW9uKTtcblxuICAgICAgICB3aGlsZSAoaXNfV0hJVEVfU1BBQ0UoY2gpKSB7XG4gICAgICAgICAgY2ggPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KCsrc3RhdGUucG9zaXRpb24pO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNoID09PSAweDNBLyogOiAqLykge1xuICAgICAgICAgIGNoID0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdCgrK3N0YXRlLnBvc2l0aW9uKTtcblxuICAgICAgICAgIGlmICghaXNfV1NfT1JfRU9MKGNoKSkge1xuICAgICAgICAgICAgdGhyb3dFcnJvcihzdGF0ZSwgJ2Egd2hpdGVzcGFjZSBjaGFyYWN0ZXIgaXMgZXhwZWN0ZWQgYWZ0ZXIgdGhlIGtleS12YWx1ZSBzZXBhcmF0b3Igd2l0aGluIGEgYmxvY2sgbWFwcGluZycpO1xuICAgICAgICAgIH1cblxuICAgICAgICAgIGlmIChhdEV4cGxpY2l0S2V5KSB7XG4gICAgICAgICAgICBzdG9yZU1hcHBpbmdQYWlyKHN0YXRlLCBfcmVzdWx0LCBvdmVycmlkYWJsZUtleXMsIGtleVRhZywga2V5Tm9kZSwgbnVsbCk7XG4gICAgICAgICAgICBrZXlUYWcgPSBrZXlOb2RlID0gdmFsdWVOb2RlID0gbnVsbDtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBkZXRlY3RlZCA9IHRydWU7XG4gICAgICAgICAgYXRFeHBsaWNpdEtleSA9IGZhbHNlO1xuICAgICAgICAgIGFsbG93Q29tcGFjdCA9IGZhbHNlO1xuICAgICAgICAgIGtleVRhZyA9IHN0YXRlLnRhZztcbiAgICAgICAgICBrZXlOb2RlID0gc3RhdGUucmVzdWx0O1xuXG4gICAgICAgIH0gZWxzZSBpZiAoZGV0ZWN0ZWQpIHtcbiAgICAgICAgICB0aHJvd0Vycm9yKHN0YXRlLCAnY2FuIG5vdCByZWFkIGFuIGltcGxpY2l0IG1hcHBpbmcgcGFpcjsgYSBjb2xvbiBpcyBtaXNzZWQnKTtcblxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHN0YXRlLnRhZyA9IF90YWc7XG4gICAgICAgICAgc3RhdGUuYW5jaG9yID0gX2FuY2hvcjtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTsgLy8gS2VlcCB0aGUgcmVzdWx0IG9mIGBjb21wb3NlTm9kZWAuXG4gICAgICAgIH1cblxuICAgICAgfSBlbHNlIGlmIChkZXRlY3RlZCkge1xuICAgICAgICB0aHJvd0Vycm9yKHN0YXRlLCAnY2FuIG5vdCByZWFkIGEgYmxvY2sgbWFwcGluZyBlbnRyeTsgYSBtdWx0aWxpbmUga2V5IG1heSBub3QgYmUgYW4gaW1wbGljaXQga2V5Jyk7XG5cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHN0YXRlLnRhZyA9IF90YWc7XG4gICAgICAgIHN0YXRlLmFuY2hvciA9IF9hbmNob3I7XG4gICAgICAgIHJldHVybiB0cnVlOyAvLyBLZWVwIHRoZSByZXN1bHQgb2YgYGNvbXBvc2VOb2RlYC5cbiAgICAgIH1cblxuICAgIH0gZWxzZSB7XG4gICAgICBicmVhazsgLy8gUmVhZGluZyBpcyBkb25lLiBHbyB0byB0aGUgZXBpbG9ndWUuXG4gICAgfVxuXG4gICAgLy9cbiAgICAvLyBDb21tb24gcmVhZGluZyBjb2RlIGZvciBib3RoIGV4cGxpY2l0IGFuZCBpbXBsaWNpdCBub3RhdGlvbnMuXG4gICAgLy9cbiAgICBpZiAoc3RhdGUubGluZSA9PT0gX2xpbmUgfHwgc3RhdGUubGluZUluZGVudCA+IG5vZGVJbmRlbnQpIHtcbiAgICAgIGlmIChjb21wb3NlTm9kZShzdGF0ZSwgbm9kZUluZGVudCwgQ09OVEVYVF9CTE9DS19PVVQsIHRydWUsIGFsbG93Q29tcGFjdCkpIHtcbiAgICAgICAgaWYgKGF0RXhwbGljaXRLZXkpIHtcbiAgICAgICAgICBrZXlOb2RlID0gc3RhdGUucmVzdWx0O1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHZhbHVlTm9kZSA9IHN0YXRlLnJlc3VsdDtcbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICBpZiAoIWF0RXhwbGljaXRLZXkpIHtcbiAgICAgICAgc3RvcmVNYXBwaW5nUGFpcihzdGF0ZSwgX3Jlc3VsdCwgb3ZlcnJpZGFibGVLZXlzLCBrZXlUYWcsIGtleU5vZGUsIHZhbHVlTm9kZSk7XG4gICAgICAgIGtleVRhZyA9IGtleU5vZGUgPSB2YWx1ZU5vZGUgPSBudWxsO1xuICAgICAgfVxuXG4gICAgICBza2lwU2VwYXJhdGlvblNwYWNlKHN0YXRlLCB0cnVlLCAtMSk7XG4gICAgICBjaCA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoc3RhdGUucG9zaXRpb24pO1xuICAgIH1cblxuICAgIGlmIChzdGF0ZS5saW5lSW5kZW50ID4gbm9kZUluZGVudCAmJiAoY2ggIT09IDApKSB7XG4gICAgICB0aHJvd0Vycm9yKHN0YXRlLCAnYmFkIGluZGVudGF0aW9uIG9mIGEgbWFwcGluZyBlbnRyeScpO1xuICAgIH0gZWxzZSBpZiAoc3RhdGUubGluZUluZGVudCA8IG5vZGVJbmRlbnQpIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIC8vXG4gIC8vIEVwaWxvZ3VlLlxuICAvL1xuXG4gIC8vIFNwZWNpYWwgY2FzZTogbGFzdCBtYXBwaW5nJ3Mgbm9kZSBjb250YWlucyBvbmx5IHRoZSBrZXkgaW4gZXhwbGljaXQgbm90YXRpb24uXG4gIGlmIChhdEV4cGxpY2l0S2V5KSB7XG4gICAgc3RvcmVNYXBwaW5nUGFpcihzdGF0ZSwgX3Jlc3VsdCwgb3ZlcnJpZGFibGVLZXlzLCBrZXlUYWcsIGtleU5vZGUsIG51bGwpO1xuICB9XG5cbiAgLy8gRXhwb3NlIHRoZSByZXN1bHRpbmcgbWFwcGluZy5cbiAgaWYgKGRldGVjdGVkKSB7XG4gICAgc3RhdGUudGFnID0gX3RhZztcbiAgICBzdGF0ZS5hbmNob3IgPSBfYW5jaG9yO1xuICAgIHN0YXRlLmtpbmQgPSAnbWFwcGluZyc7XG4gICAgc3RhdGUucmVzdWx0ID0gX3Jlc3VsdDtcbiAgfVxuXG4gIHJldHVybiBkZXRlY3RlZDtcbn1cblxuZnVuY3Rpb24gcmVhZFRhZ1Byb3BlcnR5KHN0YXRlKSB7XG4gIHZhciBfcG9zaXRpb24sXG4gICAgICBpc1ZlcmJhdGltID0gZmFsc2UsXG4gICAgICBpc05hbWVkICAgID0gZmFsc2UsXG4gICAgICB0YWdIYW5kbGUsXG4gICAgICB0YWdOYW1lLFxuICAgICAgY2g7XG5cbiAgY2ggPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KHN0YXRlLnBvc2l0aW9uKTtcblxuICBpZiAoY2ggIT09IDB4MjEvKiAhICovKSByZXR1cm4gZmFsc2U7XG5cbiAgaWYgKHN0YXRlLnRhZyAhPT0gbnVsbCkge1xuICAgIHRocm93RXJyb3Ioc3RhdGUsICdkdXBsaWNhdGlvbiBvZiBhIHRhZyBwcm9wZXJ0eScpO1xuICB9XG5cbiAgY2ggPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KCsrc3RhdGUucG9zaXRpb24pO1xuXG4gIGlmIChjaCA9PT0gMHgzQy8qIDwgKi8pIHtcbiAgICBpc1ZlcmJhdGltID0gdHJ1ZTtcbiAgICBjaCA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoKytzdGF0ZS5wb3NpdGlvbik7XG5cbiAgfSBlbHNlIGlmIChjaCA9PT0gMHgyMS8qICEgKi8pIHtcbiAgICBpc05hbWVkID0gdHJ1ZTtcbiAgICB0YWdIYW5kbGUgPSAnISEnO1xuICAgIGNoID0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdCgrK3N0YXRlLnBvc2l0aW9uKTtcblxuICB9IGVsc2Uge1xuICAgIHRhZ0hhbmRsZSA9ICchJztcbiAgfVxuXG4gIF9wb3NpdGlvbiA9IHN0YXRlLnBvc2l0aW9uO1xuXG4gIGlmIChpc1ZlcmJhdGltKSB7XG4gICAgZG8geyBjaCA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoKytzdGF0ZS5wb3NpdGlvbik7IH1cbiAgICB3aGlsZSAoY2ggIT09IDAgJiYgY2ggIT09IDB4M0UvKiA+ICovKTtcblxuICAgIGlmIChzdGF0ZS5wb3NpdGlvbiA8IHN0YXRlLmxlbmd0aCkge1xuICAgICAgdGFnTmFtZSA9IHN0YXRlLmlucHV0LnNsaWNlKF9wb3NpdGlvbiwgc3RhdGUucG9zaXRpb24pO1xuICAgICAgY2ggPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KCsrc3RhdGUucG9zaXRpb24pO1xuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvd0Vycm9yKHN0YXRlLCAndW5leHBlY3RlZCBlbmQgb2YgdGhlIHN0cmVhbSB3aXRoaW4gYSB2ZXJiYXRpbSB0YWcnKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgd2hpbGUgKGNoICE9PSAwICYmICFpc19XU19PUl9FT0woY2gpKSB7XG5cbiAgICAgIGlmIChjaCA9PT0gMHgyMS8qICEgKi8pIHtcbiAgICAgICAgaWYgKCFpc05hbWVkKSB7XG4gICAgICAgICAgdGFnSGFuZGxlID0gc3RhdGUuaW5wdXQuc2xpY2UoX3Bvc2l0aW9uIC0gMSwgc3RhdGUucG9zaXRpb24gKyAxKTtcblxuICAgICAgICAgIGlmICghUEFUVEVSTl9UQUdfSEFORExFLnRlc3QodGFnSGFuZGxlKSkge1xuICAgICAgICAgICAgdGhyb3dFcnJvcihzdGF0ZSwgJ25hbWVkIHRhZyBoYW5kbGUgY2Fubm90IGNvbnRhaW4gc3VjaCBjaGFyYWN0ZXJzJyk7XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgaXNOYW1lZCA9IHRydWU7XG4gICAgICAgICAgX3Bvc2l0aW9uID0gc3RhdGUucG9zaXRpb24gKyAxO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHRocm93RXJyb3Ioc3RhdGUsICd0YWcgc3VmZml4IGNhbm5vdCBjb250YWluIGV4Y2xhbWF0aW9uIG1hcmtzJyk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgY2ggPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KCsrc3RhdGUucG9zaXRpb24pO1xuICAgIH1cblxuICAgIHRhZ05hbWUgPSBzdGF0ZS5pbnB1dC5zbGljZShfcG9zaXRpb24sIHN0YXRlLnBvc2l0aW9uKTtcblxuICAgIGlmIChQQVRURVJOX0ZMT1dfSU5ESUNBVE9SUy50ZXN0KHRhZ05hbWUpKSB7XG4gICAgICB0aHJvd0Vycm9yKHN0YXRlLCAndGFnIHN1ZmZpeCBjYW5ub3QgY29udGFpbiBmbG93IGluZGljYXRvciBjaGFyYWN0ZXJzJyk7XG4gICAgfVxuICB9XG5cbiAgaWYgKHRhZ05hbWUgJiYgIVBBVFRFUk5fVEFHX1VSSS50ZXN0KHRhZ05hbWUpKSB7XG4gICAgdGhyb3dFcnJvcihzdGF0ZSwgJ3RhZyBuYW1lIGNhbm5vdCBjb250YWluIHN1Y2ggY2hhcmFjdGVyczogJyArIHRhZ05hbWUpO1xuICB9XG5cbiAgaWYgKGlzVmVyYmF0aW0pIHtcbiAgICBzdGF0ZS50YWcgPSB0YWdOYW1lO1xuXG4gIH0gZWxzZSBpZiAoX2hhc093blByb3BlcnR5LmNhbGwoc3RhdGUudGFnTWFwLCB0YWdIYW5kbGUpKSB7XG4gICAgc3RhdGUudGFnID0gc3RhdGUudGFnTWFwW3RhZ0hhbmRsZV0gKyB0YWdOYW1lO1xuXG4gIH0gZWxzZSBpZiAodGFnSGFuZGxlID09PSAnIScpIHtcbiAgICBzdGF0ZS50YWcgPSAnIScgKyB0YWdOYW1lO1xuXG4gIH0gZWxzZSBpZiAodGFnSGFuZGxlID09PSAnISEnKSB7XG4gICAgc3RhdGUudGFnID0gJ3RhZzp5YW1sLm9yZywyMDAyOicgKyB0YWdOYW1lO1xuXG4gIH0gZWxzZSB7XG4gICAgdGhyb3dFcnJvcihzdGF0ZSwgJ3VuZGVjbGFyZWQgdGFnIGhhbmRsZSBcIicgKyB0YWdIYW5kbGUgKyAnXCInKTtcbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufVxuXG5mdW5jdGlvbiByZWFkQW5jaG9yUHJvcGVydHkoc3RhdGUpIHtcbiAgdmFyIF9wb3NpdGlvbixcbiAgICAgIGNoO1xuXG4gIGNoID0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdChzdGF0ZS5wb3NpdGlvbik7XG5cbiAgaWYgKGNoICE9PSAweDI2LyogJiAqLykgcmV0dXJuIGZhbHNlO1xuXG4gIGlmIChzdGF0ZS5hbmNob3IgIT09IG51bGwpIHtcbiAgICB0aHJvd0Vycm9yKHN0YXRlLCAnZHVwbGljYXRpb24gb2YgYW4gYW5jaG9yIHByb3BlcnR5Jyk7XG4gIH1cblxuICBjaCA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoKytzdGF0ZS5wb3NpdGlvbik7XG4gIF9wb3NpdGlvbiA9IHN0YXRlLnBvc2l0aW9uO1xuXG4gIHdoaWxlIChjaCAhPT0gMCAmJiAhaXNfV1NfT1JfRU9MKGNoKSAmJiAhaXNfRkxPV19JTkRJQ0FUT1IoY2gpKSB7XG4gICAgY2ggPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KCsrc3RhdGUucG9zaXRpb24pO1xuICB9XG5cbiAgaWYgKHN0YXRlLnBvc2l0aW9uID09PSBfcG9zaXRpb24pIHtcbiAgICB0aHJvd0Vycm9yKHN0YXRlLCAnbmFtZSBvZiBhbiBhbmNob3Igbm9kZSBtdXN0IGNvbnRhaW4gYXQgbGVhc3Qgb25lIGNoYXJhY3RlcicpO1xuICB9XG5cbiAgc3RhdGUuYW5jaG9yID0gc3RhdGUuaW5wdXQuc2xpY2UoX3Bvc2l0aW9uLCBzdGF0ZS5wb3NpdGlvbik7XG4gIHJldHVybiB0cnVlO1xufVxuXG5mdW5jdGlvbiByZWFkQWxpYXMoc3RhdGUpIHtcbiAgdmFyIF9wb3NpdGlvbiwgYWxpYXMsXG4gICAgICBjaDtcblxuICBjaCA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoc3RhdGUucG9zaXRpb24pO1xuXG4gIGlmIChjaCAhPT0gMHgyQS8qICogKi8pIHJldHVybiBmYWxzZTtcblxuICBjaCA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoKytzdGF0ZS5wb3NpdGlvbik7XG4gIF9wb3NpdGlvbiA9IHN0YXRlLnBvc2l0aW9uO1xuXG4gIHdoaWxlIChjaCAhPT0gMCAmJiAhaXNfV1NfT1JfRU9MKGNoKSAmJiAhaXNfRkxPV19JTkRJQ0FUT1IoY2gpKSB7XG4gICAgY2ggPSBzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KCsrc3RhdGUucG9zaXRpb24pO1xuICB9XG5cbiAgaWYgKHN0YXRlLnBvc2l0aW9uID09PSBfcG9zaXRpb24pIHtcbiAgICB0aHJvd0Vycm9yKHN0YXRlLCAnbmFtZSBvZiBhbiBhbGlhcyBub2RlIG11c3QgY29udGFpbiBhdCBsZWFzdCBvbmUgY2hhcmFjdGVyJyk7XG4gIH1cblxuICBhbGlhcyA9IHN0YXRlLmlucHV0LnNsaWNlKF9wb3NpdGlvbiwgc3RhdGUucG9zaXRpb24pO1xuXG4gIGlmICghc3RhdGUuYW5jaG9yTWFwLmhhc093blByb3BlcnR5KGFsaWFzKSkge1xuICAgIHRocm93RXJyb3Ioc3RhdGUsICd1bmlkZW50aWZpZWQgYWxpYXMgXCInICsgYWxpYXMgKyAnXCInKTtcbiAgfVxuXG4gIHN0YXRlLnJlc3VsdCA9IHN0YXRlLmFuY2hvck1hcFthbGlhc107XG4gIHNraXBTZXBhcmF0aW9uU3BhY2Uoc3RhdGUsIHRydWUsIC0xKTtcbiAgcmV0dXJuIHRydWU7XG59XG5cbmZ1bmN0aW9uIGNvbXBvc2VOb2RlKHN0YXRlLCBwYXJlbnRJbmRlbnQsIG5vZGVDb250ZXh0LCBhbGxvd1RvU2VlaywgYWxsb3dDb21wYWN0KSB7XG4gIHZhciBhbGxvd0Jsb2NrU3R5bGVzLFxuICAgICAgYWxsb3dCbG9ja1NjYWxhcnMsXG4gICAgICBhbGxvd0Jsb2NrQ29sbGVjdGlvbnMsXG4gICAgICBpbmRlbnRTdGF0dXMgPSAxLCAvLyAxOiB0aGlzPnBhcmVudCwgMDogdGhpcz1wYXJlbnQsIC0xOiB0aGlzPHBhcmVudFxuICAgICAgYXROZXdMaW5lICA9IGZhbHNlLFxuICAgICAgaGFzQ29udGVudCA9IGZhbHNlLFxuICAgICAgdHlwZUluZGV4LFxuICAgICAgdHlwZVF1YW50aXR5LFxuICAgICAgdHlwZSxcbiAgICAgIGZsb3dJbmRlbnQsXG4gICAgICBibG9ja0luZGVudDtcblxuICBpZiAoc3RhdGUubGlzdGVuZXIgIT09IG51bGwpIHtcbiAgICBzdGF0ZS5saXN0ZW5lcignb3BlbicsIHN0YXRlKTtcbiAgfVxuXG4gIHN0YXRlLnRhZyAgICA9IG51bGw7XG4gIHN0YXRlLmFuY2hvciA9IG51bGw7XG4gIHN0YXRlLmtpbmQgICA9IG51bGw7XG4gIHN0YXRlLnJlc3VsdCA9IG51bGw7XG5cbiAgYWxsb3dCbG9ja1N0eWxlcyA9IGFsbG93QmxvY2tTY2FsYXJzID0gYWxsb3dCbG9ja0NvbGxlY3Rpb25zID1cbiAgICBDT05URVhUX0JMT0NLX09VVCA9PT0gbm9kZUNvbnRleHQgfHxcbiAgICBDT05URVhUX0JMT0NLX0lOICA9PT0gbm9kZUNvbnRleHQ7XG5cbiAgaWYgKGFsbG93VG9TZWVrKSB7XG4gICAgaWYgKHNraXBTZXBhcmF0aW9uU3BhY2Uoc3RhdGUsIHRydWUsIC0xKSkge1xuICAgICAgYXROZXdMaW5lID0gdHJ1ZTtcblxuICAgICAgaWYgKHN0YXRlLmxpbmVJbmRlbnQgPiBwYXJlbnRJbmRlbnQpIHtcbiAgICAgICAgaW5kZW50U3RhdHVzID0gMTtcbiAgICAgIH0gZWxzZSBpZiAoc3RhdGUubGluZUluZGVudCA9PT0gcGFyZW50SW5kZW50KSB7XG4gICAgICAgIGluZGVudFN0YXR1cyA9IDA7XG4gICAgICB9IGVsc2UgaWYgKHN0YXRlLmxpbmVJbmRlbnQgPCBwYXJlbnRJbmRlbnQpIHtcbiAgICAgICAgaW5kZW50U3RhdHVzID0gLTE7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgaWYgKGluZGVudFN0YXR1cyA9PT0gMSkge1xuICAgIHdoaWxlIChyZWFkVGFnUHJvcGVydHkoc3RhdGUpIHx8IHJlYWRBbmNob3JQcm9wZXJ0eShzdGF0ZSkpIHtcbiAgICAgIGlmIChza2lwU2VwYXJhdGlvblNwYWNlKHN0YXRlLCB0cnVlLCAtMSkpIHtcbiAgICAgICAgYXROZXdMaW5lID0gdHJ1ZTtcbiAgICAgICAgYWxsb3dCbG9ja0NvbGxlY3Rpb25zID0gYWxsb3dCbG9ja1N0eWxlcztcblxuICAgICAgICBpZiAoc3RhdGUubGluZUluZGVudCA+IHBhcmVudEluZGVudCkge1xuICAgICAgICAgIGluZGVudFN0YXR1cyA9IDE7XG4gICAgICAgIH0gZWxzZSBpZiAoc3RhdGUubGluZUluZGVudCA9PT0gcGFyZW50SW5kZW50KSB7XG4gICAgICAgICAgaW5kZW50U3RhdHVzID0gMDtcbiAgICAgICAgfSBlbHNlIGlmIChzdGF0ZS5saW5lSW5kZW50IDwgcGFyZW50SW5kZW50KSB7XG4gICAgICAgICAgaW5kZW50U3RhdHVzID0gLTE7XG4gICAgICAgIH1cbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGFsbG93QmxvY2tDb2xsZWN0aW9ucyA9IGZhbHNlO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIGlmIChhbGxvd0Jsb2NrQ29sbGVjdGlvbnMpIHtcbiAgICBhbGxvd0Jsb2NrQ29sbGVjdGlvbnMgPSBhdE5ld0xpbmUgfHwgYWxsb3dDb21wYWN0O1xuICB9XG5cbiAgaWYgKGluZGVudFN0YXR1cyA9PT0gMSB8fCBDT05URVhUX0JMT0NLX09VVCA9PT0gbm9kZUNvbnRleHQpIHtcbiAgICBpZiAoQ09OVEVYVF9GTE9XX0lOID09PSBub2RlQ29udGV4dCB8fCBDT05URVhUX0ZMT1dfT1VUID09PSBub2RlQ29udGV4dCkge1xuICAgICAgZmxvd0luZGVudCA9IHBhcmVudEluZGVudDtcbiAgICB9IGVsc2Uge1xuICAgICAgZmxvd0luZGVudCA9IHBhcmVudEluZGVudCArIDE7XG4gICAgfVxuXG4gICAgYmxvY2tJbmRlbnQgPSBzdGF0ZS5wb3NpdGlvbiAtIHN0YXRlLmxpbmVTdGFydDtcblxuICAgIGlmIChpbmRlbnRTdGF0dXMgPT09IDEpIHtcbiAgICAgIGlmIChhbGxvd0Jsb2NrQ29sbGVjdGlvbnMgJiZcbiAgICAgICAgICAocmVhZEJsb2NrU2VxdWVuY2Uoc3RhdGUsIGJsb2NrSW5kZW50KSB8fFxuICAgICAgICAgICByZWFkQmxvY2tNYXBwaW5nKHN0YXRlLCBibG9ja0luZGVudCwgZmxvd0luZGVudCkpIHx8XG4gICAgICAgICAgcmVhZEZsb3dDb2xsZWN0aW9uKHN0YXRlLCBmbG93SW5kZW50KSkge1xuICAgICAgICBoYXNDb250ZW50ID0gdHJ1ZTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGlmICgoYWxsb3dCbG9ja1NjYWxhcnMgJiYgcmVhZEJsb2NrU2NhbGFyKHN0YXRlLCBmbG93SW5kZW50KSkgfHxcbiAgICAgICAgICAgIHJlYWRTaW5nbGVRdW90ZWRTY2FsYXIoc3RhdGUsIGZsb3dJbmRlbnQpIHx8XG4gICAgICAgICAgICByZWFkRG91YmxlUXVvdGVkU2NhbGFyKHN0YXRlLCBmbG93SW5kZW50KSkge1xuICAgICAgICAgIGhhc0NvbnRlbnQgPSB0cnVlO1xuXG4gICAgICAgIH0gZWxzZSBpZiAocmVhZEFsaWFzKHN0YXRlKSkge1xuICAgICAgICAgIGhhc0NvbnRlbnQgPSB0cnVlO1xuXG4gICAgICAgICAgaWYgKHN0YXRlLnRhZyAhPT0gbnVsbCB8fCBzdGF0ZS5hbmNob3IgIT09IG51bGwpIHtcbiAgICAgICAgICAgIHRocm93RXJyb3Ioc3RhdGUsICdhbGlhcyBub2RlIHNob3VsZCBub3QgaGF2ZSBhbnkgcHJvcGVydGllcycpO1xuICAgICAgICAgIH1cblxuICAgICAgICB9IGVsc2UgaWYgKHJlYWRQbGFpblNjYWxhcihzdGF0ZSwgZmxvd0luZGVudCwgQ09OVEVYVF9GTE9XX0lOID09PSBub2RlQ29udGV4dCkpIHtcbiAgICAgICAgICBoYXNDb250ZW50ID0gdHJ1ZTtcblxuICAgICAgICAgIGlmIChzdGF0ZS50YWcgPT09IG51bGwpIHtcbiAgICAgICAgICAgIHN0YXRlLnRhZyA9ICc/JztcbiAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoc3RhdGUuYW5jaG9yICE9PSBudWxsKSB7XG4gICAgICAgICAgc3RhdGUuYW5jaG9yTWFwW3N0YXRlLmFuY2hvcl0gPSBzdGF0ZS5yZXN1bHQ7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKGluZGVudFN0YXR1cyA9PT0gMCkge1xuICAgICAgLy8gU3BlY2lhbCBjYXNlOiBibG9jayBzZXF1ZW5jZXMgYXJlIGFsbG93ZWQgdG8gaGF2ZSBzYW1lIGluZGVudGF0aW9uIGxldmVsIGFzIHRoZSBwYXJlbnQuXG4gICAgICAvLyBodHRwOi8vd3d3LnlhbWwub3JnL3NwZWMvMS4yL3NwZWMuaHRtbCNpZDI3OTk3ODRcbiAgICAgIGhhc0NvbnRlbnQgPSBhbGxvd0Jsb2NrQ29sbGVjdGlvbnMgJiYgcmVhZEJsb2NrU2VxdWVuY2Uoc3RhdGUsIGJsb2NrSW5kZW50KTtcbiAgICB9XG4gIH1cblxuICBpZiAoc3RhdGUudGFnICE9PSBudWxsICYmIHN0YXRlLnRhZyAhPT0gJyEnKSB7XG4gICAgaWYgKHN0YXRlLnRhZyA9PT0gJz8nKSB7XG4gICAgICBmb3IgKHR5cGVJbmRleCA9IDAsIHR5cGVRdWFudGl0eSA9IHN0YXRlLmltcGxpY2l0VHlwZXMubGVuZ3RoO1xuICAgICAgICAgICB0eXBlSW5kZXggPCB0eXBlUXVhbnRpdHk7XG4gICAgICAgICAgIHR5cGVJbmRleCArPSAxKSB7XG4gICAgICAgIHR5cGUgPSBzdGF0ZS5pbXBsaWNpdFR5cGVzW3R5cGVJbmRleF07XG5cbiAgICAgICAgLy8gSW1wbGljaXQgcmVzb2x2aW5nIGlzIG5vdCBhbGxvd2VkIGZvciBub24tc2NhbGFyIHR5cGVzLCBhbmQgJz8nXG4gICAgICAgIC8vIG5vbi1zcGVjaWZpYyB0YWcgaXMgb25seSBhc3NpZ25lZCB0byBwbGFpbiBzY2FsYXJzLiBTbywgaXQgaXNuJ3RcbiAgICAgICAgLy8gbmVlZGVkIHRvIGNoZWNrIGZvciAna2luZCcgY29uZm9ybWl0eS5cblxuICAgICAgICBpZiAodHlwZS5yZXNvbHZlKHN0YXRlLnJlc3VsdCkpIHsgLy8gYHN0YXRlLnJlc3VsdGAgdXBkYXRlZCBpbiByZXNvbHZlciBpZiBtYXRjaGVkXG4gICAgICAgICAgc3RhdGUucmVzdWx0ID0gdHlwZS5jb25zdHJ1Y3Qoc3RhdGUucmVzdWx0KTtcbiAgICAgICAgICBzdGF0ZS50YWcgPSB0eXBlLnRhZztcbiAgICAgICAgICBpZiAoc3RhdGUuYW5jaG9yICE9PSBudWxsKSB7XG4gICAgICAgICAgICBzdGF0ZS5hbmNob3JNYXBbc3RhdGUuYW5jaG9yXSA9IHN0YXRlLnJlc3VsdDtcbiAgICAgICAgICB9XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9IGVsc2UgaWYgKF9oYXNPd25Qcm9wZXJ0eS5jYWxsKHN0YXRlLnR5cGVNYXAsIHN0YXRlLnRhZykpIHtcbiAgICAgIHR5cGUgPSBzdGF0ZS50eXBlTWFwW3N0YXRlLnRhZ107XG5cbiAgICAgIGlmIChzdGF0ZS5yZXN1bHQgIT09IG51bGwgJiYgdHlwZS5raW5kICE9PSBzdGF0ZS5raW5kKSB7XG4gICAgICAgIHRocm93RXJyb3Ioc3RhdGUsICd1bmFjY2VwdGFibGUgbm9kZSBraW5kIGZvciAhPCcgKyBzdGF0ZS50YWcgKyAnPiB0YWc7IGl0IHNob3VsZCBiZSBcIicgKyB0eXBlLmtpbmQgKyAnXCIsIG5vdCBcIicgKyBzdGF0ZS5raW5kICsgJ1wiJyk7XG4gICAgICB9XG5cbiAgICAgIGlmICghdHlwZS5yZXNvbHZlKHN0YXRlLnJlc3VsdCkpIHsgLy8gYHN0YXRlLnJlc3VsdGAgdXBkYXRlZCBpbiByZXNvbHZlciBpZiBtYXRjaGVkXG4gICAgICAgIHRocm93RXJyb3Ioc3RhdGUsICdjYW5ub3QgcmVzb2x2ZSBhIG5vZGUgd2l0aCAhPCcgKyBzdGF0ZS50YWcgKyAnPiBleHBsaWNpdCB0YWcnKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHN0YXRlLnJlc3VsdCA9IHR5cGUuY29uc3RydWN0KHN0YXRlLnJlc3VsdCk7XG4gICAgICAgIGlmIChzdGF0ZS5hbmNob3IgIT09IG51bGwpIHtcbiAgICAgICAgICBzdGF0ZS5hbmNob3JNYXBbc3RhdGUuYW5jaG9yXSA9IHN0YXRlLnJlc3VsdDtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICB0aHJvd0Vycm9yKHN0YXRlLCAndW5rbm93biB0YWcgITwnICsgc3RhdGUudGFnICsgJz4nKTtcbiAgICB9XG4gIH1cblxuICBpZiAoc3RhdGUubGlzdGVuZXIgIT09IG51bGwpIHtcbiAgICBzdGF0ZS5saXN0ZW5lcignY2xvc2UnLCBzdGF0ZSk7XG4gIH1cbiAgcmV0dXJuIHN0YXRlLnRhZyAhPT0gbnVsbCB8fCAgc3RhdGUuYW5jaG9yICE9PSBudWxsIHx8IGhhc0NvbnRlbnQ7XG59XG5cbmZ1bmN0aW9uIHJlYWREb2N1bWVudChzdGF0ZSkge1xuICB2YXIgZG9jdW1lbnRTdGFydCA9IHN0YXRlLnBvc2l0aW9uLFxuICAgICAgX3Bvc2l0aW9uLFxuICAgICAgZGlyZWN0aXZlTmFtZSxcbiAgICAgIGRpcmVjdGl2ZUFyZ3MsXG4gICAgICBoYXNEaXJlY3RpdmVzID0gZmFsc2UsXG4gICAgICBjaDtcblxuICBzdGF0ZS52ZXJzaW9uID0gbnVsbDtcbiAgc3RhdGUuY2hlY2tMaW5lQnJlYWtzID0gc3RhdGUubGVnYWN5O1xuICBzdGF0ZS50YWdNYXAgPSB7fTtcbiAgc3RhdGUuYW5jaG9yTWFwID0ge307XG5cbiAgd2hpbGUgKChjaCA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoc3RhdGUucG9zaXRpb24pKSAhPT0gMCkge1xuICAgIHNraXBTZXBhcmF0aW9uU3BhY2Uoc3RhdGUsIHRydWUsIC0xKTtcblxuICAgIGNoID0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdChzdGF0ZS5wb3NpdGlvbik7XG5cbiAgICBpZiAoc3RhdGUubGluZUluZGVudCA+IDAgfHwgY2ggIT09IDB4MjUvKiAlICovKSB7XG4gICAgICBicmVhaztcbiAgICB9XG5cbiAgICBoYXNEaXJlY3RpdmVzID0gdHJ1ZTtcbiAgICBjaCA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoKytzdGF0ZS5wb3NpdGlvbik7XG4gICAgX3Bvc2l0aW9uID0gc3RhdGUucG9zaXRpb247XG5cbiAgICB3aGlsZSAoY2ggIT09IDAgJiYgIWlzX1dTX09SX0VPTChjaCkpIHtcbiAgICAgIGNoID0gc3RhdGUuaW5wdXQuY2hhckNvZGVBdCgrK3N0YXRlLnBvc2l0aW9uKTtcbiAgICB9XG5cbiAgICBkaXJlY3RpdmVOYW1lID0gc3RhdGUuaW5wdXQuc2xpY2UoX3Bvc2l0aW9uLCBzdGF0ZS5wb3NpdGlvbik7XG4gICAgZGlyZWN0aXZlQXJncyA9IFtdO1xuXG4gICAgaWYgKGRpcmVjdGl2ZU5hbWUubGVuZ3RoIDwgMSkge1xuICAgICAgdGhyb3dFcnJvcihzdGF0ZSwgJ2RpcmVjdGl2ZSBuYW1lIG11c3Qgbm90IGJlIGxlc3MgdGhhbiBvbmUgY2hhcmFjdGVyIGluIGxlbmd0aCcpO1xuICAgIH1cblxuICAgIHdoaWxlIChjaCAhPT0gMCkge1xuICAgICAgd2hpbGUgKGlzX1dISVRFX1NQQUNFKGNoKSkge1xuICAgICAgICBjaCA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoKytzdGF0ZS5wb3NpdGlvbik7XG4gICAgICB9XG5cbiAgICAgIGlmIChjaCA9PT0gMHgyMy8qICMgKi8pIHtcbiAgICAgICAgZG8geyBjaCA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoKytzdGF0ZS5wb3NpdGlvbik7IH1cbiAgICAgICAgd2hpbGUgKGNoICE9PSAwICYmICFpc19FT0woY2gpKTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICAgIGlmIChpc19FT0woY2gpKSBicmVhaztcblxuICAgICAgX3Bvc2l0aW9uID0gc3RhdGUucG9zaXRpb247XG5cbiAgICAgIHdoaWxlIChjaCAhPT0gMCAmJiAhaXNfV1NfT1JfRU9MKGNoKSkge1xuICAgICAgICBjaCA9IHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoKytzdGF0ZS5wb3NpdGlvbik7XG4gICAgICB9XG5cbiAgICAgIGRpcmVjdGl2ZUFyZ3MucHVzaChzdGF0ZS5pbnB1dC5zbGljZShfcG9zaXRpb24sIHN0YXRlLnBvc2l0aW9uKSk7XG4gICAgfVxuXG4gICAgaWYgKGNoICE9PSAwKSByZWFkTGluZUJyZWFrKHN0YXRlKTtcblxuICAgIGlmIChfaGFzT3duUHJvcGVydHkuY2FsbChkaXJlY3RpdmVIYW5kbGVycywgZGlyZWN0aXZlTmFtZSkpIHtcbiAgICAgIGRpcmVjdGl2ZUhhbmRsZXJzW2RpcmVjdGl2ZU5hbWVdKHN0YXRlLCBkaXJlY3RpdmVOYW1lLCBkaXJlY3RpdmVBcmdzKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhyb3dXYXJuaW5nKHN0YXRlLCAndW5rbm93biBkb2N1bWVudCBkaXJlY3RpdmUgXCInICsgZGlyZWN0aXZlTmFtZSArICdcIicpO1xuICAgIH1cbiAgfVxuXG4gIHNraXBTZXBhcmF0aW9uU3BhY2Uoc3RhdGUsIHRydWUsIC0xKTtcblxuICBpZiAoc3RhdGUubGluZUluZGVudCA9PT0gMCAmJlxuICAgICAgc3RhdGUuaW5wdXQuY2hhckNvZGVBdChzdGF0ZS5wb3NpdGlvbikgICAgID09PSAweDJELyogLSAqLyAmJlxuICAgICAgc3RhdGUuaW5wdXQuY2hhckNvZGVBdChzdGF0ZS5wb3NpdGlvbiArIDEpID09PSAweDJELyogLSAqLyAmJlxuICAgICAgc3RhdGUuaW5wdXQuY2hhckNvZGVBdChzdGF0ZS5wb3NpdGlvbiArIDIpID09PSAweDJELyogLSAqLykge1xuICAgIHN0YXRlLnBvc2l0aW9uICs9IDM7XG4gICAgc2tpcFNlcGFyYXRpb25TcGFjZShzdGF0ZSwgdHJ1ZSwgLTEpO1xuXG4gIH0gZWxzZSBpZiAoaGFzRGlyZWN0aXZlcykge1xuICAgIHRocm93RXJyb3Ioc3RhdGUsICdkaXJlY3RpdmVzIGVuZCBtYXJrIGlzIGV4cGVjdGVkJyk7XG4gIH1cblxuICBjb21wb3NlTm9kZShzdGF0ZSwgc3RhdGUubGluZUluZGVudCAtIDEsIENPTlRFWFRfQkxPQ0tfT1VULCBmYWxzZSwgdHJ1ZSk7XG4gIHNraXBTZXBhcmF0aW9uU3BhY2Uoc3RhdGUsIHRydWUsIC0xKTtcblxuICBpZiAoc3RhdGUuY2hlY2tMaW5lQnJlYWtzICYmXG4gICAgICBQQVRURVJOX05PTl9BU0NJSV9MSU5FX0JSRUFLUy50ZXN0KHN0YXRlLmlucHV0LnNsaWNlKGRvY3VtZW50U3RhcnQsIHN0YXRlLnBvc2l0aW9uKSkpIHtcbiAgICB0aHJvd1dhcm5pbmcoc3RhdGUsICdub24tQVNDSUkgbGluZSBicmVha3MgYXJlIGludGVycHJldGVkIGFzIGNvbnRlbnQnKTtcbiAgfVxuXG4gIHN0YXRlLmRvY3VtZW50cy5wdXNoKHN0YXRlLnJlc3VsdCk7XG5cbiAgaWYgKHN0YXRlLnBvc2l0aW9uID09PSBzdGF0ZS5saW5lU3RhcnQgJiYgdGVzdERvY3VtZW50U2VwYXJhdG9yKHN0YXRlKSkge1xuXG4gICAgaWYgKHN0YXRlLmlucHV0LmNoYXJDb2RlQXQoc3RhdGUucG9zaXRpb24pID09PSAweDJFLyogLiAqLykge1xuICAgICAgc3RhdGUucG9zaXRpb24gKz0gMztcbiAgICAgIHNraXBTZXBhcmF0aW9uU3BhY2Uoc3RhdGUsIHRydWUsIC0xKTtcbiAgICB9XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgaWYgKHN0YXRlLnBvc2l0aW9uIDwgKHN0YXRlLmxlbmd0aCAtIDEpKSB7XG4gICAgdGhyb3dFcnJvcihzdGF0ZSwgJ2VuZCBvZiB0aGUgc3RyZWFtIG9yIGEgZG9jdW1lbnQgc2VwYXJhdG9yIGlzIGV4cGVjdGVkJyk7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuO1xuICB9XG59XG5cblxuZnVuY3Rpb24gbG9hZERvY3VtZW50cyhpbnB1dCwgb3B0aW9ucykge1xuICBpbnB1dCA9IFN0cmluZyhpbnB1dCk7XG4gIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuXG4gIGlmIChpbnB1dC5sZW5ndGggIT09IDApIHtcblxuICAgIC8vIEFkZCB0YWlsaW5nIGBcXG5gIGlmIG5vdCBleGlzdHNcbiAgICBpZiAoaW5wdXQuY2hhckNvZGVBdChpbnB1dC5sZW5ndGggLSAxKSAhPT0gMHgwQS8qIExGICovICYmXG4gICAgICAgIGlucHV0LmNoYXJDb2RlQXQoaW5wdXQubGVuZ3RoIC0gMSkgIT09IDB4MEQvKiBDUiAqLykge1xuICAgICAgaW5wdXQgKz0gJ1xcbic7XG4gICAgfVxuXG4gICAgLy8gU3RyaXAgQk9NXG4gICAgaWYgKGlucHV0LmNoYXJDb2RlQXQoMCkgPT09IDB4RkVGRikge1xuICAgICAgaW5wdXQgPSBpbnB1dC5zbGljZSgxKTtcbiAgICB9XG4gIH1cblxuICB2YXIgc3RhdGUgPSBuZXcgU3RhdGUoaW5wdXQsIG9wdGlvbnMpO1xuXG4gIC8vIFVzZSAwIGFzIHN0cmluZyB0ZXJtaW5hdG9yLiBUaGF0IHNpZ25pZmljYW50bHkgc2ltcGxpZmllcyBib3VuZHMgY2hlY2suXG4gIHN0YXRlLmlucHV0ICs9ICdcXDAnO1xuXG4gIHdoaWxlIChzdGF0ZS5pbnB1dC5jaGFyQ29kZUF0KHN0YXRlLnBvc2l0aW9uKSA9PT0gMHgyMC8qIFNwYWNlICovKSB7XG4gICAgc3RhdGUubGluZUluZGVudCArPSAxO1xuICAgIHN0YXRlLnBvc2l0aW9uICs9IDE7XG4gIH1cblxuICB3aGlsZSAoc3RhdGUucG9zaXRpb24gPCAoc3RhdGUubGVuZ3RoIC0gMSkpIHtcbiAgICByZWFkRG9jdW1lbnQoc3RhdGUpO1xuICB9XG5cbiAgcmV0dXJuIHN0YXRlLmRvY3VtZW50cztcbn1cblxuXG5mdW5jdGlvbiBsb2FkQWxsKGlucHV0LCBpdGVyYXRvciwgb3B0aW9ucykge1xuICB2YXIgZG9jdW1lbnRzID0gbG9hZERvY3VtZW50cyhpbnB1dCwgb3B0aW9ucyksIGluZGV4LCBsZW5ndGg7XG5cbiAgZm9yIChpbmRleCA9IDAsIGxlbmd0aCA9IGRvY3VtZW50cy5sZW5ndGg7IGluZGV4IDwgbGVuZ3RoOyBpbmRleCArPSAxKSB7XG4gICAgaXRlcmF0b3IoZG9jdW1lbnRzW2luZGV4XSk7XG4gIH1cbn1cblxuXG5mdW5jdGlvbiBsb2FkKGlucHV0LCBvcHRpb25zKSB7XG4gIHZhciBkb2N1bWVudHMgPSBsb2FkRG9jdW1lbnRzKGlucHV0LCBvcHRpb25zKTtcblxuICBpZiAoZG9jdW1lbnRzLmxlbmd0aCA9PT0gMCkge1xuICAgIC8qZXNsaW50LWRpc2FibGUgbm8tdW5kZWZpbmVkKi9cbiAgICByZXR1cm4gdW5kZWZpbmVkO1xuICB9IGVsc2UgaWYgKGRvY3VtZW50cy5sZW5ndGggPT09IDEpIHtcbiAgICByZXR1cm4gZG9jdW1lbnRzWzBdO1xuICB9XG4gIHRocm93IG5ldyBZQU1MRXhjZXB0aW9uKCdleHBlY3RlZCBhIHNpbmdsZSBkb2N1bWVudCBpbiB0aGUgc3RyZWFtLCBidXQgZm91bmQgbW9yZScpO1xufVxuXG5cbmZ1bmN0aW9uIHNhZmVMb2FkQWxsKGlucHV0LCBvdXRwdXQsIG9wdGlvbnMpIHtcbiAgbG9hZEFsbChpbnB1dCwgb3V0cHV0LCBjb21tb24uZXh0ZW5kKHsgc2NoZW1hOiBERUZBVUxUX1NBRkVfU0NIRU1BIH0sIG9wdGlvbnMpKTtcbn1cblxuXG5mdW5jdGlvbiBzYWZlTG9hZChpbnB1dCwgb3B0aW9ucykge1xuICByZXR1cm4gbG9hZChpbnB1dCwgY29tbW9uLmV4dGVuZCh7IHNjaGVtYTogREVGQVVMVF9TQUZFX1NDSEVNQSB9LCBvcHRpb25zKSk7XG59XG5cblxubW9kdWxlLmV4cG9ydHMubG9hZEFsbCAgICAgPSBsb2FkQWxsO1xubW9kdWxlLmV4cG9ydHMubG9hZCAgICAgICAgPSBsb2FkO1xubW9kdWxlLmV4cG9ydHMuc2FmZUxvYWRBbGwgPSBzYWZlTG9hZEFsbDtcbm1vZHVsZS5leHBvcnRzLnNhZmVMb2FkICAgID0gc2FmZUxvYWQ7XG4iLCIndXNlIHN0cmljdCc7XG5cblxudmFyIGNvbW1vbiA9IHJlcXVpcmUoJy4vY29tbW9uJyk7XG5cblxuZnVuY3Rpb24gTWFyayhuYW1lLCBidWZmZXIsIHBvc2l0aW9uLCBsaW5lLCBjb2x1bW4pIHtcbiAgdGhpcy5uYW1lICAgICA9IG5hbWU7XG4gIHRoaXMuYnVmZmVyICAgPSBidWZmZXI7XG4gIHRoaXMucG9zaXRpb24gPSBwb3NpdGlvbjtcbiAgdGhpcy5saW5lICAgICA9IGxpbmU7XG4gIHRoaXMuY29sdW1uICAgPSBjb2x1bW47XG59XG5cblxuTWFyay5wcm90b3R5cGUuZ2V0U25pcHBldCA9IGZ1bmN0aW9uIGdldFNuaXBwZXQoaW5kZW50LCBtYXhMZW5ndGgpIHtcbiAgdmFyIGhlYWQsIHN0YXJ0LCB0YWlsLCBlbmQsIHNuaXBwZXQ7XG5cbiAgaWYgKCF0aGlzLmJ1ZmZlcikgcmV0dXJuIG51bGw7XG5cbiAgaW5kZW50ID0gaW5kZW50IHx8IDQ7XG4gIG1heExlbmd0aCA9IG1heExlbmd0aCB8fCA3NTtcblxuICBoZWFkID0gJyc7XG4gIHN0YXJ0ID0gdGhpcy5wb3NpdGlvbjtcblxuICB3aGlsZSAoc3RhcnQgPiAwICYmICdcXHgwMFxcclxcblxceDg1XFx1MjAyOFxcdTIwMjknLmluZGV4T2YodGhpcy5idWZmZXIuY2hhckF0KHN0YXJ0IC0gMSkpID09PSAtMSkge1xuICAgIHN0YXJ0IC09IDE7XG4gICAgaWYgKHRoaXMucG9zaXRpb24gLSBzdGFydCA+IChtYXhMZW5ndGggLyAyIC0gMSkpIHtcbiAgICAgIGhlYWQgPSAnIC4uLiAnO1xuICAgICAgc3RhcnQgKz0gNTtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIHRhaWwgPSAnJztcbiAgZW5kID0gdGhpcy5wb3NpdGlvbjtcblxuICB3aGlsZSAoZW5kIDwgdGhpcy5idWZmZXIubGVuZ3RoICYmICdcXHgwMFxcclxcblxceDg1XFx1MjAyOFxcdTIwMjknLmluZGV4T2YodGhpcy5idWZmZXIuY2hhckF0KGVuZCkpID09PSAtMSkge1xuICAgIGVuZCArPSAxO1xuICAgIGlmIChlbmQgLSB0aGlzLnBvc2l0aW9uID4gKG1heExlbmd0aCAvIDIgLSAxKSkge1xuICAgICAgdGFpbCA9ICcgLi4uICc7XG4gICAgICBlbmQgLT0gNTtcbiAgICAgIGJyZWFrO1xuICAgIH1cbiAgfVxuXG4gIHNuaXBwZXQgPSB0aGlzLmJ1ZmZlci5zbGljZShzdGFydCwgZW5kKTtcblxuICByZXR1cm4gY29tbW9uLnJlcGVhdCgnICcsIGluZGVudCkgKyBoZWFkICsgc25pcHBldCArIHRhaWwgKyAnXFxuJyArXG4gICAgICAgICBjb21tb24ucmVwZWF0KCcgJywgaW5kZW50ICsgdGhpcy5wb3NpdGlvbiAtIHN0YXJ0ICsgaGVhZC5sZW5ndGgpICsgJ14nO1xufTtcblxuXG5NYXJrLnByb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uIHRvU3RyaW5nKGNvbXBhY3QpIHtcbiAgdmFyIHNuaXBwZXQsIHdoZXJlID0gJyc7XG5cbiAgaWYgKHRoaXMubmFtZSkge1xuICAgIHdoZXJlICs9ICdpbiBcIicgKyB0aGlzLm5hbWUgKyAnXCIgJztcbiAgfVxuXG4gIHdoZXJlICs9ICdhdCBsaW5lICcgKyAodGhpcy5saW5lICsgMSkgKyAnLCBjb2x1bW4gJyArICh0aGlzLmNvbHVtbiArIDEpO1xuXG4gIGlmICghY29tcGFjdCkge1xuICAgIHNuaXBwZXQgPSB0aGlzLmdldFNuaXBwZXQoKTtcblxuICAgIGlmIChzbmlwcGV0KSB7XG4gICAgICB3aGVyZSArPSAnOlxcbicgKyBzbmlwcGV0O1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiB3aGVyZTtcbn07XG5cblxubW9kdWxlLmV4cG9ydHMgPSBNYXJrO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG4vKmVzbGludC1kaXNhYmxlIG1heC1sZW4qL1xuXG52YXIgY29tbW9uICAgICAgICA9IHJlcXVpcmUoJy4vY29tbW9uJyk7XG52YXIgWUFNTEV4Y2VwdGlvbiA9IHJlcXVpcmUoJy4vZXhjZXB0aW9uJyk7XG52YXIgVHlwZSAgICAgICAgICA9IHJlcXVpcmUoJy4vdHlwZScpO1xuXG5cbmZ1bmN0aW9uIGNvbXBpbGVMaXN0KHNjaGVtYSwgbmFtZSwgcmVzdWx0KSB7XG4gIHZhciBleGNsdWRlID0gW107XG5cbiAgc2NoZW1hLmluY2x1ZGUuZm9yRWFjaChmdW5jdGlvbiAoaW5jbHVkZWRTY2hlbWEpIHtcbiAgICByZXN1bHQgPSBjb21waWxlTGlzdChpbmNsdWRlZFNjaGVtYSwgbmFtZSwgcmVzdWx0KTtcbiAgfSk7XG5cbiAgc2NoZW1hW25hbWVdLmZvckVhY2goZnVuY3Rpb24gKGN1cnJlbnRUeXBlKSB7XG4gICAgcmVzdWx0LmZvckVhY2goZnVuY3Rpb24gKHByZXZpb3VzVHlwZSwgcHJldmlvdXNJbmRleCkge1xuICAgICAgaWYgKHByZXZpb3VzVHlwZS50YWcgPT09IGN1cnJlbnRUeXBlLnRhZykge1xuICAgICAgICBleGNsdWRlLnB1c2gocHJldmlvdXNJbmRleCk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgICByZXN1bHQucHVzaChjdXJyZW50VHlwZSk7XG4gIH0pO1xuXG4gIHJldHVybiByZXN1bHQuZmlsdGVyKGZ1bmN0aW9uICh0eXBlLCBpbmRleCkge1xuICAgIHJldHVybiBleGNsdWRlLmluZGV4T2YoaW5kZXgpID09PSAtMTtcbiAgfSk7XG59XG5cblxuZnVuY3Rpb24gY29tcGlsZU1hcCgvKiBsaXN0cy4uLiAqLykge1xuICB2YXIgcmVzdWx0ID0ge30sIGluZGV4LCBsZW5ndGg7XG5cbiAgZnVuY3Rpb24gY29sbGVjdFR5cGUodHlwZSkge1xuICAgIHJlc3VsdFt0eXBlLnRhZ10gPSB0eXBlO1xuICB9XG5cbiAgZm9yIChpbmRleCA9IDAsIGxlbmd0aCA9IGFyZ3VtZW50cy5sZW5ndGg7IGluZGV4IDwgbGVuZ3RoOyBpbmRleCArPSAxKSB7XG4gICAgYXJndW1lbnRzW2luZGV4XS5mb3JFYWNoKGNvbGxlY3RUeXBlKTtcbiAgfVxuXG4gIHJldHVybiByZXN1bHQ7XG59XG5cblxuZnVuY3Rpb24gU2NoZW1hKGRlZmluaXRpb24pIHtcbiAgdGhpcy5pbmNsdWRlICA9IGRlZmluaXRpb24uaW5jbHVkZSAgfHwgW107XG4gIHRoaXMuaW1wbGljaXQgPSBkZWZpbml0aW9uLmltcGxpY2l0IHx8IFtdO1xuICB0aGlzLmV4cGxpY2l0ID0gZGVmaW5pdGlvbi5leHBsaWNpdCB8fCBbXTtcblxuICB0aGlzLmltcGxpY2l0LmZvckVhY2goZnVuY3Rpb24gKHR5cGUpIHtcbiAgICBpZiAodHlwZS5sb2FkS2luZCAmJiB0eXBlLmxvYWRLaW5kICE9PSAnc2NhbGFyJykge1xuICAgICAgdGhyb3cgbmV3IFlBTUxFeGNlcHRpb24oJ1RoZXJlIGlzIGEgbm9uLXNjYWxhciB0eXBlIGluIHRoZSBpbXBsaWNpdCBsaXN0IG9mIGEgc2NoZW1hLiBJbXBsaWNpdCByZXNvbHZpbmcgb2Ygc3VjaCB0eXBlcyBpcyBub3Qgc3VwcG9ydGVkLicpO1xuICAgIH1cbiAgfSk7XG5cbiAgdGhpcy5jb21waWxlZEltcGxpY2l0ID0gY29tcGlsZUxpc3QodGhpcywgJ2ltcGxpY2l0JywgW10pO1xuICB0aGlzLmNvbXBpbGVkRXhwbGljaXQgPSBjb21waWxlTGlzdCh0aGlzLCAnZXhwbGljaXQnLCBbXSk7XG4gIHRoaXMuY29tcGlsZWRUeXBlTWFwICA9IGNvbXBpbGVNYXAodGhpcy5jb21waWxlZEltcGxpY2l0LCB0aGlzLmNvbXBpbGVkRXhwbGljaXQpO1xufVxuXG5cblNjaGVtYS5ERUZBVUxUID0gbnVsbDtcblxuXG5TY2hlbWEuY3JlYXRlID0gZnVuY3Rpb24gY3JlYXRlU2NoZW1hKCkge1xuICB2YXIgc2NoZW1hcywgdHlwZXM7XG5cbiAgc3dpdGNoIChhcmd1bWVudHMubGVuZ3RoKSB7XG4gICAgY2FzZSAxOlxuICAgICAgc2NoZW1hcyA9IFNjaGVtYS5ERUZBVUxUO1xuICAgICAgdHlwZXMgPSBhcmd1bWVudHNbMF07XG4gICAgICBicmVhaztcblxuICAgIGNhc2UgMjpcbiAgICAgIHNjaGVtYXMgPSBhcmd1bWVudHNbMF07XG4gICAgICB0eXBlcyA9IGFyZ3VtZW50c1sxXTtcbiAgICAgIGJyZWFrO1xuXG4gICAgZGVmYXVsdDpcbiAgICAgIHRocm93IG5ldyBZQU1MRXhjZXB0aW9uKCdXcm9uZyBudW1iZXIgb2YgYXJndW1lbnRzIGZvciBTY2hlbWEuY3JlYXRlIGZ1bmN0aW9uJyk7XG4gIH1cblxuICBzY2hlbWFzID0gY29tbW9uLnRvQXJyYXkoc2NoZW1hcyk7XG4gIHR5cGVzID0gY29tbW9uLnRvQXJyYXkodHlwZXMpO1xuXG4gIGlmICghc2NoZW1hcy5ldmVyeShmdW5jdGlvbiAoc2NoZW1hKSB7IHJldHVybiBzY2hlbWEgaW5zdGFuY2VvZiBTY2hlbWE7IH0pKSB7XG4gICAgdGhyb3cgbmV3IFlBTUxFeGNlcHRpb24oJ1NwZWNpZmllZCBsaXN0IG9mIHN1cGVyIHNjaGVtYXMgKG9yIGEgc2luZ2xlIFNjaGVtYSBvYmplY3QpIGNvbnRhaW5zIGEgbm9uLVNjaGVtYSBvYmplY3QuJyk7XG4gIH1cblxuICBpZiAoIXR5cGVzLmV2ZXJ5KGZ1bmN0aW9uICh0eXBlKSB7IHJldHVybiB0eXBlIGluc3RhbmNlb2YgVHlwZTsgfSkpIHtcbiAgICB0aHJvdyBuZXcgWUFNTEV4Y2VwdGlvbignU3BlY2lmaWVkIGxpc3Qgb2YgWUFNTCB0eXBlcyAob3IgYSBzaW5nbGUgVHlwZSBvYmplY3QpIGNvbnRhaW5zIGEgbm9uLVR5cGUgb2JqZWN0LicpO1xuICB9XG5cbiAgcmV0dXJuIG5ldyBTY2hlbWEoe1xuICAgIGluY2x1ZGU6IHNjaGVtYXMsXG4gICAgZXhwbGljaXQ6IHR5cGVzXG4gIH0pO1xufTtcblxuXG5tb2R1bGUuZXhwb3J0cyA9IFNjaGVtYTtcbiIsIi8vIFN0YW5kYXJkIFlBTUwncyBDb3JlIHNjaGVtYS5cbi8vIGh0dHA6Ly93d3cueWFtbC5vcmcvc3BlYy8xLjIvc3BlYy5odG1sI2lkMjgwNDkyM1xuLy9cbi8vIE5PVEU6IEpTLVlBTUwgZG9lcyBub3Qgc3VwcG9ydCBzY2hlbWEtc3BlY2lmaWMgdGFnIHJlc29sdXRpb24gcmVzdHJpY3Rpb25zLlxuLy8gU28sIENvcmUgc2NoZW1hIGhhcyBubyBkaXN0aW5jdGlvbnMgZnJvbSBKU09OIHNjaGVtYSBpcyBKUy1ZQU1MLlxuXG5cbid1c2Ugc3RyaWN0JztcblxuXG52YXIgU2NoZW1hID0gcmVxdWlyZSgnLi4vc2NoZW1hJyk7XG5cblxubW9kdWxlLmV4cG9ydHMgPSBuZXcgU2NoZW1hKHtcbiAgaW5jbHVkZTogW1xuICAgIHJlcXVpcmUoJy4vanNvbicpXG4gIF1cbn0pO1xuIiwiLy8gSlMtWUFNTCdzIGRlZmF1bHQgc2NoZW1hIGZvciBgbG9hZGAgZnVuY3Rpb24uXG4vLyBJdCBpcyBub3QgZGVzY3JpYmVkIGluIHRoZSBZQU1MIHNwZWNpZmljYXRpb24uXG4vL1xuLy8gVGhpcyBzY2hlbWEgaXMgYmFzZWQgb24gSlMtWUFNTCdzIGRlZmF1bHQgc2FmZSBzY2hlbWEgYW5kIGluY2x1ZGVzXG4vLyBKYXZhU2NyaXB0LXNwZWNpZmljIHR5cGVzOiAhIWpzL3VuZGVmaW5lZCwgISFqcy9yZWdleHAgYW5kICEhanMvZnVuY3Rpb24uXG4vL1xuLy8gQWxzbyB0aGlzIHNjaGVtYSBpcyB1c2VkIGFzIGRlZmF1bHQgYmFzZSBzY2hlbWEgYXQgYFNjaGVtYS5jcmVhdGVgIGZ1bmN0aW9uLlxuXG5cbid1c2Ugc3RyaWN0JztcblxuXG52YXIgU2NoZW1hID0gcmVxdWlyZSgnLi4vc2NoZW1hJyk7XG5cblxubW9kdWxlLmV4cG9ydHMgPSBTY2hlbWEuREVGQVVMVCA9IG5ldyBTY2hlbWEoe1xuICBpbmNsdWRlOiBbXG4gICAgcmVxdWlyZSgnLi9kZWZhdWx0X3NhZmUnKVxuICBdLFxuICBleHBsaWNpdDogW1xuICAgIHJlcXVpcmUoJy4uL3R5cGUvanMvdW5kZWZpbmVkJyksXG4gICAgcmVxdWlyZSgnLi4vdHlwZS9qcy9yZWdleHAnKSxcbiAgICByZXF1aXJlKCcuLi90eXBlL2pzL2Z1bmN0aW9uJylcbiAgXVxufSk7XG4iLCIvLyBKUy1ZQU1MJ3MgZGVmYXVsdCBzY2hlbWEgZm9yIGBzYWZlTG9hZGAgZnVuY3Rpb24uXG4vLyBJdCBpcyBub3QgZGVzY3JpYmVkIGluIHRoZSBZQU1MIHNwZWNpZmljYXRpb24uXG4vL1xuLy8gVGhpcyBzY2hlbWEgaXMgYmFzZWQgb24gc3RhbmRhcmQgWUFNTCdzIENvcmUgc2NoZW1hIGFuZCBpbmNsdWRlcyBtb3N0IG9mXG4vLyBleHRyYSB0eXBlcyBkZXNjcmliZWQgYXQgWUFNTCB0YWcgcmVwb3NpdG9yeS4gKGh0dHA6Ly95YW1sLm9yZy90eXBlLylcblxuXG4ndXNlIHN0cmljdCc7XG5cblxudmFyIFNjaGVtYSA9IHJlcXVpcmUoJy4uL3NjaGVtYScpO1xuXG5cbm1vZHVsZS5leHBvcnRzID0gbmV3IFNjaGVtYSh7XG4gIGluY2x1ZGU6IFtcbiAgICByZXF1aXJlKCcuL2NvcmUnKVxuICBdLFxuICBpbXBsaWNpdDogW1xuICAgIHJlcXVpcmUoJy4uL3R5cGUvdGltZXN0YW1wJyksXG4gICAgcmVxdWlyZSgnLi4vdHlwZS9tZXJnZScpXG4gIF0sXG4gIGV4cGxpY2l0OiBbXG4gICAgcmVxdWlyZSgnLi4vdHlwZS9iaW5hcnknKSxcbiAgICByZXF1aXJlKCcuLi90eXBlL29tYXAnKSxcbiAgICByZXF1aXJlKCcuLi90eXBlL3BhaXJzJyksXG4gICAgcmVxdWlyZSgnLi4vdHlwZS9zZXQnKVxuICBdXG59KTtcbiIsIi8vIFN0YW5kYXJkIFlBTUwncyBGYWlsc2FmZSBzY2hlbWEuXG4vLyBodHRwOi8vd3d3LnlhbWwub3JnL3NwZWMvMS4yL3NwZWMuaHRtbCNpZDI4MDIzNDZcblxuXG4ndXNlIHN0cmljdCc7XG5cblxudmFyIFNjaGVtYSA9IHJlcXVpcmUoJy4uL3NjaGVtYScpO1xuXG5cbm1vZHVsZS5leHBvcnRzID0gbmV3IFNjaGVtYSh7XG4gIGV4cGxpY2l0OiBbXG4gICAgcmVxdWlyZSgnLi4vdHlwZS9zdHInKSxcbiAgICByZXF1aXJlKCcuLi90eXBlL3NlcScpLFxuICAgIHJlcXVpcmUoJy4uL3R5cGUvbWFwJylcbiAgXVxufSk7XG4iLCIvLyBTdGFuZGFyZCBZQU1MJ3MgSlNPTiBzY2hlbWEuXG4vLyBodHRwOi8vd3d3LnlhbWwub3JnL3NwZWMvMS4yL3NwZWMuaHRtbCNpZDI4MDMyMzFcbi8vXG4vLyBOT1RFOiBKUy1ZQU1MIGRvZXMgbm90IHN1cHBvcnQgc2NoZW1hLXNwZWNpZmljIHRhZyByZXNvbHV0aW9uIHJlc3RyaWN0aW9ucy5cbi8vIFNvLCB0aGlzIHNjaGVtYSBpcyBub3Qgc3VjaCBzdHJpY3QgYXMgZGVmaW5lZCBpbiB0aGUgWUFNTCBzcGVjaWZpY2F0aW9uLlxuLy8gSXQgYWxsb3dzIG51bWJlcnMgaW4gYmluYXJ5IG5vdGFpb24sIHVzZSBgTnVsbGAgYW5kIGBOVUxMYCBhcyBgbnVsbGAsIGV0Yy5cblxuXG4ndXNlIHN0cmljdCc7XG5cblxudmFyIFNjaGVtYSA9IHJlcXVpcmUoJy4uL3NjaGVtYScpO1xuXG5cbm1vZHVsZS5leHBvcnRzID0gbmV3IFNjaGVtYSh7XG4gIGluY2x1ZGU6IFtcbiAgICByZXF1aXJlKCcuL2ZhaWxzYWZlJylcbiAgXSxcbiAgaW1wbGljaXQ6IFtcbiAgICByZXF1aXJlKCcuLi90eXBlL251bGwnKSxcbiAgICByZXF1aXJlKCcuLi90eXBlL2Jvb2wnKSxcbiAgICByZXF1aXJlKCcuLi90eXBlL2ludCcpLFxuICAgIHJlcXVpcmUoJy4uL3R5cGUvZmxvYXQnKVxuICBdXG59KTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIFlBTUxFeGNlcHRpb24gPSByZXF1aXJlKCcuL2V4Y2VwdGlvbicpO1xuXG52YXIgVFlQRV9DT05TVFJVQ1RPUl9PUFRJT05TID0gW1xuICAna2luZCcsXG4gICdyZXNvbHZlJyxcbiAgJ2NvbnN0cnVjdCcsXG4gICdpbnN0YW5jZU9mJyxcbiAgJ3ByZWRpY2F0ZScsXG4gICdyZXByZXNlbnQnLFxuICAnZGVmYXVsdFN0eWxlJyxcbiAgJ3N0eWxlQWxpYXNlcydcbl07XG5cbnZhciBZQU1MX05PREVfS0lORFMgPSBbXG4gICdzY2FsYXInLFxuICAnc2VxdWVuY2UnLFxuICAnbWFwcGluZydcbl07XG5cbmZ1bmN0aW9uIGNvbXBpbGVTdHlsZUFsaWFzZXMobWFwKSB7XG4gIHZhciByZXN1bHQgPSB7fTtcblxuICBpZiAobWFwICE9PSBudWxsKSB7XG4gICAgT2JqZWN0LmtleXMobWFwKS5mb3JFYWNoKGZ1bmN0aW9uIChzdHlsZSkge1xuICAgICAgbWFwW3N0eWxlXS5mb3JFYWNoKGZ1bmN0aW9uIChhbGlhcykge1xuICAgICAgICByZXN1bHRbU3RyaW5nKGFsaWFzKV0gPSBzdHlsZTtcbiAgICAgIH0pO1xuICAgIH0pO1xuICB9XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZnVuY3Rpb24gVHlwZSh0YWcsIG9wdGlvbnMpIHtcbiAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG5cbiAgT2JqZWN0LmtleXMob3B0aW9ucykuZm9yRWFjaChmdW5jdGlvbiAobmFtZSkge1xuICAgIGlmIChUWVBFX0NPTlNUUlVDVE9SX09QVElPTlMuaW5kZXhPZihuYW1lKSA9PT0gLTEpIHtcbiAgICAgIHRocm93IG5ldyBZQU1MRXhjZXB0aW9uKCdVbmtub3duIG9wdGlvbiBcIicgKyBuYW1lICsgJ1wiIGlzIG1ldCBpbiBkZWZpbml0aW9uIG9mIFwiJyArIHRhZyArICdcIiBZQU1MIHR5cGUuJyk7XG4gICAgfVxuICB9KTtcblxuICAvLyBUT0RPOiBBZGQgdGFnIGZvcm1hdCBjaGVjay5cbiAgdGhpcy50YWcgICAgICAgICAgPSB0YWc7XG4gIHRoaXMua2luZCAgICAgICAgID0gb3B0aW9uc1sna2luZCddICAgICAgICAgfHwgbnVsbDtcbiAgdGhpcy5yZXNvbHZlICAgICAgPSBvcHRpb25zWydyZXNvbHZlJ10gICAgICB8fCBmdW5jdGlvbiAoKSB7IHJldHVybiB0cnVlOyB9O1xuICB0aGlzLmNvbnN0cnVjdCAgICA9IG9wdGlvbnNbJ2NvbnN0cnVjdCddICAgIHx8IGZ1bmN0aW9uIChkYXRhKSB7IHJldHVybiBkYXRhOyB9O1xuICB0aGlzLmluc3RhbmNlT2YgICA9IG9wdGlvbnNbJ2luc3RhbmNlT2YnXSAgIHx8IG51bGw7XG4gIHRoaXMucHJlZGljYXRlICAgID0gb3B0aW9uc1sncHJlZGljYXRlJ10gICAgfHwgbnVsbDtcbiAgdGhpcy5yZXByZXNlbnQgICAgPSBvcHRpb25zWydyZXByZXNlbnQnXSAgICB8fCBudWxsO1xuICB0aGlzLmRlZmF1bHRTdHlsZSA9IG9wdGlvbnNbJ2RlZmF1bHRTdHlsZSddIHx8IG51bGw7XG4gIHRoaXMuc3R5bGVBbGlhc2VzID0gY29tcGlsZVN0eWxlQWxpYXNlcyhvcHRpb25zWydzdHlsZUFsaWFzZXMnXSB8fCBudWxsKTtcblxuICBpZiAoWUFNTF9OT0RFX0tJTkRTLmluZGV4T2YodGhpcy5raW5kKSA9PT0gLTEpIHtcbiAgICB0aHJvdyBuZXcgWUFNTEV4Y2VwdGlvbignVW5rbm93biBraW5kIFwiJyArIHRoaXMua2luZCArICdcIiBpcyBzcGVjaWZpZWQgZm9yIFwiJyArIHRhZyArICdcIiBZQU1MIHR5cGUuJyk7XG4gIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSBUeXBlO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG4vKmVzbGludC1kaXNhYmxlIG5vLWJpdHdpc2UqL1xuXG4vLyBBIHRyaWNrIGZvciBicm93c2VyaWZpZWQgdmVyc2lvbi5cbi8vIFNpbmNlIHdlIG1ha2UgYnJvd3NlcmlmaWVyIHRvIGlnbm9yZSBgYnVmZmVyYCBtb2R1bGUsIE5vZGVCdWZmZXIgd2lsbCBiZSB1bmRlZmluZWRcbnZhciBOb2RlQnVmZmVyID0gcmVxdWlyZSgnYnVmZmVyJykuQnVmZmVyO1xudmFyIFR5cGUgICAgICAgPSByZXF1aXJlKCcuLi90eXBlJyk7XG5cblxuLy8gWyA2NCwgNjUsIDY2IF0gLT4gWyBwYWRkaW5nLCBDUiwgTEYgXVxudmFyIEJBU0U2NF9NQVAgPSAnQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLz1cXG5cXHInO1xuXG5cbmZ1bmN0aW9uIHJlc29sdmVZYW1sQmluYXJ5KGRhdGEpIHtcbiAgaWYgKGRhdGEgPT09IG51bGwpIHJldHVybiBmYWxzZTtcblxuICB2YXIgY29kZSwgaWR4LCBiaXRsZW4gPSAwLCBtYXggPSBkYXRhLmxlbmd0aCwgbWFwID0gQkFTRTY0X01BUDtcblxuICAvLyBDb252ZXJ0IG9uZSBieSBvbmUuXG4gIGZvciAoaWR4ID0gMDsgaWR4IDwgbWF4OyBpZHgrKykge1xuICAgIGNvZGUgPSBtYXAuaW5kZXhPZihkYXRhLmNoYXJBdChpZHgpKTtcblxuICAgIC8vIFNraXAgQ1IvTEZcbiAgICBpZiAoY29kZSA+IDY0KSBjb250aW51ZTtcblxuICAgIC8vIEZhaWwgb24gaWxsZWdhbCBjaGFyYWN0ZXJzXG4gICAgaWYgKGNvZGUgPCAwKSByZXR1cm4gZmFsc2U7XG5cbiAgICBiaXRsZW4gKz0gNjtcbiAgfVxuXG4gIC8vIElmIHRoZXJlIGFyZSBhbnkgYml0cyBsZWZ0LCBzb3VyY2Ugd2FzIGNvcnJ1cHRlZFxuICByZXR1cm4gKGJpdGxlbiAlIDgpID09PSAwO1xufVxuXG5mdW5jdGlvbiBjb25zdHJ1Y3RZYW1sQmluYXJ5KGRhdGEpIHtcbiAgdmFyIGlkeCwgdGFpbGJpdHMsXG4gICAgICBpbnB1dCA9IGRhdGEucmVwbGFjZSgvW1xcclxcbj1dL2csICcnKSwgLy8gcmVtb3ZlIENSL0xGICYgcGFkZGluZyB0byBzaW1wbGlmeSBzY2FuXG4gICAgICBtYXggPSBpbnB1dC5sZW5ndGgsXG4gICAgICBtYXAgPSBCQVNFNjRfTUFQLFxuICAgICAgYml0cyA9IDAsXG4gICAgICByZXN1bHQgPSBbXTtcblxuICAvLyBDb2xsZWN0IGJ5IDYqNCBiaXRzICgzIGJ5dGVzKVxuXG4gIGZvciAoaWR4ID0gMDsgaWR4IDwgbWF4OyBpZHgrKykge1xuICAgIGlmICgoaWR4ICUgNCA9PT0gMCkgJiYgaWR4KSB7XG4gICAgICByZXN1bHQucHVzaCgoYml0cyA+PiAxNikgJiAweEZGKTtcbiAgICAgIHJlc3VsdC5wdXNoKChiaXRzID4+IDgpICYgMHhGRik7XG4gICAgICByZXN1bHQucHVzaChiaXRzICYgMHhGRik7XG4gICAgfVxuXG4gICAgYml0cyA9IChiaXRzIDw8IDYpIHwgbWFwLmluZGV4T2YoaW5wdXQuY2hhckF0KGlkeCkpO1xuICB9XG5cbiAgLy8gRHVtcCB0YWlsXG5cbiAgdGFpbGJpdHMgPSAobWF4ICUgNCkgKiA2O1xuXG4gIGlmICh0YWlsYml0cyA9PT0gMCkge1xuICAgIHJlc3VsdC5wdXNoKChiaXRzID4+IDE2KSAmIDB4RkYpO1xuICAgIHJlc3VsdC5wdXNoKChiaXRzID4+IDgpICYgMHhGRik7XG4gICAgcmVzdWx0LnB1c2goYml0cyAmIDB4RkYpO1xuICB9IGVsc2UgaWYgKHRhaWxiaXRzID09PSAxOCkge1xuICAgIHJlc3VsdC5wdXNoKChiaXRzID4+IDEwKSAmIDB4RkYpO1xuICAgIHJlc3VsdC5wdXNoKChiaXRzID4+IDIpICYgMHhGRik7XG4gIH0gZWxzZSBpZiAodGFpbGJpdHMgPT09IDEyKSB7XG4gICAgcmVzdWx0LnB1c2goKGJpdHMgPj4gNCkgJiAweEZGKTtcbiAgfVxuXG4gIC8vIFdyYXAgaW50byBCdWZmZXIgZm9yIE5vZGVKUyBhbmQgbGVhdmUgQXJyYXkgZm9yIGJyb3dzZXJcbiAgaWYgKE5vZGVCdWZmZXIpIHJldHVybiBuZXcgTm9kZUJ1ZmZlcihyZXN1bHQpO1xuXG4gIHJldHVybiByZXN1bHQ7XG59XG5cbmZ1bmN0aW9uIHJlcHJlc2VudFlhbWxCaW5hcnkob2JqZWN0IC8qLCBzdHlsZSovKSB7XG4gIHZhciByZXN1bHQgPSAnJywgYml0cyA9IDAsIGlkeCwgdGFpbCxcbiAgICAgIG1heCA9IG9iamVjdC5sZW5ndGgsXG4gICAgICBtYXAgPSBCQVNFNjRfTUFQO1xuXG4gIC8vIENvbnZlcnQgZXZlcnkgdGhyZWUgYnl0ZXMgdG8gNCBBU0NJSSBjaGFyYWN0ZXJzLlxuXG4gIGZvciAoaWR4ID0gMDsgaWR4IDwgbWF4OyBpZHgrKykge1xuICAgIGlmICgoaWR4ICUgMyA9PT0gMCkgJiYgaWR4KSB7XG4gICAgICByZXN1bHQgKz0gbWFwWyhiaXRzID4+IDE4KSAmIDB4M0ZdO1xuICAgICAgcmVzdWx0ICs9IG1hcFsoYml0cyA+PiAxMikgJiAweDNGXTtcbiAgICAgIHJlc3VsdCArPSBtYXBbKGJpdHMgPj4gNikgJiAweDNGXTtcbiAgICAgIHJlc3VsdCArPSBtYXBbYml0cyAmIDB4M0ZdO1xuICAgIH1cblxuICAgIGJpdHMgPSAoYml0cyA8PCA4KSArIG9iamVjdFtpZHhdO1xuICB9XG5cbiAgLy8gRHVtcCB0YWlsXG5cbiAgdGFpbCA9IG1heCAlIDM7XG5cbiAgaWYgKHRhaWwgPT09IDApIHtcbiAgICByZXN1bHQgKz0gbWFwWyhiaXRzID4+IDE4KSAmIDB4M0ZdO1xuICAgIHJlc3VsdCArPSBtYXBbKGJpdHMgPj4gMTIpICYgMHgzRl07XG4gICAgcmVzdWx0ICs9IG1hcFsoYml0cyA+PiA2KSAmIDB4M0ZdO1xuICAgIHJlc3VsdCArPSBtYXBbYml0cyAmIDB4M0ZdO1xuICB9IGVsc2UgaWYgKHRhaWwgPT09IDIpIHtcbiAgICByZXN1bHQgKz0gbWFwWyhiaXRzID4+IDEwKSAmIDB4M0ZdO1xuICAgIHJlc3VsdCArPSBtYXBbKGJpdHMgPj4gNCkgJiAweDNGXTtcbiAgICByZXN1bHQgKz0gbWFwWyhiaXRzIDw8IDIpICYgMHgzRl07XG4gICAgcmVzdWx0ICs9IG1hcFs2NF07XG4gIH0gZWxzZSBpZiAodGFpbCA9PT0gMSkge1xuICAgIHJlc3VsdCArPSBtYXBbKGJpdHMgPj4gMikgJiAweDNGXTtcbiAgICByZXN1bHQgKz0gbWFwWyhiaXRzIDw8IDQpICYgMHgzRl07XG4gICAgcmVzdWx0ICs9IG1hcFs2NF07XG4gICAgcmVzdWx0ICs9IG1hcFs2NF07XG4gIH1cblxuICByZXR1cm4gcmVzdWx0O1xufVxuXG5mdW5jdGlvbiBpc0JpbmFyeShvYmplY3QpIHtcbiAgcmV0dXJuIE5vZGVCdWZmZXIgJiYgTm9kZUJ1ZmZlci5pc0J1ZmZlcihvYmplY3QpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IG5ldyBUeXBlKCd0YWc6eWFtbC5vcmcsMjAwMjpiaW5hcnknLCB7XG4gIGtpbmQ6ICdzY2FsYXInLFxuICByZXNvbHZlOiByZXNvbHZlWWFtbEJpbmFyeSxcbiAgY29uc3RydWN0OiBjb25zdHJ1Y3RZYW1sQmluYXJ5LFxuICBwcmVkaWNhdGU6IGlzQmluYXJ5LFxuICByZXByZXNlbnQ6IHJlcHJlc2VudFlhbWxCaW5hcnlcbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgVHlwZSA9IHJlcXVpcmUoJy4uL3R5cGUnKTtcblxuZnVuY3Rpb24gcmVzb2x2ZVlhbWxCb29sZWFuKGRhdGEpIHtcbiAgaWYgKGRhdGEgPT09IG51bGwpIHJldHVybiBmYWxzZTtcblxuICB2YXIgbWF4ID0gZGF0YS5sZW5ndGg7XG5cbiAgcmV0dXJuIChtYXggPT09IDQgJiYgKGRhdGEgPT09ICd0cnVlJyB8fCBkYXRhID09PSAnVHJ1ZScgfHwgZGF0YSA9PT0gJ1RSVUUnKSkgfHxcbiAgICAgICAgIChtYXggPT09IDUgJiYgKGRhdGEgPT09ICdmYWxzZScgfHwgZGF0YSA9PT0gJ0ZhbHNlJyB8fCBkYXRhID09PSAnRkFMU0UnKSk7XG59XG5cbmZ1bmN0aW9uIGNvbnN0cnVjdFlhbWxCb29sZWFuKGRhdGEpIHtcbiAgcmV0dXJuIGRhdGEgPT09ICd0cnVlJyB8fFxuICAgICAgICAgZGF0YSA9PT0gJ1RydWUnIHx8XG4gICAgICAgICBkYXRhID09PSAnVFJVRSc7XG59XG5cbmZ1bmN0aW9uIGlzQm9vbGVhbihvYmplY3QpIHtcbiAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvYmplY3QpID09PSAnW29iamVjdCBCb29sZWFuXSc7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gbmV3IFR5cGUoJ3RhZzp5YW1sLm9yZywyMDAyOmJvb2wnLCB7XG4gIGtpbmQ6ICdzY2FsYXInLFxuICByZXNvbHZlOiByZXNvbHZlWWFtbEJvb2xlYW4sXG4gIGNvbnN0cnVjdDogY29uc3RydWN0WWFtbEJvb2xlYW4sXG4gIHByZWRpY2F0ZTogaXNCb29sZWFuLFxuICByZXByZXNlbnQ6IHtcbiAgICBsb3dlcmNhc2U6IGZ1bmN0aW9uIChvYmplY3QpIHsgcmV0dXJuIG9iamVjdCA/ICd0cnVlJyA6ICdmYWxzZSc7IH0sXG4gICAgdXBwZXJjYXNlOiBmdW5jdGlvbiAob2JqZWN0KSB7IHJldHVybiBvYmplY3QgPyAnVFJVRScgOiAnRkFMU0UnOyB9LFxuICAgIGNhbWVsY2FzZTogZnVuY3Rpb24gKG9iamVjdCkgeyByZXR1cm4gb2JqZWN0ID8gJ1RydWUnIDogJ0ZhbHNlJzsgfVxuICB9LFxuICBkZWZhdWx0U3R5bGU6ICdsb3dlcmNhc2UnXG59KTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIGNvbW1vbiA9IHJlcXVpcmUoJy4uL2NvbW1vbicpO1xudmFyIFR5cGUgICA9IHJlcXVpcmUoJy4uL3R5cGUnKTtcblxudmFyIFlBTUxfRkxPQVRfUEFUVEVSTiA9IG5ldyBSZWdFeHAoXG4gICdeKD86Wy0rXT8oPzpbMC05XVswLTlfXSopXFxcXC5bMC05X10qKD86W2VFXVstK11bMC05XSspPycgK1xuICAnfFxcXFwuWzAtOV9dKyg/OltlRV1bLStdWzAtOV0rKT8nICtcbiAgJ3xbLStdP1swLTldWzAtOV9dKig/OjpbMC01XT9bMC05XSkrXFxcXC5bMC05X10qJyArXG4gICd8Wy0rXT9cXFxcLig/OmluZnxJbmZ8SU5GKScgK1xuICAnfFxcXFwuKD86bmFufE5hTnxOQU4pKSQnKTtcblxuZnVuY3Rpb24gcmVzb2x2ZVlhbWxGbG9hdChkYXRhKSB7XG4gIGlmIChkYXRhID09PSBudWxsKSByZXR1cm4gZmFsc2U7XG5cbiAgaWYgKCFZQU1MX0ZMT0FUX1BBVFRFUk4udGVzdChkYXRhKSkgcmV0dXJuIGZhbHNlO1xuXG4gIHJldHVybiB0cnVlO1xufVxuXG5mdW5jdGlvbiBjb25zdHJ1Y3RZYW1sRmxvYXQoZGF0YSkge1xuICB2YXIgdmFsdWUsIHNpZ24sIGJhc2UsIGRpZ2l0cztcblxuICB2YWx1ZSAgPSBkYXRhLnJlcGxhY2UoL18vZywgJycpLnRvTG93ZXJDYXNlKCk7XG4gIHNpZ24gICA9IHZhbHVlWzBdID09PSAnLScgPyAtMSA6IDE7XG4gIGRpZ2l0cyA9IFtdO1xuXG4gIGlmICgnKy0nLmluZGV4T2YodmFsdWVbMF0pID49IDApIHtcbiAgICB2YWx1ZSA9IHZhbHVlLnNsaWNlKDEpO1xuICB9XG5cbiAgaWYgKHZhbHVlID09PSAnLmluZicpIHtcbiAgICByZXR1cm4gKHNpZ24gPT09IDEpID8gTnVtYmVyLlBPU0lUSVZFX0lORklOSVRZIDogTnVtYmVyLk5FR0FUSVZFX0lORklOSVRZO1xuXG4gIH0gZWxzZSBpZiAodmFsdWUgPT09ICcubmFuJykge1xuICAgIHJldHVybiBOYU47XG5cbiAgfSBlbHNlIGlmICh2YWx1ZS5pbmRleE9mKCc6JykgPj0gMCkge1xuICAgIHZhbHVlLnNwbGl0KCc6JykuZm9yRWFjaChmdW5jdGlvbiAodikge1xuICAgICAgZGlnaXRzLnVuc2hpZnQocGFyc2VGbG9hdCh2LCAxMCkpO1xuICAgIH0pO1xuXG4gICAgdmFsdWUgPSAwLjA7XG4gICAgYmFzZSA9IDE7XG5cbiAgICBkaWdpdHMuZm9yRWFjaChmdW5jdGlvbiAoZCkge1xuICAgICAgdmFsdWUgKz0gZCAqIGJhc2U7XG4gICAgICBiYXNlICo9IDYwO1xuICAgIH0pO1xuXG4gICAgcmV0dXJuIHNpZ24gKiB2YWx1ZTtcblxuICB9XG4gIHJldHVybiBzaWduICogcGFyc2VGbG9hdCh2YWx1ZSwgMTApO1xufVxuXG5cbnZhciBTQ0lFTlRJRklDX1dJVEhPVVRfRE9UID0gL15bLStdP1swLTldK2UvO1xuXG5mdW5jdGlvbiByZXByZXNlbnRZYW1sRmxvYXQob2JqZWN0LCBzdHlsZSkge1xuICB2YXIgcmVzO1xuXG4gIGlmIChpc05hTihvYmplY3QpKSB7XG4gICAgc3dpdGNoIChzdHlsZSkge1xuICAgICAgY2FzZSAnbG93ZXJjYXNlJzogcmV0dXJuICcubmFuJztcbiAgICAgIGNhc2UgJ3VwcGVyY2FzZSc6IHJldHVybiAnLk5BTic7XG4gICAgICBjYXNlICdjYW1lbGNhc2UnOiByZXR1cm4gJy5OYU4nO1xuICAgIH1cbiAgfSBlbHNlIGlmIChOdW1iZXIuUE9TSVRJVkVfSU5GSU5JVFkgPT09IG9iamVjdCkge1xuICAgIHN3aXRjaCAoc3R5bGUpIHtcbiAgICAgIGNhc2UgJ2xvd2VyY2FzZSc6IHJldHVybiAnLmluZic7XG4gICAgICBjYXNlICd1cHBlcmNhc2UnOiByZXR1cm4gJy5JTkYnO1xuICAgICAgY2FzZSAnY2FtZWxjYXNlJzogcmV0dXJuICcuSW5mJztcbiAgICB9XG4gIH0gZWxzZSBpZiAoTnVtYmVyLk5FR0FUSVZFX0lORklOSVRZID09PSBvYmplY3QpIHtcbiAgICBzd2l0Y2ggKHN0eWxlKSB7XG4gICAgICBjYXNlICdsb3dlcmNhc2UnOiByZXR1cm4gJy0uaW5mJztcbiAgICAgIGNhc2UgJ3VwcGVyY2FzZSc6IHJldHVybiAnLS5JTkYnO1xuICAgICAgY2FzZSAnY2FtZWxjYXNlJzogcmV0dXJuICctLkluZic7XG4gICAgfVxuICB9IGVsc2UgaWYgKGNvbW1vbi5pc05lZ2F0aXZlWmVybyhvYmplY3QpKSB7XG4gICAgcmV0dXJuICctMC4wJztcbiAgfVxuXG4gIHJlcyA9IG9iamVjdC50b1N0cmluZygxMCk7XG5cbiAgLy8gSlMgc3RyaW5naWZpZXIgY2FuIGJ1aWxkIHNjaWVudGlmaWMgZm9ybWF0IHdpdGhvdXQgZG90czogNWUtMTAwLFxuICAvLyB3aGlsZSBZQU1MIHJlcXVyZXMgZG90OiA1LmUtMTAwLiBGaXggaXQgd2l0aCBzaW1wbGUgaGFja1xuXG4gIHJldHVybiBTQ0lFTlRJRklDX1dJVEhPVVRfRE9ULnRlc3QocmVzKSA/IHJlcy5yZXBsYWNlKCdlJywgJy5lJykgOiByZXM7XG59XG5cbmZ1bmN0aW9uIGlzRmxvYXQob2JqZWN0KSB7XG4gIHJldHVybiAoT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG9iamVjdCkgPT09ICdbb2JqZWN0IE51bWJlcl0nKSAmJlxuICAgICAgICAgKG9iamVjdCAlIDEgIT09IDAgfHwgY29tbW9uLmlzTmVnYXRpdmVaZXJvKG9iamVjdCkpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IG5ldyBUeXBlKCd0YWc6eWFtbC5vcmcsMjAwMjpmbG9hdCcsIHtcbiAga2luZDogJ3NjYWxhcicsXG4gIHJlc29sdmU6IHJlc29sdmVZYW1sRmxvYXQsXG4gIGNvbnN0cnVjdDogY29uc3RydWN0WWFtbEZsb2F0LFxuICBwcmVkaWNhdGU6IGlzRmxvYXQsXG4gIHJlcHJlc2VudDogcmVwcmVzZW50WWFtbEZsb2F0LFxuICBkZWZhdWx0U3R5bGU6ICdsb3dlcmNhc2UnXG59KTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIGNvbW1vbiA9IHJlcXVpcmUoJy4uL2NvbW1vbicpO1xudmFyIFR5cGUgICA9IHJlcXVpcmUoJy4uL3R5cGUnKTtcblxuZnVuY3Rpb24gaXNIZXhDb2RlKGMpIHtcbiAgcmV0dXJuICgoMHgzMC8qIDAgKi8gPD0gYykgJiYgKGMgPD0gMHgzOS8qIDkgKi8pKSB8fFxuICAgICAgICAgKCgweDQxLyogQSAqLyA8PSBjKSAmJiAoYyA8PSAweDQ2LyogRiAqLykpIHx8XG4gICAgICAgICAoKDB4NjEvKiBhICovIDw9IGMpICYmIChjIDw9IDB4NjYvKiBmICovKSk7XG59XG5cbmZ1bmN0aW9uIGlzT2N0Q29kZShjKSB7XG4gIHJldHVybiAoKDB4MzAvKiAwICovIDw9IGMpICYmIChjIDw9IDB4MzcvKiA3ICovKSk7XG59XG5cbmZ1bmN0aW9uIGlzRGVjQ29kZShjKSB7XG4gIHJldHVybiAoKDB4MzAvKiAwICovIDw9IGMpICYmIChjIDw9IDB4MzkvKiA5ICovKSk7XG59XG5cbmZ1bmN0aW9uIHJlc29sdmVZYW1sSW50ZWdlcihkYXRhKSB7XG4gIGlmIChkYXRhID09PSBudWxsKSByZXR1cm4gZmFsc2U7XG5cbiAgdmFyIG1heCA9IGRhdGEubGVuZ3RoLFxuICAgICAgaW5kZXggPSAwLFxuICAgICAgaGFzRGlnaXRzID0gZmFsc2UsXG4gICAgICBjaDtcblxuICBpZiAoIW1heCkgcmV0dXJuIGZhbHNlO1xuXG4gIGNoID0gZGF0YVtpbmRleF07XG5cbiAgLy8gc2lnblxuICBpZiAoY2ggPT09ICctJyB8fCBjaCA9PT0gJysnKSB7XG4gICAgY2ggPSBkYXRhWysraW5kZXhdO1xuICB9XG5cbiAgaWYgKGNoID09PSAnMCcpIHtcbiAgICAvLyAwXG4gICAgaWYgKGluZGV4ICsgMSA9PT0gbWF4KSByZXR1cm4gdHJ1ZTtcbiAgICBjaCA9IGRhdGFbKytpbmRleF07XG5cbiAgICAvLyBiYXNlIDIsIGJhc2UgOCwgYmFzZSAxNlxuXG4gICAgaWYgKGNoID09PSAnYicpIHtcbiAgICAgIC8vIGJhc2UgMlxuICAgICAgaW5kZXgrKztcblxuICAgICAgZm9yICg7IGluZGV4IDwgbWF4OyBpbmRleCsrKSB7XG4gICAgICAgIGNoID0gZGF0YVtpbmRleF07XG4gICAgICAgIGlmIChjaCA9PT0gJ18nKSBjb250aW51ZTtcbiAgICAgICAgaWYgKGNoICE9PSAnMCcgJiYgY2ggIT09ICcxJykgcmV0dXJuIGZhbHNlO1xuICAgICAgICBoYXNEaWdpdHMgPSB0cnVlO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGhhc0RpZ2l0cztcbiAgICB9XG5cblxuICAgIGlmIChjaCA9PT0gJ3gnKSB7XG4gICAgICAvLyBiYXNlIDE2XG4gICAgICBpbmRleCsrO1xuXG4gICAgICBmb3IgKDsgaW5kZXggPCBtYXg7IGluZGV4KyspIHtcbiAgICAgICAgY2ggPSBkYXRhW2luZGV4XTtcbiAgICAgICAgaWYgKGNoID09PSAnXycpIGNvbnRpbnVlO1xuICAgICAgICBpZiAoIWlzSGV4Q29kZShkYXRhLmNoYXJDb2RlQXQoaW5kZXgpKSkgcmV0dXJuIGZhbHNlO1xuICAgICAgICBoYXNEaWdpdHMgPSB0cnVlO1xuICAgICAgfVxuICAgICAgcmV0dXJuIGhhc0RpZ2l0cztcbiAgICB9XG5cbiAgICAvLyBiYXNlIDhcbiAgICBmb3IgKDsgaW5kZXggPCBtYXg7IGluZGV4KyspIHtcbiAgICAgIGNoID0gZGF0YVtpbmRleF07XG4gICAgICBpZiAoY2ggPT09ICdfJykgY29udGludWU7XG4gICAgICBpZiAoIWlzT2N0Q29kZShkYXRhLmNoYXJDb2RlQXQoaW5kZXgpKSkgcmV0dXJuIGZhbHNlO1xuICAgICAgaGFzRGlnaXRzID0gdHJ1ZTtcbiAgICB9XG4gICAgcmV0dXJuIGhhc0RpZ2l0cztcbiAgfVxuXG4gIC8vIGJhc2UgMTAgKGV4Y2VwdCAwKSBvciBiYXNlIDYwXG5cbiAgZm9yICg7IGluZGV4IDwgbWF4OyBpbmRleCsrKSB7XG4gICAgY2ggPSBkYXRhW2luZGV4XTtcbiAgICBpZiAoY2ggPT09ICdfJykgY29udGludWU7XG4gICAgaWYgKGNoID09PSAnOicpIGJyZWFrO1xuICAgIGlmICghaXNEZWNDb2RlKGRhdGEuY2hhckNvZGVBdChpbmRleCkpKSB7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGhhc0RpZ2l0cyA9IHRydWU7XG4gIH1cblxuICBpZiAoIWhhc0RpZ2l0cykgcmV0dXJuIGZhbHNlO1xuXG4gIC8vIGlmICFiYXNlNjAgLSBkb25lO1xuICBpZiAoY2ggIT09ICc6JykgcmV0dXJuIHRydWU7XG5cbiAgLy8gYmFzZTYwIGFsbW9zdCBub3QgdXNlZCwgbm8gbmVlZHMgdG8gb3B0aW1pemVcbiAgcmV0dXJuIC9eKDpbMC01XT9bMC05XSkrJC8udGVzdChkYXRhLnNsaWNlKGluZGV4KSk7XG59XG5cbmZ1bmN0aW9uIGNvbnN0cnVjdFlhbWxJbnRlZ2VyKGRhdGEpIHtcbiAgdmFyIHZhbHVlID0gZGF0YSwgc2lnbiA9IDEsIGNoLCBiYXNlLCBkaWdpdHMgPSBbXTtcblxuICBpZiAodmFsdWUuaW5kZXhPZignXycpICE9PSAtMSkge1xuICAgIHZhbHVlID0gdmFsdWUucmVwbGFjZSgvXy9nLCAnJyk7XG4gIH1cblxuICBjaCA9IHZhbHVlWzBdO1xuXG4gIGlmIChjaCA9PT0gJy0nIHx8IGNoID09PSAnKycpIHtcbiAgICBpZiAoY2ggPT09ICctJykgc2lnbiA9IC0xO1xuICAgIHZhbHVlID0gdmFsdWUuc2xpY2UoMSk7XG4gICAgY2ggPSB2YWx1ZVswXTtcbiAgfVxuXG4gIGlmICh2YWx1ZSA9PT0gJzAnKSByZXR1cm4gMDtcblxuICBpZiAoY2ggPT09ICcwJykge1xuICAgIGlmICh2YWx1ZVsxXSA9PT0gJ2InKSByZXR1cm4gc2lnbiAqIHBhcnNlSW50KHZhbHVlLnNsaWNlKDIpLCAyKTtcbiAgICBpZiAodmFsdWVbMV0gPT09ICd4JykgcmV0dXJuIHNpZ24gKiBwYXJzZUludCh2YWx1ZSwgMTYpO1xuICAgIHJldHVybiBzaWduICogcGFyc2VJbnQodmFsdWUsIDgpO1xuICB9XG5cbiAgaWYgKHZhbHVlLmluZGV4T2YoJzonKSAhPT0gLTEpIHtcbiAgICB2YWx1ZS5zcGxpdCgnOicpLmZvckVhY2goZnVuY3Rpb24gKHYpIHtcbiAgICAgIGRpZ2l0cy51bnNoaWZ0KHBhcnNlSW50KHYsIDEwKSk7XG4gICAgfSk7XG5cbiAgICB2YWx1ZSA9IDA7XG4gICAgYmFzZSA9IDE7XG5cbiAgICBkaWdpdHMuZm9yRWFjaChmdW5jdGlvbiAoZCkge1xuICAgICAgdmFsdWUgKz0gKGQgKiBiYXNlKTtcbiAgICAgIGJhc2UgKj0gNjA7XG4gICAgfSk7XG5cbiAgICByZXR1cm4gc2lnbiAqIHZhbHVlO1xuXG4gIH1cblxuICByZXR1cm4gc2lnbiAqIHBhcnNlSW50KHZhbHVlLCAxMCk7XG59XG5cbmZ1bmN0aW9uIGlzSW50ZWdlcihvYmplY3QpIHtcbiAgcmV0dXJuIChPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwob2JqZWN0KSkgPT09ICdbb2JqZWN0IE51bWJlcl0nICYmXG4gICAgICAgICAob2JqZWN0ICUgMSA9PT0gMCAmJiAhY29tbW9uLmlzTmVnYXRpdmVaZXJvKG9iamVjdCkpO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IG5ldyBUeXBlKCd0YWc6eWFtbC5vcmcsMjAwMjppbnQnLCB7XG4gIGtpbmQ6ICdzY2FsYXInLFxuICByZXNvbHZlOiByZXNvbHZlWWFtbEludGVnZXIsXG4gIGNvbnN0cnVjdDogY29uc3RydWN0WWFtbEludGVnZXIsXG4gIHByZWRpY2F0ZTogaXNJbnRlZ2VyLFxuICByZXByZXNlbnQ6IHtcbiAgICBiaW5hcnk6ICAgICAgZnVuY3Rpb24gKG9iamVjdCkgeyByZXR1cm4gJzBiJyArIG9iamVjdC50b1N0cmluZygyKTsgfSxcbiAgICBvY3RhbDogICAgICAgZnVuY3Rpb24gKG9iamVjdCkgeyByZXR1cm4gJzAnICArIG9iamVjdC50b1N0cmluZyg4KTsgfSxcbiAgICBkZWNpbWFsOiAgICAgZnVuY3Rpb24gKG9iamVjdCkgeyByZXR1cm4gICAgICAgIG9iamVjdC50b1N0cmluZygxMCk7IH0sXG4gICAgaGV4YWRlY2ltYWw6IGZ1bmN0aW9uIChvYmplY3QpIHsgcmV0dXJuICcweCcgKyBvYmplY3QudG9TdHJpbmcoMTYpLnRvVXBwZXJDYXNlKCk7IH1cbiAgfSxcbiAgZGVmYXVsdFN0eWxlOiAnZGVjaW1hbCcsXG4gIHN0eWxlQWxpYXNlczoge1xuICAgIGJpbmFyeTogICAgICBbIDIsICAnYmluJyBdLFxuICAgIG9jdGFsOiAgICAgICBbIDgsICAnb2N0JyBdLFxuICAgIGRlY2ltYWw6ICAgICBbIDEwLCAnZGVjJyBdLFxuICAgIGhleGFkZWNpbWFsOiBbIDE2LCAnaGV4JyBdXG4gIH1cbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgZXNwcmltYTtcblxuLy8gQnJvd3NlcmlmaWVkIHZlcnNpb24gZG9lcyBub3QgaGF2ZSBlc3ByaW1hXG4vL1xuLy8gMS4gRm9yIG5vZGUuanMganVzdCByZXF1aXJlIG1vZHVsZSBhcyBkZXBzXG4vLyAyLiBGb3IgYnJvd3NlciB0cnkgdG8gcmVxdWlyZSBtdWR1bGUgdmlhIGV4dGVybmFsIEFNRCBzeXN0ZW0uXG4vLyAgICBJZiBub3QgZm91bmQgLSB0cnkgdG8gZmFsbGJhY2sgdG8gd2luZG93LmVzcHJpbWEuIElmIG5vdFxuLy8gICAgZm91bmQgdG9vIC0gdGhlbiBmYWlsIHRvIHBhcnNlLlxuLy9cbnRyeSB7XG4gIC8vIHdvcmthcm91bmQgdG8gZXhjbHVkZSBwYWNrYWdlIGZyb20gYnJvd3NlcmlmeSBsaXN0LlxuICB2YXIgX3JlcXVpcmUgPSByZXF1aXJlO1xuICBlc3ByaW1hID0gX3JlcXVpcmUoJ2VzcHJpbWEnKTtcbn0gY2F0Y2ggKF8pIHtcbiAgLypnbG9iYWwgd2luZG93ICovXG4gIGlmICh0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJykgZXNwcmltYSA9IHdpbmRvdy5lc3ByaW1hO1xufVxuXG52YXIgVHlwZSA9IHJlcXVpcmUoJy4uLy4uL3R5cGUnKTtcblxuZnVuY3Rpb24gcmVzb2x2ZUphdmFzY3JpcHRGdW5jdGlvbihkYXRhKSB7XG4gIGlmIChkYXRhID09PSBudWxsKSByZXR1cm4gZmFsc2U7XG5cbiAgdHJ5IHtcbiAgICB2YXIgc291cmNlID0gJygnICsgZGF0YSArICcpJyxcbiAgICAgICAgYXN0ICAgID0gZXNwcmltYS5wYXJzZShzb3VyY2UsIHsgcmFuZ2U6IHRydWUgfSk7XG5cbiAgICBpZiAoYXN0LnR5cGUgICAgICAgICAgICAgICAgICAgICE9PSAnUHJvZ3JhbScgICAgICAgICAgICAgfHxcbiAgICAgICAgYXN0LmJvZHkubGVuZ3RoICAgICAgICAgICAgICE9PSAxICAgICAgICAgICAgICAgICAgICAgfHxcbiAgICAgICAgYXN0LmJvZHlbMF0udHlwZSAgICAgICAgICAgICE9PSAnRXhwcmVzc2lvblN0YXRlbWVudCcgfHxcbiAgICAgICAgYXN0LmJvZHlbMF0uZXhwcmVzc2lvbi50eXBlICE9PSAnRnVuY3Rpb25FeHByZXNzaW9uJykge1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIHJldHVybiB0cnVlO1xuICB9IGNhdGNoIChlcnIpIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbn1cblxuZnVuY3Rpb24gY29uc3RydWN0SmF2YXNjcmlwdEZ1bmN0aW9uKGRhdGEpIHtcbiAgLypqc2xpbnQgZXZpbDp0cnVlKi9cblxuICB2YXIgc291cmNlID0gJygnICsgZGF0YSArICcpJyxcbiAgICAgIGFzdCAgICA9IGVzcHJpbWEucGFyc2Uoc291cmNlLCB7IHJhbmdlOiB0cnVlIH0pLFxuICAgICAgcGFyYW1zID0gW10sXG4gICAgICBib2R5O1xuXG4gIGlmIChhc3QudHlwZSAgICAgICAgICAgICAgICAgICAgIT09ICdQcm9ncmFtJyAgICAgICAgICAgICB8fFxuICAgICAgYXN0LmJvZHkubGVuZ3RoICAgICAgICAgICAgICE9PSAxICAgICAgICAgICAgICAgICAgICAgfHxcbiAgICAgIGFzdC5ib2R5WzBdLnR5cGUgICAgICAgICAgICAhPT0gJ0V4cHJlc3Npb25TdGF0ZW1lbnQnIHx8XG4gICAgICBhc3QuYm9keVswXS5leHByZXNzaW9uLnR5cGUgIT09ICdGdW5jdGlvbkV4cHJlc3Npb24nKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdGYWlsZWQgdG8gcmVzb2x2ZSBmdW5jdGlvbicpO1xuICB9XG5cbiAgYXN0LmJvZHlbMF0uZXhwcmVzc2lvbi5wYXJhbXMuZm9yRWFjaChmdW5jdGlvbiAocGFyYW0pIHtcbiAgICBwYXJhbXMucHVzaChwYXJhbS5uYW1lKTtcbiAgfSk7XG5cbiAgYm9keSA9IGFzdC5ib2R5WzBdLmV4cHJlc3Npb24uYm9keS5yYW5nZTtcblxuICAvLyBFc3ByaW1hJ3MgcmFuZ2VzIGluY2x1ZGUgdGhlIGZpcnN0ICd7JyBhbmQgdGhlIGxhc3QgJ30nIGNoYXJhY3RlcnMgb25cbiAgLy8gZnVuY3Rpb24gZXhwcmVzc2lvbnMuIFNvIGN1dCB0aGVtIG91dC5cbiAgLyplc2xpbnQtZGlzYWJsZSBuby1uZXctZnVuYyovXG4gIHJldHVybiBuZXcgRnVuY3Rpb24ocGFyYW1zLCBzb3VyY2Uuc2xpY2UoYm9keVswXSArIDEsIGJvZHlbMV0gLSAxKSk7XG59XG5cbmZ1bmN0aW9uIHJlcHJlc2VudEphdmFzY3JpcHRGdW5jdGlvbihvYmplY3QgLyosIHN0eWxlKi8pIHtcbiAgcmV0dXJuIG9iamVjdC50b1N0cmluZygpO1xufVxuXG5mdW5jdGlvbiBpc0Z1bmN0aW9uKG9iamVjdCkge1xuICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS50b1N0cmluZy5jYWxsKG9iamVjdCkgPT09ICdbb2JqZWN0IEZ1bmN0aW9uXSc7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gbmV3IFR5cGUoJ3RhZzp5YW1sLm9yZywyMDAyOmpzL2Z1bmN0aW9uJywge1xuICBraW5kOiAnc2NhbGFyJyxcbiAgcmVzb2x2ZTogcmVzb2x2ZUphdmFzY3JpcHRGdW5jdGlvbixcbiAgY29uc3RydWN0OiBjb25zdHJ1Y3RKYXZhc2NyaXB0RnVuY3Rpb24sXG4gIHByZWRpY2F0ZTogaXNGdW5jdGlvbixcbiAgcmVwcmVzZW50OiByZXByZXNlbnRKYXZhc2NyaXB0RnVuY3Rpb25cbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgVHlwZSA9IHJlcXVpcmUoJy4uLy4uL3R5cGUnKTtcblxuZnVuY3Rpb24gcmVzb2x2ZUphdmFzY3JpcHRSZWdFeHAoZGF0YSkge1xuICBpZiAoZGF0YSA9PT0gbnVsbCkgcmV0dXJuIGZhbHNlO1xuICBpZiAoZGF0YS5sZW5ndGggPT09IDApIHJldHVybiBmYWxzZTtcblxuICB2YXIgcmVnZXhwID0gZGF0YSxcbiAgICAgIHRhaWwgICA9IC9cXC8oW2dpbV0qKSQvLmV4ZWMoZGF0YSksXG4gICAgICBtb2RpZmllcnMgPSAnJztcblxuICAvLyBpZiByZWdleHAgc3RhcnRzIHdpdGggJy8nIGl0IGNhbiBoYXZlIG1vZGlmaWVycyBhbmQgbXVzdCBiZSBwcm9wZXJseSBjbG9zZWRcbiAgLy8gYC9mb28vZ2ltYCAtIG1vZGlmaWVycyB0YWlsIGNhbiBiZSBtYXhpbXVtIDMgY2hhcnNcbiAgaWYgKHJlZ2V4cFswXSA9PT0gJy8nKSB7XG4gICAgaWYgKHRhaWwpIG1vZGlmaWVycyA9IHRhaWxbMV07XG5cbiAgICBpZiAobW9kaWZpZXJzLmxlbmd0aCA+IDMpIHJldHVybiBmYWxzZTtcbiAgICAvLyBpZiBleHByZXNzaW9uIHN0YXJ0cyB3aXRoIC8sIGlzIHNob3VsZCBiZSBwcm9wZXJseSB0ZXJtaW5hdGVkXG4gICAgaWYgKHJlZ2V4cFtyZWdleHAubGVuZ3RoIC0gbW9kaWZpZXJzLmxlbmd0aCAtIDFdICE9PSAnLycpIHJldHVybiBmYWxzZTtcbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufVxuXG5mdW5jdGlvbiBjb25zdHJ1Y3RKYXZhc2NyaXB0UmVnRXhwKGRhdGEpIHtcbiAgdmFyIHJlZ2V4cCA9IGRhdGEsXG4gICAgICB0YWlsICAgPSAvXFwvKFtnaW1dKikkLy5leGVjKGRhdGEpLFxuICAgICAgbW9kaWZpZXJzID0gJyc7XG5cbiAgLy8gYC9mb28vZ2ltYCAtIHRhaWwgY2FuIGJlIG1heGltdW0gNCBjaGFyc1xuICBpZiAocmVnZXhwWzBdID09PSAnLycpIHtcbiAgICBpZiAodGFpbCkgbW9kaWZpZXJzID0gdGFpbFsxXTtcbiAgICByZWdleHAgPSByZWdleHAuc2xpY2UoMSwgcmVnZXhwLmxlbmd0aCAtIG1vZGlmaWVycy5sZW5ndGggLSAxKTtcbiAgfVxuXG4gIHJldHVybiBuZXcgUmVnRXhwKHJlZ2V4cCwgbW9kaWZpZXJzKTtcbn1cblxuZnVuY3Rpb24gcmVwcmVzZW50SmF2YXNjcmlwdFJlZ0V4cChvYmplY3QgLyosIHN0eWxlKi8pIHtcbiAgdmFyIHJlc3VsdCA9ICcvJyArIG9iamVjdC5zb3VyY2UgKyAnLyc7XG5cbiAgaWYgKG9iamVjdC5nbG9iYWwpIHJlc3VsdCArPSAnZyc7XG4gIGlmIChvYmplY3QubXVsdGlsaW5lKSByZXN1bHQgKz0gJ20nO1xuICBpZiAob2JqZWN0Lmlnbm9yZUNhc2UpIHJlc3VsdCArPSAnaSc7XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuZnVuY3Rpb24gaXNSZWdFeHAob2JqZWN0KSB7XG4gIHJldHVybiBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwob2JqZWN0KSA9PT0gJ1tvYmplY3QgUmVnRXhwXSc7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gbmV3IFR5cGUoJ3RhZzp5YW1sLm9yZywyMDAyOmpzL3JlZ2V4cCcsIHtcbiAga2luZDogJ3NjYWxhcicsXG4gIHJlc29sdmU6IHJlc29sdmVKYXZhc2NyaXB0UmVnRXhwLFxuICBjb25zdHJ1Y3Q6IGNvbnN0cnVjdEphdmFzY3JpcHRSZWdFeHAsXG4gIHByZWRpY2F0ZTogaXNSZWdFeHAsXG4gIHJlcHJlc2VudDogcmVwcmVzZW50SmF2YXNjcmlwdFJlZ0V4cFxufSk7XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBUeXBlID0gcmVxdWlyZSgnLi4vLi4vdHlwZScpO1xuXG5mdW5jdGlvbiByZXNvbHZlSmF2YXNjcmlwdFVuZGVmaW5lZCgpIHtcbiAgcmV0dXJuIHRydWU7XG59XG5cbmZ1bmN0aW9uIGNvbnN0cnVjdEphdmFzY3JpcHRVbmRlZmluZWQoKSB7XG4gIC8qZXNsaW50LWRpc2FibGUgbm8tdW5kZWZpbmVkKi9cbiAgcmV0dXJuIHVuZGVmaW5lZDtcbn1cblxuZnVuY3Rpb24gcmVwcmVzZW50SmF2YXNjcmlwdFVuZGVmaW5lZCgpIHtcbiAgcmV0dXJuICcnO1xufVxuXG5mdW5jdGlvbiBpc1VuZGVmaW5lZChvYmplY3QpIHtcbiAgcmV0dXJuIHR5cGVvZiBvYmplY3QgPT09ICd1bmRlZmluZWQnO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IG5ldyBUeXBlKCd0YWc6eWFtbC5vcmcsMjAwMjpqcy91bmRlZmluZWQnLCB7XG4gIGtpbmQ6ICdzY2FsYXInLFxuICByZXNvbHZlOiByZXNvbHZlSmF2YXNjcmlwdFVuZGVmaW5lZCxcbiAgY29uc3RydWN0OiBjb25zdHJ1Y3RKYXZhc2NyaXB0VW5kZWZpbmVkLFxuICBwcmVkaWNhdGU6IGlzVW5kZWZpbmVkLFxuICByZXByZXNlbnQ6IHJlcHJlc2VudEphdmFzY3JpcHRVbmRlZmluZWRcbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgVHlwZSA9IHJlcXVpcmUoJy4uL3R5cGUnKTtcblxubW9kdWxlLmV4cG9ydHMgPSBuZXcgVHlwZSgndGFnOnlhbWwub3JnLDIwMDI6bWFwJywge1xuICBraW5kOiAnbWFwcGluZycsXG4gIGNvbnN0cnVjdDogZnVuY3Rpb24gKGRhdGEpIHsgcmV0dXJuIGRhdGEgIT09IG51bGwgPyBkYXRhIDoge307IH1cbn0pO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgVHlwZSA9IHJlcXVpcmUoJy4uL3R5cGUnKTtcblxuZnVuY3Rpb24gcmVzb2x2ZVlhbWxNZXJnZShkYXRhKSB7XG4gIHJldHVybiBkYXRhID09PSAnPDwnIHx8IGRhdGEgPT09IG51bGw7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gbmV3IFR5cGUoJ3RhZzp5YW1sLm9yZywyMDAyOm1lcmdlJywge1xuICBraW5kOiAnc2NhbGFyJyxcbiAgcmVzb2x2ZTogcmVzb2x2ZVlhbWxNZXJnZVxufSk7XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBUeXBlID0gcmVxdWlyZSgnLi4vdHlwZScpO1xuXG5mdW5jdGlvbiByZXNvbHZlWWFtbE51bGwoZGF0YSkge1xuICBpZiAoZGF0YSA9PT0gbnVsbCkgcmV0dXJuIHRydWU7XG5cbiAgdmFyIG1heCA9IGRhdGEubGVuZ3RoO1xuXG4gIHJldHVybiAobWF4ID09PSAxICYmIGRhdGEgPT09ICd+JykgfHxcbiAgICAgICAgIChtYXggPT09IDQgJiYgKGRhdGEgPT09ICdudWxsJyB8fCBkYXRhID09PSAnTnVsbCcgfHwgZGF0YSA9PT0gJ05VTEwnKSk7XG59XG5cbmZ1bmN0aW9uIGNvbnN0cnVjdFlhbWxOdWxsKCkge1xuICByZXR1cm4gbnVsbDtcbn1cblxuZnVuY3Rpb24gaXNOdWxsKG9iamVjdCkge1xuICByZXR1cm4gb2JqZWN0ID09PSBudWxsO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IG5ldyBUeXBlKCd0YWc6eWFtbC5vcmcsMjAwMjpudWxsJywge1xuICBraW5kOiAnc2NhbGFyJyxcbiAgcmVzb2x2ZTogcmVzb2x2ZVlhbWxOdWxsLFxuICBjb25zdHJ1Y3Q6IGNvbnN0cnVjdFlhbWxOdWxsLFxuICBwcmVkaWNhdGU6IGlzTnVsbCxcbiAgcmVwcmVzZW50OiB7XG4gICAgY2Fub25pY2FsOiBmdW5jdGlvbiAoKSB7IHJldHVybiAnfic7ICAgIH0sXG4gICAgbG93ZXJjYXNlOiBmdW5jdGlvbiAoKSB7IHJldHVybiAnbnVsbCc7IH0sXG4gICAgdXBwZXJjYXNlOiBmdW5jdGlvbiAoKSB7IHJldHVybiAnTlVMTCc7IH0sXG4gICAgY2FtZWxjYXNlOiBmdW5jdGlvbiAoKSB7IHJldHVybiAnTnVsbCc7IH1cbiAgfSxcbiAgZGVmYXVsdFN0eWxlOiAnbG93ZXJjYXNlJ1xufSk7XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBUeXBlID0gcmVxdWlyZSgnLi4vdHlwZScpO1xuXG52YXIgX2hhc093blByb3BlcnR5ID0gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTtcbnZhciBfdG9TdHJpbmcgICAgICAgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nO1xuXG5mdW5jdGlvbiByZXNvbHZlWWFtbE9tYXAoZGF0YSkge1xuICBpZiAoZGF0YSA9PT0gbnVsbCkgcmV0dXJuIHRydWU7XG5cbiAgdmFyIG9iamVjdEtleXMgPSBbXSwgaW5kZXgsIGxlbmd0aCwgcGFpciwgcGFpcktleSwgcGFpckhhc0tleSxcbiAgICAgIG9iamVjdCA9IGRhdGE7XG5cbiAgZm9yIChpbmRleCA9IDAsIGxlbmd0aCA9IG9iamVjdC5sZW5ndGg7IGluZGV4IDwgbGVuZ3RoOyBpbmRleCArPSAxKSB7XG4gICAgcGFpciA9IG9iamVjdFtpbmRleF07XG4gICAgcGFpckhhc0tleSA9IGZhbHNlO1xuXG4gICAgaWYgKF90b1N0cmluZy5jYWxsKHBhaXIpICE9PSAnW29iamVjdCBPYmplY3RdJykgcmV0dXJuIGZhbHNlO1xuXG4gICAgZm9yIChwYWlyS2V5IGluIHBhaXIpIHtcbiAgICAgIGlmIChfaGFzT3duUHJvcGVydHkuY2FsbChwYWlyLCBwYWlyS2V5KSkge1xuICAgICAgICBpZiAoIXBhaXJIYXNLZXkpIHBhaXJIYXNLZXkgPSB0cnVlO1xuICAgICAgICBlbHNlIHJldHVybiBmYWxzZTtcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoIXBhaXJIYXNLZXkpIHJldHVybiBmYWxzZTtcblxuICAgIGlmIChvYmplY3RLZXlzLmluZGV4T2YocGFpcktleSkgPT09IC0xKSBvYmplY3RLZXlzLnB1c2gocGFpcktleSk7XG4gICAgZWxzZSByZXR1cm4gZmFsc2U7XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn1cblxuZnVuY3Rpb24gY29uc3RydWN0WWFtbE9tYXAoZGF0YSkge1xuICByZXR1cm4gZGF0YSAhPT0gbnVsbCA/IGRhdGEgOiBbXTtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBuZXcgVHlwZSgndGFnOnlhbWwub3JnLDIwMDI6b21hcCcsIHtcbiAga2luZDogJ3NlcXVlbmNlJyxcbiAgcmVzb2x2ZTogcmVzb2x2ZVlhbWxPbWFwLFxuICBjb25zdHJ1Y3Q6IGNvbnN0cnVjdFlhbWxPbWFwXG59KTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIFR5cGUgPSByZXF1aXJlKCcuLi90eXBlJyk7XG5cbnZhciBfdG9TdHJpbmcgPSBPYmplY3QucHJvdG90eXBlLnRvU3RyaW5nO1xuXG5mdW5jdGlvbiByZXNvbHZlWWFtbFBhaXJzKGRhdGEpIHtcbiAgaWYgKGRhdGEgPT09IG51bGwpIHJldHVybiB0cnVlO1xuXG4gIHZhciBpbmRleCwgbGVuZ3RoLCBwYWlyLCBrZXlzLCByZXN1bHQsXG4gICAgICBvYmplY3QgPSBkYXRhO1xuXG4gIHJlc3VsdCA9IG5ldyBBcnJheShvYmplY3QubGVuZ3RoKTtcblxuICBmb3IgKGluZGV4ID0gMCwgbGVuZ3RoID0gb2JqZWN0Lmxlbmd0aDsgaW5kZXggPCBsZW5ndGg7IGluZGV4ICs9IDEpIHtcbiAgICBwYWlyID0gb2JqZWN0W2luZGV4XTtcblxuICAgIGlmIChfdG9TdHJpbmcuY2FsbChwYWlyKSAhPT0gJ1tvYmplY3QgT2JqZWN0XScpIHJldHVybiBmYWxzZTtcblxuICAgIGtleXMgPSBPYmplY3Qua2V5cyhwYWlyKTtcblxuICAgIGlmIChrZXlzLmxlbmd0aCAhPT0gMSkgcmV0dXJuIGZhbHNlO1xuXG4gICAgcmVzdWx0W2luZGV4XSA9IFsga2V5c1swXSwgcGFpcltrZXlzWzBdXSBdO1xuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59XG5cbmZ1bmN0aW9uIGNvbnN0cnVjdFlhbWxQYWlycyhkYXRhKSB7XG4gIGlmIChkYXRhID09PSBudWxsKSByZXR1cm4gW107XG5cbiAgdmFyIGluZGV4LCBsZW5ndGgsIHBhaXIsIGtleXMsIHJlc3VsdCxcbiAgICAgIG9iamVjdCA9IGRhdGE7XG5cbiAgcmVzdWx0ID0gbmV3IEFycmF5KG9iamVjdC5sZW5ndGgpO1xuXG4gIGZvciAoaW5kZXggPSAwLCBsZW5ndGggPSBvYmplY3QubGVuZ3RoOyBpbmRleCA8IGxlbmd0aDsgaW5kZXggKz0gMSkge1xuICAgIHBhaXIgPSBvYmplY3RbaW5kZXhdO1xuXG4gICAga2V5cyA9IE9iamVjdC5rZXlzKHBhaXIpO1xuXG4gICAgcmVzdWx0W2luZGV4XSA9IFsga2V5c1swXSwgcGFpcltrZXlzWzBdXSBdO1xuICB9XG5cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBuZXcgVHlwZSgndGFnOnlhbWwub3JnLDIwMDI6cGFpcnMnLCB7XG4gIGtpbmQ6ICdzZXF1ZW5jZScsXG4gIHJlc29sdmU6IHJlc29sdmVZYW1sUGFpcnMsXG4gIGNvbnN0cnVjdDogY29uc3RydWN0WWFtbFBhaXJzXG59KTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIFR5cGUgPSByZXF1aXJlKCcuLi90eXBlJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gbmV3IFR5cGUoJ3RhZzp5YW1sLm9yZywyMDAyOnNlcScsIHtcbiAga2luZDogJ3NlcXVlbmNlJyxcbiAgY29uc3RydWN0OiBmdW5jdGlvbiAoZGF0YSkgeyByZXR1cm4gZGF0YSAhPT0gbnVsbCA/IGRhdGEgOiBbXTsgfVxufSk7XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBUeXBlID0gcmVxdWlyZSgnLi4vdHlwZScpO1xuXG52YXIgX2hhc093blByb3BlcnR5ID0gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eTtcblxuZnVuY3Rpb24gcmVzb2x2ZVlhbWxTZXQoZGF0YSkge1xuICBpZiAoZGF0YSA9PT0gbnVsbCkgcmV0dXJuIHRydWU7XG5cbiAgdmFyIGtleSwgb2JqZWN0ID0gZGF0YTtcblxuICBmb3IgKGtleSBpbiBvYmplY3QpIHtcbiAgICBpZiAoX2hhc093blByb3BlcnR5LmNhbGwob2JqZWN0LCBrZXkpKSB7XG4gICAgICBpZiAob2JqZWN0W2tleV0gIT09IG51bGwpIHJldHVybiBmYWxzZTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gdHJ1ZTtcbn1cblxuZnVuY3Rpb24gY29uc3RydWN0WWFtbFNldChkYXRhKSB7XG4gIHJldHVybiBkYXRhICE9PSBudWxsID8gZGF0YSA6IHt9O1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IG5ldyBUeXBlKCd0YWc6eWFtbC5vcmcsMjAwMjpzZXQnLCB7XG4gIGtpbmQ6ICdtYXBwaW5nJyxcbiAgcmVzb2x2ZTogcmVzb2x2ZVlhbWxTZXQsXG4gIGNvbnN0cnVjdDogY29uc3RydWN0WWFtbFNldFxufSk7XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBUeXBlID0gcmVxdWlyZSgnLi4vdHlwZScpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IG5ldyBUeXBlKCd0YWc6eWFtbC5vcmcsMjAwMjpzdHInLCB7XG4gIGtpbmQ6ICdzY2FsYXInLFxuICBjb25zdHJ1Y3Q6IGZ1bmN0aW9uIChkYXRhKSB7IHJldHVybiBkYXRhICE9PSBudWxsID8gZGF0YSA6ICcnOyB9XG59KTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIFR5cGUgPSByZXF1aXJlKCcuLi90eXBlJyk7XG5cbnZhciBZQU1MX1RJTUVTVEFNUF9SRUdFWFAgPSBuZXcgUmVnRXhwKFxuICAnXihbMC05XVswLTldWzAtOV1bMC05XSknICAgICAgICAgICsgLy8gWzFdIHllYXJcbiAgJy0oWzAtOV1bMC05XT8pJyAgICAgICAgICAgICAgICAgICArIC8vIFsyXSBtb250aFxuICAnLShbMC05XVswLTldPyknICAgICAgICAgICAgICAgICAgICsgLy8gWzNdIGRheVxuICAnKD86KD86W1R0XXxbIFxcXFx0XSspJyAgICAgICAgICAgICAgKyAvLyAuLi5cbiAgJyhbMC05XVswLTldPyknICAgICAgICAgICAgICAgICAgICArIC8vIFs0XSBob3VyXG4gICc6KFswLTldWzAtOV0pJyAgICAgICAgICAgICAgICAgICAgKyAvLyBbNV0gbWludXRlXG4gICc6KFswLTldWzAtOV0pJyAgICAgICAgICAgICAgICAgICAgKyAvLyBbNl0gc2Vjb25kXG4gICcoPzpcXFxcLihbMC05XSopKT8nICAgICAgICAgICAgICAgICArIC8vIFs3XSBmcmFjdGlvblxuICAnKD86WyBcXFxcdF0qKFp8KFstK10pKFswLTldWzAtOV0/KScgKyAvLyBbOF0gdHogWzldIHR6X3NpZ24gWzEwXSB0el9ob3VyXG4gICcoPzo6KFswLTldWzAtOV0pKT8pKT8pPyQnKTsgICAgICAgICAvLyBbMTFdIHR6X21pbnV0ZVxuXG5mdW5jdGlvbiByZXNvbHZlWWFtbFRpbWVzdGFtcChkYXRhKSB7XG4gIGlmIChkYXRhID09PSBudWxsKSByZXR1cm4gZmFsc2U7XG4gIGlmIChZQU1MX1RJTUVTVEFNUF9SRUdFWFAuZXhlYyhkYXRhKSA9PT0gbnVsbCkgcmV0dXJuIGZhbHNlO1xuICByZXR1cm4gdHJ1ZTtcbn1cblxuZnVuY3Rpb24gY29uc3RydWN0WWFtbFRpbWVzdGFtcChkYXRhKSB7XG4gIHZhciBtYXRjaCwgeWVhciwgbW9udGgsIGRheSwgaG91ciwgbWludXRlLCBzZWNvbmQsIGZyYWN0aW9uID0gMCxcbiAgICAgIGRlbHRhID0gbnVsbCwgdHpfaG91ciwgdHpfbWludXRlLCBkYXRlO1xuXG4gIG1hdGNoID0gWUFNTF9USU1FU1RBTVBfUkVHRVhQLmV4ZWMoZGF0YSk7XG5cbiAgaWYgKG1hdGNoID09PSBudWxsKSB0aHJvdyBuZXcgRXJyb3IoJ0RhdGUgcmVzb2x2ZSBlcnJvcicpO1xuXG4gIC8vIG1hdGNoOiBbMV0geWVhciBbMl0gbW9udGggWzNdIGRheVxuXG4gIHllYXIgPSArKG1hdGNoWzFdKTtcbiAgbW9udGggPSArKG1hdGNoWzJdKSAtIDE7IC8vIEpTIG1vbnRoIHN0YXJ0cyB3aXRoIDBcbiAgZGF5ID0gKyhtYXRjaFszXSk7XG5cbiAgaWYgKCFtYXRjaFs0XSkgeyAvLyBubyBob3VyXG4gICAgcmV0dXJuIG5ldyBEYXRlKERhdGUuVVRDKHllYXIsIG1vbnRoLCBkYXkpKTtcbiAgfVxuXG4gIC8vIG1hdGNoOiBbNF0gaG91ciBbNV0gbWludXRlIFs2XSBzZWNvbmQgWzddIGZyYWN0aW9uXG5cbiAgaG91ciA9ICsobWF0Y2hbNF0pO1xuICBtaW51dGUgPSArKG1hdGNoWzVdKTtcbiAgc2Vjb25kID0gKyhtYXRjaFs2XSk7XG5cbiAgaWYgKG1hdGNoWzddKSB7XG4gICAgZnJhY3Rpb24gPSBtYXRjaFs3XS5zbGljZSgwLCAzKTtcbiAgICB3aGlsZSAoZnJhY3Rpb24ubGVuZ3RoIDwgMykgeyAvLyBtaWxsaS1zZWNvbmRzXG4gICAgICBmcmFjdGlvbiArPSAnMCc7XG4gICAgfVxuICAgIGZyYWN0aW9uID0gK2ZyYWN0aW9uO1xuICB9XG5cbiAgLy8gbWF0Y2g6IFs4XSB0eiBbOV0gdHpfc2lnbiBbMTBdIHR6X2hvdXIgWzExXSB0el9taW51dGVcblxuICBpZiAobWF0Y2hbOV0pIHtcbiAgICB0el9ob3VyID0gKyhtYXRjaFsxMF0pO1xuICAgIHR6X21pbnV0ZSA9ICsobWF0Y2hbMTFdIHx8IDApO1xuICAgIGRlbHRhID0gKHR6X2hvdXIgKiA2MCArIHR6X21pbnV0ZSkgKiA2MDAwMDsgLy8gZGVsdGEgaW4gbWlsaS1zZWNvbmRzXG4gICAgaWYgKG1hdGNoWzldID09PSAnLScpIGRlbHRhID0gLWRlbHRhO1xuICB9XG5cbiAgZGF0ZSA9IG5ldyBEYXRlKERhdGUuVVRDKHllYXIsIG1vbnRoLCBkYXksIGhvdXIsIG1pbnV0ZSwgc2Vjb25kLCBmcmFjdGlvbikpO1xuXG4gIGlmIChkZWx0YSkgZGF0ZS5zZXRUaW1lKGRhdGUuZ2V0VGltZSgpIC0gZGVsdGEpO1xuXG4gIHJldHVybiBkYXRlO1xufVxuXG5mdW5jdGlvbiByZXByZXNlbnRZYW1sVGltZXN0YW1wKG9iamVjdCAvKiwgc3R5bGUqLykge1xuICByZXR1cm4gb2JqZWN0LnRvSVNPU3RyaW5nKCk7XG59XG5cbm1vZHVsZS5leHBvcnRzID0gbmV3IFR5cGUoJ3RhZzp5YW1sLm9yZywyMDAyOnRpbWVzdGFtcCcsIHtcbiAga2luZDogJ3NjYWxhcicsXG4gIHJlc29sdmU6IHJlc29sdmVZYW1sVGltZXN0YW1wLFxuICBjb25zdHJ1Y3Q6IGNvbnN0cnVjdFlhbWxUaW1lc3RhbXAsXG4gIGluc3RhbmNlT2Y6IERhdGUsXG4gIHJlcHJlc2VudDogcmVwcmVzZW50WWFtbFRpbWVzdGFtcFxufSk7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgdXRpbHMgPSByZXF1aXJlKCcuL3V0aWxzJyk7XG52YXIgc3VwcG9ydCA9IHJlcXVpcmUoJy4vc3VwcG9ydCcpO1xuLy8gcHJpdmF0ZSBwcm9wZXJ0eVxudmFyIF9rZXlTdHIgPSBcIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky89XCI7XG5cblxuLy8gcHVibGljIG1ldGhvZCBmb3IgZW5jb2Rpbmdcbi8vIGV4cG9ydHMuZW5jb2RlID0gZnVuY3Rpb24oaW5wdXQpIHtcbi8vICAgICB2YXIgb3V0cHV0ID0gW107XG4vLyAgICAgdmFyIGNocjEsIGNocjIsIGNocjMsIGVuYzEsIGVuYzIsIGVuYzMsIGVuYzQ7XG4vLyAgICAgdmFyIGkgPSAwLCBsZW4gPSBpbnB1dC5sZW5ndGgsIHJlbWFpbmluZ0J5dGVzID0gbGVuO1xuXG4vLyAgICAgdmFyIGlzQXJyYXkgPSB1dGlscy5nZXRUeXBlT2YoaW5wdXQpICE9PSBcInN0cmluZ1wiO1xuLy8gICAgIHdoaWxlIChpIDwgaW5wdXQubGVuZ3RoKSB7XG4vLyAgICAgICAgIHJlbWFpbmluZ0J5dGVzID0gbGVuIC0gaTtcblxuLy8gICAgICAgICBpZiAoIWlzQXJyYXkpIHtcbi8vICAgICAgICAgICAgIGNocjEgPSBpbnB1dC5jaGFyQ29kZUF0KGkrKyk7XG4vLyAgICAgICAgICAgICBjaHIyID0gaSA8IGxlbiA/IGlucHV0LmNoYXJDb2RlQXQoaSsrKSA6IDA7XG4vLyAgICAgICAgICAgICBjaHIzID0gaSA8IGxlbiA/IGlucHV0LmNoYXJDb2RlQXQoaSsrKSA6IDA7XG4vLyAgICAgICAgIH0gZWxzZSB7XG4vLyAgICAgICAgICAgICBjaHIxID0gaW5wdXRbaSsrXTtcbi8vICAgICAgICAgICAgIGNocjIgPSBpIDwgbGVuID8gaW5wdXRbaSsrXSA6IDA7XG4vLyAgICAgICAgICAgICBjaHIzID0gaSA8IGxlbiA/IGlucHV0W2krK10gOiAwO1xuLy8gICAgICAgICB9XG5cbi8vICAgICAgICAgZW5jMSA9IGNocjEgPj4gMjtcbi8vICAgICAgICAgZW5jMiA9ICgoY2hyMSAmIDMpIDw8IDQpIHwgKGNocjIgPj4gNCk7XG4vLyAgICAgICAgIGVuYzMgPSByZW1haW5pbmdCeXRlcyA+IDEgPyAoKChjaHIyICYgMTUpIDw8IDIpIHwgKGNocjMgPj4gNikpIDogNjQ7XG4vLyAgICAgICAgIGVuYzQgPSByZW1haW5pbmdCeXRlcyA+IDIgPyAoY2hyMyAmIDYzKSA6IDY0O1xuXG4vLyAgICAgICAgIG91dHB1dC5wdXNoKF9rZXlTdHIuY2hhckF0KGVuYzEpICsgX2tleVN0ci5jaGFyQXQoZW5jMikgKyBfa2V5U3RyLmNoYXJBdChlbmMzKSArIF9rZXlTdHIuY2hhckF0KGVuYzQpKTtcblxuLy8gICAgIH1cblxuLy8gICAgIHJldHVybiBvdXRwdXQuam9pbihcIlwiKTtcbi8vIH07XG5cbi8vIHB1YmxpYyBtZXRob2QgZm9yIGRlY29kaW5nXG5leHBvcnRzLmRlY29kZSA9IGZ1bmN0aW9uKGlucHV0KSB7XG4gICAgdmFyIGNocjEsIGNocjIsIGNocjM7XG4gICAgdmFyIGVuYzEsIGVuYzIsIGVuYzMsIGVuYzQ7XG4gICAgdmFyIGkgPSAwLCByZXN1bHRJbmRleCA9IDA7XG5cbiAgICBpbnB1dCA9IGlucHV0LnJlcGxhY2UoL1teQS1aYS16MC05XFwrXFwvXFw9XS9nLCBcIlwiKTtcblxuICAgIHZhciB0b3RhbExlbmd0aCA9IGlucHV0Lmxlbmd0aCAqIDMgLyA0O1xuICAgIGlmKGlucHV0LmNoYXJBdChpbnB1dC5sZW5ndGggLSAxKSA9PT0gX2tleVN0ci5jaGFyQXQoNjQpKSB7XG4gICAgICAgIHRvdGFsTGVuZ3RoLS07XG4gICAgfVxuICAgIGlmKGlucHV0LmNoYXJBdChpbnB1dC5sZW5ndGggLSAyKSA9PT0gX2tleVN0ci5jaGFyQXQoNjQpKSB7XG4gICAgICAgIHRvdGFsTGVuZ3RoLS07XG4gICAgfVxuICAgIHZhciBvdXRwdXQ7XG4gICAgaWYgKHN1cHBvcnQudWludDhhcnJheSkge1xuICAgICAgICBvdXRwdXQgPSBuZXcgVWludDhBcnJheSh0b3RhbExlbmd0aCk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgb3V0cHV0ID0gbmV3IEFycmF5KHRvdGFsTGVuZ3RoKTtcbiAgICB9XG5cbiAgICB3aGlsZSAoaSA8IGlucHV0Lmxlbmd0aCkge1xuXG4gICAgICAgIGVuYzEgPSBfa2V5U3RyLmluZGV4T2YoaW5wdXQuY2hhckF0KGkrKykpO1xuICAgICAgICBlbmMyID0gX2tleVN0ci5pbmRleE9mKGlucHV0LmNoYXJBdChpKyspKTtcbiAgICAgICAgZW5jMyA9IF9rZXlTdHIuaW5kZXhPZihpbnB1dC5jaGFyQXQoaSsrKSk7XG4gICAgICAgIGVuYzQgPSBfa2V5U3RyLmluZGV4T2YoaW5wdXQuY2hhckF0KGkrKykpO1xuXG4gICAgICAgIGNocjEgPSAoZW5jMSA8PCAyKSB8IChlbmMyID4+IDQpO1xuICAgICAgICBjaHIyID0gKChlbmMyICYgMTUpIDw8IDQpIHwgKGVuYzMgPj4gMik7XG4gICAgICAgIGNocjMgPSAoKGVuYzMgJiAzKSA8PCA2KSB8IGVuYzQ7XG5cbiAgICAgICAgb3V0cHV0W3Jlc3VsdEluZGV4KytdID0gY2hyMTtcblxuICAgICAgICBpZiAoZW5jMyAhPT0gNjQpIHtcbiAgICAgICAgICAgIG91dHB1dFtyZXN1bHRJbmRleCsrXSA9IGNocjI7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGVuYzQgIT09IDY0KSB7XG4gICAgICAgICAgICBvdXRwdXRbcmVzdWx0SW5kZXgrK10gPSBjaHIzO1xuICAgICAgICB9XG5cbiAgICB9XG5cbiAgICByZXR1cm4gb3V0cHV0O1xufTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIGV4dGVybmFsID0gcmVxdWlyZShcIi4vZXh0ZXJuYWxcIik7XG52YXIgRGF0YVdvcmtlciA9IHJlcXVpcmUoJy4vc3RyZWFtL0RhdGFXb3JrZXInKTtcbnZhciBEYXRhTGVuZ3RoUHJvYmUgPSByZXF1aXJlKCcuL3N0cmVhbS9EYXRhTGVuZ3RoUHJvYmUnKTtcbnZhciBDcmMzMlByb2JlID0gcmVxdWlyZSgnLi9zdHJlYW0vQ3JjMzJQcm9iZScpO1xudmFyIERhdGFMZW5ndGhQcm9iZSA9IHJlcXVpcmUoJy4vc3RyZWFtL0RhdGFMZW5ndGhQcm9iZScpO1xuXG4vKipcbiAqIFJlcHJlc2VudCBhIGNvbXByZXNzZWQgb2JqZWN0LCB3aXRoIGV2ZXJ5dGhpbmcgbmVlZGVkIHRvIGRlY29tcHJlc3MgaXQuXG4gKiBAY29uc3RydWN0b3JcbiAqIEBwYXJhbSB7bnVtYmVyfSBjb21wcmVzc2VkU2l6ZSB0aGUgc2l6ZSBvZiB0aGUgZGF0YSBjb21wcmVzc2VkLlxuICogQHBhcmFtIHtudW1iZXJ9IHVuY29tcHJlc3NlZFNpemUgdGhlIHNpemUgb2YgdGhlIGRhdGEgYWZ0ZXIgZGVjb21wcmVzc2lvbi5cbiAqIEBwYXJhbSB7bnVtYmVyfSBjcmMzMiB0aGUgY3JjMzIgb2YgdGhlIGRlY29tcHJlc3NlZCBmaWxlLlxuICogQHBhcmFtIHtvYmplY3R9IGNvbXByZXNzaW9uIHRoZSB0eXBlIG9mIGNvbXByZXNzaW9uLCBzZWUgbGliL2NvbXByZXNzaW9ucy5qcy5cbiAqIEBwYXJhbSB7U3RyaW5nfEFycmF5QnVmZmVyfFVpbnQ4QXJyYXl8QnVmZmVyfSBkYXRhIHRoZSBjb21wcmVzc2VkIGRhdGEuXG4gKi9cbmZ1bmN0aW9uIENvbXByZXNzZWRPYmplY3QoY29tcHJlc3NlZFNpemUsIHVuY29tcHJlc3NlZFNpemUsIGNyYzMyLCBjb21wcmVzc2lvbiwgZGF0YSkge1xuICAgIHRoaXMuY29tcHJlc3NlZFNpemUgPSBjb21wcmVzc2VkU2l6ZTtcbiAgICB0aGlzLnVuY29tcHJlc3NlZFNpemUgPSB1bmNvbXByZXNzZWRTaXplO1xuICAgIHRoaXMuY3JjMzIgPSBjcmMzMjtcbiAgICB0aGlzLmNvbXByZXNzaW9uID0gY29tcHJlc3Npb247XG4gICAgdGhpcy5jb21wcmVzc2VkQ29udGVudCA9IGRhdGE7XG59XG5cbkNvbXByZXNzZWRPYmplY3QucHJvdG90eXBlID0ge1xuICAgIC8qKlxuICAgICAqIENyZWF0ZSBhIHdvcmtlciB0byBnZXQgdGhlIHVuY29tcHJlc3NlZCBjb250ZW50LlxuICAgICAqIEByZXR1cm4ge0dlbmVyaWNXb3JrZXJ9IHRoZSB3b3JrZXIuXG4gICAgICovXG4gICAgZ2V0Q29udGVudFdvcmtlciA6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyIHdvcmtlciA9IG5ldyBEYXRhV29ya2VyKGV4dGVybmFsLlByb21pc2UucmVzb2x2ZSh0aGlzLmNvbXByZXNzZWRDb250ZW50KSlcbiAgICAgICAgLnBpcGUodGhpcy5jb21wcmVzc2lvbi51bmNvbXByZXNzV29ya2VyKCkpXG4gICAgICAgIC5waXBlKG5ldyBEYXRhTGVuZ3RoUHJvYmUoXCJkYXRhX2xlbmd0aFwiKSk7XG5cbiAgICAgICAgdmFyIHRoYXQgPSB0aGlzO1xuICAgICAgICB3b3JrZXIub24oXCJlbmRcIiwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgaWYodGhpcy5zdHJlYW1JbmZvWydkYXRhX2xlbmd0aCddICE9PSB0aGF0LnVuY29tcHJlc3NlZFNpemUpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJCdWcgOiB1bmNvbXByZXNzZWQgZGF0YSBzaXplIG1pc21hdGNoXCIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHdvcmtlcjtcbiAgICB9LFxuICAgIC8qKlxuICAgICAqIENyZWF0ZSBhIHdvcmtlciB0byBnZXQgdGhlIGNvbXByZXNzZWQgY29udGVudC5cbiAgICAgKiBAcmV0dXJuIHtHZW5lcmljV29ya2VyfSB0aGUgd29ya2VyLlxuICAgICAqL1xuICAgIGdldENvbXByZXNzZWRXb3JrZXIgOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBuZXcgRGF0YVdvcmtlcihleHRlcm5hbC5Qcm9taXNlLnJlc29sdmUodGhpcy5jb21wcmVzc2VkQ29udGVudCkpXG4gICAgICAgIC53aXRoU3RyZWFtSW5mbyhcImNvbXByZXNzZWRTaXplXCIsIHRoaXMuY29tcHJlc3NlZFNpemUpXG4gICAgICAgIC53aXRoU3RyZWFtSW5mbyhcInVuY29tcHJlc3NlZFNpemVcIiwgdGhpcy51bmNvbXByZXNzZWRTaXplKVxuICAgICAgICAud2l0aFN0cmVhbUluZm8oXCJjcmMzMlwiLCB0aGlzLmNyYzMyKVxuICAgICAgICAud2l0aFN0cmVhbUluZm8oXCJjb21wcmVzc2lvblwiLCB0aGlzLmNvbXByZXNzaW9uKVxuICAgICAgICA7XG4gICAgfVxufTtcblxuLyoqXG4gKiBDaGFpbiB0aGUgZ2l2ZW4gd29ya2VyIHdpdGggb3RoZXIgd29ya2VycyB0byBjb21wcmVzcyB0aGUgY29udGVudCB3aXRoIHRoZVxuICogZ2l2ZW4gY29tcHJlc2lvbi5cbiAqIEBwYXJhbSB7R2VuZXJpY1dvcmtlcn0gdW5jb21wcmVzc2VkV29ya2VyIHRoZSB3b3JrZXIgdG8gcGlwZS5cbiAqIEBwYXJhbSB7T2JqZWN0fSBjb21wcmVzc2lvbiB0aGUgY29tcHJlc3Npb24gb2JqZWN0LlxuICogQHBhcmFtIHtPYmplY3R9IGNvbXByZXNzaW9uT3B0aW9ucyB0aGUgb3B0aW9ucyB0byB1c2Ugd2hlbiBjb21wcmVzc2luZy5cbiAqIEByZXR1cm4ge0dlbmVyaWNXb3JrZXJ9IHRoZSBuZXcgd29ya2VyIGNvbXByZXNzaW5nIHRoZSBjb250ZW50LlxuICovXG5Db21wcmVzc2VkT2JqZWN0LmNyZWF0ZVdvcmtlckZyb20gPSBmdW5jdGlvbiAodW5jb21wcmVzc2VkV29ya2VyLCBjb21wcmVzc2lvbiwgY29tcHJlc3Npb25PcHRpb25zKSB7XG4gICAgcmV0dXJuIHVuY29tcHJlc3NlZFdvcmtlclxuICAgIC5waXBlKG5ldyBDcmMzMlByb2JlKCkpXG4gICAgLnBpcGUobmV3IERhdGFMZW5ndGhQcm9iZShcInVuY29tcHJlc3NlZFNpemVcIikpXG4gICAgLnBpcGUoY29tcHJlc3Npb24uY29tcHJlc3NXb3JrZXIoY29tcHJlc3Npb25PcHRpb25zKSlcbiAgICAucGlwZShuZXcgRGF0YUxlbmd0aFByb2JlKFwiY29tcHJlc3NlZFNpemVcIikpXG4gICAgLndpdGhTdHJlYW1JbmZvKFwiY29tcHJlc3Npb25cIiwgY29tcHJlc3Npb24pO1xufTtcblxubW9kdWxlLmV4cG9ydHMgPSBDb21wcmVzc2VkT2JqZWN0O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgR2VuZXJpY1dvcmtlciA9IHJlcXVpcmUoXCIuL3N0cmVhbS9HZW5lcmljV29ya2VyXCIpO1xuXG5leHBvcnRzLlNUT1JFID0ge1xuICAgIG1hZ2ljOiBcIlxceDAwXFx4MDBcIixcbiAgICAvLyBjb21wcmVzc1dvcmtlciA6IGZ1bmN0aW9uIChjb21wcmVzc2lvbk9wdGlvbnMpIHtcbiAgICAvLyAgICAgcmV0dXJuIG5ldyBHZW5lcmljV29ya2VyKFwiU1RPUkUgY29tcHJlc3Npb25cIik7XG4gICAgLy8gfSxcbiAgICB1bmNvbXByZXNzV29ya2VyIDogZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gbmV3IEdlbmVyaWNXb3JrZXIoXCJTVE9SRSBkZWNvbXByZXNzaW9uXCIpO1xuICAgIH1cbn07XG5leHBvcnRzLkRFRkxBVEUgPSByZXF1aXJlKCcuL2ZsYXRlJyk7XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciB1dGlscyA9IHJlcXVpcmUoJy4vdXRpbHMnKTtcblxuLyoqXG4gKiBUaGUgZm9sbG93aW5nIGZ1bmN0aW9ucyBjb21lIGZyb20gcGFrbywgZnJvbSBwYWtvL2xpYi96bGliL2NyYzMyLmpzXG4gKiByZWxlYXNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UsIHNlZSBwYWtvIGh0dHBzOi8vZ2l0aHViLmNvbS9ub2RlY2EvcGFrby9cbiAqL1xuXG4vLyBVc2Ugb3JkaW5hcnkgYXJyYXksIHNpbmNlIHVudHlwZWQgbWFrZXMgbm8gYm9vc3QgaGVyZVxuZnVuY3Rpb24gbWFrZVRhYmxlKCkge1xuICAgIHZhciBjLCB0YWJsZSA9IFtdO1xuXG4gICAgZm9yKHZhciBuID0wOyBuIDwgMjU2OyBuKyspe1xuICAgICAgICBjID0gbjtcbiAgICAgICAgZm9yKHZhciBrID0wOyBrIDwgODsgaysrKXtcbiAgICAgICAgICAgIGMgPSAoKGMmMSkgPyAoMHhFREI4ODMyMCBeIChjID4+PiAxKSkgOiAoYyA+Pj4gMSkpO1xuICAgICAgICB9XG4gICAgICAgIHRhYmxlW25dID0gYztcbiAgICB9XG5cbiAgICByZXR1cm4gdGFibGU7XG59XG5cbi8vIENyZWF0ZSB0YWJsZSBvbiBsb2FkLiBKdXN0IDI1NSBzaWduZWQgbG9uZ3MuIE5vdCBhIHByb2JsZW0uXG52YXIgY3JjVGFibGUgPSBtYWtlVGFibGUoKTtcblxuXG5mdW5jdGlvbiBjcmMzMihjcmMsIGJ1ZiwgbGVuLCBwb3MpIHtcbiAgICB2YXIgdCA9IGNyY1RhYmxlLCBlbmQgPSBwb3MgKyBsZW47XG5cbiAgICBjcmMgPSBjcmMgXiAoLTEpO1xuXG4gICAgZm9yICh2YXIgaSA9IHBvczsgaSA8IGVuZDsgaSsrICkge1xuICAgICAgICBjcmMgPSAoY3JjID4+PiA4KSBeIHRbKGNyYyBeIGJ1ZltpXSkgJiAweEZGXTtcbiAgICB9XG5cbiAgICByZXR1cm4gKGNyYyBeICgtMSkpOyAvLyA+Pj4gMDtcbn1cblxuLy8gVGhhdCdzIGFsbCBmb3IgdGhlIHBha28gZnVuY3Rpb25zLlxuXG4vKipcbiAqIENvbXB1dGUgdGhlIGNyYzMyIG9mIGEgc3RyaW5nLlxuICogVGhpcyBpcyBhbG1vc3QgdGhlIHNhbWUgYXMgdGhlIGZ1bmN0aW9uIGNyYzMyLCBidXQgZm9yIHN0cmluZ3MuIFVzaW5nIHRoZVxuICogc2FtZSBmdW5jdGlvbiBmb3IgdGhlIHR3byB1c2UgY2FzZXMgbGVhZHMgdG8gaG9ycmlibGUgcGVyZm9ybWFuY2VzLlxuICogQHBhcmFtIHtOdW1iZXJ9IGNyYyB0aGUgc3RhcnRpbmcgdmFsdWUgb2YgdGhlIGNyYy5cbiAqIEBwYXJhbSB7U3RyaW5nfSBzdHIgdGhlIHN0cmluZyB0byB1c2UuXG4gKiBAcGFyYW0ge051bWJlcn0gbGVuIHRoZSBsZW5ndGggb2YgdGhlIHN0cmluZy5cbiAqIEBwYXJhbSB7TnVtYmVyfSBwb3MgdGhlIHN0YXJ0aW5nIHBvc2l0aW9uIGZvciB0aGUgY3JjMzIgY29tcHV0YXRpb24uXG4gKiBAcmV0dXJuIHtOdW1iZXJ9IHRoZSBjb21wdXRlZCBjcmMzMi5cbiAqL1xuZnVuY3Rpb24gY3JjMzJzdHIoY3JjLCBzdHIsIGxlbiwgcG9zKSB7XG4gICAgdmFyIHQgPSBjcmNUYWJsZSwgZW5kID0gcG9zICsgbGVuO1xuXG4gICAgY3JjID0gY3JjIF4gKC0xKTtcblxuICAgIGZvciAodmFyIGkgPSBwb3M7IGkgPCBlbmQ7IGkrKyApIHtcbiAgICAgICAgY3JjID0gKGNyYyA+Pj4gOCkgXiB0WyhjcmMgXiBzdHIuY2hhckNvZGVBdChpKSkgJiAweEZGXTtcbiAgICB9XG5cbiAgICByZXR1cm4gKGNyYyBeICgtMSkpOyAvLyA+Pj4gMDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbiBjcmMzMndyYXBwZXIoaW5wdXQsIGNyYykge1xuICAgIGlmICh0eXBlb2YgaW5wdXQgPT09IFwidW5kZWZpbmVkXCIgfHwgIWlucHV0Lmxlbmd0aCkge1xuICAgICAgICByZXR1cm4gMDtcbiAgICB9XG5cbiAgICB2YXIgaXNBcnJheSA9IHV0aWxzLmdldFR5cGVPZihpbnB1dCkgIT09IFwic3RyaW5nXCI7XG5cbiAgICBpZihpc0FycmF5KSB7XG4gICAgICAgIHJldHVybiBjcmMzMihjcmN8MCwgaW5wdXQsIGlucHV0Lmxlbmd0aCwgMCk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgcmV0dXJuIGNyYzMyc3RyKGNyY3wwLCBpbnB1dCwgaW5wdXQubGVuZ3RoLCAwKTtcbiAgICB9XG59O1xuLy8gdmltOiBzZXQgc2hpZnR3aWR0aD00IHNvZnR0YWJzdG9wPTQ6XG4iLCIndXNlIHN0cmljdCc7XG5leHBvcnRzLmJhc2U2NCA9IGZhbHNlO1xuZXhwb3J0cy5iaW5hcnkgPSBmYWxzZTtcbmV4cG9ydHMuZGlyID0gZmFsc2U7XG5leHBvcnRzLmNyZWF0ZUZvbGRlcnMgPSB0cnVlO1xuZXhwb3J0cy5kYXRlID0gbnVsbDtcbmV4cG9ydHMuY29tcHJlc3Npb24gPSBudWxsO1xuZXhwb3J0cy5jb21wcmVzc2lvbk9wdGlvbnMgPSBudWxsO1xuZXhwb3J0cy5jb21tZW50ID0gbnVsbDtcbmV4cG9ydHMudW5peFBlcm1pc3Npb25zID0gbnVsbDtcbmV4cG9ydHMuZG9zUGVybWlzc2lvbnMgPSBudWxsO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG4vLyB2YXIgRVM2UHJvbWlzZSA9IHJlcXVpcmUoXCJlczYtcHJvbWlzZVwiKS5Qcm9taXNlO1xuXG4vKipcbiAqIExldCB0aGUgdXNlciB1c2UvY2hhbmdlIHNvbWUgaW1wbGVtZW50YXRpb25zLlxuICovXG5tb2R1bGUuZXhwb3J0cyA9IHtcbiAgICBQcm9taXNlOiB3aW5kb3cuUHJvbWlzZVxufTtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBVU0VfVFlQRURBUlJBWSA9ICh0eXBlb2YgVWludDhBcnJheSAhPT0gJ3VuZGVmaW5lZCcpICYmICh0eXBlb2YgVWludDE2QXJyYXkgIT09ICd1bmRlZmluZWQnKSAmJiAodHlwZW9mIFVpbnQzMkFycmF5ICE9PSAndW5kZWZpbmVkJyk7XG5cbnZhciBwYWtvID0gcmVxdWlyZShcInBha29cIik7XG52YXIgdXRpbHMgPSByZXF1aXJlKFwiLi91dGlsc1wiKTtcbnZhciBHZW5lcmljV29ya2VyID0gcmVxdWlyZShcIi4vc3RyZWFtL0dlbmVyaWNXb3JrZXJcIik7XG5cbnZhciBBUlJBWV9UWVBFID0gVVNFX1RZUEVEQVJSQVkgPyBcInVpbnQ4YXJyYXlcIiA6IFwiYXJyYXlcIjtcblxuZXhwb3J0cy5tYWdpYyA9IFwiXFx4MDhcXHgwMFwiO1xuXG4vKipcbiAqIENyZWF0ZSBhIHdvcmtlciB0aGF0IHVzZXMgcGFrbyB0byBpbmZsYXRlL2RlZmxhdGUuXG4gKiBAY29uc3RydWN0b3JcbiAqIEBwYXJhbSB7U3RyaW5nfSBhY3Rpb24gdGhlIG5hbWUgb2YgdGhlIHBha28gZnVuY3Rpb24gdG8gY2FsbCA6IGVpdGhlciBcIkRlZmxhdGVcIiBvciBcIkluZmxhdGVcIi5cbiAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIHRoZSBvcHRpb25zIHRvIHVzZSB3aGVuIChkZSljb21wcmVzc2luZy5cbiAqL1xuZnVuY3Rpb24gRmxhdGVXb3JrZXIoYWN0aW9uLCBvcHRpb25zKSB7XG4gICAgR2VuZXJpY1dvcmtlci5jYWxsKHRoaXMsIFwiRmxhdGVXb3JrZXIvXCIgKyBhY3Rpb24pO1xuXG4gICAgdGhpcy5fcGFrbyA9IG5ldyBwYWtvW2FjdGlvbl0oe1xuICAgICAgICByYXc6dHJ1ZSxcbiAgICAgICAgbGV2ZWwgOiBvcHRpb25zLmxldmVsIHx8IC0xIC8vIGRlZmF1bHQgY29tcHJlc3Npb25cbiAgICB9KTtcbiAgICAvLyB0aGUgYG1ldGFgIG9iamVjdCBmcm9tIHRoZSBsYXN0IGNodW5rIHJlY2VpdmVkXG4gICAgLy8gdGhpcyBhbGxvdyB0aGlzIHdvcmtlciB0byBwYXNzIGFyb3VuZCBtZXRhZGF0YVxuICAgIHRoaXMubWV0YSA9IHt9O1xuXG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIHRoaXMuX3Bha28ub25EYXRhID0gZnVuY3Rpb24oZGF0YSkge1xuICAgICAgICBzZWxmLnB1c2goe1xuICAgICAgICAgICAgZGF0YSA6IGRhdGEsXG4gICAgICAgICAgICBtZXRhIDogc2VsZi5tZXRhXG4gICAgICAgIH0pO1xuICAgIH07XG59XG5cbnV0aWxzLmluaGVyaXRzKEZsYXRlV29ya2VyLCBHZW5lcmljV29ya2VyKTtcblxuLyoqXG4gKiBAc2VlIEdlbmVyaWNXb3JrZXIucHJvY2Vzc0NodW5rXG4gKi9cbkZsYXRlV29ya2VyLnByb3RvdHlwZS5wcm9jZXNzQ2h1bmsgPSBmdW5jdGlvbiAoY2h1bmspIHtcbiAgICB0aGlzLm1ldGEgPSBjaHVuay5tZXRhO1xuICAgIHRoaXMuX3Bha28ucHVzaCh1dGlscy50cmFuc2Zvcm1UbyhBUlJBWV9UWVBFLCBjaHVuay5kYXRhKSwgZmFsc2UpO1xufTtcblxuLyoqXG4gKiBAc2VlIEdlbmVyaWNXb3JrZXIuZmx1c2hcbiAqL1xuRmxhdGVXb3JrZXIucHJvdG90eXBlLmZsdXNoID0gZnVuY3Rpb24gKCkge1xuICAgIEdlbmVyaWNXb3JrZXIucHJvdG90eXBlLmZsdXNoLmNhbGwodGhpcyk7XG4gICAgdGhpcy5fcGFrby5wdXNoKFtdLCB0cnVlKTtcbn07XG4vKipcbiAqIEBzZWUgR2VuZXJpY1dvcmtlci5jbGVhblVwXG4gKi9cbkZsYXRlV29ya2VyLnByb3RvdHlwZS5jbGVhblVwID0gZnVuY3Rpb24gKCkge1xuICAgIEdlbmVyaWNXb3JrZXIucHJvdG90eXBlLmNsZWFuVXAuY2FsbCh0aGlzKTtcbiAgICB0aGlzLl9wYWtvID0gbnVsbDtcbn07XG5cbmV4cG9ydHMuY29tcHJlc3NXb3JrZXIgPSBmdW5jdGlvbiAoY29tcHJlc3Npb25PcHRpb25zKSB7XG4gICAgcmV0dXJuIG5ldyBGbGF0ZVdvcmtlcihcIkRlZmxhdGVcIiwgY29tcHJlc3Npb25PcHRpb25zKTtcbn07XG5leHBvcnRzLnVuY29tcHJlc3NXb3JrZXIgPSBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIG5ldyBGbGF0ZVdvcmtlcihcIkluZmxhdGVcIiwge30pO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcblxuLyoqXG4gKiBSZXByZXNlbnRhdGlvbiBhIG9mIHppcCBmaWxlIGluIGpzXG4gKiBAY29uc3RydWN0b3JcbiAqL1xuZnVuY3Rpb24gSlNaaXAoKSB7XG4gICAgLy8gaWYgdGhpcyBjb25zdHJ1Y3RvciBpc8KgdXNlZCB3aXRob3V0wqBgbmV3YCwgaXTCoGFkZHMgYG5ld2AgYmVmb3JlwqBpdHNlbGY6XG4gICAgaWYoISh0aGlzIGluc3RhbmNlb2YgSlNaaXApKSB7XG4gICAgICAgIHJldHVybiBuZXcgSlNaaXAoKTtcbiAgICB9XG5cbiAgICBpZihhcmd1bWVudHMubGVuZ3RoKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIlRoZSBjb25zdHJ1Y3RvciB3aXRoIHBhcmFtZXRlcnMgaGFzIGJlZW4gcmVtb3ZlZCBpbiBKU1ppcCAzLjAsIHBsZWFzZSBjaGVjayB0aGUgdXBncmFkZSBndWlkZS5cIik7XG4gICAgfVxuXG4gICAgLy8gb2JqZWN0IGNvbnRhaW5pbmcgdGhlIGZpbGVzIDpcbiAgICAvLyB7XG4gICAgLy8gICBcImZvbGRlci9cIiA6IHsuLi59LFxuICAgIC8vICAgXCJmb2xkZXIvZGF0YS50eHRcIiA6IHsuLi59XG4gICAgLy8gfVxuICAgIHRoaXMuZmlsZXMgPSB7fTtcblxuICAgIHRoaXMuY29tbWVudCA9IG51bGw7XG5cbiAgICAvLyBXaGVyZSB3ZSBhcmUgaW4gdGhlIGhpZXJhcmNoeVxuICAgIHRoaXMucm9vdCA9IFwiXCI7XG4gICAgdGhpcy5jbG9uZSA9IGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgbmV3T2JqID0gbmV3IEpTWmlwKCk7XG4gICAgICAgIGZvciAodmFyIGkgaW4gdGhpcykge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiB0aGlzW2ldICE9PSBcImZ1bmN0aW9uXCIpIHtcbiAgICAgICAgICAgICAgICBuZXdPYmpbaV0gPSB0aGlzW2ldO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBuZXdPYmo7XG4gICAgfTtcbn1cbkpTWmlwLnByb3RvdHlwZSA9IHJlcXVpcmUoJy4vb2JqZWN0Jyk7XG5KU1ppcC5wcm90b3R5cGUubG9hZEFzeW5jID0gcmVxdWlyZSgnLi9sb2FkJyk7XG5KU1ppcC5zdXBwb3J0ID0gcmVxdWlyZSgnLi9zdXBwb3J0Jyk7XG5KU1ppcC5kZWZhdWx0cyA9IHJlcXVpcmUoJy4vZGVmYXVsdHMnKTtcblxuSlNaaXAubG9hZEFzeW5jID0gZnVuY3Rpb24gKGNvbnRlbnQsIG9wdGlvbnMpIHtcbiAgICByZXR1cm4gbmV3IEpTWmlwKCkubG9hZEFzeW5jKGNvbnRlbnQsIG9wdGlvbnMpO1xufTtcblxuSlNaaXAuZXh0ZXJuYWwgPSByZXF1aXJlKFwiLi9leHRlcm5hbFwiKTtcbm1vZHVsZS5leHBvcnRzID0gSlNaaXA7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgdXRpbHMgPSByZXF1aXJlKCcuL3V0aWxzJyk7XG52YXIgZXh0ZXJuYWwgPSByZXF1aXJlKFwiLi9leHRlcm5hbFwiKTtcbnZhciB1dGY4ID0gcmVxdWlyZSgnLi91dGY4Jyk7XG52YXIgdXRpbHMgPSByZXF1aXJlKCcuL3V0aWxzJyk7XG52YXIgWmlwRW50cmllcyA9IHJlcXVpcmUoJy4vemlwRW50cmllcycpO1xudmFyIENyYzMyUHJvYmUgPSByZXF1aXJlKCcuL3N0cmVhbS9DcmMzMlByb2JlJyk7XG52YXIgbm9kZWpzVXRpbHMgPSByZXF1aXJlKFwiLi9ub2RlanNVdGlsc1wiKTtcblxuLyoqXG4gKiBDaGVjayB0aGUgQ1JDMzIgb2YgYW4gZW50cnkuXG4gKiBAcGFyYW0ge1ppcEVudHJ5fSB6aXBFbnRyeSB0aGUgemlwIGVudHJ5IHRvIGNoZWNrLlxuICogQHJldHVybiB7UHJvbWlzZX0gdGhlIHJlc3VsdC5cbiAqL1xuZnVuY3Rpb24gY2hlY2tFbnRyeUNSQzMyKHppcEVudHJ5KSB7XG4gICAgcmV0dXJuIG5ldyBleHRlcm5hbC5Qcm9taXNlKGZ1bmN0aW9uIChyZXNvbHZlLCByZWplY3QpIHtcbiAgICAgICAgdmFyIHdvcmtlciA9IHppcEVudHJ5LmRlY29tcHJlc3NlZC5nZXRDb250ZW50V29ya2VyKCkucGlwZShuZXcgQ3JjMzJQcm9iZSgpKTtcbiAgICAgICAgd29ya2VyLm9uKFwiZXJyb3JcIiwgZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICAgIHJlamVjdChlKTtcbiAgICAgICAgfSlcbiAgICAgICAgLm9uKFwiZW5kXCIsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIGlmICh3b3JrZXIuc3RyZWFtSW5mby5jcmMzMiAhPT0gemlwRW50cnkuZGVjb21wcmVzc2VkLmNyYzMyKSB7XG4gICAgICAgICAgICAgICAgcmVqZWN0KG5ldyBFcnJvcihcIkNvcnJ1cHRlZCB6aXAgOiBDUkMzMiBtaXNtYXRjaFwiKSk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHJlc29sdmUoKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICAgICAgLnJlc3VtZSgpO1xuICAgIH0pO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uKGRhdGEsIG9wdGlvbnMpIHtcbiAgICB2YXIgemlwID0gdGhpcztcbiAgICBvcHRpb25zID0gdXRpbHMuZXh0ZW5kKG9wdGlvbnMgfHwge30sIHtcbiAgICAgICAgYmFzZTY0OiBmYWxzZSxcbiAgICAgICAgY2hlY2tDUkMzMjogZmFsc2UsXG4gICAgICAgIG9wdGltaXplZEJpbmFyeVN0cmluZzogZmFsc2UsXG4gICAgICAgIGNyZWF0ZUZvbGRlcnM6IGZhbHNlLFxuICAgICAgICBkZWNvZGVGaWxlTmFtZTogdXRmOC51dGY4ZGVjb2RlXG4gICAgfSk7XG5cbiAgICBpZiAobm9kZWpzVXRpbHMuaXNOb2RlICYmIG5vZGVqc1V0aWxzLmlzU3RyZWFtKGRhdGEpKSB7XG4gICAgICAgIHJldHVybiBleHRlcm5hbC5Qcm9taXNlLnJlamVjdChuZXcgRXJyb3IoXCJKU1ppcCBjYW4ndCBhY2NlcHQgYSBzdHJlYW0gd2hlbiBsb2FkaW5nIGEgemlwIGZpbGUuXCIpKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdXRpbHMucHJlcGFyZUNvbnRlbnQoXCJ0aGUgbG9hZGVkIHppcCBmaWxlXCIsIGRhdGEsIHRydWUsIG9wdGlvbnMub3B0aW1pemVkQmluYXJ5U3RyaW5nLCBvcHRpb25zLmJhc2U2NClcbiAgICAudGhlbihmdW5jdGlvbihkYXRhKSB7XG4gICAgICAgIHZhciB6aXBFbnRyaWVzID0gbmV3IFppcEVudHJpZXMob3B0aW9ucyk7XG4gICAgICAgIHppcEVudHJpZXMubG9hZChkYXRhKTtcbiAgICAgICAgcmV0dXJuIHppcEVudHJpZXM7XG4gICAgfSkudGhlbihmdW5jdGlvbiBjaGVja0NSQzMyKHppcEVudHJpZXMpIHtcbiAgICAgICAgdmFyIHByb21pc2VzID0gW2V4dGVybmFsLlByb21pc2UucmVzb2x2ZSh6aXBFbnRyaWVzKV07XG4gICAgICAgIHZhciBmaWxlcyA9IHppcEVudHJpZXMuZmlsZXM7XG4gICAgICAgIGlmIChvcHRpb25zLmNoZWNrQ1JDMzIpIHtcbiAgICAgICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZmlsZXMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBwcm9taXNlcy5wdXNoKGNoZWNrRW50cnlDUkMzMihmaWxlc1tpXSkpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBleHRlcm5hbC5Qcm9taXNlLmFsbChwcm9taXNlcyk7XG4gICAgfSkudGhlbihmdW5jdGlvbiBhZGRGaWxlcyhyZXN1bHRzKSB7XG4gICAgICAgIHZhciB6aXBFbnRyaWVzID0gcmVzdWx0cy5zaGlmdCgpO1xuICAgICAgICB2YXIgZmlsZXMgPSB6aXBFbnRyaWVzLmZpbGVzO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGZpbGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICB2YXIgaW5wdXQgPSBmaWxlc1tpXTtcbiAgICAgICAgICAgIHppcC5maWxlKGlucHV0LmZpbGVOYW1lU3RyLCBpbnB1dC5kZWNvbXByZXNzZWQsIHtcbiAgICAgICAgICAgICAgICBiaW5hcnk6IHRydWUsXG4gICAgICAgICAgICAgICAgb3B0aW1pemVkQmluYXJ5U3RyaW5nOiB0cnVlLFxuICAgICAgICAgICAgICAgIGRhdGU6IGlucHV0LmRhdGUsXG4gICAgICAgICAgICAgICAgZGlyOiBpbnB1dC5kaXIsXG4gICAgICAgICAgICAgICAgY29tbWVudCA6IGlucHV0LmZpbGVDb21tZW50U3RyLmxlbmd0aCA/IGlucHV0LmZpbGVDb21tZW50U3RyIDogbnVsbCxcbiAgICAgICAgICAgICAgICB1bml4UGVybWlzc2lvbnMgOiBpbnB1dC51bml4UGVybWlzc2lvbnMsXG4gICAgICAgICAgICAgICAgZG9zUGVybWlzc2lvbnMgOiBpbnB1dC5kb3NQZXJtaXNzaW9ucyxcbiAgICAgICAgICAgICAgICBjcmVhdGVGb2xkZXJzOiBvcHRpb25zLmNyZWF0ZUZvbGRlcnNcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGlmICh6aXBFbnRyaWVzLnppcENvbW1lbnQubGVuZ3RoKSB7XG4gICAgICAgICAgICB6aXAuY29tbWVudCA9IHppcEVudHJpZXMuemlwQ29tbWVudDtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB6aXA7XG4gICAgfSk7XG59O1xuIiwiXCJ1c2Ugc3RyaWN0XCI7XG5cbnZhciB1dGlscyA9IHJlcXVpcmUoJy4uL3V0aWxzJyk7XG52YXIgR2VuZXJpY1dvcmtlciA9IHJlcXVpcmUoJy4uL3N0cmVhbS9HZW5lcmljV29ya2VyJyk7XG5cbi8qKlxuICogQSB3b3JrZXIgdGhhdCB1c2UgYSBub2RlanMgc3RyZWFtIGFzIHNvdXJjZS5cbiAqIEBjb25zdHJ1Y3RvclxuICogQHBhcmFtIHtTdHJpbmd9IGZpbGVuYW1lIHRoZSBuYW1lIG9mIHRoZSBmaWxlIGVudHJ5IGZvciB0aGlzIHN0cmVhbS5cbiAqIEBwYXJhbSB7UmVhZGFibGV9IHN0cmVhbSB0aGUgbm9kZWpzIHN0cmVhbS5cbiAqL1xuZnVuY3Rpb24gTm9kZWpzU3RyZWFtSW5wdXRBZGFwdGVyKGZpbGVuYW1lLCBzdHJlYW0pIHtcbiAgICBHZW5lcmljV29ya2VyLmNhbGwodGhpcywgXCJOb2RlanMgc3RyZWFtIGlucHV0IGFkYXB0ZXIgZm9yIFwiICsgZmlsZW5hbWUpO1xuICAgIHRoaXMuX3Vwc3RyZWFtRW5kZWQgPSBmYWxzZTtcbiAgICB0aGlzLl9iaW5kU3RyZWFtKHN0cmVhbSk7XG59XG5cbnV0aWxzLmluaGVyaXRzKE5vZGVqc1N0cmVhbUlucHV0QWRhcHRlciwgR2VuZXJpY1dvcmtlcik7XG5cbi8qKlxuICogUHJlcGFyZSB0aGUgc3RyZWFtIGFuZCBiaW5kIHRoZSBjYWxsYmFja3Mgb24gaXQuXG4gKiBEbyB0aGlzIEFTQVAgb24gbm9kZSAwLjEwICEgQSBsYXp5IGJpbmRpbmcgZG9lc24ndCBhbHdheXMgd29yay5cbiAqIEBwYXJhbSB7U3RyZWFtfSBzdHJlYW0gdGhlIG5vZGVqcyBzdHJlYW0gdG8gdXNlLlxuICovXG5Ob2RlanNTdHJlYW1JbnB1dEFkYXB0ZXIucHJvdG90eXBlLl9iaW5kU3RyZWFtID0gZnVuY3Rpb24gKHN0cmVhbSkge1xuICAgIHZhciBzZWxmID0gdGhpcztcbiAgICB0aGlzLl9zdHJlYW0gPSBzdHJlYW07XG4gICAgc3RyZWFtLnBhdXNlKCk7XG4gICAgc3RyZWFtXG4gICAgLm9uKFwiZGF0YVwiLCBmdW5jdGlvbiAoY2h1bmspIHtcbiAgICAgICAgc2VsZi5wdXNoKHtcbiAgICAgICAgICAgIGRhdGE6IGNodW5rLFxuICAgICAgICAgICAgbWV0YSA6IHtcbiAgICAgICAgICAgICAgICBwZXJjZW50IDogMFxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9KVxuICAgIC5vbihcImVycm9yXCIsIGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIGlmKHNlbGYuaXNQYXVzZWQpIHtcbiAgICAgICAgICAgIHRoaXMuZ2VuZXJhdGVkRXJyb3IgPSBlO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgc2VsZi5lcnJvcihlKTtcbiAgICAgICAgfVxuICAgIH0pXG4gICAgLm9uKFwiZW5kXCIsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYoc2VsZi5pc1BhdXNlZCkge1xuICAgICAgICAgICAgc2VsZi5fdXBzdHJlYW1FbmRlZCA9IHRydWU7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBzZWxmLmVuZCgpO1xuICAgICAgICB9XG4gICAgfSk7XG59O1xuTm9kZWpzU3RyZWFtSW5wdXRBZGFwdGVyLnByb3RvdHlwZS5wYXVzZSA9IGZ1bmN0aW9uICgpIHtcbiAgICBpZighR2VuZXJpY1dvcmtlci5wcm90b3R5cGUucGF1c2UuY2FsbCh0aGlzKSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHRoaXMuX3N0cmVhbS5wYXVzZSgpO1xuICAgIHJldHVybiB0cnVlO1xufTtcbk5vZGVqc1N0cmVhbUlucHV0QWRhcHRlci5wcm90b3R5cGUucmVzdW1lID0gZnVuY3Rpb24gKCkge1xuICAgIGlmKCFHZW5lcmljV29ya2VyLnByb3RvdHlwZS5yZXN1bWUuY2FsbCh0aGlzKSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgaWYodGhpcy5fdXBzdHJlYW1FbmRlZCkge1xuICAgICAgICB0aGlzLmVuZCgpO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMuX3N0cmVhbS5yZXN1bWUoKTtcbiAgICB9XG5cbiAgICByZXR1cm4gdHJ1ZTtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gTm9kZWpzU3RyZWFtSW5wdXRBZGFwdGVyO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgUmVhZGFibGUgPSByZXF1aXJlKCdyZWFkYWJsZS1zdHJlYW0nKS5SZWFkYWJsZTtcblxudmFyIHV0aWwgPSByZXF1aXJlKCd1dGlsJyk7XG51dGlsLmluaGVyaXRzKE5vZGVqc1N0cmVhbU91dHB1dEFkYXB0ZXIsIFJlYWRhYmxlKTtcblxuLyoqXG4qIEEgbm9kZWpzIHN0cmVhbSB1c2luZyBhIHdvcmtlciBhcyBzb3VyY2UuXG4qIEBzZWUgdGhlIFNvdXJjZVdyYXBwZXIgaW4gaHR0cDovL25vZGVqcy5vcmcvYXBpL3N0cmVhbS5odG1sXG4qIEBjb25zdHJ1Y3RvclxuKiBAcGFyYW0ge1N0cmVhbUhlbHBlcn0gaGVscGVyIHRoZSBoZWxwZXIgd3JhcHBpbmcgdGhlIHdvcmtlclxuKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucyB0aGUgbm9kZWpzIHN0cmVhbSBvcHRpb25zXG4qIEBwYXJhbSB7RnVuY3Rpb259IHVwZGF0ZUNiIHRoZSB1cGRhdGUgY2FsbGJhY2suXG4qL1xuZnVuY3Rpb24gTm9kZWpzU3RyZWFtT3V0cHV0QWRhcHRlcihoZWxwZXIsIG9wdGlvbnMsIHVwZGF0ZUNiKSB7XG4gICAgUmVhZGFibGUuY2FsbCh0aGlzLCBvcHRpb25zKTtcbiAgICB0aGlzLl9oZWxwZXIgPSBoZWxwZXI7XG5cbiAgICB2YXIgc2VsZiA9IHRoaXM7XG4gICAgaGVscGVyLm9uKFwiZGF0YVwiLCBmdW5jdGlvbiAoZGF0YSwgbWV0YSkge1xuICAgICAgICBpZiAoIXNlbGYucHVzaChkYXRhKSkge1xuICAgICAgICAgICAgc2VsZi5faGVscGVyLnBhdXNlKCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYodXBkYXRlQ2IpIHtcbiAgICAgICAgICAgIHVwZGF0ZUNiKG1ldGEpO1xuICAgICAgICB9XG4gICAgfSlcbiAgICAub24oXCJlcnJvclwiLCBmdW5jdGlvbihlKSB7XG4gICAgICAgIHNlbGYuZW1pdCgnZXJyb3InLCBlKTtcbiAgICB9KVxuICAgIC5vbihcImVuZFwiLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHNlbGYucHVzaChudWxsKTtcbiAgICB9KTtcbn1cblxuXG5Ob2RlanNTdHJlYW1PdXRwdXRBZGFwdGVyLnByb3RvdHlwZS5fcmVhZCA9IGZ1bmN0aW9uKCkge1xuICAgIHRoaXMuX2hlbHBlci5yZXN1bWUoKTtcbn07XG5cbm1vZHVsZS5leHBvcnRzID0gTm9kZWpzU3RyZWFtT3V0cHV0QWRhcHRlcjtcbiIsIid1c2Ugc3RyaWN0JztcblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gICAgLyoqXG4gICAgICogVHJ1ZSBpZiB0aGlzIGlzIHJ1bm5pbmcgaW4gTm9kZWpzLCB3aWxsIGJlIHVuZGVmaW5lZCBpbiBhIGJyb3dzZXIuXG4gICAgICogSW4gYSBicm93c2VyLCBicm93c2VyaWZ5IHdvbid0IGluY2x1ZGUgdGhpcyBmaWxlIGFuZCB0aGUgd2hvbGUgbW9kdWxlXG4gICAgICogd2lsbCBiZSByZXNvbHZlZCBhbiBlbXB0eSBvYmplY3QuXG4gICAgICovXG4gICAgaXNOb2RlIDogdHlwZW9mIEJ1ZmZlciAhPT0gXCJ1bmRlZmluZWRcIixcbiAgICAvKipcbiAgICAgKiBDcmVhdGUgYSBuZXcgbm9kZWpzIEJ1ZmZlci5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gZGF0YSB0aGUgZGF0YSB0byBwYXNzIHRvIHRoZSBjb25zdHJ1Y3Rvci5cbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gZW5jb2RpbmcgdGhlIGVuY29kaW5nIHRvIHVzZS5cbiAgICAgKiBAcmV0dXJuIHtCdWZmZXJ9IGEgbmV3IEJ1ZmZlci5cbiAgICAgKi9cbiAgICBuZXdCdWZmZXIgOiBmdW5jdGlvbihkYXRhLCBlbmNvZGluZyl7XG4gICAgICAgIHJldHVybiBuZXcgQnVmZmVyKGRhdGEsIGVuY29kaW5nKTtcbiAgICB9LFxuICAgIC8qKlxuICAgICAqIEZpbmQgb3V0IGlmIGFuIG9iamVjdCBpcyBhIEJ1ZmZlci5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gYiB0aGUgb2JqZWN0IHRvIHRlc3QuXG4gICAgICogQHJldHVybiB7Qm9vbGVhbn0gdHJ1ZSBpZiB0aGUgb2JqZWN0IGlzIGEgQnVmZmVyLCBmYWxzZSBvdGhlcndpc2UuXG4gICAgICovXG4gICAgaXNCdWZmZXIgOiBmdW5jdGlvbihiKXtcbiAgICAgICAgcmV0dXJuIEJ1ZmZlci5pc0J1ZmZlcihiKTtcbiAgICB9LFxuXG4gICAgaXNTdHJlYW0gOiBmdW5jdGlvbiAob2JqKSB7XG4gICAgICAgIHJldHVybiBvYmogJiZcbiAgICAgICAgICAgIHR5cGVvZiBvYmoub24gPT09IFwiZnVuY3Rpb25cIiAmJlxuICAgICAgICAgICAgdHlwZW9mIG9iai5wYXVzZSA9PT0gXCJmdW5jdGlvblwiICYmXG4gICAgICAgICAgICB0eXBlb2Ygb2JqLnJlc3VtZSA9PT0gXCJmdW5jdGlvblwiO1xuICAgIH1cbn07XG4iLCIndXNlIHN0cmljdCc7XG4vLyB2YXIgdXRmOCA9IHJlcXVpcmUoJy4vdXRmOCcpO1xudmFyIHV0aWxzID0gcmVxdWlyZSgnLi91dGlscycpO1xudmFyIEdlbmVyaWNXb3JrZXIgPSByZXF1aXJlKCcuL3N0cmVhbS9HZW5lcmljV29ya2VyJyk7XG4vLyB2YXIgU3RyZWFtSGVscGVyID0gcmVxdWlyZSgnLi9zdHJlYW0vU3RyZWFtSGVscGVyJyk7XG52YXIgZGVmYXVsdHMgPSByZXF1aXJlKCcuL2RlZmF1bHRzJyk7XG52YXIgQ29tcHJlc3NlZE9iamVjdCA9IHJlcXVpcmUoJy4vY29tcHJlc3NlZE9iamVjdCcpO1xudmFyIFppcE9iamVjdCA9IHJlcXVpcmUoJy4vemlwT2JqZWN0Jyk7XG4vLyB2YXIgZ2VuZXJhdGUgPSByZXF1aXJlKFwiLi9nZW5lcmF0ZVwiKTtcbnZhciBub2RlanNVdGlscyA9IHJlcXVpcmUoXCIuL25vZGVqc1V0aWxzXCIpO1xudmFyIE5vZGVqc1N0cmVhbUlucHV0QWRhcHRlciA9IHJlcXVpcmUoXCIuL25vZGVqcy9Ob2RlanNTdHJlYW1JbnB1dEFkYXB0ZXJcIik7XG5cblxuLyoqXG4gKiBBZGQgYSBmaWxlIGluIHRoZSBjdXJyZW50IGZvbGRlci5cbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge3N0cmluZ30gbmFtZSB0aGUgbmFtZSBvZiB0aGUgZmlsZVxuICogQHBhcmFtIHtTdHJpbmd8QXJyYXlCdWZmZXJ8VWludDhBcnJheXxCdWZmZXJ9IGRhdGEgdGhlIGRhdGEgb2YgdGhlIGZpbGVcbiAqIEBwYXJhbSB7T2JqZWN0fSBvIHRoZSBvcHRpb25zIG9mIHRoZSBmaWxlXG4gKiBAcmV0dXJuIHtPYmplY3R9IHRoZSBuZXcgZmlsZS5cbiAqL1xudmFyIGZpbGVBZGQgPSBmdW5jdGlvbihuYW1lLCBkYXRhLCBvKSB7XG4gICAgLy8gYmUgc3VyZSBzdWIgZm9sZGVycyBleGlzdFxuICAgIHZhciBkYXRhVHlwZSA9IHV0aWxzLmdldFR5cGVPZihkYXRhKSxcbiAgICAgICAgcGFyZW50O1xuXG5cbiAgICAvKlxuICAgICAqIENvcnJlY3Qgb3B0aW9ucy5cbiAgICAgKi9cblxuICAgIG8gPSB1dGlscy5leHRlbmQobyB8fCB7fSwgZGVmYXVsdHMpO1xuICAgIG8uZGF0ZSA9IG8uZGF0ZSB8fCBuZXcgRGF0ZSgpO1xuICAgIGlmIChvLmNvbXByZXNzaW9uICE9PSBudWxsKSB7XG4gICAgICAgIG8uY29tcHJlc3Npb24gPSBvLmNvbXByZXNzaW9uLnRvVXBwZXJDYXNlKCk7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBvLnVuaXhQZXJtaXNzaW9ucyA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICBvLnVuaXhQZXJtaXNzaW9ucyA9IHBhcnNlSW50KG8udW5peFBlcm1pc3Npb25zLCA4KTtcbiAgICB9XG5cbiAgICAvLyBVTlhfSUZESVIgIDAwNDAwMDAgc2VlIHppcGluZm8uY1xuICAgIGlmIChvLnVuaXhQZXJtaXNzaW9ucyAmJiAoby51bml4UGVybWlzc2lvbnMgJiAweDQwMDApKSB7XG4gICAgICAgIG8uZGlyID0gdHJ1ZTtcbiAgICB9XG4gICAgLy8gQml0IDQgICAgRGlyZWN0b3J5XG4gICAgaWYgKG8uZG9zUGVybWlzc2lvbnMgJiYgKG8uZG9zUGVybWlzc2lvbnMgJiAweDAwMTApKSB7XG4gICAgICAgIG8uZGlyID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBpZiAoby5kaXIpIHtcbiAgICAgICAgbmFtZSA9IGZvcmNlVHJhaWxpbmdTbGFzaChuYW1lKTtcbiAgICB9XG4gICAgaWYgKG8uY3JlYXRlRm9sZGVycyAmJiAocGFyZW50ID0gcGFyZW50Rm9sZGVyKG5hbWUpKSkge1xuICAgICAgICBmb2xkZXJBZGQuY2FsbCh0aGlzLCBwYXJlbnQsIHRydWUpO1xuICAgIH1cblxuICAgIHZhciBpc1VuaWNvZGVTdHJpbmcgPSBkYXRhVHlwZSA9PT0gXCJzdHJpbmdcIiAmJiBvLmJpbmFyeSA9PT0gZmFsc2UgJiYgby5iYXNlNjQgPT09IGZhbHNlO1xuICAgIG8uYmluYXJ5ID0gIWlzVW5pY29kZVN0cmluZztcblxuXG4gICAgdmFyIGlzQ29tcHJlc3NlZEVtcHR5ID0gKGRhdGEgaW5zdGFuY2VvZiBDb21wcmVzc2VkT2JqZWN0KSAmJiBkYXRhLnVuY29tcHJlc3NlZFNpemUgPT09IDA7XG5cbiAgICBpZiAoaXNDb21wcmVzc2VkRW1wdHkgfHwgby5kaXIgfHwgIWRhdGEgfHwgZGF0YS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgby5iYXNlNjQgPSBmYWxzZTtcbiAgICAgICAgby5iaW5hcnkgPSB0cnVlO1xuICAgICAgICBkYXRhID0gXCJcIjtcbiAgICAgICAgby5jb21wcmVzc2lvbiA9IFwiU1RPUkVcIjtcbiAgICAgICAgZGF0YVR5cGUgPSBcInN0cmluZ1wiO1xuICAgIH1cblxuICAgIC8qXG4gICAgICogQ29udmVydCBjb250ZW50IHRvIGZpdC5cbiAgICAgKi9cblxuICAgIHZhciB6aXBPYmplY3RDb250ZW50ID0gbnVsbDtcbiAgICBpZiAoZGF0YSBpbnN0YW5jZW9mIENvbXByZXNzZWRPYmplY3QgfHwgZGF0YSBpbnN0YW5jZW9mIEdlbmVyaWNXb3JrZXIpIHtcbiAgICAgICAgemlwT2JqZWN0Q29udGVudCA9IGRhdGE7XG4gICAgfSBlbHNlIGlmIChub2RlanNVdGlscy5pc05vZGUgJiYgbm9kZWpzVXRpbHMuaXNTdHJlYW0oZGF0YSkpIHtcbiAgICAgICAgemlwT2JqZWN0Q29udGVudCA9IG5ldyBOb2RlanNTdHJlYW1JbnB1dEFkYXB0ZXIobmFtZSwgZGF0YSk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgemlwT2JqZWN0Q29udGVudCA9IHV0aWxzLnByZXBhcmVDb250ZW50KG5hbWUsIGRhdGEsIG8uYmluYXJ5LCBvLm9wdGltaXplZEJpbmFyeVN0cmluZywgby5iYXNlNjQpO1xuICAgIH1cblxuICAgIHZhciBvYmplY3QgPSBuZXcgWmlwT2JqZWN0KG5hbWUsIHppcE9iamVjdENvbnRlbnQsIG8pO1xuICAgIHRoaXMuZmlsZXNbbmFtZV0gPSBvYmplY3Q7XG4gICAgLypcbiAgICBUT0RPOiB3ZSBjYW4ndCB0aHJvdyBhbiBleGNlcHRpb24gYmVjYXVzZSB3ZSBoYXZlIGFzeW5jIHByb21pc2VzXG4gICAgKHdlIGNhbiBoYXZlIGEgcHJvbWlzZSBvZiBhIERhdGUoKSBmb3IgZXhhbXBsZSkgYnV0IHJldHVybmluZyBhXG4gICAgcHJvbWlzZSBpcyB1c2VsZXNzIGJlY2F1c2UgZmlsZShuYW1lLCBkYXRhKSByZXR1cm5zIHRoZSBKU1ppcFxuICAgIG9iamVjdCBmb3IgY2hhaW5pbmcuIFNob3VsZCB3ZSBicmVhayB0aGF0IHRvIGFsbG93IHRoZSB1c2VyXG4gICAgdG8gY2F0Y2ggdGhlIGVycm9yID9cblxuICAgIHJldHVybiBleHRlcm5hbC5Qcm9taXNlLnJlc29sdmUoemlwT2JqZWN0Q29udGVudClcbiAgICAudGhlbihmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBvYmplY3Q7XG4gICAgfSk7XG4gICAgKi9cbn07XG5cbi8qKlxuICogRmluZCB0aGUgcGFyZW50IGZvbGRlciBvZiB0aGUgcGF0aC5cbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0ge3N0cmluZ30gcGF0aCB0aGUgcGF0aCB0byB1c2VcbiAqIEByZXR1cm4ge3N0cmluZ30gdGhlIHBhcmVudCBmb2xkZXIsIG9yIFwiXCJcbiAqL1xudmFyIHBhcmVudEZvbGRlciA9IGZ1bmN0aW9uIChwYXRoKSB7XG4gICAgaWYgKHBhdGguc2xpY2UoLTEpID09PSAnLycpIHtcbiAgICAgICAgcGF0aCA9IHBhdGguc3Vic3RyaW5nKDAsIHBhdGgubGVuZ3RoIC0gMSk7XG4gICAgfVxuICAgIHZhciBsYXN0U2xhc2ggPSBwYXRoLmxhc3RJbmRleE9mKCcvJyk7XG4gICAgcmV0dXJuIChsYXN0U2xhc2ggPiAwKSA/IHBhdGguc3Vic3RyaW5nKDAsIGxhc3RTbGFzaCkgOiBcIlwiO1xufTtcblxuLyoqXG4gKiBSZXR1cm5zIHRoZSBwYXRoIHdpdGggYSBzbGFzaCBhdCB0aGUgZW5kLlxuICogQHByaXZhdGVcbiAqIEBwYXJhbSB7U3RyaW5nfSBwYXRoIHRoZSBwYXRoIHRvIGNoZWNrLlxuICogQHJldHVybiB7U3RyaW5nfSB0aGUgcGF0aCB3aXRoIGEgdHJhaWxpbmcgc2xhc2guXG4gKi9cbnZhciBmb3JjZVRyYWlsaW5nU2xhc2ggPSBmdW5jdGlvbihwYXRoKSB7XG4gICAgLy8gQ2hlY2sgdGhlIG5hbWUgZW5kcyB3aXRoIGEgL1xuICAgIGlmIChwYXRoLnNsaWNlKC0xKSAhPT0gXCIvXCIpIHtcbiAgICAgICAgcGF0aCArPSBcIi9cIjsgLy8gSUUgZG9lc24ndCBsaWtlIHN1YnN0cigtMSlcbiAgICB9XG4gICAgcmV0dXJuIHBhdGg7XG59O1xuXG4vKipcbiAqIEFkZCBhIChzdWIpIGZvbGRlciBpbiB0aGUgY3VycmVudCBmb2xkZXIuXG4gKiBAcHJpdmF0ZVxuICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgdGhlIGZvbGRlcidzIG5hbWVcbiAqIEBwYXJhbSB7Ym9vbGVhbj19IFtjcmVhdGVGb2xkZXJzXSBJZiB0cnVlLCBhdXRvbWF0aWNhbGx5IGNyZWF0ZSBzdWJcbiAqICBmb2xkZXJzLiBEZWZhdWx0cyB0byBmYWxzZS5cbiAqIEByZXR1cm4ge09iamVjdH0gdGhlIG5ldyBmb2xkZXIuXG4gKi9cbnZhciBmb2xkZXJBZGQgPSBmdW5jdGlvbihuYW1lLCBjcmVhdGVGb2xkZXJzKSB7XG4gICAgY3JlYXRlRm9sZGVycyA9ICh0eXBlb2YgY3JlYXRlRm9sZGVycyAhPT0gJ3VuZGVmaW5lZCcpID8gY3JlYXRlRm9sZGVycyA6IGRlZmF1bHRzLmNyZWF0ZUZvbGRlcnM7XG5cbiAgICBuYW1lID0gZm9yY2VUcmFpbGluZ1NsYXNoKG5hbWUpO1xuXG4gICAgLy8gRG9lcyB0aGlzIGZvbGRlciBhbHJlYWR5IGV4aXN0P1xuICAgIGlmICghdGhpcy5maWxlc1tuYW1lXSkge1xuICAgICAgICBmaWxlQWRkLmNhbGwodGhpcywgbmFtZSwgbnVsbCwge1xuICAgICAgICAgICAgZGlyOiB0cnVlLFxuICAgICAgICAgICAgY3JlYXRlRm9sZGVyczogY3JlYXRlRm9sZGVyc1xuICAgICAgICB9KTtcbiAgICB9XG4gICAgcmV0dXJuIHRoaXMuZmlsZXNbbmFtZV07XG59O1xuXG4vKipcbiogQ3Jvc3Mtd2luZG93LCBjcm9zcy1Ob2RlLWNvbnRleHQgcmVndWxhciBleHByZXNzaW9uIGRldGVjdGlvblxuKiBAcGFyYW0gIHtPYmplY3R9ICBvYmplY3QgQW55dGhpbmdcbiogQHJldHVybiB7Qm9vbGVhbn0gICAgICAgIHRydWUgaWYgdGhlIG9iamVjdCBpcyBhIHJlZ3VsYXIgZXhwcmVzc2lvbixcbiogZmFsc2Ugb3RoZXJ3aXNlXG4qL1xuZnVuY3Rpb24gaXNSZWdFeHAob2JqZWN0KSB7XG4gICAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvYmplY3QpID09PSBcIltvYmplY3QgUmVnRXhwXVwiO1xufVxuXG4vLyByZXR1cm4gdGhlIGFjdHVhbCBwcm90b3R5cGUgb2YgSlNaaXBcbnZhciBvdXQgPSB7XG4gICAgLyoqXG4gICAgICogQHNlZSBsb2FkQXN5bmNcbiAgICAgKi9cbiAgICBsb2FkOiBmdW5jdGlvbigpIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiVGhpcyBtZXRob2QgaGFzIGJlZW4gcmVtb3ZlZCBpbiBKU1ppcCAzLjAsIHBsZWFzZSBjaGVjayB0aGUgdXBncmFkZSBndWlkZS5cIik7XG4gICAgfSxcblxuXG4gICAgLyoqXG4gICAgICogQ2FsbCBhIGNhbGxiYWNrIGZ1bmN0aW9uIGZvciBlYWNoIGVudHJ5IGF0IHRoaXMgZm9sZGVyIGxldmVsLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGNiIHRoZSBjYWxsYmFjayBmdW5jdGlvbjpcbiAgICAgKiBmdW5jdGlvbiAocmVsYXRpdmVQYXRoLCBmaWxlKSB7Li4ufVxuICAgICAqIEl0IHRha2VzIDIgYXJndW1lbnRzIDogdGhlIHJlbGF0aXZlIHBhdGggYW5kIHRoZSBmaWxlLlxuICAgICAqL1xuICAgIGZvckVhY2g6IGZ1bmN0aW9uKGNiKSB7XG4gICAgICAgIHZhciBmaWxlbmFtZSwgcmVsYXRpdmVQYXRoLCBmaWxlO1xuICAgICAgICBmb3IgKGZpbGVuYW1lIGluIHRoaXMuZmlsZXMpIHtcbiAgICAgICAgICAgIGlmICghdGhpcy5maWxlcy5oYXNPd25Qcm9wZXJ0eShmaWxlbmFtZSkpIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZpbGUgPSB0aGlzLmZpbGVzW2ZpbGVuYW1lXTtcbiAgICAgICAgICAgIHJlbGF0aXZlUGF0aCA9IGZpbGVuYW1lLnNsaWNlKHRoaXMucm9vdC5sZW5ndGgsIGZpbGVuYW1lLmxlbmd0aCk7XG4gICAgICAgICAgICBpZiAocmVsYXRpdmVQYXRoICYmIGZpbGVuYW1lLnNsaWNlKDAsIHRoaXMucm9vdC5sZW5ndGgpID09PSB0aGlzLnJvb3QpIHsgLy8gdGhlIGZpbGUgaXMgaW4gdGhlIGN1cnJlbnQgcm9vdFxuICAgICAgICAgICAgICAgIGNiKHJlbGF0aXZlUGF0aCwgZmlsZSk7IC8vIFRPRE8gcmV2ZXJzZSB0aGUgcGFyYW1ldGVycyA/IG5lZWQgdG8gYmUgY2xlYW4gQU5EIGNvbnNpc3RlbnQgd2l0aCB0aGUgZmlsdGVyIHNlYXJjaCBmbi4uLlxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIEZpbHRlciBuZXN0ZWQgZmlsZXMvZm9sZGVycyB3aXRoIHRoZSBzcGVjaWZpZWQgZnVuY3Rpb24uXG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gc2VhcmNoIHRoZSBwcmVkaWNhdGUgdG8gdXNlIDpcbiAgICAgKiBmdW5jdGlvbiAocmVsYXRpdmVQYXRoLCBmaWxlKSB7Li4ufVxuICAgICAqIEl0IHRha2VzIDIgYXJndW1lbnRzIDogdGhlIHJlbGF0aXZlIHBhdGggYW5kIHRoZSBmaWxlLlxuICAgICAqIEByZXR1cm4ge0FycmF5fSBBbiBhcnJheSBvZiBtYXRjaGluZyBlbGVtZW50cy5cbiAgICAgKi9cbiAgICBmaWx0ZXI6IGZ1bmN0aW9uKHNlYXJjaCkge1xuICAgICAgICB2YXIgcmVzdWx0ID0gW107XG4gICAgICAgIHRoaXMuZm9yRWFjaChmdW5jdGlvbiAocmVsYXRpdmVQYXRoLCBlbnRyeSkge1xuICAgICAgICAgICAgaWYgKHNlYXJjaChyZWxhdGl2ZVBhdGgsIGVudHJ5KSkgeyAvLyB0aGUgZmlsZSBtYXRjaGVzIHRoZSBmdW5jdGlvblxuICAgICAgICAgICAgICAgIHJlc3VsdC5wdXNoKGVudHJ5KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICB9KTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogQWRkIGEgZmlsZSB0byB0aGUgemlwIGZpbGUsIG9yIHNlYXJjaCBhIGZpbGUuXG4gICAgICogQHBhcmFtICAge3N0cmluZ3xSZWdFeHB9IG5hbWUgVGhlIG5hbWUgb2YgdGhlIGZpbGUgdG8gYWRkIChpZiBkYXRhIGlzIGRlZmluZWQpLFxuICAgICAqIHRoZSBuYW1lIG9mIHRoZSBmaWxlIHRvIGZpbmQgKGlmIG5vIGRhdGEpIG9yIGEgcmVnZXggdG8gbWF0Y2ggZmlsZXMuXG4gICAgICogQHBhcmFtICAge1N0cmluZ3xBcnJheUJ1ZmZlcnxVaW50OEFycmF5fEJ1ZmZlcn0gZGF0YSAgVGhlIGZpbGUgZGF0YSwgZWl0aGVyIHJhdyBvciBiYXNlNjQgZW5jb2RlZFxuICAgICAqIEBwYXJhbSAgIHtPYmplY3R9IG8gICAgIEZpbGUgb3B0aW9uc1xuICAgICAqIEByZXR1cm4gIHtKU1ppcHxPYmplY3R8QXJyYXl9IHRoaXMgSlNaaXAgb2JqZWN0ICh3aGVuIGFkZGluZyBhIGZpbGUpLFxuICAgICAqIGEgZmlsZSAod2hlbiBzZWFyY2hpbmcgYnkgc3RyaW5nKSBvciBhbiBhcnJheSBvZiBmaWxlcyAod2hlbiBzZWFyY2hpbmcgYnkgcmVnZXgpLlxuICAgICAqL1xuICAgIGZpbGU6IGZ1bmN0aW9uKG5hbWUsIGRhdGEsIG8pIHtcbiAgICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICAgIGlmIChpc1JlZ0V4cChuYW1lKSkge1xuICAgICAgICAgICAgICAgIHZhciByZWdleHAgPSBuYW1lO1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmZpbHRlcihmdW5jdGlvbihyZWxhdGl2ZVBhdGgsIGZpbGUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuICFmaWxlLmRpciAmJiByZWdleHAudGVzdChyZWxhdGl2ZVBhdGgpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7IC8vIHRleHRcbiAgICAgICAgICAgICAgICB2YXIgb2JqID0gdGhpcy5maWxlc1t0aGlzLnJvb3QgKyBuYW1lXTtcbiAgICAgICAgICAgICAgICBpZiAob2JqICYmICFvYmouZGlyKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBvYmo7XG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2UgeyAvLyBtb3JlIHRoYW4gb25lIGFyZ3VtZW50IDogd2UgaGF2ZSBkYXRhICFcbiAgICAgICAgICAgIG5hbWUgPSB0aGlzLnJvb3QgKyBuYW1lO1xuICAgICAgICAgICAgZmlsZUFkZC5jYWxsKHRoaXMsIG5hbWUsIGRhdGEsIG8pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBBZGQgYSBkaXJlY3RvcnkgdG8gdGhlIHppcCBmaWxlLCBvciBzZWFyY2guXG4gICAgICogQHBhcmFtICAge1N0cmluZ3xSZWdFeHB9IGFyZyBUaGUgbmFtZSBvZiB0aGUgZGlyZWN0b3J5IHRvIGFkZCwgb3IgYSByZWdleCB0byBzZWFyY2ggZm9sZGVycy5cbiAgICAgKiBAcmV0dXJuICB7SlNaaXB9IGFuIG9iamVjdCB3aXRoIHRoZSBuZXcgZGlyZWN0b3J5IGFzIHRoZSByb290LCBvciBhbiBhcnJheSBjb250YWluaW5nIG1hdGNoaW5nIGZvbGRlcnMuXG4gICAgICovXG4gICAgZm9sZGVyOiBmdW5jdGlvbihhcmcpIHtcbiAgICAgICAgaWYgKCFhcmcpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGlzUmVnRXhwKGFyZykpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmZpbHRlcihmdW5jdGlvbihyZWxhdGl2ZVBhdGgsIGZpbGUpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gZmlsZS5kaXIgJiYgYXJnLnRlc3QocmVsYXRpdmVQYXRoKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gZWxzZSwgbmFtZSBpcyBhIG5ldyBmb2xkZXJcbiAgICAgICAgdmFyIG5hbWUgPSB0aGlzLnJvb3QgKyBhcmc7XG4gICAgICAgIHZhciBuZXdGb2xkZXIgPSBmb2xkZXJBZGQuY2FsbCh0aGlzLCBuYW1lKTtcblxuICAgICAgICAvLyBBbGxvdyBjaGFpbmluZyBieSByZXR1cm5pbmcgYSBuZXcgb2JqZWN0IHdpdGggdGhpcyBmb2xkZXIgYXMgdGhlIHJvb3RcbiAgICAgICAgdmFyIHJldCA9IHRoaXMuY2xvbmUoKTtcbiAgICAgICAgcmV0LnJvb3QgPSBuZXdGb2xkZXIubmFtZTtcbiAgICAgICAgcmV0dXJuIHJldDtcbiAgICB9Ly8sXG5cbiAgICAvKipcbiAgICAgKiBEZWxldGUgYSBmaWxlLCBvciBhIGRpcmVjdG9yeSBhbmQgYWxsIHN1Yi1maWxlcywgZnJvbSB0aGUgemlwXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgdGhlIG5hbWUgb2YgdGhlIGZpbGUgdG8gZGVsZXRlXG4gICAgICogQHJldHVybiB7SlNaaXB9IHRoaXMgSlNaaXAgb2JqZWN0XG4gICAgICovXG4gICAgLy8gcmVtb3ZlOiBmdW5jdGlvbihuYW1lKSB7XG4gICAgLy8gICAgIG5hbWUgPSB0aGlzLnJvb3QgKyBuYW1lO1xuICAgIC8vICAgICB2YXIgZmlsZSA9IHRoaXMuZmlsZXNbbmFtZV07XG4gICAgLy8gICAgIGlmICghZmlsZSkge1xuICAgIC8vICAgICAgICAgLy8gTG9vayBmb3IgYW55IGZvbGRlcnNcbiAgICAvLyAgICAgICAgIGlmIChuYW1lLnNsaWNlKC0xKSAhPT0gXCIvXCIpIHtcbiAgICAvLyAgICAgICAgICAgICBuYW1lICs9IFwiL1wiO1xuICAgIC8vICAgICAgICAgfVxuICAgIC8vICAgICAgICAgZmlsZSA9IHRoaXMuZmlsZXNbbmFtZV07XG4gICAgLy8gICAgIH1cblxuICAgIC8vICAgICBpZiAoZmlsZSAmJiAhZmlsZS5kaXIpIHtcbiAgICAvLyAgICAgICAgIC8vIGZpbGVcbiAgICAvLyAgICAgICAgIGRlbGV0ZSB0aGlzLmZpbGVzW25hbWVdO1xuICAgIC8vICAgICB9IGVsc2Uge1xuICAgIC8vICAgICAgICAgLy8gbWF5YmUgYSBmb2xkZXIsIGRlbGV0ZSByZWN1cnNpdmVseVxuICAgIC8vICAgICAgICAgdmFyIGtpZHMgPSB0aGlzLmZpbHRlcihmdW5jdGlvbihyZWxhdGl2ZVBhdGgsIGZpbGUpIHtcbiAgICAvLyAgICAgICAgICAgICByZXR1cm4gZmlsZS5uYW1lLnNsaWNlKDAsIG5hbWUubGVuZ3RoKSA9PT0gbmFtZTtcbiAgICAvLyAgICAgICAgIH0pO1xuICAgIC8vICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBraWRzLmxlbmd0aDsgaSsrKSB7XG4gICAgLy8gICAgICAgICAgICAgZGVsZXRlIHRoaXMuZmlsZXNba2lkc1tpXS5uYW1lXTtcbiAgICAvLyAgICAgICAgIH1cbiAgICAvLyAgICAgfVxuXG4gICAgLy8gICAgIHJldHVybiB0aGlzO1xuICAgIC8vIH0sXG5cbiAgICAvKipcbiAgICAgKiBHZW5lcmF0ZSB0aGUgY29tcGxldGUgemlwIGZpbGVcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucyB0aGUgb3B0aW9ucyB0byBnZW5lcmF0ZSB0aGUgemlwIGZpbGUgOlxuICAgICAqIC0gY29tcHJlc3Npb24sIFwiU1RPUkVcIiBieSBkZWZhdWx0LlxuICAgICAqIC0gdHlwZSwgXCJiYXNlNjRcIiBieSBkZWZhdWx0LiBWYWx1ZXMgYXJlIDogc3RyaW5nLCBiYXNlNjQsIHVpbnQ4YXJyYXksIGFycmF5YnVmZmVyLCBibG9iLlxuICAgICAqIEByZXR1cm4ge1N0cmluZ3xVaW50OEFycmF5fEFycmF5QnVmZmVyfEJ1ZmZlcnxCbG9ifSB0aGUgemlwIGZpbGVcbiAgICAgKi9cbiAgICAvLyBnZW5lcmF0ZTogZnVuY3Rpb24ob3B0aW9ucykge1xuICAgIC8vICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGlzIG1ldGhvZCBoYXMgYmVlbiByZW1vdmVkIGluIEpTWmlwIDMuMCwgcGxlYXNlIGNoZWNrIHRoZSB1cGdyYWRlIGd1aWRlLlwiKTtcbiAgICAvLyB9LFxuXG4gICAgLyoqXG4gICAgICogR2VuZXJhdGUgdGhlIGNvbXBsZXRlIHppcCBmaWxlIGFzIGFuIGludGVybmFsIHN0cmVhbS5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gb3B0aW9ucyB0aGUgb3B0aW9ucyB0byBnZW5lcmF0ZSB0aGUgemlwIGZpbGUgOlxuICAgICAqIC0gY29tcHJlc3Npb24sIFwiU1RPUkVcIiBieSBkZWZhdWx0LlxuICAgICAqIC0gdHlwZSwgXCJiYXNlNjRcIiBieSBkZWZhdWx0LiBWYWx1ZXMgYXJlIDogc3RyaW5nLCBiYXNlNjQsIHVpbnQ4YXJyYXksIGFycmF5YnVmZmVyLCBibG9iLlxuICAgICAqIEByZXR1cm4ge1N0cmVhbUhlbHBlcn0gdGhlIHN0cmVhbWVkIHppcCBmaWxlLlxuICAgICAqL1xuICAgIC8vIGdlbmVyYXRlSW50ZXJuYWxTdHJlYW06IGZ1bmN0aW9uKG9wdGlvbnMpIHtcbiAgICAvLyAgIHZhciB3b3JrZXIsIG9wdHMgPSB7fTtcbiAgICAvLyAgIHRyeSB7XG4gICAgLy8gICAgICAgb3B0cyA9IHV0aWxzLmV4dGVuZChvcHRpb25zIHx8IHt9LCB7XG4gICAgLy8gICAgICAgICAgIHN0cmVhbUZpbGVzOiBmYWxzZSxcbiAgICAvLyAgICAgICAgICAgY29tcHJlc3Npb246IFwiU1RPUkVcIixcbiAgICAvLyAgICAgICAgICAgY29tcHJlc3Npb25PcHRpb25zIDogbnVsbCxcbiAgICAvLyAgICAgICAgICAgdHlwZTogXCJcIixcbiAgICAvLyAgICAgICAgICAgcGxhdGZvcm06IFwiRE9TXCIsXG4gICAgLy8gICAgICAgICAgIGNvbW1lbnQ6IG51bGwsXG4gICAgLy8gICAgICAgICAgIG1pbWVUeXBlOiAnYXBwbGljYXRpb24vemlwJyxcbiAgICAvLyAgICAgICAgICAgZW5jb2RlRmlsZU5hbWU6IHV0ZjgudXRmOGVuY29kZVxuICAgIC8vICAgICAgIH0pO1xuXG4gICAgLy8gICAgICAgb3B0cy50eXBlID0gb3B0cy50eXBlLnRvTG93ZXJDYXNlKCk7XG4gICAgLy8gICAgICAgb3B0cy5jb21wcmVzc2lvbiA9IG9wdHMuY29tcHJlc3Npb24udG9VcHBlckNhc2UoKTtcblxuICAgIC8vICAgICAgIC8vIFwiYmluYXJ5c3RyaW5nXCIgaXMgcHJlZmVyZWQgYnV0IHRoZSBpbnRlcm5hbHMgdXNlIFwic3RyaW5nXCIuXG4gICAgLy8gICAgICAgaWYob3B0cy50eXBlID09PSBcImJpbmFyeXN0cmluZ1wiKSB7XG4gICAgLy8gICAgICAgICBvcHRzLnR5cGUgPSBcInN0cmluZ1wiO1xuICAgIC8vICAgICAgIH1cblxuICAgIC8vICAgICAgIGlmICghb3B0cy50eXBlKSB7XG4gICAgLy8gICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJObyBvdXRwdXQgdHlwZSBzcGVjaWZpZWQuXCIpO1xuICAgIC8vICAgICAgIH1cblxuICAgIC8vICAgICAgIHV0aWxzLmNoZWNrU3VwcG9ydChvcHRzLnR5cGUpO1xuXG4gICAgLy8gICAgICAgLy8gYWNjZXB0IG5vZGVqcyBgcHJvY2Vzcy5wbGF0Zm9ybWBcbiAgICAvLyAgICAgICBpZihcbiAgICAvLyAgICAgICAgICAgb3B0aW9ucy5wbGF0Zm9ybSA9PT0gJ2RhcndpbicgfHxcbiAgICAvLyAgICAgICAgICAgb3B0aW9ucy5wbGF0Zm9ybSA9PT0gJ2ZyZWVic2QnIHx8XG4gICAgLy8gICAgICAgICAgIG9wdGlvbnMucGxhdGZvcm0gPT09ICdsaW51eCcgfHxcbiAgICAvLyAgICAgICAgICAgb3B0aW9ucy5wbGF0Zm9ybSA9PT0gJ3N1bm9zJ1xuICAgIC8vICAgICAgICkge1xuICAgIC8vICAgICAgICAgICBvcHRpb25zLnBsYXRmb3JtID0gXCJVTklYXCI7XG4gICAgLy8gICAgICAgfVxuICAgIC8vICAgICAgIGlmIChvcHRpb25zLnBsYXRmb3JtID09PSAnd2luMzInKSB7XG4gICAgLy8gICAgICAgICAgIG9wdGlvbnMucGxhdGZvcm0gPSBcIkRPU1wiO1xuICAgIC8vICAgICAgIH1cblxuICAgIC8vICAgICAgIHZhciBjb21tZW50ID0gb3B0cy5jb21tZW50IHx8IHRoaXMuY29tbWVudCB8fCBcIlwiO1xuICAgIC8vICAgICAgIHdvcmtlciA9IGdlbmVyYXRlLmdlbmVyYXRlV29ya2VyKHRoaXMsIG9wdHMsIGNvbW1lbnQpO1xuICAgIC8vICAgfSBjYXRjaCAoZSkge1xuICAgIC8vICAgICB3b3JrZXIgPSBuZXcgR2VuZXJpY1dvcmtlcihcImVycm9yXCIpO1xuICAgIC8vICAgICB3b3JrZXIuZXJyb3IoZSk7XG4gICAgLy8gICB9XG4gICAgLy8gICByZXR1cm4gbmV3IFN0cmVhbUhlbHBlcih3b3JrZXIsIG9wdHMudHlwZSB8fCBcInN0cmluZ1wiLCBvcHRzLm1pbWVUeXBlKTtcbiAgICAvLyB9LFxuICAgIC8vIC8qKlxuICAgIC8vICAqIEdlbmVyYXRlIHRoZSBjb21wbGV0ZSB6aXAgZmlsZSBhc3luY2hyb25vdXNseS5cbiAgICAvLyAgKiBAc2VlIGdlbmVyYXRlSW50ZXJuYWxTdHJlYW1cbiAgICAvLyAgKi9cbiAgICAvLyBnZW5lcmF0ZUFzeW5jOiBmdW5jdGlvbihvcHRpb25zLCBvblVwZGF0ZSkge1xuICAgIC8vICAgICByZXR1cm4gdGhpcy5nZW5lcmF0ZUludGVybmFsU3RyZWFtKG9wdGlvbnMpLmFjY3VtdWxhdGUob25VcGRhdGUpO1xuICAgIC8vIH0sXG4gICAgLy8gLyoqXG4gICAgLy8gICogR2VuZXJhdGUgdGhlIGNvbXBsZXRlIHppcCBmaWxlIGFzeW5jaHJvbm91c2x5LlxuICAgIC8vICAqIEBzZWUgZ2VuZXJhdGVJbnRlcm5hbFN0cmVhbVxuICAgIC8vICAqL1xuICAgIC8vIGdlbmVyYXRlTm9kZVN0cmVhbTogZnVuY3Rpb24ob3B0aW9ucywgb25VcGRhdGUpIHtcbiAgICAvLyAgICAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gICAgLy8gICAgIGlmICghb3B0aW9ucy50eXBlKSB7XG4gICAgLy8gICAgICAgICBvcHRpb25zLnR5cGUgPSBcIm5vZGVidWZmZXJcIjtcbiAgICAvLyAgICAgfVxuICAgIC8vICAgICByZXR1cm4gdGhpcy5nZW5lcmF0ZUludGVybmFsU3RyZWFtKG9wdGlvbnMpLnRvTm9kZWpzU3RyZWFtKG9uVXBkYXRlKTtcbiAgICAvLyB9XG59O1xubW9kdWxlLmV4cG9ydHMgPSBvdXQ7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgRGF0YVJlYWRlciA9IHJlcXVpcmUoJy4vRGF0YVJlYWRlcicpO1xudmFyIHV0aWxzID0gcmVxdWlyZSgnLi4vdXRpbHMnKTtcblxuZnVuY3Rpb24gQXJyYXlSZWFkZXIoZGF0YSkge1xuICAgIERhdGFSZWFkZXIuY2FsbCh0aGlzLCBkYXRhKTtcblx0Zm9yKHZhciBpID0gMDsgaSA8IHRoaXMuZGF0YS5sZW5ndGg7IGkrKykge1xuXHRcdGRhdGFbaV0gPSBkYXRhW2ldICYgMHhGRjtcblx0fVxufVxudXRpbHMuaW5oZXJpdHMoQXJyYXlSZWFkZXIsIERhdGFSZWFkZXIpO1xuLyoqXG4gKiBAc2VlIERhdGFSZWFkZXIuYnl0ZUF0XG4gKi9cbkFycmF5UmVhZGVyLnByb3RvdHlwZS5ieXRlQXQgPSBmdW5jdGlvbihpKSB7XG4gICAgcmV0dXJuIHRoaXMuZGF0YVt0aGlzLnplcm8gKyBpXTtcbn07XG4vKipcbiAqIEBzZWUgRGF0YVJlYWRlci5sYXN0SW5kZXhPZlNpZ25hdHVyZVxuICovXG5BcnJheVJlYWRlci5wcm90b3R5cGUubGFzdEluZGV4T2ZTaWduYXR1cmUgPSBmdW5jdGlvbihzaWcpIHtcbiAgICB2YXIgc2lnMCA9IHNpZy5jaGFyQ29kZUF0KDApLFxuICAgICAgICBzaWcxID0gc2lnLmNoYXJDb2RlQXQoMSksXG4gICAgICAgIHNpZzIgPSBzaWcuY2hhckNvZGVBdCgyKSxcbiAgICAgICAgc2lnMyA9IHNpZy5jaGFyQ29kZUF0KDMpO1xuICAgIGZvciAodmFyIGkgPSB0aGlzLmxlbmd0aCAtIDQ7IGkgPj0gMDsgLS1pKSB7XG4gICAgICAgIGlmICh0aGlzLmRhdGFbaV0gPT09IHNpZzAgJiYgdGhpcy5kYXRhW2kgKyAxXSA9PT0gc2lnMSAmJiB0aGlzLmRhdGFbaSArIDJdID09PSBzaWcyICYmIHRoaXMuZGF0YVtpICsgM10gPT09IHNpZzMpIHtcbiAgICAgICAgICAgIHJldHVybiBpIC0gdGhpcy56ZXJvO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIC0xO1xufTtcbi8qKlxuICogQHNlZSBEYXRhUmVhZGVyLnJlYWRBbmRDaGVja1NpZ25hdHVyZVxuICovXG5BcnJheVJlYWRlci5wcm90b3R5cGUucmVhZEFuZENoZWNrU2lnbmF0dXJlID0gZnVuY3Rpb24gKHNpZykge1xuICAgIHZhciBzaWcwID0gc2lnLmNoYXJDb2RlQXQoMCksXG4gICAgICAgIHNpZzEgPSBzaWcuY2hhckNvZGVBdCgxKSxcbiAgICAgICAgc2lnMiA9IHNpZy5jaGFyQ29kZUF0KDIpLFxuICAgICAgICBzaWczID0gc2lnLmNoYXJDb2RlQXQoMyksXG4gICAgICAgIGRhdGEgPSB0aGlzLnJlYWREYXRhKDQpO1xuICAgIHJldHVybiBzaWcwID09PSBkYXRhWzBdICYmIHNpZzEgPT09IGRhdGFbMV0gJiYgc2lnMiA9PT0gZGF0YVsyXSAmJiBzaWczID09PSBkYXRhWzNdO1xufTtcbi8qKlxuICogQHNlZSBEYXRhUmVhZGVyLnJlYWREYXRhXG4gKi9cbkFycmF5UmVhZGVyLnByb3RvdHlwZS5yZWFkRGF0YSA9IGZ1bmN0aW9uKHNpemUpIHtcbiAgICB0aGlzLmNoZWNrT2Zmc2V0KHNpemUpO1xuICAgIGlmKHNpemUgPT09IDApIHtcbiAgICAgICAgcmV0dXJuIFtdO1xuICAgIH1cbiAgICB2YXIgcmVzdWx0ID0gdGhpcy5kYXRhLnNsaWNlKHRoaXMuemVybyArIHRoaXMuaW5kZXgsIHRoaXMuemVybyArIHRoaXMuaW5kZXggKyBzaXplKTtcbiAgICB0aGlzLmluZGV4ICs9IHNpemU7XG4gICAgcmV0dXJuIHJlc3VsdDtcbn07XG5tb2R1bGUuZXhwb3J0cyA9IEFycmF5UmVhZGVyO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIHV0aWxzID0gcmVxdWlyZSgnLi4vdXRpbHMnKTtcblxuZnVuY3Rpb24gRGF0YVJlYWRlcihkYXRhKSB7XG4gICAgdGhpcy5kYXRhID0gZGF0YTsgLy8gdHlwZSA6IHNlZSBpbXBsZW1lbnRhdGlvblxuICAgIHRoaXMubGVuZ3RoID0gZGF0YS5sZW5ndGg7XG4gICAgdGhpcy5pbmRleCA9IDA7XG4gICAgdGhpcy56ZXJvID0gMDtcbn1cbkRhdGFSZWFkZXIucHJvdG90eXBlID0ge1xuICAgIC8qKlxuICAgICAqIENoZWNrIHRoYXQgdGhlIG9mZnNldCB3aWxsIG5vdCBnbyB0b28gZmFyLlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBvZmZzZXQgdGhlIGFkZGl0aW9uYWwgb2Zmc2V0IHRvIGNoZWNrLlxuICAgICAqIEB0aHJvd3Mge0Vycm9yfSBhbiBFcnJvciBpZiB0aGUgb2Zmc2V0IGlzIG91dCBvZiBib3VuZHMuXG4gICAgICovXG4gICAgY2hlY2tPZmZzZXQ6IGZ1bmN0aW9uKG9mZnNldCkge1xuICAgICAgICB0aGlzLmNoZWNrSW5kZXgodGhpcy5pbmRleCArIG9mZnNldCk7XG4gICAgfSxcbiAgICAvKipcbiAgICAgKiBDaGVjayB0aGF0IHRoZSBzcGVjaWZlZCBpbmRleCB3aWxsIG5vdCBiZSB0b28gZmFyLlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBuZXdJbmRleCB0aGUgaW5kZXggdG8gY2hlY2suXG4gICAgICogQHRocm93cyB7RXJyb3J9IGFuIEVycm9yIGlmIHRoZSBpbmRleCBpcyBvdXQgb2YgYm91bmRzLlxuICAgICAqL1xuICAgIGNoZWNrSW5kZXg6IGZ1bmN0aW9uKG5ld0luZGV4KSB7XG4gICAgICAgIGlmICh0aGlzLmxlbmd0aCA8IHRoaXMuemVybyArIG5ld0luZGV4IHx8IG5ld0luZGV4IDwgMCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiRW5kIG9mIGRhdGEgcmVhY2hlZCAoZGF0YSBsZW5ndGggPSBcIiArIHRoaXMubGVuZ3RoICsgXCIsIGFza2VkIGluZGV4ID0gXCIgKyAobmV3SW5kZXgpICsgXCIpLiBDb3JydXB0ZWQgemlwID9cIik7XG4gICAgICAgIH1cbiAgICB9LFxuICAgIC8qKlxuICAgICAqIENoYW5nZSB0aGUgaW5kZXguXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IG5ld0luZGV4IFRoZSBuZXcgaW5kZXguXG4gICAgICogQHRocm93cyB7RXJyb3J9IGlmIHRoZSBuZXcgaW5kZXggaXMgb3V0IG9mIHRoZSBkYXRhLlxuICAgICAqL1xuICAgIHNldEluZGV4OiBmdW5jdGlvbihuZXdJbmRleCkge1xuICAgICAgICB0aGlzLmNoZWNrSW5kZXgobmV3SW5kZXgpO1xuICAgICAgICB0aGlzLmluZGV4ID0gbmV3SW5kZXg7XG4gICAgfSxcbiAgICAvKipcbiAgICAgKiBTa2lwIHRoZSBuZXh0IG4gYnl0ZXMuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IG4gdGhlIG51bWJlciBvZiBieXRlcyB0byBza2lwLlxuICAgICAqIEB0aHJvd3Mge0Vycm9yfSBpZiB0aGUgbmV3IGluZGV4IGlzIG91dCBvZiB0aGUgZGF0YS5cbiAgICAgKi9cbiAgICBza2lwOiBmdW5jdGlvbihuKSB7XG4gICAgICAgIHRoaXMuc2V0SW5kZXgodGhpcy5pbmRleCArIG4pO1xuICAgIH0sXG4gICAgLyoqXG4gICAgICogR2V0IHRoZSBieXRlIGF0IHRoZSBzcGVjaWZpZWQgaW5kZXguXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IGkgdGhlIGluZGV4IHRvIHVzZS5cbiAgICAgKiBAcmV0dXJuIHtudW1iZXJ9IGEgYnl0ZS5cbiAgICAgKi9cbiAgICBieXRlQXQ6IGZ1bmN0aW9uKGkpIHtcbiAgICAgICAgLy8gc2VlIGltcGxlbWVudGF0aW9uc1xuICAgIH0sXG4gICAgLyoqXG4gICAgICogR2V0IHRoZSBuZXh0IG51bWJlciB3aXRoIGEgZ2l2ZW4gYnl0ZSBzaXplLlxuICAgICAqIEBwYXJhbSB7bnVtYmVyfSBzaXplIHRoZSBudW1iZXIgb2YgYnl0ZXMgdG8gcmVhZC5cbiAgICAgKiBAcmV0dXJuIHtudW1iZXJ9IHRoZSBjb3JyZXNwb25kaW5nIG51bWJlci5cbiAgICAgKi9cbiAgICByZWFkSW50OiBmdW5jdGlvbihzaXplKSB7XG4gICAgICAgIHZhciByZXN1bHQgPSAwLFxuICAgICAgICAgICAgaTtcbiAgICAgICAgdGhpcy5jaGVja09mZnNldChzaXplKTtcbiAgICAgICAgZm9yIChpID0gdGhpcy5pbmRleCArIHNpemUgLSAxOyBpID49IHRoaXMuaW5kZXg7IGktLSkge1xuICAgICAgICAgICAgcmVzdWx0ID0gKHJlc3VsdCA8PCA4KSArIHRoaXMuYnl0ZUF0KGkpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuaW5kZXggKz0gc2l6ZTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9LFxuICAgIC8qKlxuICAgICAqIEdldCB0aGUgbmV4dCBzdHJpbmcgd2l0aCBhIGdpdmVuIGJ5dGUgc2l6ZS5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gc2l6ZSB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRvIHJlYWQuXG4gICAgICogQHJldHVybiB7c3RyaW5nfSB0aGUgY29ycmVzcG9uZGluZyBzdHJpbmcuXG4gICAgICovXG4gICAgcmVhZFN0cmluZzogZnVuY3Rpb24oc2l6ZSkge1xuICAgICAgICByZXR1cm4gdXRpbHMudHJhbnNmb3JtVG8oXCJzdHJpbmdcIiwgdGhpcy5yZWFkRGF0YShzaXplKSk7XG4gICAgfSxcbiAgICAvKipcbiAgICAgKiBHZXQgcmF3IGRhdGEgd2l0aG91dCBjb252ZXJzaW9uLCA8c2l6ZT4gYnl0ZXMuXG4gICAgICogQHBhcmFtIHtudW1iZXJ9IHNpemUgdGhlIG51bWJlciBvZiBieXRlcyB0byByZWFkLlxuICAgICAqIEByZXR1cm4ge09iamVjdH0gdGhlIHJhdyBkYXRhLCBpbXBsZW1lbnRhdGlvbiBzcGVjaWZpYy5cbiAgICAgKi9cbiAgICByZWFkRGF0YTogZnVuY3Rpb24oc2l6ZSkge1xuICAgICAgICAvLyBzZWUgaW1wbGVtZW50YXRpb25zXG4gICAgfSxcbiAgICAvKipcbiAgICAgKiBGaW5kIHRoZSBsYXN0IG9jY3VyZW5jZSBvZiBhIHppcCBzaWduYXR1cmUgKDQgYnl0ZXMpLlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBzaWcgdGhlIHNpZ25hdHVyZSB0byBmaW5kLlxuICAgICAqIEByZXR1cm4ge251bWJlcn0gdGhlIGluZGV4IG9mIHRoZSBsYXN0IG9jY3VyZW5jZSwgLTEgaWYgbm90IGZvdW5kLlxuICAgICAqL1xuICAgIGxhc3RJbmRleE9mU2lnbmF0dXJlOiBmdW5jdGlvbihzaWcpIHtcbiAgICAgICAgLy8gc2VlIGltcGxlbWVudGF0aW9uc1xuICAgIH0sXG4gICAgLyoqXG4gICAgICogUmVhZCB0aGUgc2lnbmF0dXJlICg0IGJ5dGVzKSBhdCB0aGUgY3VycmVudCBwb3NpdGlvbiBhbmQgY29tcGFyZSBpdCB3aXRoIHNpZy5cbiAgICAgKiBAcGFyYW0ge3N0cmluZ30gc2lnIHRoZSBleHBlY3RlZCBzaWduYXR1cmVcbiAgICAgKiBAcmV0dXJuIHtib29sZWFufSB0cnVlIGlmIHRoZSBzaWduYXR1cmUgbWF0Y2hlcywgZmFsc2Ugb3RoZXJ3aXNlLlxuICAgICAqL1xuICAgIHJlYWRBbmRDaGVja1NpZ25hdHVyZTogZnVuY3Rpb24oc2lnKSB7XG4gICAgICAgIC8vIHNlZSBpbXBsZW1lbnRhdGlvbnNcbiAgICB9LFxuICAgIC8qKlxuICAgICAqIEdldCB0aGUgbmV4dCBkYXRlLlxuICAgICAqIEByZXR1cm4ge0RhdGV9IHRoZSBkYXRlLlxuICAgICAqL1xuICAgIHJlYWREYXRlOiBmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIGRvc3RpbWUgPSB0aGlzLnJlYWRJbnQoNCk7XG4gICAgICAgIHJldHVybiBuZXcgRGF0ZShEYXRlLlVUQyhcbiAgICAgICAgKChkb3N0aW1lID4+IDI1KSAmIDB4N2YpICsgMTk4MCwgLy8geWVhclxuICAgICAgICAoKGRvc3RpbWUgPj4gMjEpICYgMHgwZikgLSAxLCAvLyBtb250aFxuICAgICAgICAoZG9zdGltZSA+PiAxNikgJiAweDFmLCAvLyBkYXlcbiAgICAgICAgKGRvc3RpbWUgPj4gMTEpICYgMHgxZiwgLy8gaG91clxuICAgICAgICAoZG9zdGltZSA+PiA1KSAmIDB4M2YsIC8vIG1pbnV0ZVxuICAgICAgICAoZG9zdGltZSAmIDB4MWYpIDw8IDEpKTsgLy8gc2Vjb25kXG4gICAgfVxufTtcbm1vZHVsZS5leHBvcnRzID0gRGF0YVJlYWRlcjtcbiIsIid1c2Ugc3RyaWN0JztcbnZhciBVaW50OEFycmF5UmVhZGVyID0gcmVxdWlyZSgnLi9VaW50OEFycmF5UmVhZGVyJyk7XG52YXIgdXRpbHMgPSByZXF1aXJlKCcuLi91dGlscycpO1xuXG5mdW5jdGlvbiBOb2RlQnVmZmVyUmVhZGVyKGRhdGEpIHtcbiAgICBVaW50OEFycmF5UmVhZGVyLmNhbGwodGhpcywgZGF0YSk7XG59XG51dGlscy5pbmhlcml0cyhOb2RlQnVmZmVyUmVhZGVyLCBVaW50OEFycmF5UmVhZGVyKTtcblxuLyoqXG4gKiBAc2VlIERhdGFSZWFkZXIucmVhZERhdGFcbiAqL1xuTm9kZUJ1ZmZlclJlYWRlci5wcm90b3R5cGUucmVhZERhdGEgPSBmdW5jdGlvbihzaXplKSB7XG4gICAgdGhpcy5jaGVja09mZnNldChzaXplKTtcbiAgICB2YXIgcmVzdWx0ID0gdGhpcy5kYXRhLnNsaWNlKHRoaXMuemVybyArIHRoaXMuaW5kZXgsIHRoaXMuemVybyArIHRoaXMuaW5kZXggKyBzaXplKTtcbiAgICB0aGlzLmluZGV4ICs9IHNpemU7XG4gICAgcmV0dXJuIHJlc3VsdDtcbn07XG5tb2R1bGUuZXhwb3J0cyA9IE5vZGVCdWZmZXJSZWFkZXI7XG4iLCIndXNlIHN0cmljdCc7XG52YXIgRGF0YVJlYWRlciA9IHJlcXVpcmUoJy4vRGF0YVJlYWRlcicpO1xudmFyIHV0aWxzID0gcmVxdWlyZSgnLi4vdXRpbHMnKTtcblxuZnVuY3Rpb24gU3RyaW5nUmVhZGVyKGRhdGEpIHtcbiAgICBEYXRhUmVhZGVyLmNhbGwodGhpcywgZGF0YSk7XG59XG51dGlscy5pbmhlcml0cyhTdHJpbmdSZWFkZXIsIERhdGFSZWFkZXIpO1xuLyoqXG4gKiBAc2VlIERhdGFSZWFkZXIuYnl0ZUF0XG4gKi9cblN0cmluZ1JlYWRlci5wcm90b3R5cGUuYnl0ZUF0ID0gZnVuY3Rpb24oaSkge1xuICAgIHJldHVybiB0aGlzLmRhdGEuY2hhckNvZGVBdCh0aGlzLnplcm8gKyBpKTtcbn07XG4vKipcbiAqIEBzZWUgRGF0YVJlYWRlci5sYXN0SW5kZXhPZlNpZ25hdHVyZVxuICovXG5TdHJpbmdSZWFkZXIucHJvdG90eXBlLmxhc3RJbmRleE9mU2lnbmF0dXJlID0gZnVuY3Rpb24oc2lnKSB7XG4gICAgcmV0dXJuIHRoaXMuZGF0YS5sYXN0SW5kZXhPZihzaWcpIC0gdGhpcy56ZXJvO1xufTtcbi8qKlxuICogQHNlZSBEYXRhUmVhZGVyLnJlYWRBbmRDaGVja1NpZ25hdHVyZVxuICovXG5TdHJpbmdSZWFkZXIucHJvdG90eXBlLnJlYWRBbmRDaGVja1NpZ25hdHVyZSA9IGZ1bmN0aW9uIChzaWcpIHtcbiAgICB2YXIgZGF0YSA9IHRoaXMucmVhZERhdGEoNCk7XG4gICAgcmV0dXJuIHNpZyA9PT0gZGF0YTtcbn07XG4vKipcbiAqIEBzZWUgRGF0YVJlYWRlci5yZWFkRGF0YVxuICovXG5TdHJpbmdSZWFkZXIucHJvdG90eXBlLnJlYWREYXRhID0gZnVuY3Rpb24oc2l6ZSkge1xuICAgIHRoaXMuY2hlY2tPZmZzZXQoc2l6ZSk7XG4gICAgLy8gdGhpcyB3aWxsIHdvcmsgYmVjYXVzZSB0aGUgY29uc3RydWN0b3IgYXBwbGllZCB0aGUgXCImIDB4ZmZcIiBtYXNrLlxuICAgIHZhciByZXN1bHQgPSB0aGlzLmRhdGEuc2xpY2UodGhpcy56ZXJvICsgdGhpcy5pbmRleCwgdGhpcy56ZXJvICsgdGhpcy5pbmRleCArIHNpemUpO1xuICAgIHRoaXMuaW5kZXggKz0gc2l6ZTtcbiAgICByZXR1cm4gcmVzdWx0O1xufTtcbm1vZHVsZS5leHBvcnRzID0gU3RyaW5nUmVhZGVyO1xuIiwiJ3VzZSBzdHJpY3QnO1xudmFyIEFycmF5UmVhZGVyID0gcmVxdWlyZSgnLi9BcnJheVJlYWRlcicpO1xudmFyIHV0aWxzID0gcmVxdWlyZSgnLi4vdXRpbHMnKTtcblxuZnVuY3Rpb24gVWludDhBcnJheVJlYWRlcihkYXRhKSB7XG4gICAgQXJyYXlSZWFkZXIuY2FsbCh0aGlzLCBkYXRhKTtcbn1cbnV0aWxzLmluaGVyaXRzKFVpbnQ4QXJyYXlSZWFkZXIsIEFycmF5UmVhZGVyKTtcbi8qKlxuICogQHNlZSBEYXRhUmVhZGVyLnJlYWREYXRhXG4gKi9cblVpbnQ4QXJyYXlSZWFkZXIucHJvdG90eXBlLnJlYWREYXRhID0gZnVuY3Rpb24oc2l6ZSkge1xuICAgIHRoaXMuY2hlY2tPZmZzZXQoc2l6ZSk7XG4gICAgaWYoc2l6ZSA9PT0gMCkge1xuICAgICAgICAvLyBpbiBJRTEwLCB3aGVuIHVzaW5nIHN1YmFycmF5KGlkeCwgaWR4KSwgd2UgZ2V0IHRoZSBhcnJheSBbMHgwMF0gaW5zdGVhZCBvZiBbXS5cbiAgICAgICAgcmV0dXJuIG5ldyBVaW50OEFycmF5KDApO1xuICAgIH1cbiAgICB2YXIgcmVzdWx0ID0gdGhpcy5kYXRhLnN1YmFycmF5KHRoaXMuemVybyArIHRoaXMuaW5kZXgsIHRoaXMuemVybyArIHRoaXMuaW5kZXggKyBzaXplKTtcbiAgICB0aGlzLmluZGV4ICs9IHNpemU7XG4gICAgcmV0dXJuIHJlc3VsdDtcbn07XG5tb2R1bGUuZXhwb3J0cyA9IFVpbnQ4QXJyYXlSZWFkZXI7XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciB1dGlscyA9IHJlcXVpcmUoJy4uL3V0aWxzJyk7XG52YXIgc3VwcG9ydCA9IHJlcXVpcmUoJy4uL3N1cHBvcnQnKTtcbnZhciBBcnJheVJlYWRlciA9IHJlcXVpcmUoJy4vQXJyYXlSZWFkZXInKTtcbnZhciBTdHJpbmdSZWFkZXIgPSByZXF1aXJlKCcuL1N0cmluZ1JlYWRlcicpO1xudmFyIE5vZGVCdWZmZXJSZWFkZXIgPSByZXF1aXJlKCcuL05vZGVCdWZmZXJSZWFkZXInKTtcbnZhciBVaW50OEFycmF5UmVhZGVyID0gcmVxdWlyZSgnLi9VaW50OEFycmF5UmVhZGVyJyk7XG5cbi8qKlxuICogQ3JlYXRlIGEgcmVhZGVyIGFkYXB0ZWQgdG8gdGhlIGRhdGEuXG4gKiBAcGFyYW0ge1N0cmluZ3xBcnJheUJ1ZmZlcnxVaW50OEFycmF5fEJ1ZmZlcn0gZGF0YSB0aGUgZGF0YSB0byByZWFkLlxuICogQHJldHVybiB7RGF0YVJlYWRlcn0gdGhlIGRhdGEgcmVhZGVyLlxuICovXG5tb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIChkYXRhKSB7XG4gICAgdmFyIHR5cGUgPSB1dGlscy5nZXRUeXBlT2YoZGF0YSk7XG4gICAgdXRpbHMuY2hlY2tTdXBwb3J0KHR5cGUpO1xuICAgIGlmICh0eXBlID09PSBcInN0cmluZ1wiICYmICFzdXBwb3J0LnVpbnQ4YXJyYXkpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmdSZWFkZXIoZGF0YSk7XG4gICAgfVxuICAgIGlmICh0eXBlID09PSBcIm5vZGVidWZmZXJcIikge1xuICAgICAgICByZXR1cm4gbmV3IE5vZGVCdWZmZXJSZWFkZXIoZGF0YSk7XG4gICAgfVxuICAgIGlmIChzdXBwb3J0LnVpbnQ4YXJyYXkpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBVaW50OEFycmF5UmVhZGVyKHV0aWxzLnRyYW5zZm9ybVRvKFwidWludDhhcnJheVwiLCBkYXRhKSk7XG4gICAgfVxuICAgIHJldHVybiBuZXcgQXJyYXlSZWFkZXIodXRpbHMudHJhbnNmb3JtVG8oXCJhcnJheVwiLCBkYXRhKSk7XG59O1xuXG4vLyB2aW06IHNldCBzaGlmdHdpZHRoPTQgc29mdHRhYnN0b3A9NDpcbiIsIid1c2Ugc3RyaWN0JztcbmV4cG9ydHMuTE9DQUxfRklMRV9IRUFERVIgPSBcIlBLXFx4MDNcXHgwNFwiO1xuZXhwb3J0cy5DRU5UUkFMX0ZJTEVfSEVBREVSID0gXCJQS1xceDAxXFx4MDJcIjtcbmV4cG9ydHMuQ0VOVFJBTF9ESVJFQ1RPUllfRU5EID0gXCJQS1xceDA1XFx4MDZcIjtcbmV4cG9ydHMuWklQNjRfQ0VOVFJBTF9ESVJFQ1RPUllfTE9DQVRPUiA9IFwiUEtcXHgwNlxceDA3XCI7XG5leHBvcnRzLlpJUDY0X0NFTlRSQUxfRElSRUNUT1JZX0VORCA9IFwiUEtcXHgwNlxceDA2XCI7XG5leHBvcnRzLkRBVEFfREVTQ1JJUFRPUiA9IFwiUEtcXHgwN1xceDA4XCI7XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciBHZW5lcmljV29ya2VyID0gcmVxdWlyZSgnLi9HZW5lcmljV29ya2VyJyk7XG52YXIgdXRpbHMgPSByZXF1aXJlKCcuLi91dGlscycpO1xuXG4vKipcbiAqIEEgd29ya2VyIHdoaWNoIGNvbnZlcnQgY2h1bmtzIHRvIGEgc3BlY2lmaWVkIHR5cGUuXG4gKiBAY29uc3RydWN0b3JcbiAqIEBwYXJhbSB7U3RyaW5nfSBkZXN0VHlwZSB0aGUgZGVzdGluYXRpb24gdHlwZS5cbiAqL1xuZnVuY3Rpb24gQ29udmVydFdvcmtlcihkZXN0VHlwZSkge1xuICAgIEdlbmVyaWNXb3JrZXIuY2FsbCh0aGlzLCBcIkNvbnZlcnRXb3JrZXIgdG8gXCIgKyBkZXN0VHlwZSk7XG4gICAgdGhpcy5kZXN0VHlwZSA9IGRlc3RUeXBlO1xufVxudXRpbHMuaW5oZXJpdHMoQ29udmVydFdvcmtlciwgR2VuZXJpY1dvcmtlcik7XG5cbi8qKlxuICogQHNlZSBHZW5lcmljV29ya2VyLnByb2Nlc3NDaHVua1xuICovXG5Db252ZXJ0V29ya2VyLnByb3RvdHlwZS5wcm9jZXNzQ2h1bmsgPSBmdW5jdGlvbiAoY2h1bmspIHtcbiAgICB0aGlzLnB1c2goe1xuICAgICAgICBkYXRhIDogdXRpbHMudHJhbnNmb3JtVG8odGhpcy5kZXN0VHlwZSwgY2h1bmsuZGF0YSksXG4gICAgICAgIG1ldGEgOiBjaHVuay5tZXRhXG4gICAgfSk7XG59O1xubW9kdWxlLmV4cG9ydHMgPSBDb252ZXJ0V29ya2VyO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgR2VuZXJpY1dvcmtlciA9IHJlcXVpcmUoJy4vR2VuZXJpY1dvcmtlcicpO1xudmFyIGNyYzMyID0gcmVxdWlyZSgnLi4vY3JjMzInKTtcbnZhciB1dGlscyA9IHJlcXVpcmUoJy4uL3V0aWxzJyk7XG5cbi8qKlxuICogQSB3b3JrZXIgd2hpY2ggY2FsY3VsYXRlIHRoZSBjcmMzMiBvZiB0aGUgZGF0YSBmbG93aW5nIHRocm91Z2guXG4gKiBAY29uc3RydWN0b3JcbiAqL1xuZnVuY3Rpb24gQ3JjMzJQcm9iZSgpIHtcbiAgICBHZW5lcmljV29ya2VyLmNhbGwodGhpcywgXCJDcmMzMlByb2JlXCIpO1xufVxudXRpbHMuaW5oZXJpdHMoQ3JjMzJQcm9iZSwgR2VuZXJpY1dvcmtlcik7XG5cbi8qKlxuICogQHNlZSBHZW5lcmljV29ya2VyLnByb2Nlc3NDaHVua1xuICovXG5DcmMzMlByb2JlLnByb3RvdHlwZS5wcm9jZXNzQ2h1bmsgPSBmdW5jdGlvbiAoY2h1bmspIHtcbiAgICB0aGlzLnN0cmVhbUluZm8uY3JjMzIgPSBjcmMzMihjaHVuay5kYXRhLCB0aGlzLnN0cmVhbUluZm8uY3JjMzIgfHwgMCk7XG4gICAgdGhpcy5wdXNoKGNodW5rKTtcbn07XG5tb2R1bGUuZXhwb3J0cyA9IENyYzMyUHJvYmU7XG4iLCIndXNlIHN0cmljdCc7XG5cbnZhciB1dGlscyA9IHJlcXVpcmUoJy4uL3V0aWxzJyk7XG52YXIgR2VuZXJpY1dvcmtlciA9IHJlcXVpcmUoJy4vR2VuZXJpY1dvcmtlcicpO1xuXG4vKipcbiAqIEEgd29ya2VyIHdoaWNoIGNhbGN1bGF0ZSB0aGUgdG90YWwgbGVuZ3RoIG9mIHRoZSBkYXRhIGZsb3dpbmcgdGhyb3VnaC5cbiAqIEBjb25zdHJ1Y3RvclxuICogQHBhcmFtIHtTdHJpbmd9IHByb3BOYW1lIHRoZSBuYW1lIHVzZWQgdG8gZXhwb3NlIHRoZSBsZW5ndGhcbiAqL1xuZnVuY3Rpb24gRGF0YUxlbmd0aFByb2JlKHByb3BOYW1lKSB7XG4gICAgR2VuZXJpY1dvcmtlci5jYWxsKHRoaXMsIFwiRGF0YUxlbmd0aFByb2JlIGZvciBcIiArIHByb3BOYW1lKTtcbiAgICB0aGlzLnByb3BOYW1lID0gcHJvcE5hbWU7XG4gICAgdGhpcy53aXRoU3RyZWFtSW5mbyhwcm9wTmFtZSwgMCk7XG59XG51dGlscy5pbmhlcml0cyhEYXRhTGVuZ3RoUHJvYmUsIEdlbmVyaWNXb3JrZXIpO1xuXG4vKipcbiAqIEBzZWUgR2VuZXJpY1dvcmtlci5wcm9jZXNzQ2h1bmtcbiAqL1xuRGF0YUxlbmd0aFByb2JlLnByb3RvdHlwZS5wcm9jZXNzQ2h1bmsgPSBmdW5jdGlvbiAoY2h1bmspIHtcbiAgICBpZihjaHVuaykge1xuICAgICAgICB2YXIgbGVuZ3RoID0gdGhpcy5zdHJlYW1JbmZvW3RoaXMucHJvcE5hbWVdIHx8IDA7XG4gICAgICAgIHRoaXMuc3RyZWFtSW5mb1t0aGlzLnByb3BOYW1lXSA9IGxlbmd0aCArIGNodW5rLmRhdGEubGVuZ3RoO1xuICAgIH1cbiAgICBHZW5lcmljV29ya2VyLnByb3RvdHlwZS5wcm9jZXNzQ2h1bmsuY2FsbCh0aGlzLCBjaHVuayk7XG59O1xubW9kdWxlLmV4cG9ydHMgPSBEYXRhTGVuZ3RoUHJvYmU7XG5cbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIHV0aWxzID0gcmVxdWlyZSgnLi4vdXRpbHMnKTtcbnZhciBHZW5lcmljV29ya2VyID0gcmVxdWlyZSgnLi9HZW5lcmljV29ya2VyJyk7XG5cbi8vIHRoZSBzaXplIG9mIHRoZSBnZW5lcmF0ZWQgY2h1bmtzXG4vLyBUT0RPIGV4cG9zZSB0aGlzIGFzIGEgcHVibGljIHZhcmlhYmxlXG52YXIgREVGQVVMVF9CTE9DS19TSVpFID0gMTYgKiAxMDI0O1xuXG4vKipcbiAqIEEgd29ya2VyIHRoYXQgcmVhZHMgYSBjb250ZW50IGFuZCBlbWl0cyBjaHVua3MuXG4gKiBAY29uc3RydWN0b3JcbiAqIEBwYXJhbSB7UHJvbWlzZX0gZGF0YVAgdGhlIHByb21pc2Ugb2YgdGhlIGRhdGEgdG8gc3BsaXRcbiAqL1xuZnVuY3Rpb24gRGF0YVdvcmtlcihkYXRhUCkge1xuICAgIEdlbmVyaWNXb3JrZXIuY2FsbCh0aGlzLCBcIkRhdGFXb3JrZXJcIik7XG4gICAgdmFyIHNlbGYgPSB0aGlzO1xuICAgIHRoaXMuZGF0YUlzUmVhZHkgPSBmYWxzZTtcbiAgICB0aGlzLmluZGV4ID0gMDtcbiAgICB0aGlzLm1heCA9IDA7XG4gICAgdGhpcy5kYXRhID0gbnVsbDtcbiAgICB0aGlzLnR5cGUgPSBcIlwiO1xuXG4gICAgdGhpcy5fdGlja1NjaGVkdWxlZCA9IGZhbHNlO1xuXG4gICAgZGF0YVAudGhlbihmdW5jdGlvbiAoZGF0YSkge1xuICAgICAgICBzZWxmLmRhdGFJc1JlYWR5ID0gdHJ1ZTtcbiAgICAgICAgc2VsZi5kYXRhID0gZGF0YTtcbiAgICAgICAgc2VsZi5tYXggPSBkYXRhICYmIGRhdGEubGVuZ3RoIHx8IDA7XG4gICAgICAgIHNlbGYudHlwZSA9IHV0aWxzLmdldFR5cGVPZihkYXRhKTtcbiAgICAgICAgaWYoIXNlbGYuaXNQYXVzZWQpIHtcbiAgICAgICAgICAgIHNlbGYuX3RpY2tBbmRSZXBlYXQoKTtcbiAgICAgICAgfVxuICAgIH0sIGZ1bmN0aW9uIChlKSB7XG4gICAgICAgIHNlbGYuZXJyb3IoZSk7XG4gICAgfSk7XG59XG5cbnV0aWxzLmluaGVyaXRzKERhdGFXb3JrZXIsIEdlbmVyaWNXb3JrZXIpO1xuXG4vKipcbiAqIEBzZWUgR2VuZXJpY1dvcmtlci5jbGVhblVwXG4gKi9cbkRhdGFXb3JrZXIucHJvdG90eXBlLmNsZWFuVXAgPSBmdW5jdGlvbiAoKSB7XG4gICAgR2VuZXJpY1dvcmtlci5wcm90b3R5cGUuY2xlYW5VcC5jYWxsKHRoaXMpO1xuICAgIHRoaXMuZGF0YSA9IG51bGw7XG59O1xuXG4vKipcbiAqIEBzZWUgR2VuZXJpY1dvcmtlci5yZXN1bWVcbiAqL1xuRGF0YVdvcmtlci5wcm90b3R5cGUucmVzdW1lID0gZnVuY3Rpb24gKCkge1xuICAgIGlmKCFHZW5lcmljV29ya2VyLnByb3RvdHlwZS5yZXN1bWUuY2FsbCh0aGlzKSkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLl90aWNrU2NoZWR1bGVkICYmIHRoaXMuZGF0YUlzUmVhZHkpIHtcbiAgICAgICAgdGhpcy5fdGlja1NjaGVkdWxlZCA9IHRydWU7XG4gICAgICAgIHV0aWxzLmRlbGF5KHRoaXMuX3RpY2tBbmRSZXBlYXQsIFtdLCB0aGlzKTtcbiAgICB9XG4gICAgcmV0dXJuIHRydWU7XG59O1xuXG4vKipcbiAqIFRyaWdnZXIgYSB0aWNrIGEgc2NoZWR1bGUgYW4gb3RoZXIgY2FsbCB0byB0aGlzIGZ1bmN0aW9uLlxuICovXG5EYXRhV29ya2VyLnByb3RvdHlwZS5fdGlja0FuZFJlcGVhdCA9IGZ1bmN0aW9uKCkge1xuICAgIHRoaXMuX3RpY2tTY2hlZHVsZWQgPSBmYWxzZTtcbiAgICBpZih0aGlzLmlzUGF1c2VkIHx8IHRoaXMuaXNGaW5pc2hlZCkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIHRoaXMuX3RpY2soKTtcbiAgICBpZighdGhpcy5pc0ZpbmlzaGVkKSB7XG4gICAgICAgIHV0aWxzLmRlbGF5KHRoaXMuX3RpY2tBbmRSZXBlYXQsIFtdLCB0aGlzKTtcbiAgICAgICAgdGhpcy5fdGlja1NjaGVkdWxlZCA9IHRydWU7XG4gICAgfVxufTtcblxuLyoqXG4gKiBSZWFkIGFuZCBwdXNoIGEgY2h1bmsuXG4gKi9cbkRhdGFXb3JrZXIucHJvdG90eXBlLl90aWNrID0gZnVuY3Rpb24oKSB7XG5cbiAgICBpZih0aGlzLmlzUGF1c2VkIHx8IHRoaXMuaXNGaW5pc2hlZCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgdmFyIHNpemUgPSBERUZBVUxUX0JMT0NLX1NJWkU7XG4gICAgdmFyIGRhdGEgPSBudWxsLCBuZXh0SW5kZXggPSBNYXRoLm1pbih0aGlzLm1heCwgdGhpcy5pbmRleCArIHNpemUpO1xuICAgIGlmICh0aGlzLmluZGV4ID49IHRoaXMubWF4KSB7XG4gICAgICAgIC8vIEVPRlxuICAgICAgICByZXR1cm4gdGhpcy5lbmQoKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBzd2l0Y2godGhpcy50eXBlKSB7XG4gICAgICAgICAgICBjYXNlIFwic3RyaW5nXCI6XG4gICAgICAgICAgICAgICAgZGF0YSA9IHRoaXMuZGF0YS5zdWJzdHJpbmcodGhpcy5pbmRleCwgbmV4dEluZGV4KTtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBcInVpbnQ4YXJyYXlcIjpcbiAgICAgICAgICAgICAgICBkYXRhID0gdGhpcy5kYXRhLnN1YmFycmF5KHRoaXMuaW5kZXgsIG5leHRJbmRleCk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgXCJhcnJheVwiOlxuICAgICAgICAgICAgY2FzZSBcIm5vZGVidWZmZXJcIjpcbiAgICAgICAgICAgICAgICBkYXRhID0gdGhpcy5kYXRhLnNsaWNlKHRoaXMuaW5kZXgsIG5leHRJbmRleCk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmluZGV4ID0gbmV4dEluZGV4O1xuICAgICAgICByZXR1cm4gdGhpcy5wdXNoKHtcbiAgICAgICAgICAgIGRhdGEgOiBkYXRhLFxuICAgICAgICAgICAgbWV0YSA6IHtcbiAgICAgICAgICAgICAgICBwZXJjZW50IDogdGhpcy5tYXggPyB0aGlzLmluZGV4IC8gdGhpcy5tYXggKiAxMDAgOiAwXG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cbn07XG5cbm1vZHVsZS5leHBvcnRzID0gRGF0YVdvcmtlcjtcbiIsIid1c2Ugc3RyaWN0JztcblxuLyoqXG4gKiBBIHdvcmtlciB0aGF0IGRvZXMgbm90aGluZyBidXQgcGFzc2luZyBjaHVua3MgdG8gdGhlIG5leHQgb25lLiBUaGlzIGlzIGxpa2VcbiAqIGEgbm9kZWpzIHN0cmVhbSBidXQgd2l0aCBzb21lIGRpZmZlcmVuY2VzLiBPbiB0aGUgZ29vZCBzaWRlIDpcbiAqIC0gaXQgd29ya3Mgb24gSUUgNi05IHdpdGhvdXQgYW55IGlzc3VlIC8gcG9seWZpbGxcbiAqIC0gaXQgd2VpZ2h0cyBsZXNzIHRoYW4gdGhlIGZ1bGwgZGVwZW5kZW5jaWVzIGJ1bmRsZWQgd2l0aCBicm93c2VyaWZ5XG4gKiAtIGl0IGZvcndhcmRzIGVycm9ycyAobm8gbmVlZCB0byBkZWNsYXJlIGFuIGVycm9yIGhhbmRsZXIgRVZFUllXSEVSRSlcbiAqXG4gKiBBIGNodW5rIGlzIGFuIG9iamVjdCB3aXRoIDIgYXR0cmlidXRlcyA6IGBtZXRhYCBhbmQgYGRhdGFgLiBUaGUgZm9ybWVyIGlzIGFuXG4gKiBvYmplY3QgY29udGFpbmluZyBhbnl0aGluZyAoYHBlcmNlbnRgIGZvciBleGFtcGxlKSwgc2VlIGVhY2ggd29ya2VyIGZvciBtb3JlXG4gKiBkZXRhaWxzLiBUaGUgbGF0dGVyIGlzIHRoZSByZWFsIGRhdGEgKFN0cmluZywgVWludDhBcnJheSwgZXRjKS5cbiAqXG4gKiBAY29uc3RydWN0b3JcbiAqIEBwYXJhbSB7U3RyaW5nfSBuYW1lIHRoZSBuYW1lIG9mIHRoZSBzdHJlYW0gKG1haW5seSB1c2VkIGZvciBkZWJ1Z2dpbmcgcHVycG9zZXMpXG4gKi9cbmZ1bmN0aW9uIEdlbmVyaWNXb3JrZXIobmFtZSkge1xuICAgIC8vIHRoZSBuYW1lIG9mIHRoZSB3b3JrZXJcbiAgICB0aGlzLm5hbWUgPSBuYW1lIHx8IFwiZGVmYXVsdFwiO1xuICAgIC8vIGFuIG9iamVjdCBjb250YWluaW5nIG1ldGFkYXRhIGFib3V0IHRoZSB3b3JrZXJzIGNoYWluXG4gICAgdGhpcy5zdHJlYW1JbmZvID0ge307XG4gICAgLy8gYW4gZXJyb3Igd2hpY2ggaGFwcGVuZWQgd2hlbiB0aGUgd29ya2VyIHdhcyBwYXVzZWRcbiAgICB0aGlzLmdlbmVyYXRlZEVycm9yID0gbnVsbDtcbiAgICAvLyBhbiBvYmplY3QgY29udGFpbmluZyBtZXRhZGF0YSB0byBiZSBtZXJnZWQgYnkgdGhpcyB3b3JrZXIgaW50byB0aGUgZ2VuZXJhbCBtZXRhZGF0YVxuICAgIHRoaXMuZXh0cmFTdHJlYW1JbmZvID0ge307XG4gICAgLy8gdHJ1ZSBpZiB0aGUgc3RyZWFtIGlzIHBhdXNlZCAoYW5kIHNob3VsZCBub3QgZG8gYW55dGhpbmcpLCBmYWxzZSBvdGhlcndpc2VcbiAgICB0aGlzLmlzUGF1c2VkID0gdHJ1ZTtcbiAgICAvLyB0cnVlIGlmIHRoZSBzdHJlYW0gaXMgZmluaXNoZWQgKGFuZCBzaG91bGQgbm90IGRvIGFueXRoaW5nKSwgZmFsc2Ugb3RoZXJ3aXNlXG4gICAgdGhpcy5pc0ZpbmlzaGVkID0gZmFsc2U7XG4gICAgLy8gdHJ1ZSBpZiB0aGUgc3RyZWFtIGlzIGxvY2tlZCB0byBwcmV2ZW50IGZ1cnRoZXIgc3RydWN0dXJlIHVwZGF0ZXMgKHBpcGUpLCBmYWxzZSBvdGhlcndpc2VcbiAgICB0aGlzLmlzTG9ja2VkID0gZmFsc2U7XG4gICAgLy8gdGhlIGV2ZW50IGxpc3RlbmVyc1xuICAgIHRoaXMuX2xpc3RlbmVycyA9IHtcbiAgICAgICAgJ2RhdGEnOltdLFxuICAgICAgICAnZW5kJzpbXSxcbiAgICAgICAgJ2Vycm9yJzpbXVxuICAgIH07XG4gICAgLy8gdGhlIHByZXZpb3VzIHdvcmtlciwgaWYgYW55XG4gICAgdGhpcy5wcmV2aW91cyA9IG51bGw7XG59XG5cbkdlbmVyaWNXb3JrZXIucHJvdG90eXBlID0ge1xuICAgIC8qKlxuICAgICAqIFB1c2ggYSBjaHVuayB0byB0aGUgbmV4dCB3b3JrZXJzLlxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBjaHVuayB0aGUgY2h1bmsgdG8gcHVzaFxuICAgICAqL1xuICAgIHB1c2ggOiBmdW5jdGlvbiAoY2h1bmspIHtcbiAgICAgICAgdGhpcy5lbWl0KFwiZGF0YVwiLCBjaHVuayk7XG4gICAgfSxcbiAgICAvKipcbiAgICAgKiBFbmQgdGhlIHN0cmVhbS5cbiAgICAgKiBAcmV0dXJuIHtCb29sZWFufSB0cnVlIGlmIHRoaXMgY2FsbCBlbmRlZCB0aGUgd29ya2VyLCBmYWxzZSBvdGhlcndpc2UuXG4gICAgICovXG4gICAgZW5kIDogZnVuY3Rpb24gKCkge1xuICAgICAgICBpZiAodGhpcy5pc0ZpbmlzaGVkKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmZsdXNoKCk7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICB0aGlzLmVtaXQoXCJlbmRcIik7XG4gICAgICAgICAgICB0aGlzLmNsZWFuVXAoKTtcbiAgICAgICAgICAgIHRoaXMuaXNGaW5pc2hlZCA9IHRydWU7XG4gICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIHRoaXMuZW1pdChcImVycm9yXCIsIGUpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH0sXG4gICAgLyoqXG4gICAgICogRW5kIHRoZSBzdHJlYW0gd2l0aCBhbiBlcnJvci5cbiAgICAgKiBAcGFyYW0ge0Vycm9yfSBlIHRoZSBlcnJvciB3aGljaCBjYXVzZWQgdGhlIHByZW1hdHVyZSBlbmQuXG4gICAgICogQHJldHVybiB7Qm9vbGVhbn0gdHJ1ZSBpZiB0aGlzIGNhbGwgZW5kZWQgdGhlIHdvcmtlciB3aXRoIGFuIGVycm9yLCBmYWxzZSBvdGhlcndpc2UuXG4gICAgICovXG4gICAgZXJyb3IgOiBmdW5jdGlvbiAoZSkge1xuICAgICAgICBpZiAodGhpcy5pc0ZpbmlzaGVkKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICBpZih0aGlzLmlzUGF1c2VkKSB7XG4gICAgICAgICAgICB0aGlzLmdlbmVyYXRlZEVycm9yID0gZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuaXNGaW5pc2hlZCA9IHRydWU7XG5cbiAgICAgICAgICAgIHRoaXMuZW1pdChcImVycm9yXCIsIGUpO1xuXG4gICAgICAgICAgICAvLyBpbiB0aGUgd29ya2VycyBjaGFpbiBleHBsb2RlZCBpbiB0aGUgbWlkZGxlIG9mIHRoZSBjaGFpbixcbiAgICAgICAgICAgIC8vIHRoZSBlcnJvciBldmVudCB3aWxsIGdvIGRvd253YXJkIGJ1dCB3ZSBhbHNvIG5lZWQgdG8gbm90aWZ5XG4gICAgICAgICAgICAvLyB3b3JrZXJzIHVwd2FyZCB0aGF0IHRoZXJlIGhhcyBiZWVuIGFuIGVycm9yLlxuICAgICAgICAgICAgaWYodGhpcy5wcmV2aW91cykge1xuICAgICAgICAgICAgICAgIHRoaXMucHJldmlvdXMuZXJyb3IoZSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMuY2xlYW5VcCgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH0sXG4gICAgLyoqXG4gICAgICogQWRkIGEgY2FsbGJhY2sgb24gYW4gZXZlbnQuXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IG5hbWUgdGhlIG5hbWUgb2YgdGhlIGV2ZW50IChkYXRhLCBlbmQsIGVycm9yKVxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IGxpc3RlbmVyIHRoZSBmdW5jdGlvbiB0byBjYWxsIHdoZW4gdGhlIGV2ZW50IGlzIHRyaWdnZXJlZFxuICAgICAqIEByZXR1cm4ge0dlbmVyaWNXb3JrZXJ9IHRoZSBjdXJyZW50IG9iamVjdCBmb3IgY2hhaW5hYmlsaXR5XG4gICAgICovXG4gICAgb24gOiBmdW5jdGlvbiAobmFtZSwgbGlzdGVuZXIpIHtcbiAgICAgICAgdGhpcy5fbGlzdGVuZXJzW25hbWVdLnB1c2gobGlzdGVuZXIpO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuICAgIC8qKlxuICAgICAqIENsZWFuIGFueSByZWZlcmVuY2VzIHdoZW4gYSB3b3JrZXIgaXMgZW5kaW5nLlxuICAgICAqL1xuICAgIGNsZWFuVXAgOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHRoaXMuc3RyZWFtSW5mbyA9IHRoaXMuZ2VuZXJhdGVkRXJyb3IgPSB0aGlzLmV4dHJhU3RyZWFtSW5mbyA9IG51bGw7XG4gICAgICAgIHRoaXMuX2xpc3RlbmVycyA9IFtdO1xuICAgIH0sXG4gICAgLyoqXG4gICAgICogVHJpZ2dlciBhbiBldmVudC4gVGhpcyB3aWxsIGNhbGwgcmVnaXN0ZXJlZCBjYWxsYmFjayB3aXRoIHRoZSBwcm92aWRlZCBhcmcuXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IG5hbWUgdGhlIG5hbWUgb2YgdGhlIGV2ZW50IChkYXRhLCBlbmQsIGVycm9yKVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBhcmcgdGhlIGFyZ3VtZW50IHRvIGNhbGwgdGhlIGNhbGxiYWNrIHdpdGguXG4gICAgICovXG4gICAgZW1pdCA6IGZ1bmN0aW9uIChuYW1lLCBhcmcpIHtcbiAgICAgICAgaWYgKHRoaXMuX2xpc3RlbmVyc1tuYW1lXSkge1xuICAgICAgICAgICAgZm9yKHZhciBpID0gMDsgaSA8IHRoaXMuX2xpc3RlbmVyc1tuYW1lXS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIHRoaXMuX2xpc3RlbmVyc1tuYW1lXVtpXS5jYWxsKHRoaXMsIGFyZyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9LFxuICAgIC8qKlxuICAgICAqIENoYWluIGEgd29ya2VyIHdpdGggYW4gb3RoZXIuXG4gICAgICogQHBhcmFtIHtXb3JrZXJ9IG5leHQgdGhlIHdvcmtlciByZWNlaXZpbmcgZXZlbnRzIGZyb20gdGhlIGN1cnJlbnQgb25lLlxuICAgICAqIEByZXR1cm4ge3dvcmtlcn0gdGhlIG5leHQgd29ya2VyIGZvciBjaGFpbmFiaWxpdHlcbiAgICAgKi9cbiAgICBwaXBlIDogZnVuY3Rpb24gKG5leHQpIHtcbiAgICAgICAgcmV0dXJuIG5leHQucmVnaXN0ZXJQcmV2aW91cyh0aGlzKTtcbiAgICB9LFxuICAgIC8qKlxuICAgICAqIFNhbWUgYXMgYHBpcGVgIGluIHRoZSBvdGhlciBkaXJlY3Rpb24uXG4gICAgICogVXNpbmcgYW4gQVBJIHdpdGggYHBpcGUobmV4dClgIGlzIHZlcnkgZWFzeS5cbiAgICAgKiBJbXBsZW1lbnRpbmcgdGhlIEFQSSB3aXRoIHRoZSBwb2ludCBvZiB2aWV3IG9mIHRoZSBuZXh0IG9uZSByZWdpc3RlcmluZ1xuICAgICAqIGEgc291cmNlIGlzIGVhc2llciwgc2VlIHRoZSBaaXBGaWxlV29ya2VyLlxuICAgICAqIEBwYXJhbSB7V29ya2VyfSBwcmV2aW91cyB0aGUgcHJldmlvdXMgd29ya2VyLCBzZW5kaW5nIGV2ZW50cyB0byB0aGlzIG9uZVxuICAgICAqIEByZXR1cm4ge1dvcmtlcn0gdGhlIGN1cnJlbnQgd29ya2VyIGZvciBjaGFpbmFiaWxpdHlcbiAgICAgKi9cbiAgICByZWdpc3RlclByZXZpb3VzIDogZnVuY3Rpb24gKHByZXZpb3VzKSB7XG4gICAgICAgIGlmICh0aGlzLmlzTG9ja2VkKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJUaGUgc3RyZWFtICdcIiArIHRoaXMgKyBcIicgaGFzIGFscmVhZHkgYmVlbiB1c2VkLlwiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHNoYXJpbmcgdGhlIHN0cmVhbUluZm8uLi5cbiAgICAgICAgdGhpcy5zdHJlYW1JbmZvID0gcHJldmlvdXMuc3RyZWFtSW5mbztcbiAgICAgICAgLy8gLi4uIGFuZCBhZGRpbmcgb3VyIG93biBiaXRzXG4gICAgICAgIHRoaXMubWVyZ2VTdHJlYW1JbmZvKCk7XG4gICAgICAgIHRoaXMucHJldmlvdXMgPSAgcHJldmlvdXM7XG4gICAgICAgIHZhciBzZWxmID0gdGhpcztcbiAgICAgICAgcHJldmlvdXMub24oJ2RhdGEnLCBmdW5jdGlvbiAoY2h1bmspIHtcbiAgICAgICAgICAgIHNlbGYucHJvY2Vzc0NodW5rKGNodW5rKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHByZXZpb3VzLm9uKCdlbmQnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBzZWxmLmVuZCgpO1xuICAgICAgICB9KTtcbiAgICAgICAgcHJldmlvdXMub24oJ2Vycm9yJywgZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICAgIHNlbGYuZXJyb3IoZSk7XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuICAgIC8qKlxuICAgICAqIFBhdXNlIHRoZSBzdHJlYW0gc28gaXQgZG9lc24ndCBzZW5kIGV2ZW50cyBhbnltb3JlLlxuICAgICAqIEByZXR1cm4ge0Jvb2xlYW59IHRydWUgaWYgdGhpcyBjYWxsIHBhdXNlZCB0aGUgd29ya2VyLCBmYWxzZSBvdGhlcndpc2UuXG4gICAgICovXG4gICAgcGF1c2UgOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmKHRoaXMuaXNQYXVzZWQgfHwgdGhpcy5pc0ZpbmlzaGVkKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5pc1BhdXNlZCA9IHRydWU7XG5cbiAgICAgICAgaWYodGhpcy5wcmV2aW91cykge1xuICAgICAgICAgICAgdGhpcy5wcmV2aW91cy5wYXVzZSgpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH0sXG4gICAgLyoqXG4gICAgICogUmVzdW1lIGEgcGF1c2VkIHN0cmVhbS5cbiAgICAgKiBAcmV0dXJuIHtCb29sZWFufSB0cnVlIGlmIHRoaXMgY2FsbCByZXN1bWVkIHRoZSB3b3JrZXIsIGZhbHNlIG90aGVyd2lzZS5cbiAgICAgKi9cbiAgICByZXN1bWUgOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmKCF0aGlzLmlzUGF1c2VkIHx8IHRoaXMuaXNGaW5pc2hlZCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuaXNQYXVzZWQgPSBmYWxzZTtcblxuICAgICAgICAvLyBpZiB0cnVlLCB0aGUgd29ya2VyIHRyaWVkIHRvIHJlc3VtZSBidXQgZmFpbGVkXG4gICAgICAgIHZhciB3aXRoRXJyb3IgPSBmYWxzZTtcbiAgICAgICAgaWYodGhpcy5nZW5lcmF0ZWRFcnJvcikge1xuICAgICAgICAgICAgdGhpcy5lcnJvcih0aGlzLmdlbmVyYXRlZEVycm9yKTtcbiAgICAgICAgICAgIHdpdGhFcnJvciA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgaWYodGhpcy5wcmV2aW91cykge1xuICAgICAgICAgICAgdGhpcy5wcmV2aW91cy5yZXN1bWUoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiAhd2l0aEVycm9yO1xuICAgIH0sXG4gICAgLyoqXG4gICAgICogRmx1c2ggYW55IHJlbWFpbmluZyBieXRlcyBhcyB0aGUgc3RyZWFtIGlzIGVuZGluZy5cbiAgICAgKi9cbiAgICBmbHVzaCA6IGZ1bmN0aW9uICgpIHt9LFxuICAgIC8qKlxuICAgICAqIFByb2Nlc3MgYSBjaHVuay4gVGhpcyBpcyB1c3VhbGx5IHRoZSBtZXRob2Qgb3ZlcnJpZGRlbi5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gY2h1bmsgdGhlIGNodW5rIHRvIHByb2Nlc3MuXG4gICAgICovXG4gICAgcHJvY2Vzc0NodW5rIDogZnVuY3Rpb24oY2h1bmspIHtcbiAgICAgICAgdGhpcy5wdXNoKGNodW5rKTtcbiAgICB9LFxuICAgIC8qKlxuICAgICAqIEFkZCBhIGtleS92YWx1ZSB0byBiZSBhZGRlZCBpbiB0aGUgd29ya2VycyBjaGFpbiBzdHJlYW1JbmZvIG9uY2UgYWN0aXZhdGVkLlxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBrZXkgdGhlIGtleSB0byB1c2VcbiAgICAgKiBAcGFyYW0ge09iamVjdH0gdmFsdWUgdGhlIGFzc29jaWF0ZWQgdmFsdWVcbiAgICAgKiBAcmV0dXJuIHtXb3JrZXJ9IHRoZSBjdXJyZW50IHdvcmtlciBmb3IgY2hhaW5hYmlsaXR5XG4gICAgICovXG4gICAgd2l0aFN0cmVhbUluZm8gOiBmdW5jdGlvbiAoa2V5LCB2YWx1ZSkge1xuICAgICAgICB0aGlzLmV4dHJhU3RyZWFtSW5mb1trZXldID0gdmFsdWU7XG4gICAgICAgIHRoaXMubWVyZ2VTdHJlYW1JbmZvKCk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG4gICAgLyoqXG4gICAgICogTWVyZ2UgdGhpcyB3b3JrZXIncyBzdHJlYW1JbmZvIGludG8gdGhlIGNoYWluJ3Mgc3RyZWFtSW5mby5cbiAgICAgKi9cbiAgICBtZXJnZVN0cmVhbUluZm8gOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGZvcih2YXIga2V5IGluIHRoaXMuZXh0cmFTdHJlYW1JbmZvKSB7XG4gICAgICAgICAgICBpZiAoIXRoaXMuZXh0cmFTdHJlYW1JbmZvLmhhc093blByb3BlcnR5KGtleSkpIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuc3RyZWFtSW5mb1trZXldID0gdGhpcy5leHRyYVN0cmVhbUluZm9ba2V5XTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBMb2NrIHRoZSBzdHJlYW0gdG8gcHJldmVudCBmdXJ0aGVyIHVwZGF0ZXMgb24gdGhlIHdvcmtlcnMgY2hhaW4uXG4gICAgICogQWZ0ZXIgY2FsbGluZyB0aGlzIG1ldGhvZCwgYWxsIGNhbGxzIHRvIHBpcGUgd2lsbCBmYWlsLlxuICAgICAqL1xuICAgIGxvY2s6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKHRoaXMuaXNMb2NrZWQpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIlRoZSBzdHJlYW0gJ1wiICsgdGhpcyArIFwiJyBoYXMgYWxyZWFkeSBiZWVuIHVzZWQuXCIpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuaXNMb2NrZWQgPSB0cnVlO1xuICAgICAgICBpZiAodGhpcy5wcmV2aW91cykge1xuICAgICAgICAgICAgdGhpcy5wcmV2aW91cy5sb2NrKCk7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICpcbiAgICAgKiBQcmV0dHkgcHJpbnQgdGhlIHdvcmtlcnMgY2hhaW4uXG4gICAgICovXG4gICAgdG9TdHJpbmcgOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHZhciBtZSA9IFwiV29ya2VyIFwiICsgdGhpcy5uYW1lO1xuICAgICAgICBpZiAodGhpcy5wcmV2aW91cykge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMucHJldmlvdXMgKyBcIiAtPiBcIiArIG1lO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIG1lO1xuICAgICAgICB9XG4gICAgfVxufTtcblxubW9kdWxlLmV4cG9ydHMgPSBHZW5lcmljV29ya2VyO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgdXRpbHMgPSByZXF1aXJlKCcuLi91dGlscycpO1xudmFyIENvbnZlcnRXb3JrZXIgPSByZXF1aXJlKCcuL0NvbnZlcnRXb3JrZXInKTtcbnZhciBHZW5lcmljV29ya2VyID0gcmVxdWlyZSgnLi9HZW5lcmljV29ya2VyJyk7XG52YXIgYmFzZTY0ID0gcmVxdWlyZSgnLi4vYmFzZTY0Jyk7XG52YXIgTm9kZWpzU3RyZWFtT3V0cHV0QWRhcHRlciA9IHJlcXVpcmUoJy4uL25vZGVqcy9Ob2RlanNTdHJlYW1PdXRwdXRBZGFwdGVyJyk7XG52YXIgZXh0ZXJuYWwgPSByZXF1aXJlKFwiLi4vZXh0ZXJuYWxcIik7XG5cbi8qKlxuICogQXBwbHkgdGhlIGZpbmFsIHRyYW5zZm9ybWF0aW9uIG9mIHRoZSBkYXRhLiBJZiB0aGUgdXNlciB3YW50cyBhIEJsb2IgZm9yXG4gKiBleGFtcGxlLCBpdCdzIGVhc2llciB0byB3b3JrIHdpdGggYW4gVThpbnRBcnJheSBhbmQgZmluYWxseSBkbyB0aGVcbiAqIEFycmF5QnVmZmVyL0Jsb2IgY29udmVyc2lvbi5cbiAqIEBwYXJhbSB7U3RyaW5nfSB0eXBlIHRoZSBuYW1lIG9mIHRoZSBmaW5hbCB0eXBlXG4gKiBAcGFyYW0ge1N0cmluZ3xVaW50OEFycmF5fEJ1ZmZlcn0gY29udGVudCB0aGUgY29udGVudCB0byB0cmFuc2Zvcm1cbiAqIEBwYXJhbSB7U3RyaW5nfSBtaW1lVHlwZSB0aGUgbWltZSB0eXBlIG9mIHRoZSBjb250ZW50LCBpZiBhcHBsaWNhYmxlLlxuICogQHJldHVybiB7U3RyaW5nfFVpbnQ4QXJyYXl8QXJyYXlCdWZmZXJ8QnVmZmVyfEJsb2J9IHRoZSBjb250ZW50IGluIHRoZSByaWdodCBmb3JtYXQuXG4gKi9cbmZ1bmN0aW9uIHRyYW5zZm9ybVppcE91dHB1dCh0eXBlLCBjb250ZW50LCBtaW1lVHlwZSkge1xuICAgIHN3aXRjaCh0eXBlKSB7XG4gICAgICAgIGNhc2UgXCJibG9iXCIgOlxuICAgICAgICAgICAgcmV0dXJuIHV0aWxzLm5ld0Jsb2IodXRpbHMudHJhbnNmb3JtVG8oXCJhcnJheWJ1ZmZlclwiLCBjb250ZW50KSwgbWltZVR5cGUpO1xuICAgICAgICBjYXNlIFwiYmFzZTY0XCIgOlxuICAgICAgICAgICAgcmV0dXJuIGJhc2U2NC5lbmNvZGUoY29udGVudCk7XG4gICAgICAgIGRlZmF1bHQgOlxuICAgICAgICAgICAgcmV0dXJuIHV0aWxzLnRyYW5zZm9ybVRvKHR5cGUsIGNvbnRlbnQpO1xuICAgIH1cbn1cblxuLyoqXG4gKiBDb25jYXRlbmF0ZSBhbiBhcnJheSBvZiBkYXRhIG9mIHRoZSBnaXZlbiB0eXBlLlxuICogQHBhcmFtIHtTdHJpbmd9IHR5cGUgdGhlIHR5cGUgb2YgdGhlIGRhdGEgaW4gdGhlIGdpdmVuIGFycmF5LlxuICogQHBhcmFtIHtBcnJheX0gZGF0YUFycmF5IHRoZSBhcnJheSBjb250YWluaW5nIHRoZSBkYXRhIGNodW5rcyB0byBjb25jYXRlbmF0ZVxuICogQHJldHVybiB7U3RyaW5nfFVpbnQ4QXJyYXl8QnVmZmVyfSB0aGUgY29uY2F0ZW5hdGVkIGRhdGFcbiAqIEB0aHJvd3MgRXJyb3IgaWYgdGhlIGFza2VkIHR5cGUgaXMgdW5zdXBwb3J0ZWRcbiAqL1xuZnVuY3Rpb24gY29uY2F0ICh0eXBlLCBkYXRhQXJyYXkpIHtcbiAgICB2YXIgaSwgaW5kZXggPSAwLCByZXMgPSBudWxsLCB0b3RhbExlbmd0aCA9IDA7XG4gICAgZm9yKGkgPSAwOyBpIDwgZGF0YUFycmF5Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIHRvdGFsTGVuZ3RoICs9IGRhdGFBcnJheVtpXS5sZW5ndGg7XG4gICAgfVxuICAgIHN3aXRjaCh0eXBlKSB7XG4gICAgICAgIGNhc2UgXCJzdHJpbmdcIjpcbiAgICAgICAgICAgIHJldHVybiBkYXRhQXJyYXkuam9pbihcIlwiKTtcbiAgICAgICAgICBjYXNlIFwiYXJyYXlcIjpcbiAgICAgICAgICAgIHJldHVybiBBcnJheS5wcm90b3R5cGUuY29uY2F0LmFwcGx5KFtdLCBkYXRhQXJyYXkpO1xuICAgICAgICBjYXNlIFwidWludDhhcnJheVwiOlxuICAgICAgICAgICAgcmVzID0gbmV3IFVpbnQ4QXJyYXkodG90YWxMZW5ndGgpO1xuICAgICAgICAgICAgZm9yKGkgPSAwOyBpIDwgZGF0YUFycmF5Lmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgcmVzLnNldChkYXRhQXJyYXlbaV0sIGluZGV4KTtcbiAgICAgICAgICAgICAgICBpbmRleCArPSBkYXRhQXJyYXlbaV0ubGVuZ3RoO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHJlcztcbiAgICAgICAgY2FzZSBcIm5vZGVidWZmZXJcIjpcbiAgICAgICAgICAgIHJldHVybiBCdWZmZXIuY29uY2F0KGRhdGFBcnJheSk7XG4gICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJjb25jYXQgOiB1bnN1cHBvcnRlZCB0eXBlICdcIiAgKyB0eXBlICsgXCInXCIpO1xuICAgIH1cbn1cblxuLyoqXG4gKiBMaXN0ZW4gYSBTdHJlYW1IZWxwZXIsIGFjY3VtdWxhdGUgaXRzIGNvbnRlbnQgYW5kIGNvbmNhdGVuYXRlIGl0IGludG8gYVxuICogY29tcGxldGUgYmxvY2suXG4gKiBAcGFyYW0ge1N0cmVhbUhlbHBlcn0gaGVscGVyIHRoZSBoZWxwZXIgdG8gdXNlLlxuICogQHBhcmFtIHtGdW5jdGlvbn0gdXBkYXRlQ2FsbGJhY2sgYSBjYWxsYmFjayBjYWxsZWQgb24gZWFjaCB1cGRhdGUuIENhbGxlZFxuICogd2l0aCBvbmUgYXJnIDpcbiAqIC0gdGhlIG1ldGFkYXRhIGxpbmtlZCB0byB0aGUgdXBkYXRlIHJlY2VpdmVkLlxuICogQHJldHVybiBQcm9taXNlIHRoZSBwcm9taXNlIGZvciB0aGUgYWNjdW11bGF0aW9uLlxuICovXG5mdW5jdGlvbiBhY2N1bXVsYXRlKGhlbHBlciwgdXBkYXRlQ2FsbGJhY2spIHtcbiAgICByZXR1cm4gbmV3IGV4dGVybmFsLlByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCl7XG4gICAgICAgIHZhciBkYXRhQXJyYXkgPSBbXTtcbiAgICAgICAgdmFyIGNodW5rVHlwZSA9IGhlbHBlci5faW50ZXJuYWxUeXBlLFxuICAgICAgICAgICAgcmVzdWx0VHlwZSA9IGhlbHBlci5fb3V0cHV0VHlwZSxcbiAgICAgICAgICAgIG1pbWVUeXBlID0gaGVscGVyLl9taW1lVHlwZTtcbiAgICAgICAgaGVscGVyXG4gICAgICAgIC5vbignZGF0YScsIGZ1bmN0aW9uIChkYXRhLCBtZXRhKSB7XG4gICAgICAgICAgICBkYXRhQXJyYXkucHVzaChkYXRhKTtcbiAgICAgICAgICAgIGlmKHVwZGF0ZUNhbGxiYWNrKSB7XG4gICAgICAgICAgICAgICAgdXBkYXRlQ2FsbGJhY2sobWV0YSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pXG4gICAgICAgIC5vbignZXJyb3InLCBmdW5jdGlvbihlcnIpIHtcbiAgICAgICAgICAgIGRhdGFBcnJheSA9IFtdO1xuICAgICAgICAgICAgcmVqZWN0KGVycik7XG4gICAgICAgIH0pXG4gICAgICAgIC5vbignZW5kJywgZnVuY3Rpb24gKCl7XG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIHZhciByZXN1bHQgPSB0cmFuc2Zvcm1aaXBPdXRwdXQocmVzdWx0VHlwZSwgY29uY2F0KGNodW5rVHlwZSwgZGF0YUFycmF5KSwgbWltZVR5cGUpO1xuICAgICAgICAgICAgICAgIHJlc29sdmUocmVzdWx0KTtcbiAgICAgICAgICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICByZWplY3QoZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBkYXRhQXJyYXkgPSBbXTtcbiAgICAgICAgfSlcbiAgICAgICAgLnJlc3VtZSgpO1xuICAgIH0pO1xufVxuXG4vKipcbiAqIEFuIGhlbHBlciB0byBlYXNpbHkgdXNlIHdvcmtlcnMgb3V0c2lkZSBvZiBKU1ppcC5cbiAqIEBjb25zdHJ1Y3RvclxuICogQHBhcmFtIHtXb3JrZXJ9IHdvcmtlciB0aGUgd29ya2VyIHRvIHdyYXBcbiAqIEBwYXJhbSB7U3RyaW5nfSBvdXRwdXRUeXBlIHRoZSB0eXBlIG9mIGRhdGEgZXhwZWN0ZWQgYnkgdGhlIHVzZVxuICogQHBhcmFtIHtTdHJpbmd9IG1pbWVUeXBlIHRoZSBtaW1lIHR5cGUgb2YgdGhlIGNvbnRlbnQsIGlmIGFwcGxpY2FibGUuXG4gKi9cbmZ1bmN0aW9uIFN0cmVhbUhlbHBlcih3b3JrZXIsIG91dHB1dFR5cGUsIG1pbWVUeXBlKSB7XG4gICAgdmFyIGludGVybmFsVHlwZSA9IG91dHB1dFR5cGU7XG4gICAgc3dpdGNoKG91dHB1dFR5cGUpIHtcbiAgICAgICAgY2FzZSBcImJsb2JcIjpcbiAgICAgICAgY2FzZSBcImFycmF5YnVmZmVyXCI6XG4gICAgICAgICAgICBpbnRlcm5hbFR5cGUgPSBcInVpbnQ4YXJyYXlcIjtcbiAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgXCJiYXNlNjRcIjpcbiAgICAgICAgICAgIGludGVybmFsVHlwZSA9IFwic3RyaW5nXCI7XG4gICAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICAgIC8vIHRoZSB0eXBlIHVzZWQgaW50ZXJuYWxseVxuICAgICAgICB0aGlzLl9pbnRlcm5hbFR5cGUgPSBpbnRlcm5hbFR5cGU7XG4gICAgICAgIC8vIHRoZSB0eXBlIHVzZWQgdG8gb3V0cHV0IHJlc3VsdHNcbiAgICAgICAgdGhpcy5fb3V0cHV0VHlwZSA9IG91dHB1dFR5cGU7XG4gICAgICAgIC8vIHRoZSBtaW1lIHR5cGVcbiAgICAgICAgdGhpcy5fbWltZVR5cGUgPSBtaW1lVHlwZTtcbiAgICAgICAgdXRpbHMuY2hlY2tTdXBwb3J0KGludGVybmFsVHlwZSk7XG4gICAgICAgIHRoaXMuX3dvcmtlciA9IHdvcmtlci5waXBlKG5ldyBDb252ZXJ0V29ya2VyKGludGVybmFsVHlwZSkpO1xuICAgICAgICAvLyB0aGUgbGFzdCB3b3JrZXJzIGNhbiBiZSByZXdpcmVkIHdpdGhvdXQgaXNzdWVzIGJ1dCB3ZSBuZWVkIHRvXG4gICAgICAgIC8vIHByZXZlbnQgYW55IHVwZGF0ZXMgb24gcHJldmlvdXMgd29ya2Vycy5cbiAgICAgICAgd29ya2VyLmxvY2soKTtcbiAgICB9IGNhdGNoKGUpIHtcbiAgICAgICAgdGhpcy5fd29ya2VyID0gbmV3IEdlbmVyaWNXb3JrZXIoXCJlcnJvclwiKTtcbiAgICAgICAgdGhpcy5fd29ya2VyLmVycm9yKGUpO1xuICAgIH1cbn1cblxuU3RyZWFtSGVscGVyLnByb3RvdHlwZSA9IHtcbiAgICAvKipcbiAgICAgKiBMaXN0ZW4gYSBTdHJlYW1IZWxwZXIsIGFjY3VtdWxhdGUgaXRzIGNvbnRlbnQgYW5kIGNvbmNhdGVuYXRlIGl0IGludG8gYVxuICAgICAqIGNvbXBsZXRlIGJsb2NrLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IHVwZGF0ZUNiIHRoZSB1cGRhdGUgY2FsbGJhY2suXG4gICAgICogQHJldHVybiBQcm9taXNlIHRoZSBwcm9taXNlIGZvciB0aGUgYWNjdW11bGF0aW9uLlxuICAgICAqL1xuICAgIGFjY3VtdWxhdGUgOiBmdW5jdGlvbiAodXBkYXRlQ2IpIHtcbiAgICAgICAgcmV0dXJuIGFjY3VtdWxhdGUodGhpcywgdXBkYXRlQ2IpO1xuICAgIH0sXG4gICAgLyoqXG4gICAgICogQWRkIGEgbGlzdGVuZXIgb24gYW4gZXZlbnQgdHJpZ2dlcmVkIG9uIGEgc3RyZWFtLlxuICAgICAqIEBwYXJhbSB7U3RyaW5nfSBldnQgdGhlIG5hbWUgb2YgdGhlIGV2ZW50XG4gICAgICogQHBhcmFtIHtGdW5jdGlvbn0gZm4gdGhlIGxpc3RlbmVyXG4gICAgICogQHJldHVybiB7U3RyZWFtSGVscGVyfSB0aGUgY3VycmVudCBoZWxwZXIuXG4gICAgICovXG4gICAgb24gOiBmdW5jdGlvbiAoZXZ0LCBmbikge1xuICAgICAgICB2YXIgc2VsZiA9IHRoaXM7XG5cbiAgICAgICAgaWYoZXZ0ID09PSBcImRhdGFcIikge1xuICAgICAgICAgICAgdGhpcy5fd29ya2VyLm9uKGV2dCwgZnVuY3Rpb24gKGNodW5rKSB7XG4gICAgICAgICAgICAgICAgZm4uY2FsbChzZWxmLCBjaHVuay5kYXRhLCBjaHVuay5tZXRhKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5fd29ya2VyLm9uKGV2dCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHV0aWxzLmRlbGF5KGZuLCBhcmd1bWVudHMsIHNlbGYpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcbiAgICAvKipcbiAgICAgKiBSZXN1bWUgdGhlIGZsb3cgb2YgY2h1bmtzLlxuICAgICAqIEByZXR1cm4ge1N0cmVhbUhlbHBlcn0gdGhlIGN1cnJlbnQgaGVscGVyLlxuICAgICAqL1xuICAgIHJlc3VtZSA6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdXRpbHMuZGVsYXkodGhpcy5fd29ya2VyLnJlc3VtZSwgW10sIHRoaXMuX3dvcmtlcik7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG4gICAgLyoqXG4gICAgICogUGF1c2UgdGhlIGZsb3cgb2YgY2h1bmtzLlxuICAgICAqIEByZXR1cm4ge1N0cmVhbUhlbHBlcn0gdGhlIGN1cnJlbnQgaGVscGVyLlxuICAgICAqL1xuICAgIHBhdXNlIDogZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLl93b3JrZXIucGF1c2UoKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcbiAgICAvKipcbiAgICAgKiBSZXR1cm4gYSBub2RlanMgc3RyZWFtIGZvciB0aGlzIGhlbHBlci5cbiAgICAgKiBAcGFyYW0ge0Z1bmN0aW9ufSB1cGRhdGVDYiB0aGUgdXBkYXRlIGNhbGxiYWNrLlxuICAgICAqIEByZXR1cm4ge05vZGVqc1N0cmVhbU91dHB1dEFkYXB0ZXJ9IHRoZSBub2RlanMgc3RyZWFtLlxuICAgICAqL1xuICAgIHRvTm9kZWpzU3RyZWFtIDogZnVuY3Rpb24gKHVwZGF0ZUNiKSB7XG4gICAgICAgIHV0aWxzLmNoZWNrU3VwcG9ydChcIm5vZGVzdHJlYW1cIik7XG4gICAgICAgIGlmICh0aGlzLl9vdXRwdXRUeXBlICE9PSBcIm5vZGVidWZmZXJcIikge1xuICAgICAgICAgICAgLy8gYW4gb2JqZWN0IHN0cmVhbSBjb250YWluaW5nIGJsb2IvYXJyYXlidWZmZXIvdWludDhhcnJheS9zdHJpbmdcbiAgICAgICAgICAgIC8vIGlzIHN0cmFuZ2UgYW5kIEkgZG9uJ3Qga25vdyBpZiBpdCB3b3VsZCBiZSB1c2VmdWwuXG4gICAgICAgICAgICAvLyBJIHlvdSBmaW5kIHRoaXMgY29tbWVudCBhbmQgaGF2ZSBhIGdvb2QgdXNlY2FzZSwgcGxlYXNlIG9wZW4gYVxuICAgICAgICAgICAgLy8gYnVnIHJlcG9ydCAhXG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IodGhpcy5fb3V0cHV0VHlwZSArIFwiIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhpcyBtZXRob2RcIik7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbmV3IE5vZGVqc1N0cmVhbU91dHB1dEFkYXB0ZXIodGhpcywge1xuICAgICAgICAgICAgb2JqZWN0TW9kZSA6IHRoaXMuX291dHB1dFR5cGUgIT09IFwibm9kZWJ1ZmZlclwiXG4gICAgICAgIH0sIHVwZGF0ZUNiKTtcbiAgICB9XG59O1xuXG5cbm1vZHVsZS5leHBvcnRzID0gU3RyZWFtSGVscGVyO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5leHBvcnRzLmJhc2U2NCA9IHRydWU7XG5leHBvcnRzLmFycmF5ID0gdHJ1ZTtcbmV4cG9ydHMuc3RyaW5nID0gdHJ1ZTtcbmV4cG9ydHMuYXJyYXlidWZmZXIgPSB0eXBlb2YgQXJyYXlCdWZmZXIgIT09IFwidW5kZWZpbmVkXCIgJiYgdHlwZW9mIFVpbnQ4QXJyYXkgIT09IFwidW5kZWZpbmVkXCI7XG5leHBvcnRzLm5vZGVidWZmZXIgPSB0eXBlb2YgQnVmZmVyICE9PSBcInVuZGVmaW5lZFwiO1xuLy8gY29udGFpbnMgdHJ1ZSBpZiBKU1ppcCBjYW4gcmVhZC9nZW5lcmF0ZSBVaW50OEFycmF5LCBmYWxzZSBvdGhlcndpc2UuXG5leHBvcnRzLnVpbnQ4YXJyYXkgPSB0eXBlb2YgVWludDhBcnJheSAhPT0gXCJ1bmRlZmluZWRcIjtcblxuaWYgKHR5cGVvZiBBcnJheUJ1ZmZlciA9PT0gXCJ1bmRlZmluZWRcIikge1xuICAgIGV4cG9ydHMuYmxvYiA9IGZhbHNlO1xufVxuZWxzZSB7XG4gICAgdmFyIGJ1ZmZlciA9IG5ldyBBcnJheUJ1ZmZlcigwKTtcbiAgICB0cnkge1xuICAgICAgICBleHBvcnRzLmJsb2IgPSBuZXcgQmxvYihbYnVmZmVyXSwge1xuICAgICAgICAgICAgdHlwZTogXCJhcHBsaWNhdGlvbi96aXBcIlxuICAgICAgICB9KS5zaXplID09PSAwO1xuICAgIH1cbiAgICBjYXRjaCAoZSkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgdmFyIEJ1aWxkZXIgPSB3aW5kb3cuQmxvYkJ1aWxkZXIgfHwgd2luZG93LldlYktpdEJsb2JCdWlsZGVyIHx8IHdpbmRvdy5Nb3pCbG9iQnVpbGRlciB8fCB3aW5kb3cuTVNCbG9iQnVpbGRlcjtcbiAgICAgICAgICAgIHZhciBidWlsZGVyID0gbmV3IEJ1aWxkZXIoKTtcbiAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKGJ1ZmZlcik7XG4gICAgICAgICAgICBleHBvcnRzLmJsb2IgPSBidWlsZGVyLmdldEJsb2IoJ2FwcGxpY2F0aW9uL3ppcCcpLnNpemUgPT09IDA7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgIGV4cG9ydHMuYmxvYiA9IGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxufVxuXG5leHBvcnRzLm5vZGVzdHJlYW0gPSAhIXJlcXVpcmUoXCIuL25vZGVqcy9Ob2RlanNTdHJlYW1PdXRwdXRBZGFwdGVyXCIpLnByb3RvdHlwZTtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIHV0aWxzID0gcmVxdWlyZSgnLi91dGlscycpO1xudmFyIHN1cHBvcnQgPSByZXF1aXJlKCcuL3N1cHBvcnQnKTtcbnZhciBub2RlanNVdGlscyA9IHJlcXVpcmUoJy4vbm9kZWpzVXRpbHMnKTtcbnZhciBHZW5lcmljV29ya2VyID0gcmVxdWlyZSgnLi9zdHJlYW0vR2VuZXJpY1dvcmtlcicpO1xuXG4vKipcbiAqIFRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zIGNvbWUgZnJvbSBwYWtvLCBmcm9tIHBha28vbGliL3V0aWxzL3N0cmluZ3NcbiAqIHJlbGVhc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZSwgc2VlIHBha28gaHR0cHM6Ly9naXRodWIuY29tL25vZGVjYS9wYWtvL1xuICovXG5cbi8vIFRhYmxlIHdpdGggdXRmOCBsZW5ndGhzIChjYWxjdWxhdGVkIGJ5IGZpcnN0IGJ5dGUgb2Ygc2VxdWVuY2UpXG4vLyBOb3RlLCB0aGF0IDUgJiA2LWJ5dGUgdmFsdWVzIGFuZCBzb21lIDQtYnl0ZSB2YWx1ZXMgY2FuIG5vdCBiZSByZXByZXNlbnRlZCBpbiBKUyxcbi8vIGJlY2F1c2UgbWF4IHBvc3NpYmxlIGNvZGVwb2ludCBpcyAweDEwZmZmZlxudmFyIF91dGY4bGVuID0gbmV3IEFycmF5KDI1Nik7XG5mb3IgKHZhciBpPTA7IGk8MjU2OyBpKyspIHtcbiAgX3V0ZjhsZW5baV0gPSAoaSA+PSAyNTIgPyA2IDogaSA+PSAyNDggPyA1IDogaSA+PSAyNDAgPyA0IDogaSA+PSAyMjQgPyAzIDogaSA+PSAxOTIgPyAyIDogMSk7XG59XG5fdXRmOGxlblsyNTRdPV91dGY4bGVuWzI1NF09MTsgLy8gSW52YWxpZCBzZXF1ZW5jZSBzdGFydFxuXG4vLyBjb252ZXJ0IHN0cmluZyB0byBhcnJheSAodHlwZWQsIHdoZW4gcG9zc2libGUpXG52YXIgc3RyaW5nMmJ1ZiA9IGZ1bmN0aW9uIChzdHIpIHtcbiAgICB2YXIgYnVmLCBjLCBjMiwgbV9wb3MsIGksIHN0cl9sZW4gPSBzdHIubGVuZ3RoLCBidWZfbGVuID0gMDtcblxuICAgIC8vIGNvdW50IGJpbmFyeSBzaXplXG4gICAgZm9yIChtX3BvcyA9IDA7IG1fcG9zIDwgc3RyX2xlbjsgbV9wb3MrKykge1xuICAgICAgICBjID0gc3RyLmNoYXJDb2RlQXQobV9wb3MpO1xuICAgICAgICBpZiAoKGMgJiAweGZjMDApID09PSAweGQ4MDAgJiYgKG1fcG9zKzEgPCBzdHJfbGVuKSkge1xuICAgICAgICAgICAgYzIgPSBzdHIuY2hhckNvZGVBdChtX3BvcysxKTtcbiAgICAgICAgICAgIGlmICgoYzIgJiAweGZjMDApID09PSAweGRjMDApIHtcbiAgICAgICAgICAgICAgICBjID0gMHgxMDAwMCArICgoYyAtIDB4ZDgwMCkgPDwgMTApICsgKGMyIC0gMHhkYzAwKTtcbiAgICAgICAgICAgICAgICBtX3BvcysrO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGJ1Zl9sZW4gKz0gYyA8IDB4ODAgPyAxIDogYyA8IDB4ODAwID8gMiA6IGMgPCAweDEwMDAwID8gMyA6IDQ7XG4gICAgfVxuXG4gICAgLy8gYWxsb2NhdGUgYnVmZmVyXG4gICAgaWYgKHN1cHBvcnQudWludDhhcnJheSkge1xuICAgICAgICBidWYgPSBuZXcgVWludDhBcnJheShidWZfbGVuKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICBidWYgPSBuZXcgQXJyYXkoYnVmX2xlbik7XG4gICAgfVxuXG4gICAgLy8gY29udmVydFxuICAgIGZvciAoaT0wLCBtX3BvcyA9IDA7IGkgPCBidWZfbGVuOyBtX3BvcysrKSB7XG4gICAgICAgIGMgPSBzdHIuY2hhckNvZGVBdChtX3Bvcyk7XG4gICAgICAgIGlmICgoYyAmIDB4ZmMwMCkgPT09IDB4ZDgwMCAmJiAobV9wb3MrMSA8IHN0cl9sZW4pKSB7XG4gICAgICAgICAgICBjMiA9IHN0ci5jaGFyQ29kZUF0KG1fcG9zKzEpO1xuICAgICAgICAgICAgaWYgKChjMiAmIDB4ZmMwMCkgPT09IDB4ZGMwMCkge1xuICAgICAgICAgICAgICAgIGMgPSAweDEwMDAwICsgKChjIC0gMHhkODAwKSA8PCAxMCkgKyAoYzIgLSAweGRjMDApO1xuICAgICAgICAgICAgICAgIG1fcG9zKys7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgaWYgKGMgPCAweDgwKSB7XG4gICAgICAgICAgICAvKiBvbmUgYnl0ZSAqL1xuICAgICAgICAgICAgYnVmW2krK10gPSBjO1xuICAgICAgICB9IGVsc2UgaWYgKGMgPCAweDgwMCkge1xuICAgICAgICAgICAgLyogdHdvIGJ5dGVzICovXG4gICAgICAgICAgICBidWZbaSsrXSA9IDB4QzAgfCAoYyA+Pj4gNik7XG4gICAgICAgICAgICBidWZbaSsrXSA9IDB4ODAgfCAoYyAmIDB4M2YpO1xuICAgICAgICB9IGVsc2UgaWYgKGMgPCAweDEwMDAwKSB7XG4gICAgICAgICAgICAvKiB0aHJlZSBieXRlcyAqL1xuICAgICAgICAgICAgYnVmW2krK10gPSAweEUwIHwgKGMgPj4+IDEyKTtcbiAgICAgICAgICAgIGJ1ZltpKytdID0gMHg4MCB8IChjID4+PiA2ICYgMHgzZik7XG4gICAgICAgICAgICBidWZbaSsrXSA9IDB4ODAgfCAoYyAmIDB4M2YpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgLyogZm91ciBieXRlcyAqL1xuICAgICAgICAgICAgYnVmW2krK10gPSAweGYwIHwgKGMgPj4+IDE4KTtcbiAgICAgICAgICAgIGJ1ZltpKytdID0gMHg4MCB8IChjID4+PiAxMiAmIDB4M2YpO1xuICAgICAgICAgICAgYnVmW2krK10gPSAweDgwIHwgKGMgPj4+IDYgJiAweDNmKTtcbiAgICAgICAgICAgIGJ1ZltpKytdID0gMHg4MCB8IChjICYgMHgzZik7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gYnVmO1xufTtcblxuLy8gQ2FsY3VsYXRlIG1heCBwb3NzaWJsZSBwb3NpdGlvbiBpbiB1dGY4IGJ1ZmZlcixcbi8vIHRoYXQgd2lsbCBub3QgYnJlYWsgc2VxdWVuY2UuIElmIHRoYXQncyBub3QgcG9zc2libGVcbi8vIC0gKHZlcnkgc21hbGwgbGltaXRzKSByZXR1cm4gbWF4IHNpemUgYXMgaXMuXG4vL1xuLy8gYnVmW10gLSB1dGY4IGJ5dGVzIGFycmF5XG4vLyBtYXggICAtIGxlbmd0aCBsaW1pdCAobWFuZGF0b3J5KTtcbnZhciB1dGY4Ym9yZGVyID0gZnVuY3Rpb24oYnVmLCBtYXgpIHtcbiAgICB2YXIgcG9zO1xuXG4gICAgbWF4ID0gbWF4IHx8IGJ1Zi5sZW5ndGg7XG4gICAgaWYgKG1heCA+IGJ1Zi5sZW5ndGgpIHsgbWF4ID0gYnVmLmxlbmd0aDsgfVxuXG4gICAgLy8gZ28gYmFjayBmcm9tIGxhc3QgcG9zaXRpb24sIHVudGlsIHN0YXJ0IG9mIHNlcXVlbmNlIGZvdW5kXG4gICAgcG9zID0gbWF4LTE7XG4gICAgd2hpbGUgKHBvcyA+PSAwICYmIChidWZbcG9zXSAmIDB4QzApID09PSAweDgwKSB7IHBvcy0tOyB9XG5cbiAgICAvLyBGdWNrdXAgLSB2ZXJ5IHNtYWxsIGFuZCBicm9rZW4gc2VxdWVuY2UsXG4gICAgLy8gcmV0dXJuIG1heCwgYmVjYXVzZSB3ZSBzaG91bGQgcmV0dXJuIHNvbWV0aGluZyBhbnl3YXkuXG4gICAgaWYgKHBvcyA8IDApIHsgcmV0dXJuIG1heDsgfVxuXG4gICAgLy8gSWYgd2UgY2FtZSB0byBzdGFydCBvZiBidWZmZXIgLSB0aGF0IG1lYW5zIHZ1ZmZlciBpcyB0b28gc21hbGwsXG4gICAgLy8gcmV0dXJuIG1heCB0b28uXG4gICAgaWYgKHBvcyA9PT0gMCkgeyByZXR1cm4gbWF4OyB9XG5cbiAgICByZXR1cm4gKHBvcyArIF91dGY4bGVuW2J1Zltwb3NdXSA+IG1heCkgPyBwb3MgOiBtYXg7XG59O1xuXG4vLyBjb252ZXJ0IGFycmF5IHRvIHN0cmluZ1xudmFyIGJ1ZjJzdHJpbmcgPSBmdW5jdGlvbiAoYnVmKSB7XG4gICAgdmFyIHN0ciwgaSwgb3V0LCBjLCBjX2xlbjtcbiAgICB2YXIgbGVuID0gYnVmLmxlbmd0aDtcblxuICAgIC8vIFJlc2VydmUgbWF4IHBvc3NpYmxlIGxlbmd0aCAoMiB3b3JkcyBwZXIgY2hhcilcbiAgICAvLyBOQjogYnkgdW5rbm93biByZWFzb25zLCBBcnJheSBpcyBzaWduaWZpY2FudGx5IGZhc3RlciBmb3JcbiAgICAvLyAgICAgU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseSB0aGFuIFVpbnQxNkFycmF5LlxuICAgIHZhciB1dGYxNmJ1ZiA9IG5ldyBBcnJheShsZW4qMik7XG5cbiAgICBmb3IgKG91dD0wLCBpPTA7IGk8bGVuOykge1xuICAgICAgICBjID0gYnVmW2krK107XG4gICAgICAgIC8vIHF1aWNrIHByb2Nlc3MgYXNjaWlcbiAgICAgICAgaWYgKGMgPCAweDgwKSB7IHV0ZjE2YnVmW291dCsrXSA9IGM7IGNvbnRpbnVlOyB9XG5cbiAgICAgICAgY19sZW4gPSBfdXRmOGxlbltjXTtcbiAgICAgICAgLy8gc2tpcCA1ICYgNiBieXRlIGNvZGVzXG4gICAgICAgIGlmIChjX2xlbiA+IDQpIHsgdXRmMTZidWZbb3V0KytdID0gMHhmZmZkOyBpICs9IGNfbGVuLTE7IGNvbnRpbnVlOyB9XG5cbiAgICAgICAgLy8gYXBwbHkgbWFzayBvbiBmaXJzdCBieXRlXG4gICAgICAgIGMgJj0gY19sZW4gPT09IDIgPyAweDFmIDogY19sZW4gPT09IDMgPyAweDBmIDogMHgwNztcbiAgICAgICAgLy8gam9pbiB0aGUgcmVzdFxuICAgICAgICB3aGlsZSAoY19sZW4gPiAxICYmIGkgPCBsZW4pIHtcbiAgICAgICAgICAgIGMgPSAoYyA8PCA2KSB8IChidWZbaSsrXSAmIDB4M2YpO1xuICAgICAgICAgICAgY19sZW4tLTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHRlcm1pbmF0ZWQgYnkgZW5kIG9mIHN0cmluZz9cbiAgICAgICAgaWYgKGNfbGVuID4gMSkgeyB1dGYxNmJ1ZltvdXQrK10gPSAweGZmZmQ7IGNvbnRpbnVlOyB9XG5cbiAgICAgICAgaWYgKGMgPCAweDEwMDAwKSB7XG4gICAgICAgICAgICB1dGYxNmJ1ZltvdXQrK10gPSBjO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgYyAtPSAweDEwMDAwO1xuICAgICAgICAgICAgdXRmMTZidWZbb3V0KytdID0gMHhkODAwIHwgKChjID4+IDEwKSAmIDB4M2ZmKTtcbiAgICAgICAgICAgIHV0ZjE2YnVmW291dCsrXSA9IDB4ZGMwMCB8IChjICYgMHgzZmYpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gc2hyaW5rQnVmKHV0ZjE2YnVmLCBvdXQpXG4gICAgaWYgKHV0ZjE2YnVmLmxlbmd0aCAhPT0gb3V0KSB7XG4gICAgICAgIGlmKHV0ZjE2YnVmLnN1YmFycmF5KSB7XG4gICAgICAgICAgICB1dGYxNmJ1ZiA9IHV0ZjE2YnVmLnN1YmFycmF5KDAsIG91dCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB1dGYxNmJ1Zi5sZW5ndGggPSBvdXQ7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyByZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShudWxsLCB1dGYxNmJ1Zik7XG4gICAgcmV0dXJuIHV0aWxzLmFwcGx5RnJvbUNoYXJDb2RlKHV0ZjE2YnVmKTtcbn07XG5cblxuLy8gVGhhdCdzIGFsbCBmb3IgdGhlIHBha28gZnVuY3Rpb25zLlxuXG5cbi8qKlxuICogVHJhbnNmb3JtIGEgamF2YXNjcmlwdCBzdHJpbmcgaW50byBhbiBhcnJheSAodHlwZWQgaWYgcG9zc2libGUpIG9mIGJ5dGVzLFxuICogVVRGLTggZW5jb2RlZC5cbiAqIEBwYXJhbSB7U3RyaW5nfSBzdHIgdGhlIHN0cmluZyB0byBlbmNvZGVcbiAqIEByZXR1cm4ge0FycmF5fFVpbnQ4QXJyYXl8QnVmZmVyfSB0aGUgVVRGLTggZW5jb2RlZCBzdHJpbmcuXG4gKi9cbmV4cG9ydHMudXRmOGVuY29kZSA9IGZ1bmN0aW9uIHV0ZjhlbmNvZGUoc3RyKSB7XG4gICAgaWYgKHN1cHBvcnQubm9kZWJ1ZmZlcikge1xuICAgICAgICByZXR1cm4gbm9kZWpzVXRpbHMubmV3QnVmZmVyKHN0ciwgXCJ1dGYtOFwiKTtcbiAgICB9XG5cbiAgICByZXR1cm4gc3RyaW5nMmJ1ZihzdHIpO1xufTtcblxuXG4vKipcbiAqIFRyYW5zZm9ybSBhIGJ5dGVzIGFycmF5IChvciBhIHJlcHJlc2VudGF0aW9uKSByZXByZXNlbnRpbmcgYW4gVVRGLTggZW5jb2RlZFxuICogc3RyaW5nIGludG8gYSBqYXZhc2NyaXB0IHN0cmluZy5cbiAqIEBwYXJhbSB7QXJyYXl8VWludDhBcnJheXxCdWZmZXJ9IGJ1ZiB0aGUgZGF0YSBkZSBkZWNvZGVcbiAqIEByZXR1cm4ge1N0cmluZ30gdGhlIGRlY29kZWQgc3RyaW5nLlxuICovXG5leHBvcnRzLnV0ZjhkZWNvZGUgPSBmdW5jdGlvbiB1dGY4ZGVjb2RlKGJ1Zikge1xuICAgIGlmIChzdXBwb3J0Lm5vZGVidWZmZXIpIHtcbiAgICAgICAgcmV0dXJuIHV0aWxzLnRyYW5zZm9ybVRvKFwibm9kZWJ1ZmZlclwiLCBidWYpLnRvU3RyaW5nKFwidXRmLThcIik7XG4gICAgfVxuXG4gICAgYnVmID0gdXRpbHMudHJhbnNmb3JtVG8oc3VwcG9ydC51aW50OGFycmF5ID8gXCJ1aW50OGFycmF5XCIgOiBcImFycmF5XCIsIGJ1Zik7XG5cbiAgICByZXR1cm4gYnVmMnN0cmluZyhidWYpO1xufTtcblxuLyoqXG4gKiBBIHdvcmtlciB0byBkZWNvZGUgdXRmOCBlbmNvZGVkIGJpbmFyeSBjaHVua3MgaW50byBzdHJpbmcgY2h1bmtzLlxuICogQGNvbnN0cnVjdG9yXG4gKi9cbmZ1bmN0aW9uIFV0ZjhEZWNvZGVXb3JrZXIoKSB7XG4gICAgR2VuZXJpY1dvcmtlci5jYWxsKHRoaXMsIFwidXRmLTggZGVjb2RlXCIpO1xuICAgIC8vIHRoZSBsYXN0IGJ5dGVzIGlmIGEgY2h1bmsgZGlkbid0IGVuZCB3aXRoIGEgY29tcGxldGUgY29kZXBvaW50LlxuICAgIHRoaXMubGVmdE92ZXIgPSBudWxsO1xufVxudXRpbHMuaW5oZXJpdHMoVXRmOERlY29kZVdvcmtlciwgR2VuZXJpY1dvcmtlcik7XG5cbi8qKlxuICogQHNlZSBHZW5lcmljV29ya2VyLnByb2Nlc3NDaHVua1xuICovXG5VdGY4RGVjb2RlV29ya2VyLnByb3RvdHlwZS5wcm9jZXNzQ2h1bmsgPSBmdW5jdGlvbiAoY2h1bmspIHtcblxuICAgIHZhciBkYXRhID0gdXRpbHMudHJhbnNmb3JtVG8oc3VwcG9ydC51aW50OGFycmF5ID8gXCJ1aW50OGFycmF5XCIgOiBcImFycmF5XCIsIGNodW5rLmRhdGEpO1xuXG4gICAgLy8gMXN0IHN0ZXAsIHJlLXVzZSB3aGF0J3MgbGVmdCBvZiB0aGUgcHJldmlvdXMgY2h1bmtcbiAgICBpZiAodGhpcy5sZWZ0T3ZlciAmJiB0aGlzLmxlZnRPdmVyLmxlbmd0aCkge1xuICAgICAgICBpZihzdXBwb3J0LnVpbnQ4YXJyYXkpIHtcbiAgICAgICAgICAgIHZhciBwcmV2aW91c0RhdGEgPSBkYXRhO1xuICAgICAgICAgICAgZGF0YSA9IG5ldyBVaW50OEFycmF5KHByZXZpb3VzRGF0YS5sZW5ndGggKyB0aGlzLmxlZnRPdmVyLmxlbmd0aCk7XG4gICAgICAgICAgICBkYXRhLnNldCh0aGlzLmxlZnRPdmVyLCAwKTtcbiAgICAgICAgICAgIGRhdGEuc2V0KHByZXZpb3VzRGF0YSwgdGhpcy5sZWZ0T3Zlci5sZW5ndGgpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgZGF0YSA9IHRoaXMubGVmdE92ZXIuY29uY2F0KGRhdGEpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMubGVmdE92ZXIgPSBudWxsO1xuICAgIH1cblxuICAgIHZhciBuZXh0Qm91bmRhcnkgPSB1dGY4Ym9yZGVyKGRhdGEpO1xuICAgIHZhciB1c2FibGVEYXRhID0gZGF0YTtcbiAgICBpZiAobmV4dEJvdW5kYXJ5ICE9PSBkYXRhLmxlbmd0aCkge1xuICAgICAgICBpZiAoc3VwcG9ydC51aW50OGFycmF5KSB7XG4gICAgICAgICAgICB1c2FibGVEYXRhID0gZGF0YS5zdWJhcnJheSgwLCBuZXh0Qm91bmRhcnkpO1xuICAgICAgICAgICAgdGhpcy5sZWZ0T3ZlciA9IGRhdGEuc3ViYXJyYXkobmV4dEJvdW5kYXJ5LCBkYXRhLmxlbmd0aCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB1c2FibGVEYXRhID0gZGF0YS5zbGljZSgwLCBuZXh0Qm91bmRhcnkpO1xuICAgICAgICAgICAgdGhpcy5sZWZ0T3ZlciA9IGRhdGEuc2xpY2UobmV4dEJvdW5kYXJ5LCBkYXRhLmxlbmd0aCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICB0aGlzLnB1c2goe1xuICAgICAgICBkYXRhIDogZXhwb3J0cy51dGY4ZGVjb2RlKHVzYWJsZURhdGEpLFxuICAgICAgICBtZXRhIDogY2h1bmsubWV0YVxuICAgIH0pO1xufTtcblxuLyoqXG4gKiBAc2VlIEdlbmVyaWNXb3JrZXIuZmx1c2hcbiAqL1xuVXRmOERlY29kZVdvcmtlci5wcm90b3R5cGUuZmx1c2ggPSBmdW5jdGlvbiAoKSB7XG4gICAgaWYodGhpcy5sZWZ0T3ZlciAmJiB0aGlzLmxlZnRPdmVyLmxlbmd0aCkge1xuICAgICAgICB0aGlzLnB1c2goe1xuICAgICAgICAgICAgZGF0YSA6IGV4cG9ydHMudXRmOGRlY29kZSh0aGlzLmxlZnRPdmVyKSxcbiAgICAgICAgICAgIG1ldGEgOiB7fVxuICAgICAgICB9KTtcbiAgICAgICAgdGhpcy5sZWZ0T3ZlciA9IG51bGw7XG4gICAgfVxufTtcbmV4cG9ydHMuVXRmOERlY29kZVdvcmtlciA9IFV0ZjhEZWNvZGVXb3JrZXI7XG5cbi8qKlxuICogQSB3b3JrZXIgdG8gZW5kY29kZSBzdHJpbmcgY2h1bmtzIGludG8gdXRmOCBlbmNvZGVkIGJpbmFyeSBjaHVua3MuXG4gKiBAY29uc3RydWN0b3JcbiAqL1xuZnVuY3Rpb24gVXRmOEVuY29kZVdvcmtlcigpIHtcbiAgICBHZW5lcmljV29ya2VyLmNhbGwodGhpcywgXCJ1dGYtOCBlbmNvZGVcIik7XG59XG51dGlscy5pbmhlcml0cyhVdGY4RW5jb2RlV29ya2VyLCBHZW5lcmljV29ya2VyKTtcblxuLyoqXG4gKiBAc2VlIEdlbmVyaWNXb3JrZXIucHJvY2Vzc0NodW5rXG4gKi9cblV0ZjhFbmNvZGVXb3JrZXIucHJvdG90eXBlLnByb2Nlc3NDaHVuayA9IGZ1bmN0aW9uIChjaHVuaykge1xuICAgIHRoaXMucHVzaCh7XG4gICAgICAgIGRhdGEgOiBleHBvcnRzLnV0ZjhlbmNvZGUoY2h1bmsuZGF0YSksXG4gICAgICAgIG1ldGEgOiBjaHVuay5tZXRhXG4gICAgfSk7XG59O1xuZXhwb3J0cy5VdGY4RW5jb2RlV29ya2VyID0gVXRmOEVuY29kZVdvcmtlcjtcbiIsIid1c2Ugc3RyaWN0JztcblxudmFyIHN1cHBvcnQgPSByZXF1aXJlKCcuL3N1cHBvcnQnKTtcbnZhciBiYXNlNjQgPSByZXF1aXJlKCcuL2Jhc2U2NCcpO1xudmFyIG5vZGVqc1V0aWxzID0gcmVxdWlyZSgnLi9ub2RlanNVdGlscycpO1xudmFyIGFzYXAgPSByZXF1aXJlKCdhc2FwJyk7XG52YXIgZXh0ZXJuYWwgPSByZXF1aXJlKFwiLi9leHRlcm5hbFwiKTtcblxuXG4vKipcbiAqIENvbnZlcnQgYSBzdHJpbmcgdGhhdCBwYXNzIGFzIGEgXCJiaW5hcnkgc3RyaW5nXCI6IGl0IHNob3VsZCByZXByZXNlbnQgYSBieXRlXG4gKiBhcnJheSBidXQgbWF5IGhhdmUgPiAyNTUgY2hhciBjb2Rlcy4gQmUgc3VyZSB0byB0YWtlIG9ubHkgdGhlIGZpcnN0IGJ5dGVcbiAqIGFuZCByZXR1cm5zIHRoZSBieXRlIGFycmF5LlxuICogQHBhcmFtIHtTdHJpbmd9IHN0ciB0aGUgc3RyaW5nIHRvIHRyYW5zZm9ybS5cbiAqIEByZXR1cm4ge0FycmF5fFVpbnQ4QXJyYXl9IHRoZSBzdHJpbmcgaW4gYSBiaW5hcnkgZm9ybWF0LlxuICovXG5mdW5jdGlvbiBzdHJpbmcyYmluYXJ5KHN0cikge1xuICAgIHZhciByZXN1bHQgPSBudWxsO1xuICAgIGlmIChzdXBwb3J0LnVpbnQ4YXJyYXkpIHtcbiAgICAgIHJlc3VsdCA9IG5ldyBVaW50OEFycmF5KHN0ci5sZW5ndGgpO1xuICAgIH0gZWxzZSB7XG4gICAgICByZXN1bHQgPSBuZXcgQXJyYXkoc3RyLmxlbmd0aCk7XG4gICAgfVxuICAgIHJldHVybiBzdHJpbmdUb0FycmF5TGlrZShzdHIsIHJlc3VsdCk7XG59XG5cbi8qKlxuICogQ3JlYXRlIGEgbmV3IGJsb2Igd2l0aCB0aGUgZ2l2ZW4gY29udGVudCBhbmQgdGhlIGdpdmVuIHR5cGUuXG4gKiBAcGFyYW0ge1N0cmluZ3xBcnJheUJ1ZmZlcn0gcGFydCB0aGUgY29udGVudCB0byBwdXQgaW4gdGhlIGJsb2IuIERPIE5PVCB1c2VcbiAqIGFuIFVpbnQ4QXJyYXkgYmVjYXVzZSB0aGUgc3RvY2sgYnJvd3NlciBvZiBhbmRyb2lkIDQgd29uJ3QgYWNjZXB0IGl0IChpdFxuICogd2lsbCBiZSBzaWxlbnRseSBjb252ZXJ0ZWQgdG8gYSBzdHJpbmcsIFwiW29iamVjdCBVaW50OEFycmF5XVwiKS5cbiAqIEBwYXJhbSB7U3RyaW5nfSB0eXBlIHRoZSBtaW1lIHR5cGUgb2YgdGhlIGJsb2IuXG4gKiBAcmV0dXJuIHtCbG9ifSB0aGUgY3JlYXRlZCBibG9iLlxuICovXG5leHBvcnRzLm5ld0Jsb2IgPSBmdW5jdGlvbihwYXJ0LCB0eXBlKSB7XG4gICAgZXhwb3J0cy5jaGVja1N1cHBvcnQoXCJibG9iXCIpO1xuXG4gICAgdHJ5IHtcbiAgICAgICAgLy8gQmxvYiBjb25zdHJ1Y3RvclxuICAgICAgICByZXR1cm4gbmV3IEJsb2IoW3BhcnRdLCB7XG4gICAgICAgICAgICB0eXBlOiB0eXBlXG4gICAgICAgIH0pO1xuICAgIH1cbiAgICBjYXRjaCAoZSkge1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICAvLyBkZXByZWNhdGVkLCBicm93c2VyIG9ubHksIG9sZCB3YXlcbiAgICAgICAgICAgIHZhciBCdWlsZGVyID0gd2luZG93LkJsb2JCdWlsZGVyIHx8IHdpbmRvdy5XZWJLaXRCbG9iQnVpbGRlciB8fCB3aW5kb3cuTW96QmxvYkJ1aWxkZXIgfHwgd2luZG93Lk1TQmxvYkJ1aWxkZXI7XG4gICAgICAgICAgICB2YXIgYnVpbGRlciA9IG5ldyBCdWlsZGVyKCk7XG4gICAgICAgICAgICBidWlsZGVyLmFwcGVuZChwYXJ0KTtcbiAgICAgICAgICAgIHJldHVybiBidWlsZGVyLmdldEJsb2IodHlwZSk7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2ggKGUpIHtcblxuICAgICAgICAgICAgLy8gd2VsbCwgZnVjayA/IVxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQnVnIDogY2FuJ3QgY29uc3RydWN0IHRoZSBCbG9iLlwiKTtcbiAgICAgICAgfVxuICAgIH1cblxuXG59O1xuLyoqXG4gKiBUaGUgaWRlbnRpdHkgZnVuY3Rpb24uXG4gKiBAcGFyYW0ge09iamVjdH0gaW5wdXQgdGhlIGlucHV0LlxuICogQHJldHVybiB7T2JqZWN0fSB0aGUgc2FtZSBpbnB1dC5cbiAqL1xuZnVuY3Rpb24gaWRlbnRpdHkoaW5wdXQpIHtcbiAgICByZXR1cm4gaW5wdXQ7XG59XG5cbi8qKlxuICogRmlsbCBpbiBhbiBhcnJheSB3aXRoIGEgc3RyaW5nLlxuICogQHBhcmFtIHtTdHJpbmd9IHN0ciB0aGUgc3RyaW5nIHRvIHVzZS5cbiAqIEBwYXJhbSB7QXJyYXl8QXJyYXlCdWZmZXJ8VWludDhBcnJheXxCdWZmZXJ9IGFycmF5IHRoZSBhcnJheSB0byBmaWxsIGluICh3aWxsIGJlIG11dGF0ZWQpLlxuICogQHJldHVybiB7QXJyYXl8QXJyYXlCdWZmZXJ8VWludDhBcnJheXxCdWZmZXJ9IHRoZSB1cGRhdGVkIGFycmF5LlxuICovXG5mdW5jdGlvbiBzdHJpbmdUb0FycmF5TGlrZShzdHIsIGFycmF5KSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBzdHIubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgYXJyYXlbaV0gPSBzdHIuY2hhckNvZGVBdChpKSAmIDB4RkY7XG4gICAgfVxuICAgIHJldHVybiBhcnJheTtcbn1cblxuLyoqXG4gKiBBbiBoZWxwZXIgZm9yIHRoZSBmdW5jdGlvbiBhcnJheUxpa2VUb1N0cmluZy5cbiAqIFRoaXMgY29udGFpbnMgc3RhdGljIGluZm9ybWF0aW9ucyBhbmQgZnVuY3Rpb25zIHRoYXRcbiAqIGNhbiBiZSBvcHRpbWl6ZWQgYnkgdGhlIGJyb3dzZXIgSklUIGNvbXBpbGVyLlxuICovXG52YXIgYXJyYXlUb1N0cmluZ0hlbHBlciA9IHtcbiAgICAvKipcbiAgICAgKiBUcmFuc2Zvcm0gYW4gYXJyYXkgb2YgaW50IGludG8gYSBzdHJpbmcsIGNodW5rIGJ5IGNodW5rLlxuICAgICAqIFNlZSB0aGUgcGVyZm9ybWFuY2VzIG5vdGVzIG9uIGFycmF5TGlrZVRvU3RyaW5nLlxuICAgICAqIEBwYXJhbSB7QXJyYXl8QXJyYXlCdWZmZXJ8VWludDhBcnJheXxCdWZmZXJ9IGFycmF5IHRoZSBhcnJheSB0byB0cmFuc2Zvcm0uXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IHR5cGUgdGhlIHR5cGUgb2YgdGhlIGFycmF5LlxuICAgICAqIEBwYXJhbSB7SW50ZWdlcn0gY2h1bmsgdGhlIGNodW5rIHNpemUuXG4gICAgICogQHJldHVybiB7U3RyaW5nfSB0aGUgcmVzdWx0aW5nIHN0cmluZy5cbiAgICAgKiBAdGhyb3dzIEVycm9yIGlmIHRoZSBjaHVuayBpcyB0b28gYmlnIGZvciB0aGUgc3RhY2suXG4gICAgICovXG4gICAgc3RyaW5naWZ5QnlDaHVuazogZnVuY3Rpb24oYXJyYXksIHR5cGUsIGNodW5rKSB7XG4gICAgICAgIHZhciByZXN1bHQgPSBbXSwgayA9IDAsIGxlbiA9IGFycmF5Lmxlbmd0aDtcbiAgICAgICAgLy8gc2hvcnRjdXRcbiAgICAgICAgaWYgKGxlbiA8PSBjaHVuaykge1xuICAgICAgICAgICAgcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkobnVsbCwgYXJyYXkpO1xuICAgICAgICB9XG4gICAgICAgIHdoaWxlIChrIDwgbGVuKSB7XG4gICAgICAgICAgICBpZiAodHlwZSA9PT0gXCJhcnJheVwiIHx8IHR5cGUgPT09IFwibm9kZWJ1ZmZlclwiKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0LnB1c2goU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShudWxsLCBhcnJheS5zbGljZShrLCBNYXRoLm1pbihrICsgY2h1bmssIGxlbikpKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXN1bHQucHVzaChTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KG51bGwsIGFycmF5LnN1YmFycmF5KGssIE1hdGgubWluKGsgKyBjaHVuaywgbGVuKSkpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGsgKz0gY2h1bms7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHJlc3VsdC5qb2luKFwiXCIpO1xuICAgIH0sXG4gICAgLyoqXG4gICAgICogQ2FsbCBTdHJpbmcuZnJvbUNoYXJDb2RlIG9uIGV2ZXJ5IGl0ZW0gaW4gdGhlIGFycmF5LlxuICAgICAqIFRoaXMgaXMgdGhlIG5haXZlIGltcGxlbWVudGF0aW9uLCB3aGljaCBnZW5lcmF0ZSBBIExPVCBvZiBpbnRlcm1lZGlhdGUgc3RyaW5nLlxuICAgICAqIFRoaXMgc2hvdWxkIGJlIHVzZWQgd2hlbiBldmVyeXRoaW5nIGVsc2UgZmFpbC5cbiAgICAgKiBAcGFyYW0ge0FycmF5fEFycmF5QnVmZmVyfFVpbnQ4QXJyYXl8QnVmZmVyfSBhcnJheSB0aGUgYXJyYXkgdG8gdHJhbnNmb3JtLlxuICAgICAqIEByZXR1cm4ge1N0cmluZ30gdGhlIHJlc3VsdC5cbiAgICAgKi9cbiAgICBzdHJpbmdpZnlCeUNoYXI6IGZ1bmN0aW9uKGFycmF5KXtcbiAgICAgICAgdmFyIHJlc3VsdFN0ciA9IFwiXCI7XG4gICAgICAgIGZvcih2YXIgaSA9IDA7IGkgPCBhcnJheS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgcmVzdWx0U3RyICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoYXJyYXlbaV0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHRTdHI7XG4gICAgfSxcbiAgICBhcHBseUNhbkJlVXNlZCA6IHtcbiAgICAgICAgLyoqXG4gICAgICAgICAqIHRydWUgaWYgdGhlIGJyb3dzZXIgYWNjZXB0cyB0byB1c2UgU3RyaW5nLmZyb21DaGFyQ29kZSBvbiBVaW50OEFycmF5XG4gICAgICAgICAqL1xuICAgICAgICB1aW50OGFycmF5IDogKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHN1cHBvcnQudWludDhhcnJheSAmJiBTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KG51bGwsIG5ldyBVaW50OEFycmF5KDEpKS5sZW5ndGggPT09IDE7XG4gICAgICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KSgpLFxuICAgICAgICAvKipcbiAgICAgICAgICogdHJ1ZSBpZiB0aGUgYnJvd3NlciBhY2NlcHRzIHRvIHVzZSBTdHJpbmcuZnJvbUNoYXJDb2RlIG9uIG5vZGVqcyBCdWZmZXIuXG4gICAgICAgICAqL1xuICAgICAgICBub2RlYnVmZmVyIDogKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHN1cHBvcnQubm9kZWJ1ZmZlciAmJiBTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KG51bGwsIG5vZGVqc1V0aWxzLm5ld0J1ZmZlcigxKSkubGVuZ3RoID09PSAxO1xuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSkoKVxuICAgIH1cbn07XG5cbi8qKlxuICogVHJhbnNmb3JtIGFuIGFycmF5LWxpa2Ugb2JqZWN0IHRvIGEgc3RyaW5nLlxuICogQHBhcmFtIHtBcnJheXxBcnJheUJ1ZmZlcnxVaW50OEFycmF5fEJ1ZmZlcn0gYXJyYXkgdGhlIGFycmF5IHRvIHRyYW5zZm9ybS5cbiAqIEByZXR1cm4ge1N0cmluZ30gdGhlIHJlc3VsdC5cbiAqL1xuZnVuY3Rpb24gYXJyYXlMaWtlVG9TdHJpbmcoYXJyYXkpIHtcbiAgICAvLyBQZXJmb3JtYW5jZXMgbm90ZXMgOlxuICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tXG4gICAgLy8gU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShudWxsLCBhcnJheSkgaXMgdGhlIGZhc3Rlc3QsIHNlZVxuICAgIC8vIHNlZSBodHRwOi8vanNwZXJmLmNvbS9jb252ZXJ0aW5nLWEtdWludDhhcnJheS10by1hLXN0cmluZy8yXG4gICAgLy8gYnV0IHRoZSBzdGFjayBpcyBsaW1pdGVkIChhbmQgd2UgY2FuIGdldCBodWdlIGFycmF5cyAhKS5cbiAgICAvL1xuICAgIC8vIHJlc3VsdCArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGFycmF5W2ldKTsgZ2VuZXJhdGUgdG9vIG1hbnkgc3RyaW5ncyAhXG4gICAgLy9cbiAgICAvLyBUaGlzIGNvZGUgaXMgaW5zcGlyZWQgYnkgaHR0cDovL2pzcGVyZi5jb20vYXJyYXlidWZmZXItdG8tc3RyaW5nLWFwcGx5LXBlcmZvcm1hbmNlLzJcbiAgICAvLyBUT0RPIDogd2Ugbm93IGhhdmUgd29ya2VycyB0aGF0IHNwbGl0IHRoZSB3b3JrLiBEbyB3ZSBzdGlsbCBuZWVkIHRoYXQgP1xuICAgIHZhciBjaHVuayA9IDY1NTM2LFxuICAgICAgICB0eXBlID0gZXhwb3J0cy5nZXRUeXBlT2YoYXJyYXkpLFxuICAgICAgICBjYW5Vc2VBcHBseSA9IHRydWU7XG4gICAgaWYgKHR5cGUgPT09IFwidWludDhhcnJheVwiKSB7XG4gICAgICAgIGNhblVzZUFwcGx5ID0gYXJyYXlUb1N0cmluZ0hlbHBlci5hcHBseUNhbkJlVXNlZC51aW50OGFycmF5O1xuICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gXCJub2RlYnVmZmVyXCIpIHtcbiAgICAgICAgY2FuVXNlQXBwbHkgPSBhcnJheVRvU3RyaW5nSGVscGVyLmFwcGx5Q2FuQmVVc2VkLm5vZGVidWZmZXI7XG4gICAgfVxuXG4gICAgaWYgKGNhblVzZUFwcGx5KSB7XG4gICAgICAgIHdoaWxlIChjaHVuayA+IDEpIHtcbiAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGFycmF5VG9TdHJpbmdIZWxwZXIuc3RyaW5naWZ5QnlDaHVuayhhcnJheSwgdHlwZSwgY2h1bmspO1xuICAgICAgICAgICAgfSBjYXRjaCAoZSkge1xuICAgICAgICAgICAgICAgIGNodW5rID0gTWF0aC5mbG9vcihjaHVuayAvIDIpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gbm8gYXBwbHkgb3IgY2h1bmsgZXJyb3IgOiBzbG93IGFuZCBwYWluZnVsIGFsZ29yaXRobVxuICAgIC8vIGRlZmF1bHQgYnJvd3NlciBvbiBhbmRyb2lkIDQuKlxuICAgIHJldHVybiBhcnJheVRvU3RyaW5nSGVscGVyLnN0cmluZ2lmeUJ5Q2hhcihhcnJheSk7XG59XG5cbmV4cG9ydHMuYXBwbHlGcm9tQ2hhckNvZGUgPSBhcnJheUxpa2VUb1N0cmluZztcblxuXG4vKipcbiAqIENvcHkgdGhlIGRhdGEgZnJvbSBhbiBhcnJheS1saWtlIHRvIGFuIG90aGVyIGFycmF5LWxpa2UuXG4gKiBAcGFyYW0ge0FycmF5fEFycmF5QnVmZmVyfFVpbnQ4QXJyYXl8QnVmZmVyfSBhcnJheUZyb20gdGhlIG9yaWdpbiBhcnJheS5cbiAqIEBwYXJhbSB7QXJyYXl8QXJyYXlCdWZmZXJ8VWludDhBcnJheXxCdWZmZXJ9IGFycmF5VG8gdGhlIGRlc3RpbmF0aW9uIGFycmF5IHdoaWNoIHdpbGwgYmUgbXV0YXRlZC5cbiAqIEByZXR1cm4ge0FycmF5fEFycmF5QnVmZmVyfFVpbnQ4QXJyYXl8QnVmZmVyfSB0aGUgdXBkYXRlZCBkZXN0aW5hdGlvbiBhcnJheS5cbiAqL1xuZnVuY3Rpb24gYXJyYXlMaWtlVG9BcnJheUxpa2UoYXJyYXlGcm9tLCBhcnJheVRvKSB7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcnJheUZyb20ubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgYXJyYXlUb1tpXSA9IGFycmF5RnJvbVtpXTtcbiAgICB9XG4gICAgcmV0dXJuIGFycmF5VG87XG59XG5cbi8vIGEgbWF0cml4IGNvbnRhaW5pbmcgZnVuY3Rpb25zIHRvIHRyYW5zZm9ybSBldmVyeXRoaW5nIGludG8gZXZlcnl0aGluZy5cbnZhciB0cmFuc2Zvcm0gPSB7fTtcblxuLy8gc3RyaW5nIHRvID9cbnRyYW5zZm9ybVtcInN0cmluZ1wiXSA9IHtcbiAgICBcInN0cmluZ1wiOiBpZGVudGl0eSxcbiAgICBcImFycmF5XCI6IGZ1bmN0aW9uKGlucHV0KSB7XG4gICAgICAgIHJldHVybiBzdHJpbmdUb0FycmF5TGlrZShpbnB1dCwgbmV3IEFycmF5KGlucHV0Lmxlbmd0aCkpO1xuICAgIH0sXG4gICAgXCJhcnJheWJ1ZmZlclwiOiBmdW5jdGlvbihpbnB1dCkge1xuICAgICAgICByZXR1cm4gdHJhbnNmb3JtW1wic3RyaW5nXCJdW1widWludDhhcnJheVwiXShpbnB1dCkuYnVmZmVyO1xuICAgIH0sXG4gICAgXCJ1aW50OGFycmF5XCI6IGZ1bmN0aW9uKGlucHV0KSB7XG4gICAgICAgIHJldHVybiBzdHJpbmdUb0FycmF5TGlrZShpbnB1dCwgbmV3IFVpbnQ4QXJyYXkoaW5wdXQubGVuZ3RoKSk7XG4gICAgfSxcbiAgICBcIm5vZGVidWZmZXJcIjogZnVuY3Rpb24oaW5wdXQpIHtcbiAgICAgICAgcmV0dXJuIHN0cmluZ1RvQXJyYXlMaWtlKGlucHV0LCBub2RlanNVdGlscy5uZXdCdWZmZXIoaW5wdXQubGVuZ3RoKSk7XG4gICAgfVxufTtcblxuLy8gYXJyYXkgdG8gP1xudHJhbnNmb3JtW1wiYXJyYXlcIl0gPSB7XG4gICAgXCJzdHJpbmdcIjogYXJyYXlMaWtlVG9TdHJpbmcsXG4gICAgXCJhcnJheVwiOiBpZGVudGl0eSxcbiAgICBcImFycmF5YnVmZmVyXCI6IGZ1bmN0aW9uKGlucHV0KSB7XG4gICAgICAgIHJldHVybiAobmV3IFVpbnQ4QXJyYXkoaW5wdXQpKS5idWZmZXI7XG4gICAgfSxcbiAgICBcInVpbnQ4YXJyYXlcIjogZnVuY3Rpb24oaW5wdXQpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBVaW50OEFycmF5KGlucHV0KTtcbiAgICB9LFxuICAgIFwibm9kZWJ1ZmZlclwiOiBmdW5jdGlvbihpbnB1dCkge1xuICAgICAgICByZXR1cm4gbm9kZWpzVXRpbHMubmV3QnVmZmVyKGlucHV0KTtcbiAgICB9XG59O1xuXG4vLyBhcnJheWJ1ZmZlciB0byA/XG50cmFuc2Zvcm1bXCJhcnJheWJ1ZmZlclwiXSA9IHtcbiAgICBcInN0cmluZ1wiOiBmdW5jdGlvbihpbnB1dCkge1xuICAgICAgICByZXR1cm4gYXJyYXlMaWtlVG9TdHJpbmcobmV3IFVpbnQ4QXJyYXkoaW5wdXQpKTtcbiAgICB9LFxuICAgIFwiYXJyYXlcIjogZnVuY3Rpb24oaW5wdXQpIHtcbiAgICAgICAgcmV0dXJuIGFycmF5TGlrZVRvQXJyYXlMaWtlKG5ldyBVaW50OEFycmF5KGlucHV0KSwgbmV3IEFycmF5KGlucHV0LmJ5dGVMZW5ndGgpKTtcbiAgICB9LFxuICAgIFwiYXJyYXlidWZmZXJcIjogaWRlbnRpdHksXG4gICAgXCJ1aW50OGFycmF5XCI6IGZ1bmN0aW9uKGlucHV0KSB7XG4gICAgICAgIHJldHVybiBuZXcgVWludDhBcnJheShpbnB1dCk7XG4gICAgfSxcbiAgICBcIm5vZGVidWZmZXJcIjogZnVuY3Rpb24oaW5wdXQpIHtcbiAgICAgICAgcmV0dXJuIG5vZGVqc1V0aWxzLm5ld0J1ZmZlcihuZXcgVWludDhBcnJheShpbnB1dCkpO1xuICAgIH1cbn07XG5cbi8vIHVpbnQ4YXJyYXkgdG8gP1xudHJhbnNmb3JtW1widWludDhhcnJheVwiXSA9IHtcbiAgICBcInN0cmluZ1wiOiBhcnJheUxpa2VUb1N0cmluZyxcbiAgICBcImFycmF5XCI6IGZ1bmN0aW9uKGlucHV0KSB7XG4gICAgICAgIHJldHVybiBhcnJheUxpa2VUb0FycmF5TGlrZShpbnB1dCwgbmV3IEFycmF5KGlucHV0Lmxlbmd0aCkpO1xuICAgIH0sXG4gICAgXCJhcnJheWJ1ZmZlclwiOiBmdW5jdGlvbihpbnB1dCkge1xuICAgICAgICByZXR1cm4gaW5wdXQuYnVmZmVyO1xuICAgIH0sXG4gICAgXCJ1aW50OGFycmF5XCI6IGlkZW50aXR5LFxuICAgIFwibm9kZWJ1ZmZlclwiOiBmdW5jdGlvbihpbnB1dCkge1xuICAgICAgICByZXR1cm4gbm9kZWpzVXRpbHMubmV3QnVmZmVyKGlucHV0KTtcbiAgICB9XG59O1xuXG4vLyBub2RlYnVmZmVyIHRvID9cbnRyYW5zZm9ybVtcIm5vZGVidWZmZXJcIl0gPSB7XG4gICAgXCJzdHJpbmdcIjogYXJyYXlMaWtlVG9TdHJpbmcsXG4gICAgXCJhcnJheVwiOiBmdW5jdGlvbihpbnB1dCkge1xuICAgICAgICByZXR1cm4gYXJyYXlMaWtlVG9BcnJheUxpa2UoaW5wdXQsIG5ldyBBcnJheShpbnB1dC5sZW5ndGgpKTtcbiAgICB9LFxuICAgIFwiYXJyYXlidWZmZXJcIjogZnVuY3Rpb24oaW5wdXQpIHtcbiAgICAgICAgcmV0dXJuIHRyYW5zZm9ybVtcIm5vZGVidWZmZXJcIl1bXCJ1aW50OGFycmF5XCJdKGlucHV0KS5idWZmZXI7XG4gICAgfSxcbiAgICBcInVpbnQ4YXJyYXlcIjogZnVuY3Rpb24oaW5wdXQpIHtcbiAgICAgICAgcmV0dXJuIGFycmF5TGlrZVRvQXJyYXlMaWtlKGlucHV0LCBuZXcgVWludDhBcnJheShpbnB1dC5sZW5ndGgpKTtcbiAgICB9LFxuICAgIFwibm9kZWJ1ZmZlclwiOiBpZGVudGl0eVxufTtcblxuLyoqXG4gKiBUcmFuc2Zvcm0gYW4gaW5wdXQgaW50byBhbnkgdHlwZS5cbiAqIFRoZSBzdXBwb3J0ZWQgb3V0cHV0IHR5cGUgYXJlIDogc3RyaW5nLCBhcnJheSwgdWludDhhcnJheSwgYXJyYXlidWZmZXIsIG5vZGVidWZmZXIuXG4gKiBJZiBubyBvdXRwdXQgdHlwZSBpcyBzcGVjaWZpZWQsIHRoZSB1bm1vZGlmaWVkIGlucHV0IHdpbGwgYmUgcmV0dXJuZWQuXG4gKiBAcGFyYW0ge1N0cmluZ30gb3V0cHV0VHlwZSB0aGUgb3V0cHV0IHR5cGUuXG4gKiBAcGFyYW0ge1N0cmluZ3xBcnJheXxBcnJheUJ1ZmZlcnxVaW50OEFycmF5fEJ1ZmZlcn0gaW5wdXQgdGhlIGlucHV0IHRvIGNvbnZlcnQuXG4gKiBAdGhyb3dzIHtFcnJvcn0gYW4gRXJyb3IgaWYgdGhlIGJyb3dzZXIgZG9lc24ndCBzdXBwb3J0IHRoZSByZXF1ZXN0ZWQgb3V0cHV0IHR5cGUuXG4gKi9cbmV4cG9ydHMudHJhbnNmb3JtVG8gPSBmdW5jdGlvbihvdXRwdXRUeXBlLCBpbnB1dCkge1xuICAgIGlmICghaW5wdXQpIHtcbiAgICAgICAgLy8gdW5kZWZpbmVkLCBudWxsLCBldGNcbiAgICAgICAgLy8gYW4gZW1wdHkgc3RyaW5nIHdvbid0IGhhcm0uXG4gICAgICAgIGlucHV0ID0gXCJcIjtcbiAgICB9XG4gICAgaWYgKCFvdXRwdXRUeXBlKSB7XG4gICAgICAgIHJldHVybiBpbnB1dDtcbiAgICB9XG4gICAgZXhwb3J0cy5jaGVja1N1cHBvcnQob3V0cHV0VHlwZSk7XG4gICAgdmFyIGlucHV0VHlwZSA9IGV4cG9ydHMuZ2V0VHlwZU9mKGlucHV0KTtcbiAgICB2YXIgcmVzdWx0ID0gdHJhbnNmb3JtW2lucHV0VHlwZV1bb3V0cHV0VHlwZV0oaW5wdXQpO1xuICAgIHJldHVybiByZXN1bHQ7XG59O1xuXG4vKipcbiAqIFJldHVybiB0aGUgdHlwZSBvZiB0aGUgaW5wdXQuXG4gKiBUaGUgdHlwZSB3aWxsIGJlIGluIGEgZm9ybWF0IHZhbGlkIGZvciBKU1ppcC51dGlscy50cmFuc2Zvcm1UbyA6IHN0cmluZywgYXJyYXksIHVpbnQ4YXJyYXksIGFycmF5YnVmZmVyLlxuICogQHBhcmFtIHtPYmplY3R9IGlucHV0IHRoZSBpbnB1dCB0byBpZGVudGlmeS5cbiAqIEByZXR1cm4ge1N0cmluZ30gdGhlIChsb3dlcmNhc2UpIHR5cGUgb2YgdGhlIGlucHV0LlxuICovXG5leHBvcnRzLmdldFR5cGVPZiA9IGZ1bmN0aW9uKGlucHV0KSB7XG4gICAgaWYgKHR5cGVvZiBpbnB1dCA9PT0gXCJzdHJpbmdcIikge1xuICAgICAgICByZXR1cm4gXCJzdHJpbmdcIjtcbiAgICB9XG4gICAgaWYgKE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChpbnB1dCkgPT09IFwiW29iamVjdCBBcnJheV1cIikge1xuICAgICAgICByZXR1cm4gXCJhcnJheVwiO1xuICAgIH1cbiAgICBpZiAoc3VwcG9ydC5ub2RlYnVmZmVyICYmIG5vZGVqc1V0aWxzLmlzQnVmZmVyKGlucHV0KSkge1xuICAgICAgICByZXR1cm4gXCJub2RlYnVmZmVyXCI7XG4gICAgfVxuICAgIGlmIChzdXBwb3J0LnVpbnQ4YXJyYXkgJiYgaW5wdXQgaW5zdGFuY2VvZiBVaW50OEFycmF5KSB7XG4gICAgICAgIHJldHVybiBcInVpbnQ4YXJyYXlcIjtcbiAgICB9XG4gICAgaWYgKHN1cHBvcnQuYXJyYXlidWZmZXIgJiYgaW5wdXQgaW5zdGFuY2VvZiBBcnJheUJ1ZmZlcikge1xuICAgICAgICByZXR1cm4gXCJhcnJheWJ1ZmZlclwiO1xuICAgIH1cbn07XG5cbi8qKlxuICogVGhyb3cgYW4gZXhjZXB0aW9uIGlmIHRoZSB0eXBlIGlzIG5vdCBzdXBwb3J0ZWQuXG4gKiBAcGFyYW0ge1N0cmluZ30gdHlwZSB0aGUgdHlwZSB0byBjaGVjay5cbiAqIEB0aHJvd3Mge0Vycm9yfSBhbiBFcnJvciBpZiB0aGUgYnJvd3NlciBkb2Vzbid0IHN1cHBvcnQgdGhlIHJlcXVlc3RlZCB0eXBlLlxuICovXG5leHBvcnRzLmNoZWNrU3VwcG9ydCA9IGZ1bmN0aW9uKHR5cGUpIHtcbiAgICB2YXIgc3VwcG9ydGVkID0gc3VwcG9ydFt0eXBlLnRvTG93ZXJDYXNlKCldO1xuICAgIGlmICghc3VwcG9ydGVkKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcih0eXBlICsgXCIgaXMgbm90IHN1cHBvcnRlZCBieSB0aGlzIHBsYXRmb3JtXCIpO1xuICAgIH1cbn07XG5cbmV4cG9ydHMuTUFYX1ZBTFVFXzE2QklUUyA9IDY1NTM1O1xuZXhwb3J0cy5NQVhfVkFMVUVfMzJCSVRTID0gLTE7IC8vIHdlbGwsIFwiXFx4RkZcXHhGRlxceEZGXFx4RkZcXHhGRlxceEZGXFx4RkZcXHhGRlwiIGlzIHBhcnNlZCBhcyAtMVxuXG4vKipcbiAqIFByZXR0aWZ5IGEgc3RyaW5nIHJlYWQgYXMgYmluYXJ5LlxuICogQHBhcmFtIHtzdHJpbmd9IHN0ciB0aGUgc3RyaW5nIHRvIHByZXR0aWZ5LlxuICogQHJldHVybiB7c3RyaW5nfSBhIHByZXR0eSBzdHJpbmcuXG4gKi9cbmV4cG9ydHMucHJldHR5ID0gZnVuY3Rpb24oc3RyKSB7XG4gICAgdmFyIHJlcyA9ICcnLFxuICAgICAgICBjb2RlLCBpO1xuICAgIGZvciAoaSA9IDA7IGkgPCAoc3RyIHx8IFwiXCIpLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGNvZGUgPSBzdHIuY2hhckNvZGVBdChpKTtcbiAgICAgICAgcmVzICs9ICdcXFxceCcgKyAoY29kZSA8IDE2ID8gXCIwXCIgOiBcIlwiKSArIGNvZGUudG9TdHJpbmcoMTYpLnRvVXBwZXJDYXNlKCk7XG4gICAgfVxuICAgIHJldHVybiByZXM7XG59O1xuXG4vKipcbiAqIERlZmVyIHRoZSBjYWxsIG9mIGEgZnVuY3Rpb24uXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBjYWxsYmFjayB0aGUgZnVuY3Rpb24gdG8gY2FsbCBhc3luY2hyb25vdXNseS5cbiAqIEBwYXJhbSB7QXJyYXl9IGFyZ3MgdGhlIGFyZ3VtZW50cyB0byBnaXZlIHRvIHRoZSBjYWxsYmFjay5cbiAqL1xuZXhwb3J0cy5kZWxheSA9IGZ1bmN0aW9uKGNhbGxiYWNrLCBhcmdzLCBzZWxmKSB7XG4gICAgYXNhcChmdW5jdGlvbiAoKSB7XG4gICAgICAgIGNhbGxiYWNrLmFwcGx5KHNlbGYgfHwgbnVsbCwgYXJncyB8fCBbXSk7XG4gICAgfSk7XG59O1xuXG4vKipcbiAqIEV4dGVuZHMgYSBwcm90b3R5cGUgd2l0aCBhbiBvdGhlciwgd2l0aG91dCBjYWxsaW5nIGEgY29uc3RydWN0b3Igd2l0aFxuICogc2lkZSBlZmZlY3RzLiBJbnNwaXJlZCBieSBub2RlanMnIGB1dGlscy5pbmhlcml0c2BcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGN0b3IgdGhlIGNvbnN0cnVjdG9yIHRvIGF1Z21lbnRcbiAqIEBwYXJhbSB7RnVuY3Rpb259IHN1cGVyQ3RvciB0aGUgcGFyZW50IGNvbnN0cnVjdG9yIHRvIHVzZVxuICovXG5leHBvcnRzLmluaGVyaXRzID0gZnVuY3Rpb24gKGN0b3IsIHN1cGVyQ3Rvcikge1xuICAgIHZhciBPYmogPSBmdW5jdGlvbigpIHt9O1xuICAgIE9iai5wcm90b3R5cGUgPSBzdXBlckN0b3IucHJvdG90eXBlO1xuICAgIGN0b3IucHJvdG90eXBlID0gbmV3IE9iaigpO1xufTtcblxuLyoqXG4gKiBNZXJnZSB0aGUgb2JqZWN0cyBwYXNzZWQgYXMgcGFyYW1ldGVycyBpbnRvIGEgbmV3IG9uZS5cbiAqIEBwcml2YXRlXG4gKiBAcGFyYW0gey4uLk9iamVjdH0gdmFyX2FyZ3MgQWxsIG9iamVjdHMgdG8gbWVyZ2UuXG4gKiBAcmV0dXJuIHtPYmplY3R9IGEgbmV3IG9iamVjdCB3aXRoIHRoZSBkYXRhIG9mIHRoZSBvdGhlcnMuXG4gKi9cbmV4cG9ydHMuZXh0ZW5kID0gZnVuY3Rpb24oKSB7XG4gICAgdmFyIHJlc3VsdCA9IHt9LCBpLCBhdHRyO1xuICAgIGZvciAoaSA9IDA7IGkgPCBhcmd1bWVudHMubGVuZ3RoOyBpKyspIHsgLy8gYXJndW1lbnRzIGlzIG5vdCBlbnVtZXJhYmxlIGluIHNvbWUgYnJvd3NlcnNcbiAgICAgICAgZm9yIChhdHRyIGluIGFyZ3VtZW50c1tpXSkge1xuICAgICAgICAgICAgaWYgKGFyZ3VtZW50c1tpXS5oYXNPd25Qcm9wZXJ0eShhdHRyKSAmJiB0eXBlb2YgcmVzdWx0W2F0dHJdID09PSBcInVuZGVmaW5lZFwiKSB7XG4gICAgICAgICAgICAgICAgcmVzdWx0W2F0dHJdID0gYXJndW1lbnRzW2ldW2F0dHJdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiByZXN1bHQ7XG59O1xuXG4vKipcbiAqIFRyYW5zZm9ybSBhcmJpdHJhcnkgY29udGVudCBpbnRvIGEgUHJvbWlzZS5cbiAqIEBwYXJhbSB7U3RyaW5nfSBuYW1lIGEgbmFtZSBmb3IgdGhlIGNvbnRlbnQgYmVpbmcgcHJvY2Vzc2VkLlxuICogQHBhcmFtIHtPYmplY3R9IGlucHV0RGF0YSB0aGUgY29udGVudCB0byBwcm9jZXNzLlxuICogQHBhcmFtIHtCb29sZWFufSBpc0JpbmFyeSB0cnVlIGlmIHRoZSBjb250ZW50IGlzIG5vdCBhbiB1bmljb2RlIHN0cmluZ1xuICogQHBhcmFtIHtCb29sZWFufSBpc09wdGltaXplZEJpbmFyeVN0cmluZyB0cnVlIGlmIHRoZSBzdHJpbmcgY29udGVudCBvbmx5IGhhcyBvbmUgYnl0ZSBwZXIgY2hhcmFjdGVyLlxuICogQHBhcmFtIHtCb29sZWFufSBpc0Jhc2U2NCB0cnVlIGlmIHRoZSBzdHJpbmcgY29udGVudCBpcyBlbmNvZGVkIHdpdGggYmFzZTY0LlxuICogQHJldHVybiB7UHJvbWlzZX0gYSBwcm9taXNlIGluIGEgZm9ybWF0IHVzYWJsZSBieSBKU1ppcC5cbiAqL1xuZXhwb3J0cy5wcmVwYXJlQ29udGVudCA9IGZ1bmN0aW9uKG5hbWUsIGlucHV0RGF0YSwgaXNCaW5hcnksIGlzT3B0aW1pemVkQmluYXJ5U3RyaW5nLCBpc0Jhc2U2NCkge1xuXG4gICAgdmFyIHByb21pc2UgPSBudWxsO1xuICAgIGlmIChzdXBwb3J0LmJsb2IgJiYgaW5wdXREYXRhIGluc3RhbmNlb2YgQmxvYiAmJiB0eXBlb2YgRmlsZVJlYWRlciAhPT0gXCJ1bmRlZmluZWRcIikge1xuICAgICAgICBwcm9taXNlID0gbmV3IGV4dGVybmFsLlByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICAgICAgdmFyIHJlYWRlciA9IG5ldyBGaWxlUmVhZGVyKCk7XG5cbiAgICAgICAgICAgIHJlYWRlci5vbmxvYWQgPSBmdW5jdGlvbihlKSB7XG4gICAgICAgICAgICAgICAgcmVzb2x2ZShlLnRhcmdldC5yZXN1bHQpO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHJlYWRlci5vbmVycm9yID0gZnVuY3Rpb24oZSkge1xuICAgICAgICAgICAgICAgIHJlamVjdChlLnRhcmdldC5lcnJvcik7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgcmVhZGVyLnJlYWRBc0FycmF5QnVmZmVyKGlucHV0RGF0YSk7XG4gICAgICAgIH0pO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIC8vIGlmIGRhdGEgaXMgYWxyZWFkeSBhIHByb21pc2UsIHRoaXMgZmxhdHRlbiBpdC5cbiAgICAgICAgcHJvbWlzZSA9IGV4dGVybmFsLlByb21pc2UucmVzb2x2ZShpbnB1dERhdGEpO1xuICAgIH1cblxuICAgIHJldHVybiBwcm9taXNlLnRoZW4oZnVuY3Rpb24oZGF0YSkge1xuICAgICAgICB2YXIgZGF0YVR5cGUgPSBleHBvcnRzLmdldFR5cGVPZihkYXRhKTtcblxuICAgICAgICBpZiAoIWRhdGFUeXBlKSB7XG4gICAgICAgICAgICByZXR1cm4gZXh0ZXJuYWwuUHJvbWlzZS5yZWplY3QoXG4gICAgICAgICAgICAgICAgbmV3IEVycm9yKFwiVGhlIGRhdGEgb2YgJ1wiICsgbmFtZSArIFwiJyBpcyBpbiBhbiB1bnN1cHBvcnRlZCBmb3JtYXQgIVwiKVxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBzcGVjaWFsIGNhc2UgOiBpdCdzIHdheSBlYXNpZXIgdG8gd29yayB3aXRoIFVpbnQ4QXJyYXkgdGhhbiB3aXRoIEFycmF5QnVmZmVyXG4gICAgICAgIGlmIChkYXRhVHlwZSA9PT0gXCJhcnJheWJ1ZmZlclwiKSB7XG4gICAgICAgICAgICBkYXRhID0gZXhwb3J0cy50cmFuc2Zvcm1UbyhcInVpbnQ4YXJyYXlcIiwgZGF0YSk7XG4gICAgICAgIH0gZWxzZSBpZiAoZGF0YVR5cGUgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICAgIGlmIChpc0Jhc2U2NCkge1xuICAgICAgICAgICAgICAgIGRhdGEgPSBiYXNlNjQuZGVjb2RlKGRhdGEpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoaXNCaW5hcnkpIHtcbiAgICAgICAgICAgICAgICAvLyBvcHRpbWl6ZWRCaW5hcnlTdHJpbmcgPT09IHRydWUgbWVhbnMgdGhhdCB0aGUgZmlsZSBoYXMgYWxyZWFkeSBiZWVuIGZpbHRlcmVkIHdpdGggYSAweEZGIG1hc2tcbiAgICAgICAgICAgICAgICBpZiAoaXNPcHRpbWl6ZWRCaW5hcnlTdHJpbmcgIT09IHRydWUpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gdGhpcyBpcyBhIHN0cmluZywgbm90IGluIGEgYmFzZTY0IGZvcm1hdC5cbiAgICAgICAgICAgICAgICAgICAgLy8gQmUgc3VyZSB0aGF0IHRoaXMgaXMgYSBjb3JyZWN0IFwiYmluYXJ5IHN0cmluZ1wiXG4gICAgICAgICAgICAgICAgICAgIGRhdGEgPSBzdHJpbmcyYmluYXJ5KGRhdGEpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZGF0YTtcbiAgICB9KTtcbn07XG4iLCIndXNlIHN0cmljdCc7XG52YXIgcmVhZGVyRm9yID0gcmVxdWlyZSgnLi9yZWFkZXIvcmVhZGVyRm9yJyk7XG52YXIgdXRpbHMgPSByZXF1aXJlKCcuL3V0aWxzJyk7XG52YXIgc2lnID0gcmVxdWlyZSgnLi9zaWduYXR1cmUnKTtcbnZhciBaaXBFbnRyeSA9IHJlcXVpcmUoJy4vemlwRW50cnknKTtcbnZhciB1dGY4ID0gcmVxdWlyZSgnLi91dGY4Jyk7XG52YXIgc3VwcG9ydCA9IHJlcXVpcmUoJy4vc3VwcG9ydCcpO1xuLy8gIGNsYXNzIFppcEVudHJpZXMge3t7XG4vKipcbiAqIEFsbCB0aGUgZW50cmllcyBpbiB0aGUgemlwIGZpbGUuXG4gKiBAY29uc3RydWN0b3JcbiAqIEBwYXJhbSB7T2JqZWN0fSBsb2FkT3B0aW9ucyBPcHRpb25zIGZvciBsb2FkaW5nIHRoZSBzdHJlYW0uXG4gKi9cbmZ1bmN0aW9uIFppcEVudHJpZXMobG9hZE9wdGlvbnMpIHtcbiAgICB0aGlzLmZpbGVzID0gW107XG4gICAgdGhpcy5sb2FkT3B0aW9ucyA9IGxvYWRPcHRpb25zO1xufVxuWmlwRW50cmllcy5wcm90b3R5cGUgPSB7XG4gICAgLyoqXG4gICAgICogQ2hlY2sgdGhhdCB0aGUgcmVhZGVyIGlzIG9uIHRoZSBzcGVmaWNpZWQgc2lnbmF0dXJlLlxuICAgICAqIEBwYXJhbSB7c3RyaW5nfSBleHBlY3RlZFNpZ25hdHVyZSB0aGUgZXhwZWN0ZWQgc2lnbmF0dXJlLlxuICAgICAqIEB0aHJvd3Mge0Vycm9yfSBpZiBpdCBpcyBhbiBvdGhlciBzaWduYXR1cmUuXG4gICAgICovXG4gICAgY2hlY2tTaWduYXR1cmU6IGZ1bmN0aW9uKGV4cGVjdGVkU2lnbmF0dXJlKSB7XG4gICAgICAgIGlmICghdGhpcy5yZWFkZXIucmVhZEFuZENoZWNrU2lnbmF0dXJlKGV4cGVjdGVkU2lnbmF0dXJlKSkge1xuICAgICAgICAgICAgdGhpcy5yZWFkZXIuaW5kZXggLT0gNDtcbiAgICAgICAgICAgIHZhciBzaWduYXR1cmUgPSB0aGlzLnJlYWRlci5yZWFkU3RyaW5nKDQpO1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQ29ycnVwdGVkIHppcCBvciBidWcgOiB1bmV4cGVjdGVkIHNpZ25hdHVyZSBcIiArIFwiKFwiICsgdXRpbHMucHJldHR5KHNpZ25hdHVyZSkgKyBcIiwgZXhwZWN0ZWQgXCIgKyB1dGlscy5wcmV0dHkoZXhwZWN0ZWRTaWduYXR1cmUpICsgXCIpXCIpO1xuICAgICAgICB9XG4gICAgfSxcbiAgICAvKipcbiAgICAgKiBDaGVjayBpZiB0aGUgZ2l2ZW4gc2lnbmF0dXJlIGlzIGF0IHRoZSBnaXZlbiBpbmRleC5cbiAgICAgKiBAcGFyYW0ge251bWJlcn0gYXNrZWRJbmRleCB0aGUgaW5kZXggdG8gY2hlY2suXG4gICAgICogQHBhcmFtIHtzdHJpbmd9IGV4cGVjdGVkU2lnbmF0dXJlIHRoZSBzaWduYXR1cmUgdG8gZXhwZWN0LlxuICAgICAqIEByZXR1cm4ge2Jvb2xlYW59IHRydWUgaWYgdGhlIHNpZ25hdHVyZSBpcyBoZXJlLCBmYWxzZSBvdGhlcndpc2UuXG4gICAgICovXG4gICAgaXNTaWduYXR1cmU6IGZ1bmN0aW9uKGFza2VkSW5kZXgsIGV4cGVjdGVkU2lnbmF0dXJlKSB7XG4gICAgICAgIHZhciBjdXJyZW50SW5kZXggPSB0aGlzLnJlYWRlci5pbmRleDtcbiAgICAgICAgdGhpcy5yZWFkZXIuc2V0SW5kZXgoYXNrZWRJbmRleCk7XG4gICAgICAgIHZhciBzaWduYXR1cmUgPSB0aGlzLnJlYWRlci5yZWFkU3RyaW5nKDQpO1xuICAgICAgICB2YXIgcmVzdWx0ID0gc2lnbmF0dXJlID09PSBleHBlY3RlZFNpZ25hdHVyZTtcbiAgICAgICAgdGhpcy5yZWFkZXIuc2V0SW5kZXgoY3VycmVudEluZGV4KTtcbiAgICAgICAgcmV0dXJuIHJlc3VsdDtcbiAgICB9LFxuICAgIC8qKlxuICAgICAqIFJlYWQgdGhlIGVuZCBvZiB0aGUgY2VudHJhbCBkaXJlY3RvcnkuXG4gICAgICovXG4gICAgcmVhZEJsb2NrRW5kT2ZDZW50cmFsOiBmdW5jdGlvbigpIHtcbiAgICAgICAgdGhpcy5kaXNrTnVtYmVyID0gdGhpcy5yZWFkZXIucmVhZEludCgyKTtcbiAgICAgICAgdGhpcy5kaXNrV2l0aENlbnRyYWxEaXJTdGFydCA9IHRoaXMucmVhZGVyLnJlYWRJbnQoMik7XG4gICAgICAgIHRoaXMuY2VudHJhbERpclJlY29yZHNPblRoaXNEaXNrID0gdGhpcy5yZWFkZXIucmVhZEludCgyKTtcbiAgICAgICAgdGhpcy5jZW50cmFsRGlyUmVjb3JkcyA9IHRoaXMucmVhZGVyLnJlYWRJbnQoMik7XG4gICAgICAgIHRoaXMuY2VudHJhbERpclNpemUgPSB0aGlzLnJlYWRlci5yZWFkSW50KDQpO1xuICAgICAgICB0aGlzLmNlbnRyYWxEaXJPZmZzZXQgPSB0aGlzLnJlYWRlci5yZWFkSW50KDQpO1xuXG4gICAgICAgIHRoaXMuemlwQ29tbWVudExlbmd0aCA9IHRoaXMucmVhZGVyLnJlYWRJbnQoMik7XG4gICAgICAgIC8vIHdhcm5pbmcgOiB0aGUgZW5jb2RpbmcgZGVwZW5kcyBvZiB0aGUgc3lzdGVtIGxvY2FsZVxuICAgICAgICAvLyBPbiBhIGxpbnV4IG1hY2hpbmUgd2l0aCBMQU5HPWVuX1VTLnV0ZjgsIHRoaXMgZmllbGQgaXMgdXRmOCBlbmNvZGVkLlxuICAgICAgICAvLyBPbiBhIHdpbmRvd3MgbWFjaGluZSwgdGhpcyBmaWVsZCBpcyBlbmNvZGVkIHdpdGggdGhlIGxvY2FsaXplZCB3aW5kb3dzIGNvZGUgcGFnZS5cbiAgICAgICAgdmFyIHppcENvbW1lbnQgPSB0aGlzLnJlYWRlci5yZWFkRGF0YSh0aGlzLnppcENvbW1lbnRMZW5ndGgpO1xuICAgICAgICB2YXIgZGVjb2RlUGFyYW1UeXBlID0gc3VwcG9ydC51aW50OGFycmF5ID8gXCJ1aW50OGFycmF5XCIgOiBcImFycmF5XCI7XG4gICAgICAgIC8vIFRvIGdldCBjb25zaXN0ZW50IGJlaGF2aW9yIHdpdGggdGhlIGdlbmVyYXRpb24gcGFydCwgd2Ugd2lsbCBhc3N1bWUgdGhhdFxuICAgICAgICAvLyB0aGlzIGlzIHV0ZjggZW5jb2RlZCB1bmxlc3Mgc3BlY2lmaWVkIG90aGVyd2lzZS5cbiAgICAgICAgdmFyIGRlY29kZUNvbnRlbnQgPSB1dGlscy50cmFuc2Zvcm1UbyhkZWNvZGVQYXJhbVR5cGUsIHppcENvbW1lbnQpO1xuICAgICAgICB0aGlzLnppcENvbW1lbnQgPSB0aGlzLmxvYWRPcHRpb25zLmRlY29kZUZpbGVOYW1lKGRlY29kZUNvbnRlbnQpO1xuICAgIH0sXG4gICAgLyoqXG4gICAgICogUmVhZCB0aGUgZW5kIG9mIHRoZSBaaXAgNjQgY2VudHJhbCBkaXJlY3RvcnkuXG4gICAgICogTm90IG1lcmdlZCB3aXRoIHRoZSBtZXRob2QgcmVhZEVuZE9mQ2VudHJhbCA6XG4gICAgICogVGhlIGVuZCBvZiBjZW50cmFsIGNhbiBjb2V4aXN0IHdpdGggaXRzIFppcDY0IGJyb3RoZXIsXG4gICAgICogSSBkb24ndCB3YW50IHRvIHJlYWQgdGhlIHdyb25nIG51bWJlciBvZiBieXRlcyAhXG4gICAgICovXG4gICAgcmVhZEJsb2NrWmlwNjRFbmRPZkNlbnRyYWw6IGZ1bmN0aW9uKCkge1xuICAgICAgICB0aGlzLnppcDY0RW5kT2ZDZW50cmFsU2l6ZSA9IHRoaXMucmVhZGVyLnJlYWRJbnQoOCk7XG4gICAgICAgIHRoaXMucmVhZGVyLnNraXAoNCk7XG4gICAgICAgIC8vIHRoaXMudmVyc2lvbk1hZGVCeSA9IHRoaXMucmVhZGVyLnJlYWRTdHJpbmcoMik7XG4gICAgICAgIC8vIHRoaXMudmVyc2lvbk5lZWRlZCA9IHRoaXMucmVhZGVyLnJlYWRJbnQoMik7XG4gICAgICAgIHRoaXMuZGlza051bWJlciA9IHRoaXMucmVhZGVyLnJlYWRJbnQoNCk7XG4gICAgICAgIHRoaXMuZGlza1dpdGhDZW50cmFsRGlyU3RhcnQgPSB0aGlzLnJlYWRlci5yZWFkSW50KDQpO1xuICAgICAgICB0aGlzLmNlbnRyYWxEaXJSZWNvcmRzT25UaGlzRGlzayA9IHRoaXMucmVhZGVyLnJlYWRJbnQoOCk7XG4gICAgICAgIHRoaXMuY2VudHJhbERpclJlY29yZHMgPSB0aGlzLnJlYWRlci5yZWFkSW50KDgpO1xuICAgICAgICB0aGlzLmNlbnRyYWxEaXJTaXplID0gdGhpcy5yZWFkZXIucmVhZEludCg4KTtcbiAgICAgICAgdGhpcy5jZW50cmFsRGlyT2Zmc2V0ID0gdGhpcy5yZWFkZXIucmVhZEludCg4KTtcblxuICAgICAgICB0aGlzLnppcDY0RXh0ZW5zaWJsZURhdGEgPSB7fTtcbiAgICAgICAgdmFyIGV4dHJhRGF0YVNpemUgPSB0aGlzLnppcDY0RW5kT2ZDZW50cmFsU2l6ZSAtIDQ0LFxuICAgICAgICAgICAgaW5kZXggPSAwLFxuICAgICAgICAgICAgZXh0cmFGaWVsZElkLFxuICAgICAgICAgICAgZXh0cmFGaWVsZExlbmd0aCxcbiAgICAgICAgICAgIGV4dHJhRmllbGRWYWx1ZTtcbiAgICAgICAgd2hpbGUgKGluZGV4IDwgZXh0cmFEYXRhU2l6ZSkge1xuICAgICAgICAgICAgZXh0cmFGaWVsZElkID0gdGhpcy5yZWFkZXIucmVhZEludCgyKTtcbiAgICAgICAgICAgIGV4dHJhRmllbGRMZW5ndGggPSB0aGlzLnJlYWRlci5yZWFkSW50KDQpO1xuICAgICAgICAgICAgZXh0cmFGaWVsZFZhbHVlID0gdGhpcy5yZWFkZXIucmVhZERhdGEoZXh0cmFGaWVsZExlbmd0aCk7XG4gICAgICAgICAgICB0aGlzLnppcDY0RXh0ZW5zaWJsZURhdGFbZXh0cmFGaWVsZElkXSA9IHtcbiAgICAgICAgICAgICAgICBpZDogZXh0cmFGaWVsZElkLFxuICAgICAgICAgICAgICAgIGxlbmd0aDogZXh0cmFGaWVsZExlbmd0aCxcbiAgICAgICAgICAgICAgICB2YWx1ZTogZXh0cmFGaWVsZFZhbHVlXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG4gICAgfSxcbiAgICAvKipcbiAgICAgKiBSZWFkIHRoZSBlbmQgb2YgdGhlIFppcCA2NCBjZW50cmFsIGRpcmVjdG9yeSBsb2NhdG9yLlxuICAgICAqL1xuICAgIHJlYWRCbG9ja1ppcDY0RW5kT2ZDZW50cmFsTG9jYXRvcjogZnVuY3Rpb24oKSB7XG4gICAgICAgIHRoaXMuZGlza1dpdGhaaXA2NENlbnRyYWxEaXJTdGFydCA9IHRoaXMucmVhZGVyLnJlYWRJbnQoNCk7XG4gICAgICAgIHRoaXMucmVsYXRpdmVPZmZzZXRFbmRPZlppcDY0Q2VudHJhbERpciA9IHRoaXMucmVhZGVyLnJlYWRJbnQoOCk7XG4gICAgICAgIHRoaXMuZGlza3NDb3VudCA9IHRoaXMucmVhZGVyLnJlYWRJbnQoNCk7XG4gICAgICAgIGlmICh0aGlzLmRpc2tzQ291bnQgPiAxKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJNdWx0aS12b2x1bWVzIHppcCBhcmUgbm90IHN1cHBvcnRlZFwiKTtcbiAgICAgICAgfVxuICAgIH0sXG4gICAgLyoqXG4gICAgICogUmVhZCB0aGUgbG9jYWwgZmlsZXMsIGJhc2VkIG9uIHRoZSBvZmZzZXQgcmVhZCBpbiB0aGUgY2VudHJhbCBwYXJ0LlxuICAgICAqL1xuICAgIHJlYWRMb2NhbEZpbGVzOiBmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIGksIGZpbGU7XG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCB0aGlzLmZpbGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBmaWxlID0gdGhpcy5maWxlc1tpXTtcbiAgICAgICAgICAgIHRoaXMucmVhZGVyLnNldEluZGV4KGZpbGUubG9jYWxIZWFkZXJPZmZzZXQpO1xuICAgICAgICAgICAgdGhpcy5jaGVja1NpZ25hdHVyZShzaWcuTE9DQUxfRklMRV9IRUFERVIpO1xuICAgICAgICAgICAgZmlsZS5yZWFkTG9jYWxQYXJ0KHRoaXMucmVhZGVyKTtcbiAgICAgICAgICAgIGZpbGUuaGFuZGxlVVRGOCgpO1xuICAgICAgICAgICAgZmlsZS5wcm9jZXNzQXR0cmlidXRlcygpO1xuICAgICAgICB9XG4gICAgfSxcbiAgICAvKipcbiAgICAgKiBSZWFkIHRoZSBjZW50cmFsIGRpcmVjdG9yeS5cbiAgICAgKi9cbiAgICByZWFkQ2VudHJhbERpcjogZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciBmaWxlO1xuXG4gICAgICAgIHRoaXMucmVhZGVyLnNldEluZGV4KHRoaXMuY2VudHJhbERpck9mZnNldCk7XG4gICAgICAgIHdoaWxlICh0aGlzLnJlYWRlci5yZWFkQW5kQ2hlY2tTaWduYXR1cmUoc2lnLkNFTlRSQUxfRklMRV9IRUFERVIpKSB7XG4gICAgICAgICAgICBmaWxlID0gbmV3IFppcEVudHJ5KHtcbiAgICAgICAgICAgICAgICB6aXA2NDogdGhpcy56aXA2NFxuICAgICAgICAgICAgfSwgdGhpcy5sb2FkT3B0aW9ucyk7XG4gICAgICAgICAgICBmaWxlLnJlYWRDZW50cmFsUGFydCh0aGlzLnJlYWRlcik7XG4gICAgICAgICAgICB0aGlzLmZpbGVzLnB1c2goZmlsZSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5jZW50cmFsRGlyUmVjb3JkcyAhPT0gdGhpcy5maWxlcy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLmNlbnRyYWxEaXJSZWNvcmRzICE9PSAwICYmIHRoaXMuZmlsZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgLy8gV2UgZXhwZWN0ZWQgc29tZSByZWNvcmRzIGJ1dCBjb3VsZG4ndCBmaW5kIEFOWS5cbiAgICAgICAgICAgICAgICAvLyBUaGlzIGlzIHJlYWxseSBzdXNwaWNpb3VzLCBhcyBpZiBzb21ldGhpbmcgd2VudCB3cm9uZy5cbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDb3JydXB0ZWQgemlwIG9yIGJ1ZzogZXhwZWN0ZWQgXCIgKyB0aGlzLmNlbnRyYWxEaXJSZWNvcmRzICsgXCIgcmVjb3JkcyBpbiBjZW50cmFsIGRpciwgZ290IFwiICsgdGhpcy5maWxlcy5sZW5ndGgpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBXZSBmb3VuZCBzb21lIHJlY29yZHMgYnV0IG5vdCBhbGwuXG4gICAgICAgICAgICAgICAgLy8gU29tZXRoaW5nIGlzIHdyb25nIGJ1dCB3ZSBnb3Qgc29tZXRoaW5nIGZvciB0aGUgdXNlcjogbm8gZXJyb3IgaGVyZS5cbiAgICAgICAgICAgICAgICAvLyBjb25zb2xlLndhcm4oXCJleHBlY3RlZFwiLCB0aGlzLmNlbnRyYWxEaXJSZWNvcmRzLCBcInJlY29yZHMgaW4gY2VudHJhbCBkaXIsIGdvdFwiLCB0aGlzLmZpbGVzLmxlbmd0aCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9LFxuICAgIC8qKlxuICAgICAqIFJlYWQgdGhlIGVuZCBvZiBjZW50cmFsIGRpcmVjdG9yeS5cbiAgICAgKi9cbiAgICByZWFkRW5kT2ZDZW50cmFsOiBmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIG9mZnNldCA9IHRoaXMucmVhZGVyLmxhc3RJbmRleE9mU2lnbmF0dXJlKHNpZy5DRU5UUkFMX0RJUkVDVE9SWV9FTkQpO1xuICAgICAgICBpZiAob2Zmc2V0IDwgMCkge1xuICAgICAgICAgICAgLy8gQ2hlY2sgaWYgdGhlIGNvbnRlbnQgaXMgYSB0cnVuY2F0ZWQgemlwIG9yIGNvbXBsZXRlIGdhcmJhZ2UuXG4gICAgICAgICAgICAvLyBBIFwiTE9DQUxfRklMRV9IRUFERVJcIiBpcyBub3QgcmVxdWlyZWQgYXQgdGhlIGJlZ2lubmluZyAoYXV0b1xuICAgICAgICAgICAgLy8gZXh0cmFjdGlibGUgemlwIGZvciBleGFtcGxlKSBidXQgaXQgY2FuIGdpdmUgYSBnb29kIGhpbnQuXG4gICAgICAgICAgICAvLyBJZiBhbiBhamF4IHJlcXVlc3Qgd2FzIHVzZWQgd2l0aG91dCByZXNwb25zZVR5cGUsIHdlIHdpbGwgYWxzb1xuICAgICAgICAgICAgLy8gZ2V0IHVucmVhZGFibGUgZGF0YS5cbiAgICAgICAgICAgIHZhciBpc0dhcmJhZ2UgPSAhdGhpcy5pc1NpZ25hdHVyZSgwLCBzaWcuTE9DQUxfRklMRV9IRUFERVIpO1xuXG4gICAgICAgICAgICBpZiAoaXNHYXJiYWdlKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQ2FuJ3QgZmluZCBlbmQgb2YgY2VudHJhbCBkaXJlY3RvcnkgOiBpcyB0aGlzIGEgemlwIGZpbGUgPyBcIiArXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiSWYgaXQgaXMsIHNlZSBodHRwOi8vc3R1ay5naXRodWIuaW8vanN6aXAvZG9jdW1lbnRhdGlvbi9ob3d0by9yZWFkX3ppcC5odG1sXCIpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDb3JydXB0ZWQgemlwIDogY2FuJ3QgZmluZCBlbmQgb2YgY2VudHJhbCBkaXJlY3RvcnlcIik7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgfVxuICAgICAgICB0aGlzLnJlYWRlci5zZXRJbmRleChvZmZzZXQpO1xuICAgICAgICB2YXIgZW5kT2ZDZW50cmFsRGlyT2Zmc2V0ID0gb2Zmc2V0O1xuICAgICAgICB0aGlzLmNoZWNrU2lnbmF0dXJlKHNpZy5DRU5UUkFMX0RJUkVDVE9SWV9FTkQpO1xuICAgICAgICB0aGlzLnJlYWRCbG9ja0VuZE9mQ2VudHJhbCgpO1xuXG5cbiAgICAgICAgLyogZXh0cmFjdCBmcm9tIHRoZSB6aXAgc3BlYyA6XG4gICAgICAgICAgICA0KSAgSWYgb25lIG9mIHRoZSBmaWVsZHMgaW4gdGhlIGVuZCBvZiBjZW50cmFsIGRpcmVjdG9yeVxuICAgICAgICAgICAgICAgIHJlY29yZCBpcyB0b28gc21hbGwgdG8gaG9sZCByZXF1aXJlZCBkYXRhLCB0aGUgZmllbGRcbiAgICAgICAgICAgICAgICBzaG91bGQgYmUgc2V0IHRvIC0xICgweEZGRkYgb3IgMHhGRkZGRkZGRikgYW5kIHRoZVxuICAgICAgICAgICAgICAgIFpJUDY0IGZvcm1hdCByZWNvcmQgc2hvdWxkIGJlIGNyZWF0ZWQuXG4gICAgICAgICAgICA1KSAgVGhlIGVuZCBvZiBjZW50cmFsIGRpcmVjdG9yeSByZWNvcmQgYW5kIHRoZVxuICAgICAgICAgICAgICAgIFppcDY0IGVuZCBvZiBjZW50cmFsIGRpcmVjdG9yeSBsb2NhdG9yIHJlY29yZCBtdXN0XG4gICAgICAgICAgICAgICAgcmVzaWRlIG9uIHRoZSBzYW1lIGRpc2sgd2hlbiBzcGxpdHRpbmcgb3Igc3Bhbm5pbmdcbiAgICAgICAgICAgICAgICBhbiBhcmNoaXZlLlxuICAgICAgICAgKi9cbiAgICAgICAgaWYgKHRoaXMuZGlza051bWJlciA9PT0gdXRpbHMuTUFYX1ZBTFVFXzE2QklUUyB8fCB0aGlzLmRpc2tXaXRoQ2VudHJhbERpclN0YXJ0ID09PSB1dGlscy5NQVhfVkFMVUVfMTZCSVRTIHx8IHRoaXMuY2VudHJhbERpclJlY29yZHNPblRoaXNEaXNrID09PSB1dGlscy5NQVhfVkFMVUVfMTZCSVRTIHx8IHRoaXMuY2VudHJhbERpclJlY29yZHMgPT09IHV0aWxzLk1BWF9WQUxVRV8xNkJJVFMgfHwgdGhpcy5jZW50cmFsRGlyU2l6ZSA9PT0gdXRpbHMuTUFYX1ZBTFVFXzMyQklUUyB8fCB0aGlzLmNlbnRyYWxEaXJPZmZzZXQgPT09IHV0aWxzLk1BWF9WQUxVRV8zMkJJVFMpIHtcbiAgICAgICAgICAgIHRoaXMuemlwNjQgPSB0cnVlO1xuXG4gICAgICAgICAgICAvKlxuICAgICAgICAgICAgV2FybmluZyA6IHRoZSB6aXA2NCBleHRlbnNpb24gaXMgc3VwcG9ydGVkLCBidXQgT05MWSBpZiB0aGUgNjRiaXRzIGludGVnZXIgcmVhZCBmcm9tXG4gICAgICAgICAgICB0aGUgemlwIGZpbGUgY2FuIGZpdCBpbnRvIGEgMzJiaXRzIGludGVnZXIuIFRoaXMgY2Fubm90IGJlIHNvbHZlZCA6IEphdmFzY3JpcHQgcmVwcmVzZW50c1xuICAgICAgICAgICAgYWxsIG51bWJlcnMgYXMgNjQtYml0IGRvdWJsZSBwcmVjaXNpb24gSUVFRSA3NTQgZmxvYXRpbmcgcG9pbnQgbnVtYmVycy5cbiAgICAgICAgICAgIFNvLCB3ZSBoYXZlIDUzYml0cyBmb3IgaW50ZWdlcnMgYW5kIGJpdHdpc2Ugb3BlcmF0aW9ucyB0cmVhdCBldmVyeXRoaW5nIGFzIDMyYml0cy5cbiAgICAgICAgICAgIHNlZSBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL0phdmFTY3JpcHQvUmVmZXJlbmNlL09wZXJhdG9ycy9CaXR3aXNlX09wZXJhdG9yc1xuICAgICAgICAgICAgYW5kIGh0dHA6Ly93d3cuZWNtYS1pbnRlcm5hdGlvbmFsLm9yZy9wdWJsaWNhdGlvbnMvZmlsZXMvRUNNQS1TVC9FQ01BLTI2Mi5wZGYgc2VjdGlvbiA4LjVcbiAgICAgICAgICAgICovXG5cbiAgICAgICAgICAgIC8vIHNob3VsZCBsb29rIGZvciBhIHppcDY0IEVPQ0QgbG9jYXRvclxuICAgICAgICAgICAgb2Zmc2V0ID0gdGhpcy5yZWFkZXIubGFzdEluZGV4T2ZTaWduYXR1cmUoc2lnLlpJUDY0X0NFTlRSQUxfRElSRUNUT1JZX0xPQ0FUT1IpO1xuICAgICAgICAgICAgaWYgKG9mZnNldCA8IDApIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDb3JydXB0ZWQgemlwIDogY2FuJ3QgZmluZCB0aGUgWklQNjQgZW5kIG9mIGNlbnRyYWwgZGlyZWN0b3J5IGxvY2F0b3JcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLnJlYWRlci5zZXRJbmRleChvZmZzZXQpO1xuICAgICAgICAgICAgdGhpcy5jaGVja1NpZ25hdHVyZShzaWcuWklQNjRfQ0VOVFJBTF9ESVJFQ1RPUllfTE9DQVRPUik7XG4gICAgICAgICAgICB0aGlzLnJlYWRCbG9ja1ppcDY0RW5kT2ZDZW50cmFsTG9jYXRvcigpO1xuXG4gICAgICAgICAgICAvLyBub3cgdGhlIHppcDY0IEVPQ0QgcmVjb3JkXG4gICAgICAgICAgICBpZiAoIXRoaXMuaXNTaWduYXR1cmUodGhpcy5yZWxhdGl2ZU9mZnNldEVuZE9mWmlwNjRDZW50cmFsRGlyLCBzaWcuWklQNjRfQ0VOVFJBTF9ESVJFQ1RPUllfRU5EKSkge1xuICAgICAgICAgICAgICAgIC8vIGNvbnNvbGUud2FybihcIlpJUDY0IGVuZCBvZiBjZW50cmFsIGRpcmVjdG9yeSBub3Qgd2hlcmUgZXhwZWN0ZWQuXCIpO1xuICAgICAgICAgICAgICAgIHRoaXMucmVsYXRpdmVPZmZzZXRFbmRPZlppcDY0Q2VudHJhbERpciA9IHRoaXMucmVhZGVyLmxhc3RJbmRleE9mU2lnbmF0dXJlKHNpZy5aSVA2NF9DRU5UUkFMX0RJUkVDVE9SWV9FTkQpO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLnJlbGF0aXZlT2Zmc2V0RW5kT2ZaaXA2NENlbnRyYWxEaXIgPCAwKSB7XG4gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcIkNvcnJ1cHRlZCB6aXAgOiBjYW4ndCBmaW5kIHRoZSBaSVA2NCBlbmQgb2YgY2VudHJhbCBkaXJlY3RvcnlcIik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5yZWFkZXIuc2V0SW5kZXgodGhpcy5yZWxhdGl2ZU9mZnNldEVuZE9mWmlwNjRDZW50cmFsRGlyKTtcbiAgICAgICAgICAgIHRoaXMuY2hlY2tTaWduYXR1cmUoc2lnLlpJUDY0X0NFTlRSQUxfRElSRUNUT1JZX0VORCk7XG4gICAgICAgICAgICB0aGlzLnJlYWRCbG9ja1ppcDY0RW5kT2ZDZW50cmFsKCk7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgZXhwZWN0ZWRFbmRPZkNlbnRyYWxEaXJPZmZzZXQgPSB0aGlzLmNlbnRyYWxEaXJPZmZzZXQgKyB0aGlzLmNlbnRyYWxEaXJTaXplO1xuICAgICAgICBpZiAodGhpcy56aXA2NCkge1xuICAgICAgICAgICAgZXhwZWN0ZWRFbmRPZkNlbnRyYWxEaXJPZmZzZXQgKz0gMjA7IC8vIGVuZCBvZiBjZW50cmFsIGRpciA2NCBsb2NhdG9yXG4gICAgICAgICAgICBleHBlY3RlZEVuZE9mQ2VudHJhbERpck9mZnNldCArPSAxMiAvKiBzaG91bGQgbm90IGluY2x1ZGUgdGhlIGxlYWRpbmcgMTIgYnl0ZXMgKi8gKyB0aGlzLnppcDY0RW5kT2ZDZW50cmFsU2l6ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBleHRyYUJ5dGVzID0gZW5kT2ZDZW50cmFsRGlyT2Zmc2V0IC0gZXhwZWN0ZWRFbmRPZkNlbnRyYWxEaXJPZmZzZXQ7XG5cbiAgICAgICAgaWYgKGV4dHJhQnl0ZXMgPiAwKSB7XG4gICAgICAgICAgICAvLyBjb25zb2xlLndhcm4oZXh0cmFCeXRlcywgXCJleHRyYSBieXRlcyBhdCBiZWdpbm5pbmcgb3Igd2l0aGluIHppcGZpbGVcIik7XG4gICAgICAgICAgICBpZiAodGhpcy5pc1NpZ25hdHVyZShlbmRPZkNlbnRyYWxEaXJPZmZzZXQsIHNpZy5DRU5UUkFMX0ZJTEVfSEVBREVSKSkge1xuICAgICAgICAgICAgICAgIC8vIFRoZSBvZmZzZXRzIHNlZW0gd3JvbmcsIGJ1dCB3ZSBoYXZlIHNvbWV0aGluZyBhdCB0aGUgc3BlY2lmaWVkIG9mZnNldC5cbiAgICAgICAgICAgICAgICAvLyBTb+KApiB3ZSBrZWVwIGl0LlxuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyB0aGUgb2Zmc2V0IGlzIHdyb25nLCB1cGRhdGUgdGhlIFwiemVyb1wiIG9mIHRoZSByZWFkZXJcbiAgICAgICAgICAgICAgICAvLyB0aGlzIGhhcHBlbnMgaWYgZGF0YSBoYXMgYmVlbiBwcmVwZW5kZWQgKGNyeCBmaWxlcyBmb3IgZXhhbXBsZSlcbiAgICAgICAgICAgICAgICB0aGlzLnJlYWRlci56ZXJvID0gZXh0cmFCeXRlcztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmIChleHRyYUJ5dGVzIDwgMCkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQ29ycnVwdGVkIHppcDogbWlzc2luZyBcIiArIE1hdGguYWJzKGV4dHJhQnl0ZXMpICsgXCIgYnl0ZXMuXCIpO1xuICAgICAgICB9XG4gICAgfSxcbiAgICBwcmVwYXJlUmVhZGVyOiBmdW5jdGlvbihkYXRhKSB7XG4gICAgICAgIHRoaXMucmVhZGVyID0gcmVhZGVyRm9yKGRhdGEpO1xuICAgIH0sXG4gICAgLyoqXG4gICAgICogUmVhZCBhIHppcCBmaWxlIGFuZCBjcmVhdGUgWmlwRW50cmllcy5cbiAgICAgKiBAcGFyYW0ge1N0cmluZ3xBcnJheUJ1ZmZlcnxVaW50OEFycmF5fEJ1ZmZlcn0gZGF0YSB0aGUgYmluYXJ5IHN0cmluZyByZXByZXNlbnRpbmcgYSB6aXAgZmlsZS5cbiAgICAgKi9cbiAgICBsb2FkOiBmdW5jdGlvbihkYXRhKSB7XG4gICAgICAgIHRoaXMucHJlcGFyZVJlYWRlcihkYXRhKTtcbiAgICAgICAgdGhpcy5yZWFkRW5kT2ZDZW50cmFsKCk7XG4gICAgICAgIHRoaXMucmVhZENlbnRyYWxEaXIoKTtcbiAgICAgICAgdGhpcy5yZWFkTG9jYWxGaWxlcygpO1xuICAgIH1cbn07XG4vLyB9fX0gZW5kIG9mIFppcEVudHJpZXNcbm1vZHVsZS5leHBvcnRzID0gWmlwRW50cmllcztcbiIsIid1c2Ugc3RyaWN0JztcbnZhciByZWFkZXJGb3IgPSByZXF1aXJlKCcuL3JlYWRlci9yZWFkZXJGb3InKTtcbnZhciB1dGlscyA9IHJlcXVpcmUoJy4vdXRpbHMnKTtcbnZhciBDb21wcmVzc2VkT2JqZWN0ID0gcmVxdWlyZSgnLi9jb21wcmVzc2VkT2JqZWN0Jyk7XG52YXIgY3JjMzJmbiA9IHJlcXVpcmUoJy4vY3JjMzInKTtcbnZhciB1dGY4ID0gcmVxdWlyZSgnLi91dGY4Jyk7XG52YXIgY29tcHJlc3Npb25zID0gcmVxdWlyZSgnLi9jb21wcmVzc2lvbnMnKTtcbnZhciBzdXBwb3J0ID0gcmVxdWlyZSgnLi9zdXBwb3J0Jyk7XG5cbnZhciBNQURFX0JZX0RPUyA9IDB4MDA7XG52YXIgTUFERV9CWV9VTklYID0gMHgwMztcblxuLyoqXG4gKiBGaW5kIGEgY29tcHJlc3Npb24gcmVnaXN0ZXJlZCBpbiBKU1ppcC5cbiAqIEBwYXJhbSB7c3RyaW5nfSBjb21wcmVzc2lvbk1ldGhvZCB0aGUgbWV0aG9kIG1hZ2ljIHRvIGZpbmQuXG4gKiBAcmV0dXJuIHtPYmplY3R8bnVsbH0gdGhlIEpTWmlwIGNvbXByZXNzaW9uIG9iamVjdCwgbnVsbCBpZiBub25lIGZvdW5kLlxuICovXG52YXIgZmluZENvbXByZXNzaW9uID0gZnVuY3Rpb24oY29tcHJlc3Npb25NZXRob2QpIHtcbiAgICBmb3IgKHZhciBtZXRob2QgaW4gY29tcHJlc3Npb25zKSB7XG4gICAgICAgIGlmICghY29tcHJlc3Npb25zLmhhc093blByb3BlcnR5KG1ldGhvZCkpIHtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG4gICAgICAgIGlmIChjb21wcmVzc2lvbnNbbWV0aG9kXS5tYWdpYyA9PT0gY29tcHJlc3Npb25NZXRob2QpIHtcbiAgICAgICAgICAgIHJldHVybiBjb21wcmVzc2lvbnNbbWV0aG9kXTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gbnVsbDtcbn07XG5cbi8vIGNsYXNzIFppcEVudHJ5IHt7e1xuLyoqXG4gKiBBbiBlbnRyeSBpbiB0aGUgemlwIGZpbGUuXG4gKiBAY29uc3RydWN0b3JcbiAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIE9wdGlvbnMgb2YgdGhlIGN1cnJlbnQgZmlsZS5cbiAqIEBwYXJhbSB7T2JqZWN0fSBsb2FkT3B0aW9ucyBPcHRpb25zIGZvciBsb2FkaW5nIHRoZSBzdHJlYW0uXG4gKi9cbmZ1bmN0aW9uIFppcEVudHJ5KG9wdGlvbnMsIGxvYWRPcHRpb25zKSB7XG4gICAgdGhpcy5vcHRpb25zID0gb3B0aW9ucztcbiAgICB0aGlzLmxvYWRPcHRpb25zID0gbG9hZE9wdGlvbnM7XG59XG5aaXBFbnRyeS5wcm90b3R5cGUgPSB7XG4gICAgLyoqXG4gICAgICogc2F5IGlmIHRoZSBmaWxlIGlzIGVuY3J5cHRlZC5cbiAgICAgKiBAcmV0dXJuIHtib29sZWFufSB0cnVlIGlmIHRoZSBmaWxlIGlzIGVuY3J5cHRlZCwgZmFsc2Ugb3RoZXJ3aXNlLlxuICAgICAqL1xuICAgIGlzRW5jcnlwdGVkOiBmdW5jdGlvbigpIHtcbiAgICAgICAgLy8gYml0IDEgaXMgc2V0XG4gICAgICAgIHJldHVybiAodGhpcy5iaXRGbGFnICYgMHgwMDAxKSA9PT0gMHgwMDAxO1xuICAgIH0sXG4gICAgLyoqXG4gICAgICogc2F5IGlmIHRoZSBmaWxlIGhhcyB1dGYtOCBmaWxlbmFtZS9jb21tZW50LlxuICAgICAqIEByZXR1cm4ge2Jvb2xlYW59IHRydWUgaWYgdGhlIGZpbGVuYW1lL2NvbW1lbnQgaXMgaW4gdXRmLTgsIGZhbHNlIG90aGVyd2lzZS5cbiAgICAgKi9cbiAgICB1c2VVVEY4OiBmdW5jdGlvbigpIHtcbiAgICAgICAgLy8gYml0IDExIGlzIHNldFxuICAgICAgICByZXR1cm4gKHRoaXMuYml0RmxhZyAmIDB4MDgwMCkgPT09IDB4MDgwMDtcbiAgICB9LFxuICAgIC8qKlxuICAgICAqIFJlYWQgdGhlIGxvY2FsIHBhcnQgb2YgYSB6aXAgZmlsZSBhbmQgYWRkIHRoZSBpbmZvIGluIHRoaXMgb2JqZWN0LlxuICAgICAqIEBwYXJhbSB7RGF0YVJlYWRlcn0gcmVhZGVyIHRoZSByZWFkZXIgdG8gdXNlLlxuICAgICAqL1xuICAgIHJlYWRMb2NhbFBhcnQ6IGZ1bmN0aW9uKHJlYWRlcikge1xuICAgICAgICB2YXIgY29tcHJlc3Npb24sIGxvY2FsRXh0cmFGaWVsZHNMZW5ndGg7XG5cbiAgICAgICAgLy8gd2UgYWxyZWFkeSBrbm93IGV2ZXJ5dGhpbmcgZnJvbSB0aGUgY2VudHJhbCBkaXIgIVxuICAgICAgICAvLyBJZiB0aGUgY2VudHJhbCBkaXIgZGF0YSBhcmUgZmFsc2UsIHdlIGFyZSBkb29tZWQuXG4gICAgICAgIC8vIE9uIHRoZSBicmlnaHQgc2lkZSwgdGhlIGxvY2FsIHBhcnQgaXMgc2NhcnkgIDogemlwNjQsIGRhdGEgZGVzY3JpcHRvcnMsIGJvdGgsIGV0Yy5cbiAgICAgICAgLy8gVGhlIGxlc3MgZGF0YSB3ZSBnZXQgaGVyZSwgdGhlIG1vcmUgcmVsaWFibGUgdGhpcyBzaG91bGQgYmUuXG4gICAgICAgIC8vIExldCdzIHNraXAgdGhlIHdob2xlIGhlYWRlciBhbmQgZGFzaCB0byB0aGUgZGF0YSAhXG4gICAgICAgIHJlYWRlci5za2lwKDIyKTtcbiAgICAgICAgLy8gaW4gc29tZSB6aXAgY3JlYXRlZCBvbiB3aW5kb3dzLCB0aGUgZmlsZW5hbWUgc3RvcmVkIGluIHRoZSBjZW50cmFsIGRpciBjb250YWlucyBcXCBpbnN0ZWFkIG9mIC8uXG4gICAgICAgIC8vIFN0cmFuZ2VseSwgdGhlIGZpbGVuYW1lIGhlcmUgaXMgT0suXG4gICAgICAgIC8vIEkgd291bGQgbG92ZSB0byB0cmVhdCB0aGVzZSB6aXAgZmlsZXMgYXMgY29ycnVwdGVkIChzZWUgaHR0cDovL3d3dy5pbmZvLXppcC5vcmcvRkFRLmh0bWwjYmFja3NsYXNoZXNcbiAgICAgICAgLy8gb3IgQVBQTk9URSM0LjQuMTcuMSwgXCJBbGwgc2xhc2hlcyBNVVNUIGJlIGZvcndhcmQgc2xhc2hlcyAnLydcIikgYnV0IHRoZXJlIGFyZSBhIGxvdCBvZiBiYWQgemlwIGdlbmVyYXRvcnMuLi5cbiAgICAgICAgLy8gU2VhcmNoIFwidW56aXAgbWlzbWF0Y2hpbmcgXCJsb2NhbFwiIGZpbGVuYW1lIGNvbnRpbnVpbmcgd2l0aCBcImNlbnRyYWxcIiBmaWxlbmFtZSB2ZXJzaW9uXCIgb25cbiAgICAgICAgLy8gdGhlIGludGVybmV0LlxuICAgICAgICAvL1xuICAgICAgICAvLyBJIHRoaW5rIEkgc2VlIHRoZSBsb2dpYyBoZXJlIDogdGhlIGNlbnRyYWwgZGlyZWN0b3J5IGlzIHVzZWQgdG8gZGlzcGxheVxuICAgICAgICAvLyBjb250ZW50IGFuZCB0aGUgbG9jYWwgZGlyZWN0b3J5IGlzIHVzZWQgdG8gZXh0cmFjdCB0aGUgZmlsZXMuIE1peGluZyAvIGFuZCBcXFxuICAgICAgICAvLyBtYXkgYmUgdXNlZCB0byBkaXNwbGF5IFxcIHRvIHdpbmRvd3MgdXNlcnMgYW5kIHVzZSAvIHdoZW4gZXh0cmFjdGluZyB0aGUgZmlsZXMuXG4gICAgICAgIC8vIFVuZm9ydHVuYXRlbHksIHRoaXMgbGVhZCBhbHNvIHRvIHNvbWUgaXNzdWVzIDogaHR0cDovL3NlY2xpc3RzLm9yZy9mdWxsZGlzY2xvc3VyZS8yMDA5L1NlcC8zOTRcbiAgICAgICAgdGhpcy5maWxlTmFtZUxlbmd0aCA9IHJlYWRlci5yZWFkSW50KDIpO1xuICAgICAgICBsb2NhbEV4dHJhRmllbGRzTGVuZ3RoID0gcmVhZGVyLnJlYWRJbnQoMik7IC8vIGNhbid0IGJlIHN1cmUgdGhpcyB3aWxsIGJlIHRoZSBzYW1lIGFzIHRoZSBjZW50cmFsIGRpclxuICAgICAgICAvLyB0aGUgZmlsZU5hbWUgaXMgc3RvcmVkIGFzIGJpbmFyeSBkYXRhLCB0aGUgaGFuZGxlVVRGOCBtZXRob2Qgd2lsbCB0YWtlIGNhcmUgb2YgdGhlIGVuY29kaW5nLlxuICAgICAgICB0aGlzLmZpbGVOYW1lID0gcmVhZGVyLnJlYWREYXRhKHRoaXMuZmlsZU5hbWVMZW5ndGgpO1xuICAgICAgICByZWFkZXIuc2tpcChsb2NhbEV4dHJhRmllbGRzTGVuZ3RoKTtcblxuICAgICAgICBpZiAodGhpcy5jb21wcmVzc2VkU2l6ZSA9PT0gLTEgfHwgdGhpcy51bmNvbXByZXNzZWRTaXplID09PSAtMSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQnVnIG9yIGNvcnJ1cHRlZCB6aXAgOiBkaWRuJ3QgZ2V0IGVub3VnaCBpbmZvcm1hdGlvbnMgZnJvbSB0aGUgY2VudHJhbCBkaXJlY3RvcnkgXCIgKyBcIihjb21wcmVzc2VkU2l6ZSA9PT0gLTEgfHwgdW5jb21wcmVzc2VkU2l6ZSA9PT0gLTEpXCIpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29tcHJlc3Npb24gPSBmaW5kQ29tcHJlc3Npb24odGhpcy5jb21wcmVzc2lvbk1ldGhvZCk7XG4gICAgICAgIGlmIChjb21wcmVzc2lvbiA9PT0gbnVsbCkgeyAvLyBubyBjb21wcmVzc2lvbiBmb3VuZFxuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiQ29ycnVwdGVkIHppcCA6IGNvbXByZXNzaW9uIFwiICsgdXRpbHMucHJldHR5KHRoaXMuY29tcHJlc3Npb25NZXRob2QpICsgXCIgdW5rbm93biAoaW5uZXIgZmlsZSA6IFwiICsgdXRpbHMudHJhbnNmb3JtVG8oXCJzdHJpbmdcIiwgdGhpcy5maWxlTmFtZSkgKyBcIilcIik7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5kZWNvbXByZXNzZWQgPSBuZXcgQ29tcHJlc3NlZE9iamVjdCh0aGlzLmNvbXByZXNzZWRTaXplLCB0aGlzLnVuY29tcHJlc3NlZFNpemUsIHRoaXMuY3JjMzIsIGNvbXByZXNzaW9uLCByZWFkZXIucmVhZERhdGEodGhpcy5jb21wcmVzc2VkU2l6ZSkpO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBSZWFkIHRoZSBjZW50cmFsIHBhcnQgb2YgYSB6aXAgZmlsZSBhbmQgYWRkIHRoZSBpbmZvIGluIHRoaXMgb2JqZWN0LlxuICAgICAqIEBwYXJhbSB7RGF0YVJlYWRlcn0gcmVhZGVyIHRoZSByZWFkZXIgdG8gdXNlLlxuICAgICAqL1xuICAgIHJlYWRDZW50cmFsUGFydDogZnVuY3Rpb24ocmVhZGVyKSB7XG4gICAgICAgIHRoaXMudmVyc2lvbk1hZGVCeSA9IHJlYWRlci5yZWFkSW50KDIpO1xuICAgICAgICByZWFkZXIuc2tpcCgyKTtcbiAgICAgICAgLy8gdGhpcy52ZXJzaW9uTmVlZGVkID0gcmVhZGVyLnJlYWRJbnQoMik7XG4gICAgICAgIHRoaXMuYml0RmxhZyA9IHJlYWRlci5yZWFkSW50KDIpO1xuICAgICAgICB0aGlzLmNvbXByZXNzaW9uTWV0aG9kID0gcmVhZGVyLnJlYWRTdHJpbmcoMik7XG4gICAgICAgIHRoaXMuZGF0ZSA9IHJlYWRlci5yZWFkRGF0ZSgpO1xuICAgICAgICB0aGlzLmNyYzMyID0gcmVhZGVyLnJlYWRJbnQoNCk7XG4gICAgICAgIHRoaXMuY29tcHJlc3NlZFNpemUgPSByZWFkZXIucmVhZEludCg0KTtcbiAgICAgICAgdGhpcy51bmNvbXByZXNzZWRTaXplID0gcmVhZGVyLnJlYWRJbnQoNCk7XG4gICAgICAgIHZhciBmaWxlTmFtZUxlbmd0aCA9IHJlYWRlci5yZWFkSW50KDIpO1xuICAgICAgICB0aGlzLmV4dHJhRmllbGRzTGVuZ3RoID0gcmVhZGVyLnJlYWRJbnQoMik7XG4gICAgICAgIHRoaXMuZmlsZUNvbW1lbnRMZW5ndGggPSByZWFkZXIucmVhZEludCgyKTtcbiAgICAgICAgdGhpcy5kaXNrTnVtYmVyU3RhcnQgPSByZWFkZXIucmVhZEludCgyKTtcbiAgICAgICAgdGhpcy5pbnRlcm5hbEZpbGVBdHRyaWJ1dGVzID0gcmVhZGVyLnJlYWRJbnQoMik7XG4gICAgICAgIHRoaXMuZXh0ZXJuYWxGaWxlQXR0cmlidXRlcyA9IHJlYWRlci5yZWFkSW50KDQpO1xuICAgICAgICB0aGlzLmxvY2FsSGVhZGVyT2Zmc2V0ID0gcmVhZGVyLnJlYWRJbnQoNCk7XG5cbiAgICAgICAgaWYgKHRoaXMuaXNFbmNyeXB0ZWQoKSkge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKFwiRW5jcnlwdGVkIHppcCBhcmUgbm90IHN1cHBvcnRlZFwiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHdpbGwgYmUgcmVhZCBpbiB0aGUgbG9jYWwgcGFydCwgc2VlIHRoZSBjb21tZW50cyB0aGVyZVxuICAgICAgICByZWFkZXIuc2tpcChmaWxlTmFtZUxlbmd0aCk7XG4gICAgICAgIHRoaXMucmVhZEV4dHJhRmllbGRzKHJlYWRlcik7XG4gICAgICAgIHRoaXMucGFyc2VaSVA2NEV4dHJhRmllbGQocmVhZGVyKTtcbiAgICAgICAgdGhpcy5maWxlQ29tbWVudCA9IHJlYWRlci5yZWFkRGF0YSh0aGlzLmZpbGVDb21tZW50TGVuZ3RoKTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogUGFyc2UgdGhlIGV4dGVybmFsIGZpbGUgYXR0cmlidXRlcyBhbmQgZ2V0IHRoZSB1bml4L2RvcyBwZXJtaXNzaW9ucy5cbiAgICAgKi9cbiAgICBwcm9jZXNzQXR0cmlidXRlczogZnVuY3Rpb24gKCkge1xuICAgICAgICB0aGlzLnVuaXhQZXJtaXNzaW9ucyA9IG51bGw7XG4gICAgICAgIHRoaXMuZG9zUGVybWlzc2lvbnMgPSBudWxsO1xuICAgICAgICB2YXIgbWFkZUJ5ID0gdGhpcy52ZXJzaW9uTWFkZUJ5ID4+IDg7XG5cbiAgICAgICAgLy8gQ2hlY2sgaWYgd2UgaGF2ZSB0aGUgRE9TIGRpcmVjdG9yeSBmbGFnIHNldC5cbiAgICAgICAgLy8gV2UgbG9vayBmb3IgaXQgaW4gdGhlIERPUyBhbmQgVU5JWCBwZXJtaXNzaW9uc1xuICAgICAgICAvLyBidXQgc29tZSB1bmtub3duIHBsYXRmb3JtIGNvdWxkIHNldCBpdCBhcyBhIGNvbXBhdGliaWxpdHkgZmxhZy5cbiAgICAgICAgdGhpcy5kaXIgPSB0aGlzLmV4dGVybmFsRmlsZUF0dHJpYnV0ZXMgJiAweDAwMTAgPyB0cnVlIDogZmFsc2U7XG5cbiAgICAgICAgaWYobWFkZUJ5ID09PSBNQURFX0JZX0RPUykge1xuICAgICAgICAgICAgLy8gZmlyc3QgNiBiaXRzICgwIHRvIDUpXG4gICAgICAgICAgICB0aGlzLmRvc1Blcm1pc3Npb25zID0gdGhpcy5leHRlcm5hbEZpbGVBdHRyaWJ1dGVzICYgMHgzRjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmKG1hZGVCeSA9PT0gTUFERV9CWV9VTklYKSB7XG4gICAgICAgICAgICB0aGlzLnVuaXhQZXJtaXNzaW9ucyA9ICh0aGlzLmV4dGVybmFsRmlsZUF0dHJpYnV0ZXMgPj4gMTYpICYgMHhGRkZGO1xuICAgICAgICAgICAgLy8gdGhlIG9jdGFsIHBlcm1pc3Npb25zIGFyZSBpbiAodGhpcy51bml4UGVybWlzc2lvbnMgJiAweDAxRkYpLnRvU3RyaW5nKDgpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gZmFpbCBzYWZlIDogaWYgdGhlIG5hbWUgZW5kcyB3aXRoIGEgLyBpdCBwcm9iYWJseSBtZWFucyBhIGZvbGRlclxuICAgICAgICBpZiAoIXRoaXMuZGlyICYmIHRoaXMuZmlsZU5hbWVTdHIuc2xpY2UoLTEpID09PSAnLycpIHtcbiAgICAgICAgICAgIHRoaXMuZGlyID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBQYXJzZSB0aGUgWklQNjQgZXh0cmEgZmllbGQgYW5kIG1lcmdlIHRoZSBpbmZvIGluIHRoZSBjdXJyZW50IFppcEVudHJ5LlxuICAgICAqIEBwYXJhbSB7RGF0YVJlYWRlcn0gcmVhZGVyIHRoZSByZWFkZXIgdG8gdXNlLlxuICAgICAqL1xuICAgIHBhcnNlWklQNjRFeHRyYUZpZWxkOiBmdW5jdGlvbihyZWFkZXIpIHtcblxuICAgICAgICBpZiAoIXRoaXMuZXh0cmFGaWVsZHNbMHgwMDAxXSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gc2hvdWxkIGJlIHNvbWV0aGluZywgcHJlcGFyaW5nIHRoZSBleHRyYSByZWFkZXJcbiAgICAgICAgdmFyIGV4dHJhUmVhZGVyID0gcmVhZGVyRm9yKHRoaXMuZXh0cmFGaWVsZHNbMHgwMDAxXS52YWx1ZSk7XG5cbiAgICAgICAgLy8gSSByZWFsbHkgaG9wZSB0aGF0IHRoZXNlIDY0Yml0cyBpbnRlZ2VyIGNhbiBmaXQgaW4gMzIgYml0cyBpbnRlZ2VyLCBiZWNhdXNlIGpzXG4gICAgICAgIC8vIHdvbid0IGxldCB1cyBoYXZlIG1vcmUuXG4gICAgICAgIGlmICh0aGlzLnVuY29tcHJlc3NlZFNpemUgPT09IHV0aWxzLk1BWF9WQUxVRV8zMkJJVFMpIHtcbiAgICAgICAgICAgIHRoaXMudW5jb21wcmVzc2VkU2l6ZSA9IGV4dHJhUmVhZGVyLnJlYWRJbnQoOCk7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHRoaXMuY29tcHJlc3NlZFNpemUgPT09IHV0aWxzLk1BWF9WQUxVRV8zMkJJVFMpIHtcbiAgICAgICAgICAgIHRoaXMuY29tcHJlc3NlZFNpemUgPSBleHRyYVJlYWRlci5yZWFkSW50KDgpO1xuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLmxvY2FsSGVhZGVyT2Zmc2V0ID09PSB1dGlscy5NQVhfVkFMVUVfMzJCSVRTKSB7XG4gICAgICAgICAgICB0aGlzLmxvY2FsSGVhZGVyT2Zmc2V0ID0gZXh0cmFSZWFkZXIucmVhZEludCg4KTtcbiAgICAgICAgfVxuICAgICAgICBpZiAodGhpcy5kaXNrTnVtYmVyU3RhcnQgPT09IHV0aWxzLk1BWF9WQUxVRV8zMkJJVFMpIHtcbiAgICAgICAgICAgIHRoaXMuZGlza051bWJlclN0YXJ0ID0gZXh0cmFSZWFkZXIucmVhZEludCg0KTtcbiAgICAgICAgfVxuICAgIH0sXG4gICAgLyoqXG4gICAgICogUmVhZCB0aGUgY2VudHJhbCBwYXJ0IG9mIGEgemlwIGZpbGUgYW5kIGFkZCB0aGUgaW5mbyBpbiB0aGlzIG9iamVjdC5cbiAgICAgKiBAcGFyYW0ge0RhdGFSZWFkZXJ9IHJlYWRlciB0aGUgcmVhZGVyIHRvIHVzZS5cbiAgICAgKi9cbiAgICByZWFkRXh0cmFGaWVsZHM6IGZ1bmN0aW9uKHJlYWRlcikge1xuICAgICAgICB2YXIgZW5kID0gcmVhZGVyLmluZGV4ICsgdGhpcy5leHRyYUZpZWxkc0xlbmd0aCxcbiAgICAgICAgICAgIGV4dHJhRmllbGRJZCxcbiAgICAgICAgICAgIGV4dHJhRmllbGRMZW5ndGgsXG4gICAgICAgICAgICBleHRyYUZpZWxkVmFsdWU7XG5cbiAgICAgICAgaWYgKCF0aGlzLmV4dHJhRmllbGRzKSB7XG4gICAgICAgICAgICB0aGlzLmV4dHJhRmllbGRzID0ge307XG4gICAgICAgIH1cblxuICAgICAgICB3aGlsZSAocmVhZGVyLmluZGV4IDwgZW5kKSB7XG4gICAgICAgICAgICBleHRyYUZpZWxkSWQgPSByZWFkZXIucmVhZEludCgyKTtcbiAgICAgICAgICAgIGV4dHJhRmllbGRMZW5ndGggPSByZWFkZXIucmVhZEludCgyKTtcbiAgICAgICAgICAgIGV4dHJhRmllbGRWYWx1ZSA9IHJlYWRlci5yZWFkRGF0YShleHRyYUZpZWxkTGVuZ3RoKTtcblxuICAgICAgICAgICAgdGhpcy5leHRyYUZpZWxkc1tleHRyYUZpZWxkSWRdID0ge1xuICAgICAgICAgICAgICAgIGlkOiBleHRyYUZpZWxkSWQsXG4gICAgICAgICAgICAgICAgbGVuZ3RoOiBleHRyYUZpZWxkTGVuZ3RoLFxuICAgICAgICAgICAgICAgIHZhbHVlOiBleHRyYUZpZWxkVmFsdWVcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICB9LFxuICAgIC8qKlxuICAgICAqIEFwcGx5IGFuIFVURjggdHJhbnNmb3JtYXRpb24gaWYgbmVlZGVkLlxuICAgICAqL1xuICAgIGhhbmRsZVVURjg6IGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgZGVjb2RlUGFyYW1UeXBlID0gc3VwcG9ydC51aW50OGFycmF5ID8gXCJ1aW50OGFycmF5XCIgOiBcImFycmF5XCI7XG4gICAgICAgIGlmICh0aGlzLnVzZVVURjgoKSkge1xuICAgICAgICAgICAgdGhpcy5maWxlTmFtZVN0ciA9IHV0ZjgudXRmOGRlY29kZSh0aGlzLmZpbGVOYW1lKTtcbiAgICAgICAgICAgIHRoaXMuZmlsZUNvbW1lbnRTdHIgPSB1dGY4LnV0ZjhkZWNvZGUodGhpcy5maWxlQ29tbWVudCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB2YXIgdXBhdGggPSB0aGlzLmZpbmRFeHRyYUZpZWxkVW5pY29kZVBhdGgoKTtcbiAgICAgICAgICAgIGlmICh1cGF0aCAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHRoaXMuZmlsZU5hbWVTdHIgPSB1cGF0aDtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gQVNDSUkgdGV4dCBvciB1bnN1cHBvcnRlZCBjb2RlIHBhZ2VcbiAgICAgICAgICAgICAgICB2YXIgZmlsZU5hbWVCeXRlQXJyYXkgPSAgdXRpbHMudHJhbnNmb3JtVG8oZGVjb2RlUGFyYW1UeXBlLCB0aGlzLmZpbGVOYW1lKTtcbiAgICAgICAgICAgICAgICB0aGlzLmZpbGVOYW1lU3RyID0gdGhpcy5sb2FkT3B0aW9ucy5kZWNvZGVGaWxlTmFtZShmaWxlTmFtZUJ5dGVBcnJheSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHZhciB1Y29tbWVudCA9IHRoaXMuZmluZEV4dHJhRmllbGRVbmljb2RlQ29tbWVudCgpO1xuICAgICAgICAgICAgaWYgKHVjb21tZW50ICE9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5maWxlQ29tbWVudFN0ciA9IHVjb21tZW50O1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBBU0NJSSB0ZXh0IG9yIHVuc3VwcG9ydGVkIGNvZGUgcGFnZVxuICAgICAgICAgICAgICAgIHZhciBjb21tZW50Qnl0ZUFycmF5ID0gIHV0aWxzLnRyYW5zZm9ybVRvKGRlY29kZVBhcmFtVHlwZSwgdGhpcy5maWxlQ29tbWVudCk7XG4gICAgICAgICAgICAgICAgdGhpcy5maWxlQ29tbWVudFN0ciA9IHRoaXMubG9hZE9wdGlvbnMuZGVjb2RlRmlsZU5hbWUoY29tbWVudEJ5dGVBcnJheSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogRmluZCB0aGUgdW5pY29kZSBwYXRoIGRlY2xhcmVkIGluIHRoZSBleHRyYSBmaWVsZCwgaWYgYW55LlxuICAgICAqIEByZXR1cm4ge1N0cmluZ30gdGhlIHVuaWNvZGUgcGF0aCwgbnVsbCBvdGhlcndpc2UuXG4gICAgICovXG4gICAgZmluZEV4dHJhRmllbGRVbmljb2RlUGF0aDogZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciB1cGF0aEZpZWxkID0gdGhpcy5leHRyYUZpZWxkc1sweDcwNzVdO1xuICAgICAgICBpZiAodXBhdGhGaWVsZCkge1xuICAgICAgICAgICAgdmFyIGV4dHJhUmVhZGVyID0gcmVhZGVyRm9yKHVwYXRoRmllbGQudmFsdWUpO1xuXG4gICAgICAgICAgICAvLyB3cm9uZyB2ZXJzaW9uXG4gICAgICAgICAgICBpZiAoZXh0cmFSZWFkZXIucmVhZEludCgxKSAhPT0gMSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyB0aGUgY3JjIG9mIHRoZSBmaWxlbmFtZSBjaGFuZ2VkLCB0aGlzIGZpZWxkIGlzIG91dCBvZiBkYXRlLlxuICAgICAgICAgICAgaWYgKGNyYzMyZm4odGhpcy5maWxlTmFtZSkgIT09IGV4dHJhUmVhZGVyLnJlYWRJbnQoNCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIHV0ZjgudXRmOGRlY29kZShleHRyYVJlYWRlci5yZWFkRGF0YSh1cGF0aEZpZWxkLmxlbmd0aCAtIDUpKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbnVsbDtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogRmluZCB0aGUgdW5pY29kZSBjb21tZW50IGRlY2xhcmVkIGluIHRoZSBleHRyYSBmaWVsZCwgaWYgYW55LlxuICAgICAqIEByZXR1cm4ge1N0cmluZ30gdGhlIHVuaWNvZGUgY29tbWVudCwgbnVsbCBvdGhlcndpc2UuXG4gICAgICovXG4gICAgZmluZEV4dHJhRmllbGRVbmljb2RlQ29tbWVudDogZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciB1Y29tbWVudEZpZWxkID0gdGhpcy5leHRyYUZpZWxkc1sweDYzNzVdO1xuICAgICAgICBpZiAodWNvbW1lbnRGaWVsZCkge1xuICAgICAgICAgICAgdmFyIGV4dHJhUmVhZGVyID0gcmVhZGVyRm9yKHVjb21tZW50RmllbGQudmFsdWUpO1xuXG4gICAgICAgICAgICAvLyB3cm9uZyB2ZXJzaW9uXG4gICAgICAgICAgICBpZiAoZXh0cmFSZWFkZXIucmVhZEludCgxKSAhPT0gMSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyB0aGUgY3JjIG9mIHRoZSBjb21tZW50IGNoYW5nZWQsIHRoaXMgZmllbGQgaXMgb3V0IG9mIGRhdGUuXG4gICAgICAgICAgICBpZiAoY3JjMzJmbih0aGlzLmZpbGVDb21tZW50KSAhPT0gZXh0cmFSZWFkZXIucmVhZEludCg0KSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gdXRmOC51dGY4ZGVjb2RlKGV4dHJhUmVhZGVyLnJlYWREYXRhKHVjb21tZW50RmllbGQubGVuZ3RoIC0gNSkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cbn07XG5tb2R1bGUuZXhwb3J0cyA9IFppcEVudHJ5O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgU3RyZWFtSGVscGVyID0gcmVxdWlyZSgnLi9zdHJlYW0vU3RyZWFtSGVscGVyJyk7XG52YXIgRGF0YVdvcmtlciA9IHJlcXVpcmUoJy4vc3RyZWFtL0RhdGFXb3JrZXInKTtcbnZhciB1dGY4ID0gcmVxdWlyZSgnLi91dGY4Jyk7XG52YXIgQ29tcHJlc3NlZE9iamVjdCA9IHJlcXVpcmUoJy4vY29tcHJlc3NlZE9iamVjdCcpO1xudmFyIEdlbmVyaWNXb3JrZXIgPSByZXF1aXJlKCcuL3N0cmVhbS9HZW5lcmljV29ya2VyJyk7XG5cbi8qKlxuICogQSBzaW1wbGUgb2JqZWN0IHJlcHJlc2VudGluZyBhIGZpbGUgaW4gdGhlIHppcCBmaWxlLlxuICogQGNvbnN0cnVjdG9yXG4gKiBAcGFyYW0ge3N0cmluZ30gbmFtZSB0aGUgbmFtZSBvZiB0aGUgZmlsZVxuICogQHBhcmFtIHtTdHJpbmd8QXJyYXlCdWZmZXJ8VWludDhBcnJheXxCdWZmZXJ9IGRhdGEgdGhlIGRhdGFcbiAqIEBwYXJhbSB7T2JqZWN0fSBvcHRpb25zIHRoZSBvcHRpb25zIG9mIHRoZSBmaWxlXG4gKi9cbnZhciBaaXBPYmplY3QgPSBmdW5jdGlvbihuYW1lLCBkYXRhLCBvcHRpb25zKSB7XG4gICAgdGhpcy5uYW1lID0gbmFtZTtcbiAgICB0aGlzLmRpciA9IG9wdGlvbnMuZGlyO1xuICAgIHRoaXMuZGF0ZSA9IG9wdGlvbnMuZGF0ZTtcbiAgICB0aGlzLmNvbW1lbnQgPSBvcHRpb25zLmNvbW1lbnQ7XG4gICAgdGhpcy51bml4UGVybWlzc2lvbnMgPSBvcHRpb25zLnVuaXhQZXJtaXNzaW9ucztcbiAgICB0aGlzLmRvc1Blcm1pc3Npb25zID0gb3B0aW9ucy5kb3NQZXJtaXNzaW9ucztcblxuICAgIHRoaXMuX2RhdGEgPSBkYXRhO1xuICAgIHRoaXMuX2RhdGFCaW5hcnkgPSBvcHRpb25zLmJpbmFyeTtcbiAgICAvLyBrZWVwIG9ubHkgdGhlIGNvbXByZXNzaW9uXG4gICAgdGhpcy5vcHRpb25zID0ge1xuICAgICAgICBjb21wcmVzc2lvbiA6IG9wdGlvbnMuY29tcHJlc3Npb24sXG4gICAgICAgIGNvbXByZXNzaW9uT3B0aW9ucyA6IG9wdGlvbnMuY29tcHJlc3Npb25PcHRpb25zXG4gICAgfTtcbn07XG5cblppcE9iamVjdC5wcm90b3R5cGUgPSB7XG4gICAgLyoqXG4gICAgICogQ3JlYXRlIGFuIGludGVybmFsIHN0cmVhbSBmb3IgdGhlIGNvbnRlbnQgb2YgdGhpcyBvYmplY3QuXG4gICAgICogQHBhcmFtIHtTdHJpbmd9IHR5cGUgdGhlIHR5cGUgb2YgZWFjaCBjaHVuay5cbiAgICAgKiBAcmV0dXJuIFN0cmVhbUhlbHBlciB0aGUgc3RyZWFtLlxuICAgICAqL1xuICAgIGludGVybmFsU3RyZWFtOiBmdW5jdGlvbiAodHlwZSkge1xuICAgICAgICB2YXIgb3V0cHV0VHlwZSA9IHR5cGUudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgdmFyIGFza1VuaWNvZGVTdHJpbmcgPSBvdXRwdXRUeXBlID09PSBcInN0cmluZ1wiIHx8IG91dHB1dFR5cGUgPT09IFwidGV4dFwiO1xuICAgICAgICBpZiAob3V0cHV0VHlwZSA9PT0gXCJiaW5hcnlzdHJpbmdcIiB8fCBvdXRwdXRUeXBlID09PSBcInRleHRcIikge1xuICAgICAgICAgICAgb3V0cHV0VHlwZSA9IFwic3RyaW5nXCI7XG4gICAgICAgIH1cbiAgICAgICAgdmFyIHJlc3VsdCA9IHRoaXMuX2RlY29tcHJlc3NXb3JrZXIoKTtcblxuICAgICAgICB2YXIgaXNVbmljb2RlU3RyaW5nID0gIXRoaXMuX2RhdGFCaW5hcnk7XG5cbiAgICAgICAgaWYgKGlzVW5pY29kZVN0cmluZyAmJiAhYXNrVW5pY29kZVN0cmluZykge1xuICAgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0LnBpcGUobmV3IHV0ZjguVXRmOEVuY29kZVdvcmtlcigpKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIWlzVW5pY29kZVN0cmluZyAmJiBhc2tVbmljb2RlU3RyaW5nKSB7XG4gICAgICAgICAgICByZXN1bHQgPSByZXN1bHQucGlwZShuZXcgdXRmOC5VdGY4RGVjb2RlV29ya2VyKCkpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIG5ldyBTdHJlYW1IZWxwZXIocmVzdWx0LCBvdXRwdXRUeXBlLCBcIlwiKTtcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogUHJlcGFyZSB0aGUgY29udGVudCBpbiB0aGUgYXNrZWQgdHlwZS5cbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gdHlwZSB0aGUgdHlwZSBvZiB0aGUgcmVzdWx0LlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IG9uVXBkYXRlIGEgZnVuY3Rpb24gdG8gY2FsbCBvbiBlYWNoIGludGVybmFsIHVwZGF0ZS5cbiAgICAgKiBAcmV0dXJuIFByb21pc2UgdGhlIHByb21pc2Ugb2YgdGhlIHJlc3VsdC5cbiAgICAgKi9cbiAgICBhc3luYzogZnVuY3Rpb24gKHR5cGUsIG9uVXBkYXRlKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmludGVybmFsU3RyZWFtKHR5cGUpLmFjY3VtdWxhdGUob25VcGRhdGUpO1xuICAgIH0sXG5cbiAgICAvKipcbiAgICAgKiBQcmVwYXJlIHRoZSBjb250ZW50IGFzIGEgbm9kZWpzIHN0cmVhbS5cbiAgICAgKiBAcGFyYW0ge1N0cmluZ30gdHlwZSB0aGUgdHlwZSBvZiBlYWNoIGNodW5rLlxuICAgICAqIEBwYXJhbSB7RnVuY3Rpb259IG9uVXBkYXRlIGEgZnVuY3Rpb24gdG8gY2FsbCBvbiBlYWNoIGludGVybmFsIHVwZGF0ZS5cbiAgICAgKiBAcmV0dXJuIFN0cmVhbSB0aGUgc3RyZWFtLlxuICAgICAqL1xuICAgIG5vZGVTdHJlYW06IGZ1bmN0aW9uICh0eXBlLCBvblVwZGF0ZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5pbnRlcm5hbFN0cmVhbSh0eXBlIHx8IFwibm9kZWJ1ZmZlclwiKS50b05vZGVqc1N0cmVhbShvblVwZGF0ZSk7XG4gICAgfSxcblxuICAgIC8qKlxuICAgICAqIFJldHVybiBhIHdvcmtlciBmb3IgdGhlIGNvbXByZXNzZWQgY29udGVudC5cbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEBwYXJhbSB7T2JqZWN0fSBjb21wcmVzc2lvbiB0aGUgY29tcHJlc3Npb24gb2JqZWN0IHRvIHVzZS5cbiAgICAgKiBAcGFyYW0ge09iamVjdH0gY29tcHJlc3Npb25PcHRpb25zIHRoZSBvcHRpb25zIHRvIHVzZSB3aGVuIGNvbXByZXNzaW5nLlxuICAgICAqIEByZXR1cm4gV29ya2VyIHRoZSB3b3JrZXIuXG4gICAgICovXG4gICAgLy8gX2NvbXByZXNzV29ya2VyOiBmdW5jdGlvbiAoY29tcHJlc3Npb24sIGNvbXByZXNzaW9uT3B0aW9ucykge1xuICAgIC8vICAgICBpZiAoXG4gICAgLy8gICAgICAgICB0aGlzLl9kYXRhIGluc3RhbmNlb2YgQ29tcHJlc3NlZE9iamVjdCAmJlxuICAgIC8vICAgICAgICAgdGhpcy5fZGF0YS5jb21wcmVzc2lvbi5tYWdpYyA9PT0gY29tcHJlc3Npb24ubWFnaWNcbiAgICAvLyAgICAgKSB7XG4gICAgLy8gICAgICAgICByZXR1cm4gdGhpcy5fZGF0YS5nZXRDb21wcmVzc2VkV29ya2VyKCk7XG4gICAgLy8gICAgIH0gZWxzZSB7XG4gICAgLy8gICAgICAgICB2YXIgcmVzdWx0ID0gdGhpcy5fZGVjb21wcmVzc1dvcmtlcigpO1xuICAgIC8vICAgICAgICAgaWYoIXRoaXMuX2RhdGFCaW5hcnkpIHtcbiAgICAvLyAgICAgICAgICAgICByZXN1bHQgPSByZXN1bHQucGlwZShuZXcgdXRmOC5VdGY4RW5jb2RlV29ya2VyKCkpO1xuICAgIC8vICAgICAgICAgfVxuICAgIC8vICAgICAgICAgcmV0dXJuIENvbXByZXNzZWRPYmplY3QuY3JlYXRlV29ya2VyRnJvbShyZXN1bHQsIGNvbXByZXNzaW9uLCBjb21wcmVzc2lvbk9wdGlvbnMpO1xuICAgIC8vICAgICB9XG4gICAgLy8gfSxcbiAgICAvKipcbiAgICAgKiBSZXR1cm4gYSB3b3JrZXIgZm9yIHRoZSBkZWNvbXByZXNzZWQgY29udGVudC5cbiAgICAgKiBAcHJpdmF0ZVxuICAgICAqIEByZXR1cm4gV29ya2VyIHRoZSB3b3JrZXIuXG4gICAgICovXG4gICAgX2RlY29tcHJlc3NXb3JrZXIgOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgIGlmICh0aGlzLl9kYXRhIGluc3RhbmNlb2YgQ29tcHJlc3NlZE9iamVjdCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuX2RhdGEuZ2V0Q29udGVudFdvcmtlcigpO1xuICAgICAgICB9IGVsc2UgaWYgKHRoaXMuX2RhdGEgaW5zdGFuY2VvZiBHZW5lcmljV29ya2VyKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5fZGF0YTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgRGF0YVdvcmtlcih0aGlzLl9kYXRhKTtcbiAgICAgICAgfVxuICAgIH1cbn07XG5cbnZhciByZW1vdmVkTWV0aG9kcyA9IFtcImFzVGV4dFwiLCBcImFzQmluYXJ5XCIsIFwiYXNOb2RlQnVmZmVyXCIsIFwiYXNVaW50OEFycmF5XCIsIFwiYXNBcnJheUJ1ZmZlclwiXTtcbnZhciByZW1vdmVkRm4gPSBmdW5jdGlvbiAoKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKFwiVGhpcyBtZXRob2QgaGFzIGJlZW4gcmVtb3ZlZCBpbiBKU1ppcCAzLjAsIHBsZWFzZSBjaGVjayB0aGUgdXBncmFkZSBndWlkZS5cIik7XG59O1xuXG5mb3IodmFyIGkgPSAwOyBpIDwgcmVtb3ZlZE1ldGhvZHMubGVuZ3RoOyBpKyspIHtcbiAgICBaaXBPYmplY3QucHJvdG90eXBlW3JlbW92ZWRNZXRob2RzW2ldXSA9IHJlbW92ZWRGbjtcbn1cbm1vZHVsZS5leHBvcnRzID0gWmlwT2JqZWN0O1xuIiwiLy8gVG9wIGxldmVsIGZpbGUgaXMganVzdCBhIG1peGluIG9mIHN1Ym1vZHVsZXMgJiBjb25zdGFudHNcbid1c2Ugc3RyaWN0JztcblxudmFyIGFzc2lnbiAgICA9IHJlcXVpcmUoJy4vbGliL3V0aWxzL2NvbW1vbicpLmFzc2lnbjtcblxudmFyIGRlZmxhdGUgICA9IHJlcXVpcmUoJy4vbGliL2RlZmxhdGUnKTtcbnZhciBpbmZsYXRlICAgPSByZXF1aXJlKCcuL2xpYi9pbmZsYXRlJyk7XG52YXIgY29uc3RhbnRzID0gcmVxdWlyZSgnLi9saWIvemxpYi9jb25zdGFudHMnKTtcblxudmFyIHBha28gPSB7fTtcblxuYXNzaWduKHBha28sIGRlZmxhdGUsIGluZmxhdGUsIGNvbnN0YW50cyk7XG5cbm1vZHVsZS5leHBvcnRzID0gcGFrbztcbiIsIid1c2Ugc3RyaWN0JztcblxuXG52YXIgemxpYl9kZWZsYXRlID0gcmVxdWlyZSgnLi96bGliL2RlZmxhdGUnKTtcbnZhciB1dGlscyAgICAgICAgPSByZXF1aXJlKCcuL3V0aWxzL2NvbW1vbicpO1xudmFyIHN0cmluZ3MgICAgICA9IHJlcXVpcmUoJy4vdXRpbHMvc3RyaW5ncycpO1xudmFyIG1zZyAgICAgICAgICA9IHJlcXVpcmUoJy4vemxpYi9tZXNzYWdlcycpO1xudmFyIFpTdHJlYW0gICAgICA9IHJlcXVpcmUoJy4vemxpYi96c3RyZWFtJyk7XG5cbnZhciB0b1N0cmluZyA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmc7XG5cbi8qIFB1YmxpYyBjb25zdGFudHMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qL1xuXG52YXIgWl9OT19GTFVTSCAgICAgID0gMDtcbnZhciBaX0ZJTklTSCAgICAgICAgPSA0O1xuXG52YXIgWl9PSyAgICAgICAgICAgID0gMDtcbnZhciBaX1NUUkVBTV9FTkQgICAgPSAxO1xudmFyIFpfU1lOQ19GTFVTSCAgICA9IDI7XG5cbnZhciBaX0RFRkFVTFRfQ09NUFJFU1NJT04gPSAtMTtcblxudmFyIFpfREVGQVVMVF9TVFJBVEVHWSAgICA9IDA7XG5cbnZhciBaX0RFRkxBVEVEICA9IDg7XG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovXG5cblxuLyoqXG4gKiBjbGFzcyBEZWZsYXRlXG4gKlxuICogR2VuZXJpYyBKUy1zdHlsZSB3cmFwcGVyIGZvciB6bGliIGNhbGxzLiBJZiB5b3UgZG9uJ3QgbmVlZFxuICogc3RyZWFtaW5nIGJlaGF2aW91ciAtIHVzZSBtb3JlIHNpbXBsZSBmdW5jdGlvbnM6IFtbZGVmbGF0ZV1dLFxuICogW1tkZWZsYXRlUmF3XV0gYW5kIFtbZ3ppcF1dLlxuICoqL1xuXG4vKiBpbnRlcm5hbFxuICogRGVmbGF0ZS5jaHVua3MgLT4gQXJyYXlcbiAqXG4gKiBDaHVua3Mgb2Ygb3V0cHV0IGRhdGEsIGlmIFtbRGVmbGF0ZSNvbkRhdGFdXSBub3Qgb3ZlcnJpZGVuLlxuICoqL1xuXG4vKipcbiAqIERlZmxhdGUucmVzdWx0IC0+IFVpbnQ4QXJyYXl8QXJyYXlcbiAqXG4gKiBDb21wcmVzc2VkIHJlc3VsdCwgZ2VuZXJhdGVkIGJ5IGRlZmF1bHQgW1tEZWZsYXRlI29uRGF0YV1dXG4gKiBhbmQgW1tEZWZsYXRlI29uRW5kXV0gaGFuZGxlcnMuIEZpbGxlZCBhZnRlciB5b3UgcHVzaCBsYXN0IGNodW5rXG4gKiAoY2FsbCBbW0RlZmxhdGUjcHVzaF1dIHdpdGggYFpfRklOSVNIYCAvIGB0cnVlYCBwYXJhbSkgIG9yIGlmIHlvdVxuICogcHVzaCBhIGNodW5rIHdpdGggZXhwbGljaXQgZmx1c2ggKGNhbGwgW1tEZWZsYXRlI3B1c2hdXSB3aXRoXG4gKiBgWl9TWU5DX0ZMVVNIYCBwYXJhbSkuXG4gKiovXG5cbi8qKlxuICogRGVmbGF0ZS5lcnIgLT4gTnVtYmVyXG4gKlxuICogRXJyb3IgY29kZSBhZnRlciBkZWZsYXRlIGZpbmlzaGVkLiAwIChaX09LKSBvbiBzdWNjZXNzLlxuICogWW91IHdpbGwgbm90IG5lZWQgaXQgaW4gcmVhbCBsaWZlLCBiZWNhdXNlIGRlZmxhdGUgZXJyb3JzXG4gKiBhcmUgcG9zc2libGUgb25seSBvbiB3cm9uZyBvcHRpb25zIG9yIGJhZCBgb25EYXRhYCAvIGBvbkVuZGBcbiAqIGN1c3RvbSBoYW5kbGVycy5cbiAqKi9cblxuLyoqXG4gKiBEZWZsYXRlLm1zZyAtPiBTdHJpbmdcbiAqXG4gKiBFcnJvciBtZXNzYWdlLCBpZiBbW0RlZmxhdGUuZXJyXV0gIT0gMFxuICoqL1xuXG5cbi8qKlxuICogbmV3IERlZmxhdGUob3B0aW9ucylcbiAqIC0gb3B0aW9ucyAoT2JqZWN0KTogemxpYiBkZWZsYXRlIG9wdGlvbnMuXG4gKlxuICogQ3JlYXRlcyBuZXcgZGVmbGF0b3IgaW5zdGFuY2Ugd2l0aCBzcGVjaWZpZWQgcGFyYW1zLiBUaHJvd3MgZXhjZXB0aW9uXG4gKiBvbiBiYWQgcGFyYW1zLiBTdXBwb3J0ZWQgb3B0aW9uczpcbiAqXG4gKiAtIGBsZXZlbGBcbiAqIC0gYHdpbmRvd0JpdHNgXG4gKiAtIGBtZW1MZXZlbGBcbiAqIC0gYHN0cmF0ZWd5YFxuICogLSBgZGljdGlvbmFyeWBcbiAqXG4gKiBbaHR0cDovL3psaWIubmV0L21hbnVhbC5odG1sI0FkdmFuY2VkXShodHRwOi8vemxpYi5uZXQvbWFudWFsLmh0bWwjQWR2YW5jZWQpXG4gKiBmb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGVzZS5cbiAqXG4gKiBBZGRpdGlvbmFsIG9wdGlvbnMsIGZvciBpbnRlcm5hbCBuZWVkczpcbiAqXG4gKiAtIGBjaHVua1NpemVgIC0gc2l6ZSBvZiBnZW5lcmF0ZWQgZGF0YSBjaHVua3MgKDE2SyBieSBkZWZhdWx0KVxuICogLSBgcmF3YCAoQm9vbGVhbikgLSBkbyByYXcgZGVmbGF0ZVxuICogLSBgZ3ppcGAgKEJvb2xlYW4pIC0gY3JlYXRlIGd6aXAgd3JhcHBlclxuICogLSBgdG9gIChTdHJpbmcpIC0gaWYgZXF1YWwgdG8gJ3N0cmluZycsIHRoZW4gcmVzdWx0IHdpbGwgYmUgXCJiaW5hcnkgc3RyaW5nXCJcbiAqICAgIChlYWNoIGNoYXIgY29kZSBbMC4uMjU1XSlcbiAqIC0gYGhlYWRlcmAgKE9iamVjdCkgLSBjdXN0b20gaGVhZGVyIGZvciBnemlwXG4gKiAgIC0gYHRleHRgIChCb29sZWFuKSAtIHRydWUgaWYgY29tcHJlc3NlZCBkYXRhIGJlbGlldmVkIHRvIGJlIHRleHRcbiAqICAgLSBgdGltZWAgKE51bWJlcikgLSBtb2RpZmljYXRpb24gdGltZSwgdW5peCB0aW1lc3RhbXBcbiAqICAgLSBgb3NgIChOdW1iZXIpIC0gb3BlcmF0aW9uIHN5c3RlbSBjb2RlXG4gKiAgIC0gYGV4dHJhYCAoQXJyYXkpIC0gYXJyYXkgb2YgYnl0ZXMgd2l0aCBleHRyYSBkYXRhIChtYXggNjU1MzYpXG4gKiAgIC0gYG5hbWVgIChTdHJpbmcpIC0gZmlsZSBuYW1lIChiaW5hcnkgc3RyaW5nKVxuICogICAtIGBjb21tZW50YCAoU3RyaW5nKSAtIGNvbW1lbnQgKGJpbmFyeSBzdHJpbmcpXG4gKiAgIC0gYGhjcmNgIChCb29sZWFuKSAtIHRydWUgaWYgaGVhZGVyIGNyYyBzaG91bGQgYmUgYWRkZWRcbiAqXG4gKiAjIyMjIyBFeGFtcGxlOlxuICpcbiAqIGBgYGphdmFzY3JpcHRcbiAqIHZhciBwYWtvID0gcmVxdWlyZSgncGFrbycpXG4gKiAgICwgY2h1bmsxID0gVWludDhBcnJheShbMSwyLDMsNCw1LDYsNyw4LDldKVxuICogICAsIGNodW5rMiA9IFVpbnQ4QXJyYXkoWzEwLDExLDEyLDEzLDE0LDE1LDE2LDE3LDE4LDE5XSk7XG4gKlxuICogdmFyIGRlZmxhdGUgPSBuZXcgcGFrby5EZWZsYXRlKHsgbGV2ZWw6IDN9KTtcbiAqXG4gKiBkZWZsYXRlLnB1c2goY2h1bmsxLCBmYWxzZSk7XG4gKiBkZWZsYXRlLnB1c2goY2h1bmsyLCB0cnVlKTsgIC8vIHRydWUgLT4gbGFzdCBjaHVua1xuICpcbiAqIGlmIChkZWZsYXRlLmVycikgeyB0aHJvdyBuZXcgRXJyb3IoZGVmbGF0ZS5lcnIpOyB9XG4gKlxuICogY29uc29sZS5sb2coZGVmbGF0ZS5yZXN1bHQpO1xuICogYGBgXG4gKiovXG5mdW5jdGlvbiBEZWZsYXRlKG9wdGlvbnMpIHtcbiAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIERlZmxhdGUpKSByZXR1cm4gbmV3IERlZmxhdGUob3B0aW9ucyk7XG5cbiAgdGhpcy5vcHRpb25zID0gdXRpbHMuYXNzaWduKHtcbiAgICBsZXZlbDogWl9ERUZBVUxUX0NPTVBSRVNTSU9OLFxuICAgIG1ldGhvZDogWl9ERUZMQVRFRCxcbiAgICBjaHVua1NpemU6IDE2Mzg0LFxuICAgIHdpbmRvd0JpdHM6IDE1LFxuICAgIG1lbUxldmVsOiA4LFxuICAgIHN0cmF0ZWd5OiBaX0RFRkFVTFRfU1RSQVRFR1ksXG4gICAgdG86ICcnXG4gIH0sIG9wdGlvbnMgfHwge30pO1xuXG4gIHZhciBvcHQgPSB0aGlzLm9wdGlvbnM7XG5cbiAgaWYgKG9wdC5yYXcgJiYgKG9wdC53aW5kb3dCaXRzID4gMCkpIHtcbiAgICBvcHQud2luZG93Qml0cyA9IC1vcHQud2luZG93Qml0cztcbiAgfVxuXG4gIGVsc2UgaWYgKG9wdC5nemlwICYmIChvcHQud2luZG93Qml0cyA+IDApICYmIChvcHQud2luZG93Qml0cyA8IDE2KSkge1xuICAgIG9wdC53aW5kb3dCaXRzICs9IDE2O1xuICB9XG5cbiAgdGhpcy5lcnIgICAgPSAwOyAgICAgIC8vIGVycm9yIGNvZGUsIGlmIGhhcHBlbnMgKDAgPSBaX09LKVxuICB0aGlzLm1zZyAgICA9ICcnOyAgICAgLy8gZXJyb3IgbWVzc2FnZVxuICB0aGlzLmVuZGVkICA9IGZhbHNlOyAgLy8gdXNlZCB0byBhdm9pZCBtdWx0aXBsZSBvbkVuZCgpIGNhbGxzXG4gIHRoaXMuY2h1bmtzID0gW107ICAgICAvLyBjaHVua3Mgb2YgY29tcHJlc3NlZCBkYXRhXG5cbiAgdGhpcy5zdHJtID0gbmV3IFpTdHJlYW0oKTtcbiAgdGhpcy5zdHJtLmF2YWlsX291dCA9IDA7XG5cbiAgdmFyIHN0YXR1cyA9IHpsaWJfZGVmbGF0ZS5kZWZsYXRlSW5pdDIoXG4gICAgdGhpcy5zdHJtLFxuICAgIG9wdC5sZXZlbCxcbiAgICBvcHQubWV0aG9kLFxuICAgIG9wdC53aW5kb3dCaXRzLFxuICAgIG9wdC5tZW1MZXZlbCxcbiAgICBvcHQuc3RyYXRlZ3lcbiAgKTtcblxuICBpZiAoc3RhdHVzICE9PSBaX09LKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKG1zZ1tzdGF0dXNdKTtcbiAgfVxuXG4gIGlmIChvcHQuaGVhZGVyKSB7XG4gICAgemxpYl9kZWZsYXRlLmRlZmxhdGVTZXRIZWFkZXIodGhpcy5zdHJtLCBvcHQuaGVhZGVyKTtcbiAgfVxuXG4gIGlmIChvcHQuZGljdGlvbmFyeSkge1xuICAgIHZhciBkaWN0O1xuICAgIC8vIENvbnZlcnQgZGF0YSBpZiBuZWVkZWRcbiAgICBpZiAodHlwZW9mIG9wdC5kaWN0aW9uYXJ5ID09PSAnc3RyaW5nJykge1xuICAgICAgLy8gSWYgd2UgbmVlZCB0byBjb21wcmVzcyB0ZXh0LCBjaGFuZ2UgZW5jb2RpbmcgdG8gdXRmOC5cbiAgICAgIGRpY3QgPSBzdHJpbmdzLnN0cmluZzJidWYob3B0LmRpY3Rpb25hcnkpO1xuICAgIH0gZWxzZSBpZiAodG9TdHJpbmcuY2FsbChvcHQuZGljdGlvbmFyeSkgPT09ICdbb2JqZWN0IEFycmF5QnVmZmVyXScpIHtcbiAgICAgIGRpY3QgPSBuZXcgVWludDhBcnJheShvcHQuZGljdGlvbmFyeSk7XG4gICAgfSBlbHNlIHtcbiAgICAgIGRpY3QgPSBvcHQuZGljdGlvbmFyeTtcbiAgICB9XG5cbiAgICBzdGF0dXMgPSB6bGliX2RlZmxhdGUuZGVmbGF0ZVNldERpY3Rpb25hcnkodGhpcy5zdHJtLCBkaWN0KTtcblxuICAgIGlmIChzdGF0dXMgIT09IFpfT0spIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihtc2dbc3RhdHVzXSk7XG4gICAgfVxuXG4gICAgdGhpcy5fZGljdF9zZXQgPSB0cnVlO1xuICB9XG59XG5cbi8qKlxuICogRGVmbGF0ZSNwdXNoKGRhdGFbLCBtb2RlXSkgLT4gQm9vbGVhblxuICogLSBkYXRhIChVaW50OEFycmF5fEFycmF5fEFycmF5QnVmZmVyfFN0cmluZyk6IGlucHV0IGRhdGEuIFN0cmluZ3Mgd2lsbCBiZVxuICogICBjb252ZXJ0ZWQgdG8gdXRmOCBieXRlIHNlcXVlbmNlLlxuICogLSBtb2RlIChOdW1iZXJ8Qm9vbGVhbik6IDAuLjYgZm9yIGNvcnJlc3BvbmRpbmcgWl9OT19GTFVTSC4uWl9UUkVFIG1vZGVzLlxuICogICBTZWUgY29uc3RhbnRzLiBTa2lwcGVkIG9yIGBmYWxzZWAgbWVhbnMgWl9OT19GTFVTSCwgYHRydWVgIG1lYW5zaCBaX0ZJTklTSC5cbiAqXG4gKiBTZW5kcyBpbnB1dCBkYXRhIHRvIGRlZmxhdGUgcGlwZSwgZ2VuZXJhdGluZyBbW0RlZmxhdGUjb25EYXRhXV0gY2FsbHMgd2l0aFxuICogbmV3IGNvbXByZXNzZWQgY2h1bmtzLiBSZXR1cm5zIGB0cnVlYCBvbiBzdWNjZXNzLiBUaGUgbGFzdCBkYXRhIGJsb2NrIG11c3QgaGF2ZVxuICogbW9kZSBaX0ZJTklTSCAob3IgYHRydWVgKS4gVGhhdCB3aWxsIGZsdXNoIGludGVybmFsIHBlbmRpbmcgYnVmZmVycyBhbmQgY2FsbFxuICogW1tEZWZsYXRlI29uRW5kXV0uIEZvciBpbnRlcmltIGV4cGxpY2l0IGZsdXNoZXMgKHdpdGhvdXQgZW5kaW5nIHRoZSBzdHJlYW0pIHlvdVxuICogY2FuIHVzZSBtb2RlIFpfU1lOQ19GTFVTSCwga2VlcGluZyB0aGUgY29tcHJlc3Npb24gY29udGV4dC5cbiAqXG4gKiBPbiBmYWlsIGNhbGwgW1tEZWZsYXRlI29uRW5kXV0gd2l0aCBlcnJvciBjb2RlIGFuZCByZXR1cm4gZmFsc2UuXG4gKlxuICogV2Ugc3Ryb25nbHkgcmVjb21tZW5kIHRvIHVzZSBgVWludDhBcnJheWAgb24gaW5wdXQgZm9yIGJlc3Qgc3BlZWQgKG91dHB1dFxuICogYXJyYXkgZm9ybWF0IGlzIGRldGVjdGVkIGF1dG9tYXRpY2FsbHkpLiBBbHNvLCBkb24ndCBza2lwIGxhc3QgcGFyYW0gYW5kIGFsd2F5c1xuICogdXNlIHRoZSBzYW1lIHR5cGUgaW4geW91ciBjb2RlIChib29sZWFuIG9yIG51bWJlcikuIFRoYXQgd2lsbCBpbXByb3ZlIEpTIHNwZWVkLlxuICpcbiAqIEZvciByZWd1bGFyIGBBcnJheWAtcyBtYWtlIHN1cmUgYWxsIGVsZW1lbnRzIGFyZSBbMC4uMjU1XS5cbiAqXG4gKiAjIyMjIyBFeGFtcGxlXG4gKlxuICogYGBgamF2YXNjcmlwdFxuICogcHVzaChjaHVuaywgZmFsc2UpOyAvLyBwdXNoIG9uZSBvZiBkYXRhIGNodW5rc1xuICogLi4uXG4gKiBwdXNoKGNodW5rLCB0cnVlKTsgIC8vIHB1c2ggbGFzdCBjaHVua1xuICogYGBgXG4gKiovXG5EZWZsYXRlLnByb3RvdHlwZS5wdXNoID0gZnVuY3Rpb24gKGRhdGEsIG1vZGUpIHtcbiAgdmFyIHN0cm0gPSB0aGlzLnN0cm07XG4gIHZhciBjaHVua1NpemUgPSB0aGlzLm9wdGlvbnMuY2h1bmtTaXplO1xuICB2YXIgc3RhdHVzLCBfbW9kZTtcblxuICBpZiAodGhpcy5lbmRlZCkgeyByZXR1cm4gZmFsc2U7IH1cblxuICBfbW9kZSA9IChtb2RlID09PSB+fm1vZGUpID8gbW9kZSA6ICgobW9kZSA9PT0gdHJ1ZSkgPyBaX0ZJTklTSCA6IFpfTk9fRkxVU0gpO1xuXG4gIC8vIENvbnZlcnQgZGF0YSBpZiBuZWVkZWRcbiAgaWYgKHR5cGVvZiBkYXRhID09PSAnc3RyaW5nJykge1xuICAgIC8vIElmIHdlIG5lZWQgdG8gY29tcHJlc3MgdGV4dCwgY2hhbmdlIGVuY29kaW5nIHRvIHV0ZjguXG4gICAgc3RybS5pbnB1dCA9IHN0cmluZ3Muc3RyaW5nMmJ1ZihkYXRhKTtcbiAgfSBlbHNlIGlmICh0b1N0cmluZy5jYWxsKGRhdGEpID09PSAnW29iamVjdCBBcnJheUJ1ZmZlcl0nKSB7XG4gICAgc3RybS5pbnB1dCA9IG5ldyBVaW50OEFycmF5KGRhdGEpO1xuICB9IGVsc2Uge1xuICAgIHN0cm0uaW5wdXQgPSBkYXRhO1xuICB9XG5cbiAgc3RybS5uZXh0X2luID0gMDtcbiAgc3RybS5hdmFpbF9pbiA9IHN0cm0uaW5wdXQubGVuZ3RoO1xuXG4gIGRvIHtcbiAgICBpZiAoc3RybS5hdmFpbF9vdXQgPT09IDApIHtcbiAgICAgIHN0cm0ub3V0cHV0ID0gbmV3IHV0aWxzLkJ1ZjgoY2h1bmtTaXplKTtcbiAgICAgIHN0cm0ubmV4dF9vdXQgPSAwO1xuICAgICAgc3RybS5hdmFpbF9vdXQgPSBjaHVua1NpemU7XG4gICAgfVxuICAgIHN0YXR1cyA9IHpsaWJfZGVmbGF0ZS5kZWZsYXRlKHN0cm0sIF9tb2RlKTsgICAgLyogbm8gYmFkIHJldHVybiB2YWx1ZSAqL1xuXG4gICAgaWYgKHN0YXR1cyAhPT0gWl9TVFJFQU1fRU5EICYmIHN0YXR1cyAhPT0gWl9PSykge1xuICAgICAgdGhpcy5vbkVuZChzdGF0dXMpO1xuICAgICAgdGhpcy5lbmRlZCA9IHRydWU7XG4gICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIGlmIChzdHJtLmF2YWlsX291dCA9PT0gMCB8fCAoc3RybS5hdmFpbF9pbiA9PT0gMCAmJiAoX21vZGUgPT09IFpfRklOSVNIIHx8IF9tb2RlID09PSBaX1NZTkNfRkxVU0gpKSkge1xuICAgICAgaWYgKHRoaXMub3B0aW9ucy50byA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgdGhpcy5vbkRhdGEoc3RyaW5ncy5idWYyYmluc3RyaW5nKHV0aWxzLnNocmlua0J1ZihzdHJtLm91dHB1dCwgc3RybS5uZXh0X291dCkpKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIHRoaXMub25EYXRhKHV0aWxzLnNocmlua0J1ZihzdHJtLm91dHB1dCwgc3RybS5uZXh0X291dCkpO1xuICAgICAgfVxuICAgIH1cbiAgfSB3aGlsZSAoKHN0cm0uYXZhaWxfaW4gPiAwIHx8IHN0cm0uYXZhaWxfb3V0ID09PSAwKSAmJiBzdGF0dXMgIT09IFpfU1RSRUFNX0VORCk7XG5cbiAgLy8gRmluYWxpemUgb24gdGhlIGxhc3QgY2h1bmsuXG4gIGlmIChfbW9kZSA9PT0gWl9GSU5JU0gpIHtcbiAgICBzdGF0dXMgPSB6bGliX2RlZmxhdGUuZGVmbGF0ZUVuZCh0aGlzLnN0cm0pO1xuICAgIHRoaXMub25FbmQoc3RhdHVzKTtcbiAgICB0aGlzLmVuZGVkID0gdHJ1ZTtcbiAgICByZXR1cm4gc3RhdHVzID09PSBaX09LO1xuICB9XG5cbiAgLy8gY2FsbGJhY2sgaW50ZXJpbSByZXN1bHRzIGlmIFpfU1lOQ19GTFVTSC5cbiAgaWYgKF9tb2RlID09PSBaX1NZTkNfRkxVU0gpIHtcbiAgICB0aGlzLm9uRW5kKFpfT0spO1xuICAgIHN0cm0uYXZhaWxfb3V0ID0gMDtcbiAgICByZXR1cm4gdHJ1ZTtcbiAgfVxuXG4gIHJldHVybiB0cnVlO1xufTtcblxuXG4vKipcbiAqIERlZmxhdGUjb25EYXRhKGNodW5rKSAtPiBWb2lkXG4gKiAtIGNodW5rIChVaW50OEFycmF5fEFycmF5fFN0cmluZyk6IG91cHV0IGRhdGEuIFR5cGUgb2YgYXJyYXkgZGVwZW5kc1xuICogICBvbiBqcyBlbmdpbmUgc3VwcG9ydC4gV2hlbiBzdHJpbmcgb3V0cHV0IHJlcXVlc3RlZCwgZWFjaCBjaHVua1xuICogICB3aWxsIGJlIHN0cmluZy5cbiAqXG4gKiBCeSBkZWZhdWx0LCBzdG9yZXMgZGF0YSBibG9ja3MgaW4gYGNodW5rc1tdYCBwcm9wZXJ0eSBhbmQgZ2x1ZVxuICogdGhvc2UgaW4gYG9uRW5kYC4gT3ZlcnJpZGUgdGhpcyBoYW5kbGVyLCBpZiB5b3UgbmVlZCBhbm90aGVyIGJlaGF2aW91ci5cbiAqKi9cbkRlZmxhdGUucHJvdG90eXBlLm9uRGF0YSA9IGZ1bmN0aW9uIChjaHVuaykge1xuICB0aGlzLmNodW5rcy5wdXNoKGNodW5rKTtcbn07XG5cblxuLyoqXG4gKiBEZWZsYXRlI29uRW5kKHN0YXR1cykgLT4gVm9pZFxuICogLSBzdGF0dXMgKE51bWJlcik6IGRlZmxhdGUgc3RhdHVzLiAwIChaX09LKSBvbiBzdWNjZXNzLFxuICogICBvdGhlciBpZiBub3QuXG4gKlxuICogQ2FsbGVkIG9uY2UgYWZ0ZXIgeW91IHRlbGwgZGVmbGF0ZSB0aGF0IHRoZSBpbnB1dCBzdHJlYW0gaXNcbiAqIGNvbXBsZXRlIChaX0ZJTklTSCkgb3Igc2hvdWxkIGJlIGZsdXNoZWQgKFpfU1lOQ19GTFVTSClcbiAqIG9yIGlmIGFuIGVycm9yIGhhcHBlbmVkLiBCeSBkZWZhdWx0IC0gam9pbiBjb2xsZWN0ZWQgY2h1bmtzLFxuICogZnJlZSBtZW1vcnkgYW5kIGZpbGwgYHJlc3VsdHNgIC8gYGVycmAgcHJvcGVydGllcy5cbiAqKi9cbkRlZmxhdGUucHJvdG90eXBlLm9uRW5kID0gZnVuY3Rpb24gKHN0YXR1cykge1xuICAvLyBPbiBzdWNjZXNzIC0gam9pblxuICBpZiAoc3RhdHVzID09PSBaX09LKSB7XG4gICAgaWYgKHRoaXMub3B0aW9ucy50byA9PT0gJ3N0cmluZycpIHtcbiAgICAgIHRoaXMucmVzdWx0ID0gdGhpcy5jaHVua3Muam9pbignJyk7XG4gICAgfSBlbHNlIHtcbiAgICAgIHRoaXMucmVzdWx0ID0gdXRpbHMuZmxhdHRlbkNodW5rcyh0aGlzLmNodW5rcyk7XG4gICAgfVxuICB9XG4gIHRoaXMuY2h1bmtzID0gW107XG4gIHRoaXMuZXJyID0gc3RhdHVzO1xuICB0aGlzLm1zZyA9IHRoaXMuc3RybS5tc2c7XG59O1xuXG5cbi8qKlxuICogZGVmbGF0ZShkYXRhWywgb3B0aW9uc10pIC0+IFVpbnQ4QXJyYXl8QXJyYXl8U3RyaW5nXG4gKiAtIGRhdGEgKFVpbnQ4QXJyYXl8QXJyYXl8U3RyaW5nKTogaW5wdXQgZGF0YSB0byBjb21wcmVzcy5cbiAqIC0gb3B0aW9ucyAoT2JqZWN0KTogemxpYiBkZWZsYXRlIG9wdGlvbnMuXG4gKlxuICogQ29tcHJlc3MgYGRhdGFgIHdpdGggZGVmbGF0ZSBhbGdvcml0aG0gYW5kIGBvcHRpb25zYC5cbiAqXG4gKiBTdXBwb3J0ZWQgb3B0aW9ucyBhcmU6XG4gKlxuICogLSBsZXZlbFxuICogLSB3aW5kb3dCaXRzXG4gKiAtIG1lbUxldmVsXG4gKiAtIHN0cmF0ZWd5XG4gKiAtIGRpY3Rpb25hcnlcbiAqXG4gKiBbaHR0cDovL3psaWIubmV0L21hbnVhbC5odG1sI0FkdmFuY2VkXShodHRwOi8vemxpYi5uZXQvbWFudWFsLmh0bWwjQWR2YW5jZWQpXG4gKiBmb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGVzZS5cbiAqXG4gKiBTdWdhciAob3B0aW9ucyk6XG4gKlxuICogLSBgcmF3YCAoQm9vbGVhbikgLSBzYXkgdGhhdCB3ZSB3b3JrIHdpdGggcmF3IHN0cmVhbSwgaWYgeW91IGRvbid0IHdpc2ggdG8gc3BlY2lmeVxuICogICBuZWdhdGl2ZSB3aW5kb3dCaXRzIGltcGxpY2l0bHkuXG4gKiAtIGB0b2AgKFN0cmluZykgLSBpZiBlcXVhbCB0byAnc3RyaW5nJywgdGhlbiByZXN1bHQgd2lsbCBiZSBcImJpbmFyeSBzdHJpbmdcIlxuICogICAgKGVhY2ggY2hhciBjb2RlIFswLi4yNTVdKVxuICpcbiAqICMjIyMjIEV4YW1wbGU6XG4gKlxuICogYGBgamF2YXNjcmlwdFxuICogdmFyIHBha28gPSByZXF1aXJlKCdwYWtvJylcbiAqICAgLCBkYXRhID0gVWludDhBcnJheShbMSwyLDMsNCw1LDYsNyw4LDldKTtcbiAqXG4gKiBjb25zb2xlLmxvZyhwYWtvLmRlZmxhdGUoZGF0YSkpO1xuICogYGBgXG4gKiovXG5mdW5jdGlvbiBkZWZsYXRlKGlucHV0LCBvcHRpb25zKSB7XG4gIHZhciBkZWZsYXRvciA9IG5ldyBEZWZsYXRlKG9wdGlvbnMpO1xuXG4gIGRlZmxhdG9yLnB1c2goaW5wdXQsIHRydWUpO1xuXG4gIC8vIFRoYXQgd2lsbCBuZXZlciBoYXBwZW5zLCBpZiB5b3UgZG9uJ3QgY2hlYXQgd2l0aCBvcHRpb25zIDopXG4gIGlmIChkZWZsYXRvci5lcnIpIHsgdGhyb3cgZGVmbGF0b3IubXNnOyB9XG5cbiAgcmV0dXJuIGRlZmxhdG9yLnJlc3VsdDtcbn1cblxuXG4vKipcbiAqIGRlZmxhdGVSYXcoZGF0YVssIG9wdGlvbnNdKSAtPiBVaW50OEFycmF5fEFycmF5fFN0cmluZ1xuICogLSBkYXRhIChVaW50OEFycmF5fEFycmF5fFN0cmluZyk6IGlucHV0IGRhdGEgdG8gY29tcHJlc3MuXG4gKiAtIG9wdGlvbnMgKE9iamVjdCk6IHpsaWIgZGVmbGF0ZSBvcHRpb25zLlxuICpcbiAqIFRoZSBzYW1lIGFzIFtbZGVmbGF0ZV1dLCBidXQgY3JlYXRlcyByYXcgZGF0YSwgd2l0aG91dCB3cmFwcGVyXG4gKiAoaGVhZGVyIGFuZCBhZGxlcjMyIGNyYykuXG4gKiovXG5mdW5jdGlvbiBkZWZsYXRlUmF3KGlucHV0LCBvcHRpb25zKSB7XG4gIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICBvcHRpb25zLnJhdyA9IHRydWU7XG4gIHJldHVybiBkZWZsYXRlKGlucHV0LCBvcHRpb25zKTtcbn1cblxuXG4vKipcbiAqIGd6aXAoZGF0YVssIG9wdGlvbnNdKSAtPiBVaW50OEFycmF5fEFycmF5fFN0cmluZ1xuICogLSBkYXRhIChVaW50OEFycmF5fEFycmF5fFN0cmluZyk6IGlucHV0IGRhdGEgdG8gY29tcHJlc3MuXG4gKiAtIG9wdGlvbnMgKE9iamVjdCk6IHpsaWIgZGVmbGF0ZSBvcHRpb25zLlxuICpcbiAqIFRoZSBzYW1lIGFzIFtbZGVmbGF0ZV1dLCBidXQgY3JlYXRlIGd6aXAgd3JhcHBlciBpbnN0ZWFkIG9mXG4gKiBkZWZsYXRlIG9uZS5cbiAqKi9cbmZ1bmN0aW9uIGd6aXAoaW5wdXQsIG9wdGlvbnMpIHtcbiAgb3B0aW9ucyA9IG9wdGlvbnMgfHwge307XG4gIG9wdGlvbnMuZ3ppcCA9IHRydWU7XG4gIHJldHVybiBkZWZsYXRlKGlucHV0LCBvcHRpb25zKTtcbn1cblxuXG5leHBvcnRzLkRlZmxhdGUgPSBEZWZsYXRlO1xuZXhwb3J0cy5kZWZsYXRlID0gZGVmbGF0ZTtcbmV4cG9ydHMuZGVmbGF0ZVJhdyA9IGRlZmxhdGVSYXc7XG5leHBvcnRzLmd6aXAgPSBnemlwO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5cbnZhciB6bGliX2luZmxhdGUgPSByZXF1aXJlKCcuL3psaWIvaW5mbGF0ZScpO1xudmFyIHV0aWxzICAgICAgICA9IHJlcXVpcmUoJy4vdXRpbHMvY29tbW9uJyk7XG52YXIgc3RyaW5ncyAgICAgID0gcmVxdWlyZSgnLi91dGlscy9zdHJpbmdzJyk7XG52YXIgYyAgICAgICAgICAgID0gcmVxdWlyZSgnLi96bGliL2NvbnN0YW50cycpO1xudmFyIG1zZyAgICAgICAgICA9IHJlcXVpcmUoJy4vemxpYi9tZXNzYWdlcycpO1xudmFyIFpTdHJlYW0gICAgICA9IHJlcXVpcmUoJy4vemxpYi96c3RyZWFtJyk7XG52YXIgR1poZWFkZXIgICAgID0gcmVxdWlyZSgnLi96bGliL2d6aGVhZGVyJyk7XG5cbnZhciB0b1N0cmluZyA9IE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmc7XG5cbi8qKlxuICogY2xhc3MgSW5mbGF0ZVxuICpcbiAqIEdlbmVyaWMgSlMtc3R5bGUgd3JhcHBlciBmb3IgemxpYiBjYWxscy4gSWYgeW91IGRvbid0IG5lZWRcbiAqIHN0cmVhbWluZyBiZWhhdmlvdXIgLSB1c2UgbW9yZSBzaW1wbGUgZnVuY3Rpb25zOiBbW2luZmxhdGVdXVxuICogYW5kIFtbaW5mbGF0ZVJhd11dLlxuICoqL1xuXG4vKiBpbnRlcm5hbFxuICogaW5mbGF0ZS5jaHVua3MgLT4gQXJyYXlcbiAqXG4gKiBDaHVua3Mgb2Ygb3V0cHV0IGRhdGEsIGlmIFtbSW5mbGF0ZSNvbkRhdGFdXSBub3Qgb3ZlcnJpZGVuLlxuICoqL1xuXG4vKipcbiAqIEluZmxhdGUucmVzdWx0IC0+IFVpbnQ4QXJyYXl8QXJyYXl8U3RyaW5nXG4gKlxuICogVW5jb21wcmVzc2VkIHJlc3VsdCwgZ2VuZXJhdGVkIGJ5IGRlZmF1bHQgW1tJbmZsYXRlI29uRGF0YV1dXG4gKiBhbmQgW1tJbmZsYXRlI29uRW5kXV0gaGFuZGxlcnMuIEZpbGxlZCBhZnRlciB5b3UgcHVzaCBsYXN0IGNodW5rXG4gKiAoY2FsbCBbW0luZmxhdGUjcHVzaF1dIHdpdGggYFpfRklOSVNIYCAvIGB0cnVlYCBwYXJhbSkgb3IgaWYgeW91XG4gKiBwdXNoIGEgY2h1bmsgd2l0aCBleHBsaWNpdCBmbHVzaCAoY2FsbCBbW0luZmxhdGUjcHVzaF1dIHdpdGhcbiAqIGBaX1NZTkNfRkxVU0hgIHBhcmFtKS5cbiAqKi9cblxuLyoqXG4gKiBJbmZsYXRlLmVyciAtPiBOdW1iZXJcbiAqXG4gKiBFcnJvciBjb2RlIGFmdGVyIGluZmxhdGUgZmluaXNoZWQuIDAgKFpfT0spIG9uIHN1Y2Nlc3MuXG4gKiBTaG91bGQgYmUgY2hlY2tlZCBpZiBicm9rZW4gZGF0YSBwb3NzaWJsZS5cbiAqKi9cblxuLyoqXG4gKiBJbmZsYXRlLm1zZyAtPiBTdHJpbmdcbiAqXG4gKiBFcnJvciBtZXNzYWdlLCBpZiBbW0luZmxhdGUuZXJyXV0gIT0gMFxuICoqL1xuXG5cbi8qKlxuICogbmV3IEluZmxhdGUob3B0aW9ucylcbiAqIC0gb3B0aW9ucyAoT2JqZWN0KTogemxpYiBpbmZsYXRlIG9wdGlvbnMuXG4gKlxuICogQ3JlYXRlcyBuZXcgaW5mbGF0b3IgaW5zdGFuY2Ugd2l0aCBzcGVjaWZpZWQgcGFyYW1zLiBUaHJvd3MgZXhjZXB0aW9uXG4gKiBvbiBiYWQgcGFyYW1zLiBTdXBwb3J0ZWQgb3B0aW9uczpcbiAqXG4gKiAtIGB3aW5kb3dCaXRzYFxuICogLSBgZGljdGlvbmFyeWBcbiAqXG4gKiBbaHR0cDovL3psaWIubmV0L21hbnVhbC5odG1sI0FkdmFuY2VkXShodHRwOi8vemxpYi5uZXQvbWFudWFsLmh0bWwjQWR2YW5jZWQpXG4gKiBmb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiB0aGVzZS5cbiAqXG4gKiBBZGRpdGlvbmFsIG9wdGlvbnMsIGZvciBpbnRlcm5hbCBuZWVkczpcbiAqXG4gKiAtIGBjaHVua1NpemVgIC0gc2l6ZSBvZiBnZW5lcmF0ZWQgZGF0YSBjaHVua3MgKDE2SyBieSBkZWZhdWx0KVxuICogLSBgcmF3YCAoQm9vbGVhbikgLSBkbyByYXcgaW5mbGF0ZVxuICogLSBgdG9gIChTdHJpbmcpIC0gaWYgZXF1YWwgdG8gJ3N0cmluZycsIHRoZW4gcmVzdWx0IHdpbGwgYmUgY29udmVydGVkXG4gKiAgIGZyb20gdXRmOCB0byB1dGYxNiAoamF2YXNjcmlwdCkgc3RyaW5nLiBXaGVuIHN0cmluZyBvdXRwdXQgcmVxdWVzdGVkLFxuICogICBjaHVuayBsZW5ndGggY2FuIGRpZmZlciBmcm9tIGBjaHVua1NpemVgLCBkZXBlbmRpbmcgb24gY29udGVudC5cbiAqXG4gKiBCeSBkZWZhdWx0LCB3aGVuIG5vIG9wdGlvbnMgc2V0LCBhdXRvZGV0ZWN0IGRlZmxhdGUvZ3ppcCBkYXRhIGZvcm1hdCB2aWFcbiAqIHdyYXBwZXIgaGVhZGVyLlxuICpcbiAqICMjIyMjIEV4YW1wbGU6XG4gKlxuICogYGBgamF2YXNjcmlwdFxuICogdmFyIHBha28gPSByZXF1aXJlKCdwYWtvJylcbiAqICAgLCBjaHVuazEgPSBVaW50OEFycmF5KFsxLDIsMyw0LDUsNiw3LDgsOV0pXG4gKiAgICwgY2h1bmsyID0gVWludDhBcnJheShbMTAsMTEsMTIsMTMsMTQsMTUsMTYsMTcsMTgsMTldKTtcbiAqXG4gKiB2YXIgaW5mbGF0ZSA9IG5ldyBwYWtvLkluZmxhdGUoeyBsZXZlbDogM30pO1xuICpcbiAqIGluZmxhdGUucHVzaChjaHVuazEsIGZhbHNlKTtcbiAqIGluZmxhdGUucHVzaChjaHVuazIsIHRydWUpOyAgLy8gdHJ1ZSAtPiBsYXN0IGNodW5rXG4gKlxuICogaWYgKGluZmxhdGUuZXJyKSB7IHRocm93IG5ldyBFcnJvcihpbmZsYXRlLmVycik7IH1cbiAqXG4gKiBjb25zb2xlLmxvZyhpbmZsYXRlLnJlc3VsdCk7XG4gKiBgYGBcbiAqKi9cbmZ1bmN0aW9uIEluZmxhdGUob3B0aW9ucykge1xuICBpZiAoISh0aGlzIGluc3RhbmNlb2YgSW5mbGF0ZSkpIHJldHVybiBuZXcgSW5mbGF0ZShvcHRpb25zKTtcblxuICB0aGlzLm9wdGlvbnMgPSB1dGlscy5hc3NpZ24oe1xuICAgIGNodW5rU2l6ZTogMTYzODQsXG4gICAgd2luZG93Qml0czogMCxcbiAgICB0bzogJydcbiAgfSwgb3B0aW9ucyB8fCB7fSk7XG5cbiAgdmFyIG9wdCA9IHRoaXMub3B0aW9ucztcblxuICAvLyBGb3JjZSB3aW5kb3cgc2l6ZSBmb3IgYHJhd2AgZGF0YSwgaWYgbm90IHNldCBkaXJlY3RseSxcbiAgLy8gYmVjYXVzZSB3ZSBoYXZlIG5vIGhlYWRlciBmb3IgYXV0b2RldGVjdC5cbiAgaWYgKG9wdC5yYXcgJiYgKG9wdC53aW5kb3dCaXRzID49IDApICYmIChvcHQud2luZG93Qml0cyA8IDE2KSkge1xuICAgIG9wdC53aW5kb3dCaXRzID0gLW9wdC53aW5kb3dCaXRzO1xuICAgIGlmIChvcHQud2luZG93Qml0cyA9PT0gMCkgeyBvcHQud2luZG93Qml0cyA9IC0xNTsgfVxuICB9XG5cbiAgLy8gSWYgYHdpbmRvd0JpdHNgIG5vdCBkZWZpbmVkIChhbmQgbW9kZSBub3QgcmF3KSAtIHNldCBhdXRvZGV0ZWN0IGZsYWcgZm9yIGd6aXAvZGVmbGF0ZVxuICBpZiAoKG9wdC53aW5kb3dCaXRzID49IDApICYmIChvcHQud2luZG93Qml0cyA8IDE2KSAmJlxuICAgICAgIShvcHRpb25zICYmIG9wdGlvbnMud2luZG93Qml0cykpIHtcbiAgICBvcHQud2luZG93Qml0cyArPSAzMjtcbiAgfVxuXG4gIC8vIEd6aXAgaGVhZGVyIGhhcyBubyBpbmZvIGFib3V0IHdpbmRvd3Mgc2l6ZSwgd2UgY2FuIGRvIGF1dG9kZXRlY3Qgb25seVxuICAvLyBmb3IgZGVmbGF0ZS4gU28sIGlmIHdpbmRvdyBzaXplIG5vdCBzZXQsIGZvcmNlIGl0IHRvIG1heCB3aGVuIGd6aXAgcG9zc2libGVcbiAgaWYgKChvcHQud2luZG93Qml0cyA+IDE1KSAmJiAob3B0LndpbmRvd0JpdHMgPCA0OCkpIHtcbiAgICAvLyBiaXQgMyAoMTYpIC0+IGd6aXBwZWQgZGF0YVxuICAgIC8vIGJpdCA0ICgzMikgLT4gYXV0b2RldGVjdCBnemlwL2RlZmxhdGVcbiAgICBpZiAoKG9wdC53aW5kb3dCaXRzICYgMTUpID09PSAwKSB7XG4gICAgICBvcHQud2luZG93Qml0cyB8PSAxNTtcbiAgICB9XG4gIH1cblxuICB0aGlzLmVyciAgICA9IDA7ICAgICAgLy8gZXJyb3IgY29kZSwgaWYgaGFwcGVucyAoMCA9IFpfT0spXG4gIHRoaXMubXNnICAgID0gJyc7ICAgICAvLyBlcnJvciBtZXNzYWdlXG4gIHRoaXMuZW5kZWQgID0gZmFsc2U7ICAvLyB1c2VkIHRvIGF2b2lkIG11bHRpcGxlIG9uRW5kKCkgY2FsbHNcbiAgdGhpcy5jaHVua3MgPSBbXTsgICAgIC8vIGNodW5rcyBvZiBjb21wcmVzc2VkIGRhdGFcblxuICB0aGlzLnN0cm0gICA9IG5ldyBaU3RyZWFtKCk7XG4gIHRoaXMuc3RybS5hdmFpbF9vdXQgPSAwO1xuXG4gIHZhciBzdGF0dXMgID0gemxpYl9pbmZsYXRlLmluZmxhdGVJbml0MihcbiAgICB0aGlzLnN0cm0sXG4gICAgb3B0LndpbmRvd0JpdHNcbiAgKTtcblxuICBpZiAoc3RhdHVzICE9PSBjLlpfT0spIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IobXNnW3N0YXR1c10pO1xuICB9XG5cbiAgdGhpcy5oZWFkZXIgPSBuZXcgR1poZWFkZXIoKTtcblxuICB6bGliX2luZmxhdGUuaW5mbGF0ZUdldEhlYWRlcih0aGlzLnN0cm0sIHRoaXMuaGVhZGVyKTtcbn1cblxuLyoqXG4gKiBJbmZsYXRlI3B1c2goZGF0YVssIG1vZGVdKSAtPiBCb29sZWFuXG4gKiAtIGRhdGEgKFVpbnQ4QXJyYXl8QXJyYXl8QXJyYXlCdWZmZXJ8U3RyaW5nKTogaW5wdXQgZGF0YVxuICogLSBtb2RlIChOdW1iZXJ8Qm9vbGVhbik6IDAuLjYgZm9yIGNvcnJlc3BvbmRpbmcgWl9OT19GTFVTSC4uWl9UUkVFIG1vZGVzLlxuICogICBTZWUgY29uc3RhbnRzLiBTa2lwcGVkIG9yIGBmYWxzZWAgbWVhbnMgWl9OT19GTFVTSCwgYHRydWVgIG1lYW5zaCBaX0ZJTklTSC5cbiAqXG4gKiBTZW5kcyBpbnB1dCBkYXRhIHRvIGluZmxhdGUgcGlwZSwgZ2VuZXJhdGluZyBbW0luZmxhdGUjb25EYXRhXV0gY2FsbHMgd2l0aFxuICogbmV3IG91dHB1dCBjaHVua3MuIFJldHVybnMgYHRydWVgIG9uIHN1Y2Nlc3MuIFRoZSBsYXN0IGRhdGEgYmxvY2sgbXVzdCBoYXZlXG4gKiBtb2RlIFpfRklOSVNIIChvciBgdHJ1ZWApLiBUaGF0IHdpbGwgZmx1c2ggaW50ZXJuYWwgcGVuZGluZyBidWZmZXJzIGFuZCBjYWxsXG4gKiBbW0luZmxhdGUjb25FbmRdXS4gRm9yIGludGVyaW0gZXhwbGljaXQgZmx1c2hlcyAod2l0aG91dCBlbmRpbmcgdGhlIHN0cmVhbSkgeW91XG4gKiBjYW4gdXNlIG1vZGUgWl9TWU5DX0ZMVVNILCBrZWVwaW5nIHRoZSBkZWNvbXByZXNzaW9uIGNvbnRleHQuXG4gKlxuICogT24gZmFpbCBjYWxsIFtbSW5mbGF0ZSNvbkVuZF1dIHdpdGggZXJyb3IgY29kZSBhbmQgcmV0dXJuIGZhbHNlLlxuICpcbiAqIFdlIHN0cm9uZ2x5IHJlY29tbWVuZCB0byB1c2UgYFVpbnQ4QXJyYXlgIG9uIGlucHV0IGZvciBiZXN0IHNwZWVkIChvdXRwdXRcbiAqIGZvcm1hdCBpcyBkZXRlY3RlZCBhdXRvbWF0aWNhbGx5KS4gQWxzbywgZG9uJ3Qgc2tpcCBsYXN0IHBhcmFtIGFuZCBhbHdheXNcbiAqIHVzZSB0aGUgc2FtZSB0eXBlIGluIHlvdXIgY29kZSAoYm9vbGVhbiBvciBudW1iZXIpLiBUaGF0IHdpbGwgaW1wcm92ZSBKUyBzcGVlZC5cbiAqXG4gKiBGb3IgcmVndWxhciBgQXJyYXlgLXMgbWFrZSBzdXJlIGFsbCBlbGVtZW50cyBhcmUgWzAuLjI1NV0uXG4gKlxuICogIyMjIyMgRXhhbXBsZVxuICpcbiAqIGBgYGphdmFzY3JpcHRcbiAqIHB1c2goY2h1bmssIGZhbHNlKTsgLy8gcHVzaCBvbmUgb2YgZGF0YSBjaHVua3NcbiAqIC4uLlxuICogcHVzaChjaHVuaywgdHJ1ZSk7ICAvLyBwdXNoIGxhc3QgY2h1bmtcbiAqIGBgYFxuICoqL1xuSW5mbGF0ZS5wcm90b3R5cGUucHVzaCA9IGZ1bmN0aW9uIChkYXRhLCBtb2RlKSB7XG4gIHZhciBzdHJtID0gdGhpcy5zdHJtO1xuICB2YXIgY2h1bmtTaXplID0gdGhpcy5vcHRpb25zLmNodW5rU2l6ZTtcbiAgdmFyIGRpY3Rpb25hcnkgPSB0aGlzLm9wdGlvbnMuZGljdGlvbmFyeTtcbiAgdmFyIHN0YXR1cywgX21vZGU7XG4gIHZhciBuZXh0X291dF91dGY4LCB0YWlsLCB1dGY4c3RyO1xuICB2YXIgZGljdDtcblxuICAvLyBGbGFnIHRvIHByb3Blcmx5IHByb2Nlc3MgWl9CVUZfRVJST1Igb24gdGVzdGluZyBpbmZsYXRlIGNhbGxcbiAgLy8gd2hlbiB3ZSBjaGVjayB0aGF0IGFsbCBvdXRwdXQgZGF0YSB3YXMgZmx1c2hlZC5cbiAgdmFyIGFsbG93QnVmRXJyb3IgPSBmYWxzZTtcblxuICBpZiAodGhpcy5lbmRlZCkgeyByZXR1cm4gZmFsc2U7IH1cbiAgX21vZGUgPSAobW9kZSA9PT0gfn5tb2RlKSA/IG1vZGUgOiAoKG1vZGUgPT09IHRydWUpID8gYy5aX0ZJTklTSCA6IGMuWl9OT19GTFVTSCk7XG5cbiAgLy8gQ29udmVydCBkYXRhIGlmIG5lZWRlZFxuICBpZiAodHlwZW9mIGRhdGEgPT09ICdzdHJpbmcnKSB7XG4gICAgLy8gT25seSBiaW5hcnkgc3RyaW5ncyBjYW4gYmUgZGVjb21wcmVzc2VkIG9uIHByYWN0aWNlXG4gICAgc3RybS5pbnB1dCA9IHN0cmluZ3MuYmluc3RyaW5nMmJ1ZihkYXRhKTtcbiAgfSBlbHNlIGlmICh0b1N0cmluZy5jYWxsKGRhdGEpID09PSAnW29iamVjdCBBcnJheUJ1ZmZlcl0nKSB7XG4gICAgc3RybS5pbnB1dCA9IG5ldyBVaW50OEFycmF5KGRhdGEpO1xuICB9IGVsc2Uge1xuICAgIHN0cm0uaW5wdXQgPSBkYXRhO1xuICB9XG5cbiAgc3RybS5uZXh0X2luID0gMDtcbiAgc3RybS5hdmFpbF9pbiA9IHN0cm0uaW5wdXQubGVuZ3RoO1xuXG4gIGRvIHtcbiAgICBpZiAoc3RybS5hdmFpbF9vdXQgPT09IDApIHtcbiAgICAgIHN0cm0ub3V0cHV0ID0gbmV3IHV0aWxzLkJ1ZjgoY2h1bmtTaXplKTtcbiAgICAgIHN0cm0ubmV4dF9vdXQgPSAwO1xuICAgICAgc3RybS5hdmFpbF9vdXQgPSBjaHVua1NpemU7XG4gICAgfVxuXG4gICAgc3RhdHVzID0gemxpYl9pbmZsYXRlLmluZmxhdGUoc3RybSwgYy5aX05PX0ZMVVNIKTsgICAgLyogbm8gYmFkIHJldHVybiB2YWx1ZSAqL1xuXG4gICAgaWYgKHN0YXR1cyA9PT0gYy5aX05FRURfRElDVCAmJiBkaWN0aW9uYXJ5KSB7XG4gICAgICAvLyBDb252ZXJ0IGRhdGEgaWYgbmVlZGVkXG4gICAgICBpZiAodHlwZW9mIGRpY3Rpb25hcnkgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIGRpY3QgPSBzdHJpbmdzLnN0cmluZzJidWYoZGljdGlvbmFyeSk7XG4gICAgICB9IGVsc2UgaWYgKHRvU3RyaW5nLmNhbGwoZGljdGlvbmFyeSkgPT09ICdbb2JqZWN0IEFycmF5QnVmZmVyXScpIHtcbiAgICAgICAgZGljdCA9IG5ldyBVaW50OEFycmF5KGRpY3Rpb25hcnkpO1xuICAgICAgfSBlbHNlIHtcbiAgICAgICAgZGljdCA9IGRpY3Rpb25hcnk7XG4gICAgICB9XG5cbiAgICAgIHN0YXR1cyA9IHpsaWJfaW5mbGF0ZS5pbmZsYXRlU2V0RGljdGlvbmFyeSh0aGlzLnN0cm0sIGRpY3QpO1xuXG4gICAgfVxuXG4gICAgaWYgKHN0YXR1cyA9PT0gYy5aX0JVRl9FUlJPUiAmJiBhbGxvd0J1ZkVycm9yID09PSB0cnVlKSB7XG4gICAgICBzdGF0dXMgPSBjLlpfT0s7XG4gICAgICBhbGxvd0J1ZkVycm9yID0gZmFsc2U7XG4gICAgfVxuXG4gICAgaWYgKHN0YXR1cyAhPT0gYy5aX1NUUkVBTV9FTkQgJiYgc3RhdHVzICE9PSBjLlpfT0spIHtcbiAgICAgIHRoaXMub25FbmQoc3RhdHVzKTtcbiAgICAgIHRoaXMuZW5kZWQgPSB0cnVlO1xuICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIGlmIChzdHJtLm5leHRfb3V0KSB7XG4gICAgICBpZiAoc3RybS5hdmFpbF9vdXQgPT09IDAgfHwgc3RhdHVzID09PSBjLlpfU1RSRUFNX0VORCB8fCAoc3RybS5hdmFpbF9pbiA9PT0gMCAmJiAoX21vZGUgPT09IGMuWl9GSU5JU0ggfHwgX21vZGUgPT09IGMuWl9TWU5DX0ZMVVNIKSkpIHtcblxuICAgICAgICBpZiAodGhpcy5vcHRpb25zLnRvID09PSAnc3RyaW5nJykge1xuXG4gICAgICAgICAgbmV4dF9vdXRfdXRmOCA9IHN0cmluZ3MudXRmOGJvcmRlcihzdHJtLm91dHB1dCwgc3RybS5uZXh0X291dCk7XG5cbiAgICAgICAgICB0YWlsID0gc3RybS5uZXh0X291dCAtIG5leHRfb3V0X3V0Zjg7XG4gICAgICAgICAgdXRmOHN0ciA9IHN0cmluZ3MuYnVmMnN0cmluZyhzdHJtLm91dHB1dCwgbmV4dF9vdXRfdXRmOCk7XG5cbiAgICAgICAgICAvLyBtb3ZlIHRhaWxcbiAgICAgICAgICBzdHJtLm5leHRfb3V0ID0gdGFpbDtcbiAgICAgICAgICBzdHJtLmF2YWlsX291dCA9IGNodW5rU2l6ZSAtIHRhaWw7XG4gICAgICAgICAgaWYgKHRhaWwpIHsgdXRpbHMuYXJyYXlTZXQoc3RybS5vdXRwdXQsIHN0cm0ub3V0cHV0LCBuZXh0X291dF91dGY4LCB0YWlsLCAwKTsgfVxuXG4gICAgICAgICAgdGhpcy5vbkRhdGEodXRmOHN0cik7XG5cbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICB0aGlzLm9uRGF0YSh1dGlscy5zaHJpbmtCdWYoc3RybS5vdXRwdXQsIHN0cm0ubmV4dF9vdXQpKTtcbiAgICAgICAgfVxuICAgICAgfVxuICAgIH1cblxuICAgIC8vIFdoZW4gbm8gbW9yZSBpbnB1dCBkYXRhLCB3ZSBzaG91bGQgY2hlY2sgdGhhdCBpbnRlcm5hbCBpbmZsYXRlIGJ1ZmZlcnNcbiAgICAvLyBhcmUgZmx1c2hlZC4gVGhlIG9ubHkgd2F5IHRvIGRvIGl0IHdoZW4gYXZhaWxfb3V0ID0gMCAtIHJ1biBvbmUgbW9yZVxuICAgIC8vIGluZmxhdGUgcGFzcy4gQnV0IGlmIG91dHB1dCBkYXRhIG5vdCBleGlzdHMsIGluZmxhdGUgcmV0dXJuIFpfQlVGX0VSUk9SLlxuICAgIC8vIEhlcmUgd2Ugc2V0IGZsYWcgdG8gcHJvY2VzcyB0aGlzIGVycm9yIHByb3Blcmx5LlxuICAgIC8vXG4gICAgLy8gTk9URS4gRGVmbGF0ZSBkb2VzIG5vdCByZXR1cm4gZXJyb3IgaW4gdGhpcyBjYXNlIGFuZCBkb2VzIG5vdCBuZWVkcyBzdWNoXG4gICAgLy8gbG9naWMuXG4gICAgaWYgKHN0cm0uYXZhaWxfaW4gPT09IDAgJiYgc3RybS5hdmFpbF9vdXQgPT09IDApIHtcbiAgICAgIGFsbG93QnVmRXJyb3IgPSB0cnVlO1xuICAgIH1cblxuICB9IHdoaWxlICgoc3RybS5hdmFpbF9pbiA+IDAgfHwgc3RybS5hdmFpbF9vdXQgPT09IDApICYmIHN0YXR1cyAhPT0gYy5aX1NUUkVBTV9FTkQpO1xuXG4gIGlmIChzdGF0dXMgPT09IGMuWl9TVFJFQU1fRU5EKSB7XG4gICAgX21vZGUgPSBjLlpfRklOSVNIO1xuICB9XG5cbiAgLy8gRmluYWxpemUgb24gdGhlIGxhc3QgY2h1bmsuXG4gIGlmIChfbW9kZSA9PT0gYy5aX0ZJTklTSCkge1xuICAgIHN0YXR1cyA9IHpsaWJfaW5mbGF0ZS5pbmZsYXRlRW5kKHRoaXMuc3RybSk7XG4gICAgdGhpcy5vbkVuZChzdGF0dXMpO1xuICAgIHRoaXMuZW5kZWQgPSB0cnVlO1xuICAgIHJldHVybiBzdGF0dXMgPT09IGMuWl9PSztcbiAgfVxuXG4gIC8vIGNhbGxiYWNrIGludGVyaW0gcmVzdWx0cyBpZiBaX1NZTkNfRkxVU0guXG4gIGlmIChfbW9kZSA9PT0gYy5aX1NZTkNfRkxVU0gpIHtcbiAgICB0aGlzLm9uRW5kKGMuWl9PSyk7XG4gICAgc3RybS5hdmFpbF9vdXQgPSAwO1xuICAgIHJldHVybiB0cnVlO1xuICB9XG5cbiAgcmV0dXJuIHRydWU7XG59O1xuXG5cbi8qKlxuICogSW5mbGF0ZSNvbkRhdGEoY2h1bmspIC0+IFZvaWRcbiAqIC0gY2h1bmsgKFVpbnQ4QXJyYXl8QXJyYXl8U3RyaW5nKTogb3VwdXQgZGF0YS4gVHlwZSBvZiBhcnJheSBkZXBlbmRzXG4gKiAgIG9uIGpzIGVuZ2luZSBzdXBwb3J0LiBXaGVuIHN0cmluZyBvdXRwdXQgcmVxdWVzdGVkLCBlYWNoIGNodW5rXG4gKiAgIHdpbGwgYmUgc3RyaW5nLlxuICpcbiAqIEJ5IGRlZmF1bHQsIHN0b3JlcyBkYXRhIGJsb2NrcyBpbiBgY2h1bmtzW11gIHByb3BlcnR5IGFuZCBnbHVlXG4gKiB0aG9zZSBpbiBgb25FbmRgLiBPdmVycmlkZSB0aGlzIGhhbmRsZXIsIGlmIHlvdSBuZWVkIGFub3RoZXIgYmVoYXZpb3VyLlxuICoqL1xuSW5mbGF0ZS5wcm90b3R5cGUub25EYXRhID0gZnVuY3Rpb24gKGNodW5rKSB7XG4gIHRoaXMuY2h1bmtzLnB1c2goY2h1bmspO1xufTtcblxuXG4vKipcbiAqIEluZmxhdGUjb25FbmQoc3RhdHVzKSAtPiBWb2lkXG4gKiAtIHN0YXR1cyAoTnVtYmVyKTogaW5mbGF0ZSBzdGF0dXMuIDAgKFpfT0spIG9uIHN1Y2Nlc3MsXG4gKiAgIG90aGVyIGlmIG5vdC5cbiAqXG4gKiBDYWxsZWQgZWl0aGVyIGFmdGVyIHlvdSB0ZWxsIGluZmxhdGUgdGhhdCB0aGUgaW5wdXQgc3RyZWFtIGlzXG4gKiBjb21wbGV0ZSAoWl9GSU5JU0gpIG9yIHNob3VsZCBiZSBmbHVzaGVkIChaX1NZTkNfRkxVU0gpXG4gKiBvciBpZiBhbiBlcnJvciBoYXBwZW5lZC4gQnkgZGVmYXVsdCAtIGpvaW4gY29sbGVjdGVkIGNodW5rcyxcbiAqIGZyZWUgbWVtb3J5IGFuZCBmaWxsIGByZXN1bHRzYCAvIGBlcnJgIHByb3BlcnRpZXMuXG4gKiovXG5JbmZsYXRlLnByb3RvdHlwZS5vbkVuZCA9IGZ1bmN0aW9uIChzdGF0dXMpIHtcbiAgLy8gT24gc3VjY2VzcyAtIGpvaW5cbiAgaWYgKHN0YXR1cyA9PT0gYy5aX09LKSB7XG4gICAgaWYgKHRoaXMub3B0aW9ucy50byA9PT0gJ3N0cmluZycpIHtcbiAgICAgIC8vIEdsdWUgJiBjb252ZXJ0IGhlcmUsIHVudGlsIHdlIHRlYWNoIHBha28gdG8gc2VuZFxuICAgICAgLy8gdXRmOCBhbGxpZ25lZCBzdHJpbmdzIHRvIG9uRGF0YVxuICAgICAgdGhpcy5yZXN1bHQgPSB0aGlzLmNodW5rcy5qb2luKCcnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgdGhpcy5yZXN1bHQgPSB1dGlscy5mbGF0dGVuQ2h1bmtzKHRoaXMuY2h1bmtzKTtcbiAgICB9XG4gIH1cbiAgdGhpcy5jaHVua3MgPSBbXTtcbiAgdGhpcy5lcnIgPSBzdGF0dXM7XG4gIHRoaXMubXNnID0gdGhpcy5zdHJtLm1zZztcbn07XG5cblxuLyoqXG4gKiBpbmZsYXRlKGRhdGFbLCBvcHRpb25zXSkgLT4gVWludDhBcnJheXxBcnJheXxTdHJpbmdcbiAqIC0gZGF0YSAoVWludDhBcnJheXxBcnJheXxTdHJpbmcpOiBpbnB1dCBkYXRhIHRvIGRlY29tcHJlc3MuXG4gKiAtIG9wdGlvbnMgKE9iamVjdCk6IHpsaWIgaW5mbGF0ZSBvcHRpb25zLlxuICpcbiAqIERlY29tcHJlc3MgYGRhdGFgIHdpdGggaW5mbGF0ZS91bmd6aXAgYW5kIGBvcHRpb25zYC4gQXV0b2RldGVjdFxuICogZm9ybWF0IHZpYSB3cmFwcGVyIGhlYWRlciBieSBkZWZhdWx0LiBUaGF0J3Mgd2h5IHdlIGRvbid0IHByb3ZpZGVcbiAqIHNlcGFyYXRlIGB1bmd6aXBgIG1ldGhvZC5cbiAqXG4gKiBTdXBwb3J0ZWQgb3B0aW9ucyBhcmU6XG4gKlxuICogLSB3aW5kb3dCaXRzXG4gKlxuICogW2h0dHA6Ly96bGliLm5ldC9tYW51YWwuaHRtbCNBZHZhbmNlZF0oaHR0cDovL3psaWIubmV0L21hbnVhbC5odG1sI0FkdmFuY2VkKVxuICogZm9yIG1vcmUgaW5mb3JtYXRpb24uXG4gKlxuICogU3VnYXIgKG9wdGlvbnMpOlxuICpcbiAqIC0gYHJhd2AgKEJvb2xlYW4pIC0gc2F5IHRoYXQgd2Ugd29yayB3aXRoIHJhdyBzdHJlYW0sIGlmIHlvdSBkb24ndCB3aXNoIHRvIHNwZWNpZnlcbiAqICAgbmVnYXRpdmUgd2luZG93Qml0cyBpbXBsaWNpdGx5LlxuICogLSBgdG9gIChTdHJpbmcpIC0gaWYgZXF1YWwgdG8gJ3N0cmluZycsIHRoZW4gcmVzdWx0IHdpbGwgYmUgY29udmVydGVkXG4gKiAgIGZyb20gdXRmOCB0byB1dGYxNiAoamF2YXNjcmlwdCkgc3RyaW5nLiBXaGVuIHN0cmluZyBvdXRwdXQgcmVxdWVzdGVkLFxuICogICBjaHVuayBsZW5ndGggY2FuIGRpZmZlciBmcm9tIGBjaHVua1NpemVgLCBkZXBlbmRpbmcgb24gY29udGVudC5cbiAqXG4gKlxuICogIyMjIyMgRXhhbXBsZTpcbiAqXG4gKiBgYGBqYXZhc2NyaXB0XG4gKiB2YXIgcGFrbyA9IHJlcXVpcmUoJ3Bha28nKVxuICogICAsIGlucHV0ID0gcGFrby5kZWZsYXRlKFsxLDIsMyw0LDUsNiw3LDgsOV0pXG4gKiAgICwgb3V0cHV0O1xuICpcbiAqIHRyeSB7XG4gKiAgIG91dHB1dCA9IHBha28uaW5mbGF0ZShpbnB1dCk7XG4gKiB9IGNhdGNoIChlcnIpXG4gKiAgIGNvbnNvbGUubG9nKGVycik7XG4gKiB9XG4gKiBgYGBcbiAqKi9cbmZ1bmN0aW9uIGluZmxhdGUoaW5wdXQsIG9wdGlvbnMpIHtcbiAgdmFyIGluZmxhdG9yID0gbmV3IEluZmxhdGUob3B0aW9ucyk7XG5cbiAgaW5mbGF0b3IucHVzaChpbnB1dCwgdHJ1ZSk7XG5cbiAgLy8gVGhhdCB3aWxsIG5ldmVyIGhhcHBlbnMsIGlmIHlvdSBkb24ndCBjaGVhdCB3aXRoIG9wdGlvbnMgOilcbiAgaWYgKGluZmxhdG9yLmVycikgeyB0aHJvdyBpbmZsYXRvci5tc2c7IH1cblxuICByZXR1cm4gaW5mbGF0b3IucmVzdWx0O1xufVxuXG5cbi8qKlxuICogaW5mbGF0ZVJhdyhkYXRhWywgb3B0aW9uc10pIC0+IFVpbnQ4QXJyYXl8QXJyYXl8U3RyaW5nXG4gKiAtIGRhdGEgKFVpbnQ4QXJyYXl8QXJyYXl8U3RyaW5nKTogaW5wdXQgZGF0YSB0byBkZWNvbXByZXNzLlxuICogLSBvcHRpb25zIChPYmplY3QpOiB6bGliIGluZmxhdGUgb3B0aW9ucy5cbiAqXG4gKiBUaGUgc2FtZSBhcyBbW2luZmxhdGVdXSwgYnV0IGNyZWF0ZXMgcmF3IGRhdGEsIHdpdGhvdXQgd3JhcHBlclxuICogKGhlYWRlciBhbmQgYWRsZXIzMiBjcmMpLlxuICoqL1xuZnVuY3Rpb24gaW5mbGF0ZVJhdyhpbnB1dCwgb3B0aW9ucykge1xuICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgb3B0aW9ucy5yYXcgPSB0cnVlO1xuICByZXR1cm4gaW5mbGF0ZShpbnB1dCwgb3B0aW9ucyk7XG59XG5cblxuLyoqXG4gKiB1bmd6aXAoZGF0YVssIG9wdGlvbnNdKSAtPiBVaW50OEFycmF5fEFycmF5fFN0cmluZ1xuICogLSBkYXRhIChVaW50OEFycmF5fEFycmF5fFN0cmluZyk6IGlucHV0IGRhdGEgdG8gZGVjb21wcmVzcy5cbiAqIC0gb3B0aW9ucyAoT2JqZWN0KTogemxpYiBpbmZsYXRlIG9wdGlvbnMuXG4gKlxuICogSnVzdCBzaG9ydGN1dCB0byBbW2luZmxhdGVdXSwgYmVjYXVzZSBpdCBhdXRvZGV0ZWN0cyBmb3JtYXRcbiAqIGJ5IGhlYWRlci5jb250ZW50LiBEb25lIGZvciBjb252ZW5pZW5jZS5cbiAqKi9cblxuXG5leHBvcnRzLkluZmxhdGUgPSBJbmZsYXRlO1xuZXhwb3J0cy5pbmZsYXRlID0gaW5mbGF0ZTtcbmV4cG9ydHMuaW5mbGF0ZVJhdyA9IGluZmxhdGVSYXc7XG5leHBvcnRzLnVuZ3ppcCAgPSBpbmZsYXRlO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5cbnZhciBUWVBFRF9PSyA9ICAodHlwZW9mIFVpbnQ4QXJyYXkgIT09ICd1bmRlZmluZWQnKSAmJlxuICAgICAgICAgICAgICAgICh0eXBlb2YgVWludDE2QXJyYXkgIT09ICd1bmRlZmluZWQnKSAmJlxuICAgICAgICAgICAgICAgICh0eXBlb2YgSW50MzJBcnJheSAhPT0gJ3VuZGVmaW5lZCcpO1xuXG5cbmV4cG9ydHMuYXNzaWduID0gZnVuY3Rpb24gKG9iaiAvKmZyb20xLCBmcm9tMiwgZnJvbTMsIC4uLiovKSB7XG4gIHZhciBzb3VyY2VzID0gQXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKTtcbiAgd2hpbGUgKHNvdXJjZXMubGVuZ3RoKSB7XG4gICAgdmFyIHNvdXJjZSA9IHNvdXJjZXMuc2hpZnQoKTtcbiAgICBpZiAoIXNvdXJjZSkgeyBjb250aW51ZTsgfVxuXG4gICAgaWYgKHR5cGVvZiBzb3VyY2UgIT09ICdvYmplY3QnKSB7XG4gICAgICB0aHJvdyBuZXcgVHlwZUVycm9yKHNvdXJjZSArICdtdXN0IGJlIG5vbi1vYmplY3QnKTtcbiAgICB9XG5cbiAgICBmb3IgKHZhciBwIGluIHNvdXJjZSkge1xuICAgICAgaWYgKHNvdXJjZS5oYXNPd25Qcm9wZXJ0eShwKSkge1xuICAgICAgICBvYmpbcF0gPSBzb3VyY2VbcF07XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG9iajtcbn07XG5cblxuLy8gcmVkdWNlIGJ1ZmZlciBzaXplLCBhdm9pZGluZyBtZW0gY29weVxuZXhwb3J0cy5zaHJpbmtCdWYgPSBmdW5jdGlvbiAoYnVmLCBzaXplKSB7XG4gIGlmIChidWYubGVuZ3RoID09PSBzaXplKSB7IHJldHVybiBidWY7IH1cbiAgaWYgKGJ1Zi5zdWJhcnJheSkgeyByZXR1cm4gYnVmLnN1YmFycmF5KDAsIHNpemUpOyB9XG4gIGJ1Zi5sZW5ndGggPSBzaXplO1xuICByZXR1cm4gYnVmO1xufTtcblxuXG52YXIgZm5UeXBlZCA9IHtcbiAgYXJyYXlTZXQ6IGZ1bmN0aW9uIChkZXN0LCBzcmMsIHNyY19vZmZzLCBsZW4sIGRlc3Rfb2Zmcykge1xuICAgIGlmIChzcmMuc3ViYXJyYXkgJiYgZGVzdC5zdWJhcnJheSkge1xuICAgICAgZGVzdC5zZXQoc3JjLnN1YmFycmF5KHNyY19vZmZzLCBzcmNfb2ZmcyArIGxlbiksIGRlc3Rfb2Zmcyk7XG4gICAgICByZXR1cm47XG4gICAgfVxuICAgIC8vIEZhbGxiYWNrIHRvIG9yZGluYXJ5IGFycmF5XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47IGkrKykge1xuICAgICAgZGVzdFtkZXN0X29mZnMgKyBpXSA9IHNyY1tzcmNfb2ZmcyArIGldO1xuICAgIH1cbiAgfSxcbiAgLy8gSm9pbiBhcnJheSBvZiBjaHVua3MgdG8gc2luZ2xlIGFycmF5LlxuICBmbGF0dGVuQ2h1bmtzOiBmdW5jdGlvbiAoY2h1bmtzKSB7XG4gICAgdmFyIGksIGwsIGxlbiwgcG9zLCBjaHVuaywgcmVzdWx0O1xuXG4gICAgLy8gY2FsY3VsYXRlIGRhdGEgbGVuZ3RoXG4gICAgbGVuID0gMDtcbiAgICBmb3IgKGkgPSAwLCBsID0gY2h1bmtzLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgICAgbGVuICs9IGNodW5rc1tpXS5sZW5ndGg7XG4gICAgfVxuXG4gICAgLy8gam9pbiBjaHVua3NcbiAgICByZXN1bHQgPSBuZXcgVWludDhBcnJheShsZW4pO1xuICAgIHBvcyA9IDA7XG4gICAgZm9yIChpID0gMCwgbCA9IGNodW5rcy5sZW5ndGg7IGkgPCBsOyBpKyspIHtcbiAgICAgIGNodW5rID0gY2h1bmtzW2ldO1xuICAgICAgcmVzdWx0LnNldChjaHVuaywgcG9zKTtcbiAgICAgIHBvcyArPSBjaHVuay5sZW5ndGg7XG4gICAgfVxuXG4gICAgcmV0dXJuIHJlc3VsdDtcbiAgfVxufTtcblxudmFyIGZuVW50eXBlZCA9IHtcbiAgYXJyYXlTZXQ6IGZ1bmN0aW9uIChkZXN0LCBzcmMsIHNyY19vZmZzLCBsZW4sIGRlc3Rfb2Zmcykge1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgIGRlc3RbZGVzdF9vZmZzICsgaV0gPSBzcmNbc3JjX29mZnMgKyBpXTtcbiAgICB9XG4gIH0sXG4gIC8vIEpvaW4gYXJyYXkgb2YgY2h1bmtzIHRvIHNpbmdsZSBhcnJheS5cbiAgZmxhdHRlbkNodW5rczogZnVuY3Rpb24gKGNodW5rcykge1xuICAgIHJldHVybiBbXS5jb25jYXQuYXBwbHkoW10sIGNodW5rcyk7XG4gIH1cbn07XG5cblxuLy8gRW5hYmxlL0Rpc2FibGUgdHlwZWQgYXJyYXlzIHVzZSwgZm9yIHRlc3Rpbmdcbi8vXG5leHBvcnRzLnNldFR5cGVkID0gZnVuY3Rpb24gKG9uKSB7XG4gIGlmIChvbikge1xuICAgIGV4cG9ydHMuQnVmOCAgPSBVaW50OEFycmF5O1xuICAgIGV4cG9ydHMuQnVmMTYgPSBVaW50MTZBcnJheTtcbiAgICBleHBvcnRzLkJ1ZjMyID0gSW50MzJBcnJheTtcbiAgICBleHBvcnRzLmFzc2lnbihleHBvcnRzLCBmblR5cGVkKTtcbiAgfSBlbHNlIHtcbiAgICBleHBvcnRzLkJ1ZjggID0gQXJyYXk7XG4gICAgZXhwb3J0cy5CdWYxNiA9IEFycmF5O1xuICAgIGV4cG9ydHMuQnVmMzIgPSBBcnJheTtcbiAgICBleHBvcnRzLmFzc2lnbihleHBvcnRzLCBmblVudHlwZWQpO1xuICB9XG59O1xuXG5leHBvcnRzLnNldFR5cGVkKFRZUEVEX09LKTtcbiIsIi8vIFN0cmluZyBlbmNvZGUvZGVjb2RlIGhlbHBlcnNcbid1c2Ugc3RyaWN0JztcblxuXG52YXIgdXRpbHMgPSByZXF1aXJlKCcuL2NvbW1vbicpO1xuXG5cbi8vIFF1aWNrIGNoZWNrIGlmIHdlIGNhbiB1c2UgZmFzdCBhcnJheSB0byBiaW4gc3RyaW5nIGNvbnZlcnNpb25cbi8vXG4vLyAtIGFwcGx5KEFycmF5KSBjYW4gZmFpbCBvbiBBbmRyb2lkIDIuMlxuLy8gLSBhcHBseShVaW50OEFycmF5KSBjYW4gZmFpbCBvbiBpT1MgNS4xIFNhZmFyeVxuLy9cbnZhciBTVFJfQVBQTFlfT0sgPSB0cnVlO1xudmFyIFNUUl9BUFBMWV9VSUFfT0sgPSB0cnVlO1xuXG50cnkgeyBTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KG51bGwsIFsgMCBdKTsgfSBjYXRjaCAoX18pIHsgU1RSX0FQUExZX09LID0gZmFsc2U7IH1cbnRyeSB7IFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkobnVsbCwgbmV3IFVpbnQ4QXJyYXkoMSkpOyB9IGNhdGNoIChfXykgeyBTVFJfQVBQTFlfVUlBX09LID0gZmFsc2U7IH1cblxuXG4vLyBUYWJsZSB3aXRoIHV0ZjggbGVuZ3RocyAoY2FsY3VsYXRlZCBieSBmaXJzdCBieXRlIG9mIHNlcXVlbmNlKVxuLy8gTm90ZSwgdGhhdCA1ICYgNi1ieXRlIHZhbHVlcyBhbmQgc29tZSA0LWJ5dGUgdmFsdWVzIGNhbiBub3QgYmUgcmVwcmVzZW50ZWQgaW4gSlMsXG4vLyBiZWNhdXNlIG1heCBwb3NzaWJsZSBjb2RlcG9pbnQgaXMgMHgxMGZmZmZcbnZhciBfdXRmOGxlbiA9IG5ldyB1dGlscy5CdWY4KDI1Nik7XG5mb3IgKHZhciBxID0gMDsgcSA8IDI1NjsgcSsrKSB7XG4gIF91dGY4bGVuW3FdID0gKHEgPj0gMjUyID8gNiA6IHEgPj0gMjQ4ID8gNSA6IHEgPj0gMjQwID8gNCA6IHEgPj0gMjI0ID8gMyA6IHEgPj0gMTkyID8gMiA6IDEpO1xufVxuX3V0ZjhsZW5bMjU0XSA9IF91dGY4bGVuWzI1NF0gPSAxOyAvLyBJbnZhbGlkIHNlcXVlbmNlIHN0YXJ0XG5cblxuLy8gY29udmVydCBzdHJpbmcgdG8gYXJyYXkgKHR5cGVkLCB3aGVuIHBvc3NpYmxlKVxuZXhwb3J0cy5zdHJpbmcyYnVmID0gZnVuY3Rpb24gKHN0cikge1xuICB2YXIgYnVmLCBjLCBjMiwgbV9wb3MsIGksIHN0cl9sZW4gPSBzdHIubGVuZ3RoLCBidWZfbGVuID0gMDtcblxuICAvLyBjb3VudCBiaW5hcnkgc2l6ZVxuICBmb3IgKG1fcG9zID0gMDsgbV9wb3MgPCBzdHJfbGVuOyBtX3BvcysrKSB7XG4gICAgYyA9IHN0ci5jaGFyQ29kZUF0KG1fcG9zKTtcbiAgICBpZiAoKGMgJiAweGZjMDApID09PSAweGQ4MDAgJiYgKG1fcG9zICsgMSA8IHN0cl9sZW4pKSB7XG4gICAgICBjMiA9IHN0ci5jaGFyQ29kZUF0KG1fcG9zICsgMSk7XG4gICAgICBpZiAoKGMyICYgMHhmYzAwKSA9PT0gMHhkYzAwKSB7XG4gICAgICAgIGMgPSAweDEwMDAwICsgKChjIC0gMHhkODAwKSA8PCAxMCkgKyAoYzIgLSAweGRjMDApO1xuICAgICAgICBtX3BvcysrO1xuICAgICAgfVxuICAgIH1cbiAgICBidWZfbGVuICs9IGMgPCAweDgwID8gMSA6IGMgPCAweDgwMCA/IDIgOiBjIDwgMHgxMDAwMCA/IDMgOiA0O1xuICB9XG5cbiAgLy8gYWxsb2NhdGUgYnVmZmVyXG4gIGJ1ZiA9IG5ldyB1dGlscy5CdWY4KGJ1Zl9sZW4pO1xuXG4gIC8vIGNvbnZlcnRcbiAgZm9yIChpID0gMCwgbV9wb3MgPSAwOyBpIDwgYnVmX2xlbjsgbV9wb3MrKykge1xuICAgIGMgPSBzdHIuY2hhckNvZGVBdChtX3Bvcyk7XG4gICAgaWYgKChjICYgMHhmYzAwKSA9PT0gMHhkODAwICYmIChtX3BvcyArIDEgPCBzdHJfbGVuKSkge1xuICAgICAgYzIgPSBzdHIuY2hhckNvZGVBdChtX3BvcyArIDEpO1xuICAgICAgaWYgKChjMiAmIDB4ZmMwMCkgPT09IDB4ZGMwMCkge1xuICAgICAgICBjID0gMHgxMDAwMCArICgoYyAtIDB4ZDgwMCkgPDwgMTApICsgKGMyIC0gMHhkYzAwKTtcbiAgICAgICAgbV9wb3MrKztcbiAgICAgIH1cbiAgICB9XG4gICAgaWYgKGMgPCAweDgwKSB7XG4gICAgICAvKiBvbmUgYnl0ZSAqL1xuICAgICAgYnVmW2krK10gPSBjO1xuICAgIH0gZWxzZSBpZiAoYyA8IDB4ODAwKSB7XG4gICAgICAvKiB0d28gYnl0ZXMgKi9cbiAgICAgIGJ1ZltpKytdID0gMHhDMCB8IChjID4+PiA2KTtcbiAgICAgIGJ1ZltpKytdID0gMHg4MCB8IChjICYgMHgzZik7XG4gICAgfSBlbHNlIGlmIChjIDwgMHgxMDAwMCkge1xuICAgICAgLyogdGhyZWUgYnl0ZXMgKi9cbiAgICAgIGJ1ZltpKytdID0gMHhFMCB8IChjID4+PiAxMik7XG4gICAgICBidWZbaSsrXSA9IDB4ODAgfCAoYyA+Pj4gNiAmIDB4M2YpO1xuICAgICAgYnVmW2krK10gPSAweDgwIHwgKGMgJiAweDNmKTtcbiAgICB9IGVsc2Uge1xuICAgICAgLyogZm91ciBieXRlcyAqL1xuICAgICAgYnVmW2krK10gPSAweGYwIHwgKGMgPj4+IDE4KTtcbiAgICAgIGJ1ZltpKytdID0gMHg4MCB8IChjID4+PiAxMiAmIDB4M2YpO1xuICAgICAgYnVmW2krK10gPSAweDgwIHwgKGMgPj4+IDYgJiAweDNmKTtcbiAgICAgIGJ1ZltpKytdID0gMHg4MCB8IChjICYgMHgzZik7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIGJ1Zjtcbn07XG5cbi8vIEhlbHBlciAodXNlZCBpbiAyIHBsYWNlcylcbmZ1bmN0aW9uIGJ1ZjJiaW5zdHJpbmcoYnVmLCBsZW4pIHtcbiAgLy8gdXNlIGZhbGxiYWNrIGZvciBiaWcgYXJyYXlzIHRvIGF2b2lkIHN0YWNrIG92ZXJmbG93XG4gIGlmIChsZW4gPCA2NTUzNykge1xuICAgIGlmICgoYnVmLnN1YmFycmF5ICYmIFNUUl9BUFBMWV9VSUFfT0spIHx8ICghYnVmLnN1YmFycmF5ICYmIFNUUl9BUFBMWV9PSykpIHtcbiAgICAgIHJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KG51bGwsIHV0aWxzLnNocmlua0J1ZihidWYsIGxlbikpO1xuICAgIH1cbiAgfVxuXG4gIHZhciByZXN1bHQgPSAnJztcbiAgZm9yICh2YXIgaSA9IDA7IGkgPCBsZW47IGkrKykge1xuICAgIHJlc3VsdCArPSBTdHJpbmcuZnJvbUNoYXJDb2RlKGJ1ZltpXSk7XG4gIH1cbiAgcmV0dXJuIHJlc3VsdDtcbn1cblxuXG4vLyBDb252ZXJ0IGJ5dGUgYXJyYXkgdG8gYmluYXJ5IHN0cmluZ1xuZXhwb3J0cy5idWYyYmluc3RyaW5nID0gZnVuY3Rpb24gKGJ1Zikge1xuICByZXR1cm4gYnVmMmJpbnN0cmluZyhidWYsIGJ1Zi5sZW5ndGgpO1xufTtcblxuXG4vLyBDb252ZXJ0IGJpbmFyeSBzdHJpbmcgKHR5cGVkLCB3aGVuIHBvc3NpYmxlKVxuZXhwb3J0cy5iaW5zdHJpbmcyYnVmID0gZnVuY3Rpb24gKHN0cikge1xuICB2YXIgYnVmID0gbmV3IHV0aWxzLkJ1Zjgoc3RyLmxlbmd0aCk7XG4gIGZvciAodmFyIGkgPSAwLCBsZW4gPSBidWYubGVuZ3RoOyBpIDwgbGVuOyBpKyspIHtcbiAgICBidWZbaV0gPSBzdHIuY2hhckNvZGVBdChpKTtcbiAgfVxuICByZXR1cm4gYnVmO1xufTtcblxuXG4vLyBjb252ZXJ0IGFycmF5IHRvIHN0cmluZ1xuZXhwb3J0cy5idWYyc3RyaW5nID0gZnVuY3Rpb24gKGJ1ZiwgbWF4KSB7XG4gIHZhciBpLCBvdXQsIGMsIGNfbGVuO1xuICB2YXIgbGVuID0gbWF4IHx8IGJ1Zi5sZW5ndGg7XG5cbiAgLy8gUmVzZXJ2ZSBtYXggcG9zc2libGUgbGVuZ3RoICgyIHdvcmRzIHBlciBjaGFyKVxuICAvLyBOQjogYnkgdW5rbm93biByZWFzb25zLCBBcnJheSBpcyBzaWduaWZpY2FudGx5IGZhc3RlciBmb3JcbiAgLy8gICAgIFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkgdGhhbiBVaW50MTZBcnJheS5cbiAgdmFyIHV0ZjE2YnVmID0gbmV3IEFycmF5KGxlbiAqIDIpO1xuXG4gIGZvciAob3V0ID0gMCwgaSA9IDA7IGkgPCBsZW47KSB7XG4gICAgYyA9IGJ1ZltpKytdO1xuICAgIC8vIHF1aWNrIHByb2Nlc3MgYXNjaWlcbiAgICBpZiAoYyA8IDB4ODApIHsgdXRmMTZidWZbb3V0KytdID0gYzsgY29udGludWU7IH1cblxuICAgIGNfbGVuID0gX3V0ZjhsZW5bY107XG4gICAgLy8gc2tpcCA1ICYgNiBieXRlIGNvZGVzXG4gICAgaWYgKGNfbGVuID4gNCkgeyB1dGYxNmJ1ZltvdXQrK10gPSAweGZmZmQ7IGkgKz0gY19sZW4gLSAxOyBjb250aW51ZTsgfVxuXG4gICAgLy8gYXBwbHkgbWFzayBvbiBmaXJzdCBieXRlXG4gICAgYyAmPSBjX2xlbiA9PT0gMiA/IDB4MWYgOiBjX2xlbiA9PT0gMyA/IDB4MGYgOiAweDA3O1xuICAgIC8vIGpvaW4gdGhlIHJlc3RcbiAgICB3aGlsZSAoY19sZW4gPiAxICYmIGkgPCBsZW4pIHtcbiAgICAgIGMgPSAoYyA8PCA2KSB8IChidWZbaSsrXSAmIDB4M2YpO1xuICAgICAgY19sZW4tLTtcbiAgICB9XG5cbiAgICAvLyB0ZXJtaW5hdGVkIGJ5IGVuZCBvZiBzdHJpbmc/XG4gICAgaWYgKGNfbGVuID4gMSkgeyB1dGYxNmJ1ZltvdXQrK10gPSAweGZmZmQ7IGNvbnRpbnVlOyB9XG5cbiAgICBpZiAoYyA8IDB4MTAwMDApIHtcbiAgICAgIHV0ZjE2YnVmW291dCsrXSA9IGM7XG4gICAgfSBlbHNlIHtcbiAgICAgIGMgLT0gMHgxMDAwMDtcbiAgICAgIHV0ZjE2YnVmW291dCsrXSA9IDB4ZDgwMCB8ICgoYyA+PiAxMCkgJiAweDNmZik7XG4gICAgICB1dGYxNmJ1ZltvdXQrK10gPSAweGRjMDAgfCAoYyAmIDB4M2ZmKTtcbiAgICB9XG4gIH1cblxuICByZXR1cm4gYnVmMmJpbnN0cmluZyh1dGYxNmJ1Ziwgb3V0KTtcbn07XG5cblxuLy8gQ2FsY3VsYXRlIG1heCBwb3NzaWJsZSBwb3NpdGlvbiBpbiB1dGY4IGJ1ZmZlcixcbi8vIHRoYXQgd2lsbCBub3QgYnJlYWsgc2VxdWVuY2UuIElmIHRoYXQncyBub3QgcG9zc2libGVcbi8vIC0gKHZlcnkgc21hbGwgbGltaXRzKSByZXR1cm4gbWF4IHNpemUgYXMgaXMuXG4vL1xuLy8gYnVmW10gLSB1dGY4IGJ5dGVzIGFycmF5XG4vLyBtYXggICAtIGxlbmd0aCBsaW1pdCAobWFuZGF0b3J5KTtcbmV4cG9ydHMudXRmOGJvcmRlciA9IGZ1bmN0aW9uIChidWYsIG1heCkge1xuICB2YXIgcG9zO1xuXG4gIG1heCA9IG1heCB8fCBidWYubGVuZ3RoO1xuICBpZiAobWF4ID4gYnVmLmxlbmd0aCkgeyBtYXggPSBidWYubGVuZ3RoOyB9XG5cbiAgLy8gZ28gYmFjayBmcm9tIGxhc3QgcG9zaXRpb24sIHVudGlsIHN0YXJ0IG9mIHNlcXVlbmNlIGZvdW5kXG4gIHBvcyA9IG1heCAtIDE7XG4gIHdoaWxlIChwb3MgPj0gMCAmJiAoYnVmW3Bvc10gJiAweEMwKSA9PT0gMHg4MCkgeyBwb3MtLTsgfVxuXG4gIC8vIEZ1Y2t1cCAtIHZlcnkgc21hbGwgYW5kIGJyb2tlbiBzZXF1ZW5jZSxcbiAgLy8gcmV0dXJuIG1heCwgYmVjYXVzZSB3ZSBzaG91bGQgcmV0dXJuIHNvbWV0aGluZyBhbnl3YXkuXG4gIGlmIChwb3MgPCAwKSB7IHJldHVybiBtYXg7IH1cblxuICAvLyBJZiB3ZSBjYW1lIHRvIHN0YXJ0IG9mIGJ1ZmZlciAtIHRoYXQgbWVhbnMgdnVmZmVyIGlzIHRvbyBzbWFsbCxcbiAgLy8gcmV0dXJuIG1heCB0b28uXG4gIGlmIChwb3MgPT09IDApIHsgcmV0dXJuIG1heDsgfVxuXG4gIHJldHVybiAocG9zICsgX3V0ZjhsZW5bYnVmW3Bvc11dID4gbWF4KSA/IHBvcyA6IG1heDtcbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbi8vIE5vdGU6IGFkbGVyMzIgdGFrZXMgMTIlIGZvciBsZXZlbCAwIGFuZCAyJSBmb3IgbGV2ZWwgNi5cbi8vIEl0IGRvZXNuJ3Qgd29ydGggdG8gbWFrZSBhZGRpdGlvbmFsIG9wdGltaXphdGlvbmEgYXMgaW4gb3JpZ2luYWwuXG4vLyBTbWFsbCBzaXplIGlzIHByZWZlcmFibGUuXG5cbmZ1bmN0aW9uIGFkbGVyMzIoYWRsZXIsIGJ1ZiwgbGVuLCBwb3MpIHtcbiAgdmFyIHMxID0gKGFkbGVyICYgMHhmZmZmKSB8MCxcbiAgICAgIHMyID0gKChhZGxlciA+Pj4gMTYpICYgMHhmZmZmKSB8MCxcbiAgICAgIG4gPSAwO1xuXG4gIHdoaWxlIChsZW4gIT09IDApIHtcbiAgICAvLyBTZXQgbGltaXQgfiB0d2ljZSBsZXNzIHRoYW4gNTU1MiwgdG8ga2VlcFxuICAgIC8vIHMyIGluIDMxLWJpdHMsIGJlY2F1c2Ugd2UgZm9yY2Ugc2lnbmVkIGludHMuXG4gICAgLy8gaW4gb3RoZXIgY2FzZSAlPSB3aWxsIGZhaWwuXG4gICAgbiA9IGxlbiA+IDIwMDAgPyAyMDAwIDogbGVuO1xuICAgIGxlbiAtPSBuO1xuXG4gICAgZG8ge1xuICAgICAgczEgPSAoczEgKyBidWZbcG9zKytdKSB8MDtcbiAgICAgIHMyID0gKHMyICsgczEpIHwwO1xuICAgIH0gd2hpbGUgKC0tbik7XG5cbiAgICBzMSAlPSA2NTUyMTtcbiAgICBzMiAlPSA2NTUyMTtcbiAgfVxuXG4gIHJldHVybiAoczEgfCAoczIgPDwgMTYpKSB8MDtcbn1cblxuXG5tb2R1bGUuZXhwb3J0cyA9IGFkbGVyMzI7XG4iLCIndXNlIHN0cmljdCc7XG5cblxubW9kdWxlLmV4cG9ydHMgPSB7XG5cbiAgLyogQWxsb3dlZCBmbHVzaCB2YWx1ZXM7IHNlZSBkZWZsYXRlKCkgYW5kIGluZmxhdGUoKSBiZWxvdyBmb3IgZGV0YWlscyAqL1xuICBaX05PX0ZMVVNIOiAgICAgICAgIDAsXG4gIFpfUEFSVElBTF9GTFVTSDogICAgMSxcbiAgWl9TWU5DX0ZMVVNIOiAgICAgICAyLFxuICBaX0ZVTExfRkxVU0g6ICAgICAgIDMsXG4gIFpfRklOSVNIOiAgICAgICAgICAgNCxcbiAgWl9CTE9DSzogICAgICAgICAgICA1LFxuICBaX1RSRUVTOiAgICAgICAgICAgIDYsXG5cbiAgLyogUmV0dXJuIGNvZGVzIGZvciB0aGUgY29tcHJlc3Npb24vZGVjb21wcmVzc2lvbiBmdW5jdGlvbnMuIE5lZ2F0aXZlIHZhbHVlc1xuICAqIGFyZSBlcnJvcnMsIHBvc2l0aXZlIHZhbHVlcyBhcmUgdXNlZCBmb3Igc3BlY2lhbCBidXQgbm9ybWFsIGV2ZW50cy5cbiAgKi9cbiAgWl9PSzogICAgICAgICAgICAgICAwLFxuICBaX1NUUkVBTV9FTkQ6ICAgICAgIDEsXG4gIFpfTkVFRF9ESUNUOiAgICAgICAgMixcbiAgWl9FUlJOTzogICAgICAgICAgIC0xLFxuICBaX1NUUkVBTV9FUlJPUjogICAgLTIsXG4gIFpfREFUQV9FUlJPUjogICAgICAtMyxcbiAgLy9aX01FTV9FUlJPUjogICAgIC00LFxuICBaX0JVRl9FUlJPUjogICAgICAgLTUsXG4gIC8vWl9WRVJTSU9OX0VSUk9SOiAtNixcblxuICAvKiBjb21wcmVzc2lvbiBsZXZlbHMgKi9cbiAgWl9OT19DT01QUkVTU0lPTjogICAgICAgICAwLFxuICBaX0JFU1RfU1BFRUQ6ICAgICAgICAgICAgIDEsXG4gIFpfQkVTVF9DT01QUkVTU0lPTjogICAgICAgOSxcbiAgWl9ERUZBVUxUX0NPTVBSRVNTSU9OOiAgIC0xLFxuXG5cbiAgWl9GSUxURVJFRDogICAgICAgICAgICAgICAxLFxuICBaX0hVRkZNQU5fT05MWTogICAgICAgICAgIDIsXG4gIFpfUkxFOiAgICAgICAgICAgICAgICAgICAgMyxcbiAgWl9GSVhFRDogICAgICAgICAgICAgICAgICA0LFxuICBaX0RFRkFVTFRfU1RSQVRFR1k6ICAgICAgIDAsXG5cbiAgLyogUG9zc2libGUgdmFsdWVzIG9mIHRoZSBkYXRhX3R5cGUgZmllbGQgKHRob3VnaCBzZWUgaW5mbGF0ZSgpKSAqL1xuICBaX0JJTkFSWTogICAgICAgICAgICAgICAgIDAsXG4gIFpfVEVYVDogICAgICAgICAgICAgICAgICAgMSxcbiAgLy9aX0FTQ0lJOiAgICAgICAgICAgICAgICAxLCAvLyA9IFpfVEVYVCAoZGVwcmVjYXRlZClcbiAgWl9VTktOT1dOOiAgICAgICAgICAgICAgICAyLFxuXG4gIC8qIFRoZSBkZWZsYXRlIGNvbXByZXNzaW9uIG1ldGhvZCAqL1xuICBaX0RFRkxBVEVEOiAgICAgICAgICAgICAgIDhcbiAgLy9aX05VTEw6ICAgICAgICAgICAgICAgICBudWxsIC8vIFVzZSAtMSBvciBudWxsIGlubGluZSwgZGVwZW5kaW5nIG9uIHZhciB0eXBlXG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG4vLyBOb3RlOiB3ZSBjYW4ndCBnZXQgc2lnbmlmaWNhbnQgc3BlZWQgYm9vc3QgaGVyZS5cbi8vIFNvIHdyaXRlIGNvZGUgdG8gbWluaW1pemUgc2l6ZSAtIG5vIHByZWdlbmVyYXRlZCB0YWJsZXNcbi8vIGFuZCBhcnJheSB0b29scyBkZXBlbmRlbmNpZXMuXG5cblxuLy8gVXNlIG9yZGluYXJ5IGFycmF5LCBzaW5jZSB1bnR5cGVkIG1ha2VzIG5vIGJvb3N0IGhlcmVcbmZ1bmN0aW9uIG1ha2VUYWJsZSgpIHtcbiAgdmFyIGMsIHRhYmxlID0gW107XG5cbiAgZm9yICh2YXIgbiA9IDA7IG4gPCAyNTY7IG4rKykge1xuICAgIGMgPSBuO1xuICAgIGZvciAodmFyIGsgPSAwOyBrIDwgODsgaysrKSB7XG4gICAgICBjID0gKChjICYgMSkgPyAoMHhFREI4ODMyMCBeIChjID4+PiAxKSkgOiAoYyA+Pj4gMSkpO1xuICAgIH1cbiAgICB0YWJsZVtuXSA9IGM7XG4gIH1cblxuICByZXR1cm4gdGFibGU7XG59XG5cbi8vIENyZWF0ZSB0YWJsZSBvbiBsb2FkLiBKdXN0IDI1NSBzaWduZWQgbG9uZ3MuIE5vdCBhIHByb2JsZW0uXG52YXIgY3JjVGFibGUgPSBtYWtlVGFibGUoKTtcblxuXG5mdW5jdGlvbiBjcmMzMihjcmMsIGJ1ZiwgbGVuLCBwb3MpIHtcbiAgdmFyIHQgPSBjcmNUYWJsZSxcbiAgICAgIGVuZCA9IHBvcyArIGxlbjtcblxuICBjcmMgXj0gLTE7XG5cbiAgZm9yICh2YXIgaSA9IHBvczsgaSA8IGVuZDsgaSsrKSB7XG4gICAgY3JjID0gKGNyYyA+Pj4gOCkgXiB0WyhjcmMgXiBidWZbaV0pICYgMHhGRl07XG4gIH1cblxuICByZXR1cm4gKGNyYyBeICgtMSkpOyAvLyA+Pj4gMDtcbn1cblxuXG5tb2R1bGUuZXhwb3J0cyA9IGNyYzMyO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgdXRpbHMgICA9IHJlcXVpcmUoJy4uL3V0aWxzL2NvbW1vbicpO1xudmFyIHRyZWVzICAgPSByZXF1aXJlKCcuL3RyZWVzJyk7XG52YXIgYWRsZXIzMiA9IHJlcXVpcmUoJy4vYWRsZXIzMicpO1xudmFyIGNyYzMyICAgPSByZXF1aXJlKCcuL2NyYzMyJyk7XG52YXIgbXNnICAgICA9IHJlcXVpcmUoJy4vbWVzc2FnZXMnKTtcblxuLyogUHVibGljIGNvbnN0YW50cyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki9cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovXG5cblxuLyogQWxsb3dlZCBmbHVzaCB2YWx1ZXM7IHNlZSBkZWZsYXRlKCkgYW5kIGluZmxhdGUoKSBiZWxvdyBmb3IgZGV0YWlscyAqL1xudmFyIFpfTk9fRkxVU0ggICAgICA9IDA7XG52YXIgWl9QQVJUSUFMX0ZMVVNIID0gMTtcbi8vdmFyIFpfU1lOQ19GTFVTSCAgICA9IDI7XG52YXIgWl9GVUxMX0ZMVVNIICAgID0gMztcbnZhciBaX0ZJTklTSCAgICAgICAgPSA0O1xudmFyIFpfQkxPQ0sgICAgICAgICA9IDU7XG4vL3ZhciBaX1RSRUVTICAgICAgICAgPSA2O1xuXG5cbi8qIFJldHVybiBjb2RlcyBmb3IgdGhlIGNvbXByZXNzaW9uL2RlY29tcHJlc3Npb24gZnVuY3Rpb25zLiBOZWdhdGl2ZSB2YWx1ZXNcbiAqIGFyZSBlcnJvcnMsIHBvc2l0aXZlIHZhbHVlcyBhcmUgdXNlZCBmb3Igc3BlY2lhbCBidXQgbm9ybWFsIGV2ZW50cy5cbiAqL1xudmFyIFpfT0sgICAgICAgICAgICA9IDA7XG52YXIgWl9TVFJFQU1fRU5EICAgID0gMTtcbi8vdmFyIFpfTkVFRF9ESUNUICAgICA9IDI7XG4vL3ZhciBaX0VSUk5PICAgICAgICAgPSAtMTtcbnZhciBaX1NUUkVBTV9FUlJPUiAgPSAtMjtcbnZhciBaX0RBVEFfRVJST1IgICAgPSAtMztcbi8vdmFyIFpfTUVNX0VSUk9SICAgICA9IC00O1xudmFyIFpfQlVGX0VSUk9SICAgICA9IC01O1xuLy92YXIgWl9WRVJTSU9OX0VSUk9SID0gLTY7XG5cblxuLyogY29tcHJlc3Npb24gbGV2ZWxzICovXG4vL3ZhciBaX05PX0NPTVBSRVNTSU9OICAgICAgPSAwO1xuLy92YXIgWl9CRVNUX1NQRUVEICAgICAgICAgID0gMTtcbi8vdmFyIFpfQkVTVF9DT01QUkVTU0lPTiAgICA9IDk7XG52YXIgWl9ERUZBVUxUX0NPTVBSRVNTSU9OID0gLTE7XG5cblxudmFyIFpfRklMVEVSRUQgICAgICAgICAgICA9IDE7XG52YXIgWl9IVUZGTUFOX09OTFkgICAgICAgID0gMjtcbnZhciBaX1JMRSAgICAgICAgICAgICAgICAgPSAzO1xudmFyIFpfRklYRUQgICAgICAgICAgICAgICA9IDQ7XG52YXIgWl9ERUZBVUxUX1NUUkFURUdZICAgID0gMDtcblxuLyogUG9zc2libGUgdmFsdWVzIG9mIHRoZSBkYXRhX3R5cGUgZmllbGQgKHRob3VnaCBzZWUgaW5mbGF0ZSgpKSAqL1xuLy92YXIgWl9CSU5BUlkgICAgICAgICAgICAgID0gMDtcbi8vdmFyIFpfVEVYVCAgICAgICAgICAgICAgICA9IDE7XG4vL3ZhciBaX0FTQ0lJICAgICAgICAgICAgICAgPSAxOyAvLyA9IFpfVEVYVFxudmFyIFpfVU5LTk9XTiAgICAgICAgICAgICA9IDI7XG5cblxuLyogVGhlIGRlZmxhdGUgY29tcHJlc3Npb24gbWV0aG9kICovXG52YXIgWl9ERUZMQVRFRCAgPSA4O1xuXG4vKj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qL1xuXG5cbnZhciBNQVhfTUVNX0xFVkVMID0gOTtcbi8qIE1heGltdW0gdmFsdWUgZm9yIG1lbUxldmVsIGluIGRlZmxhdGVJbml0MiAqL1xudmFyIE1BWF9XQklUUyA9IDE1O1xuLyogMzJLIExaNzcgd2luZG93ICovXG52YXIgREVGX01FTV9MRVZFTCA9IDg7XG5cblxudmFyIExFTkdUSF9DT0RFUyAgPSAyOTtcbi8qIG51bWJlciBvZiBsZW5ndGggY29kZXMsIG5vdCBjb3VudGluZyB0aGUgc3BlY2lhbCBFTkRfQkxPQ0sgY29kZSAqL1xudmFyIExJVEVSQUxTICAgICAgPSAyNTY7XG4vKiBudW1iZXIgb2YgbGl0ZXJhbCBieXRlcyAwLi4yNTUgKi9cbnZhciBMX0NPREVTICAgICAgID0gTElURVJBTFMgKyAxICsgTEVOR1RIX0NPREVTO1xuLyogbnVtYmVyIG9mIExpdGVyYWwgb3IgTGVuZ3RoIGNvZGVzLCBpbmNsdWRpbmcgdGhlIEVORF9CTE9DSyBjb2RlICovXG52YXIgRF9DT0RFUyAgICAgICA9IDMwO1xuLyogbnVtYmVyIG9mIGRpc3RhbmNlIGNvZGVzICovXG52YXIgQkxfQ09ERVMgICAgICA9IDE5O1xuLyogbnVtYmVyIG9mIGNvZGVzIHVzZWQgdG8gdHJhbnNmZXIgdGhlIGJpdCBsZW5ndGhzICovXG52YXIgSEVBUF9TSVpFICAgICA9IDIgKiBMX0NPREVTICsgMTtcbi8qIG1heGltdW0gaGVhcCBzaXplICovXG52YXIgTUFYX0JJVFMgID0gMTU7XG4vKiBBbGwgY29kZXMgbXVzdCBub3QgZXhjZWVkIE1BWF9CSVRTIGJpdHMgKi9cblxudmFyIE1JTl9NQVRDSCA9IDM7XG52YXIgTUFYX01BVENIID0gMjU4O1xudmFyIE1JTl9MT09LQUhFQUQgPSAoTUFYX01BVENIICsgTUlOX01BVENIICsgMSk7XG5cbnZhciBQUkVTRVRfRElDVCA9IDB4MjA7XG5cbnZhciBJTklUX1NUQVRFID0gNDI7XG52YXIgRVhUUkFfU1RBVEUgPSA2OTtcbnZhciBOQU1FX1NUQVRFID0gNzM7XG52YXIgQ09NTUVOVF9TVEFURSA9IDkxO1xudmFyIEhDUkNfU1RBVEUgPSAxMDM7XG52YXIgQlVTWV9TVEFURSA9IDExMztcbnZhciBGSU5JU0hfU1RBVEUgPSA2NjY7XG5cbnZhciBCU19ORUVEX01PUkUgICAgICA9IDE7IC8qIGJsb2NrIG5vdCBjb21wbGV0ZWQsIG5lZWQgbW9yZSBpbnB1dCBvciBtb3JlIG91dHB1dCAqL1xudmFyIEJTX0JMT0NLX0RPTkUgICAgID0gMjsgLyogYmxvY2sgZmx1c2ggcGVyZm9ybWVkICovXG52YXIgQlNfRklOSVNIX1NUQVJURUQgPSAzOyAvKiBmaW5pc2ggc3RhcnRlZCwgbmVlZCBvbmx5IG1vcmUgb3V0cHV0IGF0IG5leHQgZGVmbGF0ZSAqL1xudmFyIEJTX0ZJTklTSF9ET05FICAgID0gNDsgLyogZmluaXNoIGRvbmUsIGFjY2VwdCBubyBtb3JlIGlucHV0IG9yIG91dHB1dCAqL1xuXG52YXIgT1NfQ09ERSA9IDB4MDM7IC8vIFVuaXggOikgLiBEb24ndCBkZXRlY3QsIHVzZSB0aGlzIGRlZmF1bHQuXG5cbmZ1bmN0aW9uIGVycihzdHJtLCBlcnJvckNvZGUpIHtcbiAgc3RybS5tc2cgPSBtc2dbZXJyb3JDb2RlXTtcbiAgcmV0dXJuIGVycm9yQ29kZTtcbn1cblxuZnVuY3Rpb24gcmFuayhmKSB7XG4gIHJldHVybiAoKGYpIDw8IDEpIC0gKChmKSA+IDQgPyA5IDogMCk7XG59XG5cbmZ1bmN0aW9uIHplcm8oYnVmKSB7IHZhciBsZW4gPSBidWYubGVuZ3RoOyB3aGlsZSAoLS1sZW4gPj0gMCkgeyBidWZbbGVuXSA9IDA7IH0gfVxuXG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIEZsdXNoIGFzIG11Y2ggcGVuZGluZyBvdXRwdXQgYXMgcG9zc2libGUuIEFsbCBkZWZsYXRlKCkgb3V0cHV0IGdvZXNcbiAqIHRocm91Z2ggdGhpcyBmdW5jdGlvbiBzbyBzb21lIGFwcGxpY2F0aW9ucyBtYXkgd2lzaCB0byBtb2RpZnkgaXRcbiAqIHRvIGF2b2lkIGFsbG9jYXRpbmcgYSBsYXJnZSBzdHJtLT5vdXRwdXQgYnVmZmVyIGFuZCBjb3B5aW5nIGludG8gaXQuXG4gKiAoU2VlIGFsc28gcmVhZF9idWYoKSkuXG4gKi9cbmZ1bmN0aW9uIGZsdXNoX3BlbmRpbmcoc3RybSkge1xuICB2YXIgcyA9IHN0cm0uc3RhdGU7XG5cbiAgLy9fdHJfZmx1c2hfYml0cyhzKTtcbiAgdmFyIGxlbiA9IHMucGVuZGluZztcbiAgaWYgKGxlbiA+IHN0cm0uYXZhaWxfb3V0KSB7XG4gICAgbGVuID0gc3RybS5hdmFpbF9vdXQ7XG4gIH1cbiAgaWYgKGxlbiA9PT0gMCkgeyByZXR1cm47IH1cblxuICB1dGlscy5hcnJheVNldChzdHJtLm91dHB1dCwgcy5wZW5kaW5nX2J1Ziwgcy5wZW5kaW5nX291dCwgbGVuLCBzdHJtLm5leHRfb3V0KTtcbiAgc3RybS5uZXh0X291dCArPSBsZW47XG4gIHMucGVuZGluZ19vdXQgKz0gbGVuO1xuICBzdHJtLnRvdGFsX291dCArPSBsZW47XG4gIHN0cm0uYXZhaWxfb3V0IC09IGxlbjtcbiAgcy5wZW5kaW5nIC09IGxlbjtcbiAgaWYgKHMucGVuZGluZyA9PT0gMCkge1xuICAgIHMucGVuZGluZ19vdXQgPSAwO1xuICB9XG59XG5cblxuZnVuY3Rpb24gZmx1c2hfYmxvY2tfb25seShzLCBsYXN0KSB7XG4gIHRyZWVzLl90cl9mbHVzaF9ibG9jayhzLCAocy5ibG9ja19zdGFydCA+PSAwID8gcy5ibG9ja19zdGFydCA6IC0xKSwgcy5zdHJzdGFydCAtIHMuYmxvY2tfc3RhcnQsIGxhc3QpO1xuICBzLmJsb2NrX3N0YXJ0ID0gcy5zdHJzdGFydDtcbiAgZmx1c2hfcGVuZGluZyhzLnN0cm0pO1xufVxuXG5cbmZ1bmN0aW9uIHB1dF9ieXRlKHMsIGIpIHtcbiAgcy5wZW5kaW5nX2J1ZltzLnBlbmRpbmcrK10gPSBiO1xufVxuXG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIFB1dCBhIHNob3J0IGluIHRoZSBwZW5kaW5nIGJ1ZmZlci4gVGhlIDE2LWJpdCB2YWx1ZSBpcyBwdXQgaW4gTVNCIG9yZGVyLlxuICogSU4gYXNzZXJ0aW9uOiB0aGUgc3RyZWFtIHN0YXRlIGlzIGNvcnJlY3QgYW5kIHRoZXJlIGlzIGVub3VnaCByb29tIGluXG4gKiBwZW5kaW5nX2J1Zi5cbiAqL1xuZnVuY3Rpb24gcHV0U2hvcnRNU0IocywgYikge1xuLy8gIHB1dF9ieXRlKHMsIChCeXRlKShiID4+IDgpKTtcbi8vICBwdXRfYnl0ZShzLCAoQnl0ZSkoYiAmIDB4ZmYpKTtcbiAgcy5wZW5kaW5nX2J1ZltzLnBlbmRpbmcrK10gPSAoYiA+Pj4gOCkgJiAweGZmO1xuICBzLnBlbmRpbmdfYnVmW3MucGVuZGluZysrXSA9IGIgJiAweGZmO1xufVxuXG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogUmVhZCBhIG5ldyBidWZmZXIgZnJvbSB0aGUgY3VycmVudCBpbnB1dCBzdHJlYW0sIHVwZGF0ZSB0aGUgYWRsZXIzMlxuICogYW5kIHRvdGFsIG51bWJlciBvZiBieXRlcyByZWFkLiAgQWxsIGRlZmxhdGUoKSBpbnB1dCBnb2VzIHRocm91Z2hcbiAqIHRoaXMgZnVuY3Rpb24gc28gc29tZSBhcHBsaWNhdGlvbnMgbWF5IHdpc2ggdG8gbW9kaWZ5IGl0IHRvIGF2b2lkXG4gKiBhbGxvY2F0aW5nIGEgbGFyZ2Ugc3RybS0+aW5wdXQgYnVmZmVyIGFuZCBjb3B5aW5nIGZyb20gaXQuXG4gKiAoU2VlIGFsc28gZmx1c2hfcGVuZGluZygpKS5cbiAqL1xuZnVuY3Rpb24gcmVhZF9idWYoc3RybSwgYnVmLCBzdGFydCwgc2l6ZSkge1xuICB2YXIgbGVuID0gc3RybS5hdmFpbF9pbjtcblxuICBpZiAobGVuID4gc2l6ZSkgeyBsZW4gPSBzaXplOyB9XG4gIGlmIChsZW4gPT09IDApIHsgcmV0dXJuIDA7IH1cblxuICBzdHJtLmF2YWlsX2luIC09IGxlbjtcblxuICAvLyB6bWVtY3B5KGJ1Ziwgc3RybS0+bmV4dF9pbiwgbGVuKTtcbiAgdXRpbHMuYXJyYXlTZXQoYnVmLCBzdHJtLmlucHV0LCBzdHJtLm5leHRfaW4sIGxlbiwgc3RhcnQpO1xuICBpZiAoc3RybS5zdGF0ZS53cmFwID09PSAxKSB7XG4gICAgc3RybS5hZGxlciA9IGFkbGVyMzIoc3RybS5hZGxlciwgYnVmLCBsZW4sIHN0YXJ0KTtcbiAgfVxuXG4gIGVsc2UgaWYgKHN0cm0uc3RhdGUud3JhcCA9PT0gMikge1xuICAgIHN0cm0uYWRsZXIgPSBjcmMzMihzdHJtLmFkbGVyLCBidWYsIGxlbiwgc3RhcnQpO1xuICB9XG5cbiAgc3RybS5uZXh0X2luICs9IGxlbjtcbiAgc3RybS50b3RhbF9pbiArPSBsZW47XG5cbiAgcmV0dXJuIGxlbjtcbn1cblxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIFNldCBtYXRjaF9zdGFydCB0byB0aGUgbG9uZ2VzdCBtYXRjaCBzdGFydGluZyBhdCB0aGUgZ2l2ZW4gc3RyaW5nIGFuZFxuICogcmV0dXJuIGl0cyBsZW5ndGguIE1hdGNoZXMgc2hvcnRlciBvciBlcXVhbCB0byBwcmV2X2xlbmd0aCBhcmUgZGlzY2FyZGVkLFxuICogaW4gd2hpY2ggY2FzZSB0aGUgcmVzdWx0IGlzIGVxdWFsIHRvIHByZXZfbGVuZ3RoIGFuZCBtYXRjaF9zdGFydCBpc1xuICogZ2FyYmFnZS5cbiAqIElOIGFzc2VydGlvbnM6IGN1cl9tYXRjaCBpcyB0aGUgaGVhZCBvZiB0aGUgaGFzaCBjaGFpbiBmb3IgdGhlIGN1cnJlbnRcbiAqICAgc3RyaW5nIChzdHJzdGFydCkgYW5kIGl0cyBkaXN0YW5jZSBpcyA8PSBNQVhfRElTVCwgYW5kIHByZXZfbGVuZ3RoID49IDFcbiAqIE9VVCBhc3NlcnRpb246IHRoZSBtYXRjaCBsZW5ndGggaXMgbm90IGdyZWF0ZXIgdGhhbiBzLT5sb29rYWhlYWQuXG4gKi9cbmZ1bmN0aW9uIGxvbmdlc3RfbWF0Y2gocywgY3VyX21hdGNoKSB7XG4gIHZhciBjaGFpbl9sZW5ndGggPSBzLm1heF9jaGFpbl9sZW5ndGg7ICAgICAgLyogbWF4IGhhc2ggY2hhaW4gbGVuZ3RoICovXG4gIHZhciBzY2FuID0gcy5zdHJzdGFydDsgLyogY3VycmVudCBzdHJpbmcgKi9cbiAgdmFyIG1hdGNoOyAgICAgICAgICAgICAgICAgICAgICAgLyogbWF0Y2hlZCBzdHJpbmcgKi9cbiAgdmFyIGxlbjsgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBsZW5ndGggb2YgY3VycmVudCBtYXRjaCAqL1xuICB2YXIgYmVzdF9sZW4gPSBzLnByZXZfbGVuZ3RoOyAgICAgICAgICAgICAgLyogYmVzdCBtYXRjaCBsZW5ndGggc28gZmFyICovXG4gIHZhciBuaWNlX21hdGNoID0gcy5uaWNlX21hdGNoOyAgICAgICAgICAgICAvKiBzdG9wIGlmIG1hdGNoIGxvbmcgZW5vdWdoICovXG4gIHZhciBsaW1pdCA9IChzLnN0cnN0YXJ0ID4gKHMud19zaXplIC0gTUlOX0xPT0tBSEVBRCkpID9cbiAgICAgIHMuc3Ryc3RhcnQgLSAocy53X3NpemUgLSBNSU5fTE9PS0FIRUFEKSA6IDAvKk5JTCovO1xuXG4gIHZhciBfd2luID0gcy53aW5kb3c7IC8vIHNob3J0Y3V0XG5cbiAgdmFyIHdtYXNrID0gcy53X21hc2s7XG4gIHZhciBwcmV2ICA9IHMucHJldjtcblxuICAvKiBTdG9wIHdoZW4gY3VyX21hdGNoIGJlY29tZXMgPD0gbGltaXQuIFRvIHNpbXBsaWZ5IHRoZSBjb2RlLFxuICAgKiB3ZSBwcmV2ZW50IG1hdGNoZXMgd2l0aCB0aGUgc3RyaW5nIG9mIHdpbmRvdyBpbmRleCAwLlxuICAgKi9cblxuICB2YXIgc3RyZW5kID0gcy5zdHJzdGFydCArIE1BWF9NQVRDSDtcbiAgdmFyIHNjYW5fZW5kMSAgPSBfd2luW3NjYW4gKyBiZXN0X2xlbiAtIDFdO1xuICB2YXIgc2Nhbl9lbmQgICA9IF93aW5bc2NhbiArIGJlc3RfbGVuXTtcblxuICAvKiBUaGUgY29kZSBpcyBvcHRpbWl6ZWQgZm9yIEhBU0hfQklUUyA+PSA4IGFuZCBNQVhfTUFUQ0gtMiBtdWx0aXBsZSBvZiAxNi5cbiAgICogSXQgaXMgZWFzeSB0byBnZXQgcmlkIG9mIHRoaXMgb3B0aW1pemF0aW9uIGlmIG5lY2Vzc2FyeS5cbiAgICovXG4gIC8vIEFzc2VydChzLT5oYXNoX2JpdHMgPj0gOCAmJiBNQVhfTUFUQ0ggPT0gMjU4LCBcIkNvZGUgdG9vIGNsZXZlclwiKTtcblxuICAvKiBEbyBub3Qgd2FzdGUgdG9vIG11Y2ggdGltZSBpZiB3ZSBhbHJlYWR5IGhhdmUgYSBnb29kIG1hdGNoOiAqL1xuICBpZiAocy5wcmV2X2xlbmd0aCA+PSBzLmdvb2RfbWF0Y2gpIHtcbiAgICBjaGFpbl9sZW5ndGggPj49IDI7XG4gIH1cbiAgLyogRG8gbm90IGxvb2sgZm9yIG1hdGNoZXMgYmV5b25kIHRoZSBlbmQgb2YgdGhlIGlucHV0LiBUaGlzIGlzIG5lY2Vzc2FyeVxuICAgKiB0byBtYWtlIGRlZmxhdGUgZGV0ZXJtaW5pc3RpYy5cbiAgICovXG4gIGlmIChuaWNlX21hdGNoID4gcy5sb29rYWhlYWQpIHsgbmljZV9tYXRjaCA9IHMubG9va2FoZWFkOyB9XG5cbiAgLy8gQXNzZXJ0KCh1bGcpcy0+c3Ryc3RhcnQgPD0gcy0+d2luZG93X3NpemUtTUlOX0xPT0tBSEVBRCwgXCJuZWVkIGxvb2thaGVhZFwiKTtcblxuICBkbyB7XG4gICAgLy8gQXNzZXJ0KGN1cl9tYXRjaCA8IHMtPnN0cnN0YXJ0LCBcIm5vIGZ1dHVyZVwiKTtcbiAgICBtYXRjaCA9IGN1cl9tYXRjaDtcblxuICAgIC8qIFNraXAgdG8gbmV4dCBtYXRjaCBpZiB0aGUgbWF0Y2ggbGVuZ3RoIGNhbm5vdCBpbmNyZWFzZVxuICAgICAqIG9yIGlmIHRoZSBtYXRjaCBsZW5ndGggaXMgbGVzcyB0aGFuIDIuICBOb3RlIHRoYXQgdGhlIGNoZWNrcyBiZWxvd1xuICAgICAqIGZvciBpbnN1ZmZpY2llbnQgbG9va2FoZWFkIG9ubHkgb2NjdXIgb2NjYXNpb25hbGx5IGZvciBwZXJmb3JtYW5jZVxuICAgICAqIHJlYXNvbnMuICBUaGVyZWZvcmUgdW5pbml0aWFsaXplZCBtZW1vcnkgd2lsbCBiZSBhY2Nlc3NlZCwgYW5kXG4gICAgICogY29uZGl0aW9uYWwganVtcHMgd2lsbCBiZSBtYWRlIHRoYXQgZGVwZW5kIG9uIHRob3NlIHZhbHVlcy5cbiAgICAgKiBIb3dldmVyIHRoZSBsZW5ndGggb2YgdGhlIG1hdGNoIGlzIGxpbWl0ZWQgdG8gdGhlIGxvb2thaGVhZCwgc29cbiAgICAgKiB0aGUgb3V0cHV0IG9mIGRlZmxhdGUgaXMgbm90IGFmZmVjdGVkIGJ5IHRoZSB1bmluaXRpYWxpemVkIHZhbHVlcy5cbiAgICAgKi9cblxuICAgIGlmIChfd2luW21hdGNoICsgYmVzdF9sZW5dICAgICAhPT0gc2Nhbl9lbmQgIHx8XG4gICAgICAgIF93aW5bbWF0Y2ggKyBiZXN0X2xlbiAtIDFdICE9PSBzY2FuX2VuZDEgfHxcbiAgICAgICAgX3dpblttYXRjaF0gICAgICAgICAgICAgICAgIT09IF93aW5bc2Nhbl0gfHxcbiAgICAgICAgX3dpblsrK21hdGNoXSAgICAgICAgICAgICAgIT09IF93aW5bc2NhbiArIDFdKSB7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG5cbiAgICAvKiBUaGUgY2hlY2sgYXQgYmVzdF9sZW4tMSBjYW4gYmUgcmVtb3ZlZCBiZWNhdXNlIGl0IHdpbGwgYmUgbWFkZVxuICAgICAqIGFnYWluIGxhdGVyLiAoVGhpcyBoZXVyaXN0aWMgaXMgbm90IGFsd2F5cyBhIHdpbi4pXG4gICAgICogSXQgaXMgbm90IG5lY2Vzc2FyeSB0byBjb21wYXJlIHNjYW5bMl0gYW5kIG1hdGNoWzJdIHNpbmNlIHRoZXlcbiAgICAgKiBhcmUgYWx3YXlzIGVxdWFsIHdoZW4gdGhlIG90aGVyIGJ5dGVzIG1hdGNoLCBnaXZlbiB0aGF0XG4gICAgICogdGhlIGhhc2gga2V5cyBhcmUgZXF1YWwgYW5kIHRoYXQgSEFTSF9CSVRTID49IDguXG4gICAgICovXG4gICAgc2NhbiArPSAyO1xuICAgIG1hdGNoKys7XG4gICAgLy8gQXNzZXJ0KCpzY2FuID09ICptYXRjaCwgXCJtYXRjaFsyXT9cIik7XG5cbiAgICAvKiBXZSBjaGVjayBmb3IgaW5zdWZmaWNpZW50IGxvb2thaGVhZCBvbmx5IGV2ZXJ5IDh0aCBjb21wYXJpc29uO1xuICAgICAqIHRoZSAyNTZ0aCBjaGVjayB3aWxsIGJlIG1hZGUgYXQgc3Ryc3RhcnQrMjU4LlxuICAgICAqL1xuICAgIGRvIHtcbiAgICAgIC8qanNoaW50IG5vZW1wdHk6ZmFsc2UqL1xuICAgIH0gd2hpbGUgKF93aW5bKytzY2FuXSA9PT0gX3dpblsrK21hdGNoXSAmJiBfd2luWysrc2Nhbl0gPT09IF93aW5bKyttYXRjaF0gJiZcbiAgICAgICAgICAgICBfd2luWysrc2Nhbl0gPT09IF93aW5bKyttYXRjaF0gJiYgX3dpblsrK3NjYW5dID09PSBfd2luWysrbWF0Y2hdICYmXG4gICAgICAgICAgICAgX3dpblsrK3NjYW5dID09PSBfd2luWysrbWF0Y2hdICYmIF93aW5bKytzY2FuXSA9PT0gX3dpblsrK21hdGNoXSAmJlxuICAgICAgICAgICAgIF93aW5bKytzY2FuXSA9PT0gX3dpblsrK21hdGNoXSAmJiBfd2luWysrc2Nhbl0gPT09IF93aW5bKyttYXRjaF0gJiZcbiAgICAgICAgICAgICBzY2FuIDwgc3RyZW5kKTtcblxuICAgIC8vIEFzc2VydChzY2FuIDw9IHMtPndpbmRvdysodW5zaWduZWQpKHMtPndpbmRvd19zaXplLTEpLCBcIndpbGQgc2NhblwiKTtcblxuICAgIGxlbiA9IE1BWF9NQVRDSCAtIChzdHJlbmQgLSBzY2FuKTtcbiAgICBzY2FuID0gc3RyZW5kIC0gTUFYX01BVENIO1xuXG4gICAgaWYgKGxlbiA+IGJlc3RfbGVuKSB7XG4gICAgICBzLm1hdGNoX3N0YXJ0ID0gY3VyX21hdGNoO1xuICAgICAgYmVzdF9sZW4gPSBsZW47XG4gICAgICBpZiAobGVuID49IG5pY2VfbWF0Y2gpIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBzY2FuX2VuZDEgID0gX3dpbltzY2FuICsgYmVzdF9sZW4gLSAxXTtcbiAgICAgIHNjYW5fZW5kICAgPSBfd2luW3NjYW4gKyBiZXN0X2xlbl07XG4gICAgfVxuICB9IHdoaWxlICgoY3VyX21hdGNoID0gcHJldltjdXJfbWF0Y2ggJiB3bWFza10pID4gbGltaXQgJiYgLS1jaGFpbl9sZW5ndGggIT09IDApO1xuXG4gIGlmIChiZXN0X2xlbiA8PSBzLmxvb2thaGVhZCkge1xuICAgIHJldHVybiBiZXN0X2xlbjtcbiAgfVxuICByZXR1cm4gcy5sb29rYWhlYWQ7XG59XG5cblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBGaWxsIHRoZSB3aW5kb3cgd2hlbiB0aGUgbG9va2FoZWFkIGJlY29tZXMgaW5zdWZmaWNpZW50LlxuICogVXBkYXRlcyBzdHJzdGFydCBhbmQgbG9va2FoZWFkLlxuICpcbiAqIElOIGFzc2VydGlvbjogbG9va2FoZWFkIDwgTUlOX0xPT0tBSEVBRFxuICogT1VUIGFzc2VydGlvbnM6IHN0cnN0YXJ0IDw9IHdpbmRvd19zaXplLU1JTl9MT09LQUhFQURcbiAqICAgIEF0IGxlYXN0IG9uZSBieXRlIGhhcyBiZWVuIHJlYWQsIG9yIGF2YWlsX2luID09IDA7IHJlYWRzIGFyZVxuICogICAgcGVyZm9ybWVkIGZvciBhdCBsZWFzdCB0d28gYnl0ZXMgKHJlcXVpcmVkIGZvciB0aGUgemlwIHRyYW5zbGF0ZV9lb2xcbiAqICAgIG9wdGlvbiAtLSBub3Qgc3VwcG9ydGVkIGhlcmUpLlxuICovXG5mdW5jdGlvbiBmaWxsX3dpbmRvdyhzKSB7XG4gIHZhciBfd19zaXplID0gcy53X3NpemU7XG4gIHZhciBwLCBuLCBtLCBtb3JlLCBzdHI7XG5cbiAgLy9Bc3NlcnQocy0+bG9va2FoZWFkIDwgTUlOX0xPT0tBSEVBRCwgXCJhbHJlYWR5IGVub3VnaCBsb29rYWhlYWRcIik7XG5cbiAgZG8ge1xuICAgIG1vcmUgPSBzLndpbmRvd19zaXplIC0gcy5sb29rYWhlYWQgLSBzLnN0cnN0YXJ0O1xuXG4gICAgLy8gSlMgaW50cyBoYXZlIDMyIGJpdCwgYmxvY2sgYmVsb3cgbm90IG5lZWRlZFxuICAgIC8qIERlYWwgd2l0aCAhQCMkJSA2NEsgbGltaXQ6ICovXG4gICAgLy9pZiAoc2l6ZW9mKGludCkgPD0gMikge1xuICAgIC8vICAgIGlmIChtb3JlID09IDAgJiYgcy0+c3Ryc3RhcnQgPT0gMCAmJiBzLT5sb29rYWhlYWQgPT0gMCkge1xuICAgIC8vICAgICAgICBtb3JlID0gd3NpemU7XG4gICAgLy9cbiAgICAvLyAgfSBlbHNlIGlmIChtb3JlID09ICh1bnNpZ25lZCkoLTEpKSB7XG4gICAgLy8gICAgICAgIC8qIFZlcnkgdW5saWtlbHksIGJ1dCBwb3NzaWJsZSBvbiAxNiBiaXQgbWFjaGluZSBpZlxuICAgIC8vICAgICAgICAgKiBzdHJzdGFydCA9PSAwICYmIGxvb2thaGVhZCA9PSAxIChpbnB1dCBkb25lIGEgYnl0ZSBhdCB0aW1lKVxuICAgIC8vICAgICAgICAgKi9cbiAgICAvLyAgICAgICAgbW9yZS0tO1xuICAgIC8vICAgIH1cbiAgICAvL31cblxuXG4gICAgLyogSWYgdGhlIHdpbmRvdyBpcyBhbG1vc3QgZnVsbCBhbmQgdGhlcmUgaXMgaW5zdWZmaWNpZW50IGxvb2thaGVhZCxcbiAgICAgKiBtb3ZlIHRoZSB1cHBlciBoYWxmIHRvIHRoZSBsb3dlciBvbmUgdG8gbWFrZSByb29tIGluIHRoZSB1cHBlciBoYWxmLlxuICAgICAqL1xuICAgIGlmIChzLnN0cnN0YXJ0ID49IF93X3NpemUgKyAoX3dfc2l6ZSAtIE1JTl9MT09LQUhFQUQpKSB7XG5cbiAgICAgIHV0aWxzLmFycmF5U2V0KHMud2luZG93LCBzLndpbmRvdywgX3dfc2l6ZSwgX3dfc2l6ZSwgMCk7XG4gICAgICBzLm1hdGNoX3N0YXJ0IC09IF93X3NpemU7XG4gICAgICBzLnN0cnN0YXJ0IC09IF93X3NpemU7XG4gICAgICAvKiB3ZSBub3cgaGF2ZSBzdHJzdGFydCA+PSBNQVhfRElTVCAqL1xuICAgICAgcy5ibG9ja19zdGFydCAtPSBfd19zaXplO1xuXG4gICAgICAvKiBTbGlkZSB0aGUgaGFzaCB0YWJsZSAoY291bGQgYmUgYXZvaWRlZCB3aXRoIDMyIGJpdCB2YWx1ZXNcbiAgICAgICBhdCB0aGUgZXhwZW5zZSBvZiBtZW1vcnkgdXNhZ2UpLiBXZSBzbGlkZSBldmVuIHdoZW4gbGV2ZWwgPT0gMFxuICAgICAgIHRvIGtlZXAgdGhlIGhhc2ggdGFibGUgY29uc2lzdGVudCBpZiB3ZSBzd2l0Y2ggYmFjayB0byBsZXZlbCA+IDBcbiAgICAgICBsYXRlci4gKFVzaW5nIGxldmVsIDAgcGVybWFuZW50bHkgaXMgbm90IGFuIG9wdGltYWwgdXNhZ2Ugb2ZcbiAgICAgICB6bGliLCBzbyB3ZSBkb24ndCBjYXJlIGFib3V0IHRoaXMgcGF0aG9sb2dpY2FsIGNhc2UuKVxuICAgICAgICovXG5cbiAgICAgIG4gPSBzLmhhc2hfc2l6ZTtcbiAgICAgIHAgPSBuO1xuICAgICAgZG8ge1xuICAgICAgICBtID0gcy5oZWFkWy0tcF07XG4gICAgICAgIHMuaGVhZFtwXSA9IChtID49IF93X3NpemUgPyBtIC0gX3dfc2l6ZSA6IDApO1xuICAgICAgfSB3aGlsZSAoLS1uKTtcblxuICAgICAgbiA9IF93X3NpemU7XG4gICAgICBwID0gbjtcbiAgICAgIGRvIHtcbiAgICAgICAgbSA9IHMucHJldlstLXBdO1xuICAgICAgICBzLnByZXZbcF0gPSAobSA+PSBfd19zaXplID8gbSAtIF93X3NpemUgOiAwKTtcbiAgICAgICAgLyogSWYgbiBpcyBub3Qgb24gYW55IGhhc2ggY2hhaW4sIHByZXZbbl0gaXMgZ2FyYmFnZSBidXRcbiAgICAgICAgICogaXRzIHZhbHVlIHdpbGwgbmV2ZXIgYmUgdXNlZC5cbiAgICAgICAgICovXG4gICAgICB9IHdoaWxlICgtLW4pO1xuXG4gICAgICBtb3JlICs9IF93X3NpemU7XG4gICAgfVxuICAgIGlmIChzLnN0cm0uYXZhaWxfaW4gPT09IDApIHtcbiAgICAgIGJyZWFrO1xuICAgIH1cblxuICAgIC8qIElmIHRoZXJlIHdhcyBubyBzbGlkaW5nOlxuICAgICAqICAgIHN0cnN0YXJ0IDw9IFdTSVpFK01BWF9ESVNULTEgJiYgbG9va2FoZWFkIDw9IE1JTl9MT09LQUhFQUQgLSAxICYmXG4gICAgICogICAgbW9yZSA9PSB3aW5kb3dfc2l6ZSAtIGxvb2thaGVhZCAtIHN0cnN0YXJ0XG4gICAgICogPT4gbW9yZSA+PSB3aW5kb3dfc2l6ZSAtIChNSU5fTE9PS0FIRUFELTEgKyBXU0laRSArIE1BWF9ESVNULTEpXG4gICAgICogPT4gbW9yZSA+PSB3aW5kb3dfc2l6ZSAtIDIqV1NJWkUgKyAyXG4gICAgICogSW4gdGhlIEJJR19NRU0gb3IgTU1BUCBjYXNlIChub3QgeWV0IHN1cHBvcnRlZCksXG4gICAgICogICB3aW5kb3dfc2l6ZSA9PSBpbnB1dF9zaXplICsgTUlOX0xPT0tBSEVBRCAgJiZcbiAgICAgKiAgIHN0cnN0YXJ0ICsgcy0+bG9va2FoZWFkIDw9IGlucHV0X3NpemUgPT4gbW9yZSA+PSBNSU5fTE9PS0FIRUFELlxuICAgICAqIE90aGVyd2lzZSwgd2luZG93X3NpemUgPT0gMipXU0laRSBzbyBtb3JlID49IDIuXG4gICAgICogSWYgdGhlcmUgd2FzIHNsaWRpbmcsIG1vcmUgPj0gV1NJWkUuIFNvIGluIGFsbCBjYXNlcywgbW9yZSA+PSAyLlxuICAgICAqL1xuICAgIC8vQXNzZXJ0KG1vcmUgPj0gMiwgXCJtb3JlIDwgMlwiKTtcbiAgICBuID0gcmVhZF9idWYocy5zdHJtLCBzLndpbmRvdywgcy5zdHJzdGFydCArIHMubG9va2FoZWFkLCBtb3JlKTtcbiAgICBzLmxvb2thaGVhZCArPSBuO1xuXG4gICAgLyogSW5pdGlhbGl6ZSB0aGUgaGFzaCB2YWx1ZSBub3cgdGhhdCB3ZSBoYXZlIHNvbWUgaW5wdXQ6ICovXG4gICAgaWYgKHMubG9va2FoZWFkICsgcy5pbnNlcnQgPj0gTUlOX01BVENIKSB7XG4gICAgICBzdHIgPSBzLnN0cnN0YXJ0IC0gcy5pbnNlcnQ7XG4gICAgICBzLmluc19oID0gcy53aW5kb3dbc3RyXTtcblxuICAgICAgLyogVVBEQVRFX0hBU0gocywgcy0+aW5zX2gsIHMtPndpbmRvd1tzdHIgKyAxXSk7ICovXG4gICAgICBzLmluc19oID0gKChzLmluc19oIDw8IHMuaGFzaF9zaGlmdCkgXiBzLndpbmRvd1tzdHIgKyAxXSkgJiBzLmhhc2hfbWFzaztcbi8vI2lmIE1JTl9NQVRDSCAhPSAzXG4vLyAgICAgICAgQ2FsbCB1cGRhdGVfaGFzaCgpIE1JTl9NQVRDSC0zIG1vcmUgdGltZXNcbi8vI2VuZGlmXG4gICAgICB3aGlsZSAocy5pbnNlcnQpIHtcbiAgICAgICAgLyogVVBEQVRFX0hBU0gocywgcy0+aW5zX2gsIHMtPndpbmRvd1tzdHIgKyBNSU5fTUFUQ0gtMV0pOyAqL1xuICAgICAgICBzLmluc19oID0gKChzLmluc19oIDw8IHMuaGFzaF9zaGlmdCkgXiBzLndpbmRvd1tzdHIgKyBNSU5fTUFUQ0ggLSAxXSkgJiBzLmhhc2hfbWFzaztcblxuICAgICAgICBzLnByZXZbc3RyICYgcy53X21hc2tdID0gcy5oZWFkW3MuaW5zX2hdO1xuICAgICAgICBzLmhlYWRbcy5pbnNfaF0gPSBzdHI7XG4gICAgICAgIHN0cisrO1xuICAgICAgICBzLmluc2VydC0tO1xuICAgICAgICBpZiAocy5sb29rYWhlYWQgKyBzLmluc2VydCA8IE1JTl9NQVRDSCkge1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfVxuICAgIC8qIElmIHRoZSB3aG9sZSBpbnB1dCBoYXMgbGVzcyB0aGFuIE1JTl9NQVRDSCBieXRlcywgaW5zX2ggaXMgZ2FyYmFnZSxcbiAgICAgKiBidXQgdGhpcyBpcyBub3QgaW1wb3J0YW50IHNpbmNlIG9ubHkgbGl0ZXJhbCBieXRlcyB3aWxsIGJlIGVtaXR0ZWQuXG4gICAgICovXG5cbiAgfSB3aGlsZSAocy5sb29rYWhlYWQgPCBNSU5fTE9PS0FIRUFEICYmIHMuc3RybS5hdmFpbF9pbiAhPT0gMCk7XG5cbiAgLyogSWYgdGhlIFdJTl9JTklUIGJ5dGVzIGFmdGVyIHRoZSBlbmQgb2YgdGhlIGN1cnJlbnQgZGF0YSBoYXZlIG5ldmVyIGJlZW5cbiAgICogd3JpdHRlbiwgdGhlbiB6ZXJvIHRob3NlIGJ5dGVzIGluIG9yZGVyIHRvIGF2b2lkIG1lbW9yeSBjaGVjayByZXBvcnRzIG9mXG4gICAqIHRoZSB1c2Ugb2YgdW5pbml0aWFsaXplZCAob3IgdW5pbml0aWFsaXNlZCBhcyBKdWxpYW4gd3JpdGVzKSBieXRlcyBieVxuICAgKiB0aGUgbG9uZ2VzdCBtYXRjaCByb3V0aW5lcy4gIFVwZGF0ZSB0aGUgaGlnaCB3YXRlciBtYXJrIGZvciB0aGUgbmV4dFxuICAgKiB0aW1lIHRocm91Z2ggaGVyZS4gIFdJTl9JTklUIGlzIHNldCB0byBNQVhfTUFUQ0ggc2luY2UgdGhlIGxvbmdlc3QgbWF0Y2hcbiAgICogcm91dGluZXMgYWxsb3cgc2Nhbm5pbmcgdG8gc3Ryc3RhcnQgKyBNQVhfTUFUQ0gsIGlnbm9yaW5nIGxvb2thaGVhZC5cbiAgICovXG4vLyAgaWYgKHMuaGlnaF93YXRlciA8IHMud2luZG93X3NpemUpIHtcbi8vICAgIHZhciBjdXJyID0gcy5zdHJzdGFydCArIHMubG9va2FoZWFkO1xuLy8gICAgdmFyIGluaXQgPSAwO1xuLy9cbi8vICAgIGlmIChzLmhpZ2hfd2F0ZXIgPCBjdXJyKSB7XG4vLyAgICAgIC8qIFByZXZpb3VzIGhpZ2ggd2F0ZXIgbWFyayBiZWxvdyBjdXJyZW50IGRhdGEgLS0gemVybyBXSU5fSU5JVFxuLy8gICAgICAgKiBieXRlcyBvciB1cCB0byBlbmQgb2Ygd2luZG93LCB3aGljaGV2ZXIgaXMgbGVzcy5cbi8vICAgICAgICovXG4vLyAgICAgIGluaXQgPSBzLndpbmRvd19zaXplIC0gY3Vycjtcbi8vICAgICAgaWYgKGluaXQgPiBXSU5fSU5JVClcbi8vICAgICAgICBpbml0ID0gV0lOX0lOSVQ7XG4vLyAgICAgIHptZW16ZXJvKHMtPndpbmRvdyArIGN1cnIsICh1bnNpZ25lZClpbml0KTtcbi8vICAgICAgcy0+aGlnaF93YXRlciA9IGN1cnIgKyBpbml0O1xuLy8gICAgfVxuLy8gICAgZWxzZSBpZiAocy0+aGlnaF93YXRlciA8ICh1bGcpY3VyciArIFdJTl9JTklUKSB7XG4vLyAgICAgIC8qIEhpZ2ggd2F0ZXIgbWFyayBhdCBvciBhYm92ZSBjdXJyZW50IGRhdGEsIGJ1dCBiZWxvdyBjdXJyZW50IGRhdGFcbi8vICAgICAgICogcGx1cyBXSU5fSU5JVCAtLSB6ZXJvIG91dCB0byBjdXJyZW50IGRhdGEgcGx1cyBXSU5fSU5JVCwgb3IgdXBcbi8vICAgICAgICogdG8gZW5kIG9mIHdpbmRvdywgd2hpY2hldmVyIGlzIGxlc3MuXG4vLyAgICAgICAqL1xuLy8gICAgICBpbml0ID0gKHVsZyljdXJyICsgV0lOX0lOSVQgLSBzLT5oaWdoX3dhdGVyO1xuLy8gICAgICBpZiAoaW5pdCA+IHMtPndpbmRvd19zaXplIC0gcy0+aGlnaF93YXRlcilcbi8vICAgICAgICBpbml0ID0gcy0+d2luZG93X3NpemUgLSBzLT5oaWdoX3dhdGVyO1xuLy8gICAgICB6bWVtemVybyhzLT53aW5kb3cgKyBzLT5oaWdoX3dhdGVyLCAodW5zaWduZWQpaW5pdCk7XG4vLyAgICAgIHMtPmhpZ2hfd2F0ZXIgKz0gaW5pdDtcbi8vICAgIH1cbi8vICB9XG4vL1xuLy8gIEFzc2VydCgodWxnKXMtPnN0cnN0YXJ0IDw9IHMtPndpbmRvd19zaXplIC0gTUlOX0xPT0tBSEVBRCxcbi8vICAgIFwibm90IGVub3VnaCByb29tIGZvciBzZWFyY2hcIik7XG59XG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogQ29weSB3aXRob3V0IGNvbXByZXNzaW9uIGFzIG11Y2ggYXMgcG9zc2libGUgZnJvbSB0aGUgaW5wdXQgc3RyZWFtLCByZXR1cm5cbiAqIHRoZSBjdXJyZW50IGJsb2NrIHN0YXRlLlxuICogVGhpcyBmdW5jdGlvbiBkb2VzIG5vdCBpbnNlcnQgbmV3IHN0cmluZ3MgaW4gdGhlIGRpY3Rpb25hcnkgc2luY2VcbiAqIHVuY29tcHJlc3NpYmxlIGRhdGEgaXMgcHJvYmFibHkgbm90IHVzZWZ1bC4gVGhpcyBmdW5jdGlvbiBpcyB1c2VkXG4gKiBvbmx5IGZvciB0aGUgbGV2ZWw9MCBjb21wcmVzc2lvbiBvcHRpb24uXG4gKiBOT1RFOiB0aGlzIGZ1bmN0aW9uIHNob3VsZCBiZSBvcHRpbWl6ZWQgdG8gYXZvaWQgZXh0cmEgY29weWluZyBmcm9tXG4gKiB3aW5kb3cgdG8gcGVuZGluZ19idWYuXG4gKi9cbmZ1bmN0aW9uIGRlZmxhdGVfc3RvcmVkKHMsIGZsdXNoKSB7XG4gIC8qIFN0b3JlZCBibG9ja3MgYXJlIGxpbWl0ZWQgdG8gMHhmZmZmIGJ5dGVzLCBwZW5kaW5nX2J1ZiBpcyBsaW1pdGVkXG4gICAqIHRvIHBlbmRpbmdfYnVmX3NpemUsIGFuZCBlYWNoIHN0b3JlZCBibG9jayBoYXMgYSA1IGJ5dGUgaGVhZGVyOlxuICAgKi9cbiAgdmFyIG1heF9ibG9ja19zaXplID0gMHhmZmZmO1xuXG4gIGlmIChtYXhfYmxvY2tfc2l6ZSA+IHMucGVuZGluZ19idWZfc2l6ZSAtIDUpIHtcbiAgICBtYXhfYmxvY2tfc2l6ZSA9IHMucGVuZGluZ19idWZfc2l6ZSAtIDU7XG4gIH1cblxuICAvKiBDb3B5IGFzIG11Y2ggYXMgcG9zc2libGUgZnJvbSBpbnB1dCB0byBvdXRwdXQ6ICovXG4gIGZvciAoOzspIHtcbiAgICAvKiBGaWxsIHRoZSB3aW5kb3cgYXMgbXVjaCBhcyBwb3NzaWJsZTogKi9cbiAgICBpZiAocy5sb29rYWhlYWQgPD0gMSkge1xuXG4gICAgICAvL0Fzc2VydChzLT5zdHJzdGFydCA8IHMtPndfc2l6ZStNQVhfRElTVChzKSB8fFxuICAgICAgLy8gIHMtPmJsb2NrX3N0YXJ0ID49IChsb25nKXMtPndfc2l6ZSwgXCJzbGlkZSB0b28gbGF0ZVwiKTtcbi8vICAgICAgaWYgKCEocy5zdHJzdGFydCA8IHMud19zaXplICsgKHMud19zaXplIC0gTUlOX0xPT0tBSEVBRCkgfHxcbi8vICAgICAgICBzLmJsb2NrX3N0YXJ0ID49IHMud19zaXplKSkge1xuLy8gICAgICAgIHRocm93ICBuZXcgRXJyb3IoXCJzbGlkZSB0b28gbGF0ZVwiKTtcbi8vICAgICAgfVxuXG4gICAgICBmaWxsX3dpbmRvdyhzKTtcbiAgICAgIGlmIChzLmxvb2thaGVhZCA9PT0gMCAmJiBmbHVzaCA9PT0gWl9OT19GTFVTSCkge1xuICAgICAgICByZXR1cm4gQlNfTkVFRF9NT1JFO1xuICAgICAgfVxuXG4gICAgICBpZiAocy5sb29rYWhlYWQgPT09IDApIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICAvKiBmbHVzaCB0aGUgY3VycmVudCBibG9jayAqL1xuICAgIH1cbiAgICAvL0Fzc2VydChzLT5ibG9ja19zdGFydCA+PSAwTCwgXCJibG9jayBnb25lXCIpO1xuLy8gICAgaWYgKHMuYmxvY2tfc3RhcnQgPCAwKSB0aHJvdyBuZXcgRXJyb3IoXCJibG9jayBnb25lXCIpO1xuXG4gICAgcy5zdHJzdGFydCArPSBzLmxvb2thaGVhZDtcbiAgICBzLmxvb2thaGVhZCA9IDA7XG5cbiAgICAvKiBFbWl0IGEgc3RvcmVkIGJsb2NrIGlmIHBlbmRpbmdfYnVmIHdpbGwgYmUgZnVsbDogKi9cbiAgICB2YXIgbWF4X3N0YXJ0ID0gcy5ibG9ja19zdGFydCArIG1heF9ibG9ja19zaXplO1xuXG4gICAgaWYgKHMuc3Ryc3RhcnQgPT09IDAgfHwgcy5zdHJzdGFydCA+PSBtYXhfc3RhcnQpIHtcbiAgICAgIC8qIHN0cnN0YXJ0ID09IDAgaXMgcG9zc2libGUgd2hlbiB3cmFwYXJvdW5kIG9uIDE2LWJpdCBtYWNoaW5lICovXG4gICAgICBzLmxvb2thaGVhZCA9IHMuc3Ryc3RhcnQgLSBtYXhfc3RhcnQ7XG4gICAgICBzLnN0cnN0YXJ0ID0gbWF4X3N0YXJ0O1xuICAgICAgLyoqKiBGTFVTSF9CTE9DSyhzLCAwKTsgKioqL1xuICAgICAgZmx1c2hfYmxvY2tfb25seShzLCBmYWxzZSk7XG4gICAgICBpZiAocy5zdHJtLmF2YWlsX291dCA9PT0gMCkge1xuICAgICAgICByZXR1cm4gQlNfTkVFRF9NT1JFO1xuICAgICAgfVxuICAgICAgLyoqKi9cblxuXG4gICAgfVxuICAgIC8qIEZsdXNoIGlmIHdlIG1heSBoYXZlIHRvIHNsaWRlLCBvdGhlcndpc2UgYmxvY2tfc3RhcnQgbWF5IGJlY29tZVxuICAgICAqIG5lZ2F0aXZlIGFuZCB0aGUgZGF0YSB3aWxsIGJlIGdvbmU6XG4gICAgICovXG4gICAgaWYgKHMuc3Ryc3RhcnQgLSBzLmJsb2NrX3N0YXJ0ID49IChzLndfc2l6ZSAtIE1JTl9MT09LQUhFQUQpKSB7XG4gICAgICAvKioqIEZMVVNIX0JMT0NLKHMsIDApOyAqKiovXG4gICAgICBmbHVzaF9ibG9ja19vbmx5KHMsIGZhbHNlKTtcbiAgICAgIGlmIChzLnN0cm0uYXZhaWxfb3V0ID09PSAwKSB7XG4gICAgICAgIHJldHVybiBCU19ORUVEX01PUkU7XG4gICAgICB9XG4gICAgICAvKioqL1xuICAgIH1cbiAgfVxuXG4gIHMuaW5zZXJ0ID0gMDtcblxuICBpZiAoZmx1c2ggPT09IFpfRklOSVNIKSB7XG4gICAgLyoqKiBGTFVTSF9CTE9DSyhzLCAxKTsgKioqL1xuICAgIGZsdXNoX2Jsb2NrX29ubHkocywgdHJ1ZSk7XG4gICAgaWYgKHMuc3RybS5hdmFpbF9vdXQgPT09IDApIHtcbiAgICAgIHJldHVybiBCU19GSU5JU0hfU1RBUlRFRDtcbiAgICB9XG4gICAgLyoqKi9cbiAgICByZXR1cm4gQlNfRklOSVNIX0RPTkU7XG4gIH1cblxuICBpZiAocy5zdHJzdGFydCA+IHMuYmxvY2tfc3RhcnQpIHtcbiAgICAvKioqIEZMVVNIX0JMT0NLKHMsIDApOyAqKiovXG4gICAgZmx1c2hfYmxvY2tfb25seShzLCBmYWxzZSk7XG4gICAgaWYgKHMuc3RybS5hdmFpbF9vdXQgPT09IDApIHtcbiAgICAgIHJldHVybiBCU19ORUVEX01PUkU7XG4gICAgfVxuICAgIC8qKiovXG4gIH1cblxuICByZXR1cm4gQlNfTkVFRF9NT1JFO1xufVxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIENvbXByZXNzIGFzIG11Y2ggYXMgcG9zc2libGUgZnJvbSB0aGUgaW5wdXQgc3RyZWFtLCByZXR1cm4gdGhlIGN1cnJlbnRcbiAqIGJsb2NrIHN0YXRlLlxuICogVGhpcyBmdW5jdGlvbiBkb2VzIG5vdCBwZXJmb3JtIGxhenkgZXZhbHVhdGlvbiBvZiBtYXRjaGVzIGFuZCBpbnNlcnRzXG4gKiBuZXcgc3RyaW5ncyBpbiB0aGUgZGljdGlvbmFyeSBvbmx5IGZvciB1bm1hdGNoZWQgc3RyaW5ncyBvciBmb3Igc2hvcnRcbiAqIG1hdGNoZXMuIEl0IGlzIHVzZWQgb25seSBmb3IgdGhlIGZhc3QgY29tcHJlc3Npb24gb3B0aW9ucy5cbiAqL1xuZnVuY3Rpb24gZGVmbGF0ZV9mYXN0KHMsIGZsdXNoKSB7XG4gIHZhciBoYXNoX2hlYWQ7ICAgICAgICAvKiBoZWFkIG9mIHRoZSBoYXNoIGNoYWluICovXG4gIHZhciBiZmx1c2g7ICAgICAgICAgICAvKiBzZXQgaWYgY3VycmVudCBibG9jayBtdXN0IGJlIGZsdXNoZWQgKi9cblxuICBmb3IgKDs7KSB7XG4gICAgLyogTWFrZSBzdXJlIHRoYXQgd2UgYWx3YXlzIGhhdmUgZW5vdWdoIGxvb2thaGVhZCwgZXhjZXB0XG4gICAgICogYXQgdGhlIGVuZCBvZiB0aGUgaW5wdXQgZmlsZS4gV2UgbmVlZCBNQVhfTUFUQ0ggYnl0ZXNcbiAgICAgKiBmb3IgdGhlIG5leHQgbWF0Y2gsIHBsdXMgTUlOX01BVENIIGJ5dGVzIHRvIGluc2VydCB0aGVcbiAgICAgKiBzdHJpbmcgZm9sbG93aW5nIHRoZSBuZXh0IG1hdGNoLlxuICAgICAqL1xuICAgIGlmIChzLmxvb2thaGVhZCA8IE1JTl9MT09LQUhFQUQpIHtcbiAgICAgIGZpbGxfd2luZG93KHMpO1xuICAgICAgaWYgKHMubG9va2FoZWFkIDwgTUlOX0xPT0tBSEVBRCAmJiBmbHVzaCA9PT0gWl9OT19GTFVTSCkge1xuICAgICAgICByZXR1cm4gQlNfTkVFRF9NT1JFO1xuICAgICAgfVxuICAgICAgaWYgKHMubG9va2FoZWFkID09PSAwKSB7XG4gICAgICAgIGJyZWFrOyAvKiBmbHVzaCB0aGUgY3VycmVudCBibG9jayAqL1xuICAgICAgfVxuICAgIH1cblxuICAgIC8qIEluc2VydCB0aGUgc3RyaW5nIHdpbmRvd1tzdHJzdGFydCAuLiBzdHJzdGFydCsyXSBpbiB0aGVcbiAgICAgKiBkaWN0aW9uYXJ5LCBhbmQgc2V0IGhhc2hfaGVhZCB0byB0aGUgaGVhZCBvZiB0aGUgaGFzaCBjaGFpbjpcbiAgICAgKi9cbiAgICBoYXNoX2hlYWQgPSAwLypOSUwqLztcbiAgICBpZiAocy5sb29rYWhlYWQgPj0gTUlOX01BVENIKSB7XG4gICAgICAvKioqIElOU0VSVF9TVFJJTkcocywgcy5zdHJzdGFydCwgaGFzaF9oZWFkKTsgKioqL1xuICAgICAgcy5pbnNfaCA9ICgocy5pbnNfaCA8PCBzLmhhc2hfc2hpZnQpIF4gcy53aW5kb3dbcy5zdHJzdGFydCArIE1JTl9NQVRDSCAtIDFdKSAmIHMuaGFzaF9tYXNrO1xuICAgICAgaGFzaF9oZWFkID0gcy5wcmV2W3Muc3Ryc3RhcnQgJiBzLndfbWFza10gPSBzLmhlYWRbcy5pbnNfaF07XG4gICAgICBzLmhlYWRbcy5pbnNfaF0gPSBzLnN0cnN0YXJ0O1xuICAgICAgLyoqKi9cbiAgICB9XG5cbiAgICAvKiBGaW5kIHRoZSBsb25nZXN0IG1hdGNoLCBkaXNjYXJkaW5nIHRob3NlIDw9IHByZXZfbGVuZ3RoLlxuICAgICAqIEF0IHRoaXMgcG9pbnQgd2UgaGF2ZSBhbHdheXMgbWF0Y2hfbGVuZ3RoIDwgTUlOX01BVENIXG4gICAgICovXG4gICAgaWYgKGhhc2hfaGVhZCAhPT0gMC8qTklMKi8gJiYgKChzLnN0cnN0YXJ0IC0gaGFzaF9oZWFkKSA8PSAocy53X3NpemUgLSBNSU5fTE9PS0FIRUFEKSkpIHtcbiAgICAgIC8qIFRvIHNpbXBsaWZ5IHRoZSBjb2RlLCB3ZSBwcmV2ZW50IG1hdGNoZXMgd2l0aCB0aGUgc3RyaW5nXG4gICAgICAgKiBvZiB3aW5kb3cgaW5kZXggMCAoaW4gcGFydGljdWxhciB3ZSBoYXZlIHRvIGF2b2lkIGEgbWF0Y2hcbiAgICAgICAqIG9mIHRoZSBzdHJpbmcgd2l0aCBpdHNlbGYgYXQgdGhlIHN0YXJ0IG9mIHRoZSBpbnB1dCBmaWxlKS5cbiAgICAgICAqL1xuICAgICAgcy5tYXRjaF9sZW5ndGggPSBsb25nZXN0X21hdGNoKHMsIGhhc2hfaGVhZCk7XG4gICAgICAvKiBsb25nZXN0X21hdGNoKCkgc2V0cyBtYXRjaF9zdGFydCAqL1xuICAgIH1cbiAgICBpZiAocy5tYXRjaF9sZW5ndGggPj0gTUlOX01BVENIKSB7XG4gICAgICAvLyBjaGVja19tYXRjaChzLCBzLnN0cnN0YXJ0LCBzLm1hdGNoX3N0YXJ0LCBzLm1hdGNoX2xlbmd0aCk7IC8vIGZvciBkZWJ1ZyBvbmx5XG5cbiAgICAgIC8qKiogX3RyX3RhbGx5X2Rpc3Qocywgcy5zdHJzdGFydCAtIHMubWF0Y2hfc3RhcnQsXG4gICAgICAgICAgICAgICAgICAgICBzLm1hdGNoX2xlbmd0aCAtIE1JTl9NQVRDSCwgYmZsdXNoKTsgKioqL1xuICAgICAgYmZsdXNoID0gdHJlZXMuX3RyX3RhbGx5KHMsIHMuc3Ryc3RhcnQgLSBzLm1hdGNoX3N0YXJ0LCBzLm1hdGNoX2xlbmd0aCAtIE1JTl9NQVRDSCk7XG5cbiAgICAgIHMubG9va2FoZWFkIC09IHMubWF0Y2hfbGVuZ3RoO1xuXG4gICAgICAvKiBJbnNlcnQgbmV3IHN0cmluZ3MgaW4gdGhlIGhhc2ggdGFibGUgb25seSBpZiB0aGUgbWF0Y2ggbGVuZ3RoXG4gICAgICAgKiBpcyBub3QgdG9vIGxhcmdlLiBUaGlzIHNhdmVzIHRpbWUgYnV0IGRlZ3JhZGVzIGNvbXByZXNzaW9uLlxuICAgICAgICovXG4gICAgICBpZiAocy5tYXRjaF9sZW5ndGggPD0gcy5tYXhfbGF6eV9tYXRjaC8qbWF4X2luc2VydF9sZW5ndGgqLyAmJiBzLmxvb2thaGVhZCA+PSBNSU5fTUFUQ0gpIHtcbiAgICAgICAgcy5tYXRjaF9sZW5ndGgtLTsgLyogc3RyaW5nIGF0IHN0cnN0YXJ0IGFscmVhZHkgaW4gdGFibGUgKi9cbiAgICAgICAgZG8ge1xuICAgICAgICAgIHMuc3Ryc3RhcnQrKztcbiAgICAgICAgICAvKioqIElOU0VSVF9TVFJJTkcocywgcy5zdHJzdGFydCwgaGFzaF9oZWFkKTsgKioqL1xuICAgICAgICAgIHMuaW5zX2ggPSAoKHMuaW5zX2ggPDwgcy5oYXNoX3NoaWZ0KSBeIHMud2luZG93W3Muc3Ryc3RhcnQgKyBNSU5fTUFUQ0ggLSAxXSkgJiBzLmhhc2hfbWFzaztcbiAgICAgICAgICBoYXNoX2hlYWQgPSBzLnByZXZbcy5zdHJzdGFydCAmIHMud19tYXNrXSA9IHMuaGVhZFtzLmluc19oXTtcbiAgICAgICAgICBzLmhlYWRbcy5pbnNfaF0gPSBzLnN0cnN0YXJ0O1xuICAgICAgICAgIC8qKiovXG4gICAgICAgICAgLyogc3Ryc3RhcnQgbmV2ZXIgZXhjZWVkcyBXU0laRS1NQVhfTUFUQ0gsIHNvIHRoZXJlIGFyZVxuICAgICAgICAgICAqIGFsd2F5cyBNSU5fTUFUQ0ggYnl0ZXMgYWhlYWQuXG4gICAgICAgICAgICovXG4gICAgICAgIH0gd2hpbGUgKC0tcy5tYXRjaF9sZW5ndGggIT09IDApO1xuICAgICAgICBzLnN0cnN0YXJ0Kys7XG4gICAgICB9IGVsc2VcbiAgICAgIHtcbiAgICAgICAgcy5zdHJzdGFydCArPSBzLm1hdGNoX2xlbmd0aDtcbiAgICAgICAgcy5tYXRjaF9sZW5ndGggPSAwO1xuICAgICAgICBzLmluc19oID0gcy53aW5kb3dbcy5zdHJzdGFydF07XG4gICAgICAgIC8qIFVQREFURV9IQVNIKHMsIHMuaW5zX2gsIHMud2luZG93W3Muc3Ryc3RhcnQrMV0pOyAqL1xuICAgICAgICBzLmluc19oID0gKChzLmluc19oIDw8IHMuaGFzaF9zaGlmdCkgXiBzLndpbmRvd1tzLnN0cnN0YXJ0ICsgMV0pICYgcy5oYXNoX21hc2s7XG5cbi8vI2lmIE1JTl9NQVRDSCAhPSAzXG4vLyAgICAgICAgICAgICAgICBDYWxsIFVQREFURV9IQVNIKCkgTUlOX01BVENILTMgbW9yZSB0aW1lc1xuLy8jZW5kaWZcbiAgICAgICAgLyogSWYgbG9va2FoZWFkIDwgTUlOX01BVENILCBpbnNfaCBpcyBnYXJiYWdlLCBidXQgaXQgZG9lcyBub3RcbiAgICAgICAgICogbWF0dGVyIHNpbmNlIGl0IHdpbGwgYmUgcmVjb21wdXRlZCBhdCBuZXh0IGRlZmxhdGUgY2FsbC5cbiAgICAgICAgICovXG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIC8qIE5vIG1hdGNoLCBvdXRwdXQgYSBsaXRlcmFsIGJ5dGUgKi9cbiAgICAgIC8vVHJhY2V2digoc3RkZXJyLFwiJWNcIiwgcy53aW5kb3dbcy5zdHJzdGFydF0pKTtcbiAgICAgIC8qKiogX3RyX3RhbGx5X2xpdChzLCBzLndpbmRvd1tzLnN0cnN0YXJ0XSwgYmZsdXNoKTsgKioqL1xuICAgICAgYmZsdXNoID0gdHJlZXMuX3RyX3RhbGx5KHMsIDAsIHMud2luZG93W3Muc3Ryc3RhcnRdKTtcblxuICAgICAgcy5sb29rYWhlYWQtLTtcbiAgICAgIHMuc3Ryc3RhcnQrKztcbiAgICB9XG4gICAgaWYgKGJmbHVzaCkge1xuICAgICAgLyoqKiBGTFVTSF9CTE9DSyhzLCAwKTsgKioqL1xuICAgICAgZmx1c2hfYmxvY2tfb25seShzLCBmYWxzZSk7XG4gICAgICBpZiAocy5zdHJtLmF2YWlsX291dCA9PT0gMCkge1xuICAgICAgICByZXR1cm4gQlNfTkVFRF9NT1JFO1xuICAgICAgfVxuICAgICAgLyoqKi9cbiAgICB9XG4gIH1cbiAgcy5pbnNlcnQgPSAoKHMuc3Ryc3RhcnQgPCAoTUlOX01BVENIIC0gMSkpID8gcy5zdHJzdGFydCA6IE1JTl9NQVRDSCAtIDEpO1xuICBpZiAoZmx1c2ggPT09IFpfRklOSVNIKSB7XG4gICAgLyoqKiBGTFVTSF9CTE9DSyhzLCAxKTsgKioqL1xuICAgIGZsdXNoX2Jsb2NrX29ubHkocywgdHJ1ZSk7XG4gICAgaWYgKHMuc3RybS5hdmFpbF9vdXQgPT09IDApIHtcbiAgICAgIHJldHVybiBCU19GSU5JU0hfU1RBUlRFRDtcbiAgICB9XG4gICAgLyoqKi9cbiAgICByZXR1cm4gQlNfRklOSVNIX0RPTkU7XG4gIH1cbiAgaWYgKHMubGFzdF9saXQpIHtcbiAgICAvKioqIEZMVVNIX0JMT0NLKHMsIDApOyAqKiovXG4gICAgZmx1c2hfYmxvY2tfb25seShzLCBmYWxzZSk7XG4gICAgaWYgKHMuc3RybS5hdmFpbF9vdXQgPT09IDApIHtcbiAgICAgIHJldHVybiBCU19ORUVEX01PUkU7XG4gICAgfVxuICAgIC8qKiovXG4gIH1cbiAgcmV0dXJuIEJTX0JMT0NLX0RPTkU7XG59XG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogU2FtZSBhcyBhYm92ZSwgYnV0IGFjaGlldmVzIGJldHRlciBjb21wcmVzc2lvbi4gV2UgdXNlIGEgbGF6eVxuICogZXZhbHVhdGlvbiBmb3IgbWF0Y2hlczogYSBtYXRjaCBpcyBmaW5hbGx5IGFkb3B0ZWQgb25seSBpZiB0aGVyZSBpc1xuICogbm8gYmV0dGVyIG1hdGNoIGF0IHRoZSBuZXh0IHdpbmRvdyBwb3NpdGlvbi5cbiAqL1xuZnVuY3Rpb24gZGVmbGF0ZV9zbG93KHMsIGZsdXNoKSB7XG4gIHZhciBoYXNoX2hlYWQ7ICAgICAgICAgIC8qIGhlYWQgb2YgaGFzaCBjaGFpbiAqL1xuICB2YXIgYmZsdXNoOyAgICAgICAgICAgICAgLyogc2V0IGlmIGN1cnJlbnQgYmxvY2sgbXVzdCBiZSBmbHVzaGVkICovXG5cbiAgdmFyIG1heF9pbnNlcnQ7XG5cbiAgLyogUHJvY2VzcyB0aGUgaW5wdXQgYmxvY2suICovXG4gIGZvciAoOzspIHtcbiAgICAvKiBNYWtlIHN1cmUgdGhhdCB3ZSBhbHdheXMgaGF2ZSBlbm91Z2ggbG9va2FoZWFkLCBleGNlcHRcbiAgICAgKiBhdCB0aGUgZW5kIG9mIHRoZSBpbnB1dCBmaWxlLiBXZSBuZWVkIE1BWF9NQVRDSCBieXRlc1xuICAgICAqIGZvciB0aGUgbmV4dCBtYXRjaCwgcGx1cyBNSU5fTUFUQ0ggYnl0ZXMgdG8gaW5zZXJ0IHRoZVxuICAgICAqIHN0cmluZyBmb2xsb3dpbmcgdGhlIG5leHQgbWF0Y2guXG4gICAgICovXG4gICAgaWYgKHMubG9va2FoZWFkIDwgTUlOX0xPT0tBSEVBRCkge1xuICAgICAgZmlsbF93aW5kb3cocyk7XG4gICAgICBpZiAocy5sb29rYWhlYWQgPCBNSU5fTE9PS0FIRUFEICYmIGZsdXNoID09PSBaX05PX0ZMVVNIKSB7XG4gICAgICAgIHJldHVybiBCU19ORUVEX01PUkU7XG4gICAgICB9XG4gICAgICBpZiAocy5sb29rYWhlYWQgPT09IDApIHsgYnJlYWs7IH0gLyogZmx1c2ggdGhlIGN1cnJlbnQgYmxvY2sgKi9cbiAgICB9XG5cbiAgICAvKiBJbnNlcnQgdGhlIHN0cmluZyB3aW5kb3dbc3Ryc3RhcnQgLi4gc3Ryc3RhcnQrMl0gaW4gdGhlXG4gICAgICogZGljdGlvbmFyeSwgYW5kIHNldCBoYXNoX2hlYWQgdG8gdGhlIGhlYWQgb2YgdGhlIGhhc2ggY2hhaW46XG4gICAgICovXG4gICAgaGFzaF9oZWFkID0gMC8qTklMKi87XG4gICAgaWYgKHMubG9va2FoZWFkID49IE1JTl9NQVRDSCkge1xuICAgICAgLyoqKiBJTlNFUlRfU1RSSU5HKHMsIHMuc3Ryc3RhcnQsIGhhc2hfaGVhZCk7ICoqKi9cbiAgICAgIHMuaW5zX2ggPSAoKHMuaW5zX2ggPDwgcy5oYXNoX3NoaWZ0KSBeIHMud2luZG93W3Muc3Ryc3RhcnQgKyBNSU5fTUFUQ0ggLSAxXSkgJiBzLmhhc2hfbWFzaztcbiAgICAgIGhhc2hfaGVhZCA9IHMucHJldltzLnN0cnN0YXJ0ICYgcy53X21hc2tdID0gcy5oZWFkW3MuaW5zX2hdO1xuICAgICAgcy5oZWFkW3MuaW5zX2hdID0gcy5zdHJzdGFydDtcbiAgICAgIC8qKiovXG4gICAgfVxuXG4gICAgLyogRmluZCB0aGUgbG9uZ2VzdCBtYXRjaCwgZGlzY2FyZGluZyB0aG9zZSA8PSBwcmV2X2xlbmd0aC5cbiAgICAgKi9cbiAgICBzLnByZXZfbGVuZ3RoID0gcy5tYXRjaF9sZW5ndGg7XG4gICAgcy5wcmV2X21hdGNoID0gcy5tYXRjaF9zdGFydDtcbiAgICBzLm1hdGNoX2xlbmd0aCA9IE1JTl9NQVRDSCAtIDE7XG5cbiAgICBpZiAoaGFzaF9oZWFkICE9PSAwLypOSUwqLyAmJiBzLnByZXZfbGVuZ3RoIDwgcy5tYXhfbGF6eV9tYXRjaCAmJlxuICAgICAgICBzLnN0cnN0YXJ0IC0gaGFzaF9oZWFkIDw9IChzLndfc2l6ZSAtIE1JTl9MT09LQUhFQUQpLypNQVhfRElTVChzKSovKSB7XG4gICAgICAvKiBUbyBzaW1wbGlmeSB0aGUgY29kZSwgd2UgcHJldmVudCBtYXRjaGVzIHdpdGggdGhlIHN0cmluZ1xuICAgICAgICogb2Ygd2luZG93IGluZGV4IDAgKGluIHBhcnRpY3VsYXIgd2UgaGF2ZSB0byBhdm9pZCBhIG1hdGNoXG4gICAgICAgKiBvZiB0aGUgc3RyaW5nIHdpdGggaXRzZWxmIGF0IHRoZSBzdGFydCBvZiB0aGUgaW5wdXQgZmlsZSkuXG4gICAgICAgKi9cbiAgICAgIHMubWF0Y2hfbGVuZ3RoID0gbG9uZ2VzdF9tYXRjaChzLCBoYXNoX2hlYWQpO1xuICAgICAgLyogbG9uZ2VzdF9tYXRjaCgpIHNldHMgbWF0Y2hfc3RhcnQgKi9cblxuICAgICAgaWYgKHMubWF0Y2hfbGVuZ3RoIDw9IDUgJiZcbiAgICAgICAgIChzLnN0cmF0ZWd5ID09PSBaX0ZJTFRFUkVEIHx8IChzLm1hdGNoX2xlbmd0aCA9PT0gTUlOX01BVENIICYmIHMuc3Ryc3RhcnQgLSBzLm1hdGNoX3N0YXJ0ID4gNDA5Ni8qVE9PX0ZBUiovKSkpIHtcblxuICAgICAgICAvKiBJZiBwcmV2X21hdGNoIGlzIGFsc28gTUlOX01BVENILCBtYXRjaF9zdGFydCBpcyBnYXJiYWdlXG4gICAgICAgICAqIGJ1dCB3ZSB3aWxsIGlnbm9yZSB0aGUgY3VycmVudCBtYXRjaCBhbnl3YXkuXG4gICAgICAgICAqL1xuICAgICAgICBzLm1hdGNoX2xlbmd0aCA9IE1JTl9NQVRDSCAtIDE7XG4gICAgICB9XG4gICAgfVxuICAgIC8qIElmIHRoZXJlIHdhcyBhIG1hdGNoIGF0IHRoZSBwcmV2aW91cyBzdGVwIGFuZCB0aGUgY3VycmVudFxuICAgICAqIG1hdGNoIGlzIG5vdCBiZXR0ZXIsIG91dHB1dCB0aGUgcHJldmlvdXMgbWF0Y2g6XG4gICAgICovXG4gICAgaWYgKHMucHJldl9sZW5ndGggPj0gTUlOX01BVENIICYmIHMubWF0Y2hfbGVuZ3RoIDw9IHMucHJldl9sZW5ndGgpIHtcbiAgICAgIG1heF9pbnNlcnQgPSBzLnN0cnN0YXJ0ICsgcy5sb29rYWhlYWQgLSBNSU5fTUFUQ0g7XG4gICAgICAvKiBEbyBub3QgaW5zZXJ0IHN0cmluZ3MgaW4gaGFzaCB0YWJsZSBiZXlvbmQgdGhpcy4gKi9cblxuICAgICAgLy9jaGVja19tYXRjaChzLCBzLnN0cnN0YXJ0LTEsIHMucHJldl9tYXRjaCwgcy5wcmV2X2xlbmd0aCk7XG5cbiAgICAgIC8qKipfdHJfdGFsbHlfZGlzdChzLCBzLnN0cnN0YXJ0IC0gMSAtIHMucHJldl9tYXRjaCxcbiAgICAgICAgICAgICAgICAgICAgIHMucHJldl9sZW5ndGggLSBNSU5fTUFUQ0gsIGJmbHVzaCk7KioqL1xuICAgICAgYmZsdXNoID0gdHJlZXMuX3RyX3RhbGx5KHMsIHMuc3Ryc3RhcnQgLSAxIC0gcy5wcmV2X21hdGNoLCBzLnByZXZfbGVuZ3RoIC0gTUlOX01BVENIKTtcbiAgICAgIC8qIEluc2VydCBpbiBoYXNoIHRhYmxlIGFsbCBzdHJpbmdzIHVwIHRvIHRoZSBlbmQgb2YgdGhlIG1hdGNoLlxuICAgICAgICogc3Ryc3RhcnQtMSBhbmQgc3Ryc3RhcnQgYXJlIGFscmVhZHkgaW5zZXJ0ZWQuIElmIHRoZXJlIGlzIG5vdFxuICAgICAgICogZW5vdWdoIGxvb2thaGVhZCwgdGhlIGxhc3QgdHdvIHN0cmluZ3MgYXJlIG5vdCBpbnNlcnRlZCBpblxuICAgICAgICogdGhlIGhhc2ggdGFibGUuXG4gICAgICAgKi9cbiAgICAgIHMubG9va2FoZWFkIC09IHMucHJldl9sZW5ndGggLSAxO1xuICAgICAgcy5wcmV2X2xlbmd0aCAtPSAyO1xuICAgICAgZG8ge1xuICAgICAgICBpZiAoKytzLnN0cnN0YXJ0IDw9IG1heF9pbnNlcnQpIHtcbiAgICAgICAgICAvKioqIElOU0VSVF9TVFJJTkcocywgcy5zdHJzdGFydCwgaGFzaF9oZWFkKTsgKioqL1xuICAgICAgICAgIHMuaW5zX2ggPSAoKHMuaW5zX2ggPDwgcy5oYXNoX3NoaWZ0KSBeIHMud2luZG93W3Muc3Ryc3RhcnQgKyBNSU5fTUFUQ0ggLSAxXSkgJiBzLmhhc2hfbWFzaztcbiAgICAgICAgICBoYXNoX2hlYWQgPSBzLnByZXZbcy5zdHJzdGFydCAmIHMud19tYXNrXSA9IHMuaGVhZFtzLmluc19oXTtcbiAgICAgICAgICBzLmhlYWRbcy5pbnNfaF0gPSBzLnN0cnN0YXJ0O1xuICAgICAgICAgIC8qKiovXG4gICAgICAgIH1cbiAgICAgIH0gd2hpbGUgKC0tcy5wcmV2X2xlbmd0aCAhPT0gMCk7XG4gICAgICBzLm1hdGNoX2F2YWlsYWJsZSA9IDA7XG4gICAgICBzLm1hdGNoX2xlbmd0aCA9IE1JTl9NQVRDSCAtIDE7XG4gICAgICBzLnN0cnN0YXJ0Kys7XG5cbiAgICAgIGlmIChiZmx1c2gpIHtcbiAgICAgICAgLyoqKiBGTFVTSF9CTE9DSyhzLCAwKTsgKioqL1xuICAgICAgICBmbHVzaF9ibG9ja19vbmx5KHMsIGZhbHNlKTtcbiAgICAgICAgaWYgKHMuc3RybS5hdmFpbF9vdXQgPT09IDApIHtcbiAgICAgICAgICByZXR1cm4gQlNfTkVFRF9NT1JFO1xuICAgICAgICB9XG4gICAgICAgIC8qKiovXG4gICAgICB9XG5cbiAgICB9IGVsc2UgaWYgKHMubWF0Y2hfYXZhaWxhYmxlKSB7XG4gICAgICAvKiBJZiB0aGVyZSB3YXMgbm8gbWF0Y2ggYXQgdGhlIHByZXZpb3VzIHBvc2l0aW9uLCBvdXRwdXQgYVxuICAgICAgICogc2luZ2xlIGxpdGVyYWwuIElmIHRoZXJlIHdhcyBhIG1hdGNoIGJ1dCB0aGUgY3VycmVudCBtYXRjaFxuICAgICAgICogaXMgbG9uZ2VyLCB0cnVuY2F0ZSB0aGUgcHJldmlvdXMgbWF0Y2ggdG8gYSBzaW5nbGUgbGl0ZXJhbC5cbiAgICAgICAqL1xuICAgICAgLy9UcmFjZXZ2KChzdGRlcnIsXCIlY1wiLCBzLT53aW5kb3dbcy0+c3Ryc3RhcnQtMV0pKTtcbiAgICAgIC8qKiogX3RyX3RhbGx5X2xpdChzLCBzLndpbmRvd1tzLnN0cnN0YXJ0LTFdLCBiZmx1c2gpOyAqKiovXG4gICAgICBiZmx1c2ggPSB0cmVlcy5fdHJfdGFsbHkocywgMCwgcy53aW5kb3dbcy5zdHJzdGFydCAtIDFdKTtcblxuICAgICAgaWYgKGJmbHVzaCkge1xuICAgICAgICAvKioqIEZMVVNIX0JMT0NLX09OTFkocywgMCkgKioqL1xuICAgICAgICBmbHVzaF9ibG9ja19vbmx5KHMsIGZhbHNlKTtcbiAgICAgICAgLyoqKi9cbiAgICAgIH1cbiAgICAgIHMuc3Ryc3RhcnQrKztcbiAgICAgIHMubG9va2FoZWFkLS07XG4gICAgICBpZiAocy5zdHJtLmF2YWlsX291dCA9PT0gMCkge1xuICAgICAgICByZXR1cm4gQlNfTkVFRF9NT1JFO1xuICAgICAgfVxuICAgIH0gZWxzZSB7XG4gICAgICAvKiBUaGVyZSBpcyBubyBwcmV2aW91cyBtYXRjaCB0byBjb21wYXJlIHdpdGgsIHdhaXQgZm9yXG4gICAgICAgKiB0aGUgbmV4dCBzdGVwIHRvIGRlY2lkZS5cbiAgICAgICAqL1xuICAgICAgcy5tYXRjaF9hdmFpbGFibGUgPSAxO1xuICAgICAgcy5zdHJzdGFydCsrO1xuICAgICAgcy5sb29rYWhlYWQtLTtcbiAgICB9XG4gIH1cbiAgLy9Bc3NlcnQgKGZsdXNoICE9IFpfTk9fRkxVU0gsIFwibm8gZmx1c2g/XCIpO1xuICBpZiAocy5tYXRjaF9hdmFpbGFibGUpIHtcbiAgICAvL1RyYWNldnYoKHN0ZGVycixcIiVjXCIsIHMtPndpbmRvd1tzLT5zdHJzdGFydC0xXSkpO1xuICAgIC8qKiogX3RyX3RhbGx5X2xpdChzLCBzLndpbmRvd1tzLnN0cnN0YXJ0LTFdLCBiZmx1c2gpOyAqKiovXG4gICAgYmZsdXNoID0gdHJlZXMuX3RyX3RhbGx5KHMsIDAsIHMud2luZG93W3Muc3Ryc3RhcnQgLSAxXSk7XG5cbiAgICBzLm1hdGNoX2F2YWlsYWJsZSA9IDA7XG4gIH1cbiAgcy5pbnNlcnQgPSBzLnN0cnN0YXJ0IDwgTUlOX01BVENIIC0gMSA/IHMuc3Ryc3RhcnQgOiBNSU5fTUFUQ0ggLSAxO1xuICBpZiAoZmx1c2ggPT09IFpfRklOSVNIKSB7XG4gICAgLyoqKiBGTFVTSF9CTE9DSyhzLCAxKTsgKioqL1xuICAgIGZsdXNoX2Jsb2NrX29ubHkocywgdHJ1ZSk7XG4gICAgaWYgKHMuc3RybS5hdmFpbF9vdXQgPT09IDApIHtcbiAgICAgIHJldHVybiBCU19GSU5JU0hfU1RBUlRFRDtcbiAgICB9XG4gICAgLyoqKi9cbiAgICByZXR1cm4gQlNfRklOSVNIX0RPTkU7XG4gIH1cbiAgaWYgKHMubGFzdF9saXQpIHtcbiAgICAvKioqIEZMVVNIX0JMT0NLKHMsIDApOyAqKiovXG4gICAgZmx1c2hfYmxvY2tfb25seShzLCBmYWxzZSk7XG4gICAgaWYgKHMuc3RybS5hdmFpbF9vdXQgPT09IDApIHtcbiAgICAgIHJldHVybiBCU19ORUVEX01PUkU7XG4gICAgfVxuICAgIC8qKiovXG4gIH1cblxuICByZXR1cm4gQlNfQkxPQ0tfRE9ORTtcbn1cblxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIEZvciBaX1JMRSwgc2ltcGx5IGxvb2sgZm9yIHJ1bnMgb2YgYnl0ZXMsIGdlbmVyYXRlIG1hdGNoZXMgb25seSBvZiBkaXN0YW5jZVxuICogb25lLiAgRG8gbm90IG1haW50YWluIGEgaGFzaCB0YWJsZS4gIChJdCB3aWxsIGJlIHJlZ2VuZXJhdGVkIGlmIHRoaXMgcnVuIG9mXG4gKiBkZWZsYXRlIHN3aXRjaGVzIGF3YXkgZnJvbSBaX1JMRS4pXG4gKi9cbmZ1bmN0aW9uIGRlZmxhdGVfcmxlKHMsIGZsdXNoKSB7XG4gIHZhciBiZmx1c2g7ICAgICAgICAgICAgLyogc2V0IGlmIGN1cnJlbnQgYmxvY2sgbXVzdCBiZSBmbHVzaGVkICovXG4gIHZhciBwcmV2OyAgICAgICAgICAgICAgLyogYnl0ZSBhdCBkaXN0YW5jZSBvbmUgdG8gbWF0Y2ggKi9cbiAgdmFyIHNjYW4sIHN0cmVuZDsgICAgICAvKiBzY2FuIGdvZXMgdXAgdG8gc3RyZW5kIGZvciBsZW5ndGggb2YgcnVuICovXG5cbiAgdmFyIF93aW4gPSBzLndpbmRvdztcblxuICBmb3IgKDs7KSB7XG4gICAgLyogTWFrZSBzdXJlIHRoYXQgd2UgYWx3YXlzIGhhdmUgZW5vdWdoIGxvb2thaGVhZCwgZXhjZXB0XG4gICAgICogYXQgdGhlIGVuZCBvZiB0aGUgaW5wdXQgZmlsZS4gV2UgbmVlZCBNQVhfTUFUQ0ggYnl0ZXNcbiAgICAgKiBmb3IgdGhlIGxvbmdlc3QgcnVuLCBwbHVzIG9uZSBmb3IgdGhlIHVucm9sbGVkIGxvb3AuXG4gICAgICovXG4gICAgaWYgKHMubG9va2FoZWFkIDw9IE1BWF9NQVRDSCkge1xuICAgICAgZmlsbF93aW5kb3cocyk7XG4gICAgICBpZiAocy5sb29rYWhlYWQgPD0gTUFYX01BVENIICYmIGZsdXNoID09PSBaX05PX0ZMVVNIKSB7XG4gICAgICAgIHJldHVybiBCU19ORUVEX01PUkU7XG4gICAgICB9XG4gICAgICBpZiAocy5sb29rYWhlYWQgPT09IDApIHsgYnJlYWs7IH0gLyogZmx1c2ggdGhlIGN1cnJlbnQgYmxvY2sgKi9cbiAgICB9XG5cbiAgICAvKiBTZWUgaG93IG1hbnkgdGltZXMgdGhlIHByZXZpb3VzIGJ5dGUgcmVwZWF0cyAqL1xuICAgIHMubWF0Y2hfbGVuZ3RoID0gMDtcbiAgICBpZiAocy5sb29rYWhlYWQgPj0gTUlOX01BVENIICYmIHMuc3Ryc3RhcnQgPiAwKSB7XG4gICAgICBzY2FuID0gcy5zdHJzdGFydCAtIDE7XG4gICAgICBwcmV2ID0gX3dpbltzY2FuXTtcbiAgICAgIGlmIChwcmV2ID09PSBfd2luWysrc2Nhbl0gJiYgcHJldiA9PT0gX3dpblsrK3NjYW5dICYmIHByZXYgPT09IF93aW5bKytzY2FuXSkge1xuICAgICAgICBzdHJlbmQgPSBzLnN0cnN0YXJ0ICsgTUFYX01BVENIO1xuICAgICAgICBkbyB7XG4gICAgICAgICAgLypqc2hpbnQgbm9lbXB0eTpmYWxzZSovXG4gICAgICAgIH0gd2hpbGUgKHByZXYgPT09IF93aW5bKytzY2FuXSAmJiBwcmV2ID09PSBfd2luWysrc2Nhbl0gJiZcbiAgICAgICAgICAgICAgICAgcHJldiA9PT0gX3dpblsrK3NjYW5dICYmIHByZXYgPT09IF93aW5bKytzY2FuXSAmJlxuICAgICAgICAgICAgICAgICBwcmV2ID09PSBfd2luWysrc2Nhbl0gJiYgcHJldiA9PT0gX3dpblsrK3NjYW5dICYmXG4gICAgICAgICAgICAgICAgIHByZXYgPT09IF93aW5bKytzY2FuXSAmJiBwcmV2ID09PSBfd2luWysrc2Nhbl0gJiZcbiAgICAgICAgICAgICAgICAgc2NhbiA8IHN0cmVuZCk7XG4gICAgICAgIHMubWF0Y2hfbGVuZ3RoID0gTUFYX01BVENIIC0gKHN0cmVuZCAtIHNjYW4pO1xuICAgICAgICBpZiAocy5tYXRjaF9sZW5ndGggPiBzLmxvb2thaGVhZCkge1xuICAgICAgICAgIHMubWF0Y2hfbGVuZ3RoID0gcy5sb29rYWhlYWQ7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICAgIC8vQXNzZXJ0KHNjYW4gPD0gcy0+d2luZG93Kyh1SW50KShzLT53aW5kb3dfc2l6ZS0xKSwgXCJ3aWxkIHNjYW5cIik7XG4gICAgfVxuXG4gICAgLyogRW1pdCBtYXRjaCBpZiBoYXZlIHJ1biBvZiBNSU5fTUFUQ0ggb3IgbG9uZ2VyLCBlbHNlIGVtaXQgbGl0ZXJhbCAqL1xuICAgIGlmIChzLm1hdGNoX2xlbmd0aCA+PSBNSU5fTUFUQ0gpIHtcbiAgICAgIC8vY2hlY2tfbWF0Y2gocywgcy5zdHJzdGFydCwgcy5zdHJzdGFydCAtIDEsIHMubWF0Y2hfbGVuZ3RoKTtcblxuICAgICAgLyoqKiBfdHJfdGFsbHlfZGlzdChzLCAxLCBzLm1hdGNoX2xlbmd0aCAtIE1JTl9NQVRDSCwgYmZsdXNoKTsgKioqL1xuICAgICAgYmZsdXNoID0gdHJlZXMuX3RyX3RhbGx5KHMsIDEsIHMubWF0Y2hfbGVuZ3RoIC0gTUlOX01BVENIKTtcblxuICAgICAgcy5sb29rYWhlYWQgLT0gcy5tYXRjaF9sZW5ndGg7XG4gICAgICBzLnN0cnN0YXJ0ICs9IHMubWF0Y2hfbGVuZ3RoO1xuICAgICAgcy5tYXRjaF9sZW5ndGggPSAwO1xuICAgIH0gZWxzZSB7XG4gICAgICAvKiBObyBtYXRjaCwgb3V0cHV0IGEgbGl0ZXJhbCBieXRlICovXG4gICAgICAvL1RyYWNldnYoKHN0ZGVycixcIiVjXCIsIHMtPndpbmRvd1tzLT5zdHJzdGFydF0pKTtcbiAgICAgIC8qKiogX3RyX3RhbGx5X2xpdChzLCBzLndpbmRvd1tzLnN0cnN0YXJ0XSwgYmZsdXNoKTsgKioqL1xuICAgICAgYmZsdXNoID0gdHJlZXMuX3RyX3RhbGx5KHMsIDAsIHMud2luZG93W3Muc3Ryc3RhcnRdKTtcblxuICAgICAgcy5sb29rYWhlYWQtLTtcbiAgICAgIHMuc3Ryc3RhcnQrKztcbiAgICB9XG4gICAgaWYgKGJmbHVzaCkge1xuICAgICAgLyoqKiBGTFVTSF9CTE9DSyhzLCAwKTsgKioqL1xuICAgICAgZmx1c2hfYmxvY2tfb25seShzLCBmYWxzZSk7XG4gICAgICBpZiAocy5zdHJtLmF2YWlsX291dCA9PT0gMCkge1xuICAgICAgICByZXR1cm4gQlNfTkVFRF9NT1JFO1xuICAgICAgfVxuICAgICAgLyoqKi9cbiAgICB9XG4gIH1cbiAgcy5pbnNlcnQgPSAwO1xuICBpZiAoZmx1c2ggPT09IFpfRklOSVNIKSB7XG4gICAgLyoqKiBGTFVTSF9CTE9DSyhzLCAxKTsgKioqL1xuICAgIGZsdXNoX2Jsb2NrX29ubHkocywgdHJ1ZSk7XG4gICAgaWYgKHMuc3RybS5hdmFpbF9vdXQgPT09IDApIHtcbiAgICAgIHJldHVybiBCU19GSU5JU0hfU1RBUlRFRDtcbiAgICB9XG4gICAgLyoqKi9cbiAgICByZXR1cm4gQlNfRklOSVNIX0RPTkU7XG4gIH1cbiAgaWYgKHMubGFzdF9saXQpIHtcbiAgICAvKioqIEZMVVNIX0JMT0NLKHMsIDApOyAqKiovXG4gICAgZmx1c2hfYmxvY2tfb25seShzLCBmYWxzZSk7XG4gICAgaWYgKHMuc3RybS5hdmFpbF9vdXQgPT09IDApIHtcbiAgICAgIHJldHVybiBCU19ORUVEX01PUkU7XG4gICAgfVxuICAgIC8qKiovXG4gIH1cbiAgcmV0dXJuIEJTX0JMT0NLX0RPTkU7XG59XG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogRm9yIFpfSFVGRk1BTl9PTkxZLCBkbyBub3QgbG9vayBmb3IgbWF0Y2hlcy4gIERvIG5vdCBtYWludGFpbiBhIGhhc2ggdGFibGUuXG4gKiAoSXQgd2lsbCBiZSByZWdlbmVyYXRlZCBpZiB0aGlzIHJ1biBvZiBkZWZsYXRlIHN3aXRjaGVzIGF3YXkgZnJvbSBIdWZmbWFuLilcbiAqL1xuZnVuY3Rpb24gZGVmbGF0ZV9odWZmKHMsIGZsdXNoKSB7XG4gIHZhciBiZmx1c2g7ICAgICAgICAgICAgIC8qIHNldCBpZiBjdXJyZW50IGJsb2NrIG11c3QgYmUgZmx1c2hlZCAqL1xuXG4gIGZvciAoOzspIHtcbiAgICAvKiBNYWtlIHN1cmUgdGhhdCB3ZSBoYXZlIGEgbGl0ZXJhbCB0byB3cml0ZS4gKi9cbiAgICBpZiAocy5sb29rYWhlYWQgPT09IDApIHtcbiAgICAgIGZpbGxfd2luZG93KHMpO1xuICAgICAgaWYgKHMubG9va2FoZWFkID09PSAwKSB7XG4gICAgICAgIGlmIChmbHVzaCA9PT0gWl9OT19GTFVTSCkge1xuICAgICAgICAgIHJldHVybiBCU19ORUVEX01PUkU7XG4gICAgICAgIH1cbiAgICAgICAgYnJlYWs7ICAgICAgLyogZmx1c2ggdGhlIGN1cnJlbnQgYmxvY2sgKi9cbiAgICAgIH1cbiAgICB9XG5cbiAgICAvKiBPdXRwdXQgYSBsaXRlcmFsIGJ5dGUgKi9cbiAgICBzLm1hdGNoX2xlbmd0aCA9IDA7XG4gICAgLy9UcmFjZXZ2KChzdGRlcnIsXCIlY1wiLCBzLT53aW5kb3dbcy0+c3Ryc3RhcnRdKSk7XG4gICAgLyoqKiBfdHJfdGFsbHlfbGl0KHMsIHMud2luZG93W3Muc3Ryc3RhcnRdLCBiZmx1c2gpOyAqKiovXG4gICAgYmZsdXNoID0gdHJlZXMuX3RyX3RhbGx5KHMsIDAsIHMud2luZG93W3Muc3Ryc3RhcnRdKTtcbiAgICBzLmxvb2thaGVhZC0tO1xuICAgIHMuc3Ryc3RhcnQrKztcbiAgICBpZiAoYmZsdXNoKSB7XG4gICAgICAvKioqIEZMVVNIX0JMT0NLKHMsIDApOyAqKiovXG4gICAgICBmbHVzaF9ibG9ja19vbmx5KHMsIGZhbHNlKTtcbiAgICAgIGlmIChzLnN0cm0uYXZhaWxfb3V0ID09PSAwKSB7XG4gICAgICAgIHJldHVybiBCU19ORUVEX01PUkU7XG4gICAgICB9XG4gICAgICAvKioqL1xuICAgIH1cbiAgfVxuICBzLmluc2VydCA9IDA7XG4gIGlmIChmbHVzaCA9PT0gWl9GSU5JU0gpIHtcbiAgICAvKioqIEZMVVNIX0JMT0NLKHMsIDEpOyAqKiovXG4gICAgZmx1c2hfYmxvY2tfb25seShzLCB0cnVlKTtcbiAgICBpZiAocy5zdHJtLmF2YWlsX291dCA9PT0gMCkge1xuICAgICAgcmV0dXJuIEJTX0ZJTklTSF9TVEFSVEVEO1xuICAgIH1cbiAgICAvKioqL1xuICAgIHJldHVybiBCU19GSU5JU0hfRE9ORTtcbiAgfVxuICBpZiAocy5sYXN0X2xpdCkge1xuICAgIC8qKiogRkxVU0hfQkxPQ0socywgMCk7ICoqKi9cbiAgICBmbHVzaF9ibG9ja19vbmx5KHMsIGZhbHNlKTtcbiAgICBpZiAocy5zdHJtLmF2YWlsX291dCA9PT0gMCkge1xuICAgICAgcmV0dXJuIEJTX05FRURfTU9SRTtcbiAgICB9XG4gICAgLyoqKi9cbiAgfVxuICByZXR1cm4gQlNfQkxPQ0tfRE9ORTtcbn1cblxuLyogVmFsdWVzIGZvciBtYXhfbGF6eV9tYXRjaCwgZ29vZF9tYXRjaCBhbmQgbWF4X2NoYWluX2xlbmd0aCwgZGVwZW5kaW5nIG9uXG4gKiB0aGUgZGVzaXJlZCBwYWNrIGxldmVsICgwLi45KS4gVGhlIHZhbHVlcyBnaXZlbiBiZWxvdyBoYXZlIGJlZW4gdHVuZWQgdG9cbiAqIGV4Y2x1ZGUgd29yc3QgY2FzZSBwZXJmb3JtYW5jZSBmb3IgcGF0aG9sb2dpY2FsIGZpbGVzLiBCZXR0ZXIgdmFsdWVzIG1heSBiZVxuICogZm91bmQgZm9yIHNwZWNpZmljIGZpbGVzLlxuICovXG5mdW5jdGlvbiBDb25maWcoZ29vZF9sZW5ndGgsIG1heF9sYXp5LCBuaWNlX2xlbmd0aCwgbWF4X2NoYWluLCBmdW5jKSB7XG4gIHRoaXMuZ29vZF9sZW5ndGggPSBnb29kX2xlbmd0aDtcbiAgdGhpcy5tYXhfbGF6eSA9IG1heF9sYXp5O1xuICB0aGlzLm5pY2VfbGVuZ3RoID0gbmljZV9sZW5ndGg7XG4gIHRoaXMubWF4X2NoYWluID0gbWF4X2NoYWluO1xuICB0aGlzLmZ1bmMgPSBmdW5jO1xufVxuXG52YXIgY29uZmlndXJhdGlvbl90YWJsZTtcblxuY29uZmlndXJhdGlvbl90YWJsZSA9IFtcbiAgLyogICAgICBnb29kIGxhenkgbmljZSBjaGFpbiAqL1xuICBuZXcgQ29uZmlnKDAsIDAsIDAsIDAsIGRlZmxhdGVfc3RvcmVkKSwgICAgICAgICAgLyogMCBzdG9yZSBvbmx5ICovXG4gIG5ldyBDb25maWcoNCwgNCwgOCwgNCwgZGVmbGF0ZV9mYXN0KSwgICAgICAgICAgICAvKiAxIG1heCBzcGVlZCwgbm8gbGF6eSBtYXRjaGVzICovXG4gIG5ldyBDb25maWcoNCwgNSwgMTYsIDgsIGRlZmxhdGVfZmFzdCksICAgICAgICAgICAvKiAyICovXG4gIG5ldyBDb25maWcoNCwgNiwgMzIsIDMyLCBkZWZsYXRlX2Zhc3QpLCAgICAgICAgICAvKiAzICovXG5cbiAgbmV3IENvbmZpZyg0LCA0LCAxNiwgMTYsIGRlZmxhdGVfc2xvdyksICAgICAgICAgIC8qIDQgbGF6eSBtYXRjaGVzICovXG4gIG5ldyBDb25maWcoOCwgMTYsIDMyLCAzMiwgZGVmbGF0ZV9zbG93KSwgICAgICAgICAvKiA1ICovXG4gIG5ldyBDb25maWcoOCwgMTYsIDEyOCwgMTI4LCBkZWZsYXRlX3Nsb3cpLCAgICAgICAvKiA2ICovXG4gIG5ldyBDb25maWcoOCwgMzIsIDEyOCwgMjU2LCBkZWZsYXRlX3Nsb3cpLCAgICAgICAvKiA3ICovXG4gIG5ldyBDb25maWcoMzIsIDEyOCwgMjU4LCAxMDI0LCBkZWZsYXRlX3Nsb3cpLCAgICAvKiA4ICovXG4gIG5ldyBDb25maWcoMzIsIDI1OCwgMjU4LCA0MDk2LCBkZWZsYXRlX3Nsb3cpICAgICAvKiA5IG1heCBjb21wcmVzc2lvbiAqL1xuXTtcblxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIEluaXRpYWxpemUgdGhlIFwibG9uZ2VzdCBtYXRjaFwiIHJvdXRpbmVzIGZvciBhIG5ldyB6bGliIHN0cmVhbVxuICovXG5mdW5jdGlvbiBsbV9pbml0KHMpIHtcbiAgcy53aW5kb3dfc2l6ZSA9IDIgKiBzLndfc2l6ZTtcblxuICAvKioqIENMRUFSX0hBU0gocyk7ICoqKi9cbiAgemVybyhzLmhlYWQpOyAvLyBGaWxsIHdpdGggTklMICg9IDApO1xuXG4gIC8qIFNldCB0aGUgZGVmYXVsdCBjb25maWd1cmF0aW9uIHBhcmFtZXRlcnM6XG4gICAqL1xuICBzLm1heF9sYXp5X21hdGNoID0gY29uZmlndXJhdGlvbl90YWJsZVtzLmxldmVsXS5tYXhfbGF6eTtcbiAgcy5nb29kX21hdGNoID0gY29uZmlndXJhdGlvbl90YWJsZVtzLmxldmVsXS5nb29kX2xlbmd0aDtcbiAgcy5uaWNlX21hdGNoID0gY29uZmlndXJhdGlvbl90YWJsZVtzLmxldmVsXS5uaWNlX2xlbmd0aDtcbiAgcy5tYXhfY2hhaW5fbGVuZ3RoID0gY29uZmlndXJhdGlvbl90YWJsZVtzLmxldmVsXS5tYXhfY2hhaW47XG5cbiAgcy5zdHJzdGFydCA9IDA7XG4gIHMuYmxvY2tfc3RhcnQgPSAwO1xuICBzLmxvb2thaGVhZCA9IDA7XG4gIHMuaW5zZXJ0ID0gMDtcbiAgcy5tYXRjaF9sZW5ndGggPSBzLnByZXZfbGVuZ3RoID0gTUlOX01BVENIIC0gMTtcbiAgcy5tYXRjaF9hdmFpbGFibGUgPSAwO1xuICBzLmluc19oID0gMDtcbn1cblxuXG5mdW5jdGlvbiBEZWZsYXRlU3RhdGUoKSB7XG4gIHRoaXMuc3RybSA9IG51bGw7ICAgICAgICAgICAgLyogcG9pbnRlciBiYWNrIHRvIHRoaXMgemxpYiBzdHJlYW0gKi9cbiAgdGhpcy5zdGF0dXMgPSAwOyAgICAgICAgICAgIC8qIGFzIHRoZSBuYW1lIGltcGxpZXMgKi9cbiAgdGhpcy5wZW5kaW5nX2J1ZiA9IG51bGw7ICAgICAgLyogb3V0cHV0IHN0aWxsIHBlbmRpbmcgKi9cbiAgdGhpcy5wZW5kaW5nX2J1Zl9zaXplID0gMDsgIC8qIHNpemUgb2YgcGVuZGluZ19idWYgKi9cbiAgdGhpcy5wZW5kaW5nX291dCA9IDA7ICAgICAgIC8qIG5leHQgcGVuZGluZyBieXRlIHRvIG91dHB1dCB0byB0aGUgc3RyZWFtICovXG4gIHRoaXMucGVuZGluZyA9IDA7ICAgICAgICAgICAvKiBuYiBvZiBieXRlcyBpbiB0aGUgcGVuZGluZyBidWZmZXIgKi9cbiAgdGhpcy53cmFwID0gMDsgICAgICAgICAgICAgIC8qIGJpdCAwIHRydWUgZm9yIHpsaWIsIGJpdCAxIHRydWUgZm9yIGd6aXAgKi9cbiAgdGhpcy5nemhlYWQgPSBudWxsOyAgICAgICAgIC8qIGd6aXAgaGVhZGVyIGluZm9ybWF0aW9uIHRvIHdyaXRlICovXG4gIHRoaXMuZ3ppbmRleCA9IDA7ICAgICAgICAgICAvKiB3aGVyZSBpbiBleHRyYSwgbmFtZSwgb3IgY29tbWVudCAqL1xuICB0aGlzLm1ldGhvZCA9IFpfREVGTEFURUQ7IC8qIGNhbiBvbmx5IGJlIERFRkxBVEVEICovXG4gIHRoaXMubGFzdF9mbHVzaCA9IC0xOyAgIC8qIHZhbHVlIG9mIGZsdXNoIHBhcmFtIGZvciBwcmV2aW91cyBkZWZsYXRlIGNhbGwgKi9cblxuICB0aGlzLndfc2l6ZSA9IDA7ICAvKiBMWjc3IHdpbmRvdyBzaXplICgzMksgYnkgZGVmYXVsdCkgKi9cbiAgdGhpcy53X2JpdHMgPSAwOyAgLyogbG9nMih3X3NpemUpICAoOC4uMTYpICovXG4gIHRoaXMud19tYXNrID0gMDsgIC8qIHdfc2l6ZSAtIDEgKi9cblxuICB0aGlzLndpbmRvdyA9IG51bGw7XG4gIC8qIFNsaWRpbmcgd2luZG93LiBJbnB1dCBieXRlcyBhcmUgcmVhZCBpbnRvIHRoZSBzZWNvbmQgaGFsZiBvZiB0aGUgd2luZG93LFxuICAgKiBhbmQgbW92ZSB0byB0aGUgZmlyc3QgaGFsZiBsYXRlciB0byBrZWVwIGEgZGljdGlvbmFyeSBvZiBhdCBsZWFzdCB3U2l6ZVxuICAgKiBieXRlcy4gV2l0aCB0aGlzIG9yZ2FuaXphdGlvbiwgbWF0Y2hlcyBhcmUgbGltaXRlZCB0byBhIGRpc3RhbmNlIG9mXG4gICAqIHdTaXplLU1BWF9NQVRDSCBieXRlcywgYnV0IHRoaXMgZW5zdXJlcyB0aGF0IElPIGlzIGFsd2F5c1xuICAgKiBwZXJmb3JtZWQgd2l0aCBhIGxlbmd0aCBtdWx0aXBsZSBvZiB0aGUgYmxvY2sgc2l6ZS5cbiAgICovXG5cbiAgdGhpcy53aW5kb3dfc2l6ZSA9IDA7XG4gIC8qIEFjdHVhbCBzaXplIG9mIHdpbmRvdzogMip3U2l6ZSwgZXhjZXB0IHdoZW4gdGhlIHVzZXIgaW5wdXQgYnVmZmVyXG4gICAqIGlzIGRpcmVjdGx5IHVzZWQgYXMgc2xpZGluZyB3aW5kb3cuXG4gICAqL1xuXG4gIHRoaXMucHJldiA9IG51bGw7XG4gIC8qIExpbmsgdG8gb2xkZXIgc3RyaW5nIHdpdGggc2FtZSBoYXNoIGluZGV4LiBUbyBsaW1pdCB0aGUgc2l6ZSBvZiB0aGlzXG4gICAqIGFycmF5IHRvIDY0SywgdGhpcyBsaW5rIGlzIG1haW50YWluZWQgb25seSBmb3IgdGhlIGxhc3QgMzJLIHN0cmluZ3MuXG4gICAqIEFuIGluZGV4IGluIHRoaXMgYXJyYXkgaXMgdGh1cyBhIHdpbmRvdyBpbmRleCBtb2R1bG8gMzJLLlxuICAgKi9cblxuICB0aGlzLmhlYWQgPSBudWxsOyAgIC8qIEhlYWRzIG9mIHRoZSBoYXNoIGNoYWlucyBvciBOSUwuICovXG5cbiAgdGhpcy5pbnNfaCA9IDA7ICAgICAgIC8qIGhhc2ggaW5kZXggb2Ygc3RyaW5nIHRvIGJlIGluc2VydGVkICovXG4gIHRoaXMuaGFzaF9zaXplID0gMDsgICAvKiBudW1iZXIgb2YgZWxlbWVudHMgaW4gaGFzaCB0YWJsZSAqL1xuICB0aGlzLmhhc2hfYml0cyA9IDA7ICAgLyogbG9nMihoYXNoX3NpemUpICovXG4gIHRoaXMuaGFzaF9tYXNrID0gMDsgICAvKiBoYXNoX3NpemUtMSAqL1xuXG4gIHRoaXMuaGFzaF9zaGlmdCA9IDA7XG4gIC8qIE51bWJlciBvZiBiaXRzIGJ5IHdoaWNoIGluc19oIG11c3QgYmUgc2hpZnRlZCBhdCBlYWNoIGlucHV0XG4gICAqIHN0ZXAuIEl0IG11c3QgYmUgc3VjaCB0aGF0IGFmdGVyIE1JTl9NQVRDSCBzdGVwcywgdGhlIG9sZGVzdFxuICAgKiBieXRlIG5vIGxvbmdlciB0YWtlcyBwYXJ0IGluIHRoZSBoYXNoIGtleSwgdGhhdCBpczpcbiAgICogICBoYXNoX3NoaWZ0ICogTUlOX01BVENIID49IGhhc2hfYml0c1xuICAgKi9cblxuICB0aGlzLmJsb2NrX3N0YXJ0ID0gMDtcbiAgLyogV2luZG93IHBvc2l0aW9uIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIGN1cnJlbnQgb3V0cHV0IGJsb2NrLiBHZXRzXG4gICAqIG5lZ2F0aXZlIHdoZW4gdGhlIHdpbmRvdyBpcyBtb3ZlZCBiYWNrd2FyZHMuXG4gICAqL1xuXG4gIHRoaXMubWF0Y2hfbGVuZ3RoID0gMDsgICAgICAvKiBsZW5ndGggb2YgYmVzdCBtYXRjaCAqL1xuICB0aGlzLnByZXZfbWF0Y2ggPSAwOyAgICAgICAgLyogcHJldmlvdXMgbWF0Y2ggKi9cbiAgdGhpcy5tYXRjaF9hdmFpbGFibGUgPSAwOyAgIC8qIHNldCBpZiBwcmV2aW91cyBtYXRjaCBleGlzdHMgKi9cbiAgdGhpcy5zdHJzdGFydCA9IDA7ICAgICAgICAgIC8qIHN0YXJ0IG9mIHN0cmluZyB0byBpbnNlcnQgKi9cbiAgdGhpcy5tYXRjaF9zdGFydCA9IDA7ICAgICAgIC8qIHN0YXJ0IG9mIG1hdGNoaW5nIHN0cmluZyAqL1xuICB0aGlzLmxvb2thaGVhZCA9IDA7ICAgICAgICAgLyogbnVtYmVyIG9mIHZhbGlkIGJ5dGVzIGFoZWFkIGluIHdpbmRvdyAqL1xuXG4gIHRoaXMucHJldl9sZW5ndGggPSAwO1xuICAvKiBMZW5ndGggb2YgdGhlIGJlc3QgbWF0Y2ggYXQgcHJldmlvdXMgc3RlcC4gTWF0Y2hlcyBub3QgZ3JlYXRlciB0aGFuIHRoaXNcbiAgICogYXJlIGRpc2NhcmRlZC4gVGhpcyBpcyB1c2VkIGluIHRoZSBsYXp5IG1hdGNoIGV2YWx1YXRpb24uXG4gICAqL1xuXG4gIHRoaXMubWF4X2NoYWluX2xlbmd0aCA9IDA7XG4gIC8qIFRvIHNwZWVkIHVwIGRlZmxhdGlvbiwgaGFzaCBjaGFpbnMgYXJlIG5ldmVyIHNlYXJjaGVkIGJleW9uZCB0aGlzXG4gICAqIGxlbmd0aC4gIEEgaGlnaGVyIGxpbWl0IGltcHJvdmVzIGNvbXByZXNzaW9uIHJhdGlvIGJ1dCBkZWdyYWRlcyB0aGVcbiAgICogc3BlZWQuXG4gICAqL1xuXG4gIHRoaXMubWF4X2xhenlfbWF0Y2ggPSAwO1xuICAvKiBBdHRlbXB0IHRvIGZpbmQgYSBiZXR0ZXIgbWF0Y2ggb25seSB3aGVuIHRoZSBjdXJyZW50IG1hdGNoIGlzIHN0cmljdGx5XG4gICAqIHNtYWxsZXIgdGhhbiB0aGlzIHZhbHVlLiBUaGlzIG1lY2hhbmlzbSBpcyB1c2VkIG9ubHkgZm9yIGNvbXByZXNzaW9uXG4gICAqIGxldmVscyA+PSA0LlxuICAgKi9cbiAgLy8gVGhhdCdzIGFsaWFzIHRvIG1heF9sYXp5X21hdGNoLCBkb24ndCB1c2UgZGlyZWN0bHlcbiAgLy90aGlzLm1heF9pbnNlcnRfbGVuZ3RoID0gMDtcbiAgLyogSW5zZXJ0IG5ldyBzdHJpbmdzIGluIHRoZSBoYXNoIHRhYmxlIG9ubHkgaWYgdGhlIG1hdGNoIGxlbmd0aCBpcyBub3RcbiAgICogZ3JlYXRlciB0aGFuIHRoaXMgbGVuZ3RoLiBUaGlzIHNhdmVzIHRpbWUgYnV0IGRlZ3JhZGVzIGNvbXByZXNzaW9uLlxuICAgKiBtYXhfaW5zZXJ0X2xlbmd0aCBpcyB1c2VkIG9ubHkgZm9yIGNvbXByZXNzaW9uIGxldmVscyA8PSAzLlxuICAgKi9cblxuICB0aGlzLmxldmVsID0gMDsgICAgIC8qIGNvbXByZXNzaW9uIGxldmVsICgxLi45KSAqL1xuICB0aGlzLnN0cmF0ZWd5ID0gMDsgIC8qIGZhdm9yIG9yIGZvcmNlIEh1ZmZtYW4gY29kaW5nKi9cblxuICB0aGlzLmdvb2RfbWF0Y2ggPSAwO1xuICAvKiBVc2UgYSBmYXN0ZXIgc2VhcmNoIHdoZW4gdGhlIHByZXZpb3VzIG1hdGNoIGlzIGxvbmdlciB0aGFuIHRoaXMgKi9cblxuICB0aGlzLm5pY2VfbWF0Y2ggPSAwOyAvKiBTdG9wIHNlYXJjaGluZyB3aGVuIGN1cnJlbnQgbWF0Y2ggZXhjZWVkcyB0aGlzICovXG5cbiAgICAgICAgICAgICAgLyogdXNlZCBieSB0cmVlcy5jOiAqL1xuXG4gIC8qIERpZG4ndCB1c2UgY3RfZGF0YSB0eXBlZGVmIGJlbG93IHRvIHN1cHByZXNzIGNvbXBpbGVyIHdhcm5pbmcgKi9cblxuICAvLyBzdHJ1Y3QgY3RfZGF0YV9zIGR5bl9sdHJlZVtIRUFQX1NJWkVdOyAgIC8qIGxpdGVyYWwgYW5kIGxlbmd0aCB0cmVlICovXG4gIC8vIHN0cnVjdCBjdF9kYXRhX3MgZHluX2R0cmVlWzIqRF9DT0RFUysxXTsgLyogZGlzdGFuY2UgdHJlZSAqL1xuICAvLyBzdHJ1Y3QgY3RfZGF0YV9zIGJsX3RyZWVbMipCTF9DT0RFUysxXTsgIC8qIEh1ZmZtYW4gdHJlZSBmb3IgYml0IGxlbmd0aHMgKi9cblxuICAvLyBVc2UgZmxhdCBhcnJheSBvZiBET1VCTEUgc2l6ZSwgd2l0aCBpbnRlcmxlYXZlZCBmYXRhLFxuICAvLyBiZWNhdXNlIEpTIGRvZXMgbm90IHN1cHBvcnQgZWZmZWN0aXZlXG4gIHRoaXMuZHluX2x0cmVlICA9IG5ldyB1dGlscy5CdWYxNihIRUFQX1NJWkUgKiAyKTtcbiAgdGhpcy5keW5fZHRyZWUgID0gbmV3IHV0aWxzLkJ1ZjE2KCgyICogRF9DT0RFUyArIDEpICogMik7XG4gIHRoaXMuYmxfdHJlZSAgICA9IG5ldyB1dGlscy5CdWYxNigoMiAqIEJMX0NPREVTICsgMSkgKiAyKTtcbiAgemVybyh0aGlzLmR5bl9sdHJlZSk7XG4gIHplcm8odGhpcy5keW5fZHRyZWUpO1xuICB6ZXJvKHRoaXMuYmxfdHJlZSk7XG5cbiAgdGhpcy5sX2Rlc2MgICA9IG51bGw7ICAgICAgICAgLyogZGVzYy4gZm9yIGxpdGVyYWwgdHJlZSAqL1xuICB0aGlzLmRfZGVzYyAgID0gbnVsbDsgICAgICAgICAvKiBkZXNjLiBmb3IgZGlzdGFuY2UgdHJlZSAqL1xuICB0aGlzLmJsX2Rlc2MgID0gbnVsbDsgICAgICAgICAvKiBkZXNjLiBmb3IgYml0IGxlbmd0aCB0cmVlICovXG5cbiAgLy91c2ggYmxfY291bnRbTUFYX0JJVFMrMV07XG4gIHRoaXMuYmxfY291bnQgPSBuZXcgdXRpbHMuQnVmMTYoTUFYX0JJVFMgKyAxKTtcbiAgLyogbnVtYmVyIG9mIGNvZGVzIGF0IGVhY2ggYml0IGxlbmd0aCBmb3IgYW4gb3B0aW1hbCB0cmVlICovXG5cbiAgLy9pbnQgaGVhcFsyKkxfQ09ERVMrMV07ICAgICAgLyogaGVhcCB1c2VkIHRvIGJ1aWxkIHRoZSBIdWZmbWFuIHRyZWVzICovXG4gIHRoaXMuaGVhcCA9IG5ldyB1dGlscy5CdWYxNigyICogTF9DT0RFUyArIDEpOyAgLyogaGVhcCB1c2VkIHRvIGJ1aWxkIHRoZSBIdWZmbWFuIHRyZWVzICovXG4gIHplcm8odGhpcy5oZWFwKTtcblxuICB0aGlzLmhlYXBfbGVuID0gMDsgICAgICAgICAgICAgICAvKiBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGhlYXAgKi9cbiAgdGhpcy5oZWFwX21heCA9IDA7ICAgICAgICAgICAgICAgLyogZWxlbWVudCBvZiBsYXJnZXN0IGZyZXF1ZW5jeSAqL1xuICAvKiBUaGUgc29ucyBvZiBoZWFwW25dIGFyZSBoZWFwWzIqbl0gYW5kIGhlYXBbMipuKzFdLiBoZWFwWzBdIGlzIG5vdCB1c2VkLlxuICAgKiBUaGUgc2FtZSBoZWFwIGFycmF5IGlzIHVzZWQgdG8gYnVpbGQgYWxsIHRyZWVzLlxuICAgKi9cblxuICB0aGlzLmRlcHRoID0gbmV3IHV0aWxzLkJ1ZjE2KDIgKiBMX0NPREVTICsgMSk7IC8vdWNoIGRlcHRoWzIqTF9DT0RFUysxXTtcbiAgemVybyh0aGlzLmRlcHRoKTtcbiAgLyogRGVwdGggb2YgZWFjaCBzdWJ0cmVlIHVzZWQgYXMgdGllIGJyZWFrZXIgZm9yIHRyZWVzIG9mIGVxdWFsIGZyZXF1ZW5jeVxuICAgKi9cblxuICB0aGlzLmxfYnVmID0gMDsgICAgICAgICAgLyogYnVmZmVyIGluZGV4IGZvciBsaXRlcmFscyBvciBsZW5ndGhzICovXG5cbiAgdGhpcy5saXRfYnVmc2l6ZSA9IDA7XG4gIC8qIFNpemUgb2YgbWF0Y2ggYnVmZmVyIGZvciBsaXRlcmFscy9sZW5ndGhzLiAgVGhlcmUgYXJlIDQgcmVhc29ucyBmb3JcbiAgICogbGltaXRpbmcgbGl0X2J1ZnNpemUgdG8gNjRLOlxuICAgKiAgIC0gZnJlcXVlbmNpZXMgY2FuIGJlIGtlcHQgaW4gMTYgYml0IGNvdW50ZXJzXG4gICAqICAgLSBpZiBjb21wcmVzc2lvbiBpcyBub3Qgc3VjY2Vzc2Z1bCBmb3IgdGhlIGZpcnN0IGJsb2NrLCBhbGwgaW5wdXRcbiAgICogICAgIGRhdGEgaXMgc3RpbGwgaW4gdGhlIHdpbmRvdyBzbyB3ZSBjYW4gc3RpbGwgZW1pdCBhIHN0b3JlZCBibG9jayBldmVuXG4gICAqICAgICB3aGVuIGlucHV0IGNvbWVzIGZyb20gc3RhbmRhcmQgaW5wdXQuICAoVGhpcyBjYW4gYWxzbyBiZSBkb25lIGZvclxuICAgKiAgICAgYWxsIGJsb2NrcyBpZiBsaXRfYnVmc2l6ZSBpcyBub3QgZ3JlYXRlciB0aGFuIDMySy4pXG4gICAqICAgLSBpZiBjb21wcmVzc2lvbiBpcyBub3Qgc3VjY2Vzc2Z1bCBmb3IgYSBmaWxlIHNtYWxsZXIgdGhhbiA2NEssIHdlIGNhblxuICAgKiAgICAgZXZlbiBlbWl0IGEgc3RvcmVkIGZpbGUgaW5zdGVhZCBvZiBhIHN0b3JlZCBibG9jayAoc2F2aW5nIDUgYnl0ZXMpLlxuICAgKiAgICAgVGhpcyBpcyBhcHBsaWNhYmxlIG9ubHkgZm9yIHppcCAobm90IGd6aXAgb3IgemxpYikuXG4gICAqICAgLSBjcmVhdGluZyBuZXcgSHVmZm1hbiB0cmVlcyBsZXNzIGZyZXF1ZW50bHkgbWF5IG5vdCBwcm92aWRlIGZhc3RcbiAgICogICAgIGFkYXB0YXRpb24gdG8gY2hhbmdlcyBpbiB0aGUgaW5wdXQgZGF0YSBzdGF0aXN0aWNzLiAoVGFrZSBmb3JcbiAgICogICAgIGV4YW1wbGUgYSBiaW5hcnkgZmlsZSB3aXRoIHBvb3JseSBjb21wcmVzc2libGUgY29kZSBmb2xsb3dlZCBieVxuICAgKiAgICAgYSBoaWdobHkgY29tcHJlc3NpYmxlIHN0cmluZyB0YWJsZS4pIFNtYWxsZXIgYnVmZmVyIHNpemVzIGdpdmVcbiAgICogICAgIGZhc3QgYWRhcHRhdGlvbiBidXQgaGF2ZSBvZiBjb3Vyc2UgdGhlIG92ZXJoZWFkIG9mIHRyYW5zbWl0dGluZ1xuICAgKiAgICAgdHJlZXMgbW9yZSBmcmVxdWVudGx5LlxuICAgKiAgIC0gSSBjYW4ndCBjb3VudCBhYm92ZSA0XG4gICAqL1xuXG4gIHRoaXMubGFzdF9saXQgPSAwOyAgICAgIC8qIHJ1bm5pbmcgaW5kZXggaW4gbF9idWYgKi9cblxuICB0aGlzLmRfYnVmID0gMDtcbiAgLyogQnVmZmVyIGluZGV4IGZvciBkaXN0YW5jZXMuIFRvIHNpbXBsaWZ5IHRoZSBjb2RlLCBkX2J1ZiBhbmQgbF9idWYgaGF2ZVxuICAgKiB0aGUgc2FtZSBudW1iZXIgb2YgZWxlbWVudHMuIFRvIHVzZSBkaWZmZXJlbnQgbGVuZ3RocywgYW4gZXh0cmEgZmxhZ1xuICAgKiBhcnJheSB3b3VsZCBiZSBuZWNlc3NhcnkuXG4gICAqL1xuXG4gIHRoaXMub3B0X2xlbiA9IDA7ICAgICAgIC8qIGJpdCBsZW5ndGggb2YgY3VycmVudCBibG9jayB3aXRoIG9wdGltYWwgdHJlZXMgKi9cbiAgdGhpcy5zdGF0aWNfbGVuID0gMDsgICAgLyogYml0IGxlbmd0aCBvZiBjdXJyZW50IGJsb2NrIHdpdGggc3RhdGljIHRyZWVzICovXG4gIHRoaXMubWF0Y2hlcyA9IDA7ICAgICAgIC8qIG51bWJlciBvZiBzdHJpbmcgbWF0Y2hlcyBpbiBjdXJyZW50IGJsb2NrICovXG4gIHRoaXMuaW5zZXJ0ID0gMDsgICAgICAgIC8qIGJ5dGVzIGF0IGVuZCBvZiB3aW5kb3cgbGVmdCB0byBpbnNlcnQgKi9cblxuXG4gIHRoaXMuYmlfYnVmID0gMDtcbiAgLyogT3V0cHV0IGJ1ZmZlci4gYml0cyBhcmUgaW5zZXJ0ZWQgc3RhcnRpbmcgYXQgdGhlIGJvdHRvbSAobGVhc3RcbiAgICogc2lnbmlmaWNhbnQgYml0cykuXG4gICAqL1xuICB0aGlzLmJpX3ZhbGlkID0gMDtcbiAgLyogTnVtYmVyIG9mIHZhbGlkIGJpdHMgaW4gYmlfYnVmLiAgQWxsIGJpdHMgYWJvdmUgdGhlIGxhc3QgdmFsaWQgYml0XG4gICAqIGFyZSBhbHdheXMgemVyby5cbiAgICovXG5cbiAgLy8gVXNlZCBmb3Igd2luZG93IG1lbW9yeSBpbml0LiBXZSBzYWZlbHkgaWdub3JlIGl0IGZvciBKUy4gVGhhdCBtYWtlc1xuICAvLyBzZW5zZSBvbmx5IGZvciBwb2ludGVycyBhbmQgbWVtb3J5IGNoZWNrIHRvb2xzLlxuICAvL3RoaXMuaGlnaF93YXRlciA9IDA7XG4gIC8qIEhpZ2ggd2F0ZXIgbWFyayBvZmZzZXQgaW4gd2luZG93IGZvciBpbml0aWFsaXplZCBieXRlcyAtLSBieXRlcyBhYm92ZVxuICAgKiB0aGlzIGFyZSBzZXQgdG8gemVybyBpbiBvcmRlciB0byBhdm9pZCBtZW1vcnkgY2hlY2sgd2FybmluZ3Mgd2hlblxuICAgKiBsb25nZXN0IG1hdGNoIHJvdXRpbmVzIGFjY2VzcyBieXRlcyBwYXN0IHRoZSBpbnB1dC4gIFRoaXMgaXMgdGhlblxuICAgKiB1cGRhdGVkIHRvIHRoZSBuZXcgaGlnaCB3YXRlciBtYXJrLlxuICAgKi9cbn1cblxuXG5mdW5jdGlvbiBkZWZsYXRlUmVzZXRLZWVwKHN0cm0pIHtcbiAgdmFyIHM7XG5cbiAgaWYgKCFzdHJtIHx8ICFzdHJtLnN0YXRlKSB7XG4gICAgcmV0dXJuIGVycihzdHJtLCBaX1NUUkVBTV9FUlJPUik7XG4gIH1cblxuICBzdHJtLnRvdGFsX2luID0gc3RybS50b3RhbF9vdXQgPSAwO1xuICBzdHJtLmRhdGFfdHlwZSA9IFpfVU5LTk9XTjtcblxuICBzID0gc3RybS5zdGF0ZTtcbiAgcy5wZW5kaW5nID0gMDtcbiAgcy5wZW5kaW5nX291dCA9IDA7XG5cbiAgaWYgKHMud3JhcCA8IDApIHtcbiAgICBzLndyYXAgPSAtcy53cmFwO1xuICAgIC8qIHdhcyBtYWRlIG5lZ2F0aXZlIGJ5IGRlZmxhdGUoLi4uLCBaX0ZJTklTSCk7ICovXG4gIH1cbiAgcy5zdGF0dXMgPSAocy53cmFwID8gSU5JVF9TVEFURSA6IEJVU1lfU1RBVEUpO1xuICBzdHJtLmFkbGVyID0gKHMud3JhcCA9PT0gMikgP1xuICAgIDAgIC8vIGNyYzMyKDAsIFpfTlVMTCwgMClcbiAgOlxuICAgIDE7IC8vIGFkbGVyMzIoMCwgWl9OVUxMLCAwKVxuICBzLmxhc3RfZmx1c2ggPSBaX05PX0ZMVVNIO1xuICB0cmVlcy5fdHJfaW5pdChzKTtcbiAgcmV0dXJuIFpfT0s7XG59XG5cblxuZnVuY3Rpb24gZGVmbGF0ZVJlc2V0KHN0cm0pIHtcbiAgdmFyIHJldCA9IGRlZmxhdGVSZXNldEtlZXAoc3RybSk7XG4gIGlmIChyZXQgPT09IFpfT0spIHtcbiAgICBsbV9pbml0KHN0cm0uc3RhdGUpO1xuICB9XG4gIHJldHVybiByZXQ7XG59XG5cblxuZnVuY3Rpb24gZGVmbGF0ZVNldEhlYWRlcihzdHJtLCBoZWFkKSB7XG4gIGlmICghc3RybSB8fCAhc3RybS5zdGF0ZSkgeyByZXR1cm4gWl9TVFJFQU1fRVJST1I7IH1cbiAgaWYgKHN0cm0uc3RhdGUud3JhcCAhPT0gMikgeyByZXR1cm4gWl9TVFJFQU1fRVJST1I7IH1cbiAgc3RybS5zdGF0ZS5nemhlYWQgPSBoZWFkO1xuICByZXR1cm4gWl9PSztcbn1cblxuXG5mdW5jdGlvbiBkZWZsYXRlSW5pdDIoc3RybSwgbGV2ZWwsIG1ldGhvZCwgd2luZG93Qml0cywgbWVtTGV2ZWwsIHN0cmF0ZWd5KSB7XG4gIGlmICghc3RybSkgeyAvLyA9PT0gWl9OVUxMXG4gICAgcmV0dXJuIFpfU1RSRUFNX0VSUk9SO1xuICB9XG4gIHZhciB3cmFwID0gMTtcblxuICBpZiAobGV2ZWwgPT09IFpfREVGQVVMVF9DT01QUkVTU0lPTikge1xuICAgIGxldmVsID0gNjtcbiAgfVxuXG4gIGlmICh3aW5kb3dCaXRzIDwgMCkgeyAvKiBzdXBwcmVzcyB6bGliIHdyYXBwZXIgKi9cbiAgICB3cmFwID0gMDtcbiAgICB3aW5kb3dCaXRzID0gLXdpbmRvd0JpdHM7XG4gIH1cblxuICBlbHNlIGlmICh3aW5kb3dCaXRzID4gMTUpIHtcbiAgICB3cmFwID0gMjsgICAgICAgICAgIC8qIHdyaXRlIGd6aXAgd3JhcHBlciBpbnN0ZWFkICovXG4gICAgd2luZG93Qml0cyAtPSAxNjtcbiAgfVxuXG5cbiAgaWYgKG1lbUxldmVsIDwgMSB8fCBtZW1MZXZlbCA+IE1BWF9NRU1fTEVWRUwgfHwgbWV0aG9kICE9PSBaX0RFRkxBVEVEIHx8XG4gICAgd2luZG93Qml0cyA8IDggfHwgd2luZG93Qml0cyA+IDE1IHx8IGxldmVsIDwgMCB8fCBsZXZlbCA+IDkgfHxcbiAgICBzdHJhdGVneSA8IDAgfHwgc3RyYXRlZ3kgPiBaX0ZJWEVEKSB7XG4gICAgcmV0dXJuIGVycihzdHJtLCBaX1NUUkVBTV9FUlJPUik7XG4gIH1cblxuXG4gIGlmICh3aW5kb3dCaXRzID09PSA4KSB7XG4gICAgd2luZG93Qml0cyA9IDk7XG4gIH1cbiAgLyogdW50aWwgMjU2LWJ5dGUgd2luZG93IGJ1ZyBmaXhlZCAqL1xuXG4gIHZhciBzID0gbmV3IERlZmxhdGVTdGF0ZSgpO1xuXG4gIHN0cm0uc3RhdGUgPSBzO1xuICBzLnN0cm0gPSBzdHJtO1xuXG4gIHMud3JhcCA9IHdyYXA7XG4gIHMuZ3poZWFkID0gbnVsbDtcbiAgcy53X2JpdHMgPSB3aW5kb3dCaXRzO1xuICBzLndfc2l6ZSA9IDEgPDwgcy53X2JpdHM7XG4gIHMud19tYXNrID0gcy53X3NpemUgLSAxO1xuXG4gIHMuaGFzaF9iaXRzID0gbWVtTGV2ZWwgKyA3O1xuICBzLmhhc2hfc2l6ZSA9IDEgPDwgcy5oYXNoX2JpdHM7XG4gIHMuaGFzaF9tYXNrID0gcy5oYXNoX3NpemUgLSAxO1xuICBzLmhhc2hfc2hpZnQgPSB+figocy5oYXNoX2JpdHMgKyBNSU5fTUFUQ0ggLSAxKSAvIE1JTl9NQVRDSCk7XG5cbiAgcy53aW5kb3cgPSBuZXcgdXRpbHMuQnVmOChzLndfc2l6ZSAqIDIpO1xuICBzLmhlYWQgPSBuZXcgdXRpbHMuQnVmMTYocy5oYXNoX3NpemUpO1xuICBzLnByZXYgPSBuZXcgdXRpbHMuQnVmMTYocy53X3NpemUpO1xuXG4gIC8vIERvbid0IG5lZWQgbWVtIGluaXQgbWFnaWMgZm9yIEpTLlxuICAvL3MuaGlnaF93YXRlciA9IDA7ICAvKiBub3RoaW5nIHdyaXR0ZW4gdG8gcy0+d2luZG93IHlldCAqL1xuXG4gIHMubGl0X2J1ZnNpemUgPSAxIDw8IChtZW1MZXZlbCArIDYpOyAvKiAxNksgZWxlbWVudHMgYnkgZGVmYXVsdCAqL1xuXG4gIHMucGVuZGluZ19idWZfc2l6ZSA9IHMubGl0X2J1ZnNpemUgKiA0O1xuXG4gIC8vb3ZlcmxheSA9ICh1c2hmICopIFpBTExPQyhzdHJtLCBzLT5saXRfYnVmc2l6ZSwgc2l6ZW9mKHVzaCkrMik7XG4gIC8vcy0+cGVuZGluZ19idWYgPSAodWNoZiAqKSBvdmVybGF5O1xuICBzLnBlbmRpbmdfYnVmID0gbmV3IHV0aWxzLkJ1Zjgocy5wZW5kaW5nX2J1Zl9zaXplKTtcblxuICAvLyBJdCBpcyBvZmZzZXQgZnJvbSBgcy5wZW5kaW5nX2J1ZmAgKHNpemUgaXMgYHMubGl0X2J1ZnNpemUgKiAyYClcbiAgLy9zLT5kX2J1ZiA9IG92ZXJsYXkgKyBzLT5saXRfYnVmc2l6ZS9zaXplb2YodXNoKTtcbiAgcy5kX2J1ZiA9IDEgKiBzLmxpdF9idWZzaXplO1xuXG4gIC8vcy0+bF9idWYgPSBzLT5wZW5kaW5nX2J1ZiArICgxK3NpemVvZih1c2gpKSpzLT5saXRfYnVmc2l6ZTtcbiAgcy5sX2J1ZiA9ICgxICsgMikgKiBzLmxpdF9idWZzaXplO1xuXG4gIHMubGV2ZWwgPSBsZXZlbDtcbiAgcy5zdHJhdGVneSA9IHN0cmF0ZWd5O1xuICBzLm1ldGhvZCA9IG1ldGhvZDtcblxuICByZXR1cm4gZGVmbGF0ZVJlc2V0KHN0cm0pO1xufVxuXG5mdW5jdGlvbiBkZWZsYXRlSW5pdChzdHJtLCBsZXZlbCkge1xuICByZXR1cm4gZGVmbGF0ZUluaXQyKHN0cm0sIGxldmVsLCBaX0RFRkxBVEVELCBNQVhfV0JJVFMsIERFRl9NRU1fTEVWRUwsIFpfREVGQVVMVF9TVFJBVEVHWSk7XG59XG5cblxuZnVuY3Rpb24gZGVmbGF0ZShzdHJtLCBmbHVzaCkge1xuICB2YXIgb2xkX2ZsdXNoLCBzO1xuICB2YXIgYmVnLCB2YWw7IC8vIGZvciBnemlwIGhlYWRlciB3cml0ZSBvbmx5XG5cbiAgaWYgKCFzdHJtIHx8ICFzdHJtLnN0YXRlIHx8XG4gICAgZmx1c2ggPiBaX0JMT0NLIHx8IGZsdXNoIDwgMCkge1xuICAgIHJldHVybiBzdHJtID8gZXJyKHN0cm0sIFpfU1RSRUFNX0VSUk9SKSA6IFpfU1RSRUFNX0VSUk9SO1xuICB9XG5cbiAgcyA9IHN0cm0uc3RhdGU7XG5cbiAgaWYgKCFzdHJtLm91dHB1dCB8fFxuICAgICAgKCFzdHJtLmlucHV0ICYmIHN0cm0uYXZhaWxfaW4gIT09IDApIHx8XG4gICAgICAocy5zdGF0dXMgPT09IEZJTklTSF9TVEFURSAmJiBmbHVzaCAhPT0gWl9GSU5JU0gpKSB7XG4gICAgcmV0dXJuIGVycihzdHJtLCAoc3RybS5hdmFpbF9vdXQgPT09IDApID8gWl9CVUZfRVJST1IgOiBaX1NUUkVBTV9FUlJPUik7XG4gIH1cblxuICBzLnN0cm0gPSBzdHJtOyAvKiBqdXN0IGluIGNhc2UgKi9cbiAgb2xkX2ZsdXNoID0gcy5sYXN0X2ZsdXNoO1xuICBzLmxhc3RfZmx1c2ggPSBmbHVzaDtcblxuICAvKiBXcml0ZSB0aGUgaGVhZGVyICovXG4gIGlmIChzLnN0YXR1cyA9PT0gSU5JVF9TVEFURSkge1xuXG4gICAgaWYgKHMud3JhcCA9PT0gMikgeyAvLyBHWklQIGhlYWRlclxuICAgICAgc3RybS5hZGxlciA9IDA7ICAvL2NyYzMyKDBMLCBaX05VTEwsIDApO1xuICAgICAgcHV0X2J5dGUocywgMzEpO1xuICAgICAgcHV0X2J5dGUocywgMTM5KTtcbiAgICAgIHB1dF9ieXRlKHMsIDgpO1xuICAgICAgaWYgKCFzLmd6aGVhZCkgeyAvLyBzLT5nemhlYWQgPT0gWl9OVUxMXG4gICAgICAgIHB1dF9ieXRlKHMsIDApO1xuICAgICAgICBwdXRfYnl0ZShzLCAwKTtcbiAgICAgICAgcHV0X2J5dGUocywgMCk7XG4gICAgICAgIHB1dF9ieXRlKHMsIDApO1xuICAgICAgICBwdXRfYnl0ZShzLCAwKTtcbiAgICAgICAgcHV0X2J5dGUocywgcy5sZXZlbCA9PT0gOSA/IDIgOlxuICAgICAgICAgICAgICAgICAgICAocy5zdHJhdGVneSA+PSBaX0hVRkZNQU5fT05MWSB8fCBzLmxldmVsIDwgMiA/XG4gICAgICAgICAgICAgICAgICAgICA0IDogMCkpO1xuICAgICAgICBwdXRfYnl0ZShzLCBPU19DT0RFKTtcbiAgICAgICAgcy5zdGF0dXMgPSBCVVNZX1NUQVRFO1xuICAgICAgfVxuICAgICAgZWxzZSB7XG4gICAgICAgIHB1dF9ieXRlKHMsIChzLmd6aGVhZC50ZXh0ID8gMSA6IDApICtcbiAgICAgICAgICAgICAgICAgICAgKHMuZ3poZWFkLmhjcmMgPyAyIDogMCkgK1xuICAgICAgICAgICAgICAgICAgICAoIXMuZ3poZWFkLmV4dHJhID8gMCA6IDQpICtcbiAgICAgICAgICAgICAgICAgICAgKCFzLmd6aGVhZC5uYW1lID8gMCA6IDgpICtcbiAgICAgICAgICAgICAgICAgICAgKCFzLmd6aGVhZC5jb21tZW50ID8gMCA6IDE2KVxuICAgICAgICAgICAgICAgICk7XG4gICAgICAgIHB1dF9ieXRlKHMsIHMuZ3poZWFkLnRpbWUgJiAweGZmKTtcbiAgICAgICAgcHV0X2J5dGUocywgKHMuZ3poZWFkLnRpbWUgPj4gOCkgJiAweGZmKTtcbiAgICAgICAgcHV0X2J5dGUocywgKHMuZ3poZWFkLnRpbWUgPj4gMTYpICYgMHhmZik7XG4gICAgICAgIHB1dF9ieXRlKHMsIChzLmd6aGVhZC50aW1lID4+IDI0KSAmIDB4ZmYpO1xuICAgICAgICBwdXRfYnl0ZShzLCBzLmxldmVsID09PSA5ID8gMiA6XG4gICAgICAgICAgICAgICAgICAgIChzLnN0cmF0ZWd5ID49IFpfSFVGRk1BTl9PTkxZIHx8IHMubGV2ZWwgPCAyID9cbiAgICAgICAgICAgICAgICAgICAgIDQgOiAwKSk7XG4gICAgICAgIHB1dF9ieXRlKHMsIHMuZ3poZWFkLm9zICYgMHhmZik7XG4gICAgICAgIGlmIChzLmd6aGVhZC5leHRyYSAmJiBzLmd6aGVhZC5leHRyYS5sZW5ndGgpIHtcbiAgICAgICAgICBwdXRfYnl0ZShzLCBzLmd6aGVhZC5leHRyYS5sZW5ndGggJiAweGZmKTtcbiAgICAgICAgICBwdXRfYnl0ZShzLCAocy5nemhlYWQuZXh0cmEubGVuZ3RoID4+IDgpICYgMHhmZik7XG4gICAgICAgIH1cbiAgICAgICAgaWYgKHMuZ3poZWFkLmhjcmMpIHtcbiAgICAgICAgICBzdHJtLmFkbGVyID0gY3JjMzIoc3RybS5hZGxlciwgcy5wZW5kaW5nX2J1Ziwgcy5wZW5kaW5nLCAwKTtcbiAgICAgICAgfVxuICAgICAgICBzLmd6aW5kZXggPSAwO1xuICAgICAgICBzLnN0YXR1cyA9IEVYVFJBX1NUQVRFO1xuICAgICAgfVxuICAgIH1cbiAgICBlbHNlIC8vIERFRkxBVEUgaGVhZGVyXG4gICAge1xuICAgICAgdmFyIGhlYWRlciA9IChaX0RFRkxBVEVEICsgKChzLndfYml0cyAtIDgpIDw8IDQpKSA8PCA4O1xuICAgICAgdmFyIGxldmVsX2ZsYWdzID0gLTE7XG5cbiAgICAgIGlmIChzLnN0cmF0ZWd5ID49IFpfSFVGRk1BTl9PTkxZIHx8IHMubGV2ZWwgPCAyKSB7XG4gICAgICAgIGxldmVsX2ZsYWdzID0gMDtcbiAgICAgIH0gZWxzZSBpZiAocy5sZXZlbCA8IDYpIHtcbiAgICAgICAgbGV2ZWxfZmxhZ3MgPSAxO1xuICAgICAgfSBlbHNlIGlmIChzLmxldmVsID09PSA2KSB7XG4gICAgICAgIGxldmVsX2ZsYWdzID0gMjtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIGxldmVsX2ZsYWdzID0gMztcbiAgICAgIH1cbiAgICAgIGhlYWRlciB8PSAobGV2ZWxfZmxhZ3MgPDwgNik7XG4gICAgICBpZiAocy5zdHJzdGFydCAhPT0gMCkgeyBoZWFkZXIgfD0gUFJFU0VUX0RJQ1Q7IH1cbiAgICAgIGhlYWRlciArPSAzMSAtIChoZWFkZXIgJSAzMSk7XG5cbiAgICAgIHMuc3RhdHVzID0gQlVTWV9TVEFURTtcbiAgICAgIHB1dFNob3J0TVNCKHMsIGhlYWRlcik7XG5cbiAgICAgIC8qIFNhdmUgdGhlIGFkbGVyMzIgb2YgdGhlIHByZXNldCBkaWN0aW9uYXJ5OiAqL1xuICAgICAgaWYgKHMuc3Ryc3RhcnQgIT09IDApIHtcbiAgICAgICAgcHV0U2hvcnRNU0Iocywgc3RybS5hZGxlciA+Pj4gMTYpO1xuICAgICAgICBwdXRTaG9ydE1TQihzLCBzdHJtLmFkbGVyICYgMHhmZmZmKTtcbiAgICAgIH1cbiAgICAgIHN0cm0uYWRsZXIgPSAxOyAvLyBhZGxlcjMyKDBMLCBaX05VTEwsIDApO1xuICAgIH1cbiAgfVxuXG4vLyNpZmRlZiBHWklQXG4gIGlmIChzLnN0YXR1cyA9PT0gRVhUUkFfU1RBVEUpIHtcbiAgICBpZiAocy5nemhlYWQuZXh0cmEvKiAhPSBaX05VTEwqLykge1xuICAgICAgYmVnID0gcy5wZW5kaW5nOyAgLyogc3RhcnQgb2YgYnl0ZXMgdG8gdXBkYXRlIGNyYyAqL1xuXG4gICAgICB3aGlsZSAocy5nemluZGV4IDwgKHMuZ3poZWFkLmV4dHJhLmxlbmd0aCAmIDB4ZmZmZikpIHtcbiAgICAgICAgaWYgKHMucGVuZGluZyA9PT0gcy5wZW5kaW5nX2J1Zl9zaXplKSB7XG4gICAgICAgICAgaWYgKHMuZ3poZWFkLmhjcmMgJiYgcy5wZW5kaW5nID4gYmVnKSB7XG4gICAgICAgICAgICBzdHJtLmFkbGVyID0gY3JjMzIoc3RybS5hZGxlciwgcy5wZW5kaW5nX2J1Ziwgcy5wZW5kaW5nIC0gYmVnLCBiZWcpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBmbHVzaF9wZW5kaW5nKHN0cm0pO1xuICAgICAgICAgIGJlZyA9IHMucGVuZGluZztcbiAgICAgICAgICBpZiAocy5wZW5kaW5nID09PSBzLnBlbmRpbmdfYnVmX3NpemUpIHtcbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBwdXRfYnl0ZShzLCBzLmd6aGVhZC5leHRyYVtzLmd6aW5kZXhdICYgMHhmZik7XG4gICAgICAgIHMuZ3ppbmRleCsrO1xuICAgICAgfVxuICAgICAgaWYgKHMuZ3poZWFkLmhjcmMgJiYgcy5wZW5kaW5nID4gYmVnKSB7XG4gICAgICAgIHN0cm0uYWRsZXIgPSBjcmMzMihzdHJtLmFkbGVyLCBzLnBlbmRpbmdfYnVmLCBzLnBlbmRpbmcgLSBiZWcsIGJlZyk7XG4gICAgICB9XG4gICAgICBpZiAocy5nemluZGV4ID09PSBzLmd6aGVhZC5leHRyYS5sZW5ndGgpIHtcbiAgICAgICAgcy5nemluZGV4ID0gMDtcbiAgICAgICAgcy5zdGF0dXMgPSBOQU1FX1NUQVRFO1xuICAgICAgfVxuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgIHMuc3RhdHVzID0gTkFNRV9TVEFURTtcbiAgICB9XG4gIH1cbiAgaWYgKHMuc3RhdHVzID09PSBOQU1FX1NUQVRFKSB7XG4gICAgaWYgKHMuZ3poZWFkLm5hbWUvKiAhPSBaX05VTEwqLykge1xuICAgICAgYmVnID0gcy5wZW5kaW5nOyAgLyogc3RhcnQgb2YgYnl0ZXMgdG8gdXBkYXRlIGNyYyAqL1xuICAgICAgLy9pbnQgdmFsO1xuXG4gICAgICBkbyB7XG4gICAgICAgIGlmIChzLnBlbmRpbmcgPT09IHMucGVuZGluZ19idWZfc2l6ZSkge1xuICAgICAgICAgIGlmIChzLmd6aGVhZC5oY3JjICYmIHMucGVuZGluZyA+IGJlZykge1xuICAgICAgICAgICAgc3RybS5hZGxlciA9IGNyYzMyKHN0cm0uYWRsZXIsIHMucGVuZGluZ19idWYsIHMucGVuZGluZyAtIGJlZywgYmVnKTtcbiAgICAgICAgICB9XG4gICAgICAgICAgZmx1c2hfcGVuZGluZyhzdHJtKTtcbiAgICAgICAgICBiZWcgPSBzLnBlbmRpbmc7XG4gICAgICAgICAgaWYgKHMucGVuZGluZyA9PT0gcy5wZW5kaW5nX2J1Zl9zaXplKSB7XG4gICAgICAgICAgICB2YWwgPSAxO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIC8vIEpTIHNwZWNpZmljOiBsaXR0bGUgbWFnaWMgdG8gYWRkIHplcm8gdGVybWluYXRvciB0byBlbmQgb2Ygc3RyaW5nXG4gICAgICAgIGlmIChzLmd6aW5kZXggPCBzLmd6aGVhZC5uYW1lLmxlbmd0aCkge1xuICAgICAgICAgIHZhbCA9IHMuZ3poZWFkLm5hbWUuY2hhckNvZGVBdChzLmd6aW5kZXgrKykgJiAweGZmO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIHZhbCA9IDA7XG4gICAgICAgIH1cbiAgICAgICAgcHV0X2J5dGUocywgdmFsKTtcbiAgICAgIH0gd2hpbGUgKHZhbCAhPT0gMCk7XG5cbiAgICAgIGlmIChzLmd6aGVhZC5oY3JjICYmIHMucGVuZGluZyA+IGJlZykge1xuICAgICAgICBzdHJtLmFkbGVyID0gY3JjMzIoc3RybS5hZGxlciwgcy5wZW5kaW5nX2J1Ziwgcy5wZW5kaW5nIC0gYmVnLCBiZWcpO1xuICAgICAgfVxuICAgICAgaWYgKHZhbCA9PT0gMCkge1xuICAgICAgICBzLmd6aW5kZXggPSAwO1xuICAgICAgICBzLnN0YXR1cyA9IENPTU1FTlRfU1RBVEU7XG4gICAgICB9XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgcy5zdGF0dXMgPSBDT01NRU5UX1NUQVRFO1xuICAgIH1cbiAgfVxuICBpZiAocy5zdGF0dXMgPT09IENPTU1FTlRfU1RBVEUpIHtcbiAgICBpZiAocy5nemhlYWQuY29tbWVudC8qICE9IFpfTlVMTCovKSB7XG4gICAgICBiZWcgPSBzLnBlbmRpbmc7ICAvKiBzdGFydCBvZiBieXRlcyB0byB1cGRhdGUgY3JjICovXG4gICAgICAvL2ludCB2YWw7XG5cbiAgICAgIGRvIHtcbiAgICAgICAgaWYgKHMucGVuZGluZyA9PT0gcy5wZW5kaW5nX2J1Zl9zaXplKSB7XG4gICAgICAgICAgaWYgKHMuZ3poZWFkLmhjcmMgJiYgcy5wZW5kaW5nID4gYmVnKSB7XG4gICAgICAgICAgICBzdHJtLmFkbGVyID0gY3JjMzIoc3RybS5hZGxlciwgcy5wZW5kaW5nX2J1Ziwgcy5wZW5kaW5nIC0gYmVnLCBiZWcpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBmbHVzaF9wZW5kaW5nKHN0cm0pO1xuICAgICAgICAgIGJlZyA9IHMucGVuZGluZztcbiAgICAgICAgICBpZiAocy5wZW5kaW5nID09PSBzLnBlbmRpbmdfYnVmX3NpemUpIHtcbiAgICAgICAgICAgIHZhbCA9IDE7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgLy8gSlMgc3BlY2lmaWM6IGxpdHRsZSBtYWdpYyB0byBhZGQgemVybyB0ZXJtaW5hdG9yIHRvIGVuZCBvZiBzdHJpbmdcbiAgICAgICAgaWYgKHMuZ3ppbmRleCA8IHMuZ3poZWFkLmNvbW1lbnQubGVuZ3RoKSB7XG4gICAgICAgICAgdmFsID0gcy5nemhlYWQuY29tbWVudC5jaGFyQ29kZUF0KHMuZ3ppbmRleCsrKSAmIDB4ZmY7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgdmFsID0gMDtcbiAgICAgICAgfVxuICAgICAgICBwdXRfYnl0ZShzLCB2YWwpO1xuICAgICAgfSB3aGlsZSAodmFsICE9PSAwKTtcblxuICAgICAgaWYgKHMuZ3poZWFkLmhjcmMgJiYgcy5wZW5kaW5nID4gYmVnKSB7XG4gICAgICAgIHN0cm0uYWRsZXIgPSBjcmMzMihzdHJtLmFkbGVyLCBzLnBlbmRpbmdfYnVmLCBzLnBlbmRpbmcgLSBiZWcsIGJlZyk7XG4gICAgICB9XG4gICAgICBpZiAodmFsID09PSAwKSB7XG4gICAgICAgIHMuc3RhdHVzID0gSENSQ19TVEFURTtcbiAgICAgIH1cbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICBzLnN0YXR1cyA9IEhDUkNfU1RBVEU7XG4gICAgfVxuICB9XG4gIGlmIChzLnN0YXR1cyA9PT0gSENSQ19TVEFURSkge1xuICAgIGlmIChzLmd6aGVhZC5oY3JjKSB7XG4gICAgICBpZiAocy5wZW5kaW5nICsgMiA+IHMucGVuZGluZ19idWZfc2l6ZSkge1xuICAgICAgICBmbHVzaF9wZW5kaW5nKHN0cm0pO1xuICAgICAgfVxuICAgICAgaWYgKHMucGVuZGluZyArIDIgPD0gcy5wZW5kaW5nX2J1Zl9zaXplKSB7XG4gICAgICAgIHB1dF9ieXRlKHMsIHN0cm0uYWRsZXIgJiAweGZmKTtcbiAgICAgICAgcHV0X2J5dGUocywgKHN0cm0uYWRsZXIgPj4gOCkgJiAweGZmKTtcbiAgICAgICAgc3RybS5hZGxlciA9IDA7IC8vY3JjMzIoMEwsIFpfTlVMTCwgMCk7XG4gICAgICAgIHMuc3RhdHVzID0gQlVTWV9TVEFURTtcbiAgICAgIH1cbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICBzLnN0YXR1cyA9IEJVU1lfU1RBVEU7XG4gICAgfVxuICB9XG4vLyNlbmRpZlxuXG4gIC8qIEZsdXNoIGFzIG11Y2ggcGVuZGluZyBvdXRwdXQgYXMgcG9zc2libGUgKi9cbiAgaWYgKHMucGVuZGluZyAhPT0gMCkge1xuICAgIGZsdXNoX3BlbmRpbmcoc3RybSk7XG4gICAgaWYgKHN0cm0uYXZhaWxfb3V0ID09PSAwKSB7XG4gICAgICAvKiBTaW5jZSBhdmFpbF9vdXQgaXMgMCwgZGVmbGF0ZSB3aWxsIGJlIGNhbGxlZCBhZ2FpbiB3aXRoXG4gICAgICAgKiBtb3JlIG91dHB1dCBzcGFjZSwgYnV0IHBvc3NpYmx5IHdpdGggYm90aCBwZW5kaW5nIGFuZFxuICAgICAgICogYXZhaWxfaW4gZXF1YWwgdG8gemVyby4gVGhlcmUgd29uJ3QgYmUgYW55dGhpbmcgdG8gZG8sXG4gICAgICAgKiBidXQgdGhpcyBpcyBub3QgYW4gZXJyb3Igc2l0dWF0aW9uIHNvIG1ha2Ugc3VyZSB3ZVxuICAgICAgICogcmV0dXJuIE9LIGluc3RlYWQgb2YgQlVGX0VSUk9SIGF0IG5leHQgY2FsbCBvZiBkZWZsYXRlOlxuICAgICAgICovXG4gICAgICBzLmxhc3RfZmx1c2ggPSAtMTtcbiAgICAgIHJldHVybiBaX09LO1xuICAgIH1cblxuICAgIC8qIE1ha2Ugc3VyZSB0aGVyZSBpcyBzb21ldGhpbmcgdG8gZG8gYW5kIGF2b2lkIGR1cGxpY2F0ZSBjb25zZWN1dGl2ZVxuICAgICAqIGZsdXNoZXMuIEZvciByZXBlYXRlZCBhbmQgdXNlbGVzcyBjYWxscyB3aXRoIFpfRklOSVNILCB3ZSBrZWVwXG4gICAgICogcmV0dXJuaW5nIFpfU1RSRUFNX0VORCBpbnN0ZWFkIG9mIFpfQlVGX0VSUk9SLlxuICAgICAqL1xuICB9IGVsc2UgaWYgKHN0cm0uYXZhaWxfaW4gPT09IDAgJiYgcmFuayhmbHVzaCkgPD0gcmFuayhvbGRfZmx1c2gpICYmXG4gICAgZmx1c2ggIT09IFpfRklOSVNIKSB7XG4gICAgcmV0dXJuIGVycihzdHJtLCBaX0JVRl9FUlJPUik7XG4gIH1cblxuICAvKiBVc2VyIG11c3Qgbm90IHByb3ZpZGUgbW9yZSBpbnB1dCBhZnRlciB0aGUgZmlyc3QgRklOSVNIOiAqL1xuICBpZiAocy5zdGF0dXMgPT09IEZJTklTSF9TVEFURSAmJiBzdHJtLmF2YWlsX2luICE9PSAwKSB7XG4gICAgcmV0dXJuIGVycihzdHJtLCBaX0JVRl9FUlJPUik7XG4gIH1cblxuICAvKiBTdGFydCBhIG5ldyBibG9jayBvciBjb250aW51ZSB0aGUgY3VycmVudCBvbmUuXG4gICAqL1xuICBpZiAoc3RybS5hdmFpbF9pbiAhPT0gMCB8fCBzLmxvb2thaGVhZCAhPT0gMCB8fFxuICAgIChmbHVzaCAhPT0gWl9OT19GTFVTSCAmJiBzLnN0YXR1cyAhPT0gRklOSVNIX1NUQVRFKSkge1xuICAgIHZhciBic3RhdGUgPSAocy5zdHJhdGVneSA9PT0gWl9IVUZGTUFOX09OTFkpID8gZGVmbGF0ZV9odWZmKHMsIGZsdXNoKSA6XG4gICAgICAocy5zdHJhdGVneSA9PT0gWl9STEUgPyBkZWZsYXRlX3JsZShzLCBmbHVzaCkgOlxuICAgICAgICBjb25maWd1cmF0aW9uX3RhYmxlW3MubGV2ZWxdLmZ1bmMocywgZmx1c2gpKTtcblxuICAgIGlmIChic3RhdGUgPT09IEJTX0ZJTklTSF9TVEFSVEVEIHx8IGJzdGF0ZSA9PT0gQlNfRklOSVNIX0RPTkUpIHtcbiAgICAgIHMuc3RhdHVzID0gRklOSVNIX1NUQVRFO1xuICAgIH1cbiAgICBpZiAoYnN0YXRlID09PSBCU19ORUVEX01PUkUgfHwgYnN0YXRlID09PSBCU19GSU5JU0hfU1RBUlRFRCkge1xuICAgICAgaWYgKHN0cm0uYXZhaWxfb3V0ID09PSAwKSB7XG4gICAgICAgIHMubGFzdF9mbHVzaCA9IC0xO1xuICAgICAgICAvKiBhdm9pZCBCVUZfRVJST1IgbmV4dCBjYWxsLCBzZWUgYWJvdmUgKi9cbiAgICAgIH1cbiAgICAgIHJldHVybiBaX09LO1xuICAgICAgLyogSWYgZmx1c2ggIT0gWl9OT19GTFVTSCAmJiBhdmFpbF9vdXQgPT0gMCwgdGhlIG5leHQgY2FsbFxuICAgICAgICogb2YgZGVmbGF0ZSBzaG91bGQgdXNlIHRoZSBzYW1lIGZsdXNoIHBhcmFtZXRlciB0byBtYWtlIHN1cmVcbiAgICAgICAqIHRoYXQgdGhlIGZsdXNoIGlzIGNvbXBsZXRlLiBTbyB3ZSBkb24ndCBoYXZlIHRvIG91dHB1dCBhblxuICAgICAgICogZW1wdHkgYmxvY2sgaGVyZSwgdGhpcyB3aWxsIGJlIGRvbmUgYXQgbmV4dCBjYWxsLiBUaGlzIGFsc29cbiAgICAgICAqIGVuc3VyZXMgdGhhdCBmb3IgYSB2ZXJ5IHNtYWxsIG91dHB1dCBidWZmZXIsIHdlIGVtaXQgYXQgbW9zdFxuICAgICAgICogb25lIGVtcHR5IGJsb2NrLlxuICAgICAgICovXG4gICAgfVxuICAgIGlmIChic3RhdGUgPT09IEJTX0JMT0NLX0RPTkUpIHtcbiAgICAgIGlmIChmbHVzaCA9PT0gWl9QQVJUSUFMX0ZMVVNIKSB7XG4gICAgICAgIHRyZWVzLl90cl9hbGlnbihzKTtcbiAgICAgIH1cbiAgICAgIGVsc2UgaWYgKGZsdXNoICE9PSBaX0JMT0NLKSB7IC8qIEZVTExfRkxVU0ggb3IgU1lOQ19GTFVTSCAqL1xuXG4gICAgICAgIHRyZWVzLl90cl9zdG9yZWRfYmxvY2socywgMCwgMCwgZmFsc2UpO1xuICAgICAgICAvKiBGb3IgYSBmdWxsIGZsdXNoLCB0aGlzIGVtcHR5IGJsb2NrIHdpbGwgYmUgcmVjb2duaXplZFxuICAgICAgICAgKiBhcyBhIHNwZWNpYWwgbWFya2VyIGJ5IGluZmxhdGVfc3luYygpLlxuICAgICAgICAgKi9cbiAgICAgICAgaWYgKGZsdXNoID09PSBaX0ZVTExfRkxVU0gpIHtcbiAgICAgICAgICAvKioqIENMRUFSX0hBU0gocyk7ICoqKi8gICAgICAgICAgICAgLyogZm9yZ2V0IGhpc3RvcnkgKi9cbiAgICAgICAgICB6ZXJvKHMuaGVhZCk7IC8vIEZpbGwgd2l0aCBOSUwgKD0gMCk7XG5cbiAgICAgICAgICBpZiAocy5sb29rYWhlYWQgPT09IDApIHtcbiAgICAgICAgICAgIHMuc3Ryc3RhcnQgPSAwO1xuICAgICAgICAgICAgcy5ibG9ja19zdGFydCA9IDA7XG4gICAgICAgICAgICBzLmluc2VydCA9IDA7XG4gICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBmbHVzaF9wZW5kaW5nKHN0cm0pO1xuICAgICAgaWYgKHN0cm0uYXZhaWxfb3V0ID09PSAwKSB7XG4gICAgICAgIHMubGFzdF9mbHVzaCA9IC0xOyAvKiBhdm9pZCBCVUZfRVJST1IgYXQgbmV4dCBjYWxsLCBzZWUgYWJvdmUgKi9cbiAgICAgICAgcmV0dXJuIFpfT0s7XG4gICAgICB9XG4gICAgfVxuICB9XG4gIC8vQXNzZXJ0KHN0cm0tPmF2YWlsX291dCA+IDAsIFwiYnVnMlwiKTtcbiAgLy9pZiAoc3RybS5hdmFpbF9vdXQgPD0gMCkgeyB0aHJvdyBuZXcgRXJyb3IoXCJidWcyXCIpO31cblxuICBpZiAoZmx1c2ggIT09IFpfRklOSVNIKSB7IHJldHVybiBaX09LOyB9XG4gIGlmIChzLndyYXAgPD0gMCkgeyByZXR1cm4gWl9TVFJFQU1fRU5EOyB9XG5cbiAgLyogV3JpdGUgdGhlIHRyYWlsZXIgKi9cbiAgaWYgKHMud3JhcCA9PT0gMikge1xuICAgIHB1dF9ieXRlKHMsIHN0cm0uYWRsZXIgJiAweGZmKTtcbiAgICBwdXRfYnl0ZShzLCAoc3RybS5hZGxlciA+PiA4KSAmIDB4ZmYpO1xuICAgIHB1dF9ieXRlKHMsIChzdHJtLmFkbGVyID4+IDE2KSAmIDB4ZmYpO1xuICAgIHB1dF9ieXRlKHMsIChzdHJtLmFkbGVyID4+IDI0KSAmIDB4ZmYpO1xuICAgIHB1dF9ieXRlKHMsIHN0cm0udG90YWxfaW4gJiAweGZmKTtcbiAgICBwdXRfYnl0ZShzLCAoc3RybS50b3RhbF9pbiA+PiA4KSAmIDB4ZmYpO1xuICAgIHB1dF9ieXRlKHMsIChzdHJtLnRvdGFsX2luID4+IDE2KSAmIDB4ZmYpO1xuICAgIHB1dF9ieXRlKHMsIChzdHJtLnRvdGFsX2luID4+IDI0KSAmIDB4ZmYpO1xuICB9XG4gIGVsc2VcbiAge1xuICAgIHB1dFNob3J0TVNCKHMsIHN0cm0uYWRsZXIgPj4+IDE2KTtcbiAgICBwdXRTaG9ydE1TQihzLCBzdHJtLmFkbGVyICYgMHhmZmZmKTtcbiAgfVxuXG4gIGZsdXNoX3BlbmRpbmcoc3RybSk7XG4gIC8qIElmIGF2YWlsX291dCBpcyB6ZXJvLCB0aGUgYXBwbGljYXRpb24gd2lsbCBjYWxsIGRlZmxhdGUgYWdhaW5cbiAgICogdG8gZmx1c2ggdGhlIHJlc3QuXG4gICAqL1xuICBpZiAocy53cmFwID4gMCkgeyBzLndyYXAgPSAtcy53cmFwOyB9XG4gIC8qIHdyaXRlIHRoZSB0cmFpbGVyIG9ubHkgb25jZSEgKi9cbiAgcmV0dXJuIHMucGVuZGluZyAhPT0gMCA/IFpfT0sgOiBaX1NUUkVBTV9FTkQ7XG59XG5cbmZ1bmN0aW9uIGRlZmxhdGVFbmQoc3RybSkge1xuICB2YXIgc3RhdHVzO1xuXG4gIGlmICghc3RybS8qPT0gWl9OVUxMKi8gfHwgIXN0cm0uc3RhdGUvKj09IFpfTlVMTCovKSB7XG4gICAgcmV0dXJuIFpfU1RSRUFNX0VSUk9SO1xuICB9XG5cbiAgc3RhdHVzID0gc3RybS5zdGF0ZS5zdGF0dXM7XG4gIGlmIChzdGF0dXMgIT09IElOSVRfU1RBVEUgJiZcbiAgICBzdGF0dXMgIT09IEVYVFJBX1NUQVRFICYmXG4gICAgc3RhdHVzICE9PSBOQU1FX1NUQVRFICYmXG4gICAgc3RhdHVzICE9PSBDT01NRU5UX1NUQVRFICYmXG4gICAgc3RhdHVzICE9PSBIQ1JDX1NUQVRFICYmXG4gICAgc3RhdHVzICE9PSBCVVNZX1NUQVRFICYmXG4gICAgc3RhdHVzICE9PSBGSU5JU0hfU1RBVEVcbiAgKSB7XG4gICAgcmV0dXJuIGVycihzdHJtLCBaX1NUUkVBTV9FUlJPUik7XG4gIH1cblxuICBzdHJtLnN0YXRlID0gbnVsbDtcblxuICByZXR1cm4gc3RhdHVzID09PSBCVVNZX1NUQVRFID8gZXJyKHN0cm0sIFpfREFUQV9FUlJPUikgOiBaX09LO1xufVxuXG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIEluaXRpYWxpemVzIHRoZSBjb21wcmVzc2lvbiBkaWN0aW9uYXJ5IGZyb20gdGhlIGdpdmVuIGJ5dGVcbiAqIHNlcXVlbmNlIHdpdGhvdXQgcHJvZHVjaW5nIGFueSBjb21wcmVzc2VkIG91dHB1dC5cbiAqL1xuZnVuY3Rpb24gZGVmbGF0ZVNldERpY3Rpb25hcnkoc3RybSwgZGljdGlvbmFyeSkge1xuICB2YXIgZGljdExlbmd0aCA9IGRpY3Rpb25hcnkubGVuZ3RoO1xuXG4gIHZhciBzO1xuICB2YXIgc3RyLCBuO1xuICB2YXIgd3JhcDtcbiAgdmFyIGF2YWlsO1xuICB2YXIgbmV4dDtcbiAgdmFyIGlucHV0O1xuICB2YXIgdG1wRGljdDtcblxuICBpZiAoIXN0cm0vKj09IFpfTlVMTCovIHx8ICFzdHJtLnN0YXRlLyo9PSBaX05VTEwqLykge1xuICAgIHJldHVybiBaX1NUUkVBTV9FUlJPUjtcbiAgfVxuXG4gIHMgPSBzdHJtLnN0YXRlO1xuICB3cmFwID0gcy53cmFwO1xuXG4gIGlmICh3cmFwID09PSAyIHx8ICh3cmFwID09PSAxICYmIHMuc3RhdHVzICE9PSBJTklUX1NUQVRFKSB8fCBzLmxvb2thaGVhZCkge1xuICAgIHJldHVybiBaX1NUUkVBTV9FUlJPUjtcbiAgfVxuXG4gIC8qIHdoZW4gdXNpbmcgemxpYiB3cmFwcGVycywgY29tcHV0ZSBBZGxlci0zMiBmb3IgcHJvdmlkZWQgZGljdGlvbmFyeSAqL1xuICBpZiAod3JhcCA9PT0gMSkge1xuICAgIC8qIGFkbGVyMzIoc3RybS0+YWRsZXIsIGRpY3Rpb25hcnksIGRpY3RMZW5ndGgpOyAqL1xuICAgIHN0cm0uYWRsZXIgPSBhZGxlcjMyKHN0cm0uYWRsZXIsIGRpY3Rpb25hcnksIGRpY3RMZW5ndGgsIDApO1xuICB9XG5cbiAgcy53cmFwID0gMDsgICAvKiBhdm9pZCBjb21wdXRpbmcgQWRsZXItMzIgaW4gcmVhZF9idWYgKi9cblxuICAvKiBpZiBkaWN0aW9uYXJ5IHdvdWxkIGZpbGwgd2luZG93LCBqdXN0IHJlcGxhY2UgdGhlIGhpc3RvcnkgKi9cbiAgaWYgKGRpY3RMZW5ndGggPj0gcy53X3NpemUpIHtcbiAgICBpZiAod3JhcCA9PT0gMCkgeyAgICAgICAgICAgIC8qIGFscmVhZHkgZW1wdHkgb3RoZXJ3aXNlICovXG4gICAgICAvKioqIENMRUFSX0hBU0gocyk7ICoqKi9cbiAgICAgIHplcm8ocy5oZWFkKTsgLy8gRmlsbCB3aXRoIE5JTCAoPSAwKTtcbiAgICAgIHMuc3Ryc3RhcnQgPSAwO1xuICAgICAgcy5ibG9ja19zdGFydCA9IDA7XG4gICAgICBzLmluc2VydCA9IDA7XG4gICAgfVxuICAgIC8qIHVzZSB0aGUgdGFpbCAqL1xuICAgIC8vIGRpY3Rpb25hcnkgPSBkaWN0aW9uYXJ5LnNsaWNlKGRpY3RMZW5ndGggLSBzLndfc2l6ZSk7XG4gICAgdG1wRGljdCA9IG5ldyB1dGlscy5CdWY4KHMud19zaXplKTtcbiAgICB1dGlscy5hcnJheVNldCh0bXBEaWN0LCBkaWN0aW9uYXJ5LCBkaWN0TGVuZ3RoIC0gcy53X3NpemUsIHMud19zaXplLCAwKTtcbiAgICBkaWN0aW9uYXJ5ID0gdG1wRGljdDtcbiAgICBkaWN0TGVuZ3RoID0gcy53X3NpemU7XG4gIH1cbiAgLyogaW5zZXJ0IGRpY3Rpb25hcnkgaW50byB3aW5kb3cgYW5kIGhhc2ggKi9cbiAgYXZhaWwgPSBzdHJtLmF2YWlsX2luO1xuICBuZXh0ID0gc3RybS5uZXh0X2luO1xuICBpbnB1dCA9IHN0cm0uaW5wdXQ7XG4gIHN0cm0uYXZhaWxfaW4gPSBkaWN0TGVuZ3RoO1xuICBzdHJtLm5leHRfaW4gPSAwO1xuICBzdHJtLmlucHV0ID0gZGljdGlvbmFyeTtcbiAgZmlsbF93aW5kb3cocyk7XG4gIHdoaWxlIChzLmxvb2thaGVhZCA+PSBNSU5fTUFUQ0gpIHtcbiAgICBzdHIgPSBzLnN0cnN0YXJ0O1xuICAgIG4gPSBzLmxvb2thaGVhZCAtIChNSU5fTUFUQ0ggLSAxKTtcbiAgICBkbyB7XG4gICAgICAvKiBVUERBVEVfSEFTSChzLCBzLT5pbnNfaCwgcy0+d2luZG93W3N0ciArIE1JTl9NQVRDSC0xXSk7ICovXG4gICAgICBzLmluc19oID0gKChzLmluc19oIDw8IHMuaGFzaF9zaGlmdCkgXiBzLndpbmRvd1tzdHIgKyBNSU5fTUFUQ0ggLSAxXSkgJiBzLmhhc2hfbWFzaztcblxuICAgICAgcy5wcmV2W3N0ciAmIHMud19tYXNrXSA9IHMuaGVhZFtzLmluc19oXTtcblxuICAgICAgcy5oZWFkW3MuaW5zX2hdID0gc3RyO1xuICAgICAgc3RyKys7XG4gICAgfSB3aGlsZSAoLS1uKTtcbiAgICBzLnN0cnN0YXJ0ID0gc3RyO1xuICAgIHMubG9va2FoZWFkID0gTUlOX01BVENIIC0gMTtcbiAgICBmaWxsX3dpbmRvdyhzKTtcbiAgfVxuICBzLnN0cnN0YXJ0ICs9IHMubG9va2FoZWFkO1xuICBzLmJsb2NrX3N0YXJ0ID0gcy5zdHJzdGFydDtcbiAgcy5pbnNlcnQgPSBzLmxvb2thaGVhZDtcbiAgcy5sb29rYWhlYWQgPSAwO1xuICBzLm1hdGNoX2xlbmd0aCA9IHMucHJldl9sZW5ndGggPSBNSU5fTUFUQ0ggLSAxO1xuICBzLm1hdGNoX2F2YWlsYWJsZSA9IDA7XG4gIHN0cm0ubmV4dF9pbiA9IG5leHQ7XG4gIHN0cm0uaW5wdXQgPSBpbnB1dDtcbiAgc3RybS5hdmFpbF9pbiA9IGF2YWlsO1xuICBzLndyYXAgPSB3cmFwO1xuICByZXR1cm4gWl9PSztcbn1cblxuXG5leHBvcnRzLmRlZmxhdGVJbml0ID0gZGVmbGF0ZUluaXQ7XG5leHBvcnRzLmRlZmxhdGVJbml0MiA9IGRlZmxhdGVJbml0MjtcbmV4cG9ydHMuZGVmbGF0ZVJlc2V0ID0gZGVmbGF0ZVJlc2V0O1xuZXhwb3J0cy5kZWZsYXRlUmVzZXRLZWVwID0gZGVmbGF0ZVJlc2V0S2VlcDtcbmV4cG9ydHMuZGVmbGF0ZVNldEhlYWRlciA9IGRlZmxhdGVTZXRIZWFkZXI7XG5leHBvcnRzLmRlZmxhdGUgPSBkZWZsYXRlO1xuZXhwb3J0cy5kZWZsYXRlRW5kID0gZGVmbGF0ZUVuZDtcbmV4cG9ydHMuZGVmbGF0ZVNldERpY3Rpb25hcnkgPSBkZWZsYXRlU2V0RGljdGlvbmFyeTtcbmV4cG9ydHMuZGVmbGF0ZUluZm8gPSAncGFrbyBkZWZsYXRlIChmcm9tIE5vZGVjYSBwcm9qZWN0KSc7XG5cbi8qIE5vdCBpbXBsZW1lbnRlZFxuZXhwb3J0cy5kZWZsYXRlQm91bmQgPSBkZWZsYXRlQm91bmQ7XG5leHBvcnRzLmRlZmxhdGVDb3B5ID0gZGVmbGF0ZUNvcHk7XG5leHBvcnRzLmRlZmxhdGVQYXJhbXMgPSBkZWZsYXRlUGFyYW1zO1xuZXhwb3J0cy5kZWZsYXRlUGVuZGluZyA9IGRlZmxhdGVQZW5kaW5nO1xuZXhwb3J0cy5kZWZsYXRlUHJpbWUgPSBkZWZsYXRlUHJpbWU7XG5leHBvcnRzLmRlZmxhdGVUdW5lID0gZGVmbGF0ZVR1bmU7XG4qL1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5cbmZ1bmN0aW9uIEdaaGVhZGVyKCkge1xuICAvKiB0cnVlIGlmIGNvbXByZXNzZWQgZGF0YSBiZWxpZXZlZCB0byBiZSB0ZXh0ICovXG4gIHRoaXMudGV4dCAgICAgICA9IDA7XG4gIC8qIG1vZGlmaWNhdGlvbiB0aW1lICovXG4gIHRoaXMudGltZSAgICAgICA9IDA7XG4gIC8qIGV4dHJhIGZsYWdzIChub3QgdXNlZCB3aGVuIHdyaXRpbmcgYSBnemlwIGZpbGUpICovXG4gIHRoaXMueGZsYWdzICAgICA9IDA7XG4gIC8qIG9wZXJhdGluZyBzeXN0ZW0gKi9cbiAgdGhpcy5vcyAgICAgICAgID0gMDtcbiAgLyogcG9pbnRlciB0byBleHRyYSBmaWVsZCBvciBaX05VTEwgaWYgbm9uZSAqL1xuICB0aGlzLmV4dHJhICAgICAgPSBudWxsO1xuICAvKiBleHRyYSBmaWVsZCBsZW5ndGggKHZhbGlkIGlmIGV4dHJhICE9IFpfTlVMTCkgKi9cbiAgdGhpcy5leHRyYV9sZW4gID0gMDsgLy8gQWN0dWFsbHksIHdlIGRvbid0IG5lZWQgaXQgaW4gSlMsXG4gICAgICAgICAgICAgICAgICAgICAgIC8vIGJ1dCBsZWF2ZSBmb3IgZmV3IGNvZGUgbW9kaWZpY2F0aW9uc1xuXG4gIC8vXG4gIC8vIFNldHVwIGxpbWl0cyBpcyBub3QgbmVjZXNzYXJ5IGJlY2F1c2UgaW4ganMgd2Ugc2hvdWxkIG5vdCBwcmVhbGxvY2F0ZSBtZW1vcnlcbiAgLy8gZm9yIGluZmxhdGUgdXNlIGNvbnN0YW50IGxpbWl0IGluIDY1NTM2IGJ5dGVzXG4gIC8vXG5cbiAgLyogc3BhY2UgYXQgZXh0cmEgKG9ubHkgd2hlbiByZWFkaW5nIGhlYWRlcikgKi9cbiAgLy8gdGhpcy5leHRyYV9tYXggID0gMDtcbiAgLyogcG9pbnRlciB0byB6ZXJvLXRlcm1pbmF0ZWQgZmlsZSBuYW1lIG9yIFpfTlVMTCAqL1xuICB0aGlzLm5hbWUgICAgICAgPSAnJztcbiAgLyogc3BhY2UgYXQgbmFtZSAob25seSB3aGVuIHJlYWRpbmcgaGVhZGVyKSAqL1xuICAvLyB0aGlzLm5hbWVfbWF4ICAgPSAwO1xuICAvKiBwb2ludGVyIHRvIHplcm8tdGVybWluYXRlZCBjb21tZW50IG9yIFpfTlVMTCAqL1xuICB0aGlzLmNvbW1lbnQgICAgPSAnJztcbiAgLyogc3BhY2UgYXQgY29tbWVudCAob25seSB3aGVuIHJlYWRpbmcgaGVhZGVyKSAqL1xuICAvLyB0aGlzLmNvbW1fbWF4ICAgPSAwO1xuICAvKiB0cnVlIGlmIHRoZXJlIHdhcyBvciB3aWxsIGJlIGEgaGVhZGVyIGNyYyAqL1xuICB0aGlzLmhjcmMgICAgICAgPSAwO1xuICAvKiB0cnVlIHdoZW4gZG9uZSByZWFkaW5nIGd6aXAgaGVhZGVyIChub3QgdXNlZCB3aGVuIHdyaXRpbmcgYSBnemlwIGZpbGUpICovXG4gIHRoaXMuZG9uZSAgICAgICA9IGZhbHNlO1xufVxuXG5tb2R1bGUuZXhwb3J0cyA9IEdaaGVhZGVyO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG4vLyBTZWUgc3RhdGUgZGVmcyBmcm9tIGluZmxhdGUuanNcbnZhciBCQUQgPSAzMDsgICAgICAgLyogZ290IGEgZGF0YSBlcnJvciAtLSByZW1haW4gaGVyZSB1bnRpbCByZXNldCAqL1xudmFyIFRZUEUgPSAxMjsgICAgICAvKiBpOiB3YWl0aW5nIGZvciB0eXBlIGJpdHMsIGluY2x1ZGluZyBsYXN0LWZsYWcgYml0ICovXG5cbi8qXG4gICBEZWNvZGUgbGl0ZXJhbCwgbGVuZ3RoLCBhbmQgZGlzdGFuY2UgY29kZXMgYW5kIHdyaXRlIG91dCB0aGUgcmVzdWx0aW5nXG4gICBsaXRlcmFsIGFuZCBtYXRjaCBieXRlcyB1bnRpbCBlaXRoZXIgbm90IGVub3VnaCBpbnB1dCBvciBvdXRwdXQgaXNcbiAgIGF2YWlsYWJsZSwgYW4gZW5kLW9mLWJsb2NrIGlzIGVuY291bnRlcmVkLCBvciBhIGRhdGEgZXJyb3IgaXMgZW5jb3VudGVyZWQuXG4gICBXaGVuIGxhcmdlIGVub3VnaCBpbnB1dCBhbmQgb3V0cHV0IGJ1ZmZlcnMgYXJlIHN1cHBsaWVkIHRvIGluZmxhdGUoKSwgZm9yXG4gICBleGFtcGxlLCBhIDE2SyBpbnB1dCBidWZmZXIgYW5kIGEgNjRLIG91dHB1dCBidWZmZXIsIG1vcmUgdGhhbiA5NSUgb2YgdGhlXG4gICBpbmZsYXRlIGV4ZWN1dGlvbiB0aW1lIGlzIHNwZW50IGluIHRoaXMgcm91dGluZS5cblxuICAgRW50cnkgYXNzdW1wdGlvbnM6XG5cbiAgICAgICAgc3RhdGUubW9kZSA9PT0gTEVOXG4gICAgICAgIHN0cm0uYXZhaWxfaW4gPj0gNlxuICAgICAgICBzdHJtLmF2YWlsX291dCA+PSAyNThcbiAgICAgICAgc3RhcnQgPj0gc3RybS5hdmFpbF9vdXRcbiAgICAgICAgc3RhdGUuYml0cyA8IDhcblxuICAgT24gcmV0dXJuLCBzdGF0ZS5tb2RlIGlzIG9uZSBvZjpcblxuICAgICAgICBMRU4gLS0gcmFuIG91dCBvZiBlbm91Z2ggb3V0cHV0IHNwYWNlIG9yIGVub3VnaCBhdmFpbGFibGUgaW5wdXRcbiAgICAgICAgVFlQRSAtLSByZWFjaGVkIGVuZCBvZiBibG9jayBjb2RlLCBpbmZsYXRlKCkgdG8gaW50ZXJwcmV0IG5leHQgYmxvY2tcbiAgICAgICAgQkFEIC0tIGVycm9yIGluIGJsb2NrIGRhdGFcblxuICAgTm90ZXM6XG5cbiAgICAtIFRoZSBtYXhpbXVtIGlucHV0IGJpdHMgdXNlZCBieSBhIGxlbmd0aC9kaXN0YW5jZSBwYWlyIGlzIDE1IGJpdHMgZm9yIHRoZVxuICAgICAgbGVuZ3RoIGNvZGUsIDUgYml0cyBmb3IgdGhlIGxlbmd0aCBleHRyYSwgMTUgYml0cyBmb3IgdGhlIGRpc3RhbmNlIGNvZGUsXG4gICAgICBhbmQgMTMgYml0cyBmb3IgdGhlIGRpc3RhbmNlIGV4dHJhLiAgVGhpcyB0b3RhbHMgNDggYml0cywgb3Igc2l4IGJ5dGVzLlxuICAgICAgVGhlcmVmb3JlIGlmIHN0cm0uYXZhaWxfaW4gPj0gNiwgdGhlbiB0aGVyZSBpcyBlbm91Z2ggaW5wdXQgdG8gYXZvaWRcbiAgICAgIGNoZWNraW5nIGZvciBhdmFpbGFibGUgaW5wdXQgd2hpbGUgZGVjb2RpbmcuXG5cbiAgICAtIFRoZSBtYXhpbXVtIGJ5dGVzIHRoYXQgYSBzaW5nbGUgbGVuZ3RoL2Rpc3RhbmNlIHBhaXIgY2FuIG91dHB1dCBpcyAyNThcbiAgICAgIGJ5dGVzLCB3aGljaCBpcyB0aGUgbWF4aW11bSBsZW5ndGggdGhhdCBjYW4gYmUgY29kZWQuICBpbmZsYXRlX2Zhc3QoKVxuICAgICAgcmVxdWlyZXMgc3RybS5hdmFpbF9vdXQgPj0gMjU4IGZvciBlYWNoIGxvb3AgdG8gYXZvaWQgY2hlY2tpbmcgZm9yXG4gICAgICBvdXRwdXQgc3BhY2UuXG4gKi9cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gaW5mbGF0ZV9mYXN0KHN0cm0sIHN0YXJ0KSB7XG4gIHZhciBzdGF0ZTtcbiAgdmFyIF9pbjsgICAgICAgICAgICAgICAgICAgIC8qIGxvY2FsIHN0cm0uaW5wdXQgKi9cbiAgdmFyIGxhc3Q7ICAgICAgICAgICAgICAgICAgIC8qIGhhdmUgZW5vdWdoIGlucHV0IHdoaWxlIGluIDwgbGFzdCAqL1xuICB2YXIgX291dDsgICAgICAgICAgICAgICAgICAgLyogbG9jYWwgc3RybS5vdXRwdXQgKi9cbiAgdmFyIGJlZzsgICAgICAgICAgICAgICAgICAgIC8qIGluZmxhdGUoKSdzIGluaXRpYWwgc3RybS5vdXRwdXQgKi9cbiAgdmFyIGVuZDsgICAgICAgICAgICAgICAgICAgIC8qIHdoaWxlIG91dCA8IGVuZCwgZW5vdWdoIHNwYWNlIGF2YWlsYWJsZSAqL1xuLy8jaWZkZWYgSU5GTEFURV9TVFJJQ1RcbiAgdmFyIGRtYXg7ICAgICAgICAgICAgICAgICAgIC8qIG1heGltdW0gZGlzdGFuY2UgZnJvbSB6bGliIGhlYWRlciAqL1xuLy8jZW5kaWZcbiAgdmFyIHdzaXplOyAgICAgICAgICAgICAgICAgIC8qIHdpbmRvdyBzaXplIG9yIHplcm8gaWYgbm90IHVzaW5nIHdpbmRvdyAqL1xuICB2YXIgd2hhdmU7ICAgICAgICAgICAgICAgICAgLyogdmFsaWQgYnl0ZXMgaW4gdGhlIHdpbmRvdyAqL1xuICB2YXIgd25leHQ7ICAgICAgICAgICAgICAgICAgLyogd2luZG93IHdyaXRlIGluZGV4ICovXG4gIC8vIFVzZSBgc193aW5kb3dgIGluc3RlYWQgYHdpbmRvd2AsIGF2b2lkIGNvbmZsaWN0IHdpdGggaW5zdHJ1bWVudGF0aW9uIHRvb2xzXG4gIHZhciBzX3dpbmRvdzsgICAgICAgICAgICAgICAvKiBhbGxvY2F0ZWQgc2xpZGluZyB3aW5kb3csIGlmIHdzaXplICE9IDAgKi9cbiAgdmFyIGhvbGQ7ICAgICAgICAgICAgICAgICAgIC8qIGxvY2FsIHN0cm0uaG9sZCAqL1xuICB2YXIgYml0czsgICAgICAgICAgICAgICAgICAgLyogbG9jYWwgc3RybS5iaXRzICovXG4gIHZhciBsY29kZTsgICAgICAgICAgICAgICAgICAvKiBsb2NhbCBzdHJtLmxlbmNvZGUgKi9cbiAgdmFyIGRjb2RlOyAgICAgICAgICAgICAgICAgIC8qIGxvY2FsIHN0cm0uZGlzdGNvZGUgKi9cbiAgdmFyIGxtYXNrOyAgICAgICAgICAgICAgICAgIC8qIG1hc2sgZm9yIGZpcnN0IGxldmVsIG9mIGxlbmd0aCBjb2RlcyAqL1xuICB2YXIgZG1hc2s7ICAgICAgICAgICAgICAgICAgLyogbWFzayBmb3IgZmlyc3QgbGV2ZWwgb2YgZGlzdGFuY2UgY29kZXMgKi9cbiAgdmFyIGhlcmU7ICAgICAgICAgICAgICAgICAgIC8qIHJldHJpZXZlZCB0YWJsZSBlbnRyeSAqL1xuICB2YXIgb3A7ICAgICAgICAgICAgICAgICAgICAgLyogY29kZSBiaXRzLCBvcGVyYXRpb24sIGV4dHJhIGJpdHMsIG9yICovXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgd2luZG93IHBvc2l0aW9uLCB3aW5kb3cgYnl0ZXMgdG8gY29weSAqL1xuICB2YXIgbGVuOyAgICAgICAgICAgICAgICAgICAgLyogbWF0Y2ggbGVuZ3RoLCB1bnVzZWQgYnl0ZXMgKi9cbiAgdmFyIGRpc3Q7ICAgICAgICAgICAgICAgICAgIC8qIG1hdGNoIGRpc3RhbmNlICovXG4gIHZhciBmcm9tOyAgICAgICAgICAgICAgICAgICAvKiB3aGVyZSB0byBjb3B5IG1hdGNoIGZyb20gKi9cbiAgdmFyIGZyb21fc291cmNlO1xuXG5cbiAgdmFyIGlucHV0LCBvdXRwdXQ7IC8vIEpTIHNwZWNpZmljLCBiZWNhdXNlIHdlIGhhdmUgbm8gcG9pbnRlcnNcblxuICAvKiBjb3B5IHN0YXRlIHRvIGxvY2FsIHZhcmlhYmxlcyAqL1xuICBzdGF0ZSA9IHN0cm0uc3RhdGU7XG4gIC8vaGVyZSA9IHN0YXRlLmhlcmU7XG4gIF9pbiA9IHN0cm0ubmV4dF9pbjtcbiAgaW5wdXQgPSBzdHJtLmlucHV0O1xuICBsYXN0ID0gX2luICsgKHN0cm0uYXZhaWxfaW4gLSA1KTtcbiAgX291dCA9IHN0cm0ubmV4dF9vdXQ7XG4gIG91dHB1dCA9IHN0cm0ub3V0cHV0O1xuICBiZWcgPSBfb3V0IC0gKHN0YXJ0IC0gc3RybS5hdmFpbF9vdXQpO1xuICBlbmQgPSBfb3V0ICsgKHN0cm0uYXZhaWxfb3V0IC0gMjU3KTtcbi8vI2lmZGVmIElORkxBVEVfU1RSSUNUXG4gIGRtYXggPSBzdGF0ZS5kbWF4O1xuLy8jZW5kaWZcbiAgd3NpemUgPSBzdGF0ZS53c2l6ZTtcbiAgd2hhdmUgPSBzdGF0ZS53aGF2ZTtcbiAgd25leHQgPSBzdGF0ZS53bmV4dDtcbiAgc193aW5kb3cgPSBzdGF0ZS53aW5kb3c7XG4gIGhvbGQgPSBzdGF0ZS5ob2xkO1xuICBiaXRzID0gc3RhdGUuYml0cztcbiAgbGNvZGUgPSBzdGF0ZS5sZW5jb2RlO1xuICBkY29kZSA9IHN0YXRlLmRpc3Rjb2RlO1xuICBsbWFzayA9ICgxIDw8IHN0YXRlLmxlbmJpdHMpIC0gMTtcbiAgZG1hc2sgPSAoMSA8PCBzdGF0ZS5kaXN0Yml0cykgLSAxO1xuXG5cbiAgLyogZGVjb2RlIGxpdGVyYWxzIGFuZCBsZW5ndGgvZGlzdGFuY2VzIHVudGlsIGVuZC1vZi1ibG9jayBvciBub3QgZW5vdWdoXG4gICAgIGlucHV0IGRhdGEgb3Igb3V0cHV0IHNwYWNlICovXG5cbiAgdG9wOlxuICBkbyB7XG4gICAgaWYgKGJpdHMgPCAxNSkge1xuICAgICAgaG9sZCArPSBpbnB1dFtfaW4rK10gPDwgYml0cztcbiAgICAgIGJpdHMgKz0gODtcbiAgICAgIGhvbGQgKz0gaW5wdXRbX2luKytdIDw8IGJpdHM7XG4gICAgICBiaXRzICs9IDg7XG4gICAgfVxuXG4gICAgaGVyZSA9IGxjb2RlW2hvbGQgJiBsbWFza107XG5cbiAgICBkb2xlbjpcbiAgICBmb3IgKDs7KSB7IC8vIEdvdG8gZW11bGF0aW9uXG4gICAgICBvcCA9IGhlcmUgPj4+IDI0LypoZXJlLmJpdHMqLztcbiAgICAgIGhvbGQgPj4+PSBvcDtcbiAgICAgIGJpdHMgLT0gb3A7XG4gICAgICBvcCA9IChoZXJlID4+PiAxNikgJiAweGZmLypoZXJlLm9wKi87XG4gICAgICBpZiAob3AgPT09IDApIHsgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGxpdGVyYWwgKi9cbiAgICAgICAgLy9UcmFjZXZ2KChzdGRlcnIsIGhlcmUudmFsID49IDB4MjAgJiYgaGVyZS52YWwgPCAweDdmID9cbiAgICAgICAgLy8gICAgICAgIFwiaW5mbGF0ZTogICAgICAgICBsaXRlcmFsICclYydcXG5cIiA6XG4gICAgICAgIC8vICAgICAgICBcImluZmxhdGU6ICAgICAgICAgbGl0ZXJhbCAweCUwMnhcXG5cIiwgaGVyZS52YWwpKTtcbiAgICAgICAgb3V0cHV0W19vdXQrK10gPSBoZXJlICYgMHhmZmZmLypoZXJlLnZhbCovO1xuICAgICAgfVxuICAgICAgZWxzZSBpZiAob3AgJiAxNikgeyAgICAgICAgICAgICAgICAgICAgIC8qIGxlbmd0aCBiYXNlICovXG4gICAgICAgIGxlbiA9IGhlcmUgJiAweGZmZmYvKmhlcmUudmFsKi87XG4gICAgICAgIG9wICY9IDE1OyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG51bWJlciBvZiBleHRyYSBiaXRzICovXG4gICAgICAgIGlmIChvcCkge1xuICAgICAgICAgIGlmIChiaXRzIDwgb3ApIHtcbiAgICAgICAgICAgIGhvbGQgKz0gaW5wdXRbX2luKytdIDw8IGJpdHM7XG4gICAgICAgICAgICBiaXRzICs9IDg7XG4gICAgICAgICAgfVxuICAgICAgICAgIGxlbiArPSBob2xkICYgKCgxIDw8IG9wKSAtIDEpO1xuICAgICAgICAgIGhvbGQgPj4+PSBvcDtcbiAgICAgICAgICBiaXRzIC09IG9wO1xuICAgICAgICB9XG4gICAgICAgIC8vVHJhY2V2digoc3RkZXJyLCBcImluZmxhdGU6ICAgICAgICAgbGVuZ3RoICV1XFxuXCIsIGxlbikpO1xuICAgICAgICBpZiAoYml0cyA8IDE1KSB7XG4gICAgICAgICAgaG9sZCArPSBpbnB1dFtfaW4rK10gPDwgYml0cztcbiAgICAgICAgICBiaXRzICs9IDg7XG4gICAgICAgICAgaG9sZCArPSBpbnB1dFtfaW4rK10gPDwgYml0cztcbiAgICAgICAgICBiaXRzICs9IDg7XG4gICAgICAgIH1cbiAgICAgICAgaGVyZSA9IGRjb2RlW2hvbGQgJiBkbWFza107XG5cbiAgICAgICAgZG9kaXN0OlxuICAgICAgICBmb3IgKDs7KSB7IC8vIGdvdG8gZW11bGF0aW9uXG4gICAgICAgICAgb3AgPSBoZXJlID4+PiAyNC8qaGVyZS5iaXRzKi87XG4gICAgICAgICAgaG9sZCA+Pj49IG9wO1xuICAgICAgICAgIGJpdHMgLT0gb3A7XG4gICAgICAgICAgb3AgPSAoaGVyZSA+Pj4gMTYpICYgMHhmZi8qaGVyZS5vcCovO1xuXG4gICAgICAgICAgaWYgKG9wICYgMTYpIHsgICAgICAgICAgICAgICAgICAgICAgLyogZGlzdGFuY2UgYmFzZSAqL1xuICAgICAgICAgICAgZGlzdCA9IGhlcmUgJiAweGZmZmYvKmhlcmUudmFsKi87XG4gICAgICAgICAgICBvcCAmPSAxNTsgICAgICAgICAgICAgICAgICAgICAgIC8qIG51bWJlciBvZiBleHRyYSBiaXRzICovXG4gICAgICAgICAgICBpZiAoYml0cyA8IG9wKSB7XG4gICAgICAgICAgICAgIGhvbGQgKz0gaW5wdXRbX2luKytdIDw8IGJpdHM7XG4gICAgICAgICAgICAgIGJpdHMgKz0gODtcbiAgICAgICAgICAgICAgaWYgKGJpdHMgPCBvcCkge1xuICAgICAgICAgICAgICAgIGhvbGQgKz0gaW5wdXRbX2luKytdIDw8IGJpdHM7XG4gICAgICAgICAgICAgICAgYml0cyArPSA4O1xuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBkaXN0ICs9IGhvbGQgJiAoKDEgPDwgb3ApIC0gMSk7XG4vLyNpZmRlZiBJTkZMQVRFX1NUUklDVFxuICAgICAgICAgICAgaWYgKGRpc3QgPiBkbWF4KSB7XG4gICAgICAgICAgICAgIHN0cm0ubXNnID0gJ2ludmFsaWQgZGlzdGFuY2UgdG9vIGZhciBiYWNrJztcbiAgICAgICAgICAgICAgc3RhdGUubW9kZSA9IEJBRDtcbiAgICAgICAgICAgICAgYnJlYWsgdG9wO1xuICAgICAgICAgICAgfVxuLy8jZW5kaWZcbiAgICAgICAgICAgIGhvbGQgPj4+PSBvcDtcbiAgICAgICAgICAgIGJpdHMgLT0gb3A7XG4gICAgICAgICAgICAvL1RyYWNldnYoKHN0ZGVyciwgXCJpbmZsYXRlOiAgICAgICAgIGRpc3RhbmNlICV1XFxuXCIsIGRpc3QpKTtcbiAgICAgICAgICAgIG9wID0gX291dCAtIGJlZzsgICAgICAgICAgICAgICAgLyogbWF4IGRpc3RhbmNlIGluIG91dHB1dCAqL1xuICAgICAgICAgICAgaWYgKGRpc3QgPiBvcCkgeyAgICAgICAgICAgICAgICAvKiBzZWUgaWYgY29weSBmcm9tIHdpbmRvdyAqL1xuICAgICAgICAgICAgICBvcCA9IGRpc3QgLSBvcDsgICAgICAgICAgICAgICAvKiBkaXN0YW5jZSBiYWNrIGluIHdpbmRvdyAqL1xuICAgICAgICAgICAgICBpZiAob3AgPiB3aGF2ZSkge1xuICAgICAgICAgICAgICAgIGlmIChzdGF0ZS5zYW5lKSB7XG4gICAgICAgICAgICAgICAgICBzdHJtLm1zZyA9ICdpbnZhbGlkIGRpc3RhbmNlIHRvbyBmYXIgYmFjayc7XG4gICAgICAgICAgICAgICAgICBzdGF0ZS5tb2RlID0gQkFEO1xuICAgICAgICAgICAgICAgICAgYnJlYWsgdG9wO1xuICAgICAgICAgICAgICAgIH1cblxuLy8gKCEpIFRoaXMgYmxvY2sgaXMgZGlzYWJsZWQgaW4gemxpYiBkZWZhaWx0cyxcbi8vIGRvbid0IGVuYWJsZSBpdCBmb3IgYmluYXJ5IGNvbXBhdGliaWxpdHlcbi8vI2lmZGVmIElORkxBVEVfQUxMT1dfSU5WQUxJRF9ESVNUQU5DRV9UT09GQVJfQVJSUlxuLy8gICAgICAgICAgICAgICAgaWYgKGxlbiA8PSBvcCAtIHdoYXZlKSB7XG4vLyAgICAgICAgICAgICAgICAgIGRvIHtcbi8vICAgICAgICAgICAgICAgICAgICBvdXRwdXRbX291dCsrXSA9IDA7XG4vLyAgICAgICAgICAgICAgICAgIH0gd2hpbGUgKC0tbGVuKTtcbi8vICAgICAgICAgICAgICAgICAgY29udGludWUgdG9wO1xuLy8gICAgICAgICAgICAgICAgfVxuLy8gICAgICAgICAgICAgICAgbGVuIC09IG9wIC0gd2hhdmU7XG4vLyAgICAgICAgICAgICAgICBkbyB7XG4vLyAgICAgICAgICAgICAgICAgIG91dHB1dFtfb3V0KytdID0gMDtcbi8vICAgICAgICAgICAgICAgIH0gd2hpbGUgKC0tb3AgPiB3aGF2ZSk7XG4vLyAgICAgICAgICAgICAgICBpZiAob3AgPT09IDApIHtcbi8vICAgICAgICAgICAgICAgICAgZnJvbSA9IF9vdXQgLSBkaXN0O1xuLy8gICAgICAgICAgICAgICAgICBkbyB7XG4vLyAgICAgICAgICAgICAgICAgICAgb3V0cHV0W19vdXQrK10gPSBvdXRwdXRbZnJvbSsrXTtcbi8vICAgICAgICAgICAgICAgICAgfSB3aGlsZSAoLS1sZW4pO1xuLy8gICAgICAgICAgICAgICAgICBjb250aW51ZSB0b3A7XG4vLyAgICAgICAgICAgICAgICB9XG4vLyNlbmRpZlxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGZyb20gPSAwOyAvLyB3aW5kb3cgaW5kZXhcbiAgICAgICAgICAgICAgZnJvbV9zb3VyY2UgPSBzX3dpbmRvdztcbiAgICAgICAgICAgICAgaWYgKHduZXh0ID09PSAwKSB7ICAgICAgICAgICAvKiB2ZXJ5IGNvbW1vbiBjYXNlICovXG4gICAgICAgICAgICAgICAgZnJvbSArPSB3c2l6ZSAtIG9wO1xuICAgICAgICAgICAgICAgIGlmIChvcCA8IGxlbikgeyAgICAgICAgIC8qIHNvbWUgZnJvbSB3aW5kb3cgKi9cbiAgICAgICAgICAgICAgICAgIGxlbiAtPSBvcDtcbiAgICAgICAgICAgICAgICAgIGRvIHtcbiAgICAgICAgICAgICAgICAgICAgb3V0cHV0W19vdXQrK10gPSBzX3dpbmRvd1tmcm9tKytdO1xuICAgICAgICAgICAgICAgICAgfSB3aGlsZSAoLS1vcCk7XG4gICAgICAgICAgICAgICAgICBmcm9tID0gX291dCAtIGRpc3Q7ICAvKiByZXN0IGZyb20gb3V0cHV0ICovXG4gICAgICAgICAgICAgICAgICBmcm9tX3NvdXJjZSA9IG91dHB1dDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgZWxzZSBpZiAod25leHQgPCBvcCkgeyAgICAgIC8qIHdyYXAgYXJvdW5kIHdpbmRvdyAqL1xuICAgICAgICAgICAgICAgIGZyb20gKz0gd3NpemUgKyB3bmV4dCAtIG9wO1xuICAgICAgICAgICAgICAgIG9wIC09IHduZXh0O1xuICAgICAgICAgICAgICAgIGlmIChvcCA8IGxlbikgeyAgICAgICAgIC8qIHNvbWUgZnJvbSBlbmQgb2Ygd2luZG93ICovXG4gICAgICAgICAgICAgICAgICBsZW4gLT0gb3A7XG4gICAgICAgICAgICAgICAgICBkbyB7XG4gICAgICAgICAgICAgICAgICAgIG91dHB1dFtfb3V0KytdID0gc193aW5kb3dbZnJvbSsrXTtcbiAgICAgICAgICAgICAgICAgIH0gd2hpbGUgKC0tb3ApO1xuICAgICAgICAgICAgICAgICAgZnJvbSA9IDA7XG4gICAgICAgICAgICAgICAgICBpZiAod25leHQgPCBsZW4pIHsgIC8qIHNvbWUgZnJvbSBzdGFydCBvZiB3aW5kb3cgKi9cbiAgICAgICAgICAgICAgICAgICAgb3AgPSB3bmV4dDtcbiAgICAgICAgICAgICAgICAgICAgbGVuIC09IG9wO1xuICAgICAgICAgICAgICAgICAgICBkbyB7XG4gICAgICAgICAgICAgICAgICAgICAgb3V0cHV0W19vdXQrK10gPSBzX3dpbmRvd1tmcm9tKytdO1xuICAgICAgICAgICAgICAgICAgICB9IHdoaWxlICgtLW9wKTtcbiAgICAgICAgICAgICAgICAgICAgZnJvbSA9IF9vdXQgLSBkaXN0OyAgICAgIC8qIHJlc3QgZnJvbSBvdXRwdXQgKi9cbiAgICAgICAgICAgICAgICAgICAgZnJvbV9zb3VyY2UgPSBvdXRwdXQ7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAvKiBjb250aWd1b3VzIGluIHdpbmRvdyAqL1xuICAgICAgICAgICAgICAgIGZyb20gKz0gd25leHQgLSBvcDtcbiAgICAgICAgICAgICAgICBpZiAob3AgPCBsZW4pIHsgICAgICAgICAvKiBzb21lIGZyb20gd2luZG93ICovXG4gICAgICAgICAgICAgICAgICBsZW4gLT0gb3A7XG4gICAgICAgICAgICAgICAgICBkbyB7XG4gICAgICAgICAgICAgICAgICAgIG91dHB1dFtfb3V0KytdID0gc193aW5kb3dbZnJvbSsrXTtcbiAgICAgICAgICAgICAgICAgIH0gd2hpbGUgKC0tb3ApO1xuICAgICAgICAgICAgICAgICAgZnJvbSA9IF9vdXQgLSBkaXN0OyAgLyogcmVzdCBmcm9tIG91dHB1dCAqL1xuICAgICAgICAgICAgICAgICAgZnJvbV9zb3VyY2UgPSBvdXRwdXQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIHdoaWxlIChsZW4gPiAyKSB7XG4gICAgICAgICAgICAgICAgb3V0cHV0W19vdXQrK10gPSBmcm9tX3NvdXJjZVtmcm9tKytdO1xuICAgICAgICAgICAgICAgIG91dHB1dFtfb3V0KytdID0gZnJvbV9zb3VyY2VbZnJvbSsrXTtcbiAgICAgICAgICAgICAgICBvdXRwdXRbX291dCsrXSA9IGZyb21fc291cmNlW2Zyb20rK107XG4gICAgICAgICAgICAgICAgbGVuIC09IDM7XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgaWYgKGxlbikge1xuICAgICAgICAgICAgICAgIG91dHB1dFtfb3V0KytdID0gZnJvbV9zb3VyY2VbZnJvbSsrXTtcbiAgICAgICAgICAgICAgICBpZiAobGVuID4gMSkge1xuICAgICAgICAgICAgICAgICAgb3V0cHV0W19vdXQrK10gPSBmcm9tX3NvdXJjZVtmcm9tKytdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgIGZyb20gPSBfb3V0IC0gZGlzdDsgICAgICAgICAgLyogY29weSBkaXJlY3QgZnJvbSBvdXRwdXQgKi9cbiAgICAgICAgICAgICAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgIC8qIG1pbmltdW0gbGVuZ3RoIGlzIHRocmVlICovXG4gICAgICAgICAgICAgICAgb3V0cHV0W19vdXQrK10gPSBvdXRwdXRbZnJvbSsrXTtcbiAgICAgICAgICAgICAgICBvdXRwdXRbX291dCsrXSA9IG91dHB1dFtmcm9tKytdO1xuICAgICAgICAgICAgICAgIG91dHB1dFtfb3V0KytdID0gb3V0cHV0W2Zyb20rK107XG4gICAgICAgICAgICAgICAgbGVuIC09IDM7XG4gICAgICAgICAgICAgIH0gd2hpbGUgKGxlbiA+IDIpO1xuICAgICAgICAgICAgICBpZiAobGVuKSB7XG4gICAgICAgICAgICAgICAgb3V0cHV0W19vdXQrK10gPSBvdXRwdXRbZnJvbSsrXTtcbiAgICAgICAgICAgICAgICBpZiAobGVuID4gMSkge1xuICAgICAgICAgICAgICAgICAgb3V0cHV0W19vdXQrK10gPSBvdXRwdXRbZnJvbSsrXTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICB9XG4gICAgICAgICAgZWxzZSBpZiAoKG9wICYgNjQpID09PSAwKSB7ICAgICAgICAgIC8qIDJuZCBsZXZlbCBkaXN0YW5jZSBjb2RlICovXG4gICAgICAgICAgICBoZXJlID0gZGNvZGVbKGhlcmUgJiAweGZmZmYpLypoZXJlLnZhbCovICsgKGhvbGQgJiAoKDEgPDwgb3ApIC0gMSkpXTtcbiAgICAgICAgICAgIGNvbnRpbnVlIGRvZGlzdDtcbiAgICAgICAgICB9XG4gICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBzdHJtLm1zZyA9ICdpbnZhbGlkIGRpc3RhbmNlIGNvZGUnO1xuICAgICAgICAgICAgc3RhdGUubW9kZSA9IEJBRDtcbiAgICAgICAgICAgIGJyZWFrIHRvcDtcbiAgICAgICAgICB9XG5cbiAgICAgICAgICBicmVhazsgLy8gbmVlZCB0byBlbXVsYXRlIGdvdG8gdmlhIFwiY29udGludWVcIlxuICAgICAgICB9XG4gICAgICB9XG4gICAgICBlbHNlIGlmICgob3AgJiA2NCkgPT09IDApIHsgICAgICAgICAgICAgIC8qIDJuZCBsZXZlbCBsZW5ndGggY29kZSAqL1xuICAgICAgICBoZXJlID0gbGNvZGVbKGhlcmUgJiAweGZmZmYpLypoZXJlLnZhbCovICsgKGhvbGQgJiAoKDEgPDwgb3ApIC0gMSkpXTtcbiAgICAgICAgY29udGludWUgZG9sZW47XG4gICAgICB9XG4gICAgICBlbHNlIGlmIChvcCAmIDMyKSB7ICAgICAgICAgICAgICAgICAgICAgLyogZW5kLW9mLWJsb2NrICovXG4gICAgICAgIC8vVHJhY2V2digoc3RkZXJyLCBcImluZmxhdGU6ICAgICAgICAgZW5kIG9mIGJsb2NrXFxuXCIpKTtcbiAgICAgICAgc3RhdGUubW9kZSA9IFRZUEU7XG4gICAgICAgIGJyZWFrIHRvcDtcbiAgICAgIH1cbiAgICAgIGVsc2Uge1xuICAgICAgICBzdHJtLm1zZyA9ICdpbnZhbGlkIGxpdGVyYWwvbGVuZ3RoIGNvZGUnO1xuICAgICAgICBzdGF0ZS5tb2RlID0gQkFEO1xuICAgICAgICBicmVhayB0b3A7XG4gICAgICB9XG5cbiAgICAgIGJyZWFrOyAvLyBuZWVkIHRvIGVtdWxhdGUgZ290byB2aWEgXCJjb250aW51ZVwiXG4gICAgfVxuICB9IHdoaWxlIChfaW4gPCBsYXN0ICYmIF9vdXQgPCBlbmQpO1xuXG4gIC8qIHJldHVybiB1bnVzZWQgYnl0ZXMgKG9uIGVudHJ5LCBiaXRzIDwgOCwgc28gaW4gd29uJ3QgZ28gdG9vIGZhciBiYWNrKSAqL1xuICBsZW4gPSBiaXRzID4+IDM7XG4gIF9pbiAtPSBsZW47XG4gIGJpdHMgLT0gbGVuIDw8IDM7XG4gIGhvbGQgJj0gKDEgPDwgYml0cykgLSAxO1xuXG4gIC8qIHVwZGF0ZSBzdGF0ZSBhbmQgcmV0dXJuICovXG4gIHN0cm0ubmV4dF9pbiA9IF9pbjtcbiAgc3RybS5uZXh0X291dCA9IF9vdXQ7XG4gIHN0cm0uYXZhaWxfaW4gPSAoX2luIDwgbGFzdCA/IDUgKyAobGFzdCAtIF9pbikgOiA1IC0gKF9pbiAtIGxhc3QpKTtcbiAgc3RybS5hdmFpbF9vdXQgPSAoX291dCA8IGVuZCA/IDI1NyArIChlbmQgLSBfb3V0KSA6IDI1NyAtIChfb3V0IC0gZW5kKSk7XG4gIHN0YXRlLmhvbGQgPSBob2xkO1xuICBzdGF0ZS5iaXRzID0gYml0cztcbiAgcmV0dXJuO1xufTtcbiIsIid1c2Ugc3RyaWN0JztcblxuXG52YXIgdXRpbHMgICAgICAgICA9IHJlcXVpcmUoJy4uL3V0aWxzL2NvbW1vbicpO1xudmFyIGFkbGVyMzIgICAgICAgPSByZXF1aXJlKCcuL2FkbGVyMzInKTtcbnZhciBjcmMzMiAgICAgICAgID0gcmVxdWlyZSgnLi9jcmMzMicpO1xudmFyIGluZmxhdGVfZmFzdCAgPSByZXF1aXJlKCcuL2luZmZhc3QnKTtcbnZhciBpbmZsYXRlX3RhYmxlID0gcmVxdWlyZSgnLi9pbmZ0cmVlcycpO1xuXG52YXIgQ09ERVMgPSAwO1xudmFyIExFTlMgPSAxO1xudmFyIERJU1RTID0gMjtcblxuLyogUHVibGljIGNvbnN0YW50cyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki9cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovXG5cblxuLyogQWxsb3dlZCBmbHVzaCB2YWx1ZXM7IHNlZSBkZWZsYXRlKCkgYW5kIGluZmxhdGUoKSBiZWxvdyBmb3IgZGV0YWlscyAqL1xuLy92YXIgWl9OT19GTFVTSCAgICAgID0gMDtcbi8vdmFyIFpfUEFSVElBTF9GTFVTSCA9IDE7XG4vL3ZhciBaX1NZTkNfRkxVU0ggICAgPSAyO1xuLy92YXIgWl9GVUxMX0ZMVVNIICAgID0gMztcbnZhciBaX0ZJTklTSCAgICAgICAgPSA0O1xudmFyIFpfQkxPQ0sgICAgICAgICA9IDU7XG52YXIgWl9UUkVFUyAgICAgICAgID0gNjtcblxuXG4vKiBSZXR1cm4gY29kZXMgZm9yIHRoZSBjb21wcmVzc2lvbi9kZWNvbXByZXNzaW9uIGZ1bmN0aW9ucy4gTmVnYXRpdmUgdmFsdWVzXG4gKiBhcmUgZXJyb3JzLCBwb3NpdGl2ZSB2YWx1ZXMgYXJlIHVzZWQgZm9yIHNwZWNpYWwgYnV0IG5vcm1hbCBldmVudHMuXG4gKi9cbnZhciBaX09LICAgICAgICAgICAgPSAwO1xudmFyIFpfU1RSRUFNX0VORCAgICA9IDE7XG52YXIgWl9ORUVEX0RJQ1QgICAgID0gMjtcbi8vdmFyIFpfRVJSTk8gICAgICAgICA9IC0xO1xudmFyIFpfU1RSRUFNX0VSUk9SICA9IC0yO1xudmFyIFpfREFUQV9FUlJPUiAgICA9IC0zO1xudmFyIFpfTUVNX0VSUk9SICAgICA9IC00O1xudmFyIFpfQlVGX0VSUk9SICAgICA9IC01O1xuLy92YXIgWl9WRVJTSU9OX0VSUk9SID0gLTY7XG5cbi8qIFRoZSBkZWZsYXRlIGNvbXByZXNzaW9uIG1ldGhvZCAqL1xudmFyIFpfREVGTEFURUQgID0gODtcblxuXG4vKiBTVEFURVMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0qL1xuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki9cblxuXG52YXIgICAgSEVBRCA9IDE7ICAgICAgIC8qIGk6IHdhaXRpbmcgZm9yIG1hZ2ljIGhlYWRlciAqL1xudmFyICAgIEZMQUdTID0gMjsgICAgICAvKiBpOiB3YWl0aW5nIGZvciBtZXRob2QgYW5kIGZsYWdzIChnemlwKSAqL1xudmFyICAgIFRJTUUgPSAzOyAgICAgICAvKiBpOiB3YWl0aW5nIGZvciBtb2RpZmljYXRpb24gdGltZSAoZ3ppcCkgKi9cbnZhciAgICBPUyA9IDQ7ICAgICAgICAgLyogaTogd2FpdGluZyBmb3IgZXh0cmEgZmxhZ3MgYW5kIG9wZXJhdGluZyBzeXN0ZW0gKGd6aXApICovXG52YXIgICAgRVhMRU4gPSA1OyAgICAgIC8qIGk6IHdhaXRpbmcgZm9yIGV4dHJhIGxlbmd0aCAoZ3ppcCkgKi9cbnZhciAgICBFWFRSQSA9IDY7ICAgICAgLyogaTogd2FpdGluZyBmb3IgZXh0cmEgYnl0ZXMgKGd6aXApICovXG52YXIgICAgTkFNRSA9IDc7ICAgICAgIC8qIGk6IHdhaXRpbmcgZm9yIGVuZCBvZiBmaWxlIG5hbWUgKGd6aXApICovXG52YXIgICAgQ09NTUVOVCA9IDg7ICAgIC8qIGk6IHdhaXRpbmcgZm9yIGVuZCBvZiBjb21tZW50IChnemlwKSAqL1xudmFyICAgIEhDUkMgPSA5OyAgICAgICAvKiBpOiB3YWl0aW5nIGZvciBoZWFkZXIgY3JjIChnemlwKSAqL1xudmFyICAgIERJQ1RJRCA9IDEwOyAgICAvKiBpOiB3YWl0aW5nIGZvciBkaWN0aW9uYXJ5IGNoZWNrIHZhbHVlICovXG52YXIgICAgRElDVCA9IDExOyAgICAgIC8qIHdhaXRpbmcgZm9yIGluZmxhdGVTZXREaWN0aW9uYXJ5KCkgY2FsbCAqL1xudmFyICAgICAgICBUWVBFID0gMTI7ICAgICAgLyogaTogd2FpdGluZyBmb3IgdHlwZSBiaXRzLCBpbmNsdWRpbmcgbGFzdC1mbGFnIGJpdCAqL1xudmFyICAgICAgICBUWVBFRE8gPSAxMzsgICAgLyogaTogc2FtZSwgYnV0IHNraXAgY2hlY2sgdG8gZXhpdCBpbmZsYXRlIG9uIG5ldyBibG9jayAqL1xudmFyICAgICAgICBTVE9SRUQgPSAxNDsgICAgLyogaTogd2FpdGluZyBmb3Igc3RvcmVkIHNpemUgKGxlbmd0aCBhbmQgY29tcGxlbWVudCkgKi9cbnZhciAgICAgICAgQ09QWV8gPSAxNTsgICAgIC8qIGkvbzogc2FtZSBhcyBDT1BZIGJlbG93LCBidXQgb25seSBmaXJzdCB0aW1lIGluICovXG52YXIgICAgICAgIENPUFkgPSAxNjsgICAgICAvKiBpL286IHdhaXRpbmcgZm9yIGlucHV0IG9yIG91dHB1dCB0byBjb3B5IHN0b3JlZCBibG9jayAqL1xudmFyICAgICAgICBUQUJMRSA9IDE3OyAgICAgLyogaTogd2FpdGluZyBmb3IgZHluYW1pYyBibG9jayB0YWJsZSBsZW5ndGhzICovXG52YXIgICAgICAgIExFTkxFTlMgPSAxODsgICAvKiBpOiB3YWl0aW5nIGZvciBjb2RlIGxlbmd0aCBjb2RlIGxlbmd0aHMgKi9cbnZhciAgICAgICAgQ09ERUxFTlMgPSAxOTsgIC8qIGk6IHdhaXRpbmcgZm9yIGxlbmd0aC9saXQgYW5kIGRpc3RhbmNlIGNvZGUgbGVuZ3RocyAqL1xudmFyICAgICAgICAgICAgTEVOXyA9IDIwOyAgICAgIC8qIGk6IHNhbWUgYXMgTEVOIGJlbG93LCBidXQgb25seSBmaXJzdCB0aW1lIGluICovXG52YXIgICAgICAgICAgICBMRU4gPSAyMTsgICAgICAgLyogaTogd2FpdGluZyBmb3IgbGVuZ3RoL2xpdC9lb2IgY29kZSAqL1xudmFyICAgICAgICAgICAgTEVORVhUID0gMjI7ICAgIC8qIGk6IHdhaXRpbmcgZm9yIGxlbmd0aCBleHRyYSBiaXRzICovXG52YXIgICAgICAgICAgICBESVNUID0gMjM7ICAgICAgLyogaTogd2FpdGluZyBmb3IgZGlzdGFuY2UgY29kZSAqL1xudmFyICAgICAgICAgICAgRElTVEVYVCA9IDI0OyAgIC8qIGk6IHdhaXRpbmcgZm9yIGRpc3RhbmNlIGV4dHJhIGJpdHMgKi9cbnZhciAgICAgICAgICAgIE1BVENIID0gMjU7ICAgICAvKiBvOiB3YWl0aW5nIGZvciBvdXRwdXQgc3BhY2UgdG8gY29weSBzdHJpbmcgKi9cbnZhciAgICAgICAgICAgIExJVCA9IDI2OyAgICAgICAvKiBvOiB3YWl0aW5nIGZvciBvdXRwdXQgc3BhY2UgdG8gd3JpdGUgbGl0ZXJhbCAqL1xudmFyICAgIENIRUNLID0gMjc7ICAgICAvKiBpOiB3YWl0aW5nIGZvciAzMi1iaXQgY2hlY2sgdmFsdWUgKi9cbnZhciAgICBMRU5HVEggPSAyODsgICAgLyogaTogd2FpdGluZyBmb3IgMzItYml0IGxlbmd0aCAoZ3ppcCkgKi9cbnZhciAgICBET05FID0gMjk7ICAgICAgLyogZmluaXNoZWQgY2hlY2ssIGRvbmUgLS0gcmVtYWluIGhlcmUgdW50aWwgcmVzZXQgKi9cbnZhciAgICBCQUQgPSAzMDsgICAgICAgLyogZ290IGEgZGF0YSBlcnJvciAtLSByZW1haW4gaGVyZSB1bnRpbCByZXNldCAqL1xudmFyICAgIE1FTSA9IDMxOyAgICAgICAvKiBnb3QgYW4gaW5mbGF0ZSgpIG1lbW9yeSBlcnJvciAtLSByZW1haW4gaGVyZSB1bnRpbCByZXNldCAqL1xudmFyICAgIFNZTkMgPSAzMjsgICAgICAvKiBsb29raW5nIGZvciBzeW5jaHJvbml6YXRpb24gYnl0ZXMgdG8gcmVzdGFydCBpbmZsYXRlKCkgKi9cblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki9cblxuXG5cbnZhciBFTk9VR0hfTEVOUyA9IDg1MjtcbnZhciBFTk9VR0hfRElTVFMgPSA1OTI7XG4vL3ZhciBFTk9VR0ggPSAgKEVOT1VHSF9MRU5TK0VOT1VHSF9ESVNUUyk7XG5cbnZhciBNQVhfV0JJVFMgPSAxNTtcbi8qIDMySyBMWjc3IHdpbmRvdyAqL1xudmFyIERFRl9XQklUUyA9IE1BWF9XQklUUztcblxuXG5mdW5jdGlvbiB6c3dhcDMyKHEpIHtcbiAgcmV0dXJuICAoKChxID4+PiAyNCkgJiAweGZmKSArXG4gICAgICAgICAgKChxID4+PiA4KSAmIDB4ZmYwMCkgK1xuICAgICAgICAgICgocSAmIDB4ZmYwMCkgPDwgOCkgK1xuICAgICAgICAgICgocSAmIDB4ZmYpIDw8IDI0KSk7XG59XG5cblxuZnVuY3Rpb24gSW5mbGF0ZVN0YXRlKCkge1xuICB0aGlzLm1vZGUgPSAwOyAgICAgICAgICAgICAvKiBjdXJyZW50IGluZmxhdGUgbW9kZSAqL1xuICB0aGlzLmxhc3QgPSBmYWxzZTsgICAgICAgICAgLyogdHJ1ZSBpZiBwcm9jZXNzaW5nIGxhc3QgYmxvY2sgKi9cbiAgdGhpcy53cmFwID0gMDsgICAgICAgICAgICAgIC8qIGJpdCAwIHRydWUgZm9yIHpsaWIsIGJpdCAxIHRydWUgZm9yIGd6aXAgKi9cbiAgdGhpcy5oYXZlZGljdCA9IGZhbHNlOyAgICAgIC8qIHRydWUgaWYgZGljdGlvbmFyeSBwcm92aWRlZCAqL1xuICB0aGlzLmZsYWdzID0gMDsgICAgICAgICAgICAgLyogZ3ppcCBoZWFkZXIgbWV0aG9kIGFuZCBmbGFncyAoMCBpZiB6bGliKSAqL1xuICB0aGlzLmRtYXggPSAwOyAgICAgICAgICAgICAgLyogemxpYiBoZWFkZXIgbWF4IGRpc3RhbmNlIChJTkZMQVRFX1NUUklDVCkgKi9cbiAgdGhpcy5jaGVjayA9IDA7ICAgICAgICAgICAgIC8qIHByb3RlY3RlZCBjb3B5IG9mIGNoZWNrIHZhbHVlICovXG4gIHRoaXMudG90YWwgPSAwOyAgICAgICAgICAgICAvKiBwcm90ZWN0ZWQgY29weSBvZiBvdXRwdXQgY291bnQgKi9cbiAgLy8gVE9ETzogbWF5IGJlIHt9XG4gIHRoaXMuaGVhZCA9IG51bGw7ICAgICAgICAgICAvKiB3aGVyZSB0byBzYXZlIGd6aXAgaGVhZGVyIGluZm9ybWF0aW9uICovXG5cbiAgLyogc2xpZGluZyB3aW5kb3cgKi9cbiAgdGhpcy53Yml0cyA9IDA7ICAgICAgICAgICAgIC8qIGxvZyBiYXNlIDIgb2YgcmVxdWVzdGVkIHdpbmRvdyBzaXplICovXG4gIHRoaXMud3NpemUgPSAwOyAgICAgICAgICAgICAvKiB3aW5kb3cgc2l6ZSBvciB6ZXJvIGlmIG5vdCB1c2luZyB3aW5kb3cgKi9cbiAgdGhpcy53aGF2ZSA9IDA7ICAgICAgICAgICAgIC8qIHZhbGlkIGJ5dGVzIGluIHRoZSB3aW5kb3cgKi9cbiAgdGhpcy53bmV4dCA9IDA7ICAgICAgICAgICAgIC8qIHdpbmRvdyB3cml0ZSBpbmRleCAqL1xuICB0aGlzLndpbmRvdyA9IG51bGw7ICAgICAgICAgLyogYWxsb2NhdGVkIHNsaWRpbmcgd2luZG93LCBpZiBuZWVkZWQgKi9cblxuICAvKiBiaXQgYWNjdW11bGF0b3IgKi9cbiAgdGhpcy5ob2xkID0gMDsgICAgICAgICAgICAgIC8qIGlucHV0IGJpdCBhY2N1bXVsYXRvciAqL1xuICB0aGlzLmJpdHMgPSAwOyAgICAgICAgICAgICAgLyogbnVtYmVyIG9mIGJpdHMgaW4gXCJpblwiICovXG5cbiAgLyogZm9yIHN0cmluZyBhbmQgc3RvcmVkIGJsb2NrIGNvcHlpbmcgKi9cbiAgdGhpcy5sZW5ndGggPSAwOyAgICAgICAgICAgIC8qIGxpdGVyYWwgb3IgbGVuZ3RoIG9mIGRhdGEgdG8gY29weSAqL1xuICB0aGlzLm9mZnNldCA9IDA7ICAgICAgICAgICAgLyogZGlzdGFuY2UgYmFjayB0byBjb3B5IHN0cmluZyBmcm9tICovXG5cbiAgLyogZm9yIHRhYmxlIGFuZCBjb2RlIGRlY29kaW5nICovXG4gIHRoaXMuZXh0cmEgPSAwOyAgICAgICAgICAgICAvKiBleHRyYSBiaXRzIG5lZWRlZCAqL1xuXG4gIC8qIGZpeGVkIGFuZCBkeW5hbWljIGNvZGUgdGFibGVzICovXG4gIHRoaXMubGVuY29kZSA9IG51bGw7ICAgICAgICAgIC8qIHN0YXJ0aW5nIHRhYmxlIGZvciBsZW5ndGgvbGl0ZXJhbCBjb2RlcyAqL1xuICB0aGlzLmRpc3Rjb2RlID0gbnVsbDsgICAgICAgICAvKiBzdGFydGluZyB0YWJsZSBmb3IgZGlzdGFuY2UgY29kZXMgKi9cbiAgdGhpcy5sZW5iaXRzID0gMDsgICAgICAgICAgIC8qIGluZGV4IGJpdHMgZm9yIGxlbmNvZGUgKi9cbiAgdGhpcy5kaXN0Yml0cyA9IDA7ICAgICAgICAgIC8qIGluZGV4IGJpdHMgZm9yIGRpc3Rjb2RlICovXG5cbiAgLyogZHluYW1pYyB0YWJsZSBidWlsZGluZyAqL1xuICB0aGlzLm5jb2RlID0gMDsgICAgICAgICAgICAgLyogbnVtYmVyIG9mIGNvZGUgbGVuZ3RoIGNvZGUgbGVuZ3RocyAqL1xuICB0aGlzLm5sZW4gPSAwOyAgICAgICAgICAgICAgLyogbnVtYmVyIG9mIGxlbmd0aCBjb2RlIGxlbmd0aHMgKi9cbiAgdGhpcy5uZGlzdCA9IDA7ICAgICAgICAgICAgIC8qIG51bWJlciBvZiBkaXN0YW5jZSBjb2RlIGxlbmd0aHMgKi9cbiAgdGhpcy5oYXZlID0gMDsgICAgICAgICAgICAgIC8qIG51bWJlciBvZiBjb2RlIGxlbmd0aHMgaW4gbGVuc1tdICovXG4gIHRoaXMubmV4dCA9IG51bGw7ICAgICAgICAgICAgICAvKiBuZXh0IGF2YWlsYWJsZSBzcGFjZSBpbiBjb2Rlc1tdICovXG5cbiAgdGhpcy5sZW5zID0gbmV3IHV0aWxzLkJ1ZjE2KDMyMCk7IC8qIHRlbXBvcmFyeSBzdG9yYWdlIGZvciBjb2RlIGxlbmd0aHMgKi9cbiAgdGhpcy53b3JrID0gbmV3IHV0aWxzLkJ1ZjE2KDI4OCk7IC8qIHdvcmsgYXJlYSBmb3IgY29kZSB0YWJsZSBidWlsZGluZyAqL1xuXG4gIC8qXG4gICBiZWNhdXNlIHdlIGRvbid0IGhhdmUgcG9pbnRlcnMgaW4ganMsIHdlIHVzZSBsZW5jb2RlIGFuZCBkaXN0Y29kZSBkaXJlY3RseVxuICAgYXMgYnVmZmVycyBzbyB3ZSBkb24ndCBuZWVkIGNvZGVzXG4gICovXG4gIC8vdGhpcy5jb2RlcyA9IG5ldyB1dGlscy5CdWYzMihFTk9VR0gpOyAgICAgICAvKiBzcGFjZSBmb3IgY29kZSB0YWJsZXMgKi9cbiAgdGhpcy5sZW5keW4gPSBudWxsOyAgICAgICAgICAgICAgLyogZHluYW1pYyB0YWJsZSBmb3IgbGVuZ3RoL2xpdGVyYWwgY29kZXMgKEpTIHNwZWNpZmljKSAqL1xuICB0aGlzLmRpc3RkeW4gPSBudWxsOyAgICAgICAgICAgICAvKiBkeW5hbWljIHRhYmxlIGZvciBkaXN0YW5jZSBjb2RlcyAoSlMgc3BlY2lmaWMpICovXG4gIHRoaXMuc2FuZSA9IDA7ICAgICAgICAgICAgICAgICAgIC8qIGlmIGZhbHNlLCBhbGxvdyBpbnZhbGlkIGRpc3RhbmNlIHRvbyBmYXIgKi9cbiAgdGhpcy5iYWNrID0gMDsgICAgICAgICAgICAgICAgICAgLyogYml0cyBiYWNrIG9mIGxhc3QgdW5wcm9jZXNzZWQgbGVuZ3RoL2xpdCAqL1xuICB0aGlzLndhcyA9IDA7ICAgICAgICAgICAgICAgICAgICAvKiBpbml0aWFsIGxlbmd0aCBvZiBtYXRjaCAqL1xufVxuXG5mdW5jdGlvbiBpbmZsYXRlUmVzZXRLZWVwKHN0cm0pIHtcbiAgdmFyIHN0YXRlO1xuXG4gIGlmICghc3RybSB8fCAhc3RybS5zdGF0ZSkgeyByZXR1cm4gWl9TVFJFQU1fRVJST1I7IH1cbiAgc3RhdGUgPSBzdHJtLnN0YXRlO1xuICBzdHJtLnRvdGFsX2luID0gc3RybS50b3RhbF9vdXQgPSBzdGF0ZS50b3RhbCA9IDA7XG4gIHN0cm0ubXNnID0gJyc7IC8qWl9OVUxMKi9cbiAgaWYgKHN0YXRlLndyYXApIHsgICAgICAgLyogdG8gc3VwcG9ydCBpbGwtY29uY2VpdmVkIEphdmEgdGVzdCBzdWl0ZSAqL1xuICAgIHN0cm0uYWRsZXIgPSBzdGF0ZS53cmFwICYgMTtcbiAgfVxuICBzdGF0ZS5tb2RlID0gSEVBRDtcbiAgc3RhdGUubGFzdCA9IDA7XG4gIHN0YXRlLmhhdmVkaWN0ID0gMDtcbiAgc3RhdGUuZG1heCA9IDMyNzY4O1xuICBzdGF0ZS5oZWFkID0gbnVsbC8qWl9OVUxMKi87XG4gIHN0YXRlLmhvbGQgPSAwO1xuICBzdGF0ZS5iaXRzID0gMDtcbiAgLy9zdGF0ZS5sZW5jb2RlID0gc3RhdGUuZGlzdGNvZGUgPSBzdGF0ZS5uZXh0ID0gc3RhdGUuY29kZXM7XG4gIHN0YXRlLmxlbmNvZGUgPSBzdGF0ZS5sZW5keW4gPSBuZXcgdXRpbHMuQnVmMzIoRU5PVUdIX0xFTlMpO1xuICBzdGF0ZS5kaXN0Y29kZSA9IHN0YXRlLmRpc3RkeW4gPSBuZXcgdXRpbHMuQnVmMzIoRU5PVUdIX0RJU1RTKTtcblxuICBzdGF0ZS5zYW5lID0gMTtcbiAgc3RhdGUuYmFjayA9IC0xO1xuICAvL1RyYWNldigoc3RkZXJyLCBcImluZmxhdGU6IHJlc2V0XFxuXCIpKTtcbiAgcmV0dXJuIFpfT0s7XG59XG5cbmZ1bmN0aW9uIGluZmxhdGVSZXNldChzdHJtKSB7XG4gIHZhciBzdGF0ZTtcblxuICBpZiAoIXN0cm0gfHwgIXN0cm0uc3RhdGUpIHsgcmV0dXJuIFpfU1RSRUFNX0VSUk9SOyB9XG4gIHN0YXRlID0gc3RybS5zdGF0ZTtcbiAgc3RhdGUud3NpemUgPSAwO1xuICBzdGF0ZS53aGF2ZSA9IDA7XG4gIHN0YXRlLnduZXh0ID0gMDtcbiAgcmV0dXJuIGluZmxhdGVSZXNldEtlZXAoc3RybSk7XG5cbn1cblxuZnVuY3Rpb24gaW5mbGF0ZVJlc2V0MihzdHJtLCB3aW5kb3dCaXRzKSB7XG4gIHZhciB3cmFwO1xuICB2YXIgc3RhdGU7XG5cbiAgLyogZ2V0IHRoZSBzdGF0ZSAqL1xuICBpZiAoIXN0cm0gfHwgIXN0cm0uc3RhdGUpIHsgcmV0dXJuIFpfU1RSRUFNX0VSUk9SOyB9XG4gIHN0YXRlID0gc3RybS5zdGF0ZTtcblxuICAvKiBleHRyYWN0IHdyYXAgcmVxdWVzdCBmcm9tIHdpbmRvd0JpdHMgcGFyYW1ldGVyICovXG4gIGlmICh3aW5kb3dCaXRzIDwgMCkge1xuICAgIHdyYXAgPSAwO1xuICAgIHdpbmRvd0JpdHMgPSAtd2luZG93Qml0cztcbiAgfVxuICBlbHNlIHtcbiAgICB3cmFwID0gKHdpbmRvd0JpdHMgPj4gNCkgKyAxO1xuICAgIGlmICh3aW5kb3dCaXRzIDwgNDgpIHtcbiAgICAgIHdpbmRvd0JpdHMgJj0gMTU7XG4gICAgfVxuICB9XG5cbiAgLyogc2V0IG51bWJlciBvZiB3aW5kb3cgYml0cywgZnJlZSB3aW5kb3cgaWYgZGlmZmVyZW50ICovXG4gIGlmICh3aW5kb3dCaXRzICYmICh3aW5kb3dCaXRzIDwgOCB8fCB3aW5kb3dCaXRzID4gMTUpKSB7XG4gICAgcmV0dXJuIFpfU1RSRUFNX0VSUk9SO1xuICB9XG4gIGlmIChzdGF0ZS53aW5kb3cgIT09IG51bGwgJiYgc3RhdGUud2JpdHMgIT09IHdpbmRvd0JpdHMpIHtcbiAgICBzdGF0ZS53aW5kb3cgPSBudWxsO1xuICB9XG5cbiAgLyogdXBkYXRlIHN0YXRlIGFuZCByZXNldCB0aGUgcmVzdCBvZiBpdCAqL1xuICBzdGF0ZS53cmFwID0gd3JhcDtcbiAgc3RhdGUud2JpdHMgPSB3aW5kb3dCaXRzO1xuICByZXR1cm4gaW5mbGF0ZVJlc2V0KHN0cm0pO1xufVxuXG5mdW5jdGlvbiBpbmZsYXRlSW5pdDIoc3RybSwgd2luZG93Qml0cykge1xuICB2YXIgcmV0O1xuICB2YXIgc3RhdGU7XG5cbiAgaWYgKCFzdHJtKSB7IHJldHVybiBaX1NUUkVBTV9FUlJPUjsgfVxuICAvL3N0cm0ubXNnID0gWl9OVUxMOyAgICAgICAgICAgICAgICAgLyogaW4gY2FzZSB3ZSByZXR1cm4gYW4gZXJyb3IgKi9cblxuICBzdGF0ZSA9IG5ldyBJbmZsYXRlU3RhdGUoKTtcblxuICAvL2lmIChzdGF0ZSA9PT0gWl9OVUxMKSByZXR1cm4gWl9NRU1fRVJST1I7XG4gIC8vVHJhY2V2KChzdGRlcnIsIFwiaW5mbGF0ZTogYWxsb2NhdGVkXFxuXCIpKTtcbiAgc3RybS5zdGF0ZSA9IHN0YXRlO1xuICBzdGF0ZS53aW5kb3cgPSBudWxsLypaX05VTEwqLztcbiAgcmV0ID0gaW5mbGF0ZVJlc2V0MihzdHJtLCB3aW5kb3dCaXRzKTtcbiAgaWYgKHJldCAhPT0gWl9PSykge1xuICAgIHN0cm0uc3RhdGUgPSBudWxsLypaX05VTEwqLztcbiAgfVxuICByZXR1cm4gcmV0O1xufVxuXG5mdW5jdGlvbiBpbmZsYXRlSW5pdChzdHJtKSB7XG4gIHJldHVybiBpbmZsYXRlSW5pdDIoc3RybSwgREVGX1dCSVRTKTtcbn1cblxuXG4vKlxuIFJldHVybiBzdGF0ZSB3aXRoIGxlbmd0aCBhbmQgZGlzdGFuY2UgZGVjb2RpbmcgdGFibGVzIGFuZCBpbmRleCBzaXplcyBzZXQgdG9cbiBmaXhlZCBjb2RlIGRlY29kaW5nLiAgTm9ybWFsbHkgdGhpcyByZXR1cm5zIGZpeGVkIHRhYmxlcyBmcm9tIGluZmZpeGVkLmguXG4gSWYgQlVJTERGSVhFRCBpcyBkZWZpbmVkLCB0aGVuIGluc3RlYWQgdGhpcyByb3V0aW5lIGJ1aWxkcyB0aGUgdGFibGVzIHRoZVxuIGZpcnN0IHRpbWUgaXQncyBjYWxsZWQsIGFuZCByZXR1cm5zIHRob3NlIHRhYmxlcyB0aGUgZmlyc3QgdGltZSBhbmRcbiB0aGVyZWFmdGVyLiAgVGhpcyByZWR1Y2VzIHRoZSBzaXplIG9mIHRoZSBjb2RlIGJ5IGFib3V0IDJLIGJ5dGVzLCBpblxuIGV4Y2hhbmdlIGZvciBhIGxpdHRsZSBleGVjdXRpb24gdGltZS4gIEhvd2V2ZXIsIEJVSUxERklYRUQgc2hvdWxkIG5vdCBiZVxuIHVzZWQgZm9yIHRocmVhZGVkIGFwcGxpY2F0aW9ucywgc2luY2UgdGhlIHJld3JpdGluZyBvZiB0aGUgdGFibGVzIGFuZCB2aXJnaW5cbiBtYXkgbm90IGJlIHRocmVhZC1zYWZlLlxuICovXG52YXIgdmlyZ2luID0gdHJ1ZTtcblxudmFyIGxlbmZpeCwgZGlzdGZpeDsgLy8gV2UgaGF2ZSBubyBwb2ludGVycyBpbiBKUywgc28ga2VlcCB0YWJsZXMgc2VwYXJhdGVcblxuZnVuY3Rpb24gZml4ZWR0YWJsZXMoc3RhdGUpIHtcbiAgLyogYnVpbGQgZml4ZWQgaHVmZm1hbiB0YWJsZXMgaWYgZmlyc3QgY2FsbCAobWF5IG5vdCBiZSB0aHJlYWQgc2FmZSkgKi9cbiAgaWYgKHZpcmdpbikge1xuICAgIHZhciBzeW07XG5cbiAgICBsZW5maXggPSBuZXcgdXRpbHMuQnVmMzIoNTEyKTtcbiAgICBkaXN0Zml4ID0gbmV3IHV0aWxzLkJ1ZjMyKDMyKTtcblxuICAgIC8qIGxpdGVyYWwvbGVuZ3RoIHRhYmxlICovXG4gICAgc3ltID0gMDtcbiAgICB3aGlsZSAoc3ltIDwgMTQ0KSB7IHN0YXRlLmxlbnNbc3ltKytdID0gODsgfVxuICAgIHdoaWxlIChzeW0gPCAyNTYpIHsgc3RhdGUubGVuc1tzeW0rK10gPSA5OyB9XG4gICAgd2hpbGUgKHN5bSA8IDI4MCkgeyBzdGF0ZS5sZW5zW3N5bSsrXSA9IDc7IH1cbiAgICB3aGlsZSAoc3ltIDwgMjg4KSB7IHN0YXRlLmxlbnNbc3ltKytdID0gODsgfVxuXG4gICAgaW5mbGF0ZV90YWJsZShMRU5TLCAgc3RhdGUubGVucywgMCwgMjg4LCBsZW5maXgsICAgMCwgc3RhdGUud29yaywgeyBiaXRzOiA5IH0pO1xuXG4gICAgLyogZGlzdGFuY2UgdGFibGUgKi9cbiAgICBzeW0gPSAwO1xuICAgIHdoaWxlIChzeW0gPCAzMikgeyBzdGF0ZS5sZW5zW3N5bSsrXSA9IDU7IH1cblxuICAgIGluZmxhdGVfdGFibGUoRElTVFMsIHN0YXRlLmxlbnMsIDAsIDMyLCAgIGRpc3RmaXgsIDAsIHN0YXRlLndvcmssIHsgYml0czogNSB9KTtcblxuICAgIC8qIGRvIHRoaXMganVzdCBvbmNlICovXG4gICAgdmlyZ2luID0gZmFsc2U7XG4gIH1cblxuICBzdGF0ZS5sZW5jb2RlID0gbGVuZml4O1xuICBzdGF0ZS5sZW5iaXRzID0gOTtcbiAgc3RhdGUuZGlzdGNvZGUgPSBkaXN0Zml4O1xuICBzdGF0ZS5kaXN0Yml0cyA9IDU7XG59XG5cblxuLypcbiBVcGRhdGUgdGhlIHdpbmRvdyB3aXRoIHRoZSBsYXN0IHdzaXplIChub3JtYWxseSAzMkspIGJ5dGVzIHdyaXR0ZW4gYmVmb3JlXG4gcmV0dXJuaW5nLiAgSWYgd2luZG93IGRvZXMgbm90IGV4aXN0IHlldCwgY3JlYXRlIGl0LiAgVGhpcyBpcyBvbmx5IGNhbGxlZFxuIHdoZW4gYSB3aW5kb3cgaXMgYWxyZWFkeSBpbiB1c2UsIG9yIHdoZW4gb3V0cHV0IGhhcyBiZWVuIHdyaXR0ZW4gZHVyaW5nIHRoaXNcbiBpbmZsYXRlIGNhbGwsIGJ1dCB0aGUgZW5kIG9mIHRoZSBkZWZsYXRlIHN0cmVhbSBoYXMgbm90IGJlZW4gcmVhY2hlZCB5ZXQuXG4gSXQgaXMgYWxzbyBjYWxsZWQgdG8gY3JlYXRlIGEgd2luZG93IGZvciBkaWN0aW9uYXJ5IGRhdGEgd2hlbiBhIGRpY3Rpb25hcnlcbiBpcyBsb2FkZWQuXG5cbiBQcm92aWRpbmcgb3V0cHV0IGJ1ZmZlcnMgbGFyZ2VyIHRoYW4gMzJLIHRvIGluZmxhdGUoKSBzaG91bGQgcHJvdmlkZSBhIHNwZWVkXG4gYWR2YW50YWdlLCBzaW5jZSBvbmx5IHRoZSBsYXN0IDMySyBvZiBvdXRwdXQgaXMgY29waWVkIHRvIHRoZSBzbGlkaW5nIHdpbmRvd1xuIHVwb24gcmV0dXJuIGZyb20gaW5mbGF0ZSgpLCBhbmQgc2luY2UgYWxsIGRpc3RhbmNlcyBhZnRlciB0aGUgZmlyc3QgMzJLIG9mXG4gb3V0cHV0IHdpbGwgZmFsbCBpbiB0aGUgb3V0cHV0IGRhdGEsIG1ha2luZyBtYXRjaCBjb3BpZXMgc2ltcGxlciBhbmQgZmFzdGVyLlxuIFRoZSBhZHZhbnRhZ2UgbWF5IGJlIGRlcGVuZGVudCBvbiB0aGUgc2l6ZSBvZiB0aGUgcHJvY2Vzc29yJ3MgZGF0YSBjYWNoZXMuXG4gKi9cbmZ1bmN0aW9uIHVwZGF0ZXdpbmRvdyhzdHJtLCBzcmMsIGVuZCwgY29weSkge1xuICB2YXIgZGlzdDtcbiAgdmFyIHN0YXRlID0gc3RybS5zdGF0ZTtcblxuICAvKiBpZiBpdCBoYXNuJ3QgYmVlbiBkb25lIGFscmVhZHksIGFsbG9jYXRlIHNwYWNlIGZvciB0aGUgd2luZG93ICovXG4gIGlmIChzdGF0ZS53aW5kb3cgPT09IG51bGwpIHtcbiAgICBzdGF0ZS53c2l6ZSA9IDEgPDwgc3RhdGUud2JpdHM7XG4gICAgc3RhdGUud25leHQgPSAwO1xuICAgIHN0YXRlLndoYXZlID0gMDtcblxuICAgIHN0YXRlLndpbmRvdyA9IG5ldyB1dGlscy5CdWY4KHN0YXRlLndzaXplKTtcbiAgfVxuXG4gIC8qIGNvcHkgc3RhdGUtPndzaXplIG9yIGxlc3Mgb3V0cHV0IGJ5dGVzIGludG8gdGhlIGNpcmN1bGFyIHdpbmRvdyAqL1xuICBpZiAoY29weSA+PSBzdGF0ZS53c2l6ZSkge1xuICAgIHV0aWxzLmFycmF5U2V0KHN0YXRlLndpbmRvdywgc3JjLCBlbmQgLSBzdGF0ZS53c2l6ZSwgc3RhdGUud3NpemUsIDApO1xuICAgIHN0YXRlLnduZXh0ID0gMDtcbiAgICBzdGF0ZS53aGF2ZSA9IHN0YXRlLndzaXplO1xuICB9XG4gIGVsc2Uge1xuICAgIGRpc3QgPSBzdGF0ZS53c2l6ZSAtIHN0YXRlLnduZXh0O1xuICAgIGlmIChkaXN0ID4gY29weSkge1xuICAgICAgZGlzdCA9IGNvcHk7XG4gICAgfVxuICAgIC8vem1lbWNweShzdGF0ZS0+d2luZG93ICsgc3RhdGUtPnduZXh0LCBlbmQgLSBjb3B5LCBkaXN0KTtcbiAgICB1dGlscy5hcnJheVNldChzdGF0ZS53aW5kb3csIHNyYywgZW5kIC0gY29weSwgZGlzdCwgc3RhdGUud25leHQpO1xuICAgIGNvcHkgLT0gZGlzdDtcbiAgICBpZiAoY29weSkge1xuICAgICAgLy96bWVtY3B5KHN0YXRlLT53aW5kb3csIGVuZCAtIGNvcHksIGNvcHkpO1xuICAgICAgdXRpbHMuYXJyYXlTZXQoc3RhdGUud2luZG93LCBzcmMsIGVuZCAtIGNvcHksIGNvcHksIDApO1xuICAgICAgc3RhdGUud25leHQgPSBjb3B5O1xuICAgICAgc3RhdGUud2hhdmUgPSBzdGF0ZS53c2l6ZTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICBzdGF0ZS53bmV4dCArPSBkaXN0O1xuICAgICAgaWYgKHN0YXRlLnduZXh0ID09PSBzdGF0ZS53c2l6ZSkgeyBzdGF0ZS53bmV4dCA9IDA7IH1cbiAgICAgIGlmIChzdGF0ZS53aGF2ZSA8IHN0YXRlLndzaXplKSB7IHN0YXRlLndoYXZlICs9IGRpc3Q7IH1cbiAgICB9XG4gIH1cbiAgcmV0dXJuIDA7XG59XG5cbmZ1bmN0aW9uIGluZmxhdGUoc3RybSwgZmx1c2gpIHtcbiAgdmFyIHN0YXRlO1xuICB2YXIgaW5wdXQsIG91dHB1dDsgICAgICAgICAgLy8gaW5wdXQvb3V0cHV0IGJ1ZmZlcnNcbiAgdmFyIG5leHQ7ICAgICAgICAgICAgICAgICAgIC8qIG5leHQgaW5wdXQgSU5ERVggKi9cbiAgdmFyIHB1dDsgICAgICAgICAgICAgICAgICAgIC8qIG5leHQgb3V0cHV0IElOREVYICovXG4gIHZhciBoYXZlLCBsZWZ0OyAgICAgICAgICAgICAvKiBhdmFpbGFibGUgaW5wdXQgYW5kIG91dHB1dCAqL1xuICB2YXIgaG9sZDsgICAgICAgICAgICAgICAgICAgLyogYml0IGJ1ZmZlciAqL1xuICB2YXIgYml0czsgICAgICAgICAgICAgICAgICAgLyogYml0cyBpbiBiaXQgYnVmZmVyICovXG4gIHZhciBfaW4sIF9vdXQ7ICAgICAgICAgICAgICAvKiBzYXZlIHN0YXJ0aW5nIGF2YWlsYWJsZSBpbnB1dCBhbmQgb3V0cHV0ICovXG4gIHZhciBjb3B5OyAgICAgICAgICAgICAgICAgICAvKiBudW1iZXIgb2Ygc3RvcmVkIG9yIG1hdGNoIGJ5dGVzIHRvIGNvcHkgKi9cbiAgdmFyIGZyb207ICAgICAgICAgICAgICAgICAgIC8qIHdoZXJlIHRvIGNvcHkgbWF0Y2ggYnl0ZXMgZnJvbSAqL1xuICB2YXIgZnJvbV9zb3VyY2U7XG4gIHZhciBoZXJlID0gMDsgICAgICAgICAgICAgICAvKiBjdXJyZW50IGRlY29kaW5nIHRhYmxlIGVudHJ5ICovXG4gIHZhciBoZXJlX2JpdHMsIGhlcmVfb3AsIGhlcmVfdmFsOyAvLyBwYWtlZCBcImhlcmVcIiBkZW5vcm1hbGl6ZWQgKEpTIHNwZWNpZmljKVxuICAvL3ZhciBsYXN0OyAgICAgICAgICAgICAgICAgICAvKiBwYXJlbnQgdGFibGUgZW50cnkgKi9cbiAgdmFyIGxhc3RfYml0cywgbGFzdF9vcCwgbGFzdF92YWw7IC8vIHBha2VkIFwibGFzdFwiIGRlbm9ybWFsaXplZCAoSlMgc3BlY2lmaWMpXG4gIHZhciBsZW47ICAgICAgICAgICAgICAgICAgICAvKiBsZW5ndGggdG8gY29weSBmb3IgcmVwZWF0cywgYml0cyB0byBkcm9wICovXG4gIHZhciByZXQ7ICAgICAgICAgICAgICAgICAgICAvKiByZXR1cm4gY29kZSAqL1xuICB2YXIgaGJ1ZiA9IG5ldyB1dGlscy5CdWY4KDQpOyAgICAvKiBidWZmZXIgZm9yIGd6aXAgaGVhZGVyIGNyYyBjYWxjdWxhdGlvbiAqL1xuICB2YXIgb3B0cztcblxuICB2YXIgbjsgLy8gdGVtcG9yYXJ5IHZhciBmb3IgTkVFRF9CSVRTXG5cbiAgdmFyIG9yZGVyID0gLyogcGVybXV0YXRpb24gb2YgY29kZSBsZW5ndGhzICovXG4gICAgWyAxNiwgMTcsIDE4LCAwLCA4LCA3LCA5LCA2LCAxMCwgNSwgMTEsIDQsIDEyLCAzLCAxMywgMiwgMTQsIDEsIDE1IF07XG5cblxuICBpZiAoIXN0cm0gfHwgIXN0cm0uc3RhdGUgfHwgIXN0cm0ub3V0cHV0IHx8XG4gICAgICAoIXN0cm0uaW5wdXQgJiYgc3RybS5hdmFpbF9pbiAhPT0gMCkpIHtcbiAgICByZXR1cm4gWl9TVFJFQU1fRVJST1I7XG4gIH1cblxuICBzdGF0ZSA9IHN0cm0uc3RhdGU7XG4gIGlmIChzdGF0ZS5tb2RlID09PSBUWVBFKSB7IHN0YXRlLm1vZGUgPSBUWVBFRE87IH0gICAgLyogc2tpcCBjaGVjayAqL1xuXG5cbiAgLy8tLS0gTE9BRCgpIC0tLVxuICBwdXQgPSBzdHJtLm5leHRfb3V0O1xuICBvdXRwdXQgPSBzdHJtLm91dHB1dDtcbiAgbGVmdCA9IHN0cm0uYXZhaWxfb3V0O1xuICBuZXh0ID0gc3RybS5uZXh0X2luO1xuICBpbnB1dCA9IHN0cm0uaW5wdXQ7XG4gIGhhdmUgPSBzdHJtLmF2YWlsX2luO1xuICBob2xkID0gc3RhdGUuaG9sZDtcbiAgYml0cyA9IHN0YXRlLmJpdHM7XG4gIC8vLS0tXG5cbiAgX2luID0gaGF2ZTtcbiAgX291dCA9IGxlZnQ7XG4gIHJldCA9IFpfT0s7XG5cbiAgaW5mX2xlYXZlOiAvLyBnb3RvIGVtdWxhdGlvblxuICBmb3IgKDs7KSB7XG4gICAgc3dpdGNoIChzdGF0ZS5tb2RlKSB7XG4gICAgY2FzZSBIRUFEOlxuICAgICAgaWYgKHN0YXRlLndyYXAgPT09IDApIHtcbiAgICAgICAgc3RhdGUubW9kZSA9IFRZUEVETztcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICAvLz09PSBORUVEQklUUygxNik7XG4gICAgICB3aGlsZSAoYml0cyA8IDE2KSB7XG4gICAgICAgIGlmIChoYXZlID09PSAwKSB7IGJyZWFrIGluZl9sZWF2ZTsgfVxuICAgICAgICBoYXZlLS07XG4gICAgICAgIGhvbGQgKz0gaW5wdXRbbmV4dCsrXSA8PCBiaXRzO1xuICAgICAgICBiaXRzICs9IDg7XG4gICAgICB9XG4gICAgICAvLz09PS8vXG4gICAgICBpZiAoKHN0YXRlLndyYXAgJiAyKSAmJiBob2xkID09PSAweDhiMWYpIHsgIC8qIGd6aXAgaGVhZGVyICovXG4gICAgICAgIHN0YXRlLmNoZWNrID0gMC8qY3JjMzIoMEwsIFpfTlVMTCwgMCkqLztcbiAgICAgICAgLy89PT0gQ1JDMihzdGF0ZS5jaGVjaywgaG9sZCk7XG4gICAgICAgIGhidWZbMF0gPSBob2xkICYgMHhmZjtcbiAgICAgICAgaGJ1ZlsxXSA9IChob2xkID4+PiA4KSAmIDB4ZmY7XG4gICAgICAgIHN0YXRlLmNoZWNrID0gY3JjMzIoc3RhdGUuY2hlY2ssIGhidWYsIDIsIDApO1xuICAgICAgICAvLz09PS8vXG5cbiAgICAgICAgLy89PT0gSU5JVEJJVFMoKTtcbiAgICAgICAgaG9sZCA9IDA7XG4gICAgICAgIGJpdHMgPSAwO1xuICAgICAgICAvLz09PS8vXG4gICAgICAgIHN0YXRlLm1vZGUgPSBGTEFHUztcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBzdGF0ZS5mbGFncyA9IDA7ICAgICAgICAgICAvKiBleHBlY3QgemxpYiBoZWFkZXIgKi9cbiAgICAgIGlmIChzdGF0ZS5oZWFkKSB7XG4gICAgICAgIHN0YXRlLmhlYWQuZG9uZSA9IGZhbHNlO1xuICAgICAgfVxuICAgICAgaWYgKCEoc3RhdGUud3JhcCAmIDEpIHx8ICAgLyogY2hlY2sgaWYgemxpYiBoZWFkZXIgYWxsb3dlZCAqL1xuICAgICAgICAoKChob2xkICYgMHhmZikvKkJJVFMoOCkqLyA8PCA4KSArIChob2xkID4+IDgpKSAlIDMxKSB7XG4gICAgICAgIHN0cm0ubXNnID0gJ2luY29ycmVjdCBoZWFkZXIgY2hlY2snO1xuICAgICAgICBzdGF0ZS5tb2RlID0gQkFEO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGlmICgoaG9sZCAmIDB4MGYpLypCSVRTKDQpKi8gIT09IFpfREVGTEFURUQpIHtcbiAgICAgICAgc3RybS5tc2cgPSAndW5rbm93biBjb21wcmVzc2lvbiBtZXRob2QnO1xuICAgICAgICBzdGF0ZS5tb2RlID0gQkFEO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIC8vLS0tIERST1BCSVRTKDQpIC0tLS8vXG4gICAgICBob2xkID4+Pj0gNDtcbiAgICAgIGJpdHMgLT0gNDtcbiAgICAgIC8vLS0tLy9cbiAgICAgIGxlbiA9IChob2xkICYgMHgwZikvKkJJVFMoNCkqLyArIDg7XG4gICAgICBpZiAoc3RhdGUud2JpdHMgPT09IDApIHtcbiAgICAgICAgc3RhdGUud2JpdHMgPSBsZW47XG4gICAgICB9XG4gICAgICBlbHNlIGlmIChsZW4gPiBzdGF0ZS53Yml0cykge1xuICAgICAgICBzdHJtLm1zZyA9ICdpbnZhbGlkIHdpbmRvdyBzaXplJztcbiAgICAgICAgc3RhdGUubW9kZSA9IEJBRDtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBzdGF0ZS5kbWF4ID0gMSA8PCBsZW47XG4gICAgICAvL1RyYWNldigoc3RkZXJyLCBcImluZmxhdGU6ICAgemxpYiBoZWFkZXIgb2tcXG5cIikpO1xuICAgICAgc3RybS5hZGxlciA9IHN0YXRlLmNoZWNrID0gMS8qYWRsZXIzMigwTCwgWl9OVUxMLCAwKSovO1xuICAgICAgc3RhdGUubW9kZSA9IGhvbGQgJiAweDIwMCA/IERJQ1RJRCA6IFRZUEU7XG4gICAgICAvLz09PSBJTklUQklUUygpO1xuICAgICAgaG9sZCA9IDA7XG4gICAgICBiaXRzID0gMDtcbiAgICAgIC8vPT09Ly9cbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgRkxBR1M6XG4gICAgICAvLz09PSBORUVEQklUUygxNik7ICovXG4gICAgICB3aGlsZSAoYml0cyA8IDE2KSB7XG4gICAgICAgIGlmIChoYXZlID09PSAwKSB7IGJyZWFrIGluZl9sZWF2ZTsgfVxuICAgICAgICBoYXZlLS07XG4gICAgICAgIGhvbGQgKz0gaW5wdXRbbmV4dCsrXSA8PCBiaXRzO1xuICAgICAgICBiaXRzICs9IDg7XG4gICAgICB9XG4gICAgICAvLz09PS8vXG4gICAgICBzdGF0ZS5mbGFncyA9IGhvbGQ7XG4gICAgICBpZiAoKHN0YXRlLmZsYWdzICYgMHhmZikgIT09IFpfREVGTEFURUQpIHtcbiAgICAgICAgc3RybS5tc2cgPSAndW5rbm93biBjb21wcmVzc2lvbiBtZXRob2QnO1xuICAgICAgICBzdGF0ZS5tb2RlID0gQkFEO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGlmIChzdGF0ZS5mbGFncyAmIDB4ZTAwMCkge1xuICAgICAgICBzdHJtLm1zZyA9ICd1bmtub3duIGhlYWRlciBmbGFncyBzZXQnO1xuICAgICAgICBzdGF0ZS5tb2RlID0gQkFEO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIGlmIChzdGF0ZS5oZWFkKSB7XG4gICAgICAgIHN0YXRlLmhlYWQudGV4dCA9ICgoaG9sZCA+PiA4KSAmIDEpO1xuICAgICAgfVxuICAgICAgaWYgKHN0YXRlLmZsYWdzICYgMHgwMjAwKSB7XG4gICAgICAgIC8vPT09IENSQzIoc3RhdGUuY2hlY2ssIGhvbGQpO1xuICAgICAgICBoYnVmWzBdID0gaG9sZCAmIDB4ZmY7XG4gICAgICAgIGhidWZbMV0gPSAoaG9sZCA+Pj4gOCkgJiAweGZmO1xuICAgICAgICBzdGF0ZS5jaGVjayA9IGNyYzMyKHN0YXRlLmNoZWNrLCBoYnVmLCAyLCAwKTtcbiAgICAgICAgLy89PT0vL1xuICAgICAgfVxuICAgICAgLy89PT0gSU5JVEJJVFMoKTtcbiAgICAgIGhvbGQgPSAwO1xuICAgICAgYml0cyA9IDA7XG4gICAgICAvLz09PS8vXG4gICAgICBzdGF0ZS5tb2RlID0gVElNRTtcbiAgICAgIC8qIGZhbGxzIHRocm91Z2ggKi9cbiAgICBjYXNlIFRJTUU6XG4gICAgICAvLz09PSBORUVEQklUUygzMik7ICovXG4gICAgICB3aGlsZSAoYml0cyA8IDMyKSB7XG4gICAgICAgIGlmIChoYXZlID09PSAwKSB7IGJyZWFrIGluZl9sZWF2ZTsgfVxuICAgICAgICBoYXZlLS07XG4gICAgICAgIGhvbGQgKz0gaW5wdXRbbmV4dCsrXSA8PCBiaXRzO1xuICAgICAgICBiaXRzICs9IDg7XG4gICAgICB9XG4gICAgICAvLz09PS8vXG4gICAgICBpZiAoc3RhdGUuaGVhZCkge1xuICAgICAgICBzdGF0ZS5oZWFkLnRpbWUgPSBob2xkO1xuICAgICAgfVxuICAgICAgaWYgKHN0YXRlLmZsYWdzICYgMHgwMjAwKSB7XG4gICAgICAgIC8vPT09IENSQzQoc3RhdGUuY2hlY2ssIGhvbGQpXG4gICAgICAgIGhidWZbMF0gPSBob2xkICYgMHhmZjtcbiAgICAgICAgaGJ1ZlsxXSA9IChob2xkID4+PiA4KSAmIDB4ZmY7XG4gICAgICAgIGhidWZbMl0gPSAoaG9sZCA+Pj4gMTYpICYgMHhmZjtcbiAgICAgICAgaGJ1ZlszXSA9IChob2xkID4+PiAyNCkgJiAweGZmO1xuICAgICAgICBzdGF0ZS5jaGVjayA9IGNyYzMyKHN0YXRlLmNoZWNrLCBoYnVmLCA0LCAwKTtcbiAgICAgICAgLy89PT1cbiAgICAgIH1cbiAgICAgIC8vPT09IElOSVRCSVRTKCk7XG4gICAgICBob2xkID0gMDtcbiAgICAgIGJpdHMgPSAwO1xuICAgICAgLy89PT0vL1xuICAgICAgc3RhdGUubW9kZSA9IE9TO1xuICAgICAgLyogZmFsbHMgdGhyb3VnaCAqL1xuICAgIGNhc2UgT1M6XG4gICAgICAvLz09PSBORUVEQklUUygxNik7ICovXG4gICAgICB3aGlsZSAoYml0cyA8IDE2KSB7XG4gICAgICAgIGlmIChoYXZlID09PSAwKSB7IGJyZWFrIGluZl9sZWF2ZTsgfVxuICAgICAgICBoYXZlLS07XG4gICAgICAgIGhvbGQgKz0gaW5wdXRbbmV4dCsrXSA8PCBiaXRzO1xuICAgICAgICBiaXRzICs9IDg7XG4gICAgICB9XG4gICAgICAvLz09PS8vXG4gICAgICBpZiAoc3RhdGUuaGVhZCkge1xuICAgICAgICBzdGF0ZS5oZWFkLnhmbGFncyA9IChob2xkICYgMHhmZik7XG4gICAgICAgIHN0YXRlLmhlYWQub3MgPSAoaG9sZCA+PiA4KTtcbiAgICAgIH1cbiAgICAgIGlmIChzdGF0ZS5mbGFncyAmIDB4MDIwMCkge1xuICAgICAgICAvLz09PSBDUkMyKHN0YXRlLmNoZWNrLCBob2xkKTtcbiAgICAgICAgaGJ1ZlswXSA9IGhvbGQgJiAweGZmO1xuICAgICAgICBoYnVmWzFdID0gKGhvbGQgPj4+IDgpICYgMHhmZjtcbiAgICAgICAgc3RhdGUuY2hlY2sgPSBjcmMzMihzdGF0ZS5jaGVjaywgaGJ1ZiwgMiwgMCk7XG4gICAgICAgIC8vPT09Ly9cbiAgICAgIH1cbiAgICAgIC8vPT09IElOSVRCSVRTKCk7XG4gICAgICBob2xkID0gMDtcbiAgICAgIGJpdHMgPSAwO1xuICAgICAgLy89PT0vL1xuICAgICAgc3RhdGUubW9kZSA9IEVYTEVOO1xuICAgICAgLyogZmFsbHMgdGhyb3VnaCAqL1xuICAgIGNhc2UgRVhMRU46XG4gICAgICBpZiAoc3RhdGUuZmxhZ3MgJiAweDA0MDApIHtcbiAgICAgICAgLy89PT0gTkVFREJJVFMoMTYpOyAqL1xuICAgICAgICB3aGlsZSAoYml0cyA8IDE2KSB7XG4gICAgICAgICAgaWYgKGhhdmUgPT09IDApIHsgYnJlYWsgaW5mX2xlYXZlOyB9XG4gICAgICAgICAgaGF2ZS0tO1xuICAgICAgICAgIGhvbGQgKz0gaW5wdXRbbmV4dCsrXSA8PCBiaXRzO1xuICAgICAgICAgIGJpdHMgKz0gODtcbiAgICAgICAgfVxuICAgICAgICAvLz09PS8vXG4gICAgICAgIHN0YXRlLmxlbmd0aCA9IGhvbGQ7XG4gICAgICAgIGlmIChzdGF0ZS5oZWFkKSB7XG4gICAgICAgICAgc3RhdGUuaGVhZC5leHRyYV9sZW4gPSBob2xkO1xuICAgICAgICB9XG4gICAgICAgIGlmIChzdGF0ZS5mbGFncyAmIDB4MDIwMCkge1xuICAgICAgICAgIC8vPT09IENSQzIoc3RhdGUuY2hlY2ssIGhvbGQpO1xuICAgICAgICAgIGhidWZbMF0gPSBob2xkICYgMHhmZjtcbiAgICAgICAgICBoYnVmWzFdID0gKGhvbGQgPj4+IDgpICYgMHhmZjtcbiAgICAgICAgICBzdGF0ZS5jaGVjayA9IGNyYzMyKHN0YXRlLmNoZWNrLCBoYnVmLCAyLCAwKTtcbiAgICAgICAgICAvLz09PS8vXG4gICAgICAgIH1cbiAgICAgICAgLy89PT0gSU5JVEJJVFMoKTtcbiAgICAgICAgaG9sZCA9IDA7XG4gICAgICAgIGJpdHMgPSAwO1xuICAgICAgICAvLz09PS8vXG4gICAgICB9XG4gICAgICBlbHNlIGlmIChzdGF0ZS5oZWFkKSB7XG4gICAgICAgIHN0YXRlLmhlYWQuZXh0cmEgPSBudWxsLypaX05VTEwqLztcbiAgICAgIH1cbiAgICAgIHN0YXRlLm1vZGUgPSBFWFRSQTtcbiAgICAgIC8qIGZhbGxzIHRocm91Z2ggKi9cbiAgICBjYXNlIEVYVFJBOlxuICAgICAgaWYgKHN0YXRlLmZsYWdzICYgMHgwNDAwKSB7XG4gICAgICAgIGNvcHkgPSBzdGF0ZS5sZW5ndGg7XG4gICAgICAgIGlmIChjb3B5ID4gaGF2ZSkgeyBjb3B5ID0gaGF2ZTsgfVxuICAgICAgICBpZiAoY29weSkge1xuICAgICAgICAgIGlmIChzdGF0ZS5oZWFkKSB7XG4gICAgICAgICAgICBsZW4gPSBzdGF0ZS5oZWFkLmV4dHJhX2xlbiAtIHN0YXRlLmxlbmd0aDtcbiAgICAgICAgICAgIGlmICghc3RhdGUuaGVhZC5leHRyYSkge1xuICAgICAgICAgICAgICAvLyBVc2UgdW50eXBlZCBhcnJheSBmb3IgbW9yZSBjb252ZW5pZW5kIHByb2Nlc3NpbmcgbGF0ZXJcbiAgICAgICAgICAgICAgc3RhdGUuaGVhZC5leHRyYSA9IG5ldyBBcnJheShzdGF0ZS5oZWFkLmV4dHJhX2xlbik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB1dGlscy5hcnJheVNldChcbiAgICAgICAgICAgICAgc3RhdGUuaGVhZC5leHRyYSxcbiAgICAgICAgICAgICAgaW5wdXQsXG4gICAgICAgICAgICAgIG5leHQsXG4gICAgICAgICAgICAgIC8vIGV4dHJhIGZpZWxkIGlzIGxpbWl0ZWQgdG8gNjU1MzYgYnl0ZXNcbiAgICAgICAgICAgICAgLy8gLSBubyBuZWVkIGZvciBhZGRpdGlvbmFsIHNpemUgY2hlY2tcbiAgICAgICAgICAgICAgY29weSxcbiAgICAgICAgICAgICAgLypsZW4gKyBjb3B5ID4gc3RhdGUuaGVhZC5leHRyYV9tYXggLSBsZW4gPyBzdGF0ZS5oZWFkLmV4dHJhX21heCA6IGNvcHksKi9cbiAgICAgICAgICAgICAgbGVuXG4gICAgICAgICAgICApO1xuICAgICAgICAgICAgLy96bWVtY3B5KHN0YXRlLmhlYWQuZXh0cmEgKyBsZW4sIG5leHQsXG4gICAgICAgICAgICAvLyAgICAgICAgbGVuICsgY29weSA+IHN0YXRlLmhlYWQuZXh0cmFfbWF4ID9cbiAgICAgICAgICAgIC8vICAgICAgICBzdGF0ZS5oZWFkLmV4dHJhX21heCAtIGxlbiA6IGNvcHkpO1xuICAgICAgICAgIH1cbiAgICAgICAgICBpZiAoc3RhdGUuZmxhZ3MgJiAweDAyMDApIHtcbiAgICAgICAgICAgIHN0YXRlLmNoZWNrID0gY3JjMzIoc3RhdGUuY2hlY2ssIGlucHV0LCBjb3B5LCBuZXh0KTtcbiAgICAgICAgICB9XG4gICAgICAgICAgaGF2ZSAtPSBjb3B5O1xuICAgICAgICAgIG5leHQgKz0gY29weTtcbiAgICAgICAgICBzdGF0ZS5sZW5ndGggLT0gY29weTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoc3RhdGUubGVuZ3RoKSB7IGJyZWFrIGluZl9sZWF2ZTsgfVxuICAgICAgfVxuICAgICAgc3RhdGUubGVuZ3RoID0gMDtcbiAgICAgIHN0YXRlLm1vZGUgPSBOQU1FO1xuICAgICAgLyogZmFsbHMgdGhyb3VnaCAqL1xuICAgIGNhc2UgTkFNRTpcbiAgICAgIGlmIChzdGF0ZS5mbGFncyAmIDB4MDgwMCkge1xuICAgICAgICBpZiAoaGF2ZSA9PT0gMCkgeyBicmVhayBpbmZfbGVhdmU7IH1cbiAgICAgICAgY29weSA9IDA7XG4gICAgICAgIGRvIHtcbiAgICAgICAgICAvLyBUT0RPOiAyIG9yIDEgYnl0ZXM/XG4gICAgICAgICAgbGVuID0gaW5wdXRbbmV4dCArIGNvcHkrK107XG4gICAgICAgICAgLyogdXNlIGNvbnN0YW50IGxpbWl0IGJlY2F1c2UgaW4ganMgd2Ugc2hvdWxkIG5vdCBwcmVhbGxvY2F0ZSBtZW1vcnkgKi9cbiAgICAgICAgICBpZiAoc3RhdGUuaGVhZCAmJiBsZW4gJiZcbiAgICAgICAgICAgICAgKHN0YXRlLmxlbmd0aCA8IDY1NTM2IC8qc3RhdGUuaGVhZC5uYW1lX21heCovKSkge1xuICAgICAgICAgICAgc3RhdGUuaGVhZC5uYW1lICs9IFN0cmluZy5mcm9tQ2hhckNvZGUobGVuKTtcbiAgICAgICAgICB9XG4gICAgICAgIH0gd2hpbGUgKGxlbiAmJiBjb3B5IDwgaGF2ZSk7XG5cbiAgICAgICAgaWYgKHN0YXRlLmZsYWdzICYgMHgwMjAwKSB7XG4gICAgICAgICAgc3RhdGUuY2hlY2sgPSBjcmMzMihzdGF0ZS5jaGVjaywgaW5wdXQsIGNvcHksIG5leHQpO1xuICAgICAgICB9XG4gICAgICAgIGhhdmUgLT0gY29weTtcbiAgICAgICAgbmV4dCArPSBjb3B5O1xuICAgICAgICBpZiAobGVuKSB7IGJyZWFrIGluZl9sZWF2ZTsgfVxuICAgICAgfVxuICAgICAgZWxzZSBpZiAoc3RhdGUuaGVhZCkge1xuICAgICAgICBzdGF0ZS5oZWFkLm5hbWUgPSBudWxsO1xuICAgICAgfVxuICAgICAgc3RhdGUubGVuZ3RoID0gMDtcbiAgICAgIHN0YXRlLm1vZGUgPSBDT01NRU5UO1xuICAgICAgLyogZmFsbHMgdGhyb3VnaCAqL1xuICAgIGNhc2UgQ09NTUVOVDpcbiAgICAgIGlmIChzdGF0ZS5mbGFncyAmIDB4MTAwMCkge1xuICAgICAgICBpZiAoaGF2ZSA9PT0gMCkgeyBicmVhayBpbmZfbGVhdmU7IH1cbiAgICAgICAgY29weSA9IDA7XG4gICAgICAgIGRvIHtcbiAgICAgICAgICBsZW4gPSBpbnB1dFtuZXh0ICsgY29weSsrXTtcbiAgICAgICAgICAvKiB1c2UgY29uc3RhbnQgbGltaXQgYmVjYXVzZSBpbiBqcyB3ZSBzaG91bGQgbm90IHByZWFsbG9jYXRlIG1lbW9yeSAqL1xuICAgICAgICAgIGlmIChzdGF0ZS5oZWFkICYmIGxlbiAmJlxuICAgICAgICAgICAgICAoc3RhdGUubGVuZ3RoIDwgNjU1MzYgLypzdGF0ZS5oZWFkLmNvbW1fbWF4Ki8pKSB7XG4gICAgICAgICAgICBzdGF0ZS5oZWFkLmNvbW1lbnQgKz0gU3RyaW5nLmZyb21DaGFyQ29kZShsZW4pO1xuICAgICAgICAgIH1cbiAgICAgICAgfSB3aGlsZSAobGVuICYmIGNvcHkgPCBoYXZlKTtcbiAgICAgICAgaWYgKHN0YXRlLmZsYWdzICYgMHgwMjAwKSB7XG4gICAgICAgICAgc3RhdGUuY2hlY2sgPSBjcmMzMihzdGF0ZS5jaGVjaywgaW5wdXQsIGNvcHksIG5leHQpO1xuICAgICAgICB9XG4gICAgICAgIGhhdmUgLT0gY29weTtcbiAgICAgICAgbmV4dCArPSBjb3B5O1xuICAgICAgICBpZiAobGVuKSB7IGJyZWFrIGluZl9sZWF2ZTsgfVxuICAgICAgfVxuICAgICAgZWxzZSBpZiAoc3RhdGUuaGVhZCkge1xuICAgICAgICBzdGF0ZS5oZWFkLmNvbW1lbnQgPSBudWxsO1xuICAgICAgfVxuICAgICAgc3RhdGUubW9kZSA9IEhDUkM7XG4gICAgICAvKiBmYWxscyB0aHJvdWdoICovXG4gICAgY2FzZSBIQ1JDOlxuICAgICAgaWYgKHN0YXRlLmZsYWdzICYgMHgwMjAwKSB7XG4gICAgICAgIC8vPT09IE5FRURCSVRTKDE2KTsgKi9cbiAgICAgICAgd2hpbGUgKGJpdHMgPCAxNikge1xuICAgICAgICAgIGlmIChoYXZlID09PSAwKSB7IGJyZWFrIGluZl9sZWF2ZTsgfVxuICAgICAgICAgIGhhdmUtLTtcbiAgICAgICAgICBob2xkICs9IGlucHV0W25leHQrK10gPDwgYml0cztcbiAgICAgICAgICBiaXRzICs9IDg7XG4gICAgICAgIH1cbiAgICAgICAgLy89PT0vL1xuICAgICAgICBpZiAoaG9sZCAhPT0gKHN0YXRlLmNoZWNrICYgMHhmZmZmKSkge1xuICAgICAgICAgIHN0cm0ubXNnID0gJ2hlYWRlciBjcmMgbWlzbWF0Y2gnO1xuICAgICAgICAgIHN0YXRlLm1vZGUgPSBCQUQ7XG4gICAgICAgICAgYnJlYWs7XG4gICAgICAgIH1cbiAgICAgICAgLy89PT0gSU5JVEJJVFMoKTtcbiAgICAgICAgaG9sZCA9IDA7XG4gICAgICAgIGJpdHMgPSAwO1xuICAgICAgICAvLz09PS8vXG4gICAgICB9XG4gICAgICBpZiAoc3RhdGUuaGVhZCkge1xuICAgICAgICBzdGF0ZS5oZWFkLmhjcmMgPSAoKHN0YXRlLmZsYWdzID4+IDkpICYgMSk7XG4gICAgICAgIHN0YXRlLmhlYWQuZG9uZSA9IHRydWU7XG4gICAgICB9XG4gICAgICBzdHJtLmFkbGVyID0gc3RhdGUuY2hlY2sgPSAwO1xuICAgICAgc3RhdGUubW9kZSA9IFRZUEU7XG4gICAgICBicmVhaztcbiAgICBjYXNlIERJQ1RJRDpcbiAgICAgIC8vPT09IE5FRURCSVRTKDMyKTsgKi9cbiAgICAgIHdoaWxlIChiaXRzIDwgMzIpIHtcbiAgICAgICAgaWYgKGhhdmUgPT09IDApIHsgYnJlYWsgaW5mX2xlYXZlOyB9XG4gICAgICAgIGhhdmUtLTtcbiAgICAgICAgaG9sZCArPSBpbnB1dFtuZXh0KytdIDw8IGJpdHM7XG4gICAgICAgIGJpdHMgKz0gODtcbiAgICAgIH1cbiAgICAgIC8vPT09Ly9cbiAgICAgIHN0cm0uYWRsZXIgPSBzdGF0ZS5jaGVjayA9IHpzd2FwMzIoaG9sZCk7XG4gICAgICAvLz09PSBJTklUQklUUygpO1xuICAgICAgaG9sZCA9IDA7XG4gICAgICBiaXRzID0gMDtcbiAgICAgIC8vPT09Ly9cbiAgICAgIHN0YXRlLm1vZGUgPSBESUNUO1xuICAgICAgLyogZmFsbHMgdGhyb3VnaCAqL1xuICAgIGNhc2UgRElDVDpcbiAgICAgIGlmIChzdGF0ZS5oYXZlZGljdCA9PT0gMCkge1xuICAgICAgICAvLy0tLSBSRVNUT1JFKCkgLS0tXG4gICAgICAgIHN0cm0ubmV4dF9vdXQgPSBwdXQ7XG4gICAgICAgIHN0cm0uYXZhaWxfb3V0ID0gbGVmdDtcbiAgICAgICAgc3RybS5uZXh0X2luID0gbmV4dDtcbiAgICAgICAgc3RybS5hdmFpbF9pbiA9IGhhdmU7XG4gICAgICAgIHN0YXRlLmhvbGQgPSBob2xkO1xuICAgICAgICBzdGF0ZS5iaXRzID0gYml0cztcbiAgICAgICAgLy8tLS1cbiAgICAgICAgcmV0dXJuIFpfTkVFRF9ESUNUO1xuICAgICAgfVxuICAgICAgc3RybS5hZGxlciA9IHN0YXRlLmNoZWNrID0gMS8qYWRsZXIzMigwTCwgWl9OVUxMLCAwKSovO1xuICAgICAgc3RhdGUubW9kZSA9IFRZUEU7XG4gICAgICAvKiBmYWxscyB0aHJvdWdoICovXG4gICAgY2FzZSBUWVBFOlxuICAgICAgaWYgKGZsdXNoID09PSBaX0JMT0NLIHx8IGZsdXNoID09PSBaX1RSRUVTKSB7IGJyZWFrIGluZl9sZWF2ZTsgfVxuICAgICAgLyogZmFsbHMgdGhyb3VnaCAqL1xuICAgIGNhc2UgVFlQRURPOlxuICAgICAgaWYgKHN0YXRlLmxhc3QpIHtcbiAgICAgICAgLy8tLS0gQllURUJJVFMoKSAtLS0vL1xuICAgICAgICBob2xkID4+Pj0gYml0cyAmIDc7XG4gICAgICAgIGJpdHMgLT0gYml0cyAmIDc7XG4gICAgICAgIC8vLS0tLy9cbiAgICAgICAgc3RhdGUubW9kZSA9IENIRUNLO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIC8vPT09IE5FRURCSVRTKDMpOyAqL1xuICAgICAgd2hpbGUgKGJpdHMgPCAzKSB7XG4gICAgICAgIGlmIChoYXZlID09PSAwKSB7IGJyZWFrIGluZl9sZWF2ZTsgfVxuICAgICAgICBoYXZlLS07XG4gICAgICAgIGhvbGQgKz0gaW5wdXRbbmV4dCsrXSA8PCBiaXRzO1xuICAgICAgICBiaXRzICs9IDg7XG4gICAgICB9XG4gICAgICAvLz09PS8vXG4gICAgICBzdGF0ZS5sYXN0ID0gKGhvbGQgJiAweDAxKS8qQklUUygxKSovO1xuICAgICAgLy8tLS0gRFJPUEJJVFMoMSkgLS0tLy9cbiAgICAgIGhvbGQgPj4+PSAxO1xuICAgICAgYml0cyAtPSAxO1xuICAgICAgLy8tLS0vL1xuXG4gICAgICBzd2l0Y2ggKChob2xkICYgMHgwMykvKkJJVFMoMikqLykge1xuICAgICAgY2FzZSAwOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogc3RvcmVkIGJsb2NrICovXG4gICAgICAgIC8vVHJhY2V2KChzdGRlcnIsIFwiaW5mbGF0ZTogICAgIHN0b3JlZCBibG9jayVzXFxuXCIsXG4gICAgICAgIC8vICAgICAgICBzdGF0ZS5sYXN0ID8gXCIgKGxhc3QpXCIgOiBcIlwiKSk7XG4gICAgICAgIHN0YXRlLm1vZGUgPSBTVE9SRUQ7XG4gICAgICAgIGJyZWFrO1xuICAgICAgY2FzZSAxOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZml4ZWQgYmxvY2sgKi9cbiAgICAgICAgZml4ZWR0YWJsZXMoc3RhdGUpO1xuICAgICAgICAvL1RyYWNldigoc3RkZXJyLCBcImluZmxhdGU6ICAgICBmaXhlZCBjb2RlcyBibG9jayVzXFxuXCIsXG4gICAgICAgIC8vICAgICAgICBzdGF0ZS5sYXN0ID8gXCIgKGxhc3QpXCIgOiBcIlwiKSk7XG4gICAgICAgIHN0YXRlLm1vZGUgPSBMRU5fOyAgICAgICAgICAgICAvKiBkZWNvZGUgY29kZXMgKi9cbiAgICAgICAgaWYgKGZsdXNoID09PSBaX1RSRUVTKSB7XG4gICAgICAgICAgLy8tLS0gRFJPUEJJVFMoMikgLS0tLy9cbiAgICAgICAgICBob2xkID4+Pj0gMjtcbiAgICAgICAgICBiaXRzIC09IDI7XG4gICAgICAgICAgLy8tLS0vL1xuICAgICAgICAgIGJyZWFrIGluZl9sZWF2ZTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIGNhc2UgMjogICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGR5bmFtaWMgYmxvY2sgKi9cbiAgICAgICAgLy9UcmFjZXYoKHN0ZGVyciwgXCJpbmZsYXRlOiAgICAgZHluYW1pYyBjb2RlcyBibG9jayVzXFxuXCIsXG4gICAgICAgIC8vICAgICAgICBzdGF0ZS5sYXN0ID8gXCIgKGxhc3QpXCIgOiBcIlwiKSk7XG4gICAgICAgIHN0YXRlLm1vZGUgPSBUQUJMRTtcbiAgICAgICAgYnJlYWs7XG4gICAgICBjYXNlIDM6XG4gICAgICAgIHN0cm0ubXNnID0gJ2ludmFsaWQgYmxvY2sgdHlwZSc7XG4gICAgICAgIHN0YXRlLm1vZGUgPSBCQUQ7XG4gICAgICB9XG4gICAgICAvLy0tLSBEUk9QQklUUygyKSAtLS0vL1xuICAgICAgaG9sZCA+Pj49IDI7XG4gICAgICBiaXRzIC09IDI7XG4gICAgICAvLy0tLS8vXG4gICAgICBicmVhaztcbiAgICBjYXNlIFNUT1JFRDpcbiAgICAgIC8vLS0tIEJZVEVCSVRTKCkgLS0tLy8gLyogZ28gdG8gYnl0ZSBib3VuZGFyeSAqL1xuICAgICAgaG9sZCA+Pj49IGJpdHMgJiA3O1xuICAgICAgYml0cyAtPSBiaXRzICYgNztcbiAgICAgIC8vLS0tLy9cbiAgICAgIC8vPT09IE5FRURCSVRTKDMyKTsgKi9cbiAgICAgIHdoaWxlIChiaXRzIDwgMzIpIHtcbiAgICAgICAgaWYgKGhhdmUgPT09IDApIHsgYnJlYWsgaW5mX2xlYXZlOyB9XG4gICAgICAgIGhhdmUtLTtcbiAgICAgICAgaG9sZCArPSBpbnB1dFtuZXh0KytdIDw8IGJpdHM7XG4gICAgICAgIGJpdHMgKz0gODtcbiAgICAgIH1cbiAgICAgIC8vPT09Ly9cbiAgICAgIGlmICgoaG9sZCAmIDB4ZmZmZikgIT09ICgoaG9sZCA+Pj4gMTYpIF4gMHhmZmZmKSkge1xuICAgICAgICBzdHJtLm1zZyA9ICdpbnZhbGlkIHN0b3JlZCBibG9jayBsZW5ndGhzJztcbiAgICAgICAgc3RhdGUubW9kZSA9IEJBRDtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBzdGF0ZS5sZW5ndGggPSBob2xkICYgMHhmZmZmO1xuICAgICAgLy9UcmFjZXYoKHN0ZGVyciwgXCJpbmZsYXRlOiAgICAgICBzdG9yZWQgbGVuZ3RoICV1XFxuXCIsXG4gICAgICAvLyAgICAgICAgc3RhdGUubGVuZ3RoKSk7XG4gICAgICAvLz09PSBJTklUQklUUygpO1xuICAgICAgaG9sZCA9IDA7XG4gICAgICBiaXRzID0gMDtcbiAgICAgIC8vPT09Ly9cbiAgICAgIHN0YXRlLm1vZGUgPSBDT1BZXztcbiAgICAgIGlmIChmbHVzaCA9PT0gWl9UUkVFUykgeyBicmVhayBpbmZfbGVhdmU7IH1cbiAgICAgIC8qIGZhbGxzIHRocm91Z2ggKi9cbiAgICBjYXNlIENPUFlfOlxuICAgICAgc3RhdGUubW9kZSA9IENPUFk7XG4gICAgICAvKiBmYWxscyB0aHJvdWdoICovXG4gICAgY2FzZSBDT1BZOlxuICAgICAgY29weSA9IHN0YXRlLmxlbmd0aDtcbiAgICAgIGlmIChjb3B5KSB7XG4gICAgICAgIGlmIChjb3B5ID4gaGF2ZSkgeyBjb3B5ID0gaGF2ZTsgfVxuICAgICAgICBpZiAoY29weSA+IGxlZnQpIHsgY29weSA9IGxlZnQ7IH1cbiAgICAgICAgaWYgKGNvcHkgPT09IDApIHsgYnJlYWsgaW5mX2xlYXZlOyB9XG4gICAgICAgIC8vLS0tIHptZW1jcHkocHV0LCBuZXh0LCBjb3B5KTsgLS0tXG4gICAgICAgIHV0aWxzLmFycmF5U2V0KG91dHB1dCwgaW5wdXQsIG5leHQsIGNvcHksIHB1dCk7XG4gICAgICAgIC8vLS0tLy9cbiAgICAgICAgaGF2ZSAtPSBjb3B5O1xuICAgICAgICBuZXh0ICs9IGNvcHk7XG4gICAgICAgIGxlZnQgLT0gY29weTtcbiAgICAgICAgcHV0ICs9IGNvcHk7XG4gICAgICAgIHN0YXRlLmxlbmd0aCAtPSBjb3B5O1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIC8vVHJhY2V2KChzdGRlcnIsIFwiaW5mbGF0ZTogICAgICAgc3RvcmVkIGVuZFxcblwiKSk7XG4gICAgICBzdGF0ZS5tb2RlID0gVFlQRTtcbiAgICAgIGJyZWFrO1xuICAgIGNhc2UgVEFCTEU6XG4gICAgICAvLz09PSBORUVEQklUUygxNCk7ICovXG4gICAgICB3aGlsZSAoYml0cyA8IDE0KSB7XG4gICAgICAgIGlmIChoYXZlID09PSAwKSB7IGJyZWFrIGluZl9sZWF2ZTsgfVxuICAgICAgICBoYXZlLS07XG4gICAgICAgIGhvbGQgKz0gaW5wdXRbbmV4dCsrXSA8PCBiaXRzO1xuICAgICAgICBiaXRzICs9IDg7XG4gICAgICB9XG4gICAgICAvLz09PS8vXG4gICAgICBzdGF0ZS5ubGVuID0gKGhvbGQgJiAweDFmKS8qQklUUyg1KSovICsgMjU3O1xuICAgICAgLy8tLS0gRFJPUEJJVFMoNSkgLS0tLy9cbiAgICAgIGhvbGQgPj4+PSA1O1xuICAgICAgYml0cyAtPSA1O1xuICAgICAgLy8tLS0vL1xuICAgICAgc3RhdGUubmRpc3QgPSAoaG9sZCAmIDB4MWYpLypCSVRTKDUpKi8gKyAxO1xuICAgICAgLy8tLS0gRFJPUEJJVFMoNSkgLS0tLy9cbiAgICAgIGhvbGQgPj4+PSA1O1xuICAgICAgYml0cyAtPSA1O1xuICAgICAgLy8tLS0vL1xuICAgICAgc3RhdGUubmNvZGUgPSAoaG9sZCAmIDB4MGYpLypCSVRTKDQpKi8gKyA0O1xuICAgICAgLy8tLS0gRFJPUEJJVFMoNCkgLS0tLy9cbiAgICAgIGhvbGQgPj4+PSA0O1xuICAgICAgYml0cyAtPSA0O1xuICAgICAgLy8tLS0vL1xuLy8jaWZuZGVmIFBLWklQX0JVR19XT1JLQVJPVU5EXG4gICAgICBpZiAoc3RhdGUubmxlbiA+IDI4NiB8fCBzdGF0ZS5uZGlzdCA+IDMwKSB7XG4gICAgICAgIHN0cm0ubXNnID0gJ3RvbyBtYW55IGxlbmd0aCBvciBkaXN0YW5jZSBzeW1ib2xzJztcbiAgICAgICAgc3RhdGUubW9kZSA9IEJBRDtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4vLyNlbmRpZlxuICAgICAgLy9UcmFjZXYoKHN0ZGVyciwgXCJpbmZsYXRlOiAgICAgICB0YWJsZSBzaXplcyBva1xcblwiKSk7XG4gICAgICBzdGF0ZS5oYXZlID0gMDtcbiAgICAgIHN0YXRlLm1vZGUgPSBMRU5MRU5TO1xuICAgICAgLyogZmFsbHMgdGhyb3VnaCAqL1xuICAgIGNhc2UgTEVOTEVOUzpcbiAgICAgIHdoaWxlIChzdGF0ZS5oYXZlIDwgc3RhdGUubmNvZGUpIHtcbiAgICAgICAgLy89PT0gTkVFREJJVFMoMyk7XG4gICAgICAgIHdoaWxlIChiaXRzIDwgMykge1xuICAgICAgICAgIGlmIChoYXZlID09PSAwKSB7IGJyZWFrIGluZl9sZWF2ZTsgfVxuICAgICAgICAgIGhhdmUtLTtcbiAgICAgICAgICBob2xkICs9IGlucHV0W25leHQrK10gPDwgYml0cztcbiAgICAgICAgICBiaXRzICs9IDg7XG4gICAgICAgIH1cbiAgICAgICAgLy89PT0vL1xuICAgICAgICBzdGF0ZS5sZW5zW29yZGVyW3N0YXRlLmhhdmUrK11dID0gKGhvbGQgJiAweDA3KTsvL0JJVFMoMyk7XG4gICAgICAgIC8vLS0tIERST1BCSVRTKDMpIC0tLS8vXG4gICAgICAgIGhvbGQgPj4+PSAzO1xuICAgICAgICBiaXRzIC09IDM7XG4gICAgICAgIC8vLS0tLy9cbiAgICAgIH1cbiAgICAgIHdoaWxlIChzdGF0ZS5oYXZlIDwgMTkpIHtcbiAgICAgICAgc3RhdGUubGVuc1tvcmRlcltzdGF0ZS5oYXZlKytdXSA9IDA7XG4gICAgICB9XG4gICAgICAvLyBXZSBoYXZlIHNlcGFyYXRlIHRhYmxlcyAmIG5vIHBvaW50ZXJzLiAyIGNvbW1lbnRlZCBsaW5lcyBiZWxvdyBub3QgbmVlZGVkLlxuICAgICAgLy9zdGF0ZS5uZXh0ID0gc3RhdGUuY29kZXM7XG4gICAgICAvL3N0YXRlLmxlbmNvZGUgPSBzdGF0ZS5uZXh0O1xuICAgICAgLy8gU3dpdGNoIHRvIHVzZSBkeW5hbWljIHRhYmxlXG4gICAgICBzdGF0ZS5sZW5jb2RlID0gc3RhdGUubGVuZHluO1xuICAgICAgc3RhdGUubGVuYml0cyA9IDc7XG5cbiAgICAgIG9wdHMgPSB7IGJpdHM6IHN0YXRlLmxlbmJpdHMgfTtcbiAgICAgIHJldCA9IGluZmxhdGVfdGFibGUoQ09ERVMsIHN0YXRlLmxlbnMsIDAsIDE5LCBzdGF0ZS5sZW5jb2RlLCAwLCBzdGF0ZS53b3JrLCBvcHRzKTtcbiAgICAgIHN0YXRlLmxlbmJpdHMgPSBvcHRzLmJpdHM7XG5cbiAgICAgIGlmIChyZXQpIHtcbiAgICAgICAgc3RybS5tc2cgPSAnaW52YWxpZCBjb2RlIGxlbmd0aHMgc2V0JztcbiAgICAgICAgc3RhdGUubW9kZSA9IEJBRDtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICAvL1RyYWNldigoc3RkZXJyLCBcImluZmxhdGU6ICAgICAgIGNvZGUgbGVuZ3RocyBva1xcblwiKSk7XG4gICAgICBzdGF0ZS5oYXZlID0gMDtcbiAgICAgIHN0YXRlLm1vZGUgPSBDT0RFTEVOUztcbiAgICAgIC8qIGZhbGxzIHRocm91Z2ggKi9cbiAgICBjYXNlIENPREVMRU5TOlxuICAgICAgd2hpbGUgKHN0YXRlLmhhdmUgPCBzdGF0ZS5ubGVuICsgc3RhdGUubmRpc3QpIHtcbiAgICAgICAgZm9yICg7Oykge1xuICAgICAgICAgIGhlcmUgPSBzdGF0ZS5sZW5jb2RlW2hvbGQgJiAoKDEgPDwgc3RhdGUubGVuYml0cykgLSAxKV07LypCSVRTKHN0YXRlLmxlbmJpdHMpKi9cbiAgICAgICAgICBoZXJlX2JpdHMgPSBoZXJlID4+PiAyNDtcbiAgICAgICAgICBoZXJlX29wID0gKGhlcmUgPj4+IDE2KSAmIDB4ZmY7XG4gICAgICAgICAgaGVyZV92YWwgPSBoZXJlICYgMHhmZmZmO1xuXG4gICAgICAgICAgaWYgKChoZXJlX2JpdHMpIDw9IGJpdHMpIHsgYnJlYWs7IH1cbiAgICAgICAgICAvLy0tLSBQVUxMQllURSgpIC0tLS8vXG4gICAgICAgICAgaWYgKGhhdmUgPT09IDApIHsgYnJlYWsgaW5mX2xlYXZlOyB9XG4gICAgICAgICAgaGF2ZS0tO1xuICAgICAgICAgIGhvbGQgKz0gaW5wdXRbbmV4dCsrXSA8PCBiaXRzO1xuICAgICAgICAgIGJpdHMgKz0gODtcbiAgICAgICAgICAvLy0tLS8vXG4gICAgICAgIH1cbiAgICAgICAgaWYgKGhlcmVfdmFsIDwgMTYpIHtcbiAgICAgICAgICAvLy0tLSBEUk9QQklUUyhoZXJlLmJpdHMpIC0tLS8vXG4gICAgICAgICAgaG9sZCA+Pj49IGhlcmVfYml0cztcbiAgICAgICAgICBiaXRzIC09IGhlcmVfYml0cztcbiAgICAgICAgICAvLy0tLS8vXG4gICAgICAgICAgc3RhdGUubGVuc1tzdGF0ZS5oYXZlKytdID0gaGVyZV92YWw7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgaWYgKGhlcmVfdmFsID09PSAxNikge1xuICAgICAgICAgICAgLy89PT0gTkVFREJJVFMoaGVyZS5iaXRzICsgMik7XG4gICAgICAgICAgICBuID0gaGVyZV9iaXRzICsgMjtcbiAgICAgICAgICAgIHdoaWxlIChiaXRzIDwgbikge1xuICAgICAgICAgICAgICBpZiAoaGF2ZSA9PT0gMCkgeyBicmVhayBpbmZfbGVhdmU7IH1cbiAgICAgICAgICAgICAgaGF2ZS0tO1xuICAgICAgICAgICAgICBob2xkICs9IGlucHV0W25leHQrK10gPDwgYml0cztcbiAgICAgICAgICAgICAgYml0cyArPSA4O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy89PT0vL1xuICAgICAgICAgICAgLy8tLS0gRFJPUEJJVFMoaGVyZS5iaXRzKSAtLS0vL1xuICAgICAgICAgICAgaG9sZCA+Pj49IGhlcmVfYml0cztcbiAgICAgICAgICAgIGJpdHMgLT0gaGVyZV9iaXRzO1xuICAgICAgICAgICAgLy8tLS0vL1xuICAgICAgICAgICAgaWYgKHN0YXRlLmhhdmUgPT09IDApIHtcbiAgICAgICAgICAgICAgc3RybS5tc2cgPSAnaW52YWxpZCBiaXQgbGVuZ3RoIHJlcGVhdCc7XG4gICAgICAgICAgICAgIHN0YXRlLm1vZGUgPSBCQUQ7XG4gICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgbGVuID0gc3RhdGUubGVuc1tzdGF0ZS5oYXZlIC0gMV07XG4gICAgICAgICAgICBjb3B5ID0gMyArIChob2xkICYgMHgwMyk7Ly9CSVRTKDIpO1xuICAgICAgICAgICAgLy8tLS0gRFJPUEJJVFMoMikgLS0tLy9cbiAgICAgICAgICAgIGhvbGQgPj4+PSAyO1xuICAgICAgICAgICAgYml0cyAtPSAyO1xuICAgICAgICAgICAgLy8tLS0vL1xuICAgICAgICAgIH1cbiAgICAgICAgICBlbHNlIGlmIChoZXJlX3ZhbCA9PT0gMTcpIHtcbiAgICAgICAgICAgIC8vPT09IE5FRURCSVRTKGhlcmUuYml0cyArIDMpO1xuICAgICAgICAgICAgbiA9IGhlcmVfYml0cyArIDM7XG4gICAgICAgICAgICB3aGlsZSAoYml0cyA8IG4pIHtcbiAgICAgICAgICAgICAgaWYgKGhhdmUgPT09IDApIHsgYnJlYWsgaW5mX2xlYXZlOyB9XG4gICAgICAgICAgICAgIGhhdmUtLTtcbiAgICAgICAgICAgICAgaG9sZCArPSBpbnB1dFtuZXh0KytdIDw8IGJpdHM7XG4gICAgICAgICAgICAgIGJpdHMgKz0gODtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vPT09Ly9cbiAgICAgICAgICAgIC8vLS0tIERST1BCSVRTKGhlcmUuYml0cykgLS0tLy9cbiAgICAgICAgICAgIGhvbGQgPj4+PSBoZXJlX2JpdHM7XG4gICAgICAgICAgICBiaXRzIC09IGhlcmVfYml0cztcbiAgICAgICAgICAgIC8vLS0tLy9cbiAgICAgICAgICAgIGxlbiA9IDA7XG4gICAgICAgICAgICBjb3B5ID0gMyArIChob2xkICYgMHgwNyk7Ly9CSVRTKDMpO1xuICAgICAgICAgICAgLy8tLS0gRFJPUEJJVFMoMykgLS0tLy9cbiAgICAgICAgICAgIGhvbGQgPj4+PSAzO1xuICAgICAgICAgICAgYml0cyAtPSAzO1xuICAgICAgICAgICAgLy8tLS0vL1xuICAgICAgICAgIH1cbiAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIC8vPT09IE5FRURCSVRTKGhlcmUuYml0cyArIDcpO1xuICAgICAgICAgICAgbiA9IGhlcmVfYml0cyArIDc7XG4gICAgICAgICAgICB3aGlsZSAoYml0cyA8IG4pIHtcbiAgICAgICAgICAgICAgaWYgKGhhdmUgPT09IDApIHsgYnJlYWsgaW5mX2xlYXZlOyB9XG4gICAgICAgICAgICAgIGhhdmUtLTtcbiAgICAgICAgICAgICAgaG9sZCArPSBpbnB1dFtuZXh0KytdIDw8IGJpdHM7XG4gICAgICAgICAgICAgIGJpdHMgKz0gODtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vPT09Ly9cbiAgICAgICAgICAgIC8vLS0tIERST1BCSVRTKGhlcmUuYml0cykgLS0tLy9cbiAgICAgICAgICAgIGhvbGQgPj4+PSBoZXJlX2JpdHM7XG4gICAgICAgICAgICBiaXRzIC09IGhlcmVfYml0cztcbiAgICAgICAgICAgIC8vLS0tLy9cbiAgICAgICAgICAgIGxlbiA9IDA7XG4gICAgICAgICAgICBjb3B5ID0gMTEgKyAoaG9sZCAmIDB4N2YpOy8vQklUUyg3KTtcbiAgICAgICAgICAgIC8vLS0tIERST1BCSVRTKDcpIC0tLS8vXG4gICAgICAgICAgICBob2xkID4+Pj0gNztcbiAgICAgICAgICAgIGJpdHMgLT0gNztcbiAgICAgICAgICAgIC8vLS0tLy9cbiAgICAgICAgICB9XG4gICAgICAgICAgaWYgKHN0YXRlLmhhdmUgKyBjb3B5ID4gc3RhdGUubmxlbiArIHN0YXRlLm5kaXN0KSB7XG4gICAgICAgICAgICBzdHJtLm1zZyA9ICdpbnZhbGlkIGJpdCBsZW5ndGggcmVwZWF0JztcbiAgICAgICAgICAgIHN0YXRlLm1vZGUgPSBCQUQ7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgICB9XG4gICAgICAgICAgd2hpbGUgKGNvcHktLSkge1xuICAgICAgICAgICAgc3RhdGUubGVuc1tzdGF0ZS5oYXZlKytdID0gbGVuO1xuICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgfVxuXG4gICAgICAvKiBoYW5kbGUgZXJyb3IgYnJlYWtzIGluIHdoaWxlICovXG4gICAgICBpZiAoc3RhdGUubW9kZSA9PT0gQkFEKSB7IGJyZWFrOyB9XG5cbiAgICAgIC8qIGNoZWNrIGZvciBlbmQtb2YtYmxvY2sgY29kZSAoYmV0dGVyIGhhdmUgb25lKSAqL1xuICAgICAgaWYgKHN0YXRlLmxlbnNbMjU2XSA9PT0gMCkge1xuICAgICAgICBzdHJtLm1zZyA9ICdpbnZhbGlkIGNvZGUgLS0gbWlzc2luZyBlbmQtb2YtYmxvY2snO1xuICAgICAgICBzdGF0ZS5tb2RlID0gQkFEO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cblxuICAgICAgLyogYnVpbGQgY29kZSB0YWJsZXMgLS0gbm90ZTogZG8gbm90IGNoYW5nZSB0aGUgbGVuYml0cyBvciBkaXN0Yml0c1xuICAgICAgICAgdmFsdWVzIGhlcmUgKDkgYW5kIDYpIHdpdGhvdXQgcmVhZGluZyB0aGUgY29tbWVudHMgaW4gaW5mdHJlZXMuaFxuICAgICAgICAgY29uY2VybmluZyB0aGUgRU5PVUdIIGNvbnN0YW50cywgd2hpY2ggZGVwZW5kIG9uIHRob3NlIHZhbHVlcyAqL1xuICAgICAgc3RhdGUubGVuYml0cyA9IDk7XG5cbiAgICAgIG9wdHMgPSB7IGJpdHM6IHN0YXRlLmxlbmJpdHMgfTtcbiAgICAgIHJldCA9IGluZmxhdGVfdGFibGUoTEVOUywgc3RhdGUubGVucywgMCwgc3RhdGUubmxlbiwgc3RhdGUubGVuY29kZSwgMCwgc3RhdGUud29yaywgb3B0cyk7XG4gICAgICAvLyBXZSBoYXZlIHNlcGFyYXRlIHRhYmxlcyAmIG5vIHBvaW50ZXJzLiAyIGNvbW1lbnRlZCBsaW5lcyBiZWxvdyBub3QgbmVlZGVkLlxuICAgICAgLy8gc3RhdGUubmV4dF9pbmRleCA9IG9wdHMudGFibGVfaW5kZXg7XG4gICAgICBzdGF0ZS5sZW5iaXRzID0gb3B0cy5iaXRzO1xuICAgICAgLy8gc3RhdGUubGVuY29kZSA9IHN0YXRlLm5leHQ7XG5cbiAgICAgIGlmIChyZXQpIHtcbiAgICAgICAgc3RybS5tc2cgPSAnaW52YWxpZCBsaXRlcmFsL2xlbmd0aHMgc2V0JztcbiAgICAgICAgc3RhdGUubW9kZSA9IEJBRDtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG5cbiAgICAgIHN0YXRlLmRpc3RiaXRzID0gNjtcbiAgICAgIC8vc3RhdGUuZGlzdGNvZGUuY29weShzdGF0ZS5jb2Rlcyk7XG4gICAgICAvLyBTd2l0Y2ggdG8gdXNlIGR5bmFtaWMgdGFibGVcbiAgICAgIHN0YXRlLmRpc3Rjb2RlID0gc3RhdGUuZGlzdGR5bjtcbiAgICAgIG9wdHMgPSB7IGJpdHM6IHN0YXRlLmRpc3RiaXRzIH07XG4gICAgICByZXQgPSBpbmZsYXRlX3RhYmxlKERJU1RTLCBzdGF0ZS5sZW5zLCBzdGF0ZS5ubGVuLCBzdGF0ZS5uZGlzdCwgc3RhdGUuZGlzdGNvZGUsIDAsIHN0YXRlLndvcmssIG9wdHMpO1xuICAgICAgLy8gV2UgaGF2ZSBzZXBhcmF0ZSB0YWJsZXMgJiBubyBwb2ludGVycy4gMiBjb21tZW50ZWQgbGluZXMgYmVsb3cgbm90IG5lZWRlZC5cbiAgICAgIC8vIHN0YXRlLm5leHRfaW5kZXggPSBvcHRzLnRhYmxlX2luZGV4O1xuICAgICAgc3RhdGUuZGlzdGJpdHMgPSBvcHRzLmJpdHM7XG4gICAgICAvLyBzdGF0ZS5kaXN0Y29kZSA9IHN0YXRlLm5leHQ7XG5cbiAgICAgIGlmIChyZXQpIHtcbiAgICAgICAgc3RybS5tc2cgPSAnaW52YWxpZCBkaXN0YW5jZXMgc2V0JztcbiAgICAgICAgc3RhdGUubW9kZSA9IEJBRDtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICAvL1RyYWNldigoc3RkZXJyLCAnaW5mbGF0ZTogICAgICAgY29kZXMgb2tcXG4nKSk7XG4gICAgICBzdGF0ZS5tb2RlID0gTEVOXztcbiAgICAgIGlmIChmbHVzaCA9PT0gWl9UUkVFUykgeyBicmVhayBpbmZfbGVhdmU7IH1cbiAgICAgIC8qIGZhbGxzIHRocm91Z2ggKi9cbiAgICBjYXNlIExFTl86XG4gICAgICBzdGF0ZS5tb2RlID0gTEVOO1xuICAgICAgLyogZmFsbHMgdGhyb3VnaCAqL1xuICAgIGNhc2UgTEVOOlxuICAgICAgaWYgKGhhdmUgPj0gNiAmJiBsZWZ0ID49IDI1OCkge1xuICAgICAgICAvLy0tLSBSRVNUT1JFKCkgLS0tXG4gICAgICAgIHN0cm0ubmV4dF9vdXQgPSBwdXQ7XG4gICAgICAgIHN0cm0uYXZhaWxfb3V0ID0gbGVmdDtcbiAgICAgICAgc3RybS5uZXh0X2luID0gbmV4dDtcbiAgICAgICAgc3RybS5hdmFpbF9pbiA9IGhhdmU7XG4gICAgICAgIHN0YXRlLmhvbGQgPSBob2xkO1xuICAgICAgICBzdGF0ZS5iaXRzID0gYml0cztcbiAgICAgICAgLy8tLS1cbiAgICAgICAgaW5mbGF0ZV9mYXN0KHN0cm0sIF9vdXQpO1xuICAgICAgICAvLy0tLSBMT0FEKCkgLS0tXG4gICAgICAgIHB1dCA9IHN0cm0ubmV4dF9vdXQ7XG4gICAgICAgIG91dHB1dCA9IHN0cm0ub3V0cHV0O1xuICAgICAgICBsZWZ0ID0gc3RybS5hdmFpbF9vdXQ7XG4gICAgICAgIG5leHQgPSBzdHJtLm5leHRfaW47XG4gICAgICAgIGlucHV0ID0gc3RybS5pbnB1dDtcbiAgICAgICAgaGF2ZSA9IHN0cm0uYXZhaWxfaW47XG4gICAgICAgIGhvbGQgPSBzdGF0ZS5ob2xkO1xuICAgICAgICBiaXRzID0gc3RhdGUuYml0cztcbiAgICAgICAgLy8tLS1cblxuICAgICAgICBpZiAoc3RhdGUubW9kZSA9PT0gVFlQRSkge1xuICAgICAgICAgIHN0YXRlLmJhY2sgPSAtMTtcbiAgICAgICAgfVxuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIHN0YXRlLmJhY2sgPSAwO1xuICAgICAgZm9yICg7Oykge1xuICAgICAgICBoZXJlID0gc3RhdGUubGVuY29kZVtob2xkICYgKCgxIDw8IHN0YXRlLmxlbmJpdHMpIC0gMSldOyAgLypCSVRTKHN0YXRlLmxlbmJpdHMpKi9cbiAgICAgICAgaGVyZV9iaXRzID0gaGVyZSA+Pj4gMjQ7XG4gICAgICAgIGhlcmVfb3AgPSAoaGVyZSA+Pj4gMTYpICYgMHhmZjtcbiAgICAgICAgaGVyZV92YWwgPSBoZXJlICYgMHhmZmZmO1xuXG4gICAgICAgIGlmIChoZXJlX2JpdHMgPD0gYml0cykgeyBicmVhazsgfVxuICAgICAgICAvLy0tLSBQVUxMQllURSgpIC0tLS8vXG4gICAgICAgIGlmIChoYXZlID09PSAwKSB7IGJyZWFrIGluZl9sZWF2ZTsgfVxuICAgICAgICBoYXZlLS07XG4gICAgICAgIGhvbGQgKz0gaW5wdXRbbmV4dCsrXSA8PCBiaXRzO1xuICAgICAgICBiaXRzICs9IDg7XG4gICAgICAgIC8vLS0tLy9cbiAgICAgIH1cbiAgICAgIGlmIChoZXJlX29wICYmIChoZXJlX29wICYgMHhmMCkgPT09IDApIHtcbiAgICAgICAgbGFzdF9iaXRzID0gaGVyZV9iaXRzO1xuICAgICAgICBsYXN0X29wID0gaGVyZV9vcDtcbiAgICAgICAgbGFzdF92YWwgPSBoZXJlX3ZhbDtcbiAgICAgICAgZm9yICg7Oykge1xuICAgICAgICAgIGhlcmUgPSBzdGF0ZS5sZW5jb2RlW2xhc3RfdmFsICtcbiAgICAgICAgICAgICAgICAgICgoaG9sZCAmICgoMSA8PCAobGFzdF9iaXRzICsgbGFzdF9vcCkpIC0gMSkpLypCSVRTKGxhc3QuYml0cyArIGxhc3Qub3ApKi8gPj4gbGFzdF9iaXRzKV07XG4gICAgICAgICAgaGVyZV9iaXRzID0gaGVyZSA+Pj4gMjQ7XG4gICAgICAgICAgaGVyZV9vcCA9IChoZXJlID4+PiAxNikgJiAweGZmO1xuICAgICAgICAgIGhlcmVfdmFsID0gaGVyZSAmIDB4ZmZmZjtcblxuICAgICAgICAgIGlmICgobGFzdF9iaXRzICsgaGVyZV9iaXRzKSA8PSBiaXRzKSB7IGJyZWFrOyB9XG4gICAgICAgICAgLy8tLS0gUFVMTEJZVEUoKSAtLS0vL1xuICAgICAgICAgIGlmIChoYXZlID09PSAwKSB7IGJyZWFrIGluZl9sZWF2ZTsgfVxuICAgICAgICAgIGhhdmUtLTtcbiAgICAgICAgICBob2xkICs9IGlucHV0W25leHQrK10gPDwgYml0cztcbiAgICAgICAgICBiaXRzICs9IDg7XG4gICAgICAgICAgLy8tLS0vL1xuICAgICAgICB9XG4gICAgICAgIC8vLS0tIERST1BCSVRTKGxhc3QuYml0cykgLS0tLy9cbiAgICAgICAgaG9sZCA+Pj49IGxhc3RfYml0cztcbiAgICAgICAgYml0cyAtPSBsYXN0X2JpdHM7XG4gICAgICAgIC8vLS0tLy9cbiAgICAgICAgc3RhdGUuYmFjayArPSBsYXN0X2JpdHM7XG4gICAgICB9XG4gICAgICAvLy0tLSBEUk9QQklUUyhoZXJlLmJpdHMpIC0tLS8vXG4gICAgICBob2xkID4+Pj0gaGVyZV9iaXRzO1xuICAgICAgYml0cyAtPSBoZXJlX2JpdHM7XG4gICAgICAvLy0tLS8vXG4gICAgICBzdGF0ZS5iYWNrICs9IGhlcmVfYml0cztcbiAgICAgIHN0YXRlLmxlbmd0aCA9IGhlcmVfdmFsO1xuICAgICAgaWYgKGhlcmVfb3AgPT09IDApIHtcbiAgICAgICAgLy9UcmFjZXZ2KChzdGRlcnIsIGhlcmUudmFsID49IDB4MjAgJiYgaGVyZS52YWwgPCAweDdmID9cbiAgICAgICAgLy8gICAgICAgIFwiaW5mbGF0ZTogICAgICAgICBsaXRlcmFsICclYydcXG5cIiA6XG4gICAgICAgIC8vICAgICAgICBcImluZmxhdGU6ICAgICAgICAgbGl0ZXJhbCAweCUwMnhcXG5cIiwgaGVyZS52YWwpKTtcbiAgICAgICAgc3RhdGUubW9kZSA9IExJVDtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBpZiAoaGVyZV9vcCAmIDMyKSB7XG4gICAgICAgIC8vVHJhY2V2digoc3RkZXJyLCBcImluZmxhdGU6ICAgICAgICAgZW5kIG9mIGJsb2NrXFxuXCIpKTtcbiAgICAgICAgc3RhdGUuYmFjayA9IC0xO1xuICAgICAgICBzdGF0ZS5tb2RlID0gVFlQRTtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICBpZiAoaGVyZV9vcCAmIDY0KSB7XG4gICAgICAgIHN0cm0ubXNnID0gJ2ludmFsaWQgbGl0ZXJhbC9sZW5ndGggY29kZSc7XG4gICAgICAgIHN0YXRlLm1vZGUgPSBCQUQ7XG4gICAgICAgIGJyZWFrO1xuICAgICAgfVxuICAgICAgc3RhdGUuZXh0cmEgPSBoZXJlX29wICYgMTU7XG4gICAgICBzdGF0ZS5tb2RlID0gTEVORVhUO1xuICAgICAgLyogZmFsbHMgdGhyb3VnaCAqL1xuICAgIGNhc2UgTEVORVhUOlxuICAgICAgaWYgKHN0YXRlLmV4dHJhKSB7XG4gICAgICAgIC8vPT09IE5FRURCSVRTKHN0YXRlLmV4dHJhKTtcbiAgICAgICAgbiA9IHN0YXRlLmV4dHJhO1xuICAgICAgICB3aGlsZSAoYml0cyA8IG4pIHtcbiAgICAgICAgICBpZiAoaGF2ZSA9PT0gMCkgeyBicmVhayBpbmZfbGVhdmU7IH1cbiAgICAgICAgICBoYXZlLS07XG4gICAgICAgICAgaG9sZCArPSBpbnB1dFtuZXh0KytdIDw8IGJpdHM7XG4gICAgICAgICAgYml0cyArPSA4O1xuICAgICAgICB9XG4gICAgICAgIC8vPT09Ly9cbiAgICAgICAgc3RhdGUubGVuZ3RoICs9IGhvbGQgJiAoKDEgPDwgc3RhdGUuZXh0cmEpIC0gMSkvKkJJVFMoc3RhdGUuZXh0cmEpKi87XG4gICAgICAgIC8vLS0tIERST1BCSVRTKHN0YXRlLmV4dHJhKSAtLS0vL1xuICAgICAgICBob2xkID4+Pj0gc3RhdGUuZXh0cmE7XG4gICAgICAgIGJpdHMgLT0gc3RhdGUuZXh0cmE7XG4gICAgICAgIC8vLS0tLy9cbiAgICAgICAgc3RhdGUuYmFjayArPSBzdGF0ZS5leHRyYTtcbiAgICAgIH1cbiAgICAgIC8vVHJhY2V2digoc3RkZXJyLCBcImluZmxhdGU6ICAgICAgICAgbGVuZ3RoICV1XFxuXCIsIHN0YXRlLmxlbmd0aCkpO1xuICAgICAgc3RhdGUud2FzID0gc3RhdGUubGVuZ3RoO1xuICAgICAgc3RhdGUubW9kZSA9IERJU1Q7XG4gICAgICAvKiBmYWxscyB0aHJvdWdoICovXG4gICAgY2FzZSBESVNUOlxuICAgICAgZm9yICg7Oykge1xuICAgICAgICBoZXJlID0gc3RhdGUuZGlzdGNvZGVbaG9sZCAmICgoMSA8PCBzdGF0ZS5kaXN0Yml0cykgLSAxKV07LypCSVRTKHN0YXRlLmRpc3RiaXRzKSovXG4gICAgICAgIGhlcmVfYml0cyA9IGhlcmUgPj4+IDI0O1xuICAgICAgICBoZXJlX29wID0gKGhlcmUgPj4+IDE2KSAmIDB4ZmY7XG4gICAgICAgIGhlcmVfdmFsID0gaGVyZSAmIDB4ZmZmZjtcblxuICAgICAgICBpZiAoKGhlcmVfYml0cykgPD0gYml0cykgeyBicmVhazsgfVxuICAgICAgICAvLy0tLSBQVUxMQllURSgpIC0tLS8vXG4gICAgICAgIGlmIChoYXZlID09PSAwKSB7IGJyZWFrIGluZl9sZWF2ZTsgfVxuICAgICAgICBoYXZlLS07XG4gICAgICAgIGhvbGQgKz0gaW5wdXRbbmV4dCsrXSA8PCBiaXRzO1xuICAgICAgICBiaXRzICs9IDg7XG4gICAgICAgIC8vLS0tLy9cbiAgICAgIH1cbiAgICAgIGlmICgoaGVyZV9vcCAmIDB4ZjApID09PSAwKSB7XG4gICAgICAgIGxhc3RfYml0cyA9IGhlcmVfYml0cztcbiAgICAgICAgbGFzdF9vcCA9IGhlcmVfb3A7XG4gICAgICAgIGxhc3RfdmFsID0gaGVyZV92YWw7XG4gICAgICAgIGZvciAoOzspIHtcbiAgICAgICAgICBoZXJlID0gc3RhdGUuZGlzdGNvZGVbbGFzdF92YWwgK1xuICAgICAgICAgICAgICAgICAgKChob2xkICYgKCgxIDw8IChsYXN0X2JpdHMgKyBsYXN0X29wKSkgLSAxKSkvKkJJVFMobGFzdC5iaXRzICsgbGFzdC5vcCkqLyA+PiBsYXN0X2JpdHMpXTtcbiAgICAgICAgICBoZXJlX2JpdHMgPSBoZXJlID4+PiAyNDtcbiAgICAgICAgICBoZXJlX29wID0gKGhlcmUgPj4+IDE2KSAmIDB4ZmY7XG4gICAgICAgICAgaGVyZV92YWwgPSBoZXJlICYgMHhmZmZmO1xuXG4gICAgICAgICAgaWYgKChsYXN0X2JpdHMgKyBoZXJlX2JpdHMpIDw9IGJpdHMpIHsgYnJlYWs7IH1cbiAgICAgICAgICAvLy0tLSBQVUxMQllURSgpIC0tLS8vXG4gICAgICAgICAgaWYgKGhhdmUgPT09IDApIHsgYnJlYWsgaW5mX2xlYXZlOyB9XG4gICAgICAgICAgaGF2ZS0tO1xuICAgICAgICAgIGhvbGQgKz0gaW5wdXRbbmV4dCsrXSA8PCBiaXRzO1xuICAgICAgICAgIGJpdHMgKz0gODtcbiAgICAgICAgICAvLy0tLS8vXG4gICAgICAgIH1cbiAgICAgICAgLy8tLS0gRFJPUEJJVFMobGFzdC5iaXRzKSAtLS0vL1xuICAgICAgICBob2xkID4+Pj0gbGFzdF9iaXRzO1xuICAgICAgICBiaXRzIC09IGxhc3RfYml0cztcbiAgICAgICAgLy8tLS0vL1xuICAgICAgICBzdGF0ZS5iYWNrICs9IGxhc3RfYml0cztcbiAgICAgIH1cbiAgICAgIC8vLS0tIERST1BCSVRTKGhlcmUuYml0cykgLS0tLy9cbiAgICAgIGhvbGQgPj4+PSBoZXJlX2JpdHM7XG4gICAgICBiaXRzIC09IGhlcmVfYml0cztcbiAgICAgIC8vLS0tLy9cbiAgICAgIHN0YXRlLmJhY2sgKz0gaGVyZV9iaXRzO1xuICAgICAgaWYgKGhlcmVfb3AgJiA2NCkge1xuICAgICAgICBzdHJtLm1zZyA9ICdpbnZhbGlkIGRpc3RhbmNlIGNvZGUnO1xuICAgICAgICBzdGF0ZS5tb2RlID0gQkFEO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICAgIHN0YXRlLm9mZnNldCA9IGhlcmVfdmFsO1xuICAgICAgc3RhdGUuZXh0cmEgPSAoaGVyZV9vcCkgJiAxNTtcbiAgICAgIHN0YXRlLm1vZGUgPSBESVNURVhUO1xuICAgICAgLyogZmFsbHMgdGhyb3VnaCAqL1xuICAgIGNhc2UgRElTVEVYVDpcbiAgICAgIGlmIChzdGF0ZS5leHRyYSkge1xuICAgICAgICAvLz09PSBORUVEQklUUyhzdGF0ZS5leHRyYSk7XG4gICAgICAgIG4gPSBzdGF0ZS5leHRyYTtcbiAgICAgICAgd2hpbGUgKGJpdHMgPCBuKSB7XG4gICAgICAgICAgaWYgKGhhdmUgPT09IDApIHsgYnJlYWsgaW5mX2xlYXZlOyB9XG4gICAgICAgICAgaGF2ZS0tO1xuICAgICAgICAgIGhvbGQgKz0gaW5wdXRbbmV4dCsrXSA8PCBiaXRzO1xuICAgICAgICAgIGJpdHMgKz0gODtcbiAgICAgICAgfVxuICAgICAgICAvLz09PS8vXG4gICAgICAgIHN0YXRlLm9mZnNldCArPSBob2xkICYgKCgxIDw8IHN0YXRlLmV4dHJhKSAtIDEpLypCSVRTKHN0YXRlLmV4dHJhKSovO1xuICAgICAgICAvLy0tLSBEUk9QQklUUyhzdGF0ZS5leHRyYSkgLS0tLy9cbiAgICAgICAgaG9sZCA+Pj49IHN0YXRlLmV4dHJhO1xuICAgICAgICBiaXRzIC09IHN0YXRlLmV4dHJhO1xuICAgICAgICAvLy0tLS8vXG4gICAgICAgIHN0YXRlLmJhY2sgKz0gc3RhdGUuZXh0cmE7XG4gICAgICB9XG4vLyNpZmRlZiBJTkZMQVRFX1NUUklDVFxuICAgICAgaWYgKHN0YXRlLm9mZnNldCA+IHN0YXRlLmRtYXgpIHtcbiAgICAgICAgc3RybS5tc2cgPSAnaW52YWxpZCBkaXN0YW5jZSB0b28gZmFyIGJhY2snO1xuICAgICAgICBzdGF0ZS5tb2RlID0gQkFEO1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbi8vI2VuZGlmXG4gICAgICAvL1RyYWNldnYoKHN0ZGVyciwgXCJpbmZsYXRlOiAgICAgICAgIGRpc3RhbmNlICV1XFxuXCIsIHN0YXRlLm9mZnNldCkpO1xuICAgICAgc3RhdGUubW9kZSA9IE1BVENIO1xuICAgICAgLyogZmFsbHMgdGhyb3VnaCAqL1xuICAgIGNhc2UgTUFUQ0g6XG4gICAgICBpZiAobGVmdCA9PT0gMCkgeyBicmVhayBpbmZfbGVhdmU7IH1cbiAgICAgIGNvcHkgPSBfb3V0IC0gbGVmdDtcbiAgICAgIGlmIChzdGF0ZS5vZmZzZXQgPiBjb3B5KSB7ICAgICAgICAgLyogY29weSBmcm9tIHdpbmRvdyAqL1xuICAgICAgICBjb3B5ID0gc3RhdGUub2Zmc2V0IC0gY29weTtcbiAgICAgICAgaWYgKGNvcHkgPiBzdGF0ZS53aGF2ZSkge1xuICAgICAgICAgIGlmIChzdGF0ZS5zYW5lKSB7XG4gICAgICAgICAgICBzdHJtLm1zZyA9ICdpbnZhbGlkIGRpc3RhbmNlIHRvbyBmYXIgYmFjayc7XG4gICAgICAgICAgICBzdGF0ZS5tb2RlID0gQkFEO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgfVxuLy8gKCEpIFRoaXMgYmxvY2sgaXMgZGlzYWJsZWQgaW4gemxpYiBkZWZhaWx0cyxcbi8vIGRvbid0IGVuYWJsZSBpdCBmb3IgYmluYXJ5IGNvbXBhdGliaWxpdHlcbi8vI2lmZGVmIElORkxBVEVfQUxMT1dfSU5WQUxJRF9ESVNUQU5DRV9UT09GQVJfQVJSUlxuLy8gICAgICAgICAgVHJhY2UoKHN0ZGVyciwgXCJpbmZsYXRlLmMgdG9vIGZhclxcblwiKSk7XG4vLyAgICAgICAgICBjb3B5IC09IHN0YXRlLndoYXZlO1xuLy8gICAgICAgICAgaWYgKGNvcHkgPiBzdGF0ZS5sZW5ndGgpIHsgY29weSA9IHN0YXRlLmxlbmd0aDsgfVxuLy8gICAgICAgICAgaWYgKGNvcHkgPiBsZWZ0KSB7IGNvcHkgPSBsZWZ0OyB9XG4vLyAgICAgICAgICBsZWZ0IC09IGNvcHk7XG4vLyAgICAgICAgICBzdGF0ZS5sZW5ndGggLT0gY29weTtcbi8vICAgICAgICAgIGRvIHtcbi8vICAgICAgICAgICAgb3V0cHV0W3B1dCsrXSA9IDA7XG4vLyAgICAgICAgICB9IHdoaWxlICgtLWNvcHkpO1xuLy8gICAgICAgICAgaWYgKHN0YXRlLmxlbmd0aCA9PT0gMCkgeyBzdGF0ZS5tb2RlID0gTEVOOyB9XG4vLyAgICAgICAgICBicmVhaztcbi8vI2VuZGlmXG4gICAgICAgIH1cbiAgICAgICAgaWYgKGNvcHkgPiBzdGF0ZS53bmV4dCkge1xuICAgICAgICAgIGNvcHkgLT0gc3RhdGUud25leHQ7XG4gICAgICAgICAgZnJvbSA9IHN0YXRlLndzaXplIC0gY29weTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICBmcm9tID0gc3RhdGUud25leHQgLSBjb3B5O1xuICAgICAgICB9XG4gICAgICAgIGlmIChjb3B5ID4gc3RhdGUubGVuZ3RoKSB7IGNvcHkgPSBzdGF0ZS5sZW5ndGg7IH1cbiAgICAgICAgZnJvbV9zb3VyY2UgPSBzdGF0ZS53aW5kb3c7XG4gICAgICB9XG4gICAgICBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBjb3B5IGZyb20gb3V0cHV0ICovXG4gICAgICAgIGZyb21fc291cmNlID0gb3V0cHV0O1xuICAgICAgICBmcm9tID0gcHV0IC0gc3RhdGUub2Zmc2V0O1xuICAgICAgICBjb3B5ID0gc3RhdGUubGVuZ3RoO1xuICAgICAgfVxuICAgICAgaWYgKGNvcHkgPiBsZWZ0KSB7IGNvcHkgPSBsZWZ0OyB9XG4gICAgICBsZWZ0IC09IGNvcHk7XG4gICAgICBzdGF0ZS5sZW5ndGggLT0gY29weTtcbiAgICAgIGRvIHtcbiAgICAgICAgb3V0cHV0W3B1dCsrXSA9IGZyb21fc291cmNlW2Zyb20rK107XG4gICAgICB9IHdoaWxlICgtLWNvcHkpO1xuICAgICAgaWYgKHN0YXRlLmxlbmd0aCA9PT0gMCkgeyBzdGF0ZS5tb2RlID0gTEVOOyB9XG4gICAgICBicmVhaztcbiAgICBjYXNlIExJVDpcbiAgICAgIGlmIChsZWZ0ID09PSAwKSB7IGJyZWFrIGluZl9sZWF2ZTsgfVxuICAgICAgb3V0cHV0W3B1dCsrXSA9IHN0YXRlLmxlbmd0aDtcbiAgICAgIGxlZnQtLTtcbiAgICAgIHN0YXRlLm1vZGUgPSBMRU47XG4gICAgICBicmVhaztcbiAgICBjYXNlIENIRUNLOlxuICAgICAgaWYgKHN0YXRlLndyYXApIHtcbiAgICAgICAgLy89PT0gTkVFREJJVFMoMzIpO1xuICAgICAgICB3aGlsZSAoYml0cyA8IDMyKSB7XG4gICAgICAgICAgaWYgKGhhdmUgPT09IDApIHsgYnJlYWsgaW5mX2xlYXZlOyB9XG4gICAgICAgICAgaGF2ZS0tO1xuICAgICAgICAgIC8vIFVzZSAnfCcgaW5zZGVhZCBvZiAnKycgdG8gbWFrZSBzdXJlIHRoYXQgcmVzdWx0IGlzIHNpZ25lZFxuICAgICAgICAgIGhvbGQgfD0gaW5wdXRbbmV4dCsrXSA8PCBiaXRzO1xuICAgICAgICAgIGJpdHMgKz0gODtcbiAgICAgICAgfVxuICAgICAgICAvLz09PS8vXG4gICAgICAgIF9vdXQgLT0gbGVmdDtcbiAgICAgICAgc3RybS50b3RhbF9vdXQgKz0gX291dDtcbiAgICAgICAgc3RhdGUudG90YWwgKz0gX291dDtcbiAgICAgICAgaWYgKF9vdXQpIHtcbiAgICAgICAgICBzdHJtLmFkbGVyID0gc3RhdGUuY2hlY2sgPVxuICAgICAgICAgICAgICAvKlVQREFURShzdGF0ZS5jaGVjaywgcHV0IC0gX291dCwgX291dCk7Ki9cbiAgICAgICAgICAgICAgKHN0YXRlLmZsYWdzID8gY3JjMzIoc3RhdGUuY2hlY2ssIG91dHB1dCwgX291dCwgcHV0IC0gX291dCkgOiBhZGxlcjMyKHN0YXRlLmNoZWNrLCBvdXRwdXQsIF9vdXQsIHB1dCAtIF9vdXQpKTtcblxuICAgICAgICB9XG4gICAgICAgIF9vdXQgPSBsZWZ0O1xuICAgICAgICAvLyBOQjogY3JjMzIgc3RvcmVkIGFzIHNpZ25lZCAzMi1iaXQgaW50LCB6c3dhcDMyIHJldHVybnMgc2lnbmVkIHRvb1xuICAgICAgICBpZiAoKHN0YXRlLmZsYWdzID8gaG9sZCA6IHpzd2FwMzIoaG9sZCkpICE9PSBzdGF0ZS5jaGVjaykge1xuICAgICAgICAgIHN0cm0ubXNnID0gJ2luY29ycmVjdCBkYXRhIGNoZWNrJztcbiAgICAgICAgICBzdGF0ZS5tb2RlID0gQkFEO1xuICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG4gICAgICAgIC8vPT09IElOSVRCSVRTKCk7XG4gICAgICAgIGhvbGQgPSAwO1xuICAgICAgICBiaXRzID0gMDtcbiAgICAgICAgLy89PT0vL1xuICAgICAgICAvL1RyYWNldigoc3RkZXJyLCBcImluZmxhdGU6ICAgY2hlY2sgbWF0Y2hlcyB0cmFpbGVyXFxuXCIpKTtcbiAgICAgIH1cbiAgICAgIHN0YXRlLm1vZGUgPSBMRU5HVEg7XG4gICAgICAvKiBmYWxscyB0aHJvdWdoICovXG4gICAgY2FzZSBMRU5HVEg6XG4gICAgICBpZiAoc3RhdGUud3JhcCAmJiBzdGF0ZS5mbGFncykge1xuICAgICAgICAvLz09PSBORUVEQklUUygzMik7XG4gICAgICAgIHdoaWxlIChiaXRzIDwgMzIpIHtcbiAgICAgICAgICBpZiAoaGF2ZSA9PT0gMCkgeyBicmVhayBpbmZfbGVhdmU7IH1cbiAgICAgICAgICBoYXZlLS07XG4gICAgICAgICAgaG9sZCArPSBpbnB1dFtuZXh0KytdIDw8IGJpdHM7XG4gICAgICAgICAgYml0cyArPSA4O1xuICAgICAgICB9XG4gICAgICAgIC8vPT09Ly9cbiAgICAgICAgaWYgKGhvbGQgIT09IChzdGF0ZS50b3RhbCAmIDB4ZmZmZmZmZmYpKSB7XG4gICAgICAgICAgc3RybS5tc2cgPSAnaW5jb3JyZWN0IGxlbmd0aCBjaGVjayc7XG4gICAgICAgICAgc3RhdGUubW9kZSA9IEJBRDtcbiAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgICAgICAvLz09PSBJTklUQklUUygpO1xuICAgICAgICBob2xkID0gMDtcbiAgICAgICAgYml0cyA9IDA7XG4gICAgICAgIC8vPT09Ly9cbiAgICAgICAgLy9UcmFjZXYoKHN0ZGVyciwgXCJpbmZsYXRlOiAgIGxlbmd0aCBtYXRjaGVzIHRyYWlsZXJcXG5cIikpO1xuICAgICAgfVxuICAgICAgc3RhdGUubW9kZSA9IERPTkU7XG4gICAgICAvKiBmYWxscyB0aHJvdWdoICovXG4gICAgY2FzZSBET05FOlxuICAgICAgcmV0ID0gWl9TVFJFQU1fRU5EO1xuICAgICAgYnJlYWsgaW5mX2xlYXZlO1xuICAgIGNhc2UgQkFEOlxuICAgICAgcmV0ID0gWl9EQVRBX0VSUk9SO1xuICAgICAgYnJlYWsgaW5mX2xlYXZlO1xuICAgIGNhc2UgTUVNOlxuICAgICAgcmV0dXJuIFpfTUVNX0VSUk9SO1xuICAgIGNhc2UgU1lOQzpcbiAgICAgIC8qIGZhbGxzIHRocm91Z2ggKi9cbiAgICBkZWZhdWx0OlxuICAgICAgcmV0dXJuIFpfU1RSRUFNX0VSUk9SO1xuICAgIH1cbiAgfVxuXG4gIC8vIGluZl9sZWF2ZSA8LSBoZXJlIGlzIHJlYWwgcGxhY2UgZm9yIFwiZ290byBpbmZfbGVhdmVcIiwgZW11bGF0ZWQgdmlhIFwiYnJlYWsgaW5mX2xlYXZlXCJcblxuICAvKlxuICAgICBSZXR1cm4gZnJvbSBpbmZsYXRlKCksIHVwZGF0aW5nIHRoZSB0b3RhbCBjb3VudHMgYW5kIHRoZSBjaGVjayB2YWx1ZS5cbiAgICAgSWYgdGhlcmUgd2FzIG5vIHByb2dyZXNzIGR1cmluZyB0aGUgaW5mbGF0ZSgpIGNhbGwsIHJldHVybiBhIGJ1ZmZlclxuICAgICBlcnJvci4gIENhbGwgdXBkYXRld2luZG93KCkgdG8gY3JlYXRlIGFuZC9vciB1cGRhdGUgdGhlIHdpbmRvdyBzdGF0ZS5cbiAgICAgTm90ZTogYSBtZW1vcnkgZXJyb3IgZnJvbSBpbmZsYXRlKCkgaXMgbm9uLXJlY292ZXJhYmxlLlxuICAgKi9cblxuICAvLy0tLSBSRVNUT1JFKCkgLS0tXG4gIHN0cm0ubmV4dF9vdXQgPSBwdXQ7XG4gIHN0cm0uYXZhaWxfb3V0ID0gbGVmdDtcbiAgc3RybS5uZXh0X2luID0gbmV4dDtcbiAgc3RybS5hdmFpbF9pbiA9IGhhdmU7XG4gIHN0YXRlLmhvbGQgPSBob2xkO1xuICBzdGF0ZS5iaXRzID0gYml0cztcbiAgLy8tLS1cblxuICBpZiAoc3RhdGUud3NpemUgfHwgKF9vdXQgIT09IHN0cm0uYXZhaWxfb3V0ICYmIHN0YXRlLm1vZGUgPCBCQUQgJiZcbiAgICAgICAgICAgICAgICAgICAgICAoc3RhdGUubW9kZSA8IENIRUNLIHx8IGZsdXNoICE9PSBaX0ZJTklTSCkpKSB7XG4gICAgaWYgKHVwZGF0ZXdpbmRvdyhzdHJtLCBzdHJtLm91dHB1dCwgc3RybS5uZXh0X291dCwgX291dCAtIHN0cm0uYXZhaWxfb3V0KSkge1xuICAgICAgc3RhdGUubW9kZSA9IE1FTTtcbiAgICAgIHJldHVybiBaX01FTV9FUlJPUjtcbiAgICB9XG4gIH1cbiAgX2luIC09IHN0cm0uYXZhaWxfaW47XG4gIF9vdXQgLT0gc3RybS5hdmFpbF9vdXQ7XG4gIHN0cm0udG90YWxfaW4gKz0gX2luO1xuICBzdHJtLnRvdGFsX291dCArPSBfb3V0O1xuICBzdGF0ZS50b3RhbCArPSBfb3V0O1xuICBpZiAoc3RhdGUud3JhcCAmJiBfb3V0KSB7XG4gICAgc3RybS5hZGxlciA9IHN0YXRlLmNoZWNrID0gLypVUERBVEUoc3RhdGUuY2hlY2ssIHN0cm0ubmV4dF9vdXQgLSBfb3V0LCBfb3V0KTsqL1xuICAgICAgKHN0YXRlLmZsYWdzID8gY3JjMzIoc3RhdGUuY2hlY2ssIG91dHB1dCwgX291dCwgc3RybS5uZXh0X291dCAtIF9vdXQpIDogYWRsZXIzMihzdGF0ZS5jaGVjaywgb3V0cHV0LCBfb3V0LCBzdHJtLm5leHRfb3V0IC0gX291dCkpO1xuICB9XG4gIHN0cm0uZGF0YV90eXBlID0gc3RhdGUuYml0cyArIChzdGF0ZS5sYXN0ID8gNjQgOiAwKSArXG4gICAgICAgICAgICAgICAgICAgIChzdGF0ZS5tb2RlID09PSBUWVBFID8gMTI4IDogMCkgK1xuICAgICAgICAgICAgICAgICAgICAoc3RhdGUubW9kZSA9PT0gTEVOXyB8fCBzdGF0ZS5tb2RlID09PSBDT1BZXyA/IDI1NiA6IDApO1xuICBpZiAoKChfaW4gPT09IDAgJiYgX291dCA9PT0gMCkgfHwgZmx1c2ggPT09IFpfRklOSVNIKSAmJiByZXQgPT09IFpfT0spIHtcbiAgICByZXQgPSBaX0JVRl9FUlJPUjtcbiAgfVxuICByZXR1cm4gcmV0O1xufVxuXG5mdW5jdGlvbiBpbmZsYXRlRW5kKHN0cm0pIHtcblxuICBpZiAoIXN0cm0gfHwgIXN0cm0uc3RhdGUgLyp8fCBzdHJtLT56ZnJlZSA9PSAoZnJlZV9mdW5jKTAqLykge1xuICAgIHJldHVybiBaX1NUUkVBTV9FUlJPUjtcbiAgfVxuXG4gIHZhciBzdGF0ZSA9IHN0cm0uc3RhdGU7XG4gIGlmIChzdGF0ZS53aW5kb3cpIHtcbiAgICBzdGF0ZS53aW5kb3cgPSBudWxsO1xuICB9XG4gIHN0cm0uc3RhdGUgPSBudWxsO1xuICByZXR1cm4gWl9PSztcbn1cblxuZnVuY3Rpb24gaW5mbGF0ZUdldEhlYWRlcihzdHJtLCBoZWFkKSB7XG4gIHZhciBzdGF0ZTtcblxuICAvKiBjaGVjayBzdGF0ZSAqL1xuICBpZiAoIXN0cm0gfHwgIXN0cm0uc3RhdGUpIHsgcmV0dXJuIFpfU1RSRUFNX0VSUk9SOyB9XG4gIHN0YXRlID0gc3RybS5zdGF0ZTtcbiAgaWYgKChzdGF0ZS53cmFwICYgMikgPT09IDApIHsgcmV0dXJuIFpfU1RSRUFNX0VSUk9SOyB9XG5cbiAgLyogc2F2ZSBoZWFkZXIgc3RydWN0dXJlICovXG4gIHN0YXRlLmhlYWQgPSBoZWFkO1xuICBoZWFkLmRvbmUgPSBmYWxzZTtcbiAgcmV0dXJuIFpfT0s7XG59XG5cbmZ1bmN0aW9uIGluZmxhdGVTZXREaWN0aW9uYXJ5KHN0cm0sIGRpY3Rpb25hcnkpIHtcbiAgdmFyIGRpY3RMZW5ndGggPSBkaWN0aW9uYXJ5Lmxlbmd0aDtcblxuICB2YXIgc3RhdGU7XG4gIHZhciBkaWN0aWQ7XG4gIHZhciByZXQ7XG5cbiAgLyogY2hlY2sgc3RhdGUgKi9cbiAgaWYgKCFzdHJtIC8qID09IFpfTlVMTCAqLyB8fCAhc3RybS5zdGF0ZSAvKiA9PSBaX05VTEwgKi8pIHsgcmV0dXJuIFpfU1RSRUFNX0VSUk9SOyB9XG4gIHN0YXRlID0gc3RybS5zdGF0ZTtcblxuICBpZiAoc3RhdGUud3JhcCAhPT0gMCAmJiBzdGF0ZS5tb2RlICE9PSBESUNUKSB7XG4gICAgcmV0dXJuIFpfU1RSRUFNX0VSUk9SO1xuICB9XG5cbiAgLyogY2hlY2sgZm9yIGNvcnJlY3QgZGljdGlvbmFyeSBpZGVudGlmaWVyICovXG4gIGlmIChzdGF0ZS5tb2RlID09PSBESUNUKSB7XG4gICAgZGljdGlkID0gMTsgLyogYWRsZXIzMigwLCBudWxsLCAwKSovXG4gICAgLyogZGljdGlkID0gYWRsZXIzMihkaWN0aWQsIGRpY3Rpb25hcnksIGRpY3RMZW5ndGgpOyAqL1xuICAgIGRpY3RpZCA9IGFkbGVyMzIoZGljdGlkLCBkaWN0aW9uYXJ5LCBkaWN0TGVuZ3RoLCAwKTtcbiAgICBpZiAoZGljdGlkICE9PSBzdGF0ZS5jaGVjaykge1xuICAgICAgcmV0dXJuIFpfREFUQV9FUlJPUjtcbiAgICB9XG4gIH1cbiAgLyogY29weSBkaWN0aW9uYXJ5IHRvIHdpbmRvdyB1c2luZyB1cGRhdGV3aW5kb3coKSwgd2hpY2ggd2lsbCBhbWVuZCB0aGVcbiAgIGV4aXN0aW5nIGRpY3Rpb25hcnkgaWYgYXBwcm9wcmlhdGUgKi9cbiAgcmV0ID0gdXBkYXRld2luZG93KHN0cm0sIGRpY3Rpb25hcnksIGRpY3RMZW5ndGgsIGRpY3RMZW5ndGgpO1xuICBpZiAocmV0KSB7XG4gICAgc3RhdGUubW9kZSA9IE1FTTtcbiAgICByZXR1cm4gWl9NRU1fRVJST1I7XG4gIH1cbiAgc3RhdGUuaGF2ZWRpY3QgPSAxO1xuICAvLyBUcmFjZXYoKHN0ZGVyciwgXCJpbmZsYXRlOiAgIGRpY3Rpb25hcnkgc2V0XFxuXCIpKTtcbiAgcmV0dXJuIFpfT0s7XG59XG5cbmV4cG9ydHMuaW5mbGF0ZVJlc2V0ID0gaW5mbGF0ZVJlc2V0O1xuZXhwb3J0cy5pbmZsYXRlUmVzZXQyID0gaW5mbGF0ZVJlc2V0MjtcbmV4cG9ydHMuaW5mbGF0ZVJlc2V0S2VlcCA9IGluZmxhdGVSZXNldEtlZXA7XG5leHBvcnRzLmluZmxhdGVJbml0ID0gaW5mbGF0ZUluaXQ7XG5leHBvcnRzLmluZmxhdGVJbml0MiA9IGluZmxhdGVJbml0MjtcbmV4cG9ydHMuaW5mbGF0ZSA9IGluZmxhdGU7XG5leHBvcnRzLmluZmxhdGVFbmQgPSBpbmZsYXRlRW5kO1xuZXhwb3J0cy5pbmZsYXRlR2V0SGVhZGVyID0gaW5mbGF0ZUdldEhlYWRlcjtcbmV4cG9ydHMuaW5mbGF0ZVNldERpY3Rpb25hcnkgPSBpbmZsYXRlU2V0RGljdGlvbmFyeTtcbmV4cG9ydHMuaW5mbGF0ZUluZm8gPSAncGFrbyBpbmZsYXRlIChmcm9tIE5vZGVjYSBwcm9qZWN0KSc7XG5cbi8qIE5vdCBpbXBsZW1lbnRlZFxuZXhwb3J0cy5pbmZsYXRlQ29weSA9IGluZmxhdGVDb3B5O1xuZXhwb3J0cy5pbmZsYXRlR2V0RGljdGlvbmFyeSA9IGluZmxhdGVHZXREaWN0aW9uYXJ5O1xuZXhwb3J0cy5pbmZsYXRlTWFyayA9IGluZmxhdGVNYXJrO1xuZXhwb3J0cy5pbmZsYXRlUHJpbWUgPSBpbmZsYXRlUHJpbWU7XG5leHBvcnRzLmluZmxhdGVTeW5jID0gaW5mbGF0ZVN5bmM7XG5leHBvcnRzLmluZmxhdGVTeW5jUG9pbnQgPSBpbmZsYXRlU3luY1BvaW50O1xuZXhwb3J0cy5pbmZsYXRlVW5kZXJtaW5lID0gaW5mbGF0ZVVuZGVybWluZTtcbiovXG4iLCIndXNlIHN0cmljdCc7XG5cblxudmFyIHV0aWxzID0gcmVxdWlyZSgnLi4vdXRpbHMvY29tbW9uJyk7XG5cbnZhciBNQVhCSVRTID0gMTU7XG52YXIgRU5PVUdIX0xFTlMgPSA4NTI7XG52YXIgRU5PVUdIX0RJU1RTID0gNTkyO1xuLy92YXIgRU5PVUdIID0gKEVOT1VHSF9MRU5TK0VOT1VHSF9ESVNUUyk7XG5cbnZhciBDT0RFUyA9IDA7XG52YXIgTEVOUyA9IDE7XG52YXIgRElTVFMgPSAyO1xuXG52YXIgbGJhc2UgPSBbIC8qIExlbmd0aCBjb2RlcyAyNTcuLjI4NSBiYXNlICovXG4gIDMsIDQsIDUsIDYsIDcsIDgsIDksIDEwLCAxMSwgMTMsIDE1LCAxNywgMTksIDIzLCAyNywgMzEsXG4gIDM1LCA0MywgNTEsIDU5LCA2NywgODMsIDk5LCAxMTUsIDEzMSwgMTYzLCAxOTUsIDIyNywgMjU4LCAwLCAwXG5dO1xuXG52YXIgbGV4dCA9IFsgLyogTGVuZ3RoIGNvZGVzIDI1Ny4uMjg1IGV4dHJhICovXG4gIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTYsIDE2LCAxNiwgMTcsIDE3LCAxNywgMTcsIDE4LCAxOCwgMTgsIDE4LFxuICAxOSwgMTksIDE5LCAxOSwgMjAsIDIwLCAyMCwgMjAsIDIxLCAyMSwgMjEsIDIxLCAxNiwgNzIsIDc4XG5dO1xuXG52YXIgZGJhc2UgPSBbIC8qIERpc3RhbmNlIGNvZGVzIDAuLjI5IGJhc2UgKi9cbiAgMSwgMiwgMywgNCwgNSwgNywgOSwgMTMsIDE3LCAyNSwgMzMsIDQ5LCA2NSwgOTcsIDEyOSwgMTkzLFxuICAyNTcsIDM4NSwgNTEzLCA3NjksIDEwMjUsIDE1MzcsIDIwNDksIDMwNzMsIDQwOTcsIDYxNDUsXG4gIDgxOTMsIDEyMjg5LCAxNjM4NSwgMjQ1NzcsIDAsIDBcbl07XG5cbnZhciBkZXh0ID0gWyAvKiBEaXN0YW5jZSBjb2RlcyAwLi4yOSBleHRyYSAqL1xuICAxNiwgMTYsIDE2LCAxNiwgMTcsIDE3LCAxOCwgMTgsIDE5LCAxOSwgMjAsIDIwLCAyMSwgMjEsIDIyLCAyMixcbiAgMjMsIDIzLCAyNCwgMjQsIDI1LCAyNSwgMjYsIDI2LCAyNywgMjcsXG4gIDI4LCAyOCwgMjksIDI5LCA2NCwgNjRcbl07XG5cbm1vZHVsZS5leHBvcnRzID0gZnVuY3Rpb24gaW5mbGF0ZV90YWJsZSh0eXBlLCBsZW5zLCBsZW5zX2luZGV4LCBjb2RlcywgdGFibGUsIHRhYmxlX2luZGV4LCB3b3JrLCBvcHRzKVxue1xuICB2YXIgYml0cyA9IG9wdHMuYml0cztcbiAgICAgIC8vaGVyZSA9IG9wdHMuaGVyZTsgLyogdGFibGUgZW50cnkgZm9yIGR1cGxpY2F0aW9uICovXG5cbiAgdmFyIGxlbiA9IDA7ICAgICAgICAgICAgICAgLyogYSBjb2RlJ3MgbGVuZ3RoIGluIGJpdHMgKi9cbiAgdmFyIHN5bSA9IDA7ICAgICAgICAgICAgICAgLyogaW5kZXggb2YgY29kZSBzeW1ib2xzICovXG4gIHZhciBtaW4gPSAwLCBtYXggPSAwOyAgICAgICAgICAvKiBtaW5pbXVtIGFuZCBtYXhpbXVtIGNvZGUgbGVuZ3RocyAqL1xuICB2YXIgcm9vdCA9IDA7ICAgICAgICAgICAgICAvKiBudW1iZXIgb2YgaW5kZXggYml0cyBmb3Igcm9vdCB0YWJsZSAqL1xuICB2YXIgY3VyciA9IDA7ICAgICAgICAgICAgICAvKiBudW1iZXIgb2YgaW5kZXggYml0cyBmb3IgY3VycmVudCB0YWJsZSAqL1xuICB2YXIgZHJvcCA9IDA7ICAgICAgICAgICAgICAvKiBjb2RlIGJpdHMgdG8gZHJvcCBmb3Igc3ViLXRhYmxlICovXG4gIHZhciBsZWZ0ID0gMDsgICAgICAgICAgICAgICAgICAgLyogbnVtYmVyIG9mIHByZWZpeCBjb2RlcyBhdmFpbGFibGUgKi9cbiAgdmFyIHVzZWQgPSAwOyAgICAgICAgICAgICAgLyogY29kZSBlbnRyaWVzIGluIHRhYmxlIHVzZWQgKi9cbiAgdmFyIGh1ZmYgPSAwOyAgICAgICAgICAgICAgLyogSHVmZm1hbiBjb2RlICovXG4gIHZhciBpbmNyOyAgICAgICAgICAgICAgLyogZm9yIGluY3JlbWVudGluZyBjb2RlLCBpbmRleCAqL1xuICB2YXIgZmlsbDsgICAgICAgICAgICAgIC8qIGluZGV4IGZvciByZXBsaWNhdGluZyBlbnRyaWVzICovXG4gIHZhciBsb3c7ICAgICAgICAgICAgICAgLyogbG93IGJpdHMgZm9yIGN1cnJlbnQgcm9vdCBlbnRyeSAqL1xuICB2YXIgbWFzazsgICAgICAgICAgICAgIC8qIG1hc2sgZm9yIGxvdyByb290IGJpdHMgKi9cbiAgdmFyIG5leHQ7ICAgICAgICAgICAgIC8qIG5leHQgYXZhaWxhYmxlIHNwYWNlIGluIHRhYmxlICovXG4gIHZhciBiYXNlID0gbnVsbDsgICAgIC8qIGJhc2UgdmFsdWUgdGFibGUgdG8gdXNlICovXG4gIHZhciBiYXNlX2luZGV4ID0gMDtcbi8vICB2YXIgc2hvZXh0cmE7ICAgIC8qIGV4dHJhIGJpdHMgdGFibGUgdG8gdXNlICovXG4gIHZhciBlbmQ7ICAgICAgICAgICAgICAgICAgICAvKiB1c2UgYmFzZSBhbmQgZXh0cmEgZm9yIHN5bWJvbCA+IGVuZCAqL1xuICB2YXIgY291bnQgPSBuZXcgdXRpbHMuQnVmMTYoTUFYQklUUyArIDEpOyAvL1tNQVhCSVRTKzFdOyAgICAvKiBudW1iZXIgb2YgY29kZXMgb2YgZWFjaCBsZW5ndGggKi9cbiAgdmFyIG9mZnMgPSBuZXcgdXRpbHMuQnVmMTYoTUFYQklUUyArIDEpOyAvL1tNQVhCSVRTKzFdOyAgICAgLyogb2Zmc2V0cyBpbiB0YWJsZSBmb3IgZWFjaCBsZW5ndGggKi9cbiAgdmFyIGV4dHJhID0gbnVsbDtcbiAgdmFyIGV4dHJhX2luZGV4ID0gMDtcblxuICB2YXIgaGVyZV9iaXRzLCBoZXJlX29wLCBoZXJlX3ZhbDtcblxuICAvKlxuICAgUHJvY2VzcyBhIHNldCBvZiBjb2RlIGxlbmd0aHMgdG8gY3JlYXRlIGEgY2Fub25pY2FsIEh1ZmZtYW4gY29kZS4gIFRoZVxuICAgY29kZSBsZW5ndGhzIGFyZSBsZW5zWzAuLmNvZGVzLTFdLiAgRWFjaCBsZW5ndGggY29ycmVzcG9uZHMgdG8gdGhlXG4gICBzeW1ib2xzIDAuLmNvZGVzLTEuICBUaGUgSHVmZm1hbiBjb2RlIGlzIGdlbmVyYXRlZCBieSBmaXJzdCBzb3J0aW5nIHRoZVxuICAgc3ltYm9scyBieSBsZW5ndGggZnJvbSBzaG9ydCB0byBsb25nLCBhbmQgcmV0YWluaW5nIHRoZSBzeW1ib2wgb3JkZXJcbiAgIGZvciBjb2RlcyB3aXRoIGVxdWFsIGxlbmd0aHMuICBUaGVuIHRoZSBjb2RlIHN0YXJ0cyB3aXRoIGFsbCB6ZXJvIGJpdHNcbiAgIGZvciB0aGUgZmlyc3QgY29kZSBvZiB0aGUgc2hvcnRlc3QgbGVuZ3RoLCBhbmQgdGhlIGNvZGVzIGFyZSBpbnRlZ2VyXG4gICBpbmNyZW1lbnRzIGZvciB0aGUgc2FtZSBsZW5ndGgsIGFuZCB6ZXJvcyBhcmUgYXBwZW5kZWQgYXMgdGhlIGxlbmd0aFxuICAgaW5jcmVhc2VzLiAgRm9yIHRoZSBkZWZsYXRlIGZvcm1hdCwgdGhlc2UgYml0cyBhcmUgc3RvcmVkIGJhY2t3YXJkc1xuICAgZnJvbSB0aGVpciBtb3JlIG5hdHVyYWwgaW50ZWdlciBpbmNyZW1lbnQgb3JkZXJpbmcsIGFuZCBzbyB3aGVuIHRoZVxuICAgZGVjb2RpbmcgdGFibGVzIGFyZSBidWlsdCBpbiB0aGUgbGFyZ2UgbG9vcCBiZWxvdywgdGhlIGludGVnZXIgY29kZXNcbiAgIGFyZSBpbmNyZW1lbnRlZCBiYWNrd2FyZHMuXG5cbiAgIFRoaXMgcm91dGluZSBhc3N1bWVzLCBidXQgZG9lcyBub3QgY2hlY2ssIHRoYXQgYWxsIG9mIHRoZSBlbnRyaWVzIGluXG4gICBsZW5zW10gYXJlIGluIHRoZSByYW5nZSAwLi5NQVhCSVRTLiAgVGhlIGNhbGxlciBtdXN0IGFzc3VyZSB0aGlzLlxuICAgMS4uTUFYQklUUyBpcyBpbnRlcnByZXRlZCBhcyB0aGF0IGNvZGUgbGVuZ3RoLiAgemVybyBtZWFucyB0aGF0IHRoYXRcbiAgIHN5bWJvbCBkb2VzIG5vdCBvY2N1ciBpbiB0aGlzIGNvZGUuXG5cbiAgIFRoZSBjb2RlcyBhcmUgc29ydGVkIGJ5IGNvbXB1dGluZyBhIGNvdW50IG9mIGNvZGVzIGZvciBlYWNoIGxlbmd0aCxcbiAgIGNyZWF0aW5nIGZyb20gdGhhdCBhIHRhYmxlIG9mIHN0YXJ0aW5nIGluZGljZXMgZm9yIGVhY2ggbGVuZ3RoIGluIHRoZVxuICAgc29ydGVkIHRhYmxlLCBhbmQgdGhlbiBlbnRlcmluZyB0aGUgc3ltYm9scyBpbiBvcmRlciBpbiB0aGUgc29ydGVkXG4gICB0YWJsZS4gIFRoZSBzb3J0ZWQgdGFibGUgaXMgd29ya1tdLCB3aXRoIHRoYXQgc3BhY2UgYmVpbmcgcHJvdmlkZWQgYnlcbiAgIHRoZSBjYWxsZXIuXG5cbiAgIFRoZSBsZW5ndGggY291bnRzIGFyZSB1c2VkIGZvciBvdGhlciBwdXJwb3NlcyBhcyB3ZWxsLCBpLmUuIGZpbmRpbmdcbiAgIHRoZSBtaW5pbXVtIGFuZCBtYXhpbXVtIGxlbmd0aCBjb2RlcywgZGV0ZXJtaW5pbmcgaWYgdGhlcmUgYXJlIGFueVxuICAgY29kZXMgYXQgYWxsLCBjaGVja2luZyBmb3IgYSB2YWxpZCBzZXQgb2YgbGVuZ3RocywgYW5kIGxvb2tpbmcgYWhlYWRcbiAgIGF0IGxlbmd0aCBjb3VudHMgdG8gZGV0ZXJtaW5lIHN1Yi10YWJsZSBzaXplcyB3aGVuIGJ1aWxkaW5nIHRoZVxuICAgZGVjb2RpbmcgdGFibGVzLlxuICAgKi9cblxuICAvKiBhY2N1bXVsYXRlIGxlbmd0aHMgZm9yIGNvZGVzIChhc3N1bWVzIGxlbnNbXSBhbGwgaW4gMC4uTUFYQklUUykgKi9cbiAgZm9yIChsZW4gPSAwOyBsZW4gPD0gTUFYQklUUzsgbGVuKyspIHtcbiAgICBjb3VudFtsZW5dID0gMDtcbiAgfVxuICBmb3IgKHN5bSA9IDA7IHN5bSA8IGNvZGVzOyBzeW0rKykge1xuICAgIGNvdW50W2xlbnNbbGVuc19pbmRleCArIHN5bV1dKys7XG4gIH1cblxuICAvKiBib3VuZCBjb2RlIGxlbmd0aHMsIGZvcmNlIHJvb3QgdG8gYmUgd2l0aGluIGNvZGUgbGVuZ3RocyAqL1xuICByb290ID0gYml0cztcbiAgZm9yIChtYXggPSBNQVhCSVRTOyBtYXggPj0gMTsgbWF4LS0pIHtcbiAgICBpZiAoY291bnRbbWF4XSAhPT0gMCkgeyBicmVhazsgfVxuICB9XG4gIGlmIChyb290ID4gbWF4KSB7XG4gICAgcm9vdCA9IG1heDtcbiAgfVxuICBpZiAobWF4ID09PSAwKSB7ICAgICAgICAgICAgICAgICAgICAgLyogbm8gc3ltYm9scyB0byBjb2RlIGF0IGFsbCAqL1xuICAgIC8vdGFibGUub3Bbb3B0cy50YWJsZV9pbmRleF0gPSA2NDsgIC8vaGVyZS5vcCA9ICh2YXIgY2hhcik2NDsgICAgLyogaW52YWxpZCBjb2RlIG1hcmtlciAqL1xuICAgIC8vdGFibGUuYml0c1tvcHRzLnRhYmxlX2luZGV4XSA9IDE7ICAgLy9oZXJlLmJpdHMgPSAodmFyIGNoYXIpMTtcbiAgICAvL3RhYmxlLnZhbFtvcHRzLnRhYmxlX2luZGV4KytdID0gMDsgICAvL2hlcmUudmFsID0gKHZhciBzaG9ydCkwO1xuICAgIHRhYmxlW3RhYmxlX2luZGV4KytdID0gKDEgPDwgMjQpIHwgKDY0IDw8IDE2KSB8IDA7XG5cblxuICAgIC8vdGFibGUub3Bbb3B0cy50YWJsZV9pbmRleF0gPSA2NDtcbiAgICAvL3RhYmxlLmJpdHNbb3B0cy50YWJsZV9pbmRleF0gPSAxO1xuICAgIC8vdGFibGUudmFsW29wdHMudGFibGVfaW5kZXgrK10gPSAwO1xuICAgIHRhYmxlW3RhYmxlX2luZGV4KytdID0gKDEgPDwgMjQpIHwgKDY0IDw8IDE2KSB8IDA7XG5cbiAgICBvcHRzLmJpdHMgPSAxO1xuICAgIHJldHVybiAwOyAgICAgLyogbm8gc3ltYm9scywgYnV0IHdhaXQgZm9yIGRlY29kaW5nIHRvIHJlcG9ydCBlcnJvciAqL1xuICB9XG4gIGZvciAobWluID0gMTsgbWluIDwgbWF4OyBtaW4rKykge1xuICAgIGlmIChjb3VudFttaW5dICE9PSAwKSB7IGJyZWFrOyB9XG4gIH1cbiAgaWYgKHJvb3QgPCBtaW4pIHtcbiAgICByb290ID0gbWluO1xuICB9XG5cbiAgLyogY2hlY2sgZm9yIGFuIG92ZXItc3Vic2NyaWJlZCBvciBpbmNvbXBsZXRlIHNldCBvZiBsZW5ndGhzICovXG4gIGxlZnQgPSAxO1xuICBmb3IgKGxlbiA9IDE7IGxlbiA8PSBNQVhCSVRTOyBsZW4rKykge1xuICAgIGxlZnQgPDw9IDE7XG4gICAgbGVmdCAtPSBjb3VudFtsZW5dO1xuICAgIGlmIChsZWZ0IDwgMCkge1xuICAgICAgcmV0dXJuIC0xO1xuICAgIH0gICAgICAgIC8qIG92ZXItc3Vic2NyaWJlZCAqL1xuICB9XG4gIGlmIChsZWZ0ID4gMCAmJiAodHlwZSA9PT0gQ09ERVMgfHwgbWF4ICE9PSAxKSkge1xuICAgIHJldHVybiAtMTsgICAgICAgICAgICAgICAgICAgICAgLyogaW5jb21wbGV0ZSBzZXQgKi9cbiAgfVxuXG4gIC8qIGdlbmVyYXRlIG9mZnNldHMgaW50byBzeW1ib2wgdGFibGUgZm9yIGVhY2ggbGVuZ3RoIGZvciBzb3J0aW5nICovXG4gIG9mZnNbMV0gPSAwO1xuICBmb3IgKGxlbiA9IDE7IGxlbiA8IE1BWEJJVFM7IGxlbisrKSB7XG4gICAgb2Zmc1tsZW4gKyAxXSA9IG9mZnNbbGVuXSArIGNvdW50W2xlbl07XG4gIH1cblxuICAvKiBzb3J0IHN5bWJvbHMgYnkgbGVuZ3RoLCBieSBzeW1ib2wgb3JkZXIgd2l0aGluIGVhY2ggbGVuZ3RoICovXG4gIGZvciAoc3ltID0gMDsgc3ltIDwgY29kZXM7IHN5bSsrKSB7XG4gICAgaWYgKGxlbnNbbGVuc19pbmRleCArIHN5bV0gIT09IDApIHtcbiAgICAgIHdvcmtbb2Zmc1tsZW5zW2xlbnNfaW5kZXggKyBzeW1dXSsrXSA9IHN5bTtcbiAgICB9XG4gIH1cblxuICAvKlxuICAgQ3JlYXRlIGFuZCBmaWxsIGluIGRlY29kaW5nIHRhYmxlcy4gIEluIHRoaXMgbG9vcCwgdGhlIHRhYmxlIGJlaW5nXG4gICBmaWxsZWQgaXMgYXQgbmV4dCBhbmQgaGFzIGN1cnIgaW5kZXggYml0cy4gIFRoZSBjb2RlIGJlaW5nIHVzZWQgaXMgaHVmZlxuICAgd2l0aCBsZW5ndGggbGVuLiAgVGhhdCBjb2RlIGlzIGNvbnZlcnRlZCB0byBhbiBpbmRleCBieSBkcm9wcGluZyBkcm9wXG4gICBiaXRzIG9mZiBvZiB0aGUgYm90dG9tLiAgRm9yIGNvZGVzIHdoZXJlIGxlbiBpcyBsZXNzIHRoYW4gZHJvcCArIGN1cnIsXG4gICB0aG9zZSB0b3AgZHJvcCArIGN1cnIgLSBsZW4gYml0cyBhcmUgaW5jcmVtZW50ZWQgdGhyb3VnaCBhbGwgdmFsdWVzIHRvXG4gICBmaWxsIHRoZSB0YWJsZSB3aXRoIHJlcGxpY2F0ZWQgZW50cmllcy5cblxuICAgcm9vdCBpcyB0aGUgbnVtYmVyIG9mIGluZGV4IGJpdHMgZm9yIHRoZSByb290IHRhYmxlLiAgV2hlbiBsZW4gZXhjZWVkc1xuICAgcm9vdCwgc3ViLXRhYmxlcyBhcmUgY3JlYXRlZCBwb2ludGVkIHRvIGJ5IHRoZSByb290IGVudHJ5IHdpdGggYW4gaW5kZXhcbiAgIG9mIHRoZSBsb3cgcm9vdCBiaXRzIG9mIGh1ZmYuICBUaGlzIGlzIHNhdmVkIGluIGxvdyB0byBjaGVjayBmb3Igd2hlbiBhXG4gICBuZXcgc3ViLXRhYmxlIHNob3VsZCBiZSBzdGFydGVkLiAgZHJvcCBpcyB6ZXJvIHdoZW4gdGhlIHJvb3QgdGFibGUgaXNcbiAgIGJlaW5nIGZpbGxlZCwgYW5kIGRyb3AgaXMgcm9vdCB3aGVuIHN1Yi10YWJsZXMgYXJlIGJlaW5nIGZpbGxlZC5cblxuICAgV2hlbiBhIG5ldyBzdWItdGFibGUgaXMgbmVlZGVkLCBpdCBpcyBuZWNlc3NhcnkgdG8gbG9vayBhaGVhZCBpbiB0aGVcbiAgIGNvZGUgbGVuZ3RocyB0byBkZXRlcm1pbmUgd2hhdCBzaXplIHN1Yi10YWJsZSBpcyBuZWVkZWQuICBUaGUgbGVuZ3RoXG4gICBjb3VudHMgYXJlIHVzZWQgZm9yIHRoaXMsIGFuZCBzbyBjb3VudFtdIGlzIGRlY3JlbWVudGVkIGFzIGNvZGVzIGFyZVxuICAgZW50ZXJlZCBpbiB0aGUgdGFibGVzLlxuXG4gICB1c2VkIGtlZXBzIHRyYWNrIG9mIGhvdyBtYW55IHRhYmxlIGVudHJpZXMgaGF2ZSBiZWVuIGFsbG9jYXRlZCBmcm9tIHRoZVxuICAgcHJvdmlkZWQgKnRhYmxlIHNwYWNlLiAgSXQgaXMgY2hlY2tlZCBmb3IgTEVOUyBhbmQgRElTVCB0YWJsZXMgYWdhaW5zdFxuICAgdGhlIGNvbnN0YW50cyBFTk9VR0hfTEVOUyBhbmQgRU5PVUdIX0RJU1RTIHRvIGd1YXJkIGFnYWluc3QgY2hhbmdlcyBpblxuICAgdGhlIGluaXRpYWwgcm9vdCB0YWJsZSBzaXplIGNvbnN0YW50cy4gIFNlZSB0aGUgY29tbWVudHMgaW4gaW5mdHJlZXMuaFxuICAgZm9yIG1vcmUgaW5mb3JtYXRpb24uXG5cbiAgIHN5bSBpbmNyZW1lbnRzIHRocm91Z2ggYWxsIHN5bWJvbHMsIGFuZCB0aGUgbG9vcCB0ZXJtaW5hdGVzIHdoZW5cbiAgIGFsbCBjb2RlcyBvZiBsZW5ndGggbWF4LCBpLmUuIGFsbCBjb2RlcywgaGF2ZSBiZWVuIHByb2Nlc3NlZC4gIFRoaXNcbiAgIHJvdXRpbmUgcGVybWl0cyBpbmNvbXBsZXRlIGNvZGVzLCBzbyBhbm90aGVyIGxvb3AgYWZ0ZXIgdGhpcyBvbmUgZmlsbHNcbiAgIGluIHRoZSByZXN0IG9mIHRoZSBkZWNvZGluZyB0YWJsZXMgd2l0aCBpbnZhbGlkIGNvZGUgbWFya2Vycy5cbiAgICovXG5cbiAgLyogc2V0IHVwIGZvciBjb2RlIHR5cGUgKi9cbiAgLy8gcG9vciBtYW4gb3B0aW1pemF0aW9uIC0gdXNlIGlmLWVsc2UgaW5zdGVhZCBvZiBzd2l0Y2gsXG4gIC8vIHRvIGF2b2lkIGRlb3B0cyBpbiBvbGQgdjhcbiAgaWYgKHR5cGUgPT09IENPREVTKSB7XG4gICAgYmFzZSA9IGV4dHJhID0gd29yazsgICAgLyogZHVtbXkgdmFsdWUtLW5vdCB1c2VkICovXG4gICAgZW5kID0gMTk7XG5cbiAgfSBlbHNlIGlmICh0eXBlID09PSBMRU5TKSB7XG4gICAgYmFzZSA9IGxiYXNlO1xuICAgIGJhc2VfaW5kZXggLT0gMjU3O1xuICAgIGV4dHJhID0gbGV4dDtcbiAgICBleHRyYV9pbmRleCAtPSAyNTc7XG4gICAgZW5kID0gMjU2O1xuXG4gIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAvKiBESVNUUyAqL1xuICAgIGJhc2UgPSBkYmFzZTtcbiAgICBleHRyYSA9IGRleHQ7XG4gICAgZW5kID0gLTE7XG4gIH1cblxuICAvKiBpbml0aWFsaXplIG9wdHMgZm9yIGxvb3AgKi9cbiAgaHVmZiA9IDA7ICAgICAgICAgICAgICAgICAgIC8qIHN0YXJ0aW5nIGNvZGUgKi9cbiAgc3ltID0gMDsgICAgICAgICAgICAgICAgICAgIC8qIHN0YXJ0aW5nIGNvZGUgc3ltYm9sICovXG4gIGxlbiA9IG1pbjsgICAgICAgICAgICAgICAgICAvKiBzdGFydGluZyBjb2RlIGxlbmd0aCAqL1xuICBuZXh0ID0gdGFibGVfaW5kZXg7ICAgICAgICAgICAgICAvKiBjdXJyZW50IHRhYmxlIHRvIGZpbGwgaW4gKi9cbiAgY3VyciA9IHJvb3Q7ICAgICAgICAgICAgICAgIC8qIGN1cnJlbnQgdGFibGUgaW5kZXggYml0cyAqL1xuICBkcm9wID0gMDsgICAgICAgICAgICAgICAgICAgLyogY3VycmVudCBiaXRzIHRvIGRyb3AgZnJvbSBjb2RlIGZvciBpbmRleCAqL1xuICBsb3cgPSAtMTsgICAgICAgICAgICAgICAgICAgLyogdHJpZ2dlciBuZXcgc3ViLXRhYmxlIHdoZW4gbGVuID4gcm9vdCAqL1xuICB1c2VkID0gMSA8PCByb290OyAgICAgICAgICAvKiB1c2Ugcm9vdCB0YWJsZSBlbnRyaWVzICovXG4gIG1hc2sgPSB1c2VkIC0gMTsgICAgICAgICAgICAvKiBtYXNrIGZvciBjb21wYXJpbmcgbG93ICovXG5cbiAgLyogY2hlY2sgYXZhaWxhYmxlIHRhYmxlIHNwYWNlICovXG4gIGlmICgodHlwZSA9PT0gTEVOUyAmJiB1c2VkID4gRU5PVUdIX0xFTlMpIHx8XG4gICAgKHR5cGUgPT09IERJU1RTICYmIHVzZWQgPiBFTk9VR0hfRElTVFMpKSB7XG4gICAgcmV0dXJuIDE7XG4gIH1cblxuICB2YXIgaSA9IDA7XG4gIC8qIHByb2Nlc3MgYWxsIGNvZGVzIGFuZCBtYWtlIHRhYmxlIGVudHJpZXMgKi9cbiAgZm9yICg7Oykge1xuICAgIGkrKztcbiAgICAvKiBjcmVhdGUgdGFibGUgZW50cnkgKi9cbiAgICBoZXJlX2JpdHMgPSBsZW4gLSBkcm9wO1xuICAgIGlmICh3b3JrW3N5bV0gPCBlbmQpIHtcbiAgICAgIGhlcmVfb3AgPSAwO1xuICAgICAgaGVyZV92YWwgPSB3b3JrW3N5bV07XG4gICAgfVxuICAgIGVsc2UgaWYgKHdvcmtbc3ltXSA+IGVuZCkge1xuICAgICAgaGVyZV9vcCA9IGV4dHJhW2V4dHJhX2luZGV4ICsgd29ya1tzeW1dXTtcbiAgICAgIGhlcmVfdmFsID0gYmFzZVtiYXNlX2luZGV4ICsgd29ya1tzeW1dXTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICBoZXJlX29wID0gMzIgKyA2NDsgICAgICAgICAvKiBlbmQgb2YgYmxvY2sgKi9cbiAgICAgIGhlcmVfdmFsID0gMDtcbiAgICB9XG5cbiAgICAvKiByZXBsaWNhdGUgZm9yIHRob3NlIGluZGljZXMgd2l0aCBsb3cgbGVuIGJpdHMgZXF1YWwgdG8gaHVmZiAqL1xuICAgIGluY3IgPSAxIDw8IChsZW4gLSBkcm9wKTtcbiAgICBmaWxsID0gMSA8PCBjdXJyO1xuICAgIG1pbiA9IGZpbGw7ICAgICAgICAgICAgICAgICAvKiBzYXZlIG9mZnNldCB0byBuZXh0IHRhYmxlICovXG4gICAgZG8ge1xuICAgICAgZmlsbCAtPSBpbmNyO1xuICAgICAgdGFibGVbbmV4dCArIChodWZmID4+IGRyb3ApICsgZmlsbF0gPSAoaGVyZV9iaXRzIDw8IDI0KSB8IChoZXJlX29wIDw8IDE2KSB8IGhlcmVfdmFsIHwwO1xuICAgIH0gd2hpbGUgKGZpbGwgIT09IDApO1xuXG4gICAgLyogYmFja3dhcmRzIGluY3JlbWVudCB0aGUgbGVuLWJpdCBjb2RlIGh1ZmYgKi9cbiAgICBpbmNyID0gMSA8PCAobGVuIC0gMSk7XG4gICAgd2hpbGUgKGh1ZmYgJiBpbmNyKSB7XG4gICAgICBpbmNyID4+PSAxO1xuICAgIH1cbiAgICBpZiAoaW5jciAhPT0gMCkge1xuICAgICAgaHVmZiAmPSBpbmNyIC0gMTtcbiAgICAgIGh1ZmYgKz0gaW5jcjtcbiAgICB9IGVsc2Uge1xuICAgICAgaHVmZiA9IDA7XG4gICAgfVxuXG4gICAgLyogZ28gdG8gbmV4dCBzeW1ib2wsIHVwZGF0ZSBjb3VudCwgbGVuICovXG4gICAgc3ltKys7XG4gICAgaWYgKC0tY291bnRbbGVuXSA9PT0gMCkge1xuICAgICAgaWYgKGxlbiA9PT0gbWF4KSB7IGJyZWFrOyB9XG4gICAgICBsZW4gPSBsZW5zW2xlbnNfaW5kZXggKyB3b3JrW3N5bV1dO1xuICAgIH1cblxuICAgIC8qIGNyZWF0ZSBuZXcgc3ViLXRhYmxlIGlmIG5lZWRlZCAqL1xuICAgIGlmIChsZW4gPiByb290ICYmIChodWZmICYgbWFzaykgIT09IGxvdykge1xuICAgICAgLyogaWYgZmlyc3QgdGltZSwgdHJhbnNpdGlvbiB0byBzdWItdGFibGVzICovXG4gICAgICBpZiAoZHJvcCA9PT0gMCkge1xuICAgICAgICBkcm9wID0gcm9vdDtcbiAgICAgIH1cblxuICAgICAgLyogaW5jcmVtZW50IHBhc3QgbGFzdCB0YWJsZSAqL1xuICAgICAgbmV4dCArPSBtaW47ICAgICAgICAgICAgLyogaGVyZSBtaW4gaXMgMSA8PCBjdXJyICovXG5cbiAgICAgIC8qIGRldGVybWluZSBsZW5ndGggb2YgbmV4dCB0YWJsZSAqL1xuICAgICAgY3VyciA9IGxlbiAtIGRyb3A7XG4gICAgICBsZWZ0ID0gMSA8PCBjdXJyO1xuICAgICAgd2hpbGUgKGN1cnIgKyBkcm9wIDwgbWF4KSB7XG4gICAgICAgIGxlZnQgLT0gY291bnRbY3VyciArIGRyb3BdO1xuICAgICAgICBpZiAobGVmdCA8PSAwKSB7IGJyZWFrOyB9XG4gICAgICAgIGN1cnIrKztcbiAgICAgICAgbGVmdCA8PD0gMTtcbiAgICAgIH1cblxuICAgICAgLyogY2hlY2sgZm9yIGVub3VnaCBzcGFjZSAqL1xuICAgICAgdXNlZCArPSAxIDw8IGN1cnI7XG4gICAgICBpZiAoKHR5cGUgPT09IExFTlMgJiYgdXNlZCA+IEVOT1VHSF9MRU5TKSB8fFxuICAgICAgICAodHlwZSA9PT0gRElTVFMgJiYgdXNlZCA+IEVOT1VHSF9ESVNUUykpIHtcbiAgICAgICAgcmV0dXJuIDE7XG4gICAgICB9XG5cbiAgICAgIC8qIHBvaW50IGVudHJ5IGluIHJvb3QgdGFibGUgdG8gc3ViLXRhYmxlICovXG4gICAgICBsb3cgPSBodWZmICYgbWFzaztcbiAgICAgIC8qdGFibGUub3BbbG93XSA9IGN1cnI7XG4gICAgICB0YWJsZS5iaXRzW2xvd10gPSByb290O1xuICAgICAgdGFibGUudmFsW2xvd10gPSBuZXh0IC0gb3B0cy50YWJsZV9pbmRleDsqL1xuICAgICAgdGFibGVbbG93XSA9IChyb290IDw8IDI0KSB8IChjdXJyIDw8IDE2KSB8IChuZXh0IC0gdGFibGVfaW5kZXgpIHwwO1xuICAgIH1cbiAgfVxuXG4gIC8qIGZpbGwgaW4gcmVtYWluaW5nIHRhYmxlIGVudHJ5IGlmIGNvZGUgaXMgaW5jb21wbGV0ZSAoZ3VhcmFudGVlZCB0byBoYXZlXG4gICBhdCBtb3N0IG9uZSByZW1haW5pbmcgZW50cnksIHNpbmNlIGlmIHRoZSBjb2RlIGlzIGluY29tcGxldGUsIHRoZVxuICAgbWF4aW11bSBjb2RlIGxlbmd0aCB0aGF0IHdhcyBhbGxvd2VkIHRvIGdldCB0aGlzIGZhciBpcyBvbmUgYml0KSAqL1xuICBpZiAoaHVmZiAhPT0gMCkge1xuICAgIC8vdGFibGUub3BbbmV4dCArIGh1ZmZdID0gNjQ7ICAgICAgICAgICAgLyogaW52YWxpZCBjb2RlIG1hcmtlciAqL1xuICAgIC8vdGFibGUuYml0c1tuZXh0ICsgaHVmZl0gPSBsZW4gLSBkcm9wO1xuICAgIC8vdGFibGUudmFsW25leHQgKyBodWZmXSA9IDA7XG4gICAgdGFibGVbbmV4dCArIGh1ZmZdID0gKChsZW4gLSBkcm9wKSA8PCAyNCkgfCAoNjQgPDwgMTYpIHwwO1xuICB9XG5cbiAgLyogc2V0IHJldHVybiBwYXJhbWV0ZXJzICovXG4gIC8vb3B0cy50YWJsZV9pbmRleCArPSB1c2VkO1xuICBvcHRzLmJpdHMgPSByb290O1xuICByZXR1cm4gMDtcbn07XG4iLCIndXNlIHN0cmljdCc7XG5cbm1vZHVsZS5leHBvcnRzID0ge1xuICAyOiAgICAgICduZWVkIGRpY3Rpb25hcnknLCAgICAgLyogWl9ORUVEX0RJQ1QgICAgICAgMiAgKi9cbiAgMTogICAgICAnc3RyZWFtIGVuZCcsICAgICAgICAgIC8qIFpfU1RSRUFNX0VORCAgICAgIDEgICovXG4gIDA6ICAgICAgJycsICAgICAgICAgICAgICAgICAgICAvKiBaX09LICAgICAgICAgICAgICAwICAqL1xuICAnLTEnOiAgICdmaWxlIGVycm9yJywgICAgICAgICAgLyogWl9FUlJOTyAgICAgICAgICgtMSkgKi9cbiAgJy0yJzogICAnc3RyZWFtIGVycm9yJywgICAgICAgIC8qIFpfU1RSRUFNX0VSUk9SICAoLTIpICovXG4gICctMyc6ICAgJ2RhdGEgZXJyb3InLCAgICAgICAgICAvKiBaX0RBVEFfRVJST1IgICAgKC0zKSAqL1xuICAnLTQnOiAgICdpbnN1ZmZpY2llbnQgbWVtb3J5JywgLyogWl9NRU1fRVJST1IgICAgICgtNCkgKi9cbiAgJy01JzogICAnYnVmZmVyIGVycm9yJywgICAgICAgIC8qIFpfQlVGX0VSUk9SICAgICAoLTUpICovXG4gICctNic6ICAgJ2luY29tcGF0aWJsZSB2ZXJzaW9uJyAvKiBaX1ZFUlNJT05fRVJST1IgKC02KSAqL1xufTtcbiIsIid1c2Ugc3RyaWN0JztcblxuXG52YXIgdXRpbHMgPSByZXF1aXJlKCcuLi91dGlscy9jb21tb24nKTtcblxuLyogUHVibGljIGNvbnN0YW50cyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ki9cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovXG5cblxuLy92YXIgWl9GSUxURVJFRCAgICAgICAgICA9IDE7XG4vL3ZhciBaX0hVRkZNQU5fT05MWSAgICAgID0gMjtcbi8vdmFyIFpfUkxFICAgICAgICAgICAgICAgPSAzO1xudmFyIFpfRklYRUQgICAgICAgICAgICAgICA9IDQ7XG4vL3ZhciBaX0RFRkFVTFRfU1RSQVRFR1kgID0gMDtcblxuLyogUG9zc2libGUgdmFsdWVzIG9mIHRoZSBkYXRhX3R5cGUgZmllbGQgKHRob3VnaCBzZWUgaW5mbGF0ZSgpKSAqL1xudmFyIFpfQklOQVJZICAgICAgICAgICAgICA9IDA7XG52YXIgWl9URVhUICAgICAgICAgICAgICAgID0gMTtcbi8vdmFyIFpfQVNDSUkgICAgICAgICAgICAgPSAxOyAvLyA9IFpfVEVYVFxudmFyIFpfVU5LTk9XTiAgICAgICAgICAgICA9IDI7XG5cbi8qPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSovXG5cblxuZnVuY3Rpb24gemVybyhidWYpIHsgdmFyIGxlbiA9IGJ1Zi5sZW5ndGg7IHdoaWxlICgtLWxlbiA+PSAwKSB7IGJ1ZltsZW5dID0gMDsgfSB9XG5cbi8vIEZyb20genV0aWwuaFxuXG52YXIgU1RPUkVEX0JMT0NLID0gMDtcbnZhciBTVEFUSUNfVFJFRVMgPSAxO1xudmFyIERZTl9UUkVFUyAgICA9IDI7XG4vKiBUaGUgdGhyZWUga2luZHMgb2YgYmxvY2sgdHlwZSAqL1xuXG52YXIgTUlOX01BVENIICAgID0gMztcbnZhciBNQVhfTUFUQ0ggICAgPSAyNTg7XG4vKiBUaGUgbWluaW11bSBhbmQgbWF4aW11bSBtYXRjaCBsZW5ndGhzICovXG5cbi8vIEZyb20gZGVmbGF0ZS5oXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIEludGVybmFsIGNvbXByZXNzaW9uIHN0YXRlLlxuICovXG5cbnZhciBMRU5HVEhfQ09ERVMgID0gMjk7XG4vKiBudW1iZXIgb2YgbGVuZ3RoIGNvZGVzLCBub3QgY291bnRpbmcgdGhlIHNwZWNpYWwgRU5EX0JMT0NLIGNvZGUgKi9cblxudmFyIExJVEVSQUxTICAgICAgPSAyNTY7XG4vKiBudW1iZXIgb2YgbGl0ZXJhbCBieXRlcyAwLi4yNTUgKi9cblxudmFyIExfQ09ERVMgICAgICAgPSBMSVRFUkFMUyArIDEgKyBMRU5HVEhfQ09ERVM7XG4vKiBudW1iZXIgb2YgTGl0ZXJhbCBvciBMZW5ndGggY29kZXMsIGluY2x1ZGluZyB0aGUgRU5EX0JMT0NLIGNvZGUgKi9cblxudmFyIERfQ09ERVMgICAgICAgPSAzMDtcbi8qIG51bWJlciBvZiBkaXN0YW5jZSBjb2RlcyAqL1xuXG52YXIgQkxfQ09ERVMgICAgICA9IDE5O1xuLyogbnVtYmVyIG9mIGNvZGVzIHVzZWQgdG8gdHJhbnNmZXIgdGhlIGJpdCBsZW5ndGhzICovXG5cbnZhciBIRUFQX1NJWkUgICAgID0gMiAqIExfQ09ERVMgKyAxO1xuLyogbWF4aW11bSBoZWFwIHNpemUgKi9cblxudmFyIE1BWF9CSVRTICAgICAgPSAxNTtcbi8qIEFsbCBjb2RlcyBtdXN0IG5vdCBleGNlZWQgTUFYX0JJVFMgYml0cyAqL1xuXG52YXIgQnVmX3NpemUgICAgICA9IDE2O1xuLyogc2l6ZSBvZiBiaXQgYnVmZmVyIGluIGJpX2J1ZiAqL1xuXG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogQ29uc3RhbnRzXG4gKi9cblxudmFyIE1BWF9CTF9CSVRTID0gNztcbi8qIEJpdCBsZW5ndGggY29kZXMgbXVzdCBub3QgZXhjZWVkIE1BWF9CTF9CSVRTIGJpdHMgKi9cblxudmFyIEVORF9CTE9DSyAgID0gMjU2O1xuLyogZW5kIG9mIGJsb2NrIGxpdGVyYWwgY29kZSAqL1xuXG52YXIgUkVQXzNfNiAgICAgPSAxNjtcbi8qIHJlcGVhdCBwcmV2aW91cyBiaXQgbGVuZ3RoIDMtNiB0aW1lcyAoMiBiaXRzIG9mIHJlcGVhdCBjb3VudCkgKi9cblxudmFyIFJFUFpfM18xMCAgID0gMTc7XG4vKiByZXBlYXQgYSB6ZXJvIGxlbmd0aCAzLTEwIHRpbWVzICAoMyBiaXRzIG9mIHJlcGVhdCBjb3VudCkgKi9cblxudmFyIFJFUFpfMTFfMTM4ID0gMTg7XG4vKiByZXBlYXQgYSB6ZXJvIGxlbmd0aCAxMS0xMzggdGltZXMgICg3IGJpdHMgb2YgcmVwZWF0IGNvdW50KSAqL1xuXG4vKiBlc2xpbnQtZGlzYWJsZSBjb21tYS1zcGFjaW5nLGFycmF5LWJyYWNrZXQtc3BhY2luZyAqL1xudmFyIGV4dHJhX2xiaXRzID0gICAvKiBleHRyYSBiaXRzIGZvciBlYWNoIGxlbmd0aCBjb2RlICovXG4gIFswLDAsMCwwLDAsMCwwLDAsMSwxLDEsMSwyLDIsMiwyLDMsMywzLDMsNCw0LDQsNCw1LDUsNSw1LDBdO1xuXG52YXIgZXh0cmFfZGJpdHMgPSAgIC8qIGV4dHJhIGJpdHMgZm9yIGVhY2ggZGlzdGFuY2UgY29kZSAqL1xuICBbMCwwLDAsMCwxLDEsMiwyLDMsMyw0LDQsNSw1LDYsNiw3LDcsOCw4LDksOSwxMCwxMCwxMSwxMSwxMiwxMiwxMywxM107XG5cbnZhciBleHRyYV9ibGJpdHMgPSAgLyogZXh0cmEgYml0cyBmb3IgZWFjaCBiaXQgbGVuZ3RoIGNvZGUgKi9cbiAgWzAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMiwzLDddO1xuXG52YXIgYmxfb3JkZXIgPVxuICBbMTYsMTcsMTgsMCw4LDcsOSw2LDEwLDUsMTEsNCwxMiwzLDEzLDIsMTQsMSwxNV07XG4vKiBlc2xpbnQtZW5hYmxlIGNvbW1hLXNwYWNpbmcsYXJyYXktYnJhY2tldC1zcGFjaW5nICovXG5cbi8qIFRoZSBsZW5ndGhzIG9mIHRoZSBiaXQgbGVuZ3RoIGNvZGVzIGFyZSBzZW50IGluIG9yZGVyIG9mIGRlY3JlYXNpbmdcbiAqIHByb2JhYmlsaXR5LCB0byBhdm9pZCB0cmFuc21pdHRpbmcgdGhlIGxlbmd0aHMgZm9yIHVudXNlZCBiaXQgbGVuZ3RoIGNvZGVzLlxuICovXG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogTG9jYWwgZGF0YS4gVGhlc2UgYXJlIGluaXRpYWxpemVkIG9ubHkgb25jZS5cbiAqL1xuXG4vLyBXZSBwcmUtZmlsbCBhcnJheXMgd2l0aCAwIHRvIGF2b2lkIHVuaW5pdGlhbGl6ZWQgZ2Fwc1xuXG52YXIgRElTVF9DT0RFX0xFTiA9IDUxMjsgLyogc2VlIGRlZmluaXRpb24gb2YgYXJyYXkgZGlzdF9jb2RlIGJlbG93ICovXG5cbi8vICEhISEgVXNlIGZsYXQgYXJyYXkgaW5zZGVhZCBvZiBzdHJ1Y3R1cmUsIEZyZXEgPSBpKjIsIExlbiA9IGkqMisxXG52YXIgc3RhdGljX2x0cmVlICA9IG5ldyBBcnJheSgoTF9DT0RFUyArIDIpICogMik7XG56ZXJvKHN0YXRpY19sdHJlZSk7XG4vKiBUaGUgc3RhdGljIGxpdGVyYWwgdHJlZS4gU2luY2UgdGhlIGJpdCBsZW5ndGhzIGFyZSBpbXBvc2VkLCB0aGVyZSBpcyBub1xuICogbmVlZCBmb3IgdGhlIExfQ09ERVMgZXh0cmEgY29kZXMgdXNlZCBkdXJpbmcgaGVhcCBjb25zdHJ1Y3Rpb24uIEhvd2V2ZXJcbiAqIFRoZSBjb2RlcyAyODYgYW5kIDI4NyBhcmUgbmVlZGVkIHRvIGJ1aWxkIGEgY2Fub25pY2FsIHRyZWUgKHNlZSBfdHJfaW5pdFxuICogYmVsb3cpLlxuICovXG5cbnZhciBzdGF0aWNfZHRyZWUgID0gbmV3IEFycmF5KERfQ09ERVMgKiAyKTtcbnplcm8oc3RhdGljX2R0cmVlKTtcbi8qIFRoZSBzdGF0aWMgZGlzdGFuY2UgdHJlZS4gKEFjdHVhbGx5IGEgdHJpdmlhbCB0cmVlIHNpbmNlIGFsbCBjb2RlcyB1c2VcbiAqIDUgYml0cy4pXG4gKi9cblxudmFyIF9kaXN0X2NvZGUgICAgPSBuZXcgQXJyYXkoRElTVF9DT0RFX0xFTik7XG56ZXJvKF9kaXN0X2NvZGUpO1xuLyogRGlzdGFuY2UgY29kZXMuIFRoZSBmaXJzdCAyNTYgdmFsdWVzIGNvcnJlc3BvbmQgdG8gdGhlIGRpc3RhbmNlc1xuICogMyAuLiAyNTgsIHRoZSBsYXN0IDI1NiB2YWx1ZXMgY29ycmVzcG9uZCB0byB0aGUgdG9wIDggYml0cyBvZlxuICogdGhlIDE1IGJpdCBkaXN0YW5jZXMuXG4gKi9cblxudmFyIF9sZW5ndGhfY29kZSAgPSBuZXcgQXJyYXkoTUFYX01BVENIIC0gTUlOX01BVENIICsgMSk7XG56ZXJvKF9sZW5ndGhfY29kZSk7XG4vKiBsZW5ndGggY29kZSBmb3IgZWFjaCBub3JtYWxpemVkIG1hdGNoIGxlbmd0aCAoMCA9PSBNSU5fTUFUQ0gpICovXG5cbnZhciBiYXNlX2xlbmd0aCAgID0gbmV3IEFycmF5KExFTkdUSF9DT0RFUyk7XG56ZXJvKGJhc2VfbGVuZ3RoKTtcbi8qIEZpcnN0IG5vcm1hbGl6ZWQgbGVuZ3RoIGZvciBlYWNoIGNvZGUgKDAgPSBNSU5fTUFUQ0gpICovXG5cbnZhciBiYXNlX2Rpc3QgICAgID0gbmV3IEFycmF5KERfQ09ERVMpO1xuemVybyhiYXNlX2Rpc3QpO1xuLyogRmlyc3Qgbm9ybWFsaXplZCBkaXN0YW5jZSBmb3IgZWFjaCBjb2RlICgwID0gZGlzdGFuY2Ugb2YgMSkgKi9cblxuXG5mdW5jdGlvbiBTdGF0aWNUcmVlRGVzYyhzdGF0aWNfdHJlZSwgZXh0cmFfYml0cywgZXh0cmFfYmFzZSwgZWxlbXMsIG1heF9sZW5ndGgpIHtcblxuICB0aGlzLnN0YXRpY190cmVlICA9IHN0YXRpY190cmVlOyAgLyogc3RhdGljIHRyZWUgb3IgTlVMTCAqL1xuICB0aGlzLmV4dHJhX2JpdHMgICA9IGV4dHJhX2JpdHM7ICAgLyogZXh0cmEgYml0cyBmb3IgZWFjaCBjb2RlIG9yIE5VTEwgKi9cbiAgdGhpcy5leHRyYV9iYXNlICAgPSBleHRyYV9iYXNlOyAgIC8qIGJhc2UgaW5kZXggZm9yIGV4dHJhX2JpdHMgKi9cbiAgdGhpcy5lbGVtcyAgICAgICAgPSBlbGVtczsgICAgICAgIC8qIG1heCBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIHRyZWUgKi9cbiAgdGhpcy5tYXhfbGVuZ3RoICAgPSBtYXhfbGVuZ3RoOyAgIC8qIG1heCBiaXQgbGVuZ3RoIGZvciB0aGUgY29kZXMgKi9cblxuICAvLyBzaG93IGlmIGBzdGF0aWNfdHJlZWAgaGFzIGRhdGEgb3IgZHVtbXkgLSBuZWVkZWQgZm9yIG1vbm9tb3JwaGljIG9iamVjdHNcbiAgdGhpcy5oYXNfc3RyZWUgICAgPSBzdGF0aWNfdHJlZSAmJiBzdGF0aWNfdHJlZS5sZW5ndGg7XG59XG5cblxudmFyIHN0YXRpY19sX2Rlc2M7XG52YXIgc3RhdGljX2RfZGVzYztcbnZhciBzdGF0aWNfYmxfZGVzYztcblxuXG5mdW5jdGlvbiBUcmVlRGVzYyhkeW5fdHJlZSwgc3RhdF9kZXNjKSB7XG4gIHRoaXMuZHluX3RyZWUgPSBkeW5fdHJlZTsgICAgIC8qIHRoZSBkeW5hbWljIHRyZWUgKi9cbiAgdGhpcy5tYXhfY29kZSA9IDA7ICAgICAgICAgICAgLyogbGFyZ2VzdCBjb2RlIHdpdGggbm9uIHplcm8gZnJlcXVlbmN5ICovXG4gIHRoaXMuc3RhdF9kZXNjID0gc3RhdF9kZXNjOyAgIC8qIHRoZSBjb3JyZXNwb25kaW5nIHN0YXRpYyB0cmVlICovXG59XG5cblxuXG5mdW5jdGlvbiBkX2NvZGUoZGlzdCkge1xuICByZXR1cm4gZGlzdCA8IDI1NiA/IF9kaXN0X2NvZGVbZGlzdF0gOiBfZGlzdF9jb2RlWzI1NiArIChkaXN0ID4+PiA3KV07XG59XG5cblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBPdXRwdXQgYSBzaG9ydCBMU0IgZmlyc3Qgb24gdGhlIHN0cmVhbS5cbiAqIElOIGFzc2VydGlvbjogdGhlcmUgaXMgZW5vdWdoIHJvb20gaW4gcGVuZGluZ0J1Zi5cbiAqL1xuZnVuY3Rpb24gcHV0X3Nob3J0KHMsIHcpIHtcbi8vICAgIHB1dF9ieXRlKHMsICh1Y2gpKCh3KSAmIDB4ZmYpKTtcbi8vICAgIHB1dF9ieXRlKHMsICh1Y2gpKCh1c2gpKHcpID4+IDgpKTtcbiAgcy5wZW5kaW5nX2J1ZltzLnBlbmRpbmcrK10gPSAodykgJiAweGZmO1xuICBzLnBlbmRpbmdfYnVmW3MucGVuZGluZysrXSA9ICh3ID4+PiA4KSAmIDB4ZmY7XG59XG5cblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBTZW5kIGEgdmFsdWUgb24gYSBnaXZlbiBudW1iZXIgb2YgYml0cy5cbiAqIElOIGFzc2VydGlvbjogbGVuZ3RoIDw9IDE2IGFuZCB2YWx1ZSBmaXRzIGluIGxlbmd0aCBiaXRzLlxuICovXG5mdW5jdGlvbiBzZW5kX2JpdHMocywgdmFsdWUsIGxlbmd0aCkge1xuICBpZiAocy5iaV92YWxpZCA+IChCdWZfc2l6ZSAtIGxlbmd0aCkpIHtcbiAgICBzLmJpX2J1ZiB8PSAodmFsdWUgPDwgcy5iaV92YWxpZCkgJiAweGZmZmY7XG4gICAgcHV0X3Nob3J0KHMsIHMuYmlfYnVmKTtcbiAgICBzLmJpX2J1ZiA9IHZhbHVlID4+IChCdWZfc2l6ZSAtIHMuYmlfdmFsaWQpO1xuICAgIHMuYmlfdmFsaWQgKz0gbGVuZ3RoIC0gQnVmX3NpemU7XG4gIH0gZWxzZSB7XG4gICAgcy5iaV9idWYgfD0gKHZhbHVlIDw8IHMuYmlfdmFsaWQpICYgMHhmZmZmO1xuICAgIHMuYmlfdmFsaWQgKz0gbGVuZ3RoO1xuICB9XG59XG5cblxuZnVuY3Rpb24gc2VuZF9jb2RlKHMsIGMsIHRyZWUpIHtcbiAgc2VuZF9iaXRzKHMsIHRyZWVbYyAqIDJdLyouQ29kZSovLCB0cmVlW2MgKiAyICsgMV0vKi5MZW4qLyk7XG59XG5cblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBSZXZlcnNlIHRoZSBmaXJzdCBsZW4gYml0cyBvZiBhIGNvZGUsIHVzaW5nIHN0cmFpZ2h0Zm9yd2FyZCBjb2RlIChhIGZhc3RlclxuICogbWV0aG9kIHdvdWxkIHVzZSBhIHRhYmxlKVxuICogSU4gYXNzZXJ0aW9uOiAxIDw9IGxlbiA8PSAxNVxuICovXG5mdW5jdGlvbiBiaV9yZXZlcnNlKGNvZGUsIGxlbikge1xuICB2YXIgcmVzID0gMDtcbiAgZG8ge1xuICAgIHJlcyB8PSBjb2RlICYgMTtcbiAgICBjb2RlID4+Pj0gMTtcbiAgICByZXMgPDw9IDE7XG4gIH0gd2hpbGUgKC0tbGVuID4gMCk7XG4gIHJldHVybiByZXMgPj4+IDE7XG59XG5cblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBGbHVzaCB0aGUgYml0IGJ1ZmZlciwga2VlcGluZyBhdCBtb3N0IDcgYml0cyBpbiBpdC5cbiAqL1xuZnVuY3Rpb24gYmlfZmx1c2gocykge1xuICBpZiAocy5iaV92YWxpZCA9PT0gMTYpIHtcbiAgICBwdXRfc2hvcnQocywgcy5iaV9idWYpO1xuICAgIHMuYmlfYnVmID0gMDtcbiAgICBzLmJpX3ZhbGlkID0gMDtcblxuICB9IGVsc2UgaWYgKHMuYmlfdmFsaWQgPj0gOCkge1xuICAgIHMucGVuZGluZ19idWZbcy5wZW5kaW5nKytdID0gcy5iaV9idWYgJiAweGZmO1xuICAgIHMuYmlfYnVmID4+PSA4O1xuICAgIHMuYmlfdmFsaWQgLT0gODtcbiAgfVxufVxuXG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogQ29tcHV0ZSB0aGUgb3B0aW1hbCBiaXQgbGVuZ3RocyBmb3IgYSB0cmVlIGFuZCB1cGRhdGUgdGhlIHRvdGFsIGJpdCBsZW5ndGhcbiAqIGZvciB0aGUgY3VycmVudCBibG9jay5cbiAqIElOIGFzc2VydGlvbjogdGhlIGZpZWxkcyBmcmVxIGFuZCBkYWQgYXJlIHNldCwgaGVhcFtoZWFwX21heF0gYW5kXG4gKiAgICBhYm92ZSBhcmUgdGhlIHRyZWUgbm9kZXMgc29ydGVkIGJ5IGluY3JlYXNpbmcgZnJlcXVlbmN5LlxuICogT1VUIGFzc2VydGlvbnM6IHRoZSBmaWVsZCBsZW4gaXMgc2V0IHRvIHRoZSBvcHRpbWFsIGJpdCBsZW5ndGgsIHRoZVxuICogICAgIGFycmF5IGJsX2NvdW50IGNvbnRhaW5zIHRoZSBmcmVxdWVuY2llcyBmb3IgZWFjaCBiaXQgbGVuZ3RoLlxuICogICAgIFRoZSBsZW5ndGggb3B0X2xlbiBpcyB1cGRhdGVkOyBzdGF0aWNfbGVuIGlzIGFsc28gdXBkYXRlZCBpZiBzdHJlZSBpc1xuICogICAgIG5vdCBudWxsLlxuICovXG5mdW5jdGlvbiBnZW5fYml0bGVuKHMsIGRlc2MpXG4vLyAgICBkZWZsYXRlX3N0YXRlICpzO1xuLy8gICAgdHJlZV9kZXNjICpkZXNjOyAgICAvKiB0aGUgdHJlZSBkZXNjcmlwdG9yICovXG57XG4gIHZhciB0cmVlICAgICAgICAgICAgPSBkZXNjLmR5bl90cmVlO1xuICB2YXIgbWF4X2NvZGUgICAgICAgID0gZGVzYy5tYXhfY29kZTtcbiAgdmFyIHN0cmVlICAgICAgICAgICA9IGRlc2Muc3RhdF9kZXNjLnN0YXRpY190cmVlO1xuICB2YXIgaGFzX3N0cmVlICAgICAgID0gZGVzYy5zdGF0X2Rlc2MuaGFzX3N0cmVlO1xuICB2YXIgZXh0cmEgICAgICAgICAgID0gZGVzYy5zdGF0X2Rlc2MuZXh0cmFfYml0cztcbiAgdmFyIGJhc2UgICAgICAgICAgICA9IGRlc2Muc3RhdF9kZXNjLmV4dHJhX2Jhc2U7XG4gIHZhciBtYXhfbGVuZ3RoICAgICAgPSBkZXNjLnN0YXRfZGVzYy5tYXhfbGVuZ3RoO1xuICB2YXIgaDsgICAgICAgICAgICAgIC8qIGhlYXAgaW5kZXggKi9cbiAgdmFyIG4sIG07ICAgICAgICAgICAvKiBpdGVyYXRlIG92ZXIgdGhlIHRyZWUgZWxlbWVudHMgKi9cbiAgdmFyIGJpdHM7ICAgICAgICAgICAvKiBiaXQgbGVuZ3RoICovXG4gIHZhciB4Yml0czsgICAgICAgICAgLyogZXh0cmEgYml0cyAqL1xuICB2YXIgZjsgICAgICAgICAgICAgIC8qIGZyZXF1ZW5jeSAqL1xuICB2YXIgb3ZlcmZsb3cgPSAwOyAgIC8qIG51bWJlciBvZiBlbGVtZW50cyB3aXRoIGJpdCBsZW5ndGggdG9vIGxhcmdlICovXG5cbiAgZm9yIChiaXRzID0gMDsgYml0cyA8PSBNQVhfQklUUzsgYml0cysrKSB7XG4gICAgcy5ibF9jb3VudFtiaXRzXSA9IDA7XG4gIH1cblxuICAvKiBJbiBhIGZpcnN0IHBhc3MsIGNvbXB1dGUgdGhlIG9wdGltYWwgYml0IGxlbmd0aHMgKHdoaWNoIG1heVxuICAgKiBvdmVyZmxvdyBpbiB0aGUgY2FzZSBvZiB0aGUgYml0IGxlbmd0aCB0cmVlKS5cbiAgICovXG4gIHRyZWVbcy5oZWFwW3MuaGVhcF9tYXhdICogMiArIDFdLyouTGVuKi8gPSAwOyAvKiByb290IG9mIHRoZSBoZWFwICovXG5cbiAgZm9yIChoID0gcy5oZWFwX21heCArIDE7IGggPCBIRUFQX1NJWkU7IGgrKykge1xuICAgIG4gPSBzLmhlYXBbaF07XG4gICAgYml0cyA9IHRyZWVbdHJlZVtuICogMiArIDFdLyouRGFkKi8gKiAyICsgMV0vKi5MZW4qLyArIDE7XG4gICAgaWYgKGJpdHMgPiBtYXhfbGVuZ3RoKSB7XG4gICAgICBiaXRzID0gbWF4X2xlbmd0aDtcbiAgICAgIG92ZXJmbG93Kys7XG4gICAgfVxuICAgIHRyZWVbbiAqIDIgKyAxXS8qLkxlbiovID0gYml0cztcbiAgICAvKiBXZSBvdmVyd3JpdGUgdHJlZVtuXS5EYWQgd2hpY2ggaXMgbm8gbG9uZ2VyIG5lZWRlZCAqL1xuXG4gICAgaWYgKG4gPiBtYXhfY29kZSkgeyBjb250aW51ZTsgfSAvKiBub3QgYSBsZWFmIG5vZGUgKi9cblxuICAgIHMuYmxfY291bnRbYml0c10rKztcbiAgICB4Yml0cyA9IDA7XG4gICAgaWYgKG4gPj0gYmFzZSkge1xuICAgICAgeGJpdHMgPSBleHRyYVtuIC0gYmFzZV07XG4gICAgfVxuICAgIGYgPSB0cmVlW24gKiAyXS8qLkZyZXEqLztcbiAgICBzLm9wdF9sZW4gKz0gZiAqIChiaXRzICsgeGJpdHMpO1xuICAgIGlmIChoYXNfc3RyZWUpIHtcbiAgICAgIHMuc3RhdGljX2xlbiArPSBmICogKHN0cmVlW24gKiAyICsgMV0vKi5MZW4qLyArIHhiaXRzKTtcbiAgICB9XG4gIH1cbiAgaWYgKG92ZXJmbG93ID09PSAwKSB7IHJldHVybjsgfVxuXG4gIC8vIFRyYWNlKChzdGRlcnIsXCJcXG5iaXQgbGVuZ3RoIG92ZXJmbG93XFxuXCIpKTtcbiAgLyogVGhpcyBoYXBwZW5zIGZvciBleGFtcGxlIG9uIG9iajIgYW5kIHBpYyBvZiB0aGUgQ2FsZ2FyeSBjb3JwdXMgKi9cblxuICAvKiBGaW5kIHRoZSBmaXJzdCBiaXQgbGVuZ3RoIHdoaWNoIGNvdWxkIGluY3JlYXNlOiAqL1xuICBkbyB7XG4gICAgYml0cyA9IG1heF9sZW5ndGggLSAxO1xuICAgIHdoaWxlIChzLmJsX2NvdW50W2JpdHNdID09PSAwKSB7IGJpdHMtLTsgfVxuICAgIHMuYmxfY291bnRbYml0c10tLTsgICAgICAvKiBtb3ZlIG9uZSBsZWFmIGRvd24gdGhlIHRyZWUgKi9cbiAgICBzLmJsX2NvdW50W2JpdHMgKyAxXSArPSAyOyAvKiBtb3ZlIG9uZSBvdmVyZmxvdyBpdGVtIGFzIGl0cyBicm90aGVyICovXG4gICAgcy5ibF9jb3VudFttYXhfbGVuZ3RoXS0tO1xuICAgIC8qIFRoZSBicm90aGVyIG9mIHRoZSBvdmVyZmxvdyBpdGVtIGFsc28gbW92ZXMgb25lIHN0ZXAgdXAsXG4gICAgICogYnV0IHRoaXMgZG9lcyBub3QgYWZmZWN0IGJsX2NvdW50W21heF9sZW5ndGhdXG4gICAgICovXG4gICAgb3ZlcmZsb3cgLT0gMjtcbiAgfSB3aGlsZSAob3ZlcmZsb3cgPiAwKTtcblxuICAvKiBOb3cgcmVjb21wdXRlIGFsbCBiaXQgbGVuZ3Rocywgc2Nhbm5pbmcgaW4gaW5jcmVhc2luZyBmcmVxdWVuY3kuXG4gICAqIGggaXMgc3RpbGwgZXF1YWwgdG8gSEVBUF9TSVpFLiAoSXQgaXMgc2ltcGxlciB0byByZWNvbnN0cnVjdCBhbGxcbiAgICogbGVuZ3RocyBpbnN0ZWFkIG9mIGZpeGluZyBvbmx5IHRoZSB3cm9uZyBvbmVzLiBUaGlzIGlkZWEgaXMgdGFrZW5cbiAgICogZnJvbSAnYXInIHdyaXR0ZW4gYnkgSGFydWhpa28gT2t1bXVyYS4pXG4gICAqL1xuICBmb3IgKGJpdHMgPSBtYXhfbGVuZ3RoOyBiaXRzICE9PSAwOyBiaXRzLS0pIHtcbiAgICBuID0gcy5ibF9jb3VudFtiaXRzXTtcbiAgICB3aGlsZSAobiAhPT0gMCkge1xuICAgICAgbSA9IHMuaGVhcFstLWhdO1xuICAgICAgaWYgKG0gPiBtYXhfY29kZSkgeyBjb250aW51ZTsgfVxuICAgICAgaWYgKHRyZWVbbSAqIDIgKyAxXS8qLkxlbiovICE9PSBiaXRzKSB7XG4gICAgICAgIC8vIFRyYWNlKChzdGRlcnIsXCJjb2RlICVkIGJpdHMgJWQtPiVkXFxuXCIsIG0sIHRyZWVbbV0uTGVuLCBiaXRzKSk7XG4gICAgICAgIHMub3B0X2xlbiArPSAoYml0cyAtIHRyZWVbbSAqIDIgKyAxXS8qLkxlbiovKSAqIHRyZWVbbSAqIDJdLyouRnJlcSovO1xuICAgICAgICB0cmVlW20gKiAyICsgMV0vKi5MZW4qLyA9IGJpdHM7XG4gICAgICB9XG4gICAgICBuLS07XG4gICAgfVxuICB9XG59XG5cblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBHZW5lcmF0ZSB0aGUgY29kZXMgZm9yIGEgZ2l2ZW4gdHJlZSBhbmQgYml0IGNvdW50cyAod2hpY2ggbmVlZCBub3QgYmVcbiAqIG9wdGltYWwpLlxuICogSU4gYXNzZXJ0aW9uOiB0aGUgYXJyYXkgYmxfY291bnQgY29udGFpbnMgdGhlIGJpdCBsZW5ndGggc3RhdGlzdGljcyBmb3JcbiAqIHRoZSBnaXZlbiB0cmVlIGFuZCB0aGUgZmllbGQgbGVuIGlzIHNldCBmb3IgYWxsIHRyZWUgZWxlbWVudHMuXG4gKiBPVVQgYXNzZXJ0aW9uOiB0aGUgZmllbGQgY29kZSBpcyBzZXQgZm9yIGFsbCB0cmVlIGVsZW1lbnRzIG9mIG5vblxuICogICAgIHplcm8gY29kZSBsZW5ndGguXG4gKi9cbmZ1bmN0aW9uIGdlbl9jb2Rlcyh0cmVlLCBtYXhfY29kZSwgYmxfY291bnQpXG4vLyAgICBjdF9kYXRhICp0cmVlOyAgICAgICAgICAgICAvKiB0aGUgdHJlZSB0byBkZWNvcmF0ZSAqL1xuLy8gICAgaW50IG1heF9jb2RlOyAgICAgICAgICAgICAgLyogbGFyZ2VzdCBjb2RlIHdpdGggbm9uIHplcm8gZnJlcXVlbmN5ICovXG4vLyAgICB1c2hmICpibF9jb3VudDsgICAgICAgICAgICAvKiBudW1iZXIgb2YgY29kZXMgYXQgZWFjaCBiaXQgbGVuZ3RoICovXG57XG4gIHZhciBuZXh0X2NvZGUgPSBuZXcgQXJyYXkoTUFYX0JJVFMgKyAxKTsgLyogbmV4dCBjb2RlIHZhbHVlIGZvciBlYWNoIGJpdCBsZW5ndGggKi9cbiAgdmFyIGNvZGUgPSAwOyAgICAgICAgICAgICAgLyogcnVubmluZyBjb2RlIHZhbHVlICovXG4gIHZhciBiaXRzOyAgICAgICAgICAgICAgICAgIC8qIGJpdCBpbmRleCAqL1xuICB2YXIgbjsgICAgICAgICAgICAgICAgICAgICAvKiBjb2RlIGluZGV4ICovXG5cbiAgLyogVGhlIGRpc3RyaWJ1dGlvbiBjb3VudHMgYXJlIGZpcnN0IHVzZWQgdG8gZ2VuZXJhdGUgdGhlIGNvZGUgdmFsdWVzXG4gICAqIHdpdGhvdXQgYml0IHJldmVyc2FsLlxuICAgKi9cbiAgZm9yIChiaXRzID0gMTsgYml0cyA8PSBNQVhfQklUUzsgYml0cysrKSB7XG4gICAgbmV4dF9jb2RlW2JpdHNdID0gY29kZSA9IChjb2RlICsgYmxfY291bnRbYml0cyAtIDFdKSA8PCAxO1xuICB9XG4gIC8qIENoZWNrIHRoYXQgdGhlIGJpdCBjb3VudHMgaW4gYmxfY291bnQgYXJlIGNvbnNpc3RlbnQuIFRoZSBsYXN0IGNvZGVcbiAgICogbXVzdCBiZSBhbGwgb25lcy5cbiAgICovXG4gIC8vQXNzZXJ0IChjb2RlICsgYmxfY291bnRbTUFYX0JJVFNdLTEgPT0gKDE8PE1BWF9CSVRTKS0xLFxuICAvLyAgICAgICAgXCJpbmNvbnNpc3RlbnQgYml0IGNvdW50c1wiKTtcbiAgLy9UcmFjZXYoKHN0ZGVycixcIlxcbmdlbl9jb2RlczogbWF4X2NvZGUgJWQgXCIsIG1heF9jb2RlKSk7XG5cbiAgZm9yIChuID0gMDsgIG4gPD0gbWF4X2NvZGU7IG4rKykge1xuICAgIHZhciBsZW4gPSB0cmVlW24gKiAyICsgMV0vKi5MZW4qLztcbiAgICBpZiAobGVuID09PSAwKSB7IGNvbnRpbnVlOyB9XG4gICAgLyogTm93IHJldmVyc2UgdGhlIGJpdHMgKi9cbiAgICB0cmVlW24gKiAyXS8qLkNvZGUqLyA9IGJpX3JldmVyc2UobmV4dF9jb2RlW2xlbl0rKywgbGVuKTtcblxuICAgIC8vVHJhY2Vjdih0cmVlICE9IHN0YXRpY19sdHJlZSwgKHN0ZGVycixcIlxcbm4gJTNkICVjIGwgJTJkIGMgJTR4ICgleCkgXCIsXG4gICAgLy8gICAgIG4sIChpc2dyYXBoKG4pID8gbiA6ICcgJyksIGxlbiwgdHJlZVtuXS5Db2RlLCBuZXh0X2NvZGVbbGVuXS0xKSk7XG4gIH1cbn1cblxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIEluaXRpYWxpemUgdGhlIHZhcmlvdXMgJ2NvbnN0YW50JyB0YWJsZXMuXG4gKi9cbmZ1bmN0aW9uIHRyX3N0YXRpY19pbml0KCkge1xuICB2YXIgbjsgICAgICAgIC8qIGl0ZXJhdGVzIG92ZXIgdHJlZSBlbGVtZW50cyAqL1xuICB2YXIgYml0czsgICAgIC8qIGJpdCBjb3VudGVyICovXG4gIHZhciBsZW5ndGg7ICAgLyogbGVuZ3RoIHZhbHVlICovXG4gIHZhciBjb2RlOyAgICAgLyogY29kZSB2YWx1ZSAqL1xuICB2YXIgZGlzdDsgICAgIC8qIGRpc3RhbmNlIGluZGV4ICovXG4gIHZhciBibF9jb3VudCA9IG5ldyBBcnJheShNQVhfQklUUyArIDEpO1xuICAvKiBudW1iZXIgb2YgY29kZXMgYXQgZWFjaCBiaXQgbGVuZ3RoIGZvciBhbiBvcHRpbWFsIHRyZWUgKi9cblxuICAvLyBkbyBjaGVjayBpbiBfdHJfaW5pdCgpXG4gIC8vaWYgKHN0YXRpY19pbml0X2RvbmUpIHJldHVybjtcblxuICAvKiBGb3Igc29tZSBlbWJlZGRlZCB0YXJnZXRzLCBnbG9iYWwgdmFyaWFibGVzIGFyZSBub3QgaW5pdGlhbGl6ZWQ6ICovXG4vKiNpZmRlZiBOT19JTklUX0dMT0JBTF9QT0lOVEVSU1xuICBzdGF0aWNfbF9kZXNjLnN0YXRpY190cmVlID0gc3RhdGljX2x0cmVlO1xuICBzdGF0aWNfbF9kZXNjLmV4dHJhX2JpdHMgPSBleHRyYV9sYml0cztcbiAgc3RhdGljX2RfZGVzYy5zdGF0aWNfdHJlZSA9IHN0YXRpY19kdHJlZTtcbiAgc3RhdGljX2RfZGVzYy5leHRyYV9iaXRzID0gZXh0cmFfZGJpdHM7XG4gIHN0YXRpY19ibF9kZXNjLmV4dHJhX2JpdHMgPSBleHRyYV9ibGJpdHM7XG4jZW5kaWYqL1xuXG4gIC8qIEluaXRpYWxpemUgdGhlIG1hcHBpbmcgbGVuZ3RoICgwLi4yNTUpIC0+IGxlbmd0aCBjb2RlICgwLi4yOCkgKi9cbiAgbGVuZ3RoID0gMDtcbiAgZm9yIChjb2RlID0gMDsgY29kZSA8IExFTkdUSF9DT0RFUyAtIDE7IGNvZGUrKykge1xuICAgIGJhc2VfbGVuZ3RoW2NvZGVdID0gbGVuZ3RoO1xuICAgIGZvciAobiA9IDA7IG4gPCAoMSA8PCBleHRyYV9sYml0c1tjb2RlXSk7IG4rKykge1xuICAgICAgX2xlbmd0aF9jb2RlW2xlbmd0aCsrXSA9IGNvZGU7XG4gICAgfVxuICB9XG4gIC8vQXNzZXJ0IChsZW5ndGggPT0gMjU2LCBcInRyX3N0YXRpY19pbml0OiBsZW5ndGggIT0gMjU2XCIpO1xuICAvKiBOb3RlIHRoYXQgdGhlIGxlbmd0aCAyNTUgKG1hdGNoIGxlbmd0aCAyNTgpIGNhbiBiZSByZXByZXNlbnRlZFxuICAgKiBpbiB0d28gZGlmZmVyZW50IHdheXM6IGNvZGUgMjg0ICsgNSBiaXRzIG9yIGNvZGUgMjg1LCBzbyB3ZVxuICAgKiBvdmVyd3JpdGUgbGVuZ3RoX2NvZGVbMjU1XSB0byB1c2UgdGhlIGJlc3QgZW5jb2Rpbmc6XG4gICAqL1xuICBfbGVuZ3RoX2NvZGVbbGVuZ3RoIC0gMV0gPSBjb2RlO1xuXG4gIC8qIEluaXRpYWxpemUgdGhlIG1hcHBpbmcgZGlzdCAoMC4uMzJLKSAtPiBkaXN0IGNvZGUgKDAuLjI5KSAqL1xuICBkaXN0ID0gMDtcbiAgZm9yIChjb2RlID0gMDsgY29kZSA8IDE2OyBjb2RlKyspIHtcbiAgICBiYXNlX2Rpc3RbY29kZV0gPSBkaXN0O1xuICAgIGZvciAobiA9IDA7IG4gPCAoMSA8PCBleHRyYV9kYml0c1tjb2RlXSk7IG4rKykge1xuICAgICAgX2Rpc3RfY29kZVtkaXN0KytdID0gY29kZTtcbiAgICB9XG4gIH1cbiAgLy9Bc3NlcnQgKGRpc3QgPT0gMjU2LCBcInRyX3N0YXRpY19pbml0OiBkaXN0ICE9IDI1NlwiKTtcbiAgZGlzdCA+Pj0gNzsgLyogZnJvbSBub3cgb24sIGFsbCBkaXN0YW5jZXMgYXJlIGRpdmlkZWQgYnkgMTI4ICovXG4gIGZvciAoOyBjb2RlIDwgRF9DT0RFUzsgY29kZSsrKSB7XG4gICAgYmFzZV9kaXN0W2NvZGVdID0gZGlzdCA8PCA3O1xuICAgIGZvciAobiA9IDA7IG4gPCAoMSA8PCAoZXh0cmFfZGJpdHNbY29kZV0gLSA3KSk7IG4rKykge1xuICAgICAgX2Rpc3RfY29kZVsyNTYgKyBkaXN0KytdID0gY29kZTtcbiAgICB9XG4gIH1cbiAgLy9Bc3NlcnQgKGRpc3QgPT0gMjU2LCBcInRyX3N0YXRpY19pbml0OiAyNTYrZGlzdCAhPSA1MTJcIik7XG5cbiAgLyogQ29uc3RydWN0IHRoZSBjb2RlcyBvZiB0aGUgc3RhdGljIGxpdGVyYWwgdHJlZSAqL1xuICBmb3IgKGJpdHMgPSAwOyBiaXRzIDw9IE1BWF9CSVRTOyBiaXRzKyspIHtcbiAgICBibF9jb3VudFtiaXRzXSA9IDA7XG4gIH1cblxuICBuID0gMDtcbiAgd2hpbGUgKG4gPD0gMTQzKSB7XG4gICAgc3RhdGljX2x0cmVlW24gKiAyICsgMV0vKi5MZW4qLyA9IDg7XG4gICAgbisrO1xuICAgIGJsX2NvdW50WzhdKys7XG4gIH1cbiAgd2hpbGUgKG4gPD0gMjU1KSB7XG4gICAgc3RhdGljX2x0cmVlW24gKiAyICsgMV0vKi5MZW4qLyA9IDk7XG4gICAgbisrO1xuICAgIGJsX2NvdW50WzldKys7XG4gIH1cbiAgd2hpbGUgKG4gPD0gMjc5KSB7XG4gICAgc3RhdGljX2x0cmVlW24gKiAyICsgMV0vKi5MZW4qLyA9IDc7XG4gICAgbisrO1xuICAgIGJsX2NvdW50WzddKys7XG4gIH1cbiAgd2hpbGUgKG4gPD0gMjg3KSB7XG4gICAgc3RhdGljX2x0cmVlW24gKiAyICsgMV0vKi5MZW4qLyA9IDg7XG4gICAgbisrO1xuICAgIGJsX2NvdW50WzhdKys7XG4gIH1cbiAgLyogQ29kZXMgMjg2IGFuZCAyODcgZG8gbm90IGV4aXN0LCBidXQgd2UgbXVzdCBpbmNsdWRlIHRoZW0gaW4gdGhlXG4gICAqIHRyZWUgY29uc3RydWN0aW9uIHRvIGdldCBhIGNhbm9uaWNhbCBIdWZmbWFuIHRyZWUgKGxvbmdlc3QgY29kZVxuICAgKiBhbGwgb25lcylcbiAgICovXG4gIGdlbl9jb2RlcyhzdGF0aWNfbHRyZWUsIExfQ09ERVMgKyAxLCBibF9jb3VudCk7XG5cbiAgLyogVGhlIHN0YXRpYyBkaXN0YW5jZSB0cmVlIGlzIHRyaXZpYWw6ICovXG4gIGZvciAobiA9IDA7IG4gPCBEX0NPREVTOyBuKyspIHtcbiAgICBzdGF0aWNfZHRyZWVbbiAqIDIgKyAxXS8qLkxlbiovID0gNTtcbiAgICBzdGF0aWNfZHRyZWVbbiAqIDJdLyouQ29kZSovID0gYmlfcmV2ZXJzZShuLCA1KTtcbiAgfVxuXG4gIC8vIE5vdyBkYXRhIHJlYWR5IGFuZCB3ZSBjYW4gaW5pdCBzdGF0aWMgdHJlZXNcbiAgc3RhdGljX2xfZGVzYyA9IG5ldyBTdGF0aWNUcmVlRGVzYyhzdGF0aWNfbHRyZWUsIGV4dHJhX2xiaXRzLCBMSVRFUkFMUyArIDEsIExfQ09ERVMsIE1BWF9CSVRTKTtcbiAgc3RhdGljX2RfZGVzYyA9IG5ldyBTdGF0aWNUcmVlRGVzYyhzdGF0aWNfZHRyZWUsIGV4dHJhX2RiaXRzLCAwLCAgICAgICAgICBEX0NPREVTLCBNQVhfQklUUyk7XG4gIHN0YXRpY19ibF9kZXNjID0gbmV3IFN0YXRpY1RyZWVEZXNjKG5ldyBBcnJheSgwKSwgZXh0cmFfYmxiaXRzLCAwLCAgICAgICAgIEJMX0NPREVTLCBNQVhfQkxfQklUUyk7XG5cbiAgLy9zdGF0aWNfaW5pdF9kb25lID0gdHJ1ZTtcbn1cblxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIEluaXRpYWxpemUgYSBuZXcgYmxvY2suXG4gKi9cbmZ1bmN0aW9uIGluaXRfYmxvY2socykge1xuICB2YXIgbjsgLyogaXRlcmF0ZXMgb3ZlciB0cmVlIGVsZW1lbnRzICovXG5cbiAgLyogSW5pdGlhbGl6ZSB0aGUgdHJlZXMuICovXG4gIGZvciAobiA9IDA7IG4gPCBMX0NPREVTOyAgbisrKSB7IHMuZHluX2x0cmVlW24gKiAyXS8qLkZyZXEqLyA9IDA7IH1cbiAgZm9yIChuID0gMDsgbiA8IERfQ09ERVM7ICBuKyspIHsgcy5keW5fZHRyZWVbbiAqIDJdLyouRnJlcSovID0gMDsgfVxuICBmb3IgKG4gPSAwOyBuIDwgQkxfQ09ERVM7IG4rKykgeyBzLmJsX3RyZWVbbiAqIDJdLyouRnJlcSovID0gMDsgfVxuXG4gIHMuZHluX2x0cmVlW0VORF9CTE9DSyAqIDJdLyouRnJlcSovID0gMTtcbiAgcy5vcHRfbGVuID0gcy5zdGF0aWNfbGVuID0gMDtcbiAgcy5sYXN0X2xpdCA9IHMubWF0Y2hlcyA9IDA7XG59XG5cblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBGbHVzaCB0aGUgYml0IGJ1ZmZlciBhbmQgYWxpZ24gdGhlIG91dHB1dCBvbiBhIGJ5dGUgYm91bmRhcnlcbiAqL1xuZnVuY3Rpb24gYmlfd2luZHVwKHMpXG57XG4gIGlmIChzLmJpX3ZhbGlkID4gOCkge1xuICAgIHB1dF9zaG9ydChzLCBzLmJpX2J1Zik7XG4gIH0gZWxzZSBpZiAocy5iaV92YWxpZCA+IDApIHtcbiAgICAvL3B1dF9ieXRlKHMsIChCeXRlKXMtPmJpX2J1Zik7XG4gICAgcy5wZW5kaW5nX2J1ZltzLnBlbmRpbmcrK10gPSBzLmJpX2J1ZjtcbiAgfVxuICBzLmJpX2J1ZiA9IDA7XG4gIHMuYmlfdmFsaWQgPSAwO1xufVxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIENvcHkgYSBzdG9yZWQgYmxvY2ssIHN0b3JpbmcgZmlyc3QgdGhlIGxlbmd0aCBhbmQgaXRzXG4gKiBvbmUncyBjb21wbGVtZW50IGlmIHJlcXVlc3RlZC5cbiAqL1xuZnVuY3Rpb24gY29weV9ibG9jayhzLCBidWYsIGxlbiwgaGVhZGVyKVxuLy9EZWZsYXRlU3RhdGUgKnM7XG4vL2NoYXJmICAgICpidWY7ICAgIC8qIHRoZSBpbnB1dCBkYXRhICovXG4vL3Vuc2lnbmVkIGxlbjsgICAgIC8qIGl0cyBsZW5ndGggKi9cbi8vaW50ICAgICAgaGVhZGVyOyAgLyogdHJ1ZSBpZiBibG9jayBoZWFkZXIgbXVzdCBiZSB3cml0dGVuICovXG57XG4gIGJpX3dpbmR1cChzKTsgICAgICAgIC8qIGFsaWduIG9uIGJ5dGUgYm91bmRhcnkgKi9cblxuICBpZiAoaGVhZGVyKSB7XG4gICAgcHV0X3Nob3J0KHMsIGxlbik7XG4gICAgcHV0X3Nob3J0KHMsIH5sZW4pO1xuICB9XG4vLyAgd2hpbGUgKGxlbi0tKSB7XG4vLyAgICBwdXRfYnl0ZShzLCAqYnVmKyspO1xuLy8gIH1cbiAgdXRpbHMuYXJyYXlTZXQocy5wZW5kaW5nX2J1Ziwgcy53aW5kb3csIGJ1ZiwgbGVuLCBzLnBlbmRpbmcpO1xuICBzLnBlbmRpbmcgKz0gbGVuO1xufVxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIENvbXBhcmVzIHRvIHN1YnRyZWVzLCB1c2luZyB0aGUgdHJlZSBkZXB0aCBhcyB0aWUgYnJlYWtlciB3aGVuXG4gKiB0aGUgc3VidHJlZXMgaGF2ZSBlcXVhbCBmcmVxdWVuY3kuIFRoaXMgbWluaW1pemVzIHRoZSB3b3JzdCBjYXNlIGxlbmd0aC5cbiAqL1xuZnVuY3Rpb24gc21hbGxlcih0cmVlLCBuLCBtLCBkZXB0aCkge1xuICB2YXIgX24yID0gbiAqIDI7XG4gIHZhciBfbTIgPSBtICogMjtcbiAgcmV0dXJuICh0cmVlW19uMl0vKi5GcmVxKi8gPCB0cmVlW19tMl0vKi5GcmVxKi8gfHxcbiAgICAgICAgICh0cmVlW19uMl0vKi5GcmVxKi8gPT09IHRyZWVbX20yXS8qLkZyZXEqLyAmJiBkZXB0aFtuXSA8PSBkZXB0aFttXSkpO1xufVxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIFJlc3RvcmUgdGhlIGhlYXAgcHJvcGVydHkgYnkgbW92aW5nIGRvd24gdGhlIHRyZWUgc3RhcnRpbmcgYXQgbm9kZSBrLFxuICogZXhjaGFuZ2luZyBhIG5vZGUgd2l0aCB0aGUgc21hbGxlc3Qgb2YgaXRzIHR3byBzb25zIGlmIG5lY2Vzc2FyeSwgc3RvcHBpbmdcbiAqIHdoZW4gdGhlIGhlYXAgcHJvcGVydHkgaXMgcmUtZXN0YWJsaXNoZWQgKGVhY2ggZmF0aGVyIHNtYWxsZXIgdGhhbiBpdHNcbiAqIHR3byBzb25zKS5cbiAqL1xuZnVuY3Rpb24gcHFkb3duaGVhcChzLCB0cmVlLCBrKVxuLy8gICAgZGVmbGF0ZV9zdGF0ZSAqcztcbi8vICAgIGN0X2RhdGEgKnRyZWU7ICAvKiB0aGUgdHJlZSB0byByZXN0b3JlICovXG4vLyAgICBpbnQgazsgICAgICAgICAgICAgICAvKiBub2RlIHRvIG1vdmUgZG93biAqL1xue1xuICB2YXIgdiA9IHMuaGVhcFtrXTtcbiAgdmFyIGogPSBrIDw8IDE7ICAvKiBsZWZ0IHNvbiBvZiBrICovXG4gIHdoaWxlIChqIDw9IHMuaGVhcF9sZW4pIHtcbiAgICAvKiBTZXQgaiB0byB0aGUgc21hbGxlc3Qgb2YgdGhlIHR3byBzb25zOiAqL1xuICAgIGlmIChqIDwgcy5oZWFwX2xlbiAmJlxuICAgICAgc21hbGxlcih0cmVlLCBzLmhlYXBbaiArIDFdLCBzLmhlYXBbal0sIHMuZGVwdGgpKSB7XG4gICAgICBqKys7XG4gICAgfVxuICAgIC8qIEV4aXQgaWYgdiBpcyBzbWFsbGVyIHRoYW4gYm90aCBzb25zICovXG4gICAgaWYgKHNtYWxsZXIodHJlZSwgdiwgcy5oZWFwW2pdLCBzLmRlcHRoKSkgeyBicmVhazsgfVxuXG4gICAgLyogRXhjaGFuZ2UgdiB3aXRoIHRoZSBzbWFsbGVzdCBzb24gKi9cbiAgICBzLmhlYXBba10gPSBzLmhlYXBbal07XG4gICAgayA9IGo7XG5cbiAgICAvKiBBbmQgY29udGludWUgZG93biB0aGUgdHJlZSwgc2V0dGluZyBqIHRvIHRoZSBsZWZ0IHNvbiBvZiBrICovXG4gICAgaiA8PD0gMTtcbiAgfVxuICBzLmhlYXBba10gPSB2O1xufVxuXG5cbi8vIGlubGluZWQgbWFudWFsbHlcbi8vIHZhciBTTUFMTEVTVCA9IDE7XG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogU2VuZCB0aGUgYmxvY2sgZGF0YSBjb21wcmVzc2VkIHVzaW5nIHRoZSBnaXZlbiBIdWZmbWFuIHRyZWVzXG4gKi9cbmZ1bmN0aW9uIGNvbXByZXNzX2Jsb2NrKHMsIGx0cmVlLCBkdHJlZSlcbi8vICAgIGRlZmxhdGVfc3RhdGUgKnM7XG4vLyAgICBjb25zdCBjdF9kYXRhICpsdHJlZTsgLyogbGl0ZXJhbCB0cmVlICovXG4vLyAgICBjb25zdCBjdF9kYXRhICpkdHJlZTsgLyogZGlzdGFuY2UgdHJlZSAqL1xue1xuICB2YXIgZGlzdDsgICAgICAgICAgIC8qIGRpc3RhbmNlIG9mIG1hdGNoZWQgc3RyaW5nICovXG4gIHZhciBsYzsgICAgICAgICAgICAgLyogbWF0Y2ggbGVuZ3RoIG9yIHVubWF0Y2hlZCBjaGFyIChpZiBkaXN0ID09IDApICovXG4gIHZhciBseCA9IDA7ICAgICAgICAgLyogcnVubmluZyBpbmRleCBpbiBsX2J1ZiAqL1xuICB2YXIgY29kZTsgICAgICAgICAgIC8qIHRoZSBjb2RlIHRvIHNlbmQgKi9cbiAgdmFyIGV4dHJhOyAgICAgICAgICAvKiBudW1iZXIgb2YgZXh0cmEgYml0cyB0byBzZW5kICovXG5cbiAgaWYgKHMubGFzdF9saXQgIT09IDApIHtcbiAgICBkbyB7XG4gICAgICBkaXN0ID0gKHMucGVuZGluZ19idWZbcy5kX2J1ZiArIGx4ICogMl0gPDwgOCkgfCAocy5wZW5kaW5nX2J1ZltzLmRfYnVmICsgbHggKiAyICsgMV0pO1xuICAgICAgbGMgPSBzLnBlbmRpbmdfYnVmW3MubF9idWYgKyBseF07XG4gICAgICBseCsrO1xuXG4gICAgICBpZiAoZGlzdCA9PT0gMCkge1xuICAgICAgICBzZW5kX2NvZGUocywgbGMsIGx0cmVlKTsgLyogc2VuZCBhIGxpdGVyYWwgYnl0ZSAqL1xuICAgICAgICAvL1RyYWNlY3YoaXNncmFwaChsYyksIChzdGRlcnIsXCIgJyVjJyBcIiwgbGMpKTtcbiAgICAgIH0gZWxzZSB7XG4gICAgICAgIC8qIEhlcmUsIGxjIGlzIHRoZSBtYXRjaCBsZW5ndGggLSBNSU5fTUFUQ0ggKi9cbiAgICAgICAgY29kZSA9IF9sZW5ndGhfY29kZVtsY107XG4gICAgICAgIHNlbmRfY29kZShzLCBjb2RlICsgTElURVJBTFMgKyAxLCBsdHJlZSk7IC8qIHNlbmQgdGhlIGxlbmd0aCBjb2RlICovXG4gICAgICAgIGV4dHJhID0gZXh0cmFfbGJpdHNbY29kZV07XG4gICAgICAgIGlmIChleHRyYSAhPT0gMCkge1xuICAgICAgICAgIGxjIC09IGJhc2VfbGVuZ3RoW2NvZGVdO1xuICAgICAgICAgIHNlbmRfYml0cyhzLCBsYywgZXh0cmEpOyAgICAgICAvKiBzZW5kIHRoZSBleHRyYSBsZW5ndGggYml0cyAqL1xuICAgICAgICB9XG4gICAgICAgIGRpc3QtLTsgLyogZGlzdCBpcyBub3cgdGhlIG1hdGNoIGRpc3RhbmNlIC0gMSAqL1xuICAgICAgICBjb2RlID0gZF9jb2RlKGRpc3QpO1xuICAgICAgICAvL0Fzc2VydCAoY29kZSA8IERfQ09ERVMsIFwiYmFkIGRfY29kZVwiKTtcblxuICAgICAgICBzZW5kX2NvZGUocywgY29kZSwgZHRyZWUpOyAgICAgICAvKiBzZW5kIHRoZSBkaXN0YW5jZSBjb2RlICovXG4gICAgICAgIGV4dHJhID0gZXh0cmFfZGJpdHNbY29kZV07XG4gICAgICAgIGlmIChleHRyYSAhPT0gMCkge1xuICAgICAgICAgIGRpc3QgLT0gYmFzZV9kaXN0W2NvZGVdO1xuICAgICAgICAgIHNlbmRfYml0cyhzLCBkaXN0LCBleHRyYSk7ICAgLyogc2VuZCB0aGUgZXh0cmEgZGlzdGFuY2UgYml0cyAqL1xuICAgICAgICB9XG4gICAgICB9IC8qIGxpdGVyYWwgb3IgbWF0Y2ggcGFpciA/ICovXG5cbiAgICAgIC8qIENoZWNrIHRoYXQgdGhlIG92ZXJsYXkgYmV0d2VlbiBwZW5kaW5nX2J1ZiBhbmQgZF9idWYrbF9idWYgaXMgb2s6ICovXG4gICAgICAvL0Fzc2VydCgodUludCkocy0+cGVuZGluZykgPCBzLT5saXRfYnVmc2l6ZSArIDIqbHgsXG4gICAgICAvLyAgICAgICBcInBlbmRpbmdCdWYgb3ZlcmZsb3dcIik7XG5cbiAgICB9IHdoaWxlIChseCA8IHMubGFzdF9saXQpO1xuICB9XG5cbiAgc2VuZF9jb2RlKHMsIEVORF9CTE9DSywgbHRyZWUpO1xufVxuXG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogQ29uc3RydWN0IG9uZSBIdWZmbWFuIHRyZWUgYW5kIGFzc2lnbnMgdGhlIGNvZGUgYml0IHN0cmluZ3MgYW5kIGxlbmd0aHMuXG4gKiBVcGRhdGUgdGhlIHRvdGFsIGJpdCBsZW5ndGggZm9yIHRoZSBjdXJyZW50IGJsb2NrLlxuICogSU4gYXNzZXJ0aW9uOiB0aGUgZmllbGQgZnJlcSBpcyBzZXQgZm9yIGFsbCB0cmVlIGVsZW1lbnRzLlxuICogT1VUIGFzc2VydGlvbnM6IHRoZSBmaWVsZHMgbGVuIGFuZCBjb2RlIGFyZSBzZXQgdG8gdGhlIG9wdGltYWwgYml0IGxlbmd0aFxuICogICAgIGFuZCBjb3JyZXNwb25kaW5nIGNvZGUuIFRoZSBsZW5ndGggb3B0X2xlbiBpcyB1cGRhdGVkOyBzdGF0aWNfbGVuIGlzXG4gKiAgICAgYWxzbyB1cGRhdGVkIGlmIHN0cmVlIGlzIG5vdCBudWxsLiBUaGUgZmllbGQgbWF4X2NvZGUgaXMgc2V0LlxuICovXG5mdW5jdGlvbiBidWlsZF90cmVlKHMsIGRlc2MpXG4vLyAgICBkZWZsYXRlX3N0YXRlICpzO1xuLy8gICAgdHJlZV9kZXNjICpkZXNjOyAvKiB0aGUgdHJlZSBkZXNjcmlwdG9yICovXG57XG4gIHZhciB0cmVlICAgICA9IGRlc2MuZHluX3RyZWU7XG4gIHZhciBzdHJlZSAgICA9IGRlc2Muc3RhdF9kZXNjLnN0YXRpY190cmVlO1xuICB2YXIgaGFzX3N0cmVlID0gZGVzYy5zdGF0X2Rlc2MuaGFzX3N0cmVlO1xuICB2YXIgZWxlbXMgICAgPSBkZXNjLnN0YXRfZGVzYy5lbGVtcztcbiAgdmFyIG4sIG07ICAgICAgICAgIC8qIGl0ZXJhdGUgb3ZlciBoZWFwIGVsZW1lbnRzICovXG4gIHZhciBtYXhfY29kZSA9IC0xOyAvKiBsYXJnZXN0IGNvZGUgd2l0aCBub24gemVybyBmcmVxdWVuY3kgKi9cbiAgdmFyIG5vZGU7ICAgICAgICAgIC8qIG5ldyBub2RlIGJlaW5nIGNyZWF0ZWQgKi9cblxuICAvKiBDb25zdHJ1Y3QgdGhlIGluaXRpYWwgaGVhcCwgd2l0aCBsZWFzdCBmcmVxdWVudCBlbGVtZW50IGluXG4gICAqIGhlYXBbU01BTExFU1RdLiBUaGUgc29ucyBvZiBoZWFwW25dIGFyZSBoZWFwWzIqbl0gYW5kIGhlYXBbMipuKzFdLlxuICAgKiBoZWFwWzBdIGlzIG5vdCB1c2VkLlxuICAgKi9cbiAgcy5oZWFwX2xlbiA9IDA7XG4gIHMuaGVhcF9tYXggPSBIRUFQX1NJWkU7XG5cbiAgZm9yIChuID0gMDsgbiA8IGVsZW1zOyBuKyspIHtcbiAgICBpZiAodHJlZVtuICogMl0vKi5GcmVxKi8gIT09IDApIHtcbiAgICAgIHMuaGVhcFsrK3MuaGVhcF9sZW5dID0gbWF4X2NvZGUgPSBuO1xuICAgICAgcy5kZXB0aFtuXSA9IDA7XG5cbiAgICB9IGVsc2Uge1xuICAgICAgdHJlZVtuICogMiArIDFdLyouTGVuKi8gPSAwO1xuICAgIH1cbiAgfVxuXG4gIC8qIFRoZSBwa3ppcCBmb3JtYXQgcmVxdWlyZXMgdGhhdCBhdCBsZWFzdCBvbmUgZGlzdGFuY2UgY29kZSBleGlzdHMsXG4gICAqIGFuZCB0aGF0IGF0IGxlYXN0IG9uZSBiaXQgc2hvdWxkIGJlIHNlbnQgZXZlbiBpZiB0aGVyZSBpcyBvbmx5IG9uZVxuICAgKiBwb3NzaWJsZSBjb2RlLiBTbyB0byBhdm9pZCBzcGVjaWFsIGNoZWNrcyBsYXRlciBvbiB3ZSBmb3JjZSBhdCBsZWFzdFxuICAgKiB0d28gY29kZXMgb2Ygbm9uIHplcm8gZnJlcXVlbmN5LlxuICAgKi9cbiAgd2hpbGUgKHMuaGVhcF9sZW4gPCAyKSB7XG4gICAgbm9kZSA9IHMuaGVhcFsrK3MuaGVhcF9sZW5dID0gKG1heF9jb2RlIDwgMiA/ICsrbWF4X2NvZGUgOiAwKTtcbiAgICB0cmVlW25vZGUgKiAyXS8qLkZyZXEqLyA9IDE7XG4gICAgcy5kZXB0aFtub2RlXSA9IDA7XG4gICAgcy5vcHRfbGVuLS07XG5cbiAgICBpZiAoaGFzX3N0cmVlKSB7XG4gICAgICBzLnN0YXRpY19sZW4gLT0gc3RyZWVbbm9kZSAqIDIgKyAxXS8qLkxlbiovO1xuICAgIH1cbiAgICAvKiBub2RlIGlzIDAgb3IgMSBzbyBpdCBkb2VzIG5vdCBoYXZlIGV4dHJhIGJpdHMgKi9cbiAgfVxuICBkZXNjLm1heF9jb2RlID0gbWF4X2NvZGU7XG5cbiAgLyogVGhlIGVsZW1lbnRzIGhlYXBbaGVhcF9sZW4vMisxIC4uIGhlYXBfbGVuXSBhcmUgbGVhdmVzIG9mIHRoZSB0cmVlLFxuICAgKiBlc3RhYmxpc2ggc3ViLWhlYXBzIG9mIGluY3JlYXNpbmcgbGVuZ3RoczpcbiAgICovXG4gIGZvciAobiA9IChzLmhlYXBfbGVuID4+IDEvKmludCAvMiovKTsgbiA+PSAxOyBuLS0pIHsgcHFkb3duaGVhcChzLCB0cmVlLCBuKTsgfVxuXG4gIC8qIENvbnN0cnVjdCB0aGUgSHVmZm1hbiB0cmVlIGJ5IHJlcGVhdGVkbHkgY29tYmluaW5nIHRoZSBsZWFzdCB0d29cbiAgICogZnJlcXVlbnQgbm9kZXMuXG4gICAqL1xuICBub2RlID0gZWxlbXM7ICAgICAgICAgICAgICAvKiBuZXh0IGludGVybmFsIG5vZGUgb2YgdGhlIHRyZWUgKi9cbiAgZG8ge1xuICAgIC8vcHFyZW1vdmUocywgdHJlZSwgbik7ICAvKiBuID0gbm9kZSBvZiBsZWFzdCBmcmVxdWVuY3kgKi9cbiAgICAvKioqIHBxcmVtb3ZlICoqKi9cbiAgICBuID0gcy5oZWFwWzEvKlNNQUxMRVNUKi9dO1xuICAgIHMuaGVhcFsxLypTTUFMTEVTVCovXSA9IHMuaGVhcFtzLmhlYXBfbGVuLS1dO1xuICAgIHBxZG93bmhlYXAocywgdHJlZSwgMS8qU01BTExFU1QqLyk7XG4gICAgLyoqKi9cblxuICAgIG0gPSBzLmhlYXBbMS8qU01BTExFU1QqL107IC8qIG0gPSBub2RlIG9mIG5leHQgbGVhc3QgZnJlcXVlbmN5ICovXG5cbiAgICBzLmhlYXBbLS1zLmhlYXBfbWF4XSA9IG47IC8qIGtlZXAgdGhlIG5vZGVzIHNvcnRlZCBieSBmcmVxdWVuY3kgKi9cbiAgICBzLmhlYXBbLS1zLmhlYXBfbWF4XSA9IG07XG5cbiAgICAvKiBDcmVhdGUgYSBuZXcgbm9kZSBmYXRoZXIgb2YgbiBhbmQgbSAqL1xuICAgIHRyZWVbbm9kZSAqIDJdLyouRnJlcSovID0gdHJlZVtuICogMl0vKi5GcmVxKi8gKyB0cmVlW20gKiAyXS8qLkZyZXEqLztcbiAgICBzLmRlcHRoW25vZGVdID0gKHMuZGVwdGhbbl0gPj0gcy5kZXB0aFttXSA/IHMuZGVwdGhbbl0gOiBzLmRlcHRoW21dKSArIDE7XG4gICAgdHJlZVtuICogMiArIDFdLyouRGFkKi8gPSB0cmVlW20gKiAyICsgMV0vKi5EYWQqLyA9IG5vZGU7XG5cbiAgICAvKiBhbmQgaW5zZXJ0IHRoZSBuZXcgbm9kZSBpbiB0aGUgaGVhcCAqL1xuICAgIHMuaGVhcFsxLypTTUFMTEVTVCovXSA9IG5vZGUrKztcbiAgICBwcWRvd25oZWFwKHMsIHRyZWUsIDEvKlNNQUxMRVNUKi8pO1xuXG4gIH0gd2hpbGUgKHMuaGVhcF9sZW4gPj0gMik7XG5cbiAgcy5oZWFwWy0tcy5oZWFwX21heF0gPSBzLmhlYXBbMS8qU01BTExFU1QqL107XG5cbiAgLyogQXQgdGhpcyBwb2ludCwgdGhlIGZpZWxkcyBmcmVxIGFuZCBkYWQgYXJlIHNldC4gV2UgY2FuIG5vd1xuICAgKiBnZW5lcmF0ZSB0aGUgYml0IGxlbmd0aHMuXG4gICAqL1xuICBnZW5fYml0bGVuKHMsIGRlc2MpO1xuXG4gIC8qIFRoZSBmaWVsZCBsZW4gaXMgbm93IHNldCwgd2UgY2FuIGdlbmVyYXRlIHRoZSBiaXQgY29kZXMgKi9cbiAgZ2VuX2NvZGVzKHRyZWUsIG1heF9jb2RlLCBzLmJsX2NvdW50KTtcbn1cblxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIFNjYW4gYSBsaXRlcmFsIG9yIGRpc3RhbmNlIHRyZWUgdG8gZGV0ZXJtaW5lIHRoZSBmcmVxdWVuY2llcyBvZiB0aGUgY29kZXNcbiAqIGluIHRoZSBiaXQgbGVuZ3RoIHRyZWUuXG4gKi9cbmZ1bmN0aW9uIHNjYW5fdHJlZShzLCB0cmVlLCBtYXhfY29kZSlcbi8vICAgIGRlZmxhdGVfc3RhdGUgKnM7XG4vLyAgICBjdF9kYXRhICp0cmVlOyAgIC8qIHRoZSB0cmVlIHRvIGJlIHNjYW5uZWQgKi9cbi8vICAgIGludCBtYXhfY29kZTsgICAgLyogYW5kIGl0cyBsYXJnZXN0IGNvZGUgb2Ygbm9uIHplcm8gZnJlcXVlbmN5ICovXG57XG4gIHZhciBuOyAgICAgICAgICAgICAgICAgICAgIC8qIGl0ZXJhdGVzIG92ZXIgYWxsIHRyZWUgZWxlbWVudHMgKi9cbiAgdmFyIHByZXZsZW4gPSAtMTsgICAgICAgICAgLyogbGFzdCBlbWl0dGVkIGxlbmd0aCAqL1xuICB2YXIgY3VybGVuOyAgICAgICAgICAgICAgICAvKiBsZW5ndGggb2YgY3VycmVudCBjb2RlICovXG5cbiAgdmFyIG5leHRsZW4gPSB0cmVlWzAgKiAyICsgMV0vKi5MZW4qLzsgLyogbGVuZ3RoIG9mIG5leHQgY29kZSAqL1xuXG4gIHZhciBjb3VudCA9IDA7ICAgICAgICAgICAgIC8qIHJlcGVhdCBjb3VudCBvZiB0aGUgY3VycmVudCBjb2RlICovXG4gIHZhciBtYXhfY291bnQgPSA3OyAgICAgICAgIC8qIG1heCByZXBlYXQgY291bnQgKi9cbiAgdmFyIG1pbl9jb3VudCA9IDQ7ICAgICAgICAgLyogbWluIHJlcGVhdCBjb3VudCAqL1xuXG4gIGlmIChuZXh0bGVuID09PSAwKSB7XG4gICAgbWF4X2NvdW50ID0gMTM4O1xuICAgIG1pbl9jb3VudCA9IDM7XG4gIH1cbiAgdHJlZVsobWF4X2NvZGUgKyAxKSAqIDIgKyAxXS8qLkxlbiovID0gMHhmZmZmOyAvKiBndWFyZCAqL1xuXG4gIGZvciAobiA9IDA7IG4gPD0gbWF4X2NvZGU7IG4rKykge1xuICAgIGN1cmxlbiA9IG5leHRsZW47XG4gICAgbmV4dGxlbiA9IHRyZWVbKG4gKyAxKSAqIDIgKyAxXS8qLkxlbiovO1xuXG4gICAgaWYgKCsrY291bnQgPCBtYXhfY291bnQgJiYgY3VybGVuID09PSBuZXh0bGVuKSB7XG4gICAgICBjb250aW51ZTtcblxuICAgIH0gZWxzZSBpZiAoY291bnQgPCBtaW5fY291bnQpIHtcbiAgICAgIHMuYmxfdHJlZVtjdXJsZW4gKiAyXS8qLkZyZXEqLyArPSBjb3VudDtcblxuICAgIH0gZWxzZSBpZiAoY3VybGVuICE9PSAwKSB7XG5cbiAgICAgIGlmIChjdXJsZW4gIT09IHByZXZsZW4pIHsgcy5ibF90cmVlW2N1cmxlbiAqIDJdLyouRnJlcSovKys7IH1cbiAgICAgIHMuYmxfdHJlZVtSRVBfM182ICogMl0vKi5GcmVxKi8rKztcblxuICAgIH0gZWxzZSBpZiAoY291bnQgPD0gMTApIHtcbiAgICAgIHMuYmxfdHJlZVtSRVBaXzNfMTAgKiAyXS8qLkZyZXEqLysrO1xuXG4gICAgfSBlbHNlIHtcbiAgICAgIHMuYmxfdHJlZVtSRVBaXzExXzEzOCAqIDJdLyouRnJlcSovKys7XG4gICAgfVxuXG4gICAgY291bnQgPSAwO1xuICAgIHByZXZsZW4gPSBjdXJsZW47XG5cbiAgICBpZiAobmV4dGxlbiA9PT0gMCkge1xuICAgICAgbWF4X2NvdW50ID0gMTM4O1xuICAgICAgbWluX2NvdW50ID0gMztcblxuICAgIH0gZWxzZSBpZiAoY3VybGVuID09PSBuZXh0bGVuKSB7XG4gICAgICBtYXhfY291bnQgPSA2O1xuICAgICAgbWluX2NvdW50ID0gMztcblxuICAgIH0gZWxzZSB7XG4gICAgICBtYXhfY291bnQgPSA3O1xuICAgICAgbWluX2NvdW50ID0gNDtcbiAgICB9XG4gIH1cbn1cblxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIFNlbmQgYSBsaXRlcmFsIG9yIGRpc3RhbmNlIHRyZWUgaW4gY29tcHJlc3NlZCBmb3JtLCB1c2luZyB0aGUgY29kZXMgaW5cbiAqIGJsX3RyZWUuXG4gKi9cbmZ1bmN0aW9uIHNlbmRfdHJlZShzLCB0cmVlLCBtYXhfY29kZSlcbi8vICAgIGRlZmxhdGVfc3RhdGUgKnM7XG4vLyAgICBjdF9kYXRhICp0cmVlOyAvKiB0aGUgdHJlZSB0byBiZSBzY2FubmVkICovXG4vLyAgICBpbnQgbWF4X2NvZGU7ICAgICAgIC8qIGFuZCBpdHMgbGFyZ2VzdCBjb2RlIG9mIG5vbiB6ZXJvIGZyZXF1ZW5jeSAqL1xue1xuICB2YXIgbjsgICAgICAgICAgICAgICAgICAgICAvKiBpdGVyYXRlcyBvdmVyIGFsbCB0cmVlIGVsZW1lbnRzICovXG4gIHZhciBwcmV2bGVuID0gLTE7ICAgICAgICAgIC8qIGxhc3QgZW1pdHRlZCBsZW5ndGggKi9cbiAgdmFyIGN1cmxlbjsgICAgICAgICAgICAgICAgLyogbGVuZ3RoIG9mIGN1cnJlbnQgY29kZSAqL1xuXG4gIHZhciBuZXh0bGVuID0gdHJlZVswICogMiArIDFdLyouTGVuKi87IC8qIGxlbmd0aCBvZiBuZXh0IGNvZGUgKi9cblxuICB2YXIgY291bnQgPSAwOyAgICAgICAgICAgICAvKiByZXBlYXQgY291bnQgb2YgdGhlIGN1cnJlbnQgY29kZSAqL1xuICB2YXIgbWF4X2NvdW50ID0gNzsgICAgICAgICAvKiBtYXggcmVwZWF0IGNvdW50ICovXG4gIHZhciBtaW5fY291bnQgPSA0OyAgICAgICAgIC8qIG1pbiByZXBlYXQgY291bnQgKi9cblxuICAvKiB0cmVlW21heF9jb2RlKzFdLkxlbiA9IC0xOyAqLyAgLyogZ3VhcmQgYWxyZWFkeSBzZXQgKi9cbiAgaWYgKG5leHRsZW4gPT09IDApIHtcbiAgICBtYXhfY291bnQgPSAxMzg7XG4gICAgbWluX2NvdW50ID0gMztcbiAgfVxuXG4gIGZvciAobiA9IDA7IG4gPD0gbWF4X2NvZGU7IG4rKykge1xuICAgIGN1cmxlbiA9IG5leHRsZW47XG4gICAgbmV4dGxlbiA9IHRyZWVbKG4gKyAxKSAqIDIgKyAxXS8qLkxlbiovO1xuXG4gICAgaWYgKCsrY291bnQgPCBtYXhfY291bnQgJiYgY3VybGVuID09PSBuZXh0bGVuKSB7XG4gICAgICBjb250aW51ZTtcblxuICAgIH0gZWxzZSBpZiAoY291bnQgPCBtaW5fY291bnQpIHtcbiAgICAgIGRvIHsgc2VuZF9jb2RlKHMsIGN1cmxlbiwgcy5ibF90cmVlKTsgfSB3aGlsZSAoLS1jb3VudCAhPT0gMCk7XG5cbiAgICB9IGVsc2UgaWYgKGN1cmxlbiAhPT0gMCkge1xuICAgICAgaWYgKGN1cmxlbiAhPT0gcHJldmxlbikge1xuICAgICAgICBzZW5kX2NvZGUocywgY3VybGVuLCBzLmJsX3RyZWUpO1xuICAgICAgICBjb3VudC0tO1xuICAgICAgfVxuICAgICAgLy9Bc3NlcnQoY291bnQgPj0gMyAmJiBjb3VudCA8PSA2LCBcIiAzXzY/XCIpO1xuICAgICAgc2VuZF9jb2RlKHMsIFJFUF8zXzYsIHMuYmxfdHJlZSk7XG4gICAgICBzZW5kX2JpdHMocywgY291bnQgLSAzLCAyKTtcblxuICAgIH0gZWxzZSBpZiAoY291bnQgPD0gMTApIHtcbiAgICAgIHNlbmRfY29kZShzLCBSRVBaXzNfMTAsIHMuYmxfdHJlZSk7XG4gICAgICBzZW5kX2JpdHMocywgY291bnQgLSAzLCAzKTtcblxuICAgIH0gZWxzZSB7XG4gICAgICBzZW5kX2NvZGUocywgUkVQWl8xMV8xMzgsIHMuYmxfdHJlZSk7XG4gICAgICBzZW5kX2JpdHMocywgY291bnQgLSAxMSwgNyk7XG4gICAgfVxuXG4gICAgY291bnQgPSAwO1xuICAgIHByZXZsZW4gPSBjdXJsZW47XG4gICAgaWYgKG5leHRsZW4gPT09IDApIHtcbiAgICAgIG1heF9jb3VudCA9IDEzODtcbiAgICAgIG1pbl9jb3VudCA9IDM7XG5cbiAgICB9IGVsc2UgaWYgKGN1cmxlbiA9PT0gbmV4dGxlbikge1xuICAgICAgbWF4X2NvdW50ID0gNjtcbiAgICAgIG1pbl9jb3VudCA9IDM7XG5cbiAgICB9IGVsc2Uge1xuICAgICAgbWF4X2NvdW50ID0gNztcbiAgICAgIG1pbl9jb3VudCA9IDQ7XG4gICAgfVxuICB9XG59XG5cblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBDb25zdHJ1Y3QgdGhlIEh1ZmZtYW4gdHJlZSBmb3IgdGhlIGJpdCBsZW5ndGhzIGFuZCByZXR1cm4gdGhlIGluZGV4IGluXG4gKiBibF9vcmRlciBvZiB0aGUgbGFzdCBiaXQgbGVuZ3RoIGNvZGUgdG8gc2VuZC5cbiAqL1xuZnVuY3Rpb24gYnVpbGRfYmxfdHJlZShzKSB7XG4gIHZhciBtYXhfYmxpbmRleDsgIC8qIGluZGV4IG9mIGxhc3QgYml0IGxlbmd0aCBjb2RlIG9mIG5vbiB6ZXJvIGZyZXEgKi9cblxuICAvKiBEZXRlcm1pbmUgdGhlIGJpdCBsZW5ndGggZnJlcXVlbmNpZXMgZm9yIGxpdGVyYWwgYW5kIGRpc3RhbmNlIHRyZWVzICovXG4gIHNjYW5fdHJlZShzLCBzLmR5bl9sdHJlZSwgcy5sX2Rlc2MubWF4X2NvZGUpO1xuICBzY2FuX3RyZWUocywgcy5keW5fZHRyZWUsIHMuZF9kZXNjLm1heF9jb2RlKTtcblxuICAvKiBCdWlsZCB0aGUgYml0IGxlbmd0aCB0cmVlOiAqL1xuICBidWlsZF90cmVlKHMsIHMuYmxfZGVzYyk7XG4gIC8qIG9wdF9sZW4gbm93IGluY2x1ZGVzIHRoZSBsZW5ndGggb2YgdGhlIHRyZWUgcmVwcmVzZW50YXRpb25zLCBleGNlcHRcbiAgICogdGhlIGxlbmd0aHMgb2YgdGhlIGJpdCBsZW5ndGhzIGNvZGVzIGFuZCB0aGUgNSs1KzQgYml0cyBmb3IgdGhlIGNvdW50cy5cbiAgICovXG5cbiAgLyogRGV0ZXJtaW5lIHRoZSBudW1iZXIgb2YgYml0IGxlbmd0aCBjb2RlcyB0byBzZW5kLiBUaGUgcGt6aXAgZm9ybWF0XG4gICAqIHJlcXVpcmVzIHRoYXQgYXQgbGVhc3QgNCBiaXQgbGVuZ3RoIGNvZGVzIGJlIHNlbnQuIChhcHBub3RlLnR4dCBzYXlzXG4gICAqIDMgYnV0IHRoZSBhY3R1YWwgdmFsdWUgdXNlZCBpcyA0LilcbiAgICovXG4gIGZvciAobWF4X2JsaW5kZXggPSBCTF9DT0RFUyAtIDE7IG1heF9ibGluZGV4ID49IDM7IG1heF9ibGluZGV4LS0pIHtcbiAgICBpZiAocy5ibF90cmVlW2JsX29yZGVyW21heF9ibGluZGV4XSAqIDIgKyAxXS8qLkxlbiovICE9PSAwKSB7XG4gICAgICBicmVhaztcbiAgICB9XG4gIH1cbiAgLyogVXBkYXRlIG9wdF9sZW4gdG8gaW5jbHVkZSB0aGUgYml0IGxlbmd0aCB0cmVlIGFuZCBjb3VudHMgKi9cbiAgcy5vcHRfbGVuICs9IDMgKiAobWF4X2JsaW5kZXggKyAxKSArIDUgKyA1ICsgNDtcbiAgLy9UcmFjZXYoKHN0ZGVyciwgXCJcXG5keW4gdHJlZXM6IGR5biAlbGQsIHN0YXQgJWxkXCIsXG4gIC8vICAgICAgICBzLT5vcHRfbGVuLCBzLT5zdGF0aWNfbGVuKSk7XG5cbiAgcmV0dXJuIG1heF9ibGluZGV4O1xufVxuXG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogU2VuZCB0aGUgaGVhZGVyIGZvciBhIGJsb2NrIHVzaW5nIGR5bmFtaWMgSHVmZm1hbiB0cmVlczogdGhlIGNvdW50cywgdGhlXG4gKiBsZW5ndGhzIG9mIHRoZSBiaXQgbGVuZ3RoIGNvZGVzLCB0aGUgbGl0ZXJhbCB0cmVlIGFuZCB0aGUgZGlzdGFuY2UgdHJlZS5cbiAqIElOIGFzc2VydGlvbjogbGNvZGVzID49IDI1NywgZGNvZGVzID49IDEsIGJsY29kZXMgPj0gNC5cbiAqL1xuZnVuY3Rpb24gc2VuZF9hbGxfdHJlZXMocywgbGNvZGVzLCBkY29kZXMsIGJsY29kZXMpXG4vLyAgICBkZWZsYXRlX3N0YXRlICpzO1xuLy8gICAgaW50IGxjb2RlcywgZGNvZGVzLCBibGNvZGVzOyAvKiBudW1iZXIgb2YgY29kZXMgZm9yIGVhY2ggdHJlZSAqL1xue1xuICB2YXIgcmFuazsgICAgICAgICAgICAgICAgICAgIC8qIGluZGV4IGluIGJsX29yZGVyICovXG5cbiAgLy9Bc3NlcnQgKGxjb2RlcyA+PSAyNTcgJiYgZGNvZGVzID49IDEgJiYgYmxjb2RlcyA+PSA0LCBcIm5vdCBlbm91Z2ggY29kZXNcIik7XG4gIC8vQXNzZXJ0IChsY29kZXMgPD0gTF9DT0RFUyAmJiBkY29kZXMgPD0gRF9DT0RFUyAmJiBibGNvZGVzIDw9IEJMX0NPREVTLFxuICAvLyAgICAgICAgXCJ0b28gbWFueSBjb2Rlc1wiKTtcbiAgLy9UcmFjZXYoKHN0ZGVyciwgXCJcXG5ibCBjb3VudHM6IFwiKSk7XG4gIHNlbmRfYml0cyhzLCBsY29kZXMgLSAyNTcsIDUpOyAvKiBub3QgKzI1NSBhcyBzdGF0ZWQgaW4gYXBwbm90ZS50eHQgKi9cbiAgc2VuZF9iaXRzKHMsIGRjb2RlcyAtIDEsICAgNSk7XG4gIHNlbmRfYml0cyhzLCBibGNvZGVzIC0gNCwgIDQpOyAvKiBub3QgLTMgYXMgc3RhdGVkIGluIGFwcG5vdGUudHh0ICovXG4gIGZvciAocmFuayA9IDA7IHJhbmsgPCBibGNvZGVzOyByYW5rKyspIHtcbiAgICAvL1RyYWNldigoc3RkZXJyLCBcIlxcbmJsIGNvZGUgJTJkIFwiLCBibF9vcmRlcltyYW5rXSkpO1xuICAgIHNlbmRfYml0cyhzLCBzLmJsX3RyZWVbYmxfb3JkZXJbcmFua10gKiAyICsgMV0vKi5MZW4qLywgMyk7XG4gIH1cbiAgLy9UcmFjZXYoKHN0ZGVyciwgXCJcXG5ibCB0cmVlOiBzZW50ICVsZFwiLCBzLT5iaXRzX3NlbnQpKTtcblxuICBzZW5kX3RyZWUocywgcy5keW5fbHRyZWUsIGxjb2RlcyAtIDEpOyAvKiBsaXRlcmFsIHRyZWUgKi9cbiAgLy9UcmFjZXYoKHN0ZGVyciwgXCJcXG5saXQgdHJlZTogc2VudCAlbGRcIiwgcy0+Yml0c19zZW50KSk7XG5cbiAgc2VuZF90cmVlKHMsIHMuZHluX2R0cmVlLCBkY29kZXMgLSAxKTsgLyogZGlzdGFuY2UgdHJlZSAqL1xuICAvL1RyYWNldigoc3RkZXJyLCBcIlxcbmRpc3QgdHJlZTogc2VudCAlbGRcIiwgcy0+Yml0c19zZW50KSk7XG59XG5cblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBDaGVjayBpZiB0aGUgZGF0YSB0eXBlIGlzIFRFWFQgb3IgQklOQVJZLCB1c2luZyB0aGUgZm9sbG93aW5nIGFsZ29yaXRobTpcbiAqIC0gVEVYVCBpZiB0aGUgdHdvIGNvbmRpdGlvbnMgYmVsb3cgYXJlIHNhdGlzZmllZDpcbiAqICAgIGEpIFRoZXJlIGFyZSBubyBub24tcG9ydGFibGUgY29udHJvbCBjaGFyYWN0ZXJzIGJlbG9uZ2luZyB0byB0aGVcbiAqICAgICAgIFwiYmxhY2sgbGlzdFwiICgwLi42LCAxNC4uMjUsIDI4Li4zMSkuXG4gKiAgICBiKSBUaGVyZSBpcyBhdCBsZWFzdCBvbmUgcHJpbnRhYmxlIGNoYXJhY3RlciBiZWxvbmdpbmcgdG8gdGhlXG4gKiAgICAgICBcIndoaXRlIGxpc3RcIiAoOSB7VEFCfSwgMTAge0xGfSwgMTMge0NSfSwgMzIuLjI1NSkuXG4gKiAtIEJJTkFSWSBvdGhlcndpc2UuXG4gKiAtIFRoZSBmb2xsb3dpbmcgcGFydGlhbGx5LXBvcnRhYmxlIGNvbnRyb2wgY2hhcmFjdGVycyBmb3JtIGFcbiAqICAgXCJncmF5IGxpc3RcIiB0aGF0IGlzIGlnbm9yZWQgaW4gdGhpcyBkZXRlY3Rpb24gYWxnb3JpdGhtOlxuICogICAoNyB7QkVMfSwgOCB7QlN9LCAxMSB7VlR9LCAxMiB7RkZ9LCAyNiB7U1VCfSwgMjcge0VTQ30pLlxuICogSU4gYXNzZXJ0aW9uOiB0aGUgZmllbGRzIEZyZXEgb2YgZHluX2x0cmVlIGFyZSBzZXQuXG4gKi9cbmZ1bmN0aW9uIGRldGVjdF9kYXRhX3R5cGUocykge1xuICAvKiBibGFja19tYXNrIGlzIHRoZSBiaXQgbWFzayBvZiBibGFjay1saXN0ZWQgYnl0ZXNcbiAgICogc2V0IGJpdHMgMC4uNiwgMTQuLjI1LCBhbmQgMjguLjMxXG4gICAqIDB4ZjNmZmMwN2YgPSBiaW5hcnkgMTExMTAwMTExMTExMTExMTExMDAwMDAwMDExMTExMTFcbiAgICovXG4gIHZhciBibGFja19tYXNrID0gMHhmM2ZmYzA3ZjtcbiAgdmFyIG47XG5cbiAgLyogQ2hlY2sgZm9yIG5vbi10ZXh0dWFsIChcImJsYWNrLWxpc3RlZFwiKSBieXRlcy4gKi9cbiAgZm9yIChuID0gMDsgbiA8PSAzMTsgbisrLCBibGFja19tYXNrID4+Pj0gMSkge1xuICAgIGlmICgoYmxhY2tfbWFzayAmIDEpICYmIChzLmR5bl9sdHJlZVtuICogMl0vKi5GcmVxKi8gIT09IDApKSB7XG4gICAgICByZXR1cm4gWl9CSU5BUlk7XG4gICAgfVxuICB9XG5cbiAgLyogQ2hlY2sgZm9yIHRleHR1YWwgKFwid2hpdGUtbGlzdGVkXCIpIGJ5dGVzLiAqL1xuICBpZiAocy5keW5fbHRyZWVbOSAqIDJdLyouRnJlcSovICE9PSAwIHx8IHMuZHluX2x0cmVlWzEwICogMl0vKi5GcmVxKi8gIT09IDAgfHxcbiAgICAgIHMuZHluX2x0cmVlWzEzICogMl0vKi5GcmVxKi8gIT09IDApIHtcbiAgICByZXR1cm4gWl9URVhUO1xuICB9XG4gIGZvciAobiA9IDMyOyBuIDwgTElURVJBTFM7IG4rKykge1xuICAgIGlmIChzLmR5bl9sdHJlZVtuICogMl0vKi5GcmVxKi8gIT09IDApIHtcbiAgICAgIHJldHVybiBaX1RFWFQ7XG4gICAgfVxuICB9XG5cbiAgLyogVGhlcmUgYXJlIG5vIFwiYmxhY2stbGlzdGVkXCIgb3IgXCJ3aGl0ZS1saXN0ZWRcIiBieXRlczpcbiAgICogdGhpcyBzdHJlYW0gZWl0aGVyIGlzIGVtcHR5IG9yIGhhcyB0b2xlcmF0ZWQgKFwiZ3JheS1saXN0ZWRcIikgYnl0ZXMgb25seS5cbiAgICovXG4gIHJldHVybiBaX0JJTkFSWTtcbn1cblxuXG52YXIgc3RhdGljX2luaXRfZG9uZSA9IGZhbHNlO1xuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIEluaXRpYWxpemUgdGhlIHRyZWUgZGF0YSBzdHJ1Y3R1cmVzIGZvciBhIG5ldyB6bGliIHN0cmVhbS5cbiAqL1xuZnVuY3Rpb24gX3RyX2luaXQocylcbntcblxuICBpZiAoIXN0YXRpY19pbml0X2RvbmUpIHtcbiAgICB0cl9zdGF0aWNfaW5pdCgpO1xuICAgIHN0YXRpY19pbml0X2RvbmUgPSB0cnVlO1xuICB9XG5cbiAgcy5sX2Rlc2MgID0gbmV3IFRyZWVEZXNjKHMuZHluX2x0cmVlLCBzdGF0aWNfbF9kZXNjKTtcbiAgcy5kX2Rlc2MgID0gbmV3IFRyZWVEZXNjKHMuZHluX2R0cmVlLCBzdGF0aWNfZF9kZXNjKTtcbiAgcy5ibF9kZXNjID0gbmV3IFRyZWVEZXNjKHMuYmxfdHJlZSwgc3RhdGljX2JsX2Rlc2MpO1xuXG4gIHMuYmlfYnVmID0gMDtcbiAgcy5iaV92YWxpZCA9IDA7XG5cbiAgLyogSW5pdGlhbGl6ZSB0aGUgZmlyc3QgYmxvY2sgb2YgdGhlIGZpcnN0IGZpbGU6ICovXG4gIGluaXRfYmxvY2socyk7XG59XG5cblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBTZW5kIGEgc3RvcmVkIGJsb2NrXG4gKi9cbmZ1bmN0aW9uIF90cl9zdG9yZWRfYmxvY2socywgYnVmLCBzdG9yZWRfbGVuLCBsYXN0KVxuLy9EZWZsYXRlU3RhdGUgKnM7XG4vL2NoYXJmICpidWY7ICAgICAgIC8qIGlucHV0IGJsb2NrICovXG4vL3VsZyBzdG9yZWRfbGVuOyAgIC8qIGxlbmd0aCBvZiBpbnB1dCBibG9jayAqL1xuLy9pbnQgbGFzdDsgICAgICAgICAvKiBvbmUgaWYgdGhpcyBpcyB0aGUgbGFzdCBibG9jayBmb3IgYSBmaWxlICovXG57XG4gIHNlbmRfYml0cyhzLCAoU1RPUkVEX0JMT0NLIDw8IDEpICsgKGxhc3QgPyAxIDogMCksIDMpOyAgICAvKiBzZW5kIGJsb2NrIHR5cGUgKi9cbiAgY29weV9ibG9jayhzLCBidWYsIHN0b3JlZF9sZW4sIHRydWUpOyAvKiB3aXRoIGhlYWRlciAqL1xufVxuXG5cbi8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuICogU2VuZCBvbmUgZW1wdHkgc3RhdGljIGJsb2NrIHRvIGdpdmUgZW5vdWdoIGxvb2thaGVhZCBmb3IgaW5mbGF0ZS5cbiAqIFRoaXMgdGFrZXMgMTAgYml0cywgb2Ygd2hpY2ggNyBtYXkgcmVtYWluIGluIHRoZSBiaXQgYnVmZmVyLlxuICovXG5mdW5jdGlvbiBfdHJfYWxpZ24ocykge1xuICBzZW5kX2JpdHMocywgU1RBVElDX1RSRUVTIDw8IDEsIDMpO1xuICBzZW5kX2NvZGUocywgRU5EX0JMT0NLLCBzdGF0aWNfbHRyZWUpO1xuICBiaV9mbHVzaChzKTtcbn1cblxuXG4vKiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiAqIERldGVybWluZSB0aGUgYmVzdCBlbmNvZGluZyBmb3IgdGhlIGN1cnJlbnQgYmxvY2s6IGR5bmFtaWMgdHJlZXMsIHN0YXRpY1xuICogdHJlZXMgb3Igc3RvcmUsIGFuZCBvdXRwdXQgdGhlIGVuY29kZWQgYmxvY2sgdG8gdGhlIHppcCBmaWxlLlxuICovXG5mdW5jdGlvbiBfdHJfZmx1c2hfYmxvY2socywgYnVmLCBzdG9yZWRfbGVuLCBsYXN0KVxuLy9EZWZsYXRlU3RhdGUgKnM7XG4vL2NoYXJmICpidWY7ICAgICAgIC8qIGlucHV0IGJsb2NrLCBvciBOVUxMIGlmIHRvbyBvbGQgKi9cbi8vdWxnIHN0b3JlZF9sZW47ICAgLyogbGVuZ3RoIG9mIGlucHV0IGJsb2NrICovXG4vL2ludCBsYXN0OyAgICAgICAgIC8qIG9uZSBpZiB0aGlzIGlzIHRoZSBsYXN0IGJsb2NrIGZvciBhIGZpbGUgKi9cbntcbiAgdmFyIG9wdF9sZW5iLCBzdGF0aWNfbGVuYjsgIC8qIG9wdF9sZW4gYW5kIHN0YXRpY19sZW4gaW4gYnl0ZXMgKi9cbiAgdmFyIG1heF9ibGluZGV4ID0gMDsgICAgICAgIC8qIGluZGV4IG9mIGxhc3QgYml0IGxlbmd0aCBjb2RlIG9mIG5vbiB6ZXJvIGZyZXEgKi9cblxuICAvKiBCdWlsZCB0aGUgSHVmZm1hbiB0cmVlcyB1bmxlc3MgYSBzdG9yZWQgYmxvY2sgaXMgZm9yY2VkICovXG4gIGlmIChzLmxldmVsID4gMCkge1xuXG4gICAgLyogQ2hlY2sgaWYgdGhlIGZpbGUgaXMgYmluYXJ5IG9yIHRleHQgKi9cbiAgICBpZiAocy5zdHJtLmRhdGFfdHlwZSA9PT0gWl9VTktOT1dOKSB7XG4gICAgICBzLnN0cm0uZGF0YV90eXBlID0gZGV0ZWN0X2RhdGFfdHlwZShzKTtcbiAgICB9XG5cbiAgICAvKiBDb25zdHJ1Y3QgdGhlIGxpdGVyYWwgYW5kIGRpc3RhbmNlIHRyZWVzICovXG4gICAgYnVpbGRfdHJlZShzLCBzLmxfZGVzYyk7XG4gICAgLy8gVHJhY2V2KChzdGRlcnIsIFwiXFxubGl0IGRhdGE6IGR5biAlbGQsIHN0YXQgJWxkXCIsIHMtPm9wdF9sZW4sXG4gICAgLy8gICAgICAgIHMtPnN0YXRpY19sZW4pKTtcblxuICAgIGJ1aWxkX3RyZWUocywgcy5kX2Rlc2MpO1xuICAgIC8vIFRyYWNldigoc3RkZXJyLCBcIlxcbmRpc3QgZGF0YTogZHluICVsZCwgc3RhdCAlbGRcIiwgcy0+b3B0X2xlbixcbiAgICAvLyAgICAgICAgcy0+c3RhdGljX2xlbikpO1xuICAgIC8qIEF0IHRoaXMgcG9pbnQsIG9wdF9sZW4gYW5kIHN0YXRpY19sZW4gYXJlIHRoZSB0b3RhbCBiaXQgbGVuZ3RocyBvZlxuICAgICAqIHRoZSBjb21wcmVzc2VkIGJsb2NrIGRhdGEsIGV4Y2x1ZGluZyB0aGUgdHJlZSByZXByZXNlbnRhdGlvbnMuXG4gICAgICovXG5cbiAgICAvKiBCdWlsZCB0aGUgYml0IGxlbmd0aCB0cmVlIGZvciB0aGUgYWJvdmUgdHdvIHRyZWVzLCBhbmQgZ2V0IHRoZSBpbmRleFxuICAgICAqIGluIGJsX29yZGVyIG9mIHRoZSBsYXN0IGJpdCBsZW5ndGggY29kZSB0byBzZW5kLlxuICAgICAqL1xuICAgIG1heF9ibGluZGV4ID0gYnVpbGRfYmxfdHJlZShzKTtcblxuICAgIC8qIERldGVybWluZSB0aGUgYmVzdCBlbmNvZGluZy4gQ29tcHV0ZSB0aGUgYmxvY2sgbGVuZ3RocyBpbiBieXRlcy4gKi9cbiAgICBvcHRfbGVuYiA9IChzLm9wdF9sZW4gKyAzICsgNykgPj4+IDM7XG4gICAgc3RhdGljX2xlbmIgPSAocy5zdGF0aWNfbGVuICsgMyArIDcpID4+PiAzO1xuXG4gICAgLy8gVHJhY2V2KChzdGRlcnIsIFwiXFxub3B0ICVsdSglbHUpIHN0YXQgJWx1KCVsdSkgc3RvcmVkICVsdSBsaXQgJXUgXCIsXG4gICAgLy8gICAgICAgIG9wdF9sZW5iLCBzLT5vcHRfbGVuLCBzdGF0aWNfbGVuYiwgcy0+c3RhdGljX2xlbiwgc3RvcmVkX2xlbixcbiAgICAvLyAgICAgICAgcy0+bGFzdF9saXQpKTtcblxuICAgIGlmIChzdGF0aWNfbGVuYiA8PSBvcHRfbGVuYikgeyBvcHRfbGVuYiA9IHN0YXRpY19sZW5iOyB9XG5cbiAgfSBlbHNlIHtcbiAgICAvLyBBc3NlcnQoYnVmICE9IChjaGFyKikwLCBcImxvc3QgYnVmXCIpO1xuICAgIG9wdF9sZW5iID0gc3RhdGljX2xlbmIgPSBzdG9yZWRfbGVuICsgNTsgLyogZm9yY2UgYSBzdG9yZWQgYmxvY2sgKi9cbiAgfVxuXG4gIGlmICgoc3RvcmVkX2xlbiArIDQgPD0gb3B0X2xlbmIpICYmIChidWYgIT09IC0xKSkge1xuICAgIC8qIDQ6IHR3byB3b3JkcyBmb3IgdGhlIGxlbmd0aHMgKi9cblxuICAgIC8qIFRoZSB0ZXN0IGJ1ZiAhPSBOVUxMIGlzIG9ubHkgbmVjZXNzYXJ5IGlmIExJVF9CVUZTSVpFID4gV1NJWkUuXG4gICAgICogT3RoZXJ3aXNlIHdlIGNhbid0IGhhdmUgcHJvY2Vzc2VkIG1vcmUgdGhhbiBXU0laRSBpbnB1dCBieXRlcyBzaW5jZVxuICAgICAqIHRoZSBsYXN0IGJsb2NrIGZsdXNoLCBiZWNhdXNlIGNvbXByZXNzaW9uIHdvdWxkIGhhdmUgYmVlblxuICAgICAqIHN1Y2Nlc3NmdWwuIElmIExJVF9CVUZTSVpFIDw9IFdTSVpFLCBpdCBpcyBuZXZlciB0b28gbGF0ZSB0b1xuICAgICAqIHRyYW5zZm9ybSBhIGJsb2NrIGludG8gYSBzdG9yZWQgYmxvY2suXG4gICAgICovXG4gICAgX3RyX3N0b3JlZF9ibG9jayhzLCBidWYsIHN0b3JlZF9sZW4sIGxhc3QpO1xuXG4gIH0gZWxzZSBpZiAocy5zdHJhdGVneSA9PT0gWl9GSVhFRCB8fCBzdGF0aWNfbGVuYiA9PT0gb3B0X2xlbmIpIHtcblxuICAgIHNlbmRfYml0cyhzLCAoU1RBVElDX1RSRUVTIDw8IDEpICsgKGxhc3QgPyAxIDogMCksIDMpO1xuICAgIGNvbXByZXNzX2Jsb2NrKHMsIHN0YXRpY19sdHJlZSwgc3RhdGljX2R0cmVlKTtcblxuICB9IGVsc2Uge1xuICAgIHNlbmRfYml0cyhzLCAoRFlOX1RSRUVTIDw8IDEpICsgKGxhc3QgPyAxIDogMCksIDMpO1xuICAgIHNlbmRfYWxsX3RyZWVzKHMsIHMubF9kZXNjLm1heF9jb2RlICsgMSwgcy5kX2Rlc2MubWF4X2NvZGUgKyAxLCBtYXhfYmxpbmRleCArIDEpO1xuICAgIGNvbXByZXNzX2Jsb2NrKHMsIHMuZHluX2x0cmVlLCBzLmR5bl9kdHJlZSk7XG4gIH1cbiAgLy8gQXNzZXJ0IChzLT5jb21wcmVzc2VkX2xlbiA9PSBzLT5iaXRzX3NlbnQsIFwiYmFkIGNvbXByZXNzZWQgc2l6ZVwiKTtcbiAgLyogVGhlIGFib3ZlIGNoZWNrIGlzIG1hZGUgbW9kIDJeMzIsIGZvciBmaWxlcyBsYXJnZXIgdGhhbiA1MTIgTUJcbiAgICogYW5kIHVMb25nIGltcGxlbWVudGVkIG9uIDMyIGJpdHMuXG4gICAqL1xuICBpbml0X2Jsb2NrKHMpO1xuXG4gIGlmIChsYXN0KSB7XG4gICAgYmlfd2luZHVwKHMpO1xuICB9XG4gIC8vIFRyYWNldigoc3RkZXJyLFwiXFxuY29tcHJsZW4gJWx1KCVsdSkgXCIsIHMtPmNvbXByZXNzZWRfbGVuPj4zLFxuICAvLyAgICAgICBzLT5jb21wcmVzc2VkX2xlbi03Kmxhc3QpKTtcbn1cblxuLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4gKiBTYXZlIHRoZSBtYXRjaCBpbmZvIGFuZCB0YWxseSB0aGUgZnJlcXVlbmN5IGNvdW50cy4gUmV0dXJuIHRydWUgaWZcbiAqIHRoZSBjdXJyZW50IGJsb2NrIG11c3QgYmUgZmx1c2hlZC5cbiAqL1xuZnVuY3Rpb24gX3RyX3RhbGx5KHMsIGRpc3QsIGxjKVxuLy8gICAgZGVmbGF0ZV9zdGF0ZSAqcztcbi8vICAgIHVuc2lnbmVkIGRpc3Q7ICAvKiBkaXN0YW5jZSBvZiBtYXRjaGVkIHN0cmluZyAqL1xuLy8gICAgdW5zaWduZWQgbGM7ICAgIC8qIG1hdGNoIGxlbmd0aC1NSU5fTUFUQ0ggb3IgdW5tYXRjaGVkIGNoYXIgKGlmIGRpc3Q9PTApICovXG57XG4gIC8vdmFyIG91dF9sZW5ndGgsIGluX2xlbmd0aCwgZGNvZGU7XG5cbiAgcy5wZW5kaW5nX2J1ZltzLmRfYnVmICsgcy5sYXN0X2xpdCAqIDJdICAgICA9IChkaXN0ID4+PiA4KSAmIDB4ZmY7XG4gIHMucGVuZGluZ19idWZbcy5kX2J1ZiArIHMubGFzdF9saXQgKiAyICsgMV0gPSBkaXN0ICYgMHhmZjtcblxuICBzLnBlbmRpbmdfYnVmW3MubF9idWYgKyBzLmxhc3RfbGl0XSA9IGxjICYgMHhmZjtcbiAgcy5sYXN0X2xpdCsrO1xuXG4gIGlmIChkaXN0ID09PSAwKSB7XG4gICAgLyogbGMgaXMgdGhlIHVubWF0Y2hlZCBjaGFyICovXG4gICAgcy5keW5fbHRyZWVbbGMgKiAyXS8qLkZyZXEqLysrO1xuICB9IGVsc2Uge1xuICAgIHMubWF0Y2hlcysrO1xuICAgIC8qIEhlcmUsIGxjIGlzIHRoZSBtYXRjaCBsZW5ndGggLSBNSU5fTUFUQ0ggKi9cbiAgICBkaXN0LS07ICAgICAgICAgICAgIC8qIGRpc3QgPSBtYXRjaCBkaXN0YW5jZSAtIDEgKi9cbiAgICAvL0Fzc2VydCgodXNoKWRpc3QgPCAodXNoKU1BWF9ESVNUKHMpICYmXG4gICAgLy8gICAgICAgKHVzaClsYyA8PSAodXNoKShNQVhfTUFUQ0gtTUlOX01BVENIKSAmJlxuICAgIC8vICAgICAgICh1c2gpZF9jb2RlKGRpc3QpIDwgKHVzaClEX0NPREVTLCAgXCJfdHJfdGFsbHk6IGJhZCBtYXRjaFwiKTtcblxuICAgIHMuZHluX2x0cmVlWyhfbGVuZ3RoX2NvZGVbbGNdICsgTElURVJBTFMgKyAxKSAqIDJdLyouRnJlcSovKys7XG4gICAgcy5keW5fZHRyZWVbZF9jb2RlKGRpc3QpICogMl0vKi5GcmVxKi8rKztcbiAgfVxuXG4vLyAoISkgVGhpcyBibG9jayBpcyBkaXNhYmxlZCBpbiB6bGliIGRlZmFpbHRzLFxuLy8gZG9uJ3QgZW5hYmxlIGl0IGZvciBiaW5hcnkgY29tcGF0aWJpbGl0eVxuXG4vLyNpZmRlZiBUUlVOQ0FURV9CTE9DS1xuLy8gIC8qIFRyeSB0byBndWVzcyBpZiBpdCBpcyBwcm9maXRhYmxlIHRvIHN0b3AgdGhlIGN1cnJlbnQgYmxvY2sgaGVyZSAqL1xuLy8gIGlmICgocy5sYXN0X2xpdCAmIDB4MWZmZikgPT09IDAgJiYgcy5sZXZlbCA+IDIpIHtcbi8vICAgIC8qIENvbXB1dGUgYW4gdXBwZXIgYm91bmQgZm9yIHRoZSBjb21wcmVzc2VkIGxlbmd0aCAqL1xuLy8gICAgb3V0X2xlbmd0aCA9IHMubGFzdF9saXQqODtcbi8vICAgIGluX2xlbmd0aCA9IHMuc3Ryc3RhcnQgLSBzLmJsb2NrX3N0YXJ0O1xuLy9cbi8vICAgIGZvciAoZGNvZGUgPSAwOyBkY29kZSA8IERfQ09ERVM7IGRjb2RlKyspIHtcbi8vICAgICAgb3V0X2xlbmd0aCArPSBzLmR5bl9kdHJlZVtkY29kZSoyXS8qLkZyZXEqLyAqICg1ICsgZXh0cmFfZGJpdHNbZGNvZGVdKTtcbi8vICAgIH1cbi8vICAgIG91dF9sZW5ndGggPj4+PSAzO1xuLy8gICAgLy9UcmFjZXYoKHN0ZGVycixcIlxcbmxhc3RfbGl0ICV1LCBpbiAlbGQsIG91dCB+JWxkKCVsZCUlKSBcIixcbi8vICAgIC8vICAgICAgIHMtPmxhc3RfbGl0LCBpbl9sZW5ndGgsIG91dF9sZW5ndGgsXG4vLyAgICAvLyAgICAgICAxMDBMIC0gb3V0X2xlbmd0aCoxMDBML2luX2xlbmd0aCkpO1xuLy8gICAgaWYgKHMubWF0Y2hlcyA8IChzLmxhc3RfbGl0Pj4xKS8qaW50IC8yKi8gJiYgb3V0X2xlbmd0aCA8IChpbl9sZW5ndGg+PjEpLyppbnQgLzIqLykge1xuLy8gICAgICByZXR1cm4gdHJ1ZTtcbi8vICAgIH1cbi8vICB9XG4vLyNlbmRpZlxuXG4gIHJldHVybiAocy5sYXN0X2xpdCA9PT0gcy5saXRfYnVmc2l6ZSAtIDEpO1xuICAvKiBXZSBhdm9pZCBlcXVhbGl0eSB3aXRoIGxpdF9idWZzaXplIGJlY2F1c2Ugb2Ygd3JhcGFyb3VuZCBhdCA2NEtcbiAgICogb24gMTYgYml0IG1hY2hpbmVzIGFuZCBiZWNhdXNlIHN0b3JlZCBibG9ja3MgYXJlIHJlc3RyaWN0ZWQgdG9cbiAgICogNjRLLTEgYnl0ZXMuXG4gICAqL1xufVxuXG5leHBvcnRzLl90cl9pbml0ICA9IF90cl9pbml0O1xuZXhwb3J0cy5fdHJfc3RvcmVkX2Jsb2NrID0gX3RyX3N0b3JlZF9ibG9jaztcbmV4cG9ydHMuX3RyX2ZsdXNoX2Jsb2NrICA9IF90cl9mbHVzaF9ibG9jaztcbmV4cG9ydHMuX3RyX3RhbGx5ID0gX3RyX3RhbGx5O1xuZXhwb3J0cy5fdHJfYWxpZ24gPSBfdHJfYWxpZ247XG4iLCIndXNlIHN0cmljdCc7XG5cblxuZnVuY3Rpb24gWlN0cmVhbSgpIHtcbiAgLyogbmV4dCBpbnB1dCBieXRlICovXG4gIHRoaXMuaW5wdXQgPSBudWxsOyAvLyBKUyBzcGVjaWZpYywgYmVjYXVzZSB3ZSBoYXZlIG5vIHBvaW50ZXJzXG4gIHRoaXMubmV4dF9pbiA9IDA7XG4gIC8qIG51bWJlciBvZiBieXRlcyBhdmFpbGFibGUgYXQgaW5wdXQgKi9cbiAgdGhpcy5hdmFpbF9pbiA9IDA7XG4gIC8qIHRvdGFsIG51bWJlciBvZiBpbnB1dCBieXRlcyByZWFkIHNvIGZhciAqL1xuICB0aGlzLnRvdGFsX2luID0gMDtcbiAgLyogbmV4dCBvdXRwdXQgYnl0ZSBzaG91bGQgYmUgcHV0IHRoZXJlICovXG4gIHRoaXMub3V0cHV0ID0gbnVsbDsgLy8gSlMgc3BlY2lmaWMsIGJlY2F1c2Ugd2UgaGF2ZSBubyBwb2ludGVyc1xuICB0aGlzLm5leHRfb3V0ID0gMDtcbiAgLyogcmVtYWluaW5nIGZyZWUgc3BhY2UgYXQgb3V0cHV0ICovXG4gIHRoaXMuYXZhaWxfb3V0ID0gMDtcbiAgLyogdG90YWwgbnVtYmVyIG9mIGJ5dGVzIG91dHB1dCBzbyBmYXIgKi9cbiAgdGhpcy50b3RhbF9vdXQgPSAwO1xuICAvKiBsYXN0IGVycm9yIG1lc3NhZ2UsIE5VTEwgaWYgbm8gZXJyb3IgKi9cbiAgdGhpcy5tc2cgPSAnJy8qWl9OVUxMKi87XG4gIC8qIG5vdCB2aXNpYmxlIGJ5IGFwcGxpY2F0aW9ucyAqL1xuICB0aGlzLnN0YXRlID0gbnVsbDtcbiAgLyogYmVzdCBndWVzcyBhYm91dCB0aGUgZGF0YSB0eXBlOiBiaW5hcnkgb3IgdGV4dCAqL1xuICB0aGlzLmRhdGFfdHlwZSA9IDIvKlpfVU5LTk9XTiovO1xuICAvKiBhZGxlcjMyIHZhbHVlIG9mIHRoZSB1bmNvbXByZXNzZWQgZGF0YSAqL1xuICB0aGlzLmFkbGVyID0gMDtcbn1cblxubW9kdWxlLmV4cG9ydHMgPSBaU3RyZWFtO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG4vLyBsaWdodHdlaWdodCBCdWZmZXIgc2hpbSBmb3IgcGJmIGJyb3dzZXIgYnVpbGRcbi8vIGJhc2VkIG9uIGNvZGUgZnJvbSBnaXRodWIuY29tL2Zlcm9zcy9idWZmZXIgKE1JVC1saWNlbnNlZClcblxubW9kdWxlLmV4cG9ydHMgPSBCdWZmZXI7XG5cbnZhciBpZWVlNzU0ID0gcmVxdWlyZSgnaWVlZTc1NCcpO1xuXG52YXIgQnVmZmVyTWV0aG9kcztcblxuZnVuY3Rpb24gQnVmZmVyKGxlbmd0aCkge1xuICAgIHZhciBhcnI7XG4gICAgaWYgKGxlbmd0aCAmJiBsZW5ndGgubGVuZ3RoKSB7XG4gICAgICAgIGFyciA9IGxlbmd0aDtcbiAgICAgICAgbGVuZ3RoID0gYXJyLmxlbmd0aDtcbiAgICB9XG4gICAgdmFyIGJ1ZiA9IG5ldyBVaW50OEFycmF5KGxlbmd0aCB8fCAwKTtcbiAgICBpZiAoYXJyKSBidWYuc2V0KGFycik7XG5cbiAgICBidWYucmVhZFVJbnQzMkxFID0gQnVmZmVyTWV0aG9kcy5yZWFkVUludDMyTEU7XG4gICAgYnVmLndyaXRlVUludDMyTEUgPSBCdWZmZXJNZXRob2RzLndyaXRlVUludDMyTEU7XG4gICAgYnVmLnJlYWRJbnQzMkxFID0gQnVmZmVyTWV0aG9kcy5yZWFkSW50MzJMRTtcbiAgICBidWYud3JpdGVJbnQzMkxFID0gQnVmZmVyTWV0aG9kcy53cml0ZUludDMyTEU7XG4gICAgYnVmLnJlYWRGbG9hdExFID0gQnVmZmVyTWV0aG9kcy5yZWFkRmxvYXRMRTtcbiAgICBidWYud3JpdGVGbG9hdExFID0gQnVmZmVyTWV0aG9kcy53cml0ZUZsb2F0TEU7XG4gICAgYnVmLnJlYWREb3VibGVMRSA9IEJ1ZmZlck1ldGhvZHMucmVhZERvdWJsZUxFO1xuICAgIGJ1Zi53cml0ZURvdWJsZUxFID0gQnVmZmVyTWV0aG9kcy53cml0ZURvdWJsZUxFO1xuICAgIGJ1Zi50b1N0cmluZyA9IEJ1ZmZlck1ldGhvZHMudG9TdHJpbmc7XG4gICAgYnVmLndyaXRlID0gQnVmZmVyTWV0aG9kcy53cml0ZTtcbiAgICBidWYuc2xpY2UgPSBCdWZmZXJNZXRob2RzLnNsaWNlO1xuICAgIGJ1Zi5jb3B5ID0gQnVmZmVyTWV0aG9kcy5jb3B5O1xuXG4gICAgYnVmLl9pc0J1ZmZlciA9IHRydWU7XG4gICAgcmV0dXJuIGJ1Zjtcbn1cblxudmFyIGxhc3RTdHIsIGxhc3RTdHJFbmNvZGVkO1xuXG5CdWZmZXJNZXRob2RzID0ge1xuICAgIHJlYWRVSW50MzJMRTogZnVuY3Rpb24ocG9zKSB7XG4gICAgICAgIHJldHVybiAoKHRoaXNbcG9zXSkgfFxuICAgICAgICAgICAgKHRoaXNbcG9zICsgMV0gPDwgOCkgfFxuICAgICAgICAgICAgKHRoaXNbcG9zICsgMl0gPDwgMTYpKSArXG4gICAgICAgICAgICAodGhpc1twb3MgKyAzXSAqIDB4MTAwMDAwMCk7XG4gICAgfSxcblxuICAgIHdyaXRlVUludDMyTEU6IGZ1bmN0aW9uKHZhbCwgcG9zKSB7XG4gICAgICAgIHRoaXNbcG9zXSA9IHZhbDtcbiAgICAgICAgdGhpc1twb3MgKyAxXSA9ICh2YWwgPj4+IDgpO1xuICAgICAgICB0aGlzW3BvcyArIDJdID0gKHZhbCA+Pj4gMTYpO1xuICAgICAgICB0aGlzW3BvcyArIDNdID0gKHZhbCA+Pj4gMjQpO1xuICAgIH0sXG5cbiAgICByZWFkSW50MzJMRTogZnVuY3Rpb24ocG9zKSB7XG4gICAgICAgIHJldHVybiAoKHRoaXNbcG9zXSkgfFxuICAgICAgICAgICAgKHRoaXNbcG9zICsgMV0gPDwgOCkgfFxuICAgICAgICAgICAgKHRoaXNbcG9zICsgMl0gPDwgMTYpKSArXG4gICAgICAgICAgICAodGhpc1twb3MgKyAzXSA8PCAyNCk7XG4gICAgfSxcblxuICAgIHJlYWRGbG9hdExFOiAgZnVuY3Rpb24ocG9zKSB7IHJldHVybiBpZWVlNzU0LnJlYWQodGhpcywgcG9zLCB0cnVlLCAyMywgNCk7IH0sXG4gICAgcmVhZERvdWJsZUxFOiBmdW5jdGlvbihwb3MpIHsgcmV0dXJuIGllZWU3NTQucmVhZCh0aGlzLCBwb3MsIHRydWUsIDUyLCA4KTsgfSxcblxuICAgIHdyaXRlRmxvYXRMRTogIGZ1bmN0aW9uKHZhbCwgcG9zKSB7IHJldHVybiBpZWVlNzU0LndyaXRlKHRoaXMsIHZhbCwgcG9zLCB0cnVlLCAyMywgNCk7IH0sXG4gICAgd3JpdGVEb3VibGVMRTogZnVuY3Rpb24odmFsLCBwb3MpIHsgcmV0dXJuIGllZWU3NTQud3JpdGUodGhpcywgdmFsLCBwb3MsIHRydWUsIDUyLCA4KTsgfSxcblxuICAgIHRvU3RyaW5nOiBmdW5jdGlvbihlbmNvZGluZywgc3RhcnQsIGVuZCkge1xuICAgICAgICB2YXIgc3RyID0gJycsXG4gICAgICAgICAgICB0bXAgPSAnJztcblxuICAgICAgICBzdGFydCA9IHN0YXJ0IHx8IDA7XG4gICAgICAgIGVuZCA9IE1hdGgubWluKHRoaXMubGVuZ3RoLCBlbmQgfHwgdGhpcy5sZW5ndGgpO1xuXG4gICAgICAgIGZvciAodmFyIGkgPSBzdGFydDsgaSA8IGVuZDsgaSsrKSB7XG4gICAgICAgICAgICB2YXIgY2ggPSB0aGlzW2ldO1xuICAgICAgICAgICAgaWYgKGNoIDw9IDB4N0YpIHtcbiAgICAgICAgICAgICAgICBzdHIgKz0gZGVjb2RlVVJJQ29tcG9uZW50KHRtcCkgKyBTdHJpbmcuZnJvbUNoYXJDb2RlKGNoKTtcbiAgICAgICAgICAgICAgICB0bXAgPSAnJztcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgdG1wICs9ICclJyArIGNoLnRvU3RyaW5nKDE2KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHN0ciArPSBkZWNvZGVVUklDb21wb25lbnQodG1wKTtcblxuICAgICAgICByZXR1cm4gc3RyO1xuICAgIH0sXG5cbiAgICB3cml0ZTogZnVuY3Rpb24oc3RyLCBwb3MpIHtcbiAgICAgICAgdmFyIGJ5dGVzID0gc3RyID09PSBsYXN0U3RyID8gbGFzdFN0ckVuY29kZWQgOiBlbmNvZGVTdHJpbmcoc3RyKTtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBieXRlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgdGhpc1twb3MgKyBpXSA9IGJ5dGVzW2ldO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIHNsaWNlOiBmdW5jdGlvbihzdGFydCwgZW5kKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnN1YmFycmF5KHN0YXJ0LCBlbmQpO1xuICAgIH0sXG5cbiAgICBjb3B5OiBmdW5jdGlvbihidWYsIHBvcykge1xuICAgICAgICBwb3MgPSBwb3MgfHwgMDtcbiAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0aGlzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBidWZbcG9zICsgaV0gPSB0aGlzW2ldO1xuICAgICAgICB9XG4gICAgfVxufTtcblxuQnVmZmVyTWV0aG9kcy53cml0ZUludDMyTEUgPSBCdWZmZXJNZXRob2RzLndyaXRlVUludDMyTEU7XG5cbkJ1ZmZlci5ieXRlTGVuZ3RoID0gZnVuY3Rpb24oc3RyKSB7XG4gICAgbGFzdFN0ciA9IHN0cjtcbiAgICBsYXN0U3RyRW5jb2RlZCA9IGVuY29kZVN0cmluZyhzdHIpO1xuICAgIHJldHVybiBsYXN0U3RyRW5jb2RlZC5sZW5ndGg7XG59O1xuXG5CdWZmZXIuaXNCdWZmZXIgPSBmdW5jdGlvbihidWYpIHtcbiAgICByZXR1cm4gISEoYnVmICYmIGJ1Zi5faXNCdWZmZXIpO1xufTtcblxuZnVuY3Rpb24gZW5jb2RlU3RyaW5nKHN0cikge1xuICAgIHZhciBsZW5ndGggPSBzdHIubGVuZ3RoLFxuICAgICAgICBieXRlcyA9IFtdO1xuXG4gICAgZm9yICh2YXIgaSA9IDAsIGMsIGxlYWQ7IGkgPCBsZW5ndGg7IGkrKykge1xuICAgICAgICBjID0gc3RyLmNoYXJDb2RlQXQoaSk7IC8vIGNvZGUgcG9pbnRcblxuICAgICAgICBpZiAoYyA+IDB4RDdGRiAmJiBjIDwgMHhFMDAwKSB7XG5cbiAgICAgICAgICAgIGlmIChsZWFkKSB7XG4gICAgICAgICAgICAgICAgaWYgKGMgPCAweERDMDApIHtcbiAgICAgICAgICAgICAgICAgICAgYnl0ZXMucHVzaCgweEVGLCAweEJGLCAweEJEKTtcbiAgICAgICAgICAgICAgICAgICAgbGVhZCA9IGM7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuXG4gICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgYyA9IGxlYWQgLSAweEQ4MDAgPDwgMTAgfCBjIC0gMHhEQzAwIHwgMHgxMDAwMDtcbiAgICAgICAgICAgICAgICAgICAgbGVhZCA9IG51bGw7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmIChjID4gMHhEQkZGIHx8IChpICsgMSA9PT0gbGVuZ3RoKSkgYnl0ZXMucHVzaCgweEVGLCAweEJGLCAweEJEKTtcbiAgICAgICAgICAgICAgICBlbHNlIGxlYWQgPSBjO1xuXG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgfSBlbHNlIGlmIChsZWFkKSB7XG4gICAgICAgICAgICBieXRlcy5wdXNoKDB4RUYsIDB4QkYsIDB4QkQpO1xuICAgICAgICAgICAgbGVhZCA9IG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoYyA8IDB4ODApIGJ5dGVzLnB1c2goYyk7XG4gICAgICAgIGVsc2UgaWYgKGMgPCAweDgwMCkgYnl0ZXMucHVzaChjID4+IDB4NiB8IDB4QzAsIGMgJiAweDNGIHwgMHg4MCk7XG4gICAgICAgIGVsc2UgaWYgKGMgPCAweDEwMDAwKSBieXRlcy5wdXNoKGMgPj4gMHhDIHwgMHhFMCwgYyA+PiAweDYgJiAweDNGIHwgMHg4MCwgYyAmIDB4M0YgfCAweDgwKTtcbiAgICAgICAgZWxzZSBieXRlcy5wdXNoKGMgPj4gMHgxMiB8IDB4RjAsIGMgPj4gMHhDICYgMHgzRiB8IDB4ODAsIGMgPj4gMHg2ICYgMHgzRiB8IDB4ODAsIGMgJiAweDNGIHwgMHg4MCk7XG4gICAgfVxuICAgIHJldHVybiBieXRlcztcbn1cbiIsIid1c2Ugc3RyaWN0JztcblxubW9kdWxlLmV4cG9ydHMgPSBQYmY7XG5cbnZhciBCdWZmZXIgPSBnbG9iYWwuQnVmZmVyIHx8IHJlcXVpcmUoJy4vYnVmZmVyJyk7XG5cbmZ1bmN0aW9uIFBiZihidWYpIHtcbiAgICB0aGlzLmJ1ZiA9ICFCdWZmZXIuaXNCdWZmZXIoYnVmKSA/IG5ldyBCdWZmZXIoYnVmIHx8IDApIDogYnVmO1xuICAgIHRoaXMucG9zID0gMDtcbiAgICB0aGlzLmxlbmd0aCA9IHRoaXMuYnVmLmxlbmd0aDtcbn1cblxuUGJmLlZhcmludCAgPSAwOyAvLyB2YXJpbnQ6IGludDMyLCBpbnQ2NCwgdWludDMyLCB1aW50NjQsIHNpbnQzMiwgc2ludDY0LCBib29sLCBlbnVtXG5QYmYuRml4ZWQ2NCA9IDE7IC8vIDY0LWJpdDogZG91YmxlLCBmaXhlZDY0LCBzZml4ZWQ2NFxuUGJmLkJ5dGVzICAgPSAyOyAvLyBsZW5ndGgtZGVsaW1pdGVkOiBzdHJpbmcsIGJ5dGVzLCBlbWJlZGRlZCBtZXNzYWdlcywgcGFja2VkIHJlcGVhdGVkIGZpZWxkc1xuUGJmLkZpeGVkMzIgPSA1OyAvLyAzMi1iaXQ6IGZsb2F0LCBmaXhlZDMyLCBzZml4ZWQzMlxuXG52YXIgU0hJRlRfTEVGVF8zMiA9ICgxIDw8IDE2KSAqICgxIDw8IDE2KSxcbiAgICBTSElGVF9SSUdIVF8zMiA9IDEgLyBTSElGVF9MRUZUXzMyLFxuICAgIFBPV18yXzYzID0gTWF0aC5wb3coMiwgNjMpO1xuXG5QYmYucHJvdG90eXBlID0ge1xuXG4gICAgZGVzdHJveTogZnVuY3Rpb24oKSB7XG4gICAgICAgIHRoaXMuYnVmID0gbnVsbDtcbiAgICB9LFxuXG4gICAgLy8gPT09IFJFQURJTkcgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAgIHJlYWRGaWVsZHM6IGZ1bmN0aW9uKHJlYWRGaWVsZCwgcmVzdWx0LCBlbmQpIHtcbiAgICAgICAgZW5kID0gZW5kIHx8IHRoaXMubGVuZ3RoO1xuXG4gICAgICAgIHdoaWxlICh0aGlzLnBvcyA8IGVuZCkge1xuICAgICAgICAgICAgdmFyIHZhbCA9IHRoaXMucmVhZFZhcmludCgpLFxuICAgICAgICAgICAgICAgIHRhZyA9IHZhbCA+PiAzLFxuICAgICAgICAgICAgICAgIHN0YXJ0UG9zID0gdGhpcy5wb3M7XG5cbiAgICAgICAgICAgIHJlYWRGaWVsZCh0YWcsIHJlc3VsdCwgdGhpcyk7XG5cbiAgICAgICAgICAgIGlmICh0aGlzLnBvcyA9PT0gc3RhcnRQb3MpIHRoaXMuc2tpcCh2YWwpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiByZXN1bHQ7XG4gICAgfSxcblxuICAgIHJlYWRNZXNzYWdlOiBmdW5jdGlvbihyZWFkRmllbGQsIHJlc3VsdCkge1xuICAgICAgICByZXR1cm4gdGhpcy5yZWFkRmllbGRzKHJlYWRGaWVsZCwgcmVzdWx0LCB0aGlzLnJlYWRWYXJpbnQoKSArIHRoaXMucG9zKTtcbiAgICB9LFxuXG4gICAgcmVhZEZpeGVkMzI6IGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgdmFsID0gdGhpcy5idWYucmVhZFVJbnQzMkxFKHRoaXMucG9zKTtcbiAgICAgICAgdGhpcy5wb3MgKz0gNDtcbiAgICAgICAgcmV0dXJuIHZhbDtcbiAgICB9LFxuXG4gICAgcmVhZFNGaXhlZDMyOiBmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIHZhbCA9IHRoaXMuYnVmLnJlYWRJbnQzMkxFKHRoaXMucG9zKTtcbiAgICAgICAgdGhpcy5wb3MgKz0gNDtcbiAgICAgICAgcmV0dXJuIHZhbDtcbiAgICB9LFxuXG4gICAgLy8gNjQtYml0IGludCBoYW5kbGluZyBpcyBiYXNlZCBvbiBnaXRodWIuY29tL2Rwdy9ub2RlLWJ1ZmZlci1tb3JlLWludHMgKE1JVC1saWNlbnNlZClcblxuICAgIHJlYWRGaXhlZDY0OiBmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIHZhbCA9IHRoaXMuYnVmLnJlYWRVSW50MzJMRSh0aGlzLnBvcykgKyB0aGlzLmJ1Zi5yZWFkVUludDMyTEUodGhpcy5wb3MgKyA0KSAqIFNISUZUX0xFRlRfMzI7XG4gICAgICAgIHRoaXMucG9zICs9IDg7XG4gICAgICAgIHJldHVybiB2YWw7XG4gICAgfSxcblxuICAgIHJlYWRTRml4ZWQ2NDogZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciB2YWwgPSB0aGlzLmJ1Zi5yZWFkVUludDMyTEUodGhpcy5wb3MpICsgdGhpcy5idWYucmVhZEludDMyTEUodGhpcy5wb3MgKyA0KSAqIFNISUZUX0xFRlRfMzI7XG4gICAgICAgIHRoaXMucG9zICs9IDg7XG4gICAgICAgIHJldHVybiB2YWw7XG4gICAgfSxcblxuICAgIHJlYWRGbG9hdDogZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciB2YWwgPSB0aGlzLmJ1Zi5yZWFkRmxvYXRMRSh0aGlzLnBvcyk7XG4gICAgICAgIHRoaXMucG9zICs9IDQ7XG4gICAgICAgIHJldHVybiB2YWw7XG4gICAgfSxcblxuICAgIHJlYWREb3VibGU6IGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgdmFsID0gdGhpcy5idWYucmVhZERvdWJsZUxFKHRoaXMucG9zKTtcbiAgICAgICAgdGhpcy5wb3MgKz0gODtcbiAgICAgICAgcmV0dXJuIHZhbDtcbiAgICB9LFxuXG4gICAgcmVhZFZhcmludDogZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciBidWYgPSB0aGlzLmJ1ZixcbiAgICAgICAgICAgIHZhbCwgYiwgYjAsIGIxLCBiMiwgYjM7XG5cbiAgICAgICAgYjAgPSBidWZbdGhpcy5wb3MrK107IGlmIChiMCA8IDB4ODApIHJldHVybiBiMDsgICAgICAgICAgICAgICAgIGIwID0gYjAgJiAweDdmO1xuICAgICAgICBiMSA9IGJ1Zlt0aGlzLnBvcysrXTsgaWYgKGIxIDwgMHg4MCkgcmV0dXJuIGIwIHwgYjEgPDwgNzsgICAgICAgYjEgPSAoYjEgJiAweDdmKSA8PCA3O1xuICAgICAgICBiMiA9IGJ1Zlt0aGlzLnBvcysrXTsgaWYgKGIyIDwgMHg4MCkgcmV0dXJuIGIwIHwgYjEgfCBiMiA8PCAxNDsgYjIgPSAoYjIgJiAweDdmKSA8PCAxNDtcbiAgICAgICAgYjMgPSBidWZbdGhpcy5wb3MrK107IGlmIChiMyA8IDB4ODApIHJldHVybiBiMCB8IGIxIHwgYjIgfCBiMyA8PCAyMTtcblxuICAgICAgICB2YWwgPSBiMCB8IGIxIHwgYjIgfCAoYjMgJiAweDdmKSA8PCAyMTtcblxuICAgICAgICBiID0gYnVmW3RoaXMucG9zKytdOyB2YWwgKz0gKGIgJiAweDdmKSAqIDB4MTAwMDAwMDA7ICAgICAgICAgaWYgKGIgPCAweDgwKSByZXR1cm4gdmFsO1xuICAgICAgICBiID0gYnVmW3RoaXMucG9zKytdOyB2YWwgKz0gKGIgJiAweDdmKSAqIDB4ODAwMDAwMDAwOyAgICAgICAgaWYgKGIgPCAweDgwKSByZXR1cm4gdmFsO1xuICAgICAgICBiID0gYnVmW3RoaXMucG9zKytdOyB2YWwgKz0gKGIgJiAweDdmKSAqIDB4NDAwMDAwMDAwMDA7ICAgICAgaWYgKGIgPCAweDgwKSByZXR1cm4gdmFsO1xuICAgICAgICBiID0gYnVmW3RoaXMucG9zKytdOyB2YWwgKz0gKGIgJiAweDdmKSAqIDB4MjAwMDAwMDAwMDAwMDsgICAgaWYgKGIgPCAweDgwKSByZXR1cm4gdmFsO1xuICAgICAgICBiID0gYnVmW3RoaXMucG9zKytdOyB2YWwgKz0gKGIgJiAweDdmKSAqIDB4MTAwMDAwMDAwMDAwMDAwOyAgaWYgKGIgPCAweDgwKSByZXR1cm4gdmFsO1xuICAgICAgICBiID0gYnVmW3RoaXMucG9zKytdOyB2YWwgKz0gKGIgJiAweDdmKSAqIDB4ODAwMDAwMDAwMDAwMDAwMDsgaWYgKGIgPCAweDgwKSByZXR1cm4gdmFsO1xuXG4gICAgICAgIHRocm93IG5ldyBFcnJvcignRXhwZWN0ZWQgdmFyaW50IG5vdCBtb3JlIHRoYW4gMTAgYnl0ZXMnKTtcbiAgICB9LFxuXG4gICAgcmVhZFZhcmludDY0OiBmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIHN0YXJ0UG9zID0gdGhpcy5wb3MsXG4gICAgICAgICAgICB2YWwgPSB0aGlzLnJlYWRWYXJpbnQoKTtcblxuICAgICAgICBpZiAodmFsIDwgUE9XXzJfNjMpIHJldHVybiB2YWw7XG5cbiAgICAgICAgdmFyIHBvcyA9IHRoaXMucG9zIC0gMjtcbiAgICAgICAgd2hpbGUgKHRoaXMuYnVmW3Bvc10gPT09IDB4ZmYpIHBvcy0tO1xuICAgICAgICBpZiAocG9zIDwgc3RhcnRQb3MpIHBvcyA9IHN0YXJ0UG9zO1xuXG4gICAgICAgIHZhbCA9IDA7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcG9zIC0gc3RhcnRQb3MgKyAxOyBpKyspIHtcbiAgICAgICAgICAgIHZhciBiID0gfnRoaXMuYnVmW3N0YXJ0UG9zICsgaV0gJiAweDdmO1xuICAgICAgICAgICAgdmFsICs9IGkgPCA0ID8gYiA8PCBpICogNyA6IGIgKiBNYXRoLnBvdygyLCBpICogNyk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gLXZhbCAtIDE7XG4gICAgfSxcblxuICAgIHJlYWRTVmFyaW50OiBmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIG51bSA9IHRoaXMucmVhZFZhcmludCgpO1xuICAgICAgICByZXR1cm4gbnVtICUgMiA9PT0gMSA/IChudW0gKyAxKSAvIC0yIDogbnVtIC8gMjsgLy8gemlnemFnIGVuY29kaW5nXG4gICAgfSxcblxuICAgIHJlYWRCb29sZWFuOiBmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIEJvb2xlYW4odGhpcy5yZWFkVmFyaW50KCkpO1xuICAgIH0sXG5cbiAgICByZWFkU3RyaW5nOiBmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIGVuZCA9IHRoaXMucmVhZFZhcmludCgpICsgdGhpcy5wb3MsXG4gICAgICAgICAgICBzdHIgPSB0aGlzLmJ1Zi50b1N0cmluZygndXRmOCcsIHRoaXMucG9zLCBlbmQpO1xuICAgICAgICB0aGlzLnBvcyA9IGVuZDtcbiAgICAgICAgcmV0dXJuIHN0cjtcbiAgICB9LFxuXG4gICAgcmVhZEJ5dGVzOiBmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIGVuZCA9IHRoaXMucmVhZFZhcmludCgpICsgdGhpcy5wb3MsXG4gICAgICAgICAgICBidWZmZXIgPSB0aGlzLmJ1Zi5zbGljZSh0aGlzLnBvcywgZW5kKTtcbiAgICAgICAgdGhpcy5wb3MgPSBlbmQ7XG4gICAgICAgIHJldHVybiBidWZmZXI7XG4gICAgfSxcblxuICAgIC8vIHZlcmJvc2UgZm9yIHBlcmZvcm1hbmNlIHJlYXNvbnM7IGRvZXNuJ3QgYWZmZWN0IGd6aXBwZWQgc2l6ZVxuXG4gICAgcmVhZFBhY2tlZFZhcmludDogZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciBlbmQgPSB0aGlzLnJlYWRWYXJpbnQoKSArIHRoaXMucG9zLCBhcnIgPSBbXTtcbiAgICAgICAgd2hpbGUgKHRoaXMucG9zIDwgZW5kKSBhcnIucHVzaCh0aGlzLnJlYWRWYXJpbnQoKSk7XG4gICAgICAgIHJldHVybiBhcnI7XG4gICAgfSxcbiAgICByZWFkUGFja2VkU1ZhcmludDogZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciBlbmQgPSB0aGlzLnJlYWRWYXJpbnQoKSArIHRoaXMucG9zLCBhcnIgPSBbXTtcbiAgICAgICAgd2hpbGUgKHRoaXMucG9zIDwgZW5kKSBhcnIucHVzaCh0aGlzLnJlYWRTVmFyaW50KCkpO1xuICAgICAgICByZXR1cm4gYXJyO1xuICAgIH0sXG4gICAgcmVhZFBhY2tlZEJvb2xlYW46IGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgZW5kID0gdGhpcy5yZWFkVmFyaW50KCkgKyB0aGlzLnBvcywgYXJyID0gW107XG4gICAgICAgIHdoaWxlICh0aGlzLnBvcyA8IGVuZCkgYXJyLnB1c2godGhpcy5yZWFkQm9vbGVhbigpKTtcbiAgICAgICAgcmV0dXJuIGFycjtcbiAgICB9LFxuICAgIHJlYWRQYWNrZWRGbG9hdDogZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciBlbmQgPSB0aGlzLnJlYWRWYXJpbnQoKSArIHRoaXMucG9zLCBhcnIgPSBbXTtcbiAgICAgICAgd2hpbGUgKHRoaXMucG9zIDwgZW5kKSBhcnIucHVzaCh0aGlzLnJlYWRGbG9hdCgpKTtcbiAgICAgICAgcmV0dXJuIGFycjtcbiAgICB9LFxuICAgIHJlYWRQYWNrZWREb3VibGU6IGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgZW5kID0gdGhpcy5yZWFkVmFyaW50KCkgKyB0aGlzLnBvcywgYXJyID0gW107XG4gICAgICAgIHdoaWxlICh0aGlzLnBvcyA8IGVuZCkgYXJyLnB1c2godGhpcy5yZWFkRG91YmxlKCkpO1xuICAgICAgICByZXR1cm4gYXJyO1xuICAgIH0sXG4gICAgcmVhZFBhY2tlZEZpeGVkMzI6IGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgZW5kID0gdGhpcy5yZWFkVmFyaW50KCkgKyB0aGlzLnBvcywgYXJyID0gW107XG4gICAgICAgIHdoaWxlICh0aGlzLnBvcyA8IGVuZCkgYXJyLnB1c2godGhpcy5yZWFkRml4ZWQzMigpKTtcbiAgICAgICAgcmV0dXJuIGFycjtcbiAgICB9LFxuICAgIHJlYWRQYWNrZWRTRml4ZWQzMjogZnVuY3Rpb24oKSB7XG4gICAgICAgIHZhciBlbmQgPSB0aGlzLnJlYWRWYXJpbnQoKSArIHRoaXMucG9zLCBhcnIgPSBbXTtcbiAgICAgICAgd2hpbGUgKHRoaXMucG9zIDwgZW5kKSBhcnIucHVzaCh0aGlzLnJlYWRTRml4ZWQzMigpKTtcbiAgICAgICAgcmV0dXJuIGFycjtcbiAgICB9LFxuICAgIHJlYWRQYWNrZWRGaXhlZDY0OiBmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIGVuZCA9IHRoaXMucmVhZFZhcmludCgpICsgdGhpcy5wb3MsIGFyciA9IFtdO1xuICAgICAgICB3aGlsZSAodGhpcy5wb3MgPCBlbmQpIGFyci5wdXNoKHRoaXMucmVhZEZpeGVkNjQoKSk7XG4gICAgICAgIHJldHVybiBhcnI7XG4gICAgfSxcbiAgICByZWFkUGFja2VkU0ZpeGVkNjQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgZW5kID0gdGhpcy5yZWFkVmFyaW50KCkgKyB0aGlzLnBvcywgYXJyID0gW107XG4gICAgICAgIHdoaWxlICh0aGlzLnBvcyA8IGVuZCkgYXJyLnB1c2godGhpcy5yZWFkU0ZpeGVkNjQoKSk7XG4gICAgICAgIHJldHVybiBhcnI7XG4gICAgfSxcblxuICAgIHNraXA6IGZ1bmN0aW9uKHZhbCkge1xuICAgICAgICB2YXIgdHlwZSA9IHZhbCAmIDB4NztcbiAgICAgICAgaWYgKHR5cGUgPT09IFBiZi5WYXJpbnQpIHdoaWxlICh0aGlzLmJ1Zlt0aGlzLnBvcysrXSA+IDB4N2YpIHt9XG4gICAgICAgIGVsc2UgaWYgKHR5cGUgPT09IFBiZi5CeXRlcykgdGhpcy5wb3MgPSB0aGlzLnJlYWRWYXJpbnQoKSArIHRoaXMucG9zO1xuICAgICAgICBlbHNlIGlmICh0eXBlID09PSBQYmYuRml4ZWQzMikgdGhpcy5wb3MgKz0gNDtcbiAgICAgICAgZWxzZSBpZiAodHlwZSA9PT0gUGJmLkZpeGVkNjQpIHRoaXMucG9zICs9IDg7XG4gICAgICAgIGVsc2UgdGhyb3cgbmV3IEVycm9yKCdVbmltcGxlbWVudGVkIHR5cGU6ICcgKyB0eXBlKTtcbiAgICB9LFxuXG4gICAgLy8gPT09IFdSSVRJTkcgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cblxuICAgIHdyaXRlVGFnOiBmdW5jdGlvbih0YWcsIHR5cGUpIHtcbiAgICAgICAgdGhpcy53cml0ZVZhcmludCgodGFnIDw8IDMpIHwgdHlwZSk7XG4gICAgfSxcblxuICAgIHJlYWxsb2M6IGZ1bmN0aW9uKG1pbikge1xuICAgICAgICB2YXIgbGVuZ3RoID0gdGhpcy5sZW5ndGggfHwgMTY7XG5cbiAgICAgICAgd2hpbGUgKGxlbmd0aCA8IHRoaXMucG9zICsgbWluKSBsZW5ndGggKj0gMjtcblxuICAgICAgICBpZiAobGVuZ3RoICE9PSB0aGlzLmxlbmd0aCkge1xuICAgICAgICAgICAgdmFyIGJ1ZiA9IG5ldyBCdWZmZXIobGVuZ3RoKTtcbiAgICAgICAgICAgIHRoaXMuYnVmLmNvcHkoYnVmKTtcbiAgICAgICAgICAgIHRoaXMuYnVmID0gYnVmO1xuICAgICAgICAgICAgdGhpcy5sZW5ndGggPSBsZW5ndGg7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgZmluaXNoOiBmdW5jdGlvbigpIHtcbiAgICAgICAgdGhpcy5sZW5ndGggPSB0aGlzLnBvcztcbiAgICAgICAgdGhpcy5wb3MgPSAwO1xuICAgICAgICByZXR1cm4gdGhpcy5idWYuc2xpY2UoMCwgdGhpcy5sZW5ndGgpO1xuICAgIH0sXG5cbiAgICB3cml0ZUZpeGVkMzI6IGZ1bmN0aW9uKHZhbCkge1xuICAgICAgICB0aGlzLnJlYWxsb2MoNCk7XG4gICAgICAgIHRoaXMuYnVmLndyaXRlVUludDMyTEUodmFsLCB0aGlzLnBvcyk7XG4gICAgICAgIHRoaXMucG9zICs9IDQ7XG4gICAgfSxcblxuICAgIHdyaXRlU0ZpeGVkMzI6IGZ1bmN0aW9uKHZhbCkge1xuICAgICAgICB0aGlzLnJlYWxsb2MoNCk7XG4gICAgICAgIHRoaXMuYnVmLndyaXRlSW50MzJMRSh2YWwsIHRoaXMucG9zKTtcbiAgICAgICAgdGhpcy5wb3MgKz0gNDtcbiAgICB9LFxuXG4gICAgd3JpdGVGaXhlZDY0OiBmdW5jdGlvbih2YWwpIHtcbiAgICAgICAgdGhpcy5yZWFsbG9jKDgpO1xuICAgICAgICB0aGlzLmJ1Zi53cml0ZUludDMyTEUodmFsICYgLTEsIHRoaXMucG9zKTtcbiAgICAgICAgdGhpcy5idWYud3JpdGVVSW50MzJMRShNYXRoLmZsb29yKHZhbCAqIFNISUZUX1JJR0hUXzMyKSwgdGhpcy5wb3MgKyA0KTtcbiAgICAgICAgdGhpcy5wb3MgKz0gODtcbiAgICB9LFxuXG4gICAgd3JpdGVTRml4ZWQ2NDogZnVuY3Rpb24odmFsKSB7XG4gICAgICAgIHRoaXMucmVhbGxvYyg4KTtcbiAgICAgICAgdGhpcy5idWYud3JpdGVJbnQzMkxFKHZhbCAmIC0xLCB0aGlzLnBvcyk7XG4gICAgICAgIHRoaXMuYnVmLndyaXRlSW50MzJMRShNYXRoLmZsb29yKHZhbCAqIFNISUZUX1JJR0hUXzMyKSwgdGhpcy5wb3MgKyA0KTtcbiAgICAgICAgdGhpcy5wb3MgKz0gODtcbiAgICB9LFxuXG4gICAgd3JpdGVWYXJpbnQ6IGZ1bmN0aW9uKHZhbCkge1xuICAgICAgICB2YWwgPSArdmFsO1xuXG4gICAgICAgIGlmICh2YWwgPD0gMHg3Zikge1xuICAgICAgICAgICAgdGhpcy5yZWFsbG9jKDEpO1xuICAgICAgICAgICAgdGhpcy5idWZbdGhpcy5wb3MrK10gPSB2YWw7XG5cbiAgICAgICAgfSBlbHNlIGlmICh2YWwgPD0gMHgzZmZmKSB7XG4gICAgICAgICAgICB0aGlzLnJlYWxsb2MoMik7XG4gICAgICAgICAgICB0aGlzLmJ1Zlt0aGlzLnBvcysrXSA9ICgodmFsID4+PiAwKSAmIDB4N2YpIHwgMHg4MDtcbiAgICAgICAgICAgIHRoaXMuYnVmW3RoaXMucG9zKytdID0gKCh2YWwgPj4+IDcpICYgMHg3Zik7XG5cbiAgICAgICAgfSBlbHNlIGlmICh2YWwgPD0gMHgxZmZmZmYpIHtcbiAgICAgICAgICAgIHRoaXMucmVhbGxvYygzKTtcbiAgICAgICAgICAgIHRoaXMuYnVmW3RoaXMucG9zKytdID0gKCh2YWwgPj4+IDApICYgMHg3ZikgfCAweDgwO1xuICAgICAgICAgICAgdGhpcy5idWZbdGhpcy5wb3MrK10gPSAoKHZhbCA+Pj4gNykgJiAweDdmKSB8IDB4ODA7XG4gICAgICAgICAgICB0aGlzLmJ1Zlt0aGlzLnBvcysrXSA9ICgodmFsID4+PiAxNCkgJiAweDdmKTtcblxuICAgICAgICB9IGVsc2UgaWYgKHZhbCA8PSAweGZmZmZmZmYpIHtcbiAgICAgICAgICAgIHRoaXMucmVhbGxvYyg0KTtcbiAgICAgICAgICAgIHRoaXMuYnVmW3RoaXMucG9zKytdID0gKCh2YWwgPj4+IDApICYgMHg3ZikgfCAweDgwO1xuICAgICAgICAgICAgdGhpcy5idWZbdGhpcy5wb3MrK10gPSAoKHZhbCA+Pj4gNykgJiAweDdmKSB8IDB4ODA7XG4gICAgICAgICAgICB0aGlzLmJ1Zlt0aGlzLnBvcysrXSA9ICgodmFsID4+PiAxNCkgJiAweDdmKSB8IDB4ODA7XG4gICAgICAgICAgICB0aGlzLmJ1Zlt0aGlzLnBvcysrXSA9ICgodmFsID4+PiAyMSkgJiAweDdmKTtcblxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdmFyIHBvcyA9IHRoaXMucG9zO1xuICAgICAgICAgICAgd2hpbGUgKHZhbCA+PSAweDgwKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5yZWFsbG9jKDEpO1xuICAgICAgICAgICAgICAgIHRoaXMuYnVmW3RoaXMucG9zKytdID0gKHZhbCAmIDB4ZmYpIHwgMHg4MDtcbiAgICAgICAgICAgICAgICB2YWwgLz0gMHg4MDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMucmVhbGxvYygxKTtcbiAgICAgICAgICAgIHRoaXMuYnVmW3RoaXMucG9zKytdID0gdmFsIHwgMDtcbiAgICAgICAgICAgIGlmICh0aGlzLnBvcyAtIHBvcyA+IDEwKSB0aHJvdyBuZXcgRXJyb3IoJ0dpdmVuIHZhcmludCBkb2VzblxcJ3QgZml0IGludG8gMTAgYnl0ZXMnKTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICB3cml0ZVNWYXJpbnQ6IGZ1bmN0aW9uKHZhbCkge1xuICAgICAgICB0aGlzLndyaXRlVmFyaW50KHZhbCA8IDAgPyAtdmFsICogMiAtIDEgOiB2YWwgKiAyKTtcbiAgICB9LFxuXG4gICAgd3JpdGVCb29sZWFuOiBmdW5jdGlvbih2YWwpIHtcbiAgICAgICAgdGhpcy53cml0ZVZhcmludChCb29sZWFuKHZhbCkpO1xuICAgIH0sXG5cbiAgICB3cml0ZVN0cmluZzogZnVuY3Rpb24oc3RyKSB7XG4gICAgICAgIHN0ciA9IFN0cmluZyhzdHIpO1xuICAgICAgICB2YXIgYnl0ZXMgPSBCdWZmZXIuYnl0ZUxlbmd0aChzdHIpO1xuICAgICAgICB0aGlzLndyaXRlVmFyaW50KGJ5dGVzKTtcbiAgICAgICAgdGhpcy5yZWFsbG9jKGJ5dGVzKTtcbiAgICAgICAgdGhpcy5idWYud3JpdGUoc3RyLCB0aGlzLnBvcyk7XG4gICAgICAgIHRoaXMucG9zICs9IGJ5dGVzO1xuICAgIH0sXG5cbiAgICB3cml0ZUZsb2F0OiBmdW5jdGlvbih2YWwpIHtcbiAgICAgICAgdGhpcy5yZWFsbG9jKDQpO1xuICAgICAgICB0aGlzLmJ1Zi53cml0ZUZsb2F0TEUodmFsLCB0aGlzLnBvcyk7XG4gICAgICAgIHRoaXMucG9zICs9IDQ7XG4gICAgfSxcblxuICAgIHdyaXRlRG91YmxlOiBmdW5jdGlvbih2YWwpIHtcbiAgICAgICAgdGhpcy5yZWFsbG9jKDgpO1xuICAgICAgICB0aGlzLmJ1Zi53cml0ZURvdWJsZUxFKHZhbCwgdGhpcy5wb3MpO1xuICAgICAgICB0aGlzLnBvcyArPSA4O1xuICAgIH0sXG5cbiAgICB3cml0ZUJ5dGVzOiBmdW5jdGlvbihidWZmZXIpIHtcbiAgICAgICAgdmFyIGxlbiA9IGJ1ZmZlci5sZW5ndGg7XG4gICAgICAgIHRoaXMud3JpdGVWYXJpbnQobGVuKTtcbiAgICAgICAgdGhpcy5yZWFsbG9jKGxlbik7XG4gICAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuOyBpKyspIHRoaXMuYnVmW3RoaXMucG9zKytdID0gYnVmZmVyW2ldO1xuICAgIH0sXG5cbiAgICB3cml0ZU1lc3NhZ2U6IGZ1bmN0aW9uKHRhZywgZm4sIG9iaikge1xuICAgICAgICB0aGlzLndyaXRlVGFnKHRhZywgUGJmLkJ5dGVzKTtcblxuICAgICAgICB0aGlzLnBvcysrOyAvLyByZXNlcnZlIDEgYnl0ZSBmb3Igc2hvcnQgbWVzc2FnZSBsZW5ndGhcblxuICAgICAgICAvLyB3cml0ZSB0aGUgbWVzc2FnZSBkaXJlY3RseSB0byB0aGUgYnVmZmVyIGFuZCBzZWUgaG93IG11Y2ggd2FzIHdyaXR0ZW5cbiAgICAgICAgdmFyIHN0YXJ0UG9zID0gdGhpcy5wb3M7XG4gICAgICAgIGZuKG9iaiwgdGhpcyk7XG4gICAgICAgIHZhciBsZW4gPSB0aGlzLnBvcyAtIHN0YXJ0UG9zO1xuXG4gICAgICAgIHZhciB2YXJpbnRMZW4gPVxuICAgICAgICAgICAgbGVuIDw9IDB4N2YgPyAxIDpcbiAgICAgICAgICAgIGxlbiA8PSAweDNmZmYgPyAyIDpcbiAgICAgICAgICAgIGxlbiA8PSAweDFmZmZmZiA/IDMgOlxuICAgICAgICAgICAgbGVuIDw9IDB4ZmZmZmZmZiA/IDQgOiBNYXRoLmNlaWwoTWF0aC5sb2cobGVuKSAvIChNYXRoLkxOMiAqIDcpKTtcblxuICAgICAgICAvLyBpZiAxIGJ5dGUgaXNuJ3QgZW5vdWdoIGZvciBlbmNvZGluZyBtZXNzYWdlIGxlbmd0aCwgc2hpZnQgdGhlIGRhdGEgdG8gdGhlIHJpZ2h0XG4gICAgICAgIGlmICh2YXJpbnRMZW4gPiAxKSB7XG4gICAgICAgICAgICB0aGlzLnJlYWxsb2ModmFyaW50TGVuIC0gMSk7XG4gICAgICAgICAgICBmb3IgKHZhciBpID0gdGhpcy5wb3MgLSAxOyBpID49IHN0YXJ0UG9zOyBpLS0pIHRoaXMuYnVmW2kgKyB2YXJpbnRMZW4gLSAxXSA9IHRoaXMuYnVmW2ldO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gZmluYWxseSwgd3JpdGUgdGhlIG1lc3NhZ2UgbGVuZ3RoIGluIHRoZSByZXNlcnZlZCBwbGFjZSBhbmQgcmVzdG9yZSB0aGUgcG9zaXRpb25cbiAgICAgICAgdGhpcy5wb3MgPSBzdGFydFBvcyAtIDE7XG4gICAgICAgIHRoaXMud3JpdGVWYXJpbnQobGVuKTtcbiAgICAgICAgdGhpcy5wb3MgKz0gbGVuO1xuICAgIH0sXG5cbiAgICB3cml0ZVBhY2tlZFZhcmludDogICBmdW5jdGlvbih0YWcsIGFycikgeyB0aGlzLndyaXRlTWVzc2FnZSh0YWcsIHdyaXRlUGFja2VkVmFyaW50LCBhcnIpOyAgIH0sXG4gICAgd3JpdGVQYWNrZWRTVmFyaW50OiAgZnVuY3Rpb24odGFnLCBhcnIpIHsgdGhpcy53cml0ZU1lc3NhZ2UodGFnLCB3cml0ZVBhY2tlZFNWYXJpbnQsIGFycik7ICB9LFxuICAgIHdyaXRlUGFja2VkQm9vbGVhbjogIGZ1bmN0aW9uKHRhZywgYXJyKSB7IHRoaXMud3JpdGVNZXNzYWdlKHRhZywgd3JpdGVQYWNrZWRCb29sZWFuLCBhcnIpOyAgfSxcbiAgICB3cml0ZVBhY2tlZEZsb2F0OiAgICBmdW5jdGlvbih0YWcsIGFycikgeyB0aGlzLndyaXRlTWVzc2FnZSh0YWcsIHdyaXRlUGFja2VkRmxvYXQsIGFycik7ICAgIH0sXG4gICAgd3JpdGVQYWNrZWREb3VibGU6ICAgZnVuY3Rpb24odGFnLCBhcnIpIHsgdGhpcy53cml0ZU1lc3NhZ2UodGFnLCB3cml0ZVBhY2tlZERvdWJsZSwgYXJyKTsgICB9LFxuICAgIHdyaXRlUGFja2VkRml4ZWQzMjogIGZ1bmN0aW9uKHRhZywgYXJyKSB7IHRoaXMud3JpdGVNZXNzYWdlKHRhZywgd3JpdGVQYWNrZWRGaXhlZDMyLCBhcnIpOyAgfSxcbiAgICB3cml0ZVBhY2tlZFNGaXhlZDMyOiBmdW5jdGlvbih0YWcsIGFycikgeyB0aGlzLndyaXRlTWVzc2FnZSh0YWcsIHdyaXRlUGFja2VkU0ZpeGVkMzIsIGFycik7IH0sXG4gICAgd3JpdGVQYWNrZWRGaXhlZDY0OiAgZnVuY3Rpb24odGFnLCBhcnIpIHsgdGhpcy53cml0ZU1lc3NhZ2UodGFnLCB3cml0ZVBhY2tlZEZpeGVkNjQsIGFycik7ICB9LFxuICAgIHdyaXRlUGFja2VkU0ZpeGVkNjQ6IGZ1bmN0aW9uKHRhZywgYXJyKSB7IHRoaXMud3JpdGVNZXNzYWdlKHRhZywgd3JpdGVQYWNrZWRTRml4ZWQ2NCwgYXJyKTsgfSxcblxuICAgIHdyaXRlQnl0ZXNGaWVsZDogZnVuY3Rpb24odGFnLCBidWZmZXIpIHtcbiAgICAgICAgdGhpcy53cml0ZVRhZyh0YWcsIFBiZi5CeXRlcyk7XG4gICAgICAgIHRoaXMud3JpdGVCeXRlcyhidWZmZXIpO1xuICAgIH0sXG4gICAgd3JpdGVGaXhlZDMyRmllbGQ6IGZ1bmN0aW9uKHRhZywgdmFsKSB7XG4gICAgICAgIHRoaXMud3JpdGVUYWcodGFnLCBQYmYuRml4ZWQzMik7XG4gICAgICAgIHRoaXMud3JpdGVGaXhlZDMyKHZhbCk7XG4gICAgfSxcbiAgICB3cml0ZVNGaXhlZDMyRmllbGQ6IGZ1bmN0aW9uKHRhZywgdmFsKSB7XG4gICAgICAgIHRoaXMud3JpdGVUYWcodGFnLCBQYmYuRml4ZWQzMik7XG4gICAgICAgIHRoaXMud3JpdGVTRml4ZWQzMih2YWwpO1xuICAgIH0sXG4gICAgd3JpdGVGaXhlZDY0RmllbGQ6IGZ1bmN0aW9uKHRhZywgdmFsKSB7XG4gICAgICAgIHRoaXMud3JpdGVUYWcodGFnLCBQYmYuRml4ZWQ2NCk7XG4gICAgICAgIHRoaXMud3JpdGVGaXhlZDY0KHZhbCk7XG4gICAgfSxcbiAgICB3cml0ZVNGaXhlZDY0RmllbGQ6IGZ1bmN0aW9uKHRhZywgdmFsKSB7XG4gICAgICAgIHRoaXMud3JpdGVUYWcodGFnLCBQYmYuRml4ZWQ2NCk7XG4gICAgICAgIHRoaXMud3JpdGVTRml4ZWQ2NCh2YWwpO1xuICAgIH0sXG4gICAgd3JpdGVWYXJpbnRGaWVsZDogZnVuY3Rpb24odGFnLCB2YWwpIHtcbiAgICAgICAgdGhpcy53cml0ZVRhZyh0YWcsIFBiZi5WYXJpbnQpO1xuICAgICAgICB0aGlzLndyaXRlVmFyaW50KHZhbCk7XG4gICAgfSxcbiAgICB3cml0ZVNWYXJpbnRGaWVsZDogZnVuY3Rpb24odGFnLCB2YWwpIHtcbiAgICAgICAgdGhpcy53cml0ZVRhZyh0YWcsIFBiZi5WYXJpbnQpO1xuICAgICAgICB0aGlzLndyaXRlU1ZhcmludCh2YWwpO1xuICAgIH0sXG4gICAgd3JpdGVTdHJpbmdGaWVsZDogZnVuY3Rpb24odGFnLCBzdHIpIHtcbiAgICAgICAgdGhpcy53cml0ZVRhZyh0YWcsIFBiZi5CeXRlcyk7XG4gICAgICAgIHRoaXMud3JpdGVTdHJpbmcoc3RyKTtcbiAgICB9LFxuICAgIHdyaXRlRmxvYXRGaWVsZDogZnVuY3Rpb24odGFnLCB2YWwpIHtcbiAgICAgICAgdGhpcy53cml0ZVRhZyh0YWcsIFBiZi5GaXhlZDMyKTtcbiAgICAgICAgdGhpcy53cml0ZUZsb2F0KHZhbCk7XG4gICAgfSxcbiAgICB3cml0ZURvdWJsZUZpZWxkOiBmdW5jdGlvbih0YWcsIHZhbCkge1xuICAgICAgICB0aGlzLndyaXRlVGFnKHRhZywgUGJmLkZpeGVkNjQpO1xuICAgICAgICB0aGlzLndyaXRlRG91YmxlKHZhbCk7XG4gICAgfSxcbiAgICB3cml0ZUJvb2xlYW5GaWVsZDogZnVuY3Rpb24odGFnLCB2YWwpIHtcbiAgICAgICAgdGhpcy53cml0ZVZhcmludEZpZWxkKHRhZywgQm9vbGVhbih2YWwpKTtcbiAgICB9XG59O1xuXG5mdW5jdGlvbiB3cml0ZVBhY2tlZFZhcmludChhcnIsIHBiZikgICB7IGZvciAodmFyIGkgPSAwOyBpIDwgYXJyLmxlbmd0aDsgaSsrKSBwYmYud3JpdGVWYXJpbnQoYXJyW2ldKTsgICB9XG5mdW5jdGlvbiB3cml0ZVBhY2tlZFNWYXJpbnQoYXJyLCBwYmYpICB7IGZvciAodmFyIGkgPSAwOyBpIDwgYXJyLmxlbmd0aDsgaSsrKSBwYmYud3JpdGVTVmFyaW50KGFycltpXSk7ICB9XG5mdW5jdGlvbiB3cml0ZVBhY2tlZEZsb2F0KGFyciwgcGJmKSAgICB7IGZvciAodmFyIGkgPSAwOyBpIDwgYXJyLmxlbmd0aDsgaSsrKSBwYmYud3JpdGVGbG9hdChhcnJbaV0pOyAgICB9XG5mdW5jdGlvbiB3cml0ZVBhY2tlZERvdWJsZShhcnIsIHBiZikgICB7IGZvciAodmFyIGkgPSAwOyBpIDwgYXJyLmxlbmd0aDsgaSsrKSBwYmYud3JpdGVEb3VibGUoYXJyW2ldKTsgICB9XG5mdW5jdGlvbiB3cml0ZVBhY2tlZEJvb2xlYW4oYXJyLCBwYmYpICB7IGZvciAodmFyIGkgPSAwOyBpIDwgYXJyLmxlbmd0aDsgaSsrKSBwYmYud3JpdGVCb29sZWFuKGFycltpXSk7ICB9XG5mdW5jdGlvbiB3cml0ZVBhY2tlZEZpeGVkMzIoYXJyLCBwYmYpICB7IGZvciAodmFyIGkgPSAwOyBpIDwgYXJyLmxlbmd0aDsgaSsrKSBwYmYud3JpdGVGaXhlZDMyKGFycltpXSk7ICB9XG5mdW5jdGlvbiB3cml0ZVBhY2tlZFNGaXhlZDMyKGFyciwgcGJmKSB7IGZvciAodmFyIGkgPSAwOyBpIDwgYXJyLmxlbmd0aDsgaSsrKSBwYmYud3JpdGVTRml4ZWQzMihhcnJbaV0pOyB9XG5mdW5jdGlvbiB3cml0ZVBhY2tlZEZpeGVkNjQoYXJyLCBwYmYpICB7IGZvciAodmFyIGkgPSAwOyBpIDwgYXJyLmxlbmd0aDsgaSsrKSBwYmYud3JpdGVGaXhlZDY0KGFycltpXSk7ICB9XG5mdW5jdGlvbiB3cml0ZVBhY2tlZFNGaXhlZDY0KGFyciwgcGJmKSB7IGZvciAodmFyIGkgPSAwOyBpIDwgYXJyLmxlbmd0aDsgaSsrKSBwYmYud3JpdGVTRml4ZWQ2NChhcnJbaV0pOyB9XG4iLCIndXNlIHN0cmljdCc7XG5cbm1vZHVsZS5leHBvcnRzID0gUG9pbnQ7XG5cbmZ1bmN0aW9uIFBvaW50KHgsIHkpIHtcbiAgICB0aGlzLnggPSB4O1xuICAgIHRoaXMueSA9IHk7XG59XG5cblBvaW50LnByb3RvdHlwZSA9IHtcbiAgICBjbG9uZTogZnVuY3Rpb24oKSB7IHJldHVybiBuZXcgUG9pbnQodGhpcy54LCB0aGlzLnkpOyB9LFxuXG4gICAgYWRkOiAgICAgZnVuY3Rpb24ocCkgeyByZXR1cm4gdGhpcy5jbG9uZSgpLl9hZGQocCk7ICAgICB9LFxuICAgIHN1YjogICAgIGZ1bmN0aW9uKHApIHsgcmV0dXJuIHRoaXMuY2xvbmUoKS5fc3ViKHApOyAgICAgfSxcbiAgICBtdWx0OiAgICBmdW5jdGlvbihrKSB7IHJldHVybiB0aGlzLmNsb25lKCkuX211bHQoayk7ICAgIH0sXG4gICAgZGl2OiAgICAgZnVuY3Rpb24oaykgeyByZXR1cm4gdGhpcy5jbG9uZSgpLl9kaXYoayk7ICAgICB9LFxuICAgIHJvdGF0ZTogIGZ1bmN0aW9uKGEpIHsgcmV0dXJuIHRoaXMuY2xvbmUoKS5fcm90YXRlKGEpOyAgfSxcbiAgICBtYXRNdWx0OiBmdW5jdGlvbihtKSB7IHJldHVybiB0aGlzLmNsb25lKCkuX21hdE11bHQobSk7IH0sXG4gICAgdW5pdDogICAgZnVuY3Rpb24oKSB7IHJldHVybiB0aGlzLmNsb25lKCkuX3VuaXQoKTsgfSxcbiAgICBwZXJwOiAgICBmdW5jdGlvbigpIHsgcmV0dXJuIHRoaXMuY2xvbmUoKS5fcGVycCgpOyB9LFxuICAgIHJvdW5kOiAgIGZ1bmN0aW9uKCkgeyByZXR1cm4gdGhpcy5jbG9uZSgpLl9yb3VuZCgpOyB9LFxuXG4gICAgbWFnOiBmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIE1hdGguc3FydCh0aGlzLnggKiB0aGlzLnggKyB0aGlzLnkgKiB0aGlzLnkpO1xuICAgIH0sXG5cbiAgICBlcXVhbHM6IGZ1bmN0aW9uKHApIHtcbiAgICAgICAgcmV0dXJuIHRoaXMueCA9PT0gcC54ICYmXG4gICAgICAgICAgICAgICB0aGlzLnkgPT09IHAueTtcbiAgICB9LFxuXG4gICAgZGlzdDogZnVuY3Rpb24ocCkge1xuICAgICAgICByZXR1cm4gTWF0aC5zcXJ0KHRoaXMuZGlzdFNxcihwKSk7XG4gICAgfSxcblxuICAgIGRpc3RTcXI6IGZ1bmN0aW9uKHApIHtcbiAgICAgICAgdmFyIGR4ID0gcC54IC0gdGhpcy54LFxuICAgICAgICAgICAgZHkgPSBwLnkgLSB0aGlzLnk7XG4gICAgICAgIHJldHVybiBkeCAqIGR4ICsgZHkgKiBkeTtcbiAgICB9LFxuXG4gICAgYW5nbGU6IGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gTWF0aC5hdGFuMih0aGlzLnksIHRoaXMueCk7XG4gICAgfSxcblxuICAgIGFuZ2xlVG86IGZ1bmN0aW9uKGIpIHtcbiAgICAgICAgcmV0dXJuIE1hdGguYXRhbjIodGhpcy55IC0gYi55LCB0aGlzLnggLSBiLngpO1xuICAgIH0sXG5cbiAgICBhbmdsZVdpdGg6IGZ1bmN0aW9uKGIpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYW5nbGVXaXRoU2VwKGIueCwgYi55KTtcbiAgICB9LFxuXG4gICAgLy8gRmluZCB0aGUgYW5nbGUgb2YgdGhlIHR3byB2ZWN0b3JzLCBzb2x2aW5nIHRoZSBmb3JtdWxhIGZvciB0aGUgY3Jvc3MgcHJvZHVjdCBhIHggYiA9IHxhfHxifHNpbijOuCkgZm9yIM64LlxuICAgIGFuZ2xlV2l0aFNlcDogZnVuY3Rpb24oeCwgeSkge1xuICAgICAgICByZXR1cm4gTWF0aC5hdGFuMihcbiAgICAgICAgICAgIHRoaXMueCAqIHkgLSB0aGlzLnkgKiB4LFxuICAgICAgICAgICAgdGhpcy54ICogeCArIHRoaXMueSAqIHkpO1xuICAgIH0sXG5cbiAgICBfbWF0TXVsdDogZnVuY3Rpb24obSkge1xuICAgICAgICB2YXIgeCA9IG1bMF0gKiB0aGlzLnggKyBtWzFdICogdGhpcy55LFxuICAgICAgICAgICAgeSA9IG1bMl0gKiB0aGlzLnggKyBtWzNdICogdGhpcy55O1xuICAgICAgICB0aGlzLnggPSB4O1xuICAgICAgICB0aGlzLnkgPSB5O1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuXG4gICAgX2FkZDogZnVuY3Rpb24ocCkge1xuICAgICAgICB0aGlzLnggKz0gcC54O1xuICAgICAgICB0aGlzLnkgKz0gcC55O1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuXG4gICAgX3N1YjogZnVuY3Rpb24ocCkge1xuICAgICAgICB0aGlzLnggLT0gcC54O1xuICAgICAgICB0aGlzLnkgLT0gcC55O1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuXG4gICAgX211bHQ6IGZ1bmN0aW9uKGspIHtcbiAgICAgICAgdGhpcy54ICo9IGs7XG4gICAgICAgIHRoaXMueSAqPSBrO1xuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9LFxuXG4gICAgX2RpdjogZnVuY3Rpb24oaykge1xuICAgICAgICB0aGlzLnggLz0gaztcbiAgICAgICAgdGhpcy55IC89IGs7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG5cbiAgICBfdW5pdDogZnVuY3Rpb24oKSB7XG4gICAgICAgIHRoaXMuX2Rpdih0aGlzLm1hZygpKTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfSxcblxuICAgIF9wZXJwOiBmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIHkgPSB0aGlzLnk7XG4gICAgICAgIHRoaXMueSA9IHRoaXMueDtcbiAgICAgICAgdGhpcy54ID0gLXk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG5cbiAgICBfcm90YXRlOiBmdW5jdGlvbihhbmdsZSkge1xuICAgICAgICB2YXIgY29zID0gTWF0aC5jb3MoYW5nbGUpLFxuICAgICAgICAgICAgc2luID0gTWF0aC5zaW4oYW5nbGUpLFxuICAgICAgICAgICAgeCA9IGNvcyAqIHRoaXMueCAtIHNpbiAqIHRoaXMueSxcbiAgICAgICAgICAgIHkgPSBzaW4gKiB0aGlzLnggKyBjb3MgKiB0aGlzLnk7XG4gICAgICAgIHRoaXMueCA9IHg7XG4gICAgICAgIHRoaXMueSA9IHk7XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH0sXG5cbiAgICBfcm91bmQ6IGZ1bmN0aW9uKCkge1xuICAgICAgICB0aGlzLnggPSBNYXRoLnJvdW5kKHRoaXMueCk7XG4gICAgICAgIHRoaXMueSA9IE1hdGgucm91bmQodGhpcy55KTtcbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxufTtcblxuLy8gY29uc3RydWN0cyBQb2ludCBmcm9tIGFuIGFycmF5IGlmIG5lY2Vzc2FyeVxuUG9pbnQuY29udmVydCA9IGZ1bmN0aW9uIChhKSB7XG4gICAgaWYgKGEgaW5zdGFuY2VvZiBQb2ludCkge1xuICAgICAgICByZXR1cm4gYTtcbiAgICB9XG4gICAgaWYgKEFycmF5LmlzQXJyYXkoYSkpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQb2ludChhWzBdLCBhWzFdKTtcbiAgICB9XG4gICAgcmV0dXJuIGE7XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG5pZiAoIXByb2Nlc3MudmVyc2lvbiB8fFxuICAgIHByb2Nlc3MudmVyc2lvbi5pbmRleE9mKCd2MC4nKSA9PT0gMCB8fFxuICAgIHByb2Nlc3MudmVyc2lvbi5pbmRleE9mKCd2MS4nKSA9PT0gMCAmJiBwcm9jZXNzLnZlcnNpb24uaW5kZXhPZigndjEuOC4nKSAhPT0gMCkge1xuICBtb2R1bGUuZXhwb3J0cyA9IG5leHRUaWNrO1xufSBlbHNlIHtcbiAgbW9kdWxlLmV4cG9ydHMgPSBwcm9jZXNzLm5leHRUaWNrO1xufVxuXG5mdW5jdGlvbiBuZXh0VGljayhmbiwgYXJnMSwgYXJnMiwgYXJnMykge1xuICBpZiAodHlwZW9mIGZuICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgdGhyb3cgbmV3IFR5cGVFcnJvcignXCJjYWxsYmFja1wiIGFyZ3VtZW50IG11c3QgYmUgYSBmdW5jdGlvbicpO1xuICB9XG4gIHZhciBsZW4gPSBhcmd1bWVudHMubGVuZ3RoO1xuICB2YXIgYXJncywgaTtcbiAgc3dpdGNoIChsZW4pIHtcbiAgY2FzZSAwOlxuICBjYXNlIDE6XG4gICAgcmV0dXJuIHByb2Nlc3MubmV4dFRpY2soZm4pO1xuICBjYXNlIDI6XG4gICAgcmV0dXJuIHByb2Nlc3MubmV4dFRpY2soZnVuY3Rpb24gYWZ0ZXJUaWNrT25lKCkge1xuICAgICAgZm4uY2FsbChudWxsLCBhcmcxKTtcbiAgICB9KTtcbiAgY2FzZSAzOlxuICAgIHJldHVybiBwcm9jZXNzLm5leHRUaWNrKGZ1bmN0aW9uIGFmdGVyVGlja1R3bygpIHtcbiAgICAgIGZuLmNhbGwobnVsbCwgYXJnMSwgYXJnMik7XG4gICAgfSk7XG4gIGNhc2UgNDpcbiAgICByZXR1cm4gcHJvY2Vzcy5uZXh0VGljayhmdW5jdGlvbiBhZnRlclRpY2tUaHJlZSgpIHtcbiAgICAgIGZuLmNhbGwobnVsbCwgYXJnMSwgYXJnMiwgYXJnMyk7XG4gICAgfSk7XG4gIGRlZmF1bHQ6XG4gICAgYXJncyA9IG5ldyBBcnJheShsZW4gLSAxKTtcbiAgICBpID0gMDtcbiAgICB3aGlsZSAoaSA8IGFyZ3MubGVuZ3RoKSB7XG4gICAgICBhcmdzW2krK10gPSBhcmd1bWVudHNbaV07XG4gICAgfVxuICAgIHJldHVybiBwcm9jZXNzLm5leHRUaWNrKGZ1bmN0aW9uIGFmdGVyVGljaygpIHtcbiAgICAgIGZuLmFwcGx5KG51bGwsIGFyZ3MpO1xuICAgIH0pO1xuICB9XG59XG4iLCIvLyBzaGltIGZvciB1c2luZyBwcm9jZXNzIGluIGJyb3dzZXJcbnZhciBwcm9jZXNzID0gbW9kdWxlLmV4cG9ydHMgPSB7fTtcblxuLy8gY2FjaGVkIGZyb20gd2hhdGV2ZXIgZ2xvYmFsIGlzIHByZXNlbnQgc28gdGhhdCB0ZXN0IHJ1bm5lcnMgdGhhdCBzdHViIGl0XG4vLyBkb24ndCBicmVhayB0aGluZ3MuICBCdXQgd2UgbmVlZCB0byB3cmFwIGl0IGluIGEgdHJ5IGNhdGNoIGluIGNhc2UgaXQgaXNcbi8vIHdyYXBwZWQgaW4gc3RyaWN0IG1vZGUgY29kZSB3aGljaCBkb2Vzbid0IGRlZmluZSBhbnkgZ2xvYmFscy4gIEl0J3MgaW5zaWRlIGFcbi8vIGZ1bmN0aW9uIGJlY2F1c2UgdHJ5L2NhdGNoZXMgZGVvcHRpbWl6ZSBpbiBjZXJ0YWluIGVuZ2luZXMuXG5cbnZhciBjYWNoZWRTZXRUaW1lb3V0O1xudmFyIGNhY2hlZENsZWFyVGltZW91dDtcblxuZnVuY3Rpb24gZGVmYXVsdFNldFRpbW91dCgpIHtcbiAgICB0aHJvdyBuZXcgRXJyb3IoJ3NldFRpbWVvdXQgaGFzIG5vdCBiZWVuIGRlZmluZWQnKTtcbn1cbmZ1bmN0aW9uIGRlZmF1bHRDbGVhclRpbWVvdXQgKCkge1xuICAgIHRocm93IG5ldyBFcnJvcignY2xlYXJUaW1lb3V0IGhhcyBub3QgYmVlbiBkZWZpbmVkJyk7XG59XG4oZnVuY3Rpb24gKCkge1xuICAgIHRyeSB7XG4gICAgICAgIGlmICh0eXBlb2Ygc2V0VGltZW91dCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgY2FjaGVkU2V0VGltZW91dCA9IHNldFRpbWVvdXQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjYWNoZWRTZXRUaW1lb3V0ID0gZGVmYXVsdFNldFRpbW91dDtcbiAgICAgICAgfVxuICAgIH0gY2F0Y2ggKGUpIHtcbiAgICAgICAgY2FjaGVkU2V0VGltZW91dCA9IGRlZmF1bHRTZXRUaW1vdXQ7XG4gICAgfVxuICAgIHRyeSB7XG4gICAgICAgIGlmICh0eXBlb2YgY2xlYXJUaW1lb3V0ID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICBjYWNoZWRDbGVhclRpbWVvdXQgPSBjbGVhclRpbWVvdXQ7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBjYWNoZWRDbGVhclRpbWVvdXQgPSBkZWZhdWx0Q2xlYXJUaW1lb3V0O1xuICAgICAgICB9XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgICBjYWNoZWRDbGVhclRpbWVvdXQgPSBkZWZhdWx0Q2xlYXJUaW1lb3V0O1xuICAgIH1cbn0gKCkpXG5mdW5jdGlvbiBydW5UaW1lb3V0KGZ1bikge1xuICAgIGlmIChjYWNoZWRTZXRUaW1lb3V0ID09PSBzZXRUaW1lb3V0KSB7XG4gICAgICAgIC8vbm9ybWFsIGVudmlyb21lbnRzIGluIHNhbmUgc2l0dWF0aW9uc1xuICAgICAgICByZXR1cm4gc2V0VGltZW91dChmdW4sIDApO1xuICAgIH1cbiAgICAvLyBpZiBzZXRUaW1lb3V0IHdhc24ndCBhdmFpbGFibGUgYnV0IHdhcyBsYXR0ZXIgZGVmaW5lZFxuICAgIGlmICgoY2FjaGVkU2V0VGltZW91dCA9PT0gZGVmYXVsdFNldFRpbW91dCB8fCAhY2FjaGVkU2V0VGltZW91dCkgJiYgc2V0VGltZW91dCkge1xuICAgICAgICBjYWNoZWRTZXRUaW1lb3V0ID0gc2V0VGltZW91dDtcbiAgICAgICAgcmV0dXJuIHNldFRpbWVvdXQoZnVuLCAwKTtcbiAgICB9XG4gICAgdHJ5IHtcbiAgICAgICAgLy8gd2hlbiB3aGVuIHNvbWVib2R5IGhhcyBzY3Jld2VkIHdpdGggc2V0VGltZW91dCBidXQgbm8gSS5FLiBtYWRkbmVzc1xuICAgICAgICByZXR1cm4gY2FjaGVkU2V0VGltZW91dChmdW4sIDApO1xuICAgIH0gY2F0Y2goZSl7XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICAvLyBXaGVuIHdlIGFyZSBpbiBJLkUuIGJ1dCB0aGUgc2NyaXB0IGhhcyBiZWVuIGV2YWxlZCBzbyBJLkUuIGRvZXNuJ3QgdHJ1c3QgdGhlIGdsb2JhbCBvYmplY3Qgd2hlbiBjYWxsZWQgbm9ybWFsbHlcbiAgICAgICAgICAgIHJldHVybiBjYWNoZWRTZXRUaW1lb3V0LmNhbGwobnVsbCwgZnVuLCAwKTtcbiAgICAgICAgfSBjYXRjaChlKXtcbiAgICAgICAgICAgIC8vIHNhbWUgYXMgYWJvdmUgYnV0IHdoZW4gaXQncyBhIHZlcnNpb24gb2YgSS5FLiB0aGF0IG11c3QgaGF2ZSB0aGUgZ2xvYmFsIG9iamVjdCBmb3IgJ3RoaXMnLCBob3BmdWxseSBvdXIgY29udGV4dCBjb3JyZWN0IG90aGVyd2lzZSBpdCB3aWxsIHRocm93IGEgZ2xvYmFsIGVycm9yXG4gICAgICAgICAgICByZXR1cm4gY2FjaGVkU2V0VGltZW91dC5jYWxsKHRoaXMsIGZ1biwgMCk7XG4gICAgICAgIH1cbiAgICB9XG5cblxufVxuZnVuY3Rpb24gcnVuQ2xlYXJUaW1lb3V0KG1hcmtlcikge1xuICAgIGlmIChjYWNoZWRDbGVhclRpbWVvdXQgPT09IGNsZWFyVGltZW91dCkge1xuICAgICAgICAvL25vcm1hbCBlbnZpcm9tZW50cyBpbiBzYW5lIHNpdHVhdGlvbnNcbiAgICAgICAgcmV0dXJuIGNsZWFyVGltZW91dChtYXJrZXIpO1xuICAgIH1cbiAgICAvLyBpZiBjbGVhclRpbWVvdXQgd2Fzbid0IGF2YWlsYWJsZSBidXQgd2FzIGxhdHRlciBkZWZpbmVkXG4gICAgaWYgKChjYWNoZWRDbGVhclRpbWVvdXQgPT09IGRlZmF1bHRDbGVhclRpbWVvdXQgfHwgIWNhY2hlZENsZWFyVGltZW91dCkgJiYgY2xlYXJUaW1lb3V0KSB7XG4gICAgICAgIGNhY2hlZENsZWFyVGltZW91dCA9IGNsZWFyVGltZW91dDtcbiAgICAgICAgcmV0dXJuIGNsZWFyVGltZW91dChtYXJrZXIpO1xuICAgIH1cbiAgICB0cnkge1xuICAgICAgICAvLyB3aGVuIHdoZW4gc29tZWJvZHkgaGFzIHNjcmV3ZWQgd2l0aCBzZXRUaW1lb3V0IGJ1dCBubyBJLkUuIG1hZGRuZXNzXG4gICAgICAgIHJldHVybiBjYWNoZWRDbGVhclRpbWVvdXQobWFya2VyKTtcbiAgICB9IGNhdGNoIChlKXtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIC8vIFdoZW4gd2UgYXJlIGluIEkuRS4gYnV0IHRoZSBzY3JpcHQgaGFzIGJlZW4gZXZhbGVkIHNvIEkuRS4gZG9lc24ndCAgdHJ1c3QgdGhlIGdsb2JhbCBvYmplY3Qgd2hlbiBjYWxsZWQgbm9ybWFsbHlcbiAgICAgICAgICAgIHJldHVybiBjYWNoZWRDbGVhclRpbWVvdXQuY2FsbChudWxsLCBtYXJrZXIpO1xuICAgICAgICB9IGNhdGNoIChlKXtcbiAgICAgICAgICAgIC8vIHNhbWUgYXMgYWJvdmUgYnV0IHdoZW4gaXQncyBhIHZlcnNpb24gb2YgSS5FLiB0aGF0IG11c3QgaGF2ZSB0aGUgZ2xvYmFsIG9iamVjdCBmb3IgJ3RoaXMnLCBob3BmdWxseSBvdXIgY29udGV4dCBjb3JyZWN0IG90aGVyd2lzZSBpdCB3aWxsIHRocm93IGEgZ2xvYmFsIGVycm9yLlxuICAgICAgICAgICAgLy8gU29tZSB2ZXJzaW9ucyBvZiBJLkUuIGhhdmUgZGlmZmVyZW50IHJ1bGVzIGZvciBjbGVhclRpbWVvdXQgdnMgc2V0VGltZW91dFxuICAgICAgICAgICAgcmV0dXJuIGNhY2hlZENsZWFyVGltZW91dC5jYWxsKHRoaXMsIG1hcmtlcik7XG4gICAgICAgIH1cbiAgICB9XG5cblxuXG59XG52YXIgcXVldWUgPSBbXTtcbnZhciBkcmFpbmluZyA9IGZhbHNlO1xudmFyIGN1cnJlbnRRdWV1ZTtcbnZhciBxdWV1ZUluZGV4ID0gLTE7XG5cbmZ1bmN0aW9uIGNsZWFuVXBOZXh0VGljaygpIHtcbiAgICBpZiAoIWRyYWluaW5nIHx8ICFjdXJyZW50UXVldWUpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICBkcmFpbmluZyA9IGZhbHNlO1xuICAgIGlmIChjdXJyZW50UXVldWUubGVuZ3RoKSB7XG4gICAgICAgIHF1ZXVlID0gY3VycmVudFF1ZXVlLmNvbmNhdChxdWV1ZSk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgcXVldWVJbmRleCA9IC0xO1xuICAgIH1cbiAgICBpZiAocXVldWUubGVuZ3RoKSB7XG4gICAgICAgIGRyYWluUXVldWUoKTtcbiAgICB9XG59XG5cbmZ1bmN0aW9uIGRyYWluUXVldWUoKSB7XG4gICAgaWYgKGRyYWluaW5nKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG4gICAgdmFyIHRpbWVvdXQgPSBydW5UaW1lb3V0KGNsZWFuVXBOZXh0VGljayk7XG4gICAgZHJhaW5pbmcgPSB0cnVlO1xuXG4gICAgdmFyIGxlbiA9IHF1ZXVlLmxlbmd0aDtcbiAgICB3aGlsZShsZW4pIHtcbiAgICAgICAgY3VycmVudFF1ZXVlID0gcXVldWU7XG4gICAgICAgIHF1ZXVlID0gW107XG4gICAgICAgIHdoaWxlICgrK3F1ZXVlSW5kZXggPCBsZW4pIHtcbiAgICAgICAgICAgIGlmIChjdXJyZW50UXVldWUpIHtcbiAgICAgICAgICAgICAgICBjdXJyZW50UXVldWVbcXVldWVJbmRleF0ucnVuKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcXVldWVJbmRleCA9IC0xO1xuICAgICAgICBsZW4gPSBxdWV1ZS5sZW5ndGg7XG4gICAgfVxuICAgIGN1cnJlbnRRdWV1ZSA9IG51bGw7XG4gICAgZHJhaW5pbmcgPSBmYWxzZTtcbiAgICBydW5DbGVhclRpbWVvdXQodGltZW91dCk7XG59XG5cbnByb2Nlc3MubmV4dFRpY2sgPSBmdW5jdGlvbiAoZnVuKSB7XG4gICAgdmFyIGFyZ3MgPSBuZXcgQXJyYXkoYXJndW1lbnRzLmxlbmd0aCAtIDEpO1xuICAgIGlmIChhcmd1bWVudHMubGVuZ3RoID4gMSkge1xuICAgICAgICBmb3IgKHZhciBpID0gMTsgaSA8IGFyZ3VtZW50cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgYXJnc1tpIC0gMV0gPSBhcmd1bWVudHNbaV07XG4gICAgICAgIH1cbiAgICB9XG4gICAgcXVldWUucHVzaChuZXcgSXRlbShmdW4sIGFyZ3MpKTtcbiAgICBpZiAocXVldWUubGVuZ3RoID09PSAxICYmICFkcmFpbmluZykge1xuICAgICAgICBydW5UaW1lb3V0KGRyYWluUXVldWUpO1xuICAgIH1cbn07XG5cbi8vIHY4IGxpa2VzIHByZWRpY3RpYmxlIG9iamVjdHNcbmZ1bmN0aW9uIEl0ZW0oZnVuLCBhcnJheSkge1xuICAgIHRoaXMuZnVuID0gZnVuO1xuICAgIHRoaXMuYXJyYXkgPSBhcnJheTtcbn1cbkl0ZW0ucHJvdG90eXBlLnJ1biA9IGZ1bmN0aW9uICgpIHtcbiAgICB0aGlzLmZ1bi5hcHBseShudWxsLCB0aGlzLmFycmF5KTtcbn07XG5wcm9jZXNzLnRpdGxlID0gJ2Jyb3dzZXInO1xucHJvY2Vzcy5icm93c2VyID0gdHJ1ZTtcbnByb2Nlc3MuZW52ID0ge307XG5wcm9jZXNzLmFyZ3YgPSBbXTtcbnByb2Nlc3MudmVyc2lvbiA9ICcnOyAvLyBlbXB0eSBzdHJpbmcgdG8gYXZvaWQgcmVnZXhwIGlzc3Vlc1xucHJvY2Vzcy52ZXJzaW9ucyA9IHt9O1xuXG5mdW5jdGlvbiBub29wKCkge31cblxucHJvY2Vzcy5vbiA9IG5vb3A7XG5wcm9jZXNzLmFkZExpc3RlbmVyID0gbm9vcDtcbnByb2Nlc3Mub25jZSA9IG5vb3A7XG5wcm9jZXNzLm9mZiA9IG5vb3A7XG5wcm9jZXNzLnJlbW92ZUxpc3RlbmVyID0gbm9vcDtcbnByb2Nlc3MucmVtb3ZlQWxsTGlzdGVuZXJzID0gbm9vcDtcbnByb2Nlc3MuZW1pdCA9IG5vb3A7XG5cbnByb2Nlc3MuYmluZGluZyA9IGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdwcm9jZXNzLmJpbmRpbmcgaXMgbm90IHN1cHBvcnRlZCcpO1xufTtcblxucHJvY2Vzcy5jd2QgPSBmdW5jdGlvbiAoKSB7IHJldHVybiAnLycgfTtcbnByb2Nlc3MuY2hkaXIgPSBmdW5jdGlvbiAoZGlyKSB7XG4gICAgdGhyb3cgbmV3IEVycm9yKCdwcm9jZXNzLmNoZGlyIGlzIG5vdCBzdXBwb3J0ZWQnKTtcbn07XG5wcm9jZXNzLnVtYXNrID0gZnVuY3Rpb24oKSB7IHJldHVybiAwOyB9O1xuIiwiLy8gYSBkdXBsZXggc3RyZWFtIGlzIGp1c3QgYSBzdHJlYW0gdGhhdCBpcyBib3RoIHJlYWRhYmxlIGFuZCB3cml0YWJsZS5cbi8vIFNpbmNlIEpTIGRvZXNuJ3QgaGF2ZSBtdWx0aXBsZSBwcm90b3R5cGFsIGluaGVyaXRhbmNlLCB0aGlzIGNsYXNzXG4vLyBwcm90b3R5cGFsbHkgaW5oZXJpdHMgZnJvbSBSZWFkYWJsZSwgYW5kIHRoZW4gcGFyYXNpdGljYWxseSBmcm9tXG4vLyBXcml0YWJsZS5cblxuJ3VzZSBzdHJpY3QnO1xuXG4vKjxyZXBsYWNlbWVudD4qL1xuXG52YXIgb2JqZWN0S2V5cyA9IE9iamVjdC5rZXlzIHx8IGZ1bmN0aW9uIChvYmopIHtcbiAgdmFyIGtleXMgPSBbXTtcbiAgZm9yICh2YXIga2V5IGluIG9iaikge1xuICAgIGtleXMucHVzaChrZXkpO1xuICB9cmV0dXJuIGtleXM7XG59O1xuLyo8L3JlcGxhY2VtZW50PiovXG5cbm1vZHVsZS5leHBvcnRzID0gRHVwbGV4O1xuXG4vKjxyZXBsYWNlbWVudD4qL1xudmFyIHByb2Nlc3NOZXh0VGljayA9IHJlcXVpcmUoJ3Byb2Nlc3MtbmV4dGljay1hcmdzJyk7XG4vKjwvcmVwbGFjZW1lbnQ+Ki9cblxuLyo8cmVwbGFjZW1lbnQ+Ki9cbnZhciB1dGlsID0gcmVxdWlyZSgnY29yZS11dGlsLWlzJyk7XG51dGlsLmluaGVyaXRzID0gcmVxdWlyZSgnaW5oZXJpdHMnKTtcbi8qPC9yZXBsYWNlbWVudD4qL1xuXG52YXIgUmVhZGFibGUgPSByZXF1aXJlKCcuL19zdHJlYW1fcmVhZGFibGUnKTtcbnZhciBXcml0YWJsZSA9IHJlcXVpcmUoJy4vX3N0cmVhbV93cml0YWJsZScpO1xuXG51dGlsLmluaGVyaXRzKER1cGxleCwgUmVhZGFibGUpO1xuXG52YXIga2V5cyA9IG9iamVjdEtleXMoV3JpdGFibGUucHJvdG90eXBlKTtcbmZvciAodmFyIHYgPSAwOyB2IDwga2V5cy5sZW5ndGg7IHYrKykge1xuICB2YXIgbWV0aG9kID0ga2V5c1t2XTtcbiAgaWYgKCFEdXBsZXgucHJvdG90eXBlW21ldGhvZF0pIER1cGxleC5wcm90b3R5cGVbbWV0aG9kXSA9IFdyaXRhYmxlLnByb3RvdHlwZVttZXRob2RdO1xufVxuXG5mdW5jdGlvbiBEdXBsZXgob3B0aW9ucykge1xuICBpZiAoISh0aGlzIGluc3RhbmNlb2YgRHVwbGV4KSkgcmV0dXJuIG5ldyBEdXBsZXgob3B0aW9ucyk7XG5cbiAgUmVhZGFibGUuY2FsbCh0aGlzLCBvcHRpb25zKTtcbiAgV3JpdGFibGUuY2FsbCh0aGlzLCBvcHRpb25zKTtcblxuICBpZiAob3B0aW9ucyAmJiBvcHRpb25zLnJlYWRhYmxlID09PSBmYWxzZSkgdGhpcy5yZWFkYWJsZSA9IGZhbHNlO1xuXG4gIGlmIChvcHRpb25zICYmIG9wdGlvbnMud3JpdGFibGUgPT09IGZhbHNlKSB0aGlzLndyaXRhYmxlID0gZmFsc2U7XG5cbiAgdGhpcy5hbGxvd0hhbGZPcGVuID0gdHJ1ZTtcbiAgaWYgKG9wdGlvbnMgJiYgb3B0aW9ucy5hbGxvd0hhbGZPcGVuID09PSBmYWxzZSkgdGhpcy5hbGxvd0hhbGZPcGVuID0gZmFsc2U7XG5cbiAgdGhpcy5vbmNlKCdlbmQnLCBvbmVuZCk7XG59XG5cbi8vIHRoZSBuby1oYWxmLW9wZW4gZW5mb3JjZXJcbmZ1bmN0aW9uIG9uZW5kKCkge1xuICAvLyBpZiB3ZSBhbGxvdyBoYWxmLW9wZW4gc3RhdGUsIG9yIGlmIHRoZSB3cml0YWJsZSBzaWRlIGVuZGVkLFxuICAvLyB0aGVuIHdlJ3JlIG9rLlxuICBpZiAodGhpcy5hbGxvd0hhbGZPcGVuIHx8IHRoaXMuX3dyaXRhYmxlU3RhdGUuZW5kZWQpIHJldHVybjtcblxuICAvLyBubyBtb3JlIGRhdGEgY2FuIGJlIHdyaXR0ZW4uXG4gIC8vIEJ1dCBhbGxvdyBtb3JlIHdyaXRlcyB0byBoYXBwZW4gaW4gdGhpcyB0aWNrLlxuICBwcm9jZXNzTmV4dFRpY2sob25FbmROVCwgdGhpcyk7XG59XG5cbmZ1bmN0aW9uIG9uRW5kTlQoc2VsZikge1xuICBzZWxmLmVuZCgpO1xufVxuXG5mdW5jdGlvbiBmb3JFYWNoKHhzLCBmKSB7XG4gIGZvciAodmFyIGkgPSAwLCBsID0geHMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgZih4c1tpXSwgaSk7XG4gIH1cbn0iLCIvLyBhIHBhc3N0aHJvdWdoIHN0cmVhbS5cbi8vIGJhc2ljYWxseSBqdXN0IHRoZSBtb3N0IG1pbmltYWwgc29ydCBvZiBUcmFuc2Zvcm0gc3RyZWFtLlxuLy8gRXZlcnkgd3JpdHRlbiBjaHVuayBnZXRzIG91dHB1dCBhcy1pcy5cblxuJ3VzZSBzdHJpY3QnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IFBhc3NUaHJvdWdoO1xuXG52YXIgVHJhbnNmb3JtID0gcmVxdWlyZSgnLi9fc3RyZWFtX3RyYW5zZm9ybScpO1xuXG4vKjxyZXBsYWNlbWVudD4qL1xudmFyIHV0aWwgPSByZXF1aXJlKCdjb3JlLXV0aWwtaXMnKTtcbnV0aWwuaW5oZXJpdHMgPSByZXF1aXJlKCdpbmhlcml0cycpO1xuLyo8L3JlcGxhY2VtZW50PiovXG5cbnV0aWwuaW5oZXJpdHMoUGFzc1Rocm91Z2gsIFRyYW5zZm9ybSk7XG5cbmZ1bmN0aW9uIFBhc3NUaHJvdWdoKG9wdGlvbnMpIHtcbiAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIFBhc3NUaHJvdWdoKSkgcmV0dXJuIG5ldyBQYXNzVGhyb3VnaChvcHRpb25zKTtcblxuICBUcmFuc2Zvcm0uY2FsbCh0aGlzLCBvcHRpb25zKTtcbn1cblxuUGFzc1Rocm91Z2gucHJvdG90eXBlLl90cmFuc2Zvcm0gPSBmdW5jdGlvbiAoY2h1bmssIGVuY29kaW5nLCBjYikge1xuICBjYihudWxsLCBjaHVuayk7XG59OyIsIid1c2Ugc3RyaWN0JztcblxubW9kdWxlLmV4cG9ydHMgPSBSZWFkYWJsZTtcblxuLyo8cmVwbGFjZW1lbnQ+Ki9cbnZhciBwcm9jZXNzTmV4dFRpY2sgPSByZXF1aXJlKCdwcm9jZXNzLW5leHRpY2stYXJncycpO1xuLyo8L3JlcGxhY2VtZW50PiovXG5cbi8qPHJlcGxhY2VtZW50PiovXG52YXIgaXNBcnJheSA9IHJlcXVpcmUoJ2lzYXJyYXknKTtcbi8qPC9yZXBsYWNlbWVudD4qL1xuXG4vKjxyZXBsYWNlbWVudD4qL1xudmFyIEJ1ZmZlciA9IHJlcXVpcmUoJ2J1ZmZlcicpLkJ1ZmZlcjtcbi8qPC9yZXBsYWNlbWVudD4qL1xuXG5SZWFkYWJsZS5SZWFkYWJsZVN0YXRlID0gUmVhZGFibGVTdGF0ZTtcblxudmFyIEVFID0gcmVxdWlyZSgnZXZlbnRzJyk7XG5cbi8qPHJlcGxhY2VtZW50PiovXG52YXIgRUVsaXN0ZW5lckNvdW50ID0gZnVuY3Rpb24gKGVtaXR0ZXIsIHR5cGUpIHtcbiAgcmV0dXJuIGVtaXR0ZXIubGlzdGVuZXJzKHR5cGUpLmxlbmd0aDtcbn07XG4vKjwvcmVwbGFjZW1lbnQ+Ki9cblxuLyo8cmVwbGFjZW1lbnQ+Ki9cbnZhciBTdHJlYW07XG4oZnVuY3Rpb24gKCkge1xuICB0cnkge1xuICAgIFN0cmVhbSA9IHJlcXVpcmUoJ3N0JyArICdyZWFtJyk7XG4gIH0gY2F0Y2ggKF8pIHt9IGZpbmFsbHkge1xuICAgIGlmICghU3RyZWFtKSBTdHJlYW0gPSByZXF1aXJlKCdldmVudHMnKS5FdmVudEVtaXR0ZXI7XG4gIH1cbn0pKCk7XG4vKjwvcmVwbGFjZW1lbnQ+Ki9cblxudmFyIEJ1ZmZlciA9IHJlcXVpcmUoJ2J1ZmZlcicpLkJ1ZmZlcjtcblxuLyo8cmVwbGFjZW1lbnQ+Ki9cbnZhciB1dGlsID0gcmVxdWlyZSgnY29yZS11dGlsLWlzJyk7XG51dGlsLmluaGVyaXRzID0gcmVxdWlyZSgnaW5oZXJpdHMnKTtcbi8qPC9yZXBsYWNlbWVudD4qL1xuXG4vKjxyZXBsYWNlbWVudD4qL1xudmFyIGRlYnVnVXRpbCA9IHJlcXVpcmUoJ3V0aWwnKTtcbnZhciBkZWJ1ZyA9IHVuZGVmaW5lZDtcbmlmIChkZWJ1Z1V0aWwgJiYgZGVidWdVdGlsLmRlYnVnbG9nKSB7XG4gIGRlYnVnID0gZGVidWdVdGlsLmRlYnVnbG9nKCdzdHJlYW0nKTtcbn0gZWxzZSB7XG4gIGRlYnVnID0gZnVuY3Rpb24gKCkge307XG59XG4vKjwvcmVwbGFjZW1lbnQ+Ki9cblxudmFyIFN0cmluZ0RlY29kZXI7XG5cbnV0aWwuaW5oZXJpdHMoUmVhZGFibGUsIFN0cmVhbSk7XG5cbnZhciBEdXBsZXg7XG5mdW5jdGlvbiBSZWFkYWJsZVN0YXRlKG9wdGlvbnMsIHN0cmVhbSkge1xuICBEdXBsZXggPSBEdXBsZXggfHwgcmVxdWlyZSgnLi9fc3RyZWFtX2R1cGxleCcpO1xuXG4gIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuXG4gIC8vIG9iamVjdCBzdHJlYW0gZmxhZy4gVXNlZCB0byBtYWtlIHJlYWQobikgaWdub3JlIG4gYW5kIHRvXG4gIC8vIG1ha2UgYWxsIHRoZSBidWZmZXIgbWVyZ2luZyBhbmQgbGVuZ3RoIGNoZWNrcyBnbyBhd2F5XG4gIHRoaXMub2JqZWN0TW9kZSA9ICEhb3B0aW9ucy5vYmplY3RNb2RlO1xuXG4gIGlmIChzdHJlYW0gaW5zdGFuY2VvZiBEdXBsZXgpIHRoaXMub2JqZWN0TW9kZSA9IHRoaXMub2JqZWN0TW9kZSB8fCAhIW9wdGlvbnMucmVhZGFibGVPYmplY3RNb2RlO1xuXG4gIC8vIHRoZSBwb2ludCBhdCB3aGljaCBpdCBzdG9wcyBjYWxsaW5nIF9yZWFkKCkgdG8gZmlsbCB0aGUgYnVmZmVyXG4gIC8vIE5vdGU6IDAgaXMgYSB2YWxpZCB2YWx1ZSwgbWVhbnMgXCJkb24ndCBjYWxsIF9yZWFkIHByZWVtcHRpdmVseSBldmVyXCJcbiAgdmFyIGh3bSA9IG9wdGlvbnMuaGlnaFdhdGVyTWFyaztcbiAgdmFyIGRlZmF1bHRId20gPSB0aGlzLm9iamVjdE1vZGUgPyAxNiA6IDE2ICogMTAyNDtcbiAgdGhpcy5oaWdoV2F0ZXJNYXJrID0gaHdtIHx8IGh3bSA9PT0gMCA/IGh3bSA6IGRlZmF1bHRId207XG5cbiAgLy8gY2FzdCB0byBpbnRzLlxuICB0aGlzLmhpZ2hXYXRlck1hcmsgPSB+IH50aGlzLmhpZ2hXYXRlck1hcms7XG5cbiAgdGhpcy5idWZmZXIgPSBbXTtcbiAgdGhpcy5sZW5ndGggPSAwO1xuICB0aGlzLnBpcGVzID0gbnVsbDtcbiAgdGhpcy5waXBlc0NvdW50ID0gMDtcbiAgdGhpcy5mbG93aW5nID0gbnVsbDtcbiAgdGhpcy5lbmRlZCA9IGZhbHNlO1xuICB0aGlzLmVuZEVtaXR0ZWQgPSBmYWxzZTtcbiAgdGhpcy5yZWFkaW5nID0gZmFsc2U7XG5cbiAgLy8gYSBmbGFnIHRvIGJlIGFibGUgdG8gdGVsbCBpZiB0aGUgb253cml0ZSBjYiBpcyBjYWxsZWQgaW1tZWRpYXRlbHksXG4gIC8vIG9yIG9uIGEgbGF0ZXIgdGljay4gIFdlIHNldCB0aGlzIHRvIHRydWUgYXQgZmlyc3QsIGJlY2F1c2UgYW55XG4gIC8vIGFjdGlvbnMgdGhhdCBzaG91bGRuJ3QgaGFwcGVuIHVudGlsIFwibGF0ZXJcIiBzaG91bGQgZ2VuZXJhbGx5IGFsc29cbiAgLy8gbm90IGhhcHBlbiBiZWZvcmUgdGhlIGZpcnN0IHdyaXRlIGNhbGwuXG4gIHRoaXMuc3luYyA9IHRydWU7XG5cbiAgLy8gd2hlbmV2ZXIgd2UgcmV0dXJuIG51bGwsIHRoZW4gd2Ugc2V0IGEgZmxhZyB0byBzYXlcbiAgLy8gdGhhdCB3ZSdyZSBhd2FpdGluZyBhICdyZWFkYWJsZScgZXZlbnQgZW1pc3Npb24uXG4gIHRoaXMubmVlZFJlYWRhYmxlID0gZmFsc2U7XG4gIHRoaXMuZW1pdHRlZFJlYWRhYmxlID0gZmFsc2U7XG4gIHRoaXMucmVhZGFibGVMaXN0ZW5pbmcgPSBmYWxzZTtcbiAgdGhpcy5yZXN1bWVTY2hlZHVsZWQgPSBmYWxzZTtcblxuICAvLyBDcnlwdG8gaXMga2luZCBvZiBvbGQgYW5kIGNydXN0eS4gIEhpc3RvcmljYWxseSwgaXRzIGRlZmF1bHQgc3RyaW5nXG4gIC8vIGVuY29kaW5nIGlzICdiaW5hcnknIHNvIHdlIGhhdmUgdG8gbWFrZSB0aGlzIGNvbmZpZ3VyYWJsZS5cbiAgLy8gRXZlcnl0aGluZyBlbHNlIGluIHRoZSB1bml2ZXJzZSB1c2VzICd1dGY4JywgdGhvdWdoLlxuICB0aGlzLmRlZmF1bHRFbmNvZGluZyA9IG9wdGlvbnMuZGVmYXVsdEVuY29kaW5nIHx8ICd1dGY4JztcblxuICAvLyB3aGVuIHBpcGluZywgd2Ugb25seSBjYXJlIGFib3V0ICdyZWFkYWJsZScgZXZlbnRzIHRoYXQgaGFwcGVuXG4gIC8vIGFmdGVyIHJlYWQoKWluZyBhbGwgdGhlIGJ5dGVzIGFuZCBub3QgZ2V0dGluZyBhbnkgcHVzaGJhY2suXG4gIHRoaXMucmFuT3V0ID0gZmFsc2U7XG5cbiAgLy8gdGhlIG51bWJlciBvZiB3cml0ZXJzIHRoYXQgYXJlIGF3YWl0aW5nIGEgZHJhaW4gZXZlbnQgaW4gLnBpcGUoKXNcbiAgdGhpcy5hd2FpdERyYWluID0gMDtcblxuICAvLyBpZiB0cnVlLCBhIG1heWJlUmVhZE1vcmUgaGFzIGJlZW4gc2NoZWR1bGVkXG4gIHRoaXMucmVhZGluZ01vcmUgPSBmYWxzZTtcblxuICB0aGlzLmRlY29kZXIgPSBudWxsO1xuICB0aGlzLmVuY29kaW5nID0gbnVsbDtcbiAgaWYgKG9wdGlvbnMuZW5jb2RpbmcpIHtcbiAgICBpZiAoIVN0cmluZ0RlY29kZXIpIFN0cmluZ0RlY29kZXIgPSByZXF1aXJlKCdzdHJpbmdfZGVjb2Rlci8nKS5TdHJpbmdEZWNvZGVyO1xuICAgIHRoaXMuZGVjb2RlciA9IG5ldyBTdHJpbmdEZWNvZGVyKG9wdGlvbnMuZW5jb2RpbmcpO1xuICAgIHRoaXMuZW5jb2RpbmcgPSBvcHRpb25zLmVuY29kaW5nO1xuICB9XG59XG5cbnZhciBEdXBsZXg7XG5mdW5jdGlvbiBSZWFkYWJsZShvcHRpb25zKSB7XG4gIER1cGxleCA9IER1cGxleCB8fCByZXF1aXJlKCcuL19zdHJlYW1fZHVwbGV4Jyk7XG5cbiAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIFJlYWRhYmxlKSkgcmV0dXJuIG5ldyBSZWFkYWJsZShvcHRpb25zKTtcblxuICB0aGlzLl9yZWFkYWJsZVN0YXRlID0gbmV3IFJlYWRhYmxlU3RhdGUob3B0aW9ucywgdGhpcyk7XG5cbiAgLy8gbGVnYWN5XG4gIHRoaXMucmVhZGFibGUgPSB0cnVlO1xuXG4gIGlmIChvcHRpb25zICYmIHR5cGVvZiBvcHRpb25zLnJlYWQgPT09ICdmdW5jdGlvbicpIHRoaXMuX3JlYWQgPSBvcHRpb25zLnJlYWQ7XG5cbiAgU3RyZWFtLmNhbGwodGhpcyk7XG59XG5cbi8vIE1hbnVhbGx5IHNob3ZlIHNvbWV0aGluZyBpbnRvIHRoZSByZWFkKCkgYnVmZmVyLlxuLy8gVGhpcyByZXR1cm5zIHRydWUgaWYgdGhlIGhpZ2hXYXRlck1hcmsgaGFzIG5vdCBiZWVuIGhpdCB5ZXQsXG4vLyBzaW1pbGFyIHRvIGhvdyBXcml0YWJsZS53cml0ZSgpIHJldHVybnMgdHJ1ZSBpZiB5b3Ugc2hvdWxkXG4vLyB3cml0ZSgpIHNvbWUgbW9yZS5cblJlYWRhYmxlLnByb3RvdHlwZS5wdXNoID0gZnVuY3Rpb24gKGNodW5rLCBlbmNvZGluZykge1xuICB2YXIgc3RhdGUgPSB0aGlzLl9yZWFkYWJsZVN0YXRlO1xuXG4gIGlmICghc3RhdGUub2JqZWN0TW9kZSAmJiB0eXBlb2YgY2h1bmsgPT09ICdzdHJpbmcnKSB7XG4gICAgZW5jb2RpbmcgPSBlbmNvZGluZyB8fCBzdGF0ZS5kZWZhdWx0RW5jb2Rpbmc7XG4gICAgaWYgKGVuY29kaW5nICE9PSBzdGF0ZS5lbmNvZGluZykge1xuICAgICAgY2h1bmsgPSBuZXcgQnVmZmVyKGNodW5rLCBlbmNvZGluZyk7XG4gICAgICBlbmNvZGluZyA9ICcnO1xuICAgIH1cbiAgfVxuXG4gIHJldHVybiByZWFkYWJsZUFkZENodW5rKHRoaXMsIHN0YXRlLCBjaHVuaywgZW5jb2RpbmcsIGZhbHNlKTtcbn07XG5cbi8vIFVuc2hpZnQgc2hvdWxkICphbHdheXMqIGJlIHNvbWV0aGluZyBkaXJlY3RseSBvdXQgb2YgcmVhZCgpXG5SZWFkYWJsZS5wcm90b3R5cGUudW5zaGlmdCA9IGZ1bmN0aW9uIChjaHVuaykge1xuICB2YXIgc3RhdGUgPSB0aGlzLl9yZWFkYWJsZVN0YXRlO1xuICByZXR1cm4gcmVhZGFibGVBZGRDaHVuayh0aGlzLCBzdGF0ZSwgY2h1bmssICcnLCB0cnVlKTtcbn07XG5cblJlYWRhYmxlLnByb3RvdHlwZS5pc1BhdXNlZCA9IGZ1bmN0aW9uICgpIHtcbiAgcmV0dXJuIHRoaXMuX3JlYWRhYmxlU3RhdGUuZmxvd2luZyA9PT0gZmFsc2U7XG59O1xuXG5mdW5jdGlvbiByZWFkYWJsZUFkZENodW5rKHN0cmVhbSwgc3RhdGUsIGNodW5rLCBlbmNvZGluZywgYWRkVG9Gcm9udCkge1xuICB2YXIgZXIgPSBjaHVua0ludmFsaWQoc3RhdGUsIGNodW5rKTtcbiAgaWYgKGVyKSB7XG4gICAgc3RyZWFtLmVtaXQoJ2Vycm9yJywgZXIpO1xuICB9IGVsc2UgaWYgKGNodW5rID09PSBudWxsKSB7XG4gICAgc3RhdGUucmVhZGluZyA9IGZhbHNlO1xuICAgIG9uRW9mQ2h1bmsoc3RyZWFtLCBzdGF0ZSk7XG4gIH0gZWxzZSBpZiAoc3RhdGUub2JqZWN0TW9kZSB8fCBjaHVuayAmJiBjaHVuay5sZW5ndGggPiAwKSB7XG4gICAgaWYgKHN0YXRlLmVuZGVkICYmICFhZGRUb0Zyb250KSB7XG4gICAgICB2YXIgZSA9IG5ldyBFcnJvcignc3RyZWFtLnB1c2goKSBhZnRlciBFT0YnKTtcbiAgICAgIHN0cmVhbS5lbWl0KCdlcnJvcicsIGUpO1xuICAgIH0gZWxzZSBpZiAoc3RhdGUuZW5kRW1pdHRlZCAmJiBhZGRUb0Zyb250KSB7XG4gICAgICB2YXIgZSA9IG5ldyBFcnJvcignc3RyZWFtLnVuc2hpZnQoKSBhZnRlciBlbmQgZXZlbnQnKTtcbiAgICAgIHN0cmVhbS5lbWl0KCdlcnJvcicsIGUpO1xuICAgIH0gZWxzZSB7XG4gICAgICB2YXIgc2tpcEFkZDtcbiAgICAgIGlmIChzdGF0ZS5kZWNvZGVyICYmICFhZGRUb0Zyb250ICYmICFlbmNvZGluZykge1xuICAgICAgICBjaHVuayA9IHN0YXRlLmRlY29kZXIud3JpdGUoY2h1bmspO1xuICAgICAgICBza2lwQWRkID0gIXN0YXRlLm9iamVjdE1vZGUgJiYgY2h1bmsubGVuZ3RoID09PSAwO1xuICAgICAgfVxuXG4gICAgICBpZiAoIWFkZFRvRnJvbnQpIHN0YXRlLnJlYWRpbmcgPSBmYWxzZTtcblxuICAgICAgLy8gRG9uJ3QgYWRkIHRvIHRoZSBidWZmZXIgaWYgd2UndmUgZGVjb2RlZCB0byBhbiBlbXB0eSBzdHJpbmcgY2h1bmsgYW5kXG4gICAgICAvLyB3ZSdyZSBub3QgaW4gb2JqZWN0IG1vZGVcbiAgICAgIGlmICghc2tpcEFkZCkge1xuICAgICAgICAvLyBpZiB3ZSB3YW50IHRoZSBkYXRhIG5vdywganVzdCBlbWl0IGl0LlxuICAgICAgICBpZiAoc3RhdGUuZmxvd2luZyAmJiBzdGF0ZS5sZW5ndGggPT09IDAgJiYgIXN0YXRlLnN5bmMpIHtcbiAgICAgICAgICBzdHJlYW0uZW1pdCgnZGF0YScsIGNodW5rKTtcbiAgICAgICAgICBzdHJlYW0ucmVhZCgwKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAvLyB1cGRhdGUgdGhlIGJ1ZmZlciBpbmZvLlxuICAgICAgICAgIHN0YXRlLmxlbmd0aCArPSBzdGF0ZS5vYmplY3RNb2RlID8gMSA6IGNodW5rLmxlbmd0aDtcbiAgICAgICAgICBpZiAoYWRkVG9Gcm9udCkgc3RhdGUuYnVmZmVyLnVuc2hpZnQoY2h1bmspO2Vsc2Ugc3RhdGUuYnVmZmVyLnB1c2goY2h1bmspO1xuXG4gICAgICAgICAgaWYgKHN0YXRlLm5lZWRSZWFkYWJsZSkgZW1pdFJlYWRhYmxlKHN0cmVhbSk7XG4gICAgICAgIH1cbiAgICAgIH1cblxuICAgICAgbWF5YmVSZWFkTW9yZShzdHJlYW0sIHN0YXRlKTtcbiAgICB9XG4gIH0gZWxzZSBpZiAoIWFkZFRvRnJvbnQpIHtcbiAgICBzdGF0ZS5yZWFkaW5nID0gZmFsc2U7XG4gIH1cblxuICByZXR1cm4gbmVlZE1vcmVEYXRhKHN0YXRlKTtcbn1cblxuLy8gaWYgaXQncyBwYXN0IHRoZSBoaWdoIHdhdGVyIG1hcmssIHdlIGNhbiBwdXNoIGluIHNvbWUgbW9yZS5cbi8vIEFsc28sIGlmIHdlIGhhdmUgbm8gZGF0YSB5ZXQsIHdlIGNhbiBzdGFuZCBzb21lXG4vLyBtb3JlIGJ5dGVzLiAgVGhpcyBpcyB0byB3b3JrIGFyb3VuZCBjYXNlcyB3aGVyZSBod209MCxcbi8vIHN1Y2ggYXMgdGhlIHJlcGwuICBBbHNvLCBpZiB0aGUgcHVzaCgpIHRyaWdnZXJlZCBhXG4vLyByZWFkYWJsZSBldmVudCwgYW5kIHRoZSB1c2VyIGNhbGxlZCByZWFkKGxhcmdlTnVtYmVyKSBzdWNoIHRoYXRcbi8vIG5lZWRSZWFkYWJsZSB3YXMgc2V0LCB0aGVuIHdlIG91Z2h0IHRvIHB1c2ggbW9yZSwgc28gdGhhdCBhbm90aGVyXG4vLyAncmVhZGFibGUnIGV2ZW50IHdpbGwgYmUgdHJpZ2dlcmVkLlxuZnVuY3Rpb24gbmVlZE1vcmVEYXRhKHN0YXRlKSB7XG4gIHJldHVybiAhc3RhdGUuZW5kZWQgJiYgKHN0YXRlLm5lZWRSZWFkYWJsZSB8fCBzdGF0ZS5sZW5ndGggPCBzdGF0ZS5oaWdoV2F0ZXJNYXJrIHx8IHN0YXRlLmxlbmd0aCA9PT0gMCk7XG59XG5cbi8vIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LlxuUmVhZGFibGUucHJvdG90eXBlLnNldEVuY29kaW5nID0gZnVuY3Rpb24gKGVuYykge1xuICBpZiAoIVN0cmluZ0RlY29kZXIpIFN0cmluZ0RlY29kZXIgPSByZXF1aXJlKCdzdHJpbmdfZGVjb2Rlci8nKS5TdHJpbmdEZWNvZGVyO1xuICB0aGlzLl9yZWFkYWJsZVN0YXRlLmRlY29kZXIgPSBuZXcgU3RyaW5nRGVjb2RlcihlbmMpO1xuICB0aGlzLl9yZWFkYWJsZVN0YXRlLmVuY29kaW5nID0gZW5jO1xuICByZXR1cm4gdGhpcztcbn07XG5cbi8vIERvbid0IHJhaXNlIHRoZSBod20gPiA4TUJcbnZhciBNQVhfSFdNID0gMHg4MDAwMDA7XG5mdW5jdGlvbiBjb21wdXRlTmV3SGlnaFdhdGVyTWFyayhuKSB7XG4gIGlmIChuID49IE1BWF9IV00pIHtcbiAgICBuID0gTUFYX0hXTTtcbiAgfSBlbHNlIHtcbiAgICAvLyBHZXQgdGhlIG5leHQgaGlnaGVzdCBwb3dlciBvZiAyXG4gICAgbi0tO1xuICAgIG4gfD0gbiA+Pj4gMTtcbiAgICBuIHw9IG4gPj4+IDI7XG4gICAgbiB8PSBuID4+PiA0O1xuICAgIG4gfD0gbiA+Pj4gODtcbiAgICBuIHw9IG4gPj4+IDE2O1xuICAgIG4rKztcbiAgfVxuICByZXR1cm4gbjtcbn1cblxuZnVuY3Rpb24gaG93TXVjaFRvUmVhZChuLCBzdGF0ZSkge1xuICBpZiAoc3RhdGUubGVuZ3RoID09PSAwICYmIHN0YXRlLmVuZGVkKSByZXR1cm4gMDtcblxuICBpZiAoc3RhdGUub2JqZWN0TW9kZSkgcmV0dXJuIG4gPT09IDAgPyAwIDogMTtcblxuICBpZiAobiA9PT0gbnVsbCB8fCBpc05hTihuKSkge1xuICAgIC8vIG9ubHkgZmxvdyBvbmUgYnVmZmVyIGF0IGEgdGltZVxuICAgIGlmIChzdGF0ZS5mbG93aW5nICYmIHN0YXRlLmJ1ZmZlci5sZW5ndGgpIHJldHVybiBzdGF0ZS5idWZmZXJbMF0ubGVuZ3RoO2Vsc2UgcmV0dXJuIHN0YXRlLmxlbmd0aDtcbiAgfVxuXG4gIGlmIChuIDw9IDApIHJldHVybiAwO1xuXG4gIC8vIElmIHdlJ3JlIGFza2luZyBmb3IgbW9yZSB0aGFuIHRoZSB0YXJnZXQgYnVmZmVyIGxldmVsLFxuICAvLyB0aGVuIHJhaXNlIHRoZSB3YXRlciBtYXJrLiAgQnVtcCB1cCB0byB0aGUgbmV4dCBoaWdoZXN0XG4gIC8vIHBvd2VyIG9mIDIsIHRvIHByZXZlbnQgaW5jcmVhc2luZyBpdCBleGNlc3NpdmVseSBpbiB0aW55XG4gIC8vIGFtb3VudHMuXG4gIGlmIChuID4gc3RhdGUuaGlnaFdhdGVyTWFyaykgc3RhdGUuaGlnaFdhdGVyTWFyayA9IGNvbXB1dGVOZXdIaWdoV2F0ZXJNYXJrKG4pO1xuXG4gIC8vIGRvbid0IGhhdmUgdGhhdCBtdWNoLiAgcmV0dXJuIG51bGwsIHVubGVzcyB3ZSd2ZSBlbmRlZC5cbiAgaWYgKG4gPiBzdGF0ZS5sZW5ndGgpIHtcbiAgICBpZiAoIXN0YXRlLmVuZGVkKSB7XG4gICAgICBzdGF0ZS5uZWVkUmVhZGFibGUgPSB0cnVlO1xuICAgICAgcmV0dXJuIDA7XG4gICAgfSBlbHNlIHtcbiAgICAgIHJldHVybiBzdGF0ZS5sZW5ndGg7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG47XG59XG5cbi8vIHlvdSBjYW4gb3ZlcnJpZGUgZWl0aGVyIHRoaXMgbWV0aG9kLCBvciB0aGUgYXN5bmMgX3JlYWQobikgYmVsb3cuXG5SZWFkYWJsZS5wcm90b3R5cGUucmVhZCA9IGZ1bmN0aW9uIChuKSB7XG4gIGRlYnVnKCdyZWFkJywgbik7XG4gIHZhciBzdGF0ZSA9IHRoaXMuX3JlYWRhYmxlU3RhdGU7XG4gIHZhciBuT3JpZyA9IG47XG5cbiAgaWYgKHR5cGVvZiBuICE9PSAnbnVtYmVyJyB8fCBuID4gMCkgc3RhdGUuZW1pdHRlZFJlYWRhYmxlID0gZmFsc2U7XG5cbiAgLy8gaWYgd2UncmUgZG9pbmcgcmVhZCgwKSB0byB0cmlnZ2VyIGEgcmVhZGFibGUgZXZlbnQsIGJ1dCB3ZVxuICAvLyBhbHJlYWR5IGhhdmUgYSBidW5jaCBvZiBkYXRhIGluIHRoZSBidWZmZXIsIHRoZW4ganVzdCB0cmlnZ2VyXG4gIC8vIHRoZSAncmVhZGFibGUnIGV2ZW50IGFuZCBtb3ZlIG9uLlxuICBpZiAobiA9PT0gMCAmJiBzdGF0ZS5uZWVkUmVhZGFibGUgJiYgKHN0YXRlLmxlbmd0aCA+PSBzdGF0ZS5oaWdoV2F0ZXJNYXJrIHx8IHN0YXRlLmVuZGVkKSkge1xuICAgIGRlYnVnKCdyZWFkOiBlbWl0UmVhZGFibGUnLCBzdGF0ZS5sZW5ndGgsIHN0YXRlLmVuZGVkKTtcbiAgICBpZiAoc3RhdGUubGVuZ3RoID09PSAwICYmIHN0YXRlLmVuZGVkKSBlbmRSZWFkYWJsZSh0aGlzKTtlbHNlIGVtaXRSZWFkYWJsZSh0aGlzKTtcbiAgICByZXR1cm4gbnVsbDtcbiAgfVxuXG4gIG4gPSBob3dNdWNoVG9SZWFkKG4sIHN0YXRlKTtcblxuICAvLyBpZiB3ZSd2ZSBlbmRlZCwgYW5kIHdlJ3JlIG5vdyBjbGVhciwgdGhlbiBmaW5pc2ggaXQgdXAuXG4gIGlmIChuID09PSAwICYmIHN0YXRlLmVuZGVkKSB7XG4gICAgaWYgKHN0YXRlLmxlbmd0aCA9PT0gMCkgZW5kUmVhZGFibGUodGhpcyk7XG4gICAgcmV0dXJuIG51bGw7XG4gIH1cblxuICAvLyBBbGwgdGhlIGFjdHVhbCBjaHVuayBnZW5lcmF0aW9uIGxvZ2ljIG5lZWRzIHRvIGJlXG4gIC8vICpiZWxvdyogdGhlIGNhbGwgdG8gX3JlYWQuICBUaGUgcmVhc29uIGlzIHRoYXQgaW4gY2VydGFpblxuICAvLyBzeW50aGV0aWMgc3RyZWFtIGNhc2VzLCBzdWNoIGFzIHBhc3N0aHJvdWdoIHN0cmVhbXMsIF9yZWFkXG4gIC8vIG1heSBiZSBhIGNvbXBsZXRlbHkgc3luY2hyb25vdXMgb3BlcmF0aW9uIHdoaWNoIG1heSBjaGFuZ2VcbiAgLy8gdGhlIHN0YXRlIG9mIHRoZSByZWFkIGJ1ZmZlciwgcHJvdmlkaW5nIGVub3VnaCBkYXRhIHdoZW5cbiAgLy8gYmVmb3JlIHRoZXJlIHdhcyAqbm90KiBlbm91Z2guXG4gIC8vXG4gIC8vIFNvLCB0aGUgc3RlcHMgYXJlOlxuICAvLyAxLiBGaWd1cmUgb3V0IHdoYXQgdGhlIHN0YXRlIG9mIHRoaW5ncyB3aWxsIGJlIGFmdGVyIHdlIGRvXG4gIC8vIGEgcmVhZCBmcm9tIHRoZSBidWZmZXIuXG4gIC8vXG4gIC8vIDIuIElmIHRoYXQgcmVzdWx0aW5nIHN0YXRlIHdpbGwgdHJpZ2dlciBhIF9yZWFkLCB0aGVuIGNhbGwgX3JlYWQuXG4gIC8vIE5vdGUgdGhhdCB0aGlzIG1heSBiZSBhc3luY2hyb25vdXMsIG9yIHN5bmNocm9ub3VzLiAgWWVzLCBpdCBpc1xuICAvLyBkZWVwbHkgdWdseSB0byB3cml0ZSBBUElzIHRoaXMgd2F5LCBidXQgdGhhdCBzdGlsbCBkb2Vzbid0IG1lYW5cbiAgLy8gdGhhdCB0aGUgUmVhZGFibGUgY2xhc3Mgc2hvdWxkIGJlaGF2ZSBpbXByb3Blcmx5LCBhcyBzdHJlYW1zIGFyZVxuICAvLyBkZXNpZ25lZCB0byBiZSBzeW5jL2FzeW5jIGFnbm9zdGljLlxuICAvLyBUYWtlIG5vdGUgaWYgdGhlIF9yZWFkIGNhbGwgaXMgc3luYyBvciBhc3luYyAoaWUsIGlmIHRoZSByZWFkIGNhbGxcbiAgLy8gaGFzIHJldHVybmVkIHlldCksIHNvIHRoYXQgd2Uga25vdyB3aGV0aGVyIG9yIG5vdCBpdCdzIHNhZmUgdG8gZW1pdFxuICAvLyAncmVhZGFibGUnIGV0Yy5cbiAgLy9cbiAgLy8gMy4gQWN0dWFsbHkgcHVsbCB0aGUgcmVxdWVzdGVkIGNodW5rcyBvdXQgb2YgdGhlIGJ1ZmZlciBhbmQgcmV0dXJuLlxuXG4gIC8vIGlmIHdlIG5lZWQgYSByZWFkYWJsZSBldmVudCwgdGhlbiB3ZSBuZWVkIHRvIGRvIHNvbWUgcmVhZGluZy5cbiAgdmFyIGRvUmVhZCA9IHN0YXRlLm5lZWRSZWFkYWJsZTtcbiAgZGVidWcoJ25lZWQgcmVhZGFibGUnLCBkb1JlYWQpO1xuXG4gIC8vIGlmIHdlIGN1cnJlbnRseSBoYXZlIGxlc3MgdGhhbiB0aGUgaGlnaFdhdGVyTWFyaywgdGhlbiBhbHNvIHJlYWQgc29tZVxuICBpZiAoc3RhdGUubGVuZ3RoID09PSAwIHx8IHN0YXRlLmxlbmd0aCAtIG4gPCBzdGF0ZS5oaWdoV2F0ZXJNYXJrKSB7XG4gICAgZG9SZWFkID0gdHJ1ZTtcbiAgICBkZWJ1ZygnbGVuZ3RoIGxlc3MgdGhhbiB3YXRlcm1hcmsnLCBkb1JlYWQpO1xuICB9XG5cbiAgLy8gaG93ZXZlciwgaWYgd2UndmUgZW5kZWQsIHRoZW4gdGhlcmUncyBubyBwb2ludCwgYW5kIGlmIHdlJ3JlIGFscmVhZHlcbiAgLy8gcmVhZGluZywgdGhlbiBpdCdzIHVubmVjZXNzYXJ5LlxuICBpZiAoc3RhdGUuZW5kZWQgfHwgc3RhdGUucmVhZGluZykge1xuICAgIGRvUmVhZCA9IGZhbHNlO1xuICAgIGRlYnVnKCdyZWFkaW5nIG9yIGVuZGVkJywgZG9SZWFkKTtcbiAgfVxuXG4gIGlmIChkb1JlYWQpIHtcbiAgICBkZWJ1ZygnZG8gcmVhZCcpO1xuICAgIHN0YXRlLnJlYWRpbmcgPSB0cnVlO1xuICAgIHN0YXRlLnN5bmMgPSB0cnVlO1xuICAgIC8vIGlmIHRoZSBsZW5ndGggaXMgY3VycmVudGx5IHplcm8sIHRoZW4gd2UgKm5lZWQqIGEgcmVhZGFibGUgZXZlbnQuXG4gICAgaWYgKHN0YXRlLmxlbmd0aCA9PT0gMCkgc3RhdGUubmVlZFJlYWRhYmxlID0gdHJ1ZTtcbiAgICAvLyBjYWxsIGludGVybmFsIHJlYWQgbWV0aG9kXG4gICAgdGhpcy5fcmVhZChzdGF0ZS5oaWdoV2F0ZXJNYXJrKTtcbiAgICBzdGF0ZS5zeW5jID0gZmFsc2U7XG4gIH1cblxuICAvLyBJZiBfcmVhZCBwdXNoZWQgZGF0YSBzeW5jaHJvbm91c2x5LCB0aGVuIGByZWFkaW5nYCB3aWxsIGJlIGZhbHNlLFxuICAvLyBhbmQgd2UgbmVlZCB0byByZS1ldmFsdWF0ZSBob3cgbXVjaCBkYXRhIHdlIGNhbiByZXR1cm4gdG8gdGhlIHVzZXIuXG4gIGlmIChkb1JlYWQgJiYgIXN0YXRlLnJlYWRpbmcpIG4gPSBob3dNdWNoVG9SZWFkKG5PcmlnLCBzdGF0ZSk7XG5cbiAgdmFyIHJldDtcbiAgaWYgKG4gPiAwKSByZXQgPSBmcm9tTGlzdChuLCBzdGF0ZSk7ZWxzZSByZXQgPSBudWxsO1xuXG4gIGlmIChyZXQgPT09IG51bGwpIHtcbiAgICBzdGF0ZS5uZWVkUmVhZGFibGUgPSB0cnVlO1xuICAgIG4gPSAwO1xuICB9XG5cbiAgc3RhdGUubGVuZ3RoIC09IG47XG5cbiAgLy8gSWYgd2UgaGF2ZSBub3RoaW5nIGluIHRoZSBidWZmZXIsIHRoZW4gd2Ugd2FudCB0byBrbm93XG4gIC8vIGFzIHNvb24gYXMgd2UgKmRvKiBnZXQgc29tZXRoaW5nIGludG8gdGhlIGJ1ZmZlci5cbiAgaWYgKHN0YXRlLmxlbmd0aCA9PT0gMCAmJiAhc3RhdGUuZW5kZWQpIHN0YXRlLm5lZWRSZWFkYWJsZSA9IHRydWU7XG5cbiAgLy8gSWYgd2UgdHJpZWQgdG8gcmVhZCgpIHBhc3QgdGhlIEVPRiwgdGhlbiBlbWl0IGVuZCBvbiB0aGUgbmV4dCB0aWNrLlxuICBpZiAobk9yaWcgIT09IG4gJiYgc3RhdGUuZW5kZWQgJiYgc3RhdGUubGVuZ3RoID09PSAwKSBlbmRSZWFkYWJsZSh0aGlzKTtcblxuICBpZiAocmV0ICE9PSBudWxsKSB0aGlzLmVtaXQoJ2RhdGEnLCByZXQpO1xuXG4gIHJldHVybiByZXQ7XG59O1xuXG5mdW5jdGlvbiBjaHVua0ludmFsaWQoc3RhdGUsIGNodW5rKSB7XG4gIHZhciBlciA9IG51bGw7XG4gIGlmICghQnVmZmVyLmlzQnVmZmVyKGNodW5rKSAmJiB0eXBlb2YgY2h1bmsgIT09ICdzdHJpbmcnICYmIGNodW5rICE9PSBudWxsICYmIGNodW5rICE9PSB1bmRlZmluZWQgJiYgIXN0YXRlLm9iamVjdE1vZGUpIHtcbiAgICBlciA9IG5ldyBUeXBlRXJyb3IoJ0ludmFsaWQgbm9uLXN0cmluZy9idWZmZXIgY2h1bmsnKTtcbiAgfVxuICByZXR1cm4gZXI7XG59XG5cbmZ1bmN0aW9uIG9uRW9mQ2h1bmsoc3RyZWFtLCBzdGF0ZSkge1xuICBpZiAoc3RhdGUuZW5kZWQpIHJldHVybjtcbiAgaWYgKHN0YXRlLmRlY29kZXIpIHtcbiAgICB2YXIgY2h1bmsgPSBzdGF0ZS5kZWNvZGVyLmVuZCgpO1xuICAgIGlmIChjaHVuayAmJiBjaHVuay5sZW5ndGgpIHtcbiAgICAgIHN0YXRlLmJ1ZmZlci5wdXNoKGNodW5rKTtcbiAgICAgIHN0YXRlLmxlbmd0aCArPSBzdGF0ZS5vYmplY3RNb2RlID8gMSA6IGNodW5rLmxlbmd0aDtcbiAgICB9XG4gIH1cbiAgc3RhdGUuZW5kZWQgPSB0cnVlO1xuXG4gIC8vIGVtaXQgJ3JlYWRhYmxlJyBub3cgdG8gbWFrZSBzdXJlIGl0IGdldHMgcGlja2VkIHVwLlxuICBlbWl0UmVhZGFibGUoc3RyZWFtKTtcbn1cblxuLy8gRG9uJ3QgZW1pdCByZWFkYWJsZSByaWdodCBhd2F5IGluIHN5bmMgbW9kZSwgYmVjYXVzZSB0aGlzIGNhbiB0cmlnZ2VyXG4vLyBhbm90aGVyIHJlYWQoKSBjYWxsID0+IHN0YWNrIG92ZXJmbG93LiAgVGhpcyB3YXksIGl0IG1pZ2h0IHRyaWdnZXJcbi8vIGEgbmV4dFRpY2sgcmVjdXJzaW9uIHdhcm5pbmcsIGJ1dCB0aGF0J3Mgbm90IHNvIGJhZC5cbmZ1bmN0aW9uIGVtaXRSZWFkYWJsZShzdHJlYW0pIHtcbiAgdmFyIHN0YXRlID0gc3RyZWFtLl9yZWFkYWJsZVN0YXRlO1xuICBzdGF0ZS5uZWVkUmVhZGFibGUgPSBmYWxzZTtcbiAgaWYgKCFzdGF0ZS5lbWl0dGVkUmVhZGFibGUpIHtcbiAgICBkZWJ1ZygnZW1pdFJlYWRhYmxlJywgc3RhdGUuZmxvd2luZyk7XG4gICAgc3RhdGUuZW1pdHRlZFJlYWRhYmxlID0gdHJ1ZTtcbiAgICBpZiAoc3RhdGUuc3luYykgcHJvY2Vzc05leHRUaWNrKGVtaXRSZWFkYWJsZV8sIHN0cmVhbSk7ZWxzZSBlbWl0UmVhZGFibGVfKHN0cmVhbSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gZW1pdFJlYWRhYmxlXyhzdHJlYW0pIHtcbiAgZGVidWcoJ2VtaXQgcmVhZGFibGUnKTtcbiAgc3RyZWFtLmVtaXQoJ3JlYWRhYmxlJyk7XG4gIGZsb3coc3RyZWFtKTtcbn1cblxuLy8gYXQgdGhpcyBwb2ludCwgdGhlIHVzZXIgaGFzIHByZXN1bWFibHkgc2VlbiB0aGUgJ3JlYWRhYmxlJyBldmVudCxcbi8vIGFuZCBjYWxsZWQgcmVhZCgpIHRvIGNvbnN1bWUgc29tZSBkYXRhLiAgdGhhdCBtYXkgaGF2ZSB0cmlnZ2VyZWRcbi8vIGluIHR1cm4gYW5vdGhlciBfcmVhZChuKSBjYWxsLCBpbiB3aGljaCBjYXNlIHJlYWRpbmcgPSB0cnVlIGlmXG4vLyBpdCdzIGluIHByb2dyZXNzLlxuLy8gSG93ZXZlciwgaWYgd2UncmUgbm90IGVuZGVkLCBvciByZWFkaW5nLCBhbmQgdGhlIGxlbmd0aCA8IGh3bSxcbi8vIHRoZW4gZ28gYWhlYWQgYW5kIHRyeSB0byByZWFkIHNvbWUgbW9yZSBwcmVlbXB0aXZlbHkuXG5mdW5jdGlvbiBtYXliZVJlYWRNb3JlKHN0cmVhbSwgc3RhdGUpIHtcbiAgaWYgKCFzdGF0ZS5yZWFkaW5nTW9yZSkge1xuICAgIHN0YXRlLnJlYWRpbmdNb3JlID0gdHJ1ZTtcbiAgICBwcm9jZXNzTmV4dFRpY2sobWF5YmVSZWFkTW9yZV8sIHN0cmVhbSwgc3RhdGUpO1xuICB9XG59XG5cbmZ1bmN0aW9uIG1heWJlUmVhZE1vcmVfKHN0cmVhbSwgc3RhdGUpIHtcbiAgdmFyIGxlbiA9IHN0YXRlLmxlbmd0aDtcbiAgd2hpbGUgKCFzdGF0ZS5yZWFkaW5nICYmICFzdGF0ZS5mbG93aW5nICYmICFzdGF0ZS5lbmRlZCAmJiBzdGF0ZS5sZW5ndGggPCBzdGF0ZS5oaWdoV2F0ZXJNYXJrKSB7XG4gICAgZGVidWcoJ21heWJlUmVhZE1vcmUgcmVhZCAwJyk7XG4gICAgc3RyZWFtLnJlYWQoMCk7XG4gICAgaWYgKGxlbiA9PT0gc3RhdGUubGVuZ3RoKVxuICAgICAgLy8gZGlkbid0IGdldCBhbnkgZGF0YSwgc3RvcCBzcGlubmluZy5cbiAgICAgIGJyZWFrO2Vsc2UgbGVuID0gc3RhdGUubGVuZ3RoO1xuICB9XG4gIHN0YXRlLnJlYWRpbmdNb3JlID0gZmFsc2U7XG59XG5cbi8vIGFic3RyYWN0IG1ldGhvZC4gIHRvIGJlIG92ZXJyaWRkZW4gaW4gc3BlY2lmaWMgaW1wbGVtZW50YXRpb24gY2xhc3Nlcy5cbi8vIGNhbGwgY2IoZXIsIGRhdGEpIHdoZXJlIGRhdGEgaXMgPD0gbiBpbiBsZW5ndGguXG4vLyBmb3IgdmlydHVhbCAobm9uLXN0cmluZywgbm9uLWJ1ZmZlcikgc3RyZWFtcywgXCJsZW5ndGhcIiBpcyBzb21ld2hhdFxuLy8gYXJiaXRyYXJ5LCBhbmQgcGVyaGFwcyBub3QgdmVyeSBtZWFuaW5nZnVsLlxuUmVhZGFibGUucHJvdG90eXBlLl9yZWFkID0gZnVuY3Rpb24gKG4pIHtcbiAgdGhpcy5lbWl0KCdlcnJvcicsIG5ldyBFcnJvcignbm90IGltcGxlbWVudGVkJykpO1xufTtcblxuUmVhZGFibGUucHJvdG90eXBlLnBpcGUgPSBmdW5jdGlvbiAoZGVzdCwgcGlwZU9wdHMpIHtcbiAgdmFyIHNyYyA9IHRoaXM7XG4gIHZhciBzdGF0ZSA9IHRoaXMuX3JlYWRhYmxlU3RhdGU7XG5cbiAgc3dpdGNoIChzdGF0ZS5waXBlc0NvdW50KSB7XG4gICAgY2FzZSAwOlxuICAgICAgc3RhdGUucGlwZXMgPSBkZXN0O1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAxOlxuICAgICAgc3RhdGUucGlwZXMgPSBbc3RhdGUucGlwZXMsIGRlc3RdO1xuICAgICAgYnJlYWs7XG4gICAgZGVmYXVsdDpcbiAgICAgIHN0YXRlLnBpcGVzLnB1c2goZGVzdCk7XG4gICAgICBicmVhaztcbiAgfVxuICBzdGF0ZS5waXBlc0NvdW50ICs9IDE7XG4gIGRlYnVnKCdwaXBlIGNvdW50PSVkIG9wdHM9JWonLCBzdGF0ZS5waXBlc0NvdW50LCBwaXBlT3B0cyk7XG5cbiAgdmFyIGRvRW5kID0gKCFwaXBlT3B0cyB8fCBwaXBlT3B0cy5lbmQgIT09IGZhbHNlKSAmJiBkZXN0ICE9PSBwcm9jZXNzLnN0ZG91dCAmJiBkZXN0ICE9PSBwcm9jZXNzLnN0ZGVycjtcblxuICB2YXIgZW5kRm4gPSBkb0VuZCA/IG9uZW5kIDogY2xlYW51cDtcbiAgaWYgKHN0YXRlLmVuZEVtaXR0ZWQpIHByb2Nlc3NOZXh0VGljayhlbmRGbik7ZWxzZSBzcmMub25jZSgnZW5kJywgZW5kRm4pO1xuXG4gIGRlc3Qub24oJ3VucGlwZScsIG9udW5waXBlKTtcbiAgZnVuY3Rpb24gb251bnBpcGUocmVhZGFibGUpIHtcbiAgICBkZWJ1Zygnb251bnBpcGUnKTtcbiAgICBpZiAocmVhZGFibGUgPT09IHNyYykge1xuICAgICAgY2xlYW51cCgpO1xuICAgIH1cbiAgfVxuXG4gIGZ1bmN0aW9uIG9uZW5kKCkge1xuICAgIGRlYnVnKCdvbmVuZCcpO1xuICAgIGRlc3QuZW5kKCk7XG4gIH1cblxuICAvLyB3aGVuIHRoZSBkZXN0IGRyYWlucywgaXQgcmVkdWNlcyB0aGUgYXdhaXREcmFpbiBjb3VudGVyXG4gIC8vIG9uIHRoZSBzb3VyY2UuICBUaGlzIHdvdWxkIGJlIG1vcmUgZWxlZ2FudCB3aXRoIGEgLm9uY2UoKVxuICAvLyBoYW5kbGVyIGluIGZsb3coKSwgYnV0IGFkZGluZyBhbmQgcmVtb3ZpbmcgcmVwZWF0ZWRseSBpc1xuICAvLyB0b28gc2xvdy5cbiAgdmFyIG9uZHJhaW4gPSBwaXBlT25EcmFpbihzcmMpO1xuICBkZXN0Lm9uKCdkcmFpbicsIG9uZHJhaW4pO1xuXG4gIHZhciBjbGVhbmVkVXAgPSBmYWxzZTtcbiAgZnVuY3Rpb24gY2xlYW51cCgpIHtcbiAgICBkZWJ1ZygnY2xlYW51cCcpO1xuICAgIC8vIGNsZWFudXAgZXZlbnQgaGFuZGxlcnMgb25jZSB0aGUgcGlwZSBpcyBicm9rZW5cbiAgICBkZXN0LnJlbW92ZUxpc3RlbmVyKCdjbG9zZScsIG9uY2xvc2UpO1xuICAgIGRlc3QucmVtb3ZlTGlzdGVuZXIoJ2ZpbmlzaCcsIG9uZmluaXNoKTtcbiAgICBkZXN0LnJlbW92ZUxpc3RlbmVyKCdkcmFpbicsIG9uZHJhaW4pO1xuICAgIGRlc3QucmVtb3ZlTGlzdGVuZXIoJ2Vycm9yJywgb25lcnJvcik7XG4gICAgZGVzdC5yZW1vdmVMaXN0ZW5lcigndW5waXBlJywgb251bnBpcGUpO1xuICAgIHNyYy5yZW1vdmVMaXN0ZW5lcignZW5kJywgb25lbmQpO1xuICAgIHNyYy5yZW1vdmVMaXN0ZW5lcignZW5kJywgY2xlYW51cCk7XG4gICAgc3JjLnJlbW92ZUxpc3RlbmVyKCdkYXRhJywgb25kYXRhKTtcblxuICAgIGNsZWFuZWRVcCA9IHRydWU7XG5cbiAgICAvLyBpZiB0aGUgcmVhZGVyIGlzIHdhaXRpbmcgZm9yIGEgZHJhaW4gZXZlbnQgZnJvbSB0aGlzXG4gICAgLy8gc3BlY2lmaWMgd3JpdGVyLCB0aGVuIGl0IHdvdWxkIGNhdXNlIGl0IHRvIG5ldmVyIHN0YXJ0XG4gICAgLy8gZmxvd2luZyBhZ2Fpbi5cbiAgICAvLyBTbywgaWYgdGhpcyBpcyBhd2FpdGluZyBhIGRyYWluLCB0aGVuIHdlIGp1c3QgY2FsbCBpdCBub3cuXG4gICAgLy8gSWYgd2UgZG9uJ3Qga25vdywgdGhlbiBhc3N1bWUgdGhhdCB3ZSBhcmUgd2FpdGluZyBmb3Igb25lLlxuICAgIGlmIChzdGF0ZS5hd2FpdERyYWluICYmICghZGVzdC5fd3JpdGFibGVTdGF0ZSB8fCBkZXN0Ll93cml0YWJsZVN0YXRlLm5lZWREcmFpbikpIG9uZHJhaW4oKTtcbiAgfVxuXG4gIHNyYy5vbignZGF0YScsIG9uZGF0YSk7XG4gIGZ1bmN0aW9uIG9uZGF0YShjaHVuaykge1xuICAgIGRlYnVnKCdvbmRhdGEnKTtcbiAgICB2YXIgcmV0ID0gZGVzdC53cml0ZShjaHVuayk7XG4gICAgaWYgKGZhbHNlID09PSByZXQpIHtcbiAgICAgIC8vIElmIHRoZSB1c2VyIHVucGlwZWQgZHVyaW5nIGBkZXN0LndyaXRlKClgLCBpdCBpcyBwb3NzaWJsZVxuICAgICAgLy8gdG8gZ2V0IHN0dWNrIGluIGEgcGVybWFuZW50bHkgcGF1c2VkIHN0YXRlIGlmIHRoYXQgd3JpdGVcbiAgICAgIC8vIGFsc28gcmV0dXJuZWQgZmFsc2UuXG4gICAgICBpZiAoc3RhdGUucGlwZXNDb3VudCA9PT0gMSAmJiBzdGF0ZS5waXBlc1swXSA9PT0gZGVzdCAmJiBzcmMubGlzdGVuZXJDb3VudCgnZGF0YScpID09PSAxICYmICFjbGVhbmVkVXApIHtcbiAgICAgICAgZGVidWcoJ2ZhbHNlIHdyaXRlIHJlc3BvbnNlLCBwYXVzZScsIHNyYy5fcmVhZGFibGVTdGF0ZS5hd2FpdERyYWluKTtcbiAgICAgICAgc3JjLl9yZWFkYWJsZVN0YXRlLmF3YWl0RHJhaW4rKztcbiAgICAgIH1cbiAgICAgIHNyYy5wYXVzZSgpO1xuICAgIH1cbiAgfVxuXG4gIC8vIGlmIHRoZSBkZXN0IGhhcyBhbiBlcnJvciwgdGhlbiBzdG9wIHBpcGluZyBpbnRvIGl0LlxuICAvLyBob3dldmVyLCBkb24ndCBzdXBwcmVzcyB0aGUgdGhyb3dpbmcgYmVoYXZpb3IgZm9yIHRoaXMuXG4gIGZ1bmN0aW9uIG9uZXJyb3IoZXIpIHtcbiAgICBkZWJ1Zygnb25lcnJvcicsIGVyKTtcbiAgICB1bnBpcGUoKTtcbiAgICBkZXN0LnJlbW92ZUxpc3RlbmVyKCdlcnJvcicsIG9uZXJyb3IpO1xuICAgIGlmIChFRWxpc3RlbmVyQ291bnQoZGVzdCwgJ2Vycm9yJykgPT09IDApIGRlc3QuZW1pdCgnZXJyb3InLCBlcik7XG4gIH1cbiAgLy8gVGhpcyBpcyBhIGJydXRhbGx5IHVnbHkgaGFjayB0byBtYWtlIHN1cmUgdGhhdCBvdXIgZXJyb3IgaGFuZGxlclxuICAvLyBpcyBhdHRhY2hlZCBiZWZvcmUgYW55IHVzZXJsYW5kIG9uZXMuICBORVZFUiBETyBUSElTLlxuICBpZiAoIWRlc3QuX2V2ZW50cyB8fCAhZGVzdC5fZXZlbnRzLmVycm9yKSBkZXN0Lm9uKCdlcnJvcicsIG9uZXJyb3IpO2Vsc2UgaWYgKGlzQXJyYXkoZGVzdC5fZXZlbnRzLmVycm9yKSkgZGVzdC5fZXZlbnRzLmVycm9yLnVuc2hpZnQob25lcnJvcik7ZWxzZSBkZXN0Ll9ldmVudHMuZXJyb3IgPSBbb25lcnJvciwgZGVzdC5fZXZlbnRzLmVycm9yXTtcblxuICAvLyBCb3RoIGNsb3NlIGFuZCBmaW5pc2ggc2hvdWxkIHRyaWdnZXIgdW5waXBlLCBidXQgb25seSBvbmNlLlxuICBmdW5jdGlvbiBvbmNsb3NlKCkge1xuICAgIGRlc3QucmVtb3ZlTGlzdGVuZXIoJ2ZpbmlzaCcsIG9uZmluaXNoKTtcbiAgICB1bnBpcGUoKTtcbiAgfVxuICBkZXN0Lm9uY2UoJ2Nsb3NlJywgb25jbG9zZSk7XG4gIGZ1bmN0aW9uIG9uZmluaXNoKCkge1xuICAgIGRlYnVnKCdvbmZpbmlzaCcpO1xuICAgIGRlc3QucmVtb3ZlTGlzdGVuZXIoJ2Nsb3NlJywgb25jbG9zZSk7XG4gICAgdW5waXBlKCk7XG4gIH1cbiAgZGVzdC5vbmNlKCdmaW5pc2gnLCBvbmZpbmlzaCk7XG5cbiAgZnVuY3Rpb24gdW5waXBlKCkge1xuICAgIGRlYnVnKCd1bnBpcGUnKTtcbiAgICBzcmMudW5waXBlKGRlc3QpO1xuICB9XG5cbiAgLy8gdGVsbCB0aGUgZGVzdCB0aGF0IGl0J3MgYmVpbmcgcGlwZWQgdG9cbiAgZGVzdC5lbWl0KCdwaXBlJywgc3JjKTtcblxuICAvLyBzdGFydCB0aGUgZmxvdyBpZiBpdCBoYXNuJ3QgYmVlbiBzdGFydGVkIGFscmVhZHkuXG4gIGlmICghc3RhdGUuZmxvd2luZykge1xuICAgIGRlYnVnKCdwaXBlIHJlc3VtZScpO1xuICAgIHNyYy5yZXN1bWUoKTtcbiAgfVxuXG4gIHJldHVybiBkZXN0O1xufTtcblxuZnVuY3Rpb24gcGlwZU9uRHJhaW4oc3JjKSB7XG4gIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgdmFyIHN0YXRlID0gc3JjLl9yZWFkYWJsZVN0YXRlO1xuICAgIGRlYnVnKCdwaXBlT25EcmFpbicsIHN0YXRlLmF3YWl0RHJhaW4pO1xuICAgIGlmIChzdGF0ZS5hd2FpdERyYWluKSBzdGF0ZS5hd2FpdERyYWluLS07XG4gICAgaWYgKHN0YXRlLmF3YWl0RHJhaW4gPT09IDAgJiYgRUVsaXN0ZW5lckNvdW50KHNyYywgJ2RhdGEnKSkge1xuICAgICAgc3RhdGUuZmxvd2luZyA9IHRydWU7XG4gICAgICBmbG93KHNyYyk7XG4gICAgfVxuICB9O1xufVxuXG5SZWFkYWJsZS5wcm90b3R5cGUudW5waXBlID0gZnVuY3Rpb24gKGRlc3QpIHtcbiAgdmFyIHN0YXRlID0gdGhpcy5fcmVhZGFibGVTdGF0ZTtcblxuICAvLyBpZiB3ZSdyZSBub3QgcGlwaW5nIGFueXdoZXJlLCB0aGVuIGRvIG5vdGhpbmcuXG4gIGlmIChzdGF0ZS5waXBlc0NvdW50ID09PSAwKSByZXR1cm4gdGhpcztcblxuICAvLyBqdXN0IG9uZSBkZXN0aW5hdGlvbi4gIG1vc3QgY29tbW9uIGNhc2UuXG4gIGlmIChzdGF0ZS5waXBlc0NvdW50ID09PSAxKSB7XG4gICAgLy8gcGFzc2VkIGluIG9uZSwgYnV0IGl0J3Mgbm90IHRoZSByaWdodCBvbmUuXG4gICAgaWYgKGRlc3QgJiYgZGVzdCAhPT0gc3RhdGUucGlwZXMpIHJldHVybiB0aGlzO1xuXG4gICAgaWYgKCFkZXN0KSBkZXN0ID0gc3RhdGUucGlwZXM7XG5cbiAgICAvLyBnb3QgYSBtYXRjaC5cbiAgICBzdGF0ZS5waXBlcyA9IG51bGw7XG4gICAgc3RhdGUucGlwZXNDb3VudCA9IDA7XG4gICAgc3RhdGUuZmxvd2luZyA9IGZhbHNlO1xuICAgIGlmIChkZXN0KSBkZXN0LmVtaXQoJ3VucGlwZScsIHRoaXMpO1xuICAgIHJldHVybiB0aGlzO1xuICB9XG5cbiAgLy8gc2xvdyBjYXNlLiBtdWx0aXBsZSBwaXBlIGRlc3RpbmF0aW9ucy5cblxuICBpZiAoIWRlc3QpIHtcbiAgICAvLyByZW1vdmUgYWxsLlxuICAgIHZhciBkZXN0cyA9IHN0YXRlLnBpcGVzO1xuICAgIHZhciBsZW4gPSBzdGF0ZS5waXBlc0NvdW50O1xuICAgIHN0YXRlLnBpcGVzID0gbnVsbDtcbiAgICBzdGF0ZS5waXBlc0NvdW50ID0gMDtcbiAgICBzdGF0ZS5mbG93aW5nID0gZmFsc2U7XG5cbiAgICBmb3IgKHZhciBfaSA9IDA7IF9pIDwgbGVuOyBfaSsrKSB7XG4gICAgICBkZXN0c1tfaV0uZW1pdCgndW5waXBlJywgdGhpcyk7XG4gICAgfXJldHVybiB0aGlzO1xuICB9XG5cbiAgLy8gdHJ5IHRvIGZpbmQgdGhlIHJpZ2h0IG9uZS5cbiAgdmFyIGkgPSBpbmRleE9mKHN0YXRlLnBpcGVzLCBkZXN0KTtcbiAgaWYgKGkgPT09IC0xKSByZXR1cm4gdGhpcztcblxuICBzdGF0ZS5waXBlcy5zcGxpY2UoaSwgMSk7XG4gIHN0YXRlLnBpcGVzQ291bnQgLT0gMTtcbiAgaWYgKHN0YXRlLnBpcGVzQ291bnQgPT09IDEpIHN0YXRlLnBpcGVzID0gc3RhdGUucGlwZXNbMF07XG5cbiAgZGVzdC5lbWl0KCd1bnBpcGUnLCB0aGlzKTtcblxuICByZXR1cm4gdGhpcztcbn07XG5cbi8vIHNldCB1cCBkYXRhIGV2ZW50cyBpZiB0aGV5IGFyZSBhc2tlZCBmb3Jcbi8vIEVuc3VyZSByZWFkYWJsZSBsaXN0ZW5lcnMgZXZlbnR1YWxseSBnZXQgc29tZXRoaW5nXG5SZWFkYWJsZS5wcm90b3R5cGUub24gPSBmdW5jdGlvbiAoZXYsIGZuKSB7XG4gIHZhciByZXMgPSBTdHJlYW0ucHJvdG90eXBlLm9uLmNhbGwodGhpcywgZXYsIGZuKTtcblxuICAvLyBJZiBsaXN0ZW5pbmcgdG8gZGF0YSwgYW5kIGl0IGhhcyBub3QgZXhwbGljaXRseSBiZWVuIHBhdXNlZCxcbiAgLy8gdGhlbiBjYWxsIHJlc3VtZSB0byBzdGFydCB0aGUgZmxvdyBvZiBkYXRhIG9uIHRoZSBuZXh0IHRpY2suXG4gIGlmIChldiA9PT0gJ2RhdGEnICYmIGZhbHNlICE9PSB0aGlzLl9yZWFkYWJsZVN0YXRlLmZsb3dpbmcpIHtcbiAgICB0aGlzLnJlc3VtZSgpO1xuICB9XG5cbiAgaWYgKGV2ID09PSAncmVhZGFibGUnICYmICF0aGlzLl9yZWFkYWJsZVN0YXRlLmVuZEVtaXR0ZWQpIHtcbiAgICB2YXIgc3RhdGUgPSB0aGlzLl9yZWFkYWJsZVN0YXRlO1xuICAgIGlmICghc3RhdGUucmVhZGFibGVMaXN0ZW5pbmcpIHtcbiAgICAgIHN0YXRlLnJlYWRhYmxlTGlzdGVuaW5nID0gdHJ1ZTtcbiAgICAgIHN0YXRlLmVtaXR0ZWRSZWFkYWJsZSA9IGZhbHNlO1xuICAgICAgc3RhdGUubmVlZFJlYWRhYmxlID0gdHJ1ZTtcbiAgICAgIGlmICghc3RhdGUucmVhZGluZykge1xuICAgICAgICBwcm9jZXNzTmV4dFRpY2soblJlYWRpbmdOZXh0VGljaywgdGhpcyk7XG4gICAgICB9IGVsc2UgaWYgKHN0YXRlLmxlbmd0aCkge1xuICAgICAgICBlbWl0UmVhZGFibGUodGhpcywgc3RhdGUpO1xuICAgICAgfVxuICAgIH1cbiAgfVxuXG4gIHJldHVybiByZXM7XG59O1xuUmVhZGFibGUucHJvdG90eXBlLmFkZExpc3RlbmVyID0gUmVhZGFibGUucHJvdG90eXBlLm9uO1xuXG5mdW5jdGlvbiBuUmVhZGluZ05leHRUaWNrKHNlbGYpIHtcbiAgZGVidWcoJ3JlYWRhYmxlIG5leHR0aWNrIHJlYWQgMCcpO1xuICBzZWxmLnJlYWQoMCk7XG59XG5cbi8vIHBhdXNlKCkgYW5kIHJlc3VtZSgpIGFyZSByZW1uYW50cyBvZiB0aGUgbGVnYWN5IHJlYWRhYmxlIHN0cmVhbSBBUElcbi8vIElmIHRoZSB1c2VyIHVzZXMgdGhlbSwgdGhlbiBzd2l0Y2ggaW50byBvbGQgbW9kZS5cblJlYWRhYmxlLnByb3RvdHlwZS5yZXN1bWUgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBzdGF0ZSA9IHRoaXMuX3JlYWRhYmxlU3RhdGU7XG4gIGlmICghc3RhdGUuZmxvd2luZykge1xuICAgIGRlYnVnKCdyZXN1bWUnKTtcbiAgICBzdGF0ZS5mbG93aW5nID0gdHJ1ZTtcbiAgICByZXN1bWUodGhpcywgc3RhdGUpO1xuICB9XG4gIHJldHVybiB0aGlzO1xufTtcblxuZnVuY3Rpb24gcmVzdW1lKHN0cmVhbSwgc3RhdGUpIHtcbiAgaWYgKCFzdGF0ZS5yZXN1bWVTY2hlZHVsZWQpIHtcbiAgICBzdGF0ZS5yZXN1bWVTY2hlZHVsZWQgPSB0cnVlO1xuICAgIHByb2Nlc3NOZXh0VGljayhyZXN1bWVfLCBzdHJlYW0sIHN0YXRlKTtcbiAgfVxufVxuXG5mdW5jdGlvbiByZXN1bWVfKHN0cmVhbSwgc3RhdGUpIHtcbiAgaWYgKCFzdGF0ZS5yZWFkaW5nKSB7XG4gICAgZGVidWcoJ3Jlc3VtZSByZWFkIDAnKTtcbiAgICBzdHJlYW0ucmVhZCgwKTtcbiAgfVxuXG4gIHN0YXRlLnJlc3VtZVNjaGVkdWxlZCA9IGZhbHNlO1xuICBzdHJlYW0uZW1pdCgncmVzdW1lJyk7XG4gIGZsb3coc3RyZWFtKTtcbiAgaWYgKHN0YXRlLmZsb3dpbmcgJiYgIXN0YXRlLnJlYWRpbmcpIHN0cmVhbS5yZWFkKDApO1xufVxuXG5SZWFkYWJsZS5wcm90b3R5cGUucGF1c2UgPSBmdW5jdGlvbiAoKSB7XG4gIGRlYnVnKCdjYWxsIHBhdXNlIGZsb3dpbmc9JWonLCB0aGlzLl9yZWFkYWJsZVN0YXRlLmZsb3dpbmcpO1xuICBpZiAoZmFsc2UgIT09IHRoaXMuX3JlYWRhYmxlU3RhdGUuZmxvd2luZykge1xuICAgIGRlYnVnKCdwYXVzZScpO1xuICAgIHRoaXMuX3JlYWRhYmxlU3RhdGUuZmxvd2luZyA9IGZhbHNlO1xuICAgIHRoaXMuZW1pdCgncGF1c2UnKTtcbiAgfVxuICByZXR1cm4gdGhpcztcbn07XG5cbmZ1bmN0aW9uIGZsb3coc3RyZWFtKSB7XG4gIHZhciBzdGF0ZSA9IHN0cmVhbS5fcmVhZGFibGVTdGF0ZTtcbiAgZGVidWcoJ2Zsb3cnLCBzdGF0ZS5mbG93aW5nKTtcbiAgaWYgKHN0YXRlLmZsb3dpbmcpIHtcbiAgICBkbyB7XG4gICAgICB2YXIgY2h1bmsgPSBzdHJlYW0ucmVhZCgpO1xuICAgIH0gd2hpbGUgKG51bGwgIT09IGNodW5rICYmIHN0YXRlLmZsb3dpbmcpO1xuICB9XG59XG5cbi8vIHdyYXAgYW4gb2xkLXN0eWxlIHN0cmVhbSBhcyB0aGUgYXN5bmMgZGF0YSBzb3VyY2UuXG4vLyBUaGlzIGlzICpub3QqIHBhcnQgb2YgdGhlIHJlYWRhYmxlIHN0cmVhbSBpbnRlcmZhY2UuXG4vLyBJdCBpcyBhbiB1Z2x5IHVuZm9ydHVuYXRlIG1lc3Mgb2YgaGlzdG9yeS5cblJlYWRhYmxlLnByb3RvdHlwZS53cmFwID0gZnVuY3Rpb24gKHN0cmVhbSkge1xuICB2YXIgc3RhdGUgPSB0aGlzLl9yZWFkYWJsZVN0YXRlO1xuICB2YXIgcGF1c2VkID0gZmFsc2U7XG5cbiAgdmFyIHNlbGYgPSB0aGlzO1xuICBzdHJlYW0ub24oJ2VuZCcsIGZ1bmN0aW9uICgpIHtcbiAgICBkZWJ1Zygnd3JhcHBlZCBlbmQnKTtcbiAgICBpZiAoc3RhdGUuZGVjb2RlciAmJiAhc3RhdGUuZW5kZWQpIHtcbiAgICAgIHZhciBjaHVuayA9IHN0YXRlLmRlY29kZXIuZW5kKCk7XG4gICAgICBpZiAoY2h1bmsgJiYgY2h1bmsubGVuZ3RoKSBzZWxmLnB1c2goY2h1bmspO1xuICAgIH1cblxuICAgIHNlbGYucHVzaChudWxsKTtcbiAgfSk7XG5cbiAgc3RyZWFtLm9uKCdkYXRhJywgZnVuY3Rpb24gKGNodW5rKSB7XG4gICAgZGVidWcoJ3dyYXBwZWQgZGF0YScpO1xuICAgIGlmIChzdGF0ZS5kZWNvZGVyKSBjaHVuayA9IHN0YXRlLmRlY29kZXIud3JpdGUoY2h1bmspO1xuXG4gICAgLy8gZG9uJ3Qgc2tpcCBvdmVyIGZhbHN5IHZhbHVlcyBpbiBvYmplY3RNb2RlXG4gICAgaWYgKHN0YXRlLm9iamVjdE1vZGUgJiYgKGNodW5rID09PSBudWxsIHx8IGNodW5rID09PSB1bmRlZmluZWQpKSByZXR1cm47ZWxzZSBpZiAoIXN0YXRlLm9iamVjdE1vZGUgJiYgKCFjaHVuayB8fCAhY2h1bmsubGVuZ3RoKSkgcmV0dXJuO1xuXG4gICAgdmFyIHJldCA9IHNlbGYucHVzaChjaHVuayk7XG4gICAgaWYgKCFyZXQpIHtcbiAgICAgIHBhdXNlZCA9IHRydWU7XG4gICAgICBzdHJlYW0ucGF1c2UoKTtcbiAgICB9XG4gIH0pO1xuXG4gIC8vIHByb3h5IGFsbCB0aGUgb3RoZXIgbWV0aG9kcy5cbiAgLy8gaW1wb3J0YW50IHdoZW4gd3JhcHBpbmcgZmlsdGVycyBhbmQgZHVwbGV4ZXMuXG4gIGZvciAodmFyIGkgaW4gc3RyZWFtKSB7XG4gICAgaWYgKHRoaXNbaV0gPT09IHVuZGVmaW5lZCAmJiB0eXBlb2Ygc3RyZWFtW2ldID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICB0aGlzW2ldID0gZnVuY3Rpb24gKG1ldGhvZCkge1xuICAgICAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgICAgIHJldHVybiBzdHJlYW1bbWV0aG9kXS5hcHBseShzdHJlYW0sIGFyZ3VtZW50cyk7XG4gICAgICAgIH07XG4gICAgICB9KGkpO1xuICAgIH1cbiAgfVxuXG4gIC8vIHByb3h5IGNlcnRhaW4gaW1wb3J0YW50IGV2ZW50cy5cbiAgdmFyIGV2ZW50cyA9IFsnZXJyb3InLCAnY2xvc2UnLCAnZGVzdHJveScsICdwYXVzZScsICdyZXN1bWUnXTtcbiAgZm9yRWFjaChldmVudHMsIGZ1bmN0aW9uIChldikge1xuICAgIHN0cmVhbS5vbihldiwgc2VsZi5lbWl0LmJpbmQoc2VsZiwgZXYpKTtcbiAgfSk7XG5cbiAgLy8gd2hlbiB3ZSB0cnkgdG8gY29uc3VtZSBzb21lIG1vcmUgYnl0ZXMsIHNpbXBseSB1bnBhdXNlIHRoZVxuICAvLyB1bmRlcmx5aW5nIHN0cmVhbS5cbiAgc2VsZi5fcmVhZCA9IGZ1bmN0aW9uIChuKSB7XG4gICAgZGVidWcoJ3dyYXBwZWQgX3JlYWQnLCBuKTtcbiAgICBpZiAocGF1c2VkKSB7XG4gICAgICBwYXVzZWQgPSBmYWxzZTtcbiAgICAgIHN0cmVhbS5yZXN1bWUoKTtcbiAgICB9XG4gIH07XG5cbiAgcmV0dXJuIHNlbGY7XG59O1xuXG4vLyBleHBvc2VkIGZvciB0ZXN0aW5nIHB1cnBvc2VzIG9ubHkuXG5SZWFkYWJsZS5fZnJvbUxpc3QgPSBmcm9tTGlzdDtcblxuLy8gUGx1Y2sgb2ZmIG4gYnl0ZXMgZnJvbSBhbiBhcnJheSBvZiBidWZmZXJzLlxuLy8gTGVuZ3RoIGlzIHRoZSBjb21iaW5lZCBsZW5ndGhzIG9mIGFsbCB0aGUgYnVmZmVycyBpbiB0aGUgbGlzdC5cbmZ1bmN0aW9uIGZyb21MaXN0KG4sIHN0YXRlKSB7XG4gIHZhciBsaXN0ID0gc3RhdGUuYnVmZmVyO1xuICB2YXIgbGVuZ3RoID0gc3RhdGUubGVuZ3RoO1xuICB2YXIgc3RyaW5nTW9kZSA9ICEhc3RhdGUuZGVjb2RlcjtcbiAgdmFyIG9iamVjdE1vZGUgPSAhIXN0YXRlLm9iamVjdE1vZGU7XG4gIHZhciByZXQ7XG5cbiAgLy8gbm90aGluZyBpbiB0aGUgbGlzdCwgZGVmaW5pdGVseSBlbXB0eS5cbiAgaWYgKGxpc3QubGVuZ3RoID09PSAwKSByZXR1cm4gbnVsbDtcblxuICBpZiAobGVuZ3RoID09PSAwKSByZXQgPSBudWxsO2Vsc2UgaWYgKG9iamVjdE1vZGUpIHJldCA9IGxpc3Quc2hpZnQoKTtlbHNlIGlmICghbiB8fCBuID49IGxlbmd0aCkge1xuICAgIC8vIHJlYWQgaXQgYWxsLCB0cnVuY2F0ZSB0aGUgYXJyYXkuXG4gICAgaWYgKHN0cmluZ01vZGUpIHJldCA9IGxpc3Quam9pbignJyk7ZWxzZSBpZiAobGlzdC5sZW5ndGggPT09IDEpIHJldCA9IGxpc3RbMF07ZWxzZSByZXQgPSBCdWZmZXIuY29uY2F0KGxpc3QsIGxlbmd0aCk7XG4gICAgbGlzdC5sZW5ndGggPSAwO1xuICB9IGVsc2Uge1xuICAgIC8vIHJlYWQganVzdCBzb21lIG9mIGl0LlxuICAgIGlmIChuIDwgbGlzdFswXS5sZW5ndGgpIHtcbiAgICAgIC8vIGp1c3QgdGFrZSBhIHBhcnQgb2YgdGhlIGZpcnN0IGxpc3QgaXRlbS5cbiAgICAgIC8vIHNsaWNlIGlzIHRoZSBzYW1lIGZvciBidWZmZXJzIGFuZCBzdHJpbmdzLlxuICAgICAgdmFyIGJ1ZiA9IGxpc3RbMF07XG4gICAgICByZXQgPSBidWYuc2xpY2UoMCwgbik7XG4gICAgICBsaXN0WzBdID0gYnVmLnNsaWNlKG4pO1xuICAgIH0gZWxzZSBpZiAobiA9PT0gbGlzdFswXS5sZW5ndGgpIHtcbiAgICAgIC8vIGZpcnN0IGxpc3QgaXMgYSBwZXJmZWN0IG1hdGNoXG4gICAgICByZXQgPSBsaXN0LnNoaWZ0KCk7XG4gICAgfSBlbHNlIHtcbiAgICAgIC8vIGNvbXBsZXggY2FzZS5cbiAgICAgIC8vIHdlIGhhdmUgZW5vdWdoIHRvIGNvdmVyIGl0LCBidXQgaXQgc3BhbnMgcGFzdCB0aGUgZmlyc3QgYnVmZmVyLlxuICAgICAgaWYgKHN0cmluZ01vZGUpIHJldCA9ICcnO2Vsc2UgcmV0ID0gbmV3IEJ1ZmZlcihuKTtcblxuICAgICAgdmFyIGMgPSAwO1xuICAgICAgZm9yICh2YXIgaSA9IDAsIGwgPSBsaXN0Lmxlbmd0aDsgaSA8IGwgJiYgYyA8IG47IGkrKykge1xuICAgICAgICB2YXIgYnVmID0gbGlzdFswXTtcbiAgICAgICAgdmFyIGNweSA9IE1hdGgubWluKG4gLSBjLCBidWYubGVuZ3RoKTtcblxuICAgICAgICBpZiAoc3RyaW5nTW9kZSkgcmV0ICs9IGJ1Zi5zbGljZSgwLCBjcHkpO2Vsc2UgYnVmLmNvcHkocmV0LCBjLCAwLCBjcHkpO1xuXG4gICAgICAgIGlmIChjcHkgPCBidWYubGVuZ3RoKSBsaXN0WzBdID0gYnVmLnNsaWNlKGNweSk7ZWxzZSBsaXN0LnNoaWZ0KCk7XG5cbiAgICAgICAgYyArPSBjcHk7XG4gICAgICB9XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIHJldDtcbn1cblxuZnVuY3Rpb24gZW5kUmVhZGFibGUoc3RyZWFtKSB7XG4gIHZhciBzdGF0ZSA9IHN0cmVhbS5fcmVhZGFibGVTdGF0ZTtcblxuICAvLyBJZiB3ZSBnZXQgaGVyZSBiZWZvcmUgY29uc3VtaW5nIGFsbCB0aGUgYnl0ZXMsIHRoZW4gdGhhdCBpcyBhXG4gIC8vIGJ1ZyBpbiBub2RlLiAgU2hvdWxkIG5ldmVyIGhhcHBlbi5cbiAgaWYgKHN0YXRlLmxlbmd0aCA+IDApIHRocm93IG5ldyBFcnJvcignZW5kUmVhZGFibGUgY2FsbGVkIG9uIG5vbi1lbXB0eSBzdHJlYW0nKTtcblxuICBpZiAoIXN0YXRlLmVuZEVtaXR0ZWQpIHtcbiAgICBzdGF0ZS5lbmRlZCA9IHRydWU7XG4gICAgcHJvY2Vzc05leHRUaWNrKGVuZFJlYWRhYmxlTlQsIHN0YXRlLCBzdHJlYW0pO1xuICB9XG59XG5cbmZ1bmN0aW9uIGVuZFJlYWRhYmxlTlQoc3RhdGUsIHN0cmVhbSkge1xuICAvLyBDaGVjayB0aGF0IHdlIGRpZG4ndCBnZXQgb25lIGxhc3QgdW5zaGlmdC5cbiAgaWYgKCFzdGF0ZS5lbmRFbWl0dGVkICYmIHN0YXRlLmxlbmd0aCA9PT0gMCkge1xuICAgIHN0YXRlLmVuZEVtaXR0ZWQgPSB0cnVlO1xuICAgIHN0cmVhbS5yZWFkYWJsZSA9IGZhbHNlO1xuICAgIHN0cmVhbS5lbWl0KCdlbmQnKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBmb3JFYWNoKHhzLCBmKSB7XG4gIGZvciAodmFyIGkgPSAwLCBsID0geHMubGVuZ3RoOyBpIDwgbDsgaSsrKSB7XG4gICAgZih4c1tpXSwgaSk7XG4gIH1cbn1cblxuZnVuY3Rpb24gaW5kZXhPZih4cywgeCkge1xuICBmb3IgKHZhciBpID0gMCwgbCA9IHhzLmxlbmd0aDsgaSA8IGw7IGkrKykge1xuICAgIGlmICh4c1tpXSA9PT0geCkgcmV0dXJuIGk7XG4gIH1cbiAgcmV0dXJuIC0xO1xufSIsIi8vIGEgdHJhbnNmb3JtIHN0cmVhbSBpcyBhIHJlYWRhYmxlL3dyaXRhYmxlIHN0cmVhbSB3aGVyZSB5b3UgZG9cbi8vIHNvbWV0aGluZyB3aXRoIHRoZSBkYXRhLiAgU29tZXRpbWVzIGl0J3MgY2FsbGVkIGEgXCJmaWx0ZXJcIixcbi8vIGJ1dCB0aGF0J3Mgbm90IGEgZ3JlYXQgbmFtZSBmb3IgaXQsIHNpbmNlIHRoYXQgaW1wbGllcyBhIHRoaW5nIHdoZXJlXG4vLyBzb21lIGJpdHMgcGFzcyB0aHJvdWdoLCBhbmQgb3RoZXJzIGFyZSBzaW1wbHkgaWdub3JlZC4gIChUaGF0IHdvdWxkXG4vLyBiZSBhIHZhbGlkIGV4YW1wbGUgb2YgYSB0cmFuc2Zvcm0sIG9mIGNvdXJzZS4pXG4vL1xuLy8gV2hpbGUgdGhlIG91dHB1dCBpcyBjYXVzYWxseSByZWxhdGVkIHRvIHRoZSBpbnB1dCwgaXQncyBub3QgYVxuLy8gbmVjZXNzYXJpbHkgc3ltbWV0cmljIG9yIHN5bmNocm9ub3VzIHRyYW5zZm9ybWF0aW9uLiAgRm9yIGV4YW1wbGUsXG4vLyBhIHpsaWIgc3RyZWFtIG1pZ2h0IHRha2UgbXVsdGlwbGUgcGxhaW4tdGV4dCB3cml0ZXMoKSwgYW5kIHRoZW5cbi8vIGVtaXQgYSBzaW5nbGUgY29tcHJlc3NlZCBjaHVuayBzb21lIHRpbWUgaW4gdGhlIGZ1dHVyZS5cbi8vXG4vLyBIZXJlJ3MgaG93IHRoaXMgd29ya3M6XG4vL1xuLy8gVGhlIFRyYW5zZm9ybSBzdHJlYW0gaGFzIGFsbCB0aGUgYXNwZWN0cyBvZiB0aGUgcmVhZGFibGUgYW5kIHdyaXRhYmxlXG4vLyBzdHJlYW0gY2xhc3Nlcy4gIFdoZW4geW91IHdyaXRlKGNodW5rKSwgdGhhdCBjYWxscyBfd3JpdGUoY2h1bmssY2IpXG4vLyBpbnRlcm5hbGx5LCBhbmQgcmV0dXJucyBmYWxzZSBpZiB0aGVyZSdzIGEgbG90IG9mIHBlbmRpbmcgd3JpdGVzXG4vLyBidWZmZXJlZCB1cC4gIFdoZW4geW91IGNhbGwgcmVhZCgpLCB0aGF0IGNhbGxzIF9yZWFkKG4pIHVudGlsXG4vLyB0aGVyZSdzIGVub3VnaCBwZW5kaW5nIHJlYWRhYmxlIGRhdGEgYnVmZmVyZWQgdXAuXG4vL1xuLy8gSW4gYSB0cmFuc2Zvcm0gc3RyZWFtLCB0aGUgd3JpdHRlbiBkYXRhIGlzIHBsYWNlZCBpbiBhIGJ1ZmZlci4gIFdoZW5cbi8vIF9yZWFkKG4pIGlzIGNhbGxlZCwgaXQgdHJhbnNmb3JtcyB0aGUgcXVldWVkIHVwIGRhdGEsIGNhbGxpbmcgdGhlXG4vLyBidWZmZXJlZCBfd3JpdGUgY2IncyBhcyBpdCBjb25zdW1lcyBjaHVua3MuICBJZiBjb25zdW1pbmcgYSBzaW5nbGVcbi8vIHdyaXR0ZW4gY2h1bmsgd291bGQgcmVzdWx0IGluIG11bHRpcGxlIG91dHB1dCBjaHVua3MsIHRoZW4gdGhlIGZpcnN0XG4vLyBvdXRwdXR0ZWQgYml0IGNhbGxzIHRoZSByZWFkY2IsIGFuZCBzdWJzZXF1ZW50IGNodW5rcyBqdXN0IGdvIGludG9cbi8vIHRoZSByZWFkIGJ1ZmZlciwgYW5kIHdpbGwgY2F1c2UgaXQgdG8gZW1pdCAncmVhZGFibGUnIGlmIG5lY2Vzc2FyeS5cbi8vXG4vLyBUaGlzIHdheSwgYmFjay1wcmVzc3VyZSBpcyBhY3R1YWxseSBkZXRlcm1pbmVkIGJ5IHRoZSByZWFkaW5nIHNpZGUsXG4vLyBzaW5jZSBfcmVhZCBoYXMgdG8gYmUgY2FsbGVkIHRvIHN0YXJ0IHByb2Nlc3NpbmcgYSBuZXcgY2h1bmsuICBIb3dldmVyLFxuLy8gYSBwYXRob2xvZ2ljYWwgaW5mbGF0ZSB0eXBlIG9mIHRyYW5zZm9ybSBjYW4gY2F1c2UgZXhjZXNzaXZlIGJ1ZmZlcmluZ1xuLy8gaGVyZS4gIEZvciBleGFtcGxlLCBpbWFnaW5lIGEgc3RyZWFtIHdoZXJlIGV2ZXJ5IGJ5dGUgb2YgaW5wdXQgaXNcbi8vIGludGVycHJldGVkIGFzIGFuIGludGVnZXIgZnJvbSAwLTI1NSwgYW5kIHRoZW4gcmVzdWx0cyBpbiB0aGF0IG1hbnlcbi8vIGJ5dGVzIG9mIG91dHB1dC4gIFdyaXRpbmcgdGhlIDQgYnl0ZXMge2ZmLGZmLGZmLGZmfSB3b3VsZCByZXN1bHQgaW5cbi8vIDFrYiBvZiBkYXRhIGJlaW5nIG91dHB1dC4gIEluIHRoaXMgY2FzZSwgeW91IGNvdWxkIHdyaXRlIGEgdmVyeSBzbWFsbFxuLy8gYW1vdW50IG9mIGlucHV0LCBhbmQgZW5kIHVwIHdpdGggYSB2ZXJ5IGxhcmdlIGFtb3VudCBvZiBvdXRwdXQuICBJblxuLy8gc3VjaCBhIHBhdGhvbG9naWNhbCBpbmZsYXRpbmcgbWVjaGFuaXNtLCB0aGVyZSdkIGJlIG5vIHdheSB0byB0ZWxsXG4vLyB0aGUgc3lzdGVtIHRvIHN0b3AgZG9pbmcgdGhlIHRyYW5zZm9ybS4gIEEgc2luZ2xlIDRNQiB3cml0ZSBjb3VsZFxuLy8gY2F1c2UgdGhlIHN5c3RlbSB0byBydW4gb3V0IG9mIG1lbW9yeS5cbi8vXG4vLyBIb3dldmVyLCBldmVuIGluIHN1Y2ggYSBwYXRob2xvZ2ljYWwgY2FzZSwgb25seSBhIHNpbmdsZSB3cml0dGVuIGNodW5rXG4vLyB3b3VsZCBiZSBjb25zdW1lZCwgYW5kIHRoZW4gdGhlIHJlc3Qgd291bGQgd2FpdCAodW4tdHJhbnNmb3JtZWQpIHVudGlsXG4vLyB0aGUgcmVzdWx0cyBvZiB0aGUgcHJldmlvdXMgdHJhbnNmb3JtZWQgY2h1bmsgd2VyZSBjb25zdW1lZC5cblxuJ3VzZSBzdHJpY3QnO1xuXG5tb2R1bGUuZXhwb3J0cyA9IFRyYW5zZm9ybTtcblxudmFyIER1cGxleCA9IHJlcXVpcmUoJy4vX3N0cmVhbV9kdXBsZXgnKTtcblxuLyo8cmVwbGFjZW1lbnQ+Ki9cbnZhciB1dGlsID0gcmVxdWlyZSgnY29yZS11dGlsLWlzJyk7XG51dGlsLmluaGVyaXRzID0gcmVxdWlyZSgnaW5oZXJpdHMnKTtcbi8qPC9yZXBsYWNlbWVudD4qL1xuXG51dGlsLmluaGVyaXRzKFRyYW5zZm9ybSwgRHVwbGV4KTtcblxuZnVuY3Rpb24gVHJhbnNmb3JtU3RhdGUoc3RyZWFtKSB7XG4gIHRoaXMuYWZ0ZXJUcmFuc2Zvcm0gPSBmdW5jdGlvbiAoZXIsIGRhdGEpIHtcbiAgICByZXR1cm4gYWZ0ZXJUcmFuc2Zvcm0oc3RyZWFtLCBlciwgZGF0YSk7XG4gIH07XG5cbiAgdGhpcy5uZWVkVHJhbnNmb3JtID0gZmFsc2U7XG4gIHRoaXMudHJhbnNmb3JtaW5nID0gZmFsc2U7XG4gIHRoaXMud3JpdGVjYiA9IG51bGw7XG4gIHRoaXMud3JpdGVjaHVuayA9IG51bGw7XG4gIHRoaXMud3JpdGVlbmNvZGluZyA9IG51bGw7XG59XG5cbmZ1bmN0aW9uIGFmdGVyVHJhbnNmb3JtKHN0cmVhbSwgZXIsIGRhdGEpIHtcbiAgdmFyIHRzID0gc3RyZWFtLl90cmFuc2Zvcm1TdGF0ZTtcbiAgdHMudHJhbnNmb3JtaW5nID0gZmFsc2U7XG5cbiAgdmFyIGNiID0gdHMud3JpdGVjYjtcblxuICBpZiAoIWNiKSByZXR1cm4gc3RyZWFtLmVtaXQoJ2Vycm9yJywgbmV3IEVycm9yKCdubyB3cml0ZWNiIGluIFRyYW5zZm9ybSBjbGFzcycpKTtcblxuICB0cy53cml0ZWNodW5rID0gbnVsbDtcbiAgdHMud3JpdGVjYiA9IG51bGw7XG5cbiAgaWYgKGRhdGEgIT09IG51bGwgJiYgZGF0YSAhPT0gdW5kZWZpbmVkKSBzdHJlYW0ucHVzaChkYXRhKTtcblxuICBjYihlcik7XG5cbiAgdmFyIHJzID0gc3RyZWFtLl9yZWFkYWJsZVN0YXRlO1xuICBycy5yZWFkaW5nID0gZmFsc2U7XG4gIGlmIChycy5uZWVkUmVhZGFibGUgfHwgcnMubGVuZ3RoIDwgcnMuaGlnaFdhdGVyTWFyaykge1xuICAgIHN0cmVhbS5fcmVhZChycy5oaWdoV2F0ZXJNYXJrKTtcbiAgfVxufVxuXG5mdW5jdGlvbiBUcmFuc2Zvcm0ob3B0aW9ucykge1xuICBpZiAoISh0aGlzIGluc3RhbmNlb2YgVHJhbnNmb3JtKSkgcmV0dXJuIG5ldyBUcmFuc2Zvcm0ob3B0aW9ucyk7XG5cbiAgRHVwbGV4LmNhbGwodGhpcywgb3B0aW9ucyk7XG5cbiAgdGhpcy5fdHJhbnNmb3JtU3RhdGUgPSBuZXcgVHJhbnNmb3JtU3RhdGUodGhpcyk7XG5cbiAgLy8gd2hlbiB0aGUgd3JpdGFibGUgc2lkZSBmaW5pc2hlcywgdGhlbiBmbHVzaCBvdXQgYW55dGhpbmcgcmVtYWluaW5nLlxuICB2YXIgc3RyZWFtID0gdGhpcztcblxuICAvLyBzdGFydCBvdXQgYXNraW5nIGZvciBhIHJlYWRhYmxlIGV2ZW50IG9uY2UgZGF0YSBpcyB0cmFuc2Zvcm1lZC5cbiAgdGhpcy5fcmVhZGFibGVTdGF0ZS5uZWVkUmVhZGFibGUgPSB0cnVlO1xuXG4gIC8vIHdlIGhhdmUgaW1wbGVtZW50ZWQgdGhlIF9yZWFkIG1ldGhvZCwgYW5kIGRvbmUgdGhlIG90aGVyIHRoaW5nc1xuICAvLyB0aGF0IFJlYWRhYmxlIHdhbnRzIGJlZm9yZSB0aGUgZmlyc3QgX3JlYWQgY2FsbCwgc28gdW5zZXQgdGhlXG4gIC8vIHN5bmMgZ3VhcmQgZmxhZy5cbiAgdGhpcy5fcmVhZGFibGVTdGF0ZS5zeW5jID0gZmFsc2U7XG5cbiAgaWYgKG9wdGlvbnMpIHtcbiAgICBpZiAodHlwZW9mIG9wdGlvbnMudHJhbnNmb3JtID09PSAnZnVuY3Rpb24nKSB0aGlzLl90cmFuc2Zvcm0gPSBvcHRpb25zLnRyYW5zZm9ybTtcblxuICAgIGlmICh0eXBlb2Ygb3B0aW9ucy5mbHVzaCA9PT0gJ2Z1bmN0aW9uJykgdGhpcy5fZmx1c2ggPSBvcHRpb25zLmZsdXNoO1xuICB9XG5cbiAgdGhpcy5vbmNlKCdwcmVmaW5pc2gnLCBmdW5jdGlvbiAoKSB7XG4gICAgaWYgKHR5cGVvZiB0aGlzLl9mbHVzaCA9PT0gJ2Z1bmN0aW9uJykgdGhpcy5fZmx1c2goZnVuY3Rpb24gKGVyKSB7XG4gICAgICBkb25lKHN0cmVhbSwgZXIpO1xuICAgIH0pO2Vsc2UgZG9uZShzdHJlYW0pO1xuICB9KTtcbn1cblxuVHJhbnNmb3JtLnByb3RvdHlwZS5wdXNoID0gZnVuY3Rpb24gKGNodW5rLCBlbmNvZGluZykge1xuICB0aGlzLl90cmFuc2Zvcm1TdGF0ZS5uZWVkVHJhbnNmb3JtID0gZmFsc2U7XG4gIHJldHVybiBEdXBsZXgucHJvdG90eXBlLnB1c2guY2FsbCh0aGlzLCBjaHVuaywgZW5jb2RpbmcpO1xufTtcblxuLy8gVGhpcyBpcyB0aGUgcGFydCB3aGVyZSB5b3UgZG8gc3R1ZmYhXG4vLyBvdmVycmlkZSB0aGlzIGZ1bmN0aW9uIGluIGltcGxlbWVudGF0aW9uIGNsYXNzZXMuXG4vLyAnY2h1bmsnIGlzIGFuIGlucHV0IGNodW5rLlxuLy9cbi8vIENhbGwgYHB1c2gobmV3Q2h1bmspYCB0byBwYXNzIGFsb25nIHRyYW5zZm9ybWVkIG91dHB1dFxuLy8gdG8gdGhlIHJlYWRhYmxlIHNpZGUuICBZb3UgbWF5IGNhbGwgJ3B1c2gnIHplcm8gb3IgbW9yZSB0aW1lcy5cbi8vXG4vLyBDYWxsIGBjYihlcnIpYCB3aGVuIHlvdSBhcmUgZG9uZSB3aXRoIHRoaXMgY2h1bmsuICBJZiB5b3UgcGFzc1xuLy8gYW4gZXJyb3IsIHRoZW4gdGhhdCdsbCBwdXQgdGhlIGh1cnQgb24gdGhlIHdob2xlIG9wZXJhdGlvbi4gIElmIHlvdVxuLy8gbmV2ZXIgY2FsbCBjYigpLCB0aGVuIHlvdSdsbCBuZXZlciBnZXQgYW5vdGhlciBjaHVuay5cblRyYW5zZm9ybS5wcm90b3R5cGUuX3RyYW5zZm9ybSA9IGZ1bmN0aW9uIChjaHVuaywgZW5jb2RpbmcsIGNiKSB7XG4gIHRocm93IG5ldyBFcnJvcignbm90IGltcGxlbWVudGVkJyk7XG59O1xuXG5UcmFuc2Zvcm0ucHJvdG90eXBlLl93cml0ZSA9IGZ1bmN0aW9uIChjaHVuaywgZW5jb2RpbmcsIGNiKSB7XG4gIHZhciB0cyA9IHRoaXMuX3RyYW5zZm9ybVN0YXRlO1xuICB0cy53cml0ZWNiID0gY2I7XG4gIHRzLndyaXRlY2h1bmsgPSBjaHVuaztcbiAgdHMud3JpdGVlbmNvZGluZyA9IGVuY29kaW5nO1xuICBpZiAoIXRzLnRyYW5zZm9ybWluZykge1xuICAgIHZhciBycyA9IHRoaXMuX3JlYWRhYmxlU3RhdGU7XG4gICAgaWYgKHRzLm5lZWRUcmFuc2Zvcm0gfHwgcnMubmVlZFJlYWRhYmxlIHx8IHJzLmxlbmd0aCA8IHJzLmhpZ2hXYXRlck1hcmspIHRoaXMuX3JlYWQocnMuaGlnaFdhdGVyTWFyayk7XG4gIH1cbn07XG5cbi8vIERvZXNuJ3QgbWF0dGVyIHdoYXQgdGhlIGFyZ3MgYXJlIGhlcmUuXG4vLyBfdHJhbnNmb3JtIGRvZXMgYWxsIHRoZSB3b3JrLlxuLy8gVGhhdCB3ZSBnb3QgaGVyZSBtZWFucyB0aGF0IHRoZSByZWFkYWJsZSBzaWRlIHdhbnRzIG1vcmUgZGF0YS5cblRyYW5zZm9ybS5wcm90b3R5cGUuX3JlYWQgPSBmdW5jdGlvbiAobikge1xuICB2YXIgdHMgPSB0aGlzLl90cmFuc2Zvcm1TdGF0ZTtcblxuICBpZiAodHMud3JpdGVjaHVuayAhPT0gbnVsbCAmJiB0cy53cml0ZWNiICYmICF0cy50cmFuc2Zvcm1pbmcpIHtcbiAgICB0cy50cmFuc2Zvcm1pbmcgPSB0cnVlO1xuICAgIHRoaXMuX3RyYW5zZm9ybSh0cy53cml0ZWNodW5rLCB0cy53cml0ZWVuY29kaW5nLCB0cy5hZnRlclRyYW5zZm9ybSk7XG4gIH0gZWxzZSB7XG4gICAgLy8gbWFyayB0aGF0IHdlIG5lZWQgYSB0cmFuc2Zvcm0sIHNvIHRoYXQgYW55IGRhdGEgdGhhdCBjb21lcyBpblxuICAgIC8vIHdpbGwgZ2V0IHByb2Nlc3NlZCwgbm93IHRoYXQgd2UndmUgYXNrZWQgZm9yIGl0LlxuICAgIHRzLm5lZWRUcmFuc2Zvcm0gPSB0cnVlO1xuICB9XG59O1xuXG5mdW5jdGlvbiBkb25lKHN0cmVhbSwgZXIpIHtcbiAgaWYgKGVyKSByZXR1cm4gc3RyZWFtLmVtaXQoJ2Vycm9yJywgZXIpO1xuXG4gIC8vIGlmIHRoZXJlJ3Mgbm90aGluZyBpbiB0aGUgd3JpdGUgYnVmZmVyLCB0aGVuIHRoYXQgbWVhbnNcbiAgLy8gdGhhdCBub3RoaW5nIG1vcmUgd2lsbCBldmVyIGJlIHByb3ZpZGVkXG4gIHZhciB3cyA9IHN0cmVhbS5fd3JpdGFibGVTdGF0ZTtcbiAgdmFyIHRzID0gc3RyZWFtLl90cmFuc2Zvcm1TdGF0ZTtcblxuICBpZiAod3MubGVuZ3RoKSB0aHJvdyBuZXcgRXJyb3IoJ2NhbGxpbmcgdHJhbnNmb3JtIGRvbmUgd2hlbiB3cy5sZW5ndGggIT0gMCcpO1xuXG4gIGlmICh0cy50cmFuc2Zvcm1pbmcpIHRocm93IG5ldyBFcnJvcignY2FsbGluZyB0cmFuc2Zvcm0gZG9uZSB3aGVuIHN0aWxsIHRyYW5zZm9ybWluZycpO1xuXG4gIHJldHVybiBzdHJlYW0ucHVzaChudWxsKTtcbn0iLCIvLyBBIGJpdCBzaW1wbGVyIHRoYW4gcmVhZGFibGUgc3RyZWFtcy5cbi8vIEltcGxlbWVudCBhbiBhc3luYyAuX3dyaXRlKGNodW5rLCBlbmNvZGluZywgY2IpLCBhbmQgaXQnbGwgaGFuZGxlIGFsbFxuLy8gdGhlIGRyYWluIGV2ZW50IGVtaXNzaW9uIGFuZCBidWZmZXJpbmcuXG5cbid1c2Ugc3RyaWN0JztcblxubW9kdWxlLmV4cG9ydHMgPSBXcml0YWJsZTtcblxuLyo8cmVwbGFjZW1lbnQ+Ki9cbnZhciBwcm9jZXNzTmV4dFRpY2sgPSByZXF1aXJlKCdwcm9jZXNzLW5leHRpY2stYXJncycpO1xuLyo8L3JlcGxhY2VtZW50PiovXG5cbi8qPHJlcGxhY2VtZW50PiovXG52YXIgYXN5bmNXcml0ZSA9ICFwcm9jZXNzLmJyb3dzZXIgJiYgWyd2MC4xMCcsICd2MC45LiddLmluZGV4T2YocHJvY2Vzcy52ZXJzaW9uLnNsaWNlKDAsIDUpKSA+IC0xID8gc2V0SW1tZWRpYXRlIDogcHJvY2Vzc05leHRUaWNrO1xuLyo8L3JlcGxhY2VtZW50PiovXG5cbi8qPHJlcGxhY2VtZW50PiovXG52YXIgQnVmZmVyID0gcmVxdWlyZSgnYnVmZmVyJykuQnVmZmVyO1xuLyo8L3JlcGxhY2VtZW50PiovXG5cbldyaXRhYmxlLldyaXRhYmxlU3RhdGUgPSBXcml0YWJsZVN0YXRlO1xuXG4vKjxyZXBsYWNlbWVudD4qL1xudmFyIHV0aWwgPSByZXF1aXJlKCdjb3JlLXV0aWwtaXMnKTtcbnV0aWwuaW5oZXJpdHMgPSByZXF1aXJlKCdpbmhlcml0cycpO1xuLyo8L3JlcGxhY2VtZW50PiovXG5cbi8qPHJlcGxhY2VtZW50PiovXG52YXIgaW50ZXJuYWxVdGlsID0ge1xuICBkZXByZWNhdGU6IHJlcXVpcmUoJ3V0aWwtZGVwcmVjYXRlJylcbn07XG4vKjwvcmVwbGFjZW1lbnQ+Ki9cblxuLyo8cmVwbGFjZW1lbnQ+Ki9cbnZhciBTdHJlYW07XG4oZnVuY3Rpb24gKCkge1xuICB0cnkge1xuICAgIFN0cmVhbSA9IHJlcXVpcmUoJ3N0JyArICdyZWFtJyk7XG4gIH0gY2F0Y2ggKF8pIHt9IGZpbmFsbHkge1xuICAgIGlmICghU3RyZWFtKSBTdHJlYW0gPSByZXF1aXJlKCdldmVudHMnKS5FdmVudEVtaXR0ZXI7XG4gIH1cbn0pKCk7XG4vKjwvcmVwbGFjZW1lbnQ+Ki9cblxudmFyIEJ1ZmZlciA9IHJlcXVpcmUoJ2J1ZmZlcicpLkJ1ZmZlcjtcblxudXRpbC5pbmhlcml0cyhXcml0YWJsZSwgU3RyZWFtKTtcblxuZnVuY3Rpb24gbm9wKCkge31cblxuZnVuY3Rpb24gV3JpdGVSZXEoY2h1bmssIGVuY29kaW5nLCBjYikge1xuICB0aGlzLmNodW5rID0gY2h1bms7XG4gIHRoaXMuZW5jb2RpbmcgPSBlbmNvZGluZztcbiAgdGhpcy5jYWxsYmFjayA9IGNiO1xuICB0aGlzLm5leHQgPSBudWxsO1xufVxuXG52YXIgRHVwbGV4O1xuZnVuY3Rpb24gV3JpdGFibGVTdGF0ZShvcHRpb25zLCBzdHJlYW0pIHtcbiAgRHVwbGV4ID0gRHVwbGV4IHx8IHJlcXVpcmUoJy4vX3N0cmVhbV9kdXBsZXgnKTtcblxuICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcblxuICAvLyBvYmplY3Qgc3RyZWFtIGZsYWcgdG8gaW5kaWNhdGUgd2hldGhlciBvciBub3QgdGhpcyBzdHJlYW1cbiAgLy8gY29udGFpbnMgYnVmZmVycyBvciBvYmplY3RzLlxuICB0aGlzLm9iamVjdE1vZGUgPSAhIW9wdGlvbnMub2JqZWN0TW9kZTtcblxuICBpZiAoc3RyZWFtIGluc3RhbmNlb2YgRHVwbGV4KSB0aGlzLm9iamVjdE1vZGUgPSB0aGlzLm9iamVjdE1vZGUgfHwgISFvcHRpb25zLndyaXRhYmxlT2JqZWN0TW9kZTtcblxuICAvLyB0aGUgcG9pbnQgYXQgd2hpY2ggd3JpdGUoKSBzdGFydHMgcmV0dXJuaW5nIGZhbHNlXG4gIC8vIE5vdGU6IDAgaXMgYSB2YWxpZCB2YWx1ZSwgbWVhbnMgdGhhdCB3ZSBhbHdheXMgcmV0dXJuIGZhbHNlIGlmXG4gIC8vIHRoZSBlbnRpcmUgYnVmZmVyIGlzIG5vdCBmbHVzaGVkIGltbWVkaWF0ZWx5IG9uIHdyaXRlKClcbiAgdmFyIGh3bSA9IG9wdGlvbnMuaGlnaFdhdGVyTWFyaztcbiAgdmFyIGRlZmF1bHRId20gPSB0aGlzLm9iamVjdE1vZGUgPyAxNiA6IDE2ICogMTAyNDtcbiAgdGhpcy5oaWdoV2F0ZXJNYXJrID0gaHdtIHx8IGh3bSA9PT0gMCA/IGh3bSA6IGRlZmF1bHRId207XG5cbiAgLy8gY2FzdCB0byBpbnRzLlxuICB0aGlzLmhpZ2hXYXRlck1hcmsgPSB+IH50aGlzLmhpZ2hXYXRlck1hcms7XG5cbiAgdGhpcy5uZWVkRHJhaW4gPSBmYWxzZTtcbiAgLy8gYXQgdGhlIHN0YXJ0IG9mIGNhbGxpbmcgZW5kKClcbiAgdGhpcy5lbmRpbmcgPSBmYWxzZTtcbiAgLy8gd2hlbiBlbmQoKSBoYXMgYmVlbiBjYWxsZWQsIGFuZCByZXR1cm5lZFxuICB0aGlzLmVuZGVkID0gZmFsc2U7XG4gIC8vIHdoZW4gJ2ZpbmlzaCcgaXMgZW1pdHRlZFxuICB0aGlzLmZpbmlzaGVkID0gZmFsc2U7XG5cbiAgLy8gc2hvdWxkIHdlIGRlY29kZSBzdHJpbmdzIGludG8gYnVmZmVycyBiZWZvcmUgcGFzc2luZyB0byBfd3JpdGU/XG4gIC8vIHRoaXMgaXMgaGVyZSBzbyB0aGF0IHNvbWUgbm9kZS1jb3JlIHN0cmVhbXMgY2FuIG9wdGltaXplIHN0cmluZ1xuICAvLyBoYW5kbGluZyBhdCBhIGxvd2VyIGxldmVsLlxuICB2YXIgbm9EZWNvZGUgPSBvcHRpb25zLmRlY29kZVN0cmluZ3MgPT09IGZhbHNlO1xuICB0aGlzLmRlY29kZVN0cmluZ3MgPSAhbm9EZWNvZGU7XG5cbiAgLy8gQ3J5cHRvIGlzIGtpbmQgb2Ygb2xkIGFuZCBjcnVzdHkuICBIaXN0b3JpY2FsbHksIGl0cyBkZWZhdWx0IHN0cmluZ1xuICAvLyBlbmNvZGluZyBpcyAnYmluYXJ5JyBzbyB3ZSBoYXZlIHRvIG1ha2UgdGhpcyBjb25maWd1cmFibGUuXG4gIC8vIEV2ZXJ5dGhpbmcgZWxzZSBpbiB0aGUgdW5pdmVyc2UgdXNlcyAndXRmOCcsIHRob3VnaC5cbiAgdGhpcy5kZWZhdWx0RW5jb2RpbmcgPSBvcHRpb25zLmRlZmF1bHRFbmNvZGluZyB8fCAndXRmOCc7XG5cbiAgLy8gbm90IGFuIGFjdHVhbCBidWZmZXIgd2Uga2VlcCB0cmFjayBvZiwgYnV0IGEgbWVhc3VyZW1lbnRcbiAgLy8gb2YgaG93IG11Y2ggd2UncmUgd2FpdGluZyB0byBnZXQgcHVzaGVkIHRvIHNvbWUgdW5kZXJseWluZ1xuICAvLyBzb2NrZXQgb3IgZmlsZS5cbiAgdGhpcy5sZW5ndGggPSAwO1xuXG4gIC8vIGEgZmxhZyB0byBzZWUgd2hlbiB3ZSdyZSBpbiB0aGUgbWlkZGxlIG9mIGEgd3JpdGUuXG4gIHRoaXMud3JpdGluZyA9IGZhbHNlO1xuXG4gIC8vIHdoZW4gdHJ1ZSBhbGwgd3JpdGVzIHdpbGwgYmUgYnVmZmVyZWQgdW50aWwgLnVuY29yaygpIGNhbGxcbiAgdGhpcy5jb3JrZWQgPSAwO1xuXG4gIC8vIGEgZmxhZyB0byBiZSBhYmxlIHRvIHRlbGwgaWYgdGhlIG9ud3JpdGUgY2IgaXMgY2FsbGVkIGltbWVkaWF0ZWx5LFxuICAvLyBvciBvbiBhIGxhdGVyIHRpY2suICBXZSBzZXQgdGhpcyB0byB0cnVlIGF0IGZpcnN0LCBiZWNhdXNlIGFueVxuICAvLyBhY3Rpb25zIHRoYXQgc2hvdWxkbid0IGhhcHBlbiB1bnRpbCBcImxhdGVyXCIgc2hvdWxkIGdlbmVyYWxseSBhbHNvXG4gIC8vIG5vdCBoYXBwZW4gYmVmb3JlIHRoZSBmaXJzdCB3cml0ZSBjYWxsLlxuICB0aGlzLnN5bmMgPSB0cnVlO1xuXG4gIC8vIGEgZmxhZyB0byBrbm93IGlmIHdlJ3JlIHByb2Nlc3NpbmcgcHJldmlvdXNseSBidWZmZXJlZCBpdGVtcywgd2hpY2hcbiAgLy8gbWF5IGNhbGwgdGhlIF93cml0ZSgpIGNhbGxiYWNrIGluIHRoZSBzYW1lIHRpY2ssIHNvIHRoYXQgd2UgZG9uJ3RcbiAgLy8gZW5kIHVwIGluIGFuIG92ZXJsYXBwZWQgb253cml0ZSBzaXR1YXRpb24uXG4gIHRoaXMuYnVmZmVyUHJvY2Vzc2luZyA9IGZhbHNlO1xuXG4gIC8vIHRoZSBjYWxsYmFjayB0aGF0J3MgcGFzc2VkIHRvIF93cml0ZShjaHVuayxjYilcbiAgdGhpcy5vbndyaXRlID0gZnVuY3Rpb24gKGVyKSB7XG4gICAgb253cml0ZShzdHJlYW0sIGVyKTtcbiAgfTtcblxuICAvLyB0aGUgY2FsbGJhY2sgdGhhdCB0aGUgdXNlciBzdXBwbGllcyB0byB3cml0ZShjaHVuayxlbmNvZGluZyxjYilcbiAgdGhpcy53cml0ZWNiID0gbnVsbDtcblxuICAvLyB0aGUgYW1vdW50IHRoYXQgaXMgYmVpbmcgd3JpdHRlbiB3aGVuIF93cml0ZSBpcyBjYWxsZWQuXG4gIHRoaXMud3JpdGVsZW4gPSAwO1xuXG4gIHRoaXMuYnVmZmVyZWRSZXF1ZXN0ID0gbnVsbDtcbiAgdGhpcy5sYXN0QnVmZmVyZWRSZXF1ZXN0ID0gbnVsbDtcblxuICAvLyBudW1iZXIgb2YgcGVuZGluZyB1c2VyLXN1cHBsaWVkIHdyaXRlIGNhbGxiYWNrc1xuICAvLyB0aGlzIG11c3QgYmUgMCBiZWZvcmUgJ2ZpbmlzaCcgY2FuIGJlIGVtaXR0ZWRcbiAgdGhpcy5wZW5kaW5nY2IgPSAwO1xuXG4gIC8vIGVtaXQgcHJlZmluaXNoIGlmIHRoZSBvbmx5IHRoaW5nIHdlJ3JlIHdhaXRpbmcgZm9yIGlzIF93cml0ZSBjYnNcbiAgLy8gVGhpcyBpcyByZWxldmFudCBmb3Igc3luY2hyb25vdXMgVHJhbnNmb3JtIHN0cmVhbXNcbiAgdGhpcy5wcmVmaW5pc2hlZCA9IGZhbHNlO1xuXG4gIC8vIFRydWUgaWYgdGhlIGVycm9yIHdhcyBhbHJlYWR5IGVtaXR0ZWQgYW5kIHNob3VsZCBub3QgYmUgdGhyb3duIGFnYWluXG4gIHRoaXMuZXJyb3JFbWl0dGVkID0gZmFsc2U7XG5cbiAgLy8gY291bnQgYnVmZmVyZWQgcmVxdWVzdHNcbiAgdGhpcy5idWZmZXJlZFJlcXVlc3RDb3VudCA9IDA7XG5cbiAgLy8gY3JlYXRlIHRoZSB0d28gb2JqZWN0cyBuZWVkZWQgdG8gc3RvcmUgdGhlIGNvcmtlZCByZXF1ZXN0c1xuICAvLyB0aGV5IGFyZSBub3QgYSBsaW5rZWQgbGlzdCwgYXMgbm8gbmV3IGVsZW1lbnRzIGFyZSBpbnNlcnRlZCBpbiB0aGVyZVxuICB0aGlzLmNvcmtlZFJlcXVlc3RzRnJlZSA9IG5ldyBDb3JrZWRSZXF1ZXN0KHRoaXMpO1xuICB0aGlzLmNvcmtlZFJlcXVlc3RzRnJlZS5uZXh0ID0gbmV3IENvcmtlZFJlcXVlc3QodGhpcyk7XG59XG5cbldyaXRhYmxlU3RhdGUucHJvdG90eXBlLmdldEJ1ZmZlciA9IGZ1bmN0aW9uIHdyaXRhYmxlU3RhdGVHZXRCdWZmZXIoKSB7XG4gIHZhciBjdXJyZW50ID0gdGhpcy5idWZmZXJlZFJlcXVlc3Q7XG4gIHZhciBvdXQgPSBbXTtcbiAgd2hpbGUgKGN1cnJlbnQpIHtcbiAgICBvdXQucHVzaChjdXJyZW50KTtcbiAgICBjdXJyZW50ID0gY3VycmVudC5uZXh0O1xuICB9XG4gIHJldHVybiBvdXQ7XG59O1xuXG4oZnVuY3Rpb24gKCkge1xuICB0cnkge1xuICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShXcml0YWJsZVN0YXRlLnByb3RvdHlwZSwgJ2J1ZmZlcicsIHtcbiAgICAgIGdldDogaW50ZXJuYWxVdGlsLmRlcHJlY2F0ZShmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmdldEJ1ZmZlcigpO1xuICAgICAgfSwgJ193cml0YWJsZVN0YXRlLmJ1ZmZlciBpcyBkZXByZWNhdGVkLiBVc2UgX3dyaXRhYmxlU3RhdGUuZ2V0QnVmZmVyICcgKyAnaW5zdGVhZC4nKVxuICAgIH0pO1xuICB9IGNhdGNoIChfKSB7fVxufSkoKTtcblxudmFyIER1cGxleDtcbmZ1bmN0aW9uIFdyaXRhYmxlKG9wdGlvbnMpIHtcbiAgRHVwbGV4ID0gRHVwbGV4IHx8IHJlcXVpcmUoJy4vX3N0cmVhbV9kdXBsZXgnKTtcblxuICAvLyBXcml0YWJsZSBjdG9yIGlzIGFwcGxpZWQgdG8gRHVwbGV4ZXMsIHRob3VnaCB0aGV5J3JlIG5vdFxuICAvLyBpbnN0YW5jZW9mIFdyaXRhYmxlLCB0aGV5J3JlIGluc3RhbmNlb2YgUmVhZGFibGUuXG4gIGlmICghKHRoaXMgaW5zdGFuY2VvZiBXcml0YWJsZSkgJiYgISh0aGlzIGluc3RhbmNlb2YgRHVwbGV4KSkgcmV0dXJuIG5ldyBXcml0YWJsZShvcHRpb25zKTtcblxuICB0aGlzLl93cml0YWJsZVN0YXRlID0gbmV3IFdyaXRhYmxlU3RhdGUob3B0aW9ucywgdGhpcyk7XG5cbiAgLy8gbGVnYWN5LlxuICB0aGlzLndyaXRhYmxlID0gdHJ1ZTtcblxuICBpZiAob3B0aW9ucykge1xuICAgIGlmICh0eXBlb2Ygb3B0aW9ucy53cml0ZSA9PT0gJ2Z1bmN0aW9uJykgdGhpcy5fd3JpdGUgPSBvcHRpb25zLndyaXRlO1xuXG4gICAgaWYgKHR5cGVvZiBvcHRpb25zLndyaXRldiA9PT0gJ2Z1bmN0aW9uJykgdGhpcy5fd3JpdGV2ID0gb3B0aW9ucy53cml0ZXY7XG4gIH1cblxuICBTdHJlYW0uY2FsbCh0aGlzKTtcbn1cblxuLy8gT3RoZXJ3aXNlIHBlb3BsZSBjYW4gcGlwZSBXcml0YWJsZSBzdHJlYW1zLCB3aGljaCBpcyBqdXN0IHdyb25nLlxuV3JpdGFibGUucHJvdG90eXBlLnBpcGUgPSBmdW5jdGlvbiAoKSB7XG4gIHRoaXMuZW1pdCgnZXJyb3InLCBuZXcgRXJyb3IoJ0Nhbm5vdCBwaXBlLiBOb3QgcmVhZGFibGUuJykpO1xufTtcblxuZnVuY3Rpb24gd3JpdGVBZnRlckVuZChzdHJlYW0sIGNiKSB7XG4gIHZhciBlciA9IG5ldyBFcnJvcignd3JpdGUgYWZ0ZXIgZW5kJyk7XG4gIC8vIFRPRE86IGRlZmVyIGVycm9yIGV2ZW50cyBjb25zaXN0ZW50bHkgZXZlcnl3aGVyZSwgbm90IGp1c3QgdGhlIGNiXG4gIHN0cmVhbS5lbWl0KCdlcnJvcicsIGVyKTtcbiAgcHJvY2Vzc05leHRUaWNrKGNiLCBlcik7XG59XG5cbi8vIElmIHdlIGdldCBzb21ldGhpbmcgdGhhdCBpcyBub3QgYSBidWZmZXIsIHN0cmluZywgbnVsbCwgb3IgdW5kZWZpbmVkLFxuLy8gYW5kIHdlJ3JlIG5vdCBpbiBvYmplY3RNb2RlLCB0aGVuIHRoYXQncyBhbiBlcnJvci5cbi8vIE90aGVyd2lzZSBzdHJlYW0gY2h1bmtzIGFyZSBhbGwgY29uc2lkZXJlZCB0byBiZSBvZiBsZW5ndGg9MSwgYW5kIHRoZVxuLy8gd2F0ZXJtYXJrcyBkZXRlcm1pbmUgaG93IG1hbnkgb2JqZWN0cyB0byBrZWVwIGluIHRoZSBidWZmZXIsIHJhdGhlciB0aGFuXG4vLyBob3cgbWFueSBieXRlcyBvciBjaGFyYWN0ZXJzLlxuZnVuY3Rpb24gdmFsaWRDaHVuayhzdHJlYW0sIHN0YXRlLCBjaHVuaywgY2IpIHtcbiAgdmFyIHZhbGlkID0gdHJ1ZTtcblxuICBpZiAoIUJ1ZmZlci5pc0J1ZmZlcihjaHVuaykgJiYgdHlwZW9mIGNodW5rICE9PSAnc3RyaW5nJyAmJiBjaHVuayAhPT0gbnVsbCAmJiBjaHVuayAhPT0gdW5kZWZpbmVkICYmICFzdGF0ZS5vYmplY3RNb2RlKSB7XG4gICAgdmFyIGVyID0gbmV3IFR5cGVFcnJvcignSW52YWxpZCBub24tc3RyaW5nL2J1ZmZlciBjaHVuaycpO1xuICAgIHN0cmVhbS5lbWl0KCdlcnJvcicsIGVyKTtcbiAgICBwcm9jZXNzTmV4dFRpY2soY2IsIGVyKTtcbiAgICB2YWxpZCA9IGZhbHNlO1xuICB9XG4gIHJldHVybiB2YWxpZDtcbn1cblxuV3JpdGFibGUucHJvdG90eXBlLndyaXRlID0gZnVuY3Rpb24gKGNodW5rLCBlbmNvZGluZywgY2IpIHtcbiAgdmFyIHN0YXRlID0gdGhpcy5fd3JpdGFibGVTdGF0ZTtcbiAgdmFyIHJldCA9IGZhbHNlO1xuXG4gIGlmICh0eXBlb2YgZW5jb2RpbmcgPT09ICdmdW5jdGlvbicpIHtcbiAgICBjYiA9IGVuY29kaW5nO1xuICAgIGVuY29kaW5nID0gbnVsbDtcbiAgfVxuXG4gIGlmIChCdWZmZXIuaXNCdWZmZXIoY2h1bmspKSBlbmNvZGluZyA9ICdidWZmZXInO2Vsc2UgaWYgKCFlbmNvZGluZykgZW5jb2RpbmcgPSBzdGF0ZS5kZWZhdWx0RW5jb2Rpbmc7XG5cbiAgaWYgKHR5cGVvZiBjYiAhPT0gJ2Z1bmN0aW9uJykgY2IgPSBub3A7XG5cbiAgaWYgKHN0YXRlLmVuZGVkKSB3cml0ZUFmdGVyRW5kKHRoaXMsIGNiKTtlbHNlIGlmICh2YWxpZENodW5rKHRoaXMsIHN0YXRlLCBjaHVuaywgY2IpKSB7XG4gICAgc3RhdGUucGVuZGluZ2NiKys7XG4gICAgcmV0ID0gd3JpdGVPckJ1ZmZlcih0aGlzLCBzdGF0ZSwgY2h1bmssIGVuY29kaW5nLCBjYik7XG4gIH1cblxuICByZXR1cm4gcmV0O1xufTtcblxuV3JpdGFibGUucHJvdG90eXBlLmNvcmsgPSBmdW5jdGlvbiAoKSB7XG4gIHZhciBzdGF0ZSA9IHRoaXMuX3dyaXRhYmxlU3RhdGU7XG5cbiAgc3RhdGUuY29ya2VkKys7XG59O1xuXG5Xcml0YWJsZS5wcm90b3R5cGUudW5jb3JrID0gZnVuY3Rpb24gKCkge1xuICB2YXIgc3RhdGUgPSB0aGlzLl93cml0YWJsZVN0YXRlO1xuXG4gIGlmIChzdGF0ZS5jb3JrZWQpIHtcbiAgICBzdGF0ZS5jb3JrZWQtLTtcblxuICAgIGlmICghc3RhdGUud3JpdGluZyAmJiAhc3RhdGUuY29ya2VkICYmICFzdGF0ZS5maW5pc2hlZCAmJiAhc3RhdGUuYnVmZmVyUHJvY2Vzc2luZyAmJiBzdGF0ZS5idWZmZXJlZFJlcXVlc3QpIGNsZWFyQnVmZmVyKHRoaXMsIHN0YXRlKTtcbiAgfVxufTtcblxuV3JpdGFibGUucHJvdG90eXBlLnNldERlZmF1bHRFbmNvZGluZyA9IGZ1bmN0aW9uIHNldERlZmF1bHRFbmNvZGluZyhlbmNvZGluZykge1xuICAvLyBub2RlOjpQYXJzZUVuY29kaW5nKCkgcmVxdWlyZXMgbG93ZXIgY2FzZS5cbiAgaWYgKHR5cGVvZiBlbmNvZGluZyA9PT0gJ3N0cmluZycpIGVuY29kaW5nID0gZW5jb2RpbmcudG9Mb3dlckNhc2UoKTtcbiAgaWYgKCEoWydoZXgnLCAndXRmOCcsICd1dGYtOCcsICdhc2NpaScsICdiaW5hcnknLCAnYmFzZTY0JywgJ3VjczInLCAndWNzLTInLCAndXRmMTZsZScsICd1dGYtMTZsZScsICdyYXcnXS5pbmRleE9mKChlbmNvZGluZyArICcnKS50b0xvd2VyQ2FzZSgpKSA+IC0xKSkgdGhyb3cgbmV3IFR5cGVFcnJvcignVW5rbm93biBlbmNvZGluZzogJyArIGVuY29kaW5nKTtcbiAgdGhpcy5fd3JpdGFibGVTdGF0ZS5kZWZhdWx0RW5jb2RpbmcgPSBlbmNvZGluZztcbn07XG5cbmZ1bmN0aW9uIGRlY29kZUNodW5rKHN0YXRlLCBjaHVuaywgZW5jb2RpbmcpIHtcbiAgaWYgKCFzdGF0ZS5vYmplY3RNb2RlICYmIHN0YXRlLmRlY29kZVN0cmluZ3MgIT09IGZhbHNlICYmIHR5cGVvZiBjaHVuayA9PT0gJ3N0cmluZycpIHtcbiAgICBjaHVuayA9IG5ldyBCdWZmZXIoY2h1bmssIGVuY29kaW5nKTtcbiAgfVxuICByZXR1cm4gY2h1bms7XG59XG5cbi8vIGlmIHdlJ3JlIGFscmVhZHkgd3JpdGluZyBzb21ldGhpbmcsIHRoZW4ganVzdCBwdXQgdGhpc1xuLy8gaW4gdGhlIHF1ZXVlLCBhbmQgd2FpdCBvdXIgdHVybi4gIE90aGVyd2lzZSwgY2FsbCBfd3JpdGVcbi8vIElmIHdlIHJldHVybiBmYWxzZSwgdGhlbiB3ZSBuZWVkIGEgZHJhaW4gZXZlbnQsIHNvIHNldCB0aGF0IGZsYWcuXG5mdW5jdGlvbiB3cml0ZU9yQnVmZmVyKHN0cmVhbSwgc3RhdGUsIGNodW5rLCBlbmNvZGluZywgY2IpIHtcbiAgY2h1bmsgPSBkZWNvZGVDaHVuayhzdGF0ZSwgY2h1bmssIGVuY29kaW5nKTtcblxuICBpZiAoQnVmZmVyLmlzQnVmZmVyKGNodW5rKSkgZW5jb2RpbmcgPSAnYnVmZmVyJztcbiAgdmFyIGxlbiA9IHN0YXRlLm9iamVjdE1vZGUgPyAxIDogY2h1bmsubGVuZ3RoO1xuXG4gIHN0YXRlLmxlbmd0aCArPSBsZW47XG5cbiAgdmFyIHJldCA9IHN0YXRlLmxlbmd0aCA8IHN0YXRlLmhpZ2hXYXRlck1hcms7XG4gIC8vIHdlIG11c3QgZW5zdXJlIHRoYXQgcHJldmlvdXMgbmVlZERyYWluIHdpbGwgbm90IGJlIHJlc2V0IHRvIGZhbHNlLlxuICBpZiAoIXJldCkgc3RhdGUubmVlZERyYWluID0gdHJ1ZTtcblxuICBpZiAoc3RhdGUud3JpdGluZyB8fCBzdGF0ZS5jb3JrZWQpIHtcbiAgICB2YXIgbGFzdCA9IHN0YXRlLmxhc3RCdWZmZXJlZFJlcXVlc3Q7XG4gICAgc3RhdGUubGFzdEJ1ZmZlcmVkUmVxdWVzdCA9IG5ldyBXcml0ZVJlcShjaHVuaywgZW5jb2RpbmcsIGNiKTtcbiAgICBpZiAobGFzdCkge1xuICAgICAgbGFzdC5uZXh0ID0gc3RhdGUubGFzdEJ1ZmZlcmVkUmVxdWVzdDtcbiAgICB9IGVsc2Uge1xuICAgICAgc3RhdGUuYnVmZmVyZWRSZXF1ZXN0ID0gc3RhdGUubGFzdEJ1ZmZlcmVkUmVxdWVzdDtcbiAgICB9XG4gICAgc3RhdGUuYnVmZmVyZWRSZXF1ZXN0Q291bnQgKz0gMTtcbiAgfSBlbHNlIHtcbiAgICBkb1dyaXRlKHN0cmVhbSwgc3RhdGUsIGZhbHNlLCBsZW4sIGNodW5rLCBlbmNvZGluZywgY2IpO1xuICB9XG5cbiAgcmV0dXJuIHJldDtcbn1cblxuZnVuY3Rpb24gZG9Xcml0ZShzdHJlYW0sIHN0YXRlLCB3cml0ZXYsIGxlbiwgY2h1bmssIGVuY29kaW5nLCBjYikge1xuICBzdGF0ZS53cml0ZWxlbiA9IGxlbjtcbiAgc3RhdGUud3JpdGVjYiA9IGNiO1xuICBzdGF0ZS53cml0aW5nID0gdHJ1ZTtcbiAgc3RhdGUuc3luYyA9IHRydWU7XG4gIGlmICh3cml0ZXYpIHN0cmVhbS5fd3JpdGV2KGNodW5rLCBzdGF0ZS5vbndyaXRlKTtlbHNlIHN0cmVhbS5fd3JpdGUoY2h1bmssIGVuY29kaW5nLCBzdGF0ZS5vbndyaXRlKTtcbiAgc3RhdGUuc3luYyA9IGZhbHNlO1xufVxuXG5mdW5jdGlvbiBvbndyaXRlRXJyb3Ioc3RyZWFtLCBzdGF0ZSwgc3luYywgZXIsIGNiKSB7XG4gIC0tc3RhdGUucGVuZGluZ2NiO1xuICBpZiAoc3luYykgcHJvY2Vzc05leHRUaWNrKGNiLCBlcik7ZWxzZSBjYihlcik7XG5cbiAgc3RyZWFtLl93cml0YWJsZVN0YXRlLmVycm9yRW1pdHRlZCA9IHRydWU7XG4gIHN0cmVhbS5lbWl0KCdlcnJvcicsIGVyKTtcbn1cblxuZnVuY3Rpb24gb253cml0ZVN0YXRlVXBkYXRlKHN0YXRlKSB7XG4gIHN0YXRlLndyaXRpbmcgPSBmYWxzZTtcbiAgc3RhdGUud3JpdGVjYiA9IG51bGw7XG4gIHN0YXRlLmxlbmd0aCAtPSBzdGF0ZS53cml0ZWxlbjtcbiAgc3RhdGUud3JpdGVsZW4gPSAwO1xufVxuXG5mdW5jdGlvbiBvbndyaXRlKHN0cmVhbSwgZXIpIHtcbiAgdmFyIHN0YXRlID0gc3RyZWFtLl93cml0YWJsZVN0YXRlO1xuICB2YXIgc3luYyA9IHN0YXRlLnN5bmM7XG4gIHZhciBjYiA9IHN0YXRlLndyaXRlY2I7XG5cbiAgb253cml0ZVN0YXRlVXBkYXRlKHN0YXRlKTtcblxuICBpZiAoZXIpIG9ud3JpdGVFcnJvcihzdHJlYW0sIHN0YXRlLCBzeW5jLCBlciwgY2IpO2Vsc2Uge1xuICAgIC8vIENoZWNrIGlmIHdlJ3JlIGFjdHVhbGx5IHJlYWR5IHRvIGZpbmlzaCwgYnV0IGRvbid0IGVtaXQgeWV0XG4gICAgdmFyIGZpbmlzaGVkID0gbmVlZEZpbmlzaChzdGF0ZSk7XG5cbiAgICBpZiAoIWZpbmlzaGVkICYmICFzdGF0ZS5jb3JrZWQgJiYgIXN0YXRlLmJ1ZmZlclByb2Nlc3NpbmcgJiYgc3RhdGUuYnVmZmVyZWRSZXF1ZXN0KSB7XG4gICAgICBjbGVhckJ1ZmZlcihzdHJlYW0sIHN0YXRlKTtcbiAgICB9XG5cbiAgICBpZiAoc3luYykge1xuICAgICAgLyo8cmVwbGFjZW1lbnQ+Ki9cbiAgICAgIGFzeW5jV3JpdGUoYWZ0ZXJXcml0ZSwgc3RyZWFtLCBzdGF0ZSwgZmluaXNoZWQsIGNiKTtcbiAgICAgIC8qPC9yZXBsYWNlbWVudD4qL1xuICAgIH0gZWxzZSB7XG4gICAgICAgIGFmdGVyV3JpdGUoc3RyZWFtLCBzdGF0ZSwgZmluaXNoZWQsIGNiKTtcbiAgICAgIH1cbiAgfVxufVxuXG5mdW5jdGlvbiBhZnRlcldyaXRlKHN0cmVhbSwgc3RhdGUsIGZpbmlzaGVkLCBjYikge1xuICBpZiAoIWZpbmlzaGVkKSBvbndyaXRlRHJhaW4oc3RyZWFtLCBzdGF0ZSk7XG4gIHN0YXRlLnBlbmRpbmdjYi0tO1xuICBjYigpO1xuICBmaW5pc2hNYXliZShzdHJlYW0sIHN0YXRlKTtcbn1cblxuLy8gTXVzdCBmb3JjZSBjYWxsYmFjayB0byBiZSBjYWxsZWQgb24gbmV4dFRpY2ssIHNvIHRoYXQgd2UgZG9uJ3Rcbi8vIGVtaXQgJ2RyYWluJyBiZWZvcmUgdGhlIHdyaXRlKCkgY29uc3VtZXIgZ2V0cyB0aGUgJ2ZhbHNlJyByZXR1cm5cbi8vIHZhbHVlLCBhbmQgaGFzIGEgY2hhbmNlIHRvIGF0dGFjaCBhICdkcmFpbicgbGlzdGVuZXIuXG5mdW5jdGlvbiBvbndyaXRlRHJhaW4oc3RyZWFtLCBzdGF0ZSkge1xuICBpZiAoc3RhdGUubGVuZ3RoID09PSAwICYmIHN0YXRlLm5lZWREcmFpbikge1xuICAgIHN0YXRlLm5lZWREcmFpbiA9IGZhbHNlO1xuICAgIHN0cmVhbS5lbWl0KCdkcmFpbicpO1xuICB9XG59XG5cbi8vIGlmIHRoZXJlJ3Mgc29tZXRoaW5nIGluIHRoZSBidWZmZXIgd2FpdGluZywgdGhlbiBwcm9jZXNzIGl0XG5mdW5jdGlvbiBjbGVhckJ1ZmZlcihzdHJlYW0sIHN0YXRlKSB7XG4gIHN0YXRlLmJ1ZmZlclByb2Nlc3NpbmcgPSB0cnVlO1xuICB2YXIgZW50cnkgPSBzdGF0ZS5idWZmZXJlZFJlcXVlc3Q7XG5cbiAgaWYgKHN0cmVhbS5fd3JpdGV2ICYmIGVudHJ5ICYmIGVudHJ5Lm5leHQpIHtcbiAgICAvLyBGYXN0IGNhc2UsIHdyaXRlIGV2ZXJ5dGhpbmcgdXNpbmcgX3dyaXRldigpXG4gICAgdmFyIGwgPSBzdGF0ZS5idWZmZXJlZFJlcXVlc3RDb3VudDtcbiAgICB2YXIgYnVmZmVyID0gbmV3IEFycmF5KGwpO1xuICAgIHZhciBob2xkZXIgPSBzdGF0ZS5jb3JrZWRSZXF1ZXN0c0ZyZWU7XG4gICAgaG9sZGVyLmVudHJ5ID0gZW50cnk7XG5cbiAgICB2YXIgY291bnQgPSAwO1xuICAgIHdoaWxlIChlbnRyeSkge1xuICAgICAgYnVmZmVyW2NvdW50XSA9IGVudHJ5O1xuICAgICAgZW50cnkgPSBlbnRyeS5uZXh0O1xuICAgICAgY291bnQgKz0gMTtcbiAgICB9XG5cbiAgICBkb1dyaXRlKHN0cmVhbSwgc3RhdGUsIHRydWUsIHN0YXRlLmxlbmd0aCwgYnVmZmVyLCAnJywgaG9sZGVyLmZpbmlzaCk7XG5cbiAgICAvLyBkb1dyaXRlIGlzIGFsd2F5cyBhc3luYywgZGVmZXIgdGhlc2UgdG8gc2F2ZSBhIGJpdCBvZiB0aW1lXG4gICAgLy8gYXMgdGhlIGhvdCBwYXRoIGVuZHMgd2l0aCBkb1dyaXRlXG4gICAgc3RhdGUucGVuZGluZ2NiKys7XG4gICAgc3RhdGUubGFzdEJ1ZmZlcmVkUmVxdWVzdCA9IG51bGw7XG4gICAgc3RhdGUuY29ya2VkUmVxdWVzdHNGcmVlID0gaG9sZGVyLm5leHQ7XG4gICAgaG9sZGVyLm5leHQgPSBudWxsO1xuICB9IGVsc2Uge1xuICAgIC8vIFNsb3cgY2FzZSwgd3JpdGUgY2h1bmtzIG9uZS1ieS1vbmVcbiAgICB3aGlsZSAoZW50cnkpIHtcbiAgICAgIHZhciBjaHVuayA9IGVudHJ5LmNodW5rO1xuICAgICAgdmFyIGVuY29kaW5nID0gZW50cnkuZW5jb2Rpbmc7XG4gICAgICB2YXIgY2IgPSBlbnRyeS5jYWxsYmFjaztcbiAgICAgIHZhciBsZW4gPSBzdGF0ZS5vYmplY3RNb2RlID8gMSA6IGNodW5rLmxlbmd0aDtcblxuICAgICAgZG9Xcml0ZShzdHJlYW0sIHN0YXRlLCBmYWxzZSwgbGVuLCBjaHVuaywgZW5jb2RpbmcsIGNiKTtcbiAgICAgIGVudHJ5ID0gZW50cnkubmV4dDtcbiAgICAgIC8vIGlmIHdlIGRpZG4ndCBjYWxsIHRoZSBvbndyaXRlIGltbWVkaWF0ZWx5LCB0aGVuXG4gICAgICAvLyBpdCBtZWFucyB0aGF0IHdlIG5lZWQgdG8gd2FpdCB1bnRpbCBpdCBkb2VzLlxuICAgICAgLy8gYWxzbywgdGhhdCBtZWFucyB0aGF0IHRoZSBjaHVuayBhbmQgY2IgYXJlIGN1cnJlbnRseVxuICAgICAgLy8gYmVpbmcgcHJvY2Vzc2VkLCBzbyBtb3ZlIHRoZSBidWZmZXIgY291bnRlciBwYXN0IHRoZW0uXG4gICAgICBpZiAoc3RhdGUud3JpdGluZykge1xuICAgICAgICBicmVhaztcbiAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAoZW50cnkgPT09IG51bGwpIHN0YXRlLmxhc3RCdWZmZXJlZFJlcXVlc3QgPSBudWxsO1xuICB9XG5cbiAgc3RhdGUuYnVmZmVyZWRSZXF1ZXN0Q291bnQgPSAwO1xuICBzdGF0ZS5idWZmZXJlZFJlcXVlc3QgPSBlbnRyeTtcbiAgc3RhdGUuYnVmZmVyUHJvY2Vzc2luZyA9IGZhbHNlO1xufVxuXG5Xcml0YWJsZS5wcm90b3R5cGUuX3dyaXRlID0gZnVuY3Rpb24gKGNodW5rLCBlbmNvZGluZywgY2IpIHtcbiAgY2IobmV3IEVycm9yKCdub3QgaW1wbGVtZW50ZWQnKSk7XG59O1xuXG5Xcml0YWJsZS5wcm90b3R5cGUuX3dyaXRldiA9IG51bGw7XG5cbldyaXRhYmxlLnByb3RvdHlwZS5lbmQgPSBmdW5jdGlvbiAoY2h1bmssIGVuY29kaW5nLCBjYikge1xuICB2YXIgc3RhdGUgPSB0aGlzLl93cml0YWJsZVN0YXRlO1xuXG4gIGlmICh0eXBlb2YgY2h1bmsgPT09ICdmdW5jdGlvbicpIHtcbiAgICBjYiA9IGNodW5rO1xuICAgIGNodW5rID0gbnVsbDtcbiAgICBlbmNvZGluZyA9IG51bGw7XG4gIH0gZWxzZSBpZiAodHlwZW9mIGVuY29kaW5nID09PSAnZnVuY3Rpb24nKSB7XG4gICAgY2IgPSBlbmNvZGluZztcbiAgICBlbmNvZGluZyA9IG51bGw7XG4gIH1cblxuICBpZiAoY2h1bmsgIT09IG51bGwgJiYgY2h1bmsgIT09IHVuZGVmaW5lZCkgdGhpcy53cml0ZShjaHVuaywgZW5jb2RpbmcpO1xuXG4gIC8vIC5lbmQoKSBmdWxseSB1bmNvcmtzXG4gIGlmIChzdGF0ZS5jb3JrZWQpIHtcbiAgICBzdGF0ZS5jb3JrZWQgPSAxO1xuICAgIHRoaXMudW5jb3JrKCk7XG4gIH1cblxuICAvLyBpZ25vcmUgdW5uZWNlc3NhcnkgZW5kKCkgY2FsbHMuXG4gIGlmICghc3RhdGUuZW5kaW5nICYmICFzdGF0ZS5maW5pc2hlZCkgZW5kV3JpdGFibGUodGhpcywgc3RhdGUsIGNiKTtcbn07XG5cbmZ1bmN0aW9uIG5lZWRGaW5pc2goc3RhdGUpIHtcbiAgcmV0dXJuIHN0YXRlLmVuZGluZyAmJiBzdGF0ZS5sZW5ndGggPT09IDAgJiYgc3RhdGUuYnVmZmVyZWRSZXF1ZXN0ID09PSBudWxsICYmICFzdGF0ZS5maW5pc2hlZCAmJiAhc3RhdGUud3JpdGluZztcbn1cblxuZnVuY3Rpb24gcHJlZmluaXNoKHN0cmVhbSwgc3RhdGUpIHtcbiAgaWYgKCFzdGF0ZS5wcmVmaW5pc2hlZCkge1xuICAgIHN0YXRlLnByZWZpbmlzaGVkID0gdHJ1ZTtcbiAgICBzdHJlYW0uZW1pdCgncHJlZmluaXNoJyk7XG4gIH1cbn1cblxuZnVuY3Rpb24gZmluaXNoTWF5YmUoc3RyZWFtLCBzdGF0ZSkge1xuICB2YXIgbmVlZCA9IG5lZWRGaW5pc2goc3RhdGUpO1xuICBpZiAobmVlZCkge1xuICAgIGlmIChzdGF0ZS5wZW5kaW5nY2IgPT09IDApIHtcbiAgICAgIHByZWZpbmlzaChzdHJlYW0sIHN0YXRlKTtcbiAgICAgIHN0YXRlLmZpbmlzaGVkID0gdHJ1ZTtcbiAgICAgIHN0cmVhbS5lbWl0KCdmaW5pc2gnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcHJlZmluaXNoKHN0cmVhbSwgc3RhdGUpO1xuICAgIH1cbiAgfVxuICByZXR1cm4gbmVlZDtcbn1cblxuZnVuY3Rpb24gZW5kV3JpdGFibGUoc3RyZWFtLCBzdGF0ZSwgY2IpIHtcbiAgc3RhdGUuZW5kaW5nID0gdHJ1ZTtcbiAgZmluaXNoTWF5YmUoc3RyZWFtLCBzdGF0ZSk7XG4gIGlmIChjYikge1xuICAgIGlmIChzdGF0ZS5maW5pc2hlZCkgcHJvY2Vzc05leHRUaWNrKGNiKTtlbHNlIHN0cmVhbS5vbmNlKCdmaW5pc2gnLCBjYik7XG4gIH1cbiAgc3RhdGUuZW5kZWQgPSB0cnVlO1xuICBzdHJlYW0ud3JpdGFibGUgPSBmYWxzZTtcbn1cblxuLy8gSXQgc2VlbXMgYSBsaW5rZWQgbGlzdCBidXQgaXQgaXMgbm90XG4vLyB0aGVyZSB3aWxsIGJlIG9ubHkgMiBvZiB0aGVzZSBmb3IgZWFjaCBzdHJlYW1cbmZ1bmN0aW9uIENvcmtlZFJlcXVlc3Qoc3RhdGUpIHtcbiAgdmFyIF90aGlzID0gdGhpcztcblxuICB0aGlzLm5leHQgPSBudWxsO1xuICB0aGlzLmVudHJ5ID0gbnVsbDtcblxuICB0aGlzLmZpbmlzaCA9IGZ1bmN0aW9uIChlcnIpIHtcbiAgICB2YXIgZW50cnkgPSBfdGhpcy5lbnRyeTtcbiAgICBfdGhpcy5lbnRyeSA9IG51bGw7XG4gICAgd2hpbGUgKGVudHJ5KSB7XG4gICAgICB2YXIgY2IgPSBlbnRyeS5jYWxsYmFjaztcbiAgICAgIHN0YXRlLnBlbmRpbmdjYi0tO1xuICAgICAgY2IoZXJyKTtcbiAgICAgIGVudHJ5ID0gZW50cnkubmV4dDtcbiAgICB9XG4gICAgaWYgKHN0YXRlLmNvcmtlZFJlcXVlc3RzRnJlZSkge1xuICAgICAgc3RhdGUuY29ya2VkUmVxdWVzdHNGcmVlLm5leHQgPSBfdGhpcztcbiAgICB9IGVsc2Uge1xuICAgICAgc3RhdGUuY29ya2VkUmVxdWVzdHNGcmVlID0gX3RoaXM7XG4gICAgfVxuICB9O1xufSIsInZhciBTdHJlYW0gPSAoZnVuY3Rpb24gKCl7XG4gIHRyeSB7XG4gICAgcmV0dXJuIHJlcXVpcmUoJ3N0JyArICdyZWFtJyk7IC8vIGhhY2sgdG8gZml4IGEgY2lyY3VsYXIgZGVwZW5kZW5jeSBpc3N1ZSB3aGVuIHVzZWQgd2l0aCBicm93c2VyaWZ5XG4gIH0gY2F0Y2goXyl7fVxufSgpKTtcbmV4cG9ydHMgPSBtb2R1bGUuZXhwb3J0cyA9IHJlcXVpcmUoJy4vbGliL19zdHJlYW1fcmVhZGFibGUuanMnKTtcbmV4cG9ydHMuU3RyZWFtID0gU3RyZWFtIHx8IGV4cG9ydHM7XG5leHBvcnRzLlJlYWRhYmxlID0gZXhwb3J0cztcbmV4cG9ydHMuV3JpdGFibGUgPSByZXF1aXJlKCcuL2xpYi9fc3RyZWFtX3dyaXRhYmxlLmpzJyk7XG5leHBvcnRzLkR1cGxleCA9IHJlcXVpcmUoJy4vbGliL19zdHJlYW1fZHVwbGV4LmpzJyk7XG5leHBvcnRzLlRyYW5zZm9ybSA9IHJlcXVpcmUoJy4vbGliL19zdHJlYW1fdHJhbnNmb3JtLmpzJyk7XG5leHBvcnRzLlBhc3NUaHJvdWdoID0gcmVxdWlyZSgnLi9saWIvX3N0cmVhbV9wYXNzdGhyb3VnaC5qcycpO1xuIiwiLy8gQ29weXJpZ2h0IEpveWVudCwgSW5jLiBhbmQgb3RoZXIgTm9kZSBjb250cmlidXRvcnMuXG4vL1xuLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGFcbi8vIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGVcbi8vIFwiU29mdHdhcmVcIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZ1xuLy8gd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLFxuLy8gZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdFxuLy8gcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlXG4vLyBmb2xsb3dpbmcgY29uZGl0aW9uczpcbi8vXG4vLyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZFxuLy8gaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4vL1xuLy8gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTU1xuLy8gT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRlxuLy8gTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTlxuLy8gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sXG4vLyBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1Jcbi8vIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEVcbi8vIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuXG5cbnZhciBCdWZmZXIgPSByZXF1aXJlKCdidWZmZXInKS5CdWZmZXI7XG5cbnZhciBpc0J1ZmZlckVuY29kaW5nID0gQnVmZmVyLmlzRW5jb2RpbmdcbiAgfHwgZnVuY3Rpb24oZW5jb2RpbmcpIHtcbiAgICAgICBzd2l0Y2ggKGVuY29kaW5nICYmIGVuY29kaW5nLnRvTG93ZXJDYXNlKCkpIHtcbiAgICAgICAgIGNhc2UgJ2hleCc6IGNhc2UgJ3V0ZjgnOiBjYXNlICd1dGYtOCc6IGNhc2UgJ2FzY2lpJzogY2FzZSAnYmluYXJ5JzogY2FzZSAnYmFzZTY0JzogY2FzZSAndWNzMic6IGNhc2UgJ3Vjcy0yJzogY2FzZSAndXRmMTZsZSc6IGNhc2UgJ3V0Zi0xNmxlJzogY2FzZSAncmF3JzogcmV0dXJuIHRydWU7XG4gICAgICAgICBkZWZhdWx0OiByZXR1cm4gZmFsc2U7XG4gICAgICAgfVxuICAgICB9XG5cblxuZnVuY3Rpb24gYXNzZXJ0RW5jb2RpbmcoZW5jb2RpbmcpIHtcbiAgaWYgKGVuY29kaW5nICYmICFpc0J1ZmZlckVuY29kaW5nKGVuY29kaW5nKSkge1xuICAgIHRocm93IG5ldyBFcnJvcignVW5rbm93biBlbmNvZGluZzogJyArIGVuY29kaW5nKTtcbiAgfVxufVxuXG4vLyBTdHJpbmdEZWNvZGVyIHByb3ZpZGVzIGFuIGludGVyZmFjZSBmb3IgZWZmaWNpZW50bHkgc3BsaXR0aW5nIGEgc2VyaWVzIG9mXG4vLyBidWZmZXJzIGludG8gYSBzZXJpZXMgb2YgSlMgc3RyaW5ncyB3aXRob3V0IGJyZWFraW5nIGFwYXJ0IG11bHRpLWJ5dGVcbi8vIGNoYXJhY3RlcnMuIENFU1UtOCBpcyBoYW5kbGVkIGFzIHBhcnQgb2YgdGhlIFVURi04IGVuY29kaW5nLlxuLy9cbi8vIEBUT0RPIEhhbmRsaW5nIGFsbCBlbmNvZGluZ3MgaW5zaWRlIGEgc2luZ2xlIG9iamVjdCBtYWtlcyBpdCB2ZXJ5IGRpZmZpY3VsdFxuLy8gdG8gcmVhc29uIGFib3V0IHRoaXMgY29kZSwgc28gaXQgc2hvdWxkIGJlIHNwbGl0IHVwIGluIHRoZSBmdXR1cmUuXG4vLyBAVE9ETyBUaGVyZSBzaG91bGQgYmUgYSB1dGY4LXN0cmljdCBlbmNvZGluZyB0aGF0IHJlamVjdHMgaW52YWxpZCBVVEYtOCBjb2RlXG4vLyBwb2ludHMgYXMgdXNlZCBieSBDRVNVLTguXG52YXIgU3RyaW5nRGVjb2RlciA9IGV4cG9ydHMuU3RyaW5nRGVjb2RlciA9IGZ1bmN0aW9uKGVuY29kaW5nKSB7XG4gIHRoaXMuZW5jb2RpbmcgPSAoZW5jb2RpbmcgfHwgJ3V0ZjgnKS50b0xvd2VyQ2FzZSgpLnJlcGxhY2UoL1stX10vLCAnJyk7XG4gIGFzc2VydEVuY29kaW5nKGVuY29kaW5nKTtcbiAgc3dpdGNoICh0aGlzLmVuY29kaW5nKSB7XG4gICAgY2FzZSAndXRmOCc6XG4gICAgICAvLyBDRVNVLTggcmVwcmVzZW50cyBlYWNoIG9mIFN1cnJvZ2F0ZSBQYWlyIGJ5IDMtYnl0ZXNcbiAgICAgIHRoaXMuc3Vycm9nYXRlU2l6ZSA9IDM7XG4gICAgICBicmVhaztcbiAgICBjYXNlICd1Y3MyJzpcbiAgICBjYXNlICd1dGYxNmxlJzpcbiAgICAgIC8vIFVURi0xNiByZXByZXNlbnRzIGVhY2ggb2YgU3Vycm9nYXRlIFBhaXIgYnkgMi1ieXRlc1xuICAgICAgdGhpcy5zdXJyb2dhdGVTaXplID0gMjtcbiAgICAgIHRoaXMuZGV0ZWN0SW5jb21wbGV0ZUNoYXIgPSB1dGYxNkRldGVjdEluY29tcGxldGVDaGFyO1xuICAgICAgYnJlYWs7XG4gICAgY2FzZSAnYmFzZTY0JzpcbiAgICAgIC8vIEJhc2UtNjQgc3RvcmVzIDMgYnl0ZXMgaW4gNCBjaGFycywgYW5kIHBhZHMgdGhlIHJlbWFpbmRlci5cbiAgICAgIHRoaXMuc3Vycm9nYXRlU2l6ZSA9IDM7XG4gICAgICB0aGlzLmRldGVjdEluY29tcGxldGVDaGFyID0gYmFzZTY0RGV0ZWN0SW5jb21wbGV0ZUNoYXI7XG4gICAgICBicmVhaztcbiAgICBkZWZhdWx0OlxuICAgICAgdGhpcy53cml0ZSA9IHBhc3NUaHJvdWdoV3JpdGU7XG4gICAgICByZXR1cm47XG4gIH1cblxuICAvLyBFbm91Z2ggc3BhY2UgdG8gc3RvcmUgYWxsIGJ5dGVzIG9mIGEgc2luZ2xlIGNoYXJhY3Rlci4gVVRGLTggbmVlZHMgNFxuICAvLyBieXRlcywgYnV0IENFU1UtOCBtYXkgcmVxdWlyZSB1cCB0byA2ICgzIGJ5dGVzIHBlciBzdXJyb2dhdGUpLlxuICB0aGlzLmNoYXJCdWZmZXIgPSBuZXcgQnVmZmVyKDYpO1xuICAvLyBOdW1iZXIgb2YgYnl0ZXMgcmVjZWl2ZWQgZm9yIHRoZSBjdXJyZW50IGluY29tcGxldGUgbXVsdGktYnl0ZSBjaGFyYWN0ZXIuXG4gIHRoaXMuY2hhclJlY2VpdmVkID0gMDtcbiAgLy8gTnVtYmVyIG9mIGJ5dGVzIGV4cGVjdGVkIGZvciB0aGUgY3VycmVudCBpbmNvbXBsZXRlIG11bHRpLWJ5dGUgY2hhcmFjdGVyLlxuICB0aGlzLmNoYXJMZW5ndGggPSAwO1xufTtcblxuXG4vLyB3cml0ZSBkZWNvZGVzIHRoZSBnaXZlbiBidWZmZXIgYW5kIHJldHVybnMgaXQgYXMgSlMgc3RyaW5nIHRoYXQgaXNcbi8vIGd1YXJhbnRlZWQgdG8gbm90IGNvbnRhaW4gYW55IHBhcnRpYWwgbXVsdGktYnl0ZSBjaGFyYWN0ZXJzLiBBbnkgcGFydGlhbFxuLy8gY2hhcmFjdGVyIGZvdW5kIGF0IHRoZSBlbmQgb2YgdGhlIGJ1ZmZlciBpcyBidWZmZXJlZCB1cCwgYW5kIHdpbGwgYmVcbi8vIHJldHVybmVkIHdoZW4gY2FsbGluZyB3cml0ZSBhZ2FpbiB3aXRoIHRoZSByZW1haW5pbmcgYnl0ZXMuXG4vL1xuLy8gTm90ZTogQ29udmVydGluZyBhIEJ1ZmZlciBjb250YWluaW5nIGFuIG9ycGhhbiBzdXJyb2dhdGUgdG8gYSBTdHJpbmdcbi8vIGN1cnJlbnRseSB3b3JrcywgYnV0IGNvbnZlcnRpbmcgYSBTdHJpbmcgdG8gYSBCdWZmZXIgKHZpYSBgbmV3IEJ1ZmZlcmAsIG9yXG4vLyBCdWZmZXIjd3JpdGUpIHdpbGwgcmVwbGFjZSBpbmNvbXBsZXRlIHN1cnJvZ2F0ZXMgd2l0aCB0aGUgdW5pY29kZVxuLy8gcmVwbGFjZW1lbnQgY2hhcmFjdGVyLiBTZWUgaHR0cHM6Ly9jb2RlcmV2aWV3LmNocm9taXVtLm9yZy8xMjExNzMwMDkvIC5cblN0cmluZ0RlY29kZXIucHJvdG90eXBlLndyaXRlID0gZnVuY3Rpb24oYnVmZmVyKSB7XG4gIHZhciBjaGFyU3RyID0gJyc7XG4gIC8vIGlmIG91ciBsYXN0IHdyaXRlIGVuZGVkIHdpdGggYW4gaW5jb21wbGV0ZSBtdWx0aWJ5dGUgY2hhcmFjdGVyXG4gIHdoaWxlICh0aGlzLmNoYXJMZW5ndGgpIHtcbiAgICAvLyBkZXRlcm1pbmUgaG93IG1hbnkgcmVtYWluaW5nIGJ5dGVzIHRoaXMgYnVmZmVyIGhhcyB0byBvZmZlciBmb3IgdGhpcyBjaGFyXG4gICAgdmFyIGF2YWlsYWJsZSA9IChidWZmZXIubGVuZ3RoID49IHRoaXMuY2hhckxlbmd0aCAtIHRoaXMuY2hhclJlY2VpdmVkKSA/XG4gICAgICAgIHRoaXMuY2hhckxlbmd0aCAtIHRoaXMuY2hhclJlY2VpdmVkIDpcbiAgICAgICAgYnVmZmVyLmxlbmd0aDtcblxuICAgIC8vIGFkZCB0aGUgbmV3IGJ5dGVzIHRvIHRoZSBjaGFyIGJ1ZmZlclxuICAgIGJ1ZmZlci5jb3B5KHRoaXMuY2hhckJ1ZmZlciwgdGhpcy5jaGFyUmVjZWl2ZWQsIDAsIGF2YWlsYWJsZSk7XG4gICAgdGhpcy5jaGFyUmVjZWl2ZWQgKz0gYXZhaWxhYmxlO1xuXG4gICAgaWYgKHRoaXMuY2hhclJlY2VpdmVkIDwgdGhpcy5jaGFyTGVuZ3RoKSB7XG4gICAgICAvLyBzdGlsbCBub3QgZW5vdWdoIGNoYXJzIGluIHRoaXMgYnVmZmVyPyB3YWl0IGZvciBtb3JlIC4uLlxuICAgICAgcmV0dXJuICcnO1xuICAgIH1cblxuICAgIC8vIHJlbW92ZSBieXRlcyBiZWxvbmdpbmcgdG8gdGhlIGN1cnJlbnQgY2hhcmFjdGVyIGZyb20gdGhlIGJ1ZmZlclxuICAgIGJ1ZmZlciA9IGJ1ZmZlci5zbGljZShhdmFpbGFibGUsIGJ1ZmZlci5sZW5ndGgpO1xuXG4gICAgLy8gZ2V0IHRoZSBjaGFyYWN0ZXIgdGhhdCB3YXMgc3BsaXRcbiAgICBjaGFyU3RyID0gdGhpcy5jaGFyQnVmZmVyLnNsaWNlKDAsIHRoaXMuY2hhckxlbmd0aCkudG9TdHJpbmcodGhpcy5lbmNvZGluZyk7XG5cbiAgICAvLyBDRVNVLTg6IGxlYWQgc3Vycm9nYXRlIChEODAwLURCRkYpIGlzIGFsc28gdGhlIGluY29tcGxldGUgY2hhcmFjdGVyXG4gICAgdmFyIGNoYXJDb2RlID0gY2hhclN0ci5jaGFyQ29kZUF0KGNoYXJTdHIubGVuZ3RoIC0gMSk7XG4gICAgaWYgKGNoYXJDb2RlID49IDB4RDgwMCAmJiBjaGFyQ29kZSA8PSAweERCRkYpIHtcbiAgICAgIHRoaXMuY2hhckxlbmd0aCArPSB0aGlzLnN1cnJvZ2F0ZVNpemU7XG4gICAgICBjaGFyU3RyID0gJyc7XG4gICAgICBjb250aW51ZTtcbiAgICB9XG4gICAgdGhpcy5jaGFyUmVjZWl2ZWQgPSB0aGlzLmNoYXJMZW5ndGggPSAwO1xuXG4gICAgLy8gaWYgdGhlcmUgYXJlIG5vIG1vcmUgYnl0ZXMgaW4gdGhpcyBidWZmZXIsIGp1c3QgZW1pdCBvdXIgY2hhclxuICAgIGlmIChidWZmZXIubGVuZ3RoID09PSAwKSB7XG4gICAgICByZXR1cm4gY2hhclN0cjtcbiAgICB9XG4gICAgYnJlYWs7XG4gIH1cblxuICAvLyBkZXRlcm1pbmUgYW5kIHNldCBjaGFyTGVuZ3RoIC8gY2hhclJlY2VpdmVkXG4gIHRoaXMuZGV0ZWN0SW5jb21wbGV0ZUNoYXIoYnVmZmVyKTtcblxuICB2YXIgZW5kID0gYnVmZmVyLmxlbmd0aDtcbiAgaWYgKHRoaXMuY2hhckxlbmd0aCkge1xuICAgIC8vIGJ1ZmZlciB0aGUgaW5jb21wbGV0ZSBjaGFyYWN0ZXIgYnl0ZXMgd2UgZ290XG4gICAgYnVmZmVyLmNvcHkodGhpcy5jaGFyQnVmZmVyLCAwLCBidWZmZXIubGVuZ3RoIC0gdGhpcy5jaGFyUmVjZWl2ZWQsIGVuZCk7XG4gICAgZW5kIC09IHRoaXMuY2hhclJlY2VpdmVkO1xuICB9XG5cbiAgY2hhclN0ciArPSBidWZmZXIudG9TdHJpbmcodGhpcy5lbmNvZGluZywgMCwgZW5kKTtcblxuICB2YXIgZW5kID0gY2hhclN0ci5sZW5ndGggLSAxO1xuICB2YXIgY2hhckNvZGUgPSBjaGFyU3RyLmNoYXJDb2RlQXQoZW5kKTtcbiAgLy8gQ0VTVS04OiBsZWFkIHN1cnJvZ2F0ZSAoRDgwMC1EQkZGKSBpcyBhbHNvIHRoZSBpbmNvbXBsZXRlIGNoYXJhY3RlclxuICBpZiAoY2hhckNvZGUgPj0gMHhEODAwICYmIGNoYXJDb2RlIDw9IDB4REJGRikge1xuICAgIHZhciBzaXplID0gdGhpcy5zdXJyb2dhdGVTaXplO1xuICAgIHRoaXMuY2hhckxlbmd0aCArPSBzaXplO1xuICAgIHRoaXMuY2hhclJlY2VpdmVkICs9IHNpemU7XG4gICAgdGhpcy5jaGFyQnVmZmVyLmNvcHkodGhpcy5jaGFyQnVmZmVyLCBzaXplLCAwLCBzaXplKTtcbiAgICBidWZmZXIuY29weSh0aGlzLmNoYXJCdWZmZXIsIDAsIDAsIHNpemUpO1xuICAgIHJldHVybiBjaGFyU3RyLnN1YnN0cmluZygwLCBlbmQpO1xuICB9XG5cbiAgLy8gb3IganVzdCBlbWl0IHRoZSBjaGFyU3RyXG4gIHJldHVybiBjaGFyU3RyO1xufTtcblxuLy8gZGV0ZWN0SW5jb21wbGV0ZUNoYXIgZGV0ZXJtaW5lcyBpZiB0aGVyZSBpcyBhbiBpbmNvbXBsZXRlIFVURi04IGNoYXJhY3RlciBhdFxuLy8gdGhlIGVuZCBvZiB0aGUgZ2l2ZW4gYnVmZmVyLiBJZiBzbywgaXQgc2V0cyB0aGlzLmNoYXJMZW5ndGggdG8gdGhlIGJ5dGVcbi8vIGxlbmd0aCB0aGF0IGNoYXJhY3RlciwgYW5kIHNldHMgdGhpcy5jaGFyUmVjZWl2ZWQgdG8gdGhlIG51bWJlciBvZiBieXRlc1xuLy8gdGhhdCBhcmUgYXZhaWxhYmxlIGZvciB0aGlzIGNoYXJhY3Rlci5cblN0cmluZ0RlY29kZXIucHJvdG90eXBlLmRldGVjdEluY29tcGxldGVDaGFyID0gZnVuY3Rpb24oYnVmZmVyKSB7XG4gIC8vIGRldGVybWluZSBob3cgbWFueSBieXRlcyB3ZSBoYXZlIHRvIGNoZWNrIGF0IHRoZSBlbmQgb2YgdGhpcyBidWZmZXJcbiAgdmFyIGkgPSAoYnVmZmVyLmxlbmd0aCA+PSAzKSA/IDMgOiBidWZmZXIubGVuZ3RoO1xuXG4gIC8vIEZpZ3VyZSBvdXQgaWYgb25lIG9mIHRoZSBsYXN0IGkgYnl0ZXMgb2Ygb3VyIGJ1ZmZlciBhbm5vdW5jZXMgYW5cbiAgLy8gaW5jb21wbGV0ZSBjaGFyLlxuICBmb3IgKDsgaSA+IDA7IGktLSkge1xuICAgIHZhciBjID0gYnVmZmVyW2J1ZmZlci5sZW5ndGggLSBpXTtcblxuICAgIC8vIFNlZSBodHRwOi8vZW4ud2lraXBlZGlhLm9yZy93aWtpL1VURi04I0Rlc2NyaXB0aW9uXG5cbiAgICAvLyAxMTBYWFhYWFxuICAgIGlmIChpID09IDEgJiYgYyA+PiA1ID09IDB4MDYpIHtcbiAgICAgIHRoaXMuY2hhckxlbmd0aCA9IDI7XG4gICAgICBicmVhaztcbiAgICB9XG5cbiAgICAvLyAxMTEwWFhYWFxuICAgIGlmIChpIDw9IDIgJiYgYyA+PiA0ID09IDB4MEUpIHtcbiAgICAgIHRoaXMuY2hhckxlbmd0aCA9IDM7XG4gICAgICBicmVhaztcbiAgICB9XG5cbiAgICAvLyAxMTExMFhYWFxuICAgIGlmIChpIDw9IDMgJiYgYyA+PiAzID09IDB4MUUpIHtcbiAgICAgIHRoaXMuY2hhckxlbmd0aCA9IDQ7XG4gICAgICBicmVhaztcbiAgICB9XG4gIH1cbiAgdGhpcy5jaGFyUmVjZWl2ZWQgPSBpO1xufTtcblxuU3RyaW5nRGVjb2Rlci5wcm90b3R5cGUuZW5kID0gZnVuY3Rpb24oYnVmZmVyKSB7XG4gIHZhciByZXMgPSAnJztcbiAgaWYgKGJ1ZmZlciAmJiBidWZmZXIubGVuZ3RoKVxuICAgIHJlcyA9IHRoaXMud3JpdGUoYnVmZmVyKTtcblxuICBpZiAodGhpcy5jaGFyUmVjZWl2ZWQpIHtcbiAgICB2YXIgY3IgPSB0aGlzLmNoYXJSZWNlaXZlZDtcbiAgICB2YXIgYnVmID0gdGhpcy5jaGFyQnVmZmVyO1xuICAgIHZhciBlbmMgPSB0aGlzLmVuY29kaW5nO1xuICAgIHJlcyArPSBidWYuc2xpY2UoMCwgY3IpLnRvU3RyaW5nKGVuYyk7XG4gIH1cblxuICByZXR1cm4gcmVzO1xufTtcblxuZnVuY3Rpb24gcGFzc1Rocm91Z2hXcml0ZShidWZmZXIpIHtcbiAgcmV0dXJuIGJ1ZmZlci50b1N0cmluZyh0aGlzLmVuY29kaW5nKTtcbn1cblxuZnVuY3Rpb24gdXRmMTZEZXRlY3RJbmNvbXBsZXRlQ2hhcihidWZmZXIpIHtcbiAgdGhpcy5jaGFyUmVjZWl2ZWQgPSBidWZmZXIubGVuZ3RoICUgMjtcbiAgdGhpcy5jaGFyTGVuZ3RoID0gdGhpcy5jaGFyUmVjZWl2ZWQgPyAyIDogMDtcbn1cblxuZnVuY3Rpb24gYmFzZTY0RGV0ZWN0SW5jb21wbGV0ZUNoYXIoYnVmZmVyKSB7XG4gIHRoaXMuY2hhclJlY2VpdmVkID0gYnVmZmVyLmxlbmd0aCAlIDM7XG4gIHRoaXMuY2hhckxlbmd0aCA9IHRoaXMuY2hhclJlY2VpdmVkID8gMyA6IDA7XG59XG4iLCIvKiFcbiAqIHN0cmlwLWNvbW1lbnRzIDxodHRwczovL2dpdGh1Yi5jb20vam9uc2NobGlua2VydC9zdHJpcC1jb21tZW50cz5cbiAqXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTQgSm9uIFNjaGxpbmtlcnQsIGNvbnRyaWJ1dG9ycy5cbiAqIExpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZS5cbiAqL1xuXG4ndXNlIHN0cmljJztcblxudmFyIHJlQmxvY2sgPSAnXFxcXC9cXFxcKic7XG52YXIgcmVCbG9ja0lnbm9yZSA9ICdcXFxcL1xcXFwqKD8hXFxcXCo/XFxcXCEpJztcbnZhciByZUJsb2NrRW5kID0gJygufFtcXFxcclxcXFxuXXxcXFxcbikqP1xcXFwqXFxcXC9cXFxcbj9cXFxcbj8nO1xudmFyIHJlTGluZSA9IC8oXnxbXlxcU1xcbl0pKD86XFwvXFwvKShbXFxzXFxTXSs/KSQvZ207XG52YXIgcmVMaW5lSWdub3JlID0gLyhefFteXFxTXFxuXSkoPzpcXC9cXC9bXiFdKShbXFxzXFxTXSs/KSQvZ207XG5cblxuLyoqXG4gKiBTdHJpcCBhbGwgY29tbWVudHNcbiAqXG4gKiB7JT0gZG9jcyhcInN0cmlwXCIpICV9XG4gKlxuICogQHBhcmFtICAge1N0cmluZ30gYHN0cmAgIGZpbGUgY29udGVudHMgb3Igc3RyaW5nIHRvIHN0cmlwLlxuICogQHBhcmFtICAge09iamVjdH0gYG9wdHNgICBvcHRpb25zIGFyZSBwYXNzZWQgdG8gYC5ibG9ja2AsIGFuZCBgLmxpbmVgXG4gKiBAcmV0dXJuICB7U3RyaW5nfSBTdHJpbmcgd2l0aG91dCBjb21tZW50cy5cbiAqIEBhcGkgcHVibGljXG4gKi9cblxudmFyIHN0cmlwID0gbW9kdWxlLmV4cG9ydHMgPSBmdW5jdGlvbihzdHIsIG9wdHMpIHtcbiAgcmV0dXJuIHN0ciA/IHN0cmlwLmJsb2NrKHN0cmlwLmxpbmUoc3RyLCBvcHRzKSwgb3B0cykgOiAnJztcbn07XG5cblxuLyoqXG4gKiBTdHJpcCBvbmx5IGJsb2NrIGNvbW1lbnRzLCBvcHRpb25hbGx5IGxlYXZpbmcgcHJvdGVjdGVkIGNvbW1lbnRzXG4gKiAoZS5nLiBgLyohYCkgaW50YWN0LlxuICpcbiAqIHslPSBkb2NzKFwiYmxvY2tcIikgJX1cbiAqXG4gKiBAcGFyYW0gICB7U3RyaW5nfSBgc3RyYCAgZmlsZSBjb250ZW50IG9yIHN0cmluZyB0byBzdHJpcCB0b1xuICogQHBhcmFtICAge09iamVjdH0gYG9wdHNgICBpZiBgc2FmZTp0cnVlYCwgc3RyaXAgb25seSBjb21tZW50cyB0aGF0IGRvIG5vdCBzdGFydCB3aXRoIGAvKiFgIG9yIGAvKiohYFxuICogQHJldHVybiAge1N0cmluZ30gU3RyaW5nIHdpdGhvdXQgYmxvY2sgY29tbWVudHMuXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbnN0cmlwLmJsb2NrID0gZnVuY3Rpb24oc3RyLCBvcHRzKSB7XG4gIG9wdHMgPSBvcHRzIHx8IHt9O1xuICB2YXIgcmUgPSBuZXcgUmVnRXhwKHJlQmxvY2sgKyByZUJsb2NrRW5kLCAnZ20nKTtcbiAgaWYob3B0cy5zYWZlKSB7XG4gICAgcmUgPSBuZXcgUmVnRXhwKHJlQmxvY2tJZ25vcmUgKyByZUJsb2NrRW5kLCAnZ20nKTtcbiAgfVxuICByZXR1cm4gc3RyID8gc3RyLnJlcGxhY2UocmUsICcnKSA6ICcnO1xufTtcblxuXG4vKipcbiAqIFN0cmlwIG9ubHkgbGluZSBjb21tZW50c1xuICpcbiAqIHslPSBkb2NzKFwibGluZVwiKSAlfVxuICpcbiAqIEBwYXJhbSAgIHtTdHJpbmd9IGBzdHJgICBmaWxlIGNvbnRlbnQgb3Igc3RyaW5nIHRvIHN0cmlwIHRvXG4gKiBAcGFyYW0gICB7T2JqZWN0fSBgb3B0c2AgIGlmIGBzYWZlOnRydWVgLCBzdHJpcCBhbGwgdGhhdCBub3Qgc3RhcnRzIHdpdGggYC8vIWBcbiAqIEByZXR1cm4gIHtTdHJpbmd9IFN0cmluZyB3aXRob3V0IGxpbmUgY29tbWVudHMuXG4gKiBAYXBpIHB1YmxpY1xuICovXG5cbnN0cmlwLmxpbmUgPSBmdW5jdGlvbihzdHIsIG9wdHMpIHtcbiAgb3B0cyA9IG9wdHMgfHwge307XG4gIHZhciByZSA9IHJlTGluZTtcbiAgaWYob3B0cy5zYWZlKSB7XG4gICAgcmUgPSByZUxpbmVJZ25vcmU7XG4gIH1cbiAgcmV0dXJuIHN0ciA/IHN0ci5yZXBsYWNlKHJlLCAnJykgOiAnJztcbn07XG4iLCIvLyBodHRwczovL2dpdGh1Yi5jb20vdG9wb2pzb24vdG9wb2pzb24tY2xpZW50IFZlcnNpb24gMi4xLjAuIENvcHlyaWdodCAyMDE2IE1pa2UgQm9zdG9jay5cbihmdW5jdGlvbiAoZ2xvYmFsLCBmYWN0b3J5KSB7XG4gIHR5cGVvZiBleHBvcnRzID09PSAnb2JqZWN0JyAmJiB0eXBlb2YgbW9kdWxlICE9PSAndW5kZWZpbmVkJyA/IGZhY3RvcnkoZXhwb3J0cykgOlxuICB0eXBlb2YgZGVmaW5lID09PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgPyBkZWZpbmUoWydleHBvcnRzJ10sIGZhY3RvcnkpIDpcbiAgKGZhY3RvcnkoKGdsb2JhbC50b3BvanNvbiA9IGdsb2JhbC50b3BvanNvbiB8fCB7fSkpKTtcbn0odGhpcywgKGZ1bmN0aW9uIChleHBvcnRzKSB7ICd1c2Ugc3RyaWN0JztcblxudmFyIHJldmVyc2UgPSBmdW5jdGlvbihhcnJheSwgbikge1xuICB2YXIgdCwgaiA9IGFycmF5Lmxlbmd0aCwgaSA9IGogLSBuO1xuICB3aGlsZSAoaSA8IC0taikgdCA9IGFycmF5W2ldLCBhcnJheVtpKytdID0gYXJyYXlbal0sIGFycmF5W2pdID0gdDtcbn07XG5cbnZhciBpZGVudGl0eSA9IGZ1bmN0aW9uKHgpIHtcbiAgcmV0dXJuIHg7XG59O1xuXG52YXIgdHJhbnNmb3JtID0gZnVuY3Rpb24odG9wb2xvZ3kpIHtcbiAgaWYgKCh0cmFuc2Zvcm0gPSB0b3BvbG9neS50cmFuc2Zvcm0pID09IG51bGwpIHJldHVybiBpZGVudGl0eTtcbiAgdmFyIHRyYW5zZm9ybSxcbiAgICAgIHgwLFxuICAgICAgeTAsXG4gICAgICBreCA9IHRyYW5zZm9ybS5zY2FsZVswXSxcbiAgICAgIGt5ID0gdHJhbnNmb3JtLnNjYWxlWzFdLFxuICAgICAgZHggPSB0cmFuc2Zvcm0udHJhbnNsYXRlWzBdLFxuICAgICAgZHkgPSB0cmFuc2Zvcm0udHJhbnNsYXRlWzFdO1xuICByZXR1cm4gZnVuY3Rpb24ocG9pbnQsIGkpIHtcbiAgICBpZiAoIWkpIHgwID0geTAgPSAwO1xuICAgIHBvaW50WzBdID0gKHgwICs9IHBvaW50WzBdKSAqIGt4ICsgZHg7XG4gICAgcG9pbnRbMV0gPSAoeTAgKz0gcG9pbnRbMV0pICoga3kgKyBkeTtcbiAgICByZXR1cm4gcG9pbnQ7XG4gIH07XG59O1xuXG52YXIgZmVhdHVyZSA9IGZ1bmN0aW9uKHRvcG9sb2d5LCBvKSB7XG4gIHJldHVybiBvLnR5cGUgPT09IFwiR2VvbWV0cnlDb2xsZWN0aW9uXCJcbiAgICAgID8ge3R5cGU6IFwiRmVhdHVyZUNvbGxlY3Rpb25cIiwgZmVhdHVyZXM6IG8uZ2VvbWV0cmllcy5tYXAoZnVuY3Rpb24obykgeyByZXR1cm4gZmVhdHVyZSQxKHRvcG9sb2d5LCBvKTsgfSl9XG4gICAgICA6IGZlYXR1cmUkMSh0b3BvbG9neSwgbyk7XG59O1xuXG5mdW5jdGlvbiBmZWF0dXJlJDEodG9wb2xvZ3ksIG8pIHtcbiAgdmFyIGlkID0gby5pZCxcbiAgICAgIGJib3ggPSBvLmJib3gsXG4gICAgICBwcm9wZXJ0aWVzID0gby5wcm9wZXJ0aWVzID09IG51bGwgPyB7fSA6IG8ucHJvcGVydGllcyxcbiAgICAgIGdlb21ldHJ5ID0gb2JqZWN0KHRvcG9sb2d5LCBvKTtcbiAgcmV0dXJuIGlkID09IG51bGwgJiYgYmJveCA9PSBudWxsID8ge3R5cGU6IFwiRmVhdHVyZVwiLCBwcm9wZXJ0aWVzOiBwcm9wZXJ0aWVzLCBnZW9tZXRyeTogZ2VvbWV0cnl9XG4gICAgICA6IGJib3ggPT0gbnVsbCA/IHt0eXBlOiBcIkZlYXR1cmVcIiwgaWQ6IGlkLCBwcm9wZXJ0aWVzOiBwcm9wZXJ0aWVzLCBnZW9tZXRyeTogZ2VvbWV0cnl9XG4gICAgICA6IHt0eXBlOiBcIkZlYXR1cmVcIiwgaWQ6IGlkLCBiYm94OiBiYm94LCBwcm9wZXJ0aWVzOiBwcm9wZXJ0aWVzLCBnZW9tZXRyeTogZ2VvbWV0cnl9O1xufVxuXG5mdW5jdGlvbiBvYmplY3QodG9wb2xvZ3ksIG8pIHtcbiAgdmFyIHRyYW5zZm9ybVBvaW50ID0gdHJhbnNmb3JtKHRvcG9sb2d5KSxcbiAgICAgIGFyY3MgPSB0b3BvbG9neS5hcmNzO1xuXG4gIGZ1bmN0aW9uIGFyYyhpLCBwb2ludHMpIHtcbiAgICBpZiAocG9pbnRzLmxlbmd0aCkgcG9pbnRzLnBvcCgpO1xuICAgIGZvciAodmFyIGEgPSBhcmNzW2kgPCAwID8gfmkgOiBpXSwgayA9IDAsIG4gPSBhLmxlbmd0aDsgayA8IG47ICsraykge1xuICAgICAgcG9pbnRzLnB1c2godHJhbnNmb3JtUG9pbnQoYVtrXS5zbGljZSgpLCBrKSk7XG4gICAgfVxuICAgIGlmIChpIDwgMCkgcmV2ZXJzZShwb2ludHMsIG4pO1xuICB9XG5cbiAgZnVuY3Rpb24gcG9pbnQocCkge1xuICAgIHJldHVybiB0cmFuc2Zvcm1Qb2ludChwLnNsaWNlKCkpO1xuICB9XG5cbiAgZnVuY3Rpb24gbGluZShhcmNzKSB7XG4gICAgdmFyIHBvaW50cyA9IFtdO1xuICAgIGZvciAodmFyIGkgPSAwLCBuID0gYXJjcy5sZW5ndGg7IGkgPCBuOyArK2kpIGFyYyhhcmNzW2ldLCBwb2ludHMpO1xuICAgIGlmIChwb2ludHMubGVuZ3RoIDwgMikgcG9pbnRzLnB1c2gocG9pbnRzWzBdLnNsaWNlKCkpO1xuICAgIHJldHVybiBwb2ludHM7XG4gIH1cblxuICBmdW5jdGlvbiByaW5nKGFyY3MpIHtcbiAgICB2YXIgcG9pbnRzID0gbGluZShhcmNzKTtcbiAgICB3aGlsZSAocG9pbnRzLmxlbmd0aCA8IDQpIHBvaW50cy5wdXNoKHBvaW50c1swXS5zbGljZSgpKTtcbiAgICByZXR1cm4gcG9pbnRzO1xuICB9XG5cbiAgZnVuY3Rpb24gcG9seWdvbihhcmNzKSB7XG4gICAgcmV0dXJuIGFyY3MubWFwKHJpbmcpO1xuICB9XG5cbiAgZnVuY3Rpb24gZ2VvbWV0cnkobykge1xuICAgIHZhciB0eXBlID0gby50eXBlLCBjb29yZGluYXRlcztcbiAgICBzd2l0Y2ggKHR5cGUpIHtcbiAgICAgIGNhc2UgXCJHZW9tZXRyeUNvbGxlY3Rpb25cIjogcmV0dXJuIHt0eXBlOiB0eXBlLCBnZW9tZXRyaWVzOiBvLmdlb21ldHJpZXMubWFwKGdlb21ldHJ5KX07XG4gICAgICBjYXNlIFwiUG9pbnRcIjogY29vcmRpbmF0ZXMgPSBwb2ludChvLmNvb3JkaW5hdGVzKTsgYnJlYWs7XG4gICAgICBjYXNlIFwiTXVsdGlQb2ludFwiOiBjb29yZGluYXRlcyA9IG8uY29vcmRpbmF0ZXMubWFwKHBvaW50KTsgYnJlYWs7XG4gICAgICBjYXNlIFwiTGluZVN0cmluZ1wiOiBjb29yZGluYXRlcyA9IGxpbmUoby5hcmNzKTsgYnJlYWs7XG4gICAgICBjYXNlIFwiTXVsdGlMaW5lU3RyaW5nXCI6IGNvb3JkaW5hdGVzID0gby5hcmNzLm1hcChsaW5lKTsgYnJlYWs7XG4gICAgICBjYXNlIFwiUG9seWdvblwiOiBjb29yZGluYXRlcyA9IHBvbHlnb24oby5hcmNzKTsgYnJlYWs7XG4gICAgICBjYXNlIFwiTXVsdGlQb2x5Z29uXCI6IGNvb3JkaW5hdGVzID0gby5hcmNzLm1hcChwb2x5Z29uKTsgYnJlYWs7XG4gICAgICBkZWZhdWx0OiByZXR1cm4gbnVsbDtcbiAgICB9XG4gICAgcmV0dXJuIHt0eXBlOiB0eXBlLCBjb29yZGluYXRlczogY29vcmRpbmF0ZXN9O1xuICB9XG5cbiAgcmV0dXJuIGdlb21ldHJ5KG8pO1xufVxuXG4vLyBleHBvcnQge2RlZmF1bHQgYXMgYmJveH0gZnJvbSBcIi4vc3JjL2Jib3hcIjtcblxuLy8gZXhwb3J0IHtkZWZhdWx0IGFzIG1lc2gsIG1lc2hBcmNzfSBmcm9tIFwiLi9zcmMvbWVzaFwiO1xuLy8gZXhwb3J0IHtkZWZhdWx0IGFzIG1lcmdlLCBtZXJnZUFyY3N9IGZyb20gXCIuL3NyYy9tZXJnZVwiO1xuLy8gZXhwb3J0IHtkZWZhdWx0IGFzIG5laWdoYm9yc30gZnJvbSBcIi4vc3JjL25laWdoYm9yc1wiO1xuLy8gZXhwb3J0IHtkZWZhdWx0IGFzIHF1YW50aXplfSBmcm9tIFwiLi9zcmMvcXVhbnRpemVcIjtcbi8vIGV4cG9ydCB7ZGVmYXVsdCBhcyB0cmFuc2Zvcm19IGZyb20gXCIuL3NyYy90cmFuc2Zvcm1cIjtcbi8vIGV4cG9ydCB7ZGVmYXVsdCBhcyB1bnRyYW5zZm9ybX0gZnJvbSBcIi4vc3JjL3VudHJhbnNmb3JtXCI7XG5cbmV4cG9ydHMuZmVhdHVyZSA9IGZlYXR1cmU7XG5cbk9iamVjdC5kZWZpbmVQcm9wZXJ0eShleHBvcnRzLCAnX19lc01vZHVsZScsIHsgdmFsdWU6IHRydWUgfSk7XG5cbn0pKSk7XG4iLCJcbi8qKlxuICogTW9kdWxlIGV4cG9ydHMuXG4gKi9cblxubW9kdWxlLmV4cG9ydHMgPSBkZXByZWNhdGU7XG5cbi8qKlxuICogTWFyayB0aGF0IGEgbWV0aG9kIHNob3VsZCBub3QgYmUgdXNlZC5cbiAqIFJldHVybnMgYSBtb2RpZmllZCBmdW5jdGlvbiB3aGljaCB3YXJucyBvbmNlIGJ5IGRlZmF1bHQuXG4gKlxuICogSWYgYGxvY2FsU3RvcmFnZS5ub0RlcHJlY2F0aW9uID0gdHJ1ZWAgaXMgc2V0LCB0aGVuIGl0IGlzIGEgbm8tb3AuXG4gKlxuICogSWYgYGxvY2FsU3RvcmFnZS50aHJvd0RlcHJlY2F0aW9uID0gdHJ1ZWAgaXMgc2V0LCB0aGVuIGRlcHJlY2F0ZWQgZnVuY3Rpb25zXG4gKiB3aWxsIHRocm93IGFuIEVycm9yIHdoZW4gaW52b2tlZC5cbiAqXG4gKiBJZiBgbG9jYWxTdG9yYWdlLnRyYWNlRGVwcmVjYXRpb24gPSB0cnVlYCBpcyBzZXQsIHRoZW4gZGVwcmVjYXRlZCBmdW5jdGlvbnNcbiAqIHdpbGwgaW52b2tlIGBjb25zb2xlLnRyYWNlKClgIGluc3RlYWQgb2YgYGNvbnNvbGUuZXJyb3IoKWAuXG4gKlxuICogQHBhcmFtIHtGdW5jdGlvbn0gZm4gLSB0aGUgZnVuY3Rpb24gdG8gZGVwcmVjYXRlXG4gKiBAcGFyYW0ge1N0cmluZ30gbXNnIC0gdGhlIHN0cmluZyB0byBwcmludCB0byB0aGUgY29uc29sZSB3aGVuIGBmbmAgaXMgaW52b2tlZFxuICogQHJldHVybnMge0Z1bmN0aW9ufSBhIG5ldyBcImRlcHJlY2F0ZWRcIiB2ZXJzaW9uIG9mIGBmbmBcbiAqIEBhcGkgcHVibGljXG4gKi9cblxuZnVuY3Rpb24gZGVwcmVjYXRlIChmbiwgbXNnKSB7XG4gIGlmIChjb25maWcoJ25vRGVwcmVjYXRpb24nKSkge1xuICAgIHJldHVybiBmbjtcbiAgfVxuXG4gIHZhciB3YXJuZWQgPSBmYWxzZTtcbiAgZnVuY3Rpb24gZGVwcmVjYXRlZCgpIHtcbiAgICBpZiAoIXdhcm5lZCkge1xuICAgICAgaWYgKGNvbmZpZygndGhyb3dEZXByZWNhdGlvbicpKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihtc2cpO1xuICAgICAgfSBlbHNlIGlmIChjb25maWcoJ3RyYWNlRGVwcmVjYXRpb24nKSkge1xuICAgICAgICBjb25zb2xlLnRyYWNlKG1zZyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zb2xlLndhcm4obXNnKTtcbiAgICAgIH1cbiAgICAgIHdhcm5lZCA9IHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmbi5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICB9XG5cbiAgcmV0dXJuIGRlcHJlY2F0ZWQ7XG59XG5cbi8qKlxuICogQ2hlY2tzIGBsb2NhbFN0b3JhZ2VgIGZvciBib29sZWFuIHZhbHVlcyBmb3IgdGhlIGdpdmVuIGBuYW1lYC5cbiAqXG4gKiBAcGFyYW0ge1N0cmluZ30gbmFtZVxuICogQHJldHVybnMge0Jvb2xlYW59XG4gKiBAYXBpIHByaXZhdGVcbiAqL1xuXG5mdW5jdGlvbiBjb25maWcgKG5hbWUpIHtcbiAgLy8gYWNjZXNzaW5nIGdsb2JhbC5sb2NhbFN0b3JhZ2UgY2FuIHRyaWdnZXIgYSBET01FeGNlcHRpb24gaW4gc2FuZGJveGVkIGlmcmFtZXNcbiAgdHJ5IHtcbiAgICBpZiAoIWdsb2JhbC5sb2NhbFN0b3JhZ2UpIHJldHVybiBmYWxzZTtcbiAgfSBjYXRjaCAoXykge1xuICAgIHJldHVybiBmYWxzZTtcbiAgfVxuICB2YXIgdmFsID0gZ2xvYmFsLmxvY2FsU3RvcmFnZVtuYW1lXTtcbiAgaWYgKG51bGwgPT0gdmFsKSByZXR1cm4gZmFsc2U7XG4gIHJldHVybiBTdHJpbmcodmFsKS50b0xvd2VyQ2FzZSgpID09PSAndHJ1ZSc7XG59XG4iLCJtb2R1bGUuZXhwb3J0cyA9IGZ1bmN0aW9uIGlzQnVmZmVyKGFyZykge1xuICByZXR1cm4gYXJnICYmIHR5cGVvZiBhcmcgPT09ICdvYmplY3QnXG4gICAgJiYgdHlwZW9mIGFyZy5jb3B5ID09PSAnZnVuY3Rpb24nXG4gICAgJiYgdHlwZW9mIGFyZy5maWxsID09PSAnZnVuY3Rpb24nXG4gICAgJiYgdHlwZW9mIGFyZy5yZWFkVUludDggPT09ICdmdW5jdGlvbic7XG59IiwiLy8gQ29weXJpZ2h0IEpveWVudCwgSW5jLiBhbmQgb3RoZXIgTm9kZSBjb250cmlidXRvcnMuXG4vL1xuLy8gUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGFcbi8vIGNvcHkgb2YgdGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGVcbi8vIFwiU29mdHdhcmVcIiksIHRvIGRlYWwgaW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZ1xuLy8gd2l0aG91dCBsaW1pdGF0aW9uIHRoZSByaWdodHMgdG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLFxuLy8gZGlzdHJpYnV0ZSwgc3VibGljZW5zZSwgYW5kL29yIHNlbGwgY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdFxuLy8gcGVyc29ucyB0byB3aG9tIHRoZSBTb2Z0d2FyZSBpcyBmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlXG4vLyBmb2xsb3dpbmcgY29uZGl0aW9uczpcbi8vXG4vLyBUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZFxuLy8gaW4gYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuXG4vL1xuLy8gVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEIFwiQVMgSVNcIiwgV0lUSE9VVCBXQVJSQU5UWSBPRiBBTlkgS0lORCwgRVhQUkVTU1xuLy8gT1IgSU1QTElFRCwgSU5DTFVESU5HIEJVVCBOT1QgTElNSVRFRCBUTyBUSEUgV0FSUkFOVElFUyBPRlxuLy8gTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTIEZPUiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBTkQgTk9OSU5GUklOR0VNRU5ULiBJTlxuLy8gTk8gRVZFTlQgU0hBTEwgVEhFIEFVVEhPUlMgT1IgQ09QWVJJR0hUIEhPTERFUlMgQkUgTElBQkxFIEZPUiBBTlkgQ0xBSU0sXG4vLyBEQU1BR0VTIE9SIE9USEVSIExJQUJJTElUWSwgV0hFVEhFUiBJTiBBTiBBQ1RJT04gT0YgQ09OVFJBQ1QsIFRPUlQgT1Jcbi8vIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLCBPVVQgT0YgT1IgSU4gQ09OTkVDVElPTiBXSVRIIFRIRSBTT0ZUV0FSRSBPUiBUSEVcbi8vIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBJTiBUSEUgU09GVFdBUkUuXG5cbnZhciBmb3JtYXRSZWdFeHAgPSAvJVtzZGolXS9nO1xuZXhwb3J0cy5mb3JtYXQgPSBmdW5jdGlvbihmKSB7XG4gIGlmICghaXNTdHJpbmcoZikpIHtcbiAgICB2YXIgb2JqZWN0cyA9IFtdO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYXJndW1lbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICBvYmplY3RzLnB1c2goaW5zcGVjdChhcmd1bWVudHNbaV0pKTtcbiAgICB9XG4gICAgcmV0dXJuIG9iamVjdHMuam9pbignICcpO1xuICB9XG5cbiAgdmFyIGkgPSAxO1xuICB2YXIgYXJncyA9IGFyZ3VtZW50cztcbiAgdmFyIGxlbiA9IGFyZ3MubGVuZ3RoO1xuICB2YXIgc3RyID0gU3RyaW5nKGYpLnJlcGxhY2UoZm9ybWF0UmVnRXhwLCBmdW5jdGlvbih4KSB7XG4gICAgaWYgKHggPT09ICclJScpIHJldHVybiAnJSc7XG4gICAgaWYgKGkgPj0gbGVuKSByZXR1cm4geDtcbiAgICBzd2l0Y2ggKHgpIHtcbiAgICAgIGNhc2UgJyVzJzogcmV0dXJuIFN0cmluZyhhcmdzW2krK10pO1xuICAgICAgY2FzZSAnJWQnOiByZXR1cm4gTnVtYmVyKGFyZ3NbaSsrXSk7XG4gICAgICBjYXNlICclaic6XG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgcmV0dXJuIEpTT04uc3RyaW5naWZ5KGFyZ3NbaSsrXSk7XG4gICAgICAgIH0gY2F0Y2ggKF8pIHtcbiAgICAgICAgICByZXR1cm4gJ1tDaXJjdWxhcl0nO1xuICAgICAgICB9XG4gICAgICBkZWZhdWx0OlxuICAgICAgICByZXR1cm4geDtcbiAgICB9XG4gIH0pO1xuICBmb3IgKHZhciB4ID0gYXJnc1tpXTsgaSA8IGxlbjsgeCA9IGFyZ3NbKytpXSkge1xuICAgIGlmIChpc051bGwoeCkgfHwgIWlzT2JqZWN0KHgpKSB7XG4gICAgICBzdHIgKz0gJyAnICsgeDtcbiAgICB9IGVsc2Uge1xuICAgICAgc3RyICs9ICcgJyArIGluc3BlY3QoeCk7XG4gICAgfVxuICB9XG4gIHJldHVybiBzdHI7XG59O1xuXG5cbi8vIE1hcmsgdGhhdCBhIG1ldGhvZCBzaG91bGQgbm90IGJlIHVzZWQuXG4vLyBSZXR1cm5zIGEgbW9kaWZpZWQgZnVuY3Rpb24gd2hpY2ggd2FybnMgb25jZSBieSBkZWZhdWx0LlxuLy8gSWYgLS1uby1kZXByZWNhdGlvbiBpcyBzZXQsIHRoZW4gaXQgaXMgYSBuby1vcC5cbmV4cG9ydHMuZGVwcmVjYXRlID0gZnVuY3Rpb24oZm4sIG1zZykge1xuICAvLyBBbGxvdyBmb3IgZGVwcmVjYXRpbmcgdGhpbmdzIGluIHRoZSBwcm9jZXNzIG9mIHN0YXJ0aW5nIHVwLlxuICBpZiAoaXNVbmRlZmluZWQoZ2xvYmFsLnByb2Nlc3MpKSB7XG4gICAgcmV0dXJuIGZ1bmN0aW9uKCkge1xuICAgICAgcmV0dXJuIGV4cG9ydHMuZGVwcmVjYXRlKGZuLCBtc2cpLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgfTtcbiAgfVxuXG4gIGlmIChwcm9jZXNzLm5vRGVwcmVjYXRpb24gPT09IHRydWUpIHtcbiAgICByZXR1cm4gZm47XG4gIH1cblxuICB2YXIgd2FybmVkID0gZmFsc2U7XG4gIGZ1bmN0aW9uIGRlcHJlY2F0ZWQoKSB7XG4gICAgaWYgKCF3YXJuZWQpIHtcbiAgICAgIGlmIChwcm9jZXNzLnRocm93RGVwcmVjYXRpb24pIHtcbiAgICAgICAgdGhyb3cgbmV3IEVycm9yKG1zZyk7XG4gICAgICB9IGVsc2UgaWYgKHByb2Nlc3MudHJhY2VEZXByZWNhdGlvbikge1xuICAgICAgICBjb25zb2xlLnRyYWNlKG1zZyk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zb2xlLmVycm9yKG1zZyk7XG4gICAgICB9XG4gICAgICB3YXJuZWQgPSB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZm4uYXBwbHkodGhpcywgYXJndW1lbnRzKTtcbiAgfVxuXG4gIHJldHVybiBkZXByZWNhdGVkO1xufTtcblxuXG52YXIgZGVidWdzID0ge307XG52YXIgZGVidWdFbnZpcm9uO1xuZXhwb3J0cy5kZWJ1Z2xvZyA9IGZ1bmN0aW9uKHNldCkge1xuICBpZiAoaXNVbmRlZmluZWQoZGVidWdFbnZpcm9uKSlcbiAgICBkZWJ1Z0Vudmlyb24gPSBwcm9jZXNzLmVudi5OT0RFX0RFQlVHIHx8ICcnO1xuICBzZXQgPSBzZXQudG9VcHBlckNhc2UoKTtcbiAgaWYgKCFkZWJ1Z3Nbc2V0XSkge1xuICAgIGlmIChuZXcgUmVnRXhwKCdcXFxcYicgKyBzZXQgKyAnXFxcXGInLCAnaScpLnRlc3QoZGVidWdFbnZpcm9uKSkge1xuICAgICAgdmFyIHBpZCA9IHByb2Nlc3MucGlkO1xuICAgICAgZGVidWdzW3NldF0gPSBmdW5jdGlvbigpIHtcbiAgICAgICAgdmFyIG1zZyA9IGV4cG9ydHMuZm9ybWF0LmFwcGx5KGV4cG9ydHMsIGFyZ3VtZW50cyk7XG4gICAgICAgIGNvbnNvbGUuZXJyb3IoJyVzICVkOiAlcycsIHNldCwgcGlkLCBtc2cpO1xuICAgICAgfTtcbiAgICB9IGVsc2Uge1xuICAgICAgZGVidWdzW3NldF0gPSBmdW5jdGlvbigpIHt9O1xuICAgIH1cbiAgfVxuICByZXR1cm4gZGVidWdzW3NldF07XG59O1xuXG5cbi8qKlxuICogRWNob3MgdGhlIHZhbHVlIG9mIGEgdmFsdWUuIFRyeXMgdG8gcHJpbnQgdGhlIHZhbHVlIG91dFxuICogaW4gdGhlIGJlc3Qgd2F5IHBvc3NpYmxlIGdpdmVuIHRoZSBkaWZmZXJlbnQgdHlwZXMuXG4gKlxuICogQHBhcmFtIHtPYmplY3R9IG9iaiBUaGUgb2JqZWN0IHRvIHByaW50IG91dC5cbiAqIEBwYXJhbSB7T2JqZWN0fSBvcHRzIE9wdGlvbmFsIG9wdGlvbnMgb2JqZWN0IHRoYXQgYWx0ZXJzIHRoZSBvdXRwdXQuXG4gKi9cbi8qIGxlZ2FjeTogb2JqLCBzaG93SGlkZGVuLCBkZXB0aCwgY29sb3JzKi9cbmZ1bmN0aW9uIGluc3BlY3Qob2JqLCBvcHRzKSB7XG4gIC8vIGRlZmF1bHQgb3B0aW9uc1xuICB2YXIgY3R4ID0ge1xuICAgIHNlZW46IFtdLFxuICAgIHN0eWxpemU6IHN0eWxpemVOb0NvbG9yXG4gIH07XG4gIC8vIGxlZ2FjeS4uLlxuICBpZiAoYXJndW1lbnRzLmxlbmd0aCA+PSAzKSBjdHguZGVwdGggPSBhcmd1bWVudHNbMl07XG4gIGlmIChhcmd1bWVudHMubGVuZ3RoID49IDQpIGN0eC5jb2xvcnMgPSBhcmd1bWVudHNbM107XG4gIGlmIChpc0Jvb2xlYW4ob3B0cykpIHtcbiAgICAvLyBsZWdhY3kuLi5cbiAgICBjdHguc2hvd0hpZGRlbiA9IG9wdHM7XG4gIH0gZWxzZSBpZiAob3B0cykge1xuICAgIC8vIGdvdCBhbiBcIm9wdGlvbnNcIiBvYmplY3RcbiAgICBleHBvcnRzLl9leHRlbmQoY3R4LCBvcHRzKTtcbiAgfVxuICAvLyBzZXQgZGVmYXVsdCBvcHRpb25zXG4gIGlmIChpc1VuZGVmaW5lZChjdHguc2hvd0hpZGRlbikpIGN0eC5zaG93SGlkZGVuID0gZmFsc2U7XG4gIGlmIChpc1VuZGVmaW5lZChjdHguZGVwdGgpKSBjdHguZGVwdGggPSAyO1xuICBpZiAoaXNVbmRlZmluZWQoY3R4LmNvbG9ycykpIGN0eC5jb2xvcnMgPSBmYWxzZTtcbiAgaWYgKGlzVW5kZWZpbmVkKGN0eC5jdXN0b21JbnNwZWN0KSkgY3R4LmN1c3RvbUluc3BlY3QgPSB0cnVlO1xuICBpZiAoY3R4LmNvbG9ycykgY3R4LnN0eWxpemUgPSBzdHlsaXplV2l0aENvbG9yO1xuICByZXR1cm4gZm9ybWF0VmFsdWUoY3R4LCBvYmosIGN0eC5kZXB0aCk7XG59XG5leHBvcnRzLmluc3BlY3QgPSBpbnNwZWN0O1xuXG5cbi8vIGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvQU5TSV9lc2NhcGVfY29kZSNncmFwaGljc1xuaW5zcGVjdC5jb2xvcnMgPSB7XG4gICdib2xkJyA6IFsxLCAyMl0sXG4gICdpdGFsaWMnIDogWzMsIDIzXSxcbiAgJ3VuZGVybGluZScgOiBbNCwgMjRdLFxuICAnaW52ZXJzZScgOiBbNywgMjddLFxuICAnd2hpdGUnIDogWzM3LCAzOV0sXG4gICdncmV5JyA6IFs5MCwgMzldLFxuICAnYmxhY2snIDogWzMwLCAzOV0sXG4gICdibHVlJyA6IFszNCwgMzldLFxuICAnY3lhbicgOiBbMzYsIDM5XSxcbiAgJ2dyZWVuJyA6IFszMiwgMzldLFxuICAnbWFnZW50YScgOiBbMzUsIDM5XSxcbiAgJ3JlZCcgOiBbMzEsIDM5XSxcbiAgJ3llbGxvdycgOiBbMzMsIDM5XVxufTtcblxuLy8gRG9uJ3QgdXNlICdibHVlJyBub3QgdmlzaWJsZSBvbiBjbWQuZXhlXG5pbnNwZWN0LnN0eWxlcyA9IHtcbiAgJ3NwZWNpYWwnOiAnY3lhbicsXG4gICdudW1iZXInOiAneWVsbG93JyxcbiAgJ2Jvb2xlYW4nOiAneWVsbG93JyxcbiAgJ3VuZGVmaW5lZCc6ICdncmV5JyxcbiAgJ251bGwnOiAnYm9sZCcsXG4gICdzdHJpbmcnOiAnZ3JlZW4nLFxuICAnZGF0ZSc6ICdtYWdlbnRhJyxcbiAgLy8gXCJuYW1lXCI6IGludGVudGlvbmFsbHkgbm90IHN0eWxpbmdcbiAgJ3JlZ2V4cCc6ICdyZWQnXG59O1xuXG5cbmZ1bmN0aW9uIHN0eWxpemVXaXRoQ29sb3Ioc3RyLCBzdHlsZVR5cGUpIHtcbiAgdmFyIHN0eWxlID0gaW5zcGVjdC5zdHlsZXNbc3R5bGVUeXBlXTtcblxuICBpZiAoc3R5bGUpIHtcbiAgICByZXR1cm4gJ1xcdTAwMWJbJyArIGluc3BlY3QuY29sb3JzW3N0eWxlXVswXSArICdtJyArIHN0ciArXG4gICAgICAgICAgICdcXHUwMDFiWycgKyBpbnNwZWN0LmNvbG9yc1tzdHlsZV1bMV0gKyAnbSc7XG4gIH0gZWxzZSB7XG4gICAgcmV0dXJuIHN0cjtcbiAgfVxufVxuXG5cbmZ1bmN0aW9uIHN0eWxpemVOb0NvbG9yKHN0ciwgc3R5bGVUeXBlKSB7XG4gIHJldHVybiBzdHI7XG59XG5cblxuZnVuY3Rpb24gYXJyYXlUb0hhc2goYXJyYXkpIHtcbiAgdmFyIGhhc2ggPSB7fTtcblxuICBhcnJheS5mb3JFYWNoKGZ1bmN0aW9uKHZhbCwgaWR4KSB7XG4gICAgaGFzaFt2YWxdID0gdHJ1ZTtcbiAgfSk7XG5cbiAgcmV0dXJuIGhhc2g7XG59XG5cblxuZnVuY3Rpb24gZm9ybWF0VmFsdWUoY3R4LCB2YWx1ZSwgcmVjdXJzZVRpbWVzKSB7XG4gIC8vIFByb3ZpZGUgYSBob29rIGZvciB1c2VyLXNwZWNpZmllZCBpbnNwZWN0IGZ1bmN0aW9ucy5cbiAgLy8gQ2hlY2sgdGhhdCB2YWx1ZSBpcyBhbiBvYmplY3Qgd2l0aCBhbiBpbnNwZWN0IGZ1bmN0aW9uIG9uIGl0XG4gIGlmIChjdHguY3VzdG9tSW5zcGVjdCAmJlxuICAgICAgdmFsdWUgJiZcbiAgICAgIGlzRnVuY3Rpb24odmFsdWUuaW5zcGVjdCkgJiZcbiAgICAgIC8vIEZpbHRlciBvdXQgdGhlIHV0aWwgbW9kdWxlLCBpdCdzIGluc3BlY3QgZnVuY3Rpb24gaXMgc3BlY2lhbFxuICAgICAgdmFsdWUuaW5zcGVjdCAhPT0gZXhwb3J0cy5pbnNwZWN0ICYmXG4gICAgICAvLyBBbHNvIGZpbHRlciBvdXQgYW55IHByb3RvdHlwZSBvYmplY3RzIHVzaW5nIHRoZSBjaXJjdWxhciBjaGVjay5cbiAgICAgICEodmFsdWUuY29uc3RydWN0b3IgJiYgdmFsdWUuY29uc3RydWN0b3IucHJvdG90eXBlID09PSB2YWx1ZSkpIHtcbiAgICB2YXIgcmV0ID0gdmFsdWUuaW5zcGVjdChyZWN1cnNlVGltZXMsIGN0eCk7XG4gICAgaWYgKCFpc1N0cmluZyhyZXQpKSB7XG4gICAgICByZXQgPSBmb3JtYXRWYWx1ZShjdHgsIHJldCwgcmVjdXJzZVRpbWVzKTtcbiAgICB9XG4gICAgcmV0dXJuIHJldDtcbiAgfVxuXG4gIC8vIFByaW1pdGl2ZSB0eXBlcyBjYW5ub3QgaGF2ZSBwcm9wZXJ0aWVzXG4gIHZhciBwcmltaXRpdmUgPSBmb3JtYXRQcmltaXRpdmUoY3R4LCB2YWx1ZSk7XG4gIGlmIChwcmltaXRpdmUpIHtcbiAgICByZXR1cm4gcHJpbWl0aXZlO1xuICB9XG5cbiAgLy8gTG9vayB1cCB0aGUga2V5cyBvZiB0aGUgb2JqZWN0LlxuICB2YXIga2V5cyA9IE9iamVjdC5rZXlzKHZhbHVlKTtcbiAgdmFyIHZpc2libGVLZXlzID0gYXJyYXlUb0hhc2goa2V5cyk7XG5cbiAgaWYgKGN0eC5zaG93SGlkZGVuKSB7XG4gICAga2V5cyA9IE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKHZhbHVlKTtcbiAgfVxuXG4gIC8vIElFIGRvZXNuJ3QgbWFrZSBlcnJvciBmaWVsZHMgbm9uLWVudW1lcmFibGVcbiAgLy8gaHR0cDovL21zZG4ubWljcm9zb2Z0LmNvbS9lbi11cy9saWJyYXJ5L2llL2R3dzUyc2J0KHY9dnMuOTQpLmFzcHhcbiAgaWYgKGlzRXJyb3IodmFsdWUpXG4gICAgICAmJiAoa2V5cy5pbmRleE9mKCdtZXNzYWdlJykgPj0gMCB8fCBrZXlzLmluZGV4T2YoJ2Rlc2NyaXB0aW9uJykgPj0gMCkpIHtcbiAgICByZXR1cm4gZm9ybWF0RXJyb3IodmFsdWUpO1xuICB9XG5cbiAgLy8gU29tZSB0eXBlIG9mIG9iamVjdCB3aXRob3V0IHByb3BlcnRpZXMgY2FuIGJlIHNob3J0Y3V0dGVkLlxuICBpZiAoa2V5cy5sZW5ndGggPT09IDApIHtcbiAgICBpZiAoaXNGdW5jdGlvbih2YWx1ZSkpIHtcbiAgICAgIHZhciBuYW1lID0gdmFsdWUubmFtZSA/ICc6ICcgKyB2YWx1ZS5uYW1lIDogJyc7XG4gICAgICByZXR1cm4gY3R4LnN0eWxpemUoJ1tGdW5jdGlvbicgKyBuYW1lICsgJ10nLCAnc3BlY2lhbCcpO1xuICAgIH1cbiAgICBpZiAoaXNSZWdFeHAodmFsdWUpKSB7XG4gICAgICByZXR1cm4gY3R4LnN0eWxpemUoUmVnRXhwLnByb3RvdHlwZS50b1N0cmluZy5jYWxsKHZhbHVlKSwgJ3JlZ2V4cCcpO1xuICAgIH1cbiAgICBpZiAoaXNEYXRlKHZhbHVlKSkge1xuICAgICAgcmV0dXJuIGN0eC5zdHlsaXplKERhdGUucHJvdG90eXBlLnRvU3RyaW5nLmNhbGwodmFsdWUpLCAnZGF0ZScpO1xuICAgIH1cbiAgICBpZiAoaXNFcnJvcih2YWx1ZSkpIHtcbiAgICAgIHJldHVybiBmb3JtYXRFcnJvcih2YWx1ZSk7XG4gICAgfVxuICB9XG5cbiAgdmFyIGJhc2UgPSAnJywgYXJyYXkgPSBmYWxzZSwgYnJhY2VzID0gWyd7JywgJ30nXTtcblxuICAvLyBNYWtlIEFycmF5IHNheSB0aGF0IHRoZXkgYXJlIEFycmF5XG4gIGlmIChpc0FycmF5KHZhbHVlKSkge1xuICAgIGFycmF5ID0gdHJ1ZTtcbiAgICBicmFjZXMgPSBbJ1snLCAnXSddO1xuICB9XG5cbiAgLy8gTWFrZSBmdW5jdGlvbnMgc2F5IHRoYXQgdGhleSBhcmUgZnVuY3Rpb25zXG4gIGlmIChpc0Z1bmN0aW9uKHZhbHVlKSkge1xuICAgIHZhciBuID0gdmFsdWUubmFtZSA/ICc6ICcgKyB2YWx1ZS5uYW1lIDogJyc7XG4gICAgYmFzZSA9ICcgW0Z1bmN0aW9uJyArIG4gKyAnXSc7XG4gIH1cblxuICAvLyBNYWtlIFJlZ0V4cHMgc2F5IHRoYXQgdGhleSBhcmUgUmVnRXhwc1xuICBpZiAoaXNSZWdFeHAodmFsdWUpKSB7XG4gICAgYmFzZSA9ICcgJyArIFJlZ0V4cC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh2YWx1ZSk7XG4gIH1cblxuICAvLyBNYWtlIGRhdGVzIHdpdGggcHJvcGVydGllcyBmaXJzdCBzYXkgdGhlIGRhdGVcbiAgaWYgKGlzRGF0ZSh2YWx1ZSkpIHtcbiAgICBiYXNlID0gJyAnICsgRGF0ZS5wcm90b3R5cGUudG9VVENTdHJpbmcuY2FsbCh2YWx1ZSk7XG4gIH1cblxuICAvLyBNYWtlIGVycm9yIHdpdGggbWVzc2FnZSBmaXJzdCBzYXkgdGhlIGVycm9yXG4gIGlmIChpc0Vycm9yKHZhbHVlKSkge1xuICAgIGJhc2UgPSAnICcgKyBmb3JtYXRFcnJvcih2YWx1ZSk7XG4gIH1cblxuICBpZiAoa2V5cy5sZW5ndGggPT09IDAgJiYgKCFhcnJheSB8fCB2YWx1ZS5sZW5ndGggPT0gMCkpIHtcbiAgICByZXR1cm4gYnJhY2VzWzBdICsgYmFzZSArIGJyYWNlc1sxXTtcbiAgfVxuXG4gIGlmIChyZWN1cnNlVGltZXMgPCAwKSB7XG4gICAgaWYgKGlzUmVnRXhwKHZhbHVlKSkge1xuICAgICAgcmV0dXJuIGN0eC5zdHlsaXplKFJlZ0V4cC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh2YWx1ZSksICdyZWdleHAnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgcmV0dXJuIGN0eC5zdHlsaXplKCdbT2JqZWN0XScsICdzcGVjaWFsJyk7XG4gICAgfVxuICB9XG5cbiAgY3R4LnNlZW4ucHVzaCh2YWx1ZSk7XG5cbiAgdmFyIG91dHB1dDtcbiAgaWYgKGFycmF5KSB7XG4gICAgb3V0cHV0ID0gZm9ybWF0QXJyYXkoY3R4LCB2YWx1ZSwgcmVjdXJzZVRpbWVzLCB2aXNpYmxlS2V5cywga2V5cyk7XG4gIH0gZWxzZSB7XG4gICAgb3V0cHV0ID0ga2V5cy5tYXAoZnVuY3Rpb24oa2V5KSB7XG4gICAgICByZXR1cm4gZm9ybWF0UHJvcGVydHkoY3R4LCB2YWx1ZSwgcmVjdXJzZVRpbWVzLCB2aXNpYmxlS2V5cywga2V5LCBhcnJheSk7XG4gICAgfSk7XG4gIH1cblxuICBjdHguc2Vlbi5wb3AoKTtcblxuICByZXR1cm4gcmVkdWNlVG9TaW5nbGVTdHJpbmcob3V0cHV0LCBiYXNlLCBicmFjZXMpO1xufVxuXG5cbmZ1bmN0aW9uIGZvcm1hdFByaW1pdGl2ZShjdHgsIHZhbHVlKSB7XG4gIGlmIChpc1VuZGVmaW5lZCh2YWx1ZSkpXG4gICAgcmV0dXJuIGN0eC5zdHlsaXplKCd1bmRlZmluZWQnLCAndW5kZWZpbmVkJyk7XG4gIGlmIChpc1N0cmluZyh2YWx1ZSkpIHtcbiAgICB2YXIgc2ltcGxlID0gJ1xcJycgKyBKU09OLnN0cmluZ2lmeSh2YWx1ZSkucmVwbGFjZSgvXlwifFwiJC9nLCAnJylcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5yZXBsYWNlKC8nL2csIFwiXFxcXCdcIilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5yZXBsYWNlKC9cXFxcXCIvZywgJ1wiJykgKyAnXFwnJztcbiAgICByZXR1cm4gY3R4LnN0eWxpemUoc2ltcGxlLCAnc3RyaW5nJyk7XG4gIH1cbiAgaWYgKGlzTnVtYmVyKHZhbHVlKSlcbiAgICByZXR1cm4gY3R4LnN0eWxpemUoJycgKyB2YWx1ZSwgJ251bWJlcicpO1xuICBpZiAoaXNCb29sZWFuKHZhbHVlKSlcbiAgICByZXR1cm4gY3R4LnN0eWxpemUoJycgKyB2YWx1ZSwgJ2Jvb2xlYW4nKTtcbiAgLy8gRm9yIHNvbWUgcmVhc29uIHR5cGVvZiBudWxsIGlzIFwib2JqZWN0XCIsIHNvIHNwZWNpYWwgY2FzZSBoZXJlLlxuICBpZiAoaXNOdWxsKHZhbHVlKSlcbiAgICByZXR1cm4gY3R4LnN0eWxpemUoJ251bGwnLCAnbnVsbCcpO1xufVxuXG5cbmZ1bmN0aW9uIGZvcm1hdEVycm9yKHZhbHVlKSB7XG4gIHJldHVybiAnWycgKyBFcnJvci5wcm90b3R5cGUudG9TdHJpbmcuY2FsbCh2YWx1ZSkgKyAnXSc7XG59XG5cblxuZnVuY3Rpb24gZm9ybWF0QXJyYXkoY3R4LCB2YWx1ZSwgcmVjdXJzZVRpbWVzLCB2aXNpYmxlS2V5cywga2V5cykge1xuICB2YXIgb3V0cHV0ID0gW107XG4gIGZvciAodmFyIGkgPSAwLCBsID0gdmFsdWUubGVuZ3RoOyBpIDwgbDsgKytpKSB7XG4gICAgaWYgKGhhc093blByb3BlcnR5KHZhbHVlLCBTdHJpbmcoaSkpKSB7XG4gICAgICBvdXRwdXQucHVzaChmb3JtYXRQcm9wZXJ0eShjdHgsIHZhbHVlLCByZWN1cnNlVGltZXMsIHZpc2libGVLZXlzLFxuICAgICAgICAgIFN0cmluZyhpKSwgdHJ1ZSkpO1xuICAgIH0gZWxzZSB7XG4gICAgICBvdXRwdXQucHVzaCgnJyk7XG4gICAgfVxuICB9XG4gIGtleXMuZm9yRWFjaChmdW5jdGlvbihrZXkpIHtcbiAgICBpZiAoIWtleS5tYXRjaCgvXlxcZCskLykpIHtcbiAgICAgIG91dHB1dC5wdXNoKGZvcm1hdFByb3BlcnR5KGN0eCwgdmFsdWUsIHJlY3Vyc2VUaW1lcywgdmlzaWJsZUtleXMsXG4gICAgICAgICAga2V5LCB0cnVlKSk7XG4gICAgfVxuICB9KTtcbiAgcmV0dXJuIG91dHB1dDtcbn1cblxuXG5mdW5jdGlvbiBmb3JtYXRQcm9wZXJ0eShjdHgsIHZhbHVlLCByZWN1cnNlVGltZXMsIHZpc2libGVLZXlzLCBrZXksIGFycmF5KSB7XG4gIHZhciBuYW1lLCBzdHIsIGRlc2M7XG4gIGRlc2MgPSBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKHZhbHVlLCBrZXkpIHx8IHsgdmFsdWU6IHZhbHVlW2tleV0gfTtcbiAgaWYgKGRlc2MuZ2V0KSB7XG4gICAgaWYgKGRlc2Muc2V0KSB7XG4gICAgICBzdHIgPSBjdHguc3R5bGl6ZSgnW0dldHRlci9TZXR0ZXJdJywgJ3NwZWNpYWwnKTtcbiAgICB9IGVsc2Uge1xuICAgICAgc3RyID0gY3R4LnN0eWxpemUoJ1tHZXR0ZXJdJywgJ3NwZWNpYWwnKTtcbiAgICB9XG4gIH0gZWxzZSB7XG4gICAgaWYgKGRlc2Muc2V0KSB7XG4gICAgICBzdHIgPSBjdHguc3R5bGl6ZSgnW1NldHRlcl0nLCAnc3BlY2lhbCcpO1xuICAgIH1cbiAgfVxuICBpZiAoIWhhc093blByb3BlcnR5KHZpc2libGVLZXlzLCBrZXkpKSB7XG4gICAgbmFtZSA9ICdbJyArIGtleSArICddJztcbiAgfVxuICBpZiAoIXN0cikge1xuICAgIGlmIChjdHguc2Vlbi5pbmRleE9mKGRlc2MudmFsdWUpIDwgMCkge1xuICAgICAgaWYgKGlzTnVsbChyZWN1cnNlVGltZXMpKSB7XG4gICAgICAgIHN0ciA9IGZvcm1hdFZhbHVlKGN0eCwgZGVzYy52YWx1ZSwgbnVsbCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBzdHIgPSBmb3JtYXRWYWx1ZShjdHgsIGRlc2MudmFsdWUsIHJlY3Vyc2VUaW1lcyAtIDEpO1xuICAgICAgfVxuICAgICAgaWYgKHN0ci5pbmRleE9mKCdcXG4nKSA+IC0xKSB7XG4gICAgICAgIGlmIChhcnJheSkge1xuICAgICAgICAgIHN0ciA9IHN0ci5zcGxpdCgnXFxuJykubWFwKGZ1bmN0aW9uKGxpbmUpIHtcbiAgICAgICAgICAgIHJldHVybiAnICAnICsgbGluZTtcbiAgICAgICAgICB9KS5qb2luKCdcXG4nKS5zdWJzdHIoMik7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgc3RyID0gJ1xcbicgKyBzdHIuc3BsaXQoJ1xcbicpLm1hcChmdW5jdGlvbihsaW5lKSB7XG4gICAgICAgICAgICByZXR1cm4gJyAgICcgKyBsaW5lO1xuICAgICAgICAgIH0pLmpvaW4oJ1xcbicpO1xuICAgICAgICB9XG4gICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgIHN0ciA9IGN0eC5zdHlsaXplKCdbQ2lyY3VsYXJdJywgJ3NwZWNpYWwnKTtcbiAgICB9XG4gIH1cbiAgaWYgKGlzVW5kZWZpbmVkKG5hbWUpKSB7XG4gICAgaWYgKGFycmF5ICYmIGtleS5tYXRjaCgvXlxcZCskLykpIHtcbiAgICAgIHJldHVybiBzdHI7XG4gICAgfVxuICAgIG5hbWUgPSBKU09OLnN0cmluZ2lmeSgnJyArIGtleSk7XG4gICAgaWYgKG5hbWUubWF0Y2goL15cIihbYS16QS1aX11bYS16QS1aXzAtOV0qKVwiJC8pKSB7XG4gICAgICBuYW1lID0gbmFtZS5zdWJzdHIoMSwgbmFtZS5sZW5ndGggLSAyKTtcbiAgICAgIG5hbWUgPSBjdHguc3R5bGl6ZShuYW1lLCAnbmFtZScpO1xuICAgIH0gZWxzZSB7XG4gICAgICBuYW1lID0gbmFtZS5yZXBsYWNlKC8nL2csIFwiXFxcXCdcIilcbiAgICAgICAgICAgICAgICAgLnJlcGxhY2UoL1xcXFxcIi9nLCAnXCInKVxuICAgICAgICAgICAgICAgICAucmVwbGFjZSgvKF5cInxcIiQpL2csIFwiJ1wiKTtcbiAgICAgIG5hbWUgPSBjdHguc3R5bGl6ZShuYW1lLCAnc3RyaW5nJyk7XG4gICAgfVxuICB9XG5cbiAgcmV0dXJuIG5hbWUgKyAnOiAnICsgc3RyO1xufVxuXG5cbmZ1bmN0aW9uIHJlZHVjZVRvU2luZ2xlU3RyaW5nKG91dHB1dCwgYmFzZSwgYnJhY2VzKSB7XG4gIHZhciBudW1MaW5lc0VzdCA9IDA7XG4gIHZhciBsZW5ndGggPSBvdXRwdXQucmVkdWNlKGZ1bmN0aW9uKHByZXYsIGN1cikge1xuICAgIG51bUxpbmVzRXN0Kys7XG4gICAgaWYgKGN1ci5pbmRleE9mKCdcXG4nKSA+PSAwKSBudW1MaW5lc0VzdCsrO1xuICAgIHJldHVybiBwcmV2ICsgY3VyLnJlcGxhY2UoL1xcdTAwMWJcXFtcXGRcXGQ/bS9nLCAnJykubGVuZ3RoICsgMTtcbiAgfSwgMCk7XG5cbiAgaWYgKGxlbmd0aCA+IDYwKSB7XG4gICAgcmV0dXJuIGJyYWNlc1swXSArXG4gICAgICAgICAgIChiYXNlID09PSAnJyA/ICcnIDogYmFzZSArICdcXG4gJykgK1xuICAgICAgICAgICAnICcgK1xuICAgICAgICAgICBvdXRwdXQuam9pbignLFxcbiAgJykgK1xuICAgICAgICAgICAnICcgK1xuICAgICAgICAgICBicmFjZXNbMV07XG4gIH1cblxuICByZXR1cm4gYnJhY2VzWzBdICsgYmFzZSArICcgJyArIG91dHB1dC5qb2luKCcsICcpICsgJyAnICsgYnJhY2VzWzFdO1xufVxuXG5cbi8vIE5PVEU6IFRoZXNlIHR5cGUgY2hlY2tpbmcgZnVuY3Rpb25zIGludGVudGlvbmFsbHkgZG9uJ3QgdXNlIGBpbnN0YW5jZW9mYFxuLy8gYmVjYXVzZSBpdCBpcyBmcmFnaWxlIGFuZCBjYW4gYmUgZWFzaWx5IGZha2VkIHdpdGggYE9iamVjdC5jcmVhdGUoKWAuXG5mdW5jdGlvbiBpc0FycmF5KGFyKSB7XG4gIHJldHVybiBBcnJheS5pc0FycmF5KGFyKTtcbn1cbmV4cG9ydHMuaXNBcnJheSA9IGlzQXJyYXk7XG5cbmZ1bmN0aW9uIGlzQm9vbGVhbihhcmcpIHtcbiAgcmV0dXJuIHR5cGVvZiBhcmcgPT09ICdib29sZWFuJztcbn1cbmV4cG9ydHMuaXNCb29sZWFuID0gaXNCb29sZWFuO1xuXG5mdW5jdGlvbiBpc051bGwoYXJnKSB7XG4gIHJldHVybiBhcmcgPT09IG51bGw7XG59XG5leHBvcnRzLmlzTnVsbCA9IGlzTnVsbDtcblxuZnVuY3Rpb24gaXNOdWxsT3JVbmRlZmluZWQoYXJnKSB7XG4gIHJldHVybiBhcmcgPT0gbnVsbDtcbn1cbmV4cG9ydHMuaXNOdWxsT3JVbmRlZmluZWQgPSBpc051bGxPclVuZGVmaW5lZDtcblxuZnVuY3Rpb24gaXNOdW1iZXIoYXJnKSB7XG4gIHJldHVybiB0eXBlb2YgYXJnID09PSAnbnVtYmVyJztcbn1cbmV4cG9ydHMuaXNOdW1iZXIgPSBpc051bWJlcjtcblxuZnVuY3Rpb24gaXNTdHJpbmcoYXJnKSB7XG4gIHJldHVybiB0eXBlb2YgYXJnID09PSAnc3RyaW5nJztcbn1cbmV4cG9ydHMuaXNTdHJpbmcgPSBpc1N0cmluZztcblxuZnVuY3Rpb24gaXNTeW1ib2woYXJnKSB7XG4gIHJldHVybiB0eXBlb2YgYXJnID09PSAnc3ltYm9sJztcbn1cbmV4cG9ydHMuaXNTeW1ib2wgPSBpc1N5bWJvbDtcblxuZnVuY3Rpb24gaXNVbmRlZmluZWQoYXJnKSB7XG4gIHJldHVybiBhcmcgPT09IHZvaWQgMDtcbn1cbmV4cG9ydHMuaXNVbmRlZmluZWQgPSBpc1VuZGVmaW5lZDtcblxuZnVuY3Rpb24gaXNSZWdFeHAocmUpIHtcbiAgcmV0dXJuIGlzT2JqZWN0KHJlKSAmJiBvYmplY3RUb1N0cmluZyhyZSkgPT09ICdbb2JqZWN0IFJlZ0V4cF0nO1xufVxuZXhwb3J0cy5pc1JlZ0V4cCA9IGlzUmVnRXhwO1xuXG5mdW5jdGlvbiBpc09iamVjdChhcmcpIHtcbiAgcmV0dXJuIHR5cGVvZiBhcmcgPT09ICdvYmplY3QnICYmIGFyZyAhPT0gbnVsbDtcbn1cbmV4cG9ydHMuaXNPYmplY3QgPSBpc09iamVjdDtcblxuZnVuY3Rpb24gaXNEYXRlKGQpIHtcbiAgcmV0dXJuIGlzT2JqZWN0KGQpICYmIG9iamVjdFRvU3RyaW5nKGQpID09PSAnW29iamVjdCBEYXRlXSc7XG59XG5leHBvcnRzLmlzRGF0ZSA9IGlzRGF0ZTtcblxuZnVuY3Rpb24gaXNFcnJvcihlKSB7XG4gIHJldHVybiBpc09iamVjdChlKSAmJlxuICAgICAgKG9iamVjdFRvU3RyaW5nKGUpID09PSAnW29iamVjdCBFcnJvcl0nIHx8IGUgaW5zdGFuY2VvZiBFcnJvcik7XG59XG5leHBvcnRzLmlzRXJyb3IgPSBpc0Vycm9yO1xuXG5mdW5jdGlvbiBpc0Z1bmN0aW9uKGFyZykge1xuICByZXR1cm4gdHlwZW9mIGFyZyA9PT0gJ2Z1bmN0aW9uJztcbn1cbmV4cG9ydHMuaXNGdW5jdGlvbiA9IGlzRnVuY3Rpb247XG5cbmZ1bmN0aW9uIGlzUHJpbWl0aXZlKGFyZykge1xuICByZXR1cm4gYXJnID09PSBudWxsIHx8XG4gICAgICAgICB0eXBlb2YgYXJnID09PSAnYm9vbGVhbicgfHxcbiAgICAgICAgIHR5cGVvZiBhcmcgPT09ICdudW1iZXInIHx8XG4gICAgICAgICB0eXBlb2YgYXJnID09PSAnc3RyaW5nJyB8fFxuICAgICAgICAgdHlwZW9mIGFyZyA9PT0gJ3N5bWJvbCcgfHwgIC8vIEVTNiBzeW1ib2xcbiAgICAgICAgIHR5cGVvZiBhcmcgPT09ICd1bmRlZmluZWQnO1xufVxuZXhwb3J0cy5pc1ByaW1pdGl2ZSA9IGlzUHJpbWl0aXZlO1xuXG5leHBvcnRzLmlzQnVmZmVyID0gcmVxdWlyZSgnLi9zdXBwb3J0L2lzQnVmZmVyJyk7XG5cbmZ1bmN0aW9uIG9iamVjdFRvU3RyaW5nKG8pIHtcbiAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUudG9TdHJpbmcuY2FsbChvKTtcbn1cblxuXG5mdW5jdGlvbiBwYWQobikge1xuICByZXR1cm4gbiA8IDEwID8gJzAnICsgbi50b1N0cmluZygxMCkgOiBuLnRvU3RyaW5nKDEwKTtcbn1cblxuXG52YXIgbW9udGhzID0gWydKYW4nLCAnRmViJywgJ01hcicsICdBcHInLCAnTWF5JywgJ0p1bicsICdKdWwnLCAnQXVnJywgJ1NlcCcsXG4gICAgICAgICAgICAgICdPY3QnLCAnTm92JywgJ0RlYyddO1xuXG4vLyAyNiBGZWIgMTY6MTk6MzRcbmZ1bmN0aW9uIHRpbWVzdGFtcCgpIHtcbiAgdmFyIGQgPSBuZXcgRGF0ZSgpO1xuICB2YXIgdGltZSA9IFtwYWQoZC5nZXRIb3VycygpKSxcbiAgICAgICAgICAgICAgcGFkKGQuZ2V0TWludXRlcygpKSxcbiAgICAgICAgICAgICAgcGFkKGQuZ2V0U2Vjb25kcygpKV0uam9pbignOicpO1xuICByZXR1cm4gW2QuZ2V0RGF0ZSgpLCBtb250aHNbZC5nZXRNb250aCgpXSwgdGltZV0uam9pbignICcpO1xufVxuXG5cbi8vIGxvZyBpcyBqdXN0IGEgdGhpbiB3cmFwcGVyIHRvIGNvbnNvbGUubG9nIHRoYXQgcHJlcGVuZHMgYSB0aW1lc3RhbXBcbmV4cG9ydHMubG9nID0gZnVuY3Rpb24oKSB7XG4gIGNvbnNvbGUubG9nKCclcyAtICVzJywgdGltZXN0YW1wKCksIGV4cG9ydHMuZm9ybWF0LmFwcGx5KGV4cG9ydHMsIGFyZ3VtZW50cykpO1xufTtcblxuXG4vKipcbiAqIEluaGVyaXQgdGhlIHByb3RvdHlwZSBtZXRob2RzIGZyb20gb25lIGNvbnN0cnVjdG9yIGludG8gYW5vdGhlci5cbiAqXG4gKiBUaGUgRnVuY3Rpb24ucHJvdG90eXBlLmluaGVyaXRzIGZyb20gbGFuZy5qcyByZXdyaXR0ZW4gYXMgYSBzdGFuZGFsb25lXG4gKiBmdW5jdGlvbiAobm90IG9uIEZ1bmN0aW9uLnByb3RvdHlwZSkuIE5PVEU6IElmIHRoaXMgZmlsZSBpcyB0byBiZSBsb2FkZWRcbiAqIGR1cmluZyBib290c3RyYXBwaW5nIHRoaXMgZnVuY3Rpb24gbmVlZHMgdG8gYmUgcmV3cml0dGVuIHVzaW5nIHNvbWUgbmF0aXZlXG4gKiBmdW5jdGlvbnMgYXMgcHJvdG90eXBlIHNldHVwIHVzaW5nIG5vcm1hbCBKYXZhU2NyaXB0IGRvZXMgbm90IHdvcmsgYXNcbiAqIGV4cGVjdGVkIGR1cmluZyBib290c3RyYXBwaW5nIChzZWUgbWlycm9yLmpzIGluIHIxMTQ5MDMpLlxuICpcbiAqIEBwYXJhbSB7ZnVuY3Rpb259IGN0b3IgQ29uc3RydWN0b3IgZnVuY3Rpb24gd2hpY2ggbmVlZHMgdG8gaW5oZXJpdCB0aGVcbiAqICAgICBwcm90b3R5cGUuXG4gKiBAcGFyYW0ge2Z1bmN0aW9ufSBzdXBlckN0b3IgQ29uc3RydWN0b3IgZnVuY3Rpb24gdG8gaW5oZXJpdCBwcm90b3R5cGUgZnJvbS5cbiAqL1xuZXhwb3J0cy5pbmhlcml0cyA9IHJlcXVpcmUoJ2luaGVyaXRzJyk7XG5cbmV4cG9ydHMuX2V4dGVuZCA9IGZ1bmN0aW9uKG9yaWdpbiwgYWRkKSB7XG4gIC8vIERvbid0IGRvIGFueXRoaW5nIGlmIGFkZCBpc24ndCBhbiBvYmplY3RcbiAgaWYgKCFhZGQgfHwgIWlzT2JqZWN0KGFkZCkpIHJldHVybiBvcmlnaW47XG5cbiAgdmFyIGtleXMgPSBPYmplY3Qua2V5cyhhZGQpO1xuICB2YXIgaSA9IGtleXMubGVuZ3RoO1xuICB3aGlsZSAoaS0tKSB7XG4gICAgb3JpZ2luW2tleXNbaV1dID0gYWRkW2tleXNbaV1dO1xuICB9XG4gIHJldHVybiBvcmlnaW47XG59O1xuXG5mdW5jdGlvbiBoYXNPd25Qcm9wZXJ0eShvYmosIHByb3ApIHtcbiAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmosIHByb3ApO1xufVxuIiwibW9kdWxlLmV4cG9ydHMuVmVjdG9yVGlsZSA9IHJlcXVpcmUoJy4vbGliL3ZlY3RvcnRpbGUuanMnKTtcbm1vZHVsZS5leHBvcnRzLlZlY3RvclRpbGVGZWF0dXJlID0gcmVxdWlyZSgnLi9saWIvdmVjdG9ydGlsZWZlYXR1cmUuanMnKTtcbm1vZHVsZS5leHBvcnRzLlZlY3RvclRpbGVMYXllciA9IHJlcXVpcmUoJy4vbGliL3ZlY3RvcnRpbGVsYXllci5qcycpO1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgVmVjdG9yVGlsZUxheWVyID0gcmVxdWlyZSgnLi92ZWN0b3J0aWxlbGF5ZXInKTtcblxubW9kdWxlLmV4cG9ydHMgPSBWZWN0b3JUaWxlO1xuXG5mdW5jdGlvbiBWZWN0b3JUaWxlKHBiZiwgZW5kKSB7XG4gICAgdGhpcy5sYXllcnMgPSBwYmYucmVhZEZpZWxkcyhyZWFkVGlsZSwge30sIGVuZCk7XG59XG5cbmZ1bmN0aW9uIHJlYWRUaWxlKHRhZywgbGF5ZXJzLCBwYmYpIHtcbiAgICBpZiAodGFnID09PSAzKSB7XG4gICAgICAgIHZhciBsYXllciA9IG5ldyBWZWN0b3JUaWxlTGF5ZXIocGJmLCBwYmYucmVhZFZhcmludCgpICsgcGJmLnBvcyk7XG4gICAgICAgIGlmIChsYXllci5sZW5ndGgpIGxheWVyc1tsYXllci5uYW1lXSA9IGxheWVyO1xuICAgIH1cbn1cblxuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgUG9pbnQgPSByZXF1aXJlKCdwb2ludC1nZW9tZXRyeScpO1xuXG5tb2R1bGUuZXhwb3J0cyA9IFZlY3RvclRpbGVGZWF0dXJlO1xuXG5mdW5jdGlvbiBWZWN0b3JUaWxlRmVhdHVyZShwYmYsIGVuZCwgZXh0ZW50LCBrZXlzLCB2YWx1ZXMpIHtcbiAgICAvLyBQdWJsaWNcbiAgICB0aGlzLnByb3BlcnRpZXMgPSB7fTtcbiAgICB0aGlzLmV4dGVudCA9IGV4dGVudDtcbiAgICB0aGlzLnR5cGUgPSAwO1xuXG4gICAgLy8gUHJpdmF0ZVxuICAgIHRoaXMuX3BiZiA9IHBiZjtcbiAgICB0aGlzLl9nZW9tZXRyeSA9IC0xO1xuICAgIHRoaXMuX2tleXMgPSBrZXlzO1xuICAgIHRoaXMuX3ZhbHVlcyA9IHZhbHVlcztcblxuICAgIHBiZi5yZWFkRmllbGRzKHJlYWRGZWF0dXJlLCB0aGlzLCBlbmQpO1xufVxuXG5mdW5jdGlvbiByZWFkRmVhdHVyZSh0YWcsIGZlYXR1cmUsIHBiZikge1xuICAgIGlmICh0YWcgPT0gMSkgZmVhdHVyZS5faWQgPSBwYmYucmVhZFZhcmludCgpO1xuICAgIGVsc2UgaWYgKHRhZyA9PSAyKSByZWFkVGFnKHBiZiwgZmVhdHVyZSk7XG4gICAgZWxzZSBpZiAodGFnID09IDMpIGZlYXR1cmUudHlwZSA9IHBiZi5yZWFkVmFyaW50KCk7XG4gICAgZWxzZSBpZiAodGFnID09IDQpIGZlYXR1cmUuX2dlb21ldHJ5ID0gcGJmLnBvcztcbn1cblxuZnVuY3Rpb24gcmVhZFRhZyhwYmYsIGZlYXR1cmUpIHtcbiAgICB2YXIgZW5kID0gcGJmLnJlYWRWYXJpbnQoKSArIHBiZi5wb3M7XG5cbiAgICB3aGlsZSAocGJmLnBvcyA8IGVuZCkge1xuICAgICAgICB2YXIga2V5ID0gZmVhdHVyZS5fa2V5c1twYmYucmVhZFZhcmludCgpXSxcbiAgICAgICAgICAgIHZhbHVlID0gZmVhdHVyZS5fdmFsdWVzW3BiZi5yZWFkVmFyaW50KCldO1xuICAgICAgICBmZWF0dXJlLnByb3BlcnRpZXNba2V5XSA9IHZhbHVlO1xuICAgIH1cbn1cblxuVmVjdG9yVGlsZUZlYXR1cmUudHlwZXMgPSBbJ1Vua25vd24nLCAnUG9pbnQnLCAnTGluZVN0cmluZycsICdQb2x5Z29uJ107XG5cblZlY3RvclRpbGVGZWF0dXJlLnByb3RvdHlwZS5sb2FkR2VvbWV0cnkgPSBmdW5jdGlvbigpIHtcbiAgICB2YXIgcGJmID0gdGhpcy5fcGJmO1xuICAgIHBiZi5wb3MgPSB0aGlzLl9nZW9tZXRyeTtcblxuICAgIHZhciBlbmQgPSBwYmYucmVhZFZhcmludCgpICsgcGJmLnBvcyxcbiAgICAgICAgY21kID0gMSxcbiAgICAgICAgbGVuZ3RoID0gMCxcbiAgICAgICAgeCA9IDAsXG4gICAgICAgIHkgPSAwLFxuICAgICAgICBsaW5lcyA9IFtdLFxuICAgICAgICBsaW5lO1xuXG4gICAgd2hpbGUgKHBiZi5wb3MgPCBlbmQpIHtcbiAgICAgICAgaWYgKCFsZW5ndGgpIHtcbiAgICAgICAgICAgIHZhciBjbWRMZW4gPSBwYmYucmVhZFZhcmludCgpO1xuICAgICAgICAgICAgY21kID0gY21kTGVuICYgMHg3O1xuICAgICAgICAgICAgbGVuZ3RoID0gY21kTGVuID4+IDM7XG4gICAgICAgIH1cblxuICAgICAgICBsZW5ndGgtLTtcblxuICAgICAgICBpZiAoY21kID09PSAxIHx8IGNtZCA9PT0gMikge1xuICAgICAgICAgICAgeCArPSBwYmYucmVhZFNWYXJpbnQoKTtcbiAgICAgICAgICAgIHkgKz0gcGJmLnJlYWRTVmFyaW50KCk7XG5cbiAgICAgICAgICAgIGlmIChjbWQgPT09IDEpIHsgLy8gbW92ZVRvXG4gICAgICAgICAgICAgICAgaWYgKGxpbmUpIGxpbmVzLnB1c2gobGluZSk7XG4gICAgICAgICAgICAgICAgbGluZSA9IFtdO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBsaW5lLnB1c2gobmV3IFBvaW50KHgsIHkpKTtcblxuICAgICAgICB9IGVsc2UgaWYgKGNtZCA9PT0gNykge1xuICAgICAgICAgICAgbGluZS5wdXNoKGxpbmVbMF0uY2xvbmUoKSk7IC8vIGNsb3NlUG9seWdvblxuXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ3Vua25vd24gY29tbWFuZCAnICsgY21kKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGlmIChsaW5lKSBsaW5lcy5wdXNoKGxpbmUpO1xuXG4gICAgcmV0dXJuIGxpbmVzO1xufTtcblxuVmVjdG9yVGlsZUZlYXR1cmUucHJvdG90eXBlLmJib3ggPSBmdW5jdGlvbigpIHtcbiAgICB2YXIgcGJmID0gdGhpcy5fcGJmO1xuICAgIHBiZi5wb3MgPSB0aGlzLl9nZW9tZXRyeTtcblxuICAgIHZhciBlbmQgPSBwYmYucmVhZFZhcmludCgpICsgcGJmLnBvcyxcbiAgICAgICAgY21kID0gMSxcbiAgICAgICAgbGVuZ3RoID0gMCxcbiAgICAgICAgeCA9IDAsXG4gICAgICAgIHkgPSAwLFxuICAgICAgICB4MSA9IEluZmluaXR5LFxuICAgICAgICB4MiA9IC1JbmZpbml0eSxcbiAgICAgICAgeTEgPSBJbmZpbml0eSxcbiAgICAgICAgeTIgPSAtSW5maW5pdHk7XG5cbiAgICB3aGlsZSAocGJmLnBvcyA8IGVuZCkge1xuICAgICAgICBpZiAoIWxlbmd0aCkge1xuICAgICAgICAgICAgdmFyIGNtZExlbiA9IHBiZi5yZWFkVmFyaW50KCk7XG4gICAgICAgICAgICBjbWQgPSBjbWRMZW4gJiAweDc7XG4gICAgICAgICAgICBsZW5ndGggPSBjbWRMZW4gPj4gMztcbiAgICAgICAgfVxuXG4gICAgICAgIGxlbmd0aC0tO1xuXG4gICAgICAgIGlmIChjbWQgPT09IDEgfHwgY21kID09PSAyKSB7XG4gICAgICAgICAgICB4ICs9IHBiZi5yZWFkU1ZhcmludCgpO1xuICAgICAgICAgICAgeSArPSBwYmYucmVhZFNWYXJpbnQoKTtcbiAgICAgICAgICAgIGlmICh4IDwgeDEpIHgxID0geDtcbiAgICAgICAgICAgIGlmICh4ID4geDIpIHgyID0geDtcbiAgICAgICAgICAgIGlmICh5IDwgeTEpIHkxID0geTtcbiAgICAgICAgICAgIGlmICh5ID4geTIpIHkyID0geTtcblxuICAgICAgICB9IGVsc2UgaWYgKGNtZCAhPT0gNykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCd1bmtub3duIGNvbW1hbmQgJyArIGNtZCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gW3gxLCB5MSwgeDIsIHkyXTtcbn07XG5cblZlY3RvclRpbGVGZWF0dXJlLnByb3RvdHlwZS50b0dlb0pTT04gPSBmdW5jdGlvbih4LCB5LCB6KSB7XG4gICAgdmFyIHNpemUgPSB0aGlzLmV4dGVudCAqIE1hdGgucG93KDIsIHopLFxuICAgICAgICB4MCA9IHRoaXMuZXh0ZW50ICogeCxcbiAgICAgICAgeTAgPSB0aGlzLmV4dGVudCAqIHksXG4gICAgICAgIGNvb3JkcyA9IHRoaXMubG9hZEdlb21ldHJ5KCksXG4gICAgICAgIHR5cGUgPSBWZWN0b3JUaWxlRmVhdHVyZS50eXBlc1t0aGlzLnR5cGVdO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjb29yZHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgdmFyIGxpbmUgPSBjb29yZHNbaV07XG4gICAgICAgIGZvciAodmFyIGogPSAwOyBqIDwgbGluZS5sZW5ndGg7IGorKykge1xuICAgICAgICAgICAgdmFyIHAgPSBsaW5lW2pdLCB5MiA9IDE4MCAtIChwLnkgKyB5MCkgKiAzNjAgLyBzaXplO1xuICAgICAgICAgICAgbGluZVtqXSA9IFtcbiAgICAgICAgICAgICAgICAocC54ICsgeDApICogMzYwIC8gc2l6ZSAtIDE4MCxcbiAgICAgICAgICAgICAgICAzNjAgLyBNYXRoLlBJICogTWF0aC5hdGFuKE1hdGguZXhwKHkyICogTWF0aC5QSSAvIDE4MCkpIC0gOTBcbiAgICAgICAgICAgIF07XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBpZiAodHlwZSA9PT0gJ1BvaW50JyAmJiBjb29yZHMubGVuZ3RoID09PSAxKSB7XG4gICAgICAgIGNvb3JkcyA9IGNvb3Jkc1swXVswXTtcbiAgICB9IGVsc2UgaWYgKHR5cGUgPT09ICdQb2ludCcpIHtcbiAgICAgICAgY29vcmRzID0gY29vcmRzWzBdO1xuICAgICAgICB0eXBlID0gJ011bHRpUG9pbnQnO1xuICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ0xpbmVTdHJpbmcnICYmIGNvb3Jkcy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgY29vcmRzID0gY29vcmRzWzBdO1xuICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ0xpbmVTdHJpbmcnKSB7XG4gICAgICAgIHR5cGUgPSAnTXVsdGlMaW5lU3RyaW5nJztcbiAgICB9XG5cbiAgICByZXR1cm4ge1xuICAgICAgICB0eXBlOiBcIkZlYXR1cmVcIixcbiAgICAgICAgZ2VvbWV0cnk6IHtcbiAgICAgICAgICAgIHR5cGU6IHR5cGUsXG4gICAgICAgICAgICBjb29yZGluYXRlczogY29vcmRzXG4gICAgICAgIH0sXG4gICAgICAgIHByb3BlcnRpZXM6IHRoaXMucHJvcGVydGllc1xuICAgIH07XG59O1xuIiwiJ3VzZSBzdHJpY3QnO1xuXG52YXIgVmVjdG9yVGlsZUZlYXR1cmUgPSByZXF1aXJlKCcuL3ZlY3RvcnRpbGVmZWF0dXJlLmpzJyk7XG5cbm1vZHVsZS5leHBvcnRzID0gVmVjdG9yVGlsZUxheWVyO1xuXG5mdW5jdGlvbiBWZWN0b3JUaWxlTGF5ZXIocGJmLCBlbmQpIHtcbiAgICAvLyBQdWJsaWNcbiAgICB0aGlzLnZlcnNpb24gPSAxO1xuICAgIHRoaXMubmFtZSA9IG51bGw7XG4gICAgdGhpcy5leHRlbnQgPSA0MDk2O1xuICAgIHRoaXMubGVuZ3RoID0gMDtcblxuICAgIC8vIFByaXZhdGVcbiAgICB0aGlzLl9wYmYgPSBwYmY7XG4gICAgdGhpcy5fa2V5cyA9IFtdO1xuICAgIHRoaXMuX3ZhbHVlcyA9IFtdO1xuICAgIHRoaXMuX2ZlYXR1cmVzID0gW107XG5cbiAgICBwYmYucmVhZEZpZWxkcyhyZWFkTGF5ZXIsIHRoaXMsIGVuZCk7XG5cbiAgICB0aGlzLmxlbmd0aCA9IHRoaXMuX2ZlYXR1cmVzLmxlbmd0aDtcbn1cblxuZnVuY3Rpb24gcmVhZExheWVyKHRhZywgbGF5ZXIsIHBiZikge1xuICAgIGlmICh0YWcgPT09IDE1KSBsYXllci52ZXJzaW9uID0gcGJmLnJlYWRWYXJpbnQoKTtcbiAgICBlbHNlIGlmICh0YWcgPT09IDEpIGxheWVyLm5hbWUgPSBwYmYucmVhZFN0cmluZygpO1xuICAgIGVsc2UgaWYgKHRhZyA9PT0gNSkgbGF5ZXIuZXh0ZW50ID0gcGJmLnJlYWRWYXJpbnQoKTtcbiAgICBlbHNlIGlmICh0YWcgPT09IDIpIGxheWVyLl9mZWF0dXJlcy5wdXNoKHBiZi5wb3MpO1xuICAgIGVsc2UgaWYgKHRhZyA9PT0gMykgbGF5ZXIuX2tleXMucHVzaChwYmYucmVhZFN0cmluZygpKTtcbiAgICBlbHNlIGlmICh0YWcgPT09IDQpIGxheWVyLl92YWx1ZXMucHVzaChyZWFkVmFsdWVNZXNzYWdlKHBiZikpO1xufVxuXG5mdW5jdGlvbiByZWFkVmFsdWVNZXNzYWdlKHBiZikge1xuICAgIHZhciB2YWx1ZSA9IG51bGwsXG4gICAgICAgIGVuZCA9IHBiZi5yZWFkVmFyaW50KCkgKyBwYmYucG9zO1xuXG4gICAgd2hpbGUgKHBiZi5wb3MgPCBlbmQpIHtcbiAgICAgICAgdmFyIHRhZyA9IHBiZi5yZWFkVmFyaW50KCkgPj4gMztcblxuICAgICAgICB2YWx1ZSA9IHRhZyA9PT0gMSA/IHBiZi5yZWFkU3RyaW5nKCkgOlxuICAgICAgICAgICAgdGFnID09PSAyID8gcGJmLnJlYWRGbG9hdCgpIDpcbiAgICAgICAgICAgIHRhZyA9PT0gMyA/IHBiZi5yZWFkRG91YmxlKCkgOlxuICAgICAgICAgICAgdGFnID09PSA0ID8gcGJmLnJlYWRWYXJpbnQ2NCgpIDpcbiAgICAgICAgICAgIHRhZyA9PT0gNSA/IHBiZi5yZWFkVmFyaW50KCkgOlxuICAgICAgICAgICAgdGFnID09PSA2ID8gcGJmLnJlYWRTVmFyaW50KCkgOlxuICAgICAgICAgICAgdGFnID09PSA3ID8gcGJmLnJlYWRCb29sZWFuKCkgOiBudWxsO1xuICAgIH1cblxuICAgIHJldHVybiB2YWx1ZTtcbn1cblxuLy8gcmV0dXJuIGZlYXR1cmUgYGlgIGZyb20gdGhpcyBsYXllciBhcyBhIGBWZWN0b3JUaWxlRmVhdHVyZWBcblZlY3RvclRpbGVMYXllci5wcm90b3R5cGUuZmVhdHVyZSA9IGZ1bmN0aW9uKGkpIHtcbiAgICBpZiAoaSA8IDAgfHwgaSA+PSB0aGlzLl9mZWF0dXJlcy5sZW5ndGgpIHRocm93IG5ldyBFcnJvcignZmVhdHVyZSBpbmRleCBvdXQgb2YgYm91bmRzJyk7XG5cbiAgICB0aGlzLl9wYmYucG9zID0gdGhpcy5fZmVhdHVyZXNbaV07XG5cbiAgICB2YXIgZW5kID0gdGhpcy5fcGJmLnJlYWRWYXJpbnQoKSArIHRoaXMuX3BiZi5wb3M7XG4gICAgcmV0dXJuIG5ldyBWZWN0b3JUaWxlRmVhdHVyZSh0aGlzLl9wYmYsIGVuZCwgdGhpcy5leHRlbnQsIHRoaXMuX2tleXMsIHRoaXMuX3ZhbHVlcyk7XG59O1xuIiwiLy8gR2VvbWV0cnkgYnVpbGRpbmcgZnVuY3Rpb25zXG5pbXBvcnQgR2VvIGZyb20gJy4uL2dlbyc7XG5cbmV4cG9ydCBjb25zdCB0aWxlX2JvdW5kcyA9IFtcbiAgICB7IHg6IDAsIHk6IDB9LFxuICAgIHsgeDogR2VvLnRpbGVfc2NhbGUsIHk6IC1HZW8udGlsZV9zY2FsZSB9IC8vIFRPRE86IGNvcnJlY3QgZm9yIGZsaXBwZWQgeS1heGlzP1xuXTtcblxuZXhwb3J0IGNvbnN0IGRlZmF1bHRfdXZzID0gWzAsIDAsIDEsIDFdO1xuXG4vLyBUZXN0cyBpZiBhIGxpbmUgc2VnbWVudCAoZnJvbSBwb2ludCBBIHRvIEIpIGlzIG91dHNpZGUgdGhlIHRpbGUgYm91bmRzXG4vLyAod2l0aGluIGEgY2VydGFpbiB0b2xlcmFuY2UgdG8gYWNjb3VudCBmb3IgZ2VvbWV0cnkgbmVhcmx5IG9uIHRpbGUgZWRnZXMpXG5leHBvcnQgZnVuY3Rpb24gb3V0c2lkZVRpbGUgKF9hLCBfYiwgdG9sZXJhbmNlKSB7XG4gICAgbGV0IHRpbGVfbWluID0gdGlsZV9ib3VuZHNbMF07XG4gICAgbGV0IHRpbGVfbWF4ID0gdGlsZV9ib3VuZHNbMV07XG5cbiAgICAvLyBUT0RPOiBmaXggZmxpcHBlZCBZIGNvb3JkcyBoZXJlLCBjb25mdXNpbmcgd2l0aCAnbWF4JyByZWZlcmVuY2VcbiAgICBpZiAoKF9hWzBdIDw9IHRpbGVfbWluLnggKyB0b2xlcmFuY2UgJiYgX2JbMF0gPD0gdGlsZV9taW4ueCArIHRvbGVyYW5jZSkgfHxcbiAgICAgICAgKF9hWzBdID49IHRpbGVfbWF4LnggLSB0b2xlcmFuY2UgJiYgX2JbMF0gPj0gdGlsZV9tYXgueCAtIHRvbGVyYW5jZSkgfHxcbiAgICAgICAgKF9hWzFdID49IHRpbGVfbWluLnkgLSB0b2xlcmFuY2UgJiYgX2JbMV0gPj0gdGlsZV9taW4ueSAtIHRvbGVyYW5jZSkgfHxcbiAgICAgICAgKF9hWzFdIDw9IHRpbGVfbWF4LnkgKyB0b2xlcmFuY2UgJiYgX2JbMV0gPD0gdGlsZV9tYXgueSArIHRvbGVyYW5jZSkpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgcmV0dXJuIGZhbHNlO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gaXNDb29yZE91dHNpZGVUaWxlIChjb29yZCwgdG9sZXJhbmNlKSB7XG4gICAgdG9sZXJhbmNlID0gdG9sZXJhbmNlIHx8IDA7XG4gICAgbGV0IHRpbGVfbWluID0gdGlsZV9ib3VuZHNbMF07XG4gICAgbGV0IHRpbGVfbWF4ID0gdGlsZV9ib3VuZHNbMV07XG5cbiAgICByZXR1cm4gY29vcmRbMF0gPD0gdGlsZV9taW4ueCArIHRvbGVyYW5jZSB8fFxuICAgICAgICAgICBjb29yZFswXSA+PSB0aWxlX21heC54IC0gdG9sZXJhbmNlIHx8XG4gICAgICAgICAgIGNvb3JkWzFdID49IHRpbGVfbWluLnkgLSB0b2xlcmFuY2UgfHxcbiAgICAgICAgICAgY29vcmRbMV0gPD0gdGlsZV9tYXgueSArIHRvbGVyYW5jZTtcbn1cbiIsIi8vIFBvaW50IGJ1aWxkZXJzXG5pbXBvcnQgeyBkZWZhdWx0X3V2cyB9IGZyb20gJy4vY29tbW9uJztcblxuLy8gQnVpbGQgYSBiaWxsYm9hcmQgc3ByaXRlIHF1YWQgY2VudGVyZWQgb24gYSBwb2ludC4gU3ByaXRlcyBhcmUgaW50ZW5kZWQgdG8gYmUgZHJhd24gaW4gc2NyZWVuc3BhY2UsIGFuZCBoYXZlXG4vLyBwcm9wZXJ0aWVzIGZvciB3aWR0aCwgaGVpZ2h0LCBhbmdsZSwgYW5kIGEgc2NhbGUgZmFjdG9yIHRoYXQgY2FuIGJlIHVzZWQgdG8gaW50ZXJwb2xhdGUgdGhlIHNjcmVlbnNwYWNlIHNpemVcbi8vIG9mIGEgc3ByaXRlIGJldHdlZW4gdHdvIHpvb20gbGV2ZWxzLlxuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkUXVhZHNGb3JQb2ludHMgKHBvaW50cywgdmVydGV4X2RhdGEsIHZlcnRleF90ZW1wbGF0ZSxcbiAgICB7IHRleGNvb3JkX2luZGV4LCBwb3NpdGlvbl9pbmRleCwgc2hhcGVfaW5kZXgsIG9mZnNldF9pbmRleCB9LFxuICAgIHsgcXVhZCwgcXVhZF9ub3JtYWxpemUsIG9mZnNldCwgYW5nbGUsIHNoYXBlX3csIHRleGNvb3JkX3NjYWxlLCB0ZXhjb29yZF9ub3JtYWxpemUgfSkge1xuICAgIHF1YWRfbm9ybWFsaXplID0gcXVhZF9ub3JtYWxpemUgfHwgMTtcbiAgICBsZXQgdzIgPSBxdWFkWzBdIC8gMiAqIHF1YWRfbm9ybWFsaXplO1xuICAgIGxldCBoMiA9IHF1YWRbMV0gLyAyICogcXVhZF9ub3JtYWxpemU7XG4gICAgbGV0IHNjYWxpbmcgPSBbXG4gICAgICAgIFstdzIsIC1oMl0sXG4gICAgICAgIFt3MiwgLWgyXSxcbiAgICAgICAgW3cyLCBoMl0sXG4gICAgICAgIFstdzIsIGgyXVxuICAgIF07XG5cbiAgICBsZXQgdmVydGV4X2VsZW1lbnRzID0gdmVydGV4X2RhdGEudmVydGV4X2VsZW1lbnRzO1xuICAgIGxldCBlbGVtZW50X29mZnNldCA9IHZlcnRleF9kYXRhLnZlcnRleF9jb3VudDtcblxuICAgIGxldCB0ZXhjb29yZHM7XG4gICAgaWYgKHRleGNvb3JkX2luZGV4KSB7XG4gICAgICAgIHRleGNvb3JkX25vcm1hbGl6ZSA9IHRleGNvb3JkX25vcm1hbGl6ZSB8fCAxO1xuXG4gICAgICAgIHZhciBbbWluX3UsIG1pbl92LCBtYXhfdSwgbWF4X3ZdID0gdGV4Y29vcmRfc2NhbGUgfHwgZGVmYXVsdF91dnM7XG4gICAgICAgIHRleGNvb3JkcyA9IFtcbiAgICAgICAgICAgIFttaW5fdSwgbWluX3ZdLFxuICAgICAgICAgICAgW21heF91LCBtaW5fdl0sXG4gICAgICAgICAgICBbbWF4X3UsIG1heF92XSxcbiAgICAgICAgICAgIFttaW5fdSwgbWF4X3ZdXG4gICAgICAgIF07XG4gICAgfVxuXG4gICAgbGV0IG51bV9wb2ludHMgPSBwb2ludHMubGVuZ3RoO1xuICAgIGZvciAobGV0IHA9MDsgcCA8IG51bV9wb2ludHM7IHArKykge1xuICAgICAgICBsZXQgcG9pbnQgPSBwb2ludHNbcF07XG5cbiAgICAgICAgZm9yIChsZXQgcG9zPTA7IHBvcyA8IDQ7IHBvcysrKSB7XG4gICAgICAgICAgICAvLyBBZGQgdGV4Y29vcmRzXG4gICAgICAgICAgICBpZiAodGV4Y29vcmRfaW5kZXgpIHtcbiAgICAgICAgICAgICAgICB2ZXJ0ZXhfdGVtcGxhdGVbdGV4Y29vcmRfaW5kZXggKyAwXSA9IHRleGNvb3Jkc1twb3NdWzBdICogdGV4Y29vcmRfbm9ybWFsaXplO1xuICAgICAgICAgICAgICAgIHZlcnRleF90ZW1wbGF0ZVt0ZXhjb29yZF9pbmRleCArIDFdID0gdGV4Y29vcmRzW3Bvc11bMV0gKiB0ZXhjb29yZF9ub3JtYWxpemU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHZlcnRleF90ZW1wbGF0ZVtwb3NpdGlvbl9pbmRleCArIDBdID0gcG9pbnRbMF07XG4gICAgICAgICAgICB2ZXJ0ZXhfdGVtcGxhdGVbcG9zaXRpb25faW5kZXggKyAxXSA9IHBvaW50WzFdO1xuXG4gICAgICAgICAgICB2ZXJ0ZXhfdGVtcGxhdGVbc2hhcGVfaW5kZXggKyAwXSA9IHNjYWxpbmdbcG9zXVswXTtcbiAgICAgICAgICAgIHZlcnRleF90ZW1wbGF0ZVtzaGFwZV9pbmRleCArIDFdID0gc2NhbGluZ1twb3NdWzFdO1xuICAgICAgICAgICAgdmVydGV4X3RlbXBsYXRlW3NoYXBlX2luZGV4ICsgMl0gPSBhbmdsZTtcbiAgICAgICAgICAgIHZlcnRleF90ZW1wbGF0ZVtzaGFwZV9pbmRleCArIDNdID0gc2hhcGVfdztcblxuICAgICAgICAgICAgdmVydGV4X3RlbXBsYXRlW29mZnNldF9pbmRleCArIDBdID0gb2Zmc2V0WzBdO1xuICAgICAgICAgICAgdmVydGV4X3RlbXBsYXRlW29mZnNldF9pbmRleCArIDFdID0gb2Zmc2V0WzFdO1xuXG4gICAgICAgICAgICB2ZXJ0ZXhfZGF0YS5hZGRWZXJ0ZXgodmVydGV4X3RlbXBsYXRlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHZlcnRleF9lbGVtZW50cy5wdXNoKGVsZW1lbnRfb2Zmc2V0ICsgMCk7XG4gICAgICAgIHZlcnRleF9lbGVtZW50cy5wdXNoKGVsZW1lbnRfb2Zmc2V0ICsgMSk7XG4gICAgICAgIHZlcnRleF9lbGVtZW50cy5wdXNoKGVsZW1lbnRfb2Zmc2V0ICsgMik7XG4gICAgICAgIHZlcnRleF9lbGVtZW50cy5wdXNoKGVsZW1lbnRfb2Zmc2V0ICsgMik7XG4gICAgICAgIHZlcnRleF9lbGVtZW50cy5wdXNoKGVsZW1lbnRfb2Zmc2V0ICsgMyk7XG4gICAgICAgIHZlcnRleF9lbGVtZW50cy5wdXNoKGVsZW1lbnRfb2Zmc2V0ICsgMCk7XG5cbiAgICAgICAgZWxlbWVudF9vZmZzZXQgKz0gNDtcbiAgICB9XG59XG4iLCIvLyBQb2x5Z29uIGJ1aWxkZXJzXG5pbXBvcnQgR2VvIGZyb20gJy4uL2dlbyc7XG5pbXBvcnQgVmVjdG9yIGZyb20gJy4uL3ZlY3Rvcic7XG5pbXBvcnQgeyBkZWZhdWx0X3V2cywgb3V0c2lkZVRpbGUgfSBmcm9tICcuL2NvbW1vbic7XG5cbmltcG9ydCBlYXJjdXQgZnJvbSAnZWFyY3V0JztcblxuY29uc3QgdXBfdmVjMyA9IFswLCAwLCAxXTtcblxuLy8gVGVzc2VsYXRlIGEgZmxhdCAyRCBwb2x5Z29uXG4vLyB4ICYgeSBjb29yZGluYXRlcyB3aWxsIGJlIHNldCBhcyBmaXJzdCB0d28gZWxlbWVudHMgb2YgcHJvdmlkZWQgdmVydGV4X3RlbXBsYXRlXG5leHBvcnQgZnVuY3Rpb24gYnVpbGRQb2x5Z29ucyAoXG4gICAgcG9seWdvbnMsXG4gICAgdmVydGV4X2RhdGEsIHZlcnRleF90ZW1wbGF0ZSxcbiAgICB7IHRleGNvb3JkX2luZGV4LCB0ZXhjb29yZF9zY2FsZSwgdGV4Y29vcmRfbm9ybWFsaXplIH0pIHtcblxuICAgIHZhciB2ZXJ0ZXhfZWxlbWVudHMgPSB2ZXJ0ZXhfZGF0YS52ZXJ0ZXhfZWxlbWVudHM7XG5cbiAgICBpZiAodGV4Y29vcmRfaW5kZXgpIHtcbiAgICAgICAgdGV4Y29vcmRfbm9ybWFsaXplID0gdGV4Y29vcmRfbm9ybWFsaXplIHx8IDE7XG4gICAgICAgIHZhciBbbWluX3UsIG1pbl92LCBtYXhfdSwgbWF4X3ZdID0gdGV4Y29vcmRfc2NhbGUgfHwgZGVmYXVsdF91dnM7XG4gICAgfVxuXG4gICAgdmFyIG51bV9wb2x5Z29ucyA9IHBvbHlnb25zLmxlbmd0aDtcbiAgICBmb3IgKHZhciBwPTA7IHAgPCBudW1fcG9seWdvbnM7IHArKykge1xuICAgICAgICB2YXIgZWxlbWVudF9vZmZzZXQgPSB2ZXJ0ZXhfZGF0YS52ZXJ0ZXhfY291bnQ7XG5cbiAgICAgICAgdmFyIHBvbHlnb24gPSBwb2x5Z29uc1twXTtcblxuICAgICAgICAvLyBGaW5kIHBvbHlnb24gZXh0ZW50cyB0byBjYWxjdWxhdGUgVVZzLCBmaXQgdGhlbSB0byB0aGUgYXhpcy1hbGlnbmVkIGJvdW5kaW5nIGJveFxuICAgICAgICBpZiAodGV4Y29vcmRfaW5kZXgpIHtcbiAgICAgICAgICAgIHZhciBbbWluX3gsIG1pbl95LCBtYXhfeCwgbWF4X3ldID0gR2VvLmZpbmRCb3VuZGluZ0JveChwb2x5Z29uKTtcbiAgICAgICAgICAgIHZhciBzcGFuX3ggPSBtYXhfeCAtIG1pbl94O1xuICAgICAgICAgICAgdmFyIHNwYW5feSA9IG1heF95IC0gbWluX3k7XG4gICAgICAgICAgICB2YXIgc2NhbGVfdSA9IChtYXhfdSAtIG1pbl91KSAvIHNwYW5feDtcbiAgICAgICAgICAgIHZhciBzY2FsZV92ID0gKG1heF92IC0gbWluX3YpIC8gc3Bhbl95O1xuICAgICAgICB9XG5cbiAgICAgICAgZm9yICh2YXIgcmluZ19pbmRleCA9IDA7IHJpbmdfaW5kZXggPCBwb2x5Z29uLmxlbmd0aDsgcmluZ19pbmRleCsrKXtcbiAgICAgICAgICAgIC8vIEFkZCB2ZXJ0ZXggZGF0YVxuICAgICAgICAgICAgdmFyIHBvbHlnb25fcmluZyA9IHBvbHlnb25bcmluZ19pbmRleF07XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBvbHlnb25fcmluZy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIHZhciB2ZXJ0ZXggPSBwb2x5Z29uX3JpbmdbaV07XG4gICAgICAgICAgICAgICAgdmVydGV4X3RlbXBsYXRlWzBdID0gdmVydGV4WzBdO1xuICAgICAgICAgICAgICAgIHZlcnRleF90ZW1wbGF0ZVsxXSA9IHZlcnRleFsxXTtcblxuICAgICAgICAgICAgICAgIC8vIEFkZCBVVnNcbiAgICAgICAgICAgICAgICBpZiAodGV4Y29vcmRfaW5kZXgpIHtcbiAgICAgICAgICAgICAgICAgICAgdmVydGV4X3RlbXBsYXRlW3RleGNvb3JkX2luZGV4ICsgMF0gPSAoKHZlcnRleFswXSAtIG1pbl94KSAqIHNjYWxlX3UgKyBtaW5fdSkgKiB0ZXhjb29yZF9ub3JtYWxpemU7XG4gICAgICAgICAgICAgICAgICAgIHZlcnRleF90ZW1wbGF0ZVt0ZXhjb29yZF9pbmRleCArIDFdID0gKCh2ZXJ0ZXhbMV0gLSBtaW5feSkgKiBzY2FsZV92ICsgbWluX3YpICogdGV4Y29vcmRfbm9ybWFsaXplO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHZlcnRleF9kYXRhLmFkZFZlcnRleCh2ZXJ0ZXhfdGVtcGxhdGUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gQWRkIGVsZW1lbnQgaW5kaWNlc1xuICAgICAgICB2YXIgaW5kaWNlcyA9IHRyaWFuZ3VsYXRlUG9seWdvbihlYXJjdXQuZmxhdHRlbihwb2x5Z29uKSk7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgaW5kaWNlcy5sZW5ndGg7IGkrKyl7XG4gICAgICAgICAgICB2ZXJ0ZXhfZWxlbWVudHMucHVzaChlbGVtZW50X29mZnNldCArIGluZGljZXNbaV0pO1xuICAgICAgICB9XG4gICAgfVxufVxuXG4vLyBUZXNzZWxhdGUgYW5kIGV4dHJ1ZGUgYSBmbGF0IDJEIHBvbHlnb24gaW50byBhIHNpbXBsZSAzRCBtb2RlbCB3aXRoIGZpeGVkIGhlaWdodCBhbmQgYWRkIHRvIEdMIHZlcnRleCBidWZmZXJcbmV4cG9ydCBmdW5jdGlvbiBidWlsZEV4dHJ1ZGVkUG9seWdvbnMgKFxuICAgIHBvbHlnb25zLFxuICAgIHosIGhlaWdodCwgbWluX2hlaWdodCxcbiAgICB2ZXJ0ZXhfZGF0YSwgdmVydGV4X3RlbXBsYXRlLFxuICAgIG5vcm1hbF9pbmRleCxcbiAgICBub3JtYWxfbm9ybWFsaXplLFxuICAgIHtcbiAgICAgICAgcmVtb3ZlX3RpbGVfZWRnZXMsXG4gICAgICAgIHRpbGVfZWRnZV90b2xlcmFuY2UsXG4gICAgICAgIHRleGNvb3JkX2luZGV4LFxuICAgICAgICB0ZXhjb29yZF9zY2FsZSxcbiAgICAgICAgdGV4Y29vcmRfbm9ybWFsaXplLFxuICAgICAgICB3aW5kaW5nXG4gICAgfSkge1xuXG4gICAgLy8gVG9wXG4gICAgdmFyIG1pbl96ID0geiArIChtaW5faGVpZ2h0IHx8IDApO1xuICAgIHZhciBtYXhfeiA9IHogKyBoZWlnaHQ7XG4gICAgdmVydGV4X3RlbXBsYXRlWzJdID0gbWF4X3o7XG4gICAgYnVpbGRQb2x5Z29ucyhwb2x5Z29ucywgdmVydGV4X2RhdGEsIHZlcnRleF90ZW1wbGF0ZSwgeyB0ZXhjb29yZF9pbmRleCwgdGV4Y29vcmRfc2NhbGUsIHRleGNvb3JkX25vcm1hbGl6ZSB9KTtcblxuICAgIHZhciB2ZXJ0ZXhfZWxlbWVudHMgPSB2ZXJ0ZXhfZGF0YS52ZXJ0ZXhfZWxlbWVudHM7XG4gICAgdmFyIGVsZW1lbnRfb2Zmc2V0ID0gdmVydGV4X2RhdGEudmVydGV4X2NvdW50O1xuXG4gICAgLy8gV2FsbHNcbiAgICAvLyBGaXQgVVZzIHRvIHdhbGwgcXVhZFxuICAgIGlmICh0ZXhjb29yZF9pbmRleCkge1xuICAgICAgICB0ZXhjb29yZF9ub3JtYWxpemUgPSB0ZXhjb29yZF9ub3JtYWxpemUgfHwgMTtcbiAgICAgICAgdmFyIFttaW5fdSwgbWluX3YsIG1heF91LCBtYXhfdl0gPSB0ZXhjb29yZF9zY2FsZSB8fCBkZWZhdWx0X3V2cztcbiAgICAgICAgdmFyIHRleGNvb3JkcyA9IFtcbiAgICAgICAgICAgIFttaW5fdSwgbWF4X3ZdLFxuICAgICAgICAgICAgW21pbl91LCBtaW5fdl0sXG4gICAgICAgICAgICBbbWF4X3UsIG1pbl92XSxcbiAgICAgICAgICAgIFttYXhfdSwgbWF4X3ZdXG4gICAgICAgIF07XG4gICAgfVxuXG4gICAgdmFyIG51bV9wb2x5Z29ucyA9IHBvbHlnb25zLmxlbmd0aDtcbiAgICBmb3IgKHZhciBwPTA7IHAgPCBudW1fcG9seWdvbnM7IHArKykge1xuICAgICAgICB2YXIgcG9seWdvbiA9IHBvbHlnb25zW3BdO1xuXG4gICAgICAgIGZvciAodmFyIHE9MDsgcSA8IHBvbHlnb24ubGVuZ3RoOyBxKyspIHtcbiAgICAgICAgICAgIHZhciBjb250b3VyID0gcG9seWdvbltxXTtcblxuICAgICAgICAgICAgZm9yICh2YXIgdz0wOyB3IDwgY29udG91ci5sZW5ndGggLSAxOyB3KyspIHtcbiAgICAgICAgICAgICAgICBpZiAocmVtb3ZlX3RpbGVfZWRnZXMgJiYgb3V0c2lkZVRpbGUoY29udG91clt3XSwgY29udG91clt3KzFdLCB0aWxlX2VkZ2VfdG9sZXJhbmNlKSkge1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsgLy8gZG9uJ3QgZXh0cnVkZSB0aWxlIGVkZ2VzXG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gV2FsbCBvcmRlciBpcyBkZXBlbmRlbnQgb24gd2luZGluZyBvcmRlciwgc28gdGhhdCBub3JtYWxzIGZhY2Ugb3V0d2FyZFxuICAgICAgICAgICAgICAgIGxldCB3MCwgdzE7XG4gICAgICAgICAgICAgICAgaWYgKHdpbmRpbmcgPT09ICdDQ1cnKSB7XG4gICAgICAgICAgICAgICAgICAgIHcwID0gdztcbiAgICAgICAgICAgICAgICAgICAgdzEgPSB3KzE7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB3MCA9IHcrMTtcbiAgICAgICAgICAgICAgICAgICAgdzEgPSB3O1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIFR3byB0cmlhbmdsZXMgZm9yIHRoZSBxdWFkIGZvcm1lZCBieSBlYWNoIHZlcnRleCBwYWlyLCBnb2luZyBmcm9tIGJvdHRvbSB0byB0b3AgaGVpZ2h0XG4gICAgICAgICAgICAgICAgdmFyIHdhbGxfdmVydGljZXMgPSBbXG4gICAgICAgICAgICAgICAgICAgIFtjb250b3VyW3cxXVswXSwgY29udG91clt3MV1bMV0sIG1heF96XSxcbiAgICAgICAgICAgICAgICAgICAgW2NvbnRvdXJbdzFdWzBdLCBjb250b3VyW3cxXVsxXSwgbWluX3pdLFxuICAgICAgICAgICAgICAgICAgICBbY29udG91clt3MF1bMF0sIGNvbnRvdXJbdzBdWzFdLCBtaW5fel0sXG4gICAgICAgICAgICAgICAgICAgIFtjb250b3VyW3cwXVswXSwgY29udG91clt3MF1bMV0sIG1heF96XVxuICAgICAgICAgICAgICAgIF07XG5cbiAgICAgICAgICAgICAgICAvLyBDYWxjIHRoZSBub3JtYWwgb2YgdGhlIHdhbGwgZnJvbSB1cCB2ZWN0b3IgYW5kIG9uZSBzZWdtZW50IG9mIHRoZSB3YWxsIHRyaWFuZ2xlc1xuICAgICAgICAgICAgICAgIGxldCB3YWxsX3ZlYyA9IFZlY3Rvci5ub3JtYWxpemUoW2NvbnRvdXJbdzFdWzBdIC0gY29udG91clt3MF1bMF0sIGNvbnRvdXJbdzFdWzFdIC0gY29udG91clt3MF1bMV0sIDBdKTtcbiAgICAgICAgICAgICAgICBsZXQgbm9ybWFsID0gVmVjdG9yLmNyb3NzKHVwX3ZlYzMsIHdhbGxfdmVjKTtcblxuICAgICAgICAgICAgICAgIC8vIFVwZGF0ZSB2ZXJ0ZXggdGVtcGxhdGUgd2l0aCBjdXJyZW50IHN1cmZhY2Ugbm9ybWFsXG4gICAgICAgICAgICAgICAgdmVydGV4X3RlbXBsYXRlW25vcm1hbF9pbmRleCArIDBdID0gbm9ybWFsWzBdICogbm9ybWFsX25vcm1hbGl6ZTtcbiAgICAgICAgICAgICAgICB2ZXJ0ZXhfdGVtcGxhdGVbbm9ybWFsX2luZGV4ICsgMV0gPSBub3JtYWxbMV0gKiBub3JtYWxfbm9ybWFsaXplO1xuICAgICAgICAgICAgICAgIHZlcnRleF90ZW1wbGF0ZVtub3JtYWxfaW5kZXggKyAyXSA9IG5vcm1hbFsyXSAqIG5vcm1hbF9ub3JtYWxpemU7XG5cbiAgICAgICAgICAgICAgICBmb3IgKHZhciB3dj0wOyB3diA8IHdhbGxfdmVydGljZXMubGVuZ3RoOyB3disrKSB7XG4gICAgICAgICAgICAgICAgICAgIHZlcnRleF90ZW1wbGF0ZVswXSA9IHdhbGxfdmVydGljZXNbd3ZdWzBdO1xuICAgICAgICAgICAgICAgICAgICB2ZXJ0ZXhfdGVtcGxhdGVbMV0gPSB3YWxsX3ZlcnRpY2VzW3d2XVsxXTtcbiAgICAgICAgICAgICAgICAgICAgdmVydGV4X3RlbXBsYXRlWzJdID0gd2FsbF92ZXJ0aWNlc1t3dl1bMl07XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHRleGNvb3JkX2luZGV4KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2ZXJ0ZXhfdGVtcGxhdGVbdGV4Y29vcmRfaW5kZXggKyAwXSA9IHRleGNvb3Jkc1t3dl1bMF0gKiB0ZXhjb29yZF9ub3JtYWxpemU7XG4gICAgICAgICAgICAgICAgICAgICAgICB2ZXJ0ZXhfdGVtcGxhdGVbdGV4Y29vcmRfaW5kZXggKyAxXSA9IHRleGNvb3Jkc1t3dl1bMV0gKiB0ZXhjb29yZF9ub3JtYWxpemU7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICB2ZXJ0ZXhfZGF0YS5hZGRWZXJ0ZXgodmVydGV4X3RlbXBsYXRlKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICB2ZXJ0ZXhfZWxlbWVudHMucHVzaChlbGVtZW50X29mZnNldCArIDApO1xuICAgICAgICAgICAgICAgIHZlcnRleF9lbGVtZW50cy5wdXNoKGVsZW1lbnRfb2Zmc2V0ICsgMSk7XG4gICAgICAgICAgICAgICAgdmVydGV4X2VsZW1lbnRzLnB1c2goZWxlbWVudF9vZmZzZXQgKyAyKTtcbiAgICAgICAgICAgICAgICB2ZXJ0ZXhfZWxlbWVudHMucHVzaChlbGVtZW50X29mZnNldCArIDIpO1xuICAgICAgICAgICAgICAgIHZlcnRleF9lbGVtZW50cy5wdXNoKGVsZW1lbnRfb2Zmc2V0ICsgMyk7XG4gICAgICAgICAgICAgICAgdmVydGV4X2VsZW1lbnRzLnB1c2goZWxlbWVudF9vZmZzZXQgKyAwKTtcblxuICAgICAgICAgICAgICAgIGVsZW1lbnRfb2Zmc2V0ICs9IDQ7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59XG5cbi8vIFRyaWFuZ3VsYXRpb24gdXNpbmcgZWFyY3V0XG4vLyBodHRwczovL2dpdGh1Yi5jb20vbWFwYm94L2VhcmN1dFxuZXhwb3J0IGZ1bmN0aW9uIHRyaWFuZ3VsYXRlUG9seWdvbiAoZGF0YSkge1xuICAgIHJldHVybiBlYXJjdXQoZGF0YS52ZXJ0aWNlcywgZGF0YS5ob2xlcywgZGF0YS5kaW1lbnNpb25zKTtcbn1cbiIsIi8vIEdlb21ldHJ5IGJ1aWxkaW5nIGZ1bmN0aW9uc1xuXG5pbXBvcnQgVmVjdG9yIGZyb20gJy4uL3ZlY3Rvcic7XG5pbXBvcnQgR2VvIGZyb20gJy4uL2dlbyc7XG5pbXBvcnQge291dHNpZGVUaWxlLCBpc0Nvb3JkT3V0c2lkZVRpbGV9IGZyb20gJy4vY29tbW9uJztcblxuY29uc3QgemVyb192ZWMyID0gWzAsIDBdO1xuXG4vLyBCdWlsZCB0ZXNzZWxsYXRlZCB0cmlhbmdsZXMgZm9yIGEgcG9seWxpbmVcbmNvbnN0IENBUF9UWVBFID0ge1xuICAgIGJ1dHQ6IDAsXG4gICAgc3F1YXJlOiAxLFxuICAgIHJvdW5kOiAyXG59O1xuXG5jb25zdCBKT0lOX1RZUEUgPSB7XG4gICAgbWl0ZXI6IDAsXG4gICAgYmV2ZWw6IDEsXG4gICAgcm91bmQ6IDJcbn07XG5cbmNvbnN0IERFRkFVTFQgPSB7XG4gICAgTUlURVJfTElNSVQ6IDMsXG4gICAgVEVYQ09PUkRfTk9STUFMSVpFOiAxLFxuICAgIFRFWENPT1JEX1JBVElPOiAxLFxuICAgIE1JTl9GQU5fV0lEVEg6IDUgICAgICAgIC8vIFdpZHRoIG9mIGxpbmUgaW4gdGlsZSB1bml0cyB0byBwbGFjZSAxIHRyaWFuZ2xlIHBlciBmYW5cbn07XG5cbi8vIFNjYWxpbmcgZmFjdG9yIHRvIGFkZCBwcmVjaXNpb24gdG8gbGluZSB0ZXh0dXJlIFYgY29vcmRpbmF0ZSBwYWNrZWQgYXMgbm9ybWFsaXplZCBzaG9ydFxuY29uc3Qgdl9zY2FsZV9hZGp1c3QgPSBHZW8udGlsZV9zY2FsZTtcblxuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkUG9seWxpbmVzIChsaW5lcywgd2lkdGgsIHZlcnRleF9kYXRhLCB2ZXJ0ZXhfdGVtcGxhdGUsXG4gICAge1xuICAgICAgICBjbG9zZWRfcG9seWdvbixcbiAgICAgICAgcmVtb3ZlX3RpbGVfZWRnZXMsXG4gICAgICAgIHRpbGVfZWRnZV90b2xlcmFuY2UsXG4gICAgICAgIHRleGNvb3JkX2luZGV4LFxuICAgICAgICB0ZXhjb29yZF9zY2FsZSxcbiAgICAgICAgdGV4Y29vcmRfd2lkdGgsXG4gICAgICAgIHRleGNvb3JkX3JhdGlvLFxuICAgICAgICB0ZXhjb29yZF9ub3JtYWxpemUsXG4gICAgICAgIHNjYWxpbmdfaW5kZXgsXG4gICAgICAgIHNjYWxpbmdfbm9ybWFsaXplLFxuICAgICAgICBqb2luLCBjYXAsXG4gICAgICAgIG1pdGVyX2xpbWl0XG4gICAgfSkge1xuXG4gICAgdmFyIGNhcF90eXBlID0gY2FwID8gQ0FQX1RZUEVbY2FwXSA6IENBUF9UWVBFLmJ1dHQ7XG4gICAgdmFyIGpvaW5fdHlwZSA9IGpvaW4gPyBKT0lOX1RZUEVbam9pbl0gOiBKT0lOX1RZUEUubWl0ZXI7XG5cbiAgICAvLyBDb25maWd1cmUgbWl0ZXIgbGltaXRcbiAgICBpZiAoam9pbl90eXBlID09PSBKT0lOX1RZUEUubWl0ZXIpIHtcbiAgICAgICAgbWl0ZXJfbGltaXQgPSBtaXRlcl9saW1pdCB8fCBERUZBVUxULk1JVEVSX0xJTUlUOyAvLyBkZWZhdWx0IG1pdGVyIGxpbWl0XG4gICAgICAgIHZhciBtaXRlcl9sZW5fc3EgPSBtaXRlcl9saW1pdCAqIG1pdGVyX2xpbWl0O1xuICAgIH1cblxuICAgIC8vIFRleHR1cmUgVmFyaWFibGVzXG4gICAgdmFyIHZfc2NhbGU7XG4gICAgaWYgKHRleGNvb3JkX2luZGV4KSB7XG4gICAgICAgIHRleGNvb3JkX25vcm1hbGl6ZSA9IHRleGNvb3JkX25vcm1hbGl6ZSB8fCBERUZBVUxULlRFWENPT1JEX05PUk1BTElaRTtcbiAgICAgICAgdGV4Y29vcmRfcmF0aW8gPSB0ZXhjb29yZF9yYXRpbyB8fCBERUZBVUxULlRFWENPT1JEX1JBVElPO1xuICAgICAgICB2X3NjYWxlID0gMSAvICh0ZXhjb29yZF93aWR0aCAqIHRleGNvb3JkX3JhdGlvICogdl9zY2FsZV9hZGp1c3QpOyAvLyBzY2FsZXMgbGluZSB0ZXh0dXJlIGFzIGEgcmF0aW8gb2YgdGhlIGxpbmUncyB3aWR0aFxuICAgIH1cblxuICAgIC8vIFZhbHVlcyB0aGF0IGFyZSBjb25zdGFudCBmb3IgZWFjaCBsaW5lIGFuZCBhcmUgcGFzc2VkIHRvIGhlbHBlciBmdW5jdGlvbnNcbiAgICB2YXIgY29udGV4dCA9IHtcbiAgICAgICAgY2xvc2VkX3BvbHlnb24sXG4gICAgICAgIHJlbW92ZV90aWxlX2VkZ2VzLFxuICAgICAgICB0aWxlX2VkZ2VfdG9sZXJhbmNlLFxuICAgICAgICBtaXRlcl9sZW5fc3EsXG4gICAgICAgIGpvaW5fdHlwZSxcbiAgICAgICAgY2FwX3R5cGUsXG4gICAgICAgIHZlcnRleF9kYXRhLFxuICAgICAgICB2ZXJ0ZXhfdGVtcGxhdGUsXG4gICAgICAgIGhhbGZfd2lkdGg6IHdpZHRoIC8gMixcbiAgICAgICAgc2NhbGluZ19pbmRleCxcbiAgICAgICAgc2NhbGluZ19ub3JtYWxpemUsXG4gICAgICAgIHZfc2NhbGUsXG4gICAgICAgIHRleGNvb3JkX2luZGV4LFxuICAgICAgICB0ZXhjb29yZF93aWR0aCxcbiAgICAgICAgdGV4Y29vcmRfbm9ybWFsaXplXG4gICAgfTtcblxuICAgIC8vIEJ1ZmZlciBmb3IgZXh0cmEgbGluZXMgdG8gcHJvY2Vzc1xuICAgIHZhciBleHRyYV9saW5lcyA9IFtdO1xuXG4gICAgLy8gUHJvY2VzcyBsaW5lc1xuICAgIGZvciAobGV0IGluZGV4ID0gMDsgaW5kZXggPCBsaW5lcy5sZW5ndGg7IGluZGV4KyspIHtcbiAgICAgICAgYnVpbGRQb2x5bGluZShsaW5lc1tpbmRleF0sIGNvbnRleHQsIGV4dHJhX2xpbmVzKTtcbiAgICB9XG5cbiAgICAvLyBQcm9jZXNzIGV4dHJhIGxpbmVzXG4gICAgZm9yIChsZXQgaW5kZXggPSAwOyBpbmRleCA8IGV4dHJhX2xpbmVzLmxlbmd0aDsgaW5kZXgrKykge1xuICAgICAgICBidWlsZFBvbHlsaW5lKGV4dHJhX2xpbmVzW2luZGV4XSwgY29udGV4dCwgZXh0cmFfbGluZXMpO1xuICAgIH1cbn1cblxuZnVuY3Rpb24gYnVpbGRQb2x5bGluZShsaW5lLCBjb250ZXh0LCBleHRyYV9saW5lcyl7XG4gICAgLy8gU2tpcCBpZiBsaW5lIGlzIG5vdCB2YWxpZFxuICAgIGlmIChsaW5lLmxlbmd0aCA8IDIpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIHZhciB7am9pbl90eXBlLCBjYXBfdHlwZSwgY2xvc2VkX3BvbHlnb24sIHJlbW92ZV90aWxlX2VkZ2VzLCB0aWxlX2VkZ2VfdG9sZXJhbmNlLCB2X3NjYWxlLCBtaXRlcl9sZW5fc3F9ID0gY29udGV4dDtcblxuICAgIC8vIExvb3AgYmFja3dhcmRzIHRocm91Z2ggbGluZSB0byBhIHRpbGUgYm91bmRhcnkgaWYgZm91bmRcbiAgICBpZiAoY2xvc2VkX3BvbHlnb24gJiYgam9pbl90eXBlID09PSBKT0lOX1RZUEUubWl0ZXIpIHtcbiAgICAgICAgdmFyIGJvdW5kYXJ5SW5kZXggPSBnZXRUaWxlQm91bmRhcnlJbmRleChsaW5lKTtcbiAgICAgICAgaWYgKGJvdW5kYXJ5SW5kZXggIT09IDApIHtcbiAgICAgICAgICAgIC8vIGNyZWF0ZSBuZXcgbGluZSB0aGF0IGlzIGEgY3ljbGljIHBlcm11dGF0aW9uIG9mIHRoZSBvcmlnaW5hbFxuICAgICAgICAgICAgdmFyIHBlcm11dGVkTGluZSA9IHBlcm11dGVMaW5lKGxpbmUsIGJvdW5kYXJ5SW5kZXgpO1xuICAgICAgICAgICAgZXh0cmFfbGluZXMucHVzaChwZXJtdXRlZExpbmUpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgdmFyIGNvb3JkQ3VyciwgY29vcmROZXh0LCBub3JtUHJldiwgbm9ybU5leHQ7XG4gICAgdmFyIHYgPSAwOyAvLyBUZXh0dXJlIHYtY29vcmRpbmF0ZVxuXG4gICAgdmFyIGluZGV4X3N0YXJ0ID0gMDtcbiAgICB2YXIgaW5kZXhfZW5kID0gbGluZS5sZW5ndGggLSAxO1xuICAgIHZhciBpZ25vcmVkX2luZGljZXNfY291bnQgPSAwO1xuXG4gICAgLy8gRklSU1QgUE9JTlRcbiAgICAvLyBsb29wIHRocm91Z2ggYmVnaW5uaW5nIHBvaW50cyBpZiBkdXBsaWNhdGVzXG4gICAgY29vcmRDdXJyID0gbGluZVtpbmRleF9zdGFydF07XG4gICAgY29vcmROZXh0ID0gbGluZVtpbmRleF9zdGFydCArIDFdO1xuICAgIHdoaWxlIChWZWN0b3IuaXNFcXVhbChjb29yZEN1cnIsIGNvb3JkTmV4dCkpIHtcbiAgICAgICAgaW5kZXhfc3RhcnQrKztcbiAgICAgICAgY29vcmRDdXJyID0gY29vcmROZXh0O1xuICAgICAgICBjb29yZE5leHQgPSBsaW5lW2luZGV4X3N0YXJ0ICsgMV07XG4gICAgICAgIGlnbm9yZWRfaW5kaWNlc19jb3VudCsrO1xuICAgICAgICBpZiAoaW5kZXhfc3RhcnQgPT09IGxpbmUubGVuZ3RoIC0gMSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gbG9vcCB0aHJvdWdoIGVuZGluZyBwb2ludHMgdG8gY2hlY2sgZm9yIGR1cGxpY2F0ZXNcbiAgICB3aGlsZSAoVmVjdG9yLmlzRXF1YWwobGluZVtpbmRleF9lbmRdLCBsaW5lW2luZGV4X2VuZCAtIDFdKSkge1xuICAgICAgICBpbmRleF9lbmQtLTtcbiAgICAgICAgaWdub3JlZF9pbmRpY2VzX2NvdW50Kys7XG4gICAgICAgIGlmIChpbmRleF9lbmQgPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGlmIChsaW5lLmxlbmd0aCA8IDIgKyBpZ25vcmVkX2luZGljZXNfY291bnQpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cblxuICAgIG5vcm1OZXh0ID0gVmVjdG9yLm5vcm1hbGl6ZShWZWN0b3IucGVycChjb29yZEN1cnIsIGNvb3JkTmV4dCkpO1xuXG4gICAgLy8gU2tpcCB0aWxlIGJvdW5kYXJ5IGxpbmVzIGFuZCBhcHBlbmQgYSBuZXcgbGluZSBpZiBuZWVkZWRcbiAgICBpZiAocmVtb3ZlX3RpbGVfZWRnZXMgJiYgb3V0c2lkZVRpbGUoY29vcmRDdXJyLCBjb29yZE5leHQsIHRpbGVfZWRnZV90b2xlcmFuY2UpKSB7XG4gICAgICAgIHZhciBub25Cb3VuZGFyeVNlZ21lbnQgPSBnZXROZXh0Tm9uQm91bmRhcnlTZWdtZW50KGxpbmUsIGluZGV4X3N0YXJ0LCB0aWxlX2VkZ2VfdG9sZXJhbmNlKTtcbiAgICAgICAgaWYgKG5vbkJvdW5kYXJ5U2VnbWVudCkge1xuICAgICAgICAgICAgZXh0cmFfbGluZXMucHVzaChub25Cb3VuZGFyeVNlZ21lbnQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAoY2xvc2VkX3BvbHlnb24pe1xuICAgICAgICAvLyBCZWdpbiB0aGUgcG9seWdvbiB3aXRoIGEgam9pbiAoY29ubmVjdGluZyB0aGUgZmlyc3QgYW5kIGxhc3Qgc2VnbWVudHMpXG4gICAgICAgIG5vcm1QcmV2ID0gVmVjdG9yLm5vcm1hbGl6ZShWZWN0b3IucGVycChsaW5lW2luZGV4X2VuZCAtIDFdLCBjb29yZEN1cnIpKTtcbiAgICAgICAgc3RhcnRQb2x5Z29uKGNvb3JkQ3Vyciwgbm9ybVByZXYsIG5vcm1OZXh0LCBqb2luX3R5cGUsIGNvbnRleHQpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgLy8gSWYgbGluZSBiZWdpbnMgYXQgZWRnZSwgZG9uJ3QgYWRkIGEgY2FwXG4gICAgICAgIGlmICghaXNDb29yZE91dHNpZGVUaWxlKGNvb3JkQ3VycikpIHtcbiAgICAgICAgICAgIGFkZENhcChjb29yZEN1cnIsIHYsIG5vcm1OZXh0LCBjYXBfdHlwZSwgdHJ1ZSwgY29udGV4dCk7XG4gICAgICAgICAgICBpZiAoY2FwX3R5cGUgIT09IENBUF9UWVBFLmJ1dHQpIHtcbiAgICAgICAgICAgICAgICB2ICs9IDAuNSAqIHZfc2NhbGUgKiBjb250ZXh0LnRleGNvb3JkX3dpZHRoO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gQWRkIGZpcnN0IHBhaXIgb2YgcG9pbnRzIGZvciB0aGUgbGluZSBzdHJpcFxuICAgICAgICBhZGRWZXJ0ZXgoY29vcmRDdXJyLCBub3JtTmV4dCwgWzEsIHZdLCBjb250ZXh0KTtcbiAgICAgICAgYWRkVmVydGV4KGNvb3JkQ3VyciwgVmVjdG9yLm5lZyhub3JtTmV4dCksIFswLCB2XSwgY29udGV4dCk7XG4gICAgfVxuXG4gICAgLy8gSU5URVJNRURJQVJZIFBPSU5UU1xuICAgIHYgKz0gdl9zY2FsZSAqIFZlY3Rvci5sZW5ndGgoVmVjdG9yLnN1Yihjb29yZE5leHQsIGNvb3JkQ3VycikpO1xuICAgIGZvciAodmFyIGkgPSBpbmRleF9zdGFydCArIDE7IGkgPCBpbmRleF9lbmQ7IGkrKykge1xuICAgICAgICB2YXIgY3VyckluZGV4ID0gaTtcbiAgICAgICAgdmFyIG5leHRJbmRleCA9IGkgKyAxO1xuICAgICAgICBjb29yZEN1cnIgPSBsaW5lW2N1cnJJbmRleF07XG4gICAgICAgIGNvb3JkTmV4dCA9IGxpbmVbbmV4dEluZGV4XTtcblxuICAgICAgICAvLyBTa2lwIHJlZHVuZGFudCB2ZXJ0aWNlc1xuICAgICAgICBpZiAoVmVjdG9yLmlzRXF1YWwoY29vcmRDdXJyLCBjb29yZE5leHQpKSB7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFJlbW92ZSB0aWxlIGJvdW5kYXJpZXNcbiAgICAgICAgaWYgKHJlbW92ZV90aWxlX2VkZ2VzICYmIG91dHNpZGVUaWxlKGNvb3JkQ3VyciwgY29vcmROZXh0LCB0aWxlX2VkZ2VfdG9sZXJhbmNlKSkge1xuICAgICAgICAgICAgYWRkVmVydGV4KGNvb3JkQ3Vyciwgbm9ybU5leHQsIFsxLCB2XSwgY29udGV4dCk7XG4gICAgICAgICAgICBhZGRWZXJ0ZXgoY29vcmRDdXJyLCBWZWN0b3IubmVnKG5vcm1OZXh0KSwgWzAsIHZdLCBjb250ZXh0KTtcbiAgICAgICAgICAgIGluZGV4UGFpcnMoMSwgY29udGV4dCk7XG5cbiAgICAgICAgICAgIHZhciBub25Cb3VuZGFyeUxpbmVzID0gZ2V0TmV4dE5vbkJvdW5kYXJ5U2VnbWVudChsaW5lLCBjdXJySW5kZXggKyAxLCB0aWxlX2VkZ2VfdG9sZXJhbmNlKTtcbiAgICAgICAgICAgIGlmIChub25Cb3VuZGFyeUxpbmVzKSB7XG4gICAgICAgICAgICAgICAgZXh0cmFfbGluZXMucHVzaChub25Cb3VuZGFyeUxpbmVzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIG5vcm1QcmV2ID0gbm9ybU5leHQ7XG4gICAgICAgIG5vcm1OZXh0ID0gVmVjdG9yLm5vcm1hbGl6ZShWZWN0b3IucGVycChjb29yZEN1cnIsIGNvb3JkTmV4dCkpO1xuXG4gICAgICAgIC8vIEFkZCBqb2luXG4gICAgICAgIGlmIChqb2luX3R5cGUgPT09IEpPSU5fVFlQRS5taXRlcikge1xuICAgICAgICAgICAgYWRkTWl0ZXIodiwgY29vcmRDdXJyLCBub3JtUHJldiwgbm9ybU5leHQsIG1pdGVyX2xlbl9zcSwgZmFsc2UsIGNvbnRleHQpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgYWRkSm9pbihqb2luX3R5cGUsIHYsIGNvb3JkQ3Vyciwgbm9ybVByZXYsIG5vcm1OZXh0LCBmYWxzZSwgY29udGV4dCk7XG4gICAgICAgIH1cblxuICAgICAgICB2ICs9IHZfc2NhbGUgKiBWZWN0b3IubGVuZ3RoKFZlY3Rvci5zdWIoY29vcmROZXh0LCBjb29yZEN1cnIpKTtcbiAgICB9XG5cbiAgICAvLyBMQVNUIFBPSU5UXG4gICAgY29vcmRDdXJyID0gY29vcmROZXh0O1xuICAgIG5vcm1QcmV2ID0gbm9ybU5leHQ7XG5cbiAgICBpZiAoY2xvc2VkX3BvbHlnb24pIHtcbiAgICAgICAgLy8gQ2xvc2UgdGhlIHBvbHlnb24gd2l0aCBhIG1pdGVyIGpvaW50IG9yIGJ1dHQgY2FwIGlmIG9uIGEgdGlsZSBib3VuZGFyeVxuICAgICAgICBub3JtTmV4dCA9IFZlY3Rvci5ub3JtYWxpemUoVmVjdG9yLnBlcnAoY29vcmRDdXJyLCBsaW5lWzFdKSk7XG4gICAgICAgIGVuZFBvbHlnb24oY29vcmRDdXJyLCBub3JtUHJldiwgbm9ybU5leHQsIGpvaW5fdHlwZSwgdiwgY29udGV4dCk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICAvLyBGaW5pc2ggdGhlIGxpbmUgc3RyaXBcbiAgICAgICAgYWRkVmVydGV4KGNvb3JkQ3Vyciwgbm9ybVByZXYsIFsxLCB2XSwgY29udGV4dCk7XG4gICAgICAgIGFkZFZlcnRleChjb29yZEN1cnIsIFZlY3Rvci5uZWcobm9ybVByZXYpLCBbMCwgdl0sIGNvbnRleHQpO1xuICAgICAgICBpbmRleFBhaXJzKDEsIGNvbnRleHQpO1xuXG4gICAgICAgIC8vIElmIGxpbmUgZW5kcyBhdCBlZGdlLCBkb24ndCBhZGQgYSBjYXBcbiAgICAgICAgaWYgKCFpc0Nvb3JkT3V0c2lkZVRpbGUoY29vcmRDdXJyKSkge1xuICAgICAgICAgICAgYWRkQ2FwKGNvb3JkQ3Vyciwgdiwgbm9ybVByZXYsIGNhcF90eXBlLCBmYWxzZSwgY29udGV4dCk7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbmZ1bmN0aW9uIGdldFRpbGVCb3VuZGFyeUluZGV4KGxpbmUpe1xuICAgIGlmIChpc0Nvb3JkT3V0c2lkZVRpbGUobGluZVswXSkpIHtcbiAgICAgICAgcmV0dXJuIDA7XG4gICAgfVxuXG4gICAgZm9yICh2YXIgYmFja0luZGV4ID0gMDsgYmFja0luZGV4IDwgbGluZS5sZW5ndGg7IGJhY2tJbmRleCsrKSB7XG4gICAgICAgIHZhciBjb29yZEN1cnIgPSBsaW5lW2xpbmUubGVuZ3RoIC0gMSAtIGJhY2tJbmRleF07XG4gICAgICAgIGlmIChpc0Nvb3JkT3V0c2lkZVRpbGUoY29vcmRDdXJyKSkge1xuICAgICAgICAgICAgcmV0dXJuIGxpbmUubGVuZ3RoIC0gMSAtIGJhY2tJbmRleDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiAwO1xufVxuXG4vLyBJdGVyYXRlIHRocm91Z2ggbGluZSBmcm9tIHN0YXJ0SW5kZXggdG8gZmluZCBhIHNlZ21lbnQgbm90IG9uIGEgdGlsZSBib3VuZGFyeSwgaWYgYW55LlxuZnVuY3Rpb24gZ2V0TmV4dE5vbkJvdW5kYXJ5U2VnbWVudCAobGluZSwgc3RhcnRJbmRleCwgdG9sZXJhbmNlKSB7XG4gICAgdmFyIGVuZEluZGV4ID0gc3RhcnRJbmRleDtcbiAgICB3aGlsZSAobGluZVtlbmRJbmRleCArIDFdICYmIG91dHNpZGVUaWxlKGxpbmVbZW5kSW5kZXhdLCBsaW5lW2VuZEluZGV4ICsgMV0sIHRvbGVyYW5jZSkpIHtcbiAgICAgICAgZW5kSW5kZXgrKztcbiAgICB9XG5cbiAgICAvLyBJZiB0aGVyZSBpcyBhIGxpbmUgc2VnbWVudCByZW1haW5pbmcgdGhhdCBpcyB3aXRoaW4gdGhlIHRpbGUsIHB1c2ggaXQgdG8gdGhlIGxpbmVzIGFycmF5XG4gICAgcmV0dXJuIChsaW5lLmxlbmd0aCAtIGVuZEluZGV4ID49IDIpID8gbGluZS5zbGljZShlbmRJbmRleCkgOiBmYWxzZTtcbn1cblxuLy8gQmVnaW4gYSBwb2x5Z29uIHdpdGggYSBqb2luIGNvbm5lY3RpbmcgdG8gdGhlIGxhc3Qgc2VnbWVudCAoaWYgdmFsaWQgam9pbi10eXBlIHNwZWNpZmllZClcbmZ1bmN0aW9uIHN0YXJ0UG9seWdvbihjb29yZEN1cnIsIG5vcm1QcmV2LCBub3JtTmV4dCwgam9pbl90eXBlLCBjb250ZXh0KXtcbiAgICAvLyBJZiBwb2x5Z29uIHN0YXJ0cyBvbiBhIHRpbGUgYm91bmRhcnksIGRvbid0IGFkZCBhIGpvaW5cbiAgICBpZiAoam9pbl90eXBlID09PSB1bmRlZmluZWQgfHwgaXNDb29yZE91dHNpZGVUaWxlKGNvb3JkQ3VycikpIHtcbiAgICAgICAgYWRkVmVydGV4KGNvb3JkQ3Vyciwgbm9ybU5leHQsIFsxLCAwXSwgY29udGV4dCk7XG4gICAgICAgIGFkZFZlcnRleChjb29yZEN1cnIsIFZlY3Rvci5uZWcobm9ybU5leHQpLCBbMCwgMF0sIGNvbnRleHQpO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgLy8gSWYgcG9seWdvbiBzdGFydHMgd2l0aGluIGEgdGlsZSwgYWRkIGEgam9pblxuICAgICAgICB2YXIgdiA9IDA7XG4gICAgICAgIGlmIChqb2luX3R5cGUgPT09IEpPSU5fVFlQRS5taXRlcikge1xuICAgICAgICAgICAgYWRkTWl0ZXIodiwgY29vcmRDdXJyLCBub3JtUHJldiwgbm9ybU5leHQsIGNvbnRleHQubWl0ZXJfbGVuX3NxLCB0cnVlLCBjb250ZXh0KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGFkZEpvaW4oam9pbl90eXBlLCB2LCBjb29yZEN1cnIsIG5vcm1QcmV2LCBub3JtTmV4dCwgdHJ1ZSwgY29udGV4dCk7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbi8vIEVuZCBhIHBvbHlnb24gYXBwcm9wcmlhdGVseVxuZnVuY3Rpb24gZW5kUG9seWdvbihjb29yZEN1cnIsIG5vcm1QcmV2LCBub3JtTmV4dCwgam9pbl90eXBlLCB2LCBjb250ZXh0KSB7XG4gICAgLy8gSWYgcG9seWdvbiBlbmRzIG9uIGEgdGlsZSBib3VuZGFyeSwgZG9uJ3QgYWRkIGEgam9pblxuICAgIGlmIChpc0Nvb3JkT3V0c2lkZVRpbGUoY29vcmRDdXJyKSkge1xuICAgICAgICBhZGRWZXJ0ZXgoY29vcmRDdXJyLCBub3JtUHJldiwgWzEsIHZdLCBjb250ZXh0KTtcbiAgICAgICAgYWRkVmVydGV4KGNvb3JkQ3VyciwgVmVjdG9yLm5lZyhub3JtUHJldiksIFswLCB2XSwgY29udGV4dCk7XG4gICAgICAgIGluZGV4UGFpcnMoMSwgY29udGV4dCk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICAvLyBJZiBwb2x5Z29uIGVuZHMgd2l0aGluIGEgdGlsZSwgYWRkIE1pdGVyIG9yIG5vIGpvaW50IChqb2luIGFkZGVkIG9uIHN0YXJ0UG9seWdvbilcbiAgICAgICAgdmFyIG1pdGVyVmVjID0gY3JlYXRlTWl0ZXJWZWMobm9ybVByZXYsIG5vcm1OZXh0KTtcblxuICAgICAgICBpZiAoam9pbl90eXBlID09PSBKT0lOX1RZUEUubWl0ZXIgJiYgVmVjdG9yLmxlbmd0aFNxKG1pdGVyVmVjKSA+IGNvbnRleHQubWl0ZXJfbGVuX3NxKSB7XG4gICAgICAgICAgICBqb2luX3R5cGUgPSBKT0lOX1RZUEUuYmV2ZWw7IC8vIHN3aXRjaCB0byBiZXZlbFxuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGpvaW5fdHlwZSA9PT0gSk9JTl9UWVBFLm1pdGVyKSB7XG4gICAgICAgICAgICBhZGRWZXJ0ZXgoY29vcmRDdXJyLCBtaXRlclZlYywgWzEsIHZdLCBjb250ZXh0KTtcbiAgICAgICAgICAgIGFkZFZlcnRleChjb29yZEN1cnIsIFZlY3Rvci5uZWcobWl0ZXJWZWMpLCBbMCwgdl0sIGNvbnRleHQpO1xuICAgICAgICAgICAgaW5kZXhQYWlycygxLCBjb250ZXh0KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGFkZFZlcnRleChjb29yZEN1cnIsIG5vcm1QcmV2LCBbMSwgdl0sIGNvbnRleHQpO1xuICAgICAgICAgICAgYWRkVmVydGV4KGNvb3JkQ3VyciwgVmVjdG9yLm5lZyhub3JtUHJldiksIFswLCB2XSwgY29udGV4dCk7XG4gICAgICAgICAgICBpbmRleFBhaXJzKDEsIGNvbnRleHQpO1xuICAgICAgICB9XG4gICAgfVxufVxuXG5mdW5jdGlvbiBjcmVhdGVNaXRlclZlYyhub3JtUHJldiwgbm9ybU5leHQpIHtcbiAgICB2YXIgbWl0ZXJWZWMgPSBWZWN0b3Iubm9ybWFsaXplKFZlY3Rvci5hZGQobm9ybVByZXYsIG5vcm1OZXh0KSk7XG4gICAgdmFyIHNjYWxlID0gMiAvICgxICsgTWF0aC5hYnMoVmVjdG9yLmRvdChub3JtUHJldiwgbWl0ZXJWZWMpKSk7XG4gICAgcmV0dXJuIFZlY3Rvci5tdWx0KG1pdGVyVmVjLCBzY2FsZSAqIHNjYWxlKTtcbn1cblxuLy8gQWRkIGEgbWl0ZXIgdmVjdG9yIG9yIGEgam9pbiBpZiB0aGUgbWl0ZXIgaXMgdG9vIHNoYXJwXG5mdW5jdGlvbiBhZGRNaXRlciAodiwgY29vcmRDdXJyLCBub3JtUHJldiwgbm9ybU5leHQsIG1pdGVyX2xlbl9zcSwgaXNCZWdpbm5pbmcsIGNvbnRleHQpIHtcbiAgICB2YXIgbWl0ZXJWZWMgPSBjcmVhdGVNaXRlclZlYyhub3JtUHJldiwgbm9ybU5leHQpO1xuXG4gICAgLy8gIE1pdGVyIGxpbWl0OiBpZiBtaXRlciBqb2luIGlzIHRvbyBzaGFycCwgY29udmVydCB0byBiZXZlbCBpbnN0ZWFkXG4gICAgaWYgKFZlY3Rvci5sZW5ndGhTcShtaXRlclZlYykgPiBtaXRlcl9sZW5fc3EpIHtcbiAgICAgICAgYWRkSm9pbihKT0lOX1RZUEUubWl0ZXIsIHYsIGNvb3JkQ3Vyciwgbm9ybVByZXYsIG5vcm1OZXh0LCBpc0JlZ2lubmluZywgY29udGV4dCk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBhZGRWZXJ0ZXgoY29vcmRDdXJyLCBtaXRlclZlYywgWzEsIHZdLCBjb250ZXh0KTtcbiAgICAgICAgYWRkVmVydGV4KGNvb3JkQ3VyciwgVmVjdG9yLm5lZyhtaXRlclZlYyksIFswLCB2XSwgY29udGV4dCk7XG4gICAgICAgIGlmICghaXNCZWdpbm5pbmcpIHtcbiAgICAgICAgICAgIGluZGV4UGFpcnMoMSwgY29udGV4dCk7XG4gICAgICAgIH1cbiAgICB9XG59XG5cbi8vIEFkZCBhIGJldmVsIG9yIHJvdW5kIGpvaW5cbmZ1bmN0aW9uIGFkZEpvaW4oam9pbl90eXBlLCB2LCBjb29yZEN1cnIsIG5vcm1QcmV2LCBub3JtTmV4dCwgaXNCZWdpbm5pbmcsIGNvbnRleHQpIHtcbiAgICB2YXIgbWl0ZXJWZWMgPSBjcmVhdGVNaXRlclZlYyhub3JtUHJldiwgbm9ybU5leHQpO1xuICAgIHZhciBpc0Nsb2Nrd2lzZSA9IChub3JtTmV4dFswXSAqIG5vcm1QcmV2WzFdIC0gbm9ybU5leHRbMV0gKiBub3JtUHJldlswXSA+IDApO1xuXG4gICAgaWYgKGlzQ2xvY2t3aXNlKXtcbiAgICAgICAgYWRkVmVydGV4KGNvb3JkQ3VyciwgbWl0ZXJWZWMsIFsxLCB2XSwgY29udGV4dCk7XG4gICAgICAgIGFkZFZlcnRleChjb29yZEN1cnIsIFZlY3Rvci5uZWcobm9ybVByZXYpLCBbMCwgdl0sIGNvbnRleHQpO1xuXG4gICAgICAgIGlmICghaXNCZWdpbm5pbmcpIHtcbiAgICAgICAgICAgIGluZGV4UGFpcnMoMSwgY29udGV4dCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoam9pbl90eXBlID09PSBKT0lOX1RZUEUuYmV2ZWwpIHtcbiAgICAgICAgICAgIGFkZEJldmVsKGNvb3JkQ3VycixcbiAgICAgICAgICAgICAgICBWZWN0b3IubmVnKG5vcm1QcmV2KSwgbWl0ZXJWZWMsIFZlY3Rvci5uZWcobm9ybU5leHQpLFxuICAgICAgICAgICAgICAgIFswLCB2XSwgWzEsIHZdLCBbMCwgdl0sXG4gICAgICAgICAgICAgICAgY29udGV4dFxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChqb2luX3R5cGUgPT09IEpPSU5fVFlQRS5yb3VuZCkge1xuICAgICAgICAgICAgYWRkRmFuKGNvb3JkQ3VycixcbiAgICAgICAgICAgICAgICBWZWN0b3IubmVnKG5vcm1QcmV2KSwgbWl0ZXJWZWMsIFZlY3Rvci5uZWcobm9ybU5leHQpLFxuICAgICAgICAgICAgICAgIFswLCB2XSwgWzEsIHZdLCBbMCwgdl0sXG4gICAgICAgICAgICAgICAgZmFsc2UsIGNvbnRleHRcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICBhZGRWZXJ0ZXgoY29vcmRDdXJyLCBtaXRlclZlYywgWzEsIHZdLCBjb250ZXh0KTtcbiAgICAgICAgYWRkVmVydGV4KGNvb3JkQ3VyciwgVmVjdG9yLm5lZyhub3JtTmV4dCksIFswLCB2XSwgY29udGV4dCk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICBhZGRWZXJ0ZXgoY29vcmRDdXJyLCBub3JtUHJldiwgWzEsIHZdLCBjb250ZXh0KTtcbiAgICAgICAgYWRkVmVydGV4KGNvb3JkQ3VyciwgVmVjdG9yLm5lZyhtaXRlclZlYyksIFswLCB2XSwgY29udGV4dCk7XG5cbiAgICAgICAgaWYgKCFpc0JlZ2lubmluZykge1xuICAgICAgICAgICAgaW5kZXhQYWlycygxLCBjb250ZXh0KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChqb2luX3R5cGUgPT09IEpPSU5fVFlQRS5iZXZlbCkge1xuICAgICAgICAgICAgYWRkQmV2ZWwoY29vcmRDdXJyLFxuICAgICAgICAgICAgICAgIG5vcm1QcmV2LCBWZWN0b3IubmVnKG1pdGVyVmVjKSwgbm9ybU5leHQsXG4gICAgICAgICAgICAgICAgWzEsIHZdLCBbMCwgdl0sIFsxLCB2XSxcbiAgICAgICAgICAgICAgICBjb250ZXh0XG4gICAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGpvaW5fdHlwZSA9PT0gSk9JTl9UWVBFLnJvdW5kKSB7XG4gICAgICAgICAgICBhZGRGYW4oY29vcmRDdXJyLFxuICAgICAgICAgICAgICAgIG5vcm1QcmV2LCBWZWN0b3IubmVnKG1pdGVyVmVjKSwgbm9ybU5leHQsXG4gICAgICAgICAgICAgICAgWzEsIHZdLCBbMCwgdl0sIFsxLCB2XSxcbiAgICAgICAgICAgICAgICBmYWxzZSwgY29udGV4dFxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGFkZFZlcnRleChjb29yZEN1cnIsIG5vcm1OZXh0LCBbMSwgdl0sIGNvbnRleHQpO1xuICAgICAgICBhZGRWZXJ0ZXgoY29vcmRDdXJyLCBWZWN0b3IubmVnKG1pdGVyVmVjKSwgWzAsIHZdLCBjb250ZXh0KTtcbiAgICB9XG59XG5cbi8vIEFkZCBpbmRpY2VzIHRvIHZlcnRleF9lbGVtZW50c1xuZnVuY3Rpb24gaW5kZXhQYWlycyhudW1fcGFpcnMsIGNvbnRleHQpe1xuICAgIHZhciB2ZXJ0ZXhfZWxlbWVudHMgPSBjb250ZXh0LnZlcnRleF9kYXRhLnZlcnRleF9lbGVtZW50cztcbiAgICB2YXIgbnVtX3ZlcnRpY2VzID0gY29udGV4dC52ZXJ0ZXhfZGF0YS52ZXJ0ZXhfY291bnQ7XG4gICAgdmFyIG9mZnNldCA9IG51bV92ZXJ0aWNlcyAtIDIgKiBudW1fcGFpcnMgLSAyO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBudW1fcGFpcnM7IGkrKyl7XG4gICAgICAgIHZlcnRleF9lbGVtZW50cy5wdXNoKG9mZnNldCArIDIgKiBpICsgMik7XG4gICAgICAgIHZlcnRleF9lbGVtZW50cy5wdXNoKG9mZnNldCArIDIgKiBpICsgMSk7XG4gICAgICAgIHZlcnRleF9lbGVtZW50cy5wdXNoKG9mZnNldCArIDIgKiBpICsgMCk7XG4gICAgICAgIHZlcnRleF9lbGVtZW50cy5wdXNoKG9mZnNldCArIDIgKiBpICsgMik7XG4gICAgICAgIHZlcnRleF9lbGVtZW50cy5wdXNoKG9mZnNldCArIDIgKiBpICsgMyk7XG4gICAgICAgIHZlcnRleF9lbGVtZW50cy5wdXNoKG9mZnNldCArIDIgKiBpICsgMSk7XG4gICAgfVxufVxuXG5mdW5jdGlvbiBhZGRWZXJ0ZXgoY29vcmRpbmF0ZSwgbm9ybWFsLCB1diwgY29udGV4dCkge1xuICAgIHZhciB2ZXJ0ZXhfdGVtcGxhdGUgPSBjb250ZXh0LnZlcnRleF90ZW1wbGF0ZTtcbiAgICB2YXIgdmVydGV4X2RhdGEgPSBjb250ZXh0LnZlcnRleF9kYXRhO1xuXG4gICAgYnVpbGRWZXJ0ZXhUZW1wbGF0ZSh2ZXJ0ZXhfdGVtcGxhdGUsIGNvb3JkaW5hdGUsIHV2LCBub3JtYWwsIGNvbnRleHQpO1xuICAgIHZlcnRleF9kYXRhLmFkZFZlcnRleCh2ZXJ0ZXhfdGVtcGxhdGUpO1xufVxuXG5mdW5jdGlvbiBidWlsZFZlcnRleFRlbXBsYXRlICh2ZXJ0ZXhfdGVtcGxhdGUsIHZlcnRleCwgdGV4dHVyZV9jb29yZCwgc2NhbGUsIGNvbnRleHQpIHtcbiAgICAvLyBzZXQgdmVydGV4IHBvc2l0aW9uXG4gICAgdmVydGV4X3RlbXBsYXRlWzBdID0gdmVydGV4WzBdO1xuICAgIHZlcnRleF90ZW1wbGF0ZVsxXSA9IHZlcnRleFsxXTtcblxuICAgIC8vIHNldCBVVnNcbiAgICBpZiAoY29udGV4dC50ZXhjb29yZF9pbmRleCAmJiB0ZXh0dXJlX2Nvb3JkKSB7XG4gICAgICAgIHZlcnRleF90ZW1wbGF0ZVtjb250ZXh0LnRleGNvb3JkX2luZGV4ICsgMF0gPSB0ZXh0dXJlX2Nvb3JkWzBdICogY29udGV4dC50ZXhjb29yZF9ub3JtYWxpemU7XG4gICAgICAgIHZlcnRleF90ZW1wbGF0ZVtjb250ZXh0LnRleGNvb3JkX2luZGV4ICsgMV0gPSB0ZXh0dXJlX2Nvb3JkWzFdICogY29udGV4dC50ZXhjb29yZF9ub3JtYWxpemU7XG4gICAgfVxuXG4gICAgLy8gc2V0IFNjYWxpbmcgdmVydGV4IChYLCBZIG5vcm1hbCBkaXJlY3Rpb24gKyBaIGhhbGZfd2lkdGggYXMgYXR0cmlidXRlKVxuICAgIGlmIChjb250ZXh0LnNjYWxpbmdfaW5kZXgpIHtcbiAgICAgICAgdmVydGV4X3RlbXBsYXRlW2NvbnRleHQuc2NhbGluZ19pbmRleCArIDBdID0gc2NhbGVbMF0gKiBjb250ZXh0LnNjYWxpbmdfbm9ybWFsaXplO1xuICAgICAgICB2ZXJ0ZXhfdGVtcGxhdGVbY29udGV4dC5zY2FsaW5nX2luZGV4ICsgMV0gPSBzY2FsZVsxXSAqIGNvbnRleHQuc2NhbGluZ19ub3JtYWxpemU7XG4gICAgICAgIHZlcnRleF90ZW1wbGF0ZVtjb250ZXh0LnNjYWxpbmdfaW5kZXggKyAyXSA9IGNvbnRleHQuaGFsZl93aWR0aDtcbiAgICB9XG59XG5cbi8vICBUZXNzYWxhdGUgYSBGQU4gZ2VvbWV0cnkgYmV0d2VlbiBwb2ludHMgQSAgICAgICBCXG4vLyAgdXNpbmcgdGhlaXIgbm9ybWFscyBmcm9tIGEgY2VudGVyICAgICAgICBcXCAuIC4gL1xuLy8gIGFuZCBpbnRlcnBvbGF0aW5nIHRoZWlyIFVWcyAgICAgICAgICAgICAgIFxcIHAgL1xuLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcXC4vXG5mdW5jdGlvbiBhZGRGYW4gKGNvb3JkLCBuQSwgbkMsIG5CLCB1dkEsIHV2QywgdXZCLCBpc0NhcCwgY29udGV4dCkge1xuICAgIHZhciBjcm9zcyA9IG5BWzBdICogbkJbMV0gLSBuQVsxXSAqIG5CWzBdO1xuICAgIHZhciBkb3QgPSBWZWN0b3IuZG90KG5BLCBuQik7XG5cbiAgICB2YXIgYW5nbGUgPSBNYXRoLmF0YW4yKGNyb3NzLCBkb3QpO1xuICAgIHdoaWxlIChhbmdsZSA+PSBNYXRoLlBJKSB7XG4gICAgICAgIGFuZ2xlIC09IDIqTWF0aC5QSTtcbiAgICB9XG5cbiAgICB2YXIgbnVtVHJpYW5nbGVzID0gdHJpYW5nbGVzUGVyQXJjKGFuZ2xlLCBjb250ZXh0LmhhbGZfd2lkdGgpO1xuICAgIGlmIChudW1UcmlhbmdsZXMgPCAxKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICB2YXIgcGl2b3RJbmRleCA9IGNvbnRleHQudmVydGV4X2RhdGEudmVydGV4X2NvdW50O1xuICAgIHZhciB2ZXJ0ZXhfZWxlbWVudHMgPSBjb250ZXh0LnZlcnRleF9kYXRhLnZlcnRleF9lbGVtZW50cztcblxuICAgIGFkZFZlcnRleChjb29yZCwgbkMsIHV2QywgY29udGV4dCk7XG4gICAgYWRkVmVydGV4KGNvb3JkLCBuQSwgdXZBLCBjb250ZXh0KTtcblxuICAgIHZhciBibGFkZSA9IG5BO1xuXG4gICAgaWYgKGNvbnRleHQudGV4Y29vcmRfaW5kZXggIT09IHVuZGVmaW5lZCkge1xuICAgICAgICB2YXIgdXZDdXJyO1xuICAgICAgICBpZiAoaXNDYXApe1xuICAgICAgICAgICAgdXZDdXJyID0gW107XG4gICAgICAgICAgICB2YXIgYWZmaW5lX3V2Q3VyciA9IFZlY3Rvci5zdWIodXZBLCB1dkMpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdXZDdXJyID0gVmVjdG9yLnNldCh1dkEpO1xuICAgICAgICAgICAgdmFyIHV2X2RlbHRhID0gVmVjdG9yLmRpdihWZWN0b3Iuc3ViKHV2QiwgdXZBKSwgbnVtVHJpYW5nbGVzKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHZhciBhbmdsZV9zdGVwID0gYW5nbGUgLyBudW1UcmlhbmdsZXM7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBudW1UcmlhbmdsZXM7IGkrKykge1xuICAgICAgICBibGFkZSA9IFZlY3Rvci5yb3QoYmxhZGUsIGFuZ2xlX3N0ZXApO1xuXG4gICAgICAgIGlmIChjb250ZXh0LnRleGNvb3JkX2luZGV4ICE9PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIGlmIChpc0NhcCl7XG4gICAgICAgICAgICAgICAgLy8gVVYgdGV4dHVyZXMgZ28gXCJ0aHJvdWdoXCIgdGhlIGNhcFxuICAgICAgICAgICAgICAgIGFmZmluZV91dkN1cnIgPSBWZWN0b3Iucm90KGFmZmluZV91dkN1cnIsIGFuZ2xlX3N0ZXApO1xuICAgICAgICAgICAgICAgIHV2Q3VyclswXSA9IGFmZmluZV91dkN1cnJbMF0gKyB1dkNbMF07XG4gICAgICAgICAgICAgICAgdXZDdXJyWzFdID0gYWZmaW5lX3V2Q3VyclsxXSAqIGNvbnRleHQudGV4Y29vcmRfd2lkdGggKiBjb250ZXh0LnZfc2NhbGUgKyB1dkNbMV07IC8vIHNjYWxlIHRoZSB2LWNvb3JkaW5hdGVcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIFVWIHRleHR1cmVzIGdvIFwiYXJvdW5kXCIgdGhlIGpvaW5cbiAgICAgICAgICAgICAgICB1dkN1cnIgPSBWZWN0b3IuYWRkKHV2Q3VyciwgdXZfZGVsdGEpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgYWRkVmVydGV4KGNvb3JkLCBibGFkZSwgdXZDdXJyLCBjb250ZXh0KTtcblxuICAgICAgICB2ZXJ0ZXhfZWxlbWVudHMucHVzaChwaXZvdEluZGV4ICsgaSArICgoY3Jvc3MgPiAwKSA/IDIgOiAxKSk7XG4gICAgICAgIHZlcnRleF9lbGVtZW50cy5wdXNoKHBpdm90SW5kZXgpO1xuICAgICAgICB2ZXJ0ZXhfZWxlbWVudHMucHVzaChwaXZvdEluZGV4ICsgaSArICgoY3Jvc3MgPiAwKSA/IDEgOiAyKSk7XG4gICAgfVxufVxuXG4vLyAgYWRkQmV2ZWwgICAgQSAtLS0tLSBCXG4vLyAgICAgICAgICAgICAvIFxcICAgICAvIFxcXG4vLyAgICAgICAgICAgLyAgIC9cXCAgIC9cXCAgXFxcbi8vICAgICAgICAgICAgICAvICBcXCAvICBcXCAgXFxcbi8vICAgICAgICAgICAgICAgIC8gQyBcXFxuZnVuY3Rpb24gYWRkQmV2ZWwgKGNvb3JkLCBuQSwgbkMsIG5CLCB1QSwgdUMsIHVCLCBjb250ZXh0KSB7XG4gICAgdmFyIHBpdm90SW5kZXggPSBjb250ZXh0LnZlcnRleF9kYXRhLnZlcnRleF9jb3VudDtcblxuICAgIGFkZFZlcnRleChjb29yZCwgbkMsIHVDLCBjb250ZXh0KTtcbiAgICBhZGRWZXJ0ZXgoY29vcmQsIG5BLCB1QSwgY29udGV4dCk7XG4gICAgYWRkVmVydGV4KGNvb3JkLCBuQiwgdUIsIGNvbnRleHQpO1xuXG4gICAgdmFyIG9yaWVudGF0aW9uID0gbkFbMF0gKiBuQlsxXSAtIG5BWzFdICogbkJbMF0gPiAwO1xuXG4gICAgdmFyIHZlcnRleF9lbGVtZW50cyA9IGNvbnRleHQudmVydGV4X2RhdGEudmVydGV4X2VsZW1lbnRzO1xuXG4gICAgaWYgKG9yaWVudGF0aW9uKSB7XG4gICAgICAgIHZlcnRleF9lbGVtZW50cy5wdXNoKHBpdm90SW5kZXggKyAyKTtcbiAgICAgICAgdmVydGV4X2VsZW1lbnRzLnB1c2gocGl2b3RJbmRleCArIDApO1xuICAgICAgICB2ZXJ0ZXhfZWxlbWVudHMucHVzaChwaXZvdEluZGV4ICsgMSk7XG4gICAgfSBlbHNlIHtcbiAgICAgICAgdmVydGV4X2VsZW1lbnRzLnB1c2gocGl2b3RJbmRleCArIDEpO1xuICAgICAgICB2ZXJ0ZXhfZWxlbWVudHMucHVzaChwaXZvdEluZGV4ICsgMCk7XG4gICAgICAgIHZlcnRleF9lbGVtZW50cy5wdXNoKHBpdm90SW5kZXggKyAyKTtcbiAgICB9XG59XG5cbi8vICBGdW5jdGlvbiB0byBhZGQgdGhlIHZlcnRleCBuZWVkIGZvciBsaW5lIGNhcHMsXG4vLyAgYmVjYXVzZSByZS11c2UgdGhlIGJ1ZmZlcnMgbmVlZHMgdG8gYmUgYXQgdGhlIGVuZFxuZnVuY3Rpb24gYWRkQ2FwIChjb29yZCwgdiwgbm9ybWFsLCB0eXBlLCBpc0JlZ2lubmluZywgY29udGV4dCkge1xuICAgIHZhciBuZWdfbm9ybWFsID0gVmVjdG9yLm5lZyhub3JtYWwpO1xuXG4gICAgc3dpdGNoICh0eXBlKXtcbiAgICAgICAgY2FzZSBDQVBfVFlQRS5zcXVhcmU6XG4gICAgICAgICAgICB2YXIgdGFuZ2VudDtcbiAgICAgICAgICAgIGlmIChpc0JlZ2lubmluZyl7XG4gICAgICAgICAgICAgICAgdGFuZ2VudCA9IFtub3JtYWxbMV0sIC1ub3JtYWxbMF1dO1xuXG4gICAgICAgICAgICAgICAgYWRkVmVydGV4KGNvb3JkLCBWZWN0b3IuYWRkKG5vcm1hbCwgdGFuZ2VudCksIFsxLCB2XSwgY29udGV4dCk7XG4gICAgICAgICAgICAgICAgYWRkVmVydGV4KGNvb3JkLCBWZWN0b3IuYWRkKG5lZ19ub3JtYWwsIHRhbmdlbnQpLCBbMCwgdl0sIGNvbnRleHQpO1xuXG4gICAgICAgICAgICAgICAgLy8gQWRkIGxlbmd0aCBvZiBzcXVhcmUgY2FwIHRvIHRleHR1cmUgY29vcmRpbmF0ZVxuICAgICAgICAgICAgICAgIHYgKz0gMC41ICogY29udGV4dC50ZXhjb29yZF93aWR0aCAqIGNvbnRleHQudl9zY2FsZTtcblxuICAgICAgICAgICAgICAgIGFkZFZlcnRleChjb29yZCwgbm9ybWFsLCBbMSwgdl0sIGNvbnRleHQpO1xuICAgICAgICAgICAgICAgIGFkZFZlcnRleChjb29yZCwgbmVnX25vcm1hbCwgWzAsIHZdLCBjb250ZXh0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHRhbmdlbnQgPSBbLW5vcm1hbFsxXSwgbm9ybWFsWzBdXTtcblxuICAgICAgICAgICAgICAgIGFkZFZlcnRleChjb29yZCwgbm9ybWFsLCBbMSwgdl0sIGNvbnRleHQpO1xuICAgICAgICAgICAgICAgIGFkZFZlcnRleChjb29yZCwgbmVnX25vcm1hbCwgWzAsIHZdLCBjb250ZXh0KTtcblxuICAgICAgICAgICAgICAgIC8vIEFkZCBsZW5ndGggb2Ygc3F1YXJlIGNhcCB0byB0ZXh0dXJlIGNvb3JkaW5hdGVcbiAgICAgICAgICAgICAgICB2ICs9IDAuNSAqIGNvbnRleHQudGV4Y29vcmRfd2lkdGggKiBjb250ZXh0LnZfc2NhbGU7XG5cbiAgICAgICAgICAgICAgICBhZGRWZXJ0ZXgoY29vcmQsIFZlY3Rvci5hZGQobm9ybWFsLCB0YW5nZW50KSwgWzEsIHZdLCBjb250ZXh0KTtcbiAgICAgICAgICAgICAgICBhZGRWZXJ0ZXgoY29vcmQsIFZlY3Rvci5hZGQobmVnX25vcm1hbCwgdGFuZ2VudCksIFswLCB2XSwgY29udGV4dCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGluZGV4UGFpcnMoMSwgY29udGV4dCk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgY2FzZSBDQVBfVFlQRS5yb3VuZDpcbiAgICAgICAgICAgIHZhciBuQSwgbkIsIHV2QSwgdXZCLCB1dkM7XG4gICAgICAgICAgICBpZiAoaXNCZWdpbm5pbmcpIHtcbiAgICAgICAgICAgICAgICBuQSA9IG5vcm1hbDtcbiAgICAgICAgICAgICAgICBuQiA9IG5lZ19ub3JtYWw7XG5cbiAgICAgICAgICAgICAgICBpZiAoY29udGV4dC50ZXhjb29yZF9pbmRleCAhPT0gdW5kZWZpbmVkKXtcbiAgICAgICAgICAgICAgICAgICAgdiArPSAwLjUgKiBjb250ZXh0LnRleGNvb3JkX3dpZHRoICogY29udGV4dC52X3NjYWxlO1xuICAgICAgICAgICAgICAgICAgICB1dkEgPSBbMSwgdl07XG4gICAgICAgICAgICAgICAgICAgIHV2QiA9IFswLCB2XTtcbiAgICAgICAgICAgICAgICAgICAgdXZDID0gWzAuNSwgdl07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgbkEgPSBuZWdfbm9ybWFsO1xuICAgICAgICAgICAgICAgIG5CID0gbm9ybWFsO1xuXG4gICAgICAgICAgICAgICAgaWYgKGNvbnRleHQudGV4Y29vcmRfaW5kZXggIT09IHVuZGVmaW5lZCl7XG4gICAgICAgICAgICAgICAgICAgIHV2QSA9IFswLCB2XTtcbiAgICAgICAgICAgICAgICAgICAgdXZCID0gWzEsIHZdO1xuICAgICAgICAgICAgICAgICAgICB1dkMgPSBbMC41LCB2XTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGFkZEZhbihjb29yZCxcbiAgICAgICAgICAgICAgICBuQSwgemVyb192ZWMyLCBuQixcbiAgICAgICAgICAgICAgICB1dkEsIHV2QywgdXZCLFxuICAgICAgICAgICAgICAgIHRydWUsIGNvbnRleHRcbiAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICBjYXNlIENBUF9UWVBFLmJ1dHQ6XG4gICAgICAgICAgICByZXR1cm47XG4gICAgfVxufVxuXG4vLyBDYWxjdWxhdGUgbnVtYmVyIG9mIHRyaWFuZ2xlcyBmb3IgYSBmYW4gZ2l2ZW4gYW4gYW5nbGUgYW5kIGxpbmUgd2lkdGhcbmZ1bmN0aW9uIHRyaWFuZ2xlc1BlckFyYyAoYW5nbGUsIHdpZHRoKSB7XG4gICAgaWYgKGFuZ2xlIDwgMCkge1xuICAgICAgICBhbmdsZSA9IC1hbmdsZTtcbiAgICB9XG5cbiAgICB2YXIgbnVtVHJpYW5nbGVzID0gKHdpZHRoID4gMiAqIERFRkFVTFQuTUlOX0ZBTl9XSURUSCkgPyBNYXRoLmxvZzIod2lkdGggLyBERUZBVUxULk1JTl9GQU5fV0lEVEgpIDogMTtcbiAgICByZXR1cm4gTWF0aC5jZWlsKGFuZ2xlIC8gTWF0aC5QSSAqIG51bVRyaWFuZ2xlcyk7XG59XG5cbi8vIEN5Y2xpY2FsbHkgcGVybXV0ZSBjbG9zZWQgbGluZSBzdGFydGluZyBhdCBhbiBpbmRleFxuZnVuY3Rpb24gcGVybXV0ZUxpbmUobGluZSwgc3RhcnRJbmRleCl7XG4gICAgdmFyIG5ld0xpbmUgPSBbXTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxpbmUubGVuZ3RoOyBpKyspe1xuICAgICAgICB2YXIgaW5kZXggPSAoaSArIHN0YXJ0SW5kZXgpICUgbGluZS5sZW5ndGg7XG4gICAgICAgIC8vIHNraXAgdGhlIGZpcnN0IChyZXBlYXRlZCkgaW5kZXhcbiAgICAgICAgaWYgKGluZGV4ICE9PSAwKSB7XG4gICAgICAgICAgICBuZXdMaW5lLnB1c2gobGluZVtpbmRleF0pO1xuICAgICAgICB9XG4gICAgfVxuICAgIG5ld0xpbmUucHVzaChuZXdMaW5lWzBdKTtcbiAgICByZXR1cm4gbmV3TGluZTtcbn0iLCJpbXBvcnQgVXRpbHMgZnJvbSAnLi91dGlscy91dGlscyc7XG5pbXBvcnQgU2hhZGVyUHJvZ3JhbSBmcm9tICcuL2dsL3NoYWRlcl9wcm9ncmFtJztcbmltcG9ydCB7bWF0NCwgbWF0MywgdmVjM30gZnJvbSAnLi91dGlscy9nbC1tYXRyaXgnO1xuXG4vLyBBYnN0cmFjdCBiYXNlIGNsYXNzXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBDYW1lcmEge1xuXG4gICAgY29uc3RydWN0b3IobmFtZSwgdmlldywgb3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIHRoaXMudmlldyA9IHZpZXc7XG4gICAgICAgIHRoaXMucG9zaXRpb24gPSBvcHRpb25zLnBvc2l0aW9uO1xuICAgICAgICB0aGlzLnpvb20gPSBvcHRpb25zLnpvb207XG4gICAgfVxuXG4gICAgLy8gQ3JlYXRlIGEgY2FtZXJhIGJ5IHR5cGUgbmFtZSwgZmFjdG9yeS1zdHlsZVxuICAgIHN0YXRpYyBjcmVhdGUobmFtZSwgdmlldywgY29uZmlnKSB7XG4gICAgICAgIHN3aXRjaCAoY29uZmlnLnR5cGUpIHtcbiAgICAgICAgICAgIGNhc2UgJ2lzb21ldHJpYyc6XG4gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBJc29tZXRyaWNDYW1lcmEobmFtZSwgdmlldywgY29uZmlnKTtcbiAgICAgICAgICAgIGNhc2UgJ2ZsYXQnOlxuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgRmxhdENhbWVyYShuYW1lLCB2aWV3LCBjb25maWcpO1xuICAgICAgICAgICAgY2FzZSAncGVyc3BlY3RpdmUnOlxuICAgICAgICAgICAgLyogZmFsbHMgdGhyb3VnaCAqL1xuICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFBlcnNwZWN0aXZlQ2FtZXJhKG5hbWUsIHZpZXcsIGNvbmZpZyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBVcGRhdGUgbWV0aG9kIGNhbGxlZCBvbmNlIHBlciBmcmFtZVxuICAgIHVwZGF0ZSgpIHtcbiAgICB9XG5cbiAgICAvLyBDYWxsZWQgb25jZSBwZXIgZnJhbWUgcGVyIHByb2dyYW0gKGUuZy4gZm9yIG1haW4gcmVuZGVyIHBhc3MsIHRoZW4gZm9yIGVhY2ggYWRkaXRpb25hbCBwYXNzIGZvciBmZWF0dXJlIHNlbGVjdGlvbiwgZXRjLilcbiAgICBzZXR1cFByb2dyYW0ocHJvZ3JhbSkge1xuICAgIH1cblxuICAgIC8vIFN5bmMgY2FtZXJhIHBvc2l0aW9uL3pvb20gdG8gc2NlbmUgdmlld1xuICAgIHVwZGF0ZVZpZXcgKCkge1xuICAgICAgICBpZiAodGhpcy5wb3NpdGlvbiB8fCB0aGlzLnpvb20pIHtcbiAgICAgICAgICAgIHZhciB2aWV3ID0ge307XG4gICAgICAgICAgICBpZiAodGhpcy5wb3NpdGlvbikge1xuICAgICAgICAgICAgICAgIHZpZXcgPSB7IGxuZzogdGhpcy5wb3NpdGlvblswXSwgbGF0OiB0aGlzLnBvc2l0aW9uWzFdLCB6b29tOiB0aGlzLnBvc2l0aW9uWzJdIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodGhpcy56b29tKSB7XG4gICAgICAgICAgICAgICAgdmlldy56b29tID0gdGhpcy56b29tO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy52aWV3LnNldFZpZXcodmlldyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBTZXQgbW9kZWwtdmlldyBhbmQgbm9ybWFsIG1hdHJpY2VzXG4gICAgc2V0dXBNYXRyaWNlcyAobWF0cmljZXMsIHByb2dyYW0pIHtcbiAgICAgICAgLy8gTW9kZWwgdmlldyBtYXRyaXggLSB0cmFuc2Zvcm0gdGlsZSBzcGFjZSBpbnRvIHZpZXcgc3BhY2UgKG1ldGVycywgcmVsYXRpdmUgdG8gY2FtZXJhKVxuICAgICAgICBtYXQ0Lm11bHRpcGx5KG1hdHJpY2VzLm1vZGVsX3ZpZXczMiwgdGhpcy52aWV3X21hdHJpeCwgbWF0cmljZXMubW9kZWwpO1xuICAgICAgICBwcm9ncmFtLnVuaWZvcm0oJ01hdHJpeDRmdicsICd1X21vZGVsVmlldycsIG1hdHJpY2VzLm1vZGVsX3ZpZXczMik7XG5cbiAgICAgICAgLy8gTm9ybWFsIG1hdHJpY2VzIC0gdHJhbnNmb3JtcyBzdXJmYWNlIG5vcm1hbHMgaW50byB2aWV3IHNwYWNlXG4gICAgICAgIG1hdDMubm9ybWFsRnJvbU1hdDQobWF0cmljZXMubm9ybWFsMzIsIG1hdHJpY2VzLm1vZGVsX3ZpZXczMik7XG4gICAgICAgIG1hdDMuaW52ZXJ0KG1hdHJpY2VzLmludmVyc2Vfbm9ybWFsMzIsIG1hdHJpY2VzLm5vcm1hbDMyKTtcbiAgICAgICAgcHJvZ3JhbS51bmlmb3JtKCdNYXRyaXgzZnYnLCAndV9ub3JtYWxNYXRyaXgnLCBtYXRyaWNlcy5ub3JtYWwzMik7XG4gICAgICAgIHByb2dyYW0udW5pZm9ybSgnTWF0cml4M2Z2JywgJ3VfaW52ZXJzZU5vcm1hbE1hdHJpeCcsIG1hdHJpY2VzLmludmVyc2Vfbm9ybWFsMzIpO1xuICAgIH1cblxufVxuXG4vKipcbiAgICBQZXJzcGVjdGl2ZSBtYXRyaXggcHJvamVjdGlvblxuXG4gICAgVGhpcyBpcyBhIHNwZWNpYWxpemVkIHBlcnNwZWN0aXZlIGNhbWVyYSB0aGF0LCBnaXZlbiBhIGRlc2lyZWQgY2FtZXJhIGZvY2FsIGxlbmd0aCAod2hpY2ggY2FuIGFsc28gdmFyeSBieSB6b29tIGxldmVsKSxcbiAgICBjb25zdHJhaW5zIHRoZSBjYW1lcmEgaGVpZ2h0IGFib3ZlIHRoZSBncm91bmQgcGxhbmUgc3VjaCB0aGF0IHRoZSBkaXNwbGF5ZWQgZ3JvdW5kIGFyZWEgb2YgdGhlIG1hcCBtYXRjaGVzIHRoYXQgb2ZcbiAgICBhIHRyYWRpdGlvbmFsIHdlYiBtZXJjYXRvciBtYXAuIFRoaXMgbWVhbnMgeW91IGNhbiBzZXQgdGhlIGNhbWVyYSBsb2NhdGlvbiBieSBbbGF0LCBsbmcsIHpvb21dIGFzIHlvdSB3b3VsZCBhIHR5cGljYWxcbiAgICB3ZWIgbWVyY2F0b3IgbWFwLCB0aGVuIGFkanVzdCB0aGUgZm9jYWwgbGVuZ3RoIGFzIG5lZWRlZC5cblxuICAgIFZhbmlzaGluZyBwb2ludCBjYW4gYWxzbyBiZSBhZGp1c3RlZCB0byBhY2hpZXZlIGRpZmZlcmVudCBcInZpZXdpbmcgYW5nbGVzXCIsIGUuZy4gaW5zdGVhZCBvZiBsb29raW5nIHN0cmFpZ2h0IGRvd24gaW50b1xuICAgIHRoZSBjZW50ZXIgb2YgdGhlIHZpZXdwb3J0LCB0aGUgY2FtZXJhIGFwcGVhcnMgdG8gYmUgdGlsdGVkIGF0IGFuIGFuZ2xlLiBGb3IgZXhhbXBsZTpcblxuICAgIFswLCAwXSA9IGxvb2tpbmcgdG93YXJkcyBjZW50ZXIgb2Ygdmlld3BvcnRcbiAgICBbLTI1MCwgLTI1MF0gPSBsb29raW5nIDI1MCBwaXhlbHMgZnJvbSB0aGUgdmlld3BvcnQgY2VudGVyIHRvIHRoZSBsb3dlci1sZWZ0IGNvcm5lclxuICAgIFs0MDAsIDBdID0gbG9va2luZyA0MDAgcGl4ZWxzIHRvIHRoZSByaWdodCBvZiB0aGUgdmlld3BvcnQgY2VudGVyXG4qL1xuY2xhc3MgUGVyc3BlY3RpdmVDYW1lcmEgZXh0ZW5kcyBDYW1lcmEge1xuXG4gICAgY29uc3RydWN0b3IobmFtZSwgdmlldywgb3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIHN1cGVyKG5hbWUsIHZpZXcsIG9wdGlvbnMpO1xuICAgICAgICB0aGlzLnR5cGUgPSAncGVyc3BlY3RpdmUnO1xuXG4gICAgICAgIC8vIGEgc2luZ2xlIHNjYWxhciwgb3IgcGFpcnMgb2Ygc3RvcHMgbWFwcGluZyB6b29tIGxldmVscywgZS5nLiBbem9vbSwgZm9jYWwgbGVuZ3RoXVxuICAgICAgICB0aGlzLmZvY2FsX2xlbmd0aCA9IG9wdGlvbnMuZm9jYWxfbGVuZ3RoO1xuICAgICAgICB0aGlzLmZvdiA9IG9wdGlvbnMuZm92O1xuICAgICAgICBpZiAoIXRoaXMuZm9jYWxfbGVuZ3RoICYmICF0aGlzLmZvdikge1xuICAgICAgICAgICAgLy8gRGVmYXVsdCBmb2NhbCBsZW5ndGggcmFuZ2VzIGJ5IHpvb21cbiAgICAgICAgICAgIHRoaXMuZm9jYWxfbGVuZ3RoID0gW1sxNiwgMl0sIFsxNywgMi41XSwgWzE4LCAzXSwgWzE5LCA0XSwgWzIwLCA2XV07XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnZhbmlzaGluZ19wb2ludCA9IG9wdGlvbnMudmFuaXNoaW5nX3BvaW50IHx8IFswLCAwXTsgLy8gW3gsIHldXG4gICAgICAgIHRoaXMudmFuaXNoaW5nX3BvaW50ID0gdGhpcy52YW5pc2hpbmdfcG9pbnQubWFwKHBhcnNlRmxvYXQpOyAvLyB3ZSBpbXBsaWNpdGx5IG9ubHkgc3VwcG9ydCBweCB1bml0cyBoZXJlXG4gICAgICAgIHRoaXMudmFuaXNoaW5nX3BvaW50X3NrZXcgPSBbXTtcblxuICAgICAgICB0aGlzLnBvc2l0aW9uX21ldGVycyA9IG51bGw7XG4gICAgICAgIHRoaXMudmlld19tYXRyaXggPSBuZXcgRmxvYXQ2NEFycmF5KDE2KTtcbiAgICAgICAgdGhpcy5wcm9qZWN0aW9uX21hdHJpeCA9IG5ldyBGbG9hdDMyQXJyYXkoMTYpO1xuXG4gICAgICAgIC8vICdjYW1lcmEnIGlzIHRoZSBuYW1lIG9mIHRoZSBzaGFkZXIgYmxvY2ssIGUuZy4gZGV0ZXJtaW5lcyB3aGVyZSBpbiB0aGUgc2hhZGVyIHRoaXMgY29kZSBpcyBpbmplY3RlZFxuICAgICAgICBTaGFkZXJQcm9ncmFtLnJlcGxhY2VCbG9jaygnY2FtZXJhJywgYFxuICAgICAgICAgICAgdW5pZm9ybSBtYXQ0IHVfcHJvamVjdGlvbjtcbiAgICAgICAgICAgIHVuaWZvcm0gdmVjMyB1X2V5ZTtcbiAgICAgICAgICAgIHVuaWZvcm0gdmVjMiB1X3ZhbmlzaGluZ19wb2ludDtcblxuICAgICAgICAgICAgdm9pZCBjYW1lcmFQcm9qZWN0aW9uIChpbm91dCB2ZWM0IHBvc2l0aW9uKSB7XG4gICAgICAgICAgICAgICAgcG9zaXRpb24gPSB1X3Byb2plY3Rpb24gKiBwb3NpdGlvbjtcbiAgICAgICAgICAgIH1gXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgLy8gQ29uc3RyYWlucyB0aGUgY2FtZXJhIHNvIHRoYXQgdGhlIHZpZXdhYmxlIGFyZWEgbWF0Y2hlcyBnaXZlbiB0aGUgdmlld3BvcnQgaGVpZ2h0XG4gICAgLy8gKGluIHdvcmxkIHNwYWNlLCBlLmcuIG1ldGVycyksIGdpdmVuIGVpdGhlciBhIGNhbWVyYSBmb2NhbCBsZW5ndGggb3IgZmllbGQtb2Ytdmlld1xuICAgIC8vIChmb2NhbCBsZW5ndGggaXMgdXNlZCBpZiBib3RoIGFyZSBwYXNzZWQpLlxuICAgIGNvbnN0cmFpbkNhbWVyYSh7IHZpZXdfaGVpZ2h0LCBoZWlnaHQsIGZvY2FsX2xlbmd0aCwgZm92IH0pIHtcbiAgICAgICAgLy8gU29sdmUgZm9yIGNhbWVyYSBoZWlnaHRcbiAgICAgICAgaWYgKCFoZWlnaHQpIHtcbiAgICAgICAgICAgIC8vIFdlIGhhdmUgZm9jYWwgbGVuZ3RoLCBjYWxjdWxhdGUgRk9WXG4gICAgICAgICAgICBpZiAoZm9jYWxfbGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgZm92ID0gTWF0aC5hdGFuKDEgLyBmb2NhbF9sZW5ndGgpICogMjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIFdlIGhhdmUgRk9WLCBjYWxjdWxhdGUgZm9jYWwgbGVuZ3RoXG4gICAgICAgICAgICBlbHNlIGlmIChmb3YpIHtcbiAgICAgICAgICAgICAgICBmb3YgPSBmb3YgKiBNYXRoLlBJIC8gMTgwOyAvLyBjb252ZXJ0IEZPViBkZWdyZWVzIHRvIHJhZGlhbnNcbiAgICAgICAgICAgICAgICBmb2NhbF9sZW5ndGggPSAxIC8gTWF0aC50YW4oZm92IC8gMik7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIERpc3RhbmNlIHRoYXQgY2FtZXJhIHNob3VsZCBiZSBmcm9tIGdyb3VuZCBzdWNoIHRoYXQgaXQgZml0cyB0aGUgZmllbGQgb2YgdmlldyBleHBlY3RlZFxuICAgICAgICAgICAgLy8gZm9yIGEgY29udmVudGlvbmFsIHdlYiBtZXJjYXRvciBtYXAgYXQgdGhlIGN1cnJlbnQgem9vbSBsZXZlbCBhbmQgY2FtZXJhIGZvY2FsIGxlbmd0aFxuICAgICAgICAgICAgaGVpZ2h0ID0gdmlld19oZWlnaHQgLyAyICogZm9jYWxfbGVuZ3RoO1xuICAgICAgICB9XG4gICAgICAgIC8vIFNvbHZlIGZvciBjYW1lcmEgZm9jYWwgbGVuZ3RoIC8gZmllbGQtb2Ytdmlld1xuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGZvY2FsX2xlbmd0aCA9IDIgKiBoZWlnaHQgLyB2aWV3X2hlaWdodDtcbiAgICAgICAgICAgIGZvdiA9IE1hdGguYXRhbigxIC8gZm9jYWxfbGVuZ3RoKSAqIDI7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4geyB2aWV3X2hlaWdodCwgaGVpZ2h0LCBmb2NhbF9sZW5ndGgsIGZvdiB9O1xuICAgIH1cblxuICAgIHVwZGF0ZU1hdHJpY2VzKCkge1xuICAgICAgICAvLyBUT0RPOiBvbmx5IHJlLWNhbGN1bGF0ZSB0aGVzZSB2YXJzIHdoZW4gbmVjZXNzYXJ5XG5cbiAgICAgICAgLy8gSGVpZ2h0IG9mIHRoZSB2aWV3cG9ydCBpbiBtZXRlcnMgYXQgY3VycmVudCB6b29tXG4gICAgICAgIHZhciB2aWV3cG9ydF9oZWlnaHQgPSB0aGlzLnZpZXcuc2l6ZS5jc3MuaGVpZ2h0ICogdGhpcy52aWV3Lm1ldGVyc19wZXJfcGl4ZWw7XG5cbiAgICAgICAgLy8gQ29tcHV0ZSBjYW1lcmEgcHJvcGVydGllcyB0byBmaXQgZGVzaXJlZCB2aWV3XG4gICAgICAgIHZhciB7IGhlaWdodCwgZm92IH0gPSB0aGlzLmNvbnN0cmFpbkNhbWVyYSh7XG4gICAgICAgICAgICB2aWV3X2hlaWdodDogdmlld3BvcnRfaGVpZ2h0LFxuICAgICAgICAgICAgZm9jYWxfbGVuZ3RoOiBVdGlscy5pbnRlcnBvbGF0ZSh0aGlzLnZpZXcuem9vbSwgdGhpcy5mb2NhbF9sZW5ndGgpLFxuICAgICAgICAgICAgZm92OiBVdGlscy5pbnRlcnBvbGF0ZSh0aGlzLnZpZXcuem9vbSwgdGhpcy5mb3YpXG4gICAgICAgICB9KTtcblxuICAgICAgICAvLyBWaWV3IG1hdHJpeFxuICAgICAgICB2YXIgcG9zaXRpb24gPSBbdGhpcy52aWV3LmNlbnRlci5tZXRlcnMueCwgdGhpcy52aWV3LmNlbnRlci5tZXRlcnMueSwgaGVpZ2h0XTtcbiAgICAgICAgdGhpcy5wb3NpdGlvbl9tZXRlcnMgPSBwb3NpdGlvbjtcblxuICAgICAgICAvLyBtYXQ0Lmxvb2tBdCh0aGlzLnZpZXdfbWF0cml4LFxuICAgICAgICAvLyAgICAgdmVjMy5mcm9tVmFsdWVzKC4uLnBvc2l0aW9uKSxcbiAgICAgICAgLy8gICAgIHZlYzMuZnJvbVZhbHVlcyhwb3NpdGlvblswXSwgcG9zaXRpb25bMV0sIGhlaWdodCAtIDEpLFxuICAgICAgICAvLyAgICAgdmVjMy5mcm9tVmFsdWVzKDAsIDEsIDApKTtcbiAgICAgICAgLy8gRXhjbHVkZSBjYW1lcmEgaGVpZ2h0IGZyb20gdmlldyBtYXRyaXhcbiAgICAgICAgbWF0NC5sb29rQXQodGhpcy52aWV3X21hdHJpeCxcbiAgICAgICAgICAgIHZlYzMuZnJvbVZhbHVlcyhwb3NpdGlvblswXSwgcG9zaXRpb25bMV0sIDApLFxuICAgICAgICAgICAgdmVjMy5mcm9tVmFsdWVzKHBvc2l0aW9uWzBdLCBwb3NpdGlvblsxXSwgLTEpLFxuICAgICAgICAgICAgdmVjMy5mcm9tVmFsdWVzKDAsIDEsIDApKTtcblxuICAgICAgICAvLyBQcm9qZWN0aW9uIG1hdHJpeFxuICAgICAgICBtYXQ0LnBlcnNwZWN0aXZlKHRoaXMucHJvamVjdGlvbl9tYXRyaXgsIGZvdiwgdGhpcy52aWV3LmFzcGVjdCwgMSwgaGVpZ2h0ICogMik7XG5cbiAgICAgICAgLy8gQ29udmVydCB2YW5pc2hpbmcgcG9pbnQgZnJvbSBwaXhlbHMgdG8gdmlld3BvcnQgc3BhY2VcbiAgICAgICAgdGhpcy52YW5pc2hpbmdfcG9pbnRfc2tld1swXSA9IHRoaXMudmFuaXNoaW5nX3BvaW50WzBdIC8gdGhpcy52aWV3LnNpemUuY3NzLndpZHRoO1xuICAgICAgICB0aGlzLnZhbmlzaGluZ19wb2ludF9za2V3WzFdID0gdGhpcy52YW5pc2hpbmdfcG9pbnRbMV0gLyB0aGlzLnZpZXcuc2l6ZS5jc3MuaGVpZ2h0O1xuXG4gICAgICAgIC8vIEFkanVzdCBwcm9qZWN0aW9uIG1hdHJpeCB0byBpbmNsdWRlIHZhbmlzaGluZyBwb2ludCBza2V3XG4gICAgICAgIHRoaXMucHJvamVjdGlvbl9tYXRyaXhbOF0gPSAtdGhpcy52YW5pc2hpbmdfcG9pbnRfc2tld1swXSAqIDI7IC8vIHogY29sdW1uIG9mIHggcm93LCBlLmcuIGFtb3VudCB6IHNrZXdzIHhcbiAgICAgICAgdGhpcy5wcm9qZWN0aW9uX21hdHJpeFs5XSA9IC10aGlzLnZhbmlzaGluZ19wb2ludF9za2V3WzFdICogMjsgLy8geiBjb2x1bW4gb2YgeSByb3csIGUuZy4gYW1vdW50IHogc2tld3MgeVxuXG4gICAgICAgIC8vIFRyYW5zbGF0ZSBnZW9tZXRyeSBpbnRvIHRoZSBkaXN0YW5jZSBzbyB0aGF0IGNhbWVyYSBpcyBhcHByb3ByaWF0ZSBoZWlnaHQgYWJvdmUgZ3JvdW5kXG4gICAgICAgIC8vIEFkZGl0aW9uYWxseSwgYWRqdXN0IHh5IHRvIGNvbXBlbnNhdGUgZm9yIGFueSB2YW5pc2hpbmcgcG9pbnQgc2tldywgZS5nLiBtb3ZlIGdlb21ldHJ5IHNvIHRoYXQgdGhlIGRpc3BsYXllZCBnXG4gICAgICAgIC8vIHBsYW5lIG9mIHRoZSBtYXAgbWF0Y2hlcyB0aGF0IGV4cGVjdGVkIGJ5IGEgdHJhZGl0aW9uYWwgd2ViIG1lcmNhdG9yIG1hcCBhdCB0aGlzIFtsYXQsIGxuZywgem9vbV0uXG4gICAgICAgIG1hdDQudHJhbnNsYXRlKHRoaXMucHJvamVjdGlvbl9tYXRyaXgsIHRoaXMucHJvamVjdGlvbl9tYXRyaXgsXG4gICAgICAgICAgICB2ZWMzLmZyb21WYWx1ZXMoXG4gICAgICAgICAgICAgICAgdmlld3BvcnRfaGVpZ2h0LzIgKiB0aGlzLnZpZXcuYXNwZWN0ICogKC10aGlzLnZhbmlzaGluZ19wb2ludF9za2V3WzBdICogMiksXG4gICAgICAgICAgICAgICAgdmlld3BvcnRfaGVpZ2h0LzIgKiAoLXRoaXMudmFuaXNoaW5nX3BvaW50X3NrZXdbMV0gKiAyKSxcbiAgICAgICAgICAgICAgICAwXG4gICAgICAgICAgICApXG4gICAgICAgICk7XG5cbiAgICAgICAgLy8gSW5jbHVkZSBjYW1lcmEgaGVpZ2h0IGluIHByb2plY3Rpb24gbWF0cml4XG4gICAgICAgIG1hdDQudHJhbnNsYXRlKHRoaXMucHJvamVjdGlvbl9tYXRyaXgsIHRoaXMucHJvamVjdGlvbl9tYXRyaXgsIHZlYzMuZnJvbVZhbHVlcygwLCAwLCAtaGVpZ2h0KSk7XG4gICAgfVxuXG4gICAgdXBkYXRlKCkge1xuICAgICAgICBzdXBlci51cGRhdGUoKTtcbiAgICAgICAgdGhpcy51cGRhdGVNYXRyaWNlcygpO1xuICAgIH1cblxuICAgIHNldHVwUHJvZ3JhbShwcm9ncmFtKSB7XG4gICAgICAgIHByb2dyYW0udW5pZm9ybSgnTWF0cml4NGZ2JywgJ3VfcHJvamVjdGlvbicsIHRoaXMucHJvamVjdGlvbl9tYXRyaXgpO1xuICAgICAgICBwcm9ncmFtLnVuaWZvcm0oJzNmJywgJ3VfZXllJywgWzAsIDAsIHRoaXMucG9zaXRpb25fbWV0ZXJzWzJdXSk7XG4gICAgICAgIHByb2dyYW0udW5pZm9ybSgnMmZ2JywgJ3VfdmFuaXNoaW5nX3BvaW50JywgdGhpcy52YW5pc2hpbmdfcG9pbnRfc2tldyk7XG4gICAgfVxuXG59XG5cbi8vIElzb21ldHJpYy1zdHlsZSBwcm9qZWN0aW9uXG4vLyBOb3RlOiB0aGlzIGlzIGFjdHVhbGx5IGFuIFwiYXhvbm9tZXRyaWNcIiBwcm9qZWN0aW9uLCBidXQgSSdtIHVzaW5nIHRoZSBjb2xsb3F1aWFsIHRlcm0gaXNvbWV0cmljIGJlY2F1c2UgaXQgaXMgbW9yZSByZWNvZ25pemFibGUuXG4vLyBBbiBpc29tZXRyaWMgcHJvamVjdGlvbiBpcyBhIHNwZWNpZmljIHN1YnNldCBvZiBheG9ub21ldHJpYyBwcm9qZWN0aW9ucy5cbi8vICdheGlzJyBkZXRlcm1pbmVzIHRoZSB4eSBza2V3IGFwcGxpZWQgdG8gYSB2ZXJ0ZXggYmFzZWQgb24gaXRzIHogY29vcmRpbmF0ZSwgZS5nLiBbMCwgMV0gYXhpcyBjYXVzZXMgYnVpbGRpbmdzIHRvIGJlIGRyYXduXG4vLyBzdHJhaWdodCB1cHdhcmRzIG9uIHNjcmVlbiBhdCB0aGVpciB0cnVlIGhlaWdodCwgWzAsIC41XSB3b3VsZCBkcmF3IHRoZW0gdXAgYXQgaGFsZi1oZWlnaHQsIFsxLCAwXSB3b3VsZCBiZSBzaWRld2F5cywgZXRjLlxuY2xhc3MgSXNvbWV0cmljQ2FtZXJhIGV4dGVuZHMgQ2FtZXJhIHtcblxuICAgIGNvbnN0cnVjdG9yKG5hbWUsIHZpZXcsIG9wdGlvbnMgPSB7fSkge1xuICAgICAgICBzdXBlcihuYW1lLCB2aWV3LCBvcHRpb25zKTtcbiAgICAgICAgdGhpcy50eXBlID0gJ2lzb21ldHJpYyc7XG4gICAgICAgIHRoaXMuYXhpcyA9IG9wdGlvbnMuYXhpcyB8fCB7IHg6IDAsIHk6IDEgfTtcbiAgICAgICAgaWYgKHRoaXMuYXhpcy5sZW5ndGggPT09IDIpIHtcbiAgICAgICAgICAgIHRoaXMuYXhpcyA9IHsgeDogdGhpcy5heGlzWzBdLCB5OiB0aGlzLmF4aXNbMV0gfTsgLy8gYWxsb3cgYXhpcyB0byBhbHNvIGJlIHBhc3NlZCBhcyAyLWVsZW0gYXJyYXlcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMucG9zaXRpb25fbWV0ZXJzID0gbnVsbDtcbiAgICAgICAgdGhpcy52aWV3cG9ydF9oZWlnaHQgPSBudWxsO1xuXG4gICAgICAgIHRoaXMudmlld19tYXRyaXggPSBuZXcgRmxvYXQ2NEFycmF5KDE2KTtcbiAgICAgICAgdGhpcy5wcm9qZWN0aW9uX21hdHJpeCA9IG5ldyBGbG9hdDMyQXJyYXkoMTYpO1xuXG4gICAgICAgIC8vICdjYW1lcmEnIGlzIHRoZSBuYW1lIG9mIHRoZSBzaGFkZXIgYmxvY2ssIGUuZy4gZGV0ZXJtaW5lcyB3aGVyZSBpbiB0aGUgc2hhZGVyIHRoaXMgY29kZSBpcyBpbmplY3RlZFxuICAgICAgICBTaGFkZXJQcm9ncmFtLnJlcGxhY2VCbG9jaygnY2FtZXJhJywgYFxuICAgICAgICAgICAgdW5pZm9ybSBtYXQ0IHVfcHJvamVjdGlvbjtcbiAgICAgICAgICAgIHVuaWZvcm0gdmVjMyB1X2V5ZTtcbiAgICAgICAgICAgIHVuaWZvcm0gdmVjMiB1X3ZhbmlzaGluZ19wb2ludDtcblxuICAgICAgICAgICAgdm9pZCBjYW1lcmFQcm9qZWN0aW9uIChpbm91dCB2ZWM0IHBvc2l0aW9uKSB7XG4gICAgICAgICAgICAgICAgcG9zaXRpb24gPSB1X3Byb2plY3Rpb24gKiBwb3NpdGlvbjtcbiAgICAgICAgICAgICAgICAvLyBwb3NpdGlvbi54eSArPSBwb3NpdGlvbi56ICogdV9pc29tZXRyaWNfYXhpcztcblxuICAgICAgICAgICAgICAgIC8vIFJldmVyc2UgeiBmb3IgZGVwdGggYnVmZmVyIHNvIHVwIGlzIG5lZ2F0aXZlLFxuICAgICAgICAgICAgICAgIC8vIGFuZCBzY2FsZSBkb3duIHZhbHVlcyBzbyBvYmplY3RzIGhpZ2hlciB0aGFuIG9uZSBzY3JlZW4gaGVpZ2h0IHdpbGwgbm90IGdldCBjbGlwcGVkXG4gICAgICAgICAgICAgICAgLy8gcHVsbCBmb3J3YXJkIHNsaWdodGx5IHRvIGF2b2lkIGdvaW5nIHBhc3QgZmFyIGNsaXBwaW5nIHBsYW5lXG4gICAgICAgICAgICAgICAgcG9zaXRpb24ueiA9IC1wb3NpdGlvbi56IC8gMTAwLiArIDEuIC0gMC4wMDE7XG4gICAgICAgICAgICB9YFxuICAgICAgICApO1xuICAgIH1cblxuICAgIHVwZGF0ZSgpIHtcbiAgICAgICAgc3VwZXIudXBkYXRlKCk7XG5cbiAgICAgICAgdGhpcy52aWV3cG9ydF9oZWlnaHQgPSB0aGlzLnZpZXcuc2l6ZS5jc3MuaGVpZ2h0ICogdGhpcy52aWV3Lm1ldGVyc19wZXJfcGl4ZWw7XG4gICAgICAgIHZhciBwb3NpdGlvbiA9IFt0aGlzLnZpZXcuY2VudGVyLm1ldGVycy54LCB0aGlzLnZpZXcuY2VudGVyLm1ldGVycy55LCB0aGlzLnZpZXdwb3J0X2hlaWdodF07XG4gICAgICAgIHRoaXMucG9zaXRpb25fbWV0ZXJzID0gcG9zaXRpb247XG5cbiAgICAgICAgLy8gVmlld1xuICAgICAgICBtYXQ0LmlkZW50aXR5KHRoaXMudmlld19tYXRyaXgpO1xuICAgICAgICBtYXQ0LnRyYW5zbGF0ZSh0aGlzLnZpZXdfbWF0cml4LCB0aGlzLnZpZXdfbWF0cml4LCB2ZWMzLmZyb21WYWx1ZXMoLXBvc2l0aW9uWzBdLCAtcG9zaXRpb25bMV0sIDApKTtcblxuICAgICAgICAvLyBQcm9qZWN0aW9uXG4gICAgICAgIG1hdDQuaWRlbnRpdHkodGhpcy5wcm9qZWN0aW9uX21hdHJpeCk7XG5cbiAgICAgICAgLy8gYXBwbHkgaXNvbWV0cmljIHNrZXdcbiAgICAgICAgdGhpcy5wcm9qZWN0aW9uX21hdHJpeFs4XSA9IHRoaXMuYXhpcy54IC8gdGhpcy52aWV3LmFzcGVjdDsgLy8geiBjb2x1bW4gb2YgeCByb3csIGUuZy4gYW1vdW50IHogc2tld3MgeFxuICAgICAgICB0aGlzLnByb2plY3Rpb25fbWF0cml4WzldID0gdGhpcy5heGlzLnk7ICAgICAgICAgICAgICAgICAgICAvLyB6IGNvbHVtbiBvZiB4IHJvdywgZS5nLiBhbW91bnQgeiBza2V3cyB5XG5cbiAgICAgICAgLy8gY29udmVydCBtZXRlcnMgdG8gdmlld3BvcnRcbiAgICAgICAgbWF0NC5zY2FsZSh0aGlzLnByb2plY3Rpb25fbWF0cml4LCB0aGlzLnByb2plY3Rpb25fbWF0cml4LFxuICAgICAgICAgICAgdmVjMy5mcm9tVmFsdWVzKFxuICAgICAgICAgICAgICAgIDIgLyB0aGlzLnZpZXcuc2l6ZS5tZXRlcnMueCxcbiAgICAgICAgICAgICAgICAyIC8gdGhpcy52aWV3LnNpemUubWV0ZXJzLnksXG4gICAgICAgICAgICAgICAgMiAvIHRoaXMudmlldy5zaXplLm1ldGVycy55XG4gICAgICAgICAgICApXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgc2V0dXBQcm9ncmFtKHByb2dyYW0pIHtcbiAgICAgICAgcHJvZ3JhbS51bmlmb3JtKCdNYXRyaXg0ZnYnLCAndV9wcm9qZWN0aW9uJywgdGhpcy5wcm9qZWN0aW9uX21hdHJpeCk7XG5cbiAgICAgICAgcHJvZ3JhbS51bmlmb3JtKCczZnYnLCAndV9leWUnLCBbMCwgMCwgdGhpcy52aWV3cG9ydF9oZWlnaHRdKTtcbiAgICAgICAgLy8gcHJvZ3JhbS51bmlmb3JtKCczZicsICd1X2V5ZScsIHRoaXMudmlld3BvcnRfaGVpZ2h0ICogdGhpcy5heGlzLngsIHRoaXMudmlld3BvcnRfaGVpZ2h0ICogdGhpcy5heGlzLnksIHRoaXMudmlld3BvcnRfaGVpZ2h0KTtcbiAgICAgICAgcHJvZ3JhbS51bmlmb3JtKCcyZnYnLCAndV92YW5pc2hpbmdfcG9pbnQnLCBbMCwgMF0pO1xuICAgIH1cblxufVxuXG4vLyBGbGF0IHByb2plY3Rpb24gKGUuZy4ganVzdCB0b3AtZG93biwgbm8gcGVyc3BlY3RpdmUpIC0gYSBkZWdlbmVyYXRlIGlzb21ldHJpYyBjYW1lcmFcbmNsYXNzIEZsYXRDYW1lcmEgZXh0ZW5kcyBJc29tZXRyaWNDYW1lcmEge1xuXG4gICAgY29uc3RydWN0b3IobmFtZSwgdmlldywgb3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIHN1cGVyKG5hbWUsIHZpZXcsIG9wdGlvbnMpO1xuICAgICAgICB0aGlzLnR5cGUgPSAnZmxhdCc7XG4gICAgfVxuXG4gICAgdXBkYXRlKCkge1xuICAgICAgICAvLyBBeGlzIGlzIGZpeGVkIHRvICgwLCAwKSBmb3IgZmxhdCBjYW1lcmFcbiAgICAgICAgdGhpcy5heGlzLnggPSAwO1xuICAgICAgICB0aGlzLmF4aXMueSA9IDA7XG5cbiAgICAgICAgc3VwZXIudXBkYXRlKCk7XG4gICAgfVxuXG59XG4iLCIvLyBNaXNjZWxsYW5lb3VzIGdlbyBmdW5jdGlvbnNcblxudmFyIEdlbztcbmV4cG9ydCBkZWZhdWx0IEdlbyA9IHt9O1xuXG4vLyBQcm9qZWN0aW9uIGNvbnN0YW50c1xuR2VvLmRlZmF1bHRfc291cmNlX21heF96b29tID0gMTg7XG5HZW8uZGVmYXVsdF92aWV3X21heF96b29tID0gMjA7XG5HZW8udGlsZV9zaXplID0gMjU2O1xuR2VvLmhhbGZfY2lyY3VtZmVyZW5jZV9tZXRlcnMgPSAyMDAzNzUwOC4zNDI3ODkyNDQ7XG5HZW8uY2lyY3VtZmVyZW5jZV9tZXRlcnMgPSBHZW8uaGFsZl9jaXJjdW1mZXJlbmNlX21ldGVycyAqIDI7XG5HZW8ubWluX3pvb21fbWV0ZXJzX3Blcl9waXhlbCA9IEdlby5jaXJjdW1mZXJlbmNlX21ldGVycyAvIEdlby50aWxlX3NpemU7IC8vIG1pbiB6b29tIGRyYXdzIHdvcmxkIGFzIDIgdGlsZXMgd2lkZVxuXG5sZXQgbWV0ZXJzX3Blcl9waXhlbCA9IFtdO1xuR2VvLm1ldGVyc1BlclBpeGVsID0gZnVuY3Rpb24gKHopIHtcbiAgICBtZXRlcnNfcGVyX3BpeGVsW3pdID0gbWV0ZXJzX3Blcl9waXhlbFt6XSB8fCBHZW8ubWluX3pvb21fbWV0ZXJzX3Blcl9waXhlbCAvIE1hdGgucG93KDIsIHopO1xuICAgIHJldHVybiBtZXRlcnNfcGVyX3BpeGVsW3pdO1xufTtcblxubGV0IG1ldGVyc19wZXJfdGlsZSA9IFtdO1xuR2VvLm1ldGVyc1BlclRpbGUgPSBmdW5jdGlvbiAoeikge1xuICAgIG1ldGVyc19wZXJfdGlsZVt6XSA9IG1ldGVyc19wZXJfdGlsZVt6XSB8fCBHZW8uY2lyY3VtZmVyZW5jZV9tZXRlcnMgLyBNYXRoLnBvdygyLCB6KTtcbiAgICByZXR1cm4gbWV0ZXJzX3Blcl90aWxlW3pdO1xufTtcblxuLy8gQ29udmVyc2lvbiBmdW5jdGlvbnMgYmFzZWQgb24gYW4gZGVmaW5lZCB0aWxlIHNjYWxlXG5HZW8udGlsZV9zY2FsZSA9IDQwOTY7IC8vIGNvb3JkaW5hdGVzIGFyZSBsb2NhbGx5IHNjYWxlZCB0byB0aGUgcmFuZ2UgWzAsIHRpbGVfc2NhbGVdXG5HZW8udW5pdHNfcGVyX3BpeGVsID0gR2VvLnRpbGVfc2NhbGUgLyBHZW8udGlsZV9zaXplO1xuR2VvLmhlaWdodF9zY2FsZSA9IDE2OyAgLy8gcHJvdmlkZXMgc3ViLW1ldGVyIHByZWNpc2lvbiBmb3IgaGVpZ2h0IHZhbHVlcyAoMTZ0aHMgb2YgYSBtZXRlcnMpXG5cbmxldCB1bml0c19wZXJfbWV0ZXIgPSBbXTtcbkdlby51bml0c1Blck1ldGVyID0gZnVuY3Rpb24gKHopIHtcbiAgICB1bml0c19wZXJfbWV0ZXJbel0gPSB1bml0c19wZXJfbWV0ZXJbel0gfHwgR2VvLnRpbGVfc2NhbGUgLyAoR2VvLnRpbGVfc2l6ZSAqIEdlby5tZXRlcnNQZXJQaXhlbCh6KSk7XG4gICAgcmV0dXJuIHVuaXRzX3Blcl9tZXRlclt6XTtcbn07XG5cbi8vIENvbnZlcnQgdGlsZSBsb2NhdGlvbiB0byBtZXJjYXRvciBtZXRlcnMgLSBtdWx0aXBseSBieSBwaXhlbHMgcGVyIHRpbGUsIHRoZW4gYnkgbWV0ZXJzIHBlciBwaXhlbCwgYWRqdXN0IGZvciBtYXAgb3JpZ2luXG5HZW8ubWV0ZXJzRm9yVGlsZSA9IGZ1bmN0aW9uICh0aWxlKSB7XG4gICAgcmV0dXJuIHtcbiAgICAgICAgeDogdGlsZS54ICogR2VvLmNpcmN1bWZlcmVuY2VfbWV0ZXJzIC8gTWF0aC5wb3coMiwgdGlsZS56KSAtIEdlby5oYWxmX2NpcmN1bWZlcmVuY2VfbWV0ZXJzLFxuICAgICAgICB5OiAtKHRpbGUueSAqIEdlby5jaXJjdW1mZXJlbmNlX21ldGVycyAvIE1hdGgucG93KDIsIHRpbGUueikgLSBHZW8uaGFsZl9jaXJjdW1mZXJlbmNlX21ldGVycylcbiAgICB9O1xufTtcblxuLyoqXG4gICBHaXZlbiBhIHBvaW50IGluIG1lcmNhdG9yIG1ldGVycyBhbmQgYSB6b29tIGxldmVsLCByZXR1cm4gdGhlIHRpbGUgWC9ZL1ogdGhhdCB0aGUgcG9pbnQgbGllcyBpblxuKi9cbkdlby50aWxlRm9yTWV0ZXJzID0gZnVuY3Rpb24gKFt4LCB5XSwgem9vbSkge1xuICAgIHJldHVybiB7XG4gICAgICAgIHg6IE1hdGguZmxvb3IoKHggKyBHZW8uaGFsZl9jaXJjdW1mZXJlbmNlX21ldGVycykgLyAoR2VvLmNpcmN1bWZlcmVuY2VfbWV0ZXJzIC8gTWF0aC5wb3coMiwgem9vbSkpKSxcbiAgICAgICAgeTogTWF0aC5mbG9vcigoLXkgKyBHZW8uaGFsZl9jaXJjdW1mZXJlbmNlX21ldGVycykgLyAoR2VvLmNpcmN1bWZlcmVuY2VfbWV0ZXJzIC8gTWF0aC5wb3coMiwgem9vbSkpKSxcbiAgICAgICAgejogem9vbVxuICAgIH07XG59O1xuXG4vLyBXcmFwIGEgdGlsZSB0byBwb3NpdGl2ZSAjcyBmb3Igem9vbVxuLy8gT3B0aW9uYWxseSBzcGVjaWZ5IHRoZSBheGVzIHRvIHdyYXBcbkdlby53cmFwVGlsZSA9IGZ1bmN0aW9uKHsgeCwgeSwgeiB9LCBtYXNrID0geyB4OiB0cnVlLCB5OiBmYWxzZSB9KSB7XG4gICAgdmFyIG0gPSAoMSA8PCB6KSAtIDE7XG4gICAgaWYgKG1hc2sueCkge1xuICAgICAgICB4ID0geCAmIG07XG4gICAgfVxuICAgIGlmIChtYXNrLnkpIHtcbiAgICAgICAgeSA9IHkgJiBtO1xuICAgIH1cbiAgICByZXR1cm4geyB4LCB5LCB6IH07XG59O1xuXG4vKipcbiAgIENvbnZlcnQgbWVyY2F0b3IgbWV0ZXJzIHRvIGxhdC1sbmdcbiovXG5HZW8ubWV0ZXJzVG9MYXRMbmcgPSBmdW5jdGlvbiAoW3gsIHldKSB7XG5cbiAgICB4IC89IEdlby5oYWxmX2NpcmN1bWZlcmVuY2VfbWV0ZXJzO1xuICAgIHkgLz0gR2VvLmhhbGZfY2lyY3VtZmVyZW5jZV9tZXRlcnM7XG5cbiAgICB5ID0gKDIgKiBNYXRoLmF0YW4oTWF0aC5leHAoeSAqIE1hdGguUEkpKSAtIChNYXRoLlBJIC8gMikpIC8gTWF0aC5QSTtcblxuICAgIHggKj0gMTgwO1xuICAgIHkgKj0gMTgwO1xuXG4gICAgcmV0dXJuIFt4LCB5XTtcbn07XG5cbi8qKlxuICBDb252ZXJ0IGxhdC1sbmcgdG8gbWVyY2F0b3IgbWV0ZXJzXG4qL1xuR2VvLmxhdExuZ1RvTWV0ZXJzID0gZnVuY3Rpb24oW3gsIHldKSB7XG5cbiAgICAvLyBMYXRpdHVkZVxuICAgIHkgPSBNYXRoLmxvZyhNYXRoLnRhbih5Kk1hdGguUEkvMzYwICsgTWF0aC5QSS80KSkgLyBNYXRoLlBJO1xuICAgIHkgKj0gR2VvLmhhbGZfY2lyY3VtZmVyZW5jZV9tZXRlcnM7XG5cbiAgICAvLyBMb25naXR1ZGVcbiAgICB4ICo9IEdlby5oYWxmX2NpcmN1bWZlcmVuY2VfbWV0ZXJzIC8gMTgwO1xuXG4gICAgcmV0dXJuIFt4LCB5XTtcbn07XG5cbkdlby53cmFwTG5nID0gZnVuY3Rpb24oeCkge1xuICAgIGlmICh4ID4gMTgwIHx8IHggPCAtMTgwKSB7XG4gICAgICAgIHggPSAoKHggKyAxODApICUgMzYwICsgMzYwKSAlIDM2MCAtIDE4MDtcbiAgICB9XG4gICAgcmV0dXJuIHg7XG59O1xuXG4vLyBSdW4gYW4gaW4tcGxhY2UgdHJhbnNmb3JtIGZ1bmN0aW9uIG9uIGVhY2ggY29vb3JkaW5hdGUgaW4gYSBHZW9KU09OIGdlb21ldHJ5XG5HZW8udHJhbnNmb3JtR2VvbWV0cnkgPSBmdW5jdGlvbiAoZ2VvbWV0cnksIHRyYW5zZm9ybSkge1xuICAgIGlmIChnZW9tZXRyeSA9PSBudWxsKSB7XG4gICAgICAgIHJldHVybjsgLy8gc2tpcCBpZiBtaXNzaW5nIGdlb21ldHJ5ICh2YWxpZCBHZW9KU09OKVxuICAgIH1cblxuICAgIGlmIChnZW9tZXRyeS50eXBlID09PSAnUG9pbnQnKSB7XG4gICAgICAgIHRyYW5zZm9ybShnZW9tZXRyeS5jb29yZGluYXRlcyk7XG4gICAgfVxuICAgIGVsc2UgaWYgKGdlb21ldHJ5LnR5cGUgPT09ICdMaW5lU3RyaW5nJyB8fCBnZW9tZXRyeS50eXBlID09PSAnTXVsdGlQb2ludCcpIHtcbiAgICAgICAgZ2VvbWV0cnkuY29vcmRpbmF0ZXMuZm9yRWFjaCh0cmFuc2Zvcm0pO1xuICAgIH1cbiAgICBlbHNlIGlmIChnZW9tZXRyeS50eXBlID09PSAnUG9seWdvbicgfHwgZ2VvbWV0cnkudHlwZSA9PT0gJ011bHRpTGluZVN0cmluZycpIHtcbiAgICAgICAgZ2VvbWV0cnkuY29vcmRpbmF0ZXMuZm9yRWFjaChjb29yZGluYXRlcyA9PiBjb29yZGluYXRlcy5mb3JFYWNoKHRyYW5zZm9ybSkpO1xuICAgIH1cbiAgICBlbHNlIGlmIChnZW9tZXRyeS50eXBlID09PSAnTXVsdGlQb2x5Z29uJykge1xuICAgICAgICBnZW9tZXRyeS5jb29yZGluYXRlcy5mb3JFYWNoKHBvbHlnb24gPT4ge1xuICAgICAgICAgICAgcG9seWdvbi5mb3JFYWNoKGNvb3JkaW5hdGVzID0+IGNvb3JkaW5hdGVzLmZvckVhY2godHJhbnNmb3JtKSk7XG4gICAgICAgIH0pO1xuICAgIH1cbiAgICAvLyBUT0RPOiBzdXBwb3J0IEdlb21ldHJ5Q29sbGVjdGlvblxufTtcblxuR2VvLmJveEludGVyc2VjdCA9IGZ1bmN0aW9uIChiMSwgYjIpIHtcbiAgICByZXR1cm4gIShcbiAgICAgICAgYjIuc3cueCA+IGIxLm5lLnggfHxcbiAgICAgICAgYjIubmUueCA8IGIxLnN3LnggfHxcbiAgICAgICAgYjIuc3cueSA+IGIxLm5lLnkgfHxcbiAgICAgICAgYjIubmUueSA8IGIxLnN3LnlcbiAgICApO1xufTtcblxuLy8gRmluZHMgdGhlIGF4aXMtYWxpZ25lZCBib3VuZGluZyBib3ggZm9yIGEgcG9seWdvblxuR2VvLmZpbmRCb3VuZGluZ0JveCA9IGZ1bmN0aW9uIChwb2x5Z29uKSB7XG4gICAgdmFyIG1pbl94ID0gSW5maW5pdHksXG4gICAgICAgIG1heF94ID0gLUluZmluaXR5LFxuICAgICAgICBtaW5feSA9IEluZmluaXR5LFxuICAgICAgICBtYXhfeSA9IC1JbmZpbml0eTtcblxuICAgIC8vIE9ubHkgbmVlZCB0byBleGFtaW5lIG91dGVyIHJpbmcgKHBvbHlnb25bMF0pXG4gICAgdmFyIG51bV9jb29yZHMgPSBwb2x5Z29uWzBdLmxlbmd0aDtcbiAgICBmb3IgKHZhciBjPTA7IGMgPCBudW1fY29vcmRzOyBjKyspIHtcbiAgICAgICAgdmFyIGNvb3JkID0gcG9seWdvblswXVtjXTtcblxuICAgICAgICBpZiAoY29vcmRbMF0gPCBtaW5feCkge1xuICAgICAgICAgICAgbWluX3ggPSBjb29yZFswXTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY29vcmRbMV0gPCBtaW5feSkge1xuICAgICAgICAgICAgbWluX3kgPSBjb29yZFsxXTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY29vcmRbMF0gPiBtYXhfeCkge1xuICAgICAgICAgICAgbWF4X3ggPSBjb29yZFswXTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoY29vcmRbMV0gPiBtYXhfeSkge1xuICAgICAgICAgICAgbWF4X3kgPSBjb29yZFsxXTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBbbWluX3gsIG1pbl95LCBtYXhfeCwgbWF4X3ldO1xufTtcblxuLy8gQ29udmVydCBnZW9tZXRyeSB0eXBlIHRvIG9uZSBvZjogJ3BvaW50JywgJ2xpbmUnLCAncG9seWdvbidcbkdlby5nZW9tZXRyeVR5cGUgPSBmdW5jdGlvbih0eXBlKSB7XG4gICAgaWYgKHR5cGUgPT09ICdQb2x5Z29uJyB8fCB0eXBlID09PSAnTXVsdGlQb2x5Z29uJykge1xuICAgICAgICByZXR1cm4gJ3BvbHlnb24nO1xuICAgIH1cbiAgICBlbHNlIGlmICh0eXBlID09PSAnTGluZVN0cmluZycgfHwgdHlwZSA9PT0gJ011bHRpTGluZVN0cmluZycpIHtcbiAgICAgICAgcmV0dXJuICdsaW5lJztcbiAgICB9XG4gICAgaWYgKHR5cGUgPT09ICdQb2ludCcgfHwgdHlwZSA9PT0gJ011bHRpUG9pbnQnKSB7XG4gICAgICAgIHJldHVybiAncG9pbnQnO1xuICAgIH1cbn07XG5cbkdlby5jZW50cm9pZCA9IGZ1bmN0aW9uIChwb2x5Z29uKSB7XG4gICAgLy8gQWRhcHRlZCBmcm9tIGh0dHBzOi8vZ2l0aHViLmNvbS9MZWFmbGV0L0xlYWZsZXQvYmxvYi9jMTBmNDA1YTExMjE0MmIxOTc4NTk2N2NlMGUxNDIxMzJhNjA5NWFkL3NyYy9sYXllci92ZWN0b3IvUG9seWdvbi5qcyNMNTdcbiAgICBsZXQgeCA9IDAsIHkgPSAwLCBhcmVhID0gMDtcbiAgICBsZXQgcmluZyA9IHBvbHlnb25bMF07IC8vIG9ubHkgdXNlIGZpcnN0IHJpbmcgZm9yIG5vd1xuICAgIGxldCBsZW4gPSByaW5nLmxlbmd0aDtcblxuICAgIGZvciAobGV0IGkgPSAwLCBqID0gbGVuIC0gMTsgaSA8IGxlbjsgaiA9IGksIGkrKykge1xuICAgICAgICBsZXQgcDAgPSByaW5nW2ldO1xuICAgICAgICBsZXQgcDEgPSByaW5nW2pdO1xuICAgICAgICBsZXQgZiA9IHAwWzFdICogcDFbMF0gLSBwMVsxXSAqIHAwWzBdO1xuXG4gICAgICAgIHggKz0gKHAwWzBdICsgcDFbMF0pICogZjtcbiAgICAgICAgeSArPSAocDBbMV0gKyBwMVsxXSkgKiBmO1xuICAgICAgICBhcmVhICs9IGYgKiAzO1xuICAgIH1cblxuICAgIHJldHVybiBbeCAvIGFyZWEsIHkgLyBhcmVhXTtcbn07XG5cbkdlby5tdWx0aUNlbnRyb2lkID0gZnVuY3Rpb24gKHBvbHlnb25zKSB7XG4gICAgbGV0IG4gPSBwb2x5Z29ucy5sZW5ndGg7XG4gICAgbGV0IGNlbnRyb2lkID0gWzAsIDBdO1xuXG4gICAgZm9yIChsZXQgcD0wOyBwIDwgcG9seWdvbnMubGVuZ3RoOyBwKyspIHtcbiAgICAgICAgbGV0IGMgPSBHZW8uY2VudHJvaWQocG9seWdvbnNbcF0pO1xuICAgICAgICBjZW50cm9pZFswXSArPSBjWzBdO1xuICAgICAgICBjZW50cm9pZFsxXSArPSBjWzFdO1xuICAgIH1cblxuICAgIGNlbnRyb2lkWzBdIC89IG47XG4gICAgY2VudHJvaWRbMV0gLz0gbjtcblxuICAgIHJldHVybiBjZW50cm9pZDtcbn07XG5cbkdlby5zaWduZWRQb2x5Z29uUmluZ0FyZWFTdW0gPSBmdW5jdGlvbiAocmluZykge1xuICAgIGxldCBhcmVhID0gMDtcbiAgICBsZXQgbiA9IHJpbmcubGVuZ3RoO1xuXG4gICAgZm9yIChsZXQgaSA9IDA7IGkgPCBuIC0gMTsgaSsrKSB7XG4gICAgICAgIGxldCBwMCA9IHJpbmdbaV07XG4gICAgICAgIGxldCBwMSA9IHJpbmdbaSsxXTtcblxuICAgICAgICBhcmVhICs9IHAwWzBdICogcDFbMV0gLSBwMVswXSAqIHAwWzFdO1xuICAgIH1cblxuICAgIGFyZWEgKz0gcmluZ1tuIC0gMV1bMF0gKiByaW5nWzBdWzFdIC0gcmluZ1swXVswXSAqIHJpbmdbbiAtIDFdWzFdO1xuICAgIHJldHVybiBhcmVhO1xufTtcblxuR2VvLnBvbHlnb25SaW5nQXJlYSA9IGZ1bmN0aW9uIChyaW5nKSB7XG4gICAgcmV0dXJuIE1hdGguYWJzKEdlby5zaWduZWRQb2x5Z29uUmluZ0FyZWFTdW0ocmluZykpIC8gMjtcbn07XG5cbi8vIFRPRE86IHN1YnRyYWN0IGlubmVyIHJpbmdzXG5HZW8ucG9seWdvbkFyZWEgPSBmdW5jdGlvbiAocG9seWdvbikge1xuICAgIHJldHVybiBHZW8ucG9seWdvblJpbmdBcmVhKHBvbHlnb25bMF0pO1xufTtcblxuR2VvLm11bHRpUG9seWdvbkFyZWEgPSBmdW5jdGlvbiAocG9seWdvbnMpIHtcbiAgICBsZXQgYXJlYSA9IDA7XG5cbiAgICBmb3IgKGxldCBwPTA7IHAgPCBwb2x5Z29ucy5sZW5ndGg7IHArKykge1xuICAgICAgICBhcmVhICs9IEdlby5wb2x5Z29uQXJlYShwb2x5Z29uc1twXSk7XG4gICAgfVxuXG4gICAgcmV0dXJuIGFyZWE7XG59O1xuXG5HZW8ucmluZ1dpbmRpbmcgPSBmdW5jdGlvbiAocmluZykge1xuICAgIGxldCBhcmVhID0gR2VvLnNpZ25lZFBvbHlnb25SaW5nQXJlYVN1bShyaW5nKTtcbiAgICBpZiAoYXJlYSA+IDApIHtcbiAgICAgICAgcmV0dXJuICdDVyc7XG4gICAgfVxuICAgIGVsc2UgaWYgKGFyZWEgPCAwKSB7XG4gICAgICAgIHJldHVybiAnQ0NXJztcbiAgICB9XG4gICAgLy8gcmV0dXJuIHVuZGVmaW5lZCBvbiB6ZXJvIGFyZWEgcG9seWdvblxufTtcbiIsIi8vIFdlYkdMIGNvbnN0YW50cyAtIG5lZWQgdG8gaW1wb3J0IHRoZXNlIHNlcGFyYXRlbHkgdG8gbWFrZSB0aGVtIGF2YWlsYWJsZSBpbiB0aGUgd2ViIHdvcmtlclxuXG52YXIgZ2w7XG5leHBvcnQgZGVmYXVsdCBnbCA9IHt9O1xuXG4vKiBEYXRhVHlwZSAqL1xuZ2wuQllURSAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgxNDAwO1xuZ2wuVU5TSUdORURfQllURSAgICAgICAgICAgICAgICAgID0gMHgxNDAxO1xuZ2wuU0hPUlQgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgxNDAyO1xuZ2wuVU5TSUdORURfU0hPUlQgICAgICAgICAgICAgICAgID0gMHgxNDAzO1xuZ2wuSU5UICAgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgxNDA0O1xuZ2wuVU5TSUdORURfSU5UICAgICAgICAgICAgICAgICAgID0gMHgxNDA1O1xuZ2wuRkxPQVQgICAgICAgICAgICAgICAgICAgICAgICAgID0gMHgxNDA2O1xuIiwiLy8gV2ViR0wgY29udGV4dCB3cmFwcGVyXG5cbnZhciBDb250ZXh0O1xuZXhwb3J0IGRlZmF1bHQgQ29udGV4dCA9IHt9O1xuXG4vLyBTZXR1cCBhIFdlYkdMIGNvbnRleHRcbi8vIElmIG5vIGNhbnZhcyBlbGVtZW50IGlzIHByb3ZpZGVkLCBvbmUgaXMgY3JlYXRlZCBhbmQgYWRkZWQgdG8gdGhlIGRvY3VtZW50IGJvZHlcbkNvbnRleHQuZ2V0Q29udGV4dCA9IGZ1bmN0aW9uIGdldENvbnRleHQgKGNhbnZhcywgb3B0aW9ucylcbntcbiAgICB2YXIgZnVsbHNjcmVlbiA9IGZhbHNlO1xuICAgIGlmIChjYW52YXMgPT0gbnVsbCkge1xuICAgICAgICBjYW52YXMgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdjYW52YXMnKTtcbiAgICAgICAgY2FudmFzLnN0eWxlLnBvc2l0aW9uID0gJ2Fic29sdXRlJztcbiAgICAgICAgY2FudmFzLnN0eWxlLnRvcCA9IDA7XG4gICAgICAgIGNhbnZhcy5zdHlsZS5sZWZ0ID0gMDtcbiAgICAgICAgY2FudmFzLnN0eWxlLnpJbmRleCA9IC0xO1xuICAgICAgICBkb2N1bWVudC5ib2R5LmFwcGVuZENoaWxkKGNhbnZhcyk7XG4gICAgICAgIGZ1bGxzY3JlZW4gPSB0cnVlO1xuICAgIH1cblxuICAgIHZhciBnbCA9IGNhbnZhcy5nZXRDb250ZXh0KCd3ZWJnbCcsIG9wdGlvbnMpIHx8IGNhbnZhcy5nZXRDb250ZXh0KCdleHBlcmltZW50YWwtd2ViZ2wnLCBvcHRpb25zKTtcbiAgICBpZiAoIWdsKSB7XG4gICAgICAgIHRocm93IG5ldyBFcnJvcihcIkNvdWxkbid0IGNyZWF0ZSBXZWJHTCBjb250ZXh0LlwiKTtcbiAgICB9XG5cbiAgICBpZiAoIWZ1bGxzY3JlZW4pIHtcbiAgICAgICAgQ29udGV4dC5yZXNpemUoZ2wsIHBhcnNlRmxvYXQoY2FudmFzLnN0eWxlLndpZHRoKSwgcGFyc2VGbG9hdChjYW52YXMuc3R5bGUuaGVpZ2h0KSwgb3B0aW9ucy5kZXZpY2VfcGl4ZWxfcmF0aW8pO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgQ29udGV4dC5yZXNpemUoZ2wsIHdpbmRvdy5pbm5lcldpZHRoLCB3aW5kb3cuaW5uZXJIZWlnaHQsIG9wdGlvbnMuZGV2aWNlX3BpeGVsX3JhdGlvKTtcbiAgICAgICAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoJ3Jlc2l6ZScsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIENvbnRleHQucmVzaXplKGdsLCB3aW5kb3cuaW5uZXJXaWR0aCwgd2luZG93LmlubmVySGVpZ2h0LCBvcHRpb25zLmRldmljZV9waXhlbF9yYXRpbyk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiBnbDtcbn07XG5cbkNvbnRleHQucmVzaXplID0gZnVuY3Rpb24gKGdsLCB3aWR0aCwgaGVpZ2h0LCBkZXZpY2VfcGl4ZWxfcmF0aW8pXG57XG4gICAgZGV2aWNlX3BpeGVsX3JhdGlvID0gZGV2aWNlX3BpeGVsX3JhdGlvIHx8IHdpbmRvdy5kZXZpY2VQaXhlbFJhdGlvIHx8IDE7XG4gICAgZ2wuY2FudmFzLnN0eWxlLndpZHRoID0gd2lkdGggKyAncHgnO1xuICAgIGdsLmNhbnZhcy5zdHlsZS5oZWlnaHQgPSBoZWlnaHQgKyAncHgnO1xuICAgIGdsLmNhbnZhcy53aWR0aCA9IE1hdGgucm91bmQod2lkdGggKiBkZXZpY2VfcGl4ZWxfcmF0aW8pO1xuICAgIGdsLmNhbnZhcy5oZWlnaHQgPSBNYXRoLnJvdW5kKGhlaWdodCAqIGRldmljZV9waXhlbF9yYXRpbyk7XG4gICAgZ2wuYmluZEZyYW1lYnVmZmVyKGdsLkZSQU1FQlVGRkVSLCBudWxsKTtcbiAgICBnbC52aWV3cG9ydCgwLCAwLCBnbC5jYW52YXMud2lkdGgsIGdsLmNhbnZhcy5oZWlnaHQpO1xufTtcbiIsIi8vIFdlYkdMIGV4dGVuc2lvbiB3cmFwcGVyXG4vLyBTdG9yZXMgZXh0ZW5zaW9ucyBieSBuYW1lIGFuZCBHTCBjb250ZXh0XG5cbi8vIGxpc3Qgb2YgZXh0ZW5zaW9uIGFycmF5cywgZm9yIGVhY2ggZW50cnksIDFzdCBlbGVtZW50IEdMIGNvbnRleHQsIDJuZCBtYXAgb2YgZXh0ZW5zaW9ucyBieSBuYW1lXG5sZXQgZXh0ZW5zaW9ucyA9IFtdO1xuXG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBnZXRFeHRlbnNpb24gKGdsLCBuYW1lKSB7XG4gICAgbGV0IGV4dHMgPSBleHRlbnNpb25zLmZpbHRlcihlID0+IGVbMF0gPT09IGdsKVswXTtcbiAgICBleHRzID0gZXh0cyAmJiBleHRzWzFdO1xuXG4gICAgaWYgKCFleHRzKSB7XG4gICAgICAgIGV4dGVuc2lvbnMucHVzaChbZ2wsIHt9XSk7XG4gICAgICAgIGV4dHMgPSBleHRlbnNpb25zW2V4dGVuc2lvbnMubGVuZ3RoLTFdWzFdO1xuICAgIH1cblxuICAgIGlmICghZXh0c1tuYW1lXSkge1xuICAgICAgICBleHRzW25hbWVdID0gZ2wuZ2V0RXh0ZW5zaW9uKG5hbWUpO1xuICAgIH1cbiAgICByZXR1cm4gZXh0c1tuYW1lXTtcbn1cbiIsInZhciBHTFNMID0ge307XG5leHBvcnQgZGVmYXVsdCBHTFNMO1xuXG4vKipcbiAgICBQYXJzZSB1bmlmb3JtcyBmcm9tIGEgSlMgb2JqZWN0LCBpbmZlcnMgdHlwZXMgYW5kIHJldHVybnMgYW4gYXJyYXkgb2Ygb2JqZWN0cyB3aXRoIHRoZVxuICAgIG5lY2Vzc2FyeSBpbmZvcm1hdGlvbiB0byBzZXQgdW5pZm9ybSB2YWx1ZXMgb24gYSBHTCBwcm9ncmFtLiBFYWNoIG9iamVjdCBpbiB0aGUgcmV0dXJuZWRcbiAgICBhcnJheSBoYXMgdGhlIGZvcm06XG4gICAgeyB0eXBlLCBtZXRob2QsIG5hbWUsIHZhbHVlIH1cblxuICAgIHR5cGU6IHRoZSBHTCB1bmlmb3JtIHR5cGUsIHN1Y2ggYXMgJ3ZlYzMnLCAnZmxvYXQnLCBldGMuXG4gICAgbWV0aG9kOiB0aGUgR0wgdW5pZm9ybSBzZXR0ZXIgbWV0aG9kIHRvIHVzZSwgc3VjaCBhcyAnMWYnLCAnM2Z2JywgZXRjLlxuICAgIG5hbWU6IHRoZSBmdWxseSBxdWFsaWZpZWQgbmFtZSBvZiB0aGUgR0wgdW5pZm9ybSBsb2NhdGlvbiwgZS5nLiAnYXJyYXlbMF0uZmllbGQnLCBldGMuXG4gICAgdmFsdWU6IHRoZSB2YWx1ZSB0byBiZSBwYXNzZWQgdG8gdGhlIEdMIHVuaWZvcm0gc2V0dGVyIGZvciB0aGF0IHR5cGUsIGUuZy4gWzEsIDIsIDNdIGZvciBhIHZlYzNcblxuICAgIFRleHR1cmVzIGhhdmUgc3BlY2lhbCBiZWhhdmlvcjogdW5pZm9ybXMgd2l0aCBzdHJpbmcgdmFsdWVzIGFyZSB0cmVhdGVkIGFzIHRleHR1cmVzLCBhbmRcbiAgICB0aGUgc3RyaW5nIGlzIHVzZWQgYXMgYSB1bmlxdWUgdGV4dHVyZSAna2V5JyB0byBiZSBpbnRlcnByZXRlZCBieSB0aGUgY2FsbGVyICh3aGljaCBpcyByZXNwb25zaWJsZVxuICAgIGZvciBhY3R1YWxseSBzZXR0aW5nIHRoZSB1bmlmb3JtcykuIEZvciBleGFtcGxlLCB0aGlzIGNvdWxkIGJlIHVzZWQgYXMgYSBrZXkgaW50byBhIGRpY3Rpb25hcnkgb2ZcbiAgICBrbm93biB0ZXh0dXJlIG5hbWVzLCBvciBpdCBjb3VsZCBzaW1wbHkgYmUgdXNlZCBhcyBhIFVSTCB0byBkeW5hbWljYWxseSBsb2FkIHRoZSB0ZXh0dXJlIGZyb20uXG4qL1xuR0xTTC5wYXJzZVVuaWZvcm1zID0gZnVuY3Rpb24gKHVuaWZvcm1zKSB7XG4gICAgdmFyIHBhcnNlZCA9IFtdO1xuXG4gICAgZm9yICh2YXIgbmFtZSBpbiB1bmlmb3Jtcykge1xuICAgICAgICB2YXIga2V5ID0gbmFtZTsgLy8gc2F2ZSB0aGUgb3JpZ2luYWwgbmFtZVxuICAgICAgICB2YXIgdW5pZm9ybSA9IHVuaWZvcm1zW25hbWVdO1xuICAgICAgICB2YXIgdTtcblxuICAgICAgICAvLyBTaW5nbGUgZmxvYXRcbiAgICAgICAgaWYgKHR5cGVvZiB1bmlmb3JtID09PSAnbnVtYmVyJykge1xuICAgICAgICAgICAgcGFyc2VkLnB1c2goe1xuICAgICAgICAgICAgICAgIHR5cGU6ICdmbG9hdCcsXG4gICAgICAgICAgICAgICAgbWV0aG9kOiAnMWYnLFxuICAgICAgICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgICAgICAgdmFsdWU6IHVuaWZvcm0sXG4gICAgICAgICAgICAgICAga2V5LFxuICAgICAgICAgICAgICAgIHVuaWZvcm1zXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICAvLyBBcnJheTogdmVjdG9yLCBhcnJheSBvZiBmbG9hdHMsIGFycmF5IG9mIHRleHR1cmVzXG4gICAgICAgIGVsc2UgaWYgKEFycmF5LmlzQXJyYXkodW5pZm9ybSkpIHtcbiAgICAgICAgICAgIC8vIE51bWVyaWMgdmFsdWVzXG4gICAgICAgICAgICBpZiAodHlwZW9mIHVuaWZvcm1bMF0gPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgICAgICAgLy8gZmxvYXQgdmVjdG9ycyAodmVjMiwgdmVjMywgdmVjNClcbiAgICAgICAgICAgICAgICBpZiAodW5pZm9ybS5sZW5ndGggPj0gMiAmJiB1bmlmb3JtLmxlbmd0aCA8PSA0KSB7XG4gICAgICAgICAgICAgICAgICAgIHBhcnNlZC5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICd2ZWMnICsgdW5pZm9ybS5sZW5ndGgsXG4gICAgICAgICAgICAgICAgICAgICAgICBtZXRob2Q6IHVuaWZvcm0ubGVuZ3RoICsgJ2Z2JyxcbiAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTogdW5pZm9ybSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGtleSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHVuaWZvcm1zXG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBmbG9hdCBhcnJheVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKHVuaWZvcm0ubGVuZ3RoID4gNCkge1xuICAgICAgICAgICAgICAgICAgICBwYXJzZWQucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAnZmxvYXRbXScsXG4gICAgICAgICAgICAgICAgICAgICAgICBtZXRob2Q6ICcxZnYnLFxuICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogbmFtZSArICdbMF0nLFxuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IHVuaWZvcm0sXG4gICAgICAgICAgICAgICAgICAgICAgICBrZXksXG4gICAgICAgICAgICAgICAgICAgICAgICB1bmlmb3Jtc1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gVE9ETzogYXNzdW1lIG1hdHJpeCBmb3IgKHR5cGVvZiA9PSBGbG9hdDMyQXJyYXkgJiYgbGVuZ3RoID09IDE2KT9cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIEFycmF5IG9mIHRleHR1cmVzXG4gICAgICAgICAgICBlbHNlIGlmICh0eXBlb2YgdW5pZm9ybVswXSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICBmb3IgKHU9MDsgdSA8IHVuaWZvcm0ubGVuZ3RoOyB1KyspIHtcbiAgICAgICAgICAgICAgICAgICAgcGFyc2VkLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ3NhbXBsZXIyRCcsXG4gICAgICAgICAgICAgICAgICAgICAgICBtZXRob2Q6ICcxaScsXG4gICAgICAgICAgICAgICAgICAgICAgICBuYW1lOiBuYW1lICsgJ1snICsgdSArICddJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOiB1bmlmb3JtW3VdLFxuICAgICAgICAgICAgICAgICAgICAgICAga2V5OiB1LFxuICAgICAgICAgICAgICAgICAgICAgICAgdW5pZm9ybXM6IHVuaWZvcm1cbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gQXJyYXkgb2YgYXJyYXlzIC0gYnV0IG9ubHkgYXJyYXlzIG9mIHZlY3RvcnMgYXJlIGFsbG93ZWQgaW4gdGhpcyBjYXNlXG4gICAgICAgICAgICBlbHNlIGlmIChBcnJheS5pc0FycmF5KHVuaWZvcm1bMF0pICYmIHR5cGVvZiB1bmlmb3JtWzBdWzBdID09PSAnbnVtYmVyJykge1xuICAgICAgICAgICAgICAgIC8vIGZsb2F0IHZlY3RvcnMgKHZlYzIsIHZlYzMsIHZlYzQpXG4gICAgICAgICAgICAgICAgaWYgKHVuaWZvcm1bMF0ubGVuZ3RoID49IDIgJiYgdW5pZm9ybVswXS5sZW5ndGggPD0gNCkge1xuICAgICAgICAgICAgICAgICAgICAvLyBTZXQgZWFjaCB2ZWN0b3IgaW4gdGhlIGFycmF5XG4gICAgICAgICAgICAgICAgICAgIGZvciAodT0wOyB1IDwgdW5pZm9ybS5sZW5ndGg7IHUrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2VkLnB1c2goe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICd2ZWMnICsgdW5pZm9ybVswXS5sZW5ndGgsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kOiB1bmlmb3JtW3VdLmxlbmd0aCArICdmdicsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZTogbmFtZSArICdbJyArIHUgKyAnXScsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6IHVuaWZvcm1bdV0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5OiB1LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuaWZvcm1zOiB1bmlmb3JtXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIFRPRE86IGVsc2Ugd2FybmluZ1xuICAgICAgICB9XG4gICAgICAgIC8vIEJvb2xlYW5cbiAgICAgICAgZWxzZSBpZiAodHlwZW9mIHVuaWZvcm0gPT09ICdib29sZWFuJykge1xuICAgICAgICAgICAgcGFyc2VkLnB1c2goe1xuICAgICAgICAgICAgICAgIHR5cGU6ICdib29sJyxcbiAgICAgICAgICAgICAgICBtZXRob2Q6ICcxaScsXG4gICAgICAgICAgICAgICAgbmFtZSxcbiAgICAgICAgICAgICAgICB2YWx1ZTogdW5pZm9ybSxcbiAgICAgICAgICAgICAgICBrZXksXG4gICAgICAgICAgICAgICAgdW5pZm9ybXNcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIC8vIFRleHR1cmVcbiAgICAgICAgZWxzZSBpZiAodHlwZW9mIHVuaWZvcm0gPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICBwYXJzZWQucHVzaCh7XG4gICAgICAgICAgICAgICAgdHlwZTogJ3NhbXBsZXIyRCcsXG4gICAgICAgICAgICAgICAgbWV0aG9kOiAnMWknLFxuICAgICAgICAgICAgICAgIG5hbWUsXG4gICAgICAgICAgICAgICAgdmFsdWU6IHVuaWZvcm0sXG4gICAgICAgICAgICAgICAga2V5LFxuICAgICAgICAgICAgICAgIHVuaWZvcm1zXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBwYXJzZWQ7XG59O1xuXG4vKipcbiAgICBHZW5lcmF0ZSBhIEdMU0wgdmFyaWFibGUgZGVmaW5pdGlvbiBmcm9tIGEgSlMgb2JqZWN0XG4qL1xuR0xTTC5kZWZpbmVWYXJpYWJsZSA9IGZ1bmN0aW9uIChuYW1lLCB2YWx1ZSkge1xuICAgIHZhciB0eXBlLCBhcnJheTtcblxuICAgIC8vIFNpbmdsZSBmbG9hdFxuICAgIGlmICh0eXBlb2YgdmFsdWUgPT09ICdudW1iZXInKSB7XG4gICAgICAgIHR5cGUgPSAnZmxvYXQnO1xuICAgIH1cbiAgICAvLyBNdWx0aXBsZSBmbG9hdHMgLSB2ZWN0b3Igb3IgYXJyYXlcbiAgICBlbHNlIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICAvLyBOdW1lcmljIHZhbHVlc1xuICAgICAgICBpZiAodHlwZW9mIHZhbHVlWzBdID09PSAnbnVtYmVyJykge1xuICAgICAgICAgICAgLy8gZmxvYXQgdmVjdG9ycyAodmVjMiwgdmVjMywgdmVjNClcbiAgICAgICAgICAgIGlmICh2YWx1ZS5sZW5ndGggPj0gMiAmJiB2YWx1ZS5sZW5ndGggPD0gNCkge1xuICAgICAgICAgICAgICAgIHR5cGUgPSAndmVjJyArIHZhbHVlLmxlbmd0aDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIGZsb2F0IGFycmF5XG4gICAgICAgICAgICBlbHNlIHsgLy9pZiAodmFsdWUubGVuZ3RoID4gNCkge1xuICAgICAgICAgICAgICAgIHR5cGUgPSAnZmxvYXQnO1xuICAgICAgICAgICAgICAgIGFycmF5ID0gdmFsdWUubGVuZ3RoO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gVE9ETzogYXNzdW1lIG1hdHJpeCBmb3IgKHR5cGVvZiA9PSBGbG9hdDMyQXJyYXkgJiYgbGVuZ3RoID09IDE2KT9cbiAgICAgICAgfVxuICAgICAgICAvLyBBcnJheSBvZiB0ZXh0dXJlc1xuICAgICAgICBlbHNlIGlmICh0eXBlb2YgdmFsdWVbMF0gPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICB0eXBlID0gJ3NhbXBsZXIyRCc7XG4gICAgICAgICAgICBhcnJheSA9IHZhbHVlLmxlbmd0aDtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBCb29sZWFuXG4gICAgZWxzZSBpZiAodHlwZW9mIHZhbHVlID09PSAnYm9vbGVhbicpIHtcbiAgICAgICAgdHlwZSA9ICdib29sJztcbiAgICB9XG4gICAgLy8gVGV4dHVyZVxuICAgIGVsc2UgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgdHlwZSA9ICdzYW1wbGVyMkQnO1xuICAgIH1cblxuICAgIC8vIENvbnN0cnVjdCB2YXJpYWJsZSBkZWZpbml0aW9uXG4gICAgdmFyIHZhcmlhYmxlID0gJyc7XG4gICAgdmFyaWFibGUgKz0gYCR7dHlwZX0gJHtuYW1lfWA7XG4gICAgaWYgKGFycmF5KSB7XG4gICAgICAgIHZhcmlhYmxlICs9IGBbJHthcnJheX1dYDtcbiAgICB9XG4gICAgdmFyaWFibGUgKz0gJztcXG4nO1xuXG4gICAgcmV0dXJuIHZhcmlhYmxlO1xufTtcblxuLyoqXG4gICAgR2VuZXJhdGUgYSBHTFNMIHVuaWZvcm0gZGVmaW5pdGlvbiBmcm9tIGEgSlMgb2JqZWN0XG4qL1xuR0xTTC5kZWZpbmVVbmlmb3JtID0gZnVuY3Rpb24gKG5hbWUsIHZhbHVlKSB7XG4gICAgcmV0dXJuICd1bmlmb3JtICcgKyBHTFNMLmRlZmluZVZhcmlhYmxlKG5hbWUsIHZhbHVlKTtcbn07XG5cbi8qKlxuICAgIENoZWNrIGZvciBhIHVuaWZvcm0gZGVmaW5pdGlvbiBvZiAnbmFtZScgaW4gdGhlIHByb3ZpZGVkIEdMU0wgc291cmNlXG4gICAgU2ltcGxlIHJlZ2V4IGNoZWNrIGZvciAndW5pZm9ybScga2V5d29yZCBhbmQgdmFyIG5hbWUsIGRvZXMgbm90IGF0dGVtcHQgdG8gcGFyc2UvZXh0cmFjdCBHTFNMXG4gICAgTk9URTogYXNzdW1lcyBjb21tZW50cyBoYXZlIGJlZW4gc3RyaXBwZWQgZnJvbSBzb3VyY2VcbiovXG5HTFNMLmlzVW5pZm9ybURlZmluZWQgPSBmdW5jdGlvbiAobmFtZSwgc291cmNlKSB7XG4gICAgLy8gTWF0Y2gsIGluIG9yZGVyOlxuICAgIC8vIC0gdGhlIGtleXdvcmQgJ3VuaWZvcm0nXG4gICAgLy8gLSBhdCBsZWFzdCBvbmUgY2hhcmFjdGVyIHRoYXQgaXMgYW55dGhpbmcgZXhjZXB0IGEgc2VtaWNvbG9uLCA7XG4gICAgLy8gLSBvcHRpb25hbGx5LCBhbnl0aGluZyBlbmNsb3NlZCBpbiBjdXJseSBicmFjZXMsIHsgLi4uIH0gKGFuIGlubGluZSBzdHJ1Y3R1cmUgZGVmaW5pdGlvbiBjYW4gZ28gaGVyZSlcbiAgICAvLyAtIG9wdGlvbmFsbHksIGFueSAjIG9mIGNoYXJhY3RlcnMgdGhhdCBpcyBub3QgYSBzZW1pY29sb24sIDtcbiAgICAvLyAtIHRoZSBuYW1lIG9mIHRoZSB1bmlmb3JtXG5cbiAgICB2YXIgcmUgPSBuZXcgUmVnRXhwKCd1bmlmb3JtW147XSsoPzp7W1xcXFxzXFxcXFNdKn0pP1teO10qXFxcXGInICsgbmFtZSArICdcXFxcYicsICdnJyk7XG4gICAgaWYgKHNvdXJjZS5tYXRjaChyZSkpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbn07XG5cbi8qKlxuICAgIENoZWNrIHRoYXQgYSBzeW1ib2wgaXMgcmVmZXJlbmNlZCBpbiB0aGUgR0xTTCBzb3VyY2VcbiAgICBOT1RFOiBhc3N1bWVzIGNvbW1lbnRzIGhhdmUgYmVlbiBzdHJpcHBlZCBmcm9tIHNvdXJjZVxuKi9cbkdMU0wuaXNTeW1ib2xSZWZlcmVuY2VkID0gZnVuY3Rpb24gKG5hbWUsIHNvdXJjZSkge1xuICAgIHZhciByZSA9IG5ldyBSZWdFeHAoJ1xcXFxiJyArIG5hbWUgKyAnXFxcXGInLCAnZycpO1xuICAgIGlmIChzb3VyY2Uuc2VhcmNoKHJlKSA+PSAwKSB7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cbiAgICByZXR1cm4gZmFsc2U7XG59O1xuXG4vKipcbiAgICBFeHBhbmQgYSBzaW5nbGUgdmFsdWUgb3IgMi1lbGVtZW50IGFycmF5IGludG8gYSAzLWVsZW1lbnQgYXJyYXksIHdpdGggdGhlIGxhc3QgKCB6IClcbiAgICBjb29yZGluYXRlIGRlZmF1bHRpbmcgdG8gMSAod2l0aCBvcHRpb24gdG8gc3BlY2lmeSkuIEFsc28gcnVucyBwYXJzZUZsb2F0IHRvIHRyeSB0byBtYWludGFpblxuICAgIGRhdGEgaW50ZWdyaXR5LiBSZXR1cm5zIG51bGwgaWYgaW5wdXQgY291bGRuJ3QgYmUgcGFyc2VkLlxuKi9cbkdMU0wuZXhwYW5kVmVjMyA9IGZ1bmN0aW9uICh2LCB6ID0gMSkge1xuICAgIGxldCB4O1xuICAgIGlmIChBcnJheS5pc0FycmF5KHYpKSB7XG4gICAgICAgIGlmICh2Lmxlbmd0aCA9PT0gMikge1xuICAgICAgICAgICAgeCA9IFsuLi52LCB6XS5tYXAocGFyc2VGbG9hdCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gdjtcbiAgICAgICAgfVxuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgeCA9IFt2LCB2LCB2XS5tYXAocGFyc2VGbG9hdCk7XG4gICAgfVxuXG4gICAgaWYgKHggJiYgeC5ldmVyeShuID0+IHR5cGVvZiBuID09PSAnbnVtYmVyJyAmJiAhaXNOYU4obikpKSB7XG4gICAgICAgIHJldHVybiB4O1xuICAgIH1cbn07XG5cbi8qKlxuICAgIEV4cGFuZCBhIHNpbmdsZSB2YWx1ZSBvciAzLWVsZW1lbnQgYXJyYXkgaW50byBhIDQtZWxlbWVudCBhcnJheSwgd2l0aCB0aGUgbGFzdCAoZS5nLiB3IG9yIGEpXG4gICAgY29vcmRpbmF0ZSBkZWZhdWx0aW5nIHRvIDEgKHdpdGggb3B0aW9uIHRvIHNwZWNpZnkpLiBBbHNvIHJ1bnMgcGFyc2VGbG9hdCB0byB0cnkgdG8gbWFpbnRhaW5cbiAgICBkYXRhIGludGVncml0eS4gUmV0dXJucyBudWxsIGlmIGlucHV0IGNvdWxkbid0IGJlIHBhcnNlZC5cbiovXG5HTFNMLmV4cGFuZFZlYzQgPSBmdW5jdGlvbiAodiwgdyA9IDEpIHtcbiAgICBsZXQgeDtcbiAgICBpZiAoQXJyYXkuaXNBcnJheSh2KSkge1xuICAgICAgICBpZiAodi5sZW5ndGggPT09IDMpIHtcbiAgICAgICAgICAgIHggPSBbLi4udiwgd10ubWFwKHBhcnNlRmxvYXQpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIHY7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHggPSBbdiwgdiwgdiwgd10ubWFwKHBhcnNlRmxvYXQpO1xuICAgIH1cblxuICAgIGlmICh4ICYmIHguZXZlcnkobiA9PiB0eXBlb2YgbiA9PT0gJ251bWJlcicgJiYgIWlzTmFOKG4pKSkge1xuICAgICAgICByZXR1cm4geDtcbiAgICB9XG59O1xuXG5cbiIsIlxuZXhwb3J0IGNsYXNzIFJlbmRlclN0YXRlIHtcblx0Y29uc3RydWN0b3IgKHZhbHVlLCBzZXR1cCkge1xuICAgICAgICBzZXR1cCh2YWx1ZSk7XG4gICAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTtcbiAgICAgICAgdGhpcy5zZXR1cCA9IHNldHVwO1xuICAgIH1cblxuICAgIHNldCAodmFsdWUpIHtcbiAgICBcdC8vIGlmIHRoZSBzdGF0ZXMgYXJlIGRpZmZlcmVudCwgY2FsbCB0aGUgR0wgY29udGV4dCBmb3IgYSBzdGF0ZSBjaGFuZ2VcbiAgICBcdGlmIChKU09OLnN0cmluZ2lmeSh0aGlzLnZhbHVlKSAhPT0gSlNPTi5zdHJpbmdpZnkodmFsdWUpKSB7XG4gICAgXHRcdHRoaXMuc2V0dXAodmFsdWUpO1xuICAgIFx0XHR0aGlzLnZhbHVlID0gdmFsdWU7XG4gICAgXHR9XG4gICAgfVxufVxuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBSZW5kZXJTdGF0ZU1hbmFnZXIge1xuXG4gICAgY29uc3RydWN0b3IgKGdsKSB7XG4gICAgICAgIHRoaXMuZGVmYXVsdHMgPSB7fTtcblxuICAgICAgICAvLyBDdWxsaW5nXG4gICAgICAgIHRoaXMuZGVmYXVsdHMuY3VsbGluZyA9IHRydWU7XG4gICAgICAgIHRoaXMuZGVmYXVsdHMuY3VsbGluZ19mYWNlID0gZ2wuQkFDSztcblxuICAgICAgICAvLyBCbGVuZGluZ1xuICAgICAgICB0aGlzLmRlZmF1bHRzLmJsZW5kaW5nID0gZmFsc2U7XG4gICAgICAgIHRoaXMuZGVmYXVsdHMuYmxlbmRpbmdfc3JjID0gZ2wuT05FX01JTlVTX1NSQ19BTFBIQTtcbiAgICAgICAgdGhpcy5kZWZhdWx0cy5ibGVuZGluZ19kc3QgPSBnbC5PTkVfTUlOVVNfU1JDX0FMUEhBO1xuICAgICAgICB0aGlzLmRlZmF1bHRzLmJsZW5kaW5nX3NyY19hbHBoYSA9IGdsLk9ORTtcbiAgICAgICAgdGhpcy5kZWZhdWx0cy5ibGVuZGluZ19kc3RfYWxwaGEgPSBnbC5PTkVfTUlOVVNfU1JDX0FMUEhBO1xuXG4gICAgICAgIC8vIERlcHRoIHRlc3Qvd3JpdGVcbiAgICAgICAgdGhpcy5kZWZhdWx0cy5kZXB0aF93cml0ZSA9IHRydWU7XG4gICAgICAgIHRoaXMuZGVmYXVsdHMuZGVwdGhfdGVzdCA9IHRydWU7XG4gICAgICAgIGdsLmRlcHRoRnVuYyhnbC5MRVNTKTsgLy8gZGVwdGggZnVuY3Rpb24gb25seSBuZWVkcyB0byBiZSBzZXQgb25jZVxuXG4gICAgXHQvLyBDdWxsaW5nXG4gICAgICAgIHRoaXMuY3VsbGluZyA9IG5ldyBSZW5kZXJTdGF0ZShcbiAgICAgICAgICAgIHsgY3VsbDogdGhpcy5kZWZhdWx0cy5jdWxsaW5nLCBmYWNlOiB0aGlzLmRlZmF1bHRzLmN1bGxpbmdfZmFjZSB9LFxuICAgIFx0XHQodmFsdWUpID0+IHtcbiAgICBcdFx0XHRpZiAodmFsdWUuY3VsbCkge1xuICAgIFx0XHRcdFx0Z2wuZW5hYmxlKGdsLkNVTExfRkFDRSk7XG4gICAgICAgICAgICBcdFx0Z2wuY3VsbEZhY2UodmFsdWUuZmFjZSk7XG4gICAgXHRcdFx0fSBlbHNlIHtcbiAgICBcdFx0XHRcdGdsLmRpc2FibGUoZ2wuQ1VMTF9GQUNFKTtcbiAgICBcdFx0XHR9XG4gICAgXHRcdH1cbiAgICBcdCk7XG5cbiAgICBcdC8vIEJsZW5kaW5nIG1vZGVcbiAgICAgICAgdGhpcy5ibGVuZGluZyA9IG5ldyBSZW5kZXJTdGF0ZSh7XG4gICAgICAgICAgICAgICAgYmxlbmQ6IHRoaXMuZGVmYXVsdHMuYmxlbmRpbmcsXG4gICAgICAgICAgICAgICAgc3JjOiB0aGlzLmRlZmF1bHRzLmJsZW5kaW5nX3NyYyxcbiAgICAgICAgICAgICAgICBkc3Q6IHRoaXMuZGVmYXVsdHMuYmxlbmRpbmdfZHN0LFxuICAgICAgICAgICAgICAgIHNyY19hbHBoYTogdGhpcy5kZWZhdWx0cy5ibGVuZGluZ19zcmNfYWxwaGEsXG4gICAgICAgICAgICAgICAgZHN0X2FscGhhOiB0aGlzLmRlZmF1bHRzLmJsZW5kaW5nX2RzdF9hbHBoYVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICh2YWx1ZSkgPT4ge1xuICAgIFx0XHRcdGlmICh2YWx1ZS5ibGVuZCkge1xuICAgICAgICAgICAgXHRcdGdsLmVuYWJsZShnbC5CTEVORCk7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlLnNyY19hbHBoYSAmJiB2YWx1ZS5kc3RfYWxwaGEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGdsLmJsZW5kRnVuY1NlcGFyYXRlKHZhbHVlLnNyYywgdmFsdWUuZHN0LCB2YWx1ZS5zcmNfYWxwaGEsIHZhbHVlLmRzdF9hbHBoYSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBnbC5ibGVuZEZ1bmModmFsdWUuc3JjLCB2YWx1ZS5kc3QpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgXHRcdFx0fSBlbHNlIHtcbiAgICBcdFx0XHRcdGdsLmRpc2FibGUoZ2wuQkxFTkQpO1xuICAgIFx0XHRcdH1cbiAgICBcdFx0fVxuICAgIFx0KTtcblxuICAgIFx0Ly8gRGVwdGggd3JpdGVcbiAgICAgICAgdGhpcy5kZXB0aF93cml0ZSA9IG5ldyBSZW5kZXJTdGF0ZShcbiAgICAgICAgICAgIHsgZGVwdGhfd3JpdGU6IHRoaXMuZGVmYXVsdHMuZGVwdGhfd3JpdGUgfSxcbiAgICBcdFx0KHZhbHVlKSA9PiB7XG4gICAgICAgIFx0XHRnbC5kZXB0aE1hc2sodmFsdWUuZGVwdGhfd3JpdGUpO1xuICAgIFx0XHR9XG4gICAgXHQpO1xuXG4gICAgXHQvLyBEZXB0aCB0ZXN0XG4gICAgICAgIHRoaXMuZGVwdGhfdGVzdCA9IG5ldyBSZW5kZXJTdGF0ZShcbiAgICAgICAgICAgIHsgZGVwdGhfdGVzdDogdGhpcy5kZWZhdWx0cy5kZXB0aF90ZXN0IH0sXG4gICAgICAgICAgICAodmFsdWUpID0+IHtcbiAgICBcdFx0XHRpZiAodmFsdWUuZGVwdGhfdGVzdCkge1xuICAgICAgICAgICAgXHRcdGdsLmVuYWJsZShnbC5ERVBUSF9URVNUKTtcbiAgICBcdFx0XHR9IGVsc2Uge1xuICAgICAgICAgICAgXHRcdGdsLmRpc2FibGUoZ2wuREVQVEhfVEVTVCk7XG4gICAgXHRcdFx0fVxuICAgIFx0XHR9XG4gICAgXHQpO1xuXG4gICAgfVxuXG59XG4iLCIvLyBHTCBwcm9ncmFtIHdyYXBwZXIgdG8gY2FjaGUgdW5pZm9ybSBsb2NhdGlvbnMvdmFsdWVzLCBkbyBjb21waWxlLXRpbWUgcHJlLXByb2Nlc3Npbmdcbi8vIChpbmplY3RpbmcgI2RlZmluZXMgYW5kICNwcmFnbWEgYmxvY2tzIGludG8gc2hhZGVycyksIGV0Yy5cblxuaW1wb3J0IGxvZyBmcm9tICcuLi91dGlscy9sb2cnO1xuaW1wb3J0IEdMU0wgZnJvbSAnLi9nbHNsJztcbmltcG9ydCBUZXh0dXJlIGZyb20gJy4vdGV4dHVyZSc7XG5pbXBvcnQgZ2V0RXh0ZW5zaW9uIGZyb20gJy4vZXh0ZW5zaW9ucyc7XG5cbmltcG9ydCBzdHJpcCBmcm9tICdzdHJpcC1jb21tZW50cyc7XG5pbXBvcnQgeyBkZWZhdWx0IGFzIHBhcnNlU2hhZGVyRXJyb3JzIH0gZnJvbSAnZ2wtc2hhZGVyLWVycm9ycyc7XG5cbi8vIFJlZ2V4IHBhdHRlcm5zXG5jb25zdCByZV9wcmFnbWEgPSAvXlxccyojcHJhZ21hLiokL2dtOyAgIC8vIGZvciByZW1vdmluZyB1bnVzZWQgcHJhZ21hcyBhZnRlciBzaGFkZXIgYmxvY2sgaW5qZWN0aW9uXG5jb25zdCByZV9jb250aW51ZV9saW5lID0gL1xcXFxcXHMqXFxuL21nOyAgIC8vIGZvciByZW1vdmluZyBiYWNrc2xhc2ggbGluZSBjb250aW51YXRpb25zXG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFNoYWRlclByb2dyYW0ge1xuXG4gICAgY29uc3RydWN0b3IoZ2wsIHZlcnRleF9zb3VyY2UsIGZyYWdtZW50X3NvdXJjZSwgb3B0aW9ucykge1xuICAgICAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcblxuICAgICAgICB0aGlzLmdsID0gZ2w7XG4gICAgICAgIHRoaXMucHJvZ3JhbSA9IG51bGw7XG4gICAgICAgIHRoaXMuY29tcGlsZWQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5jb21waWxpbmcgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5lcnJvciA9IG51bGw7XG5cbiAgICAgICAgLy8ga2V5L3ZhbHVlcyBpbnNlcnRlZCBhcyAjZGVmaW5lcyBpbnRvIHNoYWRlcnMgYXQgY29tcGlsZS10aW1lXG4gICAgICAgIHRoaXMuZGVmaW5lcyA9IE9iamVjdC5hc3NpZ24oe30sIG9wdGlvbnMuZGVmaW5lc3x8e30pO1xuXG4gICAgICAgIC8vIGtleS92YWx1ZXMgZm9yIGJsb2NrcyB0aGF0IGNhbiBiZSBpbmplY3RlZCBpbnRvIHNoYWRlcnMgYXQgY29tcGlsZS10aW1lXG4gICAgICAgIHRoaXMuYmxvY2tzID0gT2JqZWN0LmFzc2lnbih7fSwgb3B0aW9ucy5ibG9ja3N8fHt9KTtcbiAgICAgICAgdGhpcy5ibG9ja19zY29wZXMgPSBPYmplY3QuYXNzaWduKHt9LCBvcHRpb25zLmJsb2NrX3Njb3Blc3x8e30pO1xuXG4gICAgICAgIC8vIGxpc3Qgb2YgZXh0ZW5zaW9ucyB0byBhY3RpdmF0ZVxuICAgICAgICB0aGlzLmV4dGVuc2lvbnMgPSBvcHRpb25zLmV4dGVuc2lvbnMgfHwgW107XG5cbiAgICAgICAgLy8gSlMtb2JqZWN0IHVuaWZvcm1zIHRoYXQgYXJlIGV4cGVjdGVkIGJ5IHRoaXMgcHJvZ3JhbVxuICAgICAgICAvLyBJZiB0aGV5IGFyZSBub3QgZm91bmQgaW4gdGhlIGV4aXN0aW5nIHNoYWRlciBzb3VyY2UsIHRoZWlyIHR5cGVzIHdpbGwgYmUgaW5mZXJyZWQgYW5kIGRlZmluaXRpb25zXG4gICAgICAgIC8vIGZvciBlYWNoIHdpbGwgYmUgaW5qZWN0ZWQuXG4gICAgICAgIHRoaXMuZGVwZW5kZW50X3VuaWZvcm1zID0gb3B0aW9ucy51bmlmb3JtcztcblxuICAgICAgICB0aGlzLnVuaWZvcm1zID0ge307IC8vIHByb2dyYW0gbG9jYXRpb25zIG9mIHVuaWZvcm1zLCBsYXppbHkgYWRkZWQgYXMgZWFjaCB1bmlmb3JtIGlzIHNldFxuICAgICAgICB0aGlzLmF0dHJpYnMgPSB7fTsgLy8gcHJvZ3JhbSBsb2NhdGlvbnMgb2YgdmVydGV4IGF0dHJpYnV0ZXMsIGxhemlseSBhZGRlZCBhcyBlYWNoIGF0dHJpYnV0ZSBpcyBhY2Nlc3NlZFxuXG4gICAgICAgIHRoaXMudmVydGV4X3NvdXJjZSA9IHZlcnRleF9zb3VyY2U7XG4gICAgICAgIHRoaXMuZnJhZ21lbnRfc291cmNlID0gZnJhZ21lbnRfc291cmNlO1xuXG4gICAgICAgIHRoaXMuaWQgPSBTaGFkZXJQcm9ncmFtLmlkKys7XG4gICAgICAgIHRoaXMubmFtZSA9IG9wdGlvbnMubmFtZTsgLy8gY2FuIHByb3ZpZGUgYSBwcm9ncmFtIG5hbWUgKHVzZWZ1bCBmb3IgZGVidWdnaW5nKVxuICAgIH1cblxuICAgIGRlc3Ryb3koKSB7XG4gICAgICAgIHRoaXMuZ2wudXNlUHJvZ3JhbShudWxsKTtcbiAgICAgICAgdGhpcy5nbC5kZWxldGVQcm9ncmFtKHRoaXMucHJvZ3JhbSk7XG4gICAgICAgIHRoaXMucHJvZ3JhbSA9IG51bGw7XG4gICAgICAgIHRoaXMudW5pZm9ybXMgPSB7fTtcbiAgICAgICAgdGhpcy5hdHRyaWJzID0ge307XG4gICAgICAgIHRoaXMuY29tcGlsZWQgPSBmYWxzZTtcbiAgICB9XG5cbiAgICAvLyBVc2UgcHJvZ3JhbSB3cmFwcGVyIHdpdGggc2ltcGxlIHN0YXRlIGNhY2hlXG4gICAgdXNlKCkge1xuICAgICAgICBpZiAoIXRoaXMuY29tcGlsZWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChTaGFkZXJQcm9ncmFtLmN1cnJlbnQgIT09IHRoaXMpIHtcbiAgICAgICAgICAgIHRoaXMuZ2wudXNlUHJvZ3JhbSh0aGlzLnByb2dyYW0pO1xuICAgICAgICB9XG4gICAgICAgIFNoYWRlclByb2dyYW0uY3VycmVudCA9IHRoaXM7XG4gICAgfVxuXG4gICAgY29tcGlsZSgpIHtcbiAgICAgICAgaWYgKHRoaXMuY29tcGlsaW5nKSB7XG4gICAgICAgICAgICB0aHJvdyhuZXcgRXJyb3IoYFNoYWRlclByb2dyYW0uY29tcGlsZSgpOiBza2lwcGluZyBmb3IgJHt0aGlzLmlkfSAoJHt0aGlzLm5hbWV9KSBiZWNhdXNlIGFscmVhZHkgY29tcGlsaW5nYCkpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuY29tcGlsaW5nID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5jb21waWxlZCA9IGZhbHNlO1xuICAgICAgICB0aGlzLmVycm9yID0gbnVsbDtcblxuICAgICAgICAvLyBDb3B5IHNvdXJjZXMgZnJvbSBwcmUtbW9kaWZpZWQgdGVtcGxhdGVcbiAgICAgICAgdGhpcy5jb21wdXRlZF92ZXJ0ZXhfc291cmNlID0gdGhpcy52ZXJ0ZXhfc291cmNlO1xuICAgICAgICB0aGlzLmNvbXB1dGVkX2ZyYWdtZW50X3NvdXJjZSA9IHRoaXMuZnJhZ21lbnRfc291cmNlO1xuXG4gICAgICAgIC8vIENoZWNrIGZvciBleHRlbnNpb24gYXZhaWxhYmlsaXR5XG4gICAgICAgIGxldCBleHRlbnNpb25zID0gdGhpcy5jaGVja0V4dGVuc2lvbnMoKTtcblxuICAgICAgICAvLyBNYWtlIGxpc3Qgb2YgZGVmaW5lcyB0byBiZSBpbmplY3RlZCBsYXRlclxuICAgICAgICB2YXIgZGVmaW5lcyA9IHRoaXMuYnVpbGREZWZpbmVMaXN0KCk7XG5cbiAgICAgICAgLy8gSW5qZWN0IHVzZXItZGVmaW5lZCBibG9ja3MgKGFyYml0cmFyeSBjb2RlIHBvaW50cyBtYXRjaGluZyBuYW1lZCAjcHJhZ21hcylcbiAgICAgICAgLy8gUmVwbGFjZSBhY2NvcmRpbmcgdG8gdGhpcyBwYXR0ZXJuOlxuICAgICAgICAvLyAjcHJhZ21hIHRhbmdyYW06IFtrZXldXG4gICAgICAgIC8vIGUuZy4gI3ByYWdtYSB0YW5ncmFtOiBnbG9iYWxcblxuICAgICAgICAvLyBHYXRoZXIgYWxsIGJsb2NrIGNvZGUgc25pcHBldHNcbiAgICAgICAgdmFyIGJsb2NrcyA9IHRoaXMuYnVpbGRTaGFkZXJCbG9ja0xpc3QoKTtcbiAgICAgICAgdmFyIHJlZ2V4cDtcblxuICAgICAgICBmb3IgKHZhciBrZXkgaW4gYmxvY2tzKSB7XG4gICAgICAgICAgICB2YXIgYmxvY2sgPSBibG9ja3Nba2V5XTtcbiAgICAgICAgICAgIGlmICghYmxvY2sgfHwgKEFycmF5LmlzQXJyYXkoYmxvY2spICYmIGJsb2NrLmxlbmd0aCA9PT0gMCkpIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gRmlyc3QgZmluZCBjb2RlIHJlcGxhY2UgcG9pbnRzIGluIHNoYWRlcnNcbiAgICAgICAgICAgIHJlZ2V4cCA9IG5ldyBSZWdFeHAoJ15cXFxccyojcHJhZ21hXFxcXHMrdGFuZ3JhbTpcXFxccysnICsga2V5ICsgJ1xcXFxzKiQnLCAnbScpO1xuICAgICAgICAgICAgdmFyIGluamVjdF92ZXJ0ZXggPSB0aGlzLmNvbXB1dGVkX3ZlcnRleF9zb3VyY2UubWF0Y2gocmVnZXhwKTtcbiAgICAgICAgICAgIHZhciBpbmplY3RfZnJhZ21lbnQgPSB0aGlzLmNvbXB1dGVkX2ZyYWdtZW50X3NvdXJjZS5tYXRjaChyZWdleHApO1xuXG4gICAgICAgICAgICAvLyBBdm9pZCBuZXR3b3JrIHJlcXVlc3QgaWYgbm90aGluZyB0byByZXBsYWNlXG4gICAgICAgICAgICBpZiAoaW5qZWN0X3ZlcnRleCA9PSBudWxsICYmIGluamVjdF9mcmFnbWVudCA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIENvbWJpbmUgYWxsIGJsb2NrcyBpbnRvIG9uZSBzdHJpbmdcbiAgICAgICAgICAgIHZhciBzb3VyY2UgPSAnJztcbiAgICAgICAgICAgIGJsb2NrLmZvckVhY2godmFsID0+IHtcbiAgICAgICAgICAgICAgICAvLyBNYXJrIHN0YXJ0IGFuZCBlbmQgb2YgZWFjaCBibG9jayB3aXRoIG1ldGFkYXRhICh3aGljaCBjYW4gYmUgZXh0cmFjdGVkIGZyb21cbiAgICAgICAgICAgICAgICAvLyBmaW5hbCBzb3VyY2UgZm9yIGVycm9yIGhhbmRsaW5nLCBkZWJ1Z2dpbmcsIGV0Yy4pXG4gICAgICAgICAgICAgICAgbGV0IG1hcmsgPSBgJHt2YWwuc2NvcGV9LCAke3ZhbC5rZXl9LCAke3ZhbC5udW19YDtcbiAgICAgICAgICAgICAgICBzb3VyY2UgKz0gYFxcbi8vIHRhbmdyYW0tYmxvY2stc3RhcnQ6ICR7bWFya31cXG5gO1xuICAgICAgICAgICAgICAgIHNvdXJjZSArPSB2YWwuc291cmNlO1xuICAgICAgICAgICAgICAgIHNvdXJjZSArPSBgXFxuLy8gdGFuZ3JhbS1ibG9jay1lbmQ6ICR7bWFya31cXG5gO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIC8vIEluamVjdFxuICAgICAgICAgICAgaWYgKGluamVjdF92ZXJ0ZXggIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHRoaXMuY29tcHV0ZWRfdmVydGV4X3NvdXJjZSA9IHRoaXMuY29tcHV0ZWRfdmVydGV4X3NvdXJjZS5yZXBsYWNlKHJlZ2V4cCwgc291cmNlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGlmIChpbmplY3RfZnJhZ21lbnQgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHRoaXMuY29tcHV0ZWRfZnJhZ21lbnRfc291cmNlID0gdGhpcy5jb21wdXRlZF9mcmFnbWVudF9zb3VyY2UucmVwbGFjZShyZWdleHAsIHNvdXJjZSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIEFkZCBhICNkZWZpbmUgZm9yIHRoaXMgaW5qZWN0aW9uIHBvaW50XG4gICAgICAgICAgICBkZWZpbmVzWydUQU5HUkFNX0JMT0NLXycgKyBrZXkucmVwbGFjZSgvW1xccy1dKy9nLCAnXycpLnRvVXBwZXJDYXNlKCldID0gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENsZWFuLXVwIGFueSAjcHJhZ21hcyB0aGF0IHdlcmVuJ3QgcmVwbGFjZWQgKHRvIHByZXZlbnQgY29tcGlsZXIgd2FybmluZ3MpXG4gICAgICAgIHRoaXMuY29tcHV0ZWRfdmVydGV4X3NvdXJjZSA9IHRoaXMuY29tcHV0ZWRfdmVydGV4X3NvdXJjZS5yZXBsYWNlKHJlX3ByYWdtYSwgJycpO1xuICAgICAgICB0aGlzLmNvbXB1dGVkX2ZyYWdtZW50X3NvdXJjZSA9IHRoaXMuY29tcHV0ZWRfZnJhZ21lbnRfc291cmNlLnJlcGxhY2UocmVfcHJhZ21hLCAnJyk7XG5cbiAgICAgICAgLy8gRGV0ZWN0IHVuaWZvcm0gZGVmaW5pdGlvbnMsIGluamVjdCBhbnkgbWlzc2luZyBvbmVzXG4gICAgICAgIHRoaXMuZW5zdXJlVW5pZm9ybXModGhpcy5kZXBlbmRlbnRfdW5pZm9ybXMpO1xuXG4gICAgICAgIC8vIEJ1aWxkICYgaW5qZWN0IGV4dGVuc2lvbnMgJiBkZWZpbmVzXG4gICAgICAgIC8vIFRoaXMgaXMgZG9uZSAqYWZ0ZXIqIGNvZGUgaW5qZWN0aW9uIHNvIHRoYXQgd2UgY2FuIGFkZCBkZWZpbmVzIGZvciB3aGljaCBjb2RlIHBvaW50cyB3ZXJlIGluamVjdGVkXG4gICAgICAgIGxldCBwcmVjaXNpb24gPSAnJztcbiAgICAgICAgbGV0IGhpZ2ggPSB0aGlzLmdsLmdldFNoYWRlclByZWNpc2lvbkZvcm1hdCh0aGlzLmdsLkZSQUdNRU5UX1NIQURFUiwgdGhpcy5nbC5ISUdIX0ZMT0FUKTtcbiAgICAgICAgaWYgKGhpZ2ggJiYgaGlnaC5wcmVjaXNpb24gPiAwKSB7XG4gICAgICAgICAgICBwcmVjaXNpb24gPSAncHJlY2lzaW9uIGhpZ2hwIGZsb2F0O1xcbic7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBwcmVjaXNpb24gPSAncHJlY2lzaW9uIG1lZGl1bXAgZmxvYXQ7XFxuJztcbiAgICAgICAgfVxuXG4gICAgICAgIGRlZmluZXNbJ1RBTkdSQU1fVkVSVEVYX1NIQURFUiddID0gdHJ1ZTtcbiAgICAgICAgZGVmaW5lc1snVEFOR1JBTV9GUkFHTUVOVF9TSEFERVInXSA9IGZhbHNlO1xuICAgICAgICB0aGlzLmNvbXB1dGVkX3ZlcnRleF9zb3VyY2UgPVxuICAgICAgICAgICAgcHJlY2lzaW9uICtcbiAgICAgICAgICAgIFNoYWRlclByb2dyYW0uYnVpbGREZWZpbmVTdHJpbmcoZGVmaW5lcykgK1xuICAgICAgICAgICAgdGhpcy5jb21wdXRlZF92ZXJ0ZXhfc291cmNlO1xuXG4gICAgICAgIC8vIFByZWNpc2lvbiBxdWFsaWZpZXIgb25seSB2YWxpZCBpbiBmcmFnbWVudCBzaGFkZXJcbiAgICAgICAgLy8gTkI6ICcjZXh0ZW5zaW9uJyBzdGF0ZW1lbnRzIGFkZGVkIHRvIGZyYWdtZW50IHNoYWRlciBvbmx5LCBhcyBJRTExIHRocm93cyBlcnJvciB3aGVuIHRoZXkgYXBwZWFyIGluXG4gICAgICAgIC8vIHZlcnRleCBzaGFkZXIgKGV2ZW4gd2hlbiBndWFyZGVkIGJ5ICNpZmRlZiksIGFuZCBubyBXZWJHTCBleHRlbnNpb25zIHJlcXVpcmUgJyNleHRlbnNpb24nIGluIHZlcnRleCBzaGFkZXJzXG4gICAgICAgIGRlZmluZXNbJ1RBTkdSQU1fVkVSVEVYX1NIQURFUiddID0gZmFsc2U7XG4gICAgICAgIGRlZmluZXNbJ1RBTkdSQU1fRlJBR01FTlRfU0hBREVSJ10gPSB0cnVlO1xuICAgICAgICB0aGlzLmNvbXB1dGVkX2ZyYWdtZW50X3NvdXJjZSA9XG4gICAgICAgICAgICBTaGFkZXJQcm9ncmFtLmJ1aWxkRXh0ZW5zaW9uU3RyaW5nKGV4dGVuc2lvbnMpICtcbiAgICAgICAgICAgIHByZWNpc2lvbiArXG4gICAgICAgICAgICBTaGFkZXJQcm9ncmFtLmJ1aWxkRGVmaW5lU3RyaW5nKGRlZmluZXMpICtcbiAgICAgICAgICAgIHRoaXMuY29tcHV0ZWRfZnJhZ21lbnRfc291cmNlO1xuXG4gICAgICAgIC8vIFJlcGxhY2UgbXVsdGktbGluZSBiYWNrc2xhc2hlc1xuICAgICAgICB0aGlzLmNvbXB1dGVkX3ZlcnRleF9zb3VyY2UgPSB0aGlzLmNvbXB1dGVkX3ZlcnRleF9zb3VyY2UucmVwbGFjZShyZV9jb250aW51ZV9saW5lLCAnJyk7XG4gICAgICAgIHRoaXMuY29tcHV0ZWRfZnJhZ21lbnRfc291cmNlID0gdGhpcy5jb21wdXRlZF9mcmFnbWVudF9zb3VyY2UucmVwbGFjZShyZV9jb250aW51ZV9saW5lLCAnJyk7XG5cbiAgICAgICAgLy8gQ29tcGlsZSAmIHNldCB1bmlmb3JtcyB0byBjYWNoZWQgdmFsdWVzXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICB0aGlzLnByb2dyYW0gPSBTaGFkZXJQcm9ncmFtLnVwZGF0ZVByb2dyYW0odGhpcy5nbCwgdGhpcy5wcm9ncmFtLCB0aGlzLmNvbXB1dGVkX3ZlcnRleF9zb3VyY2UsIHRoaXMuY29tcHV0ZWRfZnJhZ21lbnRfc291cmNlKTtcbiAgICAgICAgICAgIHRoaXMuY29tcGlsZWQgPSB0cnVlO1xuICAgICAgICAgICAgdGhpcy5jb21waWxpbmcgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaChlcnJvcikge1xuICAgICAgICAgICAgdGhpcy5wcm9ncmFtID0gbnVsbDtcbiAgICAgICAgICAgIHRoaXMuY29tcGlsZWQgPSBmYWxzZTtcbiAgICAgICAgICAgIHRoaXMuY29tcGlsaW5nID0gZmFsc2U7XG4gICAgICAgICAgICB0aGlzLmVycm9yID0gZXJyb3I7XG5cbiAgICAgICAgICAgIC8vIHNoYWRlciBlcnJvciBpbmZvXG4gICAgICAgICAgICBpZiAoZXJyb3IudHlwZSA9PT0gJ3ZlcnRleCcgfHwgZXJyb3IudHlwZSA9PT0gJ2ZyYWdtZW50Jykge1xuICAgICAgICAgICAgICAgIHRoaXMuc2hhZGVyX2Vycm9ycyA9IGVycm9yLmVycm9ycztcbiAgICAgICAgICAgICAgICB0aGlzLnNoYWRlcl9lcnJvcnMuZm9yRWFjaChlID0+IHtcbiAgICAgICAgICAgICAgICAgICAgZS50eXBlID0gZXJyb3IudHlwZTtcbiAgICAgICAgICAgICAgICAgICAgZS5ibG9jayA9IHRoaXMuYmxvY2soZXJyb3IudHlwZSwgZS5saW5lKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhyb3cobmV3IEVycm9yKGBTaGFkZXJQcm9ncmFtLmNvbXBpbGUoKTogcHJvZ3JhbSAke3RoaXMuaWR9ICgke3RoaXMubmFtZX0pIGVycm9yOmAsIGVycm9yKSk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnVzZSgpO1xuICAgICAgICB0aGlzLnJlZnJlc2hVbmlmb3JtcygpO1xuICAgICAgICB0aGlzLnJlZnJlc2hBdHRyaWJ1dGVzKCk7XG4gICAgfVxuXG4gICAgLy8gTWFrZSBsaXN0IG9mIGRlZmluZXMgKGdsb2JhbCwgdGhlbiBwcm9ncmFtLXNwZWNpZmljKVxuICAgIGJ1aWxkRGVmaW5lTGlzdCgpIHtcbiAgICAgICAgdmFyIGQsIGRlZmluZXMgPSB7fTtcbiAgICAgICAgZm9yIChkIGluIFNoYWRlclByb2dyYW0uZGVmaW5lcykge1xuICAgICAgICAgICAgZGVmaW5lc1tkXSA9IFNoYWRlclByb2dyYW0uZGVmaW5lc1tkXTtcbiAgICAgICAgfVxuICAgICAgICBmb3IgKGQgaW4gdGhpcy5kZWZpbmVzKSB7XG4gICAgICAgICAgICBkZWZpbmVzW2RdID0gdGhpcy5kZWZpbmVzW2RdO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBkZWZpbmVzO1xuICAgIH1cblxuICAgIC8vIE1ha2UgbGlzdCBvZiBzaGFkZXIgYmxvY2tzIChnbG9iYWwsIHRoZW4gcHJvZ3JhbS1zcGVjaWZpYylcbiAgICBidWlsZFNoYWRlckJsb2NrTGlzdCgpIHtcbiAgICAgICAgbGV0IGtleSwgYmxvY2tzID0ge307XG5cbiAgICAgICAgLy8gR2xvYmFsIGJsb2Nrc1xuICAgICAgICBmb3IgKGtleSBpbiBTaGFkZXJQcm9ncmFtLmJsb2Nrcykge1xuICAgICAgICAgICAgYmxvY2tzW2tleV0gPSBbXTtcblxuICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoU2hhZGVyUHJvZ3JhbS5ibG9ja3Nba2V5XSkpIHtcbiAgICAgICAgICAgICAgICBibG9ja3Nba2V5XS5wdXNoKFxuICAgICAgICAgICAgICAgICAgICAuLi5TaGFkZXJQcm9ncmFtLmJsb2Nrc1trZXldLm1hcCgoc291cmNlLCBudW0pID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB7IGtleSwgc291cmNlLCBudW0sIHNjb3BlOiAnU2hhZGVyUHJvZ3JhbScgfTtcbiAgICAgICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgYmxvY2tzW2tleV0gPSBbeyBrZXksIHNvdXJjZTogU2hhZGVyUHJvZ3JhbS5ibG9ja3Nba2V5XSwgbnVtOiAwLCBzY29wZTogJ1NoYWRlclByb2dyYW0nIH1dO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gUHJvZ3JhbS1zcGVjaWZpYyBibG9ja3NcbiAgICAgICAgZm9yIChrZXkgaW4gdGhpcy5ibG9ja3MpIHtcbiAgICAgICAgICAgIGJsb2Nrc1trZXldID0gYmxvY2tzW2tleV0gfHwgW107XG5cbiAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KHRoaXMuYmxvY2tzW2tleV0pKSB7XG4gICAgICAgICAgICAgICAgbGV0IHNjb3BlcyA9ICh0aGlzLmJsb2NrX3Njb3BlcyAmJiB0aGlzLmJsb2NrX3Njb3Blc1trZXldKSB8fCBbXTtcbiAgICAgICAgICAgICAgICBsZXQgY3VyX3Njb3BlID0gbnVsbCwgbnVtID0gMDtcblxuICAgICAgICAgICAgICAgIGZvciAobGV0IGI9MDsgYiA8IHRoaXMuYmxvY2tzW2tleV0ubGVuZ3RoOyBiKyspIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gQ291bnQgYmxvY2tzIHJlbGF0aXZlIHRvIGN1cnJlbnQgc2NvcGVcbiAgICAgICAgICAgICAgICAgICAgaWYgKHNjb3Blc1tiXSAhPT0gY3VyX3Njb3BlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjdXJfc2NvcGUgPSBzY29wZXNbYl07XG4gICAgICAgICAgICAgICAgICAgICAgICBudW0gPSAwO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgYmxvY2tzW2tleV0ucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgICAgICBrZXksXG4gICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2U6IHRoaXMuYmxvY2tzW2tleV1bYl0sXG4gICAgICAgICAgICAgICAgICAgICAgICBudW0sXG4gICAgICAgICAgICAgICAgICAgICAgICBzY29wZTogY3VyX3Njb3BlIHx8IHRoaXMubmFtZVxuICAgICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgICAgICBudW0rKztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBUT0RPOiBhZGRyZXNzIGRpc2NyZXBhbmN5IGluIGFycmF5IHZzLiBzaW5nbGUtdmFsdWUgYmxvY2tzXG4gICAgICAgICAgICAgICAgLy8gc3R5bGVzIGFzc3VtZSBhcnJheSB3aGVuIHRyYWNraW5nIGJsb2NrIHNjb3Blc1xuICAgICAgICAgICAgICAgIGJsb2Nrc1trZXldLnB1c2goeyBrZXksIHNvdXJjZTogdGhpcy5ibG9ja3Nba2V5XSwgbnVtOiAwLCBzY29wZTogdGhpcy5uYW1lIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBibG9ja3M7XG4gICAgfVxuXG4gICAgLy8gRGV0ZWN0IHVuaWZvcm0gZGVmaW5pdGlvbnMsIGluamVjdCBhbnkgbWlzc2luZyBvbmVzXG4gICAgZW5zdXJlVW5pZm9ybXModW5pZm9ybXMpIHtcbiAgICAgICAgaWYgKCF1bmlmb3Jtcykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIHZzID0gc3RyaXAodGhpcy5jb21wdXRlZF92ZXJ0ZXhfc291cmNlKTtcbiAgICAgICAgdmFyIGZzID0gc3RyaXAodGhpcy5jb21wdXRlZF9mcmFnbWVudF9zb3VyY2UpO1xuICAgICAgICB2YXIgaW5qZWN0LCB2c19pbmplY3Rpb25zID0gW10sIGZzX2luamVjdGlvbnMgPSBbXTtcblxuICAgICAgICAvLyBDaGVjayBmb3IgbWlzc2luZyB1bmlmb3JtIGRlZmluaXRpb25zXG4gICAgICAgIGZvciAodmFyIG5hbWUgaW4gdW5pZm9ybXMpIHtcbiAgICAgICAgICAgIGluamVjdCA9IG51bGw7XG5cbiAgICAgICAgICAgIC8vIENoZWNrIHZlcnRleCBzaGFkZXJcbiAgICAgICAgICAgIGlmICghR0xTTC5pc1VuaWZvcm1EZWZpbmVkKG5hbWUsIHZzKSkge1xuICAgICAgICAgICAgICAgIGlmICghaW5qZWN0KSB7XG4gICAgICAgICAgICAgICAgICAgIGluamVjdCA9IEdMU0wuZGVmaW5lVW5pZm9ybShuYW1lLCB1bmlmb3Jtc1tuYW1lXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGxvZygndHJhY2UnLCBgUHJvZ3JhbSAke3RoaXMubmFtZX06ICR7bmFtZX0gbm90IGRlZmluZWQgaW4gdmVydGV4IHNoYWRlciwgaW5qZWN0aW5nOiAnJHtpbmplY3R9J2ApO1xuICAgICAgICAgICAgICAgIHZzX2luamVjdGlvbnMucHVzaChpbmplY3QpO1xuXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBDaGVjayBmcmFnbWVudCBzaGFkZXJcbiAgICAgICAgICAgIGlmICghR0xTTC5pc1VuaWZvcm1EZWZpbmVkKG5hbWUsIGZzKSkge1xuICAgICAgICAgICAgICAgIGlmICghaW5qZWN0KSB7XG4gICAgICAgICAgICAgICAgICAgIGluamVjdCA9IEdMU0wuZGVmaW5lVW5pZm9ybShuYW1lLCB1bmlmb3Jtc1tuYW1lXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGxvZygndHJhY2UnLCBgUHJvZ3JhbSAke3RoaXMubmFtZX06ICR7bmFtZX0gbm90IGRlZmluZWQgaW4gZnJhZ21lbnQgc2hhZGVyLCBpbmplY3Rpbmc6ICcke2luamVjdH0nYCk7XG4gICAgICAgICAgICAgICAgZnNfaW5qZWN0aW9ucy5wdXNoKGluamVjdCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBJbmplY3QgbWlzc2luZyB1bmlmb3Jtc1xuICAgICAgICAvLyBOT1RFOiB0aGVzZSBhcmUgaW5qZWN0ZWQgYXQgdGhlIHZlcnkgdG9wIG9mIHRoZSBzaGFkZXJzLCBldmVuIGJlZm9yZSBhbnkgI2RlZmluZXMgb3IgI3ByYWdtYXMgYXJlIGFkZGVkXG4gICAgICAgIC8vIHRoaXMgY291bGQgY2F1c2Ugc29tZSBpc3N1ZXMgd2l0aCBjZXJ0YWluICNwcmFnbWFzLCBvciBvdGhlciBmdW5jdGlvbnMgdGhhdCBtaWdodCBleHBlY3QgI2RlZmluZXNcbiAgICAgICAgaWYgKHZzX2luamVjdGlvbnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgdGhpcy5jb21wdXRlZF92ZXJ0ZXhfc291cmNlID0gdnNfaW5qZWN0aW9ucy5qb2luKCdcXG4nKSArIHRoaXMuY29tcHV0ZWRfdmVydGV4X3NvdXJjZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChmc19pbmplY3Rpb25zLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHRoaXMuY29tcHV0ZWRfZnJhZ21lbnRfc291cmNlID0gZnNfaW5qZWN0aW9ucy5qb2luKCdcXG4nKSArIHRoaXMuY29tcHV0ZWRfZnJhZ21lbnRfc291cmNlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gU2V0IHVuaWZvcm1zIGZyb20gYSBKUyBvYmplY3QsIHdpdGggaW5mZXJyZWQgdHlwZXNcbiAgICBzZXRVbmlmb3Jtcyh1bmlmb3JtcywgcmVzZXRfdGV4dHVyZV91bml0ID0gdHJ1ZSkge1xuICAgICAgICBpZiAoIXRoaXMuY29tcGlsZWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFRPRE86IG9ubHkgdXBkYXRlIHVuaWZvcm1zIHdoZW4gY2hhbmdlZFxuXG4gICAgICAgIC8vIFRleHR1cmUgdW5pdHMgbXVzdCBiZSB0cmFja2VkIGFuZCBpbmNyZW1lbnRlZCBlYWNoIHRpbWUgYSB0ZXh0dXJlIHNhbXBsZXIgdW5pZm9ybSBpcyBzZXQuXG4gICAgICAgIC8vIEJ5IGRlZmF1bHQsIHRoZSB0ZXh0dXJlIHVuaXQgaXMgcmVzZXQgdG8gMCBlYWNoIHRpbWUgc2V0VW5pZm9ybXMgaXMgY2FsbGVkLCBidXQgdGhleSBjYW5cbiAgICAgICAgLy8gYWxzbyBiZSBwcmVzZXJ2ZWQsIGZvciBleGFtcGxlIGluIGNhc2VzIHdoZXJlIG11bHRpcGxlIGNhbGxzIHRvIHNldFVuaWZvcm1zIGFyZSBleHBlY3RlZFxuICAgICAgICAvLyAoZS5nLiBwcm9ncmFtLXNwZWNpZmljIHVuaWZvcm1zIGZvbGxvd2VkIGJ5IG1lc2gtc3BlY2lmaWMgb25lcykuXG4gICAgICAgIGlmIChyZXNldF90ZXh0dXJlX3VuaXQpIHtcbiAgICAgICAgICAgIHRoaXMudGV4dHVyZV91bml0ID0gMDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFBhcnNlIHVuaWZvcm0gdHlwZXMgYW5kIHZhbHVlcyBmcm9tIHRoZSBKUyBvYmplY3RcbiAgICAgICAgY29uc3QgcGFyc2VkID0gR0xTTC5wYXJzZVVuaWZvcm1zKHVuaWZvcm1zKTtcblxuICAgICAgICAvLyBTZXQgZWFjaCB1bmlmb3JtXG4gICAgICAgIGZvciAobGV0IHU9MDsgdSA8IHBhcnNlZC5sZW5ndGg7IHUrKykge1xuICAgICAgICAgICAgY29uc3QgdW5pZm9ybSA9IHBhcnNlZFt1XTtcbiAgICAgICAgICAgIGlmICh1bmlmb3JtLnR5cGUgPT09ICdzYW1wbGVyMkQnKSB7XG4gICAgICAgICAgICAgICAgLy8gRm9yIHRleHR1cmVzLCB3ZSBuZWVkIHRvIHRyYWNrIHRleHR1cmUgdW5pdHMsIHNvIHdlIGhhdmUgYSBzcGVjaWFsIHNldHRlclxuICAgICAgICAgICAgICAgIHRoaXMuc2V0VGV4dHVyZVVuaWZvcm0odW5pZm9ybS5uYW1lLCB1bmlmb3JtLnZhbHVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMudW5pZm9ybSh1bmlmb3JtLm1ldGhvZCwgdW5pZm9ybS5uYW1lLCB1bmlmb3JtLnZhbHVlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIENhY2hlIHNvbWUgb3IgYWxsIHVuaWZvcm0gdmFsdWVzIHNvIHRoZXkgY2FuIGJlIHJlc3RvcmVkXG4gICAgc2F2ZVVuaWZvcm1zKHN1YnNldCkge1xuICAgICAgICBsZXQgdW5pZm9ybXMgPSBzdWJzZXQgfHwgdGhpcy51bmlmb3JtcztcbiAgICAgICAgZm9yIChsZXQgdSBpbiB1bmlmb3Jtcykge1xuICAgICAgICAgICAgbGV0IHVuaWZvcm0gPSB0aGlzLnVuaWZvcm1zW3VdO1xuICAgICAgICAgICAgaWYgKHVuaWZvcm0pIHtcbiAgICAgICAgICAgICAgICB1bmlmb3JtLnNhdmVkX3ZhbHVlID0gdW5pZm9ybS52YWx1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aGlzLnNhdmVkX3RleHR1cmVfdW5pdCA9IHRoaXMudGV4dHVyZV91bml0IHx8IDA7XG4gICAgfVxuXG4gICAgLy8gUmVzdG9yZSBzb21lIG9yIGFsbCB1bmlmb3JtcyB0byBzYXZlZCB2YWx1ZXNcbiAgICByZXN0b3JlVW5pZm9ybXMoc3Vic2V0KSB7XG4gICAgICAgIGxldCB1bmlmb3JtcyA9IHN1YnNldCB8fCB0aGlzLnVuaWZvcm1zO1xuICAgICAgICBmb3IgKGxldCB1IGluIHVuaWZvcm1zKSB7XG4gICAgICAgICAgICBsZXQgdW5pZm9ybSA9IHRoaXMudW5pZm9ybXNbdV07XG4gICAgICAgICAgICBpZiAodW5pZm9ybSAmJiB1bmlmb3JtLnNhdmVkX3ZhbHVlKSB7XG4gICAgICAgICAgICAgICAgdW5pZm9ybS52YWx1ZSA9IHVuaWZvcm0uc2F2ZWRfdmFsdWU7XG4gICAgICAgICAgICAgICAgdGhpcy51cGRhdGVVbmlmb3JtKHVuaWZvcm0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMudGV4dHVyZV91bml0ID0gdGhpcy5zYXZlZF90ZXh0dXJlX3VuaXQgfHwgMDtcbiAgICB9XG5cbiAgICAvLyBTZXQgYSB0ZXh0dXJlIHVuaWZvcm0sIGZpbmRzIHRleHR1cmUgYnkgbmFtZSBvciBjcmVhdGVzIGEgbmV3IG9uZVxuICAgIHNldFRleHR1cmVVbmlmb3JtKHVuaWZvcm1fbmFtZSwgdGV4dHVyZV9uYW1lKSB7XG4gICAgICAgIHZhciB0ZXh0dXJlID0gVGV4dHVyZS50ZXh0dXJlc1t0ZXh0dXJlX25hbWVdO1xuICAgICAgICBpZiAodGV4dHVyZSA9PSBudWxsKSB7XG4gICAgICAgICAgICBsb2coJ3dhcm4nLCBgQ2Fubm90IGZpbmQgdGV4dHVyZSAnJHt0ZXh0dXJlX25hbWV9J2ApO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGV4dHVyZS5iaW5kKHRoaXMudGV4dHVyZV91bml0KTtcbiAgICAgICAgdGhpcy51bmlmb3JtKCcxaScsIHVuaWZvcm1fbmFtZSwgdGhpcy50ZXh0dXJlX3VuaXQpO1xuICAgICAgICB0aGlzLnRleHR1cmVfdW5pdCsrOyAvLyBUT0RPOiB0cmFjayBtYXggdGV4dHVyZSB1bml0cyBhbmQgbG9nL3Rocm93IGVycm9yc1xuICAgIH1cblxuICAgIC8vIGV4OiBwcm9ncmFtLnVuaWZvcm0oJzNmdicsICdwb3NpdGlvbicsIFt4LCB5LCB6XSk7XG4gICAgLy8gVE9ETzogb25seSB1cGRhdGUgdW5pZm9ybXMgd2hlbiBjaGFuZ2VkXG4gICAgdW5pZm9ybShtZXRob2QsIG5hbWUsIHZhbHVlKSB7IC8vICd2YWx1ZScgaXMgYSBtZXRob2QtYXBwcm9wcmlhdGUgYXJndW1lbnRzIGxpc3RcbiAgICAgICAgaWYgKCF0aGlzLmNvbXBpbGVkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnVuaWZvcm1zW25hbWVdID0gdGhpcy51bmlmb3Jtc1tuYW1lXSB8fCB7fTtcbiAgICAgICAgbGV0IHVuaWZvcm0gPSB0aGlzLnVuaWZvcm1zW25hbWVdO1xuICAgICAgICB1bmlmb3JtLm5hbWUgPSBuYW1lO1xuICAgICAgICBpZiAodW5pZm9ybS5sb2NhdGlvbiA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICB1bmlmb3JtLmxvY2F0aW9uID0gdGhpcy5nbC5nZXRVbmlmb3JtTG9jYXRpb24odGhpcy5wcm9ncmFtLCBuYW1lKTtcbiAgICAgICAgfVxuICAgICAgICB1bmlmb3JtLm1ldGhvZCA9IG1ldGhvZDtcbiAgICAgICAgdW5pZm9ybS52YWx1ZSA9IHZhbHVlO1xuICAgICAgICB0aGlzLnVwZGF0ZVVuaWZvcm0odW5pZm9ybSk7XG4gICAgfVxuXG4gICAgLy8gU2V0IGEgc2luZ2xlIHVuaWZvcm1cbiAgICB1cGRhdGVVbmlmb3JtKHVuaWZvcm0pIHtcbiAgICAgICAgaWYgKCF0aGlzLmNvbXBpbGVkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXVuaWZvcm0gfHwgdW5pZm9ybS5sb2NhdGlvbiA9PSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnVzZSgpO1xuICAgICAgICB0aGlzLmNvbW1pdFVuaWZvcm0odW5pZm9ybSk7XG4gICAgfVxuXG4gICAgLy8gQ29tbWl0cyB0aGUgdW5pZm9ybSB0byB0aGUgR1BVXG4gICAgY29tbWl0VW5pZm9ybSh1bmlmb3JtKXtcbiAgICAgICAgbGV0IGxvY2F0aW9uID0gdW5pZm9ybS5sb2NhdGlvbjtcbiAgICAgICAgbGV0IHZhbHVlID0gdW5pZm9ybS52YWx1ZTtcblxuICAgICAgICBzd2l0Y2ggKHVuaWZvcm0ubWV0aG9kKSB7XG4gICAgICAgICAgICBjYXNlICcxaSc6XG4gICAgICAgICAgICAgICAgdGhpcy5nbC51bmlmb3JtMWkobG9jYXRpb24sIHZhbHVlKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJzFmJzpcbiAgICAgICAgICAgICAgICB0aGlzLmdsLnVuaWZvcm0xZihsb2NhdGlvbiwgdmFsdWUpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnMmYnOlxuICAgICAgICAgICAgICAgIHRoaXMuZ2wudW5pZm9ybTJmKGxvY2F0aW9uLCB2YWx1ZVswXSwgdmFsdWVbMV0pO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnM2YnOlxuICAgICAgICAgICAgICAgIHRoaXMuZ2wudW5pZm9ybTNmKGxvY2F0aW9uLCB2YWx1ZVswXSwgdmFsdWVbMV0sIHZhbHVlWzJdKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJzRmJzpcbiAgICAgICAgICAgICAgICB0aGlzLmdsLnVuaWZvcm00Zihsb2NhdGlvbiwgdmFsdWVbMF0sIHZhbHVlWzFdLCB2YWx1ZVsyXSwgdmFsdWVbM10pO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnMWl2JzpcbiAgICAgICAgICAgICAgICB0aGlzLmdsLnVuaWZvcm0xaXYobG9jYXRpb24sIHZhbHVlKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJzNpdic6XG4gICAgICAgICAgICAgICAgdGhpcy5nbC51bmlmb3JtM2l2KGxvY2F0aW9uLCB2YWx1ZSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICcxZnYnOlxuICAgICAgICAgICAgICAgIHRoaXMuZ2wudW5pZm9ybTFmdihsb2NhdGlvbiwgdmFsdWUpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnMmZ2JzpcbiAgICAgICAgICAgICAgICB0aGlzLmdsLnVuaWZvcm0yZnYobG9jYXRpb24sIHZhbHVlKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIGNhc2UgJzNmdic6XG4gICAgICAgICAgICAgICAgdGhpcy5nbC51bmlmb3JtM2Z2KGxvY2F0aW9uLCB2YWx1ZSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICc0ZnYnOlxuICAgICAgICAgICAgICAgIHRoaXMuZ2wudW5pZm9ybTRmdihsb2NhdGlvbiwgdmFsdWUpO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSAnTWF0cml4M2Z2JzpcbiAgICAgICAgICAgICAgICB0aGlzLmdsLnVuaWZvcm1NYXRyaXgzZnYobG9jYXRpb24sIGZhbHNlLCB2YWx1ZSk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlICdNYXRyaXg0ZnYnOlxuICAgICAgICAgICAgICAgIHRoaXMuZ2wudW5pZm9ybU1hdHJpeDRmdihsb2NhdGlvbiwgZmFsc2UsIHZhbHVlKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIFJlZnJlc2ggdW5pZm9ybSBsb2NhdGlvbnMgYW5kIHNldCB0byBsYXN0IGNhY2hlZCB2YWx1ZXNcbiAgICByZWZyZXNoVW5pZm9ybXMoKSB7XG4gICAgICAgIGlmICghdGhpcy5jb21waWxlZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgZm9yICh2YXIgdSBpbiB0aGlzLnVuaWZvcm1zKSB7XG4gICAgICAgICAgICBsZXQgdW5pZm9ybSA9IHRoaXMudW5pZm9ybXNbdV07XG4gICAgICAgICAgICB1bmlmb3JtLmxvY2F0aW9uID0gdGhpcy5nbC5nZXRVbmlmb3JtTG9jYXRpb24odGhpcy5wcm9ncmFtLCB1KTtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlVW5pZm9ybSh1bmlmb3JtKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJlZnJlc2hBdHRyaWJ1dGVzKCkge1xuICAgICAgICAvLyB2YXIgbGVuID0gdGhpcy5nbC5nZXRQcm9ncmFtUGFyYW1ldGVyKHRoaXMucHJvZ3JhbSwgdGhpcy5nbC5BQ1RJVkVfQVRUUklCVVRFUyk7XG4gICAgICAgIC8vIGZvciAodmFyIGk9MDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgIC8vICAgICB2YXIgYSA9IHRoaXMuZ2wuZ2V0QWN0aXZlQXR0cmliKHRoaXMucHJvZ3JhbSwgaSk7XG4gICAgICAgIC8vIH1cbiAgICAgICAgdGhpcy5hdHRyaWJzID0ge307XG4gICAgfVxuXG4gICAgLy8gR2V0IHRoZSBsb2NhdGlvbiBvZiBhIHZlcnRleCBhdHRyaWJ1dGVcbiAgICBhdHRyaWJ1dGUobmFtZSkge1xuICAgICAgICBpZiAoIXRoaXMuY29tcGlsZWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBhdHRyaWIgPSAodGhpcy5hdHRyaWJzW25hbWVdID0gdGhpcy5hdHRyaWJzW25hbWVdIHx8IHt9KTtcbiAgICAgICAgaWYgKGF0dHJpYi5sb2NhdGlvbiAhPSBudWxsKSB7XG4gICAgICAgICAgICByZXR1cm4gYXR0cmliO1xuICAgICAgICB9XG5cbiAgICAgICAgYXR0cmliLm5hbWUgPSBuYW1lO1xuICAgICAgICBhdHRyaWIubG9jYXRpb24gPSB0aGlzLmdsLmdldEF0dHJpYkxvY2F0aW9uKHRoaXMucHJvZ3JhbSwgbmFtZSk7XG5cbiAgICAgICAgLy8gdmFyIGluZm8gPSB0aGlzLmdsLmdldEFjdGl2ZUF0dHJpYih0aGlzLnByb2dyYW0sIGF0dHJpYi5sb2NhdGlvbik7XG4gICAgICAgIC8vIGF0dHJpYi50eXBlID0gaW5mby50eXBlO1xuICAgICAgICAvLyBhdHRyaWIuc2l6ZSA9IGluZm8uc2l6ZTtcblxuICAgICAgICByZXR1cm4gYXR0cmliO1xuICAgIH1cblxuICAgIC8vIEdldCBzaGFkZXIgc291cmNlIGFzIHN0cmluZ1xuICAgIHNvdXJjZSh0eXBlKSB7XG4gICAgICAgIGlmICh0eXBlID09PSAndmVydGV4Jykge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuY29tcHV0ZWRfdmVydGV4X3NvdXJjZTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0eXBlID09PSAnZnJhZ21lbnQnKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5jb21wdXRlZF9mcmFnbWVudF9zb3VyY2U7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBHZXQgc2hhZGVyIHNvdXJjZSBhcyBhcnJheSBvZiBsaW5lIHN0cmluZ3NcbiAgICBsaW5lcyh0eXBlKSB7XG4gICAgICAgIGxldCBzb3VyY2UgPSB0aGlzLnNvdXJjZSh0eXBlKTtcbiAgICAgICAgaWYgKHNvdXJjZSkge1xuICAgICAgICAgICAgcmV0dXJuIHNvdXJjZS5zcGxpdCgnXFxuJyk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFtdO1xuICAgIH1cblxuICAgIC8vIEdldCBhIHNwZWNpZmljIGxpbmUgZnJvbSBzaGFkZXIgc291cmNlXG4gICAgbGluZSh0eXBlLCBudW0pIHtcbiAgICAgICAgbGV0IHNvdXJjZSA9IHRoaXMubGluZXModHlwZSk7XG4gICAgICAgIGlmIChzb3VyY2UpIHtcbiAgICAgICAgICAgIHJldHVybiBzb3VyY2VbbnVtXTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIEdldCBpbmZvIG9uIHdoaWNoIHNoYWRlciBibG9jayAoaWYgYW55KSBhIHBhcnRpY3VsYXIgbGluZSBudW1iZXIgaW4gYSBzaGFkZXIgaXMgaW5cbiAgICAvLyBSZXR1cm5zIGFuIG9iamVjdCB3aXRoIHRoZSBmb2xsb3dpbmcgaW5mbyBpZiBhIGJsb2NrIGlzIGZvdW5kOiB7IG5hbWUsIGxpbmUsIHNvdXJjZSB9XG4gICAgLy8gIHNjb3BlOiB3aGVyZSB0aGUgc2hhZGVyIGJsb2NrIG9yaWdpbmF0ZWQsIGVpdGhlciBhIHN0eWxlIG5hbWUsIG9yIGdsb2JhbCBzdWNoIGFzIFNoYWRlclByb2dyYW1cbiAgICAvLyAgbmFtZTogc2hhZGVyIGJsb2NrIG5hbWUgKGUuZy4gJ2NvbG9yJywgJ3Bvc2l0aW9uJywgJ2dsb2JhbCcpXG4gICAgLy8gIG51bTogdGhlIGJsb2NrIG51bWJlciAqd2l0aGluKiBsb2NhbCBzY29wZSAoZS5nLiBpZiBhIHN0eWxlIGhhcyBtdWx0aXBsZSAnY29sb3InIGJsb2NrcylcbiAgICAvLyAgbGluZTogbGluZSBudW1iZXIgKndpdGhpbiogdGhlIHNoYWRlciBibG9jayAobm90IHRoZSB3aG9sZSBzaGFkZXIgcHJvZ3JhbSksIHVzZWZ1bCBmb3IgZXJyb3IgaGlnaGxpZ2h0aW5nXG4gICAgLy8gIHNvdXJjZTogdGhlIGNvZGUgZm9yIHRoZSBsaW5lXG4gICAgLy8gTk9URTogdGhpcyBkb2VzIGEgYnJ1dGVmb3JjZSBsb29wIG92ZXIgdGhlIHNoYWRlciBzb3VyY2UgYW5kIGxvb2tzIGZvciBzaGFkZXIgYmxvY2sgc3RhcnQvZW5kIG1hcmtlcnNcbiAgICAvLyBXZSBjb3VsZCB0cmFjayBsaW5lIHJhbmdlcyBmb3Igc2hhZGVyIGJsb2NrcyBhcyB0aGV5IGFyZSBpbnNlcnRlZCwgYnV0IGFzIHRoaXMgY29kZSBpcyBvbmx5IHVzZWQgZm9yXG4gICAgLy8gZXJyb3IgaGFuZGxpbmcgb24gY29tcGlsYXRpb24gZmFpbHVyZSwgaXQgd2FzIHNpbXBsZXIgdG8ga2VlcCBpdCBzZXBhcmF0ZSB0aGFuIHRvIGJ1cmRlbiB0aGUgY29yZVxuICAgIC8vIGNvbXBpbGF0aW9uIHBhdGguXG4gICAgYmxvY2sodHlwZSwgbnVtKSB7XG4gICAgICAgIGxldCBsaW5lcyA9IHRoaXMubGluZXModHlwZSk7XG4gICAgICAgIGxldCBibG9jaztcbiAgICAgICAgZm9yIChsZXQgaT0wOyBpIDwgbnVtICYmIGkgPCBsaW5lcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgbGV0IGxpbmUgPSBsaW5lc1tpXTtcbiAgICAgICAgICAgIGxldCBtYXRjaCA9IGxpbmUubWF0Y2goL1xcL1xcLyB0YW5ncmFtLWJsb2NrLXN0YXJ0OiAoW0EtWmEtejAtOV8tXSspLCAoW0EtWmEtejAtOV8tXSspLCAoXFxkKykvKTtcbiAgICAgICAgICAgIGlmIChtYXRjaCAmJiBtYXRjaC5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgICAgICAgLy8gbWFyayBjdXJyZW50IGJsb2NrXG4gICAgICAgICAgICAgICAgYmxvY2sgPSB7XG4gICAgICAgICAgICAgICAgICAgIHNjb3BlOiBtYXRjaFsxXSxcbiAgICAgICAgICAgICAgICAgICAgbmFtZTogbWF0Y2hbMl0sXG4gICAgICAgICAgICAgICAgICAgIG51bTogbWF0Y2hbM11cbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgbWF0Y2ggPSBsaW5lLm1hdGNoKC9cXC9cXC8gdGFuZ3JhbS1ibG9jay1lbmQ6IChbQS1aYS16MC05Xy1dKyksIChbQS1aYS16MC05Xy1dKyksIChcXGQrKS8pO1xuICAgICAgICAgICAgICAgIGlmIChtYXRjaCAmJiBtYXRjaC5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgICAgICAgICAgIGJsb2NrID0gbnVsbDsgLy8gY2xlYXIgY3VycmVudCBibG9ja1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gdXBkYXRlIGxpbmUgIyBhbmQgY29udGVudFxuICAgICAgICAgICAgaWYgKGJsb2NrKSB7XG4gICAgICAgICAgICAgICAgLy8gaW5pdCB0byAtMSBzbyB0aGF0IGxpbmUgMCBpcyBmaXJzdCBhY3R1YWwgbGluZSBvZiBibG9jayBjb2RlLCBhZnRlciBjb21tZW50IG1hcmtlclxuICAgICAgICAgICAgICAgIGJsb2NrLmxpbmUgPSAoYmxvY2subGluZSA9PSBudWxsKSA/IC0xIDogYmxvY2subGluZSArIDE7XG4gICAgICAgICAgICAgICAgYmxvY2suc291cmNlID0gbGluZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gYmxvY2s7XG4gICAgfVxuXG4gICAgLy8gUmV0dXJucyBsaXN0IG9mIGF2YWlsYWJsZSBleHRlbnNpb25zIGZyb20gdGhvc2UgcmVxdWVzdGVkXG4gICAgLy8gU2V0cyBpbnRlcm5hbCAjZGVmaW5lcyBpbmRpY2F0aW5nIGF2YWlsYWJpbGl0eSBvZiBlYWNoIHJlcXVlc3RlZCBleHRlbnNpb25cbiAgICBjaGVja0V4dGVuc2lvbnMoKSB7XG4gICAgICAgIGxldCBleHRzID0gW107XG4gICAgICAgIHRoaXMuZXh0ZW5zaW9ucy5mb3JFYWNoKG5hbWUgPT4ge1xuICAgICAgICAgICAgbGV0IGV4dCA9IGdldEV4dGVuc2lvbih0aGlzLmdsLCBuYW1lKTtcbiAgICAgICAgICAgIGxldCBkZWYgPSBgVEFOR1JBTV9FWFRFTlNJT05fJHtuYW1lfWA7XG5cbiAgICAgICAgICAgIHRoaXMuZGVmaW5lc1tkZWZdID0gKGV4dCAhPSBudWxsKTtcblxuICAgICAgICAgICAgaWYgKGV4dCkge1xuICAgICAgICAgICAgICAgIGV4dHMucHVzaChuYW1lKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGxvZygnZGVidWcnLCBgQ291bGQgbm90IGVuYWJsZSBleHRlbnNpb24gJyR7bmFtZX0nYCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgICAgICByZXR1cm4gZXh0cztcbiAgICB9XG5cbn1cblxuXG4vLyBTdGF0aWMgbWV0aG9kcyBhbmQgc3RhdGVcblNoYWRlclByb2dyYW0uaWQgPSAwOyAgICAgICAgICAgICAgICAgICAvLyBhc3NpZ24gZWFjaCBwcm9ncmFtIGEgdW5pcXVlIGlkXG5TaGFkZXJQcm9ncmFtLmN1cnJlbnQgPSBudWxsOyAgICAgICAgICAgLy8gY3VycmVudGx5IGJvdW5kIHByb2dyYW1cblxuLy8gR2xvYmFsIGNvbmZpZyBhcHBsaWVkIHRvIGFsbCBwcm9ncmFtcyAoZHVwbGljYXRlIHByb3BlcnRpZXMgZm9yIGEgc3BlY2lmaWMgcHJvZ3JhbSB3aWxsIHRha2UgcHJlY2VkZW5jZSlcblNoYWRlclByb2dyYW0uZGVmaW5lcyA9IHt9O1xuU2hhZGVyUHJvZ3JhbS5ibG9ja3MgPSB7fTtcblxuLy8gUmVzZXQgcHJvZ3JhbSBhbmQgc2hhZGVyIGNhY2hlc1xuU2hhZGVyUHJvZ3JhbS5yZXNldCA9IGZ1bmN0aW9uICgpIHtcbiAgICBTaGFkZXJQcm9ncmFtLnByb2dyYW1zX2J5X3NvdXJjZSA9IHt9OyAgLy8gR0wgcHJvZ3JhbSBvYmplY3RzIGJ5IGV4YWN0IHZlcnRleCArIGZyYWdtZW50IHNoYWRlciBzb3VyY2VcbiAgICBTaGFkZXJQcm9ncmFtLnNoYWRlcnNfYnlfc291cmNlID0ge307ICAgLy8gR0wgc2hhZGVyIG9iamVjdHMgYnkgZXhhY3Qgc291cmNlXG59O1xuU2hhZGVyUHJvZ3JhbS5yZXNldCgpO1xuXG4vLyBUdXJuIGFuIG9iamVjdCBvZiBrZXkvdmFsdWUgcGFpcnMgaW50byBzaW5nbGUgc3RyaW5nIG9mICNkZWZpbmUgc3RhdGVtZW50c1xuU2hhZGVyUHJvZ3JhbS5idWlsZERlZmluZVN0cmluZyA9IGZ1bmN0aW9uIChkZWZpbmVzKSB7XG4gICAgdmFyIGRlZmluZV9zdHIgPSBcIlwiO1xuICAgIGZvciAodmFyIGQgaW4gZGVmaW5lcykge1xuICAgICAgICBpZiAoZGVmaW5lc1tkXSA9PSBudWxsIHx8IGRlZmluZXNbZF0gPT09IGZhbHNlKSB7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0eXBlb2YgZGVmaW5lc1tkXSA9PT0gJ2Jvb2xlYW4nICYmIGRlZmluZXNbZF0gPT09IHRydWUpIHsgLy8gYm9vbGVhbnMgYXJlIHNpbXBsZSBkZWZpbmVzIHdpdGggbm8gdmFsdWVcbiAgICAgICAgICAgIGRlZmluZV9zdHIgKz0gXCIjZGVmaW5lIFwiICsgZCArIFwiXFxuXCI7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodHlwZW9mIGRlZmluZXNbZF0gPT09ICdudW1iZXInICYmIE1hdGguZmxvb3IoZGVmaW5lc1tkXSkgPT09IGRlZmluZXNbZF0pIHsgLy8gaW50IHRvIGZsb2F0IGNvbnZlcnNpb24gdG8gc2F0aXNmeSBHTFNMIGZsb2F0c1xuICAgICAgICAgICAgZGVmaW5lX3N0ciArPSBcIiNkZWZpbmUgXCIgKyBkICsgXCIgXCIgKyBkZWZpbmVzW2RdLnRvRml4ZWQoMSkgKyBcIlxcblwiO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgeyAvLyBhbnkgb3RoZXIgZmxvYXQgb3Igc3RyaW5nIHZhbHVlXG4gICAgICAgICAgICBkZWZpbmVfc3RyICs9IFwiI2RlZmluZSBcIiArIGQgKyBcIiBcIiArIGRlZmluZXNbZF0gKyBcIlxcblwiO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBkZWZpbmVfc3RyO1xufTtcblxuLy8gVHVybiBhIGxpc3Qgb2YgZXh0ZW5zaW9uIG5hbWVzIGludG8gc2luZ2xlIHN0cmluZyBvZiAjZXh0ZW5zaW9uIHN0YXRlbWVudHNcblNoYWRlclByb2dyYW0uYnVpbGRFeHRlbnNpb25TdHJpbmcgPSBmdW5jdGlvbiAoZXh0ZW5zaW9ucykge1xuICAgIGV4dGVuc2lvbnMgPSBleHRlbnNpb25zIHx8IFtdO1xuICAgIGxldCBzdHIgPSBcIlwiO1xuICAgIGV4dGVuc2lvbnMuZm9yRWFjaChleHQgPT4ge1xuICAgICAgICBzdHIgKz0gYCNpZmRlZiBHTF8ke2V4dH1cXG4jZXh0ZW5zaW9uIEdMXyR7ZXh0fSA6IGVuYWJsZVxcbiNlbmRpZlxcbmA7XG4gICAgfSk7XG4gICAgcmV0dXJuIHN0cjtcbn07XG5cblNoYWRlclByb2dyYW0uYWRkQmxvY2sgPSBmdW5jdGlvbiAoa2V5LCAuLi5ibG9ja3MpIHtcbiAgICBTaGFkZXJQcm9ncmFtLmJsb2Nrc1trZXldID0gU2hhZGVyUHJvZ3JhbS5ibG9ja3Nba2V5XSB8fCBbXTtcbiAgICBTaGFkZXJQcm9ncmFtLmJsb2Nrc1trZXldLnB1c2goLi4uYmxvY2tzKTtcbn07XG5cbi8vIFJlbW92ZSBhbGwgZ2xvYmFsIHNoYWRlciBibG9ja3MgZm9yIGEgZ2l2ZW4ga2V5XG5TaGFkZXJQcm9ncmFtLnJlbW92ZUJsb2NrID0gZnVuY3Rpb24gKGtleSkge1xuICAgIFNoYWRlclByb2dyYW0uYmxvY2tzW2tleV0gPSBbXTtcbn07XG5cblNoYWRlclByb2dyYW0ucmVwbGFjZUJsb2NrID0gZnVuY3Rpb24gKGtleSwgLi4uYmxvY2tzKSB7XG4gICAgU2hhZGVyUHJvZ3JhbS5yZW1vdmVCbG9jayhrZXkpO1xuICAgIFNoYWRlclByb2dyYW0uYWRkQmxvY2soa2V5LCAuLi5ibG9ja3MpO1xufTtcblxuLy8gQ29tcGlsZSAmIGxpbmsgYSBXZWJHTCBwcm9ncmFtIGZyb20gcHJvdmlkZWQgdmVydGV4IGFuZCBmcmFnbWVudCBzaGFkZXIgc291cmNlc1xuLy8gdXBkYXRlIGEgcHJvZ3JhbSBpZiBvbmUgaXMgcGFzc2VkIGluLiBDcmVhdGUgb25lIGlmIG5vdC4gQWxlcnQgYW5kIGRvbid0IHVwZGF0ZSBhbnl0aGluZyBpZiB0aGUgc2hhZGVycyBkb24ndCBjb21waWxlLlxuU2hhZGVyUHJvZ3JhbS51cGRhdGVQcm9ncmFtID0gZnVuY3Rpb24gKGdsLCBwcm9ncmFtLCB2ZXJ0ZXhfc2hhZGVyX3NvdXJjZSwgZnJhZ21lbnRfc2hhZGVyX3NvdXJjZSkge1xuICAgIC8vIFByb2dyYW0gd2l0aCB0aGlzIGV4YWN0IHZlcnRleCBhbmQgZnJhZ21lbnQgc2hhZGVyIHNvdXJjZXMgYWxyZWFkeSBjYWNoZWQ/XG4gICAgbGV0IGtleSA9IHZlcnRleF9zaGFkZXJfc291cmNlICsgJzo6JyArIGZyYWdtZW50X3NoYWRlcl9zb3VyY2U7XG4gICAgaWYgKFNoYWRlclByb2dyYW0ucHJvZ3JhbXNfYnlfc291cmNlW2tleV0pIHtcbiAgICAgICAgbG9nKCd0cmFjZScsICdSZXVzaW5nIGlkZW50aWNhbCBzb3VyY2UgR0wgcHJvZ3JhbSBvYmplY3QnKTtcbiAgICAgICAgcmV0dXJuIFNoYWRlclByb2dyYW0ucHJvZ3JhbXNfYnlfc291cmNlW2tleV07XG4gICAgfVxuXG4gICAgdHJ5IHtcbiAgICAgICAgdmFyIHZlcnRleF9zaGFkZXIgPSBTaGFkZXJQcm9ncmFtLmNyZWF0ZVNoYWRlcihnbCwgdmVydGV4X3NoYWRlcl9zb3VyY2UsIGdsLlZFUlRFWF9TSEFERVIpO1xuICAgICAgICB2YXIgZnJhZ21lbnRfc2hhZGVyID0gU2hhZGVyUHJvZ3JhbS5jcmVhdGVTaGFkZXIoZ2wsIGZyYWdtZW50X3NoYWRlcl9zb3VyY2UsIGdsLkZSQUdNRU5UX1NIQURFUik7XG4gICAgfVxuICAgIGNhdGNoKGVycikge1xuICAgICAgICBsb2coJ2Vycm9yJywgZXJyLm1lc3NhZ2UpO1xuICAgICAgICB0aHJvdyBlcnI7XG4gICAgfVxuXG4gICAgZ2wudXNlUHJvZ3JhbShudWxsKTtcbiAgICBpZiAocHJvZ3JhbSAhPSBudWxsKSB7XG4gICAgICAgIHZhciBvbGRfc2hhZGVycyA9IGdsLmdldEF0dGFjaGVkU2hhZGVycyhwcm9ncmFtKTtcbiAgICAgICAgZm9yKHZhciBpID0gMDsgaSA8IG9sZF9zaGFkZXJzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBnbC5kZXRhY2hTaGFkZXIocHJvZ3JhbSwgb2xkX3NoYWRlcnNbaV0pO1xuICAgICAgICB9XG4gICAgfSBlbHNlIHtcbiAgICAgICAgcHJvZ3JhbSA9IGdsLmNyZWF0ZVByb2dyYW0oKTtcbiAgICB9XG5cbiAgICBpZiAodmVydGV4X3NoYWRlciA9PSBudWxsIHx8IGZyYWdtZW50X3NoYWRlciA9PSBudWxsKSB7XG4gICAgICAgIHJldHVybiBwcm9ncmFtO1xuICAgIH1cblxuICAgIGdsLmF0dGFjaFNoYWRlcihwcm9ncmFtLCB2ZXJ0ZXhfc2hhZGVyKTtcbiAgICBnbC5hdHRhY2hTaGFkZXIocHJvZ3JhbSwgZnJhZ21lbnRfc2hhZGVyKTtcblxuICAgIGdsLmxpbmtQcm9ncmFtKHByb2dyYW0pO1xuXG4gICAgLy8gVE9ETzogcmVmZXJlbmNlIGNvdW50IGFuZCBkZWxldGUgc2hhZGVyIG9iamVjdHMgd2hlbiBubyBwcm9ncmFtcyByZWZlcmVuY2UgdGhlbVxuXG4gICAgaWYgKCFnbC5nZXRQcm9ncmFtUGFyYW1ldGVyKHByb2dyYW0sIGdsLkxJTktfU1RBVFVTKSkge1xuICAgICAgICBsZXQgbWVzc2FnZSA9IG5ldyBFcnJvcihcbiAgICAgICAgICAgIGBXZWJHTCBwcm9ncmFtIGVycm9yOlxuICAgICAgICAgICAgVkFMSURBVEVfU1RBVFVTOiAke2dsLmdldFByb2dyYW1QYXJhbWV0ZXIocHJvZ3JhbSwgZ2wuVkFMSURBVEVfU1RBVFVTKX1cbiAgICAgICAgICAgIEVSUk9SOiAke2dsLmdldEVycm9yKCl9XG4gICAgICAgICAgICAtLS0gVmVydGV4IFNoYWRlciAtLS1cbiAgICAgICAgICAgICR7dmVydGV4X3NoYWRlcl9zb3VyY2V9XG4gICAgICAgICAgICAtLS0gRnJhZ21lbnQgU2hhZGVyIC0tLVxuICAgICAgICAgICAgJHtmcmFnbWVudF9zaGFkZXJfc291cmNlfWApO1xuXG4gICAgICAgIGxldCBlcnJvciA9IHsgdHlwZTogJ3Byb2dyYW0nLCBtZXNzYWdlIH07XG4gICAgICAgIGxvZygnZXJyb3InLCBlcnJvci5tZXNzYWdlKTtcbiAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgfVxuXG4gICAgU2hhZGVyUHJvZ3JhbS5wcm9ncmFtc19ieV9zb3VyY2Vba2V5XSA9IHByb2dyYW07IC8vIGNhY2hlIGJ5IGV4YWN0IHNvdXJjZVxuICAgIHJldHVybiBwcm9ncmFtO1xufTtcblxuLy8gQ29tcGlsZSBhIHZlcnRleCBvciBmcmFnbWVudCBzaGFkZXIgZnJvbSBwcm92aWRlZCBzb3VyY2VcblNoYWRlclByb2dyYW0uY3JlYXRlU2hhZGVyID0gZnVuY3Rpb24gKGdsLCBzb3VyY2UsIHN0eXBlKSB7XG4gICAgLy8gUHJvZ3JhbSB3aXRoIGlkZW50aWNhbCB2ZXJ0ZXggYW5kIGZyYWdtZW50IHNoYWRlciBzb3VyY2VzIGFscmVhZHkgY2FjaGVkP1xuICAgIGxldCBrZXkgPSBzb3VyY2U7XG4gICAgaWYgKFNoYWRlclByb2dyYW0uc2hhZGVyc19ieV9zb3VyY2Vba2V5XSkge1xuICAgICAgICBsb2coJ3RyYWNlJywgJ1JldXNpbmcgaWRlbnRpY2FsIHNvdXJjZSBHTCBzaGFkZXIgb2JqZWN0Jyk7XG4gICAgICAgIHJldHVybiBTaGFkZXJQcm9ncmFtLnNoYWRlcnNfYnlfc291cmNlW2tleV07XG4gICAgfVxuXG4gICAgbGV0IHNoYWRlciA9IGdsLmNyZWF0ZVNoYWRlcihzdHlwZSk7XG5cbiAgICBnbC5zaGFkZXJTb3VyY2Uoc2hhZGVyLCBzb3VyY2UpO1xuICAgIGdsLmNvbXBpbGVTaGFkZXIoc2hhZGVyKTtcblxuICAgIGlmICghZ2wuZ2V0U2hhZGVyUGFyYW1ldGVyKHNoYWRlciwgZ2wuQ09NUElMRV9TVEFUVVMpKSB7XG4gICAgICAgIGxldCB0eXBlID0gKHN0eXBlID09PSBnbC5WRVJURVhfU0hBREVSID8gJ3ZlcnRleCcgOiAnZnJhZ21lbnQnKTtcbiAgICAgICAgbGV0IG1lc3NhZ2UgPSBnbC5nZXRTaGFkZXJJbmZvTG9nKHNoYWRlcik7XG4gICAgICAgIGxldCBlcnJvcnMgPSBwYXJzZVNoYWRlckVycm9ycyhtZXNzYWdlKTtcbiAgICAgICAgdGhyb3cgeyB0eXBlLCBtZXNzYWdlLCBlcnJvcnMgfTtcbiAgICB9XG5cbiAgICBTaGFkZXJQcm9ncmFtLnNoYWRlcnNfYnlfc291cmNlW2tleV0gPSBzaGFkZXI7IC8vIGNhY2hlIGJ5IGV4YWN0IHNvdXJjZVxuICAgIHJldHVybiBzaGFkZXI7XG59O1xuIiwiLy8gVGV4dHVyZSBtYW5hZ2VtZW50XG5pbXBvcnQgbG9nIGZyb20gJy4uL3V0aWxzL2xvZyc7XG5pbXBvcnQgVXRpbHMgZnJvbSAnLi4vdXRpbHMvdXRpbHMnO1xuaW1wb3J0IHN1YnNjcmliZU1peGluIGZyb20gJy4uL3V0aWxzL3N1YnNjcmliZSc7XG5pbXBvcnQgV29ya2VyQnJva2VyIGZyb20gJy4uL3V0aWxzL3dvcmtlcl9icm9rZXInO1xuXG4vLyBHTCB0ZXh0dXJlIHdyYXBwZXIgb2JqZWN0IGZvciBrZWVwaW5nIHRyYWNrIG9mIGEgZ2xvYmFsIHNldCBvZiB0ZXh0dXJlcywga2V5ZWQgYnkgYSB1bmlxdWUgdXNlci1kZWZpbmVkIG5hbWVcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFRleHR1cmUge1xuXG4gICAgY29uc3RydWN0b3IoZ2wsIG5hbWUsIG9wdGlvbnMgPSB7fSkge1xuICAgICAgICB0aGlzLmdsID0gZ2w7XG4gICAgICAgIHRoaXMudGV4dHVyZSA9IGdsLmNyZWF0ZVRleHR1cmUoKTtcbiAgICAgICAgaWYgKHRoaXMudGV4dHVyZSkge1xuICAgICAgICAgICAgdGhpcy52YWxpZCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5iaW5kKCk7XG5cbiAgICAgICAgdGhpcy5uYW1lID0gbmFtZTtcbiAgICAgICAgdGhpcy5yZXRhaW5fY291bnQgPSAwO1xuICAgICAgICB0aGlzLnNvdXJjZSA9IG51bGw7XG4gICAgICAgIHRoaXMuc291cmNlX3R5cGUgPSBudWxsO1xuICAgICAgICB0aGlzLmNvbmZpZ190eXBlID0gbnVsbDtcbiAgICAgICAgdGhpcy5sb2FkaW5nID0gbnVsbDsgICAgLy8gYSBQcm9taXNlIG9iamVjdCB0byB0cmFjayB0aGUgbG9hZGluZyBzdGF0ZSBvZiB0aGlzIHRleHR1cmVcbiAgICAgICAgdGhpcy5sb2FkZWQgPSBmYWxzZTsgICAgLy8gc3VjY2Vzc2Z1bGx5IGxvYWRlZCBhcyBleHBlY3RlZFxuICAgICAgICB0aGlzLmZpbHRlcmluZyA9IG9wdGlvbnMuZmlsdGVyaW5nO1xuICAgICAgICB0aGlzLnNwcml0ZXMgPSBvcHRpb25zLnNwcml0ZXM7XG4gICAgICAgIHRoaXMudGV4Y29vcmRzID0ge307ICAgIC8vIHNwcml0ZSBVVnMgKFswLCAxXSByYW5nZSlcbiAgICAgICAgdGhpcy5zaXplcyA9IHt9OyAgICAgICAgLy8gc3ByaXRlIHNpemVzIChwaXhlbCBzaXplKVxuXG4gICAgICAgIC8vIERlZmF1bHQgdG8gYSAxLXBpeGVsIGJsYWNrIHRleHR1cmUgc28gd2UgY2FuIHNhZmVseSByZW5kZXIgd2hpbGUgd2Ugd2FpdCBmb3IgYW4gaW1hZ2UgdG8gbG9hZFxuICAgICAgICAvLyBTZWU6IGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvMTk3MjIyNDcvd2ViZ2wtd2FpdC1mb3ItdGV4dHVyZS10by1sb2FkXG4gICAgICAgIHRoaXMuc2V0RGF0YSgxLCAxLCBuZXcgVWludDhBcnJheShbMCwgMCwgMCwgMjU1XSksIHsgZmlsdGVyaW5nOiAnbmVhcmVzdCcgfSk7XG5cbiAgICAgICAgLy8gRGVzdHJveSBwcmV2aW91cyB0ZXh0dXJlIGlmIHByZXNlbnRcbiAgICAgICAgaWYgKFRleHR1cmUudGV4dHVyZXNbdGhpcy5uYW1lXSkge1xuICAgICAgICAgICAgLy8gUHJlc2VydmUgcHJldmlvdXMgcmV0YWluIGNvdW50XG4gICAgICAgICAgICB0aGlzLnJldGFpbl9jb3VudCA9IFRleHR1cmUudGV4dHVyZXNbdGhpcy5uYW1lXS5yZXRhaW5fY291bnQ7XG4gICAgICAgICAgICBUZXh0dXJlLnRleHR1cmVzW3RoaXMubmFtZV0ucmV0YWluX2NvdW50ID0gMDsgLy8gYWxsb3cgdG8gYmUgZnJlZWRcbiAgICAgICAgICAgIFRleHR1cmUudGV4dHVyZXNbdGhpcy5uYW1lXS5kZXN0cm95KCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDYWNoZSB0ZXh0dXJlIGluc3RhbmNlIGFuZCBkZWZpbml0aW9uXG4gICAgICAgIFRleHR1cmUudGV4dHVyZXNbdGhpcy5uYW1lXSA9IHRoaXM7XG4gICAgICAgIFRleHR1cmUudGV4dHVyZV9jb25maWdzW3RoaXMubmFtZV0gPSBPYmplY3QuYXNzaWduKHsgbmFtZSB9LCBvcHRpb25zKTtcblxuICAgICAgICB0aGlzLmxvYWQob3B0aW9ucyk7XG4gICAgICAgIGxvZygndHJhY2UnLCBgY3JlYXRpbmcgVGV4dHVyZSAke3RoaXMubmFtZX1gKTtcbiAgICB9XG5cbiAgICAvLyBEZXN0cm95IGEgc2luZ2xlIHRleHR1cmUgaW5zdGFuY2VcbiAgICBkZXN0cm95KHsgZm9yY2UgfSA9IHt9KSB7XG4gICAgICAgIGlmICh0aGlzLnJldGFpbl9jb3VudCA+IDAgJiYgIWZvcmNlKSB7XG4gICAgICAgICAgICBsb2coJ2Vycm9yJywgYFRleHR1cmUgJyR7dGhpcy5uYW1lfSc6IGRlc3Ryb3lpbmcgdGV4dHVyZSB3aXRoIHJldGFpbiBjb3VudCBvZiAnJHt0aGlzLnJldGFpbl9jb3VudH0nYCk7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXRoaXMudmFsaWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmdsLmRlbGV0ZVRleHR1cmUodGhpcy50ZXh0dXJlKTtcbiAgICAgICAgdGhpcy50ZXh0dXJlID0gbnVsbDtcbiAgICAgICAgZGVsZXRlIHRoaXMuZGF0YTtcbiAgICAgICAgdGhpcy5kYXRhID0gbnVsbDtcbiAgICAgICAgZGVsZXRlIFRleHR1cmUudGV4dHVyZXNbdGhpcy5uYW1lXTtcbiAgICAgICAgdGhpcy52YWxpZCA9IGZhbHNlO1xuICAgICAgICBsb2coJ3RyYWNlJywgYGRlc3Ryb3lpbmcgVGV4dHVyZSAke3RoaXMubmFtZX1gKTtcbiAgICB9XG5cbiAgICByZXRhaW4gKCkge1xuICAgICAgICB0aGlzLnJldGFpbl9jb3VudCsrO1xuICAgIH1cblxuICAgIHJlbGVhc2UgKCkge1xuICAgICAgICBpZiAodGhpcy5yZXRhaW5fY291bnQgPD0gMCkge1xuICAgICAgICAgICAgbG9nKCdlcnJvcicsIGBUZXh0dXJlICcke3RoaXMubmFtZX0nOiByZWxlYXNpbmcgdGV4dHVyZSB3aXRoIHJldGFpbiBjb3VudCBvZiAnJHt0aGlzLnJldGFpbl9jb3VudH0nYCk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnJldGFpbl9jb3VudC0tO1xuICAgICAgICBpZiAodGhpcy5yZXRhaW5fY291bnQgPD0gMCkge1xuICAgICAgICAgICAgdGhpcy5kZXN0cm95KCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBiaW5kKHVuaXQgPSAwKSB7XG4gICAgICAgIGlmICghdGhpcy52YWxpZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKFRleHR1cmUuYWN0aXZlVW5pdCAhPT0gdW5pdCkge1xuICAgICAgICAgICAgdGhpcy5nbC5hY3RpdmVUZXh0dXJlKHRoaXMuZ2wuVEVYVFVSRTAgKyB1bml0KTtcbiAgICAgICAgICAgIFRleHR1cmUuYWN0aXZlVW5pdCA9IHVuaXQ7XG4gICAgICAgICAgICBUZXh0dXJlLmJvdW5kVGV4dHVyZSA9IG51bGw7IC8vIHRleHR1cmUgbXVzdCBiZSByZS1ib3VuZCB3aGVuIHVuaXQgY2hhbmdlc1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKFRleHR1cmUuYm91bmRUZXh0dXJlICE9PSB0aGlzLnRleHR1cmUpIHtcbiAgICAgICAgICAgIHRoaXMuZ2wuYmluZFRleHR1cmUodGhpcy5nbC5URVhUVVJFXzJELCB0aGlzLnRleHR1cmUpO1xuICAgICAgICAgICAgVGV4dHVyZS5ib3VuZFRleHR1cmUgPSB0aGlzLnRleHR1cmU7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBsb2FkKG9wdGlvbnMpIHtcbiAgICAgICAgaWYgKCFvcHRpb25zKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5sb2FkaW5nIHx8IFByb21pc2UucmVzb2x2ZSh0aGlzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMubG9hZGluZyA9IG51bGw7XG4gICAgICAgIGlmICh0eXBlb2Ygb3B0aW9ucy51cmwgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICB0aGlzLmNvbmZpZ190eXBlID0gJ3VybCc7XG4gICAgICAgICAgICB0aGlzLnNldFVybChvcHRpb25zLnVybCwgb3B0aW9ucyk7XG4gICAgICAgIH0gZWxzZSBpZiAob3B0aW9ucy5lbGVtZW50KSB7XG4gICAgICAgICAgICB0aGlzLmNvbmZpZ190eXBlID0gJ2VsZW1lbnQnO1xuICAgICAgICAgICAgdGhpcy5zZXRFbGVtZW50KG9wdGlvbnMuZWxlbWVudCwgb3B0aW9ucyk7XG4gICAgICAgIH0gZWxzZSBpZiAob3B0aW9ucy5kYXRhICYmIG9wdGlvbnMud2lkdGggJiYgb3B0aW9ucy5oZWlnaHQpIHtcbiAgICAgICAgICAgIHRoaXMuY29uZmlnX3R5cGUgPSAnZGF0YSc7XG4gICAgICAgICAgICB0aGlzLnNldERhdGEob3B0aW9ucy53aWR0aCwgb3B0aW9ucy5oZWlnaHQsIG9wdGlvbnMuZGF0YSwgb3B0aW9ucyk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmxvYWRpbmcgPVxuICAgICAgICAgICAgKHRoaXMubG9hZGluZyAmJiB0aGlzLmxvYWRpbmcudGhlbigoKSA9PiB7IHRoaXMuY2FsY3VsYXRlU3ByaXRlcygpOyByZXR1cm4gdGhpczsgfSkpIHx8XG4gICAgICAgICAgICBQcm9taXNlLnJlc29sdmUodGhpcyk7XG4gICAgICAgIHJldHVybiB0aGlzLmxvYWRpbmc7XG4gICAgfVxuXG4gICAgLy8gU2V0cyB0ZXh0dXJlIGZyb20gYW4gdXJsXG4gICAgc2V0VXJsKHVybCwgb3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIGlmICghdGhpcy52YWxpZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy51cmwgPSB1cmw7IC8vIHNhdmUgVVJMIHJlZmVyZW5jZSAod2lsbCBiZSBvdmVyd3JpdHRlbiB3aGVuIGVsZW1lbnQgaXMgbG9hZGVkIGJlbG93KVxuICAgICAgICB0aGlzLnNvdXJjZSA9IHRoaXMudXJsO1xuICAgICAgICB0aGlzLnNvdXJjZV90eXBlID0gJ3VybCc7XG5cbiAgICAgICAgdGhpcy5sb2FkaW5nID0gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgbGV0IGltYWdlID0gbmV3IEltYWdlKCk7XG4gICAgICAgICAgICBpbWFnZS5vbmxvYWQgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zZXRFbGVtZW50KGltYWdlLCBvcHRpb25zKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5sb2FkZWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgbG9nKCd3YXJuJywgYFRleHR1cmUgJyR7dGhpcy5uYW1lfSc6IGZhaWxlZCB0byBsb2FkIHVybDogJyR7dGhpcy5zb3VyY2V9J2AsIGUsIG9wdGlvbnMpO1xuICAgICAgICAgICAgICAgICAgICBUZXh0dXJlLnRyaWdnZXIoJ3dhcm5pbmcnLCB7IG1lc3NhZ2U6IGBGYWlsZWQgdG8gbG9hZCB0ZXh0dXJlIGZyb20gJHt0aGlzLnNvdXJjZX1gLCBlcnJvcjogZSwgdGV4dHVyZTogb3B0aW9ucyB9KTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICB0aGlzLmxvYWRlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgcmVzb2x2ZSh0aGlzKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBpbWFnZS5vbmVycm9yID0gZSA9PiB7XG4gICAgICAgICAgICAgICAgLy8gV2FybiBhbmQgcmVzb2x2ZSBvbiBlcnJvclxuICAgICAgICAgICAgICAgIHRoaXMubG9hZGVkID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgbG9nKCd3YXJuJywgYFRleHR1cmUgJyR7dGhpcy5uYW1lfSc6IGZhaWxlZCB0byBsb2FkIHVybDogJyR7dGhpcy5zb3VyY2V9J2AsIGUsIG9wdGlvbnMpO1xuICAgICAgICAgICAgICAgIFRleHR1cmUudHJpZ2dlcignd2FybmluZycsIHsgbWVzc2FnZTogYEZhaWxlZCB0byBsb2FkIHRleHR1cmUgZnJvbSAke3RoaXMuc291cmNlfWAsIGVycm9yOiBlLCB0ZXh0dXJlOiBvcHRpb25zIH0pO1xuICAgICAgICAgICAgICAgIHJlc29sdmUodGhpcyk7XG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAvLyBTYWZhcmkgaGFzIGEgYnVnIGxvYWRpbmcgZGF0YS1VUkwgaW1hZ2VzIHdpdGggQ09SUyBlbmFibGVkLCBzbyBpdCBtdXN0IGJlIGRpc2FibGVkIGluIHRoYXQgY2FzZVxuICAgICAgICAgICAgLy8gaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTEyMzk3OFxuICAgICAgICAgICAgaWYgKCEoVXRpbHMuaXNTYWZhcmkoKSAmJiB0aGlzLnNvdXJjZS5zbGljZSgwLCA1KSA9PT0gJ2RhdGE6JykpIHtcbiAgICAgICAgICAgICAgICBpbWFnZS5jcm9zc09yaWdpbiA9ICdhbm9ueW1vdXMnO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpbWFnZS5zcmMgPSB0aGlzLnNvdXJjZTtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB0aGlzLmxvYWRpbmc7XG4gICAgfVxuXG4gICAgLy8gU2V0cyB0ZXh0dXJlIHRvIGEgcmF3IGltYWdlIGJ1ZmZlclxuICAgIHNldERhdGEod2lkdGgsIGhlaWdodCwgZGF0YSwgb3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIHRoaXMud2lkdGggPSB3aWR0aDtcbiAgICAgICAgdGhpcy5oZWlnaHQgPSBoZWlnaHQ7XG5cbiAgICAgICAgdGhpcy5zb3VyY2UgPSBkYXRhO1xuICAgICAgICB0aGlzLnNvdXJjZV90eXBlID0gJ2RhdGEnO1xuXG4gICAgICAgIC8vIENvbnZlcnQgcmVndWxhciBhcnJheSB0byB0eXBlZCBhcnJheVxuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh0aGlzLnNvdXJjZSkpIHtcbiAgICAgICAgICAgIHRoaXMuc291cmNlID0gbmV3IFVpbnQ4QXJyYXkodGhpcy5zb3VyY2UpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy51cGRhdGUob3B0aW9ucyk7XG4gICAgICAgIHRoaXMuc2V0RmlsdGVyaW5nKG9wdGlvbnMpO1xuXG4gICAgICAgIHRoaXMubG9hZGVkID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5sb2FkaW5nID0gUHJvbWlzZS5yZXNvbHZlKHRoaXMpO1xuICAgICAgICByZXR1cm4gdGhpcy5sb2FkaW5nO1xuICAgIH1cblxuICAgIC8vIFNldHMgdGhlIHRleHR1cmUgdG8gdHJhY2sgYSBlbGVtZW50IChjYW52YXMvaW1hZ2UpXG4gICAgc2V0RWxlbWVudChlbGVtZW50LCBvcHRpb25zKSB7XG4gICAgICAgIGxldCBlbCA9IGVsZW1lbnQ7XG5cbiAgICAgICAgLy8gYSBzdHJpbmcgZWxlbWVudCBpcyBpbnRlcnBldGVkIGFzIGEgQ1NTIHNlbGVjdG9yXG4gICAgICAgIGlmICh0eXBlb2YgZWxlbWVudCA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIGVsZW1lbnQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKGVsZW1lbnQpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGVsZW1lbnQgaW5zdGFuY2VvZiBIVE1MQ2FudmFzRWxlbWVudCB8fFxuICAgICAgICAgICAgZWxlbWVudCBpbnN0YW5jZW9mIEhUTUxJbWFnZUVsZW1lbnQgfHxcbiAgICAgICAgICAgIGVsZW1lbnQgaW5zdGFuY2VvZiBIVE1MVmlkZW9FbGVtZW50KSB7XG4gICAgICAgICAgICB0aGlzLnNvdXJjZSA9IGVsZW1lbnQ7XG4gICAgICAgICAgICB0aGlzLnNvdXJjZV90eXBlID0gJ2VsZW1lbnQnO1xuXG4gICAgICAgICAgICB0aGlzLnVwZGF0ZShvcHRpb25zKTtcbiAgICAgICAgICAgIHRoaXMuc2V0RmlsdGVyaW5nKG9wdGlvbnMpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5sb2FkZWQgPSBmYWxzZTtcbiAgICAgICAgICAgIGxldCBtc2cgPSBgdGhlICdlbGVtZW50JyBwYXJhbWV0ZXIgKFxcYGVsZW1lbnQ6ICR7SlNPTi5zdHJpbmdpZnkoZWwpfVxcYCkgbXVzdCBiZSBhIENTUyBgO1xuICAgICAgICAgICAgbXNnICs9IGBzZWxlY3RvciBzdHJpbmcsIG9yIGEgPGNhbnZhcz4sIDxpbWFnZT4gb3IgPHZpZGVvPiBvYmplY3RgO1xuICAgICAgICAgICAgbG9nKCd3YXJuJywgYFRleHR1cmUgJyR7dGhpcy5uYW1lfSc6ICR7bXNnfWAsIG9wdGlvbnMpO1xuICAgICAgICAgICAgVGV4dHVyZS50cmlnZ2VyKCd3YXJuaW5nJywgeyBtZXNzYWdlOiBgRmFpbGVkIHRvIGxvYWQgdGV4dHVyZSBiZWNhdXNlICR7bXNnfWAsIHRleHR1cmU6IG9wdGlvbnMgfSk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmxvYWRlZCA9IHRydWU7XG4gICAgICAgIHRoaXMubG9hZGluZyA9IFByb21pc2UucmVzb2x2ZSh0aGlzKTtcbiAgICAgICAgcmV0dXJuIHRoaXMubG9hZGluZztcbiAgICB9XG5cbiAgICAvLyBVcGxvYWRzIGN1cnJlbnQgaW1hZ2Ugb3IgYnVmZmVyIHRvIHRoZSBHUFUgKGNhbiBiZSB1c2VkIHRvIHVwZGF0ZSBhbmltYXRlZCB0ZXh0dXJlcyBvbiB0aGUgZmx5KVxuICAgIHVwZGF0ZShvcHRpb25zID0ge30pIHtcbiAgICAgICAgaWYgKCF0aGlzLnZhbGlkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmJpbmQoKTtcbiAgICAgICAgdGhpcy5nbC5waXhlbFN0b3JlaSh0aGlzLmdsLlVOUEFDS19GTElQX1lfV0VCR0wsIChvcHRpb25zLlVOUEFDS19GTElQX1lfV0VCR0wgPT09IGZhbHNlID8gZmFsc2UgOiB0cnVlKSk7XG4gICAgICAgIHRoaXMuZ2wucGl4ZWxTdG9yZWkodGhpcy5nbC5VTlBBQ0tfUFJFTVVMVElQTFlfQUxQSEFfV0VCR0wsIG9wdGlvbnMuVU5QQUNLX1BSRU1VTFRJUExZX0FMUEhBX1dFQkdMIHx8IGZhbHNlKTtcblxuICAgICAgICAvLyBJbWFnZSBvciBDYW52YXMgZWxlbWVudFxuICAgICAgICBpZiAodGhpcy5zb3VyY2UgaW5zdGFuY2VvZiBIVE1MQ2FudmFzRWxlbWVudCB8fCB0aGlzLnNvdXJjZSBpbnN0YW5jZW9mIEhUTUxWaWRlb0VsZW1lbnQgfHxcbiAgICAgICAgICAgICh0aGlzLnNvdXJjZSBpbnN0YW5jZW9mIEhUTUxJbWFnZUVsZW1lbnQgJiYgdGhpcy5zb3VyY2UuY29tcGxldGUpKSB7XG5cbiAgICAgICAgICAgIHRoaXMud2lkdGggPSB0aGlzLnNvdXJjZS53aWR0aDtcbiAgICAgICAgICAgIHRoaXMuaGVpZ2h0ID0gdGhpcy5zb3VyY2UuaGVpZ2h0O1xuICAgICAgICAgICAgdGhpcy5nbC50ZXhJbWFnZTJEKHRoaXMuZ2wuVEVYVFVSRV8yRCwgMCwgdGhpcy5nbC5SR0JBLCB0aGlzLmdsLlJHQkEsIHRoaXMuZ2wuVU5TSUdORURfQllURSwgdGhpcy5zb3VyY2UpO1xuICAgICAgICB9XG4gICAgICAgIC8vIFJhdyBpbWFnZSBidWZmZXJcbiAgICAgICAgZWxzZSBpZiAodGhpcy5zb3VyY2VfdHlwZSA9PT0gJ2RhdGEnKSB7XG4gICAgICAgICAgICB0aGlzLmdsLnRleEltYWdlMkQodGhpcy5nbC5URVhUVVJFXzJELCAwLCB0aGlzLmdsLlJHQkEsIHRoaXMud2lkdGgsIHRoaXMuaGVpZ2h0LCAwLCB0aGlzLmdsLlJHQkEsIHRoaXMuZ2wuVU5TSUdORURfQllURSwgdGhpcy5zb3VyY2UpO1xuICAgICAgICB9XG5cbiAgICAgICAgVGV4dHVyZS50cmlnZ2VyKCd1cGRhdGUnLCB0aGlzKTtcbiAgICB9XG5cbiAgICAvLyBEZXRlcm1pbmVzIGFwcHJvcHJpYXRlIGZpbHRlcmluZyBtb2RlXG4gICAgc2V0RmlsdGVyaW5nKG9wdGlvbnMgPSB7fSkge1xuICAgICAgICBpZiAoIXRoaXMudmFsaWQpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIG9wdGlvbnMuZmlsdGVyaW5nID0gb3B0aW9ucy5maWx0ZXJpbmcgfHwgJ2xpbmVhcic7XG5cbiAgICAgICAgdmFyIGdsID0gdGhpcy5nbDtcbiAgICAgICAgdGhpcy5iaW5kKCk7XG5cbiAgICAgICAgLy8gRm9yIHBvd2VyLW9mLTIgdGV4dHVyZXMsIHRoZSBmb2xsb3dpbmcgcHJlc2V0cyBhcmUgYXZhaWxhYmxlOlxuICAgICAgICAvLyBtaXBtYXA6IGxpbmVhciBibGVuZCBmcm9tIG5lYXJlc3QgbWlwXG4gICAgICAgIC8vIGxpbmVhcjogbGluZWFyIGJsZW5kIGZyb20gb3JpZ2luYWwgaW1hZ2UgKG5vIG1pcHMpXG4gICAgICAgIC8vIG5lYXJlc3Q6IG5lYXJlc3QgcGl4ZWwgZnJvbSBvcmlnaW5hbCBpbWFnZSAobm8gbWlwcywgJ2Jsb2NreScgbG9vaylcbiAgICAgICAgaWYgKFV0aWxzLmlzUG93ZXJPZjIodGhpcy53aWR0aCkgJiYgVXRpbHMuaXNQb3dlck9mMih0aGlzLmhlaWdodCkpIHtcbiAgICAgICAgICAgIHRoaXMucG93ZXJfb2ZfMiA9IHRydWU7XG4gICAgICAgICAgICBnbC50ZXhQYXJhbWV0ZXJpKGdsLlRFWFRVUkVfMkQsIGdsLlRFWFRVUkVfV1JBUF9TLCBvcHRpb25zLlRFWFRVUkVfV1JBUF9TIHx8IChvcHRpb25zLnJlcGVhdCAmJiBnbC5SRVBFQVQpIHx8IGdsLkNMQU1QX1RPX0VER0UpO1xuICAgICAgICAgICAgZ2wudGV4UGFyYW1ldGVyaShnbC5URVhUVVJFXzJELCBnbC5URVhUVVJFX1dSQVBfVCwgb3B0aW9ucy5URVhUVVJFX1dSQVBfVCB8fCAob3B0aW9ucy5yZXBlYXQgJiYgZ2wuUkVQRUFUKSB8fCBnbC5DTEFNUF9UT19FREdFKTtcblxuICAgICAgICAgICAgaWYgKG9wdGlvbnMuZmlsdGVyaW5nID09PSAnbWlwbWFwJykge1xuICAgICAgICAgICAgICAgIHRoaXMuZmlsdGVyaW5nID0gJ21pcG1hcCc7XG4gICAgICAgICAgICAgICAgZ2wudGV4UGFyYW1ldGVyaShnbC5URVhUVVJFXzJELCBnbC5URVhUVVJFX01JTl9GSUxURVIsIGdsLkxJTkVBUl9NSVBNQVBfTElORUFSKTsgLy8gVE9ETzogdXNlIHRyaWxpbmVhciBmaWx0ZXJpbmcgYnkgZGVmdWFsdCBpbnN0ZWFkP1xuICAgICAgICAgICAgICAgIGdsLnRleFBhcmFtZXRlcmkoZ2wuVEVYVFVSRV8yRCwgZ2wuVEVYVFVSRV9NQUdfRklMVEVSLCBnbC5MSU5FQVIpO1xuICAgICAgICAgICAgICAgIGdsLmdlbmVyYXRlTWlwbWFwKGdsLlRFWFRVUkVfMkQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAob3B0aW9ucy5maWx0ZXJpbmcgPT09ICdsaW5lYXInKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5maWx0ZXJpbmcgPSAnbGluZWFyJztcbiAgICAgICAgICAgICAgICBnbC50ZXhQYXJhbWV0ZXJpKGdsLlRFWFRVUkVfMkQsIGdsLlRFWFRVUkVfTUlOX0ZJTFRFUiwgZ2wuTElORUFSKTtcbiAgICAgICAgICAgICAgICBnbC50ZXhQYXJhbWV0ZXJpKGdsLlRFWFRVUkVfMkQsIGdsLlRFWFRVUkVfTUFHX0ZJTFRFUiwgZ2wuTElORUFSKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKG9wdGlvbnMuZmlsdGVyaW5nID09PSAnbmVhcmVzdCcpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmZpbHRlcmluZyA9ICduZWFyZXN0JztcbiAgICAgICAgICAgICAgICBnbC50ZXhQYXJhbWV0ZXJpKGdsLlRFWFRVUkVfMkQsIGdsLlRFWFRVUkVfTUlOX0ZJTFRFUiwgZ2wuTkVBUkVTVCk7XG4gICAgICAgICAgICAgICAgZ2wudGV4UGFyYW1ldGVyaShnbC5URVhUVVJFXzJELCBnbC5URVhUVVJFX01BR19GSUxURVIsIGdsLk5FQVJFU1QpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgLy8gV2ViR0wgaGFzIHN0cmljdCByZXF1aXJlbWVudHMgb24gbm9uLXBvd2VyLW9mLTIgdGV4dHVyZXM6XG4gICAgICAgICAgICAvLyBObyBtaXBtYXBzIGFuZCBtdXN0IGNsYW1wIHRvIGVkZ2VcbiAgICAgICAgICAgIHRoaXMucG93ZXJfb2ZfMiA9IGZhbHNlO1xuICAgICAgICAgICAgZ2wudGV4UGFyYW1ldGVyaShnbC5URVhUVVJFXzJELCBnbC5URVhUVVJFX1dSQVBfUywgZ2wuQ0xBTVBfVE9fRURHRSk7XG4gICAgICAgICAgICBnbC50ZXhQYXJhbWV0ZXJpKGdsLlRFWFRVUkVfMkQsIGdsLlRFWFRVUkVfV1JBUF9ULCBnbC5DTEFNUF9UT19FREdFKTtcblxuICAgICAgICAgICAgaWYgKG9wdGlvbnMuZmlsdGVyaW5nID09PSAnbmVhcmVzdCcpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmZpbHRlcmluZyA9ICduZWFyZXN0JztcbiAgICAgICAgICAgICAgICBnbC50ZXhQYXJhbWV0ZXJpKGdsLlRFWFRVUkVfMkQsIGdsLlRFWFRVUkVfTUlOX0ZJTFRFUiwgZ2wuTkVBUkVTVCk7XG4gICAgICAgICAgICAgICAgZ2wudGV4UGFyYW1ldGVyaShnbC5URVhUVVJFXzJELCBnbC5URVhUVVJFX01BR19GSUxURVIsIGdsLk5FQVJFU1QpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7IC8vIGRlZmF1bHQgdG8gbGluZWFyIGZvciBub24tcG93ZXItb2YtMiB0ZXh0dXJlc1xuICAgICAgICAgICAgICAgIHRoaXMuZmlsdGVyaW5nID0gJ2xpbmVhcic7XG4gICAgICAgICAgICAgICAgZ2wudGV4UGFyYW1ldGVyaShnbC5URVhUVVJFXzJELCBnbC5URVhUVVJFX01JTl9GSUxURVIsIGdsLkxJTkVBUik7XG4gICAgICAgICAgICAgICAgZ2wudGV4UGFyYW1ldGVyaShnbC5URVhUVVJFXzJELCBnbC5URVhUVVJFX01BR19GSUxURVIsIGdsLkxJTkVBUik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBUZXh0dXJlLnRyaWdnZXIoJ3VwZGF0ZScsIHRoaXMpO1xuICAgIH1cblxuICAgIC8vIFByZS1jYWxjIHNwcml0ZSByZWdpb25zIGZvciBhIHRleHR1cmUgc3ByaXRlIGluIFVWIFswLCAxXSBzcGFjZVxuICAgIGNhbGN1bGF0ZVNwcml0ZXMoKSB7XG4gICAgICAgIGlmICh0aGlzLnNwcml0ZXMpIHtcbiAgICAgICAgICAgIGZvciAobGV0IHMgaW4gdGhpcy5zcHJpdGVzKSB7XG4gICAgICAgICAgICAgICAgbGV0IHNwcml0ZSA9IHRoaXMuc3ByaXRlc1tzXTtcblxuICAgICAgICAgICAgICAgIC8vIE1hcCBbMCwgMF0gdG8gWzEsIDFdIGNvb3JkcyB0byB0aGUgYXBwcm9wcmlhdGUgc3ByaXRlIHN1Yi1hcmVhIG9mIHRoZSB0ZXh0dXJlXG4gICAgICAgICAgICAgICAgdGhpcy50ZXhjb29yZHNbc10gPSBUZXh0dXJlLmdldFRleGNvb3Jkc0ZvclNwcml0ZShcbiAgICAgICAgICAgICAgICAgICAgW3Nwcml0ZVswXSwgc3ByaXRlWzFdXSxcbiAgICAgICAgICAgICAgICAgICAgW3Nwcml0ZVsyXSwgc3ByaXRlWzNdXSxcbiAgICAgICAgICAgICAgICAgICAgW3RoaXMud2lkdGgsIHRoaXMuaGVpZ2h0XVxuICAgICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgICAgICAvLyBQaXhlbCBzaXplIG9mIHNwcml0ZVxuICAgICAgICAgICAgICAgIHRoaXMuc2l6ZXNbc10gPSBbc3ByaXRlWzJdLCBzcHJpdGVbM11dO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG59XG5cblxuLy8gU3RhdGljL2NsYXNzIG1ldGhvZHMgYW5kIHN0YXRlXG5cblRleHR1cmUuY3JlYXRlID0gZnVuY3Rpb24gKGdsLCBuYW1lLCBvcHRpb25zKSB7XG4gICAgcmV0dXJuIG5ldyBUZXh0dXJlKGdsLCBuYW1lLCBvcHRpb25zKTtcbn07XG5cblRleHR1cmUucmV0YWluID0gZnVuY3Rpb24gKG5hbWUpIHtcbiAgICBpZiAoVGV4dHVyZS50ZXh0dXJlc1tuYW1lXSkge1xuICAgICAgICBUZXh0dXJlLnRleHR1cmVzW25hbWVdLnJldGFpbigpO1xuICAgIH1cbn07XG5cblRleHR1cmUucmVsZWFzZSA9IGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgaWYgKFRleHR1cmUudGV4dHVyZXNbbmFtZV0pIHtcbiAgICAgICAgVGV4dHVyZS50ZXh0dXJlc1tuYW1lXS5yZWxlYXNlKCk7XG4gICAgfVxufTtcblxuLy8gRGVzdHJveSBhbGwgdGV4dHVyZSBpbnN0YW5jZXMgZm9yIGEgZ2l2ZW4gR0wgY29udGV4dFxuVGV4dHVyZS5kZXN0cm95ID0gZnVuY3Rpb24gKGdsKSB7XG4gICAgdmFyIHRleHR1cmVzID0gT2JqZWN0LmtleXMoVGV4dHVyZS50ZXh0dXJlcyk7XG4gICAgdGV4dHVyZXMuZm9yRWFjaCh0ID0+IHtcbiAgICAgICAgdmFyIHRleHR1cmUgPSBUZXh0dXJlLnRleHR1cmVzW3RdO1xuICAgICAgICBpZiAodGV4dHVyZS5nbCA9PT0gZ2wpIHtcbiAgICAgICAgICAgIHRleHR1cmUuZGVzdHJveSh7IGZvcmNlOiB0cnVlIH0pO1xuICAgICAgICB9XG4gICAgfSk7XG59O1xuXG4vLyBHZXQgc3ByaXRlIHBpeGVsIHNpemUgYW5kIFVWc1xuVGV4dHVyZS5nZXRTcHJpdGVJbmZvID0gZnVuY3Rpb24gKHRleG5hbWUsIHNwcml0ZSkge1xuICAgIGxldCB0ZXh0dXJlID0gVGV4dHVyZS50ZXh0dXJlc1t0ZXhuYW1lXTtcbiAgICByZXR1cm4gdGV4dHVyZSAmJiB7IHNpemU6IHRleHR1cmUuc2l6ZXNbc3ByaXRlXSwgdGV4Y29vcmRzOiB0ZXh0dXJlLnRleGNvb3Jkc1tzcHJpdGVdIH07XG59O1xuXG4vLyBSZS1zY2FsZSBVVnMgZnJvbSBbMCwgMV0gcmFuZ2UgdG8gYSBzbWFsbGVyIGFyZWEgd2l0aGluIHRoZSBpbWFnZVxuVGV4dHVyZS5nZXRUZXhjb29yZHNGb3JTcHJpdGUgPSBmdW5jdGlvbiAoYXJlYV9vcmlnaW4sIGFyZWFfc2l6ZSwgdGV4X3NpemUpIHtcbiAgICB2YXIgYXJlYV9vcmlnaW5feSA9IHRleF9zaXplWzFdIC0gYXJlYV9vcmlnaW5bMV0gLSBhcmVhX3NpemVbMV07XG5cbiAgICByZXR1cm4gW1xuICAgICAgICBhcmVhX29yaWdpblswXSAvIHRleF9zaXplWzBdLFxuICAgICAgICBhcmVhX29yaWdpbl95IC8gdGV4X3NpemVbMV0sXG4gICAgICAgIChhcmVhX3NpemVbMF0gKyBhcmVhX29yaWdpblswXSkgLyB0ZXhfc2l6ZVswXSxcbiAgICAgICAgKGFyZWFfc2l6ZVsxXSArIGFyZWFfb3JpZ2luX3kpIC8gdGV4X3NpemVbMV1cbiAgICBdO1xufTtcblxuLy8gQ3JlYXRlIGEgc2V0IG9mIHRleHR1cmVzIGtleWVkIGluIGFuIG9iamVjdFxuLy8gT3B0aW9uYWxseSBsb2FkIGVhY2ggaWYgaXQgaGFzIGEgVVJMIHNwZWNpZmllZFxuVGV4dHVyZS5jcmVhdGVGcm9tT2JqZWN0ID0gZnVuY3Rpb24gKGdsLCB0ZXh0dXJlcykge1xuICAgIGxldCBsb2FkaW5nID0gW107XG4gICAgaWYgKHRleHR1cmVzKSB7XG4gICAgICAgIGZvciAobGV0IHRleG5hbWUgaW4gdGV4dHVyZXMpIHtcbiAgICAgICAgICAgIGxldCBjb25maWcgPSB0ZXh0dXJlc1t0ZXhuYW1lXTtcblxuICAgICAgICAgICAgLy8gSWYgdGV4dHVyZSBhbHJlYWR5IGV4aXN0cyBhbmQgZGVmaW5pdGlvbiBoYXNuJ3QgY2hhbmdlZCwgbm8gbmVlZCB0byByZS1jcmVhdGVcbiAgICAgICAgICAgIC8vIE5vdGU6IHRvIGF2b2lkIGZsaWNrZXIgd2hlbiBvdGhlciB0ZXh0dXJlcy9zY2VuZSBpdGVtcyBjaGFuZ2VcbiAgICAgICAgICAgIGlmICghVGV4dHVyZS5jaGFuZ2VkKHRleG5hbWUsIGNvbmZpZykpIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgbGV0IHRleHR1cmUgPSBUZXh0dXJlLmNyZWF0ZShnbCwgdGV4bmFtZSwgY29uZmlnKTtcbiAgICAgICAgICAgIGxvYWRpbmcucHVzaCh0ZXh0dXJlLmxvYWRpbmcpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBQcm9taXNlLmFsbChsb2FkaW5nKTtcbn07XG5cbi8vIENyZWF0ZSBhICdkZWZhdWx0JyB0ZXh0dXJlICgxeDEgcGl4ZWwpIHRoYXQgY2FuIGJlIHVzZWQgYXMgYSBwbGFjZWhvbGRlclxuLy8gKGZvciBleGFtcGxlIHRvIHByZXZlbnQgR0wgZnJvbSBjb21wbGFpbmluZyBhYm91dCB1bmJvdW5kIHRleHR1cmVzKVxuVGV4dHVyZS5kZWZhdWx0ID0gJ19fZGVmYXVsdCc7XG5UZXh0dXJlLmNyZWF0ZURlZmF1bHQgPSBmdW5jdGlvbiAoZ2wpIHtcbiAgICByZXR1cm4gVGV4dHVyZS5jcmVhdGUoZ2wsIFRleHR1cmUuZGVmYXVsdCk7XG59O1xuXG4vLyBJbmRpY2F0ZSBpZiBhIHRleHR1cmUgZGVmaW5pdGlvbiB3b3VsZCBiZSBhIGNoYW5nZSBmcm9tIHRoZSBjdXJyZW50IGNhY2hlXG5UZXh0dXJlLmNoYW5nZWQgPSBmdW5jdGlvbiAobmFtZSwgY29uZmlnKSB7XG4gICAgbGV0IHRleHR1cmUgPSBUZXh0dXJlLnRleHR1cmVzW25hbWVdO1xuICAgIGlmICh0ZXh0dXJlKSB7IC8vIGNhY2hlZCB0ZXh0dXJlXG4gICAgICAgIC8vIGNhbnZhcy9pbWFnZS1iYXNlZCB0ZXh0dXJlcyBhcmUgY29uc2lkZXJlZCBkeW5hbWljIGFuZCBhbHdheXMgcmVmcmVzaFxuICAgICAgICBpZiAodGV4dHVyZS5jb25maWdfdHlwZSA9PT0gJ2VsZW1lbnQnIHx8IGNvbmZpZy5lbGVtZW50ICE9IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gY29tcGFyZSBkZWZpbml0aW9uc1xuICAgICAgICBpZiAoSlNPTi5zdHJpbmdpZnkoVGV4dHVyZS50ZXh0dXJlX2NvbmZpZ3NbbmFtZV0pID09PVxuICAgICAgICAgICAgSlNPTi5zdHJpbmdpZnkoT2JqZWN0LmFzc2lnbih7IG5hbWUgfSwgY29uZmlnKSkpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gdHJ1ZTtcbn07XG5cbi8vIEdldCBtZXRhZGF0YSBmb3IgYSB0ZXh0dXJlIGJ5IG5hbWVcbi8vIFJldHVybnMgdmlhIHByb21pc2UsIGluIGNhc2UgdGV4dHVyZSBpcyBzdGlsbCBsb2FkaW5nXG4vLyBDYW4gYmUgY2FsbGVkIG9uIG1haW4gdGhyZWFkIGZyb20gd29ya2VyLCB0byBzeW5jIHRleHR1cmUgaW5mbyB0byB3b3JrZXJcblRleHR1cmUuZ2V0SW5mbyA9IGZ1bmN0aW9uIChuYW1lKSB7XG4gICAgLy8gR2V0IGluZm8gZm9yIGFsbCB0ZXh0dXJlcyBieSBkZWZhdWx0XG4gICAgaWYgKCFuYW1lKSB7XG4gICAgICAgIG5hbWUgPSBPYmplY3Qua2V5cyhUZXh0dXJlLnRleHR1cmVzKTtcbiAgICB9XG5cbiAgICAvLyBHZXQgbXVsdGlwbGUgdGV4dHVyZXNcbiAgICBpZiAoQXJyYXkuaXNBcnJheShuYW1lKSkge1xuICAgICAgICByZXR1cm4gUHJvbWlzZS5hbGwobmFtZS5tYXAobiA9PiBUZXh0dXJlLmdldEluZm8obikpKTtcbiAgICB9XG5cbiAgICAvLyBHZXQgc2luZ2xlIHRleHR1cmVcbiAgICB2YXIgdGV4ID0gVGV4dHVyZS50ZXh0dXJlc1tuYW1lXTtcbiAgICBpZiAodGV4KSB7XG4gICAgICAgIC8vIFdhaXQgZm9yIHRoaXMgdGV4dHVyZSB0byBmaW5pc2ggbG9hZGluZywgb3IgcmV0dXJuIGltbWVkaWF0ZWx5XG4gICAgICAgIHZhciBsb2FkaW5nID0gdGV4LmxvYWRpbmcgfHwgUHJvbWlzZS5yZXNvbHZlKHRleCk7XG4gICAgICAgIHJldHVybiBsb2FkaW5nLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgLy8gUmV0dXJuIGEgc3Vic2V0IG9mIHRleHR1cmUgaW5mb1xuICAgICAgICAgICAgLy8gKGNvbXBhdGlibGUgdy9zdHJ1Y3R1cmVkIGNsb25pbmcsIHN1aXRhYmxlIGZvciBwYXNzaW5nIHRvIGEgd29ya2VyKVxuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBuYW1lOiB0ZXgubmFtZSxcbiAgICAgICAgICAgICAgICB3aWR0aDogdGV4LndpZHRoLFxuICAgICAgICAgICAgICAgIGhlaWdodDogdGV4LmhlaWdodCxcbiAgICAgICAgICAgICAgICBzcHJpdGVzOiB0ZXguc3ByaXRlcyxcbiAgICAgICAgICAgICAgICB0ZXhjb29yZHM6IHRleC50ZXhjb29yZHMsXG4gICAgICAgICAgICAgICAgc2l6ZXM6IHRleC5zaXplcyxcbiAgICAgICAgICAgICAgICBmaWx0ZXJpbmc6IHRleC5maWx0ZXJpbmcsXG4gICAgICAgICAgICAgICAgcG93ZXJfb2ZfMjogdGV4LnBvd2VyX29mXzIsXG4gICAgICAgICAgICAgICAgdmFsaWQ6IHRleC52YWxpZFxuICAgICAgICAgICAgfTtcbiAgICAgICAgfSk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICAvLyBObyB0ZXh0dXJlIGZvdW5kXG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUobnVsbCk7XG4gICAgfVxufTtcblxuLy8gU3luYyB0ZXh0dXJlIGluZm8gdG8gd29ya2VyXG4vLyBDYWxsZWQgZnJvbSB3b3JrZXIsIGdldHMgaW5mbyBvbiBvbmUgb3IgbW9yZSB0ZXh0dXJlcyBpbmZvIGZyb20gbWFpbiB0aHJlYWQgdmlhIHJlbW90ZSBjYWxsLCB0aGVuIHN0b3JlcyBpdFxuLy8gbG9jYWxseSBpbiB3b3JrZXIuICd0ZXh0dXJlcycgY2FuIGJlIGFuIGFycmF5IG9mIHRleHR1cmUgbmFtZXMgdG8gc3luYywgb3IgaWYgbnVsbCwgYWxsIHRleHR1cmVzIGFyZSBzeW5jZWQuXG5UZXh0dXJlLnN5bmNUZXh0dXJlc1RvV29ya2VyID0gZnVuY3Rpb24gKG5hbWVzKSB7XG4gICAgcmV0dXJuIFdvcmtlckJyb2tlci5wb3N0TWVzc2FnZSgnVGV4dHVyZS5nZXRJbmZvJywgbmFtZXMpLlxuICAgICAgICB0aGVuKHRleHR1cmVzID0+IHtcbiAgICAgICAgICAgIHRleHR1cmVzLmZvckVhY2godGV4ID0+IHtcbiAgICAgICAgICAgICAgICBUZXh0dXJlLnRleHR1cmVzW3RleC5uYW1lXSA9IHRleDtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuIFRleHR1cmUudGV4dHVyZXM7XG4gICAgICAgIH0pO1xufTtcblxuLy8gUmVwb3J0IG1heCB0ZXh0dXJlIHNpemUgZm9yIGEgR0wgY29udGV4dFxuVGV4dHVyZS5nZXRNYXhUZXh0dXJlU2l6ZSA9IGZ1bmN0aW9uIChnbCkge1xuICAgIHJldHVybiBnbC5nZXRQYXJhbWV0ZXIoZ2wuTUFYX1RFWFRVUkVfU0laRSk7XG59O1xuXG4vLyBHbG9iYWwgc2V0IG9mIHRleHR1cmVzLCBieSBuYW1lXG5UZXh0dXJlLnRleHR1cmVzID0ge307XG5UZXh0dXJlLnRleHR1cmVfY29uZmlncyA9IHt9O1xuVGV4dHVyZS5ib3VuZFRleHR1cmUgPSBudWxsO1xuVGV4dHVyZS5hY3RpdmVVbml0ID0gbnVsbDtcblxuV29ya2VyQnJva2VyLmFkZFRhcmdldCgnVGV4dHVyZScsIFRleHR1cmUpO1xuc3Vic2NyaWJlTWl4aW4oVGV4dHVyZSk7XG4iLCIvLyBDcmVhdGVzIGEgVmVydGV4IEFycmF5IE9iamVjdCBpZiB0aGUgZXh0ZW5zaW9uIGlzIGF2YWlsYWJsZSwgb3IgZmFsbHMgYmFjayBvbiBzdGFuZGFyZCBhdHRyaWJ1dGUgY2FsbHNcblxuaW1wb3J0IGdldEV4dGVuc2lvbiBmcm9tICcuL2V4dGVuc2lvbnMnO1xuaW1wb3J0IGxvZyBmcm9tICcuLi91dGlscy9sb2cnO1xuXG5leHBvcnQgZGVmYXVsdCB7XG5cbiAgICBkaXNhYmxlZDogZmFsc2UsIC8vIHNldCB0byB0cnVlIHRvIGRpc2FibGUgVkFPcyBldmVuIGlmIGV4dGVuc2lvbiBpcyBhdmFpbGFibGVcbiAgICBib3VuZF92YW86IFtdLCAgIC8vIGN1cnJlbnRseSBib3VuZCBWQU8sIGJ5IEdMIGNvbnRleHRcblxuICAgIGluaXQgKGdsKSB7XG4gICAgICAgIGxldCBleHQ7XG4gICAgICAgIGlmICh0aGlzLmRpc2FibGVkICE9PSB0cnVlKSB7XG4gICAgICAgICAgICBleHQgPSBnZXRFeHRlbnNpb24oZ2wsICdPRVNfdmVydGV4X2FycmF5X29iamVjdCcpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGV4dCAhPSBudWxsKSB7XG4gICAgICAgICAgICBsb2coJ2luZm8nLCAnVmVydGV4IEFycmF5IE9iamVjdCBleHRlbnNpb24gYXZhaWxhYmxlJyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodGhpcy5kaXNhYmxlZCAhPT0gdHJ1ZSkge1xuICAgICAgICAgICAgbG9nKCd3YXJuJywgJ1ZlcnRleCBBcnJheSBPYmplY3QgZXh0ZW5zaW9uIE5PVCBhdmFpbGFibGUnKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGxvZygnd2FybicsICdWZXJ0ZXggQXJyYXkgT2JqZWN0IGV4dGVuc2lvbiBmb3JjZSBkaXNhYmxlZCcpO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIGNyZWF0ZSAoZ2wsIHNldHVwLCB0ZWFyZG93bikge1xuICAgICAgICBsZXQgdmFvID0ge307XG4gICAgICAgIHZhby5zZXR1cCA9IHNldHVwO1xuICAgICAgICB2YW8udGVhcmRvd24gPSB0ZWFyZG93bjtcblxuICAgICAgICBsZXQgZXh0ID0gZ2V0RXh0ZW5zaW9uKGdsLCAnT0VTX3ZlcnRleF9hcnJheV9vYmplY3QnKTtcbiAgICAgICAgaWYgKGV4dCAhPSBudWxsKSB7XG4gICAgICAgICAgICB2YW8uX3ZhbyA9IGV4dC5jcmVhdGVWZXJ0ZXhBcnJheU9FUygpO1xuICAgICAgICAgICAgZXh0LmJpbmRWZXJ0ZXhBcnJheU9FUyh2YW8uX3Zhbyk7XG4gICAgICAgIH1cblxuICAgICAgICB2YW8uc2V0dXAodHJ1ZSk7XG5cbiAgICAgICAgcmV0dXJuIHZhbztcbiAgICB9LFxuXG4gICAgZ2V0Q3VycmVudEJpbmRpbmcgKGdsKSB7XG4gICAgICAgIGxldCBib3VuZCA9IHRoaXMuYm91bmRfdmFvLmZpbHRlcihlID0+IGVbMF0gPT09IGdsKVswXTtcbiAgICAgICAgcmV0dXJuIGJvdW5kICYmIGJvdW5kWzFdO1xuICAgIH0sXG5cbiAgICBzZXRDdXJyZW50QmluZGluZyAoZ2wsIHZhbykge1xuICAgICAgICBsZXQgYm91bmRfdmFvID0gdGhpcy5ib3VuZF92YW87XG4gICAgICAgIGxldCBiaW5kaW5nID0gYm91bmRfdmFvLmZpbHRlcihlID0+IGVbMF0gPT09IGdsKVswXTtcbiAgICAgICAgaWYgKGJpbmRpbmcgPT0gbnVsbCkge1xuICAgICAgICAgICAgYm91bmRfdmFvLnB1c2goW2dsLCB2YW9dKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGJpbmRpbmdbMV0gPSB2YW87XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgYmluZCAoZ2wsIHZhbykge1xuICAgICAgICBsZXQgZXh0ID0gZ2V0RXh0ZW5zaW9uKGdsLCAnT0VTX3ZlcnRleF9hcnJheV9vYmplY3QnKTtcbiAgICAgICAgaWYgKHZhbyAhPSBudWxsKSB7XG4gICAgICAgICAgICBpZiAoZXh0ICE9IG51bGwgJiYgdmFvLl92YW8gIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGV4dC5iaW5kVmVydGV4QXJyYXlPRVModmFvLl92YW8pO1xuICAgICAgICAgICAgICAgIHRoaXMuc2V0Q3VycmVudEJpbmRpbmcoZ2wsIHZhbyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB2YW8uc2V0dXAoZmFsc2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgbGV0IGJvdW5kX3ZhbyA9IHRoaXMuZ2V0Q3VycmVudEJpbmRpbmcoZ2wpO1xuICAgICAgICAgICAgaWYgKGV4dCAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgZXh0LmJpbmRWZXJ0ZXhBcnJheU9FUyhudWxsKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKGJvdW5kX3ZhbyAhPSBudWxsICYmIHR5cGVvZiBib3VuZF92YW8udGVhcmRvd24gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICBib3VuZF92YW8udGVhcmRvd24oKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHRoaXMuc2V0Q3VycmVudEJpbmRpbmcoZ2wsIG51bGwpO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIGRlc3Ryb3kgKGdsLCB2YW8pIHtcbiAgICAgICAgbGV0IGV4dCA9IGdldEV4dGVuc2lvbihnbCwgJ09FU192ZXJ0ZXhfYXJyYXlfb2JqZWN0Jyk7XG4gICAgICAgIGlmIChleHQgIT0gbnVsbCAmJiB2YW8gIT0gbnVsbCAmJiB2YW8uX3ZhbyAhPSBudWxsKSB7XG4gICAgICAgICAgICBleHQuZGVsZXRlVmVydGV4QXJyYXlPRVModmFvLl92YW8pO1xuICAgICAgICAgICAgdmFvLl92YW8gPSBudWxsO1xuICAgICAgICB9XG4gICAgICAgIC8vIGRlc3Ryb3kgaXMgYSBuby1vcCBpZiBWQU8gZXh0ZW5zaW9uIGlzbid0IGF2YWlsYWJsZVxuICAgIH1cblxufTtcbiIsIi8vIE1hbmFnZSByZW5kZXJpbmcgZm9yIHByaW1pdGl2ZXNcbmltcG9ydCBsb2cgZnJvbSAnLi4vdXRpbHMvbG9nJztcbmltcG9ydCBTaGFkZXJQcm9ncmFtIGZyb20gJy4vc2hhZGVyX3Byb2dyYW0nO1xuaW1wb3J0IFZlcnRleEFycmF5T2JqZWN0IGZyb20gJy4vdmFvJztcblxuLy8gQSBzaW5nbGUgbWVzaC9WQk8sIGRlc2NyaWJlZCBieSBhIHZlcnRleCBsYXlvdXQsIHRoYXQgY2FuIGJlIGRyYXduIHdpdGggb25lIG9yIG1vcmUgcHJvZ3JhbXNcbmV4cG9ydCBkZWZhdWx0IGNsYXNzIFZCT01lc2ggIHtcblxuICAgIGNvbnN0cnVjdG9yKGdsLCB2ZXJ0ZXhfZGF0YSwgZWxlbWVudF9kYXRhLCB2ZXJ0ZXhfbGF5b3V0LCBvcHRpb25zKSB7XG4gICAgICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuXG4gICAgICAgIHRoaXMuZ2wgPSBnbDtcbiAgICAgICAgdGhpcy52ZXJ0ZXhfZGF0YSA9IHZlcnRleF9kYXRhOyAvLyB0eXBlZCBhcnJheVxuICAgICAgICB0aGlzLmVsZW1lbnRfZGF0YSA9IGVsZW1lbnRfZGF0YTsgLy8gdHlwZWQgYXJyYXlcbiAgICAgICAgdGhpcy52ZXJ0ZXhfbGF5b3V0ID0gdmVydGV4X2xheW91dDtcbiAgICAgICAgdGhpcy52ZXJ0ZXhfYnVmZmVyID0gdGhpcy5nbC5jcmVhdGVCdWZmZXIoKTtcbiAgICAgICAgdGhpcy5kcmF3X21vZGUgPSBvcHRpb25zLmRyYXdfbW9kZSB8fCB0aGlzLmdsLlRSSUFOR0xFUztcbiAgICAgICAgdGhpcy5kYXRhX3VzYWdlID0gb3B0aW9ucy5kYXRhX3VzYWdlIHx8IHRoaXMuZ2wuU1RBVElDX0RSQVc7XG4gICAgICAgIHRoaXMudmVydGljZXNfcGVyX2dlb21ldHJ5ID0gMzsgLy8gVE9ETzogc3VwcG9ydCBsaW5lcywgc3RyaXAsIGZhbiwgZXRjLlxuICAgICAgICB0aGlzLnVuaWZvcm1zID0gb3B0aW9ucy51bmlmb3JtcztcbiAgICAgICAgdGhpcy5yZXRhaW4gPSBvcHRpb25zLnJldGFpbiB8fCBmYWxzZTsgLy8gd2hldGhlciB0byByZXRhaW4gbWVzaCBkYXRhIGluIENQVSBhZnRlciB1cGxvYWRpbmcgdG8gR1BVXG4gICAgICAgIHRoaXMuY3JlYXRlZF9hdCA9ICtuZXcgRGF0ZSgpO1xuICAgICAgICB0aGlzLmZhZGVfaW5fdGltZSA9IG9wdGlvbnMuZmFkZV9pbl90aW1lIHx8IDA7IC8vIG9wdGlvbmFsIHRpbWUgdG8gZmFkZSBpbiBtZXNoXG5cbiAgICAgICAgdGhpcy52ZXJ0ZXhfY291bnQgPSB0aGlzLnZlcnRleF9kYXRhLmJ5dGVMZW5ndGggLyB0aGlzLnZlcnRleF9sYXlvdXQuc3RyaWRlO1xuICAgICAgICB0aGlzLnZhb3MgPSB7fTsgLy8gbWFwIG9mIFZlcnRleEFycmF5T2JqZWN0cywga2V5ZWQgYnkgcHJvZ3JhbVxuXG4gICAgICAgIHRoaXMudG9nZ2xlX2VsZW1lbnRfYXJyYXkgPSBmYWxzZTtcbiAgICAgICAgaWYgKHRoaXMuZWxlbWVudF9kYXRhKXtcbiAgICAgICAgICAgIHRoaXMudG9nZ2xlX2VsZW1lbnRfYXJyYXkgPSB0cnVlO1xuICAgICAgICAgICAgdGhpcy5lbGVtZW50X2NvdW50ID0gdGhpcy5lbGVtZW50X2RhdGEubGVuZ3RoO1xuICAgICAgICAgICAgdGhpcy5nZW9tZXRyeV9jb3VudCA9IHRoaXMuZWxlbWVudF9jb3VudCAvIHRoaXMudmVydGljZXNfcGVyX2dlb21ldHJ5O1xuICAgICAgICAgICAgdGhpcy5lbGVtZW50X3R5cGUgPSAodGhpcy5lbGVtZW50X2RhdGEuY29uc3RydWN0b3IgPT09IFVpbnQxNkFycmF5KSA/IHRoaXMuZ2wuVU5TSUdORURfU0hPUlQ6IHRoaXMuZ2wuVU5TSUdORURfSU5UO1xuICAgICAgICAgICAgdGhpcy5lbGVtZW50X2J1ZmZlciA9IHRoaXMuZ2wuY3JlYXRlQnVmZmVyKCk7XG4gICAgICAgICAgICB0aGlzLmdsLmJpbmRCdWZmZXIodGhpcy5nbC5FTEVNRU5UX0FSUkFZX0JVRkZFUiwgdGhpcy5lbGVtZW50X2J1ZmZlcik7XG4gICAgICAgICAgICB0aGlzLmdsLmJ1ZmZlckRhdGEodGhpcy5nbC5FTEVNRU5UX0FSUkFZX0JVRkZFUiwgdGhpcy5lbGVtZW50X2RhdGEsIHRoaXMuZGF0YV91c2FnZSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmdlb21ldHJ5X2NvdW50ID0gdGhpcy52ZXJ0ZXhfY291bnQgLyB0aGlzLnZlcnRpY2VzX3Blcl9nZW9tZXRyeTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuZ2wuYmluZEJ1ZmZlcih0aGlzLmdsLkFSUkFZX0JVRkZFUiwgdGhpcy52ZXJ0ZXhfYnVmZmVyKTtcbiAgICAgICAgdGhpcy5nbC5idWZmZXJEYXRhKHRoaXMuZ2wuQVJSQVlfQlVGRkVSLCB0aGlzLnZlcnRleF9kYXRhLCB0aGlzLmRhdGFfdXNhZ2UpO1xuXG4gICAgICAgIGlmICghdGhpcy5yZXRhaW4pIHtcbiAgICAgICAgICAgIGRlbGV0ZSB0aGlzLnZlcnRleF9kYXRhO1xuICAgICAgICAgICAgZGVsZXRlIHRoaXMuZWxlbWVudF9kYXRhO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMudmFsaWQgPSB0cnVlO1xuICAgIH1cblxuICAgIC8vIFJlbmRlciwgYnkgZGVmYXVsdCB3aXRoIGN1cnJlbnRseSBib3VuZCBwcm9ncmFtLCBvciBvdGhlcndpc2Ugd2l0aCBvcHRpb25hbGx5IHByb3ZpZGVkIG9uZVxuICAgIC8vIFJldHVybnMgdHJ1ZSBpZiBtZXNoIHJlcXVlc3RzIGEgcmVuZGVyIG9uIG5leHQgZnJhbWUgKGUuZy4gZm9yIGZhZGUgYW5pbWF0aW9ucylcbiAgICByZW5kZXIob3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIGlmICghdGhpcy52YWxpZCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIHByb2dyYW0gPSBvcHRpb25zLnByb2dyYW0gfHwgU2hhZGVyUHJvZ3JhbS5jdXJyZW50O1xuICAgICAgICBwcm9ncmFtLnVzZSgpO1xuXG4gICAgICAgIGlmICh0aGlzLnVuaWZvcm1zKSB7XG4gICAgICAgICAgICBwcm9ncmFtLnNhdmVVbmlmb3Jtcyh0aGlzLnVuaWZvcm1zKTtcbiAgICAgICAgICAgIHByb2dyYW0uc2V0VW5pZm9ybXModGhpcy51bmlmb3JtcywgZmFsc2UpOyAvLyBkb24ndCByZXNldCB0ZXh0dXJlIHVuaXRcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCB2aXNpYmxlX3RpbWUgPSAoK25ldyBEYXRlKCkgLSB0aGlzLmNyZWF0ZWRfYXQpIC8gMTAwMDtcbiAgICAgICAgcHJvZ3JhbS51bmlmb3JtKCcxZicsICd1X3Zpc2libGVfdGltZScsIHZpc2libGVfdGltZSk7XG5cbiAgICAgICAgdGhpcy5iaW5kKHByb2dyYW0pO1xuXG4gICAgICAgIGlmICh0aGlzLnRvZ2dsZV9lbGVtZW50X2FycmF5KXtcbiAgICAgICAgICAgIHRoaXMuZ2wuZHJhd0VsZW1lbnRzKHRoaXMuZHJhd19tb2RlLCB0aGlzLmVsZW1lbnRfY291bnQsIHRoaXMuZWxlbWVudF90eXBlLCAwKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuZ2wuZHJhd0FycmF5cyh0aGlzLmRyYXdfbW9kZSwgMCwgdGhpcy52ZXJ0ZXhfY291bnQpO1xuICAgICAgICB9XG5cbiAgICAgICAgVmVydGV4QXJyYXlPYmplY3QuYmluZCh0aGlzLmdsLCBudWxsKTtcblxuICAgICAgICBpZiAodGhpcy51bmlmb3Jtcykge1xuICAgICAgICAgICAgcHJvZ3JhbS5yZXN0b3JlVW5pZm9ybXModGhpcy51bmlmb3Jtcyk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBSZXF1ZXN0IG5leHQgcmVuZGVyIGlmIG1lc2ggaXMgZmFkaW5nIGluXG4gICAgICAgIHJldHVybiAodmlzaWJsZV90aW1lIDwgdGhpcy5mYWRlX2luX3RpbWUpO1xuICAgIH1cblxuICAgIC8vIEJpbmQgYnVmZmVycyBhbmQgdmVydGV4IGF0dHJpYnV0ZXMgdG8gcHJlcGFyZSBmb3IgcmVuZGVyaW5nXG4gICAgYmluZChwcm9ncmFtKSB7XG4gICAgICAgIC8vIEJpbmQgVkFPIGZvciB0aGlzIHByb2dhbSwgb3IgY3JlYXRlIG9uZVxuICAgICAgICBsZXQgdmFvID0gdGhpcy52YW9zW3Byb2dyYW0uaWRdO1xuICAgICAgICBpZiAodmFvKSB7XG4gICAgICAgICAgICBWZXJ0ZXhBcnJheU9iamVjdC5iaW5kKHRoaXMuZ2wsIHZhbyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnZhb3NbcHJvZ3JhbS5pZF0gPSBWZXJ0ZXhBcnJheU9iamVjdC5jcmVhdGUodGhpcy5nbCwgKGZvcmNlKSA9PiB7XG4gICAgICAgICAgICAgICAgdGhpcy5nbC5iaW5kQnVmZmVyKHRoaXMuZ2wuQVJSQVlfQlVGRkVSLCB0aGlzLnZlcnRleF9idWZmZXIpO1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLnRvZ2dsZV9lbGVtZW50X2FycmF5KSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZ2wuYmluZEJ1ZmZlcih0aGlzLmdsLkVMRU1FTlRfQVJSQVlfQlVGRkVSLCB0aGlzLmVsZW1lbnRfYnVmZmVyKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy52ZXJ0ZXhfbGF5b3V0LmVuYWJsZSh0aGlzLmdsLCBwcm9ncmFtLCBmb3JjZSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGRlc3Ryb3koKSB7XG4gICAgICAgIGlmICghdGhpcy52YWxpZCkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMudmFsaWQgPSBmYWxzZTtcblxuICAgICAgICBmb3IgKGxldCB2IGluIHRoaXMudmFvcykge1xuICAgICAgICAgICAgVmVydGV4QXJyYXlPYmplY3QuZGVzdHJveSh0aGlzLmdsLCB0aGlzLnZhb3Nbdl0pO1xuICAgICAgICB9XG5cbiAgICAgICAgbG9nKCd0cmFjZScsICdWQk9NZXNoLmRlc3Ryb3k6IGRlbGV0ZSBidWZmZXInICsgKHRoaXMudmVydGV4X2RhdGEgPyBgIG9mIHNpemUgJHt0aGlzLnZlcnRleF9kYXRhLmJ5dGVMZW5ndGh9YCA6ICcnKSk7XG5cbiAgICAgICAgdGhpcy5nbC5kZWxldGVCdWZmZXIodGhpcy52ZXJ0ZXhfYnVmZmVyKTtcbiAgICAgICAgdGhpcy52ZXJ0ZXhfYnVmZmVyID0gbnVsbDtcblxuICAgICAgICBpZiAodGhpcy5lbGVtZW50X2J1ZmZlcikge1xuICAgICAgICAgICAgdGhpcy5nbC5kZWxldGVCdWZmZXIodGhpcy5lbGVtZW50X2J1ZmZlcik7XG4gICAgICAgICAgICB0aGlzLmVsZW1lbnRfYnVmZmVyID0gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGRlbGV0ZSB0aGlzLnZlcnRleF9kYXRhO1xuICAgICAgICBkZWxldGUgdGhpcy5lbGVtZW50X2RhdGE7XG5cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG59XG4iLCJpbXBvcnQgZ2wgZnJvbSAnLi9jb25zdGFudHMnOyAvLyB3ZWIgd29ya2VycyBkb24ndCBoYXZlIGFjY2VzcyB0byBHTCBjb250ZXh0LCBzbyBpbXBvcnQgYWxsIEdMIGNvbnN0YW50c1xuaW1wb3J0IGxvZyBmcm9tICcuLi91dGlscy9sb2cnO1xuaW1wb3J0IFZlcnRleEVsZW1lbnRzIGZyb20gJy4vdmVydGV4X2VsZW1lbnRzJztcblxuLy8gTWFwcyBHTCB0eXBlcyB0byBKUyBhcnJheSB0eXBlc1xubGV0IGFycmF5X3R5cGVzID0ge1xuICAgIFtnbC5GTE9BVF06IEZsb2F0MzJBcnJheSxcbiAgICBbZ2wuQllURV06IEludDhBcnJheSxcbiAgICBbZ2wuVU5TSUdORURfQllURV06IFVpbnQ4QXJyYXksXG4gICAgW2dsLklOVF06IEludDMyQXJyYXksXG4gICAgW2dsLlVOU0lHTkVEX0lOVF06IFVpbnQzMkFycmF5LFxuICAgIFtnbC5TSE9SVF06IEludDE2QXJyYXksXG4gICAgW2dsLlVOU0lHTkVEX1NIT1JUXTogVWludDE2QXJyYXlcbn07XG5cbi8vIEFuIGludGVybWVkaWFyeSBvYmplY3QgdGhhdCBob2xkcyB2ZXJ0ZXggZGF0YSBpbiB0eXBlZCBhcnJheXMsIGFjY29yZGluZyB0byBhIGdpdmVuIHZlcnRleCBsYXlvdXRcbi8vIFVzZWQgdG8gY29uc3RydWN0IGEgbWVzaC9WQk8gZm9yIHJlbmRlcmluZ1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVmVydGV4RGF0YSB7XG5cbiAgICBjb25zdHJ1Y3RvciAodmVydGV4X2xheW91dCwgeyBwcmVhbGxvYyA9IDUwMCB9ID0ge30pIHtcbiAgICAgICAgdGhpcy52ZXJ0ZXhfbGF5b3V0ID0gdmVydGV4X2xheW91dDtcbiAgICAgICAgdGhpcy52ZXJ0ZXhfZWxlbWVudHMgPSBuZXcgVmVydGV4RWxlbWVudHMoKTtcblxuICAgICAgICBpZiAoVmVydGV4RGF0YS5hcnJheV9wb29sLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIHRoaXMudmVydGV4X2J1ZmZlciA9IFZlcnRleERhdGEuYXJyYXlfcG9vbC5wb3AoKTtcbiAgICAgICAgICAgIHRoaXMuYnl0ZV9sZW5ndGggPSB0aGlzLnZlcnRleF9idWZmZXIuYnl0ZUxlbmd0aDtcbiAgICAgICAgICAgIHRoaXMuc2l6ZSA9IE1hdGguZmxvb3IodGhpcy5ieXRlX2xlbmd0aCAvIHRoaXMudmVydGV4X2xheW91dC5zdHJpZGUpO1xuICAgICAgICAgICAgbG9nKCd0cmFjZScsIGBWZXJ0ZXhEYXRhOiByZXVzZWQgYnVmZmVyIG9mIGJ5dGVzICR7dGhpcy5ieXRlX2xlbmd0aH0sICR7dGhpcy5zaXplfSB2ZXJ0aWNlc2ApO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5zaXplID0gcHJlYWxsb2M7IC8vICMgb2YgdmVydGljZXMgdG8gYWxsb2NhdGVcbiAgICAgICAgICAgIHRoaXMuYnl0ZV9sZW5ndGggPSB0aGlzLnZlcnRleF9sYXlvdXQuc3RyaWRlICogdGhpcy5zaXplO1xuICAgICAgICAgICAgdGhpcy52ZXJ0ZXhfYnVmZmVyID0gbmV3IFVpbnQ4QXJyYXkodGhpcy5ieXRlX2xlbmd0aCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5vZmZzZXQgPSAwOyAgICAgICAgICAgICAvLyBieXRlIG9mZnNldCBpbnRvIGN1cnJlbnRseSBhbGxvY2F0ZWQgYnVmZmVyXG5cbiAgICAgICAgdGhpcy5jb21wb25lbnRzID0gW107XG4gICAgICAgIGZvciAobGV0IGM9MDsgYyA8IHRoaXMudmVydGV4X2xheW91dC5jb21wb25lbnRzLmxlbmd0aDsgYysrKSB7XG4gICAgICAgICAgICB0aGlzLmNvbXBvbmVudHMucHVzaChbLi4udGhpcy52ZXJ0ZXhfbGF5b3V0LmNvbXBvbmVudHNbY11dKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnZlcnRleF9jb3VudCA9IDA7XG4gICAgICAgIHRoaXMucmVhbGxvY19jb3VudCA9IDA7XG4gICAgICAgIHRoaXMuc2V0QnVmZmVyVmlld3MoKTtcbiAgICB9XG5cbiAgICAvLyAoUmUtKWFsbG9jYXRlIHR5cGVkIHZpZXdzIGludG8gdGhlIG1haW4gYnVmZmVyIC0gb25seSBjcmVhdGUgdGhlIHR5cGVzIHdlIG5lZWQgZm9yIHRoaXMgbGF5b3V0XG4gICAgc2V0QnVmZmVyVmlld3MgKCkge1xuICAgICAgICB0aGlzLnZpZXdzID0ge307XG4gICAgICAgIHRoaXMudmlld3NbZ2wuVU5TSUdORURfQllURV0gPSB0aGlzLnZlcnRleF9idWZmZXI7XG4gICAgICAgIGZvciAobGV0IGE9MDsgYSA8IHRoaXMudmVydGV4X2xheW91dC5hdHRyaWJzLmxlbmd0aDsgYSsrKSB7XG4gICAgICAgICAgICBjb25zdCBhdHRyaWIgPSB0aGlzLnZlcnRleF9sYXlvdXQuYXR0cmlic1thXTtcblxuICAgICAgICAgICAgLy8gTmVlZCB2aWV3IGZvciB0aGlzIHR5cGU/XG4gICAgICAgICAgICBpZiAodGhpcy52aWV3c1thdHRyaWIudHlwZV0gPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHZhciBhcnJheV90eXBlID0gYXJyYXlfdHlwZXNbYXR0cmliLnR5cGVdO1xuICAgICAgICAgICAgICAgIHRoaXMudmlld3NbYXR0cmliLnR5cGVdID0gbmV3IGFycmF5X3R5cGUodGhpcy52ZXJ0ZXhfYnVmZmVyLmJ1ZmZlcik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBVcGRhdGUgY29tcG9uZW50IGJ1ZmZlciBwb2ludGVyc1xuICAgICAgICBmb3IgKGxldCBjPTA7IGMgPCB0aGlzLmNvbXBvbmVudHMubGVuZ3RoOyBjKyspIHtcbiAgICAgICAgICAgIGNvbnN0IGNvbXBvbmVudCA9IHRoaXMuY29tcG9uZW50c1tjXTtcbiAgICAgICAgICAgIGNvbXBvbmVudFsxXSA9IHRoaXMudmlld3NbY29tcG9uZW50WzBdXTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIENoZWNrIGFsbG9jYXRlZCBidWZmZXIgc2l6ZSwgZXhwYW5kL3JlYWxsb2MgYnVmZmVyIGlmIG5lZWRlZFxuICAgIGNoZWNrQnVmZmVyU2l6ZSAoKSB7XG4gICAgICAgIGlmICgodGhpcy5vZmZzZXQgKyB0aGlzLnZlcnRleF9sYXlvdXQuc3RyaWRlKSA+IHRoaXMuYnl0ZV9sZW5ndGgpIHtcbiAgICAgICAgICAgIHRoaXMuc2l6ZSA9IE1hdGguZmxvb3IodGhpcy5zaXplICogMS41KTtcbiAgICAgICAgICAgIHRoaXMuc2l6ZSAtPSB0aGlzLnNpemUgJSA0O1xuICAgICAgICAgICAgdGhpcy5ieXRlX2xlbmd0aCA9IHRoaXMudmVydGV4X2xheW91dC5zdHJpZGUgKiB0aGlzLnNpemU7XG4gICAgICAgICAgICB2YXIgbmV3X3ZpZXcgPSBuZXcgVWludDhBcnJheSh0aGlzLmJ5dGVfbGVuZ3RoKTtcbiAgICAgICAgICAgIG5ld192aWV3LnNldCh0aGlzLnZlcnRleF9idWZmZXIpOyAvLyBjb3B5IGV4aXN0aW5nIGRhdGEgdG8gbmV3IGJ1ZmZlclxuICAgICAgICAgICAgVmVydGV4RGF0YS5hcnJheV9wb29sLnB1c2godGhpcy52ZXJ0ZXhfYnVmZmVyKTsgLy8gc2F2ZSBwcmV2aW91cyBidWZmZXIgZm9yIHVzZSBieSBuZXh0IHRpbGVcbiAgICAgICAgICAgIHRoaXMudmVydGV4X2J1ZmZlciA9IG5ld192aWV3O1xuICAgICAgICAgICAgdGhpcy5zZXRCdWZmZXJWaWV3cygpO1xuICAgICAgICAgICAgdGhpcy5yZWFsbG9jX2NvdW50Kys7XG4gICAgICAgICAgICAvLyBsb2coJ2luZm8nLCBgVmVydGV4RGF0YTogZXhwYW5kZWQgdmVydGV4IGJsb2NrIHRvICR7dGhpcy5zaXplfSB2ZXJ0aWNlc2ApO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gQWRkIGEgdmVydGV4LCBjb3BpZWQgZnJvbSBhIHBsYWluIEpTIGFycmF5IG9mIGVsZW1lbnRzIG1hdGNoaW5nIHRoZSBvcmRlciBvZiB0aGUgdmVydGV4IGxheW91dC5cbiAgICAvLyBOb3RlOiB1c2VzIHByZS1jYWxjdWxhdGVkIGluZm8gYWJvdXQgZWFjaCBhdHRyaWJ1dGUsIGluY2x1ZGluZyBwb2ludGVyIHRvIGFwcHJvcHJpYXRlIHR5cGVkIGFycmF5XG4gICAgLy8gdmlldyBhbmQgb2Zmc2V0IGludG8gaXQuIFRoaXMgd2FzIHRoZSBmYXN0ZXN0IG1ldGhvZCBwcm9maWxlZCBzbyBmYXIgZm9yIGZpbGxpbmcgYSBtaXhlZC10eXBlXG4gICAgLy8gdmVydGV4IGxheW91dCAodGhvdWdoIHN0aWxsIHNsb3dlciB0aGFuIHRoZSBwcmV2aW91cyBtZXRob2QgdGhhdCBvbmx5IHN1cHBvcnRlZCBGbG9hdDMyQXJyYXkgYXR0cmlidXRlcykuXG4gICAgYWRkVmVydGV4ICh2ZXJ0ZXgpIHtcbiAgICAgICAgdGhpcy5jaGVja0J1ZmZlclNpemUoKTtcbiAgICAgICAgdmFyIGk9MDtcblxuICAgICAgICB2YXIgY2xlbiA9IHRoaXMuY29tcG9uZW50cy5sZW5ndGg7XG4gICAgICAgIGZvciAodmFyIGM9MDsgYyA8IGNsZW47IGMrKykge1xuICAgICAgICAgICAgdmFyIGNvbXBvbmVudCA9IHRoaXMuY29tcG9uZW50c1tjXTtcbiAgICAgICAgICAgIGNvbXBvbmVudFsxXVsodGhpcy5vZmZzZXQgPj4gY29tcG9uZW50WzJdKSArIGNvbXBvbmVudFszXV0gPSB2ZXJ0ZXhbaSsrXTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMub2Zmc2V0ICs9IHRoaXMudmVydGV4X2xheW91dC5zdHJpZGU7XG4gICAgICAgIHRoaXMudmVydGV4X2NvdW50Kys7XG4gICAgfVxuXG4gICAgLy8gRmluYWxpemUgdmVydGV4IGJ1ZmZlciBmb3IgdXNlIGluIGNvbnN0cnVjdGluZyBhIG1lc2hcbiAgICBlbmQgKCkge1xuICAgICAgICAvLyBDbGlwIHRoZSBidWZmZXIgdG8gc2l6ZSB1c2VkIGZvciB0aGlzIFZCT1xuICAgICAgICB0aGlzLnZlcnRleF9idWZmZXIgPSB0aGlzLnZlcnRleF9idWZmZXIuc3ViYXJyYXkoMCwgdGhpcy5vZmZzZXQpO1xuICAgICAgICB0aGlzLmVsZW1lbnRfYnVmZmVyID0gdGhpcy52ZXJ0ZXhfZWxlbWVudHMuZW5kKCk7XG5cbiAgICAgICAgbG9nKCd0cmFjZScsIGBWZXJ0ZXhEYXRhOiAke3RoaXMuc2l6ZX0gdmVydGljZXMgdG90YWwsIHJlYWxsb2MgY291bnQgJHt0aGlzLnJlYWxsb2NfY291bnR9YCk7XG5cbiAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgfVxuXG59XG5cblZlcnRleERhdGEuYXJyYXlfcG9vbCA9IFtdOyAvLyBwb29sIG9mIGN1cnJlbnRseSBhdmFpbGFibGUgKHByZXZpb3VzbHkgdXNlZCkgYnVmZmVycyAodWludDgpXG4iLCJpbXBvcnQgV29ya2VyQnJva2VyIGZyb20gJy4uL3V0aWxzL3dvcmtlcl9icm9rZXInO1xuXG5sZXQgTUFYX1ZBTFVFID0gTWF0aC5wb3coMiwgMTYpIC0gMTtcbmxldCBVaW50MzJfZmxhZyA9IGZhbHNlO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBWZXJ0ZXhFbGVtZW50cyB7XG4gICAgY29uc3RydWN0b3IgKCkge1xuICAgICAgICB0aGlzLmFycmF5ID0gW107XG4gICAgICAgIHRoaXMuaGFzX292ZXJmbG93biA9IGZhbHNlO1xuICAgIH1cbiAgICBwdXNoICh2YWx1ZSkge1xuICAgICAgICAvLyBJZiB2YWx1ZXMgaGF2ZSBvdmVyZmxvd24gYW5kIG5vIFVpbnQzMiBvcHRpb24gaXMgYXZhaWxhYmxlLCBkbyBub3QgcHVzaCB2YWx1ZXNcbiAgICAgICAgaWYgKHRoaXMuaGFzX292ZXJmbG93biAmJiAhVWludDMyX2ZsYWcpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFRyaWdnZXIgb3ZlcmZsb3cgaWYgdmFsdWUgaXMgZ3JlYXRlciB0aGFuIFVpbnQxNiBtYXhcbiAgICAgICAgaWYgKHZhbHVlID4gTUFYX1ZBTFVFKSB7XG4gICAgICAgICAgICB0aGlzLmhhc19vdmVyZmxvd24gPSB0cnVlO1xuICAgICAgICAgICAgaWYgKCFVaW50MzJfZmxhZykge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuYXJyYXkucHVzaCh2YWx1ZSk7XG4gICAgfVxuICAgIGVuZCAoKSB7XG4gICAgICAgIGlmICh0aGlzLmFycmF5Lmxlbmd0aCl7XG4gICAgICAgICAgICBsZXQgYnVmZmVyID0gY3JlYXRlQnVmZmVyKHRoaXMuYXJyYXksIHRoaXMuaGFzX292ZXJmbG93bik7XG4gICAgICAgICAgICB0aGlzLmFycmF5ID0gW107XG4gICAgICAgICAgICB0aGlzLmhhc19vdmVyZmxvd24gPSBmYWxzZTtcbiAgICAgICAgICAgIHJldHVybiBidWZmZXI7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG59XG5cblZlcnRleEVsZW1lbnRzLnNldFVpbnQzMkZsYWcgPSBmdW5jdGlvbihmbGFnKSB7XG4gICAgVWludDMyX2ZsYWcgPSBmbGFnO1xufTtcblxuZnVuY3Rpb24gY3JlYXRlQnVmZmVyKGFycmF5LCBvdmVyZmxvd24pIHtcbiAgICB2YXIgdHlwZWRBcnJheSA9IChvdmVyZmxvd24gJiYgVWludDMyX2ZsYWcpID8gVWludDMyQXJyYXkgOiBVaW50MTZBcnJheTtcbiAgICByZXR1cm4gbmV3IHR5cGVkQXJyYXkoYXJyYXkpO1xufVxuXG5Xb3JrZXJCcm9rZXIuYWRkVGFyZ2V0KCdWZXJ0ZXhFbGVtZW50cycsIFZlcnRleEVsZW1lbnRzKTtcbiIsImltcG9ydCBnbCBmcm9tICcuL2NvbnN0YW50cyc7IC8vIHdlYiB3b3JrZXJzIGRvbid0IGhhdmUgYWNjZXNzIHRvIEdMIGNvbnRleHQsIHNvIGltcG9ydCBhbGwgR0wgY29uc3RhbnRzXG5pbXBvcnQgVmVydGV4RGF0YSBmcm9tICcuL3ZlcnRleF9kYXRhJztcblxuLy8gRGVzY3JpYmVzIGEgdmVydGV4IGxheW91dCB0aGF0IGNhbiBiZSB1c2VkIHdpdGggbWFueSBkaWZmZXJlbnQgR0wgcHJvZ3JhbXMuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBWZXJ0ZXhMYXlvdXQge1xuICAgIC8vIEF0dHJpYnMgYXJlIGFuIGFycmF5LCBpbiBsYXlvdXQgb3JkZXIsIG9mOiBuYW1lLCBzaXplLCB0eXBlLCBub3JtYWxpemVkXG4gICAgLy8gZXg6IHsgbmFtZTogJ3Bvc2l0aW9uJywgc2l6ZTogMywgdHlwZTogZ2wuRkxPQVQsIG5vcm1hbGl6ZWQ6IGZhbHNlIH1cbiAgICBjb25zdHJ1Y3RvciAoYXR0cmlicykge1xuICAgICAgICB0aGlzLmF0dHJpYnMgPSBhdHRyaWJzOyAvLyBhcnJheSBvZiBhdHRyaWJ1dGVzLCBzcGVjaWZpZWQgYXMgc3RhbmRhcmQgR0wgYXR0cmliIG9wdGlvbnNcbiAgICAgICAgdGhpcy5jb21wb25lbnRzID0gW107ICAgLy8gbGlzdCBvZiB0eXBlIGFuZCBvZmZzZXQgaW5mbyBhYm91dCBlYWNoIGF0dHJpYnV0ZSBjb21wb25lbnRcbiAgICAgICAgdGhpcy5pbmRleCA9IHt9OyAgICAgICAgLy8gbGluZWFyIGJ1ZmZlciBpbmRleCBvZiBlYWNoIGF0dHJpYnV0ZSBjb21wb25lbnQsIGUuZy4gdGhpcy5pbmRleC5wb3NpdGlvbi54XG5cbiAgICAgICAgLy8gQ2FsYyB2ZXJ0ZXggc3RyaWRlXG4gICAgICAgIHRoaXMuc3RyaWRlID0gMDtcblxuICAgICAgICB2YXIgY291bnQgPSAwO1xuICAgICAgICBmb3IgKGxldCBhPTA7IGEgPCB0aGlzLmF0dHJpYnMubGVuZ3RoOyBhKyspIHtcbiAgICAgICAgICAgIGxldCBhdHRyaWIgPSB0aGlzLmF0dHJpYnNbYV07XG4gICAgICAgICAgICBhdHRyaWIub2Zmc2V0ID0gdGhpcy5zdHJpZGU7XG4gICAgICAgICAgICBhdHRyaWIuYnl0ZV9zaXplID0gYXR0cmliLnNpemU7XG4gICAgICAgICAgICB2YXIgc2hpZnQgPSAwO1xuXG4gICAgICAgICAgICBzd2l0Y2ggKGF0dHJpYi50eXBlKSB7XG4gICAgICAgICAgICAgICAgY2FzZSBnbC5GTE9BVDpcbiAgICAgICAgICAgICAgICBjYXNlIGdsLklOVDpcbiAgICAgICAgICAgICAgICBjYXNlIGdsLlVOU0lHTkVEX0lOVDpcbiAgICAgICAgICAgICAgICAgICAgYXR0cmliLmJ5dGVfc2l6ZSAqPSA0O1xuICAgICAgICAgICAgICAgICAgICBzaGlmdCA9IDI7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2UgZ2wuU0hPUlQ6XG4gICAgICAgICAgICAgICAgY2FzZSBnbC5VTlNJR05FRF9TSE9SVDpcbiAgICAgICAgICAgICAgICAgICAgYXR0cmliLmJ5dGVfc2l6ZSAqPSAyO1xuICAgICAgICAgICAgICAgICAgICBzaGlmdCA9IDE7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBGb3JjZSA0LWJ5dGUgYWxpZ25tZW50IG9uIGF0dHJpYnV0ZXNcbiAgICAgICAgICAgIHRoaXMuc3RyaWRlICs9IGF0dHJpYi5ieXRlX3NpemU7XG4gICAgICAgICAgICBpZiAodGhpcy5zdHJpZGUgJiAzKSB7IC8vIHBhZCB0byBtdWx0aXBsZSBvZiA0IGJ5dGVzXG4gICAgICAgICAgICAgICAgdGhpcy5zdHJpZGUgKz0gNCAtICh0aGlzLnN0cmlkZSAmIDMpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBBZGQgaW5mbyB0byBsaXN0IG9mIGF0dHJpYnV0ZSBjb21wb25lbnRzXG4gICAgICAgICAgICAvLyBVc2VkIHRvIGJ1aWxkIHRoZSB2ZXJ0ZXggZGF0YSwgcHJvdmlkZXMgcG9pbnRlcnMgYW5kIG9mZnNldHMgaW50byBlYWNoIHR5cGVkIGFycmF5IHZpZXdcbiAgICAgICAgICAgIC8vIEVhY2ggY29tcG9uZW50IGlzIGFuIGFycmF5IG9mOlxuICAgICAgICAgICAgLy8gW0dMIGF0dHJpYiB0eXBlLCBwb2ludGVyIHRvIHR5cGVkIGFycmF5IHZpZXcsIGJpdHMgdG8gc2hpZnQgcmlnaHQgdG8gZGV0ZXJtaW5lIGJ1ZmZlciBvZmZzZXQsIGFkZGl0aW9uYWwgYnVmZmVyIG9mZnNldCBmb3IgdGhlIGNvbXBvbmVudF1cbiAgICAgICAgICAgIHZhciBvZmZzZXRfdHlwZWQgPSBhdHRyaWIub2Zmc2V0ID4+IHNoaWZ0O1xuICAgICAgICAgICAgaWYgKGF0dHJpYi5zaXplID4gMSkge1xuICAgICAgICAgICAgICAgIGZvciAobGV0IHM9MDsgcyA8IGF0dHJpYi5zaXplOyBzKyspIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jb21wb25lbnRzLnB1c2goW2F0dHJpYi50eXBlLCBudWxsLCBzaGlmdCwgb2Zmc2V0X3R5cGVkKytdKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLmNvbXBvbmVudHMucHVzaChbYXR0cmliLnR5cGUsIG51bGwsIHNoaWZ0LCBvZmZzZXRfdHlwZWRdKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gUHJvdmlkZSBhbiBpbmRleCBpbnRvIHRoZSB2ZXJ0ZXggZGF0YSBidWZmZXIgZm9yIGVhY2ggYXR0cmlidXRlIGNvbXBvbmVudFxuICAgICAgICAgICAgdGhpcy5pbmRleFthdHRyaWIubmFtZV0gPSBjb3VudDtcbiAgICAgICAgICAgIGNvdW50ICs9IGF0dHJpYi5zaXplO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gU2V0dXAgYSB2ZXJ0ZXggbGF5b3V0IGZvciBhIHNwZWNpZmljIEdMIHByb2dyYW1cbiAgICAvLyBBc3N1bWVzIHRoYXQgdGhlIGRlc2lyZWQgdmVydGV4IGJ1ZmZlciAoVkJPKSBpcyBhbHJlYWR5IGJvdW5kXG4gICAgLy8gSWYgYSBnaXZlbiBwcm9ncmFtIGRvZXNuJ3QgaW5jbHVkZSBhbGwgYXR0cmlidXRlcywgaXQgY2FuIHN0aWxsIHVzZSB0aGUgdmVydGV4IGxheW91dFxuICAgIC8vIHRvIHJlYWQgdGhvc2UgYXR0cmlicyB0aGF0IGl0IGRvZXMgcmVjb2duaXplLCB1c2luZyB0aGUgYXR0cmliIG9mZnNldHMgdG8gc2tpcCBvdGhlcnMuXG4gICAgZW5hYmxlIChnbCwgcHJvZ3JhbSwgZm9yY2UpXG4gICAge1xuICAgICAgICB2YXIgYXR0cmliLCBsb2NhdGlvbjtcblxuICAgICAgICAvLyBFbmFibGUgYWxsIGF0dHJpYnV0ZXMgZm9yIHRoaXMgbGF5b3V0XG4gICAgICAgIGZvciAodmFyIGE9MDsgYSA8IHRoaXMuYXR0cmlicy5sZW5ndGg7IGErKykge1xuICAgICAgICAgICAgYXR0cmliID0gdGhpcy5hdHRyaWJzW2FdO1xuICAgICAgICAgICAgbG9jYXRpb24gPSBwcm9ncmFtLmF0dHJpYnV0ZShhdHRyaWIubmFtZSkubG9jYXRpb247XG5cbiAgICAgICAgICAgIGlmIChsb2NhdGlvbiAhPT0gLTEpIHtcbiAgICAgICAgICAgICAgICBpZiAoIVZlcnRleExheW91dC5lbmFibGVkX2F0dHJpYnNbbG9jYXRpb25dIHx8IGZvcmNlKSB7XG4gICAgICAgICAgICAgICAgICAgIGdsLmVuYWJsZVZlcnRleEF0dHJpYkFycmF5KGxvY2F0aW9uKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZ2wudmVydGV4QXR0cmliUG9pbnRlcihsb2NhdGlvbiwgYXR0cmliLnNpemUsIGF0dHJpYi50eXBlLCBhdHRyaWIubm9ybWFsaXplZCwgdGhpcy5zdHJpZGUsIGF0dHJpYi5vZmZzZXQpO1xuICAgICAgICAgICAgICAgIFZlcnRleExheW91dC5lbmFibGVkX2F0dHJpYnNbbG9jYXRpb25dID0gcHJvZ3JhbTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIERpc2FibGUgYW55IHByZXZpb3VzbHkgYm91bmQgYXR0cmlidXRlcyB0aGF0IGFyZW4ndCBmb3IgdGhpcyBsYXlvdXRcbiAgICAgICAgZm9yIChsb2NhdGlvbiBpbiBWZXJ0ZXhMYXlvdXQuZW5hYmxlZF9hdHRyaWJzKSB7XG4gICAgICAgICAgICB0aGlzLmRpc2FibGVVbnVzZWRBdHRyaWJ1dGUoZ2wsIGxvY2F0aW9uLCBwcm9ncmFtKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIERpc2FibGUgYW4gYXR0cmlidXRlIGlmIGl0IHdhcyBub3QgZW5hYmxlZCBmb3IgdGhlIHNwZWNpZmllZCBwcm9ncmFtXG4gICAgLy8gTk9URTogdGhpcyB3YXMgbW92ZWQgb3V0IG9mIHRoZSBpbm5lciBsb29wIGluIGVuYWJsZSgpIHRvIGFzc2lzdCB3L1ZNIG9wdGltaXphdGlvblxuICAgIGRpc2FibGVVbnVzZWRBdHRyaWJ1dGUgKGdsLCBsb2NhdGlvbiwgcHJvZ3JhbSkge1xuICAgICAgICBpZiAoVmVydGV4TGF5b3V0LmVuYWJsZWRfYXR0cmlic1tsb2NhdGlvbl0gIT09IHByb2dyYW0pIHtcbiAgICAgICAgICAgIGdsLmRpc2FibGVWZXJ0ZXhBdHRyaWJBcnJheShsb2NhdGlvbik7XG4gICAgICAgICAgICBkZWxldGUgVmVydGV4TGF5b3V0LmVuYWJsZWRfYXR0cmlic1tsb2NhdGlvbl07XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBjcmVhdGVWZXJ0ZXhEYXRhICgpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBWZXJ0ZXhEYXRhKHRoaXMpO1xuICAgIH1cblxufVxuXG4vLyBUcmFjayBjdXJyZW50bHkgZW5hYmxlZCBhdHRyaWJzLCBieSB0aGUgcHJvZ3JhbSB0aGV5IGFyZSBib3VuZCB0b1xuLy8gU3RhdGljIGNsYXNzIHByb3BlcnR5IHRvIHJlZmxlY3QgZ2xvYmFsIEdMIHN0YXRlXG5WZXJ0ZXhMYXlvdXQuZW5hYmxlZF9hdHRyaWJzID0ge307XG4iLCJpbXBvcnQgUmVwZWF0R3JvdXAgZnJvbSAnLi9yZXBlYXRfZ3JvdXAnO1xuaW1wb3J0IGxvZyBmcm9tICcuLi91dGlscy9sb2cnO1xuXG52YXIgQ29sbGlzaW9uO1xuXG5leHBvcnQgZGVmYXVsdCBDb2xsaXNpb24gPSB7XG5cbiAgICB0aWxlczoge30sXG5cbiAgICBzdGFydFRpbGUgKHRpbGUpIHtcbiAgICAgICAgbGV0IHN0YXRlID0gdGhpcy50aWxlc1t0aWxlXSA9IHtcbiAgICAgICAgICAgIGJib3hlczogeyAgICAgICAgICAgLy8gY3VycmVudCBzZXQgb2YgcGxhY2VkIGJvdW5kaW5nIGJveGVzXG4gICAgICAgICAgICAgICAgYWFiYjogW10sXG4gICAgICAgICAgICAgICAgb2JiOiBbXVxuICAgICAgICAgICAgfSxcbiAgICAgICAgICAgIG9iamVjdHM6IHt9LCAgICAgICAgLy8gb2JqZWN0cyB0byBjb2xsaWRlLCBncm91cGVkIGJ5IHByaW9yaXR5LCB0aGVuIGJ5IHN0eWxlXG4gICAgICAgICAgICBrZWVwOiB7fSwgICAgICAgICAgIC8vIG9iamVjdHMgdGhhdCB3ZXJlIGtlcHQgYWZ0ZXIgY29sbGlzaW9uLCBncm91cGVkIGJ5IHN0eWxlXG4gICAgICAgICAgICBzdHlsZXM6IHt9ICAgICAgICAgIC8vIHN0eWxlcyBjb250cmlidXRpbmcgY29sbGlzaW9uIG9iamVjdHNcbiAgICAgICAgfTtcblxuICAgICAgICAvLyBQcm9taXNlIHJlc29sdmVkIHdoZW4gYWxsIHJlZ2lzdGVyZWQgc3R5bGVzIGhhdmUgYWRkZWQgb2JqZWN0c1xuICAgICAgICBzdGF0ZS5jb21wbGV0ZSA9IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgIHN0YXRlLnJlc29sdmUgPSByZXNvbHZlO1xuICAgICAgICAgICAgc3RhdGUucmVqZWN0ID0gcmVqZWN0O1xuICAgICAgICB9KTtcbiAgICB9LFxuXG4gICAgcmVzZXRUaWxlICh0aWxlKSB7XG4gICAgICAgIGRlbGV0ZSB0aGlzLnRpbGVzW3RpbGVdO1xuICAgIH0sXG5cbiAgICAvLyBBZGQgYSBzdHlsZSB0byB0aGUgcGVuZGluZyBzZXQsIGNvbGxpc2lvbiB3aWxsIGJsb2NrIG9uIGFsbCBzdHlsZXMgc3VibWl0dGluZyB0byBjb2xsaXNpb24gc2V0XG4gICAgYWRkU3R5bGUgKHN0eWxlLCB0aWxlKSB7XG4gICAgICAgIHRoaXMudGlsZXNbdGlsZV0uc3R5bGVzW3N0eWxlXSA9IHRydWU7XG4gICAgfSxcblxuICAgIC8vIEFkZCBjb2xsaXNpb24gb2JqZWN0cyBmb3IgYSBzdHlsZVxuICAgIGNvbGxpZGUgKG9iamVjdHMsIHN0eWxlLCB0aWxlKSB7XG4gICAgICAgIGxldCBzdGF0ZSA9IHRoaXMudGlsZXNbdGlsZV07XG4gICAgICAgIGlmICghc3RhdGUpIHtcbiAgICAgICAgICAgIGxvZygndHJhY2UnLCAnQ29sbGlzaW9uLmNvbGxpZGUoKSBjYWxsZWQgd2l0aCBudWxsIHRpbGUnLCB0aWxlLCB0aGlzLnRpbGVzLCBzdHlsZSwgb2JqZWN0cyk7XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKFtdKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEdyb3VwIGJ5IHByaW9yaXR5IGFuZCBzdHlsZVxuICAgICAgICBsZXQgdGlsZV9vYmplY3RzID0gc3RhdGUub2JqZWN0cztcbiAgICAgICAgZm9yIChsZXQgaT0wOyBpIDwgb2JqZWN0cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgbGV0IG9iaiA9IG9iamVjdHNbaV07XG4gICAgICAgICAgICBsZXQgcHJpb3JpdHkgPSBvYmoubGFiZWwubGF5b3V0LnByaW9yaXR5O1xuICAgICAgICAgICAgdGlsZV9vYmplY3RzW3ByaW9yaXR5XSA9IHRpbGVfb2JqZWN0c1twcmlvcml0eV0gfHwge307XG4gICAgICAgICAgICB0aWxlX29iamVjdHNbcHJpb3JpdHldW3N0eWxlXSA9IHRpbGVfb2JqZWN0c1twcmlvcml0eV1bc3R5bGVdIHx8IFtdO1xuICAgICAgICAgICAgdGlsZV9vYmplY3RzW3ByaW9yaXR5XVtzdHlsZV0ucHVzaChvYmopO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gUmVtb3ZlIGZyb20gcGVuZGluZyBzdHlsZSBzZXQsIGlmIG5vIG1vcmUgc3R5bGVzLCBkbyBjb2xsaXNpb24gJiBmaW5pc2ggdGlsZVxuICAgICAgICBkZWxldGUgc3RhdGUuc3R5bGVzW3N0eWxlXTtcbiAgICAgICAgaWYgKE9iamVjdC5rZXlzKHN0YXRlLnN0eWxlcykubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICB0aGlzLmVuZFRpbGUodGlsZSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBXYWl0IGZvciBvYmplY3RzIHRvIGJlIGFkZGVkIGZyb20gYWxsIHN0eWxlc1xuICAgICAgICByZXR1cm4gc3RhdGUuY29tcGxldGUudGhlbigoKSA9PiB7XG4gICAgICAgICAgICByZXR1cm4gc3RhdGUua2VlcFtzdHlsZV0gfHwgW107XG4gICAgICAgIH0pO1xuICAgIH0sXG5cbiAgICAvLyBUZXN0IGxhYmVscyBmb3IgY29sbGlzaW9ucywgaGlnaGVyIHRvIGxvd2VyIHByaW9yaXR5XG4gICAgLy8gV2hlbiB0d28gY29sbGlkZSwgZGlzY2FyZCB0aGUgbG93ZXItcHJpb3JpdHkgbGFiZWxcbiAgICBlbmRUaWxlICh0aWxlKSB7XG4gICAgICAgIGxldCBzdGF0ZSA9IHRoaXMudGlsZXNbdGlsZV07XG4gICAgICAgIGxldCBrZWVwID0gc3RhdGUua2VlcDtcblxuICAgICAgICBSZXBlYXRHcm91cC5jbGVhcih0aWxlKTtcblxuICAgICAgICAvLyBQcm9jZXNzIGxhYmVscyBieSBwcmlvcml0eSwgdGhlbiBieSBzdHlsZVxuICAgICAgICBsZXQgcHJpb3JpdGllcyA9IE9iamVjdC5rZXlzKHN0YXRlLm9iamVjdHMpLnNvcnQoKGEsIGIpID0+IGEgLSBiKTtcbiAgICAgICAgZm9yIChsZXQgcD0wOyBwIDwgcHJpb3JpdGllcy5sZW5ndGg7IHArKykge1xuICAgICAgICAgICAgbGV0IHN0eWxlX29iamVjdHMgPSBzdGF0ZS5vYmplY3RzW3ByaW9yaXRpZXNbcF1dO1xuICAgICAgICAgICAgaWYgKCFzdHlsZV9vYmplY3RzKSB7IC8vIG5vIGxhYmVscyBhdCB0aGlzIHByaW9yaXR5LCBza2lwIHRvIG5leHRcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gRm9yIGVhY2ggc3R5bGVcbiAgICAgICAgICAgIGZvciAobGV0IHN0eWxlIGluIHN0eWxlX29iamVjdHMpIHtcbiAgICAgICAgICAgICAgICBsZXQgb2JqZWN0cyA9IHN0eWxlX29iamVjdHNbc3R5bGVdO1xuICAgICAgICAgICAgICAgIGtlZXBbc3R5bGVdID0ga2VlcFtzdHlsZV0gfHwgW107XG5cbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IG9iamVjdHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IG9iamVjdCA9IG9iamVjdHNbaV07XG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmNhbkJlUGxhY2VkKG9iamVjdCwgdGlsZSwgb2JqZWN0LmxpbmtlZCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEtlZXAgb2JqZWN0IGlmIGl0IGlzbid0IGRlcGVuZGVudCBvbiBhIHBhcmVudCBvYmplY3RcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghb2JqZWN0LmxpbmtlZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtlZXBbc3R5bGVdLnB1c2gob2JqZWN0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnBsYWNlKG9iamVjdCwgdGlsZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBJZiBvYmplY3QgaXMgZGVwZW5kZW50IG9uIGEgcGFyZW50LCBvbmx5IGtlZXAgaWYgYm90aCBjYW4gYmUgcGxhY2VkXG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICh0aGlzLmNhbkJlUGxhY2VkKG9iamVjdC5saW5rZWQsIHRpbGUsIG9iamVjdCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZWVwW3N0eWxlXS5wdXNoKG9iamVjdCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5wbGFjZShvYmplY3QsIHRpbGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucGxhY2Uob2JqZWN0LmxpbmtlZCwgdGlsZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBkZWxldGUgdGhpcy50aWxlc1t0aWxlXTtcbiAgICAgICAgc3RhdGUucmVzb2x2ZSgpO1xuICAgIH0sXG5cbiAgICAvLyBSdW4gY29sbGlzaW9uIGFuZCByZXBlYXQgY2hlY2sgdG8gc2VlIGlmIGxhYmVsIGNhbiBjdXJyZW50bHkgYmUgcGxhY2VkXG4gICAgY2FuQmVQbGFjZWQgKG9iamVjdCwgdGlsZSwgZXhjbHVkZSA9IG51bGwpIHtcbiAgICAgICAgbGV0IGxhYmVsID0gb2JqZWN0LmxhYmVsO1xuICAgICAgICBsZXQgbGF5b3V0ID0gb2JqZWN0LmxhYmVsLmxheW91dDtcblxuICAgICAgICAvLyBTa2lwIGlmIGFscmVhZHkgcHJvY2Vzc2VkIChlLmcuIGJ5IHBhcmVudCBvYmplY3QpXG4gICAgICAgIGlmIChsYWJlbC5wbGFjZWQgIT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIGxhYmVsLnBsYWNlZDtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFRlc3QgdGhlIGxhYmVsIGZvciBpbnRlcnNlY3Rpb25zIHdpdGggb3RoZXIgbGFiZWxzIGluIHRoZSB0aWxlXG4gICAgICAgIGxldCBiYm94ZXMgPSB0aGlzLnRpbGVzW3RpbGVdLmJib3hlcztcbiAgICAgICAgaWYgKCFsYXlvdXQuY29sbGlkZSB8fCAhbGFiZWwuZGlzY2FyZChiYm94ZXMsIGV4Y2x1ZGUgJiYgZXhjbHVkZS5sYWJlbCkpIHtcbiAgICAgICAgICAgIC8vIGNoZWNrIGZvciByZXBlYXRzXG4gICAgICAgICAgICBsZXQgcmVwZWF0ID0gUmVwZWF0R3JvdXAuY2hlY2sobGFiZWwsIGxheW91dCwgdGlsZSk7XG4gICAgICAgICAgICBpZiAocmVwZWF0KSB7XG4gICAgICAgICAgICAgICAgLy8gbG9nKCd0cmFjZScsIGBkaXNjYXJkIGxhYmVsICcke2xhYmVsLnRleHR9JywgKG9uZV9wZXJfZ3JvdXA6ICR7cmVwZWF0Lm9uZV9wZXJfZ3JvdXB9KSwgZGlzdCAke01hdGguc3FydChyZXBlYXQuZGlzdF9zcSkvbGF5b3V0LnVuaXRzX3Blcl9waXhlbH0gPCAke01hdGguc3FydChyZXBlYXQucmVwZWF0X2Rpc3Rfc3EpL2xheW91dC51bml0c19wZXJfcGl4ZWx9YCk7XG4gICAgICAgICAgICAgICAgbGFiZWwucGxhY2VkID0gZmFsc2U7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChsYXlvdXQuY29sbGlkZSkge1xuICAgICAgICAgICAgLy8gbG9nKCd0cmFjZScsIGBkaXNjYXJkIGxhYmVsICcke2xhYmVsLnRleHR9JyBkdWUgdG8gY29sbGlzaW9uYCk7XG4gICAgICAgICAgICBsYWJlbC5wbGFjZWQgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbGFiZWwucGxhY2VkO1xuICAgIH0sXG5cbiAgICAvLyBQbGFjZSBsYWJlbFxuICAgIHBsYWNlICh7IGxhYmVsIH0sIHRpbGUpIHtcbiAgICAgICAgLy8gU2tpcCBpZiBhbHJlYWR5IHByb2Nlc3NlZCAoZS5nLiBieSBwYXJlbnQgb2JqZWN0KVxuICAgICAgICBpZiAobGFiZWwucGxhY2VkICE9IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFJlZ2lzdGVyIGFzIHBsYWNlZCBmb3IgZnV0dXJlIGNvbGxpc2lvbiBhbmQgcmVwZWF0IGN1bGxpbmdcbiAgICAgICAgUmVwZWF0R3JvdXAuYWRkKGxhYmVsLCBsYWJlbC5sYXlvdXQsIHRpbGUpO1xuICAgICAgICBsYWJlbC5hZGQodGhpcy50aWxlc1t0aWxlXS5iYm94ZXMpO1xuICAgIH1cblxufTtcbiIsIlxuLy8gRG8gQUFCQiBgYWAgYW5kIGBiYCBpbnRlcnNlY3Q/XG5leHBvcnQgZnVuY3Rpb24gYm94SW50ZXJzZWN0c0JveCAoYSwgYikge1xuICAgIGlmIChhWzJdIDwgYlswXSB8fCAvLyBhIGlzIGxlZnQgb2YgYlxuICAgICAgICBhWzBdID4gYlsyXSB8fCAvLyBhIGlzIHJpZ2h0IG9mIGJcbiAgICAgICAgYVszXSA8IGJbMV0gfHwgLy8gYSBpcyBhYm92ZSBiXG4gICAgICAgIGFbMV0gPiBiWzNdKSB7IC8vIGEgaXMgYmVsb3cgYlxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuICAgIHJldHVybiB0cnVlOyAvLyBib3hlcyBvdmVybGFwXG59XG5cbi8vIERvZXMgQUFCQiBgYWAgaW50ZXJzZWN0IGFueSBvZiB0aGUgQUFCQnMgaW4gYXJyYXkgYGJveGVzYD9cbi8vIEludm9rZXMgYGNhbGxiYWNrYCB3aXRoIGluZGV4IG9mIGludGVyc2VjdGluZyBib3hcbi8vIFN0b3BzIGludGVyc2VjdGluZyBpZiBgY2FsbGJhY2tgIHJldHVybnMgbm9uLW51bGwgdmFsdWUgKGNvbnRpbnVlcyBvdGhlcndpc2UpXG5leHBvcnQgZnVuY3Rpb24gYm94SW50ZXJzZWN0c0xpc3QgKGEsIGJveGVzLCBjYWxsYmFjaykge1xuICAgIGZvciAobGV0IGk9MDsgaSA8IGJveGVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgIGlmIChib3hJbnRlcnNlY3RzQm94KGEsIGJveGVzW2ldKSkge1xuICAgICAgICAgICAgaWYgKGNhbGxiYWNrKGkpICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn1cbiIsImltcG9ydCBQb2ludEFuY2hvciBmcm9tICcuL3BvaW50X2FuY2hvcic7XG5pbXBvcnQge2JveEludGVyc2VjdHNMaXN0fSBmcm9tICcuL2ludGVyc2VjdCc7XG5pbXBvcnQgVXRpbHMgZnJvbSAnLi4vdXRpbHMvdXRpbHMnO1xuaW1wb3J0IE9CQiBmcm9tICcuLi91dGlscy9vYmInO1xuLy8gaW1wb3J0IGxvZyBmcm9tICcuLi91dGlscy9sb2cnO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBMYWJlbCB7XG5cbiAgICBjb25zdHJ1Y3RvciAoc2l6ZSwgbGF5b3V0ID0ge30pIHtcbiAgICAgICAgdGhpcy5zaXplID0gc2l6ZTtcbiAgICAgICAgdGhpcy5sYXlvdXQgPSBsYXlvdXQ7XG4gICAgICAgIHRoaXMucG9zaXRpb24gPSBudWxsO1xuICAgICAgICB0aGlzLmFuY2hvciA9IEFycmF5LmlzQXJyYXkodGhpcy5sYXlvdXQuYW5jaG9yKSA/IHRoaXMubGF5b3V0LmFuY2hvclswXSA6IHRoaXMubGF5b3V0LmFuY2hvcjsgLy8gaW5pdGlhbCBhbmNob3JcbiAgICAgICAgdGhpcy5wbGFjZWQgPSBudWxsO1xuICAgICAgICB0aGlzLm9mZnNldCA9IGxheW91dC5vZmZzZXQ7XG4gICAgICAgIHRoaXMuYWFiYiA9IG51bGw7XG4gICAgICAgIHRoaXMub2JiID0gbnVsbDtcbiAgICAgICAgdGhpcy5hbGlnbiA9ICdjZW50ZXInO1xuICAgICAgICB0aGlzLnRocm93X2F3YXkgPSBmYWxzZTsgICAgLy8gaWYgbGFiZWwgZG9lcyBub3QgZml0IChleGNlZWRzIHRpbGUgYm91bmRhcnksIGV0YykgdGhpcyBib29sZWFuIHdpbGwgYmUgdHJ1ZVxuICAgIH1cblxuICAgIHVwZGF0ZSAoKSB7XG4gICAgICAgIHRoaXMuYWxpZ24gPSB0aGlzLmxheW91dC5hbGlnbiB8fCBQb2ludEFuY2hvci5hbGlnbkZvckFuY2hvcih0aGlzLmFuY2hvcik7XG4gICAgfVxuXG4gICAgLy8gY2hlY2sgZm9yIG92ZXJsYXBzIHdpdGggb3RoZXIgbGFiZWxzIGluIHRoZSB0aWxlXG4gICAgb2NjbHVkZWQgKGJib3hlcywgZXhjbHVkZSA9IG51bGwpIHtcbiAgICAgICAgbGV0IGludGVyc2VjdCA9IGZhbHNlO1xuICAgICAgICBsZXQgYWFiYnMgPSBiYm94ZXMuYWFiYjtcbiAgICAgICAgbGV0IG9iYnMgPSBiYm94ZXMub2JiO1xuXG4gICAgICAgIC8vIEJyb2FkIHBoYXNlXG4gICAgICAgIGlmIChhYWJicy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBib3hJbnRlcnNlY3RzTGlzdCh0aGlzLmFhYmIsIGFhYmJzLCAoaikgPT4ge1xuICAgICAgICAgICAgICAgIC8vIGxvZygndHJhY2UnLCAnY29sbGlzaW9uOiBicm9hZCBwaGFzZSBjb2xsaWRlJywgdGhpcy5sYXlvdXQuaWQsIHRoaXMsIHRoaXMuYWFiYiwgYWFiYnNbal0pO1xuXG4gICAgICAgICAgICAgICAgLy8gU2tpcCBpZiBjb2xsaWRpbmcgd2l0aCBleGNsdWRlZCBsYWJlbFxuICAgICAgICAgICAgICAgIGlmIChleGNsdWRlICYmIGFhYmJzW2pdID09PSBleGNsdWRlLmFhYmIpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gbG9nKCd0cmFjZScsICdjb2xsaXNpb246IHNraXBwaW5nIGR1ZSB0byBleHBsaWNpdCBleGNsdXNpb24nLCB0aGlzLCBleGNsdWRlKTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIFNraXAgbmFycm93IHBoYXNlIGNvbGxpc2lvbiBpZiBubyByb3RhdGlvblxuICAgICAgICAgICAgICAgIGlmICh0aGlzLm9iYi5hbmdsZSA9PT0gMCAmJiBvYmJzW2pdLmFuZ2xlID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGxvZygndHJhY2UnLCAnY29sbGlzaW9uOiBza2lwIG5hcnJvdyBwaGFzZSBjb2xsaWRlIGJlY2F1c2UgbmVpdGhlciBpcyByb3RhdGVkJywgdGhpcy5sYXlvdXQuaWQsIHRoaXMsIHRoaXMub2JiLCBvYmJzW2pdKTtcbiAgICAgICAgICAgICAgICAgICAgaW50ZXJzZWN0ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gTmFycm93IHBoYXNlXG4gICAgICAgICAgICAgICAgaWYgKE9CQi5pbnRlcnNlY3QodGhpcy5vYmIsIG9iYnNbal0pKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIGxvZygndHJhY2UnLCAnY29sbGlzaW9uOiBuYXJyb3cgcGhhc2UgY29sbGlkZScsIHRoaXMubGF5b3V0LmlkLCB0aGlzLCB0aGlzLm9iYiwgb2Jic1tqXSk7XG4gICAgICAgICAgICAgICAgICAgIGludGVyc2VjdCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBpbnRlcnNlY3Q7XG4gICAgfVxuXG4gICAgLy8gQWRkIHRoaXMgbGFiZWwncyBib3VuZGluZyBib3ggdG8gdGhlIHByb3ZpZGVkIHNldFxuICAgIGFkZCAoYmJveGVzKSB7XG4gICAgICAgIHRoaXMucGxhY2VkID0gdHJ1ZTtcbiAgICAgICAgYmJveGVzLmFhYmIucHVzaCh0aGlzLmFhYmIpO1xuICAgICAgICBiYm94ZXMub2JiLnB1c2godGhpcy5vYmIpO1xuICAgIH1cblxuICAgIC8vIGNoZWNrcyB3aGV0aGVyIHRoZSBsYWJlbCBpcyB3aXRoaW4gdGhlIHRpbGUgYm91bmRhcmllc1xuICAgIGluVGlsZUJvdW5kcyAoKSB7XG4gICAgICAgIGxldCBtaW4gPSBbIHRoaXMuYWFiYlswXSwgdGhpcy5hYWJiWzFdIF07XG4gICAgICAgIGxldCBtYXggPSBbIHRoaXMuYWFiYlsyXSwgdGhpcy5hYWJiWzNdIF07XG5cbiAgICAgICAgaWYgKCFVdGlscy5wb2ludEluVGlsZShtaW4pIHx8ICFVdGlscy5wb2ludEluVGlsZShtYXgpKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICAvLyBXaGV0aGVyIHRoZSBsYWJlbCBzaG91bGQgYmUgZGlzY2FyZGVkXG4gICAgLy8gRGVwZW5kcyBvbiB3aGV0aGVyIGxhYmVsIG11c3QgZml0IGluIHRoZSB0aWxlIGJvdW5kcywgYW5kIGlmIHNvLCBjYW4gaXQgYmUgbW92ZWQgdG8gZml0IHRoZXJlXG4gICAgZGlzY2FyZChiYm94ZXMsIGV4Y2x1ZGUgPSBudWxsKSB7XG4gICAgICAgIGlmICh0aGlzLnRocm93X2F3YXkpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLm9jY2x1ZGVkKGJib3hlcywgZXhjbHVkZSk7XG4gICAgfVxufVxuXG5MYWJlbC5lcHNpbG9uID0gMC45OTk5OyAvLyB0b2xlcmFuY2UgYXJvdW5kIGNvbGxpc2lvbiBib3hlcywgcHJldmVudCBwZXJmZWN0bHkgYWRqYWNlbnQgb2JqZWN0cyBmcm9tIGNvbGxpZGluZ1xuIiwiaW1wb3J0IExhYmVsIGZyb20gJy4vbGFiZWwnO1xuaW1wb3J0IFZlY3RvciBmcm9tICcuLi92ZWN0b3InO1xuaW1wb3J0IE9CQiBmcm9tICcuLi91dGlscy9vYmInO1xuXG5jb25zdCBQTEFDRU1FTlQgPSB7XG4gICAgTUlEX1BPSU5UOiAwLFxuICAgIENPUk5FUjogMVxufTtcblxuY29uc3QgTUFYX0FOR0xFID0gTWF0aC5QSSAvIDI7ICAgICAgLy8gbWF4aW11bSBhbmdsZSBmb3IgYXJ0aWN1bGF0ZWQgbGFiZWxzXG5jb25zdCBMSU5FX0VYQ0VFRF9TVFJBSUdIVCA9IDAuNzsgICAvLyBtaW5pbWFsIHJhdGlvIGZvciBzdHJhaWdodCBsYWJlbHMgKGxhYmVsIGxlbmd0aCkgLyAobGluZSBsZW5ndGgpXG5jb25zdCBMSU5FX0VYQ0VFRF9LSU5LRUQgPSAwLjY7ICAgICAvLyBtaW5pbWFsIHJhdGlvIGZvciBraW5rZWQgbGFiZWxzXG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIExhYmVsTGluZSB7XG5cbiAgICBjb25zdHJ1Y3RvciAoc2l6ZSwgbGluZXMsIGxheW91dCkge1xuICAgICAgICB0aGlzLnNpemUgPSBzaXplO1xuICAgICAgICB0aGlzLmxheW91dCA9IGxheW91dDtcbiAgICAgICAgdGhpcy5saW5lcyA9IGxpbmVzO1xuICAgICAgICB0aGlzLnNwYWNlX3dpZHRoID0gbGF5b3V0LnNwYWNlX3dpZHRoOyAvLyB3aWR0aCBvZiBzcGFjZSBmb3IgdGhlIGZvbnQgdXNlZFxuICAgICAgICB0aGlzLm51bV9zZWdtZW50cyA9IHNpemUubGVuZ3RoOyAvLyBudW1iZXIgb2YgbGFiZWwgc2VnbWVudHNcbiAgICAgICAgdGhpcy50b3RhbF9sZW5ndGggPSBzaXplLnJlZHVjZShmdW5jdGlvbihwcmV2LCBuZXh0KXsgcmV0dXJuIHByZXYgKyBuZXh0WzBdOyB9LCAwKSArIChzaXplLmxlbmd0aCAtIDEpICogdGhpcy5zcGFjZV93aWR0aDtcbiAgICAgICAgdGhpcy50b3RhbF9oZWlnaHQgPSBzaXplWzBdWzFdO1xuICAgICAgICB0aGlzLnBsYWNlbWVudCA9IChsYXlvdXQucGxhY2VtZW50ID09PSB1bmRlZmluZWQpID8gUExBQ0VNRU5ULk1JRF9QT0lOVCA6IGxheW91dC5wbGFjZW1lbnQ7XG5cbiAgICAgICAgdGhpcy5raW5rX2luZGV4ID0gMDsgLy8gaW5kZXggYXQgd2hpY2ggYW4gYXJ0aWN1bGF0ZWQgbGFiZWwgd2lsbCBraW5rIChlLmcuLCAxIG1lYW5zIGEga2luayBfYWZ0ZXJfIHRoZSBmaXJzdCBzZWdtZW50KVxuICAgICAgICB0aGlzLnNwcmVhZF9mYWN0b3IgPSAwLjU7IC8vIHNwYWNlcyBvdXQgYWRqYWNlbnQgd29yZHMgdG8gcHJldmVudCBvdmVybGFwXG4gICAgICAgIHRoaXMuZml0bmVzcyA9IDA7IC8vIG1lYXN1cmUgb2YgcXVhbGl0eSBvZiBmaXRcblxuICAgICAgICAvLyBBcnJheXMgZm9yIExhYmVsIHByb3BlcnRpZXMuIFRPRE86IGNyZWF0ZSBhcnJheSBvZiBMYWJlbCB0eXBlcywgd2hlcmUgTGFiZWxMaW5lIGFjdHMgYXMgYSBcImdyb3VwZWQgbGFiZWxcIlxuICAgICAgICB0aGlzLnBvc2l0aW9uID0gW107XG4gICAgICAgIHRoaXMuYW5nbGUgPSBbXTtcbiAgICAgICAgdGhpcy5vZmZzZXRzID0gW107XG4gICAgICAgIHRoaXMub2JicyA9IFtdO1xuICAgICAgICB0aGlzLmFhYmJzID0gW107XG5cbiAgICAgICAgLy8gb3B0aW9uYWxseSBsaW1pdCB0aGUgbGluZSBzZWdtZW50cyB0aGF0IHRoZSBsYWJlbCBtYXkgYmUgcGxhY2VkIGluLCBieSBzcGVjaWZ5aW5nIGEgc2VnbWVudCBpbmRleCByYW5nZVxuICAgICAgICAvLyB1c2VkIGFzIGEgY29hcnNlIHN1YmRpdmlkZSBmb3IgcGxhY2luZyBtdWx0aXBsZSBsYWJlbHMgcGVyIGxpbmUgZ2VvbWV0cnlcbiAgICAgICAgdGhpcy5zZWdtZW50X2luZGV4ID0gbGF5b3V0LnNlZ21lbnRfaW5kZXggfHwgbGF5b3V0LnNlZ21lbnRfc3RhcnQgfHwgMDtcbiAgICAgICAgdGhpcy5zZWdtZW50X21heCA9IGxheW91dC5zZWdtZW50X2VuZCB8fCB0aGlzLmxpbmVzLmxlbmd0aDtcblxuICAgICAgICAvLyBGaXJzdCBmaXR0aW5nIHNlZ21lbnRcbiAgICAgICAgbGV0IHNlZ21lbnQgPSB0aGlzLmdldE5leHRGaXR0aW5nU2VnbWVudCh0aGlzLmdldEN1cnJlbnRTZWdtZW50KCkpO1xuICAgICAgICB0aGlzLnRocm93X2F3YXkgPSAoIXNlZ21lbnQpO1xuICAgIH1cblxuICAgIC8vIEl0ZXJhdGUgdGhyb3VnaCB0aGUgbGluZSBnZW9tZXRyeSBjcmVhdGluZyB0aGUgbmV4dCB2YWxpZCBsYWJlbC5cbiAgICBzdGF0aWMgbmV4dExhYmVsKGxhYmVsKSB7XG4gICAgICAgIC8vIGluY3JlbWVudCBzZWdtZW50XG4gICAgICAgIGxldCBoYXNOZXh0ID0gbGFiZWwuZ2V0TmV4dFNlZ21lbnQoKTtcbiAgICAgICAgaWYgKCFoYXNOZXh0KSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBjbG9uZSBvcHRpb25zXG4gICAgICAgIGxldCBsYXlvdXQgPSBPYmplY3QuY3JlYXRlKGxhYmVsLmxheW91dCk7XG4gICAgICAgIGxheW91dC5zZWdtZW50X2luZGV4ID0gbGFiZWwuc2VnbWVudF9pbmRleDtcbiAgICAgICAgbGF5b3V0LnBsYWNlbWVudCA9IGxhYmVsLnBsYWNlbWVudDtcblxuICAgICAgICAvLyBjcmVhdGUgbmV3IGxhYmVsXG4gICAgICAgIGxldCBuZXh0TGFiZWwgPSBuZXcgTGFiZWxMaW5lKGxhYmVsLnNpemUsIGxhYmVsLmxpbmVzLCBsYXlvdXQpO1xuXG4gICAgICAgIHJldHVybiAobmV4dExhYmVsLnRocm93X2F3YXkpID8gZmFsc2UgOiBuZXh0TGFiZWw7XG4gICAgfVxuXG4gICAgLy8gU3RyYXRlZ3kgZm9yIHJldHVybmluZyB0aGUgbmV4dCBzZWdtZW50LiBBc3N1bWVzIGFuIFwib3JkZXJpbmdcIiBvZiBwb3NzaWJsZSBzZWdtZW50c1xuICAgIC8vIHRha2luZyBpbnRvIGFjY291bnQgYm90aCBzdHJhaWdodCBhbmQgYXJ0aWN1bGF0ZWQgc2VnbWVudHMuIFJldHVybnMgZmFsc2UgaWYgYWxsIHBvc3NpYmlsaXRpZXNcbiAgICAvLyBoYXZlIGJlZW4gZXhoYXVzdGVkXG4gICAgZ2V0TmV4dFNlZ21lbnQoKSB7XG4gICAgICAgIHN3aXRjaCAodGhpcy5wbGFjZW1lbnQpIHtcbiAgICAgICAgICAgIGNhc2UgUExBQ0VNRU5ULkNPUk5FUjpcbiAgICAgICAgICAgICAgICB0aGlzLnBsYWNlbWVudCA9IFBMQUNFTUVOVC5NSURfUE9JTlQ7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFBMQUNFTUVOVC5NSURfUE9JTlQ6XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuc2VnbWVudF9pbmRleCA+PSB0aGlzLmxpbmVzLmxlbmd0aCAtIDIpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmICh0aGlzLnNpemUubGVuZ3RoID4gMSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnBsYWNlbWVudCA9IFBMQUNFTUVOVC5DT1JORVI7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMuc2VnbWVudF9pbmRleCsrO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuZ2V0Q3VycmVudFNlZ21lbnQoKTtcbiAgICB9XG5cbiAgICAvLyBSZXR1cm5zIHRoZSBsaW5lIHNlZ21lbnRzIG5lY2Vzc2FyeSBmb3Igb3RoZXIgY2FsY3VsYXRpb25zIGF0IHRoZSBjdXJyZW50IGxpbmUgc2VnbWVudCBpbmRleC5cbiAgICAvLyBUaGlzIGlzIHRoZSBjdXJyZW50IGFuZCBuZXh0IHNlZ21lbnQgZm9yIGEgc3RyYWlnaHQgbGluZSwgYW5kIHRoZSBwcmV2aW91cywgY3VycmVudCBhbmQgbmV4dFxuICAgIC8vIGZvciBhbiBhcnRpY3VsYXRlZCBzZWdtZW50LlxuICAgIGdldEN1cnJlbnRTZWdtZW50KCkge1xuICAgICAgICBsZXQgcDEsIHAyLCBzZWdtZW50O1xuICAgICAgICBzd2l0Y2ggKHRoaXMucGxhY2VtZW50KSB7XG4gICAgICAgICAgICBjYXNlIFBMQUNFTUVOVC5DT1JORVI6XG4gICAgICAgICAgICAgICAgcDEgPSB0aGlzLmxpbmVzW3RoaXMuc2VnbWVudF9pbmRleCAtIDFdO1xuICAgICAgICAgICAgICAgIHAyID0gdGhpcy5saW5lc1t0aGlzLnNlZ21lbnRfaW5kZXhdO1xuICAgICAgICAgICAgICAgIGxldCBwMyA9IHRoaXMubGluZXNbdGhpcy5zZWdtZW50X2luZGV4ICsgMV07XG4gICAgICAgICAgICAgICAgc2VnbWVudCA9IFsgcDEsIHAyLCBwMyBdO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBQTEFDRU1FTlQuTUlEX1BPSU5UOlxuICAgICAgICAgICAgICAgIHAxID0gdGhpcy5saW5lc1t0aGlzLnNlZ21lbnRfaW5kZXhdO1xuICAgICAgICAgICAgICAgIHAyID0gdGhpcy5saW5lc1t0aGlzLnNlZ21lbnRfaW5kZXggKyAxXTtcbiAgICAgICAgICAgICAgICBzZWdtZW50ID0gWyBwMSwgcDIgXTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBzZWdtZW50O1xuICAgIH1cblxuICAgIC8vIFJldHVybnMgbmV4dCBzZWdtZW50IHRoYXQgaXMgdmFsaWQgKHdpdGhpbiB0aWxlLCBpbnNpZGUgYW5nbGUgcmVxdWlyZW1lbnRzIGFuZCB3aXRoaW4gbGluZSBnZW9tZXRyeSkuXG4gICAgZ2V0TmV4dEZpdHRpbmdTZWdtZW50KHNlZ21lbnQpIHtcbiAgICAgICAgc2VnbWVudCA9IHNlZ21lbnQgfHwgdGhpcy5nZXROZXh0U2VnbWVudCgpO1xuICAgICAgICBpZiAoIXNlZ21lbnQpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmRvZXNTZWdtZW50Rml0KHNlZ21lbnQpKSB7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZSgpO1xuICAgICAgICAgICAgaWYgKHRoaXMuaW5UaWxlQm91bmRzKCkgJiYgdGhpcy5pbkFuZ2xlQm91bmRzKCkpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gc2VnbWVudDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLmdldE5leHRGaXR0aW5nU2VnbWVudCgpO1xuICAgIH1cblxuICAgIC8vIFJldHVybnMgYm9vbGVhbiBpbmRpY2F0aW5nIHdoZXRoZXIgY3VycmVudCBzZWdtZW50IGlzIHZhbGlkXG4gICAgZG9lc1NlZ21lbnRGaXQoc2VnbWVudCkge1xuICAgICAgICBzd2l0Y2ggKHRoaXMucGxhY2VtZW50KSB7XG4gICAgICAgICAgICBjYXNlIFBMQUNFTUVOVC5DT1JORVI6XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuZml0S2lua2VkU2VnbWVudChzZWdtZW50KTtcbiAgICAgICAgICAgIGNhc2UgUExBQ0VNRU5ULk1JRF9QT0lOVDpcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5maXRTdHJhaWdodFNlZ21lbnQoc2VnbWVudCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBSZXR1cm5zIGJvb2xlYW4gaW5kaWNhdGluZyB3aGV0aGVyIGtpbmtlZCBzZWdtZW50IGlzIHZhbGlkXG4gICAgLy8gQ3ljbGVzIHRocm91Z2ggdmFyaW91cyB3YXlzIG9mIGtpbmtpbmcgdGhlIGxhYmVscyBhcm91bmQgdGhlIHNlZ21lbnQncyBwaXZvdCxcbiAgICAvLyBmaW5kaW5nIHRoZSBiZXN0IGZpdCwgYW5kIGRldGVybWluZXMgdGhlIGtpbmtfaW5kZXguXG4gICAgZml0S2lua2VkU2VnbWVudChzZWdtZW50KSB7XG4gICAgICAgIGxldCB1cHAgPSB0aGlzLmxheW91dC51bml0c19wZXJfcGl4ZWw7XG5cbiAgICAgICAgbGV0IHAwcDEgPSBWZWN0b3Iuc3ViKHNlZ21lbnRbMF0sIHNlZ21lbnRbMV0pO1xuICAgICAgICBsZXQgcDFwMiA9IFZlY3Rvci5zdWIoc2VnbWVudFsxXSwgc2VnbWVudFsyXSk7XG5cbiAgICAgICAgLy8gRG9uJ3QgZml0IGlmIHNlZ21lbnQgZG9lc24ndCBwYXNzIHRoZSB2ZXJ0aWNhbCBsaW5lIHRlc3QsIHJlc3VsdGluZyBpbiB1cHNpZGUtZG93biBsYWJlbHNcbiAgICAgICAgaWYgKHAwcDFbMF0gKiBwMXAyWzBdIDwgMCAmJiBwMHAxWzFdICogcDFwMlsxXSA+IDApIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBsaW5lX2xlbmd0aDEgPSBWZWN0b3IubGVuZ3RoKHAwcDEpIC8gdXBwO1xuICAgICAgICBsZXQgbGluZV9sZW5ndGgyID0gVmVjdG9yLmxlbmd0aChwMXAyKSAvIHVwcDtcblxuICAgICAgICAvLyBicmVhayB1cCBtdWx0aXBsZSBzZWdtZW50cyBpbnRvIHR3byBjaHVua3MgKE4tMSBvcHRpb25zKVxuICAgICAgICBsZXQgbGFiZWxfbGVuZ3RoMSA9IHRoaXMudG90YWxfbGVuZ3RoO1xuICAgICAgICBsZXQgbGFiZWxfbGVuZ3RoMiA9IDA7XG4gICAgICAgIGxldCB3aWR0aCwgZml0bmVzcyA9IDA7XG4gICAgICAgIGxldCBraW5rX2luZGV4ID0gdGhpcy5udW1fc2VnbWVudHMgLSAxO1xuICAgICAgICBsZXQgZml0bmVzc2VzID0gW107XG5cbiAgICAgICAgd2hpbGUgKGtpbmtfaW5kZXggPiAwKSB7XG4gICAgICAgICAgICB3aWR0aCA9IHRoaXMuc2l6ZVtraW5rX2luZGV4XVswXSArIHRoaXMuc3BhY2Vfd2lkdGg7XG5cbiAgICAgICAgICAgIGxhYmVsX2xlbmd0aDEgLT0gd2lkdGg7XG4gICAgICAgICAgICBsYWJlbF9sZW5ndGgyICs9IHdpZHRoO1xuXG4gICAgICAgICAgICBmaXRuZXNzID0gTWF0aC5tYXgoY2FsY0ZpdG5lc3MobGluZV9sZW5ndGgxLCBsYWJlbF9sZW5ndGgxKSwgY2FsY0ZpdG5lc3MobGluZV9sZW5ndGgyLCBsYWJlbF9sZW5ndGgyKSk7XG4gICAgICAgICAgICBmaXRuZXNzZXMudW5zaGlmdChmaXRuZXNzKTtcblxuICAgICAgICAgICAga2lua19pbmRleC0tO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IG1heF9maXRuZXNzID0gTWF0aC5tYXguYXBwbHkobnVsbCwgZml0bmVzc2VzKTtcblxuICAgICAgICBpZiAobWF4X2ZpdG5lc3MgPCBMSU5FX0VYQ0VFRF9LSU5LRUQpIHtcbiAgICAgICAgICAgIHRoaXMua2lua19pbmRleCA9IGZpdG5lc3Nlcy5pbmRleE9mKG1heF9maXRuZXNzKSArIDE7XG4gICAgICAgICAgICB0aGlzLmZpdG5lc3MgPSBtYXhfZml0bmVzcztcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5raW5rX2luZGV4ID0gMDtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIFJldHVybnMgYm9vbGVhbiBpbmRpY2F0aW5nIHdoZXRoZXIgc3RyYWlnaHQgc2VnbWVudCBpcyB2YWxpZFxuICAgIC8vIEEgc3RyYWlnaHQgc2VnbWVudCBpcyBwbGFjZWQgYXQgdGhlIG1pZHBvaW50IGFuZCBpcyB2YWxpZCBpZiB0aGUgbGFiZWwncyBsZW5ndGggaXMgZ3JlYXRlciB0aGFuIGFcbiAgICAvLyBmYWN0b3IgKExJTkVfRVhDRUVEX1NUUkFJR0hUKSBvZiB0aGUgbGluZSBzZWdtZW50J3MgbGVuZ3RoXG4gICAgZml0U3RyYWlnaHRTZWdtZW50KHNlZ21lbnQpIHtcbiAgICAgICAgbGV0IHVwcCA9IHRoaXMubGF5b3V0LnVuaXRzX3Blcl9waXhlbDtcbiAgICAgICAgbGV0IGxpbmVfbGVuZ3RoID0gVmVjdG9yLmxlbmd0aChWZWN0b3Iuc3ViKHNlZ21lbnRbMF0sIHNlZ21lbnRbMV0pKSAvIHVwcDtcbiAgICAgICAgbGV0IGZpdG5lc3MgPSBjYWxjRml0bmVzcyhsaW5lX2xlbmd0aCwgdGhpcy50b3RhbF9sZW5ndGgpO1xuXG4gICAgICAgIGlmIChmaXRuZXNzIDwgTElORV9FWENFRURfU1RSQUlHSFQpe1xuICAgICAgICAgICAgdGhpcy5maXRuZXNzID0gZml0bmVzcztcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gT25jZSBhIGZpdHRpbmcgc2VnbWVudCBpcyBmb3VuZCwgZGV0ZXJtaW5lIGl0cyBhbmdsZXMsIHBvc2l0aW9ucyBhbmQgYm91bmRpbmcgYm94ZXNcbiAgICB1cGRhdGUoKSB7XG4gICAgICAgIHRoaXMuYW5nbGUgPSB0aGlzLmdldEN1cnJlbnRBbmdsZSgpO1xuICAgICAgICB0aGlzLnBvc2l0aW9uID0gdGhpcy5nZXRDdXJyZW50UG9zaXRpb24oKTtcbiAgICAgICAgdGhpcy51cGRhdGVCQm94ZXMoKTtcbiAgICB9XG5cbiAgICBnZXRDdXJyZW50QW5nbGUoKSB7XG4gICAgICAgIGxldCBzZWdtZW50ID0gdGhpcy5nZXRDdXJyZW50U2VnbWVudCgpO1xuICAgICAgICBsZXQgYW5nbGVzID0gW107XG5cbiAgICAgICAgc3dpdGNoICh0aGlzLnBsYWNlbWVudCkge1xuICAgICAgICAgICAgY2FzZSBQTEFDRU1FTlQuQ09STkVSOlxuICAgICAgICAgICAgICAgIGxldCB0aGV0YTEgPSBnZXRBbmdsZUZyb21TZWdtZW50KHNlZ21lbnRbMF0sIHNlZ21lbnRbMV0pO1xuICAgICAgICAgICAgICAgIGxldCB0aGV0YTIgPSBnZXRBbmdsZUZyb21TZWdtZW50KHNlZ21lbnRbMV0sIHNlZ21lbnRbMl0pO1xuXG4gICAgICAgICAgICAgICAgbGV0IHAwcDEgPSBWZWN0b3Iuc3ViKHNlZ21lbnRbMF0sIHNlZ21lbnRbMV0pO1xuICAgICAgICAgICAgICAgIGxldCBwMXAyID0gVmVjdG9yLnN1YihzZWdtZW50WzFdLCBzZWdtZW50WzJdKTtcblxuICAgICAgICAgICAgICAgIGxldCBvcmllbnRhdGlvbiA9IChwMHAxWzBdID49IDAgJiYgcDFwMlswXSA+PSAwKSA/IDEgOiAtMTtcbiAgICAgICAgICAgICAgICBsZXQgYW5nbGU7XG5cbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMubnVtX3NlZ21lbnRzOyBpKyspe1xuICAgICAgICAgICAgICAgICAgICBpZiAoaSA8IHRoaXMua2lua19pbmRleCl7XG4gICAgICAgICAgICAgICAgICAgICAgICBhbmdsZSA9IChvcmllbnRhdGlvbiA+IDApID8gdGhldGEyIDogdGhldGExO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgYW5nbGUgPSAob3JpZW50YXRpb24gPiAwKSA/IHRoZXRhMSA6IHRoZXRhMjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBhbmdsZXMucHVzaChhbmdsZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBQTEFDRU1FTlQuTUlEX1BPSU5UOlxuICAgICAgICAgICAgICAgIGxldCB0aGV0YSA9IGdldEFuZ2xlRnJvbVNlZ21lbnQoc2VnbWVudFswXSwgc2VnbWVudFsxXSk7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0aGlzLm51bV9zZWdtZW50czsgaSsrKXtcbiAgICAgICAgICAgICAgICAgICAgYW5nbGVzLnB1c2godGhldGEpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBhbmdsZXM7XG4gICAgfVxuXG4gICAgLy8gUmV0dXJuIHRoZSBwb3NpdGlvbiBvZiB0aGUgY2VudGVyIG9mIHRoZSBsYWJlbFxuICAgIGdldEN1cnJlbnRQb3NpdGlvbigpIHtcbiAgICAgICAgbGV0IHNlZ21lbnQgPSB0aGlzLmdldEN1cnJlbnRTZWdtZW50KCk7XG4gICAgICAgIGxldCBwb3NpdGlvbjtcblxuICAgICAgICBzd2l0Y2ggKHRoaXMucGxhY2VtZW50KSB7XG4gICAgICAgICAgICBjYXNlIFBMQUNFTUVOVC5DT1JORVI6XG4gICAgICAgICAgICAgICAgcG9zaXRpb24gPSBzZWdtZW50WzFdLnNsaWNlKCk7XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICBjYXNlIFBMQUNFTUVOVC5NSURfUE9JTlQ6XG4gICAgICAgICAgICAgICAgcG9zaXRpb24gPSBbXG4gICAgICAgICAgICAgICAgICAgIDAuNSAqIChzZWdtZW50WzBdWzBdICsgc2VnbWVudFsxXVswXSksXG4gICAgICAgICAgICAgICAgICAgIDAuNSAqIChzZWdtZW50WzBdWzFdICsgc2VnbWVudFsxXVsxXSlcbiAgICAgICAgICAgICAgICBdO1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHBvc2l0aW9uO1xuICAgIH1cblxuICAgIC8vIENoZWNrIGZvciBhcnRpY3VsYXRlZCBsYWJlbHMgdG8gYmUgd2l0aGluIGFuIGFuZ2xlIHJhbmdlIFstTUFYX0FOR0xFLCArTUFYX0FOR0xFXVxuICAgIGluQW5nbGVCb3VuZHMoKSB7XG4gICAgICAgIHN3aXRjaCAodGhpcy5wbGFjZW1lbnQpIHtcbiAgICAgICAgICAgIGNhc2UgUExBQ0VNRU5ULkNPUk5FUjpcbiAgICAgICAgICAgICAgICBsZXQgYW5nbGUwID0gdGhpcy5hbmdsZVswXTtcbiAgICAgICAgICAgICAgICBpZiAoYW5nbGUwIDwgMCkge1xuICAgICAgICAgICAgICAgICAgICBhbmdsZTAgKz0gMiAqIE1hdGguUEk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgbGV0IGFuZ2xlMSA9IHRoaXMuYW5nbGVbMV07XG4gICAgICAgICAgICAgICAgaWYgKGFuZ2xlMSA8IDApIHtcbiAgICAgICAgICAgICAgICAgICAgYW5nbGUxICs9IDIgKiBNYXRoLlBJO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGxldCB0aGV0YSA9IE1hdGguYWJzKGFuZ2xlMSAtIGFuZ2xlMCk7XG4gICAgICAgICAgICAgICAgdGhldGEgPSBNYXRoLm1pbigyICogTWF0aC5QSSAtIHRoZXRhLCB0aGV0YSk7XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gdGhldGEgPD0gTUFYX0FOR0xFO1xuICAgICAgICAgICAgY2FzZSBQTEFDRU1FTlQuTUlEX1BPSU5UOlxuICAgICAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gQ2FsY3VsYXRlIGJvdW5kaW5nIGJveGVzXG4gICAgdXBkYXRlQkJveGVzKCkge1xuICAgICAgICBsZXQgdXBwID0gdGhpcy5sYXlvdXQudW5pdHNfcGVyX3BpeGVsO1xuICAgICAgICBsZXQgaGVpZ2h0ID0gKHRoaXMudG90YWxfaGVpZ2h0ICsgdGhpcy5sYXlvdXQuYnVmZmVyWzFdICogMikgKiB1cHAgKiBMYWJlbC5lcHNpbG9uO1xuXG4gICAgICAgIC8vIHJlc2V0IGJvdW5kaW5nIGJveGVzXG4gICAgICAgIHRoaXMub2JicyA9IFtdO1xuICAgICAgICB0aGlzLmFhYmJzID0gW107XG5cbiAgICAgICAgLy8gZnVkZ2Ugd2lkdGggdmFsdWUgYXMgdGV4dCBtYXkgb3ZlcmZsb3cgYm91bmRpbmcgYm94IGlmIGl0IGhhcyBpdGFsaWMsIGJvbGQsIGV0YyBzdHlsZVxuICAgICAgICBsZXQgaXRhbGljc19idWZmZXIgPSAodGhpcy5sYXlvdXQuaXRhbGljKSA/IDUgKiB1cHAgOiAwO1xuXG4gICAgICAgIHN3aXRjaCAodGhpcy5wbGFjZW1lbnQpIHtcbiAgICAgICAgICAgIGNhc2UgUExBQ0VNRU5ULkNPUk5FUjpcbiAgICAgICAgICAgICAgICBsZXQgYW5nbGUwID0gdGhpcy5hbmdsZVt0aGlzLmtpbmtfaW5kZXggLSAxXTsgLy8gYW5nbGUgYmVmb3JlIGtpbmtcbiAgICAgICAgICAgICAgICBsZXQgYW5nbGUxID0gdGhpcy5hbmdsZVt0aGlzLmtpbmtfaW5kZXhdOyAvLyBhbmdsZSBhZnRlciBraW5rXG4gICAgICAgICAgICAgICAgbGV0IHRoZXRhID0gTWF0aC5hYnMoYW5nbGUxIC0gYW5nbGUwKTsgLy8gYW5nbGUgZGVsdGFcblxuICAgICAgICAgICAgICAgIC8vIEEgc3ByZWFkIGZhY3RvciBvZiAwIHBpdm90cyB0aGUgYm94ZXMgb24gdGhlaXIgaG9yaXpvbnRhbCBjZW50ZXIsIGxvb2tpbmcgbGlrZTogXCJYXCJcbiAgICAgICAgICAgICAgICAvLyBhIHNwcmVhZCBmYWN0b3Igb2YgMSBvZmZzZXRzIHRoZSBib3hlcyBzbyB0aGF0IHRoZWlyIGNvcm5lcnMgdG91Y2gsIGxvb2tpbmcgbGlrZTogXCJcXC9cIiBvciBcIi9cXFwiXG4gICAgICAgICAgICAgICAgbGV0IGR4ID0gdGhpcy5zcHJlYWRfZmFjdG9yICogTWF0aC5hYnModGhpcy50b3RhbF9oZWlnaHQgKiBNYXRoLnRhbigwLjUgKiB0aGV0YSkpO1xuICAgICAgICAgICAgICAgIGxldCBudWRnZSA9IDAuNSAqICgtZHggLSB0aGlzLnNwYWNlX3dpZHRoKTtcblxuICAgICAgICAgICAgICAgIC8vIFBsYWNlIGxhYmVscyBiYWNrd2FyZHMgZnJvbSBraW5rIGluZGV4XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IHRoaXMua2lua19pbmRleCAtIDE7IGkgPj0gMDsgaS0tKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCB3aWR0aF9weCA9IHRoaXMuc2l6ZVtpXVswXTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGFuZ2xlID0gdGhpcy5hbmdsZVtpXTtcblxuICAgICAgICAgICAgICAgICAgICBsZXQgd2lkdGggPSAod2lkdGhfcHggKyAyICogdGhpcy5sYXlvdXQuYnVmZmVyWzBdKSAqIHVwcCAqIExhYmVsLmVwc2lsb247XG5cbiAgICAgICAgICAgICAgICAgICAgbnVkZ2UgLT0gMC41ICogd2lkdGhfcHg7XG5cbiAgICAgICAgICAgICAgICAgICAgbGV0IG9mZnNldCA9IFZlY3Rvci5yb3QoW251ZGdlICogdXBwLCAwXSwgLWFuZ2xlKTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHBvc2l0aW9uID0gVmVjdG9yLmFkZCh0aGlzLnBvc2l0aW9uLCBvZmZzZXQpO1xuXG4gICAgICAgICAgICAgICAgICAgIGxldCBvYmIgPSBnZXRPQkIocG9zaXRpb24sIHdpZHRoICsgaXRhbGljc19idWZmZXIsIGhlaWdodCwgYW5nbGUsIHRoaXMub2Zmc2V0LCB1cHApO1xuICAgICAgICAgICAgICAgICAgICBsZXQgYWFiYiA9IG9iYi5nZXRFeHRlbnQoKTtcblxuICAgICAgICAgICAgICAgICAgICB0aGlzLm9iYnMucHVzaChvYmIpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmFhYmJzLnB1c2goYWFiYik7XG5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5vZmZzZXRzW2ldID0gW1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sYXlvdXQub2Zmc2V0WzBdICsgbnVkZ2UsXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxheW91dC5vZmZzZXRbMV1cbiAgICAgICAgICAgICAgICAgICAgXTtcblxuICAgICAgICAgICAgICAgICAgICBudWRnZSAtPSAwLjUgKiB3aWR0aF9weCArIHRoaXMuc3BhY2Vfd2lkdGg7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gUGxhY2UgbGFiZWxzIGZvcndhcmRzIGZyb20ga2luayBpbmRleFxuICAgICAgICAgICAgICAgIG51ZGdlID0gMC41ICogKGR4ICsgdGhpcy5zcGFjZV93aWR0aCk7XG5cbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gdGhpcy5raW5rX2luZGV4OyBpIDwgdGhpcy5udW1fc2VnbWVudHM7IGkrKyl7XG4gICAgICAgICAgICAgICAgICAgIGxldCB3aWR0aF9weCA9IHRoaXMuc2l6ZVtpXVswXTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGFuZ2xlID0gdGhpcy5hbmdsZVtpXTtcblxuICAgICAgICAgICAgICAgICAgICBsZXQgd2lkdGggPSAod2lkdGhfcHggKyAyICogdGhpcy5sYXlvdXQuYnVmZmVyWzBdKSAqIHVwcCAqIExhYmVsLmVwc2lsb247XG5cbiAgICAgICAgICAgICAgICAgICAgbnVkZ2UgKz0gMC41ICogd2lkdGhfcHg7XG5cbiAgICAgICAgICAgICAgICAgICAgbGV0IG9mZnNldCA9IFZlY3Rvci5yb3QoW251ZGdlICogdXBwLCAwXSwgLWFuZ2xlKTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHBvc2l0aW9uID0gVmVjdG9yLmFkZCh0aGlzLnBvc2l0aW9uLCBvZmZzZXQpO1xuXG4gICAgICAgICAgICAgICAgICAgIGxldCBvYmIgPSBnZXRPQkIocG9zaXRpb24sIHdpZHRoICsgaXRhbGljc19idWZmZXIsIGhlaWdodCwgYW5nbGUsIHRoaXMub2Zmc2V0LCB1cHApO1xuICAgICAgICAgICAgICAgICAgICBsZXQgYWFiYiA9IG9iYi5nZXRFeHRlbnQoKTtcblxuICAgICAgICAgICAgICAgICAgICB0aGlzLm9iYnMucHVzaChvYmIpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmFhYmJzLnB1c2goYWFiYik7XG5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5vZmZzZXRzW2ldID0gW1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5sYXlvdXQub2Zmc2V0WzBdICsgbnVkZ2UsXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxheW91dC5vZmZzZXRbMV1cbiAgICAgICAgICAgICAgICAgICAgXTtcblxuICAgICAgICAgICAgICAgICAgICBudWRnZSArPSAwLjUgKiB3aWR0aF9weCArIHRoaXMuc3BhY2Vfd2lkdGg7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgY2FzZSBQTEFDRU1FTlQuTUlEX1BPSU5UOlxuICAgICAgICAgICAgICAgIGxldCBzaGlmdCA9IC0wLjUgKiB0aGlzLnRvdGFsX2xlbmd0aDsgLy8gc2hpZnQgZm9yIGNlbnRlcmluZyB0aGUgbGFiZWxzXG5cbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMubnVtX3NlZ21lbnRzOyBpKyspe1xuICAgICAgICAgICAgICAgICAgICBsZXQgd2lkdGhfcHggPSB0aGlzLnNpemVbaV1bMF07XG4gICAgICAgICAgICAgICAgICAgIGxldCB3aWR0aCA9ICh3aWR0aF9weCArIDIgKiB0aGlzLmxheW91dC5idWZmZXJbMF0pICogdXBwICogTGFiZWwuZXBzaWxvbjtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGFuZ2xlID0gdGhpcy5hbmdsZVtpXTtcblxuICAgICAgICAgICAgICAgICAgICBzaGlmdCArPSAwLjUgKiB3aWR0aF9weDtcblxuICAgICAgICAgICAgICAgICAgICBsZXQgb2Zmc2V0ID0gVmVjdG9yLnJvdChbc2hpZnQgKiB1cHAsIDBdLCAtYW5nbGUpO1xuICAgICAgICAgICAgICAgICAgICBsZXQgcG9zaXRpb24gPSBWZWN0b3IuYWRkKHRoaXMucG9zaXRpb24sIG9mZnNldCk7XG5cbiAgICAgICAgICAgICAgICAgICAgbGV0IG9iYiA9IGdldE9CQihwb3NpdGlvbiwgd2lkdGggKyBpdGFsaWNzX2J1ZmZlciwgaGVpZ2h0LCBhbmdsZSwgdGhpcy5vZmZzZXQsIHVwcCk7XG4gICAgICAgICAgICAgICAgICAgIGxldCBhYWJiID0gb2JiLmdldEV4dGVudCgpO1xuXG4gICAgICAgICAgICAgICAgICAgIHRoaXMub2Jicy5wdXNoKG9iYik7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYWFiYnMucHVzaChhYWJiKTtcblxuICAgICAgICAgICAgICAgICAgICB0aGlzLm9mZnNldHNbaV0gPSBbXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmxheW91dC5vZmZzZXRbMF0gKyBzaGlmdCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMubGF5b3V0Lm9mZnNldFsxXVxuICAgICAgICAgICAgICAgICAgICBdO1xuXG4gICAgICAgICAgICAgICAgICAgIHNoaWZ0ICs9IDAuNSAqIHdpZHRoX3B4ICsgdGhpcy5zcGFjZV93aWR0aDtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIENoZWNrcyBlYWNoIHNlZ21lbnQgdG8gc2VlIGlmIGl0IGlzIHdpdGhpbiB0aGUgdGlsZS4gSWYgYW55IHNlZ21lbnQgZmFpbHMgdGhpcyB0ZXN0LCB0aGV5IGFsbCBmYWlsLlxuICAgIC8vIFRPRE86IGxhYmVsIGdyb3VwXG4gICAgaW5UaWxlQm91bmRzKCkge1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMuYWFiYnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGxldCBhYWJiID0gdGhpcy5hYWJic1tpXTtcbiAgICAgICAgICAgIGxldCBvYmogPSB7IGFhYmIgfTtcbiAgICAgICAgICAgIGxldCBpbl9ib3VuZHMgPSBMYWJlbC5wcm90b3R5cGUuaW5UaWxlQm91bmRzLmNhbGwob2JqKTtcbiAgICAgICAgICAgIGlmICghaW5fYm91bmRzKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIC8vIEFkZHMgZWFjaCBzZWdtZW50IHRvIHRoZSBjb2xsaXNpb24gcGFzcyBhcyBpdHMgb3duIGJvdW5kaW5nIGJveFxuICAgIC8vIFRPRE86IGxhYmVsIGdyb3VwXG4gICAgYWRkKGJib3hlcykge1xuICAgICAgICB0aGlzLnBsYWNlZCA9IHRydWU7XG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgdGhpcy5hYWJicy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgbGV0IGFhYmIgPSB0aGlzLmFhYmJzW2ldO1xuICAgICAgICAgICAgbGV0IG9iYiA9IHRoaXMub2Jic1tpXTtcbiAgICAgICAgICAgIGxldCBvYmogPSB7IGFhYmIsIG9iYiB9O1xuICAgICAgICAgICAgTGFiZWwucHJvdG90eXBlLmFkZC5jYWxsKG9iaiwgYmJveGVzKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIENoZWNrcyBlYWNoIHNlZ21lbnQgdG8gc2VlIGlmIGl0IHNob3VsZCBiZSBkaXNjYXJkZWQgKHZpYSBjb2xsaXNpb24pLiBJZiBhbnkgc2VnbWVudCBmYWlscyB0aGlzIHRlc3QsIHRoZXkgYWxsIGZhaWwuXG4gICAgLy8gVE9ETzogbGFiZWwgZ3JvdXBcbiAgICBkaXNjYXJkKGJib3hlcywgZXhjbHVkZSA9IG51bGwpIHtcbiAgICAgICAgaWYgKHRoaXMudGhyb3dfYXdheSkge1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHRoaXMub2Jicy5sZW5ndGg7IGkrKyl7XG4gICAgICAgICAgICBsZXQgYWFiYiA9IHRoaXMuYWFiYnNbaV07XG4gICAgICAgICAgICBsZXQgb2JiID0gdGhpcy5vYmJzW2ldO1xuICAgICAgICAgICAgbGV0IG9iaiA9IHsgYWFiYiwgb2JiIH07XG5cbiAgICAgICAgICAgIGxldCBzaG91bGREaXNjYXJkID0gTGFiZWwucHJvdG90eXBlLm9jY2x1ZGVkLmNhbGwob2JqLCBiYm94ZXMsIGV4Y2x1ZGUpO1xuICAgICAgICAgICAgaWYgKHNob3VsZERpc2NhcmQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxufVxuXG4vLyBQcml2YXRlIG1ldGhvZCB0byBjYWxjdWxhdGUgb3JpZW50ZWQgYm91bmRpbmcgYm94XG5mdW5jdGlvbiBnZXRPQkIocG9zaXRpb24sIHdpZHRoLCBoZWlnaHQsIGFuZ2xlLCBvZmZzZXQsIHVwcCkge1xuICAgIGxldCBwMCwgcDE7XG4gICAgLy8gYXBwbHkgb2Zmc2V0LCB4IHBvc2l0aXZlLCB5IHBvaW50aW5nIGRvd25cbiAgICBpZiAob2Zmc2V0ICYmIChvZmZzZXRbMF0gIT09IDAgfHwgb2Zmc2V0WzFdICE9PSAwKSkge1xuICAgICAgICBvZmZzZXQgPSBWZWN0b3Iucm90KG9mZnNldCwgYW5nbGUpO1xuICAgICAgICBwMCA9IHBvc2l0aW9uWzBdICsgKG9mZnNldFswXSAqIHVwcCk7XG4gICAgICAgIHAxID0gcG9zaXRpb25bMV0gLSAob2Zmc2V0WzFdICogdXBwKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHAwID0gcG9zaXRpb25bMF07XG4gICAgICAgIHAxID0gcG9zaXRpb25bMV07XG4gICAgfVxuXG4gICAgLy8gdGhlIGFuZ2xlIG9mIHRoZSBvYmIgaXMgbmVnYXRpdmUgc2luY2UgaXQncyB0aGUgdGlsZSBzeXN0ZW0geSBheGlzIGlzIHBvaW50aW5nIGRvd25cbiAgICByZXR1cm4gbmV3IE9CQihwMCwgcDEsIC1hbmdsZSwgd2lkdGgsIGhlaWdodCk7XG59XG5cbi8vIFByaXZhdGUgbWV0aG9kIHRvIGNhbGN1bGF0ZSB0aGUgYW5nbGUgb2YgYSBzZWdtZW50LlxuLy8gVHJhbnNmb3JtcyB0aGUgYW5nbGUgdG8gbGllIHdpdGhpbiB0aGUgcmFuZ2UgWzAsIFBJLzJdIGFuZCBbMypQSS8yLCAyKlBJXSAoMXN0IG9yIDR0aCBxdWFkcmFudHMpXG4vLyBhcyBvdGhlciByYW5nZXMgcHJvZHVjZSBcInVwc2lkZSBkb3duXCIgbGFiZWxzXG5mdW5jdGlvbiBnZXRBbmdsZUZyb21TZWdtZW50KHB0MSwgcHQyKSB7XG4gICAgbGV0IFBJID0gTWF0aC5QSTtcbiAgICBsZXQgUElfMiA9IFBJIC8gMjtcbiAgICBsZXQgcDFwMiA9IFZlY3Rvci5zdWIocHQxLCBwdDIpO1xuICAgIGxldCB0aGV0YSA9IE1hdGguYXRhbjIocDFwMlswXSwgcDFwMlsxXSkgKyBQSV8yO1xuXG4gICAgaWYgKHRoZXRhID4gUElfMikge1xuICAgICAgICAvLyBJZiBpbiAybmQgcXVhZHJhbnQsIG1vdmUgdG8gNHRoIHF1YWRyYW50XG4gICAgICAgIHRoZXRhICs9IFBJO1xuICAgICAgICB0aGV0YSAlPSAyICogTWF0aC5QSTtcbiAgICB9XG4gICAgZWxzZSBpZiAodGhldGEgPCAwKSB7XG4gICAgICAgIC8vIElmIGluIDR0aCBxdWFkcmFudCwgbWFrZSBhIHBvc2l0aXZlIGFuZ2xlXG4gICAgICAgIHRoZXRhICs9IDIgKiBQSTtcbiAgICB9XG5cbiAgICByZXR1cm4gdGhldGE7XG59XG5cbmZ1bmN0aW9uIGNhbGNGaXRuZXNzKGxpbmVfbGVuZ3RoLCBsYWJlbF9sZW5ndGgpe1xuICAgIHJldHVybiAxIC0gbGluZV9sZW5ndGggLyBsYWJlbF9sZW5ndGg7XG59XG4iLCJpbXBvcnQgTGFiZWwgZnJvbSAnLi9sYWJlbCc7XG5pbXBvcnQgUG9pbnRBbmNob3IgZnJvbSAnLi9wb2ludF9hbmNob3InO1xuaW1wb3J0IEdlbyBmcm9tICcuLi9nZW8nO1xuaW1wb3J0IE9CQiBmcm9tICcuLi91dGlscy9vYmInO1xuaW1wb3J0IHtTdHlsZVBhcnNlcn0gZnJvbSAnLi4vc3R5bGVzL3N0eWxlX3BhcnNlcic7XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIExhYmVsUG9pbnQgZXh0ZW5kcyBMYWJlbCB7XG5cbiAgICBjb25zdHJ1Y3RvciAocG9zaXRpb24sIHNpemUsIGxheW91dCkge1xuICAgICAgICBzdXBlcihzaXplLCBsYXlvdXQpO1xuICAgICAgICB0aGlzLnBvc2l0aW9uID0gW3Bvc2l0aW9uWzBdLCBwb3NpdGlvblsxXV07XG4gICAgICAgIHRoaXMucGFyZW50ID0gdGhpcy5sYXlvdXQucGFyZW50O1xuICAgICAgICB0aGlzLnVwZGF0ZSgpO1xuXG4gICAgICAgIGlmICh0aGlzLmxheW91dC5hbmNob3IpIHtcbiAgICAgICAgICAgIHRoaXMuc3RhcnRfYW5jaG9yX2luZGV4ID0gMTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBoYXNOZXh0ID0gdGhpcy5nZXROZXh0Rml0KCk7XG4gICAgICAgIHRoaXMudGhyb3dfYXdheSA9ICFoYXNOZXh0O1xuICAgIH1cblxuICAgIHVwZGF0ZSgpIHtcbiAgICAgICAgc3VwZXIudXBkYXRlKCk7XG4gICAgICAgIHRoaXMuY29tcHV0ZU9mZnNldCgpO1xuICAgICAgICB0aGlzLnVwZGF0ZUJCb3hlcygpO1xuICAgIH1cblxuICAgIGNvbXB1dGVPZmZzZXQgKCkge1xuICAgICAgICB0aGlzLm9mZnNldCA9IFt0aGlzLmxheW91dC5vZmZzZXRbMF0sIHRoaXMubGF5b3V0Lm9mZnNldFsxXV07XG5cbiAgICAgICAgLy8gQWRkaXRpb25hbCBhbmNob3Ivb2Zmc2V0IGZvciBwb2ludDpcbiAgICAgICAgaWYgKHRoaXMucGFyZW50KSB7XG4gICAgICAgICAgICBsZXQgcGFyZW50ID0gdGhpcy5wYXJlbnQ7XG4gICAgICAgICAgICAvLyBwb2ludCdzIG93biBhbmNob3IsIHRleHQgYW5jaG9yIGFwcGxpZWQgdG8gcG9pbnQsIGFkZGl0aW9uYWwgcG9pbnQgb2Zmc2V0XG4gICAgICAgICAgICB0aGlzLm9mZnNldCA9IFBvaW50QW5jaG9yLmNvbXB1dGVPZmZzZXQodGhpcy5vZmZzZXQsIHBhcmVudC5zaXplLCBwYXJlbnQuYW5jaG9yLCBQb2ludEFuY2hvci56ZXJvX2J1ZmZlcik7XG4gICAgICAgICAgICB0aGlzLm9mZnNldCA9IFBvaW50QW5jaG9yLmNvbXB1dGVPZmZzZXQodGhpcy5vZmZzZXQsIHBhcmVudC5zaXplLCB0aGlzLmFuY2hvciwgUG9pbnRBbmNob3IuemVyb19idWZmZXIpO1xuICAgICAgICAgICAgaWYgKHBhcmVudC5vZmZzZXQgIT09IFN0eWxlUGFyc2VyLnplcm9QYWlyKSB7ICAgICAgICAvLyBwb2ludCBoYXMgYW4gb2Zmc2V0XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMub2Zmc2V0ID09PSBTdHlsZVBhcnNlci56ZXJvUGFpcikgeyAgICAgIC8vIG5vIHRleHQgb2Zmc2V0LCB1c2UgcG9pbnQnc1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm9mZnNldCA9IHBhcmVudC5vZmZzZXQ7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0ZXh0IGhhcyBvZmZzZXQsIGFkZCBwb2ludCdzXG4gICAgICAgICAgICAgICAgICAgIHRoaXMub2Zmc2V0WzBdICs9IHBhcmVudC5vZmZzZXRbMF07XG4gICAgICAgICAgICAgICAgICAgIHRoaXMub2Zmc2V0WzFdICs9IHBhcmVudC5vZmZzZXRbMV07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5vZmZzZXQgPSBQb2ludEFuY2hvci5jb21wdXRlT2Zmc2V0KHRoaXMub2Zmc2V0LCB0aGlzLnNpemUsIHRoaXMuYW5jaG9yKTtcbiAgICB9XG5cbiAgICB1cGRhdGVCQm94ZXMgKCkge1xuICAgICAgICBsZXQgd2lkdGggPSAodGhpcy5zaXplWzBdICsgdGhpcy5sYXlvdXQuYnVmZmVyWzBdICogMikgKiB0aGlzLmxheW91dC51bml0c19wZXJfcGl4ZWwgKiBMYWJlbC5lcHNpbG9uO1xuICAgICAgICBsZXQgaGVpZ2h0ID0gKHRoaXMuc2l6ZVsxXSArIHRoaXMubGF5b3V0LmJ1ZmZlclsxXSAqIDIpICogdGhpcy5sYXlvdXQudW5pdHNfcGVyX3BpeGVsICogTGFiZWwuZXBzaWxvbjtcblxuICAgICAgICAvLyBmdWRnZSB3aWR0aCB2YWx1ZSBhcyB0ZXh0IG1heSBvdmVyZmxvdyBib3VuZGluZyBib3ggaWYgaXQgaGFzIGl0YWxpYywgYm9sZCwgZXRjIHN0eWxlXG4gICAgICAgIGlmICh0aGlzLmxheW91dC5pdGFsaWMpe1xuICAgICAgICAgICAgd2lkdGggKz0gNSAqIHRoaXMubGF5b3V0LnVuaXRzX3Blcl9waXhlbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBwID0gW1xuICAgICAgICAgICAgdGhpcy5wb3NpdGlvblswXSArICh0aGlzLm9mZnNldFswXSAqIHRoaXMubGF5b3V0LnVuaXRzX3Blcl9waXhlbCksXG4gICAgICAgICAgICB0aGlzLnBvc2l0aW9uWzFdIC0gKHRoaXMub2Zmc2V0WzFdICogdGhpcy5sYXlvdXQudW5pdHNfcGVyX3BpeGVsKVxuICAgICAgICBdO1xuXG4gICAgICAgIHRoaXMub2JiID0gbmV3IE9CQihwWzBdLCBwWzFdLCAwLCB3aWR0aCwgaGVpZ2h0KTtcbiAgICAgICAgdGhpcy5hYWJiID0gdGhpcy5vYmIuZ2V0RXh0ZW50KCk7XG4gICAgfVxuXG4gICAgLy8gVHJ5IHRvIG1vdmUgdGhlIGxhYmVsIGludG8gdGhlIHRpbGUgYm91bmRzXG4gICAgLy8gUmV0dXJucyB0cnVlIGlmIGxhYmVsIHdhcyBtb3ZlZCBpbnRvIHRpbGUsIGZhbHNlIGlmIGl0IGNvdWxkbid0IGJlIG1vdmVkXG4gICAgbW92ZUludG9UaWxlICgpIHtcbiAgICAgICAgbGV0IHVwZGF0ZWQgPSBmYWxzZTtcblxuICAgICAgICBpZiAodGhpcy5hYWJiWzBdIDwgMCkge1xuICAgICAgICAgICAgdGhpcy5wb3NpdGlvblswXSArPSAtdGhpcy5hYWJiWzBdO1xuICAgICAgICAgICAgdXBkYXRlZCA9IHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5hYWJiWzJdID49IEdlby50aWxlX3NjYWxlKSB7XG4gICAgICAgICAgICB0aGlzLnBvc2l0aW9uWzBdIC09IHRoaXMuYWFiYlsyXSAtIEdlby50aWxlX3NjYWxlICsgMTtcbiAgICAgICAgICAgIHVwZGF0ZWQgPSB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuYWFiYlszXSA+IDApIHtcbiAgICAgICAgICAgIHRoaXMucG9zaXRpb25bMV0gLT0gdGhpcy5hYWJiWzNdO1xuICAgICAgICAgICAgdXBkYXRlZCA9IHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5hYWJiWzFdIDw9IC1HZW8udGlsZV9zY2FsZSkge1xuICAgICAgICAgICAgdGhpcy5wb3NpdGlvblsxXSAtPSB0aGlzLmFhYmJbMV0gKyBHZW8udGlsZV9zY2FsZSAtIDE7XG4gICAgICAgICAgICB1cGRhdGVkID0gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh1cGRhdGVkKSB7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZUJCb3hlcygpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHVwZGF0ZWQ7XG4gICAgfVxuXG4gICAgZ2V0TmV4dEZpdCgpIHtcbiAgICAgICAgaWYgKCF0aGlzLmxheW91dC5jdWxsX2Zyb21fdGlsZSB8fCB0aGlzLmluVGlsZUJvdW5kcygpKSB7XG4gICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLmxheW91dC5tb3ZlX2ludG9fdGlsZSl7XG4gICAgICAgICAgICB0aGlzLm1vdmVJbnRvVGlsZSgpO1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheSh0aGlzLmxheW91dC5hbmNob3IpKSB7XG4gICAgICAgICAgICAgICAgLy8gU3RhcnQgb24gc2Vjb25kIGFuY2hvciAoZmlyc3QgYW5jaG9yIHdhcyBzZXQgb24gY3JlYXRpb24pXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDE7IGkgPCB0aGlzLmxheW91dC5hbmNob3IubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5hbmNob3IgPSB0aGlzLmxheW91dC5hbmNob3JbaV07XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlKCk7XG5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zdGFydF9hbmNob3JfaW5kZXggPSBpO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmluVGlsZUJvdW5kcygpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gbm8gYW5jaG9ycyByZXN1bHQgaW4gZml0XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBkaXNjYXJkIChiYm94ZXMsIGV4Y2x1ZGUgPSBudWxsKSB7XG4gICAgICAgIGlmIChzdXBlci5kaXNjYXJkKGJib3hlcywgZXhjbHVkZSkpIHtcbiAgICAgICAgICAgIC8vIElmIG1vcmUgdGhhbiBvbmUgYW5jaG9yIHNwZWNpZmllZCwgdHJ5IHRoZW0gaW4gb3JkZXJcbiAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KHRoaXMubGF5b3V0LmFuY2hvcikpIHtcbiAgICAgICAgICAgICAgICAvLyBTdGFydCBvbiBzZWNvbmQgYW5jaG9yIChmaXJzdCBhbmNob3Igd2FzIHNldCBvbiBjcmVhdGlvbilcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpPXRoaXMuc3RhcnRfYW5jaG9yX2luZGV4OyBpIDwgdGhpcy5sYXlvdXQuYW5jaG9yLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuYW5jaG9yID0gdGhpcy5sYXlvdXQuYW5jaG9yW2ldO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZSgpO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLmxheW91dC5jdWxsX2Zyb21fdGlsZSAmJiAhdGhpcy5pblRpbGVCb3VuZHMoKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBpZiAoIXN1cGVyLmRpc2NhcmQoYmJveGVzLCBleGNsdWRlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxufVxuXG4vLyBQbGFjZW1lbnQgc3RyYXRlZ2llc1xuTGFiZWxQb2ludC5QTEFDRU1FTlQgPSB7XG4gICAgVkVSVEVYOiAwLCAgICAgICAgICAvLyBwbGFjZSBsYWJlbHMgYXQgZW5kcG9pbnRzIG9mIGxpbmUgc2VnbWVudHNcbiAgICBNSURQT0lOVDogMSwgICAgICAgIC8vIHBsYWNlIGxhYmVscyBhdCBtaWRwb2ludHMgb2YgbGluZSBzZWdtZW50c1xuICAgIFNQQUNFRDogMiwgICAgICAgICAgLy8gcGxhY2UgbGFiZWxzIGVxdWFsbHkgc3BhY2VkIGFsb25nIGxpbmVcbiAgICBDRU5UUk9JRDogMyAgICAgICAgIC8vIHBsYWNlIGxhYmVscyBhdCBjZW50ZXIgb2YgcG9seWdvbnNcbn07XG4iLCIvLyBTZXRzIG9mIHZhbHVlcyB0byBtYXRjaCBmb3IgZGlyZWN0aW9uYWwgYW5kIGNvcm5lciBhbmNob3JzXG5jb25zdCBsZWZ0cyA9IFsnbGVmdCcsICd0b3AtbGVmdCcsICdib3R0b20tbGVmdCddO1xuY29uc3QgcmlnaHRzID0gWydyaWdodCcsICd0b3AtcmlnaHQnLCAnYm90dG9tLXJpZ2h0J107XG5jb25zdCB0b3BzID0gWyd0b3AnLCAndG9wLWxlZnQnLCAndG9wLXJpZ2h0J107XG5jb25zdCBib3R0b21zID0gWydib3R0b20nLCAnYm90dG9tLWxlZnQnLCAnYm90dG9tLXJpZ2h0J107XG5cbmxldCBQb2ludEFuY2hvcjtcblxuZXhwb3J0IGRlZmF1bHQgUG9pbnRBbmNob3IgPSB7XG5cbiAgICBjb21wdXRlT2Zmc2V0IChvZmZzZXQsIHNpemUsIGFuY2hvciwgYnVmZmVyID0gbnVsbCkge1xuICAgICAgICBpZiAoIWFuY2hvciB8fCBhbmNob3IgPT09ICdjZW50ZXInKSB7XG4gICAgICAgICAgICByZXR1cm4gb2Zmc2V0O1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IG9mZnNldDIgPSBbb2Zmc2V0WzBdLCBvZmZzZXRbMV1dO1xuICAgICAgICBidWZmZXIgPSBidWZmZXIgfHwgdGhpcy5kZWZhdWx0X2J1ZmZlcjtcblxuICAgICAgICAvLyBBbiBvcHRpb25hbCBsZWZ0L3JpZ2h0IG9mZnNldFxuICAgICAgICBpZiAodGhpcy5pc0xlZnRBbmNob3IoYW5jaG9yKSkge1xuICAgICAgICAgICAgb2Zmc2V0MlswXSAtPSBzaXplWzBdIC8gMjtcbiAgICAgICAgICAgIGlmIChhbmNob3IgPT09ICdsZWZ0Jykge1xuICAgICAgICAgICAgICAgIG9mZnNldDJbMF0gLT0gYnVmZmVyWzBdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHRoaXMuaXNSaWdodEFuY2hvcihhbmNob3IpKSB7XG4gICAgICAgICAgICBvZmZzZXQyWzBdICs9IHNpemVbMF0gLyAyO1xuICAgICAgICAgICAgaWYgKGFuY2hvciA9PT0gJ3JpZ2h0Jykge1xuICAgICAgICAgICAgICAgIG9mZnNldDJbMF0gKz0gYnVmZmVyWzFdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gQW4gb3B0aW9uYWwgdG9wL2JvdHRvbSBvZmZzZXRcbiAgICAgICAgaWYgKHRoaXMuaXNUb3BBbmNob3IoYW5jaG9yKSkge1xuICAgICAgICAgICAgb2Zmc2V0MlsxXSAtPSBzaXplWzFdIC8gMjtcbiAgICAgICAgICAgIGlmIChhbmNob3IgPT09ICd0b3AnKSB7XG4gICAgICAgICAgICAgICAgb2Zmc2V0MlsxXSAtPSBidWZmZXJbMl07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodGhpcy5pc0JvdHRvbUFuY2hvcihhbmNob3IpKSB7XG4gICAgICAgICAgICBvZmZzZXQyWzFdICs9IHNpemVbMV0gLyAyO1xuICAgICAgICAgICAgaWYgKGFuY2hvciA9PT0gJ2JvdHRvbScpIHtcbiAgICAgICAgICAgICAgICBvZmZzZXQyWzFdICs9IGJ1ZmZlclszXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBvZmZzZXQyO1xuICAgIH0sXG5cbiAgICBhbGlnbkZvckFuY2hvciAoYW5jaG9yKSB7XG4gICAgICAgIGlmIChhbmNob3IgJiYgYW5jaG9yICE9PSAnY2VudGVyJykge1xuICAgICAgICAgICAgaWYgKHRoaXMuaXNMZWZ0QW5jaG9yKGFuY2hvcikpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gJ3JpZ2h0JztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKHRoaXMuaXNSaWdodEFuY2hvcihhbmNob3IpKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuICdsZWZ0JztcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gJ2NlbnRlcic7XG4gICAgfSxcblxuICAgIGlzTGVmdEFuY2hvciAoYW5jaG9yKSB7XG4gICAgICAgIHJldHVybiAobGVmdHMuaW5kZXhPZihhbmNob3IpID4gLTEpO1xuICAgIH0sXG5cbiAgICBpc1JpZ2h0QW5jaG9yIChhbmNob3IpIHtcbiAgICAgICAgcmV0dXJuIChyaWdodHMuaW5kZXhPZihhbmNob3IpID4gLTEpO1xuICAgIH0sXG5cbiAgICBpc1RvcEFuY2hvciAoYW5jaG9yKSB7XG4gICAgICAgIHJldHVybiAodG9wcy5pbmRleE9mKGFuY2hvcikgPiAtMSk7XG4gICAgfSxcblxuICAgIGlzQm90dG9tQW5jaG9yIChhbmNob3IpIHtcbiAgICAgICAgcmV0dXJuIChib3R0b21zLmluZGV4T2YoYW5jaG9yKSA+IC0xKTtcbiAgICB9LFxuXG4gICAgLy8gQnVmZmVyczogW2xlZnQsIHJpZ2h0LCB0b3AsIGJvdHRvbV1cbiAgICBkZWZhdWx0X2J1ZmZlcjogWzIuNSwgMi41LCAxLjUsIDAuNzVdLFxuICAgIHplcm9fYnVmZmVyOiBbMCwgMCwgMCwgMF1cblxufTtcbiIsIi8vIExvZ2ljIGZvciBwbGFjaW5nIHBvaW50IGxhYmVscyBhbG9uZyBhIGxpbmUgZ2VvbWV0cnlcblxuaW1wb3J0IExhYmVsUG9pbnQgZnJvbSAnLi9sYWJlbF9wb2ludCc7XG5pbXBvcnQge2lzQ29vcmRPdXRzaWRlVGlsZX0gZnJvbSAnLi4vYnVpbGRlcnMvY29tbW9uJztcblxuY29uc3QgUExBQ0VNRU5UID0gTGFiZWxQb2ludC5QTEFDRU1FTlQ7XG5jb25zdCBkZWZhdWx0X3NwYWNpbmcgPSA4MDsgLy8gc3BhY2luZyBvZiBwb2ludHMgYWxvbmcgbGluZSBpbiBwaXhlbHNcblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gcGxhY2VQb2ludHNPbkxpbmUgKGxpbmUsIHNpemUsIG9wdGlvbnMpIHtcbiAgICBsZXQgbGFiZWxzID0gW107XG4gICAgbGV0IHN0cmF0ZWd5ID0gb3B0aW9ucy5wbGFjZW1lbnQ7XG4gICAgbGV0IG1pbl9sZW5ndGggPSBNYXRoLm1heChzaXplWzBdLCBzaXplWzFdKSAqIG9wdGlvbnMucGxhY2VtZW50X21pbl9sZW5ndGhfcmF0aW8gKiBvcHRpb25zLnVuaXRzX3Blcl9waXhlbDtcblxuICAgIHN3aXRjaCAoc3RyYXRlZ3kpe1xuICAgICAgICBjYXNlIFBMQUNFTUVOVC5TUEFDRUQ6XG4gICAgICAgICAgICBsZXQgcmVzdWx0ID0gZ2V0UG9zaXRpb25zQW5kQW5nbGVzKGxpbmUsIG1pbl9sZW5ndGgsIG9wdGlvbnMpO1xuICAgICAgICAgICAgLy8gZmFsc2Ugd2lsbCBiZSByZXR1cm5lZCBpZiBsaW5lIGhhdmUgbm8gbGVuZ3RoXG4gICAgICAgICAgICBpZiAoIXJlc3VsdCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBbXTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgbGV0IHBvc2l0aW9ucyA9IHJlc3VsdC5wb3NpdGlvbnM7XG4gICAgICAgICAgICBsZXQgYW5nbGVzID0gcmVzdWx0LmFuZ2xlcztcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgcG9zaXRpb25zLmxlbmd0aDsgaSsrKXtcbiAgICAgICAgICAgICAgICBsZXQgcG9zaXRpb24gPSBwb3NpdGlvbnNbaV07XG4gICAgICAgICAgICAgICAgbGV0IGFuZ2xlID0gYW5nbGVzW2ldO1xuICAgICAgICAgICAgICAgIGlmIChvcHRpb25zLnRpbGVfZWRnZXMgPT09IHRydWUgfHwgIWlzQ29vcmRPdXRzaWRlVGlsZShwb3NpdGlvbikpIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGxhYmVsID0gbmV3IExhYmVsUG9pbnQocG9zaXRpb24sIHNpemUsIG9wdGlvbnMpO1xuICAgICAgICAgICAgICAgICAgICBsYWJlbC5hbmdsZSA9IGFuZ2xlO1xuICAgICAgICAgICAgICAgICAgICBsYWJlbHMucHVzaChsYWJlbCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgUExBQ0VNRU5ULlZFUlRFWDpcbiAgICAgICAgICAgIGxldCBwLCBxLCBsYWJlbDtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGluZS5sZW5ndGggLSAxOyBpKyspe1xuICAgICAgICAgICAgICAgIHAgPSBsaW5lW2ldO1xuICAgICAgICAgICAgICAgIHEgPSBsaW5lW2kgKyAxXTtcbiAgICAgICAgICAgICAgICBpZiAob3B0aW9ucy50aWxlX2VkZ2VzID09PSB0cnVlIHx8ICFpc0Nvb3JkT3V0c2lkZVRpbGUocCkpIHtcbiAgICAgICAgICAgICAgICAgICAgbGFiZWwgPSBuZXcgTGFiZWxQb2ludChwLCBzaXplLCBvcHRpb25zKTtcbiAgICAgICAgICAgICAgICAgICAgbGFiZWwuYW5nbGUgPSBnZXRBbmdsZShwLCBxLCBvcHRpb25zLmFuZ2xlKTtcbiAgICAgICAgICAgICAgICAgICAgbGFiZWxzLnB1c2gobGFiZWwpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gYWRkIGxhc3QgZW5kcG9pbnRcbiAgICAgICAgICAgIGxhYmVsID0gbmV3IExhYmVsUG9pbnQocSwgc2l6ZSwgb3B0aW9ucyk7XG4gICAgICAgICAgICBsYWJlbC5hbmdsZSA9IGdldEFuZ2xlKHAsIHEsIG9wdGlvbnMuYW5nbGUpO1xuICAgICAgICAgICAgbGFiZWxzLnB1c2gobGFiZWwpO1xuICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgIGNhc2UgUExBQ0VNRU5ULk1JRFBPSU5UOlxuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBsaW5lLmxlbmd0aCAtIDE7IGkrKyl7XG4gICAgICAgICAgICAgICAgbGV0IHAgPSBsaW5lW2ldO1xuICAgICAgICAgICAgICAgIGxldCBxID0gbGluZVtpICsgMV07XG4gICAgICAgICAgICAgICAgbGV0IHBvc2l0aW9uID0gW1xuICAgICAgICAgICAgICAgICAgICAwLjUgKiAocFswXSArIHFbMF0pLFxuICAgICAgICAgICAgICAgICAgICAwLjUgKiAocFsxXSArIHFbMV0pXG4gICAgICAgICAgICAgICAgXTtcbiAgICAgICAgICAgICAgICBpZiAob3B0aW9ucy50aWxlX2VkZ2VzID09PSB0cnVlIHx8ICFpc0Nvb3JkT3V0c2lkZVRpbGUocG9zaXRpb24pKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghbWluX2xlbmd0aCB8fCBub3JtKHAsIHEpID4gbWluX2xlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGxhYmVsID0gbmV3IExhYmVsUG9pbnQocG9zaXRpb24sIHNpemUsIG9wdGlvbnMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWwuYW5nbGUgPSBnZXRBbmdsZShwLCBxLCBvcHRpb25zLmFuZ2xlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVscy5wdXNoKGxhYmVsKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGJyZWFrO1xuICAgIH1cbiAgICByZXR1cm4gbGFiZWxzO1xufVxuXG5mdW5jdGlvbiBnZXRQb3NpdGlvbnNBbmRBbmdsZXMobGluZSwgbWluX2xlbmd0aCwgb3B0aW9ucyl7XG4gICAgbGV0IHVwcCA9IG9wdGlvbnMudW5pdHNfcGVyX3BpeGVsO1xuICAgIGxldCBzcGFjaW5nID0gKG9wdGlvbnMucGxhY2VtZW50X3NwYWNpbmcgfHwgZGVmYXVsdF9zcGFjaW5nKSAqIHVwcDtcblxuICAgIGxldCBsZW5ndGggPSBnZXRMaW5lTGVuZ3RoKGxpbmUpO1xuICAgIGlmIChsZW5ndGggPD0gbWluX2xlbmd0aCkge1xuICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgfVxuXG4gICAgbGV0IG51bV9sYWJlbHMgPSBNYXRoLm1heChNYXRoLmZsb29yKGxlbmd0aCAvIHNwYWNpbmcpLCAxKTtcbiAgICBsZXQgcmVtYWluZGVyID0gbGVuZ3RoIC0gKG51bV9sYWJlbHMgLSAxKSAqIHNwYWNpbmc7XG4gICAgbGV0IHBvc2l0aW9ucyA9IFtdO1xuICAgIGxldCBhbmdsZXMgPSBbXTtcblxuICAgIGxldCBkaXN0YW5jZSA9IDAuNSAqIHJlbWFpbmRlcjtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IG51bV9sYWJlbHM7IGkrKyl7XG4gICAgICAgIGxldCB7cG9zaXRpb24sIGFuZ2xlfSA9IGludGVycG9sYXRlTGluZShsaW5lLCBkaXN0YW5jZSwgbWluX2xlbmd0aCwgb3B0aW9ucyk7XG4gICAgICAgIGlmIChwb3NpdGlvbiAhPSBudWxsICYmIGFuZ2xlICE9IG51bGwpIHtcbiAgICAgICAgICAgIHBvc2l0aW9ucy5wdXNoKHBvc2l0aW9uKTtcbiAgICAgICAgICAgIGFuZ2xlcy5wdXNoKGFuZ2xlKTtcbiAgICAgICAgfVxuICAgICAgICBkaXN0YW5jZSArPSBzcGFjaW5nO1xuICAgIH1cblxuICAgIHJldHVybiB7cG9zaXRpb25zLCBhbmdsZXN9O1xufVxuXG5mdW5jdGlvbiBnZXRBbmdsZShwLCBxLCBhbmdsZSA9IDApe1xuICAgIHJldHVybiAoYW5nbGUgPT09ICdhdXRvJykgPyBNYXRoLmF0YW4yKHFbMF0gLSBwWzBdLCBxWzFdIC0gcFsxXSkgOiBhbmdsZTtcbn1cblxuZnVuY3Rpb24gZ2V0TGluZUxlbmd0aChsaW5lKXtcbiAgICBsZXQgZGlzdGFuY2UgPSAwO1xuICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGluZS5sZW5ndGggLSAxOyBpKyspe1xuICAgICAgICBkaXN0YW5jZSArPSBub3JtKGxpbmVbaV0sIGxpbmVbaSsxXSk7XG4gICAgfVxuICAgIHJldHVybiBkaXN0YW5jZTtcbn1cblxuZnVuY3Rpb24gbm9ybShwLCBxKXtcbiAgICByZXR1cm4gTWF0aC5zcXJ0KE1hdGgucG93KHBbMF0gLSBxWzBdLCAyKSArIE1hdGgucG93KHBbMV0gLSBxWzFdLCAyKSk7XG59XG5cbmZ1bmN0aW9uIGludGVycG9sYXRlTGluZShsaW5lLCBkaXN0YW5jZSwgbWluX2xlbmd0aCwgb3B0aW9ucyl7XG4gICAgbGV0IHN1bSA9IDA7XG4gICAgbGV0IHBvc2l0aW9uLCBhbmdsZTtcbiAgICBmb3IgKGxldCBpID0gMDsgaSA8IGxpbmUubGVuZ3RoLTE7IGkrKyl7XG4gICAgICAgIGxldCBwID0gbGluZVtpXTtcbiAgICAgICAgbGV0IHEgPSBsaW5lW2krMV07XG5cbiAgICAgICAgY29uc3QgbGVuZ3RoID0gbm9ybShwLCBxKTtcbiAgICAgICAgaWYgKGxlbmd0aCA8PSBtaW5fbGVuZ3RoKSB7XG4gICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHN1bSArPSBsZW5ndGg7XG5cbiAgICAgICAgaWYgKHN1bSA+IGRpc3RhbmNlKXtcbiAgICAgICAgICAgIHBvc2l0aW9uID0gaW50ZXJwb2xhdGVTZWdtZW50KHAsIHEsIHN1bSAtIGRpc3RhbmNlKTtcbiAgICAgICAgICAgIGFuZ2xlID0gZ2V0QW5nbGUocCwgcSwgb3B0aW9ucy5hbmdsZSk7XG4gICAgICAgICAgICBicmVhaztcbiAgICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4ge3Bvc2l0aW9uLCBhbmdsZX07XG59XG5cbmZ1bmN0aW9uIGludGVycG9sYXRlU2VnbWVudChwLCBxLCBkaXN0YW5jZSl7XG4gICAgbGV0IGxlbmd0aCA9IG5vcm0ocCwgcSk7XG4gICAgbGV0IHJhdGlvID0gZGlzdGFuY2UgLyBsZW5ndGg7XG4gICAgcmV0dXJuIFtcbiAgICAgICAgcmF0aW8gKiBwWzBdICsgKDEgLSByYXRpbykgKiBxWzBdLFxuICAgICAgICByYXRpbyAqIHBbMV0gKyAoMSAtIHJhdGlvKSAqIHFbMV1cbiAgICBdO1xufVxuIiwiaW1wb3J0IEdlbyBmcm9tICcuLi9nZW8nO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBSZXBlYXRHcm91cCB7XG5cbiAgICBjb25zdHJ1Y3RvciAoa2V5LCByZXBlYXRfZGlzdCwgbWF4X3JlcGVhdF9kaXN0KSB7XG4gICAgICAgIHRoaXMua2V5ID0ga2V5O1xuICAgICAgICB0aGlzLnJlcGVhdF9kaXN0ID0gcmVwZWF0X2Rpc3Q7XG4gICAgICAgIHRoaXMucmVwZWF0X2Rpc3Rfc3EgPSB0aGlzLnJlcGVhdF9kaXN0ICogdGhpcy5yZXBlYXRfZGlzdDtcbiAgICAgICAgdGhpcy5tYXhfcmVwZWF0X2Rpc3Rfc3EgPSBtYXhfcmVwZWF0X2Rpc3QgKiBtYXhfcmVwZWF0X2Rpc3Q7XG4gICAgICAgIHRoaXMub25lX3Blcl9ncm91cCA9ICh0aGlzLnJlcGVhdF9kaXN0X3NxID49IHRoaXMubWF4X3JlcGVhdF9kaXN0X3NxKSA/IHRydWUgOiBmYWxzZTtcbiAgICAgICAgdGhpcy5wb3NpdGlvbnMgPSBbXTtcbiAgICB9XG5cbiAgICAvLyBDaGVjayBhbiBvYmplY3QgdG8gc2VlIGlmIGl0J3MgYSByZXBlYXQgaW4gdGhpcyBncm91cFxuICAgIGNoZWNrIChvYmopIHtcbiAgICAgICAgLy8gSWYgb25seSBvbmUgb2JqZWN0IGFsbG93ZWQgcGVyIGdyb3VwLCBzaG9ydGN1dCBkaXN0YW5jZSBsb2dpY1xuICAgICAgICBpZiAodGhpcy5vbmVfcGVyX2dyb3VwKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5wb3NpdGlvbnMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgICAgIC8vIHJlcG9ydGVkIGRpc3RhbmNlIG1heGVzIG91dCBhdCB0aHJlc2hvbGQgaW4gdGhpcyBjYXNlXG4gICAgICAgICAgICAgICAgLy8gKG5vdCB0cnVlIGRpc3QgdmFsdWUgc2luY2Ugd2Ugc2tpcHBlZCBjYWxjdWxhdGluZyBpdClcbiAgICAgICAgICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgICAgICAgICBkaXN0X3NxOiB0aGlzLm1heF9yZXBlYXRfZGlzdF9zcSxcbiAgICAgICAgICAgICAgICAgICAgcmVwZWF0X2Rpc3Rfc3E6IHRoaXMucmVwZWF0X2Rpc3Rfc3EsXG4gICAgICAgICAgICAgICAgICAgIG9uZV9wZXJfZ3JvdXA6IHRoaXMub25lX3Blcl9ncm91cFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm47IC8vIG5vIG9iamVjdCBmb3IgdGhpcyBncm91cCB5ZXRcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENoZWNrIGRpc3RhbmNlIGZyb20gbmV3IG9iamVjdCB0byBvYmplY3RzIGFscmVhZHkgaW4gZ3JvdXBcbiAgICAgICAgbGV0IHAxID0gb2JqLnBvc2l0aW9uO1xuICAgICAgICBmb3IgKGxldCBpPTA7IGkgPCB0aGlzLnBvc2l0aW9ucy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgbGV0IHAyID0gdGhpcy5wb3NpdGlvbnNbaV07XG4gICAgICAgICAgICBsZXQgZHggPSBwMVswXSAtIHAyWzBdO1xuICAgICAgICAgICAgbGV0IGR5ID0gcDFbMV0gLSBwMlsxXTtcbiAgICAgICAgICAgIGxldCBkaXN0X3NxID0gZHggKiBkeCArIGR5ICogZHk7XG5cbiAgICAgICAgICAgIC8vIEZvdW5kIGFuIGV4aXN0aW5nIG9iamVjdCB3aXRoaW4gYWxsb3dlZCBkaXN0YW5jZVxuICAgICAgICAgICAgaWYgKGRpc3Rfc3EgPCB0aGlzLnJlcGVhdF9kaXN0X3NxKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICAgICAgZGlzdF9zcSxcbiAgICAgICAgICAgICAgICAgICAgcmVwZWF0X2Rpc3Rfc3E6IHRoaXMucmVwZWF0X2Rpc3Rfc3FcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gQWRkIG9iamVjdCB0byB0aGlzIGdyb3VwXG4gICAgYWRkIChvYmopIHtcbiAgICAgICAgLy8gb25seSBzdG9yZSBvYmplY3QncyBwb3NpdGlvbiwgdG8gc2F2ZSBzcGFjZSAvIHByZXZlbnQgdW5uZWNlc3NhcnkgcmVmZXJlbmNlc1xuICAgICAgICBpZiAob2JqICYmIG9iai5wb3NpdGlvbikge1xuICAgICAgICAgICAgdGhpcy5wb3NpdGlvbnMucHVzaChvYmoucG9zaXRpb24pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gU3RhdGljIG1ldGhvZHMgYXJlIHVzZWQgdG8gbWFuYWdlIHJlcGVhdCBncm91cHMsIHdpdGhpbiBhbmQgYWNyb3NzIHRpbGVzXG5cbiAgICAvLyBSZXNldCBhbGwgZ3JvdXBzIGZvciB0aGlzIHRpbGVcbiAgICBzdGF0aWMgY2xlYXIgKHRpbGUpIHtcbiAgICAgICAgdGhpcy5ncm91cHNbdGlsZV0gPSB7fTtcbiAgICB9XG5cbiAgICAvLyBDaGVjayBhbiBvYmplY3QgdG8gc2VlIGlmIGl0J3MgYSByZXBlYXQgd2l0aGluIGl0cyBkZXNpZ25hdGVkIGdyb3VwXG4gICAgc3RhdGljIGNoZWNrIChvYmosIGxheW91dCwgdGlsZSkge1xuICAgICAgICBpZiAobGF5b3V0LnJlcGVhdF9kaXN0YW5jZSAmJiBsYXlvdXQucmVwZWF0X2dyb3VwICYmIHRoaXMuZ3JvdXBzW3RpbGVdW2xheW91dC5yZXBlYXRfZ3JvdXBdKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5ncm91cHNbdGlsZV1bbGF5b3V0LnJlcGVhdF9ncm91cF0uY2hlY2sob2JqKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIEFkZCBhbiBvYmplY3QgdG8gaXRzIGRlc2lnbmF0ZWQgZ3JvdXBcbiAgICBzdGF0aWMgYWRkIChvYmosIGxheW91dCwgdGlsZSkge1xuICAgICAgICBpZiAobGF5b3V0LnJlcGVhdF9kaXN0YW5jZSAmJiBsYXlvdXQucmVwZWF0X2dyb3VwKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5ncm91cHNbdGlsZV1bbGF5b3V0LnJlcGVhdF9ncm91cF0gPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHRoaXMuZ3JvdXBzW3RpbGVdW2xheW91dC5yZXBlYXRfZ3JvdXBdID0gbmV3IFJlcGVhdEdyb3VwKFxuICAgICAgICAgICAgICAgICAgICBsYXlvdXQucmVwZWF0X2dyb3VwLFxuICAgICAgICAgICAgICAgICAgICBsYXlvdXQucmVwZWF0X2Rpc3RhbmNlLFxuICAgICAgICAgICAgICAgICAgICBSZXBlYXRHcm91cC5tYXhfcmVwZWF0X2Rpc3RcbiAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5ncm91cHNbdGlsZV1bbGF5b3V0LnJlcGVhdF9ncm91cF0uYWRkKG9iaik7XG4gICAgICAgIH1cbiAgICB9XG5cbn1cblxuLy8gQ3VycmVudCBzZXQgb2YgcmVwZWF0IGdyb3VwcywgZ3JvdXBlZCBhbmQga2V5ZWQgYnkgdGlsZVxuUmVwZWF0R3JvdXAuZ3JvdXBzID0ge307XG5cbi8vIE1heCByZXBlYXQgZGlzdDogZm9yIGdyb3VwcyB3aXRoIGEgcmVwZWF0IGRpc3QgYmV5b25kIHRoaXMgdGhyZXNob2xkLCBvbmx5IG9uZSBsYWJlbFxuLy8gd2lsbCBiZSBhbGxvd2VkIHBlciBncm91cCwgZS5nLiBzZXQgdG8gdGlsZSBzaXplIGZvciBvbmUtbGFiZWwtcGVyLXRpbGVcblJlcGVhdEdyb3VwLm1heF9yZXBlYXRfZGlzdCA9IEdlby50aWxlX3NjYWxlO1xuIiwiaW1wb3J0IFRocmVhZCBmcm9tICcuL3V0aWxzL3RocmVhZCc7XG5pbXBvcnQgU2NlbmUgZnJvbSAnLi9zY2VuZSc7XG5pbXBvcnQgR2VvIGZyb20gJy4vZ2VvJztcblxuLy8gRXhwb3J0cyBtdXN0IGFwcGVhciBvdXRzaWRlIGEgZnVuY3Rpb24sIGJ1dCB3aWxsIG9ubHkgYmUgZGVmaW5lZCBpbiBtYWluIHRocmVhZCAoYmVsb3cpXG5leHBvcnQgdmFyIExlYWZsZXRMYXllcjtcbmV4cG9ydCBmdW5jdGlvbiBsZWFmbGV0TGF5ZXIob3B0aW9ucykge1xuICAgIHJldHVybiBleHRlbmRMZWFmbGV0KG9wdGlvbnMpO1xufVxuXG5mdW5jdGlvbiBleHRlbmRMZWFmbGV0KG9wdGlvbnMpIHtcblxuICAgIC8vIElmIExlYWZsZXRMYXllciBpcyBhbHJlYWR5IGRlZmluZWQgd2hlbiB0aGlzIGlzIGNhbGxlZCBqdXN0IHJldHVybiB0aGF0IGltbWVkaWF0ZWx5XG4gICAgLy8gZS5nLiBpZiB5b3UgY2FsbCBsZWFmbGV0TGF5ZXIgbXVsdGlwbGUgdGltZXMgKHdoaWNoIGlzIHZhbGlkKVxuICAgIGlmICh0eXBlb2YgTGVhZmxldExheWVyICE9PSAndW5kZWZpbmVkJykge1xuICAgICAgICByZXR1cm4gbmV3IExlYWZsZXRMYXllcihvcHRpb25zKTtcbiAgICB9XG5cbiAgICAvLyBMZWFmbGV0IGxheWVyIGZ1bmN0aW9uYWxpdHkgaXMgb25seSBkZWZpbmVkIGluIG1haW4gdGhyZWFkXG4gICAgaWYgKFRocmVhZC5pc19tYWluKSB7XG5cbiAgICAgICAgbGV0IEwgPSBvcHRpb25zLmxlYWZsZXQgfHwgd2luZG93Lkw7XG5cbiAgICAgICAgLy8gRGV0ZXJtaW5lIGlmIHdlIGFyZSBleHRlbmRpbmcgdGhlIGxlYWZsZXQgMC43LnggVGlsZUxheWVyIGNsYXNzLCBvciB0aGUgbmV3ZXJcbiAgICAgICAgLy8gbGVhZmxldCAxLnggR3JpZExheWVyIGNsYXNzLlxuICAgICAgICBsZXQgbGF5ZXJCYXNlQ2xhc3MgPSBMLkdyaWRMYXllciA/IEwuR3JpZExheWVyIDogTC5UaWxlTGF5ZXI7XG4gICAgICAgIGxldCBsZWFmbGV0VmVyc2lvbiA9IGxheWVyQmFzZUNsYXNzID09PSBMLkdyaWRMYXllciA/ICcxLngnIDogJzAuNy54JztcbiAgICAgICAgbGV0IGxheWVyQ2xhc3NDb25maWcgPSB7fTtcblxuICAgICAgICAvLyBJZiBleHRlbmRpbmcgbGVhZmxldCAwLjcueCBUaWxlTGF5ZXIsIGFkZGl0aW9uYWwgbW9kaWZpY2F0aW9ucyBhcmUgbmVlZGVkXG4gICAgICAgIGlmIChsYXllckJhc2VDbGFzcyA9PT0gTC5UaWxlTGF5ZXIpIHtcbiAgICAgICAgICAgIGxheWVyQ2xhc3NDb25maWcuX2FkZFRpbGUgPSBmdW5jdGlvbigpe307XG4gICAgICAgICAgICBsYXllckNsYXNzQ29uZmlnLl9yZW1vdmVUaWxlID0gZnVuY3Rpb24oKXt9O1xuICAgICAgICAgICAgbGF5ZXJDbGFzc0NvbmZpZy5fcmVzZXQgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICBsYXllckJhc2VDbGFzcy5wcm90b3R5cGUuX3Jlc2V0LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG4gICAgICAgICAgICAgICAgLy8gcmUtYWRkIHRoZSBjYW52YXMgc2luY2UgYmFzZSBjbGFzcyBgdmlld3Jlc2V0YCBldmVudCBjYW4gcmVtb3ZlIGl0XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuc2NlbmUgJiYgdGhpcy5zY2VuZS5jb250YWluZXIgJiYgdGhpcy5zY2VuZS5jYW52YXMpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zY2VuZS5jb250YWluZXIuYXBwZW5kQ2hpbGQodGhpcy5zY2VuZS5jYW52YXMpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cblxuICAgICAgICAvLyBEZWZpbmUgY3VzdG9tIGxheWVyIG1ldGhvZHNcbiAgICAgICAgT2JqZWN0LmFzc2lnbihsYXllckNsYXNzQ29uZmlnLCB7XG5cbiAgICAgICAgICAgIGluaXRpYWxpemUgKG9wdGlvbnMpIHtcbiAgICAgICAgICAgICAgICAvLyBEZWZhdWx0c1xuICAgICAgICAgICAgICAgIG9wdGlvbnMuc2hvd0RlYnVnID0gKCFvcHRpb25zLnNob3dEZWJ1ZyA/IGZhbHNlIDogdHJ1ZSk7XG5cbiAgICAgICAgICAgICAgICBMLnNldE9wdGlvbnModGhpcywgb3B0aW9ucyk7XG4gICAgICAgICAgICAgICAgdGhpcy5jcmVhdGVTY2VuZSgpO1xuICAgICAgICAgICAgICAgIHRoaXMuaG9va3MgPSB7fTtcbiAgICAgICAgICAgICAgICB0aGlzLl91cGRhdGluZ190YW5ncmFtID0gZmFsc2U7XG5cbiAgICAgICAgICAgICAgICAvLyBGb3JjZSBsZWFmbGV0IHpvb20gYW5pbWF0aW9ucyBvZmZcbiAgICAgICAgICAgICAgICB0aGlzLl96b29tQW5pbWF0ZWQgPSBmYWxzZTtcbiAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgIGNyZWF0ZVNjZW5lICgpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnNjZW5lID0gU2NlbmUuY3JlYXRlKFxuICAgICAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMuc2NlbmUsXG4gICAgICAgICAgICAgICAgICAgIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG51bVdvcmtlcnM6IHRoaXMub3B0aW9ucy5udW1Xb3JrZXJzLFxuICAgICAgICAgICAgICAgICAgICAgICAgcHJlVXBkYXRlOiB0aGlzLm9wdGlvbnMucHJlVXBkYXRlLFxuICAgICAgICAgICAgICAgICAgICAgICAgcG9zdFVwZGF0ZTogdGhpcy5vcHRpb25zLnBvc3RVcGRhdGUsXG4gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51b3VzWm9vbTogKExlYWZsZXRMYXllci5sZWFmbGV0VmVyc2lvbiA9PT0gJzEueCcpLFxuICAgICAgICAgICAgICAgICAgICAgICAgaGlnaERlbnNpdHlEaXNwbGF5OiB0aGlzLm9wdGlvbnMuaGlnaERlbnNpdHlEaXNwbGF5LFxuICAgICAgICAgICAgICAgICAgICAgICAgbG9nTGV2ZWw6IHRoaXMub3B0aW9ucy5sb2dMZXZlbCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGludHJvc3BlY3Rpb246IHRoaXMub3B0aW9ucy5pbnRyb3NwZWN0aW9uLFxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWR2YW5jZWQgb3B0aW9uLCBhcHAgd2lsbCBoYXZlIHRvIG1hbnVhbGx5IGNhbGxlZCBzY2VuZS51cGRhdGUoKSBwZXIgZnJhbWVcbiAgICAgICAgICAgICAgICAgICAgICAgIGRpc2FibGVSZW5kZXJMb29wOiB0aGlzLm9wdGlvbnMuZGlzYWJsZVJlbmRlckxvb3AsXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBhZHZhbmNlZCBvcHRpb24sIHdpbGwgcmVxdWlyZSBsaWJyYXJ5IHRvIGJlIHNlcnZlZCBhcyBzYW1lIGhvc3QgYXMgcGFnZVxuICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dDcm9zc0RvbWFpbldvcmtlcnM6IHRoaXMub3B0aW9ucy5hbGxvd0Nyb3NzRG9tYWluV29ya2Vyc1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgIC8vIEZpbmlzaCBpbml0aWFsaXppbmcgc2NlbmUgYW5kIHNldHVwIGV2ZW50cyB3aGVuIGxheWVyIGlzIGFkZGVkIHRvIG1hcFxuICAgICAgICAgICAgb25BZGQgKG1hcCkge1xuICAgICAgICAgICAgICAgIGlmICghdGhpcy5zY2VuZSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmNyZWF0ZVNjZW5lKCk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgbGF5ZXJCYXNlQ2xhc3MucHJvdG90eXBlLm9uQWRkLmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG5cbiAgICAgICAgICAgICAgICB0aGlzLmhvb2tzLnJlc2l6ZSA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fdXBkYXRpbmdfdGFuZ3JhbSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlU2l6ZSgpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLl91cGRhdGluZ190YW5ncmFtID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBtYXAub24oJ3Jlc2l6ZScsIHRoaXMuaG9va3MucmVzaXplKTtcblxuICAgICAgICAgICAgICAgIHRoaXMuaG9va3MubW92ZSA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuX3VwZGF0aW5nX3RhbmdyYW0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3VwZGF0aW5nX3RhbmdyYW0gPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB2YXIgdmlldyA9IG1hcC5nZXRDZW50ZXIoKTtcbiAgICAgICAgICAgICAgICAgICAgdmlldy56b29tID0gTWF0aC5taW4obWFwLmdldFpvb20oKSwgbWFwLmdldE1heFpvb20oKSB8fCBHZW8uZGVmYXVsdF92aWV3X21heF96b29tKTtcblxuICAgICAgICAgICAgICAgICAgICB0aGlzLnNjZW5lLnZpZXcuc2V0Vmlldyh2aWV3KTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zY2VuZS5pbW1lZGlhdGVSZWRyYXcoKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZXZlcnNlVHJhbnNmb3JtKCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3VwZGF0aW5nX3RhbmdyYW0gPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIG1hcC5vbignbW92ZScsIHRoaXMuaG9va3MubW92ZSk7XG5cbiAgICAgICAgICAgICAgICB0aGlzLmhvb2tzLnpvb21zdGFydCA9ICgpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuX3VwZGF0aW5nX3RhbmdyYW0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3VwZGF0aW5nX3RhbmdyYW0gPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNjZW5lLnZpZXcuc3RhcnRab29tKCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX3VwZGF0aW5nX3RhbmdyYW0gPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIG1hcC5vbignem9vbXN0YXJ0JywgdGhpcy5ob29rcy56b29tc3RhcnQpO1xuXG4gICAgICAgICAgICAgICAgdGhpcy5ob29rcy5kcmFnc3RhcnQgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2NlbmUudmlldy5zZXRQYW5uaW5nKHRydWUpO1xuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgbWFwLm9uKCdkcmFnc3RhcnQnLCB0aGlzLmhvb2tzLmRyYWdzdGFydCk7XG5cbiAgICAgICAgICAgICAgICB0aGlzLmhvb2tzLm1vdmVlbmQgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2NlbmUudmlldy5zZXRQYW5uaW5nKGZhbHNlKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zY2VuZS5yZXF1ZXN0UmVkcmF3KCk7XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBtYXAub24oJ21vdmVlbmQnLCB0aGlzLmhvb2tzLm1vdmVlbmQpO1xuXG4gICAgICAgICAgICAgICAgLy8gRm9yY2UgbGVhZmxldCB6b29tIGFuaW1hdGlvbnMgb2ZmXG4gICAgICAgICAgICAgICAgbWFwLl96b29tQW5pbWF0ZWQgPSBmYWxzZTtcblxuICAgICAgICAgICAgICAgIC8vIE1vZGlmeSBkZWZhdWx0IExlYWZsZXQgYmVoYXZpb3JzXG4gICAgICAgICAgICAgICAgdGhpcy5tb2RpZnlTY3JvbGxXaGVlbEJlaGF2aW9yKG1hcCk7XG4gICAgICAgICAgICAgICAgdGhpcy5tb2RpZnlEb3VibGVDbGlja1pvb20obWFwKTtcblxuICAgICAgICAgICAgICAgIC8vIFNldHVwIGZlYXR1cmUgc2VsZWN0aW9uXG4gICAgICAgICAgICAgICAgdGhpcy5zZXR1cFNlbGVjdGlvbkV2ZW50SGFuZGxlcnMobWFwKTtcbiAgICAgICAgICAgICAgICB0aGlzLnNldFNlbGVjdGlvbkV2ZW50cyh0aGlzLm9wdGlvbnMuZXZlbnRzKTtcblxuICAgICAgICAgICAgICAgIC8vIEFkZCBHTCBjYW52YXMgdG8gbGF5ZXIgY29udGFpbmVyXG4gICAgICAgICAgICAgICAgdGhpcy5zY2VuZS5jb250YWluZXIgPSB0aGlzLmdldENvbnRhaW5lcigpO1xuICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlU2l6ZSgpO1xuXG4gICAgICAgICAgICAgICAgLy8gSW5pdGlhbCB2aWV3XG4gICAgICAgICAgICAgICAgdGhpcy51cGRhdGVWaWV3KCk7XG4gICAgICAgICAgICAgICAgdGhpcy5yZXNpemVPbkZpcnN0VmlzaWJsZSgpO1xuXG4gICAgICAgICAgICAgICAgLy8gU3Vic2NyaWJlIHRvIHRhbmdyYW0gZXZlbnRzXG4gICAgICAgICAgICAgICAgdGhpcy5zY2VuZS5zdWJzY3JpYmUoe1xuICAgICAgICAgICAgICAgICAgICBtb3ZlOiB0aGlzLm9uVGFuZ3JhbVZpZXdVcGRhdGUuYmluZCh0aGlzKVxuICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgLy8gVXNlIGxlYWZsZXQncyBleGlzdGluZyBldmVudCBzeXN0ZW0gYXMgdGhlIGNhbGxiYWNrIG1lY2hhbmlzbVxuICAgICAgICAgICAgICAgIHRoaXMuc2NlbmUubG9hZCh0aGlzLm9wdGlvbnMuc2NlbmUsXG4gICAgICAgICAgICAgICAgICAgIHsgY29uZmlnX3BhdGg6IHRoaXMub3B0aW9ucy5zY2VuZUJhc2VQYXRoLCBibG9ja2luZzogZmFsc2UgfSkudGhlbigoKSA9PiB7XG5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5fdXBkYXRpbmdfdGFuZ3JhbSA9IHRydWU7XG5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy51cGRhdGVTaXplKCk7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudXBkYXRlVmlldygpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnJldmVyc2VUcmFuc2Zvcm0oKTtcblxuICAgICAgICAgICAgICAgICAgICB0aGlzLl91cGRhdGluZ190YW5ncmFtID0gZmFsc2U7XG5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy5maXJlKCdpbml0Jyk7XG4gICAgICAgICAgICAgICAgfSkuY2F0Y2goZXJyb3IgPT4ge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmZpcmUoJ2Vycm9yJywgZXJyb3IpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgb25SZW1vdmUgKG1hcCkge1xuICAgICAgICAgICAgICAgIGxheWVyQmFzZUNsYXNzLnByb3RvdHlwZS5vblJlbW92ZS5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuXG4gICAgICAgICAgICAgICAgbWFwLm9mZigncmVzaXplJywgdGhpcy5ob29rcy5yZXNpemUpO1xuICAgICAgICAgICAgICAgIG1hcC5vZmYoJ21vdmUnLCB0aGlzLmhvb2tzLm1vdmUpO1xuICAgICAgICAgICAgICAgIG1hcC5vZmYoJ3pvb21zdGFydCcsIHRoaXMuaG9va3Muem9vbXN0YXJ0KTtcbiAgICAgICAgICAgICAgICBtYXAub2ZmKCdkcmFnc3RhcnQnLCB0aGlzLmhvb2tzLmRyYWdzdGFydCk7XG4gICAgICAgICAgICAgICAgbWFwLm9mZignbW92ZWVuZCcsIHRoaXMuaG9va3MubW92ZWVuZCk7XG4gICAgICAgICAgICAgICAgbWFwLm9mZignY2xpY2snLCB0aGlzLmhvb2tzLmNsaWNrKTtcbiAgICAgICAgICAgICAgICBtYXAub2ZmKCdtb3VzZW1vdmUnLCB0aGlzLmhvb2tzLm1vdXNlbW92ZSk7XG4gICAgICAgICAgICAgICAgbWFwLm9mZignbW91c2VvdXQnLCB0aGlzLmhvb2tzLm1vdXNlb3V0KTtcbiAgICAgICAgICAgICAgICBkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCd2aXNpYmlsaXR5Y2hhbmdlJywgdGhpcy5ob29rcy52aXNpYmlsaXR5Y2hhbmdlKTtcbiAgICAgICAgICAgICAgICB0aGlzLmhvb2tzID0ge307XG5cbiAgICAgICAgICAgICAgICBpZiAodGhpcy5zY2VuZSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNjZW5lLmRlc3Ryb3koKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5zY2VuZSA9IG51bGw7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgY3JlYXRlVGlsZSAoY29vcmRzKSB7XG4gICAgICAgICAgICAgICAgdmFyIGtleSA9IGNvb3Jkcy54ICsgJy8nICsgY29vcmRzLnkgKyAnLycgKyBjb29yZHMuejtcbiAgICAgICAgICAgICAgICB2YXIgZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICAgICAgICAgICAgZGl2LnNldEF0dHJpYnV0ZSgnZGF0YS10aWxlLWtleScsIGtleSk7XG4gICAgICAgICAgICAgICAgZGl2LnN0eWxlLndpZHRoID0gJzI1NnB4JztcbiAgICAgICAgICAgICAgICBkaXYuc3R5bGUuaGVpZ2h0ID0gJzI1NnB4JztcblxuICAgICAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMuc2hvd0RlYnVnKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBkZWJ1Z19vdmVybGF5ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gICAgICAgICAgICAgICAgICAgIGRlYnVnX292ZXJsYXkudGV4dENvbnRlbnQgPSBrZXk7XG4gICAgICAgICAgICAgICAgICAgIGRlYnVnX292ZXJsYXkuc3R5bGUucG9zaXRpb24gPSAnYWJzb2x1dGUnO1xuICAgICAgICAgICAgICAgICAgICBkZWJ1Z19vdmVybGF5LnN0eWxlLmxlZnQgPSAwO1xuICAgICAgICAgICAgICAgICAgICBkZWJ1Z19vdmVybGF5LnN0eWxlLnRvcCA9IDA7XG4gICAgICAgICAgICAgICAgICAgIGRlYnVnX292ZXJsYXkuc3R5bGUuY29sb3IgPSAnd2hpdGUnO1xuICAgICAgICAgICAgICAgICAgICBkZWJ1Z19vdmVybGF5LnN0eWxlLmZvbnRTaXplID0gJzE2cHgnO1xuICAgICAgICAgICAgICAgICAgICBkZWJ1Z19vdmVybGF5LnN0eWxlLnRleHRPdXRsaW5lID0gJzFweCAjMDAwMDAwJztcbiAgICAgICAgICAgICAgICAgICAgZGVidWdfb3ZlcmxheS5zdHlsZS5wYWRkaW5nID0gJzhweCc7XG5cbiAgICAgICAgICAgICAgICAgICAgZGl2LmFwcGVuZENoaWxkKGRlYnVnX292ZXJsYXkpO1xuICAgICAgICAgICAgICAgICAgICBkaXYuc3R5bGUuYm9yZGVyU3R5bGUgPSAnc29saWQnO1xuICAgICAgICAgICAgICAgICAgICBkaXYuc3R5bGUuYm9yZGVyQ29sb3IgPSAnd2hpdGUnO1xuICAgICAgICAgICAgICAgICAgICBkaXYuc3R5bGUuYm9yZGVyV2lkdGggPSAnMXB4JztcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gZGl2O1xuICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgLy8gTW9kaWZ5IGxlYWZsZXQncyBkZWZhdWx0IHNjcm9sbCB3aGVlbCBiZWhhdmlvciB0byByZW5kZXIgZnJhbWVzIG1vcmUgZnJlcXVlbnRseVxuICAgICAgICAgICAgLy8gKHNob3VsZCBnZW5lcmFsbHkgbGVhZCB0byBzbW9vdGhlciBzY3JvbGwgd2l0aCBUYW5ncmFtIGZyYW1lIHJlLXJlbmRlcilcbiAgICAgICAgICAgIG1vZGlmeVNjcm9sbFdoZWVsQmVoYXZpb3IgKG1hcCkge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLnNjZW5lLnZpZXcuY29udGludW91c196b29tICYmIG1hcC5zY3JvbGxXaGVlbFpvb20gJiYgdGhpcy5vcHRpb25zLm1vZGlmeVNjcm9sbFdoZWVsICE9PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgICAgICBtYXAub3B0aW9ucy56b29tU25hcCA9IDA7XG5cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZW5hYmxlZCA9IG1hcC5zY3JvbGxXaGVlbFpvb20uZW5hYmxlZCgpO1xuICAgICAgICAgICAgICAgICAgICBtYXAuc2Nyb2xsV2hlZWxab29tLmRpc2FibGUoKTtcblxuICAgICAgICAgICAgICAgICAgICBtYXAuc2Nyb2xsV2hlZWxab29tLl9vbldoZWVsU2Nyb2xsID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBkZWx0YSA9IEwuRG9tRXZlbnQuZ2V0V2hlZWxEZWx0YShlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuX2RlbHRhICs9IGRlbHRhO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fbGFzdE1vdXNlUG9zID0gdGhpcy5fbWFwLm1vdXNlRXZlbnRUb0NvbnRhaW5lclBvaW50KGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fcGVyZm9ybVpvb20oKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIEwuRG9tRXZlbnQuc3RvcChlKTtcbiAgICAgICAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgICAgICAgICBtYXAuc2Nyb2xsV2hlZWxab29tLl9wZXJmb3JtWm9vbSA9IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBtYXAgPSB0aGlzLl9tYXAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgem9vbSA9IG1hcC5nZXRab29tKCk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIG1hcC5fc3RvcCgpOyAvLyBzdG9wIHBhbm5pbmcgYW5kIGZseSBhbmltYXRpb25zIGlmIGFueVxuXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgZGVsdGEgPSB0aGlzLl9kZWx0YSAvICh0aGlzLl9tYXAub3B0aW9ucy53aGVlbFB4UGVyWm9vbUxldmVsICogNCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLl9kZWx0YSA9IDA7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoem9vbSArIGRlbHRhKSA+PSB0aGlzLl9tYXAuZ2V0TWF4Wm9vbSgpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsdGEgPSB0aGlzLl9tYXAuZ2V0TWF4Wm9vbSgpIC0gem9vbTsgLy8gZG9uJ3QgZ28gcGFzdCBtYXggem9vbVxuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWRlbHRhKSB7IHJldHVybjsgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAobWFwLm9wdGlvbnMuc2Nyb2xsV2hlZWxab29tID09PSAnY2VudGVyJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcC5zZXRab29tKHpvb20gKyBkZWx0YSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcC5zZXRab29tQXJvdW5kKHRoaXMuX2xhc3RNb3VzZVBvcywgem9vbSArIGRlbHRhKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgICAgICAgICBpZiAoZW5hYmxlZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbWFwLnNjcm9sbFdoZWVsWm9vbS5lbmFibGUoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgIC8vIE1vZGlmeSBsZWFmbGV0J3MgZGVmYXVsdCBkb3VibGUtY2xpY2sgem9vbSBiZWhhdmlvciwgdG8gbWF0Y2ggdHlwaWNhbCB2ZWN0b3IgYmFzZW1hcCBwcm9kdWN0c1xuICAgICAgICAgICAgbW9kaWZ5RG91YmxlQ2xpY2tab29tIChtYXApIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5zY2VuZS52aWV3LmNvbnRpbnVvdXNfem9vbSAmJiBtYXAuZG91YmxlQ2xpY2tab29tICYmIHRoaXMub3B0aW9ucy5tb2RpZnlEb3VibGVDbGlja1pvb20gIT09IGZhbHNlKSB7XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gTW9kaWZpZWQgdmVyc2lvbiBvZiBMZWFmbGV0J3Mgc2V0Wm9vbUFyb3VuZCB0aGF0IGRvZXNuJ3QgdHJpZ2dlciBhIG1vdmVFbmQgZXZlbnRcbiAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2V0Wm9vbUFyb3VuZE5vTW92ZUVuZCA9IGZ1bmN0aW9uIChtYXAsIGxhdGxuZywgem9vbSwgb3B0aW9ucykge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHNjYWxlID0gbWFwLmdldFpvb21TY2FsZSh6b29tKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aWV3SGFsZiA9IG1hcC5nZXRTaXplKCkuZGl2aWRlQnkoMiksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGFpbmVyUG9pbnQgPSBsYXRsbmcgaW5zdGFuY2VvZiBMLlBvaW50ID8gbGF0bG5nIDogbWFwLmxhdExuZ1RvQ29udGFpbmVyUG9pbnQobGF0bG5nKSxcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNlbnRlck9mZnNldCA9IGNvbnRhaW5lclBvaW50LnN1YnRyYWN0KHZpZXdIYWxmKS5tdWx0aXBseUJ5KDEgLSAxIC8gc2NhbGUpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ld0NlbnRlciA9IG1hcC5jb250YWluZXJQb2ludFRvTGF0TG5nKHZpZXdIYWxmLmFkZChjZW50ZXJPZmZzZXQpKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG1hcC5fbW92ZShuZXdDZW50ZXIsIHpvb20sIHsgZmx5VG86IHRydWUgfSk7XG4gICAgICAgICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gU2ltcGxpZmllZCB2ZXJzaW9uIG9mIExlYWZsZXQncyBmbHlUbywgZm9yIHNob3J0IGFuaW1hdGlvbnMgem9vbWluZyBhcm91bmQgYSBwb2ludFxuICAgICAgICAgICAgICAgICAgICBjb25zdCBmbHlBcm91bmQgPSBmdW5jdGlvbiAobWFwLCB0YXJnZXRDZW50ZXIsIHRhcmdldFpvb20sIG9wdGlvbnMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMuYW5pbWF0ZSA9PT0gZmFsc2UgfHwgIUwuQnJvd3Nlci5hbnkzZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBtYXAuc2V0Vmlldyh0YXJnZXRDZW50ZXIsIHRhcmdldFpvb20sIG9wdGlvbnMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICBtYXAuX3N0b3AoKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHN0YXJ0Wm9vbSA9IG1hcC5fem9vbTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0Q2VudGVyID0gTC5sYXRMbmcodGFyZ2V0Q2VudGVyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldFpvb20gPSB0YXJnZXRab29tID09PSB1bmRlZmluZWQgPyBzdGFydFpvb20gOiB0YXJnZXRab29tO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0Wm9vbSA9IE1hdGgubWluKHRhcmdldFpvb20sIG1hcC5nZXRNYXhab29tKCkpOyAvLyBkb24ndCBnbyBwYXN0IG1heCB6b29tXG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBmcm9tID0gbWFwLnByb2plY3QobWFwLmdldENlbnRlcigpLCBzdGFydFpvb20pLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvID0gbWFwLnByb2plY3QodGFyZ2V0Q2VudGVyLCBzdGFydFpvb20pO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgc3RhcnQgPSBEYXRlLm5vdygpLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR1cmF0aW9uID0gb3B0aW9ucy5kdXJhdGlvbiA/IDEwMDAgKiBvcHRpb25zLmR1cmF0aW9uIDogNzU7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uIGZyYW1lKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciB0ID0gKERhdGUubm93KCkgLSBzdGFydCkgLyBkdXJhdGlvbjtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0IDw9IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcmV1c2UgaW50ZXJuYWwgZmx5VG8gZnJhbWUgdG8gZW5zdXJlIHRoZXNlIGFuaW1hdGlvbnMgYXJlIGNhbmNlbGVkIGxpa2Ugb3RoZXJzXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcC5fZmx5VG9GcmFtZSA9IEwuVXRpbC5yZXF1ZXN0QW5pbUZyYW1lKGZyYW1lLCBtYXApO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBjZW50ZXIgPSBmcm9tLmFkZCh0by5zdWJ0cmFjdChmcm9tKS5tdWx0aXBseUJ5KHQpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2VudGVyID0gW2NlbnRlci54LCBjZW50ZXIueV07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNlbnRlciA9IEdlby5tZXRlcnNUb0xhdExuZyhjZW50ZXIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRab29tQXJvdW5kTm9Nb3ZlRW5kKG1hcCwgdGFyZ2V0Q2VudGVyLCBzdGFydFpvb20gKyAodGFyZ2V0Wm9vbSAtIHN0YXJ0Wm9vbSkgKiB0KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRab29tQXJvdW5kTm9Nb3ZlRW5kKG1hcCwgdGFyZ2V0Q2VudGVyLCB0YXJnZXRab29tKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLl9tb3ZlRW5kKHRydWUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgbWFwLl9tb3ZlU3RhcnQodHJ1ZSk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lLmNhbGwobWFwKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBtYXA7XG4gICAgICAgICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gTW9kaWZ5IHRoZSBkb3VibGUtY2xpY2sgem9vbSBoYW5kbGVyIHRvIGRvIGEgc2hvcnQgem9vbSBhbmltYXRpb25cbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZW5hYmxlZCA9IG1hcC5kb3VibGVDbGlja1pvb20uZW5hYmxlZCgpO1xuICAgICAgICAgICAgICAgICAgICBtYXAuZG91YmxlQ2xpY2tab29tLmRpc2FibGUoKTtcblxuICAgICAgICAgICAgICAgICAgICBtYXAuZG91YmxlQ2xpY2tab29tLl9vbkRvdWJsZUNsaWNrID0gZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBtYXAgPSB0aGlzLl9tYXAsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb2xkWm9vbSA9IG1hcC5nZXRab29tKCksXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsdGEgPSBtYXAub3B0aW9ucy56b29tRGVsdGEsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgem9vbSA9IGUub3JpZ2luYWxFdmVudC5zaGlmdEtleSA/IG9sZFpvb20gLSBkZWx0YSA6IG9sZFpvb20gKyBkZWx0YTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1hcC5vcHRpb25zLmRvdWJsZUNsaWNrWm9vbSA9PT0gJ2NlbnRlcicpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbHlBcm91bmQobWFwLCBtYXAuZ2V0Q2VudGVyKCksIHpvb20pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbHlBcm91bmQobWFwLCBtYXAuY29udGFpbmVyUG9pbnRUb0xhdExuZyhlLmNvbnRhaW5lclBvaW50KSwgem9vbSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKGVuYWJsZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1hcC5kb3VibGVDbGlja1pvb20uZW5hYmxlKCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICB1cGRhdGVWaWV3ICgpIHtcbiAgICAgICAgICAgICAgICB2YXIgdmlldyA9IHRoaXMuX21hcC5nZXRDZW50ZXIoKTtcbiAgICAgICAgICAgICAgICB2aWV3Lnpvb20gPSBNYXRoLm1pbih0aGlzLl9tYXAuZ2V0Wm9vbSgpLCB0aGlzLl9tYXAuZ2V0TWF4Wm9vbSgpIHx8IEdlby5kZWZhdWx0X3ZpZXdfbWF4X3pvb20pO1xuICAgICAgICAgICAgICAgIHRoaXMuc2NlbmUudmlldy5zZXRWaWV3KHZpZXcpO1xuICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgdXBkYXRlU2l6ZSAoKSB7XG4gICAgICAgICAgICAgICAgdmFyIHNpemUgPSB0aGlzLl9tYXAuZ2V0U2l6ZSgpO1xuICAgICAgICAgICAgICAgIHRoaXMuc2NlbmUucmVzaXplTWFwKHNpemUueCwgc2l6ZS55KTtcbiAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgIHJlc2l6ZU9uRmlyc3RWaXNpYmxlICgpIHtcbiAgICAgICAgICAgICAgICBsZXQgZmlyc3RfdmlzaWJpbGl0eSA9IHRydWU7XG4gICAgICAgICAgICAgICAgdGhpcy5ob29rcy52aXNpYmlsaXR5Y2hhbmdlID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoZmlyc3RfdmlzaWJpbGl0eSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3RfdmlzaWJpbGl0eSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy51cGRhdGVTaXplKCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICAgICAgZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcigndmlzaWJpbGl0eWNoYW5nZScsIHRoaXMuaG9va3MudmlzaWJpbGl0eWNoYW5nZSk7XG4gICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICBvblRhbmdyYW1WaWV3VXBkYXRlICgpIHtcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuX21hcCB8fCB0aGlzLl91cGRhdGluZ190YW5ncmFtKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy5fdXBkYXRpbmdfdGFuZ3JhbSA9IHRydWU7XG4gICAgICAgICAgICAgICAgdGhpcy5fbWFwLnNldFZpZXcoW3RoaXMuc2NlbmUudmlldy5jZW50ZXIubGF0LCB0aGlzLnNjZW5lLnZpZXcuY2VudGVyLmxuZ10sIHRoaXMuc2NlbmUudmlldy56b29tLCB7IGFuaW1hdGU6IGZhbHNlIH0pO1xuICAgICAgICAgICAgICAgIHRoaXMucmV2ZXJzZVRyYW5zZm9ybSgpO1xuICAgICAgICAgICAgICAgIHRoaXMuX3VwZGF0aW5nX3RhbmdyYW0gPSBmYWxzZTtcbiAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgIHJlbmRlciAoKSB7XG4gICAgICAgICAgICAgICAgaWYgKCF0aGlzLnNjZW5lKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy5zY2VuZS51cGRhdGUoKTtcbiAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgIC8vIFJldmVyc2UgdGhlIENTUyBwb3NpdGlvbmluZyBMZWFmbGV0IGFwcGxpZXMgdG8gdGhlIGxheWVyLCBzaW5jZSBUYW5ncmFtJ3MgV2ViR0wgY2FudmFzXG4gICAgICAgICAgICAvLyBpcyBleHBlY3RlZCB0byBiZSAnYWJzb2x1dGVseScgcG9zaXRpb25lZC5cbiAgICAgICAgICAgIHJldmVyc2VUcmFuc2Zvcm0gKCkge1xuICAgICAgICAgICAgICAgIGlmICghdGhpcy5fbWFwIHx8ICF0aGlzLnNjZW5lIHx8ICF0aGlzLnNjZW5lLmNvbnRhaW5lcikge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgdmFyIHRvcF9sZWZ0ID0gdGhpcy5fbWFwLmNvbnRhaW5lclBvaW50VG9MYXllclBvaW50KFswLCAwXSk7XG4gICAgICAgICAgICAgICAgTC5Eb21VdGlsLnNldFBvc2l0aW9uKHRoaXMuc2NlbmUuY29udGFpbmVyLCB0b3BfbGVmdCk7XG4gICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICAvLyBUaWUgTGVhZmxldCBldmVudCBoYW5kbGVycyB0byBUYW5ncmFtIGZlYXR1cmUgc2VsZWN0aW9uXG4gICAgICAgICAgICBzZXR1cFNlbGVjdGlvbkV2ZW50SGFuZGxlcnMgKG1hcCkge1xuICAgICAgICAgICAgICAgIHRoaXMuX3NlbGVjdGlvbl9ldmVudHMgPSB7fTtcblxuICAgICAgICAgICAgICAgIHRoaXMuaG9va3MuY2xpY2sgPSAoZXZlbnQpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiB0aGlzLl9zZWxlY3Rpb25fZXZlbnRzLmNsaWNrID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNjZW5lLmdldEZlYXR1cmVBdChldmVudC5jb250YWluZXJQb2ludCkuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlbihzZWxlY3Rpb24gPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgcmVzdWx0cyA9IE9iamVjdC5hc3NpZ24oe30sIHNlbGVjdGlvbiwgeyBsZWFmbGV0X2V2ZW50OiBldmVudCB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fc2VsZWN0aW9uX2V2ZW50cy5jbGljayhyZXN1bHRzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgbWFwLm9uKCdjbGljaycsIHRoaXMuaG9va3MuY2xpY2spO1xuXG4gICAgICAgICAgICAgICAgdGhpcy5ob29rcy5tb3VzZW1vdmUgPSAoZXZlbnQpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiB0aGlzLl9zZWxlY3Rpb25fZXZlbnRzLmhvdmVyID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnNjZW5lLmdldEZlYXR1cmVBdChldmVudC5jb250YWluZXJQb2ludCkuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlbihzZWxlY3Rpb24gPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgcmVzdWx0cyA9IE9iamVjdC5hc3NpZ24oe30sIHNlbGVjdGlvbiwgeyBsZWFmbGV0X2V2ZW50OiBldmVudCB9KTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fc2VsZWN0aW9uX2V2ZW50cy5ob3ZlcihyZXN1bHRzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgbWFwLm9uKCdtb3VzZW1vdmUnLCB0aGlzLmhvb2tzLm1vdXNlbW92ZSk7XG5cbiAgICAgICAgICAgICAgICB0aGlzLmhvb2tzLm1vdXNlb3V0ID0gKGV2ZW50KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIC8vIFdoZW4gbW91c2UgbGVhdmVzIG1hcCwgc2VuZCBhbiBhZGRpdGlvbmFsIHNlbGVjdGlvbiBldmVudCB0byBpbmRpY2F0ZSBubyBmZWF0dXJlIGlzIHNlbGVjdGVkXG4gICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgdGhpcy5fc2VsZWN0aW9uX2V2ZW50cy5ob3ZlciA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5fc2VsZWN0aW9uX2V2ZW50cy5ob3Zlcih7IGNoYW5nZWQ6IHRydWUsIGxlYWZsZXRfZXZlbnQ6IGV2ZW50IH0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBtYXAub24oJ21vdXNlb3V0JywgdGhpcy5ob29rcy5tb3VzZW91dCk7XG4gICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICAvLyBTZXQgdXNlci1kZWZpbmVkIGhhbmRsZXJzIGZvciBmZWF0dXJlIHNlbGVjdGlvbiBldmVudHNcbiAgICAgICAgICAgIC8vIEN1cnJlbnRseSBvbmx5IG9uZSBoYW5kbGVyIGNhbiBiZSBkZWZpbmVkIGZvciBlYWNoIGV2ZW50IHR5cGVcbiAgICAgICAgICAgIC8vIEV2ZW50IHR5cGVzIGFyZTogYGNsaWNrYCwgYGhvdmVyYCAobGVhZmxldCBgbW91c2Vtb3ZlYClcbiAgICAgICAgICAgIHNldFNlbGVjdGlvbkV2ZW50cyAoZXZlbnRzKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fc2VsZWN0aW9uX2V2ZW50cyA9IE9iamVjdC5hc3NpZ24odGhpcy5fc2VsZWN0aW9uX2V2ZW50cywgZXZlbnRzKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICB9KTtcblxuICAgICAgICAvLyBDcmVhdGUgdGhlIGxheWVyIGNsYXNzXG4gICAgICAgIExlYWZsZXRMYXllciA9IGxheWVyQmFzZUNsYXNzLmV4dGVuZChsYXllckNsYXNzQ29uZmlnKTtcblxuICAgICAgICAvLyBQb2x5ZmlsbCBzb21lIDEuMCBtZXRob2RzXG4gICAgICAgIGlmICh0eXBlb2YgTGVhZmxldExheWVyLnJlbW92ZSAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgTGVhZmxldExheWVyLnByb3RvdHlwZS5yZW1vdmUgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5fbWFwKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuX21hcC5yZW1vdmVMYXllcih0aGlzKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy5maXJlKCdyZW1vdmUnKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cblxuICAgICAgICBMZWFmbGV0TGF5ZXIubGF5ZXJCYXNlQ2xhc3MgPSBsYXllckJhc2VDbGFzcztcbiAgICAgICAgTGVhZmxldExheWVyLmxlYWZsZXRWZXJzaW9uID0gbGVhZmxldFZlcnNpb247XG5cbiAgICAgICAgcmV0dXJuIG5ldyBMZWFmbGV0TGF5ZXIob3B0aW9ucyk7XG4gICAgfVxufVxuIiwiaW1wb3J0IFNoYWRlclByb2dyYW0gZnJvbSAnLi9nbC9zaGFkZXJfcHJvZ3JhbSc7XG5pbXBvcnQgR0xTTCBmcm9tICcuL2dsL2dsc2wnO1xuaW1wb3J0IEdlbyBmcm9tICcuL2dlbyc7XG5pbXBvcnQgVmVjdG9yIGZyb20gJy4vdmVjdG9yJztcbmltcG9ydCB7U3R5bGVQYXJzZXJ9IGZyb20gJy4vc3R5bGVzL3N0eWxlX3BhcnNlcic7XG5cbmxldCBmcyA9IHJlcXVpcmUoJ2ZzJyk7XG5cbmNvbnN0IHNoYWRlclNyY19hbWJpZW50TGlnaHQgPSBmcy5yZWFkRmlsZVN5bmMoX19kaXJuYW1lICsgJy9nbC9zaGFkZXJzL2FtYmllbnRMaWdodC5nbHNsJywgJ3V0ZjgnKTtcbmNvbnN0IHNoYWRlclNyY19kaXJlY3Rpb25hbExpZ2h0ID0gZnMucmVhZEZpbGVTeW5jKF9fZGlybmFtZSArICcvZ2wvc2hhZGVycy9kaXJlY3Rpb25hbExpZ2h0Lmdsc2wnLCAndXRmOCcpO1xuY29uc3Qgc2hhZGVyU3JjX3BvaW50TGlnaHQgPSBmcy5yZWFkRmlsZVN5bmMoX19kaXJuYW1lICsgJy9nbC9zaGFkZXJzL3BvaW50TGlnaHQuZ2xzbCcsICd1dGY4Jyk7XG5jb25zdCBzaGFkZXJTcmNfc3BvdExpZ2h0ID0gZnMucmVhZEZpbGVTeW5jKF9fZGlybmFtZSArICcvZ2wvc2hhZGVycy9zcG90TGlnaHQuZ2xzbCcsICd1dGY4Jyk7XG5cbi8vIEFic3RyYWN0IGxpZ2h0XG5leHBvcnQgZGVmYXVsdCBjbGFzcyBMaWdodCB7XG5cbiAgICBjb25zdHJ1Y3RvciAodmlldywgY29uZmlnKSB7XG4gICAgICAgIHRoaXMubmFtZSA9IGNvbmZpZy5uYW1lO1xuICAgICAgICB0aGlzLnZpZXcgPSB2aWV3O1xuXG4gICAgICAgIGlmIChjb25maWcuYW1iaWVudCA9PSBudWxsIHx8IHR5cGVvZiBjb25maWcuYW1iaWVudCA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgICAgIHRoaXMuYW1iaWVudCA9IEdMU0wuZXhwYW5kVmVjMyhjb25maWcuYW1iaWVudCB8fCAwKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuYW1iaWVudCA9IFN0eWxlUGFyc2VyLnBhcnNlQ29sb3IoY29uZmlnLmFtYmllbnQpLnNsaWNlKDAsIDMpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKGNvbmZpZy5kaWZmdXNlID09IG51bGwgfHwgdHlwZW9mIGNvbmZpZy5kaWZmdXNlID09PSAnbnVtYmVyJykge1xuICAgICAgICAgICAgdGhpcy5kaWZmdXNlID0gR0xTTC5leHBhbmRWZWMzKGNvbmZpZy5kaWZmdXNlICE9IG51bGwgPyBjb25maWcuZGlmZnVzZSA6IDEpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5kaWZmdXNlID0gU3R5bGVQYXJzZXIucGFyc2VDb2xvcihjb25maWcuZGlmZnVzZSkuc2xpY2UoMCwgMyk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29uZmlnLnNwZWN1bGFyID09IG51bGwgfHwgdHlwZW9mIGNvbmZpZy5zcGVjdWxhciA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgICAgIHRoaXMuc3BlY3VsYXIgPSBHTFNMLmV4cGFuZFZlYzMoY29uZmlnLnNwZWN1bGFyIHx8IDApO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5zcGVjdWxhciA9IFN0eWxlUGFyc2VyLnBhcnNlQ29sb3IoY29uZmlnLnNwZWN1bGFyKS5zbGljZSgwLCAzKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIENyZWF0ZSBhIGxpZ2h0IGJ5IHR5cGUgbmFtZSwgZmFjdG9yeS1zdHlsZVxuICAgIC8vICdjb25maWcnIG11c3QgaW5jbHVkZSAnbmFtZScgYW5kICd0eXBlJywgYWxvbmcgd2l0aCBhbnkgb3RoZXIgdHlwZS1zcGVjaWZpYyBwcm9wZXJ0aWVzXG4gICAgc3RhdGljIGNyZWF0ZSAodmlldywgY29uZmlnKSB7XG4gICAgICAgIGlmIChMaWdodC50eXBlc1tjb25maWcudHlwZV0pIHtcbiAgICAgICAgICAgIHJldHVybiBuZXcgTGlnaHQudHlwZXNbY29uZmlnLnR5cGVdKHZpZXcsIGNvbmZpZyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBTZXQgbGlnaHQgZm9yIGEgc3R5bGU6IGZyYWdtZW50IGxpZ2h0aW5nLCB2ZXJ0ZXggbGlnaHRpbmcsIG9yIG5vbmVcbiAgICBzdGF0aWMgc2V0TW9kZSAobW9kZSwgc3R5bGUpIHtcbiAgICAgICAgaWYgKG1vZGUgPT09IHRydWUpIHtcbiAgICAgICAgICAgIG1vZGUgPSAnZnJhZ21lbnQnO1xuICAgICAgICB9XG4gICAgICAgIG1vZGUgPSBMaWdodC5lbmFibGVkICYmICgobW9kZSAhPSBudWxsKSA/IG1vZGUgOiAnZnJhZ21lbnQnKTsgLy8gZGVmYXVsdCB0byBmcmFnbWVudCBsaWdodGluZ1xuICAgICAgICBzdHlsZS5kZWZpbmVzWydUQU5HUkFNX0xJR0hUSU5HX0ZSQUdNRU5UJ10gPSAobW9kZSA9PT0gJ2ZyYWdtZW50Jyk7XG4gICAgICAgIHN0eWxlLmRlZmluZXNbJ1RBTkdSQU1fTElHSFRJTkdfVkVSVEVYJ10gPSAobW9kZSA9PT0gJ3ZlcnRleCcpO1xuICAgIH1cblxuICAgIC8vIEluamVjdCBhbGwgcHJvdmlkZWQgbGlnaHQgZGVmaW5pdGlvbnMsIGFuZCBjYWxjdWxhdGUgY3VtdWxhdGl2ZSBsaWdodCBmdW5jdGlvblxuICAgIHN0YXRpYyBpbmplY3QgKGxpZ2h0cykge1xuICAgICAgICAvLyBDbGVhciBwcmV2aW91cyBpbmplY3Rpb25zXG4gICAgICAgIFNoYWRlclByb2dyYW0ucmVtb3ZlQmxvY2soTGlnaHQuYmxvY2spO1xuXG4gICAgICAgIC8vIElmIGxpZ2h0aW5nIGlzIGdsb2JhbGx5IGRpc2FibGVkLCBub3RoaW5nIGlzIGluamVjdGVkIChtb3N0bHkgZm9yIGRlYnVnZ2luZyBvciBsaXZlIGVkaXRpbmcpXG4gICAgICAgIGlmICghTGlnaHQuZW5hYmxlZCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ29uc3RydWN0IGNvZGUgdG8gY2FsY3VsYXRlIGVhY2ggbGlnaHQgaW5zdGFuY2VcbiAgICAgICAgbGV0IGNhbGN1bGF0ZUxpZ2h0cyA9IFwiXCI7XG4gICAgICAgIGlmIChsaWdodHMgJiYgT2JqZWN0LmtleXMobGlnaHRzKS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAvLyBDb2xsZWN0IHVuaXF1ZXMgdHlwZXMgb2YgbGlnaHRzXG4gICAgICAgICAgICBsZXQgdHlwZXMgPSB7fTtcbiAgICAgICAgICAgIGZvciAobGV0IGxpZ2h0X25hbWUgaW4gbGlnaHRzKSB7XG4gICAgICAgICAgICAgICAgdHlwZXNbbGlnaHRzW2xpZ2h0X25hbWVdLnR5cGVdID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gSW5qZWN0IGVhY2ggdHlwZSBvZiBsaWdodFxuICAgICAgICAgICAgZm9yIChsZXQgdHlwZSBpbiB0eXBlcykge1xuICAgICAgICAgICAgICAgIExpZ2h0LnR5cGVzW3R5cGVdLmluamVjdCgpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBJbmplY3QgcGVyLWluc3RhbmNlIGJsb2NrcyBhbmQgY29uc3RydWN0IHRoZSBsaXN0IG9mIGZ1bmN0aW9ucyB0byBjYWxjdWxhdGUgZWFjaCBsaWdodFxuICAgICAgICAgICAgZm9yIChsZXQgbGlnaHRfbmFtZSBpbiBsaWdodHMpIHtcbiAgICAgICAgICAgICAgICAvLyBEZWZpbmUgaW5zdGFuY2VcbiAgICAgICAgICAgICAgICBsaWdodHNbbGlnaHRfbmFtZV0uaW5qZWN0KCk7XG5cbiAgICAgICAgICAgICAgICAvLyBBZGQgdGhlIGNhbGN1bGF0aW9uIGZ1bmN0aW9uIHRvIHRoZSBsaXN0XG4gICAgICAgICAgICAgICAgY2FsY3VsYXRlTGlnaHRzICs9IGBjYWxjdWxhdGVMaWdodCgke2xpZ2h0X25hbWV9LCBfZXllVG9Qb2ludCwgX25vcm1hbCk7XFxuYDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEdsdWUgdG9nZXRoZXIgdGhlIGZpbmFsIGxpZ2h0aW5nIGZ1bmN0aW9uIHRoYXQgc3VtcyBhbGwgdGhlIGxpZ2h0c1xuICAgICAgICBsZXQgY2FsY3VsYXRlRnVuY3Rpb24gPSBgXG4gICAgICAgICAgICB2ZWM0IGNhbGN1bGF0ZUxpZ2h0aW5nKGluIHZlYzMgX2V5ZVRvUG9pbnQsIGluIHZlYzMgX25vcm1hbCwgaW4gdmVjNCBfY29sb3IpIHtcblxuICAgICAgICAgICAgICAgIC8vIERvIGluaXRpYWwgbWF0ZXJpYWwgY2FsY3VsYXRpb25zIG92ZXIgbm9ybWFsLCBlbWlzc2lvbiwgYW1iaWVudCwgZGlmZnVzZSBhbmQgc3BlY3VsYXIgdmFsdWVzXG4gICAgICAgICAgICAgICAgY2FsY3VsYXRlTWF0ZXJpYWwoX2V5ZVRvUG9pbnQsX25vcm1hbCk7XG5cbiAgICAgICAgICAgICAgICAvLyBVbiByb2xsIHRoZSBsb29wIG9mIGluZGl2aWR1YWwgbGlndGhzIHRvIGNhbGN1bGF0ZVxuICAgICAgICAgICAgICAgICR7Y2FsY3VsYXRlTGlnaHRzfVxuXG4gICAgICAgICAgICAgICAgLy8gIEZpbmFsIGxpZ2h0IGludGVuc2l0eSBjYWxjdWxhdGlvblxuICAgICAgICAgICAgICAgIHZlYzQgY29sb3IgPSB2ZWM0KHZlYzMoMC4pLCBfY29sb3IuYSk7IC8vIHN0YXJ0IHdpdGggdmVydGV4IGNvbG9yIGFscGhhXG5cbiAgICAgICAgICAgICAgICAjaWZkZWYgVEFOR1JBTV9NQVRFUklBTF9FTUlTU0lPTlxuICAgICAgICAgICAgICAgICAgICBjb2xvci5yZ2IgPSBtYXRlcmlhbC5lbWlzc2lvbi5yZ2I7XG4gICAgICAgICAgICAgICAgICAgIGNvbG9yLmEgKj0gbWF0ZXJpYWwuZW1pc3Npb24uYTtcbiAgICAgICAgICAgICAgICAjZW5kaWZcblxuICAgICAgICAgICAgICAgICNpZmRlZiBUQU5HUkFNX01BVEVSSUFMX0FNQklFTlRcbiAgICAgICAgICAgICAgICAgICAgY29sb3IucmdiICs9IGxpZ2h0X2FjY3VtdWxhdG9yX2FtYmllbnQucmdiICogX2NvbG9yLnJnYiAqIG1hdGVyaWFsLmFtYmllbnQucmdiO1xuICAgICAgICAgICAgICAgICAgICBjb2xvci5hICo9IG1hdGVyaWFsLmFtYmllbnQuYTtcbiAgICAgICAgICAgICAgICAjZWxzZVxuICAgICAgICAgICAgICAgICAgICAjaWZkZWYgVEFOR1JBTV9NQVRFUklBTF9ESUZGVVNFXG4gICAgICAgICAgICAgICAgICAgICAgICBjb2xvci5yZ2IgKz0gbGlnaHRfYWNjdW11bGF0b3JfYW1iaWVudC5yZ2IgKiBfY29sb3IucmdiICogbWF0ZXJpYWwuZGlmZnVzZS5yZ2I7XG4gICAgICAgICAgICAgICAgICAgICNlbmRpZlxuICAgICAgICAgICAgICAgICNlbmRpZlxuXG4gICAgICAgICAgICAgICAgI2lmZGVmIFRBTkdSQU1fTUFURVJJQUxfRElGRlVTRVxuICAgICAgICAgICAgICAgICAgICBjb2xvci5yZ2IgKz0gbGlnaHRfYWNjdW11bGF0b3JfZGlmZnVzZS5yZ2IgKiBfY29sb3IucmdiICogbWF0ZXJpYWwuZGlmZnVzZS5yZ2I7XG4gICAgICAgICAgICAgICAgICAgIGNvbG9yLmEgKj0gbWF0ZXJpYWwuZGlmZnVzZS5hO1xuICAgICAgICAgICAgICAgICNlbmRpZlxuXG4gICAgICAgICAgICAgICAgI2lmZGVmIFRBTkdSQU1fTUFURVJJQUxfU1BFQ1VMQVJcbiAgICAgICAgICAgICAgICAgICAgY29sb3IucmdiICs9IGxpZ2h0X2FjY3VtdWxhdG9yX3NwZWN1bGFyLnJnYiAqIG1hdGVyaWFsLnNwZWN1bGFyLnJnYjtcbiAgICAgICAgICAgICAgICAgICAgY29sb3IuYSAqPSBtYXRlcmlhbC5zcGVjdWxhci5hO1xuICAgICAgICAgICAgICAgICNlbmRpZlxuXG4gICAgICAgICAgICAgICAgLy8gQ2xhbXAgZmluYWwgY29sb3JcbiAgICAgICAgICAgICAgICBjb2xvciA9IGNsYW1wKGNvbG9yLCAwLjAsIDEuMCk7XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gY29sb3I7XG4gICAgICAgICAgICB9YDtcblxuICAgICAgICBTaGFkZXJQcm9ncmFtLmFkZEJsb2NrKExpZ2h0LmJsb2NrLCBjYWxjdWxhdGVGdW5jdGlvbik7XG4gICAgfVxuXG4gICAgLy8gQ29tbW9uIGluc3RhbmNlIGRlZmluaXRpb25cbiAgICBpbmplY3QgKCkge1xuICAgICAgICBsZXQgaW5zdGFuY2UgPSAgYFxuICAgICAgICAgICAgdW5pZm9ybSAke3RoaXMuc3RydWN0X25hbWV9IHVfJHt0aGlzLm5hbWV9O1xuICAgICAgICAgICAgJHt0aGlzLnN0cnVjdF9uYW1lfSAke3RoaXMubmFtZX07XG4gICAgICAgICAgICBgO1xuICAgICAgICBsZXQgYXNzaWduID0gYFxuICAgICAgICAgICAgJHt0aGlzLm5hbWV9ID0gdV8ke3RoaXMubmFtZX07XFxuXG4gICAgICAgIGA7XG5cbiAgICAgICAgU2hhZGVyUHJvZ3JhbS5hZGRCbG9jayhMaWdodC5ibG9jaywgaW5zdGFuY2UpO1xuICAgICAgICBTaGFkZXJQcm9ncmFtLmFkZEJsb2NrKCdzZXR1cCcsIGFzc2lnbik7XG4gICAgfVxuXG4gICAgLy8gVXBkYXRlIG1ldGhvZCBjYWxsZWQgb25jZSBwZXIgZnJhbWVcbiAgICB1cGRhdGUgKCkge1xuICAgIH1cblxuICAgIC8vIENhbGxlZCBvbmNlIHBlciBmcmFtZSBwZXIgcHJvZ3JhbSAoZS5nLiBmb3IgbWFpbiByZW5kZXIgcGFzcywgdGhlbiBmb3IgZWFjaCBhZGRpdGlvbmFsXG4gICAgLy8gcGFzcyBmb3IgZmVhdHVyZSBzZWxlY3Rpb24sIGV0Yy4pXG4gICAgc2V0dXBQcm9ncmFtIChfcHJvZ3JhbSkge1xuICAgICAgICAvLyAgVGhyZWUgY29tbW9uIGxpZ2h0IHByb3BlcnRpZXNcbiAgICAgICAgX3Byb2dyYW0udW5pZm9ybSgnM2Z2JywgYHVfJHt0aGlzLm5hbWV9LmFtYmllbnRgLCB0aGlzLmFtYmllbnQpO1xuICAgICAgICBfcHJvZ3JhbS51bmlmb3JtKCczZnYnLCBgdV8ke3RoaXMubmFtZX0uZGlmZnVzZWAsIHRoaXMuZGlmZnVzZSk7XG4gICAgICAgIF9wcm9ncmFtLnVuaWZvcm0oJzNmdicsIGB1XyR7dGhpcy5uYW1lfS5zcGVjdWxhcmAsIHRoaXMuc3BlY3VsYXIpO1xuICAgIH1cblxufVxuXG5MaWdodC50eXBlcyA9IHt9OyAvLyByZWZlcmVuY2VzIHRvIHN1YmNsYXNzZXMgYnkgc2hvcnQgbmFtZVxuTGlnaHQuYmxvY2sgPSAnbGlnaHRpbmcnOyAvLyBzaGFkZXIgYmxvY2sgbmFtZVxuTGlnaHQuZW5hYmxlZCA9IHRydWU7IC8vIGxpZ2h0aW5nIGNhbiBiZSBnbG9iYWxseSBlbmFibGVkL2Rpc2FibGVkXG5cblxuLy8gTGlnaHQgc3ViY2xhc3Nlc1xuY2xhc3MgQW1iaWVudExpZ2h0IGV4dGVuZHMgTGlnaHQge1xuXG4gICAgY29uc3RydWN0b3IodmlldywgY29uZmlnKSB7XG4gICAgICAgIHN1cGVyKHZpZXcsIGNvbmZpZyk7XG4gICAgICAgIHRoaXMudHlwZSA9ICdhbWJpZW50JztcbiAgICAgICAgdGhpcy5zdHJ1Y3RfbmFtZSA9ICdBbWJpZW50TGlnaHQnO1xuICAgIH1cblxuICAgIC8vIEluamVjdCBzdHJ1Y3QgYW5kIGNhbGN1bGF0ZSBmdW5jdGlvblxuICAgIHN0YXRpYyBpbmplY3QoKSB7XG4gICAgICAgIFNoYWRlclByb2dyYW0uYWRkQmxvY2soTGlnaHQuYmxvY2ssIHNoYWRlclNyY19hbWJpZW50TGlnaHQpO1xuICAgIH1cblxuICAgIHNldHVwUHJvZ3JhbSAoX3Byb2dyYW0pIHtcbiAgICAgICAgX3Byb2dyYW0udW5pZm9ybSgnM2Z2JywgYHVfJHt0aGlzLm5hbWV9LmFtYmllbnRgLCB0aGlzLmFtYmllbnQpO1xuICAgIH1cblxufVxuTGlnaHQudHlwZXNbJ2FtYmllbnQnXSA9IEFtYmllbnRMaWdodDtcblxuY2xhc3MgRGlyZWN0aW9uYWxMaWdodCBleHRlbmRzIExpZ2h0IHtcblxuICAgIGNvbnN0cnVjdG9yKHZpZXcsIGNvbmZpZykge1xuICAgICAgICBzdXBlcih2aWV3LCBjb25maWcpO1xuICAgICAgICB0aGlzLnR5cGUgPSAnZGlyZWN0aW9uYWwnO1xuICAgICAgICB0aGlzLnN0cnVjdF9uYW1lID0gJ0RpcmVjdGlvbmFsTGlnaHQnO1xuXG4gICAgICAgIGlmIChjb25maWcuZGlyZWN0aW9uKSB7XG4gICAgICAgICAgICB0aGlzLl9kaXJlY3Rpb24gPSBjb25maWcuZGlyZWN0aW9uO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgLy8gRGVmYXVsdCBkaXJlY3Rpb25hbCBsaWdodCBtYWludGFpbnMgZnVsbCBpbnRlbnNpdHkgb24gZ3JvdW5kLCB3aXRoIGJhc2ljIGV4dHJ1c2lvbiBzaGFkaW5nXG4gICAgICAgICAgICBsZXQgdGhldGEgPSAxMzU7IC8vIGFuZ2xlIG9mIGxpZ2h0IGluIHh5IHBsYW5lIChyb3RhdGVkIGFyb3VuZCB6IGF4aXMpXG4gICAgICAgICAgICBsZXQgc2NhbGUgPSBNYXRoLnNpbihNYXRoLlBJKjYwLzE4MCk7IC8vIHNjYWxpbmcgZmFjdG9yIHRvIGtlZXAgdG90YWwgZGlyZWN0aW9uYWwgaW50ZW5zaXR5IHRvIDAuNVxuICAgICAgICAgICAgdGhpcy5fZGlyZWN0aW9uID0gW1xuICAgICAgICAgICAgICAgIE1hdGguY29zKE1hdGguUEkqdGhldGEvMTgwKSAqIHNjYWxlLFxuICAgICAgICAgICAgICAgIE1hdGguc2luKE1hdGguUEkqdGhldGEvMTgwKSAqIHNjYWxlLFxuICAgICAgICAgICAgICAgIC0wLjVcbiAgICAgICAgICAgIF07XG5cbiAgICAgICAgICAgIGlmIChjb25maWcuYW1iaWVudCA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5hbWJpZW50ID0gR0xTTC5leHBhbmRWZWMzKDAuNSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5kaXJlY3Rpb24gPSB0aGlzLl9kaXJlY3Rpb24ubWFwKHBhcnNlRmxvYXQpO1xuICAgIH1cblxuICAgIGdldCBkaXJlY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZGlyZWN0aW9uO1xuICAgIH1cblxuICAgIHNldCBkaXJlY3Rpb24gKHYpIHtcbiAgICAgICAgdGhpcy5fZGlyZWN0aW9uID0gVmVjdG9yLm5vcm1hbGl6ZSh2KTtcbiAgICB9XG5cbiAgICAvLyBJbmplY3Qgc3RydWN0IGFuZCBjYWxjdWxhdGUgZnVuY3Rpb25cbiAgICBzdGF0aWMgaW5qZWN0KCkge1xuICAgICAgICBTaGFkZXJQcm9ncmFtLmFkZEJsb2NrKExpZ2h0LmJsb2NrLCBzaGFkZXJTcmNfZGlyZWN0aW9uYWxMaWdodCk7XG4gICAgfVxuXG4gICAgc2V0dXBQcm9ncmFtIChfcHJvZ3JhbSkge1xuICAgICAgICBzdXBlci5zZXR1cFByb2dyYW0oX3Byb2dyYW0pO1xuICAgICAgICBfcHJvZ3JhbS51bmlmb3JtKCczZnYnLCBgdV8ke3RoaXMubmFtZX0uZGlyZWN0aW9uYCwgdGhpcy5kaXJlY3Rpb24pO1xuICAgIH1cblxufVxuTGlnaHQudHlwZXNbJ2RpcmVjdGlvbmFsJ10gPSBEaXJlY3Rpb25hbExpZ2h0O1xuXG5cbmNsYXNzIFBvaW50TGlnaHQgZXh0ZW5kcyBMaWdodCB7XG5cbiAgICBjb25zdHJ1Y3RvciAodmlldywgY29uZmlnKSB7XG4gICAgICAgIHN1cGVyKHZpZXcsIGNvbmZpZyk7XG4gICAgICAgIHRoaXMudHlwZSA9ICdwb2ludCc7XG4gICAgICAgIHRoaXMuc3RydWN0X25hbWUgPSAnUG9pbnRMaWdodCc7XG5cbiAgICAgICAgdGhpcy5wb3NpdGlvbiA9IGNvbmZpZy5wb3NpdGlvbiB8fCBbMCwgMCwgJzEwMHB4J107XG4gICAgICAgIHRoaXMucG9zaXRpb25fZXllID0gW107IC8vIHBvc2l0aW9uIGluIGV5ZXNwYWNlXG4gICAgICAgIHRoaXMub3JpZ2luID0gY29uZmlnLm9yaWdpbiB8fCAnZ3JvdW5kJztcbiAgICAgICAgdGhpcy5hdHRlbnVhdGlvbiA9ICFpc05hTihwYXJzZUZsb2F0KGNvbmZpZy5hdHRlbnVhdGlvbikpID8gcGFyc2VGbG9hdChjb25maWcuYXR0ZW51YXRpb24pIDogMDtcblxuICAgICAgICBpZiAoY29uZmlnLnJhZGl1cykge1xuICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoY29uZmlnLnJhZGl1cykgJiYgY29uZmlnLnJhZGl1cy5sZW5ndGggPT09IDIpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnJhZGl1cyA9IGNvbmZpZy5yYWRpdXM7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLnJhZGl1cyA9IFtudWxsLCBjb25maWcucmFkaXVzXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMucmFkaXVzID0gbnVsbDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIEluamVjdCBzdHJ1Y3QgYW5kIGNhbGN1bGF0ZSBmdW5jdGlvblxuICAgIHN0YXRpYyBpbmplY3QgKCkge1xuICAgICAgICBTaGFkZXJQcm9ncmFtLmFkZEJsb2NrKExpZ2h0LmJsb2NrLCBzaGFkZXJTcmNfcG9pbnRMaWdodCk7XG4gICAgfVxuXG4gICAgLy8gSW5qZWN0IGlzbnRhbmNlLXNwZWNpZmljIHNldHRpbmdzXG4gICAgaW5qZWN0KCkge1xuICAgICAgICBzdXBlci5pbmplY3QoKTtcblxuICAgICAgICBTaGFkZXJQcm9ncmFtLmRlZmluZXNbJ1RBTkdSQU1fUE9JTlRMSUdIVF9BVFRFTlVBVElPTl9FWFBPTkVOVCddID0gKHRoaXMuYXR0ZW51YXRpb24gIT09IDApO1xuICAgICAgICBTaGFkZXJQcm9ncmFtLmRlZmluZXNbJ1RBTkdSQU1fUE9JTlRMSUdIVF9BVFRFTlVBVElPTl9JTk5FUl9SQURJVVMnXSA9ICh0aGlzLnJhZGl1cyAhPSBudWxsICYmIHRoaXMucmFkaXVzWzBdICE9IG51bGwpO1xuICAgICAgICBTaGFkZXJQcm9ncmFtLmRlZmluZXNbJ1RBTkdSQU1fUE9JTlRMSUdIVF9BVFRFTlVBVElPTl9PVVRFUl9SQURJVVMnXSA9ICh0aGlzLnJhZGl1cyAhPSBudWxsKTtcbiAgICB9XG5cbiAgICB1cGRhdGUgKCkge1xuICAgICAgICB0aGlzLnVwZGF0ZUV5ZVBvc2l0aW9uKCk7XG4gICAgfVxuXG4gICAgdXBkYXRlRXllUG9zaXRpb24gKCkge1xuICAgICAgICBpZiAodGhpcy5vcmlnaW4gPT09ICd3b3JsZCcpIHtcbiAgICAgICAgICAgIC8vIEZvciB3b3JsZCBvcmlnaW4sIGZvcm1hdCBpczogW2xvbmdpdHVkZSwgbGF0aXR1ZGUsIG1ldGVycyAoZGVmYXVsdCkgb3IgcGl4ZWxzIHcvcHggdW5pdHNdXG5cbiAgICAgICAgICAgIC8vIE1vdmUgbGlnaHQncyB3b3JsZCBwb3NpdGlvbiBpbnRvIGNhbWVyYSBzcGFjZVxuICAgICAgICAgICAgbGV0IFt4LCB5XSA9IEdlby5sYXRMbmdUb01ldGVycyh0aGlzLnBvc2l0aW9uKTtcbiAgICAgICAgICAgIHRoaXMucG9zaXRpb25fZXllWzBdID0geCAtIHRoaXMudmlldy5jYW1lcmEucG9zaXRpb25fbWV0ZXJzWzBdO1xuICAgICAgICAgICAgdGhpcy5wb3NpdGlvbl9leWVbMV0gPSB5IC0gdGhpcy52aWV3LmNhbWVyYS5wb3NpdGlvbl9tZXRlcnNbMV07XG5cbiAgICAgICAgICAgIHRoaXMucG9zaXRpb25fZXllWzJdID0gU3R5bGVQYXJzZXIuY29udmVydFVuaXRzKHRoaXMucG9zaXRpb25bMl0sXG4gICAgICAgICAgICAgICAgeyB6b29tOiB0aGlzLnZpZXcuem9vbSwgbWV0ZXJzX3Blcl9waXhlbDogR2VvLm1ldGVyc1BlclBpeGVsKHRoaXMudmlldy56b29tKSB9KTtcbiAgICAgICAgICAgIHRoaXMucG9zaXRpb25fZXllWzJdID0gdGhpcy5wb3NpdGlvbl9leWVbMl0gLSB0aGlzLnZpZXcuY2FtZXJhLnBvc2l0aW9uX21ldGVyc1syXTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0aGlzLm9yaWdpbiA9PT0gJ2dyb3VuZCcgfHwgdGhpcy5vcmlnaW4gPT09ICdjYW1lcmEnKSB7XG4gICAgICAgICAgICAvLyBGb3IgY2FtZXJhIG9yIGdyb3VuZCBvcmlnaW4sIGZvcm1hdCBpczogW3gsIHksIHpdIGluIG1ldGVycyAoZGVmYXVsdCkgb3IgcGl4ZWxzIHcvcHggdW5pdHNcblxuICAgICAgICAgICAgLy8gTGlnaHQgaXMgaW4gY2FtZXJhIHNwYWNlIGJ5IGRlZmF1bHRcbiAgICAgICAgICAgIHRoaXMucG9zaXRpb25fZXllID0gU3R5bGVQYXJzZXIuY29udmVydFVuaXRzKHRoaXMucG9zaXRpb24sXG4gICAgICAgICAgICAgICAgeyB6b29tOiB0aGlzLnZpZXcuem9vbSwgbWV0ZXJzX3Blcl9waXhlbDogR2VvLm1ldGVyc1BlclBpeGVsKHRoaXMudmlldy56b29tKSB9KTtcblxuICAgICAgICAgICAgaWYgKHRoaXMub3JpZ2luID09PSAnZ3JvdW5kJykge1xuICAgICAgICAgICAgICAgIC8vIExlYXZlIGxpZ2h0J3MgeHkgaW4gY2FtZXJhIHNwYWNlLCBidXQgeiBuZWVkcyB0byBiZSBtb3ZlZCByZWxhdGl2ZSB0byBncm91bmQgcGxhbmVcbiAgICAgICAgICAgICAgICB0aGlzLnBvc2l0aW9uX2V5ZVsyXSA9IHRoaXMucG9zaXRpb25fZXllWzJdIC0gdGhpcy52aWV3LmNhbWVyYS5wb3NpdGlvbl9tZXRlcnNbMl07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5wb3NpdGlvbl9leWVbM10gPSAxO1xuICAgIH1cblxuICAgIHNldHVwUHJvZ3JhbSAoX3Byb2dyYW0pIHtcbiAgICAgICAgc3VwZXIuc2V0dXBQcm9ncmFtKF9wcm9ncmFtKTtcblxuICAgICAgICBfcHJvZ3JhbS51bmlmb3JtKCc0ZnYnLCBgdV8ke3RoaXMubmFtZX0ucG9zaXRpb25gLCB0aGlzLnBvc2l0aW9uX2V5ZSk7XG5cbiAgICAgICAgaWYoU2hhZGVyUHJvZ3JhbS5kZWZpbmVzWydUQU5HUkFNX1BPSU5UTElHSFRfQVRURU5VQVRJT05fRVhQT05FTlQnXSkge1xuICAgICAgICAgICAgX3Byb2dyYW0udW5pZm9ybSgnMWYnLCBgdV8ke3RoaXMubmFtZX0uYXR0ZW51YXRpb25FeHBvbmVudGAsIHRoaXMuYXR0ZW51YXRpb24pO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYoU2hhZGVyUHJvZ3JhbS5kZWZpbmVzWydUQU5HUkFNX1BPSU5UTElHSFRfQVRURU5VQVRJT05fSU5ORVJfUkFESVVTJ10pIHtcbiAgICAgICAgICAgIF9wcm9ncmFtLnVuaWZvcm0oJzFmJywgYHVfJHt0aGlzLm5hbWV9LmlubmVyUmFkaXVzYCxcbiAgICAgICAgICAgICAgICBTdHlsZVBhcnNlci5jb252ZXJ0VW5pdHModGhpcy5yYWRpdXNbMF0sXG4gICAgICAgICAgICAgICAgICAgIHsgem9vbTogdGhpcy52aWV3Lnpvb20sIG1ldGVyc19wZXJfcGl4ZWw6IEdlby5tZXRlcnNQZXJQaXhlbCh0aGlzLnZpZXcuem9vbSkgfSkpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYoU2hhZGVyUHJvZ3JhbS5kZWZpbmVzWydUQU5HUkFNX1BPSU5UTElHSFRfQVRURU5VQVRJT05fT1VURVJfUkFESVVTJ10pIHtcbiAgICAgICAgICAgIF9wcm9ncmFtLnVuaWZvcm0oJzFmJywgYHVfJHt0aGlzLm5hbWV9Lm91dGVyUmFkaXVzYCxcbiAgICAgICAgICAgICAgICBTdHlsZVBhcnNlci5jb252ZXJ0VW5pdHModGhpcy5yYWRpdXNbMV0sXG4gICAgICAgICAgICAgICAgICAgIHsgem9vbTogdGhpcy52aWV3Lnpvb20sIG1ldGVyc19wZXJfcGl4ZWw6IEdlby5tZXRlcnNQZXJQaXhlbCh0aGlzLnZpZXcuem9vbSkgfSkpO1xuICAgICAgICB9XG4gICAgfVxufVxuTGlnaHQudHlwZXNbJ3BvaW50J10gPSBQb2ludExpZ2h0O1xuXG5cbmNsYXNzIFNwb3RMaWdodCBleHRlbmRzIFBvaW50TGlnaHQge1xuXG4gICAgY29uc3RydWN0b3IgKHZpZXcsIGNvbmZpZykge1xuICAgICAgICBzdXBlcih2aWV3LCBjb25maWcpO1xuICAgICAgICB0aGlzLnR5cGUgPSAnc3BvdGxpZ2h0JztcbiAgICAgICAgdGhpcy5zdHJ1Y3RfbmFtZSA9ICdTcG90TGlnaHQnO1xuXG4gICAgICAgIHRoaXMuZGlyZWN0aW9uID0gdGhpcy5fZGlyZWN0aW9uID0gKGNvbmZpZy5kaXJlY3Rpb24gfHwgWzAsIDAsIC0xXSkubWFwKHBhcnNlRmxvYXQpOyAvLyBbeCwgeSwgel1cbiAgICAgICAgdGhpcy5leHBvbmVudCA9IGNvbmZpZy5leHBvbmVudCA/IHBhcnNlRmxvYXQoY29uZmlnLmV4cG9uZW50KSA6IDAuMjtcbiAgICAgICAgdGhpcy5hbmdsZSA9IGNvbmZpZy5hbmdsZSA/IHBhcnNlRmxvYXQoY29uZmlnLmFuZ2xlKSA6IDIwO1xuICAgIH1cblxuICAgIGdldCBkaXJlY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5fZGlyZWN0aW9uO1xuICAgIH1cblxuICAgIHNldCBkaXJlY3Rpb24gKHYpIHtcbiAgICAgICAgdGhpcy5fZGlyZWN0aW9uID0gVmVjdG9yLm5vcm1hbGl6ZSh2KTtcbiAgICB9XG5cbiAgICAvLyBJbmplY3Qgc3RydWN0IGFuZCBjYWxjdWxhdGUgZnVuY3Rpb25cbiAgICBzdGF0aWMgaW5qZWN0ICgpIHtcbiAgICAgICAgU2hhZGVyUHJvZ3JhbS5hZGRCbG9jayhMaWdodC5ibG9jaywgc2hhZGVyU3JjX3Nwb3RMaWdodCk7XG4gICAgfVxuXG4gICAgc2V0dXBQcm9ncmFtIChfcHJvZ3JhbSkge1xuICAgICAgICBzdXBlci5zZXR1cFByb2dyYW0oX3Byb2dyYW0pO1xuXG4gICAgICAgIF9wcm9ncmFtLnVuaWZvcm0oJzNmdicsIGB1XyR7dGhpcy5uYW1lfS5kaXJlY3Rpb25gLCB0aGlzLmRpcmVjdGlvbik7XG4gICAgICAgIF9wcm9ncmFtLnVuaWZvcm0oJzFmJywgYHVfJHt0aGlzLm5hbWV9LnNwb3RDb3NDdXRvZmZgLCBNYXRoLmNvcyh0aGlzLmFuZ2xlICogMy4xNDE1OSAvIDE4MCkpO1xuICAgICAgICBfcHJvZ3JhbS51bmlmb3JtKCcxZicsIGB1XyR7dGhpcy5uYW1lfS5zcG90RXhwb25lbnRgLCB0aGlzLmV4cG9uZW50KTtcbiAgICB9XG5cbn1cbkxpZ2h0LnR5cGVzWydzcG90bGlnaHQnXSA9IFNwb3RMaWdodDtcbiIsImltcG9ydCBHTFNMIGZyb20gJy4vZ2wvZ2xzbCc7XG5pbXBvcnQge1N0eWxlUGFyc2VyfSBmcm9tICcuL3N0eWxlcy9zdHlsZV9wYXJzZXInO1xuXG5sZXQgZnMgPSByZXF1aXJlKCdmcycpO1xuY29uc3Qgc2hhZGVyU3JjX21hdGVyaWFsID0gZnMucmVhZEZpbGVTeW5jKF9fZGlybmFtZSArICcvZ2wvc2hhZGVycy9tYXRlcmlhbC5nbHNsJywgJ3V0ZjgnKTtcblxuY29uc3QgbWF0ZXJpYWxfcHJvcHMgPSBbJ2VtaXNzaW9uJywgJ2FtYmllbnQnLCAnZGlmZnVzZScsICdzcGVjdWxhciddO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBNYXRlcmlhbCB7XG4gICAgY29uc3RydWN0b3IgKGNvbmZpZykge1xuXG4gICAgICAgIGNvbmZpZyA9IGNvbmZpZyB8fCB7fTtcblxuICAgICAgICAvLyBUaGVzZSBwcm9wZXJ0aWVzIGFsbCBoYXZlIHRoZSBzYW1lIGRlZmF1bHRzLCBzbyB0aGV5IGNhbiBiZSBzZXQgaW4gYnVsa1xuICAgICAgICBtYXRlcmlhbF9wcm9wcy5mb3JFYWNoKHByb3AgPT4ge1xuICAgICAgICAgICAgY29uc3QgdmFsdWUgPSBjb25maWdbcHJvcF07XG4gICAgICAgICAgICBpZiAodmFsdWUgIT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGlmICh2YWx1ZS50ZXh0dXJlKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXNbcHJvcF0gPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0ZXh0dXJlOiB2YWx1ZS50ZXh0dXJlLFxuICAgICAgICAgICAgICAgICAgICAgICAgbWFwcGluZzogdmFsdWUubWFwcGluZyB8fCAnc3BoZXJlbWFwJyxcbiAgICAgICAgICAgICAgICAgICAgICAgIHNjYWxlOiBHTFNMLmV4cGFuZFZlYzModmFsdWUuc2NhbGUgIT0gbnVsbCA/IHZhbHVlLnNjYWxlIDogMSksXG4gICAgICAgICAgICAgICAgICAgICAgICBhbW91bnQ6IEdMU0wuZXhwYW5kVmVjNCh2YWx1ZS5hbW91bnQgIT0gbnVsbCA/IHZhbHVlLmFtb3VudCA6IDEpXG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ251bWJlcicgfHwgQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpc1twcm9wXSA9IHsgYW1vdW50OiBHTFNMLmV4cGFuZFZlYzQodmFsdWUpIH07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpc1twcm9wXSA9IHsgYW1vdW50OiBTdHlsZVBhcnNlci5wYXJzZUNvbG9yKHZhbHVlKSB9O1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpc1twcm9wXSA9IHZhbHVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gRXh0cmEgc3BlY3VsYXIgcHJvcHNcbiAgICAgICAgaWYgKHRoaXMuc3BlY3VsYXIpIHtcbiAgICAgICAgICAgIHRoaXMuc3BlY3VsYXIuc2hpbmluZXNzID0gY29uZmlnLnNoaW5pbmVzcyA/IHBhcnNlRmxvYXQoY29uZmlnLnNoaW5pbmVzcykgOiAwLjI7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBOb3JtYWwgbWFwcGluZ1xuICAgICAgICBpZiAoY29uZmlnLm5vcm1hbCAhPSBudWxsKSB7XG4gICAgICAgICAgICB0aGlzLm5vcm1hbCA9IHtcbiAgICAgICAgICAgICAgICB0ZXh0dXJlOiBjb25maWcubm9ybWFsLnRleHR1cmUsXG4gICAgICAgICAgICAgICAgbWFwcGluZzogY29uZmlnLm5vcm1hbC5tYXBwaW5nIHx8ICd0cmlwbGFuYXInLFxuICAgICAgICAgICAgICAgIHNjYWxlOiBHTFNMLmV4cGFuZFZlYzMoY29uZmlnLm5vcm1hbC5zY2FsZSAhPSBudWxsID8gY29uZmlnLm5vcm1hbC5zY2FsZSA6IDEpLFxuICAgICAgICAgICAgICAgIGFtb3VudDogY29uZmlnLm5vcm1hbC5hbW91bnQgIT0gbnVsbCA/IGNvbmZpZy5ub3JtYWwuYW1vdW50IDogMVxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIERldGVybWluZSBpZiBhIG1hdGVyaWFsIGNvbmZpZyBibG9jayBoYXMgc3VmZmljaWVudCBwcm9wZXJ0aWVzIHRvIGNyZWF0ZSBhIG1hdGVyaWFsXG4gICAgc3RhdGljIGlzVmFsaWQgKGNvbmZpZykge1xuICAgICAgICBpZiAoY29uZmlnID09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjb25maWcuZW1pc3Npb24gPT0gbnVsbCAmJlxuICAgICAgICAgICAgY29uZmlnLmFtYmllbnQgPT0gbnVsbCAmJlxuICAgICAgICAgICAgY29uZmlnLmRpZmZ1c2UgPT0gbnVsbCAmJlxuICAgICAgICAgICAgY29uZmlnLnNwZWN1bGFyID09IG51bGwpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGluamVjdCAoc3R5bGUpIHtcbiAgICAgICAgLy8gRm9yIGVhY2ggcHJvcGVydHksIHNldHMgZGVmaW5lcyB0byBjb25maWd1cmUgdGV4dHVyZSBtYXBwaW5nLCB3aXRoIGEgcGF0dGVybiBsaWtlOlxuICAgICAgICAvLyAgIFRBTkdSQU1fTUFURVJJQUxfRElGRlVTRSwgVEFOR1JBTV9NQVRFUklBTF9ESUZGVVNFX1RFWFRVUkUsIFRBTkdSQU1fTUFURVJJQUxfRElGRlVTRV9URVhUVVJFX1NQSEVSRU1BUFxuICAgICAgICAvLyBBbHNvIHNldHMgZmxhZ3MgdG8ga2VlcCB0cmFjayBvZiBlYWNoIHVuaXF1ZSBtYXBwaW5nIHR5cGUgYmVpbmcgdXNlZCwgZS5nLjpcbiAgICAgICAgLy8gICBUQU5HUkFNX01BVEVSSUFMX1RFWFRVUkVfU1BIRVJFTUFQXG4gICAgICAgIC8vIEVuYWJsZXMgdGV4dHVyZSBjb29yZGluYXRlcyBpZiBuZWVkZWQgYW5kIG5vdCBhbHJlYWR5IG9uXG4gICAgICAgIG1hdGVyaWFsX3Byb3BzLmZvckVhY2gocHJvcCA9PiB7XG4gICAgICAgICAgICBsZXQgZGVmID0gYFRBTkdSQU1fTUFURVJJQUxfJHtwcm9wLnRvVXBwZXJDYXNlKCl9YDtcbiAgICAgICAgICAgIGxldCB0ZXhkZWYgPSBkZWYgKyAnX1RFWFRVUkUnO1xuICAgICAgICAgICAgc3R5bGUuZGVmaW5lc1tkZWZdID0gKHRoaXNbcHJvcF0gIT0gbnVsbCk7XG4gICAgICAgICAgICBpZiAodGhpc1twcm9wXSAmJiB0aGlzW3Byb3BdLnRleHR1cmUpIHtcbiAgICAgICAgICAgICAgICBzdHlsZS5kZWZpbmVzW3RleGRlZl0gPSB0cnVlO1xuICAgICAgICAgICAgICAgIHN0eWxlLmRlZmluZXNbdGV4ZGVmICsgJ18nICsgdGhpc1twcm9wXS5tYXBwaW5nLnRvVXBwZXJDYXNlKCldID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBzdHlsZS5kZWZpbmVzW2BUQU5HUkFNX01BVEVSSUFMX1RFWFRVUkVfJHt0aGlzW3Byb3BdLm1hcHBpbmcudG9VcHBlckNhc2UoKX1gXSA9IHRydWU7XG4gICAgICAgICAgICAgICAgc3R5bGUudGV4Y29vcmRzID0gc3R5bGUudGV4Y29vcmRzIHx8ICh0aGlzW3Byb3BdLm1hcHBpbmcgPT09ICd1dicpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICAvLyBOb3JtYWwgbWFwcGluZ1xuICAgICAgICAvLyBBcyBhbm92ZSwgc2V0cyBmbGFncyB0byBrZWVwIHRyYWNrIG9mIGVhY2ggdW5pcXVlIG1hcHBpbmcgdHlwZSBiZWluZyB1c2VkLCBlLmcuOlxuICAgICAgICAvLyAgIFRBTkdSQU1fTUFURVJJQUxfVEVYVFVSRV9TUEhFUkVNQVBcbiAgICAgICAgaWYgKHRoaXMubm9ybWFsICYmIHRoaXMubm9ybWFsLnRleHR1cmUpIHtcbiAgICAgICAgICAgIHN0eWxlLmRlZmluZXNbJ1RBTkdSQU1fTUFURVJJQUxfTk9STUFMX1RFWFRVUkUnXSA9IHRydWU7XG4gICAgICAgICAgICBzdHlsZS5kZWZpbmVzWydUQU5HUkFNX01BVEVSSUFMX05PUk1BTF9URVhUVVJFXycgKyB0aGlzLm5vcm1hbC5tYXBwaW5nLnRvVXBwZXJDYXNlKCldID0gdHJ1ZTtcbiAgICAgICAgICAgIHN0eWxlLmRlZmluZXNbYFRBTkdSQU1fTUFURVJJQUxfVEVYVFVSRV8ke3RoaXMubm9ybWFsLm1hcHBpbmcudG9VcHBlckNhc2UoKX1gXSA9IHRydWU7XG4gICAgICAgICAgICBzdHlsZS50ZXhjb29yZHMgPSBzdHlsZS50ZXhjb29yZHMgfHwgKHRoaXMubm9ybWFsLm1hcHBpbmcgPT09ICd1dicpO1xuICAgICAgICB9XG5cbiAgICAgICAgc3R5bGUucmVwbGFjZVNoYWRlckJsb2NrKE1hdGVyaWFsLmJsb2NrLCBzaGFkZXJTcmNfbWF0ZXJpYWwsICdNYXRlcmlhbCcpO1xuICAgICAgICBzdHlsZS5hZGRTaGFkZXJCbG9jaygnc2V0dXAnLCAnXFxubWF0ZXJpYWwgPSB1X21hdGVyaWFsO1xcbicsICdNYXRlcmlhbCcpO1xuICAgIH1cblxuICAgIHNldHVwUHJvZ3JhbSAoX3Byb2dyYW0pIHtcbiAgICAgICAgLy8gRm9yIGVhY2ggcHJvcGVydHksIHNldHMgdW5pZm9ybXMgaW4gdGhlIHBhdHRlcm46XG4gICAgICAgIC8vIHVfbWF0ZXJpYWwuZGlmZnVzZSwgdV9tYXRlcmlhbC5kaWZmdXNlU2NhbGUgdV9tYXRlcmlhbF9kaWZmdXNlX3RleHR1cmVcbiAgICAgICAgbWF0ZXJpYWxfcHJvcHMuZm9yRWFjaChwcm9wID0+IHtcbiAgICAgICAgICAgIGlmICh0aGlzW3Byb3BdKSB7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXNbcHJvcF0udGV4dHVyZSkge1xuICAgICAgICAgICAgICAgICAgICBfcHJvZ3JhbS5zZXRUZXh0dXJlVW5pZm9ybShgdV9tYXRlcmlhbF8ke3Byb3B9X3RleHR1cmVgLCB0aGlzW3Byb3BdLnRleHR1cmUpO1xuICAgICAgICAgICAgICAgICAgICBfcHJvZ3JhbS51bmlmb3JtKCczZnYnLCBgdV9tYXRlcmlhbC4ke3Byb3B9U2NhbGVgLCB0aGlzW3Byb3BdLnNjYWxlKTtcbiAgICAgICAgICAgICAgICAgICAgX3Byb2dyYW0udW5pZm9ybSgnNGZ2JywgYHVfbWF0ZXJpYWwuJHtwcm9wfWAsIHRoaXNbcHJvcF0uYW1vdW50KTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXNbcHJvcF0uYW1vdW50KSB7XG4gICAgICAgICAgICAgICAgICAgIF9wcm9ncmFtLnVuaWZvcm0oJzRmdicsIGB1X21hdGVyaWFsLiR7cHJvcH1gLCB0aGlzW3Byb3BdLmFtb3VudCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICAvLyBFeHRyYSBzcGVjdWxhciBwcm9wc1xuICAgICAgICBpZiAodGhpcy5zcGVjdWxhcikge1xuICAgICAgICAgICAgX3Byb2dyYW0udW5pZm9ybSgnMWYnLCAndV9tYXRlcmlhbC5zaGluaW5lc3MnLCB0aGlzLnNwZWN1bGFyLnNoaW5pbmVzcyk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBOb3JtYWwgbWFwcGluZ1xuICAgICAgICBpZiAodGhpcy5ub3JtYWwgJiYgdGhpcy5ub3JtYWwudGV4dHVyZSkge1xuICAgICAgICAgICAgX3Byb2dyYW0uc2V0VGV4dHVyZVVuaWZvcm0oJ3VfbWF0ZXJpYWxfbm9ybWFsX3RleHR1cmUnLCB0aGlzLm5vcm1hbC50ZXh0dXJlKTtcbiAgICAgICAgICAgIF9wcm9ncmFtLnVuaWZvcm0oJzNmdicsICd1X21hdGVyaWFsLm5vcm1hbFNjYWxlJywgdGhpcy5ub3JtYWwuc2NhbGUpO1xuICAgICAgICAgICAgX3Byb2dyYW0udW5pZm9ybSgnMWYnLCAndV9tYXRlcmlhbC5ub3JtYWxBbW91bnQnLCB0aGlzLm5vcm1hbC5hbW91bnQpO1xuICAgICAgICB9XG4gICAgfVxufVxuXG5NYXRlcmlhbC5ibG9jayA9ICdtYXRlcmlhbCc7XG4iLCIvKmpzaGludCB3b3JrZXI6IHRydWUqL1xuXG5pbXBvcnQgJy4vdXRpbHMvcG9seWZpbGxzJztcblxuLy8gVGhlIGxlYWZsZXQgbGF5ZXIgcGx1Z2luIGlzIGN1cnJlbnRseSB0aGUgcHJpbWFyeSBwdWJsaWMgQVBJXG5pbXBvcnQge2xlYWZsZXRMYXllcn0gZnJvbSAnLi9sZWFmbGV0X2xheWVyJztcblxuLy8gVGhlIHNjZW5lIHdvcmtlciBpcyBvbmx5IGFjdGl2YXRlZCB3aGVuIGEgd29ya2VyIHRocmVhZCBpcyBpbnN0YW50aWF0ZWQsIGJ1dCBtdXN0IGFsd2F5cyBiZSBsb2FkZWRcbmltcG9ydCBTY2VuZSBmcm9tICcuL3NjZW5lJztcbmltcG9ydCB7U2NlbmVXb3JrZXJ9IGZyb20gJy4vc2NlbmVfd29ya2VyJztcblxuLy8gQWRkaXRpb25hbCBtb2R1bGVzIGFyZSBleHBvc2VkIGZvciBkZWJ1Z2dpbmdcbmltcG9ydCB2ZXJzaW9uIGZyb20gJy4vdXRpbHMvdmVyc2lvbic7XG5pbXBvcnQgbG9nIGZyb20gJy4vdXRpbHMvbG9nJztcbmltcG9ydCBUaHJlYWQgZnJvbSAnLi91dGlscy90aHJlYWQnO1xuaW1wb3J0IFV0aWxzIGZyb20gJy4vdXRpbHMvdXRpbHMnO1xuaW1wb3J0IEdlbyBmcm9tICcuL2dlbyc7XG5pbXBvcnQgVmVjdG9yIGZyb20gJy4vdmVjdG9yJztcbmltcG9ydCBEYXRhU291cmNlIGZyb20gJy4vc291cmNlcy9kYXRhX3NvdXJjZSc7XG5pbXBvcnQgJy4vc291cmNlcy9nZW9qc29uJztcbmltcG9ydCAnLi9zb3VyY2VzL3RvcG9qc29uJztcbmltcG9ydCAnLi9zb3VyY2VzL212dCc7XG5pbXBvcnQgJy4vc291cmNlcy9yYXN0ZXInO1xuaW1wb3J0IEdMU0wgZnJvbSAnLi9nbC9nbHNsJztcbmltcG9ydCBTaGFkZXJQcm9ncmFtIGZyb20gJy4vZ2wvc2hhZGVyX3Byb2dyYW0nO1xuaW1wb3J0IFZlcnRleERhdGEgZnJvbSAnLi9nbC92ZXJ0ZXhfZGF0YSc7XG5pbXBvcnQgVGV4dHVyZSBmcm9tICcuL2dsL3RleHR1cmUnO1xuaW1wb3J0IE1hdGVyaWFsIGZyb20gJy4vbWF0ZXJpYWwnO1xuaW1wb3J0IExpZ2h0IGZyb20gJy4vbGlnaHQnO1xuaW1wb3J0IFdvcmtlckJyb2tlciBmcm9tICcuL3V0aWxzL3dvcmtlcl9icm9rZXInO1xuaW1wb3J0IHtsYXllcl9jYWNoZX0gZnJvbSAnLi9zdHlsZXMvbGF5ZXInO1xuaW1wb3J0IHtTdHlsZU1hbmFnZXJ9IGZyb20gJy4vc3R5bGVzL3N0eWxlX21hbmFnZXInO1xuaW1wb3J0IHtTdHlsZVBhcnNlcn0gZnJvbSAnLi9zdHlsZXMvc3R5bGVfcGFyc2VyJztcbmltcG9ydCBDb2xsaXNpb24gZnJvbSAnLi9sYWJlbHMvY29sbGlzaW9uJztcbmltcG9ydCBGZWF0dXJlU2VsZWN0aW9uIGZyb20gJy4vc2VsZWN0aW9uJztcbmltcG9ydCBDYW52YXNUZXh0IGZyb20gJy4vc3R5bGVzL3RleHQvY2FudmFzX3RleHQnO1xuaW1wb3J0IGRlYnVnU2V0dGluZ3MgZnJvbSAnLi91dGlscy9kZWJ1Z19zZXR0aW5ncyc7XG5cbmltcG9ydCB5YW1sIGZyb20gJ2pzLXlhbWwnO1xuaW1wb3J0IEpTWmlwIGZyb20gJ2pzemlwJztcblxuLy8gTWFrZSBzb21lIG1vZHVsZXMgYWNjZXNzaWJsZSBmb3IgZGVidWdnaW5nXG52YXIgZGVidWcgPSB7XG4gICAgbG9nLFxuICAgIHlhbWwsXG4gICAgVGhyZWFkLFxuICAgIFV0aWxzLFxuICAgIEdlbyxcbiAgICBWZWN0b3IsXG4gICAgRGF0YVNvdXJjZSxcbiAgICBHTFNMLFxuICAgIFNoYWRlclByb2dyYW0sXG4gICAgVmVydGV4RGF0YSxcbiAgICBUZXh0dXJlLFxuICAgIE1hdGVyaWFsLFxuICAgIExpZ2h0LFxuICAgIFNjZW5lLFxuICAgIFNjZW5lV29ya2VyLFxuICAgIFdvcmtlckJyb2tlcixcbiAgICBsYXllcl9jYWNoZSxcbiAgICBTdHlsZU1hbmFnZXIsXG4gICAgU3R5bGVQYXJzZXIsXG4gICAgQ29sbGlzaW9uLFxuICAgIEZlYXR1cmVTZWxlY3Rpb24sXG4gICAgQ2FudmFzVGV4dCxcbiAgICBkZWJ1Z1NldHRpbmdzXG59O1xuXG5pZiAoVGhyZWFkLmlzX21haW4pIHtcbiAgICBVdGlscy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWVQb2x5ZmlsbCgpO1xuXG4gICAgLy8gQXR0YWNoIFByb21pc2UgcG9seWZpbGwgdG8gd2luZG93XG4gICAgLy8gQWxsb3dzIEZvbnRGYWNlT2JzZXJ2ZXIgdG8gdXNlIHBvbHlmaWxsICh3aXRob3V0IG5lZWRpbmcgdG8gaW5jbHVkZSBpdHMgb3duIGR1cGxpY2F0ZSBwb2x5ZmlsbClcbiAgICBpZiAod2luZG93LlByb21pc2UgPT09IHVuZGVmaW5lZCkge1xuICAgICAgICB3aW5kb3cuUHJvbWlzZSA9IFByb21pc2U7XG4gICAgICAgIEpTWmlwLmV4dGVybmFsLlByb21pc2UgPSBQcm9taXNlO1xuICAgIH1cbn1cblxubW9kdWxlLmV4cG9ydHMgPSB7XG4gICAgbGVhZmxldExheWVyLFxuICAgIGRlYnVnLFxuICAgIHZlcnNpb25cbn07XG4iLCJpbXBvcnQgbG9nIGZyb20gJy4vdXRpbHMvbG9nJztcbmltcG9ydCBVdGlscyBmcm9tICcuL3V0aWxzL3V0aWxzJztcbmltcG9ydCAqIGFzIFVSTHMgZnJvbSAnLi91dGlscy91cmxzJztcbmltcG9ydCBXb3JrZXJCcm9rZXIgZnJvbSAnLi91dGlscy93b3JrZXJfYnJva2VyJztcbmltcG9ydCBzdWJzY3JpYmVNaXhpbiBmcm9tICcuL3V0aWxzL3N1YnNjcmliZSc7XG5pbXBvcnQgQ29udGV4dCBmcm9tICcuL2dsL2NvbnRleHQnO1xuaW1wb3J0IFRleHR1cmUgZnJvbSAnLi9nbC90ZXh0dXJlJztcbmltcG9ydCBTaGFkZXJQcm9ncmFtIGZyb20gJy4vZ2wvc2hhZGVyX3Byb2dyYW0nO1xuaW1wb3J0IFZlcnRleEFycmF5T2JqZWN0IGZyb20gJy4vZ2wvdmFvJztcbmltcG9ydCB7U3R5bGVNYW5hZ2VyfSBmcm9tICcuL3N0eWxlcy9zdHlsZV9tYW5hZ2VyJztcbmltcG9ydCB7U3R5bGV9IGZyb20gJy4vc3R5bGVzL3N0eWxlJztcbmltcG9ydCB7U3R5bGVQYXJzZXJ9IGZyb20gJy4vc3R5bGVzL3N0eWxlX3BhcnNlcic7XG5pbXBvcnQgU2NlbmVMb2FkZXIgZnJvbSAnLi9zY2VuZV9sb2FkZXInO1xuaW1wb3J0IFZpZXcgZnJvbSAnLi92aWV3JztcbmltcG9ydCBMaWdodCBmcm9tICcuL2xpZ2h0JztcbmltcG9ydCBUaWxlTWFuYWdlciBmcm9tICcuL3RpbGVfbWFuYWdlcic7XG5pbXBvcnQgRGF0YVNvdXJjZSBmcm9tICcuL3NvdXJjZXMvZGF0YV9zb3VyY2UnO1xuaW1wb3J0IEZlYXR1cmVTZWxlY3Rpb24gZnJvbSAnLi9zZWxlY3Rpb24nO1xuaW1wb3J0IFJlbmRlclN0YXRlTWFuYWdlciBmcm9tICcuL2dsL3JlbmRlcl9zdGF0ZSc7XG5pbXBvcnQgRm9udE1hbmFnZXIgZnJvbSAnLi9zdHlsZXMvdGV4dC9mb250X21hbmFnZXInO1xuaW1wb3J0IE1lZGlhQ2FwdHVyZSBmcm9tICcuL3V0aWxzL21lZGlhX2NhcHR1cmUnO1xuXG4vLyBMb2FkIHNjZW5lIGRlZmluaXRpb246IHBhc3MgYW4gb2JqZWN0IGRpcmVjdGx5LCBvciBhIFVSTCBhcyBzdHJpbmcgdG8gbG9hZCByZW1vdGVseVxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgU2NlbmUge1xuXG4gICAgY29uc3RydWN0b3IoY29uZmlnX3NvdXJjZSwgb3B0aW9ucykge1xuICAgICAgICBvcHRpb25zID0gb3B0aW9ucyB8fCB7fTtcbiAgICAgICAgc3Vic2NyaWJlTWl4aW4odGhpcyk7XG5cbiAgICAgICAgdGhpcy5pZCA9IFNjZW5lLmlkKys7XG4gICAgICAgIHRoaXMuaW5pdGlhbGl6ZWQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5pbml0aWFsaXppbmcgPSBudWxsOyAvLyB3aWxsIGJlIGEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdoZW4gc2NlbmUgaXMgbG9hZGVkXG4gICAgICAgIHRoaXMuc291cmNlcyA9IHt9O1xuXG4gICAgICAgIHRoaXMudmlldyA9IG5ldyBWaWV3KHRoaXMsIG9wdGlvbnMpO1xuICAgICAgICB0aGlzLnRpbGVfbWFuYWdlciA9IG5ldyBUaWxlTWFuYWdlcih7IHNjZW5lOiB0aGlzLCB2aWV3OiB0aGlzLnZpZXcgfSk7XG4gICAgICAgIHRoaXMubnVtX3dvcmtlcnMgPSBvcHRpb25zLm51bVdvcmtlcnMgfHwgMjtcbiAgICAgICAgdGhpcy53b3JrZXJfdXJsID0gb3B0aW9ucy53b3JrZXJVcmw7XG4gICAgICAgIGlmIChvcHRpb25zLmRpc2FibGVWZXJ0ZXhBcnJheU9iamVjdHMgPT09IHRydWUpIHtcbiAgICAgICAgICAgIFZlcnRleEFycmF5T2JqZWN0LmRpc2FibGVkID0gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIFV0aWxzLnVzZV9oaWdoX2RlbnNpdHlfZGlzcGxheSA9IG9wdGlvbnMuaGlnaERlbnNpdHlEaXNwbGF5ICE9PSB1bmRlZmluZWQgPyBvcHRpb25zLmhpZ2hEZW5zaXR5RGlzcGxheSA6IHRydWU7XG4gICAgICAgIFV0aWxzLnVwZGF0ZURldmljZVBpeGVsUmF0aW8oKTtcblxuICAgICAgICB0aGlzLmNvbmZpZyA9IG51bGw7XG4gICAgICAgIHRoaXMuY29uZmlnX3NvdXJjZSA9IGNvbmZpZ19zb3VyY2U7XG4gICAgICAgIHRoaXMuY29uZmlnX2J1bmRsZSA9IG51bGw7XG4gICAgICAgIHRoaXMuY29uZmlnX3NlcmlhbGl6ZWQgPSBudWxsO1xuICAgICAgICB0aGlzLmxhc3RfdmFsaWRfY29uZmlnX3NvdXJjZSA9IG51bGw7XG5cbiAgICAgICAgdGhpcy5zdHlsZXMgPSBudWxsO1xuICAgICAgICB0aGlzLnN0eWxlX21hbmFnZXIgPSBuZXcgU3R5bGVNYW5hZ2VyKCk7XG5cbiAgICAgICAgdGhpcy5idWlsZGluZyA9IG51bGw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHJhY2tzIGN1cnJlbnQgc2NlbmUgYnVpbGRpbmcgc3RhdGUgKHRpbGVzIGJlaW5nIGJ1aWx0LCBldGMuKVxuICAgICAgICB0aGlzLmRpcnR5ID0gdHJ1ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZXF1ZXN0IGEgcmVkcmF3XG4gICAgICAgIHRoaXMuYW5pbWF0ZWQgPSBmYWxzZTsgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlcXVlc3QgcmVkcmF3IGV2ZXJ5IGZyYW1lXG4gICAgICAgIHRoaXMucHJlVXBkYXRlID0gb3B0aW9ucy5wcmVVcGRhdGU7ICAgICAgICAgICAgIC8vIG9wdGlvbmFsIHByZS1yZW5kZXIgbG9vcCBob29rXG4gICAgICAgIHRoaXMucG9zdFVwZGF0ZSA9IG9wdGlvbnMucG9zdFVwZGF0ZTsgICAgICAgICAgIC8vIG9wdGlvbmFsIHBvc3QtcmVuZGVyIGxvb3AgaG9va1xuICAgICAgICB0aGlzLnJlbmRlcl9sb29wID0gIW9wdGlvbnMuZGlzYWJsZVJlbmRlckxvb3A7ICAvLyBkaXNhYmxlIHJlbmRlciBsb29wIC0gYXBwIHdpbGwgaGF2ZSB0byBtYW51YWxseSBjYWxsIFNjZW5lLnJlbmRlcigpIHBlciBmcmFtZVxuICAgICAgICB0aGlzLnJlbmRlcl9sb29wX2FjdGl2ZSA9IGZhbHNlO1xuICAgICAgICB0aGlzLnJlbmRlcl9sb29wX3N0b3AgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5yZW5kZXJfY291bnQgPSAwO1xuICAgICAgICB0aGlzLmxhc3RfcmVuZGVyX2NvdW50ID0gMDtcbiAgICAgICAgdGhpcy5yZW5kZXJfY291bnRfY2hhbmdlZCA9IGZhbHNlO1xuICAgICAgICB0aGlzLmZyYW1lID0gMDtcbiAgICAgICAgdGhpcy5tZWRpYV9jYXB0dXJlID0gbmV3IE1lZGlhQ2FwdHVyZSgpO1xuICAgICAgICB0aGlzLnNlbGVjdGlvbiA9IG51bGw7XG4gICAgICAgIHRoaXMuaW50cm9zcGVjdGlvbiA9IGZhbHNlO1xuICAgICAgICB0aGlzLnJlc2V0VGltZSgpO1xuXG4gICAgICAgIHRoaXMuY29udGFpbmVyID0gb3B0aW9ucy5jb250YWluZXI7XG5cbiAgICAgICAgdGhpcy5saWdodHMgPSBudWxsO1xuICAgICAgICB0aGlzLmJhY2tncm91bmQgPSBudWxsO1xuXG4gICAgICAgIHRoaXMuY3JlYXRlTGlzdGVuZXJzKCk7XG4gICAgICAgIHRoaXMudXBkYXRpbmcgPSAwO1xuICAgICAgICB0aGlzLmdlbmVyYXRpb24gPSBTY2VuZS5nZW5lcmF0aW9uOyAvLyBhbiBpZCB0aGF0IGlzIGluY3JlbWVudGVkIGVhY2ggdGltZSB0aGUgc2NlbmUgY29uZmlnIGlzIGludmFsaWRhdGVkXG4gICAgICAgIHRoaXMubGFzdF9jb21wbGV0ZV9nZW5lcmF0aW9uID0gU2NlbmUuZ2VuZXJhdGlvbjsgLy8gbGFzdCBnZW5lcmF0aW9uIGlkIHdpdGggYSBjb21wbGV0ZSB2aWV3XG4gICAgICAgIHRoaXMuc2V0dXBEZWJ1ZygpO1xuXG4gICAgICAgIHRoaXMubG9nX2xldmVsID0gb3B0aW9ucy5sb2dMZXZlbCB8fCAnd2Fybic7XG4gICAgICAgIGxvZy5zZXRMZXZlbCh0aGlzLmxvZ19sZXZlbCk7XG4gICAgfVxuXG4gICAgc3RhdGljIGNyZWF0ZSAoY29uZmlnLCBvcHRpb25zID0ge30pIHtcbiAgICAgICAgcmV0dXJuIG5ldyBTY2VuZShjb25maWcsIG9wdGlvbnMpO1xuICAgIH1cblxuICAgIC8vIExvYWQgc2NlbmUgKG9yIHJlbG9hZCBleGlzdGluZyBzY2VuZSBpZiBubyBuZXcgc291cmNlIHNwZWNpZmllZClcbiAgICAvLyBPcHRpb25zOlxuICAgIC8vICAgYGNvbmZpZ19wYXRoYDogYmFzZSBVUkwgYWdhaW5zdCB3aGljaCByb28gc2NlbmUgcmVzb3VyY2VzIHNob3VsZCBiZSByZXNvbHZlZCAodXNlZnVsIGZvciBQbGF5KSAoZGVmYXVsdCBudWxsbClcbiAgICAvLyAgIGBibG9ja2luZ2A6IHNob3VsZCByZW5kZXJpbmcgYmxvY2sgb24gc2NlbmUgbG9hZCBjb21wbGV0aW9uIChkZWZhdWx0IHRydWUpXG4gICAgbG9hZChjb25maWdfc291cmNlID0gbnVsbCwgb3B0aW9ucyA9IHt9KSB7XG4gICAgICAgIGlmICh0aGlzLmluaXRpYWxpemluZykge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuaW5pdGlhbGl6aW5nO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy51cGRhdGluZysrO1xuICAgICAgICB0aGlzLmluaXRpYWxpemVkID0gZmFsc2U7XG5cbiAgICAgICAgLy8gQmFja3dhcmRzIGNvbXBhdGliaWx0eSBmb3IgcGFzc2luZyBgY29uZmlnX3BhdGhgIHN0cmluZyBhcyBzZWNvbmQgYXJndW1lbnRcbiAgICAgICAgLy8gKHNpbmNlIHRyYW5zaXRpb25lZCB0byB1c2luZyBvcHRpb25zIGFyZ3VtZW50IHRvIGFjY2VwdCBtb3JlIHBhcmFtZXRlcnMpXG4gICAgICAgIG9wdGlvbnMgPSAodHlwZW9mIG9wdGlvbnMgPT09ICdzdHJpbmcnKSA/IHsgY29uZmlnX3BhdGg6IG9wdGlvbnMgfSA6IG9wdGlvbnM7XG4gICAgICAgIGxldCBjb25maWdfcGF0aCA9IG9wdGlvbnMuY29uZmlnX3BhdGg7XG5cbiAgICAgICAgLy8gU2hvdWxkIHJlbmRlcmluZyBibG9jayBvbiBsb2FkIChub3QgZGVzaXJhYmxlIGZvciBpbml0aWFsIGxvYWQsIG9mdGVuIGRlc2lyZWQgZm9yIGxpdmUgc3R5bGUtc3dpdGNoaW5nKVxuICAgICAgICBvcHRpb25zLmJsb2NraW5nID0gKG9wdGlvbnMuYmxvY2tpbmcgIT09IHVuZGVmaW5lZCkgPyBvcHRpb25zLmJsb2NraW5nIDogdHJ1ZTtcblxuICAgICAgICAvLyBMb2FkIHNjZW5lIGRlZmluaXRpb24gKHNvdXJjZXMsIHN0eWxlcywgZXRjLiksIHRoZW4gY3JlYXRlIHN0eWxlcyAmIHdvcmtlcnNcbiAgICAgICAgdGhpcy5jcmVhdGVDYW52YXMoKTtcbiAgICAgICAgdGhpcy5pbml0aWFsaXppbmcgPSB0aGlzLmxvYWRTY2VuZShjb25maWdfc291cmNlLCBjb25maWdfcGF0aClcbiAgICAgICAgICAgIC50aGVuKCgpID0+IHRoaXMuY3JlYXRlV29ya2VycygpKVxuICAgICAgICAgICAgLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMucmVzZXRGZWF0dXJlU2VsZWN0aW9uKCk7XG5cbiAgICAgICAgICAgICAgICAvLyBTY2VuZSBsb2FkZWQgZnJvbSBhIEpTIG9iamVjdCwgb3IgbW9kaWZpZWQgYnkgYSBgbG9hZGAgZXZlbnQsIG1heSBjb250YWluIGNvbXBpbGVkIEpTIGZ1bmN0aW9uc1xuICAgICAgICAgICAgICAgIC8vIHdoaWNoIG5lZWQgdG8gYmUgc2VyaWFsaXplZCwgd2hpbGUgb25lIGxvYWRlZCBvbmx5IGZyb20gYSBVUkwgZG9lcyBub3QuXG4gICAgICAgICAgICAgICAgY29uc3Qgc2VyaWFsaXplX2Z1bmNzID0gKCh0eXBlb2YgdGhpcy5jb25maWdfc291cmNlID09PSAnb2JqZWN0JykgfHwgdGhpcy5oYXNTdWJzY3JpYmVyc0ZvcignbG9hZCcpKTtcblxuICAgICAgICAgICAgICAgIGNvbnN0IHVwZGF0aW5nID0gdGhpcy51cGRhdGVDb25maWcoeyBzZXJpYWxpemVfZnVuY3MsIGZhZGVfaW46IHRydWUgfSk7XG4gICAgICAgICAgICAgICAgaWYgKG9wdGlvbnMuYmxvY2tpbmcgPT09IHRydWUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHVwZGF0aW5nO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgICAgIHRoaXMudXBkYXRpbmctLTtcbiAgICAgICAgICAgICAgICB0aGlzLmluaXRpYWxpemluZyA9IG51bGw7XG4gICAgICAgICAgICAgICAgdGhpcy5pbml0aWFsaXplZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgdGhpcy5sYXN0X3ZhbGlkX2NvbmZpZ19zb3VyY2UgPSB0aGlzLmNvbmZpZ19zb3VyY2U7XG4gICAgICAgICAgICAgICAgdGhpcy5sYXN0X3ZhbGlkX2NvbmZpZ19wYXRoID0gdGhpcy5jb25maWdfcGF0aDtcblxuICAgICAgICAgICAgICAgIGlmICh0aGlzLnJlbmRlcl9sb29wICE9PSBmYWxzZSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLnNldHVwUmVuZGVyTG9vcCgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB0aGlzLnJlcXVlc3RSZWRyYXcoKTtcbiAgICAgICAgfSkuY2F0Y2goZXJyb3IgPT4ge1xuICAgICAgICAgICAgdGhpcy5pbml0aWFsaXppbmcgPSBudWxsO1xuICAgICAgICAgICAgdGhpcy51cGRhdGluZyA9IDA7XG5cbiAgICAgICAgICAgIC8vIFJlcG9ydCBhbmQgcmV2ZXJ0IHRvIGxhc3QgdmFsaWQgY29uZmlnIGlmIGF2YWlsYWJsZVxuICAgICAgICAgICAgbGV0IHR5cGUsIG1lc3NhZ2U7XG4gICAgICAgICAgICBpZiAoZXJyb3IubmFtZSA9PT0gJ1lBTUxFeGNlcHRpb24nKSB7XG4gICAgICAgICAgICAgICAgdHlwZSA9ICd5YW1sJztcbiAgICAgICAgICAgICAgICBtZXNzYWdlID0gJ0Vycm9yIHBhcnNpbmcgc2NlbmUgWUFNTCc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBUT0RPOiBtb3JlIGVycm9yIHR5cGVzXG4gICAgICAgICAgICAgICAgbWVzc2FnZSA9ICdFcnJvciBpbml0aWFsaXppbmcgc2NlbmUnO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy50cmlnZ2VyKCdlcnJvcicsIHsgdHlwZSwgbWVzc2FnZSwgZXJyb3IsIHVybDogdGhpcy5jb25maWdfc291cmNlIH0pO1xuXG4gICAgICAgICAgICBtZXNzYWdlID0gYFNjZW5lLmxvYWQoKSBmYWlsZWQgdG8gbG9hZCAke3RoaXMuY29uZmlnX3NvdXJjZX06ICR7ZXJyb3IubWVzc2FnZX1gO1xuICAgICAgICAgICAgaWYgKHRoaXMubGFzdF92YWxpZF9jb25maWdfc291cmNlKSB7XG4gICAgICAgICAgICAgICAgbG9nKCd3YXJuJywgbWVzc2FnZSwgZXJyb3IpO1xuICAgICAgICAgICAgICAgIGxvZygnaW5mbycsIGBTY2VuZS5sb2FkKCkgcmV2ZXJ0aW5nIHRvIGxhc3QgdmFsaWQgY29uZmlndXJhdGlvbmApO1xuICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLmxvYWQodGhpcy5sYXN0X3ZhbGlkX2NvbmZpZ19zb3VyY2UsIHRoaXMubGFzdF92YWxpZF9jb25maWdfcGF0aCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsb2coJ2Vycm9yJywgbWVzc2FnZSwgZXJyb3IpO1xuICAgICAgICAgICAgdGhyb3cgZXJyb3I7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiB0aGlzLmluaXRpYWxpemluZztcbiAgICB9XG5cbiAgICAvLyBGb3IgQVBJIGNvbXBhdGliaWxpdHlcbiAgICByZWxvYWQoY29uZmlnX3NvdXJjZSA9IG51bGwsIGNvbmZpZ19wYXRoID0gbnVsbCkge1xuICAgICAgICByZXR1cm4gdGhpcy5sb2FkKGNvbmZpZ19zb3VyY2UsIGNvbmZpZ19wYXRoKTtcbiAgICB9XG5cbiAgICBkZXN0cm95KCkge1xuICAgICAgICB0aGlzLmluaXRpYWxpemVkID0gZmFsc2U7XG4gICAgICAgIHRoaXMucmVuZGVyX2xvb3Bfc3RvcCA9IHRydWU7IC8vIHNjaGVkdWxlIHJlbmRlciBsb29wIHRvIHN0b3BcblxuICAgICAgICB0aGlzLmRlc3Ryb3lMaXN0ZW5lcnMoKTtcblxuICAgICAgICBpZiAodGhpcy5jYW52YXMgJiYgdGhpcy5jYW52YXMucGFyZW50Tm9kZSkge1xuICAgICAgICAgICAgdGhpcy5jYW52YXMucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCh0aGlzLmNhbnZhcyk7XG4gICAgICAgICAgICB0aGlzLmNhbnZhcyA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5jb250YWluZXIgPSBudWxsO1xuXG4gICAgICAgIGlmICh0aGlzLnNlbGVjdGlvbikge1xuICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb24uZGVzdHJveSgpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHRoaXMuZ2wpIHtcbiAgICAgICAgICAgIFRleHR1cmUuZGVzdHJveSh0aGlzLmdsKTtcbiAgICAgICAgICAgIHRoaXMuc3R5bGVfbWFuYWdlci5kZXN0cm95KHRoaXMuZ2wpO1xuICAgICAgICAgICAgdGhpcy5zdHlsZXMgPSB7fTtcblxuICAgICAgICAgICAgU2hhZGVyUHJvZ3JhbS5yZXNldCgpO1xuXG4gICAgICAgICAgICAvLyBGb3JjZSBjb250ZXh0IGxvc3NcbiAgICAgICAgICAgIGxldCBleHQgPSB0aGlzLmdsLmdldEV4dGVuc2lvbignV0VCR0xfbG9zZV9jb250ZXh0Jyk7XG4gICAgICAgICAgICBpZiAoZXh0KSB7XG4gICAgICAgICAgICAgICAgZXh0Lmxvc2VDb250ZXh0KCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMuZ2wgPSBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5zb3VyY2VzID0ge307XG5cbiAgICAgICAgdGhpcy5kZXN0cm95V29ya2VycygpO1xuICAgICAgICB0aGlzLnRpbGVfbWFuYWdlci5kZXN0cm95KCk7XG4gICAgICAgIHRoaXMudGlsZV9tYW5hZ2VyID0gbnVsbDtcbiAgICB9XG5cbiAgICBjcmVhdGVDYW52YXMoKSB7XG4gICAgICAgIGlmICh0aGlzLmNhbnZhcykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5jb250YWluZXIgPSB0aGlzLmNvbnRhaW5lciB8fCBkb2N1bWVudC5ib2R5O1xuICAgICAgICB0aGlzLmNhbnZhcyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2NhbnZhcycpO1xuICAgICAgICB0aGlzLmNhbnZhcy5zdHlsZS5wb3NpdGlvbiA9ICdhYnNvbHV0ZSc7XG4gICAgICAgIHRoaXMuY2FudmFzLnN0eWxlLnRvcCA9IDA7XG4gICAgICAgIHRoaXMuY2FudmFzLnN0eWxlLmxlZnQgPSAwO1xuXG4gICAgICAgIC8vIEZvcmNlIHRhbmdyYW0gY2FudmFzIHVuZGVybmVhdGggYWxsIGxlYWZsZXQgbGF5ZXJzLCBhbmQgc2V0IGJhY2tncm91bmQgdG8gdHJhbnNwYXJlbnRcbiAgICAgICAgdGhpcy5jb250YWluZXIuc3R5bGUuYmFja2dyb3VuZENvbG9yID0gJ3RyYW5zcGFyZW50JztcbiAgICAgICAgdGhpcy5jb250YWluZXIuYXBwZW5kQ2hpbGQodGhpcy5jYW52YXMpO1xuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICB0aGlzLmdsID0gQ29udGV4dC5nZXRDb250ZXh0KHRoaXMuY2FudmFzLCB7XG4gICAgICAgICAgICAgICAgYWxwaGE6IHRydWUsIHByZW11bHRpcGxpZWRBbHBoYTogdHJ1ZSwgLy8gVE9ETzogdmFyeSB3L3NjZW5lIGFscGhhXG4gICAgICAgICAgICAgICAgZGV2aWNlX3BpeGVsX3JhdGlvOiBVdGlscy5kZXZpY2VfcGl4ZWxfcmF0aW9cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGNhdGNoKGUpIHtcbiAgICAgICAgICAgIHRocm93IG5ldyBFcnJvcihcbiAgICAgICAgICAgICAgICBcIkNvdWxkbid0IGNyZWF0ZSBXZWJHTCBjb250ZXh0LiBcIiArXG4gICAgICAgICAgICAgICAgXCJZb3VyIGJyb3dzZXIgbWF5IG5vdCBzdXBwb3J0IFdlYkdMLCBvciBpdCdzIHR1cm5lZCBvZmY/IFwiICtcbiAgICAgICAgICAgICAgICBcIlZpc2l0IGh0dHA6Ly93ZWJnbHJlcG9ydC5jb20vIGZvciBtb3JlIGluZm8uXCJcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnJlc2l6ZU1hcCh0aGlzLmNvbnRhaW5lci5jbGllbnRXaWR0aCwgdGhpcy5jb250YWluZXIuY2xpZW50SGVpZ2h0KTtcbiAgICAgICAgVmVydGV4QXJyYXlPYmplY3QuaW5pdCh0aGlzLmdsKTtcbiAgICAgICAgdGhpcy5yZW5kZXJfc3RhdGVzID0gbmV3IFJlbmRlclN0YXRlTWFuYWdlcih0aGlzLmdsKTtcbiAgICAgICAgdGhpcy5tZWRpYV9jYXB0dXJlLnNldENhbnZhcyh0aGlzLmNhbnZhcyk7XG4gICAgfVxuXG4gICAgLy8gR2V0IHRoZSBVUkwgdG8gbG9hZCB0aGUgd2ViIHdvcmtlciBmcm9tXG4gICAgZ2V0V29ya2VyVXJsKCkge1xuICAgICAgICBsZXQgd29ya2VyX3VybCA9IHRoaXMud29ya2VyX3VybCB8fCBVUkxzLmZpbmRDdXJyZW50VVJMKCd0YW5ncmFtLmRlYnVnLmpzJywgJ3RhbmdyYW0ubWluLmpzJyk7XG5cbiAgICAgICAgaWYgKCF3b3JrZXJfdXJsKSB7XG4gICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXCJDYW4ndCBsb2FkIHdvcmtlciBiZWNhdXNlIGNvdWxkbid0IGZpbmQgYmFzZSBVUkwgdGhhdCBsaWJyYXJ5IHdhcyBsb2FkZWQgZnJvbVwiKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEltcG9ydCBjdXN0b20gZGF0YSBzb3VyY2Ugc2NyaXB0cyBhbG9uZ3NpZGUgY29yZSBsaWJyYXJ5XG4gICAgICAgIC8vIE5PVEU6IHdvcmthcm91bmQgZm9yIGlzc3VlIHdoZXJlIGxhcmdlIGxpYnJhcmllcyBpbnRlcm1pdHRlbnRseSBmYWlsIHRvIGxvYWQgaW4gd2ViIHdvcmtlcnMsXG4gICAgICAgIC8vIHdoZW4gbXVsdGlwbGUgaW1wb3J0U2NyaXB0cygpIGNhbGxzIGFyZSB1c2VkLiBMb2FkaW5nIGFsbCBzY3JpcHRzIChpbmNsdWRpbmcgVGFuZ3JhbSBpdHNlbGYpXG4gICAgICAgIC8vIGluIG9uZSBjYWxsIGF0IGF0IHdvcmtlciBjcmVhdGlvbiB0aW1lIGhhcyBub3QgZXhoaWJpdGVkIHRoZSBzYW1lIGlzc3VlLlxuICAgICAgICBsZXQgdXJscyA9IFsuLi50aGlzLmRhdGFfc291cmNlX3NjcmlwdHNdO1xuICAgICAgICB1cmxzLnB1c2god29ya2VyX3VybCk7IC8vIGxvYWQgVGFuZ3JhbSAqbGFzdCogKGhhcyBiZWVuIG1vcmUgcmVsaWFibGUsIHRob3VnaCByZWFzb24gdW5rbm93bilcbiAgICAgICAgbGV0IGJvZHkgPSBgaW1wb3J0U2NyaXB0cygke3VybHMubWFwKHVybCA9PiBgJyR7dXJsfSdgKS5qb2luKCcsJyl9KTtgO1xuICAgICAgICByZXR1cm4gVVJMcy5jcmVhdGVPYmplY3RVUkwobmV3IEJsb2IoW2JvZHldLCB7IHR5cGU6ICdhcHBsaWNhdGlvbi9qYXZhc2NyaXB0JyB9KSk7XG4gICAgfVxuXG4gICAgLy8gVXBkYXRlIGxpc3Qgb2YgYW55IGN1c3RvbSBkYXRhIHNvdXJjZSBzY3JpcHRzIChpZiBhbnkpXG4gICAgdXBkYXRlRGF0YVNvdXJjZVNjcmlwdHMgKCkge1xuICAgICAgICBsZXQgcHJldl9zY3JpcHRzID0gWy4uLih0aGlzLmRhdGFfc291cmNlX3NjcmlwdHN8fFtdKV07IC8vIHNhdmUgbGlzdCBvZiBwcmV2aW91c2x5IGxvYWRlZCBzY3JpcHRzXG4gICAgICAgIGxldCBzY3JpcHRzID0gT2JqZWN0LmtleXModGhpcy5jb25maWcuc291cmNlcykubWFwKHMgPT4gdGhpcy5jb25maWcuc291cmNlc1tzXS5zY3JpcHRzKS5maWx0ZXIoeCA9PiB4KTtcbiAgICAgICAgaWYgKHNjcmlwdHMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgbG9nKCdkZWJ1ZycsICdsb2FkaW5nIGN1c3RvbSBkYXRhIHNvdXJjZSBzY3JpcHRzIGluIHdvcmtlcjonLCBzY3JpcHRzKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmRhdGFfc291cmNlX3NjcmlwdHMgPSBbXS5jb25jYXQoLi4uc2NyaXB0cykuc29ydCgpO1xuXG4gICAgICAgIC8vIFNjcmlwdHMgY2hhbmdlZD9cbiAgICAgICAgcmV0dXJuICEodGhpcy5kYXRhX3NvdXJjZV9zY3JpcHRzLmxlbmd0aCA9PT0gcHJldl9zY3JpcHRzLmxlbmd0aCAmJlxuICAgICAgICAgICAgdGhpcy5kYXRhX3NvdXJjZV9zY3JpcHRzLmV2ZXJ5KCh2LCBpKSA9PiB2ID09PSBwcmV2X3NjcmlwdHNbaV0pKTtcbiAgICB9XG5cbiAgICAvLyBXZWIgd29ya2VycyBoYW5kbGUgaGVhdnkgZHV0eSB0aWxlIGNvbnN0cnVjdGlvbjogbmV0d29ya2luZywgZ2VvbWV0cnkgcHJvY2Vzc2luZywgZXRjLlxuICAgIGNyZWF0ZVdvcmtlcnMoKSB7XG4gICAgICAgIC8vIFJlc2V0IG9sZCB3b3JrZXJzIChpZiBhbnkpIGlmIHdlIG5lZWQgdG8gcmUtaW5zdGFudGlhdGUgd2l0aCBuZXcgZXh0ZXJuYWwgc2NyaXB0c1xuICAgICAgICBpZiAodGhpcy51cGRhdGVEYXRhU291cmNlU2NyaXB0cygpKSB7XG4gICAgICAgICAgICB0aGlzLmRlc3Ryb3lXb3JrZXJzKCk7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXRoaXMud29ya2Vycykge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMubWFrZVdvcmtlcnModGhpcy5nZXRXb3JrZXJVcmwoKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuICAgIH1cblxuICAgIC8vIEluc3RhbnRpYXRlIHdvcmtlcnMgZnJvbSBVUkwsIGluaXQgZXZlbnQgaGFuZGxlcnNcbiAgICBtYWtlV29ya2Vycyh1cmwpIHtcbiAgICAgICAgdmFyIHF1ZXVlID0gW107XG5cbiAgICAgICAgdGhpcy53b3JrZXJzID0gW107XG4gICAgICAgIGZvciAodmFyIGlkPTA7IGlkIDwgdGhpcy5udW1fd29ya2VyczsgaWQrKykge1xuICAgICAgICAgICAgdmFyIHdvcmtlciA9IG5ldyBXb3JrZXIodXJsKTtcbiAgICAgICAgICAgIHRoaXMud29ya2Vyc1tpZF0gPSB3b3JrZXI7XG5cbiAgICAgICAgICAgIFdvcmtlckJyb2tlci5hZGRXb3JrZXIod29ya2VyKTtcblxuICAgICAgICAgICAgbG9nKCdkZWJ1ZycsIGBTY2VuZS5tYWtlV29ya2VyczogaW5pdGlhbGl6aW5nIHdvcmtlciAke2lkfWApO1xuICAgICAgICAgICAgbGV0IF9pZCA9IGlkO1xuICAgICAgICAgICAgcXVldWUucHVzaChXb3JrZXJCcm9rZXIucG9zdE1lc3NhZ2Uod29ya2VyLCAnc2VsZi5pbml0JywgdGhpcy5pZCwgaWQsIHRoaXMubnVtX3dvcmtlcnMsIHRoaXMubG9nX2xldmVsLCBVdGlscy5kZXZpY2VfcGl4ZWxfcmF0aW8pLnRoZW4oXG4gICAgICAgICAgICAgICAgKGlkKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGxvZygnZGVidWcnLCBgU2NlbmUubWFrZVdvcmtlcnM6IGluaXRpYWxpemVkIHdvcmtlciAke2lkfWApO1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gaWQ7XG4gICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAoZXJyb3IpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgbG9nKCdlcnJvcicsIGBTY2VuZS5tYWtlV29ya2VyczogZmFpbGVkIHRvIGluaXRpYWxpemUgd29ya2VyICR7X2lkfTpgLCBlcnJvcik7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlamVjdChlcnJvcik7XG4gICAgICAgICAgICAgICAgfSlcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLm5leHRfd29ya2VyID0gMDtcbiAgICAgICAgcmV0dXJuIFByb21pc2UuYWxsKHF1ZXVlKS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgIGxvZy5zZXRXb3JrZXJzKHRoaXMud29ya2Vycyk7XG5cbiAgICAgICAgICAgIC8vIExldCBWZXJ0ZXhFbGVtZW50cyBrbm93IGlmIDMyIGJpdCBpbmRpY2VzIGZvciBlbGVtZW50IGFycmF5cyBhcmUgYXZhaWxhYmxlXG4gICAgICAgICAgICBsZXQgVWludDMyX2ZsYWcgPSB0aGlzLmdsLmdldEV4dGVuc2lvbihcIk9FU19lbGVtZW50X2luZGV4X3VpbnRcIikgPyB0cnVlIDogZmFsc2U7XG4gICAgICAgICAgICBXb3JrZXJCcm9rZXIucG9zdE1lc3NhZ2UodGhpcy53b3JrZXJzLCAnVmVydGV4RWxlbWVudHMuc2V0VWludDMyRmxhZycsIFVpbnQzMl9mbGFnKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgZGVzdHJveVdvcmtlcnMoKSB7XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KHRoaXMud29ya2VycykpIHtcbiAgICAgICAgICAgIGxvZy5zZXRXb3JrZXJzKG51bGwpO1xuICAgICAgICAgICAgdGhpcy53b3JrZXJzLmZvckVhY2goKHdvcmtlcikgPT4ge1xuICAgICAgICAgICAgICAgIHdvcmtlci50ZXJtaW5hdGUoKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgdGhpcy53b3JrZXJzID0gbnVsbDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIEFzc2lnbiB0aWxlIHRvIHdvcmtlciB0aHJlYWQgYmFzZWQgb24gZGF0YSBzb3VyY2VcbiAgICBnZXRXb3JrZXJGb3JEYXRhU291cmNlKHNvdXJjZSkge1xuICAgICAgICBsZXQgd29ya2VyO1xuXG4gICAgICAgIGlmIChzb3VyY2UudGlsZWQpIHtcbiAgICAgICAgICAgIC8vIFJvdW5kIHJvYmluIHRpbGVkIHNvdXJjZXMgYWNyb3NzIGFsbCB3b3JrZXJzXG4gICAgICAgICAgICB3b3JrZXIgPSB0aGlzLndvcmtlcnNbdGhpcy5uZXh0X3dvcmtlcl07XG4gICAgICAgICAgICB0aGlzLm5leHRfd29ya2VyID0gKHRoaXMubmV4dF93b3JrZXIgKyAxKSAlIHRoaXMud29ya2Vycy5sZW5ndGg7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAvLyBQaW4gYWxsIHRpbGVzIGZyb20gZWFjaCBub24tdGlsZWQgc291cmNlIHRvIGEgc2luZ2xlIHdvcmtlclxuICAgICAgICAgICAgLy8gUHJldmVudHMgZGF0YSBmb3IgdGhlc2Ugc291cmNlcyBmcm9tIGJlaW5nIGxvYWRlZCBtb3JlIHRoYW4gb25jZVxuICAgICAgICAgICAgd29ya2VyID0gdGhpcy53b3JrZXJzW3NvdXJjZS5pZCAlIHRoaXMud29ya2Vycy5sZW5ndGhdO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHdvcmtlcjtcbiAgICB9XG5cbiAgICAvLyBTY2VuZSBpcyByZWFkeSBmb3IgcmVuZGVyaW5nXG4gICAgcmVhZHkoKSB7XG4gICAgICAgIGlmICghdGhpcy52aWV3LnJlYWR5KCkgfHwgT2JqZWN0LmtleXModGhpcy5zb3VyY2VzKS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgLy8gUmVzaXplIHRoZSBtYXAgd2hlbiBkZXZpY2UgcGl4ZWwgcmF0aW8gY2hhbmdlcywgZS5nLiB3aGVuIHN3aXRjaGluZyBiZXR3ZWVuIGRpc3BsYXlzXG4gICAgdXBkYXRlRGV2aWNlUGl4ZWxSYXRpbyAoKSB7XG4gICAgICAgIGlmIChVdGlscy51cGRhdGVEZXZpY2VQaXhlbFJhdGlvKCkpIHtcbiAgICAgICAgICAgIFdvcmtlckJyb2tlci5wb3N0TWVzc2FnZSh0aGlzLndvcmtlcnMsICdzZWxmLnVwZGF0ZURldmljZVBpeGVsUmF0aW8nLCBVdGlscy5kZXZpY2VfcGl4ZWxfcmF0aW8pXG4gICAgICAgICAgICAgICAgLnRoZW4oKCkgPT4gdGhpcy5yZWJ1aWxkKCkpXG4gICAgICAgICAgICAgICAgLnRoZW4oKCkgPT4gdGhpcy5yZXNpemVNYXAodGhpcy52aWV3LnNpemUuY3NzLndpZHRoLCB0aGlzLnZpZXcuc2l6ZS5jc3MuaGVpZ2h0KSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXNpemVNYXAod2lkdGgsIGhlaWdodCkge1xuICAgICAgICBpZiAod2lkdGggPT09IDAgJiYgaGVpZ2h0ID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmRpcnR5ID0gdHJ1ZTtcbiAgICAgICAgdGhpcy52aWV3LnNldFZpZXdwb3J0U2l6ZSh3aWR0aCwgaGVpZ2h0KTtcbiAgICAgICAgaWYgKHRoaXMuZ2wpIHtcbiAgICAgICAgICAgIENvbnRleHQucmVzaXplKHRoaXMuZ2wsIHdpZHRoLCBoZWlnaHQsIFV0aWxzLmRldmljZV9waXhlbF9yYXRpbyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBSZXF1ZXN0IHNjZW5lIGJlIHJlZHJhd24gYXQgbmV4dCBhbmltYXRpb24gbG9vcFxuICAgIHJlcXVlc3RSZWRyYXcoKSB7XG4gICAgICAgIHRoaXMuZGlydHkgPSB0cnVlO1xuICAgIH1cblxuICAgIC8vIFJlZHJhdyBzY2VuZSBpbW1lZGlhdGVseSAtIGRvbid0IHdhaXQgZm9yIGFuaW1hdGlvbiBsb29wXG4gICAgLy8gVXNlIHNwYXJpbmdseSwgYnV0IGZvciBjYXNlcyB3aGVyZSB5b3UgbmVlZCB0aGUgY2xvc2VzdCBwb3NzaWJsZSBzeW5jIHdpdGggb3RoZXIgVUkgZWxlbWVudHMsXG4gICAgLy8gc3VjaCBhcyBvdGhlciwgbm9uLVdlYkdMIG1hcCBsYXllcnMgKGUuZy4gTGVhZmxldCByYXN0ZXIgbGF5ZXJzLCBtYXJrZXJzLCBldGMuKVxuICAgIGltbWVkaWF0ZVJlZHJhdygpIHtcbiAgICAgICAgdGhpcy5kaXJ0eSA9IHRydWU7XG4gICAgICAgIHRoaXMudXBkYXRlKCk7XG4gICAgfVxuXG4gICAgcmVuZGVyTG9vcCAoKSB7XG4gICAgICAgIHRoaXMucmVuZGVyX2xvb3BfYWN0aXZlID0gdHJ1ZTsgLy8gb25seSBsZXQgdGhlIHJlbmRlciBsb29wIGluc3RhbnRpYXRlIG9uY2VcblxuICAgICAgICBpZiAodGhpcy5pbml0aWFsaXplZCkge1xuICAgICAgICAgICAgLy8gUmVuZGVyIHRoZSBzY2VuZVxuICAgICAgICAgICAgdGhpcy51cGRhdGUoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFJlcXVlc3QgdGhlIG5leHQgZnJhbWUgaWYgbm90IHNjaGVkdWxlZCB0byBzdG9wXG4gICAgICAgIGlmICghdGhpcy5yZW5kZXJfbG9vcF9zdG9wKSB7XG4gICAgICAgICAgICB3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lKHRoaXMucmVuZGVyTG9vcC5iaW5kKHRoaXMpKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMucmVuZGVyX2xvb3Bfc3RvcCA9IGZhbHNlO1xuICAgICAgICAgICAgdGhpcy5yZW5kZXJfbG9vcF9hY3RpdmUgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIFNldHVwIHRoZSByZW5kZXIgbG9vcFxuICAgIHNldHVwUmVuZGVyTG9vcCgpIHtcbiAgICAgICAgaWYgKCF0aGlzLnJlbmRlcl9sb29wX2FjdGl2ZSkge1xuICAgICAgICAgICAgc2V0VGltZW91dCgoKSA9PiB7IHRoaXMucmVuZGVyTG9vcCgpOyB9LCAwKTsgLy8gZGVsYXkgc3RhcnQgYnkgb25lIHRpY2tcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHVwZGF0ZSgpIHtcbiAgICAgICAgLy8gUmVuZGVyIG9uIGRlbWFuZFxuICAgICAgICB2YXIgd2lsbF9yZW5kZXIgPSAhKFxuICAgICAgICAgICAgdGhpcy5kaXJ0eSA9PT0gZmFsc2UgfHxcbiAgICAgICAgICAgIHRoaXMuaW5pdGlhbGl6ZWQgPT09IGZhbHNlIHx8XG4gICAgICAgICAgICB0aGlzLnVwZGF0aW5nID4gMCB8fFxuICAgICAgICAgICAgdGhpcy5yZWFkeSgpID09PSBmYWxzZVxuICAgICAgICApO1xuXG4gICAgICAgIC8vIFByZS1yZW5kZXIgbG9vcCBob29rXG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5wcmVVcGRhdGUgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHRoaXMucHJlVXBkYXRlKHdpbGxfcmVuZGVyKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEJhaWwgaWYgbm8gbmVlZCB0byByZW5kZXJcbiAgICAgICAgaWYgKCF3aWxsX3JlbmRlcikge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZGlydHkgPSBmYWxzZTsgLy8gc3ViY2xhc3NlcyBjYW4gc2V0IHRoaXMgYmFjayB0byB0cnVlIHdoZW4gYW5pbWF0aW9uIGlzIG5lZWRlZFxuXG4gICAgICAgIC8vIFJlbmRlciB0aGUgc2NlbmVcbiAgICAgICAgdGhpcy51cGRhdGVEZXZpY2VQaXhlbFJhdGlvKCk7XG4gICAgICAgIHRoaXMucmVuZGVyKCk7XG4gICAgICAgIHRoaXMudXBkYXRlVmlld0NvbXBsZXRlKCk7IC8vIGZpcmVzIGV2ZW50IHdoZW4gcmVuZGVyZWQgdGlsZSBzZXQgb3Igc3R5bGUgY2hhbmdlc1xuICAgICAgICB0aGlzLm1lZGlhX2NhcHR1cmUuY29tcGxldGVTY3JlZW5zaG90KCk7IC8vIGNvbXBsZXRlcyBzY3JlZW5zaG90IGNhcHR1cmUgaWYgcmVxdWVzdGVkXG5cbiAgICAgICAgLy8gUG9zdC1yZW5kZXIgbG9vcCBob29rXG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5wb3N0VXBkYXRlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICB0aGlzLnBvc3RVcGRhdGUod2lsbF9yZW5kZXIpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gUmVkcmF3IGV2ZXJ5IGZyYW1lIGlmIGFuaW1hdGluZ1xuICAgICAgICBpZiAodGhpcy5hbmltYXRlZCA9PT0gdHJ1ZSB8fCB0aGlzLnZpZXcuaXNBbmltYXRpbmcoKSkge1xuICAgICAgICAgICAgdGhpcy5kaXJ0eSA9IHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmZyYW1lKys7XG4gICAgICAgIGxvZygndHJhY2UnLCAnU2NlbmUucmVuZGVyKCknKTtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgcmVuZGVyKCkge1xuICAgICAgICB2YXIgZ2wgPSB0aGlzLmdsO1xuXG4gICAgICAgIC8vIFVwZGF0ZSBzdHlsZXMsIGNhbWVyYSwgbGlnaHRzXG4gICAgICAgIHRoaXMudmlldy51cGRhdGUoKTtcbiAgICAgICAgT2JqZWN0LmtleXModGhpcy5saWdodHMpLmZvckVhY2goaSA9PiB0aGlzLmxpZ2h0c1tpXS51cGRhdGUoKSk7XG5cbiAgICAgICAgLy8gUmVuZGVyIG1haW4gcGFzc1xuICAgICAgICB0aGlzLnJlbmRlcl9jb3VudCA9IHRoaXMucmVuZGVyUGFzcygpO1xuXG4gICAgICAgIC8vIFJlbmRlciBzZWxlY3Rpb24gcGFzcyAoaWYgbmVlZGVkKVxuICAgICAgICBpZiAodGhpcy5zZWxlY3Rpb24ucGVuZGluZ1JlcXVlc3RzKCkpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnZpZXcucGFubmluZyB8fCB0aGlzLnZpZXcuem9vbWluZykge1xuICAgICAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uLmNsZWFyUGVuZGluZ1JlcXVlc3RzKCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLnNlbGVjdGlvbi5iaW5kKCk7ICAgICAgICAgICAgICAgICAgLy8gc3dpdGNoIHRvIEZCT1xuICAgICAgICAgICAgdGhpcy5yZW5kZXJQYXNzKFxuICAgICAgICAgICAgICAgICdzZWxlY3Rpb25fcHJvZ3JhbScsICAgICAgICAgICAgICAgIC8vIHJlbmRlciB3L2FsdGVybmF0ZSBwcm9ncmFtXG4gICAgICAgICAgICAgICAgeyBhbGxvd19ibGVuZDogZmFsc2UgfSk7XG4gICAgICAgICAgICB0aGlzLnNlbGVjdGlvbi5yZWFkKCk7ICAgICAgICAgICAgICAgICAgLy8gcmVhZCByZXN1bHRzIGZyb20gc2VsZWN0aW9uIGJ1ZmZlclxuXG4gICAgICAgICAgICAvLyBSZXNldCB0byBzY3JlZW4gYnVmZmVyXG4gICAgICAgICAgICBnbC5iaW5kRnJhbWVidWZmZXIoZ2wuRlJBTUVCVUZGRVIsIG51bGwpO1xuICAgICAgICAgICAgZ2wudmlld3BvcnQoMCwgMCwgdGhpcy5jYW52YXMud2lkdGgsIHRoaXMuY2FudmFzLmhlaWdodCk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnJlbmRlcl9jb3VudF9jaGFuZ2VkID0gZmFsc2U7XG4gICAgICAgIGlmICh0aGlzLnJlbmRlcl9jb3VudCAhPT0gdGhpcy5sYXN0X3JlbmRlcl9jb3VudCkge1xuICAgICAgICAgICAgdGhpcy5yZW5kZXJfY291bnRfY2hhbmdlZCA9IHRydWU7XG5cbiAgICAgICAgICAgIHRoaXMuZ2V0RmVhdHVyZVNlbGVjdGlvbk1hcFNpemUoKS50aGVuKHNpemUgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChzaXplKSB7IC8vIHJldHVybnMgdW5kZWZpbmVkIGlmIHByZXZpb3VzIHJlcXVlc3QgcGVuZGluZ1xuICAgICAgICAgICAgICAgICAgICBsb2coJ2luZm8nLCBgU2NlbmU6IHJlbmRlcmVkICR7dGhpcy5yZW5kZXJfY291bnR9IHByaW1pdGl2ZXMgKCR7c2l6ZX0gZmVhdHVyZXMgaW4gc2VsZWN0aW9uIG1hcClgKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmxhc3RfcmVuZGVyX2NvdW50ID0gdGhpcy5yZW5kZXJfY291bnQ7XG5cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgLy8gUmVuZGVyIGFsbCBhY3RpdmUgc3R5bGVzLCBncm91cGVkIGJ5IGJsZW5kL2RlcHRoIHR5cGUgKG9wYXF1ZSwgb3ZlcmxheSwgZXRjLikgYW5kIGJ5IHByb2dyYW0gKHN0eWxlKVxuICAgIC8vIENhbGxlZCBib3RoIGZvciBtYWluIHJlbmRlciBwYXNzLCBhbmQgZm9yIHNlY29uZGFyeSBwYXNzZXMgbGlrZSBzZWxlY3Rpb24gYnVmZmVyXG4gICAgcmVuZGVyUGFzcyhwcm9ncmFtX2tleSA9ICdwcm9ncmFtJywgeyBhbGxvd19ibGVuZCB9ID0ge30pIHtcbiAgICAgICAgLy8gb3B0aW9uYWxseSBmb3JjZSBhbHBoYSBvZmYgKGUuZy4gZm9yIHNlbGVjdGlvbiBwYXNzKVxuICAgICAgICBhbGxvd19ibGVuZCA9IChhbGxvd19ibGVuZCA9PSBudWxsKSA/IHRydWUgOiBhbGxvd19ibGVuZDtcblxuICAgICAgICB0aGlzLmNsZWFyRnJhbWUoeyBjbGVhcl9jb2xvcjogdHJ1ZSwgY2xlYXJfZGVwdGg6IHRydWUgfSk7XG5cbiAgICAgICAgLy8gU29ydCBzdHlsZXMgYnkgYmxlbmQgb3JkZXJcbiAgICAgICAgbGV0IHN0eWxlcyA9IHRoaXMudGlsZV9tYW5hZ2VyLmdldEFjdGl2ZVN0eWxlcygpLlxuICAgICAgICAgICAgbWFwKHMgPT4gdGhpcy5zdHlsZXNbc10pLlxuICAgICAgICAgICAgZmlsdGVyKHMgPT4gcykuIC8vIGd1YXJkIGFnYWluc3QgbWlzc2luZyBzdHlsZXMsIHN1Y2ggYXMgd2hpbGUgbG9hZGluZyBhIG5ldyBzY2VuZVxuICAgICAgICAgICAgc29ydChTdHlsZS5ibGVuZE9yZGVyU29ydCk7XG5cbiAgICAgICAgLy8gUmVuZGVyIHN0eWxlc1xuICAgICAgICBsZXQgY291bnQgPSAwOyAvLyBob3cgbWFueSBwcmltaXRpdmVzIHdlcmUgcmVuZGVyZWRcbiAgICAgICAgbGV0IGxhc3RfYmxlbmQ7XG4gICAgICAgIGZvciAobGV0IHM9MDsgcyA8IHN0eWxlcy5sZW5ndGg7IHMrKykge1xuICAgICAgICAgICAgbGV0IHN0eWxlID0gc3R5bGVzW3NdO1xuXG4gICAgICAgICAgICAvLyBPbmx5IHVwZGF0ZSByZW5kZXIgc3RhdGUgd2hlbiBibGVuZCBtb2RlIGNoYW5nZXNcbiAgICAgICAgICAgIGlmIChzdHlsZS5ibGVuZCAhPT0gbGFzdF9ibGVuZCkge1xuICAgICAgICAgICAgICAgIGxldCBzdGF0ZSA9IE9iamVjdC5hc3NpZ24oe30sXG4gICAgICAgICAgICAgICAgICAgIFN0eWxlLnJlbmRlcl9zdGF0ZXNbc3R5bGUuYmxlbmRdLCAgICAgICAvLyByZW5kZXIgc3RhdGUgZm9yIGJsZW5kIG1vZGVcbiAgICAgICAgICAgICAgICAgICAgeyBibGVuZDogKGFsbG93X2JsZW5kICYmIHN0eWxlLmJsZW5kKSB9IC8vIGVuYWJsZS9kaXNhYmxlIGJsZW5kaW5nIChlLmcuIG5vIGJsZW5kIGZvciBzZWxlY3Rpb24pXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgICAgICB0aGlzLnNldFJlbmRlclN0YXRlKHN0YXRlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNvdW50ICs9IHRoaXMucmVuZGVyU3R5bGUoc3R5bGUubmFtZSwgcHJvZ3JhbV9rZXkpO1xuICAgICAgICAgICAgbGFzdF9ibGVuZCA9IHN0eWxlLmJsZW5kO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGNvdW50O1xuICAgIH1cblxuICAgIHJlbmRlclN0eWxlKHN0eWxlX25hbWUsIHByb2dyYW1fa2V5KSB7XG4gICAgICAgIGxldCBzdHlsZSA9IHRoaXMuc3R5bGVzW3N0eWxlX25hbWVdO1xuICAgICAgICBsZXQgZmlyc3RfZm9yX3N0eWxlID0gdHJ1ZTtcbiAgICAgICAgbGV0IHJlbmRlcl9jb3VudCA9IDA7XG4gICAgICAgIGxldCBwcm9ncmFtO1xuXG4gICAgICAgIC8vIFJlbmRlciB0aWxlIEdMIGdlb21ldHJpZXNcbiAgICAgICAgbGV0IHJlbmRlcmFibGVfdGlsZXMgPSB0aGlzLnRpbGVfbWFuYWdlci5nZXRSZW5kZXJhYmxlVGlsZXMoKTtcbiAgICAgICAgZm9yIChsZXQgdD0wOyB0IDwgcmVuZGVyYWJsZV90aWxlcy5sZW5ndGg7IHQrKykge1xuICAgICAgICAgICAgbGV0IHRpbGUgPSByZW5kZXJhYmxlX3RpbGVzW3RdO1xuXG4gICAgICAgICAgICBpZiAodGlsZS5tZXNoZXNbc3R5bGVfbmFtZV0gPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBTdHlsZS1zcGVjaWZpYyBzdGF0ZVxuICAgICAgICAgICAgLy8gT25seSBzZXR1cCBzdHlsZSBpZiByZW5kZXJpbmcgZm9yIGZpcnN0IHRpbWUgdGhpcyBmcmFtZVxuICAgICAgICAgICAgLy8gKGxhenkgaW5pdCwgbm90IGFsbCBzdHlsZXMgd2lsbCBiZSB1c2VkIGluIGFsbCBzY3JlZW4gdmlld3M7IHNvbWUgc3R5bGVzIG1pZ2h0IGJlIGRlZmluZWQgYnV0IG5ldmVyIHVzZWQpXG4gICAgICAgICAgICBpZiAoZmlyc3RfZm9yX3N0eWxlID09PSB0cnVlKSB7XG4gICAgICAgICAgICAgICAgZmlyc3RfZm9yX3N0eWxlID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgcHJvZ3JhbSA9IHRoaXMuc2V0dXBTdHlsZShzdHlsZSwgcHJvZ3JhbV9rZXkpO1xuICAgICAgICAgICAgICAgIGlmICghcHJvZ3JhbSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIFNraXAgcHJveHkgdGlsZXMgaWYgbmV3IHRpbGVzIGhhdmUgZmluaXNoZWQgbG9hZGluZyB0aGlzIHN0eWxlXG4gICAgICAgICAgICBpZiAoIXRpbGUuc2hvdWxkUHJveHlGb3JTdHlsZShzdHlsZV9uYW1lKSkge1xuICAgICAgICAgICAgICAgIC8vIGxvZygndHJhY2UnLCBgU2NlbmUucmVuZGVyU3R5bGUoKTogU2tpcCBwcm94eSB0aWxlIGZvciBzdHlsZSAnJHtzdHlsZV9uYW1lfScgYCwgdGlsZSwgdGlsZS5wcm94eV9mb3IpO1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBUaWxlLXNwZWNpZmljIHN0YXRlXG4gICAgICAgICAgICB0aGlzLnZpZXcuc2V0dXBUaWxlKHRpbGUsIHByb2dyYW0pO1xuXG4gICAgICAgICAgICAvLyBSZW5kZXIgdGlsZVxuICAgICAgICAgICAgbGV0IG1lc2ggPSB0aWxlLm1lc2hlc1tzdHlsZV9uYW1lXTtcbiAgICAgICAgICAgIGlmIChzdHlsZS5yZW5kZXIobWVzaCkpIHtcbiAgICAgICAgICAgICAgICAvLyBEb24ndCBpbmN1ciBhZGRpdGlvbmFsIHJlbmRlcnMgd2hpbGUgdmlld3BvcnQgaXMgbW92aW5nXG4gICAgICAgICAgICAgICAgaWYgKCEodGhpcy52aWV3LnBhbm5pbmcgfHwgdGhpcy52aWV3Lnpvb21pbmcpKSB7XG4gICAgICAgICAgICAgICAgICAgdGhpcy5yZXF1ZXN0UmVkcmF3KCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmVuZGVyX2NvdW50ICs9IG1lc2guZ2VvbWV0cnlfY291bnQ7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcmVuZGVyX2NvdW50O1xuICAgIH1cblxuICAgIHNldHVwU3R5bGUoc3R5bGUsIHByb2dyYW1fa2V5KSB7XG4gICAgICAgIC8vIEdldCBzaGFkZXIgcHJvZ3JhbSBmcm9tIHN0eWxlLCBsYXppbHkgY29tcGlsaW5nIGlmIG5lY2Vzc2FyeVxuICAgICAgICBsZXQgcHJvZ3JhbTtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHByb2dyYW0gPSBzdHlsZS5nZXRQcm9ncmFtKHByb2dyYW1fa2V5KTtcbiAgICAgICAgICAgIGlmICghcHJvZ3JhbSkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjYXRjaChlcnJvcikge1xuICAgICAgICAgICAgdGhpcy50cmlnZ2VyKCd3YXJuaW5nJywge1xuICAgICAgICAgICAgICAgIHR5cGU6ICdzdHlsZXMnLFxuICAgICAgICAgICAgICAgIG1lc3NhZ2U6IGBFcnJvciBjb21waWxpbmcgc3R5bGUgJHtzdHlsZS5uYW1lfWAsXG4gICAgICAgICAgICAgICAgc3R5bGUsXG4gICAgICAgICAgICAgICAgc2hhZGVyX2Vycm9yczogc3R5bGUucHJvZ3JhbSAmJiBzdHlsZS5wcm9ncmFtLnNoYWRlcl9lcnJvcnNcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgcHJvZ3JhbS51c2UoKTtcbiAgICAgICAgc3R5bGUuc2V0dXAoKTtcblxuICAgICAgICBwcm9ncmFtLnVuaWZvcm0oJzFmJywgJ3VfdGltZScsIHRoaXMuYW5pbWF0ZWQgPyAoKCgrbmV3IERhdGUoKSkgLSB0aGlzLnN0YXJ0X3RpbWUpIC8gMTAwMCkgOiAwKTtcbiAgICAgICAgdGhpcy52aWV3LnNldHVwUHJvZ3JhbShwcm9ncmFtKTtcbiAgICAgICAgZm9yIChsZXQgaSBpbiB0aGlzLmxpZ2h0cykge1xuICAgICAgICAgICAgdGhpcy5saWdodHNbaV0uc2V0dXBQcm9ncmFtKHByb2dyYW0pO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHByb2dyYW07XG4gICAgfVxuXG4gICAgY2xlYXJGcmFtZSh7IGNsZWFyX2NvbG9yLCBjbGVhcl9kZXB0aCB9ID0ge30pIHtcbiAgICAgICAgaWYgKCF0aGlzLmluaXRpYWxpemVkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBEZWZhdWx0c1xuICAgICAgICBjbGVhcl9jb2xvciA9IChjbGVhcl9jb2xvciA9PT0gZmFsc2UpID8gZmFsc2UgOiB0cnVlOyAvLyBkZWZhdWx0IHRydWVcbiAgICAgICAgY2xlYXJfZGVwdGggPSAoY2xlYXJfZGVwdGggPT09IGZhbHNlKSA/IGZhbHNlIDogdHJ1ZTsgLy8gZGVmYXVsdCB0cnVlXG5cbiAgICAgICAgLy8gU2V0IEdMIHN0YXRlXG4gICAgICAgIHRoaXMucmVuZGVyX3N0YXRlcy5kZXB0aF93cml0ZS5zZXQoeyBkZXB0aF93cml0ZTogY2xlYXJfZGVwdGggfSk7XG5cbiAgICAgICAgbGV0IGdsID0gdGhpcy5nbDtcbiAgICAgICAgaWYgKGNsZWFyX2NvbG9yIHx8IGNsZWFyX2RlcHRoKSB7XG4gICAgICAgICAgICBsZXQgbWFzayA9IChjbGVhcl9jb2xvciAmJiBnbC5DT0xPUl9CVUZGRVJfQklUKSB8IChjbGVhcl9kZXB0aCAmJiBnbC5ERVBUSF9CVUZGRVJfQklUKTtcbiAgICAgICAgICAgIGdsLmNsZWFyKG1hc2spO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgc2V0UmVuZGVyU3RhdGUoeyBkZXB0aF90ZXN0LCBkZXB0aF93cml0ZSwgY3VsbF9mYWNlLCBibGVuZCB9ID0ge30pIHtcbiAgICAgICAgaWYgKCF0aGlzLmluaXRpYWxpemVkKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBEZWZhdWx0c1xuICAgICAgICAvLyBUT0RPOiB3aGVuIHdlIGFic3RyYWN0IG91dCBzdXBwb3J0IGZvciBtdWx0aXBsZSByZW5kZXIgcGFzc2VzLCB0aGVzZSBjYW4gYmUgcGVyLXBhc3MgY29uZmlnIG9wdGlvbnNcbiAgICAgICAgbGV0IHJlbmRlcl9zdGF0ZXMgPSB0aGlzLnJlbmRlcl9zdGF0ZXM7XG4gICAgICAgIGRlcHRoX3Rlc3QgPSAoZGVwdGhfdGVzdCA9PT0gZmFsc2UpID8gZmFsc2UgOiByZW5kZXJfc3RhdGVzLmRlZmF1bHRzLmRlcHRoX3Rlc3Q7ICAgICAgLy8gZGVmYXVsdCB0cnVlXG4gICAgICAgIGRlcHRoX3dyaXRlID0gKGRlcHRoX3dyaXRlID09PSBmYWxzZSkgPyBmYWxzZSA6IHJlbmRlcl9zdGF0ZXMuZGVmYXVsdHMuZGVwdGhfd3JpdGU7ICAgLy8gZGVmYXVsdCB0cnVlXG4gICAgICAgIGN1bGxfZmFjZSA9IChjdWxsX2ZhY2UgPT09IGZhbHNlKSA/IGZhbHNlIDogcmVuZGVyX3N0YXRlcy5kZWZhdWx0cy5jdWxsaW5nOyAgICAgICAgICAgLy8gZGVmYXVsdCB0cnVlXG4gICAgICAgIGJsZW5kID0gKGJsZW5kICE9IG51bGwpID8gYmxlbmQgOiByZW5kZXJfc3RhdGVzLmRlZmF1bHRzLmJsZW5kaW5nOyAgICAgICAgICAgICAgICAgICAgLy8gZGVmYXVsdCBmYWxzZVxuXG4gICAgICAgIC8vIFJlc2V0IGZyYW1lIHN0YXRlXG4gICAgICAgIGxldCBnbCA9IHRoaXMuZ2w7XG5cbiAgICAgICAgcmVuZGVyX3N0YXRlcy5kZXB0aF90ZXN0LnNldCh7IGRlcHRoX3Rlc3Q6IGRlcHRoX3Rlc3QgfSk7XG4gICAgICAgIHJlbmRlcl9zdGF0ZXMuZGVwdGhfd3JpdGUuc2V0KHsgZGVwdGhfd3JpdGU6IGRlcHRoX3dyaXRlIH0pO1xuICAgICAgICByZW5kZXJfc3RhdGVzLmN1bGxpbmcuc2V0KHsgY3VsbDogY3VsbF9mYWNlLCBmYWNlOiByZW5kZXJfc3RhdGVzLmRlZmF1bHRzLmN1bGxpbmdfZmFjZSB9KTtcblxuICAgICAgICAvLyBCbGVuZGluZyBvZiBhbHBoYSBjaGFubmVsIGlzIG1vZGlmaWVkIHRvIGFjY291bnQgZm9yIFdlYkdMIGFscGhhIGJlaGF2aW9yLCBzZWU6XG4gICAgICAgIC8vIGh0dHA6Ly93ZWJnbGZ1bmRhbWVudGFscy5vcmcvd2ViZ2wvbGVzc29ucy93ZWJnbC1hbmQtYWxwaGEuaHRtbFxuICAgICAgICAvLyBodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vYS8xMTUzMzQxNlxuICAgICAgICBpZiAoYmxlbmQpIHtcbiAgICAgICAgICAgIC8vIE9wYXF1ZTogYWxsIHNvdXJjZSwgbm8gZGVzdGluYXRpb25cbiAgICAgICAgICAgIGlmIChibGVuZCA9PT0gJ29wYXF1ZScpIHtcbiAgICAgICAgICAgICAgICByZW5kZXJfc3RhdGVzLmJsZW5kaW5nLnNldCh7XG4gICAgICAgICAgICAgICAgICAgIGJsZW5kOiBmYWxzZVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gVHJhZGl0aW9uYWwgYWxwaGEgYmxlbmRpbmdcbiAgICAgICAgICAgIGVsc2UgaWYgKGJsZW5kID09PSAnb3ZlcmxheScgfHwgYmxlbmQgPT09ICdpbmxheScpIHtcbiAgICAgICAgICAgICAgICByZW5kZXJfc3RhdGVzLmJsZW5kaW5nLnNldCh7XG4gICAgICAgICAgICAgICAgICAgIGJsZW5kOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICBzcmM6IGdsLlNSQ19BTFBIQSwgZHN0OiBnbC5PTkVfTUlOVVNfU1JDX0FMUEhBLFxuICAgICAgICAgICAgICAgICAgICBzcmNfYWxwaGE6IGdsLk9ORSwgZHN0X2FscGhhOiBnbC5PTkVfTUlOVVNfU1JDX0FMUEhBXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBBZGRpdGl2ZSBibGVuZGluZ1xuICAgICAgICAgICAgZWxzZSBpZiAoYmxlbmQgPT09ICdhZGQnKSB7XG4gICAgICAgICAgICAgICAgcmVuZGVyX3N0YXRlcy5ibGVuZGluZy5zZXQoe1xuICAgICAgICAgICAgICAgICAgICBibGVuZDogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgc3JjOiBnbC5PTkUsIGRzdDogZ2wuT05FXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBNdWx0aXBsaWNhdGl2ZSBibGVuZGluZ1xuICAgICAgICAgICAgZWxzZSBpZiAoYmxlbmQgPT09ICdtdWx0aXBseScpIHtcbiAgICAgICAgICAgICAgICByZW5kZXJfc3RhdGVzLmJsZW5kaW5nLnNldCh7XG4gICAgICAgICAgICAgICAgICAgIGJsZW5kOiB0cnVlLFxuICAgICAgICAgICAgICAgICAgICBzcmM6IGdsLlpFUk8sIGRzdDogZ2wuU1JDX0NPTE9SXG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZW5kZXJfc3RhdGVzLmJsZW5kaW5nLnNldCh7IGJsZW5kOiBmYWxzZSB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIFJlcXVlc3QgZmVhdHVyZSBzZWxlY3Rpb24gYXQgZ2l2ZW4gcGl4ZWwuIFJ1bnMgYXN5bmMgYW5kIHJldHVybnMgcmVzdWx0cyB2aWEgYSBwcm9taXNlLlxuICAgIGdldEZlYXR1cmVBdChwaXhlbCkge1xuICAgICAgICBpZiAoIXRoaXMuaW5pdGlhbGl6ZWQpIHtcbiAgICAgICAgICAgIGxvZygnZGVidWcnLCBcIlNjZW5lLmdldEZlYXR1cmVBdCgpIGNhbGxlZCBiZWZvcmUgc2NlbmUgd2FzIGluaXRpYWxpemVkXCIpO1xuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gUG9pbnQgc2NhbGVkIHRvIFswLi4xXSByYW5nZVxuICAgICAgICB2YXIgcG9pbnQgPSB7XG4gICAgICAgICAgICB4OiBwaXhlbC54ICogVXRpbHMuZGV2aWNlX3BpeGVsX3JhdGlvIC8gdGhpcy52aWV3LnNpemUuZGV2aWNlLndpZHRoLFxuICAgICAgICAgICAgeTogcGl4ZWwueSAqIFV0aWxzLmRldmljZV9waXhlbF9yYXRpbyAvIHRoaXMudmlldy5zaXplLmRldmljZS5oZWlnaHRcbiAgICAgICAgfTtcblxuICAgICAgICB0aGlzLmRpcnR5ID0gdHJ1ZTsgLy8gbmVlZCB0byBtYWtlIHN1cmUgdGhlIHNjZW5lIHJlLXJlbmRlcnMgZm9yIHRoZXNlIHRvIGJlIHByb2Nlc3NlZFxuICAgICAgICByZXR1cm4gdGhpcy5zZWxlY3Rpb24uZ2V0RmVhdHVyZUF0KHBvaW50KS5cbiAgICAgICAgICAgIHRoZW4oc2VsZWN0aW9uID0+IE9iamVjdC5hc3NpZ24oc2VsZWN0aW9uLCB7IHBpeGVsIH0pKS5cbiAgICAgICAgICAgIGNhdGNoKGVycm9yID0+IFByb21pc2UucmVzb2x2ZSh7IGVycm9yIH0pKTtcbiAgICB9XG5cbiAgICAvLyBSZWJ1aWxkIGdlb21ldHJ5LCB3aXRob3V0IHJlLXBhcnNpbmcgdGhlIGNvbmZpZyBvciByZS1jb21waWxpbmcgc3R5bGVzXG4gICAgLy8gVE9ETzogZGV0ZWN0IHdoaWNoIGVsZW1lbnRzIG5lZWQgdG8gYmUgcmVmcmVzaGVkL3JlYnVpbHQgKHN0eWxlc2hlZXQgY2hhbmdlcywgZXRjLilcbiAgICByZWJ1aWxkKG9wdGlvbnMpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucmVidWlsZEdlb21ldHJ5KG9wdGlvbnMpO1xuICAgIH1cblxuICAgIC8vIFJlYnVpbGQgYWxsIHRpbGVzXG4gICAgLy8gc3luYzogYm9vbGVhbiBvZiB3aGV0aGVyIHRvIHN5bmMgdGhlIGNvbmZpZyBvYmplY3QgdG8gdGhlIHdvcmtlclxuICAgIC8vIHNvdXJjZXM6IG9wdGlvbmFsIGFycmF5IG9mIGRhdGEgc291cmNlcyB0byBzZWxlY3RpdmVseSByZWJ1aWxkIChieSBkZWZhdWx0IGFsbCBvdXIgcmVidWlsdClcbiAgICByZWJ1aWxkR2VvbWV0cnkoeyBzeW5jID0gdHJ1ZSwgc291cmNlcyA9IG51bGwsIHNlcmlhbGl6ZV9mdW5jcywgcHJvZmlsZSA9IGZhbHNlLCBmYWRlX2luID0gZmFsc2UgfSA9IHt9KSB7XG4gICAgICAgIHJldHVybiBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICAvLyBTa2lwIHJlYnVpbGQgaWYgYWxyZWFkeSBpbiBwcm9ncmVzc1xuICAgICAgICAgICAgaWYgKHRoaXMuYnVpbGRpbmcpIHtcbiAgICAgICAgICAgICAgICAvLyBRdWV1ZSB1cCB0byBvbmUgcmVidWlsZCBjYWxsIGF0IGEgdGltZSwgb25seSBzYXZlIGxhc3QgcmVxdWVzdFxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmJ1aWxkaW5nLnF1ZXVlZCAmJiB0aGlzLmJ1aWxkaW5nLnF1ZXVlZC5yZWplY3QpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gbm90aWZ5IHByZXZpb3VzIHJlcXVlc3QgdGhhdCBpdCBkaWQgbm90IGNvbXBsZXRlXG4gICAgICAgICAgICAgICAgICAgIGxvZygnZGVidWcnLCAnU2NlbmUucmVidWlsZDogcmVxdWVzdCBzdXBlcmNlZGVkIGJ5IGEgbmV3ZXIgY2FsbCcpO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmJ1aWxkaW5nLnF1ZXVlZC5yZXNvbHZlKGZhbHNlKTsgLy8gZmFsc2UgZmxhZyBpbmRpY2F0ZXMgcmVidWlsZCByZXF1ZXN0IHdhcyBzdXBlcmNlZGVkXG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gU2F2ZSBxdWV1ZWQgcmVxdWVzdFxuICAgICAgICAgICAgICAgIHRoaXMuYnVpbGRpbmcucXVldWVkID0geyByZXNvbHZlLCByZWplY3QgfTtcbiAgICAgICAgICAgICAgICBsb2coJ3RyYWNlJywgYFNjZW5lLnJlYnVpbGQoKTogcXVldWluZyByZXF1ZXN0YCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBUcmFjayB0aWxlIGJ1aWxkIHN0YXRlXG4gICAgICAgICAgICB0aGlzLmJ1aWxkaW5nID0geyByZXNvbHZlLCByZWplY3QgfTtcblxuICAgICAgICAgICAgLy8gUHJvZmlsaW5nXG4gICAgICAgICAgICBpZiAocHJvZmlsZSkge1xuICAgICAgICAgICAgICAgIHRoaXMuX3Byb2ZpbGUoJ1NjZW5lLnJlYnVpbGQnKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gVXBkYXRlIGNvbmZpZyAoaW4gY2FzZSBKUyBvYmplY3RzIHdlcmUgbWFuaXB1bGF0ZWQgZGlyZWN0bHkpXG4gICAgICAgICAgICBpZiAoc3luYykge1xuICAgICAgICAgICAgICAgIHRoaXMuc3luY0NvbmZpZ1RvV29ya2VyKHsgc2VyaWFsaXplX2Z1bmNzIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5yZXNldEZlYXR1cmVTZWxlY3Rpb24oKTtcbiAgICAgICAgICAgIHRoaXMucmVzZXRUaW1lKCk7XG5cbiAgICAgICAgICAgIC8vIFJlYnVpbGQgdmlzaWJsZSB0aWxlc1xuICAgICAgICAgICAgdGhpcy50aWxlX21hbmFnZXIucHJ1bmVUb1Zpc2libGVUaWxlcygpO1xuICAgICAgICAgICAgdGhpcy50aWxlX21hbmFnZXIuZm9yRWFjaFRpbGUodGlsZSA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKCFzb3VyY2VzIHx8IHNvdXJjZXMuaW5kZXhPZih0aWxlLnNvdXJjZS5uYW1lKSA+IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudGlsZV9tYW5hZ2VyLmJ1aWxkVGlsZSh0aWxlLCB7IGZhZGVfaW4gfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB0aGlzLnRpbGVfbWFuYWdlci51cGRhdGVUaWxlc0ZvclZpZXcoKTsgLy8gcGlja3MgdXAgYWRkaXRpb25hbCB0aWxlcyBmb3IgYW55IG5ldy9jaGFuZ2VkIGRhdGEgc291cmNlc1xuICAgICAgICAgICAgdGhpcy50aWxlX21hbmFnZXIuY2hlY2tCdWlsZFF1ZXVlKCk7ICAgIC8vIHJlc29sdmUgaW1tZWRpYXRlbHkgaWYgbm8gdGlsZXMgdG8gYnVpbGRcbiAgICAgICAgfSkudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAvLyBQcm9maWxpbmdcbiAgICAgICAgICAgIGlmIChwcm9maWxlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5fcHJvZmlsZUVuZCgnU2NlbmUucmVidWlsZCcpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBUaWxlIG1hbmFnZXIgZmluaXNoZWQgYnVpbGRpbmcgdGlsZXNcbiAgICAvLyBUT0RPIG1vdmUgdG8gdGlsZSBtYW5hZ2VyXG4gICAgdGlsZU1hbmFnZXJCdWlsZERvbmUoKSB7XG4gICAgICAgIGlmICh0aGlzLmJ1aWxkaW5nKSB7XG4gICAgICAgICAgICBsb2coJ2luZm8nLCBgU2NlbmU6IGJ1aWxkIGdlb21ldHJ5IGZpbmlzaGVkYCk7XG4gICAgICAgICAgICBpZiAodGhpcy5idWlsZGluZy5yZXNvbHZlKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5idWlsZGluZy5yZXNvbHZlKHRydWUpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBBbm90aGVyIHJlYnVpbGQgcXVldWVkP1xuICAgICAgICAgICAgdmFyIHF1ZXVlZCA9IHRoaXMuYnVpbGRpbmcucXVldWVkO1xuICAgICAgICAgICAgdGhpcy5idWlsZGluZyA9IG51bGw7XG4gICAgICAgICAgICBpZiAocXVldWVkKSB7XG4gICAgICAgICAgICAgICAgbG9nKCdkZWJ1ZycsIGBTY2VuZTogc3RhcnRpbmcgcXVldWVkIHJlYnVpbGQoKSByZXF1ZXN0YCk7XG4gICAgICAgICAgICAgICAgdGhpcy5yZWJ1aWxkKCkudGhlbihxdWV1ZWQucmVzb2x2ZSwgcXVldWVkLnJlamVjdCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgICBMb2FkIChvciByZWxvYWQpIHRoZSBzY2VuZSBjb25maWdcbiAgICAgICBAcmV0dXJuIHtQcm9taXNlfVxuICAgICovXG4gICAgbG9hZFNjZW5lKGNvbmZpZ19zb3VyY2UgPSBudWxsLCBjb25maWdfcGF0aCA9IG51bGwpIHtcbiAgICAgICAgdGhpcy5jb25maWdfc291cmNlID0gY29uZmlnX3NvdXJjZSB8fCB0aGlzLmNvbmZpZ19zb3VyY2U7XG4gICAgICAgIHRoaXMuY29uZmlnX2dsb2JhbHNfYXBwbGllZCA9IFtdO1xuXG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5jb25maWdfc291cmNlID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgdGhpcy5jb25maWdfcGF0aCA9IFVSTHMucGF0aEZvclVSTChjb25maWdfcGF0aCB8fCB0aGlzLmNvbmZpZ19zb3VyY2UpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5jb25maWdfcGF0aCA9IFVSTHMucGF0aEZvclVSTChjb25maWdfcGF0aCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gU2NlbmVMb2FkZXIubG9hZFNjZW5lKHRoaXMuY29uZmlnX3NvdXJjZSwgdGhpcy5jb25maWdfcGF0aCkudGhlbigoe2NvbmZpZywgYnVuZGxlfSkgPT4ge1xuICAgICAgICAgICAgdGhpcy5jb25maWcgPSBjb25maWc7XG4gICAgICAgICAgICB0aGlzLmNvbmZpZ19idW5kbGUgPSBidW5kbGU7XG4gICAgICAgICAgICB0aGlzLnRyaWdnZXIoJ2xvYWQnLCB7IGNvbmZpZzogdGhpcy5jb25maWcgfSk7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5jb25maWc7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIEFkZCBzb3VyY2UgdG8gYSBzY2VuZSwgYXJndW1lbnRzIGBuYW1lYCBhbmQgYGNvbmZpZ2AgbmVlZCB0byBiZSBwcm92aWRlZDpcbiAgICAvLyAgLSBJZiB0aGUgbmFtZSBkb2Vzbid0IG1hdGNoIGEgc291cmNlcyBpdCB3aWxsIGNyZWF0ZSBpdFxuICAgIC8vICAtIHRoZSBgY29uZmlnYCBvYmogZm9sbG93IHRoZSBZQU1MIHNjZW5lIHNwZWMsIGV4OiBgYGB7dHlwZTogJ1RvcG9KU09OJywgdXJsOiBcIi8vdmVjdG9yLm1hcHplbi5jb20vb3NtL2FsbC97en0ve3h9L3t5fS50b3BvanNvblwiXX1gYGBcbiAgICAvLyAgICB0aGF0IGxvb2tzIGxpa2U6XG4gICAgLy9cbiAgICAvLyAgICAgIHNjZW5lLnNldERhdGFTb3VyY2UoXCJvc21cIiwge3R5cGU6ICdUb3BvSlNPTicsIHVybDogXCIvL3ZlY3Rvci5tYXB6ZW4uY29tL29zbS9hbGwve3p9L3t4fS97eX0udG9wb2pzb25cIiB9KTtcbiAgICAvL1xuICAgIC8vICAtIGFsc28gY2FuIGJlIHBhc3MgYSBgYGBkYXRhYGBgIG9iajogYGBge3R5cGU6ICdHZW9KU09OJywgZGF0YTogSlNPYmogXX1gYGBcbiAgICAvL1xuICAgIC8vICAgICAgdmFyIGdlb2pzb25fZGF0YSA9IHt9O1xuICAgIC8vICAgICAgLi4uXG4gICAgLy8gICAgICBzY2VuZS5zZXREYXRhU291cmNlKFwiZHluYW1pY19kYXRhXCIsIHt0eXBlOiAnR2VvSlNPTicsIGRhdGE6IGdlb2pzb25fZGF0YSB9KTtcbiAgICAvL1xuICAgIHNldERhdGFTb3VyY2UgKG5hbWUsIGNvbmZpZykge1xuICAgICAgICBpZiAoIW5hbWUgfHwgIWNvbmZpZyB8fCAhY29uZmlnLnR5cGUgfHwgKCFjb25maWcudXJsICYmICFjb25maWcuZGF0YSkpIHtcbiAgICAgICAgICAgIGxvZygnZXJyb3InLCBcIk5vIG5hbWUgcHJvdmlkZWQgb3Igbm90IGEgdmFsaWQgY29uZmlnOlwiLCBuYW1lLCBjb25maWcpO1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGxvYWQgPSAodGhpcy5jb25maWcuc291cmNlc1tuYW1lXSA9PSBudWxsKTtcbiAgICAgICAgbGV0IHNvdXJjZSA9IHRoaXMuY29uZmlnLnNvdXJjZXNbbmFtZV0gPSBPYmplY3QuYXNzaWduKHt9LCBjb25maWcpO1xuXG4gICAgICAgIC8vIENvbnZlcnQgcmF3IGRhdGEgaW50byBibG9iIFVSTFxuICAgICAgICBpZiAoc291cmNlLmRhdGEgJiYgdHlwZW9mIHNvdXJjZS5kYXRhID09PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgc291cmNlLnVybCA9IFVSTHMuY3JlYXRlT2JqZWN0VVJMKG5ldyBCbG9iKFtKU09OLnN0cmluZ2lmeShzb3VyY2UuZGF0YSldKSk7XG4gICAgICAgICAgICBkZWxldGUgc291cmNlLmRhdGE7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBSZXNvbHZlIHBhdGhzIHJlbGF0aXZlIHRvIHJvb3Qgc2NlbmUgYnVuZGxlXG4gICAgICAgIFNjZW5lTG9hZGVyLm5vcm1hbGl6ZURhdGFTb3VyY2Uoc291cmNlLCB0aGlzLmNvbmZpZ19idW5kbGUpO1xuXG4gICAgICAgIGlmIChsb2FkKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy51cGRhdGVDb25maWcoeyByZWJ1aWxkOiB7IHNvdXJjZXM6IFtuYW1lXSB9IH0pO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMucmVidWlsZCh7IHNvdXJjZXM6IFtuYW1lXSB9KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGNyZWF0ZURhdGFTb3VyY2VzKCkge1xuICAgICAgICBsZXQgcmVzZXQgPSBbXTsgLy8gc291cmNlcyB0byByZXNldFxuICAgICAgICBsZXQgcHJldl9zb3VyY2VfbmFtZXMgPSBPYmplY3Qua2V5cyh0aGlzLnNvdXJjZXMpO1xuICAgICAgICBsZXQgc291cmNlX2lkID0gMDtcblxuICAgICAgICBmb3IgKHZhciBuYW1lIGluIHRoaXMuY29uZmlnLnNvdXJjZXMpIHtcbiAgICAgICAgICAgIGxldCBzb3VyY2UgPSB0aGlzLmNvbmZpZy5zb3VyY2VzW25hbWVdO1xuICAgICAgICAgICAgbGV0IHByZXZfc291cmNlID0gdGhpcy5zb3VyY2VzW25hbWVdO1xuXG4gICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgIGxldCBjb25maWcgPSBPYmplY3QuYXNzaWduKHt9LCBzb3VyY2UsIHsgbmFtZSwgaWQ6IHNvdXJjZV9pZCsrIH0pO1xuICAgICAgICAgICAgICAgIHRoaXMuc291cmNlc1tuYW1lXSA9IERhdGFTb3VyY2UuY3JlYXRlKGNvbmZpZywgdGhpcy5zb3VyY2VzKTtcbiAgICAgICAgICAgICAgICBpZiAoIXRoaXMuc291cmNlc1tuYW1lXSkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyB7fTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaChlKSB7XG4gICAgICAgICAgICAgICAgZGVsZXRlIHRoaXMuc291cmNlc1tuYW1lXTtcbiAgICAgICAgICAgICAgICBsZXQgbWVzc2FnZSA9IGBDb3VsZCBub3QgY3JlYXRlIGRhdGEgc291cmNlOiAke2UubWVzc2FnZX1gO1xuICAgICAgICAgICAgICAgIGxvZygnd2FybicsIGBTY2VuZTogJHttZXNzYWdlfWAsIHNvdXJjZSk7XG4gICAgICAgICAgICAgICAgdGhpcy50cmlnZ2VyKCd3YXJuaW5nJywgeyB0eXBlOiAnc291cmNlcycsIHNvdXJjZSwgbWVzc2FnZSB9KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gRGF0YSBzb3VyY2UgY2hhbmdlZD9cbiAgICAgICAgICAgIGlmIChEYXRhU291cmNlLmNoYW5nZWQodGhpcy5zb3VyY2VzW25hbWVdLCBwcmV2X3NvdXJjZSkpIHtcbiAgICAgICAgICAgICAgICByZXNldC5wdXNoKG5hbWUpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gU291cmNlcyB0aGF0IHdlcmUgcmVtb3ZlZFxuICAgICAgICBwcmV2X3NvdXJjZV9uYW1lcy5mb3JFYWNoKHMgPT4ge1xuICAgICAgICAgICAgaWYgKCF0aGlzLmNvbmZpZy5zb3VyY2VzW3NdKSB7XG4gICAgICAgICAgICAgICAgZGVsZXRlIHRoaXMuc291cmNlc1tzXTsgLy8gVE9ETzogcmVtb3ZlIGZyb20gd29ya2VycyB0b28/XG4gICAgICAgICAgICAgICAgcmVzZXQucHVzaChzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gUmVtb3ZlIHRpbGVzIGZyb20gc291cmNlcyB0aGF0IGhhdmUgY2hhbmdlZFxuICAgICAgICBpZiAocmVzZXQubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgdGhpcy50aWxlX21hbmFnZXIucmVtb3ZlVGlsZXModGlsZSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIChyZXNldC5pbmRleE9mKHRpbGUuc291cmNlLm5hbWUpID4gLTEpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBNYXJrIHNvdXJjZXMgdGhhdCB3aWxsIGdlbmVyYXRlIGdlb21ldHJ5IHRpbGVzXG4gICAgICAgIC8vIChhbGwgZXhjZXB0IHRob3NlIHRoYXQgYXJlIG9ubHkgcmFzdGVyIHNvdXJjZXMgYXR0YWNoZWQgdG8gb3RoZXIgc291cmNlcylcbiAgICAgICAgZm9yIChsZXQgbG4gaW4gdGhpcy5jb25maWcubGF5ZXJzKSB7XG4gICAgICAgICAgICBsZXQgbGF5ZXIgPSB0aGlzLmNvbmZpZy5sYXllcnNbbG5dO1xuICAgICAgICAgICAgaWYgKGxheWVyLmRhdGEgJiYgdGhpcy5zb3VyY2VzW2xheWVyLmRhdGEuc291cmNlXSkge1xuICAgICAgICAgICAgICAgIHRoaXMuc291cmNlc1tsYXllci5kYXRhLnNvdXJjZV0uYnVpbGRzX2dlb21ldHJ5X3RpbGVzID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIExvYWQgYWxsIHRleHR1cmVzIGluIHRoZSBzY2VuZSBkZWZpbml0aW9uXG4gICAgbG9hZFRleHR1cmVzKCkge1xuICAgICAgICByZXR1cm4gVGV4dHVyZS5jcmVhdGVGcm9tT2JqZWN0KHRoaXMuZ2wsIHRoaXMuY29uZmlnLnRleHR1cmVzKS5cbiAgICAgICAgICAgIHRoZW4oKCkgPT4gVGV4dHVyZS5jcmVhdGVEZWZhdWx0KHRoaXMuZ2wpKTsgLy8gY3JlYXRlIGEgJ2RlZmF1bHQnIHRleHR1cmUgZm9yIHBsYWNlaG9sZGVyc1xuICAgIH1cblxuICAgIC8vIENhbGxlZCAoY3VycmVudGx5IG1hbnVhbGx5KSBhZnRlciBzdHlsZXMgYXJlIHVwZGF0ZWQgaW4gc3R5bGVzaGVldFxuICAgIHVwZGF0ZVN0eWxlcygpIHtcbiAgICAgICAgaWYgKCF0aGlzLmluaXRpYWxpemVkICYmICF0aGlzLmluaXRpYWxpemluZykge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdTY2VuZS51cGRhdGVTdHlsZXMoKSBjYWxsZWQgYmVmb3JlIHNjZW5lIHdhcyBpbml0aWFsaXplZCcpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gKFJlKWJ1aWxkIHN0eWxlcyBmcm9tIGNvbmZpZ1xuICAgICAgICB0aGlzLnN0eWxlcyA9IHRoaXMuc3R5bGVfbWFuYWdlci5idWlsZCh0aGlzLmNvbmZpZy5zdHlsZXMpO1xuICAgICAgICB0aGlzLnN0eWxlX21hbmFnZXIuaW5pdFN0eWxlcyh0aGlzKTtcblxuICAgICAgICAvLyBPcHRpb25hbGx5IHNldCBHTCBjb250ZXh0ICh1c2VkIHdoZW4gaW5pdGlhbGl6aW5nIG9yIHJlLWluaXRpYWxpemluZyBHTCByZXNvdXJjZXMpXG4gICAgICAgIGZvciAobGV0IHN0eWxlIGluIHRoaXMuc3R5bGVzKSB7XG4gICAgICAgICAgICB0aGlzLnN0eWxlc1tzdHlsZV0uc2V0R0wodGhpcy5nbCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBVc2UgZXhwbGljaXRseSBzZXQgc2NlbmUgYW5pbWF0aW9uIGZsYWcgaWYgZGVmaW5lZCwgb3RoZXJ3aXNlIHR1cm4gb24gYW5pbWF0aW9uIGlmIHRoZXJlIGFyZSBhbnkgYW5pbWF0ZWQgc3R5bGVzXG4gICAgICAgIHRoaXMuYW5pbWF0ZWQgPVxuICAgICAgICAgICAgdGhpcy5jb25maWcuc2NlbmUuYW5pbWF0ZWQgIT09IHVuZGVmaW5lZCA/XG4gICAgICAgICAgICAgICAgdGhpcy5jb25maWcuc2NlbmUuYW5pbWF0ZWQgOlxuICAgICAgICAgICAgICAgIE9iamVjdC5rZXlzKHRoaXMuc3R5bGVzKS5zb21lKHMgPT4gdGhpcy5zdHlsZXNbc10uYW5pbWF0ZWQpO1xuXG4gICAgICAgIHRoaXMuZGlydHkgPSB0cnVlO1xuICAgIH1cblxuICAgIC8vIEdldCBhY3RpdmUgY2FtZXJhIC0gZm9yIHB1YmxpYyBBUElcbiAgICBnZXRBY3RpdmVDYW1lcmEoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnZpZXcuZ2V0QWN0aXZlQ2FtZXJhKCk7XG4gICAgfVxuXG4gICAgLy8gU2V0IGFjdGl2ZSBjYW1lcmEgLSBmb3IgcHVibGljIEFQSVxuICAgIHNldEFjdGl2ZUNhbWVyYShuYW1lKSB7XG4gICAgICAgIHJldHVybiB0aGlzLnZpZXcuc2V0QWN0aXZlQ2FtZXJhKG5hbWUpO1xuICAgIH1cblxuICAgIC8vIENyZWF0ZSBsaWdodGluZ1xuICAgIGNyZWF0ZUxpZ2h0cygpIHtcbiAgICAgICAgdGhpcy5saWdodHMgPSB7fTtcbiAgICAgICAgZm9yIChsZXQgaSBpbiB0aGlzLmNvbmZpZy5saWdodHMpIHtcbiAgICAgICAgICAgIGlmICghdGhpcy5jb25maWcubGlnaHRzW2ldIHx8IHR5cGVvZiB0aGlzLmNvbmZpZy5saWdodHNbaV0gIT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsZXQgbGlnaHQgPSB0aGlzLmNvbmZpZy5saWdodHNbaV07XG4gICAgICAgICAgICBsaWdodC5uYW1lID0gaS5yZXBsYWNlKCctJywgJ18nKTsgLy8gbGlnaHQgbmFtZXMgYXJlIGluamVjdGVkIGluIHNoYWRlcnMsIGNhbid0IGhhdmUgaHlwaGVuc1xuICAgICAgICAgICAgbGlnaHQudmlzaWJsZSA9IChsaWdodC52aXNpYmxlID09PSBmYWxzZSkgPyBmYWxzZSA6IHRydWU7XG4gICAgICAgICAgICBpZiAobGlnaHQudmlzaWJsZSkge1xuICAgICAgICAgICAgICAgIHRoaXMubGlnaHRzW2xpZ2h0Lm5hbWVdID0gTGlnaHQuY3JlYXRlKHRoaXMudmlldywgbGlnaHQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIExpZ2h0LmluamVjdCh0aGlzLmxpZ2h0cyk7XG4gICAgfVxuXG4gICAgLy8gU2V0IGJhY2tncm91bmQgY29sb3JcbiAgICBzZXRCYWNrZ3JvdW5kKCkge1xuICAgICAgICBsZXQgYmcgPSB0aGlzLmNvbmZpZy5zY2VuZS5iYWNrZ3JvdW5kO1xuICAgICAgICB0aGlzLmJhY2tncm91bmQgPSB7fTtcbiAgICAgICAgaWYgKGJnICYmIGJnLmNvbG9yKSB7XG4gICAgICAgICAgICB0aGlzLmJhY2tncm91bmQuY29sb3IgPSBTdHlsZVBhcnNlci5wYXJzZUNvbG9yKGJnLmNvbG9yKTtcbiAgICAgICAgfVxuICAgICAgICBpZiAoIXRoaXMuYmFja2dyb3VuZC5jb2xvcikge1xuICAgICAgICAgICAgdGhpcy5iYWNrZ3JvdW5kLmNvbG9yID0gWzAsIDAsIDAsIDBdOyAvLyBkZWZhdWx0IGJhY2tncm91bmQgVE9ETzogdmFyeSB3L3NjZW5lIGFscGhhXG4gICAgICAgIH1cblxuICAgICAgICAvLyBpZiBiYWNrZ3JvdW5kIGlzIGZ1bGx5IG9wYXF1ZSwgc2V0IGNhbnZhcyBiYWNrZ3JvdW5kIHRvIG1hdGNoXG4gICAgICAgIGlmICh0aGlzLmJhY2tncm91bmQuY29sb3JbM10gPT09IDEpIHtcbiAgICAgICAgICAgIHRoaXMuY2FudmFzLnN0eWxlLmJhY2tncm91bmRDb2xvciA9XG4gICAgICAgICAgICAgICAgYHJnYmEoJHt0aGlzLmJhY2tncm91bmQuY29sb3IubWFwKGMgPT4gTWF0aC5mbG9vcihjICogMjU1KSkuam9pbignLCAnKX0pYDtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHRoaXMuY2FudmFzLnN0eWxlLmJhY2tncm91bmRDb2xvciA9ICd0cmFuc3BhcmVudCc7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmdsLmNsZWFyQ29sb3IoLi4udGhpcy5iYWNrZ3JvdW5kLmNvbG9yKTtcbiAgICB9XG5cbiAgICAvLyBUdXJuIGludHJvc3BlY3Rpb24gbW9kZSBvbi9vZmZcbiAgICBzZXRJbnRyb3NwZWN0aW9uICh2YWwpIHtcbiAgICAgICAgdGhpcy5pbnRyb3NwZWN0aW9uID0gdmFsIHx8IGZhbHNlO1xuICAgICAgICB0aGlzLnVwZGF0aW5nKys7XG4gICAgICAgIHJldHVybiB0aGlzLnVwZGF0ZUNvbmZpZygpLnRoZW4oKCkgPT4gdGhpcy51cGRhdGluZy0tKTtcbiAgICB9XG5cbiAgICAvLyBVcGRhdGUgc2NlbmUgY29uZmlnLCBhbmQgb3B0aW9uYWxseSByZWJ1aWxkIGdlb21ldHJ5XG4gICAgLy8gcmVidWlsZCBjYW4gYmUgYm9vbGVhbiwgb3IgYW4gb2JqZWN0IGNvbnRhaW5pbmcgcmVidWlsZCBvcHRpb25zIHRvIHBhc3N0aHJvdWdoXG4gICAgdXBkYXRlQ29uZmlnKHsgcmVidWlsZCA9IHRydWUsIHNlcmlhbGl6ZV9mdW5jcywgZmFkZV9pbiA9IGZhbHNlIH0gPSB7fSkge1xuICAgICAgICB0aGlzLmdlbmVyYXRpb24gPSArK1NjZW5lLmdlbmVyYXRpb247XG4gICAgICAgIHRoaXMudXBkYXRpbmcrKztcblxuICAgICAgICB0aGlzLmNvbmZpZyA9IFNjZW5lTG9hZGVyLmFwcGx5R2xvYmFsUHJvcGVydGllcyh0aGlzLmNvbmZpZywgdGhpcy5jb25maWdfZ2xvYmFsc19hcHBsaWVkKTtcbiAgICAgICAgU2NlbmVMb2FkZXIuaG9pc3RUZXh0dXJlcyh0aGlzLmNvbmZpZyk7IC8vIG1vdmUgaW5saW5lIHRleHR1cmVzIGludG8gZ2xvYmFsIHRleHR1cmUgc2V0XG4gICAgICAgIHRoaXMuc3R5bGVfbWFuYWdlci5pbml0KCk7XG4gICAgICAgIHRoaXMudmlldy5yZXNldCgpO1xuICAgICAgICB0aGlzLmNyZWF0ZUxpZ2h0cygpO1xuICAgICAgICB0aGlzLmNyZWF0ZURhdGFTb3VyY2VzKCk7XG4gICAgICAgIHRoaXMubG9hZFRleHR1cmVzKCk7XG4gICAgICAgIHRoaXMuc2V0QmFja2dyb3VuZCgpO1xuICAgICAgICBGb250TWFuYWdlci5sb2FkRm9udHModGhpcy5jb25maWcuZm9udHMpO1xuXG4gICAgICAgIC8vIFRPRE86IGRldGVjdCBjaGFuZ2VzIHRvIHN0eWxlcz8gYWxyZWFkeSAoY3VycmVudGx5KSBuZWVkIHRvIHJlY29tcGlsZSBhbnl3YXkgd2hlbiBjYW1lcmEgb3IgbGlnaHRzIGNoYW5nZVxuICAgICAgICB0aGlzLnVwZGF0ZVN0eWxlcygpO1xuXG4gICAgICAgIC8vIE9wdGlvbmFsbHkgcmVidWlsZCBnZW9tZXRyeVxuICAgICAgICBsZXQgZG9uZSA9IHJlYnVpbGQgP1xuICAgICAgICAgICAgdGhpcy5yZWJ1aWxkKE9iamVjdC5hc3NpZ24oeyBzZXJpYWxpemVfZnVuY3MsIGZhZGVfaW4gfSwgdHlwZW9mIHJlYnVpbGQgPT09ICdvYmplY3QnICYmIHJlYnVpbGQpKSA6XG4gICAgICAgICAgICB0aGlzLnN5bmNDb25maWdUb1dvcmtlcih7IHNlcmlhbGl6ZV9mdW5jcyB9KTsgLy8gcmVidWlsZCgpIGFsc28gc3luY3MgY29uZmlnXG5cbiAgICAgICAgLy8gRmluaXNoIGJ5IHVwZGF0aW5nIGJvdW5kcyBhbmQgcmUtcmVuZGVyaW5nXG4gICAgICAgIHRoaXMudXBkYXRpbmctLTtcbiAgICAgICAgdGhpcy52aWV3LnVwZGF0ZUJvdW5kcygpO1xuICAgICAgICB0aGlzLnJlcXVlc3RSZWRyYXcoKTtcblxuICAgICAgICByZXR1cm4gZG9uZTtcbiAgICB9XG5cbiAgICAvLyBTZXJpYWxpemUgY29uZmlnIGFuZCBzZW5kIHRvIHdvcmtlclxuICAgIHN5bmNDb25maWdUb1dvcmtlcih7IHNlcmlhbGl6ZV9mdW5jcyA9IHRydWUgfSA9IHt9KSB7XG4gICAgICAgIC8vIFRlbGwgd29ya2VycyB3ZSdyZSBhYm91dCB0byByZWJ1aWxkIChzbyB0aGV5IGNhbiB1cGRhdGUgc3R5bGVzLCBldGMuKVxuICAgICAgICB0aGlzLmNvbmZpZ19zZXJpYWxpemVkID1cbiAgICAgICAgICAgIHNlcmlhbGl6ZV9mdW5jcyA/IFV0aWxzLnNlcmlhbGl6ZVdpdGhGdW5jdGlvbnModGhpcy5jb25maWcpIDogSlNPTi5zdHJpbmdpZnkodGhpcy5jb25maWcpO1xuICAgICAgICByZXR1cm4gV29ya2VyQnJva2VyLnBvc3RNZXNzYWdlKHRoaXMud29ya2VycywgJ3NlbGYudXBkYXRlQ29uZmlnJywge1xuICAgICAgICAgICAgY29uZmlnOiB0aGlzLmNvbmZpZ19zZXJpYWxpemVkLFxuICAgICAgICAgICAgZ2VuZXJhdGlvbjogdGhpcy5nZW5lcmF0aW9uLFxuICAgICAgICAgICAgaW50cm9zcGVjdGlvbjogdGhpcy5pbnRyb3NwZWN0aW9uXG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIExpc3RlbiB0byByZWxhdGVkIG9iamVjdHNcbiAgICBjcmVhdGVMaXN0ZW5lcnMgKCkge1xuICAgICAgICB0aGlzLmxpc3RlbmVycyA9IHt9O1xuXG4gICAgICAgIHRoaXMubGlzdGVuZXJzLnZpZXcgPSB7XG4gICAgICAgICAgICBtb3ZlOiAoKSA9PiB0aGlzLnRyaWdnZXIoJ21vdmUnKVxuICAgICAgICB9O1xuICAgICAgICB0aGlzLnZpZXcuc3Vic2NyaWJlKHRoaXMubGlzdGVuZXJzLnZpZXcpO1xuXG4gICAgICAgIHRoaXMubGlzdGVuZXJzLnRleHR1cmUgPSB7XG4gICAgICAgICAgICB1cGRhdGU6ICgpID0+IHRoaXMuZGlydHkgPSB0cnVlLFxuICAgICAgICAgICAgd2FybmluZzogKGRhdGEpID0+IHRoaXMudHJpZ2dlcignd2FybmluZycsIE9iamVjdC5hc3NpZ24oeyB0eXBlOiAndGV4dHVyZXMnIH0sIGRhdGEpKVxuICAgICAgICB9O1xuICAgICAgICBUZXh0dXJlLnN1YnNjcmliZSh0aGlzLmxpc3RlbmVycy50ZXh0dXJlKTtcblxuICAgICAgICB0aGlzLmxpc3RlbmVycy5zY2VuZV9sb2FkZXIgPSB7XG4gICAgICAgICAgICBlcnJvcjogKGRhdGEpID0+IHRoaXMudHJpZ2dlcignZXJyb3InLCBPYmplY3QuYXNzaWduKHsgdHlwZTogJ3NjZW5lJyB9LCBkYXRhKSlcbiAgICAgICAgfTtcbiAgICAgICAgU2NlbmVMb2FkZXIuc3Vic2NyaWJlKHRoaXMubGlzdGVuZXJzLnNjZW5lX2xvYWRlcik7XG4gICAgfVxuXG4gICAgZGVzdHJveUxpc3RlbmVycyAoKSB7XG4gICAgICAgIHRoaXMudW5zdWJzY3JpYmVBbGwoKTtcbiAgICAgICAgdGhpcy52aWV3LnVuc3Vic2NyaWJlKHRoaXMubGlzdGVuZXJzLnZpZXcpO1xuICAgICAgICBUZXh0dXJlLnVuc3Vic2NyaWJlKHRoaXMubGlzdGVuZXJzLnRleHR1cmUpO1xuICAgICAgICBTY2VuZUxvYWRlci51bnN1YnNjcmliZSh0aGlzLmxpc3RlbmVycy5zY2VuZV9sb2FkZXIpO1xuICAgICAgICB0aGlzLmxpc3RlbmVycyA9IG51bGw7XG4gICAgfVxuXG4gICAgcmVzZXRGZWF0dXJlU2VsZWN0aW9uKCkge1xuICAgICAgICBpZiAoIXRoaXMuc2VsZWN0aW9uKSB7XG4gICAgICAgICAgICB0aGlzLnNlbGVjdGlvbiA9IG5ldyBGZWF0dXJlU2VsZWN0aW9uKHRoaXMuZ2wsIHRoaXMud29ya2Vycyk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodGhpcy53b3JrZXJzKSB7XG4gICAgICAgICAgICBXb3JrZXJCcm9rZXIucG9zdE1lc3NhZ2UodGhpcy53b3JrZXJzLCAnc2VsZi5yZXNldEZlYXR1cmVTZWxlY3Rpb24nKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIEdldHMgdGhlIGN1cnJlbnQgZmVhdHVyZSBzZWxlY3Rpb24gbWFwIHNpemUgYWNyb3NzIGFsbCB3b3JrZXJzLiBSZXR1cm5zIGEgcHJvbWlzZS5cbiAgICBnZXRGZWF0dXJlU2VsZWN0aW9uTWFwU2l6ZSgpIHtcbiAgICAgICAgaWYgKHRoaXMuZmV0Y2hpbmdfc2VsZWN0aW9uX21hcCkge1xuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpOyAvLyByZXR1cm4gdW5kZWZpbmVkIGlmIGFscmVhZHkgcGVuZGluZ1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuZmV0Y2hpbmdfc2VsZWN0aW9uX21hcCA9IHRydWU7XG5cbiAgICAgICAgcmV0dXJuIFdvcmtlckJyb2tlci5wb3N0TWVzc2FnZSh0aGlzLndvcmtlcnMsICdzZWxmLmdldEZlYXR1cmVTZWxlY3Rpb25NYXBTaXplJylcbiAgICAgICAgICAgIC50aGVuKHNpemVzID0+IHtcbiAgICAgICAgICAgICAgICB0aGlzLmZldGNoaW5nX3NlbGVjdGlvbl9tYXAgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICByZXR1cm4gc2l6ZXMucmVkdWNlKChhLCBiKSA9PiBhICsgYik7XG4gICAgICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBSZXNldCBpbnRlcm5hbCBjbG9jaywgbW9zdGx5IHVzZWZ1bCBmb3IgY29uc2lzdGVudCBleHBlcmllbmNlIHdoZW4gY2hhbmdpbmcgc3R5bGVzL2RlYnVnZ2luZ1xuICAgIHJlc2V0VGltZSgpIHtcbiAgICAgICAgdGhpcy5zdGFydF90aW1lID0gK25ldyBEYXRlKCk7XG4gICAgfVxuXG4gICAgLy8gRmlyZXMgZXZlbnQgd2hlbiByZW5kZXJlZCB0aWxlIHNldCBvciBzdHlsZSBjaGFuZ2VzXG4gICAgdXBkYXRlVmlld0NvbXBsZXRlICgpIHtcbiAgICAgICAgaWYgKCh0aGlzLnJlbmRlcl9jb3VudF9jaGFuZ2VkIHx8IHRoaXMuZ2VuZXJhdGlvbiAhPT0gdGhpcy5sYXN0X2NvbXBsZXRlX2dlbmVyYXRpb24pICYmXG4gICAgICAgICAgICAhdGhpcy50aWxlX21hbmFnZXIuaXNMb2FkaW5nVmlzaWJsZVRpbGVzKCkpIHtcbiAgICAgICAgICAgIHRoaXMubGFzdF9jb21wbGV0ZV9nZW5lcmF0aW9uID0gdGhpcy5nZW5lcmF0aW9uO1xuICAgICAgICAgICAgdGhpcy50cmlnZ2VyKCd2aWV3X2NvbXBsZXRlJyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXNldFZpZXdDb21wbGV0ZSAoKSB7XG4gICAgICAgIHRoaXMubGFzdF9jb21wbGV0ZV9nZW5lcmF0aW9uID0gbnVsbDtcbiAgICB9XG5cbiAgICAvLyBUYWtlIGEgc2NyZWVuc2hvdFxuICAgIC8vIEFzeW5jaHJvbm91cyBiZWNhdXNlIHdlIGhhdmUgdG8gd2FpdCBmb3IgbmV4dCByZW5kZXIgdG8gY2FwdHVyZSBidWZmZXJcbiAgICAvLyBSZXR1cm5zIGEgcHJvbWlzZVxuICAgIHNjcmVlbnNob3QgKCkge1xuICAgICAgICB0aGlzLnJlcXVlc3RSZWRyYXcoKTtcbiAgICAgICAgcmV0dXJuIHRoaXMubWVkaWFfY2FwdHVyZS5zY3JlZW5zaG90KCk7XG4gICAgfVxuXG4gICAgc3RhcnRWaWRlb0NhcHR1cmUgKCkge1xuICAgICAgICB0aGlzLnJlcXVlc3RSZWRyYXcoKTtcbiAgICAgICAgcmV0dXJuIHRoaXMubWVkaWFfY2FwdHVyZS5zdGFydFZpZGVvQ2FwdHVyZSgpO1xuICAgIH1cblxuICAgIHN0b3BWaWRlb0NhcHR1cmUgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5tZWRpYV9jYXB0dXJlLnN0b3BWaWRlb0NhcHR1cmUoKTtcbiAgICB9XG5cblxuICAgIC8vIFN0YXRzL2RlYnVnL3Byb2ZpbGluZyBtZXRob2RzXG5cbiAgICAvLyBQcm9maWxlIGhlbHBlcnMsIGlzc3VlcyBhIHByb2ZpbGUgb24gbWFpbiB0aHJlYWQgJiBhbGwgd29ya2Vyc1xuICAgIF9wcm9maWxlKG5hbWUpIHtcbiAgICAgICAgY29uc29sZS5wcm9maWxlKGBtYWluIHRocmVhZDogJHtuYW1lfWApO1xuICAgICAgICBXb3JrZXJCcm9rZXIucG9zdE1lc3NhZ2UodGhpcy53b3JrZXJzLCAnc2VsZi5wcm9maWxlJywgbmFtZSk7XG4gICAgfVxuXG4gICAgX3Byb2ZpbGVFbmQobmFtZSkge1xuICAgICAgICBjb25zb2xlLnByb2ZpbGVFbmQoYG1haW4gdGhyZWFkOiAke25hbWV9YCk7XG4gICAgICAgIFdvcmtlckJyb2tlci5wb3N0TWVzc2FnZSh0aGlzLndvcmtlcnMsICdzZWxmLnByb2ZpbGVFbmQnLCBuYW1lKTtcbiAgICB9XG5cbiAgICAvLyBEZWJ1ZyBjb25maWcgYW5kIGZ1bmN0aW9uc1xuICAgIHNldHVwRGVidWcgKCkge1xuICAgICAgICBsZXQgc2NlbmUgPSB0aGlzO1xuICAgICAgICB0aGlzLmRlYnVnID0ge1xuICAgICAgICAgICAgLy8gUmVidWlsZCBnZW9tZXRyeSBhIGdpdmVuICMgb2YgdGltZXMgYW5kIHByaW50IGF2ZXJhZ2UsIG1pbiwgbWF4IHRpbWluZ3NcbiAgICAgICAgICAgIHRpbWVSZWJ1aWxkIChudW0gPSAxLCBvcHRpb25zID0ge30pIHtcbiAgICAgICAgICAgICAgICBsZXQgdGltZXMgPSBbXTtcbiAgICAgICAgICAgICAgICBsZXQgY3ljbGUgPSAoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBzdGFydCA9ICtuZXcgRGF0ZSgpO1xuICAgICAgICAgICAgICAgICAgICBzY2VuZS5yZWJ1aWxkKG9wdGlvbnMpLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGltZXMucHVzaCgrbmV3IERhdGUoKSAtIHN0YXJ0KTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRpbWVzLmxlbmd0aCA8IG51bSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN5Y2xlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgYXZnID0gfn4odGltZXMucmVkdWNlKChhLCBiKSA9PiBhICsgYikgLyB0aW1lcy5sZW5ndGgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvZygnaW5mbycsIGBQcm9maWxlZCByZWJ1aWxkICR7bnVtfSB0aW1lczogJHthdmd9IGF2ZyAoJHtNYXRoLm1pbiguLi50aW1lcyl9IG1pbiwgJHtNYXRoLm1heCguLi50aW1lcyl9IG1heClgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBjeWNsZSgpO1xuICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgLy8gUmV0dXJuIGdlb21ldHJ5IGNvdW50cyBvZiB2aXNpYmxlIHRpbGVzLCBncm91cGVkIGJ5IHN0eWxlIG5hbWVcbiAgICAgICAgICAgIGdlb21ldHJ5Q291bnRCeVN0eWxlICgpIHtcbiAgICAgICAgICAgICAgICBsZXQgY291bnRzID0ge307XG4gICAgICAgICAgICAgICAgc2NlbmUudGlsZV9tYW5hZ2VyLmdldFJlbmRlcmFibGVUaWxlcygpLmZvckVhY2godGlsZSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IHN0eWxlIGluIHRpbGUubWVzaGVzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb3VudHNbc3R5bGVdID0gY291bnRzW3N0eWxlXSB8fCAwO1xuICAgICAgICAgICAgICAgICAgICAgICAgY291bnRzW3N0eWxlXSArPSB0aWxlLm1lc2hlc1tzdHlsZV0uZ2VvbWV0cnlfY291bnQ7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICByZXR1cm4gY291bnRzO1xuICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgZ2VvbWV0cnlDb3VudEJ5QmFzZVN0eWxlICgpIHtcbiAgICAgICAgICAgICAgICBsZXQgc3R5bGVfY291bnRzID0gc2NlbmUuZGVidWcuZ2VvbWV0cnlDb3VudEJ5U3R5bGUoKTtcbiAgICAgICAgICAgICAgICBsZXQgY291bnRzID0ge307XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgc3R5bGUgaW4gc3R5bGVfY291bnRzKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBiYXNlID0gc2NlbmUuc3R5bGVzW3N0eWxlXS5iYXNlU3R5bGUoKTtcbiAgICAgICAgICAgICAgICAgICAgY291bnRzW2Jhc2VdID0gY291bnRzW2Jhc2VdIHx8IDA7XG4gICAgICAgICAgICAgICAgICAgIGNvdW50c1tiYXNlXSArPSBzdHlsZV9jb3VudHNbc3R5bGVdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICByZXR1cm4gY291bnRzO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuICAgIH1cblxufVxuXG5TY2VuZS5pZCA9IDA7ICAgICAgICAgLy8gdW5pcXVlIGlkIGZvciBhIHNjZW5lIGluc3RhbmNlXG5TY2VuZS5nZW5lcmF0aW9uID0gMDsgLy8gaWQgdGhhdCBpcyBpbmNyZW1lbnRlZCBlYWNoIHRpbWUgYSBzY2VuZSBjb25maWcgaXMgcmUtcGFyc2VkXG4iLCJpbXBvcnQgVXRpbHMgZnJvbSAnLi91dGlscy91dGlscyc7XG5pbXBvcnQgKiBhcyBVUkxzIGZyb20gJy4vdXRpbHMvdXJscyc7XG5cbmltcG9ydCBKU1ppcCBmcm9tICdqc3ppcCc7XG5pbXBvcnQgeWFtbCBmcm9tICdqcy15YW1sJztcblxuZXhwb3J0IGNsYXNzIFNjZW5lQnVuZGxlIHtcblxuICAgIGNvbnN0cnVjdG9yKHVybCwgcGF0aCwgcGFyZW50ID0gbnVsbCkge1xuICAgICAgICB0aGlzLnVybCA9IHVybDtcblxuICAgICAgICAvLyBJZiBhIGJhc2UgcGF0aCB3YXMgcHJvdmlkZWQsIHVzZSBpdCBmb3IgcmVzb2x2aW5nIGxvY2FsIGJ1bmRsZSByZXNvdXJjZXMgb25seSBpZlxuICAgICAgICAvLyB0aGUgYmFzZSBwYXRoIGlzIGFic29sdXRlLCBvciB0aGlzIGJ1bmRsZSdzIHBhdGggaXMgcmVsYXRpdmVcbiAgICAgICAgaWYgKHBhdGggJiYgKCFVUkxzLmlzUmVsYXRpdmVVUkwocGF0aCkgfHwgVVJMcy5pc1JlbGF0aXZlVVJMKHRoaXMudXJsKSkpIHtcbiAgICAgICAgICAgIHRoaXMucGF0aCA9IHBhdGg7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnBhdGggPSBVUkxzLnBhdGhGb3JVUkwodGhpcy51cmwpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5wYXRoX2Zvcl9wYXJlbnQgPSBwYXRoIHx8IHRoaXMucGF0aDsgLy8gZm9yIHJlc29sdmluZyBwYXRocyByZWxhdGl2ZSB0byBhIHBhcmVudCBidW5kbGVcbiAgICAgICAgdGhpcy5wYXJlbnQgPSBwYXJlbnQ7XG5cbiAgICAgICAgLy8gQW4gYW5jZXN0b3IgYnVuZGxlIG1heSBiZSBhIGNvbnRhaW5lciAoZS5nLiB6aXAgZmlsZSkgdGhhdCBuZWVkcyB0byByZXNvbHZlIHJlbGF0aXZlIHBhdGhzXG4gICAgICAgIC8vIGZvciBhbnkgc2NlbmVzIGl0IGNvbnRhaW5zLCBlLmcuIGByb290LnppcGAgaGFzIGEgYHJvb3QueWFtbGAgdGhhdCBpbmNsdWRlcyBhIGBmb2xkZXIvY2hpbGQueWFtbGA6XG4gICAgICAgIC8vIHJlc291cmNlcyB3aXRoaW4gYGNoaWxkLnlhbWxgIG11c3QgYmUgcmVzb2x2ZWQgdGhyb3VnaCB0aGUgYnVuZGxlIGZvciBgcm9vdC56aXBgXG4gICAgICAgIHRoaXMuY29udGFpbmVyID0gbnVsbDtcbiAgICAgICAgaWYgKHRoaXMucGFyZW50KSB7XG4gICAgICAgICAgICBpZiAodGhpcy5wYXJlbnQuY29udGFpbmVyKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jb250YWluZXIgPSB0aGlzLnBhcmVudC5jb250YWluZXI7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmICh0aGlzLnBhcmVudC5pc0NvbnRhaW5lcigpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jb250YWluZXIgPSB0aGlzLnBhcmVudDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIGxvYWQoKSB7XG4gICAgICAgIHJldHVybiBsb2FkUmVzb3VyY2UodGhpcy51cmwpO1xuICAgIH1cblxuICAgIC8vIEluZm8gZm9yIHJldHJpZXZpbmcgYSBzcGVjaWZpYyByZXNvdXJjZSBmcm9tIHRoaXMgYnVuZGxlXG4gICAgLy8gdXJsOiBmdWxseSBxdWFsaWZpZWQgVVJMIHRvIHJldHJpZXZlIHRoZSBjb250ZW50IG9mIHRoZSByZXNvdXJjZSAoZS5nLiB6aXBzIHdpbGwgdHJhbnNmb3JtIHRoaXMgdG8gYmxvYiBVUkwpXG4gICAgLy8gcGF0aDogb3JpZ2luYWwgcGF0aCBvZiB0aGUgcmVzb3VyY2Ugd2l0aGluIHRoZSBidW5kbGUgKGZvciByZXNvbHZpbmcgcGF0aHMgdXAgdGhlIGJ1bmRsZSB0cmVlKVxuICAgIC8vIHR5cGU6IGZpbGUgZXh0ZW5zaW9uICh1c2VkIGZvciBkZXRlcm1pbmluZyBidW5kbGUgdHlwZSwgYHlhbWxgIG9yIGB6aXBgKVxuICAgIHJlc291cmNlRm9yKHVybCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgdXJsOiB0aGlzLnVybEZvcih1cmwpLFxuICAgICAgICAgICAgcGF0aDogdGhpcy5wYXRoRm9yKHVybCksXG4gICAgICAgICAgICB0eXBlOiB0aGlzLnR5cGVGb3IodXJsKVxuICAgICAgICB9O1xuICAgIH1cblxuICAgIHVybEZvcih1cmwpIHtcbiAgICAgICAgaWYgKGlzR2xvYmFsKHVybCkpIHtcbiAgICAgICAgICAgIHJldHVybiB1cmw7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoVVJMcy5pc1JlbGF0aXZlVVJMKHVybCkgJiYgdGhpcy5jb250YWluZXIpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnBhcmVudC51cmxGb3IodGhpcy5wYXRoX2Zvcl9wYXJlbnQgKyB1cmwpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBVUkxzLmFkZEJhc2VVUkwodXJsLCB0aGlzLnBhdGgpO1xuICAgIH1cblxuICAgIHBhdGhGb3IodXJsKSB7XG4gICAgICAgIHJldHVybiBVUkxzLnBhdGhGb3JVUkwodXJsKTtcbiAgICB9XG5cbiAgICB0eXBlRm9yKHVybCkge1xuICAgICAgICByZXR1cm4gVVJMcy5leHRlbnNpb25Gb3JVUkwodXJsKTtcbiAgICB9XG5cbiAgICBpc0NvbnRhaW5lcigpIHtcbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxufVxuXG5leHBvcnQgY2xhc3MgWmlwU2NlbmVCdW5kbGUgZXh0ZW5kcyBTY2VuZUJ1bmRsZSB7XG5cbiAgICBjb25zdHJ1Y3Rvcih1cmwsIHBhdGgsIHBhcmVudCkge1xuICAgICAgICBzdXBlcih1cmwsIHBhdGgsIHBhcmVudCk7XG4gICAgICAgIHRoaXMuemlwID0gbnVsbDtcbiAgICAgICAgdGhpcy5maWxlcyA9IHt9O1xuICAgICAgICB0aGlzLnJvb3QgPSBudWxsO1xuICAgICAgICB0aGlzLnBhdGggPSAnJztcbiAgICB9XG5cbiAgICBpc0NvbnRhaW5lcigpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgbG9hZCgpIHtcbiAgICAgICAgdGhpcy56aXAgPSBuZXcgSlNaaXAoKTtcblxuICAgICAgICBpZiAodHlwZW9mIHRoaXMudXJsID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgcmV0dXJuIFV0aWxzLmlvKHRoaXMudXJsLCA2MDAwMCwgJ2FycmF5YnVmZmVyJylcbiAgICAgICAgICAgICAgICAudGhlbihib2R5ID0+IHRoaXMuemlwLmxvYWRBc3luYyhib2R5KSlcbiAgICAgICAgICAgICAgICAudGhlbigoKSA9PiB0aGlzLnBhcnNlWmlwRmlsZXMoKSlcbiAgICAgICAgICAgICAgICAudGhlbigoKSA9PiB0aGlzLmxvYWRSb290KCkpXG4gICAgICAgICAgICAgICAgLmNhdGNoKGUgPT4gUHJvbWlzZS5yZWplY3QoZSkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh0aGlzKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHVybEZvcih1cmwpIHtcbiAgICAgICAgaWYgKGlzR2xvYmFsKHVybCkpIHtcbiAgICAgICAgICAgIHJldHVybiB1cmw7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoVVJMcy5pc1JlbGF0aXZlVVJMKHVybCkpIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLnVybEZvclppcEZpbGUoVVJMcy5mbGF0dGVuUmVsYXRpdmVVUkwodXJsKSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHN1cGVyLnVybEZvcih1cmwpO1xuICAgIH1cblxuICAgIHR5cGVGb3IodXJsKSB7XG4gICAgICAgIGlmIChVUkxzLmlzUmVsYXRpdmVVUkwodXJsKSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMudHlwZUZvclppcEZpbGUodXJsKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gc3VwZXIudHlwZUZvcih1cmwpO1xuICAgIH1cblxuICAgIGxvYWRSb290KCkge1xuICAgICAgICByZXR1cm4gdGhpcy5maW5kUm9vdCgpXG4gICAgICAgICAgICAudGhlbigoKSA9PiBsb2FkUmVzb3VyY2UodGhpcy51cmxGb3JaaXBGaWxlKHRoaXMucm9vdCkpKTtcbiAgICB9XG5cbiAgICBmaW5kUm9vdCgpIHtcbiAgICAgICAgLy8gVGhlcmUgbXVzdCBiZSBhIHNpbmdsZSBZQU1MIGZpbGUgYXQgdGhlIHRvcCBsZXZlbCBvZiB0aGUgemlwXG4gICAgICAgIGNvbnN0IHlhbWxzID0gT2JqZWN0LmtleXModGhpcy5maWxlcylcbiAgICAgICAgICAgIC5maWx0ZXIocGF0aCA9PiB0aGlzLmZpbGVzW3BhdGhdLmRlcHRoID09PSAwKVxuICAgICAgICAgICAgLmZpbHRlcihwYXRoID0+IFVSTHMuZXh0ZW5zaW9uRm9yVVJMKHBhdGgpID09PSAneWFtbCcpO1xuXG4gICAgICAgIGlmICh5YW1scy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICAgIHRoaXMucm9vdCA9IHlhbWxzWzBdO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gTm8gcm9vdCBmb3VuZFxuICAgICAgICBpZiAoIXRoaXMucm9vdCkge1xuICAgICAgICAgICAgbGV0IG1zZyA9IGBDb3VsZCBub3QgZmluZCByb290IHNjZW5lIGZvciBidW5kbGUgJyR7dGhpcy51cmx9JzogYDtcbiAgICAgICAgICAgIG1zZyArPSBgVGhlIHppcCBhcmNoaXZlJ3Mgcm9vdCBsZXZlbCBtdXN0IGNvbnRhaW4gYSBzaW5nbGUgc2NlbmUgZmlsZSB3aXRoIHRoZSAnLnlhbWwnIGV4dGVuc2lvbi4gYDtcbiAgICAgICAgICAgIGlmICh5YW1scy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgbXNnICs9IGBGb3VuZCBtdWx0aXBsZSBZQU1MIGZpbGVzIGF0IHRoZSByb290IGxldmVsOiAke3lhbWxzLm1hcChyID0+ICdcXCcnICsgciArICdcXCcnICkuam9pbignLCAnKX0uYDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIG1zZyArPSBgRm91bmQgTk8gWUFNTCBmaWxlcyBhdCB0aGUgcm9vdCBsZXZlbC5gO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KEVycm9yKG1zZykpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbiAgICB9XG5cbiAgICBwYXJzZVppcEZpbGVzKCkge1xuICAgICAgICBsZXQgcGF0aHMgPSBbXTtcbiAgICAgICAgbGV0IHF1ZXVlID0gW107XG4gICAgICAgIHRoaXMuemlwLmZvckVhY2goKHBhdGgsIGZpbGUpID0+IHtcbiAgICAgICAgICAgIGlmICghZmlsZS5kaXIpIHtcbiAgICAgICAgICAgICAgICBwYXRocy5wdXNoKHBhdGgpO1xuICAgICAgICAgICAgICAgIHF1ZXVlLnB1c2goZmlsZS5hc3luYygnYXJyYXlidWZmZXInKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHJldHVybiBQcm9taXNlLmFsbChxdWV1ZSkudGhlbihkYXRhID0+IHtcbiAgICAgICAgICAgIGZvciAobGV0IGk9MDsgaSA8IGRhdGEubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBsZXQgcGF0aCA9IHBhdGhzW2ldO1xuICAgICAgICAgICAgICAgIGxldCBkZXB0aCA9IHBhdGguc3BsaXQoJy8nKS5sZW5ndGggLSAxO1xuICAgICAgICAgICAgICAgIHRoaXMuZmlsZXNbcGF0aF0gPSB7XG4gICAgICAgICAgICAgICAgICAgIGRhdGE6IGRhdGFbaV0sXG4gICAgICAgICAgICAgICAgICAgIHR5cGU6IFVSTHMuZXh0ZW5zaW9uRm9yVVJMKHBhdGgpLFxuICAgICAgICAgICAgICAgICAgICBkZXB0aFxuICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHVybEZvclppcEZpbGUoZmlsZSkge1xuICAgICAgICBpZiAodGhpcy5maWxlc1tmaWxlXSkge1xuICAgICAgICAgICAgaWYgKCF0aGlzLmZpbGVzW2ZpbGVdLnVybCkge1xuICAgICAgICAgICAgICAgIHRoaXMuZmlsZXNbZmlsZV0udXJsID0gVVJMcy5jcmVhdGVPYmplY3RVUkwobmV3IEJsb2IoW3RoaXMuZmlsZXNbZmlsZV0uZGF0YV0pKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZmlsZXNbZmlsZV0udXJsO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgdHlwZUZvclppcEZpbGUoZmlsZSkge1xuICAgICAgICByZXR1cm4gdGhpcy5maWxlc1tmaWxlXSAmJiB0aGlzLmZpbGVzW2ZpbGVdLnR5cGU7XG4gICAgfVxuXG59XG5cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVTY2VuZUJ1bmRsZSh1cmwsIHBhdGgsIHBhcmVudCwgdHlwZSA9IG51bGwpIHtcbiAgICBpZiAodHlwZSA9PT0gJ3ppcCcgfHwgKHR5cGVvZiB1cmwgPT09ICdzdHJpbmcnICYmIFVSTHMuZXh0ZW5zaW9uRm9yVVJMKHVybCkgPT09ICd6aXAnKSkge1xuICAgICAgICByZXR1cm4gbmV3IFppcFNjZW5lQnVuZGxlKHVybCwgcGF0aCwgcGFyZW50KTtcbiAgICB9XG4gICAgcmV0dXJuIG5ldyBTY2VuZUJ1bmRsZSh1cmwsIHBhdGgsIHBhcmVudCk7XG59XG5cbi8vIFJlZmVyZW5jZXMgYSBnbG9iYWwgcHJvcGVydHk/XG5leHBvcnQgZnVuY3Rpb24gaXNHbG9iYWwgKHZhbCkge1xuICAgIGlmICh2YWwgJiYgdmFsLnNsaWNlKDAsIDcpID09PSAnZ2xvYmFsLicpIHtcbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuICAgIHJldHVybiBmYWxzZTtcbn1cblxuZnVuY3Rpb24gcGFyc2VSZXNvdXJjZSAoYm9keSkge1xuICAgIHZhciBkYXRhO1xuICAgIHRyeSB7XG4gICAgICAgIC8vIGpzeWFtbCAnanNvbicgb3B0aW9uIGFsbG93cyBkdXBsaWNhdGUga2V5c1xuICAgICAgICAvLyBLZWVwaW5nIHRoaXMgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LCBidXQgc2hvdWxkIGNvbnNpZGVyIG1pZ3JhdGluZyB0byByZXF1aXJpbmdcbiAgICAgICAgLy8gdW5pcXVlIGtleXMsIGFzIHRoaXMgaXMgWUFNTCBzcGVjLiBCdXQgVGFuZ3JhbSBFUyBjdXJyZW50bHkgYWNjZXB0cyBkdXBlIGtleXMgYXMgd2VsbCxcbiAgICAgICAgLy8gc28gc2hvdWxkIGNvbnNpZGVyIGhvdyBiZXN0IHRvIHVuaWZ5LlxuICAgICAgICBkYXRhID0geWFtbC5zYWZlTG9hZChib2R5LCB7IGpzb246IHRydWUgfSk7XG4gICAgfSBjYXRjaCAoZSkge1xuICAgICAgICB0aHJvdyBlO1xuICAgIH1cbiAgICByZXR1cm4gZGF0YTtcbn1cblxuZnVuY3Rpb24gbG9hZFJlc291cmNlIChzb3VyY2UpIHtcbiAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICBpZiAodHlwZW9mIHNvdXJjZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIFV0aWxzLmlvKHNvdXJjZSkudGhlbigoYm9keSkgPT4ge1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBkYXRhID0gcGFyc2VSZXNvdXJjZShib2R5KTtcbiAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShkYXRhKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgY2F0Y2goZSkge1xuICAgICAgICAgICAgICAgICAgICByZWplY3QoZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSwgcmVqZWN0KTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJlc29sdmUoc291cmNlKTtcbiAgICAgICAgfVxuICAgIH0pO1xufVxuIiwiaW1wb3J0IGxvZyBmcm9tICcuL3V0aWxzL2xvZyc7XG5pbXBvcnQgR0xTTCBmcm9tICcuL2dsL2dsc2wnO1xuaW1wb3J0ICogYXMgVVJMcyBmcm9tICcuL3V0aWxzL3VybHMnO1xuaW1wb3J0IG1lcmdlT2JqZWN0cyBmcm9tICcuL3V0aWxzL21lcmdlJztcbmltcG9ydCBzdWJzY3JpYmVNaXhpbiBmcm9tICcuL3V0aWxzL3N1YnNjcmliZSc7XG5pbXBvcnQge2NyZWF0ZVNjZW5lQnVuZGxlLCBpc0dsb2JhbH0gZnJvbSAnLi9zY2VuZV9idW5kbGUnO1xuXG52YXIgU2NlbmVMb2FkZXI7XG5cbmV4cG9ydCBkZWZhdWx0IFNjZW5lTG9hZGVyID0ge1xuXG4gICAgLy8gTG9hZCBzY2VuZXMgZGVmaW5pdGlvbnMgZnJvbSBVUkwgJiBwcm9wcm9jZXNzXG4gICAgbG9hZFNjZW5lKHVybCwgcGF0aCA9IG51bGwpIHtcbiAgICAgICAgbGV0IGVycm9ycyA9IFtdO1xuICAgICAgICByZXR1cm4gdGhpcy5sb2FkU2NlbmVSZWN1cnNpdmUoeyB1cmwsIHBhdGggfSwgbnVsbCwgZXJyb3JzKS5cbiAgICAgICAgICAgIHRoZW4ocmVzdWx0ID0+IHRoaXMuZmluYWxpemUocmVzdWx0KSkuXG4gICAgICAgICAgICB0aGVuKCh7IGNvbmZpZywgYnVuZGxlIH0pID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoIWNvbmZpZykge1xuICAgICAgICAgICAgICAgICAgICAvLyByb290IHNjZW5lIGZhaWxlZCB0byBsb2FkLCByZWplY3Qgd2l0aCBmaXJzdCBlcnJvclxuICAgICAgICAgICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZWplY3QoZXJyb3JzWzBdKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoZXJyb3JzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gc2NlbmUgbG9hZGVkLCBidXQgc29tZSBpbXBvcnRzIGhhZCBlcnJvcnNcbiAgICAgICAgICAgICAgICAgICAgZXJyb3JzLmZvckVhY2goZXJyb3IgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IG1lc3NhZ2UgPSBgRmFpbGVkIHRvIGltcG9ydCBzY2VuZTogJHtlcnJvci51cmx9YDtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxvZygnZXJyb3InLCBtZXNzYWdlLCBlcnJvcik7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnRyaWdnZXIoJ2Vycm9yJywgeyB0eXBlOiAnc2NlbmVfaW1wb3J0JywgbWVzc2FnZSwgZXJyb3IsIHVybDogZXJyb3IudXJsIH0pO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgcmV0dXJuIHsgY29uZmlnLCBidW5kbGUgfTtcbiAgICAgICAgICAgIH0pO1xuICAgIH0sXG5cbiAgICAvLyBMb2FkcyBzY2VuZSBmaWxlcyBmcm9tIFVSTCwgcmVjdXJzaXZlbHkgbG9hZGluZyAnaW1wb3J0JyBzY2VuZXNcbiAgICAvLyBPcHRpb25hbCAqaW5pdGlhbCogcGF0aCBvbmx5ICh3b24ndCBiZSBwYXNzZWQgdG8gcmVjdXJzaXZlICdpbXBvcnQnIGNhbGxzKVxuICAgIC8vIFVzZWZ1bCBmb3IgbG9hZGluZyByZXNvdXJjZXMgaW4gYmFzZSBzY2VuZSBmaWxlIGZyb20gYSBzZXBhcmF0ZSBsb2NhdGlvblxuICAgIC8vIChlLmcuIGluIFRhbmdyYW0gUGxheSwgd2hlbiBtb2RpZmllZCBsb2NhbCBzY2VuZSBzaG91bGQgc3RpbGwgcmVmZXIgdG8gb3JpZ2luYWwgcmVzb3VyY2UgVVJMcylcbiAgICBsb2FkU2NlbmVSZWN1cnNpdmUoeyB1cmwsIHBhdGgsIHR5cGUgfSwgcGFyZW50LCBlcnJvcnMgPSBbXSkge1xuICAgICAgICBpZiAoIXVybCkge1xuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh7fSk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgYnVuZGxlID0gY3JlYXRlU2NlbmVCdW5kbGUodXJsLCBwYXRoLCBwYXJlbnQsIHR5cGUpO1xuXG4gICAgICAgIHJldHVybiBidW5kbGUubG9hZCgpLnRoZW4oY29uZmlnID0+IHtcbiAgICAgICAgICAgIGlmIChjb25maWcuaW1wb3J0ID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5ub3JtYWxpemUoY29uZmlnLCBidW5kbGUpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBhY2NlcHQgc2luZ2xlIGVudHJ5IG9yIGFycmF5XG4gICAgICAgICAgICBpZiAoIUFycmF5LmlzQXJyYXkoY29uZmlnLmltcG9ydCkpIHtcbiAgICAgICAgICAgICAgICBjb25maWcuaW1wb3J0ID0gW2NvbmZpZy5pbXBvcnRdOyAvLyBjb252ZXJ0IHRvIGFycmF5XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIENvbGxlY3QgVVJMcyBvZiBzY2VuZXMgdG8gaW1wb3J0XG4gICAgICAgICAgICBsZXQgaW1wb3J0cyA9IFtdO1xuICAgICAgICAgICAgY29uZmlnLmltcG9ydC5mb3JFYWNoKHVybCA9PiB7XG4gICAgICAgICAgICAgICAgLy8gQ29udmVydCBzY2VuZSBvYmplY3RzIHRvIFVSTHNcbiAgICAgICAgICAgICAgICBpZiAodHlwZW9mIHVybCA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgICAgICAgICAgICAgdXJsID0gVVJMcy5jcmVhdGVPYmplY3RVUkwobmV3IEJsb2IoW0pTT04uc3RyaW5naWZ5KHVybCldKSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaW1wb3J0cy5wdXNoKGJ1bmRsZS5yZXNvdXJjZUZvcih1cmwpKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgZGVsZXRlIGNvbmZpZy5pbXBvcnQ7IC8vIGRvbid0IHdhbnQgdG8gbWVyZ2UgdGhpcyBwcm9wZXJ0eVxuXG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5cbiAgICAgICAgICAgICAgICBhbGwoaW1wb3J0cy5tYXAocmVzb3VyY2UgPT4gdGhpcy5sb2FkU2NlbmVSZWN1cnNpdmUocmVzb3VyY2UsIGJ1bmRsZSwgZXJyb3JzKSkpLlxuICAgICAgICAgICAgICAgICAgICB0aGVuKHJlc3VsdHMgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGNvbmZpZ3MgPSByZXN1bHRzLm1hcChyID0+IHIuY29uZmlnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZyA9IG1lcmdlT2JqZWN0cyh7fSwgLi4uY29uZmlncywgY29uZmlnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0aGlzLm5vcm1hbGl6ZShjb25maWcsIGJ1bmRsZSk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICB9KS5jYXRjaChlcnJvciA9PiB7XG4gICAgICAgICAgICAvLyBDb2xsZWN0IHNjZW5lIGxvYWQgZXJyb3JzIGFzIHdlIGdvXG4gICAgICAgICAgICBlcnJvci51cmwgPSB1cmw7XG4gICAgICAgICAgICBlcnJvcnMucHVzaChlcnJvcik7XG4gICAgICAgICAgICByZXR1cm4ge307XG4gICAgICAgIH0pO1xuICAgIH0sXG5cbiAgICAvLyBOb3JtYWxpemUgcHJvcGVydGllcyB0aGF0IHNob3VsZCBiZSBhZGp1c3Qgd2l0aGluIGVhY2ggbG9jYWwgc2NlbmUgZmlsZSAodXN1YWxseSBieSBwYXRoKVxuICAgIG5vcm1hbGl6ZShjb25maWcsIGJ1bmRsZSkge1xuICAgICAgICB0aGlzLm5vcm1hbGl6ZURhdGFTb3VyY2VzKGNvbmZpZywgYnVuZGxlKTtcbiAgICAgICAgdGhpcy5ub3JtYWxpemVGb250cyhjb25maWcsIGJ1bmRsZSk7XG4gICAgICAgIHRoaXMubm9ybWFsaXplVGV4dHVyZXMoY29uZmlnLCBidW5kbGUpO1xuICAgICAgICByZXR1cm4geyBjb25maWcsIGJ1bmRsZSB9O1xuICAgIH0sXG5cbiAgICAvLyBFeHBhbmQgcGF0aHMgZm9yIGRhdGEgc291cmNlXG4gICAgbm9ybWFsaXplRGF0YVNvdXJjZXMoY29uZmlnLCBidW5kbGUpIHtcbiAgICAgICAgY29uZmlnLnNvdXJjZXMgPSBjb25maWcuc291cmNlcyB8fCB7fTtcblxuICAgICAgICBmb3IgKGxldCBzbiBpbiBjb25maWcuc291cmNlcykge1xuICAgICAgICAgICAgdGhpcy5ub3JtYWxpemVEYXRhU291cmNlKGNvbmZpZy5zb3VyY2VzW3NuXSwgYnVuZGxlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBjb25maWc7XG4gICAgfSxcblxuICAgIG5vcm1hbGl6ZURhdGFTb3VyY2Uoc291cmNlLCBidW5kbGUpIHtcbiAgICAgICAgc291cmNlLnVybCA9IGJ1bmRsZS51cmxGb3Ioc291cmNlLnVybCk7XG5cbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoc291cmNlLnNjcmlwdHMpKSB7XG4gICAgICAgICAgICBzb3VyY2Uuc2NyaXB0cyA9IHNvdXJjZS5zY3JpcHRzLm1hcCh1cmwgPT4gYnVuZGxlLnVybEZvcih1cmwpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBzb3VyY2U7XG4gICAgfSxcblxuICAgIC8vIEV4cGFuZCBwYXRocyBmb3IgZm9udHNcbiAgICBub3JtYWxpemVGb250cyhjb25maWcsIGJ1bmRsZSkge1xuICAgICAgICBjb25maWcuZm9udHMgPSBjb25maWcuZm9udHMgfHwge307XG5cbiAgICAgICAgZm9yIChsZXQgZmFtaWx5IGluIGNvbmZpZy5mb250cykge1xuICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoY29uZmlnLmZvbnRzW2ZhbWlseV0pKSB7XG4gICAgICAgICAgICAgICAgY29uZmlnLmZvbnRzW2ZhbWlseV0uZm9yRWFjaChmYWNlID0+IHtcbiAgICAgICAgICAgICAgICAgICAgZmFjZS51cmwgPSBmYWNlLnVybCAmJiBidW5kbGUudXJsRm9yKGZhY2UudXJsKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGxldCBmYWNlID0gY29uZmlnLmZvbnRzW2ZhbWlseV07XG4gICAgICAgICAgICAgICAgZmFjZS51cmwgPSBmYWNlLnVybCAmJiBidW5kbGUudXJsRm9yKGZhY2UudXJsKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBjb25maWc7XG4gICAgfSxcblxuICAgIC8vIEV4cGFuZCBwYXRocyBhbmQgY2VudHJhbGl6ZSB0ZXh0dXJlIGRlZmluaXRpb25zIGZvciBhIHNjZW5lIG9iamVjdFxuICAgIG5vcm1hbGl6ZVRleHR1cmVzKGNvbmZpZywgYnVuZGxlKSB7XG4gICAgICAgIGNvbmZpZy50ZXh0dXJlcyA9IGNvbmZpZy50ZXh0dXJlcyB8fCB7fTtcblxuICAgICAgICAvLyBBZGQgY3VycmVudCBzY2VuZSdzIGJhc2UgcGF0aCB0byBnbG9iYWxseSBkZWZpbmVkIHRleHR1cmVzXG4gICAgICAgIC8vIE9ubHkgYWRkcyBwYXRoIGZvciB0ZXh0dXJlcyB3aXRoIHJlbGF0aXZlIFVSTHMsIHNvIHRleHR1cmVzIGluIGltcG9ydGVkIHNjZW5lcyBnZXQgdGhlIGJhc2VcbiAgICAgICAgLy8gcGF0aCBvZiB0aGVpciBpbW1lZGlhdGUgc2NlbmUgZmlsZVxuICAgICAgICBpZiAoY29uZmlnLnRleHR1cmVzKSB7XG4gICAgICAgICAgICBmb3IgKGxldCB0biBpbiBjb25maWcudGV4dHVyZXMpIHtcbiAgICAgICAgICAgICAgICBsZXQgdGV4dHVyZSA9IGNvbmZpZy50ZXh0dXJlc1t0bl07XG4gICAgICAgICAgICAgICAgaWYgKHRleHR1cmUudXJsKSB7XG4gICAgICAgICAgICAgICAgICAgIHRleHR1cmUudXJsID0gYnVuZGxlLnVybEZvcih0ZXh0dXJlLnVybCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gUmVzb2x2ZSBVUkxzIGZvciBpbmxpbmUgdGV4dHVyZXNcbiAgICAgICAgaWYgKGNvbmZpZy5zdHlsZXMpIHtcbiAgICAgICAgICAgIGZvciAobGV0IHNuIGluIGNvbmZpZy5zdHlsZXMpIHtcbiAgICAgICAgICAgICAgICBsZXQgc3R5bGUgPSBjb25maWcuc3R5bGVzW3NuXTtcblxuICAgICAgICAgICAgICAgIC8vIFN0eWxlIGB0ZXh0dXJlYFxuICAgICAgICAgICAgICAgIGxldCB0ZXggPSBzdHlsZS50ZXh0dXJlO1xuICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgdGV4ID09PSAnc3RyaW5nJyAmJiAhY29uZmlnLnRleHR1cmVzW3RleF0gJiYgIWlzR2xvYmFsKHRleCkpIHtcbiAgICAgICAgICAgICAgICAgICAgc3R5bGUudGV4dHVyZSA9IGJ1bmRsZS51cmxGb3IodGV4KTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyBNYXRlcmlhbFxuICAgICAgICAgICAgICAgIGlmIChzdHlsZS5tYXRlcmlhbCkge1xuICAgICAgICAgICAgICAgICAgICBbJ2VtaXNzaW9uJywgJ2FtYmllbnQnLCAnZGlmZnVzZScsICdzcGVjdWxhcicsICdub3JtYWwnXS5mb3JFYWNoKHByb3AgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gTWF0ZXJpYWwgcHJvcGVydHkgaGFzIGEgdGV4dHVyZVxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHRleCA9IHN0eWxlLm1hdGVyaWFsW3Byb3BdICE9IG51bGwgJiYgc3R5bGUubWF0ZXJpYWxbcHJvcF0udGV4dHVyZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgdGV4ID09PSAnc3RyaW5nJyAmJiAhY29uZmlnLnRleHR1cmVzW3RleF0gJiYgIWlzR2xvYmFsKHRleCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHlsZS5tYXRlcmlhbFtwcm9wXS50ZXh0dXJlID0gYnVuZGxlLnVybEZvcih0ZXgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyBTaGFkZXIgdW5pZm9ybXNcbiAgICAgICAgICAgICAgICBpZiAoc3R5bGUuc2hhZGVycyAmJiBzdHlsZS5zaGFkZXJzLnVuaWZvcm1zKSB7XG4gICAgICAgICAgICAgICAgICAgIEdMU0wucGFyc2VVbmlmb3JtcyhzdHlsZS5zaGFkZXJzLnVuaWZvcm1zKS5mb3JFYWNoKCh7dHlwZSwgdmFsdWUsIGtleSwgdW5pZm9ybXN9KSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBUZXh0dXJlIGJ5IFVSTCAoc3RyaW5nLW5hbWVkIHRleHR1cmUgbm90IHJlZmVyZW5jaW5nIGV4aXN0aW5nIHRleHR1cmUgZGVmaW5pdGlvbilcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlID09PSAnc2FtcGxlcjJEJyAmJiB0eXBlb2YgdmFsdWUgPT09ICdzdHJpbmcnICYmICFjb25maWcudGV4dHVyZXNbdmFsdWVdICYmICFpc0dsb2JhbCh2YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmlmb3Jtc1trZXldID0gYnVuZGxlLnVybEZvcih2YWx1ZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBjb25maWc7XG4gICAgfSxcblxuICAgIC8vIFN1YnN0aXR1dGVzIGdsb2JhbCBzY2VuZSBwcm9wZXJ0aWVzICh0aG9zZSBkZWZpbmVkIGluIHRoZSBgY29uZmlnLmdsb2JhbGAgb2JqZWN0KSBmb3IgYW55IHN0eWxlIHZhbHVlc1xuICAgIC8vIG9mIHRoZSBmb3JtIGBnbG9iYWwuYCwgZm9yIGV4YW1wbGUgYGNvbG9yOiBnbG9iYWwucGFya19jb2xvcmAgd291bGQgYmUgcmVwbGFjZWQgd2l0aCB0aGUgdmFsdWUgKGlmIGFueSlcbiAgICAvLyBkZWZpbmVkIGZvciB0aGUgYHBhcmtfY29sb3JgIHByb3BlcnR5IGluIGBjb25maWcuZ2xvYmFsLnBhcmtfY29sb3JgLlxuICAgIGFwcGx5R2xvYmFsUHJvcGVydGllcyhjb25maWcsIGFwcGxpZWQpIHtcbiAgICAgICAgaWYgKCFjb25maWcuZ2xvYmFsIHx8IE9iamVjdC5rZXlzKGNvbmZpZy5nbG9iYWwpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgcmV0dXJuIGNvbmZpZzsgLy8gbm8gZ2xvYmFsIHByb3BlcnRpZXMgdG8gdHJhbnNmb3JtXG4gICAgICAgIH1cblxuICAgICAgICAvLyBQYXJzZSBwcm9wZXJ0aWVzIGZyb20gZ2xvYmFsc1xuICAgICAgICBjb25zdCBzZXBhcmF0b3IgPSAnOic7XG4gICAgICAgIGNvbnN0IHByb3BzID0gZmxhdHRlblByb3BlcnRpZXMoY29uZmlnLmdsb2JhbCwgc2VwYXJhdG9yKTtcblxuICAgICAgICAvLyBSZS1hcHBseSBwcmV2aW91c2x5IGFwcGxpZWQgcHJvcGVydGllc1xuICAgICAgICAvLyBOQjogYSBjdXJyZW50IHNob3J0Y29taW5nIGhlcmUgaXMgdGhhdCB5b3UgY2Fubm90IFwidW4tbGlua1wiIGEgdGFyZ2V0IHByb3BlcnR5IGZyb20gYSBnbG9iYWxcbiAgICAgICAgLy8gYXQgcnVuLXRpbWUuIE9uY2UgYSBnbG9iYWwgcHJvcGVydHkgc3Vic3RpdHV0aW9uIGhhcyBiZWVuIHJlY29yZGVyZCwgaXQgd2lsbCBhbHdheXMgYmUgcmUtYXBwbGllZFxuICAgICAgICAvLyBvbiBzdWJzZXF1ZW50IHNjZW5lIHVwZGF0ZXMsIGV2ZW4gaWYgdGhlIHRhcmdldCBwcm9wZXJ0eSB3YXMgdXBkYXRlZCB0byBhbm90aGVyIGxpdGVyYWwgdmFsdWUuXG4gICAgICAgIC8vIFRoaXMgaXMgdW5saWtlbHkgdG8gYmUgYSBjb21tb24gb2NjdXJyZW5jZSBhbiBhY2NlcHRhYmxlIGxpbWl0YXRpb24gZm9yIG5vdy5cbiAgICAgICAgYXBwbGllZC5mb3JFYWNoKCh7IHByb3AsIHRhcmdldCwga2V5IH0pID0+IHtcbiAgICAgICAgICAgIGlmICh0YXJnZXQpIHtcbiAgICAgICAgICAgICAgICB0YXJnZXRba2V5XSA9IHByb3BzW3Byb3BdO1xuICAgICAgICAgICAgICAgIC8vIGxvZygnaW5mbycsIGBSZS1hcHBseWluZyAke3Byb3B9IHdpdGggdmFsdWUgJHtwcm9wc1twcm9wXX0gdG8ga2V5ICR7a2V5fSBpbmAsIHRhcmdldCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIEZpbmQgYW5kIGFwcGx5IG5ldyBwcm9wZXJ0aWVzXG4gICAgICAgIGZ1bmN0aW9uIGFwcGx5UHJvcHMgKG9iaiwgdGFyZ2V0LCBrZXkpIHtcbiAgICAgICAgICAgIC8vIENvbnZlcnQgc3RyaW5nXG4gICAgICAgICAgICBpZiAodHlwZW9mIG9iaiA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICBjb25zdCBwcm9wID0gKG9iai5zbGljZSgwLCA3KSA9PT0gJ2dsb2JhbC4nKSAmJiAob2JqLnNsaWNlKDcpLnJlcGxhY2UoL1xcLi9nLCBzZXBhcmF0b3IpKTtcbiAgICAgICAgICAgICAgICBpZiAocHJvcCAmJiBwcm9wc1twcm9wXSAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIFNhdmUgcmVjb3JkIG9mIHdoZXJlIHByb3BlcnR5IGlzIGFwcGxpZWRcbiAgICAgICAgICAgICAgICAgICAgYXBwbGllZC5wdXNoKHsgcHJvcCwgdGFyZ2V0LCBrZXkgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gQXBwbHkgcHJvcGVydHlcbiAgICAgICAgICAgICAgICAgICAgb2JqID0gcHJvcHNbcHJvcF07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gTG9vcCB0aHJvdWdoIG9iamVjdCBwcm9wZXJ0aWVzXG4gICAgICAgICAgICBlbHNlIGlmICh0eXBlb2Ygb2JqID09PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgICAgIGZvciAobGV0IHAgaW4gb2JqKSB7XG4gICAgICAgICAgICAgICAgICAgIG9ialtwXSA9IGFwcGx5UHJvcHMob2JqW3BdLCBvYmosIHApO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBvYmo7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gYXBwbHlQcm9wcyhjb25maWcpO1xuICAgIH0sXG5cbiAgICAvLyBNb3ZlIGlubGluZSAoVVJMIHN0cmluZykgdGV4dHVyZXMgdG8gdGhlIHNjZW5lJ3MgdG9wLWxldmVsIHNldCBvZiB0ZXh0dXJlcyAoY29uZmlnLnRleHR1cmVzKS5cbiAgICAvLyBUaGVyZSBhcmUgMyBzdWNoIGNhc2VzIG9mIHRleHR1cmVzOlxuICAgIC8vIC0gaW4gYSBzdHlsZSdzIGB0ZXh0dXJlYCBwcm9wZXJ0eVxuICAgIC8vIC0gaW4gYSBzdHlsZSdzIGBtYXRlcmlhbGAgcHJvcGVydGllc1xuICAgIC8vIC0gaW4gYSBzdHlsZSdzIGN1c3RvbSB1bmlmb3JtcyAoYHNoYWRlcnMudW5pZm9ybXNgKVxuICAgIGhvaXN0VGV4dHVyZXMgKGNvbmZpZykge1xuICAgICAgICBpZiAoY29uZmlnLnN0eWxlcykge1xuICAgICAgICAgICAgZm9yIChsZXQgc24gaW4gY29uZmlnLnN0eWxlcykge1xuICAgICAgICAgICAgICAgIGxldCBzdHlsZSA9IGNvbmZpZy5zdHlsZXNbc25dO1xuXG4gICAgICAgICAgICAgICAgLy8gU3R5bGUgYHRleHR1cmVgXG4gICAgICAgICAgICAgICAgbGV0IHRleCA9IHN0eWxlLnRleHR1cmU7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiB0ZXggPT09ICdzdHJpbmcnICYmICFjb25maWcudGV4dHVyZXNbdGV4XSkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgdXJsID0gdGV4O1xuICAgICAgICAgICAgICAgICAgICBsZXQgbmFtZSA9IGlzR2xvYmFsKHVybCkgPyBgdGV4dHVyZS0ke3VybH1gIDogdXJsO1xuICAgICAgICAgICAgICAgICAgICBjb25maWcudGV4dHVyZXNbbmFtZV0gPSB7IHVybCB9O1xuICAgICAgICAgICAgICAgICAgICBzdHlsZS50ZXh0dXJlID0gbmFtZTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyBNYXRlcmlhbFxuICAgICAgICAgICAgICAgIGlmIChzdHlsZS5tYXRlcmlhbCkge1xuICAgICAgICAgICAgICAgICAgICBbJ2VtaXNzaW9uJywgJ2FtYmllbnQnLCAnZGlmZnVzZScsICdzcGVjdWxhcicsICdub3JtYWwnXS5mb3JFYWNoKHByb3AgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gTWF0ZXJpYWwgcHJvcGVydHkgaGFzIGEgdGV4dHVyZVxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHRleCA9IHN0eWxlLm1hdGVyaWFsW3Byb3BdICE9IG51bGwgJiYgc3R5bGUubWF0ZXJpYWxbcHJvcF0udGV4dHVyZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgdGV4ID09PSAnc3RyaW5nJyAmJiAhY29uZmlnLnRleHR1cmVzW3RleF0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgdXJsID0gdGV4O1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBuYW1lID0gaXNHbG9iYWwodXJsKSA/IGB0ZXh0dXJlLSR7dXJsfWAgOiB1cmw7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmlnLnRleHR1cmVzW25hbWVdID0geyB1cmwgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHlsZS5tYXRlcmlhbFtwcm9wXS50ZXh0dXJlID0gbmFtZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gU2hhZGVyIHVuaWZvcm1zXG4gICAgICAgICAgICAgICAgaWYgKHN0eWxlLnNoYWRlcnMgJiYgc3R5bGUuc2hhZGVycy51bmlmb3Jtcykge1xuICAgICAgICAgICAgICAgICAgICBHTFNMLnBhcnNlVW5pZm9ybXMoc3R5bGUuc2hhZGVycy51bmlmb3JtcykuZm9yRWFjaCgoe3R5cGUsIHZhbHVlLCBrZXksIHVuaWZvcm1zfSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGV4dHVyZSBieSBVUkwgKHN0cmluZy1uYW1lZCB0ZXh0dXJlIG5vdCByZWZlcmVuY2luZyBleGlzdGluZyB0ZXh0dXJlIGRlZmluaXRpb24pXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodHlwZSA9PT0gJ3NhbXBsZXIyRCcgJiYgdHlwZW9mIHZhbHVlID09PSAnc3RyaW5nJyAmJiAhY29uZmlnLnRleHR1cmVzW3ZhbHVlXSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCB1cmwgPSB2YWx1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgbmFtZSA9IGlzR2xvYmFsKHVybCkgPyBgdGV4dHVyZS0ke3VybH1gIDogdXJsO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZy50ZXh0dXJlc1tuYW1lXSA9IHsgdXJsIH07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5pZm9ybXNba2V5XSA9IG5hbWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvLyBOb3JtYWxpemUgc29tZSBzY2VuZS13aWRlIHNldHRpbmdzIHRoYXQgYXBwbHkgdG8gdGhlIGZpbmFsLCBtZXJnZWQgc2NlbmVcbiAgICBmaW5hbGl6ZSh7IGNvbmZpZywgYnVuZGxlIH0pIHtcbiAgICAgICAgaWYgKCFjb25maWcpIHtcbiAgICAgICAgICAgIHJldHVybiB7fTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEVuc3VyZSB0b3AtbGV2ZWwgcHJvcGVydGllc1xuICAgICAgICBjb25maWcuc2NlbmUgPSBjb25maWcuc2NlbmUgfHwge307XG4gICAgICAgIGNvbmZpZy5jYW1lcmFzID0gY29uZmlnLmNhbWVyYXMgfHwge307XG4gICAgICAgIGNvbmZpZy5saWdodHMgPSBjb25maWcubGlnaHRzIHx8IHt9O1xuICAgICAgICBjb25maWcuc3R5bGVzID0gY29uZmlnLnN0eWxlcyB8fCB7fTtcbiAgICAgICAgY29uZmlnLmxheWVycyA9IGNvbmZpZy5sYXllcnMgfHwge307XG5cbiAgICAgICAgLy8gSWYgb25seSBvbmUgY2FtZXJhIHNwZWNpZmllZCwgc2V0IGl0IGFzIGRlZmF1bHRcbiAgICAgICAgaWYgKGNvbmZpZy5jYW1lcmEpIHtcbiAgICAgICAgICAgIGNvbmZpZy5jYW1lcmFzLmRlZmF1bHQgPSBjb25maWcuY2FtZXJhO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gSWYgbm8gY2FtZXJhcyBzcGVjaWZpZWQsIGNyZWF0ZSBvbmVcbiAgICAgICAgaWYgKE9iamVjdC5rZXlzKGNvbmZpZy5jYW1lcmFzKS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIGNvbmZpZy5jYW1lcmFzLmRlZmF1bHQgPSB7fTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIElmIG5vIGxpZ2h0cyBzcGVjaWZpZWQsIGNyZWF0ZSBkZWZhdWx0XG4gICAgICAgIGlmIChPYmplY3Qua2V5cyhjb25maWcubGlnaHRzKS5sZW5ndGggPT09IDAgfHxcbiAgICAgICAgICAgIE9iamVjdC5rZXlzKGNvbmZpZy5saWdodHMpLmV2ZXJ5KGkgPT4gY29uZmlnLmxpZ2h0c1tpXS52aXNpYmxlID09PSBmYWxzZSkpIHtcbiAgICAgICAgICAgIGNvbmZpZy5saWdodHMuZGVmYXVsdF9saWdodCA9IHtcbiAgICAgICAgICAgICAgICB0eXBlOiAnZGlyZWN0aW9uYWwnXG4gICAgICAgICAgICB9O1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHsgY29uZmlnLCBidW5kbGUgfTtcbiAgICB9XG5cbn07XG5cbi8vIEZsYXR0ZW4gbmVzdGVkIHByb3BlcnRpZXMgZm9yIHNpbXBsZXIgc3RyaW5nIGxvb2stdXBzXG4vLyBlLmcuIGdsb2JhbC5iYWNrZ3JvdW5kLmNvbG9yIC0+ICdnbG9iYWw6YmFja2dyb3VuZDpjb2xvcidcbmZ1bmN0aW9uIGZsYXR0ZW5Qcm9wZXJ0aWVzIChvYmosIHNlcGFyYXRvciA9ICc6JywgcHJlZml4ID0gbnVsbCwgcHJvcHMgPSB7fSkge1xuICAgIHByZWZpeCA9IHByZWZpeCA/IChwcmVmaXggKyBzZXBhcmF0b3IpIDogJyc7XG5cbiAgICBmb3IgKGxldCBwIGluIG9iaikge1xuICAgICAgICBsZXQga2V5ID0gcHJlZml4ICsgcDtcbiAgICAgICAgbGV0IHZhbCA9IG9ialtwXTtcbiAgICAgICAgcHJvcHNba2V5XSA9IHZhbDtcblxuICAgICAgICBpZiAodHlwZW9mIHZhbCA9PT0gJ29iamVjdCcgJiYgIUFycmF5LmlzQXJyYXkodmFsKSkge1xuICAgICAgICAgICAgZmxhdHRlblByb3BlcnRpZXModmFsLCBzZXBhcmF0b3IsIGtleSwgcHJvcHMpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBwcm9wcztcbn1cblxuc3Vic2NyaWJlTWl4aW4oU2NlbmVMb2FkZXIpO1xuIiwiLypqc2hpbnQgd29ya2VyOiB0cnVlKi9cbmltcG9ydCBUaHJlYWQgZnJvbSAnLi91dGlscy90aHJlYWQnO1xuaW1wb3J0IFV0aWxzIGZyb20gJy4vdXRpbHMvdXRpbHMnO1xuaW1wb3J0IGxvZyBmcm9tICcuL3V0aWxzL2xvZyc7XG5pbXBvcnQgV29ya2VyQnJva2VyIGZyb20gJy4vdXRpbHMvd29ya2VyX2Jyb2tlcic7IC8vIGpzaGludCBpZ25vcmU6bGluZVxuaW1wb3J0IG1lcmdlT2JqZWN0cyBmcm9tICcuL3V0aWxzL21lcmdlJztcbmltcG9ydCBUaWxlIGZyb20gJy4vdGlsZSc7XG5pbXBvcnQgRGF0YVNvdXJjZSBmcm9tICcuL3NvdXJjZXMvZGF0YV9zb3VyY2UnO1xuaW1wb3J0IEZlYXR1cmVTZWxlY3Rpb24gZnJvbSAnLi9zZWxlY3Rpb24nO1xuaW1wb3J0IHtTdHlsZVBhcnNlcn0gZnJvbSAnLi9zdHlsZXMvc3R5bGVfcGFyc2VyJztcbmltcG9ydCB7U3R5bGVNYW5hZ2VyfSBmcm9tICcuL3N0eWxlcy9zdHlsZV9tYW5hZ2VyJztcbmltcG9ydCB7cGFyc2VMYXllcnN9IGZyb20gJy4vc3R5bGVzL2xheWVyJztcbmltcG9ydCBUZXh0dXJlIGZyb20gJy4vZ2wvdGV4dHVyZSc7XG5cbmV4cG9ydCB2YXIgU2NlbmVXb3JrZXIgPSBzZWxmO1xuXG4vLyBXb3JrZXIgZnVuY3Rpb25hbGl0eSB3aWxsIG9ubHkgYmUgZGVmaW5lZCBpbiB3b3JrZXIgdGhyZWFkXG5pZiAoVGhyZWFkLmlzX3dvcmtlcikge1xuXG5PYmplY3QuYXNzaWduKHNlbGYsIHtcblxuICAgIEZlYXR1cmVTZWxlY3Rpb24sXG5cbiAgICBzb3VyY2VzOiB7fSxcbiAgICBzdHlsZXM6IHt9LFxuICAgIGxheWVyczoge30sXG4gICAgdGlsZXM6IHt9LFxuICAgIG9iamVjdHM6IHt9LFxuICAgIGNvbmZpZzoge30sICAgICAvLyByYXcgY29uZmlnIChlLmcuIGZ1bmN0aW9ucywgZXRjLiBub3QgZXhwYW5kZWQpXG5cbiAgICAvLyBJbml0aWFsaXplIHdvcmtlclxuICAgIGluaXQgKHNjZW5lX2lkLCB3b3JrZXJfaWQsIG51bV93b3JrZXJzLCBsb2dfbGV2ZWwsIGRldmljZV9waXhlbF9yYXRpbykge1xuICAgICAgICBzZWxmLnNjZW5lX2lkID0gc2NlbmVfaWQ7XG4gICAgICAgIHNlbGYuX3dvcmtlcl9pZCA9IHdvcmtlcl9pZDtcbiAgICAgICAgc2VsZi5udW1fd29ya2VycyA9IG51bV93b3JrZXJzO1xuICAgICAgICBsb2cuc2V0TGV2ZWwobG9nX2xldmVsKTtcbiAgICAgICAgVXRpbHMuZGV2aWNlX3BpeGVsX3JhdGlvID0gZGV2aWNlX3BpeGVsX3JhdGlvO1xuICAgICAgICBGZWF0dXJlU2VsZWN0aW9uLnNldFByZWZpeChzZWxmLl93b3JrZXJfaWQpO1xuICAgICAgICBzZWxmLnN0eWxlX21hbmFnZXIgPSBuZXcgU3R5bGVNYW5hZ2VyKCk7XG4gICAgICAgIHJldHVybiB3b3JrZXJfaWQ7XG4gICAgfSxcblxuICAgIC8vIFN0YXJ0cyBhIGNvbmZpZyByZWZyZXNoXG4gICAgdXBkYXRlQ29uZmlnICh7IGNvbmZpZywgZ2VuZXJhdGlvbiwgaW50cm9zcGVjdGlvbiB9KSB7XG4gICAgICAgIGNvbmZpZyA9IEpTT04ucGFyc2UoY29uZmlnKTtcblxuICAgICAgICBzZWxmLmxhc3RfY29uZmlnID0gbWVyZ2VPYmplY3RzKHt9LCBzZWxmLmNvbmZpZyk7XG4gICAgICAgIHNlbGYuY29uZmlnID0gbWVyZ2VPYmplY3RzKHt9LCBjb25maWcpO1xuICAgICAgICBzZWxmLmdlbmVyYXRpb24gPSBnZW5lcmF0aW9uO1xuICAgICAgICBzZWxmLmludHJvc3BlY3Rpb24gPSBpbnRyb3NwZWN0aW9uO1xuXG4gICAgICAgIC8vIERhdGEgYmxvY2sgZnVuY3Rpb25zIGFyZSBub3QgY29udGV4dCB3cmFwcGVkIGxpa2UgdGhlIHJlc3Qgb2YgdGhlIHN0eWxlIGZ1bmN0aW9ucyBhcmVcbiAgICAgICAgLy8gVE9ETzogcHJvYmFibHkgd2FudCBhIGNsZWFuZXIgd2F5IHRvIGV4Y2x1ZGUgdGhlc2VcbiAgICAgICAgZm9yIChsZXQgbGF5ZXIgaW4gY29uZmlnLmxheWVycykge1xuICAgICAgICAgICAgaWYgKGNvbmZpZy5sYXllcnNbbGF5ZXJdKSB7XG4gICAgICAgICAgICAgICAgY29uZmlnLmxheWVyc1tsYXllcl0uZGF0YSA9IFV0aWxzLnN0cmluZ3NUb0Z1bmN0aW9ucyhjb25maWcubGF5ZXJzW2xheWVyXS5kYXRhKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEV4cGFuZCBnbG9iYWwgcHJvcGVydGllc1xuICAgICAgICBzZWxmLmdsb2JhbCA9IFV0aWxzLnN0cmluZ3NUb0Z1bmN0aW9ucyhjb25maWcuZ2xvYmFsKTtcblxuICAgICAgICAvLyBDcmVhdGUgZGF0YSBzb3VyY2VzXG4gICAgICAgIHNlbGYuY3JlYXRlRGF0YVNvdXJjZXMoY29uZmlnKTtcblxuICAgICAgICAvLyBFeHBhbmQgc3R5bGVzXG4gICAgICAgIGNvbmZpZy5zdHlsZXMgPSBVdGlscy5zdHJpbmdzVG9GdW5jdGlvbnMoY29uZmlnLnN0eWxlcywgU3R5bGVQYXJzZXIud3JhcEZ1bmN0aW9uKTtcbiAgICAgICAgc2VsZi5zdHlsZXMgPSBzZWxmLnN0eWxlX21hbmFnZXIuYnVpbGQoY29uZmlnLnN0eWxlcyk7XG4gICAgICAgIHNlbGYuc3R5bGVfbWFuYWdlci5pbml0U3R5bGVzKHtcbiAgICAgICAgICAgIGdlbmVyYXRpb246IHNlbGYuZ2VuZXJhdGlvbixcbiAgICAgICAgICAgIHN0eWxlczogc2VsZi5zdHlsZXMsXG4gICAgICAgICAgICBzb3VyY2VzOiBzZWxmLnNvdXJjZXMsXG4gICAgICAgICAgICBpbnRyb3NwZWN0aW9uOiBzZWxmLmludHJvc3BlY3Rpb25cbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gUGFyc2UgZWFjaCB0b3AtbGV2ZWwgbGF5ZXIgYXMgYSBzZXBhcmF0ZSB0cmVlXG4gICAgICAgIHNlbGYubGF5ZXJzID0gcGFyc2VMYXllcnMoY29uZmlnLmxheWVycywgc2VsZi5zdHlsZV9tYW5hZ2VyLnN0eWxlcyk7XG5cbiAgICAgICAgLy8gU3luYyB0ZXR4dXJlIGluZm8gZnJvbSBtYWluIHRocmVhZFxuICAgICAgICBzZWxmLnN5bmNpbmdfdGV4dHVyZXMgPSBzZWxmLnN5bmNUZXh0dXJlcyhjb25maWcudGV4dHVyZXMpO1xuXG4gICAgICAgIC8vIFJldHVybiBwcm9taXNlIGZvciB3aGVuIGNvbmZpZyByZWZyZXNoIGZpbmlzaGVzXG4gICAgICAgIHNlbGYuY29uZmlndXJpbmcgPSBzZWxmLnN5bmNpbmdfdGV4dHVyZXMudGhlbigoKSA9PiB7XG4gICAgICAgICAgICBsb2coJ2RlYnVnJywgYHVwZGF0ZWQgY29uZmlnYCk7XG4gICAgICAgIH0pO1xuICAgIH0sXG5cbiAgICAvLyBDcmVhdGUgZGF0YSBzb3VyY2VzIGFuZCBjbGVhciB0aWxlIGNhY2hlIGlmIG5lY2Vzc2FyeVxuICAgIGNyZWF0ZURhdGFTb3VyY2VzIChjb25maWcpIHtcbiAgICAgICAgY29uZmlnLnNvdXJjZXMgPSBVdGlscy5zdHJpbmdzVG9GdW5jdGlvbnMoY29uZmlnLnNvdXJjZXMpOyAvLyBwYXJzZSBuZXcgc291cmNlc1xuICAgICAgICBzZWxmLnNvdXJjZXMgPSB7fTsgLy8gY2xlYXIgcHJldmlvdXMgc291cmNlc1xuICAgICAgICBmb3IgKGxldCBuYW1lIGluIGNvbmZpZy5zb3VyY2VzKSB7XG4gICAgICAgICAgICBsZXQgc291cmNlO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBzb3VyY2UgPSBEYXRhU291cmNlLmNyZWF0ZShPYmplY3QuYXNzaWduKHt9LCBjb25maWcuc291cmNlc1tuYW1lXSwge25hbWV9KSwgc2VsZi5zb3VyY2VzKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGNhdGNoKGUpIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKCFzb3VyY2UpIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHNlbGYuc291cmNlc1tuYW1lXSA9IHNvdXJjZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENsZWFyIHRpbGUgY2FjaGUgaWYgZGF0YSBzb3VyY2UgY29uZmlnIGNoYW5nZWRcbiAgICAgICAgaWYgKCFzZWxmLmNvbmZpZy5zb3VyY2VzIHx8XG4gICAgICAgICAgICAhc2VsZi5sYXN0X2NvbmZpZy5zb3VyY2VzIHx8XG4gICAgICAgICAgICBPYmplY3Qua2V5cyhzZWxmLmNvbmZpZy5zb3VyY2VzKS5zb21lKHMgPT4ge1xuICAgICAgICAgICAgICAgIHJldHVybiBKU09OLnN0cmluZ2lmeShzZWxmLmNvbmZpZy5zb3VyY2VzW3NdKSAhPT0gSlNPTi5zdHJpbmdpZnkoc2VsZi5sYXN0X2NvbmZpZy5zb3VyY2VzW3NdKTtcbiAgICAgICAgICAgIH0pKSB7XG4gICAgICAgICAgICBzZWxmLnRpbGVzID0ge307XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgLy8gUmV0dXJucyBhIHByb21pc2UgdGhhdCBmdWxmaWxscyB3aGVuIGNvbmZpZyByZWZyZXNoIGlzIGZpbmlzaGVkXG4gICAgYXdhaXRDb25maWd1cmF0aW9uICgpIHtcbiAgICAgICAgcmV0dXJuIHNlbGYuY29uZmlndXJpbmc7XG4gICAgfSxcblxuICAgIC8vIEJ1aWxkIGEgdGlsZTogbG9hZCBmcm9tIHRpbGUgc291cmNlIGlmIGJ1aWxkaW5nIGZvciBmaXJzdCB0aW1lLCBvdGhlcndpc2UgcmVidWlsZCB3aXRoIGV4aXN0aW5nIGRhdGFcbiAgICBidWlsZFRpbGUgKHsgdGlsZSB9KSB7XG4gICAgICAgIC8vIFRpbGUgY2FjaGVkP1xuICAgICAgICBpZiAoc2VsZi5nZXRUaWxlKHRpbGUua2V5KSAhPSBudWxsKSB7XG4gICAgICAgICAgICAvLyBBbHJlYWR5IGxvYWRpbmc/XG4gICAgICAgICAgICBpZiAoc2VsZi5nZXRUaWxlKHRpbGUua2V5KS5sb2FkaW5nID09PSB0cnVlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gVXBkYXRlIHRpbGUgY2FjaGVcbiAgICAgICAgdGlsZSA9IHNlbGYudGlsZXNbdGlsZS5rZXldID0gT2JqZWN0LmFzc2lnbihzZWxmLmdldFRpbGUodGlsZS5rZXkpIHx8IHt9LCB0aWxlKTtcblxuICAgICAgICAvLyBVcGRhdGUgY29uZmlnIChzdHlsZXMsIGV0Yy4pLCB0aGVuIGJ1aWxkIHRpbGVcbiAgICAgICAgcmV0dXJuIHNlbGYuYXdhaXRDb25maWd1cmF0aW9uKCkudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAvLyBGaXJzdCB0aW1lIGJ1aWxkaW5nIHRoZSB0aWxlXG4gICAgICAgICAgICBpZiAodGlsZS5sb2FkZWQgIT09IHRydWUpIHtcblxuICAgICAgICAgICAgICAgIHRpbGUubG9hZGluZyA9IHRydWU7XG4gICAgICAgICAgICAgICAgdGlsZS5sb2FkZWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB0aWxlLmVycm9yID0gbnVsbDtcblxuICAgICAgICAgICAgICAgIHNlbGYubG9hZFRpbGVTb3VyY2VEYXRhKHRpbGUpLnRoZW4oKCkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAoIXNlbGYuZ2V0VGlsZSh0aWxlLmtleSkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxvZygndHJhY2UnLCBgc3RvcCB0aWxlIGJ1aWxkIGFmdGVyIGRhdGEgc291cmNlIGxvYWQgYmVjYXVzZSB0aWxlIHdhcyByZW1vdmVkOiAke3RpbGUua2V5fWApO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gV2FybiBhbmQgY29udGludWUgb24gZGF0YSBzb3VyY2UgZXJyb3JcbiAgICAgICAgICAgICAgICAgICAgaWYgKHRpbGUuc291cmNlX2RhdGEuZXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxvZygnd2FybicsIGB0aWxlIGxvYWQgZXJyb3IocykgZm9yICR7dGlsZS5rZXl9OiAke3RpbGUuc291cmNlX2RhdGEuZXJyb3J9YCk7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICB0aWxlLmxvYWRpbmcgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgdGlsZS5sb2FkZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICBUaWxlLmJ1aWxkR2VvbWV0cnkodGlsZSwgc2VsZik7XG4gICAgICAgICAgICAgICAgfSkuY2F0Y2goKGVycm9yKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHRpbGUubG9hZGluZyA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICB0aWxlLmxvYWRlZCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICB0aWxlLmVycm9yID0gZXJyb3Iuc3RhY2s7XG4gICAgICAgICAgICAgICAgICAgIGxvZygnZXJyb3InLCBgdGlsZSBsb2FkIGVycm9yIGZvciAke3RpbGUua2V5fTogJHt0aWxlLmVycm9yfWApO1xuXG4gICAgICAgICAgICAgICAgICAgIC8vIFNlbmQgZXJyb3IgdG8gbWFpbiB0aHJlYWRcbiAgICAgICAgICAgICAgICAgICAgV29ya2VyQnJva2VyLnBvc3RNZXNzYWdlKGBUaWxlTWFuYWdlcl8ke3NlbGYuc2NlbmVfaWR9LmJ1aWxkVGlsZUVycm9yYCwgVGlsZS5zbGljZSh0aWxlKSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBUaWxlIGFscmVhZHkgbG9hZGVkLCBqdXN0IHJlYnVpbGRcbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGxvZygndHJhY2UnLCBgdXNlZCB3b3JrZXIgY2FjaGUgZm9yIHRpbGUgJHt0aWxlLmtleX1gKTtcblxuICAgICAgICAgICAgICAgIC8vIEJ1aWxkIGdlb21ldHJ5XG4gICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgVGlsZS5idWlsZEdlb21ldHJ5KHRpbGUsIHNlbGYpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBjYXRjaChlcnJvcikge1xuICAgICAgICAgICAgICAgICAgICAvLyBTZW5kIGVycm9yIHRvIG1haW4gdGhyZWFkXG4gICAgICAgICAgICAgICAgICAgIHRpbGUuZXJyb3IgPSBlcnJvci50b1N0cmluZygpO1xuICAgICAgICAgICAgICAgICAgICBXb3JrZXJCcm9rZXIucG9zdE1lc3NhZ2UoYFRpbGVNYW5hZ2VyXyR7c2VsZi5zY2VuZV9pZH0uYnVpbGRUaWxlRXJyb3JgLCBUaWxlLnNsaWNlKHRpbGUpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH0sXG5cbiAgICAvLyBMb2FkIHRoaXMgdGlsZSdzIGRhdGEgc291cmNlXG4gICAgbG9hZFRpbGVTb3VyY2VEYXRhICh0aWxlKSB7XG4gICAgICAgIGlmIChzZWxmLnNvdXJjZXNbdGlsZS5zb3VyY2VdKSB7XG4gICAgICAgICAgICByZXR1cm4gc2VsZi5zb3VyY2VzW3RpbGUuc291cmNlXS5sb2FkKHRpbGUpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGlsZS5zb3VyY2VfZGF0YSA9IHt9O1xuICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh0aWxlKTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICBnZXRUaWxlKGtleSkge1xuICAgICAgICByZXR1cm4gc2VsZi50aWxlc1trZXldO1xuICAgIH0sXG5cbiAgICAvLyBSZW1vdmUgdGlsZVxuICAgIHJlbW92ZVRpbGUgKGtleSkge1xuICAgICAgICB2YXIgdGlsZSA9IHNlbGYudGlsZXNba2V5XTtcblxuICAgICAgICBpZiAodGlsZSAhPSBudWxsKSB7XG4gICAgICAgICAgICAvLyBDYW5jZWwgaWYgbG9hZGluZ1xuICAgICAgICAgICAgaWYgKHRpbGUubG9hZGluZyA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgICAgIGxvZygndHJhY2UnLCBgY2FuY2VsIHRpbGUgbG9hZCBmb3IgJHtrZXl9YCk7XG4gICAgICAgICAgICAgICAgdGlsZS5sb2FkaW5nID0gZmFsc2U7XG4gICAgICAgICAgICAgICAgVGlsZS5jYW5jZWwodGlsZSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIFJlbW92ZSBmcm9tIGNhY2hlXG4gICAgICAgICAgICBGZWF0dXJlU2VsZWN0aW9uLmNsZWFyVGlsZShrZXkpO1xuICAgICAgICAgICAgZGVsZXRlIHNlbGYudGlsZXNba2V5XTtcbiAgICAgICAgICAgIGxvZygndHJhY2UnLCBgcmVtb3ZlIHRpbGUgZnJvbSBjYWNoZSBmb3IgJHtrZXl9YCk7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgLy8gR2V0IGEgZmVhdHVyZSBmcm9tIHRoZSBzZWxlY3Rpb24gbWFwXG4gICAgZ2V0RmVhdHVyZVNlbGVjdGlvbiAoeyBpZCwga2V5IH0gPSB7fSkge1xuICAgICAgICB2YXIgc2VsZWN0aW9uID0gRmVhdHVyZVNlbGVjdGlvbi5tYXBba2V5XTtcblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgaWQ6IGlkLFxuICAgICAgICAgICAgZmVhdHVyZTogKHNlbGVjdGlvbiAmJiBzZWxlY3Rpb24uZmVhdHVyZSlcbiAgICAgICAgfTtcbiAgICB9LFxuXG4gICAgLy8gUmVzZXRzIHRoZSBmZWF0dXJlIHNlbGVjdGlvbiBzdGF0ZVxuICAgIHJlc2V0RmVhdHVyZVNlbGVjdGlvbiAoKSB7XG4gICAgICAgIEZlYXR1cmVTZWxlY3Rpb24ucmVzZXQoKTtcbiAgICB9LFxuXG4gICAgLy8gU2VsZWN0aW9uIG1hcCBzaXplIGZvciB0aGlzIHdvcmtlclxuICAgIGdldEZlYXR1cmVTZWxlY3Rpb25NYXBTaXplICgpIHtcbiAgICAgICAgcmV0dXJuIEZlYXR1cmVTZWxlY3Rpb24uZ2V0TWFwU2l6ZSgpO1xuICAgIH0sXG5cbiAgICAvLyBUZXh0dXJlIGluZm8gbmVlZHMgdG8gYmUgc3luY2VkIGZyb20gbWFpbiB0aHJlYWQsIGUuZy4gd2lkdGgvaGVpZ2h0LCB3aGljaCB3ZSBvbmx5IGtub3cgYWZ0ZXIgdGhlIHRleHR1cmUgbG9hZHNcbiAgICBzeW5jVGV4dHVyZXMgKHRleF9jb25maWcpIHtcbiAgICAgICAgbGV0IHRleHR1cmVzID0gW107XG4gICAgICAgIGlmICh0ZXhfY29uZmlnKSB7XG4gICAgICAgICAgICB0ZXh0dXJlcy5wdXNoKC4uLk9iamVjdC5rZXlzKHRleF9jb25maWcpKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxvZygndHJhY2UnLCAnc3luYyB0ZXh0dXJlcyB0byB3b3JrZXI6JywgdGV4dHVyZXMpO1xuICAgICAgICBpZiAodGV4dHVyZXMubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgcmV0dXJuIFRleHR1cmUuc3luY1RleHR1cmVzVG9Xb3JrZXIodGV4dHVyZXMpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoKTtcbiAgICB9LFxuXG4gICAgLy8gU3luYyBkZXZpY2UgcGl4ZWwgcmF0aW8gZnJvbSBtYWluIHRocmVhZFxuICAgIHVwZGF0ZURldmljZVBpeGVsUmF0aW8gKGRldmljZV9waXhlbF9yYXRpbykge1xuICAgICAgICBVdGlscy5kZXZpY2VfcGl4ZWxfcmF0aW8gPSBkZXZpY2VfcGl4ZWxfcmF0aW87XG4gICAgfSxcblxuICAgIC8vIFByb2ZpbGluZyBoZWxwZXJzXG4gICAgcHJvZmlsZSAobmFtZSkge1xuICAgICAgICBjb25zb2xlLnByb2ZpbGUoYHdvcmtlciAke3NlbGYuX3dvcmtlcl9pZH06ICR7bmFtZX1gKTtcbiAgICB9LFxuXG4gICAgcHJvZmlsZUVuZCAobmFtZSkge1xuICAgICAgICBjb25zb2xlLnByb2ZpbGVFbmQoYHdvcmtlciAke3NlbGYuX3dvcmtlcl9pZH06ICR7bmFtZX1gKTtcbiAgICB9XG5cbn0pO1xuXG5Xb3JrZXJCcm9rZXIuYWRkVGFyZ2V0KCdzZWxmJywgc2VsZik7XG5cbn1cbiIsImltcG9ydCBsb2cgZnJvbSAnLi91dGlscy9sb2cnO1xuaW1wb3J0IFRleHR1cmUgZnJvbSAnLi9nbC90ZXh0dXJlJztcbmltcG9ydCBXb3JrZXJCcm9rZXIgZnJvbSAnLi91dGlscy93b3JrZXJfYnJva2VyJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgRmVhdHVyZVNlbGVjdGlvbiB7XG5cbiAgICBjb25zdHJ1Y3RvcihnbCwgd29ya2Vycykge1xuICAgICAgICB0aGlzLmdsID0gZ2w7XG4gICAgICAgIHRoaXMud29ya2VycyA9IHdvcmtlcnM7IC8vIHBvb2wgb2Ygd29ya2VycyB0byByZXF1ZXN0IGZlYXR1cmUgbG9vay11cHMgZnJvbSwga2V5ZWQgYnkgaWRcbiAgICAgICAgdGhpcy5pbml0KCk7XG4gICAgfVxuXG4gICAgaW5pdCgpIHtcbiAgICAgICAgLy8gU2VsZWN0aW9uIHN0YXRlIHRyYWNraW5nXG4gICAgICAgIHRoaXMucmVxdWVzdHMgPSB7fTsgLy8gcGVuZGluZyBzZWxlY3Rpb24gcmVxdWVzdHNcbiAgICAgICAgdGhpcy5mZWF0dXJlID0gbnVsbDsgLy8gY3VycmVudGx5IHNlbGVjdGVkIGZlYXR1cmVcbiAgICAgICAgdGhpcy5yZWFkX2RlbGF5ID0gNTsgLy8gZGVsYXkgdGltZSBmcm9tIHNlbGVjdGlvbiByZW5kZXIgdG8gZnJhbWVidWZmZXIgc2FtcGxlLCB0byBhdm9pZCBDUFUvR1BVIHN5bmMgbG9ja1xuICAgICAgICB0aGlzLnJlYWRfZGVsYXlfdGltZXIgPSBudWxsOyAvLyBjdXJyZW50IHRpbWVyIChzZXRUaW1lb3V0KSBmb3IgZGVsYXllZCBzZWxlY3Rpb24gcmVhZHNcblxuICAgICAgICB0aGlzLnBpeGVsID0gbmV3IFVpbnQ4QXJyYXkoNCk7XG4gICAgICAgIHRoaXMucGl4ZWwzMiA9IG5ldyBGbG9hdDMyQXJyYXkodGhpcy5waXhlbC5idWZmZXIpO1xuXG4gICAgICAgIC8vIEZyYW1lIGJ1ZmZlciBmb3Igc2VsZWN0aW9uXG4gICAgICAgIC8vIFRPRE86IGluaXRpYXRlIGxhemlseSBpbiBjYXNlIHdlIGRvbid0IG5lZWQgdG8gZG8gYW55IHNlbGVjdGlvblxuICAgICAgICB0aGlzLmZibyA9IHRoaXMuZ2wuY3JlYXRlRnJhbWVidWZmZXIoKTtcbiAgICAgICAgdGhpcy5nbC5iaW5kRnJhbWVidWZmZXIodGhpcy5nbC5GUkFNRUJVRkZFUiwgdGhpcy5mYm8pO1xuICAgICAgICB0aGlzLmZib19zaXplID0geyB3aWR0aDogMjU2LCBoZWlnaHQ6IDI1NiB9OyAvLyBUT0RPOiBtYWtlIGNvbmZpZ3VyYWJsZSAvIGFkYXB0aXZlIGJhc2VkIG9uIGNhbnZhcyBzaXplXG4gICAgICAgIHRoaXMuZmJvX3NpemUuYXNwZWN0ID0gdGhpcy5mYm9fc2l6ZS53aWR0aCAvIHRoaXMuZmJvX3NpemUuaGVpZ2h0O1xuXG4gICAgICAgIC8vIFRleHR1cmUgZm9yIHRoZSBGQk8gY29sb3IgYXR0YWNobWVudFxuICAgICAgICB2YXIgZmJvX3RleHR1cmUgPSBUZXh0dXJlLmNyZWF0ZSggdGhpcy5nbCwgJ3NlbGVjdGlvbl9mYm8nLCB7IGZpbHRlcmluZzogJ25lYXJlc3QnIH0pO1xuICAgICAgICBmYm9fdGV4dHVyZS5zZXREYXRhKHRoaXMuZmJvX3NpemUud2lkdGgsIHRoaXMuZmJvX3NpemUuaGVpZ2h0LCBudWxsLCB7IGZpbHRlcmluZzogJ25lYXJlc3QnIH0pO1xuICAgICAgICB0aGlzLmdsLmZyYW1lYnVmZmVyVGV4dHVyZTJEKHRoaXMuZ2wuRlJBTUVCVUZGRVIsIHRoaXMuZ2wuQ09MT1JfQVRUQUNITUVOVDAsIHRoaXMuZ2wuVEVYVFVSRV8yRCwgZmJvX3RleHR1cmUudGV4dHVyZSwgMCk7XG5cbiAgICAgICAgLy8gUmVuZGVyYnVmZmVyIGZvciB0aGUgRkJPIGRlcHRoIGF0dGFjaG1lbnRcbiAgICAgICAgdmFyIGZib19kZXB0aF9yYiA9IHRoaXMuZ2wuY3JlYXRlUmVuZGVyYnVmZmVyKCk7XG4gICAgICAgIHRoaXMuZ2wuYmluZFJlbmRlcmJ1ZmZlcih0aGlzLmdsLlJFTkRFUkJVRkZFUiwgZmJvX2RlcHRoX3JiKTtcbiAgICAgICAgdGhpcy5nbC5yZW5kZXJidWZmZXJTdG9yYWdlKHRoaXMuZ2wuUkVOREVSQlVGRkVSLCB0aGlzLmdsLkRFUFRIX0NPTVBPTkVOVDE2LCB0aGlzLmZib19zaXplLndpZHRoLCB0aGlzLmZib19zaXplLmhlaWdodCk7XG4gICAgICAgIHRoaXMuZ2wuZnJhbWVidWZmZXJSZW5kZXJidWZmZXIodGhpcy5nbC5GUkFNRUJVRkZFUiwgdGhpcy5nbC5ERVBUSF9BVFRBQ0hNRU5ULCB0aGlzLmdsLlJFTkRFUkJVRkZFUiwgZmJvX2RlcHRoX3JiKTtcblxuICAgICAgICB0aGlzLmdsLmJpbmRGcmFtZWJ1ZmZlcih0aGlzLmdsLkZSQU1FQlVGRkVSLCBudWxsKTtcbiAgICB9XG5cbiAgICBkZXN0cm95KCkge1xuICAgICAgICBpZiAodGhpcy5nbCAmJiB0aGlzLmZibykge1xuICAgICAgICAgICAgdGhpcy5nbC5kZWxldGVGcmFtZWJ1ZmZlcih0aGlzLmZibyk7XG4gICAgICAgICAgICB0aGlzLmZibyA9IG51bGw7XG4gICAgICAgICAgICB0aGlzLmdsLmJpbmRGcmFtZWJ1ZmZlcih0aGlzLmdsLkZSQU1FQlVGRkVSLCBudWxsKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFRPRE86IGZyZWUgdGV4dHVyZT9cbiAgICB9XG5cbiAgICBiaW5kKCkge1xuICAgICAgICAvLyBTd2l0Y2ggdG8gRkJPXG4gICAgICAgIHRoaXMuZ2wuYmluZEZyYW1lYnVmZmVyKHRoaXMuZ2wuRlJBTUVCVUZGRVIsIHRoaXMuZmJvKTtcbiAgICAgICAgdGhpcy5nbC52aWV3cG9ydCgwLCAwLCB0aGlzLmZib19zaXplLndpZHRoLCB0aGlzLmZib19zaXplLmhlaWdodCk7XG4gICAgfVxuXG4gICAgLy8gUmVxdWVzdCBmZWF0dXJlIHNlbGVjdGlvblxuICAgIC8vIFJ1bnMgYXN5bmNocm9ub3VzbHksIHNjaGVkdWxlcyBzZWxlY3Rpb24gYnVmZmVyIHRvIGJlIHVwZGF0ZWRcbiAgICBnZXRGZWF0dXJlQXQocG9pbnQpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgICAgICAgIC8vIFF1ZXVlIHJlcXVlc3RzIGZvciBmZWF0dXJlIHNlbGVjdGlvbiwgYW5kIHRoZXkgd2lsbCBiZSBwaWNrZWQgdXAgYnkgdGhlIHJlbmRlciBsb29wXG4gICAgICAgICAgICB0aGlzLnNlbGVjdGlvbl9yZXF1ZXN0X2lkID0gKHRoaXMuc2VsZWN0aW9uX3JlcXVlc3RfaWQgKyAxKSB8fCAwO1xuICAgICAgICAgICAgdGhpcy5yZXF1ZXN0c1t0aGlzLnNlbGVjdGlvbl9yZXF1ZXN0X2lkXSA9IHtcbiAgICAgICAgICAgICAgICB0eXBlOiAncG9pbnQnLFxuICAgICAgICAgICAgICAgIGlkOiB0aGlzLnNlbGVjdGlvbl9yZXF1ZXN0X2lkLFxuICAgICAgICAgICAgICAgIHBvaW50LFxuICAgICAgICAgICAgICAgIHJlc29sdmUsXG4gICAgICAgICAgICAgICAgcmVqZWN0XG4gICAgICAgICAgICB9O1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICAvLyBBbnkgcGVuZGluZyBzZWxlY3Rpb24gcmVxdWVzdHNcbiAgICBwZW5kaW5nUmVxdWVzdHMoKSB7XG4gICAgICAgIHJldHVybiBPYmplY3Qua2V5cyh0aGlzLnJlcXVlc3RzKS5sZW5ndGggJiYgdGhpcy5yZXF1ZXN0cztcbiAgICB9XG5cbiAgICBjbGVhclBlbmRpbmdSZXF1ZXN0cygpIHtcbiAgICAgICAgZm9yICh2YXIgciBpbiB0aGlzLnJlcXVlc3RzKSB7XG4gICAgICAgICAgICB2YXIgcmVxdWVzdCA9IHRoaXMucmVxdWVzdHNbcl07XG5cbiAgICAgICAgICAgIC8vIFRoaXMgcmVxdWVzdCB3YXMgYWxyZWFkeSBzZW50IHRvIHRoZSB3b3JrZXIsIHdlJ3JlIGp1c3QgYXdhaXRpbmcgaXRzIHJlcGx5XG4gICAgICAgICAgICBpZiAocmVxdWVzdC5zZW50KSB7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIFJlamVjdCByZXF1ZXN0IHNpbmNlIGl0IHdpbGwgbmV2ZXIgYmUgZnVsZmlsbGVkXG4gICAgICAgICAgICAvLyBUT0RPOiBwYXNzIGEgcmVhc29uIGZvciByZWplY3Rpb24/XG4gICAgICAgICAgICByZXF1ZXN0LnJlamVjdCh7IHJlcXVlc3QgfSk7XG4gICAgICAgICAgICBkZWxldGUgdGhpcy5yZXF1ZXN0c1tyXTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIFJlYWQgcGVuZGluZyByZXN1bHRzIGZyb20gdGhlIHNlbGVjdGlvbiBidWZmZXIuIENhbGxlZCBhZnRlciByZW5kZXJpbmcgdG8gc2VsZWN0aW9uIGJ1ZmZlci5cbiAgICByZWFkKCkge1xuICAgICAgICAvLyBEZWxheSByZWFkaW5nIHRoZSBwaXhlbCByZXN1bHQgZnJvbSB0aGUgc2VsZWN0aW9uIGJ1ZmZlciB0byBhdm9pZCBDUFUvR1BVIHN5bmMgbG9jay5cbiAgICAgICAgLy8gQ2FsbGluZyByZWFkUGl4ZWxzIHN5bmNocm9ub3VzbHkgY2F1c2VkIGEgbWFzc2l2ZSBwZXJmb3JtYW5jZSBoaXQsIHByZXN1bWFibHkgc2luY2UgaXRcbiAgICAgICAgLy8gZm9yY2VkIHRoaXMgZnVuY3Rpb24gdG8gd2FpdCBmb3IgdGhlIEdQVSB0byBmaW5pc2ggcmVuZGVyaW5nIGFuZCByZXRyaWV2ZSB0aGUgdGV4dHVyZSBjb250ZW50cy5cbiAgICAgICAgaWYgKHRoaXMucmVhZF9kZWxheV90aW1lciAhPSBudWxsKSB7XG4gICAgICAgICAgICBjbGVhclRpbWVvdXQodGhpcy5yZWFkX2RlbGF5X3RpbWVyKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLnJlYWRfZGVsYXlfdGltZXIgPSBzZXRUaW1lb3V0KCgpID0+IHtcbiAgICAgICAgICAgIHZhciBnbCA9IHRoaXMuZ2w7XG5cbiAgICAgICAgICAgIGdsLmJpbmRGcmFtZWJ1ZmZlcihnbC5GUkFNRUJVRkZFUiwgdGhpcy5mYm8pO1xuXG4gICAgICAgICAgICBmb3IgKHZhciByIGluIHRoaXMucmVxdWVzdHMpIHtcbiAgICAgICAgICAgICAgICB2YXIgcmVxdWVzdCA9IHRoaXMucmVxdWVzdHNbcl07XG5cbiAgICAgICAgICAgICAgICAvLyBUaGlzIHJlcXVlc3Qgd2FzIGFscmVhZHkgc2VudCB0byB0aGUgd29ya2VyLCB3ZSdyZSBqdXN0IGF3YWl0aW5nIGl0cyByZXBseVxuICAgICAgICAgICAgICAgIGlmIChyZXF1ZXN0LnNlbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gVE9ETzogc3VwcG9ydCBvdGhlciBzZWxlY3Rpb24gdHlwZXMsIHN1Y2ggYXMgZmVhdHVyZXMgd2l0aGluIGEgYm94XG4gICAgICAgICAgICAgICAgaWYgKHJlcXVlc3QudHlwZSAhPT0gJ3BvaW50Jykge1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyBDaGVjayBzZWxlY3Rpb24gbWFwIGFnYWluc3QgRkJPXG4gICAgICAgICAgICAgICAgZ2wucmVhZFBpeGVscyhcbiAgICAgICAgICAgICAgICAgICAgTWF0aC5mbG9vcihyZXF1ZXN0LnBvaW50LnggKiB0aGlzLmZib19zaXplLndpZHRoKSxcbiAgICAgICAgICAgICAgICAgICAgTWF0aC5mbG9vcigoMSAtIHJlcXVlc3QucG9pbnQueSkgKiB0aGlzLmZib19zaXplLmhlaWdodCksXG4gICAgICAgICAgICAgICAgICAgIDEsIDEsIGdsLlJHQkEsIGdsLlVOU0lHTkVEX0JZVEUsIHRoaXMucGl4ZWwpO1xuICAgICAgICAgICAgICAgIHZhciBmZWF0dXJlX2tleSA9ICh0aGlzLnBpeGVsWzBdICsgKHRoaXMucGl4ZWxbMV0gPDwgOCkgKyAodGhpcy5waXhlbFsyXSA8PCAxNikgKyAodGhpcy5waXhlbFszXSA8PCAyNCkpID4+PiAwO1xuXG4gICAgICAgICAgICAgICAgLy8gSWYgZmVhdHVyZSBmb3VuZCwgYXNrIGFwcHJvcHJpYXRlIHdlYiB3b3JrZXIgdG8gbG9va3VwIGZlYXR1cmVcbiAgICAgICAgICAgICAgICB2YXIgd29ya2VyX2lkID0gdGhpcy5waXhlbFszXTtcbiAgICAgICAgICAgICAgICBpZiAod29ya2VyX2lkICE9PSAyNTUpIHsgLy8gMjU1IGluZGljYXRlcyBhbiBlbXB0eSBzZWxlY3Rpb24gYnVmZmVyIHBpeGVsXG4gICAgICAgICAgICAgICAgICAgIGlmICh0aGlzLndvcmtlcnNbd29ya2VyX2lkXSAhPSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBXb3JrZXJCcm9rZXIucG9zdE1lc3NhZ2UoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy53b3JrZXJzW3dvcmtlcl9pZF0sXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ3NlbGYuZ2V0RmVhdHVyZVNlbGVjdGlvbicsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBpZDogcmVxdWVzdC5pZCwga2V5OiBmZWF0dXJlX2tleSB9KVxuICAgICAgICAgICAgICAgICAgICAgICAgLnRoZW4obWVzc2FnZSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5maW5pc2hSZWFkKG1lc3NhZ2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgLy8gTm8gZmVhdHVyZSBmb3VuZCwgYnV0IHN0aWxsIG5lZWQgdG8gcmVzb2x2ZSBwcm9taXNlXG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZmluaXNoUmVhZCh7IGlkOiByZXF1ZXN0LmlkLCBmZWF0dXJlOiBudWxsIH0pO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHJlcXVlc3Quc2VudCA9IHRydWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGdsLmJpbmRGcmFtZWJ1ZmZlcihnbC5GUkFNRUJVRkZFUiwgbnVsbCk7XG5cbiAgICAgICAgfSwgdGhpcy5yZWFkX2RlbGF5KTtcbiAgICB9XG5cbiAgICAvLyBDYWxsZWQgb24gbWFpbiB0aHJlYWQgd2hlbiBhIHdlYiB3b3JrZXIgZmluZHMgYSBmZWF0dXJlIGluIHRoZSBzZWxlY3Rpb24gYnVmZmVyXG4gICAgZmluaXNoUmVhZCAobWVzc2FnZSkge1xuICAgICAgICB2YXIgcmVxdWVzdCA9IHRoaXMucmVxdWVzdHNbbWVzc2FnZS5pZF07XG4gICAgICAgIGlmICghcmVxdWVzdCkge1xuICAgICAgICAgICAgbG9nKCdlcnJvcicsIFwiRmVhdHVyZVNlbGVjdGlvbi5maW5pc2hSZWFkKCk6IGNvdWxkIG5vdCBmaW5kIG1lc3NhZ2VcIiwgbWVzc2FnZSk7XG4gICAgICAgICAgICByZXR1cm47IC8vIHJlcXVlc3Qgd2FzIGNsZWFyZWQgYmVmb3JlIGl0IHJldHVybmVkXG4gICAgICAgIH1cblxuICAgICAgICB2YXIgZmVhdHVyZSA9IG1lc3NhZ2UuZmVhdHVyZTtcbiAgICAgICAgdmFyIGNoYW5nZWQgPSBmYWxzZTtcbiAgICAgICAgaWYgKChmZWF0dXJlICE9IG51bGwgJiYgdGhpcy5mZWF0dXJlID09IG51bGwpIHx8XG4gICAgICAgICAgICAoZmVhdHVyZSA9PSBudWxsICYmIHRoaXMuZmVhdHVyZSAhPSBudWxsKSB8fFxuICAgICAgICAgICAgKGZlYXR1cmUgIT0gbnVsbCAmJiB0aGlzLmZlYXR1cmUgIT0gbnVsbCAmJlxuICAgICAgICAgICAgICAgIEpTT04uc3RyaW5naWZ5KGZlYXR1cmUpICE9PSBKU09OLnN0cmluZ2lmeSh0aGlzLmZlYXR1cmUpKSkge1xuICAgICAgICAgICAgY2hhbmdlZCA9IHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmZlYXR1cmUgPSBmZWF0dXJlOyAvLyBzdG9yZSB0aGUgbW9zdCByZWNlbnRseSBzZWxlY3RlZCBmZWF0dXJlXG5cbiAgICAgICAgLy8gUmVzb2x2ZSB0aGUgcmVxdWVzdFxuICAgICAgICByZXF1ZXN0LnJlc29sdmUoeyBmZWF0dXJlLCBjaGFuZ2VkLCByZXF1ZXN0IH0pO1xuICAgICAgICBkZWxldGUgdGhpcy5yZXF1ZXN0c1ttZXNzYWdlLmlkXTsgLy8gZG9uZSBwcm9jZXNzaW5nIHRoaXMgcmVxdWVzdFxuICAgIH1cblxuXG4gICAgLy8gU2VsZWN0aW9uIG1hcCBnZW5lcmF0aW9uXG4gICAgLy8gRWFjaCB3b3JrZXIgd2lsbCBjcmVhdGUgaXRzIG93biBpbmRlcGVuZGVudCwgJ2xvY2FsJyBzZWxlY3Rpb24gbWFwXG5cbiAgICAvLyBDcmVhdGUgYSB1bmlxdWUgMzItYml0IGNvbG9yIHRvIGlkZW50aWZ5IGEgZmVhdHVyZVxuICAgIC8vIFdvcmtlcnMgaW5kZXBlbmRlbnRseSBjcmVhdGUvbW9kaWZ5IHNlbGVjdGlvbiBjb2xvcnMgaW4gdGhlaXIgb3duIHRocmVhZHMsIGJ1dCB3ZSBhbHNvXG4gICAgLy8gbmVlZCB0aGUgbWFpbiB0aHJlYWQgdG8ga25vdyB3aGVyZSBlYWNoIGZlYXR1cmUgY29sb3Igb3JpZ2luYXRlZC4gVG8gYWNjb21wbGlzaCB0aGlzLFxuICAgIC8vIHdlIHBhcnRpdGlvbiB0aGUgbWFwIGJ5IHNldHRpbmcgdGhlIDR0aCBjb21wb25lbnQgKGFscGhhIGNoYW5uZWwpIHRvIHRoZSB3b3JrZXIncyBpZC5cbiAgICBzdGF0aWMgbWFrZUVudHJ5KHRpbGUpIHtcbiAgICAgICAgLy8gMzItYml0IGNvbG9yIGtleVxuICAgICAgICB0aGlzLm1hcF9lbnRyeSsrO1xuICAgICAgICB2YXIgaXIgPSB0aGlzLm1hcF9lbnRyeSAmIDI1NTtcbiAgICAgICAgdmFyIGlnID0gKHRoaXMubWFwX2VudHJ5ID4+IDgpICYgMjU1O1xuICAgICAgICB2YXIgaWIgPSAodGhpcy5tYXBfZW50cnkgPj4gMTYpICYgMjU1O1xuICAgICAgICB2YXIgaWEgPSB0aGlzLm1hcF9wcmVmaXg7XG4gICAgICAgIHZhciByID0gaXIgLyAyNTU7XG4gICAgICAgIHZhciBnID0gaWcgLyAyNTU7XG4gICAgICAgIHZhciBiID0gaWIgLyAyNTU7XG4gICAgICAgIHZhciBhID0gaWEgLyAyNTU7XG4gICAgICAgIHZhciBrZXkgPSAoaXIgKyAoaWcgPDwgOCkgKyAoaWIgPDwgMTYpICsgKGlhIDw8IDI0KSkgPj4+IDA7IC8vIG5lZWQgdW5zaWduZWQgcmlnaHQgc2hpZnQgdG8gY29udmVydCB0byBwb3NpdGl2ZSAjXG5cbiAgICAgICAgdGhpcy5tYXBba2V5XSA9IHtcbiAgICAgICAgICAgIGNvbG9yOiBbciwgZywgYiwgYV0sXG4gICAgICAgIH07XG4gICAgICAgIHRoaXMubWFwX3NpemUrKztcblxuICAgICAgICAvLyBJbml0aWFsaXplIHRpbGUtc3BlY2lmaWMgdHJhY2tpbmcgaW5mb1xuICAgICAgICBpZiAoIXRoaXMudGlsZXNbdGlsZS5rZXldKSB7XG4gICAgICAgICAgICB0aGlzLnRpbGVzW3RpbGUua2V5XSA9IHtcbiAgICAgICAgICAgICAgICBlbnRyaWVzOiBbXSwgICAgICAgICAgICAgICAgICAgICAgICAvLyBzZXQgb2YgZmVhdHVyZSBlbnRyaWVzIGluIHRoaXMgdGhyZWFkXG4gICAgICAgICAgICAgICAgdGlsZTogeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3Vic2V0IG9mIHRpbGUgcHJvcGVydGllcyB0byBwYXNzIGJhY2sgd2l0aCBmZWF0dXJlXG4gICAgICAgICAgICAgICAgICAgIGtleTogdGlsZS5rZXksXG4gICAgICAgICAgICAgICAgICAgIGNvb3JkczogdGlsZS5jb29yZHMsXG4gICAgICAgICAgICAgICAgICAgIHN0eWxlX3pvb206IHRpbGUuc3R5bGVfem9vbSxcbiAgICAgICAgICAgICAgICAgICAgc291cmNlOiB0aWxlLnNvdXJjZSxcbiAgICAgICAgICAgICAgICAgICAgZ2VuZXJhdGlvbjogdGlsZS5nZW5lcmF0aW9uXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMudGlsZXNbdGlsZS5rZXldLmVudHJpZXMucHVzaChrZXkpO1xuXG4gICAgICAgIHJldHVybiB0aGlzLm1hcFtrZXldO1xuICAgIH1cblxuICAgIHN0YXRpYyBtYWtlQ29sb3IoZmVhdHVyZSwgdGlsZSwgY29udGV4dCkge1xuICAgICAgICB2YXIgc2VsZWN0b3IgPSB0aGlzLm1ha2VFbnRyeSh0aWxlKTtcbiAgICAgICAgc2VsZWN0b3IuZmVhdHVyZSA9IHtcbiAgICAgICAgICAgIGlkOiBmZWF0dXJlLmlkLFxuICAgICAgICAgICAgcHJvcGVydGllczogZmVhdHVyZS5wcm9wZXJ0aWVzLFxuICAgICAgICAgICAgc291cmNlX25hbWU6IGNvbnRleHQuc291cmNlLFxuICAgICAgICAgICAgc291cmNlX2xheWVyOiBjb250ZXh0LmxheWVyLFxuICAgICAgICAgICAgbGF5ZXJzOiBjb250ZXh0LmxheWVycyxcbiAgICAgICAgICAgIHRpbGU6IHRoaXMudGlsZXNbdGlsZS5rZXldLnRpbGVcbiAgICAgICAgfTtcblxuICAgICAgICByZXR1cm4gc2VsZWN0b3IuY29sb3I7XG4gICAgfVxuXG4gICAgc3RhdGljIHJlc2V0KCkge1xuICAgICAgICB0aGlzLnRpbGVzID0ge307XG4gICAgICAgIHRoaXMubWFwID0ge307XG4gICAgICAgIHRoaXMubWFwX3NpemUgPSAwO1xuICAgICAgICB0aGlzLm1hcF9lbnRyeSA9IDA7XG4gICAgfVxuXG4gICAgc3RhdGljIGNsZWFyVGlsZShrZXkpIHtcbiAgICAgICAgaWYgKHRoaXMudGlsZXNba2V5XSkge1xuICAgICAgICAgICAgdGhpcy50aWxlc1trZXldLmVudHJpZXMuZm9yRWFjaChrID0+IGRlbGV0ZSB0aGlzLm1hcFtrXSk7XG4gICAgICAgICAgICB0aGlzLm1hcF9zaXplIC09IHRoaXMudGlsZXNba2V5XS5lbnRyaWVzLmxlbmd0aDtcbiAgICAgICAgICAgIGRlbGV0ZSB0aGlzLnRpbGVzW2tleV07XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBzdGF0aWMgZ2V0TWFwU2l6ZSgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMubWFwX3NpemU7XG4gICAgfVxuXG4gICAgc3RhdGljIHNldFByZWZpeChwcmVmaXgpIHtcbiAgICAgICAgdGhpcy5tYXBfcHJlZml4ID0gcHJlZml4O1xuICAgIH1cblxufVxuXG4vLyBTdGF0aWMgcHJvcGVydGllc1xuRmVhdHVyZVNlbGVjdGlvbi5tYXAgPSB7fTsgICAvLyB0aGlzIHdpbGwgYmUgdW5pcXVlIHBlciBtb2R1bGUgaW5zdGFuY2UgKHNvIHVuaXF1ZSBwZXIgd29ya2VyKVxuRmVhdHVyZVNlbGVjdGlvbi50aWxlcyA9IHt9OyAvLyBzZWxlY3Rpb24ga2V5cywgYnkgdGlsZVxuRmVhdHVyZVNlbGVjdGlvbi5tYXBfc2l6ZSA9IDA7XG5GZWF0dXJlU2VsZWN0aW9uLm1hcF9lbnRyeSA9IDA7XG5GZWF0dXJlU2VsZWN0aW9uLm1hcF9wcmVmaXggPSAwOyAvLyBzZXQgYnkgd29ya2VyIHRvIHdvcmtlciBpZCAjXG5GZWF0dXJlU2VsZWN0aW9uLmRlZmF1bHRDb2xvciA9IFswLCAwLCAwLCAxXTtcbiIsIi8qanNoaW50IHdvcmtlcjogdHJ1ZSAqL1xuaW1wb3J0IEdlbyBmcm9tICcuLi9nZW8nO1xuaW1wb3J0IHtNZXRob2ROb3RJbXBsZW1lbnRlZH0gZnJvbSAnLi4vdXRpbHMvZXJyb3JzJztcbmltcG9ydCBVdGlscyBmcm9tICcuLi91dGlscy91dGlscyc7XG5pbXBvcnQgKiBhcyBVUkxzIGZyb20gJy4uL3V0aWxzL3VybHMnO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBEYXRhU291cmNlIHtcblxuICAgIGNvbnN0cnVjdG9yIChjb25maWcsIHNvdXJjZXMpIHtcbiAgICAgICAgdGhpcy5jb25maWcgPSBjb25maWc7IC8vIHNhdmUgb3JpZ2luYWwgY29uZmlnXG4gICAgICAgIHRoaXMuc291cmNlcyA9IHNvdXJjZXM7IC8vIGZ1bGwgc2V0IG9mIGRhdGEgc291cmNlcyBUT0RPOiBjZW50cmFsaXplIHRoZXNlIGxpa2UgdGV4dHVyZXM/XG4gICAgICAgIHRoaXMuaWQgPSBjb25maWcuaWQ7XG4gICAgICAgIHRoaXMubmFtZSA9IGNvbmZpZy5uYW1lO1xuICAgICAgICB0aGlzLnBhZF9zY2FsZSA9IGNvbmZpZy5wYWRfc2NhbGUgfHwgMC4wMDAxOyAvLyBzY2FsZSB0aWxlIHVwIGJ5IHNtYWxsIGZhY3RvciB0byBjb3ZlciBzZWFtc1xuICAgICAgICB0aGlzLmRlZmF1bHRfd2luZGluZyA9IG51bGw7IC8vIHdpbmRpbmcgb3JkZXIgd2lsbCBhZGFwdCB0byBkYXRhIHNvdXJjZVxuICAgICAgICB0aGlzLnJhc3RlcnMgPSBbXTsgLy8gYXR0YWNoZWQgcmFzdGVyIHRpbGUgc291cmNlc1xuICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShjb25maWcucmFzdGVycykpIHsgLy8gY29weSB1bmlxdWUgc2V0IG9mIHJhc3RlciBzb3VyY2VzXG4gICAgICAgICAgICBjb25maWcucmFzdGVycy5mb3JFYWNoKHIgPT4ge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLnJhc3RlcnMuaW5kZXhPZihyKSA9PT0gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yYXN0ZXJzLnB1c2gocik7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBPcHRpb25hbCBmdW5jdGlvbiB0byB0cmFuc2Zvcm0gc291cmNlIGRhdGFcbiAgICAgICAgdGhpcy50cmFuc2Zvcm0gPSBjb25maWcudHJhbnNmb3JtO1xuICAgICAgICBpZiAodHlwZW9mIHRoaXMudHJhbnNmb3JtID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICB0aGlzLnRyYW5zZm9ybS5iaW5kKHRoaXMpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gT3B0aW9uYWwgYWRkaXRpb25hbCBkYXRhIHRvIHBhc3MgdG8gdGhlIHRyYW5zZm9ybSBmdW5jdGlvblxuICAgICAgICB0aGlzLmV4dHJhX2RhdGEgPSBjb25maWcuZXh0cmFfZGF0YTtcblxuICAgICAgICAvLyBPcHRpb25hbCBhZGRpdGlvbmFsIHNjcmlwdHMgbWFkZSBhdmFpbGFibGUgdG8gdGhlIHRyYW5zZm9ybSBmdW5jdGlvblxuICAgICAgICAvLyBOT1RFOiB0aGVzZSBhcmUgbG9hZGVkIGFsb25nc2lkZSB0aGUgbGlicmFyeSB3aGVuIHRoZSB3b3JrZXJzIGFyZSBpbnN0YW50aWF0ZWRcbiAgICAgICAgdGhpcy5zY3JpcHRzID0gY29uZmlnLnNjcmlwdHM7XG5cbiAgICAgICAgLy8gb3Zlcnpvb20gd2lsbCBhcHBseSBmb3Igem9vbXMgaGlnaGVyIHRoYW4gdGhpc1xuICAgICAgICB0aGlzLm1heF96b29tID0gKGNvbmZpZy5tYXhfem9vbSAhPSBudWxsKSA/IGNvbmZpZy5tYXhfem9vbSA6IEdlby5kZWZhdWx0X3NvdXJjZV9tYXhfem9vbTtcblxuICAgICAgICAvLyBubyB0aWxlcyB3aWxsIGJlIHJlcXVlc3RlZCBvciBkaXNwbGF5ZWQgb3V0c2lkZSBvZiB0aGVzZSBtaW4vbWF4IHZhbHVlc1xuICAgICAgICB0aGlzLm1pbl9kaXNwbGF5X3pvb20gPSAoY29uZmlnLm1pbl9kaXNwbGF5X3pvb20gIT0gbnVsbCkgPyBjb25maWcubWluX2Rpc3BsYXlfem9vbSA6IDA7XG4gICAgICAgIHRoaXMubWF4X2Rpc3BsYXlfem9vbSA9IChjb25maWcubWF4X2Rpc3BsYXlfem9vbSAhPSBudWxsKSA/IGNvbmZpZy5tYXhfZGlzcGxheV96b29tIDogbnVsbDtcbiAgICB9XG5cbiAgICAvLyBDcmVhdGUgYSB0aWxlIHNvdXJjZSBieSB0eXBlLCBmYWN0b3J5LXN0eWxlXG4gICAgc3RhdGljIGNyZWF0ZSAoc291cmNlLCBzb3VyY2VzKSB7XG4gICAgICAgIGlmIChEYXRhU291cmNlLnR5cGVzW3NvdXJjZS50eXBlXSkge1xuICAgICAgICAgICAgcmV0dXJuIG5ldyBEYXRhU291cmNlLnR5cGVzW3NvdXJjZS50eXBlXShzb3VyY2UsIHNvdXJjZXMpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gQ2hlY2sgaWYgYSBkYXRhIHNvdXJjZSBkZWZpbml0aW9uIGNoYW5nZWRcbiAgICBzdGF0aWMgY2hhbmdlZCAoc291cmNlLCBwcmV2X3NvdXJjZSkge1xuICAgICAgICBpZiAoIXNvdXJjZSB8fCAhcHJldl9zb3VyY2UpIHtcbiAgICAgICAgICAgIHJldHVybiB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IGN1ciA9IE9iamVjdC5hc3NpZ24oe30sIHNvdXJjZS5jb25maWcsIHsgaWQ6IG51bGwgfSk7IC8vIG51bGwgb3V0IGlkcyBzaW5jZSB3ZSBkb24ndCB3YW50IHRvIGNvbXBhcmUgdGhlbVxuICAgICAgICBsZXQgcHJldiA9IE9iamVjdC5hc3NpZ24oe30sIHByZXZfc291cmNlLmNvbmZpZywgeyBpZDogbnVsbCB9KTtcblxuICAgICAgICByZXR1cm4gSlNPTi5zdHJpbmdpZnkoY3VyKSAhPT0gSlNPTi5zdHJpbmdpZnkocHJldik7XG4gICAgfVxuXG4gICAgLy8gTWVyY2F0b3IgcHJvamVjdGlvblxuICAgIHN0YXRpYyBwcm9qZWN0RGF0YSAoc291cmNlKSB7XG4gICAgICAgIHZhciB0aW1lciA9ICtuZXcgRGF0ZSgpO1xuICAgICAgICBmb3IgKHZhciB0IGluIHNvdXJjZS5sYXllcnMpIHtcbiAgICAgICAgICAgIHZhciBudW1fZmVhdHVyZXMgPSBzb3VyY2UubGF5ZXJzW3RdLmZlYXR1cmVzLmxlbmd0aDtcbiAgICAgICAgICAgIGZvciAodmFyIGY9MDsgZiA8IG51bV9mZWF0dXJlczsgZisrKSB7XG4gICAgICAgICAgICAgICAgdmFyIGZlYXR1cmUgPSBzb3VyY2UubGF5ZXJzW3RdLmZlYXR1cmVzW2ZdO1xuICAgICAgICAgICAgICAgIEdlby50cmFuc2Zvcm1HZW9tZXRyeShmZWF0dXJlLmdlb21ldHJ5LCBjb29yZCA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBbeCwgeV0gPSBHZW8ubGF0TG5nVG9NZXRlcnMoY29vcmQpO1xuICAgICAgICAgICAgICAgICAgICBjb29yZFswXSA9IHg7XG4gICAgICAgICAgICAgICAgICAgIGNvb3JkWzFdID0geTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChzb3VyY2UuZGVidWcgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgc291cmNlLmRlYnVnLnByb2plY3Rpb24gPSArbmV3IERhdGUoKSAtIHRpbWVyO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgIFJlLXNjYWxlIGdlb21ldHJpZXMgd2l0aGluIGVhY2ggc291cmNlIHRvIGludGVybmFsIHRpbGUgdW5pdHNcbiAgICAqL1xuICAgIHN0YXRpYyBzY2FsZURhdGEgKHNvdXJjZSwge2Nvb3Jkczoge3p9LCBtaW4sIG1heH0pIHtcbiAgICAgICAgbGV0IHVuaXRzX3Blcl9tZXRlciA9IEdlby51bml0c1Blck1ldGVyKHopO1xuICAgICAgICBmb3IgKHZhciB0IGluIHNvdXJjZS5sYXllcnMpIHtcbiAgICAgICAgICAgIHZhciBudW1fZmVhdHVyZXMgPSBzb3VyY2UubGF5ZXJzW3RdLmZlYXR1cmVzLmxlbmd0aDtcbiAgICAgICAgICAgIGZvciAodmFyIGY9MDsgZiA8IG51bV9mZWF0dXJlczsgZisrKSB7XG4gICAgICAgICAgICAgICAgdmFyIGZlYXR1cmUgPSBzb3VyY2UubGF5ZXJzW3RdLmZlYXR1cmVzW2ZdO1xuICAgICAgICAgICAgICAgIEdlby50cmFuc2Zvcm1HZW9tZXRyeShmZWF0dXJlLmdlb21ldHJ5LCBjb29yZCA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGNvb3JkWzBdID0gKGNvb3JkWzBdIC0gbWluLngpICogdW5pdHNfcGVyX21ldGVyO1xuICAgICAgICAgICAgICAgICAgICBjb29yZFsxXSA9IChjb29yZFsxXSAtIG1pbi55KSAqIHVuaXRzX3Blcl9tZXRlciAqIC0xOyAvLyBmbGlwIGNvb3JkcyBwb3NpdGl2ZVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgbG9hZChkZXN0KSB7XG4gICAgICAgIGRlc3Quc291cmNlX2RhdGEgPSB7fTtcbiAgICAgICAgZGVzdC5zb3VyY2VfZGF0YS5sYXllcnMgPSB7fTtcbiAgICAgICAgZGVzdC5wYWRfc2NhbGUgPSB0aGlzLnBhZF9zY2FsZTtcbiAgICAgICAgZGVzdC5yYXN0ZXJzID0gWy4uLnRoaXMucmFzdGVyc107IC8vIGNvcHkgbGlzdCBvZiByYXN0ZXJzIHRvIGxvYWQgZm9yIHRpbGVcblxuICAgICAgICByZXR1cm4gdGhpcy5fbG9hZChkZXN0KS50aGVuKChkZXN0KSA9PiB7XG4gICAgICAgICAgICAvLyBQb3N0LXByb2Nlc3NpbmdcbiAgICAgICAgICAgIGZvciAobGV0IGxheWVyIGluIGRlc3Quc291cmNlX2RhdGEubGF5ZXJzKSB7XG4gICAgICAgICAgICAgICAgbGV0IGRhdGEgPSBkZXN0LnNvdXJjZV9kYXRhLmxheWVyc1tsYXllcl07XG4gICAgICAgICAgICAgICAgaWYgKGRhdGEgJiYgZGF0YS5mZWF0dXJlcykge1xuICAgICAgICAgICAgICAgICAgICBkYXRhLmZlYXR1cmVzLmZvckVhY2goZmVhdHVyZSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBHZW8udHJhbnNmb3JtR2VvbWV0cnkoZmVhdHVyZS5nZW9tZXRyeSwgY29vcmQgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZsaXAgWSBjb29yZHNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb29yZFsxXSA9IC1jb29yZFsxXTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNsaWdodGx5IHNjYWxlIHVwIHRpbGUgdG8gY292ZXIgc2VhbXNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodGhpcy5wYWRfc2NhbGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29vcmRbMF0gPSBNYXRoLnJvdW5kKGNvb3JkWzBdICogKDEgKyB0aGlzLnBhZF9zY2FsZSkgLSAoR2VvLnRpbGVfc2NhbGUgKiB0aGlzLnBhZF9zY2FsZS8yKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvb3JkWzFdID0gTWF0aC5yb3VuZChjb29yZFsxXSAqICgxICsgdGhpcy5wYWRfc2NhbGUpIC0gKEdlby50aWxlX3NjYWxlICogdGhpcy5wYWRfc2NhbGUvMikpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBVc2UgZmlyc3QgZW5jb3VudGVyZWQgcG9seWdvbiB3aW5kaW5nIG9yZGVyIGFzIGRlZmF1bHQgZm9yIGRhdGEgc291cmNlXG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnVwZGF0ZURlZmF1bHRXaW5kaW5nKGZlYXR1cmUuZ2VvbWV0cnkpO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGRlc3QuZGVmYXVsdF93aW5kaW5nID0gdGhpcy5kZWZhdWx0X3dpbmRpbmcgfHwgJ0NDVyc7XG4gICAgICAgICAgICByZXR1cm4gZGVzdDtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gU3ViLWNsYXNzZXMgbXVzdCBpbXBsZW1lbnRcbiAgICBfbG9hZChkZXN0KSB7XG4gICAgICAgIHRocm93IG5ldyBNZXRob2ROb3RJbXBsZW1lbnRlZCgnX2xvYWQnKTtcbiAgICB9XG5cbiAgICAvLyBJbmZlciB3aW5kaW5nIGZvciBkYXRhIHNvdXJjZSBmcm9tIGZpcnN0IHJpbmcgb2YgcHJvdmlkZWQgZ2VvbWV0cnlcbiAgICB1cGRhdGVEZWZhdWx0V2luZGluZyAoZ2VvbSkge1xuICAgICAgICBpZiAodGhpcy5kZWZhdWx0X3dpbmRpbmcgPT0gbnVsbCkge1xuICAgICAgICAgICAgaWYgKGdlb20udHlwZSA9PT0gJ1BvbHlnb24nKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5kZWZhdWx0X3dpbmRpbmcgPSBHZW8ucmluZ1dpbmRpbmcoZ2VvbS5jb29yZGluYXRlc1swXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChnZW9tLnR5cGUgPT09ICdNdWx0aVBvbHlnb24nKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5kZWZhdWx0X3dpbmRpbmcgPSBHZW8ucmluZ1dpbmRpbmcoZ2VvbS5jb29yZGluYXRlc1swXVswXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMuZGVmYXVsdF93aW5kaW5nO1xuICAgIH1cblxuICAgIC8vIEFsbCBkYXRhIHNvdXJjZXMgc3VwcG9ydCBhIG1pbiB6b29tLCB0aWxlZCBzb3VyY2VzIGNhbiBzdWJjbGFzcyBmb3IgbW9yZSBzcGVjaWZpYyBsaW1pdHMgKGUuZy4gYm91bmRpbmcgYm94KVxuICAgIGluY2x1ZGVzVGlsZSAoY29vcmRzLCBzdHlsZV96b29tKSB7XG4gICAgICAgIC8vIExpbWl0IGJ5IHRoaXMgZGF0YSBzb3VyY2VcbiAgICAgICAgaWYgKGNvb3Jkcy56IDwgdGhpcy5taW5fZGlzcGxheV96b29tIHx8ICh0aGlzLm1heF9kaXNwbGF5X3pvb20gIT0gbnVsbCAmJiBzdHlsZV96b29tID4gdGhpcy5tYXhfZGlzcGxheV96b29tKSkge1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gTGltaXQgYnkgYW55IGRlcGVuZGVudCByYXN0ZXIgc291cmNlc1xuICAgICAgICBmb3IgKGxldCByPTA7IHIgPCB0aGlzLnJhc3RlcnMubGVuZ3RoOyByKyspIHtcbiAgICAgICAgICAgIGNvbnN0IHNvdXJjZV9uYW1lID0gdGhpcy5yYXN0ZXJzW3JdO1xuICAgICAgICAgICAgaWYgKHRoaXMuc291cmNlc1tzb3VyY2VfbmFtZV0gJiZcbiAgICAgICAgICAgICAgICB0aGlzLnNvdXJjZXNbc291cmNlX25hbWVdICE9PSB0aGlzICYmXG4gICAgICAgICAgICAgICAgIXRoaXMuc291cmNlc1tzb3VyY2VfbmFtZV0uaW5jbHVkZXNUaWxlKGNvb3JkcywgY29vcmRzLnopKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgLy8gUmVnaXN0ZXIgYSBuZXcgZGF0YSBzb3VyY2UgdHlwZSwgdW5kZXIgYSB0eXBlIG5hbWVcbiAgICBzdGF0aWMgcmVnaXN0ZXIodHlwZV9jbGFzcywgdHlwZV9uYW1lKSB7XG4gICAgICAgIGlmICghdHlwZV9jbGFzcyB8fCAhdHlwZV9uYW1lKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBEYXRhU291cmNlLnR5cGVzW3R5cGVfbmFtZV0gPSB0eXBlX2NsYXNzO1xuICAgIH1cblxufVxuXG5EYXRhU291cmNlLnR5cGVzID0ge307IC8vIHNldCBvZiBzdXBwb3J0ZWQgZGF0YSBzb3VyY2UgY2xhc3NlcywgcmVmZXJlbmNlZCBieSB0eXBlIG5hbWVcblxuXG4vKioqIEdlbmVyaWMgbmV0d29yayBsb2FkaW5nIHNvdXJjZSAtIGFic3RyYWN0IGNsYXNzICoqKi9cblxuZXhwb3J0IGNsYXNzIE5ldHdvcmtTb3VyY2UgZXh0ZW5kcyBEYXRhU291cmNlIHtcblxuICAgIGNvbnN0cnVjdG9yIChzb3VyY2UsIHNvdXJjZXMpIHtcbiAgICAgICAgc3VwZXIoc291cmNlLCBzb3VyY2VzKTtcbiAgICAgICAgdGhpcy51cmwgPSBVUkxzLmFkZFBhcmFtc1RvVVJMKHNvdXJjZS51cmwsIHNvdXJjZS51cmxfcGFyYW1zKTtcbiAgICAgICAgdGhpcy5yZXNwb25zZV90eXBlID0gXCJcIjsgLy8gdXNlIHRvIHNldCBleHBsaWNpdCBYSFIgdHlwZVxuXG4gICAgICAgIGlmICh0aGlzLnVybCA9PSBudWxsKSB7XG4gICAgICAgICAgICB0aHJvdyBFcnJvcignTmV0d29yayBkYXRhIHNvdXJjZSBtdXN0IHByb3ZpZGUgYSBgdXJsYCBwcm9wZXJ0eScpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgX2xvYWQgKGRlc3QpIHtcbiAgICAgICAgbGV0IHVybCA9IHRoaXMuZm9ybWF0VXJsKHRoaXMudXJsLCBkZXN0KTtcblxuICAgICAgICBsZXQgc291cmNlX2RhdGEgPSBkZXN0LnNvdXJjZV9kYXRhO1xuICAgICAgICBzb3VyY2VfZGF0YS51cmwgPSB1cmw7XG4gICAgICAgIGRlc3QuZGVidWcgPSBkZXN0LmRlYnVnIHx8IHt9O1xuICAgICAgICBkZXN0LmRlYnVnLm5ldHdvcmsgPSArbmV3IERhdGUoKTtcblxuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgc291cmNlX2RhdGEuZXJyb3IgPSBudWxsO1xuICAgICAgICAgICAgLy8gRm9yIHRlc3RpbmcgbmV0d29yayBlcnJvcnNcbiAgICAgICAgICAgIC8vIHZhciBwcm9taXNlID0gVXRpbHMuaW8odXJsLCA2MCAqIDEwMCwgdGhpcy5yZXNwb25zZV90eXBlKTtcbiAgICAgICAgICAgIC8vIGlmIChNYXRoLnJhbmRvbSgpIDwgLjcpIHtcbiAgICAgICAgICAgIC8vICAgICBwcm9taXNlID0gUHJvbWlzZS5yZWplY3QoRXJyb3IoJ2Zha2UgZGF0YSBzb3VyY2UgZXJyb3InKSk7XG4gICAgICAgICAgICAvLyB9XG4gICAgICAgICAgICAvLyBwcm9taXNlLnRoZW4oKGJvZHkpID0+IHtcbiAgICAgICAgICAgIGxldCBwcm9taXNlID0gVXRpbHMuaW8odXJsLCA2MCAqIDEwMDAsIHRoaXMucmVzcG9uc2VfdHlwZSk7XG4gICAgICAgICAgICBzb3VyY2VfZGF0YS5yZXF1ZXN0ID0gcHJvbWlzZS5yZXF1ZXN0O1xuXG4gICAgICAgICAgICBwcm9taXNlLnRoZW4oKGJvZHkpID0+IHtcbiAgICAgICAgICAgICAgICBkZXN0LmRlYnVnLnJlc3BvbnNlX3NpemUgPSBib2R5Lmxlbmd0aCB8fCBib2R5LmJ5dGVMZW5ndGg7XG4gICAgICAgICAgICAgICAgZGVzdC5kZWJ1Zy5uZXR3b3JrID0gK25ldyBEYXRlKCkgLSBkZXN0LmRlYnVnLm5ldHdvcms7XG4gICAgICAgICAgICAgICAgZGVzdC5kZWJ1Zy5wYXJzaW5nID0gK25ldyBEYXRlKCk7XG4gICAgICAgICAgICAgICAgdGhpcy5wYXJzZVNvdXJjZURhdGEoZGVzdCwgc291cmNlX2RhdGEsIGJvZHkpO1xuICAgICAgICAgICAgICAgIGRlc3QuZGVidWcucGFyc2luZyA9ICtuZXcgRGF0ZSgpIC0gZGVzdC5kZWJ1Zy5wYXJzaW5nO1xuICAgICAgICAgICAgICAgIHJlc29sdmUoZGVzdCk7XG4gICAgICAgICAgICB9KS5jYXRjaCgoZXJyb3IpID0+IHtcbiAgICAgICAgICAgICAgICBzb3VyY2VfZGF0YS5lcnJvciA9IGVycm9yLnN0YWNrO1xuICAgICAgICAgICAgICAgIHJlc29sdmUoZGVzdCk7IC8vIHJlc29sdmUgcmVxdWVzdCBidXQgcGFzcyBhbG9uZyBlcnJvclxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIFN1Yi1jbGFzc2VzIG11c3QgaW1wbGVtZW50OlxuXG4gICAgZm9ybWF0VXJsICh1cmxfdGVtcGxhdGUsIGRlc3QpIHtcbiAgICAgICAgdGhyb3cgbmV3IE1ldGhvZE5vdEltcGxlbWVudGVkKCdmb3JtYXRVcmwnKTtcbiAgICB9XG5cbiAgICBwYXJzZVNvdXJjZURhdGEgKGRlc3QsIHNvdXJjZSwgcmVwb25zZSkge1xuICAgICAgICB0aHJvdyBuZXcgTWV0aG9kTm90SW1wbGVtZW50ZWQoJ3BhcnNlU291cmNlRGF0YScpO1xuICAgIH1cbn1cblxuXG4vKioqIEdlbmVyaWMgbmV0d29yayB0aWxlIGxvYWRpbmcgLSBhYnN0cmFjdCBjbGFzcyAqKiovXG5cbmV4cG9ydCBjbGFzcyBOZXR3b3JrVGlsZVNvdXJjZSBleHRlbmRzIE5ldHdvcmtTb3VyY2Uge1xuXG4gICAgY29uc3RydWN0b3IgKHNvdXJjZSwgc291cmNlcykge1xuICAgICAgICBzdXBlcihzb3VyY2UsIHNvdXJjZXMpO1xuXG4gICAgICAgIHRoaXMudGlsZWQgPSB0cnVlO1xuICAgICAgICB0aGlzLnBhcnNlQm91bmRzKHNvdXJjZSk7XG5cbiAgICAgICAgLy8gaW5kaWNhdGVzIGlmIHNvdXJjZSBzaG91bGQgYnVpbGQgZ2VvbWV0cnkgdGlsZXMsIGVuYWJsZWQgZm9yIHNvdXJjZXMgcmVmZXJlbmNlZCBpbiB0aGUgc2NlbmUncyBsYXllcnMsXG4gICAgICAgIC8vIGFuZCBsZWZ0IGRpc2FibGVkIGZvciBzb3VyY2VzIHRoYXQgYXJlIG5ldmVyIHJlZmVyZW5jZWQsIG9yIG9ubHkgdXNlZCBhcyByYXN0ZXIgdGV4dHVyZXNcbiAgICAgICAgdGhpcy5idWlsZHNfZ2VvbWV0cnlfdGlsZXMgPSBmYWxzZTtcblxuICAgICAgICB0aGlzLnRtcyA9IChzb3VyY2UudG1zID09PSB0cnVlKTsgLy8gb3B0aW9uYWxseSBmbGlwIHRpbGUgY29vcmRzIGZvciBUTVNcbiAgICAgICAgdGhpcy51cmxfaG9zdHMgPSBudWxsO1xuICAgICAgICB2YXIgaG9zdF9tYXRjaCA9IHRoaXMudXJsLm1hdGNoKC97czpcXFsoW159K10rKVxcXX0vKTtcbiAgICAgICAgaWYgKGhvc3RfbWF0Y2ggIT0gbnVsbCAmJiBob3N0X21hdGNoLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgICAgIHRoaXMudXJsX2hvc3RzID0gaG9zdF9tYXRjaFsxXS5zcGxpdCgnLCcpO1xuICAgICAgICAgICAgdGhpcy5uZXh0X2hvc3QgPSAwO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gR2V0IGJvdW5kcyBmcm9tIHNvdXJjZSBjb25maWcgcGFyYW1ldGVyc1xuICAgIHBhcnNlQm91bmRzIChzb3VyY2UpIHtcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoc291cmNlLmJvdW5kcykgJiYgc291cmNlLmJvdW5kcy5sZW5ndGggPT09IDQpIHtcbiAgICAgICAgICAgIHRoaXMuYm91bmRzID0gc291cmNlLmJvdW5kcztcbiAgICAgICAgICAgIGxldCBbdywgcywgZSwgbl0gPSB0aGlzLmJvdW5kcztcbiAgICAgICAgICAgIHRoaXMuYm91bmRzX21ldGVycyA9IHtcbiAgICAgICAgICAgICAgICBtaW46IEdlby5sYXRMbmdUb01ldGVycyhbdywgbl0pLFxuICAgICAgICAgICAgICAgIG1heDogR2VvLmxhdExuZ1RvTWV0ZXJzKFtlLCBzXSksXG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgdGhpcy5ib3VuZHNfdGlsZXMgPSB7IG1pbjoge30sIG1heDoge30gfTsgLy8gbWF4IHRpbGUgYm91bmRzIHBlciB6b29tIChsYXppbHkgZXZhbHVhdGVkKVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gUmV0dXJucyBmYWxzZSBpZiB0aWxlIGlzIG91dHNpZGUgZGF0YSBzb3VyY2UncyBib3VuZHMsIHRydWUgaWYgd2l0aGluXG4gICAgY2hlY2tCb3VuZHMgKGNvb3Jkcykge1xuICAgICAgICAvLyBDaGVjayB0aWxlIGJvdW5kc1xuICAgICAgICBpZiAodGhpcy5ib3VuZHMpIHtcbiAgICAgICAgICAgIGNvb3JkcyA9IEdlby53cmFwVGlsZShjb29yZHMsIHsgeDogdHJ1ZSB9KTtcblxuICAgICAgICAgICAgbGV0IG1pbiA9IHRoaXMuYm91bmRzX3RpbGVzLm1pbltjb29yZHMuel07XG4gICAgICAgICAgICBpZiAoIW1pbikge1xuICAgICAgICAgICAgICAgIG1pbiA9IHRoaXMuYm91bmRzX3RpbGVzLm1pbltjb29yZHMuel0gPSBHZW8udGlsZUZvck1ldGVycyh0aGlzLmJvdW5kc19tZXRlcnMubWluLCBjb29yZHMueik7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGxldCBtYXggPSB0aGlzLmJvdW5kc190aWxlcy5tYXhbY29vcmRzLnpdO1xuICAgICAgICAgICAgaWYgKCFtYXgpIHtcbiAgICAgICAgICAgICAgICBtYXggPSB0aGlzLmJvdW5kc190aWxlcy5tYXhbY29vcmRzLnpdID0gR2VvLnRpbGVGb3JNZXRlcnModGhpcy5ib3VuZHNfbWV0ZXJzLm1heCwgY29vcmRzLnopO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoY29vcmRzLnggPCBtaW4ueCB8fCBjb29yZHMueCA+IG1heC54IHx8XG4gICAgICAgICAgICAgICAgY29vcmRzLnkgPCBtaW4ueSB8fCBjb29yZHMueSA+IG1heC55KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIGluY2x1ZGVzVGlsZSAoY29vcmRzLCBzdHlsZV96b29tKSB7XG4gICAgICAgIGlmICghc3VwZXIuaW5jbHVkZXNUaWxlKGNvb3Jkcywgc3R5bGVfem9vbSkpIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENoZWNrIHRpbGUgYm91bmRzXG4gICAgICAgIGlmICghdGhpcy5jaGVja0JvdW5kcyhjb29yZHMpKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgZm9ybWF0VXJsKHVybF90ZW1wbGF0ZSwgdGlsZSkge1xuICAgICAgICBsZXQgY29vcmRzID0gR2VvLndyYXBUaWxlKHRpbGUuY29vcmRzLCB7IHg6IHRydWUgfSk7XG5cbiAgICAgICAgaWYgKHRoaXMudG1zKSB7XG4gICAgICAgICAgICBjb29yZHMueSA9IE1hdGgucG93KDIsIGNvb3Jkcy56KSAtIDEgLSBjb29yZHMueTsgLy8gb3B0aW9uYWxseSBmbGlwIHRpbGUgY29vcmRzIGZvciBUTVNcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCB1cmwgPSB1cmxfdGVtcGxhdGUucmVwbGFjZSgne3h9JywgY29vcmRzLngpLnJlcGxhY2UoJ3t5fScsIGNvb3Jkcy55KS5yZXBsYWNlKCd7en0nLCBjb29yZHMueik7XG5cbiAgICAgICAgaWYgKHRoaXMudXJsX2hvc3RzICE9IG51bGwpIHtcbiAgICAgICAgICAgIHVybCA9IHVybC5yZXBsYWNlKC97czpcXFsoW159K10rKVxcXX0vLCB0aGlzLnVybF9ob3N0c1t0aGlzLm5leHRfaG9zdF0pO1xuICAgICAgICAgICAgdGhpcy5uZXh0X2hvc3QgPSAodGhpcy5uZXh0X2hvc3QgKyAxKSAlIHRoaXMudXJsX2hvc3RzLmxlbmd0aDtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdXJsO1xuICAgIH1cblxuICAgIC8vIENoZWNrcyBmb3IgdGhlIHgveS96IHRpbGUgcGF0dGVybiBpbiBVUkwgdGVtcGxhdGVcbiAgICB1cmxIYXNUaWxlUGF0dGVybih1cmwpIHtcbiAgICAgICAgcmV0dXJuIHVybCAmJlxuICAgICAgICAgICAgdXJsLnNlYXJjaCgne3h9JykgPiAtMSAmJlxuICAgICAgICAgICAgdXJsLnNlYXJjaCgne3l9JykgPiAtMSAmJlxuICAgICAgICAgICAgdXJsLnNlYXJjaCgne3p9JykgPiAtMTtcbiAgICB9XG5cbn1cbiIsImltcG9ydCBsb2cgZnJvbSAnLi4vdXRpbHMvbG9nJztcbmltcG9ydCBEYXRhU291cmNlLCB7TmV0d29ya1NvdXJjZSwgTmV0d29ya1RpbGVTb3VyY2V9IGZyb20gJy4vZGF0YV9zb3VyY2UnO1xuaW1wb3J0IHtkZWNvZGVNdWx0aVBvbHlnb259IGZyb20gJy4vbXZ0JztcbmltcG9ydCBHZW8gZnJvbSAnLi4vZ2VvJztcblxuLy8gRm9yIHRpbGluZyBHZW9KU09OIGNsaWVudC1zaWRlXG5pbXBvcnQgZ2VvanNvbnZ0IGZyb20gJ2dlb2pzb24tdnQnO1xuXG4vKipcbiBHZW9KU09OIHN0YW5kYWxvbmUgKG5vbi10aWxlZCkgc291cmNlXG4gVXNlcyBnZW9qc29uLXZ0IHNwbGl0IGludG8gdGlsZXMgY2xpZW50LXNpZGVcbiovXG5cbmV4cG9ydCBjbGFzcyBHZW9KU09OU291cmNlIGV4dGVuZHMgTmV0d29ya1NvdXJjZSB7XG5cbiAgICBjb25zdHJ1Y3Rvcihzb3VyY2UsIHNvdXJjZXMpIHtcbiAgICAgICAgc3VwZXIoc291cmNlLCBzb3VyY2VzKTtcbiAgICAgICAgdGhpcy5sb2FkX2RhdGEgPSBudWxsO1xuICAgICAgICB0aGlzLnRpbGVfaW5kZXhlcyA9IHt9OyAvLyBnZW9qc29uLXZ0IHRpbGUgaW5kaWNlcywgYnkgbGF5ZXIgbmFtZVxuICAgICAgICB0aGlzLm1heF96b29tID0gTWF0aC5tYXgodGhpcy5tYXhfem9vbSB8fCAwLCAxNSk7IC8vIFRPRE86IG1heCB6b29tIDwgMTUgY2F1c2VzIGFydGlmYWN0cy9uby1kcmF3IGF0IDIwLCBpbnZlc3RpZ2F0ZVxuICAgICAgICB0aGlzLnBhZF9zY2FsZSA9IDA7IC8vIHdlIGRvbid0IHdhbnQgcGFkZGluZyBvbiBhdXRvLXRpbGVkIHNvdXJjZXNcbiAgICB9XG5cbiAgICBfbG9hZChkZXN0KSB7XG4gICAgICAgIGlmICghdGhpcy5sb2FkX2RhdGEpIHtcbiAgICAgICAgICAgIHRoaXMubG9hZF9kYXRhID0gc3VwZXIuX2xvYWQoeyBzb3VyY2VfZGF0YTogeyBsYXllcnM6IHt9IH0gfSkudGhlbihkYXRhID0+IHtcbiAgICAgICAgICAgICAgICAvLyBXYXJuIGFuZCBjb250aW51ZSBvbiBkYXRhIHNvdXJjZSBlcnJvclxuICAgICAgICAgICAgICAgIGlmIChkYXRhLnNvdXJjZV9kYXRhLmVycm9yKSB7XG4gICAgICAgICAgICAgICAgICAgIGxvZygnd2FybicsIGBkYXRhIHNvdXJjZSBsb2FkIGVycm9yKHMpIGZvciBzb3VyY2UgJyR7dGhpcy5uYW1lfScsIFVSTCAnJHt0aGlzLnVybH0nOiAke2RhdGEuc291cmNlX2RhdGEuZXJyb3J9YCk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgbGV0IGxheWVycyA9IGRhdGEuc291cmNlX2RhdGEubGF5ZXJzO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IGxheWVyX25hbWUgaW4gbGF5ZXJzKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudGlsZV9pbmRleGVzW2xheWVyX25hbWVdID0gZ2VvanNvbnZ0KGxheWVyc1tsYXllcl9uYW1lXSwge1xuICAgICAgICAgICAgICAgICAgICAgICAgbWF4Wm9vbTogdGhpcy5tYXhfem9vbSwgIC8vIG1heCB6b29tIHRvIHByZXNlcnZlIGRldGFpbCBvblxuICAgICAgICAgICAgICAgICAgICAgICAgdG9sZXJhbmNlOiAzLCAvLyBzaW1wbGlmaWNhdGlvbiB0b2xlcmFuY2UgKGhpZ2hlciBtZWFucyBzaW1wbGVyKVxuICAgICAgICAgICAgICAgICAgICAgICAgZXh0ZW50OiBHZW8udGlsZV9zY2FsZSwgLy8gdGlsZSBleHRlbnQgKGJvdGggd2lkdGggYW5kIGhlaWdodClcbiAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlcjogMC4wMDAxICAgICAvLyB0aWxlIGJ1ZmZlciBvbiBlYWNoIHNpZGVcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgdGhpcy5sb2FkZWQgPSB0cnVlO1xuICAgICAgICAgICAgICAgIHJldHVybiBkYXRhO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy5sb2FkX2RhdGEudGhlbigoKSA9PiB7XG4gICAgICAgICAgICBmb3IgKGxldCBsYXllcl9uYW1lIGluIHRoaXMudGlsZV9pbmRleGVzKSB7XG4gICAgICAgICAgICAgICAgZGVzdC5zb3VyY2VfZGF0YS5sYXllcnNbbGF5ZXJfbmFtZV0gPSB0aGlzLmdldFRpbGVGZWF0dXJlcyhkZXN0LCBsYXllcl9uYW1lKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBkZXN0O1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBnZXRUaWxlRmVhdHVyZXModGlsZSwgbGF5ZXJfbmFtZSkge1xuICAgICAgICBsZXQgY29vcmRzID0gR2VvLndyYXBUaWxlKHRpbGUuY29vcmRzLCB7IHg6IHRydWUgfSk7XG5cbiAgICAgICAgLy8gcmVxdWVzdCBhIHBhcnRpY3VsYXIgdGlsZVxuICAgICAgICBsZXQgdCA9IHRoaXMudGlsZV9pbmRleGVzW2xheWVyX25hbWVdLmdldFRpbGUoY29vcmRzLnosIGNvb3Jkcy54LCBjb29yZHMueSk7XG5cbiAgICAgICAgLy8gQ29udmVydCBmcm9tIE1WVC1zdHlsZSBKU09OIHN0cnVjdCB0byBHZW9KU09OXG4gICAgICAgIGxldCBjb2xsZWN0aW9uO1xuICAgICAgICBpZiAodCAmJiB0LmZlYXR1cmVzKSB7XG4gICAgICAgICAgICBjb2xsZWN0aW9uID0ge1xuICAgICAgICAgICAgICAgIHR5cGU6ICdGZWF0dXJlQ29sbGVjdGlvbicsXG4gICAgICAgICAgICAgICAgZmVhdHVyZXM6IFtdXG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICBmb3IgKGxldCBpPTA7IGkgPCB0LmZlYXR1cmVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgY29uc3QgZmVhdHVyZSA9IHQuZmVhdHVyZXNbaV07XG5cbiAgICAgICAgICAgICAgICAvLyBHZW9KU09OIGZlYXR1cmVcbiAgICAgICAgICAgICAgICBsZXQgZiA9IHtcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogJ0ZlYXR1cmUnLFxuICAgICAgICAgICAgICAgICAgICBnZW9tZXRyeToge30sXG4gICAgICAgICAgICAgICAgICAgIHByb3BlcnRpZXM6IGZlYXR1cmUudGFnc1xuICAgICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgICBpZiAoZmVhdHVyZS50eXBlID09PSAxKSB7XG4gICAgICAgICAgICAgICAgICAgIGYuZ2VvbWV0cnkuY29vcmRpbmF0ZXMgPSBmZWF0dXJlLmdlb21ldHJ5Lm1hcChjb29yZCA9PiBbY29vcmRbMF0sIGNvb3JkWzFdXSk7XG4gICAgICAgICAgICAgICAgICAgIGYuZ2VvbWV0cnkudHlwZSA9ICdNdWx0aVBvaW50JztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSBpZiAoZmVhdHVyZS50eXBlID09PSAyIHx8IGZlYXR1cmUudHlwZSA9PT0gMykge1xuICAgICAgICAgICAgICAgICAgICBmLmdlb21ldHJ5LmNvb3JkaW5hdGVzID0gZmVhdHVyZS5nZW9tZXRyeS5tYXAocmluZyA9PlxuICAgICAgICAgICAgICAgICAgICAgICAgcmluZy5tYXAoY29vcmQgPT4gW2Nvb3JkWzBdLCBjb29yZFsxXV0pXG4gICAgICAgICAgICAgICAgICAgICk7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKGZlYXR1cmUudHlwZSA9PT0gMikge1xuICAgICAgICAgICAgICAgICAgICAgICAgZi5nZW9tZXRyeS50eXBlID0gJ011bHRpTGluZVN0cmluZyc7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSAge1xuICAgICAgICAgICAgICAgICAgICAgICAgZi5nZW9tZXRyeSA9IGRlY29kZU11bHRpUG9seWdvbihmLmdlb21ldHJ5KTsgLy8gdW4tZmxhdHRlbiByaW5nc1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGYuZ2VvbWV0cnkgPT0gbnVsbCkgeyAvLyBza2lwIHBvbHlzIHRoYXQgY291bGRuJ3QgYmUgZGVjb2RlZCAoZS5nLiBkZWdlbmVyYXRlKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBjb2xsZWN0aW9uLmZlYXR1cmVzLnB1c2goZik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gY29sbGVjdGlvbjtcbiAgICB9XG5cbiAgICBmb3JtYXRVcmwgKGRlc3QpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudXJsO1xuICAgIH1cblxuICAgIHBhcnNlU291cmNlRGF0YSAodGlsZSwgc291cmNlLCByZXNwb25zZSkge1xuICAgICAgICBsZXQgcGFyc2VkX3Jlc3BvbnNlID0gSlNPTi5wYXJzZShyZXNwb25zZSk7XG4gICAgICAgIGxldCBsYXllcnMgPSB0aGlzLmdldExheWVycyhwYXJzZWRfcmVzcG9uc2UpO1xuICAgICAgICBzb3VyY2UubGF5ZXJzID0gdGhpcy5wcmVwcm9jZXNzTGF5ZXJzKGxheWVycyk7XG4gICAgfVxuXG4gICAgcHJlcHJvY2Vzc0xheWVycyAobGF5ZXJzKXtcbiAgICAgICAgZm9yIChsZXQga2V5IGluIGxheWVycykge1xuICAgICAgICAgICAgbGV0IGxheWVyID0gbGF5ZXJzW2tleV07XG4gICAgICAgICAgICB0aGlzLnByZXByb2Nlc3NGZWF0dXJlcyhsYXllci5mZWF0dXJlcyk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBBcHBseSBvcHRpb25hbCBkYXRhIHRyYW5zZm9ybVxuICAgICAgICBpZiAodHlwZW9mIHRoaXMudHJhbnNmb3JtID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICBpZiAoT2JqZWN0LmtleXMobGF5ZXJzKS5sZW5ndGggPT09IDEgJiYgbGF5ZXJzLl9kZWZhdWx0KSB7XG4gICAgICAgICAgICAgICAgbGF5ZXJzLl9kZWZhdWx0ID0gdGhpcy50cmFuc2Zvcm0obGF5ZXJzLl9kZWZhdWx0LCB0aGlzLmV4dHJhX2RhdGEpOyAvLyBzaW5nbGUtbGF5ZXJcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGxheWVycyA9IHRoaXMudHJhbnNmb3JtKGxheWVycywgdGhpcy5leHRyYV9kYXRhKTsgLy8gbXVsdGlwbGUgbGF5ZXJzXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gbGF5ZXJzO1xuICAgIH1cblxuICAgIC8vIFByZXByb2Nlc3MgZmVhdHVyZXMuIEN1cnJlbnRseSB1c2VkIHRvIGFkZCBhIG5ldyBcImNlbnRyb2lkXCIgZmVhdHVyZSBmb3IgcG9seWdvbiBsYWJlbGluZ1xuICAgIHByZXByb2Nlc3NGZWF0dXJlcyAoZmVhdHVyZXMpIHtcbiAgICAgICAgLy8gRGVmaW5lIGNlbnRyb2lkcyBmb3IgcG9seWdvbnMgZm9yIGNlbnRyb2lkIGxhYmVsIHBsYWNlbWVudFxuICAgICAgICAvLyBBdm9pZHMgcmVkdW5kYW50IGxhYmVsIHBsYWNlbWVudCBmb3IgZWFjaCBnZW5lcmF0ZWQgdGlsZSBhdCBoaWdoZXIgem9vbSBsZXZlbHNcbiAgICAgICAgaWYgKHRoaXMuY29uZmlnLmdlbmVyYXRlX2xhYmVsX2NlbnRyb2lkcyl7XG4gICAgICAgICAgICBsZXQgZmVhdHVyZXNfY2VudHJvaWQgPSBbXTtcbiAgICAgICAgICAgIGxldCBjZW50cm9pZF9wcm9wZXJ0aWVzID0ge1wibGFiZWxfcGxhY2VtZW50XCIgOiB0cnVlfTtcblxuICAgICAgICAgICAgZmVhdHVyZXMuZm9yRWFjaChmZWF0dXJlID0+IHtcbiAgICAgICAgICAgICAgICBsZXQgY29vcmRpbmF0ZXMsIGNlbnRyb2lkX2ZlYXR1cmU7XG4gICAgICAgICAgICAgICAgc3dpdGNoIChmZWF0dXJlLmdlb21ldHJ5LnR5cGUpIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAnUG9seWdvbic6XG4gICAgICAgICAgICAgICAgICAgICAgICBjb29yZGluYXRlcyA9IGZlYXR1cmUuZ2VvbWV0cnkuY29vcmRpbmF0ZXM7XG4gICAgICAgICAgICAgICAgICAgICAgICBjZW50cm9pZF9mZWF0dXJlID0gZ2V0Q2VudHJvaWRGZWF0dXJlRm9yUG9seWdvbihjb29yZGluYXRlcywgZmVhdHVyZS5wcm9wZXJ0aWVzLCBjZW50cm9pZF9wcm9wZXJ0aWVzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZlYXR1cmVzX2NlbnRyb2lkLnB1c2goY2VudHJvaWRfZmVhdHVyZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAnTXVsdGlQb2x5Z29uJzpcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEFkZCBjZW50cm9pZCBmZWF0dXJlIGZvciBsYXJnZXN0IHBvbHlnb25cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvb3JkaW5hdGVzID0gZmVhdHVyZS5nZW9tZXRyeS5jb29yZGluYXRlcztcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBtYXhfYXJlYSA9IC1JbmZpbml0eTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBtYXhfYXJlYV9pbmRleCA9IDA7XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBpbmRleCA9IDA7IGluZGV4IDwgY29vcmRpbmF0ZXMubGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGFyZWEgPSBHZW8ucG9seWdvbkFyZWEoY29vcmRpbmF0ZXNbaW5kZXhdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYXJlYSA+IG1heF9hcmVhKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heF9hcmVhID0gYXJlYTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4X2FyZWFfaW5kZXggPSBpbmRleDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBjZW50cm9pZF9mZWF0dXJlID0gZ2V0Q2VudHJvaWRGZWF0dXJlRm9yUG9seWdvbihjb29yZGluYXRlc1ttYXhfYXJlYV9pbmRleF0sIGZlYXR1cmUucHJvcGVydGllcywgY2VudHJvaWRfcHJvcGVydGllcyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBmZWF0dXJlc19jZW50cm9pZC5wdXNoKGNlbnRyb2lkX2ZlYXR1cmUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIC8vIGFwcGVuZCBjZW50cm9pZCBmZWF0dXJlcyB0byBmZWF0dXJlcyBhcnJheVxuICAgICAgICAgICAgQXJyYXkucHJvdG90eXBlLnB1c2guYXBwbHkoZmVhdHVyZXMsIGZlYXR1cmVzX2NlbnRyb2lkKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBmZWF0dXJlcztcbiAgICB9XG5cbiAgICAvLyBEZXRlY3Qgc2luZ2xlIG9yIG11bHRpcGxlIGxheWVycyBpbiByZXR1cm5lZCBkYXRhXG4gICAgZ2V0TGF5ZXJzIChkYXRhKSB7XG4gICAgICAgIGlmIChkYXRhLnR5cGUgPT09ICdGZWF0dXJlJykge1xuICAgICAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgICAgICBfZGVmYXVsdDoge1xuICAgICAgICAgICAgICAgICAgICB0eXBlOiAnRmVhdHVyZUNvbGxlY3Rpb24nLFxuICAgICAgICAgICAgICAgICAgICBmZWF0dXJlczogW2RhdGFdXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChkYXRhLnR5cGUgPT09ICdGZWF0dXJlQ29sbGVjdGlvbicpIHtcbiAgICAgICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICAgICAgX2RlZmF1bHQ6IGRhdGFcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gZGF0YTtcbiAgICAgICAgfVxuICAgIH1cblxufVxuXG4vKipcbiBHZW9KU09OIHZlY3RvciB0aWxlc1xuIEBjbGFzcyBHZW9KU09OVGlsZVNvdXJjZVxuKi9cbmV4cG9ydCBjbGFzcyBHZW9KU09OVGlsZVNvdXJjZSBleHRlbmRzIE5ldHdvcmtUaWxlU291cmNlIHtcblxuICAgIGNvbnN0cnVjdG9yKHNvdXJjZSwgc291cmNlcykge1xuICAgICAgICBzdXBlcihzb3VyY2UsIHNvdXJjZXMpO1xuXG4gICAgICAgIC8vIENoZWNrIGZvciBVUkwgdGlsZSBwYXR0ZXJuLCBpZiBub3QgZm91bmQsIHRyZWF0IGFzIHN0YW5kYWxvbmUgR2VvSlNPTi9Ub3BvSlNPTiBvYmplY3RcbiAgICAgICAgaWYgKCF0aGlzLnVybEhhc1RpbGVQYXR0ZXJuKHRoaXMudXJsKSkge1xuICAgICAgICAgICAgLy8gQ2hlY2sgaW5zdGFuY2UgdHlwZSBmcm9tIHBhcmVudCBjbGFzc1xuICAgICAgICAgICAgaWYgKHNvdXJjZS50eXBlID09PSAnR2VvSlNPTicpIHtcbiAgICAgICAgICAgICAgICAvLyBSZXBsYWNlIGluc3RhbmNlIHR5cGVcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEdlb0pTT05Tb3VyY2Uoc291cmNlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIFBhc3MgYmFjayB0byBwYXJlbnQgY2xhc3MgdG8gaW5zdGFudGlhdGVcbiAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcztcbiAgICB9XG5cbiAgICBwYXJzZVNvdXJjZURhdGEgKHRpbGUsIHNvdXJjZSwgcmVzcG9uc2UpIHtcbiAgICAgICAgbGV0IGRhdGEgPSBKU09OLnBhcnNlKHJlc3BvbnNlKTtcbiAgICAgICAgdGhpcy5wcmVwYXJlR2VvSlNPTihkYXRhLCB0aWxlLCBzb3VyY2UpO1xuICAgIH1cblxuICAgIHByZXBhcmVHZW9KU09OIChkYXRhLCB0aWxlLCBzb3VyY2UpIHtcbiAgICAgICAgLy8gQXBwbHkgb3B0aW9uYWwgZGF0YSB0cmFuc2Zvcm1cbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLnRyYW5zZm9ybSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgZGF0YSA9IHRoaXMudHJhbnNmb3JtKGRhdGEsIHRoaXMuZXh0cmFfZGF0YSk7XG4gICAgICAgIH1cblxuICAgICAgICBzb3VyY2UubGF5ZXJzID0gR2VvSlNPTlNvdXJjZS5wcm90b3R5cGUuZ2V0TGF5ZXJzKGRhdGEpO1xuXG4gICAgICAgIC8vIEEgXCJzeW50aGV0aWNcIiB0aWxlIHRoYXQgYWRqdXN0cyB0aGUgdGlsZSBtaW4gYW5jaG9yIHRvIGFjY291bnQgZm9yIHRpbGUgbG9uZ2l0dWRlIHdyYXBwaW5nXG4gICAgICAgIGxldCBhbmNob3IgPSB7XG4gICAgICAgICAgICBjb29yZHM6IHRpbGUuY29vcmRzLFxuICAgICAgICAgICAgbWluOiBHZW8ubWV0ZXJzRm9yVGlsZShHZW8ud3JhcFRpbGUodGlsZS5jb29yZHMsIHsgeDogdHJ1ZSB9KSlcbiAgICAgICAgfTtcblxuICAgICAgICBEYXRhU291cmNlLnByb2plY3REYXRhKHNvdXJjZSk7IC8vIG1lcmNhdG9yIHByb2plY3Rpb25cbiAgICAgICAgRGF0YVNvdXJjZS5zY2FsZURhdGEoc291cmNlLCBhbmNob3IpOyAvLyByZS1zY2FsZSBmcm9tIG1ldGVycyB0byBsb2NhbCB0aWxlIGNvb3Jkc1xuICAgIH1cblxufVxuXG5EYXRhU291cmNlLnJlZ2lzdGVyKEdlb0pTT05UaWxlU291cmNlLCAnR2VvSlNPTicpOyAgICAgIC8vIHByZWZlcmVkIHNob3J0ZXIgbmFtZVxuXG4vLyBIZWxwZXIgZnVuY3Rpb24gdG8gY3JlYXRlIGNlbnRyb2lkIHBvaW50IGZlYXR1cmUgZnJvbSBwb2x5Z29uIGNvb3JkaW5hdGVzIGFuZCBwcm92aWRlZCBmZWF0dXJlIG1ldGEtZGF0YVxuZnVuY3Rpb24gZ2V0Q2VudHJvaWRGZWF0dXJlRm9yUG9seWdvbiAoY29vcmRpbmF0ZXMsIHByb3BlcnRpZXMsIG5ld1Byb3BlcnRpZXMpIHtcbiAgICBsZXQgY2VudHJvaWQgPSBHZW8uY2VudHJvaWQoY29vcmRpbmF0ZXMpO1xuXG4gICAgLy8gY2xvbmUgcHJvcGVydGllcyBhbmQgbWl4aXggbmV3UHJvcGVydGllc1xuICAgIGxldCBjZW50cm9pZF9wcm9wZXJ0aWVzID0ge307XG4gICAgT2JqZWN0LmFzc2lnbihjZW50cm9pZF9wcm9wZXJ0aWVzLCBwcm9wZXJ0aWVzLCBuZXdQcm9wZXJ0aWVzKTtcblxuICAgIHJldHVybiB7XG4gICAgICAgIHR5cGU6IFwiRmVhdHVyZVwiLFxuICAgICAgICBwcm9wZXJ0aWVzOiBjZW50cm9pZF9wcm9wZXJ0aWVzLFxuICAgICAgICBnZW9tZXRyeToge1xuICAgICAgICAgICAgdHlwZTogXCJQb2ludFwiLFxuICAgICAgICAgICAgY29vcmRpbmF0ZXM6IGNlbnRyb2lkXG4gICAgICAgIH1cbiAgICB9O1xufVxuIiwiaW1wb3J0IERhdGFTb3VyY2UsIHtOZXR3b3JrVGlsZVNvdXJjZX0gZnJvbSAnLi9kYXRhX3NvdXJjZSc7XG5pbXBvcnQgR2VvIGZyb20gJy4uL2dlbyc7XG5cbmltcG9ydCBQYmYgZnJvbSAncGJmJztcbmltcG9ydCB7VmVjdG9yVGlsZSwgVmVjdG9yVGlsZUZlYXR1cmV9IGZyb20gJ3ZlY3Rvci10aWxlJztcblxuLyoqXG4gTWFwYm94IFZlY3RvciBUaWxlIGZvcm1hdFxuIEBjbGFzcyBNVlRTb3VyY2VcbiovXG5leHBvcnQgY2xhc3MgTVZUU291cmNlIGV4dGVuZHMgTmV0d29ya1RpbGVTb3VyY2Uge1xuXG4gICAgY29uc3RydWN0b3IgKHNvdXJjZSwgc291cmNlcykge1xuICAgICAgICBzdXBlcihzb3VyY2UsIHNvdXJjZXMpO1xuICAgICAgICB0aGlzLnJlc3BvbnNlX3R5cGUgPSBcImFycmF5YnVmZmVyXCI7IC8vIGJpbmFyeSBkYXRhXG4gICAgfVxuXG4gICAgcGFyc2VTb3VyY2VEYXRhICh0aWxlLCBzb3VyY2UsIHJlc3BvbnNlKSB7XG4gICAgICAgIC8vIENvbnZlcnQgTWFwYm94IHZlY3RvciB0aWxlIHRvIEdlb0pTT05cbiAgICAgICAgdmFyIGRhdGEgPSBuZXcgVWludDhBcnJheShyZXNwb25zZSk7XG4gICAgICAgIHZhciBidWZmZXIgPSBuZXcgUGJmKGRhdGEpO1xuICAgICAgICBzb3VyY2UuZGF0YSA9IG5ldyBWZWN0b3JUaWxlKGJ1ZmZlcik7XG4gICAgICAgIHNvdXJjZS5sYXllcnMgPSB0aGlzLnRvR2VvSlNPTihzb3VyY2UuZGF0YSk7XG5cbiAgICAgICAgLy8gQXBwbHkgb3B0aW9uYWwgZGF0YSB0cmFuc2Zvcm1cbiAgICAgICAgaWYgKHR5cGVvZiB0aGlzLnRyYW5zZm9ybSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgc291cmNlLmxheWVycyA9IHRoaXMudHJhbnNmb3JtKHNvdXJjZS5sYXllcnMsIHRoaXMuZXh0cmFfZGF0YSk7XG4gICAgICAgIH1cblxuICAgICAgICBkZWxldGUgc291cmNlLmRhdGE7IC8vIGNvbW1lbnQgb3V0IHRvIHNhdmUgcmF3IGRhdGEgZm9yIGRlYnVnZ2luZ1xuICAgIH1cblxuICAgIC8vIExvb3AgdGhyb3VnaCBsYXllcnMvZmVhdHVyZXMgdXNpbmcgTWFwYm94IGxpYiBBUEksIGNvbnZlcnQgdG8gR2VvSlNPTiBmZWF0dXJlc1xuICAgIC8vIFJldHVybnMgYW4gb2JqZWN0IHdpdGgga2V5cyBmb3IgZWFjaCBsYXllciwgZS5nLiB7IGxheWVyOiBnZW9qc29uIH1cbiAgICB0b0dlb0pTT04gKHRpbGUpIHtcbiAgICAgICAgdmFyIGxheWVycyA9IHt9O1xuICAgICAgICBmb3IgKHZhciBsIGluIHRpbGUubGF5ZXJzKSB7XG4gICAgICAgICAgICB2YXIgbGF5ZXIgPSB0aWxlLmxheWVyc1tsXTtcbiAgICAgICAgICAgIHZhciBsYXllcl9nZW9qc29uID0ge1xuICAgICAgICAgICAgICAgIHR5cGU6ICdGZWF0dXJlQ29sbGVjdGlvbicsXG4gICAgICAgICAgICAgICAgZmVhdHVyZXM6IFtdXG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICBmb3IgKHZhciBmPTA7IGYgPCBsYXllci5sZW5ndGg7IGYrKykge1xuICAgICAgICAgICAgICAgIHZhciBmZWF0dXJlID0gbGF5ZXIuZmVhdHVyZShmKTtcbiAgICAgICAgICAgICAgICB2YXIgZmVhdHVyZV9nZW9qc29uID0ge1xuICAgICAgICAgICAgICAgICAgICB0eXBlOiAnRmVhdHVyZScsXG4gICAgICAgICAgICAgICAgICAgIGdlb21ldHJ5OiB7fSxcbiAgICAgICAgICAgICAgICAgICAgcHJvcGVydGllczogZmVhdHVyZS5wcm9wZXJ0aWVzXG4gICAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgICAgIHZhciBnZW9tZXRyeSA9IGZlYXR1cmVfZ2VvanNvbi5nZW9tZXRyeTtcbiAgICAgICAgICAgICAgICB2YXIgY29vcmRpbmF0ZXMgPSBmZWF0dXJlLmxvYWRHZW9tZXRyeSgpO1xuICAgICAgICAgICAgICAgIGZvciAodmFyIHI9MDsgciA8IGNvb3JkaW5hdGVzLmxlbmd0aDsgcisrKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciByaW5nID0gY29vcmRpbmF0ZXNbcl07XG4gICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGM9MDsgYyA8IHJpbmcubGVuZ3RoOyBjKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJpbmdbY10gPSBbXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmluZ1tjXS54LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJpbmdbY10ueVxuICAgICAgICAgICAgICAgICAgICAgICAgXTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBnZW9tZXRyeS5jb29yZGluYXRlcyA9IGNvb3JkaW5hdGVzO1xuXG4gICAgICAgICAgICAgICAgaWYgKFZlY3RvclRpbGVGZWF0dXJlLnR5cGVzW2ZlYXR1cmUudHlwZV0gPT09ICdQb2ludCcpIHtcbiAgICAgICAgICAgICAgICAgICAgZ2VvbWV0cnkudHlwZSA9ICdQb2ludCc7XG4gICAgICAgICAgICAgICAgICAgIGdlb21ldHJ5LmNvb3JkaW5hdGVzID0gZ2VvbWV0cnkuY29vcmRpbmF0ZXNbMF1bMF07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKFZlY3RvclRpbGVGZWF0dXJlLnR5cGVzW2ZlYXR1cmUudHlwZV0gPT09ICdMaW5lU3RyaW5nJykge1xuICAgICAgICAgICAgICAgICAgICBpZiAoY29vcmRpbmF0ZXMubGVuZ3RoID09PSAxKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBnZW9tZXRyeS50eXBlID0gJ0xpbmVTdHJpbmcnO1xuICAgICAgICAgICAgICAgICAgICAgICAgZ2VvbWV0cnkuY29vcmRpbmF0ZXMgPSBnZW9tZXRyeS5jb29yZGluYXRlc1swXTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGdlb21ldHJ5LnR5cGUgPSAnTXVsdGlMaW5lU3RyaW5nJztcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIGlmIChWZWN0b3JUaWxlRmVhdHVyZS50eXBlc1tmZWF0dXJlLnR5cGVdID09PSAnUG9seWdvbicpIHtcbiAgICAgICAgICAgICAgICAgICAgZ2VvbWV0cnkgPSBkZWNvZGVNdWx0aVBvbHlnb24oZ2VvbWV0cnkpOyAvLyB1bi1mbGF0dGVuIHJpbmdzXG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgbGF5ZXJfZ2VvanNvbi5mZWF0dXJlcy5wdXNoKGZlYXR1cmVfZ2VvanNvbik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBsYXllcnNbbF0gPSBsYXllcl9nZW9qc29uO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBsYXllcnM7XG4gICAgfVxuXG59XG5cbi8vIERlY29kZSBtdWx0aXBvbHlnb25zLCB3aGljaCBhcmUgZW5jb2RlZCBhcyBhIHNpbmdsZSBzZXQgb2YgcmluZ3Ncbi8vIFdpbmRpbmcgb3JkZXIgb2YgZmlyc3QgcmluZyBpcyBhc3N1bWVkIHRvIGluZGljYXRlIGV4dGVyaW9yIHJpbmcsXG4vLyB0aGUgb3Bwb3NpdGUgd2luZGluZyBvcmRlciBpbmRpY2F0ZXMgdGhlIHN0YXJ0IG9mIGEgbmV3IHBvbHlnb24uXG5leHBvcnQgZnVuY3Rpb24gZGVjb2RlTXVsdGlQb2x5Z29uIChnZW9tKSB7XG4gICAgbGV0IHBvbHlzID0gW107XG4gICAgbGV0IHBvbHkgPSBbXTtcbiAgICBsZXQgb3V0ZXJfd2luZGluZztcbiAgICBmb3IgKGxldCByPTA7IHIgPCBnZW9tLmNvb3JkaW5hdGVzLmxlbmd0aDsgcisrKSB7XG4gICAgICAgIGxldCByaW5nID0gZ2VvbS5jb29yZGluYXRlc1tyXTtcbiAgICAgICAgbGV0IHdpbmRpbmcgPSBHZW8ucmluZ1dpbmRpbmcocmluZyk7XG4gICAgICAgIGlmICh3aW5kaW5nID09IG51bGwpIHtcbiAgICAgICAgICAgIGNvbnRpbnVlOyAvLyBza2lwIHplcm8tYXJlYSByaW5nc1xuICAgICAgICB9XG5cbiAgICAgICAgb3V0ZXJfd2luZGluZyA9IG91dGVyX3dpbmRpbmcgfHwgd2luZGluZzsgLy8gYXNzdW1lIGZpcnN0IHJpbmcgaW5kaWNhdGVzIG91dGVyIHJpbmcgd2luZGluZ1xuXG4gICAgICAgIGlmICh3aW5kaW5nID09PSBvdXRlcl93aW5kaW5nICYmIHBvbHkubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgcG9seXMucHVzaChwb2x5KTtcbiAgICAgICAgICAgIHBvbHkgPSBbXTtcbiAgICAgICAgfVxuICAgICAgICBwb2x5LnB1c2gocmluZyk7XG4gICAgfVxuICAgIGlmIChwb2x5Lmxlbmd0aCA+IDApIHtcbiAgICAgICAgcG9seXMucHVzaChwb2x5KTtcbiAgICB9XG5cbiAgICAvLyBTaW5nbGUgb3IgbXVsdGk/XG4gICAgaWYgKHBvbHlzLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICBnZW9tLnR5cGUgPSAnUG9seWdvbic7XG4gICAgICAgIGdlb20uY29vcmRpbmF0ZXMgPSBwb2x5c1swXTtcbiAgICB9XG4gICAgZWxzZSBpZiAocG9seXMubGVuZ3RoID4gMSkge1xuICAgICAgICBnZW9tLnR5cGUgPSAnTXVsdGlQb2x5Z29uJztcbiAgICAgICAgZ2VvbS5jb29yZGluYXRlcyA9IHBvbHlzO1xuICAgIH1cbiAgICBlbHNlIHtcbiAgICAgICAgZ2VvbSA9IG51bGw7XG4gICAgfVxuXG4gICAgcmV0dXJuIGdlb207XG59XG5cbkRhdGFTb3VyY2UucmVnaXN0ZXIoTVZUU291cmNlLCAnTVZUJyk7XG4iLCJpbXBvcnQgRGF0YVNvdXJjZSwge05ldHdvcmtUaWxlU291cmNlfSBmcm9tICcuL2RhdGFfc291cmNlJztcbmltcG9ydCBUaWxlIGZyb20gJy4uL3RpbGUnO1xuaW1wb3J0IEdlbyBmcm9tICcuLi9nZW8nO1xuXG5leHBvcnQgY2xhc3MgUmFzdGVyVGlsZVNvdXJjZSBleHRlbmRzIE5ldHdvcmtUaWxlU291cmNlIHtcblxuICAgIGNvbnN0cnVjdG9yKHNvdXJjZSwgc291cmNlcykge1xuICAgICAgICBzdXBlcihzb3VyY2UsIHNvdXJjZXMpO1xuXG4gICAgICAgIGlmICh0aGlzLnJhc3RlcnMuaW5kZXhPZih0aGlzLm5hbWUpID09PSAtMSkge1xuICAgICAgICAgICAgdGhpcy5yYXN0ZXJzLnVuc2hpZnQodGhpcy5uYW1lKTsgLy8gYWRkIHRoaXMgcmFzdGVyIGFzIHRoZSBmaXJzdFxuICAgICAgICB9XG4gICAgICAgIHRoaXMuZmlsdGVyaW5nID0gc291cmNlLmZpbHRlcmluZzsgLy8gb3B0aW9uYWwgdGV4dHVyZSBmaWx0ZXJpbmcgKG5lYXJlc3QsIGxpbmVhciwgbWlwbWFwKVxuXG4gICAgICAgIC8vIHNhdmUgdGV4dHVyZSBvYmplY3RzIGJ5IHRpbGUga2V5LCBzbyBVUkwgcmVtYWlucyBzdGFibGUgaWYgdGlsZSBpcyBidWlsdCBtdWx0aXBsZSB0aW1lcyxcbiAgICAgICAgLy8gZS5nLiBhdm9pZCByZS1sb2FkaW5nIHRoZSBzYW1lIHRpbGUgdGV4dHVyZSB1bmRlciBhIGRpZmZlcmVudCBzdWJkb21haW4gd2hlbiB1c2luZyB0aWxlIGhvc3RzXG4gICAgICAgIHRoaXMudGV4dHVyZXMgPSB7fTtcbiAgICB9XG5cbiAgICBsb2FkKHRpbGUpIHtcbiAgICAgICAgdGlsZS5zb3VyY2VfZGF0YSA9IHt9O1xuICAgICAgICB0aWxlLnNvdXJjZV9kYXRhLmxheWVycyA9IHt9O1xuICAgICAgICB0aWxlLnBhZF9zY2FsZSA9IHRoaXMucGFkX3NjYWxlO1xuICAgICAgICB0aWxlLnJhc3RlcnMgPSBbLi4udGhpcy5yYXN0ZXJzXTsgLy8gY29weSBsaXN0IG9mIHJhc3RlcnMgdG8gbG9hZCBmb3IgdGlsZVxuXG4gICAgICAgIC8vIEdlbmVyYXRlIGEgc2luZ2xlIHF1YWQgdGhhdCBmaWxscyB0aGUgZW50aXJlIHRpbGVcbiAgICAgICAgbGV0IHNjYWxlID0gR2VvLnRpbGVfc2NhbGU7XG4gICAgICAgIHRpbGUuc291cmNlX2RhdGEubGF5ZXJzID0ge1xuICAgICAgICAgICAgX2RlZmF1bHQ6IHtcbiAgICAgICAgICAgICAgICB0eXBlOiAnRmVhdHVyZUNvbGxlY3Rpb24nLFxuICAgICAgICAgICAgICAgIGZlYXR1cmVzOiBbe1xuICAgICAgICAgICAgICAgICAgICBnZW9tZXRyeToge1xuICAgICAgICAgICAgICAgICAgICAgICAgdHlwZTogJ1BvbHlnb24nLFxuICAgICAgICAgICAgICAgICAgICAgICAgY29vcmRpbmF0ZXM6IFtbXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgWzAsIDBdLCBbc2NhbGUsIDBdLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtzY2FsZSwgLXNjYWxlXSwgWzAsIC1zY2FsZV0sIFswLCAwXVxuICAgICAgICAgICAgICAgICAgICAgICAgXV1cbiAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgcHJvcGVydGllczoge31cbiAgICAgICAgICAgICAgICB9XVxuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuXG4gICAgICAgIHRpbGUuZGVmYXVsdF93aW5kaW5nID0gJ0NXJztcbiAgICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSh0aWxlKTtcbiAgICB9XG5cbiAgICAvLyBSZXR1cm4gdGV4dHVyZSBpbmZvIGZvciBhIHJhc3RlciB0aWxlXG4gICAgdGlsZVRleHR1cmUgKHRpbGUpIHtcbiAgICAgICAgbGV0IGtleSA9IHRpbGUuY29vcmRzLmtleTtcbiAgICAgICAgaWYgKCF0aGlzLnRleHR1cmVzW2tleV0pIHtcbiAgICAgICAgICAgIGxldCBjb29yZHMgPSBUaWxlLmNvb3JkaW5hdGVXaXRoTWF4Wm9vbSh0aWxlLmNvb3JkcywgdGhpcy5tYXhfem9vbSk7XG4gICAgICAgICAgICBsZXQgdXJsID0gdGhpcy5mb3JtYXRVcmwodGhpcy51cmwsIHsgY29vcmRzIH0pO1xuICAgICAgICAgICAgdGhpcy50ZXh0dXJlc1trZXldID0geyB1cmwsIGZpbHRlcmluZzogdGhpcy5maWx0ZXJpbmcsIGNvb3JkcyB9O1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLnRleHR1cmVzW2tleV07XG4gICAgfVxuXG59XG5cbkRhdGFTb3VyY2UucmVnaXN0ZXIoUmFzdGVyVGlsZVNvdXJjZSwgJ1Jhc3RlcicpO1xuIiwiaW1wb3J0IERhdGFTb3VyY2UgZnJvbSAnLi9kYXRhX3NvdXJjZSc7XG5pbXBvcnQge0dlb0pTT05Tb3VyY2UsIEdlb0pTT05UaWxlU291cmNlfSBmcm9tICcuL2dlb2pzb24nO1xuXG5pbXBvcnQgKiBhcyB0b3BvanNvbiBmcm9tICd0b3BvanNvbi1jbGllbnQnO1xuXG4vKipcbiBUb3BvSlNPTiBzdGFuZGFsb25lIChub24tdGlsZWQpIHNvdXJjZVxuIFVzZXMgZ2VvanNvbi12dCBzcGxpdCBpbnRvIHRpbGVzIGNsaWVudC1zaWRlXG4qL1xuXG5leHBvcnQgY2xhc3MgVG9wb0pTT05Tb3VyY2UgZXh0ZW5kcyBHZW9KU09OU291cmNlIHtcblxuICAgIHBhcnNlU291cmNlRGF0YSAodGlsZSwgc291cmNlLCByZXNwb25zZSkge1xuICAgICAgICBsZXQgZGF0YSA9IEpTT04ucGFyc2UocmVzcG9uc2UpO1xuICAgICAgICBkYXRhID0gdGhpcy50b0dlb0pTT04oZGF0YSk7XG5cbiAgICAgICAgbGV0IGxheWVycyA9IHRoaXMuZ2V0TGF5ZXJzKGRhdGEpO1xuICAgICAgICBzdXBlci5wcmVwcm9jZXNzTGF5ZXJzKGxheWVycyk7XG4gICAgICAgIHNvdXJjZS5sYXllcnMgPSBsYXllcnM7XG4gICAgfVxuXG4gICAgdG9HZW9KU09OIChkYXRhKSB7XG4gICAgICAgIC8vIFNpbmdsZSBsYXllclxuICAgICAgICBpZiAoZGF0YS5vYmplY3RzICYmXG4gICAgICAgICAgICBPYmplY3Qua2V5cyhkYXRhLm9iamVjdHMpLmxlbmd0aCA9PT0gMSkge1xuICAgICAgICAgICAgbGV0IGxheWVyID0gT2JqZWN0LmtleXMoZGF0YS5vYmplY3RzKVswXTtcbiAgICAgICAgICAgIGRhdGEgPSBnZXRUb3BvSlNPTkZlYXR1cmUoZGF0YSwgZGF0YS5vYmplY3RzW2xheWVyXSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gTXVsdGlwbGUgbGF5ZXJzXG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgbGV0IGxheWVycyA9IHt9O1xuICAgICAgICAgICAgZm9yIChsZXQga2V5IGluIGRhdGEub2JqZWN0cykge1xuICAgICAgICAgICAgICAgIGxheWVyc1trZXldID0gZ2V0VG9wb0pTT05GZWF0dXJlKGRhdGEsIGRhdGEub2JqZWN0c1trZXldKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGRhdGEgPSBsYXllcnM7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGRhdGE7XG4gICAgfVxuXG59XG5cbmZ1bmN0aW9uIGdldFRvcG9KU09ORmVhdHVyZSAodG9wb2xvZ3ksIG9iamVjdCkge1xuICAgIGxldCBmZWF0dXJlID0gdG9wb2pzb24uZmVhdHVyZSh0b3BvbG9neSwgb2JqZWN0KTtcblxuICAgIC8vIENvbnZlcnQgc2luZ2xlIGZlYXR1cmUgdG8gYSBmZWF0dXJlIGNvbGxlY3Rpb25cbiAgICBpZiAoZmVhdHVyZS50eXBlID09PSAnRmVhdHVyZScpIHtcbiAgICAgICAgZmVhdHVyZSA9IHtcbiAgICAgICAgICAgIHR5cGU6ICdGZWF0dXJlQ29sbGVjdGlvbicsXG4gICAgICAgICAgICBmZWF0dXJlczogW2ZlYXR1cmVdXG4gICAgICAgIH07XG4gICAgfVxuICAgIHJldHVybiBmZWF0dXJlO1xufVxuXG5cbi8qKlxuIFRvcG9KU09OIHZlY3RvciB0aWxlc1xuIEBjbGFzcyBUb3BvSlNPTlRpbGVTb3VyY2VcbiovXG5leHBvcnQgY2xhc3MgVG9wb0pTT05UaWxlU291cmNlIGV4dGVuZHMgR2VvSlNPTlRpbGVTb3VyY2Uge1xuXG4gICAgY29uc3RydWN0b3Ioc291cmNlLCBzb3VyY2VzKSB7XG4gICAgICAgIHN1cGVyKHNvdXJjZSwgc291cmNlcyk7XG5cbiAgICAgICAgLy8gUmVwbGFjZSB3aXRoIG5vbi10aWxlZCBzb3VyY2UgaWYgdGlsZWQgc291cmNlIGZhaWxlZCB0byBpbnN0YW50aWF0ZVxuICAgICAgICBpZiAoIXRoaXMudXJsSGFzVGlsZVBhdHRlcm4odGhpcy51cmwpKSB7XG4gICAgICAgICAgICByZXR1cm4gbmV3IFRvcG9KU09OU291cmNlKHNvdXJjZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBwYXJzZVNvdXJjZURhdGEgKHRpbGUsIHNvdXJjZSwgcmVzcG9uc2UpIHtcbiAgICAgICAgbGV0IGRhdGEgPSBKU09OLnBhcnNlKHJlc3BvbnNlKTtcbiAgICAgICAgZGF0YSA9IFRvcG9KU09OU291cmNlLnByb3RvdHlwZS50b0dlb0pTT04oZGF0YSk7XG4gICAgICAgIHRoaXMucHJlcGFyZUdlb0pTT04oZGF0YSwgdGlsZSwgc291cmNlKTtcbiAgICB9XG5cbn1cblxuRGF0YVNvdXJjZS5yZWdpc3RlcihUb3BvSlNPTlRpbGVTb3VyY2UsICdUb3BvSlNPTicpOyAgICAgICAgLy8gcHJlZmVyZWQgc2hvcnRlciBuYW1lXG4iLCJmdW5jdGlvbiBub3ROdWxsKHgpICB7IHJldHVybiB4ICE9IG51bGw7IH1cbmZ1bmN0aW9uIHdyYXAoeCkgICAgIHsgcmV0dXJuICcoJyArIHggKyAnKSc7fVxuXG5mdW5jdGlvbiBtYXliZVF1b3RlKHZhbHVlKSB7XG4gICAgaWYgKHR5cGVvZiB2YWx1ZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgcmV0dXJuICdcIicgKyB2YWx1ZSArICdcIic7XG4gICAgfVxuICAgIHJldHVybiB2YWx1ZTtcbn1cblxuZnVuY3Rpb24gbG9va1VwKGtleSkge1xuICAgIGlmIChrZXlbMF0gPT09ICckJykge1xuICAgICAgICByZXR1cm4gJ2NvbnRleHRbXFwnJyArIGtleS5zdWJzdHJpbmcoMSkgKyAnXFwnXSc7XG4gICAgfVxuICAgIHJldHVybiAnY29udGV4dC5mZWF0dXJlLnByb3BlcnRpZXNbXFwnJyArIGtleSArICdcXCddJztcbn1cblxuZnVuY3Rpb24gbnVsbFZhbHVlKGtleSwgdmFsdWUpIHtcbiAgICByZXR1cm4gJyB0cnVlICc7XG59XG5cbmZ1bmN0aW9uIHByb3BlcnR5RXF1YWwoa2V5LCB2YWx1ZSkge1xuICAgIHJldHVybiB3cmFwKG1heWJlUXVvdGUodmFsdWUpICsgJyA9PT0gJyArIGxvb2tVcChrZXkpKTtcbn1cblxuZnVuY3Rpb24gcHJvcGVydHlPcihrZXksIHZhbHVlcykge1xuICAgIHJldHVybiB3cmFwKHZhbHVlcy5tYXAoZnVuY3Rpb24gKHgpIHsgcmV0dXJuIHByb3BlcnR5RXF1YWwoa2V5LCB4KTsgfSkuam9pbignIHx8ICcpKTtcbn1cblxuZnVuY3Rpb24gcHJpbnROZXN0ZWQodmFsdWVzLCBqb2luZXIpIHtcbiAgICByZXR1cm4gd3JhcCh2YWx1ZXMuZmlsdGVyKG5vdE51bGwpLm1hcChmdW5jdGlvbiAoeCkge1xuICAgICAgICByZXR1cm4gd3JhcCh4LmpvaW4oJyAmJiAnKSk7XG4gICAgfSkuam9pbignICcgKyBqb2luZXIgKyAnICcpKTtcbn1cblxuZnVuY3Rpb24gYW55KF8sIHZhbHVlcywgb3B0aW9ucykge1xuICAgIHJldHVybiAodmFsdWVzICYmIHZhbHVlcy5sZW5ndGggPiAwKSA/IHByaW50TmVzdGVkKHZhbHVlcy5tYXAoZnVuY3Rpb24odikgeyByZXR1cm4gcGFyc2VGaWx0ZXIodiwgb3B0aW9ucyk7IH0pLCAnfHwnKSA6ICd0cnVlJztcbn1cblxuZnVuY3Rpb24gYWxsKF8sIHZhbHVlcywgb3B0aW9ucykge1xuICAgIHJldHVybiAodmFsdWVzICYmIHZhbHVlcy5sZW5ndGggPiAwKSA/IHByaW50TmVzdGVkKHZhbHVlcy5tYXAoZnVuY3Rpb24odikgeyByZXR1cm4gcGFyc2VGaWx0ZXIodiwgb3B0aW9ucyk7IH0pLCAnJiYnKSA6ICd0cnVlJztcbn1cblxuZnVuY3Rpb24gbm90KGtleSwgdmFsdWUsIG9wdGlvbnMpIHtcbiAgICByZXR1cm4gJyEnICsgd3JhcChwYXJzZUZpbHRlcih2YWx1ZSwgb3B0aW9ucykuam9pbignICYmICcpKTtcbn1cblxuZnVuY3Rpb24gbm9uZShrZXksIHZhbHVlcywgb3B0aW9ucykge1xuICAgIHJldHVybiAnIScgKyB3cmFwKGFueShudWxsLCB2YWx1ZXMsIG9wdGlvbnMpKTtcbn1cblxuZnVuY3Rpb24gcHJvcGVydHlNYXRjaGVzQm9vbGVhbihrZXksIHZhbHVlKSB7XG4gICAgcmV0dXJuIHdyYXAobG9va1VwKGtleSkgKyAodmFsdWUgPyAnICE9ICcgOiAnID09ICcpICArICdudWxsJyk7XG59XG5cbmZ1bmN0aW9uIHJhbmdlTWF0Y2goa2V5LCB2YWx1ZXMsIG9wdGlvbnMpIHtcbiAgICB2YXIgZXhwcmVzc2lvbnMgPSBbXTtcbiAgICB2YXIgdHJhbnNmb3JtID0gb3B0aW9ucyAmJiAodHlwZW9mIG9wdGlvbnMucmFuZ2VUcmFuc2Zvcm0gPT09ICdmdW5jdGlvbicpICYmIG9wdGlvbnMucmFuZ2VUcmFuc2Zvcm07XG5cbiAgICBpZiAodmFsdWVzLm1heCkge1xuICAgICAgICB2YXIgbWF4ID0gdHJhbnNmb3JtID8gdHJhbnNmb3JtKHZhbHVlcy5tYXgpIDogdmFsdWVzLm1heDtcbiAgICAgICAgZXhwcmVzc2lvbnMucHVzaCgnJyArIGxvb2tVcChrZXkpICsgJyA8ICcgKyBtYXgpO1xuICAgIH1cblxuICAgIGlmICh2YWx1ZXMubWluKSB7XG4gICAgICAgIHZhciBtaW4gPSB0cmFuc2Zvcm0gPyBtaW4gPSB0cmFuc2Zvcm0odmFsdWVzLm1pbikgOiB2YWx1ZXMubWluO1xuICAgICAgICBleHByZXNzaW9ucy5wdXNoKCcnICsgbG9va1VwKGtleSkgKyAnID49ICcgKyBtaW4pO1xuICAgIH1cblxuICAgIHJldHVybiB3cmFwKGV4cHJlc3Npb25zLmpvaW4oJyAmJiAnKSk7XG59XG5cbmZ1bmN0aW9uIHBhcnNlRmlsdGVyKGZpbHRlciwgb3B0aW9ucykge1xuICAgIHZhciBmaWx0ZXJBU1QgPSBbXTtcblxuICAgIC8vIEZ1bmN0aW9uIGZpbHRlclxuICAgIGlmICh0eXBlb2YgZmlsdGVyID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgIHJldHVybiBbd3JhcChmaWx0ZXIudG9TdHJpbmcoKSArICcoY29udGV4dCknKV07XG4gICAgfVxuICAgIC8vIEFycmF5IGZpbHRlciwgaW1wbGljaXQgJ2FueSdcbiAgICBlbHNlIGlmIChBcnJheS5pc0FycmF5KGZpbHRlcikpIHtcbiAgICAgICAgcmV0dXJuIFthbnkobnVsbCwgZmlsdGVyLCBvcHRpb25zKV07XG4gICAgfVxuICAgIC8vIE51bGwgZmlsdGVyIG9iamVjdFxuICAgIGVsc2UgaWYgKGZpbHRlciA9PSBudWxsKSB7XG4gICAgICAgIHJldHVybiBbJ3RydWUnXTtcbiAgICB9XG5cbiAgICAvLyBPYmplY3QgZmlsdGVyLCBlLmcuIGltcGxpY2l0ICdhbGwnXG4gICAgdmFyIGtleXMgPSBPYmplY3Qua2V5cyhmaWx0ZXIpO1xuICAgIGZvciAodmFyIGs9MDsgayA8IGtleXMubGVuZ3RoOyBrKyspIHtcbiAgICAgICAgdmFyIGtleSA9IGtleXNba107XG5cbiAgICAgICAgdmFyIHZhbHVlID0gZmlsdGVyW2tleV0sXG4gICAgICAgICAgICB0eXBlICA9IHR5cGVvZiB2YWx1ZTtcbiAgICAgICAgaWYgKHR5cGUgPT09ICdzdHJpbmcnIHx8IHR5cGUgPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgICBmaWx0ZXJBU1QucHVzaChwcm9wZXJ0eUVxdWFsKGtleSwgdmFsdWUpKTtcbiAgICAgICAgfSBlbHNlIGlmICh0eXBlID09PSAnYm9vbGVhbicpIHtcbiAgICAgICAgICAgIGZpbHRlckFTVC5wdXNoKHByb3BlcnR5TWF0Y2hlc0Jvb2xlYW4oa2V5LCB2YWx1ZSkpO1xuICAgICAgICB9IGVsc2UgaWYgKGtleSA9PT0gJ25vdCcpIHtcbiAgICAgICAgICAgIGZpbHRlckFTVC5wdXNoKG5vdChrZXksIHZhbHVlLCBvcHRpb25zKSk7XG4gICAgICAgIH0gZWxzZSBpZiAoa2V5ID09PSAnYW55Jykge1xuICAgICAgICAgICAgZmlsdGVyQVNULnB1c2goYW55KGtleSwgdmFsdWUsIG9wdGlvbnMpKTtcbiAgICAgICAgfSBlbHNlIGlmIChrZXkgPT09ICdhbGwnKSB7XG4gICAgICAgICAgICBmaWx0ZXJBU1QucHVzaChhbGwoa2V5LCB2YWx1ZSwgb3B0aW9ucykpO1xuICAgICAgICB9IGVsc2UgaWYgKGtleSA9PT0gJ25vbmUnKSB7XG4gICAgICAgICAgICBmaWx0ZXJBU1QucHVzaChub25lKGtleSwgdmFsdWUsIG9wdGlvbnMpKTtcbiAgICAgICAgfSBlbHNlIGlmIChBcnJheS5pc0FycmF5KHZhbHVlKSkge1xuICAgICAgICAgICAgZmlsdGVyQVNULnB1c2gocHJvcGVydHlPcihrZXksIHZhbHVlKSk7XG4gICAgICAgIH0gZWxzZSBpZiAodHlwZSA9PT0gJ29iamVjdCcgJiYgdmFsdWUgIT0gbnVsbCkge1xuICAgICAgICAgICAgaWYgKHZhbHVlLm1heCB8fCB2YWx1ZS5taW4pIHtcbiAgICAgICAgICAgICAgICBmaWx0ZXJBU1QucHVzaChyYW5nZU1hdGNoKGtleSwgdmFsdWUsIG9wdGlvbnMpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSBlbHNlIGlmICh2YWx1ZSA9PSBudWxsKSB7XG4gICAgICAgICAgICBmaWx0ZXJBU1QucHVzaChudWxsVmFsdWUoa2V5LCB2YWx1ZSkpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdVbmtub3duIFF1ZXJ5IHN5dG5heDogJyArIHZhbHVlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBrZXlzLmxlbmd0aCA9PT0gMCA/IFsndHJ1ZSddIDogZmlsdGVyQVNUO1xufVxuXG5mdW5jdGlvbiBmaWx0ZXJUb1N0cmluZyhmaWx0ZXJBU1QpIHtcbiAgICByZXR1cm4gd3JhcChmaWx0ZXJBU1Quam9pbignICYmICcpKTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkRmlsdGVyKGZpbHRlciwgb3B0aW9ucykge1xuICAgIGlmIChmaWx0ZXIgPT0gbnVsbCkgeyByZXR1cm4gZnVuY3Rpb24gKCkgeyByZXR1cm4gdHJ1ZTsgfTsgfVxuICAgIC8vIGpzaGludCBldmlsOiB0cnVlXG4gICAgcmV0dXJuIG5ldyBGdW5jdGlvbignY29udGV4dCcsICdyZXR1cm4gJyArIGZpbHRlclRvU3RyaW5nKHBhcnNlRmlsdGVyKGZpbHRlciwgb3B0aW9ucykpICsgJzsnKTtcbn1cbiIsImltcG9ydCB7U3R5bGVQYXJzZXJ9IGZyb20gJy4vc3R5bGVfcGFyc2VyJztcbmltcG9ydCBVdGlscyBmcm9tICcuLi91dGlscy91dGlscyc7XG5pbXBvcnQgbG9nIGZyb20gJy4uL3V0aWxzL2xvZyc7XG5pbXBvcnQgbWVyZ2VPYmplY3RzIGZyb20gJy4uL3V0aWxzL21lcmdlJztcbmltcG9ydCB7YnVpbGRGaWx0ZXJ9IGZyb20gJy4vZmlsdGVyJztcblxuZXhwb3J0IGNvbnN0IHdoaXRlTGlzdCA9IFsnZmlsdGVyJywgJ2RyYXcnLCAndmlzaWJsZScsICdkYXRhJ107XG5cbmV4cG9ydCBjb25zdCBsYXllcl9jYWNoZSA9IHt9O1xuXG5mdW5jdGlvbiBjYWNoZUtleSAobGF5ZXJzKSB7XG4gICAgaWYgKGxheWVycy5sZW5ndGggPiAxKSB7XG4gICAgICAgIHZhciBrID0gbGF5ZXJzWzBdO1xuICAgICAgICBmb3IgKHZhciBpPTE7IGkgPCBsYXllcnMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgIGsgKz0gJy8nICsgbGF5ZXJzW2ldO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGs7XG4gICAgfVxuICAgIHJldHVybiBsYXllcnNbMF07XG59XG5cbi8vIE1lcmdlIG1hdGNoaW5nIGxheWVyIHRyZWVzIGludG8gYSBmaW5hbCBkcmF3IGdyb3VwXG5leHBvcnQgZnVuY3Rpb24gbWVyZ2VUcmVlcyhtYXRjaGluZ1RyZWVzLCBncm91cCkge1xuICAgIGxldCBkcmF3cywgdHJlZURlcHRoID0gMDtcblxuICAgIGxldCBkcmF3ID0ge1xuICAgICAgICB2aXNpYmxlOiB0cnVlIC8vIHZpc2libGUgYnkgZGVmYXVsdFxuICAgIH07XG5cbiAgICAvLyBGaW5kIGRlZXBlc3QgdHJlZVxuICAgIGZvciAobGV0IHQ9MDsgdCA8IG1hdGNoaW5nVHJlZXMubGVuZ3RoOyB0KyspIHtcbiAgICAgICAgaWYgKG1hdGNoaW5nVHJlZXNbdF0ubGVuZ3RoID4gdHJlZURlcHRoKSB7XG4gICAgICAgICAgICB0cmVlRGVwdGggPSBtYXRjaGluZ1RyZWVzW3RdLmxlbmd0aDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIE5vIGxheWVycyB0byBwYXJzZVxuICAgIGlmICh0cmVlRGVwdGggPT09IDApIHtcbiAgICAgICAgcmV0dXJuIG51bGw7XG4gICAgfVxuXG4gICAgLy8gSXRlcmF0ZSB0cmVlcyBpbiBwYXJhbGxlbFxuICAgIGZvciAobGV0IHg9MDsgeCA8IHRyZWVEZXB0aDsgeCsrKSB7XG4gICAgICAgIC8vIFB1bGwgb3V0IHRoZSByZXF1ZXN0ZWQgZHJhdyBncm91cCwgZm9yIGVhY2ggdHJlZSwgYXQgdGhpcyBkZXB0aFxuICAgICAgICBkcmF3cyA9IG1hdGNoaW5nVHJlZXMubWFwKHRyZWUgPT4gdHJlZVt4XSAmJiB0cmVlW3hdW2dyb3VwXSk7XG4gICAgICAgIGlmIChkcmF3cy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gU29ydCBieSBsYXllciBuYW1lIGJlZm9yZSBtZXJnaW5nLCBzbyBsYXllcnMgYXJlIGFwcGxpZWQgZGV0ZXJtaW5pc3RpY2FsbHlcbiAgICAgICAgLy8gd2hlbiBtdWx0aXBsZSBsYXllcnMgbW9kaWZ5IHRoZSBzYW1lIHByb3BlcnRpZXNcbiAgICAgICAgZHJhd3Muc29ydCgoYSwgYikgPT4gKGEgJiYgYS5sYXllcl9uYW1lKSA+IChiICYmIGIubGF5ZXJfbmFtZSkgPyAxIDogLTEpO1xuXG4gICAgICAgIC8vIE1lcmdlIGRyYXcgb2JqZWN0c1xuICAgICAgICBtZXJnZU9iamVjdHMoZHJhdywgLi4uZHJhd3MpO1xuXG4gICAgICAgIC8vIFJlbW92ZSBsYXllciBuYW1lcywgdGhleSB3ZXJlIG9ubHkgdXNlZCB0cmFuc2llbnRseSB0byBzb3J0IGFuZCBjYWxjdWxhdGUgZmluYWwgbGF5ZXJcbiAgICAgICAgLy8gKGZpbmFsIG1lcmdlZCBuYW1lcyB3aWxsIG5vdCBiZSBhY2N1cmF0ZSBzaW5jZSBvbmx5IG9uZSB0cmVlIGNhbiB3aW4pXG4gICAgICAgIGRlbGV0ZSBkcmF3LmxheWVyX25hbWU7XG4gICAgfVxuXG4gICAgLy8gU2hvcnQtY2lyY3VpdCBpZiBub3QgdmlzaWJsZVxuICAgIGlmIChkcmF3LnZpc2libGUgPT09IGZhbHNlKSB7XG4gICAgICAgIHJldHVybiBudWxsO1xuICAgIH1cblxuICAgIHJldHVybiBkcmF3O1xufVxuXG5jb25zdCBibGFja2xpc3QgPSBbJ2FueScsICdhbGwnLCAnbm90JywgJ25vbmUnXTtcblxuY2xhc3MgTGF5ZXIge1xuXG4gICAgY29uc3RydWN0b3IoeyBsYXllciwgbmFtZSwgcGFyZW50LCBkcmF3LCB2aXNpYmxlLCBmaWx0ZXIgfSkge1xuICAgICAgICB0aGlzLmlkID0gTGF5ZXIuaWQrKztcbiAgICAgICAgdGhpcy5jb25maWcgPSBsYXllcjtcbiAgICAgICAgdGhpcy5wYXJlbnQgPSBwYXJlbnQ7XG4gICAgICAgIHRoaXMubmFtZSA9IG5hbWU7XG4gICAgICAgIHRoaXMuZnVsbF9uYW1lID0gdGhpcy5wYXJlbnQgPyAodGhpcy5wYXJlbnQuZnVsbF9uYW1lICsgJzonICsgdGhpcy5uYW1lKSA6IHRoaXMubmFtZTtcbiAgICAgICAgdGhpcy5kcmF3ID0gZHJhdztcbiAgICAgICAgdGhpcy5maWx0ZXIgPSBmaWx0ZXI7XG4gICAgICAgIHRoaXMuaXNfYnVpbHQgPSBmYWxzZTtcbiAgICAgICAgdGhpcy52aXNpYmxlID0gdmlzaWJsZSAhPT0gdW5kZWZpbmVkID8gdmlzaWJsZSA6ICh0aGlzLnBhcmVudCAmJiB0aGlzLnBhcmVudC52aXNpYmxlKTtcblxuICAgICAgICAvLyBEZW5vcm1hbGl6ZSBsYXllciBuYW1lIHRvIGRyYXcgZ3JvdXBzXG4gICAgICAgIGlmICh0aGlzLmRyYXcpIHtcbiAgICAgICAgICAgIGZvciAobGV0IGdyb3VwIGluIHRoaXMuZHJhdykge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmRyYXdbZ3JvdXBdID09IG51bGwgfHwgdHlwZW9mIHRoaXMuZHJhd1tncm91cF0gIT09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIEludmFsaWQgZHJhdyBncm91cFxuICAgICAgICAgICAgICAgICAgICBsZXQgbXNnID0gYERyYXcgZ3JvdXAgJyR7Z3JvdXB9JyBmb3IgbGF5ZXIgJHt0aGlzLmZ1bGxfbmFtZX0gaXMgaW52YWxpZCwgbXVzdCBiZSBhbiBvYmplY3QsIGA7XG4gICAgICAgICAgICAgICAgICAgIG1zZyArPSBgYnV0IHdhcyBzZXQgdG8gXFxgJHtncm91cH06ICR7dGhpcy5kcmF3W2dyb3VwXX1cXGAgaW5zdGVhZGA7XG4gICAgICAgICAgICAgICAgICAgIGxvZygnd2FybicsIG1zZyk7IC8vIFRPRE86IGZpcmUgZXh0ZXJuYWwgZXZlbnQgdGhhdCBjbGllbnRzIHRvIHN1YnNjcmliZSB0b1xuXG4gICAgICAgICAgICAgICAgICAgIGRlbGV0ZSB0aGlzLmRyYXdbZ3JvdXBdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kcmF3W2dyb3VwXS5sYXllcl9uYW1lID0gdGhpcy5mdWxsX25hbWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgYnVpbGQgKCkge1xuICAgICAgICBsb2coJ3RyYWNlJywgYEJ1aWxkaW5nIGxheWVyICcke3RoaXMuZnVsbF9uYW1lfSdgKTtcbiAgICAgICAgdGhpcy5idWlsZEZpbHRlcigpO1xuICAgICAgICB0aGlzLmJ1aWxkRHJhdygpO1xuICAgICAgICB0aGlzLmlzX2J1aWx0ID0gdHJ1ZTtcbiAgICB9XG5cbiAgICBidWlsZERyYXcoKSB7XG4gICAgICAgIHRoaXMuZHJhdyA9IFV0aWxzLnN0cmluZ3NUb0Z1bmN0aW9ucyh0aGlzLmRyYXcsIFN0eWxlUGFyc2VyLndyYXBGdW5jdGlvbik7XG4gICAgICAgIHRoaXMuY2FsY3VsYXRlZERyYXcgPSBjYWxjdWxhdGVEcmF3KHRoaXMpO1xuICAgIH1cblxuICAgIGJ1aWxkRmlsdGVyKCkge1xuICAgICAgICB0aGlzLmZpbHRlcl9vcmlnaW5hbCA9IHRoaXMuZmlsdGVyO1xuICAgICAgICB0aGlzLmZpbHRlciA9IFV0aWxzLnN0cmluZ3NUb0Z1bmN0aW9ucyh0aGlzLmZpbHRlciwgU3R5bGVQYXJzZXIud3JhcEZ1bmN0aW9uKTtcblxuICAgICAgICBsZXQgdHlwZSA9IHR5cGVvZiB0aGlzLmZpbHRlcjtcbiAgICAgICAgaWYgKHRoaXMuZmlsdGVyICE9IG51bGwgJiYgdHlwZSAhPT0gJ29iamVjdCcgJiYgdHlwZSAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgLy8gSW52YWxpZCBmaWx0ZXJcbiAgICAgICAgICAgIGxldCBtc2cgPSBgRmlsdGVyIGZvciBsYXllciAke3RoaXMuZnVsbF9uYW1lfSBpcyBpbnZhbGlkLCBmaWx0ZXIgdmFsdWUgbXVzdCBiZSBhbiBvYmplY3Qgb3IgZnVuY3Rpb24sIGA7XG4gICAgICAgICAgICBtc2cgKz0gYGJ1dCB3YXMgc2V0IHRvIFxcYGZpbHRlcjogJHt0aGlzLmZpbHRlcn1cXGAgaW5zdGVhZGA7XG4gICAgICAgICAgICBsb2coJ3dhcm4nLCBtc2cpOyAvLyBUT0RPOiBmaXJlIGV4dGVybmFsIGV2ZW50IHRoYXQgY2xpZW50cyB0byBzdWJzY3JpYmUgdG9cbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIHRyeSB7XG4gICAgICAgICAgICB0aGlzLmJ1aWxkWm9vbXMoKTtcbiAgICAgICAgICAgIHRoaXMuYnVpbGRQcm9wTWF0Y2hlcygpO1xuICAgICAgICAgICAgaWYgKHRoaXMuZmlsdGVyICE9IG51bGwgJiYgKHR5cGVvZiB0aGlzLmZpbHRlciA9PT0gJ2Z1bmN0aW9uJyB8fCBPYmplY3Qua2V5cyh0aGlzLmZpbHRlcikubGVuZ3RoID4gMCkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmZpbHRlciA9IGJ1aWxkRmlsdGVyKHRoaXMuZmlsdGVyLCBGaWx0ZXJPcHRpb25zKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMuZmlsdGVyID0gbnVsbDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBjYXRjaChlKSB7XG4gICAgICAgICAgICAvLyBJbnZhbGlkIGZpbHRlclxuICAgICAgICAgICAgbGV0IG1zZyA9IGBGaWx0ZXIgZm9yIGxheWVyICR7dGhpcy5mdWxsX25hbWV9IGlzIGludmFsaWQsIFxcYGZpbHRlcjogJHtKU09OLnN0cmluZ2lmeSh0aGlzLmZpbHRlcil9XFxgIGA7XG4gICAgICAgICAgICBtc2cgKz0gYGZhaWxlZCB3aXRoIGVycm9yICcke2UubWVzc2FnZX0nLCBzdGFjayB0cmFjZTogJHtlLnN0YWNrfWA7XG4gICAgICAgICAgICBsb2coJ3dhcm4nLCBtc2cpOyAvLyBUT0RPOiBmaXJlIGV4dGVybmFsIGV2ZW50IHRoYXQgY2xpZW50cyB0byBzdWJzY3JpYmUgdG9cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIFpvb21zIG9mdGVuIGN1bGwgbGFyZ2Ugc3dhdGhzIG9mIHRoZSBsYXllciB0cmVlLCBzbyB0aGV5IGdldCBzcGVjaWFsIHRyZWF0bWVudCBhbmQgYXJlIGNoZWNrZWQgZmlyc3RcbiAgICBidWlsZFpvb21zKCkge1xuICAgICAgICBsZXQgem9vbSA9IHRoaXMuZmlsdGVyICYmIHRoaXMuZmlsdGVyLiR6b29tO1xuICAgICAgICBsZXQgenR5cGUgPSB0eXBlb2Ygem9vbTtcbiAgICAgICAgaWYgKHpvb20gIT0gbnVsbCAmJiB6dHlwZSAhPT0gJ2Z1bmN0aW9uJykgeyAvLyBkb24ndCBhY2NlbGVyYXRlIGZ1bmN0aW9uLWJhc2VkIGZpbHRlcnNcbiAgICAgICAgICAgIHRoaXMuem9vbXMgPSB7fTtcblxuICAgICAgICAgICAgaWYgKHp0eXBlID09PSAnbnVtYmVyJykge1xuICAgICAgICAgICAgICAgIHRoaXMuem9vbXNbem9vbV0gPSB0cnVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoQXJyYXkuaXNBcnJheSh6b29tKSkge1xuICAgICAgICAgICAgICAgIGZvciAobGV0IHo9MDsgeiA8IHpvb20ubGVuZ3RoOyB6KyspIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy56b29tc1t6b29tW3pdXSA9IHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoenR5cGUgPT09ICdvYmplY3QnICYmICh6b29tLm1pbiAhPSBudWxsIHx8IHpvb20ubWF4ICE9IG51bGwpKSB7XG4gICAgICAgICAgICAgICAgbGV0IHptaW4gPSB6b29tLm1pbiB8fCAwO1xuICAgICAgICAgICAgICAgIGxldCB6bWF4ID0gem9vbS5tYXggfHwgMjU7IC8vIFRPRE86IHJlcGxhY2UgY29uc3RhbnQgZm9yIG1heCBwb3NzaWJsZSB6b29tXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgej16bWluOyB6IDwgem1heDsgeisrKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuem9vbXNbel0gPSB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZGVsZXRlIHRoaXMuZmlsdGVyLiR6b29tOyAvLyBkb24ndCBwcm9jZXNzIHpvb20gdGhyb3VnaCB1c3VhbCBnZW5lcmljIGZpbHRlciBsb2dpY1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgYnVpbGRQcm9wTWF0Y2hlcygpIHtcbiAgICAgICAgaWYgKCF0aGlzLmZpbHRlciB8fCBBcnJheS5pc0FycmF5KHRoaXMuZmlsdGVyKSB8fCB0eXBlb2YgdGhpcy5maWx0ZXIgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIE9iamVjdC5rZXlzKHRoaXMuZmlsdGVyKS5mb3JFYWNoKGtleSA9PiB7XG4gICAgICAgICAgICBpZiAoYmxhY2tsaXN0LmluZGV4T2Yoa2V5KSA9PT0gLTEpIHtcbiAgICAgICAgICAgICAgICBsZXQgdmFsID0gdGhpcy5maWx0ZXJba2V5XTtcbiAgICAgICAgICAgICAgICBsZXQgdHlwZSA9IHR5cGVvZiB2YWw7XG4gICAgICAgICAgICAgICAgbGV0IGFycmF5ID0gQXJyYXkuaXNBcnJheSh2YWwpO1xuXG4gICAgICAgICAgICAgICAgaWYgKCEoYXJyYXkgfHwgdHlwZSA9PT0gJ3N0cmluZycgfHwgdHlwZSA9PT0gJ251bWJlcicpKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAoa2V5WzBdID09PSAnJCcpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gQ29udGV4dCBwcm9wZXJ0eVxuICAgICAgICAgICAgICAgICAgICB0aGlzLmNvbnRleHRfcHJvcF9tYXRjaGVzID0gdGhpcy5jb250ZXh0X3Byb3BfbWF0Y2hlcyB8fCBbXTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5jb250ZXh0X3Byb3BfbWF0Y2hlcy5wdXNoKFtrZXkuc3Vic3RyaW5nKDEpLCBhcnJheSA/IHZhbCA6IFt2YWxdXSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAvLyBGZWF0dXJlIHByb3BlcnR5XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZmVhdHVyZV9wcm9wX21hdGNoZXMgPSB0aGlzLmZlYXR1cmVfcHJvcF9tYXRjaGVzIHx8IFtdO1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmZlYXR1cmVfcHJvcF9tYXRjaGVzLnB1c2goW2tleSwgYXJyYXkgPyB2YWwgOiBbdmFsXV0pO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGRlbGV0ZSB0aGlzLmZpbHRlcltrZXldO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBkb1Byb3BNYXRjaGVzIChjb250ZXh0KSB7XG4gICAgICAgIGlmICh0aGlzLmZlYXR1cmVfcHJvcF9tYXRjaGVzKSB7XG4gICAgICAgICAgICBmb3IgKGxldCByPTA7IHIgPCB0aGlzLmZlYXR1cmVfcHJvcF9tYXRjaGVzLmxlbmd0aDsgcisrKSB7XG4gICAgICAgICAgICAgICAgbGV0IG1hdGNoID0gdGhpcy5mZWF0dXJlX3Byb3BfbWF0Y2hlc1tyXTtcbiAgICAgICAgICAgICAgICBsZXQgdmFsID0gY29udGV4dC5mZWF0dXJlLnByb3BlcnRpZXNbbWF0Y2hbMF1dO1xuICAgICAgICAgICAgICAgIGlmICh2YWwgPT0gbnVsbCB8fCBtYXRjaFsxXS5pbmRleE9mKHZhbCkgPT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodGhpcy5jb250ZXh0X3Byb3BfbWF0Y2hlcykge1xuICAgICAgICAgICAgZm9yIChsZXQgcj0wOyByIDwgdGhpcy5jb250ZXh0X3Byb3BfbWF0Y2hlcy5sZW5ndGg7IHIrKykge1xuICAgICAgICAgICAgICAgIGxldCBtYXRjaCA9IHRoaXMuY29udGV4dF9wcm9wX21hdGNoZXNbcl07XG4gICAgICAgICAgICAgICAgbGV0IHZhbCA9IGNvbnRleHRbbWF0Y2hbMF1dO1xuICAgICAgICAgICAgICAgIGlmICh2YWwgPT0gbnVsbCB8fCBtYXRjaFsxXS5pbmRleE9mKHZhbCkgPT09IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICBkb2VzTWF0Y2ggKGNvbnRleHQpIHtcbiAgICAgICAgaWYgKCF0aGlzLmlzX2J1aWx0KSB7XG4gICAgICAgICAgICB0aGlzLmJ1aWxkKCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyB6b29tIHByZS1maWx0ZXI6IHNraXAgcmVzdCBvZiBmaWx0ZXIgaWYgb3V0IG9mIGxheWVyIHpvb20gcmFuZ2VcbiAgICAgICAgaWYgKHRoaXMuem9vbXMgIT0gbnVsbCAmJiAhdGhpcy56b29tc1tjb250ZXh0Lnpvb21dKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBkaXJlY3QgZmVhdHVyZSBwcm9wZXJ0eSBtYXRjaGVzXG4gICAgICAgIGlmICghdGhpcy5kb1Byb3BNYXRjaGVzKGNvbnRleHQpKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBhbnkgcmVtYWluaW5nIGZpbHRlciAobW9yZSBjb21wbGV4IG1hdGNoZXMgb3IgZHluYW1pYyBmdW5jdGlvbilcbiAgICAgICAgaWYgKHRoaXMuZmlsdGVyIGluc3RhbmNlb2YgRnVuY3Rpb24pe1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5maWx0ZXIoY29udGV4dCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBjYXRjaCAoZXJyb3IpIHtcbiAgICAgICAgICAgICAgICAvLyBGaWx0ZXIgZnVuY3Rpb24gZXJyb3JcbiAgICAgICAgICAgICAgICBsZXQgbXNnID0gYEZpbHRlciBmb3IgdGhpcyAke3RoaXMuZnVsbF9uYW1lfTogXFxgZmlsdGVyOiAke3RoaXMuZmlsdGVyX29yaWdpbmFsfVxcYCBgO1xuICAgICAgICAgICAgICAgIG1zZyArPSBgZmFpbGVkIHdpdGggZXJyb3IgJyR7ZXJyb3IubWVzc2FnZX0nLCBzdGFjayB0cmFjZTogJHtlcnJvci5zdGFja31gO1xuICAgICAgICAgICAgICAgIGxvZygnZXJyb3InLCBtc2csIGNvbnRleHQuZmVhdHVyZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5maWx0ZXIgPT0gbnVsbDtcbiAgICAgICAgfVxuICAgIH1cblxufVxuXG5MYXllci5pZCA9IDA7XG5cblxuZXhwb3J0IGNsYXNzIExheWVyTGVhZiBleHRlbmRzIExheWVyIHtcbiAgICBjb25zdHJ1Y3RvciAoY29uZmlnKSB7XG4gICAgICAgIHN1cGVyKGNvbmZpZyk7XG4gICAgICAgIHRoaXMuaXNfbGVhZiA9IHRydWU7XG4gICAgfVxuXG59XG5cbmV4cG9ydCBjbGFzcyBMYXllclRyZWUgZXh0ZW5kcyBMYXllciB7XG4gICAgY29uc3RydWN0b3IgKGNvbmZpZykge1xuICAgICAgICBzdXBlcihjb25maWcpO1xuICAgICAgICB0aGlzLmlzX3RyZWUgPSB0cnVlO1xuICAgICAgICB0aGlzLmxheWVycyA9IGNvbmZpZy5sYXllcnMgfHwgW107XG4gICAgfVxuXG4gICAgYWRkTGF5ZXIgKGxheWVyKSB7XG4gICAgICAgIHRoaXMubGF5ZXJzLnB1c2gobGF5ZXIpO1xuICAgIH1cblxuICAgIGJ1aWxkRHJhd0dyb3VwcyAoY29udGV4dCkge1xuICAgICAgICBsZXQgbGF5ZXJzID0gW10sIGxheWVyX2lkcyA9IFtdO1xuICAgICAgICBtYXRjaEZlYXR1cmUoY29udGV4dCwgW3RoaXNdLCBsYXllcnMsIGxheWVyX2lkcyk7XG5cbiAgICAgICAgaWYgKGxheWVycy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBsZXQgY2FjaGVfa2V5ID0gY2FjaGVLZXkobGF5ZXJfaWRzKTtcblxuICAgICAgICAgICAgLy8gT25seSBldmFsdWF0ZSBlYWNoIGxheWVyIGNvbWJpbmF0aW9uIG9uY2UgKHVuZGVmaW5lZCBtZWFucyBub3QgeWV0IGV2YWx1YXRlZCxcbiAgICAgICAgICAgIC8vIG51bGwgbWVhbnMgZXZhbHVhdGVkIHdpdGggbm8gZHJhdyBvYmplY3QpXG4gICAgICAgICAgICBpZiAobGF5ZXJfY2FjaGVbY2FjaGVfa2V5XSA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICAgICAgLy8gRmluZCBhbGwgdGhlIHVuaXF1ZSB2aXNpYmxlIGRyYXcgYmxvY2tzIGZvciB0aGlzIGxheWVyIHRyZWVcbiAgICAgICAgICAgICAgICBsZXQgZHJhd19ncm91cHMgPSBsYXllcnMubWFwKHggPT4geCAmJiB4LnZpc2libGUgIT09IGZhbHNlICYmIHguY2FsY3VsYXRlZERyYXcpO1xuICAgICAgICAgICAgICAgIGxldCBkcmF3X2tleXMgPSB7fTtcblxuICAgICAgICAgICAgICAgIGZvciAobGV0IHI9MDsgciA8IGRyYXdfZ3JvdXBzLmxlbmd0aDsgcisrKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBsYXllciA9IGRyYXdfZ3JvdXBzW3JdO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIWxheWVyKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBnPTA7IGcgPCBsYXllci5sZW5ndGg7IGcrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGdyb3VwID0gbGF5ZXJbZ107XG4gICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGxldCBrZXkgaW4gZ3JvdXApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkcmF3X2tleXNba2V5XSA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyBDYWxjdWxhdGUgZWFjaCBkcmF3IGdyb3VwXG4gICAgICAgICAgICAgICAgZm9yIChsZXQgZHJhd19rZXkgaW4gZHJhd19rZXlzKSB7XG4gICAgICAgICAgICAgICAgICAgIGxheWVyX2NhY2hlW2NhY2hlX2tleV0gPSBsYXllcl9jYWNoZVtjYWNoZV9rZXldIHx8IHt9O1xuICAgICAgICAgICAgICAgICAgICBsYXllcl9jYWNoZVtjYWNoZV9rZXldW2RyYXdfa2V5XSA9IG1lcmdlVHJlZXMoZHJhd19ncm91cHMsIGRyYXdfa2V5KTtcblxuICAgICAgICAgICAgICAgICAgICAvLyBPbmx5IHNhdmUgdGhlIG9uZXMgdGhhdCB3ZXJlbid0IG51bGxcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFsYXllcl9jYWNoZVtjYWNoZV9rZXldW2RyYXdfa2V5XSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlIGxheWVyX2NhY2hlW2NhY2hlX2tleV1bZHJhd19rZXldO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGF5ZXJfY2FjaGVbY2FjaGVfa2V5XVtkcmF3X2tleV0ua2V5ID0gY2FjaGVfa2V5ICsgJy8nICsgZHJhd19rZXk7XG4gICAgICAgICAgICAgICAgICAgICAgICBsYXllcl9jYWNoZVtjYWNoZV9rZXldW2RyYXdfa2V5XS5sYXllcnMgPSBsYXllcnMubWFwKHggPT4geCAmJiB4LmZ1bGxfbmFtZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyBObyBsYXllcnMgZXZhbHVhdGVkXG4gICAgICAgICAgICAgICAgaWYgKGxheWVyX2NhY2hlW2NhY2hlX2tleV0gJiYgT2JqZWN0LmtleXMobGF5ZXJfY2FjaGVbY2FjaGVfa2V5XSkubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGxheWVyX2NhY2hlW2NhY2hlX2tleV0gPSBudWxsO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBsYXllcl9jYWNoZVtjYWNoZV9rZXldO1xuICAgICAgICB9XG4gICAgfVxuXG59XG5cbmNvbnN0IEZpbHRlck9wdGlvbnMgPSB7XG4gICAgLy8gSGFuZGxlIHVuaXQgY29udmVyc2lvbnMgb24gZmlsdGVyIHJhbmdlc1xuICAgIHJhbmdlVHJhbnNmb3JtKHZhbCkge1xuICAgICAgICBpZiAodHlwZW9mIHZhbCA9PT0gJ3N0cmluZycgJiYgdmFsLnRyaW0oKS5zbGljZSgtMykgPT09ICdweDInKSB7XG4gICAgICAgICAgICByZXR1cm4gYCR7cGFyc2VGbG9hdCh2YWwpfSAqIGNvbnRleHQubWV0ZXJzX3Blcl9waXhlbF9zcWA7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHZhbDtcbiAgICB9XG59O1xuXG5mdW5jdGlvbiBpc1doaXRlTGlzdGVkKGtleSkge1xuICAgIHJldHVybiB3aGl0ZUxpc3QuaW5kZXhPZihrZXkpID4gLTE7XG59XG5cbmZ1bmN0aW9uIGlzRW1wdHkob2JqKSB7XG4gICAgcmV0dXJuIE9iamVjdC5rZXlzKG9iaikubGVuZ3RoID09PSAwO1xufVxuXG5leHBvcnQgZnVuY3Rpb24gZ3JvdXBQcm9wcyhvYmopIHtcbiAgICBsZXQgd2hpdGVMaXN0ZWQgPSB7fSwgbm9uV2hpdGVMaXN0ZWQgPSB7fTtcblxuICAgIGZvciAobGV0IGtleSBpbiBvYmopIHtcbiAgICAgICAgaWYgKGlzV2hpdGVMaXN0ZWQoa2V5KSkge1xuICAgICAgICAgICAgd2hpdGVMaXN0ZWRba2V5XSA9IG9ialtrZXldO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbm9uV2hpdGVMaXN0ZWRba2V5XSA9IG9ialtrZXldO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBbd2hpdGVMaXN0ZWQsIG5vbldoaXRlTGlzdGVkXTtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGNhbGN1bGF0ZURyYXcobGF5ZXIpIHtcblxuICAgIGxldCBkcmF3ICA9IFtdO1xuXG4gICAgaWYgKGxheWVyLnBhcmVudCkge1xuICAgICAgICBsZXQgY3MgPSBsYXllci5wYXJlbnQuY2FsY3VsYXRlZERyYXcgfHwgW107XG4gICAgICAgIGRyYXcucHVzaCguLi5jcyk7XG4gICAgfVxuXG4gICAgZHJhdy5wdXNoKGxheWVyLmRyYXcpO1xuICAgIHJldHVybiBkcmF3O1xufVxuXG5leHBvcnQgZnVuY3Rpb24gcGFyc2VMYXllclRyZWUobmFtZSwgbGF5ZXIsIHBhcmVudCwgc3R5bGVzKSB7XG5cbiAgICBsZXQgcHJvcGVydGllcyA9IHsgbmFtZSwgbGF5ZXIsIHBhcmVudCB9O1xuICAgIGxldCBbd2hpdGVMaXN0ZWQsIG5vbldoaXRlTGlzdGVkXSA9IGdyb3VwUHJvcHMobGF5ZXIpO1xuICAgIGxldCBlbXB0eSA9IGlzRW1wdHkobm9uV2hpdGVMaXN0ZWQpO1xuICAgIGxldCBDcmVhdGU7XG5cbiAgICBpZiAoZW1wdHkgJiYgcGFyZW50ICE9IG51bGwpIHtcbiAgICAgICAgQ3JlYXRlID0gTGF5ZXJMZWFmO1xuICAgIH0gZWxzZSB7XG4gICAgICAgIENyZWF0ZSA9IExheWVyVHJlZTtcbiAgICB9XG5cbiAgICBsZXQgciA9IG5ldyBDcmVhdGUoT2JqZWN0LmFzc2lnbihwcm9wZXJ0aWVzLCB3aGl0ZUxpc3RlZCkpO1xuXG4gICAgaWYgKHBhcmVudCkge1xuICAgICAgICBwYXJlbnQuYWRkTGF5ZXIocik7XG4gICAgfVxuXG4gICAgaWYgKCFlbXB0eSkge1xuICAgICAgICBmb3IgKGxldCBrZXkgaW4gbm9uV2hpdGVMaXN0ZWQpIHtcbiAgICAgICAgICAgIGxldCBwcm9wZXJ0eSA9IG5vbldoaXRlTGlzdGVkW2tleV07XG4gICAgICAgICAgICBpZiAodHlwZW9mIHByb3BlcnR5ID09PSAnb2JqZWN0JyAmJiAhQXJyYXkuaXNBcnJheShwcm9wZXJ0eSkpIHtcbiAgICAgICAgICAgICAgICBwYXJzZUxheWVyVHJlZShrZXksIHByb3BlcnR5LCByLCBzdHlsZXMpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBJbnZhbGlkIGxheWVyXG4gICAgICAgICAgICAgICAgbGV0IG1zZyA9IGBMYXllciB2YWx1ZSBtdXN0IGJlIGFuIG9iamVjdDogY2Fubm90IGNyZWF0ZSBsYXllciAnJHtrZXl9OiAke0pTT04uc3RyaW5naWZ5KHByb3BlcnR5KX0nYDtcbiAgICAgICAgICAgICAgICBtc2cgKz0gYCwgdW5kZXIgcGFyZW50IGxheWVyICcke3IuZnVsbF9uYW1lfScuYDtcblxuICAgICAgICAgICAgICAgIC8vIElmIHRoZSBwYXJlbnQgaXMgYSBzdHlsZSBuYW1lLCB0aGlzIG1heSBiZSBhbiBpbmNvcnJlY3RseSBuZXN0ZWQgbGF5ZXJcbiAgICAgICAgICAgICAgICBpZiAoc3R5bGVzW3IubmFtZV0pIHtcbiAgICAgICAgICAgICAgICAgICAgbXNnICs9IGAgVGhlIHBhcmVudCBuYW1lICcke3IubmFtZX0nIGlzIGFsc28gdGhlIG5hbWUgb2YgYSBzdHlsZSwgZGlkIHlvdSBtZWFuIHRvIGNyZWF0ZSBhICdkcmF3JyBncm91cGA7XG4gICAgICAgICAgICAgICAgICAgIGlmIChwYXJlbnQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1zZyArPSBgIHVuZGVyICcke3BhcmVudC5uYW1lfSdgO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIG1zZyArPSBgIGluc3RlYWQ/YDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgbG9nKCd3YXJuJywgbXNnKTsgLy8gVE9ETzogZmlyZSBleHRlcm5hbCBldmVudCB0aGF0IGNsaWVudHMgdG8gc3Vic2NyaWJlIHRvXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgIH1cblxuICAgIHJldHVybiByO1xufVxuXG5cbmV4cG9ydCBmdW5jdGlvbiBwYXJzZUxheWVycyAobGF5ZXJzLCBzdHlsZXMpIHtcbiAgICBsZXQgbGF5ZXJfdHJlZXMgPSB7fTtcblxuICAgIGZvciAobGV0IGtleSBpbiBsYXllcnMpIHtcbiAgICAgICAgbGV0IGxheWVyID0gbGF5ZXJzW2tleV07XG4gICAgICAgIGlmIChsYXllcikge1xuICAgICAgICAgICAgbGF5ZXJfdHJlZXNba2V5XSA9IHBhcnNlTGF5ZXJUcmVlKGtleSwgbGF5ZXIsIG51bGwsIHN0eWxlcyk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZXR1cm4gbGF5ZXJfdHJlZXM7XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBtYXRjaEZlYXR1cmUoY29udGV4dCwgbGF5ZXJzLCBjb2xsZWN0ZWRfbGF5ZXJzLCBjb2xsZWN0ZWRfbGF5ZXJzX2lkcykge1xuICAgIGxldCBtYXRjaGVkID0gZmFsc2U7XG4gICAgbGV0IGNoaWxkTWF0Y2hlZCA9IGZhbHNlO1xuXG4gICAgaWYgKGxheWVycy5sZW5ndGggPT09IDApIHsgcmV0dXJuOyB9XG5cbiAgICBmb3IgKGxldCByPTA7IHIgPCBsYXllcnMubGVuZ3RoOyByKyspIHtcbiAgICAgICAgbGV0IGN1cnJlbnQgPSBsYXllcnNbcl07XG5cbiAgICAgICAgaWYgKGN1cnJlbnQuaXNfbGVhZikge1xuICAgICAgICAgICAgaWYgKGN1cnJlbnQuZG9lc01hdGNoKGNvbnRleHQpKSB7XG4gICAgICAgICAgICAgICAgbWF0Y2hlZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgY29sbGVjdGVkX2xheWVycy5wdXNoKGN1cnJlbnQpO1xuICAgICAgICAgICAgICAgIGNvbGxlY3RlZF9sYXllcnNfaWRzLnB1c2goY3VycmVudC5pZCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgfSBlbHNlIGlmIChjdXJyZW50LmlzX3RyZWUpIHtcbiAgICAgICAgICAgIGlmIChjdXJyZW50LmRvZXNNYXRjaChjb250ZXh0KSkge1xuICAgICAgICAgICAgICAgIG1hdGNoZWQgPSB0cnVlO1xuXG4gICAgICAgICAgICAgICAgY2hpbGRNYXRjaGVkID0gbWF0Y2hGZWF0dXJlKFxuICAgICAgICAgICAgICAgICAgICBjb250ZXh0LFxuICAgICAgICAgICAgICAgICAgICBjdXJyZW50LmxheWVycyxcbiAgICAgICAgICAgICAgICAgICAgY29sbGVjdGVkX2xheWVycyxcbiAgICAgICAgICAgICAgICAgICAgY29sbGVjdGVkX2xheWVyc19pZHNcbiAgICAgICAgICAgICAgICApO1xuXG4gICAgICAgICAgICAgICAgaWYgKCFjaGlsZE1hdGNoZWQpIHtcbiAgICAgICAgICAgICAgICAgICAgY29sbGVjdGVkX2xheWVycy5wdXNoKGN1cnJlbnQpO1xuICAgICAgICAgICAgICAgICAgICBjb2xsZWN0ZWRfbGF5ZXJzX2lkcy5wdXNoKGN1cnJlbnQuaWQpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIHJldHVybiBtYXRjaGVkO1xufVxuIiwiLy8gUmVuZGVycyBhbiBhcnJheSBzcGVjaWZ5aW5nIGEgbGluZSBwYXR0ZXJuIG9mIGFsdGVybmF0aW5nIGRhc2hlcyBhbmQgc3BhY2VzLFxuLy8gc2ltaWxhciB0byBhbiBTVkcgYGRhc2hhcnJheWAgb3IgQ2FudmFzIHNldExpbmVEYXNoKCksIGludG8gYSBieXRlIGFycmF5IG9mIFJHQkEgcGl4ZWxzXG4vLyBSZXR1cm5zOlxuLy8ge1xuLy8gICAgcGl4ZWw6IHJlbmRlcmVkIGltYWdlIGluIFVpbnQ4QXJyYXkgYnVmZmVyXG4vLyAgICBsZW5ndGg6IHBpeGVsIGxlbmd0aCBvZiByZW5kZXJlZCBkYXNoIHBhdHRlcm4gKHN1bSBvZiBhbGwgZGFzaGVzIGFuZCBzcGFjZXMpXG4vLyB9XG4vL1xuLy8gaHR0cHM6Ly93d3cudzMub3JnL1RSL1NWRy9wYWludGluZy5odG1sI1N0cm9rZURhc2hhcnJheVByb3BlcnR5XG4vLyBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9TVkcvQXR0cmlidXRlL3N0cm9rZS1kYXNoYXJyYXlcbi8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9DYW52YXNSZW5kZXJpbmdDb250ZXh0MkQvc2V0TGluZURhc2hcblxuY29uc3QgZGVmYXVsdF9kYXNoX2NvbG9yID0gWzI1NSwgMjU1LCAyNTUsIDI1NV07XG5jb25zdCBkZWZhdWx0X2JhY2tncm91bmRfY29sb3IgPSBbMCwgMCwgMCwgMF07XG5cbmV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHJlbmRlckRhc2hBcnJheSAocGF0dGVybiwgb3B0aW9ucyA9IHt9KSB7XG4gICAgY29uc3QgZGFzaF9waXhlbCA9IG9wdGlvbnMuZGFzaF9jb2xvciB8fCBkZWZhdWx0X2Rhc2hfY29sb3I7XG4gICAgY29uc3QgYmFja2dyb3VuZF9jb2xvciA9IG9wdGlvbnMuYmFja2dyb3VuZF9jb2xvciB8fCBkZWZhdWx0X2JhY2tncm91bmRfY29sb3I7XG4gICAgY29uc3QgZGFzaGVzID0gcGF0dGVybjtcbiAgICBjb25zdCBzY2FsZSA9IG9wdGlvbnMuc2NhbGUgfHwgMTtcblxuICAgIC8vIElmIHBhdHRlcm4gaXMgb2RkLCByZXBlYXQgaXQgdG8gbWFrZSBpdCBldmVuIChzZWUgU1ZHIHNwZWMpXG4gICAgaWYgKGRhc2hlcy5sZW5ndGggJSAyID09PSAxKSB7XG4gICAgICAgIEFycmF5LnByb3RvdHlwZS5wdXNoLmFwcGx5KGRhc2hlcywgZGFzaGVzKTtcbiAgICB9XG5cbiAgICBsZXQgZGFzaCA9IHRydWU7XG4gICAgbGV0IHBpeGVscyA9IFtdO1xuICAgIGZvciAobGV0IGk9MDsgaSA8IGRhc2hlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICBsZXQgc2VnbWVudCA9IE1hdGguZmxvb3IoZGFzaGVzW2ldICogc2NhbGUpO1xuICAgICAgICBmb3IgKGxldCBzPTA7IHMgPCBzZWdtZW50OyBzKyspIHtcbiAgICAgICAgICAgIEFycmF5LnByb3RvdHlwZS5wdXNoLmFwcGx5KHBpeGVscywgZGFzaCA/IGRhc2hfcGl4ZWwgOiBiYWNrZ3JvdW5kX2NvbG9yKTtcbiAgICAgICAgfVxuICAgICAgICBkYXNoID0gIWRhc2g7IC8vIGFsdGVybmF0ZSBiZXR3ZWVuIGRhc2hlcyBhbmQgc3BhY2VzXG4gICAgfVxuXG4gICAgcGl4ZWxzID0gbmV3IFVpbnQ4QXJyYXkocGl4ZWxzKTsgLy8gY29udmVydCB0byB0eXBlZCBhcnJheVxuICAgIGNvbnN0IGxlbmd0aCA9IHBpeGVscy5sZW5ndGggLyA0OyAvLyBvbmUgUkdCQSBieXRlIHNlcXVlbmNlcyB0byBvbmUgcGl4ZWxcblxuICAgIHJldHVybiB7IHBpeGVscywgbGVuZ3RoIH07XG59XG4iLCIvLyBMaW5lIHJlbmRlcmluZyBzdHlsZVxuXG5pbXBvcnQge1N0eWxlfSBmcm9tICcuLi9zdHlsZSc7XG5pbXBvcnQge1N0eWxlUGFyc2VyfSBmcm9tICcuLi9zdHlsZV9wYXJzZXInO1xuaW1wb3J0IGdsIGZyb20gJy4uLy4uL2dsL2NvbnN0YW50cyc7IC8vIHdlYiB3b3JrZXJzIGRvbid0IGhhdmUgYWNjZXNzIHRvIEdMIGNvbnRleHQsIHNvIGltcG9ydCBhbGwgR0wgY29uc3RhbnRzXG5pbXBvcnQgVGV4dHVyZSBmcm9tICcuLi8uLi9nbC90ZXh0dXJlJztcbmltcG9ydCBWZXJ0ZXhMYXlvdXQgZnJvbSAnLi4vLi4vZ2wvdmVydGV4X2xheW91dCc7XG5pbXBvcnQge2J1aWxkUG9seWxpbmVzfSBmcm9tICcuLi8uLi9idWlsZGVycy9wb2x5bGluZXMnO1xuaW1wb3J0IHJlbmRlckRhc2hBcnJheSBmcm9tICcuL2Rhc2hhcnJheSc7XG5pbXBvcnQgR2VvIGZyb20gJy4uLy4uL2dlbyc7XG5pbXBvcnQge3NoYWRlclNyY19wb2x5Z29uc1ZlcnRleCwgc2hhZGVyU3JjX3BvbHlnb25zRnJhZ21lbnR9IGZyb20gJy4uL3BvbHlnb25zL3BvbHlnb25zJztcblxuZXhwb3J0IHZhciBMaW5lcyA9IE9iamVjdC5jcmVhdGUoU3R5bGUpO1xuXG5PYmplY3QuYXNzaWduKExpbmVzLCB7XG4gICAgbmFtZTogJ2xpbmVzJyxcbiAgICBidWlsdF9pbjogdHJ1ZSxcbiAgICB2ZXJ0ZXhfc2hhZGVyX3NyYzogc2hhZGVyU3JjX3BvbHlnb25zVmVydGV4LFxuICAgIGZyYWdtZW50X3NoYWRlcl9zcmM6IHNoYWRlclNyY19wb2x5Z29uc0ZyYWdtZW50LFxuICAgIHNlbGVjdGlvbjogdHJ1ZSwgLy8gdHVybiBmZWF0dXJlIHNlbGVjdGlvbiBvblxuXG4gICAgaW5pdCgpIHtcbiAgICAgICAgU3R5bGUuaW5pdC5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuXG4gICAgICAgIC8vIEJhc2ljIGF0dHJpYnV0ZXMsIG90aGVycyBjYW4gYmUgYWRkZWQgKHNlZSB0ZXh0dXJlIFVWcyBiZWxvdylcbiAgICAgICAgdmFyIGF0dHJpYnMgPSBbXG4gICAgICAgICAgICB7IG5hbWU6ICdhX3Bvc2l0aW9uJywgc2l6ZTogNCwgdHlwZTogZ2wuU0hPUlQsIG5vcm1hbGl6ZWQ6IGZhbHNlIH0sXG4gICAgICAgICAgICB7IG5hbWU6ICdhX2V4dHJ1ZGUnLCBzaXplOiA0LCB0eXBlOiBnbC5TSE9SVCwgbm9ybWFsaXplZDogZmFsc2UgfSxcbiAgICAgICAgICAgIHsgbmFtZTogJ2FfY29sb3InLCBzaXplOiA0LCB0eXBlOiBnbC5VTlNJR05FRF9CWVRFLCBub3JtYWxpemVkOiB0cnVlIH1cbiAgICAgICAgXTtcblxuICAgICAgICAvLyBUZWxsIHRoZSBzaGFkZXIgd2Ugd2FudCBhIG9yZGVyIGluIHZlcnRleCBhdHRyaWJ1dGVzLCBhbmQgdG8gZXh0cnVkZSBsaW5lc1xuICAgICAgICB0aGlzLmRlZmluZXMuVEFOR1JBTV9MQVlFUl9PUkRFUiA9IHRydWU7XG4gICAgICAgIHRoaXMuZGVmaW5lcy5UQU5HUkFNX0VYVFJVREVfTElORVMgPSB0cnVlO1xuXG4gICAgICAgIC8vIE9wdGlvbmFsIGZlYXR1cmUgc2VsZWN0aW9uXG4gICAgICAgIGlmICh0aGlzLnNlbGVjdGlvbikge1xuICAgICAgICAgICAgYXR0cmlicy5wdXNoKHsgbmFtZTogJ2Ffc2VsZWN0aW9uX2NvbG9yJywgc2l6ZTogNCwgdHlwZTogZ2wuVU5TSUdORURfQllURSwgbm9ybWFsaXplZDogdHJ1ZSB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIE9wdGlvbmFsIGxpbmUgdGV4dHVyZSBvciBkYXNoIGFycmF5XG4gICAgICAgIC8vIChsYXR0ZXIgd2lsbCBiZSByZW5kZXJlZCBhdCBjb21waWxlLXRpbWUsIHdoZW4gR0wgY29udGV4dCBhdmFpbGFibGUpXG4gICAgICAgIGlmICh0aGlzLnRleHR1cmUgfHwgdGhpcy5kYXNoKSB7XG4gICAgICAgICAgICB0aGlzLnRleGNvb3JkcyA9IHRydWU7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBPcHRpb25hbCB0ZXh0dXJlIFVWc1xuICAgICAgICBpZiAodGhpcy50ZXhjb29yZHMpIHtcbiAgICAgICAgICAgIHRoaXMuZGVmaW5lcy5UQU5HUkFNX1RFWFRVUkVfQ09PUkRTID0gdHJ1ZTtcblxuICAgICAgICAgICAgLy8gU2NhbGluZyBmYWN0b3IgdG8gYWRkIHByZWNpc2lvbiB0byBsaW5lIHRleHR1cmUgViBjb29yZGluYXRlIHBhY2tlZCBhcyBub3JtYWxpemVkIHNob3J0XG4gICAgICAgICAgICB0aGlzLmRlZmluZXMuVEFOR1JBTV9EQVNIX1NDQUxFID0gMTtcbiAgICAgICAgICAgIHRoaXMuZGVmaW5lcy5UQU5HUkFNX1ZfU0NBTEVfQURKVVNUID0gR2VvLnRpbGVfc2NhbGUgKiB0aGlzLmRlZmluZXMuVEFOR1JBTV9EQVNIX1NDQUxFO1xuXG4gICAgICAgICAgICAvLyBBZGQgdmVydGV4IGF0dHJpYnV0ZSBmb3IgVVZzIG9ubHkgd2hlbiBuZWVkZWRcbiAgICAgICAgICAgIGF0dHJpYnMucHVzaCh7IG5hbWU6ICdhX3RleGNvb3JkJywgc2l6ZTogMiwgdHlwZTogZ2wuVU5TSUdORURfU0hPUlQsIG5vcm1hbGl6ZWQ6IHRydWUgfSk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnZlcnRleF9sYXlvdXQgPSBuZXcgVmVydGV4TGF5b3V0KGF0dHJpYnMpO1xuXG4gICAgICAgIC8vIEFkZGl0aW9uYWwgc2luZ2xlLWFsbG9jYXRlZCBvYmplY3QgdXNlZCBmb3IgaG9sZGluZyBvdXRsaW5lIHN0eWxlIGFzIGl0IGlzIHByb2Nlc3NlZFxuICAgICAgICAvLyBTZXBhcmF0ZSBmcm9tIHRoaXMuZmVhdHVyZV9zdHlsZSBzbyB0aGF0IG91dGxpbmUgcHJvcGVydGllcyBkbyBub3Qgb3ZlcndyaXRlIGNhbGN1bGF0ZWRcbiAgICAgICAgLy8gaW5saW5lIHByb3BlcnRpZXMgKG91dGxpbmUgY2FsbCBpcyBtYWRlICp3aXRoaW4qIHRoZSBpbmxpbmUgY2FsbClcbiAgICAgICAgdGhpcy5vdXRsaW5lX2ZlYXR1cmVfc3R5bGUgPSB7fTtcbiAgICAgICAgdGhpcy5pbmxpbmVfZmVhdHVyZV9zdHlsZSA9IHRoaXMuZmVhdHVyZV9zdHlsZTsgLy8gc2F2ZSByZWZlcmVuY2UgdG8gbWFpbiBjb21wdXRlZCBzdHlsZSBvYmplY3RcbiAgICB9LFxuXG4gICAgLy8gT3ZlcnJpZGVcbiAgICBjb21waWxlU2V0dXAgKCkge1xuICAgICAgICBpZiAoIXRoaXMuY29tcGlsZV9zZXR1cCkge1xuICAgICAgICAgICAgdGhpcy5wYXJzZUxpbmVUZXh0dXJlKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFN0eWxlLmNvbXBpbGVTZXR1cC5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIH0sXG5cbiAgICAvLyBPcHRpb25hbGx5IGFwcGx5IGEgZGFzaCBhcnJheSBwYXR0ZXJuIHRvIHRoaXMgbGluZVxuICAgIHBhcnNlTGluZVRleHR1cmUgKCkge1xuICAgICAgICAvLyBTcGVjaWZ5IGEgbGluZSBwYXR0ZXJuXG4gICAgICAgIGlmICh0aGlzLmRhc2gpIHtcbiAgICAgICAgICAgIC8vIE9wdGlvbmFsIGJhY2tncm91bmQgY29sb3IgZm9yIGRhc2ggcGF0dGVybiAoZGVmYXVsdHMgdHJhbnNwYXJlbnQpXG4gICAgICAgICAgICBpZiAodGhpcy5kYXNoX2JhY2tncm91bmRfY29sb3IpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmRhc2hfYmFja2dyb3VuZF9jb2xvciA9IFN0eWxlUGFyc2VyLnBhcnNlQ29sb3IodGhpcy5kYXNoX2JhY2tncm91bmRfY29sb3IpO1xuICAgICAgICAgICAgICAgIHRoaXMuZGVmaW5lcy5UQU5HUkFNX0xJTkVfQkFDS0dST1VORF9DT0xPUiA9XG4gICAgICAgICAgICAgICAgICAgIGB2ZWMzKCR7dGhpcy5kYXNoX2JhY2tncm91bmRfY29sb3Iuc2xpY2UoMCwgMykuam9pbignLCAnKX0pYDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gQWRqdXN0IHRleGNvb3JkIHNjYWxlIHRvIGFsbG93IGZvciBkYXNoIHBhdHRlcm5zIHRoYXQgYXJlIGEgZnJhY3Rpb24gb2YgbGluZSB3aWR0aFxuICAgICAgICAgICAgdGhpcy5kZWZpbmVzLlRBTkdSQU1fREFTSF9TQ0FMRSA9IDIwO1xuICAgICAgICAgICAgdGhpcy5kZWZpbmVzLlRBTkdSQU1fVl9TQ0FMRV9BREpVU1QgPSBHZW8udGlsZV9zY2FsZSAqIHRoaXMuZGVmaW5lcy5UQU5HUkFNX0RBU0hfU0NBTEU7XG5cbiAgICAgICAgICAgIC8vIFJlbmRlciBsaW5lIHBhdHRlcm5cbiAgICAgICAgICAgIGNvbnN0IGRhc2ggPSByZW5kZXJEYXNoQXJyYXkodGhpcy5kYXNoLCB7IHNjYWxlOiB0aGlzLmRlZmluZXMuVEFOR1JBTV9EQVNIX1NDQUxFIH0pO1xuICAgICAgICAgICAgdGhpcy50ZXh0dXJlID0gJ18nICsgdGhpcy5uYW1lICsgJ19kYXNoYXJyYXknO1xuICAgICAgICAgICAgVGV4dHVyZS5jcmVhdGUodGhpcy5nbCwgdGhpcy50ZXh0dXJlLCB7XG4gICAgICAgICAgICAgICAgZGF0YTogZGFzaC5waXhlbHMsXG4gICAgICAgICAgICAgICAgaGVpZ2h0OiBkYXNoLmxlbmd0aCxcbiAgICAgICAgICAgICAgICB3aWR0aDogMSxcbiAgICAgICAgICAgICAgICBmaWx0ZXJpbmc6ICduZWFyZXN0J1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBTcGVjaWZ5IGEgbGluZSB0ZXh0dXJlIChlaXRoZXIgZGlyZWN0bHksIG9yIHJlbmRlcmVkIGRhc2ggcGF0dGVybiBmcm9tIGFib3ZlKVxuICAgICAgICBpZiAodGhpcy50ZXh0dXJlKSB7XG4gICAgICAgICAgICB0aGlzLmRlZmluZXMuVEFOR1JBTV9MSU5FX1RFWFRVUkUgPSB0cnVlO1xuICAgICAgICAgICAgdGhpcy5kZWZpbmVzLlRBTkdSQU1fQUxQSEFfVEVTVCA9IDAuNTsgLy8gcGl4ZWxzIGJlbG93IHRoaXMgdGhyZXNob2xkIGFyZSB0cmFuc3BhcmVudFxuICAgICAgICAgICAgdGhpcy5zaGFkZXJzLnVuaWZvcm1zID0gdGhpcy5zaGFkZXJzLnVuaWZvcm1zIHx8IHt9O1xuICAgICAgICAgICAgdGhpcy5zaGFkZXJzLnVuaWZvcm1zLnVfdGV4dHVyZSA9IHRoaXMudGV4dHVyZTtcbiAgICAgICAgICAgIHRoaXMuc2hhZGVycy51bmlmb3Jtcy51X3RleHR1cmVfcmF0aW8gPSAxO1xuXG4gICAgICAgICAgICAvLyB1cGRhdGUgbGluZSBwYXR0ZXJuIGFzcGVjdCByYXRpbyBhZnRlciB0ZXh0dXJlIGxvYWRzXG4gICAgICAgICAgICBUZXh0dXJlLmdldEluZm8odGhpcy50ZXh0dXJlKS50aGVuKHRleHR1cmUgPT4ge1xuICAgICAgICAgICAgICAgIGlmICh0ZXh0dXJlKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2hhZGVycy51bmlmb3Jtcy51X3RleHR1cmVfcmF0aW8gPSB0ZXh0dXJlLmhlaWdodCAvIHRleHR1cmUud2lkdGg7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgLy8gQ2FsY3VsYXRlIHdpZHRoIGF0IHpvb20gZ2l2ZW4gaW4gYGNvbnRleHRgXG4gICAgY2FsY1dpZHRoICh3aWR0aCwgY29udGV4dCkge1xuICAgICAgICByZXR1cm4gKHdpZHRoICYmIFN0eWxlUGFyc2VyLmV2YWxDYWNoZWREaXN0YW5jZVByb3BlcnR5KHdpZHRoLCBjb250ZXh0KSkgfHwgMDtcbiAgICB9LFxuXG4gICAgLy8gQ2FsY3VsYXRlIHdpZHRoIGF0IG5leHQgem9vbSAodXNlZCBmb3IgbGluZSB3aWR0aCBpbnRlcnBvbGF0aW9uKVxuICAgIGNhbGNXaWR0aE5leHRab29tICh3aWR0aCwgY29udGV4dCkge1xuICAgICAgICBjb250ZXh0Lnpvb20rKztcbiAgICAgICAgbGV0IHZhbCA9IHRoaXMuY2FsY1dpZHRoKHdpZHRoLCBjb250ZXh0KTtcbiAgICAgICAgY29udGV4dC56b29tLS07XG4gICAgICAgIHJldHVybiB2YWw7XG4gICAgfSxcblxuICAgIF9wYXJzZUZlYXR1cmUgKGZlYXR1cmUsIGRyYXcsIGNvbnRleHQpIHtcbiAgICAgICAgdmFyIHN0eWxlID0gdGhpcy5mZWF0dXJlX3N0eWxlO1xuXG4gICAgICAgIC8vIGxpbmUgd2lkdGggaW4gbWV0ZXJzXG4gICAgICAgIGxldCB3aWR0aCA9IHRoaXMuY2FsY1dpZHRoKGRyYXcud2lkdGgsIGNvbnRleHQpO1xuICAgICAgICBpZiAod2lkdGggPCAwKSB7XG4gICAgICAgICAgICByZXR1cm47IC8vIHNraXAgbGluZXMgd2l0aCBuZWdhdGl2ZSB3aWR0aFxuICAgICAgICB9XG4gICAgICAgIGxldCBuZXh0X3dpZHRoID0gdGhpcy5jYWxjV2lkdGhOZXh0Wm9vbShkcmF3Lm5leHRfd2lkdGgsIGNvbnRleHQpO1xuXG4gICAgICAgIGlmICgod2lkdGggPT09IDAgJiYgbmV4dF93aWR0aCA9PT0gMCkgfHwgbmV4dF93aWR0aCA8IDApIHtcbiAgICAgICAgICAgIHJldHVybjsgLy8gc2tpcCBsaW5lcyB0aGF0IGRvbid0IGludGVycG9sYXRlIHRvIGEgcG9zaXRpdmUgdmFsdWUgYXQgbmV4dCB6b29tXG4gICAgICAgIH1cblxuICAgICAgICAvLyBjb252ZXJ0IHRvIHVuaXRzIGFuZCByZWxhdGl2ZSBjaGFuZ2UgZnJvbSBwcmV2aW91cyB6b29tXG4gICAgICAgIC8vIE5COiBtdWx0aXBseSBieSAyIGJlY2F1c2UgYSBnaXZlbiB3aWR0aCBpcyB0d2ljZSBhcyBiaWcgaW4gc2NyZWVuIHNwYWNlIGF0IHRoZSBuZXh0IHpvb21cbiAgICAgICAgc3R5bGUud2lkdGggPSB3aWR0aCAqIGNvbnRleHQudW5pdHNfcGVyX21ldGVyX292ZXJ6b29tO1xuICAgICAgICBzdHlsZS5uZXh0X3dpZHRoID0gKG5leHRfd2lkdGggKiAyKSAtIHdpZHRoO1xuICAgICAgICBzdHlsZS5uZXh0X3dpZHRoICo9IGNvbnRleHQudW5pdHNfcGVyX21ldGVyX292ZXJ6b29tO1xuICAgICAgICBzdHlsZS5uZXh0X3dpZHRoIC89IDI7IC8vIE5COiBkaXZpZGUgYnkgMiBiZWNhdXNlIGV4dHJ1c2lvbiB3aWR0aCBpcyBoYWx2ZWQgaW4gYnVpbGRlciAtIHJlbW92ZT9cblxuICAgICAgICBzdHlsZS5jb2xvciA9IHRoaXMucGFyc2VDb2xvcihkcmF3LmNvbG9yLCBjb250ZXh0KTtcbiAgICAgICAgaWYgKCFzdHlsZS5jb2xvcikge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gaGVpZ2h0IGRlZmF1bHRzIHRvIGZlYXR1cmUgaGVpZ2h0LCBidXQgZXh0cnVkZSBzdHlsZSBjYW4gZHluYW1pY2FsbHkgYWRqdXN0IGhlaWdodCBieSByZXR1cm5pbmcgYSBudW1iZXIgb3IgYXJyYXkgKGluc3RlYWQgb2YgYSBib29sZWFuKVxuICAgICAgICBzdHlsZS56ID0gKGRyYXcueiAmJiBTdHlsZVBhcnNlci5ldmFsQ2FjaGVkRGlzdGFuY2VQcm9wZXJ0eShkcmF3LnogfHwgMCwgY29udGV4dCkpIHx8IFN0eWxlUGFyc2VyLmRlZmF1bHRzLno7XG4gICAgICAgIHN0eWxlLmhlaWdodCA9IGZlYXR1cmUucHJvcGVydGllcy5oZWlnaHQgfHwgU3R5bGVQYXJzZXIuZGVmYXVsdHMuaGVpZ2h0O1xuICAgICAgICBzdHlsZS5leHRydWRlID0gU3R5bGVQYXJzZXIuZXZhbFByb3BlcnR5KGRyYXcuZXh0cnVkZSwgY29udGV4dCk7XG4gICAgICAgIGlmIChzdHlsZS5leHRydWRlKSB7XG4gICAgICAgICAgICBpZiAodHlwZW9mIHN0eWxlLmV4dHJ1ZGUgPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgICAgICAgc3R5bGUuaGVpZ2h0ID0gc3R5bGUuZXh0cnVkZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKEFycmF5LmlzQXJyYXkoc3R5bGUuZXh0cnVkZSkpIHtcbiAgICAgICAgICAgICAgICBzdHlsZS5oZWlnaHQgPSBzdHlsZS5leHRydWRlWzFdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gUmFpc2UgbGluZSBoZWlnaHQgaWYgZXh0cnVkZWRcbiAgICAgICAgaWYgKHN0eWxlLmV4dHJ1ZGUgJiYgc3R5bGUuaGVpZ2h0KSB7XG4gICAgICAgICAgICBzdHlsZS56ICs9IHN0eWxlLmhlaWdodDtcbiAgICAgICAgfVxuXG4gICAgICAgIHN0eWxlLnogKj0gR2VvLmhlaWdodF9zY2FsZTsgICAgICAgIC8vIHByb3ZpZGUgc3ViLW1ldGVyIHByZWNpc2lvbiBvZiBoZWlnaHQgdmFsdWVzXG4gICAgICAgIHN0eWxlLmhlaWdodCAqPSBHZW8uaGVpZ2h0X3NjYWxlO1xuXG4gICAgICAgIHN0eWxlLmNhcCA9IGRyYXcuY2FwO1xuICAgICAgICBzdHlsZS5qb2luID0gZHJhdy5qb2luO1xuICAgICAgICBzdHlsZS5taXRlcl9saW1pdCA9IGRyYXcubWl0ZXJfbGltaXQ7XG4gICAgICAgIHN0eWxlLnRpbGVfZWRnZXMgPSBkcmF3LnRpbGVfZWRnZXM7IC8vIHVzdWFsbHkgYWN0aXZhdGVkIGZvciBkZWJ1Z2dpbmcsIG9yIHJhcmUgdmlzdWFsaXphdGlvbiBuZWVkc1xuXG4gICAgICAgIC8vIENvbnN0cnVjdCBhbiBvdXRsaW5lIHN0eWxlXG4gICAgICAgIC8vIFJldXNhYmxlIG91dGxpbmUgc3R5bGUgb2JqZWN0LCBtYXJrZWQgYXMgYWxyZWFkeSB3cmFwcGVkIGluIGNhY2hlIG9iamVjdHMgKHByZXByb2Nlc3NlZCA9IHRydWUpXG4gICAgICAgIHN0eWxlLm91dGxpbmUgPSBzdHlsZS5vdXRsaW5lIHx8IHsgd2lkdGg6IHt9LCBuZXh0X3dpZHRoOiB7fSwgcHJlcHJvY2Vzc2VkOiB0cnVlIH07XG5cbiAgICAgICAgaWYgKGRyYXcub3V0bGluZSAmJiBkcmF3Lm91dGxpbmUudmlzaWJsZSAhPT0gZmFsc2UgJiYgZHJhdy5vdXRsaW5lLmNvbG9yICYmIGRyYXcub3V0bGluZS53aWR0aCkge1xuICAgICAgICAgICAgLy8gb3V0bGluZSB3aWR0aCBpbiBtZXRlcnNcbiAgICAgICAgICAgIC8vIE5COiBtdWx0aXBseSBieSAyIGJlY2F1c2Ugb3V0bGluZSBpcyBhcHBsaWVkIG9uIGJvdGggc2lkZXMgb2YgbGluZVxuICAgICAgICAgICAgbGV0IG91dGxpbmVfd2lkdGggPSB0aGlzLmNhbGNXaWR0aChkcmF3Lm91dGxpbmUud2lkdGgsIGNvbnRleHQpICogMjtcbiAgICAgICAgICAgIGxldCBvdXRsaW5lX25leHRfd2lkdGggPSB0aGlzLmNhbGNXaWR0aE5leHRab29tKGRyYXcub3V0bGluZS5uZXh0X3dpZHRoLCBjb250ZXh0KSAqIDI7XG5cbiAgICAgICAgICAgIGlmICgob3V0bGluZV93aWR0aCA9PT0gMCAmJiBvdXRsaW5lX25leHRfd2lkdGggPT09IDApIHx8IG91dGxpbmVfd2lkdGggPCAwIHx8IG91dGxpbmVfbmV4dF93aWR0aCA8IDApIHtcbiAgICAgICAgICAgICAgICAvLyBza2lwIGxpbmVzIHRoYXQgZG9uJ3QgaW50ZXJwb2xhdGUgYmV0d2VlbiB6ZXJvIG9yIGdyZWF0ZXIgd2lkdGhcbiAgICAgICAgICAgICAgICBzdHlsZS5vdXRsaW5lLndpZHRoLnZhbHVlID0gbnVsbDtcbiAgICAgICAgICAgICAgICBzdHlsZS5vdXRsaW5lLm5leHRfd2lkdGgudmFsdWUgPSBudWxsO1xuICAgICAgICAgICAgICAgIHN0eWxlLm91dGxpbmUuY29sb3IgPSBudWxsO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gTWFpbnRhaW4gY29uc2lzdGVudCBvdXRsaW5lIHdpZHRoIGFyb3VuZCB0aGUgbGluZSBmaWxsXG4gICAgICAgICAgICAgICAgc3R5bGUub3V0bGluZS53aWR0aC52YWx1ZSA9IG91dGxpbmVfd2lkdGggKyB3aWR0aDtcbiAgICAgICAgICAgICAgICBzdHlsZS5vdXRsaW5lLm5leHRfd2lkdGgudmFsdWUgPSBvdXRsaW5lX25leHRfd2lkdGggKyBuZXh0X3dpZHRoO1xuXG4gICAgICAgICAgICAgICAgc3R5bGUub3V0bGluZS5jb2xvciA9IGRyYXcub3V0bGluZS5jb2xvcjtcbiAgICAgICAgICAgICAgICBzdHlsZS5vdXRsaW5lLmNhcCA9IGRyYXcub3V0bGluZS5jYXAgfHwgZHJhdy5jYXA7XG4gICAgICAgICAgICAgICAgc3R5bGUub3V0bGluZS5qb2luID0gZHJhdy5vdXRsaW5lLmpvaW4gfHwgZHJhdy5qb2luO1xuICAgICAgICAgICAgICAgIHN0eWxlLm91dGxpbmUubWl0ZXJfbGltaXQgPSBkcmF3Lm91dGxpbmUubWl0ZXJfbGltaXQgfHwgZHJhdy5taXRlcl9saW1pdDtcbiAgICAgICAgICAgICAgICBzdHlsZS5vdXRsaW5lLnN0eWxlID0gZHJhdy5vdXRsaW5lLnN0eWxlIHx8IHRoaXMubmFtZTtcblxuICAgICAgICAgICAgICAgIC8vIEV4cGxpY2l0bHkgZGVmaW5lZCBvdXRsaW5lIG9yZGVyLCBvciBpbmhlcml0ZWQgZnJvbSBpbm5lciBsaW5lXG4gICAgICAgICAgICAgICAgaWYgKGRyYXcub3V0bGluZS5vcmRlcikge1xuICAgICAgICAgICAgICAgICAgICBzdHlsZS5vdXRsaW5lLm9yZGVyID0gdGhpcy5wYXJzZU9yZGVyKGRyYXcub3V0bGluZS5vcmRlciwgY29udGV4dCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBzdHlsZS5vdXRsaW5lLm9yZGVyID0gc3R5bGUub3JkZXI7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gRG9uJ3QgbGV0IG91dGxpbmUgYmUgYWJvdmUgaW5uZXIgbGluZVxuICAgICAgICAgICAgICAgIGlmIChzdHlsZS5vdXRsaW5lLm9yZGVyID4gc3R5bGUub3JkZXIpIHtcbiAgICAgICAgICAgICAgICAgICAgc3R5bGUub3V0bGluZS5vcmRlciA9IHN0eWxlLm9yZGVyO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIE91dGxpbmVzIGFyZSBhbHdheXMgYXQgaGFsZi1sYXllciBpbnRlcnZhbHMgdG8gYXZvaWQgY29uZmxpY3Rpbmcgd2l0aCBpbm5lciBsaW5lc1xuICAgICAgICAgICAgICAgIHN0eWxlLm91dGxpbmUub3JkZXIgLT0gMC41O1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgc3R5bGUub3V0bGluZS53aWR0aC52YWx1ZSA9IG51bGw7XG4gICAgICAgICAgICBzdHlsZS5vdXRsaW5lLm5leHRfd2lkdGgudmFsdWUgPSBudWxsO1xuICAgICAgICAgICAgc3R5bGUub3V0bGluZS5jb2xvciA9IG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gc3R5bGU7XG4gICAgfSxcblxuICAgIF9wcmVwcm9jZXNzIChkcmF3KSB7XG4gICAgICAgIGRyYXcuY29sb3IgPSBTdHlsZVBhcnNlci5jcmVhdGVDb2xvclByb3BlcnR5Q2FjaGUoZHJhdy5jb2xvcik7XG4gICAgICAgIGRyYXcud2lkdGggPSBTdHlsZVBhcnNlci5jcmVhdGVQcm9wZXJ0eUNhY2hlKGRyYXcud2lkdGgsIFN0eWxlUGFyc2VyLnBhcnNlVW5pdHMpO1xuICAgICAgICBkcmF3Lm5leHRfd2lkdGggPSBTdHlsZVBhcnNlci5jcmVhdGVQcm9wZXJ0eUNhY2hlKGRyYXcud2lkdGgsIFN0eWxlUGFyc2VyLnBhcnNlVW5pdHMpOyAvLyB3aWR0aCB3aWxsIGJlIGNvbXB1dGVkIGZvciBuZXh0IHpvb21cbiAgICAgICAgZHJhdy56ID0gU3R5bGVQYXJzZXIuY3JlYXRlUHJvcGVydHlDYWNoZShkcmF3LnosIFN0eWxlUGFyc2VyLnBhcnNlVW5pdHMpO1xuXG4gICAgICAgIGlmIChkcmF3Lm91dGxpbmUpIHtcbiAgICAgICAgICAgIGRyYXcub3V0bGluZS5jb2xvciA9IFN0eWxlUGFyc2VyLmNyZWF0ZUNvbG9yUHJvcGVydHlDYWNoZShkcmF3Lm91dGxpbmUuY29sb3IpO1xuICAgICAgICAgICAgZHJhdy5vdXRsaW5lLndpZHRoID0gU3R5bGVQYXJzZXIuY3JlYXRlUHJvcGVydHlDYWNoZShkcmF3Lm91dGxpbmUud2lkdGgsIFN0eWxlUGFyc2VyLnBhcnNlVW5pdHMpO1xuICAgICAgICAgICAgZHJhdy5vdXRsaW5lLm5leHRfd2lkdGggPSBTdHlsZVBhcnNlci5jcmVhdGVQcm9wZXJ0eUNhY2hlKGRyYXcub3V0bGluZS53aWR0aCwgU3R5bGVQYXJzZXIucGFyc2VVbml0cyk7IC8vIHdpZHRoIHJlLWNvbXB1dGVkIGZvciBuZXh0IHpvb21cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gZHJhdztcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogQSBcInRlbXBsYXRlXCIgdGhhdCBzZXRzIGNvbnN0YW50IGF0dGlidXRlcyBmb3IgZWFjaCB2ZXJ0ZXgsIHdoaWNoIGlzIHRoZW4gbW9kaWZpZWQgcGVyIHZlcnRleCBvciBwZXIgZmVhdHVyZS5cbiAgICAgKiBBIHBsYWluIEpTIGFycmF5IG1hdGNoaW5nIHRoZSBvcmRlciBvZiB0aGUgdmVydGV4IGxheW91dC5cbiAgICAgKi9cbiAgICBtYWtlVmVydGV4VGVtcGxhdGUoc3R5bGUpIHtcbiAgICAgICAgbGV0IGkgPSAwO1xuXG4gICAgICAgIC8vIHBvc2l0aW9uIC0geCAmIHkgY29vcmRzIHdpbGwgYmUgZmlsbGVkIGluIHBlci12ZXJ0ZXggYmVsb3dcbiAgICAgICAgdGhpcy52ZXJ0ZXhfdGVtcGxhdGVbaSsrXSA9IDA7XG4gICAgICAgIHRoaXMudmVydGV4X3RlbXBsYXRlW2krK10gPSAwO1xuICAgICAgICB0aGlzLnZlcnRleF90ZW1wbGF0ZVtpKytdID0gc3R5bGUueiB8fCAwO1xuXG4gICAgICAgIC8vIGxheWVyIG9yZGVyIC0gdyBjb29yZCBvZiAncG9zaXRpb24nIGF0dHJpYnV0ZSAoZm9yIHBhY2tpbmcgZWZmaWNpZW5jeSlcbiAgICAgICAgdGhpcy52ZXJ0ZXhfdGVtcGxhdGVbaSsrXSA9IHRoaXMuc2NhbGVPcmRlcihzdHlsZS5vcmRlcik7XG5cbiAgICAgICAgLy8gZXh0cnVzaW9uIHZlY3RvclxuICAgICAgICB0aGlzLnZlcnRleF90ZW1wbGF0ZVtpKytdID0gMDtcbiAgICAgICAgdGhpcy52ZXJ0ZXhfdGVtcGxhdGVbaSsrXSA9IDA7XG4gICAgICAgIHRoaXMudmVydGV4X3RlbXBsYXRlW2krK10gPSAwO1xuXG4gICAgICAgIC8vIHNjYWxpbmcgdG8gcHJldmlvdXMgYW5kIG5leHQgem9vbVxuICAgICAgICB0aGlzLnZlcnRleF90ZW1wbGF0ZVtpKytdID0gc3R5bGUubmV4dF93aWR0aDtcblxuICAgICAgICAvLyBjb2xvclxuICAgICAgICB0aGlzLnZlcnRleF90ZW1wbGF0ZVtpKytdID0gc3R5bGUuY29sb3JbMF0gKiAyNTU7XG4gICAgICAgIHRoaXMudmVydGV4X3RlbXBsYXRlW2krK10gPSBzdHlsZS5jb2xvclsxXSAqIDI1NTtcbiAgICAgICAgdGhpcy52ZXJ0ZXhfdGVtcGxhdGVbaSsrXSA9IHN0eWxlLmNvbG9yWzJdICogMjU1O1xuICAgICAgICB0aGlzLnZlcnRleF90ZW1wbGF0ZVtpKytdID0gc3R5bGUuY29sb3JbM10gKiAyNTU7XG5cbiAgICAgICAgLy8gc2VsZWN0aW9uIGNvbG9yXG4gICAgICAgIGlmICh0aGlzLnNlbGVjdGlvbikge1xuICAgICAgICAgICAgdGhpcy52ZXJ0ZXhfdGVtcGxhdGVbaSsrXSA9IHN0eWxlLnNlbGVjdGlvbl9jb2xvclswXSAqIDI1NTtcbiAgICAgICAgICAgIHRoaXMudmVydGV4X3RlbXBsYXRlW2krK10gPSBzdHlsZS5zZWxlY3Rpb25fY29sb3JbMV0gKiAyNTU7XG4gICAgICAgICAgICB0aGlzLnZlcnRleF90ZW1wbGF0ZVtpKytdID0gc3R5bGUuc2VsZWN0aW9uX2NvbG9yWzJdICogMjU1O1xuICAgICAgICAgICAgdGhpcy52ZXJ0ZXhfdGVtcGxhdGVbaSsrXSA9IHN0eWxlLnNlbGVjdGlvbl9jb2xvclszXSAqIDI1NTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEFkZCB0ZXh0dXJlIFVWcyB0byB0ZW1wbGF0ZSBvbmx5IGlmIG5lZWRlZFxuICAgICAgICBpZiAodGhpcy50ZXhjb29yZHMpIHtcbiAgICAgICAgICAgIHRoaXMudmVydGV4X3RlbXBsYXRlW2krK10gPSAwO1xuICAgICAgICAgICAgdGhpcy52ZXJ0ZXhfdGVtcGxhdGVbaSsrXSA9IDA7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gdGhpcy52ZXJ0ZXhfdGVtcGxhdGU7XG4gICAgfSxcblxuICAgIGJ1aWxkTGluZXMobGluZXMsIHN0eWxlLCB2ZXJ0ZXhfZGF0YSwgY29udGV4dCwgb3B0aW9ucykge1xuICAgICAgICAvLyBPdXRsaW5lIChidWlsZCBmaXJzdCBzbyB0aGF0IGJsZW5kZWQgZ2VvbWV0cnkgd2l0aG91dCBhIGRlcHRoIHRlc3QgaXMgZHJhd24gZmlyc3QvdW5kZXIgdGhlIGlubmVyIGxpbmUpXG4gICAgICAgIHRoaXMuZmVhdHVyZV9zdHlsZSA9IHRoaXMub3V0bGluZV9mZWF0dXJlX3N0eWxlOyAvLyBzd2FwIGluIG91dGxpbmUtc3BlY2lmaWMgc3R5bGUgaG9sZGVyXG4gICAgICAgIGlmIChzdHlsZS5vdXRsaW5lICYmIHN0eWxlLm91dGxpbmUuY29sb3IgIT0gbnVsbCAmJiBzdHlsZS5vdXRsaW5lLndpZHRoLnZhbHVlICE9IG51bGwpIHtcbiAgICAgICAgICAgIHZhciBvdXRsaW5lX3N0eWxlID0gdGhpcy5zdHlsZXNbc3R5bGUub3V0bGluZS5zdHlsZV07XG4gICAgICAgICAgICBpZiAob3V0bGluZV9zdHlsZSkge1xuICAgICAgICAgICAgICAgIG91dGxpbmVfc3R5bGUuYWRkRmVhdHVyZShjb250ZXh0LmZlYXR1cmUsIHN0eWxlLm91dGxpbmUsIGNvbnRleHQpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gTWFpbiBsaW5lXG4gICAgICAgIHRoaXMuZmVhdHVyZV9zdHlsZSA9IHRoaXMuaW5saW5lX2ZlYXR1cmVfc3R5bGU7IC8vIHJlc3RvcmUgY2FsY3VsYXRlZCBzdHlsZSBmb3IgaW5saW5lXG4gICAgICAgIGxldCB2ZXJ0ZXhfdGVtcGxhdGUgPSB0aGlzLm1ha2VWZXJ0ZXhUZW1wbGF0ZShzdHlsZSk7XG4gICAgICAgIGJ1aWxkUG9seWxpbmVzKFxuICAgICAgICAgICAgbGluZXMsXG4gICAgICAgICAgICBzdHlsZS53aWR0aCxcbiAgICAgICAgICAgIHZlcnRleF9kYXRhLFxuICAgICAgICAgICAgdmVydGV4X3RlbXBsYXRlLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIGNhcDogc3R5bGUuY2FwLFxuICAgICAgICAgICAgICAgIGpvaW46IHN0eWxlLmpvaW4sXG4gICAgICAgICAgICAgICAgbWl0ZXJfbGltaXQ6IHN0eWxlLm1pdGVyX2xpbWl0LFxuICAgICAgICAgICAgICAgIHNjYWxpbmdfaW5kZXg6IHRoaXMudmVydGV4X2xheW91dC5pbmRleC5hX2V4dHJ1ZGUsXG4gICAgICAgICAgICAgICAgc2NhbGluZ19ub3JtYWxpemU6IDI1NiwgLy8gdmFsdWVzIGhhdmUgYW4gOC1iaXQgZnJhY3Rpb25cbiAgICAgICAgICAgICAgICB0ZXhjb29yZF9pbmRleDogdGhpcy52ZXJ0ZXhfbGF5b3V0LmluZGV4LmFfdGV4Y29vcmQsXG4gICAgICAgICAgICAgICAgdGV4Y29vcmRfd2lkdGg6IChzdHlsZS53aWR0aCB8fCBzdHlsZS5uZXh0X3dpZHRoKSAvIGNvbnRleHQudGlsZS5vdmVyem9vbTIsIC8vIFVWcyBjYW4ndCBjYWxjIGZvciB6ZXJvLXdpZHRoLCB1c2UgbmV4dCB6b29tIHdpZHRoIGluIHRoYXQgY2FzZVxuICAgICAgICAgICAgICAgIHRleGNvb3JkX25vcm1hbGl6ZTogNjU1MzUsIC8vIHNjYWxlIFVWcyB0byB1bnNpZ25lZCBzaG9ydHNcbiAgICAgICAgICAgICAgICBjbG9zZWRfcG9seWdvbjogb3B0aW9ucyAmJiBvcHRpb25zLmNsb3NlZF9wb2x5Z29uLFxuICAgICAgICAgICAgICAgIHJlbW92ZV90aWxlX2VkZ2VzOiAhc3R5bGUudGlsZV9lZGdlcyAmJiBvcHRpb25zICYmIG9wdGlvbnMucmVtb3ZlX3RpbGVfZWRnZXMsXG4gICAgICAgICAgICAgICAgdGlsZV9lZGdlX3RvbGVyYW5jZTogR2VvLnRpbGVfc2NhbGUgKiBjb250ZXh0LnRpbGUucGFkX3NjYWxlICogNFxuICAgICAgICAgICAgfVxuICAgICAgICApO1xuICAgIH0sXG5cbiAgICBidWlsZFBvbHlnb25zKHBvbHlnb25zLCBzdHlsZSwgdmVydGV4X2RhdGEsIGNvbnRleHQpIHtcbiAgICAgICAgLy8gUmVuZGVyIHBvbHlnb25zIGFzIGluZGl2aWR1YWwgbGluZXNcbiAgICAgICAgZm9yIChsZXQgcD0wOyBwIDwgcG9seWdvbnMubGVuZ3RoOyBwKyspIHtcbiAgICAgICAgICAgIHRoaXMuYnVpbGRMaW5lcyhwb2x5Z29uc1twXSwgc3R5bGUsIHZlcnRleF9kYXRhLCBjb250ZXh0LCB7IGNsb3NlZF9wb2x5Z29uOiB0cnVlLCByZW1vdmVfdGlsZV9lZGdlczogdHJ1ZSB9KTtcbiAgICAgICAgfVxuICAgIH1cblxufSk7XG4iLCIvLyBQb2ludCArIHRleHQgbGFiZWwgcmVuZGVyaW5nIHN0eWxlXG5cbmltcG9ydCBsb2cgZnJvbSAnLi4vLi4vdXRpbHMvbG9nJztcbmltcG9ydCB7U3R5bGV9IGZyb20gJy4uL3N0eWxlJztcbmltcG9ydCB7U3R5bGVQYXJzZXJ9IGZyb20gJy4uL3N0eWxlX3BhcnNlcic7XG5pbXBvcnQgZ2wgZnJvbSAnLi4vLi4vZ2wvY29uc3RhbnRzJzsgLy8gd2ViIHdvcmtlcnMgZG9uJ3QgaGF2ZSBhY2Nlc3MgdG8gR0wgY29udGV4dCwgc28gaW1wb3J0IGFsbCBHTCBjb25zdGFudHNcbmltcG9ydCBWZXJ0ZXhMYXlvdXQgZnJvbSAnLi4vLi4vZ2wvdmVydGV4X2xheW91dCc7XG5pbXBvcnQge2J1aWxkUXVhZHNGb3JQb2ludHN9IGZyb20gJy4uLy4uL2J1aWxkZXJzL3BvaW50cyc7XG5pbXBvcnQgVGV4dHVyZSBmcm9tICcuLi8uLi9nbC90ZXh0dXJlJztcbmltcG9ydCBHZW8gZnJvbSAnLi4vLi4vZ2VvJztcbmltcG9ydCBWZWN0b3IgZnJvbSAnLi4vLi4vdmVjdG9yJztcbmltcG9ydCBDb2xsaXNpb24gZnJvbSAnLi4vLi4vbGFiZWxzL2NvbGxpc2lvbic7XG5pbXBvcnQgTGFiZWxQb2ludCBmcm9tICcuLi8uLi9sYWJlbHMvbGFiZWxfcG9pbnQnO1xuaW1wb3J0IHBsYWNlUG9pbnRzT25MaW5lIGZyb20gJy4uLy4uL2xhYmVscy9wb2ludF9wbGFjZW1lbnQnO1xuaW1wb3J0IHtUZXh0TGFiZWxzfSBmcm9tICcuLi90ZXh0L3RleHRfbGFiZWxzJztcbmltcG9ydCB7VklFV19QQU5fU05BUF9USU1FfSBmcm9tICcuLi8uLi92aWV3JztcbmltcG9ydCBkZWJ1Z1NldHRpbmdzIGZyb20gJy4uLy4uL3V0aWxzL2RlYnVnX3NldHRpbmdzJztcblxubGV0IGZzID0gcmVxdWlyZSgnZnMnKTtcbmNvbnN0IHNoYWRlclNyY19wb2ludHNWZXJ0ZXggPSBmcy5yZWFkRmlsZVN5bmMoX19kaXJuYW1lICsgJy9wb2ludHNfdmVydGV4Lmdsc2wnLCAndXRmOCcpO1xuY29uc3Qgc2hhZGVyU3JjX3BvaW50c0ZyYWdtZW50ID0gZnMucmVhZEZpbGVTeW5jKF9fZGlybmFtZSArICcvcG9pbnRzX2ZyYWdtZW50Lmdsc2wnLCAndXRmOCcpO1xuXG5jb25zdCBQTEFDRU1FTlQgPSBMYWJlbFBvaW50LlBMQUNFTUVOVDtcblxuZXhwb3J0IHZhciBQb2ludHMgPSBPYmplY3QuY3JlYXRlKFN0eWxlKTtcblxuLy8gTWl4aW4gdGV4dCBsYWJlbCBtZXRob2RzXG5PYmplY3QuYXNzaWduKFBvaW50cywgVGV4dExhYmVscyk7XG5cbk9iamVjdC5hc3NpZ24oUG9pbnRzLCB7XG4gICAgbmFtZTogJ3BvaW50cycsXG4gICAgYnVpbHRfaW46IHRydWUsXG4gICAgY29sbGlzaW9uOiB0cnVlLCAgLy8gc3R5bGUgaW5jbHVkZXMgYSBjb2xsaXNpb24gcGFzc1xuICAgIGJsZW5kOiAnb3ZlcmxheScsIC8vIG92ZXJsYXlzIGRyYXduIG9uIHRvcCBvZiBhbGwgb3RoZXIgc3R5bGVzLCB3aXRoIGJsZW5kaW5nXG5cbiAgICBpbml0KG9wdGlvbnMgPSB7fSkge1xuICAgICAgICBTdHlsZS5pbml0LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG5cbiAgICAgICAgLy8gQmFzZSBzaGFkZXJzXG4gICAgICAgIHRoaXMudmVydGV4X3NoYWRlcl9zcmMgPSBzaGFkZXJTcmNfcG9pbnRzVmVydGV4O1xuICAgICAgICB0aGlzLmZyYWdtZW50X3NoYWRlcl9zcmMgPSBzaGFkZXJTcmNfcG9pbnRzRnJhZ21lbnQ7XG5cbiAgICAgICAgdmFyIGF0dHJpYnMgPSBbXG4gICAgICAgICAgICB7IG5hbWU6ICdhX3Bvc2l0aW9uJywgc2l6ZTogNCwgdHlwZTogZ2wuU0hPUlQsIG5vcm1hbGl6ZWQ6IGZhbHNlIH0sXG4gICAgICAgICAgICB7IG5hbWU6ICdhX3NoYXBlJywgc2l6ZTogNCwgdHlwZTogZ2wuU0hPUlQsIG5vcm1hbGl6ZWQ6IGZhbHNlIH0sXG4gICAgICAgICAgICB7IG5hbWU6ICdhX3RleGNvb3JkJywgc2l6ZTogMiwgdHlwZTogZ2wuVU5TSUdORURfU0hPUlQsIG5vcm1hbGl6ZWQ6IHRydWUgfSxcbiAgICAgICAgICAgIHsgbmFtZTogJ2Ffb2Zmc2V0Jywgc2l6ZTogMiwgdHlwZTogZ2wuU0hPUlQsIG5vcm1hbGl6ZWQ6IGZhbHNlIH0sXG4gICAgICAgICAgICB7IG5hbWU6ICdhX2NvbG9yJywgc2l6ZTogNCwgdHlwZTogZ2wuVU5TSUdORURfQllURSwgbm9ybWFsaXplZDogdHJ1ZSB9XG4gICAgICAgIF07XG5cbiAgICAgICAgLy8gRmVhdHVyZSBzZWxlY3Rpb25cbiAgICAgICAgdGhpcy5zZWxlY3Rpb24gPSB0cnVlO1xuICAgICAgICBhdHRyaWJzLnB1c2goeyBuYW1lOiAnYV9zZWxlY3Rpb25fY29sb3InLCBzaXplOiA0LCB0eXBlOiBnbC5VTlNJR05FRF9CWVRFLCBub3JtYWxpemVkOiB0cnVlIH0pO1xuXG4gICAgICAgIHRoaXMudmVydGV4X2xheW91dCA9IG5ldyBWZXJ0ZXhMYXlvdXQoYXR0cmlicyk7XG5cbiAgICAgICAgLy8gSWYgd2UncmUgbm90IHJlbmRlcmluZyBhcyBvdmVybGF5LCB3ZSBuZWVkIGEgbGF5ZXIgYXR0cmlidXRlXG4gICAgICAgIGlmICh0aGlzLmJsZW5kICE9PSAnb3ZlcmxheScpIHtcbiAgICAgICAgICAgIHRoaXMuZGVmaW5lcy5UQU5HUkFNX0xBWUVSX09SREVSID0gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIGVuc3VyZSBhIGxhYmVsIHRleHR1cmUgaXMgYWx3YXlzIGJvdW5kIChhdm9pZCBDaHJvbWUgJ25vIHRleHR1cmUgYm91bmQgdG8gdW5pdCcgd2FybmluZ3MpXG4gICAgICAgIHRoaXMuc2hhZGVycy51bmlmb3JtcyA9IHRoaXMuc2hhZGVycy51bmlmb3JtcyB8fCB7fTtcbiAgICAgICAgdGhpcy5zaGFkZXJzLnVuaWZvcm1zLnVfbGFiZWxfdGV4dHVyZSA9IFRleHR1cmUuZGVmYXVsdDtcblxuICAgICAgICBpZiAodGhpcy50ZXh0dXJlKSB7XG4gICAgICAgICAgICB0aGlzLmRlZmluZXMuVEFOR1JBTV9QT0lOVF9URVhUVVJFID0gdHJ1ZTtcbiAgICAgICAgICAgIHRoaXMuc2hhZGVycy51bmlmb3Jtcy51X3RleHR1cmUgPSB0aGlzLnRleHR1cmU7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBFbmFibGUgZHVhbCBwb2ludC90ZXh0IG1vZGVcbiAgICAgICAgdGhpcy5kZWZpbmVzLlRBTkdSQU1fTVVMVElfU0FNUExFUiA9IHRydWU7XG5cbiAgICAgICAgLy8gRmFkZSBvdXQgd2hlbiB0aWxlIGlzIHpvb21pbmcgb3V0LCBlLmcuIGFjdGluZyBhcyBwcm94eSB0aWxlc1xuICAgICAgICB0aGlzLmRlZmluZXMuVEFOR1JBTV9GQURFX09OX1pPT01fT1VUID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5kZWZpbmVzLlRBTkdSQU1fRkFERV9PTl9aT09NX09VVF9SQVRFID0gMjsgLy8gZmFkZSBhdCAyeCwgZS5nLiBmdWxseSB0cmFuc3BhcmVudCBhdCAwLjUgem9vbSBsZXZlbCBhd2F5XG5cbiAgICAgICAgLy8gRmFkZSBpbiAoZGVwZW5kaW5nIG9uIHRpbGUgcHJveHkgc3RhdHVzKVxuICAgICAgICBpZiAoZGVidWdTZXR0aW5ncy5zdXBwcmVzc19sYWJlbF9mYWRlX2luID09PSB0cnVlKSB7XG4gICAgICAgICAgICB0aGlzLmZhZGVfaW5fdGltZSA9IDA7XG4gICAgICAgICAgICB0aGlzLmRlZmluZXMuVEFOR1JBTV9GQURFX0lOX1JBVEUgPSBudWxsO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5mYWRlX2luX3RpbWUgPSAwLjE1OyAvLyB0aW1lIGluIHNlY29uZHNcbiAgICAgICAgICAgIHRoaXMuZGVmaW5lcy5UQU5HUkFNX0ZBREVfSU5fUkFURSA9IDEgLyB0aGlzLmZhZGVfaW5fdGltZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFNuYXAgcG9pbnRzIHRvIHBpeGVsIGdyaWQgYWZ0ZXIgcGFubmluZyBzdG9wXG4gICAgICAgIGlmIChkZWJ1Z1NldHRpbmdzLnN1cHByZXNzX2xhYmVsX3NuYXBfYW5pbWF0aW9uICE9PSB0cnVlKSB7XG4gICAgICAgICAgICB0aGlzLmRlZmluZXMuVEFOR1JBTV9WSUVXX1BBTl9TTkFQX1JBVEUgPSAxIC8gVklFV19QQU5fU05BUF9USU1FOyAvLyBpbnZlcnNlIHRpbWUgaW4gc2Vjb25kc1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5jb2xsaXNpb25fZ3JvdXBfcG9pbnRzID0gdGhpcy5uYW1lKyctcG9pbnRzJztcbiAgICAgICAgdGhpcy5jb2xsaXNpb25fZ3JvdXBfdGV4dCA9IHRoaXMubmFtZSsnLXRleHQnO1xuXG4gICAgICAgIHRoaXMucmVzZXQoKTtcbiAgICB9LFxuXG4gICAgcmVzZXQgKCkge1xuICAgICAgICB0aGlzLnF1ZXVlcyA9IHt9O1xuICAgICAgICB0aGlzLnJlc2V0VGV4dCgpO1xuICAgICAgICB0aGlzLnRleHR1cmVfbWlzc2luZ19zcHJpdGVzID0ge307IC8vIHRyYWNrIHdoaWNoIG1pc3Npbmcgc3ByaXRlcyB3ZSd2ZSBmb3VuZCAocmVkdWNlIGR1cGUgbG9nIG1lc3NhZ2VzKVxuICAgIH0sXG5cbiAgICAvLyBPdmVycmlkZSB0byBxdWV1ZSBmZWF0dXJlcyBpbnN0ZWFkIG9mIHByb2Nlc3NpbmcgaW1tZWRpYXRlbHlcbiAgICBhZGRGZWF0dXJlIChmZWF0dXJlLCBkcmF3LCBjb250ZXh0KSB7XG4gICAgICAgIGxldCB0aWxlID0gY29udGV4dC50aWxlO1xuICAgICAgICBpZiAodGlsZS5nZW5lcmF0aW9uICE9PSB0aGlzLmdlbmVyYXRpb24pIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENhbGxlZCBoZXJlIGJlY2F1c2Ugb3RoZXJ3aXNlIGl0IHdpbGwgYmUgZGVsYXllZCB1bnRpbCB0aGUgZmVhdHVyZSBxdWV1ZSBpcyBwYXJzZWQsXG4gICAgICAgIC8vIGFuZCB3ZSB3YW50IHRoZSBwcmVwcm9jZXNzaW5nIGRvbmUgYmVmb3JlIHdlIGV2YWx1YXRlIHRleHQgc3R5bGUgYmVsb3dcbiAgICAgICAgZHJhdyA9IHRoaXMucHJlcHJvY2VzcyhkcmF3KTtcbiAgICAgICAgaWYgKCFkcmF3KSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgc3R5bGUgPSB7fTtcbiAgICAgICAgc3R5bGUuY29sb3IgPSB0aGlzLnBhcnNlQ29sb3IoZHJhdy5jb2xvciwgY29udGV4dCk7XG5cbiAgICAgICAgLy8gUG9pbnQgc3R5bGluZ1xuXG4gICAgICAgIC8vIHJlcXVpcmUgY29sb3Igb3IgdGV4dHVyZVxuICAgICAgICBpZiAoIXN0eWxlLmNvbG9yICYmICF0aGlzLnRleHR1cmUpIHtcbiAgICAgICAgICAgIHJldHVybiBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHNwcml0ZSA9IHN0eWxlLnNwcml0ZSA9IFN0eWxlUGFyc2VyLmV2YWxQcm9wZXJ0eShkcmF3LnNwcml0ZSwgY29udGV4dCk7XG4gICAgICAgIHN0eWxlLnNwcml0ZV9kZWZhdWx0ID0gZHJhdy5zcHJpdGVfZGVmYXVsdDsgLy8gb3B0aW9uYWwgZmFsbGJhY2sgaWYgJ3Nwcml0ZScgbm90IGZvdW5kXG5cbiAgICAgICAgLy8gaWYgcG9pbnQgaGFzIHRleHR1cmUgYW5kIHNwcml0ZXMsIHJlcXVpcmUgYSB2YWxpZCBzcHJpdGUgdG8gZHJhd1xuICAgICAgICBpZiAodGhpcy50ZXh0dXJlICYmIFRleHR1cmUudGV4dHVyZXNbdGhpcy50ZXh0dXJlXSAmJiBUZXh0dXJlLnRleHR1cmVzW3RoaXMudGV4dHVyZV0uc3ByaXRlcykge1xuICAgICAgICAgICAgaWYgKCFzcHJpdGUgJiYgIXN0eWxlLnNwcml0ZV9kZWZhdWx0KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAoIVRleHR1cmUudGV4dHVyZXNbdGhpcy50ZXh0dXJlXS5zcHJpdGVzW3Nwcml0ZV0pIHtcbiAgICAgICAgICAgICAgICAvLyBJZiBzcHJpdGUgbm90IGZvdW5kLCBjaGVjayBmb3IgZGVmYXVsdCBzcHJpdGVcbiAgICAgICAgICAgICAgICBpZiAoc3R5bGUuc3ByaXRlX2RlZmF1bHQpIHtcbiAgICAgICAgICAgICAgICAgICAgc3ByaXRlID0gc3R5bGUuc3ByaXRlX2RlZmF1bHQ7XG4gICAgICAgICAgICAgICAgICAgIGlmICghVGV4dHVyZS50ZXh0dXJlc1t0aGlzLnRleHR1cmVdLnNwcml0ZXNbc3ByaXRlXSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbG9nKCd3YXJuJywgYFN0eWxlOiBpbiBzdHlsZSAnJHt0aGlzLm5hbWV9JywgY291bGQgbm90IGZpbmQgZGVmYXVsdCBzcHJpdGUgJyR7c3ByaXRlfScgZm9yIHRleHR1cmUgJyR7dGhpcy50ZXh0dXJlfSdgKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCF0aGlzLnRleHR1cmVfbWlzc2luZ19zcHJpdGVzW3Nwcml0ZV0pIHsgLy8gb25seSBsb2cgZWFjaCBtaXNzaW5nIHNwcml0ZSBvbmNlXG4gICAgICAgICAgICAgICAgICAgICAgICBsb2coJ2RlYnVnJywgYFN0eWxlOiBpbiBzdHlsZSAnJHt0aGlzLm5hbWV9JywgY291bGQgbm90IGZpbmQgc3ByaXRlICcke3Nwcml0ZX0nIGZvciB0ZXh0dXJlICcke3RoaXMudGV4dHVyZX0nYCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLnRleHR1cmVfbWlzc2luZ19zcHJpdGVzW3Nwcml0ZV0gPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoc3ByaXRlKSB7XG4gICAgICAgICAgICBsb2coJ3dhcm4nLCBgU3R5bGU6IGluIHN0eWxlICcke3RoaXMubmFtZX0nLCBzcHJpdGUgJyR7c3ByaXRlfScgd2FzIHNwZWNpZmllZCwgYnV0IHRleHR1cmUgJyR7dGhpcy50ZXh0dXJlfScgaGFzIG5vIHNwcml0ZXNgKTtcbiAgICAgICAgICAgIHNwcml0ZSA9IG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBTZXRzIHRleGNvb3JkIHNjYWxlIGlmIG5lZWRlZCAoZS5nLiBmb3Igc3ByaXRlIHN1Yi1hcmVhKVxuICAgICAgICBsZXQgc3ByaXRlX2luZm87XG4gICAgICAgIGlmICh0aGlzLnRleHR1cmUgJiYgc3ByaXRlKSB7XG4gICAgICAgICAgICBzcHJpdGVfaW5mbyA9IFRleHR1cmUuZ2V0U3ByaXRlSW5mbyh0aGlzLnRleHR1cmUsIHNwcml0ZSk7XG4gICAgICAgICAgICBzdHlsZS50ZXhjb29yZHMgPSBzcHJpdGVfaW5mby50ZXhjb29yZHM7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBzdHlsZS50ZXhjb29yZHMgPSBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gcG9pbnRzIGNhbiBiZSBwbGFjZWQgb2ZmIHRoZSBncm91bmRcbiAgICAgICAgc3R5bGUueiA9IChkcmF3LnogJiYgU3R5bGVQYXJzZXIuZXZhbENhY2hlZERpc3RhbmNlUHJvcGVydHkoZHJhdy56LCBjb250ZXh0KSkgfHwgU3R5bGVQYXJzZXIuZGVmYXVsdHMuejtcblxuICAgICAgICAvLyBwb2ludCBzaXplIGRlZmluZWQgZXhwbGljaXRseSwgb3IgZGVmYXVsdHMgdG8gc3ByaXRlIHNpemUsIG9yIGdlbmVyaWMgZmFsbGJhY2tcbiAgICAgICAgc3R5bGUuc2l6ZSA9IGRyYXcuc2l6ZTtcbiAgICAgICAgaWYgKCFzdHlsZS5zaXplKSB7XG4gICAgICAgICAgICBpZiAoc3ByaXRlX2luZm8pIHtcbiAgICAgICAgICAgICAgICBzdHlsZS5zaXplID0gc3ByaXRlX2luZm8uc2l6ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHN0eWxlLnNpemUgPSBbMTYsIDE2XTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHN0eWxlLnNpemUgPSBTdHlsZVBhcnNlci5ldmFsQ2FjaGVkUHJvcGVydHkoc3R5bGUuc2l6ZSwgY29udGV4dCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBzaXplIHdpbGwgYmUgc2NhbGVkIHRvIDE2LWJpdCBzaWduZWQgaW50LCBzbyBtYXggYWxsb3dlZCB3aWR0aCArIGhlaWdodCBvZiAyNTYgcGl4ZWxzXG4gICAgICAgIHN0eWxlLnNpemUgPSBbXG4gICAgICAgICAgICBNYXRoLm1pbigoc3R5bGUuc2l6ZVswXSB8fCBzdHlsZS5zaXplKSwgMjU2KSxcbiAgICAgICAgICAgIE1hdGgubWluKChzdHlsZS5zaXplWzFdIHx8IHN0eWxlLnNpemUpLCAyNTYpXG4gICAgICAgIF07XG5cbiAgICAgICAgLy8gUGxhY2VtZW50IHN0cmF0ZWd5XG4gICAgICAgIHN0eWxlLnBsYWNlbWVudCA9IGRyYXcucGxhY2VtZW50O1xuICAgICAgICBzdHlsZS5wbGFjZW1lbnRfbWluX2xlbmd0aF9yYXRpbyA9IFN0eWxlUGFyc2VyLmV2YWxDYWNoZWRQcm9wZXJ0eShkcmF3LnBsYWNlbWVudF9taW5fbGVuZ3RoX3JhdGlvLCBjb250ZXh0KTtcblxuICAgICAgICAvLyBTcGFjaW5nIHBhcmFtZXRlciAoaW4gcGl4ZWxzKSB0byBlcXVhbGx5IHNwYWNlIHBvaW50cyBhbG9uZyBhIGxpbmVcbiAgICAgICAgaWYgKHN0eWxlLnBsYWNlbWVudCA9PT0gUExBQ0VNRU5ULlNQQUNFRCAmJiBkcmF3LnBsYWNlbWVudF9zcGFjaW5nKSB7XG4gICAgICAgICAgICBzdHlsZS5wbGFjZW1lbnRfc3BhY2luZyA9IFN0eWxlUGFyc2VyLmV2YWxDYWNoZWRQcm9wZXJ0eShkcmF3LnBsYWNlbWVudF9zcGFjaW5nLCBjb250ZXh0KTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEFuZ2xlIHBhcmFtZXRlciAoY2FuIGJlIGEgbnVtYmVyIG9yIHRoZSBzdHJpbmcgXCJhdXRvXCIpXG4gICAgICAgIHN0eWxlLmFuZ2xlID0gU3R5bGVQYXJzZXIuZXZhbFByb3BlcnR5KGRyYXcuYW5nbGUsIGNvbnRleHQpO1xuXG4gICAgICAgIHN0eWxlLnRpbGVfZWRnZXMgPSBkcmF3LnRpbGVfZWRnZXM7IC8vIHVzdWFsbHkgYWN0aXZhdGVkIGZvciBkZWJ1Z2dpbmcsIG9yIHJhcmUgdmlzdWFsaXphdGlvbiBuZWVkc1xuXG4gICAgICAgIHN0eWxlLnNhbXBsZXIgPSAwOyAvLyAwID0gc3ByaXRlc1xuXG4gICAgICAgIHRoaXMuY29tcHV0ZUxheW91dChzdHlsZSwgZmVhdHVyZSwgZHJhdywgY29udGV4dCwgdGlsZSk7XG5cbiAgICAgICAgLy8gVGV4dCBzdHlsaW5nXG4gICAgICAgIGxldCB0ZiA9XG4gICAgICAgICAgICBkcmF3LnRleHQgJiZcbiAgICAgICAgICAgIGRyYXcudGV4dC52aXNpYmxlICE9PSBmYWxzZSAmJiAvLyBleHBsaWNpdGx5IGhhbmRsZSBgdmlzaWJsZWAgcHJvcGVydHkgZm9yIG5lc3RlZCB0ZXh0XG4gICAgICAgICAgICB0aGlzLnBhcnNlVGV4dEZlYXR1cmUoZmVhdHVyZSwgZHJhdy50ZXh0LCBjb250ZXh0LCB0aWxlKTtcblxuICAgICAgICBpZiAodGYpIHtcbiAgICAgICAgICAgIHRmLmxheW91dC5wYXJlbnQgPSBzdHlsZTsgLy8gcGFyZW50IHBvaW50IHdpbGwgYXBwbHkgYWRkaXRpb25hbCBhbmNob3Ivb2Zmc2V0IHRvIHRleHRcblxuICAgICAgICAgICAgLy8gVGV4dCBsYWJlbHMgaGF2ZSBhIGRlZmF1bHQgcHJpb3JpdHkgb2YgMC41IGJlbG93IHRoZWlyIHBhcmVudCBwb2ludCAoKzAuNSwgcHJpb3JpdHkgaXMgbG93ZXItaXMtYmV0dGVyKVxuICAgICAgICAgICAgLy8gVGhpcyBjYW4gYmUgb3ZlcnJpZGVuLCBhcyBsb25nIGFzIGl0IGlzIGxlc3MgdGhhbiBvciBlcXVhbCB0byB0aGUgZGVmYXVsdFxuICAgICAgICAgICAgdGYubGF5b3V0LnByaW9yaXR5ID0gZHJhdy50ZXh0LnByaW9yaXR5ID8gTWF0aC5tYXgodGYubGF5b3V0LnByaW9yaXR5LCBzdHlsZS5wcmlvcml0eSArIDAuNSkgOiAoc3R5bGUucHJpb3JpdHkgKyAwLjUpO1xuXG4gICAgICAgICAgICAvLyBUZXh0IGxhYmVscyBhdHRhY2hlZCB0byBwb2ludHMgc2hvdWxkIG5vdCBiZSBtb3ZlZCBpbnRvIHRpbGVcbiAgICAgICAgICAgIC8vICh0aGV5IHNob3VsZCBzdGF5IGZpeGVkIHJlbGF0aXZlIHRvIHRoZSBwb2ludClcbiAgICAgICAgICAgIHRmLmxheW91dC5tb3ZlX2ludG9fdGlsZSA9IGZhbHNlO1xuXG4gICAgICAgICAgICBDb2xsaXNpb24uYWRkU3R5bGUodGhpcy5jb2xsaXNpb25fZ3JvdXBfdGV4dCwgdGlsZS5rZXkpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gUXVldWUgdGhlIGZlYXR1cmUgZm9yIHByb2Nlc3NpbmdcbiAgICAgICAgaWYgKCF0aGlzLnRpbGVfZGF0YVt0aWxlLmtleV0pIHtcbiAgICAgICAgICAgIHRoaXMuc3RhcnREYXRhKHRpbGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5xdWV1ZXNbdGlsZS5rZXldLnB1c2goe1xuICAgICAgICAgICAgZmVhdHVyZSwgZHJhdywgY29udGV4dCwgc3R5bGUsXG4gICAgICAgICAgICB0ZXh0X2ZlYXR1cmU6IHRmXG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIFJlZ2lzdGVyIHdpdGggY29sbGlzaW9uIG1hbmFnZXJcbiAgICAgICAgQ29sbGlzaW9uLmFkZFN0eWxlKHRoaXMuY29sbGlzaW9uX2dyb3VwX3BvaW50cywgdGlsZS5rZXkpO1xuICAgIH0sXG5cbiAgICAvLyBPdmVycmlkZVxuICAgIHN0YXJ0RGF0YSAodGlsZSkge1xuICAgICAgICB0aGlzLnF1ZXVlc1t0aWxlLmtleV0gPSBbXTtcbiAgICAgICAgcmV0dXJuIFN0eWxlLnN0YXJ0RGF0YS5jYWxsKHRoaXMsIHRpbGUpO1xuICAgIH0sXG5cbiAgICAvLyBPdmVycmlkZVxuICAgIGVuZERhdGEgKHRpbGUpIHtcbiAgICAgICAgaWYgKHRpbGUuY2FuY2VsZWQpIHtcbiAgICAgICAgICAgIGxvZygndHJhY2UnLCBgU3R5bGUgJHt0aGlzLm5hbWV9OiBzdG9wIHRpbGUgYnVpbGQgYmVjYXVzZSB0aWxlIHdhcyBjYW5jZWxlZDogJHt0aWxlLmtleX1gKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBxdWV1ZSA9IHRoaXMucXVldWVzW3RpbGUua2V5XTtcbiAgICAgICAgdGhpcy5xdWV1ZXNbdGlsZS5rZXldID0gW107XG5cbiAgICAgICAgLy8gRm9yIGVhY2ggcG9pbnQgZmVhdHVyZSwgY3JlYXRlIG9uZSBvciBtb3JlIGxhYmVsc1xuICAgICAgICBsZXQgdGV4dF9vYmpzID0gW107XG4gICAgICAgIGxldCBwb2ludF9vYmpzID0gW107XG5cbiAgICAgICAgcXVldWUuZm9yRWFjaChxID0+IHtcbiAgICAgICAgICAgIGxldCBzdHlsZSA9IHEuc3R5bGU7XG4gICAgICAgICAgICBsZXQgZmVhdHVyZSA9IHEuZmVhdHVyZTtcbiAgICAgICAgICAgIGxldCBnZW9tZXRyeSA9IGZlYXR1cmUuZ2VvbWV0cnk7XG5cbiAgICAgICAgICAgIGxldCBmZWF0dXJlX2xhYmVscyA9IHRoaXMuYnVpbGRMYWJlbHMoc3R5bGUuc2l6ZSwgZ2VvbWV0cnksIHN0eWxlKTtcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZmVhdHVyZV9sYWJlbHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBsZXQgbGFiZWwgPSBmZWF0dXJlX2xhYmVsc1tpXTtcbiAgICAgICAgICAgICAgICBsZXQgcG9pbnRfb2JqID0ge1xuICAgICAgICAgICAgICAgICAgICBmZWF0dXJlLFxuICAgICAgICAgICAgICAgICAgICBkcmF3OiBxLmRyYXcsXG4gICAgICAgICAgICAgICAgICAgIGNvbnRleHQ6IHEuY29udGV4dCxcbiAgICAgICAgICAgICAgICAgICAgc3R5bGUsXG4gICAgICAgICAgICAgICAgICAgIGxhYmVsXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBwb2ludF9vYmpzLnB1c2gocG9pbnRfb2JqKTtcblxuICAgICAgICAgICAgICAgIGlmIChxLnRleHRfZmVhdHVyZSkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgdGV4dF9vYmogPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBmZWF0dXJlLFxuICAgICAgICAgICAgICAgICAgICAgICAgZHJhdzogcS50ZXh0X2ZlYXR1cmUuZHJhdyxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQ6IHEuY29udGV4dCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRleHQ6IHEudGV4dF9mZWF0dXJlLnRleHQsXG4gICAgICAgICAgICAgICAgICAgICAgICB0ZXh0X3NldHRpbmdzX2tleTogcS50ZXh0X2ZlYXR1cmUudGV4dF9zZXR0aW5nc19rZXksXG4gICAgICAgICAgICAgICAgICAgICAgICBsYXlvdXQ6IHEudGV4dF9mZWF0dXJlLmxheW91dCxcbiAgICAgICAgICAgICAgICAgICAgICAgIHBvaW50X2xhYmVsOiBsYWJlbCxcbiAgICAgICAgICAgICAgICAgICAgICAgIGxpbmtlZDogcG9pbnRfb2JqICAgLy8gbGluayBzbyB0ZXh0IG9ubHkgcmVuZGVycyB3aGVuIHBhcmVudCBwb2ludCBpcyBwbGFjZWRcbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgdGV4dF9vYmpzLnB1c2godGV4dF9vYmopO1xuXG4gICAgICAgICAgICAgICAgICAgIC8vIFVubGVzcyB0ZXh0IGZlYXR1cmUgaXMgb3B0aW9uYWwsIGNyZWF0ZSBhIHR3by13YXkgbGluayBzbyB0aGF0IHBhcmVudFxuICAgICAgICAgICAgICAgICAgICAvLyBwb2ludCB3aWxsIG9ubHkgcmVuZGVyIHdoZW4gdGV4dCBpcyBhbHNvIHBsYWNlZFxuICAgICAgICAgICAgICAgICAgICBpZiAoIXEuZHJhdy50ZXh0Lm9wdGlvbmFsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBwb2ludF9vYmoubGlua2VkID0gdGV4dF9vYmo7IC8vIHR3by13YXkgbGlua1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICAvLyBDb2xsaWRlIGJvdGggcG9pbnRzIGFuZCB0ZXh0LCB0aGVuIGJ1aWxkIGZlYXR1cmVzXG4gICAgICAgIHJldHVybiBQcm9taXNlLlxuICAgICAgICAgICAgYWxsKFtcbiAgICAgICAgICAgICAgICAvLyBQb2ludHNcbiAgICAgICAgICAgICAgICBDb2xsaXNpb24uY29sbGlkZShwb2ludF9vYmpzLCB0aGlzLmNvbGxpc2lvbl9ncm91cF9wb2ludHMsIHRpbGUua2V5KS50aGVuKHBvaW50X29ianMgPT4ge1xuICAgICAgICAgICAgICAgICAgICBwb2ludF9vYmpzLmZvckVhY2gocSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aGlzLmZlYXR1cmVfc3R5bGUgPSBxLnN0eWxlO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5mZWF0dXJlX3N0eWxlLmxhYmVsID0gcS5sYWJlbDtcbiAgICAgICAgICAgICAgICAgICAgICAgIFN0eWxlLmFkZEZlYXR1cmUuY2FsbCh0aGlzLCBxLmZlYXR1cmUsIHEuZHJhdywgcS5jb250ZXh0KTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfSksXG4gICAgICAgICAgICAgICAgLy8gTGFiZWxzXG4gICAgICAgICAgICAgICAgdGhpcy5wcmVwYXJlVGV4dExhYmVscyh0aWxlLCB0aGlzLmNvbGxpc2lvbl9ncm91cF90ZXh0LCB0ZXh0X29ianMpLlxuICAgICAgICAgICAgICAgICAgICB0aGVuKGxhYmVscyA9PiB0aGlzLmNvbGxpZGVBbmRSZW5kZXJUZXh0TGFiZWxzKHRpbGUsIHRoaXMuY29sbGlzaW9uX2dyb3VwX3RleHQsIGxhYmVscykpXG4gICAgICAgICAgICBdKS50aGVuKChbLCB7IGxhYmVscywgdGV4dHMsIHRleHR1cmUgfV0pID0+IHtcbiAgICAgICAgICAgICAgICAvLyBQcm9jZXNzIGxhYmVsc1xuICAgICAgICAgICAgICAgIGlmIChsYWJlbHMgJiYgdGV4dHMpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gQnVpbGQgcXVldWVkIGZlYXR1cmVzXG4gICAgICAgICAgICAgICAgICAgIGxhYmVscy5mb3JFYWNoKHEgPT4ge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHRleHRfc2V0dGluZ3Nfa2V5ID0gcS50ZXh0X3NldHRpbmdzX2tleTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCB0ZXh0X2luZm8gPSB0ZXh0c1t0ZXh0X3NldHRpbmdzX2tleV0gJiYgdGV4dHNbdGV4dF9zZXR0aW5nc19rZXldW3EudGV4dF07XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNldHVwIHN0eWxpbmcgb2JqZWN0IGV4cGVjdGVkIGJ5IFN0eWxlIGNsYXNzXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgc3R5bGUgPSB0aGlzLmZlYXR1cmVfc3R5bGU7XG4gICAgICAgICAgICAgICAgICAgICAgICBzdHlsZS5sYWJlbCA9IHEubGFiZWw7XG4gICAgICAgICAgICAgICAgICAgICAgICBzdHlsZS5zaXplID0gdGV4dF9pbmZvLnNpemUubG9naWNhbF9zaXplO1xuICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGUudGV4Y29vcmRzID0gdGV4dF9pbmZvLmFsaWduW3EubGFiZWwuYWxpZ25dLnRleGNvb3JkcztcbiAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlLmFuZ2xlID0gcS5sYWJlbC5hbmdsZSB8fCAwO1xuICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGUuc2FtcGxlciA9IDE7IC8vIG5vbi0wID0gbGFiZWxzXG5cbiAgICAgICAgICAgICAgICAgICAgICAgIFN0eWxlLmFkZEZlYXR1cmUuY2FsbCh0aGlzLCBxLmZlYXR1cmUsIHEuZHJhdywgcS5jb250ZXh0KTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHRoaXMuZnJlZVRleHQodGlsZSk7XG5cbiAgICAgICAgICAgICAgICAvLyBGaW5pc2ggdGlsZSBtZXNoXG4gICAgICAgICAgICAgICAgcmV0dXJuIFN0eWxlLmVuZERhdGEuY2FsbCh0aGlzLCB0aWxlKS50aGVuKHRpbGVfZGF0YSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIC8vIEF0dGFjaCB0aWxlLXNwZWNpZmljIGxhYmVsIGF0bGFzIHRvIG1lc2ggYXMgYSB0ZXh0dXJlIHVuaWZvcm1cbiAgICAgICAgICAgICAgICAgICAgaWYgKHRleHR1cmUgJiYgdGlsZV9kYXRhKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0aWxlX2RhdGEudW5pZm9ybXMgPSB0aWxlX2RhdGEudW5pZm9ybXMgfHwge307XG4gICAgICAgICAgICAgICAgICAgICAgICB0aWxlX2RhdGEudGV4dHVyZXMgPSB0aWxlX2RhdGEudGV4dHVyZXMgfHwgW107XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHRpbGVfZGF0YS51bmlmb3Jtcy51X2xhYmVsX3RleHR1cmUgPSB0ZXh0dXJlO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGlsZV9kYXRhLnRleHR1cmVzLnB1c2godGV4dHVyZSk7IC8vIGFzc2lnbiB0ZXh0dXJlIG93bmVyc2hpcCB0byB0aWxlXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRpbGVfZGF0YTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pO1xuICAgIH0sXG5cbiAgICBfcHJlcHJvY2VzcyAoZHJhdykge1xuICAgICAgICBkcmF3LmNvbG9yID0gU3R5bGVQYXJzZXIuY3JlYXRlQ29sb3JQcm9wZXJ0eUNhY2hlKGRyYXcuY29sb3IpO1xuICAgICAgICBkcmF3LnogPSBTdHlsZVBhcnNlci5jcmVhdGVQcm9wZXJ0eUNhY2hlKGRyYXcueiwgU3R5bGVQYXJzZXIucGFyc2VVbml0cyk7XG5cbiAgICAgICAgLy8gU2l6ZSAoMWQgdmFsdWUgb3IgMmQgYXJyYXkpXG4gICAgICAgIGRyYXcuc2l6ZSA9IFN0eWxlUGFyc2VyLmNyZWF0ZVByb3BlcnR5Q2FjaGUoZHJhdy5zaXplLCB2ID0+IEFycmF5LmlzQXJyYXkodikgPyB2Lm1hcChwYXJzZUZsb2F0KSA6IHBhcnNlRmxvYXQodikpO1xuXG4gICAgICAgIC8vIE9mZnNldCAoMmQgYXJyYXkpXG4gICAgICAgIGRyYXcub2Zmc2V0ID0gU3R5bGVQYXJzZXIuY3JlYXRlUHJvcGVydHlDYWNoZShkcmF3Lm9mZnNldCwgdiA9PiAoQXJyYXkuaXNBcnJheSh2KSAmJiB2Lm1hcChwYXJzZUZsb2F0KSkgfHwgMCk7XG5cbiAgICAgICAgLy8gQnVmZmVyICgxZCB2YWx1ZSBvciAyZCBhcnJheSwgZXhwYW5kIDFkIHRvIDJkKVxuICAgICAgICBkcmF3LmJ1ZmZlciA9IFN0eWxlUGFyc2VyLmNyZWF0ZVByb3BlcnR5Q2FjaGUoZHJhdy5idWZmZXIsIHYgPT4gKEFycmF5LmlzQXJyYXkodikgPyB2IDogW3YsIHZdKS5tYXAocGFyc2VGbG9hdCkgfHwgMCk7XG5cbiAgICAgICAgLy8gUmVwZWF0IHJ1bGVzIC0gbm8gcmVwZWF0IGxpbWl0YXRpb24gZm9yIHBvaW50cyBieSBkZWZhdWx0XG4gICAgICAgIGRyYXcucmVwZWF0X2Rpc3RhbmNlID0gU3R5bGVQYXJzZXIuY3JlYXRlUHJvcGVydHlDYWNoZShkcmF3LnJlcGVhdF9kaXN0YW5jZSwgcGFyc2VGbG9hdCk7XG5cbiAgICAgICAgLy8gUGxhY2VtZW50IHN0cmF0ZWdpZXNcbiAgICAgICAgZHJhdy5wbGFjZW1lbnQgPSBQTEFDRU1FTlRbZHJhdy5wbGFjZW1lbnQgJiYgZHJhdy5wbGFjZW1lbnQudG9VcHBlckNhc2UoKV07XG4gICAgICAgIGlmIChkcmF3LnBsYWNlbWVudCA9PSBudWxsKSB7XG4gICAgICAgICAgICBkcmF3LnBsYWNlbWVudCA9IFBMQUNFTUVOVC5WRVJURVg7XG4gICAgICAgIH1cblxuICAgICAgICBkcmF3LnBsYWNlbWVudF9zcGFjaW5nID0gZHJhdy5wbGFjZW1lbnRfc3BhY2luZyAhPSBudWxsID8gZHJhdy5wbGFjZW1lbnRfc3BhY2luZyA6IDgwOyAvLyBkZWZhdWx0IHNwYWNpbmdcbiAgICAgICAgZHJhdy5wbGFjZW1lbnRfc3BhY2luZyA9IFN0eWxlUGFyc2VyLmNyZWF0ZVByb3BlcnR5Q2FjaGUoZHJhdy5wbGFjZW1lbnRfc3BhY2luZywgcGFyc2VGbG9hdCk7XG5cbiAgICAgICAgZHJhdy5wbGFjZW1lbnRfbWluX2xlbmd0aF9yYXRpbyA9IGRyYXcucGxhY2VtZW50X21pbl9sZW5ndGhfcmF0aW8gIT0gbnVsbCA/IGRyYXcucGxhY2VtZW50X21pbl9sZW5ndGhfcmF0aW8gOiAxO1xuICAgICAgICBkcmF3LnBsYWNlbWVudF9taW5fbGVuZ3RoX3JhdGlvID0gU3R5bGVQYXJzZXIuY3JlYXRlUHJvcGVydHlDYWNoZShkcmF3LnBsYWNlbWVudF9taW5fbGVuZ3RoX3JhdGlvLCBwYXJzZUZsb2F0KTtcblxuICAgICAgICBpZiAodHlwZW9mIGRyYXcuYW5nbGUgPT09ICdudW1iZXInKSB7XG4gICAgICAgICAgICBkcmF3LmFuZ2xlID0gZHJhdy5hbmdsZSAqIE1hdGguUEkgLyAxODA7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBkcmF3LmFuZ2xlID0gZHJhdy5hbmdsZSB8fCAwOyAvLyBhbmdsZSBjYW4gYmUgYSBzdHJpbmcgbGlrZSBcImF1dG9cIiAodXNlIGFuZ2xlIG9mIGdlb21ldHJ5KVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gT3B0aW9uYWwgdGV4dCBzdHlsaW5nXG4gICAgICAgIGRyYXcudGV4dCA9IHRoaXMucHJlcHJvY2Vzc1RleHQoZHJhdy50ZXh0KTsgLy8gd2lsbCByZXR1cm4gbnVsbCBpZiB2YWxpZCB0ZXh0IHN0eWxpbmcgd2Fzbid0IHByb3ZpZGVkXG4gICAgICAgIGlmIChkcmF3LnRleHQpIHtcbiAgICAgICAgICAgIGRyYXcudGV4dC5rZXkgPSBkcmF3LmtleTsgLy8gY29weSBsYXllciBrZXkgZm9yIHVzZSBhcyBsYWJlbCByZXBlYXQgZ3JvdXBcbiAgICAgICAgICAgIGRyYXcudGV4dC5yZXBlYXRfZ3JvdXAgPSBkcmF3LnRleHQucmVwZWF0X2dyb3VwIHx8IGRyYXcucmVwZWF0X2dyb3VwOyAvLyBpbmhlcml0IHJlcGVhdCBncm91cCBieSBkZWZhdWx0XG4gICAgICAgICAgICBkcmF3LnRleHQuYW5jaG9yID0gZHJhdy50ZXh0LmFuY2hvciB8fCB0aGlzLmRlZmF1bHRfYW5jaG9yO1xuICAgICAgICAgICAgZHJhdy50ZXh0Lm9wdGlvbmFsID0gKHR5cGVvZiBkcmF3LnRleHQub3B0aW9uYWwgPT09ICdib29sZWFuJykgPyBkcmF3LnRleHQub3B0aW9uYWwgOiBmYWxzZTsgLy8gZGVmYXVsdCB0ZXh0IHRvIHJlcXVpcmVkXG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZHJhdztcbiAgICB9LFxuXG4gICAgLy8gRGVmYXVsdCB0byB0cnlpbmcgYWxsIGFuY2hvciBwbGFjZW1lbnRzXG4gICAgZGVmYXVsdF9hbmNob3I6IFsnYm90dG9tJywgJ3RvcCcsICdyaWdodCcsICdsZWZ0J10sXG5cbiAgICAvLyBDb21wdXRlIGxhYmVsIGxheW91dC1yZWxhdGVkIHByb3BlcnRpZXNcbiAgICBjb21wdXRlTGF5b3V0ICh0YXJnZXQsIGZlYXR1cmUsIGRyYXcsIGNvbnRleHQsIHRpbGUpIHtcbiAgICAgICAgbGV0IGxheW91dCA9IHRhcmdldCB8fCB7fTtcbiAgICAgICAgbGF5b3V0LmlkID0gZmVhdHVyZTtcbiAgICAgICAgbGF5b3V0LnVuaXRzX3Blcl9waXhlbCA9IHRpbGUudW5pdHNfcGVyX3BpeGVsIHx8IDE7XG5cbiAgICAgICAgLy8gY29sbGlzaW9uIGZsYWdcbiAgICAgICAgbGF5b3V0LmNvbGxpZGUgPSAoZHJhdy5jb2xsaWRlID09PSBmYWxzZSkgPyBmYWxzZSA6IHRydWU7XG5cbiAgICAgICAgLy8gdGlsZSBib3VuZGFyeSBoYW5kbGluZ1xuICAgICAgICBsYXlvdXQuY3VsbF9mcm9tX3RpbGUgPSAoZHJhdy5jdWxsX2Zyb21fdGlsZSAhPSBudWxsKSA/IGRyYXcuY3VsbF9mcm9tX3RpbGUgOiBmYWxzZTtcblxuICAgICAgICAvLyBwb2ludHMgc2hvdWxkIG5vdCBtb3ZlIGludG8gdGlsZSBpZiBvdmVyIHRpbGUgYm91bmRhcnlcbiAgICAgICAgbGF5b3V0Lm1vdmVfaW50b190aWxlID0gZmFsc2U7XG5cbiAgICAgICAgLy8gbGFiZWwgYW5jaG9ycyAocG9pbnQgbGFiZWxzIG9ubHkpXG4gICAgICAgIC8vIGxhYmVsIHBvc2l0aW9uIHdpbGwgYmUgYWRqdXN0ZWQgaW4gdGhlIGdpdmVuIGRpcmVjdGlvbiwgcmVsYXRpdmUgdG8gaXRzIG9yaWdpbmFsIHBvaW50XG4gICAgICAgIC8vIG9uZSBvZjogbGVmdCwgcmlnaHQsIHRvcCwgYm90dG9tLCB0b3AtbGVmdCwgdG9wLXJpZ2h0LCBib3R0b20tbGVmdCwgYm90dG9tLXJpZ2h0XG4gICAgICAgIGxheW91dC5hbmNob3IgPSBkcmF3LmFuY2hvcjtcblxuICAgICAgICAvLyBsYWJlbCBvZmZzZXQgYW5kIGJ1ZmZlciBpbiBwaXhlbCAoYXBwbGllZCBpbiBzY3JlZW4gc3BhY2UpXG4gICAgICAgIGxheW91dC5vZmZzZXQgPSBTdHlsZVBhcnNlci5ldmFsQ2FjaGVkUHJvcGVydHkoZHJhdy5vZmZzZXQsIGNvbnRleHQpIHx8IFN0eWxlUGFyc2VyLnplcm9QYWlyO1xuICAgICAgICBsYXlvdXQuYnVmZmVyID0gU3R5bGVQYXJzZXIuZXZhbENhY2hlZFByb3BlcnR5KGRyYXcuYnVmZmVyLCBjb250ZXh0KSB8fCBTdHlsZVBhcnNlci56ZXJvUGFpcjtcblxuICAgICAgICAvLyByZXBlYXQgcnVsZXNcbiAgICAgICAgbGF5b3V0LnJlcGVhdF9kaXN0YW5jZSA9IFN0eWxlUGFyc2VyLmV2YWxDYWNoZWRQcm9wZXJ0eShkcmF3LnJlcGVhdF9kaXN0YW5jZSwgY29udGV4dCk7XG4gICAgICAgIGlmIChsYXlvdXQucmVwZWF0X2Rpc3RhbmNlKSB7XG4gICAgICAgICAgICBsYXlvdXQucmVwZWF0X2Rpc3RhbmNlICo9IGxheW91dC51bml0c19wZXJfcGl4ZWw7XG5cbiAgICAgICAgICAgIGlmICh0eXBlb2YgZHJhdy5yZXBlYXRfZ3JvdXAgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICBsYXlvdXQucmVwZWF0X2dyb3VwID0gZHJhdy5yZXBlYXRfZ3JvdXAoY29udGV4dCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmICh0eXBlb2YgZHJhdy5yZXBlYXRfZ3JvdXAgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgbGF5b3V0LnJlcGVhdF9ncm91cCA9IGRyYXcucmVwZWF0X2dyb3VwO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgbGF5b3V0LnJlcGVhdF9ncm91cCA9IGRyYXcua2V5OyAvLyBkZWZhdWx0IHRvIHVuaXF1ZSBzZXQgb2YgbWF0Y2hpbmcgbGF5ZXJzXG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBsYWJlbCBwcmlvcml0eSAobG93ZXIgaXMgaGlnaGVyKVxuICAgICAgICBsZXQgcHJpb3JpdHkgPSBkcmF3LnByaW9yaXR5O1xuICAgICAgICBpZiAocHJpb3JpdHkgIT0gbnVsbCkge1xuICAgICAgICAgICAgaWYgKHR5cGVvZiBwcmlvcml0eSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgIHByaW9yaXR5ID0gcHJpb3JpdHkoY29udGV4dCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBwcmlvcml0eSA9IC0xID4+PiAwOyAvLyBkZWZhdWx0IHRvIG1heCBwcmlvcml0eSB2YWx1ZSBpZiBub25lIHNldFxuICAgICAgICB9XG4gICAgICAgIGxheW91dC5wcmlvcml0eSA9IHByaW9yaXR5O1xuXG4gICAgICAgIHJldHVybiBsYXlvdXQ7XG4gICAgfSxcblxuICAgIC8vIEltcGxlbWVudHMgbGFiZWwgYnVpbGRpbmcgZm9yIFRleHRMYWJlbHMgbWl4aW5cbiAgICBidWlsZFRleHRMYWJlbHMgKHRpbGVfa2V5LCBmZWF0dXJlX3F1ZXVlKSB7XG4gICAgICAgIGxldCBsYWJlbHMgPSBbXTtcbiAgICAgICAgZm9yIChsZXQgZj0wOyBmIDwgZmVhdHVyZV9xdWV1ZS5sZW5ndGg7IGYrKykge1xuICAgICAgICAgICAgbGV0IGZxID0gZmVhdHVyZV9xdWV1ZVtmXTtcbiAgICAgICAgICAgIGxldCB0ZXh0X2luZm8gPSB0aGlzLnRleHRzW3RpbGVfa2V5XVtmcS50ZXh0X3NldHRpbmdzX2tleV1bZnEudGV4dF07XG4gICAgICAgICAgICBsZXQgc2l6ZSA9IHRleHRfaW5mby5zaXplLmNvbGxpc2lvbl9zaXplO1xuICAgICAgICAgICAgZnEubGFiZWwgPSBuZXcgTGFiZWxQb2ludChmcS5wb2ludF9sYWJlbC5wb3NpdGlvbiwgc2l6ZSwgZnEubGF5b3V0KTtcbiAgICAgICAgICAgIGxhYmVscy5wdXNoKGZxKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbGFiZWxzO1xuICAgIH0sXG5cbiAgICAvLyBCdWlsZHMgb25lIG9yIG1vcmUgcG9pbnQgbGFiZWxzIGZvciBhIGdlb21ldHJ5XG4gICAgYnVpbGRMYWJlbHMgKHNpemUsIGdlb21ldHJ5LCBvcHRpb25zKSB7XG4gICAgICAgIGxldCBsYWJlbHMgPSBbXTtcblxuICAgICAgICBpZiAoZ2VvbWV0cnkudHlwZSA9PT0gXCJQb2ludFwiKSB7XG4gICAgICAgICAgICBsYWJlbHMucHVzaChuZXcgTGFiZWxQb2ludChnZW9tZXRyeS5jb29yZGluYXRlcywgc2l6ZSwgb3B0aW9ucykpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGdlb21ldHJ5LnR5cGUgPT09IFwiTXVsdGlQb2ludFwiKSB7XG4gICAgICAgICAgICBsZXQgcG9pbnRzID0gZ2VvbWV0cnkuY29vcmRpbmF0ZXM7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBvaW50cy5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgICAgIGxldCBwb2ludCA9IHBvaW50c1tpXTtcbiAgICAgICAgICAgICAgICBsYWJlbHMucHVzaChuZXcgTGFiZWxQb2ludChwb2ludCwgc2l6ZSwgb3B0aW9ucykpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGdlb21ldHJ5LnR5cGUgPT09IFwiTGluZVN0cmluZ1wiKSB7XG4gICAgICAgICAgICBsZXQgbGluZSA9IGdlb21ldHJ5LmNvb3JkaW5hdGVzO1xuICAgICAgICAgICAgbGV0IHBvaW50X2xhYmVscyA9IHBsYWNlUG9pbnRzT25MaW5lKGxpbmUsIHNpemUsIG9wdGlvbnMpO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwb2ludF9sYWJlbHMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICAgICAgICBsYWJlbHMucHVzaChwb2ludF9sYWJlbHNbaV0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGdlb21ldHJ5LnR5cGUgPT09IFwiTXVsdGlMaW5lU3RyaW5nXCIpIHtcbiAgICAgICAgICAgIGxldCBsaW5lcyA9IGdlb21ldHJ5LmNvb3JkaW5hdGVzO1xuICAgICAgICAgICAgZm9yIChsZXQgbG4gPSAwOyBsbiA8IGxpbmVzLmxlbmd0aDsgbG4rKykge1xuICAgICAgICAgICAgICAgIGxldCBsaW5lID0gbGluZXNbbG5dO1xuICAgICAgICAgICAgICAgIGxldCBwb2ludF9sYWJlbHMgPSBwbGFjZVBvaW50c09uTGluZShsaW5lLCBzaXplLCBvcHRpb25zKTtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBvaW50X2xhYmVscy5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgICAgICAgICBsYWJlbHMucHVzaChwb2ludF9sYWJlbHNbaV0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChnZW9tZXRyeS50eXBlID09PSBcIlBvbHlnb25cIikge1xuICAgICAgICAgICAgLy8gUG9pbnQgYXQgcG9seWdvbiBjZW50cm9pZCAob2Ygb3V0ZXIgcmluZylcbiAgICAgICAgICAgIGlmIChvcHRpb25zLnBsYWNlbWVudCA9PT0gUExBQ0VNRU5ULkNFTlRST0lEKSB7XG4gICAgICAgICAgICAgICAgbGV0IGNlbnRyb2lkID0gR2VvLmNlbnRyb2lkKGdlb21ldHJ5LmNvb3JkaW5hdGVzKTtcbiAgICAgICAgICAgICAgICBsYWJlbHMucHVzaChuZXcgTGFiZWxQb2ludChjZW50cm9pZCwgc2l6ZSwgb3B0aW9ucykpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gUG9pbnQgYXQgZWFjaCBwb2x5Z29uIHZlcnRleCAoYWxsIHJpbmdzKVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgbGV0IHJpbmdzID0gZ2VvbWV0cnkuY29vcmRpbmF0ZXM7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgbG4gPSAwOyBsbiA8IHJpbmdzLmxlbmd0aDsgbG4rKykge1xuICAgICAgICAgICAgICAgICAgICBsZXQgcG9pbnRfbGFiZWxzID0gcGxhY2VQb2ludHNPbkxpbmUocmluZ3NbbG5dLCBzaXplLCBvcHRpb25zKTtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwb2ludF9sYWJlbHMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVscy5wdXNoKHBvaW50X2xhYmVsc1tpXSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoZ2VvbWV0cnkudHlwZSA9PT0gXCJNdWx0aVBvbHlnb25cIikge1xuICAgICAgICAgICAgaWYgKG9wdGlvbnMucGxhY2VtZW50ID09PSBQTEFDRU1FTlQuQ0VOVFJPSUQpIHtcbiAgICAgICAgICAgICAgICBsZXQgY2VudHJvaWQgPSBHZW8ubXVsdGlDZW50cm9pZChnZW9tZXRyeS5jb29yZGluYXRlcyk7XG4gICAgICAgICAgICAgICAgbGFiZWxzLnB1c2gobmV3IExhYmVsUG9pbnQoY2VudHJvaWQsIHNpemUsIG9wdGlvbnMpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGxldCBwb2x5cyA9IGdlb21ldHJ5LmNvb3JkaW5hdGVzO1xuICAgICAgICAgICAgICAgIGZvciAobGV0IHAgPSAwOyBwIDwgcG9seXMubGVuZ3RoOyBwKyspIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHJpbmdzID0gcG9seXNbcF07XG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGxuID0gMDsgbG4gPCByaW5ncy5sZW5ndGg7IGxuKyspIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBwb2ludF9sYWJlbHMgPSBwbGFjZVBvaW50c09uTGluZShyaW5nc1tsbl0sIHNpemUsIG9wdGlvbnMpO1xuICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBwb2ludF9sYWJlbHMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYWJlbHMucHVzaChwb2ludF9sYWJlbHNbaV0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGxhYmVscztcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogQSBcInRlbXBsYXRlXCIgdGhhdCBzZXRzIGNvbnN0YW50IGF0dGlidXRlcyBmb3IgZWFjaCB2ZXJ0ZXgsIHdoaWNoIGlzIHRoZW4gbW9kaWZpZWQgcGVyIHZlcnRleCBvciBwZXIgZmVhdHVyZS5cbiAgICAgKiBBIHBsYWluIEpTIGFycmF5IG1hdGNoaW5nIHRoZSBvcmRlciBvZiB0aGUgdmVydGV4IGxheW91dC5cbiAgICAgKi9cbiAgICBtYWtlVmVydGV4VGVtcGxhdGUoc3R5bGUpIHtcbiAgICAgICAgbGV0IGNvbG9yID0gc3R5bGUuY29sb3IgfHwgU3R5bGVQYXJzZXIuZGVmYXVsdHMuY29sb3I7XG5cbiAgICAgICAgLy8gcG9zaXRpb24gLSB4ICYgeSBjb29yZHMgd2lsbCBiZSBmaWxsZWQgaW4gcGVyLXZlcnRleCBiZWxvd1xuICAgICAgICB0aGlzLmZpbGxWZXJ0ZXhUZW1wbGF0ZSgnYV9wb3NpdGlvbicsIDAsIHsgc2l6ZTogMiB9KTtcbiAgICAgICAgdGhpcy5maWxsVmVydGV4VGVtcGxhdGUoJ2FfcG9zaXRpb24nLCBzdHlsZS56IHx8IDAsIHsgc2l6ZTogMSwgb2Zmc2V0OiAyIH0pO1xuICAgICAgICAvLyBsYXllciBvcmRlciAtIHcgY29vcmQgb2YgJ3Bvc2l0aW9uJyBhdHRyaWJ1dGUgKGZvciBwYWNraW5nIGVmZmljaWVuY3kpXG4gICAgICAgIHRoaXMuZmlsbFZlcnRleFRlbXBsYXRlKCdhX3Bvc2l0aW9uJywgdGhpcy5zY2FsZU9yZGVyKHN0eWxlLm9yZGVyKSwgeyBzaXplOiAxLCBvZmZzZXQ6IDMgfSk7XG5cbiAgICAgICAgLy8gc2NhbGluZyB2ZWN0b3IgLSAoeCwgeSkgY29tcG9uZW50cyBwZXIgcGl4ZWwsIHogPSBhbmdsZSwgdyA9IHNjYWxpbmcgZmFjdG9yXG4gICAgICAgIHRoaXMuZmlsbFZlcnRleFRlbXBsYXRlKCdhX3NoYXBlJywgMCwgeyBzaXplOiA0IH0pO1xuXG4gICAgICAgIC8vIHRleHR1cmUgY29vcmRzXG4gICAgICAgIHRoaXMuZmlsbFZlcnRleFRlbXBsYXRlKCdhX3RleGNvb3JkJywgMCwgeyBzaXplOiAyIH0pO1xuXG4gICAgICAgIC8vIG9mZnNldHNcbiAgICAgICAgdGhpcy5maWxsVmVydGV4VGVtcGxhdGUoJ2Ffb2Zmc2V0JywgMCwgeyBzaXplOiAyIH0pO1xuXG4gICAgICAgIC8vIGNvbG9yXG4gICAgICAgIHRoaXMuZmlsbFZlcnRleFRlbXBsYXRlKCdhX2NvbG9yJywgVmVjdG9yLm11bHQoY29sb3IsIDI1NSksIHsgc2l6ZTogNCB9KTtcblxuICAgICAgICAvLyBzZWxlY3Rpb24gY29sb3JcbiAgICAgICAgaWYgKHRoaXMuc2VsZWN0aW9uKSB7XG4gICAgICAgICAgICB0aGlzLmZpbGxWZXJ0ZXhUZW1wbGF0ZSgnYV9zZWxlY3Rpb25fY29sb3InLCBWZWN0b3IubXVsdChzdHlsZS5zZWxlY3Rpb25fY29sb3IsIDI1NSksIHsgc2l6ZTogNCB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB0aGlzLnZlcnRleF90ZW1wbGF0ZTtcbiAgICB9LFxuXG4gICAgYnVpbGRRdWFkKHBvaW50cywgc2l6ZSwgYW5nbGUsIHNhbXBsZXIsIG9mZnNldCwgdGV4Y29vcmRfc2NhbGUsIHZlcnRleF9kYXRhLCB2ZXJ0ZXhfdGVtcGxhdGUpIHtcbiAgICAgICAgYnVpbGRRdWFkc0ZvclBvaW50cyhcbiAgICAgICAgICAgIHBvaW50cyxcbiAgICAgICAgICAgIHZlcnRleF9kYXRhLFxuICAgICAgICAgICAgdmVydGV4X3RlbXBsYXRlLFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHRleGNvb3JkX2luZGV4OiB0aGlzLnZlcnRleF9sYXlvdXQuaW5kZXguYV90ZXhjb29yZCxcbiAgICAgICAgICAgICAgICBwb3NpdGlvbl9pbmRleDogdGhpcy52ZXJ0ZXhfbGF5b3V0LmluZGV4LmFfcG9zaXRpb24sXG4gICAgICAgICAgICAgICAgc2hhcGVfaW5kZXg6IHRoaXMudmVydGV4X2xheW91dC5pbmRleC5hX3NoYXBlLFxuICAgICAgICAgICAgICAgIG9mZnNldF9pbmRleDogdGhpcy52ZXJ0ZXhfbGF5b3V0LmluZGV4LmFfb2Zmc2V0XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAge1xuICAgICAgICAgICAgICAgIHF1YWQ6IHNpemUsXG4gICAgICAgICAgICAgICAgcXVhZF9ub3JtYWxpemU6IDI1NiwgICAgLy8gdmFsdWVzIGhhdmUgYW4gOC1iaXQgZnJhY3Rpb25cbiAgICAgICAgICAgICAgICBvZmZzZXQsXG4gICAgICAgICAgICAgICAgYW5nbGU6IGFuZ2xlICogNDA5NiwgICAgLy8gdmFsdWVzIGhhdmUgYSAxMi1iaXQgZnJhY3Rpb25cbiAgICAgICAgICAgICAgICBzaGFwZV93OiBzYW1wbGVyLFxuICAgICAgICAgICAgICAgIHRleGNvb3JkX3NjYWxlLFxuICAgICAgICAgICAgICAgIHRleGNvb3JkX25vcm1hbGl6ZTogNjU1MzVcbiAgICAgICAgICAgIH1cbiAgICAgICAgKTtcbiAgICB9LFxuXG4gICAgLy8gQnVpbGQgcXVhZCBmb3IgcG9pbnQgc3ByaXRlXG4gICAgYnVpbGQgKHN0eWxlLCB2ZXJ0ZXhfZGF0YSkge1xuICAgICAgICBsZXQgbGFiZWwgPSBzdHlsZS5sYWJlbDtcbiAgICAgICAgaWYgKGxhYmVsLm51bV9zZWdtZW50cykge1xuICAgICAgICAgICAgdGhpcy5idWlsZEFydGljdWxhdGVkTGFiZWwobGFiZWwsIHN0eWxlLCB2ZXJ0ZXhfZGF0YSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmJ1aWxkTGFiZWwobGFiZWwsIHN0eWxlLCB2ZXJ0ZXhfZGF0YSk7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgYnVpbGRMYWJlbCAobGFiZWwsIHN0eWxlLCB2ZXJ0ZXhfZGF0YSkge1xuICAgICAgICBsZXQgdmVydGV4X3RlbXBsYXRlID0gdGhpcy5tYWtlVmVydGV4VGVtcGxhdGUoc3R5bGUpO1xuICAgICAgICBsZXQgYW5nbGUgPSBsYWJlbC5hbmdsZSB8fCBzdHlsZS5hbmdsZTtcblxuICAgICAgICB0aGlzLmJ1aWxkUXVhZChcbiAgICAgICAgICAgIFtsYWJlbC5wb3NpdGlvbl0sICAgICAgICAgICAgICAgLy8gcG9zaXRpb25cbiAgICAgICAgICAgIHN0eWxlLnNpemUsICAgICAgICAgICAgICAgICAgICAgLy8gc2l6ZSBpbiBwaXhlbHNcbiAgICAgICAgICAgIGFuZ2xlLCAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYW5nbGUgaW4gcmFkaWFuc1xuICAgICAgICAgICAgc3R5bGUuc2FtcGxlciwgICAgICAgICAgICAgICAgICAvLyB0ZXh0dXJlIHNhbXBsZXIgdG8gdXNlXG4gICAgICAgICAgICBsYWJlbC5vZmZzZXQsICAgICAgICAgICAgICAgICAgIC8vIG9mZnNldCBmcm9tIGNlbnRlciBpbiBwaXhlbHNcbiAgICAgICAgICAgIHN0eWxlLnRleGNvb3JkcywgICAgICAgICAgICAgICAgLy8gdGV4dHVyZSBVVnNcbiAgICAgICAgICAgIHZlcnRleF9kYXRhLCB2ZXJ0ZXhfdGVtcGxhdGUgICAgLy8gVkJPIGFuZCBkYXRhIGZvciBjdXJyZW50IHZlcnRleFxuICAgICAgICApO1xuICAgIH0sXG5cbiAgICBidWlsZEFydGljdWxhdGVkTGFiZWwgKGxhYmVsLCBzdHlsZSwgdmVydGV4X2RhdGEpIHtcbiAgICAgICAgbGV0IHZlcnRleF90ZW1wbGF0ZSA9IHRoaXMubWFrZVZlcnRleFRlbXBsYXRlKHN0eWxlKTtcblxuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxhYmVsLm51bV9zZWdtZW50czsgaSsrKXtcbiAgICAgICAgICAgIGxldCBhbmdsZSA9IGxhYmVsLmFuZ2xlW2ldO1xuICAgICAgICAgICAgbGV0IHNpemUgPSBzdHlsZS5zaXplW2ldO1xuICAgICAgICAgICAgbGV0IG9mZnNldCA9IGxhYmVsLm9mZnNldHNbaV07XG4gICAgICAgICAgICBsZXQgdGV4Y29vcmQgPSBzdHlsZS50ZXhjb29yZHNbaV07XG5cbiAgICAgICAgICAgIHRoaXMuYnVpbGRRdWFkKFxuICAgICAgICAgICAgICAgIFtsYWJlbC5wb3NpdGlvbl0sICAgICAgICAgICAgICAgLy8gcG9zaXRpb25cbiAgICAgICAgICAgICAgICBzaXplLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNpemUgaW4gcGl4ZWxzXG4gICAgICAgICAgICAgICAgYW5nbGUsICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhbmdsZSBpbiBkZWdyZWVzXG4gICAgICAgICAgICAgICAgc3R5bGUuc2FtcGxlciwgICAgICAgICAgICAgICAgICAvLyB0ZXh0dXJlIHNhbXBsZXIgdG8gdXNlXG4gICAgICAgICAgICAgICAgb2Zmc2V0LCAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvZmZzZXQgZnJvbSBjZW50ZXIgaW4gcGl4ZWxzXG4gICAgICAgICAgICAgICAgdGV4Y29vcmQsICAgICAgICAgICAgICAgICAgICAgICAvLyB0ZXh0dXJlIFVWc1xuICAgICAgICAgICAgICAgIHZlcnRleF9kYXRhLCB2ZXJ0ZXhfdGVtcGxhdGUgICAgLy8gVkJPIGFuZCBkYXRhIGZvciBjdXJyZW50IHZlcnRleFxuICAgICAgICAgICAgKTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvLyBPdmVycmlkZSB0byBwYXNzLXRocm91Z2ggdG8gZ2VuZXJpYyBwb2ludCBidWlsZGVyXG4gICAgYnVpbGRMaW5lcyAobGluZXMsIHN0eWxlLCB2ZXJ0ZXhfZGF0YSwgY29udGV4dCkge1xuICAgICAgICB0aGlzLmJ1aWxkKHN0eWxlLCB2ZXJ0ZXhfZGF0YSk7XG4gICAgfSxcblxuICAgIGJ1aWxkUG9pbnRzIChwb2ludHMsIHN0eWxlLCB2ZXJ0ZXhfZGF0YSwgY29udGV4dCkge1xuICAgICAgICB0aGlzLmJ1aWxkKHN0eWxlLCB2ZXJ0ZXhfZGF0YSk7XG4gICAgfSxcblxuICAgIGJ1aWxkUG9seWdvbnMgKHBvaW50cywgc3R5bGUsIHZlcnRleF9kYXRhLCBjb250ZXh0KSB7XG4gICAgICAgIHRoaXMuYnVpbGQoc3R5bGUsIHZlcnRleF9kYXRhKTtcbiAgICB9LFxuXG4gICAgbWFrZU1lc2ggKHZlcnRleF9kYXRhLCB2ZXJ0ZXhfZWxlbWVudHMsIG9wdGlvbnMgPSB7fSkge1xuICAgICAgICAvLyBBZGQgbGFiZWwgZmFkZSB0aW1lXG4gICAgICAgIG9wdGlvbnMgPSBPYmplY3QuYXNzaWduKHt9LCBvcHRpb25zLCB7IGZhZGVfaW5fdGltZTogdGhpcy5mYWRlX2luX3RpbWUgfSk7XG4gICAgICAgIHJldHVybiBTdHlsZS5tYWtlTWVzaC5jYWxsKHRoaXMsIHZlcnRleF9kYXRhLCB2ZXJ0ZXhfZWxlbWVudHMsIG9wdGlvbnMpO1xuICAgIH1cblxufSk7XG4iLCIvLyBQb2x5Z29uIHJlbmRlcmluZyBzdHlsZVxuXG5pbXBvcnQge1N0eWxlfSBmcm9tICcuLi9zdHlsZSc7XG5pbXBvcnQge1N0eWxlUGFyc2VyfSBmcm9tICcuLi9zdHlsZV9wYXJzZXInO1xuaW1wb3J0IGdsIGZyb20gJy4uLy4uL2dsL2NvbnN0YW50cyc7IC8vIHdlYiB3b3JrZXJzIGRvbid0IGhhdmUgYWNjZXNzIHRvIEdMIGNvbnRleHQsIHNvIGltcG9ydCBhbGwgR0wgY29uc3RhbnRzXG5pbXBvcnQgVmVydGV4TGF5b3V0IGZyb20gJy4uLy4uL2dsL3ZlcnRleF9sYXlvdXQnO1xuaW1wb3J0IHtidWlsZFBvbHlnb25zLCBidWlsZEV4dHJ1ZGVkUG9seWdvbnN9IGZyb20gJy4uLy4uL2J1aWxkZXJzL3BvbHlnb25zJztcbmltcG9ydCBHZW8gZnJvbSAnLi4vLi4vZ2VvJztcblxubGV0IGZzID0gcmVxdWlyZSgnZnMnKTtcbmNvbnN0IHNoYWRlclNyY19wb2x5Z29uc1ZlcnRleCA9IGZzLnJlYWRGaWxlU3luYyhfX2Rpcm5hbWUgKyAnL3BvbHlnb25zX3ZlcnRleC5nbHNsJywgJ3V0ZjgnKTtcbmNvbnN0IHNoYWRlclNyY19wb2x5Z29uc0ZyYWdtZW50ID0gZnMucmVhZEZpbGVTeW5jKF9fZGlybmFtZSArICcvcG9seWdvbnNfZnJhZ21lbnQuZ2xzbCcsICd1dGY4Jyk7XG5cbmV4cG9ydCB2YXIgUG9seWdvbnMgPSBPYmplY3QuY3JlYXRlKFN0eWxlKTtcblxuLy8gZXhwb3J0IHNoYWRlcnMgZm9yIHVzZSBpbiBsaW5lcy5qc1xuZXhwb3J0IHtcbiAgICBzaGFkZXJTcmNfcG9seWdvbnNWZXJ0ZXgsXG4gICAgc2hhZGVyU3JjX3BvbHlnb25zRnJhZ21lbnRcbn07XG5cbk9iamVjdC5hc3NpZ24oUG9seWdvbnMsIHtcbiAgICBuYW1lOiAncG9seWdvbnMnLFxuICAgIGJ1aWx0X2luOiB0cnVlLFxuICAgIHZlcnRleF9zaGFkZXJfc3JjOiBzaGFkZXJTcmNfcG9seWdvbnNWZXJ0ZXgsXG4gICAgZnJhZ21lbnRfc2hhZGVyX3NyYzogc2hhZGVyU3JjX3BvbHlnb25zRnJhZ21lbnQsXG5cbiAgICBpbml0KCkge1xuICAgICAgICBTdHlsZS5pbml0LmFwcGx5KHRoaXMsIGFyZ3VtZW50cyk7XG5cbiAgICAgICAgLy8gQmFzaWMgYXR0cmlidXRlcywgb3RoZXJzIGNhbiBiZSBhZGRlZCAoc2VlIHRleHR1cmUgVVZzIGJlbG93KVxuICAgICAgICB2YXIgYXR0cmlicyA9IFtcbiAgICAgICAgICAgIHsgbmFtZTogJ2FfcG9zaXRpb24nLCBzaXplOiA0LCB0eXBlOiBnbC5TSE9SVCwgbm9ybWFsaXplZDogZmFsc2UgfSxcbiAgICAgICAgICAgIHsgbmFtZTogJ2Ffbm9ybWFsJywgc2l6ZTogMywgdHlwZTogZ2wuQllURSwgbm9ybWFsaXplZDogdHJ1ZSB9LCAvLyBnZXRzIHBhZGRlZCB0byA0LWJ5dGVzXG4gICAgICAgICAgICB7IG5hbWU6ICdhX2NvbG9yJywgc2l6ZTogNCwgdHlwZTogZ2wuVU5TSUdORURfQllURSwgbm9ybWFsaXplZDogdHJ1ZSB9XG4gICAgICAgIF07XG5cbiAgICAgICAgLy8gVGVsbCB0aGUgc2hhZGVyIHdlIGhhdmUgYSBub3JtYWwgYW5kIG9yZGVyIGF0dHJpYnV0ZXNcbiAgICAgICAgdGhpcy5kZWZpbmVzLlRBTkdSQU1fTk9STUFMX0FUVFJJQlVURSA9IHRydWU7XG4gICAgICAgIHRoaXMuZGVmaW5lcy5UQU5HUkFNX0xBWUVSX09SREVSID0gdHJ1ZTtcblxuICAgICAgICAvLyBGZWF0dXJlIHNlbGVjdGlvblxuICAgICAgICB0aGlzLnNlbGVjdGlvbiA9IHRydWU7XG4gICAgICAgIGF0dHJpYnMucHVzaCh7IG5hbWU6ICdhX3NlbGVjdGlvbl9jb2xvcicsIHNpemU6IDQsIHR5cGU6IGdsLlVOU0lHTkVEX0JZVEUsIG5vcm1hbGl6ZWQ6IHRydWUgfSk7XG5cbiAgICAgICAgLy8gT3B0aW9uYWwgdGV4dHVyZSBVVnNcbiAgICAgICAgaWYgKHRoaXMudGV4Y29vcmRzKSB7XG4gICAgICAgICAgICB0aGlzLmRlZmluZXMuVEFOR1JBTV9URVhUVVJFX0NPT1JEUyA9IHRydWU7XG5cbiAgICAgICAgICAgIC8vIEFkZCB2ZXJ0ZXggYXR0cmlidXRlIGZvciBVVnMgb25seSB3aGVuIG5lZWRlZFxuICAgICAgICAgICAgYXR0cmlicy5wdXNoKHsgbmFtZTogJ2FfdGV4Y29vcmQnLCBzaXplOiAyLCB0eXBlOiBnbC5VTlNJR05FRF9TSE9SVCwgbm9ybWFsaXplZDogdHJ1ZSB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMudmVydGV4X2xheW91dCA9IG5ldyBWZXJ0ZXhMYXlvdXQoYXR0cmlicyk7XG4gICAgfSxcblxuICAgIF9wYXJzZUZlYXR1cmUgKGZlYXR1cmUsIGRyYXcsIGNvbnRleHQpIHtcbiAgICAgICAgdmFyIHN0eWxlID0gdGhpcy5mZWF0dXJlX3N0eWxlO1xuXG4gICAgICAgIHN0eWxlLmNvbG9yID0gdGhpcy5wYXJzZUNvbG9yKGRyYXcuY29sb3IsIGNvbnRleHQpO1xuICAgICAgICBpZiAoIXN0eWxlLmNvbG9yKSB7XG4gICAgICAgICAgICByZXR1cm4gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIHN0eWxlLnogPSAoZHJhdy56ICYmIFN0eWxlUGFyc2VyLmV2YWxDYWNoZWREaXN0YW5jZVByb3BlcnR5KGRyYXcueiwgY29udGV4dCkpIHx8IFN0eWxlUGFyc2VyLmRlZmF1bHRzLno7XG4gICAgICAgIHN0eWxlLnogKj0gR2VvLmhlaWdodF9zY2FsZTsgLy8gcHJvdmlkZSBzdWItbWV0ZXIgcHJlY2lzaW9uIG9mIGhlaWdodCB2YWx1ZXNcblxuICAgICAgICBzdHlsZS5leHRydWRlID0gU3R5bGVQYXJzZXIuZXZhbFByb3BlcnR5KGRyYXcuZXh0cnVkZSwgY29udGV4dCk7XG4gICAgICAgIGlmIChzdHlsZS5leHRydWRlKSB7XG4gICAgICAgICAgICAvLyB1c2UgZmVhdHVyZSdzIGhlaWdodCBhbmQgbWluX2hlaWdodCBwcm9wZXJ0aWVzXG4gICAgICAgICAgICBpZiAoc3R5bGUuZXh0cnVkZSA9PT0gdHJ1ZSkge1xuICAgICAgICAgICAgICAgIHN0eWxlLmhlaWdodCA9IGZlYXR1cmUucHJvcGVydGllcy5oZWlnaHQgfHwgU3R5bGVQYXJzZXIuZGVmYXVsdHMuaGVpZ2h0O1xuICAgICAgICAgICAgICAgIHN0eWxlLm1pbl9oZWlnaHQgPSBmZWF0dXJlLnByb3BlcnRpZXMubWluX2hlaWdodCB8fCBTdHlsZVBhcnNlci5kZWZhdWx0cy5taW5faGVpZ2h0O1xuXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBleHBsaWNpdCBoZWlnaHQsIG5vIG1pbl9oZWlnaHRcbiAgICAgICAgICAgIGVsc2UgaWYgKHR5cGVvZiBzdHlsZS5leHRydWRlID09PSAnbnVtYmVyJykge1xuICAgICAgICAgICAgICAgIHN0eWxlLmhlaWdodCA9IHN0eWxlLmV4dHJ1ZGU7XG4gICAgICAgICAgICAgICAgc3R5bGUubWluX2hlaWdodCA9IDA7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBleHBsaWNpdCBoZWlnaHQgYW5kIG1pbl9oZWlnaHRcbiAgICAgICAgICAgIGVsc2UgaWYgKEFycmF5LmlzQXJyYXkoc3R5bGUuZXh0cnVkZSkpIHtcbiAgICAgICAgICAgICAgICBzdHlsZS5taW5faGVpZ2h0ID0gc3R5bGUuZXh0cnVkZVswXTtcbiAgICAgICAgICAgICAgICBzdHlsZS5oZWlnaHQgPSBzdHlsZS5leHRydWRlWzFdO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBzdHlsZS5oZWlnaHQgKj0gR2VvLmhlaWdodF9zY2FsZTsgICAgICAgLy8gcHJvdmlkZSBzdWItbWV0ZXIgcHJlY2lzaW9uIG9mIGhlaWdodCB2YWx1ZXNcbiAgICAgICAgICAgIHN0eWxlLm1pbl9oZWlnaHQgKj0gR2VvLmhlaWdodF9zY2FsZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHN0eWxlLnRpbGVfZWRnZXMgPSBkcmF3LnRpbGVfZWRnZXM7IC8vIHVzdWFsbHkgYWN0aXZhdGVkIGZvciBkZWJ1Z2dpbmcsIG9yIHJhcmUgdmlzdWFsaXphdGlvbiBuZWVkc1xuXG4gICAgICAgIHJldHVybiBzdHlsZTtcbiAgICB9LFxuXG4gICAgX3ByZXByb2Nlc3MgKGRyYXcpIHtcbiAgICAgICAgZHJhdy5jb2xvciA9IFN0eWxlUGFyc2VyLmNyZWF0ZUNvbG9yUHJvcGVydHlDYWNoZShkcmF3LmNvbG9yKTtcbiAgICAgICAgZHJhdy56ID0gU3R5bGVQYXJzZXIuY3JlYXRlUHJvcGVydHlDYWNoZShkcmF3LnosIFN0eWxlUGFyc2VyLnBhcnNlVW5pdHMpO1xuICAgICAgICByZXR1cm4gZHJhdztcbiAgICB9LFxuXG4gICAgLyoqXG4gICAgICogQSBcInRlbXBsYXRlXCIgdGhhdCBzZXRzIGNvbnN0YW50IGF0dGlidXRlcyBmb3IgZWFjaCB2ZXJ0ZXgsIHdoaWNoIGlzIHRoZW4gbW9kaWZpZWQgcGVyIHZlcnRleCBvciBwZXIgZmVhdHVyZS5cbiAgICAgKiBBIHBsYWluIEpTIGFycmF5IG1hdGNoaW5nIHRoZSBvcmRlciBvZiB0aGUgdmVydGV4IGxheW91dC5cbiAgICAgKi9cbiAgICBtYWtlVmVydGV4VGVtcGxhdGUoc3R5bGUpIHtcbiAgICAgICAgbGV0IGkgPSAwO1xuXG4gICAgICAgIC8vIHBvc2l0aW9uIC0geCAmIHkgY29vcmRzIHdpbGwgYmUgZmlsbGVkIGluIHBlci12ZXJ0ZXggYmVsb3dcbiAgICAgICAgdGhpcy52ZXJ0ZXhfdGVtcGxhdGVbaSsrXSA9IDA7XG4gICAgICAgIHRoaXMudmVydGV4X3RlbXBsYXRlW2krK10gPSAwO1xuICAgICAgICB0aGlzLnZlcnRleF90ZW1wbGF0ZVtpKytdID0gc3R5bGUueiB8fCAwO1xuXG4gICAgICAgIC8vIGxheWVyIG9yZGVyIC0gdyBjb29yZCBvZiAncG9zaXRpb24nIGF0dHJpYnV0ZSAoZm9yIHBhY2tpbmcgZWZmaWNpZW5jeSlcbiAgICAgICAgdGhpcy52ZXJ0ZXhfdGVtcGxhdGVbaSsrXSA9IHRoaXMuc2NhbGVPcmRlcihzdHlsZS5vcmRlcik7XG5cbiAgICAgICAgLy8gbm9ybWFsXG4gICAgICAgIHRoaXMudmVydGV4X3RlbXBsYXRlW2krK10gPSAwO1xuICAgICAgICB0aGlzLnZlcnRleF90ZW1wbGF0ZVtpKytdID0gMDtcbiAgICAgICAgdGhpcy52ZXJ0ZXhfdGVtcGxhdGVbaSsrXSA9IDEgKiAxMjc7XG5cbiAgICAgICAgLy8gY29sb3JcbiAgICAgICAgdGhpcy52ZXJ0ZXhfdGVtcGxhdGVbaSsrXSA9IHN0eWxlLmNvbG9yWzBdICogMjU1O1xuICAgICAgICB0aGlzLnZlcnRleF90ZW1wbGF0ZVtpKytdID0gc3R5bGUuY29sb3JbMV0gKiAyNTU7XG4gICAgICAgIHRoaXMudmVydGV4X3RlbXBsYXRlW2krK10gPSBzdHlsZS5jb2xvclsyXSAqIDI1NTtcbiAgICAgICAgdGhpcy52ZXJ0ZXhfdGVtcGxhdGVbaSsrXSA9IHN0eWxlLmNvbG9yWzNdICogMjU1O1xuXG4gICAgICAgIC8vIHNlbGVjdGlvbiBjb2xvclxuICAgICAgICBpZiAodGhpcy5zZWxlY3Rpb24pIHtcbiAgICAgICAgICAgIHRoaXMudmVydGV4X3RlbXBsYXRlW2krK10gPSBzdHlsZS5zZWxlY3Rpb25fY29sb3JbMF0gKiAyNTU7XG4gICAgICAgICAgICB0aGlzLnZlcnRleF90ZW1wbGF0ZVtpKytdID0gc3R5bGUuc2VsZWN0aW9uX2NvbG9yWzFdICogMjU1O1xuICAgICAgICAgICAgdGhpcy52ZXJ0ZXhfdGVtcGxhdGVbaSsrXSA9IHN0eWxlLnNlbGVjdGlvbl9jb2xvclsyXSAqIDI1NTtcbiAgICAgICAgICAgIHRoaXMudmVydGV4X3RlbXBsYXRlW2krK10gPSBzdHlsZS5zZWxlY3Rpb25fY29sb3JbM10gKiAyNTU7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBBZGQgdGV4dHVyZSBVVnMgdG8gdGVtcGxhdGUgb25seSBpZiBuZWVkZWRcbiAgICAgICAgaWYgKHRoaXMudGV4Y29vcmRzKSB7XG4gICAgICAgICAgICB0aGlzLnZlcnRleF90ZW1wbGF0ZVtpKytdID0gMDtcbiAgICAgICAgICAgIHRoaXMudmVydGV4X3RlbXBsYXRlW2krK10gPSAwO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMudmVydGV4X3RlbXBsYXRlO1xuICAgIH0sXG5cbiAgICBidWlsZFBvbHlnb25zKHBvbHlnb25zLCBzdHlsZSwgdmVydGV4X2RhdGEsIGNvbnRleHQpIHtcbiAgICAgICAgbGV0IHZlcnRleF90ZW1wbGF0ZSA9IHRoaXMubWFrZVZlcnRleFRlbXBsYXRlKHN0eWxlKTtcbiAgICAgICAgbGV0IG9wdGlvbnMgPSB7XG4gICAgICAgICAgICB0ZXhjb29yZF9pbmRleDogdGhpcy52ZXJ0ZXhfbGF5b3V0LmluZGV4LmFfdGV4Y29vcmQsXG4gICAgICAgICAgICB0ZXhjb29yZF9ub3JtYWxpemU6IDY1NTM1LCAvLyBzY2FsZSBVVnMgdG8gdW5zaWduZWQgc2hvcnRzXG4gICAgICAgICAgICByZW1vdmVfdGlsZV9lZGdlczogIXN0eWxlLnRpbGVfZWRnZXMsXG4gICAgICAgICAgICB0aWxlX2VkZ2VfdG9sZXJhbmNlOiBHZW8udGlsZV9zY2FsZSAqIGNvbnRleHQudGlsZS5wYWRfc2NhbGUgKiA0LFxuICAgICAgICAgICAgd2luZGluZzogY29udGV4dC53aW5kaW5nXG4gICAgICAgIH07XG5cbiAgICAgICAgLy8gRXh0cnVkZWQgcG9seWdvbnMgKGUuZy4gM0QgYnVpbGRpbmdzKVxuICAgICAgICBpZiAoc3R5bGUuZXh0cnVkZSAmJiBzdHlsZS5oZWlnaHQpIHtcbiAgICAgICAgICAgIGJ1aWxkRXh0cnVkZWRQb2x5Z29ucyhcbiAgICAgICAgICAgICAgICBwb2x5Z29ucyxcbiAgICAgICAgICAgICAgICBzdHlsZS56LCBzdHlsZS5oZWlnaHQsIHN0eWxlLm1pbl9oZWlnaHQsXG4gICAgICAgICAgICAgICAgdmVydGV4X2RhdGEsIHZlcnRleF90ZW1wbGF0ZSxcbiAgICAgICAgICAgICAgICB0aGlzLnZlcnRleF9sYXlvdXQuaW5kZXguYV9ub3JtYWwsXG4gICAgICAgICAgICAgICAgMTI3LCAvLyBzY2FsZSBub3JtYWxzIHRvIHNpZ25lZCBieXRlc1xuICAgICAgICAgICAgICAgIG9wdGlvbnNcbiAgICAgICAgICAgICk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gUmVndWxhciBwb2x5Z29uc1xuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGJ1aWxkUG9seWdvbnMoXG4gICAgICAgICAgICAgICAgcG9seWdvbnMsXG4gICAgICAgICAgICAgICAgdmVydGV4X2RhdGEsIHZlcnRleF90ZW1wbGF0ZSxcbiAgICAgICAgICAgICAgICBvcHRpb25zXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgfVxuXG59KTtcbiIsIi8vIFJhc3RlciB0aWxlIHJlbmRlcmluZyBzdHlsZVxuXG5pbXBvcnQge1N0eWxlUGFyc2VyfSBmcm9tICcuLi9zdHlsZV9wYXJzZXInO1xuaW1wb3J0IHtQb2x5Z29uc30gZnJvbSAnLi4vcG9seWdvbnMvcG9seWdvbnMnO1xuXG5leHBvcnQgbGV0IFJhc3RlclN0eWxlID0gT2JqZWN0LmNyZWF0ZShQb2x5Z29ucyk7XG5cbk9iamVjdC5hc3NpZ24oUmFzdGVyU3R5bGUsIHtcbiAgICBuYW1lOiAncmFzdGVyJyxcbiAgICBzdXBlcjogUG9seWdvbnMsXG4gICAgYnVpbHRfaW46IHRydWUsXG5cbiAgICBpbml0KCkge1xuICAgICAgICAvLyBSZXF1aXJlZCBmb3IgcmFzdGVyIHRpbGVzXG4gICAgICAgIHRoaXMucmFzdGVyID0gdGhpcy5yYXN0ZXIgfHwgJ2NvbG9yJztcblxuICAgICAgICB0aGlzLnN1cGVyLmluaXQuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcblxuICAgICAgICB0aGlzLnNlbGVjdGlvbiA9IGZhbHNlOyAvLyByYXN0ZXIgc3R5bGVzIGNhbid0IHN1cHBvcnQgZmVhdHVyZSBzZWxlY3Rpb25cbiAgICB9LFxuXG4gICAgX3ByZXByb2Nlc3MgKGRyYXcpIHtcbiAgICAgICAgLy8gUmFzdGVyIHRpbGVzIGRlZmF1bHQgdG8gd2hpdGUgdmVydGV4IGNvbG9yLCBhcyB0aGlzIGNvbG9yIHdpbGwgdGludCB0aGUgdW5kZXJseWluZyB0ZXh0dXJlXG4gICAgICAgIGRyYXcuY29sb3IgPSBkcmF3LmNvbG9yIHx8IFN0eWxlUGFyc2VyLmRlZmF1bHRzLmNvbG9yO1xuICAgICAgICByZXR1cm4gdGhpcy5zdXBlci5fcHJlcHJvY2Vzcy5hcHBseSh0aGlzLCBhcmd1bWVudHMpO1xuICAgIH1cblxufSk7XG4iLCIvLyBSZW5kZXJpbmcgc3R5bGVzXG5cbmltcG9ydCB7U3R5bGVQYXJzZXJ9IGZyb20gJy4vc3R5bGVfcGFyc2VyJztcbmltcG9ydCBGZWF0dXJlU2VsZWN0aW9uIGZyb20gJy4uL3NlbGVjdGlvbic7XG5pbXBvcnQgU2hhZGVyUHJvZ3JhbSBmcm9tICcuLi9nbC9zaGFkZXJfcHJvZ3JhbSc7XG5pbXBvcnQgVkJPTWVzaCBmcm9tICcuLi9nbC92Ym9fbWVzaCc7XG5pbXBvcnQgVGV4dHVyZSBmcm9tICcuLi9nbC90ZXh0dXJlJztcbmltcG9ydCBNYXRlcmlhbCBmcm9tICcuLi9tYXRlcmlhbCc7XG5pbXBvcnQgTGlnaHQgZnJvbSAnLi4vbGlnaHQnO1xuaW1wb3J0IHtSYXN0ZXJUaWxlU291cmNlfSBmcm9tICcuLi9zb3VyY2VzL3Jhc3Rlcic7XG5pbXBvcnQgbG9nIGZyb20gJy4uL3V0aWxzL2xvZyc7XG5pbXBvcnQgVGhyZWFkIGZyb20gJy4uL3V0aWxzL3RocmVhZCc7XG5pbXBvcnQgV29ya2VyQnJva2VyIGZyb20gJy4uL3V0aWxzL3dvcmtlcl9icm9rZXInO1xuXG5sZXQgZnMgPSByZXF1aXJlKCdmcycpO1xuY29uc3Qgc2hhZGVyU3JjX3NlbGVjdGlvbkZyYWdtZW50ID0gZnMucmVhZEZpbGVTeW5jKF9fZGlybmFtZSArICcvLi4vZ2wvc2hhZGVycy9zZWxlY3Rpb25fZnJhZ21lbnQuZ2xzbCcsICd1dGY4Jyk7XG5jb25zdCBzaGFkZXJTcmNfcmFzdGVycyA9IGZzLnJlYWRGaWxlU3luYyhfX2Rpcm5hbWUgKyAnLy4uL2dsL3NoYWRlcnMvcmFzdGVycy5nbHNsJywgJ3V0ZjgnKTtcblxuLy8gQmFzZSBjbGFzc1xuXG5leHBvcnQgdmFyIFN0eWxlID0ge1xuICAgIGluaXQgKHsgZ2VuZXJhdGlvbiwgc3R5bGVzLCBzb3VyY2VzID0ge30sIGludHJvc3BlY3Rpb24gfSA9IHt9KSB7XG4gICAgICAgIHRoaXMuZ2VuZXJhdGlvbiA9IGdlbmVyYXRpb247ICAgICAgICAgICAgICAgLy8gc2NlbmUgZ2VuZXJhdGlvbiBpZCB0aGlzIHN0eWxlIHdhcyBjcmVhdGVkIGZvclxuICAgICAgICB0aGlzLnN0eWxlcyA9IHN0eWxlczsgICAgICAgICAgICAgICAgICAgICAgIC8vIHN0eWxlcyBmb3Igc2NlbmVcbiAgICAgICAgdGhpcy5zb3VyY2VzID0gc291cmNlczsgICAgICAgICAgICAgICAgICAgICAvLyBkYXRhIHNvdXJjZXMgZm9yIHNjZW5lXG4gICAgICAgIHRoaXMuZGVmaW5lcyA9ICh0aGlzLmhhc093blByb3BlcnR5KCdkZWZpbmVzJykgJiYgdGhpcy5kZWZpbmVzKSB8fCB7fTsgLy8gI2RlZmluZXMgdG8gYmUgaW5qZWN0ZWQgaW50byB0aGUgc2hhZGVyc1xuICAgICAgICB0aGlzLnNoYWRlcnMgPSAodGhpcy5oYXNPd25Qcm9wZXJ0eSgnc2hhZGVycycpICYmIHRoaXMuc2hhZGVycykgfHwge307IC8vIHNoYWRlciBjdXN0b21pemF0aW9uICh1bmlmb3JtcywgZGVmaW5lcywgYmxvY2tzLCBldGMuKVxuICAgICAgICB0aGlzLmludHJvc3BlY3Rpb24gPSBpbnRyb3NwZWN0aW9uIHx8IGZhbHNlO1xuICAgICAgICB0aGlzLnNlbGVjdGlvbiA9IHRoaXMuc2VsZWN0aW9uIHx8IHRoaXMuaW50cm9zcGVjdGlvbiB8fCBmYWxzZTsgICAvLyBmbGFnIGluZGljYXRpbmcgaWYgdGhpcyBzdHlsZSBzdXBwb3J0cyBmZWF0dXJlIHNlbGVjdGlvblxuICAgICAgICB0aGlzLmNvbXBpbGVfc2V0dXAgPSBmYWxzZTsgICAgICAgICAgICAgICAgIC8vIG9uZS10aW1lIHNldHVwIHN0ZXBzIGZvciBwcm9ncmFtIGNvbXBpbGF0aW9uXG4gICAgICAgIHRoaXMucHJvZ3JhbSA9IG51bGw7ICAgICAgICAgICAgICAgICAgICAgICAgLy8gR0wgcHJvZ3JhbSByZWZlcmVuY2UgKGZvciBtYWluIHJlbmRlciBwYXNzKVxuICAgICAgICB0aGlzLnNlbGVjdGlvbl9wcm9ncmFtID0gbnVsbDsgICAgICAgICAgICAgIC8vIEdMIHByb2dyYW0gcmVmZXJlbmNlIGZvciBmZWF0dXJlIHNlbGVjdGlvbiByZW5kZXIgcGFzc1xuICAgICAgICB0aGlzLmZlYXR1cmVfc3R5bGUgPSB7fTsgICAgICAgICAgICAgICAgICAgIC8vIHN0eWxlIGZvciBmZWF0dXJlIGN1cnJlbnRseSBiZWluZyBwYXJzZWQsIHNoYXJlZCB0byBsZXNzZW4gR0MvbWVtb3J5IHRocmFzaFxuICAgICAgICB0aGlzLnZlcnRleF90ZW1wbGF0ZSA9IFtdOyAgICAgICAgICAgICAgICAgIC8vIHNoYXJlZCBzaW5nbGUtdmVydGV4IHRlbXBsYXRlLCBmaWxsZWQgb3V0IGJ5IGVhY2ggc3R5bGVcbiAgICAgICAgdGhpcy50aWxlX2RhdGEgPSB7fTtcblxuICAgICAgICAvLyBQcm92aWRlIGEgaG9vayBmb3IgdGhpcyBvYmplY3QgdG8gYmUgY2FsbGVkIGZyb20gd29ya2VyIHRocmVhZHNcbiAgICAgICAgdGhpcy5tYWluX3RocmVhZF90YXJnZXQgPSBbJ1N0eWxlJywgdGhpcy5uYW1lLCB0aGlzLmdlbmVyYXRpb25dLmpvaW4oJy8nKTtcbiAgICAgICAgaWYgKFRocmVhZC5pc19tYWluKSB7XG4gICAgICAgICAgICBXb3JrZXJCcm9rZXIuYWRkVGFyZ2V0KHRoaXMubWFpbl90aHJlYWRfdGFyZ2V0LCB0aGlzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIERlZmF1bHQgd29ybGQgY29vcmRzIHRvIHdyYXAgZXZlcnkgMTAwLDAwMCBtZXRlcnMsIGNhbiB0dXJuIG9mZiBieSBzZXR0aW5nIHRoaXMgdG8gJ2ZhbHNlJ1xuICAgICAgICB0aGlzLmRlZmluZXMuVEFOR1JBTV9XT1JMRF9QT1NJVElPTl9XUkFQID0gMTAwMDAwO1xuXG4gICAgICAgIC8vIEJsZW5kaW5nXG4gICAgICAgIHRoaXMuYmxlbmQgPSB0aGlzLmJsZW5kIHx8ICdvcGFxdWUnOyAgICAgICAgLy8gZGVmYXVsdDogb3BhcXVlIHN0eWxlcyBhcmUgZHJhd24gZmlyc3QsIHdpdGhvdXQgYmxlbmRpbmdcbiAgICAgICAgdGhpcy5kZWZpbmVzW2BUQU5HUkFNX0JMRU5EXyR7dGhpcy5ibGVuZC50b1VwcGVyQ2FzZSgpfWBdID0gdHJ1ZTtcbiAgICAgICAgaWYgKHRoaXMuYmxlbmRfb3JkZXIgPT0gbnVsbCkgeyAvLyBjb250cm9scyBvcmRlciBvZiByZW5kZXJpbmcgZm9yIHN0eWxlcyB3L25vbi1vcGFxdWUgYmxlbmRpbmdcbiAgICAgICAgICAgIHRoaXMuYmxlbmRfb3JkZXIgPSAtMTsgLy8gZGVmYXVsdHMgdG8gZmlyc3RcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIElmIHRoZSBzdHlsZSBkZWZpbmVzIGl0cyBvd24gbWF0ZXJpYWwsIHJlcGxhY2UgdGhlIGluaGVyaXRlZCBtYXRlcmlhbCBpbnN0YW5jZVxuICAgICAgICBpZiAoISh0aGlzLm1hdGVyaWFsIGluc3RhbmNlb2YgTWF0ZXJpYWwpKSB7XG4gICAgICAgICAgICBpZiAoIU1hdGVyaWFsLmlzVmFsaWQodGhpcy5tYXRlcmlhbCkpIHtcbiAgICAgICAgICAgICAgICB0aGlzLm1hdGVyaWFsID0gU3R5bGVQYXJzZXIuZGVmYXVsdHMubWF0ZXJpYWw7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLm1hdGVyaWFsID0gbmV3IE1hdGVyaWFsKHRoaXMubWF0ZXJpYWwpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMubWF0ZXJpYWwuaW5qZWN0KHRoaXMpO1xuXG4gICAgICAgIC8vIFNldCBsaWdodGluZyBtb2RlOiBmcmFnbWVudCwgdmVydGV4LCBvciBub25lIChzcGVjaWZpZWQgYXMgJ2ZhbHNlJylcbiAgICAgICAgTGlnaHQuc2V0TW9kZSh0aGlzLmxpZ2h0aW5nLCB0aGlzKTtcblxuICAgICAgICAvLyBTZXR1cCByYXN0ZXIgc2FtcGxlcnMgaWYgbmVlZGVkXG4gICAgICAgIHRoaXMuc2V0dXBSYXN0ZXJzKCk7XG5cbiAgICAgICAgdGhpcy5pbml0aWFsaXplZCA9IHRydWU7XG4gICAgfSxcblxuICAgIGRlc3Ryb3kgKCkge1xuICAgICAgICBpZiAodGhpcy5wcm9ncmFtKSB7XG4gICAgICAgICAgICB0aGlzLnByb2dyYW0uZGVzdHJveSgpO1xuICAgICAgICAgICAgdGhpcy5wcm9ncmFtID0gbnVsbDtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aGlzLnNlbGVjdGlvbl9wcm9ncmFtKSB7XG4gICAgICAgICAgICB0aGlzLnNlbGVjdGlvbl9wcm9ncmFtLmRlc3Ryb3koKTtcbiAgICAgICAgICAgIHRoaXMuc2VsZWN0aW9uX3Byb2dyYW0gPSBudWxsO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5nbCA9IG51bGw7XG4gICAgICAgIHRoaXMuaW5pdGlhbGl6ZWQgPSBmYWxzZTtcbiAgICB9LFxuXG4gICAgcmVzZXQgKCkge1xuICAgIH0sXG5cbiAgICBiYXNlU3R5bGUgKCkge1xuICAgICAgICByZXR1cm4gdGhpcy5iYXNlIHx8IHRoaXMubmFtZTtcbiAgICB9LFxuXG4gICAgZmlsbFZlcnRleFRlbXBsYXRlKGF0dHJpYnV0ZSwgdmFsdWUsIHsgc2l6ZSwgb2Zmc2V0IH0pIHtcbiAgICAgICAgb2Zmc2V0ID0gKG9mZnNldCA9PT0gdW5kZWZpbmVkKSA/IDAgOiBvZmZzZXQ7XG5cbiAgICAgICAgbGV0IGluZGV4ID0gdGhpcy52ZXJ0ZXhfbGF5b3V0LmluZGV4W2F0dHJpYnV0ZV07XG4gICAgICAgIGlmIChpbmRleCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgICAgICBsb2coJ3dhcm4nLCBgU3R5bGU6IGluIHN0eWxlICcke3RoaXMubmFtZX0nLCBubyBpbmRleCBmb3VuZCBpbiB2ZXJ0ZXggbGF5b3V0IGZvciBhdHRyaWJ1dGUgJyR7YXR0cmlidXRlfSdgKTtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgc2l6ZTsgKytpKSB7XG4gICAgICAgICAgICBsZXQgdiA9IHZhbHVlLmxlbmd0aCA+IGkgPyB2YWx1ZVtpXSA6IHZhbHVlO1xuICAgICAgICAgICAgdGhpcy52ZXJ0ZXhfdGVtcGxhdGVbaW5kZXggKyBpICsgb2Zmc2V0XSA9IHY7XG4gICAgICAgIH1cbiAgICB9LFxuXG4gICAgLyoqKiBTdHlsZSBwYXJzaW5nIGFuZCBnZW9tZXRyeSBjb25zdHJ1Y3Rpb24gKioqL1xuXG4gICAgLy8gUmV0dXJucyBhbiBvYmplY3QgdG8gaG9sZCBmZWF0dXJlIGRhdGEgKGZvciBhIHRpbGUgb3Igb3RoZXIgb2JqZWN0KVxuICAgIHN0YXJ0RGF0YSAodGlsZSkge1xuICAgICAgICB0aGlzLnRpbGVfZGF0YVt0aWxlLmtleV0gPSB7XG4gICAgICAgICAgICB2ZXJ0ZXhfZGF0YTogbnVsbCxcbiAgICAgICAgICAgIHVuaWZvcm1zOiB7fSxcbiAgICAgICAgICAgIHRleHR1cmVzOiBbXVxuICAgICAgICB9O1xuICAgICAgICByZXR1cm4gdGhpcy50aWxlX2RhdGFbdGlsZS5rZXldO1xuICAgIH0sXG5cbiAgICAvLyBGaW5hbGl6ZXMgYW4gb2JqZWN0IGhvbGRpbmcgZmVhdHVyZSBkYXRhIChmb3IgYSB0aWxlIG9yIG90aGVyIG9iamVjdClcbiAgICBlbmREYXRhICh0aWxlKSB7XG4gICAgICAgIHZhciB0aWxlX2RhdGEgPSB0aGlzLnRpbGVfZGF0YVt0aWxlLmtleV07XG4gICAgICAgIHRoaXMudGlsZV9kYXRhW3RpbGUua2V5XSA9IG51bGw7XG5cbiAgICAgICAgaWYgKHRpbGVfZGF0YSAmJiB0aWxlX2RhdGEudmVydGV4X2RhdGEgJiYgdGlsZV9kYXRhLnZlcnRleF9kYXRhLnZlcnRleF9jb3VudCA+IDApIHtcbiAgICAgICAgICAgIC8vIE9ubHkga2VlcCBmaW5hbCBieXRlIGJ1ZmZlclxuICAgICAgICAgICAgdGlsZV9kYXRhLnZlcnRleF9kYXRhLmVuZCgpO1xuICAgICAgICAgICAgdGlsZV9kYXRhLnZlcnRleF9lbGVtZW50cyA9IHRpbGVfZGF0YS52ZXJ0ZXhfZGF0YS5lbGVtZW50X2J1ZmZlcjtcbiAgICAgICAgICAgIHRpbGVfZGF0YS52ZXJ0ZXhfZGF0YSA9IHRpbGVfZGF0YS52ZXJ0ZXhfZGF0YS52ZXJ0ZXhfYnVmZmVyOyAvLyBjb252ZXJ0IGZyb20gaW5zdGFuY2UgdG8gcmF3IHR5cGVkIGFycmF5XG5cbiAgICAgICAgICAgIC8vIExvYWQgcmFzdGVyIHRpbGVzIHBhc3NlZCBmcm9tIGRhdGEgc291cmNlXG4gICAgICAgICAgICAvLyBCbG9ja3MgbWVzaCBjb21wbGV0aW9uIHRvIGF2b2lkIGZsaWNrZXJpbmdcbiAgICAgICAgICAgIHJldHVybiB0aGlzLmJ1aWxkUmFzdGVyVGV4dHVyZXModGlsZSwgdGlsZV9kYXRhKS50aGVuKCgpID0+IHRpbGVfZGF0YSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKG51bGwpOyAvLyBkb24ndCBzZW5kIHRpbGUgZGF0YSBiYWNrIGlmIGRvZXNuJ3QgaGF2ZSBnZW9tZXRyeVxuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8vIEhhcyBtZXNoIGRhdGEgZm9yIGEgZ2l2ZW4gdGlsZT9cbiAgICBoYXNEYXRhRm9yVGlsZSAodGlsZV9rZXkpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMudGlsZV9kYXRhW3RpbGVfa2V5XSAhPSBudWxsO1xuICAgIH0sXG5cbiAgICBhZGRGZWF0dXJlIChmZWF0dXJlLCBkcmF3LCBjb250ZXh0KSB7XG4gICAgICAgIGxldCB0aWxlID0gY29udGV4dC50aWxlO1xuICAgICAgICBpZiAodGlsZS5nZW5lcmF0aW9uICE9PSB0aGlzLmdlbmVyYXRpb24pIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghdGhpcy50aWxlX2RhdGFbdGlsZS5rZXldKSB7XG4gICAgICAgICAgICB0aGlzLnN0YXJ0RGF0YSh0aWxlKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBzdHlsZSA9IHRoaXMucGFyc2VGZWF0dXJlKGZlYXR1cmUsIGRyYXcsIGNvbnRleHQpO1xuXG4gICAgICAgIC8vIFNraXAgZmVhdHVyZT9cbiAgICAgICAgaWYgKCFzdHlsZSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gRmlyc3QgZmVhdHVyZSBpbiB0aGlzIHJlbmRlciBzdHlsZT9cbiAgICAgICAgaWYgKCF0aGlzLnRpbGVfZGF0YVt0aWxlLmtleV0udmVydGV4X2RhdGEpIHtcbiAgICAgICAgICAgIHRoaXMudGlsZV9kYXRhW3RpbGUua2V5XS52ZXJ0ZXhfZGF0YSA9IHRoaXMudmVydGV4X2xheW91dC5jcmVhdGVWZXJ0ZXhEYXRhKCk7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmJ1aWxkR2VvbWV0cnkoZmVhdHVyZS5nZW9tZXRyeSwgc3R5bGUsIHRoaXMudGlsZV9kYXRhW3RpbGUua2V5XS52ZXJ0ZXhfZGF0YSwgY29udGV4dCk7XG4gICAgfSxcblxuICAgIGJ1aWxkR2VvbWV0cnkgKGdlb21ldHJ5LCBzdHlsZSwgdmVydGV4X2RhdGEsIGNvbnRleHQpIHtcbiAgICAgICAgaWYgKGdlb21ldHJ5LnR5cGUgPT09ICdQb2x5Z29uJykge1xuICAgICAgICAgICAgdGhpcy5idWlsZFBvbHlnb25zKFtnZW9tZXRyeS5jb29yZGluYXRlc10sIHN0eWxlLCB2ZXJ0ZXhfZGF0YSwgY29udGV4dCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoZ2VvbWV0cnkudHlwZSA9PT0gJ011bHRpUG9seWdvbicpIHtcbiAgICAgICAgICAgIHRoaXMuYnVpbGRQb2x5Z29ucyhnZW9tZXRyeS5jb29yZGluYXRlcywgc3R5bGUsIHZlcnRleF9kYXRhLCBjb250ZXh0KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChnZW9tZXRyeS50eXBlID09PSAnTGluZVN0cmluZycpIHtcbiAgICAgICAgICAgIHRoaXMuYnVpbGRMaW5lcyhbZ2VvbWV0cnkuY29vcmRpbmF0ZXNdLCBzdHlsZSwgdmVydGV4X2RhdGEsIGNvbnRleHQpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGdlb21ldHJ5LnR5cGUgPT09ICdNdWx0aUxpbmVTdHJpbmcnKSB7XG4gICAgICAgICAgICB0aGlzLmJ1aWxkTGluZXMoZ2VvbWV0cnkuY29vcmRpbmF0ZXMsIHN0eWxlLCB2ZXJ0ZXhfZGF0YSwgY29udGV4dCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoZ2VvbWV0cnkudHlwZSA9PT0gJ1BvaW50Jykge1xuICAgICAgICAgICAgdGhpcy5idWlsZFBvaW50cyhbZ2VvbWV0cnkuY29vcmRpbmF0ZXNdLCBzdHlsZSwgdmVydGV4X2RhdGEsIGNvbnRleHQpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGdlb21ldHJ5LnR5cGUgPT09ICdNdWx0aVBvaW50Jykge1xuICAgICAgICAgICAgdGhpcy5idWlsZFBvaW50cyhnZW9tZXRyeS5jb29yZGluYXRlcywgc3R5bGUsIHZlcnRleF9kYXRhLCBjb250ZXh0KTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICBwYXJzZUZlYXR1cmUgKGZlYXR1cmUsIGRyYXcsIGNvbnRleHQpIHtcbiAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgIHZhciBzdHlsZSA9IHRoaXMuZmVhdHVyZV9zdHlsZTtcblxuICAgICAgICAgICAgZHJhdyA9IHRoaXMucHJlcHJvY2VzcyhkcmF3KTtcbiAgICAgICAgICAgIGlmICghZHJhdykge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gQ2FsY3VsYXRlIG9yZGVyIGlmIGl0IHdhcyBub3QgY2FjaGVkXG4gICAgICAgICAgICBzdHlsZS5vcmRlciA9IHRoaXMucGFyc2VPcmRlcihkcmF3Lm9yZGVyLCBjb250ZXh0KTtcblxuICAgICAgICAgICAgLy8gRmVhdHVyZSBzZWxlY3Rpb24gKG9ubHkgaWYgc3R5bGUgc3VwcG9ydHMgaXQpXG4gICAgICAgICAgICB2YXIgc2VsZWN0YWJsZSA9IGZhbHNlO1xuICAgICAgICAgICAgc3R5bGUuaW50ZXJhY3RpdmUgPSB0aGlzLmludHJvc3BlY3Rpb24gfHwgZHJhdy5pbnRlcmFjdGl2ZTtcbiAgICAgICAgICAgIGlmICh0aGlzLnNlbGVjdGlvbikge1xuICAgICAgICAgICAgICAgIHNlbGVjdGFibGUgPSBTdHlsZVBhcnNlci5ldmFsUHJvcGVydHkoc3R5bGUuaW50ZXJhY3RpdmUsIGNvbnRleHQpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBJZiBmZWF0dXJlIGlzIG1hcmtlZCBhcyBzZWxlY3RhYmxlXG4gICAgICAgICAgICBpZiAoc2VsZWN0YWJsZSkge1xuICAgICAgICAgICAgICAgIHN0eWxlLnNlbGVjdGlvbl9jb2xvciA9IEZlYXR1cmVTZWxlY3Rpb24ubWFrZUNvbG9yKGZlYXR1cmUsIGNvbnRleHQudGlsZSwgY29udGV4dCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBzdHlsZS5zZWxlY3Rpb25fY29sb3IgPSBGZWF0dXJlU2VsZWN0aW9uLmRlZmF1bHRDb2xvcjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gU3ViY2xhc3MgaW1wbGVtZW50YXRpb25cbiAgICAgICAgICAgIHN0eWxlID0gdGhpcy5fcGFyc2VGZWF0dXJlKGZlYXR1cmUsIGRyYXcsIGNvbnRleHQpO1xuXG4gICAgICAgICAgICByZXR1cm4gc3R5bGU7XG4gICAgICAgIH1cbiAgICAgICAgY2F0Y2goZXJyb3IpIHtcbiAgICAgICAgICAgIGxvZygnZXJyb3InLCAnU3R5bGUucGFyc2VGZWF0dXJlOiBzdHlsZSBwYXJzaW5nIGVycm9yJywgZmVhdHVyZSwgc3R5bGUsIGVycm9yKTtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICBfcGFyc2VGZWF0dXJlIChmZWF0dXJlLCBkcmF3LCBjb250ZXh0KSB7XG4gICAgICAgIHJldHVybiB0aGlzLmZlYXR1cmVfc3R5bGU7XG4gICAgfSxcblxuICAgIHByZXByb2Nlc3MgKGRyYXcpIHtcbiAgICAgICAgLy8gUHJlcHJvY2VzcyBmaXJzdCB0aW1lXG4gICAgICAgIGlmICghZHJhdy5wcmVwcm9jZXNzZWQpIHtcbiAgICAgICAgICAgIGRyYXcgPSB0aGlzLl9wcmVwcm9jZXNzKGRyYXcpOyAvLyBvcHRpb25hbCBzdWJjbGFzcyBpbXBsZW1lbnRhdGlvblxuICAgICAgICAgICAgaWYgKCFkcmF3KSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZHJhdy5wcmVwcm9jZXNzZWQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBkcmF3O1xuICAgIH0sXG5cbiAgICAvLyBvcHRpb25hbGx5IGltcGxlbWVudGVkIGJ5IHN1YmNsYXNzXG4gICAgX3ByZXByb2Nlc3MgKGRyYXcpIHtcbiAgICAgICAgcmV0dXJuIGRyYXc7XG4gICAgfSxcblxuICAgIC8vIFBhcnNlIGFuIG9yZGVyIHZhbHVlXG4gICAgcGFyc2VPcmRlciAob3JkZXIsIGNvbnRleHQpIHtcbiAgICAgICAgLy8gQ2FsY3VsYXRlIG9yZGVyIGlmIGl0IHdhcyBub3QgY2FjaGVkXG4gICAgICAgIGlmICh0eXBlb2Ygb3JkZXIgIT09ICdudW1iZXInKSB7XG4gICAgICAgICAgICByZXR1cm4gU3R5bGVQYXJzZXIuY2FsY3VsYXRlT3JkZXIob3JkZXIsIGNvbnRleHQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBvcmRlcjtcbiAgICB9LFxuXG4gICAgLy8gRXhwYW5kIGZpbmFsIHByZWNpc2lvbiBmb3IgaGFsZi1sYXllcnMgKGZvciBvdXRsaW5lcylcbiAgICBzY2FsZU9yZGVyIChvcmRlcikge1xuICAgICAgICByZXR1cm4gb3JkZXIgKiAyO1xuICAgIH0sXG5cbiAgICAvLyBQYXJzZSBhIGNvbG9yIG9mIGNob29zZSBhIGRlZmF1bHQgaWYgYWNjZXB0YWJsZSwgcmV0dXJuIHVuZGVmaW5lZCBpZiBjb2xvciBtaXNzaW5nXG4gICAgcGFyc2VDb2xvcihjb2xvciwgY29udGV4dCkge1xuICAgICAgICAvLyBOZWVkIGVpdGhlciBhIGNvbG9yLCBvciBhIHNoYWRlciBibG9jayBmb3IgJ2NvbG9yJyBvciAnZmlsdGVyJ1xuICAgICAgICBpZiAoY29sb3IpIHtcbiAgICAgICAgICAgIHJldHVybiBTdHlsZVBhcnNlci5ldmFsQ2FjaGVkQ29sb3JQcm9wZXJ0eShjb2xvciwgY29udGV4dCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodGhpcy5zaGFkZXJzLmJsb2Nrcy5jb2xvciB8fCB0aGlzLnNoYWRlcnMuYmxvY2tzLmZpbHRlcikge1xuICAgICAgICAgICAgcmV0dXJuIFN0eWxlUGFyc2VyLmRlZmF1bHRzLmNvbG9yO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8vIEJ1aWxkIGZ1bmN0aW9ucyBhcmUgbm8tb3BzIHVudGlsIG92ZXJyaWRlblxuICAgIGJ1aWxkUG9seWdvbnMgKCkge30sXG4gICAgYnVpbGRMaW5lcyAoKSB7fSxcbiAgICBidWlsZFBvaW50cyAoKSB7fSxcblxuXG4gICAgLyoqKiBHTCBzdGF0ZSBhbmQgcmVuZGVyaW5nICoqKi9cblxuICAgIHNldEdMIChnbCkge1xuICAgICAgICB0aGlzLmdsID0gZ2w7XG4gICAgICAgIHRoaXMubWF4X3RleHR1cmVfc2l6ZSA9IFRleHR1cmUuZ2V0TWF4VGV4dHVyZVNpemUodGhpcy5nbCk7XG4gICAgfSxcblxuICAgIG1ha2VNZXNoICh2ZXJ0ZXhfZGF0YSwgdmVydGV4X2VsZW1lbnRzLCBvcHRpb25zID0ge30pIHtcbiAgICAgICAgcmV0dXJuIG5ldyBWQk9NZXNoKHRoaXMuZ2wsIHZlcnRleF9kYXRhLCB2ZXJ0ZXhfZWxlbWVudHMsIHRoaXMudmVydGV4X2xheW91dCwgb3B0aW9ucyk7XG4gICAgfSxcblxuICAgIHJlbmRlciAobWVzaCkge1xuICAgICAgICByZXR1cm4gbWVzaC5yZW5kZXIoKTtcbiAgICB9LFxuXG4gICAgLy8gR2V0IGEgc3BlY2lmaWMgcHJvZ3JhbSwgY29tcGlsaW5nIGlmIG5lY2Vzc2FyeVxuICAgIGdldFByb2dyYW0gKGtleSA9ICdwcm9ncmFtJykge1xuICAgICAgICB0aGlzLmNvbXBpbGVTZXR1cCgpO1xuXG4gICAgICAgIGNvbnN0IHByb2dyYW0gPSB0aGlzW2tleV07XG4gICAgICAgIGlmICghcHJvZ3JhbSB8fCBwcm9ncmFtLmVycm9yKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoIXByb2dyYW0uY29tcGlsZWQpIHtcbiAgICAgICAgICAgIGxvZygnZGVidWcnLCBgQ29tcGlsaW5nIHN0eWxlICcke3RoaXMubmFtZX0nLCBwcm9ncmFtIGtleSAnJHtrZXl9J2ApO1xuICAgICAgICAgICAgcHJvZ3JhbS5jb21waWxlKCk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHByb2dyYW07XG4gICAgfSxcblxuICAgIC8vIE9uZS10aW1lIHNldHVwIGZvciBjb21waWxpbmcgc3R5bGUncyBwcm9ncmFtc1xuICAgIGNvbXBpbGVTZXR1cCAoKSB7XG4gICAgICAgIGlmICh0aGlzLmNvbXBpbGVfc2V0dXApIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghdGhpcy5nbCkge1xuICAgICAgICAgICAgdGhyb3cobmV3IEVycm9yKGBzdHlsZS5jb21waWxlKCk6IHNraXBwaW5nIGZvciAke3RoaXMubmFtZX0gYmVjYXVzZSBubyBHTCBjb250ZXh0YCkpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQnVpbGQgZGVmaW5lcyAmIGZvciBzZWxlY3Rpb24gKG5lZWQgdG8gY3JlYXRlIGEgbmV3IG9iamVjdCBzaW5jZSB0aGUgZmlyc3QgaXMgc3RvcmVkIGFzIGEgcmVmZXJlbmNlIGJ5IHRoZSBwcm9ncmFtKVxuICAgICAgICB2YXIgZGVmaW5lcyA9IHRoaXMuYnVpbGREZWZpbmVMaXN0KCk7XG4gICAgICAgIGlmICh0aGlzLnNlbGVjdGlvbikge1xuICAgICAgICAgICAgdmFyIHNlbGVjdGlvbl9kZWZpbmVzID0gT2JqZWN0LmFzc2lnbih7fSwgZGVmaW5lcyk7XG4gICAgICAgICAgICBzZWxlY3Rpb25fZGVmaW5lcy5UQU5HUkFNX0ZFQVRVUkVfU0VMRUNUSU9OID0gdHJ1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIEdldCBhbnkgY3VzdG9tIGNvZGUgYmxvY2tzLCB1bmlmb3JtIGRlcGVuZGVuY2llcywgZXRjLlxuICAgICAgICB2YXIgYmxvY2tzID0gKHRoaXMuc2hhZGVycyAmJiB0aGlzLnNoYWRlcnMuYmxvY2tzKTtcbiAgICAgICAgdmFyIGJsb2NrX3Njb3BlcyA9ICh0aGlzLnNoYWRlcnMgJiYgdGhpcy5zaGFkZXJzLmJsb2NrX3Njb3Blcyk7XG4gICAgICAgIHZhciB1bmlmb3JtcyA9IE9iamVjdC5hc3NpZ24oe30sIHRoaXMuc2hhZGVycyAmJiB0aGlzLnNoYWRlcnMudW5pZm9ybXMpO1xuXG4gICAgICAgIC8vIEFjY2VwdCBhIHNpbmdsZSBleHRlbnNpb24sIG9yIGFuIGFycmF5IG9mIGV4dGVuc2lvbnNcbiAgICAgICAgdmFyIGV4dGVuc2lvbnMgPSAodGhpcy5zaGFkZXJzICYmIHRoaXMuc2hhZGVycy5leHRlbnNpb25zKTtcbiAgICAgICAgaWYgKHR5cGVvZiBleHRlbnNpb25zID09PSAnc3RyaW5nJykge1xuICAgICAgICAgICAgZXh0ZW5zaW9ucyA9IFtleHRlbnNpb25zXTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENyZWF0ZSBzaGFkZXJzXG4gICAgICAgIHRoaXMucHJvZ3JhbSA9IG5ldyBTaGFkZXJQcm9ncmFtKFxuICAgICAgICAgICAgdGhpcy5nbCxcbiAgICAgICAgICAgIHRoaXMudmVydGV4X3NoYWRlcl9zcmMsXG4gICAgICAgICAgICB0aGlzLmZyYWdtZW50X3NoYWRlcl9zcmMsXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgbmFtZTogdGhpcy5uYW1lLFxuICAgICAgICAgICAgICAgIGRlZmluZXMsXG4gICAgICAgICAgICAgICAgdW5pZm9ybXMsXG4gICAgICAgICAgICAgICAgYmxvY2tzLFxuICAgICAgICAgICAgICAgIGJsb2NrX3Njb3BlcyxcbiAgICAgICAgICAgICAgICBleHRlbnNpb25zXG4gICAgICAgICAgICB9XG4gICAgICAgICk7XG5cbiAgICAgICAgaWYgKHRoaXMuc2VsZWN0aW9uKSB7XG4gICAgICAgICAgICB0aGlzLnNlbGVjdGlvbl9wcm9ncmFtID0gbmV3IFNoYWRlclByb2dyYW0oXG4gICAgICAgICAgICAgICAgdGhpcy5nbCxcbiAgICAgICAgICAgICAgICB0aGlzLnZlcnRleF9zaGFkZXJfc3JjLFxuICAgICAgICAgICAgICAgIHNoYWRlclNyY19zZWxlY3Rpb25GcmFnbWVudCxcbiAgICAgICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgICAgIG5hbWU6ICh0aGlzLm5hbWUgKyAnIChzZWxlY3Rpb24pJyksXG4gICAgICAgICAgICAgICAgICAgIGRlZmluZXM6IHNlbGVjdGlvbl9kZWZpbmVzLFxuICAgICAgICAgICAgICAgICAgICB1bmlmb3JtcyxcbiAgICAgICAgICAgICAgICAgICAgYmxvY2tzLFxuICAgICAgICAgICAgICAgICAgICBibG9ja19zY29wZXMsXG4gICAgICAgICAgICAgICAgICAgIGV4dGVuc2lvbnNcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICApO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5zZWxlY3Rpb25fcHJvZ3JhbSA9IG51bGw7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmNvbXBpbGVfc2V0dXAgPSB0cnVlO1xuICAgIH0sXG5cbiAgICAvLyBBZGQgYSBzaGFkZXIgYmxvY2tcbiAgICBhZGRTaGFkZXJCbG9jayAoa2V5LCBibG9jaywgc2NvcGUgPSBudWxsKSB7XG4gICAgICAgIHRoaXMuc2hhZGVycy5ibG9ja3MgPSB0aGlzLnNoYWRlcnMuYmxvY2tzIHx8IHt9O1xuICAgICAgICB0aGlzLnNoYWRlcnMuYmxvY2tzW2tleV0gPSB0aGlzLnNoYWRlcnMuYmxvY2tzW2tleV0gfHwgW107XG4gICAgICAgIHRoaXMuc2hhZGVycy5ibG9ja3Nba2V5XS5wdXNoKGJsb2NrKTtcblxuICAgICAgICB0aGlzLnNoYWRlcnMuYmxvY2tfc2NvcGVzID0gdGhpcy5zaGFkZXJzLmJsb2NrX3Njb3BlcyB8fCB7fTtcbiAgICAgICAgdGhpcy5zaGFkZXJzLmJsb2NrX3Njb3Blc1trZXldID0gdGhpcy5zaGFkZXJzLmJsb2NrX3Njb3Blc1trZXldIHx8IFtdO1xuICAgICAgICB0aGlzLnNoYWRlcnMuYmxvY2tfc2NvcGVzW2tleV0ucHVzaChzY29wZSk7XG4gICAgfSxcblxuICAgIC8vIFJlbW92ZSBhbGwgc2hhZGVyIGJsb2NrcyBmb3Iga2V5XG4gICAgcmVtb3ZlU2hhZGVyQmxvY2sgKGtleSkge1xuICAgICAgICBpZiAodGhpcy5zaGFkZXJzLmJsb2Nrcykge1xuICAgICAgICAgICAgdGhpcy5zaGFkZXJzLmJsb2Nrc1trZXldID0gbnVsbDtcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICByZXBsYWNlU2hhZGVyQmxvY2sgKGtleSwgYmxvY2ssIHNjb3BlID0gbnVsbCkge1xuICAgICAgICB0aGlzLnJlbW92ZVNoYWRlckJsb2NrKGtleSk7XG4gICAgICAgIHRoaXMuYWRkU2hhZGVyQmxvY2soa2V5LCBibG9jaywgc2NvcGUpO1xuICAgIH0sXG5cbiAgICAvKiogVE9ETzogY291bGQgcHJvYmFibHkgY29tYmluZSBhbmQgZ2VuZXJhbGl6ZSB0aGlzIHdpdGggc2ltaWxhciBtZXRob2QgaW4gU2hhZGVyUHJvZ3JhbVxuICAgICAqIChsaXN0IG9mIGRlZmluZSBvYmplY3RzIHRoYXQgaW5oZXJpdCBmcm9tIGVhY2ggb3RoZXIpXG4gICAgICovXG4gICAgYnVpbGREZWZpbmVMaXN0ICgpIHtcbiAgICAgICAgLy8gQWRkIGFueSBjdXN0b20gZGVmaW5lcyB0byBidWlsdC1pbiBzdHlsZSBkZWZpbmVzXG4gICAgICAgIHZhciBkZWZpbmVzID0ge307IC8vIGNyZWF0ZSBhIG5ldyBvYmplY3QgdG8gYXZvaWQgbXV0YXRpbmcgYSBwcm90b3R5cGUgdmFsdWUgdGhhdCBtYXkgYmUgc2hhcmVkIHdpdGggb3RoZXIgc3R5bGVzXG4gICAgICAgIGlmICh0aGlzLmRlZmluZXMgIT0gbnVsbCkge1xuICAgICAgICAgICAgZm9yICh2YXIgZCBpbiB0aGlzLmRlZmluZXMpIHtcbiAgICAgICAgICAgICAgICBkZWZpbmVzW2RdID0gdGhpcy5kZWZpbmVzW2RdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGlmICh0aGlzLnNoYWRlcnMgIT0gbnVsbCAmJiB0aGlzLnNoYWRlcnMuZGVmaW5lcyAhPSBudWxsKSB7XG4gICAgICAgICAgICBmb3IgKGQgaW4gdGhpcy5zaGFkZXJzLmRlZmluZXMpIHtcbiAgICAgICAgICAgICAgICBkZWZpbmVzW2RdID0gdGhpcy5zaGFkZXJzLmRlZmluZXNbZF07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGRlZmluZXM7XG5cbiAgICB9LFxuXG4gICAgLy8gRGV0ZXJtaW5lcyBpZiAncmFzdGVyJyBwYXJhbWV0ZXIgaXMgc2V0IHRvIGEgdmFsaWQgdmFsdWVcbiAgICBoYXNSYXN0ZXJzICgpIHtcbiAgICAgICAgcmV0dXJuIChbJ2NvbG9yJywgJ25vcm1hbCcsICdjdXN0b20nXS5pbmRleE9mKHRoaXMucmFzdGVyKSA+IC0xKTtcbiAgICB9LFxuXG4gICAgLy8gU2V0dXAgcmFzdGVyIGFjY2VzcyBpbiBzaGFkZXJzXG4gICAgc2V0dXBSYXN0ZXJzICgpIHtcbiAgICAgICAgaWYgKCF0aGlzLmhhc1Jhc3RlcnMoKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gRW5hYmxlIHJhc3RlciB0ZXh0dXJlcyBhbmQgY29uZmlndXJlIGhvdyBmaXJzdCByYXN0ZXIgaXMgYXBwbGllZFxuICAgICAgICBpZiAodGhpcy5yYXN0ZXIgPT09ICdjb2xvcicpIHtcbiAgICAgICAgICAgIHRoaXMuZGVmaW5lcy5UQU5HUkFNX1JBU1RFUl9URVhUVVJFX0NPTE9SID0gdHJ1ZTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmICh0aGlzLnJhc3RlciA9PT0gJ25vcm1hbCcpIHtcbiAgICAgICAgICAgIHRoaXMuZGVmaW5lcy5UQU5HUkFNX1JBU1RFUl9URVhUVVJFX05PUk1BTCA9IHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgLy8gZWxzZSBjdXN0b20gcmFzdGVyIChzYW1wbGVycyB3aWxsIGJlIG1hZGUgYXZhaWxhYmxlIGJ1dCBub3QgYXV0b21hdGljYWxseSBhcHBsaWVkKVxuXG4gICAgICAgIC8vIEEgZ2l2ZW4gc3R5bGUgbWF5IGJlIGJ1aWx0IHdpdGggbXVsdGlwbGUgZGF0YSBzb3VyY2VzLCBlYWNoIG9mIHdoaWNoIG1heSBhdHRhY2hcbiAgICAgICAgLy8gYSB2YXJpYWJsZSBudW1iZXIgb2YgcmFzdGVyIHNvdXJjZXMgKDAgdG8gTiwgd2hlcmUgTiBpcyB0aGUgbWF4IG51bWJlciBvZiByYXN0ZXIgc291cmNlc1xuICAgICAgICAvLyBkZWZpbmVkIGZvciB0aGUgc2NlbmUpLiBUaGlzIG1lYW5zIHdlIGRvbid0IGtub3cgKndoaWNoKiBvciAqaG93IG1hbnkqIHJhc3RlcnMgd2lsbCBiZVxuICAgICAgICAvLyBib3VuZCBub3csIGF0IGluaXRpYWwgY29tcGlsZS10aW1lOyB3ZSBvbmx5IGtub3cgdGhpcyBhdCBnZW9tZXRyeSBidWlsZC10aW1lLiBUbyBlbnN1cmVcbiAgICAgICAgLy8gdGhhdCB3ZSBjYW4gYmluZCBhcyBtYW55IHJhc3RlciBzb3VyY2VzIGFzIG5lZWRlZCwgd2UgZGVjbGFyZSBvdXIgdW5pZm9ybSBhcnJheXMgdG8gaG9sZFxuICAgICAgICAvLyB0aGUgbWF4aW11bSBudW1iZXIgb2YgcG9zc2libGUgc291cmNlcy4gQXQgcmVuZGVyIHRpbWUsIG9ubHkgdGhlIG5lY2Vzc2FyeSBudW1iZXIgb2YgcmFzdGVyc1xuICAgICAgICAvLyBhcmUgYm91bmQgKHRoZSByZW1haW5pbmcgc2xvdHMgYXJlbid0IGludGVuZGVkIHRvIGJlIGFjY2Vzc2VkKS5cbiAgICAgICAgbGV0IG51bV9yYXN0ZXJfc291cmNlcyA9XG4gICAgICAgICAgICBPYmplY3Qua2V5cyh0aGlzLnNvdXJjZXMpXG4gICAgICAgICAgICAuZmlsdGVyKHMgPT4gdGhpcy5zb3VyY2VzW3NdIGluc3RhbmNlb2YgUmFzdGVyVGlsZVNvdXJjZSlcbiAgICAgICAgICAgIC5sZW5ndGg7XG5cbiAgICAgICAgdGhpcy5kZWZpbmVzLlRBTkdSQU1fTlVNX1JBU1RFUl9TT1VSQ0VTID0gYGludCgke251bV9yYXN0ZXJfc291cmNlc30pYDtcbiAgICAgICAgaWYgKG51bV9yYXN0ZXJfc291cmNlcyA+IDApIHtcbiAgICAgICAgICAgIC8vIFVzZSBtb2RlbCBwb3NpdGlvbiBvZiB0aWxlJ3MgY29vcmRpbmF0ZSB6b29tIGZvciByYXN0ZXIgdGlsZSB0ZXh0dXJlIFVWc1xuICAgICAgICAgICAgdGhpcy5kZWZpbmVzLlRBTkdSQU1fTU9ERUxfUE9TSVRJT05fQkFTRV9aT09NX1ZBUllJTkcgPSB0cnVlO1xuXG4gICAgICAgICAgICAvLyBVbmlmb3JtcyBhbmQgbWFjcm9zIGZvciByYXN0ZXIgc2FtcGxlcnNcbiAgICAgICAgICAgIHRoaXMucmVwbGFjZVNoYWRlckJsb2NrKCdyYXN0ZXInLCBzaGFkZXJTcmNfcmFzdGVycywgJ1Jhc3RlcicpO1xuICAgICAgICB9XG4gICAgfSxcblxuICAgIC8vIExvYWQgcmFzdGVyIHRpbGUgdGV4dHVyZXMgYW5kIHNldCB1bmlmb3Jtc1xuICAgIGJ1aWxkUmFzdGVyVGV4dHVyZXMgKHRpbGUsIHRpbGVfZGF0YSkge1xuICAgICAgICBpZiAoIXRoaXMuaGFzUmFzdGVycygpKSB7XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHRpbGVfZGF0YSk7XG4gICAgICAgIH1cblxuICAgICAgICBsZXQgY29uZmlncyA9IHt9OyAvLyB0ZXh0dXJlIGNvbmZpZ3MgdG8gcGFzcyB0byB0ZXh0dXJlIGJ1aWxkZXIsIGtleWVkIGJ5IHRleHR1cmUgbmFtZVxuICAgICAgICBsZXQgaW5kZXggPSB7fTsgICAvLyBpbmRleCBpbnRvIHJhc3RlciBzYW1wbGVyIGFycmF5LCBrZXllZCBieSB0ZXh0dXJlIG5hbWVcblxuICAgICAgICAvLyBUT0RPOiBkYXRhIHNvdXJjZSBjb3VsZCByZXRyaWV2ZSByYXN0ZXIgdGV4dHVyZSBVUkxzXG4gICAgICAgIHRpbGUucmFzdGVycy5tYXAociA9PiB0aGlzLnNvdXJjZXNbcl0pLmZpbHRlcih4ID0+IHgpLmZvckVhY2goKHNvdXJjZSwgaSkgPT4ge1xuICAgICAgICAgICAgaWYgKHNvdXJjZSBpbnN0YW5jZW9mIFJhc3RlclRpbGVTb3VyY2UpIHtcbiAgICAgICAgICAgICAgICBsZXQgY29uZmlnID0gc291cmNlLnRpbGVUZXh0dXJlKHRpbGUpO1xuICAgICAgICAgICAgICAgIGNvbmZpZ3NbY29uZmlnLnVybF0gPSBjb25maWc7XG4gICAgICAgICAgICAgICAgaW5kZXhbY29uZmlnLnVybF0gPSBpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICBpZiAoT2JqZWN0LmtleXMoY29uZmlncykubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHRpbGVfZGF0YSk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBMb2FkIHRleHR1cmVzIG9uIG1haW4gdGhyZWFkIGFuZCByZXR1cm4gd2hlbiBkb25lXG4gICAgICAgIC8vIFdlIHdhbnQgdG8gYmxvY2sgdGhlIGJ1aWxkaW5nIG9mIGEgcmFzdGVyIHRpbGUgbWVzaCB1bnRpbCBpdHMgdGV4dHVyZSBpcyBsb2FkZWQsXG4gICAgICAgIC8vIHRvIGF2b2lkIGZsaWNrZXJpbmcgd2hpbGUgbG9hZGluZyAodGV4dHVyZSB3aWxsIHJlbmRlciBhcyBibGFjaylcbiAgICAgICAgcmV0dXJuIFdvcmtlckJyb2tlci5wb3N0TWVzc2FnZSh0aGlzLm1haW5fdGhyZWFkX3RhcmdldCsnLmxvYWRUZXh0dXJlcycsIGNvbmZpZ3MpXG4gICAgICAgICAgICAudGhlbih0ZXh0dXJlcyA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKCF0ZXh0dXJlcyB8fCB0ZXh0dXJlcy5sZW5ndGggPCAxKSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IHdhcm5pbmdcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRpbGVfZGF0YTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyBTZXQgdGV4dHVyZSB1bmlmb3JtcyAocmV0dXJuZWQgYWZ0ZXIgbG9hZGluZyBmcm9tIG1haW4gdGhyZWFkKVxuICAgICAgICAgICAgICAgIHRpbGVfZGF0YS51bmlmb3JtcyA9IHRpbGVfZGF0YS51bmlmb3JtcyB8fCB7fTtcbiAgICAgICAgICAgICAgICB0aWxlX2RhdGEudGV4dHVyZXMgPSB0aWxlX2RhdGEudGV4dHVyZXMgfHwgW107XG5cbiAgICAgICAgICAgICAgICBsZXQgdV9zYW1wbGVycyA9IHRpbGVfZGF0YS51bmlmb3Jtc1sndV9yYXN0ZXJzJ10gPSBbXTtcbiAgICAgICAgICAgICAgICBsZXQgdV9zaXplcyA9IHRpbGVfZGF0YS51bmlmb3Jtc1sndV9yYXN0ZXJfc2l6ZXMnXSA9IFtdO1xuICAgICAgICAgICAgICAgIGxldCB1X29mZnNldHMgPSB0aWxlX2RhdGEudW5pZm9ybXNbJ3VfcmFzdGVyX29mZnNldHMnXSA9IFtdO1xuXG4gICAgICAgICAgICAgICAgdGV4dHVyZXMuZm9yRWFjaCgoW3RuYW1lLCB0d2lkdGgsIHRoZWlnaHRdKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBpID0gaW5kZXhbdG5hbWVdO1xuICAgICAgICAgICAgICAgICAgICBsZXQgcmFzdGVyX2Nvb3JkcyA9IGNvbmZpZ3NbdG5hbWVdLmNvb3JkczsgLy8gdGlsZSBjb29yZHMgb2YgcmFzdGVyIHRpbGVcblxuICAgICAgICAgICAgICAgICAgICB1X3NhbXBsZXJzW2ldID0gdG5hbWU7XG4gICAgICAgICAgICAgICAgICAgIHRpbGVfZGF0YS50ZXh0dXJlcy5wdXNoKHRuYW1lKTtcblxuICAgICAgICAgICAgICAgICAgICB1X3NpemVzW2ldID0gW3R3aWR0aCwgdGhlaWdodF07XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gVGlsZSBnZW9tZXRyeSBtYXkgYmUgYXQgYSBoaWdoZXIgem9vbSB0aGFuIHRoZSByYXN0ZXIgdGlsZSB0ZXh0dXJlLFxuICAgICAgICAgICAgICAgICAgICAvLyAoZS5nLiBhbiBvdmVyem9vbWVkIHJhc3RlciB0aWxlKSwgaW4gd2hpY2ggY2FzZSB3ZSBuZWVkIHRvIGFkanVzdCB0aGVcbiAgICAgICAgICAgICAgICAgICAgLy8gcmFzdGVyIHRleHR1cmUgVVZzIHRvIG9mZnNldCB0byB0aGUgYXBwcm9wcmlhdGUgc3RhcnRpbmcgcG9pbnQgZm9yXG4gICAgICAgICAgICAgICAgICAgIC8vIHRoaXMgZ2VvbWV0cnkgdGlsZS5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHRpbGUuY29vcmRzLnogPiByYXN0ZXJfY29vcmRzLnopIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBkeiA9IHRpbGUuY29vcmRzLnogLSByYXN0ZXJfY29vcmRzLno7IC8vICMgb2YgbGV2ZWxzIHJhc3RlciBzb3VyY2UgaXMgb3Zlcnpvb21lZFxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IGR6MiA9IE1hdGgucG93KDIsIGR6KTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHVfb2Zmc2V0c1tpXSA9IFtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAodGlsZS5jb29yZHMueCAlIGR6MikgLyBkejIsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGR6MiAtIDEgLSAodGlsZS5jb29yZHMueSAlIGR6MikpIC8gZHoyLCAvLyBHTCB0ZXh0dXJlIGNvb3JkcyBhcmUgK1kgdXBcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAxIC8gZHoyXG4gICAgICAgICAgICAgICAgICAgICAgICBdO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgdV9vZmZzZXRzW2ldID0gWzAsIDAsIDFdO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gdGlsZV9kYXRhO1xuICAgICAgICAgICAgfVxuICAgICAgICApO1xuICAgIH0sXG5cbiAgICAvLyBDYWxsZWQgb24gbWFpbiB0aHJlYWRcbiAgICBsb2FkVGV4dHVyZXMgKHRleHR1cmVzKSB7XG4gICAgICAgIC8vIE5COiBvbmx5IHJldHVybiBuYW1lIGFuZCBzaXplIG9mIHRleHR1cmVzIGxvYWRlZCwgYmVjYXVzZSB3ZSBjYW4ndCBzZW5kIGFjdHVhbCB0ZXh0dXJlIG9iamVjdHMgdG8gd29ya2VyXG4gICAgICAgIHJldHVybiBUZXh0dXJlLmNyZWF0ZUZyb21PYmplY3QodGhpcy5nbCwgdGV4dHVyZXMpXG4gICAgICAgICAgICAudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFByb21pc2UuYWxsKE9iamVjdC5rZXlzKHRleHR1cmVzKS5tYXAodCA9PiB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiBUZXh0dXJlLnRleHR1cmVzW3RdICYmIFRleHR1cmUudGV4dHVyZXNbdF0ubG9hZCgpO1xuICAgICAgICAgICAgICAgIH0pLmZpbHRlcih4ID0+IHgpKTtcbiAgICAgICAgICAgIH0pXG4gICAgICAgICAgICAudGhlbih0ZXh0dXJlcyA9PiB7XG4gICAgICAgICAgICAgICAgdGV4dHVyZXMuZm9yRWFjaCh0ID0+IHQucmV0YWluKCkpO1xuICAgICAgICAgICAgICAgIHJldHVybiB0ZXh0dXJlcy5tYXAodCA9PiBbdC5uYW1lLCB0LndpZHRoLCB0LmhlaWdodF0pO1xuICAgICAgICAgICAgfSk7XG4gICAgfSxcblxuICAgIC8vIFNldHVwIGFueSBHTCBzdGF0ZSBmb3IgcmVuZGVyaW5nXG4gICAgc2V0dXAgKCkge1xuICAgICAgICB0aGlzLnNldFVuaWZvcm1zKCk7XG4gICAgICAgIHRoaXMubWF0ZXJpYWwuc2V0dXBQcm9ncmFtKFNoYWRlclByb2dyYW0uY3VycmVudCk7XG4gICAgfSxcblxuICAgIC8vIFNldCBzdHlsZSB1bmlmb3JtcyBvbiBjdXJyZW50bHkgYm91bmQgcHJvZ3JhbVxuICAgIHNldFVuaWZvcm1zICgpIHtcbiAgICAgICAgdmFyIHByb2dyYW0gPSBTaGFkZXJQcm9ncmFtLmN1cnJlbnQ7XG4gICAgICAgIGlmICghcHJvZ3JhbSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgcHJvZ3JhbS5zZXRVbmlmb3Jtcyh0aGlzLnNoYWRlcnMgJiYgdGhpcy5zaGFkZXJzLnVuaWZvcm1zLCB0cnVlKTsgLy8gcmVzZXQgdGV4dHVyZSB1bml0IHRvIDBcbiAgICB9LFxuXG4gICAgLy8gUmVuZGVyIHN0YXRlIHNldHRpbmdzIGJ5IGJsZW5kIG1vZGVcbiAgICByZW5kZXJfc3RhdGVzOiB7XG4gICAgICAgIG9wYXF1ZTogeyBkZXB0aF90ZXN0OiB0cnVlLCBkZXB0aF93cml0ZTogdHJ1ZSB9LFxuICAgICAgICBhZGQ6IHsgZGVwdGhfdGVzdDogdHJ1ZSwgZGVwdGhfd3JpdGU6IGZhbHNlIH0sXG4gICAgICAgIG11bHRpcGx5OiB7IGRlcHRoX3Rlc3Q6IHRydWUsIGRlcHRoX3dyaXRlOiBmYWxzZSB9LFxuICAgICAgICBpbmxheTogeyBkZXB0aF90ZXN0OiB0cnVlLCBkZXB0aF93cml0ZTogZmFsc2UgfSxcbiAgICAgICAgb3ZlcmxheTogeyBkZXB0aF90ZXN0OiBmYWxzZSwgZGVwdGhfd3JpdGU6IGZhbHNlIH1cbiAgICB9LFxuXG4gICAgLy8gRGVmYXVsdCBzb3J0IG9yZGVyIGZvciBibGVuZCBtb2Rlc1xuICAgIGRlZmF1bHRfYmxlbmRfb3JkZXJzOiB7XG4gICAgICAgIG9wYXF1ZTogMCxcbiAgICAgICAgYWRkOiAxLFxuICAgICAgICBtdWx0aXBseTogMixcbiAgICAgICAgaW5sYXk6IDMsXG4gICAgICAgIG92ZXJsYXk6IDRcbiAgICB9LFxuXG4gICAgLy8gQ29tcGFyaXNvbiBmdW5jdGlvbiBmb3Igc29ydGluZyBzdHlsZXMgYnkgYmxlbmRcbiAgICBibGVuZE9yZGVyU29ydCAoYSwgYikge1xuICAgICAgICAvLyBvcGFxdWUgYWx3YXlzIGNvbWVzIGZpcnN0XG4gICAgICAgIGlmIChhLmJsZW5kID09PSAnb3BhcXVlJyB8fCBiLmJsZW5kID09PSAnb3BhcXVlJykge1xuICAgICAgICAgICAgaWYgKGEuYmxlbmQgPT09ICdvcGFxdWUnICYmIGIuYmxlbmQgPT09ICdvcGFxdWUnKSB7IC8vIGlmIGJvdGggYXJlIG9wYXF1ZVxuICAgICAgICAgICAgICAgIHJldHVybiBhLm5hbWUgPCBiLm5hbWUgPyAtMSA6IDE7IC8vIHVzZSBuYW1lIGFzIHRpZSBicmVha2VyXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIGlmIChhLmJsZW5kID09PSAnb3BhcXVlJykge1xuICAgICAgICAgICAgICAgIHJldHVybiAtMTsgLy8gb25seSBgYWAgd2FzIG9wYXF1ZVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIDE7IC8vIG9ubHkgYGJgIHdhcyBvcGFxdWVcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIHVzZSBleHBsaWNpdCBibGVuZCBvcmRlciBpZiBwb3NzaWJsZVxuICAgICAgICBpZiAoYS5ibGVuZF9vcmRlciA8IGIuYmxlbmRfb3JkZXIpIHtcbiAgICAgICAgICAgIHJldHVybiAtMTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChhLmJsZW5kX29yZGVyID4gYi5ibGVuZF9vcmRlcikge1xuICAgICAgICAgICAgcmV0dXJuIDE7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBpZiBibGVuZCBvcmRlcnMgYXJlIGVxdWFsLCB1c2UgZGVmYXVsdCBvcmRlciBieSBibGVuZCBtb2RlXG4gICAgICAgIGlmIChTdHlsZS5kZWZhdWx0X2JsZW5kX29yZGVyc1thLmJsZW5kXSA8IFN0eWxlLmRlZmF1bHRfYmxlbmRfb3JkZXJzW2IuYmxlbmRdKSB7XG4gICAgICAgICAgICByZXR1cm4gLTE7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoU3R5bGUuZGVmYXVsdF9ibGVuZF9vcmRlcnNbYS5ibGVuZF0gPiBTdHlsZS5kZWZhdWx0X2JsZW5kX29yZGVyc1tiLmJsZW5kXSkge1xuICAgICAgICAgICAgcmV0dXJuIDE7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gYS5uYW1lIDwgYi5uYW1lID8gLTEgOiAxOyAvLyB1c2UgbmFtZSBhcyB0aWUgYnJlYWtlclxuICAgIH1cblxufTtcbiIsIi8vIE1hbmFnZSByZW5kZXJpbmcgc3R5bGVzXG5pbXBvcnQgU2hhZGVyUHJvZ3JhbSBmcm9tICcuLi9nbC9zaGFkZXJfcHJvZ3JhbSc7XG5pbXBvcnQgbWVyZ2VPYmplY3RzIGZyb20gJy4uL3V0aWxzL21lcmdlJztcbmltcG9ydCBHZW8gZnJvbSAnLi4vZ2VvJztcbmltcG9ydCBsb2cgZnJvbSAnLi4vdXRpbHMvbG9nJztcblxuaW1wb3J0IHtQb2x5Z29uc30gZnJvbSAnLi9wb2x5Z29ucy9wb2x5Z29ucyc7XG5pbXBvcnQge0xpbmVzfSBmcm9tICcuL2xpbmVzL2xpbmVzJztcbmltcG9ydCB7UG9pbnRzfSBmcm9tICcuL3BvaW50cy9wb2ludHMnO1xuaW1wb3J0IHtUZXh0U3R5bGV9IGZyb20gJy4vdGV4dC90ZXh0JztcbmltcG9ydCB7UmFzdGVyU3R5bGV9IGZyb20gJy4vcmFzdGVyL3Jhc3Rlcic7XG5cbmxldCBmcyA9IHJlcXVpcmUoJ2ZzJyk7XG5jb25zdCBzaGFkZXJTcmNfYWNjZXNzb3JzID0gZnMucmVhZEZpbGVTeW5jKF9fZGlybmFtZSArICcvLi4vZ2wvc2hhZGVycy9hY2Nlc3NvcnMuZ2xzbCcsICd1dGY4Jyk7XG5jb25zdCBzaGFkZXJTcmNfbGF5ZXJPcmRlciA9IGZzLnJlYWRGaWxlU3luYyhfX2Rpcm5hbWUgKyAnLy4uL2dsL3NoYWRlcnMvbGF5ZXJfb3JkZXIuZ2xzbCcsICd1dGY4Jyk7XG5jb25zdCBzaGFkZXJTcmNfc2VsZWN0aW9uR2xvYmFscyA9IGZzLnJlYWRGaWxlU3luYyhfX2Rpcm5hbWUgKyAnLy4uL2dsL3NoYWRlcnMvc2VsZWN0aW9uX2dsb2JhbHMuZ2xzbCcsICd1dGY4Jyk7XG5jb25zdCBzaGFkZXJTcmNfc2VsZWN0aW9uVmVydGV4ID0gZnMucmVhZEZpbGVTeW5jKF9fZGlybmFtZSArICcvLi4vZ2wvc2hhZGVycy9zZWxlY3Rpb25fdmVydGV4Lmdsc2wnLCAndXRmOCcpO1xuXG5leHBvcnQgY2xhc3MgU3R5bGVNYW5hZ2VyIHtcblxuICAgIGNvbnN0cnVjdG9yICgpIHtcbiAgICAgICAgdGhpcy5zdHlsZXMgPSB7fTtcbiAgICAgICAgdGhpcy5iYXNlX3N0eWxlcyA9IHt9O1xuXG4gICAgICAgIC8vIEFkZCBidWlsdC1pbiByZW5kZXJpbmcgc3R5bGVzXG4gICAgICAgIHRoaXMucmVnaXN0ZXIoT2JqZWN0LmNyZWF0ZShQb2x5Z29ucykpO1xuICAgICAgICB0aGlzLnJlZ2lzdGVyKE9iamVjdC5jcmVhdGUoTGluZXMpKTtcbiAgICAgICAgdGhpcy5yZWdpc3RlcihPYmplY3QuY3JlYXRlKFBvaW50cykpO1xuICAgICAgICB0aGlzLnJlZ2lzdGVyKE9iamVjdC5jcmVhdGUoVGV4dFN0eWxlKSk7XG4gICAgICAgIHRoaXMucmVnaXN0ZXIoT2JqZWN0LmNyZWF0ZShSYXN0ZXJTdHlsZSkpO1xuICAgIH1cblxuICAgIC8vIEdsb2JhbCBjb25maWd1cmF0aW9uIGZvciBhbGwgc3R5bGVzXG4gICAgaW5pdCAoKSB7XG4gICAgICAgIFNoYWRlclByb2dyYW0ucmVtb3ZlQmxvY2soJ2dsb2JhbCcpO1xuICAgICAgICBTaGFkZXJQcm9ncmFtLnJlbW92ZUJsb2NrKCdzZXR1cCcpO1xuXG4gICAgICAgIC8vIE1vZGVsIGFuZCB3b3JsZCBwb3NpdGlvbiBhY2Nlc3NvcnNcbiAgICAgICAgU2hhZGVyUHJvZ3JhbS5hZGRCbG9jaygnZ2xvYmFsJywgc2hhZGVyU3JjX2FjY2Vzc29ycyk7XG5cbiAgICAgICAgLy8gTGF5ZXIgcmUtb3JkZXJpbmcgZnVuY3Rpb25cbiAgICAgICAgU2hhZGVyUHJvZ3JhbS5hZGRCbG9jaygnZ2xvYmFsJywgc2hhZGVyU3JjX2xheWVyT3JkZXIpO1xuXG4gICAgICAgIC8vIEZlYXR1cmUgc2VsZWN0aW9uIGdsb2JhbFxuICAgICAgICBTaGFkZXJQcm9ncmFtLmFkZEJsb2NrKCdnbG9iYWwnLCBzaGFkZXJTcmNfc2VsZWN0aW9uR2xvYmFscyk7XG5cbiAgICAgICAgLy8gRmVhdHVyZSBzZWxlY3Rpb24gdmVydGV4IHNoYWRlciBzdXBwb3J0XG4gICAgICAgIFNoYWRlclByb2dyYW0ucmVwbGFjZUJsb2NrKCdzZXR1cCcsIHNoYWRlclNyY19zZWxlY3Rpb25WZXJ0ZXgpO1xuXG4gICAgICAgIC8vIE1pbmltdW0gdmFsdWUgZm9yIGZsb2F0IGNvbXBhcmlzb25zXG4gICAgICAgIFNoYWRlclByb2dyYW0uZGVmaW5lcy5UQU5HUkFNX0VQU0lMT04gPSAwLjAwMDAxO1xuXG4gICAgICAgIC8vIE1pbmltdW0gZGVwdGggYnVmZmVyIHZhbHVlIHNlcGFyYXRpbmcgZWFjaCBgb3JkZXJgIHVuaXRcbiAgICAgICAgLy8gQXNzdW1lIG1pbiAxNi1iaXQgZGVwdGggYnVmZmVyLCBpbiBwcmFjdGljZSB1c2VzIDE0LWJpdHMsIDEgZXh0cmEgYml0IHRvIGhhbmRsZSB2aXJ0dWFsIGhhbGYtbGF5ZXJzXG4gICAgICAgIC8vIGZvciBvdXRsaW5lcyAoaW5zZXJ0ZWQgaW4gYmV0d2VlbiBsYXllcnMpLCBhbm90aGVyIGV4dHJhIGJpdCB0byBwcmV2ZW50IHByZWNpc2lvbiBsb3NzXG4gICAgICAgIFNoYWRlclByb2dyYW0uZGVmaW5lcy5UQU5HUkFNX0xBWUVSX0RFTFRBID0gMSAvICgxIDw8IDE0KTtcblxuICAgICAgICAvLyBJbnRlcm5hbCB0aWxlIHNjYWxlXG4gICAgICAgIFNoYWRlclByb2dyYW0uZGVmaW5lcy5UQU5HUkFNX1RJTEVfU0NBTEUgPVxuICAgICAgICAgICAgYHZlYzMoJHtHZW8udGlsZV9zY2FsZX0uLCAke0dlby50aWxlX3NjYWxlfS4sIHVfbWV0ZXJzX3Blcl9waXhlbCAqICR7R2VvLnRpbGVfc2l6ZX0uKWA7XG5cbiAgICAgICAgLy8gSW5jcmVhc2VzIHByZWNpc2lvbiBmb3IgaGVpZ2h0IHZhbHVlc1xuICAgICAgICBTaGFkZXJQcm9ncmFtLmRlZmluZXMuVEFOR1JBTV9IRUlHSFRfU0NBTEUgPSBHZW8uaGVpZ2h0X3NjYWxlO1xuICAgIH1cblxuICAgIC8vIERlc3Ryb3kgYWxsIHN0eWxlcyBmb3IgYSBnaXZlbiBHTCBjb250ZXh0XG4gICAgZGVzdHJveSAoZ2wpIHtcbiAgICAgICAgT2JqZWN0LmtleXModGhpcy5zdHlsZXMpLmZvckVhY2goKF9uYW1lKSA9PiB7XG4gICAgICAgICAgICBsZXQgc3R5bGUgPSB0aGlzLnN0eWxlc1tfbmFtZV07XG4gICAgICAgICAgICBpZiAoc3R5bGUuZ2wgPT09IGdsKSB7XG4gICAgICAgICAgICAgICAgbG9nKCd0cmFjZScsIGBTdHlsZU1hbmFnZXIuZGVzdHJveTogZGVzdHJveWluZyByZW5kZXIgc3R5bGUgJHtzdHlsZS5uYW1lfWApO1xuXG4gICAgICAgICAgICAgICAgaWYgKHN0eWxlLmJhc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5yZW1vdmUoc3R5bGUubmFtZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHN0eWxlLmRlc3Ryb3koKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gUmVnaXN0ZXIgYSBzdHlsZVxuICAgIHJlZ2lzdGVyIChzdHlsZSkge1xuICAgICAgICB0aGlzLnN0eWxlc1tzdHlsZS5uYW1lXSA9IHN0eWxlO1xuICAgICAgICB0aGlzLmJhc2Vfc3R5bGVzW3N0eWxlLm5hbWVdID0gc3R5bGU7XG4gICAgfVxuXG4gICAgLy8gUmVtb3ZlIGEgc3R5bGVcbiAgICByZW1vdmUgKG5hbWUpIHtcbiAgICAgICAgZGVsZXRlIHRoaXMuc3R5bGVzW25hbWVdO1xuICAgIH1cblxuICAgIG1peCAoc3R5bGUsIHN0eWxlcykge1xuICAgICAgICAvLyBFeGl0IGVhcmx5IGlmIHdlIGhhdmUgYWxyZWFkeSBhcHBsaWVkIG1peGlucyB0byB0aGlzIHN0eWxlXG4gICAgICAgIGlmIChzdHlsZS5taXhlZCkge1xuICAgICAgICAgICAgcmV0dXJuIHN0eWxlO1xuICAgICAgICB9XG4gICAgICAgIHN0eWxlLm1peGVkID0ge307XG5cbiAgICAgICAgLy8gTWl4aW4gc291cmNlcywgaW4gb3JkZXJcbiAgICAgICAgbGV0IHNvdXJjZXMgPSBbXTtcbiAgICAgICAgaWYgKHN0eWxlLm1peCkge1xuICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoc3R5bGUubWl4KSkge1xuICAgICAgICAgICAgICAgIHNvdXJjZXMucHVzaCguLi5zdHlsZS5taXgpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgc291cmNlcy5wdXNoKHN0eWxlLm1peCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBzb3VyY2VzID0gc291cmNlcy5tYXAoeCA9PiBzdHlsZXNbeF0pLmZpbHRlcih4ID0+IHggJiYgeCAhPT0gc3R5bGUpOyAvLyBUT0RPOiB3YXJuaW5nIG9uIHRyeWluZyB0byBtaXggaW50byBzZWxmXG5cbiAgICAgICAgICAgIC8vIFRyYWNrIHdoaWNoIHN0eWxlcyB3ZXJlIG1peGVkIGludG8gdGhpcyBvbmVcbiAgICAgICAgICAgIHNvdXJjZXMuZm9yRWFjaChzID0+IHN0eWxlLm1peGVkW3MubmFtZV0gPSB0cnVlKTtcbiAgICAgICAgfVxuICAgICAgICBzb3VyY2VzLnB1c2goc3R5bGUpO1xuXG4gICAgICAgIC8vIEZsYWdzIC0gT1InZCwgdHJ1ZSBpZiBhbnkgc3R5bGUgaGFzIGl0IHNldFxuICAgICAgICBzdHlsZS5hbmltYXRlZCA9IHNvdXJjZXMuc29tZSh4ID0+IHggJiYgeC5hbmltYXRlZCk7XG4gICAgICAgIHN0eWxlLnRleGNvb3JkcyA9IHNvdXJjZXMuc29tZSh4ID0+IHggJiYgeC50ZXhjb29yZHMpO1xuXG4gICAgICAgIC8vIE92ZXJ3cml0ZXMgLSBsYXN0IGRlZmluaXRpb24gd2luc1xuICAgICAgICBzdHlsZS5iYXNlID0gc291cmNlcy5tYXAoeCA9PiB4LmJhc2UpLmZpbHRlcih4ID0+IHgpLnBvcCgpO1xuICAgICAgICBzdHlsZS5saWdodGluZyA9IHNvdXJjZXMubWFwKHggPT4geC5saWdodGluZykuZmlsdGVyKHggPT4geCAhPSBudWxsKS5wb3AoKTtcbiAgICAgICAgc3R5bGUudGV4dHVyZSA9IHNvdXJjZXMubWFwKHggPT4geC50ZXh0dXJlKS5maWx0ZXIoeCA9PiB4KS5wb3AoKTtcbiAgICAgICAgc3R5bGUucmFzdGVyID0gc291cmNlcy5tYXAoeCA9PiB4LnJhc3RlcikuZmlsdGVyKHggPT4geCAhPSBudWxsKS5wb3AoKTtcbiAgICAgICAgc3R5bGUuZGFzaCA9IHNvdXJjZXMubWFwKHggPT4geC5kYXNoKS5maWx0ZXIoeCA9PiB4ICE9IG51bGwpLnBvcCgpO1xuICAgICAgICBzdHlsZS5kYXNoX2JhY2tncm91bmRfY29sb3IgPSBzb3VyY2VzLm1hcCh4ID0+IHguZGFzaF9iYWNrZ3JvdW5kX2NvbG9yKS5maWx0ZXIoeCA9PiB4ICE9IG51bGwpLnBvcCgpO1xuICAgICAgICBpZiAoc291cmNlcy5zb21lKHggPT4geC5oYXNPd25Qcm9wZXJ0eSgnYmxlbmQnKSAmJiB4LmJsZW5kKSkge1xuICAgICAgICAgICAgLy8gb25seSBtaXggYmxlbmQgaWYgZXhwbGljaXRseSBzZXQsIG90aGVyd2lzZSBsZXQgYmFzZSBzdHlsZSBjaG9vc2UgYmxlbmRpbmcgbW9kZVxuICAgICAgICAgICAgLy8gaGFzT3duUHJvcGVydHkgY2hlY2sgZ2l2ZXMgcHJlZmVyZW5jZSB0byBiYXNlIHN0eWxlIHByb3RvdHlwZVxuICAgICAgICAgICAgc3R5bGUuYmxlbmQgPSBzb3VyY2VzLm1hcCh4ID0+IHguaGFzT3duUHJvcGVydHkoJ2JsZW5kJykgJiYgeC5ibGVuZCkuZmlsdGVyKHggPT4geCkucG9wKCk7XG4gICAgICAgIH1cbiAgICAgICAgc3R5bGUuYmxlbmRfb3JkZXIgPSBzb3VyY2VzLm1hcCh4ID0+IHguYmxlbmRfb3JkZXIpLmZpbHRlcih4ID0+IHggIT0gbnVsbCkucG9wKCk7XG5cbiAgICAgICAgLy8gTWVyZ2VzIC0gcHJvcGVydHktc3BlY2lmaWMgcnVsZXMgZm9yIG1lcmdpbmcgdmFsdWVzXG4gICAgICAgIHN0eWxlLmRlZmluZXMgPSBPYmplY3QuYXNzaWduKHt9LCAuLi5zb3VyY2VzLm1hcCh4ID0+IHguZGVmaW5lcykuZmlsdGVyKHggPT4geCkpOyAvLyBpbnRlcm5hbCBkZWZpbmVzIChub3QgdXNlci1kZWZpbmVkKVxuICAgICAgICBzdHlsZS5tYXRlcmlhbCA9IE9iamVjdC5hc3NpZ24oe30sIC4uLnNvdXJjZXMubWFwKHggPT4geC5tYXRlcmlhbCkuZmlsdGVyKHggPT4geCkpO1xuXG4gICAgICAgIC8vIE1peCBzaGFkZXIgcHJvcGVydGllc1xuICAgICAgICB0aGlzLm1peFNoYWRlcnMoc3R5bGUsIHN0eWxlcywgc291cmNlcyk7XG4gICAgICAgIHJldHVybiBzdHlsZTtcbiAgICB9XG5cbiAgICAvLyBNaXggdGhlIHByb3BlcnRlcyBpbiB0aGUgXCJzaGFkZXJzXCIgYmxvY2tcbiAgICBtaXhTaGFkZXJzIChzdHlsZSwgc3R5bGVzLCBzb3VyY2VzKSB7XG4gICAgICAgIGxldCBzaGFkZXJzID0ge307IC8vIG5ld2x5IG1peGVkIHNoYWRlcnMgcHJvcGVydGllc1xuICAgICAgICBsZXQgc2hhZGVyX21lcmdlcyA9IHNvdXJjZXMubWFwKHggPT4geC5zaGFkZXJzKS5maWx0ZXIoeCA9PiB4KTsgLy8ganVzdCB0aGUgc291cmNlIHN0eWxlcyB3aXRoIHNoYWRlciBwcm9wZXJ0aWVzXG5cbiAgICAgICAgLy8gRGVmaW5lc1xuICAgICAgICBzaGFkZXJzLmRlZmluZXMgPSBPYmplY3QuYXNzaWduKHt9LCAuLi5zaGFkZXJfbWVyZ2VzLm1hcCh4ID0+IHguZGVmaW5lcykuZmlsdGVyKHggPT4geCkpO1xuXG4gICAgICAgIC8vIFVuaWZvcm1zXG4gICAgICAgIHNoYWRlcnMudW5pZm9ybXMgPSB7fTsgIC8vIHVuaWZvcm1zIGZvciB0aGlzIHN0eWxlLCBib3RoIGV4cGxpY2l0bHkgZGVmaW5lZCwgYW5kIG1peGVkIGZyb20gb3RoZXIgc3R5bGVzXG4gICAgICAgIHNoYWRlcnMuX3VuaWZvcm1zID0gKHN0eWxlLnNoYWRlcnMgJiYgc3R5bGUuc2hhZGVycy51bmlmb3JtcykgfHwge307IC8vIHVuaWZvcm1zIGV4cGxpY2l0bHkgZGVmaW5lZCBieSAqdGhpcyogc3R5bGVcbiAgICAgICAgc2hhZGVycy5fdW5pZm9ybV9zY29wZXMgPSB7fTsgLy8gdHJhY2tzIHdoaWNoIHN0eWxlIGVhY2ggdW5pZm9ybSBvcmlnaW5hdGVkIGZyb20gKHRoaXMgb25lLCBvciBhbmNlc3RvcilcblxuICAgICAgICAvLyBNaXggaW4gdW5pZm9ybXMgZnJvbSBhbmNlc3RvcnMsIHByb3ZpZGluZyBtZWFucyB0byBhY2Nlc3NcbiAgICAgICAgc291cmNlc1xuICAgICAgICAgICAgLmZpbHRlcih4ID0+IHguc2hhZGVycyAmJiB4LnNoYWRlcnMudW5pZm9ybXMpXG4gICAgICAgICAgICAuZm9yRWFjaCh4ID0+IHtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCB1IGluIHguc2hhZGVycy51bmlmb3Jtcykge1xuICAgICAgICAgICAgICAgICAgICBzaGFkZXJzLl91bmlmb3JtX3Njb3Blc1t1XSA9IHgubmFtZTtcblxuICAgICAgICAgICAgICAgICAgICAvLyBEZWZpbmUgZ2V0dGVyIGFuZCBzZXR0ZXIgZm9yIHRoaXMgdW5pZm9ybVxuICAgICAgICAgICAgICAgICAgICAvLyBHZXR0ZXIgcmV0dXJucyB2YWx1ZSBmb3IgdGhpcyBzdHlsZSBpZiBwcmVzZW50LCBvdGhlcndpc2UgYXNrcyBhcHByb3ByaWF0ZSBhbmNlc3RvciBmb3IgaXRcbiAgICAgICAgICAgICAgICAgICAgLy8gU2V0dGVyIHNldHMgdGhlIHZhbHVlIGZvciB0aGlzIHN0eWxlICh3aGV0aGVyIHByZXZpb3VzbHkgcHJlc2VudCBpbiB0aGlzIHN0eWxlIG9yIG5vdClcbiAgICAgICAgICAgICAgICAgICAgLy8gTWltaWNzIEpTIHByb3RvdHlwZS9oYXNPd25Qcm9wZXJ0eSBiZWhhdmlvciwgYnV0IHdpdGggbXVsdGlwbGUgYW5jZXN0b3JzICh2aWEgbWl4aW5zKVxuICAgICAgICAgICAgICAgICAgICBPYmplY3QuZGVmaW5lUHJvcGVydHkoc2hhZGVycy51bmlmb3JtcywgdSwge1xuICAgICAgICAgICAgICAgICAgICAgICAgZW51bWVyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZpZ3VyYWJsZTogdHJ1ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGdldDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFVuaWZvcm0gaXMgZXhwbGljaXRseSBkZWZpbmVkIG9uIHRoaXMgc3R5bGVcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoc2hhZGVycy5fdW5pZm9ybXNbdV0gIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc2hhZGVycy5fdW5pZm9ybXNbdV07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFVuaWZvcm0gd2FzIG1peGVkIGZyb20gYW5vdGhlciBzdHlsZSwgZm9yd2FyZCByZXF1ZXN0IHRoZXJlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSWRlbnRpZnkgY2hlY2sgaXMgbmVlZGVkIHRvIHByZXZlbnQgaW5maW5pdGUgcmVjdXJzaW9uIGlmIGEgcHJldmlvdXNseSBkZWZpbmVkIHVuaWZvcm1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpcyBzZXQgdG8gdW5kZWZpbmVkXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoc3R5bGVzW3NoYWRlcnMuX3VuaWZvcm1fc2NvcGVzW3VdXS5zaGFkZXJzLnVuaWZvcm1zICE9PSBzaGFkZXJzLnVuaWZvcm1zKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBzdHlsZXNbc2hhZGVycy5fdW5pZm9ybV9zY29wZXNbdV1dLnNoYWRlcnMudW5pZm9ybXNbdV07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHNldDogZnVuY3Rpb24gKHYpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaGFkZXJzLl91bmlmb3Jtc1t1XSA9IHY7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgIC8vIEV4dGVuc2lvbnM6IGJ1aWxkIGEgbGlzdCBvZiB1bmlxdWUgZXh0ZW5zaW9uc1xuICAgICAgICBzaGFkZXJzLmV4dGVuc2lvbnMgPSBPYmplY3Qua2V5cyhzaGFkZXJfbWVyZ2VzXG4gICAgICAgICAgICAubWFwKHggPT4geC5leHRlbnNpb25zKVxuICAgICAgICAgICAgLmZpbHRlcih4ID0+IHgpXG4gICAgICAgICAgICAucmVkdWNlKChwcmV2LCBjdXIpID0+IHtcbiAgICAgICAgICAgICAgICAvLyBzaW5nbGUgZXh0ZW5zaW9uXG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBjdXIgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgICAgIHByZXZbY3VyXSA9IHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIGFycmF5IG9mIGV4dGVuc2lvbnNcbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgY3VyLmZvckVhY2goeCA9PiBwcmV2W3hdID0gdHJ1ZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIHJldHVybiBwcmV2O1xuICAgICAgICAgICAgfSwge30pIHx8IHt9XG4gICAgICAgICk7XG5cbiAgICAgICAgLy8gU2hhZGVyIGJsb2Nrc1xuICAgICAgICAvLyBNYXJrIGFsbCBzaGFkZXIgYmxvY2tzIGZvciB0aGUgdGFyZ2V0IHN0eWxlIGFzIG9yaWdpbmF0aW5nIHdpdGggaXRzIG93biBuYW1lXG4gICAgICAgIGlmIChzdHlsZS5zaGFkZXJzICYmIHN0eWxlLnNoYWRlcnMuYmxvY2tzKSB7XG4gICAgICAgICAgICBzdHlsZS5zaGFkZXJzLmJsb2NrX3Njb3BlcyA9IHN0eWxlLnNoYWRlcnMuYmxvY2tfc2NvcGVzIHx8IHt9O1xuICAgICAgICAgICAgZm9yIChsZXQgayBpbiBzdHlsZS5zaGFkZXJzLmJsb2Nrcykge1xuICAgICAgICAgICAgICAgIGxldCBibG9jayA9IHN0eWxlLnNoYWRlcnMuYmxvY2tzW2tdO1xuICAgICAgICAgICAgICAgIHN0eWxlLnNoYWRlcnMuYmxvY2tfc2NvcGVzW2tdID0gc3R5bGUuc2hhZGVycy5ibG9ja19zY29wZXNba10gfHwgW107XG4gICAgICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoYmxvY2spKSB7XG4gICAgICAgICAgICAgICAgICAgIHN0eWxlLnNoYWRlcnMuYmxvY2tfc2NvcGVzW2tdLnB1c2goLi4uYmxvY2subWFwKCgpID0+IHN0eWxlLm5hbWUpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHN0eWxlLnNoYWRlcnMuYmxvY2tfc2NvcGVzW2tdLnB1c2goc3R5bGUubmFtZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgLy8gTWVyZ2Ugc2hhZGVyIGJsb2Nrcywga2VlcGluZyB0cmFjayBvZiB3aGljaCBzdHlsZSBlYWNoIGJsb2NrIG9yaWdpbmF0ZWQgZnJvbVxuICAgICAgICBsZXQgbWl4ZWQgPSB7fTsgLy8gYWxsIHNjb3BlcyBtaXhlZCBzbyBmYXJcbiAgICAgICAgc2hhZGVyX21lcmdlcy5mb3JFYWNoKHNvdXJjZSA9PiB7XG4gICAgICAgICAgICBpZiAoIXNvdXJjZS5ibG9ja3MpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHNoYWRlcnMuYmxvY2tzID0gc2hhZGVycy5ibG9ja3MgfHwge307XG4gICAgICAgICAgICBzaGFkZXJzLmJsb2NrX3Njb3BlcyA9IHNoYWRlcnMuYmxvY2tfc2NvcGVzIHx8IHt9O1xuICAgICAgICAgICAgbGV0IG1peGVkX3NvdXJjZSA9IHt9OyAvLyBzY29wZXMgbWl4ZWQgZm9yIHRoaXMgc291cmNlIHN0eWxlXG5cbiAgICAgICAgICAgIGZvciAobGV0IHQgaW4gc291cmNlLmJsb2Nrcykge1xuICAgICAgICAgICAgICAgIGxldCBibG9jayA9IHNvdXJjZS5ibG9ja3NbdF07XG4gICAgICAgICAgICAgICAgbGV0IGJsb2NrX3Njb3BlID0gc291cmNlLmJsb2NrX3Njb3Blc1t0XTtcblxuICAgICAgICAgICAgICAgIHNoYWRlcnMuYmxvY2tzW3RdID0gc2hhZGVycy5ibG9ja3NbdF0gfHwgW107XG4gICAgICAgICAgICAgICAgc2hhZGVycy5ibG9ja19zY29wZXNbdF0gPSBzaGFkZXJzLmJsb2NrX3Njb3Blc1t0XSB8fCBbXTtcblxuICAgICAgICAgICAgICAgIC8vIHN0YW5kYXJkaXplIG9uIGFycmF5cyAoYmxvY2sgY2FuIGJlIHNpbmdsZSBvciBtdWx0aS12YWx1ZSlcbiAgICAgICAgICAgICAgICBibG9jayA9IEFycmF5LmlzQXJyYXkoYmxvY2spID8gYmxvY2sgOiBbYmxvY2tdO1xuICAgICAgICAgICAgICAgIGJsb2NrX3Njb3BlID0gQXJyYXkuaXNBcnJheShibG9ja19zY29wZSkgPyBibG9ja19zY29wZSA6IFtibG9ja19zY29wZV07XG5cbiAgICAgICAgICAgICAgICBmb3IgKGxldCBiPTA7IGIgPCBibG9jay5sZW5ndGg7IGIrKykge1xuICAgICAgICAgICAgICAgICAgICAvLyBTa2lwIGJsb2NrcyB3ZSd2ZSBhbHJlYWR5IG1peGVkIGluIGZyb20gdGhlIHNhbWUgc2NvcGVcbiAgICAgICAgICAgICAgICAgICAgLy8gUmVwZWF0aW5nIHNjb3BlIGluZGljYXRlcyBhIGRpYW1vbmQgcGF0dGVybiB3aGVyZSBhIHN0eWxlIGlzIGJlaW5nIG1peGVkIG11bHRpcGxlIHRpbWVzXG4gICAgICAgICAgICAgICAgICAgIGlmIChtaXhlZFtibG9ja19zY29wZVtiXV0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIG1peGVkX3NvdXJjZVtibG9ja19zY29wZVtiXV0gPSB0cnVlO1xuXG4gICAgICAgICAgICAgICAgICAgIHNoYWRlcnMuYmxvY2tzW3RdLnB1c2goYmxvY2tbYl0pO1xuICAgICAgICAgICAgICAgICAgICBzaGFkZXJzLmJsb2NrX3Njb3Blc1t0XS5wdXNoKGJsb2NrX3Njb3BlW2JdKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIEFkZCBzdHlsZXMgbWl4ZWQgaW4gZnJvbSB0aGlzIHNvdXJjZSAtIHRoZXkgY291bGQgYmUgbXVsdGktbGV2ZWwgYW5jZXN0b3JzLFxuICAgICAgICAgICAgLy8gYmV5b25kIHRoZSBmaXJzdC1sZXZlbCBcInBhcmVudHNcIiBkZWZpbmVkIGluIHRoaXMgc3R5bGUncyBgbWl4YCBsaXN0XG4gICAgICAgICAgICBPYmplY3QuYXNzaWduKG1peGVkLCBtaXhlZF9zb3VyY2UpO1xuICAgICAgICB9KTtcblxuICAgICAgICBPYmplY3QuYXNzaWduKHN0eWxlLm1peGVkLCBtaXhlZCk7IC8vIGFkZCBhbGwgbmV3bHkgbWl4ZWQgc3R5bGVzXG5cbiAgICAgICAgc3R5bGUuc2hhZGVycyA9IHNoYWRlcnM7IC8vIGFzc2lnbiBiYWNrIHRvIHN0eWxlXG4gICAgICAgIHJldHVybiBzdHlsZTtcbiAgICB9XG5cbiAgICAvLyBDcmVhdGUgYSBuZXcgc3R5bGVcbiAgICAvLyBuYW1lOiBuYW1lIG9mIG5ldyBzdHlsZVxuICAgIC8vIGNvbmZpZzogcHJvcGVydGllcyBvZiBuZXcgc3R5bGVcbiAgICAvLyBzdHlsZXM6IHdvcmtpbmcgc2V0IG9mIHN0eWxlcyBiZWluZyBidWlsdCAodXNlZCBmb3IgbWl4aW5nIGluIGV4aXN0aW5nIHN0eWxlcylcbiAgICBjcmVhdGUgKG5hbWUsIGNvbmZpZywgc3R5bGVzID0ge30pIHtcbiAgICAgICAgbGV0IHN0eWxlID0gbWVyZ2VPYmplY3RzKHt9LCBjb25maWcpOyAvLyBkZWVwIGNvcHlcbiAgICAgICAgc3R5bGUubmFtZSA9IG5hbWU7XG5cbiAgICAgICAgLy8gU3R5bGUgbWl4aW5zXG4gICAgICAgIHN0eWxlID0gdGhpcy5taXgoc3R5bGUsIHN0eWxlcyk7XG5cbiAgICAgICAgLy8gSGFzIGJhc2Ugc3R5bGU/XG4gICAgICAgIC8vIE9ubHkgcmVuZGVyYWJsZSAoaW5zdGFudGlhdGVkKSBzdHlsZXMgc2hvdWxkIGJlIGluY2x1ZGVkIGZvciBydW4tdGltZSB1c2VcbiAgICAgICAgLy8gT3RoZXJzIGFyZSBpbnRlcm1lZGlhcnkvYWJzdHJhY3QsIHVzZWQgZHVyaW5nIHN0eWxlIGNvbXBvc2l0aW9uIGJ1dCBub3QgZXhlY3V0aW9uXG4gICAgICAgIGlmIChzdHlsZS5iYXNlICYmIHRoaXMuYmFzZV9zdHlsZXNbc3R5bGUuYmFzZV0pIHtcbiAgICAgICAgICAgIHRoaXMuc3R5bGVzW25hbWVdID0gc3R5bGUgPSBPYmplY3QuYXNzaWduKE9iamVjdC5jcmVhdGUodGhpcy5iYXNlX3N0eWxlc1tzdHlsZS5iYXNlXSksIHN0eWxlKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHN0eWxlLmJhc2UgPSBudWxsOyAvLyBudWxsIG91dCBpbnZhbGlkIGJhc2Ugc3R5bGVcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBzdHlsZTtcbiAgICB9XG5cbiAgICAvLyBDYWxsZWQgdG8gY3JlYXRlIGFuZCBpbml0aWFsaXplIHN0eWxlc1xuICAgIGJ1aWxkIChzdHlsZXMpIHtcbiAgICAgICAgLy8gU29ydCBzdHlsZXMgYnkgZGVwZW5kZW5jeSwgdGhlbiBidWlsZCB0aGVtXG4gICAgICAgIGxldCBzdHlsZV9kZXBzID0gT2JqZWN0LmtleXMoc3R5bGVzKS5zb3J0KFxuICAgICAgICAgICAgKGEsIGIpID0+IHRoaXMuaW5oZXJpdGFuY2VEZXB0aChhLCBzdHlsZXMpIC0gdGhpcy5pbmhlcml0YW5jZURlcHRoKGIsIHN0eWxlcylcbiAgICAgICAgKTtcblxuICAgICAgICAvLyBPbmx5IGtlZXAgYnVpbHQtaW4gYmFzZSBzdHlsZXNcbiAgICAgICAgZm9yIChsZXQgc25hbWUgaW4gdGhpcy5zdHlsZXMpIHtcbiAgICAgICAgICAgIGlmICghdGhpcy5iYXNlX3N0eWxlc1tzbmFtZV0pIHtcbiAgICAgICAgICAgICAgICBkZWxldGUgdGhpcy5zdHlsZXNbc25hbWVdO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zdHlsZXNbc25hbWVdLnJlc2V0KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBXb3JraW5nIHNldCBvZiBzdHlsZXMgYmVpbmcgYnVpbHRcbiAgICAgICAgbGV0IHdzID0ge307XG4gICAgICAgIHN0eWxlX2RlcHMuZm9yRWFjaChzbmFtZSA9PiB7XG4gICAgICAgICAgICB3c1tzbmFtZV0gPSB0aGlzLmNyZWF0ZShzbmFtZSwgc3R5bGVzW3NuYW1lXSwgd3MpO1xuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gdGhpcy5zdHlsZXM7XG4gICAgfVxuXG4gICAgLy8gSW5pdGlhbGl6ZSBhbGwgc3R5bGVzXG4gICAgaW5pdFN0eWxlcyAoc2NlbmUgPSB7fSkge1xuICAgICAgICAvLyBJbml0aWFsaXplIGFsbFxuICAgICAgICBmb3IgKGxldCBzbmFtZSBpbiB0aGlzLnN0eWxlcykge1xuICAgICAgICAgICAgdGhpcy5zdHlsZXNbc25hbWVdLmluaXQoc2NlbmUpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gR2l2ZW4gYSBzdHlsZSBrZXkgaW4gYSBzZXQgb2Ygc3R5bGVzIHRvIGFkZCwgY291bnQgdGhlIGxlbmd0aCBvZiB0aGUgaW5oZXJpdGFuY2UgY2hhaW5cbiAgICBpbmhlcml0YW5jZURlcHRoIChrZXksIHN0eWxlcykge1xuICAgICAgICBsZXQgcGFyZW50cyA9IDA7XG5cbiAgICAgICAgd2hpbGUodHJ1ZSkge1xuICAgICAgICAgICAgbGV0IHN0eWxlID0gc3R5bGVzW2tleV07XG4gICAgICAgICAgICBpZiAoIXN0eWxlKSB7XG4gICAgICAgICAgICAgICAgLy8gdGhpcyBpcyBhIHNjZW5lIGRlZiBlcnJvciwgdHJ5aW5nIHRvIGV4dGVuZCBhIHN0eWxlIHRoYXQgZG9lc24ndCBleGlzdFxuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBEZXBlbmRlbmN5IGNoYWluIGVuZHMgd2hlbiB0aGlzIHN0eWxlIGlzbid0IG1peGluZyBpbiBhbnkgb3RoZXJzXG4gICAgICAgICAgICBpZiAoIXN0eWxlLm1peCkge1xuICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBUcmF2ZXJzZSBuZXh0IHBhcmVudCBzdHlsZVxuICAgICAgICAgICAgcGFyZW50cysrO1xuXG4gICAgICAgICAgICBpZiAoQXJyYXkuaXNBcnJheShzdHlsZS5taXgpKSB7XG4gICAgICAgICAgICAgICAgLy8gSWYgbXVsdGlwbGUgbWl4aW5zLCBmaW5kIHRoZSBkZWVwZXN0IG9uZVxuICAgICAgICAgICAgICAgIHBhcmVudHMgKz0gTWF0aC5tYXgoLi4uc3R5bGUubWl4Lm1hcChzID0+IHtcbiAgICAgICAgICAgICAgICAgICAgLy8gVHJ5aW5nIHRvIG1peCBpbnRvIGl0c2VsZiFcbiAgICAgICAgICAgICAgICAgICAgaWYgKGtleSA9PT0gcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRoaXMuaW5oZXJpdGFuY2VEZXB0aChzLCBzdHlsZXMpO1xuICAgICAgICAgICAgICAgIH0pKTtcbiAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIFRyeWluZyB0byBtaXggaW50byBpdHNlbGYhXG4gICAgICAgICAgICAgICAgaWYgKGtleSA9PT0gc3R5bGUubWl4KSB7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIElmIHNpbmdsZSBtaXhpbiwgY29udGludWUgbG9vcCB1cCB0aGUgdHJlZVxuICAgICAgICAgICAgICAgIGtleSA9IHN0eWxlLm1peDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gcGFyZW50cztcbiAgICB9XG5cbn1cbiIsImltcG9ydCBVdGlscyBmcm9tICcuLi91dGlscy91dGlscyc7XG5pbXBvcnQgR2VvIGZyb20gJy4uL2dlbyc7XG5cbmltcG9ydCBwYXJzZUNTU0NvbG9yIGZyb20gJ2Nzc2NvbG9ycGFyc2VyJztcblxuZXhwb3J0IHZhciBTdHlsZVBhcnNlciA9IHt9O1xuXG4vLyBXcmFwcyBzdHlsZSBmdW5jdGlvbnMgYW5kIHByb3ZpZGVzIGEgc2NvcGUgb2YgY29tbW9ubHkgYWNjZXNzaWJsZSBkYXRhOlxuLy8gLSBmZWF0dXJlOiB0aGUgJ3Byb3BlcnRpZXMnIG9mIHRoZSBmZWF0dXJlLCBlLmcuIGFjY2Vzc2VkIGFzICdmZWF0dXJlLm5hbWUnXG4vLyAtIGdsb2JhbDogdXNlci1kZWZpbmVkIHByb3BlcnRpZXMgb24gdGhlIGBnbG9iYWxgIG9iamVjdCBpbiB0aGUgc2NlbmUgZmlsZVxuLy8gLSAkem9vbTogdGhlIGN1cnJlbnQgbWFwIHpvb20gbGV2ZWxcbi8vIC0gJGdlb21ldHJ5OiB0aGUgdHlwZSBvZiBnZW9tZXRyeSwgJ3BvaW50JywgJ2xpbmUnLCBvciAncG9seWdvbidcbi8vIC0gJG1ldGVyc19wZXJfcGl4ZWw6IGNvbnZlcnNpb24gZm9yIG1ldGVycy9waXhlbHMgYXQgY3VycmVudCBtYXAgem9vbVxuU3R5bGVQYXJzZXIud3JhcEZ1bmN0aW9uID0gZnVuY3Rpb24gKGZ1bmMpIHtcbiAgICB2YXIgZiA9IGBcbiAgICAgICAgdmFyIGZlYXR1cmUgPSBjb250ZXh0LmZlYXR1cmUucHJvcGVydGllcztcbiAgICAgICAgdmFyIGdsb2JhbCA9IGNvbnRleHQuZ2xvYmFsO1xuICAgICAgICB2YXIgJHpvb20gPSBjb250ZXh0Lnpvb207XG4gICAgICAgIHZhciAkbGF5ZXIgPSBjb250ZXh0LmxheWVyO1xuICAgICAgICB2YXIgJGdlb21ldHJ5ID0gY29udGV4dC5nZW9tZXRyeTtcbiAgICAgICAgdmFyICRtZXRlcnNfcGVyX3BpeGVsID0gY29udGV4dC5tZXRlcnNfcGVyX3BpeGVsO1xuXG4gICAgICAgIHZhciB2YWwgPSAoZnVuY3Rpb24oKXsgJHtmdW5jfSB9KCkpO1xuXG4gICAgICAgIGlmICh0eXBlb2YgdmFsID09PSAnbnVtYmVyJyAmJiBpc05hTih2YWwpKSB7XG4gICAgICAgICAgICB2YWwgPSBudWxsOyAvLyBjb252ZXJ0IE5hTnMgdG8gbnVsbHNcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB2YWw7XG4gICAgYDtcbiAgICByZXR1cm4gZjtcbn07XG5cblxuLy8gU3R5bGUgcGFyc2luZ1xuXG5TdHlsZVBhcnNlci56ZXJvUGFpciA9IE9iamVjdC5mcmVlemUoWzAsIDBdKTsgLy8gc2luZ2xlIGFsbG9jYXRpb24gZm9yIHplcm8gdmFsdWVzIHRoYXQgd29uJ3QgYmUgbW9kaWZpZWRcblxuLy8gU3R5bGUgZGVmYXVsdHNcblN0eWxlUGFyc2VyLmRlZmF1bHRzID0ge1xuICAgIGNvbG9yOiBbMSwgMSwgMSwgMV0sXG4gICAgd2lkdGg6IDEsXG4gICAgc2l6ZTogMSxcbiAgICBleHRydWRlOiBmYWxzZSxcbiAgICBoZWlnaHQ6IDIwLFxuICAgIG1pbl9oZWlnaHQ6IDAsXG4gICAgb3JkZXI6IDAsXG4gICAgejogMCxcbiAgICBtYXRlcmlhbDoge1xuICAgICAgICBhbWJpZW50OiAxLFxuICAgICAgICBkaWZmdXNlOiAxXG4gICAgfVxufTtcblxuLy8gU3R5bGUgbWFjcm9zXG5TdHlsZVBhcnNlci5tYWNyb3MgPSB7XG4gICAgLy8gcHNldWRvLXJhbmRvbSBjb2xvciBieSBnZW9tZXRyeSBpZFxuICAgICdTdHlsZS5jb2xvci5wc2V1ZG9SYW5kb21Db2xvcic6IGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gW1xuICAgICAgICAgICAgMC43ICogKHBhcnNlSW50KGZlYXR1cmUuaWQsIDE2KSAvIDEwMCAlIDEpLCAgICAgLy8ganNoaW50IGlnbm9yZTpsaW5lXG4gICAgICAgICAgICAwLjcgKiAocGFyc2VJbnQoZmVhdHVyZS5pZCwgMTYpIC8gMTAwMDAgJSAxKSwgICAvLyBqc2hpbnQgaWdub3JlOmxpbmVcbiAgICAgICAgICAgIDAuNyAqIChwYXJzZUludChmZWF0dXJlLmlkLCAxNikgLyAxMDAwMDAwICUgMSksIC8vIGpzaGludCBpZ25vcmU6bGluZVxuICAgICAgICAgICAgMVxuICAgICAgICBdO1xuICAgIH0sXG5cbiAgICAvLyByYW5kb20gY29sb3JcbiAgICAnU3R5bGUuY29sb3IucmFuZG9tQ29sb3InOiBmdW5jdGlvbigpIHtcbiAgICAgICAgcmV0dXJuIFswLjcgKiBNYXRoLnJhbmRvbSgpLCAwLjcgKiBNYXRoLnJhbmRvbSgpLCAwLjcgKiBNYXRoLnJhbmRvbSgpLCAxXTtcbiAgICB9XG59O1xuXG4vLyBBIGNvbnRleHQgb2JqZWN0IHRoYXQgaXMgcGFzc2VkIHRvIHN0eWxlIHBhcnNpbmcgZnVuY3Rpb25zIHRvIHByb3ZpZGUgYSBzY29wZSBvZiBjb21tb25seSB1c2VkIHZhbHVlc1xuU3R5bGVQYXJzZXIuZ2V0RmVhdHVyZVBhcnNlQ29udGV4dCA9IGZ1bmN0aW9uIChmZWF0dXJlLCB0aWxlLCBnbG9iYWwpIHtcbiAgICByZXR1cm4ge1xuICAgICAgICBmZWF0dXJlLFxuICAgICAgICB0aWxlLFxuICAgICAgICBnbG9iYWwsXG4gICAgICAgIHpvb206IHRpbGUuc3R5bGVfem9vbSxcbiAgICAgICAgZ2VvbWV0cnk6IEdlby5nZW9tZXRyeVR5cGUoZmVhdHVyZS5nZW9tZXRyeS50eXBlKSxcbiAgICAgICAgbWV0ZXJzX3Blcl9waXhlbDogdGlsZS5tZXRlcnNfcGVyX3BpeGVsLFxuICAgICAgICBtZXRlcnNfcGVyX3BpeGVsX3NxOiB0aWxlLm1ldGVyc19wZXJfcGl4ZWxfc3EsXG4gICAgICAgIHVuaXRzX3Blcl9tZXRlcl9vdmVyem9vbTogdGlsZS51bml0c19wZXJfbWV0ZXJfb3Zlcnpvb21cbiAgICB9O1xufTtcblxuLy8gQnVpbGQgYSBzdHlsZSBwYXJhbSBjYWNoZSBvYmplY3Rcbi8vIGB2YWx1ZWAgaXMgcmF3IHZhbHVlLCBjYWNoZSBtZXRob2RzIHdpbGwgYWRkIG90aGVyIHByb3BlcnRpZXMgYXMgbmVlZGVkXG4vLyBgdHJhbnNmb3JtYCBpcyBvcHRpb25hbCB0cmFuc2Zvcm0gZnVuY3Rpb24gdG8gcnVuIG9uIHZhbHVlcyAoZXhjZXB0IGZ1bmN0aW9uIHZhbHVlcylcblN0eWxlUGFyc2VyLmNyZWF0ZVByb3BlcnR5Q2FjaGUgPSBmdW5jdGlvbiAob2JqLCB0cmFuc2Zvcm0gPSBudWxsKSB7XG4gICAgaWYgKG9iaiA9PSBudWxsKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICBpZiAob2JqLnZhbHVlKSB7XG4gICAgICAgIHJldHVybiB7IHZhbHVlOiBvYmoudmFsdWUsIHpvb206IChvYmouem9vbSA/IHt9IDogbnVsbCkgfTsgLy8gY2xvbmUgZXhpc3RpbmcgY2FjaGUgb2JqZWN0XG4gICAgfVxuXG4gICAgbGV0IGMgPSB7IHZhbHVlOiBvYmogfTtcblxuICAgIC8vIGRvZXMgdmFsdWUgY29udGFpbiB6b29tIHN0b3BzIHRvIGJlIGludGVycG9sYXRlZD9cbiAgICBpZiAoQXJyYXkuaXNBcnJheShjLnZhbHVlKSAmJiBBcnJheS5pc0FycmF5KGMudmFsdWVbMF0pKSB7XG4gICAgICAgIGMuem9vbSA9IHt9OyAvLyB3aWxsIGhvbGQgdmFsdWVzIGludGVycG9sYXRlZCBieSB6b29tXG4gICAgfVxuXG4gICAgLy8gYXBwbHkgb3B0aW9uYWwgdHJhbnNmb3JtIGZ1bmN0aW9uXG4gICAgaWYgKHR5cGVvZiB0cmFuc2Zvcm0gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgaWYgKGMuem9vbSkgeyAvLyBhcHBseSB0byBlYWNoIHpvb20gc3RvcCB2YWx1ZVxuICAgICAgICAgICAgYy52YWx1ZSA9IGMudmFsdWUubWFwKHYgPT4gW3ZbMF0sIHRyYW5zZm9ybSh2WzFdKV0pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHR5cGVvZiBjLnZhbHVlICE9PSAnZnVuY3Rpb24nKSB7IC8vIGRvbid0IHRyYW5zZm9ybSBmdW5jdGlvbnNcbiAgICAgICAgICAgIGMudmFsdWUgPSB0cmFuc2Zvcm0oYy52YWx1ZSk7IC8vIHNpbmdsZSB2YWx1ZVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIGM7XG59O1xuXG4vLyBDb252ZXJ0IG9sZC1zdHlsZSBjb2xvciBtYWNybyBpbnRvIGEgZnVuY3Rpb25cbi8vIFRPRE86IGRlcHJlY2F0ZSB0aGlzIG1hY3JvIHN5bnRheFxuU3R5bGVQYXJzZXIuY3JlYXRlQ29sb3JQcm9wZXJ0eUNhY2hlID0gZnVuY3Rpb24gKG9iaikge1xuICAgIHJldHVybiBTdHlsZVBhcnNlci5jcmVhdGVQcm9wZXJ0eUNhY2hlKG9iaiwgdiA9PiB7XG4gICAgICAgIGlmICh2ID09PSAnU3R5bGUuY29sb3IucHNldWRvUmFuZG9tQ29sb3InKSB7XG4gICAgICAgICAgICByZXR1cm4gVXRpbHMuc3RyaW5nVG9GdW5jdGlvbihTdHlsZVBhcnNlci53cmFwRnVuY3Rpb24oU3R5bGVQYXJzZXIubWFjcm9zWydTdHlsZS5jb2xvci5wc2V1ZG9SYW5kb21Db2xvciddKSk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodiA9PT0gJ1N0eWxlLmNvbG9yLnJhbmRvbUNvbG9yJykge1xuICAgICAgICAgICAgcmV0dXJuIFN0eWxlUGFyc2VyLm1hY3Jvc1snU3R5bGUuY29sb3IucmFuZG9tQ29sb3InXTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB2O1xuICAgIH0pO1xufTtcblxuLy8gSW50ZXJwb2xhdGlvbiBhbmQgY2FjaGluZyBmb3IgYSBnZW5lcmljIHByb3BlcnR5IChub3QgYSBjb2xvciBvciBkaXN0YW5jZSlcbi8vIHsgdmFsdWU6IG9yaWdpbmFsLCBzdGF0aWM6IHZhbCwgem9vbTogeyAxOiB2YWwxLCAyOiB2YWwyLCAuLi4gfSwgZHluYW1pYzogZnVuY3Rpb24oKXsuLi59IH1cblN0eWxlUGFyc2VyLmV2YWxDYWNoZWRQcm9wZXJ0eSA9IGZ1bmN0aW9uKHZhbCwgY29udGV4dCkge1xuICAgIGlmICh2YWwgPT0gbnVsbCkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuICAgIGVsc2UgaWYgKHZhbC5keW5hbWljKSB7IC8vIGZ1bmN0aW9uLCBjb21wdXRlIGVhY2ggdGltZSAobm8gY2FjaGluZylcbiAgICAgICAgbGV0IHYgPSB2YWwuZHluYW1pYyhjb250ZXh0KTtcbiAgICAgICAgcmV0dXJuIHY7XG4gICAgfVxuICAgIGVsc2UgaWYgKHZhbC5zdGF0aWMpIHsgLy8gc2luZ2xlIHN0YXRpYyB2YWx1ZVxuICAgICAgICByZXR1cm4gdmFsLnN0YXRpYztcbiAgICB9XG4gICAgZWxzZSBpZiAodmFsLnpvb20gJiYgdmFsLnpvb21bY29udGV4dC56b29tXSkgeyAvLyBpbnRlcnBvbGF0ZWQsIGNhY2hlZFxuICAgICAgICByZXR1cm4gdmFsLnpvb21bY29udGV4dC56b29tXTtcbiAgICB9XG4gICAgZWxzZSB7IC8vIG5vdCB5ZXQgZXZhdWxhdGVkIGZvciBjYWNoZVxuICAgICAgICAvLyBEeW5hbWljIGZ1bmN0aW9uLWJhc2VkXG4gICAgICAgIGlmICh0eXBlb2YgdmFsLnZhbHVlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICB2YWwuZHluYW1pYyA9IHZhbC52YWx1ZTtcbiAgICAgICAgICAgIGxldCB2ID0gdmFsLmR5bmFtaWMoY29udGV4dCk7XG4gICAgICAgICAgICByZXR1cm4gdjtcbiAgICAgICAgfVxuICAgICAgICAvLyBBcnJheSBvZiB6b29tLWludGVycG9sYXRlZCBzdG9wcywgZS5nLiBbem9vbSwgdmFsdWVdIHBhaXJzXG4gICAgICAgIGVsc2UgaWYgKEFycmF5LmlzQXJyYXkodmFsLnZhbHVlKSAmJiBBcnJheS5pc0FycmF5KHZhbC52YWx1ZVswXSkpIHtcbiAgICAgICAgICAgIC8vIENhbGN1bGF0ZSB2YWx1ZSBmb3IgY3VycmVudCB6b29tXG4gICAgICAgICAgICB2YWwuem9vbSA9IHZhbC56b29tIHx8IHt9O1xuICAgICAgICAgICAgdmFsLnpvb20gPSB7fTtcbiAgICAgICAgICAgIHZhbC56b29tW2NvbnRleHQuem9vbV0gPSBVdGlscy5pbnRlcnBvbGF0ZShjb250ZXh0Lnpvb20sIHZhbC52YWx1ZSk7XG4gICAgICAgICAgICByZXR1cm4gdmFsLnpvb21bY29udGV4dC56b29tXTtcbiAgICAgICAgfVxuICAgICAgICAvLyBTaW5nbGUgc3RhdGljIHZhbHVlXG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdmFsLnN0YXRpYyA9IHZhbC52YWx1ZTtcbiAgICAgICAgICAgIHJldHVybiB2YWwuc3RhdGljO1xuICAgICAgICB9XG4gICAgfVxufTtcblxuU3R5bGVQYXJzZXIuY29udmVydFVuaXRzID0gZnVuY3Rpb24odmFsLCBjb250ZXh0KSB7XG4gICAgLy8gcHJlLXBhcnNlZCB1bml0c1xuICAgIGlmICh2YWwudmFsICE9IG51bGwpIHtcbiAgICAgICAgaWYgKHZhbC51bml0cyA9PT0gJ3B4JykgeyAvLyBjb252ZXJ0IGZyb20gcGl4ZWxzXG4gICAgICAgICAgICByZXR1cm4gdmFsLnZhbCAqIEdlby5tZXRlcnNQZXJQaXhlbChjb250ZXh0Lnpvb20pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB2YWwudmFsO1xuICAgIH1cbiAgICAvLyB1bi1wYXJzZWQgdW5pdCBzdHJpbmdcbiAgICBlbHNlIGlmICh0eXBlb2YgdmFsID09PSAnc3RyaW5nJykge1xuICAgICAgICB2YXIgdW5pdHMgPSB2YWwubWF0Y2goLyhbMC05Li1dKykoW2Etel0rKS8pO1xuICAgICAgICBpZiAodW5pdHMgJiYgdW5pdHMubGVuZ3RoID09PSAzKSB7XG4gICAgICAgICAgICB2YWwgPSBwYXJzZUZsb2F0KHVuaXRzWzFdKTtcbiAgICAgICAgICAgIHVuaXRzID0gdW5pdHNbMl07XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodW5pdHMgPT09ICdweCcpIHsgLy8gY29udmVydCBmcm9tIHBpeGVsc1xuICAgICAgICAgICAgdmFsICo9IEdlby5tZXRlcnNQZXJQaXhlbChjb250ZXh0Lnpvb20pO1xuICAgICAgICB9XG4gICAgfVxuICAgIC8vIG11bHRpcGxlIHZhbHVlcyBvciBzdG9wc1xuICAgIGVsc2UgaWYgKEFycmF5LmlzQXJyYXkodmFsKSkge1xuICAgICAgICAvLyBBcnJheSBvZiBhcnJheXMsIGUuZy4gem9vbS1pbnRlcnBvbGF0ZWQgc3RvcHNcbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkodmFsWzBdKSkge1xuICAgICAgICAgICAgcmV0dXJuIHZhbC5tYXAodiA9PiBbdlswXSwgU3R5bGVQYXJzZXIuY29udmVydFVuaXRzKHZbMV0sIGNvbnRleHQpXSk7XG4gICAgICAgIH1cbiAgICAgICAgLy8gQXJyYXkgb2YgdmFsdWVzXG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIHZhbC5tYXAodiA9PiBTdHlsZVBhcnNlci5jb252ZXJ0VW5pdHModiwgY29udGV4dCkpO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiB2YWw7XG59O1xuXG4vLyBQcmUtcGFyc2UgdW5pdHMgZnJvbSBzdHJpbmcgdmFsdWVzXG5TdHlsZVBhcnNlci5wYXJzZVVuaXRzID0gZnVuY3Rpb24gKHZhbCkge1xuICAgIHZhciBvYmogPSB7IHZhbDogcGFyc2VGbG9hdCh2YWwpIH07XG4gICAgaWYgKG9iai52YWwgIT09IDAgJiYgdHlwZW9mIHZhbCA9PT0gJ3N0cmluZycgJiYgdmFsLnRyaW0oKS5zbGljZSgtMikgPT09ICdweCcpIHtcbiAgICAgICAgb2JqLnVuaXRzID0gJ3B4JztcbiAgICB9XG4gICAgcmV0dXJuIG9iajtcbn07XG5cbi8vIFRha2VzIGEgZGlzdGFuY2UgY2FjaGUgb2JqZWN0IGFuZCByZXR1cm5zIGEgZGlzdGFuY2UgdmFsdWUgZm9yIHRoaXMgem9vbVxuLy8gKGNhY2hpbmcgdGhlIHJlc3VsdCBmb3IgZnV0dXJlIHVzZSlcbi8vIHsgdmFsdWU6IG9yaWdpbmFsLCB6b29tOiB7IHo6IG1ldGVycyB9LCBkeW5hbWljOiBmdW5jdGlvbigpey4uLn0gfVxuU3R5bGVQYXJzZXIuZXZhbENhY2hlZERpc3RhbmNlUHJvcGVydHkgPSBmdW5jdGlvbih2YWwsIGNvbnRleHQpIHtcbiAgICBpZiAodmFsLmR5bmFtaWMpIHtcbiAgICAgICAgbGV0IHYgPSB2YWwuZHluYW1pYyhjb250ZXh0KTtcbiAgICAgICAgcmV0dXJuIHY7XG4gICAgfVxuICAgIGVsc2UgaWYgKHZhbC56b29tICYmIHZhbC56b29tW2NvbnRleHQuem9vbV0pIHtcbiAgICAgICAgcmV0dXJuIHZhbC56b29tW2NvbnRleHQuem9vbV07XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICAvLyBEeW5hbWljIGZ1bmN0aW9uLWJhc2VkXG4gICAgICAgIGlmICh0eXBlb2YgdmFsLnZhbHVlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICB2YWwuZHluYW1pYyA9IHZhbC52YWx1ZTtcbiAgICAgICAgICAgIGxldCB2ID0gdmFsLmR5bmFtaWMoY29udGV4dCk7XG4gICAgICAgICAgICByZXR1cm4gdjtcbiAgICAgICAgfVxuICAgICAgICAvLyBBcnJheSBvZiB6b29tLWludGVycG9sYXRlZCBzdG9wcywgZS5nLiBbem9vbSwgdmFsdWVdIHBhaXJzXG4gICAgICAgIGVsc2UgaWYgKHZhbC56b29tKSB7XG4gICAgICAgICAgICAvLyBDYWxjdWxhdGUgdmFsdWUgZm9yIGN1cnJlbnQgem9vbVxuICAgICAgICAgICAgLy8gRG8gZmluYWwgdW5pdCBjb252ZXJzaW9uIGFzIGxhdGUgYXMgcG9zc2libGUsIHdoZW4gaW50ZXJwb2xhdGlvbiB2YWx1ZXMgaGF2ZSBiZWVuIGRldGVybWluZWRcbiAgICAgICAgICAgIHZhbC56b29tW2NvbnRleHQuem9vbV0gPSBVdGlscy5pbnRlcnBvbGF0ZShjb250ZXh0Lnpvb20sIHZhbC52YWx1ZSxcbiAgICAgICAgICAgICAgICB2ID0+IFN0eWxlUGFyc2VyLmNvbnZlcnRVbml0cyh2LCBjb250ZXh0KSk7XG5cbiAgICAgICAgICAgIHJldHVybiB2YWwuem9vbVtjb250ZXh0Lnpvb21dO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIFN0eWxlUGFyc2VyLmNvbnZlcnRVbml0cyh2YWwudmFsdWUsIGNvbnRleHQpO1xuICAgICAgICB9XG4gICAgfVxufTtcblxuLy8gQ2FjaGUgcHJldmlvdXNseSBwYXJzZWQgY29sb3Igc3RyaW5nc1xuU3R5bGVQYXJzZXIuc3RyaW5nX2NvbG9ycyA9IHt9O1xuU3R5bGVQYXJzZXIuY29sb3JGb3JTdHJpbmcgPSBmdW5jdGlvbihzdHJpbmcpIHtcbiAgICAvLyBDYWNoZWRcbiAgICBpZiAoU3R5bGVQYXJzZXIuc3RyaW5nX2NvbG9yc1tzdHJpbmddKSB7XG4gICAgICAgIHJldHVybiBTdHlsZVBhcnNlci5zdHJpbmdfY29sb3JzW3N0cmluZ107XG4gICAgfVxuXG4gICAgLy8gQ2FsY3VsYXRlIGFuZCBjYWNoZVxuICAgIGxldCBjb2xvciA9IHBhcnNlQ1NTQ29sb3IucGFyc2VDU1NDb2xvcihzdHJpbmcpO1xuICAgIGlmIChjb2xvciAmJiBjb2xvci5sZW5ndGggPT09IDQpIHtcbiAgICAgICAgY29sb3JbMF0gLz0gMjU1O1xuICAgICAgICBjb2xvclsxXSAvPSAyNTU7XG4gICAgICAgIGNvbG9yWzJdIC89IDI1NTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIGNvbG9yID0gU3R5bGVQYXJzZXIuZGVmYXVsdHMuY29sb3I7XG4gICAgfVxuICAgIFN0eWxlUGFyc2VyLnN0cmluZ19jb2xvcnNbc3RyaW5nXSA9IGNvbG9yO1xuICAgIHJldHVybiBjb2xvcjtcbn07XG5cbi8vIFRha2VzIGEgY29sb3IgY2FjaGUgb2JqZWN0IGFuZCByZXR1cm5zIGEgY29sb3IgdmFsdWUgZm9yIHRoaXMgem9vbVxuLy8gKGNhY2hpbmcgdGhlIHJlc3VsdCBmb3IgZnV0dXJlIHVzZSlcbi8vIHsgdmFsdWU6IG9yaWdpbmFsLCBzdGF0aWM6IFtyLGcsYixhXSwgem9vbTogeyB6OiBbcixnLGIsYV0gfSwgZHluYW1pYzogZnVuY3Rpb24oKXsuLi59IH1cblN0eWxlUGFyc2VyLmV2YWxDYWNoZWRDb2xvclByb3BlcnR5ID0gZnVuY3Rpb24odmFsLCBjb250ZXh0ID0ge30pIHtcbiAgICBpZiAodmFsLmR5bmFtaWMpIHtcbiAgICAgICAgbGV0IHYgPSB2YWwuZHluYW1pYyhjb250ZXh0KTtcblxuICAgICAgICBpZiAodHlwZW9mIHYgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICB2ID0gU3R5bGVQYXJzZXIuY29sb3JGb3JTdHJpbmcodik7XG4gICAgICAgIH1cblxuICAgICAgICBpZiAodiAmJiB2WzNdID09IG51bGwpIHtcbiAgICAgICAgICAgIHZbM10gPSAxOyAvLyBkZWZhdWx0IGFscGhhXG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHY7XG4gICAgfVxuICAgIGVsc2UgaWYgKHZhbC5zdGF0aWMpIHtcbiAgICAgICAgcmV0dXJuIHZhbC5zdGF0aWM7XG4gICAgfVxuICAgIGVsc2UgaWYgKHZhbC56b29tICYmIHZhbC56b29tW2NvbnRleHQuem9vbV0pIHtcbiAgICAgICAgcmV0dXJuIHZhbC56b29tW2NvbnRleHQuem9vbV07XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICAvLyBEeW5hbWljIGZ1bmN0aW9uLWJhc2VkIGNvbG9yXG4gICAgICAgIGlmICh0eXBlb2YgdmFsLnZhbHVlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICB2YWwuZHluYW1pYyA9IHZhbC52YWx1ZTtcbiAgICAgICAgICAgIGxldCB2ID0gdmFsLmR5bmFtaWMoY29udGV4dCk7XG5cbiAgICAgICAgICAgIGlmICh0eXBlb2YgdiA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICB2ID0gU3R5bGVQYXJzZXIuY29sb3JGb3JTdHJpbmcodik7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmICh2ICYmIHZbM10gPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgIHZbM10gPSAxOyAvLyBkZWZhdWx0IGFscGhhXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gdjtcbiAgICAgICAgfVxuICAgICAgICAvLyBTaW5nbGUgc3RyaW5nIGNvbG9yXG4gICAgICAgIGVsc2UgaWYgKHR5cGVvZiB2YWwudmFsdWUgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICB2YWwuc3RhdGljID0gU3R5bGVQYXJzZXIuY29sb3JGb3JTdHJpbmcodmFsLnZhbHVlKTtcbiAgICAgICAgICAgIHJldHVybiB2YWwuc3RhdGljO1xuICAgICAgICB9XG4gICAgICAgIC8vIEFycmF5IG9mIHpvb20taW50ZXJwb2xhdGVkIHN0b3BzLCBlLmcuIFt6b29tLCBjb2xvcl0gcGFpcnNcbiAgICAgICAgZWxzZSBpZiAodmFsLnpvb20pIHtcbiAgICAgICAgICAgIC8vIFBhcnNlIGFueSBzdHJpbmcgY29sb3JzIGluc2lkZSBzdG9wcywgdGhlIGZpcnN0IHRpbWUgd2UgZW5jb3VudGVyIHRoaXMgcHJvcGVydHlcbiAgICAgICAgICAgIGlmICghdmFsLnpvb21fcHJlcHJvY2Vzc2VkKSB7XG4gICAgICAgICAgICAgICAgZm9yIChsZXQgaT0wOyBpIDwgdmFsLnZhbHVlLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCB2ID0gdmFsLnZhbHVlW2ldO1xuICAgICAgICAgICAgICAgICAgICBpZiAodiAmJiB0eXBlb2YgdlsxXSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZbMV0gPSBTdHlsZVBhcnNlci5jb2xvckZvclN0cmluZyh2WzFdKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB2YWwuem9vbV9wcmVwcm9jZXNzZWQgPSB0cnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBDYWxjdWxhdGUgY29sb3IgZm9yIGN1cnJlbnQgem9vbVxuICAgICAgICAgICAgdmFsLnpvb21bY29udGV4dC56b29tXSA9IFV0aWxzLmludGVycG9sYXRlKGNvbnRleHQuem9vbSwgdmFsLnZhbHVlKTtcbiAgICAgICAgICAgIHZhbC56b29tW2NvbnRleHQuem9vbV1bM10gPSB2YWwuem9vbVtjb250ZXh0Lnpvb21dWzNdIHx8IDE7IC8vIGRlZmF1bHQgYWxwaGFcbiAgICAgICAgICAgIHJldHVybiB2YWwuem9vbVtjb250ZXh0Lnpvb21dO1xuICAgICAgICB9XG4gICAgICAgIC8vIFNpbmdsZSBhcnJheSBjb2xvclxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHZhbC5zdGF0aWMgPSB2YWwudmFsdWU7XG4gICAgICAgICAgICBpZiAodmFsLnN0YXRpYyAmJiB2YWwuc3RhdGljWzNdID09IG51bGwpIHtcbiAgICAgICAgICAgICAgICB2YWwuc3RhdGljWzNdID0gMTsgLy8gZGVmYXVsdCBhbHBoYVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgcmV0dXJuIHZhbC5zdGF0aWM7XG4gICAgICAgIH1cbiAgICB9XG59O1xuXG5TdHlsZVBhcnNlci5wYXJzZUNvbG9yID0gZnVuY3Rpb24odmFsLCBjb250ZXh0ID0ge30pIHtcbiAgICBpZiAodHlwZW9mIHZhbCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICB2YWwgPSB2YWwoY29udGV4dCk7XG4gICAgfVxuXG4gICAgLy8gUGFyc2UgQ1NTLXN0eWxlIGNvbG9yc1xuICAgIC8vIFRPRE86IGNoYW5nZSBhbGwgY29sb3JzIHRvIHVzZSAwLTI1NSByYW5nZSBpbnRlcm5hbGx5IHRvIGF2b2lkIGRpdmlkaW5nIGFuZCB0aGVuIHJlLW11bHRpcGx5aW5nIGluIGdlb20gYnVpbGRlclxuICAgIGlmICh0eXBlb2YgdmFsID09PSAnc3RyaW5nJykge1xuICAgICAgICB2YWwgPSBTdHlsZVBhcnNlci5jb2xvckZvclN0cmluZyh2YWwpO1xuICAgIH1cbiAgICBlbHNlIGlmIChBcnJheS5pc0FycmF5KHZhbCkgJiYgQXJyYXkuaXNBcnJheSh2YWxbMF0pKSB7XG4gICAgICAgIC8vIEFycmF5IG9mIHpvb20taW50ZXJwb2xhdGVkIHN0b3BzLCBlLmcuIFt6b29tLCBjb2xvcl0gcGFpcnNcbiAgICAgICAgZm9yIChsZXQgaT0wOyBpIDwgdmFsLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBsZXQgdiA9IHZhbFtpXTtcbiAgICAgICAgICAgIGlmICh0eXBlb2YgdlsxXSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICB2WzFdID0gU3R5bGVQYXJzZXIuY29sb3JGb3JTdHJpbmcodlsxXSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBpZiAoY29udGV4dC56b29tKSB7XG4gICAgICAgICAgICB2YWwgPSBVdGlscy5pbnRlcnBvbGF0ZShjb250ZXh0Lnpvb20sIHZhbCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBEZWZhdWx0c1xuICAgIGlmICh2YWwpIHtcbiAgICAgICAgLy8gYWxwaGFcbiAgICAgICAgaWYgKHZhbFszXSA9PSBudWxsKSB7XG4gICAgICAgICAgICB2YWxbM10gPSAxO1xuICAgICAgICB9XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICB2YWwgPSBbMCwgMCwgMCwgMV07XG4gICAgfVxuXG4gICAgcmV0dXJuIHZhbDtcbn07XG5cblN0eWxlUGFyc2VyLmNhbGN1bGF0ZU9yZGVyID0gZnVuY3Rpb24ob3JkZXIsIGNvbnRleHQpIHtcbiAgICAvLyBDb21wdXRlZCBvcmRlclxuICAgIGlmICh0eXBlb2Ygb3JkZXIgPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgb3JkZXIgPSBvcmRlcihjb250ZXh0KTtcbiAgICB9XG4gICAgZWxzZSBpZiAodHlwZW9mIG9yZGVyID09PSAnc3RyaW5nJykge1xuICAgICAgICAvLyBPcmRlciB0aWVkIHRvIGZlYXR1cmUgcHJvcGVydHlcbiAgICAgICAgaWYgKGNvbnRleHQuZmVhdHVyZS5wcm9wZXJ0aWVzW29yZGVyXSkge1xuICAgICAgICAgICAgb3JkZXIgPSBjb250ZXh0LmZlYXR1cmUucHJvcGVydGllc1tvcmRlcl07XG4gICAgICAgIH1cbiAgICAgICAgLy8gRXhwbGljaXQgb3JkZXIgdmFsdWVcbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBvcmRlciA9IHBhcnNlRmxvYXQob3JkZXIpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIG9yZGVyO1xufTtcblxuLy8gRXZhbHVhdGUgYSBmdW5jdGlvbi1iYXNlZCBwcm9wZXJ0eSwgb3IgcGFzcy10aHJvdWdoIHN0YXRpYyB2YWx1ZVxuU3R5bGVQYXJzZXIuZXZhbFByb3BlcnR5ID0gZnVuY3Rpb24ocHJvcCwgY29udGV4dCkge1xuICAgIGlmICh0eXBlb2YgcHJvcCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICByZXR1cm4gcHJvcChjb250ZXh0KTtcbiAgICB9XG4gICAgcmV0dXJuIHByb3A7XG59O1xuIiwiaW1wb3J0IFV0aWxzIGZyb20gJy4uLy4uL3V0aWxzL3V0aWxzJztcbmltcG9ydCBUZXh0dXJlIGZyb20gJy4uLy4uL2dsL3RleHR1cmUnO1xuaW1wb3J0IEZvbnRNYW5hZ2VyIGZyb20gJy4vZm9udF9tYW5hZ2VyJztcbmltcG9ydCBkZWJ1Z1NldHRpbmdzIGZyb20gJy4uLy4uL3V0aWxzL2RlYnVnX3NldHRpbmdzJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQ2FudmFzVGV4dCB7XG5cbiAgICBjb25zdHJ1Y3RvciAoKSB7XG4gICAgICAgIHRoaXMuY2FudmFzID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnY2FudmFzJyk7XG4gICAgICAgIHRoaXMuY2FudmFzLnN0eWxlLmJhY2tncm91bmRDb2xvciA9ICd0cmFuc3BhcmVudCc7IC8vIHJlbmRlciB0ZXh0IG9uIHRyYW5zcGFyZW50IGJhY2tncm91bmRcbiAgICAgICAgdGhpcy5jb250ZXh0ID0gdGhpcy5jYW52YXMuZ2V0Q29udGV4dCgnMmQnKTtcbiAgICAgICAgdGhpcy52ZXJ0aWNhbF90ZXh0X2J1ZmZlciA9IDg7IC8vIHZlcnRpY2FsIHBpeGVsIHBhZGRpbmcgYXJvdW5kIHRleHRcbiAgICAgICAgdGhpcy5ob3Jpem9udGFsX3RleHRfYnVmZmVyID0gNDsgLy8gdGV4dCBzdHlsaW5nIHN1Y2ggYXMgaXRhbGljIGVtcGhhc2lzIGlzIG5vdCBtZWFzdXJlZCBieSB0aGUgQ2FudmFzIEFQSSwgc28gcGFkZGluZyBpcyBuZWNlc3NhcnlcbiAgICB9XG5cbiAgICByZXNpemUgKHdpZHRoLCBoZWlnaHQpIHtcbiAgICAgICAgdGhpcy5jYW52YXMud2lkdGggPSB3aWR0aDtcbiAgICAgICAgdGhpcy5jYW52YXMuaGVpZ2h0ID0gaGVpZ2h0O1xuICAgICAgICB0aGlzLmNvbnRleHQuY2xlYXJSZWN0KDAsIDAsIHdpZHRoLCBoZWlnaHQpO1xuICAgIH1cblxuICAgIC8vIFNldCBmb250IHN0eWxlIHBhcmFtcyBmb3IgY2FudmFzIGRyYXdpbmdcbiAgICBzZXRGb250ICh7IGZvbnRfY3NzLCBmaWxsLCBzdHJva2UsIHN0cm9rZV93aWR0aCwgcHhfc2l6ZSB9KSB7XG4gICAgICAgIHRoaXMucHhfc2l6ZSA9IHB4X3NpemU7XG4gICAgICAgIGxldCBjdHggPSB0aGlzLmNvbnRleHQ7XG4gICAgICAgIGxldCBkcHIgPSBVdGlscy5kZXZpY2VfcGl4ZWxfcmF0aW87XG5cbiAgICAgICAgaWYgKHN0cm9rZSAmJiBzdHJva2Vfd2lkdGggPiAwKSB7XG4gICAgICAgICAgICBjdHguc3Ryb2tlU3R5bGUgPSBzdHJva2U7XG4gICAgICAgICAgICBjdHgubGluZVdpZHRoID0gc3Ryb2tlX3dpZHRoICogZHByO1xuICAgICAgICB9XG4gICAgICAgIGN0eC5maWxsU3R5bGUgPSBmaWxsO1xuXG4gICAgICAgIGN0eC5mb250ID0gZm9udF9jc3M7XG4gICAgICAgIGN0eC5taXRlckxpbWl0ID0gMjtcbiAgICB9XG5cbiAgICB0ZXh0U2l6ZXMgKHRleHRzKSB7XG4gICAgICAgIGxldCBkcHIgPSBVdGlscy5kZXZpY2VfcGl4ZWxfcmF0aW87XG4gICAgICAgIHJldHVybiBGb250TWFuYWdlci5sb2FkRm9udHMoKS50aGVuKCgpID0+IHtcbiAgICAgICAgICAgIGZvciAobGV0IHN0eWxlIGluIHRleHRzKSB7XG4gICAgICAgICAgICAgICAgQ2FudmFzVGV4dC50ZXh0X2NhY2hlW3N0eWxlXSA9IENhbnZhc1RleHQudGV4dF9jYWNoZVtzdHlsZV0gfHwge307XG5cbiAgICAgICAgICAgICAgICBsZXQgdGV4dF9pbmZvcyA9IHRleHRzW3N0eWxlXTtcbiAgICAgICAgICAgICAgICBsZXQgZmlyc3QgPSB0cnVlO1xuICAgICAgICAgICAgICAgIGxldCBzcGFjZV93aWR0aDtcblxuICAgICAgICAgICAgICAgIGZvciAobGV0IHRleHQgaW4gdGV4dF9pbmZvcykge1xuICAgICAgICAgICAgICAgICAgICBsZXQgdGV4dF9pbmZvID0gdGV4dF9pbmZvc1t0ZXh0XTtcbiAgICAgICAgICAgICAgICAgICAgbGV0IHRleHRfc2V0dGluZ3MgPSB0ZXh0X2luZm8udGV4dF9zZXR0aW5ncztcblxuICAgICAgICAgICAgICAgICAgICBpZiAoZmlyc3QpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0Rm9udCh0ZXh0X3NldHRpbmdzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHNwYWNlX3dpZHRoID0gdGhpcy5jb250ZXh0Lm1lYXN1cmVUZXh0KCcgJykud2lkdGggLyBkcHI7XG4gICAgICAgICAgICAgICAgICAgICAgICBmaXJzdCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgdGV4dF9pbmZvLnNwYWNlX3dpZHRoID0gc3BhY2Vfd2lkdGg7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHRleHRfc2V0dGluZ3MuY2FuX2FydGljdWxhdGUpe1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHNlZ21lbnRzID0gc3BsaXRMYWJlbFRleHQodGV4dCk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHRleHRfaW5mby5zZWdtZW50cyA9IHNlZ21lbnRzO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGV4dF9pbmZvLnNpemUgPSBbXTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBzZWdtZW50cy5sZW5ndGg7IGkrKyl7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHNlZ21lbnQgPSBzZWdtZW50c1tpXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIUNhbnZhc1RleHQudGV4dF9jYWNoZVtzdHlsZV1bc2VnbWVudF0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2FudmFzVGV4dC50ZXh0X2NhY2hlW3N0eWxlXVtzZWdtZW50XSA9IHRoaXMudGV4dFNpemUoc2VnbWVudCwgdGV4dF9zZXR0aW5ncyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENhbnZhc1RleHQuY2FjaGVfc3RhdHMubWlzc2VzKys7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDYW52YXNUZXh0LmNhY2hlX3N0YXRzLmhpdHMrKztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dF9pbmZvLnNpemUucHVzaChDYW52YXNUZXh0LnRleHRfY2FjaGVbc3R5bGVdW3NlZ21lbnRdLnNpemUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFDYW52YXNUZXh0LnRleHRfY2FjaGVbc3R5bGVdW3RleHRdKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2FudmFzVGV4dC50ZXh0X2NhY2hlW3N0eWxlXVt0ZXh0XSA9IHRoaXMudGV4dFNpemUodGV4dCwgdGV4dF9zZXR0aW5ncyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2FudmFzVGV4dC5jYWNoZV9zdGF0cy5taXNzZXMrKztcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIENhbnZhc1RleHQuY2FjaGVfc3RhdHMuaGl0cysrO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gT25seSBzZW5kIHRleHQgc2l6ZXMgYmFjayB0byB3b3JrZXIgKGtlZXAgY29tcHV0ZWQgdGV4dCBsaW5lIGluZm9cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9uIG1haW4gdGhyZWFkLCBmb3IgZnV0dXJlIHJlbmRlcmluZylcbiAgICAgICAgICAgICAgICAgICAgICAgIHRleHRfaW5mby5zaXplID0gQ2FudmFzVGV4dC50ZXh0X2NhY2hlW3N0eWxlXVt0ZXh0XS5zaXplO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gdGV4dHM7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIENvbXB1dGVzIHdpZHRoIGFuZCBoZWlnaHQgb2YgdGV4dCBiYXNlZCBvbiBjdXJyZW50IGZvbnQgc3R5bGVcbiAgICAvLyBJbmNsdWRlcyB3b3JkIHdyYXBwaW5nLCByZXR1cm5zIHNpemUgaW5mbyBmb3Igd2hvbGUgdGV4dCBibG9jayBhbmQgaW5kaXZpZHVhbCBsaW5lc1xuICAgIHRleHRTaXplICh0ZXh0LCB7dHJhbnNmb3JtLCB0ZXh0X3dyYXAsIG1heF9saW5lcywgc3Ryb2tlX3dpZHRoID0gMH0pIHtcbiAgICAgICAgbGV0IGRwciA9IFV0aWxzLmRldmljZV9waXhlbF9yYXRpbztcbiAgICAgICAgbGV0IHN0ciA9IHRoaXMuYXBwbHlUZXh0VHJhbnNmb3JtKHRleHQsIHRyYW5zZm9ybSk7XG4gICAgICAgIGxldCBjdHggPSB0aGlzLmNvbnRleHQ7XG4gICAgICAgIGxldCB2ZXJ0aWNhbF9idWZmZXIgPSB0aGlzLnZlcnRpY2FsX3RleHRfYnVmZmVyICogZHByO1xuICAgICAgICBsZXQgaG9yaXpvbnRhbF9idWZmZXIgPSBkcHIgKiAoc3Ryb2tlX3dpZHRoICsgdGhpcy5ob3Jpem9udGFsX3RleHRfYnVmZmVyKTtcbiAgICAgICAgbGV0IGxlYWRpbmcgPSAyICogZHByOyAvLyBtYWtlIGNvbmZpZ3VyYWJsZSBhbmQvb3IgdXNlIENhbnZhcyBUZXh0TWV0cmljcyB3aGVuIGF2YWlsYWJsZVxuICAgICAgICBsZXQgbGluZV9oZWlnaHQgPSB0aGlzLnB4X3NpemUgKyBsZWFkaW5nOyAvLyBweF9zaXplIGFscmVhZHkgaW4gZGV2aWNlIHBpeGVsc1xuXG4gICAgICAgIC8vIFBhcnNlIHN0cmluZyBpbnRvIHNlcmllcyBvZiBsaW5lcyBpZiBpdCBleGNlZWRzIHRoZSB0ZXh0IHdyYXBwaW5nIHZhbHVlIG9yIGNvbnRhaW5zIGxpbmUgYnJlYWtzXG4gICAgICAgIGxldCBtdWx0aWxpbmUgPSBNdWx0aUxpbmUucGFyc2Uoc3RyLCB0ZXh0X3dyYXAsIG1heF9saW5lcywgbGluZV9oZWlnaHQsIGN0eCk7XG5cbiAgICAgICAgLy8gRmluYWwgZGltZW5zaW9ucyBvZiB0ZXh0XG4gICAgICAgIGxldCBoZWlnaHQgPSBtdWx0aWxpbmUuaGVpZ2h0O1xuICAgICAgICBsZXQgd2lkdGggPSBtdWx0aWxpbmUud2lkdGg7XG4gICAgICAgIGxldCBsaW5lcyA9IG11bHRpbGluZS5saW5lcztcblxuICAgICAgICBsZXQgY29sbGlzaW9uX3NpemUgPSBbXG4gICAgICAgICAgICB3aWR0aCAvIGRwcixcbiAgICAgICAgICAgIGhlaWdodCAvIGRwclxuICAgICAgICBdO1xuXG4gICAgICAgIGxldCB0ZXh0dXJlX3NpemUgPSBbXG4gICAgICAgICAgICB3aWR0aCArIDIgKiBob3Jpem9udGFsX2J1ZmZlcixcbiAgICAgICAgICAgIGhlaWdodCArIDIgKiB2ZXJ0aWNhbF9idWZmZXJcbiAgICAgICAgXTtcblxuICAgICAgICBsZXQgbG9naWNhbF9zaXplID0gW1xuICAgICAgICAgICAgdGV4dHVyZV9zaXplWzBdIC8gZHByLFxuICAgICAgICAgICAgdGV4dHVyZV9zaXplWzFdIC8gZHByLFxuICAgICAgICBdO1xuXG4gICAgICAgIC8vIFJldHVybnMgbGluZXMgKHcvcGVyLWxpbmUgaW5mbyBmb3IgZHJhd2luZykgYW5kIHRleHQncyBvdmVyYWxsIGJvdW5kaW5nIGJveCArIGNhbnZhcyBzaXplXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBsaW5lcyxcbiAgICAgICAgICAgIHNpemU6IHsgY29sbGlzaW9uX3NpemUsIHRleHR1cmVfc2l6ZSwgbG9naWNhbF9zaXplLCBsaW5lX2hlaWdodCB9XG4gICAgICAgIH07XG4gICAgfVxuXG4gICAgLy8gRHJhdyBtdWx0aXBsZSBsaW5lcyBvZiB0ZXh0XG4gICAgZHJhd1RleHRNdWx0aUxpbmUgKGxpbmVzLCBbeCwgeV0sIHNpemUsIHsgc3Ryb2tlLCBzdHJva2Vfd2lkdGggPSAwLCB0cmFuc2Zvcm0sIGFsaWduIH0pIHtcbiAgICAgICAgbGV0IGxpbmVfaGVpZ2h0ID0gc2l6ZS5saW5lX2hlaWdodDtcbiAgICAgICAgbGV0IGhlaWdodCA9IHk7XG4gICAgICAgIGZvciAobGV0IGxpbmVfbnVtPTA7IGxpbmVfbnVtIDwgbGluZXMubGVuZ3RoOyBsaW5lX251bSsrKSB7XG4gICAgICAgICAgICBsZXQgbGluZSA9IGxpbmVzW2xpbmVfbnVtXTtcbiAgICAgICAgICAgIHRoaXMuZHJhd1RleHRMaW5lKGxpbmUsIFt4LCBoZWlnaHRdLCBzaXplLCB7IHN0cm9rZSwgc3Ryb2tlX3dpZHRoLCB0cmFuc2Zvcm0sIGFsaWduIH0pO1xuICAgICAgICAgICAgaGVpZ2h0ICs9IGxpbmVfaGVpZ2h0O1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gRHJhdyBib3VuZGluZyBib3hlcyBmb3IgZGVidWdnaW5nXG4gICAgICAgIGlmIChkZWJ1Z1NldHRpbmdzLmRyYXdfbGFiZWxfY29sbGlzaW9uX2JveGVzKSB7XG4gICAgICAgICAgICB0aGlzLmNvbnRleHQuc2F2ZSgpO1xuXG4gICAgICAgICAgICBsZXQgZHByID0gVXRpbHMuZGV2aWNlX3BpeGVsX3JhdGlvO1xuICAgICAgICAgICAgbGV0IGhvcml6b250YWxfYnVmZmVyID0gZHByICogKHRoaXMuaG9yaXpvbnRhbF90ZXh0X2J1ZmZlciArIHN0cm9rZV93aWR0aCk7XG4gICAgICAgICAgICBsZXQgdmVydGljYWxfYnVmZmVyID0gZHByICogdGhpcy52ZXJ0aWNhbF90ZXh0X2J1ZmZlcjtcbiAgICAgICAgICAgIGxldCBjb2xsaXNpb25fc2l6ZSA9IHNpemUuY29sbGlzaW9uX3NpemU7XG4gICAgICAgICAgICBsZXQgbGluZVdpZHRoID0gMjtcblxuICAgICAgICAgICAgdGhpcy5jb250ZXh0LnN0cm9rZVN0eWxlID0gJ2JsdWUnO1xuICAgICAgICAgICAgdGhpcy5jb250ZXh0LmxpbmVXaWR0aCA9IGxpbmVXaWR0aDtcbiAgICAgICAgICAgIHRoaXMuY29udGV4dC5zdHJva2VSZWN0KHggKyBob3Jpem9udGFsX2J1ZmZlciwgeSArIHZlcnRpY2FsX2J1ZmZlciwgZHByICogY29sbGlzaW9uX3NpemVbMF0sIGRwciAqIGNvbGxpc2lvbl9zaXplWzFdKTtcblxuICAgICAgICAgICAgdGhpcy5jb250ZXh0LnJlc3RvcmUoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChkZWJ1Z1NldHRpbmdzLmRyYXdfbGFiZWxfdGV4dHVyZV9ib3hlcykge1xuICAgICAgICAgICAgdGhpcy5jb250ZXh0LnNhdmUoKTtcblxuICAgICAgICAgICAgbGV0IHRleHR1cmVfc2l6ZSA9IHNpemUudGV4dHVyZV9zaXplO1xuICAgICAgICAgICAgbGV0IGxpbmVXaWR0aCA9IDI7XG5cbiAgICAgICAgICAgIHRoaXMuY29udGV4dC5zdHJva2VTdHlsZSA9ICdncmVlbic7XG4gICAgICAgICAgICB0aGlzLmNvbnRleHQubGluZVdpZHRoID0gbGluZVdpZHRoO1xuICAgICAgICAgICAgLy8gc3Ryb2tlIGlzIGFwcGxpZWQgaW50ZXJuYWxseSwgc28gdGhlIG91dGVyIGJvcmRlciBpcyB0aGUgZWRnZSBvZiB0aGUgdGV4dHVyZVxuICAgICAgICAgICAgdGhpcy5jb250ZXh0LnN0cm9rZVJlY3QoeCArIGxpbmVXaWR0aCwgeSArIGxpbmVXaWR0aCwgdGV4dHVyZV9zaXplWzBdIC0gMiAqIGxpbmVXaWR0aCwgdGV4dHVyZV9zaXplWzFdIC0gMiAqIGxpbmVXaWR0aCk7XG5cbiAgICAgICAgICAgIHRoaXMuY29udGV4dC5yZXN0b3JlKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBEcmF3IHNpbmdsZSBsaW5lIG9mIHRleHQgYXQgc3BlY2lmaWVkIGxvY2F0aW9uLCBhZGp1c3RpbmcgZm9yIGJ1ZmZlciBhbmQgYmFzZWxpbmVcbiAgICBkcmF3VGV4dExpbmUgKGxpbmUsIFt4LCB5XSwgc2l6ZSwgeyBzdHJva2UsIHN0cm9rZV93aWR0aCA9IDAsIHRyYW5zZm9ybSwgYWxpZ24gfSkge1xuICAgICAgICBsZXQgZHByID0gVXRpbHMuZGV2aWNlX3BpeGVsX3JhdGlvO1xuICAgICAgICBhbGlnbiA9IGFsaWduIHx8ICdjZW50ZXInO1xuXG4gICAgICAgIGxldCB2ZXJ0aWNhbF9idWZmZXIgPSB0aGlzLnZlcnRpY2FsX3RleHRfYnVmZmVyICogZHByO1xuICAgICAgICBsZXQgdGV4dHVyZV9zaXplID0gc2l6ZS50ZXh0dXJlX3NpemU7XG4gICAgICAgIGxldCBsaW5lX2hlaWdodCA9IHNpemUubGluZV9oZWlnaHQ7XG4gICAgICAgIGxldCBob3Jpem9udGFsX2J1ZmZlciA9IGRwciAqIChzdHJva2Vfd2lkdGggKyB0aGlzLmhvcml6b250YWxfdGV4dF9idWZmZXIpO1xuXG4gICAgICAgIGxldCBzdHIgPSB0aGlzLmFwcGx5VGV4dFRyYW5zZm9ybShsaW5lLnRleHQsIHRyYW5zZm9ybSk7XG5cbiAgICAgICAgLy8gVGV4dCBhbGlnbm1lbnRcbiAgICAgICAgbGV0IHR4O1xuICAgICAgICBpZiAoYWxpZ24gPT09ICdsZWZ0Jykge1xuICAgICAgICAgICAgdHggPSB4ICsgaG9yaXpvbnRhbF9idWZmZXI7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoYWxpZ24gPT09ICdjZW50ZXInKSB7XG4gICAgICAgICAgICB0eCA9IHggKyB0ZXh0dXJlX3NpemVbMF0vMiAtIGxpbmUud2lkdGgvMjtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIGlmIChhbGlnbiA9PT0gJ3JpZ2h0Jykge1xuICAgICAgICAgICAgdHggPSB4ICsgdGV4dHVyZV9zaXplWzBdIC0gbGluZS53aWR0aCAtIGhvcml6b250YWxfYnVmZmVyO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gSW4gdGhlIGFic2VuY2Ugb2YgYmV0dGVyIENhbnZhcyBUZXh0TWV0cmljcyAobm90IHN1cHBvcnRlZCBieSBicm93c2VycyB5ZXQpLFxuICAgICAgICAvLyAwLjc1IGJ1ZmZlciBwcm9kdWNlcyBhIGJldHRlciBhcHByb3hpbWF0ZSB2ZXJ0aWNhbCBjZW50ZXJpbmcgb2YgdGV4dFxuICAgICAgICBsZXQgdHkgPSB5ICsgdmVydGljYWxfYnVmZmVyICogMC43NSArIGxpbmVfaGVpZ2h0O1xuXG4gICAgICAgIGlmIChzdHJva2UgJiYgc3Ryb2tlX3dpZHRoID4gMCkge1xuICAgICAgICAgICAgdGhpcy5jb250ZXh0LnN0cm9rZVRleHQoc3RyLCB0eCwgdHkpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMuY29udGV4dC5maWxsVGV4dChzdHIsIHR4LCB0eSk7XG4gICAgfVxuXG4gICAgcmFzdGVyaXplICh0ZXh0cywgdGV4dHVyZV9zaXplLCB0aWxlX2tleSkge1xuICAgICAgICBmb3IgKGxldCBzdHlsZSBpbiB0ZXh0cykge1xuICAgICAgICAgICAgbGV0IHRleHRfaW5mb3MgPSB0ZXh0c1tzdHlsZV07XG4gICAgICAgICAgICBsZXQgZmlyc3QgPSB0cnVlO1xuXG4gICAgICAgICAgICBmb3IgKGxldCB0ZXh0IGluIHRleHRfaW5mb3MpIHtcbiAgICAgICAgICAgICAgICBsZXQgdGV4dF9pbmZvID0gdGV4dF9pbmZvc1t0ZXh0XTtcbiAgICAgICAgICAgICAgICBsZXQgdGV4dF9zZXR0aW5ncyA9IHRleHRfaW5mby50ZXh0X3NldHRpbmdzO1xuXG4gICAgICAgICAgICAgICAgLy8gc2V0IGZvbnQgb24gZmlyc3Qgb2NjdXJlbmNlIG9mIG5ldyBmb250IHN0eWxlXG4gICAgICAgICAgICAgICAgaWYgKGZpcnN0KSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuc2V0Rm9udCh0ZXh0X3NldHRpbmdzKTtcbiAgICAgICAgICAgICAgICAgICAgZmlyc3QgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAodGV4dF9zZXR0aW5ncy5jYW5fYXJ0aWN1bGF0ZSl7XG4gICAgICAgICAgICAgICAgICAgIGxldCB3b3JkcyA9IHRleHRfaW5mby5zZWdtZW50cztcbiAgICAgICAgICAgICAgICAgICAgdGV4dF9pbmZvLnRleGNvb3JkcyA9IFtdO1xuXG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgd29yZHMubGVuZ3RoOyBpKyspe1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHdvcmQgPSB3b3Jkc1tpXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCB0ZXhjb29yZDtcblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKENhbnZhc1RleHQudGV4Y29vcmRfY2FjaGVbdGlsZV9rZXldW3N0eWxlXVt3b3JkXS50ZXhjb29yZCl7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4Y29vcmQgPSBDYW52YXNUZXh0LnRleGNvb3JkX2NhY2hlW3RpbGVfa2V5XVtzdHlsZV1bd29yZF0udGV4Y29vcmQ7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZXQgdGV4dHVyZV9wb3NpdGlvbiA9IENhbnZhc1RleHQudGV4Y29vcmRfY2FjaGVbdGlsZV9rZXldW3N0eWxlXVt3b3JkXS50ZXh0dXJlX3Bvc2l0aW9uO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBzaXplID0gQ2FudmFzVGV4dC50ZXh0X2NhY2hlW3N0eWxlXVt3b3JkXS5zaXplO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxldCBsaW5lID0gQ2FudmFzVGV4dC50ZXh0X2NhY2hlW3N0eWxlXVt3b3JkXS5saW5lcztcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMuZHJhd1RleHRNdWx0aUxpbmUobGluZSwgdGV4dHVyZV9wb3NpdGlvbiwgc2l6ZSwgdGV4dF9zZXR0aW5ncyk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXhjb29yZCA9IFRleHR1cmUuZ2V0VGV4Y29vcmRzRm9yU3ByaXRlKFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0dXJlX3Bvc2l0aW9uLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplLnRleHR1cmVfc2l6ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dHVyZV9zaXplXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIENhbnZhc1RleHQudGV4Y29vcmRfY2FjaGVbdGlsZV9rZXldW3N0eWxlXVt3b3JkXS50ZXhjb29yZCA9IHRleGNvb3JkO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICB0ZXh0X2luZm8udGV4Y29vcmRzLnB1c2godGV4Y29vcmQpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBsZXQgbGluZXMgPSBDYW52YXNUZXh0LnRleHRfY2FjaGVbc3R5bGVdW3RleHRdLmxpbmVzOyAvLyBnZXQgcHJldmlvdXNseSBjb21wdXRlZCBsaW5lcyBvZiB0ZXh0XG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGFsaWduIGluIHRleHRfaW5mby5hbGlnbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kcmF3VGV4dE11bHRpTGluZShsaW5lcywgdGV4dF9pbmZvLmFsaWduW2FsaWduXS50ZXh0dXJlX3Bvc2l0aW9uLCB0ZXh0X2luZm8uc2l6ZSwge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cm9rZTogdGV4dF9zZXR0aW5ncy5zdHJva2UsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ryb2tlX3dpZHRoOiB0ZXh0X3NldHRpbmdzLnN0cm9rZV93aWR0aCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2Zvcm06IHRleHRfc2V0dGluZ3MudHJhbnNmb3JtLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsaWduOiBhbGlnblxuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHRleHRfaW5mby5hbGlnblthbGlnbl0udGV4Y29vcmRzID0gVGV4dHVyZS5nZXRUZXhjb29yZHNGb3JTcHJpdGUoXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dF9pbmZvLmFsaWduW2FsaWduXS50ZXh0dXJlX3Bvc2l0aW9uLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHRfaW5mby5zaXplLnRleHR1cmVfc2l6ZSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0dXJlX3NpemVcbiAgICAgICAgICAgICAgICAgICAgICAgICk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBQbGFjZSB0ZXh0IGxhYmVscyB3aXRoaW4gYW4gYXRsYXMgb2YgdGhlIGdpdmVuIG1heCBzaXplXG4gICAgc2V0VGV4dHVyZVRleHRQb3NpdGlvbnMgKHRleHRzLCBtYXhfdGV4dHVyZV9zaXplLCB0aWxlX2tleSkge1xuICAgICAgICBpZiAoIUNhbnZhc1RleHQudGV4Y29vcmRfY2FjaGVbdGlsZV9rZXldKSB7XG4gICAgICAgICAgICBDYW52YXNUZXh0LnRleGNvb3JkX2NhY2hlW3RpbGVfa2V5XSA9IHt9O1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gS2VlcCB0cmFjayBvZiBjb2x1bW4gd2lkdGhcbiAgICAgICAgbGV0IGNvbHVtbl93aWR0aCA9IDA7XG5cbiAgICAgICAgLy8gTGF5b3V0IGxhYmVscywgc3RhY2tlZCBpbiBjb2x1bW5zXG4gICAgICAgIGxldCBjeCA9IDAsIGN5ID0gMDsgLy8gY3VycmVudCB4L3kgcG9zaXRpb24gaW4gYXRsYXNcbiAgICAgICAgbGV0IGhlaWdodCA9IDA7ICAgICAvLyBvdmVyYWxsIGF0bGFzIGhlaWdodFxuICAgICAgICBmb3IgKGxldCBzdHlsZSBpbiB0ZXh0cykge1xuICAgICAgICAgICAgaWYgKCFDYW52YXNUZXh0LnRleGNvb3JkX2NhY2hlW3RpbGVfa2V5XVtzdHlsZV0pIHtcbiAgICAgICAgICAgICAgIENhbnZhc1RleHQudGV4Y29vcmRfY2FjaGVbdGlsZV9rZXldW3N0eWxlXSA9IHt9O1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBsZXQgdGV4dF9pbmZvcyA9IHRleHRzW3N0eWxlXTtcblxuICAgICAgICAgICAgZm9yIChsZXQgdGV4dCBpbiB0ZXh0X2luZm9zKSB7XG4gICAgICAgICAgICAgICAgbGV0IHRleHRfaW5mbyA9IHRleHRfaW5mb3NbdGV4dF07XG5cbiAgICAgICAgICAgICAgICBpZiAodGV4dF9pbmZvLnRleHRfc2V0dGluZ3MuY2FuX2FydGljdWxhdGUpe1xuICAgICAgICAgICAgICAgICAgICBsZXQgdGV4dHVyZV9wb3NpdGlvbjtcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCB0ZXh0X2luZm8uc2l6ZS5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHdvcmQgPSB0ZXh0X2luZm8uc2VnbWVudHNbaV07XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghQ2FudmFzVGV4dC50ZXhjb29yZF9jYWNoZVt0aWxlX2tleV1bc3R5bGVdW3dvcmRdKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHNpemUgPSB0ZXh0X2luZm8uc2l6ZVtpXS50ZXh0dXJlX3NpemU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNpemVbMF0gPiBjb2x1bW5fd2lkdGgpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29sdW1uX3dpZHRoID0gc2l6ZVswXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGN5ICsgc2l6ZVsxXSA8IG1heF90ZXh0dXJlX3NpemUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dHVyZV9wb3NpdGlvbiA9IFtjeCwgY3ldO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN5ICs9IHNpemVbMV07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjeSA+IGhlaWdodCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0ID0gY3k7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7IC8vIHN0YXJ0IG5ldyBjb2x1bW4gaWYgdGFsbGVyIHRoYW4gdGV4dHVyZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjeCArPSBjb2x1bW5fd2lkdGg7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbl93aWR0aCA9IDA7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN5ID0gMDtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dHVyZV9wb3NpdGlvbiA9IFtjeCwgY3ldO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIENhbnZhc1RleHQudGV4Y29vcmRfY2FjaGVbdGlsZV9rZXldW3N0eWxlXVt3b3JkXSA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dHVyZV9wb3NpdGlvbjogdGV4dHVyZV9wb3NpdGlvblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIC8vIHJlbmRlcmVkIHNpemUgaXMgc2FtZSBmb3IgYWxsIGFsaWdubWVudHNcbiAgICAgICAgICAgICAgICAgICAgbGV0IHNpemUgPSB0ZXh0X2luZm8uc2l6ZS50ZXh0dXJlX3NpemU7XG4gICAgICAgICAgICAgICAgICAgIGlmIChzaXplWzBdID4gY29sdW1uX3dpZHRoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb2x1bW5fd2lkdGggPSBzaXplWzBdO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gYnV0IGVhY2ggYWxpZ25tZW50IG5lZWRzIHRvIGJlIHJlbmRlcmVkIHNlcGFyYXRlbHlcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgYWxpZ24gaW4gdGV4dF9pbmZvLmFsaWduKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoY3kgKyBzaXplWzFdIDwgbWF4X3RleHR1cmVfc2l6ZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHRfaW5mby5hbGlnblthbGlnbl0udGV4dHVyZV9wb3NpdGlvbiA9IFtjeCwgY3ldOyAvLyBhZGQgbGFiZWwgdG8gY3VycmVudCBjb2x1bW5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjeSArPSBzaXplWzFdO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChjeSA+IGhlaWdodCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWlnaHQgPSBjeTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsgLy8gc3RhcnQgbmV3IGNvbHVtbiBpZiB0YWxsZXIgdGhhbiB0ZXh0dXJlXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY3ggKz0gY29sdW1uX3dpZHRoO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbHVtbl93aWR0aCA9IDA7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY3kgPSAwO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRleHRfaW5mby5hbGlnblthbGlnbl0udGV4dHVyZV9wb3NpdGlvbiA9IFtjeCwgY3ldO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIFtjeCArIGNvbHVtbl93aWR0aCwgaGVpZ2h0XTsgLy8gb3ZlcmFsbCBhdGxhcyBzaXplXG4gICAgfVxuXG4gICAgLy8gQ2FsbGVkIGJlZm9yZSByYXN0ZXJpemF0aW9uXG4gICAgYXBwbHlUZXh0VHJhbnNmb3JtICh0ZXh0LCB0cmFuc2Zvcm0pIHtcbiAgICAgICAgaWYgKHRyYW5zZm9ybSA9PT0gJ2NhcGl0YWxpemUnKSB7XG4gICAgICAgICAgICByZXR1cm4gdGV4dC5yZXBsYWNlKC9cXHdcXFMqL2csIGZ1bmN0aW9uICh0eHQpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHh0LmNoYXJBdCgwKS50b1VwcGVyQ2FzZSgpICsgdHh0LnN1YnN0cigxKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKHRyYW5zZm9ybSA9PT0gJ3VwcGVyY2FzZScpIHtcbiAgICAgICAgICAgIHJldHVybiB0ZXh0LnRvVXBwZXJDYXNlKCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodHJhbnNmb3JtID09PSAnbG93ZXJjYXNlJykge1xuICAgICAgICAgICAgcmV0dXJuIHRleHQudG9Mb3dlckNhc2UoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGV4dDtcbiAgICB9XG5cbiAgICAvLyBDb252ZXJ0IGZvbnQgQ1NTLXN0eWxlIHNpemUgKCcxMnB4JywgJzE0cHQnLCAnMS41ZW0nLCBldGMuKSB0byBwaXhlbCBzaXplIChhZGp1c3RlZCBmb3IgZGV2aWNlIHBpeGVsIHJhdGlvKVxuICAgIC8vIERlZmF1bHRzIHVuaXRzIHRvIHBpeGVscyBpZiBub3Qgc3BlY2lmaWVkXG4gICAgc3RhdGljIGZvbnRQaXhlbFNpemUgKHNpemUpIHtcbiAgICAgICAgaWYgKHNpemUgPT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG4gICAgICAgIHNpemUgPSAodHlwZW9mIHNpemUgPT09ICdzdHJpbmcnKSA/IHNpemUgOiBTdHJpbmcoc2l6ZSk7IC8vIG5lZWQgYSBzdHJpbmcgZm9yIHJlZ2V4XG5cbiAgICAgICAgbGV0IFssIHB4X3NpemUsIHVuaXRzXSA9IHNpemUubWF0Y2goQ2FudmFzVGV4dC5mb250X3NpemVfcmUpIHx8IFtdO1xuICAgICAgICB1bml0cyA9IHVuaXRzIHx8ICdweCc7XG5cbiAgICAgICAgaWYgKHVuaXRzID09PSBcImVtXCIpIHtcbiAgICAgICAgICAgIHB4X3NpemUgKj0gMTY7XG4gICAgICAgIH0gZWxzZSBpZiAodW5pdHMgPT09IFwicHRcIikge1xuICAgICAgICAgICAgcHhfc2l6ZSAvPSAwLjc1O1xuICAgICAgICB9IGVsc2UgaWYgKHVuaXRzID09PSBcIiVcIikge1xuICAgICAgICAgICAgcHhfc2l6ZSAvPSA2LjI1O1xuICAgICAgICB9XG5cbiAgICAgICAgcHhfc2l6ZSA9IHBhcnNlRmxvYXQocHhfc2l6ZSk7XG4gICAgICAgIHB4X3NpemUgKj0gVXRpbHMuZGV2aWNlX3BpeGVsX3JhdGlvO1xuICAgICAgICByZXR1cm4gcHhfc2l6ZTtcbiAgICB9XG5cbiAgICBjbGVhclRleGNvb3JkQ2FjaGUgKHRpbGVfa2V5KSB7XG4gICAgICAgIENhbnZhc1RleHQudGV4Y29vcmRfY2FjaGVbdGlsZV9rZXldID0ge307XG4gICAgfVxuXG59XG5cbi8vIEV4dHJhY3QgZm9udCBzaXplIGFuZCB1bml0c1xuQ2FudmFzVGV4dC5mb250X3NpemVfcmUgPSAvKCg/OlswLTldKlxcLik/WzAtOV0rKVxccyoocHh8cHR8ZW18JSk/LztcblxuLy8gQ2FjaGUgc2l6ZXMgb2YgcmVuZGVyZWQgdGV4dFxuQ2FudmFzVGV4dC50ZXh0X2NhY2hlID0ge307IC8vIGJ5IHRleHQgc3R5bGUsIHRoZW4gdGV4dCBzdHJpbmdcbkNhbnZhc1RleHQuY2FjaGVfc3RhdHMgPSB7IGhpdHM6IDAsIG1pc3NlczogMCB9O1xuQ2FudmFzVGV4dC50ZXhjb29yZF9jYWNoZSA9IHt9O1xuXG4vLyBSaWdodC10by1sZWZ0IC8gYmktZGlyZWN0aW9uYWwgdGV4dCBoYW5kbGluZ1xuLy8gVGFrZW4gZnJvbSBodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzEyMDA2MDk1L2phdmFzY3JpcHQtaG93LXRvLWNoZWNrLWlmLWNoYXJhY3Rlci1pcy1ydGwjYW5zd2VyLTE5MTQzMjU0XG5sZXQgcnRsUmVnRXggPSAvXlteXFx1MDU5MS1cXHUwN0ZGXFx1MjAwRlxcdTIwMkJcXHUyMDJFXFx1RkIxRC1cXHVGREZEXFx1RkU3MC1cXHVGRUZDXSo/W1xcdTA1OTEtXFx1MDdGRlxcdTIwMEZcXHUyMDJCXFx1MjAyRVxcdUZCMUQtXFx1RkRGRFxcdUZFNzAtXFx1RkVGQ10vO1xuZnVuY3Rpb24gaXNSVEwocyl7XG4gICAgcmV0dXJuIHJ0bFJlZ0V4LnRlc3Qocyk7XG59XG5cbmZ1bmN0aW9uIHJlb3JkZXJXb3Jkc0xUUih3b3Jkcykge1xuICAgIGxldCB3b3Jkc19MVFIgPSBbXTtcbiAgICBsZXQgd29yZHNfUlRMID0gW107XG5cbiAgICAvLyBsb29wIHRocm91Z2ggd29yZHMgYW5kIHJlLW9yZGVyIFJUTCBncm91cHMgaW4gcmV2ZXJzZSBvcmRlciAoYnV0IGluIExUUiB2aXN1YWwgb3JkZXIpXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB3b3Jkcy5sZW5ndGg7IGkrKyl7XG4gICAgICAgIHZhciBzdHIgPSB3b3Jkc1tpXTtcbiAgICAgICAgdmFyIHJ0bCA9IGlzUlRMKHN0cik7XG4gICAgICAgIGlmIChydGwpe1xuICAgICAgICAgICAgd29yZHNfUlRMLnB1c2goc3RyKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHdoaWxlICh3b3Jkc19SVEwubGVuZ3RoID4gMCl7XG4gICAgICAgICAgICAgICAgd29yZHNfTFRSLnB1c2god29yZHNfUlRMLnBvcCgpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHdvcmRzX0xUUi5wdXNoKHN0cik7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICB3aGlsZSAod29yZHNfUlRMLmxlbmd0aCA+IDApe1xuICAgICAgICB3b3Jkc19MVFIucHVzaCh3b3Jkc19SVEwucG9wKCkpO1xuICAgIH1cblxuICAgIHJldHVybiB3b3Jkc19MVFI7XG59XG5cbi8vIFNwbGl0dGluZyBzdHJhdGVneSBmb3IgY2hvcHBpbmcgYSBsYWJlbCBpbnRvIHNlZ21lbnRzXG5mdW5jdGlvbiBzcGxpdExhYmVsVGV4dCh0ZXh0KXtcbiAgICBsZXQgd29yZHMgPSB0ZXh0LnNwbGl0KCcgJyk7XG4gICAgcmV0dXJuIHJlb3JkZXJXb3Jkc0xUUih3b3Jkcyk7XG59XG5cbi8vIFByaXZhdGUgY2xhc3MgdG8gYXJyYW5nZSB0ZXh0IGxhYmVscyBpbnRvIG11bHRpcGxlIGxpbmVzIGJhc2VkIG9uXG4vLyBcInRleHQgd3JhcFwiIGFuZCBcIm1heCBsaW5lXCIgdmFsdWVzXG5jbGFzcyBNdWx0aUxpbmUge1xuICAgIGNvbnN0cnVjdG9yIChjb250ZXh0LCBtYXhfbGluZXMgPSBJbmZpbml0eSwgdGV4dF93cmFwID0gSW5maW5pdHkpIHtcbiAgICAgICAgdGhpcy53aWR0aCA9IDA7XG4gICAgICAgIHRoaXMuaGVpZ2h0ID0gMDtcbiAgICAgICAgdGhpcy5saW5lcyA9IFtdO1xuXG4gICAgICAgIHRoaXMuZWxsaXBzaXMgPSAnLi4uJztcbiAgICAgICAgdGhpcy5lbGxpcHNpc193aWR0aCA9IE1hdGguY2VpbChjb250ZXh0Lm1lYXN1cmVUZXh0KHRoaXMuZWxsaXBzaXMpLndpZHRoKTtcblxuICAgICAgICB0aGlzLm1heF9saW5lcyA9IG1heF9saW5lcztcbiAgICAgICAgdGhpcy50ZXh0X3dyYXAgPSB0ZXh0X3dyYXA7XG4gICAgICAgIHRoaXMuY29udGV4dCA9IGNvbnRleHQ7XG4gICAgfVxuXG4gICAgY3JlYXRlTGluZSAobGluZV9oZWlnaHQpe1xuICAgICAgICBpZiAodGhpcy5saW5lcy5sZW5ndGggPCB0aGlzLm1heF9saW5lcyl7XG4gICAgICAgICAgICByZXR1cm4gbmV3IExpbmUobGluZV9oZWlnaHQsIHRoaXMudGV4dF93cmFwKTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHB1c2ggKGxpbmUpe1xuICAgICAgICBpZiAodGhpcy5saW5lcy5sZW5ndGggPCB0aGlzLm1heF9saW5lcyl7XG4gICAgICAgICAgICAvLyBtZWFzdXJlIGxpbmUgd2lkdGhcbiAgICAgICAgICAgIGxldCBsaW5lX3dpZHRoID0gdGhpcy5jb250ZXh0Lm1lYXN1cmVUZXh0KGxpbmUudGV4dCkud2lkdGg7XG4gICAgICAgICAgICBsaW5lLndpZHRoID0gbGluZV93aWR0aDtcblxuICAgICAgICAgICAgaWYgKGxpbmVfd2lkdGggPiB0aGlzLndpZHRoKXtcbiAgICAgICAgICAgICAgICB0aGlzLndpZHRoID0gTWF0aC5jZWlsKGxpbmVfd2lkdGgpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBhZGQgdG8gbGluZXMgYW5kIGluY3JlbWVudCBoZWlnaHRcbiAgICAgICAgICAgIHRoaXMubGluZXMucHVzaChsaW5lKTtcbiAgICAgICAgICAgIHRoaXMuaGVpZ2h0ICs9IGxpbmUuaGVpZ2h0O1xuICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmFkZEVsbGlwc2lzKCk7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBwdXNoZXMgdG8gdGhlIGxpbmVzIGFycmF5IGFuZCByZXR1cm5zIGEgbmV3IGxpbmUgaWYgcG9zc2libGUgKGZhbHNlIG90aGVyd2lzZSlcbiAgICBhZHZhbmNlIChsaW5lLCBsaW5lX2hlaWdodCkge1xuICAgICAgICBsZXQgY2FuX3B1c2ggPSB0aGlzLnB1c2gobGluZSk7XG4gICAgICAgIGlmIChjYW5fcHVzaCl7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5jcmVhdGVMaW5lKGxpbmVfaGVpZ2h0KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGFkZEVsbGlwc2lzICgpe1xuICAgICAgICBsZXQgbGFzdF9saW5lID0gdGhpcy5saW5lc1t0aGlzLmxpbmVzLmxlbmd0aCAtIDFdO1xuXG4gICAgICAgIGxhc3RfbGluZS5hcHBlbmQodGhpcy5lbGxpcHNpcyk7XG4gICAgICAgIGxhc3RfbGluZS53aWR0aCArPSB0aGlzLmVsbGlwc2lzX3dpZHRoO1xuXG4gICAgICAgIGlmIChsYXN0X2xpbmUud2lkdGggPiB0aGlzLndpZHRoKSB7XG4gICAgICAgICAgICB0aGlzLndpZHRoID0gbGFzdF9saW5lLndpZHRoO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZmluaXNoIChsaW5lKXtcbiAgICAgICAgaWYgKGxpbmUpe1xuICAgICAgICAgICAgdGhpcy5wdXNoKGxpbmUpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgdGhpcy5hZGRFbGxpcHNpcygpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgc3RhdGljIHBhcnNlIChzdHIsIHRleHRfd3JhcCwgbWF4X2xpbmVzLCBsaW5lX2hlaWdodCwgY3R4KSB7XG4gICAgICAgIC8vIFdvcmQgd3JhcHBpbmdcbiAgICAgICAgLy8gTGluZSBicmVha3MgY2FuIGJlIGNhdXNlZCBieTpcbiAgICAgICAgLy8gIC0gaW1wbGljaXQgbGluZSBicmVhayB3aGVuIGEgbWF4aW11bSBjaGFyYWN0ZXIgdGhyZXNob2xkIGlzIGV4Y2VlZGVkIHBlciBsaW5lICh0ZXh0X3dyYXApXG4gICAgICAgIC8vICAtIGV4cGxpY2l0IGxpbmUgYnJlYWsgaW4gdGhlIGxhYmVsIHRleHQgKFxcbilcbiAgICAgICAgbGV0IHdvcmRzO1xuICAgICAgICBpZiAodHlwZW9mIHRleHRfd3JhcCA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgICAgIHdvcmRzID0gc3RyLnNwbGl0KCcgJyk7IC8vIHNwbGl0IHdvcmRzIG9uIHNwYWNlc1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgd29yZHMgPSBbc3RyXTsgLy8gbm8gbWF4IGxpbmUgd29yZCB3cmFwcGluZyAoYnV0IG5ldyBsaW5lcyB3aWxsIHN0aWxsIGJlIGluIGVmZmVjdClcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBtdWx0aWxpbmUgPSBuZXcgTXVsdGlMaW5lKGN0eCwgbWF4X2xpbmVzLCB0ZXh0X3dyYXApO1xuICAgICAgICBsZXQgbGluZSA9IG11bHRpbGluZS5jcmVhdGVMaW5lKGxpbmVfaGVpZ2h0KTtcblxuICAgICAgICAvLyBGaXJzdCBpdGVyYXRlIG9uIHNwYWNlLWJyZWFrIGdyb3VwcyAod2lsbCBiZSBvbmUgaWYgbWF4IGxpbmUgbGVuZ3RoIG9mZiksIHRoZW4gaXRlcmF0ZSBvbiBsaW5lLWJyZWFrIGdyb3Vwc1xuICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHdvcmRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBsZXQgYnJlYWtzID0gd29yZHNbaV0uc3BsaXQoJ1xcbicpOyAvLyBzcGxpdCBvbiBsaW5lIGJyZWFrc1xuICAgICAgICAgICAgbGV0IG5ld19saW5lID0gKGkgPT09IDApID8gdHJ1ZSA6IGZhbHNlO1xuXG4gICAgICAgICAgICBmb3IgKGxldCBuPTA7IG4gPCBicmVha3MubGVuZ3RoOyBuKyspIHtcbiAgICAgICAgICAgICAgICBpZiAoIWxpbmUpe1xuICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBsZXQgd29yZCA9IGJyZWFrc1tuXS50cmltKCk7XG5cbiAgICAgICAgICAgICAgICBpZiAoIXdvcmQpIHtcbiAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgbGV0IHNwYWNlZF93b3JkID0gKG5ld19saW5lKSA/IHdvcmQgOiAnICcgKyB3b3JkO1xuXG4gICAgICAgICAgICAgICAgLy8gaWYgYWRkaW5nIGN1cnJlbnQgd29yZCB3b3VsZCBvdmVyZmxvdywgYWRkIGEgbmV3IGxpbmUgaW5zdGVhZFxuICAgICAgICAgICAgICAgIC8vIGZpcnN0IHdvcmQgKGkgPT09IDApIGFsd2F5cyBhcHBlbmRzXG4gICAgICAgICAgICAgICAgaWYgKHRleHRfd3JhcCAmJiBpID4gMCAmJiBsaW5lLmV4Y2VlZHNUZXh0d3JhcChzcGFjZWRfd29yZCkpIHtcbiAgICAgICAgICAgICAgICAgICAgbGluZSA9IG11bHRpbGluZS5hZHZhbmNlKGxpbmUsIGxpbmVfaGVpZ2h0KTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCFsaW5lKXtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGxpbmUuYXBwZW5kKHdvcmQpO1xuICAgICAgICAgICAgICAgICAgICBuZXdfbGluZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICBsaW5lLmFwcGVuZChzcGFjZWRfd29yZCk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gaWYgbGluZSBicmVha3MgcHJlc2VudCwgYWRkIG5ldyBsaW5lICh1bmxlc3Mgb24gbGFzdCBsaW5lKVxuICAgICAgICAgICAgICAgIGlmIChuIDwgYnJlYWtzLmxlbmd0aCAtIDEpIHtcbiAgICAgICAgICAgICAgICAgICAgbGluZSA9IG11bHRpbGluZS5hZHZhbmNlKGxpbmUsIGxpbmVfaGVpZ2h0KTtcbiAgICAgICAgICAgICAgICAgICAgbmV3X2xpbmUgPSB0cnVlO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGkgPT09IHdvcmRzLmxlbmd0aCAtIDEpe1xuICAgICAgICAgICAgICAgIG11bHRpbGluZS5maW5pc2gobGluZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIG11bHRpbGluZTtcbiAgICB9XG59XG5cbi8vIEEgUHJpdmF0ZSBjbGFzcyB1c2VkIGJ5IE11bHRpTGluZSB0byBjb250YWluIHRoZSBsb2dpYyBmb3IgYSBzaW5nbGUgbGluZVxuLy8gaW5jbHVkaW5nIGNoYXJhY3RlciBjb3VudCwgd2lkdGgsIGhlaWdodCBhbmQgdGV4dFxuY2xhc3MgTGluZSB7XG4gICAgY29uc3RydWN0b3IgKGhlaWdodCA9IDAsIHRleHRfd3JhcCA9IDApe1xuICAgICAgICB0aGlzLmNoYXJzID0gMDtcbiAgICAgICAgdGhpcy50ZXh0ID0gJyc7XG5cbiAgICAgICAgdGhpcy5oZWlnaHQgPSBNYXRoLmNlaWwoaGVpZ2h0KTtcbiAgICAgICAgdGhpcy50ZXh0X3dyYXAgPSB0ZXh0X3dyYXA7XG4gICAgfVxuXG4gICAgYXBwZW5kICh0ZXh0KXtcbiAgICAgICAgdGhpcy5jaGFycyArPSB0ZXh0Lmxlbmd0aDtcbiAgICAgICAgdGhpcy50ZXh0ICs9IHRleHQ7XG4gICAgfVxuXG4gICAgZXhjZWVkc1RleHR3cmFwICh0ZXh0KXtcbiAgICAgICAgcmV0dXJuIHRleHQubGVuZ3RoICsgdGhpcy5jaGFycyA+IHRoaXMudGV4dF93cmFwO1xuICAgIH1cbn1cbiIsIi8qIGdsb2JhbCBGb250RmFjZSAqL1xuaW1wb3J0IGxvZyBmcm9tICcuLi8uLi91dGlscy9sb2cnO1xuaW1wb3J0IFV0aWxzIGZyb20gJy4uLy4uL3V0aWxzL3V0aWxzJztcbmltcG9ydCBGb250RmFjZU9ic2VydmVyIGZyb20gJ2ZvbnRmYWNlb2JzZXJ2ZXInO1xuXG5jb25zdCBGb250TWFuYWdlciA9IHtcblxuICAgIC8vIEZvbnQgZGV0ZWN0aW9uXG4gICAgZm9udHNfbG9hZGVkOiBQcm9taXNlLnJlc29sdmUoKSwgLy8gcmVzb2x2ZXMgd2hlbiBhbGwgcmVxdWVzdGVkIGZvbnRzIGhhdmUgYmVlbiBkZXRlY3RlZFxuXG4gICAgLy8gTG9hZCBzZXQgb2YgY3VzdG9tIGZvbnQgZmFjZXNcbiAgICAvLyBgZm9udHNgIGlzIGFuIG9iamVjdCB3aGVyZSB0aGUga2V5IGlzIGEgZm9udCBmYW1pbHkgbmFtZSwgYW5kIHRoZSB2YWx1ZSBpcyBvbmUgb3IgbW9yZSBmb250IGZhY2VcbiAgICAvLyBkZWZpbml0aW9ucy4gVGhlIHZhbHVlIGNhbiBiZSBlaXRoZXIgYSBzaW5nbGUgb2JqZWN0LCBvciBhbiBhcnJheSBvZiBzdWNoIG9iamVjdHMuXG4gICAgLy8gSWYgdGhlIHNwZWNpYWwgc3RyaW5nIHZhbHVlICdleHRlcm5hbCcgaXMgdXNlZCwgaXQgaW5kaWNhdGVzIHRoZSB0aGUgZm9udCB3aWxsIGJlIGxvYWRlZCB2aWEgZXh0ZXJuYWwgQ1NTLlxuICAgIGxvYWRGb250cyAoZm9udHMpIHtcbiAgICAgICAgaWYgKGZvbnRzKSB7XG4gICAgICAgICAgICBsZXQgcXVldWUgPSBbXTtcbiAgICAgICAgICAgIGZvciAobGV0IGZhbWlseSBpbiBmb250cykge1xuICAgICAgICAgICAgICAgIGlmIChBcnJheS5pc0FycmF5KGZvbnRzW2ZhbWlseV0pKSB7XG4gICAgICAgICAgICAgICAgICAgIGZvbnRzW2ZhbWlseV0uZm9yRWFjaChmYWNlID0+IHF1ZXVlLnB1c2godGhpcy5sb2FkRm9udEZhY2UoZmFtaWx5LCBmYWNlKSkpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgcXVldWUucHVzaCh0aGlzLmxvYWRGb250RmFjZShmYW1pbHksIGZvbnRzW2ZhbWlseV0pKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMuZm9udHNfbG9hZGVkID0gUHJvbWlzZS5hbGwocXVldWUuZmlsdGVyKHggPT4geCkpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLmZvbnRzX2xvYWRlZDtcbiAgICB9LFxuXG4gICAgLy8gTG9hZCBhIHNpbmdsZSBmb250IGZhY2VcbiAgICAvLyBgZmFjZWAgY29udGFpbnMgdGhlIGZvbnQgZmFjZSBkZWZpbml0aW9uLCB3aXRoIG9wdGlvbmFsIHBhcmFtZXRlcnMgZm9yIGB3ZWlnaHRgLCBgc3R5bGVgLCBhbmQgYHVybGAuXG4gICAgLy8gSWYgdGhlIGB1cmxgIGlzIGRlZmluZWQsIHRoZSBmb250IGlzIGluamVjdGVkIGludG8gdGhlIGRvY3VtZW50IGFzIGEgQ1NTIGZvbnQtZmFjZS5cbiAgICAvLyBJZiB0aGUgb2JqZWN0J3MgdmFsdWUgaXMgdGhlIHNwZWNpYWwgc3RyaW5nICdleHRlcm5hbCcsIG9yIGlmIG5vIGB1cmxgIGlzIGRlZmluZWQsIHRoZW4gdGhlIGZvbnQgZmFjZVxuICAgIC8vIGlzIGFzc3VtZWQgaXMgYXNzdW1lZCB0byBiZWVuIGxvYWRlZCB2aWEgZXh0ZXJuYWwgQ1NTLiBJbiBlaXRoZXIgY2FzZSwgdGhlIGZ1bmN0aW9uIHJldHVybnMgYSBwcm9taXNlXG4gICAgLy8gdGhhdCByZXNvbHZlcyB3aGVuIHRoZSBmb250IGZhY2UgaGFzIGxvYWRlZCwgb3IgdGltZXMgb3V0LlxuICAgIGxvYWRGb250RmFjZSAoZmFtaWx5LCBmYWNlKSB7XG4gICAgICAgIGlmIChmYWNlID09IG51bGwgfHwgKHR5cGVvZiBmYWNlICE9PSAnb2JqZWN0JyAmJiBmYWNlICE9PSAnZXh0ZXJuYWwnKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IG9wdGlvbnMgPSB7IGZhbWlseSB9O1xuICAgICAgICBsZXQgaW5qZWN0ID0gUHJvbWlzZS5yZXNvbHZlKCk7XG5cbiAgICAgICAgaWYgKHR5cGVvZiBmYWNlID09PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgT2JqZWN0LmFzc2lnbihvcHRpb25zLCBmYWNlKTtcblxuICAgICAgICAgICAgLy8gSWYgVVJMIGlzIGRlZmluZWQsIGluamVjdCBmb250IGludG8gZG9jdW1lbnRcbiAgICAgICAgICAgIGlmICh0eXBlb2YgZmFjZS51cmwgPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgaW5qZWN0ID0gdGhpcy5pbmplY3RGb250RmFjZShvcHRpb25zKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFdhaXQgZm9yIGZvbnQgdG8gbG9hZFxuICAgICAgICBsZXQgb2JzZXJ2ZXIgPSBuZXcgRm9udEZhY2VPYnNlcnZlcihmYW1pbHksIG9wdGlvbnMpO1xuICAgICAgICByZXR1cm4gaW5qZWN0LnRoZW4oKCkgPT4gb2JzZXJ2ZXIubG9hZCgpKS50aGVuKFxuICAgICAgICAgICAgKCkgPT4ge1xuICAgICAgICAgICAgICAgIC8vIFByb21pc2UgcmVzb2x2ZXMsIGZvbnQgaXMgYXZhaWxhYmxlXG4gICAgICAgICAgICAgICAgbG9nKCdkZWJ1ZycsIGBGb250IGZhY2UgJyR7ZmFtaWx5fScgaXMgYXZhaWxhYmxlYCwgb3B0aW9ucyk7XG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgKCkgPT4ge1xuICAgICAgICAgICAgICAgIC8vIFByb21pc2UgcmVqZWN0cywgZm9udCBpcyBub3QgYXZhaWxhYmxlXG4gICAgICAgICAgICAgICAgbG9nKCdkZWJ1ZycsIGBGb250IGZhY2UgJyR7ZmFtaWx5fScgaXMgTk9UIGF2YWlsYWJsZWAsIG9wdGlvbnMpO1xuICAgICAgICAgICAgfVxuICAgICAgICApO1xuICAgIH0sXG5cbiAgICAvLyBMb2FkcyBhIGZvbnQgZmFjZSB2aWEgZWl0aGVyIHRoZSBuYXRpdmUgRm9udEZhY2UgQVBJLCBvciBDU1MgaW5qZWN0aW9uXG4gICAgLy8gVE9ETzogY29uc2lkZXIgc3VwcG9ydCBmb3IgbXVsdGlwbGUgZm9ybWF0IFVSTHMgcGVyIGZhY2UsIHVuaWNvZGUgcmFuZ2VzXG4gICAgaW5qZWN0Rm9udEZhY2UgKHsgZmFtaWx5LCB1cmwsIHdlaWdodCwgc3R5bGUgfSkge1xuICAgICAgICBpZiAodGhpcy5zdXBwb3J0c19uYXRpdmVfZm9udF9sb2FkaW5nID09PSB1bmRlZmluZWQpIHtcbiAgICAgICAgICAgIHRoaXMuc3VwcG9ydHNfbmF0aXZlX2ZvbnRfbG9hZGluZyA9ICh3aW5kb3cuRm9udEZhY2UgIT09IHVuZGVmaW5lZCk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDb252ZXJ0IGJsb2IgVVJMcywgZGVwZW5kaW5nIG9uIHdoZXRoZXIgdGhlIG5hdGl2ZSBGb250RmFjZSBBUEkgd2lsbCBiZSB1c2VkIG9yIG5vdC5cbiAgICAgICAgLy9cbiAgICAgICAgLy8gV2hlbiB0aGUgRm9udEZhY2UgQVBJICppcyogc3VwcG9ydGVkLCB0aGUgYmxvYiBVUkwgaXMgcmVhZCBpbnRvIGEgcmF3IGRhdGEgYXJyYXkuXG4gICAgICAgIC8vIE5COiBpdCdzIGluZWZmaWNpZW50IHRvIGJlIGNvbnZlcnRpbmcgYmxvYiBVUkxzIGludG8gdHlwZWQgYXJyYXlzIGhlcmUsIHNpbmNlIHRoZXkgb3JpZ2luYXRlZFxuICAgICAgICAvLyBhcyByYXcgZGF0YSAqYmVmb3JlKiB0aGV5IHdlcmUgY29udmVydGVkIGludG8gYmxvYiBVUkxzLiBIb3dldmVyLCB0aGlzIHByb2Nlc3Mgc2hvdWxkIGJlIGZhc3Qgc2luY2VcbiAgICAgICAgLy8gdGhlc2UgYXJlIG5hdGl2ZSBicm93c2VyIGZ1bmN0aW9ucyBhbmQgYWxsIGRhdGEgaXMgbG9jYWwgKG5vIG5ldHdvcmsgcmVxdWVzdCksIGFuZCBpdCBrZWVwcyB0aGVcbiAgICAgICAgLy8gbG9naWMgc3RyZWFtbGluZWQgYnkgYWxsb3dpbmcgdXMgdG8gY29udGludWUgdG8gdXNlIGEgVVJMLWJhc2VkIGludGVyZmFjZSBmb3IgYWxsIHNjZW5lIHJlc291cmNlcy5cbiAgICAgICAgLy9cbiAgICAgICAgLy8gV2hlbiB0aGUgRm9udEZhY2UgQVBJIGlzICpub3QqIHN1cHBvcnRlZCwgdGhlIGJsb2IgVVJMIGRhdGEgaXMgY29udmVydGVkIHRvIGEgYmFzZTY0IGRhdGEgVVJMLlxuICAgICAgICAvLyBUaGlzIGF2b2lkcyBzZWN1cml0eSByZXN0cmljaW9ucyBpbiBzb21lIGJyb3dzZXJzLlxuICAgICAgICAvLyBBbHNvIHNlZSBodHRwczovL2dpdGh1Yi5jb20vYnJhbXN0ZWluL2ZvbnRsb2FkZXIvYmxvYi81OThlOTM5OTExN2JkYzk0NmZmNzg2ZmEyYzUwMDdhNmJkN2QzYjllL3NyYy9mb250ZmFjZS5qcyNMMTQ1LUwxNTNcbiAgICAgICAgbGV0IHByZXByb2Nlc3MgPSBQcm9taXNlLnJlc29sdmUodXJsKTtcbiAgICAgICAgaWYgKHVybC5zbGljZSgwLCA1KSA9PT0gJ2Jsb2I6Jykge1xuICAgICAgICAgICAgcHJlcHJvY2VzcyA9IFV0aWxzLmlvKHVybCwgNjAwMDAsICdhcnJheWJ1ZmZlcicpLnRoZW4oZGF0YSA9PiB7XG4gICAgICAgICAgICAgICAgbGV0IGJ5dGVzID0gbmV3IFVpbnQ4QXJyYXkoZGF0YSk7XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuc3VwcG9ydHNfbmF0aXZlX2ZvbnRfbG9hZGluZykge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gYnl0ZXM7IC8vIHVzZSByYXcgYmluYXJ5IGRhdGFcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIGxldCBzdHIgPSAnJztcbiAgICAgICAgICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBieXRlcy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgc3RyICs9IFN0cmluZy5mcm9tQ2hhckNvZGUoYnl0ZXNbaV0pO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiAnZGF0YTpmb250L29wZW50eXBlO2Jhc2U2NCwnICsgYnRvYShzdHIpOyAvLyBiYXNlNjQgZW5jb2RlIGFzIGRhdGEgVVJMXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gcHJlcHJvY2Vzcy50aGVuKGRhdGEgPT4ge1xuICAgICAgICAgICAgaWYgKHRoaXMuc3VwcG9ydHNfbmF0aXZlX2ZvbnRfbG9hZGluZykge1xuICAgICAgICAgICAgICAgIC8vIFVzZSBuYXRpdmUgRm9udEZhY2UgQVBJXG4gICAgICAgICAgICAgICAgbGV0IGZhY2U7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBkYXRhID09PSAnc3RyaW5nJykgeyAvLyBhZGQgYXMgVVJMXG4gICAgICAgICAgICAgICAgICAgIGZhY2UgPSBuZXcgRm9udEZhY2UoZmFtaWx5LCBgdXJsKCR7ZW5jb2RlVVJJKGRhdGEpfSlgLCB7IHdlaWdodCwgc3R5bGUgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGVsc2UgaWYgKGRhdGEgaW5zdGFuY2VvZiBVaW50OEFycmF5KSB7IC8vIGFkZCBhcyBiaW5hcnkgZGF0YVxuICAgICAgICAgICAgICAgICAgICBmYWNlID0gbmV3IEZvbnRGYWNlKGZhbWlseSwgZGF0YSwgeyB3ZWlnaHQsIHN0eWxlIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBkb2N1bWVudC5mb250cy5hZGQoZmFjZSk7XG4gICAgICAgICAgICAgICAgbG9nKCd0cmFjZScsICdBZGRpbmcgRm9udEZhY2UgdG8gZG9jdW1lbnQuZm9udHM6JywgZmFjZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBVc2UgQ1NTIGluamVjdGlvblxuICAgICAgICAgICAgICAgIGxldCBjc3MgPSBgXG4gICAgICAgICAgICAgICAgICAgIEBmb250LWZhY2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgZm9udC1mYW1pbHk6ICcke2ZhbWlseX0nO1xuICAgICAgICAgICAgICAgICAgICAgICAgZm9udC13ZWlnaHQ6ICR7d2VpZ2h0IHx8ICdub3JtYWwnfTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZvbnQtc3R5bGU6ICR7c3R5bGUgfHwgJ25vcm1hbCd9O1xuICAgICAgICAgICAgICAgICAgICAgICAgc3JjOiB1cmwoJHtlbmNvZGVVUkkoZGF0YSl9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGA7XG5cbiAgICAgICAgICAgICAgICBsZXQgc3R5bGVfZWwgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdzdHlsZScpO1xuICAgICAgICAgICAgICAgIHN0eWxlX2VsLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKFwiXCIpKTtcbiAgICAgICAgICAgICAgICBkb2N1bWVudC5oZWFkLmFwcGVuZENoaWxkKHN0eWxlX2VsKTtcbiAgICAgICAgICAgICAgICBzdHlsZV9lbC5zaGVldC5pbnNlcnRSdWxlKGNzcywgMCk7XG4gICAgICAgICAgICAgICAgbG9nKCd0cmFjZScsICdJbmplY3RpbmcgQ1NTIGZvbnQgZmFjZTonLCBjc3MpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcbiAgICB9XG5cbn07XG5cbmV4cG9ydCBkZWZhdWx0IEZvbnRNYW5hZ2VyO1xuIiwiLy8gVGV4dCByZW5kZXJpbmcgc3R5bGVcblxuaW1wb3J0IEdlbyBmcm9tICcuLi8uLi9nZW8nO1xuaW1wb3J0IHtTdHlsZX0gZnJvbSAnLi4vc3R5bGUnO1xuaW1wb3J0IHtQb2ludHN9IGZyb20gJy4uL3BvaW50cy9wb2ludHMnO1xuaW1wb3J0IENvbGxpc2lvbiBmcm9tICcuLi8uLi9sYWJlbHMvY29sbGlzaW9uJztcbmltcG9ydCBMYWJlbFBvaW50IGZyb20gJy4uLy4uL2xhYmVscy9sYWJlbF9wb2ludCc7XG5pbXBvcnQgTGFiZWxMaW5lIGZyb20gJy4uLy4uL2xhYmVscy9sYWJlbF9saW5lJztcblxuZXhwb3J0IGxldCBUZXh0U3R5bGUgPSBPYmplY3QuY3JlYXRlKFBvaW50cyk7XG5cbk9iamVjdC5hc3NpZ24oVGV4dFN0eWxlLCB7XG4gICAgbmFtZTogJ3RleHQnLFxuICAgIHN1cGVyOiBQb2ludHMsXG4gICAgYnVpbHRfaW46IHRydWUsXG5cbiAgICBpbml0KCkge1xuICAgICAgICB0aGlzLnN1cGVyLmluaXQuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcblxuICAgICAgICAvLyBQb2ludCBzdHlsZSAocGFyZW50IGNsYXNzKSByZXF1aXJlcyB0ZXh0dXJpbmcgdG8gYmUgdHVybmVkIG9uXG4gICAgICAgIC8vIChsYWJlbHMgYXJlIGFsd2F5cyBkcmF3biB3aXRoIHRleHR1cmVzKVxuICAgICAgICB0aGlzLmRlZmluZXMuVEFOR1JBTV9QT0lOVF9URVhUVVJFID0gdHJ1ZTtcblxuICAgICAgICAvLyBEaXNhYmxlIGR1YWwgcG9pbnQvdGV4dCBtb2RlXG4gICAgICAgIHRoaXMuZGVmaW5lcy5UQU5HUkFNX01VTFRJX1NBTVBMRVIgPSBmYWxzZTtcblxuICAgICAgICAvLyBNYW51YWxseSB1bi1tdWx0aXBseSBhbHBoYSwgYmVjYXVzZSBDYW52YXMgdGV4dCByYXN0ZXJpemF0aW9uIGlzIHByZS1tdWx0aXBsaWVkXG4gICAgICAgIHRoaXMuZGVmaW5lcy5UQU5HUkFNX1VOTVVMVElQTFlfQUxQSEEgPSB0cnVlO1xuXG4gICAgICAgIC8vIEZhZGUgb3V0IHRleHQgd2hlbiB0aWxlIGlzIHpvb21pbmcgb3V0LCBlLmcuIGFjdGluZyBhcyBwcm94eSB0aWxlc1xuICAgICAgICB0aGlzLmRlZmluZXMuVEFOR1JBTV9GQURFX09OX1pPT01fT1VUID0gdHJ1ZTtcbiAgICAgICAgdGhpcy5kZWZpbmVzLlRBTkdSQU1fRkFERV9PTl9aT09NX09VVF9SQVRFID0gMjsgLy8gZmFkZSBhdCAyeCwgZS5nLiBmdWxseSB0cmFuc3BhcmVudCBhdCAwLjUgem9vbSBsZXZlbCBhd2F5XG5cbiAgICAgICAgdGhpcy5yZXNldCgpO1xuICAgIH0sXG5cbiAgICByZXNldCgpIHtcbiAgICAgICAgdGhpcy5xdWV1ZXMgPSB7fTtcbiAgICAgICAgdGhpcy5yZXNldFRleHQoKTtcbiAgICB9LFxuXG4gICAgLy8gT3ZlcnJpZGUgdG8gcXVldWUgZmVhdHVyZXMgaW5zdGVhZCBvZiBwcm9jZXNzaW5nIGltbWVkaWF0ZWx5XG4gICAgYWRkRmVhdHVyZSAoZmVhdHVyZSwgZHJhdywgY29udGV4dCkge1xuICAgICAgICBsZXQgdGlsZSA9IGNvbnRleHQudGlsZTtcbiAgICAgICAgaWYgKHRpbGUuZ2VuZXJhdGlvbiAhPT0gdGhpcy5nZW5lcmF0aW9uKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDYWxsZWQgaGVyZSBiZWNhdXNlIG90aGVyd2lzZSBpdCB3aWxsIGJlIGRlbGF5ZWQgdW50aWwgdGhlIGZlYXR1cmUgcXVldWUgaXMgcGFyc2VkLFxuICAgICAgICAvLyBhbmQgd2Ugd2FudCB0aGUgcHJlcHJvY2Vzc2luZyBkb25lIGJlZm9yZSB3ZSBldmFsdWF0ZSB0ZXh0IHN0eWxlIGJlbG93XG4gICAgICAgIGRyYXcgPSB0aGlzLnByZXByb2Nlc3MoZHJhdyk7XG4gICAgICAgIGlmICghZHJhdykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHR5cGUgPSBmZWF0dXJlLmdlb21ldHJ5LnR5cGU7XG4gICAgICAgIGRyYXcuY2FuX2FydGljdWxhdGUgPSAodHlwZSA9PT0gXCJMaW5lU3RyaW5nXCIgfHwgdHlwZSA9PT0gXCJNdWx0aUxpbmVTdHJpbmdcIik7XG5cbiAgICAgICAgbGV0IHEgPSB0aGlzLnBhcnNlVGV4dEZlYXR1cmUoZmVhdHVyZSwgZHJhdywgY29udGV4dCwgdGlsZSk7XG4gICAgICAgIGlmICghcSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgcS5mZWF0dXJlID0gZmVhdHVyZTtcbiAgICAgICAgcS5jb250ZXh0ID0gY29udGV4dDtcbiAgICAgICAgcS5sYXlvdXQudmVydGV4ID0gZmFsc2U7IC8vIHZlcnRleCBwbGFjZW1lbnQgb3B0aW9uIG5vdCBhcHBsaWNhYmxlIHRvIHN0YW5kYWxvbmUgbGFiZWxzXG5cbiAgICAgICAgLy8gUXVldWUgdGhlIGZlYXR1cmUgZm9yIHByb2Nlc3NpbmdcbiAgICAgICAgaWYgKCF0aGlzLnRpbGVfZGF0YVt0aWxlLmtleV0pIHtcbiAgICAgICAgICAgIHRoaXMuc3RhcnREYXRhKHRpbGUpO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMucXVldWVzW3RpbGUua2V5XS5wdXNoKHEpO1xuXG4gICAgICAgIC8vIFJlZ2lzdGVyIHdpdGggY29sbGlzaW9uIG1hbmFnZXJcbiAgICAgICAgQ29sbGlzaW9uLmFkZFN0eWxlKHRoaXMubmFtZSwgdGlsZS5rZXkpO1xuICAgIH0sXG5cbiAgICAvLyBPdmVycmlkZVxuICAgIHN0YXJ0RGF0YSAodGlsZSkge1xuICAgICAgICB0aGlzLnF1ZXVlc1t0aWxlLmtleV0gPSBbXTtcbiAgICAgICAgcmV0dXJuIFN0eWxlLnN0YXJ0RGF0YS5jYWxsKHRoaXMsIHRpbGUpO1xuICAgIH0sXG5cbiAgICAvLyBPdmVycmlkZVxuICAgIGVuZERhdGEgKHRpbGUpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucHJlcGFyZVRleHRMYWJlbHModGlsZSwgdGhpcy5uYW1lLCB0aGlzLnF1ZXVlc1t0aWxlLmtleV0pLlxuICAgICAgICAgICAgdGhlbihsYWJlbHMgPT4gdGhpcy5jb2xsaWRlQW5kUmVuZGVyVGV4dExhYmVscyh0aWxlLCB0aGlzLm5hbWUsIGxhYmVscykpLlxuICAgICAgICAgICAgdGhlbigoeyBsYWJlbHMsIHRleHRzLCB0ZXh0dXJlIH0pID0+IHtcbiAgICAgICAgICAgICAgICBpZiAodGV4dHMpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy50ZXh0c1t0aWxlLmtleV0gPSB0ZXh0cztcblxuICAgICAgICAgICAgICAgICAgICAvLyBCdWlsZCBxdWV1ZWQgZmVhdHVyZXNcbiAgICAgICAgICAgICAgICAgICAgbGFiZWxzLmZvckVhY2gocSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgdGV4dF9zZXR0aW5nc19rZXkgPSBxLnRleHRfc2V0dGluZ3Nfa2V5O1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHRleHRfaW5mbyA9XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy50ZXh0c1t0aWxlLmtleV1bdGV4dF9zZXR0aW5nc19rZXldICYmXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy50ZXh0c1t0aWxlLmtleV1bdGV4dF9zZXR0aW5nc19rZXldW3EudGV4dF07XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNldHVwIHN0eWxpbmcgb2JqZWN0IGV4cGVjdGVkIGJ5IFN0eWxlIGNsYXNzXG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgc3R5bGUgPSB0aGlzLmZlYXR1cmVfc3R5bGU7XG4gICAgICAgICAgICAgICAgICAgICAgICBzdHlsZS5sYWJlbCA9IHEubGFiZWw7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0ZXh0X2luZm8udGV4dF9zZXR0aW5ncy5jYW5fYXJ0aWN1bGF0ZSl7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdW5wYWNrIGxvZ2ljYWwgc2l6ZXMgb2YgZWFjaCBzZWdtZW50IGludG8gYW4gYXJyYXkgZm9yIHRoZSBzdHlsZVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlLnNpemUgPSB0ZXh0X2luZm8uc2l6ZS5tYXAoZnVuY3Rpb24oc2l6ZSl7IHJldHVybiBzaXplLmxvZ2ljYWxfc2l6ZTsgfSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGUudGV4Y29vcmRzID0gdGV4dF9pbmZvLnRleGNvb3JkcztcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlLnNpemUgPSB0ZXh0X2luZm8uc2l6ZS5sb2dpY2FsX3NpemU7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGUuYW5nbGUgPSBxLmxhYmVsLmFuZ2xlIHx8IDA7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3R5bGUudGV4Y29vcmRzID0gdGV4dF9pbmZvLmFsaWduW3EubGFiZWwuYWxpZ25dLnRleGNvb3JkcztcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgU3R5bGUuYWRkRmVhdHVyZS5jYWxsKHRoaXMsIHEuZmVhdHVyZSwgcS5kcmF3LCBxLmNvbnRleHQpO1xuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgdGhpcy5mcmVlVGV4dCh0aWxlKTtcblxuICAgICAgICAgICAgICAgIC8vIEZpbmlzaCB0aWxlIG1lc2hcbiAgICAgICAgICAgICAgICByZXR1cm4gU3R5bGUuZW5kRGF0YS5jYWxsKHRoaXMsIHRpbGUpLnRoZW4odGlsZV9kYXRhID0+IHtcbiAgICAgICAgICAgICAgICAgICAgLy8gQXR0YWNoIHRpbGUtc3BlY2lmaWMgbGFiZWwgYXRsYXMgdG8gbWVzaCBhcyBhIHRleHR1cmUgdW5pZm9ybVxuICAgICAgICAgICAgICAgICAgICBpZiAodGV4dHVyZSAmJiB0aWxlX2RhdGEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRpbGVfZGF0YS51bmlmb3Jtcy51X3RleHR1cmUgPSB0ZXh0dXJlO1xuICAgICAgICAgICAgICAgICAgICAgICAgdGlsZV9kYXRhLnRleHR1cmVzLnB1c2godGV4dHVyZSk7IC8vIGFzc2lnbiB0ZXh0dXJlIG93bmVyc2hpcCB0byB0aWxlXG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGlsZV9kYXRhO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICB9LFxuXG4gICAgLy8gU2V0cyB1cCBjYWNoaW5nIGZvciBkcmF3IHByb3BlcnRpZXNcbiAgICBfcHJlcHJvY2VzcyAoZHJhdykge1xuICAgICAgICByZXR1cm4gdGhpcy5wcmVwcm9jZXNzVGV4dChkcmF3KTtcbiAgICB9LFxuXG4gICAgLy8gSW1wbGVtZW50cyBsYWJlbCBidWlsZGluZyBmb3IgVGV4dExhYmVscyBtaXhpblxuICAgIGJ1aWxkVGV4dExhYmVscyAodGlsZV9rZXksIGZlYXR1cmVfcXVldWUpIHtcbiAgICAgICAgbGV0IGxhYmVscyA9IFtdO1xuICAgICAgICBmb3IgKGxldCBmPTA7IGYgPCBmZWF0dXJlX3F1ZXVlLmxlbmd0aDsgZisrKSB7XG4gICAgICAgICAgICBsZXQgZnEgPSBmZWF0dXJlX3F1ZXVlW2ZdO1xuICAgICAgICAgICAgbGV0IHRleHRfaW5mbyA9IHRoaXMudGV4dHNbdGlsZV9rZXldW2ZxLnRleHRfc2V0dGluZ3Nfa2V5XVtmcS50ZXh0XTtcbiAgICAgICAgICAgIGxldCBmZWF0dXJlX2xhYmVscztcbiAgICAgICAgICAgIGlmICh0ZXh0X2luZm8udGV4dF9zZXR0aW5ncy5jYW5fYXJ0aWN1bGF0ZSl7XG4gICAgICAgICAgICAgICAgdmFyIHNpemVzID0gdGV4dF9pbmZvLnNpemUubWFwKGZ1bmN0aW9uKHNpemUpeyByZXR1cm4gc2l6ZS5jb2xsaXNpb25fc2l6ZTsgfSk7XG4gICAgICAgICAgICAgICAgZnEubGF5b3V0LnNwYWNlX3dpZHRoID0gdGV4dF9pbmZvLnNwYWNlX3dpZHRoO1xuICAgICAgICAgICAgICAgIGZlYXR1cmVfbGFiZWxzID0gdGhpcy5idWlsZExhYmVscyhzaXplcywgZnEuZmVhdHVyZS5nZW9tZXRyeSwgZnEubGF5b3V0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGZlYXR1cmVfbGFiZWxzID0gdGhpcy5idWlsZExhYmVscyh0ZXh0X2luZm8uc2l6ZS5jb2xsaXNpb25fc2l6ZSwgZnEuZmVhdHVyZS5nZW9tZXRyeSwgZnEubGF5b3V0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgZmVhdHVyZV9sYWJlbHMubGVuZ3RoOyBpKyspIHtcbiAgICAgICAgICAgICAgICBsZXQgZnFsID0gT2JqZWN0LmNyZWF0ZShmcSk7XG4gICAgICAgICAgICAgICAgZnFsLmxhYmVsID0gZmVhdHVyZV9sYWJlbHNbaV07XG4gICAgICAgICAgICAgICAgbGFiZWxzLnB1c2goZnFsKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gbGFiZWxzO1xuICAgIH0sXG5cbiAgICAvLyBCdWlsZHMgb25lIG9yIG1vcmUgbGFiZWxzIGZvciBhIGdlb21ldHJ5XG4gICAgYnVpbGRMYWJlbHMgKHNpemUsIGdlb21ldHJ5LCBsYXlvdXQpIHtcbiAgICAgICAgbGV0IGxhYmVscyA9IFtdO1xuXG4gICAgICAgIGlmIChnZW9tZXRyeS50eXBlID09PSBcIkxpbmVTdHJpbmdcIikge1xuICAgICAgICAgICAgdGhpcy5idWlsZExpbmVMYWJlbHMoZ2VvbWV0cnkuY29vcmRpbmF0ZXMsIHNpemUsIGxheW91dCwgbGFiZWxzKTtcbiAgICAgICAgfSBlbHNlIGlmIChnZW9tZXRyeS50eXBlID09PSBcIk11bHRpTGluZVN0cmluZ1wiKSB7XG4gICAgICAgICAgICBsZXQgbGluZXMgPSBnZW9tZXRyeS5jb29yZGluYXRlcztcbiAgICAgICAgICAgIGZvciAobGV0IGkgPSAwOyBpIDwgbGluZXMubGVuZ3RoOyArK2kpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmJ1aWxkTGluZUxhYmVscyhsaW5lc1tpXSwgc2l6ZSwgbGF5b3V0LCBsYWJlbHMpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9IGVsc2UgaWYgKGdlb21ldHJ5LnR5cGUgPT09IFwiUG9pbnRcIikge1xuICAgICAgICAgICAgbGFiZWxzLnB1c2gobmV3IExhYmVsUG9pbnQoZ2VvbWV0cnkuY29vcmRpbmF0ZXMsIHNpemUsIGxheW91dCkpO1xuICAgICAgICB9IGVsc2UgaWYgKGdlb21ldHJ5LnR5cGUgPT09IFwiTXVsdGlQb2ludFwiKSB7XG4gICAgICAgICAgICBsZXQgcG9pbnRzID0gZ2VvbWV0cnkuY29vcmRpbmF0ZXM7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHBvaW50cy5sZW5ndGg7ICsraSkge1xuICAgICAgICAgICAgICAgIGxhYmVscy5wdXNoKG5ldyBMYWJlbFBvaW50KHBvaW50c1tpXSwgc2l6ZSwgbGF5b3V0KSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gZWxzZSBpZiAoZ2VvbWV0cnkudHlwZSA9PT0gXCJQb2x5Z29uXCIpIHtcbiAgICAgICAgICAgIGxldCBjZW50cm9pZCA9IEdlby5jZW50cm9pZChnZW9tZXRyeS5jb29yZGluYXRlcyk7XG4gICAgICAgICAgICBsYWJlbHMucHVzaChuZXcgTGFiZWxQb2ludChjZW50cm9pZCwgc2l6ZSwgbGF5b3V0KSk7XG4gICAgICAgIH0gZWxzZSBpZiAoZ2VvbWV0cnkudHlwZSA9PT0gXCJNdWx0aVBvbHlnb25cIikge1xuICAgICAgICAgICAgbGV0IGNlbnRyb2lkID0gR2VvLm11bHRpQ2VudHJvaWQoZ2VvbWV0cnkuY29vcmRpbmF0ZXMpO1xuICAgICAgICAgICAgbGFiZWxzLnB1c2gobmV3IExhYmVsUG9pbnQoY2VudHJvaWQsIHNpemUsIGxheW91dCkpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGxhYmVscztcbiAgICB9LFxuXG4gICAgLy8gQnVpbGQgb25lIG9yIG1vcmUgbGFiZWxzIGZvciBhIGxpbmUgZ2VvbWV0cnlcbiAgICBidWlsZExpbmVMYWJlbHMgKGxpbmUsIHNpemUsIGxheW91dCwgbGFiZWxzKSB7XG4gICAgICAgIGxldCBzdWJkaXYgPSBNYXRoLm1pbihsYXlvdXQuc3ViZGl2LCBsaW5lLmxlbmd0aCAtIDEpO1xuICAgICAgICBpZiAoc3ViZGl2ID4gMSkge1xuICAgICAgICAgICAgLy8gQ3JlYXRlIG11bHRpcGxlIGxhYmVscyBmb3IgbGluZSwgd2l0aCBlYWNoIGFsbG90dGVkIGEgcmFuZ2Ugb2Ygc2VnbWVudHNcbiAgICAgICAgICAgIC8vIGluIHdoaWNoIGl0IHdpbGwgYXR0ZW1wdCB0byBwbGFjZVxuICAgICAgICAgICAgbGV0IHNlZ19wZXJfZGl2ID0gKGxpbmUubGVuZ3RoIC0gMSkgLyBzdWJkaXY7XG4gICAgICAgICAgICBmb3IgKGxldCBpID0gMDsgaSA8IHN1YmRpdjsgaSsrKSB7XG4gICAgICAgICAgICAgICAgbGF5b3V0LnNlZ21lbnRfc3RhcnQgPSBNYXRoLmZsb29yKGkgKiBzZWdfcGVyX2Rpdik7XG4gICAgICAgICAgICAgICAgbGF5b3V0LnNlZ21lbnRfZW5kID0gTWF0aC5mbG9vcigoaSArIDEpICogc2VnX3Blcl9kaXYpO1xuXG4gICAgICAgICAgICAgICAgbGFiZWxzLnB1c2gobmV3IExhYmVsTGluZShzaXplLCBsaW5lLCBsYXlvdXQpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGxheW91dC5zZWdtZW50X3N0YXJ0ID0gbnVsbDtcbiAgICAgICAgICAgIGxheW91dC5zZWdtZW50X2VuZCA9IG51bGw7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBsZXQgbGFiZWwgPSBuZXcgTGFiZWxMaW5lKHNpemUsIGxpbmUsIGxheW91dCk7XG4gICAgICAgICAgICBpZiAoIWxhYmVsLnRocm93X2F3YXkpe1xuICAgICAgICAgICAgICAgIGxldCBjaG9zZW5fbGFiZWwgPSBwbGFjZW1lbnRTdHJhdGVneShsYWJlbCk7XG4gICAgICAgICAgICAgICAgaWYgKGNob3Nlbl9sYWJlbCl7XG4gICAgICAgICAgICAgICAgICAgIGxhYmVscy5wdXNoKGNob3Nlbl9sYWJlbCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG59KTtcblxuY29uc3QgVEFSR0VUX1NUUkFJR0hUID0gMC40OyAvLyBPcHRpbWlzdGljIHRhcmdldCByYXRpbyBmb3Igc3RyYWlnaHQgbGFiZWxzIChsYWJlbCBsZW5ndGggLyBsaW5lIGxlbmd0aClcbmNvbnN0IFRBUkdFVF9LSU5LRUQgPSAwLjU7IC8vIE9wdGltaXN0aWMgdGFyZ2V0IHJhdGlvIGZvciBraW5rZWQgbGFiZWxzIChsYWJlbCBsZW5ndGggLyBsaW5lIGxlbmd0aClcblxuLy8gUGxhY2UgbGFiZWxzIGFjY29yZGluZyB0byB0aGUgZm9sbG93aW5nIHN0cmF0ZWd5OlxuLy8gLSBjaG9vc2UgdGhlIGJlc3Qgc3RyYWlnaHQgbGFiZWwgdGhhdCBzYXRpc2ZpZXMgdGhlIG9wdGltaXN0aWMgc3RyYWlnaHQgY3V0b2ZmIChpZiBhbnkpXG4vLyAtIGVsc2UgY2hvb3NlIHRoZSBiZXN0IGtpbmtlZCBsYWJlbCB0aGF0IHNhdGlzZmllcyB0aGUgb3B0aW1pc3RpYyBraW5rZWQgY3V0b2ZmIChpZiBhbnkpXG4vLyAtIGVsc2UgY2hvb3NlIHRoZSBiZXN0IHN0cmFpZ2h0IGxhYmVsIHRoYXQgc2F0aXNmaWVzIGl0cyBpbnRlcm5hbCAobGVzcyBvcHRpbWlzdGljKSBjdXRvZmYgKGlmIGFueSlcbi8vIC0gZWxzZSBjaG9vc2UgdGhlIGJlc3Qga2lua2VkIGxhYmVscyB0aGF0IHNhdGlzZmllcyBpdHMgaW50ZXJuYWwgKGxlc3Mgb3B0aW1pc3RpYykgY3V0b2ZmIChpZiBhbnkpXG4vLyAtIGVsc2UgZG9uJ3QgcGxhY2UgYSBsYWJlbFxuZnVuY3Rpb24gcGxhY2VtZW50U3RyYXRlZ3kobGFiZWwpe1xuICAgIGxldCBsYWJlbHNfc3RyYWlnaHQgPSBbXTtcbiAgICBsZXQgbGFiZWxzX2tpbmtlZCA9IFtdO1xuICAgIGxldCBiZXN0X3N0cmFpZ2h0X2ZpdG5lc3MgPSBJbmZpbml0eTtcbiAgICBsZXQgYmVzdF9raW5rZWRfZml0bmVzcyA9IEluZmluaXR5O1xuXG4gICAgLy8gbG9vcCB0aHJvdWdoIGFsbCBsYWJlbHNcbiAgICB3aGlsZSAobGFiZWwgJiYgIWxhYmVsLnRocm93X2F3YXkpIHtcbiAgICAgICAgaWYgKGxhYmVsLmtpbmtfaW5kZXggPiAwKXtcbiAgICAgICAgICAgIC8vIGNoZWNrIGlmIGFydGljdWxhdGVkIGxhYmVsIGlzIGFib3ZlIGxvd2VzdCBjdXRvZmZcbiAgICAgICAgICAgIGlmIChsYWJlbC5maXRuZXNzIDwgYmVzdF9raW5rZWRfZml0bmVzcyl7XG4gICAgICAgICAgICAgICAgYmVzdF9raW5rZWRfZml0bmVzcyA9IGxhYmVsLmZpdG5lc3M7XG4gICAgICAgICAgICAgICAgbGFiZWxzX2tpbmtlZC51bnNoaWZ0KGxhYmVsKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIC8vIGNoZWNrIGlmIHN0cmFpZ2h0IGxhYmVsIGlzIGFib3ZlIGxvd2VzdCBzdHJhaWdodCBjdXRvZmZcbiAgICAgICAgICAgIGlmIChsYWJlbC5maXRuZXNzIDwgYmVzdF9zdHJhaWdodF9maXRuZXNzKXtcbiAgICAgICAgICAgICAgICBiZXN0X3N0cmFpZ2h0X2ZpdG5lc3MgPSBsYWJlbC5maXRuZXNzO1xuICAgICAgICAgICAgICAgIGxhYmVsc19zdHJhaWdodC51bnNoaWZ0KGxhYmVsKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIGxhYmVsID0gTGFiZWxMaW5lLm5leHRMYWJlbChsYWJlbCk7XG4gICAgfVxuXG4gICAgbGV0IGJlc3Rfc3RyYWlnaHQgPSBsYWJlbHNfc3RyYWlnaHRbMF07XG4gICAgbGV0IGJlc3Rfa2lua2VkID0gbGFiZWxzX2tpbmtlZFswXTtcblxuICAgIGlmIChsYWJlbHNfc3RyYWlnaHQubGVuZ3RoICYmIGJlc3Rfc3RyYWlnaHQuZml0bmVzcyA8IFRBUkdFVF9TVFJBSUdIVCl7XG4gICAgICAgIC8vIHJldHVybiB0aGUgYmVzdCBzdHJhaWdodCBzZWdtZW50IGlmIGl0IGlzIGFib3ZlIHRoZSBzdHJpY3RlciBzdHJhaWdodCBjdXRvZmZcbiAgICAgICAgcmV0dXJuIGJlc3Rfc3RyYWlnaHQ7XG4gICAgfVxuICAgIGVsc2UgaWYgKGxhYmVsc19raW5rZWQubGVuZ3RoICYmIGJlc3Rfa2lua2VkLmZpdG5lc3MgPCBUQVJHRVRfS0lOS0VEKXtcbiAgICAgICAgLy8gcmV0dXJuIHRoZSBiZXN0IGtpbmtlZCBzZWdtZW50IGlmIGl0IGlzIGFib3ZlIHRoZSBzdHJpY3RlciBraW5rZWQgY3V0b2ZmXG4gICAgICAgIHJldHVybiBiZXN0X2tpbmtlZDtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIC8vIG90aGVyd2lzZSByZXR1cm4gYmVzdCBvZiB3aGF0J3MgbGVmdCAoaWYgYW55KVxuICAgICAgICByZXR1cm4gYmVzdF9zdHJhaWdodCB8fCBiZXN0X2tpbmtlZDtcbiAgICB9XG59XG5cblRleHRTdHlsZS50ZXh0dXJlX2lkID0gMDsgLy8gbmFtZXNwYWNlcyBwZXItdGlsZSBsYWJlbCB0ZXh0dXJlc1xuIiwiLy8gVGV4dCBsYWJlbCByZW5kZXJpbmcgbWV0aG9kcywgY2FuIGJlIG1peGVkIGludG8gYSByZW5kZXJpbmcgc3R5bGVcblxuaW1wb3J0IHtTdHlsZVBhcnNlcn0gZnJvbSAnLi4vc3R5bGVfcGFyc2VyJztcbmltcG9ydCBUZXh0dXJlIGZyb20gJy4uLy4uL2dsL3RleHR1cmUnO1xuaW1wb3J0IEdlbyBmcm9tICcuLi8uLi9nZW8nO1xuaW1wb3J0IGxvZyBmcm9tICcuLi8uLi91dGlscy9sb2cnO1xuaW1wb3J0IFRocmVhZCBmcm9tICcuLi8uLi91dGlscy90aHJlYWQnO1xuaW1wb3J0IFdvcmtlckJyb2tlciBmcm9tICcuLi8uLi91dGlscy93b3JrZXJfYnJva2VyJztcbmltcG9ydCBDb2xsaXNpb24gZnJvbSAnLi4vLi4vbGFiZWxzL2NvbGxpc2lvbic7XG5pbXBvcnQgVGV4dFNldHRpbmdzIGZyb20gJy4uL3RleHQvdGV4dF9zZXR0aW5ncyc7XG5pbXBvcnQgQ2FudmFzVGV4dCBmcm9tICcuLi90ZXh0L2NhbnZhc190ZXh0JztcblxuLy8gbmFtZXNwYWNlcyBsYWJlbCB0ZXh0dXJlcyAoZW5zdXJlcyBuZXcgdGV4dHVyZSBuYW1lIHdoZW4gYSB0aWxlIGlzIGJ1aWx0IG11bHRpcGxlIHRpbWVzKVxubGV0IHRleHRfdGV4dHVyZV9pZCA9IDA7XG5cbmV4cG9ydCBjb25zdCBUZXh0TGFiZWxzID0ge1xuXG4gICAgcmVzZXRUZXh0ICgpIHtcbiAgICAgICAgaWYgKFRocmVhZC5pc19tYWluKSB7XG4gICAgICAgICAgICB0aGlzLmNhbnZhcyA9IG5ldyBDYW52YXNUZXh0KCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAoVGhyZWFkLmlzX3dvcmtlcikge1xuICAgICAgICAgICAgdGhpcy50ZXh0cyA9IHt9OyAvLyB1bmlxdWUgdGV4dHMsIGdyb3VwZWQgYnkgdGlsZSwgYnkgc3R5bGVcbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICBmcmVlVGV4dCAodGlsZSkge1xuICAgICAgICBkZWxldGUgdGhpcy50ZXh0c1t0aWxlLmtleV07XG4gICAgfSxcblxuICAgIHBhcnNlVGV4dEZlYXR1cmUgKGZlYXR1cmUsIGRyYXcsIGNvbnRleHQsIHRpbGUpIHtcbiAgICAgICAgLy8gQ29tcHV0ZSBsYWJlbCB0ZXh0XG4gICAgICAgIGxldCB0ZXh0ID0gdGhpcy5wYXJzZVRleHRTb3VyY2UoZmVhdHVyZSwgZHJhdywgY29udGV4dCk7XG4gICAgICAgIGlmICh0ZXh0ID09IG51bGwgfHwgdGV4dCA9PT0gJycpIHtcbiAgICAgICAgICAgIHJldHVybjsgLy8gbm8gdGV4dCBmb3IgdGhpcyBmZWF0dXJlXG4gICAgICAgIH1cblxuICAgICAgICAvLyBDb21wdXRlIHRleHQgc3R5bGUgYW5kIGxheW91dCBzZXR0aW5ncyBmb3IgdGhpcyBmZWF0dXJlIGxhYmVsXG4gICAgICAgIGxldCB0ZXh0X3NldHRpbmdzID0gVGV4dFNldHRpbmdzLmNvbXB1dGUoZmVhdHVyZSwgZHJhdywgY29udGV4dCk7XG4gICAgICAgIGxldCB0ZXh0X3NldHRpbmdzX2tleSA9IFRleHRTZXR0aW5ncy5rZXkodGV4dF9zZXR0aW5ncyk7XG4gICAgICAgIGxldCBsYXlvdXQgPSB0aGlzLmNvbXB1dGVUZXh0TGF5b3V0KHt9LCBmZWF0dXJlLCBkcmF3LCBjb250ZXh0LCB0aWxlLCB0ZXh0LCB0ZXh0X3NldHRpbmdzKTtcblxuICAgICAgICAvLyBmaXJzdCBsYWJlbCBpbiB0aWxlLCBvciB3aXRoIHRoaXMgc3R5bGU/XG4gICAgICAgIHRoaXMudGV4dHNbdGlsZS5rZXldID0gdGhpcy50ZXh0c1t0aWxlLmtleV0gfHwge307XG4gICAgICAgIGxldCBzaXplcyA9IHRoaXMudGV4dHNbdGlsZS5rZXldW3RleHRfc2V0dGluZ3Nfa2V5XSA9IHRoaXMudGV4dHNbdGlsZS5rZXldW3RleHRfc2V0dGluZ3Nfa2V5XSB8fCB7fTtcblxuICAgICAgICAvLyB1bmlxdWUgdGV4dCBzdHJpbmdzLCBncm91cGVkIGJ5IHRleHQgZHJhd2luZyBzdHlsZVxuICAgICAgICBpZiAoIXNpemVzW3RleHRdKSB7XG4gICAgICAgICAgICAvLyBmaXJzdCBsYWJlbCB3aXRoIHRoaXMgdGV4dC9zdHlsZS90aWxlIGNvbWJpbmF0aW9uLCBtYWtlIGEgbmV3IGxhYmVsIGVudHJ5XG4gICAgICAgICAgICBzaXplc1t0ZXh0XSA9IHtcbiAgICAgICAgICAgICAgICB0ZXh0X3NldHRpbmdzLFxuICAgICAgICAgICAgICAgIHJlZjogMCAvLyAjIG9mIHRpbWVzIHRoaXMgdGV4dC9zdHlsZSBjb21ibyBhcHBlYXJzIGluIHRpbGVcbiAgICAgICAgICAgIH07XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgZHJhdywgdGV4dCwgdGV4dF9zZXR0aW5nc19rZXksIGxheW91dFxuICAgICAgICB9O1xuICAgIH0sXG5cbiAgICAvLyBDb21wdXRlIHRoZSBsYWJlbCB0ZXh0LCBkZWZhdWx0IGlzIHZhbHVlIG9mIGZlYXR1cmUucHJvcGVydGllcy5uYW1lXG4gICAgLy8gLSBTdHJpbmcgdmFsdWUgaW5kaWNhdGVzIGEgZmVhdHVyZSBwcm9wZXJ0eSBsb29rLXVwLCBlLmcuIGBzaG9ydF9uYW1lYCBtZWFucyB1c2UgZmVhdHVyZS5wcm9wZXJ0aWVzLnNob3J0X25hbWVcbiAgICAvLyAtIEZ1bmN0aW9uIHdpbGwgdXNlIHRoZSByZXR1cm4gdmFsdWUgYXMgdGhlIGxhYmVsIHRleHQgKGZvciBjdXN0b20gbGFiZWxzKVxuICAgIC8vIC0gQXJyYXkgKG9mIHN0cmluZ3MgYW5kL29yIGZ1bmN0aW9ucykgZGVmaW5lcyBhIGxpc3Qgb2YgZmFsbGJhY2tzLCBldmFsdWF0ZWQgYWNjb3JkaW5nIHRvIHRoZSBhYm92ZSBydWxlcyxcbiAgICAvLyAgIHdpdGggdGhlIGZpcnN0IG5vbi1udWxsIHZhbHVlIHVzZWQgYXMgdGhlIGxhYmVsIHRleHRcbiAgICAvLyAgIGUuZy4gYFtuYW1lOmVzLCBuYW1lOmVuLCBuYW1lXWAgcHJlZmVycyBTcGFuaXNoIG5hbWVzLCBmb2xsb3dlZCBieSBFbmdsaXNoLCBhbmQgbGFzdCB0aGUgZGVmYXVsdCBsb2NhbCBuYW1lXG4gICAgcGFyc2VUZXh0U291cmNlIChmZWF0dXJlLCBkcmF3LCBjb250ZXh0KSB7XG4gICAgICAgIGxldCB0ZXh0O1xuICAgICAgICBsZXQgc291cmNlID0gZHJhdy50ZXh0X3NvdXJjZSB8fCAnbmFtZSc7XG5cbiAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkoc291cmNlKSkge1xuICAgICAgICAgICAgZm9yIChsZXQgcz0wOyBzIDwgc291cmNlLmxlbmd0aDsgcysrKSB7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBzb3VyY2Vbc10gPT09ICdzdHJpbmcnKSB7XG4gICAgICAgICAgICAgICAgICAgIHRleHQgPSBmZWF0dXJlLnByb3BlcnRpZXNbc291cmNlW3NdXTtcbiAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHR5cGVvZiBzb3VyY2Vbc10gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICAgICAgdGV4dCA9IHNvdXJjZVtzXShjb250ZXh0KTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAodGV4dCkge1xuICAgICAgICAgICAgICAgICAgICBicmVhazsgLy8gc3RvcCBpZiB3ZSBmb3VuZCBhIHRleHQgcHJvcGVydHlcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodHlwZW9mIHNvdXJjZSA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgIHRleHQgPSBmZWF0dXJlLnByb3BlcnRpZXNbc291cmNlXTtcbiAgICAgICAgfSBlbHNlIGlmICh0eXBlb2Ygc291cmNlID09PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICB0ZXh0ID0gc291cmNlKGNvbnRleHQpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0ZXh0O1xuICAgIH0sXG5cbiAgICBwcmVwYXJlVGV4dExhYmVscyAodGlsZSwgY29sbGlzaW9uX2dyb3VwLCBxdWV1ZSkge1xuICAgICAgICBpZiAoT2JqZWN0LmtleXModGhpcy50ZXh0c1t0aWxlLmtleV18fHt9KS5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoe30pO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gZmlyc3QgY2FsbCB0byBtYWluIHRocmVhZCwgYXNrIGZvciB0ZXh0IHBpeGVsIHNpemVzXG4gICAgICAgIHJldHVybiBXb3JrZXJCcm9rZXIucG9zdE1lc3NhZ2UodGhpcy5tYWluX3RocmVhZF90YXJnZXQrJy5jYWxjVGV4dFNpemVzJywgdGhpcy50ZXh0c1t0aWxlLmtleV0pLnRoZW4odGV4dHMgPT4ge1xuXG4gICAgICAgICAgICBpZiAodGlsZS5jYW5jZWxlZCkge1xuICAgICAgICAgICAgICAgIGxvZygndHJhY2UnLCBgU3R5bGUgJHt0aGlzLm5hbWV9OiBzdG9wIHRpbGUgYnVpbGQgYmVjYXVzZSB0aWxlIHdhcyBjYW5jZWxlZDogJHt0aWxlLmtleX0sIHBvc3QtY2FsY1RleHRTaXplcygpYCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLnRleHRzW3RpbGUua2V5XSA9IHRleHRzO1xuICAgICAgICAgICAgaWYgKCF0ZXh0cykge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIHRoaXMuYnVpbGRUZXh0TGFiZWxzKHRpbGUua2V5LCBxdWV1ZSk7XG4gICAgICAgIH0pO1xuICAgIH0sXG5cbiAgICBjb2xsaWRlQW5kUmVuZGVyVGV4dExhYmVscyAodGlsZSwgY29sbGlzaW9uX2dyb3VwLCBsYWJlbHMpIHtcbiAgICAgICAgaWYgKCFsYWJlbHMpIHtcbiAgICAgICAgICAgIENvbGxpc2lvbi5jb2xsaWRlKHt9LCBjb2xsaXNpb25fZ3JvdXAsIHRpbGUua2V5KTtcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUoe30pO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIENvbGxpc2lvbi5jb2xsaWRlKGxhYmVscywgY29sbGlzaW9uX2dyb3VwLCB0aWxlLmtleSkudGhlbihsYWJlbHMgPT4ge1xuICAgICAgICAgICAgaWYgKHRpbGUuY2FuY2VsZWQpIHtcbiAgICAgICAgICAgICAgICBsb2coJ3RyYWNlJywgYHN0b3AgdGlsZSBidWlsZCBiZWNhdXNlIHRpbGUgd2FzIGNhbmNlbGVkOiAke3RpbGUua2V5fSwgcG9zdC1jb2xsaWRlKClgKTtcbiAgICAgICAgICAgICAgICByZXR1cm4ge307XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChsYWJlbHMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHt9O1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBsZXQgdGV4dHMgPSB0aGlzLnRleHRzW3RpbGUua2V5XTtcbiAgICAgICAgICAgIHRoaXMuY3VsbFRleHRTdHlsZXModGV4dHMsIGxhYmVscyk7XG5cbiAgICAgICAgICAgIC8vIHNldCBhbGlnbm1lbnRzXG4gICAgICAgICAgICBsYWJlbHMuZm9yRWFjaChxID0+IHtcbiAgICAgICAgICAgICAgICBsZXQgdGV4dF9zZXR0aW5nc19rZXkgPSBxLnRleHRfc2V0dGluZ3Nfa2V5O1xuICAgICAgICAgICAgICAgIGxldCB0ZXh0X2luZm8gPSB0ZXh0c1t0ZXh0X3NldHRpbmdzX2tleV0gJiYgdGV4dHNbdGV4dF9zZXR0aW5nc19rZXldW3EudGV4dF07XG4gICAgICAgICAgICAgICAgaWYgKCF0ZXh0X2luZm8udGV4dF9zZXR0aW5ncy5jYW5fYXJ0aWN1bGF0ZSl7XG4gICAgICAgICAgICAgICAgICAgIHRleHRfaW5mby5hbGlnbiA9IHRleHRfaW5mby5hbGlnbiB8fCB7fTtcbiAgICAgICAgICAgICAgICAgICAgdGV4dF9pbmZvLmFsaWduW3EubGFiZWwuYWxpZ25dID0ge307XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIC8vIHNlY29uZCBjYWxsIHRvIG1haW4gdGhyZWFkLCBmb3IgcmFzdGVyaXppbmcgdGhlIHNldCBvZiB0ZXh0c1xuICAgICAgICAgICAgcmV0dXJuIFdvcmtlckJyb2tlci5wb3N0TWVzc2FnZSh0aGlzLm1haW5fdGhyZWFkX3RhcmdldCsnLnJhc3Rlcml6ZVRleHRzJywgdGlsZS5rZXksIHRleHRzKS50aGVuKCh7IHRleHRzLCB0ZXh0dXJlIH0pID0+IHtcbiAgICAgICAgICAgICAgICBpZiAodGlsZS5jYW5jZWxlZCkge1xuICAgICAgICAgICAgICAgICAgICBsb2coJ3RyYWNlJywgYHN0b3AgdGlsZSBidWlsZCBiZWNhdXNlIHRpbGUgd2FzIGNhbmNlbGVkOiAke3RpbGUua2V5fSwgcG9zdC1yYXN0ZXJpemVUZXh0cygpYCk7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybiB7fTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICByZXR1cm4geyBsYWJlbHMsIHRleHRzLCB0ZXh0dXJlIH07XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfSxcblxuICAgIC8vIFJlbW92ZSB1bnVzZWQgdGV4dC9zdHlsZSBjb21iaW5hdGlvbnMgdG8gYXZvaWQgdW5uZWNlc3NhcnkgcmFzdGVyaXphdGlvblxuICAgIGN1bGxUZXh0U3R5bGVzKHRleHRzLCBsYWJlbHMpIHtcbiAgICAgICAgLy8gQ291bnQgaG93IG1hbnkgdGltZXMgZWFjaCB0ZXh0L3N0eWxlIGNvbWJpbmF0aW9uIGlzIHVzZWRcbiAgICAgICAgZm9yIChsZXQgaT0wOyBpIDwgbGFiZWxzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICBsZXQgbGFiZWwgPSBsYWJlbHNbaV07XG4gICAgICAgICAgICB0ZXh0c1tsYWJlbC50ZXh0X3NldHRpbmdzX2tleV1bbGFiZWwudGV4dF0ucmVmKys7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBSZW1vdmUgdGV4dC9zdHlsZSBjb21iaW5hdGlvbnMgdGhhdCBoYXZlIG5vIHZpc2libGUgbGFiZWxzXG4gICAgICAgIGZvciAobGV0IHN0eWxlIGluIHRleHRzKSB7XG4gICAgICAgICAgICBmb3IgKGxldCB0ZXh0IGluIHRleHRzW3N0eWxlXSkge1xuICAgICAgICAgICAgICAgIC8vIG5vIGxhYmVscyBmb3IgdGhpcyB0ZXh0XG4gICAgICAgICAgICAgICAgaWYgKHRleHRzW3N0eWxlXVt0ZXh0XS5yZWYgPCAxKSB7XG4gICAgICAgICAgICAgICAgICAgIGRlbGV0ZSB0ZXh0c1tzdHlsZV1bdGV4dF07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgZm9yIChsZXQgc3R5bGUgaW4gdGV4dHMpIHtcbiAgICAgICAgICAgIC8vIG5vIGxhYmVscyBmb3IgdGhpcyBzdHlsZVxuICAgICAgICAgICAgaWYgKE9iamVjdC5rZXlzKHRleHRzW3N0eWxlXSkubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgZGVsZXRlIHRleHRzW3N0eWxlXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH0sXG5cbiAgICAvLyBDYWxsZWQgb24gbWFpbiB0aHJlYWQgZnJvbSB3b3JrZXIsIHRvIGNvbXB1dGUgdGhlIHNpemUgb2YgZWFjaCB0ZXh0IHN0cmluZyxcbiAgICAvLyB3ZXJlIGl0IHRvIGJlIHJlbmRlcmVkLiBUaGlzIGluZm8gaXMgdGhlbiB1c2VkIHRvIHBlcmZvcm0gaW5pdGlhbCBsYWJlbCBjdWxsaW5nLCAqYmVmb3JlKlxuICAgIC8vIGxhYmVscyBhcmUgYWN0dWFsbHkgcmVuZGVyZWQuXG4gICAgY2FsY1RleHRTaXplcyAodGV4dHMpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuY2FudmFzLnRleHRTaXplcyh0ZXh0cyk7XG4gICAgfSxcblxuICAgIC8vIENhbGxlZCBvbiBtYWluIHRocmVhZCBmcm9tIHdvcmtlciwgdG8gY3JlYXRlIGF0bGFzIG9mIGxhYmVscyBmb3IgYSB0aWxlXG4gICAgcmFzdGVyaXplVGV4dHMgKHRpbGVfa2V5LCB0ZXh0cykge1xuICAgICAgICBsZXQgY2FudmFzID0gbmV3IENhbnZhc1RleHQoKTtcbiAgICAgICAgY2FudmFzLmNsZWFyVGV4Y29vcmRDYWNoZSh0aWxlX2tleSk7XG5cbiAgICAgICAgbGV0IHRleHR1cmVfc2l6ZSA9IGNhbnZhcy5zZXRUZXh0dXJlVGV4dFBvc2l0aW9ucyh0ZXh0cywgdGhpcy5tYXhfdGV4dHVyZV9zaXplLCB0aWxlX2tleSk7XG4gICAgICAgIGxvZygndHJhY2UnLCBgdGV4dCBzdW1tYXJ5IGZvciB0aWxlICR7dGlsZV9rZXl9OiBmaXRzIGluICR7dGV4dHVyZV9zaXplWzBdfXgke3RleHR1cmVfc2l6ZVsxXX1weGApO1xuXG4gICAgICAgIC8vIGZpdHMgaW4gbWF4IHRleHR1cmUgc2l6ZT9cbiAgICAgICAgaWYgKHRleHR1cmVfc2l6ZVswXSA8IHRoaXMubWF4X3RleHR1cmVfc2l6ZSAmJiB0ZXh0dXJlX3NpemVbMV0gPCB0aGlzLm1heF90ZXh0dXJlX3NpemUpIHtcbiAgICAgICAgICAgIC8vIHVwZGF0ZSBjYW52YXMgc2l6ZSAmIHJhc3Rlcml6ZSBhbGwgdGhlIHRleHQgc3RyaW5ncyB3ZSBuZWVkXG4gICAgICAgICAgICBjYW52YXMucmVzaXplKC4uLnRleHR1cmVfc2l6ZSk7XG4gICAgICAgICAgICBjYW52YXMucmFzdGVyaXplKHRleHRzLCB0ZXh0dXJlX3NpemUsIHRpbGVfa2V5KTtcbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGxvZygnZXJyb3InLCBbXG4gICAgICAgICAgICAgICAgYExhYmVsIGF0bGFzIGZvciB0aWxlICR7dGlsZV9rZXl9IGlzICR7dGV4dHVyZV9zaXplWzBdfXgke3RleHR1cmVfc2l6ZVsxXX1weCwgYCxcbiAgICAgICAgICAgICAgICBgYnV0IG1heCBHTCB0ZXh0dXJlIHNpemUgaXMgJHt0aGlzLm1heF90ZXh0dXJlX3NpemV9eCR7dGhpcy5tYXhfdGV4dHVyZV9zaXplfXB4YF0uam9pbignJykpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gY3JlYXRlIGEgdGV4dHVyZVxuICAgICAgICBsZXQgdCA9ICdsYWJlbHMtJyArIHRpbGVfa2V5ICsgJy0nICsgKHRleHRfdGV4dHVyZV9pZCsrKTtcbiAgICAgICAgVGV4dHVyZS5jcmVhdGUodGhpcy5nbCwgdCwge1xuICAgICAgICAgICAgZWxlbWVudDogY2FudmFzLmNhbnZhcyxcbiAgICAgICAgICAgIGZpbHRlcmluZzogJ2xpbmVhcicsXG4gICAgICAgICAgICBVTlBBQ0tfUFJFTVVMVElQTFlfQUxQSEFfV0VCR0w6IHRydWVcbiAgICAgICAgfSk7XG4gICAgICAgIFRleHR1cmUucmV0YWluKHQpO1xuXG4gICAgICAgIHJldHVybiB7IHRleHRzLCB0ZXh0dXJlOiB0IH07IC8vIHRleHR1cmUgaXMgcmV0dXJuZWQgYnkgbmFtZSAobm90IGluc3RhbmNlKVxuICAgIH0sXG5cbiAgICBwcmVwcm9jZXNzVGV4dCAoZHJhdykge1xuICAgICAgICAvLyBGb250IHNldHRpbmdzIGFyZSByZXF1aXJlZFxuICAgICAgICBpZiAoIWRyYXcgfHwgIWRyYXcuZm9udCB8fCB0eXBlb2YgZHJhdy5mb250ICE9PSAnb2JqZWN0Jykge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gQ29sb3JzXG4gICAgICAgIGRyYXcuZm9udC5maWxsID0gU3R5bGVQYXJzZXIuY3JlYXRlUHJvcGVydHlDYWNoZShkcmF3LmZvbnQuZmlsbCk7XG4gICAgICAgIGlmIChkcmF3LmZvbnQuc3Ryb2tlKSB7XG4gICAgICAgICAgICBkcmF3LmZvbnQuc3Ryb2tlLmNvbG9yID0gU3R5bGVQYXJzZXIuY3JlYXRlUHJvcGVydHlDYWNoZShkcmF3LmZvbnQuc3Ryb2tlLmNvbG9yKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENvbnZlcnQgZm9udCBhbmQgdGV4dCBzdHJva2Ugc2l6ZXNcbiAgICAgICAgZHJhdy5mb250LnB4X3NpemUgPSBTdHlsZVBhcnNlci5jcmVhdGVQcm9wZXJ0eUNhY2hlKGRyYXcuZm9udC5zaXplIHx8IFRleHRTZXR0aW5ncy5kZWZhdWx0cy5zaXplLCBDYW52YXNUZXh0LmZvbnRQaXhlbFNpemUpO1xuICAgICAgICBpZiAoZHJhdy5mb250LnN0cm9rZSAmJiBkcmF3LmZvbnQuc3Ryb2tlLndpZHRoICE9IG51bGwpIHtcbiAgICAgICAgICAgIGRyYXcuZm9udC5zdHJva2Uud2lkdGggPSBTdHlsZVBhcnNlci5jcmVhdGVQcm9wZXJ0eUNhY2hlKGRyYXcuZm9udC5zdHJva2Uud2lkdGgsIHBhcnNlRmxvYXQpO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gT2Zmc2V0ICgyZCBhcnJheSlcbiAgICAgICAgZHJhdy5vZmZzZXQgPSBTdHlsZVBhcnNlci5jcmVhdGVQcm9wZXJ0eUNhY2hlKGRyYXcub2Zmc2V0LCB2ID0+IChBcnJheS5pc0FycmF5KHYpICYmIHYubWFwKHBhcnNlRmxvYXQpKSB8fCAwKTtcblxuICAgICAgICAvLyBCdWZmZXIgKDFkIHZhbHVlIG9yIG9yIDJkIGFycmF5KVxuICAgICAgICBkcmF3LmJ1ZmZlciA9IFN0eWxlUGFyc2VyLmNyZWF0ZVByb3BlcnR5Q2FjaGUoZHJhdy5idWZmZXIsIHYgPT4gKEFycmF5LmlzQXJyYXkodikgPyB2IDogW3YsIHZdKS5tYXAocGFyc2VGbG9hdCkgfHwgMCk7XG5cbiAgICAgICAgLy8gUmVwZWF0IHJ1bGVzIC0gZm9yIHRleHQgbGFiZWxzLCBkZWZhdWx0cyB0byB0aWxlIHNpemVcbiAgICAgICAgZHJhdy5yZXBlYXRfZGlzdGFuY2UgPSBTdHlsZVBhcnNlci5jcmVhdGVQcm9wZXJ0eUNhY2hlKGRyYXcucmVwZWF0X2Rpc3RhbmNlIHx8IEdlby50aWxlX3NpemUsIHBhcnNlRmxvYXQpO1xuXG4gICAgICAgIHJldHVybiBkcmF3O1xuICAgIH0sXG5cbiAgICAvLyBBZGRpdGlvbmFsIHRleHQtc3BlY2lmaWMgbGF5b3V0IHNldHRpbmdzXG4gICAgY29tcHV0ZVRleHRMYXlvdXQgKHRhcmdldCwgZmVhdHVyZSwgZHJhdywgY29udGV4dCwgdGlsZSwgdGV4dCwgdGV4dF9zZXR0aW5ncykge1xuICAgICAgICBsZXQgbGF5b3V0ID0gdGFyZ2V0IHx8IHt9O1xuXG4gICAgICAgIC8vIGNvbW1vbiBzZXR0aW5ncyB3L3BvaW50c1xuICAgICAgICBsYXlvdXQgPSB0aGlzLmNvbXB1dGVMYXlvdXQobGF5b3V0LCBmZWF0dXJlLCBkcmF3LCBjb250ZXh0LCB0aWxlKTtcblxuICAgICAgICAvLyB0aWxlIGJvdW5kYXJ5IGhhbmRsaW5nXG4gICAgICAgIGxheW91dC5jdWxsX2Zyb21fdGlsZSA9IChkcmF3LmN1bGxfZnJvbV90aWxlICE9IG51bGwpID8gZHJhdy5jdWxsX2Zyb21fdGlsZSA6IHRydWU7XG5cbiAgICAgICAgLy8gc3RhbmRhbG9uZSB0ZXh0IGNhbiBtb3ZlIGludG8gdGlsZSBpZiBzcGVjaWZpZWRcbiAgICAgICAgbGF5b3V0Lm1vdmVfaW50b190aWxlID0gKGRyYXcubW92ZV9pbnRvX3RpbGUgIT0gbnVsbCkgPyBkcmF3Lm1vdmVfaW50b190aWxlIDogdHJ1ZTtcblxuICAgICAgICAvLyByZXBlYXQgcnVsZXMgaW5jbHVkZSB0aGUgdGV4dFxuICAgICAgICBpZiAobGF5b3V0LnJlcGVhdF9kaXN0YW5jZSkge1xuICAgICAgICAgICAgbGF5b3V0LnJlcGVhdF9ncm91cCArPSAnLycgKyB0ZXh0O1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gTWF4IG51bWJlciBvZiBzdWJkaXZpc2lvbnMgdG8gdHJ5XG4gICAgICAgIGxheW91dC5zdWJkaXYgPSB0aWxlLm92ZXJ6b29tMjtcblxuICAgICAgICBsYXlvdXQuYWxpZ24gPSBkcmF3LmFsaWduO1xuXG4gICAgICAgIC8vIHVzZWQgdG8gZnVkZ2Ugd2lkdGggdmFsdWUgYXMgdGV4dCBtYXkgb3ZlcmZsb3cgYm91bmRpbmcgYm94IGlmIGl0IGhhcyBpdGFsaWMsIGJvbGQsIGV0YyBzdHlsZVxuICAgICAgICBsYXlvdXQuaXRhbGljID0gKHRleHRfc2V0dGluZ3Muc3R5bGUgIT09ICdub3JtYWwnKTtcblxuICAgICAgICByZXR1cm4gbGF5b3V0O1xuICAgIH1cblxufTtcbiIsImltcG9ydCBVdGlscyBmcm9tICcuLi8uLi91dGlscy91dGlscyc7XG5pbXBvcnQgR2VvIGZyb20gJy4uLy4uL2dlbyc7XG5pbXBvcnQge1N0eWxlUGFyc2VyfSBmcm9tICcuLi9zdHlsZV9wYXJzZXInO1xuXG52YXIgVGV4dFNldHRpbmdzO1xuXG5leHBvcnQgZGVmYXVsdCBUZXh0U2V0dGluZ3MgPSB7XG5cbiAgICAvLyBBIGtleSBmb3IgZ3JvdXBpbmcgYWxsIGxhYmVscyBvZiB0aGUgc2FtZSB0ZXh0IHN0eWxlIChlLmcuIHNhbWUgQ2FudmFzIHN0YXRlLCB0byBtaW5pbWl6ZSBzdGF0ZSBjaGFuZ2VzKVxuICAgIGtleSAoc2V0dGluZ3MpIHtcbiAgICAgICAgcmV0dXJuIFtcbiAgICAgICAgICAgIHNldHRpbmdzLnN0eWxlLFxuICAgICAgICAgICAgc2V0dGluZ3Mud2VpZ2h0LFxuICAgICAgICAgICAgc2V0dGluZ3MuZmFtaWx5LFxuICAgICAgICAgICAgc2V0dGluZ3MucHhfc2l6ZSxcbiAgICAgICAgICAgIHNldHRpbmdzLmZpbGwsXG4gICAgICAgICAgICBzZXR0aW5ncy5zdHJva2UsXG4gICAgICAgICAgICBzZXR0aW5ncy5zdHJva2Vfd2lkdGgsXG4gICAgICAgICAgICBzZXR0aW5ncy50cmFuc2Zvcm0sXG4gICAgICAgICAgICBzZXR0aW5ncy50ZXh0X3dyYXAsXG4gICAgICAgICAgICBzZXR0aW5ncy5tYXhfbGluZXMsXG4gICAgICAgICAgICBVdGlscy5kZXZpY2VfcGl4ZWxfcmF0aW9cbiAgICAgICAgXS5qb2luKCcvJyk7XG4gICAgfSxcblxuICAgIGRlZmF1bHRzOiB7XG4gICAgICAgIHN0eWxlOiAnbm9ybWFsJyxcbiAgICAgICAgd2VpZ2h0OiBudWxsLFxuICAgICAgICBzaXplOiAnMTJweCcsXG4gICAgICAgIHB4X3NpemU6IDEyLFxuICAgICAgICBmYW1pbHk6ICdIZWx2ZXRpY2EnLFxuICAgICAgICBmaWxsOiAnd2hpdGUnLFxuICAgICAgICB0ZXh0X3dyYXA6IDE1LFxuICAgICAgICBtYXhfbGluZXM6IDUsXG4gICAgICAgIGFsaWduOiAnY2VudGVyJyxcbiAgICAgICAgc3Ryb2tlOiBudWxsLFxuICAgICAgICBzdHJva2Vfd2lkdGg6IDBcbiAgICB9LFxuXG4gICAgY29tcHV0ZSAoZmVhdHVyZSwgZHJhdywgY29udGV4dCkge1xuICAgICAgICBsZXQgc3R5bGUgPSB7fTtcblxuICAgICAgICBkcmF3LmZvbnQgPSBkcmF3LmZvbnQgfHwgdGhpcy5kZWZhdWx0cztcblxuICAgICAgICAvLyBMaW5lU3RyaW5nIGxhYmVscyBjYW4gYXJ0aWN1bGF0ZSB3aGlsZSBwb2ludCBsYWJlbHMgY2Fubm90LiBOZWVkZWQgZm9yIGZ1dHVyZSB0ZXh0dXJlIGNvb3JkaW5hdGUgY2FsY3VsYXRpb25zLlxuICAgICAgICBzdHlsZS5jYW5fYXJ0aWN1bGF0ZSA9IGRyYXcuY2FuX2FydGljdWxhdGU7XG5cbiAgICAgICAgLy8gVXNlIGZpbGwgaWYgc3BlY2lmaWVkLCBvciBkZWZhdWx0XG4gICAgICAgIHN0eWxlLmZpbGwgPSAoZHJhdy5mb250LmZpbGwgJiYgVXRpbHMudG9DU1NDb2xvcihTdHlsZVBhcnNlci5ldmFsQ2FjaGVkQ29sb3JQcm9wZXJ0eShkcmF3LmZvbnQuZmlsbCwgY29udGV4dCkpKSB8fCB0aGlzLmRlZmF1bHRzLmZpbGw7XG5cbiAgICAgICAgLy8gRm9udCBwcm9wZXJ0aWVzIGFyZSBtb2RlbGVkIGFmdGVyIENTUyBuYW1lczpcbiAgICAgICAgLy8gLSBmYW1pbHk6IEhlbHZldGljYSwgRnV0dXJhLCBldGMuXG4gICAgICAgIC8vIC0gc2l6ZTogaW4gcHQsIHB4LCBvciBlbVxuICAgICAgICAvLyAtIHN0eWxlOiBub3JtYWwsIGl0YWxpYywgb2JsaXF1ZVxuICAgICAgICAvLyAtIHdlaWdodDogbm9ybWFsLCBib2xkLCBldGMuXG4gICAgICAgIC8vIC0gdHJhbnNmb3JtOiBjYXBpdGFsaXplLCB1cHBlcmNhc2UsIGxvd2VyY2FzZVxuICAgICAgICBzdHlsZS5zdHlsZSA9IGRyYXcuZm9udC5zdHlsZSB8fCB0aGlzLmRlZmF1bHRzLnN0eWxlO1xuICAgICAgICBzdHlsZS53ZWlnaHQgPSBkcmF3LmZvbnQud2VpZ2h0IHx8IHRoaXMuZGVmYXVsdHMud2VpZ2h0O1xuICAgICAgICBpZiAoZHJhdy5mb250LmZhbWlseSkge1xuICAgICAgICAgICAgc3R5bGUuZmFtaWx5ID0gZHJhdy5mb250LmZhbWlseTtcbiAgICAgICAgICAgIGlmIChzdHlsZS5mYW1pbHkgIT09IHRoaXMuZGVmYXVsdHMuZmFtaWx5KSB7XG4gICAgICAgICAgICAgICAgc3R5bGUuZmFtaWx5ICs9ICcsICcgKyB0aGlzLmRlZmF1bHRzLmZhbWlseTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIHN0eWxlLmZhbWlseSA9IHRoaXMuZGVmYXVsdHMuZmFtaWx5O1xuICAgICAgICB9XG5cbiAgICAgICAgc3R5bGUudHJhbnNmb3JtID0gZHJhdy5mb250LnRyYW5zZm9ybTtcblxuICAgICAgICAvLyBvcmlnaW5hbCBzaXplIChub3QgY3VycmVudGx5IHVzZWQsIGJ1dCB1c2VmdWwgZm9yIGRlYnVnZ2luZylcbiAgICAgICAgc3R5bGUuc2l6ZSA9IGRyYXcuZm9udC5zaXplIHx8IHRoaXMuZGVmYXVsdHMuc2l6ZTtcblxuICAgICAgICAvLyBjYWxjdWxhdGVkIHBpeGVsIHNpemVcbiAgICAgICAgc3R5bGUucHhfc2l6ZSA9IFN0eWxlUGFyc2VyLmV2YWxDYWNoZWRQcm9wZXJ0eShkcmF3LmZvbnQucHhfc2l6ZSwgY29udGV4dCk7XG5cbiAgICAgICAgLy8gVXNlIHN0cm9rZSBpZiBzcGVjaWZpZWRcbiAgICAgICAgaWYgKGRyYXcuZm9udC5zdHJva2UgJiYgZHJhdy5mb250LnN0cm9rZS5jb2xvcikge1xuICAgICAgICAgICAgc3R5bGUuc3Ryb2tlID0gVXRpbHMudG9DU1NDb2xvcihTdHlsZVBhcnNlci5ldmFsQ2FjaGVkQ29sb3JQcm9wZXJ0eShkcmF3LmZvbnQuc3Ryb2tlLmNvbG9yLCBjb250ZXh0KSB8fCB0aGlzLmRlZmF1bHRzLnN0cm9rZSk7XG4gICAgICAgICAgICBzdHlsZS5zdHJva2Vfd2lkdGggPSBTdHlsZVBhcnNlci5ldmFsQ2FjaGVkUHJvcGVydHkoZHJhdy5mb250LnN0cm9rZS53aWR0aCwgY29udGV4dCkgfHwgdGhpcy5kZWZhdWx0cy5zdHJva2Vfd2lkdGg7XG4gICAgICAgIH1cblxuICAgICAgICBzdHlsZS5mb250X2NzcyA9IHRoaXMuZm9udENTUyhzdHlsZSk7XG5cbiAgICAgICAgLy8gV29yZCB3cmFwIGFuZCB0ZXh0IGFsaWdubWVudFxuICAgICAgICAvLyBOb3QgYSBmb250IHByb3BlcnRpZXMsIGJ1dCBhZmZlY3QgYXRsYXMgb2YgdW5pcXVlIHRleHQgdGV4dHVyZXNcbiAgICAgICAgbGV0IHRleHRfd3JhcCA9IGRyYXcudGV4dF93cmFwOyAvLyB1c2UgZXhwbGljaXRseSBzZXQgdmFsdWVcblxuICAgICAgICBpZiAodGV4dF93cmFwID09IG51bGwgJiYgR2VvLmdlb21ldHJ5VHlwZShmZWF0dXJlLmdlb21ldHJ5LnR5cGUpICE9PSAnbGluZScpIHtcbiAgICAgICAgICAgIC8vIHBvaW50IGxhYmVscyAoZm9yIHBvaW50IGFuZCBwb2x5Z29uIGZlYXR1cmVzKSBoYXZlIHdvcmQgd3JhcCBvbiB3L2RlZmF1bHQgbWF4IGxlbmd0aCxcbiAgICAgICAgICAgIC8vIGxpbmUgbGFiZWxzIGRlZmF1bHQgb2ZmXG4gICAgICAgICAgICB0ZXh0X3dyYXAgPSB0cnVlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gc2V0dGluZyB0byAndHJ1ZScgY2F1c2VzIGRlZmF1bHQgd3JhcCB2YWx1ZSB0byBiZSB1c2VkXG4gICAgICAgIGlmICh0ZXh0X3dyYXAgPT09IHRydWUpIHtcbiAgICAgICAgICAgIHRleHRfd3JhcCA9IHRoaXMuZGVmYXVsdHMudGV4dF93cmFwO1xuICAgICAgICB9XG4gICAgICAgIHN0eWxlLnRleHRfd3JhcCA9IHRleHRfd3JhcDtcblxuICAgICAgICAvLyBtYXhfbGluZXMgc2V0dGluZyB0byB0cnVuY2F0ZSB2ZXJ5IGxvbmcgbGFiZWxzIHdpdGggYW4gZWxsaXBzaXNcbiAgICAgICAgc3R5bGUubWF4X2xpbmVzID0gZHJhdy5tYXhfbGluZXMgfHwgdGhpcy5kZWZhdWx0cy5tYXhfbGluZXM7XG5cbiAgICAgICAgcmV0dXJuIHN0eWxlO1xuICAgIH0sXG5cbiAgICAvLyBCdWlsZCBDU1Mtc3R5bGUgZm9udCBzdHJpbmcgKHRvIHNldCBDYW52YXMgZHJhdyBzdGF0ZSlcbiAgICBmb250Q1NTICh7IHN0eWxlLCB3ZWlnaHQsIHB4X3NpemUsIGZhbWlseSB9KSB7XG4gICAgICAgIHJldHVybiBbc3R5bGUsIHdlaWdodCwgcHhfc2l6ZSArICdweCcsIGZhbWlseV1cbiAgICAgICAgICAgIC5maWx0ZXIoeCA9PiB4KSAvLyByZW1vdmUgbnVsbCBwcm9wc1xuICAgICAgICAgICAgLmpvaW4oJyAnKTtcbiAgICB9XG5cbn07XG4iLCJpbXBvcnQgbG9nIGZyb20gJy4vdXRpbHMvbG9nJztcbmltcG9ydCBHZW8gZnJvbSAnLi9nZW8nO1xuaW1wb3J0IHtTdHlsZVBhcnNlcn0gZnJvbSAnLi9zdHlsZXMvc3R5bGVfcGFyc2VyJztcbmltcG9ydCBDb2xsaXNpb24gZnJvbSAnLi9sYWJlbHMvY29sbGlzaW9uJztcbmltcG9ydCBXb3JrZXJCcm9rZXIgZnJvbSAnLi91dGlscy93b3JrZXJfYnJva2VyJztcbmltcG9ydCBUZXh0dXJlIGZyb20gJy4vZ2wvdGV4dHVyZSc7XG5cbmltcG9ydCB7bWF0NCwgdmVjM30gZnJvbSAnLi91dGlscy9nbC1tYXRyaXgnO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBUaWxlIHtcblxuICAgIC8qKlxuICAgICAgICBUaWxlXG4gICAgICAgIEBjb25zdHJ1Y3RvclxuICAgICAgICBSZXF1aXJlZCBwcm9wZXJ0aWVzOlxuICAgICAgICBjb29yZHM6IG9iamVjdCB3aXRoIHt4LCB5LCB6fSBwcm9wZXJ0aWVzIGlkZW50aWZ5aW5nIHRpbGUgY29vcmRpbmF0ZSBsb2NhdGlvblxuICAgICAgICB3b3JrZXI6IHdlYiB3b3JrZXIgdG8gaGFuZGxlIHRpbGUgY29uc3RydWN0aW9uXG4gICAgKi9cbiAgICBjb25zdHJ1Y3Rvcih7IGNvb3Jkcywgc3R5bGVfem9vbSwgc291cmNlLCB3b3JrZXIsIHZpZXcgfSkge1xuICAgICAgICB0aGlzLndvcmtlciA9IHdvcmtlcjtcbiAgICAgICAgdGhpcy52aWV3ID0gdmlldztcbiAgICAgICAgdGhpcy5zb3VyY2UgPSBzb3VyY2U7XG4gICAgICAgIHRoaXMuZ2VuZXJhdGlvbiA9IG51bGw7XG5cbiAgICAgICAgdGhpcy52aXNpYmxlID0gZmFsc2U7XG4gICAgICAgIHRoaXMucHJveHlfZm9yID0gbnVsbDtcbiAgICAgICAgdGhpcy5wcm94eV9kZXB0aCA9IDA7XG4gICAgICAgIHRoaXMucHJveGllZF9hcyA9IG51bGw7XG4gICAgICAgIHRoaXMuZmFkZV9pbiA9IHRydWU7XG4gICAgICAgIHRoaXMubG9hZGluZyA9IGZhbHNlO1xuICAgICAgICB0aGlzLmxvYWRlZCA9IGZhbHNlO1xuICAgICAgICB0aGlzLmJ1aWx0ID0gZmFsc2U7XG4gICAgICAgIHRoaXMuZXJyb3IgPSBudWxsO1xuICAgICAgICB0aGlzLmRlYnVnID0ge307XG5cbiAgICAgICAgdGhpcy5jb29yZHMgPSBUaWxlLmNvb3JkaW5hdGVXaXRoTWF4Wm9vbShjb29yZHMsIHRoaXMuc291cmNlLm1heF96b29tKTtcbiAgICAgICAgdGhpcy5zdHlsZV96b29tID0gc3R5bGVfem9vbTsgLy8gem9vbSBsZXZlbCB0byBiZSB1c2VkIGZvciBzdHlsaW5nXG4gICAgICAgIHRoaXMub3Zlcnpvb20gPSBNYXRoLm1heCh0aGlzLnN0eWxlX3pvb20gLSB0aGlzLmNvb3Jkcy56LCAwKTsgLy8gbnVtYmVyIG9mIGxldmVscyBvZiBvdmVyem9vbWluZ1xuICAgICAgICB0aGlzLm92ZXJ6b29tMiA9IE1hdGgucG93KDIsIHRoaXMub3Zlcnpvb20pO1xuICAgICAgICB0aGlzLmtleSA9IFRpbGUua2V5KHRoaXMuY29vcmRzLCB0aGlzLnNvdXJjZSwgdGhpcy5zdHlsZV96b29tKTtcbiAgICAgICAgdGhpcy5taW4gPSBHZW8ubWV0ZXJzRm9yVGlsZSh0aGlzLmNvb3Jkcyk7XG4gICAgICAgIHRoaXMubWF4ID0gR2VvLm1ldGVyc0ZvclRpbGUoe3g6IHRoaXMuY29vcmRzLnggKyAxLCB5OiB0aGlzLmNvb3Jkcy55ICsgMSwgejogdGhpcy5jb29yZHMueiB9KSxcbiAgICAgICAgdGhpcy5zcGFuID0geyB4OiAodGhpcy5tYXgueCAtIHRoaXMubWluLngpLCB5OiAodGhpcy5tYXgueSAtIHRoaXMubWluLnkpIH07XG4gICAgICAgIHRoaXMuYm91bmRzID0geyBzdzogeyB4OiB0aGlzLm1pbi54LCB5OiB0aGlzLm1heC55IH0sIG5lOiB7IHg6IHRoaXMubWF4LngsIHk6IHRoaXMubWluLnkgfSB9O1xuICAgICAgICB0aGlzLmNlbnRlcl9kaXN0ID0gMDtcblxuICAgICAgICB0aGlzLm1ldGVyc19wZXJfcGl4ZWwgPSBHZW8ubWV0ZXJzUGVyUGl4ZWwodGhpcy5zdHlsZV96b29tKTtcbiAgICAgICAgdGhpcy5tZXRlcnNfcGVyX3BpeGVsX3NxID0gdGhpcy5tZXRlcnNfcGVyX3BpeGVsICogdGhpcy5tZXRlcnNfcGVyX3BpeGVsO1xuICAgICAgICB0aGlzLnVuaXRzX3Blcl9waXhlbCA9IEdlby51bml0c19wZXJfcGl4ZWwgLyB0aGlzLm92ZXJ6b29tMjsgLy8gYWRqdXN0ZWQgZm9yIG92ZXJ6b29tXG4gICAgICAgIHRoaXMudW5pdHNfcGVyX21ldGVyX292ZXJ6b29tID0gR2VvLnVuaXRzUGVyTWV0ZXIodGhpcy5jb29yZHMueikgKiB0aGlzLm92ZXJ6b29tMjsgLy8gYWRqdXN0ZWQgZm9yIG92ZXJ6b29tXG5cbiAgICAgICAgdGhpcy5tZXNoZXMgPSB7fTsgLy8gcmVuZGVyYWJsZSBWQk8gbWVzaGVzIGtleWVkIGJ5IHN0eWxlXG4gICAgICAgIHRoaXMudGV4dHVyZXMgPSBbXTsgLy8gdGV4dHVyZXMgdGhhdCB0aGUgdGlsZSBvd25zIChsYWJlbHMsIGV0Yy4pXG4gICAgICAgIHRoaXMucHJldmlvdXNfdGV4dHVyZXMgPSBbXTsgLy8gdGV4dHVyZXMgcmV0YWluZWQgYnkgdGhlIHRpbGUgaW4gdGhlIHByZXZpb3VzIGJ1aWxkIGdlbmVyYXRpb25cbiAgICAgICAgdGhpcy5uZXdfbWVzaF9zdHlsZXMgPSBbXTsgLy8gbWVzaGVzIHRoYXQgaGF2ZSBiZWVuIGJ1aWx0IHNvIGZhciBpbiBjdXJyZW50IGJ1aWxkIGdlbmVyYXRpb25cbiAgICB9XG5cbiAgICBzdGF0aWMgY3JlYXRlKHNwZWMpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBUaWxlKHNwZWMpO1xuICAgIH1cblxuICAgIHN0YXRpYyBjb29yZChjKSB7XG4gICAgICAgIHJldHVybiB7eDogYy54LCB5OiBjLnksIHo6IGMueiwga2V5OiBUaWxlLmNvb3JkS2V5KGMpfTtcbiAgICB9XG5cbiAgICBzdGF0aWMgY29vcmRLZXkoe3gsIHksIHp9KSB7XG4gICAgICAgIHJldHVybiB4ICsgJy8nICsgeSArICcvJyArIHo7XG4gICAgfVxuXG4gICAgc3RhdGljIGtleSAoY29vcmRzLCBzb3VyY2UsIHN0eWxlX3pvb20pIHtcbiAgICAgICAgY29vcmRzID0gVGlsZS5jb29yZGluYXRlV2l0aE1heFpvb20oY29vcmRzLCBzb3VyY2UubWF4X3pvb20pO1xuICAgICAgICBpZiAoY29vcmRzLnkgPCAwIHx8IGNvb3Jkcy55ID49ICgxIDw8IGNvb3Jkcy56KSB8fCBjb29yZHMueiA8IDApIHtcbiAgICAgICAgICAgIHJldHVybjsgLy8gY3VsbCB0aWxlcyBvdXQgb2YgcmFuZ2UgKHggd2lsbCB3cmFwKVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiBbc291cmNlLm5hbWUsIHN0eWxlX3pvb20sIGNvb3Jkcy54LCBjb29yZHMueSwgY29vcmRzLnpdLmpvaW4oJy8nKTtcbiAgICB9XG5cbiAgICBzdGF0aWMgY29vcmRpbmF0ZUF0Wm9vbSh7eCwgeSwgeiwga2V5fSwgem9vbSkge1xuICAgICAgICBpZiAoeiAhPT0gem9vbSkge1xuICAgICAgICAgICAgbGV0IHpzY2FsZSA9IE1hdGgucG93KDIsIHogLSB6b29tKTtcbiAgICAgICAgICAgIHggPSBNYXRoLmZsb29yKHggLyB6c2NhbGUpO1xuICAgICAgICAgICAgeSA9IE1hdGguZmxvb3IoeSAvIHpzY2FsZSk7XG4gICAgICAgICAgICB6ID0gem9vbTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gVGlsZS5jb29yZCh7eCwgeSwgen0pO1xuICAgIH1cblxuICAgIHN0YXRpYyBjb29yZGluYXRlV2l0aE1heFpvb20oe3gsIHksIHp9LCBtYXhfem9vbSkge1xuICAgICAgICBpZiAobWF4X3pvb20gIT09IHVuZGVmaW5lZCAmJiB6ID4gbWF4X3pvb20pIHtcbiAgICAgICAgICAgIHJldHVybiBUaWxlLmNvb3JkaW5hdGVBdFpvb20oe3gsIHksIHp9LCBtYXhfem9vbSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFRpbGUuY29vcmQoe3gsIHksIHp9KTtcbiAgICB9XG5cbiAgICBzdGF0aWMgY2hpbGRyZW5Gb3JDb29yZGluYXRlKHt4LCB5LCB6LCBrZXl9KSB7XG4gICAgICAgIGlmICghVGlsZS5jb29yZF9jaGlsZHJlbltrZXldKSB7XG4gICAgICAgICAgICB6Kys7XG4gICAgICAgICAgICB4ICo9IDI7XG4gICAgICAgICAgICB5ICo9IDI7XG4gICAgICAgICAgICBUaWxlLmNvb3JkX2NoaWxkcmVuW2tleV0gPSBbXG4gICAgICAgICAgICAgICAgVGlsZS5jb29yZCh7eCwgeSwgICAgICB6fSksIFRpbGUuY29vcmQoe3g6IHgrMSwgeSwgICAgICB6fSksXG4gICAgICAgICAgICAgICAgVGlsZS5jb29yZCh7eCwgeTogeSsxLCB6fSksIFRpbGUuY29vcmQoe3g6IHgrMSwgeTogeSsxLCB6fSlcbiAgICAgICAgICAgIF07XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIFRpbGUuY29vcmRfY2hpbGRyZW5ba2V5XTtcbiAgICB9XG5cbiAgICBzdGF0aWMgaXNEZXNjZW5kYW50KHBhcmVudCwgZGVzY2VuZGFudCkge1xuICAgICAgICBpZiAoZGVzY2VuZGFudC56ID4gcGFyZW50LnopIHtcbiAgICAgICAgICAgIGxldCB7eCwgeX0gPSBUaWxlLmNvb3JkaW5hdGVBdFpvb20oZGVzY2VuZGFudCwgcGFyZW50LnopO1xuICAgICAgICAgICAgcmV0dXJuIChwYXJlbnQueCA9PT0geCAmJiBwYXJlbnQueSA9PT0geSk7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgIH1cblxuICAgIC8vIFNvcnQgYSBzZXQgb2YgdGlsZSBpbnN0YW5jZXMgKHdoaWNoIGFscmVhZHkgaGF2ZSBhIGRpc3RhbmNlIGZyb20gY2VudGVyIHRpbGUgY29tcHV0ZWQpXG4gICAgc3RhdGljIHNvcnQodGlsZXMpIHtcbiAgICAgICAgcmV0dXJuIHRpbGVzLnNvcnQoKGEsIGIpID0+IHtcbiAgICAgICAgICAgIGxldCBhZCA9IGEuY2VudGVyX2Rpc3Q7XG4gICAgICAgICAgICBsZXQgYmQgPSBiLmNlbnRlcl9kaXN0O1xuICAgICAgICAgICAgcmV0dXJuIChiZCA+IGFkID8gLTEgOiAoYmQgPT09IGFkID8gMCA6IDEpKTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgLy8gRnJlZSByZXNvdXJjZXMgb3duZWQgYnkgdGlsZVxuICAgIGZyZWVSZXNvdXJjZXMgKCkge1xuICAgICAgICBmb3IgKGxldCBtIGluIHRoaXMubWVzaGVzKSB7XG4gICAgICAgICAgICB0aGlzLm1lc2hlc1ttXS5kZXN0cm95KCk7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5tZXNoZXMgPSB7fTtcblxuICAgICAgICB0aGlzLnRleHR1cmVzLmZvckVhY2godCA9PiBUZXh0dXJlLnJlbGVhc2UodCkpO1xuICAgICAgICB0aGlzLnRleHR1cmVzID0gW107XG5cbiAgICAgICAgdGhpcy5wcmV2aW91c190ZXh0dXJlcy5mb3JFYWNoKHQgPT4gVGV4dHVyZS5yZWxlYXNlKHQpKTtcbiAgICAgICAgdGhpcy5wcmV2aW91c190ZXh0dXJlcyA9IFtdO1xuICAgIH1cblxuICAgIGRlc3Ryb3koKSB7XG4gICAgICAgIHRoaXMud29ya2VyTWVzc2FnZSgnc2VsZi5yZW1vdmVUaWxlJywgdGhpcy5rZXkpO1xuICAgICAgICB0aGlzLmZyZWVSZXNvdXJjZXMoKTtcbiAgICAgICAgdGhpcy53b3JrZXIgPSBudWxsO1xuICAgIH1cblxuICAgIGJ1aWxkQXNNZXNzYWdlKCkge1xuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAga2V5OiB0aGlzLmtleSxcbiAgICAgICAgICAgIHNvdXJjZTogdGhpcy5zb3VyY2UubmFtZSxcbiAgICAgICAgICAgIGNvb3JkczogdGhpcy5jb29yZHMsXG4gICAgICAgICAgICBtaW46IHRoaXMubWluLFxuICAgICAgICAgICAgbWF4OiB0aGlzLm1heCxcbiAgICAgICAgICAgIHVuaXRzX3Blcl9waXhlbDogdGhpcy51bml0c19wZXJfcGl4ZWwsXG4gICAgICAgICAgICBtZXRlcnNfcGVyX3BpeGVsOiB0aGlzLm1ldGVyc19wZXJfcGl4ZWwsXG4gICAgICAgICAgICBtZXRlcnNfcGVyX3BpeGVsX3NxOiB0aGlzLm1ldGVyc19wZXJfcGl4ZWxfc3EsXG4gICAgICAgICAgICB1bml0c19wZXJfbWV0ZXJfb3Zlcnpvb206IHRoaXMudW5pdHNfcGVyX21ldGVyX292ZXJ6b29tLFxuICAgICAgICAgICAgc3R5bGVfem9vbTogdGhpcy5zdHlsZV96b29tLFxuICAgICAgICAgICAgb3Zlcnpvb206IHRoaXMub3Zlcnpvb20sXG4gICAgICAgICAgICBvdmVyem9vbTI6IHRoaXMub3Zlcnpvb20yLFxuICAgICAgICAgICAgZ2VuZXJhdGlvbjogdGhpcy5nZW5lcmF0aW9uLFxuICAgICAgICAgICAgZGVidWc6IHRoaXMuZGVidWdcbiAgICAgICAgfTtcbiAgICB9XG5cbiAgICB3b3JrZXJNZXNzYWdlICguLi5tZXNzYWdlKSB7XG4gICAgICAgIHJldHVybiBXb3JrZXJCcm9rZXIucG9zdE1lc3NhZ2UodGhpcy53b3JrZXIsIC4uLm1lc3NhZ2UpO1xuICAgIH1cblxuICAgIGJ1aWxkKGdlbmVyYXRpb24sIHsgZmFkZV9pbiA9IHRydWUgfSA9IHt9KSB7XG4gICAgICAgIHRoaXMuZ2VuZXJhdGlvbiA9IGdlbmVyYXRpb247XG4gICAgICAgIHRoaXMuZmFkZV9pbiA9IGZhZGVfaW47XG4gICAgICAgIGlmICghdGhpcy5sb2FkZWQpIHtcbiAgICAgICAgICAgIHRoaXMubG9hZGluZyA9IHRydWU7XG4gICAgICAgICAgICB0aGlzLmJ1aWx0ID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRoaXMud29ya2VyTWVzc2FnZSgnc2VsZi5idWlsZFRpbGUnLCB7IHRpbGU6IHRoaXMuYnVpbGRBc01lc3NhZ2UoKSB9KS5jYXRjaChlID0+IHsgdGhyb3cgZTsgfSk7XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICAgIENhbGxlZCBvbiB3b3JrZXIgdG8gY2FuY2VsIGxvYWRpbmdcbiAgICAgICAgU3RhdGljIG1ldGhvZCBiZWNhdXNlIHRoZSB3b3JrZXIgb25seSBoYXMgb2JqZWN0IHJlcHJlc2VudGF0aW9ucyBvZiB0aWxlIGRhdGEsIHRoZXJlIGlzIG5vXG4gICAgICAgIHRpbGUgaW5zdGFuY2UgY3JlYXRlZCB5ZXQuXG4gICAgKi9cbiAgICBzdGF0aWMgY2FuY2VsKHRpbGUpIHtcbiAgICAgICAgaWYgKHRpbGUpIHtcbiAgICAgICAgICAgIHRpbGUuY2FuY2VsZWQgPSB0cnVlO1xuICAgICAgICAgICAgaWYgKHRpbGUuc291cmNlX2RhdGEgJiYgdGlsZS5zb3VyY2VfZGF0YS5yZXF1ZXN0KSB7XG4gICAgICAgICAgICAgICAgdGlsZS5zb3VyY2VfZGF0YS5yZXF1ZXN0LmFib3J0KCk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBUaWxlLmFib3J0QnVpbGQodGlsZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBQcm9jZXNzIGdlb21ldHJ5IGZvciB0aWxlIC0gY2FsbGVkIGJ5IHdlYiB3b3JrZXJcbiAgICAvLyBSZXR1cm5zIGEgc2V0IG9mIHRpbGUga2V5cyB0aGF0IHNob3VsZCBiZSBzZW50IHRvIHRoZSBtYWluIHRocmVhZCAoc28gdGhhdCB3ZSBjYW4gbWluaW1pemUgZGF0YSBleGNoYW5nZSBiZXR3ZWVuIHdvcmtlciBhbmQgbWFpbiB0aHJlYWQpXG4gICAgc3RhdGljIGJ1aWxkR2VvbWV0cnkgKHRpbGUsIHsgc2NlbmVfaWQsIGxheWVycywgc3R5bGVzLCBnbG9iYWwgfSkge1xuICAgICAgICB0aWxlLmRlYnVnLnJlbmRlcmluZyA9ICtuZXcgRGF0ZSgpO1xuICAgICAgICB0aWxlLmRlYnVnLmZlYXR1cmVzID0gMDtcblxuICAgICAgICBsZXQgZGF0YSA9IHRpbGUuc291cmNlX2RhdGE7XG5cbiAgICAgICAgQ29sbGlzaW9uLnN0YXJ0VGlsZSh0aWxlLmtleSk7XG5cbiAgICAgICAgLy8gUHJvY2VzcyBlYWNoIHRvcC1sZXZlbCBsYXllclxuICAgICAgICBmb3IgKGxldCBsYXllcl9uYW1lIGluIGxheWVycykge1xuICAgICAgICAgICAgbGV0IGxheWVyID0gbGF5ZXJzW2xheWVyX25hbWVdO1xuICAgICAgICAgICAgLy8gU2tpcCBsYXllcnMgd2l0aCBubyBkYXRhIHNvdXJjZSBkZWZpbmVkXG4gICAgICAgICAgICBpZiAoIWxheWVyIHx8ICFsYXllci5jb25maWcuZGF0YSkge1xuICAgICAgICAgICAgICAgIGxvZygnd2FybicsIGBMYXllciAke2xheWVyX25hbWV9IHdhcyBkZWZpbmVkIHdpdGhvdXQgYSBnZW9tZXRyeSBkYXRhIHNvdXJjZSBhbmQgd2lsbCBub3QgYmUgcmVuZGVyZWQuYCk7XG4gICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIFNvdXJjZSBuYW1lcyBkb24ndCBtYXRjaFxuICAgICAgICAgICAgaWYgKGxheWVyLmNvbmZpZy5kYXRhLnNvdXJjZSAhPT0gdGlsZS5zb3VyY2UpIHtcbiAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gR2V0IGRhdGEgZm9yIG9uZSBvciBtb3JlIGxheWVycyBmcm9tIHNvdXJjZVxuICAgICAgICAgICAgbGV0IHNvdXJjZV9sYXllcnMgPSBUaWxlLmdldERhdGFGb3JTb3VyY2UoZGF0YSwgbGF5ZXIuY29uZmlnLmRhdGEsIGxheWVyX25hbWUpO1xuXG4gICAgICAgICAgICAvLyBSZW5kZXIgZmVhdHVyZXMgaW4gbGF5ZXJcbiAgICAgICAgICAgIGZvciAobGV0IHM9MDsgcyA8IHNvdXJjZV9sYXllcnMubGVuZ3RoOyBzKyspIHtcbiAgICAgICAgICAgICAgICBsZXQgc291cmNlX2xheWVyID0gc291cmNlX2xheWVyc1tzXTtcbiAgICAgICAgICAgICAgICBsZXQgZ2VvbSA9IHNvdXJjZV9sYXllci5nZW9tO1xuICAgICAgICAgICAgICAgIGlmICghZ2VvbSkge1xuICAgICAgICAgICAgICAgICAgICBjb250aW51ZTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBmb3IgKGxldCBmID0gMDsgZiA8IGdlb20uZmVhdHVyZXMubGVuZ3RoOyBmKyspIHtcbiAgICAgICAgICAgICAgICAgICAgbGV0IGZlYXR1cmUgPSBnZW9tLmZlYXR1cmVzW2ZdO1xuICAgICAgICAgICAgICAgICAgICBpZiAoZmVhdHVyZS5nZW9tZXRyeSA9PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsgLy8gc2tpcCBmZWF0dXJlcyB3L28gZ2VvbWV0cnkgKHZhbGlkIEdlb0pTT04pXG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBsZXQgY29udGV4dCA9IFN0eWxlUGFyc2VyLmdldEZlYXR1cmVQYXJzZUNvbnRleHQoZmVhdHVyZSwgdGlsZSwgZ2xvYmFsKTtcbiAgICAgICAgICAgICAgICAgICAgY29udGV4dC53aW5kaW5nID0gdGlsZS5kZWZhdWx0X3dpbmRpbmc7XG4gICAgICAgICAgICAgICAgICAgIGNvbnRleHQuc291cmNlID0gdGlsZS5zb3VyY2U7ICAgICAgICAvLyBhZGQgZGF0YSBzb3VyY2UgbmFtZVxuICAgICAgICAgICAgICAgICAgICBjb250ZXh0LmxheWVyID0gc291cmNlX2xheWVyLmxheWVyOyAgLy8gYWRkIGRhdGEgc291cmNlIGxheWVyIG5hbWVcblxuICAgICAgICAgICAgICAgICAgICAvLyBHZXQgZHJhdyBncm91cHMgZm9yIHRoaXMgZmVhdHVyZVxuICAgICAgICAgICAgICAgICAgICBsZXQgZHJhd19ncm91cHMgPSBsYXllci5idWlsZERyYXdHcm91cHMoY29udGV4dCwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgIGlmICghZHJhd19ncm91cHMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gUmVuZGVyIGRyYXcgZ3JvdXBzXG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGdyb3VwX25hbWUgaW4gZHJhd19ncm91cHMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCBncm91cCA9IGRyYXdfZ3JvdXBzW2dyb3VwX25hbWVdO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFncm91cC52aXNpYmxlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIEFkZCB0byBzdHlsZVxuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHN0eWxlX25hbWUgPSBncm91cC5zdHlsZSB8fCBncm91cF9uYW1lO1xuICAgICAgICAgICAgICAgICAgICAgICAgbGV0IHN0eWxlID0gc3R5bGVzW3N0eWxlX25hbWVdO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXN0eWxlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nKCd3YXJuJywgYFN0eWxlICcke3N0eWxlX25hbWV9JyBub3QgZm91bmQsIHNraXBwaW5nIGxheWVyICcke2xheWVyX25hbWV9JzpgLCBncm91cCwgZmVhdHVyZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQubGF5ZXJzID0gZ3JvdXAubGF5ZXJzOyAgLy8gYWRkIG1hdGNoaW5nIGRyYXcgbGF5ZXJzXG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHN0eWxlLmFkZEZlYXR1cmUoZmVhdHVyZSwgZ3JvdXAsIGNvbnRleHQpO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgdGlsZS5kZWJ1Zy5mZWF0dXJlcysrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICB0aWxlLmRlYnVnLnJlbmRlcmluZyA9ICtuZXcgRGF0ZSgpIC0gdGlsZS5kZWJ1Zy5yZW5kZXJpbmc7XG5cbiAgICAgICAgLy8gU2VuZCBzdHlsZXMgYmFjayB0byBtYWluIHRocmVhZCBhcyB0aGV5IGZpbmlzaCBidWlsZGluZywgaW4gdHdvIGdyb3VwczogY29sbGlzaW9uIHZzLiBub24tY29sbGlzaW9uXG4gICAgICAgIGxldCB0aWxlX3N0eWxlcyA9IHRoaXMuc3R5bGVzRm9yVGlsZSh0aWxlLmtleSwgc3R5bGVzKS5tYXAocyA9PiBzdHlsZXNbc10pO1xuICAgICAgICBUaWxlLnNlbmRTdHlsZUdyb3Vwcyh0aWxlLCB0aWxlX3N0eWxlcywgeyBzY2VuZV9pZCB9LCBzdHlsZSA9PiBzdHlsZS5jb2xsaXNpb24gPyAnY29sbGlzaW9uJyA6ICdub24tY29sbGlzaW9uJyk7XG4gICAgICAgIC8vIFRpbGUuc2VuZFN0eWxlR3JvdXBzKHRpbGUsIHRpbGVfc3R5bGVzLCB7IHNjZW5lX2lkIH0sIHN0eWxlID0+IHN0eWxlLm5hbWUpOyAvLyBjYWxsIGZvciBlYWNoIHN0eWxlXG4gICAgICAgIC8vIFRpbGUuc2VuZFN0eWxlR3JvdXBzKHRpbGUsIHRpbGVfc3R5bGVzLCB7IHNjZW5lX2lkIH0sIHN0eWxlID0+ICdzdHlsZXMnKTsgLy8gYWxsIHN0eWxlcyBpbiBzaW5nbGUgY2FsbCAocHJldmlvdXMgYmVoYXZpb3IpXG4gICAgfVxuXG4gICAgc3RhdGljIHN0eWxlc0ZvclRpbGUgKHRpbGVfa2V5LCBzdHlsZXMpIHtcbiAgICAgICAgbGV0IHRpbGVfc3R5bGVzID0gW107XG4gICAgICAgIGZvciAobGV0IHMgaW4gc3R5bGVzKSB7XG4gICAgICAgICAgICBpZiAoc3R5bGVzW3NdLmhhc0RhdGFGb3JUaWxlKHRpbGVfa2V5KSkge1xuICAgICAgICAgICAgICAgIHRpbGVfc3R5bGVzLnB1c2gocyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHRpbGVfc3R5bGVzO1xuICAgIH1cblxuICAgIC8vIFNlbmQgZ3JvdXBzIG9mIHN0eWxlcyBiYWNrIHRvIG1haW4gdGhyZWFkLCBhc3luY2hyb25vdXNseSAoYXMgdGhleSBmaW5pc2ggYnVpbGRpbmcpLFxuICAgIC8vIGdyb3VwZWQgYnkgdGhlIHByb3ZpZGVkIGZ1bmN0aW9uXG4gICAgc3RhdGljIHNlbmRTdHlsZUdyb3Vwcyh0aWxlLCBzdHlsZXMsIHsgc2NlbmVfaWQgfSwgZ3JvdXBfYnkpIHtcbiAgICAgICAgLy8gR3JvdXAgc3R5bGVzXG4gICAgICAgIGxldCBncm91cHMgPSB7fTtcbiAgICAgICAgc3R5bGVzLmZvckVhY2gocyA9PiB7XG4gICAgICAgICAgICBsZXQgZ3JvdXBfbmFtZSA9IGdyb3VwX2J5KHMpO1xuICAgICAgICAgICAgZ3JvdXBzW2dyb3VwX25hbWVdID0gZ3JvdXBzW2dyb3VwX25hbWVdIHx8IFtdO1xuICAgICAgICAgICAgZ3JvdXBzW2dyb3VwX25hbWVdLnB1c2gocyk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIGlmIChPYmplY3Qua2V5cyhncm91cHMpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgIGxldCBwcm9ncmVzcyA9IHsgc3RhcnQ6IHRydWUgfTtcbiAgICAgICAgICAgIHRpbGUubWVzaF9kYXRhID0ge307XG5cbiAgICAgICAgICAgIGZvciAobGV0IGdyb3VwX25hbWUgaW4gZ3JvdXBzKSB7XG4gICAgICAgICAgICAgICAgbGV0IGdyb3VwID0gZ3JvdXBzW2dyb3VwX25hbWVdO1xuXG4gICAgICAgICAgICAgICAgUHJvbWlzZS5hbGwoZ3JvdXAubWFwKHN0eWxlID0+IHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN0eWxlLmVuZERhdGEodGlsZSkudGhlbihzdHlsZV9kYXRhID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzdHlsZV9kYXRhKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGlsZS5tZXNoX2RhdGFbc3R5bGUubmFtZV0gPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlcnRleF9kYXRhOiBzdHlsZV9kYXRhLnZlcnRleF9kYXRhLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZXJ0ZXhfZWxlbWVudHM6IHN0eWxlX2RhdGEudmVydGV4X2VsZW1lbnRzLFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmlmb3Jtczogc3R5bGVfZGF0YS51bmlmb3JtcyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dHVyZXM6IHN0eWxlX2RhdGEudGV4dHVyZXNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9KSlcbiAgICAgICAgICAgICAgICAudGhlbigoKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGxvZygndHJhY2UnLCBgRmluaXNoZWQgc3R5bGUgZ3JvdXAgJyR7Z3JvdXBfbmFtZX0nIGZvciB0aWxlICR7dGlsZS5rZXl9YCk7XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gQ2xlYXIgZ3JvdXAgYW5kIGNoZWNrIGlmIGFsbCBncm91cHMgZmluaXNoZWRcbiAgICAgICAgICAgICAgICAgICAgZ3JvdXBzW2dyb3VwX25hbWVdID0gW107XG4gICAgICAgICAgICAgICAgICAgIGlmIChPYmplY3Qua2V5cyhncm91cHMpLmV2ZXJ5KGcgPT4gZ3JvdXBzW2ddLmxlbmd0aCA9PT0gMCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb2dyZXNzLmRvbmUgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gU2VuZCBtZXNoZXMgdG8gbWFpbiB0aHJlYWRcbiAgICAgICAgICAgICAgICAgICAgV29ya2VyQnJva2VyLnBvc3RNZXNzYWdlKFxuICAgICAgICAgICAgICAgICAgICAgICAgYFRpbGVNYW5hZ2VyXyR7c2NlbmVfaWR9LmJ1aWxkVGlsZVN0eWxlc0NvbXBsZXRlZGAsXG4gICAgICAgICAgICAgICAgICAgICAgICBXb3JrZXJCcm9rZXIud2l0aFRyYW5zZmVyYWJsZXMoeyB0aWxlOiBUaWxlLnNsaWNlKHRpbGUsIFsnbWVzaF9kYXRhJ10pLCBwcm9ncmVzcyB9KVxuICAgICAgICAgICAgICAgICAgICApO1xuICAgICAgICAgICAgICAgICAgICBwcm9ncmVzcy5zdGFydCA9IG51bGw7XG4gICAgICAgICAgICAgICAgICAgIHRpbGUubWVzaF9kYXRhID0ge307IC8vIHJlc2V0IHNvIGVhY2ggZ3JvdXAgc2VuZHMgc2VwYXJhdGUgc2V0IG9mIHN0eWxlIG1lc2hlc1xuXG4gICAgICAgICAgICAgICAgICAgIGlmIChwcm9ncmVzcy5kb25lKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBDb2xsaXNpb24ucmVzZXRUaWxlKHRpbGUua2V5KTsgLy8gY2xlYXIgY29sbGlzaW9uIGlmIHdlJ3JlIGRvbmUgd2l0aCB0aGUgdGlsZVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAvLyBOb3RoaW5nIHRvIGJ1aWxkLCByZXR1cm4gZW1wdHkgdGlsZSB0byBtYWluIHRocmVhZFxuICAgICAgICAgICAgV29ya2VyQnJva2VyLnBvc3RNZXNzYWdlKFxuICAgICAgICAgICAgICAgIGBUaWxlTWFuYWdlcl8ke3NjZW5lX2lkfS5idWlsZFRpbGVTdHlsZXNDb21wbGV0ZWRgLFxuICAgICAgICAgICAgICAgIFdvcmtlckJyb2tlci53aXRoVHJhbnNmZXJhYmxlcyh7IHRpbGU6IFRpbGUuc2xpY2UodGlsZSksIHByb2dyZXNzOiB7IHN0YXJ0OiB0cnVlLCBkb25lOiB0cnVlIH0gfSlcbiAgICAgICAgICAgICk7XG4gICAgICAgICAgICBDb2xsaXNpb24ucmVzZXRUaWxlKHRpbGUua2V5KTsgLy8gY2xlYXIgY29sbGlzaW9uIGlmIHdlJ3JlIGRvbmUgd2l0aCB0aGUgdGlsZVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLyoqXG4gICAgICAgIFJldHJpZXZlcyBnZW9tZXRyeSBmcm9tIGEgdGlsZSBhY2NvcmRpbmcgdG8gYSBkYXRhIHNvdXJjZSBkZWZpbml0aW9uXG4gICAgICAgIFJldHVybnMgYW4gYXJyYXkgb2Ygb2JqZWN0cyB3aXRoOlxuICAgICAgICAgICAgbGF5ZXI6IHNvdXJjZSBsYXllciBuYW1lXG4gICAgICAgICAgICBnZW9tOiBHZW9KU09OIEZlYXR1cmVDb2xsZWN0aW9uXG4gICAgKi9cbiAgICBzdGF0aWMgZ2V0RGF0YUZvclNvdXJjZSAoc291cmNlX2RhdGEsIHNvdXJjZV9jb25maWcsIGRlZmF1bHRfbGF5ZXIgPSBudWxsKSB7XG4gICAgICAgIHZhciBsYXllcnMgPSBbXTtcblxuICAgICAgICBpZiAoc291cmNlX2NvbmZpZyAhPSBudWxsKSB7XG4gICAgICAgICAgICAvLyBJZiBubyBsYXllciBzcGVjaWZpZWQsIGFuZCBhIGRlZmF1bHQgc291cmNlIGxheWVyIGV4aXN0c1xuICAgICAgICAgICAgaWYgKCFzb3VyY2VfY29uZmlnLmxheWVyICYmIHNvdXJjZV9kYXRhLmxheWVycy5fZGVmYXVsdCkge1xuICAgICAgICAgICAgICAgIGxheWVycy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgZ2VvbTogc291cmNlX2RhdGEubGF5ZXJzLl9kZWZhdWx0XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBJZiBubyBsYXllciBzcGVjaWZpZWQsIGFuZCBhIGRlZmF1bHQgcmVxdWVzdGVkIGxheWVyIGV4aXN0c1xuICAgICAgICAgICAgZWxzZSBpZiAoIXNvdXJjZV9jb25maWcubGF5ZXIgJiYgZGVmYXVsdF9sYXllcikge1xuICAgICAgICAgICAgICAgIGxheWVycy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgbGF5ZXI6IGRlZmF1bHRfbGF5ZXIsXG4gICAgICAgICAgICAgICAgICAgIGdlb206IHNvdXJjZV9kYXRhLmxheWVyc1tkZWZhdWx0X2xheWVyXVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gSWYgYSBsYXllciBpcyBzcGVjaWZpZWQgYnkgbmFtZSwgdXNlIGl0XG4gICAgICAgICAgICBlbHNlIGlmICh0eXBlb2Ygc291cmNlX2NvbmZpZy5sYXllciA9PT0gJ3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICBsYXllcnMucHVzaCh7XG4gICAgICAgICAgICAgICAgICAgIGxheWVyOiBzb3VyY2VfY29uZmlnLmxheWVyLFxuICAgICAgICAgICAgICAgICAgICBnZW9tOiBzb3VyY2VfZGF0YS5sYXllcnNbc291cmNlX2NvbmZpZy5sYXllcl1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIElmIG11bHRpcGxlIGxheWVycyBhcmUgc3BlY2lmaWVkIGJ5IG5hbWUsIGNvbWJpbmUgdGhlbVxuICAgICAgICAgICAgZWxzZSBpZiAoQXJyYXkuaXNBcnJheShzb3VyY2VfY29uZmlnLmxheWVyKSkge1xuICAgICAgICAgICAgICAgIHNvdXJjZV9jb25maWcubGF5ZXIuZm9yRWFjaChsYXllciA9PiB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChzb3VyY2VfZGF0YS5sYXllcnNbbGF5ZXJdICYmIHNvdXJjZV9kYXRhLmxheWVyc1tsYXllcl0uZmVhdHVyZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxheWVycy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXllcixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZW9tOiBzb3VyY2VfZGF0YS5sYXllcnNbbGF5ZXJdXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGxheWVycztcbiAgICB9XG5cbiAgICAvKipcbiAgICAgICBDYWxsZWQgb24gbWFpbiB0aHJlYWQgd2hlbiBhIHdlYiB3b3JrZXIgY29tcGxldGVzIHByb2Nlc3NpbmdcbiAgICAgICBmb3IgYSBzaW5nbGUgdGlsZS5cbiAgICAqL1xuICAgIGJ1aWxkTWVzaGVzKHN0eWxlcywgcHJvZ3Jlc3MpIHtcbiAgICAgICAgaWYgKHRoaXMuZXJyb3IpIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIERlYnVnXG4gICAgICAgIHRoaXMuZGVidWcuZ2VvbWV0cmllcyA9IDA7XG4gICAgICAgIHRoaXMuZGVidWcuYnVmZmVyX3NpemUgPSAwO1xuXG4gICAgICAgIC8vIENyZWF0ZSBWQk9zXG4gICAgICAgIGxldCBtZXNoZXMgPSB7fSwgdGV4dHVyZXMgPSBbXTsgLy8gbmV3IGRhdGEgdG8gYmUgYWRkZWQgdG8gdGlsZVxuICAgICAgICBsZXQgbWVzaF9kYXRhID0gdGhpcy5tZXNoX2RhdGE7XG4gICAgICAgIGlmIChtZXNoX2RhdGEpIHtcbiAgICAgICAgICAgIGZvciAodmFyIHMgaW4gbWVzaF9kYXRhKSB7XG4gICAgICAgICAgICAgICAgaWYgKG1lc2hfZGF0YVtzXS52ZXJ0ZXhfZGF0YSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRlYnVnLmJ1ZmZlcl9zaXplICs9IG1lc2hfZGF0YVtzXS52ZXJ0ZXhfZGF0YS5ieXRlTGVuZ3RoO1xuICAgICAgICAgICAgICAgICAgICBpZiAobWVzaF9kYXRhW3NdLnZlcnRleF9lbGVtZW50cykge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGhpcy5kZWJ1Zy5idWZmZXJfc2l6ZSArPSBtZXNoX2RhdGFbc10udmVydGV4X2VsZW1lbnRzLmJ5dGVMZW5ndGg7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKCFzdHlsZXNbc10pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxvZygnd2FybicsIGBDb3VsZCBub3QgY3JlYXRlIG1lc2ggYmVjYXVzZSBzdHlsZSAnJHtzfScgbm90IGZvdW5kLCBmb3IgdGlsZSAke3RoaXMua2V5fSwgYWJvcnRpbmcgdGlsZWApO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgbWVzaGVzW3NdID0gc3R5bGVzW3NdLm1ha2VNZXNoKG1lc2hfZGF0YVtzXS52ZXJ0ZXhfZGF0YSwgbWVzaF9kYXRhW3NdLnZlcnRleF9lbGVtZW50cywgbWVzaF9kYXRhW3NdKTtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5kZWJ1Zy5nZW9tZXRyaWVzICs9IG1lc2hlc1tzXS5nZW9tZXRyeV9jb3VudDtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyBBc3NpZ24gdGV4dHVyZSBvd25lcnNoaXAgdG8gdGlsZXNcbiAgICAgICAgICAgICAgICAvLyBOb3RlIHRoYXQgaXQncyB2YWxpZCBmb3IgYSBzaW5nbGUgdGV4dHVyZSB0byBiZSByZWZlcmVuY2VkIGZyb20gbXVsdGlwbGUgc3R5bGVzXG4gICAgICAgICAgICAgICAgLy8gKGUuZy4gc2FtZSByYXN0ZXIgdGV4dHVyZSBhdHRhY2hlZCB0byBtdWx0aXBsZSBzb3VyY2VzKS4gVGhpcyBtZWFucyB0aGUgc2FtZVxuICAgICAgICAgICAgICAgIC8vIHRleHR1cmUgbWF5IGJlIGFkZGVkIHRvIHRoZSB0aWxlJ3MgdGV4dHVyZSBsaXN0IG1vcmUgdGhhbiBvbmNlLCB3aGljaCBlbnN1cmVzXG4gICAgICAgICAgICAgICAgLy8gdGhhdCBpdCBpcyBwcm9wZXJseSByZWxlYXNlZCAodG8gbWF0Y2ggaXRzIHJldGFpbiBjb3VudCkuXG4gICAgICAgICAgICAgICAgaWYgKG1lc2hfZGF0YVtzXS50ZXh0dXJlcykge1xuICAgICAgICAgICAgICAgICAgICB0ZXh0dXJlcy5wdXNoKC4uLm1lc2hfZGF0YVtzXS50ZXh0dXJlcyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGRlbGV0ZSB0aGlzLm1lc2hfZGF0YTtcblxuICAgICAgICAvLyBJbml0aWFsaXplIHRyYWNraW5nIGZvciB0aGlzIHRpbGUgZ2VuZXJhdGlvblxuICAgICAgICBpZiAocHJvZ3Jlc3Muc3RhcnQpIHtcbiAgICAgICAgICAgIHRoaXMubmV3X21lc2hfc3R5bGVzID0gW107IC8vIGtlZXAgdHJhY2sgb2Ygd2hpY2ggbWVzaGVzIHdlcmUgYnVpbHQgYXMgcGFydCBvZiBjdXJyZW50IGdlbmVyYXRpb25cbiAgICAgICAgICAgIHRoaXMucHJldmlvdXNfdGV4dHVyZXMgPSBbLi4udGhpcy50ZXh0dXJlc107IC8vIGNvcHkgb2xkIGxpc3Qgb2YgdGV4dHVyZXNcbiAgICAgICAgICAgIHRoaXMudGV4dHVyZXMgPSBbXTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIE5ldyBtZXNoZXNcbiAgICAgICAgZm9yIChsZXQgbSBpbiBtZXNoZXMpIHtcbiAgICAgICAgICAgIGlmICh0aGlzLm1lc2hlc1ttXSkge1xuICAgICAgICAgICAgICAgIHRoaXMubWVzaGVzW21dLmRlc3Ryb3koKTsgLy8gZnJlZSBvbGQgbWVzaFxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5tZXNoZXNbbV0gPSBtZXNoZXNbbV07IC8vIHNldCBuZXcgbWVzaFxuICAgICAgICAgICAgdGhpcy5uZXdfbWVzaF9zdHlsZXMucHVzaChtKTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIE5ldyB0ZXh0dXJlc1xuICAgICAgICB0aGlzLnRleHR1cmVzLnB1c2goLi4udGV4dHVyZXMpO1xuXG4gICAgICAgIGlmIChwcm9ncmVzcy5kb25lKSB7XG4gICAgICAgICAgICAvLyBSZWxlYXNlIHVuLXJlcGxhY2VkIG1lc2hlcyAoZXhpc3RpbmcgaW4gcHJldmlvdXMgZ2VuZXJhdGlvbiwgYnV0IHdlcmVuJ3QgYnVpbHQgZm9yIHRoaXMgb25lKVxuICAgICAgICAgICAgZm9yIChsZXQgbSBpbiB0aGlzLm1lc2hlcykge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLm5ld19tZXNoX3N0eWxlcy5pbmRleE9mKG0pID09PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLm1lc2hlc1ttXS5kZXN0cm95KCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgdGhpcy5uZXdfbWVzaF9zdHlsZXMgPSBbXTtcblxuICAgICAgICAgICAgLy8gUmVsZWFzZSBvbGQgdGV4dHVyZXNcbiAgICAgICAgICAgIHRoaXMucHJldmlvdXNfdGV4dHVyZXMuZm9yRWFjaCh0ID0+IFRleHR1cmUucmVsZWFzZSh0KSk7XG4gICAgICAgICAgICB0aGlzLnByZXZpb3VzX3RleHR1cmVzID0gW107XG5cbiAgICAgICAgICAgIHRoaXMuZGVidWcuZ2VvbV9yYXRpbyA9ICh0aGlzLmRlYnVnLmdlb21ldHJpZXMgLyB0aGlzLmRlYnVnLmZlYXR1cmVzKS50b0ZpeGVkKDEpO1xuICAgICAgICAgICAgdGhpcy5wcmludERlYnVnKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvKipcbiAgICAgICAgQ2FsbGVkIG9uIG1haW4gdGhyZWFkIHdoZW4gd2ViIHdvcmtlciBjb21wbGV0ZXMgcHJvY2Vzc2luZywgYnV0IHRpbGUgaGFzIHNpbmNlIGJlZW4gZGlzY2FyZGVkXG4gICAgICAgIEZyZWVzIHJlc291cmNlcyB0aGF0IHdvdWxkIGhhdmUgYmVlbiB0cmFuc2ZlcnJlZCB0byB0aGUgdGlsZSBvYmplY3QuXG4gICAgICAgIFN0YXRpYyBtZXRob2QgYmVjYXVzZSB0aGUgdGlsZSBvYmplY3Qgbm8gbG9uZ2VyIGV4aXN0cyAodGhlIHRpbGUgZGF0YSByZXR1cm5lZCBieSB0aGUgd29ya2VyIGlzIHBhc3NlZCBpbnN0ZWFkKS5cbiAgICAqL1xuICAgIHN0YXRpYyBhYm9ydEJ1aWxkICh0aWxlKSB7XG4gICAgICAgIC8vIFJlbGVhc2VzIG1lc2hlc1xuICAgICAgICBpZiAodGlsZS5tZXNoX2RhdGEpIHtcbiAgICAgICAgICAgIGZvciAobGV0IHMgaW4gdGlsZS5tZXNoX2RhdGEpIHtcbiAgICAgICAgICAgICAgICBsZXQgdGV4dHVyZXMgPSB0aWxlLm1lc2hfZGF0YVtzXS50ZXh0dXJlcztcbiAgICAgICAgICAgICAgICBpZiAodGV4dHVyZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgdGV4dHVyZXMuZm9yRWFjaCh0ID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxldCB0ZXh0dXJlID0gVGV4dHVyZS50ZXh0dXJlc1t0XTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0ZXh0dXJlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9nKCd0cmFjZScsIGByZWxlYXNpbmcgdGV4dHVyZSAke3R9IGZvciB0aWxlICR7dGlsZS5rZXl9YCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dHVyZS5yZWxlYXNlKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIFVwZGF0ZSByZWxhdGl2ZSB0byB2aWV3XG4gICAgdXBkYXRlICgpIHtcbiAgICAgICAgbGV0IGNvb3JkcyA9IHRoaXMuY29vcmRzO1xuICAgICAgICBpZiAoY29vcmRzLnogIT09IHRoaXMudmlldy5jZW50ZXIudGlsZS56KSB7XG4gICAgICAgICAgICBjb29yZHMgPSBUaWxlLmNvb3JkaW5hdGVBdFpvb20oY29vcmRzLCB0aGlzLnZpZXcuY2VudGVyLnRpbGUueik7XG4gICAgICAgIH1cbiAgICAgICAgdGhpcy5jZW50ZXJfZGlzdCA9IE1hdGguYWJzKHRoaXMudmlldy5jZW50ZXIudGlsZS54IC0gY29vcmRzLngpICsgTWF0aC5hYnModGhpcy52aWV3LmNlbnRlci50aWxlLnkgLSBjb29yZHMueSk7XG4gICAgfVxuXG4gICAgLy8gU2V0IGFzIGEgcHJveHkgdGlsZSBmb3IgYW5vdGhlciB0aWxlXG4gICAgc2V0UHJveHlGb3IgKHRpbGUpIHtcbiAgICAgICAgaWYgKHRpbGUpIHtcbiAgICAgICAgICAgIHRoaXMudmlzaWJsZSA9IHRydWU7XG4gICAgICAgICAgICB0aGlzLnByb3h5X2ZvciA9IHRoaXMucHJveHlfZm9yIHx8IFtdO1xuICAgICAgICAgICAgdGhpcy5wcm94eV9mb3IucHVzaCh0aWxlKTtcbiAgICAgICAgICAgIHRoaXMucHJveHlfZGVwdGggPSAxOyAvLyBkcmF3IHByb3hpZXMgYSBoYWxmLWxheWVyIGJhY2sgKG9yZGVyIGlzIHNjYWxlZCAyeCB0byBhdm9pZCBpbnRlZ2VyIHRydW5jYXRpb24pXG4gICAgICAgICAgICB0aWxlLnByb3hpZWRfYXMgPSAodGlsZS5zdHlsZV96b29tID4gdGhpcy5zdHlsZV96b29tID8gJ2NoaWxkJyA6ICdwYXJlbnQnKTtcbiAgICAgICAgICAgIHRoaXMudXBkYXRlKCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLnByb3h5X2ZvciA9IG51bGw7XG4gICAgICAgICAgICB0aGlzLnByb3h5X2RlcHRoID0gMDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIC8vIFByb3h5IHRpbGVzIG9ubHkgbmVlZCB0byByZW5kZXIgYSBzcGVjaWZpYyBzdHlsZSBpZiBhbnkgb2YgdGhlIHRpbGVzIHRoZXkgYXJlIHByb3h5aW5nICpmb3IqXG4gICAgLy8gaGF2ZW4ndCBmaW5pc2hlZCBsb2FkaW5nIHRoYXQgc3R5bGUgeWV0LiBJZiBhbGwgcHJveGllZCB0aWxlcyAqaGF2ZSogZGF0YSBmb3IgdGhhdCBzdHlsZSwgdGhlbiBpdCdzXG4gICAgLy8gc2FmZSB0byBoaWRlIHRoZSBwcm94eSB0aWxlJ3MgdmVyc2lvbi5cbiAgICBzaG91bGRQcm94eUZvclN0eWxlIChzdHlsZSkge1xuICAgICAgICByZXR1cm4gIXRoaXMucHJveHlfZm9yIHx8IHRoaXMucHJveHlfZm9yLnNvbWUodCA9PiB0Lm1lc2hlc1tzdHlsZV0gPT0gbnVsbCk7XG4gICAgfVxuXG4gICAgLy8gVXBkYXRlIG1vZGVsIG1hdHJpeCBhbmQgdGlsZSB1bmlmb3Jtc1xuICAgIHNldHVwUHJvZ3JhbSAoeyBtb2RlbCwgbW9kZWwzMiB9LCBwcm9ncmFtKSB7XG4gICAgICAgIC8vIFRpbGUgb3JpZ2luXG4gICAgICAgIHByb2dyYW0udW5pZm9ybSgnNGZ2JywgJ3VfdGlsZV9vcmlnaW4nLCBbdGhpcy5taW4ueCwgdGhpcy5taW4ueSwgdGhpcy5zdHlsZV96b29tLCB0aGlzLmNvb3Jkcy56XSk7XG4gICAgICAgIHByb2dyYW0udW5pZm9ybSgnMWYnLCAndV90aWxlX3Byb3h5X2RlcHRoJywgdGhpcy5wcm94eV9kZXB0aCk7XG5cbiAgICAgICAgLy8gTW9kZWwgLSB0cmFuc2Zvcm0gdGlsZSBzcGFjZSBpbnRvIHdvcmxkIHNwYWNlIChtZXRlcnMsIGFic29sdXRlIG1lcmNhdG9yIHBvc2l0aW9uKVxuICAgICAgICBtYXQ0LmlkZW50aXR5KG1vZGVsKTtcbiAgICAgICAgbWF0NC50cmFuc2xhdGUobW9kZWwsIG1vZGVsLCB2ZWMzLmZyb21WYWx1ZXModGhpcy5taW4ueCwgdGhpcy5taW4ueSwgMCkpO1xuICAgICAgICBtYXQ0LnNjYWxlKG1vZGVsLCBtb2RlbCwgdmVjMy5mcm9tVmFsdWVzKHRoaXMuc3Bhbi54IC8gR2VvLnRpbGVfc2NhbGUsIC0xICogdGhpcy5zcGFuLnkgLyBHZW8udGlsZV9zY2FsZSwgMSkpOyAvLyBzY2FsZSB0aWxlIGxvY2FsIGNvb3JkcyB0byBtZXRlcnNcbiAgICAgICAgbWF0NC5jb3B5KG1vZGVsMzIsIG1vZGVsKTtcbiAgICAgICAgcHJvZ3JhbS51bmlmb3JtKCdNYXRyaXg0ZnYnLCAndV9tb2RlbCcsIG1vZGVsMzIpO1xuXG4gICAgICAgIC8vIEZhZGUgaW4gbGFiZWxzIGFjY29yZGluZyB0byBwcm94eSBzdGF0dXMsIGF2b2lkaW5nIFwiZmxpY2tlcmluZ1wiIHdoZXJlXG4gICAgICAgIC8vIGxhYmVscyBxdWlja2x5IGdvIGZyb20gaW52aXNpYmxlIGJhY2sgdG8gdmlzaWJsZVxuICAgICAgICBwcm9ncmFtLnVuaWZvcm0oJzFpJywgJ3VfdGlsZV9mYWRlX2luJywgdGhpcy5mYWRlX2luICYmIHRoaXMucHJveGllZF9hcyAhPT0gJ2NoaWxkJyk7XG4gICAgfVxuXG4gICAgLy8gU2xpY2UgYSBzdWJzZXQgb2Yga2V5cyBvdXQgb2YgYSB0aWxlXG4gICAgLy8gSW5jbHVkZXMgYSBtaW5pbXVtIHNldCBvZiBwcmUtZGVmaW5lZCBrZXlzIGZvciBsb2FkIHN0YXRlLCBkZWJ1Zy4gZXRjLlxuICAgIC8vIFdlIHVzZSB0aGlzIHRvIHNlbmQgYSBzdWJzZXQgb2YgdGhlIHRpbGUgYmFjayB0byB0aGUgbWFpbiB0aHJlYWQsIHRvIG1pbmltaXplIHVubmVjZXNzYXJ5IGRhdGEgdHJhbnNmZXJcbiAgICAvLyAoZS5nLiB2ZXJ5IGxhcmdlIGl0ZW1zIGxpa2UgZmVhdHVyZSBnZW9tZXRyeSBhcmUgbm90IG5lZWRlZCBvbiB0aGUgbWFpbiB0aHJlYWQpXG4gICAgc3RhdGljIHNsaWNlICh0aWxlLCBrZXlzKSB7XG4gICAgICAgIGxldCBrZWVwID0gW1xuICAgICAgICAgICAgJ2tleScsXG4gICAgICAgICAgICAnbG9hZGluZycsXG4gICAgICAgICAgICAnbG9hZGVkJyxcbiAgICAgICAgICAgICdnZW5lcmF0aW9uJyxcbiAgICAgICAgICAgICdlcnJvcicsXG4gICAgICAgICAgICAnZGVidWcnXG4gICAgICAgIF07XG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KGtleXMpKSB7XG4gICAgICAgICAgICBrZWVwLnB1c2goLi4ua2V5cyk7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBCdWlsZCB0aGUgdGlsZSBzdWJzZXRcbiAgICAgICAgdmFyIHRpbGVfc3Vic2V0ID0ge307XG4gICAgICAgIGZvciAobGV0IGs9MDsgayA8IGtlZXAubGVuZ3RoOyBrKyspIHtcbiAgICAgICAgICAgIGNvbnN0IGtleSA9IGtlZXBba107XG4gICAgICAgICAgICB0aWxlX3N1YnNldFtrZXldID0gdGlsZVtrZXldO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRpbGVfc3Vic2V0O1xuICAgIH1cblxuICAgIG1lcmdlKG90aGVyKSB7XG4gICAgICAgIGZvciAodmFyIGtleSBpbiBvdGhlcikge1xuICAgICAgICAgICAgaWYgKGtleSAhPT0gJ2tleScpIHtcbiAgICAgICAgICAgICAgICB0aGlzW2tleV0gPSBvdGhlcltrZXldO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzO1xuICAgIH1cblxuICAgIHByaW50RGVidWcgKCkge1xuICAgICAgICBsb2coJ2RlYnVnJywgYFRpbGU6IGRlYnVnIGZvciAke3RoaXMua2V5fTogWyAgJHtKU09OLnN0cmluZ2lmeSh0aGlzLmRlYnVnKX0gXWApO1xuICAgIH1cblxufVxuXG5UaWxlLmNvb3JkX2NoaWxkcmVuID0ge307IC8vIG9ubHkgYWxsb2NhdGUgY2hpbGRyZW4gY29vcmRpbmF0ZXMgb25jZSBwZXIgY29vcmRpbmF0ZVxuIiwiaW1wb3J0IFRpbGUgZnJvbSAnLi90aWxlJztcbmltcG9ydCBUaWxlUHlyYW1pZCBmcm9tICcuL3RpbGVfcHlyYW1pZCc7XG5pbXBvcnQgbG9nIGZyb20gJy4vdXRpbHMvbG9nJztcbmltcG9ydCBXb3JrZXJCcm9rZXIgZnJvbSAnLi91dGlscy93b3JrZXJfYnJva2VyJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgVGlsZU1hbmFnZXIge1xuXG4gICAgY29uc3RydWN0b3IoeyBzY2VuZSwgdmlldyB9KSB7XG4gICAgICAgIHRoaXMuc2NlbmUgPSBzY2VuZTtcbiAgICAgICAgdGhpcy52aWV3ID0gdmlldztcbiAgICAgICAgdGhpcy50aWxlcyA9IHt9O1xuICAgICAgICB0aGlzLnB5cmFtaWQgPSBuZXcgVGlsZVB5cmFtaWQoKTtcbiAgICAgICAgdGhpcy52aXNpYmxlX2Nvb3JkcyA9IHt9O1xuICAgICAgICB0aGlzLnF1ZXVlZF9jb29yZHMgPSBbXTtcbiAgICAgICAgdGhpcy5idWlsZGluZ190aWxlcyA9IG51bGw7XG4gICAgICAgIHRoaXMucmVuZGVyYWJsZV90aWxlcyA9IFtdO1xuICAgICAgICB0aGlzLmFjdGl2ZV9zdHlsZXMgPSBbXTtcblxuICAgICAgICAvLyBQcm92aWRlIGEgaG9vayBmb3IgdGhpcyBvYmplY3QgdG8gYmUgY2FsbGVkIGZyb20gd29ya2VyIHRocmVhZHNcbiAgICAgICAgdGhpcy5tYWluX3RocmVhZF90YXJnZXQgPSBbJ1RpbGVNYW5hZ2VyJywgdGhpcy5zY2VuZS5pZF0uam9pbignXycpO1xuICAgICAgICBXb3JrZXJCcm9rZXIuYWRkVGFyZ2V0KHRoaXMubWFpbl90aHJlYWRfdGFyZ2V0LCB0aGlzKTtcbiAgICB9XG5cbiAgICBkZXN0cm95KCkge1xuICAgICAgICB0aGlzLmZvckVhY2hUaWxlKHRpbGUgPT4gdGlsZS5kZXN0cm95KCkpO1xuICAgICAgICB0aGlzLnRpbGVzID0ge307XG4gICAgICAgIHRoaXMucHlyYW1pZCA9IG51bGw7XG4gICAgICAgIHRoaXMudmlzaWJsZV9jb29yZHMgPSB7fTtcbiAgICAgICAgdGhpcy5xdWV1ZWRfY29vcmRzID0gW107XG4gICAgICAgIHRoaXMuc2NlbmUgPSBudWxsO1xuICAgICAgICB0aGlzLnZpZXcgPSBudWxsO1xuICAgIH1cblxuICAgIGtlZXBUaWxlKHRpbGUpIHtcbiAgICAgICAgdGhpcy50aWxlc1t0aWxlLmtleV0gPSB0aWxlO1xuICAgICAgICB0aGlzLnB5cmFtaWQuYWRkVGlsZSh0aWxlKTtcbiAgICB9XG5cbiAgICBoYXNUaWxlKGtleSkge1xuICAgICAgICByZXR1cm4gdGhpcy50aWxlc1trZXldICE9PSB1bmRlZmluZWQ7XG4gICAgfVxuXG4gICAgZm9yZ2V0VGlsZShrZXkpIHtcbiAgICAgICAgaWYgKHRoaXMuaGFzVGlsZShrZXkpKSB7XG4gICAgICAgICAgICBsZXQgdGlsZSA9IHRoaXMudGlsZXNba2V5XTtcbiAgICAgICAgICAgIHRoaXMucHlyYW1pZC5yZW1vdmVUaWxlKHRpbGUpO1xuICAgICAgICB9XG5cbiAgICAgICAgZGVsZXRlIHRoaXMudGlsZXNba2V5XTtcbiAgICAgICAgdGhpcy50aWxlQnVpbGRTdG9wKGtleSk7XG4gICAgfVxuXG4gICAgLy8gUmVtb3ZlIGEgc2luZ2xlIHRpbGVcbiAgICByZW1vdmVUaWxlKGtleSkge1xuICAgICAgICBsb2coJ3RyYWNlJywgYHRpbGUgdW5sb2FkIGZvciAke2tleX1gKTtcblxuICAgICAgICB2YXIgdGlsZSA9IHRoaXMudGlsZXNba2V5XTtcblxuICAgICAgICBpZiAodGlsZSAhPSBudWxsKSB7XG4gICAgICAgICAgICB0aWxlLmRlc3Ryb3koKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMuZm9yZ2V0VGlsZSh0aWxlLmtleSk7XG4gICAgICAgIHRoaXMuc2NlbmUucmVxdWVzdFJlZHJhdygpO1xuICAgIH1cblxuICAgIC8vIFJ1biBhIGZ1bmN0aW9uIG9uIGVhY2ggdGlsZVxuICAgIGZvckVhY2hUaWxlKGZ1bmMpIHtcbiAgICAgICAgZm9yIChsZXQgdCBpbiB0aGlzLnRpbGVzKSB7XG4gICAgICAgICAgICBmdW5jKHRoaXMudGlsZXNbdF0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gUmVtb3ZlIHRpbGVzIHRoYXQgcGFzcyBhIGZpbHRlciBjb25kaXRpb25cbiAgICByZW1vdmVUaWxlcyhmaWx0ZXIpIHtcbiAgICAgICAgbGV0IHJlbW92ZV90aWxlcyA9IFtdO1xuICAgICAgICBmb3IgKGxldCB0IGluIHRoaXMudGlsZXMpIHtcbiAgICAgICAgICAgIGxldCB0aWxlID0gdGhpcy50aWxlc1t0XTtcbiAgICAgICAgICAgIGlmIChmaWx0ZXIodGlsZSkpIHtcbiAgICAgICAgICAgICAgICByZW1vdmVfdGlsZXMucHVzaCh0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICBmb3IgKGxldCByPTA7IHIgPCByZW1vdmVfdGlsZXMubGVuZ3RoOyByKyspIHtcbiAgICAgICAgICAgIGxldCBrZXkgPSByZW1vdmVfdGlsZXNbcl07XG4gICAgICAgICAgICB0aGlzLnJlbW92ZVRpbGUoa2V5KTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHVwZGF0ZVRpbGVzRm9yVmlldygpIHtcbiAgICAgICAgLy8gRmluZCB2aXNpYmxlIHRpbGVzIGFuZCBsb2FkIG5ldyBvbmVzXG4gICAgICAgIGxldCBwcmV2X2Nvb3JkcyA9IE9iamVjdC5rZXlzKHRoaXMudmlzaWJsZV9jb29yZHMpO1xuICAgICAgICB0aGlzLnZpc2libGVfY29vcmRzID0ge307XG4gICAgICAgIGxldCB0aWxlX2Nvb3JkcyA9IHRoaXMudmlldy5maW5kVmlzaWJsZVRpbGVDb29yZGluYXRlcygpO1xuICAgICAgICBmb3IgKGxldCBjPTA7IGMgPCB0aWxlX2Nvb3Jkcy5sZW5ndGg7IGMrKykge1xuICAgICAgICAgICAgY29uc3QgY29vcmRzID0gdGlsZV9jb29yZHNbY107XG4gICAgICAgICAgICB0aGlzLnF1ZXVlQ29vcmRpbmF0ZShjb29yZHMpO1xuICAgICAgICAgICAgdGhpcy52aXNpYmxlX2Nvb3Jkc1tjb29yZHMua2V5XSA9IGNvb3JkcztcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENoZWNrIGlmIHZpc2libGUgY29vcmRzIGNoYW5nZWRcbiAgICAgICAgLy8gVE9ETzogbW92ZSB0byBhIG5ldyB2aWV3IG1hbmFnZXIgb2JqZWN0XG4gICAgICAgIGxldCBuZXdfY29vcmRzID0gT2JqZWN0LmtleXModGhpcy52aXNpYmxlX2Nvb3Jkcyk7XG4gICAgICAgIGxldCBjb29yZHNfY2hhbmdlZCA9IGZhbHNlO1xuICAgICAgICBpZiAocHJldl9jb29yZHMubGVuZ3RoICE9PSBuZXdfY29vcmRzLmxlbmd0aCkge1xuICAgICAgICAgICAgY29vcmRzX2NoYW5nZWQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcHJldl9jb29yZHMuc29ydCgpO1xuICAgICAgICAgICAgbmV3X2Nvb3Jkcy5zb3J0KCk7XG4gICAgICAgICAgICBpZiAoIXByZXZfY29vcmRzLmV2ZXJ5KChjLCBpKSA9PiBuZXdfY29vcmRzW2ldID09PSBjKSkge1xuICAgICAgICAgICAgICAgIGNvb3Jkc19jaGFuZ2VkID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHRoaXMudXBkYXRlVGlsZVN0YXRlcygpO1xuICAgIH1cblxuICAgIHVwZGF0ZVRpbGVTdGF0ZXMgKCkge1xuICAgICAgICB0aGlzLmZvckVhY2hUaWxlKHRpbGUgPT4ge1xuICAgICAgICAgICAgdGhpcy51cGRhdGVWaXNpYmlsaXR5KHRpbGUpO1xuICAgICAgICAgICAgdGlsZS51cGRhdGUoKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgdGhpcy5sb2FkUXVldWVkQ29vcmRpbmF0ZXMoKTtcbiAgICAgICAgdGhpcy51cGRhdGVQcm94eVRpbGVzKCk7XG4gICAgICAgIHRoaXMudmlldy5wcnVuZVRpbGVzRm9yVmlldygpO1xuICAgICAgICB0aGlzLnVwZGF0ZVJlbmRlcmFibGVUaWxlcygpO1xuICAgICAgICB0aGlzLnVwZGF0ZUFjdGl2ZVN0eWxlcygpO1xuICAgIH1cblxuICAgIHVwZGF0ZVByb3h5VGlsZXMgKCkge1xuICAgICAgICBpZiAodGhpcy52aWV3Lnpvb21fZGlyZWN0aW9uID09PSAwKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDbGVhciBwcmV2aW91cyBwcm94aWVzXG4gICAgICAgIHRoaXMuZm9yRWFjaFRpbGUodGlsZSA9PiB0aWxlLnNldFByb3h5Rm9yKG51bGwpKTtcblxuICAgICAgICBsZXQgcHJveHkgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5mb3JFYWNoVGlsZSh0aWxlID0+IHtcbiAgICAgICAgICAgIGlmICh0aGlzLnZpZXcuem9vbV9kaXJlY3Rpb24gPT09IDEpIHtcbiAgICAgICAgICAgICAgICBpZiAodGlsZS52aXNpYmxlICYmICF0aWxlLmJ1aWx0ICYmIHRpbGUuY29vcmRzLnogPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGNvbnN0IHBhcmVudCA9IHRoaXMucHlyYW1pZC5nZXRBbmNlc3Rvcih0aWxlKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHBhcmVudCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50LnNldFByb3h5Rm9yKHRpbGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgcHJveHkgPSB0cnVlO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgZWxzZSBpZiAodGhpcy52aWV3Lnpvb21fZGlyZWN0aW9uID09PSAtMSkge1xuICAgICAgICAgICAgICAgIGlmICh0aWxlLnZpc2libGUgJiYgIXRpbGUuYnVpbHQpIHtcbiAgICAgICAgICAgICAgICAgICAgY29uc3QgZGVzY2VuZGFudHMgPSB0aGlzLnB5cmFtaWQuZ2V0RGVzY2VuZGFudHModGlsZSk7XG4gICAgICAgICAgICAgICAgICAgIGZvciAobGV0IGk9MDsgaSA8IGRlc2NlbmRhbnRzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBkZXNjZW5kYW50c1tpXS5zZXRQcm94eUZvcih0aWxlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHByb3h5ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfSk7XG5cbiAgICAgICAgaWYgKCFwcm94eSkge1xuICAgICAgICAgICAgdGhpcy52aWV3Lnpvb21fZGlyZWN0aW9uID0gMDtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHVwZGF0ZVZpc2liaWxpdHkodGlsZSkge1xuICAgICAgICB0aWxlLnZpc2libGUgPSBmYWxzZTtcbiAgICAgICAgaWYgKHRpbGUuc3R5bGVfem9vbSA9PT0gdGhpcy52aWV3LnRpbGVfem9vbSkge1xuICAgICAgICAgICAgaWYgKHRoaXMudmlzaWJsZV9jb29yZHNbdGlsZS5jb29yZHMua2V5XSkge1xuICAgICAgICAgICAgICAgIHRpbGUudmlzaWJsZSA9IHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAvLyBicnV0ZSBmb3JjZVxuICAgICAgICAgICAgICAgIGZvciAobGV0IGtleSBpbiB0aGlzLnZpc2libGVfY29vcmRzKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChUaWxlLmlzRGVzY2VuZGFudCh0aWxlLmNvb3JkcywgdGhpcy52aXNpYmxlX2Nvb3Jkc1trZXldKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGlsZS52aXNpYmxlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gUmVtb3ZlIHRpbGVzIHRoYXQgYXJlbid0IHZpc2libGUsIGFuZCBmbGFnIHJlbWFpbmluZyB2aXNpYmxlIG9uZXMgdG8gYmUgdXBkYXRlZCAoZm9yIGxvYWRpbmcsIHByb3h5LCBldGMuKVxuICAgIHBydW5lVG9WaXNpYmxlVGlsZXMgKCkge1xuICAgICAgICB0aGlzLnJlbW92ZVRpbGVzKHRpbGUgPT4gIXRpbGUudmlzaWJsZSk7XG4gICAgfVxuXG4gICAgZ2V0UmVuZGVyYWJsZVRpbGVzICgpIHtcbiAgICAgICAgcmV0dXJuIHRoaXMucmVuZGVyYWJsZV90aWxlcztcbiAgICB9XG5cbiAgICB1cGRhdGVSZW5kZXJhYmxlVGlsZXMoKSB7XG4gICAgICAgIHRoaXMucmVuZGVyYWJsZV90aWxlcyA9IFtdO1xuICAgICAgICBmb3IgKGxldCB0IGluIHRoaXMudGlsZXMpIHtcbiAgICAgICAgICAgIGxldCB0aWxlID0gdGhpcy50aWxlc1t0XTtcbiAgICAgICAgICAgIGlmICh0aWxlLnZpc2libGUgJiYgdGlsZS5sb2FkZWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnJlbmRlcmFibGVfdGlsZXMucHVzaCh0aWxlKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdGhpcy5yZW5kZXJhYmxlX3RpbGVzO1xuICAgIH1cblxuICAgIGdldEFjdGl2ZVN0eWxlcyAoKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmFjdGl2ZV9zdHlsZXM7XG4gICAgfVxuXG4gICAgdXBkYXRlQWN0aXZlU3R5bGVzICgpIHtcbiAgICAgICAgbGV0IHRpbGVzID0gdGhpcy5yZW5kZXJhYmxlX3RpbGVzO1xuICAgICAgICBsZXQgYWN0aXZlID0ge307XG4gICAgICAgIGZvciAobGV0IHQ9MDsgdCA8IHRpbGVzLmxlbmd0aDsgdCsrKSB7XG4gICAgICAgICAgICBsZXQgdGlsZSA9IHRpbGVzW3RdO1xuICAgICAgICAgICAgT2JqZWN0LmtleXModGlsZS5tZXNoZXMpLmZvckVhY2gocyA9PiBhY3RpdmVbc10gPSB0cnVlKTtcbiAgICAgICAgfVxuICAgICAgICB0aGlzLmFjdGl2ZV9zdHlsZXMgPSBPYmplY3Qua2V5cyhhY3RpdmUpO1xuICAgICAgICByZXR1cm4gdGhpcy5hY3RpdmVfc3R5bGVzO1xuICAgIH1cblxuICAgIGlzTG9hZGluZ1Zpc2libGVUaWxlcygpIHtcbiAgICAgICAgcmV0dXJuIE9iamVjdC5rZXlzKHRoaXMudGlsZXMpLnNvbWUoayA9PiB0aGlzLnRpbGVzW2tdLnZpc2libGUgJiYgIXRoaXMudGlsZXNba10uYnVpbHQpO1xuICAgIH1cblxuICAgIC8vIFF1ZXVlIGEgdGlsZSBmb3IgbG9hZFxuICAgIHF1ZXVlQ29vcmRpbmF0ZShjb29yZHMpIHtcbiAgICAgICAgdGhpcy5xdWV1ZWRfY29vcmRzW3RoaXMucXVldWVkX2Nvb3Jkcy5sZW5ndGhdID0gY29vcmRzO1xuICAgIH1cblxuICAgIC8vIExvYWQgYWxsIHF1ZXVlZCB0aWxlc1xuICAgIGxvYWRRdWV1ZWRDb29yZGluYXRlcygpIHtcbiAgICAgICAgaWYgKHRoaXMucXVldWVkX2Nvb3Jkcy5sZW5ndGggPT09IDApIHtcbiAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFNvcnQgcXVldWVkIHRpbGVzIGZyb20gY2VudGVyIHRpbGVcbiAgICAgICAgdGhpcy5xdWV1ZWRfY29vcmRzLnNvcnQoKGEsIGIpID0+IHtcbiAgICAgICAgICAgIGxldCBhZCA9IE1hdGguYWJzKHRoaXMudmlldy5jZW50ZXIudGlsZS54IC0gYS54KSArIE1hdGguYWJzKHRoaXMudmlldy5jZW50ZXIudGlsZS55IC0gYS55KTtcbiAgICAgICAgICAgIGxldCBiZCA9IE1hdGguYWJzKHRoaXMudmlldy5jZW50ZXIudGlsZS54IC0gYi54KSArIE1hdGguYWJzKHRoaXMudmlldy5jZW50ZXIudGlsZS55IC0gYi55KTtcbiAgICAgICAgICAgIHJldHVybiAoYmQgPiBhZCA/IC0xIDogKGJkID09PSBhZCA/IDAgOiAxKSk7XG4gICAgICAgIH0pO1xuICAgICAgICB0aGlzLnF1ZXVlZF9jb29yZHMuZm9yRWFjaChjb29yZHMgPT4gdGhpcy5sb2FkQ29vcmRpbmF0ZShjb29yZHMpKTtcbiAgICAgICAgdGhpcy5xdWV1ZWRfY29vcmRzID0gW107XG4gICAgfVxuXG4gICAgLy8gTG9hZCBhbGwgdGlsZXMgdG8gY292ZXIgYSBnaXZlbiBsb2dpY2FsIHRpbGUgY29vcmRpbmF0ZVxuICAgIGxvYWRDb29yZGluYXRlKGNvb3Jkcykge1xuICAgICAgICAvLyBTa2lwIGlmIG5vdCBhdCBjdXJyZW50IHNjZW5lIHpvb21cbiAgICAgICAgaWYgKGNvb3Jkcy56ICE9PSB0aGlzLnZpZXcuY2VudGVyLnRpbGUueikge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gRGV0ZXJtaW5lIG5lY2Vzc2FyeSB0aWxlcyBmb3IgZWFjaCBzb3VyY2VcbiAgICAgICAgZm9yIChsZXQgcyBpbiB0aGlzLnNjZW5lLnNvdXJjZXMpIHtcbiAgICAgICAgICAgIGxldCBzb3VyY2UgPSB0aGlzLnNjZW5lLnNvdXJjZXNbc107XG4gICAgICAgICAgICAvLyBDaGVjayBpZiBkYXRhIHNvdXJjZSBzaG91bGQgYnVpbGQgdGhpcyB0aWxlXG4gICAgICAgICAgICBpZiAoIXNvdXJjZS5idWlsZHNfZ2VvbWV0cnlfdGlsZXMgfHwgIXNvdXJjZS5pbmNsdWRlc1RpbGUoY29vcmRzLCB0aGlzLnZpZXcudGlsZV96b29tKSkge1xuICAgICAgICAgICAgICAgIGNvbnRpbnVlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBsZXQga2V5ID0gVGlsZS5rZXkoY29vcmRzLCBzb3VyY2UsIHRoaXMudmlldy50aWxlX3pvb20pO1xuICAgICAgICAgICAgaWYgKGtleSAmJiAhdGhpcy5oYXNUaWxlKGtleSkpIHtcbiAgICAgICAgICAgICAgICBsZXQgdGlsZSA9IFRpbGUuY3JlYXRlKHtcbiAgICAgICAgICAgICAgICAgICAgc291cmNlLFxuICAgICAgICAgICAgICAgICAgICBjb29yZHMsXG4gICAgICAgICAgICAgICAgICAgIHdvcmtlcjogdGhpcy5zY2VuZS5nZXRXb3JrZXJGb3JEYXRhU291cmNlKHNvdXJjZSksXG4gICAgICAgICAgICAgICAgICAgIHN0eWxlX3pvb206IHRoaXMudmlldy5zdHlsZVpvb20oY29vcmRzLnopLFxuICAgICAgICAgICAgICAgICAgICB2aWV3OiB0aGlzLnZpZXdcbiAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgIHRoaXMua2VlcFRpbGUodGlsZSk7XG4gICAgICAgICAgICAgICAgdGhpcy5idWlsZFRpbGUodGlsZSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBTb3J0IGFuZCBidWlsZCBhIGxpc3Qgb2YgdGlsZXNcbiAgICBidWlsZFRpbGVzKHRpbGVzKSB7XG4gICAgICAgIFRpbGUuc29ydCh0aWxlcykuZm9yRWFjaCh0aWxlID0+IHRoaXMuYnVpbGRUaWxlKHRpbGUpKTtcbiAgICAgICAgdGhpcy5jaGVja0J1aWxkUXVldWUoKTtcbiAgICB9XG5cbiAgICBidWlsZFRpbGUodGlsZSwgb3B0aW9ucykge1xuICAgICAgICB0aGlzLnRpbGVCdWlsZFN0YXJ0KHRpbGUua2V5KTtcbiAgICAgICAgdGhpcy51cGRhdGVWaXNpYmlsaXR5KHRpbGUpO1xuICAgICAgICB0aWxlLnVwZGF0ZSgpO1xuICAgICAgICB0aWxlLmJ1aWxkKHRoaXMuc2NlbmUuZ2VuZXJhdGlvbiwgb3B0aW9ucyk7XG4gICAgfVxuXG4gICAgLy8gQ2FsbGVkIG9uIG1haW4gdGhyZWFkIHdoZW4gYSB3ZWIgd29ya2VyIGNvbXBsZXRlcyBwcm9jZXNzaW5nIGZvciBhIHNpbmdsZSB0aWxlIChpbml0aWFsIGxvYWQsIG9yIHJlYnVpbGQpXG4gICAgYnVpbGRUaWxlU3R5bGVzQ29tcGxldGVkKHsgdGlsZSwgcHJvZ3Jlc3MgfSkge1xuICAgICAgICAvLyBSZW1vdmVkIHRoaXMgdGlsZSBkdXJpbmcgbG9hZD9cbiAgICAgICAgaWYgKHRoaXMudGlsZXNbdGlsZS5rZXldID09IG51bGwpIHtcbiAgICAgICAgICAgIGxvZygndHJhY2UnLCBgZGlzY2FyZGVkIHRpbGUgJHt0aWxlLmtleX0gaW4gVGlsZU1hbmFnZXIuYnVpbGRUaWxlU3R5bGVzQ29tcGxldGVkIGJlY2F1c2UgcHJldmlvdXNseSByZW1vdmVkYCk7XG4gICAgICAgICAgICBUaWxlLmFib3J0QnVpbGQodGlsZSk7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZVRpbGVTdGF0ZXMoKTtcbiAgICAgICAgfVxuICAgICAgICAvLyBCdWlsdCB3aXRoIGFuIG91dGRhdGVkIHNjZW5lIGNvbmZpZ3VyYXRpb24/XG4gICAgICAgIGVsc2UgaWYgKHRpbGUuZ2VuZXJhdGlvbiAhPT0gdGhpcy5zY2VuZS5nZW5lcmF0aW9uKSB7XG4gICAgICAgICAgICBsb2coJ2RlYnVnJywgYGRpc2NhcmRlZCB0aWxlICR7dGlsZS5rZXl9IGluIFRpbGVNYW5hZ2VyLmJ1aWxkVGlsZVN0eWxlc0NvbXBsZXRlZCBiZWNhdXNlIGJ1aWx0IHdpdGggYCArXG4gICAgICAgICAgICAgICAgYHNjZW5lIGNvbmZpZyBnZW4gJHt0aWxlLmdlbmVyYXRpb259LCBjdXJyZW50ICR7dGhpcy5zY2VuZS5nZW5lcmF0aW9ufWApO1xuICAgICAgICAgICAgVGlsZS5hYm9ydEJ1aWxkKHRpbGUpO1xuICAgICAgICAgICAgdGhpcy51cGRhdGVUaWxlU3RhdGVzKCk7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAvLyBVcGRhdGUgdGlsZSB3aXRoIHByb3BlcnRpZXMgZnJvbSB3b3JrZXJcbiAgICAgICAgICAgIGlmICh0aGlzLnRpbGVzW3RpbGUua2V5XSkge1xuICAgICAgICAgICAgICAgIHRpbGUgPSB0aGlzLnRpbGVzW3RpbGUua2V5XS5tZXJnZSh0aWxlKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKHByb2dyZXNzLmRvbmUpIHtcbiAgICAgICAgICAgICAgICB0aWxlLmJ1aWx0ID0gdHJ1ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGlsZS5idWlsZE1lc2hlcyh0aGlzLnNjZW5lLnN0eWxlcywgcHJvZ3Jlc3MpO1xuICAgICAgICAgICAgdGhpcy51cGRhdGVUaWxlU3RhdGVzKCk7XG4gICAgICAgICAgICB0aGlzLnNjZW5lLnJlcXVlc3RSZWRyYXcoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChwcm9ncmVzcy5kb25lKSB7XG4gICAgICAgICAgICB0aGlzLnRpbGVCdWlsZFN0b3AodGlsZS5rZXkpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gQ2FsbGVkIG9uIG1haW4gdGhyZWFkIHdoZW4gd2ViIHdvcmtlciBlbmNvdW50ZXJzIGFuIGVycm9yIGJ1aWxkaW5nIGEgdGlsZVxuICAgIGJ1aWxkVGlsZUVycm9yKHRpbGUpIHtcbiAgICAgICAgbG9nKCdlcnJvcicsIGBFcnJvciBidWlsZGluZyB0aWxlICR7dGlsZS5rZXl9OmAsIHRpbGUuZXJyb3IpO1xuICAgICAgICB0aGlzLmZvcmdldFRpbGUodGlsZS5rZXkpO1xuICAgICAgICBUaWxlLmFib3J0QnVpbGQodGlsZSk7XG4gICAgfVxuXG4gICAgLy8gVHJhY2sgdGlsZSBidWlsZCBzdGF0ZVxuICAgIHRpbGVCdWlsZFN0YXJ0KGtleSkge1xuICAgICAgICB0aGlzLmJ1aWxkaW5nX3RpbGVzID0gdGhpcy5idWlsZGluZ190aWxlcyB8fCB7fTtcbiAgICAgICAgdGhpcy5idWlsZGluZ190aWxlc1trZXldID0gdHJ1ZTtcbiAgICAgICAgbG9nKCd0cmFjZScsIGB0aWxlQnVpbGRTdGFydCBmb3IgJHtrZXl9OiAke09iamVjdC5rZXlzKHRoaXMuYnVpbGRpbmdfdGlsZXMpLmxlbmd0aH1gKTtcbiAgICB9XG5cbiAgICB0aWxlQnVpbGRTdG9wKGtleSkge1xuICAgICAgICAvLyBEb25lIGJ1aWxkaW5nP1xuICAgICAgICBpZiAodGhpcy5idWlsZGluZ190aWxlcykge1xuICAgICAgICAgICAgbG9nKCd0cmFjZScsIGB0aWxlQnVpbGRTdG9wIGZvciAke2tleX06ICR7T2JqZWN0LmtleXModGhpcy5idWlsZGluZ190aWxlcykubGVuZ3RofWApO1xuICAgICAgICAgICAgZGVsZXRlIHRoaXMuYnVpbGRpbmdfdGlsZXNba2V5XTtcbiAgICAgICAgICAgIHRoaXMuY2hlY2tCdWlsZFF1ZXVlKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBDaGVjayBzdGF0dXMgb2YgdGlsZSBidWlsZGluZyBxdWV1ZSBhbmQgbm90aWZ5IHNjZW5lIHdoZW4gd2UncmUgZG9uZVxuICAgIGNoZWNrQnVpbGRRdWV1ZSgpIHtcbiAgICAgICAgaWYgKCF0aGlzLmJ1aWxkaW5nX3RpbGVzIHx8IE9iamVjdC5rZXlzKHRoaXMuYnVpbGRpbmdfdGlsZXMpLmxlbmd0aCA9PT0gMCkge1xuICAgICAgICAgICAgdGhpcy5idWlsZGluZ190aWxlcyA9IG51bGw7XG4gICAgICAgICAgICB0aGlzLnNjZW5lLnRpbGVNYW5hZ2VyQnVpbGREb25lKCk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAvLyBTdW0gb2YgYSBkZWJ1ZyBwcm9wZXJ0eSBhY3Jvc3MgdGlsZXNcbiAgICBnZXREZWJ1Z1N1bShwcm9wLCBmaWx0ZXIpIHtcbiAgICAgICAgdmFyIHN1bSA9IDA7XG4gICAgICAgIGZvciAodmFyIHQgaW4gdGhpcy50aWxlcykge1xuICAgICAgICAgICAgaWYgKHRoaXMudGlsZXNbdF0uZGVidWdbcHJvcF0gIT0gbnVsbCAmJiAodHlwZW9mIGZpbHRlciAhPT0gJ2Z1bmN0aW9uJyB8fCBmaWx0ZXIodGhpcy50aWxlc1t0XSkgPT09IHRydWUpKSB7XG4gICAgICAgICAgICAgICAgc3VtICs9IHRoaXMudGlsZXNbdF0uZGVidWdbcHJvcF07XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIHN1bTtcbiAgICB9XG5cbiAgICAvLyBBdmVyYWdlIG9mIGEgZGVidWcgcHJvcGVydHkgYWNyb3NzIHRpbGVzXG4gICAgZ2V0RGVidWdBdmVyYWdlKHByb3AsIGZpbHRlcikge1xuICAgICAgICByZXR1cm4gdGhpcy5nZXREZWJ1Z1N1bShwcm9wLCBmaWx0ZXIpIC8gT2JqZWN0LmtleXModGhpcy50aWxlcykubGVuZ3RoO1xuICAgIH1cblxufVxuIiwiaW1wb3J0IEdlbyBmcm9tICcuL2dlbyc7XG5pbXBvcnQgVGlsZSBmcm9tICcuL3RpbGUnO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBUaWxlUHlyYW1pZCB7XG5cbiAgICBjb25zdHJ1Y3RvcigpIHtcbiAgICAgICAgdGhpcy5jb29yZHMgPSB7fTtcbiAgICAgICAgdGhpcy5tYXhfcHJveHlfZGVzY2VuZGFudF9kZXB0aCA9IDM7IC8vICMgb2YgbGV2ZWxzIGRlZXAgdG8gc2VhcmNoIGZvciBkZXNjZW5kYW50IHByb3h5IHRpbGVzXG4gICAgfVxuXG4gICAgc291cmNlVGlsZXMoY29vcmQsIHNvdXJjZSkge1xuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgdGhpcy5jb29yZHNbY29vcmQua2V5XSAmJlxuICAgICAgICAgICAgdGhpcy5jb29yZHNbY29vcmQua2V5XS5zb3VyY2VzICYmXG4gICAgICAgICAgICB0aGlzLmNvb3Jkc1tjb29yZC5rZXldLnNvdXJjZXNbc291cmNlLm5hbWVdKTtcbiAgICB9XG5cbiAgICBhZGRUaWxlKHRpbGUpIHtcbiAgICAgICAgLy8gQWRkIHRhcmdldCB0aWxlXG4gICAgICAgIGxldCBrZXkgPSB0aWxlLmNvb3Jkcy5rZXk7XG4gICAgICAgIGxldCBjb29yZCA9IHRoaXMuY29vcmRzW2tleV07XG4gICAgICAgIGlmICghY29vcmQpIHtcbiAgICAgICAgICAgIGNvb3JkID0gdGhpcy5jb29yZHNba2V5XSA9IHsgZGVzY2VuZGFudHM6IDAgfTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghY29vcmQuc291cmNlcykge1xuICAgICAgICAgICAgY29vcmQuc291cmNlcyA9IHt9O1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKCFjb29yZC5zb3VyY2VzW3RpbGUuc291cmNlLm5hbWVdKSB7XG4gICAgICAgICAgICBjb29yZC5zb3VyY2VzW3RpbGUuc291cmNlLm5hbWVdID0ge307XG4gICAgICAgIH1cbiAgICAgICAgY29vcmQuc291cmNlc1t0aWxlLnNvdXJjZS5uYW1lXVt0aWxlLnN0eWxlX3pvb21dID0gdGlsZTtcblxuICAgICAgICAvLyBJbmNyZW1lbnQgcmVmZXJlbmNlIGNvdW50IHVwIHRoZSB0aWxlIHB5cmFtaWRcbiAgICAgICAgZm9yIChsZXQgeiA9IHRpbGUuY29vcmRzLnogLSAxOyB6ID49IDA7IHotLSkge1xuICAgICAgICAgICAgbGV0IHVwID0gVGlsZS5jb29yZGluYXRlQXRab29tKHRpbGUuY29vcmRzLCB6KTtcbiAgICAgICAgICAgIGlmICghdGhpcy5jb29yZHNbdXAua2V5XSkge1xuICAgICAgICAgICAgICAgIHRoaXMuY29vcmRzW3VwLmtleV0gPSB7IGRlc2NlbmRhbnRzOiAwIH07XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0aGlzLmNvb3Jkc1t1cC5rZXldLmRlc2NlbmRhbnRzKys7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZW1vdmVUaWxlKHRpbGUpIHtcbiAgICAgICAgLy8gUmVtb3ZlIHRhcmdldCB0aWxlXG4gICAgICAgIGxldCBzb3VyY2VfdGlsZXMgPSB0aGlzLnNvdXJjZVRpbGVzKHRpbGUuY29vcmRzLCB0aWxlLnNvdXJjZSk7XG4gICAgICAgIGxldCBrZXkgPSB0aWxlLmNvb3Jkcy5rZXk7XG5cbiAgICAgICAgaWYgKHNvdXJjZV90aWxlcykge1xuICAgICAgICAgICAgZGVsZXRlIHNvdXJjZV90aWxlc1t0aWxlLnN0eWxlX3pvb21dO1xuICAgICAgICAgICAgaWYgKE9iamVjdC5rZXlzKHNvdXJjZV90aWxlcykubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgLy8gcmVtb3ZlIHNvdXJjZVxuICAgICAgICAgICAgICAgIGRlbGV0ZSB0aGlzLmNvb3Jkc1trZXldLnNvdXJjZXNbdGlsZS5zb3VyY2UubmFtZV07XG4gICAgICAgICAgICAgICAgaWYgKE9iamVjdC5rZXlzKHRoaXMuY29vcmRzW2tleV0uc291cmNlcykubGVuZ3RoID09PSAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGRlbGV0ZSB0aGlzLmNvb3Jkc1trZXldLnNvdXJjZXM7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuY29vcmRzW2tleV0uZGVzY2VuZGFudHMgPT09IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlbW92ZSB3aG9sZSBjb29yZFxuICAgICAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHRoaXMuY29vcmRzW2tleV07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICAvLyBEZWNyZW1lbnQgcmVmZXJlbmNlIGNvdW50IHVwIHRoZSB0aWxlIHB5cmFtaWRcbiAgICAgICAgZm9yIChsZXQgeiA9IHRpbGUuY29vcmRzLnogLSAxOyB6ID49IDA7IHotLSkge1xuICAgICAgICAgICAgbGV0IGRvd24gPSBUaWxlLmNvb3JkaW5hdGVBdFpvb20odGlsZS5jb29yZHMsIHopO1xuICAgICAgICAgICAgaWYgKHRoaXMuY29vcmRzW2Rvd24ua2V5XSAmJiB0aGlzLmNvb3Jkc1tkb3duLmtleV0uZGVzY2VuZGFudHMgPiAwKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jb29yZHNbZG93bi5rZXldLmRlc2NlbmRhbnRzLS07XG4gICAgICAgICAgICAgICAgaWYgKHRoaXMuY29vcmRzW2Rvd24ua2V5XS5kZXNjZW5kYW50cyA9PT0gMCAmJiAhdGhpcy5jb29yZHNbZG93bi5rZXldLnNvdXJjZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgZGVsZXRlIHRoaXMuY29vcmRzW2Rvd24ua2V5XTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBnZXRBbmNlc3RvciAoeyBjb29yZHMsIHN0eWxlX3pvb20sIHNvdXJjZSB9KSB7XG4gICAgICAgIC8vIEZpcnN0IGNoZWNrIG92ZXJ6b29tZWQgdGlsZXMgYXQgc2FtZSBjb29yZGluYXRlIHpvb21cbiAgICAgICAgaWYgKHN0eWxlX3pvb20gPiBzb3VyY2UubWF4X3pvb20pIHtcbiAgICAgICAgICAgIGxldCBzb3VyY2VfdGlsZXMgPSB0aGlzLnNvdXJjZVRpbGVzKGNvb3Jkcywgc291cmNlKTtcbiAgICAgICAgICAgIGlmIChzb3VyY2VfdGlsZXMpIHtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCB6ID0gc3R5bGVfem9vbSAtIDE7IHogPj0gc291cmNlLm1heF96b29tOyB6LS0pIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHNvdXJjZV90aWxlc1t6XSAmJiBzb3VyY2VfdGlsZXNbel0ubG9hZGVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gc291cmNlX3RpbGVzW3pdO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgc3R5bGVfem9vbSA9IHNvdXJjZS5tYXhfem9vbTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIENoZWNrIHRpbGVzIGF0IG5leHQgem9vbSB1cFxuICAgICAgICBzdHlsZV96b29tLS07XG4gICAgICAgIGxldCBwYXJlbnQgPSBUaWxlLmNvb3JkaW5hdGVBdFpvb20oY29vcmRzLCBjb29yZHMueiAtIDEpO1xuICAgICAgICBsZXQgcGFyZW50X3RpbGVzID0gdGhpcy5zb3VyY2VUaWxlcyhwYXJlbnQsIHNvdXJjZSk7XG4gICAgICAgIGlmIChwYXJlbnRfdGlsZXMgJiYgcGFyZW50X3RpbGVzW3N0eWxlX3pvb21dICYmIHBhcmVudF90aWxlc1tzdHlsZV96b29tXS5sb2FkZWQpIHtcbiAgICAgICAgICAgIHJldHVybiBwYXJlbnRfdGlsZXNbc3R5bGVfem9vbV07XG4gICAgICAgIH1cbiAgICAgICAgLy8gZGlkbid0IGZpbmQgYW5jZXN0b3IsIHRyeSBuZXh0IGxldmVsXG4gICAgICAgIC8vIFRPRE86IG1heCBkZXB0aCBsZXZlbHMgdG8gY2hlY2tcbiAgICAgICAgaWYgKHBhcmVudC56ID4gMCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMuZ2V0QW5jZXN0b3IoeyBjb29yZHM6IHBhcmVudCwgc3R5bGVfem9vbSwgc291cmNlIH0pO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgZ2V0RGVzY2VuZGFudHMgKHsgY29vcmRzLCBzdHlsZV96b29tLCBzb3VyY2UgfSwgbGV2ZWwgPSAxKSB7XG4gICAgICAgIGxldCBkZXNjZW5kYW50cyA9IFtdO1xuXG4gICAgICAgIC8vIEZpcnN0IGNoZWNrIG92ZXJ6b29tZWQgdGlsZXMgYXQgc2FtZSBjb29yZGluYXRlIHpvb21cbiAgICAgICAgaWYgKHN0eWxlX3pvb20gPj0gc291cmNlLm1heF96b29tKSB7XG4gICAgICAgICAgICBsZXQgc291cmNlX3RpbGVzID0gdGhpcy5zb3VyY2VUaWxlcyhjb29yZHMsIHNvdXJjZSk7XG4gICAgICAgICAgICBpZiAoc291cmNlX3RpbGVzKSB7XG4gICAgICAgICAgICAgICAgbGV0IHNlYXJjaF9tYXhfem9vbSA9IE1hdGgubWF4KEdlby5kZWZhdWx0X3ZpZXdfbWF4X3pvb20sIHN0eWxlX3pvb20gKyB0aGlzLm1heF9wcm94eV9kZXNjZW5kYW50X2RlcHRoKTtcbiAgICAgICAgICAgICAgICBmb3IgKGxldCB6ID0gc3R5bGVfem9vbSArIDE7IHogPD0gc2VhcmNoX21heF96b29tOyB6KyspIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHNvdXJjZV90aWxlc1t6XSAmJiBzb3VyY2VfdGlsZXNbel0ubG9hZGVkKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBkZXNjZW5kYW50cy5wdXNoKHNvdXJjZV90aWxlc1t6XSk7XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZGVzY2VuZGFudHM7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gZGVzY2VuZGFudHM7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBDaGVjayB0aWxlcyBhdCBuZXh0IHpvb20gZG93blxuICAgICAgICBpZiAodGhpcy5jb29yZHNbY29vcmRzLmtleV0gJiYgdGhpcy5jb29yZHNbY29vcmRzLmtleV0uZGVzY2VuZGFudHMgPiAwKSB7XG4gICAgICAgICAgICBzdHlsZV96b29tKys7XG4gICAgICAgICAgICBjb25zdCBjaGlsZHJlbiA9IFRpbGUuY2hpbGRyZW5Gb3JDb29yZGluYXRlKGNvb3Jkcyk7XG4gICAgICAgICAgICBmb3IgKGxldCBjPTA7IGMgPCBjaGlsZHJlbi5sZW5ndGg7IGMrKykge1xuICAgICAgICAgICAgICAgIGNvbnN0IGNoaWxkID0gY2hpbGRyZW5bY107XG4gICAgICAgICAgICAgICAgbGV0IGNoaWxkX3RpbGVzID0gdGhpcy5zb3VyY2VUaWxlcyhjaGlsZCwgc291cmNlKTtcbiAgICAgICAgICAgICAgICBpZiAoY2hpbGRfdGlsZXMgJiYgY2hpbGRfdGlsZXNbc3R5bGVfem9vbV0gJiYgY2hpbGRfdGlsZXNbc3R5bGVfem9vbV0ubG9hZGVkKSB7XG4gICAgICAgICAgICAgICAgICAgIGRlc2NlbmRhbnRzLnB1c2goY2hpbGRfdGlsZXNbc3R5bGVfem9vbV0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBkaWRuJ3QgZmluZCBjaGlsZCwgdHJ5IG5leHQgbGV2ZWxcbiAgICAgICAgICAgICAgICBlbHNlIGlmIChsZXZlbCA8PSB0aGlzLm1heF9wcm94eV9kZXNjZW5kYW50X2RlcHRoICYmIGNoaWxkLnogPD0gc291cmNlLm1heF96b29tKSB7XG4gICAgICAgICAgICAgICAgICAgIGRlc2NlbmRhbnRzLnB1c2goLi4udGhpcy5nZXREZXNjZW5kYW50cyh7IGNvb3JkczogY2hpbGQsIHNvdXJjZSwgc3R5bGVfem9vbSB9LCBsZXZlbCArIDEpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZGVzY2VuZGFudHM7XG4gICAgfVxuXG59XG4iLCJleHBvcnQgZGVmYXVsdCB7XG4gICAgLy8gZHJhd3MgYSBibHVlIHJlY3RhbmdsZSBib3JkZXIgYXJvdW5kIHRoZSBjb2xsaXNpb24gYm94IG9mIGEgbGFiZWxcbiAgICBkcmF3X2xhYmVsX2NvbGxpc2lvbl9ib3hlczogZmFsc2UsXG4gICAgLy8gZHJhd3MgYSBncmVlbiByZWN0YW5nbGUgYm9yZGVyIHdpdGhpbiB0aGUgdGV4dHVyZSBib3ggb2YgYSBsYWJlbFxuICAgIGRyYXdfbGFiZWxfdGV4dHVyZV9ib3hlczogZmFsc2UsXG4gICAgLy8gc3VwcHJlc2VzIGZhZGUtaW4gb2YgbGFiZWxzXG4gICAgc3VwcHJlc3NfbGFiZWxfZmFkZV9pbjogZmFsc2UsXG4gICAgLy8gc3VwcHJlc3MgYW5pbWF0b24gb2YgbGFiZWwgc25hcCB0byBwaXhlbCBncmlkXG4gICAgc3VwcHJlc3NfbGFiZWxfc25hcF9hbmltYXRpb246IGZhbHNlXG59O1xuIiwiXG5cbmV4cG9ydCBjbGFzcyBNZXRob2ROb3RJbXBsZW1lbnRlZCBleHRlbmRzIEVycm9yIHtcbiAgICBjb25zdHJ1Y3RvcihtZXRob2ROYW1lKSB7XG4gICAgICAgIHN1cGVyKCk7XG4gICAgICAgIHRoaXMubmFtZSAgICA9ICdNZXRob2ROb3RJbXBsZW1lbnRlZCc7XG4gICAgICAgIHRoaXMubWVzc2FnZSA9ICdNZXRob2QgJyArIG1ldGhvZE5hbWUgKyAnIG11c3QgYmUgaW1wbGVtZW50ZWQgaW4gc3ViY2xhc3MnO1xuICAgIH1cbn1cbiIsIi8vIFBhcnRpYWwgaW1wb3J0IG9mIGdsLW1hdHJpeCB2aWEgbW9kdWxhcml6ZWQgc3RhY2stZ2wgZm9ya3Ncbi8vIGh0dHBzOi8vZ2l0aHViLmNvbS90b2ppL2dsLW1hdHJpeFxuLy8gaHR0cHM6Ly9naXRodWIuY29tL3N0YWNrZ2xcblxuLy8gdmVjM1xuXG4vLyBTdWJzdGl0dXRlIDY0LWJpdCB2ZXJzaW9uXG4vLyBXZSBuZWVkIHRoZSBleHRyYSBwcmVjaXNpb24gd2hlbiBtdWx0aXBseWluZyBtYXRyaWNlcyB3L21lcmNhdG9yIHByb2plY3RlZCB2YWx1ZXNcbmNvbnN0IHZlYzMgPSB7XG4gICAgZnJvbVZhbHVlcyAoeCwgeSwgeikge1xuICAgICAgICB2YXIgb3V0ID0gbmV3IEZsb2F0NjRBcnJheSgzKTtcbiAgICAgICAgb3V0WzBdID0geDtcbiAgICAgICAgb3V0WzFdID0geTtcbiAgICAgICAgb3V0WzJdID0gejtcbiAgICAgICAgcmV0dXJuIG91dDtcbiAgICB9XG59O1xuXG5cbi8vIG1hdDNcblxuaW1wb3J0IHtkZWZhdWx0IGFzIG1hdDNfbm9ybWFsRnJvbU1hdDR9IGZyb20gJ2dsLW1hdDMvbm9ybWFsLWZyb20tbWF0NCc7XG5pbXBvcnQge2RlZmF1bHQgYXMgbWF0M19pbnZlcnR9IGZyb20gJ2dsLW1hdDMvaW52ZXJ0JztcblxuY29uc3QgbWF0MyA9IHtcbiAgICBub3JtYWxGcm9tTWF0NDogbWF0M19ub3JtYWxGcm9tTWF0NCxcbiAgICBpbnZlcnQ6IG1hdDNfaW52ZXJ0XG59O1xuXG5cbi8vIG1hdDRcblxuaW1wb3J0IHtkZWZhdWx0IGFzIG1hdDRfbXVsdGlwbHl9IGZyb20gJ2dsLW1hdDQvbXVsdGlwbHknO1xuaW1wb3J0IHtkZWZhdWx0IGFzIG1hdDRfdHJhbnNsYXRlfSBmcm9tICdnbC1tYXQ0L3RyYW5zbGF0ZSc7XG5pbXBvcnQge2RlZmF1bHQgYXMgbWF0NF9zY2FsZX0gZnJvbSAnZ2wtbWF0NC9zY2FsZSc7XG5pbXBvcnQge2RlZmF1bHQgYXMgbWF0NF9wZXJzcGVjdGl2ZX0gZnJvbSAnZ2wtbWF0NC9wZXJzcGVjdGl2ZSc7XG5pbXBvcnQge2RlZmF1bHQgYXMgbWF0NF9sb29rQXR9IGZyb20gJ2dsLW1hdDQvbG9va0F0JztcbmltcG9ydCB7ZGVmYXVsdCBhcyBtYXQ0X2lkZW50aXR5fSBmcm9tICdnbC1tYXQ0L2lkZW50aXR5JztcbmltcG9ydCB7ZGVmYXVsdCBhcyBtYXQ0X2NvcHl9IGZyb20gJ2dsLW1hdDQvY29weSc7XG5cbmNvbnN0IG1hdDQgPSB7XG4gICAgbXVsdGlwbHk6IG1hdDRfbXVsdGlwbHksXG4gICAgdHJhbnNsYXRlOiBtYXQ0X3RyYW5zbGF0ZSxcbiAgICBzY2FsZTogbWF0NF9zY2FsZSxcbiAgICBwZXJzcGVjdGl2ZTogbWF0NF9wZXJzcGVjdGl2ZSxcbiAgICBsb29rQXQ6IG1hdDRfbG9va0F0LFxuICAgIGlkZW50aXR5OiBtYXQ0X2lkZW50aXR5LFxuICAgIGNvcHk6IG1hdDRfY29weVxufTtcblxuXG5leHBvcnQge3ZlYzMsIG1hdDMsIG1hdDR9O1xuIiwiaW1wb3J0IHZlcnNpb24gZnJvbSAnLi92ZXJzaW9uJztcbmltcG9ydCBUaHJlYWQgZnJvbSAnLi90aHJlYWQnO1xuaW1wb3J0IFdvcmtlckJyb2tlciBmcm9tICcuL3dvcmtlcl9icm9rZXInO1xuXG5jb25zdCBMRVZFTFMgPSB7XG4gICAgc2lsZW50OiAtMSxcbiAgICBlcnJvcjogMCxcbiAgICB3YXJuOiAxLFxuICAgIGluZm86IDIsXG4gICAgZGVidWc6IDMsXG4gICAgdHJhY2U6IDRcbn07XG5cbmNvbnN0IG1ldGhvZHMgPSB7fTtcblxuZnVuY3Rpb24gbWV0aG9kRm9yTGV2ZWwgKGxldmVsKSB7XG4gICAgaWYgKFRocmVhZC5pc19tYWluKSB7XG4gICAgICAgIG1ldGhvZHNbbGV2ZWxdID0gbWV0aG9kc1tsZXZlbF0gfHwgKGNvbnNvbGVbbGV2ZWxdID8gY29uc29sZVtsZXZlbF0gOiBjb25zb2xlLmxvZykuYmluZChjb25zb2xlKTtcbiAgICAgICAgcmV0dXJuIG1ldGhvZHNbbGV2ZWxdO1xuICAgIH1cbn1cblxuZXhwb3J0IGRlZmF1bHQgZnVuY3Rpb24gbG9nIChtc2dfbGV2ZWwsIC4uLm1zZykge1xuICAgIGlmIChMRVZFTFNbbXNnX2xldmVsXSA8PSBMRVZFTFNbbG9nLmxldmVsXSkge1xuICAgICAgICBpZiAoVGhyZWFkLmlzX3dvcmtlcikge1xuICAgICAgICAgICAgLy8gUHJveHkgdG8gbWFpbiB0aHJlYWRcbiAgICAgICAgICAgIFdvcmtlckJyb2tlci5wb3N0TWVzc2FnZSgnX2xvZ1Byb3h5JywgbXNnX2xldmVsLCAuLi5tc2cpO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgbGV0IGxvZ2dlciA9IG1ldGhvZEZvckxldmVsKG1zZ19sZXZlbCk7XG5cbiAgICAgICAgICAgIC8vIFdyaXRlIHRvIGNvbnNvbGUgKG9uIG1haW4gdGhyZWFkKVxuICAgICAgICAgICAgaWYgKG1zZy5sZW5ndGggPiAxKSB7XG4gICAgICAgICAgICAgICAgbG9nZ2VyKGBUYW5ncmFtICR7dmVyc2lvbn0gWyR7bXNnX2xldmVsfV06ICR7bXNnWzBdfWAsIC4uLm1zZy5zbGljZSgxKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICBsb2dnZXIoYFRhbmdyYW0gJHt2ZXJzaW9ufSBbJHttc2dfbGV2ZWx9XTogJHttc2dbMF19YCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG59XG5cbmxvZy5sZXZlbCA9ICdpbmZvJztcbmxvZy53b3JrZXJzID0gbnVsbDtcblxubG9nLnNldExldmVsID0gZnVuY3Rpb24gKGxldmVsKSB7XG4gICAgbG9nLmxldmVsID0gbGV2ZWw7XG5cbiAgICBpZiAoVGhyZWFkLmlzX21haW4gJiYgQXJyYXkuaXNBcnJheShsb2cud29ya2VycykpIHtcbiAgICAgICAgV29ya2VyQnJva2VyLnBvc3RNZXNzYWdlKGxvZy53b3JrZXJzLCAnX2xvZ1NldExldmVsUHJveHknLCBsZXZlbCk7XG4gICAgfVxufTtcblxuaWYgKFRocmVhZC5pc19tYWluKSB7XG4gICAgbG9nLnNldFdvcmtlcnMgPSBmdW5jdGlvbiAod29ya2Vycykge1xuICAgICAgICBsb2cud29ya2VycyA9IHdvcmtlcnM7XG4gICAgfTtcblxuXG59XG5cbldvcmtlckJyb2tlci5hZGRUYXJnZXQoJ19sb2dQcm94eScsIGxvZyk7ICAgICAgICAgICAgICAgICAgIC8vIHByb3h5IGxvZyBtZXNzYWdlcyBmcm9tIHdvcmtlciB0byBtYWluIHRocmVhZFxuV29ya2VyQnJva2VyLmFkZFRhcmdldCgnX2xvZ1NldExldmVsUHJveHknLCBsb2cuc2V0TGV2ZWwpOyAgLy8gcHJveHkgbG9nIGxldmVsIHNldHRpbmcgZnJvbSBtYWluIHRvIHdvcmtlciB0aHJlYWRcbiIsIi8qIGdsb2JhbCBNZWRpYVJlY29yZGVyICovXG5pbXBvcnQgbG9nIGZyb20gJy4vbG9nJztcbmltcG9ydCB7Y3JlYXRlT2JqZWN0VVJMfSBmcm9tICcuL3VybHMnO1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBNZWRpYUNhcHR1cmUge1xuXG4gICAgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHRoaXMucXVldWVfc2NyZWVuc2hvdCA9IG51bGw7XG4gICAgICAgIHRoaXMudmlkZW9fY2FwdHVyZSA9IG51bGw7XG4gICAgfVxuXG4gICAgc2V0Q2FudmFzIChjYW52YXMpIHtcbiAgICAgICAgdGhpcy5jYW52YXMgPSBjYW52YXM7XG4gICAgfVxuXG4gICAgLy8gVGFrZSBhIHNjcmVlbnNob3QsIHJldHVybnMgYSBwcm9taXNlIHRoYXQgcmVzb2x2ZXMgd2l0aCB0aGUgc2NyZWVuc2hvdCBkYXRhIHdoZW4gYXZhaWxhYmxlXG4gICAgc2NyZWVuc2hvdCAoKSB7XG4gICAgICAgIGlmICh0aGlzLnF1ZXVlX3NjcmVlbnNob3QgIT0gbnVsbCkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMucXVldWVfc2NyZWVuc2hvdC5wcm9taXNlOyAvLyBvbmx5IGNhcHR1cmUgb25lIHNjcmVlbnNob3QgYXQgYSB0aW1lXG4gICAgICAgIH1cblxuICAgICAgICAvLyBXaWxsIHJlc29sdmUgb25jZSByZW5kZXJpbmcgaXMgY29tcGxldGUgYW5kIHJlbmRlciBidWZmZXIgaXMgY2FwdHVyZWRcbiAgICAgICAgdGhpcy5xdWV1ZV9zY3JlZW5zaG90ID0ge307XG4gICAgICAgIHRoaXMucXVldWVfc2NyZWVuc2hvdC5wcm9taXNlID0gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgdGhpcy5xdWV1ZV9zY3JlZW5zaG90LnJlc29sdmUgPSByZXNvbHZlO1xuICAgICAgICAgICAgdGhpcy5xdWV1ZV9zY3JlZW5zaG90LnJlamVjdCA9IHJlamVjdDtcbiAgICAgICAgfSk7XG4gICAgICAgIHJldHVybiB0aGlzLnF1ZXVlX3NjcmVlbnNob3QucHJvbWlzZTtcbiAgICB9XG5cbiAgICAvLyBDYWxsZWQgYWZ0ZXIgcmVuZGVyaW5nLCBjYXB0dXJlcyByZW5kZXIgYnVmZmVyIGFuZCByZXNvbHZlcyBwcm9taXNlIHdpdGggdGhlIGltYWdlIGRhdGFcbiAgICBjb21wbGV0ZVNjcmVlbnNob3QgKCkge1xuICAgICAgICBpZiAodGhpcy5xdWV1ZV9zY3JlZW5zaG90ICE9IG51bGwpIHtcbiAgICAgICAgICAgIC8vIEdldCBkYXRhIFVSTCwgY29udmVydCB0byBibG9iXG4gICAgICAgICAgICAvLyBTdHJpcCBob3N0L21pbWV0eXBlL2V0Yy4sIGNvbnZlcnQgYmFzZTY0IHRvIGJpbmFyeSB3aXRob3V0IFVURi04IG1hbmdsaW5nXG4gICAgICAgICAgICAvLyBBZGFwdGVkIGZyb206IGh0dHBzOi8vZ2lzdC5naXRodWIuY29tL3VuY29uZWQvNDM3MDgyMlxuICAgICAgICAgICAgY29uc3QgdXJsID0gdGhpcy5jYW52YXMudG9EYXRhVVJMKCdpbWFnZS9wbmcnKTtcbiAgICAgICAgICAgIGNvbnN0IGRhdGEgPSBhdG9iKHVybC5zbGljZSgyMikpO1xuICAgICAgICAgICAgY29uc3QgYnVmZmVyID0gbmV3IFVpbnQ4QXJyYXkoZGF0YS5sZW5ndGgpO1xuICAgICAgICAgICAgZm9yIChsZXQgaSA9IDA7IGkgPCBkYXRhLmxlbmd0aDsgKytpKSB7XG4gICAgICAgICAgICAgICAgYnVmZmVyW2ldID0gZGF0YS5jaGFyQ29kZUF0KGkpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY29uc3QgYmxvYiA9IG5ldyBCbG9iKFtidWZmZXJdLCB7IHR5cGU6ICdpbWFnZS9wbmcnIH0pO1xuXG4gICAgICAgICAgICAvLyBSZXNvbHZlIHdpdGggc2NyZWVuc2hvdCBkYXRhXG4gICAgICAgICAgICB0aGlzLnF1ZXVlX3NjcmVlbnNob3QucmVzb2x2ZSh7IHVybCwgYmxvYiwgdHlwZTogJ3BuZycgfSk7XG4gICAgICAgICAgICB0aGlzLnF1ZXVlX3NjcmVlbnNob3QgPSBudWxsO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gU3RhcnRzIGNhcHR1cmluZyBhIHZpZGVvIHN0cmVhbSBmcm9tIHRoZSBjYW52YXNcbiAgICBzdGFydFZpZGVvQ2FwdHVyZSAoKSB7XG4gICAgICAgIGlmICh0eXBlb2Ygd2luZG93Lk1lZGlhUmVjb3JkZXIgIT09ICdmdW5jdGlvbicgfHwgIXRoaXMuY2FudmFzIHx8IHR5cGVvZiB0aGlzLmNhbnZhcy5jYXB0dXJlU3RyZWFtICE9PSAnZnVuY3Rpb24nKSB7XG4gICAgICAgICAgICBsb2coJ3dhcm4nLCAnVmlkZW8gY2FwdHVyZSAoQ2FudmFzLmNhcHR1cmVTdHJlYW0gYW5kL29yIE1lZGlhUmVjb3JkZXIgQVBJcykgbm90IHN1cHBvcnRlZCBieSBicm93c2VyJyk7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSBpZiAodGhpcy52aWRlb19jYXB0dXJlKSB7XG4gICAgICAgICAgICBsb2coJ3dhcm4nLCAnVmlkZW8gY2FwdHVyZSBhbHJlYWR5IGluIHByb2dyZXNzLCBjYWxsIFNjZW5lLnN0b3BWaWRlb0NhcHR1cmUoKSBmaXJzdCcpO1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gU3RhcnQgYSBuZXcgY2FwdHVyZVxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgbGV0IGNhcCA9IHRoaXMudmlkZW9fY2FwdHVyZSA9IHt9O1xuICAgICAgICAgICAgY2FwLmNodW5rcyA9IFtdO1xuICAgICAgICAgICAgY2FwLnN0cmVhbSA9IHRoaXMuY2FudmFzLmNhcHR1cmVTdHJlYW0oKTtcbiAgICAgICAgICAgIGNhcC5vcHRpb25zID0geyBtaW1lVHlwZTogJ3ZpZGVvL3dlYm0nIH07IC8vIFRPRE86IHN1cHBvcnQgb3RoZXIgZm9ybWF0IG9wdGlvbnNcbiAgICAgICAgICAgIGNhcC5tZWRpYV9yZWNvcmRlciA9IG5ldyBNZWRpYVJlY29yZGVyKGNhcC5zdHJlYW0sIGNhcC5vcHRpb25zKTtcbiAgICAgICAgICAgIGNhcC5tZWRpYV9yZWNvcmRlci5vbmRhdGFhdmFpbGFibGUgPSAoZXZlbnQpID0+IHtcbiAgICAgICAgICAgICAgICBpZiAoZXZlbnQuZGF0YS5zaXplID4gMCkge1xuICAgICAgICAgICAgICAgICAgIGNhcC5jaHVua3MucHVzaChldmVudC5kYXRhKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyBTdG9wcGVkIHJlY29yZGluZz8gQ3JlYXRlIHRoZSBmaW5hbCBjYXB0dXJlIGZpbGUgYmxvYlxuICAgICAgICAgICAgICAgIGlmIChjYXAucmVzb2x2ZSkge1xuICAgICAgICAgICAgICAgICAgICBsZXQgYmxvYiA9IG5ldyBCbG9iKGNhcC5jaHVua3MsIHsgdHlwZTogY2FwLm9wdGlvbnMubWltZVR5cGUgfSk7XG4gICAgICAgICAgICAgICAgICAgIGxldCB1cmwgPSBjcmVhdGVPYmplY3RVUkwoYmxvYik7XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gRXhwbGljaXRseSByZW1vdmUgYWxsIHN0cmVhbSB0cmFja3MsIGFuZCBzZXQgb2JqZWN0cyB0byBudWxsXG4gICAgICAgICAgICAgICAgICAgIGlmIChjYXAuc3RyZWFtKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsZXQgdHJhY2tzID0gY2FwLnN0cmVhbS5nZXRUcmFja3MoKSB8fCBbXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyYWNrcy5mb3JFYWNoKHRyYWNrID0+IHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFjay5zdG9wKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FwLnN0cmVhbS5yZW1vdmVUcmFjayh0cmFjayk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBjYXAuc3RyZWFtID0gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgY2FwLm1lZGlhX3JlY29yZGVyID0gbnVsbDtcbiAgICAgICAgICAgICAgICAgICAgdGhpcy52aWRlb19jYXB0dXJlID0gbnVsbDtcblxuICAgICAgICAgICAgICAgICAgICBjYXAucmVzb2x2ZSh7IHVybCwgYmxvYiwgdHlwZTogJ3dlYm0nIH0pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICBjYXAubWVkaWFfcmVjb3JkZXIuc3RhcnQoKTtcbiAgICAgICAgfVxuICAgICAgICBjYXRjaCAoZSkge1xuICAgICAgICAgICAgdGhpcy52aWRlb19jYXB0dXJlID0gbnVsbDtcbiAgICAgICAgICAgIGxvZygnZXJyb3InLCAnU2NlbmUgdmlkZW8gY2FwdHVyZSBmYWlsZWQnLCBlKTtcbiAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICB9XG5cbiAgICAvLyBTdG9wcyBjYXB0dXJpbmcgYSB2aWRlbyBzdHJlYW0gZnJvbSB0aGUgY2FudmFzLCByZXR1cm5zIGEgcHJvbWlzZSB0aGF0IHJlc29sdmVzIHdpdGggdGhlIHZpZGVvIHdoZW4gYXZhaWxhYmxlXG4gICAgc3RvcFZpZGVvQ2FwdHVyZSAoKSB7XG4gICAgICAgIGlmICghdGhpcy52aWRlb19jYXB0dXJlKSB7XG4gICAgICAgICAgICBsb2coJ3dhcm4nLCAnTm8gc2NlbmUgdmlkZW8gY2FwdHVyZSBpbiBwcm9ncmVzcywgY2FsbCBTY2VuZS5zdGFydFZpZGVvQ2FwdHVyZSgpIGZpcnN0Jyk7XG4gICAgICAgICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHt9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFByb21pc2UgdGhhdCB3aWxsIHJlc29sdmUgd2hlbiBmaW5hbCBzdHJlYW0gaXMgYXZhaWxhYmxlXG4gICAgICAgIHRoaXMudmlkZW9fY2FwdHVyZS5wcm9taXNlID0gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgdGhpcy52aWRlb19jYXB0dXJlLnJlc29sdmUgPSByZXNvbHZlO1xuICAgICAgICAgICAgdGhpcy52aWRlb19jYXB0dXJlLnJlamVjdCA9IHJlamVjdDtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgLy8gU3RvcCByZWNvcmRpbmdcbiAgICAgICAgdGhpcy52aWRlb19jYXB0dXJlLm1lZGlhX3JlY29yZGVyLnN0b3AoKTtcblxuICAgICAgICByZXR1cm4gdGhpcy52aWRlb19jYXB0dXJlLnByb21pc2U7XG4gICAgfVxuXG59XG4iLCIvLyBEZWVwL3JlY3Vyc2l2ZSBtZXJnZSBvZiBvbmUgb3IgbW9yZSBzb3VyY2Ugb2JqZWN0cyBpbnRvIGEgZGVzdGluYXRpb24gb2JqZWN0XG5leHBvcnQgZGVmYXVsdCBmdW5jdGlvbiBtZXJnZU9iamVjdHMgKGRlc3QsIC4uLnNvdXJjZXMpIHtcbiAgICBmb3IgKGxldCBzPTA7IHMgPCBzb3VyY2VzLmxlbmd0aDsgcysrKSB7XG4gICAgICAgIGxldCBzb3VyY2UgPSBzb3VyY2VzW3NdO1xuICAgICAgICBpZiAoIXNvdXJjZSkge1xuICAgICAgICAgICAgY29udGludWU7XG4gICAgICAgIH1cbiAgICAgICAgZm9yIChsZXQga2V5IGluIHNvdXJjZSkge1xuICAgICAgICAgICAgbGV0IHZhbHVlID0gc291cmNlW2tleV07XG4gICAgICAgICAgICAvLyBSZWN1cnNpdmVseSBtZXJnZSB0aGUgc291cmNlIGludG8gdGhlIGRlc3RpbmF0aW9uIGlmIGl0IGlzIGEgYSBub24tbnVsbCBrZXkvdmFsdWUgb2JqZWN0XG4gICAgICAgICAgICAvLyAoZS5nLiBkb24ndCBtZXJnZSBhcnJheXMsIHRob3NlIGFyZSB0cmVhdGVkIGFzIHNjYWxhciB2YWx1ZXM7IG51bGwgdmFsdWVzIHdpbGwgb3ZlcndyaXRlL2VyYXNlXG4gICAgICAgICAgICAvLyB0aGUgcHJldmlvdXMgZGVzdGluYXRpb24gdmFsdWUpXG4gICAgICAgICAgICBpZiAodmFsdWUgIT09IG51bGwgJiYgdHlwZW9mIHZhbHVlID09PSAnb2JqZWN0JyAmJiAhQXJyYXkuaXNBcnJheSh2YWx1ZSkpIHtcbiAgICAgICAgICAgICAgICBpZiAoZGVzdFtrZXldICE9PSBudWxsICYmIHR5cGVvZiBkZXN0W2tleV0gPT09ICdvYmplY3QnICYmICFBcnJheS5pc0FycmF5KGRlc3Rba2V5XSkpIHtcbiAgICAgICAgICAgICAgICAgICAgZGVzdFtrZXldID0gbWVyZ2VPYmplY3RzKGRlc3Rba2V5XSwgdmFsdWUpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgZGVzdFtrZXldID0gbWVyZ2VPYmplY3RzKHt9LCB2YWx1ZSk7IC8vIGRlc3RpbmF0aW9uIG5vdCBhbiBvYmplY3QsIG92ZXJ3cml0ZVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIE92ZXJ3cml0ZSB0aGUgcHJldmlvdXMgZGVzdGluYXRpb24gdmFsdWUgaWYgdGhlIHNvdXJjZSBwcm9wZXJ0eSBpczogYSBzY2FsYXIgKG51bWJlci9zdHJpbmcpLFxuICAgICAgICAgICAgLy8gYW4gYXJyYXksIG9yIGEgbnVsbCB2YWx1ZVxuICAgICAgICAgICAgZWxzZSBpZiAodmFsdWUgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgIGRlc3Rba2V5XSA9IHZhbHVlO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gVW5kZWZpbmVkIHNvdXJjZSBwcm9wZXJ0aWVzIGFyZSBpZ25vcmVkXG4gICAgICAgIH1cblxuICAgIH1cbiAgICByZXR1cm4gZGVzdDtcbn1cbiIsImltcG9ydCBWZWN0b3IgZnJvbSAnLi4vdmVjdG9yJztcblxuZXhwb3J0IGRlZmF1bHQgY2xhc3MgT0JCIHtcblxuICAgIGNvbnN0cnVjdG9yICh4LCB5LCBhLCB3LCBoKSB7XG4gICAgICAgIHRoaXMuZGltZW5zaW9uID0gW3csIGhdO1xuICAgICAgICB0aGlzLmFuZ2xlID0gYTtcbiAgICAgICAgdGhpcy5jZW50cm9pZCA9IFt4LCB5XTtcbiAgICAgICAgdGhpcy5xdWFkID0gW107XG4gICAgICAgIHRoaXMuYXhlcyA9IFtdO1xuXG4gICAgICAgIHRoaXMudXBkYXRlKCk7XG4gICAgfVxuXG4gICAgbW92ZSAocHgsIHB5KSB7XG4gICAgXHR0aGlzLmNlbnRyb2lkID0gW3B4LCBweV07XG5cbiAgICBcdHRoaXMudXBkYXRlKCk7XG4gICAgfVxuXG4gICAgZ2V0RXh0ZW50ICgpIHtcbiAgICBcdGxldCBpbmYgPSAxZTY7XG4gICAgXHRsZXQgYWFiYiA9IFtpbmYsIGluZiwgLWluZiwgLWluZl07XG5cbiAgICBcdGZvciAobGV0IGkgPSAwOyBpIDwgNDsgKytpKSB7XG4gICAgICAgICAgICBhYWJiWzBdID0gTWF0aC5taW4odGhpcy5xdWFkW2ldWzBdLCBhYWJiWzBdKTtcbiAgICAgICAgICAgIGFhYmJbMV0gPSBNYXRoLm1pbih0aGlzLnF1YWRbaV1bMV0sIGFhYmJbMV0pO1xuICAgICAgICAgICAgYWFiYlsyXSA9IE1hdGgubWF4KHRoaXMucXVhZFtpXVswXSwgYWFiYlsyXSk7XG4gICAgICAgICAgICBhYWJiWzNdID0gTWF0aC5tYXgodGhpcy5xdWFkW2ldWzFdLCBhYWJiWzNdKTtcbiAgICBcdH1cblxuICAgIFx0cmV0dXJuIGFhYmI7XG4gICAgfVxuXG4gICAgcGVycEF4ZXMgKCkge1xuICAgIFx0dGhpcy5heGVzWzBdID0gVmVjdG9yLm5vcm1hbGl6ZShWZWN0b3Iuc3ViKHRoaXMucXVhZFsyXSwgdGhpcy5xdWFkWzNdKSk7XG4gICAgXHR0aGlzLmF4ZXNbMV0gPSBWZWN0b3Iubm9ybWFsaXplKFZlY3Rvci5zdWIodGhpcy5xdWFkWzJdLCB0aGlzLnF1YWRbMV0pKTtcbiAgICB9XG5cbiAgICB1cGRhdGUgKCkge1xuICAgIFx0bGV0IHggPSBbIE1hdGguY29zKHRoaXMuYW5nbGUpLCBNYXRoLnNpbih0aGlzLmFuZ2xlKV07XG4gICAgXHRsZXQgeSA9IFstTWF0aC5zaW4odGhpcy5hbmdsZSksIE1hdGguY29zKHRoaXMuYW5nbGUpXTtcblxuICAgIFx0eCA9IFZlY3Rvci5tdWx0KHgsIHRoaXMuZGltZW5zaW9uWzBdIC8gMi4wKTtcbiAgICBcdHkgPSBWZWN0b3IubXVsdCh5LCB0aGlzLmRpbWVuc2lvblsxXSAvIDIuMCk7XG5cbiAgICBcdHRoaXMucXVhZFswXSA9IFZlY3Rvci5zdWIoVmVjdG9yLnN1Yih0aGlzLmNlbnRyb2lkLCB4KSwgeSk7IC8vIGxvd2VyLWxlZnRcbiAgICBcdHRoaXMucXVhZFsxXSA9IFZlY3Rvci5zdWIoVmVjdG9yLmFkZCh0aGlzLmNlbnRyb2lkLCB4KSwgeSk7IC8vIGxvd2VyLXJpZ2h0XG4gICAgXHR0aGlzLnF1YWRbMl0gPSBWZWN0b3IuYWRkKFZlY3Rvci5hZGQodGhpcy5jZW50cm9pZCwgeCksIHkpOyAvLyB1cGVyLXJpZ2h0XG4gICAgXHR0aGlzLnF1YWRbM10gPSBWZWN0b3IuYWRkKFZlY3Rvci5zdWIodGhpcy5jZW50cm9pZCwgeCksIHkpOyAvLyB1cGVyLWxlZnRcblxuICAgIFx0dGhpcy5wZXJwQXhlcygpO1xuICAgIH1cblxuICAgIHN0YXRpYyBwcm9qZWN0VG9BeGlzIChvYmIsIGF4aXMpIHtcbiAgICBcdGxldCBpbmYgPSAxZTY7XG4gICAgXHRsZXQgbWluID0gaW5mO1xuICAgIFx0bGV0IG1heCA9IC1pbmY7XG5cbiAgICBcdGxldCBxdWFkID0gb2JiLnF1YWQ7XG5cbiAgICBcdC8vIGZvciBlYWNoIGF4aXMsIHByb2plY3Qgb2JiIHF1YWQgdG8gaXQgYW5kIGZpbmQgbWluIGFuZCBtYXggdmFsdWVzXG4gICAgXHRmb3IgKGxldCBpID0gMDsgaSA8IDQ7ICsraSkge1xuICAgICAgICAgICAgbGV0IGQgPSAgVmVjdG9yLmRvdChxdWFkW2ldLCBheGlzKTtcbiAgICAgICAgICAgIG1pbiA9IE1hdGgubWluKG1pbiwgZCk7XG4gICAgICAgICAgICBtYXggPSBNYXRoLm1heChtYXgsIGQpO1xuICAgIFx0fVxuXG4gICAgXHRyZXR1cm4gW21pbiwgbWF4XTtcbiAgICB9XG5cbiAgICBzdGF0aWMgYXhpc0NvbGxpZGUgKG9iYl9hLCBvYmJfYiwgYXhlcykge1xuICAgIFx0Zm9yIChsZXQgaSA9IDA7IGkgPCAyOyArK2kpIHtcbiAgICBcdFx0bGV0IGFfcHJvaiA9IE9CQi5wcm9qZWN0VG9BeGlzKG9iYl9hLCBheGVzW2ldKTtcbiAgICBcdFx0bGV0IGJfcHJvaiA9IE9CQi5wcm9qZWN0VG9BeGlzKG9iYl9iLCBheGVzW2ldKTtcblxuICAgIFx0XHRpZiAoYl9wcm9qWzBdID4gYV9wcm9qWzFdIHx8IGJfcHJvalsxXSA8IGFfcHJvalswXSkge1xuICAgIFx0XHRcdHJldHVybiBmYWxzZTtcbiAgICBcdFx0fVxuICAgIFx0fVxuICAgIFx0cmV0dXJuIHRydWU7XG4gICAgfVxuXG4gICAgc3RhdGljIGludGVyc2VjdChvYmJfYSwgb2JiX2IpIHtcbiAgICBcdHJldHVybiBPQkIuYXhpc0NvbGxpZGUob2JiX2EsIG9iYl9iLCBvYmJfYS5heGVzKSAmJiBPQkIuYXhpc0NvbGxpZGUob2JiX2EsIG9iYl9iLCBvYmJfYi5heGVzKTtcbiAgICB9XG5cbn1cblxuIiwiLy8gUHJvbWlzZXMgcG9seWZpbGxcbmltcG9ydCAnY29yZS1qcy9lczYvcHJvbWlzZSc7XG5cbi8vIE9iamVjdC5hc3NpZ24gcG9seWZpbGxcbi8vIGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0phdmFTY3JpcHQvUmVmZXJlbmNlL0dsb2JhbF9PYmplY3RzL09iamVjdC9hc3NpZ25cbmlmICh0eXBlb2YgT2JqZWN0LmFzc2lnbiAhPT0gJ2Z1bmN0aW9uJykge1xuICAgIChmdW5jdGlvbiAoKSB7XG4gICAgICAgIE9iamVjdC5hc3NpZ24gPSBmdW5jdGlvbiAodGFyZ2V0KSB7XG4gICAgICAgICAgICAndXNlIHN0cmljdCc7XG4gICAgICAgICAgICAvLyBXZSBtdXN0IGNoZWNrIGFnYWluc3QgdGhlc2Ugc3BlY2lmaWMgY2FzZXMuXG4gICAgICAgICAgICBpZiAodGFyZ2V0ID09PSB1bmRlZmluZWQgfHwgdGFyZ2V0ID09PSBudWxsKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgbmV3IFR5cGVFcnJvcignQ2Fubm90IGNvbnZlcnQgdW5kZWZpbmVkIG9yIG51bGwgdG8gb2JqZWN0Jyk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHZhciBvdXRwdXQgPSBPYmplY3QodGFyZ2V0KTtcbiAgICAgICAgICAgIGZvciAodmFyIGluZGV4ID0gMTsgaW5kZXggPCBhcmd1bWVudHMubGVuZ3RoOyBpbmRleCsrKSB7XG4gICAgICAgICAgICAgICAgdmFyIHNvdXJjZSA9IGFyZ3VtZW50c1tpbmRleF07XG4gICAgICAgICAgICAgICAgaWYgKHNvdXJjZSAhPT0gdW5kZWZpbmVkICYmIHNvdXJjZSAhPT0gbnVsbCkge1xuICAgICAgICAgICAgICAgICAgICBmb3IgKHZhciBuZXh0S2V5IGluIHNvdXJjZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNvdXJjZS5oYXNPd25Qcm9wZXJ0eShuZXh0S2V5KSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dFtuZXh0S2V5XSA9IHNvdXJjZVtuZXh0S2V5XTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIHJldHVybiBvdXRwdXQ7XG4gICAgICAgIH07XG4gICAgfSkoKTtcbn1cbiIsImV4cG9ydCBkZWZhdWx0IGZ1bmN0aW9uIHN1YnNjcmliZU1peGluICh0YXJnZXQpIHtcblxuICAgIGxldCBsaXN0ZW5lcnMgPSBbXTtcblxuICAgIHJldHVybiBPYmplY3QuYXNzaWduKHRhcmdldCwge1xuXG4gICAgICAgIHN1YnNjcmliZShsaXN0ZW5lcikge1xuICAgICAgICAgICAgaWYgKGxpc3RlbmVycy5pbmRleE9mKGxpc3RlbmVyKSA9PT0gLTEpIHtcbiAgICAgICAgICAgICAgICBsaXN0ZW5lcnMucHVzaChsaXN0ZW5lcik7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG5cbiAgICAgICAgdW5zdWJzY3JpYmUobGlzdGVuZXIpIHtcbiAgICAgICAgICAgIGxldCBpbmRleCA9IGxpc3RlbmVycy5pbmRleE9mKGxpc3RlbmVyKTtcbiAgICAgICAgICAgIGlmIChpbmRleCA+IC0xKSB7XG4gICAgICAgICAgICAgICAgbGlzdGVuZXJzLnNwbGljZShpbmRleCwgMSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG5cbiAgICAgICAgdW5zdWJzY3JpYmVBbGwoKSB7XG4gICAgICAgICAgICBsaXN0ZW5lcnMgPSBbXTtcbiAgICAgICAgfSxcblxuICAgICAgICB0cmlnZ2VyKGV2ZW50LCAuLi5kYXRhKSB7XG4gICAgICAgICAgICBsaXN0ZW5lcnMuZm9yRWFjaChsaXN0ZW5lciA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBsaXN0ZW5lcltldmVudF0gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICAgICAgbGlzdGVuZXJbZXZlbnRdKC4uLmRhdGEpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9LFxuXG4gICAgICAgIGhhc1N1YnNjcmliZXJzRm9yKGV2ZW50KSB7XG4gICAgICAgICAgICBsZXQgaGFzID0gZmFsc2U7XG4gICAgICAgICAgICBsaXN0ZW5lcnMuZm9yRWFjaChsaXN0ZW5lciA9PiB7XG4gICAgICAgICAgICAgICAgaWYgKHR5cGVvZiBsaXN0ZW5lcltldmVudF0gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICAgICAgaGFzID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIHJldHVybiBoYXM7XG4gICAgICAgIH1cblxuICAgIH0pO1xuXG59XG4iLCIvKmpzaGludCB3b3JrZXI6IHRydWUqL1xuXG4vLyBNYXJrIHRocmVhZCBhcyBtYWluIG9yIHdvcmtlclxuY29uc3QgVGhyZWFkID0ge307XG5cbmV4cG9ydCBkZWZhdWx0IFRocmVhZDtcblxudHJ5IHtcbiAgICBpZiAod2luZG93LmRvY3VtZW50ICE9PSBIVE1MRG9jdW1lbnQpIHsgLy8ganNoaW50IGlnbm9yZTpsaW5lXG4gICAgICAgIFRocmVhZC5pc193b3JrZXIgPSBmYWxzZTtcbiAgICAgICAgVGhyZWFkLmlzX21haW4gICA9IHRydWU7XG4gICAgfVxufVxuY2F0Y2ggKGUpIHtcbiAgICBpZiAoc2VsZiAhPT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIFRocmVhZC5pc193b3JrZXIgPSB0cnVlO1xuICAgICAgICBUaHJlYWQuaXNfbWFpbiAgID0gZmFsc2U7XG5cbiAgICAgICAgLy8gUGF0Y2ggZm9yIDNyZCBwYXJ0eSBsaWJzIHRoYXQgcmVxdWlyZSB0aGVzZSBnbG9iYWxzIHRvIGJlIHByZXNlbnQuIFNwZWNpZmljYWxseSwgRm9udEZhY2VPYnNlcnZlci5cbiAgICAgICAgLy8gQnJpdHRsZSBzb2x1dGlvbiBidXQgYWxsb3dzIHRoYXQgbGlicmFyeSB0byBsb2FkIG9uIHdvcmtlciB0aHJlYWRzLlxuICAgICAgICBzZWxmLndpbmRvdyA9IHsgZG9jdW1lbnQ6IHt9IH07XG4gICAgICAgIHNlbGYuZG9jdW1lbnQgPSBzZWxmLndpbmRvdy5kb2N1bWVudDtcbiAgICB9XG59XG4iLCJpbXBvcnQgbG9nIGZyb20gJy4vbG9nJztcblxuLy8gQWRkIGEgYmFzZSBVUkwgZm9yIHNjaGVtZWxlc3Mgb3IgcHJvdG9jb2wtbGVzcyBVUkxzXG4vLyBEZWZhdWx0cyB0byBhZGRpbmcgY3VycmVudCB3aW5kb3cgcHJvdG9jb2wgYW5kIGJhc2UsIG9yIGFkZHMgYSBjdXN0b20gYmFzZSBpZiBzcGVjaWZpZWRcbi8vIE1heWJlIHVzZSBodHRwczovL2dpdGh1Yi5jb20vbWVkaWFsaXplL1VSSS5qcyBpZiBtb3JlIHJvYnVzdCBmdW5jdGlvbmFsaXR5IGlzIG5lZWRlZFxuZXhwb3J0IGZ1bmN0aW9uIGFkZEJhc2VVUkwgKHVybCwgYmFzZSkge1xuICAgIGlmICghdXJsKSB7XG4gICAgICAgIHJldHVybjtcbiAgICB9XG5cbiAgICAvLyBTY2hlbWVsZXNzLCBhZGQgcHJvdG9jb2xcbiAgICBpZiAodXJsLnN1YnN0cigwLCAyKSA9PT0gJy8vJykge1xuICAgICAgICB1cmwgPSB3aW5kb3cubG9jYXRpb24ucHJvdG9jb2wgKyB1cmw7XG4gICAgfVxuICAgIC8vIE5vIGh0dHAocykgb3IgZGF0YSwgYWRkIGJhc2VcbiAgICBlbHNlIGlmICh1cmwuc2VhcmNoKC9eKGh0dHB8aHR0cHN8ZGF0YXxibG9iKTovKSA8IDApIHtcbiAgICAgICAgdmFyIHJlbGF0aXZlID0gKHVybFswXSAhPT0gJy8nKTtcbiAgICAgICAgdmFyIGJhc2VfaW5mbztcbiAgICAgICAgaWYgKGJhc2UpIHtcbiAgICAgICAgICAgIGJhc2VfaW5mbyA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2EnKTsgLy8gdXNlIGEgdGVtcG9yYXJ5IGVsZW1lbnQgdG8gcGFyc2UgVVJMXG4gICAgICAgICAgICBiYXNlX2luZm8uaHJlZiA9IGJhc2U7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICBiYXNlX2luZm8gPSB3aW5kb3cubG9jYXRpb247XG4gICAgICAgIH1cblxuICAgICAgICBpZiAocmVsYXRpdmUpIHtcbiAgICAgICAgICAgIGxldCBwYXRoID0gcGF0aEZvclVSTChiYXNlX2luZm8uaHJlZik7XG4gICAgICAgICAgICB1cmwgPSBwYXRoICsgdXJsO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgLy8gRWFzeSB3YXlcbiAgICAgICAgICAgIGlmIChiYXNlX2luZm8ub3JpZ2luKSB7XG4gICAgICAgICAgICAgICAgdXJsID0gYmFzZV9pbmZvLm9yaWdpbiArICcvJyArIHVybDtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIEhhcmQgd2F5IChJRTExKVxuICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgdmFyIG9yaWdpbiA9IHVybC5tYXRjaCgvXigoaHR0cHxodHRwc3xkYXRhfGJsb2IpOlxcL1xcL1teXFwvXSpcXC8pLyk7XG4gICAgICAgICAgICAgICAgb3JpZ2luID0gKG9yaWdpbiAmJiBvcmlnaW4ubGVuZ3RoID4gMSkgPyBvcmlnaW5bMF0gOiAnJztcbiAgICAgICAgICAgICAgICB1cmwgPSBvcmlnaW4gKyB1cmw7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHVybDtcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIHBhdGhGb3JVUkwgKHVybCkge1xuICAgIGlmICh0eXBlb2YgdXJsID09PSAnc3RyaW5nJyAmJiB1cmwuc2VhcmNoKC9eKGRhdGF8YmxvYik6LykgPT09IC0xKSB7XG4gICAgICAgIGxldCBxcyA9IHVybC5pbmRleE9mKCc/Jyk7XG4gICAgICAgIGlmIChxcyA+IC0xKSB7XG4gICAgICAgICAgICB1cmwgPSB1cmwuc3Vic3RyKDAsIHFzKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBoYXNoID0gdXJsLmluZGV4T2YoJyMnKTtcbiAgICAgICAgaWYgKGhhc2ggPiAtMSkge1xuICAgICAgICAgICAgdXJsID0gdXJsLnN1YnN0cigwLCBoYXNoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB1cmwuc3Vic3RyKDAsIHVybC5sYXN0SW5kZXhPZignLycpICsgMSkgfHwgJyc7XG4gICAgfVxuICAgIHJldHVybiAnJztcbn1cblxuZXhwb3J0IGZ1bmN0aW9uIGV4dGVuc2lvbkZvclVSTCAodXJsKSB7XG4gICAgdXJsID0gdXJsLnNwbGl0KCcvJykucG9wKCk7XG4gICAgbGV0IGxhc3RfZG90ID0gdXJsLmxhc3RJbmRleE9mKCcuJyk7XG4gICAgaWYgKGxhc3RfZG90ID4gLTEpIHtcbiAgICAgICAgcmV0dXJuIHVybC5zdWJzdHJpbmcobGFzdF9kb3QgKyAxKTtcbiAgICB9XG59XG5cbmV4cG9ydCBmdW5jdGlvbiBpc1JlbGF0aXZlVVJMICh1cmwpIHtcbiAgICBpZiAodHlwZW9mIHVybCAhPT0gJ3N0cmluZycpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICByZXR1cm4gISh1cmwuc2VhcmNoKC9eKGh0dHB8aHR0cHN8ZGF0YXxibG9iKTovKSA+IC0xIHx8IHVybC5zdWJzdHIoMCwgMikgPT09ICcvLycpO1xufVxuXG4vLyBSZXNvbHZlcyAnLi8nIGFuZCAnLi4vJyBjb21wb25lbnRzIGZyb20gcmVsYXRpdmUgcGF0aCwgdG8gZ2V0IGEgXCJmbGF0dGVuZWRcIiBwYXRoXG5leHBvcnQgZnVuY3Rpb24gZmxhdHRlblJlbGF0aXZlVVJMICh1cmwpIHtcbiAgICBsZXQgZGlycyA9ICh1cmwgfHwgJycpLnNwbGl0KCcvJyk7XG4gICAgZm9yIChsZXQgZCA9IDE7IGQgPCBkaXJzLmxlbmd0aDsgZCsrKSB7XG4gICAgICAgIGlmIChkaXJzW2RdID09PSAnLicpIHtcbiAgICAgICAgICAgIGRpcnMuc3BsaWNlKGQsIDEpO1xuICAgICAgICAgICAgZC0tO1xuICAgICAgICB9XG4gICAgICAgIGVsc2UgaWYgKGRpcnNbZF0gPT09ICcuLicpIHtcbiAgICAgICAgICAgIGQgPSBkICsgMDtcbiAgICAgICAgICAgIGRpcnMuc3BsaWNlKGQtMSwgMik7XG4gICAgICAgICAgICBkLS07XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIGRpcnMuam9pbignLycpO1xufVxuXG4vLyBBZGQgYSBzZXQgb2YgcXVlcnkgc3RyaW5nIHBhcmFtcyB0byBhIFVSTFxuLy8gcGFyYW1zOiBoYXNoIG9mIGtleS92YWx1ZSBwYWlycyBvZiBxdWVyeSBzdHJpbmcgcGFyYW1ldGVyc1xuZXhwb3J0IGZ1bmN0aW9uIGFkZFBhcmFtc1RvVVJMICh1cmwsIHBhcmFtcykge1xuICAgIGlmICghcGFyYW1zIHx8IE9iamVjdC5rZXlzKHBhcmFtcykubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHJldHVybiB1cmw7XG4gICAgfVxuXG4gICAgdmFyIHFzX2luZGV4ID0gdXJsLmluZGV4T2YoJz8nKTtcbiAgICB2YXIgaGFzaF9pbmRleCA9IHVybC5pbmRleE9mKCcjJyk7XG5cbiAgICAvLyBTYXZlIGFuZCB0cmltIGhhc2hcbiAgICB2YXIgaGFzaCA9ICcnO1xuICAgIGlmIChoYXNoX2luZGV4ID4gLTEpIHtcbiAgICAgICAgaGFzaCA9IHVybC5zbGljZShoYXNoX2luZGV4KTtcbiAgICAgICAgdXJsID0gdXJsLnNsaWNlKDAsIGhhc2hfaW5kZXgpO1xuICAgIH1cblxuICAgIC8vIFN0YXJ0IHF1ZXJ5IHN0cmluZ1xuICAgIGlmIChxc19pbmRleCA9PT0gLTEpIHtcbiAgICAgICAgcXNfaW5kZXggPSB1cmwubGVuZ3RoO1xuICAgICAgICB1cmwgKz0gJz8nO1xuICAgIH1cbiAgICBxc19pbmRleCsrOyAvLyBhZHZhbmNlZCBwYXN0ICc/J1xuXG4gICAgLy8gQnVpbGQgcXVlcnkgc3RyaW5nIHBhcmFtc1xuICAgIHZhciB1cmxfcGFyYW1zID0gJyc7XG4gICAgZm9yICh2YXIgcCBpbiBwYXJhbXMpIHtcbiAgICAgICAgdXJsX3BhcmFtcyArPSBgJHtwfT0ke3BhcmFtc1twXX0mYDtcbiAgICB9XG5cbiAgICAvLyBJbnNlcnQgbmV3IHF1ZXJ5IHN0cmluZyBwYXJhbXMgYW5kIHJlc3RvcmUgaGFzaFxuICAgIC8vIE5PVEU6IGRvZXNuJ3QgcmVwbGFjZSBhbnkgdmFsdWVzIGFscmVhZHkgcHJlc2VudCBvbiBxdWVyeSBzdHJpbmcsIGp1c3QgaW5zZXJ0cyBkdXBlIHZhbHVlc1xuICAgIHVybCA9IHVybC5zbGljZSgwLCBxc19pbmRleCkgKyB1cmxfcGFyYW1zICsgdXJsLnNsaWNlKHFzX2luZGV4KSArIGhhc2g7XG5cbiAgICByZXR1cm4gdXJsO1xufVxuXG4vLyBQb2x5ZmlsbCAoZm9yIFNhZmFyaSBjb21wYXRpYmlsaXR5KVxubGV0IF9jcmVhdGVPYmplY3RVUkw7XG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlT2JqZWN0VVJMICh1cmwpIHtcbiAgICBpZiAoX2NyZWF0ZU9iamVjdFVSTCA9PT0gdW5kZWZpbmVkKSB7XG4gICAgICAgIF9jcmVhdGVPYmplY3RVUkwgPSAod2luZG93LlVSTCAmJiB3aW5kb3cuVVJMLmNyZWF0ZU9iamVjdFVSTCkgfHwgKHdpbmRvdy53ZWJraXRVUkwgJiYgd2luZG93LndlYmtpdFVSTC5jcmVhdGVPYmplY3RVUkwpO1xuXG4gICAgICAgIGlmICh0eXBlb2YgX2NyZWF0ZU9iamVjdFVSTCAhPT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgX2NyZWF0ZU9iamVjdFVSTCA9IG51bGw7XG4gICAgICAgICAgICBsb2coJ3dhcm4nLCBgd2luZG93LlVSTC5jcmVhdGVPYmplY3RVUkwgKG9yIHZlbmRvciBwcmVmaXgpIG5vdCBmb3VuZCwgdW5hYmxlIHRvIGNyZWF0ZSBsb2NhbCBibG9iIFVSTHNgKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGlmIChfY3JlYXRlT2JqZWN0VVJMKSB7XG4gICAgICAgIHJldHVybiBfY3JlYXRlT2JqZWN0VVJMKHVybCk7XG4gICAgfVxuICAgIGVsc2Uge1xuICAgICAgICByZXR1cm4gdXJsO1xuICAgIH1cbn1cblxuLy8gR2V0IFVSTCB0aGF0IHRoZSBjdXJyZW50IHNjcmlwdCB3YXMgbG9hZGVkIGZyb21cbi8vIElmIGN1cnJlbnRTY3JpcHQgaXMgbm90IGF2YWlsYWJsZSwgbG9vcHMgdGhyb3VnaCA8c2NyaXB0PiBlbGVtZW50cyBzZWFyY2hpbmcgZm9yIGEgbGlzdCBvZiBwcm92aWRlZCBwYXRoc1xuLy8gZS5nLiBmaW5kQ3VycmVudFVSTCgndGFuZ3JhbS5kZWJ1Zy5qcycsICd0YW5ncmFtLm1pbi5qcycpO1xuZXhwb3J0IGZ1bmN0aW9uIGZpbmRDdXJyZW50VVJMICguLi5wYXRocykge1xuICAgIC8vIEZpbmQgY3VycmVudGx5IGV4ZWN1dGluZyBzY3JpcHRcbiAgICB2YXIgc2NyaXB0ID0gZG9jdW1lbnQuY3VycmVudFNjcmlwdDtcbiAgICBpZiAoc2NyaXB0KSB7XG4gICAgICAgIHJldHVybiBzY3JpcHQuc3JjO1xuICAgIH1cbiAgICBlbHNlIGlmIChBcnJheS5pc0FycmF5KHBhdGhzKSkge1xuICAgICAgICAvLyBGYWxsYmFjayBvbiBsb29waW5nIHRocm91Z2ggPHNjcmlwdD4gZWxlbWVudHMgaWYgZG9jdW1lbnQuY3VycmVudFNjcmlwdCBpcyBub3Qgc3VwcG9ydGVkXG4gICAgICAgIHZhciBzY3JpcHRzID0gZG9jdW1lbnQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoJ3NjcmlwdCcpO1xuICAgICAgICBmb3IgKHZhciBzPTA7IHMgPCBzY3JpcHRzLmxlbmd0aDsgcysrKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBwPTA7IHAgPCBwYXRocy5sZW5ndGg7IHArKykge1xuICAgICAgICAgICAgICAgIGlmIChzY3JpcHRzW3NdLnNyYy5pbmRleE9mKHBhdGhzW3BdKSA+IC0xKSB7XG4gICAgICAgICAgICAgICAgICAgcmV0dXJuIHNjcmlwdHNbc10uc3JjO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH1cbn1cbiIsIi8vIE1pc2NlbGxhbmVvdXMgdXRpbGl0aWVzXG4vKmpzaGludCB3b3JrZXI6IHRydWUqL1xuXG5pbXBvcnQgbG9nIGZyb20gJy4vbG9nJztcbmltcG9ydCBUaHJlYWQgZnJvbSAnLi90aHJlYWQnO1xuaW1wb3J0IFdvcmtlckJyb2tlciBmcm9tICcuL3dvcmtlcl9icm9rZXInO1xuaW1wb3J0IEdlbyBmcm9tICcuLi9nZW8nO1xuXG52YXIgVXRpbHM7XG5leHBvcnQgZGVmYXVsdCBVdGlscyA9IHt9O1xuXG5Xb3JrZXJCcm9rZXIuYWRkVGFyZ2V0KCdVdGlscycsIFV0aWxzKTtcblxuLy8gQmFzaWMgU2FmYXJpIGRldGVjdGlvblxuLy8gaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy83OTQ0NDYwL2RldGVjdC1zYWZhcmktYnJvd3NlclxuVXRpbHMuaXNTYWZhcmkgPSBmdW5jdGlvbiAoKSB7XG4gICAgcmV0dXJuIC9eKCg/IWNocm9tZXxhbmRyb2lkKS4pKnNhZmFyaS9pLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCk7XG59O1xuXG4vLyBCYXNpYyBJRTExIG9yIEVkZ2UgZGV0ZWN0aW9uXG5VdGlscy5pc01pY3Jvc29mdCA9IGZ1bmN0aW9uICgpIHtcbiAgICByZXR1cm4gLyhUcmlkZW50XFwvNy4wfEVkZ2VbIC9dKFxcZCtbXFwuXFxkXSspKS9pLnRlc3QobmF2aWdhdG9yLnVzZXJBZ2VudCk7XG59O1xuXG5VdGlscy5pbyA9IGZ1bmN0aW9uICh1cmwsIHRpbWVvdXQgPSA2MDAwMCwgcmVzcG9uc2VUeXBlID0gJ3RleHQnLCBtZXRob2QgPSAnR0VUJywgaGVhZGVycyA9IHt9LCBwcm94eSA9IGZhbHNlKSB7XG4gICAgaWYgKFRocmVhZC5pc193b3JrZXIgJiYgVXRpbHMuaXNNaWNyb3NvZnQoKSkge1xuICAgICAgICAvLyBTb21lIHZlcnNpb25zIG9mIElFMTEgYW5kIEVkZ2Ugd2lsbCBoYW5nIHdlYiB3b3JrZXJzIHdoZW4gcGVyZm9ybWluZyBYSFIgcmVxdWVzdHNcbiAgICAgICAgLy8gVGhlc2UgcmVxdWVzdHMgY2FuIGJlIHByb3hpZWQgdGhyb3VnaCB0aGUgbWFpbiB0aHJlYWRcbiAgICAgICAgLy8gaHR0cHM6Ly9kZXZlbG9wZXIubWljcm9zb2Z0LmNvbS9lbi11cy9taWNyb3NvZnQtZWRnZS9wbGF0Zm9ybS9pc3N1ZXMvOTU0NTg2Ni9cbiAgICAgICAgbG9nKCdkZWJ1ZycsICdQcm94eWluZyByZXF1ZXN0IGZvciBVUkwgdG8gd29ya2VyJywgdXJsKTtcbiAgICAgICAgcmV0dXJuIFdvcmtlckJyb2tlci5wb3N0TWVzc2FnZSgnVXRpbHMuaW8nLCB1cmwsIHRpbWVvdXQsIHJlc3BvbnNlVHlwZSwgbWV0aG9kLCBoZWFkZXJzLCB0cnVlKTtcbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIHZhciByZXF1ZXN0ID0gbmV3IFhNTEh0dHBSZXF1ZXN0KCk7XG4gICAgICAgIHZhciBwcm9taXNlID0gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgcmVxdWVzdC5vcGVuKG1ldGhvZCwgdXJsLCB0cnVlKTtcbiAgICAgICAgICAgIHJlcXVlc3QudGltZW91dCA9IHRpbWVvdXQ7XG4gICAgICAgICAgICByZXF1ZXN0LnJlc3BvbnNlVHlwZSA9IHJlc3BvbnNlVHlwZTtcbiAgICAgICAgICAgIHJlcXVlc3Qub25sb2FkID0gKCkgPT4ge1xuICAgICAgICAgICAgICAgIGlmIChyZXF1ZXN0LnN0YXR1cyA9PT0gMjAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChbJ3RleHQnLCAnanNvbiddLmluZGV4T2YocmVxdWVzdC5yZXNwb25zZVR5cGUpID4gLTEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHJlc29sdmUocmVxdWVzdC5yZXNwb25zZVRleHQpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzb2x2ZShyZXF1ZXN0LnJlc3BvbnNlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgIHJlamVjdChFcnJvcignUmVxdWVzdCBlcnJvciB3aXRoIGEgc3RhdHVzIG9mICcgKyByZXF1ZXN0LnN0YXR1c1RleHQpKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgcmVxdWVzdC5vbmVycm9yID0gKGV2dCkgPT4ge1xuICAgICAgICAgICAgICAgIHJlamVjdChFcnJvcignVGhlcmUgd2FzIGEgbmV0d29yayBlcnJvcicgKyBldnQudG9TdHJpbmcoKSkpO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHJlcXVlc3Qub250aW1lb3V0ID0gKGV2dCkgPT4ge1xuICAgICAgICAgICAgICAgIHJlamVjdChFcnJvcigndGltZW91dCAnKyBldnQudG9TdHJpbmcoKSkpO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHJlcXVlc3Quc2VuZCgpO1xuICAgICAgICB9KTtcblxuICAgICAgICBwcm9taXNlID0gcHJvbWlzZS50aGVuKHJlc3BvbnNlID0+IHtcbiAgICAgICAgICAgIHJldHVybiAocHJveHkgJiYgV29ya2VyQnJva2VyLndpdGhUcmFuc2ZlcmFibGVzKHJlc3BvbnNlKSkgfHwgcmVzcG9uc2U7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIC8vIEF0dGFjaCByZXF1ZXN0IHRvIHByb21pc2UgdG8gYWxsb3cgZm9yIFhIUiBjYW5jZWxsYXRpb25cbiAgICAgICAgT2JqZWN0LmRlZmluZVByb3BlcnR5KHByb21pc2UsICdyZXF1ZXN0Jywge1xuICAgICAgICAgICAgdmFsdWU6IHJlcXVlc3RcbiAgICAgICAgfSk7XG5cbiAgICAgICAgcmV0dXJuIHByb21pc2U7XG4gICAgfVxufTtcblxuLy8gTmVlZGVkIGZvciBvbGRlciBicm93c2VycyB0aGF0IHN0aWxsIHN1cHBvcnQgV2ViR0wgKFNhZmFyaSA2IGV0Yy4pXG5VdGlscy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWVQb2x5ZmlsbCA9IGZ1bmN0aW9uICgpIHtcbiAgICBpZiAodHlwZW9mIHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUgIT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZSA9XG4gICAgICAgICAgICB3aW5kb3cud2Via2l0UmVxdWVzdEFuaW1hdGlvbkZyYW1lIHx8XG4gICAgICAgICAgICB3aW5kb3cubW96UmVxdWVzdEFuaW1hdGlvbkZyYW1lICAgIHx8XG4gICAgICAgICAgICB3aW5kb3cub1JlcXVlc3RBbmltYXRpb25GcmFtZSAgICAgIHx8XG4gICAgICAgICAgICB3aW5kb3cubXNSZXF1ZXN0QW5pbWF0aW9uRnJhbWUgICAgIHx8XG4gICAgICAgICAgICBmdW5jdGlvbiAoY2IpIHtcbiAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KGNiLCAxMDAwIC82MCk7XG4gICAgICAgICAgICB9O1xuICAgIH1cbn07XG5cbi8vIFN0cmluZ2lmeSBhbiBvYmplY3QgaW50byBKU09OLCBidXQgY29udmVydCBmdW5jdGlvbnMgdG8gc3RyaW5nc1xuVXRpbHMuc2VyaWFsaXplV2l0aEZ1bmN0aW9ucyA9IGZ1bmN0aW9uIChvYmopIHtcbiAgICB2YXIgc2VyaWFsaXplZCA9IEpTT04uc3RyaW5naWZ5KG9iaiwgZnVuY3Rpb24oaywgdikge1xuICAgICAgICAvLyBDb252ZXJ0IGZ1bmN0aW9ucyB0byBzdHJpbmdzXG4gICAgICAgIGlmICh0eXBlb2YgdiA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgcmV0dXJuIHYudG9TdHJpbmcoKTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gdjtcbiAgICB9KTtcblxuICAgIHJldHVybiBzZXJpYWxpemVkO1xufTtcblxuLy8gUmVjdXJzaXZlbHkgcGFyc2UgYW4gb2JqZWN0LCBhdHRlbXB0aW5nIHRvIGNvbnZlcnQgc3RyaW5nIHByb3BlcnRpZXMgdGhhdCBsb29rIGxpa2UgZnVuY3Rpb25zIGJhY2sgaW50byBmdW5jdGlvbnNcblV0aWxzLnN0cmluZ3NUb0Z1bmN0aW9ucyA9IGZ1bmN0aW9uKG9iaiwgd3JhcCkge1xuICAgIC8vIENvbnZlcnQgc3RyaW5nXG4gICAgaWYgKHR5cGVvZiBvYmogPT09ICdzdHJpbmcnKSB7XG4gICAgICAgIG9iaiA9IFV0aWxzLnN0cmluZ1RvRnVuY3Rpb24ob2JqLCB3cmFwKTtcbiAgICB9XG4gICAgLy8gTG9vcCB0aHJvdWdoIG9iamVjdCBwcm9wZXJ0aWVzXG4gICAgZWxzZSBpZiAob2JqICE9IG51bGwgJiYgdHlwZW9mIG9iaiA9PT0gJ29iamVjdCcpIHtcbiAgICAgICAgZm9yIChsZXQgcCBpbiBvYmopIHtcbiAgICAgICAgICAgIG9ialtwXSA9IFV0aWxzLnN0cmluZ3NUb0Z1bmN0aW9ucyhvYmpbcF0sIHdyYXApO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBvYmo7XG59O1xuXG4vLyBDb252ZXJ0IHN0cmluZyBiYWNrIGludG8gYSBmdW5jdGlvblxuVXRpbHMuc3RyaW5nVG9GdW5jdGlvbiA9IGZ1bmN0aW9uKHZhbCwgd3JhcCkge1xuICAgIC8vIFBhcnNlIGZ1bmN0aW9uIHNpZ25hdHVyZSBhbmQgYm9keVxuICAgIGxldCBmbWF0Y2ggPVxuICAgICAgICAodHlwZW9mIHZhbCA9PT0gJ3N0cmluZycpICYmXG4gICAgICAgIHZhbC5tYXRjaCgvXlxccypmdW5jdGlvblteKF0qXFwoKFteKV0qKVxcKVxccyo/XFx7KFtcXHNcXFNdKilcXH0kL20pO1xuXG4gICAgaWYgKGZtYXRjaCAmJiBmbWF0Y2gubGVuZ3RoID4gMikge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgbGV0IHNyYyA9IGZtYXRjaFsyXTtcbiAgICAgICAgICAgIGxldCBhcmdzID0gZm1hdGNoWzFdLmxlbmd0aCA+IDAgJiYgZm1hdGNoWzFdLnNwbGl0KCcsJykubWFwKHggPT4geC50cmltKCkpLmZpbHRlcih4ID0+IHgpO1xuICAgICAgICAgICAgYXJncyA9IGFyZ3MubGVuZ3RoID4gMCA/IGFyZ3MgOiBbJ2NvbnRleHQnXTsgLy8gZGVmYXVsdCB0byBzaW5nbGUgJ2NvbnRleHQnIGFyZ3VtZW50XG5cbiAgICAgICAgICAgIGlmICh0eXBlb2Ygd3JhcCA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgICAgIHJldHVybiBuZXcgRnVuY3Rpb24oLi4uYXJncywgd3JhcChzcmMpKTsgLy8ganNoaW50IGlnbm9yZTpsaW5lXG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gbmV3IEZ1bmN0aW9uKC4uLmFyZ3MsIHNyYyk7IC8vIGpzaGludCBpZ25vcmU6bGluZVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIGNhdGNoIChlKSB7XG4gICAgICAgICAgICAvLyBmYWxsLWJhY2sgdG8gb3JpZ2luYWwgdmFsdWUgaWYgcGFyc2luZyBmYWlsZWRcbiAgICAgICAgICAgIHJldHVybiB2YWw7XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHZhbDtcbn07XG5cbi8vIERlZmF1bHQgdG8gYWxsb3dpbmcgaGlnaCBwaXhlbCBkZW5zaXR5XG4vLyBSZXR1cm5zIHRydWUgaWYgZGlzcGxheSBkZW5zaXR5IGNoYW5nZWRcblV0aWxzLnVzZV9oaWdoX2RlbnNpdHlfZGlzcGxheSA9IHRydWU7XG5VdGlscy51cGRhdGVEZXZpY2VQaXhlbFJhdGlvID0gZnVuY3Rpb24gKCkge1xuICAgIGxldCBwcmV2ID0gVXRpbHMuZGV2aWNlX3BpeGVsX3JhdGlvO1xuICAgIFV0aWxzLmRldmljZV9waXhlbF9yYXRpbyA9IChVdGlscy51c2VfaGlnaF9kZW5zaXR5X2Rpc3BsYXkgJiYgd2luZG93LmRldmljZVBpeGVsUmF0aW8pIHx8IDE7XG4gICAgcmV0dXJuIFV0aWxzLmRldmljZV9waXhlbF9yYXRpbyAhPT0gcHJldjtcbn07XG5cbmlmIChUaHJlYWQuaXNfbWFpbikge1xuICAgIFV0aWxzLnVwZGF0ZURldmljZVBpeGVsUmF0aW8oKTtcbn1cblxuLy8gVXNlZCBmb3IgZGlmZmVyZW50aWF0aW5nIGJldHdlZW4gcG93ZXItb2YtMiBhbmQgbm9uLXBvd2VyLW9mLTIgdGV4dHVyZXNcbi8vIFZpYTogaHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy8xOTcyMjI0Ny93ZWJnbC13YWl0LWZvci10ZXh0dXJlLXRvLWxvYWRcblV0aWxzLmlzUG93ZXJPZjIgPSBmdW5jdGlvbih2YWx1ZSkge1xuICAgIHJldHVybiAodmFsdWUgJiAodmFsdWUgLSAxKSkgPT09IDA7XG59O1xuXG4vLyBJbnRlcnBvbGF0ZSAneCcgYWxvbmcgYSBzZXJpZXMgb2YgY29udHJvbCBwb2ludHNcbi8vICdwb2ludHMnIGlzIGFuIGFycmF5IG9mIGNvbnRyb2wgcG9pbnRzIGluIHRoZSBmb3JtIFt4LCB5XVxuLy9cbi8vIEV4YW1wbGU6XG4vLyAgICAgQ29udHJvbCBwb2ludHM6XG4vLyAgICAgICAgIFswLCA1XTogIHdoZW4geD0wLCB5PTVcbi8vICAgICAgICAgWzQsIDEwXTogd2hlbiB4PTQsIHk9MTBcbi8vXG4vLyAgICAgVXRpbHMuaW50ZXJwb2xhdGUoMiwgW1swLCA1XSwgWzQsIDEwXV0pO1xuLy8gICAgIC0+IGNvbXB1dGVzIHg9MiwgaGFsZndheSBiZXR3ZWVuIHg9MCBhbmQgeD00OiAoMTAgLSA1KSAvIDIgKzVcbi8vICAgICAtPiByZXR1cm5zIDcuNVxuLy9cbi8vIFRPRE86IGFkZCBvdGhlciBpbnRlcnBvbGF0aW9uIG1ldGhvZHMgYmVzaWRlcyBsaW5lYXJcbi8vXG5VdGlscy5pbnRlcnBvbGF0ZSA9IGZ1bmN0aW9uKHgsIHBvaW50cywgdHJhbnNmb3JtKSB7XG4gICAgLy8gSWYgdGhpcyBkb2Vzbid0IHJlc2VtYmxlIGEgbGlzdCBvZiBjb250cm9sIHBvaW50cywganVzdCByZXR1cm4gdGhlIG9yaWdpbmFsIHZhbHVlXG4gICAgaWYgKCFBcnJheS5pc0FycmF5KHBvaW50cykgfHwgIUFycmF5LmlzQXJyYXkocG9pbnRzWzBdKSkge1xuICAgICAgICByZXR1cm4gcG9pbnRzO1xuICAgIH1cbiAgICBlbHNlIGlmIChwb2ludHMubGVuZ3RoIDwgMSkge1xuICAgICAgICByZXR1cm4gcG9pbnRzO1xuICAgIH1cblxuICAgIHZhciB4MSwgeDIsIGQsIHksIHkxLCB5MjtcblxuICAgIC8vIE1pbiBib3VuZHNcbiAgICBpZiAoeCA8PSBwb2ludHNbMF1bMF0pIHtcbiAgICAgICAgeSA9IHBvaW50c1swXVsxXTtcbiAgICAgICAgaWYgKHR5cGVvZiB0cmFuc2Zvcm0gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgIHkgPSB0cmFuc2Zvcm0oeSk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgLy8gTWF4IGJvdW5kc1xuICAgIGVsc2UgaWYgKHggPj0gcG9pbnRzW3BvaW50cy5sZW5ndGgtMV1bMF0pIHtcbiAgICAgICAgeSA9IHBvaW50c1twb2ludHMubGVuZ3RoLTFdWzFdO1xuICAgICAgICBpZiAodHlwZW9mIHRyYW5zZm9ybSA9PT0gJ2Z1bmN0aW9uJykge1xuICAgICAgICAgICAgeSA9IHRyYW5zZm9ybSh5KTtcbiAgICAgICAgfVxuICAgIH1cbiAgICAvLyBGaW5kIHdoaWNoIGNvbnRyb2wgcG9pbnRzIHggaXMgYmV0d2VlblxuICAgIGVsc2Uge1xuICAgICAgICBmb3IgKHZhciBpPTA7IGkgPCBwb2ludHMubGVuZ3RoIC0gMTsgaSsrKSB7XG4gICAgICAgICAgICBpZiAoeCA+PSBwb2ludHNbaV1bMF0gJiYgeCA8IHBvaW50c1tpKzFdWzBdKSB7XG4gICAgICAgICAgICAgICAgLy8gTGluZWFyIGludGVycG9sYXRpb25cbiAgICAgICAgICAgICAgICB4MSA9IHBvaW50c1tpXVswXTtcbiAgICAgICAgICAgICAgICB4MiA9IHBvaW50c1tpKzFdWzBdO1xuXG4gICAgICAgICAgICAgICAgLy8gTXVsdGlwbGUgdmFsdWVzXG4gICAgICAgICAgICAgICAgaWYgKEFycmF5LmlzQXJyYXkocG9pbnRzW2ldWzFdKSkge1xuICAgICAgICAgICAgICAgICAgICB5ID0gW107XG4gICAgICAgICAgICAgICAgICAgIGZvciAodmFyIGM9MDsgYyA8IHBvaW50c1tpXVsxXS5sZW5ndGg7IGMrKykge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiB0cmFuc2Zvcm0gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB5MSA9IHRyYW5zZm9ybShwb2ludHNbaV1bMV1bY10pO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHkyID0gdHJhbnNmb3JtKHBvaW50c1tpKzFdWzFdW2NdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkID0geTIgLSB5MTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB5W2NdID0gZCAqICh4IC0geDEpIC8gKHgyIC0geDEpICsgeTE7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkID0gcG9pbnRzW2krMV1bMV1bY10gLSBwb2ludHNbaV1bMV1bY107XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgeVtjXSA9IGQgKiAoeCAtIHgxKSAvICh4MiAtIHgxKSArIHBvaW50c1tpXVsxXVtjXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAvLyBTaW5nbGUgdmFsdWVcbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHR5cGVvZiB0cmFuc2Zvcm0gPT09ICdmdW5jdGlvbicpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHkxID0gdHJhbnNmb3JtKHBvaW50c1tpXVsxXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB5MiA9IHRyYW5zZm9ybShwb2ludHNbaSsxXVsxXSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBkID0geTIgLSB5MTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHkgPSBkICogKHggLSB4MSkgLyAoeDIgLSB4MSkgKyB5MTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGQgPSBwb2ludHNbaSsxXVsxXSAtIHBvaW50c1tpXVsxXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHkgPSBkICogKHggLSB4MSkgLyAoeDIgLSB4MSkgKyBwb2ludHNbaV1bMV07XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHk7XG59O1xuXG5VdGlscy50b0NTU0NvbG9yID0gZnVuY3Rpb24gKGNvbG9yKSB7XG4gICAgaWYgKGNvbG9yWzNdID09PSAxKSB7IC8vIGZ1bGwgb3BhY2l0eVxuICAgICAgICByZXR1cm4gYHJnYigke2NvbG9yLnNsaWNlKDAsIDMpLm1hcChjID0+IE1hdGgucm91bmQoYyAqIDI1NSkpLmpvaW4oJywgJyl9KWA7XG4gICAgfVxuICAgIC8vIFJHQiBpcyBiZXR3ZWVuIFswLCAyNTVdIG9wYWNpdHkgaXMgYmV0d2VlbiBbMCwgMV1cbiAgICByZXR1cm4gYHJnYmEoJHtjb2xvci5tYXAoKGMsIGkpID0+IChpIDwgMyAmJiBNYXRoLnJvdW5kKGMgKiAyNTUpKSB8fCBjKS5qb2luKCcsICcpfSlgO1xufTtcblxuVXRpbHMucG9pbnRJblRpbGUgPSBmdW5jdGlvbiAocG9pbnQpIHtcbiAgICByZXR1cm4gcG9pbnRbMF0gPj0gMCAmJsKgcG9pbnRbMV0gPiAtR2VvLnRpbGVfc2NhbGUgJiYgcG9pbnRbMF0gPCBHZW8udGlsZV9zY2FsZSAmJiBwb2ludFsxXSA8PSAwO1xufTtcbiIsImxldCBmcyA9IHJlcXVpcmUoJ2ZzJyk7XG5sZXQgcGtnID0gSlNPTi5wYXJzZShmcy5yZWFkRmlsZVN5bmMoX19kaXJuYW1lICsgJy8uLi8uLi9wYWNrYWdlLmpzb24nLCAndXRmOCcpKTtcbmxldCB2ZXJzaW9uO1xuZXhwb3J0IGRlZmF1bHQgdmVyc2lvbiA9ICd2JyArIHBrZy52ZXJzaW9uO1xuIiwiLypqc2hpbnQgd29ya2VyOiB0cnVlKi9cblxuLy8gV29ya2VyQnJva2VyIHJvdXRlcyBtZXNzYWdlcyBiZXR3ZWVuIHdlYiB3b3JrZXJzIGFuZCB0aGUgbWFpbiB0aHJlYWQsIGFsbG93aW5nIGZvciBzaW1wbGVyXG4vLyBhc3luYyBjb2RlIHZpYSBwcm9taXNlcy4gRXhhbXBsZSB1c2FnZTpcbi8vXG4vLyBJbiB3ZWIgd29ya2VyLCByZWdpc3RlciBzZWxmIGFzIGEgY2FsbGFibGUgXCJ0YXJnZXRcIiwgYW5kIGRlZmluZSBhIG1ldGhvZDpcbi8vXG4vLyAgICAgV29ya2VyQnJva2VyLmFkZFRhcmdldCgnc2VsZicsIHNlbGYpO1xuLy9cbi8vICAgICBzZWxmLnNxdWFyZSA9IGZ1bmN0aW9uICh4KSB7XG4vLyAgICAgICAgIHJldHVybiB4ICogeDtcbi8vICAgICB9O1xuLy9cbi8vIEluIG1haW4gdGhyZWFkLCBpbnZva2UgdGhhdCBtZXRob2QgYW5kIHJlY2VpdmUgdGhlIHJlc3VsdCAoaWYgYW55KSBhcyBhIHByb21pc2UuXG4vL1xuLy8gICAgIHdvcmtlciA9IG5ldyBXb3JrZXIoLi4uKTtcbi8vICAgICBXb3JrZXJCcm9rZXIuYWRkV29ya2VyKHdvcmtlcik7XG4vL1xuLy8gICAgIFdvcmtlckJyb2tlci5wb3N0TWVzc2FnZSh3b3JrZXIsICdzZWxmLnNxdWFyZScsIDUpLnRoZW4oZnVuY3Rpb24oeSkge1xuLy8gICAgICAgICBjb25zb2xlLmxvZyh5KTtcbi8vICAgICB9KTtcbi8vXG4vLyAgICAgLT4gcHJpbnRzIDI1XG4vL1xuLy8gQXN5bmMgY29kZTpcbi8vXG4vLyBGb3Igc3luY2hyb25vdXMgY29kZSB0aGF0IG11c3QgcGFzcyBhIHJldHVybiB2YWx1ZSB0byB0aGUgbWFpbiB0aHJlYWQsIHRoZSBmdW5jdGlvbiBjYW4gc2ltcGx5XG4vLyByZXR1cm4gYW4gaW1tZWRpYXRlIHZhbHVlIChzZWUgZXhhbXBsZSBhYm92ZSkuIEZvciBjYXNlcyB3aGVyZSB0aGUgd29ya2VyIG1ldGhvZCBuZWVkcyB0byBydW5cbi8vIGFzeW5jaHJvbm91cyBjb2RlLCB0aGUgZnVuY3Rpb24gY2FuIHJldHVybiBhIHByb21pc2UsIGFuZCB0aGUgcmVzb2x2ZWQgb3IgcmVqZWN0ZWQgdmFsdWUgd2lsbFxuLy8gYmUgc2VudCBiYWNrIHRvIHRoZSBtYWluIHRocmVhZCB3aGVuIHRoZSBwcm9taXNlIGlzIGZ1bGZpbGxlZC5cbi8vXG4vLyBFcnJvciBoYW5kbGluZzpcbi8vXG4vLyBJZiB0aGUgd29ya2VyIG1ldGhvZCBlaXRoZXIgdGhyb3dzIGFuIGVycm9yLCBvciByZXR1cm5zIGEgcHJvbWlzZSB0aGF0IGlzIHJlamVjdGVkLCBpdCB3aWxsIGJlXG4vLyBzZW50IGJhY2sgdG8gdGhlIG1haW4gdGhyZWFkIGFzIGEgcHJvbWlzZSByZWplY3Rpb24uIFRoZXNlIHR3byBleGFtcGxlcyBhcmUgZXF1aXZhbGVudDpcbi8vXG4vLyAgICAgSW4gd29ya2VyLCB0aHJvd2luZyBhbiBlcnJvcjpcbi8vXG4vLyAgICAgICAgIHNlbGYuYnJva2VuID0gZnVuY3Rpb24gKCkge1xuLy8gICAgICAgICAgICAgdGhyb3cgbmV3IEVycm9yKCdlcnJvciBpbiB3b3JrZXIhJyk7XG4vLyAgICAgICAgIH07XG4vL1xuLy8gICAgIEluIHdvcmtlciwgcmV0dXJuaW5nIGEgcmVqZWN0ZWQgcHJvbWlzZTpcbi8vXG4vLyAgICAgICAgIHNlbGYuYnJva2VuID0gZnVuY3Rpb24gKCkge1xuLy8gICAgICAgICAgICAgcmV0dXJuIFByb21pc2UucmVqZWN0KG5ldyBFcnJvcignZXJyb3IgaW4gd29ya2VyIScpKTtcbi8vICAgICAgICAgfTtcbi8vXG4vLyAgICAgSW4gbWFpbiB0aHJlYWQsIGJvdGggZXJyb3JzIGFyZSByZWNlaXZlZCBhcyBhIHByb21pc2UgcmVqZWN0aW9uOlxuLy9cbi8vICAgICAgICAgV29ya2VyQnJva2VyLnBvc3RNZXNzYWdlKHdvcmtlciwgJ3NlbGYuYnJva2VuJykudGhlbihcbi8vICAgICAgICAgICAgIC8vIFByb21pc2UgcmVzb2x2ZWRcbi8vICAgICAgICAgICAgIGZ1bmN0aW9uKCkge1xuLy8gICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCdzdWNjZXNzIScpO1xuLy8gICAgICAgICAgICAgfSxcbi8vICAgICAgICAgICAgIC8vIFByb21pc2UgcmVqZWN0ZWRcbi8vICAgICAgICAgICAgIGZ1bmN0aW9uKGVycm9yKSB7XG4vLyAgICAgICAgICAgICAgICAgY29uc29sZS5sb2coJ2Vycm9yIScsIGVycm9yKTtcbi8vICAgICAgICAgICAgIH0pO1xuLy9cbi8vICAgICAgICAgLT4gcHJpbnRzICdlcnJvciEgZXJyb3IgaW4gd29ya2VyJ1xuLy9cbi8vIENhbGxpbmcgZnJvbSB3b3JrZXIgdG8gbWFpbiB0aHJlYWQ6XG4vL1xuLy8gVGhlIHNhbWUgc3R5bGUgb2YgY2FsbHMgY2FuIGJlIG1hZGUgKmZyb20qIGEgd2ViIHdvcmtlciwgdG8gdGhlIG1haW4gdGhyZWFkLiBUaGUgQVBJIGlzIHRoZSBzYW1lXG4vLyB3aXRoIHRoZSBleGNlcHRpb24gdGhhdCB0aGUgZmlyc3QgYXJndW1lbnQsICd3b3JrZXInLCBpcyBub3QgbmVlZGVkIGZvciBXb3JrZXJCcm9rZXIucG9zdE1lc3NhZ2UoKSxcbi8vIHNpbmNlIHRoZSBtYWluIHRocmVhZCBpcyB0aGUgaW1wbGljaXQgdGFyZ2V0LlxuLy9cbi8vIEluIG1haW4gdGhyZWFkLCBkZWZpbmUgYSBtZXRob2QgYW5kIHJlZ2lzdGVyIGl0OlxuLy9cbi8vICAgICB2YXIgZ2VvbWV0cnkgPSB7XG4vLyAgICAgICAgIGxlbmd0aDogZnVuY3Rpb24oeCwgeSkge1xuLy8gICAgICAgICAgICAgcmV0dXJuIE1hdGguc3FydCh4ICogeCArIHkgKiB5KTtcbi8vICAgICAgICAgfVxuLy8gICAgIH07XG4vL1xuLy8gICAgIFdvcmtlckJyb2tlci5hZGRUYXJnZXQoJ2dlb21ldHJ5JywgZ2VvbWV0cnkpO1xuLy9cbi8vIEluIHdvcmtlciB0aHJlYWQpOlxuLy9cbi8vICAgICBXb3JrZXJCcm9rZXIucG9zdE1lc3NhZ2UoJ2dlb21ldHJ5Lmxlbmd0aCcsIDMsIDQpLnRoZW4oZnVuY3Rpb24oZCkge1xuLy8gICAgICAgICBjb25zb2xlLmxvZyhkKTtcbi8vICAgICB9KTtcbi8vXG4vLyAgICAgLT4gcHJpbnRzIDVcbi8vXG5cbmltcG9ydCBUaHJlYWQgZnJvbSAnLi90aHJlYWQnO1xuaW1wb3J0IGxvZyBmcm9tICcuL2xvZyc7XG5cbnZhciBXb3JrZXJCcm9rZXI7XG5leHBvcnQgZGVmYXVsdCBXb3JrZXJCcm9rZXIgPSB7fTtcblxuLy8gR2xvYmFsIGxpc3Qgb2YgYWxsIHdvcmtlciBtZXNzYWdlc1xuLy8gVW5pcXVlbHkgdHJhY2tzIGV2ZXJ5IGNhbGwgbWFkZSBiZXR3ZWVuIG1haW4gdGhyZWFkIGFuZCBhIHdvcmtlclxudmFyIG1lc3NhZ2VfaWQgPSAwO1xudmFyIG1lc3NhZ2VzID0ge307XG5cbi8vIFJlZ2lzdGVyIGFuIG9iamVjdCB0byByZWNlaXZlIGNhbGxzIGZyb20gb3RoZXIgdGhyZWFkXG52YXIgdGFyZ2V0cyA9IHt9O1xuV29ya2VyQnJva2VyLmFkZFRhcmdldCA9IGZ1bmN0aW9uIChuYW1lLCB0YXJnZXQpIHtcbiAgICB0YXJnZXRzW25hbWVdID0gdGFyZ2V0O1xufTtcblxuLy8gR2l2ZW4gYSBkb3Qtbm90YXRpb24tc3R5bGUgbWV0aG9kIG5hbWUsIGUuZy4gJ09iamVjdC5vYmplY3QubWV0aG9kJyxcbi8vIGZpbmQgdGhlIG9iamVjdCB0byBjYWxsIHRoZSBtZXRob2Qgb24gZnJvbSB0aGUgbGlzdCBvZiByZWdpc3RlcmVkIHRhcmdldHNcbmZ1bmN0aW9uIGZpbmRUYXJnZXQgKG1ldGhvZCkge1xuICAgIHZhciBjaGFpbiA9IFtdO1xuICAgIGlmICh0eXBlb2YgbWV0aG9kID09PSAnc3RyaW5nJykge1xuICAgICAgICBjaGFpbiA9IG1ldGhvZC5zcGxpdCgnLicpO1xuICAgICAgICBtZXRob2QgPSBjaGFpbi5wb3AoKTtcbiAgICB9XG5cbiAgICB2YXIgdGFyZ2V0ID0gdGFyZ2V0cztcblxuICAgIGZvciAobGV0IG09MDsgbSA8IGNoYWluLmxlbmd0aDsgbSsrKSB7XG4gICAgICAgIGlmICh0YXJnZXRbY2hhaW5bbV1dKSB7XG4gICAgICAgICAgICB0YXJnZXQgPSB0YXJnZXRbY2hhaW5bbV1dO1xuICAgICAgICB9XG4gICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgcmV0dXJuIFttZXRob2QsIHRhcmdldF07XG59XG5cbi8vIE1haW4gdGhyZWFkOlxuLy8gLSBTZW5kIG1lc3NhZ2VzIHRvIHdvcmtlcnMsIGFuZCBvcHRpb25hbGx5IHJlY2VpdmUgYW4gYXN5bmMgcmVzcG9uc2UgYXMgYSBwcm9taXNlXG4vLyAtIFJlY2VpdmUgbWVzc2FnZXMgZnJvbSB3b3JrZXJzLCBhbmQgb3B0aW9uYWxseSBzZW5kIGFuIGFzeW5jIHJlc3BvbnNlIGJhY2sgYXMgYSBwcm9taXNlXG5mdW5jdGlvbiBzZXR1cE1haW5UaHJlYWQgKCkge1xuXG4gICAgLy8gU2VuZCBhIG1lc3NhZ2UgdG8gYSB3b3JrZXIsIGFuZCBvcHRpb25hbGx5IGdldCBhbiBhc3luYyByZXNwb25zZVxuICAgIC8vIEFyZ3VtZW50czpcbiAgICAvLyAgIC0gd29ya2VyOiBvbmUgb3IgbW9yZSB3ZWIgd29ya2VyIGluc3RhbmNlcyB0byBzZW5kIHRoZSBtZXNzYWdlIHRvIChzaW5nbGUgdmFsdWUgb3IgYXJyYXkpXG4gICAgLy8gICAtIG1ldGhvZDogdGhlIG1ldGhvZCB3aXRoIHRoaXMgbmFtZSwgc3BlY2lmaWVkIHdpdGggZG90LW5vdGF0aW9uLCB3aWxsIGJlIGludm9rZWQgaW4gdGhlIHdvcmtlclxuICAgIC8vICAgLSBtZXNzYWdlOiBzcHJlYWQgb2YgYXJndW1lbnRzIHRvIGNhbGwgdGhlIG1ldGhvZCB3aXRoXG4gICAgLy8gUmV0dXJuczpcbiAgICAvLyAgIC0gYSBwcm9taXNlIHRoYXQgd2lsbCBiZSBmdWxmaWxsZWQgaWYgdGhlIHdvcmtlciBtZXRob2QgcmV0dXJucyBhIHZhbHVlIChjb3VsZCBiZSBpbW1lZGlhdGVseSwgb3IgYXN5bmMpXG4gICAgLy9cbiAgICBXb3JrZXJCcm9rZXIucG9zdE1lc3NhZ2UgPSBmdW5jdGlvbiAod29ya2VyLCBtZXRob2QsIC4uLm1lc3NhZ2UpIHtcbiAgICAgICAgLy8gSWYgbW9yZSB0aGFuIG9uZSB3b3JrZXIgc3BlY2lmaWVkLCBwb3N0IHRvIG11bHRpcGxlXG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KHdvcmtlcikpIHtcbiAgICAgICAgICAgIHJldHVybiBQcm9taXNlLmFsbChcbiAgICAgICAgICAgICAgICB3b3JrZXIubWFwKHcgPT4gV29ya2VyQnJva2VyLnBvc3RNZXNzYWdlKHcsIG1ldGhvZCwgLi4ubWVzc2FnZSkpXG4gICAgICAgICAgICApO1xuICAgICAgICB9XG5cbiAgICAgICAgLy8gVHJhY2sgc3RhdGUgb2YgdGhpcyBtZXNzYWdlXG4gICAgICAgIHZhciBwcm9taXNlID0gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgICAgICAgbWVzc2FnZXNbbWVzc2FnZV9pZF0gPSB7IG1ldGhvZCwgbWVzc2FnZSwgcmVzb2x2ZSwgcmVqZWN0IH07XG4gICAgICAgIH0pO1xuXG5cbiAgICAgICAgbGV0IHBheWxvYWQsIHRyYW5zZmVyYWJsZXMgPSBbXTtcblxuICAgICAgICBpZiAobWVzc2FnZSAmJiBtZXNzYWdlLmxlbmd0aCA9PT0gMSAmJiBtZXNzYWdlWzBdIGluc3RhbmNlb2YgV29ya2VyQnJva2VyLndpdGhUcmFuc2ZlcmFibGVzKSB7XG4gICAgICAgICAgICB0cmFuc2ZlcmFibGVzID0gbWVzc2FnZVswXS50cmFuc2ZlcmFibGVzO1xuICAgICAgICAgICAgbWVzc2FnZSA9IG1lc3NhZ2VbMF0udmFsdWU7XG4gICAgICAgIH1cblxuICAgICAgICBwYXlsb2FkID0ge1xuICAgICAgICAgICAgdHlwZTogJ21haW5fc2VuZCcsICAgICAgLy8gbWFyayBtZXNzYWdlIGFzIG1ldGhvZCBpbnZvY2F0aW9uIGZyb20gbWFpbiB0aHJlYWRcbiAgICAgICAgICAgIG1lc3NhZ2VfaWQsICAgICAgICAgICAgIC8vIHVuaXF1ZSBpZCBmb3IgdGhpcyBtZXNzYWdlLCBmb3IgbGlmZSBvZiBwcm9ncmFtXG4gICAgICAgICAgICBtZXRob2QsICAgICAgICAgICAgICAgICAvLyB3aWxsIGRpc3BhdGNoIHRvIGEgZnVuY3Rpb24gb2YgdGhpcyBuYW1lIHdpdGhpbiB0aGUgd29ya2VyXG4gICAgICAgICAgICBtZXNzYWdlICAgICAgICAgICAgICAgICAvLyBtZXNzYWdlIHBheWxvYWRcbiAgICAgICAgfTtcblxuICAgICAgICBwYXlsb2FkID0gbWF5YmVFbmNvZGUocGF5bG9hZCwgdHJhbnNmZXJhYmxlcyk7XG4gICAgICAgIHdvcmtlci5wb3N0TWVzc2FnZShwYXlsb2FkLCB0cmFuc2ZlcmFibGVzLm1hcCh0ID0+IHQub2JqZWN0KSk7XG4gICAgICAgIGZyZWVUcmFuc2ZlcmFibGVzKHRyYW5zZmVyYWJsZXMpO1xuICAgICAgICBpZiAodHJhbnNmZXJhYmxlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBsb2coJ3RyYWNlJywgYCcke21ldGhvZH0nIHRyYW5zZmVycmVkICR7dHJhbnNmZXJhYmxlcy5sZW5ndGh9IG9iamVjdHMgdG8gd29ya2VyIHRocmVhZGApO1xuICAgICAgICB9XG5cbiAgICAgICAgbWVzc2FnZV9pZCsrO1xuICAgICAgICByZXR1cm4gcHJvbWlzZTtcbiAgICB9O1xuXG4gICAgLy8gQWRkIGEgd29ya2VyIHRvIGNvbW11bmljYXRlIHdpdGggLSBlYWNoIHdvcmtlciBtdXN0IGJlIHJlZ2lzdGVyZWQgZnJvbSB0aGUgbWFpbiB0aHJlYWRcbiAgICBXb3JrZXJCcm9rZXIuYWRkV29ya2VyID0gZnVuY3Rpb24gKHdvcmtlcikge1xuICAgICAgICBpZiAoISh3b3JrZXIgaW5zdGFuY2VvZiBXb3JrZXIpKSB7XG4gICAgICAgICAgICB0aHJvdyBFcnJvcihgV29ya2VyIGJyb2tlciBjb3VsZCBub3QgYWRkIG5vbi1Xb3JrZXIgb2JqZWN0YCwgd29ya2VyKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHdvcmtlci5hZGRFdmVudExpc3RlbmVyKCdtZXNzYWdlJywgZnVuY3Rpb24gV29ya2VyQnJva2VyTWFpblRocmVhZEhhbmRsZXIoZXZlbnQpIHtcbiAgICAgICAgICAgIGxldCBkYXRhID0gbWF5YmVEZWNvZGUoZXZlbnQuZGF0YSk7XG4gICAgICAgICAgICBsZXQgaWQgPSBkYXRhLm1lc3NhZ2VfaWQ7XG5cbiAgICAgICAgICAgIC8vIExpc3RlbiBmb3IgbWVzc2FnZXMgY29taW5nIGJhY2sgZnJvbSB0aGUgd29ya2VyLCBhbmQgZnVsZmlsbCB0aGF0IG1lc3NhZ2UncyBwcm9taXNlXG4gICAgICAgICAgICBpZiAoZGF0YS50eXBlID09PSAnd29ya2VyX3JlcGx5Jykge1xuICAgICAgICAgICAgICAgIC8vIFBhc3MgdGhlIHJlc3VsdCB0byB0aGUgcHJvbWlzZVxuICAgICAgICAgICAgICAgIGlmIChtZXNzYWdlc1tpZF0pIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGRhdGEuZXJyb3IpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VzW2lkXS5yZWplY3QoZGF0YS5lcnJvcik7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlc1tpZF0ucmVzb2x2ZShkYXRhLm1lc3NhZ2UpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGRlbGV0ZSBtZXNzYWdlc1tpZF07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gTGlzdGVuIGZvciBtZXNzYWdlcyBpbml0aWF0aW5nIGEgY2FsbCBmcm9tIHRoZSB3b3JrZXIsIGRpc3BhdGNoIHRoZW0sXG4gICAgICAgICAgICAvLyBhbmQgc2VuZCBhbnkgcmV0dXJuIHZhbHVlIGJhY2sgdG8gdGhlIHdvcmtlclxuICAgICAgICAgICAgLy8gVW5pcXVlIGlkIGZvciB0aGlzIG1lc3NhZ2UgJiByZXR1cm4gY2FsbCB0byBtYWluIHRocmVhZFxuICAgICAgICAgICAgZWxzZSBpZiAoZGF0YS50eXBlID09PSAnd29ya2VyX3NlbmQnICYmIGlkICE9IG51bGwpIHtcbiAgICAgICAgICAgICAgICAvLyBDYWxsIHRoZSByZXF1ZXN0ZWQgbWV0aG9kIGFuZCBzYXZlIHRoZSByZXR1cm4gdmFsdWVcbiAgICAgICAgICAgICAgICB2YXIgW21ldGhvZF9uYW1lLCB0YXJnZXRdID0gZmluZFRhcmdldChkYXRhLm1ldGhvZCk7XG4gICAgICAgICAgICAgICAgaWYgKCF0YXJnZXQpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgRXJyb3IoYFdvcmtlciBicm9rZXIgY291bGQgbm90IGRpc3BhdGNoIG1lc3NhZ2UgdHlwZSAke2RhdGEubWV0aG9kfSBvbiB0YXJnZXQgJHtkYXRhLnRhcmdldH0gYmVjYXVzZSBubyBvYmplY3Qgd2l0aCB0aGF0IG5hbWUgaXMgcmVnaXN0ZXJlZCBvbiBtYWluIHRocmVhZGApO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHZhciBtZXRob2QgPSAodHlwZW9mIHRhcmdldFttZXRob2RfbmFtZV0gPT09ICdmdW5jdGlvbicpICYmIHRhcmdldFttZXRob2RfbmFtZV07XG4gICAgICAgICAgICAgICAgaWYgKCFtZXRob2QpIHtcbiAgICAgICAgICAgICAgICAgICAgdGhyb3cgRXJyb3IoYFdvcmtlciBicm9rZXIgY291bGQgbm90IGRpc3BhdGNoIG1lc3NhZ2UgdHlwZSAke2RhdGEubWV0aG9kfSBvbiB0YXJnZXQgJHtkYXRhLnRhcmdldH0gYmVjYXVzZSBvYmplY3QgaGFzIG5vIG1ldGhvZCB3aXRoIHRoYXQgbmFtZWApO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIHZhciByZXN1bHQsIGVycm9yO1xuICAgICAgICAgICAgICAgIHRyeSB7XG4gICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IG1ldGhvZC5hcHBseSh0YXJnZXQsIGRhdGEubWVzc2FnZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGNhdGNoKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gVGhyb3duIGVycm9ycyB3aWxsIGJlIHBhc3NlZCBiYWNrIChpbiBzdHJpbmcgZm9ybSkgdG8gd29ya2VyXG4gICAgICAgICAgICAgICAgICAgIGVycm9yID0gZTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAvLyBTZW5kIHJldHVybiB2YWx1ZSB0byB3b3JrZXJcbiAgICAgICAgICAgICAgICBsZXQgcGF5bG9hZCwgdHJhbnNmZXJhYmxlcyA9IFtdO1xuXG4gICAgICAgICAgICAgICAgLy8gQXN5bmMgcmVzdWx0XG4gICAgICAgICAgICAgICAgaWYgKHJlc3VsdCBpbnN0YW5jZW9mIFByb21pc2UpIHtcbiAgICAgICAgICAgICAgICAgICAgcmVzdWx0LnRoZW4oKHZhbHVlKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBXb3JrZXJCcm9rZXIud2l0aFRyYW5zZmVyYWJsZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFuc2ZlcmFibGVzID0gdmFsdWUudHJhbnNmZXJhYmxlcztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IHZhbHVlLnZhbHVlWzBdO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICBwYXlsb2FkID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdtYWluX3JlcGx5JyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlX2lkOiBpZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiB2YWx1ZVxuICAgICAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHBheWxvYWQgPSBtYXliZUVuY29kZShwYXlsb2FkLCB0cmFuc2ZlcmFibGVzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIHdvcmtlci5wb3N0TWVzc2FnZShwYXlsb2FkLCB0cmFuc2ZlcmFibGVzLm1hcCh0ID0+IHQub2JqZWN0KSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBmcmVlVHJhbnNmZXJhYmxlcyh0cmFuc2ZlcmFibGVzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0cmFuc2ZlcmFibGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2coJ3RyYWNlJywgYCcke21ldGhvZF9uYW1lfScgdHJhbnNmZXJyZWQgJHt0cmFuc2ZlcmFibGVzLmxlbmd0aH0gb2JqZWN0cyB0byB3b3JrZXIgdGhyZWFkYCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgfSwgKGVycm9yKSA9PiB7XG4gICAgICAgICAgICAgICAgICAgICAgICB3b3JrZXIucG9zdE1lc3NhZ2Uoe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdtYWluX3JlcGx5JyxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlX2lkOiBpZCxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcjogKGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBgJHtlcnJvci5tZXNzYWdlfTogJHtlcnJvci5zdGFja31gIDogZXJyb3IpXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIC8vIEltbWVkaWF0ZSByZXN1bHRcbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHJlc3VsdCBpbnN0YW5jZW9mIFdvcmtlckJyb2tlci53aXRoVHJhbnNmZXJhYmxlcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgdHJhbnNmZXJhYmxlcyA9IHJlc3VsdC50cmFuc2ZlcmFibGVzO1xuICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0LnZhbHVlWzBdO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgcGF5bG9hZCA9IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHR5cGU6ICdtYWluX3JlcGx5JyxcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VfaWQ6IGlkLFxuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogcmVzdWx0LFxuICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3I6IChlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gYCR7ZXJyb3IubWVzc2FnZX06ICR7ZXJyb3Iuc3RhY2t9YCA6IGVycm9yKVxuICAgICAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgICAgICBwYXlsb2FkID0gbWF5YmVFbmNvZGUocGF5bG9hZCwgdHJhbnNmZXJhYmxlcyk7XG4gICAgICAgICAgICAgICAgICAgIHdvcmtlci5wb3N0TWVzc2FnZShwYXlsb2FkLCB0cmFuc2ZlcmFibGVzLm1hcCh0ID0+IHQub2JqZWN0KSk7XG4gICAgICAgICAgICAgICAgICAgIGZyZWVUcmFuc2ZlcmFibGVzKHRyYW5zZmVyYWJsZXMpO1xuICAgICAgICAgICAgICAgICAgICBpZiAodHJhbnNmZXJhYmxlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBsb2coJ3RyYWNlJywgYCcke21ldGhvZF9uYW1lfScgdHJhbnNmZXJyZWQgJHt0cmFuc2ZlcmFibGVzLmxlbmd0aH0gb2JqZWN0cyB0byB3b3JrZXIgdGhyZWFkYCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgfTtcblxuICAgIC8vIEV4cG9zZSBmb3IgZGVidWdnaW5nXG4gICAgV29ya2VyQnJva2VyLmdldE1lc3NhZ2VzID0gZnVuY3Rpb24gKCkge1xuICAgICAgICByZXR1cm4gbWVzc2FnZXM7XG4gICAgfTtcblxuICAgIFdvcmtlckJyb2tlci5nZXRNZXNzYWdlSWQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiBtZXNzYWdlX2lkO1xuICAgIH07XG5cbn1cblxuLy8gV29ya2VyIHRocmVhZHM6XG4vLyAtIFJlY2VpdmUgbWVzc2FnZXMgZnJvbSBtYWluIHRocmVhZCwgYW5kIG9wdGlvbmFsbHkgc2VuZCBhbiBhc3luYyByZXNwb25zZSBiYWNrIGFzIGEgcHJvbWlzZVxuLy8gLSBTZW5kIG1lc3NhZ2VzIHRvIG1haW4gdGhyZWFkLCBhbmQgb3B0aW9uYWxseSByZWNlaXZlIGFuIGFzeW5jIHJlc3BvbnNlIGFzIGEgcHJvbWlzZVxuZnVuY3Rpb24gc2V0dXBXb3JrZXJUaHJlYWQgKCkge1xuXG4gICAgLy8gU2VuZCBhIG1lc3NhZ2UgdG8gdGhlIG1haW4gdGhyZWFkLCBhbmQgb3B0aW9uYWxseSBnZXQgYW4gYXN5bmMgcmVzcG9uc2UgYXMgYSBwcm9taXNlXG4gICAgLy8gQXJndW1lbnRzOlxuICAgIC8vICAgLSBtZXRob2Q6IHRoZSBtZXRob2Qgd2l0aCB0aGlzIG5hbWUsIHNwZWNpZmllZCB3aXRoIGRvdC1ub3RhdGlvbiwgd2lsbCBiZSBpbnZva2VkIG9uIHRoZSBtYWluIHRocmVhZFxuICAgIC8vICAgLSBtZXNzYWdlOiBhcnJheSBvZiBhcmd1bWVudHMgdG8gY2FsbCB0aGUgbWV0aG9kIHdpdGhcbiAgICAvLyBSZXR1cm5zOlxuICAgIC8vICAgLSBhIHByb21pc2UgdGhhdCB3aWxsIGJlIGZ1bGZpbGxlZCBpZiB0aGUgbWFpbiB0aHJlYWQgbWV0aG9kIHJldHVybnMgYSB2YWx1ZSAoY291bGQgYmUgaW1tZWRpYXRlbHksIG9yIGFzeW5jKVxuICAgIC8vXG4gICAgV29ya2VyQnJva2VyLnBvc3RNZXNzYWdlID0gZnVuY3Rpb24gKG1ldGhvZCwgLi4ubWVzc2FnZSkge1xuICAgICAgICAvLyBUcmFjayBzdGF0ZSBvZiB0aGlzIG1lc3NhZ2VcbiAgICAgICAgdmFyIHByb21pc2UgPSBuZXcgUHJvbWlzZSgocmVzb2x2ZSwgcmVqZWN0KSA9PiB7XG4gICAgICAgICAgICBtZXNzYWdlc1ttZXNzYWdlX2lkXSA9IHsgbWV0aG9kLCBtZXNzYWdlLCByZXNvbHZlLCByZWplY3QgfTtcbiAgICAgICAgfSk7XG5cbiAgICAgICBsZXQgcGF5bG9hZCwgdHJhbnNmZXJhYmxlcyA9IFtdO1xuXG4gICAgICAgIGlmIChtZXNzYWdlICYmIG1lc3NhZ2UubGVuZ3RoID09PSAxICYmIG1lc3NhZ2VbMF0gaW5zdGFuY2VvZiBXb3JrZXJCcm9rZXIud2l0aFRyYW5zZmVyYWJsZXMpIHtcbiAgICAgICAgICAgIHRyYW5zZmVyYWJsZXMgPSBtZXNzYWdlWzBdLnRyYW5zZmVyYWJsZXM7XG4gICAgICAgICAgICBtZXNzYWdlID0gbWVzc2FnZVswXS52YWx1ZTtcbiAgICAgICAgfVxuXG4gICAgICAgIHBheWxvYWQgPSB7XG4gICAgICAgICAgICB0eXBlOiAnd29ya2VyX3NlbmQnLCAgICAvLyBtYXJrIG1lc3NhZ2UgYXMgbWV0aG9kIGludm9jYXRpb24gZnJvbSB3b3JrZXJcbiAgICAgICAgICAgIG1lc3NhZ2VfaWQsICAgICAgICAgICAgIC8vIHVuaXF1ZSBpZCBmb3IgdGhpcyBtZXNzYWdlLCBmb3IgbGlmZSBvZiBwcm9ncmFtXG4gICAgICAgICAgICBtZXRob2QsICAgICAgICAgICAgICAgICAvLyB3aWxsIGRpc3BhdGNoIHRvIGEgbWV0aG9kIG9mIHRoaXMgbmFtZSBvbiB0aGUgbWFpbiB0aHJlYWRcbiAgICAgICAgICAgIG1lc3NhZ2UgICAgICAgICAgICAgICAgIC8vIG1lc3NhZ2UgcGF5bG9hZFxuICAgICAgICB9O1xuXG4gICAgICAgIHBheWxvYWQgPSBtYXliZUVuY29kZShwYXlsb2FkLCB0cmFuc2ZlcmFibGVzKTtcbiAgICAgICAgc2VsZi5wb3N0TWVzc2FnZShwYXlsb2FkLCB0cmFuc2ZlcmFibGVzLm1hcCh0ID0+IHQub2JqZWN0KSk7XG4gICAgICAgIGZyZWVUcmFuc2ZlcmFibGVzKHRyYW5zZmVyYWJsZXMpO1xuICAgICAgICBpZiAodHJhbnNmZXJhYmxlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICBsb2coJ3RyYWNlJywgYCcke21ldGhvZH0nIHRyYW5zZmVycmVkICR7dHJhbnNmZXJhYmxlcy5sZW5ndGh9IG9iamVjdHMgdG8gbWFpbiB0aHJlYWRgKTtcbiAgICAgICAgfVxuXG4gICAgICAgIG1lc3NhZ2VfaWQrKztcbiAgICAgICAgcmV0dXJuIHByb21pc2U7XG4gICAgfTtcblxuICAgIHNlbGYuYWRkRXZlbnRMaXN0ZW5lcignbWVzc2FnZScsIGZ1bmN0aW9uIFdvcmtlckJyb2tlcldvcmtlclRocmVhZEhhbmRsZXIoZXZlbnQpIHtcbiAgICAgICAgbGV0IGRhdGEgPSBtYXliZURlY29kZShldmVudC5kYXRhKTtcbiAgICAgICAgbGV0IGlkID0gZGF0YS5tZXNzYWdlX2lkO1xuXG4gICAgICAgIC8vIExpc3RlbiBmb3IgbWVzc2FnZXMgY29taW5nIGJhY2sgZnJvbSB0aGUgbWFpbiB0aHJlYWQsIGFuZCBmdWxmaWxsIHRoYXQgbWVzc2FnZSdzIHByb21pc2VcbiAgICAgICAgaWYgKGRhdGEudHlwZSA9PT0gJ21haW5fcmVwbHknKSB7XG4gICAgICAgICAgICAvLyBQYXNzIHRoZSByZXN1bHQgdG8gdGhlIHByb21pc2VcbiAgICAgICAgICAgIGlmIChtZXNzYWdlc1tpZF0pIHtcbiAgICAgICAgICAgICAgICBpZiAoZGF0YS5lcnJvcikge1xuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlc1tpZF0ucmVqZWN0KGRhdGEuZXJyb3IpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgICAgICAgICAgbWVzc2FnZXNbaWRdLnJlc29sdmUoZGF0YS5tZXNzYWdlKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgZGVsZXRlIG1lc3NhZ2VzW2lkXTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgICAgICAvLyBSZWNlaXZlIG1lc3NhZ2VzIGZyb20gbWFpbiB0aHJlYWQsIGRpc3BhdGNoIHRoZW0sIGFuZCBzZW5kIGJhY2sgYSByZXBseVxuICAgICAgICAvLyBVbmlxdWUgaWQgZm9yIHRoaXMgbWVzc2FnZSAmIHJldHVybiBjYWxsIHRvIG1haW4gdGhyZWFkXG4gICAgICAgIGVsc2UgaWYgKGRhdGEudHlwZSA9PT0gJ21haW5fc2VuZCcgJiYgaWQgIT0gbnVsbCkge1xuICAgICAgICAgICAgLy8gQ2FsbCB0aGUgcmVxdWVzdGVkIHdvcmtlciBtZXRob2QgYW5kIHNhdmUgdGhlIHJldHVybiB2YWx1ZVxuICAgICAgICAgICAgdmFyIFttZXRob2RfbmFtZSwgdGFyZ2V0XSA9IGZpbmRUYXJnZXQoZGF0YS5tZXRob2QpO1xuICAgICAgICAgICAgaWYgKCF0YXJnZXQpIHtcbiAgICAgICAgICAgICAgICB0aHJvdyBFcnJvcihgV29ya2VyIGJyb2tlciBjb3VsZCBub3QgZGlzcGF0Y2ggbWVzc2FnZSB0eXBlICR7ZGF0YS5tZXRob2R9IG9uIHRhcmdldCAke2RhdGEudGFyZ2V0fSBiZWNhdXNlIG5vIG9iamVjdCB3aXRoIHRoYXQgbmFtZSBpcyByZWdpc3RlcmVkIG9uIG1haW4gdGhyZWFkYCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHZhciBtZXRob2QgPSAodHlwZW9mIHRhcmdldFttZXRob2RfbmFtZV0gPT09ICdmdW5jdGlvbicpICYmIHRhcmdldFttZXRob2RfbmFtZV07XG5cbiAgICAgICAgICAgIGlmICghbWV0aG9kKSB7XG4gICAgICAgICAgICAgICAgdGhyb3cgRXJyb3IoYFdvcmtlciBicm9rZXIgY291bGQgbm90IGRpc3BhdGNoIG1lc3NhZ2UgdHlwZSAke2RhdGEubWV0aG9kfSBiZWNhdXNlIHdvcmtlciBoYXMgbm8gbWV0aG9kIHdpdGggdGhhdCBuYW1lYCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHZhciByZXN1bHQsIGVycm9yO1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICByZXN1bHQgPSBtZXRob2QuYXBwbHkodGFyZ2V0LCBkYXRhLm1lc3NhZ2UpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgY2F0Y2goZSkge1xuICAgICAgICAgICAgICAgIC8vIFRocm93biBlcnJvcnMgd2lsbCBiZSBwYXNzZWQgYmFjayAoaW4gc3RyaW5nIGZvcm0pIHRvIG1haW4gdGhyZWFkXG4gICAgICAgICAgICAgICAgZXJyb3IgPSBlO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBTZW5kIHJldHVybiB2YWx1ZSB0byBtYWluIHRocmVhZFxuICAgICAgICAgICAgbGV0IHBheWxvYWQsIHRyYW5zZmVyYWJsZXMgPSBbXTtcblxuICAgICAgICAgICAgLy8gQXN5bmMgcmVzdWx0XG4gICAgICAgICAgICBpZiAocmVzdWx0IGluc3RhbmNlb2YgUHJvbWlzZSkge1xuICAgICAgICAgICAgICAgIHJlc3VsdC50aGVuKCh2YWx1ZSkgPT4ge1xuICAgICAgICAgICAgICAgICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBXb3JrZXJCcm9rZXIud2l0aFRyYW5zZmVyYWJsZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRyYW5zZmVyYWJsZXMgPSB2YWx1ZS50cmFuc2ZlcmFibGVzO1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZS52YWx1ZVswXTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIHBheWxvYWQgPSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAnd29ya2VyX3JlcGx5JyxcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VfaWQ6IGlkLFxuICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTogdmFsdWVcbiAgICAgICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICAgICAgcGF5bG9hZCA9IG1heWJlRW5jb2RlKHBheWxvYWQsIHRyYW5zZmVyYWJsZXMpO1xuICAgICAgICAgICAgICAgICAgICBzZWxmLnBvc3RNZXNzYWdlKHBheWxvYWQsIHRyYW5zZmVyYWJsZXMubWFwKHQgPT4gdC5vYmplY3QpKTtcbiAgICAgICAgICAgICAgICAgICAgZnJlZVRyYW5zZmVyYWJsZXModHJhbnNmZXJhYmxlcyk7XG4gICAgICAgICAgICAgICAgICAgIGlmICh0cmFuc2ZlcmFibGVzLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGxvZygndHJhY2UnLCBgJyR7bWV0aG9kX25hbWV9JyB0cmFuc2ZlcnJlZCAke3RyYW5zZmVyYWJsZXMubGVuZ3RofSBvYmplY3RzIHRvIG1haW4gdGhyZWFkYCk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9LCAoZXJyb3IpID0+IHtcbiAgICAgICAgICAgICAgICAgICAgc2VsZi5wb3N0TWVzc2FnZSh7XG4gICAgICAgICAgICAgICAgICAgICAgICB0eXBlOiAnd29ya2VyX3JlcGx5JyxcbiAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VfaWQ6IGlkLFxuICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3I6IChlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gYCR7ZXJyb3IubWVzc2FnZX06ICR7ZXJyb3Iuc3RhY2t9YCA6IGVycm9yKVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vIEltbWVkaWF0ZSByZXN1bHRcbiAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIGlmIChyZXN1bHQgaW5zdGFuY2VvZiBXb3JrZXJCcm9rZXIud2l0aFRyYW5zZmVyYWJsZXMpIHtcbiAgICAgICAgICAgICAgICAgICAgdHJhbnNmZXJhYmxlcyA9IHJlc3VsdC50cmFuc2ZlcmFibGVzO1xuICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSByZXN1bHQudmFsdWVbMF07XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgcGF5bG9hZCA9IHtcbiAgICAgICAgICAgICAgICAgICAgdHlwZTogJ3dvcmtlcl9yZXBseScsXG4gICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VfaWQ6IGlkLFxuICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOiByZXN1bHQsXG4gICAgICAgICAgICAgICAgICAgIGVycm9yOiAoZXJyb3IgaW5zdGFuY2VvZiBFcnJvciA/IGAke2Vycm9yLm1lc3NhZ2V9OiAke2Vycm9yLnN0YWNrfWAgOiBlcnJvcilcbiAgICAgICAgICAgICAgICB9O1xuICAgICAgICAgICAgICAgIHBheWxvYWQgPSBtYXliZUVuY29kZShwYXlsb2FkLCB0cmFuc2ZlcmFibGVzKTtcbiAgICAgICAgICAgICAgICBzZWxmLnBvc3RNZXNzYWdlKHBheWxvYWQsIHRyYW5zZmVyYWJsZXMubWFwKHQgPT4gdC5vYmplY3QpKTtcbiAgICAgICAgICAgICAgICBmcmVlVHJhbnNmZXJhYmxlcyh0cmFuc2ZlcmFibGVzKTtcbiAgICAgICAgICAgICAgICBpZiAodHJhbnNmZXJhYmxlcy5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgICAgIGxvZygndHJhY2UnLCBgJyR7bWV0aG9kX25hbWV9JyB0cmFuc2ZlcnJlZCAke3RyYW5zZmVyYWJsZXMubGVuZ3RofSBvYmplY3RzIHRvIG1haW4gdGhyZWFkYCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSk7XG5cbn1cblxuLy8gU3BlY2lhbCB2YWx1ZSB3cmFwcGVyLCB0byBpbmRpY2F0ZSB0aGF0IHdlIHdhbnQgdG8gZmluZCBhbmQgaW5jbHVkZSB0cmFuc2ZlcmFibGUgb2JqZWN0cyBpbiB0aGUgbWVzc2FnZVxuV29ya2VyQnJva2VyLndpdGhUcmFuc2ZlcmFibGVzID0gZnVuY3Rpb24gKC4uLnZhbHVlKSB7XG4gICAgaWYgKCEodGhpcyBpbnN0YW5jZW9mIFdvcmtlckJyb2tlci53aXRoVHJhbnNmZXJhYmxlcykpIHtcbiAgICAgICAgcmV0dXJuIG5ldyBXb3JrZXJCcm9rZXIud2l0aFRyYW5zZmVyYWJsZXMoLi4udmFsdWUpO1xuICAgIH1cblxuICAgIHRoaXMudmFsdWUgPSB2YWx1ZTtcbiAgICB0aGlzLnRyYW5zZmVyYWJsZXMgPSBmaW5kVHJhbnNmZXJhYmxlcyh0aGlzLnZhbHVlKTtcbn07XG5cbi8vIEJ1aWxkIGEgbGlzdCBvZiB0cmFuc2ZlcmFibGUgb2JqZWN0cyBmcm9tIGEgc291cmNlIG9iamVjdFxuLy8gUmV0dXJucyBhIGxpc3Qgb2YgaW5mbyBhYm91dCBlYWNoIHRyYW5zZmVyYWJsZTpcbi8vICAgLSBvYmplY3Q6IHRoZSBhY3R1YWwgdHJhbnNmZXJhYmxlIG9iamVjdFxuLy8gICAtIHBhcmVudDogdGhlIHBhcmVudCBvYmplY3QgdGhhdCB0aGUgdHJhbnNmZXJhYmxlIGlzIGEgcHJvcGVydHkgb2YgKGlmIGFueSlcbi8vICAgLSBwcm9wZXJ0eTogdGhlIHByb3BlcnR5IG5hbWUgb2YgdGhlIHRyYW5zZmVyYWJsZSBvbiB0aGUgcGFyZW50IG9iamVjdCAoaWYgYW55KVxuLy8gVE9ETzogYWRkIG9wdGlvbiBpbiBjYXNlIHlvdSBET04nVCB3YW50IHRvIHRyYW5zZmVyIG9iamVjdHNcbmZ1bmN0aW9uIGZpbmRUcmFuc2ZlcmFibGVzKHNvdXJjZSwgcGFyZW50ID0gbnVsbCwgcHJvcGVydHkgPSBudWxsLCBsaXN0ID0gW10pIHtcbiAgICBpZiAoIXNvdXJjZSkge1xuICAgICAgICAgcmV0dXJuIGxpc3Q7XG4gICAgfVxuXG4gICAgaWYgKEFycmF5LmlzQXJyYXkoc291cmNlKSkge1xuICAgICAgICAvLyBDaGVjayBlYWNoIGFycmF5IGVsZW1lbnRcbiAgICAgICAgc291cmNlLmZvckVhY2goKHgsIGkpID0+IGZpbmRUcmFuc2ZlcmFibGVzKHgsIHNvdXJjZSwgaSwgbGlzdCkpO1xuICAgIH1cbiAgICBlbHNlIGlmICh0eXBlb2Ygc291cmNlID09PSAnb2JqZWN0Jykge1xuICAgICAgICAvLyBJcyB0aGUgb2JqZWN0IGEgdHJhbnNmZXJhYmxlIGFycmF5IGJ1ZmZlcj9cbiAgICAgICAgaWYgKHNvdXJjZSBpbnN0YW5jZW9mIEFycmF5QnVmZmVyKSB7XG4gICAgICAgICAgICBsaXN0LnB1c2goeyBvYmplY3Q6IHNvdXJjZSwgcGFyZW50LCBwcm9wZXJ0eSB9KTtcbiAgICAgICAgfVxuICAgICAgICAvLyBPciBsb29rcyBsaWtlIGEgdHlwZWQgYXJyYXkgKGhhcyBhbiBhcnJheSBidWZmZXIgcHJvcGVydHkpP1xuICAgICAgICBlbHNlIGlmIChzb3VyY2UuYnVmZmVyIGluc3RhbmNlb2YgQXJyYXlCdWZmZXIpIHtcbiAgICAgICAgICAgIGxpc3QucHVzaCh7IG9iamVjdDogc291cmNlLmJ1ZmZlciwgcGFyZW50LCBwcm9wZXJ0eSB9KTtcbiAgICAgICAgfVxuICAgICAgICAvLyBPdGhlcndpc2UgY2hlY2sgZWFjaCBwcm9wZXJ0eVxuICAgICAgICBlbHNlIHtcbiAgICAgICAgICAgIGZvciAobGV0IHByb3AgaW4gc291cmNlKSB7XG4gICAgICAgICAgICAgICAgZmluZFRyYW5zZmVyYWJsZXMoc291cmNlW3Byb3BdLCBzb3VyY2UsIHByb3AsIGxpc3QpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBsaXN0O1xufVxuXG4vLyBSZW1vdmUgbmV1dGVyZWQgdHJhbnNmZXJhYmxlcyBmcm9tIHBhcmVudCBvYmplY3RzLCBhcyB0aGV5IHNob3VsZCBubyBsb25nZXIgYmUgYWNjZXNzZWQgYWZ0ZXIgdHJhbnNmZXJcbmZ1bmN0aW9uIGZyZWVUcmFuc2ZlcmFibGVzKHRyYW5zZmVyYWJsZXMpIHtcbiAgICBpZiAoIUFycmF5LmlzQXJyYXkodHJhbnNmZXJhYmxlcykpIHtcbiAgICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICB0cmFuc2ZlcmFibGVzLmZpbHRlcih0ID0+IHQucGFyZW50ICYmIHQucHJvcGVydHkpLmZvckVhY2godCA9PiBkZWxldGUgdC5wYXJlbnRbdC5wcm9wZXJ0eV0pO1xufVxuXG4vLyBNZXNzYWdlIHBheWxvYWQgY2FuIGJlIHN0cmluZ2lmaWVkIGZvciBmYXN0ZXIgdHJhbnNmZXIsIGlmIGl0IGRvZXMgbm90IGluY2x1ZGUgdHJhbnNmZXJhYmxlIG9iamVjdHNcbmZ1bmN0aW9uIG1heWJlRW5jb2RlIChwYXlsb2FkLCB0cmFuc2ZlcmFibGVzKSB7XG4gICAgaWYgKHRyYW5zZmVyYWJsZXMubGVuZ3RoID09PSAwKSB7XG4gICAgICAgIHBheWxvYWQgPSBKU09OLnN0cmluZ2lmeShwYXlsb2FkKTtcbiAgICB9XG4gICAgcmV0dXJuIHBheWxvYWQ7XG59XG5cbi8vIFBhcnNlIHN0cmluZ2lmaWVkIG1lc3NhZ2UgcGF5bG9hZFxuZnVuY3Rpb24gbWF5YmVEZWNvZGUgKGRhdGEpIHtcbiAgICByZXR1cm4gKHR5cGVvZiBkYXRhID09PSAnc3RyaW5nJyA/IEpTT04ucGFyc2UoZGF0YSkgOiBkYXRhKTtcbn1cblxuLy8gU2V0dXAgdGhpcyB0aHJlYWQgYXMgYXBwcm9wcmlhdGVcbmlmIChUaHJlYWQuaXNfbWFpbikge1xuICAgIHNldHVwTWFpblRocmVhZCgpO1xufVxuXG5pZiAoVGhyZWFkLmlzX3dvcmtlcikge1xuICAgIHNldHVwV29ya2VyVGhyZWFkKCk7XG59XG4iLCIvKioqIFZlY3RvciBmdW5jdGlvbnMgLSB2ZWN0b3JzIHByb3ZpZGVkIGFzIFt4LCB5LCB6XSBhcnJheXMgKioqL1xuXG52YXIgVmVjdG9yO1xuZXhwb3J0IGRlZmF1bHQgVmVjdG9yID0ge307XG5cblZlY3Rvci5zZXQgPSBmdW5jdGlvbiAodikge1xuICAgIHZhciBWID0gW107XG4gICAgdmFyIGxpbSA9IHYubGVuZ3RoO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGltOyBpKyspIHtcbiAgICAgICAgVltpXSA9IHZbaV07XG4gICAgfVxuICAgIHJldHVybiBWO1xufTtcblxuVmVjdG9yLm5lZyA9IGZ1bmN0aW9uICh2KSB7XG4gICAgdmFyIFYgPSBbXTtcbiAgICB2YXIgbGltID0gdi5sZW5ndGg7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsaW07IGkrKykge1xuICAgICAgICBWW2ldID0gdltpXSAqIC0xO1xuICAgIH1cbiAgICByZXR1cm4gVjtcbn07XG5cbi8vIEFkZGl0aW9uIG9mIHR3byB2ZWN0b3JzXG5WZWN0b3IuYWRkID0gZnVuY3Rpb24gKHYxLCB2Mikge1xuICAgIHZhciB2ID0gW107XG4gICAgdmFyIGxpbSA9IE1hdGgubWluKHYxLmxlbmd0aCx2Mi5sZW5ndGgpO1xuICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGltOyBpKyspIHtcbiAgICAgICAgdltpXSA9IHYxW2ldICsgdjJbaV07XG4gICAgfVxuICAgIHJldHVybiB2O1xufTtcblxuLy8gU3Vic3RyYWN0aW9uIG9mIHR3byB2ZWN0b3JzXG5WZWN0b3Iuc3ViID0gZnVuY3Rpb24gKHYxLCB2Mikge1xuICAgIHZhciB2ID0gW107XG4gICAgdmFyIGxpbSA9IE1hdGgubWluKHYxLmxlbmd0aCx2Mi5sZW5ndGgpO1xuXG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsaW07IGkrKykge1xuICAgICAgICB2W2ldID0gdjFbaV0gLSB2MltpXTtcbiAgICB9XG4gICAgcmV0dXJuIHY7XG59O1xuXG5WZWN0b3Iuc2lnbmVkX2FyZWEgPSBmdW5jdGlvbiAodjEsIHYyLCB2Mykge1xuICAgIHJldHVybiAodjJbMF0tdjFbMF0pKih2M1sxXS12MVsxXSkgLSAodjNbMF0tdjFbMF0pKih2MlsxXS12MVsxXSk7XG59O1xuXG4vLyBNdWx0aXBsaWNhdGlvbiBvZiB0d28gdmVjdG9yc1xuVmVjdG9yLm11bHQgPSBmdW5jdGlvbiAodjEsIHYyKSB7XG4gICAgdmFyIHYgPSBbXSxcbiAgICAgICAgbGVuID0gdjEubGVuZ3RoLFxuICAgICAgICBpO1xuXG4gICAgaWYgKHR5cGVvZiB2MiA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgLy8gTXVsaXRwbHkgYnkgc2NhbGFyXG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykge1xuICAgICAgICAgICAgdltpXSA9IHYxW2ldICogdjI7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZWxzZSB7XG4gICAgICAgIC8vIE11bHRpcGx5IHR3byB2ZWN0b3JzXG4gICAgICAgIGxlbiA9IE1hdGgubWluKHYxLmxlbmd0aCx2Mi5sZW5ndGgpO1xuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHtcbiAgICAgICAgICAgIHZbaV0gPSB2MVtpXSAqIHYyW2ldO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiB2O1xufTtcblxuLy8gRGl2aXNpb24gb2YgdHdvIHZlY3RvcnNcblZlY3Rvci5kaXYgPSBmdW5jdGlvbiAodjEsIHYyKSB7XG4gICAgdmFyIHYgPSBbXSxcbiAgICAgICAgaTtcbiAgICBpZih0eXBlb2YgdjIgPT09ICdudW1iZXInKXtcbiAgICAgICAgLy8gRGl2aWRlIGJ5IHNjYWxhclxuICAgICAgICBmb3IgKGkgPSAwOyBpIDwgdjEubGVuZ3RoOyBpKyspe1xuICAgICAgICAgICAgdltpXSA9IHYxW2ldIC8gdjI7XG4gICAgICAgIH1cbiAgICB9IGVsc2Uge1xuICAgICAgICAvLyBEaXZpZGUgdG8gdmVjdG9yc1xuICAgICAgICB2YXIgbGVuID0gTWF0aC5taW4odjEubGVuZ3RoLHYyLmxlbmd0aCk7XG4gICAgICAgIGZvciAoaSA9IDA7IGkgPCBsZW47IGkrKykge1xuICAgICAgICAgICAgdltpXSA9IHYxW2ldIC8gdjJbaV07XG4gICAgICAgIH1cbiAgICB9XG4gICAgcmV0dXJuIHY7XG59O1xuXG4vLyBHZXQgMkQgcGVycGVuZGljdWxhclxuVmVjdG9yLnBlcnAgPSBmdW5jdGlvbiAodjEsIHYyKSB7XG4gICAgcmV0dXJuIFsgdjJbMV0gLSB2MVsxXSxcbiAgICAgICAgICAgICB2MVswXSAtIHYyWzBdIF07XG59O1xuXG4vLyBHZXQgMkQgdmVjdG9yIHJvdGF0ZWRcblZlY3Rvci5yb3QgPSBmdW5jdGlvbiAodiwgYSkge1xuICAgIHZhciBjID0gTWF0aC5jb3MoYSk7XG4gICAgdmFyIHMgPSBNYXRoLnNpbihhKTtcbiAgICByZXR1cm4gW3ZbMF0gKiBjIC0gdlsxXSAqIHMsXG4gICAgICAgICAgICB2WzBdICogcyArIHZbMV0gKiBjXTtcbn07XG5cbi8vIEdldCAyRCBoZWFkaW5nIGFuZ2xlXG5WZWN0b3IuYW5nbGUgPSBmdW5jdGlvbiAoW3gsIHldKSB7XG4gICAgcmV0dXJuIE1hdGguYXRhbjIoeSx4KTtcbn07XG5cbi8vIEdldCBhbmdsZSBiZXR3ZWVuIHR3byB2ZWN0b3JzXG5WZWN0b3IuYW5nbGVCZXR3ZWVuID0gZnVuY3Rpb24oQSwgQil7XG4gICAgdmFyIGRlbHRhID0gVmVjdG9yLmRvdChBLCBCKTtcbiAgICBpZiAoZGVsdGEgPCAtMSkge1xuICAgICAgICBkZWx0YSA9IC0xO1xuICAgIH1cbiAgICByZXR1cm4gTWF0aC5hY29zKGRlbHRhKTtcbn07XG5cbi8vIENvbXBhcmUgdHdvIHBvaW50c1xuVmVjdG9yLmlzRXF1YWwgPSBmdW5jdGlvbiAodjEsIHYyKSB7XG4gICAgdmFyIGxlbiA9IHYxLmxlbmd0aDtcbiAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgaSsrKSB7XG4gICAgICAgIGlmICh2MVtpXSAhPT0gdjJbaV0pe1xuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiB0cnVlO1xufTtcblxuLy8gVmVjdG9yIGxlbmd0aCBzcXVhcmVkXG5WZWN0b3IubGVuZ3RoU3EgPSBmdW5jdGlvbiAodikge1xuICAgIGlmICh2Lmxlbmd0aCA9PT0gMikge1xuICAgICAgICByZXR1cm4gKHZbMF0qdlswXSArIHZbMV0qdlsxXSk7XG4gICAgfVxuICAgIGVsc2UgaWYgKHYubGVuZ3RoID49IDMpIHtcbiAgICAgICAgcmV0dXJuICh2WzBdKnZbMF0gKyB2WzFdKnZbMV0gKyB2WzJdKnZbMl0pO1xuICAgIH1cbiAgICByZXR1cm4gMDtcbn07XG5cbi8vIFZlY3RvciBsZW5ndGhcblZlY3Rvci5sZW5ndGggPSBmdW5jdGlvbiAodikge1xuICAgIHJldHVybiBNYXRoLnNxcnQoVmVjdG9yLmxlbmd0aFNxKHYpKTtcbn07XG5cbi8vIE5vcm1hbGl6ZSBhIHZlY3RvclxuVmVjdG9yLm5vcm1hbGl6ZSA9IGZ1bmN0aW9uICh2KSB7XG4gICAgdmFyIGQ7XG4gICAgaWYgKHYubGVuZ3RoID09PSAyKSB7XG4gICAgICAgIGQgPSB2WzBdKnZbMF0gKyB2WzFdKnZbMV07XG4gICAgICAgIGQgPSBNYXRoLnNxcnQoZCk7XG5cbiAgICAgICAgaWYgKGQgIT09IDApIHtcbiAgICAgICAgICAgIHJldHVybiBbdlswXSAvIGQsIHZbMV0gLyBkXTtcbiAgICAgICAgfVxuICAgICAgICByZXR1cm4gWzAsIDBdO1xuICAgIH0gZWxzZSBpZiAodi5sZW5ndGggPj0gMykge1xuICAgICAgICBkID0gdlswXSp2WzBdICsgdlsxXSp2WzFdICsgdlsyXSp2WzJdO1xuICAgICAgICBkID0gTWF0aC5zcXJ0KGQpO1xuXG4gICAgICAgIGlmIChkICE9PSAwKSB7XG4gICAgICAgICAgICByZXR1cm4gW3ZbMF0gLyBkLCB2WzFdIC8gZCwgdlsyXSAvIGRdO1xuICAgICAgICB9XG4gICAgfVxuICAgIHJldHVybiBbMCwgMCwgMF07XG59O1xuXG4vLyBDcm9zcyBwcm9kdWN0IG9mIHR3byB2ZWN0b3JzXG5WZWN0b3IuY3Jvc3MgID0gZnVuY3Rpb24gKHYxLCB2Mikge1xuICAgIHJldHVybiBbXG4gICAgICAgICh2MVsxXSAqIHYyWzJdKSAtICh2MVsyXSAqIHYyWzFdKSxcbiAgICAgICAgKHYxWzJdICogdjJbMF0pIC0gKHYxWzBdICogdjJbMl0pLFxuICAgICAgICAodjFbMF0gKiB2MlsxXSkgLSAodjFbMV0gKiB2MlswXSlcbiAgICBdO1xufTtcblxuLy8gRG90IHByb2R1Y3Qgb2YgdHdvIHZlY3RvcnNcblZlY3Rvci5kb3QgPSBmdW5jdGlvbiAodjEsIHYyKSB7XG4gICAgdmFyIG4gPSAwO1xuICAgIHZhciBsaW0gPSBNYXRoLm1pbih2MS5sZW5ndGgsIHYyLmxlbmd0aCk7XG4gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBsaW07IGkrKykge1xuICAgICAgICBuICs9IHYxW2ldICogdjJbaV07XG4gICAgfVxuICAgIHJldHVybiBuO1xufTtcbiIsImltcG9ydCBHZW8gZnJvbSAnLi9nZW8nO1xuaW1wb3J0IFRpbGUgZnJvbSAnLi90aWxlJztcbmltcG9ydCBDYW1lcmEgZnJvbSAnLi9jYW1lcmEnO1xuaW1wb3J0IFV0aWxzIGZyb20gJy4vdXRpbHMvdXRpbHMnO1xuaW1wb3J0IHN1YnNjcmliZU1peGluIGZyb20gJy4vdXRpbHMvc3Vic2NyaWJlJztcbmltcG9ydCBsb2cgZnJvbSAnLi91dGlscy9sb2cnO1xuXG5leHBvcnQgY29uc3QgVklFV19QQU5fU05BUF9USU1FID0gMC41O1xuXG5leHBvcnQgZGVmYXVsdCBjbGFzcyBWaWV3IHtcblxuICAgIGNvbnN0cnVjdG9yIChzY2VuZSwgb3B0aW9ucykge1xuICAgICAgICBzdWJzY3JpYmVNaXhpbih0aGlzKTtcblxuICAgICAgICB0aGlzLnNjZW5lID0gc2NlbmU7XG4gICAgICAgIHRoaXMuY3JlYXRlTWF0cmljZXMoKTtcblxuICAgICAgICB0aGlzLnpvb20gPSBudWxsO1xuICAgICAgICB0aGlzLmNlbnRlciA9IG51bGw7XG4gICAgICAgIHRoaXMuYm91bmRzID0gbnVsbDtcbiAgICAgICAgdGhpcy5tZXRlcnNfcGVyX3BpeGVsID0gbnVsbDtcblxuICAgICAgICB0aGlzLnBhbm5pbmcgPSBmYWxzZTtcbiAgICAgICAgdGhpcy5wYW5uaW5nX3N0b3BfYXQgPSAwO1xuICAgICAgICB0aGlzLnBhbl9zbmFwX3RpbWVyID0gMDtcbiAgICAgICAgdGhpcy56b29taW5nID0gZmFsc2U7XG4gICAgICAgIHRoaXMuem9vbV9kaXJlY3Rpb24gPSAwO1xuXG4gICAgICAgIC8vIFNpemUgb2Ygdmlld3BvcnQgaW4gQ1NTIHBpeGVscywgZGV2aWNlIHBpeGVscywgYW5kIG1lcmNhdG9yIG1ldGVyc1xuICAgICAgICB0aGlzLnNpemUgPSB7XG4gICAgICAgICAgICBjc3M6IHt9LFxuICAgICAgICAgICAgZGV2aWNlOiB7fSxcbiAgICAgICAgICAgIG1ldGVyczoge31cbiAgICAgICAgfTtcbiAgICAgICAgdGhpcy5hc3BlY3QgPSBudWxsO1xuXG4gICAgICAgIHRoaXMuYnVmZmVyID0gMDtcbiAgICAgICAgdGhpcy5jb250aW51b3VzX3pvb20gPSAodHlwZW9mIG9wdGlvbnMuY29udGludW91c1pvb20gPT09ICdib29sZWFuJykgPyBvcHRpb25zLmNvbnRpbnVvdXNab29tIDogdHJ1ZTtcbiAgICAgICAgdGhpcy50aWxlX3NpbXBsaWZpY2F0aW9uX2xldmVsID0gMDsgLy8gbGV2ZWwtb2YtZGV0YWlsIGRvd25zYW1wbGluZyB0byBhcHBseSB0byB0aWxlIGxvYWRpbmdcbiAgICAgICAgdGhpcy5wcmVzZXJ2ZV90aWxlc193aXRoaW5fem9vbSA9IDE7XG5cbiAgICAgICAgdGhpcy5yZXNldCgpO1xuICAgIH1cblxuICAgIC8vIFJlc2V0IHN0YXRlIGJlZm9yZSBzY2VuZSBjb25maWcgaXMgdXBkYXRlZFxuICAgIHJlc2V0ICgpIHtcbiAgICAgICAgdGhpcy5jcmVhdGVDYW1lcmEoKTtcbiAgICB9XG5cbiAgICAvLyBDcmVhdGUgY2FtZXJhXG4gICAgY3JlYXRlQ2FtZXJhICgpIHtcbiAgICAgICAgbGV0IGFjdGl2ZV9jYW1lcmEgPSB0aGlzLmdldEFjdGl2ZUNhbWVyYSgpO1xuICAgICAgICBpZiAoYWN0aXZlX2NhbWVyYSkge1xuICAgICAgICAgICAgdGhpcy5jYW1lcmEgPSBDYW1lcmEuY3JlYXRlKGFjdGl2ZV9jYW1lcmEsIHRoaXMsIHRoaXMuc2NlbmUuY29uZmlnLmNhbWVyYXNbYWN0aXZlX2NhbWVyYV0pO1xuICAgICAgICAgICAgdGhpcy5jYW1lcmEudXBkYXRlVmlldygpO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gR2V0IGFjdGl2ZSBjYW1lcmEgLSBmb3IgcHVibGljIEFQSVxuICAgIGdldEFjdGl2ZUNhbWVyYSAoKSB7XG4gICAgICAgIGlmICh0aGlzLnNjZW5lLmNvbmZpZyAmJiB0aGlzLnNjZW5lLmNvbmZpZy5jYW1lcmFzKSB7XG4gICAgICAgICAgICBmb3IgKGxldCBuYW1lIGluIHRoaXMuc2NlbmUuY29uZmlnLmNhbWVyYXMpIHtcbiAgICAgICAgICAgICAgICBpZiAodGhpcy5zY2VuZS5jb25maWcuY2FtZXJhc1tuYW1lXS5hY3RpdmUpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5hbWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBJZiBubyBjYW1lcmEgc2V0IGFzIGFjdGl2ZSwgdXNlIGZpcnN0IG9uZVxuICAgICAgICAgICAgbGV0IGtleXMgPSBPYmplY3Qua2V5cyh0aGlzLnNjZW5lLmNvbmZpZy5jYW1lcmFzKTtcbiAgICAgICAgICAgIHJldHVybiBrZXlzLmxlbmd0aCAmJiBrZXlzWzBdO1xuICAgICAgICB9XG4gICAgfVxuXG4gICAgLy8gU2V0IGFjdGl2ZSBjYW1lcmEgYW5kIHJlY29tcGlsZSAtIGZvciBwdWJsaWMgQVBJXG4gICAgc2V0QWN0aXZlQ2FtZXJhIChuYW1lKSB7XG4gICAgICAgIGxldCBwcmV2ID0gdGhpcy5nZXRBY3RpdmVDYW1lcmEoKTtcbiAgICAgICAgaWYgKHRoaXMuc2NlbmUuY29uZmlnLmNhbWVyYXNbbmFtZV0pIHtcbiAgICAgICAgICAgIHRoaXMuc2NlbmUuY29uZmlnLmNhbWVyYXNbbmFtZV0uYWN0aXZlID0gdHJ1ZTtcblxuICAgICAgICAgICAgLy8gQ2xlYXIgcHJldmlvdXNseSBhY3RpdmUgY2FtZXJhXG4gICAgICAgICAgICBpZiAocHJldiAmJiBwcmV2ICE9PSBuYW1lICYmIHRoaXMuc2NlbmUuY29uZmlnLmNhbWVyYXNbcHJldl0pIHtcbiAgICAgICAgICAgICAgICBkZWxldGUgdGhpcy5zY2VuZS5jb25maWcuY2FtZXJhc1twcmV2XS5hY3RpdmU7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLnNjZW5lLnVwZGF0ZUNvbmZpZyh7IHJlYnVpbGQ6IGZhbHNlIH0pO1xuICAgICAgICByZXR1cm4gdGhpcy5nZXRBY3RpdmVDYW1lcmEoKTtcbiAgICB9XG5cbiAgICAvLyBVcGRhdGUgbWV0aG9kIGNhbGxlZCBvbmNlIHBlciBmcmFtZVxuICAgIHVwZGF0ZSAoKSB7XG4gICAgICAgIHRoaXMuY2FtZXJhLnVwZGF0ZSgpO1xuICAgICAgICB0aGlzLnBhbl9zbmFwX3RpbWVyID0gKCgrbmV3IERhdGUoKSkgLSB0aGlzLnBhbm5pbmdfc3RvcF9hdCkgLyAxMDAwO1xuICAgIH1cblxuICAgIC8vIFNldCBsb2dpY2FsIHBpeGVsIHNpemUgb2Ygdmlld3BvcnRcbiAgICBzZXRWaWV3cG9ydFNpemUgKHdpZHRoLCBoZWlnaHQpIHtcbiAgICAgICAgdGhpcy5zaXplLmNzcyA9IHsgd2lkdGgsIGhlaWdodCB9O1xuICAgICAgICB0aGlzLnNpemUuZGV2aWNlID0ge1xuICAgICAgICAgICAgd2lkdGg6IE1hdGgucm91bmQodGhpcy5zaXplLmNzcy53aWR0aCAqIFV0aWxzLmRldmljZV9waXhlbF9yYXRpbyksXG4gICAgICAgICAgICBoZWlnaHQ6IE1hdGgucm91bmQodGhpcy5zaXplLmNzcy5oZWlnaHQgKiBVdGlscy5kZXZpY2VfcGl4ZWxfcmF0aW8pXG4gICAgICAgIH07XG4gICAgICAgIHRoaXMuYXNwZWN0ID0gdGhpcy5zaXplLmNzcy53aWR0aCAvIHRoaXMuc2l6ZS5jc3MuaGVpZ2h0O1xuICAgICAgICB0aGlzLnVwZGF0ZUJvdW5kcygpO1xuICAgIH1cblxuICAgIC8vIFNldCB0aGUgbWFwIHZpZXcsIGNhbiBiZSBwYXNzZWQgYW4gb2JqZWN0IHdpdGggbGF0L2xuZyBhbmQvb3Igem9vbVxuICAgIHNldFZpZXcgKHsgbG5nLCBsYXQsIHpvb20gfSA9IHt9KSB7XG4gICAgICAgIHZhciBjaGFuZ2VkID0gZmFsc2U7XG5cbiAgICAgICAgLy8gU2V0IGNlbnRlclxuICAgICAgICBpZiAodHlwZW9mIGxuZyA9PT0gJ251bWJlcicgJiYgdHlwZW9mIGxhdCA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgICAgIGlmICghdGhpcy5jZW50ZXIgfHwgbG5nICE9PSB0aGlzLmNlbnRlci5sbmcgfHwgbGF0ICE9PSB0aGlzLmNlbnRlci5sYXQpIHtcbiAgICAgICAgICAgICAgICBjaGFuZ2VkID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB0aGlzLmNlbnRlciA9IHsgbG5nOiBHZW8ud3JhcExuZyhsbmcpLCBsYXQgfTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIC8vIFNldCB6b29tXG4gICAgICAgIGlmICh0eXBlb2Ygem9vbSA9PT0gJ251bWJlcicgJiYgem9vbSAhPT0gdGhpcy56b29tKSB7XG4gICAgICAgICAgICBjaGFuZ2VkID0gdHJ1ZTtcbiAgICAgICAgICAgIHRoaXMuc2V0Wm9vbSh6b29tKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChjaGFuZ2VkKSB7XG4gICAgICAgICAgICB0aGlzLnVwZGF0ZUJvdW5kcygpO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiBjaGFuZ2VkO1xuICAgIH1cblxuICAgIHNldFpvb20gKHpvb20pIHtcbiAgICAgICAgaWYgKHRoaXMuem9vbWluZykge1xuICAgICAgICAgICAgdGhpcy56b29taW5nID0gZmFsc2U7XG4gICAgICAgIH1cbiAgICAgICAgZWxzZSB7XG4gICAgICAgICAgICB0aGlzLmxhc3Rfem9vbSA9IHRoaXMuem9vbTtcbiAgICAgICAgfVxuXG4gICAgICAgIGxldCBsYXN0X3RpbGVfem9vbSA9IHRoaXMudGlsZV96b29tO1xuICAgICAgICBsZXQgdGlsZV96b29tID0gdGhpcy50aWxlWm9vbSh6b29tKTtcbiAgICAgICAgaWYgKCF0aGlzLmNvbnRpbnVvdXNfem9vbSkge1xuICAgICAgICAgICAgem9vbSA9IHRpbGVfem9vbTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICh0aWxlX3pvb20gIT09IGxhc3RfdGlsZV96b29tKSB7XG4gICAgICAgICAgICB0aGlzLnpvb21fZGlyZWN0aW9uID0gdGlsZV96b29tID4gbGFzdF90aWxlX3pvb20gPyAxIDogLTE7XG4gICAgICAgIH1cblxuICAgICAgICB0aGlzLmxhc3Rfem9vbSA9IHRoaXMuem9vbTtcbiAgICAgICAgdGhpcy56b29tID0gem9vbTtcbiAgICAgICAgdGhpcy50aWxlX3pvb20gPSB0aWxlX3pvb207XG5cbiAgICAgICAgdGhpcy51cGRhdGVCb3VuZHMoKTtcbiAgICAgICAgdGhpcy5zY2VuZS5yZXF1ZXN0UmVkcmF3KCk7XG4gICAgfVxuXG4gICAgc3RhcnRab29tICgpIHtcbiAgICAgICAgdGhpcy5sYXN0X3pvb20gPSB0aGlzLnpvb207XG4gICAgICAgIHRoaXMuem9vbWluZyA9IHRydWU7XG4gICAgfVxuXG4gICAgLy8gQ2hvb3NlIHRoZSBiYXNlIHpvb20gbGV2ZWwgdG8gdXNlIGZvciBhIGdpdmVuIGZyYWN0aW9uYWwgem9vbVxuICAgIGJhc2Vab29tICh6b29tKSB7XG4gICAgICAgIHJldHVybiBNYXRoLmZsb29yKHpvb20pO1xuICAgIH1cblxuICAgIC8vIEZvciBhIGdpdmVuIHZpZXcgem9vbSwgd2hhdCB0aWxlIHpvb20gc2hvdWxkIGJlIGxvYWRlZD9cbiAgICB0aWxlWm9vbSAodmlld196b29tKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmJhc2Vab29tKHZpZXdfem9vbSkgLSB0aGlzLnRpbGVfc2ltcGxpZmljYXRpb25fbGV2ZWw7XG4gICAgfVxuXG4gICAgLy8gRm9yIGEgZ2l2ZW4gdGlsZSB6b29tLCB3aGF0IHN0eWxlIHpvb20gc2hvdWxkIGJlIHVzZWQ/XG4gICAgc3R5bGVab29tICh0aWxlX3pvb20pIHtcbiAgICAgICAgcmV0dXJuIHRoaXMuYmFzZVpvb20odGlsZV96b29tKSArIHRoaXMudGlsZV9zaW1wbGlmaWNhdGlvbl9sZXZlbDtcbiAgICB9XG5cbiAgICBzZXRQYW5uaW5nIChwYW5uaW5nKSB7XG4gICAgICAgIHRoaXMucGFubmluZyA9IHBhbm5pbmc7XG4gICAgICAgIGlmICghdGhpcy5wYW5uaW5nKSB7XG4gICAgICAgICAgICB0aGlzLnBhbm5pbmdfc3RvcF9hdCA9ICgrbmV3IERhdGUoKSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICByZWFkeSAoKSB7XG4gICAgICAgIC8vIFRPRE86IGJldHRlciBjb25jZXB0IG9mIFwicmVhZGluZXNzXCIgc3RhdGU/XG4gICAgICAgIGlmICh0eXBlb2YgdGhpcy5zaXplLmNzcy53aWR0aCAhPT0gJ251bWJlcicgfHxcbiAgICAgICAgICAgIHR5cGVvZiB0aGlzLnNpemUuY3NzLmhlaWdodCAhPT0gJ251bWJlcicgfHxcbiAgICAgICAgICAgIHRoaXMuY2VudGVyID09IG51bGwgfHxcbiAgICAgICAgICAgIHR5cGVvZiB0aGlzLnpvb20gIT09ICdudW1iZXInKSB7XG4gICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIC8vIENhbGN1bGF0ZSB2aWV3cG9ydCBib3VuZHMgYmFzZWQgb24gY3VycmVudCBjZW50ZXIgYW5kIHpvb21cbiAgICB1cGRhdGVCb3VuZHMgKCkge1xuICAgICAgICBpZiAoIXRoaXMucmVhZHkoKSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgdGhpcy5tZXRlcnNfcGVyX3BpeGVsID0gR2VvLm1ldGVyc1BlclBpeGVsKHRoaXMuem9vbSk7XG5cbiAgICAgICAgLy8gU2l6ZSBvZiB0aGUgaGFsZi12aWV3cG9ydCBpbiBtZXRlcnMgYXQgY3VycmVudCB6b29tXG4gICAgICAgIHRoaXMuc2l6ZS5tZXRlcnMgPSB7XG4gICAgICAgICAgICB4OiB0aGlzLnNpemUuY3NzLndpZHRoICogdGhpcy5tZXRlcnNfcGVyX3BpeGVsLFxuICAgICAgICAgICAgeTogdGhpcy5zaXplLmNzcy5oZWlnaHQgKiB0aGlzLm1ldGVyc19wZXJfcGl4ZWxcbiAgICAgICAgfTtcblxuICAgICAgICAvLyBDZW50ZXIgb2Ygdmlld3BvcnQgaW4gbWV0ZXJzLCBhbmQgdGlsZVxuICAgICAgICBsZXQgW3gsIHldID0gR2VvLmxhdExuZ1RvTWV0ZXJzKFt0aGlzLmNlbnRlci5sbmcsIHRoaXMuY2VudGVyLmxhdF0pO1xuICAgICAgICB0aGlzLmNlbnRlci5tZXRlcnMgPSB7IHgsIHkgfTtcblxuICAgICAgICB0aGlzLmNlbnRlci50aWxlID0gR2VvLnRpbGVGb3JNZXRlcnMoW3RoaXMuY2VudGVyLm1ldGVycy54LCB0aGlzLmNlbnRlci5tZXRlcnMueV0sIHRoaXMudGlsZV96b29tKTtcblxuICAgICAgICAvLyBCb3VuZHMgaW4gbWV0ZXJzXG4gICAgICAgIHRoaXMuYm91bmRzID0ge1xuICAgICAgICAgICAgc3c6IHtcbiAgICAgICAgICAgICAgICB4OiB0aGlzLmNlbnRlci5tZXRlcnMueCAtIHRoaXMuc2l6ZS5tZXRlcnMueCAvIDIsXG4gICAgICAgICAgICAgICAgeTogdGhpcy5jZW50ZXIubWV0ZXJzLnkgLSB0aGlzLnNpemUubWV0ZXJzLnkgLyAyXG4gICAgICAgICAgICB9LFxuICAgICAgICAgICAgbmU6IHtcbiAgICAgICAgICAgICAgICB4OiB0aGlzLmNlbnRlci5tZXRlcnMueCArIHRoaXMuc2l6ZS5tZXRlcnMueCAvIDIsXG4gICAgICAgICAgICAgICAgeTogdGhpcy5jZW50ZXIubWV0ZXJzLnkgKyB0aGlzLnNpemUubWV0ZXJzLnkgLyAyXG4gICAgICAgICAgICB9XG4gICAgICAgIH07XG5cbiAgICAgICAgdGhpcy5zY2VuZS50aWxlX21hbmFnZXIudXBkYXRlVGlsZXNGb3JWaWV3KCk7XG5cbiAgICAgICAgdGhpcy50cmlnZ2VyKCdtb3ZlJyk7XG4gICAgICAgIHRoaXMuc2NlbmUucmVxdWVzdFJlZHJhdygpOyAvLyBUT0RPIGF1dG9tYXRlIHZpYSBtb3ZlIGV2ZW50P1xuICAgIH1cblxuICAgIGZpbmRWaXNpYmxlVGlsZUNvb3JkaW5hdGVzICgpIHtcbiAgICAgICAgaWYgKCF0aGlzLmJvdW5kcykge1xuICAgICAgICAgICAgcmV0dXJuIFtdO1xuICAgICAgICB9XG5cbiAgICAgICAgbGV0IHogPSB0aGlzLnRpbGVfem9vbTtcbiAgICAgICAgbGV0IHN3ID0gR2VvLnRpbGVGb3JNZXRlcnMoW3RoaXMuYm91bmRzLnN3LngsIHRoaXMuYm91bmRzLnN3LnldLCB6KTtcbiAgICAgICAgbGV0IG5lID0gR2VvLnRpbGVGb3JNZXRlcnMoW3RoaXMuYm91bmRzLm5lLngsIHRoaXMuYm91bmRzLm5lLnldLCB6KTtcblxuICAgICAgICBsZXQgY29vcmRzID0gW107XG4gICAgICAgIGZvciAobGV0IHggPSBzdy54IC0gdGhpcy5idWZmZXI7IHggPD0gbmUueCArIHRoaXMuYnVmZmVyOyB4KyspIHtcbiAgICAgICAgICAgIGZvciAobGV0IHkgPSBuZS55IC0gdGhpcy5idWZmZXI7IHkgPD0gc3cueSArIHRoaXMuYnVmZmVyOyB5KyspIHtcbiAgICAgICAgICAgICAgICBjb29yZHMucHVzaChUaWxlLmNvb3JkKHsgeCwgeSwgeiB9KSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgcmV0dXJuIGNvb3JkcztcbiAgICB9XG5cbiAgICAvLyBSZW1vdmUgdGlsZXMgdG9vIGZhciBvdXRzaWRlIG9mIHZpZXdcbiAgICBwcnVuZVRpbGVzRm9yVmlldyAoKSB7XG4gICAgICAgIC8vIFRPRE86IHdpbGwgdGhpcyBmdW5jdGlvbiBldmVyIGJlIGNhbGxlZCB3aGVuIHZpZXcgaXNuJ3QgcmVhZHk/XG4gICAgICAgIGlmICghdGhpcy5yZWFkeSgpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICAvLyBSZW1vdmUgdGlsZXMgdGhhdCBhcmUgYSBzcGVjaWZpZWQgIyBvZiB0aWxlcyBvdXRzaWRlIG9mIHRoZSB2aWV3cG9ydCBib3JkZXJcbiAgICAgICAgbGV0IGJvcmRlcl90aWxlcyA9IFtcbiAgICAgICAgICAgIE1hdGguY2VpbCgoTWF0aC5mbG9vcih0aGlzLnNpemUuY3NzLndpZHRoIC8gR2VvLnRpbGVfc2l6ZSkgKyAyKSAvIDIpLFxuICAgICAgICAgICAgTWF0aC5jZWlsKChNYXRoLmZsb29yKHRoaXMuc2l6ZS5jc3MuaGVpZ2h0IC8gR2VvLnRpbGVfc2l6ZSkgKyAyKSAvIDIpXG4gICAgICAgIF07XG5cbiAgICAgICAgdGhpcy5zY2VuZS50aWxlX21hbmFnZXIucmVtb3ZlVGlsZXModGlsZSA9PiB7XG4gICAgICAgICAgICAvLyBJZ25vcmUgdmlzaWJsZSB0aWxlc1xuICAgICAgICAgICAgaWYgKHRpbGUudmlzaWJsZSB8fCB0aWxlLnByb3h5X2Zvcikge1xuICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gUmVtb3ZlIHRpbGVzIG91dHNpZGUgZ2l2ZW4gem9vbSB0aGF0IGFyZSBzdGlsbCBsb2FkaW5nXG4gICAgICAgICAgICBpZiAodGlsZS5sb2FkaW5nICYmIHRpbGUuc3R5bGVfem9vbSAhPT0gdGhpcy50aWxlX3pvb20pIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gRGlzY2FyZCBpZiB0b28gZmFyIGZyb20gY3VycmVudCB6b29tXG4gICAgICAgICAgICBsZXQgemRpZmYgPSBNYXRoLmFicyh0aWxlLnN0eWxlX3pvb20gLSB0aGlzLnRpbGVfem9vbSk7XG4gICAgICAgICAgICBpZiAoemRpZmYgPiB0aGlzLnByZXNlcnZlX3RpbGVzX3dpdGhpbl96b29tKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIEhhbmRsZSB0aWxlcyBhdCBkaWZmZXJlbnQgem9vbXNcbiAgICAgICAgICAgIGxldCBjb29yZHMgPSBUaWxlLmNvb3JkaW5hdGVBdFpvb20odGlsZS5jb29yZHMsIHRoaXMudGlsZV96b29tKTtcblxuICAgICAgICAgICAgLy8gRGlzY2FyZCB0aWxlcyBvdXRzaWRlIGFuIGFyZWEgc3Vycm91bmRpbmcgdGhlIHZpZXdwb3J0XG4gICAgICAgICAgICBpZiAoTWF0aC5hYnMoY29vcmRzLnggLSB0aGlzLmNlbnRlci50aWxlLngpIC0gYm9yZGVyX3RpbGVzWzBdID4gdGhpcy5idWZmZXIpIHtcbiAgICAgICAgICAgICAgICBsb2coJ3RyYWNlJywgYFZpZXc6IHJlbW92ZSB0aWxlICR7dGlsZS5rZXl9IChhcyAke2Nvb3Jkcy54fS8ke2Nvb3Jkcy55fS8ke3RoaXMudGlsZV96b29tfSkgZm9yIGJlaW5nIHRvbyBmYXIgb3V0IG9mIHZpc2libGUgYXJlYSAqKipgKTtcbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIGVsc2UgaWYgKE1hdGguYWJzKGNvb3Jkcy55IC0gdGhpcy5jZW50ZXIudGlsZS55KSAtIGJvcmRlcl90aWxlc1sxXSA+IHRoaXMuYnVmZmVyKSB7XG4gICAgICAgICAgICAgICAgbG9nKCd0cmFjZScsIGBWaWV3OiByZW1vdmUgdGlsZSAke3RpbGUua2V5fSAoYXMgJHtjb29yZHMueH0vJHtjb29yZHMueX0vJHt0aGlzLnRpbGVfem9vbX0pIGZvciBiZWluZyB0b28gZmFyIG91dCBvZiB2aXNpYmxlIGFyZWEgKioqYCk7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIC8vIEFsbG9jYXRlIG1vZGVsLXZpZXcgbWF0cmljZXNcbiAgICAvLyA2NC1iaXQgdmVyc2lvbnMgYXJlIGZvciBDUFUgY2FsY3VhdGlvbnNcbiAgICAvLyAzMi1iaXQgdmVyc2lvbnMgYXJlIGRvd25zYW1wbGVkIGFuZCBzZW50IHRvIEdQVVxuICAgIGNyZWF0ZU1hdHJpY2VzICgpIHtcbiAgICAgICAgdGhpcy5tYXRyaWNlcyA9IHt9O1xuICAgICAgICB0aGlzLm1hdHJpY2VzLm1vZGVsID0gbmV3IEZsb2F0NjRBcnJheSgxNik7XG4gICAgICAgIHRoaXMubWF0cmljZXMubW9kZWwzMiA9IG5ldyBGbG9hdDMyQXJyYXkoMTYpO1xuICAgICAgICB0aGlzLm1hdHJpY2VzLm1vZGVsX3ZpZXcgPSBuZXcgRmxvYXQ2NEFycmF5KDE2KTtcbiAgICAgICAgdGhpcy5tYXRyaWNlcy5tb2RlbF92aWV3MzIgPSBuZXcgRmxvYXQzMkFycmF5KDE2KTtcbiAgICAgICAgdGhpcy5tYXRyaWNlcy5ub3JtYWwgPSBuZXcgRmxvYXQ2NEFycmF5KDkpO1xuICAgICAgICB0aGlzLm1hdHJpY2VzLm5vcm1hbDMyID0gbmV3IEZsb2F0MzJBcnJheSg5KTtcbiAgICAgICAgdGhpcy5tYXRyaWNlcy5pbnZlcnNlX25vcm1hbDMyID0gbmV3IEZsb2F0MzJBcnJheSg5KTtcbiAgICB9XG5cbiAgICAvLyBDYWxjdWxhdGUgYW5kIHNldCBtb2RlbC92aWV3IGFuZCBub3JtYWwgbWF0cmljZXMgZm9yIGEgdGlsZVxuICAgIHNldHVwVGlsZSAodGlsZSwgcHJvZ3JhbSkge1xuICAgICAgICAvLyBUaWxlLXNwZWNpZmljIHN0YXRlXG4gICAgICAgIC8vIFRPRE86IGNhbGMgdGhlc2Ugb25jZSBwZXIgdGlsZSAoY3VycmVudGx5IGJlaW5nIG5lZWRsZXNzbHkgcmUtY2FsY3VsYXRlZCBwZXItdGlsZS1wZXItc3R5bGUpXG4gICAgICAgIHRpbGUuc2V0dXBQcm9ncmFtKHRoaXMubWF0cmljZXMsIHByb2dyYW0pO1xuXG4gICAgICAgIC8vIE1vZGVsLXZpZXcgYW5kIG5vcm1hbCBtYXRyaWNlc1xuICAgICAgICB0aGlzLmNhbWVyYS5zZXR1cE1hdHJpY2VzKHRoaXMubWF0cmljZXMsIHByb2dyYW0pO1xuICAgIH1cblxuICAgIC8vIFNldCBnZW5lcmFsIHVuaWZvcm1zIHRoYXQgbXVzdCBiZSB1cGRhdGVkIG9uY2UgcGVyIHByb2dyYW1cbiAgICBzZXR1cFByb2dyYW0gKHByb2dyYW0pIHtcbiAgICAgICAgcHJvZ3JhbS51bmlmb3JtKCcyZnYnLCAndV9yZXNvbHV0aW9uJywgW3RoaXMuc2l6ZS5kZXZpY2Uud2lkdGgsIHRoaXMuc2l6ZS5kZXZpY2UuaGVpZ2h0XSk7XG4gICAgICAgIHByb2dyYW0udW5pZm9ybSgnM2Z2JywgJ3VfbWFwX3Bvc2l0aW9uJywgW3RoaXMuY2VudGVyLm1ldGVycy54LCB0aGlzLmNlbnRlci5tZXRlcnMueSwgdGhpcy56b29tXSk7XG4gICAgICAgIHByb2dyYW0udW5pZm9ybSgnMWYnLCAndV9tZXRlcnNfcGVyX3BpeGVsJywgdGhpcy5tZXRlcnNfcGVyX3BpeGVsKTtcbiAgICAgICAgcHJvZ3JhbS51bmlmb3JtKCcxZicsICd1X2RldmljZV9waXhlbF9yYXRpbycsIFV0aWxzLmRldmljZV9waXhlbF9yYXRpbyk7XG4gICAgICAgIHByb2dyYW0udW5pZm9ybSgnMWYnLCAndV92aWV3X3Bhbl9zbmFwX3RpbWVyJywgdGhpcy5wYW5fc25hcF90aW1lcik7XG4gICAgICAgIHByb2dyYW0udW5pZm9ybSgnMWknLCAndV92aWV3X3Bhbm5pbmcnLCB0aGlzLnBhbm5pbmcpO1xuXG4gICAgICAgIHRoaXMuY2FtZXJhLnNldHVwUHJvZ3JhbShwcm9ncmFtKTtcbiAgICB9XG5cbiAgICAvLyBWaWV3IHJlcXVpcmVzIHNvbWUgYW5pbWF0aW9uLCBzdWNoIGFzIGFmdGVyIHBhbm5pbmcgc3RvcHNcbiAgICBpc0FuaW1hdGluZyAoKSB7XG4gICAgICAgIHJldHVybiAodGhpcy5wYW5fc25hcF90aW1lciA8PSBWSUVXX1BBTl9TTkFQX1RJTUUpO1xuICAgIH1cblxufVxuIl19 diff --git a/dist/tangram.min.js b/dist/tangram.min.js index 9e6b191ad..f5dfdd560 100644 --- a/dist/tangram.min.js +++ b/dist/tangram.min.js @@ -1,18 +1,18 @@ -!function(e){if("object"==typeof exports&&"undefined"!=typeof module)module.exports=e();else if("function"==typeof define&&define.amd)define([],e);else{var t;t="undefined"!=typeof window?window:"undefined"!=typeof global?global:"undefined"!=typeof self?self:this,t.Tangram=e()}}(function(){var e;return function t(e,r,n){function i(s,a){if(!r[s]){if(!e[s]){var u="function"==typeof require&&require;if(!a&&u)return u(s,!0);if(o)return o(s,!0);var l=new Error("Cannot find module '"+s+"'");throw l.code="MODULE_NOT_FOUND",l}var c=r[s]={exports:{}};e[s][0].call(c.exports,function(t){var r=e[s][1][t];return i(r?r:t)},c,c.exports,t,e,r,n)}return r[s].exports}for(var o="function"==typeof require&&require,s=0;se)throw new RangeError('"size" argument must not be negative')}function l(e,t,r,n){return u(t),0>=t?o(e,t):void 0!==r?"string"==typeof n?o(e,t).fill(r,n):o(e,t).fill(r):o(e,t)}function c(e,t){if(u(t),e=o(e,0>t?0:0|_(t)),!s.TYPED_ARRAY_SUPPORT)for(var r=0;t>r;++r)e[r]=0;return e}function f(e,t,r){if(("string"!=typeof r||""===r)&&(r="utf8"),!s.isEncoding(r))throw new TypeError('"encoding" must be a valid string encoding');var n=0|g(t,r);e=o(e,n);var i=e.write(t,r);return i!==n&&(e=e.slice(0,i)),e}function h(e,t){var r=t.length<0?0:0|_(t.length);e=o(e,r);for(var n=0;r>n;n+=1)e[n]=255&t[n];return e}function d(e,t,r,n){if(t.byteLength,0>r||t.byteLength=i())throw new RangeError("Attempt to allocate Buffer larger than maximum size: 0x"+i().toString(16)+" bytes");return 0|e}function m(e){return+e!=e&&(e=0),s.alloc(+e)}function g(e,t){if(s.isBuffer(e))return e.length;if("undefined"!=typeof ArrayBuffer&&"function"==typeof ArrayBuffer.isView&&(ArrayBuffer.isView(e)||e instanceof ArrayBuffer))return e.byteLength;"string"!=typeof e&&(e=""+e);var r=e.length;if(0===r)return 0;for(var n=!1;;)switch(t){case"ascii":case"latin1":case"binary":return r;case"utf8":case"utf-8":case void 0:return W(e).length;case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return 2*r;case"hex":return r>>>1;case"base64":return X(e).length;default:if(n)return W(e).length;t=(""+t).toLowerCase(),n=!0}}function v(e,t,r){var n=!1;if((void 0===t||0>t)&&(t=0),t>this.length)return"";if((void 0===r||r>this.length)&&(r=this.length),0>=r)return"";if(r>>>=0,t>>>=0,t>=r)return"";for(e||(e="utf8");;)switch(e){case"hex":return N(this,t,r);case"utf8":case"utf-8":return M(this,t,r);case"ascii":return O(this,t,r);case"latin1":case"binary":return z(this,t,r);case"base64":return R(this,t,r);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return j(this,t,r);default:if(n)throw new TypeError("Unknown encoding: "+e);e=(e+"").toLowerCase(),n=!0}}function y(e,t,r){var n=e[t];e[t]=e[r],e[r]=n}function b(e,t,r,n,i){if(0===e.length)return-1;if("string"==typeof r?(n=r,r=0):r>2147483647?r=2147483647:-2147483648>r&&(r=-2147483648),r=+r,isNaN(r)&&(r=i?0:e.length-1),0>r&&(r=e.length+r),r>=e.length){if(i)return-1;r=e.length-1}else if(0>r){if(!i)return-1;r=0}if("string"==typeof t&&(t=s.from(t,n)),s.isBuffer(t))return 0===t.length?-1:x(e,t,r,n,i);if("number"==typeof t)return t=255&t,s.TYPED_ARRAY_SUPPORT&&"function"==typeof Uint8Array.prototype.indexOf?i?Uint8Array.prototype.indexOf.call(e,t,r):Uint8Array.prototype.lastIndexOf.call(e,t,r):x(e,[t],r,n,i);throw new TypeError("val must be string, number or Buffer")}function x(e,t,r,n,i){function o(e,t){return 1===s?e[t]:e.readUInt16BE(t*s)}var s=1,a=e.length,u=t.length;if(void 0!==n&&(n=String(n).toLowerCase(),"ucs2"===n||"ucs-2"===n||"utf16le"===n||"utf-16le"===n)){if(e.length<2||t.length<2)return-1;s=2,a/=2,u/=2,r/=2}var l;if(i){var c=-1;for(l=r;a>l;l++)if(o(e,l)===o(t,-1===c?0:l-c)){if(-1===c&&(c=l),l-c+1===u)return c*s}else-1!==c&&(l-=l-c),c=-1}else for(r+u>a&&(r=a-u),l=r;l>=0;l--){for(var f=!0,h=0;u>h;h++)if(o(e,l+h)!==o(t,h)){f=!1;break}if(f)return l}return-1}function w(e,t,r,n){r=Number(r)||0;var i=e.length-r;n?(n=Number(n),n>i&&(n=i)):n=i;var o=t.length;if(o%2!==0)throw new TypeError("Invalid hex string");n>o/2&&(n=o/2);for(var s=0;n>s;++s){var a=parseInt(t.substr(2*s,2),16);if(isNaN(a))return s;e[r+s]=a}return s}function k(e,t,r,n){return Y(W(t,e.length-r),e,r,n)}function A(e,t,r,n){return Y(Z(t),e,r,n)}function T(e,t,r,n){return A(e,t,r,n)}function E(e,t,r,n){return Y(X(t),e,r,n)}function S(e,t,r,n){return Y(H(t,e.length-r),e,r,n)}function R(e,t,r){return K.fromByteArray(0===t&&r===e.length?e:e.slice(t,r))}function M(e,t,r){r=Math.min(e.length,r);for(var n=[],i=t;r>i;){var o=e[i],s=null,a=o>239?4:o>223?3:o>191?2:1;if(r>=i+a){var u,l,c,f;switch(a){case 1:128>o&&(s=o);break;case 2:u=e[i+1],128===(192&u)&&(f=(31&o)<<6|63&u,f>127&&(s=f));break;case 3:u=e[i+1],l=e[i+2],128===(192&u)&&128===(192&l)&&(f=(15&o)<<12|(63&u)<<6|63&l,f>2047&&(55296>f||f>57343)&&(s=f));break;case 4:u=e[i+1],l=e[i+2],c=e[i+3],128===(192&u)&&128===(192&l)&&128===(192&c)&&(f=(15&o)<<18|(63&u)<<12|(63&l)<<6|63&c,f>65535&&1114112>f&&(s=f))}}null===s?(s=65533,a=1):s>65535&&(s-=65536,n.push(s>>>10&1023|55296),s=56320|1023&s),n.push(s),i+=a}return P(n)}function P(e){var t=e.length;if(et>=t)return String.fromCharCode.apply(String,e);for(var r="",n=0;t>n;)r+=String.fromCharCode.apply(String,e.slice(n,n+=et));return r}function O(e,t,r){var n="";r=Math.min(e.length,r);for(var i=t;r>i;++i)n+=String.fromCharCode(127&e[i]);return n}function z(e,t,r){var n="";r=Math.min(e.length,r);for(var i=t;r>i;++i)n+=String.fromCharCode(e[i]);return n}function N(e,t,r){var n=e.length;(!t||0>t)&&(t=0),(!r||0>r||r>n)&&(r=n);for(var i="",o=t;r>o;++o)i+=q(e[o]);return i}function j(e,t,r){for(var n=e.slice(t,r),i="",o=0;oe)throw new RangeError("offset is not uint");if(e+t>r)throw new RangeError("Trying to access beyond buffer length")}function I(e,t,r,n,i,o){if(!s.isBuffer(e))throw new TypeError('"buffer" argument must be a Buffer instance');if(t>i||o>t)throw new RangeError('"value" argument is out of bounds');if(r+n>e.length)throw new RangeError("Index out of range")}function C(e,t,r,n){0>t&&(t=65535+t+1);for(var i=0,o=Math.min(e.length-r,2);o>i;++i)e[r+i]=(t&255<<8*(n?i:1-i))>>>8*(n?i:1-i)}function F(e,t,r,n){0>t&&(t=4294967295+t+1);for(var i=0,o=Math.min(e.length-r,4);o>i;++i)e[r+i]=t>>>8*(n?i:3-i)&255}function U(e,t,r,n){if(r+n>e.length)throw new RangeError("Index out of range");if(0>r)throw new RangeError("Index out of range")}function D(e,t,r,n,i){return i||U(e,t,r,4,3.4028234663852886e38,-3.4028234663852886e38),$.write(e,t,r,n,23,4),r+4}function B(e,t,r,n,i){return i||U(e,t,r,8,1.7976931348623157e308,-1.7976931348623157e308),$.write(e,t,r,n,52,8),r+8}function G(e){if(e=V(e).replace(tt,""),e.length<2)return"";for(;e.length%4!==0;)e+="=";return e}function V(e){return e.trim?e.trim():e.replace(/^\s+|\s+$/g,"")}function q(e){return 16>e?"0"+e.toString(16):e.toString(16)}function W(e,t){t=t||1/0;for(var r,n=e.length,i=null,o=[],s=0;n>s;++s){if(r=e.charCodeAt(s),r>55295&&57344>r){if(!i){if(r>56319){(t-=3)>-1&&o.push(239,191,189);continue}if(s+1===n){(t-=3)>-1&&o.push(239,191,189);continue}i=r;continue}if(56320>r){(t-=3)>-1&&o.push(239,191,189),i=r;continue}r=(i-55296<<10|r-56320)+65536}else i&&(t-=3)>-1&&o.push(239,191,189);if(i=null,128>r){if((t-=1)<0)break;o.push(r)}else if(2048>r){if((t-=2)<0)break;o.push(r>>6|192,63&r|128)}else if(65536>r){if((t-=3)<0)break;o.push(r>>12|224,r>>6&63|128,63&r|128)}else{if(!(1114112>r))throw new Error("Invalid code point");if((t-=4)<0)break;o.push(r>>18|240,r>>12&63|128,r>>6&63|128,63&r|128)}}return o}function Z(e){for(var t=[],r=0;r>8,i=r%256,o.push(i),o.push(n);return o}function X(e){return K.toByteArray(G(e))}function Y(e,t,r,n){for(var i=0;n>i&&!(i+r>=t.length||i>=e.length);++i)t[i+r]=e[i];return i}function J(e){return e!==e}var K=e("base64-js"),$=e("ieee754"),Q=e("isarray");r.Buffer=s,r.SlowBuffer=m,r.INSPECT_MAX_BYTES=50,s.TYPED_ARRAY_SUPPORT=void 0!==t.TYPED_ARRAY_SUPPORT?t.TYPED_ARRAY_SUPPORT:n(),r.kMaxLength=i(),s.poolSize=8192,s._augment=function(e){return e.__proto__=s.prototype,e},s.from=function(e,t,r){return a(null,e,t,r)},s.TYPED_ARRAY_SUPPORT&&(s.prototype.__proto__=Uint8Array.prototype,s.__proto__=Uint8Array,"undefined"!=typeof Symbol&&Symbol.species&&s[Symbol.species]===s&&Object.defineProperty(s,Symbol.species,{value:null,configurable:!0})),s.alloc=function(e,t,r){return l(null,e,t,r)},s.allocUnsafe=function(e){return c(null,e)},s.allocUnsafeSlow=function(e){return c(null,e)},s.isBuffer=function(e){return!(null==e||!e._isBuffer)},s.compare=function(e,t){if(!s.isBuffer(e)||!s.isBuffer(t))throw new TypeError("Arguments must be Buffers");if(e===t)return 0;for(var r=e.length,n=t.length,i=0,o=Math.min(r,n);o>i;++i)if(e[i]!==t[i]){r=e[i],n=t[i];break}return n>r?-1:r>n?1:0},s.isEncoding=function(e){switch(String(e).toLowerCase()){case"hex":case"utf8":case"utf-8":case"ascii":case"latin1":case"binary":case"base64":case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return!0;default:return!1}},s.concat=function(e,t){if(!Q(e))throw new TypeError('"list" argument must be an Array of Buffers');if(0===e.length)return s.alloc(0);var r;if(void 0===t)for(t=0,r=0;rt;t+=2)y(this,t,t+1);return this},s.prototype.swap32=function(){var e=this.length;if(e%4!==0)throw new RangeError("Buffer size must be a multiple of 32-bits");for(var t=0;e>t;t+=4)y(this,t,t+3),y(this,t+1,t+2);return this},s.prototype.swap64=function(){var e=this.length;if(e%8!==0)throw new RangeError("Buffer size must be a multiple of 64-bits");for(var t=0;e>t;t+=8)y(this,t,t+7),y(this,t+1,t+6),y(this,t+2,t+5),y(this,t+3,t+4);return this},s.prototype.toString=function(){var e=0|this.length;return 0===e?"":0===arguments.length?M(this,0,e):v.apply(this,arguments)},s.prototype.equals=function(e){if(!s.isBuffer(e))throw new TypeError("Argument must be a Buffer");return this===e?!0:0===s.compare(this,e)},s.prototype.inspect=function(){var e="",t=r.INSPECT_MAX_BYTES;return this.length>0&&(e=this.toString("hex",0,t).match(/.{2}/g).join(" "),this.length>t&&(e+=" ... ")),""},s.prototype.compare=function(e,t,r,n,i){if(!s.isBuffer(e))throw new TypeError("Argument must be a Buffer");if(void 0===t&&(t=0),void 0===r&&(r=e?e.length:0),void 0===n&&(n=0),void 0===i&&(i=this.length),0>t||r>e.length||0>n||i>this.length)throw new RangeError("out of range index");if(n>=i&&t>=r)return 0;if(n>=i)return-1;if(t>=r)return 1;if(t>>>=0,r>>>=0,n>>>=0,i>>>=0,this===e)return 0;for(var o=i-n,a=r-t,u=Math.min(o,a),l=this.slice(n,i),c=e.slice(t,r),f=0;u>f;++f)if(l[f]!==c[f]){o=l[f],a=c[f];break}return a>o?-1:o>a?1:0},s.prototype.includes=function(e,t,r){return-1!==this.indexOf(e,t,r)},s.prototype.indexOf=function(e,t,r){return b(this,e,t,r,!0)},s.prototype.lastIndexOf=function(e,t,r){return b(this,e,t,r,!1)},s.prototype.write=function(e,t,r,n){if(void 0===t)n="utf8",r=this.length,t=0;else if(void 0===r&&"string"==typeof t)n=t,r=this.length,t=0;else{if(!isFinite(t))throw new Error("Buffer.write(string, encoding, offset[, length]) is no longer supported");t=0|t,isFinite(r)?(r=0|r,void 0===n&&(n="utf8")):(n=r,r=void 0)}var i=this.length-t;if((void 0===r||r>i)&&(r=i),e.length>0&&(0>r||0>t)||t>this.length)throw new RangeError("Attempt to write outside buffer bounds");n||(n="utf8");for(var o=!1;;)switch(n){case"hex":return w(this,e,t,r);case"utf8":case"utf-8":return k(this,e,t,r);case"ascii":return A(this,e,t,r);case"latin1":case"binary":return T(this,e,t,r);case"base64":return E(this,e,t,r);case"ucs2":case"ucs-2":case"utf16le":case"utf-16le":return S(this,e,t,r);default:if(o)throw new TypeError("Unknown encoding: "+n);n=(""+n).toLowerCase(),o=!0}},s.prototype.toJSON=function(){return{type:"Buffer",data:Array.prototype.slice.call(this._arr||this,0)}};var et=4096;s.prototype.slice=function(e,t){var r=this.length;e=~~e,t=void 0===t?r:~~t,0>e?(e+=r,0>e&&(e=0)):e>r&&(e=r),0>t?(t+=r,0>t&&(t=0)):t>r&&(t=r),e>t&&(t=e);var n;if(s.TYPED_ARRAY_SUPPORT)n=this.subarray(e,t),n.__proto__=s.prototype;else{var i=t-e;n=new s(i,void 0);for(var o=0;i>o;++o)n[o]=this[o+e]}return n},s.prototype.readUIntLE=function(e,t,r){e=0|e,t=0|t,r||L(e,t,this.length);for(var n=this[e],i=1,o=0;++o0&&(i*=256);)n+=this[e+--t]*i;return n},s.prototype.readUInt8=function(e,t){return t||L(e,1,this.length),this[e]},s.prototype.readUInt16LE=function(e,t){return t||L(e,2,this.length),this[e]|this[e+1]<<8},s.prototype.readUInt16BE=function(e,t){return t||L(e,2,this.length),this[e]<<8|this[e+1]},s.prototype.readUInt32LE=function(e,t){return t||L(e,4,this.length),(this[e]|this[e+1]<<8|this[e+2]<<16)+16777216*this[e+3]},s.prototype.readUInt32BE=function(e,t){return t||L(e,4,this.length),16777216*this[e]+(this[e+1]<<16|this[e+2]<<8|this[e+3])},s.prototype.readIntLE=function(e,t,r){e=0|e,t=0|t,r||L(e,t,this.length);for(var n=this[e],i=1,o=0;++o=i&&(n-=Math.pow(2,8*t)),n},s.prototype.readIntBE=function(e,t,r){e=0|e,t=0|t,r||L(e,t,this.length);for(var n=t,i=1,o=this[e+--n];n>0&&(i*=256);)o+=this[e+--n]*i;return i*=128,o>=i&&(o-=Math.pow(2,8*t)),o},s.prototype.readInt8=function(e,t){return t||L(e,1,this.length),128&this[e]?-1*(255-this[e]+1):this[e]},s.prototype.readInt16LE=function(e,t){t||L(e,2,this.length);var r=this[e]|this[e+1]<<8;return 32768&r?4294901760|r:r},s.prototype.readInt16BE=function(e,t){t||L(e,2,this.length);var r=this[e+1]|this[e]<<8;return 32768&r?4294901760|r:r},s.prototype.readInt32LE=function(e,t){return t||L(e,4,this.length),this[e]|this[e+1]<<8|this[e+2]<<16|this[e+3]<<24},s.prototype.readInt32BE=function(e,t){return t||L(e,4,this.length),this[e]<<24|this[e+1]<<16|this[e+2]<<8|this[e+3]},s.prototype.readFloatLE=function(e,t){return t||L(e,4,this.length),$.read(this,e,!0,23,4)},s.prototype.readFloatBE=function(e,t){return t||L(e,4,this.length),$.read(this,e,!1,23,4)},s.prototype.readDoubleLE=function(e,t){return t||L(e,8,this.length),$.read(this,e,!0,52,8)},s.prototype.readDoubleBE=function(e,t){return t||L(e,8,this.length),$.read(this,e,!1,52,8)},s.prototype.writeUIntLE=function(e,t,r,n){if(e=+e,t=0|t,r=0|r,!n){var i=Math.pow(2,8*r)-1;I(this,e,t,r,i,0)}var o=1,s=0;for(this[t]=255&e;++s=0&&(s*=256);)this[t+o]=e/s&255;return t+r},s.prototype.writeUInt8=function(e,t,r){return e=+e,t=0|t,r||I(this,e,t,1,255,0),s.TYPED_ARRAY_SUPPORT||(e=Math.floor(e)),this[t]=255&e,t+1},s.prototype.writeUInt16LE=function(e,t,r){return e=+e,t=0|t,r||I(this,e,t,2,65535,0),s.TYPED_ARRAY_SUPPORT?(this[t]=255&e,this[t+1]=e>>>8):C(this,e,t,!0),t+2},s.prototype.writeUInt16BE=function(e,t,r){return e=+e,t=0|t,r||I(this,e,t,2,65535,0),s.TYPED_ARRAY_SUPPORT?(this[t]=e>>>8,this[t+1]=255&e):C(this,e,t,!1),t+2},s.prototype.writeUInt32LE=function(e,t,r){return e=+e,t=0|t,r||I(this,e,t,4,4294967295,0),s.TYPED_ARRAY_SUPPORT?(this[t+3]=e>>>24,this[t+2]=e>>>16,this[t+1]=e>>>8,this[t]=255&e):F(this,e,t,!0),t+4},s.prototype.writeUInt32BE=function(e,t,r){return e=+e,t=0|t,r||I(this,e,t,4,4294967295,0),s.TYPED_ARRAY_SUPPORT?(this[t]=e>>>24,this[t+1]=e>>>16,this[t+2]=e>>>8,this[t+3]=255&e):F(this,e,t,!1),t+4},s.prototype.writeIntLE=function(e,t,r,n){if(e=+e,t=0|t,!n){var i=Math.pow(2,8*r-1);I(this,e,t,r,i-1,-i)}var o=0,s=1,a=0;for(this[t]=255&e;++oe&&0===a&&0!==this[t+o-1]&&(a=1),this[t+o]=(e/s>>0)-a&255;return t+r},s.prototype.writeIntBE=function(e,t,r,n){if(e=+e,t=0|t,!n){var i=Math.pow(2,8*r-1);I(this,e,t,r,i-1,-i)}var o=r-1,s=1,a=0;for(this[t+o]=255&e;--o>=0&&(s*=256);)0>e&&0===a&&0!==this[t+o+1]&&(a=1),this[t+o]=(e/s>>0)-a&255;return t+r},s.prototype.writeInt8=function(e,t,r){return e=+e,t=0|t,r||I(this,e,t,1,127,-128),s.TYPED_ARRAY_SUPPORT||(e=Math.floor(e)),0>e&&(e=255+e+1),this[t]=255&e,t+1},s.prototype.writeInt16LE=function(e,t,r){return e=+e,t=0|t,r||I(this,e,t,2,32767,-32768),s.TYPED_ARRAY_SUPPORT?(this[t]=255&e,this[t+1]=e>>>8):C(this,e,t,!0),t+2},s.prototype.writeInt16BE=function(e,t,r){return e=+e,t=0|t,r||I(this,e,t,2,32767,-32768),s.TYPED_ARRAY_SUPPORT?(this[t]=e>>>8,this[t+1]=255&e):C(this,e,t,!1),t+2},s.prototype.writeInt32LE=function(e,t,r){return e=+e,t=0|t,r||I(this,e,t,4,2147483647,-2147483648),s.TYPED_ARRAY_SUPPORT?(this[t]=255&e,this[t+1]=e>>>8,this[t+2]=e>>>16,this[t+3]=e>>>24):F(this,e,t,!0),t+4},s.prototype.writeInt32BE=function(e,t,r){return e=+e,t=0|t,r||I(this,e,t,4,2147483647,-2147483648),0>e&&(e=4294967295+e+1),s.TYPED_ARRAY_SUPPORT?(this[t]=e>>>24,this[t+1]=e>>>16,this[t+2]=e>>>8,this[t+3]=255&e):F(this,e,t,!1),t+4},s.prototype.writeFloatLE=function(e,t,r){return D(this,e,t,!0,r)},s.prototype.writeFloatBE=function(e,t,r){return D(this,e,t,!1,r)},s.prototype.writeDoubleLE=function(e,t,r){return B(this,e,t,!0,r)},s.prototype.writeDoubleBE=function(e,t,r){return B(this,e,t,!1,r)},s.prototype.copy=function(e,t,r,n){if(r||(r=0),n||0===n||(n=this.length),t>=e.length&&(t=e.length),t||(t=0),n>0&&r>n&&(n=r),n===r)return 0;if(0===e.length||0===this.length)return 0;if(0>t)throw new RangeError("targetStart out of bounds");if(0>r||r>=this.length)throw new RangeError("sourceStart out of bounds");if(0>n)throw new RangeError("sourceEnd out of bounds");n>this.length&&(n=this.length),e.length-tr&&n>t)for(i=o-1;i>=0;--i)e[i+t]=this[i+r];else if(1e3>o||!s.TYPED_ARRAY_SUPPORT)for(i=0;o>i;++i)e[i+t]=this[i+r];else Uint8Array.prototype.set.call(e,this.subarray(r,r+o),t);return o},s.prototype.fill=function(e,t,r,n){if("string"==typeof e){if("string"==typeof t?(n=t,t=0,r=this.length):"string"==typeof r&&(n=r,r=this.length),1===e.length){var i=e.charCodeAt(0);256>i&&(e=i)}if(void 0!==n&&"string"!=typeof n)throw new TypeError("encoding must be a string");if("string"==typeof n&&!s.isEncoding(n))throw new TypeError("Unknown encoding: "+n)}else"number"==typeof e&&(e=255&e);if(0>t||this.length=r)return this;t>>>=0,r=void 0===r?this.length:r>>>0,e||(e=0);var o;if("number"==typeof e)for(o=t;r>o;++o)this[o]=e;else{var a=s.isBuffer(e)?e:W(new s(e,n).toString()),u=a.length;for(o=0;r-t>o;++o)this[o+t]=a[o%u]}return this};var tt=/[^+\/0-9A-Za-z-_]/g}).call(this,"undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{"base64-js":3,ieee754:4,isarray:5}],3:[function(e,t,r){"use strict";function n(e){var t=e.length;if(t%4>0)throw new Error("Invalid string. Length must be a multiple of 4");return"="===e[t-2]?2:"="===e[t-1]?1:0}function i(e){return 3*e.length/4-n(e)}function o(e){var t,r,i,o,s,a,u=e.length;s=n(e),a=new f(3*u/4-s),i=s>0?u-4:u;var l=0;for(t=0,r=0;i>t;t+=4,r+=3)o=c[e.charCodeAt(t)]<<18|c[e.charCodeAt(t+1)]<<12|c[e.charCodeAt(t+2)]<<6|c[e.charCodeAt(t+3)],a[l++]=o>>16&255,a[l++]=o>>8&255,a[l++]=255&o;return 2===s?(o=c[e.charCodeAt(t)]<<2|c[e.charCodeAt(t+1)]>>4,a[l++]=255&o):1===s&&(o=c[e.charCodeAt(t)]<<10|c[e.charCodeAt(t+1)]<<4|c[e.charCodeAt(t+2)]>>2,a[l++]=o>>8&255,a[l++]=255&o),a}function s(e){return l[e>>18&63]+l[e>>12&63]+l[e>>6&63]+l[63&e]}function a(e,t,r){for(var n,i=[],o=t;r>o;o+=3)n=(e[o]<<16)+(e[o+1]<<8)+e[o+2],i.push(s(n));return i.join("")}function u(e){for(var t,r=e.length,n=r%3,i="",o=[],s=16383,u=0,c=r-n;c>u;u+=s)o.push(a(e,u,u+s>c?c:u+s));return 1===n?(t=e[r-1],i+=l[t>>2],i+=l[t<<4&63],i+="=="):2===n&&(t=(e[r-2]<<8)+e[r-1],i+=l[t>>10],i+=l[t>>4&63],i+=l[t<<2&63],i+="="),o.push(i),o.join("")}r.byteLength=i,r.toByteArray=o,r.fromByteArray=u;for(var l=[],c=[],f="undefined"!=typeof Uint8Array?Uint8Array:Array,h="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",d=0,p=h.length;p>d;++d)l[d]=h[d],c[h.charCodeAt(d)]=d;c["-".charCodeAt(0)]=62,c["_".charCodeAt(0)]=63},{}],4:[function(e,t,r){r.read=function(e,t,r,n,i){var o,s,a=8*i-n-1,u=(1<>1,c=-7,f=r?i-1:0,h=r?-1:1,d=e[t+f];for(f+=h,o=d&(1<<-c)-1,d>>=-c,c+=a;c>0;o=256*o+e[t+f],f+=h,c-=8);for(s=o&(1<<-c)-1,o>>=-c,c+=n;c>0;s=256*s+e[t+f],f+=h,c-=8);if(0===o)o=1-l;else{if(o===u)return s?0/0:1/0*(d?-1:1);s+=Math.pow(2,n),o-=l}return(d?-1:1)*s*Math.pow(2,o-n)},r.write=function(e,t,r,n,i,o){var s,a,u,l=8*o-i-1,c=(1<>1,h=23===i?Math.pow(2,-24)-Math.pow(2,-77):0,d=n?0:o-1,p=n?1:-1,_=0>t||0===t&&0>1/t?1:0;for(t=Math.abs(t),isNaN(t)||1/0===t?(a=isNaN(t)?1:0,s=c):(s=Math.floor(Math.log(t)/Math.LN2),t*(u=Math.pow(2,-s))<1&&(s--,u*=2),t+=s+f>=1?h/u:h*Math.pow(2,1-f),t*u>=2&&(s++,u/=2),s+f>=c?(a=0,s=c):s+f>=1?(a=(t*u-1)*Math.pow(2,i),s+=f):(a=t*Math.pow(2,f-1)*Math.pow(2,i),s=0));i>=8;e[r+d]=255&a,d+=p,a/=256,i-=8);for(s=s<0;e[r+d]=255&s,d+=p,s/=256,l-=8);e[r+d-p]|=128*_}},{}],5:[function(e,t){var r={}.toString;t.exports=Array.isArray||function(e){return"[object Array]"==r.call(e)}},{}],6:[function(e,t){function r(){this._events=this._events||{},this._maxListeners=this._maxListeners||void 0}function n(e){return"function"==typeof e}function i(e){return"number"==typeof e}function o(e){return"object"==typeof e&&null!==e}function s(e){return void 0===e}t.exports=r,r.EventEmitter=r,r.prototype._events=void 0,r.prototype._maxListeners=void 0,r.defaultMaxListeners=10,r.prototype.setMaxListeners=function(e){if(!i(e)||0>e||isNaN(e))throw TypeError("n must be a positive number");return this._maxListeners=e,this},r.prototype.emit=function(e){var t,r,i,a,u,l;if(this._events||(this._events={}),"error"===e&&(!this._events.error||o(this._events.error)&&!this._events.error.length)){if(t=arguments[1],t instanceof Error)throw t;var c=new Error('Uncaught, unspecified "error" event. ('+t+")");throw c.context=t,c}if(r=this._events[e],s(r))return!1;if(n(r))switch(arguments.length){case 1:r.call(this);break;case 2:r.call(this,arguments[1]);break;case 3:r.call(this,arguments[1],arguments[2]);break;default:a=Array.prototype.slice.call(arguments,1),r.apply(this,a)}else if(o(r))for(a=Array.prototype.slice.call(arguments,1),l=r.slice(),i=l.length,u=0;i>u;u++)l[u].apply(this,a);return!0},r.prototype.addListener=function(e,t){var i;if(!n(t))throw TypeError("listener must be a function");return this._events||(this._events={}),this._events.newListener&&this.emit("newListener",e,n(t.listener)?t.listener:t),this._events[e]?o(this._events[e])?this._events[e].push(t):this._events[e]=[this._events[e],t]:this._events[e]=t,o(this._events[e])&&!this._events[e].warned&&(i=s(this._maxListeners)?r.defaultMaxListeners:this._maxListeners,i&&i>0&&this._events[e].length>i&&(this._events[e].warned=!0,console.error("(node) warning: possible EventEmitter memory leak detected. %d listeners added. Use emitter.setMaxListeners() to increase limit.",this._events[e].length),"function"==typeof console.trace&&console.trace())),this},r.prototype.on=r.prototype.addListener,r.prototype.once=function(e,t){function r(){this.removeListener(e,r),i||(i=!0,t.apply(this,arguments))}if(!n(t))throw TypeError("listener must be a function");var i=!1;return r.listener=t,this.on(e,r),this},r.prototype.removeListener=function(e,t){var r,i,s,a;if(!n(t))throw TypeError("listener must be a function");if(!this._events||!this._events[e])return this;if(r=this._events[e],s=r.length,i=-1,r===t||n(r.listener)&&r.listener===t)delete this._events[e],this._events.removeListener&&this.emit("removeListener",e,t);else if(o(r)){for(a=s;a-->0;)if(r[a]===t||r[a].listener&&r[a].listener===t){i=a;break}if(0>i)return this;1===r.length?(r.length=0,delete this._events[e]):r.splice(i,1),this._events.removeListener&&this.emit("removeListener",e,t)}return this},r.prototype.removeAllListeners=function(e){var t,r;if(!this._events)return this;if(!this._events.removeListener)return 0===arguments.length?this._events={}:this._events[e]&&delete this._events[e],this;if(0===arguments.length){for(t in this._events)"removeListener"!==t&&this.removeAllListeners(t);return this.removeAllListeners("removeListener"),this._events={},this}if(r=this._events[e],n(r))this.removeListener(e,r);else if(r)for(;r.length;)this.removeListener(e,r[r.length-1]);return delete this._events[e],this},r.prototype.listeners=function(e){var t;return t=this._events&&this._events[e]?n(this._events[e])?[this._events[e]]:this._events[e].slice():[]},r.prototype.listenerCount=function(e){if(this._events){var t=this._events[e];if(n(t))return 1;if(t)return t.length}return 0},r.listenerCount=function(e,t){return e.listenerCount(t)}},{}],7:[function(e,t){function r(e){return!!e.constructor&&"function"==typeof e.constructor.isBuffer&&e.constructor.isBuffer(e)}function n(e){return"function"==typeof e.readFloatLE&&"function"==typeof e.slice&&r(e.slice(0,0))}t.exports=function(e){return null!=e&&(r(e)||n(e)||!!e._isBuffer)}},{}],8:[function(e,t){function r(){throw new Error("setTimeout has not been defined")}function n(){throw new Error("clearTimeout has not been defined")}function i(e){if(c===setTimeout)return setTimeout(e,0);if((c===r||!c)&&setTimeout)return c=setTimeout,setTimeout(e,0);try{return c(e,0)}catch(t){try{return c.call(null,e,0)}catch(t){return c.call(this,e,0)}}}function o(e){if(f===clearTimeout)return clearTimeout(e);if((f===n||!f)&&clearTimeout)return f=clearTimeout,clearTimeout(e);try{return f(e)}catch(t){try{return f.call(null,e)}catch(t){return f.call(this,e)}}}function s(){_&&d&&(_=!1,d.length?p=d.concat(p):m=-1,p.length&&a())}function a(){if(!_){var e=i(s);_=!0;for(var t=p.length;t;){for(d=p,p=[];++m1)for(var r=1;r=3&&(n.depth=arguments[2]),arguments.length>=4&&(n.colors=arguments[3]),_(t)?n.showHidden=t:t&&r._extend(n,t),x(n.showHidden)&&(n.showHidden=!1),x(n.depth)&&(n.depth=2),x(n.colors)&&(n.colors=!1),x(n.customInspect)&&(n.customInspect=!0),n.colors&&(n.stylize=o),u(n,e,n.depth)}function o(e,t){var r=i.styles[t];return r?"["+i.colors[r][0]+"m"+e+"["+i.colors[r][1]+"m":e}function s(e){return e}function a(e){var t={};return e.forEach(function(e){t[e]=!0}),t}function u(e,t,n){if(e.customInspect&&t&&E(t.inspect)&&t.inspect!==r.inspect&&(!t.constructor||t.constructor.prototype!==t)){var i=t.inspect(n,e);return y(i)||(i=u(e,i,n)),i}var o=l(e,t);if(o)return o;var s=Object.keys(t),_=a(s);if(e.showHidden&&(s=Object.getOwnPropertyNames(t)),T(t)&&(s.indexOf("message")>=0||s.indexOf("description")>=0))return c(t);if(0===s.length){if(E(t)){var m=t.name?": "+t.name:"";return e.stylize("[Function"+m+"]","special")}if(w(t))return e.stylize(RegExp.prototype.toString.call(t),"regexp");if(A(t))return e.stylize(Date.prototype.toString.call(t),"date");if(T(t))return c(t)}var g="",v=!1,b=["{","}"];if(p(t)&&(v=!0,b=["[","]"]),E(t)){var x=t.name?": "+t.name:"";g=" [Function"+x+"]"}if(w(t)&&(g=" "+RegExp.prototype.toString.call(t)),A(t)&&(g=" "+Date.prototype.toUTCString.call(t)),T(t)&&(g=" "+c(t)),0===s.length&&(!v||0==t.length))return b[0]+g+b[1];if(0>n)return w(t)?e.stylize(RegExp.prototype.toString.call(t),"regexp"):e.stylize("[Object]","special");e.seen.push(t);var k;return k=v?f(e,t,n,_,s):s.map(function(r){return h(e,t,n,_,r,v)}),e.seen.pop(),d(k,g,b)}function l(e,t){if(x(t))return e.stylize("undefined","undefined");if(y(t)){var r="'"+JSON.stringify(t).replace(/^"|"$/g,"").replace(/'/g,"\\'").replace(/\\"/g,'"')+"'";return e.stylize(r,"string")}return v(t)?e.stylize(""+t,"number"):_(t)?e.stylize(""+t,"boolean"):m(t)?e.stylize("null","null"):void 0}function c(e){return"["+Error.prototype.toString.call(e)+"]"}function f(e,t,r,n,i){for(var o=[],s=0,a=t.length;a>s;++s)o.push(O(t,String(s))?h(e,t,r,n,String(s),!0):"");return i.forEach(function(i){i.match(/^\d+$/)||o.push(h(e,t,r,n,i,!0))}),o}function h(e,t,r,n,i,o){var s,a,l;if(l=Object.getOwnPropertyDescriptor(t,i)||{value:t[i]},l.get?a=l.set?e.stylize("[Getter/Setter]","special"):e.stylize("[Getter]","special"):l.set&&(a=e.stylize("[Setter]","special")),O(n,i)||(s="["+i+"]"),a||(e.seen.indexOf(l.value)<0?(a=m(r)?u(e,l.value,null):u(e,l.value,r-1),a.indexOf("\n")>-1&&(a=o?a.split("\n").map(function(e){return" "+e}).join("\n").substr(2):"\n"+a.split("\n").map(function(e){return" "+e}).join("\n"))):a=e.stylize("[Circular]","special")),x(s)){if(o&&i.match(/^\d+$/))return a;s=JSON.stringify(""+i),s.match(/^"([a-zA-Z_][a-zA-Z_0-9]*)"$/)?(s=s.substr(1,s.length-2),s=e.stylize(s,"name")):(s=s.replace(/'/g,"\\'").replace(/\\"/g,'"').replace(/(^"|"$)/g,"'"),s=e.stylize(s,"string")) -}return s+": "+a}function d(e,t,r){var n=0,i=e.reduce(function(e,t){return n++,t.indexOf("\n")>=0&&n++,e+t.replace(/\u001b\[\d\d?m/g,"").length+1},0);return i>60?r[0]+(""===t?"":t+"\n ")+" "+e.join(",\n ")+" "+r[1]:r[0]+t+" "+e.join(", ")+" "+r[1]}function p(e){return Array.isArray(e)}function _(e){return"boolean"==typeof e}function m(e){return null===e}function g(e){return null==e}function v(e){return"number"==typeof e}function y(e){return"string"==typeof e}function b(e){return"symbol"==typeof e}function x(e){return void 0===e}function w(e){return k(e)&&"[object RegExp]"===R(e)}function k(e){return"object"==typeof e&&null!==e}function A(e){return k(e)&&"[object Date]"===R(e)}function T(e){return k(e)&&("[object Error]"===R(e)||e instanceof Error)}function E(e){return"function"==typeof e}function S(e){return null===e||"boolean"==typeof e||"number"==typeof e||"string"==typeof e||"symbol"==typeof e||"undefined"==typeof e}function R(e){return Object.prototype.toString.call(e)}function M(e){return 10>e?"0"+e.toString(10):e.toString(10)}function P(){var e=new Date,t=[M(e.getHours()),M(e.getMinutes()),M(e.getSeconds())].join(":");return[e.getDate(),L[e.getMonth()],t].join(" ")}function O(e,t){return Object.prototype.hasOwnProperty.call(e,t)}var z=/%[sdj%]/g;r.format=function(e){if(!y(e)){for(var t=[],r=0;r=o)return e;switch(e){case"%s":return String(n[r++]);case"%d":return Number(n[r++]);case"%j":try{return JSON.stringify(n[r++])}catch(t){return"[Circular]"}default:return e}}),a=n[r];o>r;a=n[++r])s+=m(a)||!k(a)?" "+a:" "+i(a);return s},r.deprecate=function(e,i){function o(){if(!s){if(t.throwDeprecation)throw new Error(i);t.traceDeprecation?console.trace(i):console.error(i),s=!0}return e.apply(this,arguments)}if(x(n.process))return function(){return r.deprecate(e,i).apply(this,arguments)};if(t.noDeprecation===!0)return e;var s=!1;return o};var N,j={};r.debuglog=function(e){if(x(N)&&(N=t.env.NODE_DEBUG||""),e=e.toUpperCase(),!j[e])if(new RegExp("\\b"+e+"\\b","i").test(N)){var n=t.pid;j[e]=function(){var t=r.format.apply(r,arguments);console.error("%s %d: %s",e,n,t)}}else j[e]=function(){};return j[e]},r.inspect=i,i.colors={bold:[1,22],italic:[3,23],underline:[4,24],inverse:[7,27],white:[37,39],grey:[90,39],black:[30,39],blue:[34,39],cyan:[36,39],green:[32,39],magenta:[35,39],red:[31,39],yellow:[33,39]},i.styles={special:"cyan",number:"yellow","boolean":"yellow",undefined:"grey","null":"bold",string:"green",date:"magenta",regexp:"red"},r.isArray=p,r.isBoolean=_,r.isNull=m,r.isNullOrUndefined=g,r.isNumber=v,r.isString=y,r.isSymbol=b,r.isUndefined=x,r.isRegExp=w,r.isObject=k,r.isDate=A,r.isError=T,r.isFunction=E,r.isPrimitive=S,r.isBuffer=e("./support/isBuffer");var L=["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"];r.log=function(){console.log("%s - %s",P(),r.format.apply(r,arguments))},r.inherits=e("inherits"),r._extend=function(e,t){if(!t||!k(t))return e;for(var r=Object.keys(t),n=r.length;n--;)e[r[n]]=t[r[n]];return e}}).call(this,e("_process"),"undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{"./support/isBuffer":10,_process:8,inherits:9}],12:[function(e,t){e("../modules/es6.object.to-string"),e("../modules/es6.string.iterator"),e("../modules/web.dom.iterable"),e("../modules/es6.promise"),t.exports=e("../modules/_core").Promise},{"../modules/_core":20,"../modules/es6.object.to-string":72,"../modules/es6.promise":73,"../modules/es6.string.iterator":74,"../modules/web.dom.iterable":75}],13:[function(e,t){t.exports=function(e){if("function"!=typeof e)throw TypeError(e+" is not a function!");return e}},{}],14:[function(e,t){var r=e("./_wks")("unscopables"),n=Array.prototype;void 0==n[r]&&e("./_hide")(n,r,{}),t.exports=function(e){n[r][e]=!0}},{"./_hide":31,"./_wks":69}],15:[function(e,t){t.exports=function(e,t,r,n){if(!(e instanceof t)||void 0!==n&&n in e)throw TypeError(r+": incorrect invocation!");return e}},{}],16:[function(e,t){var r=e("./_is-object");t.exports=function(e){if(!r(e))throw TypeError(e+" is not an object!");return e}},{"./_is-object":37}],17:[function(e,t){var r=e("./_to-iobject"),n=e("./_to-length"),i=e("./_to-index");t.exports=function(e){return function(t,o,s){var a,u=r(t),l=n(u.length),c=i(s,l);if(e&&o!=o){for(;l>c;)if(a=u[c++],a!=a)return!0}else for(;l>c;c++)if((e||c in u)&&u[c]===o)return e||c||0;return!e&&-1}}},{"./_to-index":62,"./_to-iobject":64,"./_to-length":65}],18:[function(e,t){var r=e("./_cof"),n=e("./_wks")("toStringTag"),i="Arguments"==r(function(){return arguments}()),o=function(e,t){try{return e[t]}catch(r){}};t.exports=function(e){var t,s,a;return void 0===e?"Undefined":null===e?"Null":"string"==typeof(s=o(t=Object(e),n))?s:i?r(t):"Object"==(a=r(t))&&"function"==typeof t.callee?"Arguments":a}},{"./_cof":19,"./_wks":69}],19:[function(e,t){var r={}.toString;t.exports=function(e){return r.call(e).slice(8,-1)}},{}],20:[function(e,t){var r=t.exports={version:"2.4.0"};"number"==typeof __e&&(__e=r)},{}],21:[function(e,t){var r=e("./_a-function");t.exports=function(e,t,n){if(r(e),void 0===t)return e;switch(n){case 1:return function(r){return e.call(t,r)};case 2:return function(r,n){return e.call(t,r,n)};case 3:return function(r,n,i){return e.call(t,r,n,i)}}return function(){return e.apply(t,arguments)}}},{"./_a-function":13}],22:[function(e,t){t.exports=function(e){if(void 0==e)throw TypeError("Can't call method on "+e);return e}},{}],23:[function(e,t){t.exports=!e("./_fails")(function(){return 7!=Object.defineProperty({},"a",{get:function(){return 7}}).a})},{"./_fails":27}],24:[function(e,t){var r=e("./_is-object"),n=e("./_global").document,i=r(n)&&r(n.createElement);t.exports=function(e){return i?n.createElement(e):{}}},{"./_global":29,"./_is-object":37}],25:[function(e,t){t.exports="constructor,hasOwnProperty,isPrototypeOf,propertyIsEnumerable,toLocaleString,toString,valueOf".split(",")},{}],26:[function(e,t){var r=e("./_global"),n=e("./_core"),i=e("./_hide"),o=e("./_redefine"),s=e("./_ctx"),a="prototype",u=function(e,t,l){var c,f,h,d,p=e&u.F,_=e&u.G,m=e&u.S,g=e&u.P,v=e&u.B,y=_?r:m?r[t]||(r[t]={}):(r[t]||{})[a],b=_?n:n[t]||(n[t]={}),x=b[a]||(b[a]={});_&&(l=t);for(c in l)f=!p&&y&&void 0!==y[c],h=(f?y:l)[c],d=v&&f?s(h,r):g&&"function"==typeof h?s(Function.call,h):h,y&&o(y,c,h,e&u.U),b[c]!=h&&i(b,c,d),g&&x[c]!=h&&(x[c]=h)};r.core=n,u.F=1,u.G=2,u.S=4,u.P=8,u.B=16,u.W=32,u.U=64,u.R=128,t.exports=u},{"./_core":20,"./_ctx":21,"./_global":29,"./_hide":31,"./_redefine":54}],27:[function(e,t){t.exports=function(e){try{return!!e()}catch(t){return!0}}},{}],28:[function(e,t,r){var n=e("./_ctx"),i=e("./_iter-call"),o=e("./_is-array-iter"),s=e("./_an-object"),a=e("./_to-length"),u=e("./core.get-iterator-method"),l={},c={},r=t.exports=function(e,t,r,f,h){var d,p,_,m,g=h?function(){return e}:u(e),v=n(r,f,t?2:1),y=0;if("function"!=typeof g)throw TypeError(e+" is not iterable!");if(o(g)){for(d=a(e.length);d>y;y++)if(m=t?v(s(p=e[y])[0],p[1]):v(e[y]),m===l||m===c)return m}else for(_=g.call(e);!(p=_.next()).done;)if(m=i(_,v,p.value,t),m===l||m===c)return m};r.BREAK=l,r.RETURN=c},{"./_an-object":16,"./_ctx":21,"./_is-array-iter":36,"./_iter-call":38,"./_to-length":65,"./core.get-iterator-method":70}],29:[function(e,t){var r=t.exports="undefined"!=typeof window&&window.Math==Math?window:"undefined"!=typeof self&&self.Math==Math?self:Function("return this")();"number"==typeof __g&&(__g=r)},{}],30:[function(e,t){var r={}.hasOwnProperty;t.exports=function(e,t){return r.call(e,t)}},{}],31:[function(e,t){var r=e("./_object-dp"),n=e("./_property-desc");t.exports=e("./_descriptors")?function(e,t,i){return r.f(e,t,n(1,i))}:function(e,t,r){return e[t]=r,e}},{"./_descriptors":23,"./_object-dp":47,"./_property-desc":52}],32:[function(e,t){t.exports=e("./_global").document&&document.documentElement},{"./_global":29}],33:[function(e,t){t.exports=!e("./_descriptors")&&!e("./_fails")(function(){return 7!=Object.defineProperty(e("./_dom-create")("div"),"a",{get:function(){return 7}}).a})},{"./_descriptors":23,"./_dom-create":24,"./_fails":27}],34:[function(e,t){t.exports=function(e,t,r){var n=void 0===r;switch(t.length){case 0:return n?e():e.call(r);case 1:return n?e(t[0]):e.call(r,t[0]);case 2:return n?e(t[0],t[1]):e.call(r,t[0],t[1]);case 3:return n?e(t[0],t[1],t[2]):e.call(r,t[0],t[1],t[2]);case 4:return n?e(t[0],t[1],t[2],t[3]):e.call(r,t[0],t[1],t[2],t[3])}return e.apply(r,t)}},{}],35:[function(e,t){var r=e("./_cof");t.exports=Object("z").propertyIsEnumerable(0)?Object:function(e){return"String"==r(e)?e.split(""):Object(e)}},{"./_cof":19}],36:[function(e,t){var r=e("./_iterators"),n=e("./_wks")("iterator"),i=Array.prototype;t.exports=function(e){return void 0!==e&&(r.Array===e||i[n]===e)}},{"./_iterators":43,"./_wks":69}],37:[function(e,t){t.exports=function(e){return"object"==typeof e?null!==e:"function"==typeof e}},{}],38:[function(e,t){var r=e("./_an-object");t.exports=function(e,t,n,i){try{return i?t(r(n)[0],n[1]):t(n)}catch(o){var s=e["return"];throw void 0!==s&&r(s.call(e)),o}}},{"./_an-object":16}],39:[function(e,t){"use strict";var r=e("./_object-create"),n=e("./_property-desc"),i=e("./_set-to-string-tag"),o={};e("./_hide")(o,e("./_wks")("iterator"),function(){return this}),t.exports=function(e,t,s){e.prototype=r(o,{next:n(1,s)}),i(e,t+" Iterator")}},{"./_hide":31,"./_object-create":46,"./_property-desc":52,"./_set-to-string-tag":56,"./_wks":69}],40:[function(e,t){"use strict";var r=e("./_library"),n=e("./_export"),i=e("./_redefine"),o=e("./_hide"),s=e("./_has"),a=e("./_iterators"),u=e("./_iter-create"),l=e("./_set-to-string-tag"),c=e("./_object-gpo"),f=e("./_wks")("iterator"),h=!([].keys&&"next"in[].keys()),d="@@iterator",p="keys",_="values",m=function(){return this};t.exports=function(e,t,g,v,y,b,x){u(g,t,v);var w,k,A,T=function(e){if(!h&&e in M)return M[e];switch(e){case p:return function(){return new g(this,e)};case _:return function(){return new g(this,e)}}return function(){return new g(this,e)}},E=t+" Iterator",S=y==_,R=!1,M=e.prototype,P=M[f]||M[d]||y&&M[y],O=P||T(y),z=y?S?T("entries"):O:void 0,N="Array"==t?M.entries||P:P;if(N&&(A=c(N.call(new e)),A!==Object.prototype&&(l(A,E,!0),r||s(A,f)||o(A,f,m))),S&&P&&P.name!==_&&(R=!0,O=function(){return P.call(this)}),r&&!x||!h&&!R&&M[f]||o(M,f,O),a[t]=O,a[E]=m,y)if(w={values:S?O:T(_),keys:b?O:T(p),entries:z},x)for(k in w)k in M||i(M,k,w[k]);else n(n.P+n.F*(h||R),t,w);return w}},{"./_export":26,"./_has":30,"./_hide":31,"./_iter-create":39,"./_iterators":43,"./_library":44,"./_object-gpo":49,"./_redefine":54,"./_set-to-string-tag":56,"./_wks":69}],41:[function(e,t){var r=e("./_wks")("iterator"),n=!1;try{var i=[7][r]();i["return"]=function(){n=!0},Array.from(i,function(){throw 2})}catch(o){}t.exports=function(e,t){if(!t&&!n)return!1;var i=!1;try{var o=[7],s=o[r]();s.next=function(){return{done:i=!0}},o[r]=function(){return s},e(o)}catch(a){}return i}},{"./_wks":69}],42:[function(e,t){t.exports=function(e,t){return{value:t,done:!!e}}},{}],43:[function(e,t){t.exports={}},{}],44:[function(e,t){t.exports=!1},{}],45:[function(e,t){var r=e("./_global"),n=e("./_task").set,i=r.MutationObserver||r.WebKitMutationObserver,o=r.process,s=r.Promise,a="process"==e("./_cof")(o);t.exports=function(){var e,t,u,l=function(){var r,n;for(a&&(r=o.domain)&&r.exit();e;){n=e.fn,e=e.next;try{n()}catch(i){throw e?u():t=void 0,i}}t=void 0,r&&r.enter()};if(a)u=function(){o.nextTick(l)};else if(i){var c=!0,f=document.createTextNode("");new i(l).observe(f,{characterData:!0}),u=function(){f.data=c=!c}}else if(s&&s.resolve){var h=s.resolve();u=function(){h.then(l)}}else u=function(){n.call(r,l)};return function(r){var n={fn:r,next:void 0};t&&(t.next=n),e||(e=n,u()),t=n}}},{"./_cof":19,"./_global":29,"./_task":61}],46:[function(e,t){var r=e("./_an-object"),n=e("./_object-dps"),i=e("./_enum-bug-keys"),o=e("./_shared-key")("IE_PROTO"),s=function(){},a="prototype",u=function(){var t,r=e("./_dom-create")("iframe"),n=i.length,o="<",s=">";for(r.style.display="none",e("./_html").appendChild(r),r.src="javascript:",t=r.contentWindow.document,t.open(),t.write(o+"script"+s+"document.F=Object"+o+"/script"+s),t.close(),u=t.F;n--;)delete u[a][i[n]];return u()};t.exports=Object.create||function(e,t){var i;return null!==e?(s[a]=r(e),i=new s,s[a]=null,i[o]=e):i=u(),void 0===t?i:n(i,t)}},{"./_an-object":16,"./_dom-create":24,"./_enum-bug-keys":25,"./_html":32,"./_object-dps":48,"./_shared-key":57}],47:[function(e,t,r){var n=e("./_an-object"),i=e("./_ie8-dom-define"),o=e("./_to-primitive"),s=Object.defineProperty;r.f=e("./_descriptors")?Object.defineProperty:function(e,t,r){if(n(e),t=o(t,!0),n(r),i)try{return s(e,t,r)}catch(a){}if("get"in r||"set"in r)throw TypeError("Accessors not supported!");return"value"in r&&(e[t]=r.value),e}},{"./_an-object":16,"./_descriptors":23,"./_ie8-dom-define":33,"./_to-primitive":67}],48:[function(e,t){var r=e("./_object-dp"),n=e("./_an-object"),i=e("./_object-keys");t.exports=e("./_descriptors")?Object.defineProperties:function(e,t){n(e);for(var o,s=i(t),a=s.length,u=0;a>u;)r.f(e,o=s[u++],t[o]);return e}},{"./_an-object":16,"./_descriptors":23,"./_object-dp":47,"./_object-keys":51}],49:[function(e,t){var r=e("./_has"),n=e("./_to-object"),i=e("./_shared-key")("IE_PROTO"),o=Object.prototype;t.exports=Object.getPrototypeOf||function(e){return e=n(e),r(e,i)?e[i]:"function"==typeof e.constructor&&e instanceof e.constructor?e.constructor.prototype:e instanceof Object?o:null}},{"./_has":30,"./_shared-key":57,"./_to-object":66}],50:[function(e,t){var r=e("./_has"),n=e("./_to-iobject"),i=e("./_array-includes")(!1),o=e("./_shared-key")("IE_PROTO");t.exports=function(e,t){var s,a=n(e),u=0,l=[];for(s in a)s!=o&&r(a,s)&&l.push(s);for(;t.length>u;)r(a,s=t[u++])&&(~i(l,s)||l.push(s));return l}},{"./_array-includes":17,"./_has":30,"./_shared-key":57,"./_to-iobject":64}],51:[function(e,t){var r=e("./_object-keys-internal"),n=e("./_enum-bug-keys");t.exports=Object.keys||function(e){return r(e,n)}},{"./_enum-bug-keys":25,"./_object-keys-internal":50}],52:[function(e,t){t.exports=function(e,t){return{enumerable:!(1&e),configurable:!(2&e),writable:!(4&e),value:t}}},{}],53:[function(e,t){var r=e("./_redefine");t.exports=function(e,t,n){for(var i in t)r(e,i,t[i],n);return e}},{"./_redefine":54}],54:[function(e,t){var r=e("./_global"),n=e("./_hide"),i=e("./_has"),o=e("./_uid")("src"),s="toString",a=Function[s],u=(""+a).split(s);e("./_core").inspectSource=function(e){return a.call(e)},(t.exports=function(e,t,s,a){var l="function"==typeof s;l&&(i(s,"name")||n(s,"name",t)),e[t]!==s&&(l&&(i(s,o)||n(s,o,e[t]?""+e[t]:u.join(String(t)))),e===r?e[t]=s:a?e[t]?e[t]=s:n(e,t,s):(delete e[t],n(e,t,s)))})(Function.prototype,s,function(){return"function"==typeof this&&this[o]||a.call(this)})},{"./_core":20,"./_global":29,"./_has":30,"./_hide":31,"./_uid":68}],55:[function(e,t){"use strict";var r=e("./_global"),n=e("./_object-dp"),i=e("./_descriptors"),o=e("./_wks")("species");t.exports=function(e){var t=r[e];i&&t&&!t[o]&&n.f(t,o,{configurable:!0,get:function(){return this}})}},{"./_descriptors":23,"./_global":29,"./_object-dp":47,"./_wks":69}],56:[function(e,t){var r=e("./_object-dp").f,n=e("./_has"),i=e("./_wks")("toStringTag");t.exports=function(e,t,o){e&&!n(e=o?e:e.prototype,i)&&r(e,i,{configurable:!0,value:t})}},{"./_has":30,"./_object-dp":47,"./_wks":69}],57:[function(e,t){var r=e("./_shared")("keys"),n=e("./_uid");t.exports=function(e){return r[e]||(r[e]=n(e))}},{"./_shared":58,"./_uid":68}],58:[function(e,t){var r=e("./_global"),n="__core-js_shared__",i=r[n]||(r[n]={});t.exports=function(e){return i[e]||(i[e]={})}},{"./_global":29}],59:[function(e,t){var r=e("./_an-object"),n=e("./_a-function"),i=e("./_wks")("species");t.exports=function(e,t){var o,s=r(e).constructor;return void 0===s||void 0==(o=r(s)[i])?t:n(o)}},{"./_a-function":13,"./_an-object":16,"./_wks":69}],60:[function(e,t){var r=e("./_to-integer"),n=e("./_defined");t.exports=function(e){return function(t,i){var o,s,a=String(n(t)),u=r(i),l=a.length;return 0>u||u>=l?e?"":void 0:(o=a.charCodeAt(u),55296>o||o>56319||u+1===l||(s=a.charCodeAt(u+1))<56320||s>57343?e?a.charAt(u):o:e?a.slice(u,u+2):(o-55296<<10)+(s-56320)+65536)}}},{"./_defined":22,"./_to-integer":63}],61:[function(e,t){var r,n,i,o=e("./_ctx"),s=e("./_invoke"),a=e("./_html"),u=e("./_dom-create"),l=e("./_global"),c=l.process,f=l.setImmediate,h=l.clearImmediate,d=l.MessageChannel,p=0,_={},m="onreadystatechange",g=function(){var e=+this;if(_.hasOwnProperty(e)){var t=_[e];delete _[e],t()}},v=function(e){g.call(e.data)};f&&h||(f=function(e){for(var t=[],n=1;arguments.length>n;)t.push(arguments[n++]);return _[++p]=function(){s("function"==typeof e?e:Function(e),t)},r(p),p},h=function(e){delete _[e]},"process"==e("./_cof")(c)?r=function(e){c.nextTick(o(g,e,1))}:d?(n=new d,i=n.port2,n.port1.onmessage=v,r=o(i.postMessage,i,1)):l.addEventListener&&"function"==typeof postMessage&&!l.importScripts?(r=function(e){l.postMessage(e+"","*")},l.addEventListener("message",v,!1)):r=m in u("script")?function(e){a.appendChild(u("script"))[m]=function(){a.removeChild(this),g.call(e)}}:function(e){setTimeout(o(g,e,1),0)}),t.exports={set:f,clear:h}},{"./_cof":19,"./_ctx":21,"./_dom-create":24,"./_global":29,"./_html":32,"./_invoke":34}],62:[function(e,t){var r=e("./_to-integer"),n=Math.max,i=Math.min;t.exports=function(e,t){return e=r(e),0>e?n(e+t,0):i(e,t)}},{"./_to-integer":63}],63:[function(e,t){var r=Math.ceil,n=Math.floor;t.exports=function(e){return isNaN(e=+e)?0:(e>0?n:r)(e)}},{}],64:[function(e,t){var r=e("./_iobject"),n=e("./_defined");t.exports=function(e){return r(n(e))}},{"./_defined":22,"./_iobject":35}],65:[function(e,t){var r=e("./_to-integer"),n=Math.min;t.exports=function(e){return e>0?n(r(e),9007199254740991):0}},{"./_to-integer":63}],66:[function(e,t){var r=e("./_defined");t.exports=function(e){return Object(r(e))}},{"./_defined":22}],67:[function(e,t){var r=e("./_is-object");t.exports=function(e,t){if(!r(e))return e;var n,i;if(t&&"function"==typeof(n=e.toString)&&!r(i=n.call(e)))return i;if("function"==typeof(n=e.valueOf)&&!r(i=n.call(e)))return i;if(!t&&"function"==typeof(n=e.toString)&&!r(i=n.call(e)))return i;throw TypeError("Can't convert object to primitive value")}},{"./_is-object":37}],68:[function(e,t){var r=0,n=Math.random();t.exports=function(e){return"Symbol(".concat(void 0===e?"":e,")_",(++r+n).toString(36))}},{}],69:[function(e,t){var r=e("./_shared")("wks"),n=e("./_uid"),i=e("./_global").Symbol,o="function"==typeof i,s=t.exports=function(e){return r[e]||(r[e]=o&&i[e]||(o?i:n)("Symbol."+e))};s.store=r},{"./_global":29,"./_shared":58,"./_uid":68}],70:[function(e,t){var r=e("./_classof"),n=e("./_wks")("iterator"),i=e("./_iterators");t.exports=e("./_core").getIteratorMethod=function(e){return void 0!=e?e[n]||e["@@iterator"]||i[r(e)]:void 0}},{"./_classof":18,"./_core":20,"./_iterators":43,"./_wks":69}],71:[function(e,t){"use strict";var r=e("./_add-to-unscopables"),n=e("./_iter-step"),i=e("./_iterators"),o=e("./_to-iobject");t.exports=e("./_iter-define")(Array,"Array",function(e,t){this._t=o(e),this._i=0,this._k=t},function(){var e=this._t,t=this._k,r=this._i++;return!e||r>=e.length?(this._t=void 0,n(1)):"keys"==t?n(0,r):"values"==t?n(0,e[r]):n(0,[r,e[r]])},"values"),i.Arguments=i.Array,r("keys"),r("values"),r("entries")},{"./_add-to-unscopables":14,"./_iter-define":40,"./_iter-step":42,"./_iterators":43,"./_to-iobject":64}],72:[function(e){"use strict";var t=e("./_classof"),r={};r[e("./_wks")("toStringTag")]="z",r+""!="[object z]"&&e("./_redefine")(Object.prototype,"toString",function(){return"[object "+t(this)+"]"},!0)},{"./_classof":18,"./_redefine":54,"./_wks":69}],73:[function(e){"use strict";var t,r,n,i=e("./_library"),o=e("./_global"),s=e("./_ctx"),a=e("./_classof"),u=e("./_export"),l=e("./_is-object"),c=e("./_a-function"),f=e("./_an-instance"),h=e("./_for-of"),d=e("./_species-constructor"),p=e("./_task").set,_=e("./_microtask")(),m="Promise",g=o.TypeError,v=o.process,y=o[m],v=o.process,b="process"==a(v),x=function(){},w=!!function(){try{var t=y.resolve(1),r=(t.constructor={})[e("./_wks")("species")]=function(e){e(x,x)};return(b||"function"==typeof PromiseRejectionEvent)&&t.then(x)instanceof r}catch(n){}}(),k=function(e,t){return e===t||e===y&&t===n},A=function(e){var t;return l(e)&&"function"==typeof(t=e.then)?t:!1},T=function(e){return k(y,e)?new E(e):new r(e)},E=r=function(e){var t,r;this.promise=new e(function(e,n){if(void 0!==t||void 0!==r)throw g("Bad Promise constructor");t=e,r=n}),this.resolve=c(t),this.reject=c(r)},S=function(e){try{e()}catch(t){return{error:t}}},R=function(e,t){if(!e._n){e._n=!0;var r=e._c;_(function(){for(var n=e._v,i=1==e._s,o=0,s=function(t){var r,o,s=i?t.ok:t.fail,a=t.resolve,u=t.reject,l=t.domain;try{s?(i||(2==e._h&&O(e),e._h=1),s===!0?r=n:(l&&l.enter(),r=s(n),l&&l.exit()),r===t.promise?u(g("Promise-chain cycle")):(o=A(r))?o.call(r,a,u):a(r)):u(n)}catch(c){u(c)}};r.length>o;)s(r[o++]);e._c=[],e._n=!1,t&&!e._h&&M(e)})}},M=function(e){p.call(o,function(){var t,r,n,i=e._v;if(P(e)&&(t=S(function(){b?v.emit("unhandledRejection",i,e):(r=o.onunhandledrejection)?r({promise:e,reason:i}):(n=o.console)&&n.error&&n.error("Unhandled promise rejection",i)}),e._h=b||P(e)?2:1),e._a=void 0,t)throw t.error})},P=function(e){if(1==e._h)return!1;for(var t,r=e._a||e._c,n=0;r.length>n;)if(t=r[n++],t.fail||!P(t.promise))return!1;return!0},O=function(e){p.call(o,function(){var t;b?v.emit("rejectionHandled",e):(t=o.onrejectionhandled)&&t({promise:e,reason:e._v})})},z=function(e){var t=this;t._d||(t._d=!0,t=t._w||t,t._v=e,t._s=2,t._a||(t._a=t._c.slice()),R(t,!0))},N=function(e){var t,r=this;if(!r._d){r._d=!0,r=r._w||r;try{if(r===e)throw g("Promise can't be resolved itself");(t=A(e))?_(function(){var n={_w:r,_d:!1};try{t.call(e,s(N,n,1),s(z,n,1))}catch(i){z.call(n,i)}}):(r._v=e,r._s=1,R(r,!1))}catch(n){z.call({_w:r,_d:!1},n)}}};w||(y=function(e){f(this,y,m,"_h"),c(e),t.call(this);try{e(s(N,this,1),s(z,this,1))}catch(r){z.call(this,r)}},t=function(){this._c=[],this._a=void 0,this._s=0,this._d=!1,this._v=void 0,this._h=0,this._n=!1},t.prototype=e("./_redefine-all")(y.prototype,{then:function(e,t){var r=T(d(this,y));return r.ok="function"==typeof e?e:!0,r.fail="function"==typeof t&&t,r.domain=b?v.domain:void 0,this._c.push(r),this._a&&this._a.push(r),this._s&&R(this,!1),r.promise},"catch":function(e){return this.then(void 0,e)}}),E=function(){var e=new t;this.promise=e,this.resolve=s(N,e,1),this.reject=s(z,e,1)}),u(u.G+u.W+u.F*!w,{Promise:y}),e("./_set-to-string-tag")(y,m),e("./_set-species")(m),n=e("./_core")[m],u(u.S+u.F*!w,m,{reject:function(e){var t=T(this),r=t.reject;return r(e),t.promise}}),u(u.S+u.F*(i||!w),m,{resolve:function(e){if(e instanceof y&&k(e.constructor,this))return e;var t=T(this),r=t.resolve;return r(e),t.promise}}),u(u.S+u.F*!(w&&e("./_iter-detect")(function(e){y.all(e)["catch"](x)})),m,{all:function(e){var t=this,r=T(t),n=r.resolve,i=r.reject,o=S(function(){var r=[],o=0,s=1;h(e,!1,function(e){var a=o++,u=!1;r.push(void 0),s++,t.resolve(e).then(function(e){u||(u=!0,r[a]=e,--s||n(r))},i)}),--s||n(r)});return o&&i(o.error),r.promise},race:function(e){var t=this,r=T(t),n=r.reject,i=S(function(){h(e,!1,function(e){t.resolve(e).then(r.resolve,n)})});return i&&n(i.error),r.promise}})},{"./_a-function":13,"./_an-instance":15,"./_classof":18,"./_core":20,"./_ctx":21,"./_export":26,"./_for-of":28,"./_global":29,"./_is-object":37,"./_iter-detect":41,"./_library":44,"./_microtask":45,"./_redefine-all":53,"./_set-species":55,"./_set-to-string-tag":56,"./_species-constructor":59,"./_task":61,"./_wks":69}],74:[function(e){"use strict";var t=e("./_string-at")(!0);e("./_iter-define")(String,"String",function(e){this._t=String(e),this._i=0},function(){var e,r=this._t,n=this._i;return n>=r.length?{value:void 0,done:!0}:(e=t(r,n),this._i+=e.length,{value:e,done:!1})})},{"./_iter-define":40,"./_string-at":60}],75:[function(e){for(var t=e("./es6.array.iterator"),r=e("./_redefine"),n=e("./_global"),i=e("./_hide"),o=e("./_iterators"),s=e("./_wks"),a=s("iterator"),u=s("toStringTag"),l=o.Array,c=["NodeList","DOMTokenList","MediaList","StyleSheetList","CSSRuleList"],f=0;5>f;f++){var h,d=c[f],p=n[d],_=p&&p.prototype;if(_){_[a]||i(_,a,l),_[u]||i(_,u,d),o[d]=l;for(h in t)_[h]||r(_,h,t[h],!0)}}},{"./_global":29,"./_hide":31,"./_iterators":43,"./_redefine":54,"./_wks":69,"./es6.array.iterator":71}],76:[function(e,t,r){function n(e){return e=Math.round(e),0>e?0:e>255?255:e}function i(e){return 0>e?0:e>1?1:e}function o(e){return n("%"===e[e.length-1]?parseFloat(e)/100*255:parseInt(e))}function s(e){return i("%"===e[e.length-1]?parseFloat(e)/100:parseFloat(e))}function a(e,t,r){return 0>r?r+=1:r>1&&(r-=1),1>6*r?e+(t-e)*r*6:1>2*r?t:2>3*r?e+(t-e)*(2/3-r)*6:e}function u(e){var t=e.replace(/ /g,"").toLowerCase();if(t in l)return l[t].slice();if("#"===t[0]){if(4===t.length){var r=parseInt(t.substr(1),16);return r>=0&&4095>=r?[(3840&r)>>4|(3840&r)>>8,240&r|(240&r)>>4,15&r|(15&r)<<4,1]:null}if(7===t.length){var r=parseInt(t.substr(1),16);return r>=0&&16777215>=r?[(16711680&r)>>16,(65280&r)>>8,255&r,1]:null}return null}var i=t.indexOf("("),u=t.indexOf(")");if(-1!==i&&u+1===t.length){var c=t.substr(0,i),f=t.substr(i+1,u-(i+1)).split(","),h=1;switch(c){case"rgba":if(4!==f.length)return null;h=s(f.pop());case"rgb":return 3!==f.length?null:[o(f[0]),o(f[1]),o(f[2]),h];case"hsla":if(4!==f.length)return null;h=s(f.pop());case"hsl":if(3!==f.length)return null;var d=(parseFloat(f[0])%360+360)%360/360,p=s(f[1]),_=s(f[2]),m=.5>=_?_*(p+1):_+p-_*p,g=2*_-m;return[n(255*a(g,m,d+1/3)),n(255*a(g,m,d)),n(255*a(g,m,d-1/3)),h];default:return null}}return null}var l={transparent:[0,0,0,0],aliceblue:[240,248,255,1],antiquewhite:[250,235,215,1],aqua:[0,255,255,1],aquamarine:[127,255,212,1],azure:[240,255,255,1],beige:[245,245,220,1],bisque:[255,228,196,1],black:[0,0,0,1],blanchedalmond:[255,235,205,1],blue:[0,0,255,1],blueviolet:[138,43,226,1],brown:[165,42,42,1],burlywood:[222,184,135,1],cadetblue:[95,158,160,1],chartreuse:[127,255,0,1],chocolate:[210,105,30,1],coral:[255,127,80,1],cornflowerblue:[100,149,237,1],cornsilk:[255,248,220,1],crimson:[220,20,60,1],cyan:[0,255,255,1],darkblue:[0,0,139,1],darkcyan:[0,139,139,1],darkgoldenrod:[184,134,11,1],darkgray:[169,169,169,1],darkgreen:[0,100,0,1],darkgrey:[169,169,169,1],darkkhaki:[189,183,107,1],darkmagenta:[139,0,139,1],darkolivegreen:[85,107,47,1],darkorange:[255,140,0,1],darkorchid:[153,50,204,1],darkred:[139,0,0,1],darksalmon:[233,150,122,1],darkseagreen:[143,188,143,1],darkslateblue:[72,61,139,1],darkslategray:[47,79,79,1],darkslategrey:[47,79,79,1],darkturquoise:[0,206,209,1],darkviolet:[148,0,211,1],deeppink:[255,20,147,1],deepskyblue:[0,191,255,1],dimgray:[105,105,105,1],dimgrey:[105,105,105,1],dodgerblue:[30,144,255,1],firebrick:[178,34,34,1],floralwhite:[255,250,240,1],forestgreen:[34,139,34,1],fuchsia:[255,0,255,1],gainsboro:[220,220,220,1],ghostwhite:[248,248,255,1],gold:[255,215,0,1],goldenrod:[218,165,32,1],gray:[128,128,128,1],green:[0,128,0,1],greenyellow:[173,255,47,1],grey:[128,128,128,1],honeydew:[240,255,240,1],hotpink:[255,105,180,1],indianred:[205,92,92,1],indigo:[75,0,130,1],ivory:[255,255,240,1],khaki:[240,230,140,1],lavender:[230,230,250,1],lavenderblush:[255,240,245,1],lawngreen:[124,252,0,1],lemonchiffon:[255,250,205,1],lightblue:[173,216,230,1],lightcoral:[240,128,128,1],lightcyan:[224,255,255,1],lightgoldenrodyellow:[250,250,210,1],lightgray:[211,211,211,1],lightgreen:[144,238,144,1],lightgrey:[211,211,211,1],lightpink:[255,182,193,1],lightsalmon:[255,160,122,1],lightseagreen:[32,178,170,1],lightskyblue:[135,206,250,1],lightslategray:[119,136,153,1],lightslategrey:[119,136,153,1],lightsteelblue:[176,196,222,1],lightyellow:[255,255,224,1],lime:[0,255,0,1],limegreen:[50,205,50,1],linen:[250,240,230,1],magenta:[255,0,255,1],maroon:[128,0,0,1],mediumaquamarine:[102,205,170,1],mediumblue:[0,0,205,1],mediumorchid:[186,85,211,1],mediumpurple:[147,112,219,1],mediumseagreen:[60,179,113,1],mediumslateblue:[123,104,238,1],mediumspringgreen:[0,250,154,1],mediumturquoise:[72,209,204,1],mediumvioletred:[199,21,133,1],midnightblue:[25,25,112,1],mintcream:[245,255,250,1],mistyrose:[255,228,225,1],moccasin:[255,228,181,1],navajowhite:[255,222,173,1],navy:[0,0,128,1],oldlace:[253,245,230,1],olive:[128,128,0,1],olivedrab:[107,142,35,1],orange:[255,165,0,1],orangered:[255,69,0,1],orchid:[218,112,214,1],palegoldenrod:[238,232,170,1],palegreen:[152,251,152,1],paleturquoise:[175,238,238,1],palevioletred:[219,112,147,1],papayawhip:[255,239,213,1],peachpuff:[255,218,185,1],peru:[205,133,63,1],pink:[255,192,203,1],plum:[221,160,221,1],powderblue:[176,224,230,1],purple:[128,0,128,1],rebeccapurple:[102,51,153,1],red:[255,0,0,1],rosybrown:[188,143,143,1],royalblue:[65,105,225,1],saddlebrown:[139,69,19,1],salmon:[250,128,114,1],sandybrown:[244,164,96,1],seagreen:[46,139,87,1],seashell:[255,245,238,1],sienna:[160,82,45,1],silver:[192,192,192,1],skyblue:[135,206,235,1],slateblue:[106,90,205,1],slategray:[112,128,144,1],slategrey:[112,128,144,1],snow:[255,250,250,1],springgreen:[0,255,127,1],steelblue:[70,130,180,1],tan:[210,180,140,1],teal:[0,128,128,1],thistle:[216,191,216,1],tomato:[255,99,71,1],turquoise:[64,224,208,1],violet:[238,130,238,1],wheat:[245,222,179,1],white:[255,255,255,1],whitesmoke:[245,245,245,1],yellow:[255,255,0,1],yellowgreen:[154,205,50,1]};try{r.parseCSSColor=u}catch(c){}},{}],77:[function(e,t){"use strict";function r(e,t,r){r=r||2;var i=t&&t.length,s=i?t[0]*r:e.length,a=n(e,0,s,r,!0),u=[];if(!a)return u;var l,f,h,d,p,_,m;if(i&&(a=c(e,t,a,r)),e.length>80*r){l=h=e[0],f=d=e[1];for(var g=r;s>g;g+=r)p=e[g],_=e[g+1],l>p&&(l=p),f>_&&(f=_),p>h&&(h=p),_>d&&(d=_);m=Math.max(h-l,d-f)}return o(a,u,r,l,f,m),u}function n(e,t,r,n,i){var o,s;if(i===P(e,t,r,n)>0)for(o=t;r>o;o+=n)s=S(o,e[o],e[o+1],s);else for(o=r-n;o>=t;o-=n)s=S(o,e[o],e[o+1],s);return s&&x(s,s.next)&&(R(s),s=s.next),s}function i(e,t){if(!e)return e;t||(t=e);var r,n=e;do if(r=!1,n.steiner||!x(n,n.next)&&0!==b(n.prev,n,n.next))n=n.next;else{if(R(n),n=t=n.prev,n===n.next)return null;r=!0}while(r||n!==t);return t}function o(e,t,r,n,c,f,h){if(e){!h&&f&&p(e,n,c,f);for(var d,_,m=e;e.prev!==e.next;)if(d=e.prev,_=e.next,f?a(e,n,c,f):s(e))t.push(d.i/r),t.push(e.i/r),t.push(_.i/r),R(e),e=_.next,m=_.next;else if(e=_,e===m){h?1===h?(e=u(e,t,r),o(e,t,r,n,c,f,2)):2===h&&l(e,t,r,n,c,f):o(i(e),t,r,n,c,f,1);break}}}function s(e){var t=e.prev,r=e,n=e.next;if(b(t,r,n)>=0)return!1;for(var i=e.next.next;i!==e.prev;){if(v(t.x,t.y,r.x,r.y,n.x,n.y,i.x,i.y)&&b(i.prev,i,i.next)>=0)return!1;i=i.next}return!0}function a(e,t,r,n){var i=e.prev,o=e,s=e.next;if(b(i,o,s)>=0)return!1;for(var a=i.xo.x?i.x>s.x?i.x:s.x:o.x>s.x?o.x:s.x,c=i.y>o.y?i.y>s.y?i.y:s.y:o.y>s.y?o.y:s.y,f=m(a,u,t,r,n),h=m(l,c,t,r,n),d=e.nextZ;d&&d.z<=h;){if(d!==e.prev&&d!==e.next&&v(i.x,i.y,o.x,o.y,s.x,s.y,d.x,d.y)&&b(d.prev,d,d.next)>=0)return!1;d=d.nextZ}for(d=e.prevZ;d&&d.z>=f;){if(d!==e.prev&&d!==e.next&&v(i.x,i.y,o.x,o.y,s.x,s.y,d.x,d.y)&&b(d.prev,d,d.next)>=0)return!1;d=d.prevZ}return!0}function u(e,t,r){var n=e;do{var i=n.prev,o=n.next.next;!x(i,o)&&w(i,n,n.next,o)&&A(i,o)&&A(o,i)&&(t.push(i.i/r),t.push(n.i/r),t.push(o.i/r),R(n),R(n.next),n=e=o),n=n.next}while(n!==e);return n}function l(e,t,r,n,s,a){var u=e;do{for(var l=u.next.next;l!==u.prev;){if(u.i!==l.i&&y(u,l)){var c=E(u,l);return u=i(u,u.next),c=i(c,c.next),o(u,t,r,n,s,a),void o(c,t,r,n,s,a)}l=l.next}u=u.next}while(u!==e)}function c(e,t,r,o){var s,a,u,l,c,d=[];for(s=0,a=t.length;a>s;s++)u=t[s]*o,l=a-1>s?t[s+1]*o:e.length,c=n(e,u,l,o,!1),c===c.next&&(c.steiner=!0),d.push(g(c));for(d.sort(f),s=0;s=n.next.y){var a=n.x+(o-n.y)*(n.next.x-n.x)/(n.next.y-n.y);if(i>=a&&a>s){if(s=a,a===i){if(o===n.y)return n;if(o===n.next.y)return n.next}r=n.x=n.x&&n.x>=c&&v(f>o?i:s,o,c,f,f>o?s:i,o,n.x,n.y)&&(u=Math.abs(o-n.y)/(i-n.x),(h>u||u===h&&n.x>r.x)&&A(n,e)&&(r=n,h=u)),n=n.next;return r}function p(e,t,r,n){var i=e;do null===i.z&&(i.z=m(i.x,i.y,t,r,n)),i.prevZ=i.prev,i.nextZ=i.next,i=i.next;while(i!==e);i.prevZ.nextZ=null,i.prevZ=null,_(i)}function _(e){var t,r,n,i,o,s,a,u,l=1;do{for(r=e,e=null,o=null,s=0;r;){for(s++,n=r,a=0,t=0;l>t&&(a++,n=n.nextZ,n);t++);for(u=l;a>0||u>0&&n;)0===a?(i=n,n=n.nextZ,u--):0!==u&&n?r.z<=n.z?(i=r,r=r.nextZ,a--):(i=n,n=n.nextZ,u--):(i=r,r=r.nextZ,a--),o?o.nextZ=i:e=i,i.prevZ=o,o=i;r=n}o.nextZ=null,l*=2}while(s>1);return e}function m(e,t,r,n,i){return e=32767*(e-r)/i,t=32767*(t-n)/i,e=16711935&(e|e<<8),e=252645135&(e|e<<4),e=858993459&(e|e<<2),e=1431655765&(e|e<<1),t=16711935&(t|t<<8),t=252645135&(t|t<<4),t=858993459&(t|t<<2),t=1431655765&(t|t<<1),e|t<<1}function g(e){var t=e,r=e;do t.x=0&&(e-s)*(n-a)-(r-s)*(t-a)>=0&&(r-s)*(o-a)-(i-s)*(n-a)>=0}function y(e,t){return e.next.i!==t.i&&e.prev.i!==t.i&&!k(e,t)&&A(e,t)&&A(t,e)&&T(e,t)}function b(e,t,r){return(t.y-e.y)*(r.x-t.x)-(t.x-e.x)*(r.y-t.y)}function x(e,t){return e.x===t.x&&e.y===t.y}function w(e,t,r,n){return x(e,t)&&x(r,n)||x(e,n)&&x(r,t)?!0:b(e,t,r)>0!=b(e,t,n)>0&&b(r,n,e)>0!=b(r,n,t)>0}function k(e,t){var r=e;do{if(r.i!==e.i&&r.next.i!==e.i&&r.i!==t.i&&r.next.i!==t.i&&w(r,r.next,e,t))return!0;r=r.next}while(r!==e);return!1}function A(e,t){return b(e.prev,e,e.next)<0?b(e,t,e.next)>=0&&b(e,e.prev,t)>=0:b(e,t,e.prev)<0||b(e,e.next,t)<0}function T(e,t){var r=e,n=!1,i=(e.x+t.x)/2,o=(e.y+t.y)/2;do r.y>o!=r.next.y>o&&i<(r.next.x-r.x)*(o-r.y)/(r.next.y-r.y)+r.x&&(n=!n),r=r.next;while(r!==e);return n}function E(e,t){var r=new M(e.i,e.x,e.y),n=new M(t.i,t.x,t.y),i=e.next,o=t.prev;return e.next=t,t.prev=e,r.next=i,i.prev=r,n.next=r,r.prev=n,o.next=n,n.prev=o,n}function S(e,t,r,n){var i=new M(e,t,r);return n?(i.next=n.next,i.prev=n,n.next.prev=i,n.next=i):(i.prev=i,i.next=i),i}function R(e){e.next.prev=e.prev,e.prev.next=e.next,e.prevZ&&(e.prevZ.nextZ=e.nextZ),e.nextZ&&(e.nextZ.prevZ=e.prevZ)}function M(e,t,r){this.i=e,this.x=t,this.y=r,this.prev=null,this.next=null,this.z=null,this.prevZ=null,this.nextZ=null,this.steiner=!1}function P(e,t,r,n){for(var i=0,o=t,s=r-n;r>o;o+=n)i+=(e[s]-e[o])*(e[o+1]+e[s+1]),s=o;return i}t.exports=r,r.deviation=function(e,t,r,n){var i=t&&t.length,o=i?t[0]*r:e.length,s=Math.abs(P(e,0,o,r));if(i)for(var a=0,u=t.length;u>a;a++){var l=t[a]*r,c=u-1>a?t[a+1]*r:e.length;s-=Math.abs(P(e,l,c,r))}var f=0;for(a=0;as;s++)r.vertices.push(e[i][o][s]);i>0&&(n+=e[i-1].length,r.holes.push(n))}return r}},{}],78:[function(e,t){!function(){function e(e,t){c?e.addEventListener("scroll",t,!1):e.attachEvent("scroll",t)}function r(e){document.body?e():c?document.addEventListener("DOMContentLoaded",e):document.attachEvent("onreadystatechange",function(){"interactive"!=document.readyState&&"complete"!=document.readyState||e()})}function n(e){this.a=document.createElement("div"),this.a.setAttribute("aria-hidden","true"),this.a.appendChild(document.createTextNode(e)),this.b=document.createElement("span"),this.c=document.createElement("span"),this.h=document.createElement("span"),this.f=document.createElement("span"),this.g=-1,this.b.style.cssText="max-width:none;display:inline-block;position:absolute;height:100%;width:100%;overflow:scroll;font-size:16px;",this.c.style.cssText="max-width:none;display:inline-block;position:absolute;height:100%;width:100%;overflow:scroll;font-size:16px;",this.f.style.cssText="max-width:none;display:inline-block;position:absolute;height:100%;width:100%;overflow:scroll;font-size:16px;",this.h.style.cssText="display:inline-block;width:200%;height:200%;font-size:16px;max-width:none;",this.b.appendChild(this.h),this.c.appendChild(this.f),this.a.appendChild(this.b),this.a.appendChild(this.c)}function i(e,t){e.a.style.cssText="max-width:none;min-width:20px;min-height:20px;display:inline-block;overflow:hidden;position:absolute;width:auto;margin:0;padding:0;top:-999px;left:-999px;white-space:nowrap;font:"+t+";"}function o(e){var t=e.a.offsetWidth,r=t+100;return e.f.style.width=r+"px",e.c.scrollLeft=r,e.b.scrollLeft=e.b.scrollWidth+100,e.g!==t?(e.g=t,!0):!1}function s(t,r){function n(){var e=i;o(e)&&null!==e.a.parentNode&&r(e.g)}var i=t;e(t.b,n),e(t.c,n),o(t)}function a(e,t){var r=t||{};this.family=e,this.style=r.style||"normal",this.weight=r.weight||"normal",this.stretch=r.stretch||"normal"}function u(){if(null===h){var e=document.createElement("div");try{e.style.font="condensed 100px sans-serif"}catch(t){}h=""!==e.style.font}return h}function l(e,t){return[e.style,e.weight,u()?e.stretch:"","100px",t].join(" ")}var c=!!document.addEventListener,f=null,h=null,d=!!window.FontFace;a.prototype.load=function(e,t){var o=this,a=e||"BESbswy",u=t||3e3,c=(new Date).getTime();return new Promise(function(e,t){if(d){var h=new Promise(function(e,t){function r(){(new Date).getTime()-c>=u?t():document.fonts.load(l(o,o.family),a).then(function(t){1<=t.length?e():setTimeout(r,25)},function(){t()})}r()}),p=new Promise(function(e,t){setTimeout(t,u)});Promise.race([p,h]).then(function(){e(o)},function(){t(o)})}else r(function(){function r(){var t;(t=-1!=m&&-1!=g||-1!=m&&-1!=v||-1!=g&&-1!=v)&&((t=m!=g&&m!=v&&g!=v)||(null===f&&(t=/AppleWebKit\/([0-9]+)(?:\.([0-9]+))/.exec(window.navigator.userAgent),f=!!t&&(536>parseInt(t[1],10)||536===parseInt(t[1],10)&&11>=parseInt(t[2],10))),t=f&&(m==y&&g==y&&v==y||m==b&&g==b&&v==b||m==x&&g==x&&v==x)),t=!t),t&&(null!==w.parentNode&&w.parentNode.removeChild(w),clearTimeout(k),e(o))}function h(){if((new Date).getTime()-c>=u)null!==w.parentNode&&w.parentNode.removeChild(w),t(o);else{var e=document.hidden;(!0===e||void 0===e)&&(m=d.a.offsetWidth,g=p.a.offsetWidth,v=_.a.offsetWidth,r()),k=setTimeout(h,50)}}var d=new n(a),p=new n(a),_=new n(a),m=-1,g=-1,v=-1,y=-1,b=-1,x=-1,w=document.createElement("div"),k=0;w.dir="ltr",i(d,l(o,"sans-serif")),i(p,l(o,"serif")),i(_,l(o,"monospace")),w.appendChild(d.a),w.appendChild(p.a),w.appendChild(_.a),document.body.appendChild(w),y=d.a.offsetWidth,b=p.a.offsetWidth,x=_.a.offsetWidth,h(),s(d,function(e){m=e,r()}),i(d,l(o,'"'+o.family+'",sans-serif')),s(p,function(e){g=e,r()}),i(p,l(o,'"'+o.family+'",serif')),s(_,function(e){v=e,r()}),i(_,l(o,'"'+o.family+'",monospace'))})})},window.FontFaceObserver=a,window.FontFaceObserver.prototype.check=window.FontFaceObserver.prototype.load=a.prototype.load,"undefined"!=typeof t&&(t.exports=window.FontFaceObserver)}()},{}],79:[function(e,t){"use strict";function r(e,t,r,o,s,a,u,l){if(r/=t,o/=t,u>=r&&o>=l)return e;if(u>o||r>l)return null;for(var c=[],f=0;f=r&&o>=d)c.push(p);else if(!(h>o||r>d)){var g=1===m?n(_,r,o,s):i(_,r,o,s,a,3===m);g.length&&c.push({geometry:g,type:m,tags:e[f].tags||null,min:p.min,max:p.max})}}return c.length?c:null}function n(e,t,r,n){for(var i=[],o=0;o=t&&r>=a&&i.push(s)}return i}function i(e,t,r,n,i,s){for(var a=[],u=0;uc;c++)l=p||_[c],p=_[c+1],h=d||l[n],d=p[n],t>h?d>r?(y.push(i(l,p,t),i(l,p,r)),s||(y=o(a,y,m,g))):d>=t&&y.push(i(l,p,t)):h>r?t>d?(y.push(i(l,p,r),i(l,p,t)),s||(y=o(a,y,m,g))):r>=d&&y.push(i(l,p,r)):(y.push(l),t>d?(y.push(i(l,p,t)),s||(y=o(a,y,m,g))):d>r&&(y.push(i(l,p,r)),s||(y=o(a,y,m,g))));l=_[v-1],h=l[n],h>=t&&r>=h&&y.push(l),f=y[y.length-1],s&&f&&(y[0][0]!==f[0]||y[0][1]!==f[1])&&y.push(y[0]),o(a,y,m,g)}return a}function o(e,t,r,n){return t.length&&(t.area=r,t.dist=n,e.push(t)),[]}t.exports=r},{}],80:[function(e,t){"use strict";function r(e,t){var r=[];if("FeatureCollection"===e.type)for(var i=0;in?-1:n>1?1:n,[r,n,0]}function a(e){for(var t,r,n=0,i=0,o=0;o1)return!1;var s=i.geometry[0].length;if(5!==s)return!1;for(var a=0;s>a;a++){var u=o(i.geometry[0][a],t,e.z2,e.x,e.y);if(u[0]!==-r&&u[0]!==t+r||u[1]!==-r&&u[1]!==t+r)return!1}return!0}t.exports=r;var f=e("./convert"),h=e("./clip"),d=e("./wrap"),p=e("./tile");n.prototype.options={maxZoom:14,indexMaxZoom:5,indexMaxPoints:1e5,solidChildren:!1,tolerance:3,extent:4096,buffer:64,debug:0},n.prototype.splitTile=function(e,t,r,n,i,o,l){for(var f=[e,t,r,n],d=this.options,_=d.debug;f.length;){n=f.pop(),r=f.pop(),t=f.pop(),e=f.pop();var m=1<1&&console.time("creation"),v=this.tiles[g]=p(e,m,r,n,y,t===d.maxZoom),this.tileCoords.push({z:t,x:r,y:n}),_)){_>1&&(console.log("tile z%d-%d-%d (features: %d, points: %d, simplified: %d)",t,r,n,v.numFeatures,v.numPoints,v.numSimplified),console.timeEnd("creation"));var b="z"+t;this.stats[b]=(this.stats[b]||0)+1,this.total++}if(v.source=e,d.solidChildren||!c(v,d.extent,d.buffer)){if(i){if(t===d.maxZoom||t===i)continue;var x=1<1&&console.time("clipping");var w,k,A,T,E,S,R=.5*d.buffer/d.extent,M=.5-R,P=.5+R,O=1+R;w=k=A=T=null,E=h(e,m,r-R,r+P,0,a,v.min[0],v.max[0]),S=h(e,m,r+M,r+O,0,a,v.min[0],v.max[0]),E&&(w=h(E,m,n-R,n+P,1,u,v.min[1],v.max[1]),k=h(E,m,n+M,n+O,1,u,v.min[1],v.max[1])),S&&(A=h(S,m,n-R,n+P,1,u,v.min[1],v.max[1]),T=h(S,m,n+M,n+O,1,u,v.min[1],v.max[1])),_>1&&console.timeEnd("clipping"),w&&f.push(w,t+1,2*r,2*n),k&&f.push(k,t+1,2*r,2*n+1),A&&f.push(A,t+1,2*r+1,2*n),T&&f.push(T,t+1,2*r+1,2*n+1)}}},n.prototype.getTile=function(e,t,r){var n=this.options,o=n.extent,a=n.debug,u=1<1&&console.log("drilling down to z%d-%d-%d",e,t,r);for(var f,h=e,d=t,p=r;!f&&h>0;)h--,d=Math.floor(d/2),p=Math.floor(p/2),f=this.tiles[s(h,d,p)];if(!f)return null;if(a>1&&console.log("found parent tile z%d-%d-%d",h,d,p),f.source){if(c(f,o,n.buffer))return i(f,o);a>1&&console.time("drilling down"),this.splitTile(f.source,h,d,p,e,t,r),a>1&&console.timeEnd("drilling down")}return this.tiles[l]?i(this.tiles[l],o):null}},{"./clip":79,"./convert":80,"./tile":83,"./wrap":84}],82:[function(e,t){"use strict";function r(e,t){var r,i,o,s,a=t*t,u=e.length,l=0,c=u-1,f=[];for(e[l][2]=1,e[c][2]=1;c;){for(i=0,r=l+1;c>r;r++)o=n(e[r],e[l],e[c]),o>i&&(s=r,i=o);i>a?(e[s][2]=i,f.push(l),f.push(s),l=s):(c=f.pop(),l=f.pop())}}function n(e,t,r){var n=t[0],i=t[1],o=r[0],s=r[1],a=e[0],u=e[1],l=o-n,c=s-i;if(0!==l||0!==c){var f=((a-n)*l+(u-i)*c)/(l*l+c*c);f>1?(n=o,i=s):f>0&&(n+=l*f,i+=c*f)}return l=a-n,c=u-i,l*l+c*c}t.exports=r},{}],83:[function(e,t){"use strict";function r(e,t,r,i,o,s){for(var a={features:[],numPoints:0,numSimplified:0,numFeatures:0,source:null,x:r,y:i,z2:t,transformed:!1,min:[2,1],max:[-1,0]},u=0;ua.max[0]&&(a.max[0]=c[0]),c[1]>a.max[1]&&(a.max[1]=c[1])}return a}function n(e,t,r,n){var i,o,s,a,u=t.geometry,l=t.type,c=[],f=r*r;if(1===l)for(i=0;if)&&(h.push(a),e.numSimplified++),e.numPoints++;c.push(h)}else e.numPoints+=s.length;c.length&&e.features.push({geometry:c,type:l,tags:t.tags||null})}t.exports=r},{}],84:[function(e,t){"use strict";function r(e,t,r){var i=e,s=o(e,1,-1-t,t,0,r,-1,2),a=o(e,1,1-t,2+t,0,r,-1,2);return(s||a)&&(i=o(e,1,-t,1+t,0,r,-1,2),s&&(i=n(s,1).concat(i)),a&&(i=i.concat(n(a,-1)))),i}function n(e,t){for(var r=[],n=0;nr;r+=1)i=o[r],e[i]=t[i];return e}function s(e,t){var r,n="";for(r=0;t>r;r+=1)n+=e;return n}function a(e){return 0===e&&Number.NEGATIVE_INFINITY===1/e}t.exports.isNothing=r,t.exports.isObject=n,t.exports.toArray=i,t.exports.repeat=s,t.exports.isNegativeZero=a,t.exports.extend=o},{}],98:[function(e,t){"use strict";function r(e,t){Error.call(this),Error.captureStackTrace?Error.captureStackTrace(this,this.constructor):this.stack=(new Error).stack||"",this.name="YAMLException",this.reason=e,this.mark=t,this.message=(this.reason||"(unknown reason)")+(this.mark?" "+this.mark.toString():"")}r.prototype=Object.create(Error.prototype),r.prototype.constructor=r,r.prototype.toString=function(e){var t=this.name+": ";return t+=this.reason||"(unknown reason)",!e&&this.mark&&(t+=" "+this.mark.toString()),t},t.exports=r},{}],99:[function(e,t){"use strict";function r(e){return 10===e||13===e}function n(e){return 9===e||32===e}function i(e){return 9===e||32===e||10===e||13===e}function o(e){return 44===e||91===e||93===e||123===e||125===e}function s(e){var t;return e>=48&&57>=e?e-48:(t=32|e,t>=97&&102>=t?t-97+10:-1)}function a(e){return 120===e?2:117===e?4:85===e?8:0}function u(e){return e>=48&&57>=e?e-48:-1}function l(e){return 48===e?"\x00":97===e?"":98===e?"\b":116===e?" ":9===e?" ":110===e?"\n":118===e?" ":102===e?"\f":114===e?"\r":101===e?"":32===e?" ":34===e?'"':47===e?"/":92===e?"\\":78===e?"…":95===e?" ":76===e?"\u2028":80===e?"\u2029":""}function c(e){return 65535>=e?String.fromCharCode(e):String.fromCharCode((e-65536>>10)+55296,(e-65536&1023)+56320)}function f(e,t){this.input=e,this.filename=t.filename||null,this.schema=t.schema||V,this.onWarning=t.onWarning||null,this.legacy=t.legacy||!1,this.json=t.json||!1,this.listener=t.listener||null,this.implicitTypes=this.schema.compiledImplicit,this.typeMap=this.schema.compiledTypeMap,this.length=e.length,this.position=0,this.line=0,this.lineStart=0,this.lineIndent=0,this.documents=[]}function h(e,t){return new D(t,new B(e.filename,e.input,e.position,e.line,e.position-e.lineStart))}function d(e,t){throw h(e,t)}function p(e,t){e.onWarning&&e.onWarning.call(null,h(e,t))}function _(e,t,r,n){var i,o,s,a;if(r>t){if(a=e.input.slice(t,r),n)for(i=0,o=a.length;o>i;i+=1)s=a.charCodeAt(i),9===s||s>=32&&1114111>=s||d(e,"expected valid JSON character");else $.test(a)&&d(e,"the stream contains non-printable characters");e.result+=a}}function m(e,t,r,n){var i,o,s,a;for(U.isObject(r)||d(e,"cannot merge mappings; the provided source object is unacceptable"),i=Object.keys(r),s=0,a=i.length;a>s;s+=1)o=i[s],q.call(t,o)||(t[o]=r[o],n[o]=!0)}function g(e,t,r,n,i,o){var s,a;if(i=String(i),null===t&&(t={}),"tag:yaml.org,2002:merge"===n)if(Array.isArray(o))for(s=0,a=o.length;a>s;s+=1)m(e,t,o[s],r);else m(e,t,o,r);else e.json||q.call(r,i)||!q.call(t,i)||d(e,"duplicated mapping key"),t[i]=o,delete r[i];return t}function v(e){var t;t=e.input.charCodeAt(e.position),10===t?e.position++:13===t?(e.position++,10===e.input.charCodeAt(e.position)&&e.position++):d(e,"a line break is expected"),e.line+=1,e.lineStart=e.position}function y(e,t,i){for(var o=0,s=e.input.charCodeAt(e.position);0!==s;){for(;n(s);)s=e.input.charCodeAt(++e.position);if(t&&35===s)do s=e.input.charCodeAt(++e.position);while(10!==s&&13!==s&&0!==s);if(!r(s))break;for(v(e),s=e.input.charCodeAt(e.position),o++,e.lineIndent=0;32===s;)e.lineIndent++,s=e.input.charCodeAt(++e.position)}return-1!==i&&0!==o&&e.lineIndent1&&(e.result+=U.repeat("\n",t-1))}function w(e,t,s){var a,u,l,c,f,h,d,p,m,g=e.kind,v=e.result;if(m=e.input.charCodeAt(e.position),i(m)||o(m)||35===m||38===m||42===m||33===m||124===m||62===m||39===m||34===m||37===m||64===m||96===m)return!1;if((63===m||45===m)&&(u=e.input.charCodeAt(e.position+1),i(u)||s&&o(u)))return!1;for(e.kind="scalar",e.result="",l=c=e.position,f=!1;0!==m;){if(58===m){if(u=e.input.charCodeAt(e.position+1),i(u)||s&&o(u))break}else if(35===m){if(a=e.input.charCodeAt(e.position-1),i(a))break}else{if(e.position===e.lineStart&&b(e)||s&&o(m))break;if(r(m)){if(h=e.line,d=e.lineStart,p=e.lineIndent,y(e,!1,-1),e.lineIndent>=t){f=!0,m=e.input.charCodeAt(e.position);continue}e.position=c,e.line=h,e.lineStart=d,e.lineIndent=p;break}}f&&(_(e,l,c,!1),x(e,e.line-h),l=c=e.position,f=!1),n(m)||(c=e.position+1),m=e.input.charCodeAt(++e.position)}return _(e,l,c,!1),e.result?!0:(e.kind=g,e.result=v,!1)}function k(e,t){var n,i,o;if(n=e.input.charCodeAt(e.position),39!==n)return!1;for(e.kind="scalar",e.result="",e.position++,i=o=e.position;0!==(n=e.input.charCodeAt(e.position));)if(39===n){if(_(e,i,e.position,!0),n=e.input.charCodeAt(++e.position),39!==n)return!0;i=o=e.position,e.position++}else r(n)?(_(e,i,o,!0),x(e,y(e,!1,t)),i=o=e.position):e.position===e.lineStart&&b(e)?d(e,"unexpected end of the document within a single quoted scalar"):(e.position++,o=e.position);d(e,"unexpected end of the stream within a single quoted scalar")}function A(e,t){var n,i,o,u,l,f;if(f=e.input.charCodeAt(e.position),34!==f)return!1;for(e.kind="scalar",e.result="",e.position++,n=i=e.position;0!==(f=e.input.charCodeAt(e.position));){if(34===f)return _(e,n,e.position,!0),e.position++,!0;if(92===f){if(_(e,n,e.position,!0),f=e.input.charCodeAt(++e.position),r(f))y(e,!1,t);else if(256>f&&nt[f])e.result+=it[f],e.position++;else if((l=a(f))>0){for(o=l,u=0;o>0;o--)f=e.input.charCodeAt(++e.position),(l=s(f))>=0?u=(u<<4)+l:d(e,"expected hexadecimal character");e.result+=c(u),e.position++}else d(e,"unknown escape sequence");n=i=e.position}else r(f)?(_(e,n,i,!0),x(e,y(e,!1,t)),n=i=e.position):e.position===e.lineStart&&b(e)?d(e,"unexpected end of the document within a double quoted scalar"):(e.position++,i=e.position)}d(e,"unexpected end of the stream within a double quoted scalar")}function T(e,t){var r,n,o,s,a,u,l,c,f,h,p,_=!0,m=e.tag,v=e.anchor,b={};if(p=e.input.charCodeAt(e.position),91===p)s=93,l=!1,n=[];else{if(123!==p)return!1;s=125,l=!0,n={}}for(null!==e.anchor&&(e.anchorMap[e.anchor]=n),p=e.input.charCodeAt(++e.position);0!==p;){if(y(e,!0,t),p=e.input.charCodeAt(e.position),p===s)return e.position++,e.tag=m,e.anchor=v,e.kind=l?"mapping":"sequence",e.result=n,!0;_||d(e,"missed comma between flow collection entries"),f=c=h=null,a=u=!1,63===p&&(o=e.input.charCodeAt(e.position+1),i(o)&&(a=u=!0,e.position++,y(e,!0,t))),r=e.line,z(e,t,W,!1,!0),f=e.tag,c=e.result,y(e,!0,t),p=e.input.charCodeAt(e.position),!u&&e.line!==r||58!==p||(a=!0,p=e.input.charCodeAt(++e.position),y(e,!0,t),z(e,t,W,!1,!0),h=e.result),l?g(e,n,b,f,c,h):n.push(a?g(e,null,b,f,c,h):c),y(e,!0,t),p=e.input.charCodeAt(e.position),44===p?(_=!0,p=e.input.charCodeAt(++e.position)):_=!1}d(e,"unexpected end of the stream within a flow collection")}function E(e,t){var i,o,s,a,l=Y,c=!1,f=t,h=0,p=!1;if(a=e.input.charCodeAt(e.position),124===a)o=!1;else{if(62!==a)return!1;o=!0}for(e.kind="scalar",e.result="";0!==a;)if(a=e.input.charCodeAt(++e.position),43===a||45===a)Y===l?l=43===a?K:J:d(e,"repeat of a chomping mode identifier");else{if(!((s=u(a))>=0))break;0===s?d(e,"bad explicit indentation width of a block scalar; it cannot be less than one"):c?d(e,"repeat of an indentation width identifier"):(f=t+s-1,c=!0)}if(n(a)){do a=e.input.charCodeAt(++e.position);while(n(a));if(35===a)do a=e.input.charCodeAt(++e.position);while(!r(a)&&0!==a)}for(;0!==a;){for(v(e),e.lineIndent=0,a=e.input.charCodeAt(e.position);(!c||e.lineIndentf&&(f=e.lineIndent),r(a))h++;else{if(e.lineIndentt)&&0!==o)d(e,"bad indentation of a sequence entry");else if(e.lineIndentt)&&(z(e,t,X,!0,s)&&(v?_=e.result:m=e.result),v||(g(e,f,h,p,_,m),p=_=m=null),y(e,!0,-1),u=e.input.charCodeAt(e.position)),e.lineIndent>t&&0!==u)d(e,"bad indentation of a mapping entry");else if(e.lineIndentt?p=1:e.lineIndent===t?p=0:e.lineIndentt?p=1:e.lineIndent===t?p=0:e.lineIndentu;u+=1)if(c=e.implicitTypes[u],c.resolve(e.result)){e.result=c.construct(e.result),e.tag=c.tag,null!==e.anchor&&(e.anchorMap[e.anchor]=e.result);break}}else q.call(e.typeMap,e.tag)?(c=e.typeMap[e.tag],null!==e.result&&c.kind!==e.kind&&d(e,"unacceptable node kind for !<"+e.tag+'> tag; it should be "'+c.kind+'", not "'+e.kind+'"'),c.resolve(e.result)?(e.result=c.construct(e.result),null!==e.anchor&&(e.anchorMap[e.anchor]=e.result)):d(e,"cannot resolve a node with !<"+e.tag+"> explicit tag")):d(e,"unknown tag !<"+e.tag+">");return null!==e.listener&&e.listener("close",e),null!==e.tag||null!==e.anchor||m}function N(e){var t,o,s,a,u=e.position,l=!1;for(e.version=null,e.checkLineBreaks=e.legacy,e.tagMap={},e.anchorMap={};0!==(a=e.input.charCodeAt(e.position))&&(y(e,!0,-1),a=e.input.charCodeAt(e.position),!(e.lineIndent>0||37!==a));){for(l=!0,a=e.input.charCodeAt(++e.position),t=e.position;0!==a&&!i(a);)a=e.input.charCodeAt(++e.position);for(o=e.input.slice(t,e.position),s=[],o.length<1&&d(e,"directive name must not be less than one character in length");0!==a;){for(;n(a);)a=e.input.charCodeAt(++e.position);if(35===a){do a=e.input.charCodeAt(++e.position);while(0!==a&&!r(a));break}if(r(a))break;for(t=e.position;0!==a&&!i(a);)a=e.input.charCodeAt(++e.position);s.push(e.input.slice(t,e.position))}0!==a&&v(e),q.call(st,o)?st[o](e,o,s):p(e,'unknown document directive "'+o+'"')}return y(e,!0,-1),0===e.lineIndent&&45===e.input.charCodeAt(e.position)&&45===e.input.charCodeAt(e.position+1)&&45===e.input.charCodeAt(e.position+2)?(e.position+=3,y(e,!0,-1)):l&&d(e,"directives end mark is expected"),z(e,e.lineIndent-1,X,!1,!0),y(e,!0,-1),e.checkLineBreaks&&Q.test(e.input.slice(u,e.position))&&p(e,"non-ASCII line breaks are interpreted as content"),e.documents.push(e.result),e.position===e.lineStart&&b(e)?void(46===e.input.charCodeAt(e.position)&&(e.position+=3,y(e,!0,-1))):void(e.positionn;n+=1)t(o[n])}function I(e,t){var r=j(e,t);if(0===r.length)return void 0;if(1===r.length)return r[0];throw new D("expected a single document in the stream, but found more")}function C(e,t,r){L(e,t,U.extend({schema:G},r))}function F(e,t){return I(e,U.extend({schema:G},t))}for(var U=e("./common"),D=e("./exception"),B=e("./mark"),G=e("./schema/default_safe"),V=e("./schema/default_full"),q=Object.prototype.hasOwnProperty,W=1,Z=2,H=3,X=4,Y=1,J=2,K=3,$=/[\x00-\x08\x0B\x0C\x0E-\x1F\x7F-\x84\x86-\x9F\uFFFE\uFFFF]|[\uD800-\uDBFF](?![\uDC00-\uDFFF])|(?:[^\uD800-\uDBFF]|^)[\uDC00-\uDFFF]/,Q=/[\x85\u2028\u2029]/,et=/[,\[\]\{\}]/,tt=/^(?:!|!!|![a-z\-]+!)$/i,rt=/^(?:!|[^,\[\]\{\}])(?:%[0-9a-f]{2}|[0-9a-z\-#;\/\?:@&=\+\$,_\.!~\*'\(\)\[\]])*$/i,nt=new Array(256),it=new Array(256),ot=0;256>ot;ot++)nt[ot]=l(ot)?1:0,it[ot]=l(ot);var st={YAML:function(e,t,r){var n,i,o;null!==e.version&&d(e,"duplication of %YAML directive"),1!==r.length&&d(e,"YAML directive accepts exactly one argument"),n=/^([0-9]+)\.([0-9]+)$/.exec(r[0]),null===n&&d(e,"ill-formed argument of the YAML directive"),i=parseInt(n[1],10),o=parseInt(n[2],10),1!==i&&d(e,"unacceptable YAML version of the document"),e.version=r[0],e.checkLineBreaks=2>o,1!==o&&2!==o&&p(e,"unsupported YAML version of the document")},TAG:function(e,t,r){var n,i;2!==r.length&&d(e,"TAG directive accepts exactly two arguments"),n=r[0],i=r[1],tt.test(n)||d(e,"ill-formed tag handle (first argument) of the TAG directive"),q.call(e.tagMap,n)&&d(e,'there is a previously declared suffix for "'+n+'" tag handle'),rt.test(i)||d(e,"ill-formed tag prefix (second argument) of the TAG directive"),e.tagMap[n]=i}};t.exports.loadAll=L,t.exports.load=I,t.exports.safeLoadAll=C,t.exports.safeLoad=F},{"./common":97,"./exception":98,"./mark":100,"./schema/default_full":103,"./schema/default_safe":104}],100:[function(e,t){"use strict";function r(e,t,r,n,i){this.name=e,this.buffer=t,this.position=r,this.line=n,this.column=i}var n=e("./common");r.prototype.getSnippet=function(e,t){var r,i,o,s,a;if(!this.buffer)return null;for(e=e||4,t=t||75,r="",i=this.position;i>0&&-1==="\x00\r\n…\u2028\u2029".indexOf(this.buffer.charAt(i-1));)if(i-=1,this.position-i>t/2-1){r=" ... ",i+=5;break}for(o="",s=this.position;st/2-1){o=" ... ",s-=5;break}return a=this.buffer.slice(i,s),n.repeat(" ",e)+r+a+o+"\n"+n.repeat(" ",e+this.position-i+r.length)+"^"},r.prototype.toString=function(e){var t,r="";return this.name&&(r+='in "'+this.name+'" '),r+="at line "+(this.line+1)+", column "+(this.column+1),e||(t=this.getSnippet(),t&&(r+=":\n"+t)),r},t.exports=r},{"./common":97}],101:[function(e,t){"use strict";function r(e,t,n){var i=[];return e.include.forEach(function(e){n=r(e,t,n)}),e[t].forEach(function(e){n.forEach(function(t,r){t.tag===e.tag&&i.push(r)}),n.push(e)}),n.filter(function(e,t){return-1===i.indexOf(t)})}function n(){function e(e){n[e.tag]=e}var t,r,n={};for(t=0,r=arguments.length;r>t;t+=1)arguments[t].forEach(e);return n}function i(e){this.include=e.include||[],this.implicit=e.implicit||[],this.explicit=e.explicit||[],this.implicit.forEach(function(e){if(e.loadKind&&"scalar"!==e.loadKind)throw new s("There is a non-scalar type in the implicit list of a schema. Implicit resolving of such types is not supported.")}),this.compiledImplicit=r(this,"implicit",[]),this.compiledExplicit=r(this,"explicit",[]),this.compiledTypeMap=n(this.compiledImplicit,this.compiledExplicit)}var o=e("./common"),s=e("./exception"),a=e("./type");i.DEFAULT=null,i.create=function(){var e,t;switch(arguments.length){case 1:e=i.DEFAULT,t=arguments[0];break;case 2:e=arguments[0],t=arguments[1];break;default:throw new s("Wrong number of arguments for Schema.create function")}if(e=o.toArray(e),t=o.toArray(t),!e.every(function(e){return e instanceof i}))throw new s("Specified list of super schemas (or a single Schema object) contains a non-Schema object.");if(!t.every(function(e){return e instanceof a}))throw new s("Specified list of YAML types (or a single Type object) contains a non-Type object.");return new i({include:e,explicit:t})},t.exports=i},{"./common":97,"./exception":98,"./type":107}],102:[function(e,t){"use strict";var r=e("../schema");t.exports=new r({include:[e("./json")]})},{"../schema":101,"./json":106}],103:[function(e,t){"use strict";var r=e("../schema");t.exports=r.DEFAULT=new r({include:[e("./default_safe")],explicit:[e("../type/js/undefined"),e("../type/js/regexp"),e("../type/js/function")]})},{"../schema":101,"../type/js/function":112,"../type/js/regexp":113,"../type/js/undefined":114,"./default_safe":104}],104:[function(e,t){"use strict";var r=e("../schema");t.exports=new r({include:[e("./core")],implicit:[e("../type/timestamp"),e("../type/merge")],explicit:[e("../type/binary"),e("../type/omap"),e("../type/pairs"),e("../type/set")]})},{"../schema":101,"../type/binary":108,"../type/merge":116,"../type/omap":118,"../type/pairs":119,"../type/set":121,"../type/timestamp":123,"./core":102}],105:[function(e,t){"use strict";var r=e("../schema");t.exports=new r({explicit:[e("../type/str"),e("../type/seq"),e("../type/map")]})},{"../schema":101,"../type/map":115,"../type/seq":120,"../type/str":122}],106:[function(e,t){"use strict";var r=e("../schema");t.exports=new r({include:[e("./failsafe")],implicit:[e("../type/null"),e("../type/bool"),e("../type/int"),e("../type/float")]})},{"../schema":101,"../type/bool":109,"../type/float":110,"../type/int":111,"../type/null":117,"./failsafe":105}],107:[function(e,t){"use strict";function r(e){var t={};return null!==e&&Object.keys(e).forEach(function(r){e[r].forEach(function(e){t[String(e)]=r})}),t}function n(e,t){if(t=t||{},Object.keys(t).forEach(function(t){if(-1===o.indexOf(t))throw new i('Unknown option "'+t+'" is met in definition of "'+e+'" YAML type.')}),this.tag=e,this.kind=t.kind||null,this.resolve=t.resolve||function(){return!0},this.construct=t.construct||function(e){return e},this.instanceOf=t.instanceOf||null,this.predicate=t.predicate||null,this.represent=t.represent||null,this.defaultStyle=t.defaultStyle||null,this.styleAliases=r(t.styleAliases||null),-1===s.indexOf(this.kind))throw new i('Unknown kind "'+this.kind+'" is specified for "'+e+'" YAML type.')}var i=e("./exception"),o=["kind","resolve","construct","instanceOf","predicate","represent","defaultStyle","styleAliases"],s=["scalar","sequence","mapping"];t.exports=n},{"./exception":98}],108:[function(e,t){"use strict";function r(e){if(null===e)return!1;var t,r,n=0,i=e.length,o=u;for(r=0;i>r;r++)if(t=o.indexOf(e.charAt(r)),!(t>64)){if(0>t)return!1;n+=6}return n%8===0}function n(e){var t,r,n=e.replace(/[\r\n=]/g,""),i=n.length,o=u,a=0,l=[];for(t=0;i>t;t++)t%4===0&&t&&(l.push(a>>16&255),l.push(a>>8&255),l.push(255&a)),a=a<<6|o.indexOf(n.charAt(t));return r=i%4*6,0===r?(l.push(a>>16&255),l.push(a>>8&255),l.push(255&a)):18===r?(l.push(a>>10&255),l.push(a>>2&255)):12===r&&l.push(a>>4&255),s?new s(l):l}function i(e){var t,r,n="",i=0,o=e.length,s=u;for(t=0;o>t;t++)t%3===0&&t&&(n+=s[i>>18&63],n+=s[i>>12&63],n+=s[i>>6&63],n+=s[63&i]),i=(i<<8)+e[t];return r=o%3,0===r?(n+=s[i>>18&63],n+=s[i>>12&63],n+=s[i>>6&63],n+=s[63&i]):2===r?(n+=s[i>>10&63],n+=s[i>>4&63],n+=s[i<<2&63],n+=s[64]):1===r&&(n+=s[i>>2&63],n+=s[i<<4&63],n+=s[64],n+=s[64]),n}function o(e){return s&&s.isBuffer(e)}var s=e("buffer").Buffer,a=e("../type"),u="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=\n\r";t.exports=new a("tag:yaml.org,2002:binary",{kind:"scalar",resolve:r,construct:n,predicate:o,represent:i})},{"../type":107,buffer:1}],109:[function(e,t){"use strict";function r(e){if(null===e)return!1;var t=e.length;return 4===t&&("true"===e||"True"===e||"TRUE"===e)||5===t&&("false"===e||"False"===e||"FALSE"===e)}function n(e){return"true"===e||"True"===e||"TRUE"===e}function i(e){return"[object Boolean]"===Object.prototype.toString.call(e)}var o=e("../type");t.exports=new o("tag:yaml.org,2002:bool",{kind:"scalar",resolve:r,construct:n,predicate:i,represent:{lowercase:function(e){return e?"true":"false"},uppercase:function(e){return e?"TRUE":"FALSE"},camelcase:function(e){return e?"True":"False"}},defaultStyle:"lowercase"})},{"../type":107}],110:[function(e,t){"use strict";function r(e){return null===e?!1:u.test(e)?!0:!1}function n(e){var t,r,n,i;return t=e.replace(/_/g,"").toLowerCase(),r="-"===t[0]?-1:1,i=[],"+-".indexOf(t[0])>=0&&(t=t.slice(1)),".inf"===t?1===r?Number.POSITIVE_INFINITY:Number.NEGATIVE_INFINITY:".nan"===t?0/0:t.indexOf(":")>=0?(t.split(":").forEach(function(e){i.unshift(parseFloat(e,10))}),t=0,n=1,i.forEach(function(e){t+=e*n,n*=60}),r*t):r*parseFloat(t,10)}function i(e,t){var r;if(isNaN(e))switch(t){case"lowercase":return".nan";case"uppercase":return".NAN";case"camelcase":return".NaN"}else if(Number.POSITIVE_INFINITY===e)switch(t){case"lowercase":return".inf";case"uppercase":return".INF";case"camelcase":return".Inf"}else if(Number.NEGATIVE_INFINITY===e)switch(t){case"lowercase":return"-.inf";case"uppercase":return"-.INF";case"camelcase":return"-.Inf"}else if(s.isNegativeZero(e))return"-0.0";return r=e.toString(10),l.test(r)?r.replace("e",".e"):r}function o(e){return"[object Number]"===Object.prototype.toString.call(e)&&(e%1!==0||s.isNegativeZero(e))}var s=e("../common"),a=e("../type"),u=new RegExp("^(?:[-+]?(?:[0-9][0-9_]*)\\.[0-9_]*(?:[eE][-+][0-9]+)?|\\.[0-9_]+(?:[eE][-+][0-9]+)?|[-+]?[0-9][0-9_]*(?::[0-5]?[0-9])+\\.[0-9_]*|[-+]?\\.(?:inf|Inf|INF)|\\.(?:nan|NaN|NAN))$"),l=/^[-+]?[0-9]+e/;t.exports=new a("tag:yaml.org,2002:float",{kind:"scalar",resolve:r,construct:n,predicate:o,represent:i,defaultStyle:"lowercase"})},{"../common":97,"../type":107}],111:[function(e,t){"use strict";function r(e){return e>=48&&57>=e||e>=65&&70>=e||e>=97&&102>=e}function n(e){return e>=48&&55>=e}function i(e){return e>=48&&57>=e}function o(e){if(null===e)return!1;var t,o=e.length,s=0,a=!1;if(!o)return!1;if(t=e[s],("-"===t||"+"===t)&&(t=e[++s]),"0"===t){if(s+1===o)return!0;if(t=e[++s],"b"===t){for(s++;o>s;s++)if(t=e[s],"_"!==t){if("0"!==t&&"1"!==t)return!1;a=!0}return a}if("x"===t){for(s++;o>s;s++)if(t=e[s],"_"!==t){if(!r(e.charCodeAt(s)))return!1;a=!0}return a}for(;o>s;s++)if(t=e[s],"_"!==t){if(!n(e.charCodeAt(s)))return!1;a=!0}return a}for(;o>s;s++)if(t=e[s],"_"!==t){if(":"===t)break;if(!i(e.charCodeAt(s)))return!1;a=!0}return a?":"!==t?!0:/^(:[0-5]?[0-9])+$/.test(e.slice(s)):!1}function s(e){var t,r,n=e,i=1,o=[];return-1!==n.indexOf("_")&&(n=n.replace(/_/g,"")),t=n[0],("-"===t||"+"===t)&&("-"===t&&(i=-1),n=n.slice(1),t=n[0]),"0"===n?0:"0"===t?"b"===n[1]?i*parseInt(n.slice(2),2):"x"===n[1]?i*parseInt(n,16):i*parseInt(n,8):-1!==n.indexOf(":")?(n.split(":").forEach(function(e){o.unshift(parseInt(e,10))}),n=0,r=1,o.forEach(function(e){n+=e*r,r*=60}),i*n):i*parseInt(n,10)}function a(e){return"[object Number]"===Object.prototype.toString.call(e)&&e%1===0&&!u.isNegativeZero(e)}var u=e("../common"),l=e("../type");t.exports=new l("tag:yaml.org,2002:int",{kind:"scalar",resolve:o,construct:s,predicate:a,represent:{binary:function(e){return"0b"+e.toString(2)},octal:function(e){return"0"+e.toString(8)},decimal:function(e){return e.toString(10)},hexadecimal:function(e){return"0x"+e.toString(16).toUpperCase()}},defaultStyle:"decimal",styleAliases:{binary:[2,"bin"],octal:[8,"oct"],decimal:[10,"dec"],hexadecimal:[16,"hex"]}})},{"../common":97,"../type":107}],112:[function(e,t){"use strict";function r(e){if(null===e)return!1;try{var t="("+e+")",r=s.parse(t,{range:!0});return"Program"!==r.type||1!==r.body.length||"ExpressionStatement"!==r.body[0].type||"FunctionExpression"!==r.body[0].expression.type?!1:!0}catch(n){return!1}}function n(e){var t,r="("+e+")",n=s.parse(r,{range:!0}),i=[];if("Program"!==n.type||1!==n.body.length||"ExpressionStatement"!==n.body[0].type||"FunctionExpression"!==n.body[0].expression.type)throw new Error("Failed to resolve function");return n.body[0].expression.params.forEach(function(e){i.push(e.name)}),t=n.body[0].expression.body.range,new Function(i,r.slice(t[0]+1,t[1]-1))}function i(e){return e.toString()}function o(e){return"[object Function]"===Object.prototype.toString.call(e)}var s;try{var a=e;s=a("esprima")}catch(u){"undefined"!=typeof window&&(s=window.esprima)}var l=e("../../type");t.exports=new l("tag:yaml.org,2002:js/function",{kind:"scalar",resolve:r,construct:n,predicate:o,represent:i})},{"../../type":107}],113:[function(e,t){"use strict";function r(e){if(null===e)return!1;if(0===e.length)return!1;var t=e,r=/\/([gim]*)$/.exec(e),n="";if("/"===t[0]){if(r&&(n=r[1]),n.length>3)return!1;if("/"!==t[t.length-n.length-1])return!1}return!0}function n(e){var t=e,r=/\/([gim]*)$/.exec(e),n="";return"/"===t[0]&&(r&&(n=r[1]),t=t.slice(1,t.length-n.length-1)),new RegExp(t,n)}function i(e){var t="/"+e.source+"/";return e.global&&(t+="g"),e.multiline&&(t+="m"),e.ignoreCase&&(t+="i"),t}function o(e){return"[object RegExp]"===Object.prototype.toString.call(e)}var s=e("../../type");t.exports=new s("tag:yaml.org,2002:js/regexp",{kind:"scalar",resolve:r,construct:n,predicate:o,represent:i})},{"../../type":107}],114:[function(e,t){"use strict";function r(){return!0}function n(){return void 0}function i(){return""}function o(e){return"undefined"==typeof e}var s=e("../../type");t.exports=new s("tag:yaml.org,2002:js/undefined",{kind:"scalar",resolve:r,construct:n,predicate:o,represent:i})},{"../../type":107}],115:[function(e,t){"use strict";var r=e("../type");t.exports=new r("tag:yaml.org,2002:map",{kind:"mapping",construct:function(e){return null!==e?e:{}}})},{"../type":107}],116:[function(e,t){"use strict";function r(e){return"<<"===e||null===e}var n=e("../type");t.exports=new n("tag:yaml.org,2002:merge",{kind:"scalar",resolve:r})},{"../type":107}],117:[function(e,t){"use strict";function r(e){if(null===e)return!0;var t=e.length;return 1===t&&"~"===e||4===t&&("null"===e||"Null"===e||"NULL"===e)}function n(){return null}function i(e){return null===e}var o=e("../type");t.exports=new o("tag:yaml.org,2002:null",{kind:"scalar",resolve:r,construct:n,predicate:i,represent:{canonical:function(){return"~"},lowercase:function(){return"null"},uppercase:function(){return"NULL"},camelcase:function(){return"Null"}},defaultStyle:"lowercase"})},{"../type":107}],118:[function(e,t){"use strict";function r(e){if(null===e)return!0;var t,r,n,i,a,u=[],l=e;for(t=0,r=l.length;r>t;t+=1){if(n=l[t],a=!1,"[object Object]"!==s.call(n))return!1;for(i in n)if(o.call(n,i)){if(a)return!1;a=!0}if(!a)return!1;if(-1!==u.indexOf(i))return!1;u.push(i)}return!0}function n(e){return null!==e?e:[]}var i=e("../type"),o=Object.prototype.hasOwnProperty,s=Object.prototype.toString;t.exports=new i("tag:yaml.org,2002:omap",{kind:"sequence",resolve:r,construct:n})},{"../type":107}],119:[function(e,t){"use strict";function r(e){if(null===e)return!0;var t,r,n,i,s,a=e;for(s=new Array(a.length),t=0,r=a.length;r>t;t+=1){if(n=a[t],"[object Object]"!==o.call(n))return!1;if(i=Object.keys(n),1!==i.length)return!1;s[t]=[i[0],n[i[0]]]}return!0}function n(e){if(null===e)return[];var t,r,n,i,o,s=e;for(o=new Array(s.length),t=0,r=s.length;r>t;t+=1)n=s[t],i=Object.keys(n),o[t]=[i[0],n[i[0]]];return o}var i=e("../type"),o=Object.prototype.toString;t.exports=new i("tag:yaml.org,2002:pairs",{kind:"sequence",resolve:r,construct:n})},{"../type":107}],120:[function(e,t){"use strict";var r=e("../type");t.exports=new r("tag:yaml.org,2002:seq",{kind:"sequence",construct:function(e){return null!==e?e:[]}})},{"../type":107}],121:[function(e,t){"use strict";function r(e){if(null===e)return!0;var t,r=e;for(t in r)if(o.call(r,t)&&null!==r[t])return!1;return!0}function n(e){return null!==e?e:{}}var i=e("../type"),o=Object.prototype.hasOwnProperty;t.exports=new i("tag:yaml.org,2002:set",{kind:"mapping",resolve:r,construct:n})},{"../type":107}],122:[function(e,t){"use strict";var r=e("../type");t.exports=new r("tag:yaml.org,2002:str",{kind:"scalar",construct:function(e){return null!==e?e:""}})},{"../type":107}],123:[function(e,t){"use strict";function r(e){return null===e?!1:null===s.exec(e)?!1:!0}function n(e){var t,r,n,i,o,a,u,l,c,f,h=0,d=null;if(t=s.exec(e),null===t)throw new Error("Date resolve error");if(r=+t[1],n=+t[2]-1,i=+t[3],!t[4])return new Date(Date.UTC(r,n,i));if(o=+t[4],a=+t[5],u=+t[6],t[7]){for(h=t[7].slice(0,3);h.length<3;)h+="0";h=+h}return t[9]&&(l=+t[10],c=+(t[11]||0),d=6e4*(60*l+c),"-"===t[9]&&(d=-d)),f=new Date(Date.UTC(r,n,i,o,a,u,h)),d&&f.setTime(f.getTime()-d),f}function i(e){return e.toISOString()}var o=e("../type"),s=new RegExp("^([0-9][0-9][0-9][0-9])-([0-9][0-9]?)-([0-9][0-9]?)(?:(?:[Tt]|[ \\t]+)([0-9][0-9]?):([0-9][0-9]):([0-9][0-9])(?:\\.([0-9]*))?(?:[ \\t]*(Z|([-+])([0-9][0-9]?)(?::([0-9][0-9]))?))?)?$");t.exports=new o("tag:yaml.org,2002:timestamp",{kind:"scalar",resolve:r,construct:n,instanceOf:Date,represent:i})},{"../type":107}],124:[function(e,t,r){"use strict";var n=(e("./utils"),e("./support")),i="ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=";r.decode=function(e){var t,r,o,s,a,u,l,c=0,f=0;e=e.replace(/[^A-Za-z0-9\+\/\=]/g,"");var h=3*e.length/4;e.charAt(e.length-1)===i.charAt(64)&&h--,e.charAt(e.length-2)===i.charAt(64)&&h--;var d;for(d=n.uint8array?new Uint8Array(h):new Array(h);c>4,r=(15&a)<<4|u>>2,o=(3&u)<<6|l,d[f++]=t,64!==u&&(d[f++]=r),64!==l&&(d[f++]=o);return d}},{"./support":150,"./utils":152}],125:[function(e,t){"use strict";function r(e,t,r,n,i){this.compressedSize=e,this.uncompressedSize=t,this.crc32=r,this.compression=n,this.compressedContent=i}var n=e("./external"),i=e("./stream/DataWorker"),o=e("./stream/DataLengthProbe"),s=e("./stream/Crc32Probe"),o=e("./stream/DataLengthProbe");r.prototype={getContentWorker:function(){var e=new i(n.Promise.resolve(this.compressedContent)).pipe(this.compression.uncompressWorker()).pipe(new o("data_length")),t=this;return e.on("end",function(){if(this.streamInfo.data_length!==t.uncompressedSize)throw new Error("Bug : uncompressed data size mismatch")}),e},getCompressedWorker:function(){return new i(n.Promise.resolve(this.compressedContent)).withStreamInfo("compressedSize",this.compressedSize).withStreamInfo("uncompressedSize",this.uncompressedSize).withStreamInfo("crc32",this.crc32).withStreamInfo("compression",this.compression)}},r.createWorkerFrom=function(e,t,r){return e.pipe(new s).pipe(new o("uncompressedSize")).pipe(t.compressWorker(r)).pipe(new o("compressedSize")).withStreamInfo("compression",t)},t.exports=r},{"./external":129,"./stream/Crc32Probe":145,"./stream/DataLengthProbe":146,"./stream/DataWorker":147}],126:[function(e,t,r){"use strict";var n=e("./stream/GenericWorker");r.STORE={magic:"\x00\x00",uncompressWorker:function(){return new n("STORE decompression")}},r.DEFLATE=e("./flate")},{"./flate":130,"./stream/GenericWorker":148}],127:[function(e,t){"use strict";function r(){for(var e,t=[],r=0;256>r;r++){e=r;for(var n=0;8>n;n++)e=1&e?3988292384^e>>>1:e>>>1;t[r]=e}return t}function n(e,t,r,n){var i=s,o=n+r;e=-1^e;for(var a=n;o>a;a++)e=e>>>8^i[255&(e^t[a])];return-1^e}function i(e,t,r,n){var i=s,o=n+r;e=-1^e;for(var a=n;o>a;a++)e=e>>>8^i[255&(e^t.charCodeAt(a))];return-1^e}var o=e("./utils"),s=r();t.exports=function(e,t){if("undefined"==typeof e||!e.length)return 0;var r="string"!==o.getTypeOf(e);return r?n(0|t,e,e.length,0):i(0|t,e,e.length,0)}},{"./utils":152}],128:[function(e,t,r){"use strict";r.base64=!1,r.binary=!1,r.dir=!1,r.createFolders=!0,r.date=null,r.compression=null,r.compressionOptions=null,r.comment=null,r.unixPermissions=null,r.dosPermissions=null},{}],129:[function(e,t){"use strict";t.exports={Promise:window.Promise}},{}],130:[function(e,t,r){"use strict";function n(e,t){a.call(this,"FlateWorker/"+e),this._pako=new o[e]({raw:!0,level:t.level||-1}),this.meta={};var r=this;this._pako.onData=function(e){r.push({data:e,meta:r.meta})}}var i="undefined"!=typeof Uint8Array&&"undefined"!=typeof Uint16Array&&"undefined"!=typeof Uint32Array,o=e("pako"),s=e("./utils"),a=e("./stream/GenericWorker"),u=i?"uint8array":"array";r.magic="\b\x00",s.inherits(n,a),n.prototype.processChunk=function(e){this.meta=e.meta,this._pako.push(s.transformTo(u,e.data),!1)},n.prototype.flush=function(){a.prototype.flush.call(this),this._pako.push([],!0)},n.prototype.cleanUp=function(){a.prototype.cleanUp.call(this),this._pako=null},r.compressWorker=function(e){return new n("Deflate",e)},r.uncompressWorker=function(){return new n("Inflate",{})}},{"./stream/GenericWorker":148,"./utils":152,pako:158}],131:[function(e,t){"use strict";function r(){if(!(this instanceof r))return new r;if(arguments.length)throw new Error("The constructor with parameters has been removed in JSZip 3.0, please check the upgrade guide.");this.files={},this.comment=null,this.root="",this.clone=function(){var e=new r;for(var t in this)"function"!=typeof this[t]&&(e[t]=this[t]);return e}}r.prototype=e("./object"),r.prototype.loadAsync=e("./load"),r.support=e("./support"),r.defaults=e("./defaults"),r.loadAsync=function(e,t){return(new r).loadAsync(e,t)},r.external=e("./external"),t.exports=r},{"./defaults":128,"./external":129,"./load":132,"./object":136,"./support":150}],132:[function(e,t){"use strict";function r(e){return new i.Promise(function(t,r){var n=e.decompressed.getContentWorker().pipe(new a);n.on("error",function(e){r(e)}).on("end",function(){n.streamInfo.crc32!==e.decompressed.crc32?r(new Error("Corrupted zip : CRC32 mismatch")):t()}).resume()})}var n=e("./utils"),i=e("./external"),o=e("./utf8"),n=e("./utils"),s=e("./zipEntries"),a=e("./stream/Crc32Probe"),u=e("./nodejsUtils");t.exports=function(e,t){var a=this;return t=n.extend(t||{},{base64:!1,checkCRC32:!1,optimizedBinaryString:!1,createFolders:!1,decodeFileName:o.utf8decode}),u.isNode&&u.isStream(e)?i.Promise.reject(new Error("JSZip can't accept a stream when loading a zip file.")):n.prepareContent("the loaded zip file",e,!0,t.optimizedBinaryString,t.base64).then(function(e){var r=new s(t);return r.load(e),r}).then(function(e){var n=[i.Promise.resolve(e)],o=e.files;if(t.checkCRC32)for(var s=0;s0?e.substring(0,t):""},h=function(e){return"/"!==e.slice(-1)&&(e+="/"),e},d=function(e,t){return t="undefined"!=typeof t?t:o.createFolders,e=h(e),this.files[e]||c.call(this,e,null,{dir:!0,createFolders:t}),this.files[e]},p={load:function(){throw new Error("This method has been removed in JSZip 3.0, please check the upgrade guide.")},forEach:function(e){var t,r,n;for(t in this.files)this.files.hasOwnProperty(t)&&(n=this.files[t],r=t.slice(this.root.length,t.length),r&&t.slice(0,this.root.length)===this.root&&e(r,n))},filter:function(e){var t=[];return this.forEach(function(r,n){e(r,n)&&t.push(n)}),t},file:function(e,t,n){if(1===arguments.length){if(r(e)){var i=e;return this.filter(function(e,t){return!t.dir&&i.test(e)})}var o=this.files[this.root+e];return o&&!o.dir?o:null}return e=this.root+e,c.call(this,e,t,n),this},folder:function(e){if(!e)return this;if(r(e))return this.filter(function(t,r){return r.dir&&e.test(t)});var t=this.root+e,n=d.call(this,t),i=this.clone();return i.root=n.name,i}};t.exports=p},{"./compressedObject":125,"./defaults":128,"./nodejs/NodejsStreamInputAdapter":133,"./nodejsUtils":135,"./stream/GenericWorker":148,"./utils":152,"./zipObject":155}],137:[function(e,t){"use strict";function r(e){n.call(this,e);for(var t=0;t=0;--o)if(this.data[o]===t&&this.data[o+1]===r&&this.data[o+2]===n&&this.data[o+3]===i)return o-this.zero;return-1},r.prototype.readAndCheckSignature=function(e){var t=e.charCodeAt(0),r=e.charCodeAt(1),n=e.charCodeAt(2),i=e.charCodeAt(3),o=this.readData(4);return t===o[0]&&r===o[1]&&n===o[2]&&i===o[3]},r.prototype.readData=function(e){if(this.checkOffset(e),0===e)return[];var t=this.data.slice(this.zero+this.index,this.zero+this.index+e);return this.index+=e,t},t.exports=r},{"../utils":152,"./DataReader":138}],138:[function(e,t){"use strict";function r(e){this.data=e,this.length=e.length,this.index=0,this.zero=0}var n=e("../utils");r.prototype={checkOffset:function(e){this.checkIndex(this.index+e)},checkIndex:function(e){if(this.lengthe)throw new Error("End of data reached (data length = "+this.length+", asked index = "+e+"). Corrupted zip ?")},setIndex:function(e){this.checkIndex(e),this.index=e},skip:function(e){this.setIndex(this.index+e)},byteAt:function(){},readInt:function(e){var t,r=0;for(this.checkOffset(e),t=this.index+e-1;t>=this.index;t--)r=(r<<8)+this.byteAt(t);return this.index+=e,r},readString:function(e){return n.transformTo("string",this.readData(e)) -},readData:function(){},lastIndexOfSignature:function(){},readAndCheckSignature:function(){},readDate:function(){var e=this.readInt(4);return new Date(Date.UTC((e>>25&127)+1980,(e>>21&15)-1,e>>16&31,e>>11&31,e>>5&63,(31&e)<<1))}},t.exports=r},{"../utils":152}],139:[function(e,t){"use strict";function r(e){n.call(this,e)}var n=e("./Uint8ArrayReader"),i=e("../utils");i.inherits(r,n),r.prototype.readData=function(e){this.checkOffset(e);var t=this.data.slice(this.zero+this.index,this.zero+this.index+e);return this.index+=e,t},t.exports=r},{"../utils":152,"./Uint8ArrayReader":141}],140:[function(e,t){"use strict";function r(e){n.call(this,e)}var n=e("./DataReader"),i=e("../utils");i.inherits(r,n),r.prototype.byteAt=function(e){return this.data.charCodeAt(this.zero+e)},r.prototype.lastIndexOfSignature=function(e){return this.data.lastIndexOf(e)-this.zero},r.prototype.readAndCheckSignature=function(e){var t=this.readData(4);return e===t},r.prototype.readData=function(e){this.checkOffset(e);var t=this.data.slice(this.zero+this.index,this.zero+this.index+e);return this.index+=e,t},t.exports=r},{"../utils":152,"./DataReader":138}],141:[function(e,t){"use strict";function r(e){n.call(this,e)}var n=e("./ArrayReader"),i=e("../utils");i.inherits(r,n),r.prototype.readData=function(e){if(this.checkOffset(e),0===e)return new Uint8Array(0);var t=this.data.subarray(this.zero+this.index,this.zero+this.index+e);return this.index+=e,t},t.exports=r},{"../utils":152,"./ArrayReader":137}],142:[function(e,t){"use strict";var r=e("../utils"),n=e("../support"),i=e("./ArrayReader"),o=e("./StringReader"),s=e("./NodeBufferReader"),a=e("./Uint8ArrayReader");t.exports=function(e){var t=r.getTypeOf(e);return r.checkSupport(t),"string"!==t||n.uint8array?"nodebuffer"===t?new s(e):n.uint8array?new a(r.transformTo("uint8array",e)):new i(r.transformTo("array",e)):new o(e)}},{"../support":150,"../utils":152,"./ArrayReader":137,"./NodeBufferReader":139,"./StringReader":140,"./Uint8ArrayReader":141}],143:[function(e,t,r){"use strict";r.LOCAL_FILE_HEADER="PK",r.CENTRAL_FILE_HEADER="PK",r.CENTRAL_DIRECTORY_END="PK",r.ZIP64_CENTRAL_DIRECTORY_LOCATOR="PK",r.ZIP64_CENTRAL_DIRECTORY_END="PK",r.DATA_DESCRIPTOR="PK\b"},{}],144:[function(e,t){"use strict";function r(e){n.call(this,"ConvertWorker to "+e),this.destType=e}var n=e("./GenericWorker"),i=e("../utils");i.inherits(r,n),r.prototype.processChunk=function(e){this.push({data:i.transformTo(this.destType,e.data),meta:e.meta})},t.exports=r},{"../utils":152,"./GenericWorker":148}],145:[function(e,t){"use strict";function r(){n.call(this,"Crc32Probe")}var n=e("./GenericWorker"),i=e("../crc32"),o=e("../utils");o.inherits(r,n),r.prototype.processChunk=function(e){this.streamInfo.crc32=i(e.data,this.streamInfo.crc32||0),this.push(e)},t.exports=r},{"../crc32":127,"../utils":152,"./GenericWorker":148}],146:[function(e,t){"use strict";function r(e){i.call(this,"DataLengthProbe for "+e),this.propName=e,this.withStreamInfo(e,0)}var n=e("../utils"),i=e("./GenericWorker");n.inherits(r,i),r.prototype.processChunk=function(e){if(e){var t=this.streamInfo[this.propName]||0;this.streamInfo[this.propName]=t+e.data.length}i.prototype.processChunk.call(this,e)},t.exports=r},{"../utils":152,"./GenericWorker":148}],147:[function(e,t){"use strict";function r(e){i.call(this,"DataWorker");var t=this;this.dataIsReady=!1,this.index=0,this.max=0,this.data=null,this.type="",this._tickScheduled=!1,e.then(function(e){t.dataIsReady=!0,t.data=e,t.max=e&&e.length||0,t.type=n.getTypeOf(e),t.isPaused||t._tickAndRepeat()},function(e){t.error(e)})}var n=e("../utils"),i=e("./GenericWorker"),o=16384;n.inherits(r,i),r.prototype.cleanUp=function(){i.prototype.cleanUp.call(this),this.data=null},r.prototype.resume=function(){return i.prototype.resume.call(this)?(!this._tickScheduled&&this.dataIsReady&&(this._tickScheduled=!0,n.delay(this._tickAndRepeat,[],this)),!0):!1},r.prototype._tickAndRepeat=function(){this._tickScheduled=!1,this.isPaused||this.isFinished||(this._tick(),this.isFinished||(n.delay(this._tickAndRepeat,[],this),this._tickScheduled=!0))},r.prototype._tick=function(){if(this.isPaused||this.isFinished)return!1;var e=o,t=null,r=Math.min(this.max,this.index+e);if(this.index>=this.max)return this.end();switch(this.type){case"string":t=this.data.substring(this.index,r);break;case"uint8array":t=this.data.subarray(this.index,r);break;case"array":case"nodebuffer":t=this.data.slice(this.index,r)}return this.index=r,this.push({data:t,meta:{percent:this.max?this.index/this.max*100:0}})},t.exports=r},{"../utils":152,"./GenericWorker":148}],148:[function(e,t){"use strict";function r(e){this.name=e||"default",this.streamInfo={},this.generatedError=null,this.extraStreamInfo={},this.isPaused=!0,this.isFinished=!1,this.isLocked=!1,this._listeners={data:[],end:[],error:[]},this.previous=null}r.prototype={push:function(e){this.emit("data",e)},end:function(){if(this.isFinished)return!1;this.flush();try{this.emit("end"),this.cleanUp(),this.isFinished=!0}catch(e){this.emit("error",e)}return!0},error:function(e){return this.isFinished?!1:(this.isPaused?this.generatedError=e:(this.isFinished=!0,this.emit("error",e),this.previous&&this.previous.error(e),this.cleanUp()),!0)},on:function(e,t){return this._listeners[e].push(t),this},cleanUp:function(){this.streamInfo=this.generatedError=this.extraStreamInfo=null,this._listeners=[]},emit:function(e,t){if(this._listeners[e])for(var r=0;r "+e:e}},t.exports=r},{}],149:[function(e,t){(function(r){"use strict";function n(e,t,r){switch(e){case"blob":return a.newBlob(a.transformTo("arraybuffer",t),r);case"base64":return c.encode(t);default:return a.transformTo(e,t)}}function i(e,t){var n,i=0,o=null,s=0;for(n=0;nc;c++)l[c]=c>=252?6:c>=248?5:c>=240?4:c>=224?3:c>=192?2:1;l[254]=l[254]=1;var f=function(e){var t,r,n,i,o,a=e.length,u=0;for(i=0;a>i;i++)r=e.charCodeAt(i),55296===(64512&r)&&a>i+1&&(n=e.charCodeAt(i+1),56320===(64512&n)&&(r=65536+(r-55296<<10)+(n-56320),i++)),u+=128>r?1:2048>r?2:65536>r?3:4;for(t=s.uint8array?new Uint8Array(u):new Array(u),o=0,i=0;u>o;i++)r=e.charCodeAt(i),55296===(64512&r)&&a>i+1&&(n=e.charCodeAt(i+1),56320===(64512&n)&&(r=65536+(r-55296<<10)+(n-56320),i++)),128>r?t[o++]=r:2048>r?(t[o++]=192|r>>>6,t[o++]=128|63&r):65536>r?(t[o++]=224|r>>>12,t[o++]=128|r>>>6&63,t[o++]=128|63&r):(t[o++]=240|r>>>18,t[o++]=128|r>>>12&63,t[o++]=128|r>>>6&63,t[o++]=128|63&r);return t},h=function(e,t){var r;for(t=t||e.length,t>e.length&&(t=e.length),r=t-1;r>=0&&128===(192&e[r]);)r--;return 0>r?t:0===r?t:r+l[e[r]]>t?r:t},d=function(e){var t,r,n,i,s=e.length,a=new Array(2*s);for(r=0,t=0;s>t;)if(n=e[t++],128>n)a[r++]=n;else if(i=l[n],i>4)a[r++]=65533,t+=i-1;else{for(n&=2===i?31:3===i?15:7;i>1&&s>t;)n=n<<6|63&e[t++],i--;i>1?a[r++]=65533:65536>n?a[r++]=n:(n-=65536,a[r++]=55296|n>>10&1023,a[r++]=56320|1023&n)}return a.length!==r&&(a.subarray?a=a.subarray(0,r):a.length=r),o.applyFromCharCode(a)};r.utf8encode=function(e){return s.nodebuffer?a.newBuffer(e,"utf-8"):f(e)},r.utf8decode=function(e){return s.nodebuffer?o.transformTo("nodebuffer",e).toString("utf-8"):(e=o.transformTo(s.uint8array?"uint8array":"array",e),d(e))},o.inherits(n,u),n.prototype.processChunk=function(e){var t=o.transformTo(s.uint8array?"uint8array":"array",e.data);if(this.leftOver&&this.leftOver.length){if(s.uint8array){var n=t;t=new Uint8Array(n.length+this.leftOver.length),t.set(this.leftOver,0),t.set(n,this.leftOver.length)}else t=this.leftOver.concat(t);this.leftOver=null}var i=h(t),a=t;i!==t.length&&(s.uint8array?(a=t.subarray(0,i),this.leftOver=t.subarray(i,t.length)):(a=t.slice(0,i),this.leftOver=t.slice(i,t.length))),this.push({data:r.utf8decode(a),meta:e.meta})},n.prototype.flush=function(){this.leftOver&&this.leftOver.length&&(this.push({data:r.utf8decode(this.leftOver),meta:{}}),this.leftOver=null)},r.Utf8DecodeWorker=n,o.inherits(i,u),i.prototype.processChunk=function(e){this.push({data:r.utf8encode(e.data),meta:e.meta})},r.Utf8EncodeWorker=i},{"./nodejsUtils":135,"./stream/GenericWorker":148,"./support":150,"./utils":152}],152:[function(e,t,r){"use strict";function n(e){var t=null;return t=u.uint8array?new Uint8Array(e.length):new Array(e.length),o(e,t)}function i(e){return e}function o(e,t){for(var r=0;r1;)try{return d.stringifyByChunk(e,n,t)}catch(o){t=Math.floor(t/2)}return d.stringifyByChar(e)}function a(e,t){for(var r=0;r=o)return String.fromCharCode.apply(null,e);for(;o>i;)n.push("array"===t||"nodebuffer"===t?String.fromCharCode.apply(null,e.slice(i,Math.min(i+r,o))):String.fromCharCode.apply(null,e.subarray(i,Math.min(i+r,o)))),i+=r;return n.join("")},stringifyByChar:function(e){for(var t="",r=0;rt?"0":"")+t.toString(16).toUpperCase();return n},r.delay=function(e,t,r){f(function(){e.apply(r||null,t||[])})},r.inherits=function(e,t){var r=function(){};r.prototype=t.prototype,e.prototype=new r},r.extend=function(){var e,t,r={};for(e=0;ei;)e=this.reader.readInt(2),t=this.reader.readInt(4),r=this.reader.readData(t),this.zip64ExtensibleData[e]={id:e,length:t,value:r}},readBlockZip64EndOfCentralLocator:function(){if(this.diskWithZip64CentralDirStart=this.reader.readInt(4),this.relativeOffsetEndOfZip64CentralDir=this.reader.readInt(8),this.disksCount=this.reader.readInt(4),this.disksCount>1)throw new Error("Multi-volumes zip are not supported")},readLocalFiles:function(){var e,t;for(e=0;ee){var t=!this.isSignature(0,o.LOCAL_FILE_HEADER);throw new Error(t?"Can't find end of central directory : is this a zip file ? If it is, see http://stuk.github.io/jszip/documentation/howto/read_zip.html":"Corrupted zip : can't find end of central directory")}this.reader.setIndex(e);var r=e;if(this.checkSignature(o.CENTRAL_DIRECTORY_END),this.readBlockEndOfCentral(),this.diskNumber===i.MAX_VALUE_16BITS||this.diskWithCentralDirStart===i.MAX_VALUE_16BITS||this.centralDirRecordsOnThisDisk===i.MAX_VALUE_16BITS||this.centralDirRecords===i.MAX_VALUE_16BITS||this.centralDirSize===i.MAX_VALUE_32BITS||this.centralDirOffset===i.MAX_VALUE_32BITS){if(this.zip64=!0,e=this.reader.lastIndexOfSignature(o.ZIP64_CENTRAL_DIRECTORY_LOCATOR),0>e)throw new Error("Corrupted zip : can't find the ZIP64 end of central directory locator");if(this.reader.setIndex(e),this.checkSignature(o.ZIP64_CENTRAL_DIRECTORY_LOCATOR),this.readBlockZip64EndOfCentralLocator(),!this.isSignature(this.relativeOffsetEndOfZip64CentralDir,o.ZIP64_CENTRAL_DIRECTORY_END)&&(this.relativeOffsetEndOfZip64CentralDir=this.reader.lastIndexOfSignature(o.ZIP64_CENTRAL_DIRECTORY_END),this.relativeOffsetEndOfZip64CentralDir<0))throw new Error("Corrupted zip : can't find the ZIP64 end of central directory");this.reader.setIndex(this.relativeOffsetEndOfZip64CentralDir),this.checkSignature(o.ZIP64_CENTRAL_DIRECTORY_END),this.readBlockZip64EndOfCentral()}var n=this.centralDirOffset+this.centralDirSize;this.zip64&&(n+=20,n+=12+this.zip64EndOfCentralSize);var s=r-n;if(s>0)this.isSignature(r,o.CENTRAL_FILE_HEADER)||(this.reader.zero=s);else if(0>s)throw new Error("Corrupted zip: missing "+Math.abs(s)+" bytes.")},prepareReader:function(e){this.reader=n(e)},load:function(e){this.prepareReader(e),this.readEndOfCentral(),this.readCentralDir(),this.readLocalFiles()}},t.exports=r},{"./reader/readerFor":142,"./signature":143,"./support":150,"./utf8":151,"./utils":152,"./zipEntry":154}],154:[function(e,t){"use strict";function r(e,t){this.options=e,this.loadOptions=t}var n=e("./reader/readerFor"),i=e("./utils"),o=e("./compressedObject"),s=e("./crc32"),a=e("./utf8"),u=e("./compressions"),l=e("./support"),c=0,f=3,h=function(e){for(var t in u)if(u.hasOwnProperty(t)&&u[t].magic===e)return u[t];return null};r.prototype={isEncrypted:function(){return 1===(1&this.bitFlag)},useUTF8:function(){return 2048===(2048&this.bitFlag)},readLocalPart:function(e){var t,r;if(e.skip(22),this.fileNameLength=e.readInt(2),r=e.readInt(2),this.fileName=e.readData(this.fileNameLength),e.skip(r),-1===this.compressedSize||-1===this.uncompressedSize)throw new Error("Bug or corrupted zip : didn't get enough informations from the central directory (compressedSize === -1 || uncompressedSize === -1)");if(t=h(this.compressionMethod),null===t)throw new Error("Corrupted zip : compression "+i.pretty(this.compressionMethod)+" unknown (inner file : "+i.transformTo("string",this.fileName)+")");this.decompressed=new o(this.compressedSize,this.uncompressedSize,this.crc32,t,e.readData(this.compressedSize))},readCentralPart:function(e){this.versionMadeBy=e.readInt(2),e.skip(2),this.bitFlag=e.readInt(2),this.compressionMethod=e.readString(2),this.date=e.readDate(),this.crc32=e.readInt(4),this.compressedSize=e.readInt(4),this.uncompressedSize=e.readInt(4);var t=e.readInt(2);if(this.extraFieldsLength=e.readInt(2),this.fileCommentLength=e.readInt(2),this.diskNumberStart=e.readInt(2),this.internalFileAttributes=e.readInt(2),this.externalFileAttributes=e.readInt(4),this.localHeaderOffset=e.readInt(4),this.isEncrypted())throw new Error("Encrypted zip are not supported");e.skip(t),this.readExtraFields(e),this.parseZIP64ExtraField(e),this.fileComment=e.readData(this.fileCommentLength)},processAttributes:function(){this.unixPermissions=null,this.dosPermissions=null;var e=this.versionMadeBy>>8;this.dir=16&this.externalFileAttributes?!0:!1,e===c&&(this.dosPermissions=63&this.externalFileAttributes),e===f&&(this.unixPermissions=this.externalFileAttributes>>16&65535),this.dir||"/"!==this.fileNameStr.slice(-1)||(this.dir=!0)},parseZIP64ExtraField:function(){if(this.extraFields[1]){var e=n(this.extraFields[1].value);this.uncompressedSize===i.MAX_VALUE_32BITS&&(this.uncompressedSize=e.readInt(8)),this.compressedSize===i.MAX_VALUE_32BITS&&(this.compressedSize=e.readInt(8)),this.localHeaderOffset===i.MAX_VALUE_32BITS&&(this.localHeaderOffset=e.readInt(8)),this.diskNumberStart===i.MAX_VALUE_32BITS&&(this.diskNumberStart=e.readInt(4))}},readExtraFields:function(e){var t,r,n,i=e.index+this.extraFieldsLength;for(this.extraFields||(this.extraFields={});e.indexc){for(var t=0,r=a.length-l;r>t;t++)a[t]=a[t+l];a.length-=l,l=0}}a.length=0,l=0,u=!1}function i(e){var t=1,r=new h(e),n=document.createTextNode("");return r.observe(n,{characterData:!0}),function(){t=-t,n.data=t}}function o(e){return function(){function t(){clearTimeout(r),clearInterval(n),e()}var r=setTimeout(t,0),n=setInterval(t,50)}}t.exports=r;var s,a=[],u=!1,l=0,c=1024,f="undefined"!=typeof e?e:self,h=f.MutationObserver||f.WebKitMutationObserver;s="function"==typeof h?i(n):o(n),r.requestFlush=s,r.makeRequestCallFromTimer=o}).call(this,"undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{}],158:[function(e,t){"use strict";var r=e("./lib/utils/common").assign,n=e("./lib/deflate"),i=e("./lib/inflate"),o=e("./lib/zlib/constants"),s={};r(s,n,i,o),t.exports=s},{"./lib/deflate":159,"./lib/inflate":160,"./lib/utils/common":161,"./lib/zlib/constants":164}],159:[function(e,t,r){"use strict";function n(e){if(!(this instanceof n))return new n(e);this.options=u.assign({level:v,method:b,chunkSize:16384,windowBits:15,memLevel:8,strategy:y,to:""},e||{});var t=this.options;t.raw&&t.windowBits>0?t.windowBits=-t.windowBits:t.gzip&&t.windowBits>0&&t.windowBits<16&&(t.windowBits+=16),this.err=0,this.msg="",this.ended=!1,this.chunks=[],this.strm=new f,this.strm.avail_out=0;var r=a.deflateInit2(this.strm,t.level,t.method,t.windowBits,t.memLevel,t.strategy);if(r!==_)throw new Error(c[r]);if(t.header&&a.deflateSetHeader(this.strm,t.header),t.dictionary){var i;if(i="string"==typeof t.dictionary?l.string2buf(t.dictionary):"[object ArrayBuffer]"===h.call(t.dictionary)?new Uint8Array(t.dictionary):t.dictionary,r=a.deflateSetDictionary(this.strm,i),r!==_)throw new Error(c[r]);this._dict_set=!0}}function i(e,t){var r=new n(t);if(r.push(e,!0),r.err)throw r.msg;return r.result}function o(e,t){return t=t||{},t.raw=!0,i(e,t)}function s(e,t){return t=t||{},t.gzip=!0,i(e,t)}var a=e("./zlib/deflate"),u=e("./utils/common"),l=e("./utils/strings"),c=e("./zlib/messages"),f=e("./zlib/zstream"),h=Object.prototype.toString,d=0,p=4,_=0,m=1,g=2,v=-1,y=0,b=8;n.prototype.push=function(e,t){var r,n,i=this.strm,o=this.options.chunkSize;if(this.ended)return!1;n=t===~~t?t:t===!0?p:d,i.input="string"==typeof e?l.string2buf(e):"[object ArrayBuffer]"===h.call(e)?new Uint8Array(e):e,i.next_in=0,i.avail_in=i.input.length;do{if(0===i.avail_out&&(i.output=new u.Buf8(o),i.next_out=0,i.avail_out=o),r=a.deflate(i,n),r!==m&&r!==_)return this.onEnd(r),this.ended=!0,!1;(0===i.avail_out||0===i.avail_in&&(n===p||n===g))&&this.onData("string"===this.options.to?l.buf2binstring(u.shrinkBuf(i.output,i.next_out)):u.shrinkBuf(i.output,i.next_out))}while((i.avail_in>0||0===i.avail_out)&&r!==m);return n===p?(r=a.deflateEnd(this.strm),this.onEnd(r),this.ended=!0,r===_):n===g?(this.onEnd(_),i.avail_out=0,!0):!0},n.prototype.onData=function(e){this.chunks.push(e)},n.prototype.onEnd=function(e){e===_&&(this.result="string"===this.options.to?this.chunks.join(""):u.flattenChunks(this.chunks)),this.chunks=[],this.err=e,this.msg=this.strm.msg},r.Deflate=n,r.deflate=i,r.deflateRaw=o,r.gzip=s},{"./utils/common":161,"./utils/strings":162,"./zlib/deflate":166,"./zlib/messages":171,"./zlib/zstream":173}],160:[function(e,t,r){"use strict";function n(e){if(!(this instanceof n))return new n(e);this.options=a.assign({chunkSize:16384,windowBits:0,to:""},e||{});var t=this.options;t.raw&&t.windowBits>=0&&t.windowBits<16&&(t.windowBits=-t.windowBits,0===t.windowBits&&(t.windowBits=-15)),!(t.windowBits>=0&&t.windowBits<16)||e&&e.windowBits||(t.windowBits+=32),t.windowBits>15&&t.windowBits<48&&0===(15&t.windowBits)&&(t.windowBits|=15),this.err=0,this.msg="",this.ended=!1,this.chunks=[],this.strm=new f,this.strm.avail_out=0;var r=s.inflateInit2(this.strm,t.windowBits);if(r!==l.Z_OK)throw new Error(c[r]);this.header=new h,s.inflateGetHeader(this.strm,this.header)}function i(e,t){var r=new n(t);if(r.push(e,!0),r.err)throw r.msg;return r.result}function o(e,t){return t=t||{},t.raw=!0,i(e,t)}var s=e("./zlib/inflate"),a=e("./utils/common"),u=e("./utils/strings"),l=e("./zlib/constants"),c=e("./zlib/messages"),f=e("./zlib/zstream"),h=e("./zlib/gzheader"),d=Object.prototype.toString;n.prototype.push=function(e,t){var r,n,i,o,c,f,h=this.strm,p=this.options.chunkSize,_=this.options.dictionary,m=!1;if(this.ended)return!1;n=t===~~t?t:t===!0?l.Z_FINISH:l.Z_NO_FLUSH,h.input="string"==typeof e?u.binstring2buf(e):"[object ArrayBuffer]"===d.call(e)?new Uint8Array(e):e,h.next_in=0,h.avail_in=h.input.length;do{if(0===h.avail_out&&(h.output=new a.Buf8(p),h.next_out=0,h.avail_out=p),r=s.inflate(h,l.Z_NO_FLUSH),r===l.Z_NEED_DICT&&_&&(f="string"==typeof _?u.string2buf(_):"[object ArrayBuffer]"===d.call(_)?new Uint8Array(_):_,r=s.inflateSetDictionary(this.strm,f)),r===l.Z_BUF_ERROR&&m===!0&&(r=l.Z_OK,m=!1),r!==l.Z_STREAM_END&&r!==l.Z_OK)return this.onEnd(r),this.ended=!0,!1;h.next_out&&(0===h.avail_out||r===l.Z_STREAM_END||0===h.avail_in&&(n===l.Z_FINISH||n===l.Z_SYNC_FLUSH))&&("string"===this.options.to?(i=u.utf8border(h.output,h.next_out),o=h.next_out-i,c=u.buf2string(h.output,i),h.next_out=o,h.avail_out=p-o,o&&a.arraySet(h.output,h.output,i,o,0),this.onData(c)):this.onData(a.shrinkBuf(h.output,h.next_out))),0===h.avail_in&&0===h.avail_out&&(m=!0) -}while((h.avail_in>0||0===h.avail_out)&&r!==l.Z_STREAM_END);return r===l.Z_STREAM_END&&(n=l.Z_FINISH),n===l.Z_FINISH?(r=s.inflateEnd(this.strm),this.onEnd(r),this.ended=!0,r===l.Z_OK):n===l.Z_SYNC_FLUSH?(this.onEnd(l.Z_OK),h.avail_out=0,!0):!0},n.prototype.onData=function(e){this.chunks.push(e)},n.prototype.onEnd=function(e){e===l.Z_OK&&(this.result="string"===this.options.to?this.chunks.join(""):a.flattenChunks(this.chunks)),this.chunks=[],this.err=e,this.msg=this.strm.msg},r.Inflate=n,r.inflate=i,r.inflateRaw=o,r.ungzip=i},{"./utils/common":161,"./utils/strings":162,"./zlib/constants":164,"./zlib/gzheader":167,"./zlib/inflate":169,"./zlib/messages":171,"./zlib/zstream":173}],161:[function(e,t,r){"use strict";var n="undefined"!=typeof Uint8Array&&"undefined"!=typeof Uint16Array&&"undefined"!=typeof Int32Array;r.assign=function(e){for(var t=Array.prototype.slice.call(arguments,1);t.length;){var r=t.shift();if(r){if("object"!=typeof r)throw new TypeError(r+"must be non-object");for(var n in r)r.hasOwnProperty(n)&&(e[n]=r[n])}}return e},r.shrinkBuf=function(e,t){return e.length===t?e:e.subarray?e.subarray(0,t):(e.length=t,e)};var i={arraySet:function(e,t,r,n,i){if(t.subarray&&e.subarray)return void e.set(t.subarray(r,r+n),i);for(var o=0;n>o;o++)e[i+o]=t[r+o]},flattenChunks:function(e){var t,r,n,i,o,s;for(n=0,t=0,r=e.length;r>t;t++)n+=e[t].length;for(s=new Uint8Array(n),i=0,t=0,r=e.length;r>t;t++)o=e[t],s.set(o,i),i+=o.length;return s}},o={arraySet:function(e,t,r,n,i){for(var o=0;n>o;o++)e[i+o]=t[r+o]},flattenChunks:function(e){return[].concat.apply([],e)}};r.setTyped=function(e){e?(r.Buf8=Uint8Array,r.Buf16=Uint16Array,r.Buf32=Int32Array,r.assign(r,i)):(r.Buf8=Array,r.Buf16=Array,r.Buf32=Array,r.assign(r,o))},r.setTyped(n)},{}],162:[function(e,t,r){"use strict";function n(e,t){if(65537>t&&(e.subarray&&s||!e.subarray&&o))return String.fromCharCode.apply(null,i.shrinkBuf(e,t));for(var r="",n=0;t>n;n++)r+=String.fromCharCode(e[n]);return r}var i=e("./common"),o=!0,s=!0;try{String.fromCharCode.apply(null,[0])}catch(a){o=!1}try{String.fromCharCode.apply(null,new Uint8Array(1))}catch(a){s=!1}for(var u=new i.Buf8(256),l=0;256>l;l++)u[l]=l>=252?6:l>=248?5:l>=240?4:l>=224?3:l>=192?2:1;u[254]=u[254]=1,r.string2buf=function(e){var t,r,n,o,s,a=e.length,u=0;for(o=0;a>o;o++)r=e.charCodeAt(o),55296===(64512&r)&&a>o+1&&(n=e.charCodeAt(o+1),56320===(64512&n)&&(r=65536+(r-55296<<10)+(n-56320),o++)),u+=128>r?1:2048>r?2:65536>r?3:4;for(t=new i.Buf8(u),s=0,o=0;u>s;o++)r=e.charCodeAt(o),55296===(64512&r)&&a>o+1&&(n=e.charCodeAt(o+1),56320===(64512&n)&&(r=65536+(r-55296<<10)+(n-56320),o++)),128>r?t[s++]=r:2048>r?(t[s++]=192|r>>>6,t[s++]=128|63&r):65536>r?(t[s++]=224|r>>>12,t[s++]=128|r>>>6&63,t[s++]=128|63&r):(t[s++]=240|r>>>18,t[s++]=128|r>>>12&63,t[s++]=128|r>>>6&63,t[s++]=128|63&r);return t},r.buf2binstring=function(e){return n(e,e.length)},r.binstring2buf=function(e){for(var t=new i.Buf8(e.length),r=0,n=t.length;n>r;r++)t[r]=e.charCodeAt(r);return t},r.buf2string=function(e,t){var r,i,o,s,a=t||e.length,l=new Array(2*a);for(i=0,r=0;a>r;)if(o=e[r++],128>o)l[i++]=o;else if(s=u[o],s>4)l[i++]=65533,r+=s-1;else{for(o&=2===s?31:3===s?15:7;s>1&&a>r;)o=o<<6|63&e[r++],s--;s>1?l[i++]=65533:65536>o?l[i++]=o:(o-=65536,l[i++]=55296|o>>10&1023,l[i++]=56320|1023&o)}return n(l,i)},r.utf8border=function(e,t){var r;for(t=t||e.length,t>e.length&&(t=e.length),r=t-1;r>=0&&128===(192&e[r]);)r--;return 0>r?t:0===r?t:r+u[e[r]]>t?r:t}},{"./common":161}],163:[function(e,t){"use strict";function r(e,t,r,n){for(var i=65535&e|0,o=e>>>16&65535|0,s=0;0!==r;){s=r>2e3?2e3:r,r-=s;do i=i+t[n++]|0,o=o+i|0;while(--s);i%=65521,o%=65521}return i|o<<16|0}t.exports=r},{}],164:[function(e,t){"use strict";t.exports={Z_NO_FLUSH:0,Z_PARTIAL_FLUSH:1,Z_SYNC_FLUSH:2,Z_FULL_FLUSH:3,Z_FINISH:4,Z_BLOCK:5,Z_TREES:6,Z_OK:0,Z_STREAM_END:1,Z_NEED_DICT:2,Z_ERRNO:-1,Z_STREAM_ERROR:-2,Z_DATA_ERROR:-3,Z_BUF_ERROR:-5,Z_NO_COMPRESSION:0,Z_BEST_SPEED:1,Z_BEST_COMPRESSION:9,Z_DEFAULT_COMPRESSION:-1,Z_FILTERED:1,Z_HUFFMAN_ONLY:2,Z_RLE:3,Z_FIXED:4,Z_DEFAULT_STRATEGY:0,Z_BINARY:0,Z_TEXT:1,Z_UNKNOWN:2,Z_DEFLATED:8}},{}],165:[function(e,t){"use strict";function r(){for(var e,t=[],r=0;256>r;r++){e=r;for(var n=0;8>n;n++)e=1&e?3988292384^e>>>1:e>>>1;t[r]=e}return t}function n(e,t,r,n){var o=i,s=n+r;e^=-1;for(var a=n;s>a;a++)e=e>>>8^o[255&(e^t[a])];return-1^e}var i=r();t.exports=n},{}],166:[function(e,t,r){"use strict";function n(e,t){return e.msg=j[t],t}function i(e){return(e<<1)-(e>4?9:0)}function o(e){for(var t=e.length;--t>=0;)e[t]=0}function s(e){var t=e.state,r=t.pending;r>e.avail_out&&(r=e.avail_out),0!==r&&(P.arraySet(e.output,t.pending_buf,t.pending_out,r,e.next_out),e.next_out+=r,t.pending_out+=r,e.total_out+=r,e.avail_out-=r,t.pending-=r,0===t.pending&&(t.pending_out=0))}function a(e,t){O._tr_flush_block(e,e.block_start>=0?e.block_start:-1,e.strstart-e.block_start,t),e.block_start=e.strstart,s(e.strm)}function u(e,t){e.pending_buf[e.pending++]=t}function l(e,t){e.pending_buf[e.pending++]=t>>>8&255,e.pending_buf[e.pending++]=255&t}function c(e,t,r,n){var i=e.avail_in;return i>n&&(i=n),0===i?0:(e.avail_in-=i,P.arraySet(t,e.input,e.next_in,i,r),1===e.state.wrap?e.adler=z(e.adler,t,i,r):2===e.state.wrap&&(e.adler=N(e.adler,t,i,r)),e.next_in+=i,e.total_in+=i,i)}function f(e,t){var r,n,i=e.max_chain_length,o=e.strstart,s=e.prev_length,a=e.nice_match,u=e.strstart>e.w_size-ft?e.strstart-(e.w_size-ft):0,l=e.window,c=e.w_mask,f=e.prev,h=e.strstart+ct,d=l[o+s-1],p=l[o+s];e.prev_length>=e.good_match&&(i>>=2),a>e.lookahead&&(a=e.lookahead);do if(r=t,l[r+s]===p&&l[r+s-1]===d&&l[r]===l[o]&&l[++r]===l[o+1]){o+=2,r++;do;while(l[++o]===l[++r]&&l[++o]===l[++r]&&l[++o]===l[++r]&&l[++o]===l[++r]&&l[++o]===l[++r]&&l[++o]===l[++r]&&l[++o]===l[++r]&&l[++o]===l[++r]&&h>o);if(n=ct-(h-o),o=h-ct,n>s){if(e.match_start=t,s=n,n>=a)break;d=l[o+s-1],p=l[o+s]}}while((t=f[t&c])>u&&0!==--i);return s<=e.lookahead?s:e.lookahead}function h(e){var t,r,n,i,o,s=e.w_size;do{if(i=e.window_size-e.lookahead-e.strstart,e.strstart>=s+(s-ft)){P.arraySet(e.window,e.window,s,s,0),e.match_start-=s,e.strstart-=s,e.block_start-=s,r=e.hash_size,t=r;do n=e.head[--t],e.head[t]=n>=s?n-s:0;while(--r);r=s,t=r;do n=e.prev[--t],e.prev[t]=n>=s?n-s:0;while(--r);i+=s}if(0===e.strm.avail_in)break;if(r=c(e.strm,e.window,e.strstart+e.lookahead,i),e.lookahead+=r,e.lookahead+e.insert>=lt)for(o=e.strstart-e.insert,e.ins_h=e.window[o],e.ins_h=(e.ins_h<e.pending_buf_size-5&&(r=e.pending_buf_size-5);;){if(e.lookahead<=1){if(h(e),0===e.lookahead&&t===L)return bt;if(0===e.lookahead)break}e.strstart+=e.lookahead,e.lookahead=0;var n=e.block_start+r;if((0===e.strstart||e.strstart>=n)&&(e.lookahead=e.strstart-n,e.strstart=n,a(e,!1),0===e.strm.avail_out))return bt;if(e.strstart-e.block_start>=e.w_size-ft&&(a(e,!1),0===e.strm.avail_out))return bt}return e.insert=0,t===F?(a(e,!0),0===e.strm.avail_out?wt:kt):e.strstart>e.block_start&&(a(e,!1),0===e.strm.avail_out)?bt:bt}function p(e,t){for(var r,n;;){if(e.lookahead=lt&&(e.ins_h=(e.ins_h<=lt)if(n=O._tr_tally(e,e.strstart-e.match_start,e.match_length-lt),e.lookahead-=e.match_length,e.match_length<=e.max_lazy_match&&e.lookahead>=lt){e.match_length--;do e.strstart++,e.ins_h=(e.ins_h<=lt&&(e.ins_h=(e.ins_h<4096)&&(e.match_length=lt-1)),e.prev_length>=lt&&e.match_length<=e.prev_length){i=e.strstart+e.lookahead-lt,n=O._tr_tally(e,e.strstart-1-e.prev_match,e.prev_length-lt),e.lookahead-=e.prev_length-1,e.prev_length-=2;do++e.strstart<=i&&(e.ins_h=(e.ins_h<=lt&&e.strstart>0&&(i=e.strstart-1,n=s[i],n===s[++i]&&n===s[++i]&&n===s[++i])){o=e.strstart+ct;do;while(n===s[++i]&&n===s[++i]&&n===s[++i]&&n===s[++i]&&n===s[++i]&&n===s[++i]&&n===s[++i]&&n===s[++i]&&o>i);e.match_length=ct-(o-i),e.match_length>e.lookahead&&(e.match_length=e.lookahead)}if(e.match_length>=lt?(r=O._tr_tally(e,1,e.match_length-lt),e.lookahead-=e.match_length,e.strstart+=e.match_length,e.match_length=0):(r=O._tr_tally(e,0,e.window[e.strstart]),e.lookahead--,e.strstart++),r&&(a(e,!1),0===e.strm.avail_out))return bt}return e.insert=0,t===F?(a(e,!0),0===e.strm.avail_out?wt:kt):e.last_lit&&(a(e,!1),0===e.strm.avail_out)?bt:xt}function g(e,t){for(var r;;){if(0===e.lookahead&&(h(e),0===e.lookahead)){if(t===L)return bt;break}if(e.match_length=0,r=O._tr_tally(e,0,e.window[e.strstart]),e.lookahead--,e.strstart++,r&&(a(e,!1),0===e.strm.avail_out))return bt}return e.insert=0,t===F?(a(e,!0),0===e.strm.avail_out?wt:kt):e.last_lit&&(a(e,!1),0===e.strm.avail_out)?bt:xt}function v(e,t,r,n,i){this.good_length=e,this.max_lazy=t,this.nice_length=r,this.max_chain=n,this.func=i}function y(e){e.window_size=2*e.w_size,o(e.head),e.max_lazy_match=M[e.level].max_lazy,e.good_match=M[e.level].good_length,e.nice_match=M[e.level].nice_length,e.max_chain_length=M[e.level].max_chain,e.strstart=0,e.block_start=0,e.lookahead=0,e.insert=0,e.match_length=e.prev_length=lt-1,e.match_available=0,e.ins_h=0}function b(){this.strm=null,this.status=0,this.pending_buf=null,this.pending_buf_size=0,this.pending_out=0,this.pending=0,this.wrap=0,this.gzhead=null,this.gzindex=0,this.method=$,this.last_flush=-1,this.w_size=0,this.w_bits=0,this.w_mask=0,this.window=null,this.window_size=0,this.prev=null,this.head=null,this.ins_h=0,this.hash_size=0,this.hash_bits=0,this.hash_mask=0,this.hash_shift=0,this.block_start=0,this.match_length=0,this.prev_match=0,this.match_available=0,this.strstart=0,this.match_start=0,this.lookahead=0,this.prev_length=0,this.max_chain_length=0,this.max_lazy_match=0,this.level=0,this.strategy=0,this.good_match=0,this.nice_match=0,this.dyn_ltree=new P.Buf16(2*at),this.dyn_dtree=new P.Buf16(2*(2*ot+1)),this.bl_tree=new P.Buf16(2*(2*st+1)),o(this.dyn_ltree),o(this.dyn_dtree),o(this.bl_tree),this.l_desc=null,this.d_desc=null,this.bl_desc=null,this.bl_count=new P.Buf16(ut+1),this.heap=new P.Buf16(2*it+1),o(this.heap),this.heap_len=0,this.heap_max=0,this.depth=new P.Buf16(2*it+1),o(this.depth),this.l_buf=0,this.lit_bufsize=0,this.last_lit=0,this.d_buf=0,this.opt_len=0,this.static_len=0,this.matches=0,this.insert=0,this.bi_buf=0,this.bi_valid=0}function x(e){var t;return e&&e.state?(e.total_in=e.total_out=0,e.data_type=K,t=e.state,t.pending=0,t.pending_out=0,t.wrap<0&&(t.wrap=-t.wrap),t.status=t.wrap?dt:vt,e.adler=2===t.wrap?0:1,t.last_flush=L,O._tr_init(t),D):n(e,G)}function w(e){var t=x(e);return t===D&&y(e.state),t}function k(e,t){return e&&e.state?2!==e.state.wrap?G:(e.state.gzhead=t,D):G}function A(e,t,r,i,o,s){if(!e)return G;var a=1;if(t===W&&(t=6),0>i?(a=0,i=-i):i>15&&(a=2,i-=16),1>o||o>Q||r!==$||8>i||i>15||0>t||t>9||0>s||s>Y)return n(e,G);8===i&&(i=9);var u=new b;return e.state=u,u.strm=e,u.wrap=a,u.gzhead=null,u.w_bits=i,u.w_size=1<U||0>t)return e?n(e,G):G;if(a=e.state,!e.output||!e.input&&0!==e.avail_in||a.status===yt&&t!==F)return n(e,0===e.avail_out?q:G);if(a.strm=e,r=a.last_flush,a.last_flush=t,a.status===dt)if(2===a.wrap)e.adler=0,u(a,31),u(a,139),u(a,8),a.gzhead?(u(a,(a.gzhead.text?1:0)+(a.gzhead.hcrc?2:0)+(a.gzhead.extra?4:0)+(a.gzhead.name?8:0)+(a.gzhead.comment?16:0)),u(a,255&a.gzhead.time),u(a,a.gzhead.time>>8&255),u(a,a.gzhead.time>>16&255),u(a,a.gzhead.time>>24&255),u(a,9===a.level?2:a.strategy>=H||a.level<2?4:0),u(a,255&a.gzhead.os),a.gzhead.extra&&a.gzhead.extra.length&&(u(a,255&a.gzhead.extra.length),u(a,a.gzhead.extra.length>>8&255)),a.gzhead.hcrc&&(e.adler=N(e.adler,a.pending_buf,a.pending,0)),a.gzindex=0,a.status=pt):(u(a,0),u(a,0),u(a,0),u(a,0),u(a,0),u(a,9===a.level?2:a.strategy>=H||a.level<2?4:0),u(a,At),a.status=vt);else{var h=$+(a.w_bits-8<<4)<<8,d=-1;d=a.strategy>=H||a.level<2?0:a.level<6?1:6===a.level?2:3,h|=d<<6,0!==a.strstart&&(h|=ht),h+=31-h%31,a.status=vt,l(a,h),0!==a.strstart&&(l(a,e.adler>>>16),l(a,65535&e.adler)),e.adler=1}if(a.status===pt)if(a.gzhead.extra){for(c=a.pending;a.gzindex<(65535&a.gzhead.extra.length)&&(a.pending!==a.pending_buf_size||(a.gzhead.hcrc&&a.pending>c&&(e.adler=N(e.adler,a.pending_buf,a.pending-c,c)),s(e),c=a.pending,a.pending!==a.pending_buf_size));)u(a,255&a.gzhead.extra[a.gzindex]),a.gzindex++;a.gzhead.hcrc&&a.pending>c&&(e.adler=N(e.adler,a.pending_buf,a.pending-c,c)),a.gzindex===a.gzhead.extra.length&&(a.gzindex=0,a.status=_t)}else a.status=_t;if(a.status===_t)if(a.gzhead.name){c=a.pending;do{if(a.pending===a.pending_buf_size&&(a.gzhead.hcrc&&a.pending>c&&(e.adler=N(e.adler,a.pending_buf,a.pending-c,c)),s(e),c=a.pending,a.pending===a.pending_buf_size)){f=1;break}f=a.gzindexc&&(e.adler=N(e.adler,a.pending_buf,a.pending-c,c)),0===f&&(a.gzindex=0,a.status=mt)}else a.status=mt;if(a.status===mt)if(a.gzhead.comment){c=a.pending;do{if(a.pending===a.pending_buf_size&&(a.gzhead.hcrc&&a.pending>c&&(e.adler=N(e.adler,a.pending_buf,a.pending-c,c)),s(e),c=a.pending,a.pending===a.pending_buf_size)){f=1;break}f=a.gzindexc&&(e.adler=N(e.adler,a.pending_buf,a.pending-c,c)),0===f&&(a.status=gt)}else a.status=gt;if(a.status===gt&&(a.gzhead.hcrc?(a.pending+2>a.pending_buf_size&&s(e),a.pending+2<=a.pending_buf_size&&(u(a,255&e.adler),u(a,e.adler>>8&255),e.adler=0,a.status=vt)):a.status=vt),0!==a.pending){if(s(e),0===e.avail_out)return a.last_flush=-1,D}else if(0===e.avail_in&&i(t)<=i(r)&&t!==F)return n(e,q);if(a.status===yt&&0!==e.avail_in)return n(e,q);if(0!==e.avail_in||0!==a.lookahead||t!==L&&a.status!==yt){var p=a.strategy===H?g(a,t):a.strategy===X?m(a,t):M[a.level].func(a,t);if((p===wt||p===kt)&&(a.status=yt),p===bt||p===wt)return 0===e.avail_out&&(a.last_flush=-1),D;if(p===xt&&(t===I?O._tr_align(a):t!==U&&(O._tr_stored_block(a,0,0,!1),t===C&&(o(a.head),0===a.lookahead&&(a.strstart=0,a.block_start=0,a.insert=0))),s(e),0===e.avail_out))return a.last_flush=-1,D}return t!==F?D:a.wrap<=0?B:(2===a.wrap?(u(a,255&e.adler),u(a,e.adler>>8&255),u(a,e.adler>>16&255),u(a,e.adler>>24&255),u(a,255&e.total_in),u(a,e.total_in>>8&255),u(a,e.total_in>>16&255),u(a,e.total_in>>24&255)):(l(a,e.adler>>>16),l(a,65535&e.adler)),s(e),a.wrap>0&&(a.wrap=-a.wrap),0!==a.pending?D:B)}function S(e){var t;return e&&e.state?(t=e.state.status,t!==dt&&t!==pt&&t!==_t&&t!==mt&&t!==gt&&t!==vt&&t!==yt?n(e,G):(e.state=null,t===vt?n(e,V):D)):G}function R(e,t){var r,n,i,s,a,u,l,c,f=t.length;if(!e||!e.state)return G;if(r=e.state,s=r.wrap,2===s||1===s&&r.status!==dt||r.lookahead)return G;for(1===s&&(e.adler=z(e.adler,t,f,0)),r.wrap=0,f>=r.w_size&&(0===s&&(o(r.head),r.strstart=0,r.block_start=0,r.insert=0),c=new P.Buf8(r.w_size),P.arraySet(c,t,f-r.w_size,r.w_size,0),t=c,f=r.w_size),a=e.avail_in,u=e.next_in,l=e.input,e.avail_in=f,e.next_in=0,e.input=t,h(r);r.lookahead>=lt;){n=r.strstart,i=r.lookahead-(lt-1);do r.ins_h=(r.ins_h<m&&(_+=S[o++]<>>24,_>>>=w,m-=w,w=x>>>16&255,0===w)R[a++]=65535&x;else{if(!(16&w)){if(0===(64&w)){x=g[(65535&x)+(_&(1<m&&(_+=S[o++]<>>=w,m-=w),15>m&&(_+=S[o++]<>>24,_>>>=w,m-=w,w=x>>>16&255,!(16&w)){if(0===(64&w)){x=v[(65535&x)+(_&(1<m&&(_+=S[o++]<m&&(_+=S[o++]<c){e.msg="invalid distance too far back",i.mode=r;break e}if(_>>>=w,m-=w,w=a-u,A>w){if(w=A-w,w>h&&i.sane){e.msg="invalid distance too far back",i.mode=r;break e}if(T=0,E=p,0===d){if(T+=f-w,k>w){k-=w;do R[a++]=p[T++];while(--w);T=a-A,E=R}}else if(w>d){if(T+=f+d-w,w-=d,k>w){k-=w;do R[a++]=p[T++];while(--w);if(T=0,k>d){w=d,k-=w;do R[a++]=p[T++];while(--w);T=a-A,E=R}}}else if(T+=d-w,k>w){k-=w;do R[a++]=p[T++];while(--w);T=a-A,E=R}for(;k>2;)R[a++]=E[T++],R[a++]=E[T++],R[a++]=E[T++],k-=3;k&&(R[a++]=E[T++],k>1&&(R[a++]=E[T++]))}else{T=a-A;do R[a++]=R[T++],R[a++]=R[T++],R[a++]=R[T++],k-=3;while(k>2);k&&(R[a++]=R[T++],k>1&&(R[a++]=R[T++]))}break}}break}}while(s>o&&l>a);k=m>>3,o-=k,m-=k<<3,_&=(1<o?5+(s-o):5-(o-s),e.avail_out=l>a?257+(l-a):257-(a-l),i.hold=_,i.bits=m}},{}],169:[function(e,t,r){"use strict";function n(e){return(e>>>24&255)+(e>>>8&65280)+((65280&e)<<8)+((255&e)<<24)}function i(){this.mode=0,this.last=!1,this.wrap=0,this.havedict=!1,this.flags=0,this.dmax=0,this.check=0,this.total=0,this.head=null,this.wbits=0,this.wsize=0,this.whave=0,this.wnext=0,this.window=null,this.hold=0,this.bits=0,this.length=0,this.offset=0,this.extra=0,this.lencode=null,this.distcode=null,this.lenbits=0,this.distbits=0,this.ncode=0,this.nlen=0,this.ndist=0,this.have=0,this.next=null,this.lens=new v.Buf16(320),this.work=new v.Buf16(288),this.lendyn=null,this.distdyn=null,this.sane=0,this.back=0,this.was=0}function o(e){var t;return e&&e.state?(t=e.state,e.total_in=e.total_out=t.total=0,e.msg="",t.wrap&&(e.adler=1&t.wrap),t.mode=C,t.last=0,t.havedict=0,t.dmax=32768,t.head=null,t.hold=0,t.bits=0,t.lencode=t.lendyn=new v.Buf32(_t),t.distcode=t.distdyn=new v.Buf32(mt),t.sane=1,t.back=-1,M):z}function s(e){var t;return e&&e.state?(t=e.state,t.wsize=0,t.whave=0,t.wnext=0,o(e)):z}function a(e,t){var r,n;return e&&e.state?(n=e.state,0>t?(r=0,t=-t):(r=(t>>4)+1,48>t&&(t&=15)),t&&(8>t||t>15)?z:(null!==n.window&&n.wbits!==t&&(n.window=null),n.wrap=r,n.wbits=t,s(e))):z}function u(e,t){var r,n;return e?(n=new i,e.state=n,n.window=null,r=a(e,t),r!==M&&(e.state=null),r):z}function l(e){return u(e,vt)}function c(e){if(yt){var t;for(m=new v.Buf32(512),g=new v.Buf32(32),t=0;144>t;)e.lens[t++]=8;for(;256>t;)e.lens[t++]=9;for(;280>t;)e.lens[t++]=7;for(;288>t;)e.lens[t++]=8;for(w(A,e.lens,0,288,m,0,e.work,{bits:9}),t=0;32>t;)e.lens[t++]=5;w(T,e.lens,0,32,g,0,e.work,{bits:5}),yt=!1}e.lencode=m,e.lenbits=9,e.distcode=g,e.distbits=5}function f(e,t,r,n){var i,o=e.state;return null===o.window&&(o.wsize=1<=o.wsize?(v.arraySet(o.window,t,r-o.wsize,o.wsize,0),o.wnext=0,o.whave=o.wsize):(i=o.wsize-o.wnext,i>n&&(i=n),v.arraySet(o.window,t,r-n,i,o.wnext),n-=i,n?(v.arraySet(o.window,t,r-n,n,0),o.wnext=n,o.whave=o.wsize):(o.wnext+=i,o.wnext===o.wsize&&(o.wnext=0),o.whaved;){if(0===u)break e;u--,h+=i[s++]<>>8&255,r.check=b(r.check,St,2,0),h=0,d=0,r.mode=F;break}if(r.flags=0,r.head&&(r.head.done=!1),!(1&r.wrap)||(((255&h)<<8)+(h>>8))%31){e.msg="incorrect header check",r.mode=ht;break}if((15&h)!==I){e.msg="unknown compression method",r.mode=ht;break}if(h>>>=4,d-=4,wt=(15&h)+8,0===r.wbits)r.wbits=wt;else if(wt>r.wbits){e.msg="invalid window size",r.mode=ht;break}r.dmax=1<d;){if(0===u)break e;u--,h+=i[s++]<>8&1),512&r.flags&&(St[0]=255&h,St[1]=h>>>8&255,r.check=b(r.check,St,2,0)),h=0,d=0,r.mode=U;case U:for(;32>d;){if(0===u)break e;u--,h+=i[s++]<>>8&255,St[2]=h>>>16&255,St[3]=h>>>24&255,r.check=b(r.check,St,4,0)),h=0,d=0,r.mode=D;case D:for(;16>d;){if(0===u)break e;u--,h+=i[s++]<>8),512&r.flags&&(St[0]=255&h,St[1]=h>>>8&255,r.check=b(r.check,St,2,0)),h=0,d=0,r.mode=B;case B:if(1024&r.flags){for(;16>d;){if(0===u)break e;u--,h+=i[s++]<>>8&255,r.check=b(r.check,St,2,0)),h=0,d=0}else r.head&&(r.head.extra=null);r.mode=G;case G:if(1024&r.flags&&(m=r.length,m>u&&(m=u),m&&(r.head&&(wt=r.head.extra_len-r.length,r.head.extra||(r.head.extra=new Array(r.head.extra_len)),v.arraySet(r.head.extra,i,s,m,wt)),512&r.flags&&(r.check=b(r.check,i,m,s)),u-=m,s+=m,r.length-=m),r.length))break e;r.length=0,r.mode=V;case V:if(2048&r.flags){if(0===u)break e;m=0;do wt=i[s+m++],r.head&&wt&&r.length<65536&&(r.head.name+=String.fromCharCode(wt));while(wt&&u>m);if(512&r.flags&&(r.check=b(r.check,i,m,s)),u-=m,s+=m,wt)break e}else r.head&&(r.head.name=null);r.length=0,r.mode=q;case q:if(4096&r.flags){if(0===u)break e;m=0;do wt=i[s+m++],r.head&&wt&&r.length<65536&&(r.head.comment+=String.fromCharCode(wt));while(wt&&u>m);if(512&r.flags&&(r.check=b(r.check,i,m,s)),u-=m,s+=m,wt)break e}else r.head&&(r.head.comment=null);r.mode=W;case W:if(512&r.flags){for(;16>d;){if(0===u)break e;u--,h+=i[s++]<>9&1,r.head.done=!0),e.adler=r.check=0,r.mode=X;break;case Z:for(;32>d;){if(0===u)break e;u--,h+=i[s++]<>>=7&d,d-=7&d,r.mode=lt;break}for(;3>d;){if(0===u)break e;u--,h+=i[s++]<>>=1,d-=1,3&h){case 0:r.mode=J;break;case 1:if(c(r),r.mode=rt,t===R){h>>>=2,d-=2;break e}break;case 2:r.mode=Q;break;case 3:e.msg="invalid block type",r.mode=ht}h>>>=2,d-=2;break;case J:for(h>>>=7&d,d-=7&d;32>d;){if(0===u)break e;u--,h+=i[s++]<>>16^65535)){e.msg="invalid stored block lengths",r.mode=ht;break}if(r.length=65535&h,h=0,d=0,r.mode=K,t===R)break e;case K:r.mode=$;case $:if(m=r.length){if(m>u&&(m=u),m>l&&(m=l),0===m)break e;v.arraySet(o,i,s,m,a),u-=m,s+=m,l-=m,a+=m,r.length-=m;break}r.mode=X;break;case Q:for(;14>d;){if(0===u)break e;u--,h+=i[s++]<>>=5,d-=5,r.ndist=(31&h)+1,h>>>=5,d-=5,r.ncode=(15&h)+4,h>>>=4,d-=4,r.nlen>286||r.ndist>30){e.msg="too many length or distance symbols",r.mode=ht;break}r.have=0,r.mode=et;case et:for(;r.haved;){if(0===u)break e;u--,h+=i[s++]<>>=3,d-=3}for(;r.have<19;)r.lens[Rt[r.have++]]=0;if(r.lencode=r.lendyn,r.lenbits=7,At={bits:r.lenbits},kt=w(k,r.lens,0,19,r.lencode,0,r.work,At),r.lenbits=At.bits,kt){e.msg="invalid code lengths set",r.mode=ht;break}r.have=0,r.mode=tt;case tt:for(;r.have>>24,gt=Et>>>16&255,vt=65535&Et,!(d>=mt);){if(0===u)break e;u--,h+=i[s++]<vt)h>>>=mt,d-=mt,r.lens[r.have++]=vt;else{if(16===vt){for(Tt=mt+2;Tt>d;){if(0===u)break e;u--,h+=i[s++]<>>=mt,d-=mt,0===r.have){e.msg="invalid bit length repeat",r.mode=ht;break}wt=r.lens[r.have-1],m=3+(3&h),h>>>=2,d-=2}else if(17===vt){for(Tt=mt+3;Tt>d;){if(0===u)break e;u--,h+=i[s++]<>>=mt,d-=mt,wt=0,m=3+(7&h),h>>>=3,d-=3}else{for(Tt=mt+7;Tt>d;){if(0===u)break e;u--,h+=i[s++]<>>=mt,d-=mt,wt=0,m=11+(127&h),h>>>=7,d-=7}if(r.have+m>r.nlen+r.ndist){e.msg="invalid bit length repeat",r.mode=ht;break}for(;m--;)r.lens[r.have++]=wt}}if(r.mode===ht)break;if(0===r.lens[256]){e.msg="invalid code -- missing end-of-block",r.mode=ht;break}if(r.lenbits=9,At={bits:r.lenbits},kt=w(A,r.lens,0,r.nlen,r.lencode,0,r.work,At),r.lenbits=At.bits,kt){e.msg="invalid literal/lengths set",r.mode=ht;break}if(r.distbits=6,r.distcode=r.distdyn,At={bits:r.distbits},kt=w(T,r.lens,r.nlen,r.ndist,r.distcode,0,r.work,At),r.distbits=At.bits,kt){e.msg="invalid distances set",r.mode=ht;break}if(r.mode=rt,t===R)break e;case rt:r.mode=nt;case nt:if(u>=6&&l>=258){e.next_out=a,e.avail_out=l,e.next_in=s,e.avail_in=u,r.hold=h,r.bits=d,x(e,_),a=e.next_out,o=e.output,l=e.avail_out,s=e.next_in,i=e.input,u=e.avail_in,h=r.hold,d=r.bits,r.mode===X&&(r.back=-1);break}for(r.back=0;Et=r.lencode[h&(1<>>24,gt=Et>>>16&255,vt=65535&Et,!(d>=mt);){if(0===u)break e;u--,h+=i[s++]<>yt)],mt=Et>>>24,gt=Et>>>16&255,vt=65535&Et,!(d>=yt+mt);){if(0===u)break e;u--,h+=i[s++]<>>=yt,d-=yt,r.back+=yt}if(h>>>=mt,d-=mt,r.back+=mt,r.length=vt,0===gt){r.mode=ut;break}if(32>){r.back=-1,r.mode=X;break}if(64>){e.msg="invalid literal/length code",r.mode=ht;break}r.extra=15>,r.mode=it;case it:if(r.extra){for(Tt=r.extra;Tt>d;){if(0===u)break e;u--,h+=i[s++]<>>=r.extra,d-=r.extra,r.back+=r.extra}r.was=r.length,r.mode=ot;case ot:for(;Et=r.distcode[h&(1<>>24,gt=Et>>>16&255,vt=65535&Et,!(d>=mt);){if(0===u)break e;u--,h+=i[s++]<>yt)],mt=Et>>>24,gt=Et>>>16&255,vt=65535&Et,!(d>=yt+mt);){if(0===u)break e;u--,h+=i[s++]<>>=yt,d-=yt,r.back+=yt}if(h>>>=mt,d-=mt,r.back+=mt,64>){e.msg="invalid distance code",r.mode=ht;break}r.offset=vt,r.extra=15>,r.mode=st;case st:if(r.extra){for(Tt=r.extra;Tt>d;){if(0===u)break e;u--,h+=i[s++]<>>=r.extra,d-=r.extra,r.back+=r.extra}if(r.offset>r.dmax){e.msg="invalid distance too far back",r.mode=ht;break}r.mode=at;case at:if(0===l)break e;if(m=_-l,r.offset>m){if(m=r.offset-m,m>r.whave&&r.sane){e.msg="invalid distance too far back",r.mode=ht;break}m>r.wnext?(m-=r.wnext,g=r.wsize-m):g=r.wnext-m,m>r.length&&(m=r.length),_t=r.window}else _t=o,g=a-r.offset,m=r.length;m>l&&(m=l),l-=m,r.length-=m;do o[a++]=_t[g++];while(--m);0===r.length&&(r.mode=nt);break;case ut:if(0===l)break e;o[a++]=r.length,l--,r.mode=nt;break;case lt:if(r.wrap){for(;32>d;){if(0===u)break e;u--,h|=i[s++]<d;){if(0===u)break e;u--,h+=i[s++]<=M;M++)B[M]=0;for(P=0;p>P;P++)B[t[d+P]]++;for(N=R,z=n;z>=1&&0===B[z];z--);if(N>z&&(N=z),0===z)return _[m++]=20971520,_[m++]=20971520,v.bits=1,0;for(O=1;z>O&&0===B[O];O++);for(O>N&&(N=O),I=1,M=1;n>=M;M++)if(I<<=1,I-=B[M],0>I)return-1;if(I>0&&(e===s||1!==z))return-1;for(G[1]=0,M=1;n>M;M++)G[M+1]=G[M]+B[M];for(P=0;p>P;P++)0!==t[d+P]&&(g[G[t[d+P]]++]=P);if(e===s?(U=V=g,A=19):e===a?(U=l,D-=257,V=c,q-=257,A=256):(U=f,V=h,A=-1),F=0,P=0,M=O,k=m,j=N,L=0,x=-1,C=1<i||e===u&&C>o)return 1;for(var W=0;;){W++,T=M-L,g[P]A?(E=V[q+g[P]],S=U[D+g[P]]):(E=96,S=0),y=1<>L)+b]=T<<24|E<<16|S|0;while(0!==b);for(y=1<>=1;if(0!==y?(F&=y-1,F+=y):F=0,P++,0===--B[M]){if(M===z)break;M=t[d+g[P]]}if(M>N&&(F&w)!==x){for(0===L&&(L=N),k+=O,j=M-L,I=1<j+L&&(I-=B[j+L],!(0>=I));)j++,I<<=1;if(C+=1<i||e===u&&C>o)return 1;x=F&w,_[x]=N<<24|j<<16|k-m|0}}return 0!==F&&(_[k+F]=M-L<<24|64<<16|0),v.bits=N,0}},{"../utils/common":161}],171:[function(e,t){"use strict";t.exports={2:"need dictionary",1:"stream end",0:"","-1":"file error","-2":"stream error","-3":"data error","-4":"insufficient memory","-5":"buffer error","-6":"incompatible version"}},{}],172:[function(e,t,r){"use strict";function n(e){for(var t=e.length;--t>=0;)e[t]=0}function i(e,t,r,n,i){this.static_tree=e,this.extra_bits=t,this.extra_base=r,this.elems=n,this.max_length=i,this.has_stree=e&&e.length}function o(e,t){this.dyn_tree=e,this.max_code=0,this.stat_desc=t}function s(e){return 256>e?ut[e]:ut[256+(e>>>7)]}function a(e,t){e.pending_buf[e.pending++]=255&t,e.pending_buf[e.pending++]=t>>>8&255}function u(e,t,r){e.bi_valid>Y-r?(e.bi_buf|=t<>Y-e.bi_valid,e.bi_valid+=r-Y):(e.bi_buf|=t<>>=1,r<<=1;while(--t>0);return r>>>1}function f(e){16===e.bi_valid?(a(e,e.bi_buf),e.bi_buf=0,e.bi_valid=0):e.bi_valid>=8&&(e.pending_buf[e.pending++]=255&e.bi_buf,e.bi_buf>>=8,e.bi_valid-=8)}function h(e,t){var r,n,i,o,s,a,u=t.dyn_tree,l=t.max_code,c=t.stat_desc.static_tree,f=t.stat_desc.has_stree,h=t.stat_desc.extra_bits,d=t.stat_desc.extra_base,p=t.stat_desc.max_length,_=0;for(o=0;X>=o;o++)e.bl_count[o]=0;for(u[2*e.heap[e.heap_max]+1]=0,r=e.heap_max+1;H>r;r++)n=e.heap[r],o=u[2*u[2*n+1]+1]+1,o>p&&(o=p,_++),u[2*n+1]=o,n>l||(e.bl_count[o]++,s=0,n>=d&&(s=h[n-d]),a=u[2*n],e.opt_len+=a*(o+s),f&&(e.static_len+=a*(c[2*n+1]+s)));if(0!==_){do{for(o=p-1;0===e.bl_count[o];)o--;e.bl_count[o]--,e.bl_count[o+1]+=2,e.bl_count[p]--,_-=2}while(_>0);for(o=p;0!==o;o--)for(n=e.bl_count[o];0!==n;)i=e.heap[--r],i>l||(u[2*i+1]!==o&&(e.opt_len+=(o-u[2*i+1])*u[2*i],u[2*i+1]=o),n--)}}function d(e,t,r){var n,i,o=new Array(X+1),s=0;for(n=1;X>=n;n++)o[n]=s=s+r[n-1]<<1;for(i=0;t>=i;i++){var a=e[2*i+1];0!==a&&(e[2*i]=c(o[a]++,a))}}function p(){var e,t,r,n,o,s=new Array(X+1);for(r=0,n=0;G-1>n;n++)for(ct[n]=r,e=0;e<1<n;n++)for(ft[n]=o,e=0;e<1<>=7;W>n;n++)for(ft[n]=o<<7,e=0;e<1<=t;t++)s[t]=0;for(e=0;143>=e;)st[2*e+1]=8,e++,s[8]++;for(;255>=e;)st[2*e+1]=9,e++,s[9]++;for(;279>=e;)st[2*e+1]=7,e++,s[7]++;for(;287>=e;)st[2*e+1]=8,e++,s[8]++;for(d(st,q+1,s),e=0;W>e;e++)at[2*e+1]=5,at[2*e]=c(e,5);ht=new i(st,tt,V+1,q,X),dt=new i(at,rt,0,W,X),pt=new i(new Array(0),nt,0,Z,J)}function _(e){var t;for(t=0;q>t;t++)e.dyn_ltree[2*t]=0;for(t=0;W>t;t++)e.dyn_dtree[2*t]=0;for(t=0;Z>t;t++)e.bl_tree[2*t]=0;e.dyn_ltree[2*K]=1,e.opt_len=e.static_len=0,e.last_lit=e.matches=0}function m(e){e.bi_valid>8?a(e,e.bi_buf):e.bi_valid>0&&(e.pending_buf[e.pending++]=e.bi_buf),e.bi_buf=0,e.bi_valid=0}function g(e,t,r,n){m(e),n&&(a(e,r),a(e,~r)),z.arraySet(e.pending_buf,e.window,t,r,e.pending),e.pending+=r}function v(e,t,r,n){var i=2*t,o=2*r;return e[i]r;r++)0!==o[2*r]?(e.heap[++e.heap_len]=l=r,e.depth[r]=0):o[2*r+1]=0;for(;e.heap_len<2;)i=e.heap[++e.heap_len]=2>l?++l:0,o[2*i]=1,e.depth[i]=0,e.opt_len--,a&&(e.static_len-=s[2*i+1]);for(t.max_code=l,r=e.heap_len>>1;r>=1;r--)y(e,o,r);i=u;do r=e.heap[1],e.heap[1]=e.heap[e.heap_len--],y(e,o,1),n=e.heap[1],e.heap[--e.heap_max]=r,e.heap[--e.heap_max]=n,o[2*i]=o[2*r]+o[2*n],e.depth[i]=(e.depth[r]>=e.depth[n]?e.depth[r]:e.depth[n])+1,o[2*r+1]=o[2*n+1]=i,e.heap[1]=i++,y(e,o,1);while(e.heap_len>=2);e.heap[--e.heap_max]=e.heap[1],h(e,t),d(o,l,e.bl_count)}function w(e,t,r){var n,i,o=-1,s=t[1],a=0,u=7,l=4;for(0===s&&(u=138,l=3),t[2*(r+1)+1]=65535,n=0;r>=n;n++)i=s,s=t[2*(n+1)+1],++aa?e.bl_tree[2*i]+=a:0!==i?(i!==o&&e.bl_tree[2*i]++,e.bl_tree[2*$]++):10>=a?e.bl_tree[2*Q]++:e.bl_tree[2*et]++,a=0,o=i,0===s?(u=138,l=3):i===s?(u=6,l=3):(u=7,l=4))}function k(e,t,r){var n,i,o=-1,s=t[1],a=0,c=7,f=4;for(0===s&&(c=138,f=3),n=0;r>=n;n++)if(i=s,s=t[2*(n+1)+1],!(++aa){do l(e,i,e.bl_tree);while(0!==--a)}else 0!==i?(i!==o&&(l(e,i,e.bl_tree),a--),l(e,$,e.bl_tree),u(e,a-3,2)):10>=a?(l(e,Q,e.bl_tree),u(e,a-3,3)):(l(e,et,e.bl_tree),u(e,a-11,7));a=0,o=i,0===s?(c=138,f=3):i===s?(c=6,f=3):(c=7,f=4)}}function A(e){var t;for(w(e,e.dyn_ltree,e.l_desc.max_code),w(e,e.dyn_dtree,e.d_desc.max_code),x(e,e.bl_desc),t=Z-1;t>=3&&0===e.bl_tree[2*it[t]+1];t--);return e.opt_len+=3*(t+1)+5+5+4,t}function T(e,t,r,n){var i;for(u(e,t-257,5),u(e,r-1,5),u(e,n-4,4),i=0;n>i;i++)u(e,e.bl_tree[2*it[i]+1],3);k(e,e.dyn_ltree,t-1),k(e,e.dyn_dtree,r-1)}function E(e){var t,r=4093624447;for(t=0;31>=t;t++,r>>>=1)if(1&r&&0!==e.dyn_ltree[2*t])return j;if(0!==e.dyn_ltree[18]||0!==e.dyn_ltree[20]||0!==e.dyn_ltree[26])return L;for(t=32;V>t;t++)if(0!==e.dyn_ltree[2*t])return L;return j}function S(e){_t||(p(),_t=!0),e.l_desc=new o(e.dyn_ltree,ht),e.d_desc=new o(e.dyn_dtree,dt),e.bl_desc=new o(e.bl_tree,pt),e.bi_buf=0,e.bi_valid=0,_(e)}function R(e,t,r,n){u(e,(C<<1)+(n?1:0),3),g(e,t,r,!0)}function M(e){u(e,F<<1,3),l(e,K,st),f(e)}function P(e,t,r,n){var i,o,s=0;e.level>0?(e.strm.data_type===I&&(e.strm.data_type=E(e)),x(e,e.l_desc),x(e,e.d_desc),s=A(e),i=e.opt_len+3+7>>>3,o=e.static_len+3+7>>>3,i>=o&&(i=o)):i=o=r+5,i>=r+4&&-1!==t?R(e,t,r,n):e.strategy===N||o===i?(u(e,(F<<1)+(n?1:0),3),b(e,st,at)):(u(e,(U<<1)+(n?1:0),3),T(e,e.l_desc.max_code+1,e.d_desc.max_code+1,s+1),b(e,e.dyn_ltree,e.dyn_dtree)),_(e),n&&m(e)}function O(e,t,r){return e.pending_buf[e.d_buf+2*e.last_lit]=t>>>8&255,e.pending_buf[e.d_buf+2*e.last_lit+1]=255&t,e.pending_buf[e.l_buf+e.last_lit]=255&r,e.last_lit++,0===t?e.dyn_ltree[2*r]++:(e.matches++,t--,e.dyn_ltree[2*(lt[r]+V+1)]++,e.dyn_dtree[2*s(t)]++),e.last_lit===e.lit_bufsize-1}var z=e("../utils/common"),N=4,j=0,L=1,I=2,C=0,F=1,U=2,D=3,B=258,G=29,V=256,q=V+1+G,W=30,Z=19,H=2*q+1,X=15,Y=16,J=7,K=256,$=16,Q=17,et=18,tt=[0,0,0,0,0,0,0,0,1,1,1,1,2,2,2,2,3,3,3,3,4,4,4,4,5,5,5,5,0],rt=[0,0,0,0,1,1,2,2,3,3,4,4,5,5,6,6,7,7,8,8,9,9,10,10,11,11,12,12,13,13],nt=[0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,2,3,7],it=[16,17,18,0,8,7,9,6,10,5,11,4,12,3,13,2,14,1,15],ot=512,st=new Array(2*(q+2));n(st);var at=new Array(2*W);n(at);var ut=new Array(ot);n(ut);var lt=new Array(B-D+1);n(lt);var ct=new Array(G);n(ct);var ft=new Array(W);n(ft);var ht,dt,pt,_t=!1;r._tr_init=S,r._tr_stored_block=R,r._tr_flush_block=P,r._tr_tally=O,r._tr_align=M},{"../utils/common":161}],173:[function(e,t){"use strict";function r(){this.input=null,this.next_in=0,this.avail_in=0,this.total_in=0,this.output=null,this.next_out=0,this.avail_out=0,this.total_out=0,this.msg="",this.state=null,this.data_type=2,this.adler=0}t.exports=r},{}],174:[function(e,t){"use strict";function r(e){return this instanceof r?(u.call(this,e),l.call(this,e),e&&e.readable===!1&&(this.readable=!1),e&&e.writable===!1&&(this.writable=!1),this.allowHalfOpen=!0,e&&e.allowHalfOpen===!1&&(this.allowHalfOpen=!1),void this.once("end",n)):new r(e)}function n(){this.allowHalfOpen||this._writableState.ended||s(i,this)}function i(e){e.end()}var o=Object.keys||function(e){var t=[];for(var r in e)t.push(r);return t};t.exports=r;var s=e("process-nextick-args"),a=e("core-util-is");a.inherits=e("inherits");var u=e("./_stream_readable"),l=e("./_stream_writable");a.inherits(r,u);for(var c=o(l.prototype),f=0;f0)if(t.ended&&!i){var a=new Error("stream.push() after EOF");e.emit("error",a)}else if(t.endEmitted&&i){var a=new Error("stream.unshift() after end event");e.emit("error",a)}else{var u;!t.decoder||i||n||(r=t.decoder.write(r),u=!t.objectMode&&0===r.length),i||(t.reading=!1),u||(t.flowing&&0===t.length&&!t.sync?(e.emit("data",r),e.read(0)):(t.length+=t.objectMode?1:r.length,i?t.buffer.unshift(r):t.buffer.push(r),t.needReadable&&f(e))),d(e,t)}else i||(t.reading=!1);return s(t)}function s(e){return!e.ended&&(e.needReadable||e.length=L?e=L:(e--,e|=e>>>1,e|=e>>>2,e|=e>>>4,e|=e>>>8,e|=e>>>16,e++),e}function u(e,t){return 0===t.length&&t.ended?0:t.objectMode?0===e?0:1:null===e||isNaN(e)?t.flowing&&t.buffer.length?t.buffer[0].length:t.length:0>=e?0:(e>t.highWaterMark&&(t.highWaterMark=a(e)),e>t.length?t.ended?t.length:(t.needReadable=!0,0):e)}function l(e,t){var r=null;return S.isBuffer(t)||"string"==typeof t||null===t||void 0===t||e.objectMode||(r=new TypeError("Invalid non-string/buffer chunk")),r}function c(e,t){if(!t.ended){if(t.decoder){var r=t.decoder.end();r&&r.length&&(t.buffer.push(r),t.length+=t.objectMode?1:r.length)}t.ended=!0,f(e)}}function f(e){var t=e._readableState;t.needReadable=!1,t.emittedReadable||(z("emitReadable",t.flowing),t.emittedReadable=!0,t.sync?T(h,e):h(e))}function h(e){z("emit readable"),e.emit("readable"),y(e)}function d(e,t){t.readingMore||(t.readingMore=!0,T(p,e,t))}function p(e,t){for(var r=t.length;!t.reading&&!t.flowing&&!t.ended&&t.length=i)r=o?n.join(""):1===n.length?n[0]:S.concat(n,i),n.length=0;else if(el&&e>u;l++){var a=n[0],f=Math.min(e-u,a.length);o?r+=a.slice(0,f):a.copy(r,u,0,f),f0)throw new Error("endReadable called on non-empty stream");t.endEmitted||(t.ended=!0,T(w,t,e))}function w(e,t){e.endEmitted||0!==e.length||(e.endEmitted=!0,t.readable=!1,t.emit("end"))}function k(e,t){for(var r=0,n=e.length;n>r;r++)t(e[r],r)}function A(e,t){for(var r=0,n=e.length;n>r;r++)if(e[r]===t)return r;return-1}t.exports=i;var T=e("process-nextick-args"),E=e("isarray"),S=e("buffer").Buffer;i.ReadableState=n;var R,M=(e("events"),function(e,t){return e.listeners(t).length});!function(){try{R=e("stream")}catch(t){}finally{R||(R=e("events").EventEmitter)}}();var S=e("buffer").Buffer,P=e("core-util-is");P.inherits=e("inherits");var O=e("util"),z=void 0;z=O&&O.debuglog?O.debuglog("stream"):function(){};var N;P.inherits(i,R);var j,j;i.prototype.push=function(e,t){var r=this._readableState;return r.objectMode||"string"!=typeof e||(t=t||r.defaultEncoding,t!==r.encoding&&(e=new S(e,t),t="")),o(this,r,e,t,!1)},i.prototype.unshift=function(e){var t=this._readableState;return o(this,t,e,"",!0)},i.prototype.isPaused=function(){return this._readableState.flowing===!1},i.prototype.setEncoding=function(t){return N||(N=e("string_decoder/").StringDecoder),this._readableState.decoder=new N(t),this._readableState.encoding=t,this};var L=8388608;i.prototype.read=function(e){z("read",e);var t=this._readableState,r=e;if(("number"!=typeof e||e>0)&&(t.emittedReadable=!1),0===e&&t.needReadable&&(t.length>=t.highWaterMark||t.ended))return z("read: emitReadable",t.length,t.ended),0===t.length&&t.ended?x(this):f(this),null;if(e=u(e,t),0===e&&t.ended)return 0===t.length&&x(this),null;var n=t.needReadable;z("need readable",n),(0===t.length||t.length-e0?b(e,t):null,null===i&&(t.needReadable=!0,e=0),t.length-=e,0!==t.length||t.ended||(t.needReadable=!0),r!==e&&t.ended&&0===t.length&&x(this),null!==i&&this.emit("data",i),i},i.prototype._read=function(){this.emit("error",new Error("not implemented"))},i.prototype.pipe=function(e,t){function n(e){z("onunpipe"),e===f&&o()}function i(){z("onend"),e.end()}function o(){z("cleanup"),e.removeListener("close",u),e.removeListener("finish",l),e.removeListener("drain",m),e.removeListener("error",a),e.removeListener("unpipe",n),f.removeListener("end",i),f.removeListener("end",o),f.removeListener("data",s),g=!0,!h.awaitDrain||e._writableState&&!e._writableState.needDrain||m()}function s(t){z("ondata");var r=e.write(t);!1===r&&(1!==h.pipesCount||h.pipes[0]!==e||1!==f.listenerCount("data")||g||(z("false write response, pause",f._readableState.awaitDrain),f._readableState.awaitDrain++),f.pause())}function a(t){z("onerror",t),c(),e.removeListener("error",a),0===M(e,"error")&&e.emit("error",t)}function u(){e.removeListener("finish",l),c()}function l(){z("onfinish"),e.removeListener("close",u),c()}function c(){z("unpipe"),f.unpipe(e)}var f=this,h=this._readableState;switch(h.pipesCount){case 0:h.pipes=e;break;case 1:h.pipes=[h.pipes,e];break;default:h.pipes.push(e)}h.pipesCount+=1,z("pipe count=%d opts=%j",h.pipesCount,t);var d=(!t||t.end!==!1)&&e!==r.stdout&&e!==r.stderr,p=d?i:o;h.endEmitted?T(p):f.once("end",p),e.on("unpipe",n);var m=_(f);e.on("drain",m);var g=!1;return f.on("data",s),e._events&&e._events.error?E(e._events.error)?e._events.error.unshift(a):e._events.error=[a,e._events.error]:e.on("error",a),e.once("close",u),e.once("finish",l),e.emit("pipe",f),h.flowing||(z("pipe resume"),f.resume()),e},i.prototype.unpipe=function(e){var t=this._readableState;if(0===t.pipesCount)return this;if(1===t.pipesCount)return e&&e!==t.pipes?this:(e||(e=t.pipes),t.pipes=null,t.pipesCount=0,t.flowing=!1,e&&e.emit("unpipe",this),this);if(!e){var r=t.pipes,n=t.pipesCount;t.pipes=null,t.pipesCount=0,t.flowing=!1;for(var i=0;n>i;i++)r[i].emit("unpipe",this);return this}var o=A(t.pipes,e);return-1===o?this:(t.pipes.splice(o,1),t.pipesCount-=1,1===t.pipesCount&&(t.pipes=t.pipes[0]),e.emit("unpipe",this),this)},i.prototype.on=function(e,t){var r=R.prototype.on.call(this,e,t);if("data"===e&&!1!==this._readableState.flowing&&this.resume(),"readable"===e&&!this._readableState.endEmitted){var n=this._readableState;n.readableListening||(n.readableListening=!0,n.emittedReadable=!1,n.needReadable=!0,n.reading?n.length&&f(this,n):T(m,this))}return r},i.prototype.addListener=i.prototype.on,i.prototype.resume=function(){var e=this._readableState;return e.flowing||(z("resume"),e.flowing=!0,g(this,e)),this},i.prototype.pause=function(){return z("call pause flowing=%j",this._readableState.flowing),!1!==this._readableState.flowing&&(z("pause"),this._readableState.flowing=!1,this.emit("pause")),this},i.prototype.wrap=function(e){var t=this._readableState,r=!1,n=this;e.on("end",function(){if(z("wrapped end"),t.decoder&&!t.ended){var e=t.decoder.end();e&&e.length&&n.push(e)}n.push(null)}),e.on("data",function(i){if(z("wrapped data"),t.decoder&&(i=t.decoder.write(i)),(!t.objectMode||null!==i&&void 0!==i)&&(t.objectMode||i&&i.length)){var o=n.push(i);o||(r=!0,e.pause())}});for(var i in e)void 0===this[i]&&"function"==typeof e[i]&&(this[i]=function(t){return function(){return e[t].apply(e,arguments)}}(i));var o=["error","close","destroy","pause","resume"];return k(o,function(t){e.on(t,n.emit.bind(n,t))}),n._read=function(t){z("wrapped _read",t),r&&(r=!1,e.resume())},n},i._fromList=b}).call(this,e("_process"))},{"./_stream_duplex":174,_process:8,buffer:2,"core-util-is":179,events:6,inherits:180,isarray:181,"process-nextick-args":182,"string_decoder/":183,util:1}],177:[function(e,t){"use strict";function r(e){this.afterTransform=function(t,r){return n(e,t,r)},this.needTransform=!1,this.transforming=!1,this.writecb=null,this.writechunk=null,this.writeencoding=null}function n(e,t,r){var n=e._transformState;n.transforming=!1;var i=n.writecb;if(!i)return e.emit("error",new Error("no writecb in Transform class"));n.writechunk=null,n.writecb=null,null!==r&&void 0!==r&&e.push(r),i(t);var o=e._readableState;o.reading=!1,(o.needReadable||o.length-1?setImmediate:k,T=e("buffer").Buffer;s.WritableState=o;var E=e("core-util-is");E.inherits=e("inherits");var S,R={deprecate:e("util-deprecate")};!function(){try{S=e("stream")}catch(t){}finally{S||(S=e("events").EventEmitter)}}();var T=e("buffer").Buffer;E.inherits(s,S);var M;o.prototype.getBuffer=function(){for(var e=this.bufferedRequest,t=[];e;)t.push(e),e=e.next;return t},function(){try{Object.defineProperty(o.prototype,"buffer",{get:R.deprecate(function(){return this.getBuffer()},"_writableState.buffer is deprecated. Use _writableState.getBuffer instead.")})}catch(e){}}();var M;s.prototype.pipe=function(){this.emit("error",new Error("Cannot pipe. Not readable."))},s.prototype.write=function(e,t,r){var i=this._writableState,o=!1;return"function"==typeof t&&(r=t,t=null),T.isBuffer(e)?t="buffer":t||(t=i.defaultEncoding),"function"!=typeof r&&(r=n),i.ended?a(this,r):u(this,i,e,r)&&(i.pendingcb++,o=c(this,i,e,t,r)),o},s.prototype.cork=function(){var e=this._writableState;e.corked++},s.prototype.uncork=function(){var e=this._writableState;e.corked&&(e.corked--,e.writing||e.corked||e.finished||e.bufferProcessing||!e.bufferedRequest||g(this,e))},s.prototype.setDefaultEncoding=function(e){if("string"==typeof e&&(e=e.toLowerCase()),!(["hex","utf8","utf-8","ascii","binary","base64","ucs2","ucs-2","utf16le","utf-16le","raw"].indexOf((e+"").toLowerCase())>-1))throw new TypeError("Unknown encoding: "+e);this._writableState.defaultEncoding=e},s.prototype._write=function(e,t,r){r(new Error("not implemented"))},s.prototype._writev=null,s.prototype.end=function(e,t,r){var n=this._writableState;"function"==typeof e?(r=e,e=null,t=null):"function"==typeof t&&(r=t,t=null),null!==e&&void 0!==e&&this.write(e,t),n.corked&&(n.corked=1,this.uncork()),n.ending||n.finished||x(this,n,r)}}).call(this,e("_process"))},{"./_stream_duplex":174,_process:8,buffer:2,"core-util-is":179,events:6,inherits:180,"process-nextick-args":182,"util-deprecate":184}],179:[function(e,t,r){(function(e){function t(e){return Array.isArray?Array.isArray(e):"[object Array]"===m(e)}function n(e){return"boolean"==typeof e}function i(e){return null===e}function o(e){return null==e}function s(e){return"number"==typeof e}function a(e){return"string"==typeof e}function u(e){return"symbol"==typeof e}function l(e){return void 0===e}function c(e){return"[object RegExp]"===m(e)}function f(e){return"object"==typeof e&&null!==e}function h(e){return"[object Date]"===m(e)}function d(e){return"[object Error]"===m(e)||e instanceof Error}function p(e){return"function"==typeof e}function _(e){return null===e||"boolean"==typeof e||"number"==typeof e||"string"==typeof e||"symbol"==typeof e||"undefined"==typeof e}function m(e){return Object.prototype.toString.call(e)}r.isArray=t,r.isBoolean=n,r.isNull=i,r.isNullOrUndefined=o,r.isNumber=s,r.isString=a,r.isSymbol=u,r.isUndefined=l,r.isRegExp=c,r.isObject=f,r.isDate=h,r.isError=d,r.isFunction=p,r.isPrimitive=_,r.isBuffer=e.isBuffer}).call(this,{isBuffer:e("../../../../../../browserify/node_modules/insert-module-globals/node_modules/is-buffer/index.js")})},{"../../../../../../browserify/node_modules/insert-module-globals/node_modules/is-buffer/index.js":7}],180:[function(e,t,r){arguments[4][9][0].apply(r,arguments)},{dup:9}],181:[function(e,t,r){arguments[4][5][0].apply(r,arguments)},{dup:5}],182:[function(e,t){(function(e){"use strict";function r(t,r,n,i){if("function"!=typeof t)throw new TypeError('"callback" argument must be a function');var o,s,a=arguments.length;switch(a){case 0:case 1:return e.nextTick(t);case 2:return e.nextTick(function(){t.call(null,r)});case 3:return e.nextTick(function(){t.call(null,r,n)});case 4:return e.nextTick(function(){t.call(null,r,n,i)});default:for(o=new Array(a-1),s=0;s=this.charLength-this.charReceived?this.charLength-this.charReceived:e.length;if(e.copy(this.charBuffer,this.charReceived,0,r),this.charReceived+=r,this.charReceived=55296&&56319>=n)){if(this.charReceived=this.charLength=0,0===e.length)return t;break}this.charLength+=this.surrogateSize,t=""}this.detectIncompleteChar(e);var i=e.length;this.charLength&&(e.copy(this.charBuffer,0,e.length-this.charReceived,i),i-=this.charReceived),t+=e.toString(this.encoding,0,i);var i=t.length-1,n=t.charCodeAt(i);if(n>=55296&&56319>=n){var o=this.surrogateSize;return this.charLength+=o,this.charReceived+=o,this.charBuffer.copy(this.charBuffer,o,0,o),e.copy(this.charBuffer,0,0,o),t.substring(0,i)}return t},l.prototype.detectIncompleteChar=function(e){for(var t=e.length>=3?3:e.length;t>0;t--){var r=e[e.length-t]; -if(1==t&&r>>5==6){this.charLength=2;break}if(2>=t&&r>>4==14){this.charLength=3;break}if(3>=t&&r>>3==30){this.charLength=4;break}}this.charReceived=t},l.prototype.end=function(e){var t="";if(e&&e.length&&(t=this.write(e)),this.charReceived){var r=this.charReceived,n=this.charBuffer,i=this.encoding;t+=n.slice(0,r).toString(i)}return t}},{buffer:2}],184:[function(e,t){(function(e){function r(e,t){function r(){if(!i){if(n("throwDeprecation"))throw new Error(t);n("traceDeprecation")?console.trace(t):console.warn(t),i=!0}return e.apply(this,arguments)}if(n("noDeprecation"))return e;var i=!1;return r}function n(t){try{if(!e.localStorage)return!1}catch(r){return!1}var n=e.localStorage[t];return null==n?!1:"true"===String(n).toLowerCase()}t.exports=r}).call(this,"undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{}],185:[function(e,t,r){var n=function(){try{return e("stream")}catch(t){}}();r=t.exports=e("./lib/_stream_readable.js"),r.Stream=n||r,r.Readable=r,r.Writable=e("./lib/_stream_writable.js"),r.Duplex=e("./lib/_stream_duplex.js"),r.Transform=e("./lib/_stream_transform.js"),r.PassThrough=e("./lib/_stream_passthrough.js")},{"./lib/_stream_duplex.js":174,"./lib/_stream_passthrough.js":175,"./lib/_stream_readable.js":176,"./lib/_stream_transform.js":177,"./lib/_stream_writable.js":178}],186:[function(e,t){"use strict";function r(e){return null!=e}function n(e){return"("+e+")"}function i(e){return"string"==typeof e?'"'+e+'"':e}function o(e){return"$"===e[0]?"context."+e.substring(1):"context.feature.properties."+e}function s(){return" true "}function a(e,t){return n(i(t)+" === "+o(e))}function u(e,t){return n(t.map(function(t){return a(e,t)}).join(" || "))}function l(e,t){return n(e.filter(r).map(function(e){return n(e.join(" && "))}).join(" "+t+" "))}function c(e,t,r){return t&&t.length>0?l(t.map(function(e){return m(e,r)}),"||"):"true"}function f(e,t,r){return t&&t.length>0?l(t.map(function(e){return m(e,r)}),"&&"):"true"}function h(e,t,r){return"!"+n(m(t,r).join(" && "))}function d(e,t,r){return"!"+n(c(null,t,r))}function p(e,t){return n(o(e)+(t?" != ":" == ")+"null")}function _(e,t,r){var i=[],s=r&&"function"==typeof r.rangeTransform&&r.rangeTransform;if(t.max){var a=s?s(t.max):t.max;i.push(""+o(e)+" < "+a)}if(t.min){var u=s?u=s(t.min):t.min;i.push(""+o(e)+" >= "+u)}return n(i.join(" && "))}function m(e,t){var r=[];if("function"==typeof e)return[n(e.toString()+"(context)")];if(Array.isArray(e))return[c(null,e,t)];if(null==e)return["true"];for(var i=Object.keys(e),o=0;oo;o++){if(t=e.charCodeAt(o),t>55295&&57344>t){if(!r){t>56319||o+1===n?i.push(239,191,189):r=t;continue}if(56320>t){i.push(239,191,189),r=t;continue}t=r-55296<<10|t-56320|65536,r=null}else r&&(i.push(239,191,189),r=null);128>t?i.push(t):2048>t?i.push(t>>6|192,63&t|128):65536>t?i.push(t>>12|224,t>>6&63|128,63&t|128):i.push(t>>18|240,t>>12&63|128,t>>6&63|128,63&t|128)}return i}t.exports=r;var i,o,s,a=e("ieee754");i={readUInt32LE:function(e){return(this[e]|this[e+1]<<8|this[e+2]<<16)+16777216*this[e+3]},writeUInt32LE:function(e,t){this[t]=e,this[t+1]=e>>>8,this[t+2]=e>>>16,this[t+3]=e>>>24},readInt32LE:function(e){return(this[e]|this[e+1]<<8|this[e+2]<<16)+(this[e+3]<<24)},readFloatLE:function(e){return a.read(this,e,!0,23,4)},readDoubleLE:function(e){return a.read(this,e,!0,52,8)},writeFloatLE:function(e,t){return a.write(this,e,t,!0,23,4)},writeDoubleLE:function(e,t){return a.write(this,e,t,!0,52,8)},toString:function(e,t,r){var n="",i="";t=t||0,r=Math.min(this.length,r||this.length);for(var o=t;r>o;o++){var s=this[o];127>=s?(n+=decodeURIComponent(i)+String.fromCharCode(s),i=""):i+="%"+s.toString(16)}return n+=decodeURIComponent(i)},write:function(e,t){for(var r=e===o?s:n(e),i=0;i>3,o=this.pos;e(i,t,this),this.pos===o&&this.skip(n)}return t},readMessage:function(e,t){return this.readFields(e,t,this.readVarint()+this.pos)},readFixed32:function(){var e=this.buf.readUInt32LE(this.pos);return this.pos+=4,e},readSFixed32:function(){var e=this.buf.readInt32LE(this.pos);return this.pos+=4,e},readFixed64:function(){var e=this.buf.readUInt32LE(this.pos)+this.buf.readUInt32LE(this.pos+4)*p;return this.pos+=8,e},readSFixed64:function(){var e=this.buf.readUInt32LE(this.pos)+this.buf.readInt32LE(this.pos+4)*p;return this.pos+=8,e},readFloat:function(){var e=this.buf.readFloatLE(this.pos);return this.pos+=4,e},readDouble:function(){var e=this.buf.readDoubleLE(this.pos);return this.pos+=8,e},readVarint:function(){var e,t,r,n,i,o,s=this.buf;if(r=s[this.pos++],128>r)return r;if(r=127&r,n=s[this.pos++],128>n)return r|n<<7;if(n=(127&n)<<7,i=s[this.pos++],128>i)return r|n|i<<14;if(i=(127&i)<<14,o=s[this.pos++],128>o)return r|n|i|o<<21;if(e=r|n|i|(127&o)<<21,t=s[this.pos++],e+=268435456*(127&t),128>t)return e;if(t=s[this.pos++],e+=34359738368*(127&t),128>t)return e;if(t=s[this.pos++],e+=4398046511104*(127&t),128>t)return e;if(t=s[this.pos++],e+=562949953421312*(127&t),128>t)return e;if(t=s[this.pos++],e+=72057594037927940*(127&t),128>t)return e;if(t=s[this.pos++],e+=0x8000000000000000*(127&t),128>t)return e;throw new Error("Expected varint not more than 10 bytes")},readVarint64:function(){var e=this.pos,t=this.readVarint();if(m>t)return t;for(var r=this.pos-2;255===this.buf[r];)r--;e>r&&(r=e),t=0;for(var n=0;r-e+1>n;n++){var i=127&~this.buf[e+n];t+=4>n?i<<7*n:i*Math.pow(2,7*n)}return-t-1},readSVarint:function(){var e=this.readVarint();return e%2===1?(e+1)/-2:e/2},readBoolean:function(){return Boolean(this.readVarint())},readString:function(){var e=this.readVarint()+this.pos,t=this.buf.toString("utf8",this.pos,e);return this.pos=e,t},readBytes:function(){var e=this.readVarint()+this.pos,t=this.buf.slice(this.pos,e);return this.pos=e,t},readPackedVarint:function(){for(var e=this.readVarint()+this.pos,t=[];this.pos127;);else if(t===n.Bytes)this.pos=this.readVarint()+this.pos;else if(t===n.Fixed32)this.pos+=4;else{if(t!==n.Fixed64)throw new Error("Unimplemented type: "+t);this.pos+=8}},writeTag:function(e,t){this.writeVarint(e<<3|t)},realloc:function(e){for(var t=this.length||16;t=e)this.realloc(1),this.buf[this.pos++]=e;else if(16383>=e)this.realloc(2),this.buf[this.pos++]=e>>>0&127|128,this.buf[this.pos++]=e>>>7&127;else if(2097151>=e)this.realloc(3),this.buf[this.pos++]=e>>>0&127|128,this.buf[this.pos++]=e>>>7&127|128,this.buf[this.pos++]=e>>>14&127;else if(268435455>=e)this.realloc(4),this.buf[this.pos++]=e>>>0&127|128,this.buf[this.pos++]=e>>>7&127|128,this.buf[this.pos++]=e>>>14&127|128,this.buf[this.pos++]=e>>>21&127;else{for(var t=this.pos;e>=128;)this.realloc(1),this.buf[this.pos++]=255&e|128,e/=128;if(this.realloc(1),this.buf[this.pos++]=0|e,this.pos-t>10)throw new Error("Given varint doesn't fit into 10 bytes")}},writeSVarint:function(e){this.writeVarint(0>e?2*-e-1:2*e)},writeBoolean:function(e){this.writeVarint(Boolean(e))},writeString:function(e){e=String(e);var t=d.byteLength(e);this.writeVarint(t),this.realloc(t),this.buf.write(e,this.pos),this.pos+=t},writeFloat:function(e){this.realloc(4),this.buf.writeFloatLE(e,this.pos),this.pos+=4},writeDouble:function(e){this.realloc(8),this.buf.writeDoubleLE(e,this.pos),this.pos+=8},writeBytes:function(e){var t=e.length;this.writeVarint(t),this.realloc(t);for(var r=0;t>r;r++)this.buf[this.pos++]=e[r]},writeMessage:function(e,t,r){this.writeTag(e,n.Bytes),this.pos++;var i=this.pos;t(r,this);var o=this.pos-i,s=127>=o?1:16383>=o?2:2097151>=o?3:268435455>=o?4:Math.ceil(Math.log(o)/(7*Math.LN2));if(s>1){this.realloc(s-1);for(var a=this.pos-1;a>=i;a--)this.buf[a+s-1]=this.buf[a]}this.pos=i-1,this.writeVarint(o),this.pos+=o},writePackedVarint:function(e,t){this.writeMessage(e,i,t)},writePackedSVarint:function(e,t){this.writeMessage(e,o,t)},writePackedBoolean:function(e,t){this.writeMessage(e,u,t)},writePackedFloat:function(e,t){this.writeMessage(e,s,t)},writePackedDouble:function(e,t){this.writeMessage(e,a,t)},writePackedFixed32:function(e,t){this.writeMessage(e,l,t)},writePackedSFixed32:function(e,t){this.writeMessage(e,c,t)},writePackedFixed64:function(e,t){this.writeMessage(e,f,t)},writePackedSFixed64:function(e,t){this.writeMessage(e,h,t)},writeBytesField:function(e,t){this.writeTag(e,n.Bytes),this.writeBytes(t)},writeFixed32Field:function(e,t){this.writeTag(e,n.Fixed32),this.writeFixed32(t)},writeSFixed32Field:function(e,t){this.writeTag(e,n.Fixed32),this.writeSFixed32(t)},writeFixed64Field:function(e,t){this.writeTag(e,n.Fixed64),this.writeFixed64(t)},writeSFixed64Field:function(e,t){this.writeTag(e,n.Fixed64),this.writeSFixed64(t)},writeVarintField:function(e,t){this.writeTag(e,n.Varint),this.writeVarint(t)},writeSVarintField:function(e,t){this.writeTag(e,n.Varint),this.writeSVarint(t)},writeStringField:function(e,t){this.writeTag(e,n.Bytes),this.writeString(t)},writeFloatField:function(e,t){this.writeTag(e,n.Fixed32),this.writeFloat(t)},writeDoubleField:function(e,t){this.writeTag(e,n.Fixed64),this.writeDouble(t)},writeBooleanField:function(e,t){this.writeVarintField(e,Boolean(t))}}}).call(this,"undefined"!=typeof global?global:"undefined"!=typeof self?self:"undefined"!=typeof window?window:{})},{"./buffer":187}],189:[function(e,t,r){arguments[4][4][0].apply(r,arguments)},{dup:4}],190:[function(e,t){"use stric";var r="\\/\\*",n="\\/\\*(?!\\*?\\!)",i="(.|[\\r\\n]|\\n)*?\\*\\/\\n?\\n?",o=/(^|[^\S\n])(?:\/\/)([\s\S]+?)$/gm,s=/(^|[^\S\n])(?:\/\/[^!])([\s\S]+?)$/gm,a=t.exports=function(e,t){return e?a.block(a.line(e,t),t):""};a.block=function(e,t){t=t||{};var o=new RegExp(r+i,"gm");return t.safe&&(o=new RegExp(n+i,"gm")),e?e.replace(o,""):""},a.line=function(e,t){t=t||{};var r=o;return t.safe&&(r=s),e?e.replace(r,""):""}},{}],191:[function(t,r,n){!function(t,i){"object"==typeof n&&"undefined"!=typeof r?i(n):"function"==typeof e&&e.amd?e(["exports"],i):i(t.topojson=t.topojson||{})}(this,function(e){"use strict";function t(e,t){var n=t.id,i=t.bbox,o=null==t.properties?{}:t.properties,s=r(e,t);return null==n&&null==i?{type:"Feature",properties:o,geometry:s}:null==i?{type:"Feature",id:n,properties:o,geometry:s}:{type:"Feature",id:n,bbox:i,properties:o,geometry:s}}function r(e,t){function r(e,t){t.length&&t.pop();for(var r=f[0>e?~e:e],i=0,o=r.length;o>i;++i)t.push(c(r[i].slice(),i));0>e&&n(t,o)}function i(e){return c(e.slice())}function s(e){for(var t=[],n=0,i=e.length;i>n;++n)r(e[n],t);return t.length<2&&t.push(t[0].slice()),t}function a(e){for(var t=s(e);t.length<4;)t.push(t[0].slice());return t}function u(e){return e.map(a)}function l(e){var t,r=e.type;switch(r){case"GeometryCollection":return{type:r,geometries:e.geometries.map(l)};case"Point":t=i(e.coordinates);break;case"MultiPoint":t=e.coordinates.map(i);break;case"LineString":t=s(e.arcs);break;case"MultiLineString":t=e.arcs.map(s);break;case"Polygon":t=u(e.arcs);break;case"MultiPolygon":t=e.arcs.map(u);break;default:return null}return{type:r,coordinates:t}}var c=o(e),f=e.arcs;return l(t)}var n=function(e,t){for(var r,n=e.length,i=n-t;i<--n;)r=e[i],e[i++]=e[n],e[n]=r},i=function(e){return e},o=function(e){if(null==(t=e.transform))return i;var t,r,n,o=t.scale[0],s=t.scale[1],a=t.translate[0],u=t.translate[1];return function(e,t){return t||(r=n=0),e[0]=(r+=e[0])*o+a,e[1]=(n+=e[1])*s+u,e}},s=function(e,r){return"GeometryCollection"===r.type?{type:"FeatureCollection",features:r.geometries.map(function(r){return t(e,r)})}:t(e,r)};e.feature=s,Object.defineProperty(e,"__esModule",{value:!0})})},{}],192:[function(e,t){t.exports.VectorTile=e("./lib/vectortile.js"),t.exports.VectorTileFeature=e("./lib/vectortilefeature.js"),t.exports.VectorTileLayer=e("./lib/vectortilelayer.js")},{"./lib/vectortile.js":193,"./lib/vectortilefeature.js":194,"./lib/vectortilelayer.js":195}],193:[function(e,t){"use strict";function r(e,t){this.layers=e.readFields(n,{},t)}function n(e,t,r){if(3===e){var n=new i(r,r.readVarint()+r.pos);n.length&&(t[n.name]=n)}}var i=e("./vectortilelayer");t.exports=r},{"./vectortilelayer":195}],194:[function(e,t){"use strict";function r(e,t,r,i,o){this.properties={},this.extent=r,this.type=0,this._pbf=e,this._geometry=-1,this._keys=i,this._values=o,e.readFields(n,this,t)}function n(e,t,r){1==e?t._id=r.readVarint():2==e?i(r,t):3==e?t.type=r.readVarint():4==e&&(t._geometry=r.pos)}function i(e,t){for(var r=e.readVarint()+e.pos;e.pos>3}if(i--,1===n||2===n)s+=e.readSVarint(),a+=e.readSVarint(),1===n&&(t&&u.push(t),t=[]),t.push(new o(s,a));else{if(7!==n)throw new Error("unknown command "+n);t.push(t[0].clone())}}return t&&u.push(t),u},r.prototype.bbox=function(){var e=this._pbf;e.pos=this._geometry;for(var t=e.readVarint()+e.pos,r=1,n=0,i=0,o=0,s=1/0,a=-1/0,u=1/0,l=-1/0;e.pos>3}if(n--,1===r||2===r)i+=e.readSVarint(),o+=e.readSVarint(),s>i&&(s=i),i>a&&(a=i),u>o&&(u=o),o>l&&(l=o);else if(7!==r)throw new Error("unknown command "+r)}return[s,u,a,l]},r.prototype.toGeoJSON=function(e,t,n){for(var i=this.extent*Math.pow(2,n),o=this.extent*e,s=this.extent*t,a=this.loadGeometry(),u=r.types[this.type],l=0;l>3;t=1===n?e.readString():2===n?e.readFloat():3===n?e.readDouble():4===n?e.readVarint64():5===n?e.readVarint():6===n?e.readSVarint():7===n?e.readBoolean():null}return t}var o=e("./vectortilefeature.js");t.exports=r,r.prototype.feature=function(e){if(0>e||e>=this._features.length)throw new Error("feature index out of bounds");this._pbf.pos=this._features[e];var t=this._pbf.readVarint()+this._pbf.pos;return new o(this._pbf,t,this.extent,this._keys,this._values)}},{"./vectortilefeature.js":194}],196:[function(e,t){"use strict";function r(e,t){this.x=e,this.y=t}t.exports=r,r.prototype={clone:function(){return new r(this.x,this.y)},add:function(e){return this.clone()._add(e)},sub:function(e){return this.clone()._sub(e)},mult:function(e){return this.clone()._mult(e)},div:function(e){return this.clone()._div(e)},rotate:function(e){return this.clone()._rotate(e)},matMult:function(e){return this.clone()._matMult(e)},unit:function(){return this.clone()._unit()},perp:function(){return this.clone()._perp()},round:function(){return this.clone()._round()},mag:function(){return Math.sqrt(this.x*this.x+this.y*this.y)},equals:function(e){return this.x===e.x&&this.y===e.y},dist:function(e){return Math.sqrt(this.distSqr(e))},distSqr:function(e){var t=e.x-this.x,r=e.y-this.y;return t*t+r*r},angle:function(){return Math.atan2(this.y,this.x)},angleTo:function(e){return Math.atan2(this.y-e.y,this.x-e.x)},angleWith:function(e){return this.angleWithSep(e.x,e.y)},angleWithSep:function(e,t){return Math.atan2(this.x*t-this.y*e,this.x*e+this.y*t)},_matMult:function(e){var t=e[0]*this.x+e[1]*this.y,r=e[2]*this.x+e[3]*this.y;return this.x=t,this.y=r,this},_add:function(e){return this.x+=e.x,this.y+=e.y,this},_sub:function(e){return this.x-=e.x,this.y-=e.y,this},_mult:function(e){return this.x*=e,this.y*=e,this},_div:function(e){return this.x/=e,this.y/=e,this},_unit:function(){return this._div(this.mag()),this},_perp:function(){var e=this.y;return this.y=this.x,this.x=-e,this},_rotate:function(e){var t=Math.cos(e),r=Math.sin(e),n=t*this.x-r*this.y,i=r*this.x+t*this.y;return this.x=n,this.y=i,this},_round:function(){return this.x=Math.round(this.x),this.y=Math.round(this.y),this}},r.convert=function(e){return e instanceof r?e:Array.isArray(e)?new r(e[0],e[1]):e}},{}],197:[function(e,t,r){"use strict";function n(e){return e&&e.__esModule?e:{"default":e}}function i(e,t,r){var n=u[0],i=u[1];return e[0]<=n.x+r&&t[0]<=n.x+r||e[0]>=i.x-r&&t[0]>=i.x-r||e[1]>=n.y-r&&t[1]>=n.y-r||e[1]<=i.y+r&&t[1]<=i.y+r?!0:!1}function o(e,t){t=t||0;var r=u[0],n=u[1];return e[0]<=r.x+t||e[0]>=n.x-t||e[1]>=r.y-t||e[1]<=n.y+t}Object.defineProperty(r,"__esModule",{value:!0}),r.default_uvs=r.tile_bounds=void 0,r.outsideTile=i,r.isCoordOutsideTile=o;{var s=e("../geo"),a=n(s),u=r.tile_bounds=[{x:0,y:0},{x:a.default.tile_scale,y:-a.default.tile_scale}];r.default_uvs=[0,0,1,1]}},{"../geo":202}],198:[function(e,t,r){"use strict";function n(e,t,r,n,s){var a=n.texcoord_index,u=n.position_index,l=n.shape_index,c=n.offset_index,f=s.quad,h=s.quad_normalize,d=s.offset,p=s.angle,_=s.shape_w,m=s.texcoord_scale,g=s.texcoord_normalize;h=h||1;var v=f[0]/2*h,y=f[1]/2*h,b=[[-v,-y],[v,-y],[v,y],[-v,y]],x=t.vertex_elements,w=t.vertex_count,k=void 0;if(a){g=g||1;var A=m||o.default_uvs,T=i(A,4),E=T[0],S=T[1],R=T[2],M=T[3];k=[[E,S],[R,S],[R,M],[E,M]]}for(var P=e.length,O=0;P>O;O++){for(var z=e[O],N=0;4>N;N++)a&&(r[a+0]=k[N][0]*g,r[a+1]=k[N][1]*g),r[u+0]=z[0],r[u+1]=z[1],r[l+0]=b[N][0],r[l+1]=b[N][1],r[l+2]=p,r[l+3]=_,r[c+0]=d[0],r[c+1]=d[1],t.addVertex(r);x.push(w+0),x.push(w+1),x.push(w+2),x.push(w+2),x.push(w+3),x.push(w+0),w+=4}}Object.defineProperty(r,"__esModule",{value:!0});var i=function(){function e(e,t){var r=[],n=!0,i=!1,o=void 0;try{for(var s,a=e[Symbol.iterator]();!(n=(s=a.next()).done)&&(r.push(s.value),!t||r.length!==t);n=!0);}catch(u){i=!0,o=u}finally{try{!n&&a["return"]&&a["return"]()}finally{if(i)throw o}}return r}return function(t,r){if(Array.isArray(t))return t;if(Symbol.iterator in Object(t))return e(t,r);throw new TypeError("Invalid attempt to destructure non-iterable instance")}}();r.buildQuadsForPoints=n;var o=e("./common")},{"./common":197}],199:[function(e,t,r){"use strict";function n(e){return e&&e.__esModule?e:{"default":e}}function i(e,t,r,n){var i=n.texcoord_index,o=n.texcoord_scale,u=n.texcoord_normalize,c=t.vertex_elements;if(i){u=u||1;var f=o||h.default_uvs,d=a(f,4),_=d[0],m=d[1],g=d[2],v=d[3]}for(var y=e.length,b=0;y>b;b++){var x=t.vertex_count,w=e[b];if(i)var k=l.default.findBoundingBox(w),A=a(k,4),T=A[0],E=A[1],S=A[2],R=A[3],M=S-T,P=R-E,O=(g-_)/M,z=(v-m)/P;for(var N=0;Nz;z++)for(var N=e[z],j=0;jL;L++){var I=L,C=L+1;if(k=e[I],A=e[C],!w.default.isEqual(k,A)){if(c&&T.outsideTile(k,A,_)){p(k,M,[1,P],t),p(k,w.default.neg(M),[0,P],t),d(1,t);var F=a(e,I+1,_);return void(F&&r.push(F))}E=M,M=w.default.normalize(w.default.perp(k,A)),n===R.miter?f(P,k,E,M,g,!1,t):h(n,P,k,E,M,!1,t),P+=m*w.default.length(w.default.sub(A,k))}}k=A,E=M,o?(M=w.default.normalize(w.default.perp(k,e[1])),l(k,E,M,n,P,t)):(p(k,E,[1,P],t),p(k,w.default.neg(E),[0,P],t),d(1,t),T.isCoordOutsideTile(k)||v(k,P,E,i,!1,t))}}}function s(e){if(T.isCoordOutsideTile(e[0]))return 0;for(var t=0;t=2?e.slice(n):!1}function u(e,t,r,n,i){if(void 0===n||T.isCoordOutsideTile(e))p(e,r,[1,0],i),p(e,w.default.neg(r),[0,0],i);else{var o=0;n===R.miter?f(o,e,t,r,i.miter_len_sq,!0,i):h(n,o,e,t,r,!0,i)}}function l(e,t,r,n,i,o){if(T.isCoordOutsideTile(e))p(e,t,[1,i],o),p(e,w.default.neg(t),[0,i],o),d(1,o);else{var s=c(t,r);n===R.miter&&w.default.lengthSq(s)>o.miter_len_sq&&(n=R.bevel),n===R.miter?(p(e,s,[1,i],o),p(e,w.default.neg(s),[0,i],o),d(1,o)):(p(e,t,[1,i],o),p(e,w.default.neg(t),[0,i],o),d(1,o))}}function c(e,t){var r=w.default.normalize(w.default.add(e,t)),n=2/(1+Math.abs(w.default.dot(e,r)));return w.default.mult(r,n*n)}function f(e,t,r,n,i,o,s){var a=c(r,n);w.default.lengthSq(a)>i?h(R.miter,e,t,r,n,o,s):(p(t,a,[1,e],s),p(t,w.default.neg(a),[0,e],s),o||d(1,s))}function h(e,t,r,n,i,o,s){var a=c(n,i),u=i[0]*n[1]-i[1]*n[0]>0;u?(p(r,a,[1,t],s),p(r,w.default.neg(n),[0,t],s),o||d(1,s),e===R.bevel?g(r,w.default.neg(n),a,w.default.neg(i),[0,t],[1,t],[0,t],s):e===R.round&&m(r,w.default.neg(n),a,w.default.neg(i),[0,t],[1,t],[0,t],!1,s),p(r,a,[1,t],s),p(r,w.default.neg(i),[0,t],s)):(p(r,n,[1,t],s),p(r,w.default.neg(a),[0,t],s),o||d(1,s),e===R.bevel?g(r,n,w.default.neg(a),i,[1,t],[0,t],[1,t],s):e===R.round&&m(r,n,w.default.neg(a),i,[1,t],[0,t],[1,t],!1,s),p(r,i,[1,t],s),p(r,w.default.neg(a),[0,t],s))}function d(e,t){for(var r=t.vertex_data.vertex_elements,n=t.vertex_data.vertex_count,i=n-2*e-2,o=0;e>o;o++)r.push(i+2*o+2),r.push(i+2*o+1),r.push(i+2*o+0),r.push(i+2*o+2),r.push(i+2*o+3),r.push(i+2*o+1)}function p(e,t,r,n){var i=n.vertex_template,o=n.vertex_data;_(i,e,r,t,n),o.addVertex(i)}function _(e,t,r,n,i){e[0]=t[0],e[1]=t[1],i.texcoord_index&&r&&(e[i.texcoord_index+0]=r[0]*i.texcoord_normalize,e[i.texcoord_index+1]=r[1]*i.texcoord_normalize),i.scaling_index&&(e[i.scaling_index+0]=n[0]*i.scaling_normalize,e[i.scaling_index+1]=n[1]*i.scaling_normalize,e[i.scaling_index+2]=i.half_width)}function m(e,t,r,n,i,o,s,a,u){for(var l=t[0]*n[1]-t[1]*n[0],c=w.default.dot(t,n),f=Math.atan2(l,c);f>=Math.PI;)f-=2*Math.PI;var h=y(f,u.half_width);if(!(1>h)){var d=u.vertex_data.vertex_count,_=u.vertex_data.vertex_elements;p(e,r,o,u),p(e,t,i,u);var m=t;if(void 0!==u.texcoord_index){var g;if(a){g=[];var v=w.default.sub(i,o)}else{g=w.default.set(i);var b=w.default.div(w.default.sub(s,i),h)}}for(var x=f/h,k=0;h>k;k++)m=w.default.rot(m,x),void 0!==u.texcoord_index&&(a?(v=w.default.rot(v,x),g[0]=v[0]+o[0],g[1]=v[1]*u.texcoord_width*u.v_scale+o[1]):g=w.default.add(g,b)),p(e,m,g,u),_.push(d+k+(l>0?2:1)),_.push(d),_.push(d+k+(l>0?1:2))}}function g(e,t,r,n,i,o,s,a){var u=a.vertex_data.vertex_count;p(e,r,o,a),p(e,t,i,a),p(e,n,s,a);var l=t[0]*n[1]-t[1]*n[0]>0,c=a.vertex_data.vertex_elements;l?(c.push(u+2),c.push(u+0),c.push(u+1)):(c.push(u+1),c.push(u+0),c.push(u+2))}function v(e,t,r,n,i,o){var s=w.default.neg(r);switch(n){case S.square:var a;i?(a=[r[1],-r[0]],p(e,w.default.add(r,a),[1,t],o),p(e,w.default.add(s,a),[0,t],o),t+=.5*o.texcoord_width*o.v_scale,p(e,r,[1,t],o),p(e,s,[0,t],o)):(a=[-r[1],r[0]],p(e,r,[1,t],o),p(e,s,[0,t],o),t+=.5*o.texcoord_width*o.v_scale,p(e,w.default.add(r,a),[1,t],o),p(e,w.default.add(s,a),[0,t],o)),d(1,o);break;case S.round:var u,l,c,f,h;i?(u=r,l=s,void 0!==o.texcoord_index&&(t+=.5*o.texcoord_width*o.v_scale,c=[1,t],f=[0,t],h=[.5,t])):(u=s,l=r,void 0!==o.texcoord_index&&(c=[0,t],f=[1,t],h=[.5,t])),m(e,u,E,l,c,h,f,!0,o);break;case S.butt:return}}function y(e,t){0>e&&(e=-e);var r=t>2*M.MIN_FAN_WIDTH?Math.log2(t/M.MIN_FAN_WIDTH):1;return Math.ceil(e/Math.PI*r)}function b(e,t){for(var r=[],n=0;n2&&void 0!==arguments[2]?arguments[2]:{};s(this,e),this.view=r,this.position=n.position,this.zoom=n.zoom}return u(e,[{key:"update",value:function(){}},{key:"setupProgram",value:function(){}},{key:"updateView",value:function(){if(this.position||this.zoom){var e={};this.position&&(e={lng:this.position[0],lat:this.position[1],zoom:this.position[2]}),this.zoom&&(e.zoom=this.zoom),this.view.setView(e)}}},{key:"setupMatrices",value:function(e,t){d.mat4.multiply(e.model_view32,this.view_matrix,e.model),t.uniform("Matrix4fv","u_modelView",e.model_view32),d.mat3.normalFromMat4(e.normal32,e.model_view32),d.mat3.invert(e.inverse_normal32,e.normal32),t.uniform("Matrix3fv","u_normalMatrix",e.normal32),t.uniform("Matrix3fv","u_inverseNormalMatrix",e.inverse_normal32)}}],[{key:"create",value:function(e,t,r){switch(r.type){case"isometric":return new m(e,t,r);case"flat":return new g(e,t,r);case"perspective":default:return new _(e,t,r)}}}]),e}();r.default=p;var _=function(e){function t(e,r){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};s(this,t);var o=i(this,(t.__proto__||Object.getPrototypeOf(t)).call(this,e,r,n));return o.type="perspective",o.focal_length=n.focal_length,o.fov=n.fov,o.focal_length||o.fov||(o.focal_length=[[16,2],[17,2.5],[18,3],[19,4],[20,6]]),o.vanishing_point=n.vanishing_point||[0,0],o.vanishing_point=o.vanishing_point.map(parseFloat),o.vanishing_point_skew=[],o.position_meters=null,o.view_matrix=new Float64Array(16),o.projection_matrix=new Float32Array(16),h.default.replaceBlock("camera","\n uniform mat4 u_projection;\n uniform vec3 u_eye;\n uniform vec2 u_vanishing_point;\n\n void cameraProjection (inout vec4 position) {\n position = u_projection * position;\n }"),o}return o(t,e),u(t,[{key:"constrainCamera",value:function(e){var t=e.view_height,r=e.height,n=e.focal_length,i=e.fov;return r?(n=2*r/t,i=2*Math.atan(1/n)):(n?i=2*Math.atan(1/n):i&&(i=i*Math.PI/180,n=1/Math.tan(i/2)),r=t/2*n),{view_height:t,height:r,focal_length:n,fov:i}}},{key:"updateMatrices",value:function(){var e=this.view.size.css.height*this.view.meters_per_pixel,t=this.constrainCamera({view_height:e,focal_length:c.default.interpolate(this.view.zoom,this.focal_length),fov:c.default.interpolate(this.view.zoom,this.fov)}),r=t.height,n=t.fov,i=[this.view.center.meters.x,this.view.center.meters.y,r];this.position_meters=i,d.mat4.lookAt(this.view_matrix,d.vec3.fromValues(i[0],i[1],0),d.vec3.fromValues(i[0],i[1],-1),d.vec3.fromValues(0,1,0)),d.mat4.perspective(this.projection_matrix,n,this.view.aspect,1,2*r),this.vanishing_point_skew[0]=this.vanishing_point[0]/this.view.size.css.width,this.vanishing_point_skew[1]=this.vanishing_point[1]/this.view.size.css.height,this.projection_matrix[8]=2*-this.vanishing_point_skew[0],this.projection_matrix[9]=2*-this.vanishing_point_skew[1],d.mat4.translate(this.projection_matrix,this.projection_matrix,d.vec3.fromValues(e/2*this.view.aspect*2*-this.vanishing_point_skew[0],e/2*2*-this.vanishing_point_skew[1],0)),d.mat4.translate(this.projection_matrix,this.projection_matrix,d.vec3.fromValues(0,0,-r))}},{key:"update",value:function(){a(t.prototype.__proto__||Object.getPrototypeOf(t.prototype),"update",this).call(this),this.updateMatrices()}},{key:"setupProgram",value:function(e){e.uniform("Matrix4fv","u_projection",this.projection_matrix),e.uniform("3f","u_eye",[0,0,this.position_meters[2]]),e.uniform("2fv","u_vanishing_point",this.vanishing_point_skew)}}]),t}(p),m=function(e){function t(e,r){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};s(this,t);var o=i(this,(t.__proto__||Object.getPrototypeOf(t)).call(this,e,r,n));return o.type="isometric",o.axis=n.axis||{x:0,y:1},2===o.axis.length&&(o.axis={x:o.axis[0],y:o.axis[1]}),o.position_meters=null,o.viewport_height=null,o.view_matrix=new Float64Array(16),o.projection_matrix=new Float32Array(16),h.default.replaceBlock("camera","\n uniform mat4 u_projection;\n uniform vec3 u_eye;\n uniform vec2 u_vanishing_point;\n\n void cameraProjection (inout vec4 position) {\n position = u_projection * position;\n // position.xy += position.z * u_isometric_axis;\n\n // Reverse z for depth buffer so up is negative,\n // and scale down values so objects higher than one screen height will not get clipped\n // pull forward slightly to avoid going past far clipping plane\n position.z = -position.z / 100. + 1. - 0.001;\n }"),o}return o(t,e),u(t,[{key:"update",value:function(){a(t.prototype.__proto__||Object.getPrototypeOf(t.prototype),"update",this).call(this),this.viewport_height=this.view.size.css.height*this.view.meters_per_pixel;var e=[this.view.center.meters.x,this.view.center.meters.y,this.viewport_height];this.position_meters=e,d.mat4.identity(this.view_matrix),d.mat4.translate(this.view_matrix,this.view_matrix,d.vec3.fromValues(-e[0],-e[1],0)),d.mat4.identity(this.projection_matrix),this.projection_matrix[8]=this.axis.x/this.view.aspect,this.projection_matrix[9]=this.axis.y,d.mat4.scale(this.projection_matrix,this.projection_matrix,d.vec3.fromValues(2/this.view.size.meters.x,2/this.view.size.meters.y,2/this.view.size.meters.y))}},{key:"setupProgram",value:function(e){e.uniform("Matrix4fv","u_projection",this.projection_matrix),e.uniform("3fv","u_eye",[0,0,this.viewport_height]),e.uniform("2fv","u_vanishing_point",[0,0])}}]),t}(p),g=function(e){function t(e,r){var n=arguments.length>2&&void 0!==arguments[2]?arguments[2]:{};s(this,t);var o=i(this,(t.__proto__||Object.getPrototypeOf(t)).call(this,e,r,n));return o.type="flat",o}return o(t,e),u(t,[{key:"update",value:function(){this.axis.x=0,this.axis.y=0,a(t.prototype.__proto__||Object.getPrototypeOf(t.prototype),"update",this).call(this)}}]),t}(m)},{"./gl/shader_program":208,"./utils/gl-matrix":256,"./utils/utils":265}],202:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n,i=function(){function e(e,t){var r=[],n=!0,i=!1,o=void 0;try{for(var s,a=e[Symbol.iterator]();!(n=(s=a.next()).done)&&(r.push(s.value),!t||r.length!==t);n=!0);}catch(u){i=!0,o=u}finally{try{!n&&a["return"]&&a["return"]()}finally{if(i)throw o}}return r}return function(t,r){if(Array.isArray(t))return t;if(Symbol.iterator in Object(t))return e(t,r);throw new TypeError("Invalid attempt to destructure non-iterable instance")}}();r.default=n={},n.default_source_max_zoom=18,n.default_view_max_zoom=20,n.tile_size=256,n.half_circumference_meters=20037508.342789244,n.circumference_meters=2*n.half_circumference_meters,n.min_zoom_meters_per_pixel=n.circumference_meters/n.tile_size;var o=[];n.metersPerPixel=function(e){return o[e]=o[e]||n.min_zoom_meters_per_pixel/Math.pow(2,e),o[e]};var s=[];n.metersPerTile=function(e){return s[e]=s[e]||n.circumference_meters/Math.pow(2,e),s[e]},n.tile_scale=4096,n.units_per_pixel=n.tile_scale/n.tile_size,n.height_scale=16;var a=[];n.unitsPerMeter=function(e){return a[e]=a[e]||n.tile_scale/(n.tile_size*n.metersPerPixel(e)),a[e]},n.metersForTile=function(e){return{x:e.x*n.circumference_meters/Math.pow(2,e.z)-n.half_circumference_meters,y:-(e.y*n.circumference_meters/Math.pow(2,e.z)-n.half_circumference_meters)}},n.tileForMeters=function(e,t){var r=i(e,2),o=r[0],s=r[1];return{x:Math.floor((o+n.half_circumference_meters)/(n.circumference_meters/Math.pow(2,t))),y:Math.floor((-s+n.half_circumference_meters)/(n.circumference_meters/Math.pow(2,t))),z:t}},n.wrapTile=function(e){var t=e.x,r=e.y,n=e.z,i=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{x:!0,y:!1},o=(1<180||-180>e)&&(e=((e+180)%360+360)%360-180),e},n.transformGeometry=function(e,t){null!=e&&("Point"===e.type?t(e.coordinates):"LineString"===e.type||"MultiPoint"===e.type?e.coordinates.forEach(t):"Polygon"===e.type||"MultiLineString"===e.type?e.coordinates.forEach(function(e){return e.forEach(t)}):"MultiPolygon"===e.type&&e.coordinates.forEach(function(e){e.forEach(function(e){return e.forEach(t)})}))},n.boxIntersect=function(e,t){return!(t.sw.x>e.ne.x||t.ne.xe.ne.y||t.ne.ys;s++){var a=e[0][s];a[0]r&&(r=a[0]),a[1]>i&&(i=a[1])}return[t,n,r,i]},n.geometryType=function(e){return"Polygon"===e||"MultiPolygon"===e?"polygon":"LineString"===e||"MultiLineString"===e?"line":"Point"===e||"MultiPoint"===e?"point":void 0},n.centroid=function(e){for(var t=0,r=0,n=0,i=e[0],o=i.length,s=0,a=o-1;o>s;a=s,s++){var u=i[s],l=i[a],c=u[1]*l[0]-l[1]*u[0];t+=(u[0]+l[0])*c,r+=(u[1]+l[1])*c,n+=3*c}return[t/n,r/n]},n.multiCentroid=function(e){for(var t=e.length,r=[0,0],i=0;in;n++){var i=e[n],o=e[n+1];t+=i[0]*o[1]-o[0]*i[1]}return t+=e[r-1][0]*e[0][1]-e[0][0]*e[r-1][1]},n.polygonRingArea=function(e){return Math.abs(n.signedPolygonRingAreaSum(e))/2},n.polygonArea=function(e){return n.polygonRingArea(e[0])},n.multiPolygonArea=function(e){for(var t=0,r=0;r0?"CW":0>t?"CCW":void 0}},{}],203:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n;r.default=n={},n.BYTE=5120,n.UNSIGNED_BYTE=5121,n.SHORT=5122,n.UNSIGNED_SHORT=5123,n.INT=5124,n.UNSIGNED_INT=5125,n.FLOAT=5126},{}],204:[function(e,t,r){"use strict";Object.defineProperty(r,"__esModule",{value:!0});var n;r.default=n={},n.getContext=function(e,t){var r=!1;null==e&&(e=document.createElement("canvas"),e.style.position="absolute",e.style.top=0,e.style.left=0,e.style.zIndex=-1,document.body.appendChild(e),r=!0);var i=e.getContext("webgl",t)||e.getContext("experimental-webgl",t);if(!i)throw new Error("Couldn't create WebGL context.");return r?(n.resize(i,window.innerWidth,window.innerHeight,t.device_pixel_ratio),window.addEventListener("resize",function(){n.resize(i,window.innerWidth,window.innerHeight,t.device_pixel_ratio)})):n.resize(i,parseFloat(e.style.width),parseFloat(e.style.height),t.device_pixel_ratio),i},n.resize=function(e,t,r,n){n=n||window.devicePixelRatio||1,e.canvas.style.width=t+"px",e.canvas.style.height=r+"px",e.canvas.width=Math.round(t*n),e.canvas.height=Math.round(r*n),e.bindFramebuffer(e.FRAMEBUFFER,null),e.viewport(0,0,e.canvas.width,e.canvas.height)}},{}],205:[function(e,t,r){"use strict";function n(e,t){var r=i.filter(function(t){return t[0]===e})[0];return r=r&&r[1],r||(i.push([e,{}]),r=i[i.length-1][1]),r[t]||(r[t]=e.getExtension(t)),r[t]}Object.defineProperty(r,"__esModule",{value:!0}),r.default=n;var i=[]},{}],206:[function(e,t,r){"use strict";function n(e){if(Array.isArray(e)){for(var t=0,r=Array(e.length);t=2&&o.length<=4?t.push({type:"vec"+o.length,method:o.length+"fv",name:r,value:o,key:i,uniforms:e}):o.length>4&&t.push({type:"float[]",method:"1fv",name:r+"[0]",value:o,key:i,uniforms:e});else if("string"==typeof o[0])for(n=0;n=2&&o[0].length<=4)for(n=0;n=2&&t.length<=4?r="vec"+t.length:(r="float",n=t.length):"string"==typeof t[0]&&(r="sampler2D",n=t.length):"boolean"==typeof t?r="bool":"string"==typeof t&&(r="sampler2D");var i="";return i+=r+" "+e,n&&(i+="["+n+"]"),i+=";\n"},i.defineUniform=function(e,t){return"uniform "+i.defineVariable(e,t)},i.isUniformDefined=function(e,t){var r=new RegExp("uniform[^;]+(?:{[\\s\\S]*})?[^;]*\\b"+e+"\\b","g");return t.match(r)?!0:!1},i.isSymbolReferenced=function(e,t){var r=new RegExp("\\b"+e+"\\b","g");return t.search(r)>=0?!0:!1},i.expandVec3=function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:1,r=void 0;if(Array.isArray(e)){if(2!==e.length)return e;r=[].concat(n(e),[t]).map(parseFloat)}else r=[e,e,e].map(parseFloat);return r&&r.every(function(e){return"number"==typeof e&&!isNaN(e)})?r:void 0},i.expandVec4=function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:1,r=void 0;if(Array.isArray(e)){if(3!==e.length)return e;r=[].concat(n(e),[t]).map(parseFloat)}else r=[e,e,e,t].map(parseFloat);return r&&r.every(function(e){return"number"==typeof e&&!isNaN(e)})?r:void 0}},{}],207:[function(e,t,r){"use strict";function n(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}Object.defineProperty(r,"__esModule",{value:!0});var i=function(){function e(e,t){for(var r=0;r0?"precision highp float;\n":"precision mediump float;\n",i.TANGRAM_VERTEX_SHADER=!0,i.TANGRAM_FRAGMENT_SHADER=!1,this.computed_vertex_source=f+e.buildDefineString(i)+this.computed_vertex_source,i.TANGRAM_VERTEX_SHADER=!1,i.TANGRAM_FRAGMENT_SHADER=!0,this.computed_fragment_source=e.buildExtensionString(n)+f+e.buildDefineString(i)+this.computed_fragment_source,this.computed_vertex_source=this.computed_vertex_source.replace(b,""),this.computed_fragment_source=this.computed_fragment_source.replace(b,"");try{this.program=e.updateProgram(this.gl,this.program,this.computed_vertex_source,this.computed_fragment_source),this.compiled=!0,this.compiling=!1}catch(d){throw this.program=null,this.compiled=!1,this.compiling=!1,this.error=d,("vertex"===d.type||"fragment"===d.type)&&(this.shader_errors=d.errors,this.shader_errors.forEach(function(e){e.type=d.type,e.block=t.block(d.type,e.line)})),new Error("ShaderProgram.compile(): program "+this.id+" ("+this.name+") error:",d)}this.use(),this.refreshUniforms(),this.refreshAttributes()}},{key:"buildDefineList",value:function(){var t,r={};for(t in e.defines)r[t]=e.defines[t];for(t in this.defines)r[t]=this.defines[t];return r}},{key:"buildShaderBlockList",value:function(){var t=void 0,r={};for(t in e.blocks)if(r[t]=[],Array.isArray(e.blocks[t])){var n;(n=r[t]).push.apply(n,i(e.blocks[t].map(function(e,r){return{key:t,source:e,num:r,scope:"ShaderProgram"}})))}else r[t]=[{key:t,source:e.blocks[t],num:0,scope:"ShaderProgram"}];for(t in this.blocks)if(r[t]=r[t]||[],Array.isArray(this.blocks[t]))for(var o=this.block_scopes&&this.block_scopes[t]||[],s=null,a=0,u=0;u0&&(this.computed_vertex_source=i.join("\n")+this.computed_vertex_source),o.length>0&&(this.computed_fragment_source=o.join("\n")+this.computed_fragment_source)}}},{key:"setUniforms",value:function(e){var t=arguments.length>1&&void 0!==arguments[1]?arguments[1]:!0;if(this.compiled){t&&(this.texture_unit=0);for(var r=c.default.parseUniforms(e),n=0;ni&&i1?r={scope:s[1],name:s[2],num:s[3]}:(s=o.match(/\/\/ tangram-block-end: ([A-Za-z0-9_-]+), ([A-Za-z0-9_-]+), (\d+)/),s&&s.length>1&&(r=null)),r&&(r.line=null==r.line?-1:r.line+1,r.source=o)}return r}},{key:"checkExtensions",value:function(){var e=this,t=[];return this.extensions.forEach(function(r){var n=p.default(e.gl,r),i="TANGRAM_EXTENSION_"+r;e.defines[i]=null!=n,n?t.push(r):u.default("debug","Could not enable extension '"+r+"'")}),t}}]),e}();r.default=x,x.id=0,x.current=null,x.defines={},x.blocks={},x.reset=function(){x.programs_by_source={},x.shaders_by_source={}},x.reset(),x.buildDefineString=function(e){var t="";for(var r in e)null!=e[r]&&e[r]!==!1&&(t+="boolean"==typeof e[r]&&e[r]===!0?"#define "+r+"\n":"number"==typeof e[r]&&Math.floor(e[r])===e[r]?"#define "+r+" "+e[r].toFixed(1)+"\n":"#define "+r+" "+e[r]+"\n");return t},x.buildExtensionString=function(e){e=e||[];var t="";return e.forEach(function(e){t+="#ifdef GL_"+e+"\n#extension GL_"+e+" : enable\n#endif\n"}),t},x.addBlock=function(e){var t;x.blocks[e]=x.blocks[e]||[];for(var r=arguments.length,n=Array(r>1?r-1:0),i=1;r>i;i++)n[i-1]=arguments[i];(t=x.blocks[e]).push.apply(t,n)},x.removeBlock=function(e){x.blocks[e]=[]},x.replaceBlock=function(e){x.removeBlock(e);for(var t=arguments.length,r=Array(t>1?t-1:0),n=1;t>n;n++)r[n-1]=arguments[n];x.addBlock.apply(x,[e].concat(r))},x.updateProgram=function(e,t,r,n){var i=r+"::"+n;if(x.programs_by_source[i])return u.default("trace","Reusing identical source GL program object"),x.programs_by_source[i];try{var o=x.createShader(e,r,e.VERTEX_SHADER),s=x.createShader(e,n,e.FRAGMENT_SHADER)}catch(a){throw u.default("error",a.message),a}if(e.useProgram(null),null!=t)for(var l=e.getAttachedShaders(t),c=0;c2&&void 0!==arguments[2]?arguments[2]:{};i(this,e),this.gl=t,this.texture=t.createTexture(),this.texture&&(this.valid=!0),this.bind(),this.name=r,this.retain_count=0,this.source=null,this.source_type=null,this.config_type=null,this.loading=null,this.loaded=!1,this.filtering=n.filtering,this.sprites=n.sprites,this.texcoords={},this.sizes={},this.setData(1,1,new Uint8Array([0,0,0,255]),{filtering:"nearest"}),e.textures[this.name]&&(this.retain_count=e.textures[this.name].retain_count,e.textures[this.name].retain_count=0,e.textures[this.name].destroy()),e.textures[this.name]=this,e.texture_configs[this.name]=Object.assign({name:r},n),this.load(n),a.default("trace","creating Texture "+this.name)}return o(e,[{key:"destroy",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:{},r=t.force;return this.retain_count>0&&!r?void a.default("error","Texture '"+this.name+"': destroying texture with retain count of '"+this.retain_count+"'"):void(this.valid&&(this.gl.deleteTexture(this.texture),this.texture=null,delete this.data,this.data=null,delete e.textures[this.name],this.valid=!1,a.default("trace","destroying Texture "+this.name)))}},{key:"retain",value:function(){this.retain_count++}},{key:"release",value:function(){this.retain_count<=0&&a.default("error","Texture '"+this.name+"': releasing texture with retain count of '"+this.retain_count+"'"),this.retain_count--,this.retain_count<=0&&this.destroy()}},{key:"bind",value:function(){var t=arguments.length>0&&void 0!==arguments[0]?arguments[0]:0;this.valid&&(e.activeUnit!==t&&(this.gl.activeTexture(this.gl.TEXTURE0+t),e.activeUnit=t,e.boundTexture=null),e.boundTexture!==this.texture&&(this.gl.bindTexture(this.gl.TEXTURE_2D,this.texture),e.boundTexture=this.texture))}},{key:"load",value:function(e){var t=this;return e?(this.loading=null,"string"==typeof e.url?(this.config_type="url",this.setUrl(e.url,e)):e.element?(this.config_type="element",this.setElement(e.element,e)):e.data&&e.width&&e.height&&(this.config_type="data",this.setData(e.width,e.height,e.data,e)),this.loading=this.loading&&this.loading.then(function(){return t.calculateSprites(),t})||Promise.resolve(this),this.loading):this.loading||Promise.resolve(this)}},{key:"setUrl",value:function(t){var r=this,n=arguments.length>1&&void 0!==arguments[1]?arguments[1]:{};return this.valid?(this.url=t,this.source=this.url,this.source_type="url",this.loading=new Promise(function(t){var i=new Image;i.onload=function(){try{r.setElement(i,n)}catch(o){r.loaded=!1,a.default("warn","Texture '"+r.name+"': failed to load url: '"+r.source+"'",o,n),e.trigger("warning",{message:"Failed to load texture from "+r.source,error:o,texture:n})}r.loaded=!0,t(r)},i.onerror=function(i){r.loaded=!1,a.default("warn","Texture '"+r.name+"': failed to load url: '"+r.source+"'",i,n),e.trigger("warning",{message:"Failed to load texture from "+r.source,error:i,texture:n}),t(r)},l.default.isSafari()&&"data:"===r.source.slice(0,5)||(i.crossOrigin="anonymous"),i.src=r.source}),this.loading):void 0}},{key:"setData",value:function(e,t,r){var n=arguments.length>3&&void 0!==arguments[3]?arguments[3]:{};return this.width=e,this.height=t,this.source=r,this.source_type="data",Array.isArray(this.source)&&(this.source=new Uint8Array(this.source)),this.update(n),this.setFiltering(n),this.loaded=!0,this.loading=Promise.resolve(this),this.loading}},{key:"setElement",value:function(t,r){var n=t;if("string"==typeof t&&(t=document.querySelector(t)),t instanceof HTMLCanvasElement||t instanceof HTMLImageElement||t instanceof HTMLVideoElement)this.source=t,this.source_type="element",this.update(r),this.setFiltering(r);else{this.loaded=!1;var i="the 'element' parameter (`element: "+JSON.stringify(n)+"`) must be a CSS ";i+="selector string, or a , or