
(function(){function r(e,n,t){function o(i,f){if(!n[i]){if(!e[i]){var c="function"==typeof require&&require;if(!f&&c)return c(i,!0);if(u)return u(i,!0);var a=new Error("Cannot find module '"+i+"'");throw a.code="MODULE_NOT_FOUND",a}var p=n[i]={exports:{}};e[i][0].call(p.exports,function(r){var n=e[i][1][r];return o(n||r)},p,p.exports,r,e,n,t)}return n[i].exports}for(var u="function"==typeof require&&require,i=0;i<t.length;i++)o(t[i]);return o}return r})()({"/Sites/kisk-mennekes-www-20151019-relaunch-frontend/node_modules/imagesloaded/imagesloaded.js":[function(require,module,exports){
/*!
 * imagesLoaded v4.1.4
 * JavaScript is all like "You images are done yet or what?"
 * MIT License
 */

( function( window, factory ) { 'use strict';
  // universal module definition

  /*global define: false, module: false, require: false */

  if ( typeof define == 'function' && define.amd ) {
    // AMD
    define( [
      'ev-emitter/ev-emitter'
    ], function( EvEmitter ) {
      return factory( window, EvEmitter );
    });
  } else if ( typeof module == 'object' && module.exports ) {
    // CommonJS
    module.exports = factory(
      window,
      require('ev-emitter')
    );
  } else {
    // browser global
    window.imagesLoaded = factory(
      window,
      window.EvEmitter
    );
  }

})( typeof window !== 'undefined' ? window : this,

// --------------------------  factory -------------------------- //

function factory( window, EvEmitter ) {

'use strict';

var $ = window.jQuery;
var console = window.console;

// -------------------------- helpers -------------------------- //

// extend objects
function extend( a, b ) {
  for ( var prop in b ) {
    a[ prop ] = b[ prop ];
  }
  return a;
}

var arraySlice = Array.prototype.slice;

// turn element or nodeList into an array
function makeArray( obj ) {
  if ( Array.isArray( obj ) ) {
    // use object if already an array
    return obj;
  }

  var isArrayLike = typeof obj == 'object' && typeof obj.length == 'number';
  if ( isArrayLike ) {
    // convert nodeList to array
    return arraySlice.call( obj );
  }

  // array of single index
  return [ obj ];
}

// -------------------------- imagesLoaded -------------------------- //

/**
 * @param {Array, Element, NodeList, String} elem
 * @param {Object or Function} options - if function, use as callback
 * @param {Function} onAlways - callback function
 */
function ImagesLoaded( elem, options, onAlways ) {
  // coerce ImagesLoaded() without new, to be new ImagesLoaded()
  if ( !( this instanceof ImagesLoaded ) ) {
    return new ImagesLoaded( elem, options, onAlways );
  }
  // use elem as selector string
  var queryElem = elem;
  if ( typeof elem == 'string' ) {
    queryElem = document.querySelectorAll( elem );
  }
  // bail if bad element
  if ( !queryElem ) {
    console.error( 'Bad element for imagesLoaded ' + ( queryElem || elem ) );
    return;
  }

  this.elements = makeArray( queryElem );
  this.options = extend( {}, this.options );
  // shift arguments if no options set
  if ( typeof options == 'function' ) {
    onAlways = options;
  } else {
    extend( this.options, options );
  }

  if ( onAlways ) {
    this.on( 'always', onAlways );
  }

  this.getImages();

  if ( $ ) {
    // add jQuery Deferred object
    this.jqDeferred = new $.Deferred();
  }

  // HACK check async to allow time to bind listeners
  setTimeout( this.check.bind( this ) );
}

ImagesLoaded.prototype = Object.create( EvEmitter.prototype );

ImagesLoaded.prototype.options = {};

ImagesLoaded.prototype.getImages = function() {
  this.images = [];

  // filter & find items if we have an item selector
  this.elements.forEach( this.addElementImages, this );
};

/**
 * @param {Node} element
 */
ImagesLoaded.prototype.addElementImages = function( elem ) {
  // filter siblings
  if ( elem.nodeName == 'IMG' ) {
    this.addImage( elem );
  }
  // get background image on element
  if ( this.options.background === true ) {
    this.addElementBackgroundImages( elem );
  }

  // find children
  // no non-element nodes, #143
  var nodeType = elem.nodeType;
  if ( !nodeType || !elementNodeTypes[ nodeType ] ) {
    return;
  }
  var childImgs = elem.querySelectorAll('img');
  // concat childElems to filterFound array
  for ( var i=0; i < childImgs.length; i++ ) {
    var img = childImgs[i];
    this.addImage( img );
  }

  // get child background images
  if ( typeof this.options.background == 'string' ) {
    var children = elem.querySelectorAll( this.options.background );
    for ( i=0; i < children.length; i++ ) {
      var child = children[i];
      this.addElementBackgroundImages( child );
    }
  }
};

var elementNodeTypes = {
  1: true,
  9: true,
  11: true
};

ImagesLoaded.prototype.addElementBackgroundImages = function( elem ) {
  var style = getComputedStyle( elem );
  if ( !style ) {
    // Firefox returns null if in a hidden iframe https://bugzil.la/548397
    return;
  }
  // get url inside url("...")
  var reURL = /url\((['"])?(.*?)\1\)/gi;
  var matches = reURL.exec( style.backgroundImage );
  while ( matches !== null ) {
    var url = matches && matches[2];
    if ( url ) {
      this.addBackground( url, elem );
    }
    matches = reURL.exec( style.backgroundImage );
  }
};

/**
 * @param {Image} img
 */
ImagesLoaded.prototype.addImage = function( img ) {
  var loadingImage = new LoadingImage( img );
  this.images.push( loadingImage );
};

ImagesLoaded.prototype.addBackground = function( url, elem ) {
  var background = new Background( url, elem );
  this.images.push( background );
};

ImagesLoaded.prototype.check = function() {
  var _this = this;
  this.progressedCount = 0;
  this.hasAnyBroken = false;
  // complete if no images
  if ( !this.images.length ) {
    this.complete();
    return;
  }

  function onProgress( image, elem, message ) {
    // HACK - Chrome triggers event before object properties have changed. #83
    setTimeout( function() {
      _this.progress( image, elem, message );
    });
  }

  this.images.forEach( function( loadingImage ) {
    loadingImage.once( 'progress', onProgress );
    loadingImage.check();
  });
};

ImagesLoaded.prototype.progress = function( image, elem, message ) {
  this.progressedCount++;
  this.hasAnyBroken = this.hasAnyBroken || !image.isLoaded;
  // progress event
  this.emitEvent( 'progress', [ this, image, elem ] );
  if ( this.jqDeferred && this.jqDeferred.notify ) {
    this.jqDeferred.notify( this, image );
  }
  // check if completed
  if ( this.progressedCount == this.images.length ) {
    this.complete();
  }

  if ( this.options.debug && console ) {
    console.log( 'progress: ' + message, image, elem );
  }
};

ImagesLoaded.prototype.complete = function() {
  var eventName = this.hasAnyBroken ? 'fail' : 'done';
  this.isComplete = true;
  this.emitEvent( eventName, [ this ] );
  this.emitEvent( 'always', [ this ] );
  if ( this.jqDeferred ) {
    var jqMethod = this.hasAnyBroken ? 'reject' : 'resolve';
    this.jqDeferred[ jqMethod ]( this );
  }
};

// --------------------------  -------------------------- //

function LoadingImage( img ) {
  this.img = img;
}

LoadingImage.prototype = Object.create( EvEmitter.prototype );

LoadingImage.prototype.check = function() {
  // If complete is true and browser supports natural sizes,
  // try to check for image status manually.
  var isComplete = this.getIsImageComplete();
  if ( isComplete ) {
    // report based on naturalWidth
    this.confirm( this.img.naturalWidth !== 0, 'naturalWidth' );
    return;
  }

  // If none of the checks above matched, simulate loading on detached element.
  this.proxyImage = new Image();
  this.proxyImage.addEventListener( 'load', this );
  this.proxyImage.addEventListener( 'error', this );
  // bind to image as well for Firefox. #191
  this.img.addEventListener( 'load', this );
  this.img.addEventListener( 'error', this );
  this.proxyImage.src = this.img.src;
};

LoadingImage.prototype.getIsImageComplete = function() {
  // check for non-zero, non-undefined naturalWidth
  // fixes Safari+InfiniteScroll+Masonry bug infinite-scroll#671
  return this.img.complete && this.img.naturalWidth;
};

LoadingImage.prototype.confirm = function( isLoaded, message ) {
  this.isLoaded = isLoaded;
  this.emitEvent( 'progress', [ this, this.img, message ] );
};

// ----- events ----- //

// trigger specified handler for event type
LoadingImage.prototype.handleEvent = function( event ) {
  var method = 'on' + event.type;
  if ( this[ method ] ) {
    this[ method ]( event );
  }
};

LoadingImage.prototype.onload = function() {
  this.confirm( true, 'onload' );
  this.unbindEvents();
};

LoadingImage.prototype.onerror = function() {
  this.confirm( false, 'onerror' );
  this.unbindEvents();
};

LoadingImage.prototype.unbindEvents = function() {
  this.proxyImage.removeEventListener( 'load', this );
  this.proxyImage.removeEventListener( 'error', this );
  this.img.removeEventListener( 'load', this );
  this.img.removeEventListener( 'error', this );
};

// -------------------------- Background -------------------------- //

function Background( url, element ) {
  this.url = url;
  this.element = element;
  this.img = new Image();
}

// inherit LoadingImage prototype
Background.prototype = Object.create( LoadingImage.prototype );

Background.prototype.check = function() {
  this.img.addEventListener( 'load', this );
  this.img.addEventListener( 'error', this );
  this.img.src = this.url;
  // check if image is already complete
  var isComplete = this.getIsImageComplete();
  if ( isComplete ) {
    this.confirm( this.img.naturalWidth !== 0, 'naturalWidth' );
    this.unbindEvents();
  }
};

Background.prototype.unbindEvents = function() {
  this.img.removeEventListener( 'load', this );
  this.img.removeEventListener( 'error', this );
};

Background.prototype.confirm = function( isLoaded, message ) {
  this.isLoaded = isLoaded;
  this.emitEvent( 'progress', [ this, this.element, message ] );
};

// -------------------------- jQuery -------------------------- //

ImagesLoaded.makeJQueryPlugin = function( jQuery ) {
  jQuery = jQuery || window.jQuery;
  if ( !jQuery ) {
    return;
  }
  // set local variable
  $ = jQuery;
  // $().imagesLoaded()
  $.fn.imagesLoaded = function( options, callback ) {
    var instance = new ImagesLoaded( this, options, callback );
    return instance.jqDeferred.promise( $(this) );
  };
};
// try making plugin
ImagesLoaded.makeJQueryPlugin();

// --------------------------  -------------------------- //

return ImagesLoaded;

});

},{"ev-emitter":"/Sites/kisk-mennekes-www-20151019-relaunch-frontend/node_modules/imagesloaded/node_modules/ev-emitter/ev-emitter.js"}],"/Sites/kisk-mennekes-www-20151019-relaunch-frontend/node_modules/imagesloaded/node_modules/ev-emitter/ev-emitter.js":[function(require,module,exports){
/**
 * EvEmitter v1.1.0
 * Lil' event emitter
 * MIT License
 */

/* jshint unused: true, undef: true, strict: true */

( function( global, factory ) {
  // universal module definition
  /* jshint strict: false */ /* globals define, module, window */
  if ( typeof define == 'function' && define.amd ) {
    // AMD - RequireJS
    define( factory );
  } else if ( typeof module == 'object' && module.exports ) {
    // CommonJS - Browserify, Webpack
    module.exports = factory();
  } else {
    // Browser globals
    global.EvEmitter = factory();
  }

}( typeof window != 'undefined' ? window : this, function() {

"use strict";

function EvEmitter() {}

var proto = EvEmitter.prototype;

proto.on = function( eventName, listener ) {
  if ( !eventName || !listener ) {
    return;
  }
  // set events hash
  var events = this._events = this._events || {};
  // set listeners array
  var listeners = events[ eventName ] = events[ eventName ] || [];
  // only add once
  if ( listeners.indexOf( listener ) == -1 ) {
    listeners.push( listener );
  }

  return this;
};

proto.once = function( eventName, listener ) {
  if ( !eventName || !listener ) {
    return;
  }
  // add event
  this.on( eventName, listener );
  // set once flag
  // set onceEvents hash
  var onceEvents = this._onceEvents = this._onceEvents || {};
  // set onceListeners object
  var onceListeners = onceEvents[ eventName ] = onceEvents[ eventName ] || {};
  // set flag
  onceListeners[ listener ] = true;

  return this;
};

proto.off = function( eventName, listener ) {
  var listeners = this._events && this._events[ eventName ];
  if ( !listeners || !listeners.length ) {
    return;
  }
  var index = listeners.indexOf( listener );
  if ( index != -1 ) {
    listeners.splice( index, 1 );
  }

  return this;
};

proto.emitEvent = function( eventName, args ) {
  var listeners = this._events && this._events[ eventName ];
  if ( !listeners || !listeners.length ) {
    return;
  }
  // copy over to avoid interference if .off() in listener
  listeners = listeners.slice(0);
  args = args || [];
  // once stuff
  var onceListeners = this._onceEvents && this._onceEvents[ eventName ];

  for ( var i=0; i < listeners.length; i++ ) {
    var listener = listeners[i]
    var isOnce = onceListeners && onceListeners[ listener ];
    if ( isOnce ) {
      // remove listener
      // remove before trigger to prevent recursion
      this.off( eventName, listener );
      // unset once flag
      delete onceListeners[ listener ];
    }
    // trigger listener
    listener.apply( this, args );
  }

  return this;
};

proto.allOff = function() {
  delete this._events;
  delete this._onceEvents;
};

return EvEmitter;

}));

},{}],"/Sites/kisk-mennekes-www-20151019-relaunch-frontend/node_modules/jquery/dist/jquery.js":[function(require,module,exports){
/*!
 * jQuery JavaScript Library v2.2.4
 * http://jquery.com/
 *
 * Includes Sizzle.js
 * http://sizzlejs.com/
 *
 * Copyright jQuery Foundation and other contributors
 * Released under the MIT license
 * http://jquery.org/license
 *
 * Date: 2016-05-20T17:23Z
 */

(function( global, factory ) {

	if ( typeof module === "object" && typeof module.exports === "object" ) {
		// For CommonJS and CommonJS-like environments where a proper `window`
		// is present, execute the factory and get jQuery.
		// For environments that do not have a `window` with a `document`
		// (such as Node.js), expose a factory as module.exports.
		// This accentuates the need for the creation of a real `window`.
		// e.g. var jQuery = require("jquery")(window);
		// See ticket #14549 for more info.
		module.exports = global.document ?
			factory( global, true ) :
			function( w ) {
				if ( !w.document ) {
					throw new Error( "jQuery requires a window with a document" );
				}
				return factory( w );
			};
	} else {
		factory( global );
	}

// Pass this if window is not defined yet
}(typeof window !== "undefined" ? window : this, function( window, noGlobal ) {

// Support: Firefox 18+
// Can't be in strict mode, several libs including ASP.NET trace
// the stack via arguments.caller.callee and Firefox dies if
// you try to trace through "use strict" call chains. (#13335)
//"use strict";
var arr = [];

var document = window.document;

var slice = arr.slice;

var concat = arr.concat;

var push = arr.push;

var indexOf = arr.indexOf;

var class2type = {};

var toString = class2type.toString;

var hasOwn = class2type.hasOwnProperty;

var support = {};



var
	version = "2.2.4",

	// Define a local copy of jQuery
	jQuery = function( selector, context ) {

		// The jQuery object is actually just the init constructor 'enhanced'
		// Need init if jQuery is called (just allow error to be thrown if not included)
		return new jQuery.fn.init( selector, context );
	},

	// Support: Android<4.1
	// Make sure we trim BOM and NBSP
	rtrim = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,

	// Matches dashed string for camelizing
	rmsPrefix = /^-ms-/,
	rdashAlpha = /-([\da-z])/gi,

	// Used by jQuery.camelCase as callback to replace()
	fcamelCase = function( all, letter ) {
		return letter.toUpperCase();
	};

jQuery.fn = jQuery.prototype = {

	// The current version of jQuery being used
	jquery: version,

	constructor: jQuery,

	// Start with an empty selector
	selector: "",

	// The default length of a jQuery object is 0
	length: 0,

	toArray: function() {
		return slice.call( this );
	},

	// Get the Nth element in the matched element set OR
	// Get the whole matched element set as a clean array
	get: function( num ) {
		return num != null ?

			// Return just the one element from the set
			( num < 0 ? this[ num + this.length ] : this[ num ] ) :

			// Return all the elements in a clean array
			slice.call( this );
	},

	// Take an array of elements and push it onto the stack
	// (returning the new matched element set)
	pushStack: function( elems ) {

		// Build a new jQuery matched element set
		var ret = jQuery.merge( this.constructor(), elems );

		// Add the old object onto the stack (as a reference)
		ret.prevObject = this;
		ret.context = this.context;

		// Return the newly-formed element set
		return ret;
	},

	// Execute a callback for every element in the matched set.
	each: function( callback ) {
		return jQuery.each( this, callback );
	},

	map: function( callback ) {
		return this.pushStack( jQuery.map( this, function( elem, i ) {
			return callback.call( elem, i, elem );
		} ) );
	},

	slice: function() {
		return this.pushStack( slice.apply( this, arguments ) );
	},

	first: function() {
		return this.eq( 0 );
	},

	last: function() {
		return this.eq( -1 );
	},

	eq: function( i ) {
		var len = this.length,
			j = +i + ( i < 0 ? len : 0 );
		return this.pushStack( j >= 0 && j < len ? [ this[ j ] ] : [] );
	},

	end: function() {
		return this.prevObject || this.constructor();
	},

	// For internal use only.
	// Behaves like an Array's method, not like a jQuery method.
	push: push,
	sort: arr.sort,
	splice: arr.splice
};

jQuery.extend = jQuery.fn.extend = function() {
	var options, name, src, copy, copyIsArray, clone,
		target = arguments[ 0 ] || {},
		i = 1,
		length = arguments.length,
		deep = false;

	// Handle a deep copy situation
	if ( typeof target === "boolean" ) {
		deep = target;

		// Skip the boolean and the target
		target = arguments[ i ] || {};
		i++;
	}

	// Handle case when target is a string or something (possible in deep copy)
	if ( typeof target !== "object" && !jQuery.isFunction( target ) ) {
		target = {};
	}

	// Extend jQuery itself if only one argument is passed
	if ( i === length ) {
		target = this;
		i--;
	}

	for ( ; i < length; i++ ) {

		// Only deal with non-null/undefined values
		if ( ( options = arguments[ i ] ) != null ) {

			// Extend the base object
			for ( name in options ) {
				src = target[ name ];
				copy = options[ name ];

				// Prevent never-ending loop
				if ( target === copy ) {
					continue;
				}

				// Recurse if we're merging plain objects or arrays
				if ( deep && copy && ( jQuery.isPlainObject( copy ) ||
					( copyIsArray = jQuery.isArray( copy ) ) ) ) {

					if ( copyIsArray ) {
						copyIsArray = false;
						clone = src && jQuery.isArray( src ) ? src : [];

					} else {
						clone = src && jQuery.isPlainObject( src ) ? src : {};
					}

					// Never move original objects, clone them
					target[ name ] = jQuery.extend( deep, clone, copy );

				// Don't bring in undefined values
				} else if ( copy !== undefined ) {
					target[ name ] = copy;
				}
			}
		}
	}

	// Return the modified object
	return target;
};

jQuery.extend( {

	// Unique for each copy of jQuery on the page
	expando: "jQuery" + ( version + Math.random() ).replace( /\D/g, "" ),

	// Assume jQuery is ready without the ready module
	isReady: true,

	error: function( msg ) {
		throw new Error( msg );
	},

	noop: function() {},

	isFunction: function( obj ) {
		return jQuery.type( obj ) === "function";
	},

	isArray: Array.isArray,

	isWindow: function( obj ) {
		return obj != null && obj === obj.window;
	},

	isNumeric: function( obj ) {

		// parseFloat NaNs numeric-cast false positives (null|true|false|"")
		// ...but misinterprets leading-number strings, particularly hex literals ("0x...")
		// subtraction forces infinities to NaN
		// adding 1 corrects loss of precision from parseFloat (#15100)
		var realStringObj = obj && obj.toString();
		return !jQuery.isArray( obj ) && ( realStringObj - parseFloat( realStringObj ) + 1 ) >= 0;
	},

	isPlainObject: function( obj ) {
		var key;

		// Not plain objects:
		// - Any object or value whose internal [[Class]] property is not "[object Object]"
		// - DOM nodes
		// - window
		if ( jQuery.type( obj ) !== "object" || obj.nodeType || jQuery.isWindow( obj ) ) {
			return false;
		}

		// Not own constructor property must be Object
		if ( obj.constructor &&
				!hasOwn.call( obj, "constructor" ) &&
				!hasOwn.call( obj.constructor.prototype || {}, "isPrototypeOf" ) ) {
			return false;
		}

		// Own properties are enumerated firstly, so to speed up,
		// if last one is own, then all properties are own
		for ( key in obj ) {}

		return key === undefined || hasOwn.call( obj, key );
	},

	isEmptyObject: function( obj ) {
		var name;
		for ( name in obj ) {
			return false;
		}
		return true;
	},

	type: function( obj ) {
		if ( obj == null ) {
			return obj + "";
		}

		// Support: Android<4.0, iOS<6 (functionish RegExp)
		return typeof obj === "object" || typeof obj === "function" ?
			class2type[ toString.call( obj ) ] || "object" :
			typeof obj;
	},

	// Evaluates a script in a global context
	globalEval: function( code ) {
		var script,
			indirect = eval;

		code = jQuery.trim( code );

		if ( code ) {

			// If the code includes a valid, prologue position
			// strict mode pragma, execute code by injecting a
			// script tag into the document.
			if ( code.indexOf( "use strict" ) === 1 ) {
				script = document.createElement( "script" );
				script.text = code;
				document.head.appendChild( script ).parentNode.removeChild( script );
			} else {

				// Otherwise, avoid the DOM node creation, insertion
				// and removal by using an indirect global eval

				indirect( code );
			}
		}
	},

	// Convert dashed to camelCase; used by the css and data modules
	// Support: IE9-11+
	// Microsoft forgot to hump their vendor prefix (#9572)
	camelCase: function( string ) {
		return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase );
	},

	nodeName: function( elem, name ) {
		return elem.nodeName && elem.nodeName.toLowerCase() === name.toLowerCase();
	},

	each: function( obj, callback ) {
		var length, i = 0;

		if ( isArrayLike( obj ) ) {
			length = obj.length;
			for ( ; i < length; i++ ) {
				if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) {
					break;
				}
			}
		} else {
			for ( i in obj ) {
				if ( callback.call( obj[ i ], i, obj[ i ] ) === false ) {
					break;
				}
			}
		}

		return obj;
	},

	// Support: Android<4.1
	trim: function( text ) {
		return text == null ?
			"" :
			( text + "" ).replace( rtrim, "" );
	},

	// results is for internal usage only
	makeArray: function( arr, results ) {
		var ret = results || [];

		if ( arr != null ) {
			if ( isArrayLike( Object( arr ) ) ) {
				jQuery.merge( ret,
					typeof arr === "string" ?
					[ arr ] : arr
				);
			} else {
				push.call( ret, arr );
			}
		}

		return ret;
	},

	inArray: function( elem, arr, i ) {
		return arr == null ? -1 : indexOf.call( arr, elem, i );
	},

	merge: function( first, second ) {
		var len = +second.length,
			j = 0,
			i = first.length;

		for ( ; j < len; j++ ) {
			first[ i++ ] = second[ j ];
		}

		first.length = i;

		return first;
	},

	grep: function( elems, callback, invert ) {
		var callbackInverse,
			matches = [],
			i = 0,
			length = elems.length,
			callbackExpect = !invert;

		// Go through the array, only saving the items
		// that pass the validator function
		for ( ; i < length; i++ ) {
			callbackInverse = !callback( elems[ i ], i );
			if ( callbackInverse !== callbackExpect ) {
				matches.push( elems[ i ] );
			}
		}

		return matches;
	},

	// arg is for internal usage only
	map: function( elems, callback, arg ) {
		var length, value,
			i = 0,
			ret = [];

		// Go through the array, translating each of the items to their new values
		if ( isArrayLike( elems ) ) {
			length = elems.length;
			for ( ; i < length; i++ ) {
				value = callback( elems[ i ], i, arg );

				if ( value != null ) {
					ret.push( value );
				}
			}

		// Go through every key on the object,
		} else {
			for ( i in elems ) {
				value = callback( elems[ i ], i, arg );

				if ( value != null ) {
					ret.push( value );
				}
			}
		}

		// Flatten any nested arrays
		return concat.apply( [], ret );
	},

	// A global GUID counter for objects
	guid: 1,

	// Bind a function to a context, optionally partially applying any
	// arguments.
	proxy: function( fn, context ) {
		var tmp, args, proxy;

		if ( typeof context === "string" ) {
			tmp = fn[ context ];
			context = fn;
			fn = tmp;
		}

		// Quick check to determine if target is callable, in the spec
		// this throws a TypeError, but we will just return undefined.
		if ( !jQuery.isFunction( fn ) ) {
			return undefined;
		}

		// Simulated bind
		args = slice.call( arguments, 2 );
		proxy = function() {
			return fn.apply( context || this, args.concat( slice.call( arguments ) ) );
		};

		// Set the guid of unique handler to the same of original handler, so it can be removed
		proxy.guid = fn.guid = fn.guid || jQuery.guid++;

		return proxy;
	},

	now: Date.now,

	// jQuery.support is not used in Core but other projects attach their
	// properties to it so it needs to exist.
	support: support
} );

// JSHint would error on this code due to the Symbol not being defined in ES5.
// Defining this global in .jshintrc would create a danger of using the global
// unguarded in another place, it seems safer to just disable JSHint for these
// three lines.
/* jshint ignore: start */
if ( typeof Symbol === "function" ) {
	jQuery.fn[ Symbol.iterator ] = arr[ Symbol.iterator ];
}
/* jshint ignore: end */

// Populate the class2type map
jQuery.each( "Boolean Number String Function Array Date RegExp Object Error Symbol".split( " " ),
function( i, name ) {
	class2type[ "[object " + name + "]" ] = name.toLowerCase();
} );

function isArrayLike( obj ) {

	// Support: iOS 8.2 (not reproducible in simulator)
	// `in` check used to prevent JIT error (gh-2145)
	// hasOwn isn't used here due to false negatives
	// regarding Nodelist length in IE
	var length = !!obj && "length" in obj && obj.length,
		type = jQuery.type( obj );

	if ( type === "function" || jQuery.isWindow( obj ) ) {
		return false;
	}

	return type === "array" || length === 0 ||
		typeof length === "number" && length > 0 && ( length - 1 ) in obj;
}
var Sizzle =
/*!
 * Sizzle CSS Selector Engine v2.2.1
 * http://sizzlejs.com/
 *
 * Copyright jQuery Foundation and other contributors
 * Released under the MIT license
 * http://jquery.org/license
 *
 * Date: 2015-10-17
 */
(function( window ) {

var i,
	support,
	Expr,
	getText,
	isXML,
	tokenize,
	compile,
	select,
	outermostContext,
	sortInput,
	hasDuplicate,

	// Local document vars
	setDocument,
	document,
	docElem,
	documentIsHTML,
	rbuggyQSA,
	rbuggyMatches,
	matches,
	contains,

	// Instance-specific data
	expando = "sizzle" + 1 * new Date(),
	preferredDoc = window.document,
	dirruns = 0,
	done = 0,
	classCache = createCache(),
	tokenCache = createCache(),
	compilerCache = createCache(),
	sortOrder = function( a, b ) {
		if ( a === b ) {
			hasDuplicate = true;
		}
		return 0;
	},

	// General-purpose constants
	MAX_NEGATIVE = 1 << 31,

	// Instance methods
	hasOwn = ({}).hasOwnProperty,
	arr = [],
	pop = arr.pop,
	push_native = arr.push,
	push = arr.push,
	slice = arr.slice,
	// Use a stripped-down indexOf as it's faster than native
	// http://jsperf.com/thor-indexof-vs-for/5
	indexOf = function( list, elem ) {
		var i = 0,
			len = list.length;
		for ( ; i < len; i++ ) {
			if ( list[i] === elem ) {
				return i;
			}
		}
		return -1;
	},

	booleans = "checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",

	// Regular expressions

	// http://www.w3.org/TR/css3-selectors/#whitespace
	whitespace = "[\\x20\\t\\r\\n\\f]",

	// http://www.w3.org/TR/CSS21/syndata.html#value-def-identifier
	identifier = "(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",

	// Attribute selectors: http://www.w3.org/TR/selectors/#attribute-selectors
	attributes = "\\[" + whitespace + "*(" + identifier + ")(?:" + whitespace +
		// Operator (capture 2)
		"*([*^$|!~]?=)" + whitespace +
		// "Attribute values must be CSS identifiers [capture 5] or strings [capture 3 or capture 4]"
		"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|(" + identifier + "))|)" + whitespace +
		"*\\]",

	pseudos = ":(" + identifier + ")(?:\\((" +
		// To reduce the number of selectors needing tokenize in the preFilter, prefer arguments:
		// 1. quoted (capture 3; capture 4 or capture 5)
		"('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|" +
		// 2. simple (capture 6)
		"((?:\\\\.|[^\\\\()[\\]]|" + attributes + ")*)|" +
		// 3. anything else (capture 2)
		".*" +
		")\\)|)",

	// Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter
	rwhitespace = new RegExp( whitespace + "+", "g" ),
	rtrim = new RegExp( "^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + whitespace + "+$", "g" ),

	rcomma = new RegExp( "^" + whitespace + "*," + whitespace + "*" ),
	rcombinators = new RegExp( "^" + whitespace + "*([>+~]|" + whitespace + ")" + whitespace + "*" ),

	rattributeQuotes = new RegExp( "=" + whitespace + "*([^\\]'\"]*?)" + whitespace + "*\\]", "g" ),

	rpseudo = new RegExp( pseudos ),
	ridentifier = new RegExp( "^" + identifier + "$" ),

	matchExpr = {
		"ID": new RegExp( "^#(" + identifier + ")" ),
		"CLASS": new RegExp( "^\\.(" + identifier + ")" ),
		"TAG": new RegExp( "^(" + identifier + "|[*])" ),
		"ATTR": new RegExp( "^" + attributes ),
		"PSEUDO": new RegExp( "^" + pseudos ),
		"CHILD": new RegExp( "^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(" + whitespace +
			"*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" + whitespace +
			"*(\\d+)|))" + whitespace + "*\\)|)", "i" ),
		"bool": new RegExp( "^(?:" + booleans + ")$", "i" ),
		// For use in libraries implementing .is()
		// We use this for POS matching in `select`
		"needsContext": new RegExp( "^" + whitespace + "*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(" +
			whitespace + "*((?:-\\d)?\\d*)" + whitespace + "*\\)|)(?=[^-]|$)", "i" )
	},

	rinputs = /^(?:input|select|textarea|button)$/i,
	rheader = /^h\d$/i,

	rnative = /^[^{]+\{\s*\[native \w/,

	// Easily-parseable/retrievable ID or TAG or CLASS selectors
	rquickExpr = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,

	rsibling = /[+~]/,
	rescape = /'|\\/g,

	// CSS escapes http://www.w3.org/TR/CSS21/syndata.html#escaped-characters
	runescape = new RegExp( "\\\\([\\da-f]{1,6}" + whitespace + "?|(" + whitespace + ")|.)", "ig" ),
	funescape = function( _, escaped, escapedWhitespace ) {
		var high = "0x" + escaped - 0x10000;
		// NaN means non-codepoint
		// Support: Firefox<24
		// Workaround erroneous numeric interpretation of +"0x"
		return high !== high || escapedWhitespace ?
			escaped :
			high < 0 ?
				// BMP codepoint
				String.fromCharCode( high + 0x10000 ) :
				// Supplemental Plane codepoint (surrogate pair)
				String.fromCharCode( high >> 10 | 0xD800, high & 0x3FF | 0xDC00 );
	},

	// Used for iframes
	// See setDocument()
	// Removing the function wrapper causes a "Permission Denied"
	// error in IE
	unloadHandler = function() {
		setDocument();
	};

// Optimize for push.apply( _, NodeList )
try {
	push.apply(
		(arr = slice.call( preferredDoc.childNodes )),
		preferredDoc.childNodes
	);
	// Support: Android<4.0
	// Detect silently failing push.apply
	arr[ preferredDoc.childNodes.length ].nodeType;
} catch ( e ) {
	push = { apply: arr.length ?

		// Leverage slice if possible
		function( target, els ) {
			push_native.apply( target, slice.call(els) );
		} :

		// Support: IE<9
		// Otherwise append directly
		function( target, els ) {
			var j = target.length,
				i = 0;
			// Can't trust NodeList.length
			while ( (target[j++] = els[i++]) ) {}
			target.length = j - 1;
		}
	};
}

function Sizzle( selector, context, results, seed ) {
	var m, i, elem, nid, nidselect, match, groups, newSelector,
		newContext = context && context.ownerDocument,

		// nodeType defaults to 9, since context defaults to document
		nodeType = context ? context.nodeType : 9;

	results = results || [];

	// Return early from calls with invalid selector or context
	if ( typeof selector !== "string" || !selector ||
		nodeType !== 1 && nodeType !== 9 && nodeType !== 11 ) {

		return results;
	}

	// Try to shortcut find operations (as opposed to filters) in HTML documents
	if ( !seed ) {

		if ( ( context ? context.ownerDocument || context : preferredDoc ) !== document ) {
			setDocument( context );
		}
		context = context || document;

		if ( documentIsHTML ) {

			// If the selector is sufficiently simple, try using a "get*By*" DOM method
			// (excepting DocumentFragment context, where the methods don't exist)
			if ( nodeType !== 11 && (match = rquickExpr.exec( selector )) ) {

				// ID selector
				if ( (m = match[1]) ) {

					// Document context
					if ( nodeType === 9 ) {
						if ( (elem = context.getElementById( m )) ) {

							// Support: IE, Opera, Webkit
							// TODO: identify versions
							// getElementById can match elements by name instead of ID
							if ( elem.id === m ) {
								results.push( elem );
								return results;
							}
						} else {
							return results;
						}

					// Element context
					} else {

						// Support: IE, Opera, Webkit
						// TODO: identify versions
						// getElementById can match elements by name instead of ID
						if ( newContext && (elem = newContext.getElementById( m )) &&
							contains( context, elem ) &&
							elem.id === m ) {

							results.push( elem );
							return results;
						}
					}

				// Type selector
				} else if ( match[2] ) {
					push.apply( results, context.getElementsByTagName( selector ) );
					return results;

				// Class selector
				} else if ( (m = match[3]) && support.getElementsByClassName &&
					context.getElementsByClassName ) {

					push.apply( results, context.getElementsByClassName( m ) );
					return results;
				}
			}

			// Take advantage of querySelectorAll
			if ( support.qsa &&
				!compilerCache[ selector + " " ] &&
				(!rbuggyQSA || !rbuggyQSA.test( selector )) ) {

				if ( nodeType !== 1 ) {
					newContext = context;
					newSelector = selector;

				// qSA looks outside Element context, which is not what we want
				// Thanks to Andrew Dupont for this workaround technique
				// Support: IE <=8
				// Exclude object elements
				} else if ( context.nodeName.toLowerCase() !== "object" ) {

					// Capture the context ID, setting it first if necessary
					if ( (nid = context.getAttribute( "id" )) ) {
						nid = nid.replace( rescape, "\\$&" );
					} else {
						context.setAttribute( "id", (nid = expando) );
					}

					// Prefix every selector in the list
					groups = tokenize( selector );
					i = groups.length;
					nidselect = ridentifier.test( nid ) ? "#" + nid : "[id='" + nid + "']";
					while ( i-- ) {
						groups[i] = nidselect + " " + toSelector( groups[i] );
					}
					newSelector = groups.join( "," );

					// Expand context for sibling selectors
					newContext = rsibling.test( selector ) && testContext( context.parentNode ) ||
						context;
				}

				if ( newSelector ) {
					try {
						push.apply( results,
							newContext.querySelectorAll( newSelector )
						);
						return results;
					} catch ( qsaError ) {
					} finally {
						if ( nid === expando ) {
							context.removeAttribute( "id" );
						}
					}
				}
			}
		}
	}

	// All others
	return select( selector.replace( rtrim, "$1" ), context, results, seed );
}

/**
 * Create key-value caches of limited size
 * @returns {function(string, object)} Returns the Object data after storing it on itself with
 *	property name the (space-suffixed) string and (if the cache is larger than Expr.cacheLength)
 *	deleting the oldest entry
 */
function createCache() {
	var keys = [];

	function cache( key, value ) {
		// Use (key + " ") to avoid collision with native prototype properties (see Issue #157)
		if ( keys.push( key + " " ) > Expr.cacheLength ) {
			// Only keep the most recent entries
			delete cache[ keys.shift() ];
		}
		return (cache[ key + " " ] = value);
	}
	return cache;
}

/**
 * Mark a function for special use by Sizzle
 * @param {Function} fn The function to mark
 */
function markFunction( fn ) {
	fn[ expando ] = true;
	return fn;
}

/**
 * Support testing using an element
 * @param {Function} fn Passed the created div and expects a boolean result
 */
function assert( fn ) {
	var div = document.createElement("div");

	try {
		return !!fn( div );
	} catch (e) {
		return false;
	} finally {
		// Remove from its parent by default
		if ( div.parentNode ) {
			div.parentNode.removeChild( div );
		}
		// release memory in IE
		div = null;
	}
}

/**
 * Adds the same handler for all of the specified attrs
 * @param {String} attrs Pipe-separated list of attributes
 * @param {Function} handler The method that will be applied
 */
function addHandle( attrs, handler ) {
	var arr = attrs.split("|"),
		i = arr.length;

	while ( i-- ) {
		Expr.attrHandle[ arr[i] ] = handler;
	}
}

/**
 * Checks document order of two siblings
 * @param {Element} a
 * @param {Element} b
 * @returns {Number} Returns less than 0 if a precedes b, greater than 0 if a follows b
 */
function siblingCheck( a, b ) {
	var cur = b && a,
		diff = cur && a.nodeType === 1 && b.nodeType === 1 &&
			( ~b.sourceIndex || MAX_NEGATIVE ) -
			( ~a.sourceIndex || MAX_NEGATIVE );

	// Use IE sourceIndex if available on both nodes
	if ( diff ) {
		return diff;
	}

	// Check if b follows a
	if ( cur ) {
		while ( (cur = cur.nextSibling) ) {
			if ( cur === b ) {
				return -1;
			}
		}
	}

	return a ? 1 : -1;
}

/**
 * Returns a function to use in pseudos for input types
 * @param {String} type
 */
function createInputPseudo( type ) {
	return function( elem ) {
		var name = elem.nodeName.toLowerCase();
		return name === "input" && elem.type === type;
	};
}

/**
 * Returns a function to use in pseudos for buttons
 * @param {String} type
 */
function createButtonPseudo( type ) {
	return function( elem ) {
		var name = elem.nodeName.toLowerCase();
		return (name === "input" || name === "button") && elem.type === type;
	};
}

/**
 * Returns a function to use in pseudos for positionals
 * @param {Function} fn
 */
function createPositionalPseudo( fn ) {
	return markFunction(function( argument ) {
		argument = +argument;
		return markFunction(function( seed, matches ) {
			var j,
				matchIndexes = fn( [], seed.length, argument ),
				i = matchIndexes.length;

			// Match elements found at the specified indexes
			while ( i-- ) {
				if ( seed[ (j = matchIndexes[i]) ] ) {
					seed[j] = !(matches[j] = seed[j]);
				}
			}
		});
	});
}

/**
 * Checks a node for validity as a Sizzle context
 * @param {Element|Object=} context
 * @returns {Element|Object|Boolean} The input node if acceptable, otherwise a falsy value
 */
function testContext( context ) {
	return context && typeof context.getElementsByTagName !== "undefined" && context;
}

// Expose support vars for convenience
support = Sizzle.support = {};

/**
 * Detects XML nodes
 * @param {Element|Object} elem An element or a document
 * @returns {Boolean} True iff elem is a non-HTML XML node
 */
isXML = Sizzle.isXML = function( elem ) {
	// documentElement is verified for cases where it doesn't yet exist
	// (such as loading iframes in IE - #4833)
	var documentElement = elem && (elem.ownerDocument || elem).documentElement;
	return documentElement ? documentElement.nodeName !== "HTML" : false;
};

/**
 * Sets document-related variables once based on the current document
 * @param {Element|Object} [doc] An element or document object to use to set the document
 * @returns {Object} Returns the current document
 */
setDocument = Sizzle.setDocument = function( node ) {
	var hasCompare, parent,
		doc = node ? node.ownerDocument || node : preferredDoc;

	// Return early if doc is invalid or already selected
	if ( doc === document || doc.nodeType !== 9 || !doc.documentElement ) {
		return document;
	}

	// Update global variables
	document = doc;
	docElem = document.documentElement;
	documentIsHTML = !isXML( document );

	// Support: IE 9-11, Edge
	// Accessing iframe documents after unload throws "permission denied" errors (jQuery #13936)
	if ( (parent = document.defaultView) && parent.top !== parent ) {
		// Support: IE 11
		if ( parent.addEventListener ) {
			parent.addEventListener( "unload", unloadHandler, false );

		// Support: IE 9 - 10 only
		} else if ( parent.attachEvent ) {
			parent.attachEvent( "onunload", unloadHandler );
		}
	}

	/* Attributes
	---------------------------------------------------------------------- */

	// Support: IE<8
	// Verify that getAttribute really returns attributes and not properties
	// (excepting IE8 booleans)
	support.attributes = assert(function( div ) {
		div.className = "i";
		return !div.getAttribute("className");
	});

	/* getElement(s)By*
	---------------------------------------------------------------------- */

	// Check if getElementsByTagName("*") returns only elements
	support.getElementsByTagName = assert(function( div ) {
		div.appendChild( document.createComment("") );
		return !div.getElementsByTagName("*").length;
	});

	// Support: IE<9
	support.getElementsByClassName = rnative.test( document.getElementsByClassName );

	// Support: IE<10
	// Check if getElementById returns elements by name
	// The broken getElementById methods don't pick up programatically-set names,
	// so use a roundabout getElementsByName test
	support.getById = assert(function( div ) {
		docElem.appendChild( div ).id = expando;
		return !document.getElementsByName || !document.getElementsByName( expando ).length;
	});

	// ID find and filter
	if ( support.getById ) {
		Expr.find["ID"] = function( id, context ) {
			if ( typeof context.getElementById !== "undefined" && documentIsHTML ) {
				var m = context.getElementById( id );
				return m ? [ m ] : [];
			}
		};
		Expr.filter["ID"] = function( id ) {
			var attrId = id.replace( runescape, funescape );
			return function( elem ) {
				return elem.getAttribute("id") === attrId;
			};
		};
	} else {
		// Support: IE6/7
		// getElementById is not reliable as a find shortcut
		delete Expr.find["ID"];

		Expr.filter["ID"] =  function( id ) {
			var attrId = id.replace( runescape, funescape );
			return function( elem ) {
				var node = typeof elem.getAttributeNode !== "undefined" &&
					elem.getAttributeNode("id");
				return node && node.value === attrId;
			};
		};
	}

	// Tag
	Expr.find["TAG"] = support.getElementsByTagName ?
		function( tag, context ) {
			if ( typeof context.getElementsByTagName !== "undefined" ) {
				return context.getElementsByTagName( tag );

			// DocumentFragment nodes don't have gEBTN
			} else if ( support.qsa ) {
				return context.querySelectorAll( tag );
			}
		} :

		function( tag, context ) {
			var elem,
				tmp = [],
				i = 0,
				// By happy coincidence, a (broken) gEBTN appears on DocumentFragment nodes too
				results = context.getElementsByTagName( tag );

			// Filter out possible comments
			if ( tag === "*" ) {
				while ( (elem = results[i++]) ) {
					if ( elem.nodeType === 1 ) {
						tmp.push( elem );
					}
				}

				return tmp;
			}
			return results;
		};

	// Class
	Expr.find["CLASS"] = support.getElementsByClassName && function( className, context ) {
		if ( typeof context.getElementsByClassName !== "undefined" && documentIsHTML ) {
			return context.getElementsByClassName( className );
		}
	};

	/* QSA/matchesSelector
	---------------------------------------------------------------------- */

	// QSA and matchesSelector support

	// matchesSelector(:active) reports false when true (IE9/Opera 11.5)
	rbuggyMatches = [];

	// qSa(:focus) reports false when true (Chrome 21)
	// We allow this because of a bug in IE8/9 that throws an error
	// whenever `document.activeElement` is accessed on an iframe
	// So, we allow :focus to pass through QSA all the time to avoid the IE error
	// See http://bugs.jquery.com/ticket/13378
	rbuggyQSA = [];

	if ( (support.qsa = rnative.test( document.querySelectorAll )) ) {
		// Build QSA regex
		// Regex strategy adopted from Diego Perini
		assert(function( div ) {
			// Select is set to empty string on purpose
			// This is to test IE's treatment of not explicitly
			// setting a boolean content attribute,
			// since its presence should be enough
			// http://bugs.jquery.com/ticket/12359
			docElem.appendChild( div ).innerHTML = "<a id='" + expando + "'></a>" +
				"<select id='" + expando + "-\r\\' msallowcapture=''>" +
				"<option selected=''></option></select>";

			// Support: IE8, Opera 11-12.16
			// Nothing should be selected when empty strings follow ^= or $= or *=
			// The test attribute must be unknown in Opera but "safe" for WinRT
			// http://msdn.microsoft.com/en-us/library/ie/hh465388.aspx#attribute_section
			if ( div.querySelectorAll("[msallowcapture^='']").length ) {
				rbuggyQSA.push( "[*^$]=" + whitespace + "*(?:''|\"\")" );
			}

			// Support: IE8
			// Boolean attributes and "value" are not treated correctly
			if ( !div.querySelectorAll("[selected]").length ) {
				rbuggyQSA.push( "\\[" + whitespace + "*(?:value|" + booleans + ")" );
			}

			// Support: Chrome<29, Android<4.4, Safari<7.0+, iOS<7.0+, PhantomJS<1.9.8+
			if ( !div.querySelectorAll( "[id~=" + expando + "-]" ).length ) {
				rbuggyQSA.push("~=");
			}

			// Webkit/Opera - :checked should return selected option elements
			// http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked
			// IE8 throws error here and will not see later tests
			if ( !div.querySelectorAll(":checked").length ) {
				rbuggyQSA.push(":checked");
			}

			// Support: Safari 8+, iOS 8+
			// https://bugs.webkit.org/show_bug.cgi?id=136851
			// In-page `selector#id sibing-combinator selector` fails
			if ( !div.querySelectorAll( "a#" + expando + "+*" ).length ) {
				rbuggyQSA.push(".#.+[+~]");
			}
		});

		assert(function( div ) {
			// Support: Windows 8 Native Apps
			// The type and name attributes are restricted during .innerHTML assignment
			var input = document.createElement("input");
			input.setAttribute( "type", "hidden" );
			div.appendChild( input ).setAttribute( "name", "D" );

			// Support: IE8
			// Enforce case-sensitivity of name attribute
			if ( div.querySelectorAll("[name=d]").length ) {
				rbuggyQSA.push( "name" + whitespace + "*[*^$|!~]?=" );
			}

			// FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled)
			// IE8 throws error here and will not see later tests
			if ( !div.querySelectorAll(":enabled").length ) {
				rbuggyQSA.push( ":enabled", ":disabled" );
			}

			// Opera 10-11 does not throw on post-comma invalid pseudos
			div.querySelectorAll("*,:x");
			rbuggyQSA.push(",.*:");
		});
	}

	if ( (support.matchesSelector = rnative.test( (matches = docElem.matches ||
		docElem.webkitMatchesSelector ||
		docElem.mozMatchesSelector ||
		docElem.oMatchesSelector ||
		docElem.msMatchesSelector) )) ) {

		assert(function( div ) {
			// Check to see if it's possible to do matchesSelector
			// on a disconnected node (IE 9)
			support.disconnectedMatch = matches.call( div, "div" );

			// This should fail with an exception
			// Gecko does not error, returns false instead
			matches.call( div, "[s!='']:x" );
			rbuggyMatches.push( "!=", pseudos );
		});
	}

	rbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join("|") );
	rbuggyMatches = rbuggyMatches.length && new RegExp( rbuggyMatches.join("|") );

	/* Contains
	---------------------------------------------------------------------- */
	hasCompare = rnative.test( docElem.compareDocumentPosition );

	// Element contains another
	// Purposefully self-exclusive
	// As in, an element does not contain itself
	contains = hasCompare || rnative.test( docElem.contains ) ?
		function( a, b ) {
			var adown = a.nodeType === 9 ? a.documentElement : a,
				bup = b && b.parentNode;
			return a === bup || !!( bup && bup.nodeType === 1 && (
				adown.contains ?
					adown.contains( bup ) :
					a.compareDocumentPosition && a.compareDocumentPosition( bup ) & 16
			));
		} :
		function( a, b ) {
			if ( b ) {
				while ( (b = b.parentNode) ) {
					if ( b === a ) {
						return true;
					}
				}
			}
			return false;
		};

	/* Sorting
	---------------------------------------------------------------------- */

	// Document order sorting
	sortOrder = hasCompare ?
	function( a, b ) {

		// Flag for duplicate removal
		if ( a === b ) {
			hasDuplicate = true;
			return 0;
		}

		// Sort on method existence if only one input has compareDocumentPosition
		var compare = !a.compareDocumentPosition - !b.compareDocumentPosition;
		if ( compare ) {
			return compare;
		}

		// Calculate position if both inputs belong to the same document
		compare = ( a.ownerDocument || a ) === ( b.ownerDocument || b ) ?
			a.compareDocumentPosition( b ) :

			// Otherwise we know they are disconnected
			1;

		// Disconnected nodes
		if ( compare & 1 ||
			(!support.sortDetached && b.compareDocumentPosition( a ) === compare) ) {

			// Choose the first element that is related to our preferred document
			if ( a === document || a.ownerDocument === preferredDoc && contains(preferredDoc, a) ) {
				return -1;
			}
			if ( b === document || b.ownerDocument === preferredDoc && contains(preferredDoc, b) ) {
				return 1;
			}

			// Maintain original order
			return sortInput ?
				( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) :
				0;
		}

		return compare & 4 ? -1 : 1;
	} :
	function( a, b ) {
		// Exit early if the nodes are identical
		if ( a === b ) {
			hasDuplicate = true;
			return 0;
		}

		var cur,
			i = 0,
			aup = a.parentNode,
			bup = b.parentNode,
			ap = [ a ],
			bp = [ b ];

		// Parentless nodes are either documents or disconnected
		if ( !aup || !bup ) {
			return a === document ? -1 :
				b === document ? 1 :
				aup ? -1 :
				bup ? 1 :
				sortInput ?
				( indexOf( sortInput, a ) - indexOf( sortInput, b ) ) :
				0;

		// If the nodes are siblings, we can do a quick check
		} else if ( aup === bup ) {
			return siblingCheck( a, b );
		}

		// Otherwise we need full lists of their ancestors for comparison
		cur = a;
		while ( (cur = cur.parentNode) ) {
			ap.unshift( cur );
		}
		cur = b;
		while ( (cur = cur.parentNode) ) {
			bp.unshift( cur );
		}

		// Walk down the tree looking for a discrepancy
		while ( ap[i] === bp[i] ) {
			i++;
		}

		return i ?
			// Do a sibling check if the nodes have a common ancestor
			siblingCheck( ap[i], bp[i] ) :

			// Otherwise nodes in our document sort first
			ap[i] === preferredDoc ? -1 :
			bp[i] === preferredDoc ? 1 :
			0;
	};

	return document;
};

Sizzle.matches = function( expr, elements ) {
	return Sizzle( expr, null, null, elements );
};

Sizzle.matchesSelector = function( elem, expr ) {
	// Set document vars if needed
	if ( ( elem.ownerDocument || elem ) !== document ) {
		setDocument( elem );
	}

	// Make sure that attribute selectors are quoted
	expr = expr.replace( rattributeQuotes, "='$1']" );

	if ( support.matchesSelector && documentIsHTML &&
		!compilerCache[ expr + " " ] &&
		( !rbuggyMatches || !rbuggyMatches.test( expr ) ) &&
		( !rbuggyQSA     || !rbuggyQSA.test( expr ) ) ) {

		try {
			var ret = matches.call( elem, expr );

			// IE 9's matchesSelector returns false on disconnected nodes
			if ( ret || support.disconnectedMatch ||
					// As well, disconnected nodes are said to be in a document
					// fragment in IE 9
					elem.document && elem.document.nodeType !== 11 ) {
				return ret;
			}
		} catch (e) {}
	}

	return Sizzle( expr, document, null, [ elem ] ).length > 0;
};

Sizzle.contains = function( context, elem ) {
	// Set document vars if needed
	if ( ( context.ownerDocument || context ) !== document ) {
		setDocument( context );
	}
	return contains( context, elem );
};

Sizzle.attr = function( elem, name ) {
	// Set document vars if needed
	if ( ( elem.ownerDocument || elem ) !== document ) {
		setDocument( elem );
	}

	var fn = Expr.attrHandle[ name.toLowerCase() ],
		// Don't get fooled by Object.prototype properties (jQuery #13807)
		val = fn && hasOwn.call( Expr.attrHandle, name.toLowerCase() ) ?
			fn( elem, name, !documentIsHTML ) :
			undefined;

	return val !== undefined ?
		val :
		support.attributes || !documentIsHTML ?
			elem.getAttribute( name ) :
			(val = elem.getAttributeNode(name)) && val.specified ?
				val.value :
				null;
};

Sizzle.error = function( msg ) {
	throw new Error( "Syntax error, unrecognized expression: " + msg );
};

/**
 * Document sorting and removing duplicates
 * @param {ArrayLike} results
 */
Sizzle.uniqueSort = function( results ) {
	var elem,
		duplicates = [],
		j = 0,
		i = 0;

	// Unless we *know* we can detect duplicates, assume their presence
	hasDuplicate = !support.detectDuplicates;
	sortInput = !support.sortStable && results.slice( 0 );
	results.sort( sortOrder );

	if ( hasDuplicate ) {
		while ( (elem = results[i++]) ) {
			if ( elem === results[ i ] ) {
				j = duplicates.push( i );
			}
		}
		while ( j-- ) {
			results.splice( duplicates[ j ], 1 );
		}
	}

	// Clear input after sorting to release objects
	// See https://github.com/jquery/sizzle/pull/225
	sortInput = null;

	return results;
};

/**
 * Utility function for retrieving the text value of an array of DOM nodes
 * @param {Array|Element} elem
 */
getText = Sizzle.getText = function( elem ) {
	var node,
		ret = "",
		i = 0,
		nodeType = elem.nodeType;

	if ( !nodeType ) {
		// If no nodeType, this is expected to be an array
		while ( (node = elem[i++]) ) {
			// Do not traverse comment nodes
			ret += getText( node );
		}
	} else if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) {
		// Use textContent for elements
		// innerText usage removed for consistency of new lines (jQuery #11153)
		if ( typeof elem.textContent === "string" ) {
			return elem.textContent;
		} else {
			// Traverse its children
			for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {
				ret += getText( elem );
			}
		}
	} else if ( nodeType === 3 || nodeType === 4 ) {
		return elem.nodeValue;
	}
	// Do not include comment or processing instruction nodes

	return ret;
};

Expr = Sizzle.selectors = {

	// Can be adjusted by the user
	cacheLength: 50,

	createPseudo: markFunction,

	match: matchExpr,

	attrHandle: {},

	find: {},

	relative: {
		">": { dir: "parentNode", first: true },
		" ": { dir: "parentNode" },
		"+": { dir: "previousSibling", first: true },
		"~": { dir: "previousSibling" }
	},

	preFilter: {
		"ATTR": function( match ) {
			match[1] = match[1].replace( runescape, funescape );

			// Move the given value to match[3] whether quoted or unquoted
			match[3] = ( match[3] || match[4] || match[5] || "" ).replace( runescape, funescape );

			if ( match[2] === "~=" ) {
				match[3] = " " + match[3] + " ";
			}

			return match.slice( 0, 4 );
		},

		"CHILD": function( match ) {
			/* matches from matchExpr["CHILD"]
				1 type (only|nth|...)
				2 what (child|of-type)
				3 argument (even|odd|\d*|\d*n([+-]\d+)?|...)
				4 xn-component of xn+y argument ([+-]?\d*n|)
				5 sign of xn-component
				6 x of xn-component
				7 sign of y-component
				8 y of y-component
			*/
			match[1] = match[1].toLowerCase();

			if ( match[1].slice( 0, 3 ) === "nth" ) {
				// nth-* requires argument
				if ( !match[3] ) {
					Sizzle.error( match[0] );
				}

				// numeric x and y parameters for Expr.filter.CHILD
				// remember that false/true cast respectively to 0/1
				match[4] = +( match[4] ? match[5] + (match[6] || 1) : 2 * ( match[3] === "even" || match[3] === "odd" ) );
				match[5] = +( ( match[7] + match[8] ) || match[3] === "odd" );

			// other types prohibit arguments
			} else if ( match[3] ) {
				Sizzle.error( match[0] );
			}

			return match;
		},

		"PSEUDO": function( match ) {
			var excess,
				unquoted = !match[6] && match[2];

			if ( matchExpr["CHILD"].test( match[0] ) ) {
				return null;
			}

			// Accept quoted arguments as-is
			if ( match[3] ) {
				match[2] = match[4] || match[5] || "";

			// Strip excess characters from unquoted arguments
			} else if ( unquoted && rpseudo.test( unquoted ) &&
				// Get excess from tokenize (recursively)
				(excess = tokenize( unquoted, true )) &&
				// advance to the next closing parenthesis
				(excess = unquoted.indexOf( ")", unquoted.length - excess ) - unquoted.length) ) {

				// excess is a negative index
				match[0] = match[0].slice( 0, excess );
				match[2] = unquoted.slice( 0, excess );
			}

			// Return only captures needed by the pseudo filter method (type and argument)
			return match.slice( 0, 3 );
		}
	},

	filter: {

		"TAG": function( nodeNameSelector ) {
			var nodeName = nodeNameSelector.replace( runescape, funescape ).toLowerCase();
			return nodeNameSelector === "*" ?
				function() { return true; } :
				function( elem ) {
					return elem.nodeName && elem.nodeName.toLowerCase() === nodeName;
				};
		},

		"CLASS": function( className ) {
			var pattern = classCache[ className + " " ];

			return pattern ||
				(pattern = new RegExp( "(^|" + whitespace + ")" + className + "(" + whitespace + "|$)" )) &&
				classCache( className, function( elem ) {
					return pattern.test( typeof elem.className === "string" && elem.className || typeof elem.getAttribute !== "undefined" && elem.getAttribute("class") || "" );
				});
		},

		"ATTR": function( name, operator, check ) {
			return function( elem ) {
				var result = Sizzle.attr( elem, name );

				if ( result == null ) {
					return operator === "!=";
				}
				if ( !operator ) {
					return true;
				}

				result += "";

				return operator === "=" ? result === check :
					operator === "!=" ? result !== check :
					operator === "^=" ? check && result.indexOf( check ) === 0 :
					operator === "*=" ? check && result.indexOf( check ) > -1 :
					operator === "$=" ? check && result.slice( -check.length ) === check :
					operator === "~=" ? ( " " + result.replace( rwhitespace, " " ) + " " ).indexOf( check ) > -1 :
					operator === "|=" ? result === check || result.slice( 0, check.length + 1 ) === check + "-" :
					false;
			};
		},

		"CHILD": function( type, what, argument, first, last ) {
			var simple = type.slice( 0, 3 ) !== "nth",
				forward = type.slice( -4 ) !== "last",
				ofType = what === "of-type";

			return first === 1 && last === 0 ?

				// Shortcut for :nth-*(n)
				function( elem ) {
					return !!elem.parentNode;
				} :

				function( elem, context, xml ) {
					var cache, uniqueCache, outerCache, node, nodeIndex, start,
						dir = simple !== forward ? "nextSibling" : "previousSibling",
						parent = elem.parentNode,
						name = ofType && elem.nodeName.toLowerCase(),
						useCache = !xml && !ofType,
						diff = false;

					if ( parent ) {

						// :(first|last|only)-(child|of-type)
						if ( simple ) {
							while ( dir ) {
								node = elem;
								while ( (node = node[ dir ]) ) {
									if ( ofType ?
										node.nodeName.toLowerCase() === name :
										node.nodeType === 1 ) {

										return false;
									}
								}
								// Reverse direction for :only-* (if we haven't yet done so)
								start = dir = type === "only" && !start && "nextSibling";
							}
							return true;
						}

						start = [ forward ? parent.firstChild : parent.lastChild ];

						// non-xml :nth-child(...) stores cache data on `parent`
						if ( forward && useCache ) {

							// Seek `elem` from a previously-cached index

							// ...in a gzip-friendly way
							node = parent;
							outerCache = node[ expando ] || (node[ expando ] = {});

							// Support: IE <9 only
							// Defend against cloned attroperties (jQuery gh-1709)
							uniqueCache = outerCache[ node.uniqueID ] ||
								(outerCache[ node.uniqueID ] = {});

							cache = uniqueCache[ type ] || [];
							nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ];
							diff = nodeIndex && cache[ 2 ];
							node = nodeIndex && parent.childNodes[ nodeIndex ];

							while ( (node = ++nodeIndex && node && node[ dir ] ||

								// Fallback to seeking `elem` from the start
								(diff = nodeIndex = 0) || start.pop()) ) {

								// When found, cache indexes on `parent` and break
								if ( node.nodeType === 1 && ++diff && node === elem ) {
									uniqueCache[ type ] = [ dirruns, nodeIndex, diff ];
									break;
								}
							}

						} else {
							// Use previously-cached element index if available
							if ( useCache ) {
								// ...in a gzip-friendly way
								node = elem;
								outerCache = node[ expando ] || (node[ expando ] = {});

								// Support: IE <9 only
								// Defend against cloned attroperties (jQuery gh-1709)
								uniqueCache = outerCache[ node.uniqueID ] ||
									(outerCache[ node.uniqueID ] = {});

								cache = uniqueCache[ type ] || [];
								nodeIndex = cache[ 0 ] === dirruns && cache[ 1 ];
								diff = nodeIndex;
							}

							// xml :nth-child(...)
							// or :nth-last-child(...) or :nth(-last)?-of-type(...)
							if ( diff === false ) {
								// Use the same loop as above to seek `elem` from the start
								while ( (node = ++nodeIndex && node && node[ dir ] ||
									(diff = nodeIndex = 0) || start.pop()) ) {

									if ( ( ofType ?
										node.nodeName.toLowerCase() === name :
										node.nodeType === 1 ) &&
										++diff ) {

										// Cache the index of each encountered element
										if ( useCache ) {
											outerCache = node[ expando ] || (node[ expando ] = {});

											// Support: IE <9 only
											// Defend against cloned attroperties (jQuery gh-1709)
											uniqueCache = outerCache[ node.uniqueID ] ||
												(outerCache[ node.uniqueID ] = {});

											uniqueCache[ type ] = [ dirruns, diff ];
										}

										if ( node === elem ) {
											break;
										}
									}
								}
							}
						}

						// Incorporate the offset, then check against cycle size
						diff -= last;
						return diff === first || ( diff % first === 0 && diff / first >= 0 );
					}
				};
		},

		"PSEUDO": function( pseudo, argument ) {
			// pseudo-class names are case-insensitive
			// http://www.w3.org/TR/selectors/#pseudo-classes
			// Prioritize by case sensitivity in case custom pseudos are added with uppercase letters
			// Remember that setFilters inherits from pseudos
			var args,
				fn = Expr.pseudos[ pseudo ] || Expr.setFilters[ pseudo.toLowerCase() ] ||
					Sizzle.error( "unsupported pseudo: " + pseudo );

			// The user may use createPseudo to indicate that
			// arguments are needed to create the filter function
			// just as Sizzle does
			if ( fn[ expando ] ) {
				return fn( argument );
			}

			// But maintain support for old signatures
			if ( fn.length > 1 ) {
				args = [ pseudo, pseudo, "", argument ];
				return Expr.setFilters.hasOwnProperty( pseudo.toLowerCase() ) ?
					markFunction(function( seed, matches ) {
						var idx,
							matched = fn( seed, argument ),
							i = matched.length;
						while ( i-- ) {
							idx = indexOf( seed, matched[i] );
							seed[ idx ] = !( matches[ idx ] = matched[i] );
						}
					}) :
					function( elem ) {
						return fn( elem, 0, args );
					};
			}

			return fn;
		}
	},

	pseudos: {
		// Potentially complex pseudos
		"not": markFunction(function( selector ) {
			// Trim the selector passed to compile
			// to avoid treating leading and trailing
			// spaces as combinators
			var input = [],
				results = [],
				matcher = compile( selector.replace( rtrim, "$1" ) );

			return matcher[ expando ] ?
				markFunction(function( seed, matches, context, xml ) {
					var elem,
						unmatched = matcher( seed, null, xml, [] ),
						i = seed.length;

					// Match elements unmatched by `matcher`
					while ( i-- ) {
						if ( (elem = unmatched[i]) ) {
							seed[i] = !(matches[i] = elem);
						}
					}
				}) :
				function( elem, context, xml ) {
					input[0] = elem;
					matcher( input, null, xml, results );
					// Don't keep the element (issue #299)
					input[0] = null;
					return !results.pop();
				};
		}),

		"has": markFunction(function( selector ) {
			return function( elem ) {
				return Sizzle( selector, elem ).length > 0;
			};
		}),

		"contains": markFunction(function( text ) {
			text = text.replace( runescape, funescape );
			return function( elem ) {
				return ( elem.textContent || elem.innerText || getText( elem ) ).indexOf( text ) > -1;
			};
		}),

		// "Whether an element is represented by a :lang() selector
		// is based solely on the element's language value
		// being equal to the identifier C,
		// or beginning with the identifier C immediately followed by "-".
		// The matching of C against the element's language value is performed case-insensitively.
		// The identifier C does not have to be a valid language name."
		// http://www.w3.org/TR/selectors/#lang-pseudo
		"lang": markFunction( function( lang ) {
			// lang value must be a valid identifier
			if ( !ridentifier.test(lang || "") ) {
				Sizzle.error( "unsupported lang: " + lang );
			}
			lang = lang.replace( runescape, funescape ).toLowerCase();
			return function( elem ) {
				var elemLang;
				do {
					if ( (elemLang = documentIsHTML ?
						elem.lang :
						elem.getAttribute("xml:lang") || elem.getAttribute("lang")) ) {

						elemLang = elemLang.toLowerCase();
						return elemLang === lang || elemLang.indexOf( lang + "-" ) === 0;
					}
				} while ( (elem = elem.parentNode) && elem.nodeType === 1 );
				return false;
			};
		}),

		// Miscellaneous
		"target": function( elem ) {
			var hash = window.location && window.location.hash;
			return hash && hash.slice( 1 ) === elem.id;
		},

		"root": function( elem ) {
			return elem === docElem;
		},

		"focus": function( elem ) {
			return elem === document.activeElement && (!document.hasFocus || document.hasFocus()) && !!(elem.type || elem.href || ~elem.tabIndex);
		},

		// Boolean properties
		"enabled": function( elem ) {
			return elem.disabled === false;
		},

		"disabled": function( elem ) {
			return elem.disabled === true;
		},

		"checked": function( elem ) {
			// In CSS3, :checked should return both checked and selected elements
			// http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked
			var nodeName = elem.nodeName.toLowerCase();
			return (nodeName === "input" && !!elem.checked) || (nodeName === "option" && !!elem.selected);
		},

		"selected": function( elem ) {
			// Accessing this property makes selected-by-default
			// options in Safari work properly
			if ( elem.parentNode ) {
				elem.parentNode.selectedIndex;
			}

			return elem.selected === true;
		},

		// Contents
		"empty": function( elem ) {
			// http://www.w3.org/TR/selectors/#empty-pseudo
			// :empty is negated by element (1) or content nodes (text: 3; cdata: 4; entity ref: 5),
			//   but not by others (comment: 8; processing instruction: 7; etc.)
			// nodeType < 6 works because attributes (2) do not appear as children
			for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {
				if ( elem.nodeType < 6 ) {
					return false;
				}
			}
			return true;
		},

		"parent": function( elem ) {
			return !Expr.pseudos["empty"]( elem );
		},

		// Element/input types
		"header": function( elem ) {
			return rheader.test( elem.nodeName );
		},

		"input": function( elem ) {
			return rinputs.test( elem.nodeName );
		},

		"button": function( elem ) {
			var name = elem.nodeName.toLowerCase();
			return name === "input" && elem.type === "button" || name === "button";
		},

		"text": function( elem ) {
			var attr;
			return elem.nodeName.toLowerCase() === "input" &&
				elem.type === "text" &&

				// Support: IE<8
				// New HTML5 attribute values (e.g., "search") appear with elem.type === "text"
				( (attr = elem.getAttribute("type")) == null || attr.toLowerCase() === "text" );
		},

		// Position-in-collection
		"first": createPositionalPseudo(function() {
			return [ 0 ];
		}),

		"last": createPositionalPseudo(function( matchIndexes, length ) {
			return [ length - 1 ];
		}),

		"eq": createPositionalPseudo(function( matchIndexes, length, argument ) {
			return [ argument < 0 ? argument + length : argument ];
		}),

		"even": createPositionalPseudo(function( matchIndexes, length ) {
			var i = 0;
			for ( ; i < length; i += 2 ) {
				matchIndexes.push( i );
			}
			return matchIndexes;
		}),

		"odd": createPositionalPseudo(function( matchIndexes, length ) {
			var i = 1;
			for ( ; i < length; i += 2 ) {
				matchIndexes.push( i );
			}
			return matchIndexes;
		}),

		"lt": createPositionalPseudo(function( matchIndexes, length, argument ) {
			var i = argument < 0 ? argument + length : argument;
			for ( ; --i >= 0; ) {
				matchIndexes.push( i );
			}
			return matchIndexes;
		}),

		"gt": createPositionalPseudo(function( matchIndexes, length, argument ) {
			var i = argument < 0 ? argument + length : argument;
			for ( ; ++i < length; ) {
				matchIndexes.push( i );
			}
			return matchIndexes;
		})
	}
};

Expr.pseudos["nth"] = Expr.pseudos["eq"];

// Add button/input type pseudos
for ( i in { radio: true, checkbox: true, file: true, password: true, image: true } ) {
	Expr.pseudos[ i ] = createInputPseudo( i );
}
for ( i in { submit: true, reset: true } ) {
	Expr.pseudos[ i ] = createButtonPseudo( i );
}

// Easy API for creating new setFilters
function setFilters() {}
setFilters.prototype = Expr.filters = Expr.pseudos;
Expr.setFilters = new setFilters();

tokenize = Sizzle.tokenize = function( selector, parseOnly ) {
	var matched, match, tokens, type,
		soFar, groups, preFilters,
		cached = tokenCache[ selector + " " ];

	if ( cached ) {
		return parseOnly ? 0 : cached.slice( 0 );
	}

	soFar = selector;
	groups = [];
	preFilters = Expr.preFilter;

	while ( soFar ) {

		// Comma and first run
		if ( !matched || (match = rcomma.exec( soFar )) ) {
			if ( match ) {
				// Don't consume trailing commas as valid
				soFar = soFar.slice( match[0].length ) || soFar;
			}
			groups.push( (tokens = []) );
		}

		matched = false;

		// Combinators
		if ( (match = rcombinators.exec( soFar )) ) {
			matched = match.shift();
			tokens.push({
				value: matched,
				// Cast descendant combinators to space
				type: match[0].replace( rtrim, " " )
			});
			soFar = soFar.slice( matched.length );
		}

		// Filters
		for ( type in Expr.filter ) {
			if ( (match = matchExpr[ type ].exec( soFar )) && (!preFilters[ type ] ||
				(match = preFilters[ type ]( match ))) ) {
				matched = match.shift();
				tokens.push({
					value: matched,
					type: type,
					matches: match
				});
				soFar = soFar.slice( matched.length );
			}
		}

		if ( !matched ) {
			break;
		}
	}

	// Return the length of the invalid excess
	// if we're just parsing
	// Otherwise, throw an error or return tokens
	return parseOnly ?
		soFar.length :
		soFar ?
			Sizzle.error( selector ) :
			// Cache the tokens
			tokenCache( selector, groups ).slice( 0 );
};

function toSelector( tokens ) {
	var i = 0,
		len = tokens.length,
		selector = "";
	for ( ; i < len; i++ ) {
		selector += tokens[i].value;
	}
	return selector;
}

function addCombinator( matcher, combinator, base ) {
	var dir = combinator.dir,
		checkNonElements = base && dir === "parentNode",
		doneName = done++;

	return combinator.first ?
		// Check against closest ancestor/preceding element
		function( elem, context, xml ) {
			while ( (elem = elem[ dir ]) ) {
				if ( elem.nodeType === 1 || checkNonElements ) {
					return matcher( elem, context, xml );
				}
			}
		} :

		// Check against all ancestor/preceding elements
		function( elem, context, xml ) {
			var oldCache, uniqueCache, outerCache,
				newCache = [ dirruns, doneName ];

			// We can't set arbitrary data on XML nodes, so they don't benefit from combinator caching
			if ( xml ) {
				while ( (elem = elem[ dir ]) ) {
					if ( elem.nodeType === 1 || checkNonElements ) {
						if ( matcher( elem, context, xml ) ) {
							return true;
						}
					}
				}
			} else {
				while ( (elem = elem[ dir ]) ) {
					if ( elem.nodeType === 1 || checkNonElements ) {
						outerCache = elem[ expando ] || (elem[ expando ] = {});

						// Support: IE <9 only
						// Defend against cloned attroperties (jQuery gh-1709)
						uniqueCache = outerCache[ elem.uniqueID ] || (outerCache[ elem.uniqueID ] = {});

						if ( (oldCache = uniqueCache[ dir ]) &&
							oldCache[ 0 ] === dirruns && oldCache[ 1 ] === doneName ) {

							// Assign to newCache so results back-propagate to previous elements
							return (newCache[ 2 ] = oldCache[ 2 ]);
						} else {
							// Reuse newcache so results back-propagate to previous elements
							uniqueCache[ dir ] = newCache;

							// A match means we're done; a fail means we have to keep checking
							if ( (newCache[ 2 ] = matcher( elem, context, xml )) ) {
								return true;
							}
						}
					}
				}
			}
		};
}

function elementMatcher( matchers ) {
	return matchers.length > 1 ?
		function( elem, context, xml ) {
			var i = matchers.length;
			while ( i-- ) {
				if ( !matchers[i]( elem, context, xml ) ) {
					return false;
				}
			}
			return true;
		} :
		matchers[0];
}

function multipleContexts( selector, contexts, results ) {
	var i = 0,
		len = contexts.length;
	for ( ; i < len; i++ ) {
		Sizzle( selector, contexts[i], results );
	}
	return results;
}

function condense( unmatched, map, filter, context, xml ) {
	var elem,
		newUnmatched = [],
		i = 0,
		len = unmatched.length,
		mapped = map != null;

	for ( ; i < len; i++ ) {
		if ( (elem = unmatched[i]) ) {
			if ( !filter || filter( elem, context, xml ) ) {
				newUnmatched.push( elem );
				if ( mapped ) {
					map.push( i );
				}
			}
		}
	}

	return newUnmatched;
}

function setMatcher( preFilter, selector, matcher, postFilter, postFinder, postSelector ) {
	if ( postFilter && !postFilter[ expando ] ) {
		postFilter = setMatcher( postFilter );
	}
	if ( postFinder && !postFinder[ expando ] ) {
		postFinder = setMatcher( postFinder, postSelector );
	}
	return markFunction(function( seed, results, context, xml ) {
		var temp, i, elem,
			preMap = [],
			postMap = [],
			preexisting = results.length,

			// Get initial elements from seed or context
			elems = seed || multipleContexts( selector || "*", context.nodeType ? [ context ] : context, [] ),

			// Prefilter to get matcher input, preserving a map for seed-results synchronization
			matcherIn = preFilter && ( seed || !selector ) ?
				condense( elems, preMap, preFilter, context, xml ) :
				elems,

			matcherOut = matcher ?
				// If we have a postFinder, or filtered seed, or non-seed postFilter or preexisting results,
				postFinder || ( seed ? preFilter : preexisting || postFilter ) ?

					// ...intermediate processing is necessary
					[] :

					// ...otherwise use results directly
					results :
				matcherIn;

		// Find primary matches
		if ( matcher ) {
			matcher( matcherIn, matcherOut, context, xml );
		}

		// Apply postFilter
		if ( postFilter ) {
			temp = condense( matcherOut, postMap );
			postFilter( temp, [], context, xml );

			// Un-match failing elements by moving them back to matcherIn
			i = temp.length;
			while ( i-- ) {
				if ( (elem = temp[i]) ) {
					matcherOut[ postMap[i] ] = !(matcherIn[ postMap[i] ] = elem);
				}
			}
		}

		if ( seed ) {
			if ( postFinder || preFilter ) {
				if ( postFinder ) {
					// Get the final matcherOut by condensing this intermediate into postFinder contexts
					temp = [];
					i = matcherOut.length;
					while ( i-- ) {
						if ( (elem = matcherOut[i]) ) {
							// Restore matcherIn since elem is not yet a final match
							temp.push( (matcherIn[i] = elem) );
						}
					}
					postFinder( null, (matcherOut = []), temp, xml );
				}

				// Move matched elements from seed to results to keep them synchronized
				i = matcherOut.length;
				while ( i-- ) {
					if ( (elem = matcherOut[i]) &&
						(temp = postFinder ? indexOf( seed, elem ) : preMap[i]) > -1 ) {

						seed[temp] = !(results[temp] = elem);
					}
				}
			}

		// Add elements to results, through postFinder if defined
		} else {
			matcherOut = condense(
				matcherOut === results ?
					matcherOut.splice( preexisting, matcherOut.length ) :
					matcherOut
			);
			if ( postFinder ) {
				postFinder( null, results, matcherOut, xml );
			} else {
				push.apply( results, matcherOut );
			}
		}
	});
}

function matcherFromTokens( tokens ) {
	var checkContext, matcher, j,
		len = tokens.length,
		leadingRelative = Expr.relative[ tokens[0].type ],
		implicitRelative = leadingRelative || Expr.relative[" "],
		i = leadingRelative ? 1 : 0,

		// The foundational matcher ensures that elements are reachable from top-level context(s)
		matchContext = addCombinator( function( elem ) {
			return elem === checkContext;
		}, implicitRelative, true ),
		matchAnyContext = addCombinator( function( elem ) {
			return indexOf( checkContext, elem ) > -1;
		}, implicitRelative, true ),
		matchers = [ function( elem, context, xml ) {
			var ret = ( !leadingRelative && ( xml || context !== outermostContext ) ) || (
				(checkContext = context).nodeType ?
					matchContext( elem, context, xml ) :
					matchAnyContext( elem, context, xml ) );
			// Avoid hanging onto element (issue #299)
			checkContext = null;
			return ret;
		} ];

	for ( ; i < len; i++ ) {
		if ( (matcher = Expr.relative[ tokens[i].type ]) ) {
			matchers = [ addCombinator(elementMatcher( matchers ), matcher) ];
		} else {
			matcher = Expr.filter[ tokens[i].type ].apply( null, tokens[i].matches );

			// Return special upon seeing a positional matcher
			if ( matcher[ expando ] ) {
				// Find the next relative operator (if any) for proper handling
				j = ++i;
				for ( ; j < len; j++ ) {
					if ( Expr.relative[ tokens[j].type ] ) {
						break;
					}
				}
				return setMatcher(
					i > 1 && elementMatcher( matchers ),
					i > 1 && toSelector(
						// If the preceding token was a descendant combinator, insert an implicit any-element `*`
						tokens.slice( 0, i - 1 ).concat({ value: tokens[ i - 2 ].type === " " ? "*" : "" })
					).replace( rtrim, "$1" ),
					matcher,
					i < j && matcherFromTokens( tokens.slice( i, j ) ),
					j < len && matcherFromTokens( (tokens = tokens.slice( j )) ),
					j < len && toSelector( tokens )
				);
			}
			matchers.push( matcher );
		}
	}

	return elementMatcher( matchers );
}

function matcherFromGroupMatchers( elementMatchers, setMatchers ) {
	var bySet = setMatchers.length > 0,
		byElement = elementMatchers.length > 0,
		superMatcher = function( seed, context, xml, results, outermost ) {
			var elem, j, matcher,
				matchedCount = 0,
				i = "0",
				unmatched = seed && [],
				setMatched = [],
				contextBackup = outermostContext,
				// We must always have either seed elements or outermost context
				elems = seed || byElement && Expr.find["TAG"]( "*", outermost ),
				// Use integer dirruns iff this is the outermost matcher
				dirrunsUnique = (dirruns += contextBackup == null ? 1 : Math.random() || 0.1),
				len = elems.length;

			if ( outermost ) {
				outermostContext = context === document || context || outermost;
			}

			// Add elements passing elementMatchers directly to results
			// Support: IE<9, Safari
			// Tolerate NodeList properties (IE: "length"; Safari: <number>) matching elements by id
			for ( ; i !== len && (elem = elems[i]) != null; i++ ) {
				if ( byElement && elem ) {
					j = 0;
					if ( !context && elem.ownerDocument !== document ) {
						setDocument( elem );
						xml = !documentIsHTML;
					}
					while ( (matcher = elementMatchers[j++]) ) {
						if ( matcher( elem, context || document, xml) ) {
							results.push( elem );
							break;
						}
					}
					if ( outermost ) {
						dirruns = dirrunsUnique;
					}
				}

				// Track unmatched elements for set filters
				if ( bySet ) {
					// They will have gone through all possible matchers
					if ( (elem = !matcher && elem) ) {
						matchedCount--;
					}

					// Lengthen the array for every element, matched or not
					if ( seed ) {
						unmatched.push( elem );
					}
				}
			}

			// `i` is now the count of elements visited above, and adding it to `matchedCount`
			// makes the latter nonnegative.
			matchedCount += i;

			// Apply set filters to unmatched elements
			// NOTE: This can be skipped if there are no unmatched elements (i.e., `matchedCount`
			// equals `i`), unless we didn't visit _any_ elements in the above loop because we have
			// no element matchers and no seed.
			// Incrementing an initially-string "0" `i` allows `i` to remain a string only in that
			// case, which will result in a "00" `matchedCount` that differs from `i` but is also
			// numerically zero.
			if ( bySet && i !== matchedCount ) {
				j = 0;
				while ( (matcher = setMatchers[j++]) ) {
					matcher( unmatched, setMatched, context, xml );
				}

				if ( seed ) {
					// Reintegrate element matches to eliminate the need for sorting
					if ( matchedCount > 0 ) {
						while ( i-- ) {
							if ( !(unmatched[i] || setMatched[i]) ) {
								setMatched[i] = pop.call( results );
							}
						}
					}

					// Discard index placeholder values to get only actual matches
					setMatched = condense( setMatched );
				}

				// Add matches to results
				push.apply( results, setMatched );

				// Seedless set matches succeeding multiple successful matchers stipulate sorting
				if ( outermost && !seed && setMatched.length > 0 &&
					( matchedCount + setMatchers.length ) > 1 ) {

					Sizzle.uniqueSort( results );
				}
			}

			// Override manipulation of globals by nested matchers
			if ( outermost ) {
				dirruns = dirrunsUnique;
				outermostContext = contextBackup;
			}

			return unmatched;
		};

	return bySet ?
		markFunction( superMatcher ) :
		superMatcher;
}

compile = Sizzle.compile = function( selector, match /* Internal Use Only */ ) {
	var i,
		setMatchers = [],
		elementMatchers = [],
		cached = compilerCache[ selector + " " ];

	if ( !cached ) {
		// Generate a function of recursive functions that can be used to check each element
		if ( !match ) {
			match = tokenize( selector );
		}
		i = match.length;
		while ( i-- ) {
			cached = matcherFromTokens( match[i] );
			if ( cached[ expando ] ) {
				setMatchers.push( cached );
			} else {
				elementMatchers.push( cached );
			}
		}

		// Cache the compiled function
		cached = compilerCache( selector, matcherFromGroupMatchers( elementMatchers, setMatchers ) );

		// Save selector and tokenization
		cached.selector = selector;
	}
	return cached;
};

/**
 * A low-level selection function that works with Sizzle's compiled
 *  selector functions
 * @param {String|Function} selector A selector or a pre-compiled
 *  selector function built with Sizzle.compile
 * @param {Element} context
 * @param {Array} [results]
 * @param {Array} [seed] A set of elements to match against
 */
select = Sizzle.select = function( selector, context, results, seed ) {
	var i, tokens, token, type, find,
		compiled = typeof selector === "function" && selector,
		match = !seed && tokenize( (selector = compiled.selector || selector) );

	results = results || [];

	// Try to minimize operations if there is only one selector in the list and no seed
	// (the latter of which guarantees us context)
	if ( match.length === 1 ) {

		// Reduce context if the leading compound selector is an ID
		tokens = match[0] = match[0].slice( 0 );
		if ( tokens.length > 2 && (token = tokens[0]).type === "ID" &&
				support.getById && context.nodeType === 9 && documentIsHTML &&
				Expr.relative[ tokens[1].type ] ) {

			context = ( Expr.find["ID"]( token.matches[0].replace(runescape, funescape), context ) || [] )[0];
			if ( !context ) {
				return results;

			// Precompiled matchers will still verify ancestry, so step up a level
			} else if ( compiled ) {
				context = context.parentNode;
			}

			selector = selector.slice( tokens.shift().value.length );
		}

		// Fetch a seed set for right-to-left matching
		i = matchExpr["needsContext"].test( selector ) ? 0 : tokens.length;
		while ( i-- ) {
			token = tokens[i];

			// Abort if we hit a combinator
			if ( Expr.relative[ (type = token.type) ] ) {
				break;
			}
			if ( (find = Expr.find[ type ]) ) {
				// Search, expanding context for leading sibling combinators
				if ( (seed = find(
					token.matches[0].replace( runescape, funescape ),
					rsibling.test( tokens[0].type ) && testContext( context.parentNode ) || context
				)) ) {

					// If seed is empty or no tokens remain, we can return early
					tokens.splice( i, 1 );
					selector = seed.length && toSelector( tokens );
					if ( !selector ) {
						push.apply( results, seed );
						return results;
					}

					break;
				}
			}
		}
	}

	// Compile and execute a filtering function if one is not provided
	// Provide `match` to avoid retokenization if we modified the selector above
	( compiled || compile( selector, match ) )(
		seed,
		context,
		!documentIsHTML,
		results,
		!context || rsibling.test( selector ) && testContext( context.parentNode ) || context
	);
	return results;
};

// One-time assignments

// Sort stability
support.sortStable = expando.split("").sort( sortOrder ).join("") === expando;

// Support: Chrome 14-35+
// Always assume duplicates if they aren't passed to the comparison function
support.detectDuplicates = !!hasDuplicate;

// Initialize against the default document
setDocument();

// Support: Webkit<537.32 - Safari 6.0.3/Chrome 25 (fixed in Chrome 27)
// Detached nodes confoundingly follow *each other*
support.sortDetached = assert(function( div1 ) {
	// Should return 1, but returns 4 (following)
	return div1.compareDocumentPosition( document.createElement("div") ) & 1;
});

// Support: IE<8
// Prevent attribute/property "interpolation"
// http://msdn.microsoft.com/en-us/library/ms536429%28VS.85%29.aspx
if ( !assert(function( div ) {
	div.innerHTML = "<a href='#'></a>";
	return div.firstChild.getAttribute("href") === "#" ;
}) ) {
	addHandle( "type|href|height|width", function( elem, name, isXML ) {
		if ( !isXML ) {
			return elem.getAttribute( name, name.toLowerCase() === "type" ? 1 : 2 );
		}
	});
}

// Support: IE<9
// Use defaultValue in place of getAttribute("value")
if ( !support.attributes || !assert(function( div ) {
	div.innerHTML = "<input/>";
	div.firstChild.setAttribute( "value", "" );
	return div.firstChild.getAttribute( "value" ) === "";
}) ) {
	addHandle( "value", function( elem, name, isXML ) {
		if ( !isXML && elem.nodeName.toLowerCase() === "input" ) {
			return elem.defaultValue;
		}
	});
}

// Support: IE<9
// Use getAttributeNode to fetch booleans when getAttribute lies
if ( !assert(function( div ) {
	return div.getAttribute("disabled") == null;
}) ) {
	addHandle( booleans, function( elem, name, isXML ) {
		var val;
		if ( !isXML ) {
			return elem[ name ] === true ? name.toLowerCase() :
					(val = elem.getAttributeNode( name )) && val.specified ?
					val.value :
				null;
		}
	});
}

return Sizzle;

})( window );



jQuery.find = Sizzle;
jQuery.expr = Sizzle.selectors;
jQuery.expr[ ":" ] = jQuery.expr.pseudos;
jQuery.uniqueSort = jQuery.unique = Sizzle.uniqueSort;
jQuery.text = Sizzle.getText;
jQuery.isXMLDoc = Sizzle.isXML;
jQuery.contains = Sizzle.contains;



var dir = function( elem, dir, until ) {
	var matched = [],
		truncate = until !== undefined;

	while ( ( elem = elem[ dir ] ) && elem.nodeType !== 9 ) {
		if ( elem.nodeType === 1 ) {
			if ( truncate && jQuery( elem ).is( until ) ) {
				break;
			}
			matched.push( elem );
		}
	}
	return matched;
};


var siblings = function( n, elem ) {
	var matched = [];

	for ( ; n; n = n.nextSibling ) {
		if ( n.nodeType === 1 && n !== elem ) {
			matched.push( n );
		}
	}

	return matched;
};


var rneedsContext = jQuery.expr.match.needsContext;

var rsingleTag = ( /^<([\w-]+)\s*\/?>(?:<\/\1>|)$/ );



var risSimple = /^.[^:#\[\.,]*$/;

// Implement the identical functionality for filter and not
function winnow( elements, qualifier, not ) {
	if ( jQuery.isFunction( qualifier ) ) {
		return jQuery.grep( elements, function( elem, i ) {
			/* jshint -W018 */
			return !!qualifier.call( elem, i, elem ) !== not;
		} );

	}

	if ( qualifier.nodeType ) {
		return jQuery.grep( elements, function( elem ) {
			return ( elem === qualifier ) !== not;
		} );

	}

	if ( typeof qualifier === "string" ) {
		if ( risSimple.test( qualifier ) ) {
			return jQuery.filter( qualifier, elements, not );
		}

		qualifier = jQuery.filter( qualifier, elements );
	}

	return jQuery.grep( elements, function( elem ) {
		return ( indexOf.call( qualifier, elem ) > -1 ) !== not;
	} );
}

jQuery.filter = function( expr, elems, not ) {
	var elem = elems[ 0 ];

	if ( not ) {
		expr = ":not(" + expr + ")";
	}

	return elems.length === 1 && elem.nodeType === 1 ?
		jQuery.find.matchesSelector( elem, expr ) ? [ elem ] : [] :
		jQuery.find.matches( expr, jQuery.grep( elems, function( elem ) {
			return elem.nodeType === 1;
		} ) );
};

jQuery.fn.extend( {
	find: function( selector ) {
		var i,
			len = this.length,
			ret = [],
			self = this;

		if ( typeof selector !== "string" ) {
			return this.pushStack( jQuery( selector ).filter( function() {
				for ( i = 0; i < len; i++ ) {
					if ( jQuery.contains( self[ i ], this ) ) {
						return true;
					}
				}
			} ) );
		}

		for ( i = 0; i < len; i++ ) {
			jQuery.find( selector, self[ i ], ret );
		}

		// Needed because $( selector, context ) becomes $( context ).find( selector )
		ret = this.pushStack( len > 1 ? jQuery.unique( ret ) : ret );
		ret.selector = this.selector ? this.selector + " " + selector : selector;
		return ret;
	},
	filter: function( selector ) {
		return this.pushStack( winnow( this, selector || [], false ) );
	},
	not: function( selector ) {
		return this.pushStack( winnow( this, selector || [], true ) );
	},
	is: function( selector ) {
		return !!winnow(
			this,

			// If this is a positional/relative selector, check membership in the returned set
			// so $("p:first").is("p:last") won't return true for a doc with two "p".
			typeof selector === "string" && rneedsContext.test( selector ) ?
				jQuery( selector ) :
				selector || [],
			false
		).length;
	}
} );


// Initialize a jQuery object


// A central reference to the root jQuery(document)
var rootjQuery,

	// A simple way to check for HTML strings
	// Prioritize #id over <tag> to avoid XSS via location.hash (#9521)
	// Strict HTML recognition (#11290: must start with <)
	rquickExpr = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,

	init = jQuery.fn.init = function( selector, context, root ) {
		var match, elem;

		// HANDLE: $(""), $(null), $(undefined), $(false)
		if ( !selector ) {
			return this;
		}

		// Method init() accepts an alternate rootjQuery
		// so migrate can support jQuery.sub (gh-2101)
		root = root || rootjQuery;

		// Handle HTML strings
		if ( typeof selector === "string" ) {
			if ( selector[ 0 ] === "<" &&
				selector[ selector.length - 1 ] === ">" &&
				selector.length >= 3 ) {

				// Assume that strings that start and end with <> are HTML and skip the regex check
				match = [ null, selector, null ];

			} else {
				match = rquickExpr.exec( selector );
			}

			// Match html or make sure no context is specified for #id
			if ( match && ( match[ 1 ] || !context ) ) {

				// HANDLE: $(html) -> $(array)
				if ( match[ 1 ] ) {
					context = context instanceof jQuery ? context[ 0 ] : context;

					// Option to run scripts is true for back-compat
					// Intentionally let the error be thrown if parseHTML is not present
					jQuery.merge( this, jQuery.parseHTML(
						match[ 1 ],
						context && context.nodeType ? context.ownerDocument || context : document,
						true
					) );

					// HANDLE: $(html, props)
					if ( rsingleTag.test( match[ 1 ] ) && jQuery.isPlainObject( context ) ) {
						for ( match in context ) {

							// Properties of context are called as methods if possible
							if ( jQuery.isFunction( this[ match ] ) ) {
								this[ match ]( context[ match ] );

							// ...and otherwise set as attributes
							} else {
								this.attr( match, context[ match ] );
							}
						}
					}

					return this;

				// HANDLE: $(#id)
				} else {
					elem = document.getElementById( match[ 2 ] );

					// Support: Blackberry 4.6
					// gEBID returns nodes no longer in the document (#6963)
					if ( elem && elem.parentNode ) {

						// Inject the element directly into the jQuery object
						this.length = 1;
						this[ 0 ] = elem;
					}

					this.context = document;
					this.selector = selector;
					return this;
				}

			// HANDLE: $(expr, $(...))
			} else if ( !context || context.jquery ) {
				return ( context || root ).find( selector );

			// HANDLE: $(expr, context)
			// (which is just equivalent to: $(context).find(expr)
			} else {
				return this.constructor( context ).find( selector );
			}

		// HANDLE: $(DOMElement)
		} else if ( selector.nodeType ) {
			this.context = this[ 0 ] = selector;
			this.length = 1;
			return this;

		// HANDLE: $(function)
		// Shortcut for document ready
		} else if ( jQuery.isFunction( selector ) ) {
			return root.ready !== undefined ?
				root.ready( selector ) :

				// Execute immediately if ready is not present
				selector( jQuery );
		}

		if ( selector.selector !== undefined ) {
			this.selector = selector.selector;
			this.context = selector.context;
		}

		return jQuery.makeArray( selector, this );
	};

// Give the init function the jQuery prototype for later instantiation
init.prototype = jQuery.fn;

// Initialize central reference
rootjQuery = jQuery( document );


var rparentsprev = /^(?:parents|prev(?:Until|All))/,

	// Methods guaranteed to produce a unique set when starting from a unique set
	guaranteedUnique = {
		children: true,
		contents: true,
		next: true,
		prev: true
	};

jQuery.fn.extend( {
	has: function( target ) {
		var targets = jQuery( target, this ),
			l = targets.length;

		return this.filter( function() {
			var i = 0;
			for ( ; i < l; i++ ) {
				if ( jQuery.contains( this, targets[ i ] ) ) {
					return true;
				}
			}
		} );
	},

	closest: function( selectors, context ) {
		var cur,
			i = 0,
			l = this.length,
			matched = [],
			pos = rneedsContext.test( selectors ) || typeof selectors !== "string" ?
				jQuery( selectors, context || this.context ) :
				0;

		for ( ; i < l; i++ ) {
			for ( cur = this[ i ]; cur && cur !== context; cur = cur.parentNode ) {

				// Always skip document fragments
				if ( cur.nodeType < 11 && ( pos ?
					pos.index( cur ) > -1 :

					// Don't pass non-elements to Sizzle
					cur.nodeType === 1 &&
						jQuery.find.matchesSelector( cur, selectors ) ) ) {

					matched.push( cur );
					break;
				}
			}
		}

		return this.pushStack( matched.length > 1 ? jQuery.uniqueSort( matched ) : matched );
	},

	// Determine the position of an element within the set
	index: function( elem ) {

		// No argument, return index in parent
		if ( !elem ) {
			return ( this[ 0 ] && this[ 0 ].parentNode ) ? this.first().prevAll().length : -1;
		}

		// Index in selector
		if ( typeof elem === "string" ) {
			return indexOf.call( jQuery( elem ), this[ 0 ] );
		}

		// Locate the position of the desired element
		return indexOf.call( this,

			// If it receives a jQuery object, the first element is used
			elem.jquery ? elem[ 0 ] : elem
		);
	},

	add: function( selector, context ) {
		return this.pushStack(
			jQuery.uniqueSort(
				jQuery.merge( this.get(), jQuery( selector, context ) )
			)
		);
	},

	addBack: function( selector ) {
		return this.add( selector == null ?
			this.prevObject : this.prevObject.filter( selector )
		);
	}
} );

function sibling( cur, dir ) {
	while ( ( cur = cur[ dir ] ) && cur.nodeType !== 1 ) {}
	return cur;
}

jQuery.each( {
	parent: function( elem ) {
		var parent = elem.parentNode;
		return parent && parent.nodeType !== 11 ? parent : null;
	},
	parents: function( elem ) {
		return dir( elem, "parentNode" );
	},
	parentsUntil: function( elem, i, until ) {
		return dir( elem, "parentNode", until );
	},
	next: function( elem ) {
		return sibling( elem, "nextSibling" );
	},
	prev: function( elem ) {
		return sibling( elem, "previousSibling" );
	},
	nextAll: function( elem ) {
		return dir( elem, "nextSibling" );
	},
	prevAll: function( elem ) {
		return dir( elem, "previousSibling" );
	},
	nextUntil: function( elem, i, until ) {
		return dir( elem, "nextSibling", until );
	},
	prevUntil: function( elem, i, until ) {
		return dir( elem, "previousSibling", until );
	},
	siblings: function( elem ) {
		return siblings( ( elem.parentNode || {} ).firstChild, elem );
	},
	children: function( elem ) {
		return siblings( elem.firstChild );
	},
	contents: function( elem ) {
		return elem.contentDocument || jQuery.merge( [], elem.childNodes );
	}
}, function( name, fn ) {
	jQuery.fn[ name ] = function( until, selector ) {
		var matched = jQuery.map( this, fn, until );

		if ( name.slice( -5 ) !== "Until" ) {
			selector = until;
		}

		if ( selector && typeof selector === "string" ) {
			matched = jQuery.filter( selector, matched );
		}

		if ( this.length > 1 ) {

			// Remove duplicates
			if ( !guaranteedUnique[ name ] ) {
				jQuery.uniqueSort( matched );
			}

			// Reverse order for parents* and prev-derivatives
			if ( rparentsprev.test( name ) ) {
				matched.reverse();
			}
		}

		return this.pushStack( matched );
	};
} );
var rnotwhite = ( /\S+/g );



// Convert String-formatted options into Object-formatted ones
function createOptions( options ) {
	var object = {};
	jQuery.each( options.match( rnotwhite ) || [], function( _, flag ) {
		object[ flag ] = true;
	} );
	return object;
}

/*
 * Create a callback list using the following parameters:
 *
 *	options: an optional list of space-separated options that will change how
 *			the callback list behaves or a more traditional option object
 *
 * By default a callback list will act like an event callback list and can be
 * "fired" multiple times.
 *
 * Possible options:
 *
 *	once:			will ensure the callback list can only be fired once (like a Deferred)
 *
 *	memory:			will keep track of previous values and will call any callback added
 *					after the list has been fired right away with the latest "memorized"
 *					values (like a Deferred)
 *
 *	unique:			will ensure a callback can only be added once (no duplicate in the list)
 *
 *	stopOnFalse:	interrupt callings when a callback returns false
 *
 */
jQuery.Callbacks = function( options ) {

	// Convert options from String-formatted to Object-formatted if needed
	// (we check in cache first)
	options = typeof options === "string" ?
		createOptions( options ) :
		jQuery.extend( {}, options );

	var // Flag to know if list is currently firing
		firing,

		// Last fire value for non-forgettable lists
		memory,

		// Flag to know if list was already fired
		fired,

		// Flag to prevent firing
		locked,

		// Actual callback list
		list = [],

		// Queue of execution data for repeatable lists
		queue = [],

		// Index of currently firing callback (modified by add/remove as needed)
		firingIndex = -1,

		// Fire callbacks
		fire = function() {

			// Enforce single-firing
			locked = options.once;

			// Execute callbacks for all pending executions,
			// respecting firingIndex overrides and runtime changes
			fired = firing = true;
			for ( ; queue.length; firingIndex = -1 ) {
				memory = queue.shift();
				while ( ++firingIndex < list.length ) {

					// Run callback and check for early termination
					if ( list[ firingIndex ].apply( memory[ 0 ], memory[ 1 ] ) === false &&
						options.stopOnFalse ) {

						// Jump to end and forget the data so .add doesn't re-fire
						firingIndex = list.length;
						memory = false;
					}
				}
			}

			// Forget the data if we're done with it
			if ( !options.memory ) {
				memory = false;
			}

			firing = false;

			// Clean up if we're done firing for good
			if ( locked ) {

				// Keep an empty list if we have data for future add calls
				if ( memory ) {
					list = [];

				// Otherwise, this object is spent
				} else {
					list = "";
				}
			}
		},

		// Actual Callbacks object
		self = {

			// Add a callback or a collection of callbacks to the list
			add: function() {
				if ( list ) {

					// If we have memory from a past run, we should fire after adding
					if ( memory && !firing ) {
						firingIndex = list.length - 1;
						queue.push( memory );
					}

					( function add( args ) {
						jQuery.each( args, function( _, arg ) {
							if ( jQuery.isFunction( arg ) ) {
								if ( !options.unique || !self.has( arg ) ) {
									list.push( arg );
								}
							} else if ( arg && arg.length && jQuery.type( arg ) !== "string" ) {

								// Inspect recursively
								add( arg );
							}
						} );
					} )( arguments );

					if ( memory && !firing ) {
						fire();
					}
				}
				return this;
			},

			// Remove a callback from the list
			remove: function() {
				jQuery.each( arguments, function( _, arg ) {
					var index;
					while ( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) {
						list.splice( index, 1 );

						// Handle firing indexes
						if ( index <= firingIndex ) {
							firingIndex--;
						}
					}
				} );
				return this;
			},

			// Check if a given callback is in the list.
			// If no argument is given, return whether or not list has callbacks attached.
			has: function( fn ) {
				return fn ?
					jQuery.inArray( fn, list ) > -1 :
					list.length > 0;
			},

			// Remove all callbacks from the list
			empty: function() {
				if ( list ) {
					list = [];
				}
				return this;
			},

			// Disable .fire and .add
			// Abort any current/pending executions
			// Clear all callbacks and values
			disable: function() {
				locked = queue = [];
				list = memory = "";
				return this;
			},
			disabled: function() {
				return !list;
			},

			// Disable .fire
			// Also disable .add unless we have memory (since it would have no effect)
			// Abort any pending executions
			lock: function() {
				locked = queue = [];
				if ( !memory ) {
					list = memory = "";
				}
				return this;
			},
			locked: function() {
				return !!locked;
			},

			// Call all callbacks with the given context and arguments
			fireWith: function( context, args ) {
				if ( !locked ) {
					args = args || [];
					args = [ context, args.slice ? args.slice() : args ];
					queue.push( args );
					if ( !firing ) {
						fire();
					}
				}
				return this;
			},

			// Call all the callbacks with the given arguments
			fire: function() {
				self.fireWith( this, arguments );
				return this;
			},

			// To know if the callbacks have already been called at least once
			fired: function() {
				return !!fired;
			}
		};

	return self;
};


jQuery.extend( {

	Deferred: function( func ) {
		var tuples = [

				// action, add listener, listener list, final state
				[ "resolve", "done", jQuery.Callbacks( "once memory" ), "resolved" ],
				[ "reject", "fail", jQuery.Callbacks( "once memory" ), "rejected" ],
				[ "notify", "progress", jQuery.Callbacks( "memory" ) ]
			],
			state = "pending",
			promise = {
				state: function() {
					return state;
				},
				always: function() {
					deferred.done( arguments ).fail( arguments );
					return this;
				},
				then: function( /* fnDone, fnFail, fnProgress */ ) {
					var fns = arguments;
					return jQuery.Deferred( function( newDefer ) {
						jQuery.each( tuples, function( i, tuple ) {
							var fn = jQuery.isFunction( fns[ i ] ) && fns[ i ];

							// deferred[ done | fail | progress ] for forwarding actions to newDefer
							deferred[ tuple[ 1 ] ]( function() {
								var returned = fn && fn.apply( this, arguments );
								if ( returned && jQuery.isFunction( returned.promise ) ) {
									returned.promise()
										.progress( newDefer.notify )
										.done( newDefer.resolve )
										.fail( newDefer.reject );
								} else {
									newDefer[ tuple[ 0 ] + "With" ](
										this === promise ? newDefer.promise() : this,
										fn ? [ returned ] : arguments
									);
								}
							} );
						} );
						fns = null;
					} ).promise();
				},

				// Get a promise for this deferred
				// If obj is provided, the promise aspect is added to the object
				promise: function( obj ) {
					return obj != null ? jQuery.extend( obj, promise ) : promise;
				}
			},
			deferred = {};

		// Keep pipe for back-compat
		promise.pipe = promise.then;

		// Add list-specific methods
		jQuery.each( tuples, function( i, tuple ) {
			var list = tuple[ 2 ],
				stateString = tuple[ 3 ];

			// promise[ done | fail | progress ] = list.add
			promise[ tuple[ 1 ] ] = list.add;

			// Handle state
			if ( stateString ) {
				list.add( function() {

					// state = [ resolved | rejected ]
					state = stateString;

				// [ reject_list | resolve_list ].disable; progress_list.lock
				}, tuples[ i ^ 1 ][ 2 ].disable, tuples[ 2 ][ 2 ].lock );
			}

			// deferred[ resolve | reject | notify ]
			deferred[ tuple[ 0 ] ] = function() {
				deferred[ tuple[ 0 ] + "With" ]( this === deferred ? promise : this, arguments );
				return this;
			};
			deferred[ tuple[ 0 ] + "With" ] = list.fireWith;
		} );

		// Make the deferred a promise
		promise.promise( deferred );

		// Call given func if any
		if ( func ) {
			func.call( deferred, deferred );
		}

		// All done!
		return deferred;
	},

	// Deferred helper
	when: function( subordinate /* , ..., subordinateN */ ) {
		var i = 0,
			resolveValues = slice.call( arguments ),
			length = resolveValues.length,

			// the count of uncompleted subordinates
			remaining = length !== 1 ||
				( subordinate && jQuery.isFunction( subordinate.promise ) ) ? length : 0,

			// the master Deferred.
			// If resolveValues consist of only a single Deferred, just use that.
			deferred = remaining === 1 ? subordinate : jQuery.Deferred(),

			// Update function for both resolve and progress values
			updateFunc = function( i, contexts, values ) {
				return function( value ) {
					contexts[ i ] = this;
					values[ i ] = arguments.length > 1 ? slice.call( arguments ) : value;
					if ( values === progressValues ) {
						deferred.notifyWith( contexts, values );
					} else if ( !( --remaining ) ) {
						deferred.resolveWith( contexts, values );
					}
				};
			},

			progressValues, progressContexts, resolveContexts;

		// Add listeners to Deferred subordinates; treat others as resolved
		if ( length > 1 ) {
			progressValues = new Array( length );
			progressContexts = new Array( length );
			resolveContexts = new Array( length );
			for ( ; i < length; i++ ) {
				if ( resolveValues[ i ] && jQuery.isFunction( resolveValues[ i ].promise ) ) {
					resolveValues[ i ].promise()
						.progress( updateFunc( i, progressContexts, progressValues ) )
						.done( updateFunc( i, resolveContexts, resolveValues ) )
						.fail( deferred.reject );
				} else {
					--remaining;
				}
			}
		}

		// If we're not waiting on anything, resolve the master
		if ( !remaining ) {
			deferred.resolveWith( resolveContexts, resolveValues );
		}

		return deferred.promise();
	}
} );


// The deferred used on DOM ready
var readyList;

jQuery.fn.ready = function( fn ) {

	// Add the callback
	jQuery.ready.promise().done( fn );

	return this;
};

jQuery.extend( {

	// Is the DOM ready to be used? Set to true once it occurs.
	isReady: false,

	// A counter to track how many items to wait for before
	// the ready event fires. See #6781
	readyWait: 1,

	// Hold (or release) the ready event
	holdReady: function( hold ) {
		if ( hold ) {
			jQuery.readyWait++;
		} else {
			jQuery.ready( true );
		}
	},

	// Handle when the DOM is ready
	ready: function( wait ) {

		// Abort if there are pending holds or we're already ready
		if ( wait === true ? --jQuery.readyWait : jQuery.isReady ) {
			return;
		}

		// Remember that the DOM is ready
		jQuery.isReady = true;

		// If a normal DOM Ready event fired, decrement, and wait if need be
		if ( wait !== true && --jQuery.readyWait > 0 ) {
			return;
		}

		// If there are functions bound, to execute
		readyList.resolveWith( document, [ jQuery ] );

		// Trigger any bound ready events
		if ( jQuery.fn.triggerHandler ) {
			jQuery( document ).triggerHandler( "ready" );
			jQuery( document ).off( "ready" );
		}
	}
} );

/**
 * The ready event handler and self cleanup method
 */
function completed() {
	document.removeEventListener( "DOMContentLoaded", completed );
	window.removeEventListener( "load", completed );
	jQuery.ready();
}

jQuery.ready.promise = function( obj ) {
	if ( !readyList ) {

		readyList = jQuery.Deferred();

		// Catch cases where $(document).ready() is called
		// after the browser event has already occurred.
		// Support: IE9-10 only
		// Older IE sometimes signals "interactive" too soon
		if ( document.readyState === "complete" ||
			( document.readyState !== "loading" && !document.documentElement.doScroll ) ) {

			// Handle it asynchronously to allow scripts the opportunity to delay ready
			window.setTimeout( jQuery.ready );

		} else {

			// Use the handy event callback
			document.addEventListener( "DOMContentLoaded", completed );

			// A fallback to window.onload, that will always work
			window.addEventListener( "load", completed );
		}
	}
	return readyList.promise( obj );
};

// Kick off the DOM ready check even if the user does not
jQuery.ready.promise();




// Multifunctional method to get and set values of a collection
// The value/s can optionally be executed if it's a function
var access = function( elems, fn, key, value, chainable, emptyGet, raw ) {
	var i = 0,
		len = elems.length,
		bulk = key == null;

	// Sets many values
	if ( jQuery.type( key ) === "object" ) {
		chainable = true;
		for ( i in key ) {
			access( elems, fn, i, key[ i ], true, emptyGet, raw );
		}

	// Sets one value
	} else if ( value !== undefined ) {
		chainable = true;

		if ( !jQuery.isFunction( value ) ) {
			raw = true;
		}

		if ( bulk ) {

			// Bulk operations run against the entire set
			if ( raw ) {
				fn.call( elems, value );
				fn = null;

			// ...except when executing function values
			} else {
				bulk = fn;
				fn = function( elem, key, value ) {
					return bulk.call( jQuery( elem ), value );
				};
			}
		}

		if ( fn ) {
			for ( ; i < len; i++ ) {
				fn(
					elems[ i ], key, raw ?
					value :
					value.call( elems[ i ], i, fn( elems[ i ], key ) )
				);
			}
		}
	}

	return chainable ?
		elems :

		// Gets
		bulk ?
			fn.call( elems ) :
			len ? fn( elems[ 0 ], key ) : emptyGet;
};
var acceptData = function( owner ) {

	// Accepts only:
	//  - Node
	//    - Node.ELEMENT_NODE
	//    - Node.DOCUMENT_NODE
	//  - Object
	//    - Any
	/* jshint -W018 */
	return owner.nodeType === 1 || owner.nodeType === 9 || !( +owner.nodeType );
};




function Data() {
	this.expando = jQuery.expando + Data.uid++;
}

Data.uid = 1;

Data.prototype = {

	register: function( owner, initial ) {
		var value = initial || {};

		// If it is a node unlikely to be stringify-ed or looped over
		// use plain assignment
		if ( owner.nodeType ) {
			owner[ this.expando ] = value;

		// Otherwise secure it in a non-enumerable, non-writable property
		// configurability must be true to allow the property to be
		// deleted with the delete operator
		} else {
			Object.defineProperty( owner, this.expando, {
				value: value,
				writable: true,
				configurable: true
			} );
		}
		return owner[ this.expando ];
	},
	cache: function( owner ) {

		// We can accept data for non-element nodes in modern browsers,
		// but we should not, see #8335.
		// Always return an empty object.
		if ( !acceptData( owner ) ) {
			return {};
		}

		// Check if the owner object already has a cache
		var value = owner[ this.expando ];

		// If not, create one
		if ( !value ) {
			value = {};

			// We can accept data for non-element nodes in modern browsers,
			// but we should not, see #8335.
			// Always return an empty object.
			if ( acceptData( owner ) ) {

				// If it is a node unlikely to be stringify-ed or looped over
				// use plain assignment
				if ( owner.nodeType ) {
					owner[ this.expando ] = value;

				// Otherwise secure it in a non-enumerable property
				// configurable must be true to allow the property to be
				// deleted when data is removed
				} else {
					Object.defineProperty( owner, this.expando, {
						value: value,
						configurable: true
					} );
				}
			}
		}

		return value;
	},
	set: function( owner, data, value ) {
		var prop,
			cache = this.cache( owner );

		// Handle: [ owner, key, value ] args
		if ( typeof data === "string" ) {
			cache[ data ] = value;

		// Handle: [ owner, { properties } ] args
		} else {

			// Copy the properties one-by-one to the cache object
			for ( prop in data ) {
				cache[ prop ] = data[ prop ];
			}
		}
		return cache;
	},
	get: function( owner, key ) {
		return key === undefined ?
			this.cache( owner ) :
			owner[ this.expando ] && owner[ this.expando ][ key ];
	},
	access: function( owner, key, value ) {
		var stored;

		// In cases where either:
		//
		//   1. No key was specified
		//   2. A string key was specified, but no value provided
		//
		// Take the "read" path and allow the get method to determine
		// which value to return, respectively either:
		//
		//   1. The entire cache object
		//   2. The data stored at the key
		//
		if ( key === undefined ||
				( ( key && typeof key === "string" ) && value === undefined ) ) {

			stored = this.get( owner, key );

			return stored !== undefined ?
				stored : this.get( owner, jQuery.camelCase( key ) );
		}

		// When the key is not a string, or both a key and value
		// are specified, set or extend (existing objects) with either:
		//
		//   1. An object of properties
		//   2. A key and value
		//
		this.set( owner, key, value );

		// Since the "set" path can have two possible entry points
		// return the expected data based on which path was taken[*]
		return value !== undefined ? value : key;
	},
	remove: function( owner, key ) {
		var i, name, camel,
			cache = owner[ this.expando ];

		if ( cache === undefined ) {
			return;
		}

		if ( key === undefined ) {
			this.register( owner );

		} else {

			// Support array or space separated string of keys
			if ( jQuery.isArray( key ) ) {

				// If "name" is an array of keys...
				// When data is initially created, via ("key", "val") signature,
				// keys will be converted to camelCase.
				// Since there is no way to tell _how_ a key was added, remove
				// both plain key and camelCase key. #12786
				// This will only penalize the array argument path.
				name = key.concat( key.map( jQuery.camelCase ) );
			} else {
				camel = jQuery.camelCase( key );

				// Try the string as a key before any manipulation
				if ( key in cache ) {
					name = [ key, camel ];
				} else {

					// If a key with the spaces exists, use it.
					// Otherwise, create an array by matching non-whitespace
					name = camel;
					name = name in cache ?
						[ name ] : ( name.match( rnotwhite ) || [] );
				}
			}

			i = name.length;

			while ( i-- ) {
				delete cache[ name[ i ] ];
			}
		}

		// Remove the expando if there's no more data
		if ( key === undefined || jQuery.isEmptyObject( cache ) ) {

			// Support: Chrome <= 35-45+
			// Webkit & Blink performance suffers when deleting properties
			// from DOM nodes, so set to undefined instead
			// https://code.google.com/p/chromium/issues/detail?id=378607
			if ( owner.nodeType ) {
				owner[ this.expando ] = undefined;
			} else {
				delete owner[ this.expando ];
			}
		}
	},
	hasData: function( owner ) {
		var cache = owner[ this.expando ];
		return cache !== undefined && !jQuery.isEmptyObject( cache );
	}
};
var dataPriv = new Data();

var dataUser = new Data();



//	Implementation Summary
//
//	1. Enforce API surface and semantic compatibility with 1.9.x branch
//	2. Improve the module's maintainability by reducing the storage
//		paths to a single mechanism.
//	3. Use the same single mechanism to support "private" and "user" data.
//	4. _Never_ expose "private" data to user code (TODO: Drop _data, _removeData)
//	5. Avoid exposing implementation details on user objects (eg. expando properties)
//	6. Provide a clear path for implementation upgrade to WeakMap in 2014

var rbrace = /^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,
	rmultiDash = /[A-Z]/g;

function dataAttr( elem, key, data ) {
	var name;

	// If nothing was found internally, try to fetch any
	// data from the HTML5 data-* attribute
	if ( data === undefined && elem.nodeType === 1 ) {
		name = "data-" + key.replace( rmultiDash, "-$&" ).toLowerCase();
		data = elem.getAttribute( name );

		if ( typeof data === "string" ) {
			try {
				data = data === "true" ? true :
					data === "false" ? false :
					data === "null" ? null :

					// Only convert to a number if it doesn't change the string
					+data + "" === data ? +data :
					rbrace.test( data ) ? jQuery.parseJSON( data ) :
					data;
			} catch ( e ) {}

			// Make sure we set the data so it isn't changed later
			dataUser.set( elem, key, data );
		} else {
			data = undefined;
		}
	}
	return data;
}

jQuery.extend( {
	hasData: function( elem ) {
		return dataUser.hasData( elem ) || dataPriv.hasData( elem );
	},

	data: function( elem, name, data ) {
		return dataUser.access( elem, name, data );
	},

	removeData: function( elem, name ) {
		dataUser.remove( elem, name );
	},

	// TODO: Now that all calls to _data and _removeData have been replaced
	// with direct calls to dataPriv methods, these can be deprecated.
	_data: function( elem, name, data ) {
		return dataPriv.access( elem, name, data );
	},

	_removeData: function( elem, name ) {
		dataPriv.remove( elem, name );
	}
} );

jQuery.fn.extend( {
	data: function( key, value ) {
		var i, name, data,
			elem = this[ 0 ],
			attrs = elem && elem.attributes;

		// Gets all values
		if ( key === undefined ) {
			if ( this.length ) {
				data = dataUser.get( elem );

				if ( elem.nodeType === 1 && !dataPriv.get( elem, "hasDataAttrs" ) ) {
					i = attrs.length;
					while ( i-- ) {

						// Support: IE11+
						// The attrs elements can be null (#14894)
						if ( attrs[ i ] ) {
							name = attrs[ i ].name;
							if ( name.indexOf( "data-" ) === 0 ) {
								name = jQuery.camelCase( name.slice( 5 ) );
								dataAttr( elem, name, data[ name ] );
							}
						}
					}
					dataPriv.set( elem, "hasDataAttrs", true );
				}
			}

			return data;
		}

		// Sets multiple values
		if ( typeof key === "object" ) {
			return this.each( function() {
				dataUser.set( this, key );
			} );
		}

		return access( this, function( value ) {
			var data, camelKey;

			// The calling jQuery object (element matches) is not empty
			// (and therefore has an element appears at this[ 0 ]) and the
			// `value` parameter was not undefined. An empty jQuery object
			// will result in `undefined` for elem = this[ 0 ] which will
			// throw an exception if an attempt to read a data cache is made.
			if ( elem && value === undefined ) {

				// Attempt to get data from the cache
				// with the key as-is
				data = dataUser.get( elem, key ) ||

					// Try to find dashed key if it exists (gh-2779)
					// This is for 2.2.x only
					dataUser.get( elem, key.replace( rmultiDash, "-$&" ).toLowerCase() );

				if ( data !== undefined ) {
					return data;
				}

				camelKey = jQuery.camelCase( key );

				// Attempt to get data from the cache
				// with the key camelized
				data = dataUser.get( elem, camelKey );
				if ( data !== undefined ) {
					return data;
				}

				// Attempt to "discover" the data in
				// HTML5 custom data-* attrs
				data = dataAttr( elem, camelKey, undefined );
				if ( data !== undefined ) {
					return data;
				}

				// We tried really hard, but the data doesn't exist.
				return;
			}

			// Set the data...
			camelKey = jQuery.camelCase( key );
			this.each( function() {

				// First, attempt to store a copy or reference of any
				// data that might've been store with a camelCased key.
				var data = dataUser.get( this, camelKey );

				// For HTML5 data-* attribute interop, we have to
				// store property names with dashes in a camelCase form.
				// This might not apply to all properties...*
				dataUser.set( this, camelKey, value );

				// *... In the case of properties that might _actually_
				// have dashes, we need to also store a copy of that
				// unchanged property.
				if ( key.indexOf( "-" ) > -1 && data !== undefined ) {
					dataUser.set( this, key, value );
				}
			} );
		}, null, value, arguments.length > 1, null, true );
	},

	removeData: function( key ) {
		return this.each( function() {
			dataUser.remove( this, key );
		} );
	}
} );


jQuery.extend( {
	queue: function( elem, type, data ) {
		var queue;

		if ( elem ) {
			type = ( type || "fx" ) + "queue";
			queue = dataPriv.get( elem, type );

			// Speed up dequeue by getting out quickly if this is just a lookup
			if ( data ) {
				if ( !queue || jQuery.isArray( data ) ) {
					queue = dataPriv.access( elem, type, jQuery.makeArray( data ) );
				} else {
					queue.push( data );
				}
			}
			return queue || [];
		}
	},

	dequeue: function( elem, type ) {
		type = type || "fx";

		var queue = jQuery.queue( elem, type ),
			startLength = queue.length,
			fn = queue.shift(),
			hooks = jQuery._queueHooks( elem, type ),
			next = function() {
				jQuery.dequeue( elem, type );
			};

		// If the fx queue is dequeued, always remove the progress sentinel
		if ( fn === "inprogress" ) {
			fn = queue.shift();
			startLength--;
		}

		if ( fn ) {

			// Add a progress sentinel to prevent the fx queue from being
			// automatically dequeued
			if ( type === "fx" ) {
				queue.unshift( "inprogress" );
			}

			// Clear up the last queue stop function
			delete hooks.stop;
			fn.call( elem, next, hooks );
		}

		if ( !startLength && hooks ) {
			hooks.empty.fire();
		}
	},

	// Not public - generate a queueHooks object, or return the current one
	_queueHooks: function( elem, type ) {
		var key = type + "queueHooks";
		return dataPriv.get( elem, key ) || dataPriv.access( elem, key, {
			empty: jQuery.Callbacks( "once memory" ).add( function() {
				dataPriv.remove( elem, [ type + "queue", key ] );
			} )
		} );
	}
} );

jQuery.fn.extend( {
	queue: function( type, data ) {
		var setter = 2;

		if ( typeof type !== "string" ) {
			data = type;
			type = "fx";
			setter--;
		}

		if ( arguments.length < setter ) {
			return jQuery.queue( this[ 0 ], type );
		}

		return data === undefined ?
			this :
			this.each( function() {
				var queue = jQuery.queue( this, type, data );

				// Ensure a hooks for this queue
				jQuery._queueHooks( this, type );

				if ( type === "fx" && queue[ 0 ] !== "inprogress" ) {
					jQuery.dequeue( this, type );
				}
			} );
	},
	dequeue: function( type ) {
		return this.each( function() {
			jQuery.dequeue( this, type );
		} );
	},
	clearQueue: function( type ) {
		return this.queue( type || "fx", [] );
	},

	// Get a promise resolved when queues of a certain type
	// are emptied (fx is the type by default)
	promise: function( type, obj ) {
		var tmp,
			count = 1,
			defer = jQuery.Deferred(),
			elements = this,
			i = this.length,
			resolve = function() {
				if ( !( --count ) ) {
					defer.resolveWith( elements, [ elements ] );
				}
			};

		if ( typeof type !== "string" ) {
			obj = type;
			type = undefined;
		}
		type = type || "fx";

		while ( i-- ) {
			tmp = dataPriv.get( elements[ i ], type + "queueHooks" );
			if ( tmp && tmp.empty ) {
				count++;
				tmp.empty.add( resolve );
			}
		}
		resolve();
		return defer.promise( obj );
	}
} );
var pnum = ( /[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/ ).source;

var rcssNum = new RegExp( "^(?:([+-])=|)(" + pnum + ")([a-z%]*)$", "i" );


var cssExpand = [ "Top", "Right", "Bottom", "Left" ];

var isHidden = function( elem, el ) {

		// isHidden might be called from jQuery#filter function;
		// in that case, element will be second argument
		elem = el || elem;
		return jQuery.css( elem, "display" ) === "none" ||
			!jQuery.contains( elem.ownerDocument, elem );
	};



function adjustCSS( elem, prop, valueParts, tween ) {
	var adjusted,
		scale = 1,
		maxIterations = 20,
		currentValue = tween ?
			function() { return tween.cur(); } :
			function() { return jQuery.css( elem, prop, "" ); },
		initial = currentValue(),
		unit = valueParts && valueParts[ 3 ] || ( jQuery.cssNumber[ prop ] ? "" : "px" ),

		// Starting value computation is required for potential unit mismatches
		initialInUnit = ( jQuery.cssNumber[ prop ] || unit !== "px" && +initial ) &&
			rcssNum.exec( jQuery.css( elem, prop ) );

	if ( initialInUnit && initialInUnit[ 3 ] !== unit ) {

		// Trust units reported by jQuery.css
		unit = unit || initialInUnit[ 3 ];

		// Make sure we update the tween properties later on
		valueParts = valueParts || [];

		// Iteratively approximate from a nonzero starting point
		initialInUnit = +initial || 1;

		do {

			// If previous iteration zeroed out, double until we get *something*.
			// Use string for doubling so we don't accidentally see scale as unchanged below
			scale = scale || ".5";

			// Adjust and apply
			initialInUnit = initialInUnit / scale;
			jQuery.style( elem, prop, initialInUnit + unit );

		// Update scale, tolerating zero or NaN from tween.cur()
		// Break the loop if scale is unchanged or perfect, or if we've just had enough.
		} while (
			scale !== ( scale = currentValue() / initial ) && scale !== 1 && --maxIterations
		);
	}

	if ( valueParts ) {
		initialInUnit = +initialInUnit || +initial || 0;

		// Apply relative offset (+=/-=) if specified
		adjusted = valueParts[ 1 ] ?
			initialInUnit + ( valueParts[ 1 ] + 1 ) * valueParts[ 2 ] :
			+valueParts[ 2 ];
		if ( tween ) {
			tween.unit = unit;
			tween.start = initialInUnit;
			tween.end = adjusted;
		}
	}
	return adjusted;
}
var rcheckableType = ( /^(?:checkbox|radio)$/i );

var rtagName = ( /<([\w:-]+)/ );

var rscriptType = ( /^$|\/(?:java|ecma)script/i );



// We have to close these tags to support XHTML (#13200)
var wrapMap = {

	// Support: IE9
	option: [ 1, "<select multiple='multiple'>", "</select>" ],

	// XHTML parsers do not magically insert elements in the
	// same way that tag soup parsers do. So we cannot shorten
	// this by omitting <tbody> or other required elements.
	thead: [ 1, "<table>", "</table>" ],
	col: [ 2, "<table><colgroup>", "</colgroup></table>" ],
	tr: [ 2, "<table><tbody>", "</tbody></table>" ],
	td: [ 3, "<table><tbody><tr>", "</tr></tbody></table>" ],

	_default: [ 0, "", "" ]
};

// Support: IE9
wrapMap.optgroup = wrapMap.option;

wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead;
wrapMap.th = wrapMap.td;


function getAll( context, tag ) {

	// Support: IE9-11+
	// Use typeof to avoid zero-argument method invocation on host objects (#15151)
	var ret = typeof context.getElementsByTagName !== "undefined" ?
			context.getElementsByTagName( tag || "*" ) :
			typeof context.querySelectorAll !== "undefined" ?
				context.querySelectorAll( tag || "*" ) :
			[];

	return tag === undefined || tag && jQuery.nodeName( context, tag ) ?
		jQuery.merge( [ context ], ret ) :
		ret;
}


// Mark scripts as having already been evaluated
function setGlobalEval( elems, refElements ) {
	var i = 0,
		l = elems.length;

	for ( ; i < l; i++ ) {
		dataPriv.set(
			elems[ i ],
			"globalEval",
			!refElements || dataPriv.get( refElements[ i ], "globalEval" )
		);
	}
}


var rhtml = /<|&#?\w+;/;

function buildFragment( elems, context, scripts, selection, ignored ) {
	var elem, tmp, tag, wrap, contains, j,
		fragment = context.createDocumentFragment(),
		nodes = [],
		i = 0,
		l = elems.length;

	for ( ; i < l; i++ ) {
		elem = elems[ i ];

		if ( elem || elem === 0 ) {

			// Add nodes directly
			if ( jQuery.type( elem ) === "object" ) {

				// Support: Android<4.1, PhantomJS<2
				// push.apply(_, arraylike) throws on ancient WebKit
				jQuery.merge( nodes, elem.nodeType ? [ elem ] : elem );

			// Convert non-html into a text node
			} else if ( !rhtml.test( elem ) ) {
				nodes.push( context.createTextNode( elem ) );

			// Convert html into DOM nodes
			} else {
				tmp = tmp || fragment.appendChild( context.createElement( "div" ) );

				// Deserialize a standard representation
				tag = ( rtagName.exec( elem ) || [ "", "" ] )[ 1 ].toLowerCase();
				wrap = wrapMap[ tag ] || wrapMap._default;
				tmp.innerHTML = wrap[ 1 ] + jQuery.htmlPrefilter( elem ) + wrap[ 2 ];

				// Descend through wrappers to the right content
				j = wrap[ 0 ];
				while ( j-- ) {
					tmp = tmp.lastChild;
				}

				// Support: Android<4.1, PhantomJS<2
				// push.apply(_, arraylike) throws on ancient WebKit
				jQuery.merge( nodes, tmp.childNodes );

				// Remember the top-level container
				tmp = fragment.firstChild;

				// Ensure the created nodes are orphaned (#12392)
				tmp.textContent = "";
			}
		}
	}

	// Remove wrapper from fragment
	fragment.textContent = "";

	i = 0;
	while ( ( elem = nodes[ i++ ] ) ) {

		// Skip elements already in the context collection (trac-4087)
		if ( selection && jQuery.inArray( elem, selection ) > -1 ) {
			if ( ignored ) {
				ignored.push( elem );
			}
			continue;
		}

		contains = jQuery.contains( elem.ownerDocument, elem );

		// Append to fragment
		tmp = getAll( fragment.appendChild( elem ), "script" );

		// Preserve script evaluation history
		if ( contains ) {
			setGlobalEval( tmp );
		}

		// Capture executables
		if ( scripts ) {
			j = 0;
			while ( ( elem = tmp[ j++ ] ) ) {
				if ( rscriptType.test( elem.type || "" ) ) {
					scripts.push( elem );
				}
			}
		}
	}

	return fragment;
}


( function() {
	var fragment = document.createDocumentFragment(),
		div = fragment.appendChild( document.createElement( "div" ) ),
		input = document.createElement( "input" );

	// Support: Android 4.0-4.3, Safari<=5.1
	// Check state lost if the name is set (#11217)
	// Support: Windows Web Apps (WWA)
	// `name` and `type` must use .setAttribute for WWA (#14901)
	input.setAttribute( "type", "radio" );
	input.setAttribute( "checked", "checked" );
	input.setAttribute( "name", "t" );

	div.appendChild( input );

	// Support: Safari<=5.1, Android<4.2
	// Older WebKit doesn't clone checked state correctly in fragments
	support.checkClone = div.cloneNode( true ).cloneNode( true ).lastChild.checked;

	// Support: IE<=11+
	// Make sure textarea (and checkbox) defaultValue is properly cloned
	div.innerHTML = "<textarea>x</textarea>";
	support.noCloneChecked = !!div.cloneNode( true ).lastChild.defaultValue;
} )();


var
	rkeyEvent = /^key/,
	rmouseEvent = /^(?:mouse|pointer|contextmenu|drag|drop)|click/,
	rtypenamespace = /^([^.]*)(?:\.(.+)|)/;

function returnTrue() {
	return true;
}

function returnFalse() {
	return false;
}

// Support: IE9
// See #13393 for more info
function safeActiveElement() {
	try {
		return document.activeElement;
	} catch ( err ) { }
}

function on( elem, types, selector, data, fn, one ) {
	var origFn, type;

	// Types can be a map of types/handlers
	if ( typeof types === "object" ) {

		// ( types-Object, selector, data )
		if ( typeof selector !== "string" ) {

			// ( types-Object, data )
			data = data || selector;
			selector = undefined;
		}
		for ( type in types ) {
			on( elem, type, selector, data, types[ type ], one );
		}
		return elem;
	}

	if ( data == null && fn == null ) {

		// ( types, fn )
		fn = selector;
		data = selector = undefined;
	} else if ( fn == null ) {
		if ( typeof selector === "string" ) {

			// ( types, selector, fn )
			fn = data;
			data = undefined;
		} else {

			// ( types, data, fn )
			fn = data;
			data = selector;
			selector = undefined;
		}
	}
	if ( fn === false ) {
		fn = returnFalse;
	} else if ( !fn ) {
		return elem;
	}

	if ( one === 1 ) {
		origFn = fn;
		fn = function( event ) {

			// Can use an empty set, since event contains the info
			jQuery().off( event );
			return origFn.apply( this, arguments );
		};

		// Use same guid so caller can remove using origFn
		fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ );
	}
	return elem.each( function() {
		jQuery.event.add( this, types, fn, data, selector );
	} );
}

/*
 * Helper functions for managing events -- not part of the public interface.
 * Props to Dean Edwards' addEvent library for many of the ideas.
 */
jQuery.event = {

	global: {},

	add: function( elem, types, handler, data, selector ) {

		var handleObjIn, eventHandle, tmp,
			events, t, handleObj,
			special, handlers, type, namespaces, origType,
			elemData = dataPriv.get( elem );

		// Don't attach events to noData or text/comment nodes (but allow plain objects)
		if ( !elemData ) {
			return;
		}

		// Caller can pass in an object of custom data in lieu of the handler
		if ( handler.handler ) {
			handleObjIn = handler;
			handler = handleObjIn.handler;
			selector = handleObjIn.selector;
		}

		// Make sure that the handler has a unique ID, used to find/remove it later
		if ( !handler.guid ) {
			handler.guid = jQuery.guid++;
		}

		// Init the element's event structure and main handler, if this is the first
		if ( !( events = elemData.events ) ) {
			events = elemData.events = {};
		}
		if ( !( eventHandle = elemData.handle ) ) {
			eventHandle = elemData.handle = function( e ) {

				// Discard the second event of a jQuery.event.trigger() and
				// when an event is called after a page has unloaded
				return typeof jQuery !== "undefined" && jQuery.event.triggered !== e.type ?
					jQuery.event.dispatch.apply( elem, arguments ) : undefined;
			};
		}

		// Handle multiple events separated by a space
		types = ( types || "" ).match( rnotwhite ) || [ "" ];
		t = types.length;
		while ( t-- ) {
			tmp = rtypenamespace.exec( types[ t ] ) || [];
			type = origType = tmp[ 1 ];
			namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort();

			// There *must* be a type, no attaching namespace-only handlers
			if ( !type ) {
				continue;
			}

			// If event changes its type, use the special event handlers for the changed type
			special = jQuery.event.special[ type ] || {};

			// If selector defined, determine special event api type, otherwise given type
			type = ( selector ? special.delegateType : special.bindType ) || type;

			// Update special based on newly reset type
			special = jQuery.event.special[ type ] || {};

			// handleObj is passed to all event handlers
			handleObj = jQuery.extend( {
				type: type,
				origType: origType,
				data: data,
				handler: handler,
				guid: handler.guid,
				selector: selector,
				needsContext: selector && jQuery.expr.match.needsContext.test( selector ),
				namespace: namespaces.join( "." )
			}, handleObjIn );

			// Init the event handler queue if we're the first
			if ( !( handlers = events[ type ] ) ) {
				handlers = events[ type ] = [];
				handlers.delegateCount = 0;

				// Only use addEventListener if the special events handler returns false
				if ( !special.setup ||
					special.setup.call( elem, data, namespaces, eventHandle ) === false ) {

					if ( elem.addEventListener ) {
						elem.addEventListener( type, eventHandle );
					}
				}
			}

			if ( special.add ) {
				special.add.call( elem, handleObj );

				if ( !handleObj.handler.guid ) {
					handleObj.handler.guid = handler.guid;
				}
			}

			// Add to the element's handler list, delegates in front
			if ( selector ) {
				handlers.splice( handlers.delegateCount++, 0, handleObj );
			} else {
				handlers.push( handleObj );
			}

			// Keep track of which events have ever been used, for event optimization
			jQuery.event.global[ type ] = true;
		}

	},

	// Detach an event or set of events from an element
	remove: function( elem, types, handler, selector, mappedTypes ) {

		var j, origCount, tmp,
			events, t, handleObj,
			special, handlers, type, namespaces, origType,
			elemData = dataPriv.hasData( elem ) && dataPriv.get( elem );

		if ( !elemData || !( events = elemData.events ) ) {
			return;
		}

		// Once for each type.namespace in types; type may be omitted
		types = ( types || "" ).match( rnotwhite ) || [ "" ];
		t = types.length;
		while ( t-- ) {
			tmp = rtypenamespace.exec( types[ t ] ) || [];
			type = origType = tmp[ 1 ];
			namespaces = ( tmp[ 2 ] || "" ).split( "." ).sort();

			// Unbind all events (on this namespace, if provided) for the element
			if ( !type ) {
				for ( type in events ) {
					jQuery.event.remove( elem, type + types[ t ], handler, selector, true );
				}
				continue;
			}

			special = jQuery.event.special[ type ] || {};
			type = ( selector ? special.delegateType : special.bindType ) || type;
			handlers = events[ type ] || [];
			tmp = tmp[ 2 ] &&
				new RegExp( "(^|\\.)" + namespaces.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" );

			// Remove matching events
			origCount = j = handlers.length;
			while ( j-- ) {
				handleObj = handlers[ j ];

				if ( ( mappedTypes || origType === handleObj.origType ) &&
					( !handler || handler.guid === handleObj.guid ) &&
					( !tmp || tmp.test( handleObj.namespace ) ) &&
					( !selector || selector === handleObj.selector ||
						selector === "**" && handleObj.selector ) ) {
					handlers.splice( j, 1 );

					if ( handleObj.selector ) {
						handlers.delegateCount--;
					}
					if ( special.remove ) {
						special.remove.call( elem, handleObj );
					}
				}
			}

			// Remove generic event handler if we removed something and no more handlers exist
			// (avoids potential for endless recursion during removal of special event handlers)
			if ( origCount && !handlers.length ) {
				if ( !special.teardown ||
					special.teardown.call( elem, namespaces, elemData.handle ) === false ) {

					jQuery.removeEvent( elem, type, elemData.handle );
				}

				delete events[ type ];
			}
		}

		// Remove data and the expando if it's no longer used
		if ( jQuery.isEmptyObject( events ) ) {
			dataPriv.remove( elem, "handle events" );
		}
	},

	dispatch: function( event ) {

		// Make a writable jQuery.Event from the native event object
		event = jQuery.event.fix( event );

		var i, j, ret, matched, handleObj,
			handlerQueue = [],
			args = slice.call( arguments ),
			handlers = ( dataPriv.get( this, "events" ) || {} )[ event.type ] || [],
			special = jQuery.event.special[ event.type ] || {};

		// Use the fix-ed jQuery.Event rather than the (read-only) native event
		args[ 0 ] = event;
		event.delegateTarget = this;

		// Call the preDispatch hook for the mapped type, and let it bail if desired
		if ( special.preDispatch && special.preDispatch.call( this, event ) === false ) {
			return;
		}

		// Determine handlers
		handlerQueue = jQuery.event.handlers.call( this, event, handlers );

		// Run delegates first; they may want to stop propagation beneath us
		i = 0;
		while ( ( matched = handlerQueue[ i++ ] ) && !event.isPropagationStopped() ) {
			event.currentTarget = matched.elem;

			j = 0;
			while ( ( handleObj = matched.handlers[ j++ ] ) &&
				!event.isImmediatePropagationStopped() ) {

				// Triggered event must either 1) have no namespace, or 2) have namespace(s)
				// a subset or equal to those in the bound event (both can have no namespace).
				if ( !event.rnamespace || event.rnamespace.test( handleObj.namespace ) ) {

					event.handleObj = handleObj;
					event.data = handleObj.data;

					ret = ( ( jQuery.event.special[ handleObj.origType ] || {} ).handle ||
						handleObj.handler ).apply( matched.elem, args );

					if ( ret !== undefined ) {
						if ( ( event.result = ret ) === false ) {
							event.preventDefault();
							event.stopPropagation();
						}
					}
				}
			}
		}

		// Call the postDispatch hook for the mapped type
		if ( special.postDispatch ) {
			special.postDispatch.call( this, event );
		}

		return event.result;
	},

	handlers: function( event, handlers ) {
		var i, matches, sel, handleObj,
			handlerQueue = [],
			delegateCount = handlers.delegateCount,
			cur = event.target;

		// Support (at least): Chrome, IE9
		// Find delegate handlers
		// Black-hole SVG <use> instance trees (#13180)
		//
		// Support: Firefox<=42+
		// Avoid non-left-click in FF but don't block IE radio events (#3861, gh-2343)
		if ( delegateCount && cur.nodeType &&
			( event.type !== "click" || isNaN( event.button ) || event.button < 1 ) ) {

			for ( ; cur !== this; cur = cur.parentNode || this ) {

				// Don't check non-elements (#13208)
				// Don't process clicks on disabled elements (#6911, #8165, #11382, #11764)
				if ( cur.nodeType === 1 && ( cur.disabled !== true || event.type !== "click" ) ) {
					matches = [];
					for ( i = 0; i < delegateCount; i++ ) {
						handleObj = handlers[ i ];

						// Don't conflict with Object.prototype properties (#13203)
						sel = handleObj.selector + " ";

						if ( matches[ sel ] === undefined ) {
							matches[ sel ] = handleObj.needsContext ?
								jQuery( sel, this ).index( cur ) > -1 :
								jQuery.find( sel, this, null, [ cur ] ).length;
						}
						if ( matches[ sel ] ) {
							matches.push( handleObj );
						}
					}
					if ( matches.length ) {
						handlerQueue.push( { elem: cur, handlers: matches } );
					}
				}
			}
		}

		// Add the remaining (directly-bound) handlers
		if ( delegateCount < handlers.length ) {
			handlerQueue.push( { elem: this, handlers: handlers.slice( delegateCount ) } );
		}

		return handlerQueue;
	},

	// Includes some event props shared by KeyEvent and MouseEvent
	props: ( "altKey bubbles cancelable ctrlKey currentTarget detail eventPhase " +
		"metaKey relatedTarget shiftKey target timeStamp view which" ).split( " " ),

	fixHooks: {},

	keyHooks: {
		props: "char charCode key keyCode".split( " " ),
		filter: function( event, original ) {

			// Add which for key events
			if ( event.which == null ) {
				event.which = original.charCode != null ? original.charCode : original.keyCode;
			}

			return event;
		}
	},

	mouseHooks: {
		props: ( "button buttons clientX clientY offsetX offsetY pageX pageY " +
			"screenX screenY toElement" ).split( " " ),
		filter: function( event, original ) {
			var eventDoc, doc, body,
				button = original.button;

			// Calculate pageX/Y if missing and clientX/Y available
			if ( event.pageX == null && original.clientX != null ) {
				eventDoc = event.target.ownerDocument || document;
				doc = eventDoc.documentElement;
				body = eventDoc.body;

				event.pageX = original.clientX +
					( doc && doc.scrollLeft || body && body.scrollLeft || 0 ) -
					( doc && doc.clientLeft || body && body.clientLeft || 0 );
				event.pageY = original.clientY +
					( doc && doc.scrollTop  || body && body.scrollTop  || 0 ) -
					( doc && doc.clientTop  || body && body.clientTop  || 0 );
			}

			// Add which for click: 1 === left; 2 === middle; 3 === right
			// Note: button is not normalized, so don't use it
			if ( !event.which && button !== undefined ) {
				event.which = ( button & 1 ? 1 : ( button & 2 ? 3 : ( button & 4 ? 2 : 0 ) ) );
			}

			return event;
		}
	},

	fix: function( event ) {
		if ( event[ jQuery.expando ] ) {
			return event;
		}

		// Create a writable copy of the event object and normalize some properties
		var i, prop, copy,
			type = event.type,
			originalEvent = event,
			fixHook = this.fixHooks[ type ];

		if ( !fixHook ) {
			this.fixHooks[ type ] = fixHook =
				rmouseEvent.test( type ) ? this.mouseHooks :
				rkeyEvent.test( type ) ? this.keyHooks :
				{};
		}
		copy = fixHook.props ? this.props.concat( fixHook.props ) : this.props;

		event = new jQuery.Event( originalEvent );

		i = copy.length;
		while ( i-- ) {
			prop = copy[ i ];
			event[ prop ] = originalEvent[ prop ];
		}

		// Support: Cordova 2.5 (WebKit) (#13255)
		// All events should have a target; Cordova deviceready doesn't
		if ( !event.target ) {
			event.target = document;
		}

		// Support: Safari 6.0+, Chrome<28
		// Target should not be a text node (#504, #13143)
		if ( event.target.nodeType === 3 ) {
			event.target = event.target.parentNode;
		}

		return fixHook.filter ? fixHook.filter( event, originalEvent ) : event;
	},

	special: {
		load: {

			// Prevent triggered image.load events from bubbling to window.load
			noBubble: true
		},
		focus: {

			// Fire native event if possible so blur/focus sequence is correct
			trigger: function() {
				if ( this !== safeActiveElement() && this.focus ) {
					this.focus();
					return false;
				}
			},
			delegateType: "focusin"
		},
		blur: {
			trigger: function() {
				if ( this === safeActiveElement() && this.blur ) {
					this.blur();
					return false;
				}
			},
			delegateType: "focusout"
		},
		click: {

			// For checkbox, fire native event so checked state will be right
			trigger: function() {
				if ( this.type === "checkbox" && this.click && jQuery.nodeName( this, "input" ) ) {
					this.click();
					return false;
				}
			},

			// For cross-browser consistency, don't fire native .click() on links
			_default: function( event ) {
				return jQuery.nodeName( event.target, "a" );
			}
		},

		beforeunload: {
			postDispatch: function( event ) {

				// Support: Firefox 20+
				// Firefox doesn't alert if the returnValue field is not set.
				if ( event.result !== undefined && event.originalEvent ) {
					event.originalEvent.returnValue = event.result;
				}
			}
		}
	}
};

jQuery.removeEvent = function( elem, type, handle ) {

	// This "if" is needed for plain objects
	if ( elem.removeEventListener ) {
		elem.removeEventListener( type, handle );
	}
};

jQuery.Event = function( src, props ) {

	// Allow instantiation without the 'new' keyword
	if ( !( this instanceof jQuery.Event ) ) {
		return new jQuery.Event( src, props );
	}

	// Event object
	if ( src && src.type ) {
		this.originalEvent = src;
		this.type = src.type;

		// Events bubbling up the document may have been marked as prevented
		// by a handler lower down the tree; reflect the correct value.
		this.isDefaultPrevented = src.defaultPrevented ||
				src.defaultPrevented === undefined &&

				// Support: Android<4.0
				src.returnValue === false ?
			returnTrue :
			returnFalse;

	// Event type
	} else {
		this.type = src;
	}

	// Put explicitly provided properties onto the event object
	if ( props ) {
		jQuery.extend( this, props );
	}

	// Create a timestamp if incoming event doesn't have one
	this.timeStamp = src && src.timeStamp || jQuery.now();

	// Mark it as fixed
	this[ jQuery.expando ] = true;
};

// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding
// http://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html
jQuery.Event.prototype = {
	constructor: jQuery.Event,
	isDefaultPrevented: returnFalse,
	isPropagationStopped: returnFalse,
	isImmediatePropagationStopped: returnFalse,
	isSimulated: false,

	preventDefault: function() {
		var e = this.originalEvent;

		this.isDefaultPrevented = returnTrue;

		if ( e && !this.isSimulated ) {
			e.preventDefault();
		}
	},
	stopPropagation: function() {
		var e = this.originalEvent;

		this.isPropagationStopped = returnTrue;

		if ( e && !this.isSimulated ) {
			e.stopPropagation();
		}
	},
	stopImmediatePropagation: function() {
		var e = this.originalEvent;

		this.isImmediatePropagationStopped = returnTrue;

		if ( e && !this.isSimulated ) {
			e.stopImmediatePropagation();
		}

		this.stopPropagation();
	}
};

// Create mouseenter/leave events using mouseover/out and event-time checks
// so that event delegation works in jQuery.
// Do the same for pointerenter/pointerleave and pointerover/pointerout
//
// Support: Safari 7 only
// Safari sends mouseenter too often; see:
// https://code.google.com/p/chromium/issues/detail?id=470258
// for the description of the bug (it existed in older Chrome versions as well).
jQuery.each( {
	mouseenter: "mouseover",
	mouseleave: "mouseout",
	pointerenter: "pointerover",
	pointerleave: "pointerout"
}, function( orig, fix ) {
	jQuery.event.special[ orig ] = {
		delegateType: fix,
		bindType: fix,

		handle: function( event ) {
			var ret,
				target = this,
				related = event.relatedTarget,
				handleObj = event.handleObj;

			// For mouseenter/leave call the handler if related is outside the target.
			// NB: No relatedTarget if the mouse left/entered the browser window
			if ( !related || ( related !== target && !jQuery.contains( target, related ) ) ) {
				event.type = handleObj.origType;
				ret = handleObj.handler.apply( this, arguments );
				event.type = fix;
			}
			return ret;
		}
	};
} );

jQuery.fn.extend( {
	on: function( types, selector, data, fn ) {
		return on( this, types, selector, data, fn );
	},
	one: function( types, selector, data, fn ) {
		return on( this, types, selector, data, fn, 1 );
	},
	off: function( types, selector, fn ) {
		var handleObj, type;
		if ( types && types.preventDefault && types.handleObj ) {

			// ( event )  dispatched jQuery.Event
			handleObj = types.handleObj;
			jQuery( types.delegateTarget ).off(
				handleObj.namespace ?
					handleObj.origType + "." + handleObj.namespace :
					handleObj.origType,
				handleObj.selector,
				handleObj.handler
			);
			return this;
		}
		if ( typeof types === "object" ) {

			// ( types-object [, selector] )
			for ( type in types ) {
				this.off( type, selector, types[ type ] );
			}
			return this;
		}
		if ( selector === false || typeof selector === "function" ) {

			// ( types [, fn] )
			fn = selector;
			selector = undefined;
		}
		if ( fn === false ) {
			fn = returnFalse;
		}
		return this.each( function() {
			jQuery.event.remove( this, types, fn, selector );
		} );
	}
} );


var
	rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:-]+)[^>]*)\/>/gi,

	// Support: IE 10-11, Edge 10240+
	// In IE/Edge using regex groups here causes severe slowdowns.
	// See https://connect.microsoft.com/IE/feedback/details/1736512/
	rnoInnerhtml = /<script|<style|<link/i,

	// checked="checked" or checked
	rchecked = /checked\s*(?:[^=]|=\s*.checked.)/i,
	rscriptTypeMasked = /^true\/(.*)/,
	rcleanScript = /^\s*<!(?:\[CDATA\[|--)|(?:\]\]|--)>\s*$/g;

// Manipulating tables requires a tbody
function manipulationTarget( elem, content ) {
	return jQuery.nodeName( elem, "table" ) &&
		jQuery.nodeName( content.nodeType !== 11 ? content : content.firstChild, "tr" ) ?

		elem.getElementsByTagName( "tbody" )[ 0 ] ||
			elem.appendChild( elem.ownerDocument.createElement( "tbody" ) ) :
		elem;
}

// Replace/restore the type attribute of script elements for safe DOM manipulation
function disableScript( elem ) {
	elem.type = ( elem.getAttribute( "type" ) !== null ) + "/" + elem.type;
	return elem;
}
function restoreScript( elem ) {
	var match = rscriptTypeMasked.exec( elem.type );

	if ( match ) {
		elem.type = match[ 1 ];
	} else {
		elem.removeAttribute( "type" );
	}

	return elem;
}

function cloneCopyEvent( src, dest ) {
	var i, l, type, pdataOld, pdataCur, udataOld, udataCur, events;

	if ( dest.nodeType !== 1 ) {
		return;
	}

	// 1. Copy private data: events, handlers, etc.
	if ( dataPriv.hasData( src ) ) {
		pdataOld = dataPriv.access( src );
		pdataCur = dataPriv.set( dest, pdataOld );
		events = pdataOld.events;

		if ( events ) {
			delete pdataCur.handle;
			pdataCur.events = {};

			for ( type in events ) {
				for ( i = 0, l = events[ type ].length; i < l; i++ ) {
					jQuery.event.add( dest, type, events[ type ][ i ] );
				}
			}
		}
	}

	// 2. Copy user data
	if ( dataUser.hasData( src ) ) {
		udataOld = dataUser.access( src );
		udataCur = jQuery.extend( {}, udataOld );

		dataUser.set( dest, udataCur );
	}
}

// Fix IE bugs, see support tests
function fixInput( src, dest ) {
	var nodeName = dest.nodeName.toLowerCase();

	// Fails to persist the checked state of a cloned checkbox or radio button.
	if ( nodeName === "input" && rcheckableType.test( src.type ) ) {
		dest.checked = src.checked;

	// Fails to return the selected option to the default selected state when cloning options
	} else if ( nodeName === "input" || nodeName === "textarea" ) {
		dest.defaultValue = src.defaultValue;
	}
}

function domManip( collection, args, callback, ignored ) {

	// Flatten any nested arrays
	args = concat.apply( [], args );

	var fragment, first, scripts, hasScripts, node, doc,
		i = 0,
		l = collection.length,
		iNoClone = l - 1,
		value = args[ 0 ],
		isFunction = jQuery.isFunction( value );

	// We can't cloneNode fragments that contain checked, in WebKit
	if ( isFunction ||
			( l > 1 && typeof value === "string" &&
				!support.checkClone && rchecked.test( value ) ) ) {
		return collection.each( function( index ) {
			var self = collection.eq( index );
			if ( isFunction ) {
				args[ 0 ] = value.call( this, index, self.html() );
			}
			domManip( self, args, callback, ignored );
		} );
	}

	if ( l ) {
		fragment = buildFragment( args, collection[ 0 ].ownerDocument, false, collection, ignored );
		first = fragment.firstChild;

		if ( fragment.childNodes.length === 1 ) {
			fragment = first;
		}

		// Require either new content or an interest in ignored elements to invoke the callback
		if ( first || ignored ) {
			scripts = jQuery.map( getAll( fragment, "script" ), disableScript );
			hasScripts = scripts.length;

			// Use the original fragment for the last item
			// instead of the first because it can end up
			// being emptied incorrectly in certain situations (#8070).
			for ( ; i < l; i++ ) {
				node = fragment;

				if ( i !== iNoClone ) {
					node = jQuery.clone( node, true, true );

					// Keep references to cloned scripts for later restoration
					if ( hasScripts ) {

						// Support: Android<4.1, PhantomJS<2
						// push.apply(_, arraylike) throws on ancient WebKit
						jQuery.merge( scripts, getAll( node, "script" ) );
					}
				}

				callback.call( collection[ i ], node, i );
			}

			if ( hasScripts ) {
				doc = scripts[ scripts.length - 1 ].ownerDocument;

				// Reenable scripts
				jQuery.map( scripts, restoreScript );

				// Evaluate executable scripts on first document insertion
				for ( i = 0; i < hasScripts; i++ ) {
					node = scripts[ i ];
					if ( rscriptType.test( node.type || "" ) &&
						!dataPriv.access( node, "globalEval" ) &&
						jQuery.contains( doc, node ) ) {

						if ( node.src ) {

							// Optional AJAX dependency, but won't run scripts if not present
							if ( jQuery._evalUrl ) {
								jQuery._evalUrl( node.src );
							}
						} else {
							jQuery.globalEval( node.textContent.replace( rcleanScript, "" ) );
						}
					}
				}
			}
		}
	}

	return collection;
}

function remove( elem, selector, keepData ) {
	var node,
		nodes = selector ? jQuery.filter( selector, elem ) : elem,
		i = 0;

	for ( ; ( node = nodes[ i ] ) != null; i++ ) {
		if ( !keepData && node.nodeType === 1 ) {
			jQuery.cleanData( getAll( node ) );
		}

		if ( node.parentNode ) {
			if ( keepData && jQuery.contains( node.ownerDocument, node ) ) {
				setGlobalEval( getAll( node, "script" ) );
			}
			node.parentNode.removeChild( node );
		}
	}

	return elem;
}

jQuery.extend( {
	htmlPrefilter: function( html ) {
		return html.replace( rxhtmlTag, "<$1></$2>" );
	},

	clone: function( elem, dataAndEvents, deepDataAndEvents ) {
		var i, l, srcElements, destElements,
			clone = elem.cloneNode( true ),
			inPage = jQuery.contains( elem.ownerDocument, elem );

		// Fix IE cloning issues
		if ( !support.noCloneChecked && ( elem.nodeType === 1 || elem.nodeType === 11 ) &&
				!jQuery.isXMLDoc( elem ) ) {

			// We eschew Sizzle here for performance reasons: http://jsperf.com/getall-vs-sizzle/2
			destElements = getAll( clone );
			srcElements = getAll( elem );

			for ( i = 0, l = srcElements.length; i < l; i++ ) {
				fixInput( srcElements[ i ], destElements[ i ] );
			}
		}

		// Copy the events from the original to the clone
		if ( dataAndEvents ) {
			if ( deepDataAndEvents ) {
				srcElements = srcElements || getAll( elem );
				destElements = destElements || getAll( clone );

				for ( i = 0, l = srcElements.length; i < l; i++ ) {
					cloneCopyEvent( srcElements[ i ], destElements[ i ] );
				}
			} else {
				cloneCopyEvent( elem, clone );
			}
		}

		// Preserve script evaluation history
		destElements = getAll( clone, "script" );
		if ( destElements.length > 0 ) {
			setGlobalEval( destElements, !inPage && getAll( elem, "script" ) );
		}

		// Return the cloned set
		return clone;
	},

	cleanData: function( elems ) {
		var data, elem, type,
			special = jQuery.event.special,
			i = 0;

		for ( ; ( elem = elems[ i ] ) !== undefined; i++ ) {
			if ( acceptData( elem ) ) {
				if ( ( data = elem[ dataPriv.expando ] ) ) {
					if ( data.events ) {
						for ( type in data.events ) {
							if ( special[ type ] ) {
								jQuery.event.remove( elem, type );

							// This is a shortcut to avoid jQuery.event.remove's overhead
							} else {
								jQuery.removeEvent( elem, type, data.handle );
							}
						}
					}

					// Support: Chrome <= 35-45+
					// Assign undefined instead of using delete, see Data#remove
					elem[ dataPriv.expando ] = undefined;
				}
				if ( elem[ dataUser.expando ] ) {

					// Support: Chrome <= 35-45+
					// Assign undefined instead of using delete, see Data#remove
					elem[ dataUser.expando ] = undefined;
				}
			}
		}
	}
} );

jQuery.fn.extend( {

	// Keep domManip exposed until 3.0 (gh-2225)
	domManip: domManip,

	detach: function( selector ) {
		return remove( this, selector, true );
	},

	remove: function( selector ) {
		return remove( this, selector );
	},

	text: function( value ) {
		return access( this, function( value ) {
			return value === undefined ?
				jQuery.text( this ) :
				this.empty().each( function() {
					if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {
						this.textContent = value;
					}
				} );
		}, null, value, arguments.length );
	},

	append: function() {
		return domManip( this, arguments, function( elem ) {
			if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {
				var target = manipulationTarget( this, elem );
				target.appendChild( elem );
			}
		} );
	},

	prepend: function() {
		return domManip( this, arguments, function( elem ) {
			if ( this.nodeType === 1 || this.nodeType === 11 || this.nodeType === 9 ) {
				var target = manipulationTarget( this, elem );
				target.insertBefore( elem, target.firstChild );
			}
		} );
	},

	before: function() {
		return domManip( this, arguments, function( elem ) {
			if ( this.parentNode ) {
				this.parentNode.insertBefore( elem, this );
			}
		} );
	},

	after: function() {
		return domManip( this, arguments, function( elem ) {
			if ( this.parentNode ) {
				this.parentNode.insertBefore( elem, this.nextSibling );
			}
		} );
	},

	empty: function() {
		var elem,
			i = 0;

		for ( ; ( elem = this[ i ] ) != null; i++ ) {
			if ( elem.nodeType === 1 ) {

				// Prevent memory leaks
				jQuery.cleanData( getAll( elem, false ) );

				// Remove any remaining nodes
				elem.textContent = "";
			}
		}

		return this;
	},

	clone: function( dataAndEvents, deepDataAndEvents ) {
		dataAndEvents = dataAndEvents == null ? false : dataAndEvents;
		deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents;

		return this.map( function() {
			return jQuery.clone( this, dataAndEvents, deepDataAndEvents );
		} );
	},

	html: function( value ) {
		return access( this, function( value ) {
			var elem = this[ 0 ] || {},
				i = 0,
				l = this.length;

			if ( value === undefined && elem.nodeType === 1 ) {
				return elem.innerHTML;
			}

			// See if we can take a shortcut and just use innerHTML
			if ( typeof value === "string" && !rnoInnerhtml.test( value ) &&
				!wrapMap[ ( rtagName.exec( value ) || [ "", "" ] )[ 1 ].toLowerCase() ] ) {

				value = jQuery.htmlPrefilter( value );

				try {
					for ( ; i < l; i++ ) {
						elem = this[ i ] || {};

						// Remove element nodes and prevent memory leaks
						if ( elem.nodeType === 1 ) {
							jQuery.cleanData( getAll( elem, false ) );
							elem.innerHTML = value;
						}
					}

					elem = 0;

				// If using innerHTML throws an exception, use the fallback method
				} catch ( e ) {}
			}

			if ( elem ) {
				this.empty().append( value );
			}
		}, null, value, arguments.length );
	},

	replaceWith: function() {
		var ignored = [];

		// Make the changes, replacing each non-ignored context element with the new content
		return domManip( this, arguments, function( elem ) {
			var parent = this.parentNode;

			if ( jQuery.inArray( this, ignored ) < 0 ) {
				jQuery.cleanData( getAll( this ) );
				if ( parent ) {
					parent.replaceChild( elem, this );
				}
			}

		// Force callback invocation
		}, ignored );
	}
} );

jQuery.each( {
	appendTo: "append",
	prependTo: "prepend",
	insertBefore: "before",
	insertAfter: "after",
	replaceAll: "replaceWith"
}, function( name, original ) {
	jQuery.fn[ name ] = function( selector ) {
		var elems,
			ret = [],
			insert = jQuery( selector ),
			last = insert.length - 1,
			i = 0;

		for ( ; i <= last; i++ ) {
			elems = i === last ? this : this.clone( true );
			jQuery( insert[ i ] )[ original ]( elems );

			// Support: QtWebKit
			// .get() because push.apply(_, arraylike) throws
			push.apply( ret, elems.get() );
		}

		return this.pushStack( ret );
	};
} );


var iframe,
	elemdisplay = {

		// Support: Firefox
		// We have to pre-define these values for FF (#10227)
		HTML: "block",
		BODY: "block"
	};

/**
 * Retrieve the actual display of a element
 * @param {String} name nodeName of the element
 * @param {Object} doc Document object
 */

// Called only from within defaultDisplay
function actualDisplay( name, doc ) {
	var elem = jQuery( doc.createElement( name ) ).appendTo( doc.body ),

		display = jQuery.css( elem[ 0 ], "display" );

	// We don't have any data stored on the element,
	// so use "detach" method as fast way to get rid of the element
	elem.detach();

	return display;
}

/**
 * Try to determine the default display value of an element
 * @param {String} nodeName
 */
function defaultDisplay( nodeName ) {
	var doc = document,
		display = elemdisplay[ nodeName ];

	if ( !display ) {
		display = actualDisplay( nodeName, doc );

		// If the simple way fails, read from inside an iframe
		if ( display === "none" || !display ) {

			// Use the already-created iframe if possible
			iframe = ( iframe || jQuery( "<iframe frameborder='0' width='0' height='0'/>" ) )
				.appendTo( doc.documentElement );

			// Always write a new HTML skeleton so Webkit and Firefox don't choke on reuse
			doc = iframe[ 0 ].contentDocument;

			// Support: IE
			doc.write();
			doc.close();

			display = actualDisplay( nodeName, doc );
			iframe.detach();
		}

		// Store the correct default display
		elemdisplay[ nodeName ] = display;
	}

	return display;
}
var rmargin = ( /^margin/ );

var rnumnonpx = new RegExp( "^(" + pnum + ")(?!px)[a-z%]+$", "i" );

var getStyles = function( elem ) {

		// Support: IE<=11+, Firefox<=30+ (#15098, #14150)
		// IE throws on elements created in popups
		// FF meanwhile throws on frame elements through "defaultView.getComputedStyle"
		var view = elem.ownerDocument.defaultView;

		if ( !view || !view.opener ) {
			view = window;
		}

		return view.getComputedStyle( elem );
	};

var swap = function( elem, options, callback, args ) {
	var ret, name,
		old = {};

	// Remember the old values, and insert the new ones
	for ( name in options ) {
		old[ name ] = elem.style[ name ];
		elem.style[ name ] = options[ name ];
	}

	ret = callback.apply( elem, args || [] );

	// Revert the old values
	for ( name in options ) {
		elem.style[ name ] = old[ name ];
	}

	return ret;
};


var documentElement = document.documentElement;



( function() {
	var pixelPositionVal, boxSizingReliableVal, pixelMarginRightVal, reliableMarginLeftVal,
		container = document.createElement( "div" ),
		div = document.createElement( "div" );

	// Finish early in limited (non-browser) environments
	if ( !div.style ) {
		return;
	}

	// Support: IE9-11+
	// Style of cloned element affects source element cloned (#8908)
	div.style.backgroundClip = "content-box";
	div.cloneNode( true ).style.backgroundClip = "";
	support.clearCloneStyle = div.style.backgroundClip === "content-box";

	container.style.cssText = "border:0;width:8px;height:0;top:0;left:-9999px;" +
		"padding:0;margin-top:1px;position:absolute";
	container.appendChild( div );

	// Executing both pixelPosition & boxSizingReliable tests require only one layout
	// so they're executed at the same time to save the second computation.
	function computeStyleTests() {
		div.style.cssText =

			// Support: Firefox<29, Android 2.3
			// Vendor-prefix box-sizing
			"-webkit-box-sizing:border-box;-moz-box-sizing:border-box;box-sizing:border-box;" +
			"position:relative;display:block;" +
			"margin:auto;border:1px;padding:1px;" +
			"top:1%;width:50%";
		div.innerHTML = "";
		documentElement.appendChild( container );

		var divStyle = window.getComputedStyle( div );
		pixelPositionVal = divStyle.top !== "1%";
		reliableMarginLeftVal = divStyle.marginLeft === "2px";
		boxSizingReliableVal = divStyle.width === "4px";

		// Support: Android 4.0 - 4.3 only
		// Some styles come back with percentage values, even though they shouldn't
		div.style.marginRight = "50%";
		pixelMarginRightVal = divStyle.marginRight === "4px";

		documentElement.removeChild( container );
	}

	jQuery.extend( support, {
		pixelPosition: function() {

			// This test is executed only once but we still do memoizing
			// since we can use the boxSizingReliable pre-computing.
			// No need to check if the test was already performed, though.
			computeStyleTests();
			return pixelPositionVal;
		},
		boxSizingReliable: function() {
			if ( boxSizingReliableVal == null ) {
				computeStyleTests();
			}
			return boxSizingReliableVal;
		},
		pixelMarginRight: function() {

			// Support: Android 4.0-4.3
			// We're checking for boxSizingReliableVal here instead of pixelMarginRightVal
			// since that compresses better and they're computed together anyway.
			if ( boxSizingReliableVal == null ) {
				computeStyleTests();
			}
			return pixelMarginRightVal;
		},
		reliableMarginLeft: function() {

			// Support: IE <=8 only, Android 4.0 - 4.3 only, Firefox <=3 - 37
			if ( boxSizingReliableVal == null ) {
				computeStyleTests();
			}
			return reliableMarginLeftVal;
		},
		reliableMarginRight: function() {

			// Support: Android 2.3
			// Check if div with explicit width and no margin-right incorrectly
			// gets computed margin-right based on width of container. (#3333)
			// WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right
			// This support function is only executed once so no memoizing is needed.
			var ret,
				marginDiv = div.appendChild( document.createElement( "div" ) );

			// Reset CSS: box-sizing; display; margin; border; padding
			marginDiv.style.cssText = div.style.cssText =

				// Support: Android 2.3
				// Vendor-prefix box-sizing
				"-webkit-box-sizing:content-box;box-sizing:content-box;" +
				"display:block;margin:0;border:0;padding:0";
			marginDiv.style.marginRight = marginDiv.style.width = "0";
			div.style.width = "1px";
			documentElement.appendChild( container );

			ret = !parseFloat( window.getComputedStyle( marginDiv ).marginRight );

			documentElement.removeChild( container );
			div.removeChild( marginDiv );

			return ret;
		}
	} );
} )();


function curCSS( elem, name, computed ) {
	var width, minWidth, maxWidth, ret,
		style = elem.style;

	computed = computed || getStyles( elem );
	ret = computed ? computed.getPropertyValue( name ) || computed[ name ] : undefined;

	// Support: Opera 12.1x only
	// Fall back to style even without computed
	// computed is undefined for elems on document fragments
	if ( ( ret === "" || ret === undefined ) && !jQuery.contains( elem.ownerDocument, elem ) ) {
		ret = jQuery.style( elem, name );
	}

	// Support: IE9
	// getPropertyValue is only needed for .css('filter') (#12537)
	if ( computed ) {

		// A tribute to the "awesome hack by Dean Edwards"
		// Android Browser returns percentage for some values,
		// but width seems to be reliably pixels.
		// This is against the CSSOM draft spec:
		// http://dev.w3.org/csswg/cssom/#resolved-values
		if ( !support.pixelMarginRight() && rnumnonpx.test( ret ) && rmargin.test( name ) ) {

			// Remember the original values
			width = style.width;
			minWidth = style.minWidth;
			maxWidth = style.maxWidth;

			// Put in the new values to get a computed value out
			style.minWidth = style.maxWidth = style.width = ret;
			ret = computed.width;

			// Revert the changed values
			style.width = width;
			style.minWidth = minWidth;
			style.maxWidth = maxWidth;
		}
	}

	return ret !== undefined ?

		// Support: IE9-11+
		// IE returns zIndex value as an integer.
		ret + "" :
		ret;
}


function addGetHookIf( conditionFn, hookFn ) {

	// Define the hook, we'll check on the first run if it's really needed.
	return {
		get: function() {
			if ( conditionFn() ) {

				// Hook not needed (or it's not possible to use it due
				// to missing dependency), remove it.
				delete this.get;
				return;
			}

			// Hook needed; redefine it so that the support test is not executed again.
			return ( this.get = hookFn ).apply( this, arguments );
		}
	};
}


var

	// Swappable if display is none or starts with table
	// except "table", "table-cell", or "table-caption"
	// See here for display values: https://developer.mozilla.org/en-US/docs/CSS/display
	rdisplayswap = /^(none|table(?!-c[ea]).+)/,

	cssShow = { position: "absolute", visibility: "hidden", display: "block" },
	cssNormalTransform = {
		letterSpacing: "0",
		fontWeight: "400"
	},

	cssPrefixes = [ "Webkit", "O", "Moz", "ms" ],
	emptyStyle = document.createElement( "div" ).style;

// Return a css property mapped to a potentially vendor prefixed property
function vendorPropName( name ) {

	// Shortcut for names that are not vendor prefixed
	if ( name in emptyStyle ) {
		return name;
	}

	// Check for vendor prefixed names
	var capName = name[ 0 ].toUpperCase() + name.slice( 1 ),
		i = cssPrefixes.length;

	while ( i-- ) {
		name = cssPrefixes[ i ] + capName;
		if ( name in emptyStyle ) {
			return name;
		}
	}
}

function setPositiveNumber( elem, value, subtract ) {

	// Any relative (+/-) values have already been
	// normalized at this point
	var matches = rcssNum.exec( value );
	return matches ?

		// Guard against undefined "subtract", e.g., when used as in cssHooks
		Math.max( 0, matches[ 2 ] - ( subtract || 0 ) ) + ( matches[ 3 ] || "px" ) :
		value;
}

function augmentWidthOrHeight( elem, name, extra, isBorderBox, styles ) {
	var i = extra === ( isBorderBox ? "border" : "content" ) ?

		// If we already have the right measurement, avoid augmentation
		4 :

		// Otherwise initialize for horizontal or vertical properties
		name === "width" ? 1 : 0,

		val = 0;

	for ( ; i < 4; i += 2 ) {

		// Both box models exclude margin, so add it if we want it
		if ( extra === "margin" ) {
			val += jQuery.css( elem, extra + cssExpand[ i ], true, styles );
		}

		if ( isBorderBox ) {

			// border-box includes padding, so remove it if we want content
			if ( extra === "content" ) {
				val -= jQuery.css( elem, "padding" + cssExpand[ i ], true, styles );
			}

			// At this point, extra isn't border nor margin, so remove border
			if ( extra !== "margin" ) {
				val -= jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles );
			}
		} else {

			// At this point, extra isn't content, so add padding
			val += jQuery.css( elem, "padding" + cssExpand[ i ], true, styles );

			// At this point, extra isn't content nor padding, so add border
			if ( extra !== "padding" ) {
				val += jQuery.css( elem, "border" + cssExpand[ i ] + "Width", true, styles );
			}
		}
	}

	return val;
}

function getWidthOrHeight( elem, name, extra ) {

	// Start with offset property, which is equivalent to the border-box value
	var valueIsBorderBox = true,
		val = name === "width" ? elem.offsetWidth : elem.offsetHeight,
		styles = getStyles( elem ),
		isBorderBox = jQuery.css( elem, "boxSizing", false, styles ) === "border-box";

	// Some non-html elements return undefined for offsetWidth, so check for null/undefined
	// svg - https://bugzilla.mozilla.org/show_bug.cgi?id=649285
	// MathML - https://bugzilla.mozilla.org/show_bug.cgi?id=491668
	if ( val <= 0 || val == null ) {

		// Fall back to computed then uncomputed css if necessary
		val = curCSS( elem, name, styles );
		if ( val < 0 || val == null ) {
			val = elem.style[ name ];
		}

		// Computed unit is not pixels. Stop here and return.
		if ( rnumnonpx.test( val ) ) {
			return val;
		}

		// Check for style in case a browser which returns unreliable values
		// for getComputedStyle silently falls back to the reliable elem.style
		valueIsBorderBox = isBorderBox &&
			( support.boxSizingReliable() || val === elem.style[ name ] );

		// Normalize "", auto, and prepare for extra
		val = parseFloat( val ) || 0;
	}

	// Use the active box-sizing model to add/subtract irrelevant styles
	return ( val +
		augmentWidthOrHeight(
			elem,
			name,
			extra || ( isBorderBox ? "border" : "content" ),
			valueIsBorderBox,
			styles
		)
	) + "px";
}

function showHide( elements, show ) {
	var display, elem, hidden,
		values = [],
		index = 0,
		length = elements.length;

	for ( ; index < length; index++ ) {
		elem = elements[ index ];
		if ( !elem.style ) {
			continue;
		}

		values[ index ] = dataPriv.get( elem, "olddisplay" );
		display = elem.style.display;
		if ( show ) {

			// Reset the inline display of this element to learn if it is
			// being hidden by cascaded rules or not
			if ( !values[ index ] && display === "none" ) {
				elem.style.display = "";
			}

			// Set elements which have been overridden with display: none
			// in a stylesheet to whatever the default browser style is
			// for such an element
			if ( elem.style.display === "" && isHidden( elem ) ) {
				values[ index ] = dataPriv.access(
					elem,
					"olddisplay",
					defaultDisplay( elem.nodeName )
				);
			}
		} else {
			hidden = isHidden( elem );

			if ( display !== "none" || !hidden ) {
				dataPriv.set(
					elem,
					"olddisplay",
					hidden ? display : jQuery.css( elem, "display" )
				);
			}
		}
	}

	// Set the display of most of the elements in a second loop
	// to avoid the constant reflow
	for ( index = 0; index < length; index++ ) {
		elem = elements[ index ];
		if ( !elem.style ) {
			continue;
		}
		if ( !show || elem.style.display === "none" || elem.style.display === "" ) {
			elem.style.display = show ? values[ index ] || "" : "none";
		}
	}

	return elements;
}

jQuery.extend( {

	// Add in style property hooks for overriding the default
	// behavior of getting and setting a style property
	cssHooks: {
		opacity: {
			get: function( elem, computed ) {
				if ( computed ) {

					// We should always get a number back from opacity
					var ret = curCSS( elem, "opacity" );
					return ret === "" ? "1" : ret;
				}
			}
		}
	},

	// Don't automatically add "px" to these possibly-unitless properties
	cssNumber: {
		"animationIterationCount": true,
		"columnCount": true,
		"fillOpacity": true,
		"flexGrow": true,
		"flexShrink": true,
		"fontWeight": true,
		"lineHeight": true,
		"opacity": true,
		"order": true,
		"orphans": true,
		"widows": true,
		"zIndex": true,
		"zoom": true
	},

	// Add in properties whose names you wish to fix before
	// setting or getting the value
	cssProps: {
		"float": "cssFloat"
	},

	// Get and set the style property on a DOM Node
	style: function( elem, name, value, extra ) {

		// Don't set styles on text and comment nodes
		if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) {
			return;
		}

		// Make sure that we're working with the right name
		var ret, type, hooks,
			origName = jQuery.camelCase( name ),
			style = elem.style;

		name = jQuery.cssProps[ origName ] ||
			( jQuery.cssProps[ origName ] = vendorPropName( origName ) || origName );

		// Gets hook for the prefixed version, then unprefixed version
		hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];

		// Check if we're setting a value
		if ( value !== undefined ) {
			type = typeof value;

			// Convert "+=" or "-=" to relative numbers (#7345)
			if ( type === "string" && ( ret = rcssNum.exec( value ) ) && ret[ 1 ] ) {
				value = adjustCSS( elem, name, ret );

				// Fixes bug #9237
				type = "number";
			}

			// Make sure that null and NaN values aren't set (#7116)
			if ( value == null || value !== value ) {
				return;
			}

			// If a number was passed in, add the unit (except for certain CSS properties)
			if ( type === "number" ) {
				value += ret && ret[ 3 ] || ( jQuery.cssNumber[ origName ] ? "" : "px" );
			}

			// Support: IE9-11+
			// background-* props affect original clone's values
			if ( !support.clearCloneStyle && value === "" && name.indexOf( "background" ) === 0 ) {
				style[ name ] = "inherit";
			}

			// If a hook was provided, use that value, otherwise just set the specified value
			if ( !hooks || !( "set" in hooks ) ||
				( value = hooks.set( elem, value, extra ) ) !== undefined ) {

				style[ name ] = value;
			}

		} else {

			// If a hook was provided get the non-computed value from there
			if ( hooks && "get" in hooks &&
				( ret = hooks.get( elem, false, extra ) ) !== undefined ) {

				return ret;
			}

			// Otherwise just get the value from the style object
			return style[ name ];
		}
	},

	css: function( elem, name, extra, styles ) {
		var val, num, hooks,
			origName = jQuery.camelCase( name );

		// Make sure that we're working with the right name
		name = jQuery.cssProps[ origName ] ||
			( jQuery.cssProps[ origName ] = vendorPropName( origName ) || origName );

		// Try prefixed name followed by the unprefixed name
		hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];

		// If a hook was provided get the computed value from there
		if ( hooks && "get" in hooks ) {
			val = hooks.get( elem, true, extra );
		}

		// Otherwise, if a way to get the computed value exists, use that
		if ( val === undefined ) {
			val = curCSS( elem, name, styles );
		}

		// Convert "normal" to computed value
		if ( val === "normal" && name in cssNormalTransform ) {
			val = cssNormalTransform[ name ];
		}

		// Make numeric if forced or a qualifier was provided and val looks numeric
		if ( extra === "" || extra ) {
			num = parseFloat( val );
			return extra === true || isFinite( num ) ? num || 0 : val;
		}
		return val;
	}
} );

jQuery.each( [ "height", "width" ], function( i, name ) {
	jQuery.cssHooks[ name ] = {
		get: function( elem, computed, extra ) {
			if ( computed ) {

				// Certain elements can have dimension info if we invisibly show them
				// but it must have a current display style that would benefit
				return rdisplayswap.test( jQuery.css( elem, "display" ) ) &&
					elem.offsetWidth === 0 ?
						swap( elem, cssShow, function() {
							return getWidthOrHeight( elem, name, extra );
						} ) :
						getWidthOrHeight( elem, name, extra );
			}
		},

		set: function( elem, value, extra ) {
			var matches,
				styles = extra && getStyles( elem ),
				subtract = extra && augmentWidthOrHeight(
					elem,
					name,
					extra,
					jQuery.css( elem, "boxSizing", false, styles ) === "border-box",
					styles
				);

			// Convert to pixels if value adjustment is needed
			if ( subtract && ( matches = rcssNum.exec( value ) ) &&
				( matches[ 3 ] || "px" ) !== "px" ) {

				elem.style[ name ] = value;
				value = jQuery.css( elem, name );
			}

			return setPositiveNumber( elem, value, subtract );
		}
	};
} );

jQuery.cssHooks.marginLeft = addGetHookIf( support.reliableMarginLeft,
	function( elem, computed ) {
		if ( computed ) {
			return ( parseFloat( curCSS( elem, "marginLeft" ) ) ||
				elem.getBoundingClientRect().left -
					swap( elem, { marginLeft: 0 }, function() {
						return elem.getBoundingClientRect().left;
					} )
				) + "px";
		}
	}
);

// Support: Android 2.3
jQuery.cssHooks.marginRight = addGetHookIf( support.reliableMarginRight,
	function( elem, computed ) {
		if ( computed ) {
			return swap( elem, { "display": "inline-block" },
				curCSS, [ elem, "marginRight" ] );
		}
	}
);

// These hooks are used by animate to expand properties
jQuery.each( {
	margin: "",
	padding: "",
	border: "Width"
}, function( prefix, suffix ) {
	jQuery.cssHooks[ prefix + suffix ] = {
		expand: function( value ) {
			var i = 0,
				expanded = {},

				// Assumes a single number if not a string
				parts = typeof value === "string" ? value.split( " " ) : [ value ];

			for ( ; i < 4; i++ ) {
				expanded[ prefix + cssExpand[ i ] + suffix ] =
					parts[ i ] || parts[ i - 2 ] || parts[ 0 ];
			}

			return expanded;
		}
	};

	if ( !rmargin.test( prefix ) ) {
		jQuery.cssHooks[ prefix + suffix ].set = setPositiveNumber;
	}
} );

jQuery.fn.extend( {
	css: function( name, value ) {
		return access( this, function( elem, name, value ) {
			var styles, len,
				map = {},
				i = 0;

			if ( jQuery.isArray( name ) ) {
				styles = getStyles( elem );
				len = name.length;

				for ( ; i < len; i++ ) {
					map[ name[ i ] ] = jQuery.css( elem, name[ i ], false, styles );
				}

				return map;
			}

			return value !== undefined ?
				jQuery.style( elem, name, value ) :
				jQuery.css( elem, name );
		}, name, value, arguments.length > 1 );
	},
	show: function() {
		return showHide( this, true );
	},
	hide: function() {
		return showHide( this );
	},
	toggle: function( state ) {
		if ( typeof state === "boolean" ) {
			return state ? this.show() : this.hide();
		}

		return this.each( function() {
			if ( isHidden( this ) ) {
				jQuery( this ).show();
			} else {
				jQuery( this ).hide();
			}
		} );
	}
} );


function Tween( elem, options, prop, end, easing ) {
	return new Tween.prototype.init( elem, options, prop, end, easing );
}
jQuery.Tween = Tween;

Tween.prototype = {
	constructor: Tween,
	init: function( elem, options, prop, end, easing, unit ) {
		this.elem = elem;
		this.prop = prop;
		this.easing = easing || jQuery.easing._default;
		this.options = options;
		this.start = this.now = this.cur();
		this.end = end;
		this.unit = unit || ( jQuery.cssNumber[ prop ] ? "" : "px" );
	},
	cur: function() {
		var hooks = Tween.propHooks[ this.prop ];

		return hooks && hooks.get ?
			hooks.get( this ) :
			Tween.propHooks._default.get( this );
	},
	run: function( percent ) {
		var eased,
			hooks = Tween.propHooks[ this.prop ];

		if ( this.options.duration ) {
			this.pos = eased = jQuery.easing[ this.easing ](
				percent, this.options.duration * percent, 0, 1, this.options.duration
			);
		} else {
			this.pos = eased = percent;
		}
		this.now = ( this.end - this.start ) * eased + this.start;

		if ( this.options.step ) {
			this.options.step.call( this.elem, this.now, this );
		}

		if ( hooks && hooks.set ) {
			hooks.set( this );
		} else {
			Tween.propHooks._default.set( this );
		}
		return this;
	}
};

Tween.prototype.init.prototype = Tween.prototype;

Tween.propHooks = {
	_default: {
		get: function( tween ) {
			var result;

			// Use a property on the element directly when it is not a DOM element,
			// or when there is no matching style property that exists.
			if ( tween.elem.nodeType !== 1 ||
				tween.elem[ tween.prop ] != null && tween.elem.style[ tween.prop ] == null ) {
				return tween.elem[ tween.prop ];
			}

			// Passing an empty string as a 3rd parameter to .css will automatically
			// attempt a parseFloat and fallback to a string if the parse fails.
			// Simple values such as "10px" are parsed to Float;
			// complex values such as "rotate(1rad)" are returned as-is.
			result = jQuery.css( tween.elem, tween.prop, "" );

			// Empty strings, null, undefined and "auto" are converted to 0.
			return !result || result === "auto" ? 0 : result;
		},
		set: function( tween ) {

			// Use step hook for back compat.
			// Use cssHook if its there.
			// Use .style if available and use plain properties where available.
			if ( jQuery.fx.step[ tween.prop ] ) {
				jQuery.fx.step[ tween.prop ]( tween );
			} else if ( tween.elem.nodeType === 1 &&
				( tween.elem.style[ jQuery.cssProps[ tween.prop ] ] != null ||
					jQuery.cssHooks[ tween.prop ] ) ) {
				jQuery.style( tween.elem, tween.prop, tween.now + tween.unit );
			} else {
				tween.elem[ tween.prop ] = tween.now;
			}
		}
	}
};

// Support: IE9
// Panic based approach to setting things on disconnected nodes
Tween.propHooks.scrollTop = Tween.propHooks.scrollLeft = {
	set: function( tween ) {
		if ( tween.elem.nodeType && tween.elem.parentNode ) {
			tween.elem[ tween.prop ] = tween.now;
		}
	}
};

jQuery.easing = {
	linear: function( p ) {
		return p;
	},
	swing: function( p ) {
		return 0.5 - Math.cos( p * Math.PI ) / 2;
	},
	_default: "swing"
};

jQuery.fx = Tween.prototype.init;

// Back Compat <1.8 extension point
jQuery.fx.step = {};




var
	fxNow, timerId,
	rfxtypes = /^(?:toggle|show|hide)$/,
	rrun = /queueHooks$/;

// Animations created synchronously will run synchronously
function createFxNow() {
	window.setTimeout( function() {
		fxNow = undefined;
	} );
	return ( fxNow = jQuery.now() );
}

// Generate parameters to create a standard animation
function genFx( type, includeWidth ) {
	var which,
		i = 0,
		attrs = { height: type };

	// If we include width, step value is 1 to do all cssExpand values,
	// otherwise step value is 2 to skip over Left and Right
	includeWidth = includeWidth ? 1 : 0;
	for ( ; i < 4 ; i += 2 - includeWidth ) {
		which = cssExpand[ i ];
		attrs[ "margin" + which ] = attrs[ "padding" + which ] = type;
	}

	if ( includeWidth ) {
		attrs.opacity = attrs.width = type;
	}

	return attrs;
}

function createTween( value, prop, animation ) {
	var tween,
		collection = ( Animation.tweeners[ prop ] || [] ).concat( Animation.tweeners[ "*" ] ),
		index = 0,
		length = collection.length;
	for ( ; index < length; index++ ) {
		if ( ( tween = collection[ index ].call( animation, prop, value ) ) ) {

			// We're done with this property
			return tween;
		}
	}
}

function defaultPrefilter( elem, props, opts ) {
	/* jshint validthis: true */
	var prop, value, toggle, tween, hooks, oldfire, display, checkDisplay,
		anim = this,
		orig = {},
		style = elem.style,
		hidden = elem.nodeType && isHidden( elem ),
		dataShow = dataPriv.get( elem, "fxshow" );

	// Handle queue: false promises
	if ( !opts.queue ) {
		hooks = jQuery._queueHooks( elem, "fx" );
		if ( hooks.unqueued == null ) {
			hooks.unqueued = 0;
			oldfire = hooks.empty.fire;
			hooks.empty.fire = function() {
				if ( !hooks.unqueued ) {
					oldfire();
				}
			};
		}
		hooks.unqueued++;

		anim.always( function() {

			// Ensure the complete handler is called before this completes
			anim.always( function() {
				hooks.unqueued--;
				if ( !jQuery.queue( elem, "fx" ).length ) {
					hooks.empty.fire();
				}
			} );
		} );
	}

	// Height/width overflow pass
	if ( elem.nodeType === 1 && ( "height" in props || "width" in props ) ) {

		// Make sure that nothing sneaks out
		// Record all 3 overflow attributes because IE9-10 do not
		// change the overflow attribute when overflowX and
		// overflowY are set to the same value
		opts.overflow = [ style.overflow, style.overflowX, style.overflowY ];

		// Set display property to inline-block for height/width
		// animations on inline elements that are having width/height animated
		display = jQuery.css( elem, "display" );

		// Test default display if display is currently "none"
		checkDisplay = display === "none" ?
			dataPriv.get( elem, "olddisplay" ) || defaultDisplay( elem.nodeName ) : display;

		if ( checkDisplay === "inline" && jQuery.css( elem, "float" ) === "none" ) {
			style.display = "inline-block";
		}
	}

	if ( opts.overflow ) {
		style.overflow = "hidden";
		anim.always( function() {
			style.overflow = opts.overflow[ 0 ];
			style.overflowX = opts.overflow[ 1 ];
			style.overflowY = opts.overflow[ 2 ];
		} );
	}

	// show/hide pass
	for ( prop in props ) {
		value = props[ prop ];
		if ( rfxtypes.exec( value ) ) {
			delete props[ prop ];
			toggle = toggle || value === "toggle";
			if ( value === ( hidden ? "hide" : "show" ) ) {

				// If there is dataShow left over from a stopped hide or show
				// and we are going to proceed with show, we should pretend to be hidden
				if ( value === "show" && dataShow && dataShow[ prop ] !== undefined ) {
					hidden = true;
				} else {
					continue;
				}
			}
			orig[ prop ] = dataShow && dataShow[ prop ] || jQuery.style( elem, prop );

		// Any non-fx value stops us from restoring the original display value
		} else {
			display = undefined;
		}
	}

	if ( !jQuery.isEmptyObject( orig ) ) {
		if ( dataShow ) {
			if ( "hidden" in dataShow ) {
				hidden = dataShow.hidden;
			}
		} else {
			dataShow = dataPriv.access( elem, "fxshow", {} );
		}

		// Store state if its toggle - enables .stop().toggle() to "reverse"
		if ( toggle ) {
			dataShow.hidden = !hidden;
		}
		if ( hidden ) {
			jQuery( elem ).show();
		} else {
			anim.done( function() {
				jQuery( elem ).hide();
			} );
		}
		anim.done( function() {
			var prop;

			dataPriv.remove( elem, "fxshow" );
			for ( prop in orig ) {
				jQuery.style( elem, prop, orig[ prop ] );
			}
		} );
		for ( prop in orig ) {
			tween = createTween( hidden ? dataShow[ prop ] : 0, prop, anim );

			if ( !( prop in dataShow ) ) {
				dataShow[ prop ] = tween.start;
				if ( hidden ) {
					tween.end = tween.start;
					tween.start = prop === "width" || prop === "height" ? 1 : 0;
				}
			}
		}

	// If this is a noop like .hide().hide(), restore an overwritten display value
	} else if ( ( display === "none" ? defaultDisplay( elem.nodeName ) : display ) === "inline" ) {
		style.display = display;
	}
}

function propFilter( props, specialEasing ) {
	var index, name, easing, value, hooks;

	// camelCase, specialEasing and expand cssHook pass
	for ( index in props ) {
		name = jQuery.camelCase( index );
		easing = specialEasing[ name ];
		value = props[ index ];
		if ( jQuery.isArray( value ) ) {
			easing = value[ 1 ];
			value = props[ index ] = value[ 0 ];
		}

		if ( index !== name ) {
			props[ name ] = value;
			delete props[ index ];
		}

		hooks = jQuery.cssHooks[ name ];
		if ( hooks && "expand" in hooks ) {
			value = hooks.expand( value );
			delete props[ name ];

			// Not quite $.extend, this won't overwrite existing keys.
			// Reusing 'index' because we have the correct "name"
			for ( index in value ) {
				if ( !( index in props ) ) {
					props[ index ] = value[ index ];
					specialEasing[ index ] = easing;
				}
			}
		} else {
			specialEasing[ name ] = easing;
		}
	}
}

function Animation( elem, properties, options ) {
	var result,
		stopped,
		index = 0,
		length = Animation.prefilters.length,
		deferred = jQuery.Deferred().always( function() {

			// Don't match elem in the :animated selector
			delete tick.elem;
		} ),
		tick = function() {
			if ( stopped ) {
				return false;
			}
			var currentTime = fxNow || createFxNow(),
				remaining = Math.max( 0, animation.startTime + animation.duration - currentTime ),

				// Support: Android 2.3
				// Archaic crash bug won't allow us to use `1 - ( 0.5 || 0 )` (#12497)
				temp = remaining / animation.duration || 0,
				percent = 1 - temp,
				index = 0,
				length = animation.tweens.length;

			for ( ; index < length ; index++ ) {
				animation.tweens[ index ].run( percent );
			}

			deferred.notifyWith( elem, [ animation, percent, remaining ] );

			if ( percent < 1 && length ) {
				return remaining;
			} else {
				deferred.resolveWith( elem, [ animation ] );
				return false;
			}
		},
		animation = deferred.promise( {
			elem: elem,
			props: jQuery.extend( {}, properties ),
			opts: jQuery.extend( true, {
				specialEasing: {},
				easing: jQuery.easing._default
			}, options ),
			originalProperties: properties,
			originalOptions: options,
			startTime: fxNow || createFxNow(),
			duration: options.duration,
			tweens: [],
			createTween: function( prop, end ) {
				var tween = jQuery.Tween( elem, animation.opts, prop, end,
						animation.opts.specialEasing[ prop ] || animation.opts.easing );
				animation.tweens.push( tween );
				return tween;
			},
			stop: function( gotoEnd ) {
				var index = 0,

					// If we are going to the end, we want to run all the tweens
					// otherwise we skip this part
					length = gotoEnd ? animation.tweens.length : 0;
				if ( stopped ) {
					return this;
				}
				stopped = true;
				for ( ; index < length ; index++ ) {
					animation.tweens[ index ].run( 1 );
				}

				// Resolve when we played the last frame; otherwise, reject
				if ( gotoEnd ) {
					deferred.notifyWith( elem, [ animation, 1, 0 ] );
					deferred.resolveWith( elem, [ animation, gotoEnd ] );
				} else {
					deferred.rejectWith( elem, [ animation, gotoEnd ] );
				}
				return this;
			}
		} ),
		props = animation.props;

	propFilter( props, animation.opts.specialEasing );

	for ( ; index < length ; index++ ) {
		result = Animation.prefilters[ index ].call( animation, elem, props, animation.opts );
		if ( result ) {
			if ( jQuery.isFunction( result.stop ) ) {
				jQuery._queueHooks( animation.elem, animation.opts.queue ).stop =
					jQuery.proxy( result.stop, result );
			}
			return result;
		}
	}

	jQuery.map( props, createTween, animation );

	if ( jQuery.isFunction( animation.opts.start ) ) {
		animation.opts.start.call( elem, animation );
	}

	jQuery.fx.timer(
		jQuery.extend( tick, {
			elem: elem,
			anim: animation,
			queue: animation.opts.queue
		} )
	);

	// attach callbacks from options
	return animation.progress( animation.opts.progress )
		.done( animation.opts.done, animation.opts.complete )
		.fail( animation.opts.fail )
		.always( animation.opts.always );
}

jQuery.Animation = jQuery.extend( Animation, {
	tweeners: {
		"*": [ function( prop, value ) {
			var tween = this.createTween( prop, value );
			adjustCSS( tween.elem, prop, rcssNum.exec( value ), tween );
			return tween;
		} ]
	},

	tweener: function( props, callback ) {
		if ( jQuery.isFunction( props ) ) {
			callback = props;
			props = [ "*" ];
		} else {
			props = props.match( rnotwhite );
		}

		var prop,
			index = 0,
			length = props.length;

		for ( ; index < length ; index++ ) {
			prop = props[ index ];
			Animation.tweeners[ prop ] = Animation.tweeners[ prop ] || [];
			Animation.tweeners[ prop ].unshift( callback );
		}
	},

	prefilters: [ defaultPrefilter ],

	prefilter: function( callback, prepend ) {
		if ( prepend ) {
			Animation.prefilters.unshift( callback );
		} else {
			Animation.prefilters.push( callback );
		}
	}
} );

jQuery.speed = function( speed, easing, fn ) {
	var opt = speed && typeof speed === "object" ? jQuery.extend( {}, speed ) : {
		complete: fn || !fn && easing ||
			jQuery.isFunction( speed ) && speed,
		duration: speed,
		easing: fn && easing || easing && !jQuery.isFunction( easing ) && easing
	};

	opt.duration = jQuery.fx.off ? 0 : typeof opt.duration === "number" ?
		opt.duration : opt.duration in jQuery.fx.speeds ?
			jQuery.fx.speeds[ opt.duration ] : jQuery.fx.speeds._default;

	// Normalize opt.queue - true/undefined/null -> "fx"
	if ( opt.queue == null || opt.queue === true ) {
		opt.queue = "fx";
	}

	// Queueing
	opt.old = opt.complete;

	opt.complete = function() {
		if ( jQuery.isFunction( opt.old ) ) {
			opt.old.call( this );
		}

		if ( opt.queue ) {
			jQuery.dequeue( this, opt.queue );
		}
	};

	return opt;
};

jQuery.fn.extend( {
	fadeTo: function( speed, to, easing, callback ) {

		// Show any hidden elements after setting opacity to 0
		return this.filter( isHidden ).css( "opacity", 0 ).show()

			// Animate to the value specified
			.end().animate( { opacity: to }, speed, easing, callback );
	},
	animate: function( prop, speed, easing, callback ) {
		var empty = jQuery.isEmptyObject( prop ),
			optall = jQuery.speed( speed, easing, callback ),
			doAnimation = function() {

				// Operate on a copy of prop so per-property easing won't be lost
				var anim = Animation( this, jQuery.extend( {}, prop ), optall );

				// Empty animations, or finishing resolves immediately
				if ( empty || dataPriv.get( this, "finish" ) ) {
					anim.stop( true );
				}
			};
			doAnimation.finish = doAnimation;

		return empty || optall.queue === false ?
			this.each( doAnimation ) :
			this.queue( optall.queue, doAnimation );
	},
	stop: function( type, clearQueue, gotoEnd ) {
		var stopQueue = function( hooks ) {
			var stop = hooks.stop;
			delete hooks.stop;
			stop( gotoEnd );
		};

		if ( typeof type !== "string" ) {
			gotoEnd = clearQueue;
			clearQueue = type;
			type = undefined;
		}
		if ( clearQueue && type !== false ) {
			this.queue( type || "fx", [] );
		}

		return this.each( function() {
			var dequeue = true,
				index = type != null && type + "queueHooks",
				timers = jQuery.timers,
				data = dataPriv.get( this );

			if ( index ) {
				if ( data[ index ] && data[ index ].stop ) {
					stopQueue( data[ index ] );
				}
			} else {
				for ( index in data ) {
					if ( data[ index ] && data[ index ].stop && rrun.test( index ) ) {
						stopQueue( data[ index ] );
					}
				}
			}

			for ( index = timers.length; index--; ) {
				if ( timers[ index ].elem === this &&
					( type == null || timers[ index ].queue === type ) ) {

					timers[ index ].anim.stop( gotoEnd );
					dequeue = false;
					timers.splice( index, 1 );
				}
			}

			// Start the next in the queue if the last step wasn't forced.
			// Timers currently will call their complete callbacks, which
			// will dequeue but only if they were gotoEnd.
			if ( dequeue || !gotoEnd ) {
				jQuery.dequeue( this, type );
			}
		} );
	},
	finish: function( type ) {
		if ( type !== false ) {
			type = type || "fx";
		}
		return this.each( function() {
			var index,
				data = dataPriv.get( this ),
				queue = data[ type + "queue" ],
				hooks = data[ type + "queueHooks" ],
				timers = jQuery.timers,
				length = queue ? queue.length : 0;

			// Enable finishing flag on private data
			data.finish = true;

			// Empty the queue first
			jQuery.queue( this, type, [] );

			if ( hooks && hooks.stop ) {
				hooks.stop.call( this, true );
			}

			// Look for any active animations, and finish them
			for ( index = timers.length; index--; ) {
				if ( timers[ index ].elem === this && timers[ index ].queue === type ) {
					timers[ index ].anim.stop( true );
					timers.splice( index, 1 );
				}
			}

			// Look for any animations in the old queue and finish them
			for ( index = 0; index < length; index++ ) {
				if ( queue[ index ] && queue[ index ].finish ) {
					queue[ index ].finish.call( this );
				}
			}

			// Turn off finishing flag
			delete data.finish;
		} );
	}
} );

jQuery.each( [ "toggle", "show", "hide" ], function( i, name ) {
	var cssFn = jQuery.fn[ name ];
	jQuery.fn[ name ] = function( speed, easing, callback ) {
		return speed == null || typeof speed === "boolean" ?
			cssFn.apply( this, arguments ) :
			this.animate( genFx( name, true ), speed, easing, callback );
	};
} );

// Generate shortcuts for custom animations
jQuery.each( {
	slideDown: genFx( "show" ),
	slideUp: genFx( "hide" ),
	slideToggle: genFx( "toggle" ),
	fadeIn: { opacity: "show" },
	fadeOut: { opacity: "hide" },
	fadeToggle: { opacity: "toggle" }
}, function( name, props ) {
	jQuery.fn[ name ] = function( speed, easing, callback ) {
		return this.animate( props, speed, easing, callback );
	};
} );

jQuery.timers = [];
jQuery.fx.tick = function() {
	var timer,
		i = 0,
		timers = jQuery.timers;

	fxNow = jQuery.now();

	for ( ; i < timers.length; i++ ) {
		timer = timers[ i ];

		// Checks the timer has not already been removed
		if ( !timer() && timers[ i ] === timer ) {
			timers.splice( i--, 1 );
		}
	}

	if ( !timers.length ) {
		jQuery.fx.stop();
	}
	fxNow = undefined;
};

jQuery.fx.timer = function( timer ) {
	jQuery.timers.push( timer );
	if ( timer() ) {
		jQuery.fx.start();
	} else {
		jQuery.timers.pop();
	}
};

jQuery.fx.interval = 13;
jQuery.fx.start = function() {
	if ( !timerId ) {
		timerId = window.setInterval( jQuery.fx.tick, jQuery.fx.interval );
	}
};

jQuery.fx.stop = function() {
	window.clearInterval( timerId );

	timerId = null;
};

jQuery.fx.speeds = {
	slow: 600,
	fast: 200,

	// Default speed
	_default: 400
};


// Based off of the plugin by Clint Helfers, with permission.
// http://web.archive.org/web/20100324014747/http://blindsignals.com/index.php/2009/07/jquery-delay/
jQuery.fn.delay = function( time, type ) {
	time = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time;
	type = type || "fx";

	return this.queue( type, function( next, hooks ) {
		var timeout = window.setTimeout( next, time );
		hooks.stop = function() {
			window.clearTimeout( timeout );
		};
	} );
};


( function() {
	var input = document.createElement( "input" ),
		select = document.createElement( "select" ),
		opt = select.appendChild( document.createElement( "option" ) );

	input.type = "checkbox";

	// Support: iOS<=5.1, Android<=4.2+
	// Default value for a checkbox should be "on"
	support.checkOn = input.value !== "";

	// Support: IE<=11+
	// Must access selectedIndex to make default options select
	support.optSelected = opt.selected;

	// Support: Android<=2.3
	// Options inside disabled selects are incorrectly marked as disabled
	select.disabled = true;
	support.optDisabled = !opt.disabled;

	// Support: IE<=11+
	// An input loses its value after becoming a radio
	input = document.createElement( "input" );
	input.value = "t";
	input.type = "radio";
	support.radioValue = input.value === "t";
} )();


var boolHook,
	attrHandle = jQuery.expr.attrHandle;

jQuery.fn.extend( {
	attr: function( name, value ) {
		return access( this, jQuery.attr, name, value, arguments.length > 1 );
	},

	removeAttr: function( name ) {
		return this.each( function() {
			jQuery.removeAttr( this, name );
		} );
	}
} );

jQuery.extend( {
	attr: function( elem, name, value ) {
		var ret, hooks,
			nType = elem.nodeType;

		// Don't get/set attributes on text, comment and attribute nodes
		if ( nType === 3 || nType === 8 || nType === 2 ) {
			return;
		}

		// Fallback to prop when attributes are not supported
		if ( typeof elem.getAttribute === "undefined" ) {
			return jQuery.prop( elem, name, value );
		}

		// All attributes are lowercase
		// Grab necessary hook if one is defined
		if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) {
			name = name.toLowerCase();
			hooks = jQuery.attrHooks[ name ] ||
				( jQuery.expr.match.bool.test( name ) ? boolHook : undefined );
		}

		if ( value !== undefined ) {
			if ( value === null ) {
				jQuery.removeAttr( elem, name );
				return;
			}

			if ( hooks && "set" in hooks &&
				( ret = hooks.set( elem, value, name ) ) !== undefined ) {
				return ret;
			}

			elem.setAttribute( name, value + "" );
			return value;
		}

		if ( hooks && "get" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) {
			return ret;
		}

		ret = jQuery.find.attr( elem, name );

		// Non-existent attributes return null, we normalize to undefined
		return ret == null ? undefined : ret;
	},

	attrHooks: {
		type: {
			set: function( elem, value ) {
				if ( !support.radioValue && value === "radio" &&
					jQuery.nodeName( elem, "input" ) ) {
					var val = elem.value;
					elem.setAttribute( "type", value );
					if ( val ) {
						elem.value = val;
					}
					return value;
				}
			}
		}
	},

	removeAttr: function( elem, value ) {
		var name, propName,
			i = 0,
			attrNames = value && value.match( rnotwhite );

		if ( attrNames && elem.nodeType === 1 ) {
			while ( ( name = attrNames[ i++ ] ) ) {
				propName = jQuery.propFix[ name ] || name;

				// Boolean attributes get special treatment (#10870)
				if ( jQuery.expr.match.bool.test( name ) ) {

					// Set corresponding property to false
					elem[ propName ] = false;
				}

				elem.removeAttribute( name );
			}
		}
	}
} );

// Hooks for boolean attributes
boolHook = {
	set: function( elem, value, name ) {
		if ( value === false ) {

			// Remove boolean attributes when set to false
			jQuery.removeAttr( elem, name );
		} else {
			elem.setAttribute( name, name );
		}
		return name;
	}
};
jQuery.each( jQuery.expr.match.bool.source.match( /\w+/g ), function( i, name ) {
	var getter = attrHandle[ name ] || jQuery.find.attr;

	attrHandle[ name ] = function( elem, name, isXML ) {
		var ret, handle;
		if ( !isXML ) {

			// Avoid an infinite loop by temporarily removing this function from the getter
			handle = attrHandle[ name ];
			attrHandle[ name ] = ret;
			ret = getter( elem, name, isXML ) != null ?
				name.toLowerCase() :
				null;
			attrHandle[ name ] = handle;
		}
		return ret;
	};
} );




var rfocusable = /^(?:input|select|textarea|button)$/i,
	rclickable = /^(?:a|area)$/i;

jQuery.fn.extend( {
	prop: function( name, value ) {
		return access( this, jQuery.prop, name, value, arguments.length > 1 );
	},

	removeProp: function( name ) {
		return this.each( function() {
			delete this[ jQuery.propFix[ name ] || name ];
		} );
	}
} );

jQuery.extend( {
	prop: function( elem, name, value ) {
		var ret, hooks,
			nType = elem.nodeType;

		// Don't get/set properties on text, comment and attribute nodes
		if ( nType === 3 || nType === 8 || nType === 2 ) {
			return;
		}

		if ( nType !== 1 || !jQuery.isXMLDoc( elem ) ) {

			// Fix name and attach hooks
			name = jQuery.propFix[ name ] || name;
			hooks = jQuery.propHooks[ name ];
		}

		if ( value !== undefined ) {
			if ( hooks && "set" in hooks &&
				( ret = hooks.set( elem, value, name ) ) !== undefined ) {
				return ret;
			}

			return ( elem[ name ] = value );
		}

		if ( hooks && "get" in hooks && ( ret = hooks.get( elem, name ) ) !== null ) {
			return ret;
		}

		return elem[ name ];
	},

	propHooks: {
		tabIndex: {
			get: function( elem ) {

				// elem.tabIndex doesn't always return the
				// correct value when it hasn't been explicitly set
				// http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/
				// Use proper attribute retrieval(#12072)
				var tabindex = jQuery.find.attr( elem, "tabindex" );

				return tabindex ?
					parseInt( tabindex, 10 ) :
					rfocusable.test( elem.nodeName ) ||
						rclickable.test( elem.nodeName ) && elem.href ?
							0 :
							-1;
			}
		}
	},

	propFix: {
		"for": "htmlFor",
		"class": "className"
	}
} );

// Support: IE <=11 only
// Accessing the selectedIndex property
// forces the browser to respect setting selected
// on the option
// The getter ensures a default option is selected
// when in an optgroup
if ( !support.optSelected ) {
	jQuery.propHooks.selected = {
		get: function( elem ) {
			var parent = elem.parentNode;
			if ( parent && parent.parentNode ) {
				parent.parentNode.selectedIndex;
			}
			return null;
		},
		set: function( elem ) {
			var parent = elem.parentNode;
			if ( parent ) {
				parent.selectedIndex;

				if ( parent.parentNode ) {
					parent.parentNode.selectedIndex;
				}
			}
		}
	};
}

jQuery.each( [
	"tabIndex",
	"readOnly",
	"maxLength",
	"cellSpacing",
	"cellPadding",
	"rowSpan",
	"colSpan",
	"useMap",
	"frameBorder",
	"contentEditable"
], function() {
	jQuery.propFix[ this.toLowerCase() ] = this;
} );




var rclass = /[\t\r\n\f]/g;

function getClass( elem ) {
	return elem.getAttribute && elem.getAttribute( "class" ) || "";
}

jQuery.fn.extend( {
	addClass: function( value ) {
		var classes, elem, cur, curValue, clazz, j, finalValue,
			i = 0;

		if ( jQuery.isFunction( value ) ) {
			return this.each( function( j ) {
				jQuery( this ).addClass( value.call( this, j, getClass( this ) ) );
			} );
		}

		if ( typeof value === "string" && value ) {
			classes = value.match( rnotwhite ) || [];

			while ( ( elem = this[ i++ ] ) ) {
				curValue = getClass( elem );
				cur = elem.nodeType === 1 &&
					( " " + curValue + " " ).replace( rclass, " " );

				if ( cur ) {
					j = 0;
					while ( ( clazz = classes[ j++ ] ) ) {
						if ( cur.indexOf( " " + clazz + " " ) < 0 ) {
							cur += clazz + " ";
						}
					}

					// Only assign if different to avoid unneeded rendering.
					finalValue = jQuery.trim( cur );
					if ( curValue !== finalValue ) {
						elem.setAttribute( "class", finalValue );
					}
				}
			}
		}

		return this;
	},

	removeClass: function( value ) {
		var classes, elem, cur, curValue, clazz, j, finalValue,
			i = 0;

		if ( jQuery.isFunction( value ) ) {
			return this.each( function( j ) {
				jQuery( this ).removeClass( value.call( this, j, getClass( this ) ) );
			} );
		}

		if ( !arguments.length ) {
			return this.attr( "class", "" );
		}

		if ( typeof value === "string" && value ) {
			classes = value.match( rnotwhite ) || [];

			while ( ( elem = this[ i++ ] ) ) {
				curValue = getClass( elem );

				// This expression is here for better compressibility (see addClass)
				cur = elem.nodeType === 1 &&
					( " " + curValue + " " ).replace( rclass, " " );

				if ( cur ) {
					j = 0;
					while ( ( clazz = classes[ j++ ] ) ) {

						// Remove *all* instances
						while ( cur.indexOf( " " + clazz + " " ) > -1 ) {
							cur = cur.replace( " " + clazz + " ", " " );
						}
					}

					// Only assign if different to avoid unneeded rendering.
					finalValue = jQuery.trim( cur );
					if ( curValue !== finalValue ) {
						elem.setAttribute( "class", finalValue );
					}
				}
			}
		}

		return this;
	},

	toggleClass: function( value, stateVal ) {
		var type = typeof value;

		if ( typeof stateVal === "boolean" && type === "string" ) {
			return stateVal ? this.addClass( value ) : this.removeClass( value );
		}

		if ( jQuery.isFunction( value ) ) {
			return this.each( function( i ) {
				jQuery( this ).toggleClass(
					value.call( this, i, getClass( this ), stateVal ),
					stateVal
				);
			} );
		}

		return this.each( function() {
			var className, i, self, classNames;

			if ( type === "string" ) {

				// Toggle individual class names
				i = 0;
				self = jQuery( this );
				classNames = value.match( rnotwhite ) || [];

				while ( ( className = classNames[ i++ ] ) ) {

					// Check each className given, space separated list
					if ( self.hasClass( className ) ) {
						self.removeClass( className );
					} else {
						self.addClass( className );
					}
				}

			// Toggle whole class name
			} else if ( value === undefined || type === "boolean" ) {
				className = getClass( this );
				if ( className ) {

					// Store className if set
					dataPriv.set( this, "__className__", className );
				}

				// If the element has a class name or if we're passed `false`,
				// then remove the whole classname (if there was one, the above saved it).
				// Otherwise bring back whatever was previously saved (if anything),
				// falling back to the empty string if nothing was stored.
				if ( this.setAttribute ) {
					this.setAttribute( "class",
						className || value === false ?
						"" :
						dataPriv.get( this, "__className__" ) || ""
					);
				}
			}
		} );
	},

	hasClass: function( selector ) {
		var className, elem,
			i = 0;

		className = " " + selector + " ";
		while ( ( elem = this[ i++ ] ) ) {
			if ( elem.nodeType === 1 &&
				( " " + getClass( elem ) + " " ).replace( rclass, " " )
					.indexOf( className ) > -1
			) {
				return true;
			}
		}

		return false;
	}
} );




var rreturn = /\r/g,
	rspaces = /[\x20\t\r\n\f]+/g;

jQuery.fn.extend( {
	val: function( value ) {
		var hooks, ret, isFunction,
			elem = this[ 0 ];

		if ( !arguments.length ) {
			if ( elem ) {
				hooks = jQuery.valHooks[ elem.type ] ||
					jQuery.valHooks[ elem.nodeName.toLowerCase() ];

				if ( hooks &&
					"get" in hooks &&
					( ret = hooks.get( elem, "value" ) ) !== undefined
				) {
					return ret;
				}

				ret = elem.value;

				return typeof ret === "string" ?

					// Handle most common string cases
					ret.replace( rreturn, "" ) :

					// Handle cases where value is null/undef or number
					ret == null ? "" : ret;
			}

			return;
		}

		isFunction = jQuery.isFunction( value );

		return this.each( function( i ) {
			var val;

			if ( this.nodeType !== 1 ) {
				return;
			}

			if ( isFunction ) {
				val = value.call( this, i, jQuery( this ).val() );
			} else {
				val = value;
			}

			// Treat null/undefined as ""; convert numbers to string
			if ( val == null ) {
				val = "";

			} else if ( typeof val === "number" ) {
				val += "";

			} else if ( jQuery.isArray( val ) ) {
				val = jQuery.map( val, function( value ) {
					return value == null ? "" : value + "";
				} );
			}

			hooks = jQuery.valHooks[ this.type ] || jQuery.valHooks[ this.nodeName.toLowerCase() ];

			// If set returns undefined, fall back to normal setting
			if ( !hooks || !( "set" in hooks ) || hooks.set( this, val, "value" ) === undefined ) {
				this.value = val;
			}
		} );
	}
} );

jQuery.extend( {
	valHooks: {
		option: {
			get: function( elem ) {

				var val = jQuery.find.attr( elem, "value" );
				return val != null ?
					val :

					// Support: IE10-11+
					// option.text throws exceptions (#14686, #14858)
					// Strip and collapse whitespace
					// https://html.spec.whatwg.org/#strip-and-collapse-whitespace
					jQuery.trim( jQuery.text( elem ) ).replace( rspaces, " " );
			}
		},
		select: {
			get: function( elem ) {
				var value, option,
					options = elem.options,
					index = elem.selectedIndex,
					one = elem.type === "select-one" || index < 0,
					values = one ? null : [],
					max = one ? index + 1 : options.length,
					i = index < 0 ?
						max :
						one ? index : 0;

				// Loop through all the selected options
				for ( ; i < max; i++ ) {
					option = options[ i ];

					// IE8-9 doesn't update selected after form reset (#2551)
					if ( ( option.selected || i === index ) &&

							// Don't return options that are disabled or in a disabled optgroup
							( support.optDisabled ?
								!option.disabled : option.getAttribute( "disabled" ) === null ) &&
							( !option.parentNode.disabled ||
								!jQuery.nodeName( option.parentNode, "optgroup" ) ) ) {

						// Get the specific value for the option
						value = jQuery( option ).val();

						// We don't need an array for one selects
						if ( one ) {
							return value;
						}

						// Multi-Selects return an array
						values.push( value );
					}
				}

				return values;
			},

			set: function( elem, value ) {
				var optionSet, option,
					options = elem.options,
					values = jQuery.makeArray( value ),
					i = options.length;

				while ( i-- ) {
					option = options[ i ];
					if ( option.selected =
						jQuery.inArray( jQuery.valHooks.option.get( option ), values ) > -1
					) {
						optionSet = true;
					}
				}

				// Force browsers to behave consistently when non-matching value is set
				if ( !optionSet ) {
					elem.selectedIndex = -1;
				}
				return values;
			}
		}
	}
} );

// Radios and checkboxes getter/setter
jQuery.each( [ "radio", "checkbox" ], function() {
	jQuery.valHooks[ this ] = {
		set: function( elem, value ) {
			if ( jQuery.isArray( value ) ) {
				return ( elem.checked = jQuery.inArray( jQuery( elem ).val(), value ) > -1 );
			}
		}
	};
	if ( !support.checkOn ) {
		jQuery.valHooks[ this ].get = function( elem ) {
			return elem.getAttribute( "value" ) === null ? "on" : elem.value;
		};
	}
} );




// Return jQuery for attributes-only inclusion


var rfocusMorph = /^(?:focusinfocus|focusoutblur)$/;

jQuery.extend( jQuery.event, {

	trigger: function( event, data, elem, onlyHandlers ) {

		var i, cur, tmp, bubbleType, ontype, handle, special,
			eventPath = [ elem || document ],
			type = hasOwn.call( event, "type" ) ? event.type : event,
			namespaces = hasOwn.call( event, "namespace" ) ? event.namespace.split( "." ) : [];

		cur = tmp = elem = elem || document;

		// Don't do events on text and comment nodes
		if ( elem.nodeType === 3 || elem.nodeType === 8 ) {
			return;
		}

		// focus/blur morphs to focusin/out; ensure we're not firing them right now
		if ( rfocusMorph.test( type + jQuery.event.triggered ) ) {
			return;
		}

		if ( type.indexOf( "." ) > -1 ) {

			// Namespaced trigger; create a regexp to match event type in handle()
			namespaces = type.split( "." );
			type = namespaces.shift();
			namespaces.sort();
		}
		ontype = type.indexOf( ":" ) < 0 && "on" + type;

		// Caller can pass in a jQuery.Event object, Object, or just an event type string
		event = event[ jQuery.expando ] ?
			event :
			new jQuery.Event( type, typeof event === "object" && event );

		// Trigger bitmask: & 1 for native handlers; & 2 for jQuery (always true)
		event.isTrigger = onlyHandlers ? 2 : 3;
		event.namespace = namespaces.join( "." );
		event.rnamespace = event.namespace ?
			new RegExp( "(^|\\.)" + namespaces.join( "\\.(?:.*\\.|)" ) + "(\\.|$)" ) :
			null;

		// Clean up the event in case it is being reused
		event.result = undefined;
		if ( !event.target ) {
			event.target = elem;
		}

		// Clone any incoming data and prepend the event, creating the handler arg list
		data = data == null ?
			[ event ] :
			jQuery.makeArray( data, [ event ] );

		// Allow special events to draw outside the lines
		special = jQuery.event.special[ type ] || {};
		if ( !onlyHandlers && special.trigger && special.trigger.apply( elem, data ) === false ) {
			return;
		}

		// Determine event propagation path in advance, per W3C events spec (#9951)
		// Bubble up to document, then to window; watch for a global ownerDocument var (#9724)
		if ( !onlyHandlers && !special.noBubble && !jQuery.isWindow( elem ) ) {

			bubbleType = special.delegateType || type;
			if ( !rfocusMorph.test( bubbleType + type ) ) {
				cur = cur.parentNode;
			}
			for ( ; cur; cur = cur.parentNode ) {
				eventPath.push( cur );
				tmp = cur;
			}

			// Only add window if we got to document (e.g., not plain obj or detached DOM)
			if ( tmp === ( elem.ownerDocument || document ) ) {
				eventPath.push( tmp.defaultView || tmp.parentWindow || window );
			}
		}

		// Fire handlers on the event path
		i = 0;
		while ( ( cur = eventPath[ i++ ] ) && !event.isPropagationStopped() ) {

			event.type = i > 1 ?
				bubbleType :
				special.bindType || type;

			// jQuery handler
			handle = ( dataPriv.get( cur, "events" ) || {} )[ event.type ] &&
				dataPriv.get( cur, "handle" );
			if ( handle ) {
				handle.apply( cur, data );
			}

			// Native handler
			handle = ontype && cur[ ontype ];
			if ( handle && handle.apply && acceptData( cur ) ) {
				event.result = handle.apply( cur, data );
				if ( event.result === false ) {
					event.preventDefault();
				}
			}
		}
		event.type = type;

		// If nobody prevented the default action, do it now
		if ( !onlyHandlers && !event.isDefaultPrevented() ) {

			if ( ( !special._default ||
				special._default.apply( eventPath.pop(), data ) === false ) &&
				acceptData( elem ) ) {

				// Call a native DOM method on the target with the same name name as the event.
				// Don't do default actions on window, that's where global variables be (#6170)
				if ( ontype && jQuery.isFunction( elem[ type ] ) && !jQuery.isWindow( elem ) ) {

					// Don't re-trigger an onFOO event when we call its FOO() method
					tmp = elem[ ontype ];

					if ( tmp ) {
						elem[ ontype ] = null;
					}

					// Prevent re-triggering of the same event, since we already bubbled it above
					jQuery.event.triggered = type;
					elem[ type ]();
					jQuery.event.triggered = undefined;

					if ( tmp ) {
						elem[ ontype ] = tmp;
					}
				}
			}
		}

		return event.result;
	},

	// Piggyback on a donor event to simulate a different one
	// Used only for `focus(in | out)` events
	simulate: function( type, elem, event ) {
		var e = jQuery.extend(
			new jQuery.Event(),
			event,
			{
				type: type,
				isSimulated: true
			}
		);

		jQuery.event.trigger( e, null, elem );
	}

} );

jQuery.fn.extend( {

	trigger: function( type, data ) {
		return this.each( function() {
			jQuery.event.trigger( type, data, this );
		} );
	},
	triggerHandler: function( type, data ) {
		var elem = this[ 0 ];
		if ( elem ) {
			return jQuery.event.trigger( type, data, elem, true );
		}
	}
} );


jQuery.each( ( "blur focus focusin focusout load resize scroll unload click dblclick " +
	"mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave " +
	"change select submit keydown keypress keyup error contextmenu" ).split( " " ),
	function( i, name ) {

	// Handle event binding
	jQuery.fn[ name ] = function( data, fn ) {
		return arguments.length > 0 ?
			this.on( name, null, data, fn ) :
			this.trigger( name );
	};
} );

jQuery.fn.extend( {
	hover: function( fnOver, fnOut ) {
		return this.mouseenter( fnOver ).mouseleave( fnOut || fnOver );
	}
} );




support.focusin = "onfocusin" in window;


// Support: Firefox
// Firefox doesn't have focus(in | out) events
// Related ticket - https://bugzilla.mozilla.org/show_bug.cgi?id=687787
//
// Support: Chrome, Safari
// focus(in | out) events fire after focus & blur events,
// which is spec violation - http://www.w3.org/TR/DOM-Level-3-Events/#events-focusevent-event-order
// Related ticket - https://code.google.com/p/chromium/issues/detail?id=449857
if ( !support.focusin ) {
	jQuery.each( { focus: "focusin", blur: "focusout" }, function( orig, fix ) {

		// Attach a single capturing handler on the document while someone wants focusin/focusout
		var handler = function( event ) {
			jQuery.event.simulate( fix, event.target, jQuery.event.fix( event ) );
		};

		jQuery.event.special[ fix ] = {
			setup: function() {
				var doc = this.ownerDocument || this,
					attaches = dataPriv.access( doc, fix );

				if ( !attaches ) {
					doc.addEventListener( orig, handler, true );
				}
				dataPriv.access( doc, fix, ( attaches || 0 ) + 1 );
			},
			teardown: function() {
				var doc = this.ownerDocument || this,
					attaches = dataPriv.access( doc, fix ) - 1;

				if ( !attaches ) {
					doc.removeEventListener( orig, handler, true );
					dataPriv.remove( doc, fix );

				} else {
					dataPriv.access( doc, fix, attaches );
				}
			}
		};
	} );
}
var location = window.location;

var nonce = jQuery.now();

var rquery = ( /\?/ );



// Support: Android 2.3
// Workaround failure to string-cast null input
jQuery.parseJSON = function( data ) {
	return JSON.parse( data + "" );
};


// Cross-browser xml parsing
jQuery.parseXML = function( data ) {
	var xml;
	if ( !data || typeof data !== "string" ) {
		return null;
	}

	// Support: IE9
	try {
		xml = ( new window.DOMParser() ).parseFromString( data, "text/xml" );
	} catch ( e ) {
		xml = undefined;
	}

	if ( !xml || xml.getElementsByTagName( "parsererror" ).length ) {
		jQuery.error( "Invalid XML: " + data );
	}
	return xml;
};


var
	rhash = /#.*$/,
	rts = /([?&])_=[^&]*/,
	rheaders = /^(.*?):[ \t]*([^\r\n]*)$/mg,

	// #7653, #8125, #8152: local protocol detection
	rlocalProtocol = /^(?:about|app|app-storage|.+-extension|file|res|widget):$/,
	rnoContent = /^(?:GET|HEAD)$/,
	rprotocol = /^\/\//,

	/* Prefilters
	 * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example)
	 * 2) These are called:
	 *    - BEFORE asking for a transport
	 *    - AFTER param serialization (s.data is a string if s.processData is true)
	 * 3) key is the dataType
	 * 4) the catchall symbol "*" can be used
	 * 5) execution will start with transport dataType and THEN continue down to "*" if needed
	 */
	prefilters = {},

	/* Transports bindings
	 * 1) key is the dataType
	 * 2) the catchall symbol "*" can be used
	 * 3) selection will start with transport dataType and THEN go to "*" if needed
	 */
	transports = {},

	// Avoid comment-prolog char sequence (#10098); must appease lint and evade compression
	allTypes = "*/".concat( "*" ),

	// Anchor tag for parsing the document origin
	originAnchor = document.createElement( "a" );
	originAnchor.href = location.href;

// Base "constructor" for jQuery.ajaxPrefilter and jQuery.ajaxTransport
function addToPrefiltersOrTransports( structure ) {

	// dataTypeExpression is optional and defaults to "*"
	return function( dataTypeExpression, func ) {

		if ( typeof dataTypeExpression !== "string" ) {
			func = dataTypeExpression;
			dataTypeExpression = "*";
		}

		var dataType,
			i = 0,
			dataTypes = dataTypeExpression.toLowerCase().match( rnotwhite ) || [];

		if ( jQuery.isFunction( func ) ) {

			// For each dataType in the dataTypeExpression
			while ( ( dataType = dataTypes[ i++ ] ) ) {

				// Prepend if requested
				if ( dataType[ 0 ] === "+" ) {
					dataType = dataType.slice( 1 ) || "*";
					( structure[ dataType ] = structure[ dataType ] || [] ).unshift( func );

				// Otherwise append
				} else {
					( structure[ dataType ] = structure[ dataType ] || [] ).push( func );
				}
			}
		}
	};
}

// Base inspection function for prefilters and transports
function inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR ) {

	var inspected = {},
		seekingTransport = ( structure === transports );

	function inspect( dataType ) {
		var selected;
		inspected[ dataType ] = true;
		jQuery.each( structure[ dataType ] || [], function( _, prefilterOrFactory ) {
			var dataTypeOrTransport = prefilterOrFactory( options, originalOptions, jqXHR );
			if ( typeof dataTypeOrTransport === "string" &&
				!seekingTransport && !inspected[ dataTypeOrTransport ] ) {

				options.dataTypes.unshift( dataTypeOrTransport );
				inspect( dataTypeOrTransport );
				return false;
			} else if ( seekingTransport ) {
				return !( selected = dataTypeOrTransport );
			}
		} );
		return selected;
	}

	return inspect( options.dataTypes[ 0 ] ) || !inspected[ "*" ] && inspect( "*" );
}

// A special extend for ajax options
// that takes "flat" options (not to be deep extended)
// Fixes #9887
function ajaxExtend( target, src ) {
	var key, deep,
		flatOptions = jQuery.ajaxSettings.flatOptions || {};

	for ( key in src ) {
		if ( src[ key ] !== undefined ) {
			( flatOptions[ key ] ? target : ( deep || ( deep = {} ) ) )[ key ] = src[ key ];
		}
	}
	if ( deep ) {
		jQuery.extend( true, target, deep );
	}

	return target;
}

/* Handles responses to an ajax request:
 * - finds the right dataType (mediates between content-type and expected dataType)
 * - returns the corresponding response
 */
function ajaxHandleResponses( s, jqXHR, responses ) {

	var ct, type, finalDataType, firstDataType,
		contents = s.contents,
		dataTypes = s.dataTypes;

	// Remove auto dataType and get content-type in the process
	while ( dataTypes[ 0 ] === "*" ) {
		dataTypes.shift();
		if ( ct === undefined ) {
			ct = s.mimeType || jqXHR.getResponseHeader( "Content-Type" );
		}
	}

	// Check if we're dealing with a known content-type
	if ( ct ) {
		for ( type in contents ) {
			if ( contents[ type ] && contents[ type ].test( ct ) ) {
				dataTypes.unshift( type );
				break;
			}
		}
	}

	// Check to see if we have a response for the expected dataType
	if ( dataTypes[ 0 ] in responses ) {
		finalDataType = dataTypes[ 0 ];
	} else {

		// Try convertible dataTypes
		for ( type in responses ) {
			if ( !dataTypes[ 0 ] || s.converters[ type + " " + dataTypes[ 0 ] ] ) {
				finalDataType = type;
				break;
			}
			if ( !firstDataType ) {
				firstDataType = type;
			}
		}

		// Or just use first one
		finalDataType = finalDataType || firstDataType;
	}

	// If we found a dataType
	// We add the dataType to the list if needed
	// and return the corresponding response
	if ( finalDataType ) {
		if ( finalDataType !== dataTypes[ 0 ] ) {
			dataTypes.unshift( finalDataType );
		}
		return responses[ finalDataType ];
	}
}

/* Chain conversions given the request and the original response
 * Also sets the responseXXX fields on the jqXHR instance
 */
function ajaxConvert( s, response, jqXHR, isSuccess ) {
	var conv2, current, conv, tmp, prev,
		converters = {},

		// Work with a copy of dataTypes in case we need to modify it for conversion
		dataTypes = s.dataTypes.slice();

	// Create converters map with lowercased keys
	if ( dataTypes[ 1 ] ) {
		for ( conv in s.converters ) {
			converters[ conv.toLowerCase() ] = s.converters[ conv ];
		}
	}

	current = dataTypes.shift();

	// Convert to each sequential dataType
	while ( current ) {

		if ( s.responseFields[ current ] ) {
			jqXHR[ s.responseFields[ current ] ] = response;
		}

		// Apply the dataFilter if provided
		if ( !prev && isSuccess && s.dataFilter ) {
			response = s.dataFilter( response, s.dataType );
		}

		prev = current;
		current = dataTypes.shift();

		if ( current ) {

		// There's only work to do if current dataType is non-auto
			if ( current === "*" ) {

				current = prev;

			// Convert response if prev dataType is non-auto and differs from current
			} else if ( prev !== "*" && prev !== current ) {

				// Seek a direct converter
				conv = converters[ prev + " " + current ] || converters[ "* " + current ];

				// If none found, seek a pair
				if ( !conv ) {
					for ( conv2 in converters ) {

						// If conv2 outputs current
						tmp = conv2.split( " " );
						if ( tmp[ 1 ] === current ) {

							// If prev can be converted to accepted input
							conv = converters[ prev + " " + tmp[ 0 ] ] ||
								converters[ "* " + tmp[ 0 ] ];
							if ( conv ) {

								// Condense equivalence converters
								if ( conv === true ) {
									conv = converters[ conv2 ];

								// Otherwise, insert the intermediate dataType
								} else if ( converters[ conv2 ] !== true ) {
									current = tmp[ 0 ];
									dataTypes.unshift( tmp[ 1 ] );
								}
								break;
							}
						}
					}
				}

				// Apply converter (if not an equivalence)
				if ( conv !== true ) {

					// Unless errors are allowed to bubble, catch and return them
					if ( conv && s.throws ) {
						response = conv( response );
					} else {
						try {
							response = conv( response );
						} catch ( e ) {
							return {
								state: "parsererror",
								error: conv ? e : "No conversion from " + prev + " to " + current
							};
						}
					}
				}
			}
		}
	}

	return { state: "success", data: response };
}

jQuery.extend( {

	// Counter for holding the number of active queries
	active: 0,

	// Last-Modified header cache for next request
	lastModified: {},
	etag: {},

	ajaxSettings: {
		url: location.href,
		type: "GET",
		isLocal: rlocalProtocol.test( location.protocol ),
		global: true,
		processData: true,
		async: true,
		contentType: "application/x-www-form-urlencoded; charset=UTF-8",
		/*
		timeout: 0,
		data: null,
		dataType: null,
		username: null,
		password: null,
		cache: null,
		throws: false,
		traditional: false,
		headers: {},
		*/

		accepts: {
			"*": allTypes,
			text: "text/plain",
			html: "text/html",
			xml: "application/xml, text/xml",
			json: "application/json, text/javascript"
		},

		contents: {
			xml: /\bxml\b/,
			html: /\bhtml/,
			json: /\bjson\b/
		},

		responseFields: {
			xml: "responseXML",
			text: "responseText",
			json: "responseJSON"
		},

		// Data converters
		// Keys separate source (or catchall "*") and destination types with a single space
		converters: {

			// Convert anything to text
			"* text": String,

			// Text to html (true = no transformation)
			"text html": true,

			// Evaluate text as a json expression
			"text json": jQuery.parseJSON,

			// Parse text as xml
			"text xml": jQuery.parseXML
		},

		// For options that shouldn't be deep extended:
		// you can add your own custom options here if
		// and when you create one that shouldn't be
		// deep extended (see ajaxExtend)
		flatOptions: {
			url: true,
			context: true
		}
	},

	// Creates a full fledged settings object into target
	// with both ajaxSettings and settings fields.
	// If target is omitted, writes into ajaxSettings.
	ajaxSetup: function( target, settings ) {
		return settings ?

			// Building a settings object
			ajaxExtend( ajaxExtend( target, jQuery.ajaxSettings ), settings ) :

			// Extending ajaxSettings
			ajaxExtend( jQuery.ajaxSettings, target );
	},

	ajaxPrefilter: addToPrefiltersOrTransports( prefilters ),
	ajaxTransport: addToPrefiltersOrTransports( transports ),

	// Main method
	ajax: function( url, options ) {

		// If url is an object, simulate pre-1.5 signature
		if ( typeof url === "object" ) {
			options = url;
			url = undefined;
		}

		// Force options to be an object
		options = options || {};

		var transport,

			// URL without anti-cache param
			cacheURL,

			// Response headers
			responseHeadersString,
			responseHeaders,

			// timeout handle
			timeoutTimer,

			// Url cleanup var
			urlAnchor,

			// To know if global events are to be dispatched
			fireGlobals,

			// Loop variable
			i,

			// Create the final options object
			s = jQuery.ajaxSetup( {}, options ),

			// Callbacks context
			callbackContext = s.context || s,

			// Context for global events is callbackContext if it is a DOM node or jQuery collection
			globalEventContext = s.context &&
				( callbackContext.nodeType || callbackContext.jquery ) ?
					jQuery( callbackContext ) :
					jQuery.event,

			// Deferreds
			deferred = jQuery.Deferred(),
			completeDeferred = jQuery.Callbacks( "once memory" ),

			// Status-dependent callbacks
			statusCode = s.statusCode || {},

			// Headers (they are sent all at once)
			requestHeaders = {},
			requestHeadersNames = {},

			// The jqXHR state
			state = 0,

			// Default abort message
			strAbort = "canceled",

			// Fake xhr
			jqXHR = {
				readyState: 0,

				// Builds headers hashtable if needed
				getResponseHeader: function( key ) {
					var match;
					if ( state === 2 ) {
						if ( !responseHeaders ) {
							responseHeaders = {};
							while ( ( match = rheaders.exec( responseHeadersString ) ) ) {
								responseHeaders[ match[ 1 ].toLowerCase() ] = match[ 2 ];
							}
						}
						match = responseHeaders[ key.toLowerCase() ];
					}
					return match == null ? null : match;
				},

				// Raw string
				getAllResponseHeaders: function() {
					return state === 2 ? responseHeadersString : null;
				},

				// Caches the header
				setRequestHeader: function( name, value ) {
					var lname = name.toLowerCase();
					if ( !state ) {
						name = requestHeadersNames[ lname ] = requestHeadersNames[ lname ] || name;
						requestHeaders[ name ] = value;
					}
					return this;
				},

				// Overrides response content-type header
				overrideMimeType: function( type ) {
					if ( !state ) {
						s.mimeType = type;
					}
					return this;
				},

				// Status-dependent callbacks
				statusCode: function( map ) {
					var code;
					if ( map ) {
						if ( state < 2 ) {
							for ( code in map ) {

								// Lazy-add the new callback in a way that preserves old ones
								statusCode[ code ] = [ statusCode[ code ], map[ code ] ];
							}
						} else {

							// Execute the appropriate callbacks
							jqXHR.always( map[ jqXHR.status ] );
						}
					}
					return this;
				},

				// Cancel the request
				abort: function( statusText ) {
					var finalText = statusText || strAbort;
					if ( transport ) {
						transport.abort( finalText );
					}
					done( 0, finalText );
					return this;
				}
			};

		// Attach deferreds
		deferred.promise( jqXHR ).complete = completeDeferred.add;
		jqXHR.success = jqXHR.done;
		jqXHR.error = jqXHR.fail;

		// Remove hash character (#7531: and string promotion)
		// Add protocol if not provided (prefilters might expect it)
		// Handle falsy url in the settings object (#10093: consistency with old signature)
		// We also use the url parameter if available
		s.url = ( ( url || s.url || location.href ) + "" ).replace( rhash, "" )
			.replace( rprotocol, location.protocol + "//" );

		// Alias method option to type as per ticket #12004
		s.type = options.method || options.type || s.method || s.type;

		// Extract dataTypes list
		s.dataTypes = jQuery.trim( s.dataType || "*" ).toLowerCase().match( rnotwhite ) || [ "" ];

		// A cross-domain request is in order when the origin doesn't match the current origin.
		if ( s.crossDomain == null ) {
			urlAnchor = document.createElement( "a" );

			// Support: IE8-11+
			// IE throws exception if url is malformed, e.g. http://example.com:80x/
			try {
				urlAnchor.href = s.url;

				// Support: IE8-11+
				// Anchor's host property isn't correctly set when s.url is relative
				urlAnchor.href = urlAnchor.href;
				s.crossDomain = originAnchor.protocol + "//" + originAnchor.host !==
					urlAnchor.protocol + "//" + urlAnchor.host;
			} catch ( e ) {

				// If there is an error parsing the URL, assume it is crossDomain,
				// it can be rejected by the transport if it is invalid
				s.crossDomain = true;
			}
		}

		// Convert data if not already a string
		if ( s.data && s.processData && typeof s.data !== "string" ) {
			s.data = jQuery.param( s.data, s.traditional );
		}

		// Apply prefilters
		inspectPrefiltersOrTransports( prefilters, s, options, jqXHR );

		// If request was aborted inside a prefilter, stop there
		if ( state === 2 ) {
			return jqXHR;
		}

		// We can fire global events as of now if asked to
		// Don't fire events if jQuery.event is undefined in an AMD-usage scenario (#15118)
		fireGlobals = jQuery.event && s.global;

		// Watch for a new set of requests
		if ( fireGlobals && jQuery.active++ === 0 ) {
			jQuery.event.trigger( "ajaxStart" );
		}

		// Uppercase the type
		s.type = s.type.toUpperCase();

		// Determine if request has content
		s.hasContent = !rnoContent.test( s.type );

		// Save the URL in case we're toying with the If-Modified-Since
		// and/or If-None-Match header later on
		cacheURL = s.url;

		// More options handling for requests with no content
		if ( !s.hasContent ) {

			// If data is available, append data to url
			if ( s.data ) {
				cacheURL = ( s.url += ( rquery.test( cacheURL ) ? "&" : "?" ) + s.data );

				// #9682: remove data so that it's not used in an eventual retry
				delete s.data;
			}

			// Add anti-cache in url if needed
			if ( s.cache === false ) {
				s.url = rts.test( cacheURL ) ?

					// If there is already a '_' parameter, set its value
					cacheURL.replace( rts, "$1_=" + nonce++ ) :

					// Otherwise add one to the end
					cacheURL + ( rquery.test( cacheURL ) ? "&" : "?" ) + "_=" + nonce++;
			}
		}

		// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
		if ( s.ifModified ) {
			if ( jQuery.lastModified[ cacheURL ] ) {
				jqXHR.setRequestHeader( "If-Modified-Since", jQuery.lastModified[ cacheURL ] );
			}
			if ( jQuery.etag[ cacheURL ] ) {
				jqXHR.setRequestHeader( "If-None-Match", jQuery.etag[ cacheURL ] );
			}
		}

		// Set the correct header, if data is being sent
		if ( s.data && s.hasContent && s.contentType !== false || options.contentType ) {
			jqXHR.setRequestHeader( "Content-Type", s.contentType );
		}

		// Set the Accepts header for the server, depending on the dataType
		jqXHR.setRequestHeader(
			"Accept",
			s.dataTypes[ 0 ] && s.accepts[ s.dataTypes[ 0 ] ] ?
				s.accepts[ s.dataTypes[ 0 ] ] +
					( s.dataTypes[ 0 ] !== "*" ? ", " + allTypes + "; q=0.01" : "" ) :
				s.accepts[ "*" ]
		);

		// Check for headers option
		for ( i in s.headers ) {
			jqXHR.setRequestHeader( i, s.headers[ i ] );
		}

		// Allow custom headers/mimetypes and early abort
		if ( s.beforeSend &&
			( s.beforeSend.call( callbackContext, jqXHR, s ) === false || state === 2 ) ) {

			// Abort if not done already and return
			return jqXHR.abort();
		}

		// Aborting is no longer a cancellation
		strAbort = "abort";

		// Install callbacks on deferreds
		for ( i in { success: 1, error: 1, complete: 1 } ) {
			jqXHR[ i ]( s[ i ] );
		}

		// Get transport
		transport = inspectPrefiltersOrTransports( transports, s, options, jqXHR );

		// If no transport, we auto-abort
		if ( !transport ) {
			done( -1, "No Transport" );
		} else {
			jqXHR.readyState = 1;

			// Send global event
			if ( fireGlobals ) {
				globalEventContext.trigger( "ajaxSend", [ jqXHR, s ] );
			}

			// If request was aborted inside ajaxSend, stop there
			if ( state === 2 ) {
				return jqXHR;
			}

			// Timeout
			if ( s.async && s.timeout > 0 ) {
				timeoutTimer = window.setTimeout( function() {
					jqXHR.abort( "timeout" );
				}, s.timeout );
			}

			try {
				state = 1;
				transport.send( requestHeaders, done );
			} catch ( e ) {

				// Propagate exception as error if not done
				if ( state < 2 ) {
					done( -1, e );

				// Simply rethrow otherwise
				} else {
					throw e;
				}
			}
		}

		// Callback for when everything is done
		function done( status, nativeStatusText, responses, headers ) {
			var isSuccess, success, error, response, modified,
				statusText = nativeStatusText;

			// Called once
			if ( state === 2 ) {
				return;
			}

			// State is "done" now
			state = 2;

			// Clear timeout if it exists
			if ( timeoutTimer ) {
				window.clearTimeout( timeoutTimer );
			}

			// Dereference transport for early garbage collection
			// (no matter how long the jqXHR object will be used)
			transport = undefined;

			// Cache response headers
			responseHeadersString = headers || "";

			// Set readyState
			jqXHR.readyState = status > 0 ? 4 : 0;

			// Determine if successful
			isSuccess = status >= 200 && status < 300 || status === 304;

			// Get response data
			if ( responses ) {
				response = ajaxHandleResponses( s, jqXHR, responses );
			}

			// Convert no matter what (that way responseXXX fields are always set)
			response = ajaxConvert( s, response, jqXHR, isSuccess );

			// If successful, handle type chaining
			if ( isSuccess ) {

				// Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
				if ( s.ifModified ) {
					modified = jqXHR.getResponseHeader( "Last-Modified" );
					if ( modified ) {
						jQuery.lastModified[ cacheURL ] = modified;
					}
					modified = jqXHR.getResponseHeader( "etag" );
					if ( modified ) {
						jQuery.etag[ cacheURL ] = modified;
					}
				}

				// if no content
				if ( status === 204 || s.type === "HEAD" ) {
					statusText = "nocontent";

				// if not modified
				} else if ( status === 304 ) {
					statusText = "notmodified";

				// If we have data, let's convert it
				} else {
					statusText = response.state;
					success = response.data;
					error = response.error;
					isSuccess = !error;
				}
			} else {

				// Extract error from statusText and normalize for non-aborts
				error = statusText;
				if ( status || !statusText ) {
					statusText = "error";
					if ( status < 0 ) {
						status = 0;
					}
				}
			}

			// Set data for the fake xhr object
			jqXHR.status = status;
			jqXHR.statusText = ( nativeStatusText || statusText ) + "";

			// Success/Error
			if ( isSuccess ) {
				deferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] );
			} else {
				deferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] );
			}

			// Status-dependent callbacks
			jqXHR.statusCode( statusCode );
			statusCode = undefined;

			if ( fireGlobals ) {
				globalEventContext.trigger( isSuccess ? "ajaxSuccess" : "ajaxError",
					[ jqXHR, s, isSuccess ? success : error ] );
			}

			// Complete
			completeDeferred.fireWith( callbackContext, [ jqXHR, statusText ] );

			if ( fireGlobals ) {
				globalEventContext.trigger( "ajaxComplete", [ jqXHR, s ] );

				// Handle the global AJAX counter
				if ( !( --jQuery.active ) ) {
					jQuery.event.trigger( "ajaxStop" );
				}
			}
		}

		return jqXHR;
	},

	getJSON: function( url, data, callback ) {
		return jQuery.get( url, data, callback, "json" );
	},

	getScript: function( url, callback ) {
		return jQuery.get( url, undefined, callback, "script" );
	}
} );

jQuery.each( [ "get", "post" ], function( i, method ) {
	jQuery[ method ] = function( url, data, callback, type ) {

		// Shift arguments if data argument was omitted
		if ( jQuery.isFunction( data ) ) {
			type = type || callback;
			callback = data;
			data = undefined;
		}

		// The url can be an options object (which then must have .url)
		return jQuery.ajax( jQuery.extend( {
			url: url,
			type: method,
			dataType: type,
			data: data,
			success: callback
		}, jQuery.isPlainObject( url ) && url ) );
	};
} );


jQuery._evalUrl = function( url ) {
	return jQuery.ajax( {
		url: url,

		// Make this explicit, since user can override this through ajaxSetup (#11264)
		type: "GET",
		dataType: "script",
		async: false,
		global: false,
		"throws": true
	} );
};


jQuery.fn.extend( {
	wrapAll: function( html ) {
		var wrap;

		if ( jQuery.isFunction( html ) ) {
			return this.each( function( i ) {
				jQuery( this ).wrapAll( html.call( this, i ) );
			} );
		}

		if ( this[ 0 ] ) {

			// The elements to wrap the target around
			wrap = jQuery( html, this[ 0 ].ownerDocument ).eq( 0 ).clone( true );

			if ( this[ 0 ].parentNode ) {
				wrap.insertBefore( this[ 0 ] );
			}

			wrap.map( function() {
				var elem = this;

				while ( elem.firstElementChild ) {
					elem = elem.firstElementChild;
				}

				return elem;
			} ).append( this );
		}

		return this;
	},

	wrapInner: function( html ) {
		if ( jQuery.isFunction( html ) ) {
			return this.each( function( i ) {
				jQuery( this ).wrapInner( html.call( this, i ) );
			} );
		}

		return this.each( function() {
			var self = jQuery( this ),
				contents = self.contents();

			if ( contents.length ) {
				contents.wrapAll( html );

			} else {
				self.append( html );
			}
		} );
	},

	wrap: function( html ) {
		var isFunction = jQuery.isFunction( html );

		return this.each( function( i ) {
			jQuery( this ).wrapAll( isFunction ? html.call( this, i ) : html );
		} );
	},

	unwrap: function() {
		return this.parent().each( function() {
			if ( !jQuery.nodeName( this, "body" ) ) {
				jQuery( this ).replaceWith( this.childNodes );
			}
		} ).end();
	}
} );


jQuery.expr.filters.hidden = function( elem ) {
	return !jQuery.expr.filters.visible( elem );
};
jQuery.expr.filters.visible = function( elem ) {

	// Support: Opera <= 12.12
	// Opera reports offsetWidths and offsetHeights less than zero on some elements
	// Use OR instead of AND as the element is not visible if either is true
	// See tickets #10406 and #13132
	return elem.offsetWidth > 0 || elem.offsetHeight > 0 || elem.getClientRects().length > 0;
};




var r20 = /%20/g,
	rbracket = /\[\]$/,
	rCRLF = /\r?\n/g,
	rsubmitterTypes = /^(?:submit|button|image|reset|file)$/i,
	rsubmittable = /^(?:input|select|textarea|keygen)/i;

function buildParams( prefix, obj, traditional, add ) {
	var name;

	if ( jQuery.isArray( obj ) ) {

		// Serialize array item.
		jQuery.each( obj, function( i, v ) {
			if ( traditional || rbracket.test( prefix ) ) {

				// Treat each array item as a scalar.
				add( prefix, v );

			} else {

				// Item is non-scalar (array or object), encode its numeric index.
				buildParams(
					prefix + "[" + ( typeof v === "object" && v != null ? i : "" ) + "]",
					v,
					traditional,
					add
				);
			}
		} );

	} else if ( !traditional && jQuery.type( obj ) === "object" ) {

		// Serialize object item.
		for ( name in obj ) {
			buildParams( prefix + "[" + name + "]", obj[ name ], traditional, add );
		}

	} else {

		// Serialize scalar item.
		add( prefix, obj );
	}
}

// Serialize an array of form elements or a set of
// key/values into a query string
jQuery.param = function( a, traditional ) {
	var prefix,
		s = [],
		add = function( key, value ) {

			// If value is a function, invoke it and return its value
			value = jQuery.isFunction( value ) ? value() : ( value == null ? "" : value );
			s[ s.length ] = encodeURIComponent( key ) + "=" + encodeURIComponent( value );
		};

	// Set traditional to true for jQuery <= 1.3.2 behavior.
	if ( traditional === undefined ) {
		traditional = jQuery.ajaxSettings && jQuery.ajaxSettings.traditional;
	}

	// If an array was passed in, assume that it is an array of form elements.
	if ( jQuery.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) {

		// Serialize the form elements
		jQuery.each( a, function() {
			add( this.name, this.value );
		} );

	} else {

		// If traditional, encode the "old" way (the way 1.3.2 or older
		// did it), otherwise encode params recursively.
		for ( prefix in a ) {
			buildParams( prefix, a[ prefix ], traditional, add );
		}
	}

	// Return the resulting serialization
	return s.join( "&" ).replace( r20, "+" );
};

jQuery.fn.extend( {
	serialize: function() {
		return jQuery.param( this.serializeArray() );
	},
	serializeArray: function() {
		return this.map( function() {

			// Can add propHook for "elements" to filter or add form elements
			var elements = jQuery.prop( this, "elements" );
			return elements ? jQuery.makeArray( elements ) : this;
		} )
		.filter( function() {
			var type = this.type;

			// Use .is( ":disabled" ) so that fieldset[disabled] works
			return this.name && !jQuery( this ).is( ":disabled" ) &&
				rsubmittable.test( this.nodeName ) && !rsubmitterTypes.test( type ) &&
				( this.checked || !rcheckableType.test( type ) );
		} )
		.map( function( i, elem ) {
			var val = jQuery( this ).val();

			return val == null ?
				null :
				jQuery.isArray( val ) ?
					jQuery.map( val, function( val ) {
						return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
					} ) :
					{ name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
		} ).get();
	}
} );


jQuery.ajaxSettings.xhr = function() {
	try {
		return new window.XMLHttpRequest();
	} catch ( e ) {}
};

var xhrSuccessStatus = {

		// File protocol always yields status code 0, assume 200
		0: 200,

		// Support: IE9
		// #1450: sometimes IE returns 1223 when it should be 204
		1223: 204
	},
	xhrSupported = jQuery.ajaxSettings.xhr();

support.cors = !!xhrSupported && ( "withCredentials" in xhrSupported );
support.ajax = xhrSupported = !!xhrSupported;

jQuery.ajaxTransport( function( options ) {
	var callback, errorCallback;

	// Cross domain only allowed if supported through XMLHttpRequest
	if ( support.cors || xhrSupported && !options.crossDomain ) {
		return {
			send: function( headers, complete ) {
				var i,
					xhr = options.xhr();

				xhr.open(
					options.type,
					options.url,
					options.async,
					options.username,
					options.password
				);

				// Apply custom fields if provided
				if ( options.xhrFields ) {
					for ( i in options.xhrFields ) {
						xhr[ i ] = options.xhrFields[ i ];
					}
				}

				// Override mime type if needed
				if ( options.mimeType && xhr.overrideMimeType ) {
					xhr.overrideMimeType( options.mimeType );
				}

				// X-Requested-With header
				// For cross-domain requests, seeing as conditions for a preflight are
				// akin to a jigsaw puzzle, we simply never set it to be sure.
				// (it can always be set on a per-request basis or even using ajaxSetup)
				// For same-domain requests, won't change header if already provided.
				if ( !options.crossDomain && !headers[ "X-Requested-With" ] ) {
					headers[ "X-Requested-With" ] = "XMLHttpRequest";
				}

				// Set headers
				for ( i in headers ) {
					xhr.setRequestHeader( i, headers[ i ] );
				}

				// Callback
				callback = function( type ) {
					return function() {
						if ( callback ) {
							callback = errorCallback = xhr.onload =
								xhr.onerror = xhr.onabort = xhr.onreadystatechange = null;

							if ( type === "abort" ) {
								xhr.abort();
							} else if ( type === "error" ) {

								// Support: IE9
								// On a manual native abort, IE9 throws
								// errors on any property access that is not readyState
								if ( typeof xhr.status !== "number" ) {
									complete( 0, "error" );
								} else {
									complete(

										// File: protocol always yields status 0; see #8605, #14207
										xhr.status,
										xhr.statusText
									);
								}
							} else {
								complete(
									xhrSuccessStatus[ xhr.status ] || xhr.status,
									xhr.statusText,

									// Support: IE9 only
									// IE9 has no XHR2 but throws on binary (trac-11426)
									// For XHR2 non-text, let the caller handle it (gh-2498)
									( xhr.responseType || "text" ) !== "text"  ||
									typeof xhr.responseText !== "string" ?
										{ binary: xhr.response } :
										{ text: xhr.responseText },
									xhr.getAllResponseHeaders()
								);
							}
						}
					};
				};

				// Listen to events
				xhr.onload = callback();
				errorCallback = xhr.onerror = callback( "error" );

				// Support: IE9
				// Use onreadystatechange to replace onabort
				// to handle uncaught aborts
				if ( xhr.onabort !== undefined ) {
					xhr.onabort = errorCallback;
				} else {
					xhr.onreadystatechange = function() {

						// Check readyState before timeout as it changes
						if ( xhr.readyState === 4 ) {

							// Allow onerror to be called first,
							// but that will not handle a native abort
							// Also, save errorCallback to a variable
							// as xhr.onerror cannot be accessed
							window.setTimeout( function() {
								if ( callback ) {
									errorCallback();
								}
							} );
						}
					};
				}

				// Create the abort callback
				callback = callback( "abort" );

				try {

					// Do send the request (this may raise an exception)
					xhr.send( options.hasContent && options.data || null );
				} catch ( e ) {

					// #14683: Only rethrow if this hasn't been notified as an error yet
					if ( callback ) {
						throw e;
					}
				}
			},

			abort: function() {
				if ( callback ) {
					callback();
				}
			}
		};
	}
} );




// Install script dataType
jQuery.ajaxSetup( {
	accepts: {
		script: "text/javascript, application/javascript, " +
			"application/ecmascript, application/x-ecmascript"
	},
	contents: {
		script: /\b(?:java|ecma)script\b/
	},
	converters: {
		"text script": function( text ) {
			jQuery.globalEval( text );
			return text;
		}
	}
} );

// Handle cache's special case and crossDomain
jQuery.ajaxPrefilter( "script", function( s ) {
	if ( s.cache === undefined ) {
		s.cache = false;
	}
	if ( s.crossDomain ) {
		s.type = "GET";
	}
} );

// Bind script tag hack transport
jQuery.ajaxTransport( "script", function( s ) {

	// This transport only deals with cross domain requests
	if ( s.crossDomain ) {
		var script, callback;
		return {
			send: function( _, complete ) {
				script = jQuery( "<script>" ).prop( {
					charset: s.scriptCharset,
					src: s.url
				} ).on(
					"load error",
					callback = function( evt ) {
						script.remove();
						callback = null;
						if ( evt ) {
							complete( evt.type === "error" ? 404 : 200, evt.type );
						}
					}
				);

				// Use native DOM manipulation to avoid our domManip AJAX trickery
				document.head.appendChild( script[ 0 ] );
			},
			abort: function() {
				if ( callback ) {
					callback();
				}
			}
		};
	}
} );




var oldCallbacks = [],
	rjsonp = /(=)\?(?=&|$)|\?\?/;

// Default jsonp settings
jQuery.ajaxSetup( {
	jsonp: "callback",
	jsonpCallback: function() {
		var callback = oldCallbacks.pop() || ( jQuery.expando + "_" + ( nonce++ ) );
		this[ callback ] = true;
		return callback;
	}
} );

// Detect, normalize options and install callbacks for jsonp requests
jQuery.ajaxPrefilter( "json jsonp", function( s, originalSettings, jqXHR ) {

	var callbackName, overwritten, responseContainer,
		jsonProp = s.jsonp !== false && ( rjsonp.test( s.url ) ?
			"url" :
			typeof s.data === "string" &&
				( s.contentType || "" )
					.indexOf( "application/x-www-form-urlencoded" ) === 0 &&
				rjsonp.test( s.data ) && "data"
		);

	// Handle iff the expected data type is "jsonp" or we have a parameter to set
	if ( jsonProp || s.dataTypes[ 0 ] === "jsonp" ) {

		// Get callback name, remembering preexisting value associated with it
		callbackName = s.jsonpCallback = jQuery.isFunction( s.jsonpCallback ) ?
			s.jsonpCallback() :
			s.jsonpCallback;

		// Insert callback into url or form data
		if ( jsonProp ) {
			s[ jsonProp ] = s[ jsonProp ].replace( rjsonp, "$1" + callbackName );
		} else if ( s.jsonp !== false ) {
			s.url += ( rquery.test( s.url ) ? "&" : "?" ) + s.jsonp + "=" + callbackName;
		}

		// Use data converter to retrieve json after script execution
		s.converters[ "script json" ] = function() {
			if ( !responseContainer ) {
				jQuery.error( callbackName + " was not called" );
			}
			return responseContainer[ 0 ];
		};

		// Force json dataType
		s.dataTypes[ 0 ] = "json";

		// Install callback
		overwritten = window[ callbackName ];
		window[ callbackName ] = function() {
			responseContainer = arguments;
		};

		// Clean-up function (fires after converters)
		jqXHR.always( function() {

			// If previous value didn't exist - remove it
			if ( overwritten === undefined ) {
				jQuery( window ).removeProp( callbackName );

			// Otherwise restore preexisting value
			} else {
				window[ callbackName ] = overwritten;
			}

			// Save back as free
			if ( s[ callbackName ] ) {

				// Make sure that re-using the options doesn't screw things around
				s.jsonpCallback = originalSettings.jsonpCallback;

				// Save the callback name for future use
				oldCallbacks.push( callbackName );
			}

			// Call if it was a function and we have a response
			if ( responseContainer && jQuery.isFunction( overwritten ) ) {
				overwritten( responseContainer[ 0 ] );
			}

			responseContainer = overwritten = undefined;
		} );

		// Delegate to script
		return "script";
	}
} );




// Argument "data" should be string of html
// context (optional): If specified, the fragment will be created in this context,
// defaults to document
// keepScripts (optional): If true, will include scripts passed in the html string
jQuery.parseHTML = function( data, context, keepScripts ) {
	if ( !data || typeof data !== "string" ) {
		return null;
	}
	if ( typeof context === "boolean" ) {
		keepScripts = context;
		context = false;
	}
	context = context || document;

	var parsed = rsingleTag.exec( data ),
		scripts = !keepScripts && [];

	// Single tag
	if ( parsed ) {
		return [ context.createElement( parsed[ 1 ] ) ];
	}

	parsed = buildFragment( [ data ], context, scripts );

	if ( scripts && scripts.length ) {
		jQuery( scripts ).remove();
	}

	return jQuery.merge( [], parsed.childNodes );
};


// Keep a copy of the old load method
var _load = jQuery.fn.load;

/**
 * Load a url into a page
 */
jQuery.fn.load = function( url, params, callback ) {
	if ( typeof url !== "string" && _load ) {
		return _load.apply( this, arguments );
	}

	var selector, type, response,
		self = this,
		off = url.indexOf( " " );

	if ( off > -1 ) {
		selector = jQuery.trim( url.slice( off ) );
		url = url.slice( 0, off );
	}

	// If it's a function
	if ( jQuery.isFunction( params ) ) {

		// We assume that it's the callback
		callback = params;
		params = undefined;

	// Otherwise, build a param string
	} else if ( params && typeof params === "object" ) {
		type = "POST";
	}

	// If we have elements to modify, make the request
	if ( self.length > 0 ) {
		jQuery.ajax( {
			url: url,

			// If "type" variable is undefined, then "GET" method will be used.
			// Make value of this field explicit since
			// user can override it through ajaxSetup method
			type: type || "GET",
			dataType: "html",
			data: params
		} ).done( function( responseText ) {

			// Save response for use in complete callback
			response = arguments;

			self.html( selector ?

				// If a selector was specified, locate the right elements in a dummy div
				// Exclude scripts to avoid IE 'Permission Denied' errors
				jQuery( "<div>" ).append( jQuery.parseHTML( responseText ) ).find( selector ) :

				// Otherwise use the full result
				responseText );

		// If the request succeeds, this function gets "data", "status", "jqXHR"
		// but they are ignored because response was set above.
		// If it fails, this function gets "jqXHR", "status", "error"
		} ).always( callback && function( jqXHR, status ) {
			self.each( function() {
				callback.apply( this, response || [ jqXHR.responseText, status, jqXHR ] );
			} );
		} );
	}

	return this;
};




// Attach a bunch of functions for handling common AJAX events
jQuery.each( [
	"ajaxStart",
	"ajaxStop",
	"ajaxComplete",
	"ajaxError",
	"ajaxSuccess",
	"ajaxSend"
], function( i, type ) {
	jQuery.fn[ type ] = function( fn ) {
		return this.on( type, fn );
	};
} );




jQuery.expr.filters.animated = function( elem ) {
	return jQuery.grep( jQuery.timers, function( fn ) {
		return elem === fn.elem;
	} ).length;
};




/**
 * Gets a window from an element
 */
function getWindow( elem ) {
	return jQuery.isWindow( elem ) ? elem : elem.nodeType === 9 && elem.defaultView;
}

jQuery.offset = {
	setOffset: function( elem, options, i ) {
		var curPosition, curLeft, curCSSTop, curTop, curOffset, curCSSLeft, calculatePosition,
			position = jQuery.css( elem, "position" ),
			curElem = jQuery( elem ),
			props = {};

		// Set position first, in-case top/left are set even on static elem
		if ( position === "static" ) {
			elem.style.position = "relative";
		}

		curOffset = curElem.offset();
		curCSSTop = jQuery.css( elem, "top" );
		curCSSLeft = jQuery.css( elem, "left" );
		calculatePosition = ( position === "absolute" || position === "fixed" ) &&
			( curCSSTop + curCSSLeft ).indexOf( "auto" ) > -1;

		// Need to be able to calculate position if either
		// top or left is auto and position is either absolute or fixed
		if ( calculatePosition ) {
			curPosition = curElem.position();
			curTop = curPosition.top;
			curLeft = curPosition.left;

		} else {
			curTop = parseFloat( curCSSTop ) || 0;
			curLeft = parseFloat( curCSSLeft ) || 0;
		}

		if ( jQuery.isFunction( options ) ) {

			// Use jQuery.extend here to allow modification of coordinates argument (gh-1848)
			options = options.call( elem, i, jQuery.extend( {}, curOffset ) );
		}

		if ( options.top != null ) {
			props.top = ( options.top - curOffset.top ) + curTop;
		}
		if ( options.left != null ) {
			props.left = ( options.left - curOffset.left ) + curLeft;
		}

		if ( "using" in options ) {
			options.using.call( elem, props );

		} else {
			curElem.css( props );
		}
	}
};

jQuery.fn.extend( {
	offset: function( options ) {
		if ( arguments.length ) {
			return options === undefined ?
				this :
				this.each( function( i ) {
					jQuery.offset.setOffset( this, options, i );
				} );
		}

		var docElem, win,
			elem = this[ 0 ],
			box = { top: 0, left: 0 },
			doc = elem && elem.ownerDocument;

		if ( !doc ) {
			return;
		}

		docElem = doc.documentElement;

		// Make sure it's not a disconnected DOM node
		if ( !jQuery.contains( docElem, elem ) ) {
			return box;
		}

		box = elem.getBoundingClientRect();
		win = getWindow( doc );
		return {
			top: box.top + win.pageYOffset - docElem.clientTop,
			left: box.left + win.pageXOffset - docElem.clientLeft
		};
	},

	position: function() {
		if ( !this[ 0 ] ) {
			return;
		}

		var offsetParent, offset,
			elem = this[ 0 ],
			parentOffset = { top: 0, left: 0 };

		// Fixed elements are offset from window (parentOffset = {top:0, left: 0},
		// because it is its only offset parent
		if ( jQuery.css( elem, "position" ) === "fixed" ) {

			// Assume getBoundingClientRect is there when computed position is fixed
			offset = elem.getBoundingClientRect();

		} else {

			// Get *real* offsetParent
			offsetParent = this.offsetParent();

			// Get correct offsets
			offset = this.offset();
			if ( !jQuery.nodeName( offsetParent[ 0 ], "html" ) ) {
				parentOffset = offsetParent.offset();
			}

			// Add offsetParent borders
			parentOffset.top += jQuery.css( offsetParent[ 0 ], "borderTopWidth", true );
			parentOffset.left += jQuery.css( offsetParent[ 0 ], "borderLeftWidth", true );
		}

		// Subtract parent offsets and element margins
		return {
			top: offset.top - parentOffset.top - jQuery.css( elem, "marginTop", true ),
			left: offset.left - parentOffset.left - jQuery.css( elem, "marginLeft", true )
		};
	},

	// This method will return documentElement in the following cases:
	// 1) For the element inside the iframe without offsetParent, this method will return
	//    documentElement of the parent window
	// 2) For the hidden or detached element
	// 3) For body or html element, i.e. in case of the html node - it will return itself
	//
	// but those exceptions were never presented as a real life use-cases
	// and might be considered as more preferable results.
	//
	// This logic, however, is not guaranteed and can change at any point in the future
	offsetParent: function() {
		return this.map( function() {
			var offsetParent = this.offsetParent;

			while ( offsetParent && jQuery.css( offsetParent, "position" ) === "static" ) {
				offsetParent = offsetParent.offsetParent;
			}

			return offsetParent || documentElement;
		} );
	}
} );

// Create scrollLeft and scrollTop methods
jQuery.each( { scrollLeft: "pageXOffset", scrollTop: "pageYOffset" }, function( method, prop ) {
	var top = "pageYOffset" === prop;

	jQuery.fn[ method ] = function( val ) {
		return access( this, function( elem, method, val ) {
			var win = getWindow( elem );

			if ( val === undefined ) {
				return win ? win[ prop ] : elem[ method ];
			}

			if ( win ) {
				win.scrollTo(
					!top ? val : win.pageXOffset,
					top ? val : win.pageYOffset
				);

			} else {
				elem[ method ] = val;
			}
		}, method, val, arguments.length );
	};
} );

// Support: Safari<7-8+, Chrome<37-44+
// Add the top/left cssHooks using jQuery.fn.position
// Webkit bug: https://bugs.webkit.org/show_bug.cgi?id=29084
// Blink bug: https://code.google.com/p/chromium/issues/detail?id=229280
// getComputedStyle returns percent when specified for top/left/bottom/right;
// rather than make the css module depend on the offset module, just check for it here
jQuery.each( [ "top", "left" ], function( i, prop ) {
	jQuery.cssHooks[ prop ] = addGetHookIf( support.pixelPosition,
		function( elem, computed ) {
			if ( computed ) {
				computed = curCSS( elem, prop );

				// If curCSS returns percentage, fallback to offset
				return rnumnonpx.test( computed ) ?
					jQuery( elem ).position()[ prop ] + "px" :
					computed;
			}
		}
	);
} );


// Create innerHeight, innerWidth, height, width, outerHeight and outerWidth methods
jQuery.each( { Height: "height", Width: "width" }, function( name, type ) {
	jQuery.each( { padding: "inner" + name, content: type, "": "outer" + name },
		function( defaultExtra, funcName ) {

		// Margin is only for outerHeight, outerWidth
		jQuery.fn[ funcName ] = function( margin, value ) {
			var chainable = arguments.length && ( defaultExtra || typeof margin !== "boolean" ),
				extra = defaultExtra || ( margin === true || value === true ? "margin" : "border" );

			return access( this, function( elem, type, value ) {
				var doc;

				if ( jQuery.isWindow( elem ) ) {

					// As of 5/8/2012 this will yield incorrect results for Mobile Safari, but there
					// isn't a whole lot we can do. See pull request at this URL for discussion:
					// https://github.com/jquery/jquery/pull/764
					return elem.document.documentElement[ "client" + name ];
				}

				// Get document width or height
				if ( elem.nodeType === 9 ) {
					doc = elem.documentElement;

					// Either scroll[Width/Height] or offset[Width/Height] or client[Width/Height],
					// whichever is greatest
					return Math.max(
						elem.body[ "scroll" + name ], doc[ "scroll" + name ],
						elem.body[ "offset" + name ], doc[ "offset" + name ],
						doc[ "client" + name ]
					);
				}

				return value === undefined ?

					// Get width or height on the element, requesting but not forcing parseFloat
					jQuery.css( elem, type, extra ) :

					// Set width or height on the element
					jQuery.style( elem, type, value, extra );
			}, type, chainable ? margin : undefined, chainable, null );
		};
	} );
} );


jQuery.fn.extend( {

	bind: function( types, data, fn ) {
		return this.on( types, null, data, fn );
	},
	unbind: function( types, fn ) {
		return this.off( types, null, fn );
	},

	delegate: function( selector, types, data, fn ) {
		return this.on( types, selector, data, fn );
	},
	undelegate: function( selector, types, fn ) {

		// ( namespace ) or ( selector, types [, fn] )
		return arguments.length === 1 ?
			this.off( selector, "**" ) :
			this.off( types, selector || "**", fn );
	},
	size: function() {
		return this.length;
	}
} );

jQuery.fn.andSelf = jQuery.fn.addBack;




// Register as a named AMD module, since jQuery can be concatenated with other
// files that may use define, but not via a proper concatenation script that
// understands anonymous AMD modules. A named AMD is safest and most robust
// way to register. Lowercase jquery is used because AMD module names are
// derived from file names, and jQuery is normally delivered in a lowercase
// file name. Do this after creating the global so that if an AMD module wants
// to call noConflict to hide this version of jQuery, it will work.

// Note that for maximum portability, libraries that are not jQuery should
// declare themselves as anonymous modules, and avoid setting a global if an
// AMD loader is present. jQuery is a special case. For more information, see
// https://github.com/jrburke/requirejs/wiki/Updating-existing-libraries#wiki-anon

if ( typeof define === "function" && define.amd ) {
	define( "jquery", [], function() {
		return jQuery;
	} );
}



var

	// Map over jQuery in case of overwrite
	_jQuery = window.jQuery,

	// Map over the $ in case of overwrite
	_$ = window.$;

jQuery.noConflict = function( deep ) {
	if ( window.$ === jQuery ) {
		window.$ = _$;
	}

	if ( deep && window.jQuery === jQuery ) {
		window.jQuery = _jQuery;
	}

	return jQuery;
};

// Expose jQuery and $ identifiers, even in AMD
// (#7102#comment:10, https://github.com/jquery/jquery/pull/557)
// and CommonJS for browser emulators (#13566)
if ( !noGlobal ) {
	window.jQuery = window.$ = jQuery;
}

return jQuery;
}));

},{}],"/Sites/kisk-mennekes-www-20151019-relaunch-frontend/node_modules/masonry-layout/masonry.js":[function(require,module,exports){
/*!
 * Masonry v4.2.2
 * Cascading grid layout library
 * https://masonry.desandro.com
 * MIT License
 * by David DeSandro
 */

( function( window, factory ) {
  // universal module definition
  /* jshint strict: false */ /*globals define, module, require */
  if ( typeof define == 'function' && define.amd ) {
    // AMD
    define( [
        'outlayer/outlayer',
        'get-size/get-size'
      ],
      factory );
  } else if ( typeof module == 'object' && module.exports ) {
    // CommonJS
    module.exports = factory(
      require('outlayer'),
      require('get-size')
    );
  } else {
    // browser global
    window.Masonry = factory(
      window.Outlayer,
      window.getSize
    );
  }

}( window, function factory( Outlayer, getSize ) {

'use strict';

// -------------------------- masonryDefinition -------------------------- //

  // create an Outlayer layout class
  var Masonry = Outlayer.create('masonry');
  // isFitWidth -> fitWidth
  Masonry.compatOptions.fitWidth = 'isFitWidth';

  var proto = Masonry.prototype;

  proto._resetLayout = function() {
    this.getSize();
    this._getMeasurement( 'columnWidth', 'outerWidth' );
    this._getMeasurement( 'gutter', 'outerWidth' );
    this.measureColumns();

    // reset column Y
    this.colYs = [];
    for ( var i=0; i < this.cols; i++ ) {
      this.colYs.push( 0 );
    }

    this.maxY = 0;
    this.horizontalColIndex = 0;
  };

  proto.measureColumns = function() {
    this.getContainerWidth();
    // if columnWidth is 0, default to outerWidth of first item
    if ( !this.columnWidth ) {
      var firstItem = this.items[0];
      var firstItemElem = firstItem && firstItem.element;
      // columnWidth fall back to item of first element
      this.columnWidth = firstItemElem && getSize( firstItemElem ).outerWidth ||
        // if first elem has no width, default to size of container
        this.containerWidth;
    }

    var columnWidth = this.columnWidth += this.gutter;

    // calculate columns
    var containerWidth = this.containerWidth + this.gutter;
    var cols = containerWidth / columnWidth;
    // fix rounding errors, typically with gutters
    var excess = columnWidth - containerWidth % columnWidth;
    // if overshoot is less than a pixel, round up, otherwise floor it
    var mathMethod = excess && excess < 1 ? 'round' : 'floor';
    cols = Math[ mathMethod ]( cols );
    this.cols = Math.max( cols, 1 );
  };

  proto.getContainerWidth = function() {
    // container is parent if fit width
    var isFitWidth = this._getOption('fitWidth');
    var container = isFitWidth ? this.element.parentNode : this.element;
    // check that this.size and size are there
    // IE8 triggers resize on body size change, so they might not be
    var size = getSize( container );
    this.containerWidth = size && size.innerWidth;
  };

  proto._getItemLayoutPosition = function( item ) {
    item.getSize();
    // how many columns does this brick span
    var remainder = item.size.outerWidth % this.columnWidth;
    var mathMethod = remainder && remainder < 1 ? 'round' : 'ceil';
    // round if off by 1 pixel, otherwise use ceil
    var colSpan = Math[ mathMethod ]( item.size.outerWidth / this.columnWidth );
    colSpan = Math.min( colSpan, this.cols );
    // use horizontal or top column position
    var colPosMethod = this.options.horizontalOrder ?
      '_getHorizontalColPosition' : '_getTopColPosition';
    var colPosition = this[ colPosMethod ]( colSpan, item );
    // position the brick
    var position = {
      x: this.columnWidth * colPosition.col,
      y: colPosition.y
    };
    // apply setHeight to necessary columns
    var setHeight = colPosition.y + item.size.outerHeight;
    var setMax = colSpan + colPosition.col;
    for ( var i = colPosition.col; i < setMax; i++ ) {
      this.colYs[i] = setHeight;
    }

    return position;
  };

  proto._getTopColPosition = function( colSpan ) {
    var colGroup = this._getTopColGroup( colSpan );
    // get the minimum Y value from the columns
    var minimumY = Math.min.apply( Math, colGroup );

    return {
      col: colGroup.indexOf( minimumY ),
      y: minimumY,
    };
  };

  /**
   * @param {Number} colSpan - number of columns the element spans
   * @returns {Array} colGroup
   */
  proto._getTopColGroup = function( colSpan ) {
    if ( colSpan < 2 ) {
      // if brick spans only one column, use all the column Ys
      return this.colYs;
    }

    var colGroup = [];
    // how many different places could this brick fit horizontally
    var groupCount = this.cols + 1 - colSpan;
    // for each group potential horizontal position
    for ( var i = 0; i < groupCount; i++ ) {
      colGroup[i] = this._getColGroupY( i, colSpan );
    }
    return colGroup;
  };

  proto._getColGroupY = function( col, colSpan ) {
    if ( colSpan < 2 ) {
      return this.colYs[ col ];
    }
    // make an array of colY values for that one group
    var groupColYs = this.colYs.slice( col, col + colSpan );
    // and get the max value of the array
    return Math.max.apply( Math, groupColYs );
  };

  // get column position based on horizontal index. #873
  proto._getHorizontalColPosition = function( colSpan, item ) {
    var col = this.horizontalColIndex % this.cols;
    var isOver = colSpan > 1 && col + colSpan > this.cols;
    // shift to next row if item can't fit on current row
    col = isOver ? 0 : col;
    // don't let zero-size items take up space
    var hasSize = item.size.outerWidth && item.size.outerHeight;
    this.horizontalColIndex = hasSize ? col + colSpan : this.horizontalColIndex;

    return {
      col: col,
      y: this._getColGroupY( col, colSpan ),
    };
  };

  proto._manageStamp = function( stamp ) {
    var stampSize = getSize( stamp );
    var offset = this._getElementOffset( stamp );
    // get the columns that this stamp affects
    var isOriginLeft = this._getOption('originLeft');
    var firstX = isOriginLeft ? offset.left : offset.right;
    var lastX = firstX + stampSize.outerWidth;
    var firstCol = Math.floor( firstX / this.columnWidth );
    firstCol = Math.max( 0, firstCol );
    var lastCol = Math.floor( lastX / this.columnWidth );
    // lastCol should not go over if multiple of columnWidth #425
    lastCol -= lastX % this.columnWidth ? 0 : 1;
    lastCol = Math.min( this.cols - 1, lastCol );
    // set colYs to bottom of the stamp

    var isOriginTop = this._getOption('originTop');
    var stampMaxY = ( isOriginTop ? offset.top : offset.bottom ) +
      stampSize.outerHeight;
    for ( var i = firstCol; i <= lastCol; i++ ) {
      this.colYs[i] = Math.max( stampMaxY, this.colYs[i] );
    }
  };

  proto._getContainerSize = function() {
    this.maxY = Math.max.apply( Math, this.colYs );
    var size = {
      height: this.maxY
    };

    if ( this._getOption('fitWidth') ) {
      size.width = this._getContainerFitWidth();
    }

    return size;
  };

  proto._getContainerFitWidth = function() {
    var unusedCols = 0;
    // count unused columns
    var i = this.cols;
    while ( --i ) {
      if ( this.colYs[i] !== 0 ) {
        break;
      }
      unusedCols++;
    }
    // fit container to columns that have been used
    return ( this.cols - unusedCols ) * this.columnWidth - this.gutter;
  };

  proto.needsResizeLayout = function() {
    var previousWidth = this.containerWidth;
    this.getContainerWidth();
    return previousWidth != this.containerWidth;
  };

  return Masonry;

}));

},{"get-size":"/Sites/kisk-mennekes-www-20151019-relaunch-frontend/node_modules/masonry-layout/node_modules/get-size/get-size.js","outlayer":"/Sites/kisk-mennekes-www-20151019-relaunch-frontend/node_modules/masonry-layout/node_modules/outlayer/outlayer.js"}],"/Sites/kisk-mennekes-www-20151019-relaunch-frontend/node_modules/masonry-layout/node_modules/get-size/get-size.js":[function(require,module,exports){
/*!
 * getSize v2.0.3
 * measure size of elements
 * MIT license
 */

/* jshint browser: true, strict: true, undef: true, unused: true */
/* globals console: false */

( function( window, factory ) {
  /* jshint strict: false */ /* globals define, module */
  if ( typeof define == 'function' && define.amd ) {
    // AMD
    define( factory );
  } else if ( typeof module == 'object' && module.exports ) {
    // CommonJS
    module.exports = factory();
  } else {
    // browser global
    window.getSize = factory();
  }

})( window, function factory() {
'use strict';

// -------------------------- helpers -------------------------- //

// get a number from a string, not a percentage
function getStyleSize( value ) {
  var num = parseFloat( value );
  // not a percent like '100%', and a number
  var isValid = value.indexOf('%') == -1 && !isNaN( num );
  return isValid && num;
}

function noop() {}

var logError = typeof console == 'undefined' ? noop :
  function( message ) {
    console.error( message );
  };

// -------------------------- measurements -------------------------- //

var measurements = [
  'paddingLeft',
  'paddingRight',
  'paddingTop',
  'paddingBottom',
  'marginLeft',
  'marginRight',
  'marginTop',
  'marginBottom',
  'borderLeftWidth',
  'borderRightWidth',
  'borderTopWidth',
  'borderBottomWidth'
];

var measurementsLength = measurements.length;

function getZeroSize() {
  var size = {
    width: 0,
    height: 0,
    innerWidth: 0,
    innerHeight: 0,
    outerWidth: 0,
    outerHeight: 0
  };
  for ( var i=0; i < measurementsLength; i++ ) {
    var measurement = measurements[i];
    size[ measurement ] = 0;
  }
  return size;
}

// -------------------------- getStyle -------------------------- //

/**
 * getStyle, get style of element, check for Firefox bug
 * https://bugzilla.mozilla.org/show_bug.cgi?id=548397
 */
function getStyle( elem ) {
  var style = getComputedStyle( elem );
  if ( !style ) {
    logError( 'Style returned ' + style +
      '. Are you running this code in a hidden iframe on Firefox? ' +
      'See https://bit.ly/getsizebug1' );
  }
  return style;
}

// -------------------------- setup -------------------------- //

var isSetup = false;

var isBoxSizeOuter;

/**
 * setup
 * check isBoxSizerOuter
 * do on first getSize() rather than on page load for Firefox bug
 */
function setup() {
  // setup once
  if ( isSetup ) {
    return;
  }
  isSetup = true;

  // -------------------------- box sizing -------------------------- //

  /**
   * Chrome & Safari measure the outer-width on style.width on border-box elems
   * IE11 & Firefox<29 measures the inner-width
   */
  var div = document.createElement('div');
  div.style.width = '200px';
  div.style.padding = '1px 2px 3px 4px';
  div.style.borderStyle = 'solid';
  div.style.borderWidth = '1px 2px 3px 4px';
  div.style.boxSizing = 'border-box';

  var body = document.body || document.documentElement;
  body.appendChild( div );
  var style = getStyle( div );
  // round value for browser zoom. desandro/masonry#928
  isBoxSizeOuter = Math.round( getStyleSize( style.width ) ) == 200;
  getSize.isBoxSizeOuter = isBoxSizeOuter;

  body.removeChild( div );
}

// -------------------------- getSize -------------------------- //

function getSize( elem ) {
  setup();

  // use querySeletor if elem is string
  if ( typeof elem == 'string' ) {
    elem = document.querySelector( elem );
  }

  // do not proceed on non-objects
  if ( !elem || typeof elem != 'object' || !elem.nodeType ) {
    return;
  }

  var style = getStyle( elem );

  // if hidden, everything is 0
  if ( style.display == 'none' ) {
    return getZeroSize();
  }

  var size = {};
  size.width = elem.offsetWidth;
  size.height = elem.offsetHeight;

  var isBorderBox = size.isBorderBox = style.boxSizing == 'border-box';

  // get all measurements
  for ( var i=0; i < measurementsLength; i++ ) {
    var measurement = measurements[i];
    var value = style[ measurement ];
    var num = parseFloat( value );
    // any 'auto', 'medium' value will be 0
    size[ measurement ] = !isNaN( num ) ? num : 0;
  }

  var paddingWidth = size.paddingLeft + size.paddingRight;
  var paddingHeight = size.paddingTop + size.paddingBottom;
  var marginWidth = size.marginLeft + size.marginRight;
  var marginHeight = size.marginTop + size.marginBottom;
  var borderWidth = size.borderLeftWidth + size.borderRightWidth;
  var borderHeight = size.borderTopWidth + size.borderBottomWidth;

  var isBorderBoxSizeOuter = isBorderBox && isBoxSizeOuter;

  // overwrite width and height if we can get it from style
  var styleWidth = getStyleSize( style.width );
  if ( styleWidth !== false ) {
    size.width = styleWidth +
      // add padding and border unless it's already including it
      ( isBorderBoxSizeOuter ? 0 : paddingWidth + borderWidth );
  }

  var styleHeight = getStyleSize( style.height );
  if ( styleHeight !== false ) {
    size.height = styleHeight +
      // add padding and border unless it's already including it
      ( isBorderBoxSizeOuter ? 0 : paddingHeight + borderHeight );
  }

  size.innerWidth = size.width - ( paddingWidth + borderWidth );
  size.innerHeight = size.height - ( paddingHeight + borderHeight );

  size.outerWidth = size.width + marginWidth;
  size.outerHeight = size.height + marginHeight;

  return size;
}

return getSize;

});

},{}],"/Sites/kisk-mennekes-www-20151019-relaunch-frontend/node_modules/masonry-layout/node_modules/outlayer/item.js":[function(require,module,exports){
/**
 * Outlayer Item
 */

( function( window, factory ) {
  // universal module definition
  /* jshint strict: false */ /* globals define, module, require */
  if ( typeof define == 'function' && define.amd ) {
    // AMD - RequireJS
    define( [
        'ev-emitter/ev-emitter',
        'get-size/get-size'
      ],
      factory
    );
  } else if ( typeof module == 'object' && module.exports ) {
    // CommonJS - Browserify, Webpack
    module.exports = factory(
      require('ev-emitter'),
      require('get-size')
    );
  } else {
    // browser global
    window.Outlayer = {};
    window.Outlayer.Item = factory(
      window.EvEmitter,
      window.getSize
    );
  }

}( window, function factory( EvEmitter, getSize ) {
'use strict';

// ----- helpers ----- //

function isEmptyObj( obj ) {
  for ( var prop in obj ) {
    return false;
  }
  prop = null;
  return true;
}

// -------------------------- CSS3 support -------------------------- //


var docElemStyle = document.documentElement.style;

var transitionProperty = typeof docElemStyle.transition == 'string' ?
  'transition' : 'WebkitTransition';
var transformProperty = typeof docElemStyle.transform == 'string' ?
  'transform' : 'WebkitTransform';

var transitionEndEvent = {
  WebkitTransition: 'webkitTransitionEnd',
  transition: 'transitionend'
}[ transitionProperty ];

// cache all vendor properties that could have vendor prefix
var vendorProperties = {
  transform: transformProperty,
  transition: transitionProperty,
  transitionDuration: transitionProperty + 'Duration',
  transitionProperty: transitionProperty + 'Property',
  transitionDelay: transitionProperty + 'Delay'
};

// -------------------------- Item -------------------------- //

function Item( element, layout ) {
  if ( !element ) {
    return;
  }

  this.element = element;
  // parent layout class, i.e. Masonry, Isotope, or Packery
  this.layout = layout;
  this.position = {
    x: 0,
    y: 0
  };

  this._create();
}

// inherit EvEmitter
var proto = Item.prototype = Object.create( EvEmitter.prototype );
proto.constructor = Item;

proto._create = function() {
  // transition objects
  this._transn = {
    ingProperties: {},
    clean: {},
    onEnd: {}
  };

  this.css({
    position: 'absolute'
  });
};

// trigger specified handler for event type
proto.handleEvent = function( event ) {
  var method = 'on' + event.type;
  if ( this[ method ] ) {
    this[ method ]( event );
  }
};

proto.getSize = function() {
  this.size = getSize( this.element );
};

/**
 * apply CSS styles to element
 * @param {Object} style
 */
proto.css = function( style ) {
  var elemStyle = this.element.style;

  for ( var prop in style ) {
    // use vendor property if available
    var supportedProp = vendorProperties[ prop ] || prop;
    elemStyle[ supportedProp ] = style[ prop ];
  }
};

 // measure position, and sets it
proto.getPosition = function() {
  var style = getComputedStyle( this.element );
  var isOriginLeft = this.layout._getOption('originLeft');
  var isOriginTop = this.layout._getOption('originTop');
  var xValue = style[ isOriginLeft ? 'left' : 'right' ];
  var yValue = style[ isOriginTop ? 'top' : 'bottom' ];
  var x = parseFloat( xValue );
  var y = parseFloat( yValue );
  // convert percent to pixels
  var layoutSize = this.layout.size;
  if ( xValue.indexOf('%') != -1 ) {
    x = ( x / 100 ) * layoutSize.width;
  }
  if ( yValue.indexOf('%') != -1 ) {
    y = ( y / 100 ) * layoutSize.height;
  }
  // clean up 'auto' or other non-integer values
  x = isNaN( x ) ? 0 : x;
  y = isNaN( y ) ? 0 : y;
  // remove padding from measurement
  x -= isOriginLeft ? layoutSize.paddingLeft : layoutSize.paddingRight;
  y -= isOriginTop ? layoutSize.paddingTop : layoutSize.paddingBottom;

  this.position.x = x;
  this.position.y = y;
};

// set settled position, apply padding
proto.layoutPosition = function() {
  var layoutSize = this.layout.size;
  var style = {};
  var isOriginLeft = this.layout._getOption('originLeft');
  var isOriginTop = this.layout._getOption('originTop');

  // x
  var xPadding = isOriginLeft ? 'paddingLeft' : 'paddingRight';
  var xProperty = isOriginLeft ? 'left' : 'right';
  var xResetProperty = isOriginLeft ? 'right' : 'left';

  var x = this.position.x + layoutSize[ xPadding ];
  // set in percentage or pixels
  style[ xProperty ] = this.getXValue( x );
  // reset other property
  style[ xResetProperty ] = '';

  // y
  var yPadding = isOriginTop ? 'paddingTop' : 'paddingBottom';
  var yProperty = isOriginTop ? 'top' : 'bottom';
  var yResetProperty = isOriginTop ? 'bottom' : 'top';

  var y = this.position.y + layoutSize[ yPadding ];
  // set in percentage or pixels
  style[ yProperty ] = this.getYValue( y );
  // reset other property
  style[ yResetProperty ] = '';

  this.css( style );
  this.emitEvent( 'layout', [ this ] );
};

proto.getXValue = function( x ) {
  var isHorizontal = this.layout._getOption('horizontal');
  return this.layout.options.percentPosition && !isHorizontal ?
    ( ( x / this.layout.size.width ) * 100 ) + '%' : x + 'px';
};

proto.getYValue = function( y ) {
  var isHorizontal = this.layout._getOption('horizontal');
  return this.layout.options.percentPosition && isHorizontal ?
    ( ( y / this.layout.size.height ) * 100 ) + '%' : y + 'px';
};

proto._transitionTo = function( x, y ) {
  this.getPosition();
  // get current x & y from top/left
  var curX = this.position.x;
  var curY = this.position.y;

  var didNotMove = x == this.position.x && y == this.position.y;

  // save end position
  this.setPosition( x, y );

  // if did not move and not transitioning, just go to layout
  if ( didNotMove && !this.isTransitioning ) {
    this.layoutPosition();
    return;
  }

  var transX = x - curX;
  var transY = y - curY;
  var transitionStyle = {};
  transitionStyle.transform = this.getTranslate( transX, transY );

  this.transition({
    to: transitionStyle,
    onTransitionEnd: {
      transform: this.layoutPosition
    },
    isCleaning: true
  });
};

proto.getTranslate = function( x, y ) {
  // flip cooridinates if origin on right or bottom
  var isOriginLeft = this.layout._getOption('originLeft');
  var isOriginTop = this.layout._getOption('originTop');
  x = isOriginLeft ? x : -x;
  y = isOriginTop ? y : -y;
  return 'translate3d(' + x + 'px, ' + y + 'px, 0)';
};

// non transition + transform support
proto.goTo = function( x, y ) {
  this.setPosition( x, y );
  this.layoutPosition();
};

proto.moveTo = proto._transitionTo;

proto.setPosition = function( x, y ) {
  this.position.x = parseFloat( x );
  this.position.y = parseFloat( y );
};

// ----- transition ----- //

/**
 * @param {Object} style - CSS
 * @param {Function} onTransitionEnd
 */

// non transition, just trigger callback
proto._nonTransition = function( args ) {
  this.css( args.to );
  if ( args.isCleaning ) {
    this._removeStyles( args.to );
  }
  for ( var prop in args.onTransitionEnd ) {
    args.onTransitionEnd[ prop ].call( this );
  }
};

/**
 * proper transition
 * @param {Object} args - arguments
 *   @param {Object} to - style to transition to
 *   @param {Object} from - style to start transition from
 *   @param {Boolean} isCleaning - removes transition styles after transition
 *   @param {Function} onTransitionEnd - callback
 */
proto.transition = function( args ) {
  // redirect to nonTransition if no transition duration
  if ( !parseFloat( this.layout.options.transitionDuration ) ) {
    this._nonTransition( args );
    return;
  }

  var _transition = this._transn;
  // keep track of onTransitionEnd callback by css property
  for ( var prop in args.onTransitionEnd ) {
    _transition.onEnd[ prop ] = args.onTransitionEnd[ prop ];
  }
  // keep track of properties that are transitioning
  for ( prop in args.to ) {
    _transition.ingProperties[ prop ] = true;
    // keep track of properties to clean up when transition is done
    if ( args.isCleaning ) {
      _transition.clean[ prop ] = true;
    }
  }

  // set from styles
  if ( args.from ) {
    this.css( args.from );
    // force redraw. http://blog.alexmaccaw.com/css-transitions
    var h = this.element.offsetHeight;
    // hack for JSHint to hush about unused var
    h = null;
  }
  // enable transition
  this.enableTransition( args.to );
  // set styles that are transitioning
  this.css( args.to );

  this.isTransitioning = true;

};

// dash before all cap letters, including first for
// WebkitTransform => -webkit-transform
function toDashedAll( str ) {
  return str.replace( /([A-Z])/g, function( $1 ) {
    return '-' + $1.toLowerCase();
  });
}

var transitionProps = 'opacity,' + toDashedAll( transformProperty );

proto.enableTransition = function(/* style */) {
  // HACK changing transitionProperty during a transition
  // will cause transition to jump
  if ( this.isTransitioning ) {
    return;
  }

  // make `transition: foo, bar, baz` from style object
  // HACK un-comment this when enableTransition can work
  // while a transition is happening
  // var transitionValues = [];
  // for ( var prop in style ) {
  //   // dash-ify camelCased properties like WebkitTransition
  //   prop = vendorProperties[ prop ] || prop;
  //   transitionValues.push( toDashedAll( prop ) );
  // }
  // munge number to millisecond, to match stagger
  var duration = this.layout.options.transitionDuration;
  duration = typeof duration == 'number' ? duration + 'ms' : duration;
  // enable transition styles
  this.css({
    transitionProperty: transitionProps,
    transitionDuration: duration,
    transitionDelay: this.staggerDelay || 0
  });
  // listen for transition end event
  this.element.addEventListener( transitionEndEvent, this, false );
};

// ----- events ----- //

proto.onwebkitTransitionEnd = function( event ) {
  this.ontransitionend( event );
};

proto.onotransitionend = function( event ) {
  this.ontransitionend( event );
};

// properties that I munge to make my life easier
var dashedVendorProperties = {
  '-webkit-transform': 'transform'
};

proto.ontransitionend = function( event ) {
  // disregard bubbled events from children
  if ( event.target !== this.element ) {
    return;
  }
  var _transition = this._transn;
  // get property name of transitioned property, convert to prefix-free
  var propertyName = dashedVendorProperties[ event.propertyName ] || event.propertyName;

  // remove property that has completed transitioning
  delete _transition.ingProperties[ propertyName ];
  // check if any properties are still transitioning
  if ( isEmptyObj( _transition.ingProperties ) ) {
    // all properties have completed transitioning
    this.disableTransition();
  }
  // clean style
  if ( propertyName in _transition.clean ) {
    // clean up style
    this.element.style[ event.propertyName ] = '';
    delete _transition.clean[ propertyName ];
  }
  // trigger onTransitionEnd callback
  if ( propertyName in _transition.onEnd ) {
    var onTransitionEnd = _transition.onEnd[ propertyName ];
    onTransitionEnd.call( this );
    delete _transition.onEnd[ propertyName ];
  }

  this.emitEvent( 'transitionEnd', [ this ] );
};

proto.disableTransition = function() {
  this.removeTransitionStyles();
  this.element.removeEventListener( transitionEndEvent, this, false );
  this.isTransitioning = false;
};

/**
 * removes style property from element
 * @param {Object} style
**/
proto._removeStyles = function( style ) {
  // clean up transition styles
  var cleanStyle = {};
  for ( var prop in style ) {
    cleanStyle[ prop ] = '';
  }
  this.css( cleanStyle );
};

var cleanTransitionStyle = {
  transitionProperty: '',
  transitionDuration: '',
  transitionDelay: ''
};

proto.removeTransitionStyles = function() {
  // remove transition
  this.css( cleanTransitionStyle );
};

// ----- stagger ----- //

proto.stagger = function( delay ) {
  delay = isNaN( delay ) ? 0 : delay;
  this.staggerDelay = delay + 'ms';
};

// ----- show/hide/remove ----- //

// remove element from DOM
proto.removeElem = function() {
  this.element.parentNode.removeChild( this.element );
  // remove display: none
  this.css({ display: '' });
  this.emitEvent( 'remove', [ this ] );
};

proto.remove = function() {
  // just remove element if no transition support or no transition
  if ( !transitionProperty || !parseFloat( this.layout.options.transitionDuration ) ) {
    this.removeElem();
    return;
  }

  // start transition
  this.once( 'transitionEnd', function() {
    this.removeElem();
  });
  this.hide();
};

proto.reveal = function() {
  delete this.isHidden;
  // remove display: none
  this.css({ display: '' });

  var options = this.layout.options;

  var onTransitionEnd = {};
  var transitionEndProperty = this.getHideRevealTransitionEndProperty('visibleStyle');
  onTransitionEnd[ transitionEndProperty ] = this.onRevealTransitionEnd;

  this.transition({
    from: options.hiddenStyle,
    to: options.visibleStyle,
    isCleaning: true,
    onTransitionEnd: onTransitionEnd
  });
};

proto.onRevealTransitionEnd = function() {
  // check if still visible
  // during transition, item may have been hidden
  if ( !this.isHidden ) {
    this.emitEvent('reveal');
  }
};

/**
 * get style property use for hide/reveal transition end
 * @param {String} styleProperty - hiddenStyle/visibleStyle
 * @returns {String}
 */
proto.getHideRevealTransitionEndProperty = function( styleProperty ) {
  var optionStyle = this.layout.options[ styleProperty ];
  // use opacity
  if ( optionStyle.opacity ) {
    return 'opacity';
  }
  // get first property
  for ( var prop in optionStyle ) {
    return prop;
  }
};

proto.hide = function() {
  // set flag
  this.isHidden = true;
  // remove display: none
  this.css({ display: '' });

  var options = this.layout.options;

  var onTransitionEnd = {};
  var transitionEndProperty = this.getHideRevealTransitionEndProperty('hiddenStyle');
  onTransitionEnd[ transitionEndProperty ] = this.onHideTransitionEnd;

  this.transition({
    from: options.visibleStyle,
    to: options.hiddenStyle,
    // keep hidden stuff hidden
    isCleaning: true,
    onTransitionEnd: onTransitionEnd
  });
};

proto.onHideTransitionEnd = function() {
  // check if still hidden
  // during transition, item may have been un-hidden
  if ( this.isHidden ) {
    this.css({ display: 'none' });
    this.emitEvent('hide');
  }
};

proto.destroy = function() {
  this.css({
    position: '',
    left: '',
    right: '',
    top: '',
    bottom: '',
    transition: '',
    transform: ''
  });
};

return Item;

}));

},{"ev-emitter":"/Sites/kisk-mennekes-www-20151019-relaunch-frontend/node_modules/masonry-layout/node_modules/outlayer/node_modules/ev-emitter/ev-emitter.js","get-size":"/Sites/kisk-mennekes-www-20151019-relaunch-frontend/node_modules/masonry-layout/node_modules/get-size/get-size.js"}],"/Sites/kisk-mennekes-www-20151019-relaunch-frontend/node_modules/masonry-layout/node_modules/outlayer/node_modules/ev-emitter/ev-emitter.js":[function(require,module,exports){
arguments[4]["/Sites/kisk-mennekes-www-20151019-relaunch-frontend/node_modules/imagesloaded/node_modules/ev-emitter/ev-emitter.js"][0].apply(exports,arguments)
},{}],"/Sites/kisk-mennekes-www-20151019-relaunch-frontend/node_modules/masonry-layout/node_modules/outlayer/node_modules/fizzy-ui-utils/node_modules/desandro-matches-selector/matches-selector.js":[function(require,module,exports){
/**
 * matchesSelector v2.0.2
 * matchesSelector( element, '.selector' )
 * MIT license
 */

/*jshint browser: true, strict: true, undef: true, unused: true */

( function( window, factory ) {
  /*global define: false, module: false */
  'use strict';
  // universal module definition
  if ( typeof define == 'function' && define.amd ) {
    // AMD
    define( factory );
  } else if ( typeof module == 'object' && module.exports ) {
    // CommonJS
    module.exports = factory();
  } else {
    // browser global
    window.matchesSelector = factory();
  }

}( window, function factory() {
  'use strict';

  var matchesMethod = ( function() {
    var ElemProto = window.Element.prototype;
    // check for the standard method name first
    if ( ElemProto.matches ) {
      return 'matches';
    }
    // check un-prefixed
    if ( ElemProto.matchesSelector ) {
      return 'matchesSelector';
    }
    // check vendor prefixes
    var prefixes = [ 'webkit', 'moz', 'ms', 'o' ];

    for ( var i=0; i < prefixes.length; i++ ) {
      var prefix = prefixes[i];
      var method = prefix + 'MatchesSelector';
      if ( ElemProto[ method ] ) {
        return method;
      }
    }
  })();

  return function matchesSelector( elem, selector ) {
    return elem[ matchesMethod ]( selector );
  };

}));

},{}],"/Sites/kisk-mennekes-www-20151019-relaunch-frontend/node_modules/masonry-layout/node_modules/outlayer/node_modules/fizzy-ui-utils/utils.js":[function(require,module,exports){
/**
 * Fizzy UI utils v2.0.7
 * MIT license
 */

/*jshint browser: true, undef: true, unused: true, strict: true */

( function( window, factory ) {
  // universal module definition
  /*jshint strict: false */ /*globals define, module, require */

  if ( typeof define == 'function' && define.amd ) {
    // AMD
    define( [
      'desandro-matches-selector/matches-selector'
    ], function( matchesSelector ) {
      return factory( window, matchesSelector );
    });
  } else if ( typeof module == 'object' && module.exports ) {
    // CommonJS
    module.exports = factory(
      window,
      require('desandro-matches-selector')
    );
  } else {
    // browser global
    window.fizzyUIUtils = factory(
      window,
      window.matchesSelector
    );
  }

}( window, function factory( window, matchesSelector ) {

'use strict';

var utils = {};

// ----- extend ----- //

// extends objects
utils.extend = function( a, b ) {
  for ( var prop in b ) {
    a[ prop ] = b[ prop ];
  }
  return a;
};

// ----- modulo ----- //

utils.modulo = function( num, div ) {
  return ( ( num % div ) + div ) % div;
};

// ----- makeArray ----- //

var arraySlice = Array.prototype.slice;

// turn element or nodeList into an array
utils.makeArray = function( obj ) {
  if ( Array.isArray( obj ) ) {
    // use object if already an array
    return obj;
  }
  // return empty array if undefined or null. #6
  if ( obj === null || obj === undefined ) {
    return [];
  }

  var isArrayLike = typeof obj == 'object' && typeof obj.length == 'number';
  if ( isArrayLike ) {
    // convert nodeList to array
    return arraySlice.call( obj );
  }

  // array of single index
  return [ obj ];
};

// ----- removeFrom ----- //

utils.removeFrom = function( ary, obj ) {
  var index = ary.indexOf( obj );
  if ( index != -1 ) {
    ary.splice( index, 1 );
  }
};

// ----- getParent ----- //

utils.getParent = function( elem, selector ) {
  while ( elem.parentNode && elem != document.body ) {
    elem = elem.parentNode;
    if ( matchesSelector( elem, selector ) ) {
      return elem;
    }
  }
};

// ----- getQueryElement ----- //

// use element as selector string
utils.getQueryElement = function( elem ) {
  if ( typeof elem == 'string' ) {
    return document.querySelector( elem );
  }
  return elem;
};

// ----- handleEvent ----- //

// enable .ontype to trigger from .addEventListener( elem, 'type' )
utils.handleEvent = function( event ) {
  var method = 'on' + event.type;
  if ( this[ method ] ) {
    this[ method ]( event );
  }
};

// ----- filterFindElements ----- //

utils.filterFindElements = function( elems, selector ) {
  // make array of elems
  elems = utils.makeArray( elems );
  var ffElems = [];

  elems.forEach( function( elem ) {
    // check that elem is an actual element
    if ( !( elem instanceof HTMLElement ) ) {
      return;
    }
    // add elem if no selector
    if ( !selector ) {
      ffElems.push( elem );
      return;
    }
    // filter & find items if we have a selector
    // filter
    if ( matchesSelector( elem, selector ) ) {
      ffElems.push( elem );
    }
    // find children
    var childElems = elem.querySelectorAll( selector );
    // concat childElems to filterFound array
    for ( var i=0; i < childElems.length; i++ ) {
      ffElems.push( childElems[i] );
    }
  });

  return ffElems;
};

// ----- debounceMethod ----- //

utils.debounceMethod = function( _class, methodName, threshold ) {
  threshold = threshold || 100;
  // original method
  var method = _class.prototype[ methodName ];
  var timeoutName = methodName + 'Timeout';

  _class.prototype[ methodName ] = function() {
    var timeout = this[ timeoutName ];
    clearTimeout( timeout );

    var args = arguments;
    var _this = this;
    this[ timeoutName ] = setTimeout( function() {
      method.apply( _this, args );
      delete _this[ timeoutName ];
    }, threshold );
  };
};

// ----- docReady ----- //

utils.docReady = function( callback ) {
  var readyState = document.readyState;
  if ( readyState == 'complete' || readyState == 'interactive' ) {
    // do async to allow for other scripts to run. metafizzy/flickity#441
    setTimeout( callback );
  } else {
    document.addEventListener( 'DOMContentLoaded', callback );
  }
};

// ----- htmlInit ----- //

// http://jamesroberts.name/blog/2010/02/22/string-functions-for-javascript-trim-to-camel-case-to-dashed-and-to-underscore/
utils.toDashed = function( str ) {
  return str.replace( /(.)([A-Z])/g, function( match, $1, $2 ) {
    return $1 + '-' + $2;
  }).toLowerCase();
};

var console = window.console;
/**
 * allow user to initialize classes via [data-namespace] or .js-namespace class
 * htmlInit( Widget, 'widgetName' )
 * options are parsed from data-namespace-options
 */
utils.htmlInit = function( WidgetClass, namespace ) {
  utils.docReady( function() {
    var dashedNamespace = utils.toDashed( namespace );
    var dataAttr = 'data-' + dashedNamespace;
    var dataAttrElems = document.querySelectorAll( '[' + dataAttr + ']' );
    var jsDashElems = document.querySelectorAll( '.js-' + dashedNamespace );
    var elems = utils.makeArray( dataAttrElems )
      .concat( utils.makeArray( jsDashElems ) );
    var dataOptionsAttr = dataAttr + '-options';
    var jQuery = window.jQuery;

    elems.forEach( function( elem ) {
      var attr = elem.getAttribute( dataAttr ) ||
        elem.getAttribute( dataOptionsAttr );
      var options;
      try {
        options = attr && JSON.parse( attr );
      } catch ( error ) {
        // log error, do not initialize
        if ( console ) {
          console.error( 'Error parsing ' + dataAttr + ' on ' + elem.className +
          ': ' + error );
        }
        return;
      }
      // initialize
      var instance = new WidgetClass( elem, options );
      // make available via $().data('namespace')
      if ( jQuery ) {
        jQuery.data( elem, namespace, instance );
      }
    });

  });
};

// -----  ----- //

return utils;

}));

},{"desandro-matches-selector":"/Sites/kisk-mennekes-www-20151019-relaunch-frontend/node_modules/masonry-layout/node_modules/outlayer/node_modules/fizzy-ui-utils/node_modules/desandro-matches-selector/matches-selector.js"}],"/Sites/kisk-mennekes-www-20151019-relaunch-frontend/node_modules/masonry-layout/node_modules/outlayer/outlayer.js":[function(require,module,exports){
/*!
 * Outlayer v2.1.1
 * the brains and guts of a layout library
 * MIT license
 */

( function( window, factory ) {
  'use strict';
  // universal module definition
  /* jshint strict: false */ /* globals define, module, require */
  if ( typeof define == 'function' && define.amd ) {
    // AMD - RequireJS
    define( [
        'ev-emitter/ev-emitter',
        'get-size/get-size',
        'fizzy-ui-utils/utils',
        './item'
      ],
      function( EvEmitter, getSize, utils, Item ) {
        return factory( window, EvEmitter, getSize, utils, Item);
      }
    );
  } else if ( typeof module == 'object' && module.exports ) {
    // CommonJS - Browserify, Webpack
    module.exports = factory(
      window,
      require('ev-emitter'),
      require('get-size'),
      require('fizzy-ui-utils'),
      require('./item')
    );
  } else {
    // browser global
    window.Outlayer = factory(
      window,
      window.EvEmitter,
      window.getSize,
      window.fizzyUIUtils,
      window.Outlayer.Item
    );
  }

}( window, function factory( window, EvEmitter, getSize, utils, Item ) {
'use strict';

// ----- vars ----- //

var console = window.console;
var jQuery = window.jQuery;
var noop = function() {};

// -------------------------- Outlayer -------------------------- //

// globally unique identifiers
var GUID = 0;
// internal store of all Outlayer intances
var instances = {};


/**
 * @param {Element, String} element
 * @param {Object} options
 * @constructor
 */
function Outlayer( element, options ) {
  var queryElement = utils.getQueryElement( element );
  if ( !queryElement ) {
    if ( console ) {
      console.error( 'Bad element for ' + this.constructor.namespace +
        ': ' + ( queryElement || element ) );
    }
    return;
  }
  this.element = queryElement;
  // add jQuery
  if ( jQuery ) {
    this.$element = jQuery( this.element );
  }

  // options
  this.options = utils.extend( {}, this.constructor.defaults );
  this.option( options );

  // add id for Outlayer.getFromElement
  var id = ++GUID;
  this.element.outlayerGUID = id; // expando
  instances[ id ] = this; // associate via id

  // kick it off
  this._create();

  var isInitLayout = this._getOption('initLayout');
  if ( isInitLayout ) {
    this.layout();
  }
}

// settings are for internal use only
Outlayer.namespace = 'outlayer';
Outlayer.Item = Item;

// default options
Outlayer.defaults = {
  containerStyle: {
    position: 'relative'
  },
  initLayout: true,
  originLeft: true,
  originTop: true,
  resize: true,
  resizeContainer: true,
  // item options
  transitionDuration: '0.4s',
  hiddenStyle: {
    opacity: 0,
    transform: 'scale(0.001)'
  },
  visibleStyle: {
    opacity: 1,
    transform: 'scale(1)'
  }
};

var proto = Outlayer.prototype;
// inherit EvEmitter
utils.extend( proto, EvEmitter.prototype );

/**
 * set options
 * @param {Object} opts
 */
proto.option = function( opts ) {
  utils.extend( this.options, opts );
};

/**
 * get backwards compatible option value, check old name
 */
proto._getOption = function( option ) {
  var oldOption = this.constructor.compatOptions[ option ];
  return oldOption && this.options[ oldOption ] !== undefined ?
    this.options[ oldOption ] : this.options[ option ];
};

Outlayer.compatOptions = {
  // currentName: oldName
  initLayout: 'isInitLayout',
  horizontal: 'isHorizontal',
  layoutInstant: 'isLayoutInstant',
  originLeft: 'isOriginLeft',
  originTop: 'isOriginTop',
  resize: 'isResizeBound',
  resizeContainer: 'isResizingContainer'
};

proto._create = function() {
  // get items from children
  this.reloadItems();
  // elements that affect layout, but are not laid out
  this.stamps = [];
  this.stamp( this.options.stamp );
  // set container style
  utils.extend( this.element.style, this.options.containerStyle );

  // bind resize method
  var canBindResize = this._getOption('resize');
  if ( canBindResize ) {
    this.bindResize();
  }
};

// goes through all children again and gets bricks in proper order
proto.reloadItems = function() {
  // collection of item elements
  this.items = this._itemize( this.element.children );
};


/**
 * turn elements into Outlayer.Items to be used in layout
 * @param {Array or NodeList or HTMLElement} elems
 * @returns {Array} items - collection of new Outlayer Items
 */
proto._itemize = function( elems ) {

  var itemElems = this._filterFindItemElements( elems );
  var Item = this.constructor.Item;

  // create new Outlayer Items for collection
  var items = [];
  for ( var i=0; i < itemElems.length; i++ ) {
    var elem = itemElems[i];
    var item = new Item( elem, this );
    items.push( item );
  }

  return items;
};

/**
 * get item elements to be used in layout
 * @param {Array or NodeList or HTMLElement} elems
 * @returns {Array} items - item elements
 */
proto._filterFindItemElements = function( elems ) {
  return utils.filterFindElements( elems, this.options.itemSelector );
};

/**
 * getter method for getting item elements
 * @returns {Array} elems - collection of item elements
 */
proto.getItemElements = function() {
  return this.items.map( function( item ) {
    return item.element;
  });
};

// ----- init & layout ----- //

/**
 * lays out all items
 */
proto.layout = function() {
  this._resetLayout();
  this._manageStamps();

  // don't animate first layout
  var layoutInstant = this._getOption('layoutInstant');
  var isInstant = layoutInstant !== undefined ?
    layoutInstant : !this._isLayoutInited;
  this.layoutItems( this.items, isInstant );

  // flag for initalized
  this._isLayoutInited = true;
};

// _init is alias for layout
proto._init = proto.layout;

/**
 * logic before any new layout
 */
proto._resetLayout = function() {
  this.getSize();
};


proto.getSize = function() {
  this.size = getSize( this.element );
};

/**
 * get measurement from option, for columnWidth, rowHeight, gutter
 * if option is String -> get element from selector string, & get size of element
 * if option is Element -> get size of element
 * else use option as a number
 *
 * @param {String} measurement
 * @param {String} size - width or height
 * @private
 */
proto._getMeasurement = function( measurement, size ) {
  var option = this.options[ measurement ];
  var elem;
  if ( !option ) {
    // default to 0
    this[ measurement ] = 0;
  } else {
    // use option as an element
    if ( typeof option == 'string' ) {
      elem = this.element.querySelector( option );
    } else if ( option instanceof HTMLElement ) {
      elem = option;
    }
    // use size of element, if element
    this[ measurement ] = elem ? getSize( elem )[ size ] : option;
  }
};

/**
 * layout a collection of item elements
 * @api public
 */
proto.layoutItems = function( items, isInstant ) {
  items = this._getItemsForLayout( items );

  this._layoutItems( items, isInstant );

  this._postLayout();
};

/**
 * get the items to be laid out
 * you may want to skip over some items
 * @param {Array} items
 * @returns {Array} items
 */
proto._getItemsForLayout = function( items ) {
  return items.filter( function( item ) {
    return !item.isIgnored;
  });
};

/**
 * layout items
 * @param {Array} items
 * @param {Boolean} isInstant
 */
proto._layoutItems = function( items, isInstant ) {
  this._emitCompleteOnItems( 'layout', items );

  if ( !items || !items.length ) {
    // no items, emit event with empty array
    return;
  }

  var queue = [];

  items.forEach( function( item ) {
    // get x/y object from method
    var position = this._getItemLayoutPosition( item );
    // enqueue
    position.item = item;
    position.isInstant = isInstant || item.isLayoutInstant;
    queue.push( position );
  }, this );

  this._processLayoutQueue( queue );
};

/**
 * get item layout position
 * @param {Outlayer.Item} item
 * @returns {Object} x and y position
 */
proto._getItemLayoutPosition = function( /* item */ ) {
  return {
    x: 0,
    y: 0
  };
};

/**
 * iterate over array and position each item
 * Reason being - separating this logic prevents 'layout invalidation'
 * thx @paul_irish
 * @param {Array} queue
 */
proto._processLayoutQueue = function( queue ) {
  this.updateStagger();
  queue.forEach( function( obj, i ) {
    this._positionItem( obj.item, obj.x, obj.y, obj.isInstant, i );
  }, this );
};

// set stagger from option in milliseconds number
proto.updateStagger = function() {
  var stagger = this.options.stagger;
  if ( stagger === null || stagger === undefined ) {
    this.stagger = 0;
    return;
  }
  this.stagger = getMilliseconds( stagger );
  return this.stagger;
};

/**
 * Sets position of item in DOM
 * @param {Outlayer.Item} item
 * @param {Number} x - horizontal position
 * @param {Number} y - vertical position
 * @param {Boolean} isInstant - disables transitions
 */
proto._positionItem = function( item, x, y, isInstant, i ) {
  if ( isInstant ) {
    // if not transition, just set CSS
    item.goTo( x, y );
  } else {
    item.stagger( i * this.stagger );
    item.moveTo( x, y );
  }
};

/**
 * Any logic you want to do after each layout,
 * i.e. size the container
 */
proto._postLayout = function() {
  this.resizeContainer();
};

proto.resizeContainer = function() {
  var isResizingContainer = this._getOption('resizeContainer');
  if ( !isResizingContainer ) {
    return;
  }
  var size = this._getContainerSize();
  if ( size ) {
    this._setContainerMeasure( size.width, true );
    this._setContainerMeasure( size.height, false );
  }
};

/**
 * Sets width or height of container if returned
 * @returns {Object} size
 *   @param {Number} width
 *   @param {Number} height
 */
proto._getContainerSize = noop;

/**
 * @param {Number} measure - size of width or height
 * @param {Boolean} isWidth
 */
proto._setContainerMeasure = function( measure, isWidth ) {
  if ( measure === undefined ) {
    return;
  }

  var elemSize = this.size;
  // add padding and border width if border box
  if ( elemSize.isBorderBox ) {
    measure += isWidth ? elemSize.paddingLeft + elemSize.paddingRight +
      elemSize.borderLeftWidth + elemSize.borderRightWidth :
      elemSize.paddingBottom + elemSize.paddingTop +
      elemSize.borderTopWidth + elemSize.borderBottomWidth;
  }

  measure = Math.max( measure, 0 );
  this.element.style[ isWidth ? 'width' : 'height' ] = measure + 'px';
};

/**
 * emit eventComplete on a collection of items events
 * @param {String} eventName
 * @param {Array} items - Outlayer.Items
 */
proto._emitCompleteOnItems = function( eventName, items ) {
  var _this = this;
  function onComplete() {
    _this.dispatchEvent( eventName + 'Complete', null, [ items ] );
  }

  var count = items.length;
  if ( !items || !count ) {
    onComplete();
    return;
  }

  var doneCount = 0;
  function tick() {
    doneCount++;
    if ( doneCount == count ) {
      onComplete();
    }
  }

  // bind callback
  items.forEach( function( item ) {
    item.once( eventName, tick );
  });
};

/**
 * emits events via EvEmitter and jQuery events
 * @param {String} type - name of event
 * @param {Event} event - original event
 * @param {Array} args - extra arguments
 */
proto.dispatchEvent = function( type, event, args ) {
  // add original event to arguments
  var emitArgs = event ? [ event ].concat( args ) : args;
  this.emitEvent( type, emitArgs );

  if ( jQuery ) {
    // set this.$element
    this.$element = this.$element || jQuery( this.element );
    if ( event ) {
      // create jQuery event
      var $event = jQuery.Event( event );
      $event.type = type;
      this.$element.trigger( $event, args );
    } else {
      // just trigger with type if no event available
      this.$element.trigger( type, args );
    }
  }
};

// -------------------------- ignore & stamps -------------------------- //


/**
 * keep item in collection, but do not lay it out
 * ignored items do not get skipped in layout
 * @param {Element} elem
 */
proto.ignore = function( elem ) {
  var item = this.getItem( elem );
  if ( item ) {
    item.isIgnored = true;
  }
};

/**
 * return item to layout collection
 * @param {Element} elem
 */
proto.unignore = function( elem ) {
  var item = this.getItem( elem );
  if ( item ) {
    delete item.isIgnored;
  }
};

/**
 * adds elements to stamps
 * @param {NodeList, Array, Element, or String} elems
 */
proto.stamp = function( elems ) {
  elems = this._find( elems );
  if ( !elems ) {
    return;
  }

  this.stamps = this.stamps.concat( elems );
  // ignore
  elems.forEach( this.ignore, this );
};

/**
 * removes elements to stamps
 * @param {NodeList, Array, or Element} elems
 */
proto.unstamp = function( elems ) {
  elems = this._find( elems );
  if ( !elems ){
    return;
  }

  elems.forEach( function( elem ) {
    // filter out removed stamp elements
    utils.removeFrom( this.stamps, elem );
    this.unignore( elem );
  }, this );
};

/**
 * finds child elements
 * @param {NodeList, Array, Element, or String} elems
 * @returns {Array} elems
 */
proto._find = function( elems ) {
  if ( !elems ) {
    return;
  }
  // if string, use argument as selector string
  if ( typeof elems == 'string' ) {
    elems = this.element.querySelectorAll( elems );
  }
  elems = utils.makeArray( elems );
  return elems;
};

proto._manageStamps = function() {
  if ( !this.stamps || !this.stamps.length ) {
    return;
  }

  this._getBoundingRect();

  this.stamps.forEach( this._manageStamp, this );
};

// update boundingLeft / Top
proto._getBoundingRect = function() {
  // get bounding rect for container element
  var boundingRect = this.element.getBoundingClientRect();
  var size = this.size;
  this._boundingRect = {
    left: boundingRect.left + size.paddingLeft + size.borderLeftWidth,
    top: boundingRect.top + size.paddingTop + size.borderTopWidth,
    right: boundingRect.right - ( size.paddingRight + size.borderRightWidth ),
    bottom: boundingRect.bottom - ( size.paddingBottom + size.borderBottomWidth )
  };
};

/**
 * @param {Element} stamp
**/
proto._manageStamp = noop;

/**
 * get x/y position of element relative to container element
 * @param {Element} elem
 * @returns {Object} offset - has left, top, right, bottom
 */
proto._getElementOffset = function( elem ) {
  var boundingRect = elem.getBoundingClientRect();
  var thisRect = this._boundingRect;
  var size = getSize( elem );
  var offset = {
    left: boundingRect.left - thisRect.left - size.marginLeft,
    top: boundingRect.top - thisRect.top - size.marginTop,
    right: thisRect.right - boundingRect.right - size.marginRight,
    bottom: thisRect.bottom - boundingRect.bottom - size.marginBottom
  };
  return offset;
};

// -------------------------- resize -------------------------- //

// enable event handlers for listeners
// i.e. resize -> onresize
proto.handleEvent = utils.handleEvent;

/**
 * Bind layout to window resizing
 */
proto.bindResize = function() {
  window.addEventListener( 'resize', this );
  this.isResizeBound = true;
};

/**
 * Unbind layout to window resizing
 */
proto.unbindResize = function() {
  window.removeEventListener( 'resize', this );
  this.isResizeBound = false;
};

proto.onresize = function() {
  this.resize();
};

utils.debounceMethod( Outlayer, 'onresize', 100 );

proto.resize = function() {
  // don't trigger if size did not change
  // or if resize was unbound. See #9
  if ( !this.isResizeBound || !this.needsResizeLayout() ) {
    return;
  }

  this.layout();
};

/**
 * check if layout is needed post layout
 * @returns Boolean
 */
proto.needsResizeLayout = function() {
  var size = getSize( this.element );
  // check that this.size and size are there
  // IE8 triggers resize on body size change, so they might not be
  var hasSizes = this.size && size;
  return hasSizes && size.innerWidth !== this.size.innerWidth;
};

// -------------------------- methods -------------------------- //

/**
 * add items to Outlayer instance
 * @param {Array or NodeList or Element} elems
 * @returns {Array} items - Outlayer.Items
**/
proto.addItems = function( elems ) {
  var items = this._itemize( elems );
  // add items to collection
  if ( items.length ) {
    this.items = this.items.concat( items );
  }
  return items;
};

/**
 * Layout newly-appended item elements
 * @param {Array or NodeList or Element} elems
 */
proto.appended = function( elems ) {
  var items = this.addItems( elems );
  if ( !items.length ) {
    return;
  }
  // layout and reveal just the new items
  this.layoutItems( items, true );
  this.reveal( items );
};

/**
 * Layout prepended elements
 * @param {Array or NodeList or Element} elems
 */
proto.prepended = function( elems ) {
  var items = this._itemize( elems );
  if ( !items.length ) {
    return;
  }
  // add items to beginning of collection
  var previousItems = this.items.slice(0);
  this.items = items.concat( previousItems );
  // start new layout
  this._resetLayout();
  this._manageStamps();
  // layout new stuff without transition
  this.layoutItems( items, true );
  this.reveal( items );
  // layout previous items
  this.layoutItems( previousItems );
};

/**
 * reveal a collection of items
 * @param {Array of Outlayer.Items} items
 */
proto.reveal = function( items ) {
  this._emitCompleteOnItems( 'reveal', items );
  if ( !items || !items.length ) {
    return;
  }
  var stagger = this.updateStagger();
  items.forEach( function( item, i ) {
    item.stagger( i * stagger );
    item.reveal();
  });
};

/**
 * hide a collection of items
 * @param {Array of Outlayer.Items} items
 */
proto.hide = function( items ) {
  this._emitCompleteOnItems( 'hide', items );
  if ( !items || !items.length ) {
    return;
  }
  var stagger = this.updateStagger();
  items.forEach( function( item, i ) {
    item.stagger( i * stagger );
    item.hide();
  });
};

/**
 * reveal item elements
 * @param {Array}, {Element}, {NodeList} items
 */
proto.revealItemElements = function( elems ) {
  var items = this.getItems( elems );
  this.reveal( items );
};

/**
 * hide item elements
 * @param {Array}, {Element}, {NodeList} items
 */
proto.hideItemElements = function( elems ) {
  var items = this.getItems( elems );
  this.hide( items );
};

/**
 * get Outlayer.Item, given an Element
 * @param {Element} elem
 * @param {Function} callback
 * @returns {Outlayer.Item} item
 */
proto.getItem = function( elem ) {
  // loop through items to get the one that matches
  for ( var i=0; i < this.items.length; i++ ) {
    var item = this.items[i];
    if ( item.element == elem ) {
      // return item
      return item;
    }
  }
};

/**
 * get collection of Outlayer.Items, given Elements
 * @param {Array} elems
 * @returns {Array} items - Outlayer.Items
 */
proto.getItems = function( elems ) {
  elems = utils.makeArray( elems );
  var items = [];
  elems.forEach( function( elem ) {
    var item = this.getItem( elem );
    if ( item ) {
      items.push( item );
    }
  }, this );

  return items;
};

/**
 * remove element(s) from instance and DOM
 * @param {Array or NodeList or Element} elems
 */
proto.remove = function( elems ) {
  var removeItems = this.getItems( elems );

  this._emitCompleteOnItems( 'remove', removeItems );

  // bail if no items to remove
  if ( !removeItems || !removeItems.length ) {
    return;
  }

  removeItems.forEach( function( item ) {
    item.remove();
    // remove item from collection
    utils.removeFrom( this.items, item );
  }, this );
};

// ----- destroy ----- //

// remove and disable Outlayer instance
proto.destroy = function() {
  // clean up dynamic styles
  var style = this.element.style;
  style.height = '';
  style.position = '';
  style.width = '';
  // destroy items
  this.items.forEach( function( item ) {
    item.destroy();
  });

  this.unbindResize();

  var id = this.element.outlayerGUID;
  delete instances[ id ]; // remove reference to instance by id
  delete this.element.outlayerGUID;
  // remove data for jQuery
  if ( jQuery ) {
    jQuery.removeData( this.element, this.constructor.namespace );
  }

};

// -------------------------- data -------------------------- //

/**
 * get Outlayer instance from element
 * @param {Element} elem
 * @returns {Outlayer}
 */
Outlayer.data = function( elem ) {
  elem = utils.getQueryElement( elem );
  var id = elem && elem.outlayerGUID;
  return id && instances[ id ];
};


// -------------------------- create Outlayer class -------------------------- //

/**
 * create a layout class
 * @param {String} namespace
 */
Outlayer.create = function( namespace, options ) {
  // sub-class Outlayer
  var Layout = subclass( Outlayer );
  // apply new options and compatOptions
  Layout.defaults = utils.extend( {}, Outlayer.defaults );
  utils.extend( Layout.defaults, options );
  Layout.compatOptions = utils.extend( {}, Outlayer.compatOptions  );

  Layout.namespace = namespace;

  Layout.data = Outlayer.data;

  // sub-class Item
  Layout.Item = subclass( Item );

  // -------------------------- declarative -------------------------- //

  utils.htmlInit( Layout, namespace );

  // -------------------------- jQuery bridge -------------------------- //

  // make into jQuery plugin
  if ( jQuery && jQuery.bridget ) {
    jQuery.bridget( namespace, Layout );
  }

  return Layout;
};

function subclass( Parent ) {
  function SubClass() {
    Parent.apply( this, arguments );
  }

  SubClass.prototype = Object.create( Parent.prototype );
  SubClass.prototype.constructor = SubClass;

  return SubClass;
}

// ----- helpers ----- //

// how many milliseconds are in each unit
var msUnits = {
  ms: 1,
  s: 1000
};

// munge time-like parameter into millisecond number
// '0.4s' -> 40
function getMilliseconds( time ) {
  if ( typeof time == 'number' ) {
    return time;
  }
  var matches = time.match( /(^\d*\.?\d*)(\w*)/ );
  var num = matches && matches[1];
  var unit = matches && matches[2];
  if ( !num.length ) {
    return 0;
  }
  num = parseFloat( num );
  var mult = msUnits[ unit ] || 1;
  return num * mult;
}

// ----- fin ----- //

// back in global
Outlayer.Item = Item;

return Outlayer;

}));

},{"./item":"/Sites/kisk-mennekes-www-20151019-relaunch-frontend/node_modules/masonry-layout/node_modules/outlayer/item.js","ev-emitter":"/Sites/kisk-mennekes-www-20151019-relaunch-frontend/node_modules/masonry-layout/node_modules/outlayer/node_modules/ev-emitter/ev-emitter.js","fizzy-ui-utils":"/Sites/kisk-mennekes-www-20151019-relaunch-frontend/node_modules/masonry-layout/node_modules/outlayer/node_modules/fizzy-ui-utils/utils.js","get-size":"/Sites/kisk-mennekes-www-20151019-relaunch-frontend/node_modules/masonry-layout/node_modules/get-size/get-size.js"}],"/Sites/kisk-mennekes-www-20151019-relaunch-frontend/node_modules/svg4everybody/dist/svg4everybody.js":[function(require,module,exports){
!function(root, factory) {
    "function" == typeof define && define.amd ? // AMD. Register as an anonymous module unless amdModuleId is set
    define([], function() {
        return root.svg4everybody = factory();
    }) : "object" == typeof module && module.exports ? // Node. Does not work with strict CommonJS, but
    // only CommonJS-like environments that support module.exports,
    // like Node.
    module.exports = factory() : root.svg4everybody = factory();
}(this, function() {
    /*! svg4everybody v2.1.9 | github.com/jonathantneal/svg4everybody */
    function embed(parent, svg, target) {
        // if the target exists
        if (target) {
            // create a document fragment to hold the contents of the target
            var fragment = document.createDocumentFragment(), viewBox = !svg.hasAttribute("viewBox") && target.getAttribute("viewBox");
            // conditionally set the viewBox on the svg
            viewBox && svg.setAttribute("viewBox", viewBox);
            // copy the contents of the clone into the fragment
            for (// clone the target
            var clone = target.cloneNode(!0); clone.childNodes.length; ) {
                fragment.appendChild(clone.firstChild);
            }
            // append the fragment into the svg
            parent.appendChild(fragment);
        }
    }
    function loadreadystatechange(xhr) {
        // listen to changes in the request
        xhr.onreadystatechange = function() {
            // if the request is ready
            if (4 === xhr.readyState) {
                // get the cached html document
                var cachedDocument = xhr._cachedDocument;
                // ensure the cached html document based on the xhr response
                cachedDocument || (cachedDocument = xhr._cachedDocument = document.implementation.createHTMLDocument(""), 
                cachedDocument.body.innerHTML = xhr.responseText, xhr._cachedTarget = {}), // clear the xhr embeds list and embed each item
                xhr._embeds.splice(0).map(function(item) {
                    // get the cached target
                    var target = xhr._cachedTarget[item.id];
                    // ensure the cached target
                    target || (target = xhr._cachedTarget[item.id] = cachedDocument.getElementById(item.id)), 
                    // embed the target into the svg
                    embed(item.parent, item.svg, target);
                });
            }
        }, // test the ready state change immediately
        xhr.onreadystatechange();
    }
    function svg4everybody(rawopts) {
        function oninterval() {
            // while the index exists in the live <use> collection
            for (// get the cached <use> index
            var index = 0; index < uses.length; ) {
                // get the current <use>
                var use = uses[index], parent = use.parentNode, svg = getSVGAncestor(parent), src = use.getAttribute("xlink:href") || use.getAttribute("href");
                if (!src && opts.attributeName && (src = use.getAttribute(opts.attributeName)), 
                svg && src) {
                    if (polyfill) {
                        if (!opts.validate || opts.validate(src, svg, use)) {
                            // remove the <use> element
                            parent.removeChild(use);
                            // parse the src and get the url and id
                            var srcSplit = src.split("#"), url = srcSplit.shift(), id = srcSplit.join("#");
                            // if the link is external
                            if (url.length) {
                                // get the cached xhr request
                                var xhr = requests[url];
                                // ensure the xhr request exists
                                xhr || (xhr = requests[url] = new XMLHttpRequest(), xhr.open("GET", url), xhr.send(), 
                                xhr._embeds = []), // add the svg and id as an item to the xhr embeds list
                                xhr._embeds.push({
                                    parent: parent,
                                    svg: svg,
                                    id: id
                                }), // prepare the xhr ready state change event
                                loadreadystatechange(xhr);
                            } else {
                                // embed the local id into the svg
                                embed(parent, svg, document.getElementById(id));
                            }
                        } else {
                            // increase the index when the previous value was not "valid"
                            ++index, ++numberOfSvgUseElementsToBypass;
                        }
                    }
                } else {
                    // increase the index when the previous value was not "valid"
                    ++index;
                }
            }
            // continue the interval
            (!uses.length || uses.length - numberOfSvgUseElementsToBypass > 0) && requestAnimationFrame(oninterval, 67);
        }
        var polyfill, opts = Object(rawopts), newerIEUA = /\bTrident\/[567]\b|\bMSIE (?:9|10)\.0\b/, webkitUA = /\bAppleWebKit\/(\d+)\b/, olderEdgeUA = /\bEdge\/12\.(\d+)\b/, edgeUA = /\bEdge\/.(\d+)\b/, inIframe = window.top !== window.self;
        polyfill = "polyfill" in opts ? opts.polyfill : newerIEUA.test(navigator.userAgent) || (navigator.userAgent.match(olderEdgeUA) || [])[1] < 10547 || (navigator.userAgent.match(webkitUA) || [])[1] < 537 || edgeUA.test(navigator.userAgent) && inIframe;
        // create xhr requests object
        var requests = {}, requestAnimationFrame = window.requestAnimationFrame || setTimeout, uses = document.getElementsByTagName("use"), numberOfSvgUseElementsToBypass = 0;
        // conditionally start the interval if the polyfill is active
        polyfill && oninterval();
    }
    function getSVGAncestor(node) {
        for (var svg = node; "svg" !== svg.nodeName.toLowerCase() && (svg = svg.parentNode); ) {}
        return svg;
    }
    return svg4everybody;
});
},{}],"/Sites/kisk-mennekes-www-20151019-relaunch-frontend/node_modules/uikit/dist/js/uikit.js":[function(require,module,exports){
/*! UIkit 2.27.4 | http://www.getuikit.com | (c) 2014 YOOtheme | MIT License */
(function(core) {

    var uikit;

    if (!window.jQuery) {
        throw new Error('UIkit 2.x requires jQuery');
    } else {
        uikit = core(window.jQuery);
    }

    if (typeof define == 'function' && define.amd) { // AMD

        define('uikit', function(){

            uikit.load = function(res, req, onload, config) {

                var resources = res.split(','), load = [], i, base = (config.config && config.config.uikit && config.config.uikit.base ? config.config.uikit.base : '').replace(/\/+$/g, '');

                if (!base) {
                    throw new Error('Please define base path to UIkit in the requirejs config.');
                }

                for (i = 0; i < resources.length; i += 1) {
                    var resource = resources[i].replace(/\./g, '/');
                    load.push(base+'/components/'+resource);
                }

                req(load, function() {
                    onload(uikit);
                });
            };

            return uikit;
        });
    }

})(function($) {

    "use strict";

    if (window.UIkit2) {
        return window.UIkit2;
    }

    var UI = {}, _UI = window.UIkit || undefined;

    UI.version = '2.27.4';

    UI.noConflict = function() {
        // restore UIkit version
        if (_UI) {
            window.UIkit = _UI;
            $.UIkit      = _UI;
            $.fn.uk      = _UI.fn;
        }

        return UI;
    };

    window.UIkit2 = UI;

    if (!_UI) {
        window.UIkit = UI;
    }

    // cache jQuery
    UI.$ = $;

    UI.$doc  = UI.$(document);
    UI.$win  = UI.$(window);
    UI.$html = UI.$('html');

    UI.support = {};
    UI.support.transition = (function() {

        var transitionEnd = (function() {

            var element = document.body || document.documentElement,
                transEndEventNames = {
                    WebkitTransition : 'webkitTransitionEnd',
                    MozTransition    : 'transitionend',
                    OTransition      : 'oTransitionEnd otransitionend',
                    transition       : 'transitionend'
                }, name;

            for (name in transEndEventNames) {
                if (element.style[name] !== undefined) return transEndEventNames[name];
            }
        }());

        return transitionEnd && { end: transitionEnd };
    })();

    UI.support.animation = (function() {

        var animationEnd = (function() {

            var element = document.body || document.documentElement,
                animEndEventNames = {
                    WebkitAnimation : 'webkitAnimationEnd',
                    MozAnimation    : 'animationend',
                    OAnimation      : 'oAnimationEnd oanimationend',
                    animation       : 'animationend'
                }, name;

            for (name in animEndEventNames) {
                if (element.style[name] !== undefined) return animEndEventNames[name];
            }
        }());

        return animationEnd && { end: animationEnd };
    })();

    // requestAnimationFrame polyfill
    //https://github.com/darius/requestAnimationFrame
    (function() {

        Date.now = Date.now || function() { return new Date().getTime(); };

        var vendors = ['webkit', 'moz'];
        for (var i = 0; i < vendors.length && !window.requestAnimationFrame; ++i) {
            var vp = vendors[i];
            window.requestAnimationFrame = window[vp+'RequestAnimationFrame'];
            window.cancelAnimationFrame = (window[vp+'CancelAnimationFrame']
                                       || window[vp+'CancelRequestAnimationFrame']);
        }
        if (/iP(ad|hone|od).*OS 6/.test(window.navigator.userAgent) // iOS6 is buggy
            || !window.requestAnimationFrame || !window.cancelAnimationFrame) {
            var lastTime = 0;
            window.requestAnimationFrame = function(callback) {
                var now = Date.now();
                var nextTime = Math.max(lastTime + 16, now);
                return setTimeout(function() { callback(lastTime = nextTime); },
                                  nextTime - now);
            };
            window.cancelAnimationFrame = clearTimeout;
        }
    }());

    UI.support.touch = (
        ('ontouchstart' in document) ||
        (window.DocumentTouch && document instanceof window.DocumentTouch)  ||
        (window.navigator.msPointerEnabled && window.navigator.msMaxTouchPoints > 0) || //IE 10
        (window.navigator.pointerEnabled && window.navigator.maxTouchPoints > 0) || //IE >=11
        false
    );

    UI.support.mutationobserver = (window.MutationObserver || window.WebKitMutationObserver || null);

    UI.Utils = {};

    UI.Utils.isFullscreen = function() {
        return document.webkitFullscreenElement || document.mozFullScreenElement || document.msFullscreenElement || document.fullscreenElement || false;
    };

    UI.Utils.str2json = function(str, notevil) {
        try {
            if (notevil) {
                return JSON.parse(str
                    // wrap keys without quote with valid double quote
                    .replace(/([\$\w]+)\s*:/g, function(_, $1){return '"'+$1+'":';})
                    // replacing single quote wrapped ones to double quote
                    .replace(/'([^']+)'/g, function(_, $1){return '"'+$1+'"';})
                );
            } else {
                return (new Function('', 'var json = ' + str + '; return JSON.parse(JSON.stringify(json));'))();
            }
        } catch(e) { return false; }
    };

    UI.Utils.debounce = function(func, wait, immediate) {
        var timeout;
        return function() {
            var context = this, args = arguments;
            var later = function() {
                timeout = null;
                if (!immediate) func.apply(context, args);
            };
            var callNow = immediate && !timeout;
            clearTimeout(timeout);
            timeout = setTimeout(later, wait);
            if (callNow) func.apply(context, args);
        };
    };

    UI.Utils.throttle = function (func, limit) {
        var wait = false;
        return function () {
            if (!wait) {
                func.call();
                wait = true;
                setTimeout(function () {
                    wait = false;
                }, limit);
            }
        }
    };

    UI.Utils.removeCssRules = function(selectorRegEx) {
        var idx, idxs, stylesheet, _i, _j, _k, _len, _len1, _len2, _ref;

        if(!selectorRegEx) return;

        setTimeout(function(){
            try {
              _ref = document.styleSheets;
              for (_i = 0, _len = _ref.length; _i < _len; _i++) {
                stylesheet = _ref[_i];
                idxs = [];
                stylesheet.cssRules = stylesheet.cssRules;
                for (idx = _j = 0, _len1 = stylesheet.cssRules.length; _j < _len1; idx = ++_j) {
                  if (stylesheet.cssRules[idx].type === CSSRule.STYLE_RULE && selectorRegEx.test(stylesheet.cssRules[idx].selectorText)) {
                    idxs.unshift(idx);
                  }
                }
                for (_k = 0, _len2 = idxs.length; _k < _len2; _k++) {
                  stylesheet.deleteRule(idxs[_k]);
                }
              }
            } catch (_error) {}
        }, 0);
    };

    UI.Utils.isInView = function(element, options) {

        var $element = $(element);

        if (!$element.is(':visible')) {
            return false;
        }

        var window_left = UI.$win.scrollLeft(), window_top = UI.$win.scrollTop(), offset = $element.offset(), left = offset.left, top = offset.top;

        options = $.extend({topoffset:0, leftoffset:0}, options);

        if (top + $element.height() >= window_top && top - options.topoffset <= window_top + UI.$win.height() &&
            left + $element.width() >= window_left && left - options.leftoffset <= window_left + UI.$win.width()) {
          return true;
        } else {
          return false;
        }
    };

    UI.Utils.checkDisplay = function(context, initanimation) {

        var elements = UI.$('[data-uk-margin], [data-uk-grid-match], [data-uk-grid-margin], [data-uk-check-display]', context || document), animated;

        if (context && !elements.length) {
            elements = $(context);
        }

        elements.trigger('display.uk.check');

        // fix firefox / IE animations
        if (initanimation) {

            if (typeof(initanimation)!='string') {
                initanimation = '[class*="uk-animation-"]';
            }

            elements.find(initanimation).each(function(){

                var ele  = UI.$(this),
                    cls  = ele.attr('class'),
                    anim = cls.match(/uk-animation-(.+)/);

                ele.removeClass(anim[0]).width();

                ele.addClass(anim[0]);
            });
        }

        return elements;
    };

    UI.Utils.options = function(string) {

        if ($.type(string)!='string') return string;

        if (string.indexOf(':') != -1 && string.trim().substr(-1) != '}') {
            string = '{'+string+'}';
        }

        var start = (string ? string.indexOf("{") : -1), options = {};

        if (start != -1) {
            try {
                options = UI.Utils.str2json(string.substr(start));
            } catch (e) {}
        }

        return options;
    };

    UI.Utils.animate = function(element, cls) {

        var d = $.Deferred();

        element = UI.$(element);

        element.css('display', 'none').addClass(cls).one(UI.support.animation.end, function() {
            element.removeClass(cls);
            d.resolve();
        });

        element.css('display', '');

        return d.promise();
    };

    UI.Utils.uid = function(prefix) {
        return (prefix || 'id') + (new Date().getTime())+"RAND"+(Math.ceil(Math.random() * 100000));
    };

    UI.Utils.template = function(str, data) {

        var tokens = str.replace(/\n/g, '\\n').replace(/\{\{\{\s*(.+?)\s*\}\}\}/g, "{{!$1}}").split(/(\{\{\s*(.+?)\s*\}\})/g),
            i=0, toc, cmd, prop, val, fn, output = [], openblocks = 0;

        while(i < tokens.length) {

            toc = tokens[i];

            if(toc.match(/\{\{\s*(.+?)\s*\}\}/)) {
                i = i + 1;
                toc  = tokens[i];
                cmd  = toc[0];
                prop = toc.substring(toc.match(/^(\^|\#|\!|\~|\:)/) ? 1:0);

                switch(cmd) {
                    case '~':
                        output.push('for(var $i=0;$i<'+prop+'.length;$i++) { var $item = '+prop+'[$i];');
                        openblocks++;
                        break;
                    case ':':
                        output.push('for(var $key in '+prop+') { var $val = '+prop+'[$key];');
                        openblocks++;
                        break;
                    case '#':
                        output.push('if('+prop+') {');
                        openblocks++;
                        break;
                    case '^':
                        output.push('if(!'+prop+') {');
                        openblocks++;
                        break;
                    case '/':
                        output.push('}');
                        openblocks--;
                        break;
                    case '!':
                        output.push('__ret.push('+prop+');');
                        break;
                    default:
                        output.push('__ret.push(escape('+prop+'));');
                        break;
                }
            } else {
                output.push("__ret.push('"+toc.replace(/\'/g, "\\'")+"');");
            }
            i = i + 1;
        }

        fn  = new Function('$data', [
            'var __ret = [];',
            'try {',
            'with($data){', (!openblocks ? output.join('') : '__ret = ["Not all blocks are closed correctly."]'), '};',
            '}catch(e){__ret = [e.message];}',
            'return __ret.join("").replace(/\\n\\n/g, "\\n");',
            "function escape(html) { return String(html).replace(/&/g, '&amp;').replace(/\"/g, '&quot;').replace(/</g, '&lt;').replace(/>/g, '&gt;');}"
        ].join("\n"));

        return data ? fn(data) : fn;
    };

    UI.Utils.focus = function(element, extra) {

        element = $(element);

        if (!element.length) {
            return element;
        }

        var autofocus = element.find('[autofocus]:first'), tabidx;

        if (autofocus.length) {
            return autofocus.focus();
        }

        autofocus = element.find(':input'+(extra && (','+extra) || '')).first();

        if (autofocus.length) {
            return autofocus.focus();
        }

        if (!element.attr('tabindex')) {
            tabidx = 1000;
            element.attr('tabindex', tabidx);
        }

        element[0].focus();

        if (tabidx) {
            element.attr('tabindex', '');
        }

        return element;
    }

    UI.Utils.events       = {};
    UI.Utils.events.click = UI.support.touch ? 'tap' : 'click';

    // deprecated

    UI.fn = function(command, options) {

        var args = arguments, cmd = command.match(/^([a-z\-]+)(?:\.([a-z]+))?/i), component = cmd[1], method = cmd[2];

        if (!UI[component]) {
            $.error('UIkit component [' + component + '] does not exist.');
            return this;
        }

        return this.each(function() {
            var $this = $(this), data = $this.data(component);
            if (!data) $this.data(component, (data = UI[component](this, method ? undefined : options)));
            if (method) data[method].apply(data, Array.prototype.slice.call(args, 1));
        });
    };

    $.UIkit          = UI;
    $.fn.uk          = UI.fn;

    UI.langdirection = UI.$html.attr("dir") == "rtl" ? "right" : "left";

    UI.components    = {};

    UI.component = function(name, def, override) {

        if (UI.components[name] && !override) {
            return UI.components[name];
        }

        var fn = function(element, options) {

            var $this = this;

            this.UIkit   = UI;
            this.element = element ? UI.$(element) : null;
            this.options = $.extend(true, {}, this.defaults, options);
            this.plugins = {};

            if (this.element) {
                this.element.data(name, this);
            }

            this.init();

            (this.options.plugins.length ? this.options.plugins : Object.keys(fn.plugins)).forEach(function(plugin) {

                if (fn.plugins[plugin].init) {
                    fn.plugins[plugin].init($this);
                    $this.plugins[plugin] = true;
                }

            });

            this.trigger('init.uk.component', [name, this]);

            return this;
        };

        fn.plugins = {};

        $.extend(true, fn.prototype, {

            defaults : {plugins: []},

            boot: function(){},
            init: function(){},

            on: function(a1,a2,a3){
                return UI.$(this.element || this).on(a1,a2,a3);
            },

            one: function(a1,a2,a3){
                return UI.$(this.element || this).one(a1,a2,a3);
            },

            off: function(evt){
                return UI.$(this.element || this).off(evt);
            },

            trigger: function(evt, params) {
                return UI.$(this.element || this).trigger(evt, params);
            },

            find: function(selector) {
                return UI.$(this.element ? this.element: []).find(selector);
            },

            proxy: function(obj, methods) {

                var $this = this;

                methods.split(' ').forEach(function(method) {
                    if (!$this[method]) $this[method] = function() { return obj[method].apply(obj, arguments); };
                });
            },

            mixin: function(obj, methods) {

                var $this = this;

                methods.split(' ').forEach(function(method) {
                    if (!$this[method]) $this[method] = obj[method].bind($this);
                });
            },

            option: function() {

                if (arguments.length == 1) {
                    return this.options[arguments[0]] || undefined;
                } else if (arguments.length == 2) {
                    this.options[arguments[0]] = arguments[1];
                }
            }

        }, def);

        this.components[name] = fn;

        this[name] = function() {

            var element, options;

            if (arguments.length) {

                switch(arguments.length) {
                    case 1:

                        if (typeof arguments[0] === 'string' || arguments[0].nodeType || arguments[0] instanceof jQuery) {
                            element = $(arguments[0]);
                        } else {
                            options = arguments[0];
                        }

                        break;
                    case 2:

                        element = $(arguments[0]);
                        options = arguments[1];
                        break;
                }
            }

            if (element && element.data(name)) {
                return element.data(name);
            }

            return (new UI.components[name](element, options));
        };

        if (UI.domready) {
            UI.component.boot(name);
        }

        return fn;
    };

    UI.plugin = function(component, name, def) {
        this.components[component].plugins[name] = def;
    };

    UI.component.boot = function(name) {

        if (UI.components[name].prototype && UI.components[name].prototype.boot && !UI.components[name].booted) {
            UI.components[name].prototype.boot.apply(UI, []);
            UI.components[name].booted = true;
        }
    };

    UI.component.bootComponents = function() {

        for (var component in UI.components) {
            UI.component.boot(component);
        }
    };


    // DOM mutation save ready helper function

    UI.domObservers = [];
    UI.domready     = false;

    UI.ready = function(fn) {

        UI.domObservers.push(fn);

        if (UI.domready) {
            fn(document);
        }
    };

    UI.on = function(a1,a2,a3){

        if (a1 && a1.indexOf('ready.uk.dom') > -1 && UI.domready) {
            a2.apply(UI.$doc);
        }

        return UI.$doc.on(a1,a2,a3);
    };

    UI.one = function(a1,a2,a3){

        if (a1 && a1.indexOf('ready.uk.dom') > -1 && UI.domready) {
            a2.apply(UI.$doc);
            return UI.$doc;
        }

        return UI.$doc.one(a1,a2,a3);
    };

    UI.trigger = function(evt, params) {
        return UI.$doc.trigger(evt, params);
    };

    UI.domObserve = function(selector, fn) {

        if(!UI.support.mutationobserver) return;

        fn = fn || function() {};

        UI.$(selector).each(function() {

            var element  = this,
                $element = UI.$(element);

            if ($element.data('observer')) {
                return;
            }

            try {

                var observer = new UI.support.mutationobserver(UI.Utils.debounce(function(mutations) {
                    fn.apply(element, [$element]);
                    $element.trigger('changed.uk.dom');
                }, 50), {childList: true, subtree: true});

                // pass in the target node, as well as the observer options
                observer.observe(element, { childList: true, subtree: true });

                $element.data('observer', observer);

            } catch(e) {}
        });
    };

    UI.init = function(root) {

        root = root || document;

        UI.domObservers.forEach(function(fn){
            fn(root);
        });
    };

    UI.on('domready.uk.dom', function(){

        UI.init();

        if (UI.domready) UI.Utils.checkDisplay();
    });

    document.addEventListener('DOMContentLoaded', function(){

        var domReady = function() {

            UI.$body = UI.$('body');

            UI.trigger('beforeready.uk.dom');

            UI.component.bootComponents();

            // custom scroll observer
            var rafToken = requestAnimationFrame((function(){

                var memory = {dir: {x:0, y:0}, x: window.pageXOffset, y:window.pageYOffset};

                var fn = function(){
                    // reading this (window.page[X|Y]Offset) causes a full page recalc of the layout in Chrome,
                    // so we only want to do this once
                    var wpxo = window.pageXOffset;
                    var wpyo = window.pageYOffset;

                    // Did the scroll position change since the last time we were here?
                    if (memory.x != wpxo || memory.y != wpyo) {

                        // Set the direction of the scroll and store the new position
                        if (wpxo != memory.x) {memory.dir.x = wpxo > memory.x ? 1:-1; } else { memory.dir.x = 0; }
                        if (wpyo != memory.y) {memory.dir.y = wpyo > memory.y ? 1:-1; } else { memory.dir.y = 0; }

                        memory.x = wpxo;
                        memory.y = wpyo;

                        // Trigger the scroll event, this could probably be sent using memory.clone() but this is
                        // more explicit and easier to see exactly what is being sent in the event.
                        UI.$doc.trigger('scrolling.uk.document', [{
                            dir: {x: memory.dir.x, y: memory.dir.y}, x: wpxo, y: wpyo
                        }]);
                    }

                    cancelAnimationFrame(rafToken);
                    rafToken = requestAnimationFrame(fn);
                };

                if (UI.support.touch) {
                    UI.$html.on('touchmove touchend MSPointerMove MSPointerUp pointermove pointerup', fn);
                }

                if (memory.x || memory.y) fn();

                return fn;

            })());

            // run component init functions on dom
            UI.trigger('domready.uk.dom');

            if (UI.support.touch) {

                // remove css hover rules for touch devices
                // UI.Utils.removeCssRules(/\.uk-(?!navbar).*:hover/);

                // viewport unit fix for uk-height-viewport - should be fixed in iOS 8
                if (navigator.userAgent.match(/(iPad|iPhone|iPod)/g)) {

                    UI.$win.on('load orientationchange resize', UI.Utils.debounce((function(){

                        var fn = function() {
                            $('.uk-height-viewport').css('height', window.innerHeight);
                            return fn;
                        };

                        return fn();

                    })(), 100));
                }
            }

            UI.trigger('afterready.uk.dom');

            // mark that domready is left behind
            UI.domready = true;

            // auto init js components
            if (UI.support.mutationobserver) {

                var initFn = UI.Utils.debounce(function(){
                    requestAnimationFrame(function(){ UI.init(document.body);});
                }, 10);

                (new UI.support.mutationobserver(function(mutations) {

                    var init = false;

                    mutations.every(function(mutation){

                        if (mutation.type != 'childList') return true;

                        for (var i = 0, node; i < mutation.addedNodes.length; ++i) {

                            node = mutation.addedNodes[i];

                            if (node.outerHTML && node.outerHTML.indexOf('data-uk-') !== -1) {
                                return (init = true) && false;
                            }
                        }
                        return true;
                    });

                    if (init) initFn();

                })).observe(document.body, {childList: true, subtree: true});
            }
        };

        if (document.readyState == 'complete' || document.readyState == 'interactive') {
            setTimeout(domReady);
        }

        return domReady;

    }());

    // add touch identifier class
    UI.$html.addClass(UI.support.touch ? 'uk-touch' : 'uk-notouch');

    // add uk-hover class on tap to support overlays on touch devices
    if (UI.support.touch) {

        var hoverset = false,
            exclude,
            hovercls = 'uk-hover',
            selector = '.uk-overlay, .uk-overlay-hover, .uk-overlay-toggle, .uk-animation-hover, .uk-has-hover';

        UI.$html.on('mouseenter touchstart MSPointerDown pointerdown', selector, function() {

            if (hoverset) $('.'+hovercls).removeClass(hovercls);

            hoverset = $(this).addClass(hovercls);

        }).on('mouseleave touchend MSPointerUp pointerup', function(e) {

            exclude = $(e.target).parents(selector);

            if (hoverset) {
                hoverset.not(exclude).removeClass(hovercls);
            }
        });
    }

    return UI;
});

//  Based on Zeptos touch.js
//  https://raw.github.com/madrobby/zepto/master/src/touch.js
//  Zepto.js may be freely distributed under the MIT license.

;(function($){

  if ($.fn.swipeLeft) {
    return;
  }


  var touch = {}, touchTimeout, tapTimeout, swipeTimeout, longTapTimeout, longTapDelay = 750, gesture;
  var hasTouchEvents = 'ontouchstart' in window,
      hasPointerEvents = window.PointerEvent,
      hasTouch = hasTouchEvents
      || window.DocumentTouch && document instanceof DocumentTouch
      || navigator.msPointerEnabled && navigator.msMaxTouchPoints > 0 // IE 10
      || navigator.pointerEnabled && navigator.maxTouchPoints > 0; // IE >=11

  function swipeDirection(x1, x2, y1, y2) {
    return Math.abs(x1 - x2) >= Math.abs(y1 - y2) ? (x1 - x2 > 0 ? 'Left' : 'Right') : (y1 - y2 > 0 ? 'Up' : 'Down');
  }

  function longTap() {
    longTapTimeout = null;
    if (touch.last) {
      if ( touch.el !== undefined ) touch.el.trigger('longTap');
      touch = {};
    }
  }

  function cancelLongTap() {
    if (longTapTimeout) clearTimeout(longTapTimeout);
    longTapTimeout = null;
  }

  function cancelAll() {
    if (touchTimeout)   clearTimeout(touchTimeout);
    if (tapTimeout)     clearTimeout(tapTimeout);
    if (swipeTimeout)   clearTimeout(swipeTimeout);
    if (longTapTimeout) clearTimeout(longTapTimeout);
    touchTimeout = tapTimeout = swipeTimeout = longTapTimeout = null;
    touch = {};
  }

  function isPrimaryTouch(event){
    return event.pointerType == event.MSPOINTER_TYPE_TOUCH && event.isPrimary;
  }

  $(function(){
    var now, delta, deltaX = 0, deltaY = 0, firstTouch;

    if ('MSGesture' in window) {
      gesture = new MSGesture();
      gesture.target = document.body;
    }

    $(document)
      .on('MSGestureEnd gestureend', function(e){

        var swipeDirectionFromVelocity = e.originalEvent.velocityX > 1 ? 'Right' : e.originalEvent.velocityX < -1 ? 'Left' : e.originalEvent.velocityY > 1 ? 'Down' : e.originalEvent.velocityY < -1 ? 'Up' : null;

        if (swipeDirectionFromVelocity && touch.el !== undefined) {
          touch.el.trigger('swipe');
          touch.el.trigger('swipe'+ swipeDirectionFromVelocity);
        }
      })
      // MSPointerDown: for IE10
      // pointerdown: for IE11
      .on('touchstart MSPointerDown pointerdown', function(e){

        if(e.type == 'MSPointerDown' && !isPrimaryTouch(e.originalEvent)) return;

        firstTouch = (e.type == 'MSPointerDown' || e.type == 'pointerdown') ? e : e.originalEvent.touches[0];

        now      = Date.now();
        delta    = now - (touch.last || now);
        touch.el = $('tagName' in firstTouch.target ? firstTouch.target : firstTouch.target.parentNode);

        if(touchTimeout) clearTimeout(touchTimeout);

        touch.x1 = firstTouch.pageX;
        touch.y1 = firstTouch.pageY;

        if (delta > 0 && delta <= 250) touch.isDoubleTap = true;

        touch.last = now;
        longTapTimeout = setTimeout(longTap, longTapDelay);

        // adds the current touch contact for IE gesture recognition
        if (e.originalEvent && e.originalEvent.pointerId && gesture && ( e.type == 'MSPointerDown' || e.type == 'pointerdown' || e.type == 'touchstart' ) ) {
          gesture.addPointer(e.originalEvent.pointerId);
        }

      })
      // MSPointerMove: for IE10
      // pointermove: for IE11
      .on('touchmove MSPointerMove pointermove', function(e){

        if (e.type == 'MSPointerMove' && !isPrimaryTouch(e.originalEvent)) return;

        firstTouch = (e.type == 'MSPointerMove' || e.type == 'pointermove') ? e : e.originalEvent.touches[0];

        cancelLongTap();
        touch.x2 = firstTouch.pageX;
        touch.y2 = firstTouch.pageY;

        deltaX += Math.abs(touch.x1 - touch.x2);
        deltaY += Math.abs(touch.y1 - touch.y2);
      })
      // MSPointerUp: for IE10
      // pointerup: for IE11
      .on('touchend MSPointerUp pointerup', function(e){

        if (e.type == 'MSPointerUp' && !isPrimaryTouch(e.originalEvent)) return;

        cancelLongTap();

        // swipe
        if ((touch.x2 && Math.abs(touch.x1 - touch.x2) > 30) || (touch.y2 && Math.abs(touch.y1 - touch.y2) > 30)){

          swipeTimeout = setTimeout(function() {
            if ( touch.el !== undefined ) {
              touch.el.trigger('swipe');
              touch.el.trigger('swipe' + (swipeDirection(touch.x1, touch.x2, touch.y1, touch.y2)));
            }
            touch = {};
          }, 0);

        // normal tap
        } else if ('last' in touch) {

          // don't fire tap when delta position changed by more than 30 pixels,
          // for instance when moving to a point and back to origin
          if (isNaN(deltaX) || (deltaX < 30 && deltaY < 30)) {
            // delay by one tick so we can cancel the 'tap' event if 'scroll' fires
            // ('tap' fires before 'scroll')
            tapTimeout = setTimeout(function() {

              // trigger universal 'tap' with the option to cancelTouch()
              // (cancelTouch cancels processing of single vs double taps for faster 'tap' response)
              var event = $.Event('tap');
              event.cancelTouch = cancelAll;
              if ( touch.el !== undefined ) touch.el.trigger(event);

              // trigger double tap immediately
              if (touch.isDoubleTap) {
                if ( touch.el !== undefined ) touch.el.trigger('doubleTap');
                touch = {};
              }

              // trigger single tap after 250ms of inactivity
              else {
                touchTimeout = setTimeout(function(){
                  touchTimeout = null;
                  if ( touch.el !== undefined ) touch.el.trigger('singleTap');
                  touch = {};
                }, 250);
              }
            }, 0);
          } else {
            touch = {};
          }
          deltaX = deltaY = 0;
        }
      })
      // when the browser window loses focus,
      // for example when a modal dialog is shown,
      // cancel all ongoing events
      .on('touchcancel MSPointerCancel pointercancel', function(e){

        // Ignore pointercancel if the event supports touch events, to prevent pointercancel in swipe gesture
        if ((e.type == 'touchcancel' && hasTouchEvents && hasTouch) || (!hasTouchEvents && e.type == 'pointercancel' && hasPointerEvents)) {
          cancelAll();
        }

    });

    // scrolling the window indicates intention of the user
    // to scroll, not tap or swipe, so cancel all ongoing events
    $(window).on('scroll', cancelAll);
  });

  ['swipe', 'swipeLeft', 'swipeRight', 'swipeUp', 'swipeDown', 'doubleTap', 'tap', 'singleTap', 'longTap'].forEach(function(eventName){
    $.fn[eventName] = function(callback){ return $(this).on(eventName, callback); };
  });
})(jQuery);

(function(UI) {

    "use strict";

    var stacks = [];

    UI.component('stackMargin', {

        defaults: {
            cls: 'uk-margin-small-top',
            rowfirst: false,
            observe: false
        },

        boot: function() {

            // init code
            UI.ready(function(context) {

                UI.$('[data-uk-margin]', context).each(function() {

                    var ele = UI.$(this);

                    if (!ele.data('stackMargin')) {
                        UI.stackMargin(ele, UI.Utils.options(ele.attr('data-uk-margin')));
                    }
                });
            });
        },

        init: function() {

            var $this = this;

            UI.$win.on('resize orientationchange', (function() {

                var fn = function() {
                    $this.process();
                };

                UI.$(function() {
                    fn();
                    UI.$win.on('load', fn);
                });

                return UI.Utils.debounce(fn, 20);
            })());

            this.on('display.uk.check', function(e) {
                if (this.element.is(':visible')) this.process();
            }.bind(this));

            if (this.options.observe) {

                UI.domObserve(this.element, function(e) {
                    if ($this.element.is(':visible')) $this.process();
                });
            }

            stacks.push(this);
        },

        process: function() {

            var $this = this, columns = this.element.children();

            UI.Utils.stackMargin(columns, this.options);

            if (!this.options.rowfirst || !columns.length) {
                return this;
            }

            // Mark first column elements
            var group = {}, minleft = false;

            columns.removeClass(this.options.rowfirst).each(function(offset, $ele){

                $ele = UI.$(this);

                if (this.style.display != 'none') {
                    offset = $ele.offset().left;
                    ((group[offset] = group[offset] || []) && group[offset]).push(this);
                    minleft = minleft === false ? offset : Math.min(minleft, offset);
                }
            });

            UI.$(group[minleft]).addClass(this.options.rowfirst);

            return this;
        }

    });


    // responsive element e.g. iframes

    (function(){

        var elements = [], check = function(ele) {

            if (!ele.is(':visible')) return;

            var width  = ele.parent().width(),
                iwidth = ele.data('width'),
                ratio  = (width / iwidth),
                height = Math.floor(ratio * ele.data('height'));

            ele.css({height: (width < iwidth) ? height : ele.data('height')});
        };

        UI.component('responsiveElement', {

            defaults: {},

            boot: function() {

                // init code
                UI.ready(function(context) {

                    UI.$('iframe.uk-responsive-width, [data-uk-responsive]', context).each(function() {

                        var ele = UI.$(this), obj;

                        if (!ele.data('responsiveElement')) {
                            obj = UI.responsiveElement(ele, {});
                        }
                    });
                });
            },

            init: function() {

                var ele = this.element;

                if (ele.attr('width') && ele.attr('height')) {

                    ele.data({
                        width : ele.attr('width'),
                        height: ele.attr('height')
                    }).on('display.uk.check', function(){
                        check(ele);
                    });

                    check(ele);

                    elements.push(ele);
                }
            }
        });

        UI.$win.on('resize load', UI.Utils.debounce(function(){

            elements.forEach(function(ele){
                check(ele);
            });

        }, 15));

    })();


    // helper

    UI.Utils.stackMargin = function(elements, options) {

        options = UI.$.extend({
            cls: 'uk-margin-small-top'
        }, options);

        elements = UI.$(elements).removeClass(options.cls);

        var min = false;

        elements.each(function(offset, height, pos, $ele){

            $ele   = UI.$(this);

            if ($ele.css('display') != 'none') {

                offset = $ele.offset();
                height = $ele.outerHeight();
                pos    = offset.top + height;

                $ele.data({
                    ukMarginPos: pos,
                    ukMarginTop: offset.top
                });

                if (min === false || (offset.top < min.top) ) {

                    min = {
                        top  : offset.top,
                        left : offset.left,
                        pos  : pos
                    };
                }
            }

        }).each(function($ele) {

            $ele   = UI.$(this);

            if ($ele.css('display') != 'none' && $ele.data('ukMarginTop') > min.top && $ele.data('ukMarginPos') > min.pos) {
                $ele.addClass(options.cls);
            }
        });
    };

    UI.Utils.matchHeights = function(elements, options) {

        elements = UI.$(elements).css('min-height', '');
        options  = UI.$.extend({ row : true }, options);

        var matchHeights = function(group){

            if (group.length < 2) return;

            var max = 0;

            group.each(function() {
                max = Math.max(max, UI.$(this).outerHeight());
            }).each(function() {

                var element = UI.$(this),
                    height  = max - (element.css('box-sizing') == 'border-box' ? 0 : (element.outerHeight() - element.height()));

                element.css('min-height', height + 'px');
            });
        };

        if (options.row) {

            elements.first().width(); // force redraw

            setTimeout(function(){

                var lastoffset = false, group = [];

                elements.each(function() {

                    var ele = UI.$(this), offset = ele.offset().top;

                    if (offset != lastoffset && group.length) {

                        matchHeights(UI.$(group));
                        group  = [];
                        offset = ele.offset().top;
                    }

                    group.push(ele);
                    lastoffset = offset;
                });

                if (group.length) {
                    matchHeights(UI.$(group));
                }

            }, 0);

        } else {
            matchHeights(elements);
        }
    };

    (function(cacheSvgs){

        UI.Utils.inlineSvg = function(selector, root) {

            var images = UI.$(selector || 'img[src$=".svg"]', root || document).each(function(){

                var img = UI.$(this),
                    src = img.attr('src');

                if (!cacheSvgs[src]) {

                    var d = UI.$.Deferred();

                    UI.$.get(src, {nc: Math.random()}, function(data){
                        d.resolve(UI.$(data).find('svg'));
                    });

                    cacheSvgs[src] = d.promise();
                }

                cacheSvgs[src].then(function(svg) {

                    var $svg = UI.$(svg).clone();

                    if (img.attr('id')) $svg.attr('id', img.attr('id'));
                    if (img.attr('class')) $svg.attr('class', img.attr('class'));
                    if (img.attr('style')) $svg.attr('style', img.attr('style'));

                    if (img.attr('width')) {
                        $svg.attr('width', img.attr('width'));
                        if (!img.attr('height'))  $svg.removeAttr('height');
                    }

                    if (img.attr('height')){
                        $svg.attr('height', img.attr('height'));
                        if (!img.attr('width')) $svg.removeAttr('width');
                    }

                    img.replaceWith($svg);
                });
            });
        };

        // init code
        UI.ready(function(context) {
            UI.Utils.inlineSvg('[data-uk-svg]', context);
        });

    })({});

    UI.Utils.getCssVar = function(name) {

        /* usage in css:  .var-name:before { content:"xyz" } */

        var val, doc = document.documentElement, element = doc.appendChild(document.createElement('div'));

        element.classList.add('var-'+name);

        try {
            val = JSON.parse(val = getComputedStyle(element, ':before').content.replace(/^["'](.*)["']$/, '$1'));
        } catch (e) {
            val = undefined;
        }

        doc.removeChild(element);

        return val;
    }

})(UIkit2);

(function(UI) {

    "use strict";

    UI.component('smoothScroll', {

        boot: function() {

            // init code
            UI.$html.on('click.smooth-scroll.uikit', '[data-uk-smooth-scroll]', function(e) {
                var ele = UI.$(this);

                if (!ele.data('smoothScroll')) {
                    var obj = UI.smoothScroll(ele, UI.Utils.options(ele.attr('data-uk-smooth-scroll')));
                    ele.trigger('click');
                }

                return false;
            });
        },

        init: function() {

            var $this = this;

            this.on('click', function(e) {
                e.preventDefault();
                scrollToElement(UI.$(this.hash).length ? UI.$(this.hash) : UI.$('body'), $this.options);
            });
        }
    });

    function scrollToElement(ele, options) {

        options = UI.$.extend({
            duration: 1000,
            transition: 'easeOutExpo',
            offset: 0,
            complete: function(){}
        }, options);

        // get / set parameters
        var target    = ele.offset().top - options.offset,
            docheight = UI.$doc.height(),
            winheight = window.innerHeight;

        if ((target + winheight) > docheight) {
            target = docheight - winheight;
        }

        // animate to target, fire callback when done
        UI.$('html,body').stop().animate({scrollTop: target}, options.duration, options.transition).promise().done(options.complete);
    }

    UI.Utils.scrollToElement = scrollToElement;

    if (!UI.$.easing.easeOutExpo) {
        UI.$.easing.easeOutExpo = function(x, t, b, c, d) { return (t == d) ? b + c : c * (-Math.pow(2, -10 * t / d) + 1) + b; };
    }

})(UIkit2);

(function(UI) {

    "use strict";

    var $win           = UI.$win,
        $doc           = UI.$doc,
        scrollspies    = [],
        checkScrollSpy = function() {
            for(var i=0; i < scrollspies.length; i++) {
                window.requestAnimationFrame.apply(window, [scrollspies[i].check]);
            }
        };

    UI.component('scrollspy', {

        defaults: {
            target     : false,
            cls        : 'uk-scrollspy-inview',
            initcls    : 'uk-scrollspy-init-inview',
            topoffset  : 0,
            leftoffset : 0,
            repeat     : false,
            delay      : 0
        },

        boot: function() {

            // listen to scroll and resize
            $doc.on('scrolling.uk.document', checkScrollSpy);
            $win.on('load resize orientationchange', UI.Utils.debounce(checkScrollSpy, 50));

            // init code
            UI.ready(function(context) {

                UI.$('[data-uk-scrollspy]', context).each(function() {

                    var element = UI.$(this);

                    if (!element.data('scrollspy')) {
                        var obj = UI.scrollspy(element, UI.Utils.options(element.attr('data-uk-scrollspy')));
                    }
                });
            });
        },

        init: function() {

            var $this = this, inviewstate, initinview, togglecls = this.options.cls.split(/,/), fn = function(){

                var elements     = $this.options.target ? $this.element.find($this.options.target) : $this.element,
                    delayIdx     = elements.length === 1 ? 1 : 0,
                    toggleclsIdx = 0;

                elements.each(function(idx){

                    var element     = UI.$(this),
                        inviewstate = element.data('inviewstate'),
                        inview      = UI.Utils.isInView(element, $this.options),
                        toggle      = element.attr('data-uk-scrollspy-cls') || togglecls[toggleclsIdx].trim();

                    if (inview && !inviewstate && !element.data('scrollspy-idle')) {

                        if (!initinview) {
                            element.addClass($this.options.initcls);
                            $this.offset = element.offset();
                            initinview = true;

                            element.trigger('init.uk.scrollspy');
                        }

                        element.data('scrollspy-idle', setTimeout(function(){

                            element.addClass('uk-scrollspy-inview').toggleClass(toggle).width();
                            element.trigger('inview.uk.scrollspy');

                            element.data('scrollspy-idle', false);
                            element.data('inviewstate', true);

                        }, $this.options.delay * delayIdx));

                        delayIdx++;
                    }

                    if (!inview && inviewstate && $this.options.repeat) {

                        if (element.data('scrollspy-idle')) {
                            clearTimeout(element.data('scrollspy-idle'));
                            element.data('scrollspy-idle', false);
                        }

                        element.removeClass('uk-scrollspy-inview').toggleClass(toggle);
                        element.data('inviewstate', false);

                        element.trigger('outview.uk.scrollspy');
                    }

                    toggleclsIdx = togglecls[toggleclsIdx + 1] ? (toggleclsIdx + 1) : 0;

                });
            };

            fn();

            this.check = fn;

            scrollspies.push(this);
        }
    });


    var scrollspynavs = [],
        checkScrollSpyNavs = function() {
            for(var i=0; i < scrollspynavs.length; i++) {
                window.requestAnimationFrame.apply(window, [scrollspynavs[i].check]);
            }
        };

    UI.component('scrollspynav', {

        defaults: {
            cls          : 'uk-active',
            closest      : false,
            topoffset    : 0,
            leftoffset   : 0,
            smoothscroll : false
        },

        boot: function() {

            // listen to scroll and resize
            $doc.on('scrolling.uk.document', checkScrollSpyNavs);
            $win.on('resize orientationchange', UI.Utils.debounce(checkScrollSpyNavs, 50));

            // init code
            UI.ready(function(context) {

                UI.$('[data-uk-scrollspy-nav]', context).each(function() {

                    var element = UI.$(this);

                    if (!element.data('scrollspynav')) {
                        var obj = UI.scrollspynav(element, UI.Utils.options(element.attr('data-uk-scrollspy-nav')));
                    }
                });
            });
        },

        init: function() {

            var ids     = [],
                links   = this.find("a[href^='#']").each(function(){ if(this.getAttribute('href').trim()!=='#') ids.push(this.getAttribute('href')); }),
                targets = UI.$(ids.join(",")),

                clsActive  = this.options.cls,
                clsClosest = this.options.closest || this.options.closest;

            var $this = this, inviews, fn = function(){

                inviews = [];

                for (var i=0 ; i < targets.length ; i++) {
                    if (UI.Utils.isInView(targets.eq(i), $this.options)) {
                        inviews.push(targets.eq(i));
                    }
                }

                if (inviews.length) {

                    var navitems,
                        scrollTop = $win.scrollTop(),
                        target = (function(){
                            for(var i=0; i< inviews.length;i++){
                                if (inviews[i].offset().top - $this.options.topoffset >= scrollTop){
                                    return inviews[i];
                                }
                            }
                        })();

                    if (!target) return;

                    if ($this.options.closest) {
                        links.blur().closest(clsClosest).removeClass(clsActive);
                        navitems = links.filter("a[href='#"+target.attr('id')+"']").closest(clsClosest).addClass(clsActive);
                    } else {
                        navitems = links.removeClass(clsActive).filter("a[href='#"+target.attr("id")+"']").addClass(clsActive);
                    }

                    $this.element.trigger('inview.uk.scrollspynav', [target, navitems]);
                }
            };

            if (this.options.smoothscroll && UI.smoothScroll) {
                links.each(function(){
                    UI.smoothScroll(this, $this.options.smoothscroll);
                });
            }

            fn();

            this.element.data('scrollspynav', this);

            this.check = fn;
            scrollspynavs.push(this);

        }
    });

})(UIkit2);

(function(UI){

    "use strict";

    var toggles = [];

    UI.component('toggle', {

        defaults: {
            target    : false,
            cls       : 'uk-hidden',
            animation : false,
            duration  : 200
        },

        boot: function(){

            // init code
            UI.ready(function(context) {

                UI.$('[data-uk-toggle]', context).each(function() {
                    var ele = UI.$(this);

                    if (!ele.data('toggle')) {
                        var obj = UI.toggle(ele, UI.Utils.options(ele.attr('data-uk-toggle')));
                    }
                });

                setTimeout(function(){

                    toggles.forEach(function(toggle){
                        toggle.getToggles();
                    });

                }, 0);
            });
        },

        init: function() {

            var $this = this;

            this.aria = (this.options.cls.indexOf('uk-hidden') !== -1);

            this.on('click', function(e) {

                if ($this.element.is('a[href="#"]')) {
                    e.preventDefault();
                }

                $this.toggle();
            });

            toggles.push(this);
        },

        toggle: function() {

            this.getToggles();

            if(!this.totoggle.length) return;

            if (this.options.animation && UI.support.animation) {

                var $this = this, animations = this.options.animation.split(',');

                if (animations.length == 1) {
                    animations[1] = animations[0];
                }

                animations[0] = animations[0].trim();
                animations[1] = animations[1].trim();

                this.totoggle.css('animation-duration', this.options.duration+'ms');

                this.totoggle.each(function(){

                    var ele = UI.$(this);

                    if (ele.hasClass($this.options.cls)) {

                        ele.toggleClass($this.options.cls);

                        UI.Utils.animate(ele, animations[0]).then(function(){
                            ele.css('animation-duration', '');
                            UI.Utils.checkDisplay(ele);
                        });

                    } else {

                        UI.Utils.animate(this, animations[1]+' uk-animation-reverse').then(function(){
                            ele.toggleClass($this.options.cls).css('animation-duration', '');
                            UI.Utils.checkDisplay(ele);
                        });

                    }

                });

            } else {
                this.totoggle.toggleClass(this.options.cls);
                UI.Utils.checkDisplay(this.totoggle);
            }

            this.updateAria();

        },

        getToggles: function() {
            this.totoggle = this.options.target ? UI.$(this.options.target):[];
            this.updateAria();
        },

        updateAria: function() {
            if (this.aria && this.totoggle.length) {
                this.totoggle.not('[aria-hidden]').each(function(){
                    UI.$(this).attr('aria-hidden', UI.$(this).hasClass('uk-hidden'));
                });
            }
        }
    });

})(UIkit2);

(function(UI) {

    "use strict";

    UI.component('alert', {

        defaults: {
            fade: true,
            duration: 200,
            trigger: '.uk-alert-close'
        },

        boot: function() {

            // init code
            UI.$html.on('click.alert.uikit', '[data-uk-alert]', function(e) {

                var ele = UI.$(this);

                if (!ele.data('alert')) {

                    var alert = UI.alert(ele, UI.Utils.options(ele.attr('data-uk-alert')));

                    if (UI.$(e.target).is(alert.options.trigger)) {
                        e.preventDefault();
                        alert.close();
                    }
                }
            });
        },

        init: function() {

            var $this = this;

            this.on('click', this.options.trigger, function(e) {
                e.preventDefault();
                $this.close();
            });
        },

        close: function() {

            var element       = this.trigger('close.uk.alert'),
                removeElement = function () {
                    this.trigger('closed.uk.alert').remove();
                }.bind(this);

            if (this.options.fade) {
                element.css('overflow', 'hidden').css("max-height", element.height()).animate({
                    height         : 0,
                    opacity        : 0,
                    paddingTop    : 0,
                    paddingBottom : 0,
                    marginTop     : 0,
                    marginBottom  : 0
                }, this.options.duration, removeElement);
            } else {
                removeElement();
            }
        }

    });

})(UIkit2);

(function(UI) {

    "use strict";

    UI.component('buttonRadio', {

        defaults: {
            activeClass: 'uk-active',
            target: '.uk-button'
        },

        boot: function() {

            // init code
            UI.$html.on('click.buttonradio.uikit', '[data-uk-button-radio]', function(e) {

                var ele = UI.$(this);

                if (!ele.data('buttonRadio')) {

                    var obj    = UI.buttonRadio(ele, UI.Utils.options(ele.attr('data-uk-button-radio'))),
                        target = UI.$(e.target);

                    if (target.is(obj.options.target)) {
                        target.trigger('click');
                    }
                }
            });
        },

        init: function() {

            var $this = this;

            // Init ARIA
            this.find($this.options.target).attr('aria-checked', 'false').filter('.' + $this.options.activeClass).attr('aria-checked', 'true');

            this.on('click', this.options.target, function(e) {

                var ele = UI.$(this);

                if (ele.is('a[href="#"]')) e.preventDefault();

                $this.find($this.options.target).not(ele).removeClass($this.options.activeClass).blur();
                ele.addClass($this.options.activeClass);

                // Update ARIA
                $this.find($this.options.target).not(ele).attr('aria-checked', 'false');
                ele.attr('aria-checked', 'true');

                $this.trigger('change.uk.button', [ele]);
            });

        },

        getSelected: function() {
            return this.find('.' + this.options.activeClass);
        }
    });

    UI.component('buttonCheckbox', {

        defaults: {
            activeClass: 'uk-active',
            target: '.uk-button'
        },

        boot: function() {

            UI.$html.on('click.buttoncheckbox.uikit', '[data-uk-button-checkbox]', function(e) {
                var ele = UI.$(this);

                if (!ele.data('buttonCheckbox')) {

                    var obj    = UI.buttonCheckbox(ele, UI.Utils.options(ele.attr('data-uk-button-checkbox'))),
                        target = UI.$(e.target);

                    if (target.is(obj.options.target)) {
                        target.trigger('click');
                    }
                }
            });
        },

        init: function() {

            var $this = this;

            // Init ARIA
            this.find($this.options.target).attr('aria-checked', 'false').filter('.' + $this.options.activeClass).attr('aria-checked', 'true');

            this.on('click', this.options.target, function(e) {
                var ele = UI.$(this);

                if (ele.is('a[href="#"]')) e.preventDefault();

                ele.toggleClass($this.options.activeClass).blur();

                // Update ARIA
                ele.attr('aria-checked', ele.hasClass($this.options.activeClass));

                $this.trigger('change.uk.button', [ele]);
            });

        },

        getSelected: function() {
            return this.find('.' + this.options.activeClass);
        }
    });


    UI.component('button', {

        defaults: {},

        boot: function() {

            UI.$html.on('click.button.uikit', '[data-uk-button]', function(e) {
                var ele = UI.$(this);

                if (!ele.data('button')) {

                    var obj = UI.button(ele, UI.Utils.options(ele.attr('data-uk-button')));
                    ele.trigger('click');
                }
            });
        },

        init: function() {

            var $this = this;

            // Init ARIA
            this.element.attr('aria-pressed', this.element.hasClass("uk-active"));

            this.on('click', function(e) {

                if ($this.element.is('a[href="#"]')) e.preventDefault();

                $this.toggle();
                $this.trigger('change.uk.button', [$this.element.blur().hasClass('uk-active')]);
            });

        },

        toggle: function() {
            this.element.toggleClass('uk-active');

            // Update ARIA
            this.element.attr('aria-pressed', this.element.hasClass('uk-active'));
        }
    });

})(UIkit2);

(function(UI) {

    "use strict";

    var active = false, hoverIdle, flips = {
        x: {
            'bottom-left'   : 'bottom-right',
            'bottom-right'  : 'bottom-left',
            'bottom-center' : 'bottom-center',
            'top-left'      : 'top-right',
            'top-right'     : 'top-left',
            'top-center'    : 'top-center',
            'left-top'      : 'right-top',
            'left-bottom'   : 'right-bottom',
            'left-center'   : 'right-center',
            'right-top'     : 'left-top',
            'right-bottom'  : 'left-bottom',
            'right-center'  : 'left-center'
        },
        y: {
            'bottom-left'   : 'top-left',
            'bottom-right'  : 'top-right',
            'bottom-center' : 'top-center',
            'top-left'      : 'bottom-left',
            'top-right'     : 'bottom-right',
            'top-center'    : 'bottom-center',
            'left-top'      : 'left-bottom',
            'left-bottom'   : 'left-top',
            'left-center'   : 'left-center',
            'right-top'     : 'right-bottom',
            'right-bottom'  : 'right-top',
            'right-center'  : 'right-center'
        },
        xy: {
            'bottom-left'   : 'top-right',
            'bottom-right'  : 'top-left',
            'bottom-center' : 'top-center',
            'top-left'      : 'bottom-right',
            'top-right'     : 'bottom-left',
            'top-center'    : 'bottom-center',
            'left-top'      : 'right-bottom',
            'left-bottom'   : 'right-top',
            'left-center'   : 'right-center',
            'right-top'     : 'left-bottom',
            'right-bottom'  : 'left-top',
            'right-center'  : 'left-center'
        }
    };

    UI.component('dropdown', {

        defaults: {
           mode            : 'hover',
           pos             : 'bottom-left',
           offset          : 0,
           remaintime      : 800,
           justify         : false,
           boundary        : UI.$win,
           delay           : 0,
           dropdownSelector: '.uk-dropdown,.uk-dropdown-blank',
           hoverDelayIdle  : 250,
           preventflip     : false
        },

        remainIdle: false,

        boot: function() {

            var triggerevent = UI.support.touch ? 'click' : 'mouseenter';

            // init code
            UI.$html.on(triggerevent+'.dropdown.uikit focus pointerdown', '[data-uk-dropdown]', function(e) {

                var ele = UI.$(this);

                if (!ele.data('dropdown')) {

                    var dropdown = UI.dropdown(ele, UI.Utils.options(ele.attr('data-uk-dropdown')));

                    if (e.type=='click' || (e.type=='mouseenter' && dropdown.options.mode=='hover')) {
                        dropdown.element.trigger(triggerevent);
                    }

                    if (dropdown.dropdown.length) {
                        e.preventDefault();
                    }
                }
            });
        },

        init: function() {

            var $this = this;

            this.dropdown     = this.find(this.options.dropdownSelector);
            this.offsetParent = this.dropdown.parents().filter(function() {
                return UI.$.inArray(UI.$(this).css('position'), ['relative', 'fixed', 'absolute']) !== -1;
            }).slice(0,1);

            if (!this.offsetParent.length) {
                this.offsetParent = this.element;
            }

            this.centered  = this.dropdown.hasClass('uk-dropdown-center');
            this.justified = this.options.justify ? UI.$(this.options.justify) : false;

            this.boundary  = UI.$(this.options.boundary);

            if (!this.boundary.length) {
                this.boundary = UI.$win;
            }

            // legacy DEPRECATED!
            if (this.dropdown.hasClass('uk-dropdown-up')) {
                this.options.pos = 'top-left';
            }
            if (this.dropdown.hasClass('uk-dropdown-flip')) {
                this.options.pos = this.options.pos.replace('left','right');
            }
            if (this.dropdown.hasClass('uk-dropdown-center')) {
                this.options.pos = this.options.pos.replace(/(left|right)/,'center');
            }
            //-- end legacy

            // Init ARIA
            this.element.attr('aria-haspopup', 'true');
            this.element.attr('aria-expanded', this.element.hasClass('uk-open'));
            this.dropdown.attr('aria-hidden', 'true');

            if (this.options.mode == 'click' || UI.support.touch) {

                this.on('click.uk.dropdown', function(e) {

                    var $target = UI.$(e.target);

                    if (!$target.parents($this.options.dropdownSelector).length) {

                        if ($target.is("a[href='#']") || $target.parent().is("a[href='#']") || ($this.dropdown.length && !$this.dropdown.is(':visible')) ){
                            e.preventDefault();
                        }

                        $target.blur();
                    }

                    if (!$this.element.hasClass('uk-open')) {

                        $this.show();

                    } else {

                        if (!$this.dropdown.find(e.target).length || $target.is('.uk-dropdown-close') || $target.parents('.uk-dropdown-close').length) {
                            $this.hide();
                        }
                    }
                });

            } else {

                this.on('mouseenter', function(e) {

                    $this.trigger('pointerenter.uk.dropdown', [$this]);

                    if ($this.remainIdle) {
                        clearTimeout($this.remainIdle);
                    }

                    if (hoverIdle) {
                        clearTimeout(hoverIdle);
                    }

                    if (active && active == $this) {
                        return;
                    }

                    // pseudo manuAim
                    if (active && active != $this) {

                        hoverIdle = setTimeout(function() {
                            hoverIdle = setTimeout($this.show.bind($this), $this.options.delay);
                        }, $this.options.hoverDelayIdle);

                    } else {

                        hoverIdle = setTimeout($this.show.bind($this), $this.options.delay);
                    }

                }).on('mouseleave', function() {

                    if (hoverIdle) {
                        clearTimeout(hoverIdle);
                    }

                    $this.remainIdle = setTimeout(function() {
                        if (active && active == $this) $this.hide();
                    }, $this.options.remaintime);

                    $this.trigger('pointerleave.uk.dropdown', [$this]);

                }).on('click', function(e){

                    var $target = UI.$(e.target);

                    if ($this.remainIdle) {
                        clearTimeout($this.remainIdle);
                    }

                    if (active && active == $this) {
                        if (!$this.dropdown.find(e.target).length || $target.is('.uk-dropdown-close') || $target.parents('.uk-dropdown-close').length) {
                            $this.hide();
                        }
                        return;
                    }

                    if ($target.is("a[href='#']") || $target.parent().is("a[href='#']")){
                        e.preventDefault();
                    }

                    $this.show();
                });
            }
        },

        show: function(){

            UI.$html.off('click.outer.dropdown');

            if (active && active != this) {
                active.hide(true);
            }

            if (hoverIdle) {
                clearTimeout(hoverIdle);
            }

            this.trigger('beforeshow.uk.dropdown', [this]);

            this.checkDimensions();
            this.element.addClass('uk-open');

            // Update ARIA
            this.element.attr('aria-expanded', 'true');
            this.dropdown.attr('aria-hidden', 'false');

            this.trigger('show.uk.dropdown', [this]);

            UI.Utils.checkDisplay(this.dropdown, true);
            UI.Utils.focus(this.dropdown);
            active = this;

            this.registerOuterClick();
        },

        hide: function(force) {

            this.trigger('beforehide.uk.dropdown', [this, force]);

            this.element.removeClass('uk-open');

            if (this.remainIdle) {
                clearTimeout(this.remainIdle);
            }

            this.remainIdle = false;

            // Update ARIA
            this.element.attr('aria-expanded', 'false');
            this.dropdown.attr('aria-hidden', 'true');

            this.trigger('hide.uk.dropdown', [this, force]);

            if (active == this) active = false;
        },

        registerOuterClick: function(){

            var $this = this;

            UI.$html.off('click.outer.dropdown');

            setTimeout(function() {

                UI.$html.on('click.outer.dropdown', function(e) {

                    if (hoverIdle) {
                        clearTimeout(hoverIdle);
                    }

                    var $target = UI.$(e.target);

                    if (active == $this && !$this.element.find(e.target).length) {
                        $this.hide(true);
                        UI.$html.off('click.outer.dropdown');
                    }
                });
            }, 10);
        },

        checkDimensions: function() {

            if (!this.dropdown.length) return;

            // reset
            this.dropdown.removeClass('uk-dropdown-top uk-dropdown-bottom uk-dropdown-left uk-dropdown-right uk-dropdown-stack uk-dropdown-autoflip').css({
                topLeft :'',
                left :'',
                marginLeft :'',
                marginRight :''
            });

            if (this.justified && this.justified.length) {
                this.dropdown.css('min-width', '');
            }

            var $this          = this,
                pos            = UI.$.extend({}, this.offsetParent.offset(), {width: this.offsetParent[0].offsetWidth, height: this.offsetParent[0].offsetHeight}),
                posoffset      = this.options.offset,
                dropdown       = this.dropdown,
                offset         = dropdown.show().offset() || {left: 0, top: 0},
                width          = dropdown.outerWidth(),
                height         = dropdown.outerHeight(),
                boundarywidth  = this.boundary.width(),
                boundaryoffset = this.boundary[0] !== window && this.boundary.offset() ? this.boundary.offset(): {top:0, left:0},
                dpos           = this.options.pos;

            var variants =  {
                    'bottom-left'   : {top: 0 + pos.height + posoffset, left: 0},
                    'bottom-right'  : {top: 0 + pos.height + posoffset, left: 0 + pos.width - width},
                    'bottom-center' : {top: 0 + pos.height + posoffset, left: 0 + pos.width / 2 - width / 2},
                    'top-left'      : {top: 0 - height - posoffset, left: 0},
                    'top-right'     : {top: 0 - height - posoffset, left: 0 + pos.width - width},
                    'top-center'    : {top: 0 - height - posoffset, left: 0 + pos.width / 2 - width / 2},
                    'left-top'      : {top: 0, left: 0 - width - posoffset},
                    'left-bottom'   : {top: 0 + pos.height - height, left: 0 - width - posoffset},
                    'left-center'   : {top: 0 + pos.height / 2 - height / 2, left: 0 - width - posoffset},
                    'right-top'     : {top: 0, left: 0 + pos.width + posoffset},
                    'right-bottom'  : {top: 0 + pos.height - height, left: 0 + pos.width + posoffset},
                    'right-center'  : {top: 0 + pos.height / 2 - height / 2, left: 0 + pos.width + posoffset}
                },
                css = {},
                pp;

            pp = dpos.split('-');
            css = variants[dpos] ? variants[dpos] : variants['bottom-left'];

            // justify dropdown
            if (this.justified && this.justified.length) {
                justify(dropdown.css({left:0}), this.justified, boundarywidth);
            } else {

                if (this.options.preventflip !== true) {

                    var fdpos;

                    switch(this.checkBoundary(pos.left + css.left, pos.top + css.top, width, height, boundarywidth)) {
                        case "x":
                            if(this.options.preventflip !=='x') fdpos = flips['x'][dpos] || 'right-top';
                            break;
                        case "y":
                            if(this.options.preventflip !=='y') fdpos = flips['y'][dpos] || 'top-left';
                            break;
                        case "xy":
                            if(!this.options.preventflip) fdpos = flips['xy'][dpos] || 'right-bottom';
                            break;
                    }

                    if (fdpos) {

                        pp  = fdpos.split('-');
                        css = variants[fdpos] ? variants[fdpos] : variants['bottom-left'];
                        dropdown.addClass('uk-dropdown-autoflip');

                        // check flipped
                        if (this.checkBoundary(pos.left + css.left, pos.top + css.top, width, height, boundarywidth)) {
                            pp  = dpos.split('-');
                            css = variants[dpos] ? variants[dpos] : variants['bottom-left'];
                        }
                    }
                }
            }

            if (width > boundarywidth) {
                dropdown.addClass('uk-dropdown-stack');
                this.trigger('stack.uk.dropdown', [this]);
            }

            dropdown.css(css).css('display', '').addClass('uk-dropdown-'+pp[0]);
        },

        checkBoundary: function(left, top, width, height, boundarywidth) {

            var axis = "";

            if (left < 0 || ((left - UI.$win.scrollLeft())+width) > boundarywidth) {
               axis += "x";
            }

            if ((top - UI.$win.scrollTop()) < 0 || ((top - UI.$win.scrollTop())+height) > window.innerHeight) {
               axis += "y";
            }

            return axis;
        }
    });


    UI.component('dropdownOverlay', {

        defaults: {
           justify : false,
           cls     : '',
           duration: 200
        },

        boot: function() {

            // init code
            UI.ready(function(context) {

                UI.$('[data-uk-dropdown-overlay]', context).each(function() {
                    var ele = UI.$(this);

                    if (!ele.data('dropdownOverlay')) {
                        UI.dropdownOverlay(ele, UI.Utils.options(ele.attr('data-uk-dropdown-overlay')));
                    }
                });
            });
        },

        init: function() {

            var $this = this;

            this.justified = this.options.justify ? UI.$(this.options.justify) : false;
            this.overlay   = this.element.find('uk-dropdown-overlay');

            if (!this.overlay.length) {
                this.overlay = UI.$('<div class="uk-dropdown-overlay"></div>').appendTo(this.element);
            }

            this.overlay.addClass(this.options.cls);

            this.on({

                'beforeshow.uk.dropdown': function(e, dropdown) {
                    $this.dropdown = dropdown;

                    if ($this.justified && $this.justified.length) {
                        justify($this.overlay.css({display:'block', marginLeft:'', marginRight:''}), $this.justified, $this.justified.outerWidth());
                    }
                },

                'show.uk.dropdown': function(e, dropdown) {

                    var h = $this.dropdown.dropdown.outerHeight(true);

                    $this.dropdown.element.removeClass('uk-open');

                    $this.overlay.stop().css('display', 'block').animate({height: h}, $this.options.duration, function() {

                       $this.dropdown.dropdown.css('visibility', '');
                       $this.dropdown.element.addClass('uk-open');

                       UI.Utils.checkDisplay($this.dropdown.dropdown, true);
                    });

                    $this.pointerleave = false;
                },

                'hide.uk.dropdown': function() {
                    $this.overlay.stop().animate({height: 0}, $this.options.duration);
                },

                'pointerenter.uk.dropdown': function(e, dropdown) {
                    clearTimeout($this.remainIdle);
                },

                'pointerleave.uk.dropdown': function(e, dropdown) {
                    $this.pointerleave = true;
                }
            });


            this.overlay.on({

                'mouseenter': function() {
                    if ($this.remainIdle) {
                        clearTimeout($this.dropdown.remainIdle);
                        clearTimeout($this.remainIdle);
                    }
                },

                'mouseleave': function(){

                    if ($this.pointerleave && active) {

                        $this.remainIdle = setTimeout(function() {
                           if(active) active.hide();
                        }, active.options.remaintime);
                    }
                }
            })
        }

    });


    function justify(ele, justifyTo, boundarywidth, offset) {

        ele           = UI.$(ele);
        justifyTo     = UI.$(justifyTo);
        boundarywidth = boundarywidth || window.innerWidth;
        offset        = offset || ele.offset();

        if (justifyTo.length) {

            var jwidth = justifyTo.outerWidth();

            ele.css('min-width', jwidth);

            if (UI.langdirection == 'right') {

                var right1   = boundarywidth - (justifyTo.offset().left + jwidth),
                    right2   = boundarywidth - (ele.offset().left + ele.outerWidth());

                ele.css('margin-right', right1 - right2);

            } else {
                ele.css('margin-left', justifyTo.offset().left - offset.left);
            }
        }
    }

})(UIkit2);

(function(UI) {

    "use strict";

    var grids = [];

    UI.component('gridMatchHeight', {

        defaults: {
            target        : false,
            row           : true,
            ignorestacked : false,
            observe       : false
        },

        boot: function() {

            // init code
            UI.ready(function(context) {

                UI.$('[data-uk-grid-match]', context).each(function() {
                    var grid = UI.$(this), obj;

                    if (!grid.data('gridMatchHeight')) {
                        obj = UI.gridMatchHeight(grid, UI.Utils.options(grid.attr('data-uk-grid-match')));
                    }
                });
            });
        },

        init: function() {

            var $this = this;

            this.columns  = this.element.children();
            this.elements = this.options.target ? this.find(this.options.target) : this.columns;

            if (!this.columns.length) return;

            UI.$win.on('load resize orientationchange', (function() {

                var fn = function() {
                    if ($this.element.is(':visible')) $this.match();
                };

                UI.$(function() { fn(); });

                return UI.Utils.debounce(fn, 50);
            })());

            if (this.options.observe) {

                UI.domObserve(this.element, function(e) {
                    if ($this.element.is(':visible')) $this.match();
                });
            }

            this.on('display.uk.check', function(e) {
                if(this.element.is(':visible')) this.match();
            }.bind(this));

            grids.push(this);
        },

        match: function() {

            var firstvisible = this.columns.filter(':visible:first');

            if (!firstvisible.length) return;

            var stacked = Math.ceil(100 * parseFloat(firstvisible.css('width')) / parseFloat(firstvisible.parent().css('width'))) >= 100;

            if (stacked && !this.options.ignorestacked) {
                this.revert();
            } else {
                UI.Utils.matchHeights(this.elements, this.options);
            }

            return this;
        },

        revert: function() {
            this.elements.css('min-height', '');
            return this;
        }
    });

    UI.component('gridMargin', {

        defaults: {
            cls      : 'uk-grid-margin',
            rowfirst : 'uk-row-first'
        },

        boot: function() {

            // init code
            UI.ready(function(context) {

                UI.$('[data-uk-grid-margin]', context).each(function() {
                    var grid = UI.$(this), obj;

                    if (!grid.data('gridMargin')) {
                        obj = UI.gridMargin(grid, UI.Utils.options(grid.attr('data-uk-grid-margin')));
                    }
                });
            });
        },

        init: function() {

            var stackMargin = UI.stackMargin(this.element, this.options);
        }
    });

})(UIkit2);

(function(UI) {

    "use strict";

    var active = false, activeCount = 0, $html = UI.$html, body;

    UI.$win.on('resize orientationchange', UI.Utils.debounce(function(){
        UI.$('.uk-modal.uk-open').each(function(){
            return UI.$(this).data('modal') && UI.$(this).data('modal').resize();
        });
    }, 150));

    UI.component('modal', {

        defaults: {
            keyboard: true,
            bgclose: true,
            minScrollHeight: 150,
            center: false,
            modal: true
        },

        scrollable: false,
        transition: false,
        hasTransitioned: true,

        init: function() {

            if (!body) body = UI.$('body');

            if (!this.element.length) return;

            var $this = this;

            this.paddingdir = 'padding-' + (UI.langdirection == 'left' ? 'right':'left');
            this.dialog     = this.find('.uk-modal-dialog');

            this.active     = false;

            // Update ARIA
            this.element.attr('aria-hidden', this.element.hasClass('uk-open'));

            this.on('click', '.uk-modal-close', function(e) {
                e.preventDefault();
                $this.hide();
            }).on('click', function(e) {

                var target = UI.$(e.target);

                if (target[0] == $this.element[0] && $this.options.bgclose) {
                    $this.hide();
                }
            });

            UI.domObserve(this.element, function(e) { $this.resize(); });
        },

        toggle: function() {
            return this[this.isActive() ? 'hide' : 'show']();
        },

        show: function() {

            if (!this.element.length) return;

            var $this = this;

            if (this.isActive()) return;

            if (this.options.modal && active) {
                active.hide(true);
            }

            this.element.removeClass('uk-open').show();
            this.resize(true);

            if (this.options.modal) {
                active = this;
            }

            this.active = true;

            activeCount++;

            if (UI.support.transition) {
                this.hasTransitioned = false;
                this.element.one(UI.support.transition.end, function(){
                    $this.hasTransitioned = true;
                    UI.Utils.focus($this.dialog, 'a[href]');
                }).addClass('uk-open');
            } else {
                this.element.addClass('uk-open');
                UI.Utils.focus(this.dialog, 'a[href]');
            }

            $html.addClass('uk-modal-page').height(); // force browser engine redraw

            // Update ARIA
            this.element.attr('aria-hidden', 'false');

            this.element.trigger('show.uk.modal');

            UI.Utils.checkDisplay(this.dialog, true);

            return this;
        },

        hide: function(force) {

            if (!force && UI.support.transition && this.hasTransitioned) {

                var $this = this;

                this.one(UI.support.transition.end, function() {
                    $this._hide();
                }).removeClass('uk-open');

            } else {

                this._hide();
            }

            return this;
        },

        resize: function(force) {

            if (!this.isActive() && !force) return;

            var bodywidth  = body.width();

            this.scrollbarwidth = window.innerWidth - bodywidth;

            body.css(this.paddingdir, this.scrollbarwidth);

            this.element.css('overflow-y', this.scrollbarwidth ? 'scroll' : 'auto');

            if (!this.updateScrollable() && this.options.center) {

                var dh  = this.dialog.outerHeight(),
                pad = parseInt(this.dialog.css('margin-top'), 10) + parseInt(this.dialog.css('margin-bottom'), 10);

                if ((dh + pad) < window.innerHeight) {
                    this.dialog.css({top: (window.innerHeight/2 - dh/2) - pad });
                } else {
                    this.dialog.css({top: ''});
                }
            }
        },

        updateScrollable: function() {

            // has scrollable?
            var scrollable = this.dialog.find('.uk-overflow-container:visible:first');

            if (scrollable.length) {

                scrollable.css('height', 0);

                var offset = Math.abs(parseInt(this.dialog.css('margin-top'), 10)),
                dh     = this.dialog.outerHeight(),
                wh     = window.innerHeight,
                h      = wh - 2*(offset < 20 ? 20:offset) - dh;

                scrollable.css({
                    maxHeight: (h < this.options.minScrollHeight ? '':h),
                    height:''
                });

                return true;
            }

            return false;
        },

        _hide: function() {

            this.active = false;
            if (activeCount > 0) activeCount--;
            else activeCount = 0;

            this.element.hide().removeClass('uk-open');

            // Update ARIA
            this.element.attr('aria-hidden', 'true');

            if (!activeCount) {
                $html.removeClass('uk-modal-page');
                body.css(this.paddingdir, "");
            }

            if (active===this) active = false;

            this.trigger('hide.uk.modal');
        },

        isActive: function() {
            return this.element.hasClass('uk-open');
        }

    });

    UI.component('modalTrigger', {

        boot: function() {

            // init code
            UI.$html.on('click.modal.uikit', '[data-uk-modal]', function(e) {

                var ele = UI.$(this);

                if (ele.is('a')) {
                    e.preventDefault();
                }

                if (!ele.data('modalTrigger')) {
                    var modal = UI.modalTrigger(ele, UI.Utils.options(ele.attr('data-uk-modal')));
                    modal.show();
                }

            });

            // close modal on esc button
            UI.$html.on('keydown.modal.uikit', function (e) {

                if (active && e.keyCode === 27 && active.options.keyboard) { // ESC
                    e.preventDefault();
                    active.hide();
                }
            });
        },

        init: function() {

            var $this = this;

            this.options = UI.$.extend({
                target: $this.element.is('a') ? $this.element.attr('href') : false
            }, this.options);

            this.modal = UI.modal(this.options.target, this.options);

            this.on("click", function(e) {
                e.preventDefault();
                $this.show();
            });

            //methods
            this.proxy(this.modal, 'show hide isActive');
        }
    });

    UI.modal.dialog = function(content, options) {

        var modal = UI.modal(UI.$(UI.modal.dialog.template).appendTo('body'), options);

        modal.on('hide.uk.modal', function(){
            if (modal.persist) {
                modal.persist.appendTo(modal.persist.data('modalPersistParent'));
                modal.persist = false;
            }
            modal.element.remove();
        });

        setContent(content, modal);

        return modal;
    };

    UI.modal.dialog.template = '<div class="uk-modal"><div class="uk-modal-dialog" style="min-height:0;"></div></div>';

    UI.modal.alert = function(content, options) {

        options = UI.$.extend(true, {bgclose:false, keyboard:false, modal:false, labels:UI.modal.labels}, options);

        var modal = UI.modal.dialog(([
            '<div class="uk-margin uk-modal-content">'+String(content)+'</div>',
            '<div class="uk-modal-footer uk-text-right"><button class="uk-button uk-button-primary uk-modal-close">'+options.labels.Ok+'</button></div>'
        ]).join(""), options);

        modal.on('show.uk.modal', function(){
            setTimeout(function(){
                modal.element.find('button:first').focus();
            }, 50);
        });

        return modal.show();
    };

    UI.modal.confirm = function(content, onconfirm, oncancel) {

        var options = arguments.length > 1 && arguments[arguments.length-1] ? arguments[arguments.length-1] : {};

        onconfirm = UI.$.isFunction(onconfirm) ? onconfirm : function(){};
        oncancel  = UI.$.isFunction(oncancel) ? oncancel : function(){};
        options   = UI.$.extend(true, {bgclose:false, keyboard:false, modal:false, labels:UI.modal.labels}, UI.$.isFunction(options) ? {}:options);

        var modal = UI.modal.dialog(([
            '<div class="uk-margin uk-modal-content">'+String(content)+'</div>',
            '<div class="uk-modal-footer uk-text-right"><button class="uk-button js-modal-confirm-cancel">'+options.labels.Cancel+'</button> <button class="uk-button uk-button-primary js-modal-confirm">'+options.labels.Ok+'</button></div>'
        ]).join(""), options);

        modal.element.find(".js-modal-confirm, .js-modal-confirm-cancel").on("click", function(){
            UI.$(this).is('.js-modal-confirm') ? onconfirm() : oncancel();
            modal.hide();
        });

        modal.on('show.uk.modal', function(){
            setTimeout(function(){
                modal.element.find('.js-modal-confirm').focus();
            }, 50);
        });

        return modal.show();
    };

    UI.modal.prompt = function(text, value, onsubmit, options) {

        onsubmit = UI.$.isFunction(onsubmit) ? onsubmit : function(value){};
        options  = UI.$.extend(true, {bgclose:false, keyboard:false, modal:false, labels:UI.modal.labels}, options);

        var modal = UI.modal.dialog(([
            text ? '<div class="uk-modal-content uk-form">'+String(text)+'</div>':'',
            '<div class="uk-margin-small-top uk-modal-content uk-form"><p><input type="text" class="uk-width-1-1"></p></div>',
            '<div class="uk-modal-footer uk-text-right"><button class="uk-button uk-modal-close">'+options.labels.Cancel+'</button> <button class="uk-button uk-button-primary js-modal-ok">'+options.labels.Ok+'</button></div>'
        ]).join(""), options),

        input = modal.element.find("input[type='text']").val(value || '').on('keyup', function(e){
            if (e.keyCode == 13) {
                modal.element.find('.js-modal-ok').trigger('click');
            }
        });

        modal.element.find('.js-modal-ok').on('click', function(){
            if (onsubmit(input.val())!==false){
                modal.hide();
            }
        });

        return modal.show();
    };

    UI.modal.blockUI = function(content, options) {

        var modal = UI.modal.dialog(([
            '<div class="uk-margin uk-modal-content">'+String(content || '<div class="uk-text-center">...</div>')+'</div>'
        ]).join(""), UI.$.extend({bgclose:false, keyboard:false, modal:false}, options));

        modal.content = modal.element.find('.uk-modal-content:first');

        return modal.show();
    };

    UI.modal.labels = {
        Ok: 'Ok',
        Cancel: 'Cancel'
    };

    // helper functions
    function setContent(content, modal){

        if(!modal) return;

        if (typeof content === 'object') {

            // convert DOM object to a jQuery object
            content = content instanceof jQuery ? content : UI.$(content);

            if(content.parent().length) {
                modal.persist = content;
                modal.persist.data('modalPersistParent', content.parent());
            }
        }else if (typeof content === 'string' || typeof content === 'number') {
                // just insert the data as innerHTML
                content = UI.$('<div></div>').html(content);
        }else {
                // unsupported data type!
                content = UI.$('<div></div>').html('UIkit2.modal Error: Unsupported data type: ' + typeof content);
        }

        content.appendTo(modal.element.find('.uk-modal-dialog'));

        return modal;
    }

})(UIkit2);

(function(UI) {

    "use strict";

    UI.component('nav', {

        defaults: {
            toggle: '>li.uk-parent > a[href="#"]',
            lists: '>li.uk-parent > ul',
            multiple: false
        },

        boot: function() {

            // init code
            UI.ready(function(context) {

                UI.$('[data-uk-nav]', context).each(function() {
                    var nav = UI.$(this);

                    if (!nav.data('nav')) {
                        var obj = UI.nav(nav, UI.Utils.options(nav.attr('data-uk-nav')));
                    }
                });
            });
        },

        init: function() {

            var $this = this;

            this.on('click.uk.nav', this.options.toggle, function(e) {
                e.preventDefault();
                var ele = UI.$(this);
                $this.open(ele.parent()[0] == $this.element[0] ? ele : ele.parent("li"));
            });

            this.update();

            UI.domObserve(this.element, function(e) {
                if ($this.element.find($this.options.lists).not('[role]').length) {
                    $this.update();
                }
            });
        },

        update: function() {

            var $this = this;

            this.find(this.options.lists).each(function() {

                var $ele   = UI.$(this).attr('role', 'menu'),
                    parent = $ele.closest('li'),
                    active = parent.hasClass("uk-active");

                if (!parent.data('list-container')) {
                    $ele.wrap('<div style="overflow:hidden;height:0;position:relative;"></div>');
                    parent.data('list-container', $ele.parent()[active ? 'removeClass':'addClass']('uk-hidden'));
                }

                // Init ARIA
                parent.attr('aria-expanded', parent.hasClass("uk-open"));

                if (active) $this.open(parent, true);
            });
        },

        open: function(li, noanimation) {

            var $this = this, element = this.element, $li = UI.$(li), $container = $li.data('list-container');

            if (!this.options.multiple) {

                element.children('.uk-open').not(li).each(function() {

                    var ele = UI.$(this);

                    if (ele.data('list-container')) {
                        ele.data('list-container').stop().animate({height: 0}, function() {
                            UI.$(this).parent().removeClass('uk-open').end().addClass('uk-hidden');
                        });
                    }
                });
            }

            $li.toggleClass('uk-open');

            // Update ARIA
            $li.attr('aria-expanded', $li.hasClass('uk-open'));

            if ($container) {

                if ($li.hasClass('uk-open')) {
                    $container.removeClass('uk-hidden');
                }

                if (noanimation) {

                    $container.stop().height($li.hasClass('uk-open') ? 'auto' : 0);

                    if (!$li.hasClass('uk-open')) {
                        $container.addClass('uk-hidden');
                    }

                    this.trigger('display.uk.check');

                } else {

                    $container.stop().animate({
                        height: ($li.hasClass('uk-open') ? getHeight($container.find('ul:first')) : 0)
                    }, function() {

                        if (!$li.hasClass('uk-open')) {
                            $container.addClass('uk-hidden');
                        } else {
                            $container.css('height', '');
                        }

                        $this.trigger('display.uk.check');
                    });
                }
            }
        }
    });


    // helper

    function getHeight(ele) {

        var $ele = UI.$(ele), height = 'auto';

        if ($ele.is(':visible')) {
            height = $ele.outerHeight();
        } else {

            var tmp = {
                position: $ele.css('position'),
                visibility: $ele.css('visibility'),
                display: $ele.css('display')
            };

            height = $ele.css({position: 'absolute', visibility: 'hidden', display: 'block'}).outerHeight();

            $ele.css(tmp); // reset element
        }

        return height;
    }

})(UIkit2);

(function(UI) {

    "use strict";

    var scrollpos = {x: window.scrollX, y: window.scrollY},
        $win      = UI.$win,
        $doc      = UI.$doc,
        $html     = UI.$html,
        Offcanvas = {

        show: function(element, options) {

            element = UI.$(element);

            if (!element.length) return;

            options = UI.$.extend({mode: 'push'}, options);

            var $body     = UI.$('body'),
                bar       = element.find('.uk-offcanvas-bar:first'),
                rtl       = (UI.langdirection == 'right'),
                flip      = bar.hasClass('uk-offcanvas-bar-flip') ? -1:1,
                dir       = flip * (rtl ? -1 : 1),

                scrollbarwidth =  window.innerWidth - $body.width();

            scrollpos = {x: window.pageXOffset, y: window.pageYOffset};

            bar.attr('mode', options.mode);
            element.addClass('uk-active');

            $body.css({width: window.innerWidth - scrollbarwidth, height: window.innerHeight}).addClass('uk-offcanvas-page');

            if (options.mode == 'push' || options.mode == 'reveal') {
                $body.css((rtl ? 'margin-right' : 'margin-left'), (rtl ? -1 : 1) * (bar.outerWidth() * dir));
            }

            if (options.mode == 'reveal') {
                bar.css('clip', 'rect(0, '+bar.outerWidth()+'px, 100vh, 0)');
            }

            $html.css('margin-top', scrollpos.y * -1).width(); // .width() - force redraw


            bar.addClass('uk-offcanvas-bar-show');

            this._initElement(element);

            bar.trigger('show.uk.offcanvas', [element, bar]);

            // Update ARIA
            element.attr('aria-hidden', 'false');
        },

        hide: function(force) {

            var $body = UI.$('body'),
                panel = UI.$('.uk-offcanvas.uk-active'),
                rtl   = (UI.langdirection == 'right'),
                bar   = panel.find('.uk-offcanvas-bar:first'),
                finalize = function() {
                    $body.removeClass('uk-offcanvas-page').css({width: '', height: '', marginLeft: '', marginRight: ''});
                    panel.removeClass('uk-active');

                    bar.removeClass('uk-offcanvas-bar-show');
                    $html.css('margin-top', '');
                    window.scrollTo(scrollpos.x, scrollpos.y);
                    bar.trigger('hide.uk.offcanvas', [panel, bar]);

                    // Update ARIA
                    panel.attr('aria-hidden', 'true');
                };

            if (!panel.length) return;
            if (bar.attr('mode') == 'none') force = true;

            if (UI.support.transition && !force) {

                $body.one(UI.support.transition.end, function() {
                    finalize();
                }).css((rtl ? 'margin-right' : 'margin-left'), '');

                if (bar.attr('mode') == 'reveal') {
                    bar.css('clip', '');
                }

                setTimeout(function(){
                    bar.removeClass('uk-offcanvas-bar-show');
                }, 0);

            } else {
                finalize();
            }
        },

        _initElement: function(element) {

            if (element.data('OffcanvasInit')) return;

            element.on('click.uk.offcanvas swipeRight.uk.offcanvas swipeLeft.uk.offcanvas', function(e) {

                var target = UI.$(e.target);

                if (!e.type.match(/swipe/)) {

                    if (!target.hasClass('uk-offcanvas-close')) {
                        if (target.hasClass('uk-offcanvas-bar')) return;
                        if (target.parents('.uk-offcanvas-bar:first').length) return;
                    }
                }

                e.stopImmediatePropagation();
                Offcanvas.hide();
            });

            element.on('click', 'a[href*="#"]', function(e){

                var link = UI.$(this),
                    href = link.attr('href');

                if (href == '#') {
                    return;
                }

                UI.$doc.one('hide.uk.offcanvas', function() {

                    var target;

                    try {
                        target = UI.$(link[0].hash);
                    } catch (e){
                        target = '';
                    }

                    if (!target.length) {
                        target = UI.$('[name="'+link[0].hash.replace('#','')+'"]');
                    }

                    if (target.length && UI.Utils.scrollToElement) {
                        UI.Utils.scrollToElement(target, UI.Utils.options(link.attr('data-uk-smooth-scroll') || '{}'));
                    } else {
                        window.location.href = href;
                    }
                });

                Offcanvas.hide();
            });

            element.data('OffcanvasInit', true);
        }
    };

    UI.component('offcanvasTrigger', {

        boot: function() {

            // init code
            $html.on('click.offcanvas.uikit', '[data-uk-offcanvas]', function(e) {

                e.preventDefault();

                var ele = UI.$(this);

                if (!ele.data('offcanvasTrigger')) {
                    var obj = UI.offcanvasTrigger(ele, UI.Utils.options(ele.attr('data-uk-offcanvas')));
                    ele.trigger("click");
                }
            });

            $html.on('keydown.uk.offcanvas', function(e) {

                if (e.keyCode === 27) { // ESC
                    Offcanvas.hide();
                }
            });
        },

        init: function() {

            var $this = this;

            this.options = UI.$.extend({
                target: $this.element.is('a') ? $this.element.attr('href') : false,
                mode: 'push'
            }, this.options);

            this.on('click', function(e) {
                e.preventDefault();
                Offcanvas.show($this.options.target, $this.options);
            });
        }
    });

    UI.offcanvas = Offcanvas;

})(UIkit2);

(function(UI) {

    "use strict";

    var Animations;

    UI.component('switcher', {

        defaults: {
            connect   : false,
            toggle    : '>*',
            active    : 0,
            animation : false,
            duration  : 200,
            swiping   : true
        },

        animating: false,

        boot: function() {

            // init code
            UI.ready(function(context) {

                UI.$('[data-uk-switcher]', context).each(function() {
                    var switcher = UI.$(this);

                    if (!switcher.data('switcher')) {
                        var obj = UI.switcher(switcher, UI.Utils.options(switcher.attr('data-uk-switcher')));
                    }
                });
            });
        },

        init: function() {

            var $this = this;

            this.on('click.uk.switcher', this.options.toggle, function(e) {
                e.preventDefault();
                $this.show(this);
            });

            if (!this.options.connect) {
                return;
            }

            this.connect = UI.$(this.options.connect);

            if (!this.connect.length) {
                return;
            }

            this.connect.on('click.uk.switcher', '[data-uk-switcher-item]', function(e) {

                e.preventDefault();

                var item = UI.$(this).attr('data-uk-switcher-item');

                if ($this.index == item) return;

                switch(item) {
                    case 'next':
                    case 'previous':
                        $this.show($this.index + (item=='next' ? 1:-1));
                        break;
                    default:
                        $this.show(parseInt(item, 10));
                }
            });

            if (this.options.swiping) {

                this.connect.on('swipeRight swipeLeft', function(e) {
                    e.preventDefault();
                    if (!window.getSelection().toString()) {
                        $this.show($this.index + (e.type == 'swipeLeft' ? 1 : -1));
                    }
                });
            }

            this.update();
        },

        update: function() {

            this.connect.children().removeClass('uk-active').attr('aria-hidden', 'true');

            var toggles = this.find(this.options.toggle),
                active  = toggles.filter('.uk-active');

            if (active.length) {
                this.show(active, false);
            } else {

                if (this.options.active===false) return;

                active = toggles.eq(this.options.active);
                this.show(active.length ? active : toggles.eq(0), false);
            }

            // Init ARIA for toggles
            toggles.not(active).attr('aria-expanded', 'false');
            active.attr('aria-expanded', 'true');
        },

        show: function(tab, animate) {

            if (this.animating) {
                return;
            }

            var toggles = this.find(this.options.toggle);

            if (isNaN(tab)) {
                tab = UI.$(tab);
            } else {
                tab = tab < 0 ? toggles.length-1 : tab;
                tab = toggles.eq(toggles[tab] ? tab : 0);
            }

            var $this     = this,
                active    = UI.$(tab),
                animation = Animations[this.options.animation] || function(current, next) {

                    if (!$this.options.animation) {
                        return Animations.none.apply($this);
                    }

                    var anim = $this.options.animation.split(',');

                    if (anim.length == 1) {
                        anim[1] = anim[0];
                    }

                    anim[0] = anim[0].trim();
                    anim[1] = anim[1].trim();

                    return coreAnimation.apply($this, [anim, current, next]);
                };

            if (animate===false || !UI.support.animation) {
                animation = Animations.none;
            }

            if (active.hasClass("uk-disabled")) return;

            // Update ARIA for Toggles
            toggles.attr('aria-expanded', 'false');
            active.attr('aria-expanded', 'true');

            toggles.filter(".uk-active").removeClass("uk-active");
            active.addClass("uk-active");

            if (this.options.connect && this.connect.length) {

                this.index = this.find(this.options.toggle).index(active);

                if (this.index == -1 ) {
                    this.index = 0;
                }

                this.connect.each(function() {

                    var container = UI.$(this),
                        children  = UI.$(container.children()),
                        current   = UI.$(children.filter('.uk-active')),
                        next      = UI.$(children.eq($this.index));

                        $this.animating = true;

                        animation.apply($this, [current, next]).then(function(){

                            current.removeClass("uk-active");
                            next.addClass("uk-active");

                            // Update ARIA for connect
                            current.attr('aria-hidden', 'true');
                            next.attr('aria-hidden', 'false');

                            UI.Utils.checkDisplay(next, true);

                            $this.animating = false;

                        });
                });
            }

            this.trigger("show.uk.switcher", [active]);
        }
    });

    Animations = {

        'none': function() {
            var d = UI.$.Deferred();
            d.resolve();
            return d.promise();
        },

        'fade': function(current, next) {
            return coreAnimation.apply(this, ['uk-animation-fade', current, next]);
        },

        'slide-bottom': function(current, next) {
            return coreAnimation.apply(this, ['uk-animation-slide-bottom', current, next]);
        },

        'slide-top': function(current, next) {
            return coreAnimation.apply(this, ['uk-animation-slide-top', current, next]);
        },

        'slide-vertical': function(current, next, dir) {

            var anim = ['uk-animation-slide-top', 'uk-animation-slide-bottom'];

            if (current && current.index() > next.index()) {
                anim.reverse();
            }

            return coreAnimation.apply(this, [anim, current, next]);
        },

        'slide-left': function(current, next) {
            return coreAnimation.apply(this, ['uk-animation-slide-left', current, next]);
        },

        'slide-right': function(current, next) {
            return coreAnimation.apply(this, ['uk-animation-slide-right', current, next]);
        },

        'slide-horizontal': function(current, next, dir) {

            var anim = ['uk-animation-slide-right', 'uk-animation-slide-left'];

            if (current && current.index() > next.index()) {
                anim.reverse();
            }

            return coreAnimation.apply(this, [anim, current, next]);
        },

        'scale': function(current, next) {
            return coreAnimation.apply(this, ['uk-animation-scale-up', current, next]);
        }
    };

    UI.switcher.animations = Animations;


    // helpers

    function coreAnimation(cls, current, next) {

        var d = UI.$.Deferred(), clsIn = cls, clsOut = cls, release;

        if (next[0]===current[0]) {
            d.resolve();
            return d.promise();
        }

        if (typeof(cls) == 'object') {
            clsIn  = cls[0];
            clsOut = cls[1] || cls[0];
        }

        UI.$body.css('overflow-x', 'hidden'); // fix scroll jumping in iOS

        release = function() {

            if (current) current.hide().removeClass('uk-active '+clsOut+' uk-animation-reverse');

            next.addClass(clsIn).one(UI.support.animation.end, function() {

                setTimeout(function () {
                    next.removeClass(''+clsIn+'').css({opacity:'', display:''});
                }, 0);

                d.resolve();

                UI.$body.css('overflow-x', '');

                if (current) current.css({opacity:'', display:''});

            }.bind(this)).show();
        };

        next.css('animation-duration', this.options.duration+'ms');

        if (current && current.length) {

            current.css('animation-duration', this.options.duration+'ms');

            current.css('display', 'none').addClass(clsOut+' uk-animation-reverse').one(UI.support.animation.end, function() {
                release();
            }.bind(this)).css('display', '');

        } else {
            next.addClass('uk-active');
            release();
        }

        return d.promise();
    }

})(UIkit2);

(function(UI) {

    "use strict";

    UI.component('tab', {

        defaults: {
            target    : '>li:not(.uk-tab-responsive, .uk-disabled)',
            connect   : false,
            active    : 0,
            animation : false,
            duration  : 200,
            swiping   : true
        },

        boot: function() {

            // init code
            UI.ready(function(context) {

                UI.$('[data-uk-tab]', context).each(function() {

                    var tab = UI.$(this);

                    if (!tab.data('tab')) {
                        var obj = UI.tab(tab, UI.Utils.options(tab.attr('data-uk-tab')));
                    }
                });
            });
        },

        init: function() {

            var $this = this;

            this.current = false;

            this.on('click.uk.tab', this.options.target, function(e) {

                e.preventDefault();

                if ($this.switcher && $this.switcher.animating) {
                    return;
                }

                var current = $this.find($this.options.target).not(this);

                current.removeClass('uk-active').blur();

                $this.trigger('change.uk.tab', [UI.$(this).addClass('uk-active'), $this.current]);

                $this.current = UI.$(this);

                // Update ARIA
                if (!$this.options.connect) {
                    current.attr('aria-expanded', 'false');
                    UI.$(this).attr('aria-expanded', 'true');
                }
            });

            if (this.options.connect) {
                this.connect = UI.$(this.options.connect);
            }

            // init responsive tab
            this.responsivetab = UI.$('<li class="uk-tab-responsive uk-active"><a></a></li>').append('<div class="uk-dropdown uk-dropdown-small"><ul class="uk-nav uk-nav-dropdown"></ul><div>');

            this.responsivetab.dropdown = this.responsivetab.find('.uk-dropdown');
            this.responsivetab.lst      = this.responsivetab.dropdown.find('ul');
            this.responsivetab.caption  = this.responsivetab.find('a:first');

            if (this.element.hasClass('uk-tab-bottom')) this.responsivetab.dropdown.addClass('uk-dropdown-up');

            // handle click
            this.responsivetab.lst.on('click.uk.tab', 'a', function(e) {

                e.preventDefault();
                e.stopPropagation();

                var link = UI.$(this);

                $this.element.children('li:not(.uk-tab-responsive)').eq(link.data('index')).trigger('click');
            });

            this.on('show.uk.switcher change.uk.tab', function(e, tab) {
                $this.responsivetab.caption.html(tab.text());
            });

            this.element.append(this.responsivetab);

            // init UIkit components
            if (this.options.connect) {

                this.switcher = UI.switcher(this.element, {
                    toggle    : '>li:not(.uk-tab-responsive)',
                    connect   : this.options.connect,
                    active    : this.options.active,
                    animation : this.options.animation,
                    duration  : this.options.duration,
                    swiping   : this.options.swiping
                });
            }

            UI.dropdown(this.responsivetab, {mode: 'click', preventflip: 'y'});

            // init
            $this.trigger('change.uk.tab', [this.element.find(this.options.target).not('.uk-tab-responsive').filter('.uk-active')]);

            this.check();

            UI.$win.on('resize orientationchange', UI.Utils.debounce(function(){
                if ($this.element.is(':visible'))  $this.check();
            }, 100));

            this.on('display.uk.check', function(){
                if ($this.element.is(':visible'))  $this.check();
            });
        },

        check: function() {

            var children = this.element.children('li:not(.uk-tab-responsive)').removeClass('uk-hidden');

            if (!children.length) {
                this.responsivetab.addClass('uk-hidden');
                return;
            }

            var top          = (children.eq(0).offset().top + Math.ceil(children.eq(0).height()/2)),
                doresponsive = false,
                item, link, clone;

            this.responsivetab.lst.empty();

            children.each(function(){

                if (UI.$(this).offset().top > top) {
                    doresponsive = true;
                }
            });

            if (doresponsive) {

                for (var i = 0; i < children.length; i++) {

                    item  = UI.$(children.eq(i));
                    link  = item.find('a');

                    if (item.css('float') != 'none' && !item.attr('uk-dropdown')) {

                        if (!item.hasClass('uk-disabled')) {

                            clone = UI.$(item[0].outerHTML);
                            clone.find('a').data('index', i);

                            this.responsivetab.lst.append(clone);
                        }

                        item.addClass('uk-hidden');
                    }
                }
            }

            this.responsivetab[this.responsivetab.lst.children('li').length ? 'removeClass':'addClass']('uk-hidden');
        }
    });

})(UIkit2);

(function(UI){

    "use strict";

    UI.component('cover', {

        defaults: {
            automute : true
        },

        boot: function() {

            // auto init
            UI.ready(function(context) {

                UI.$('[data-uk-cover]', context).each(function(){

                    var ele = UI.$(this);

                    if(!ele.data('cover')) {
                        var plugin = UI.cover(ele, UI.Utils.options(ele.attr('data-uk-cover')));
                    }
                });
            });
        },

        init: function() {

            this.parent = this.element.parent();

            UI.$win.on('load resize orientationchange', UI.Utils.debounce(function(){
                this.check();
            }.bind(this), 100));

            this.on('display.uk.check', function(e) {
                if (this.element.is(':visible')) this.check();
            }.bind(this));

            this.check();

            if (this.element.is('iframe') && this.options.automute) {

                var src = this.element.attr('src');

                this.element.attr('src', '').on('load', function(){
                    this.contentWindow.postMessage('{ "event": "command", "func": "mute", "method":"setVolume", "value":0}', '*');
                }).attr('src', [src, (src.indexOf('?') > -1 ? '&':'?'), 'enablejsapi=1&api=1'].join(''));
            }
        },

        check: function() {

            this.element.css({ width  : '', height : '' });

            this.dimension = {w: this.element.width(), h: this.element.height()};

            if (this.element.attr('width') && !isNaN(this.element.attr('width'))) {
                this.dimension.w = this.element.attr('width');
            }

            if (this.element.attr('height') && !isNaN(this.element.attr('height'))) {
                this.dimension.h = this.element.attr('height');
            }

            this.ratio = this.dimension.w / this.dimension.h;

            var w = this.parent.width(), h = this.parent.height(), width, height;

            // if element height < parent height (gap underneath)
            if ((w / this.ratio) < h) {

                width  = Math.ceil(h * this.ratio);
                height = h;

            // element width < parent width (gap to right)
            } else {

                width  = w;
                height = Math.ceil(w / this.ratio);
            }

            this.element.css({ width  : width, height : height });
        }
    });

})(UIkit2);

},{}],"/Sites/kisk-mennekes-www-20151019-relaunch-frontend/patternlab/source/js/app.js":[function(require,module,exports){
window.$ = window.jQuery = require('jquery');

// vendor
require('svg4everybody')();
require('uikit');

// require('./vendor/uikit/uikit.min');
require('./vendor/uikit/modal.min');
require('./vendor/uikit/lightbox.min');
require('./vendor/uikit/accordion.min');
require('./vendor/uikit/slider.min');
require('./vendor/uikit/slideset.min');
require('./vendor/uikit/slideshow.min');
require('./vendor/uikit/sticky.min');
require('./vendor/uikit/tooltip.min');

require('./vendor/owl.carousel');
require('./vendor/select2.min');
require('./vendor/picturefill.min');

// modules
require('./components/changer');
require('./components/slideshow');
require('./components/video');
require('./components/filter-accordion');
require('./components/sticky-header');
require('./components/sticky-submenu');
require('./components/smooth-scroll');
require('./components/clearable-input');
require('./components/OwlControl');
require('./components/events');
require('./components/formhandler');
require('./components/sharer');
require('./components/table');
require('./components/toggle-download-button');
require('./components/masonry-layout');

// don't upload!
// require('./vendor/configurator');


// needs refactor
require('./shame');

},{"./components/OwlControl":"/Sites/kisk-mennekes-www-20151019-relaunch-frontend/patternlab/source/js/components/OwlControl.js","./components/changer":"/Sites/kisk-mennekes-www-20151019-relaunch-frontend/patternlab/source/js/components/changer.js","./components/clearable-input":"/Sites/kisk-mennekes-www-20151019-relaunch-frontend/patternlab/source/js/components/clearable-input.js","./components/events":"/Sites/kisk-mennekes-www-20151019-relaunch-frontend/patternlab/source/js/components/events.js","./components/filter-accordion":"/Sites/kisk-mennekes-www-20151019-relaunch-frontend/patternlab/source/js/components/filter-accordion.js","./components/formhandler":"/Sites/kisk-mennekes-www-20151019-relaunch-frontend/patternlab/source/js/components/formhandler.js","./components/masonry-layout":"/Sites/kisk-mennekes-www-20151019-relaunch-frontend/patternlab/source/js/components/masonry-layout.js","./components/sharer":"/Sites/kisk-mennekes-www-20151019-relaunch-frontend/patternlab/source/js/components/sharer.js","./components/slideshow":"/Sites/kisk-mennekes-www-20151019-relaunch-frontend/patternlab/source/js/components/slideshow.js","./components/smooth-scroll":"/Sites/kisk-mennekes-www-20151019-relaunch-frontend/patternlab/source/js/components/smooth-scroll.js","./components/sticky-header":"/Sites/kisk-mennekes-www-20151019-relaunch-frontend/patternlab/source/js/components/sticky-header.js","./components/sticky-submenu":"/Sites/kisk-mennekes-www-20151019-relaunch-frontend/patternlab/source/js/components/sticky-submenu.js","./components/table":"/Sites/kisk-mennekes-www-20151019-relaunch-frontend/patternlab/source/js/components/table.js","./components/toggle-download-button":"/Sites/kisk-mennekes-www-20151019-relaunch-frontend/patternlab/source/js/components/toggle-download-button.js","./components/video":"/Sites/kisk-mennekes-www-20151019-relaunch-frontend/patternlab/source/js/components/video.js","./shame":"/Sites/kisk-mennekes-www-20151019-relaunch-frontend/patternlab/source/js/shame.js","./vendor/owl.carousel":"/Sites/kisk-mennekes-www-20151019-relaunch-frontend/patternlab/source/js/vendor/owl.carousel.js","./vendor/picturefill.min":"/Sites/kisk-mennekes-www-20151019-relaunch-frontend/patternlab/source/js/vendor/picturefill.min.js","./vendor/select2.min":"/Sites/kisk-mennekes-www-20151019-relaunch-frontend/patternlab/source/js/vendor/select2.min.js","./vendor/uikit/accordion.min":"/Sites/kisk-mennekes-www-20151019-relaunch-frontend/patternlab/source/js/vendor/uikit/accordion.min.js","./vendor/uikit/lightbox.min":"/Sites/kisk-mennekes-www-20151019-relaunch-frontend/patternlab/source/js/vendor/uikit/lightbox.min.js","./vendor/uikit/modal.min":"/Sites/kisk-mennekes-www-20151019-relaunch-frontend/patternlab/source/js/vendor/uikit/modal.min.js","./vendor/uikit/slider.min":"/Sites/kisk-mennekes-www-20151019-relaunch-frontend/patternlab/source/js/vendor/uikit/slider.min.js","./vendor/uikit/slideset.min":"/Sites/kisk-mennekes-www-20151019-relaunch-frontend/patternlab/source/js/vendor/uikit/slideset.min.js","./vendor/uikit/slideshow.min":"/Sites/kisk-mennekes-www-20151019-relaunch-frontend/patternlab/source/js/vendor/uikit/slideshow.min.js","./vendor/uikit/sticky.min":"/Sites/kisk-mennekes-www-20151019-relaunch-frontend/patternlab/source/js/vendor/uikit/sticky.min.js","./vendor/uikit/tooltip.min":"/Sites/kisk-mennekes-www-20151019-relaunch-frontend/patternlab/source/js/vendor/uikit/tooltip.min.js","jquery":"/Sites/kisk-mennekes-www-20151019-relaunch-frontend/node_modules/jquery/dist/jquery.js","svg4everybody":"/Sites/kisk-mennekes-www-20151019-relaunch-frontend/node_modules/svg4everybody/dist/svg4everybody.js","uikit":"/Sites/kisk-mennekes-www-20151019-relaunch-frontend/node_modules/uikit/dist/js/uikit.js"}],"/Sites/kisk-mennekes-www-20151019-relaunch-frontend/patternlab/source/js/components/OwlControl.js":[function(require,module,exports){
(function ($, window, document, undefined) {
    'use strict';

    /*
     * Constructor
     */

    var OwlControl = function (element, options) {

        this.element = element;

        this.$element = $(element);

        this.options = options;

        this.metaOptions = this.$element.data('owlcontrol');

        this.settings = $.extend({}, OwlControl.Defaults, this.options, this.metaOptions);
    };

    /*
     * Defaults
     */
    OwlControl.Defaults = {};

    /*
     * Initialize
     */
    OwlControl.prototype.initialize = function () {
        // console.log('initializing OwlControl');

        // console.log(this.settings);

        this.$element.owlCarousel(this.settings);
    };

    /*
     * jQuery Plugin Register
     */
    $.fn.owlControl = function (options) {
        return this.each(function () {
            new OwlControl(this, options).initialize();
        });
    };
})(jQuery, window, window.document);

},{}],"/Sites/kisk-mennekes-www-20151019-relaunch-frontend/patternlab/source/js/components/changer.js":[function(require,module,exports){
(function ($, window, document, undefined) {
    'use strict';

    var Changer = function (element, options) {
        var $this = $(this),
            _this = this;

        this.element = $(element);
        this.options = $.extend({}, this.defaults, options);

        this.element.on('mouseenter', function (e) {
            _this.changeMedia();
        });
    };

    $.extend(Changer.prototype, {

        defaults: {},

        changeMedia: function () {
            this.element.parents('.js-panel-story').find('picture source:first-child').attr('srcset', this.options.src);
        }

    });

    // init
    $(function () {
        $('[data-changer]').each(function () {
            var changer = $(this);
            new Changer(changer, transformOptions(changer.data('changer')));
        });
    });

    // helper
    var transformOptions = function (string) {

        if ($.isPlainObject(string)) return string;

        var start = string.indexOf("{"),
            options = {};

        if (start != -1) {
            try {
                options = new Function("", "var json = " + string.substr(start) + "; return JSON.parse(JSON.stringify(json));")();
            } catch (e) {}
        }

        return options;
    };
})(jQuery, window, window.document);

},{}],"/Sites/kisk-mennekes-www-20151019-relaunch-frontend/patternlab/source/js/components/clearable-input.js":[function(require,module,exports){
(function ($, window, document, undefined) {
    'use strict';

    var $element = $('.js-clearable-input'),
        defaults = {
        "submitonclick": false
    };

    $element.each(function () {
        var $this = $(this),
            options = $this.attr('data-clearable') ? JSON.parse($this.attr('data-clearable')) : {},
            settings = $.extend(true, {}, defaults, options);

        $this.wrap('<span class="tm-input tm-input--with-clear-icon" />').after($('<span />').on('click', function () {
            $(this).prev('input').val('').focus();

            if (settings.submitonclick) {
                var $form = $this.closest('form');

                if ($form.length) {
                    $form.submit();
                }
            }
        }));
    });
})(jQuery, window, window.document);

},{}],"/Sites/kisk-mennekes-www-20151019-relaunch-frontend/patternlab/source/js/components/events.js":[function(require,module,exports){
(function ($, window, document, undefined) {
    'use strict';

    var $eventsContainer = $('.js-event-list-container');
    var $filterButton = $('.js-filter-event-list');
    var buttonActive = 'tm-button-basic--active';

    var $eventsCategory = $('[data-filter-type="category"]');
    var $eventsLocation = $('[data-filter-type="location"]');

    //var filterUrl = 'http://kisk-mennekes-www-20151019-relaunch.10.6.0.109.xip.io:8888/schulungen/filter/';
    var filterUrlController = '?tx_sfeventmgt_pievent[action]=list&tx_sfeventmgt_pievent[controller]=Event';
    var filterUrlDemandCategory = '&tx_sfeventmgt_pievent[overwriteDemand][category]=';
    var filterUrlDemandLocation = '&tx_sfeventmgt_pievent[overwriteDemand][location]=';

    function handleEvents() {

        $('.js-tm-form-set-label').on('blur', function () {
            if ($(this).val()) {
                $(this).removeClass('is-empty');
            } else {
                $(this).addClass('is-empty');
            }
        });

        $('.js-filter-event-list-mobile').on('select2:select', function (e) {
            var url = filterUrl + filterUrlController;

            var demandCategory = $('.js-filter-event-list-mobile[data-filter-type="category"]').select2().find(":selected").data("uid");
            if (demandCategory) {
                url += filterUrlDemandCategory + demandCategory;
            }

            var demandLocation = $('.js-filter-event-list-mobile[data-filter-type="category"]').select2().find(":selected").data("uid");
            if (demandLocation) {
                url += filterUrlDemandLocation + demandLocation;
            }

            getData(url);
        });

        $('.js-filter-event-list').on('click', function filterButton(e) {
            e.preventDefault();
            var button = $(this);
            var url = filterUrl + filterUrlController;
            var arrDemandCategory = [];
            var arrDemandLocation = [];

            if (button.parents('[data-filter-type]').data('filterType') == 'category') {
                $eventsCategory.find('a').removeClass(buttonActive);
                button.addClass(buttonActive);
            }

            if (button.parents('[data-filter-type]').data('filterType') == 'location') {
                $eventsLocation.find('a').not($(this)).removeClass(buttonActive);
                button.toggleClass(buttonActive);
            }

            $eventsCategory.find('.' + buttonActive).each(function (i, e) {
                if ($(e).data('id')) {
                    arrDemandCategory[i] = $(e).data('id');
                }
            });

            $eventsLocation.find('.' + buttonActive).each(function (i, e) {
                if ($(e).data('id')) {
                    arrDemandLocation[i] = $(e).data('id');
                }
            });

            if (arrDemandCategory.length > 0) {
                url += filterUrlDemandCategory + arrDemandCategory.join(',');
            }

            if (arrDemandLocation.length > 0) {
                url += filterUrlDemandLocation + arrDemandLocation.join(',');
            }

            if (arrDemandCategory.length == 0 && arrDemandLocation.length > 0) {
                $('.js-filter-event-list-all').removeClass(buttonActive);
            }

            if (arrDemandCategory.length == 0 && arrDemandLocation.length == 0) {
                $('.js-filter-event-list-all').trigger('click');
                return;
            }

            getData(url);
        });

        $('.js-filter-event-list-all').on('click', function filterButton(e) {
            e.preventDefault();
            var url = $(this).attr('href');

            $filterButton.removeClass(buttonActive);
            $(this).addClass(buttonActive);

            getData(url);
        });

        if ($('.tm-block--mobile-sticky').length) {

            var scrollTimeout;
            var throttle = 100;
            $(window).on('scroll resize', function () {
                if (!scrollTimeout) {
                    if ($(window).width() < 768) {

                        scrollTimeout = setTimeout(function () {
                            if (isInViewport($('.js-events-sticky-trigger'))) {
                                $('.tm-block--mobile-sticky').addClass('tm-block--mobile-sticky--unset');
                            } else {
                                $('.tm-block--mobile-sticky').removeClass('tm-block--mobile-sticky--unset');
                            }
                            scrollTimeout = null;
                        }, throttle);
                    } else {
                        $('.tm-block--mobile-sticky').addClass('tm-block--mobile-sticky--unset');
                    }
                }
            });
        }

        if ($('.js-scroll-to-error').length > 0) {

            setTimeout(function scrollToError() {
                var scrollToErrorPosition = $('.js-scroll-to-error').first('.f3-form-error').offset().top;
                $('html, body').animate({
                    scrollTop: scrollToErrorPosition
                }, 1000);
            }, 750);
        }
    }

    function getData(url) {
        var _this = this;

        ajaxData(url).then(function (data) {

            var firstRun = 1;

            $eventsContainer.addClass('tm-events-overview__container--fade-out');
            $eventsContainer.one('webkitTransitionEnd otransitionend oTransitionEnd msTransitionEnd transitionend', function (e) {
                if (!firstRun) {
                    return;
                }

                var events = $(data).find('.js-event-list');
                firstRun = 0;

                $('.js-event-list').remove();
                $eventsContainer.append(events);

                $(this).removeClass('tm-events-overview__container--fade-out');
            });

            window.history.pushState(null, null, $(_this).attr('href'));
        }).catch(function (err) {});
    }

    function ajaxData(url) {
        return new Promise(function (resolve, reject) {
            var req = new XMLHttpRequest();
            req.open('GET', url);
            req.onload = function () {
                return req.status === 200 ? resolve(req.response) : reject(Error(req.statusText));
            };
            req.onerror = function (e) {
                return reject(Error('Network Error: ' + e));
            };
            req.send();
        });
    }

    function setButtonState(button) {
        $filterButton.removeClass(buttonActive);
        button.addClass(buttonActive);
    }

    function isInViewport(element) {
        var elementTop = $(element).offset().top;
        var elementBottom = elementTop + $(element).outerHeight();
        var viewportTop = $(window).scrollTop();
        var viewportBottom = viewportTop + $(window).height();
        return elementBottom > viewportTop && elementTop < viewportBottom;
    }

    handleEvents();
})(jQuery, window, window.document);

},{}],"/Sites/kisk-mennekes-www-20151019-relaunch-frontend/patternlab/source/js/components/filter-accordion.js":[function(require,module,exports){
(function ($, window, document, undefined) {
    'use strict';

    var accordionEnabled = false;
    var accordion = null;

    function checkMediaQuery() {
        return window.matchMedia("(min-width: 768px)").matches;
    }

    function checkAccordion() {
        if (checkMediaQuery()) {
            disableAccordion();
        } else {
            enableAccordion();
        }
    }

    function disableAccordion() {

        // console.log('disableAccordion because min-width is 768px');

        if (accordionEnabled) {
            $('.js-filter-accordion').off('click.uk.accordion');
            $('.js-filter-accordion .uk-accordion-title').removeClass('uk-active');
            $('.js-filter-accordion .uk-accordion-content').unwrap().removeClass('uk-active');

            accordion = null;
            accordionEnabled = false;
        }
    }

    function enableAccordion() {
        // console.log('enableAccordion because max-width is 767px');

        if (!accordionEnabled) {
            accordion = UIkit.accordion($('.js-filter-accordion'), { collapse: false });
            accordionEnabled = true;

            // console.log(accordion);
        }
    }

    $('.js-filter-accordion').find('.tm-tooltip-icon').on('click', function (e) {
        e.preventDefault();
        return false;
    });

    UIkit.on('afterready.uk.dom', function () {
        if ($('.js-filter-accordion').length) {
            checkAccordion();
        }

        $(window).on('resize orientationchange', UIkit.Utils.debounce(function (event) {
            if ($('.js-filter-accordion').length) {
                checkAccordion();
            }
        }, 100));

        $('html').on('update.filter.accordion', function () {
            // console.log('update.filter.accordion');

            if ($('.js-filter-accordion').length) {
                accordionEnabled = false; // reinit after ajax
                checkAccordion();
            }
        });
    });
})(jQuery, window, window.document);

},{}],"/Sites/kisk-mennekes-www-20151019-relaunch-frontend/patternlab/source/js/components/formhandler.js":[function(require,module,exports){
(function ($, window, document, undefined) {
    'use strict';

    var scrollToFormError = function () {

        var container = $('.js-scroll-to-error');
        var anchor = $('.js-scroll-to-anchor');
        var error = '.invalid';

        function init() {
            if (container.find(error).length > 0) {
                setTimeout(function () {
                    $('body, html').animate({
                        scrollTop: anchor.offset().top
                    }, 500);
                }, 300);
            }
        }

        return {
            init: init
        };
    }();

    var validateContactForm = function () {

        var container = $('#contact-form');
        var errorClass = 'invalid';

        function init() {

            container.find('.js-submit-form').on('click', function (e) {
                e.preventDefault();

                container.find('.validationWrapper').removeClass(errorClass);

                var required = container.find('.required');
                $.each(required, function () {
                    if (!$(this).val()) {
                        $(this).parents('.validationWrapper').addClass(errorClass);
                    }
                });

                if (container.find('.' + errorClass).length < 1) {
                    grecaptcha.execute();
                }
            });
        }

        return {
            init: init
        };
    }();

    scrollToFormError.init();
    validateContactForm.init();
})(jQuery, window, window.document);

},{}],"/Sites/kisk-mennekes-www-20151019-relaunch-frontend/patternlab/source/js/components/masonry-layout.js":[function(require,module,exports){
(function ($, window, document, undefined) {
    'use strict';

    var imagesLoaded = require('imagesloaded');
    var Masonry = require('masonry-layout');
    var grid = document.querySelector('.js-msnry-grid');
    var msnry;

    if (!grid) {
        return;
    }

    imagesLoaded(grid, function () {
        msnry = new Masonry(grid, {
            gutter: 10,
            itemSelector: '.msnry-grid__item',
            columnWidth: '.msnry-grid__sizer',
            percentPosition: true
        });
    });
})(jQuery, window, window.document);

},{"imagesloaded":"/Sites/kisk-mennekes-www-20151019-relaunch-frontend/node_modules/imagesloaded/imagesloaded.js","masonry-layout":"/Sites/kisk-mennekes-www-20151019-relaunch-frontend/node_modules/masonry-layout/masonry.js"}],"/Sites/kisk-mennekes-www-20151019-relaunch-frontend/patternlab/source/js/components/sharer.js":[function(require,module,exports){
/*
Possible Fields:
	uri     Alias: url, Fallback: location.href
	title   Fallback: og:title, <title>
	message Fallback: field title
	image   Fallback: og:image

All fields can be defined at a specific sharer or at the parent element as data tag:
<ul class="sharer" data-title="Sharer title" data-message="Full sharing message">
	<li class="twitter" data-message="Short twitter message"></li>
	<li class="facebook"></li>
</ul>

Sharers with used fields:
	facebook:   title, uri
	twitter:    message, uri
	googleplus: uri
	pinterest:  uri, image, message
	mail:       title, message, uri	- use &#10; für line breaks in message

*/
(function ($, window, document, undefined) {
  'use strict';

  var getter = {};

  getter.uri = function getUri(el) {
    var uri;

    uri = uri || el.data('uri');
    uri = uri || el.data('url');
    uri = uri || el.closest('.sharer').data('uri');
    uri = uri || el.closest('.sharer').data('url');
    uri = uri || location.href;

    return uri;
  };

  getter.title = function getTitle(el) {
    var title;

    title = title || el.data('title');
    title = title || el.closest('.sharer').data('title');
    title = title || $('meta[property="og:title"]').prop('content');
    title = title || $('title').text();

    return title;
  };

  getter.message = function getMessage(el) {
    var message;

    message = message || el.data('message');
    message = message || el.closest('.sharer').data('message');
    message = message || getter.title(el);

    return message;
  };

  getter.image = function getMessage(el) {
    var image;

    image = image || el.data('image');
    image = image || el.closest('.sharer').data('image');
    image = image || $('meta[property="og:image"]').prop('content');

    return image;
  };

  function popup(uri, width, height) {
    open(uri, 'sharer', 'width=' + width + ',height=' + height);
  }

  var shareHandlers = {
    facebook: {
      uri: 'https://www.facebook.com/sharer/sharer.php?u=%uri%&p[title]=%title%&display=popup',
      replacements: ['title', 'uri'],
      width: 650,
      height: 320
    },
    twitter: {
      uri: 'https://twitter.com/intent/tweet?text=%message%&url=%uri%',
      replacements: ['message', 'uri'],
      width: 520,
      height: 260
    },
    googleplus: {
      uri: 'https://plus.google.com/share?url=%uri%',
      replacements: ['uri'],
      width: 510,
      height: 390
    },
    pinterest: {
      uri: 'http://pinterest.com/pin/create/button/?url=%uri%&media=%image%&description=%message%',
      replacements: ['uri', 'image', 'message'],
      width: 510,
      height: 390
    },
    mail: {
      uri: 'mailto:?subject=%title%&body=%message% %uri%',
      replacements: ['title', 'message', 'uri'],
      handler: function (uri) {
        location.href = uri;
      }
    }
  };

  var init = function initSharer() {
    $.each(shareHandlers, function (name, values) {
      $('body').on('click touchend', '.sharer .' + name, function (e) {
        e.preventDefault();
        var el = $(this);
        var uri = values.uri;
        $.each(values.replacements, function (k, v) {
          uri = uri.replace(new RegExp('%' + v + '%'), encodeURIComponent(getter[v](el)));
        });
        var handler = values.handler || popup;
        handler(uri, values.width, values.height);
      });
    });
  };

  var self = {
    init: init,
    getter: getter,
    popup: popup,
    handlers: shareHandlers
  };

  self.init();
})(jQuery, window, window.document);

},{}],"/Sites/kisk-mennekes-www-20151019-relaunch-frontend/patternlab/source/js/components/slideshow.js":[function(require,module,exports){
(function ($, window, document, undefined) {
    'use strict';

    // on slide change reset video inside last slide

    $('[data-uk-slideshow]').on('show.uk.slideshow', function (event, nextSlide, currentSlide) {
        var $slide = $(currentSlide),
            $video = $slide.find('video'),
            $videoContainer = $slide.find('.js-video'),
            $playControl = $slide.find('.js-video-play'),
            $pauseControl = $slide.find('.js-video-pause'),
            $muteControl = $slide.find('.js-video-mute');

        if ($video.length > 0) {
            $video.css('display', 'none');
            $video[0].pause();
            $videoContainer.removeClass('tm-video--is-playing');

            $pauseControl.css('display', 'none');
            $muteControl.css('display', 'none');
            $playControl.css('display', 'inline-block');

            $video[0].currentTime = 0;
        }
    });
})(jQuery, window, window.document);

},{}],"/Sites/kisk-mennekes-www-20151019-relaunch-frontend/patternlab/source/js/components/smooth-scroll.js":[function(require,module,exports){
(function ($, window, document, undefined) {
    'use strict';

    var smoothScroller = null,
        $element = $('.js-smooth-scroll');

    $element.each(function () {
        var $this = $(this);

        $this.on('click', function () {
            var offsetAdd = 0;

            if ($(window).width() < 960) {
                offsetAdd = $('#tm-header').outerHeight();
            } else {
                offsetAdd = $('#tm-header').outerHeight() / 2;
            }

            var offset = $this.parents('.tm-block').outerHeight() + offsetAdd;

            $("html,body").stop().animate({ scrollTop: offset }, 1000, 'easeOutExpo');
        });
    });
})(jQuery, window, window.document);

},{}],"/Sites/kisk-mennekes-www-20151019-relaunch-frontend/patternlab/source/js/components/sticky-header.js":[function(require,module,exports){
(function ($, window, document, undefined) {
    'use strict';

    var stickyHeader = null,
        $element = $('.js-sticky-header'),
        $header = $element.find('.tm-header'),
        $mobileMenu = $('#tm-menu-mobile'),
        $mobileMenuHook = $('.js-sticky-mobile-menu'),
        mobileMenuIsClosed = $mobileMenu.hasClass('tm-menu-mobile--is-closed'),
        shrinkTriggerOffset = 108,
        placeholderMinHeight = 62;

    function isMobile() {
        return !window.matchMedia('(min-width: 960px)').matches;
    }

    function onScrollShrink() {
        var scrollTop = $(window).scrollTop(),
            shrinkOn = shrinkTriggerOffset,
            clsactive = 'tm-header--small';

        if (scrollTop > shrinkOn) {
            $header.addClass(clsactive);
        } else {
            $header.removeClass(clsactive);
        }
    }

    function onMobileMenuClick() {
        // console.log('onMobileMenuClick');
        mobileMenuIsClosed = !mobileMenuIsClosed;

        $element.css({
            'position': 'fixed',
            'top': 0,
            'width': $(window).width()
        }).addClass('uk-active');

        if (mobileMenuIsClosed) {
            $element.css({
                'height': 'auto',
                'overflow-y': 'visible'
            });

            $('body, html').removeClass('js-disabled-scrolling');
        } else {
            $element.css({
                'height': '100%',
                'overflow-y': 'scroll'
            });

            $('body, html').addClass('js-disabled-scrolling');
        }

        stickyHeader.sticky.options.showup = mobileMenuIsClosed;
    }

    function recalcWrapperHeight() {
        var placeholderHeight = $element.outerHeight() > placeholderMinHeight ? $element.outerHeight() : placeholderMinHeight;
        $element.parent().height(placeholderHeight);
    }

    function initSticky() {
        var options = {
            animation: 'uk-animation-slide-top'
        };

        if (!isMobile()) {
            $(window).on('scroll', onScrollShrink);
        }

        $mobileMenuHook.on('click', onMobileMenuClick);

        return UIkit.sticky($element, options);
    }

    $(window).on('resize', UIkit.Utils.debounce(function (event) {

        // console.log('stateIsMobile', isMobile());
        // console.log('stickyHeader.options.showup', stickyHeader.options.showup);
        // console.log('stickyHeader.options.showup !== stateIsMobile', stickyHeader.options.showup !== isMobile());

        // if mobile (< 960px), remove listener for header shrinking and activate showup feature
        if (isMobile()) {
            $(window).off('scroll', onScrollShrink);

            if ($header.hasClass('tm-header--small')) {
                $header.removeClass('tm-header--small');
            }
        } else {
            $(window).on('scroll', onScrollShrink);
            onScrollShrink();
        }

        recalcWrapperHeight();
    }, 200));

    stickyHeader = initSticky();

    $(document).on('touchmove', '.js-disabled-scrolling', function (event) {
        var menuHeight = $mobileMenu.outerHeight() + $('#tm-header').outerHeight(),
            viewportHeight = $(window).outerHeight();

        if (menuHeight < viewportHeight) {
            event.preventDefault();
        }
    });
})(jQuery, window, window.document);

},{}],"/Sites/kisk-mennekes-www-20151019-relaunch-frontend/patternlab/source/js/components/sticky-submenu.js":[function(require,module,exports){
(function ($, window, document, undefined) {
    'use strict';

    var init = null;
    var offsetTop = null;
    var $element = $('.js-sticky-submenu');
    var $header = $('.js-sticky-header .tm-header');
    var offsetTopMedium = 102;
    var offsetTopSmall = 62;

    // Slide to anchor
    $('.js-section-menu a').on('click', function (e) {
        e.preventDefault();

        var href = $(this).attr('href');

        if ($(this).hasClass('js-link') || href.indexOf('#') == '-1') {
            window.location = $(this).attr('href');
        } else {
            var aTag = $($(this).attr('href'));

            console.log(aTag);

            $(this).closest('ul').find('.active').removeClass('active');
            $(this).closest('li').addClass('active');

            scrollTop(aTag);
        }
    });

    $('.js-section-menu-mobile').on('select2:select', function () {
        var aTag = $("[id='" + $(this).find(":selected").data('href').replace('#', '') + "']");

        console.log(aTag);

        if ($(this).find(":selected").hasClass('js-link')) {
            window.location = $(this).find(":selected").data('href');
        } else {
            scrollTop(aTag);
        }
    });

    function scrollTop(aTag) {
        if (!aTag.offset()) {
            return;
        }

        var offset = setOffsetTop() + $element.outerHeight(true);
        $('html,body').animate({ scrollTop: aTag.offset().top, ease: 'easeinout' }, 500);
    }

    function isMobile() {
        return !window.matchMedia('(min-width: 1220px)').matches;
    }

    function setOffsetTop() {

        var offsetTop = offsetTopSmall;

        if (!isMobile()) {
            offsetTop = offsetTopMedium;
        }

        return offsetTop;
    }

    function stickySubmenu() {

        function init() {
            var options = {
                top: setOffsetTop(),
                animation: 'uk-animation-slide-top'
            };

            return UIkit.sticky($element, options);
        }

        $(window).on('resize', UIkit.Utils.debounce(function (event) {

            UIkit.sticky($element).options.top = setOffsetTop();
        }, 200));

        init = init();
    }

    var stickySubmenu = stickySubmenu();
})(jQuery, window, window.document);

},{}],"/Sites/kisk-mennekes-www-20151019-relaunch-frontend/patternlab/source/js/components/table.js":[function(require,module,exports){
(function ($, window, document, undefined) {
    'use strict';

    // Fill Table with empty items if needed

    function fillTable() {
        var container = $('.js-tm-table');
        var empty = '<div class="tm-table__grid tm-table__grid__item tm-table__grid--empty"></div>';
        var itemsArray = [];
        var maxRows = [];
        var fill = 0;

        $.each(container, function getItems(i) {
            itemsArray[i] = [];
            $(this).find('.tm-table-item').each(function getItemsInner(f) {
                var items = $(this).data('items');
                var cols = $(this).data('cols');
                var rows = Math.ceil(items / cols);

                itemsArray[i][f] = [items, cols, rows];

                if (maxRows[i] < rows || maxRows[i] === undefined) {
                    maxRows[i] = rows;
                }
            });
        });

        $.each(itemsArray, function setItems(i, e) {

            $.each(e, function setItemsInner(f, g) {

                if (g[1] == 1) {
                    if (g[3] != maxRows[i]) {
                        fill = maxRows[i] - g[0];

                        for (var m = 0; m < fill; m++) {
                            $('.js-tm-table:eq(' + i + ')').find('.tm-table-item:eq(' + f + ')').append($(empty));
                        }
                    }
                }

                if (g[1] == 3) {
                    if (g[3] != maxRows[i]) {
                        fill = maxRows[i] * g[1] - g[0];

                        for (var m = 0; m < fill; m++) {
                            $('.js-tm-table:eq(' + i + ')').find('.tm-table-item:eq(' + f + ')').find('.tm-table__grid__container').append($(empty));
                        }
                    }
                }
            });
        });
    }

    fillTable();
})(jQuery, window, window.document);

},{}],"/Sites/kisk-mennekes-www-20151019-relaunch-frontend/patternlab/source/js/components/toggle-download-button.js":[function(require,module,exports){
(function ($, window, document, undefined) {
    'use strict';

    var selector = $('.js-download-toggle input[type=checkbox]');
    var target = $('.js-download-button');

    selector.on('change', function toggleDownloadButton() {

        if (target.hasClass('panel-download--hidden')) {
            $(this).closest('div').fadeOut(function buttonFadeIn() {
                target.fadeIn().removeClass('panel-download--hidden');
            });
        }
    });
})(jQuery, window, window.document);

},{}],"/Sites/kisk-mennekes-www-20151019-relaunch-frontend/patternlab/source/js/components/video.js":[function(require,module,exports){
(function ($, window, document, undefined) {
    'use strict';

    var videoHover = function () {

        function init() {
            $('.js-video-hover').hover(function () {
                $(this).find('video')[0].play();
            }, function () {
                $(this).find('video')[0].pause();
                $(this).find('video')[0].currentTime = 0;
            });
        }

        return {
            init: init
        };
    }();

    var videoLinks = function () {

        function init() {
            $('.js-video-links').each(function () {
                var $links = $(this).find('.tm-panel-story__links li');
                var numberOfLinks = $links.length;

                // break if less than 2 links
                if (numberOfLinks <= 1) return;

                $links.each(function (index) {
                    var $link = $(this);
                    var $parentPanel = $link.parents('.js-panel-story');
                    var $videoElement = $parentPanel.find('video').eq(index);

                    $link.hover(function () {
                        // hide all videos
                        $parentPanel.find('video').css('display', 'none');
                        // show the correct video
                        $videoElement.css('display', 'inline');
                        // start playing
                        $videoElement[0].play();
                    }, function () {
                        // stop playing
                        $videoElement[0].pause();
                        // reset video
                        $videoElement[0].currentTime = 0;
                    });
                });
            });
        }

        return {
            init: init
        };
    }();

    var videoSwitchPoster = function () {

        function init() {

            //$(window).on('resize', function (e) {
            //    checkWindowWidth();
            //});

            checkWindowWidth();
        }

        function checkWindowWidth() {
            var wWidth = $(window).width();

            if (wWidth > 767) {
                changeVideoPoster('large');
            } else if (wWidth > 320) {
                changeVideoPoster('medium');
            } else {
                changeVideoPoster('small');
            }
        }

        function changeVideoPoster(posterSize) {

            $('video').each(function (i, element) {
                var posterUrl = $(element).data('poster-' + posterSize);
                $(element).attr('poster', posterUrl);
            });
        }

        return {
            init: init
        };
    }();

    var videoControls = function () {
        var $videoContainer = $('.js-video'),
            $video = $videoContainer.find('video'),
            $playControl = $('.js-video-play'),
            $pauseControl = $('.js-video-pause'),
            $muteControl = $('.js-video-mute');

        function init() {

            $playControl.on('click', function () {
                var $this = $(this),
                    video = $this.parents('.js-video').find('video')[0];

                $(video).css('display', 'block');

                video.play();

                if ($('html').hasClass('uk-touch') && window.matchMedia('(max-width: 1024px)').matches) {
                    handleFullScreen(video);

                    try {
                        if (video.requestFullscreen) {
                            video.requestFullscreen();
                        } else if (video.mozRequestFullScreen) {
                            video.mozRequestFullScreen();
                        } else if (video.webkitRequestFullscreen) {
                            video.webkitRequestFullscreen();
                        } else if (video.webkitEnterFullscreen) {
                            video.webkitEnterFullScreen();
                        }
                    } catch (e) {}
                } else {
                    $this.css('display', 'none');
                    $pauseControl.css('display', 'inline-block');
                    $muteControl.css('display', 'inline-block');

                    if (!$videoContainer.hasClass('tm-video---is-playing')) {
                        $videoContainer.addClass('tm-video--is-playing');
                    }
                }

                // if video ended hide it and show image
                $(video).on('ended', function (e) {
                    $(video).css('display', 'none');
                    video.currentTime = 0;
                    $videoContainer.removeClass('tm-video--is-playing');

                    $pauseControl.css('display', 'none');
                    $muteControl.css('display', 'none');
                    $playControl.css('display', 'inline-block');
                });
            });

            $pauseControl.on('click', function () {
                var element = this;
                handlePause(element);
            });

            $muteControl.on('click', function () {
                var $this = $(this),
                    video = $this.parents('.js-video').find('video')[0];

                video.muted ? video.muted = false : video.muted = true;

                $this.toggleClass('tm-video-controls__mute--is-muted');
            });
        }

        function handlePause(element) {
            var $this = $(element) || $(this),
                video = $this.parents('.js-video').find('video')[0];

            $this.css('display', 'none');
            $muteControl.css('display', 'none');
            $playControl.css('display', 'inline-block');

            video.pause();
            $videoContainer.removeClass('tm-video--is-playing');

            // console.log("$('html').hasClass('uk-touch') || window.matchMedia('(max-width: 768px)').matches", $('html').hasClass('uk-touch') || window.matchMedia('(max-width: 768px)').matches);

            if ($('html').hasClass('uk-touch') || window.matchMedia('(max-width: 768px)').matches) {
                $(video).css('display', 'none');
            }
        }

        function handleFullScreen(video) {
            var isFullScreen;

            // desktop chrome/safari/opera/firefox / mobile chrome
            $(document).on('webkitfullscreenchange mozfullscreenchange fullscreenchange ', function (event) {
                isFullScreen = checkFullScreen(video);

                if (!isFullScreen) {
                    handlePause(video);
                }
            });

            // ios safari
            $(video).on('webkitbeginfullscreen webkitendfullscreen', function (event) {
                isFullScreen = checkFullScreen(video);

                if (!isFullScreen) {
                    handlePause(video);
                }
            });
        }

        function checkFullScreen(video) {
            var isFullScreen;

            if (document.fullscreen) {
                isFullScreen = document.fullscreen;
            } else if (document.mozFullScreen) {
                isFullScreen = document.mozFullScreen;
            } else if (document.webkitIsFullScreen) {
                isFullScreen = document.webkitIsFullScreen;
            } else if (video.webkitDisplayingFullscreen) {
                isFullScreen = video.webkitDisplayingFullscreen;
            } else {
                isFullScreen = false;
            }

            // console.log(isFullScreen);

            return isFullScreen;
        }

        return {
            init: init
        };
    }();

    videoHover.init();
    videoLinks.init();
    videoSwitchPoster.init();
    videoControls.init();
})(jQuery, window, window.document);

},{}],"/Sites/kisk-mennekes-www-20151019-relaunch-frontend/patternlab/source/js/shame.js":[function(require,module,exports){
$(function () {
    'use strict';

    var UtilsMatchHeights = function () {

        function matchHeights(selector) {
            UIkit.Utils.matchHeights(selector);
        }

        return {
            match: matchHeights
        };
    }();

    if ($('.js-panel-story > .tm-panel-story__bottom').length > 1) {
        $(window).on('load resize orientationchange', function () {
            UIkit.Utils.debounce(UtilsMatchHeights.match('.js-panel-story > .tm-panel-story__bottom'), 50);
        }());
    }

    $('.tm-header [data-uk-dropdown]').on('show.uk.dropdown', function () {

        var $sliderElement = $(this).find('.js-menu-desktop');

        if ($sliderElement.length) {
            UIkit.slider($sliderElement, {
                infinite: true
            });

            setTimeout(function () {
                $(window).trigger('resize');
                console.log('trigger window resize');
            }, 200);
        }

        setTimeout(function () {
            UtilsMatchHeights.match('.js-panel-story > .tm-panel-story__bottom');
            UtilsMatchHeights.match('.js-menu-desktop-dropdown-nav__item');

            // $(window).trigger('resize');
        }, 100);
    });

    // select2
    $('select').select2({
        placeholder: '',
        minimumResultsForSearch: Infinity
    });

    $('[data-owlcontrol]').each(function () {
        $(this).owlControl();
    });
});

},{}],"/Sites/kisk-mennekes-www-20151019-relaunch-frontend/patternlab/source/js/vendor/owl.carousel.js":[function(require,module,exports){
/**
 * Owl Carousel v2.1.4
 * Copyright 2013-2016 David Deutsch
 * Licensed under MIT (https://github.com/OwlCarousel2/OwlCarousel2/blob/master/LICENSE)
 */
/**
 * Owl carousel
 * @version 2.1.0
 * @author Bartosz Wojciechowski
 * @author David Deutsch
 * @license The MIT License (MIT)
 * @todo Lazy Load Icon
 * @todo prevent animationend bubling
 * @todo itemsScaleUp
 * @todo Test Zepto
 * @todo stagePadding calculate wrong active classes
 */
;(function ($, window, document, undefined) {

	/**
  * Creates a carousel.
  * @class The Owl Carousel.
  * @public
  * @param {HTMLElement|jQuery} element - The element to create the carousel for.
  * @param {Object} [options] - The options
  */
	function Owl(element, options) {

		/**
   * Current settings for the carousel.
   * @public
   */
		this.settings = null;

		/**
   * Current options set by the caller including defaults.
   * @public
   */
		this.options = $.extend({}, Owl.Defaults, options);

		/**
   * Plugin element.
   * @public
   */
		this.$element = $(element);

		/**
   * Proxied event handlers.
   * @protected
   */
		this._handlers = {};

		/**
   * References to the running plugins of this carousel.
   * @protected
   */
		this._plugins = {};

		/**
   * Currently suppressed events to prevent them from beeing retriggered.
   * @protected
   */
		this._supress = {};

		/**
   * Absolute current position.
   * @protected
   */
		this._current = null;

		/**
   * Animation speed in milliseconds.
   * @protected
   */
		this._speed = null;

		/**
   * Coordinates of all items in pixel.
   * @todo The name of this member is missleading.
   * @protected
   */
		this._coordinates = [];

		/**
   * Current breakpoint.
   * @todo Real media queries would be nice.
   * @protected
   */
		this._breakpoint = null;

		/**
   * Current width of the plugin element.
   */
		this._width = null;

		/**
   * All real items.
   * @protected
   */
		this._items = [];

		/**
   * All cloned items.
   * @protected
   */
		this._clones = [];

		/**
   * Merge values of all items.
   * @todo Maybe this could be part of a plugin.
   * @protected
   */
		this._mergers = [];

		/**
   * Widths of all items.
   */
		this._widths = [];

		/**
   * Invalidated parts within the update process.
   * @protected
   */
		this._invalidated = {};

		/**
   * Ordered list of workers for the update process.
   * @protected
   */
		this._pipe = [];

		/**
   * Current state information for the drag operation.
   * @todo #261
   * @protected
   */
		this._drag = {
			time: null,
			target: null,
			pointer: null,
			stage: {
				start: null,
				current: null
			},
			direction: null
		};

		/**
   * Current state information and their tags.
   * @type {Object}
   * @protected
   */
		this._states = {
			current: {},
			tags: {
				'initializing': ['busy'],
				'animating': ['busy'],
				'dragging': ['interacting']
			}
		};

		$.each(['onResize', 'onThrottledResize'], $.proxy(function (i, handler) {
			this._handlers[handler] = $.proxy(this[handler], this);
		}, this));

		$.each(Owl.Plugins, $.proxy(function (key, plugin) {
			this._plugins[key.charAt(0).toLowerCase() + key.slice(1)] = new plugin(this);
		}, this));

		$.each(Owl.Workers, $.proxy(function (priority, worker) {
			this._pipe.push({
				'filter': worker.filter,
				'run': $.proxy(worker.run, this)
			});
		}, this));

		this.setup();
		this.initialize();
	}

	/**
  * Default options for the carousel.
  * @public
  */
	Owl.Defaults = {
		items: 3,
		loop: false,
		center: false,
		rewind: false,

		mouseDrag: true,
		touchDrag: true,
		pullDrag: true,
		freeDrag: false,

		margin: 0,
		stagePadding: 0,

		merge: false,
		mergeFit: true,
		autoWidth: false,

		startPosition: 0,
		rtl: false,

		smartSpeed: 250,
		fluidSpeed: false,
		dragEndSpeed: false,

		responsive: {},
		responsiveRefreshRate: 200,
		responsiveBaseElement: window,

		fallbackEasing: 'swing',

		info: false,

		nestedItemSelector: false,
		itemElement: 'div',
		stageElement: 'div',

		refreshClass: 'owl-refresh',
		loadedClass: 'owl-loaded',
		loadingClass: 'owl-loading',
		rtlClass: 'owl-rtl',
		responsiveClass: 'owl-responsive',
		dragClass: 'owl-drag',
		itemClass: 'owl-item',
		stageClass: 'owl-stage',
		stageOuterClass: 'owl-stage-outer',
		grabClass: 'owl-grab'
	};

	/**
  * Enumeration for width.
  * @public
  * @readonly
  * @enum {String}
  */
	Owl.Width = {
		Default: 'default',
		Inner: 'inner',
		Outer: 'outer'
	};

	/**
  * Enumeration for types.
  * @public
  * @readonly
  * @enum {String}
  */
	Owl.Type = {
		Event: 'event',
		State: 'state'
	};

	/**
  * Contains all registered plugins.
  * @public
  */
	Owl.Plugins = {};

	/**
  * List of workers involved in the update process.
  */
	Owl.Workers = [{
		filter: ['width', 'settings'],
		run: function () {
			this._width = this.$element.width();
		}
	}, {
		filter: ['width', 'items', 'settings'],
		run: function (cache) {
			cache.current = this._items && this._items[this.relative(this._current)];
		}
	}, {
		filter: ['items', 'settings'],
		run: function () {
			this.$stage.children('.cloned').remove();
		}
	}, {
		filter: ['width', 'items', 'settings'],
		run: function (cache) {
			var margin = this.settings.margin || '',
			    grid = !this.settings.autoWidth,
			    rtl = this.settings.rtl,
			    css = {
				'width': 'auto',
				'margin-left': rtl ? margin : '',
				'margin-right': rtl ? '' : margin
			};

			!grid && this.$stage.children().css(css);

			cache.css = css;
		}
	}, {
		filter: ['width', 'items', 'settings'],
		run: function (cache) {
			var width = (this.width() / this.settings.items).toFixed(3) - this.settings.margin,
			    merge = null,
			    iterator = this._items.length,
			    grid = !this.settings.autoWidth,
			    widths = [];

			cache.items = {
				merge: false,
				width: width
			};

			while (iterator--) {
				merge = this._mergers[iterator];
				merge = this.settings.mergeFit && Math.min(merge, this.settings.items) || merge;

				cache.items.merge = merge > 1 || cache.items.merge;

				widths[iterator] = !grid ? this._items[iterator].width() : width * merge;
			}

			this._widths = widths;
		}
	}, {
		filter: ['items', 'settings'],
		run: function () {
			var clones = [],
			    items = this._items,
			    settings = this.settings,
			    view = Math.max(settings.items * 2, 4),
			    size = Math.ceil(items.length / 2) * 2,
			    repeat = settings.loop && items.length ? settings.rewind ? view : Math.max(view, size) : 0,
			    append = '',
			    prepend = '';

			repeat /= 2;

			while (repeat--) {
				clones.push(this.normalize(clones.length / 2, true));
				append = append + items[clones[clones.length - 1]][0].outerHTML;
				clones.push(this.normalize(items.length - 1 - (clones.length - 1) / 2, true));
				prepend = items[clones[clones.length - 1]][0].outerHTML + prepend;
			}

			this._clones = clones;

			$(append).addClass('cloned').appendTo(this.$stage);
			$(prepend).addClass('cloned').prependTo(this.$stage);
		}
	}, {
		filter: ['width', 'items', 'settings'],
		run: function () {
			var rtl = this.settings.rtl ? 1 : -1,
			    size = this._clones.length + this._items.length,
			    iterator = -1,
			    previous = 0,
			    current = 0,
			    coordinates = [];

			while (++iterator < size) {
				previous = coordinates[iterator - 1] || 0;
				current = this._widths[this.relative(iterator)] + this.settings.margin;
				coordinates.push(previous + current * rtl);
			}

			this._coordinates = coordinates;
		}
	}, {
		filter: ['width', 'items', 'settings'],
		run: function () {
			var padding = this.settings.stagePadding,
			    coordinates = this._coordinates,
			    css = {
				'width': Math.ceil(Math.abs(coordinates[coordinates.length - 1])) + padding * 2,
				'padding-left': padding || '',
				'padding-right': padding || ''
			};

			this.$stage.css(css);
		}
	}, {
		filter: ['width', 'items', 'settings'],
		run: function (cache) {
			var iterator = this._coordinates.length,
			    grid = !this.settings.autoWidth,
			    items = this.$stage.children();

			if (grid && cache.items.merge) {
				while (iterator--) {
					cache.css.width = this._widths[this.relative(iterator)];
					items.eq(iterator).css(cache.css);
				}
			} else if (grid) {
				cache.css.width = cache.items.width;
				items.css(cache.css);
			}
		}
	}, {
		filter: ['items'],
		run: function () {
			this._coordinates.length < 1 && this.$stage.removeAttr('style');
		}
	}, {
		filter: ['width', 'items', 'settings'],
		run: function (cache) {
			cache.current = cache.current ? this.$stage.children().index(cache.current) : 0;
			cache.current = Math.max(this.minimum(), Math.min(this.maximum(), cache.current));
			this.reset(cache.current);
		}
	}, {
		filter: ['position'],
		run: function () {
			this.animate(this.coordinates(this._current));
		}
	}, {
		filter: ['width', 'position', 'items', 'settings'],
		run: function () {
			var rtl = this.settings.rtl ? 1 : -1,
			    padding = this.settings.stagePadding * 2,
			    begin = this.coordinates(this.current()) + padding,
			    end = begin + this.width() * rtl,
			    inner,
			    outer,
			    matches = [],
			    i,
			    n;

			for (i = 0, n = this._coordinates.length; i < n; i++) {
				inner = this._coordinates[i - 1] || 0;
				outer = Math.abs(this._coordinates[i]) + padding * rtl;

				if (this.op(inner, '<=', begin) && this.op(inner, '>', end) || this.op(outer, '<', begin) && this.op(outer, '>', end)) {
					matches.push(i);
				}
			}

			this.$stage.children('.active').removeClass('active');
			this.$stage.children(':eq(' + matches.join('), :eq(') + ')').addClass('active');

			if (this.settings.center) {
				this.$stage.children('.center').removeClass('center');
				this.$stage.children().eq(this.current()).addClass('center');
			}
		}
	}];

	/**
  * Initializes the carousel.
  * @protected
  */
	Owl.prototype.initialize = function () {
		this.enter('initializing');
		this.trigger('initialize');

		this.$element.toggleClass(this.settings.rtlClass, this.settings.rtl);

		if (this.settings.autoWidth && !this.is('pre-loading')) {
			var imgs, nestedSelector, width;
			imgs = this.$element.find('img');
			nestedSelector = this.settings.nestedItemSelector ? '.' + this.settings.nestedItemSelector : undefined;
			width = this.$element.children(nestedSelector).width();

			if (imgs.length && width <= 0) {
				this.preloadAutoWidthImages(imgs);
			}
		}

		this.$element.addClass(this.options.loadingClass);

		// create stage
		this.$stage = $('<' + this.settings.stageElement + ' class="' + this.settings.stageClass + '"/>').wrap('<div class="' + this.settings.stageOuterClass + '"/>');

		// append stage
		this.$element.append(this.$stage.parent());

		// append content
		this.replace(this.$element.children().not(this.$stage.parent()));

		// check visibility
		if (this.$element.is(':visible')) {
			// update view
			this.refresh();
		} else {
			// invalidate width
			this.invalidate('width');
		}

		this.$element.removeClass(this.options.loadingClass).addClass(this.options.loadedClass);

		// register event handlers
		this.registerEventHandlers();

		this.leave('initializing');
		this.trigger('initialized');
	};

	/**
  * Setups the current settings.
  * @todo Remove responsive classes. Why should adaptive designs be brought into IE8?
  * @todo Support for media queries by using `matchMedia` would be nice.
  * @public
  */
	Owl.prototype.setup = function () {
		var viewport = this.viewport(),
		    overwrites = this.options.responsive,
		    match = -1,
		    settings = null;

		if (!overwrites) {
			settings = $.extend({}, this.options);
		} else {
			$.each(overwrites, function (breakpoint) {
				if (breakpoint <= viewport && breakpoint > match) {
					match = Number(breakpoint);
				}
			});

			settings = $.extend({}, this.options, overwrites[match]);
			delete settings.responsive;

			// responsive class
			if (settings.responsiveClass) {
				this.$element.attr('class', this.$element.attr('class').replace(new RegExp('(' + this.options.responsiveClass + '-)\\S+\\s', 'g'), '$1' + match));
			}
		}

		if (this.settings === null || this._breakpoint !== match) {
			this.trigger('change', { property: { name: 'settings', value: settings } });
			this._breakpoint = match;
			this.settings = settings;
			this.invalidate('settings');
			this.trigger('changed', { property: { name: 'settings', value: this.settings } });
		}
	};

	/**
  * Updates option logic if necessery.
  * @protected
  */
	Owl.prototype.optionsLogic = function () {
		if (this.settings.autoWidth) {
			this.settings.stagePadding = false;
			this.settings.merge = false;
		}
	};

	/**
  * Prepares an item before add.
  * @todo Rename event parameter `content` to `item`.
  * @protected
  * @returns {jQuery|HTMLElement} - The item container.
  */
	Owl.prototype.prepare = function (item) {
		var event = this.trigger('prepare', { content: item });

		if (!event.data) {
			event.data = $('<' + this.settings.itemElement + '/>').addClass(this.options.itemClass).append(item);
		}

		this.trigger('prepared', { content: event.data });

		return event.data;
	};

	/**
  * Updates the view.
  * @public
  */
	Owl.prototype.update = function () {
		var i = 0,
		    n = this._pipe.length,
		    filter = $.proxy(function (p) {
			return this[p];
		}, this._invalidated),
		    cache = {};

		while (i < n) {
			if (this._invalidated.all || $.grep(this._pipe[i].filter, filter).length > 0) {
				this._pipe[i].run(cache);
			}
			i++;
		}

		this._invalidated = {};

		!this.is('valid') && this.enter('valid');
	};

	/**
  * Gets the width of the view.
  * @public
  * @param {Owl.Width} [dimension=Owl.Width.Default] - The dimension to return.
  * @returns {Number} - The width of the view in pixel.
  */
	Owl.prototype.width = function (dimension) {
		dimension = dimension || Owl.Width.Default;
		switch (dimension) {
			case Owl.Width.Inner:
			case Owl.Width.Outer:
				return this._width;
			default:
				return this._width - this.settings.stagePadding * 2 + this.settings.margin;
		}
	};

	/**
  * Refreshes the carousel primarily for adaptive purposes.
  * @public
  */
	Owl.prototype.refresh = function () {
		this.enter('refreshing');
		this.trigger('refresh');

		this.setup();

		this.optionsLogic();

		this.$element.addClass(this.options.refreshClass);

		this.update();

		this.$element.removeClass(this.options.refreshClass);

		this.leave('refreshing');
		this.trigger('refreshed');
	};

	/**
  * Checks window `resize` event.
  * @protected
  */
	Owl.prototype.onThrottledResize = function () {
		window.clearTimeout(this.resizeTimer);
		this.resizeTimer = window.setTimeout(this._handlers.onResize, this.settings.responsiveRefreshRate);
	};

	/**
  * Checks window `resize` event.
  * @protected
  */
	Owl.prototype.onResize = function () {
		if (!this._items.length) {
			return false;
		}

		if (this._width === this.$element.width()) {
			return false;
		}

		if (!this.$element.is(':visible')) {
			return false;
		}

		this.enter('resizing');

		if (this.trigger('resize').isDefaultPrevented()) {
			this.leave('resizing');
			return false;
		}

		this.invalidate('width');

		this.refresh();

		this.leave('resizing');
		this.trigger('resized');
	};

	/**
  * Registers event handlers.
  * @todo Check `msPointerEnabled`
  * @todo #261
  * @protected
  */
	Owl.prototype.registerEventHandlers = function () {
		if ($.support.transition) {
			this.$stage.on($.support.transition.end + '.owl.core', $.proxy(this.onTransitionEnd, this));
		}

		if (this.settings.responsive !== false) {
			this.on(window, 'resize', this._handlers.onThrottledResize);
		}

		if (this.settings.mouseDrag) {
			this.$element.addClass(this.options.dragClass);
			this.$stage.on('mousedown.owl.core', $.proxy(this.onDragStart, this));
			this.$stage.on('dragstart.owl.core selectstart.owl.core', function () {
				return false;
			});
		}

		if (this.settings.touchDrag) {
			this.$stage.on('touchstart.owl.core', $.proxy(this.onDragStart, this));
			this.$stage.on('touchcancel.owl.core', $.proxy(this.onDragEnd, this));
		}
	};

	/**
  * Handles `touchstart` and `mousedown` events.
  * @todo Horizontal swipe threshold as option
  * @todo #261
  * @protected
  * @param {Event} event - The event arguments.
  */
	Owl.prototype.onDragStart = function (event) {
		var stage = null;

		if (event.which === 3) {
			return;
		}

		if ($.support.transform) {
			stage = this.$stage.css('transform').replace(/.*\(|\)| /g, '').split(',');
			stage = {
				x: stage[stage.length === 16 ? 12 : 4],
				y: stage[stage.length === 16 ? 13 : 5]
			};
		} else {
			stage = this.$stage.position();
			stage = {
				x: this.settings.rtl ? stage.left + this.$stage.width() - this.width() + this.settings.margin : stage.left,
				y: stage.top
			};
		}

		if (this.is('animating')) {
			$.support.transform ? this.animate(stage.x) : this.$stage.stop();
			this.invalidate('position');
		}

		this.$element.toggleClass(this.options.grabClass, event.type === 'mousedown');

		this.speed(0);

		this._drag.time = new Date().getTime();
		this._drag.target = $(event.target);
		this._drag.stage.start = stage;
		this._drag.stage.current = stage;
		this._drag.pointer = this.pointer(event);

		$(document).on('mouseup.owl.core touchend.owl.core', $.proxy(this.onDragEnd, this));

		$(document).one('mousemove.owl.core touchmove.owl.core', $.proxy(function (event) {
			var delta = this.difference(this._drag.pointer, this.pointer(event));

			$(document).on('mousemove.owl.core touchmove.owl.core', $.proxy(this.onDragMove, this));

			if (Math.abs(delta.x) < Math.abs(delta.y) && this.is('valid')) {
				return;
			}

			event.preventDefault();

			this.enter('dragging');
			this.trigger('drag');
		}, this));
	};

	/**
  * Handles the `touchmove` and `mousemove` events.
  * @todo #261
  * @protected
  * @param {Event} event - The event arguments.
  */
	Owl.prototype.onDragMove = function (event) {
		var minimum = null,
		    maximum = null,
		    pull = null,
		    delta = this.difference(this._drag.pointer, this.pointer(event)),
		    stage = this.difference(this._drag.stage.start, delta);

		if (!this.is('dragging')) {
			return;
		}

		event.preventDefault();

		if (this.settings.loop) {
			minimum = this.coordinates(this.minimum());
			maximum = this.coordinates(this.maximum() + 1) - minimum;
			stage.x = ((stage.x - minimum) % maximum + maximum) % maximum + minimum;
		} else {
			minimum = this.settings.rtl ? this.coordinates(this.maximum()) : this.coordinates(this.minimum());
			maximum = this.settings.rtl ? this.coordinates(this.minimum()) : this.coordinates(this.maximum());
			pull = this.settings.pullDrag ? -1 * delta.x / 5 : 0;
			stage.x = Math.max(Math.min(stage.x, minimum + pull), maximum + pull);
		}

		this._drag.stage.current = stage;

		this.animate(stage.x);
	};

	/**
  * Handles the `touchend` and `mouseup` events.
  * @todo #261
  * @todo Threshold for click event
  * @protected
  * @param {Event} event - The event arguments.
  */
	Owl.prototype.onDragEnd = function (event) {
		var delta = this.difference(this._drag.pointer, this.pointer(event)),
		    stage = this._drag.stage.current,
		    direction = delta.x > 0 ^ this.settings.rtl ? 'left' : 'right';

		$(document).off('.owl.core');

		this.$element.removeClass(this.options.grabClass);

		if (delta.x !== 0 && this.is('dragging') || !this.is('valid')) {
			this.speed(this.settings.dragEndSpeed || this.settings.smartSpeed);
			this.current(this.closest(stage.x, delta.x !== 0 ? direction : this._drag.direction));
			this.invalidate('position');
			this.update();

			this._drag.direction = direction;

			if (Math.abs(delta.x) > 3 || new Date().getTime() - this._drag.time > 300) {
				this._drag.target.one('click.owl.core', function () {
					return false;
				});
			}
		}

		if (!this.is('dragging')) {
			return;
		}

		this.leave('dragging');
		this.trigger('dragged');
	};

	/**
  * Gets absolute position of the closest item for a coordinate.
  * @todo Setting `freeDrag` makes `closest` not reusable. See #165.
  * @protected
  * @param {Number} coordinate - The coordinate in pixel.
  * @param {String} direction - The direction to check for the closest item. Ether `left` or `right`.
  * @return {Number} - The absolute position of the closest item.
  */
	Owl.prototype.closest = function (coordinate, direction) {
		var position = -1,
		    pull = 30,
		    width = this.width(),
		    coordinates = this.coordinates();

		if (!this.settings.freeDrag) {
			// check closest item
			$.each(coordinates, $.proxy(function (index, value) {
				// on a left pull, check on current index
				if (direction === 'left' && coordinate > value - pull && coordinate < value + pull) {
					position = index;
					// on a right pull, check on previous index
					// to do so, subtract width from value and set position = index + 1
				} else if (direction === 'right' && coordinate > value - width - pull && coordinate < value - width + pull) {
					position = index + 1;
				} else if (this.op(coordinate, '<', value) && this.op(coordinate, '>', coordinates[index + 1] || value - width)) {
					position = direction === 'left' ? index + 1 : index;
				}
				return position === -1;
			}, this));
		}

		if (!this.settings.loop) {
			// non loop boundries
			if (this.op(coordinate, '>', coordinates[this.minimum()])) {
				position = coordinate = this.minimum();
			} else if (this.op(coordinate, '<', coordinates[this.maximum()])) {
				position = coordinate = this.maximum();
			}
		}

		return position;
	};

	/**
  * Animates the stage.
  * @todo #270
  * @public
  * @param {Number} coordinate - The coordinate in pixels.
  */
	Owl.prototype.animate = function (coordinate) {
		var animate = this.speed() > 0;

		this.is('animating') && this.onTransitionEnd();

		if (animate) {
			this.enter('animating');
			this.trigger('translate');
		}

		if ($.support.transform3d && $.support.transition) {
			this.$stage.css({
				transform: 'translate3d(' + coordinate + 'px,0px,0px)',
				transition: this.speed() / 1000 + 's'
			});
		} else if (animate) {
			this.$stage.animate({
				left: coordinate + 'px'
			}, this.speed(), this.settings.fallbackEasing, $.proxy(this.onTransitionEnd, this));
		} else {
			this.$stage.css({
				left: coordinate + 'px'
			});
		}
	};

	/**
  * Checks whether the carousel is in a specific state or not.
  * @param {String} state - The state to check.
  * @returns {Boolean} - The flag which indicates if the carousel is busy.
  */
	Owl.prototype.is = function (state) {
		return this._states.current[state] && this._states.current[state] > 0;
	};

	/**
  * Sets the absolute position of the current item.
  * @public
  * @param {Number} [position] - The new absolute position or nothing to leave it unchanged.
  * @returns {Number} - The absolute position of the current item.
  */
	Owl.prototype.current = function (position) {
		if (position === undefined) {
			return this._current;
		}

		if (this._items.length === 0) {
			return undefined;
		}

		position = this.normalize(position);

		if (this._current !== position) {
			var event = this.trigger('change', { property: { name: 'position', value: position } });

			if (event.data !== undefined) {
				position = this.normalize(event.data);
			}

			this._current = position;

			this.invalidate('position');

			this.trigger('changed', { property: { name: 'position', value: this._current } });
		}

		return this._current;
	};

	/**
  * Invalidates the given part of the update routine.
  * @param {String} [part] - The part to invalidate.
  * @returns {Array.<String>} - The invalidated parts.
  */
	Owl.prototype.invalidate = function (part) {
		if ($.type(part) === 'string') {
			this._invalidated[part] = true;
			this.is('valid') && this.leave('valid');
		}
		return $.map(this._invalidated, function (v, i) {
			return i;
		});
	};

	/**
  * Resets the absolute position of the current item.
  * @public
  * @param {Number} position - The absolute position of the new item.
  */
	Owl.prototype.reset = function (position) {
		position = this.normalize(position);

		if (position === undefined) {
			return;
		}

		this._speed = 0;
		this._current = position;

		this.suppress(['translate', 'translated']);

		this.animate(this.coordinates(position));

		this.release(['translate', 'translated']);
	};

	/**
  * Normalizes an absolute or a relative position of an item.
  * @public
  * @param {Number} position - The absolute or relative position to normalize.
  * @param {Boolean} [relative=false] - Whether the given position is relative or not.
  * @returns {Number} - The normalized position.
  */
	Owl.prototype.normalize = function (position, relative) {
		var n = this._items.length,
		    m = relative ? 0 : this._clones.length;

		if (!this.isNumeric(position) || n < 1) {
			position = undefined;
		} else if (position < 0 || position >= n + m) {
			position = ((position - m / 2) % n + n) % n + m / 2;
		}

		return position;
	};

	/**
  * Converts an absolute position of an item into a relative one.
  * @public
  * @param {Number} position - The absolute position to convert.
  * @returns {Number} - The converted position.
  */
	Owl.prototype.relative = function (position) {
		position -= this._clones.length / 2;
		return this.normalize(position, true);
	};

	/**
  * Gets the maximum position for the current item.
  * @public
  * @param {Boolean} [relative=false] - Whether to return an absolute position or a relative position.
  * @returns {Number}
  */
	Owl.prototype.maximum = function (relative) {
		var settings = this.settings,
		    maximum = this._coordinates.length,
		    boundary = Math.abs(this._coordinates[maximum - 1]) - this._width,
		    i = -1,
		    j;

		if (settings.loop) {
			maximum = this._clones.length / 2 + this._items.length - 1;
		} else if (settings.autoWidth || settings.merge) {
			// binary search
			while (maximum - i > 1) {
				Math.abs(this._coordinates[j = maximum + i >> 1]) < boundary ? i = j : maximum = j;
			}
		} else if (settings.center) {
			maximum = this._items.length - 1;
		} else {
			maximum = this._items.length - settings.items;
		}

		if (relative) {
			maximum -= this._clones.length / 2;
		}

		return Math.max(maximum, 0);
	};

	/**
  * Gets the minimum position for the current item.
  * @public
  * @param {Boolean} [relative=false] - Whether to return an absolute position or a relative position.
  * @returns {Number}
  */
	Owl.prototype.minimum = function (relative) {
		return relative ? 0 : this._clones.length / 2;
	};

	/**
  * Gets an item at the specified relative position.
  * @public
  * @param {Number} [position] - The relative position of the item.
  * @return {jQuery|Array.<jQuery>} - The item at the given position or all items if no position was given.
  */
	Owl.prototype.items = function (position) {
		if (position === undefined) {
			return this._items.slice();
		}

		position = this.normalize(position, true);
		return this._items[position];
	};

	/**
  * Gets an item at the specified relative position.
  * @public
  * @param {Number} [position] - The relative position of the item.
  * @return {jQuery|Array.<jQuery>} - The item at the given position or all items if no position was given.
  */
	Owl.prototype.mergers = function (position) {
		if (position === undefined) {
			return this._mergers.slice();
		}

		position = this.normalize(position, true);
		return this._mergers[position];
	};

	/**
  * Gets the absolute positions of clones for an item.
  * @public
  * @param {Number} [position] - The relative position of the item.
  * @returns {Array.<Number>} - The absolute positions of clones for the item or all if no position was given.
  */
	Owl.prototype.clones = function (position) {
		var odd = this._clones.length / 2,
		    even = odd + this._items.length,
		    map = function (index) {
			return index % 2 === 0 ? even + index / 2 : odd - (index + 1) / 2;
		};

		if (position === undefined) {
			return $.map(this._clones, function (v, i) {
				return map(i);
			});
		}

		return $.map(this._clones, function (v, i) {
			return v === position ? map(i) : null;
		});
	};

	/**
  * Sets the current animation speed.
  * @public
  * @param {Number} [speed] - The animation speed in milliseconds or nothing to leave it unchanged.
  * @returns {Number} - The current animation speed in milliseconds.
  */
	Owl.prototype.speed = function (speed) {
		if (speed !== undefined) {
			this._speed = speed;
		}

		return this._speed;
	};

	/**
  * Gets the coordinate of an item.
  * @todo The name of this method is missleanding.
  * @public
  * @param {Number} position - The absolute position of the item within `minimum()` and `maximum()`.
  * @returns {Number|Array.<Number>} - The coordinate of the item in pixel or all coordinates.
  */
	Owl.prototype.coordinates = function (position) {
		var multiplier = 1,
		    newPosition = position - 1,
		    coordinate;

		if (position === undefined) {
			return $.map(this._coordinates, $.proxy(function (coordinate, index) {
				return this.coordinates(index);
			}, this));
		}

		if (this.settings.center) {
			if (this.settings.rtl) {
				multiplier = -1;
				newPosition = position + 1;
			}

			coordinate = this._coordinates[position];
			coordinate += (this.width() - coordinate + (this._coordinates[newPosition] || 0)) / 2 * multiplier;
		} else {
			coordinate = this._coordinates[newPosition] || 0;
		}

		coordinate = Math.ceil(coordinate);

		return coordinate;
	};

	/**
  * Calculates the speed for a translation.
  * @protected
  * @param {Number} from - The absolute position of the start item.
  * @param {Number} to - The absolute position of the target item.
  * @param {Number} [factor=undefined] - The time factor in milliseconds.
  * @returns {Number} - The time in milliseconds for the translation.
  */
	Owl.prototype.duration = function (from, to, factor) {
		if (factor === 0) {
			return 0;
		}

		return Math.min(Math.max(Math.abs(to - from), 1), 6) * Math.abs(factor || this.settings.smartSpeed);
	};

	/**
  * Slides to the specified item.
  * @public
  * @param {Number} position - The position of the item.
  * @param {Number} [speed] - The time in milliseconds for the transition.
  */
	Owl.prototype.to = function (position, speed) {
		var current = this.current(),
		    revert = null,
		    distance = position - this.relative(current),
		    direction = (distance > 0) - (distance < 0),
		    items = this._items.length,
		    minimum = this.minimum(),
		    maximum = this.maximum();

		if (this.settings.loop) {
			if (!this.settings.rewind && Math.abs(distance) > items / 2) {
				distance += direction * -1 * items;
			}

			position = current + distance;
			revert = ((position - minimum) % items + items) % items + minimum;

			if (revert !== position && revert - distance <= maximum && revert - distance > 0) {
				current = revert - distance;
				position = revert;
				this.reset(current);
			}
		} else if (this.settings.rewind) {
			maximum += 1;
			position = (position % maximum + maximum) % maximum;
		} else {
			position = Math.max(minimum, Math.min(maximum, position));
		}

		this.speed(this.duration(current, position, speed));
		this.current(position);

		if (this.$element.is(':visible')) {
			this.update();
		}
	};

	/**
  * Slides to the next item.
  * @public
  * @param {Number} [speed] - The time in milliseconds for the transition.
  */
	Owl.prototype.next = function (speed) {
		speed = speed || false;
		this.to(this.relative(this.current()) + 1, speed);
	};

	/**
  * Slides to the previous item.
  * @public
  * @param {Number} [speed] - The time in milliseconds for the transition.
  */
	Owl.prototype.prev = function (speed) {
		speed = speed || false;
		this.to(this.relative(this.current()) - 1, speed);
	};

	/**
  * Handles the end of an animation.
  * @protected
  * @param {Event} event - The event arguments.
  */
	Owl.prototype.onTransitionEnd = function (event) {

		// if css2 animation then event object is undefined
		if (event !== undefined) {
			event.stopPropagation();

			// Catch only owl-stage transitionEnd event
			if ((event.target || event.srcElement || event.originalTarget) !== this.$stage.get(0)) {
				return false;
			}
		}

		this.leave('animating');
		this.trigger('translated');
	};

	/**
  * Gets viewport width.
  * @protected
  * @return {Number} - The width in pixel.
  */
	Owl.prototype.viewport = function () {
		var width;
		if (this.options.responsiveBaseElement !== window) {
			width = $(this.options.responsiveBaseElement).width();
		} else if (window.innerWidth) {
			width = window.innerWidth;
		} else if (document.documentElement && document.documentElement.clientWidth) {
			width = document.documentElement.clientWidth;
		} else {
			throw 'Can not detect viewport width.';
		}
		return width;
	};

	/**
  * Replaces the current content.
  * @public
  * @param {HTMLElement|jQuery|String} content - The new content.
  */
	Owl.prototype.replace = function (content) {
		this.$stage.empty();
		this._items = [];

		if (content) {
			content = content instanceof jQuery ? content : $(content);
		}

		if (this.settings.nestedItemSelector) {
			content = content.find('.' + this.settings.nestedItemSelector);
		}

		content.filter(function () {
			return this.nodeType === 1;
		}).each($.proxy(function (index, item) {
			item = this.prepare(item);
			this.$stage.append(item);
			this._items.push(item);
			this._mergers.push(item.find('[data-merge]').andSelf('[data-merge]').attr('data-merge') * 1 || 1);
		}, this));

		this.reset(this.isNumeric(this.settings.startPosition) ? this.settings.startPosition : 0);

		this.invalidate('items');
	};

	/**
  * Adds an item.
  * @todo Use `item` instead of `content` for the event arguments.
  * @public
  * @param {HTMLElement|jQuery|String} content - The item content to add.
  * @param {Number} [position] - The relative position at which to insert the item otherwise the item will be added to the end.
  */
	Owl.prototype.add = function (content, position) {
		var current = this.relative(this._current);

		position = position === undefined ? this._items.length : this.normalize(position, true);
		content = content instanceof jQuery ? content : $(content);

		this.trigger('add', { content: content, position: position });

		content = this.prepare(content);

		if (this._items.length === 0 || position === this._items.length) {
			this._items.length === 0 && this.$stage.append(content);
			this._items.length !== 0 && this._items[position - 1].after(content);
			this._items.push(content);
			this._mergers.push(content.find('[data-merge]').andSelf('[data-merge]').attr('data-merge') * 1 || 1);
		} else {
			this._items[position].before(content);
			this._items.splice(position, 0, content);
			this._mergers.splice(position, 0, content.find('[data-merge]').andSelf('[data-merge]').attr('data-merge') * 1 || 1);
		}

		this._items[current] && this.reset(this._items[current].index());

		this.invalidate('items');

		this.trigger('added', { content: content, position: position });
	};

	/**
  * Removes an item by its position.
  * @todo Use `item` instead of `content` for the event arguments.
  * @public
  * @param {Number} position - The relative position of the item to remove.
  */
	Owl.prototype.remove = function (position) {
		position = this.normalize(position, true);

		if (position === undefined) {
			return;
		}

		this.trigger('remove', { content: this._items[position], position: position });

		this._items[position].remove();
		this._items.splice(position, 1);
		this._mergers.splice(position, 1);

		this.invalidate('items');

		this.trigger('removed', { content: null, position: position });
	};

	/**
  * Preloads images with auto width.
  * @todo Replace by a more generic approach
  * @protected
  */
	Owl.prototype.preloadAutoWidthImages = function (images) {
		images.each($.proxy(function (i, element) {
			this.enter('pre-loading');
			element = $(element);
			$(new Image()).one('load', $.proxy(function (e) {
				element.attr('src', e.target.src);
				element.css('opacity', 1);
				this.leave('pre-loading');
				!this.is('pre-loading') && !this.is('initializing') && this.refresh();
			}, this)).attr('src', element.attr('src') || element.attr('data-src') || element.attr('data-src-retina'));
		}, this));
	};

	/**
  * Destroys the carousel.
  * @public
  */
	Owl.prototype.destroy = function () {

		this.$element.off('.owl.core');
		this.$stage.off('.owl.core');
		$(document).off('.owl.core');

		if (this.settings.responsive !== false) {
			window.clearTimeout(this.resizeTimer);
			this.off(window, 'resize', this._handlers.onThrottledResize);
		}

		for (var i in this._plugins) {
			this._plugins[i].destroy();
		}

		this.$stage.children('.cloned').remove();

		this.$stage.unwrap();
		this.$stage.children().contents().unwrap();
		this.$stage.children().unwrap();

		this.$element.removeClass(this.options.refreshClass).removeClass(this.options.loadingClass).removeClass(this.options.loadedClass).removeClass(this.options.rtlClass).removeClass(this.options.dragClass).removeClass(this.options.grabClass).attr('class', this.$element.attr('class').replace(new RegExp(this.options.responsiveClass + '-\\S+\\s', 'g'), '')).removeData('owl.carousel');
	};

	/**
  * Operators to calculate right-to-left and left-to-right.
  * @protected
  * @param {Number} [a] - The left side operand.
  * @param {String} [o] - The operator.
  * @param {Number} [b] - The right side operand.
  */
	Owl.prototype.op = function (a, o, b) {
		var rtl = this.settings.rtl;
		switch (o) {
			case '<':
				return rtl ? a > b : a < b;
			case '>':
				return rtl ? a < b : a > b;
			case '>=':
				return rtl ? a <= b : a >= b;
			case '<=':
				return rtl ? a >= b : a <= b;
			default:
				break;
		}
	};

	/**
  * Attaches to an internal event.
  * @protected
  * @param {HTMLElement} element - The event source.
  * @param {String} event - The event name.
  * @param {Function} listener - The event handler to attach.
  * @param {Boolean} capture - Wether the event should be handled at the capturing phase or not.
  */
	Owl.prototype.on = function (element, event, listener, capture) {
		if (element.addEventListener) {
			element.addEventListener(event, listener, capture);
		} else if (element.attachEvent) {
			element.attachEvent('on' + event, listener);
		}
	};

	/**
  * Detaches from an internal event.
  * @protected
  * @param {HTMLElement} element - The event source.
  * @param {String} event - The event name.
  * @param {Function} listener - The attached event handler to detach.
  * @param {Boolean} capture - Wether the attached event handler was registered as a capturing listener or not.
  */
	Owl.prototype.off = function (element, event, listener, capture) {
		if (element.removeEventListener) {
			element.removeEventListener(event, listener, capture);
		} else if (element.detachEvent) {
			element.detachEvent('on' + event, listener);
		}
	};

	/**
  * Triggers a public event.
  * @todo Remove `status`, `relatedTarget` should be used instead.
  * @protected
  * @param {String} name - The event name.
  * @param {*} [data=null] - The event data.
  * @param {String} [namespace=carousel] - The event namespace.
  * @param {String} [state] - The state which is associated with the event.
  * @param {Boolean} [enter=false] - Indicates if the call enters the specified state or not.
  * @returns {Event} - The event arguments.
  */
	Owl.prototype.trigger = function (name, data, namespace, state, enter) {
		var status = {
			item: { count: this._items.length, index: this.current() }
		},
		    handler = $.camelCase($.grep(['on', name, namespace], function (v) {
			return v;
		}).join('-').toLowerCase()),
		    event = $.Event([name, 'owl', namespace || 'carousel'].join('.').toLowerCase(), $.extend({ relatedTarget: this }, status, data));

		if (!this._supress[name]) {
			$.each(this._plugins, function (name, plugin) {
				if (plugin.onTrigger) {
					plugin.onTrigger(event);
				}
			});

			this.register({ type: Owl.Type.Event, name: name });
			this.$element.trigger(event);

			if (this.settings && typeof this.settings[handler] === 'function') {
				this.settings[handler].call(this, event);
			}
		}

		return event;
	};

	/**
  * Enters a state.
  * @param name - The state name.
  */
	Owl.prototype.enter = function (name) {
		$.each([name].concat(this._states.tags[name] || []), $.proxy(function (i, name) {
			if (this._states.current[name] === undefined) {
				this._states.current[name] = 0;
			}

			this._states.current[name]++;
		}, this));
	};

	/**
  * Leaves a state.
  * @param name - The state name.
  */
	Owl.prototype.leave = function (name) {
		$.each([name].concat(this._states.tags[name] || []), $.proxy(function (i, name) {
			this._states.current[name]--;
		}, this));
	};

	/**
  * Registers an event or state.
  * @public
  * @param {Object} object - The event or state to register.
  */
	Owl.prototype.register = function (object) {
		if (object.type === Owl.Type.Event) {
			if (!$.event.special[object.name]) {
				$.event.special[object.name] = {};
			}

			if (!$.event.special[object.name].owl) {
				var _default = $.event.special[object.name]._default;
				$.event.special[object.name]._default = function (e) {
					if (_default && _default.apply && (!e.namespace || e.namespace.indexOf('owl') === -1)) {
						return _default.apply(this, arguments);
					}
					return e.namespace && e.namespace.indexOf('owl') > -1;
				};
				$.event.special[object.name].owl = true;
			}
		} else if (object.type === Owl.Type.State) {
			if (!this._states.tags[object.name]) {
				this._states.tags[object.name] = object.tags;
			} else {
				this._states.tags[object.name] = this._states.tags[object.name].concat(object.tags);
			}

			this._states.tags[object.name] = $.grep(this._states.tags[object.name], $.proxy(function (tag, i) {
				return $.inArray(tag, this._states.tags[object.name]) === i;
			}, this));
		}
	};

	/**
  * Suppresses events.
  * @protected
  * @param {Array.<String>} events - The events to suppress.
  */
	Owl.prototype.suppress = function (events) {
		$.each(events, $.proxy(function (index, event) {
			this._supress[event] = true;
		}, this));
	};

	/**
  * Releases suppressed events.
  * @protected
  * @param {Array.<String>} events - The events to release.
  */
	Owl.prototype.release = function (events) {
		$.each(events, $.proxy(function (index, event) {
			delete this._supress[event];
		}, this));
	};

	/**
  * Gets unified pointer coordinates from event.
  * @todo #261
  * @protected
  * @param {Event} - The `mousedown` or `touchstart` event.
  * @returns {Object} - Contains `x` and `y` coordinates of current pointer position.
  */
	Owl.prototype.pointer = function (event) {
		var result = { x: null, y: null };

		event = event.originalEvent || event || window.event;

		event = event.touches && event.touches.length ? event.touches[0] : event.changedTouches && event.changedTouches.length ? event.changedTouches[0] : event;

		if (event.pageX) {
			result.x = event.pageX;
			result.y = event.pageY;
		} else {
			result.x = event.clientX;
			result.y = event.clientY;
		}

		return result;
	};

	/**
  * Determines if the input is a Number or something that can be coerced to a Number
  * @protected
  * @param {Number|String|Object|Array|Boolean|RegExp|Function|Symbol} - The input to be tested
  * @returns {Boolean} - An indication if the input is a Number or can be coerced to a Number
  */
	Owl.prototype.isNumeric = function (number) {
		return !isNaN(parseFloat(number));
	};

	/**
  * Gets the difference of two vectors.
  * @todo #261
  * @protected
  * @param {Object} - The first vector.
  * @param {Object} - The second vector.
  * @returns {Object} - The difference.
  */
	Owl.prototype.difference = function (first, second) {
		return {
			x: first.x - second.x,
			y: first.y - second.y
		};
	};

	/**
  * The jQuery Plugin for the Owl Carousel
  * @todo Navigation plugin `next` and `prev`
  * @public
  */
	$.fn.owlCarousel = function (option) {
		var args = Array.prototype.slice.call(arguments, 1);

		return this.each(function () {
			var $this = $(this),
			    data = $this.data('owl.carousel');

			if (!data) {
				data = new Owl(this, typeof option == 'object' && option);
				$this.data('owl.carousel', data);

				$.each(['next', 'prev', 'to', 'destroy', 'refresh', 'replace', 'add', 'remove'], function (i, event) {
					data.register({ type: Owl.Type.Event, name: event });
					data.$element.on(event + '.owl.carousel.core', $.proxy(function (e) {
						if (e.namespace && e.relatedTarget !== this) {
							this.suppress([event]);
							data[event].apply(this, [].slice.call(arguments, 1));
							this.release([event]);
						}
					}, data));
				});
			}

			if (typeof option == 'string' && option.charAt(0) !== '_') {
				data[option].apply(data, args);
			}
		});
	};

	/**
  * The constructor for the jQuery Plugin
  * @public
  */
	$.fn.owlCarousel.Constructor = Owl;
})(window.Zepto || window.jQuery, window, document);

/**
 * AutoRefresh Plugin
 * @version 2.1.0
 * @author Artus Kolanowski
 * @author David Deutsch
 * @license The MIT License (MIT)
 */
;(function ($, window, document, undefined) {

	/**
  * Creates the auto refresh plugin.
  * @class The Auto Refresh Plugin
  * @param {Owl} carousel - The Owl Carousel
  */
	var AutoRefresh = function (carousel) {
		/**
   * Reference to the core.
   * @protected
   * @type {Owl}
   */
		this._core = carousel;

		/**
   * Refresh interval.
   * @protected
   * @type {number}
   */
		this._interval = null;

		/**
   * Whether the element is currently visible or not.
   * @protected
   * @type {Boolean}
   */
		this._visible = null;

		/**
   * All event handlers.
   * @protected
   * @type {Object}
   */
		this._handlers = {
			'initialized.owl.carousel': $.proxy(function (e) {
				if (e.namespace && this._core.settings.autoRefresh) {
					this.watch();
				}
			}, this)
		};

		// set default options
		this._core.options = $.extend({}, AutoRefresh.Defaults, this._core.options);

		// register event handlers
		this._core.$element.on(this._handlers);
	};

	/**
  * Default options.
  * @public
  */
	AutoRefresh.Defaults = {
		autoRefresh: true,
		autoRefreshInterval: 500
	};

	/**
  * Watches the element.
  */
	AutoRefresh.prototype.watch = function () {
		if (this._interval) {
			return;
		}

		this._visible = this._core.$element.is(':visible');
		this._interval = window.setInterval($.proxy(this.refresh, this), this._core.settings.autoRefreshInterval);
	};

	/**
  * Refreshes the element.
  */
	AutoRefresh.prototype.refresh = function () {
		if (this._core.$element.is(':visible') === this._visible) {
			return;
		}

		this._visible = !this._visible;

		this._core.$element.toggleClass('owl-hidden', !this._visible);

		this._visible && this._core.invalidate('width') && this._core.refresh();
	};

	/**
  * Destroys the plugin.
  */
	AutoRefresh.prototype.destroy = function () {
		var handler, property;

		window.clearInterval(this._interval);

		for (handler in this._handlers) {
			this._core.$element.off(handler, this._handlers[handler]);
		}
		for (property in Object.getOwnPropertyNames(this)) {
			typeof this[property] != 'function' && (this[property] = null);
		}
	};

	$.fn.owlCarousel.Constructor.Plugins.AutoRefresh = AutoRefresh;
})(window.Zepto || window.jQuery, window, document);

/**
 * Lazy Plugin
 * @version 2.1.0
 * @author Bartosz Wojciechowski
 * @author David Deutsch
 * @license The MIT License (MIT)
 */
;(function ($, window, document, undefined) {

	/**
  * Creates the lazy plugin.
  * @class The Lazy Plugin
  * @param {Owl} carousel - The Owl Carousel
  */
	var Lazy = function (carousel) {

		/**
   * Reference to the core.
   * @protected
   * @type {Owl}
   */
		this._core = carousel;

		/**
   * Already loaded items.
   * @protected
   * @type {Array.<jQuery>}
   */
		this._loaded = [];

		/**
   * Event handlers.
   * @protected
   * @type {Object}
   */
		this._handlers = {
			'initialized.owl.carousel change.owl.carousel resized.owl.carousel': $.proxy(function (e) {
				if (!e.namespace) {
					return;
				}

				if (!this._core.settings || !this._core.settings.lazyLoad) {
					return;
				}

				if (e.property && e.property.name == 'position' || e.type == 'initialized') {
					var settings = this._core.settings,
					    n = settings.center && Math.ceil(settings.items / 2) || settings.items,
					    i = settings.center && n * -1 || 0,
					    position = (e.property && e.property.value !== undefined ? e.property.value : this._core.current()) + i,
					    clones = this._core.clones().length,
					    load = $.proxy(function (i, v) {
						this.load(v);
					}, this);

					while (i++ < n) {
						this.load(clones / 2 + this._core.relative(position));
						clones && $.each(this._core.clones(this._core.relative(position)), load);
						position++;
					}
				}
			}, this)
		};

		// set the default options
		this._core.options = $.extend({}, Lazy.Defaults, this._core.options);

		// register event handler
		this._core.$element.on(this._handlers);
	};

	/**
  * Default options.
  * @public
  */
	Lazy.Defaults = {
		lazyLoad: false
	};

	/**
  * Loads all resources of an item at the specified position.
  * @param {Number} position - The absolute position of the item.
  * @protected
  */
	Lazy.prototype.load = function (position) {
		var $item = this._core.$stage.children().eq(position),
		    $elements = $item && $item.find('.owl-lazy');

		if (!$elements || $.inArray($item.get(0), this._loaded) > -1) {
			return;
		}

		$elements.each($.proxy(function (index, element) {
			var $element = $(element),
			    image,
			    url = window.devicePixelRatio > 1 && $element.attr('data-src-retina') || $element.attr('data-src');

			this._core.trigger('load', { element: $element, url: url }, 'lazy');

			if ($element.is('img')) {
				$element.one('load.owl.lazy', $.proxy(function () {
					$element.css('opacity', 1);
					this._core.trigger('loaded', { element: $element, url: url }, 'lazy');
				}, this)).attr('src', url);
			} else {
				image = new Image();
				image.onload = $.proxy(function () {
					$element.css({
						'background-image': 'url(' + url + ')',
						'opacity': '1'
					});
					this._core.trigger('loaded', { element: $element, url: url }, 'lazy');
				}, this);
				image.src = url;
			}
		}, this));

		this._loaded.push($item.get(0));
	};

	/**
  * Destroys the plugin.
  * @public
  */
	Lazy.prototype.destroy = function () {
		var handler, property;

		for (handler in this.handlers) {
			this._core.$element.off(handler, this.handlers[handler]);
		}
		for (property in Object.getOwnPropertyNames(this)) {
			typeof this[property] != 'function' && (this[property] = null);
		}
	};

	$.fn.owlCarousel.Constructor.Plugins.Lazy = Lazy;
})(window.Zepto || window.jQuery, window, document);

/**
 * AutoHeight Plugin
 * @version 2.1.0
 * @author Bartosz Wojciechowski
 * @author David Deutsch
 * @license The MIT License (MIT)
 */
;(function ($, window, document, undefined) {

	/**
  * Creates the auto height plugin.
  * @class The Auto Height Plugin
  * @param {Owl} carousel - The Owl Carousel
  */
	var AutoHeight = function (carousel) {
		/**
   * Reference to the core.
   * @protected
   * @type {Owl}
   */
		this._core = carousel;

		/**
   * All event handlers.
   * @protected
   * @type {Object}
   */
		this._handlers = {
			'initialized.owl.carousel refreshed.owl.carousel': $.proxy(function (e) {
				if (e.namespace && this._core.settings.autoHeight) {
					this.update();
				}
			}, this),
			'changed.owl.carousel': $.proxy(function (e) {
				if (e.namespace && this._core.settings.autoHeight && e.property.name == 'position') {
					this.update();
				}
			}, this),
			'loaded.owl.lazy': $.proxy(function (e) {
				if (e.namespace && this._core.settings.autoHeight && e.element.closest('.' + this._core.settings.itemClass).index() === this._core.current()) {
					this.update();
				}
			}, this)
		};

		// set default options
		this._core.options = $.extend({}, AutoHeight.Defaults, this._core.options);

		// register event handlers
		this._core.$element.on(this._handlers);
	};

	/**
  * Default options.
  * @public
  */
	AutoHeight.Defaults = {
		autoHeight: false,
		autoHeightClass: 'owl-height'
	};

	/**
  * Updates the view.
  */
	AutoHeight.prototype.update = function () {
		var start = this._core._current,
		    end = start + this._core.settings.items,
		    visible = this._core.$stage.children().toArray().slice(start, end),
		    heights = [],
		    maxheight = 0;

		$.each(visible, function (index, item) {
			heights.push($(item).height());
		});

		maxheight = Math.max.apply(null, heights);

		this._core.$stage.parent().height(maxheight).addClass(this._core.settings.autoHeightClass);
	};

	AutoHeight.prototype.destroy = function () {
		var handler, property;

		for (handler in this._handlers) {
			this._core.$element.off(handler, this._handlers[handler]);
		}
		for (property in Object.getOwnPropertyNames(this)) {
			typeof this[property] != 'function' && (this[property] = null);
		}
	};

	$.fn.owlCarousel.Constructor.Plugins.AutoHeight = AutoHeight;
})(window.Zepto || window.jQuery, window, document);

/**
 * Video Plugin
 * @version 2.1.0
 * @author Bartosz Wojciechowski
 * @author David Deutsch
 * @license The MIT License (MIT)
 */
;(function ($, window, document, undefined) {

	/**
  * Creates the video plugin.
  * @class The Video Plugin
  * @param {Owl} carousel - The Owl Carousel
  */
	var Video = function (carousel) {
		/**
   * Reference to the core.
   * @protected
   * @type {Owl}
   */
		this._core = carousel;

		/**
   * Cache all video URLs.
   * @protected
   * @type {Object}
   */
		this._videos = {};

		/**
   * Current playing item.
   * @protected
   * @type {jQuery}
   */
		this._playing = null;

		/**
   * All event handlers.
   * @todo The cloned content removale is too late
   * @protected
   * @type {Object}
   */
		this._handlers = {
			'initialized.owl.carousel': $.proxy(function (e) {
				if (e.namespace) {
					this._core.register({ type: 'state', name: 'playing', tags: ['interacting'] });
				}
			}, this),
			'resize.owl.carousel': $.proxy(function (e) {
				if (e.namespace && this._core.settings.video && this.isInFullScreen()) {
					e.preventDefault();
				}
			}, this),
			'refreshed.owl.carousel': $.proxy(function (e) {
				if (e.namespace && this._core.is('resizing')) {
					this._core.$stage.find('.cloned .owl-video-frame').remove();
				}
			}, this),
			'changed.owl.carousel': $.proxy(function (e) {
				if (e.namespace && e.property.name === 'position' && this._playing) {
					this.stop();
				}
			}, this),
			'prepared.owl.carousel': $.proxy(function (e) {
				if (!e.namespace) {
					return;
				}

				var $element = $(e.content).find('.owl-video');

				if ($element.length) {
					$element.css('display', 'none');
					this.fetch($element, $(e.content));
				}
			}, this)
		};

		// set default options
		this._core.options = $.extend({}, Video.Defaults, this._core.options);

		// register event handlers
		this._core.$element.on(this._handlers);

		this._core.$element.on('click.owl.video', '.owl-video-play-icon', $.proxy(function (e) {
			this.play(e);
		}, this));
	};

	/**
  * Default options.
  * @public
  */
	Video.Defaults = {
		video: false,
		videoHeight: false,
		videoWidth: false
	};

	/**
  * Gets the video ID and the type (YouTube/Vimeo/vzaar only).
  * @protected
  * @param {jQuery} target - The target containing the video data.
  * @param {jQuery} item - The item containing the video.
  */
	Video.prototype.fetch = function (target, item) {
		var type = function () {
			if (target.attr('data-vimeo-id')) {
				return 'vimeo';
			} else if (target.attr('data-vzaar-id')) {
				return 'vzaar';
			} else {
				return 'youtube';
			}
		}(),
		    id = target.attr('data-vimeo-id') || target.attr('data-youtube-id') || target.attr('data-vzaar-id'),
		    width = target.attr('data-width') || this._core.settings.videoWidth,
		    height = target.attr('data-height') || this._core.settings.videoHeight,
		    url = target.attr('href');

		if (url) {

			/*
   		Parses the id's out of the following urls (and probably more):
   		https://www.youtube.com/watch?v=:id
   		https://youtu.be/:id
   		https://vimeo.com/:id
   		https://vimeo.com/channels/:channel/:id
   		https://vimeo.com/groups/:group/videos/:id
   		https://app.vzaar.com/videos/:id
   			Visual example: https://regexper.com/#(http%3A%7Chttps%3A%7C)%5C%2F%5C%2F(player.%7Cwww.%7Capp.)%3F(vimeo%5C.com%7Cyoutu(be%5C.com%7C%5C.be%7Cbe%5C.googleapis%5C.com)%7Cvzaar%5C.com)%5C%2F(video%5C%2F%7Cvideos%5C%2F%7Cembed%5C%2F%7Cchannels%5C%2F.%2B%5C%2F%7Cgroups%5C%2F.%2B%5C%2F%7Cwatch%5C%3Fv%3D%7Cv%5C%2F)%3F(%5BA-Za-z0-9._%25-%5D*)(%5C%26%5CS%2B)%3F
   */

			id = url.match(/(http:|https:|)\/\/(player.|www.|app.)?(vimeo\.com|youtu(be\.com|\.be|be\.googleapis\.com)|vzaar\.com)\/(video\/|videos\/|embed\/|channels\/.+\/|groups\/.+\/|watch\?v=|v\/)?([A-Za-z0-9._%-]*)(\&\S+)?/);

			if (id[3].indexOf('youtu') > -1) {
				type = 'youtube';
			} else if (id[3].indexOf('vimeo') > -1) {
				type = 'vimeo';
			} else if (id[3].indexOf('vzaar') > -1) {
				type = 'vzaar';
			} else {
				throw new Error('Video URL not supported.');
			}
			id = id[6];
		} else {
			throw new Error('Missing video URL.');
		}

		this._videos[url] = {
			type: type,
			id: id,
			width: width,
			height: height
		};

		item.attr('data-video', url);

		this.thumbnail(target, this._videos[url]);
	};

	/**
  * Creates video thumbnail.
  * @protected
  * @param {jQuery} target - The target containing the video data.
  * @param {Object} info - The video info object.
  * @see `fetch`
  */
	Video.prototype.thumbnail = function (target, video) {
		var tnLink,
		    icon,
		    path,
		    dimensions = video.width && video.height ? 'style="width:' + video.width + 'px;height:' + video.height + 'px;"' : '',
		    customTn = target.find('img'),
		    srcType = 'src',
		    lazyClass = '',
		    settings = this._core.settings,
		    create = function (path) {
			icon = '<div class="owl-video-play-icon"></div>';

			if (settings.lazyLoad) {
				tnLink = '<div class="owl-video-tn ' + lazyClass + '" ' + srcType + '="' + path + '"></div>';
			} else {
				tnLink = '<div class="owl-video-tn" style="opacity:1;background-image:url(' + path + ')"></div>';
			}
			target.after(tnLink);
			target.after(icon);
		};

		// wrap video content into owl-video-wrapper div
		target.wrap('<div class="owl-video-wrapper"' + dimensions + '></div>');

		if (this._core.settings.lazyLoad) {
			srcType = 'data-src';
			lazyClass = 'owl-lazy';
		}

		// custom thumbnail
		if (customTn.length) {
			create(customTn.attr(srcType));
			customTn.remove();
			return false;
		}

		if (video.type === 'youtube') {
			path = "//img.youtube.com/vi/" + video.id + "/hqdefault.jpg";
			create(path);
		} else if (video.type === 'vimeo') {
			$.ajax({
				type: 'GET',
				url: '//vimeo.com/api/v2/video/' + video.id + '.json',
				jsonp: 'callback',
				dataType: 'jsonp',
				success: function (data) {
					path = data[0].thumbnail_large;
					create(path);
				}
			});
		} else if (video.type === 'vzaar') {
			$.ajax({
				type: 'GET',
				url: '//vzaar.com/api/videos/' + video.id + '.json',
				jsonp: 'callback',
				dataType: 'jsonp',
				success: function (data) {
					path = data.framegrab_url;
					create(path);
				}
			});
		}
	};

	/**
  * Stops the current video.
  * @public
  */
	Video.prototype.stop = function () {
		this._core.trigger('stop', null, 'video');
		this._playing.find('.owl-video-frame').remove();
		this._playing.removeClass('owl-video-playing');
		this._playing = null;
		this._core.leave('playing');
		this._core.trigger('stopped', null, 'video');
	};

	/**
  * Starts the current video.
  * @public
  * @param {Event} event - The event arguments.
  */
	Video.prototype.play = function (event) {
		var target = $(event.target),
		    item = target.closest('.' + this._core.settings.itemClass),
		    video = this._videos[item.attr('data-video')],
		    width = video.width || '100%',
		    height = video.height || this._core.$stage.height(),
		    html;

		if (this._playing) {
			return;
		}

		this._core.enter('playing');
		this._core.trigger('play', null, 'video');

		item = this._core.items(this._core.relative(item.index()));

		this._core.reset(item.index());

		if (video.type === 'youtube') {
			html = '<iframe width="' + width + '" height="' + height + '" src="//www.youtube.com/embed/' + video.id + '?autoplay=1&v=' + video.id + '" frameborder="0" allowfullscreen></iframe>';
		} else if (video.type === 'vimeo') {
			html = '<iframe src="//player.vimeo.com/video/' + video.id + '?autoplay=1" width="' + width + '" height="' + height + '" frameborder="0" webkitallowfullscreen mozallowfullscreen allowfullscreen></iframe>';
		} else if (video.type === 'vzaar') {
			html = '<iframe frameborder="0"' + 'height="' + height + '"' + 'width="' + width + '" allowfullscreen mozallowfullscreen webkitAllowFullScreen ' + 'src="//view.vzaar.com/' + video.id + '/player?autoplay=true"></iframe>';
		}

		$('<div class="owl-video-frame">' + html + '</div>').insertAfter(item.find('.owl-video'));

		this._playing = item.addClass('owl-video-playing');
	};

	/**
  * Checks whether an video is currently in full screen mode or not.
  * @todo Bad style because looks like a readonly method but changes members.
  * @protected
  * @returns {Boolean}
  */
	Video.prototype.isInFullScreen = function () {
		var element = document.fullscreenElement || document.mozFullScreenElement || document.webkitFullscreenElement;

		return element && $(element).parent().hasClass('owl-video-frame');
	};

	/**
  * Destroys the plugin.
  */
	Video.prototype.destroy = function () {
		var handler, property;

		this._core.$element.off('click.owl.video');

		for (handler in this._handlers) {
			this._core.$element.off(handler, this._handlers[handler]);
		}
		for (property in Object.getOwnPropertyNames(this)) {
			typeof this[property] != 'function' && (this[property] = null);
		}
	};

	$.fn.owlCarousel.Constructor.Plugins.Video = Video;
})(window.Zepto || window.jQuery, window, document);

/**
 * Animate Plugin
 * @version 2.1.0
 * @author Bartosz Wojciechowski
 * @author David Deutsch
 * @license The MIT License (MIT)
 */
;(function ($, window, document, undefined) {

	/**
  * Creates the animate plugin.
  * @class The Navigation Plugin
  * @param {Owl} scope - The Owl Carousel
  */
	var Animate = function (scope) {
		this.core = scope;
		this.core.options = $.extend({}, Animate.Defaults, this.core.options);
		this.swapping = true;
		this.previous = undefined;
		this.next = undefined;

		this.handlers = {
			'change.owl.carousel': $.proxy(function (e) {
				if (e.namespace && e.property.name == 'position') {
					this.previous = this.core.current();
					this.next = e.property.value;
				}
			}, this),
			'drag.owl.carousel dragged.owl.carousel translated.owl.carousel': $.proxy(function (e) {
				if (e.namespace) {
					this.swapping = e.type == 'translated';
				}
			}, this),
			'translate.owl.carousel': $.proxy(function (e) {
				if (e.namespace && this.swapping && (this.core.options.animateOut || this.core.options.animateIn)) {
					this.swap();
				}
			}, this)
		};

		this.core.$element.on(this.handlers);
	};

	/**
  * Default options.
  * @public
  */
	Animate.Defaults = {
		animateOut: false,
		animateIn: false
	};

	/**
  * Toggles the animation classes whenever an translations starts.
  * @protected
  * @returns {Boolean|undefined}
  */
	Animate.prototype.swap = function () {

		if (this.core.settings.items !== 1) {
			return;
		}

		if (!$.support.animation || !$.support.transition) {
			return;
		}

		this.core.speed(0);

		var left,
		    clear = $.proxy(this.clear, this),
		    previous = this.core.$stage.children().eq(this.previous),
		    next = this.core.$stage.children().eq(this.next),
		    incoming = this.core.settings.animateIn,
		    outgoing = this.core.settings.animateOut;

		if (this.core.current() === this.previous) {
			return;
		}

		if (outgoing) {
			left = this.core.coordinates(this.previous) - this.core.coordinates(this.next);
			previous.one($.support.animation.end, clear).css({ 'left': left + 'px' }).addClass('animated owl-animated-out').addClass(outgoing);
		}

		if (incoming) {
			next.one($.support.animation.end, clear).addClass('animated owl-animated-in').addClass(incoming);
		}
	};

	Animate.prototype.clear = function (e) {
		$(e.target).css({ 'left': '' }).removeClass('animated owl-animated-out owl-animated-in').removeClass(this.core.settings.animateIn).removeClass(this.core.settings.animateOut);
		this.core.onTransitionEnd();
	};

	/**
  * Destroys the plugin.
  * @public
  */
	Animate.prototype.destroy = function () {
		var handler, property;

		for (handler in this.handlers) {
			this.core.$element.off(handler, this.handlers[handler]);
		}
		for (property in Object.getOwnPropertyNames(this)) {
			typeof this[property] != 'function' && (this[property] = null);
		}
	};

	$.fn.owlCarousel.Constructor.Plugins.Animate = Animate;
})(window.Zepto || window.jQuery, window, document);

/**
 * Autoplay Plugin
 * @version 2.1.0
 * @author Bartosz Wojciechowski
 * @author Artus Kolanowski
 * @author David Deutsch
 * @license The MIT License (MIT)
 */
;(function ($, window, document, undefined) {

	/**
  * Creates the autoplay plugin.
  * @class The Autoplay Plugin
  * @param {Owl} scope - The Owl Carousel
  */
	var Autoplay = function (carousel) {
		/**
   * Reference to the core.
   * @protected
   * @type {Owl}
   */
		this._core = carousel;

		/**
   * The autoplay timeout.
   * @type {Timeout}
   */
		this._timeout = null;

		/**
   * Indicates whenever the autoplay is paused.
   * @type {Boolean}
   */
		this._paused = false;

		/**
   * All event handlers.
   * @protected
   * @type {Object}
   */
		this._handlers = {
			'changed.owl.carousel': $.proxy(function (e) {
				if (e.namespace && e.property.name === 'settings') {
					if (this._core.settings.autoplay) {
						this.play();
					} else {
						this.stop();
					}
				} else if (e.namespace && e.property.name === 'position') {
					//console.log('play?', e);
					if (this._core.settings.autoplay) {
						this._setAutoPlayInterval();
					}
				}
			}, this),
			'initialized.owl.carousel': $.proxy(function (e) {
				if (e.namespace && this._core.settings.autoplay) {
					this.play();
				}
			}, this),
			'play.owl.autoplay': $.proxy(function (e, t, s) {
				if (e.namespace) {
					this.play(t, s);
				}
			}, this),
			'stop.owl.autoplay': $.proxy(function (e) {
				if (e.namespace) {
					this.stop();
				}
			}, this),
			'mouseover.owl.autoplay': $.proxy(function () {
				if (this._core.settings.autoplayHoverPause && this._core.is('rotating')) {
					this.pause();
				}
			}, this),
			'mouseleave.owl.autoplay': $.proxy(function () {
				if (this._core.settings.autoplayHoverPause && this._core.is('rotating')) {
					this.play();
				}
			}, this),
			'touchstart.owl.core': $.proxy(function () {
				if (this._core.settings.autoplayHoverPause && this._core.is('rotating')) {
					this.pause();
				}
			}, this),
			'touchend.owl.core': $.proxy(function () {
				if (this._core.settings.autoplayHoverPause) {
					this.play();
				}
			}, this)
		};

		// register event handlers
		this._core.$element.on(this._handlers);

		// set default options
		this._core.options = $.extend({}, Autoplay.Defaults, this._core.options);
	};

	/**
  * Default options.
  * @public
  */
	Autoplay.Defaults = {
		autoplay: false,
		autoplayTimeout: 5000,
		autoplayHoverPause: false,
		autoplaySpeed: false
	};

	/**
  * Starts the autoplay.
  * @public
  * @param {Number} [timeout] - The interval before the next animation starts.
  * @param {Number} [speed] - The animation speed for the animations.
  */
	Autoplay.prototype.play = function (timeout, speed) {
		this._paused = false;

		if (this._core.is('rotating')) {
			return;
		}

		this._core.enter('rotating');

		this._setAutoPlayInterval();
	};

	/**
  * Gets a new timeout
  * @private
  * @param {Number} [timeout] - The interval before the next animation starts.
  * @param {Number} [speed] - The animation speed for the animations.
  * @return {Timeout}
  */
	Autoplay.prototype._getNextTimeout = function (timeout, speed) {
		if (this._timeout) {
			window.clearTimeout(this._timeout);
		}
		return window.setTimeout($.proxy(function () {
			if (this._paused || this._core.is('busy') || this._core.is('interacting') || document.hidden) {
				return;
			}
			this._core.next(speed || this._core.settings.autoplaySpeed);
		}, this), timeout || this._core.settings.autoplayTimeout);
	};

	/**
  * Sets autoplay in motion.
  * @private
  */
	Autoplay.prototype._setAutoPlayInterval = function () {
		this._timeout = this._getNextTimeout();
	};

	/**
  * Stops the autoplay.
  * @public
  */
	Autoplay.prototype.stop = function () {
		if (!this._core.is('rotating')) {
			return;
		}

		window.clearTimeout(this._timeout);
		this._core.leave('rotating');
	};

	/**
  * Stops the autoplay.
  * @public
  */
	Autoplay.prototype.pause = function () {
		if (!this._core.is('rotating')) {
			return;
		}

		this._paused = true;
	};

	/**
  * Destroys the plugin.
  */
	Autoplay.prototype.destroy = function () {
		var handler, property;

		this.stop();

		for (handler in this._handlers) {
			this._core.$element.off(handler, this._handlers[handler]);
		}
		for (property in Object.getOwnPropertyNames(this)) {
			typeof this[property] != 'function' && (this[property] = null);
		}
	};

	$.fn.owlCarousel.Constructor.Plugins.autoplay = Autoplay;
})(window.Zepto || window.jQuery, window, document);

/**
 * Navigation Plugin
 * @version 2.1.0
 * @author Artus Kolanowski
 * @author David Deutsch
 * @license The MIT License (MIT)
 */
;(function ($, window, document, undefined) {
	'use strict';

	/**
  * Creates the navigation plugin.
  * @class The Navigation Plugin
  * @param {Owl} carousel - The Owl Carousel.
  */

	var Navigation = function (carousel) {
		/**
   * Reference to the core.
   * @protected
   * @type {Owl}
   */
		this._core = carousel;

		/**
   * Indicates whether the plugin is initialized or not.
   * @protected
   * @type {Boolean}
   */
		this._initialized = false;

		/**
   * The current paging indexes.
   * @protected
   * @type {Array}
   */
		this._pages = [];

		/**
   * All DOM elements of the user interface.
   * @protected
   * @type {Object}
   */
		this._controls = {};

		/**
   * Markup for an indicator.
   * @protected
   * @type {Array.<String>}
   */
		this._templates = [];

		/**
   * The carousel element.
   * @type {jQuery}
   */
		this.$element = this._core.$element;

		/**
   * Overridden methods of the carousel.
   * @protected
   * @type {Object}
   */
		this._overrides = {
			next: this._core.next,
			prev: this._core.prev,
			to: this._core.to
		};

		/**
   * All event handlers.
   * @protected
   * @type {Object}
   */
		this._handlers = {
			'prepared.owl.carousel': $.proxy(function (e) {
				if (e.namespace && this._core.settings.dotsData) {
					this._templates.push('<div class="' + this._core.settings.dotClass + '">' + $(e.content).find('[data-dot]').addBack('[data-dot]').attr('data-dot') + '</div>');
				}
			}, this),
			'added.owl.carousel': $.proxy(function (e) {
				if (e.namespace && this._core.settings.dotsData) {
					this._templates.splice(e.position, 0, this._templates.pop());
				}
			}, this),
			'remove.owl.carousel': $.proxy(function (e) {
				if (e.namespace && this._core.settings.dotsData) {
					this._templates.splice(e.position, 1);
				}
			}, this),
			'changed.owl.carousel': $.proxy(function (e) {
				if (e.namespace && e.property.name == 'position') {
					this.draw();
				}
			}, this),
			'initialized.owl.carousel': $.proxy(function (e) {
				if (e.namespace && !this._initialized) {
					this._core.trigger('initialize', null, 'navigation');
					this.initialize();
					this.update();
					this.draw();
					this._initialized = true;
					this._core.trigger('initialized', null, 'navigation');
				}
			}, this),
			'refreshed.owl.carousel': $.proxy(function (e) {
				if (e.namespace && this._initialized) {
					this._core.trigger('refresh', null, 'navigation');
					this.update();
					this.draw();
					this._core.trigger('refreshed', null, 'navigation');
				}
			}, this)
		};

		// set default options
		this._core.options = $.extend({}, Navigation.Defaults, this._core.options);

		// register event handlers
		this.$element.on(this._handlers);
	};

	/**
  * Default options.
  * @public
  * @todo Rename `slideBy` to `navBy`
  */
	Navigation.Defaults = {
		nav: false,
		navText: ['prev', 'next'],
		navSpeed: false,
		navElement: 'div',
		navContainer: false,
		navContainerClass: 'owl-nav',
		navClass: ['owl-prev', 'owl-next'],
		slideBy: 1,
		dotClass: 'owl-dot',
		dotsClass: 'owl-dots',
		dots: true,
		dotsEach: false,
		dotsData: false,
		dotsSpeed: false,
		dotsContainer: false
	};

	/**
  * Initializes the layout of the plugin and extends the carousel.
  * @protected
  */
	Navigation.prototype.initialize = function () {
		var override,
		    settings = this._core.settings;

		// create DOM structure for relative navigation
		this._controls.$relative = (settings.navContainer ? $(settings.navContainer) : $('<div>').addClass(settings.navContainerClass).appendTo(this.$element)).addClass('disabled');

		this._controls.$previous = $('<' + settings.navElement + '>').addClass(settings.navClass[0]).html(settings.navText[0]).prependTo(this._controls.$relative).on('click', $.proxy(function (e) {
			this.prev(settings.navSpeed);
		}, this));
		this._controls.$next = $('<' + settings.navElement + '>').addClass(settings.navClass[1]).html(settings.navText[1]).appendTo(this._controls.$relative).on('click', $.proxy(function (e) {
			this.next(settings.navSpeed);
		}, this));

		// create DOM structure for absolute navigation
		if (!settings.dotsData) {
			this._templates = [$('<div>').addClass(settings.dotClass).append($('<span>')).prop('outerHTML')];
		}

		this._controls.$absolute = (settings.dotsContainer ? $(settings.dotsContainer) : $('<div>').addClass(settings.dotsClass).appendTo(this.$element)).addClass('disabled');

		this._controls.$absolute.on('click', 'div', $.proxy(function (e) {
			var index = $(e.target).parent().is(this._controls.$absolute) ? $(e.target).index() : $(e.target).parent().index();

			e.preventDefault();

			this.to(index, settings.dotsSpeed);
		}, this));

		// override public methods of the carousel
		for (override in this._overrides) {
			this._core[override] = $.proxy(this[override], this);
		}
	};

	/**
  * Destroys the plugin.
  * @protected
  */
	Navigation.prototype.destroy = function () {
		var handler, control, property, override;

		for (handler in this._handlers) {
			this.$element.off(handler, this._handlers[handler]);
		}
		for (control in this._controls) {
			this._controls[control].remove();
		}
		for (override in this.overides) {
			this._core[override] = this._overrides[override];
		}
		for (property in Object.getOwnPropertyNames(this)) {
			typeof this[property] != 'function' && (this[property] = null);
		}
	};

	/**
  * Updates the internal state.
  * @protected
  */
	Navigation.prototype.update = function () {
		var i,
		    j,
		    k,
		    lower = this._core.clones().length / 2,
		    upper = lower + this._core.items().length,
		    maximum = this._core.maximum(true),
		    settings = this._core.settings,
		    size = settings.center || settings.autoWidth || settings.dotsData ? 1 : settings.dotsEach || settings.items;

		if (settings.slideBy !== 'page') {
			settings.slideBy = Math.min(settings.slideBy, settings.items);
		}

		if (settings.dots || settings.slideBy == 'page') {
			this._pages = [];

			for (i = lower, j = 0, k = 0; i < upper; i++) {
				if (j >= size || j === 0) {
					this._pages.push({
						start: Math.min(maximum, i - lower),
						end: i - lower + size - 1
					});
					if (Math.min(maximum, i - lower) === maximum) {
						break;
					}
					j = 0, ++k;
				}
				j += this._core.mergers(this._core.relative(i));
			}
		}
	};

	/**
  * Draws the user interface.
  * @todo The option `dotsData` wont work.
  * @protected
  */
	Navigation.prototype.draw = function () {
		var difference,
		    settings = this._core.settings,
		    disabled = this._core.items().length <= settings.items,
		    index = this._core.relative(this._core.current()),
		    loop = settings.loop || settings.rewind;

		this._controls.$relative.toggleClass('disabled', !settings.nav || disabled);

		if (settings.nav) {
			this._controls.$previous.toggleClass('disabled', !loop && index <= this._core.minimum(true));
			this._controls.$next.toggleClass('disabled', !loop && index >= this._core.maximum(true));
		}

		this._controls.$absolute.toggleClass('disabled', !settings.dots || disabled);

		if (settings.dots) {
			difference = this._pages.length - this._controls.$absolute.children().length;

			if (settings.dotsData && difference !== 0) {
				this._controls.$absolute.html(this._templates.join(''));
			} else if (difference > 0) {
				this._controls.$absolute.append(new Array(difference + 1).join(this._templates[0]));
			} else if (difference < 0) {
				this._controls.$absolute.children().slice(difference).remove();
			}

			this._controls.$absolute.find('.active').removeClass('active');
			this._controls.$absolute.children().eq($.inArray(this.current(), this._pages)).addClass('active');
		}
	};

	/**
  * Extends event data.
  * @protected
  * @param {Event} event - The event object which gets thrown.
  */
	Navigation.prototype.onTrigger = function (event) {
		var settings = this._core.settings;

		event.page = {
			index: $.inArray(this.current(), this._pages),
			count: this._pages.length,
			size: settings && (settings.center || settings.autoWidth || settings.dotsData ? 1 : settings.dotsEach || settings.items)
		};
	};

	/**
  * Gets the current page position of the carousel.
  * @protected
  * @returns {Number}
  */
	Navigation.prototype.current = function () {
		var current = this._core.relative(this._core.current());
		return $.grep(this._pages, $.proxy(function (page, index) {
			return page.start <= current && page.end >= current;
		}, this)).pop();
	};

	/**
  * Gets the current succesor/predecessor position.
  * @protected
  * @returns {Number}
  */
	Navigation.prototype.getPosition = function (successor) {
		var position,
		    length,
		    settings = this._core.settings;

		if (settings.slideBy == 'page') {
			position = $.inArray(this.current(), this._pages);
			length = this._pages.length;
			successor ? ++position : --position;
			position = this._pages[(position % length + length) % length].start;
		} else {
			position = this._core.relative(this._core.current());
			length = this._core.items().length;
			successor ? position += settings.slideBy : position -= settings.slideBy;
		}

		return position;
	};

	/**
  * Slides to the next item or page.
  * @public
  * @param {Number} [speed=false] - The time in milliseconds for the transition.
  */
	Navigation.prototype.next = function (speed) {
		$.proxy(this._overrides.to, this._core)(this.getPosition(true), speed);
	};

	/**
  * Slides to the previous item or page.
  * @public
  * @param {Number} [speed=false] - The time in milliseconds for the transition.
  */
	Navigation.prototype.prev = function (speed) {
		$.proxy(this._overrides.to, this._core)(this.getPosition(false), speed);
	};

	/**
  * Slides to the specified item or page.
  * @public
  * @param {Number} position - The position of the item or page.
  * @param {Number} [speed] - The time in milliseconds for the transition.
  * @param {Boolean} [standard=false] - Whether to use the standard behaviour or not.
  */
	Navigation.prototype.to = function (position, speed, standard) {
		var length;

		if (!standard && this._pages.length) {
			length = this._pages.length;
			$.proxy(this._overrides.to, this._core)(this._pages[(position % length + length) % length].start, speed);
		} else {
			$.proxy(this._overrides.to, this._core)(position, speed);
		}
	};

	$.fn.owlCarousel.Constructor.Plugins.Navigation = Navigation;
})(window.Zepto || window.jQuery, window, document);

/**
 * Hash Plugin
 * @version 2.1.0
 * @author Artus Kolanowski
 * @author David Deutsch
 * @license The MIT License (MIT)
 */
;(function ($, window, document, undefined) {
	'use strict';

	/**
  * Creates the hash plugin.
  * @class The Hash Plugin
  * @param {Owl} carousel - The Owl Carousel
  */

	var Hash = function (carousel) {
		/**
   * Reference to the core.
   * @protected
   * @type {Owl}
   */
		this._core = carousel;

		/**
   * Hash index for the items.
   * @protected
   * @type {Object}
   */
		this._hashes = {};

		/**
   * The carousel element.
   * @type {jQuery}
   */
		this.$element = this._core.$element;

		/**
   * All event handlers.
   * @protected
   * @type {Object}
   */
		this._handlers = {
			'initialized.owl.carousel': $.proxy(function (e) {
				if (e.namespace && this._core.settings.startPosition === 'URLHash') {
					$(window).trigger('hashchange.owl.navigation');
				}
			}, this),
			'prepared.owl.carousel': $.proxy(function (e) {
				if (e.namespace) {
					var hash = $(e.content).find('[data-hash]').addBack('[data-hash]').attr('data-hash');

					if (!hash) {
						return;
					}

					this._hashes[hash] = e.content;
				}
			}, this),
			'changed.owl.carousel': $.proxy(function (e) {
				if (e.namespace && e.property.name === 'position') {
					var current = this._core.items(this._core.relative(this._core.current())),
					    hash = $.map(this._hashes, function (item, hash) {
						return item === current ? hash : null;
					}).join();

					if (!hash || window.location.hash.slice(1) === hash) {
						return;
					}

					window.location.hash = hash;
				}
			}, this)
		};

		// set default options
		this._core.options = $.extend({}, Hash.Defaults, this._core.options);

		// register the event handlers
		this.$element.on(this._handlers);

		// register event listener for hash navigation
		$(window).on('hashchange.owl.navigation', $.proxy(function (e) {
			var hash = window.location.hash.substring(1),
			    items = this._core.$stage.children(),
			    position = this._hashes[hash] && items.index(this._hashes[hash]);

			if (position === undefined || position === this._core.current()) {
				return;
			}

			this._core.to(this._core.relative(position), false, true);
		}, this));
	};

	/**
  * Default options.
  * @public
  */
	Hash.Defaults = {
		URLhashListener: false
	};

	/**
  * Destroys the plugin.
  * @public
  */
	Hash.prototype.destroy = function () {
		var handler, property;

		$(window).off('hashchange.owl.navigation');

		for (handler in this._handlers) {
			this._core.$element.off(handler, this._handlers[handler]);
		}
		for (property in Object.getOwnPropertyNames(this)) {
			typeof this[property] != 'function' && (this[property] = null);
		}
	};

	$.fn.owlCarousel.Constructor.Plugins.Hash = Hash;
})(window.Zepto || window.jQuery, window, document);

/**
 * Support Plugin
 *
 * @version 2.1.0
 * @author Vivid Planet Software GmbH
 * @author Artus Kolanowski
 * @author David Deutsch
 * @license The MIT License (MIT)
 */
;(function ($, window, document, undefined) {

	var style = $('<support>').get(0).style,
	    prefixes = 'Webkit Moz O ms'.split(' '),
	    events = {
		transition: {
			end: {
				WebkitTransition: 'webkitTransitionEnd',
				MozTransition: 'transitionend',
				OTransition: 'oTransitionEnd',
				transition: 'transitionend'
			}
		},
		animation: {
			end: {
				WebkitAnimation: 'webkitAnimationEnd',
				MozAnimation: 'animationend',
				OAnimation: 'oAnimationEnd',
				animation: 'animationend'
			}
		}
	},
	    tests = {
		csstransforms: function () {
			return !!test('transform');
		},
		csstransforms3d: function () {
			return !!test('perspective');
		},
		csstransitions: function () {
			return !!test('transition');
		},
		cssanimations: function () {
			return !!test('animation');
		}
	};

	function test(property, prefixed) {
		var result = false,
		    upper = property.charAt(0).toUpperCase() + property.slice(1);

		$.each((property + ' ' + prefixes.join(upper + ' ') + upper).split(' '), function (i, property) {
			if (style[property] !== undefined) {
				result = prefixed ? property : true;
				return false;
			}
		});

		return result;
	}

	function prefixed(property) {
		return test(property, true);
	}

	if (tests.csstransitions()) {
		/* jshint -W053 */
		$.support.transition = new String(prefixed('transition'));
		$.support.transition.end = events.transition.end[$.support.transition];
	}

	if (tests.cssanimations()) {
		/* jshint -W053 */
		$.support.animation = new String(prefixed('animation'));
		$.support.animation.end = events.animation.end[$.support.animation];
	}

	if (tests.csstransforms()) {
		/* jshint -W053 */
		$.support.transform = new String(prefixed('transform'));
		$.support.transform3d = tests.csstransforms3d();
	}
})(window.Zepto || window.jQuery, window, document);

},{}],"/Sites/kisk-mennekes-www-20151019-relaunch-frontend/patternlab/source/js/vendor/picturefill.min.js":[function(require,module,exports){
/*! picturefill - v3.0.2 - 2016-02-12
 * https://scottjehl.github.io/picturefill/
 * Copyright (c) 2016 https://github.com/scottjehl/picturefill/blob/master/Authors.txt; Licensed MIT
 */
!function (a) {
  var b = navigator.userAgent;a.HTMLPictureElement && /ecko/.test(b) && b.match(/rv\:(\d+)/) && RegExp.$1 < 45 && addEventListener("resize", function () {
    var b,
        c = document.createElement("source"),
        d = function (a) {
      var b,
          d,
          e = a.parentNode;"PICTURE" === e.nodeName.toUpperCase() ? (b = c.cloneNode(), e.insertBefore(b, e.firstElementChild), setTimeout(function () {
        e.removeChild(b);
      })) : (!a._pfLastSize || a.offsetWidth > a._pfLastSize) && (a._pfLastSize = a.offsetWidth, d = a.sizes, a.sizes += ",100vw", setTimeout(function () {
        a.sizes = d;
      }));
    },
        e = function () {
      var a,
          b = document.querySelectorAll("picture > img, img[srcset][sizes]");for (a = 0; a < b.length; a++) d(b[a]);
    },
        f = function () {
      clearTimeout(b), b = setTimeout(e, 99);
    },
        g = a.matchMedia && matchMedia("(orientation: landscape)"),
        h = function () {
      f(), g && g.addListener && g.addListener(f);
    };return c.srcset = "data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==", /^[c|i]|d$/.test(document.readyState || "") ? h() : document.addEventListener("DOMContentLoaded", h), f;
  }());
}(window), function (a, b, c) {
  "use strict";
  function d(a) {
    return " " === a || "	" === a || "\n" === a || "\f" === a || "\r" === a;
  }function e(b, c) {
    var d = new a.Image();return d.onerror = function () {
      A[b] = !1, ba();
    }, d.onload = function () {
      A[b] = 1 === d.width, ba();
    }, d.src = c, "pending";
  }function f() {
    M = !1, P = a.devicePixelRatio, N = {}, O = {}, s.DPR = P || 1, Q.width = Math.max(a.innerWidth || 0, z.clientWidth), Q.height = Math.max(a.innerHeight || 0, z.clientHeight), Q.vw = Q.width / 100, Q.vh = Q.height / 100, r = [Q.height, Q.width, P].join("-"), Q.em = s.getEmValue(), Q.rem = Q.em;
  }function g(a, b, c, d) {
    var e, f, g, h;return "saveData" === B.algorithm ? a > 2.7 ? h = c + 1 : (f = b - c, e = Math.pow(a - .6, 1.5), g = f * e, d && (g += .1 * e), h = a + g) : h = c > 1 ? Math.sqrt(a * b) : a, h > c;
  }function h(a) {
    var b,
        c = s.getSet(a),
        d = !1;"pending" !== c && (d = r, c && (b = s.setRes(c), s.applySetCandidate(b, a))), a[s.ns].evaled = d;
  }function i(a, b) {
    return a.res - b.res;
  }function j(a, b, c) {
    var d;return !c && b && (c = a[s.ns].sets, c = c && c[c.length - 1]), d = k(b, c), d && (b = s.makeUrl(b), a[s.ns].curSrc = b, a[s.ns].curCan = d, d.res || aa(d, d.set.sizes)), d;
  }function k(a, b) {
    var c, d, e;if (a && b) for (e = s.parseSet(b), a = s.makeUrl(a), c = 0; c < e.length; c++) if (a === s.makeUrl(e[c].url)) {
      d = e[c];break;
    }return d;
  }function l(a, b) {
    var c,
        d,
        e,
        f,
        g = a.getElementsByTagName("source");for (c = 0, d = g.length; d > c; c++) e = g[c], e[s.ns] = !0, f = e.getAttribute("srcset"), f && b.push({ srcset: f, media: e.getAttribute("media"), type: e.getAttribute("type"), sizes: e.getAttribute("sizes") });
  }function m(a, b) {
    function c(b) {
      var c,
          d = b.exec(a.substring(m));return d ? (c = d[0], m += c.length, c) : void 0;
    }function e() {
      var a,
          c,
          d,
          e,
          f,
          i,
          j,
          k,
          l,
          m = !1,
          o = {};for (e = 0; e < h.length; e++) f = h[e], i = f[f.length - 1], j = f.substring(0, f.length - 1), k = parseInt(j, 10), l = parseFloat(j), X.test(j) && "w" === i ? ((a || c) && (m = !0), 0 === k ? m = !0 : a = k) : Y.test(j) && "x" === i ? ((a || c || d) && (m = !0), 0 > l ? m = !0 : c = l) : X.test(j) && "h" === i ? ((d || c) && (m = !0), 0 === k ? m = !0 : d = k) : m = !0;m || (o.url = g, a && (o.w = a), c && (o.d = c), d && (o.h = d), d || c || a || (o.d = 1), 1 === o.d && (b.has1x = !0), o.set = b, n.push(o));
    }function f() {
      for (c(T), i = "", j = "in descriptor";;) {
        if (k = a.charAt(m), "in descriptor" === j) {
          if (d(k)) i && (h.push(i), i = "", j = "after descriptor");else {
            if ("," === k) return m += 1, i && h.push(i), void e();if ("(" === k) i += k, j = "in parens";else {
              if ("" === k) return i && h.push(i), void e();i += k;
            }
          }
        } else if ("in parens" === j) {
          if (")" === k) i += k, j = "in descriptor";else {
            if ("" === k) return h.push(i), void e();i += k;
          }
        } else if ("after descriptor" === j) if (d(k)) ;else {
          if ("" === k) return void e();j = "in descriptor", m -= 1;
        }m += 1;
      }
    }for (var g, h, i, j, k, l = a.length, m = 0, n = [];;) {
      if (c(U), m >= l) return n;g = c(V), h = [], "," === g.slice(-1) ? (g = g.replace(W, ""), e()) : f();
    }
  }function n(a) {
    function b(a) {
      function b() {
        f && (g.push(f), f = "");
      }function c() {
        g[0] && (h.push(g), g = []);
      }for (var e, f = "", g = [], h = [], i = 0, j = 0, k = !1;;) {
        if (e = a.charAt(j), "" === e) return b(), c(), h;if (k) {
          if ("*" === e && "/" === a[j + 1]) {
            k = !1, j += 2, b();continue;
          }j += 1;
        } else {
          if (d(e)) {
            if (a.charAt(j - 1) && d(a.charAt(j - 1)) || !f) {
              j += 1;continue;
            }if (0 === i) {
              b(), j += 1;continue;
            }e = " ";
          } else if ("(" === e) i += 1;else if (")" === e) i -= 1;else {
            if ("," === e) {
              b(), c(), j += 1;continue;
            }if ("/" === e && "*" === a.charAt(j + 1)) {
              k = !0, j += 2;continue;
            }
          }f += e, j += 1;
        }
      }
    }function c(a) {
      return k.test(a) && parseFloat(a) >= 0 ? !0 : l.test(a) ? !0 : "0" === a || "-0" === a || "+0" === a ? !0 : !1;
    }var e,
        f,
        g,
        h,
        i,
        j,
        k = /^(?:[+-]?[0-9]+|[0-9]*\.[0-9]+)(?:[eE][+-]?[0-9]+)?(?:ch|cm|em|ex|in|mm|pc|pt|px|rem|vh|vmin|vmax|vw)$/i,
        l = /^calc\((?:[0-9a-z \.\+\-\*\/\(\)]+)\)$/i;for (f = b(a), g = f.length, e = 0; g > e; e++) if (h = f[e], i = h[h.length - 1], c(i)) {
      if (j = i, h.pop(), 0 === h.length) return j;if (h = h.join(" "), s.matchesMedia(h)) return j;
    }return "100vw";
  }b.createElement("picture");var o,
      p,
      q,
      r,
      s = {},
      t = !1,
      u = function () {},
      v = b.createElement("img"),
      w = v.getAttribute,
      x = v.setAttribute,
      y = v.removeAttribute,
      z = b.documentElement,
      A = {},
      B = { algorithm: "" },
      C = "data-pfsrc",
      D = C + "set",
      E = navigator.userAgent,
      F = /rident/.test(E) || /ecko/.test(E) && E.match(/rv\:(\d+)/) && RegExp.$1 > 35,
      G = "currentSrc",
      H = /\s+\+?\d+(e\d+)?w/,
      I = /(\([^)]+\))?\s*(.+)/,
      J = a.picturefillCFG,
      K = "position:absolute;left:0;visibility:hidden;display:block;padding:0;border:none;font-size:1em;width:1em;overflow:hidden;clip:rect(0px, 0px, 0px, 0px)",
      L = "font-size:100%!important;",
      M = !0,
      N = {},
      O = {},
      P = a.devicePixelRatio,
      Q = { px: 1, "in": 96 },
      R = b.createElement("a"),
      S = !1,
      T = /^[ \t\n\r\u000c]+/,
      U = /^[, \t\n\r\u000c]+/,
      V = /^[^ \t\n\r\u000c]+/,
      W = /[,]+$/,
      X = /^\d+$/,
      Y = /^-?(?:[0-9]+|[0-9]*\.[0-9]+)(?:[eE][+-]?[0-9]+)?$/,
      Z = function (a, b, c, d) {
    a.addEventListener ? a.addEventListener(b, c, d || !1) : a.attachEvent && a.attachEvent("on" + b, c);
  },
      $ = function (a) {
    var b = {};return function (c) {
      return c in b || (b[c] = a(c)), b[c];
    };
  },
      _ = function () {
    var a = /^([\d\.]+)(em|vw|px)$/,
        b = function () {
      for (var a = arguments, b = 0, c = a[0]; ++b in a;) c = c.replace(a[b], a[++b]);return c;
    },
        c = $(function (a) {
      return "return " + b((a || "").toLowerCase(), /\band\b/g, "&&", /,/g, "||", /min-([a-z-\s]+):/g, "e.$1>=", /max-([a-z-\s]+):/g, "e.$1<=", /calc([^)]+)/g, "($1)", /(\d+[\.]*[\d]*)([a-z]+)/g, "($1 * e.$2)", /^(?!(e.[a-z]|[0-9\.&=|><\+\-\*\(\)\/])).*/gi, "") + ";";
    });return function (b, d) {
      var e;if (!(b in N)) if (N[b] = !1, d && (e = b.match(a))) N[b] = e[1] * Q[e[2]];else try {
        N[b] = new Function("e", c(b))(Q);
      } catch (f) {}return N[b];
    };
  }(),
      aa = function (a, b) {
    return a.w ? (a.cWidth = s.calcListLength(b || "100vw"), a.res = a.w / a.cWidth) : a.res = a.d, a;
  },
      ba = function (a) {
    if (t) {
      var c,
          d,
          e,
          f = a || {};if (f.elements && 1 === f.elements.nodeType && ("IMG" === f.elements.nodeName.toUpperCase() ? f.elements = [f.elements] : (f.context = f.elements, f.elements = null)), c = f.elements || s.qsa(f.context || b, f.reevaluate || f.reselect ? s.sel : s.selShort), e = c.length) {
        for (s.setupRun(f), S = !0, d = 0; e > d; d++) s.fillImg(c[d], f);s.teardownRun(f);
      }
    }
  };o = a.console && console.warn ? function (a) {
    console.warn(a);
  } : u, G in v || (G = "src"), A["image/jpeg"] = !0, A["image/gif"] = !0, A["image/png"] = !0, A["image/svg+xml"] = b.implementation.hasFeature("http://www.w3.org/TR/SVG11/feature#Image", "1.1"), s.ns = ("pf" + new Date().getTime()).substr(0, 9), s.supSrcset = "srcset" in v, s.supSizes = "sizes" in v, s.supPicture = !!a.HTMLPictureElement, s.supSrcset && s.supPicture && !s.supSizes && !function (a) {
    v.srcset = "data:,a", a.src = "data:,a", s.supSrcset = v.complete === a.complete, s.supPicture = s.supSrcset && s.supPicture;
  }(b.createElement("img")), s.supSrcset && !s.supSizes ? !function () {
    var a = "data:image/gif;base64,R0lGODlhAgABAPAAAP///wAAACH5BAAAAAAALAAAAAACAAEAAAICBAoAOw==",
        c = "data:image/gif;base64,R0lGODlhAQABAAAAACH5BAEKAAEALAAAAAABAAEAAAICTAEAOw==",
        d = b.createElement("img"),
        e = function () {
      var a = d.width;2 === a && (s.supSizes = !0), q = s.supSrcset && !s.supSizes, t = !0, setTimeout(ba);
    };d.onload = e, d.onerror = e, d.setAttribute("sizes", "9px"), d.srcset = c + " 1w," + a + " 9w", d.src = c;
  }() : t = !0, s.selShort = "picture>img,img[srcset]", s.sel = s.selShort, s.cfg = B, s.DPR = P || 1, s.u = Q, s.types = A, s.setSize = u, s.makeUrl = $(function (a) {
    return R.href = a, R.href;
  }), s.qsa = function (a, b) {
    return "querySelector" in a ? a.querySelectorAll(b) : [];
  }, s.matchesMedia = function () {
    return a.matchMedia && (matchMedia("(min-width: 0.1em)") || {}).matches ? s.matchesMedia = function (a) {
      return !a || matchMedia(a).matches;
    } : s.matchesMedia = s.mMQ, s.matchesMedia.apply(this, arguments);
  }, s.mMQ = function (a) {
    return a ? _(a) : !0;
  }, s.calcLength = function (a) {
    var b = _(a, !0) || !1;return 0 > b && (b = !1), b;
  }, s.supportsType = function (a) {
    return a ? A[a] : !0;
  }, s.parseSize = $(function (a) {
    var b = (a || "").match(I);return { media: b && b[1], length: b && b[2] };
  }), s.parseSet = function (a) {
    return a.cands || (a.cands = m(a.srcset, a)), a.cands;
  }, s.getEmValue = function () {
    var a;if (!p && (a = b.body)) {
      var c = b.createElement("div"),
          d = z.style.cssText,
          e = a.style.cssText;c.style.cssText = K, z.style.cssText = L, a.style.cssText = L, a.appendChild(c), p = c.offsetWidth, a.removeChild(c), p = parseFloat(p, 10), z.style.cssText = d, a.style.cssText = e;
    }return p || 16;
  }, s.calcListLength = function (a) {
    if (!(a in O) || B.uT) {
      var b = s.calcLength(n(a));O[a] = b ? b : Q.width;
    }return O[a];
  }, s.setRes = function (a) {
    var b;if (a) {
      b = s.parseSet(a);for (var c = 0, d = b.length; d > c; c++) aa(b[c], a.sizes);
    }return b;
  }, s.setRes.res = aa, s.applySetCandidate = function (a, b) {
    if (a.length) {
      var c,
          d,
          e,
          f,
          h,
          k,
          l,
          m,
          n,
          o = b[s.ns],
          p = s.DPR;if (k = o.curSrc || b[G], l = o.curCan || j(b, k, a[0].set), l && l.set === a[0].set && (n = F && !b.complete && l.res - .1 > p, n || (l.cached = !0, l.res >= p && (h = l))), !h) for (a.sort(i), f = a.length, h = a[f - 1], d = 0; f > d; d++) if (c = a[d], c.res >= p) {
        e = d - 1, h = a[e] && (n || k !== s.makeUrl(c.url)) && g(a[e].res, c.res, p, a[e].cached) ? a[e] : c;break;
      }h && (m = s.makeUrl(h.url), o.curSrc = m, o.curCan = h, m !== k && s.setSrc(b, h), s.setSize(b));
    }
  }, s.setSrc = function (a, b) {
    var c;a.src = b.url, "image/svg+xml" === b.set.type && (c = a.style.width, a.style.width = a.offsetWidth + 1 + "px", a.offsetWidth + 1 && (a.style.width = c));
  }, s.getSet = function (a) {
    var b,
        c,
        d,
        e = !1,
        f = a[s.ns].sets;for (b = 0; b < f.length && !e; b++) if (c = f[b], c.srcset && s.matchesMedia(c.media) && (d = s.supportsType(c.type))) {
      "pending" === d && (c = d), e = c;break;
    }return e;
  }, s.parseSets = function (a, b, d) {
    var e,
        f,
        g,
        h,
        i = b && "PICTURE" === b.nodeName.toUpperCase(),
        j = a[s.ns];(j.src === c || d.src) && (j.src = w.call(a, "src"), j.src ? x.call(a, C, j.src) : y.call(a, C)), (j.srcset === c || d.srcset || !s.supSrcset || a.srcset) && (e = w.call(a, "srcset"), j.srcset = e, h = !0), j.sets = [], i && (j.pic = !0, l(b, j.sets)), j.srcset ? (f = { srcset: j.srcset, sizes: w.call(a, "sizes") }, j.sets.push(f), g = (q || j.src) && H.test(j.srcset || ""), g || !j.src || k(j.src, f) || f.has1x || (f.srcset += ", " + j.src, f.cands.push({ url: j.src, d: 1, set: f }))) : j.src && j.sets.push({ srcset: j.src, sizes: null }), j.curCan = null, j.curSrc = c, j.supported = !(i || f && !s.supSrcset || g && !s.supSizes), h && s.supSrcset && !j.supported && (e ? (x.call(a, D, e), a.srcset = "") : y.call(a, D)), j.supported && !j.srcset && (!j.src && a.src || a.src !== s.makeUrl(j.src)) && (null === j.src ? a.removeAttribute("src") : a.src = j.src), j.parsed = !0;
  }, s.fillImg = function (a, b) {
    var c,
        d = b.reselect || b.reevaluate;a[s.ns] || (a[s.ns] = {}), c = a[s.ns], (d || c.evaled !== r) && ((!c.parsed || b.reevaluate) && s.parseSets(a, a.parentNode, b), c.supported ? c.evaled = r : h(a));
  }, s.setupRun = function () {
    (!S || M || P !== a.devicePixelRatio) && f();
  }, s.supPicture ? (ba = u, s.fillImg = u) : !function () {
    var c,
        d = a.attachEvent ? /d$|^c/ : /d$|^c|^i/,
        e = function () {
      var a = b.readyState || "";f = setTimeout(e, "loading" === a ? 200 : 999), b.body && (s.fillImgs(), c = c || d.test(a), c && clearTimeout(f));
    },
        f = setTimeout(e, b.body ? 9 : 99),
        g = function (a, b) {
      var c,
          d,
          e = function () {
        var f = new Date() - d;b > f ? c = setTimeout(e, b - f) : (c = null, a());
      };return function () {
        d = new Date(), c || (c = setTimeout(e, b));
      };
    },
        h = z.clientHeight,
        i = function () {
      M = Math.max(a.innerWidth || 0, z.clientWidth) !== Q.width || z.clientHeight !== h, h = z.clientHeight, M && s.fillImgs();
    };Z(a, "resize", g(i, 99)), Z(b, "readystatechange", e);
  }(), s.picturefill = ba, s.fillImgs = ba, s.teardownRun = u, ba._ = s, a.picturefillCFG = { pf: s, push: function (a) {
      var b = a.shift();"function" == typeof s[b] ? s[b].apply(s, a) : (B[b] = a[0], S && s.fillImgs({ reselect: !0 }));
    } };for (; J && J.length;) a.picturefillCFG.push(J.shift());a.picturefill = ba, "object" == typeof module && "object" == typeof module.exports ? module.exports = ba : "function" == typeof define && define.amd && define("picturefill", function () {
    return ba;
  }), s.supPicture || (A["image/webp"] = e("image/webp", "data:image/webp;base64,UklGRkoAAABXRUJQVlA4WAoAAAAQAAAAAAAAAAAAQUxQSAwAAAABBxAR/Q9ERP8DAABWUDggGAAAADABAJ0BKgEAAQADADQlpAADcAD++/1QAA=="));
}(window, document);

},{}],"/Sites/kisk-mennekes-www-20151019-relaunch-frontend/patternlab/source/js/vendor/select2.min.js":[function(require,module,exports){
/*! Select2 4.0.3 | https://github.com/select2/select2/blob/master/LICENSE.md */!function (a) {
  "function" == typeof define && define.amd ? define(["jquery"], a) : a("object" == typeof exports ? require("jquery") : jQuery);
}(function (a) {
  var b = function () {
    if (a && a.fn && a.fn.select2 && a.fn.select2.amd) var b = a.fn.select2.amd;var b;return function () {
      if (!b || !b.requirejs) {
        b ? c = b : b = {};var a, c, d;!function (b) {
          function e(a, b) {
            return u.call(a, b);
          }function f(a, b) {
            var c,
                d,
                e,
                f,
                g,
                h,
                i,
                j,
                k,
                l,
                m,
                n = b && b.split("/"),
                o = s.map,
                p = o && o["*"] || {};if (a && "." === a.charAt(0)) if (b) {
              for (a = a.split("/"), g = a.length - 1, s.nodeIdCompat && w.test(a[g]) && (a[g] = a[g].replace(w, "")), a = n.slice(0, n.length - 1).concat(a), k = 0; k < a.length; k += 1) if (m = a[k], "." === m) a.splice(k, 1), k -= 1;else if (".." === m) {
                if (1 === k && (".." === a[2] || ".." === a[0])) break;k > 0 && (a.splice(k - 1, 2), k -= 2);
              }a = a.join("/");
            } else 0 === a.indexOf("./") && (a = a.substring(2));if ((n || p) && o) {
              for (c = a.split("/"), k = c.length; k > 0; k -= 1) {
                if (d = c.slice(0, k).join("/"), n) for (l = n.length; l > 0; l -= 1) if (e = o[n.slice(0, l).join("/")], e && (e = e[d])) {
                  f = e, h = k;break;
                }if (f) break;!i && p && p[d] && (i = p[d], j = k);
              }!f && i && (f = i, h = j), f && (c.splice(0, h, f), a = c.join("/"));
            }return a;
          }function g(a, c) {
            return function () {
              var d = v.call(arguments, 0);return "string" != typeof d[0] && 1 === d.length && d.push(null), n.apply(b, d.concat([a, c]));
            };
          }function h(a) {
            return function (b) {
              return f(b, a);
            };
          }function i(a) {
            return function (b) {
              q[a] = b;
            };
          }function j(a) {
            if (e(r, a)) {
              var c = r[a];delete r[a], t[a] = !0, m.apply(b, c);
            }if (!e(q, a) && !e(t, a)) throw new Error("No " + a);return q[a];
          }function k(a) {
            var b,
                c = a ? a.indexOf("!") : -1;return c > -1 && (b = a.substring(0, c), a = a.substring(c + 1, a.length)), [b, a];
          }function l(a) {
            return function () {
              return s && s.config && s.config[a] || {};
            };
          }var m,
              n,
              o,
              p,
              q = {},
              r = {},
              s = {},
              t = {},
              u = Object.prototype.hasOwnProperty,
              v = [].slice,
              w = /\.js$/;o = function (a, b) {
            var c,
                d = k(a),
                e = d[0];return a = d[1], e && (e = f(e, b), c = j(e)), e ? a = c && c.normalize ? c.normalize(a, h(b)) : f(a, b) : (a = f(a, b), d = k(a), e = d[0], a = d[1], e && (c = j(e))), { f: e ? e + "!" + a : a, n: a, pr: e, p: c };
          }, p = { require: function (a) {
              return g(a);
            }, exports: function (a) {
              var b = q[a];return "undefined" != typeof b ? b : q[a] = {};
            }, module: function (a) {
              return { id: a, uri: "", exports: q[a], config: l(a) };
            } }, m = function (a, c, d, f) {
            var h,
                k,
                l,
                m,
                n,
                s,
                u = [],
                v = typeof d;if (f = f || a, "undefined" === v || "function" === v) {
              for (c = !c.length && d.length ? ["require", "exports", "module"] : c, n = 0; n < c.length; n += 1) if (m = o(c[n], f), k = m.f, "require" === k) u[n] = p.require(a);else if ("exports" === k) u[n] = p.exports(a), s = !0;else if ("module" === k) h = u[n] = p.module(a);else if (e(q, k) || e(r, k) || e(t, k)) u[n] = j(k);else {
                if (!m.p) throw new Error(a + " missing " + k);m.p.load(m.n, g(f, !0), i(k), {}), u[n] = q[k];
              }l = d ? d.apply(q[a], u) : void 0, a && (h && h.exports !== b && h.exports !== q[a] ? q[a] = h.exports : l === b && s || (q[a] = l));
            } else a && (q[a] = d);
          }, a = c = n = function (a, c, d, e, f) {
            if ("string" == typeof a) return p[a] ? p[a](c) : j(o(a, c).f);if (!a.splice) {
              if (s = a, s.deps && n(s.deps, s.callback), !c) return;c.splice ? (a = c, c = d, d = null) : a = b;
            }return c = c || function () {}, "function" == typeof d && (d = e, e = f), e ? m(b, a, c, d) : setTimeout(function () {
              m(b, a, c, d);
            }, 4), n;
          }, n.config = function (a) {
            return n(a);
          }, a._defined = q, d = function (a, b, c) {
            if ("string" != typeof a) throw new Error("See almond README: incorrect module build, no module name");b.splice || (c = b, b = []), e(q, a) || e(r, a) || (r[a] = [a, b, c]);
          }, d.amd = { jQuery: !0 };
        }(), b.requirejs = a, b.require = c, b.define = d;
      }
    }(), b.define("almond", function () {}), b.define("jquery", [], function () {
      var b = a || $;return null == b && console && console.error && console.error("Select2: An instance of jQuery or a jQuery-compatible library was not found. Make sure that you are including jQuery before Select2 on your web page."), b;
    }), b.define("select2/utils", ["jquery"], function (a) {
      function b(a) {
        var b = a.prototype,
            c = [];for (var d in b) {
          var e = b[d];"function" == typeof e && "constructor" !== d && c.push(d);
        }return c;
      }var c = {};c.Extend = function (a, b) {
        function c() {
          this.constructor = a;
        }var d = {}.hasOwnProperty;for (var e in b) d.call(b, e) && (a[e] = b[e]);return c.prototype = b.prototype, a.prototype = new c(), a.__super__ = b.prototype, a;
      }, c.Decorate = function (a, c) {
        function d() {
          var b = Array.prototype.unshift,
              d = c.prototype.constructor.length,
              e = a.prototype.constructor;d > 0 && (b.call(arguments, a.prototype.constructor), e = c.prototype.constructor), e.apply(this, arguments);
        }function e() {
          this.constructor = d;
        }var f = b(c),
            g = b(a);c.displayName = a.displayName, d.prototype = new e();for (var h = 0; h < g.length; h++) {
          var i = g[h];d.prototype[i] = a.prototype[i];
        }for (var j = function (a) {
          var b = function () {};(a in d.prototype) && (b = d.prototype[a]);var e = c.prototype[a];return function () {
            var a = Array.prototype.unshift;return a.call(arguments, b), e.apply(this, arguments);
          };
        }, k = 0; k < f.length; k++) {
          var l = f[k];d.prototype[l] = j(l);
        }return d;
      };var d = function () {
        this.listeners = {};
      };return d.prototype.on = function (a, b) {
        this.listeners = this.listeners || {}, a in this.listeners ? this.listeners[a].push(b) : this.listeners[a] = [b];
      }, d.prototype.trigger = function (a) {
        var b = Array.prototype.slice,
            c = b.call(arguments, 1);this.listeners = this.listeners || {}, null == c && (c = []), 0 === c.length && c.push({}), c[0]._type = a, a in this.listeners && this.invoke(this.listeners[a], b.call(arguments, 1)), "*" in this.listeners && this.invoke(this.listeners["*"], arguments);
      }, d.prototype.invoke = function (a, b) {
        for (var c = 0, d = a.length; d > c; c++) a[c].apply(this, b);
      }, c.Observable = d, c.generateChars = function (a) {
        for (var b = "", c = 0; a > c; c++) {
          var d = Math.floor(36 * Math.random());b += d.toString(36);
        }return b;
      }, c.bind = function (a, b) {
        return function () {
          a.apply(b, arguments);
        };
      }, c._convertData = function (a) {
        for (var b in a) {
          var c = b.split("-"),
              d = a;if (1 !== c.length) {
            for (var e = 0; e < c.length; e++) {
              var f = c[e];f = f.substring(0, 1).toLowerCase() + f.substring(1), f in d || (d[f] = {}), e == c.length - 1 && (d[f] = a[b]), d = d[f];
            }delete a[b];
          }
        }return a;
      }, c.hasScroll = function (b, c) {
        var d = a(c),
            e = c.style.overflowX,
            f = c.style.overflowY;return e !== f || "hidden" !== f && "visible" !== f ? "scroll" === e || "scroll" === f ? !0 : d.innerHeight() < c.scrollHeight || d.innerWidth() < c.scrollWidth : !1;
      }, c.escapeMarkup = function (a) {
        var b = { "\\": "&#92;", "&": "&amp;", "<": "&lt;", ">": "&gt;", '"': "&quot;", "'": "&#39;", "/": "&#47;" };return "string" != typeof a ? a : String(a).replace(/[&<>"'\/\\]/g, function (a) {
          return b[a];
        });
      }, c.appendMany = function (b, c) {
        if ("1.7" === a.fn.jquery.substr(0, 3)) {
          var d = a();a.map(c, function (a) {
            d = d.add(a);
          }), c = d;
        }b.append(c);
      }, c;
    }), b.define("select2/results", ["jquery", "./utils"], function (a, b) {
      function c(a, b, d) {
        this.$element = a, this.data = d, this.options = b, c.__super__.constructor.call(this);
      }return b.Extend(c, b.Observable), c.prototype.render = function () {
        var b = a('<ul class="select2-results__options" role="tree"></ul>');return this.options.get("multiple") && b.attr("aria-multiselectable", "true"), this.$results = b, b;
      }, c.prototype.clear = function () {
        this.$results.empty();
      }, c.prototype.displayMessage = function (b) {
        var c = this.options.get("escapeMarkup");this.clear(), this.hideLoading();var d = a('<li role="treeitem" aria-live="assertive" class="select2-results__option"></li>'),
            e = this.options.get("translations").get(b.message);d.append(c(e(b.args))), d[0].className += " select2-results__message", this.$results.append(d);
      }, c.prototype.hideMessages = function () {
        this.$results.find(".select2-results__message").remove();
      }, c.prototype.append = function (a) {
        this.hideLoading();var b = [];if (null == a.results || 0 === a.results.length) return void (0 === this.$results.children().length && this.trigger("results:message", { message: "noResults" }));a.results = this.sort(a.results);for (var c = 0; c < a.results.length; c++) {
          var d = a.results[c],
              e = this.option(d);b.push(e);
        }this.$results.append(b);
      }, c.prototype.position = function (a, b) {
        var c = b.find(".select2-results");c.append(a);
      }, c.prototype.sort = function (a) {
        var b = this.options.get("sorter");return b(a);
      }, c.prototype.highlightFirstItem = function () {
        var a = this.$results.find(".select2-results__option[aria-selected]"),
            b = a.filter("[aria-selected=true]");b.length > 0 ? b.first().trigger("mouseenter") : a.first().trigger("mouseenter"), this.ensureHighlightVisible();
      }, c.prototype.setClasses = function () {
        var b = this;this.data.current(function (c) {
          var d = a.map(c, function (a) {
            return a.id.toString();
          }),
              e = b.$results.find(".select2-results__option[aria-selected]");e.each(function () {
            var b = a(this),
                c = a.data(this, "data"),
                e = "" + c.id;null != c.element && c.element.selected || null == c.element && a.inArray(e, d) > -1 ? b.attr("aria-selected", "true") : b.attr("aria-selected", "false");
          });
        });
      }, c.prototype.showLoading = function (a) {
        this.hideLoading();var b = this.options.get("translations").get("searching"),
            c = { disabled: !0, loading: !0, text: b(a) },
            d = this.option(c);d.className += " loading-results", this.$results.prepend(d);
      }, c.prototype.hideLoading = function () {
        this.$results.find(".loading-results").remove();
      }, c.prototype.option = function (b) {
        var c = document.createElement("li");c.className = "select2-results__option";var d = { role: "treeitem", "aria-selected": "false" };b.disabled && (delete d["aria-selected"], d["aria-disabled"] = "true"), null == b.id && delete d["aria-selected"], null != b._resultId && (c.id = b._resultId), b.title && (c.title = b.title), b.children && (d.role = "group", d["aria-label"] = b.text, delete d["aria-selected"]);for (var e in d) {
          var f = d[e];c.setAttribute(e, f);
        }if (b.children) {
          var g = a(c),
              h = document.createElement("strong");h.className = "select2-results__group";a(h);this.template(b, h);for (var i = [], j = 0; j < b.children.length; j++) {
            var k = b.children[j],
                l = this.option(k);i.push(l);
          }var m = a("<ul></ul>", { "class": "select2-results__options select2-results__options--nested" });m.append(i), g.append(h), g.append(m);
        } else this.template(b, c);return a.data(c, "data", b), c;
      }, c.prototype.bind = function (b, c) {
        var d = this,
            e = b.id + "-results";this.$results.attr("id", e), b.on("results:all", function (a) {
          d.clear(), d.append(a.data), b.isOpen() && (d.setClasses(), d.highlightFirstItem());
        }), b.on("results:append", function (a) {
          d.append(a.data), b.isOpen() && d.setClasses();
        }), b.on("query", function (a) {
          d.hideMessages(), d.showLoading(a);
        }), b.on("select", function () {
          b.isOpen() && (d.setClasses(), d.highlightFirstItem());
        }), b.on("unselect", function () {
          b.isOpen() && (d.setClasses(), d.highlightFirstItem());
        }), b.on("open", function () {
          d.$results.attr("aria-expanded", "true"), d.$results.attr("aria-hidden", "false"), d.setClasses(), d.ensureHighlightVisible();
        }), b.on("close", function () {
          d.$results.attr("aria-expanded", "false"), d.$results.attr("aria-hidden", "true"), d.$results.removeAttr("aria-activedescendant");
        }), b.on("results:toggle", function () {
          var a = d.getHighlightedResults();0 !== a.length && a.trigger("mouseup");
        }), b.on("results:select", function () {
          var a = d.getHighlightedResults();if (0 !== a.length) {
            var b = a.data("data");"true" == a.attr("aria-selected") ? d.trigger("close", {}) : d.trigger("select", { data: b });
          }
        }), b.on("results:previous", function () {
          var a = d.getHighlightedResults(),
              b = d.$results.find("[aria-selected]"),
              c = b.index(a);if (0 !== c) {
            var e = c - 1;0 === a.length && (e = 0);var f = b.eq(e);f.trigger("mouseenter");var g = d.$results.offset().top,
                h = f.offset().top,
                i = d.$results.scrollTop() + (h - g);0 === e ? d.$results.scrollTop(0) : 0 > h - g && d.$results.scrollTop(i);
          }
        }), b.on("results:next", function () {
          var a = d.getHighlightedResults(),
              b = d.$results.find("[aria-selected]"),
              c = b.index(a),
              e = c + 1;if (!(e >= b.length)) {
            var f = b.eq(e);f.trigger("mouseenter");var g = d.$results.offset().top + d.$results.outerHeight(!1),
                h = f.offset().top + f.outerHeight(!1),
                i = d.$results.scrollTop() + h - g;0 === e ? d.$results.scrollTop(0) : h > g && d.$results.scrollTop(i);
          }
        }), b.on("results:focus", function (a) {
          a.element.addClass("select2-results__option--highlighted");
        }), b.on("results:message", function (a) {
          d.displayMessage(a);
        }), a.fn.mousewheel && this.$results.on("mousewheel", function (a) {
          var b = d.$results.scrollTop(),
              c = d.$results.get(0).scrollHeight - b + a.deltaY,
              e = a.deltaY > 0 && b - a.deltaY <= 0,
              f = a.deltaY < 0 && c <= d.$results.height();e ? (d.$results.scrollTop(0), a.preventDefault(), a.stopPropagation()) : f && (d.$results.scrollTop(d.$results.get(0).scrollHeight - d.$results.height()), a.preventDefault(), a.stopPropagation());
        }), this.$results.on("mouseup", ".select2-results__option[aria-selected]", function (b) {
          var c = a(this),
              e = c.data("data");return "true" === c.attr("aria-selected") ? void (d.options.get("multiple") ? d.trigger("unselect", { originalEvent: b, data: e }) : d.trigger("close", {})) : void d.trigger("select", { originalEvent: b, data: e });
        }), this.$results.on("mouseenter", ".select2-results__option[aria-selected]", function (b) {
          var c = a(this).data("data");d.getHighlightedResults().removeClass("select2-results__option--highlighted"), d.trigger("results:focus", { data: c, element: a(this) });
        });
      }, c.prototype.getHighlightedResults = function () {
        var a = this.$results.find(".select2-results__option--highlighted");return a;
      }, c.prototype.destroy = function () {
        this.$results.remove();
      }, c.prototype.ensureHighlightVisible = function () {
        var a = this.getHighlightedResults();if (0 !== a.length) {
          var b = this.$results.find("[aria-selected]"),
              c = b.index(a),
              d = this.$results.offset().top,
              e = a.offset().top,
              f = this.$results.scrollTop() + (e - d),
              g = e - d;f -= 2 * a.outerHeight(!1), 2 >= c ? this.$results.scrollTop(0) : (g > this.$results.outerHeight() || 0 > g) && this.$results.scrollTop(f);
        }
      }, c.prototype.template = function (b, c) {
        var d = this.options.get("templateResult"),
            e = this.options.get("escapeMarkup"),
            f = d(b, c);null == f ? c.style.display = "none" : "string" == typeof f ? c.innerHTML = e(f) : a(c).append(f);
      }, c;
    }), b.define("select2/keys", [], function () {
      var a = { BACKSPACE: 8, TAB: 9, ENTER: 13, SHIFT: 16, CTRL: 17, ALT: 18, ESC: 27, SPACE: 32, PAGE_UP: 33, PAGE_DOWN: 34, END: 35, HOME: 36, LEFT: 37, UP: 38, RIGHT: 39, DOWN: 40, DELETE: 46 };return a;
    }), b.define("select2/selection/base", ["jquery", "../utils", "../keys"], function (a, b, c) {
      function d(a, b) {
        this.$element = a, this.options = b, d.__super__.constructor.call(this);
      }return b.Extend(d, b.Observable), d.prototype.render = function () {
        var b = a('<span class="select2-selection" role="combobox"  aria-haspopup="true" aria-expanded="false"></span>');return this._tabindex = 0, null != this.$element.data("old-tabindex") ? this._tabindex = this.$element.data("old-tabindex") : null != this.$element.attr("tabindex") && (this._tabindex = this.$element.attr("tabindex")), b.attr("title", this.$element.attr("title")), b.attr("tabindex", this._tabindex), this.$selection = b, b;
      }, d.prototype.bind = function (a, b) {
        var d = this,
            e = (a.id + "-container", a.id + "-results");this.container = a, this.$selection.on("focus", function (a) {
          d.trigger("focus", a);
        }), this.$selection.on("blur", function (a) {
          d._handleBlur(a);
        }), this.$selection.on("keydown", function (a) {
          d.trigger("keypress", a), a.which === c.SPACE && a.preventDefault();
        }), a.on("results:focus", function (a) {
          d.$selection.attr("aria-activedescendant", a.data._resultId);
        }), a.on("selection:update", function (a) {
          d.update(a.data);
        }), a.on("open", function () {
          d.$selection.attr("aria-expanded", "true"), d.$selection.attr("aria-owns", e), d._attachCloseHandler(a);
        }), a.on("close", function () {
          d.$selection.attr("aria-expanded", "false"), d.$selection.removeAttr("aria-activedescendant"), d.$selection.removeAttr("aria-owns"), d.$selection.focus(), d._detachCloseHandler(a);
        }), a.on("enable", function () {
          d.$selection.attr("tabindex", d._tabindex);
        }), a.on("disable", function () {
          d.$selection.attr("tabindex", "-1");
        });
      }, d.prototype._handleBlur = function (b) {
        var c = this;window.setTimeout(function () {
          document.activeElement == c.$selection[0] || a.contains(c.$selection[0], document.activeElement) || c.trigger("blur", b);
        }, 1);
      }, d.prototype._attachCloseHandler = function (b) {
        a(document.body).on("mousedown.select2." + b.id, function (b) {
          var c = a(b.target),
              d = c.closest(".select2"),
              e = a(".select2.select2-container--open");e.each(function () {
            var b = a(this);if (this != d[0]) {
              var c = b.data("element");c.select2("close");
            }
          });
        });
      }, d.prototype._detachCloseHandler = function (b) {
        a(document.body).off("mousedown.select2." + b.id);
      }, d.prototype.position = function (a, b) {
        var c = b.find(".selection");c.append(a);
      }, d.prototype.destroy = function () {
        this._detachCloseHandler(this.container);
      }, d.prototype.update = function (a) {
        throw new Error("The `update` method must be defined in child classes.");
      }, d;
    }), b.define("select2/selection/single", ["jquery", "./base", "../utils", "../keys"], function (a, b, c, d) {
      function e() {
        e.__super__.constructor.apply(this, arguments);
      }return c.Extend(e, b), e.prototype.render = function () {
        var a = e.__super__.render.call(this);return a.addClass("select2-selection--single"), a.html('<span class="select2-selection__rendered"></span><span class="select2-selection__arrow" role="presentation"><b role="presentation"></b></span>'), a;
      }, e.prototype.bind = function (a, b) {
        var c = this;e.__super__.bind.apply(this, arguments);var d = a.id + "-container";this.$selection.find(".select2-selection__rendered").attr("id", d), this.$selection.attr("aria-labelledby", d), this.$selection.on("mousedown", function (a) {
          1 === a.which && c.trigger("toggle", { originalEvent: a });
        }), this.$selection.on("focus", function (a) {}), this.$selection.on("blur", function (a) {}), a.on("focus", function (b) {
          a.isOpen() || c.$selection.focus();
        }), a.on("selection:update", function (a) {
          c.update(a.data);
        });
      }, e.prototype.clear = function () {
        this.$selection.find(".select2-selection__rendered").empty();
      }, e.prototype.display = function (a, b) {
        var c = this.options.get("templateSelection"),
            d = this.options.get("escapeMarkup");return d(c(a, b));
      }, e.prototype.selectionContainer = function () {
        return a("<span></span>");
      }, e.prototype.update = function (a) {
        if (0 === a.length) return void this.clear();var b = a[0],
            c = this.$selection.find(".select2-selection__rendered"),
            d = this.display(b, c);c.empty().append(d), c.prop("title", b.title || b.text);
      }, e;
    }), b.define("select2/selection/multiple", ["jquery", "./base", "../utils"], function (a, b, c) {
      function d(a, b) {
        d.__super__.constructor.apply(this, arguments);
      }return c.Extend(d, b), d.prototype.render = function () {
        var a = d.__super__.render.call(this);return a.addClass("select2-selection--multiple"), a.html('<ul class="select2-selection__rendered"></ul>'), a;
      }, d.prototype.bind = function (b, c) {
        var e = this;d.__super__.bind.apply(this, arguments), this.$selection.on("click", function (a) {
          e.trigger("toggle", { originalEvent: a });
        }), this.$selection.on("click", ".select2-selection__choice__remove", function (b) {
          if (!e.options.get("disabled")) {
            var c = a(this),
                d = c.parent(),
                f = d.data("data");e.trigger("unselect", { originalEvent: b, data: f });
          }
        });
      }, d.prototype.clear = function () {
        this.$selection.find(".select2-selection__rendered").empty();
      }, d.prototype.display = function (a, b) {
        var c = this.options.get("templateSelection"),
            d = this.options.get("escapeMarkup");return d(c(a, b));
      }, d.prototype.selectionContainer = function () {
        var b = a('<li class="select2-selection__choice"><span class="select2-selection__choice__remove" role="presentation">&times;</span></li>');return b;
      }, d.prototype.update = function (a) {
        if (this.clear(), 0 !== a.length) {
          for (var b = [], d = 0; d < a.length; d++) {
            var e = a[d],
                f = this.selectionContainer(),
                g = this.display(e, f);f.append(g), f.prop("title", e.title || e.text), f.data("data", e), b.push(f);
          }var h = this.$selection.find(".select2-selection__rendered");c.appendMany(h, b);
        }
      }, d;
    }), b.define("select2/selection/placeholder", ["../utils"], function (a) {
      function b(a, b, c) {
        this.placeholder = this.normalizePlaceholder(c.get("placeholder")), a.call(this, b, c);
      }return b.prototype.normalizePlaceholder = function (a, b) {
        return "string" == typeof b && (b = { id: "", text: b }), b;
      }, b.prototype.createPlaceholder = function (a, b) {
        var c = this.selectionContainer();return c.html(this.display(b)), c.addClass("select2-selection__placeholder").removeClass("select2-selection__choice"), c;
      }, b.prototype.update = function (a, b) {
        var c = 1 == b.length && b[0].id != this.placeholder.id,
            d = b.length > 1;if (d || c) return a.call(this, b);this.clear();var e = this.createPlaceholder(this.placeholder);this.$selection.find(".select2-selection__rendered").append(e);
      }, b;
    }), b.define("select2/selection/allowClear", ["jquery", "../keys"], function (a, b) {
      function c() {}return c.prototype.bind = function (a, b, c) {
        var d = this;a.call(this, b, c), null == this.placeholder && this.options.get("debug") && window.console && console.error && console.error("Select2: The `allowClear` option should be used in combination with the `placeholder` option."), this.$selection.on("mousedown", ".select2-selection__clear", function (a) {
          d._handleClear(a);
        }), b.on("keypress", function (a) {
          d._handleKeyboardClear(a, b);
        });
      }, c.prototype._handleClear = function (a, b) {
        if (!this.options.get("disabled")) {
          var c = this.$selection.find(".select2-selection__clear");if (0 !== c.length) {
            b.stopPropagation();for (var d = c.data("data"), e = 0; e < d.length; e++) {
              var f = { data: d[e] };if (this.trigger("unselect", f), f.prevented) return;
            }this.$element.val(this.placeholder.id).trigger("change"), this.trigger("toggle", {});
          }
        }
      }, c.prototype._handleKeyboardClear = function (a, c, d) {
        d.isOpen() || (c.which == b.DELETE || c.which == b.BACKSPACE) && this._handleClear(c);
      }, c.prototype.update = function (b, c) {
        if (b.call(this, c), !(this.$selection.find(".select2-selection__placeholder").length > 0 || 0 === c.length)) {
          var d = a('<span class="select2-selection__clear">&times;</span>');d.data("data", c), this.$selection.find(".select2-selection__rendered").prepend(d);
        }
      }, c;
    }), b.define("select2/selection/search", ["jquery", "../utils", "../keys"], function (a, b, c) {
      function d(a, b, c) {
        a.call(this, b, c);
      }return d.prototype.render = function (b) {
        var c = a('<li class="select2-search select2-search--inline"><input class="select2-search__field" type="search" tabindex="-1" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false" role="textbox" aria-autocomplete="list" /></li>');this.$searchContainer = c, this.$search = c.find("input");var d = b.call(this);return this._transferTabIndex(), d;
      }, d.prototype.bind = function (a, b, d) {
        var e = this;a.call(this, b, d), b.on("open", function () {
          e.$search.trigger("focus");
        }), b.on("close", function () {
          e.$search.val(""), e.$search.removeAttr("aria-activedescendant"), e.$search.trigger("focus");
        }), b.on("enable", function () {
          e.$search.prop("disabled", !1), e._transferTabIndex();
        }), b.on("disable", function () {
          e.$search.prop("disabled", !0);
        }), b.on("focus", function (a) {
          e.$search.trigger("focus");
        }), b.on("results:focus", function (a) {
          e.$search.attr("aria-activedescendant", a.id);
        }), this.$selection.on("focusin", ".select2-search--inline", function (a) {
          e.trigger("focus", a);
        }), this.$selection.on("focusout", ".select2-search--inline", function (a) {
          e._handleBlur(a);
        }), this.$selection.on("keydown", ".select2-search--inline", function (a) {
          a.stopPropagation(), e.trigger("keypress", a), e._keyUpPrevented = a.isDefaultPrevented();var b = a.which;if (b === c.BACKSPACE && "" === e.$search.val()) {
            var d = e.$searchContainer.prev(".select2-selection__choice");if (d.length > 0) {
              var f = d.data("data");e.searchRemoveChoice(f), a.preventDefault();
            }
          }
        });var f = document.documentMode,
            g = f && 11 >= f;this.$selection.on("input.searchcheck", ".select2-search--inline", function (a) {
          return g ? void e.$selection.off("input.search input.searchcheck") : void e.$selection.off("keyup.search");
        }), this.$selection.on("keyup.search input.search", ".select2-search--inline", function (a) {
          if (g && "input" === a.type) return void e.$selection.off("input.search input.searchcheck");var b = a.which;b != c.SHIFT && b != c.CTRL && b != c.ALT && b != c.TAB && e.handleSearch(a);
        });
      }, d.prototype._transferTabIndex = function (a) {
        this.$search.attr("tabindex", this.$selection.attr("tabindex")), this.$selection.attr("tabindex", "-1");
      }, d.prototype.createPlaceholder = function (a, b) {
        this.$search.attr("placeholder", b.text);
      }, d.prototype.update = function (a, b) {
        var c = this.$search[0] == document.activeElement;this.$search.attr("placeholder", ""), a.call(this, b), this.$selection.find(".select2-selection__rendered").append(this.$searchContainer), this.resizeSearch(), c && this.$search.focus();
      }, d.prototype.handleSearch = function () {
        if (this.resizeSearch(), !this._keyUpPrevented) {
          var a = this.$search.val();this.trigger("query", { term: a });
        }this._keyUpPrevented = !1;
      }, d.prototype.searchRemoveChoice = function (a, b) {
        this.trigger("unselect", { data: b }), this.$search.val(b.text), this.handleSearch();
      }, d.prototype.resizeSearch = function () {
        this.$search.css("width", "25px");var a = "";if ("" !== this.$search.attr("placeholder")) a = this.$selection.find(".select2-selection__rendered").innerWidth();else {
          var b = this.$search.val().length + 1;a = .75 * b + "em";
        }this.$search.css("width", a);
      }, d;
    }), b.define("select2/selection/eventRelay", ["jquery"], function (a) {
      function b() {}return b.prototype.bind = function (b, c, d) {
        var e = this,
            f = ["open", "opening", "close", "closing", "select", "selecting", "unselect", "unselecting"],
            g = ["opening", "closing", "selecting", "unselecting"];b.call(this, c, d), c.on("*", function (b, c) {
          if (-1 !== a.inArray(b, f)) {
            c = c || {};var d = a.Event("select2:" + b, { params: c });e.$element.trigger(d), -1 !== a.inArray(b, g) && (c.prevented = d.isDefaultPrevented());
          }
        });
      }, b;
    }), b.define("select2/translation", ["jquery", "require"], function (a, b) {
      function c(a) {
        this.dict = a || {};
      }return c.prototype.all = function () {
        return this.dict;
      }, c.prototype.get = function (a) {
        return this.dict[a];
      }, c.prototype.extend = function (b) {
        this.dict = a.extend({}, b.all(), this.dict);
      }, c._cache = {}, c.loadPath = function (a) {
        if (!(a in c._cache)) {
          var d = b(a);c._cache[a] = d;
        }return new c(c._cache[a]);
      }, c;
    }), b.define("select2/diacritics", [], function () {
      var a = { "Ⓐ": "A", "Ａ": "A", "À": "A", "Á": "A", "Â": "A", "Ầ": "A", "Ấ": "A", "Ẫ": "A", "Ẩ": "A", "Ã": "A", "Ā": "A", "Ă": "A", "Ằ": "A", "Ắ": "A", "Ẵ": "A", "Ẳ": "A", "Ȧ": "A", "Ǡ": "A", "Ä": "A", "Ǟ": "A", "Ả": "A", "Å": "A", "Ǻ": "A", "Ǎ": "A", "Ȁ": "A", "Ȃ": "A", "Ạ": "A", "Ậ": "A", "Ặ": "A", "Ḁ": "A", "Ą": "A", "Ⱥ": "A", "Ɐ": "A", "Ꜳ": "AA", "Æ": "AE", "Ǽ": "AE", "Ǣ": "AE", "Ꜵ": "AO", "Ꜷ": "AU", "Ꜹ": "AV", "Ꜻ": "AV", "Ꜽ": "AY", "Ⓑ": "B", "Ｂ": "B", "Ḃ": "B", "Ḅ": "B", "Ḇ": "B", "Ƀ": "B", "Ƃ": "B", "Ɓ": "B", "Ⓒ": "C", "Ｃ": "C", "Ć": "C", "Ĉ": "C", "Ċ": "C", "Č": "C", "Ç": "C", "Ḉ": "C", "Ƈ": "C", "Ȼ": "C", "Ꜿ": "C", "Ⓓ": "D", "Ｄ": "D", "Ḋ": "D", "Ď": "D", "Ḍ": "D", "Ḑ": "D", "Ḓ": "D", "Ḏ": "D", "Đ": "D", "Ƌ": "D", "Ɗ": "D", "Ɖ": "D", "Ꝺ": "D", "Ǳ": "DZ", "Ǆ": "DZ", "ǲ": "Dz", "ǅ": "Dz", "Ⓔ": "E", "Ｅ": "E", "È": "E", "É": "E", "Ê": "E", "Ề": "E", "Ế": "E", "Ễ": "E", "Ể": "E", "Ẽ": "E", "Ē": "E", "Ḕ": "E", "Ḗ": "E", "Ĕ": "E", "Ė": "E", "Ë": "E", "Ẻ": "E", "Ě": "E", "Ȅ": "E", "Ȇ": "E", "Ẹ": "E", "Ệ": "E", "Ȩ": "E", "Ḝ": "E", "Ę": "E", "Ḙ": "E", "Ḛ": "E", "Ɛ": "E", "Ǝ": "E", "Ⓕ": "F", "Ｆ": "F", "Ḟ": "F", "Ƒ": "F", "Ꝼ": "F", "Ⓖ": "G", "Ｇ": "G", "Ǵ": "G", "Ĝ": "G", "Ḡ": "G", "Ğ": "G", "Ġ": "G", "Ǧ": "G", "Ģ": "G", "Ǥ": "G", "Ɠ": "G", "Ꞡ": "G", "Ᵹ": "G", "Ꝿ": "G", "Ⓗ": "H", "Ｈ": "H", "Ĥ": "H", "Ḣ": "H", "Ḧ": "H", "Ȟ": "H", "Ḥ": "H", "Ḩ": "H", "Ḫ": "H", "Ħ": "H", "Ⱨ": "H", "Ⱶ": "H", "Ɥ": "H", "Ⓘ": "I", "Ｉ": "I", "Ì": "I", "Í": "I", "Î": "I", "Ĩ": "I", "Ī": "I", "Ĭ": "I", "İ": "I", "Ï": "I", "Ḯ": "I", "Ỉ": "I", "Ǐ": "I", "Ȉ": "I", "Ȋ": "I", "Ị": "I", "Į": "I", "Ḭ": "I", "Ɨ": "I", "Ⓙ": "J", "Ｊ": "J", "Ĵ": "J", "Ɉ": "J", "Ⓚ": "K", "Ｋ": "K", "Ḱ": "K", "Ǩ": "K", "Ḳ": "K", "Ķ": "K", "Ḵ": "K", "Ƙ": "K", "Ⱪ": "K", "Ꝁ": "K", "Ꝃ": "K", "Ꝅ": "K", "Ꞣ": "K", "Ⓛ": "L", "Ｌ": "L", "Ŀ": "L", "Ĺ": "L", "Ľ": "L", "Ḷ": "L", "Ḹ": "L", "Ļ": "L", "Ḽ": "L", "Ḻ": "L", "Ł": "L", "Ƚ": "L", "Ɫ": "L", "Ⱡ": "L", "Ꝉ": "L", "Ꝇ": "L", "Ꞁ": "L", "Ǉ": "LJ", "ǈ": "Lj", "Ⓜ": "M", "Ｍ": "M", "Ḿ": "M", "Ṁ": "M", "Ṃ": "M", "Ɱ": "M", "Ɯ": "M", "Ⓝ": "N", "Ｎ": "N", "Ǹ": "N", "Ń": "N", "Ñ": "N", "Ṅ": "N", "Ň": "N", "Ṇ": "N", "Ņ": "N", "Ṋ": "N", "Ṉ": "N", "Ƞ": "N", "Ɲ": "N", "Ꞑ": "N", "Ꞥ": "N", "Ǌ": "NJ", "ǋ": "Nj", "Ⓞ": "O", "Ｏ": "O", "Ò": "O", "Ó": "O", "Ô": "O", "Ồ": "O", "Ố": "O", "Ỗ": "O", "Ổ": "O", "Õ": "O", "Ṍ": "O", "Ȭ": "O", "Ṏ": "O", "Ō": "O", "Ṑ": "O", "Ṓ": "O", "Ŏ": "O", "Ȯ": "O", "Ȱ": "O", "Ö": "O", "Ȫ": "O", "Ỏ": "O", "Ő": "O", "Ǒ": "O", "Ȍ": "O", "Ȏ": "O", "Ơ": "O", "Ờ": "O", "Ớ": "O", "Ỡ": "O", "Ở": "O", "Ợ": "O", "Ọ": "O", "Ộ": "O", "Ǫ": "O", "Ǭ": "O", "Ø": "O", "Ǿ": "O", "Ɔ": "O", "Ɵ": "O", "Ꝋ": "O", "Ꝍ": "O", "Ƣ": "OI", "Ꝏ": "OO", "Ȣ": "OU", "Ⓟ": "P", "Ｐ": "P", "Ṕ": "P", "Ṗ": "P", "Ƥ": "P", "Ᵽ": "P", "Ꝑ": "P", "Ꝓ": "P", "Ꝕ": "P", "Ⓠ": "Q", "Ｑ": "Q", "Ꝗ": "Q", "Ꝙ": "Q", "Ɋ": "Q", "Ⓡ": "R", "Ｒ": "R", "Ŕ": "R", "Ṙ": "R", "Ř": "R", "Ȑ": "R", "Ȓ": "R", "Ṛ": "R", "Ṝ": "R", "Ŗ": "R", "Ṟ": "R", "Ɍ": "R", "Ɽ": "R", "Ꝛ": "R", "Ꞧ": "R", "Ꞃ": "R", "Ⓢ": "S", "Ｓ": "S", "ẞ": "S", "Ś": "S", "Ṥ": "S", "Ŝ": "S", "Ṡ": "S", "Š": "S", "Ṧ": "S", "Ṣ": "S", "Ṩ": "S", "Ș": "S", "Ş": "S", "Ȿ": "S", "Ꞩ": "S", "Ꞅ": "S", "Ⓣ": "T", "Ｔ": "T", "Ṫ": "T", "Ť": "T", "Ṭ": "T", "Ț": "T", "Ţ": "T", "Ṱ": "T", "Ṯ": "T", "Ŧ": "T", "Ƭ": "T", "Ʈ": "T", "Ⱦ": "T", "Ꞇ": "T", "Ꜩ": "TZ", "Ⓤ": "U", "Ｕ": "U", "Ù": "U", "Ú": "U", "Û": "U", "Ũ": "U", "Ṹ": "U", "Ū": "U", "Ṻ": "U", "Ŭ": "U", "Ü": "U", "Ǜ": "U", "Ǘ": "U", "Ǖ": "U", "Ǚ": "U", "Ủ": "U", "Ů": "U", "Ű": "U", "Ǔ": "U", "Ȕ": "U", "Ȗ": "U", "Ư": "U", "Ừ": "U", "Ứ": "U", "Ữ": "U", "Ử": "U", "Ự": "U", "Ụ": "U", "Ṳ": "U", "Ų": "U", "Ṷ": "U", "Ṵ": "U", "Ʉ": "U", "Ⓥ": "V", "Ｖ": "V", "Ṽ": "V", "Ṿ": "V", "Ʋ": "V", "Ꝟ": "V", "Ʌ": "V", "Ꝡ": "VY", "Ⓦ": "W", "Ｗ": "W", "Ẁ": "W", "Ẃ": "W", "Ŵ": "W", "Ẇ": "W", "Ẅ": "W", "Ẉ": "W", "Ⱳ": "W", "Ⓧ": "X", "Ｘ": "X", "Ẋ": "X", "Ẍ": "X", "Ⓨ": "Y", "Ｙ": "Y", "Ỳ": "Y", "Ý": "Y", "Ŷ": "Y", "Ỹ": "Y", "Ȳ": "Y", "Ẏ": "Y", "Ÿ": "Y", "Ỷ": "Y", "Ỵ": "Y", "Ƴ": "Y", "Ɏ": "Y", "Ỿ": "Y", "Ⓩ": "Z", "Ｚ": "Z", "Ź": "Z", "Ẑ": "Z", "Ż": "Z", "Ž": "Z", "Ẓ": "Z", "Ẕ": "Z", "Ƶ": "Z", "Ȥ": "Z", "Ɀ": "Z", "Ⱬ": "Z", "Ꝣ": "Z", "ⓐ": "a", "ａ": "a", "ẚ": "a", "à": "a", "á": "a", "â": "a", "ầ": "a", "ấ": "a", "ẫ": "a", "ẩ": "a", "ã": "a", "ā": "a", "ă": "a", "ằ": "a", "ắ": "a", "ẵ": "a", "ẳ": "a", "ȧ": "a", "ǡ": "a", "ä": "a", "ǟ": "a", "ả": "a", "å": "a", "ǻ": "a", "ǎ": "a", "ȁ": "a", "ȃ": "a", "ạ": "a", "ậ": "a", "ặ": "a", "ḁ": "a", "ą": "a", "ⱥ": "a", "ɐ": "a", "ꜳ": "aa", "æ": "ae", "ǽ": "ae", "ǣ": "ae", "ꜵ": "ao", "ꜷ": "au", "ꜹ": "av", "ꜻ": "av", "ꜽ": "ay", "ⓑ": "b", "ｂ": "b", "ḃ": "b", "ḅ": "b", "ḇ": "b", "ƀ": "b", "ƃ": "b", "ɓ": "b", "ⓒ": "c", "ｃ": "c", "ć": "c", "ĉ": "c", "ċ": "c", "č": "c", "ç": "c", "ḉ": "c", "ƈ": "c", "ȼ": "c", "ꜿ": "c", "ↄ": "c", "ⓓ": "d", "ｄ": "d", "ḋ": "d", "ď": "d", "ḍ": "d", "ḑ": "d", "ḓ": "d", "ḏ": "d", "đ": "d", "ƌ": "d", "ɖ": "d", "ɗ": "d", "ꝺ": "d", "ǳ": "dz", "ǆ": "dz", "ⓔ": "e", "ｅ": "e", "è": "e", "é": "e", "ê": "e", "ề": "e", "ế": "e", "ễ": "e", "ể": "e", "ẽ": "e", "ē": "e", "ḕ": "e", "ḗ": "e", "ĕ": "e", "ė": "e", "ë": "e", "ẻ": "e", "ě": "e", "ȅ": "e", "ȇ": "e", "ẹ": "e", "ệ": "e", "ȩ": "e", "ḝ": "e", "ę": "e", "ḙ": "e", "ḛ": "e", "ɇ": "e", "ɛ": "e", "ǝ": "e", "ⓕ": "f", "ｆ": "f", "ḟ": "f", "ƒ": "f", "ꝼ": "f", "ⓖ": "g", "ｇ": "g", "ǵ": "g", "ĝ": "g", "ḡ": "g", "ğ": "g", "ġ": "g", "ǧ": "g", "ģ": "g", "ǥ": "g", "ɠ": "g", "ꞡ": "g", "ᵹ": "g", "ꝿ": "g", "ⓗ": "h", "ｈ": "h", "ĥ": "h", "ḣ": "h", "ḧ": "h", "ȟ": "h", "ḥ": "h", "ḩ": "h", "ḫ": "h", "ẖ": "h", "ħ": "h", "ⱨ": "h", "ⱶ": "h", "ɥ": "h", "ƕ": "hv", "ⓘ": "i", "ｉ": "i", "ì": "i", "í": "i", "î": "i", "ĩ": "i", "ī": "i", "ĭ": "i", "ï": "i", "ḯ": "i", "ỉ": "i", "ǐ": "i", "ȉ": "i", "ȋ": "i", "ị": "i", "į": "i", "ḭ": "i", "ɨ": "i", "ı": "i", "ⓙ": "j", "ｊ": "j", "ĵ": "j", "ǰ": "j", "ɉ": "j", "ⓚ": "k", "ｋ": "k", "ḱ": "k", "ǩ": "k", "ḳ": "k", "ķ": "k", "ḵ": "k", "ƙ": "k", "ⱪ": "k", "ꝁ": "k", "ꝃ": "k", "ꝅ": "k", "ꞣ": "k", "ⓛ": "l", "ｌ": "l", "ŀ": "l", "ĺ": "l", "ľ": "l", "ḷ": "l", "ḹ": "l", "ļ": "l", "ḽ": "l", "ḻ": "l", "ſ": "l", "ł": "l", "ƚ": "l", "ɫ": "l", "ⱡ": "l", "ꝉ": "l", "ꞁ": "l", "ꝇ": "l", "ǉ": "lj", "ⓜ": "m", "ｍ": "m", "ḿ": "m", "ṁ": "m", "ṃ": "m", "ɱ": "m", "ɯ": "m", "ⓝ": "n", "ｎ": "n", "ǹ": "n", "ń": "n", "ñ": "n", "ṅ": "n", "ň": "n", "ṇ": "n", "ņ": "n", "ṋ": "n", "ṉ": "n", "ƞ": "n", "ɲ": "n", "ŉ": "n", "ꞑ": "n", "ꞥ": "n", "ǌ": "nj", "ⓞ": "o", "ｏ": "o", "ò": "o", "ó": "o", "ô": "o", "ồ": "o", "ố": "o", "ỗ": "o", "ổ": "o", "õ": "o", "ṍ": "o", "ȭ": "o", "ṏ": "o", "ō": "o", "ṑ": "o", "ṓ": "o", "ŏ": "o", "ȯ": "o", "ȱ": "o", "ö": "o", "ȫ": "o", "ỏ": "o", "ő": "o", "ǒ": "o", "ȍ": "o", "ȏ": "o", "ơ": "o", "ờ": "o", "ớ": "o", "ỡ": "o", "ở": "o", "ợ": "o", "ọ": "o", "ộ": "o", "ǫ": "o", "ǭ": "o", "ø": "o", "ǿ": "o", "ɔ": "o", "ꝋ": "o", "ꝍ": "o", "ɵ": "o", "ƣ": "oi", "ȣ": "ou", "ꝏ": "oo", "ⓟ": "p", "ｐ": "p", "ṕ": "p", "ṗ": "p", "ƥ": "p", "ᵽ": "p", "ꝑ": "p", "ꝓ": "p", "ꝕ": "p", "ⓠ": "q", "ｑ": "q", "ɋ": "q", "ꝗ": "q", "ꝙ": "q", "ⓡ": "r", "ｒ": "r", "ŕ": "r", "ṙ": "r", "ř": "r", "ȑ": "r", "ȓ": "r", "ṛ": "r", "ṝ": "r", "ŗ": "r", "ṟ": "r", "ɍ": "r", "ɽ": "r", "ꝛ": "r", "ꞧ": "r", "ꞃ": "r", "ⓢ": "s", "ｓ": "s", "ß": "s", "ś": "s", "ṥ": "s", "ŝ": "s", "ṡ": "s", "š": "s", "ṧ": "s", "ṣ": "s", "ṩ": "s", "ș": "s", "ş": "s", "ȿ": "s", "ꞩ": "s", "ꞅ": "s", "ẛ": "s", "ⓣ": "t", "ｔ": "t", "ṫ": "t", "ẗ": "t", "ť": "t", "ṭ": "t", "ț": "t", "ţ": "t", "ṱ": "t", "ṯ": "t", "ŧ": "t", "ƭ": "t", "ʈ": "t", "ⱦ": "t", "ꞇ": "t", "ꜩ": "tz", "ⓤ": "u", "ｕ": "u", "ù": "u", "ú": "u", "û": "u", "ũ": "u", "ṹ": "u", "ū": "u", "ṻ": "u", "ŭ": "u", "ü": "u", "ǜ": "u", "ǘ": "u", "ǖ": "u", "ǚ": "u", "ủ": "u", "ů": "u", "ű": "u", "ǔ": "u", "ȕ": "u", "ȗ": "u", "ư": "u", "ừ": "u", "ứ": "u", "ữ": "u", "ử": "u", "ự": "u", "ụ": "u", "ṳ": "u", "ų": "u", "ṷ": "u", "ṵ": "u", "ʉ": "u", "ⓥ": "v", "ｖ": "v", "ṽ": "v", "ṿ": "v", "ʋ": "v", "ꝟ": "v", "ʌ": "v", "ꝡ": "vy", "ⓦ": "w", "ｗ": "w", "ẁ": "w", "ẃ": "w", "ŵ": "w", "ẇ": "w", "ẅ": "w", "ẘ": "w", "ẉ": "w", "ⱳ": "w", "ⓧ": "x", "ｘ": "x", "ẋ": "x", "ẍ": "x", "ⓨ": "y", "ｙ": "y", "ỳ": "y", "ý": "y", "ŷ": "y", "ỹ": "y", "ȳ": "y", "ẏ": "y", "ÿ": "y", "ỷ": "y", "ẙ": "y", "ỵ": "y", "ƴ": "y", "ɏ": "y", "ỿ": "y", "ⓩ": "z", "ｚ": "z", "ź": "z", "ẑ": "z", "ż": "z", "ž": "z", "ẓ": "z", "ẕ": "z", "ƶ": "z", "ȥ": "z", "ɀ": "z", "ⱬ": "z", "ꝣ": "z", "Ά": "Α", "Έ": "Ε", "Ή": "Η", "Ί": "Ι", "Ϊ": "Ι", "Ό": "Ο", "Ύ": "Υ", "Ϋ": "Υ", "Ώ": "Ω", "ά": "α", "έ": "ε", "ή": "η", "ί": "ι", "ϊ": "ι", "ΐ": "ι", "ό": "ο", "ύ": "υ", "ϋ": "υ", "ΰ": "υ", "ω": "ω", "ς": "σ" };return a;
    }), b.define("select2/data/base", ["../utils"], function (a) {
      function b(a, c) {
        b.__super__.constructor.call(this);
      }return a.Extend(b, a.Observable), b.prototype.current = function (a) {
        throw new Error("The `current` method must be defined in child classes.");
      }, b.prototype.query = function (a, b) {
        throw new Error("The `query` method must be defined in child classes.");
      }, b.prototype.bind = function (a, b) {}, b.prototype.destroy = function () {}, b.prototype.generateResultId = function (b, c) {
        var d = b.id + "-result-";return d += a.generateChars(4), d += null != c.id ? "-" + c.id.toString() : "-" + a.generateChars(4);
      }, b;
    }), b.define("select2/data/select", ["./base", "../utils", "jquery"], function (a, b, c) {
      function d(a, b) {
        this.$element = a, this.options = b, d.__super__.constructor.call(this);
      }return b.Extend(d, a), d.prototype.current = function (a) {
        var b = [],
            d = this;this.$element.find(":selected").each(function () {
          var a = c(this),
              e = d.item(a);b.push(e);
        }), a(b);
      }, d.prototype.select = function (a) {
        var b = this;if (a.selected = !0, c(a.element).is("option")) return a.element.selected = !0, void this.$element.trigger("change");
        if (this.$element.prop("multiple")) this.current(function (d) {
          var e = [];a = [a], a.push.apply(a, d);for (var f = 0; f < a.length; f++) {
            var g = a[f].id;-1 === c.inArray(g, e) && e.push(g);
          }b.$element.val(e), b.$element.trigger("change");
        });else {
          var d = a.id;this.$element.val(d), this.$element.trigger("change");
        }
      }, d.prototype.unselect = function (a) {
        var b = this;if (this.$element.prop("multiple")) return a.selected = !1, c(a.element).is("option") ? (a.element.selected = !1, void this.$element.trigger("change")) : void this.current(function (d) {
          for (var e = [], f = 0; f < d.length; f++) {
            var g = d[f].id;g !== a.id && -1 === c.inArray(g, e) && e.push(g);
          }b.$element.val(e), b.$element.trigger("change");
        });
      }, d.prototype.bind = function (a, b) {
        var c = this;this.container = a, a.on("select", function (a) {
          c.select(a.data);
        }), a.on("unselect", function (a) {
          c.unselect(a.data);
        });
      }, d.prototype.destroy = function () {
        this.$element.find("*").each(function () {
          c.removeData(this, "data");
        });
      }, d.prototype.query = function (a, b) {
        var d = [],
            e = this,
            f = this.$element.children();f.each(function () {
          var b = c(this);if (b.is("option") || b.is("optgroup")) {
            var f = e.item(b),
                g = e.matches(a, f);null !== g && d.push(g);
          }
        }), b({ results: d });
      }, d.prototype.addOptions = function (a) {
        b.appendMany(this.$element, a);
      }, d.prototype.option = function (a) {
        var b;a.children ? (b = document.createElement("optgroup"), b.label = a.text) : (b = document.createElement("option"), void 0 !== b.textContent ? b.textContent = a.text : b.innerText = a.text), a.id && (b.value = a.id), a.disabled && (b.disabled = !0), a.selected && (b.selected = !0), a.title && (b.title = a.title);var d = c(b),
            e = this._normalizeItem(a);return e.element = b, c.data(b, "data", e), d;
      }, d.prototype.item = function (a) {
        var b = {};if (b = c.data(a[0], "data"), null != b) return b;if (a.is("option")) b = { id: a.val(), text: a.text(), disabled: a.prop("disabled"), selected: a.prop("selected"), title: a.prop("title") };else if (a.is("optgroup")) {
          b = { text: a.prop("label"), children: [], title: a.prop("title") };for (var d = a.children("option"), e = [], f = 0; f < d.length; f++) {
            var g = c(d[f]),
                h = this.item(g);e.push(h);
          }b.children = e;
        }return b = this._normalizeItem(b), b.element = a[0], c.data(a[0], "data", b), b;
      }, d.prototype._normalizeItem = function (a) {
        c.isPlainObject(a) || (a = { id: a, text: a }), a = c.extend({}, { text: "" }, a);var b = { selected: !1, disabled: !1 };return null != a.id && (a.id = a.id.toString()), null != a.text && (a.text = a.text.toString()), null == a._resultId && a.id && null != this.container && (a._resultId = this.generateResultId(this.container, a)), c.extend({}, b, a);
      }, d.prototype.matches = function (a, b) {
        var c = this.options.get("matcher");return c(a, b);
      }, d;
    }), b.define("select2/data/array", ["./select", "../utils", "jquery"], function (a, b, c) {
      function d(a, b) {
        var c = b.get("data") || [];d.__super__.constructor.call(this, a, b), this.addOptions(this.convertToOptions(c));
      }return b.Extend(d, a), d.prototype.select = function (a) {
        var b = this.$element.find("option").filter(function (b, c) {
          return c.value == a.id.toString();
        });0 === b.length && (b = this.option(a), this.addOptions(b)), d.__super__.select.call(this, a);
      }, d.prototype.convertToOptions = function (a) {
        function d(a) {
          return function () {
            return c(this).val() == a.id;
          };
        }for (var e = this, f = this.$element.find("option"), g = f.map(function () {
          return e.item(c(this)).id;
        }).get(), h = [], i = 0; i < a.length; i++) {
          var j = this._normalizeItem(a[i]);if (c.inArray(j.id, g) >= 0) {
            var k = f.filter(d(j)),
                l = this.item(k),
                m = c.extend(!0, {}, j, l),
                n = this.option(m);k.replaceWith(n);
          } else {
            var o = this.option(j);if (j.children) {
              var p = this.convertToOptions(j.children);b.appendMany(o, p);
            }h.push(o);
          }
        }return h;
      }, d;
    }), b.define("select2/data/ajax", ["./array", "../utils", "jquery"], function (a, b, c) {
      function d(a, b) {
        this.ajaxOptions = this._applyDefaults(b.get("ajax")), null != this.ajaxOptions.processResults && (this.processResults = this.ajaxOptions.processResults), d.__super__.constructor.call(this, a, b);
      }return b.Extend(d, a), d.prototype._applyDefaults = function (a) {
        var b = { data: function (a) {
            return c.extend({}, a, { q: a.term });
          }, transport: function (a, b, d) {
            var e = c.ajax(a);return e.then(b), e.fail(d), e;
          } };return c.extend({}, b, a, !0);
      }, d.prototype.processResults = function (a) {
        return a;
      }, d.prototype.query = function (a, b) {
        function d() {
          var d = f.transport(f, function (d) {
            var f = e.processResults(d, a);e.options.get("debug") && window.console && console.error && (f && f.results && c.isArray(f.results) || console.error("Select2: The AJAX results did not return an array in the `results` key of the response.")), b(f);
          }, function () {
            d.status && "0" === d.status || e.trigger("results:message", { message: "errorLoading" });
          });e._request = d;
        }var e = this;null != this._request && (c.isFunction(this._request.abort) && this._request.abort(), this._request = null);var f = c.extend({ type: "GET" }, this.ajaxOptions);"function" == typeof f.url && (f.url = f.url.call(this.$element, a)), "function" == typeof f.data && (f.data = f.data.call(this.$element, a)), this.ajaxOptions.delay && null != a.term ? (this._queryTimeout && window.clearTimeout(this._queryTimeout), this._queryTimeout = window.setTimeout(d, this.ajaxOptions.delay)) : d();
      }, d;
    }), b.define("select2/data/tags", ["jquery"], function (a) {
      function b(b, c, d) {
        var e = d.get("tags"),
            f = d.get("createTag");void 0 !== f && (this.createTag = f);var g = d.get("insertTag");if (void 0 !== g && (this.insertTag = g), b.call(this, c, d), a.isArray(e)) for (var h = 0; h < e.length; h++) {
          var i = e[h],
              j = this._normalizeItem(i),
              k = this.option(j);this.$element.append(k);
        }
      }return b.prototype.query = function (a, b, c) {
        function d(a, f) {
          for (var g = a.results, h = 0; h < g.length; h++) {
            var i = g[h],
                j = null != i.children && !d({ results: i.children }, !0),
                k = i.text === b.term;if (k || j) return f ? !1 : (a.data = g, void c(a));
          }if (f) return !0;var l = e.createTag(b);if (null != l) {
            var m = e.option(l);m.attr("data-select2-tag", !0), e.addOptions([m]), e.insertTag(g, l);
          }a.results = g, c(a);
        }var e = this;return this._removeOldTags(), null == b.term || null != b.page ? void a.call(this, b, c) : void a.call(this, b, d);
      }, b.prototype.createTag = function (b, c) {
        var d = a.trim(c.term);return "" === d ? null : { id: d, text: d };
      }, b.prototype.insertTag = function (a, b, c) {
        b.unshift(c);
      }, b.prototype._removeOldTags = function (b) {
        var c = (this._lastTag, this.$element.find("option[data-select2-tag]"));c.each(function () {
          this.selected || a(this).remove();
        });
      }, b;
    }), b.define("select2/data/tokenizer", ["jquery"], function (a) {
      function b(a, b, c) {
        var d = c.get("tokenizer");void 0 !== d && (this.tokenizer = d), a.call(this, b, c);
      }return b.prototype.bind = function (a, b, c) {
        a.call(this, b, c), this.$search = b.dropdown.$search || b.selection.$search || c.find(".select2-search__field");
      }, b.prototype.query = function (b, c, d) {
        function e(b) {
          var c = g._normalizeItem(b),
              d = g.$element.find("option").filter(function () {
            return a(this).val() === c.id;
          });if (!d.length) {
            var e = g.option(c);e.attr("data-select2-tag", !0), g._removeOldTags(), g.addOptions([e]);
          }f(c);
        }function f(a) {
          g.trigger("select", { data: a });
        }var g = this;c.term = c.term || "";var h = this.tokenizer(c, this.options, e);h.term !== c.term && (this.$search.length && (this.$search.val(h.term), this.$search.focus()), c.term = h.term), b.call(this, c, d);
      }, b.prototype.tokenizer = function (b, c, d, e) {
        for (var f = d.get("tokenSeparators") || [], g = c.term, h = 0, i = this.createTag || function (a) {
          return { id: a.term, text: a.term };
        }; h < g.length;) {
          var j = g[h];if (-1 !== a.inArray(j, f)) {
            var k = g.substr(0, h),
                l = a.extend({}, c, { term: k }),
                m = i(l);null != m ? (e(m), g = g.substr(h + 1) || "", h = 0) : h++;
          } else h++;
        }return { term: g };
      }, b;
    }), b.define("select2/data/minimumInputLength", [], function () {
      function a(a, b, c) {
        this.minimumInputLength = c.get("minimumInputLength"), a.call(this, b, c);
      }return a.prototype.query = function (a, b, c) {
        return b.term = b.term || "", b.term.length < this.minimumInputLength ? void this.trigger("results:message", { message: "inputTooShort", args: { minimum: this.minimumInputLength, input: b.term, params: b } }) : void a.call(this, b, c);
      }, a;
    }), b.define("select2/data/maximumInputLength", [], function () {
      function a(a, b, c) {
        this.maximumInputLength = c.get("maximumInputLength"), a.call(this, b, c);
      }return a.prototype.query = function (a, b, c) {
        return b.term = b.term || "", this.maximumInputLength > 0 && b.term.length > this.maximumInputLength ? void this.trigger("results:message", { message: "inputTooLong", args: { maximum: this.maximumInputLength, input: b.term, params: b } }) : void a.call(this, b, c);
      }, a;
    }), b.define("select2/data/maximumSelectionLength", [], function () {
      function a(a, b, c) {
        this.maximumSelectionLength = c.get("maximumSelectionLength"), a.call(this, b, c);
      }return a.prototype.query = function (a, b, c) {
        var d = this;this.current(function (e) {
          var f = null != e ? e.length : 0;return d.maximumSelectionLength > 0 && f >= d.maximumSelectionLength ? void d.trigger("results:message", { message: "maximumSelected", args: { maximum: d.maximumSelectionLength } }) : void a.call(d, b, c);
        });
      }, a;
    }), b.define("select2/dropdown", ["jquery", "./utils"], function (a, b) {
      function c(a, b) {
        this.$element = a, this.options = b, c.__super__.constructor.call(this);
      }return b.Extend(c, b.Observable), c.prototype.render = function () {
        var b = a('<span class="select2-dropdown"><span class="select2-results"></span></span>');return b.attr("dir", this.options.get("dir")), this.$dropdown = b, b;
      }, c.prototype.bind = function () {}, c.prototype.position = function (a, b) {}, c.prototype.destroy = function () {
        this.$dropdown.remove();
      }, c;
    }), b.define("select2/dropdown/search", ["jquery", "../utils"], function (a, b) {
      function c() {}return c.prototype.render = function (b) {
        var c = b.call(this),
            d = a('<span class="select2-search select2-search--dropdown"><input class="select2-search__field" type="search" tabindex="-1" autocomplete="off" autocorrect="off" autocapitalize="off" spellcheck="false" role="textbox" /></span>');return this.$searchContainer = d, this.$search = d.find("input"), c.prepend(d), c;
      }, c.prototype.bind = function (b, c, d) {
        var e = this;b.call(this, c, d), this.$search.on("keydown", function (a) {
          e.trigger("keypress", a), e._keyUpPrevented = a.isDefaultPrevented();
        }), this.$search.on("input", function (b) {
          a(this).off("keyup");
        }), this.$search.on("keyup input", function (a) {
          e.handleSearch(a);
        }), c.on("open", function () {
          e.$search.attr("tabindex", 0), e.$search.focus(), window.setTimeout(function () {
            e.$search.focus();
          }, 0);
        }), c.on("close", function () {
          e.$search.attr("tabindex", -1), e.$search.val("");
        }), c.on("focus", function () {
          c.isOpen() && e.$search.focus();
        }), c.on("results:all", function (a) {
          if (null == a.query.term || "" === a.query.term) {
            var b = e.showSearch(a);b ? e.$searchContainer.removeClass("select2-search--hide") : e.$searchContainer.addClass("select2-search--hide");
          }
        });
      }, c.prototype.handleSearch = function (a) {
        if (!this._keyUpPrevented) {
          var b = this.$search.val();this.trigger("query", { term: b });
        }this._keyUpPrevented = !1;
      }, c.prototype.showSearch = function (a, b) {
        return !0;
      }, c;
    }), b.define("select2/dropdown/hidePlaceholder", [], function () {
      function a(a, b, c, d) {
        this.placeholder = this.normalizePlaceholder(c.get("placeholder")), a.call(this, b, c, d);
      }return a.prototype.append = function (a, b) {
        b.results = this.removePlaceholder(b.results), a.call(this, b);
      }, a.prototype.normalizePlaceholder = function (a, b) {
        return "string" == typeof b && (b = { id: "", text: b }), b;
      }, a.prototype.removePlaceholder = function (a, b) {
        for (var c = b.slice(0), d = b.length - 1; d >= 0; d--) {
          var e = b[d];this.placeholder.id === e.id && c.splice(d, 1);
        }return c;
      }, a;
    }), b.define("select2/dropdown/infiniteScroll", ["jquery"], function (a) {
      function b(a, b, c, d) {
        this.lastParams = {}, a.call(this, b, c, d), this.$loadingMore = this.createLoadingMore(), this.loading = !1;
      }return b.prototype.append = function (a, b) {
        this.$loadingMore.remove(), this.loading = !1, a.call(this, b), this.showLoadingMore(b) && this.$results.append(this.$loadingMore);
      }, b.prototype.bind = function (b, c, d) {
        var e = this;b.call(this, c, d), c.on("query", function (a) {
          e.lastParams = a, e.loading = !0;
        }), c.on("query:append", function (a) {
          e.lastParams = a, e.loading = !0;
        }), this.$results.on("scroll", function () {
          var b = a.contains(document.documentElement, e.$loadingMore[0]);if (!e.loading && b) {
            var c = e.$results.offset().top + e.$results.outerHeight(!1),
                d = e.$loadingMore.offset().top + e.$loadingMore.outerHeight(!1);c + 50 >= d && e.loadMore();
          }
        });
      }, b.prototype.loadMore = function () {
        this.loading = !0;var b = a.extend({}, { page: 1 }, this.lastParams);b.page++, this.trigger("query:append", b);
      }, b.prototype.showLoadingMore = function (a, b) {
        return b.pagination && b.pagination.more;
      }, b.prototype.createLoadingMore = function () {
        var b = a('<li class="select2-results__option select2-results__option--load-more"role="treeitem" aria-disabled="true"></li>'),
            c = this.options.get("translations").get("loadingMore");return b.html(c(this.lastParams)), b;
      }, b;
    }), b.define("select2/dropdown/attachBody", ["jquery", "../utils"], function (a, b) {
      function c(b, c, d) {
        this.$dropdownParent = d.get("dropdownParent") || a(document.body), b.call(this, c, d);
      }return c.prototype.bind = function (a, b, c) {
        var d = this,
            e = !1;a.call(this, b, c), b.on("open", function () {
          d._showDropdown(), d._attachPositioningHandler(b), e || (e = !0, b.on("results:all", function () {
            d._positionDropdown(), d._resizeDropdown();
          }), b.on("results:append", function () {
            d._positionDropdown(), d._resizeDropdown();
          }));
        }), b.on("close", function () {
          d._hideDropdown(), d._detachPositioningHandler(b);
        }), this.$dropdownContainer.on("mousedown", function (a) {
          a.stopPropagation();
        });
      }, c.prototype.destroy = function (a) {
        a.call(this), this.$dropdownContainer.remove();
      }, c.prototype.position = function (a, b, c) {
        b.attr("class", c.attr("class")), b.removeClass("select2"), b.addClass("select2-container--open"), b.css({ position: "absolute", top: -999999 }), this.$container = c;
      }, c.prototype.render = function (b) {
        var c = a("<span></span>"),
            d = b.call(this);return c.append(d), this.$dropdownContainer = c, c;
      }, c.prototype._hideDropdown = function (a) {
        this.$dropdownContainer.detach();
      }, c.prototype._attachPositioningHandler = function (c, d) {
        var e = this,
            f = "scroll.select2." + d.id,
            g = "resize.select2." + d.id,
            h = "orientationchange.select2." + d.id,
            i = this.$container.parents().filter(b.hasScroll);i.each(function () {
          a(this).data("select2-scroll-position", { x: a(this).scrollLeft(), y: a(this).scrollTop() });
        }), i.on(f, function (b) {
          var c = a(this).data("select2-scroll-position");a(this).scrollTop(c.y);
        }), a(window).on(f + " " + g + " " + h, function (a) {
          e._positionDropdown(), e._resizeDropdown();
        });
      }, c.prototype._detachPositioningHandler = function (c, d) {
        var e = "scroll.select2." + d.id,
            f = "resize.select2." + d.id,
            g = "orientationchange.select2." + d.id,
            h = this.$container.parents().filter(b.hasScroll);h.off(e), a(window).off(e + " " + f + " " + g);
      }, c.prototype._positionDropdown = function () {
        var b = a(window),
            c = this.$dropdown.hasClass("select2-dropdown--above"),
            d = this.$dropdown.hasClass("select2-dropdown--below"),
            e = null,
            f = this.$container.offset();f.bottom = f.top + this.$container.outerHeight(!1);var g = { height: this.$container.outerHeight(!1) };g.top = f.top, g.bottom = f.top + g.height;var h = { height: this.$dropdown.outerHeight(!1) },
            i = { top: b.scrollTop(), bottom: b.scrollTop() + b.height() },
            j = i.top < f.top - h.height,
            k = i.bottom > f.bottom + h.height,
            l = { left: f.left, top: g.bottom },
            m = this.$dropdownParent;"static" === m.css("position") && (m = m.offsetParent());var n = m.offset();l.top -= n.top, l.left -= n.left, c || d || (e = "below"), k || !j || c ? !j && k && c && (e = "below") : e = "above", ("above" == e || c && "below" !== e) && (l.top = g.top - n.top - h.height), null != e && (this.$dropdown.removeClass("select2-dropdown--below select2-dropdown--above").addClass("select2-dropdown--" + e), this.$container.removeClass("select2-container--below select2-container--above").addClass("select2-container--" + e)), this.$dropdownContainer.css(l);
      }, c.prototype._resizeDropdown = function () {
        var a = { width: this.$container.outerWidth(!1) + "px" };this.options.get("dropdownAutoWidth") && (a.minWidth = a.width, a.position = "relative", a.width = "auto"), this.$dropdown.css(a);
      }, c.prototype._showDropdown = function (a) {
        this.$dropdownContainer.appendTo(this.$dropdownParent), this._positionDropdown(), this._resizeDropdown();
      }, c;
    }), b.define("select2/dropdown/minimumResultsForSearch", [], function () {
      function a(b) {
        for (var c = 0, d = 0; d < b.length; d++) {
          var e = b[d];e.children ? c += a(e.children) : c++;
        }return c;
      }function b(a, b, c, d) {
        this.minimumResultsForSearch = c.get("minimumResultsForSearch"), this.minimumResultsForSearch < 0 && (this.minimumResultsForSearch = 1 / 0), a.call(this, b, c, d);
      }return b.prototype.showSearch = function (b, c) {
        return a(c.data.results) < this.minimumResultsForSearch ? !1 : b.call(this, c);
      }, b;
    }), b.define("select2/dropdown/selectOnClose", [], function () {
      function a() {}return a.prototype.bind = function (a, b, c) {
        var d = this;a.call(this, b, c), b.on("close", function (a) {
          d._handleSelectOnClose(a);
        });
      }, a.prototype._handleSelectOnClose = function (a, b) {
        if (b && null != b.originalSelect2Event) {
          var c = b.originalSelect2Event;if ("select" === c._type || "unselect" === c._type) return;
        }var d = this.getHighlightedResults();if (!(d.length < 1)) {
          var e = d.data("data");null != e.element && e.element.selected || null == e.element && e.selected || this.trigger("select", { data: e });
        }
      }, a;
    }), b.define("select2/dropdown/closeOnSelect", [], function () {
      function a() {}return a.prototype.bind = function (a, b, c) {
        var d = this;a.call(this, b, c), b.on("select", function (a) {
          d._selectTriggered(a);
        }), b.on("unselect", function (a) {
          d._selectTriggered(a);
        });
      }, a.prototype._selectTriggered = function (a, b) {
        var c = b.originalEvent;c && c.ctrlKey || this.trigger("close", { originalEvent: c, originalSelect2Event: b });
      }, a;
    }), b.define("select2/i18n/en", [], function () {
      return { errorLoading: function () {
          return "The results could not be loaded.";
        }, inputTooLong: function (a) {
          var b = a.input.length - a.maximum,
              c = "Please delete " + b + " character";return 1 != b && (c += "s"), c;
        }, inputTooShort: function (a) {
          var b = a.minimum - a.input.length,
              c = "Please enter " + b + " or more characters";return c;
        }, loadingMore: function () {
          return "Loading more results…";
        }, maximumSelected: function (a) {
          var b = "You can only select " + a.maximum + " item";return 1 != a.maximum && (b += "s"), b;
        }, noResults: function () {
          return "No results found";
        }, searching: function () {
          return "Searching…";
        } };
    }), b.define("select2/defaults", ["jquery", "require", "./results", "./selection/single", "./selection/multiple", "./selection/placeholder", "./selection/allowClear", "./selection/search", "./selection/eventRelay", "./utils", "./translation", "./diacritics", "./data/select", "./data/array", "./data/ajax", "./data/tags", "./data/tokenizer", "./data/minimumInputLength", "./data/maximumInputLength", "./data/maximumSelectionLength", "./dropdown", "./dropdown/search", "./dropdown/hidePlaceholder", "./dropdown/infiniteScroll", "./dropdown/attachBody", "./dropdown/minimumResultsForSearch", "./dropdown/selectOnClose", "./dropdown/closeOnSelect", "./i18n/en"], function (a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s, t, u, v, w, x, y, z, A, B, C) {
      function D() {
        this.reset();
      }D.prototype.apply = function (l) {
        if (l = a.extend(!0, {}, this.defaults, l), null == l.dataAdapter) {
          if (null != l.ajax ? l.dataAdapter = o : null != l.data ? l.dataAdapter = n : l.dataAdapter = m, l.minimumInputLength > 0 && (l.dataAdapter = j.Decorate(l.dataAdapter, r)), l.maximumInputLength > 0 && (l.dataAdapter = j.Decorate(l.dataAdapter, s)), l.maximumSelectionLength > 0 && (l.dataAdapter = j.Decorate(l.dataAdapter, t)), l.tags && (l.dataAdapter = j.Decorate(l.dataAdapter, p)), (null != l.tokenSeparators || null != l.tokenizer) && (l.dataAdapter = j.Decorate(l.dataAdapter, q)), null != l.query) {
            var C = b(l.amdBase + "compat/query");l.dataAdapter = j.Decorate(l.dataAdapter, C);
          }if (null != l.initSelection) {
            var D = b(l.amdBase + "compat/initSelection");l.dataAdapter = j.Decorate(l.dataAdapter, D);
          }
        }if (null == l.resultsAdapter && (l.resultsAdapter = c, null != l.ajax && (l.resultsAdapter = j.Decorate(l.resultsAdapter, x)), null != l.placeholder && (l.resultsAdapter = j.Decorate(l.resultsAdapter, w)), l.selectOnClose && (l.resultsAdapter = j.Decorate(l.resultsAdapter, A))), null == l.dropdownAdapter) {
          if (l.multiple) l.dropdownAdapter = u;else {
            var E = j.Decorate(u, v);l.dropdownAdapter = E;
          }if (0 !== l.minimumResultsForSearch && (l.dropdownAdapter = j.Decorate(l.dropdownAdapter, z)), l.closeOnSelect && (l.dropdownAdapter = j.Decorate(l.dropdownAdapter, B)), null != l.dropdownCssClass || null != l.dropdownCss || null != l.adaptDropdownCssClass) {
            var F = b(l.amdBase + "compat/dropdownCss");l.dropdownAdapter = j.Decorate(l.dropdownAdapter, F);
          }l.dropdownAdapter = j.Decorate(l.dropdownAdapter, y);
        }if (null == l.selectionAdapter) {
          if (l.multiple ? l.selectionAdapter = e : l.selectionAdapter = d, null != l.placeholder && (l.selectionAdapter = j.Decorate(l.selectionAdapter, f)), l.allowClear && (l.selectionAdapter = j.Decorate(l.selectionAdapter, g)), l.multiple && (l.selectionAdapter = j.Decorate(l.selectionAdapter, h)), null != l.containerCssClass || null != l.containerCss || null != l.adaptContainerCssClass) {
            var G = b(l.amdBase + "compat/containerCss");l.selectionAdapter = j.Decorate(l.selectionAdapter, G);
          }l.selectionAdapter = j.Decorate(l.selectionAdapter, i);
        }if ("string" == typeof l.language) if (l.language.indexOf("-") > 0) {
          var H = l.language.split("-"),
              I = H[0];l.language = [l.language, I];
        } else l.language = [l.language];if (a.isArray(l.language)) {
          var J = new k();l.language.push("en");for (var K = l.language, L = 0; L < K.length; L++) {
            var M = K[L],
                N = {};try {
              N = k.loadPath(M);
            } catch (O) {
              try {
                M = this.defaults.amdLanguageBase + M, N = k.loadPath(M);
              } catch (P) {
                l.debug && window.console && console.warn && console.warn('Select2: The language file for "' + M + '" could not be automatically loaded. A fallback will be used instead.');continue;
              }
            }J.extend(N);
          }l.translations = J;
        } else {
          var Q = k.loadPath(this.defaults.amdLanguageBase + "en"),
              R = new k(l.language);R.extend(Q), l.translations = R;
        }return l;
      }, D.prototype.reset = function () {
        function b(a) {
          function b(a) {
            return l[a] || a;
          }return a.replace(/[^\u0000-\u007E]/g, b);
        }function c(d, e) {
          if ("" === a.trim(d.term)) return e;if (e.children && e.children.length > 0) {
            for (var f = a.extend(!0, {}, e), g = e.children.length - 1; g >= 0; g--) {
              var h = e.children[g],
                  i = c(d, h);null == i && f.children.splice(g, 1);
            }return f.children.length > 0 ? f : c(d, f);
          }var j = b(e.text).toUpperCase(),
              k = b(d.term).toUpperCase();return j.indexOf(k) > -1 ? e : null;
        }this.defaults = { amdBase: "./", amdLanguageBase: "./i18n/", closeOnSelect: !0, debug: !1, dropdownAutoWidth: !1, escapeMarkup: j.escapeMarkup, language: C, matcher: c, minimumInputLength: 0, maximumInputLength: 0, maximumSelectionLength: 0, minimumResultsForSearch: 0, selectOnClose: !1, sorter: function (a) {
            return a;
          }, templateResult: function (a) {
            return a.text;
          }, templateSelection: function (a) {
            return a.text;
          }, theme: "default", width: "resolve" };
      }, D.prototype.set = function (b, c) {
        var d = a.camelCase(b),
            e = {};e[d] = c;var f = j._convertData(e);a.extend(this.defaults, f);
      };var E = new D();return E;
    }), b.define("select2/options", ["require", "jquery", "./defaults", "./utils"], function (a, b, c, d) {
      function e(b, e) {
        if (this.options = b, null != e && this.fromElement(e), this.options = c.apply(this.options), e && e.is("input")) {
          var f = a(this.get("amdBase") + "compat/inputData");this.options.dataAdapter = d.Decorate(this.options.dataAdapter, f);
        }
      }return e.prototype.fromElement = function (a) {
        var c = ["select2"];null == this.options.multiple && (this.options.multiple = a.prop("multiple")), null == this.options.disabled && (this.options.disabled = a.prop("disabled")), null == this.options.language && (a.prop("lang") ? this.options.language = a.prop("lang").toLowerCase() : a.closest("[lang]").prop("lang") && (this.options.language = a.closest("[lang]").prop("lang"))), null == this.options.dir && (a.prop("dir") ? this.options.dir = a.prop("dir") : a.closest("[dir]").prop("dir") ? this.options.dir = a.closest("[dir]").prop("dir") : this.options.dir = "ltr"), a.prop("disabled", this.options.disabled), a.prop("multiple", this.options.multiple), a.data("select2Tags") && (this.options.debug && window.console && console.warn && console.warn('Select2: The `data-select2-tags` attribute has been changed to use the `data-data` and `data-tags="true"` attributes and will be removed in future versions of Select2.'), a.data("data", a.data("select2Tags")), a.data("tags", !0)), a.data("ajaxUrl") && (this.options.debug && window.console && console.warn && console.warn("Select2: The `data-ajax-url` attribute has been changed to `data-ajax--url` and support for the old attribute will be removed in future versions of Select2."), a.attr("ajax--url", a.data("ajaxUrl")), a.data("ajax--url", a.data("ajaxUrl")));var e = {};e = b.fn.jquery && "1." == b.fn.jquery.substr(0, 2) && a[0].dataset ? b.extend(!0, {}, a[0].dataset, a.data()) : a.data();var f = b.extend(!0, {}, e);f = d._convertData(f);for (var g in f) b.inArray(g, c) > -1 || (b.isPlainObject(this.options[g]) ? b.extend(this.options[g], f[g]) : this.options[g] = f[g]);return this;
      }, e.prototype.get = function (a) {
        return this.options[a];
      }, e.prototype.set = function (a, b) {
        this.options[a] = b;
      }, e;
    }), b.define("select2/core", ["jquery", "./options", "./utils", "./keys"], function (a, b, c, d) {
      var e = function (a, c) {
        null != a.data("select2") && a.data("select2").destroy(), this.$element = a, this.id = this._generateId(a), c = c || {}, this.options = new b(c, a), e.__super__.constructor.call(this);var d = a.attr("tabindex") || 0;a.data("old-tabindex", d), a.attr("tabindex", "-1");var f = this.options.get("dataAdapter");this.dataAdapter = new f(a, this.options);var g = this.render();this._placeContainer(g);var h = this.options.get("selectionAdapter");this.selection = new h(a, this.options), this.$selection = this.selection.render(), this.selection.position(this.$selection, g);var i = this.options.get("dropdownAdapter");this.dropdown = new i(a, this.options), this.$dropdown = this.dropdown.render(), this.dropdown.position(this.$dropdown, g);var j = this.options.get("resultsAdapter");this.results = new j(a, this.options, this.dataAdapter), this.$results = this.results.render(), this.results.position(this.$results, this.$dropdown);var k = this;this._bindAdapters(), this._registerDomEvents(), this._registerDataEvents(), this._registerSelectionEvents(), this._registerDropdownEvents(), this._registerResultsEvents(), this._registerEvents(), this.dataAdapter.current(function (a) {
          k.trigger("selection:update", { data: a });
        }), a.addClass("select2-hidden-accessible"), a.attr("aria-hidden", "true"), this._syncAttributes(), a.data("select2", this);
      };return c.Extend(e, c.Observable), e.prototype._generateId = function (a) {
        var b = "";return b = null != a.attr("id") ? a.attr("id") : null != a.attr("name") ? a.attr("name") + "-" + c.generateChars(2) : c.generateChars(4), b = b.replace(/(:|\.|\[|\]|,)/g, ""), b = "select2-" + b;
      }, e.prototype._placeContainer = function (a) {
        a.insertAfter(this.$element);var b = this._resolveWidth(this.$element, this.options.get("width"));null != b && a.css("width", b);
      }, e.prototype._resolveWidth = function (a, b) {
        var c = /^width:(([-+]?([0-9]*\.)?[0-9]+)(px|em|ex|%|in|cm|mm|pt|pc))/i;if ("resolve" == b) {
          var d = this._resolveWidth(a, "style");return null != d ? d : this._resolveWidth(a, "element");
        }if ("element" == b) {
          var e = a.outerWidth(!1);return 0 >= e ? "auto" : e + "px";
        }if ("style" == b) {
          var f = a.attr("style");if ("string" != typeof f) return null;for (var g = f.split(";"), h = 0, i = g.length; i > h; h += 1) {
            var j = g[h].replace(/\s/g, ""),
                k = j.match(c);if (null !== k && k.length >= 1) return k[1];
          }return null;
        }return b;
      }, e.prototype._bindAdapters = function () {
        this.dataAdapter.bind(this, this.$container), this.selection.bind(this, this.$container), this.dropdown.bind(this, this.$container), this.results.bind(this, this.$container);
      }, e.prototype._registerDomEvents = function () {
        var b = this;this.$element.on("change.select2", function () {
          b.dataAdapter.current(function (a) {
            b.trigger("selection:update", { data: a });
          });
        }), this.$element.on("focus.select2", function (a) {
          b.trigger("focus", a);
        }), this._syncA = c.bind(this._syncAttributes, this), this._syncS = c.bind(this._syncSubtree, this), this.$element[0].attachEvent && this.$element[0].attachEvent("onpropertychange", this._syncA);var d = window.MutationObserver || window.WebKitMutationObserver || window.MozMutationObserver;null != d ? (this._observer = new d(function (c) {
          a.each(c, b._syncA), a.each(c, b._syncS);
        }), this._observer.observe(this.$element[0], { attributes: !0, childList: !0, subtree: !1 })) : this.$element[0].addEventListener && (this.$element[0].addEventListener("DOMAttrModified", b._syncA, !1), this.$element[0].addEventListener("DOMNodeInserted", b._syncS, !1), this.$element[0].addEventListener("DOMNodeRemoved", b._syncS, !1));
      }, e.prototype._registerDataEvents = function () {
        var a = this;this.dataAdapter.on("*", function (b, c) {
          a.trigger(b, c);
        });
      }, e.prototype._registerSelectionEvents = function () {
        var b = this,
            c = ["toggle", "focus"];this.selection.on("toggle", function () {
          b.toggleDropdown();
        }), this.selection.on("focus", function (a) {
          b.focus(a);
        }), this.selection.on("*", function (d, e) {
          -1 === a.inArray(d, c) && b.trigger(d, e);
        });
      }, e.prototype._registerDropdownEvents = function () {
        var a = this;this.dropdown.on("*", function (b, c) {
          a.trigger(b, c);
        });
      }, e.prototype._registerResultsEvents = function () {
        var a = this;this.results.on("*", function (b, c) {
          a.trigger(b, c);
        });
      }, e.prototype._registerEvents = function () {
        var a = this;this.on("open", function () {
          a.$container.addClass("select2-container--open");
        }), this.on("close", function () {
          a.$container.removeClass("select2-container--open");
        }), this.on("enable", function () {
          a.$container.removeClass("select2-container--disabled");
        }), this.on("disable", function () {
          a.$container.addClass("select2-container--disabled");
        }), this.on("blur", function () {
          a.$container.removeClass("select2-container--focus");
        }), this.on("query", function (b) {
          a.isOpen() || a.trigger("open", {}), this.dataAdapter.query(b, function (c) {
            a.trigger("results:all", { data: c, query: b });
          });
        }), this.on("query:append", function (b) {
          this.dataAdapter.query(b, function (c) {
            a.trigger("results:append", { data: c, query: b });
          });
        }), this.on("keypress", function (b) {
          var c = b.which;a.isOpen() ? c === d.ESC || c === d.TAB || c === d.UP && b.altKey ? (a.close(), b.preventDefault()) : c === d.ENTER ? (a.trigger("results:select", {}), b.preventDefault()) : c === d.SPACE && b.ctrlKey ? (a.trigger("results:toggle", {}), b.preventDefault()) : c === d.UP ? (a.trigger("results:previous", {}), b.preventDefault()) : c === d.DOWN && (a.trigger("results:next", {}), b.preventDefault()) : (c === d.ENTER || c === d.SPACE || c === d.DOWN && b.altKey) && (a.open(), b.preventDefault());
        });
      }, e.prototype._syncAttributes = function () {
        this.options.set("disabled", this.$element.prop("disabled")), this.options.get("disabled") ? (this.isOpen() && this.close(), this.trigger("disable", {})) : this.trigger("enable", {});
      }, e.prototype._syncSubtree = function (a, b) {
        var c = !1,
            d = this;if (!a || !a.target || "OPTION" === a.target.nodeName || "OPTGROUP" === a.target.nodeName) {
          if (b) {
            if (b.addedNodes && b.addedNodes.length > 0) for (var e = 0; e < b.addedNodes.length; e++) {
              var f = b.addedNodes[e];f.selected && (c = !0);
            } else b.removedNodes && b.removedNodes.length > 0 && (c = !0);
          } else c = !0;c && this.dataAdapter.current(function (a) {
            d.trigger("selection:update", { data: a });
          });
        }
      }, e.prototype.trigger = function (a, b) {
        var c = e.__super__.trigger,
            d = { open: "opening", close: "closing", select: "selecting", unselect: "unselecting" };if (void 0 === b && (b = {}), a in d) {
          var f = d[a],
              g = { prevented: !1, name: a, args: b };if (c.call(this, f, g), g.prevented) return void (b.prevented = !0);
        }c.call(this, a, b);
      }, e.prototype.toggleDropdown = function () {
        this.options.get("disabled") || (this.isOpen() ? this.close() : this.open());
      }, e.prototype.open = function () {
        this.isOpen() || this.trigger("query", {});
      }, e.prototype.close = function () {
        this.isOpen() && this.trigger("close", {});
      }, e.prototype.isOpen = function () {
        return this.$container.hasClass("select2-container--open");
      }, e.prototype.hasFocus = function () {
        return this.$container.hasClass("select2-container--focus");
      }, e.prototype.focus = function (a) {
        this.hasFocus() || (this.$container.addClass("select2-container--focus"), this.trigger("focus", {}));
      }, e.prototype.enable = function (a) {
        this.options.get("debug") && window.console && console.warn && console.warn('Select2: The `select2("enable")` method has been deprecated and will be removed in later Select2 versions. Use $element.prop("disabled") instead.'), (null == a || 0 === a.length) && (a = [!0]);var b = !a[0];this.$element.prop("disabled", b);
      }, e.prototype.data = function () {
        this.options.get("debug") && arguments.length > 0 && window.console && console.warn && console.warn('Select2: Data can no longer be set using `select2("data")`. You should consider setting the value instead using `$element.val()`.');var a = [];return this.dataAdapter.current(function (b) {
          a = b;
        }), a;
      }, e.prototype.val = function (b) {
        if (this.options.get("debug") && window.console && console.warn && console.warn('Select2: The `select2("val")` method has been deprecated and will be removed in later Select2 versions. Use $element.val() instead.'), null == b || 0 === b.length) return this.$element.val();var c = b[0];a.isArray(c) && (c = a.map(c, function (a) {
          return a.toString();
        })), this.$element.val(c).trigger("change");
      }, e.prototype.destroy = function () {
        this.$container.remove(), this.$element[0].detachEvent && this.$element[0].detachEvent("onpropertychange", this._syncA), null != this._observer ? (this._observer.disconnect(), this._observer = null) : this.$element[0].removeEventListener && (this.$element[0].removeEventListener("DOMAttrModified", this._syncA, !1), this.$element[0].removeEventListener("DOMNodeInserted", this._syncS, !1), this.$element[0].removeEventListener("DOMNodeRemoved", this._syncS, !1)), this._syncA = null, this._syncS = null, this.$element.off(".select2"), this.$element.attr("tabindex", this.$element.data("old-tabindex")), this.$element.removeClass("select2-hidden-accessible"), this.$element.attr("aria-hidden", "false"), this.$element.removeData("select2"), this.dataAdapter.destroy(), this.selection.destroy(), this.dropdown.destroy(), this.results.destroy(), this.dataAdapter = null, this.selection = null, this.dropdown = null, this.results = null;
      }, e.prototype.render = function () {
        var b = a('<span class="select2 select2-container"><span class="selection"></span><span class="dropdown-wrapper" aria-hidden="true"></span></span>');return b.attr("dir", this.options.get("dir")), this.$container = b, this.$container.addClass("select2-container--" + this.options.get("theme")), b.data("element", this.$element), b;
      }, e;
    }), b.define("jquery-mousewheel", ["jquery"], function (a) {
      return a;
    }), b.define("jquery.select2", ["jquery", "jquery-mousewheel", "./select2/core", "./select2/defaults"], function (a, b, c, d) {
      if (null == a.fn.select2) {
        var e = ["open", "close", "destroy"];a.fn.select2 = function (b) {
          if (b = b || {}, "object" == typeof b) return this.each(function () {
            var d = a.extend(!0, {}, b);new c(a(this), d);
          }), this;if ("string" == typeof b) {
            var d,
                f = Array.prototype.slice.call(arguments, 1);return this.each(function () {
              var c = a(this).data("select2");null == c && window.console && console.error && console.error("The select2('" + b + "') method was called on an element that is not using Select2."), d = c[b].apply(c, f);
            }), a.inArray(b, e) > -1 ? this : d;
          }throw new Error("Invalid arguments for Select2: " + b);
        };
      }return null == a.fn.select2.defaults && (a.fn.select2.defaults = d), c;
    }), { define: b.define, require: b.require };
  }(),
      c = b.require("jquery.select2");return a.fn.select2.amd = b, c;
});

},{"jquery":"/Sites/kisk-mennekes-www-20151019-relaunch-frontend/node_modules/jquery/dist/jquery.js"}],"/Sites/kisk-mennekes-www-20151019-relaunch-frontend/patternlab/source/js/vendor/uikit/accordion.min.js":[function(require,module,exports){
/*! UIkit 2.25.0 | http://www.getuikit.com | (c) 2014 YOOtheme | MIT License */
!function (t) {
  var i;window.UIkit && (i = t(UIkit)), "function" == typeof define && define.amd && define("uikit-accordion", ["uikit"], function () {
    return i || t(UIkit);
  });
}(function (t) {
  "use strict";
  function i(i) {
    var o = t.$(i),
        e = "auto";if (o.is(":visible")) e = o.outerHeight();else {
      var a = { position: o.css("position"), visibility: o.css("visibility"), display: o.css("display") };e = o.css({ position: "absolute", visibility: "hidden", display: "block" }).outerHeight(), o.css(a);
    }return e;
  }return t.component("accordion", { defaults: { showfirst: !0, collapse: !0, animate: !0, easing: "swing", duration: 300, toggle: ".uk-accordion-title", containers: ".uk-accordion-content", clsactive: "uk-active" }, boot: function () {
      t.ready(function (i) {
        setTimeout(function () {
          t.$("[data-uk-accordion]", i).each(function () {
            var i = t.$(this);i.data("accordion") || t.accordion(i, t.Utils.options(i.attr("data-uk-accordion")));
          });
        }, 0);
      });
    }, init: function () {
      var i = this;this.element.on("click.uk.accordion", this.options.toggle, function (o) {
        o.preventDefault(), i.toggleItem(t.$(this).data("wrapper"), i.options.animate, i.options.collapse);
      }), this.update(), this.options.showfirst && this.toggleItem(this.toggle.eq(0).data("wrapper"), !1, !1);
    }, toggleItem: function (o, e, a) {
      var n = this;o.data("toggle").toggleClass(this.options.clsactive), o.data("content").toggleClass(this.options.clsactive);var s = o.data("toggle").hasClass(this.options.clsactive);a && (this.toggle.not(o.data("toggle")).removeClass(this.options.clsactive), this.content.not(o.data("content")).removeClass(this.options.clsactive).parent().stop().css("overflow", "hidden").animate({ height: 0 }, { easing: this.options.easing, duration: e ? this.options.duration : 0 }).attr("aria-expanded", "false")), o.stop().css("overflow", "hidden"), e ? o.animate({ height: s ? i(o.data("content")) : 0 }, { easing: this.options.easing, duration: this.options.duration, complete: function () {
          s && (o.css({ overflow: "", height: "auto" }), t.Utils.checkDisplay(o.data("content"))), n.trigger("display.uk.check");
        } }) : (o.height(s ? "auto" : 0), s && (o.css({ overflow: "" }), t.Utils.checkDisplay(o.data("content"))), this.trigger("display.uk.check")), o.attr("aria-expanded", s), this.element.trigger("toggle.uk.accordion", [s, o.data("toggle"), o.data("content")]);
    }, update: function () {
      var i,
          o,
          e,
          a = this;this.toggle = this.find(this.options.toggle), this.content = this.find(this.options.containers), this.content.each(function (n) {
        i = t.$(this), i.parent().data("wrapper") ? o = i.parent() : (o = t.$(this).wrap('<div data-wrapper="true" style="overflow:hidden;height:0;position:relative;"></div>').parent(), o.attr("aria-expanded", "false")), e = a.toggle.eq(n), o.data("toggle", e), o.data("content", i), e.data("wrapper", o), i.data("wrapper", o);
      }), this.element.trigger("update.uk.accordion", [this]);
    } }), t.accordion;
});

},{}],"/Sites/kisk-mennekes-www-20151019-relaunch-frontend/patternlab/source/js/vendor/uikit/lightbox.min.js":[function(require,module,exports){
/*! UIkit 2.27.4 | http://www.getuikit.com | (c) 2014 YOOtheme | MIT License */
!function (i) {
  var t;window.UIkit2 && (t = i(UIkit2)), "function" == typeof define && define.amd && define("uikit-lightbox", ["uikit"], function () {
    return t || i(UIkit2);
  });
}(function (i) {
  "use strict";
  function t(t) {
    if (e) return e.lightbox = t, e;e = i.$(['<div class="uk-modal">', '<div class="uk-modal-dialog uk-modal-dialog-lightbox uk-slidenav-position" style="margin-left:auto;margin-right:auto;width:200px;height:200px;top:' + Math.abs(window.innerHeight / 2 - 200) + 'px;">', '<a href="#" class="uk-modal-close uk-close uk-close-alt"></a>', '<div class="uk-lightbox-content"></div>', '<div class="uk-modal-spinner uk-hidden"></div>', "</div>", "</div>"].join("")).appendTo("body"), e.dialog = e.find(".uk-modal-dialog:first"), e.content = e.find(".uk-lightbox-content:first"), e.loader = e.find(".uk-modal-spinner:first"), e.closer = e.find(".uk-close.uk-close-alt"), e.modal = i.modal(e, { modal: !1 }), e.on("swipeRight swipeLeft", function (i) {
      e.lightbox["swipeLeft" == i.type ? "next" : "previous"]();
    }).on("click", "[data-lightbox-previous], [data-lightbox-next]", function (t) {
      t.preventDefault(), e.lightbox[i.$(this).is("[data-lightbox-next]") ? "next" : "previous"]();
    }), e.on("hide.uk.modal", function () {
      e.content.html("");
    });var o = { w: window.innerWidth, h: window.innerHeight };return i.$win.on("load resize orientationchange", i.Utils.debounce(function () {
      o.w !== window.innerWidth && e.is(":visible") && !i.Utils.isFullscreen() && e.lightbox.fitSize(), o = { w: window.innerWidth, h: window.innerHeight };
    }, 100)), e.lightbox = t, e;
  }var e,
      o = {};return i.component("lightbox", { defaults: { allowfullscreen: !0, duration: 400, group: !1, keyboard: !0 }, index: 0, items: !1, boot: function () {
      i.$html.on("click", "[data-uk-lightbox]", function (t) {
        t.preventDefault();var e = i.$(this);e.data("lightbox") || i.lightbox(e, i.Utils.options(e.attr("data-uk-lightbox"))), e.data("lightbox").show(e);
      }), i.$doc.on("keyup", function (i) {
        if (e && e.is(":visible") && e.lightbox.options.keyboard) switch (i.preventDefault(), i.keyCode) {case 37:
            e.lightbox.previous();break;case 39:
            e.lightbox.next();}
      });
    }, init: function () {
      var t = [];if (this.index = 0, this.siblings = [], this.element && this.element.length) {
        var e = this.options.group ? i.$('[data-uk-lightbox*="' + this.options.group + '"]') : this.element;e.each(function () {
          var e = i.$(this);t.push({ source: e.attr("href"), title: e.attr("data-title") || e.attr("title"), type: e.attr("data-lightbox-type") || "auto", link: e });
        }), this.index = e.index(this.element), this.siblings = t;
      } else this.options.group && this.options.group.length && (this.siblings = this.options.group);this.trigger("lightbox-init", [this]);
    }, show: function (e) {
      this.modal = t(this), this.modal.dialog.stop(), this.modal.content.stop();var o,
          n,
          s = this,
          h = i.$.Deferred();e = e || 0, "object" == typeof e && this.siblings.forEach(function (i, t) {
        e[0] === i.link[0] && (e = t);
      }), 0 > e ? e = this.siblings.length - e : this.siblings[e] || (e = 0), n = this.siblings[e], o = { lightbox: s, source: n.source, type: n.type, index: e, promise: h, title: n.title, item: n, meta: { content: "", width: null, height: null } }, this.index = e, this.modal.content.empty(), this.modal.is(":visible") || (this.modal.content.css({ width: "", height: "" }).empty(), this.modal.modal.show()), this.modal.loader.removeClass("uk-hidden"), h.promise().done(function () {
        s.data = o, s.fitSize(o);
      }).fail(function () {
        o.meta.content = '<div class="uk-position-cover uk-flex uk-flex-middle uk-flex-center"><strong>Loading resource failed!</strong></div>', o.meta.width = 400, o.meta.height = 300, s.data = o, s.fitSize(o);
      }), s.trigger("showitem.uk.lightbox", [o]);
    }, fitSize: function () {
      var t = this,
          e = this.data,
          o = this.modal.dialog.outerWidth() - this.modal.dialog.width(),
          n = parseInt(this.modal.dialog.css("margin-top"), 10),
          s = parseInt(this.modal.dialog.css("margin-bottom"), 10),
          h = n + s,
          a = e.meta.content,
          l = t.options.duration;this.siblings.length > 1 && (a = [a, '<a href="#" class="uk-slidenav uk-slidenav-contrast uk-slidenav-previous uk-hidden-touch" data-lightbox-previous></a>', '<a href="#" class="uk-slidenav uk-slidenav-contrast uk-slidenav-next uk-hidden-touch" data-lightbox-next></a>'].join(""));var d,
          r,
          u = i.$("<div>&nbsp;</div>").css({ opacity: 0, position: "absolute", top: 0, left: 0, width: "100%", maxWidth: t.modal.dialog.css("max-width"), padding: t.modal.dialog.css("padding"), margin: t.modal.dialog.css("margin") }),
          c = e.meta.width,
          g = e.meta.height;u.appendTo("body").width(), d = u.width(), r = window.innerHeight - h, u.remove(), this.modal.dialog.find(".uk-modal-caption").remove(), e.title && (this.modal.dialog.append('<div class="uk-modal-caption">' + e.title + "</div>"), r -= this.modal.dialog.find(".uk-modal-caption").outerHeight()), d < e.meta.width && (g = Math.floor(g * (d / c)), c = d), g > r && (g = Math.floor(r), c = Math.ceil(e.meta.width * (r / e.meta.height))), this.modal.content.css("opacity", 0).width(c).html(a), "iframe" == e.type && this.modal.content.find("iframe:first").height(g);var m = g + o,
          p = Math.floor(window.innerHeight / 2 - m / 2) - h;0 > p && (p = 0), this.modal.closer.addClass("uk-hidden"), t.modal.data("mwidth") == c && t.modal.data("mheight") == g && (l = 0), this.modal.dialog.animate({ width: c + o, height: g + o, top: p }, l, "swing", function () {
        t.modal.loader.addClass("uk-hidden"), t.modal.content.css({ width: "" }).animate({ opacity: 1 }, function () {
          t.modal.closer.removeClass("uk-hidden");
        }), t.modal.data({ mwidth: c, mheight: g });
      });
    }, next: function () {
      this.show(this.siblings[this.index + 1] ? this.index + 1 : 0);
    }, previous: function () {
      this.show(this.siblings[this.index - 1] ? this.index - 1 : this.siblings.length - 1);
    } }), i.plugin("lightbox", "image", { init: function (i) {
      i.on("showitem.uk.lightbox", function (i, t) {
        if ("image" == t.type || t.source && t.source.match(/\.(jpg|jpeg|png|gif|svg)$/i)) {
          var e = function (i, e, o) {
            t.meta = { content: '<img class="uk-responsive-width" width="' + e + '" height="' + o + '" src ="' + i + '">', width: e, height: o }, t.type = "image", t.promise.resolve();
          };if (o[t.source]) e(t.source, o[t.source].width, o[t.source].height);else {
            var n = new Image();n.onerror = function () {
              t.promise.reject("Loading image failed");
            }, n.onload = function () {
              o[t.source] = { width: n.width, height: n.height }, e(t.source, o[t.source].width, o[t.source].height);
            }, n.src = t.source;
          }
        }
      });
    } }), i.plugin("lightbox", "youtube", { init: function (i) {
      var t = /(\/\/.*?youtube\.[a-z]+)\/watch\?v=([^&]+)&?(.*)/,
          n = /youtu\.be\/(.*)/;i.on("showitem.uk.lightbox", function (i, s) {
        var h,
            a,
            l = function (i, t, o) {
          s.meta = { content: '<iframe src="//www.youtube.com/embed/' + i + '" width="' + t + '" height="' + o + '" style="max-width:100%;"' + (e.lightbox.options.allowfullscreen ? " allowfullscreen" : "") + "></iframe>", width: t, height: o }, s.type = "iframe", s.promise.resolve();
        };if ((a = s.source.match(t)) && (h = a[2]), (a = s.source.match(n)) && (h = a[1]), h) {
          if (o[h]) l(h, o[h].width, o[h].height);else {
            var d = new Image(),
                r = !1;d.onerror = function () {
              o[h] = { width: 640, height: 320 }, l(h, o[h].width, o[h].height);
            }, d.onload = function () {
              120 == d.width && 90 == d.height ? r ? (o[h] = { width: 640, height: 320 }, l(h, o[h].width, o[h].height)) : (r = !0, d.src = "//img.youtube.com/vi/" + h + "/0.jpg") : (o[h] = { width: d.width, height: d.height }, l(h, d.width, d.height));
            }, d.src = "//img.youtube.com/vi/" + h + "/maxresdefault.jpg";
          }i.stopImmediatePropagation();
        }
      });
    } }), i.plugin("lightbox", "vimeo", { init: function (t) {
      var n,
          s = /(\/\/.*?)vimeo\.[a-z]+\/([0-9]+).*?/;t.on("showitem.uk.lightbox", function (t, h) {
        var a,
            l = function (i, t, o) {
          h.meta = { content: '<iframe src="//player.vimeo.com/video/' + i + '" width="' + t + '" height="' + o + '" style="width:100%;box-sizing:border-box;"' + (e.lightbox.options.allowfullscreen ? " allowfullscreen" : "") + "></iframe>", width: t, height: o }, h.type = "iframe", h.promise.resolve();
        };(n = h.source.match(s)) && (a = n[2], o[a] ? l(a, o[a].width, o[a].height) : i.$.ajax({ type: "GET", url: "//vimeo.com/api/oembed.json?url=" + encodeURI(h.source), jsonp: "callback", dataType: "jsonp", success: function (i) {
            o[a] = { width: i.width, height: i.height }, l(a, o[a].width, o[a].height);
          } }), t.stopImmediatePropagation());
      });
    } }), i.plugin("lightbox", "video", { init: function (t) {
      t.on("showitem.uk.lightbox", function (t, e) {
        var n = function (i, t, o) {
          e.meta = { content: '<video class="uk-responsive-width" src="' + i + '" width="' + t + '" height="' + o + '" controls></video>', width: t, height: o }, e.type = "video", e.promise.resolve();
        };if ("video" == e.type || e.source.match(/\.(mp4|webm|ogv)$/i)) if (o[e.source]) n(e.source, o[e.source].width, o[e.source].height);else var s = i.$('<video style="position:fixed;visibility:hidden;top:-10000px;"></video>').attr("src", e.source).appendTo("body"),
            h = setInterval(function () {
          s[0].videoWidth && (clearInterval(h), o[e.source] = { width: s[0].videoWidth, height: s[0].videoHeight }, n(e.source, o[e.source].width, o[e.source].height), s.remove());
        }, 20);
      });
    } }), i.plugin("lightbox", "iframe", { init: function (i) {
      i.on("showitem.uk.lightbox", function (t, o) {
        var n = function (i, t, n) {
          o.meta = { content: '<iframe class="uk-responsive-width" src="' + i + '" width="' + t + '" height="' + n + '"' + (e.lightbox.options.allowfullscreen ? " allowfullscreen" : "") + "></iframe>", width: t, height: n }, o.type = "iframe", o.promise.resolve();
        };("iframe" === o.type || o.source.match(/\.(html|php)$/)) && n(o.source, i.options.width || 800, i.options.height || 600);
      });
    } }), i.lightbox.create = function (t, e) {
    if (t) {
      var o,
          n = [];return t.forEach(function (t) {
        n.push(i.$.extend({ source: "", title: "", type: "auto", link: !1 }, "string" == typeof t ? { source: t } : t));
      }), o = i.lightbox(i.$.extend({}, e, { group: n }));
    }
  }, i.lightbox;
});

},{}],"/Sites/kisk-mennekes-www-20151019-relaunch-frontend/patternlab/source/js/vendor/uikit/modal.min.js":[function(require,module,exports){
/*! UIkit 2.27.4 | http://www.getuikit.com | (c) 2014 YOOtheme | MIT License */
!function (t) {
  "use strict";
  function i(i, e) {
    return e ? ("object" == typeof i ? (i = i instanceof jQuery ? i : t.$(i), i.parent().length && (e.persist = i, e.persist.data("modalPersistParent", i.parent()))) : i = "string" == typeof i || "number" == typeof i ? t.$("<div></div>").html(i) : t.$("<div></div>").html("UIkit2.modal Error: Unsupported data type: " + typeof i), i.appendTo(e.element.find(".uk-modal-dialog")), e) : void 0;
  }var e,
      o = !1,
      n = 0,
      s = t.$html;t.$win.on("resize orientationchange", t.Utils.debounce(function () {
    t.$(".uk-modal.uk-open").each(function () {
      return t.$(this).data("modal") && t.$(this).data("modal").resize();
    });
  }, 150)), t.component("modal", { defaults: { keyboard: !0, bgclose: !0, minScrollHeight: 150, center: !1, modal: !0 }, scrollable: !1, transition: !1, hasTransitioned: !0, init: function () {
      if (e || (e = t.$("body")), this.element.length) {
        var i = this;this.paddingdir = "padding-" + ("left" == t.langdirection ? "right" : "left"), this.dialog = this.find(".uk-modal-dialog"), this.active = !1, this.element.attr("aria-hidden", this.element.hasClass("uk-open")), this.on("click", ".uk-modal-close", function (t) {
          t.preventDefault(), i.hide();
        }).on("click", function (e) {
          var o = t.$(e.target);o[0] == i.element[0] && i.options.bgclose && i.hide();
        }), t.domObserve(this.element, function () {
          i.resize();
        });
      }
    }, toggle: function () {
      return this[this.isActive() ? "hide" : "show"]();
    }, show: function () {
      if (this.element.length) {
        var i = this;if (!this.isActive()) return this.options.modal && o && o.hide(!0), this.element.removeClass("uk-open").show(), this.resize(!0), this.options.modal && (o = this), this.active = !0, n++, t.support.transition ? (this.hasTransitioned = !1, this.element.one(t.support.transition.end, function () {
          i.hasTransitioned = !0, t.Utils.focus(i.dialog, "a[href]");
        }).addClass("uk-open")) : (this.element.addClass("uk-open"), t.Utils.focus(this.dialog, "a[href]")), s.addClass("uk-modal-page").height(), this.element.attr("aria-hidden", "false"), this.element.trigger("show.uk.modal"), t.Utils.checkDisplay(this.dialog, !0), this;
      }
    }, hide: function (i) {
      if (!i && t.support.transition && this.hasTransitioned) {
        var e = this;this.one(t.support.transition.end, function () {
          e._hide();
        }).removeClass("uk-open");
      } else this._hide();return this;
    }, resize: function (t) {
      if (this.isActive() || t) {
        var i = e.width();if (this.scrollbarwidth = window.innerWidth - i, e.css(this.paddingdir, this.scrollbarwidth), this.element.css("overflow-y", this.scrollbarwidth ? "scroll" : "auto"), !this.updateScrollable() && this.options.center) {
          var o = this.dialog.outerHeight(),
              n = parseInt(this.dialog.css("margin-top"), 10) + parseInt(this.dialog.css("margin-bottom"), 10);o + n < window.innerHeight ? this.dialog.css({ top: window.innerHeight / 2 - o / 2 - n }) : this.dialog.css({ top: "" });
        }
      }
    }, updateScrollable: function () {
      var t = this.dialog.find(".uk-overflow-container:visible:first");if (t.length) {
        t.css("height", 0);var i = Math.abs(parseInt(this.dialog.css("margin-top"), 10)),
            e = this.dialog.outerHeight(),
            o = window.innerHeight,
            n = o - 2 * (20 > i ? 20 : i) - e;return t.css({ maxHeight: n < this.options.minScrollHeight ? "" : n, height: "" }), !0;
      }return !1;
    }, _hide: function () {
      this.active = !1, n > 0 ? n-- : n = 0, this.element.hide().removeClass("uk-open"), this.element.attr("aria-hidden", "true"), n || (s.removeClass("uk-modal-page"), e.css(this.paddingdir, "")), o === this && (o = !1), this.trigger("hide.uk.modal");
    }, isActive: function () {
      return this.element.hasClass("uk-open");
    } }), t.component("modalTrigger", { boot: function () {
      t.$html.on("click.modal.uikit", "[data-uk-modal]", function (i) {
        var e = t.$(this);if (e.is("a") && i.preventDefault(), !e.data("modalTrigger")) {
          var o = t.modalTrigger(e, t.Utils.options(e.attr("data-uk-modal")));o.show();
        }
      }), t.$html.on("keydown.modal.uikit", function (t) {
        o && 27 === t.keyCode && o.options.keyboard && (t.preventDefault(), o.hide());
      });
    }, init: function () {
      var i = this;this.options = t.$.extend({ target: i.element.is("a") ? i.element.attr("href") : !1 }, this.options), this.modal = t.modal(this.options.target, this.options), this.on("click", function (t) {
        t.preventDefault(), i.show();
      }), this.proxy(this.modal, "show hide isActive");
    } }), t.modal.dialog = function (e, o) {
    var n = t.modal(t.$(t.modal.dialog.template).appendTo("body"), o);return n.on("hide.uk.modal", function () {
      n.persist && (n.persist.appendTo(n.persist.data("modalPersistParent")), n.persist = !1), n.element.remove();
    }), i(e, n), n;
  }, t.modal.dialog.template = '<div class="uk-modal"><div class="uk-modal-dialog" style="min-height:0;"></div></div>', t.modal.alert = function (i, e) {
    e = t.$.extend(!0, { bgclose: !1, keyboard: !1, modal: !1, labels: t.modal.labels }, e);var o = t.modal.dialog(['<div class="uk-margin uk-modal-content">' + String(i) + "</div>", '<div class="uk-modal-footer uk-text-right"><button class="uk-button uk-button-primary uk-modal-close">' + e.labels.Ok + "</button></div>"].join(""), e);return o.on("show.uk.modal", function () {
      setTimeout(function () {
        o.element.find("button:first").focus();
      }, 50);
    }), o.show();
  }, t.modal.confirm = function (i, e, o) {
    var n = arguments.length > 1 && arguments[arguments.length - 1] ? arguments[arguments.length - 1] : {};e = t.$.isFunction(e) ? e : function () {}, o = t.$.isFunction(o) ? o : function () {}, n = t.$.extend(!0, { bgclose: !1, keyboard: !1, modal: !1, labels: t.modal.labels }, t.$.isFunction(n) ? {} : n);var s = t.modal.dialog(['<div class="uk-margin uk-modal-content">' + String(i) + "</div>", '<div class="uk-modal-footer uk-text-right"><button class="uk-button js-modal-confirm-cancel">' + n.labels.Cancel + '</button> <button class="uk-button uk-button-primary js-modal-confirm">' + n.labels.Ok + "</button></div>"].join(""), n);return s.element.find(".js-modal-confirm, .js-modal-confirm-cancel").on("click", function () {
      t.$(this).is(".js-modal-confirm") ? e() : o(), s.hide();
    }), s.on("show.uk.modal", function () {
      setTimeout(function () {
        s.element.find(".js-modal-confirm").focus();
      }, 50);
    }), s.show();
  }, t.modal.prompt = function (i, e, o, n) {
    o = t.$.isFunction(o) ? o : function () {}, n = t.$.extend(!0, { bgclose: !1, keyboard: !1, modal: !1, labels: t.modal.labels }, n);var s = t.modal.dialog([i ? '<div class="uk-modal-content uk-form">' + String(i) + "</div>" : "", '<div class="uk-margin-small-top uk-modal-content uk-form"><p><input type="text" class="uk-width-1-1"></p></div>', '<div class="uk-modal-footer uk-text-right"><button class="uk-button uk-modal-close">' + n.labels.Cancel + '</button> <button class="uk-button uk-button-primary js-modal-ok">' + n.labels.Ok + "</button></div>"].join(""), n),
        a = s.element.find("input[type='text']").val(e || "").on("keyup", function (t) {
      13 == t.keyCode && s.element.find(".js-modal-ok").trigger("click");
    });return s.element.find(".js-modal-ok").on("click", function () {
      o(a.val()) !== !1 && s.hide();
    }), s.show();
  }, t.modal.blockUI = function (i, e) {
    var o = t.modal.dialog(['<div class="uk-margin uk-modal-content">' + String(i || '<div class="uk-text-center">...</div>') + "</div>"].join(""), t.$.extend({ bgclose: !1, keyboard: !1, modal: !1 }, e));return o.content = o.element.find(".uk-modal-content:first"), o.show();
  }, t.modal.labels = { Ok: "Ok", Cancel: "Cancel" };
}(UIkit2);

},{}],"/Sites/kisk-mennekes-www-20151019-relaunch-frontend/patternlab/source/js/vendor/uikit/slider.min.js":[function(require,module,exports){
/*! UIkit 2.25.0 | http://www.getuikit.com | (c) 2014 YOOtheme | MIT License */
!function (t) {
  var e;window.UIkit && (e = t(UIkit)), "function" == typeof define && define.amd && define("uikit-slider", ["uikit"], function () {
    return e || t(UIkit);
  });
}(function (t) {
  "use strict";
  var e,
      i,
      s,
      n,
      a = {};return t.component("slider", { defaults: { center: !1, threshold: 10, infinite: !0, autoplay: !1, autoplayInterval: 7e3, pauseOnHover: !0, activecls: "uk-active" }, boot: function () {
      t.ready(function (e) {
        setTimeout(function () {
          t.$("[data-uk-slider]", e).each(function () {
            var e = t.$(this);e.data("slider") || t.slider(e, t.Utils.options(e.attr("data-uk-slider")));
          });
        }, 0);
      });
    }, init: function () {
      var o = this;this.container = this.element.find(".uk-slider"), this.focus = 0, t.$win.on("resize load", t.Utils.debounce(function () {
        o.resize(!0);
      }, 100)), this.on("click.uk.slider", "[data-uk-slider-item]", function (e) {
        e.preventDefault();var i = t.$(this).attr("data-uk-slider-item");if (o.focus != i) switch (o.stop(), i) {case "next":case "previous":
            o["next" == i ? "next" : "previous"]();break;default:
            o.updateFocus(parseInt(i, 10));}
      }), this.container.on({ "touchstart mousedown": function (h) {
          h.originalEvent && h.originalEvent.touches && (h = h.originalEvent.touches[0]), h.button && 2 == h.button || !o.active || (o.stop(), s = t.$(h.target).is("a") ? t.$(h.target) : t.$(h.target).parents("a:first"), n = !1, s.length && s.one("click", function (t) {
            n && t.preventDefault();
          }), i = function (t) {
            n = !0, e = o, a = { touchx: parseInt(t.pageX, 10), dir: 1, focus: o.focus, base: o.options.center ? "center" : "area" }, t.originalEvent && t.originalEvent.touches && (t = t.originalEvent.touches[0]), e.element.data({ "pointer-start": { x: parseInt(t.pageX, 10), y: parseInt(t.pageY, 10) }, "pointer-pos-start": o.pos }), o.container.addClass("uk-drag"), i = !1;
          }, i.x = parseInt(h.pageX, 10), i.threshold = o.options.threshold);
        }, mouseenter: function () {
          o.options.pauseOnHover && (o.hovering = !0);
        }, mouseleave: function () {
          o.hovering = !1;
        } }), this.resize(!0), this.on("display.uk.check", function () {
        o.element.is(":visible") && o.resize(!0);
      }), this.element.find("a,img").attr("draggable", "false"), this.options.autoplay && this.start();
    }, resize: function (e) {
      var i,
          s,
          n,
          a,
          o = this,
          h = 0,
          r = 0;return this.items = this.container.children().filter(":visible"), this.vp = this.element[0].getBoundingClientRect().width, this.container.css({ "min-width": "", "min-height": "" }), this.items.each(function (e) {
        i = t.$(this), a = i.css({ left: "", width: "" })[0].getBoundingClientRect(), s = a.width, n = i.width(), r = Math.max(r, a.height), i.css({ left: h, width: s }).data({ idx: e, left: h, width: s, cwidth: n, area: h + s, center: h - (o.vp / 2 - n / 2) }), h += s;
      }), this.container.css({ "min-width": h, "min-height": r }), this.options.infinite && (h <= 2 * this.vp || this.items.length < 5) && !this.itemsResized ? (this.container.children().each(function (t) {
        o.container.append(o.items.eq(t).clone(!0).attr("id", ""));
      }).each(function (t) {
        o.container.append(o.items.eq(t).clone(!0).attr("id", ""));
      }), this.itemsResized = !0, this.resize()) : (this.cw = h, this.pos = 0, this.active = h >= this.vp, this.container.css({ "-ms-transform": "", "-webkit-transform": "", transform: "" }), e && this.updateFocus(this.focus), void 0);
    }, updatePos: function (t) {
      this.pos = t, this.container.css({ "-ms-transform": "translateX(" + t + "px)", "-webkit-transform": "translateX(" + t + "px)", transform: "translateX(" + t + "px)" });
    }, updateFocus: function (e, i) {
      if (this.active) {
        i = i || (e > this.focus ? 1 : -1);var s,
            n,
            a = this.items.eq(e);if (this.options.infinite && this.infinite(e, i), this.options.center) this.updatePos(-1 * a.data("center")), this.items.filter("." + this.options.activecls).removeClass(this.options.activecls), a.addClass(this.options.activecls);else if (this.options.infinite) this.updatePos(-1 * a.data("left"));else {
          for (s = 0, n = e; n < this.items.length; n++) s += this.items.eq(n).data("width");if (s > this.vp) this.updatePos(-1 * a.data("left"));else if (1 == i) {
            for (s = 0, n = this.items.length - 1; n >= 0; n--) {
              if (s += this.items.eq(n).data("width"), s == this.vp) {
                e = n;break;
              }if (s > this.vp) {
                e = n < this.items.length - 1 ? n + 1 : n;break;
              }
            }s > this.vp ? this.updatePos(-1 * (this.container.width() - this.vp)) : this.updatePos(-1 * this.items.eq(e).data("left"));
          }
        }var o = this.items.eq(e).data("left");this.items.removeClass("uk-slide-before uk-slide-after").each(function (i) {
          i !== e && t.$(this).addClass(t.$(this).data("left") < o ? "uk-slide-before" : "uk-slide-after");
        }), this.focus = e, this.trigger("focusitem.uk.slider", [e, this.items.eq(e), this]);
      }
    }, next: function () {
      var t = this.items[this.focus + 1] ? this.focus + 1 : this.options.infinite ? 0 : this.focus;this.updateFocus(t, 1);
    }, previous: function () {
      var t = this.items[this.focus - 1] ? this.focus - 1 : this.options.infinite ? this.items[this.focus - 1] ? this.items - 1 : this.items.length - 1 : this.focus;this.updateFocus(t, -1);
    }, start: function () {
      this.stop();var t = this;this.interval = setInterval(function () {
        t.hovering || t.next();
      }, this.options.autoplayInterval);
    }, stop: function () {
      this.interval && clearInterval(this.interval);
    }, infinite: function (t, e) {
      var i,
          s = this,
          n = this.items.eq(t),
          a = t,
          o = [],
          h = 0;if (1 == e) {
        for (i = 0; i < this.items.length && (a != t && (h += this.items.eq(a).data("width"), o.push(this.items.eq(a))), !(h > this.vp)); i++) a = a + 1 == this.items.length ? 0 : a + 1;o.length && o.forEach(function (t) {
          var e = n.data("area");t.css({ left: e }).data({ left: e, area: e + t.data("width"), center: e - (s.vp / 2 - t.data("cwidth") / 2) }), n = t;
        });
      } else {
        for (i = this.items.length - 1; i > -1 && (h += this.items.eq(a).data("width"), a != t && o.push(this.items.eq(a)), !(h > this.vp)); i--) a = a - 1 == -1 ? this.items.length - 1 : a - 1;o.length && o.forEach(function (t) {
          var e = n.data("left") - t.data("width");t.css({ left: e }).data({ left: e, area: e + t.data("width"), center: e - (s.vp / 2 - t.data("cwidth") / 2) }), n = t;
        });
      }
    } }), t.$doc.on("mousemove.uk.slider touchmove.uk.slider", function (t) {
    if (t.originalEvent && t.originalEvent.touches && (t = t.originalEvent.touches[0]), i && Math.abs(t.pageX - i.x) > i.threshold && (window.getSelection().toString() ? e = i = !1 : i(t)), e) {
      var s, n, o, h, r, c, f, u, d, l;if (t.clientX || t.clientY ? s = t.clientX : (t.pageX || t.pageY) && (s = t.pageX - document.body.scrollLeft - document.documentElement.scrollLeft), r = a.focus, n = s - e.element.data("pointer-start").x, o = e.element.data("pointer-pos-start") + n, h = s > e.element.data("pointer-start").x ? -1 : 1, c = e.items.eq(a.focus), 1 == h) for (f = c.data("left") + Math.abs(n), u = 0, d = a.focus; u < e.items.length; u++) {
        if (l = e.items.eq(d), d != a.focus && l.data("left") < f && l.data("area") > f) {
          r = d;break;
        }d = d + 1 == e.items.length ? 0 : d + 1;
      } else for (f = c.data("left") - Math.abs(n), u = 0, d = a.focus; u < e.items.length; u++) {
        if (l = e.items.eq(d), d != a.focus && l.data("area") <= c.data("left") && l.data("center") < f) {
          r = d;break;
        }d = d - 1 == -1 ? e.items.length - 1 : d - 1;
      }e.options.infinite && r != a._focus && e.infinite(r, h), e.updatePos(o), a.dir = h, a._focus = r, a.touchx = parseInt(t.pageX, 10), a.diff = f;
    }
  }), t.$doc.on("mouseup.uk.slider touchend.uk.slider", function () {
    if (e) {
      e.container.removeClass("uk-drag"), e.items.eq(a.focus);var t,
          s,
          n,
          o = !1;if (1 == a.dir) for (s = 0, n = a.focus; s < e.items.length; s++) {
        if (t = e.items.eq(n), n != a.focus && t.data("left") > a.diff) {
          o = n;break;
        }n = n + 1 == e.items.length ? 0 : n + 1;
      } else for (s = 0, n = a.focus; s < e.items.length; s++) {
        if (t = e.items.eq(n), n != a.focus && t.data("left") < a.diff) {
          o = n;break;
        }n = n - 1 == -1 ? e.items.length - 1 : n - 1;
      }e.updateFocus(o !== !1 ? o : a._focus);
    }e = i = !1;
  }), t.slider;
});

},{}],"/Sites/kisk-mennekes-www-20151019-relaunch-frontend/patternlab/source/js/vendor/uikit/slideset.min.js":[function(require,module,exports){
/*! UIkit 2.25.0 | http://www.getuikit.com | (c) 2014 YOOtheme | MIT License */
!function (t) {
  var i;window.UIkit && (i = t(UIkit)), "function" == typeof define && define.amd && define("uikit-slideset", ["uikit"], function () {
    return i || t(UIkit);
  });
}(function (t) {
  "use strict";
  function i(i, e, s, n) {
    var a,
        o,
        r,
        l,
        h = t.$.Deferred(),
        u = this.options.delay === !1 ? Math.floor(this.options.duration / 2) : this.options.delay,
        d = this;if (n = n || 1, this.element.css("min-height", this.element.height()), s[0] === e[0]) return h.resolve(), h.promise();if ("object" == typeof i ? (a = i[0], o = i[1] || i[0]) : (a = i, o = a), r = function () {
      if (e && e.length && e.hide().removeClass(o + " uk-animation-reverse").css({ opacity: "", "animation-delay": "", animation: "" }), !s.length) return h.resolve(), void 0;for (l = 0; l < s.length; l++) s.eq(1 == n ? l : s.length - l - 1).css("animation-delay", l * u + "ms");var i = function () {
        s.removeClass("" + a).css({ opacity: "", display: "", "animation-delay": "", animation: "" }), h.resolve(), d.element.css("min-height", ""), i = !1;
      };s.addClass(a)[1 == n ? "last" : "first"]().one(t.support.animation.end, function () {
        i && i();
      }).end().css("display", ""), setTimeout(function () {
        i && i();
      }, s.length * u * 2);
    }, s.length && s.css("animation-duration", this.options.duration + "ms"), e && e.length) for (e.css("animation-duration", this.options.duration + "ms")[1 == n ? "last" : "first"]().one(t.support.animation.end, function () {
      r();
    }), l = 0; l < e.length; l++) !function (i, e) {
      setTimeout(function () {
        e.css("display", "none").css("display", "").css("opacity", 0).on(t.support.animation.end, function () {
          e.removeClass(o);
        }).addClass(o + " uk-animation-reverse");
      }.bind(this), l * u);
    }(l, e.eq(1 == n ? l : e.length - l - 1));else r();return h.promise();
  }function e(t, i) {
    var e,
        s = 0,
        n = -1,
        a = t.length || 0,
        o = [];if (1 > i) return null;for (; a > s;) e = s % i, e ? o[n][e] = t[s] : o[++n] = [t[s]], s++;for (s = 0, a = o.length; a > s;) o[s] = jQuery(o[s]), s++;return o;
  }var s;t.component("slideset", { defaults: { "default": 1, animation: "fade", duration: 200, filter: "", delay: !1, controls: !1, autoplay: !1, autoplayInterval: 7e3, pauseOnHover: !0 }, sets: [], boot: function () {
      t.ready(function (i) {
        t.$("[data-uk-slideset]", i).each(function () {
          var i = t.$(this);i.data("slideset") || t.slideset(i, t.Utils.options(i.attr("data-uk-slideset")));
        });
      });
    }, init: function () {
      var i = this;this.activeSet = !1, this.list = this.element.find(".uk-slideset"), this.nav = this.element.find(".uk-slideset-nav"), this.controls = this.options.controls ? t.$(this.options.controls) : this.element, t.$win.on("resize load", t.Utils.debounce(function () {
        i.updateSets();
      }, 100)), i.list.addClass("uk-grid-width-1-" + i.options.default), ["xlarge", "large", "medium", "small"].forEach(function (t) {
        i.options[t] && i.list.addClass("uk-grid-width-" + t + "-1-" + i.options[t]);
      }), this.on("click.uk.slideset", "[data-uk-slideset-item]", function (e) {
        if (e.preventDefault(), !i.animating) {
          var s = t.$(this).attr("data-uk-slideset-item");if (i.activeSet !== s) switch (s) {case "next":case "previous":
              i["next" == s ? "next" : "previous"]();break;default:
              i.show(parseInt(s, 10));}
        }
      }), this.controls.on("click.uk.slideset", "[data-uk-filter]", function (e) {
        var s = t.$(this);s.parent().hasClass("uk-slideset") || (e.preventDefault(), i.animating || i.currentFilter == s.attr("data-uk-filter") || (i.updateFilter(s.attr("data-uk-filter")), i._hide().then(function () {
          i.updateSets(!0, !0);
        })));
      }), this.on("swipeRight swipeLeft", function (t) {
        i["swipeLeft" == t.type ? "next" : "previous"]();
      }), this.updateFilter(this.options.filter), this.updateSets(), this.element.on({ mouseenter: function () {
          i.options.pauseOnHover && (i.hovering = !0);
        }, mouseleave: function () {
          i.hovering = !1;
        } }), this.options.autoplay && this.start();
    }, updateSets: function (t, i) {
      var s,
          n = this.visible;if (this.visible = this.getVisibleOnCurrenBreakpoint(), n != this.visible || i) {
        for (this.children = this.list.children().hide(), this.items = this.getItems(), this.sets = e(this.items, this.visible), s = 0; s < this.sets.length; s++) this.sets[s].css({ display: "none" });if (this.nav.length && this.nav.empty()) {
          for (s = 0; s < this.sets.length; s++) this.nav.append('<li data-uk-slideset-item="' + s + '"><a></a></li>');this.nav[1 == this.nav.children().length ? "addClass" : "removeClass"]("uk-invisible");
        }this.activeSet = !1, this.show(0, !t);
      }
    }, updateFilter: function (i) {
      var e,
          s = this;this.currentFilter = i, this.controls.find("[data-uk-filter]").each(function () {
        e = t.$(this), e.parent().hasClass("uk-slideset") || (e.attr("data-uk-filter") == s.currentFilter ? e.addClass("uk-active") : e.removeClass("uk-active"));
      });
    }, getVisibleOnCurrenBreakpoint: function () {
      var i = null,
          e = t.$('<div style="position:absolute;height:1px;top:-1000px;width:100px"><div></div></div>').appendTo("body"),
          s = e.children().eq(0),
          n = this.options;return ["xlarge", "large", "medium", "small"].forEach(function (t) {
        n[t] && !i && (e.attr("class", "uk-grid-width-" + t + "-1-2").width(), 50 == s.width() && (i = t));
      }), e.remove(), this.options[i] || this.options["default"];
    }, getItems: function () {
      var i,
          e = [];return this.currentFilter ? (i = this.currentFilter || [], "string" == typeof i && (i = i.split(/,/).map(function (t) {
        return t.trim();
      })), this.children.each(function () {
        var s = t.$(this),
            n = s.attr("data-uk-filter"),
            a = i.length ? !1 : !0;n && (n = n.split(/,/).map(function (t) {
          return t.trim();
        }), i.forEach(function (t) {
          n.indexOf(t) > -1 && (a = !0);
        })), a && e.push(s[0]);
      }), e = t.$(e)) : e = this.list.children(), e;
    }, show: function (i, e, n) {
      var a = this;if (this.activeSet !== i && !this.animating) {
        n = n || (i < this.activeSet ? -1 : 1);var o = this.sets[this.activeSet] || [],
            r = this.sets[i],
            l = this._getAnimation();(e || !t.support.animation) && (l = s.none), this.animating = !0, this.nav.length && this.nav.children().removeClass("uk-active").eq(i).addClass("uk-active"), l.apply(a, [o, r, n]).then(function () {
          t.Utils.checkDisplay(r, !0), a.children.hide().removeClass("uk-active"), r.addClass("uk-active").css({ display: "", opacity: "" }), a.animating = !1, a.activeSet = i, t.Utils.checkDisplay(r, !0), a.trigger("show.uk.slideset", [r]);
        });
      }
    }, _getAnimation: function () {
      var i = s[this.options.animation] || s.none;return t.support.animation || (i = s.none), i;
    }, _hide: function () {
      var t = this,
          i = this.sets[this.activeSet] || [],
          e = this._getAnimation();return this.animating = !0, e.apply(t, [i, [], 1]).then(function () {
        t.animating = !1;
      });
    }, next: function () {
      this.show(this.sets[this.activeSet + 1] ? this.activeSet + 1 : 0, !1, 1);
    }, previous: function () {
      this.show(this.sets[this.activeSet - 1] ? this.activeSet - 1 : this.sets.length - 1, !1, -1);
    }, start: function () {
      this.stop();var t = this;this.interval = setInterval(function () {
        t.hovering || t.animating || t.next();
      }, this.options.autoplayInterval);
    }, stop: function () {
      this.interval && clearInterval(this.interval);
    } }), s = { none: function () {
      var i = t.$.Deferred();return i.resolve(), i.promise();
    }, fade: function (t, e) {
      return i.apply(this, ["uk-animation-fade", t, e]);
    }, "slide-bottom": function (t, e) {
      return i.apply(this, ["uk-animation-slide-bottom", t, e]);
    }, "slide-top": function (t, e) {
      return i.apply(this, ["uk-animation-slide-top", t, e]);
    }, "slide-vertical": function (t, e, s) {
      var n = ["uk-animation-slide-top", "uk-animation-slide-bottom"];return -1 == s && n.reverse(), i.apply(this, [n, t, e]);
    }, "slide-horizontal": function (t, e, s) {
      var n = ["uk-animation-slide-right", "uk-animation-slide-left"];return -1 == s && n.reverse(), i.apply(this, [n, t, e, s]);
    }, scale: function (t, e) {
      return i.apply(this, ["uk-animation-scale-up", t, e]);
    } }, t.slideset.animations = s;
});

},{}],"/Sites/kisk-mennekes-www-20151019-relaunch-frontend/patternlab/source/js/vendor/uikit/slideshow.min.js":[function(require,module,exports){
/*! UIkit 2.25.0 | http://www.getuikit.com | (c) 2014 YOOtheme | MIT License */
!function (i) {
    var t;
    window.UIkit && (t = i(UIkit)), "function" == typeof define && define.amd && define("uikit-slideshow", ["uikit"], function () {
        return t || i(UIkit);
    });
}(function (i) {
    "use strict";

    var t,
        s = 0;
    i.component("slideshow", {
        defaults: {
            animation: "fade",
            duration: 500,
            height: "auto",
            start: 0,
            autoplay: !1,
            autoplayInterval: 7e3,
            videoautoplay: !0,
            videomute: !0,
            slices: 15,
            pauseOnHover: !0,
            kenburns: !1,
            kenburnsanimations: ["uk-animation-middle-left", "uk-animation-top-right", "uk-animation-bottom-left", "uk-animation-top-center", "", "uk-animation-bottom-right"]
        }, current: !1, interval: null, hovering: !1, boot: function () {
            i.ready(function (t) {
                i.$("[data-uk-slideshow]", t).each(function () {
                    var t = i.$(this);
                    t.data("slideshow") || i.slideshow(t, i.Utils.options(t.attr("data-uk-slideshow")));
                });
            });
        }, init: function () {
            var t,
                e,
                a = this;
            this.container = this.element.hasClass("uk-slideshow") ? this.element : i.$(this.find(".uk-slideshow")), this.slides = this.container.children(), this.slidesCount = this.slides.length, this.current = this.options.start, this.animating = !1, this.triggers = this.find("[data-uk-slideshow-item]"), this.fixFullscreen = navigator.userAgent.match(/(iPad|iPhone|iPod)/g) && this.container.hasClass("uk-slideshow-fullscreen"), this.options.kenburns && (e = this.options.kenburns === !0 ? "15s" : this.options.kenburns, String(e).match(/(ms|s)$/) || (e += "ms"), "string" == typeof this.options.kenburnsanimations && (this.options.kenburnsanimations = this.options.kenburnsanimations.split(","))), this.slides.each(function (n) {
                var o = i.$(this),
                    r = o.children("img,video,iframe").eq(0);
                if (o.data("media", r), o.data("sizer", r), r.length) {
                    var d;
                    switch (r[0].nodeName) {
                        case "PICTURE":
                        case "IMG":
                            var u = i.$('<div class="uk-cover-background uk-position-cover"></div>').css({ "background-image": "url(" + r.attr("src") + ")" });
                            r.attr("width") && r.attr("height") && (d = i.$("<canvas></canvas>").attr({
                                width: r.attr("width"),
                                height: r.attr("height")
                            }), r.replaceWith(d), r = d, d = void 0), r.css({
                                width: "100%",
                                height: "auto",
                                opacity: 0
                            }), o.prepend(u).data("cover", u);
                            break;
                        case "IFRAME":
                            var h = r[0].src,
                                c = "sw-" + ++s;
                            r.attr("src", "").on("load", function () {
                                if ((n !== a.current || n == a.current && !a.options.videoautoplay) && a.pausemedia(r), a.options.videomute) {
                                    a.mutemedia(r);
                                    var i = setInterval(function (t) {
                                        return function () {
                                            a.mutemedia(r), ++t >= 4 && clearInterval(i);
                                        };
                                    }(0), 250);
                                }
                            }).data("slideshow", a).attr("data-player-id", c).attr("src", [h, h.indexOf("?") > -1 ? "&" : "?", "enablejsapi=1&api=1&player_id=" + c].join("")).addClass("uk-position-absolute"), i.support.touch || r.css("pointer-events", "none"), d = !0, i.cover && (i.cover(r), r.attr("data-uk-cover", "{}"));
                            break;
                        case "VIDEO":
                            r.addClass("uk-cover-object uk-position-absolute"), d = !0, a.options.videomute && a.mutemedia(r);
                    }
                    if (d) {
                        t = i.$("<canvas></canvas>").attr({ width: r[0].width, height: r[0].height });
                        var l = i.$('<img style="width:100%;height:auto;">').attr("src", t[0].toDataURL());
                        o.prepend(l), o.data("sizer", l);
                    }
                } else o.data("sizer", o);
                a.hasKenBurns(o) && o.data("cover").css({ "-webkit-animation-duration": e, "animation-duration": e });
            }), this.on("click.uk.slideshow", "[data-uk-slideshow-item]", function (t) {
                t.preventDefault();
                var s = i.$(this).attr("data-uk-slideshow-item");
                if (a.current != s) {
                    switch (s) {
                        case "next":
                        case "previous":
                            a["next" == s ? "next" : "previous"]();
                            break;
                        default:
                            a.show(parseInt(s, 10));
                    }
                    a.stop();
                }
            }), this.slides.attr("aria-hidden", "true").eq(this.current).addClass("uk-active").attr("aria-hidden", "false"), this.triggers.filter('[data-uk-slideshow-item="' + this.current + '"]').addClass("uk-active"), i.$win.on("resize load", i.Utils.debounce(function () {
                a.resize(), a.fixFullscreen && (a.container.css("height", window.innerHeight), a.slides.css("height", window.innerHeight));
            }, 100)), setTimeout(function () {
                a.resize();
            }, 80), this.options.autoplay && this.start(), this.options.videoautoplay && this.slides.eq(this.current).data("media") && this.playmedia(this.slides.eq(this.current).data("media")), this.options.kenburns && this.applyKenBurns(this.slides.eq(this.current)), this.container.on({
                mouseenter: function () {
                    a.options.pauseOnHover && (a.hovering = !0);
                }, mouseleave: function () {
                    a.hovering = !1;
                }
            }), this.on("swipeRight swipeLeft", function (i) {
                a["swipeLeft" == i.type ? "next" : "previous"]();
            }), this.on("display.uk.check", function () {
                a.element.is(":visible") && (a.resize(), a.fixFullscreen && (a.container.css("height", window.innerHeight), a.slides.css("height", window.innerHeight)));
            });
        }, resize: function () {
            if (!this.container.hasClass("uk-slideshow-fullscreen")) {
                var t = this.options.height;
                "auto" === this.options.height && (t = 0, this.slides.css("height", "").each(function () {
                    t = Math.max(t, i.$(this).height());
                })), this.container.css("height", t), this.slides.css("height", t);
            }
        }, show: function (s, e) {
            if (!this.animating && this.current != s) {
                this.animating = !0;
                var a = this,
                    n = this.slides.eq(this.current),
                    o = this.slides.eq(s),
                    r = e ? e : this.current < s ? 1 : -1,
                    d = n.data("media"),
                    u = t[this.options.animation] ? this.options.animation : "fade",
                    h = o.data("media"),
                    c = function () {
                    a.animating && (d && d.is("video,iframe") && a.pausemedia(d), h && h.is("video,iframe") && a.playmedia(h), o.addClass("uk-active").attr("aria-hidden", "false"), n.removeClass("uk-active").attr("aria-hidden", "true"), a.animating = !1, a.current = s, i.Utils.checkDisplay(o, '[class*="uk-animation-"]:not(.uk-cover-background.uk-position-cover)'), a.trigger("show.uk.slideshow", [o, n, a]));
                };
                a.applyKenBurns(o), i.support.animation || (u = "none"), n = i.$(n), o = i.$(o), a.trigger("beforeshow.uk.slideshow", [o, n, a]), t[u].apply(this, [n, o, r]).then(c), a.triggers.removeClass("uk-active"), a.triggers.filter('[data-uk-slideshow-item="' + s + '"]').addClass("uk-active");
            }
        }, applyKenBurns: function (i) {
            if (this.hasKenBurns(i)) {
                var t = this.options.kenburnsanimations,
                    s = this.kbindex || 0;
                i.data("cover").attr("class", "uk-cover-background uk-position-cover").width(), i.data("cover").addClass(["uk-animation-scale", "uk-animation-reverse", t[s].trim()].join(" ")), this.kbindex = t[s + 1] ? s + 1 : 0;
            }
        }, hasKenBurns: function (i) {
            return this.options.kenburns && i.data("cover");
        }, next: function () {
            this.show(this.slides[this.current + 1] ? this.current + 1 : 0, 1);
        }, previous: function () {
            this.show(this.slides[this.current - 1] ? this.current - 1 : this.slides.length - 1, -1);
        }, start: function () {
            this.stop();
            var i = this;
            this.interval = setInterval(function () {
                i.hovering || i.next();
            }, this.options.autoplayInterval);
        }, stop: function () {
            this.interval && clearInterval(this.interval);
        }, playmedia: function (i) {
            if (i && i[0]) switch (i[0].nodeName) {
                case "VIDEO":
                    this.options.videomute || (i[0].muted = !1), i[0].play();
                    break;
                case "IFRAME":
                    this.options.videomute || i[0].contentWindow.postMessage('{ "event": "command", "func": "unmute", "method":"setVolume", "value":1}', "*"), i[0].contentWindow.postMessage('{ "event": "command", "func": "playVideo", "method":"play"}', "*");
            }
        }, pausemedia: function (i) {
            switch (i[0].nodeName) {
                case "VIDEO":
                    i[0].pause();
                    break;
                case "IFRAME":
                    i[0].contentWindow.postMessage('{ "event": "command", "func": "pauseVideo", "method":"pause"}', "*");
            }
        }, mutemedia: function (i) {
            switch (i[0].nodeName) {
                case "VIDEO":
                    i[0].muted = !0;
                    break;
                case "IFRAME":
                    i[0].contentWindow.postMessage('{ "event": "command", "func": "mute", "method":"setVolume", "value":0}', "*");
            }
        }
    }), t = {
        none: function () {
            var t = i.$.Deferred();
            return t.resolve(), t.promise();
        }, scroll: function (t, s, e) {
            var a = i.$.Deferred();
            return t.css("animation-duration", this.options.duration + "ms"), s.css("animation-duration", this.options.duration + "ms"), s.css("opacity", 1).one(i.support.animation.end, function () {
                t.removeClass(-1 == e ? "uk-slideshow-scroll-backward-out" : "uk-slideshow-scroll-forward-out"), s.css("opacity", "").removeClass(-1 == e ? "uk-slideshow-scroll-backward-in" : "uk-slideshow-scroll-forward-in"), a.resolve();
            }.bind(this)), t.addClass(-1 == e ? "uk-slideshow-scroll-backward-out" : "uk-slideshow-scroll-forward-out"), s.addClass(-1 == e ? "uk-slideshow-scroll-backward-in" : "uk-slideshow-scroll-forward-in"), s.width(), a.promise();
        }, swipe: function (t, s, e) {
            var a = i.$.Deferred();
            return t.css("animation-duration", this.options.duration + "ms"), s.css("animation-duration", this.options.duration + "ms"), s.css("opacity", 1).one(i.support.animation.end, function () {
                t.removeClass(-1 === e ? "uk-slideshow-swipe-backward-out" : "uk-slideshow-swipe-forward-out"), s.css("opacity", "").removeClass(-1 === e ? "uk-slideshow-swipe-backward-in" : "uk-slideshow-swipe-forward-in"), a.resolve();
            }.bind(this)), t.addClass(-1 == e ? "uk-slideshow-swipe-backward-out" : "uk-slideshow-swipe-forward-out"), s.addClass(-1 == e ? "uk-slideshow-swipe-backward-in" : "uk-slideshow-swipe-forward-in"), s.width(), a.promise();
        }, scale: function (t, s) {
            var e = i.$.Deferred();
            return t.css("animation-duration", this.options.duration + "ms"), s.css("animation-duration", this.options.duration + "ms"), s.css("opacity", 1), t.one(i.support.animation.end, function () {
                t.removeClass("uk-slideshow-scale-out"), s.css("opacity", ""), e.resolve();
            }.bind(this)), t.addClass("uk-slideshow-scale-out"), t.width(), e.promise();
        }, fade: function (t, s) {
            var e = i.$.Deferred();
            return t.css("animation-duration", this.options.duration + "ms"), s.css("animation-duration", this.options.duration + "ms"), s.css("opacity", 1), s.data("cover") || s.data("placeholder") || s.css("opacity", 1).one(i.support.animation.end, function () {
                s.removeClass("uk-slideshow-fade-in");
            }).addClass("uk-slideshow-fade-in"), t.one(i.support.animation.end, function () {
                t.removeClass("uk-slideshow-fade-out"), s.css("opacity", ""), e.resolve();
            }.bind(this)), t.addClass("uk-slideshow-fade-out"), t.width(), e.promise();
        }
    }, i.slideshow.animations = t, window.addEventListener("message", function (t) {
        var s,
            e = t.data;
        if ("string" == typeof e) try {
            e = JSON.parse(e);
        } catch (a) {
            e = {};
        }
        t.origin && t.origin.indexOf("vimeo") > -1 && "ready" == e.event && e.player_id && (s = i.$('[data-player-id="' + e.player_id + '"]'), s.length && s.data("slideshow").mutemedia(s));
    }, !1);
});

},{}],"/Sites/kisk-mennekes-www-20151019-relaunch-frontend/patternlab/source/js/vendor/uikit/sticky.min.js":[function(require,module,exports){
/*! UIkit 2.26.3 | http://www.getuikit.com | (c) 2014 YOOtheme | MIT License */
!function (t) {
  var i;window.UIkit && (i = t(UIkit)), "function" == typeof define && define.amd && define("uikit-sticky", ["uikit"], function () {
    return i || t(UIkit);
  });
}(function (t) {
  "use strict";
  function i() {
    var i = arguments.length ? arguments : n;if (i.length && !(e.scrollTop() < 0)) for (var o, a, r, h, p = e.scrollTop(), c = s.height(), l = e.height(), d = c - l, u = p > d ? d - p : 0, m = 0; m < i.length; m++) if (h = i[m], h.element.is(":visible") && !h.animate) {
      if (h.check()) {
        if (h.top < 0 ? o = 0 : (r = h.element.outerHeight(), o = c - r - h.top - h.options.bottom - p - u, o = 0 > o ? o + h.top : h.top), h.boundary && h.boundary.length) {
          var f = h.boundary.offset().top;a = h.boundtoparent ? c - (f + h.boundary.outerHeight()) + parseInt(h.boundary.css("padding-bottom")) : c - f, o = p + r > c - a - (h.top < 0 ? 0 : h.top) ? c - a - (p + r) : o;
        }if (h.currentTop != o) {
          if (h.element.css({ position: "fixed", top: o, width: h.getWidthFrom.length ? h.getWidthFrom.width() : h.element.width() }), !h.init && (h.element.addClass(h.options.clsinit), location.hash && p > 0 && h.options.target)) {
            var g = t.$(location.hash);g.length && setTimeout(function (t, i) {
              return function () {
                i.element.width();var e = t.offset(),
                    s = e.top + t.outerHeight(),
                    n = i.element.offset(),
                    o = i.element.outerHeight(),
                    a = n.top + o;n.top < s && e.top < a && (p = e.top - o - i.options.target, window.scrollTo(0, p));
              };
            }(g, h), 0);
          }h.element.addClass(h.options.clsactive).removeClass(h.options.clsinactive), h.element.trigger("active.uk.sticky"), h.element.css("margin", ""), h.options.animation && h.init && !t.Utils.isInView(h.wrapper) && h.element.addClass(h.options.animation), h.currentTop = o;
        }
      } else null !== h.currentTop && h.reset();h.init = !0;
    }
  }var e = t.$win,
      s = t.$doc,
      n = [],
      o = 1;return t.component("sticky", { defaults: { top: 0, bottom: 0, animation: "", clsinit: "uk-sticky-init", clsactive: "uk-active", clsinactive: "", getWidthFrom: "", showup: !1, boundary: !1, media: !1, target: !1, disabled: !1 }, boot: function () {
      t.$doc.on("scrolling.uk.document", function (t, e) {
        e && e.dir && (o = e.dir.y, i());
      }), t.$win.on("resize orientationchange", t.Utils.debounce(function () {
        if (n.length) {
          for (var t = 0; t < n.length; t++) n[t].reset(!0);i();
        }
      }, 100)), t.ready(function (e) {
        setTimeout(function () {
          t.$("[data-uk-sticky]", e).each(function () {
            var i = t.$(this);i.data("sticky") || t.sticky(i, t.Utils.options(i.attr("data-uk-sticky")));
          }), i();
        }, 0);
      });
    }, init: function () {
      var i,
          a = this.options.boundary;this.wrapper = this.element.wrap('<div class="uk-sticky-placeholder"></div>').parent(), this.computeWrapper(), this.element.css("margin", 0), a && (a === !0 || "!" === a[0] ? (a = a === !0 ? this.wrapper.parent() : this.wrapper.closest(a.substr(1)), i = !0) : "string" == typeof a && (a = t.$(a))), this.sticky = { self: this, options: this.options, element: this.element, currentTop: null, wrapper: this.wrapper, init: !1, getWidthFrom: t.$(this.options.getWidthFrom || this.wrapper), boundary: a, boundtoparent: i, top: 0, calcTop: function () {
          var i = this.options.top;if (this.options.top && "string" == typeof this.options.top) if (this.options.top.match(/^(-|)(\d+)vh$/)) i = window.innerHeight * parseInt(this.options.top, 10) / 100;else {
            var e = t.$(this.options.top).first();e.length && e.is(":visible") && (i = -1 * (e.offset().top + e.outerHeight() - this.wrapper.offset().top));
          }this.top = i;
        }, reset: function (i) {
          this.calcTop();var e = function () {
            this.element.css({ position: "", top: "", width: "", left: "", margin: "0" }), this.element.removeClass([this.options.animation, "uk-animation-reverse", this.options.clsactive].join(" ")), this.element.addClass(this.options.clsinactive), this.element.trigger("inactive.uk.sticky"), this.currentTop = null, this.animate = !1;
          }.bind(this);!i && this.options.animation && t.support.animation && !t.Utils.isInView(this.wrapper) ? (this.animate = !0, this.element.removeClass(this.options.animation).one(t.support.animation.end, function () {
            e();
          }).width(), this.element.addClass(this.options.animation + " uk-animation-reverse")) : e();
        }, check: function () {
          if (this.options.disabled) return !1;if (this.options.media) switch (typeof this.options.media) {case "number":
              if (window.innerWidth < this.options.media) return !1;break;case "string":
              if (window.matchMedia && !window.matchMedia(this.options.media).matches) return !1;}var i = e.scrollTop(),
              n = s.height(),
              a = n - window.innerHeight,
              r = i > a ? a - i : 0,
              h = this.wrapper.offset().top,
              p = h - this.top - r,
              c = i >= p;return c && this.options.showup && (1 == o && (c = !1), -1 == o && !this.element.hasClass(this.options.clsactive) && t.Utils.isInView(this.wrapper) && (c = !1)), c;
        } }, this.sticky.calcTop(), n.push(this.sticky);
    }, update: function () {
      i(this.sticky);
    }, enable: function () {
      this.options.disabled = !1, this.update();
    }, disable: function (t) {
      this.options.disabled = !0, this.sticky.reset(t);
    }, computeWrapper: function () {
      this.wrapper.css({ height: -1 == ["absolute", "fixed"].indexOf(this.element.css("position")) ? this.element.outerHeight() : "", "float": "none" != this.element.css("float") ? this.element.css("float") : "", margin: this.element.css("margin") }), "fixed" == this.element.css("position") && this.element.css({ width: this.sticky.getWidthFrom.length ? this.sticky.getWidthFrom.width() : this.element.width() });
    } }), t.sticky;
});

},{}],"/Sites/kisk-mennekes-www-20151019-relaunch-frontend/patternlab/source/js/vendor/uikit/tooltip.min.js":[function(require,module,exports){
/*! UIkit 2.26.3 | http://www.getuikit.com | (c) 2014 YOOtheme | MIT License */
!function (t) {
  var i;window.UIkit && (i = t(UIkit)), "function" == typeof define && define.amd && define("uikit-tooltip", ["uikit"], function () {
    return i || t(UIkit);
  });
}(function (t) {
  "use strict";
  var i, o, e;return t.component("tooltip", { defaults: { offset: 5, pos: "top", animation: !1, delay: 0, cls: "", activeClass: "uk-active", src: function (t) {
        var i = t.attr("title");return void 0 !== i && t.data("cached-title", i).removeAttr("title"), t.data("cached-title");
      } }, tip: "", boot: function () {
      t.$html.on("mouseenter.tooltip.uikit focus.tooltip.uikit", "[data-uk-tooltip]", function () {
        var i = t.$(this);i.data("tooltip") || (t.tooltip(i, t.Utils.options(i.attr("data-uk-tooltip"))), i.trigger("mouseenter"));
      });
    }, init: function () {
      var o = this;i || (i = t.$('<div class="uk-tooltip"></div>').appendTo("body")), this.on({ focus: function () {
          o.show();
        }, blur: function () {
          o.hide();
        }, mouseenter: function () {
          o.show();
        }, mouseleave: function () {
          o.hide();
        } });
    }, show: function () {
      if (this.tip = "function" == typeof this.options.src ? this.options.src(this.element) : this.options.src, o && clearTimeout(o), e && clearTimeout(e), "string" == typeof this.tip ? this.tip.length : 0) {
        i.stop().css({ top: -2e3, visibility: "hidden" }).removeClass(this.options.activeClass).show(), i.html('<div class="uk-tooltip-inner">' + this.tip + "</div>");var s = this,
            n = t.$.extend({}, this.element.offset(), { width: this.element[0].offsetWidth, height: this.element[0].offsetHeight }),
            l = i[0].offsetWidth,
            f = i[0].offsetHeight,
            p = "function" == typeof this.options.offset ? this.options.offset.call(this.element) : this.options.offset,
            a = "function" == typeof this.options.pos ? this.options.pos.call(this.element) : this.options.pos,
            h = a.split("-"),
            c = { display: "none", visibility: "visible", top: n.top + n.height + f, left: n.left };if ("fixed" == t.$html.css("position") || "fixed" == t.$body.css("position")) {
          var r = t.$("body").offset(),
              d = t.$("html").offset(),
              u = { top: d.top + r.top, left: d.left + r.left };n.left -= u.left, n.top -= u.top;
        }"left" != h[0] && "right" != h[0] || "right" != t.langdirection || (h[0] = "left" == h[0] ? "right" : "left");var m = { bottom: { top: n.top + n.height + p, left: n.left + n.width / 2 - l / 2 }, top: { top: n.top - f - p, left: n.left + n.width / 2 - l / 2 }, left: { top: n.top + n.height / 2 - f / 2, left: n.left - l - p }, right: { top: n.top + n.height / 2 - f / 2, left: n.left + n.width + p } };t.$.extend(c, m[h[0]]), 2 == h.length && (c.left = "left" == h[1] ? n.left : n.left + n.width - l);var v = this.checkBoundary(c.left, c.top, l, f);if (v) {
          switch (v) {case "x":
              a = 2 == h.length ? h[0] + "-" + (c.left < 0 ? "left" : "right") : c.left < 0 ? "right" : "left";break;case "y":
              a = 2 == h.length ? (c.top < 0 ? "bottom" : "top") + "-" + h[1] : c.top < 0 ? "bottom" : "top";break;case "xy":
              a = 2 == h.length ? (c.top < 0 ? "bottom" : "top") + "-" + (c.left < 0 ? "left" : "right") : c.left < 0 ? "right" : "left";}h = a.split("-"), t.$.extend(c, m[h[0]]), 2 == h.length && (c.left = "left" == h[1] ? n.left : n.left + n.width - l);
        }c.left -= t.$body.position().left, o = setTimeout(function () {
          i.css(c).attr("class", ["uk-tooltip", "uk-tooltip-" + a, s.options.cls].join(" ")), s.options.animation ? i.css({ opacity: 0, display: "block" }).addClass(s.options.activeClass).animate({ opacity: 1 }, parseInt(s.options.animation, 10) || 400) : i.show().addClass(s.options.activeClass), o = !1, e = setInterval(function () {
            s.element.is(":visible") || s.hide();
          }, 150);
        }, parseInt(this.options.delay, 10) || 0);
      }
    }, hide: function () {
      if (!this.element.is("input") || this.element[0] !== document.activeElement) if (o && clearTimeout(o), e && clearTimeout(e), i.stop(), this.options.animation) {
        var t = this;i.fadeOut(parseInt(this.options.animation, 10) || 400, function () {
          i.removeClass(t.options.activeClass);
        });
      } else i.hide().removeClass(this.options.activeClass);
    }, content: function () {
      return this.tip;
    }, checkBoundary: function (i, o, e, s) {
      var n = "";return (0 > i || i - t.$win.scrollLeft() + e > window.innerWidth) && (n += "x"), (0 > o || o - t.$win.scrollTop() + s > window.innerHeight) && (n += "y"), n;
    } }), t.tooltip;
});

},{}]},{},["/Sites/kisk-mennekes-www-20151019-relaunch-frontend/patternlab/source/js/app.js"])
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbIm5vZGVfbW9kdWxlcy9ncnVudC1icm93c2VyaWZ5L25vZGVfbW9kdWxlcy9icm93c2VyaWZ5L25vZGVfbW9kdWxlcy9icm93c2VyLXBhY2svX3ByZWx1ZGUuanMiLCJub2RlX21vZHVsZXMvaW1hZ2VzbG9hZGVkL2ltYWdlc2xvYWRlZC5qcyIsIm5vZGVfbW9kdWxlcy9pbWFnZXNsb2FkZWQvbm9kZV9tb2R1bGVzL2V2LWVtaXR0ZXIvZXYtZW1pdHRlci5qcyIsIm5vZGVfbW9kdWxlcy9qcXVlcnkvZGlzdC9qcXVlcnkuanMiLCJub2RlX21vZHVsZXMvbWFzb25yeS1sYXlvdXQvbWFzb25yeS5qcyIsIm5vZGVfbW9kdWxlcy9tYXNvbnJ5LWxheW91dC9ub2RlX21vZHVsZXMvZ2V0LXNpemUvZ2V0LXNpemUuanMiLCJub2RlX21vZHVsZXMvbWFzb25yeS1sYXlvdXQvbm9kZV9tb2R1bGVzL291dGxheWVyL2l0ZW0uanMiLCJub2RlX21vZHVsZXMvbWFzb25yeS1sYXlvdXQvbm9kZV9tb2R1bGVzL291dGxheWVyL25vZGVfbW9kdWxlcy9maXp6eS11aS11dGlscy9ub2RlX21vZHVsZXMvZGVzYW5kcm8tbWF0Y2hlcy1zZWxlY3Rvci9tYXRjaGVzLXNlbGVjdG9yLmpzIiwibm9kZV9tb2R1bGVzL21hc29ucnktbGF5b3V0L25vZGVfbW9kdWxlcy9vdXRsYXllci9ub2RlX21vZHVsZXMvZml6enktdWktdXRpbHMvdXRpbHMuanMiLCJub2RlX21vZHVsZXMvbWFzb25yeS1sYXlvdXQvbm9kZV9tb2R1bGVzL291dGxheWVyL291dGxheWVyLmpzIiwibm9kZV9tb2R1bGVzL3N2ZzRldmVyeWJvZHkvZGlzdC9zdmc0ZXZlcnlib2R5LmpzIiwibm9kZV9tb2R1bGVzL3Vpa2l0L2Rpc3QvanMvdWlraXQuanMiLCJwYXR0ZXJubGFiL3NvdXJjZS9qcy9hcHAuanMiLCJwYXR0ZXJubGFiL3NvdXJjZS9qcy9jb21wb25lbnRzL093bENvbnRyb2wuanMiLCJwYXR0ZXJubGFiL3NvdXJjZS9qcy9jb21wb25lbnRzL2NoYW5nZXIuanMiLCJwYXR0ZXJubGFiL3NvdXJjZS9qcy9jb21wb25lbnRzL2NsZWFyYWJsZS1pbnB1dC5qcyIsInBhdHRlcm5sYWIvc291cmNlL2pzL2NvbXBvbmVudHMvZXZlbnRzLmpzIiwicGF0dGVybmxhYi9zb3VyY2UvanMvY29tcG9uZW50cy9maWx0ZXItYWNjb3JkaW9uLmpzIiwicGF0dGVybmxhYi9zb3VyY2UvanMvY29tcG9uZW50cy9mb3JtaGFuZGxlci5qcyIsInBhdHRlcm5sYWIvc291cmNlL2pzL2NvbXBvbmVudHMvbWFzb25yeS1sYXlvdXQuanMiLCJwYXR0ZXJubGFiL3NvdXJjZS9qcy9jb21wb25lbnRzL3NoYXJlci5qcyIsInBhdHRlcm5sYWIvc291cmNlL2pzL2NvbXBvbmVudHMvc2xpZGVzaG93LmpzIiwicGF0dGVybmxhYi9zb3VyY2UvanMvY29tcG9uZW50cy9zbW9vdGgtc2Nyb2xsLmpzIiwicGF0dGVybmxhYi9zb3VyY2UvanMvY29tcG9uZW50cy9zdGlja3ktaGVhZGVyLmpzIiwicGF0dGVybmxhYi9zb3VyY2UvanMvY29tcG9uZW50cy9zdGlja3ktc3VibWVudS5qcyIsInBhdHRlcm5sYWIvc291cmNlL2pzL2NvbXBvbmVudHMvdGFibGUuanMiLCJwYXR0ZXJubGFiL3NvdXJjZS9qcy9jb21wb25lbnRzL3RvZ2dsZS1kb3dubG9hZC1idXR0b24uanMiLCJwYXR0ZXJubGFiL3NvdXJjZS9qcy9jb21wb25lbnRzL3ZpZGVvLmpzIiwicGF0dGVybmxhYi9zb3VyY2UvanMvc2hhbWUuanMiLCJwYXR0ZXJubGFiL3NvdXJjZS9qcy92ZW5kb3Ivb3dsLmNhcm91c2VsLmpzIiwicGF0dGVybmxhYi9zb3VyY2UvanMvdmVuZG9yL3BpY3R1cmVmaWxsLm1pbi5qcyIsInBhdHRlcm5sYWIvc291cmNlL2pzL3ZlbmRvci9zZWxlY3QyLm1pbi5qcyIsInBhdHRlcm5sYWIvc291cmNlL2pzL3ZlbmRvci91aWtpdC9hY2NvcmRpb24ubWluLmpzIiwicGF0dGVybmxhYi9zb3VyY2UvanMvdmVuZG9yL3Vpa2l0L2xpZ2h0Ym94Lm1pbi5qcyIsInBhdHRlcm5sYWIvc291cmNlL2pzL3ZlbmRvci91aWtpdC9tb2RhbC5taW4uanMiLCJwYXR0ZXJubGFiL3NvdXJjZS9qcy92ZW5kb3IvdWlraXQvc2xpZGVyLm1pbi5qcyIsInBhdHRlcm5sYWIvc291cmNlL2pzL3ZlbmRvci91aWtpdC9zbGlkZXNldC5taW4uanMiLCJwYXR0ZXJubGFiL3NvdXJjZS9qcy92ZW5kb3IvdWlraXQvc2xpZGVzaG93Lm1pbi5qcyIsInBhdHRlcm5sYWIvc291cmNlL2pzL3ZlbmRvci91aWtpdC9zdGlja3kubWluLmpzIiwicGF0dGVybmxhYi9zb3VyY2UvanMvdmVuZG9yL3Vpa2l0L3Rvb2x0aXAubWluLmpzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBO0FDQUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3pYQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ2hIQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQ3RsVEE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQy9PQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUMvTUE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOzs7O0FDMWlCQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDckRBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDalBBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBOztBQzM2QkE7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDekdBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7O0FDNTBIQSxPQUFPLENBQVAsR0FBVyxPQUFPLE1BQVAsR0FBZ0IsUUFBUSxRQUFSLENBQTNCOztBQUVBO0FBQ0EsUUFBUSxlQUFSO0FBQ0EsUUFBUSxPQUFSOztBQUVBO0FBQ0EsUUFBUSwwQkFBUjtBQUNBLFFBQVEsNkJBQVI7QUFDQSxRQUFRLDhCQUFSO0FBQ0EsUUFBUSwyQkFBUjtBQUNBLFFBQVEsNkJBQVI7QUFDQSxRQUFRLDhCQUFSO0FBQ0EsUUFBUSwyQkFBUjtBQUNBLFFBQVEsNEJBQVI7O0FBRUEsUUFBUSx1QkFBUjtBQUNBLFFBQVEsc0JBQVI7QUFDQSxRQUFRLDBCQUFSOztBQUVBO0FBQ0EsUUFBUSxzQkFBUjtBQUNBLFFBQVEsd0JBQVI7QUFDQSxRQUFRLG9CQUFSO0FBQ0EsUUFBUSwrQkFBUjtBQUNBLFFBQVEsNEJBQVI7QUFDQSxRQUFRLDZCQUFSO0FBQ0EsUUFBUSw0QkFBUjtBQUNBLFFBQVEsOEJBQVI7QUFDQSxRQUFRLHlCQUFSO0FBQ0EsUUFBUSxxQkFBUjtBQUNBLFFB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S0FBSyxHQUFaO0FBQWdCLEtBQXBxRyxFQUFxcUcsZUFBYyxVQUFTLENBQVQsRUFBVyxDQUFYLEVBQWEsQ0FBYixFQUFlLENBQWYsRUFBaUI7QUFBQyxVQUFJLElBQUUsRUFBTixDQUFTLE9BQU0sQ0FBQyxJQUFFLENBQUYsSUFBSyxJQUFFLEVBQUUsSUFBRixDQUFPLFVBQVAsRUFBRixHQUFzQixDQUF0QixHQUF3QixPQUFPLFVBQXJDLE1BQW1ELEtBQUcsR0FBdEQsR0FBMkQsQ0FBQyxJQUFFLENBQUYsSUFBSyxJQUFFLEVBQUUsSUFBRixDQUFPLFNBQVAsRUFBRixHQUFxQixDQUFyQixHQUF1QixPQUFPLFdBQXBDLE1BQW1ELEtBQUcsR0FBdEQsQ0FBM0QsRUFBc0gsQ0FBNUg7QUFBOEgsS0FBNTBHLEVBQXRCLEdBQXEyRyxFQUFFLE9BQTkyRztBQUFzM0csQ0FBL2lILENBQUQiLCJmaWxlIjoiZ2VuZXJhdGVkLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXNDb250ZW50IjpbIihmdW5jdGlvbigpe2Z1bmN0aW9uIHIoZSxuLHQpe2Z1bmN0aW9uIG8oaSxmKXtpZighbltpXSl7aWYoIWVbaV0pe3ZhciBjPVwiZnVuY3Rpb25cIj09dHlwZW9mIHJlcXVpcmUmJnJlcXVpcmU7aWYoIWYmJmMpcmV0dXJuIGMoaSwhMCk7aWYodSlyZXR1cm4gdShpLCEwKTt2YXIgYT1uZXcgRXJyb3IoXCJDYW5ub3QgZmluZCBtb2R1bGUgJ1wiK2krXCInXCIpO3Rocm93IGEuY29kZT1cIk1PRFVMRV9OT1RfRk9VTkRcIixhfXZhciBwPW5baV09e2V4cG9ydHM6e319O2VbaV1bMF0uY2FsbChwLmV4cG9ydHMsZnVuY3Rpb24ocil7dmFyIG49ZVtpXVsxXVtyXTtyZXR1cm4gbyhufHxyKX0scCxwLmV4cG9ydHMscixlLG4sdCl9cmV0dXJuIG5baV0uZXhwb3J0c31mb3IodmFyIHU9XCJmdW5jdGlvblwiPT10eXBlb2YgcmVxdWlyZSYmcmVxdWlyZSxpPTA7aTx0Lmxlbmd0aDtpKyspbyh0W2ldKTtyZXR1cm4gb31yZXR1cm4gcn0pKCkiLCIvKiFcbiAqIGltYWdlc0xvYWRlZCB2NC4xLjRcbiAqIEphdmFTY3JpcHQgaXMgYWxsIGxpa2UgXCJZb3UgaW1hZ2VzIGFyZSBkb25lIHlldCBvciB3aGF0P1wiXG4gKiBNSVQgTGljZW5zZVxuICovXG5cbiggZnVuY3Rpb24oIHdpbmRvdywgZmFjdG9yeSApIHsgJ3VzZSBzdHJpY3QnO1xuICAvLyB1bml2ZXJzYWwgbW9kdWxlIGRlZmluaXRpb25cblxuICAvKmdsb2JhbCBkZWZpbmU6IGZhbHNlLCBtb2R1bGU6IGZhbHNlLCByZXF1aXJlOiBmYWxzZSAqL1xuXG4gIGlmICggdHlwZW9mIGRlZmluZSA9PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgKSB7XG4gICAgLy8gQU1EXG4gICAgZGVmaW5lKCBbXG4gICAgICAnZXYtZW1pdHRlci9ldi1lbWl0dGVyJ1xuICAgIF0sIGZ1bmN0aW9uKCBFdkVtaXR0ZXIgKSB7XG4gICAgICByZXR1cm4gZmFjdG9yeSggd2luZG93LCBFdkVtaXR0ZXIgKTtcbiAgICB9KTtcbiAgfSBlbHNlIGlmICggdHlwZW9mIG1vZHVsZSA9PSAnb2JqZWN0JyAmJiBtb2R1bGUuZXhwb3J0cyApIHtcbiAgICAvLyBDb21tb25KU1xuICAgIG1vZHVsZS5leHBvcnRzID0gZmFjdG9yeShcbiAgICAgIHdpbmRvdyxcbiAgICAgIHJlcXVpcmUoJ2V2LWVtaXR0ZXInKVxuICAgICk7XG4gIH0gZWxzZSB7XG4gICAgLy8gYnJvd3NlciBnbG9iYWxcbiAgICB3aW5kb3cuaW1hZ2VzTG9hZGVkID0gZmFjdG9yeShcbiAgICAgIHdpbmRvdyxcbiAgICAgIHdpbmRvdy5FdkVtaXR0ZXJcbiAgICApO1xuICB9XG5cbn0pKCB0eXBlb2Ygd2luZG93ICE9PSAndW5kZWZpbmVkJyA/IHdpbmRvdyA6IHRoaXMsXG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICBmYWN0b3J5IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIC8vXG5cbmZ1bmN0aW9uIGZhY3RvcnkoIHdpbmRvdywgRXZFbWl0dGVyICkge1xuXG4ndXNlIHN0cmljdCc7XG5cbnZhciAkID0gd2luZG93LmpRdWVyeTtcbnZhciBjb25zb2xlID0gd2luZG93LmNvbnNvbGU7XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIGhlbHBlcnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gLy9cblxuLy8gZXh0ZW5kIG9iamVjdHNcbmZ1bmN0aW9uIGV4dGVuZCggYSwgYiApIHtcbiAgZm9yICggdmFyIHByb3AgaW4gYiApIHtcbiAgICBhWyBwcm9wIF0gPSBiWyBwcm9wIF07XG4gIH1cbiAgcmV0dXJuIGE7XG59XG5cbnZhciBhcnJheVNsaWNlID0gQXJyYXkucHJvdG90eXBlLnNsaWNlO1xuXG4vLyB0dXJuIGVsZW1lbnQgb3Igbm9kZUxpc3QgaW50byBhbiBhcnJheVxuZnVuY3Rpb24gbWFrZUFycmF5KCBvYmogKSB7XG4gIGlmICggQXJyYXkuaXNBcnJheSggb2JqICkgKSB7XG4gICAgLy8gdXNlIG9iamVjdCBpZiBhbHJlYWR5IGFuIGFycmF5XG4gICAgcmV0dXJuIG9iajtcbiAgfVxuXG4gIHZhciBpc0FycmF5TGlrZSA9IHR5cGVvZiBvYmogPT0gJ29iamVjdCcgJiYgdHlwZW9mIG9iai5sZW5ndGggPT0gJ251bWJlcic7XG4gIGlmICggaXNBcnJheUxpa2UgKSB7XG4gICAgLy8gY29udmVydCBub2RlTGlzdCB0byBhcnJheVxuICAgIHJldHVybiBhcnJheVNsaWNlLmNhbGwoIG9iaiApO1xuICB9XG5cbiAgLy8gYXJyYXkgb2Ygc2luZ2xlIGluZGV4XG4gIHJldHVybiBbIG9iaiBdO1xufVxuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBpbWFnZXNMb2FkZWQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gLy9cblxuLyoqXG4gKiBAcGFyYW0ge0FycmF5LCBFbGVtZW50LCBOb2RlTGlzdCwgU3RyaW5nfSBlbGVtXG4gKiBAcGFyYW0ge09iamVjdCBvciBGdW5jdGlvbn0gb3B0aW9ucyAtIGlmIGZ1bmN0aW9uLCB1c2UgYXMgY2FsbGJhY2tcbiAqIEBwYXJhbSB7RnVuY3Rpb259IG9uQWx3YXlzIC0gY2FsbGJhY2sgZnVuY3Rpb25cbiAqL1xuZnVuY3Rpb24gSW1hZ2VzTG9hZGVkKCBlbGVtLCBvcHRpb25zLCBvbkFsd2F5cyApIHtcbiAgLy8gY29lcmNlIEltYWdlc0xvYWRlZCgpIHdpdGhvdXQgbmV3LCB0byBiZSBuZXcgSW1hZ2VzTG9hZGVkKClcbiAgaWYgKCAhKCB0aGlzIGluc3RhbmNlb2YgSW1hZ2VzTG9hZGVkICkgKSB7XG4gICAgcmV0dXJuIG5ldyBJbWFnZXNMb2FkZWQoIGVsZW0sIG9wdGlvbnMsIG9uQWx3YXlzICk7XG4gIH1cbiAgLy8gdXNlIGVsZW0gYXMgc2VsZWN0b3Igc3RyaW5nXG4gIHZhciBxdWVyeUVsZW0gPSBlbGVtO1xuICBpZiAoIHR5cGVvZiBlbGVtID09ICdzdHJpbmcnICkge1xuICAgIHF1ZXJ5RWxlbSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3JBbGwoIGVsZW0gKTtcbiAgfVxuICAvLyBiYWlsIGlmIGJhZCBlbGVtZW50XG4gIGlmICggIXF1ZXJ5RWxlbSApIHtcbiAgICBjb25zb2xlLmVycm9yKCAnQmFkIGVsZW1lbnQgZm9yIGltYWdlc0xvYWRlZCAnICsgKCBxdWVyeUVsZW0gfHwgZWxlbSApICk7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgdGhpcy5lbGVtZW50cyA9IG1ha2VBcnJheSggcXVlcnlFbGVtICk7XG4gIHRoaXMub3B0aW9ucyA9IGV4dGVuZCgge30sIHRoaXMub3B0aW9ucyApO1xuICAvLyBzaGlmdCBhcmd1bWVudHMgaWYgbm8gb3B0aW9ucyBzZXRcbiAgaWYgKCB0eXBlb2Ygb3B0aW9ucyA9PSAnZnVuY3Rpb24nICkge1xuICAgIG9uQWx3YXlzID0gb3B0aW9ucztcbiAgfSBlbHNlIHtcbiAgICBleHRlbmQoIHRoaXMub3B0aW9ucywgb3B0aW9ucyApO1xuICB9XG5cbiAgaWYgKCBvbkFsd2F5cyApIHtcbiAgICB0aGlzLm9uKCAnYWx3YXlzJywgb25BbHdheXMgKTtcbiAgfVxuXG4gIHRoaXMuZ2V0SW1hZ2VzKCk7XG5cbiAgaWYgKCAkICkge1xuICAgIC8vIGFkZCBqUXVlcnkgRGVmZXJyZWQgb2JqZWN0XG4gICAgdGhpcy5qcURlZmVycmVkID0gbmV3ICQuRGVmZXJyZWQoKTtcbiAgfVxuXG4gIC8vIEhBQ0sgY2hlY2sgYXN5bmMgdG8gYWxsb3cgdGltZSB0byBiaW5kIGxpc3RlbmVyc1xuICBzZXRUaW1lb3V0KCB0aGlzLmNoZWNrLmJpbmQoIHRoaXMgKSApO1xufVxuXG5JbWFnZXNMb2FkZWQucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggRXZFbWl0dGVyLnByb3RvdHlwZSApO1xuXG5JbWFnZXNMb2FkZWQucHJvdG90eXBlLm9wdGlvbnMgPSB7fTtcblxuSW1hZ2VzTG9hZGVkLnByb3RvdHlwZS5nZXRJbWFnZXMgPSBmdW5jdGlvbigpIHtcbiAgdGhpcy5pbWFnZXMgPSBbXTtcblxuICAvLyBmaWx0ZXIgJiBmaW5kIGl0ZW1zIGlmIHdlIGhhdmUgYW4gaXRlbSBzZWxlY3RvclxuICB0aGlzLmVsZW1lbnRzLmZvckVhY2goIHRoaXMuYWRkRWxlbWVudEltYWdlcywgdGhpcyApO1xufTtcblxuLyoqXG4gKiBAcGFyYW0ge05vZGV9IGVsZW1lbnRcbiAqL1xuSW1hZ2VzTG9hZGVkLnByb3RvdHlwZS5hZGRFbGVtZW50SW1hZ2VzID0gZnVuY3Rpb24oIGVsZW0gKSB7XG4gIC8vIGZpbHRlciBzaWJsaW5nc1xuICBpZiAoIGVsZW0ubm9kZU5hbWUgPT0gJ0lNRycgKSB7XG4gICAgdGhpcy5hZGRJbWFnZSggZWxlbSApO1xuICB9XG4gIC8vIGdldCBiYWNrZ3JvdW5kIGltYWdlIG9uIGVsZW1lbnRcbiAgaWYgKCB0aGlzLm9wdGlvbnMuYmFja2dyb3VuZCA9PT0gdHJ1ZSApIHtcbiAgICB0aGlzLmFkZEVsZW1lbnRCYWNrZ3JvdW5kSW1hZ2VzKCBlbGVtICk7XG4gIH1cblxuICAvLyBmaW5kIGNoaWxkcmVuXG4gIC8vIG5vIG5vbi1lbGVtZW50IG5vZGVzLCAjMTQzXG4gIHZhciBub2RlVHlwZSA9IGVsZW0ubm9kZVR5cGU7XG4gIGlmICggIW5vZGVUeXBlIHx8ICFlbGVtZW50Tm9kZVR5cGVzWyBub2RlVHlwZSBdICkge1xuICAgIHJldHVybjtcbiAgfVxuICB2YXIgY2hpbGRJbWdzID0gZWxlbS5xdWVyeVNlbGVjdG9yQWxsKCdpbWcnKTtcbiAgLy8gY29uY2F0IGNoaWxkRWxlbXMgdG8gZmlsdGVyRm91bmQgYXJyYXlcbiAgZm9yICggdmFyIGk9MDsgaSA8IGNoaWxkSW1ncy5sZW5ndGg7IGkrKyApIHtcbiAgICB2YXIgaW1nID0gY2hpbGRJbWdzW2ldO1xuICAgIHRoaXMuYWRkSW1hZ2UoIGltZyApO1xuICB9XG5cbiAgLy8gZ2V0IGNoaWxkIGJhY2tncm91bmQgaW1hZ2VzXG4gIGlmICggdHlwZW9mIHRoaXMub3B0aW9ucy5iYWNrZ3JvdW5kID09ICdzdHJpbmcnICkge1xuICAgIHZhciBjaGlsZHJlbiA9IGVsZW0ucXVlcnlTZWxlY3RvckFsbCggdGhpcy5vcHRpb25zLmJhY2tncm91bmQgKTtcbiAgICBmb3IgKCBpPTA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKyApIHtcbiAgICAgIHZhciBjaGlsZCA9IGNoaWxkcmVuW2ldO1xuICAgICAgdGhpcy5hZGRFbGVtZW50QmFja2dyb3VuZEltYWdlcyggY2hpbGQgKTtcbiAgICB9XG4gIH1cbn07XG5cbnZhciBlbGVtZW50Tm9kZVR5cGVzID0ge1xuICAxOiB0cnVlLFxuICA5OiB0cnVlLFxuICAxMTogdHJ1ZVxufTtcblxuSW1hZ2VzTG9hZGVkLnByb3RvdHlwZS5hZGRFbGVtZW50QmFja2dyb3VuZEltYWdlcyA9IGZ1bmN0aW9uKCBlbGVtICkge1xuICB2YXIgc3R5bGUgPSBnZXRDb21wdXRlZFN0eWxlKCBlbGVtICk7XG4gIGlmICggIXN0eWxlICkge1xuICAgIC8vIEZpcmVmb3ggcmV0dXJucyBudWxsIGlmIGluIGEgaGlkZGVuIGlmcmFtZSBodHRwczovL2J1Z3ppbC5sYS81NDgzOTdcbiAgICByZXR1cm47XG4gIH1cbiAgLy8gZ2V0IHVybCBpbnNpZGUgdXJsKFwiLi4uXCIpXG4gIHZhciByZVVSTCA9IC91cmxcXCgoWydcIl0pPyguKj8pXFwxXFwpL2dpO1xuICB2YXIgbWF0Y2hlcyA9IHJlVVJMLmV4ZWMoIHN0eWxlLmJhY2tncm91bmRJbWFnZSApO1xuICB3aGlsZSAoIG1hdGNoZXMgIT09IG51bGwgKSB7XG4gICAgdmFyIHVybCA9IG1hdGNoZXMgJiYgbWF0Y2hlc1syXTtcbiAgICBpZiAoIHVybCApIHtcbiAgICAgIHRoaXMuYWRkQmFja2dyb3VuZCggdXJsLCBlbGVtICk7XG4gICAgfVxuICAgIG1hdGNoZXMgPSByZVVSTC5leGVjKCBzdHlsZS5iYWNrZ3JvdW5kSW1hZ2UgKTtcbiAgfVxufTtcblxuLyoqXG4gKiBAcGFyYW0ge0ltYWdlfSBpbWdcbiAqL1xuSW1hZ2VzTG9hZGVkLnByb3RvdHlwZS5hZGRJbWFnZSA9IGZ1bmN0aW9uKCBpbWcgKSB7XG4gIHZhciBsb2FkaW5nSW1hZ2UgPSBuZXcgTG9hZGluZ0ltYWdlKCBpbWcgKTtcbiAgdGhpcy5pbWFnZXMucHVzaCggbG9hZGluZ0ltYWdlICk7XG59O1xuXG5JbWFnZXNMb2FkZWQucHJvdG90eXBlLmFkZEJhY2tncm91bmQgPSBmdW5jdGlvbiggdXJsLCBlbGVtICkge1xuICB2YXIgYmFja2dyb3VuZCA9IG5ldyBCYWNrZ3JvdW5kKCB1cmwsIGVsZW0gKTtcbiAgdGhpcy5pbWFnZXMucHVzaCggYmFja2dyb3VuZCApO1xufTtcblxuSW1hZ2VzTG9hZGVkLnByb3RvdHlwZS5jaGVjayA9IGZ1bmN0aW9uKCkge1xuICB2YXIgX3RoaXMgPSB0aGlzO1xuICB0aGlzLnByb2dyZXNzZWRDb3VudCA9IDA7XG4gIHRoaXMuaGFzQW55QnJva2VuID0gZmFsc2U7XG4gIC8vIGNvbXBsZXRlIGlmIG5vIGltYWdlc1xuICBpZiAoICF0aGlzLmltYWdlcy5sZW5ndGggKSB7XG4gICAgdGhpcy5jb21wbGV0ZSgpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIGZ1bmN0aW9uIG9uUHJvZ3Jlc3MoIGltYWdlLCBlbGVtLCBtZXNzYWdlICkge1xuICAgIC8vIEhBQ0sgLSBDaHJvbWUgdHJpZ2dlcnMgZXZlbnQgYmVmb3JlIG9iamVjdCBwcm9wZXJ0aWVzIGhhdmUgY2hhbmdlZC4gIzgzXG4gICAgc2V0VGltZW91dCggZnVuY3Rpb24oKSB7XG4gICAgICBfdGhpcy5wcm9ncmVzcyggaW1hZ2UsIGVsZW0sIG1lc3NhZ2UgKTtcbiAgICB9KTtcbiAgfVxuXG4gIHRoaXMuaW1hZ2VzLmZvckVhY2goIGZ1bmN0aW9uKCBsb2FkaW5nSW1hZ2UgKSB7XG4gICAgbG9hZGluZ0ltYWdlLm9uY2UoICdwcm9ncmVzcycsIG9uUHJvZ3Jlc3MgKTtcbiAgICBsb2FkaW5nSW1hZ2UuY2hlY2soKTtcbiAgfSk7XG59O1xuXG5JbWFnZXNMb2FkZWQucHJvdG90eXBlLnByb2dyZXNzID0gZnVuY3Rpb24oIGltYWdlLCBlbGVtLCBtZXNzYWdlICkge1xuICB0aGlzLnByb2dyZXNzZWRDb3VudCsrO1xuICB0aGlzLmhhc0FueUJyb2tlbiA9IHRoaXMuaGFzQW55QnJva2VuIHx8ICFpbWFnZS5pc0xvYWRlZDtcbiAgLy8gcHJvZ3Jlc3MgZXZlbnRcbiAgdGhpcy5lbWl0RXZlbnQoICdwcm9ncmVzcycsIFsgdGhpcywgaW1hZ2UsIGVsZW0gXSApO1xuICBpZiAoIHRoaXMuanFEZWZlcnJlZCAmJiB0aGlzLmpxRGVmZXJyZWQubm90aWZ5ICkge1xuICAgIHRoaXMuanFEZWZlcnJlZC5ub3RpZnkoIHRoaXMsIGltYWdlICk7XG4gIH1cbiAgLy8gY2hlY2sgaWYgY29tcGxldGVkXG4gIGlmICggdGhpcy5wcm9ncmVzc2VkQ291bnQgPT0gdGhpcy5pbWFnZXMubGVuZ3RoICkge1xuICAgIHRoaXMuY29tcGxldGUoKTtcbiAgfVxuXG4gIGlmICggdGhpcy5vcHRpb25zLmRlYnVnICYmIGNvbnNvbGUgKSB7XG4gICAgY29uc29sZS5sb2coICdwcm9ncmVzczogJyArIG1lc3NhZ2UsIGltYWdlLCBlbGVtICk7XG4gIH1cbn07XG5cbkltYWdlc0xvYWRlZC5wcm90b3R5cGUuY29tcGxldGUgPSBmdW5jdGlvbigpIHtcbiAgdmFyIGV2ZW50TmFtZSA9IHRoaXMuaGFzQW55QnJva2VuID8gJ2ZhaWwnIDogJ2RvbmUnO1xuICB0aGlzLmlzQ29tcGxldGUgPSB0cnVlO1xuICB0aGlzLmVtaXRFdmVudCggZXZlbnROYW1lLCBbIHRoaXMgXSApO1xuICB0aGlzLmVtaXRFdmVudCggJ2Fsd2F5cycsIFsgdGhpcyBdICk7XG4gIGlmICggdGhpcy5qcURlZmVycmVkICkge1xuICAgIHZhciBqcU1ldGhvZCA9IHRoaXMuaGFzQW55QnJva2VuID8gJ3JlamVjdCcgOiAncmVzb2x2ZSc7XG4gICAgdGhpcy5qcURlZmVycmVkWyBqcU1ldGhvZCBdKCB0aGlzICk7XG4gIH1cbn07XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAvL1xuXG5mdW5jdGlvbiBMb2FkaW5nSW1hZ2UoIGltZyApIHtcbiAgdGhpcy5pbWcgPSBpbWc7XG59XG5cbkxvYWRpbmdJbWFnZS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBFdkVtaXR0ZXIucHJvdG90eXBlICk7XG5cbkxvYWRpbmdJbWFnZS5wcm90b3R5cGUuY2hlY2sgPSBmdW5jdGlvbigpIHtcbiAgLy8gSWYgY29tcGxldGUgaXMgdHJ1ZSBhbmQgYnJvd3NlciBzdXBwb3J0cyBuYXR1cmFsIHNpemVzLFxuICAvLyB0cnkgdG8gY2hlY2sgZm9yIGltYWdlIHN0YXR1cyBtYW51YWxseS5cbiAgdmFyIGlzQ29tcGxldGUgPSB0aGlzLmdldElzSW1hZ2VDb21wbGV0ZSgpO1xuICBpZiAoIGlzQ29tcGxldGUgKSB7XG4gICAgLy8gcmVwb3J0IGJhc2VkIG9uIG5hdHVyYWxXaWR0aFxuICAgIHRoaXMuY29uZmlybSggdGhpcy5pbWcubmF0dXJhbFdpZHRoICE9PSAwLCAnbmF0dXJhbFdpZHRoJyApO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8vIElmIG5vbmUgb2YgdGhlIGNoZWNrcyBhYm92ZSBtYXRjaGVkLCBzaW11bGF0ZSBsb2FkaW5nIG9uIGRldGFjaGVkIGVsZW1lbnQuXG4gIHRoaXMucHJveHlJbWFnZSA9IG5ldyBJbWFnZSgpO1xuICB0aGlzLnByb3h5SW1hZ2UuYWRkRXZlbnRMaXN0ZW5lciggJ2xvYWQnLCB0aGlzICk7XG4gIHRoaXMucHJveHlJbWFnZS5hZGRFdmVudExpc3RlbmVyKCAnZXJyb3InLCB0aGlzICk7XG4gIC8vIGJpbmQgdG8gaW1hZ2UgYXMgd2VsbCBmb3IgRmlyZWZveC4gIzE5MVxuICB0aGlzLmltZy5hZGRFdmVudExpc3RlbmVyKCAnbG9hZCcsIHRoaXMgKTtcbiAgdGhpcy5pbWcuYWRkRXZlbnRMaXN0ZW5lciggJ2Vycm9yJywgdGhpcyApO1xuICB0aGlzLnByb3h5SW1hZ2Uuc3JjID0gdGhpcy5pbWcuc3JjO1xufTtcblxuTG9hZGluZ0ltYWdlLnByb3RvdHlwZS5nZXRJc0ltYWdlQ29tcGxldGUgPSBmdW5jdGlvbigpIHtcbiAgLy8gY2hlY2sgZm9yIG5vbi16ZXJvLCBub24tdW5kZWZpbmVkIG5hdHVyYWxXaWR0aFxuICAvLyBmaXhlcyBTYWZhcmkrSW5maW5pdGVTY3JvbGwrTWFzb25yeSBidWcgaW5maW5pdGUtc2Nyb2xsIzY3MVxuICByZXR1cm4gdGhpcy5pbWcuY29tcGxldGUgJiYgdGhpcy5pbWcubmF0dXJhbFdpZHRoO1xufTtcblxuTG9hZGluZ0ltYWdlLnByb3RvdHlwZS5jb25maXJtID0gZnVuY3Rpb24oIGlzTG9hZGVkLCBtZXNzYWdlICkge1xuICB0aGlzLmlzTG9hZGVkID0gaXNMb2FkZWQ7XG4gIHRoaXMuZW1pdEV2ZW50KCAncHJvZ3Jlc3MnLCBbIHRoaXMsIHRoaXMuaW1nLCBtZXNzYWdlIF0gKTtcbn07XG5cbi8vIC0tLS0tIGV2ZW50cyAtLS0tLSAvL1xuXG4vLyB0cmlnZ2VyIHNwZWNpZmllZCBoYW5kbGVyIGZvciBldmVudCB0eXBlXG5Mb2FkaW5nSW1hZ2UucHJvdG90eXBlLmhhbmRsZUV2ZW50ID0gZnVuY3Rpb24oIGV2ZW50ICkge1xuICB2YXIgbWV0aG9kID0gJ29uJyArIGV2ZW50LnR5cGU7XG4gIGlmICggdGhpc1sgbWV0aG9kIF0gKSB7XG4gICAgdGhpc1sgbWV0aG9kIF0oIGV2ZW50ICk7XG4gIH1cbn07XG5cbkxvYWRpbmdJbWFnZS5wcm90b3R5cGUub25sb2FkID0gZnVuY3Rpb24oKSB7XG4gIHRoaXMuY29uZmlybSggdHJ1ZSwgJ29ubG9hZCcgKTtcbiAgdGhpcy51bmJpbmRFdmVudHMoKTtcbn07XG5cbkxvYWRpbmdJbWFnZS5wcm90b3R5cGUub25lcnJvciA9IGZ1bmN0aW9uKCkge1xuICB0aGlzLmNvbmZpcm0oIGZhbHNlLCAnb25lcnJvcicgKTtcbiAgdGhpcy51bmJpbmRFdmVudHMoKTtcbn07XG5cbkxvYWRpbmdJbWFnZS5wcm90b3R5cGUudW5iaW5kRXZlbnRzID0gZnVuY3Rpb24oKSB7XG4gIHRoaXMucHJveHlJbWFnZS5yZW1vdmVFdmVudExpc3RlbmVyKCAnbG9hZCcsIHRoaXMgKTtcbiAgdGhpcy5wcm94eUltYWdlLnJlbW92ZUV2ZW50TGlzdGVuZXIoICdlcnJvcicsIHRoaXMgKTtcbiAgdGhpcy5pbWcucmVtb3ZlRXZlbnRMaXN0ZW5lciggJ2xvYWQnLCB0aGlzICk7XG4gIHRoaXMuaW1nLnJlbW92ZUV2ZW50TGlzdGVuZXIoICdlcnJvcicsIHRoaXMgKTtcbn07XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIEJhY2tncm91bmQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gLy9cblxuZnVuY3Rpb24gQmFja2dyb3VuZCggdXJsLCBlbGVtZW50ICkge1xuICB0aGlzLnVybCA9IHVybDtcbiAgdGhpcy5lbGVtZW50ID0gZWxlbWVudDtcbiAgdGhpcy5pbWcgPSBuZXcgSW1hZ2UoKTtcbn1cblxuLy8gaW5oZXJpdCBMb2FkaW5nSW1hZ2UgcHJvdG90eXBlXG5CYWNrZ3JvdW5kLnByb3RvdHlwZSA9IE9iamVjdC5jcmVhdGUoIExvYWRpbmdJbWFnZS5wcm90b3R5cGUgKTtcblxuQmFja2dyb3VuZC5wcm90b3R5cGUuY2hlY2sgPSBmdW5jdGlvbigpIHtcbiAgdGhpcy5pbWcuYWRkRXZlbnRMaXN0ZW5lciggJ2xvYWQnLCB0aGlzICk7XG4gIHRoaXMuaW1nLmFkZEV2ZW50TGlzdGVuZXIoICdlcnJvcicsIHRoaXMgKTtcbiAgdGhpcy5pbWcuc3JjID0gdGhpcy51cmw7XG4gIC8vIGNoZWNrIGlmIGltYWdlIGlzIGFscmVhZHkgY29tcGxldGVcbiAgdmFyIGlzQ29tcGxldGUgPSB0aGlzLmdldElzSW1hZ2VDb21wbGV0ZSgpO1xuICBpZiAoIGlzQ29tcGxldGUgKSB7XG4gICAgdGhpcy5jb25maXJtKCB0aGlzLmltZy5uYXR1cmFsV2lkdGggIT09IDAsICduYXR1cmFsV2lkdGgnICk7XG4gICAgdGhpcy51bmJpbmRFdmVudHMoKTtcbiAgfVxufTtcblxuQmFja2dyb3VuZC5wcm90b3R5cGUudW5iaW5kRXZlbnRzID0gZnVuY3Rpb24oKSB7XG4gIHRoaXMuaW1nLnJlbW92ZUV2ZW50TGlzdGVuZXIoICdsb2FkJywgdGhpcyApO1xuICB0aGlzLmltZy5yZW1vdmVFdmVudExpc3RlbmVyKCAnZXJyb3InLCB0aGlzICk7XG59O1xuXG5CYWNrZ3JvdW5kLnByb3RvdHlwZS5jb25maXJtID0gZnVuY3Rpb24oIGlzTG9hZGVkLCBtZXNzYWdlICkge1xuICB0aGlzLmlzTG9hZGVkID0gaXNMb2FkZWQ7XG4gIHRoaXMuZW1pdEV2ZW50KCAncHJvZ3Jlc3MnLCBbIHRoaXMsIHRoaXMuZWxlbWVudCwgbWVzc2FnZSBdICk7XG59O1xuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBqUXVlcnkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gLy9cblxuSW1hZ2VzTG9hZGVkLm1ha2VKUXVlcnlQbHVnaW4gPSBmdW5jdGlvbiggalF1ZXJ5ICkge1xuICBqUXVlcnkgPSBqUXVlcnkgfHwgd2luZG93LmpRdWVyeTtcbiAgaWYgKCAhalF1ZXJ5ICkge1xuICAgIHJldHVybjtcbiAgfVxuICAvLyBzZXQgbG9jYWwgdmFyaWFibGVcbiAgJCA9IGpRdWVyeTtcbiAgLy8gJCgpLmltYWdlc0xvYWRlZCgpXG4gICQuZm4uaW1hZ2VzTG9hZGVkID0gZnVuY3Rpb24oIG9wdGlvbnMsIGNhbGxiYWNrICkge1xuICAgIHZhciBpbnN0YW5jZSA9IG5ldyBJbWFnZXNMb2FkZWQoIHRoaXMsIG9wdGlvbnMsIGNhbGxiYWNrICk7XG4gICAgcmV0dXJuIGluc3RhbmNlLmpxRGVmZXJyZWQucHJvbWlzZSggJCh0aGlzKSApO1xuICB9O1xufTtcbi8vIHRyeSBtYWtpbmcgcGx1Z2luXG5JbWFnZXNMb2FkZWQubWFrZUpRdWVyeVBsdWdpbigpO1xuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gLy9cblxucmV0dXJuIEltYWdlc0xvYWRlZDtcblxufSk7XG4iLCIvKipcbiAqIEV2RW1pdHRlciB2MS4xLjBcbiAqIExpbCcgZXZlbnQgZW1pdHRlclxuICogTUlUIExpY2Vuc2VcbiAqL1xuXG4vKiBqc2hpbnQgdW51c2VkOiB0cnVlLCB1bmRlZjogdHJ1ZSwgc3RyaWN0OiB0cnVlICovXG5cbiggZnVuY3Rpb24oIGdsb2JhbCwgZmFjdG9yeSApIHtcbiAgLy8gdW5pdmVyc2FsIG1vZHVsZSBkZWZpbml0aW9uXG4gIC8qIGpzaGludCBzdHJpY3Q6IGZhbHNlICovIC8qIGdsb2JhbHMgZGVmaW5lLCBtb2R1bGUsIHdpbmRvdyAqL1xuICBpZiAoIHR5cGVvZiBkZWZpbmUgPT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kICkge1xuICAgIC8vIEFNRCAtIFJlcXVpcmVKU1xuICAgIGRlZmluZSggZmFjdG9yeSApO1xuICB9IGVsc2UgaWYgKCB0eXBlb2YgbW9kdWxlID09ICdvYmplY3QnICYmIG1vZHVsZS5leHBvcnRzICkge1xuICAgIC8vIENvbW1vbkpTIC0gQnJvd3NlcmlmeSwgV2VicGFja1xuICAgIG1vZHVsZS5leHBvcnRzID0gZmFjdG9yeSgpO1xuICB9IGVsc2Uge1xuICAgIC8vIEJyb3dzZXIgZ2xvYmFsc1xuICAgIGdsb2JhbC5FdkVtaXR0ZXIgPSBmYWN0b3J5KCk7XG4gIH1cblxufSggdHlwZW9mIHdpbmRvdyAhPSAndW5kZWZpbmVkJyA/IHdpbmRvdyA6IHRoaXMsIGZ1bmN0aW9uKCkge1xuXG5cInVzZSBzdHJpY3RcIjtcblxuZnVuY3Rpb24gRXZFbWl0dGVyKCkge31cblxudmFyIHByb3RvID0gRXZFbWl0dGVyLnByb3RvdHlwZTtcblxucHJvdG8ub24gPSBmdW5jdGlvbiggZXZlbnROYW1lLCBsaXN0ZW5lciApIHtcbiAgaWYgKCAhZXZlbnROYW1lIHx8ICFsaXN0ZW5lciApIHtcbiAgICByZXR1cm47XG4gIH1cbiAgLy8gc2V0IGV2ZW50cyBoYXNoXG4gIHZhciBldmVudHMgPSB0aGlzLl9ldmVudHMgPSB0aGlzLl9ldmVudHMgfHwge307XG4gIC8vIHNldCBsaXN0ZW5lcnMgYXJyYXlcbiAgdmFyIGxpc3RlbmVycyA9IGV2ZW50c1sgZXZlbnROYW1lIF0gPSBldmVudHNbIGV2ZW50TmFtZSBdIHx8IFtdO1xuICAvLyBvbmx5IGFkZCBvbmNlXG4gIGlmICggbGlzdGVuZXJzLmluZGV4T2YoIGxpc3RlbmVyICkgPT0gLTEgKSB7XG4gICAgbGlzdGVuZXJzLnB1c2goIGxpc3RlbmVyICk7XG4gIH1cblxuICByZXR1cm4gdGhpcztcbn07XG5cbnByb3RvLm9uY2UgPSBmdW5jdGlvbiggZXZlbnROYW1lLCBsaXN0ZW5lciApIHtcbiAgaWYgKCAhZXZlbnROYW1lIHx8ICFsaXN0ZW5lciApIHtcbiAgICByZXR1cm47XG4gIH1cbiAgLy8gYWRkIGV2ZW50XG4gIHRoaXMub24oIGV2ZW50TmFtZSwgbGlzdGVuZXIgKTtcbiAgLy8gc2V0IG9uY2UgZmxhZ1xuICAvLyBzZXQgb25jZUV2ZW50cyBoYXNoXG4gIHZhciBvbmNlRXZlbnRzID0gdGhpcy5fb25jZUV2ZW50cyA9IHRoaXMuX29uY2VFdmVudHMgfHwge307XG4gIC8vIHNldCBvbmNlTGlzdGVuZXJzIG9iamVjdFxuICB2YXIgb25jZUxpc3RlbmVycyA9IG9uY2VFdmVudHNbIGV2ZW50TmFtZSBdID0gb25jZUV2ZW50c1sgZXZlbnROYW1lIF0gfHwge307XG4gIC8vIHNldCBmbGFnXG4gIG9uY2VMaXN0ZW5lcnNbIGxpc3RlbmVyIF0gPSB0cnVlO1xuXG4gIHJldHVybiB0aGlzO1xufTtcblxucHJvdG8ub2ZmID0gZnVuY3Rpb24oIGV2ZW50TmFtZSwgbGlzdGVuZXIgKSB7XG4gIHZhciBsaXN0ZW5lcnMgPSB0aGlzLl9ldmVudHMgJiYgdGhpcy5fZXZlbnRzWyBldmVudE5hbWUgXTtcbiAgaWYgKCAhbGlzdGVuZXJzIHx8ICFsaXN0ZW5lcnMubGVuZ3RoICkge1xuICAgIHJldHVybjtcbiAgfVxuICB2YXIgaW5kZXggPSBsaXN0ZW5lcnMuaW5kZXhPZiggbGlzdGVuZXIgKTtcbiAgaWYgKCBpbmRleCAhPSAtMSApIHtcbiAgICBsaXN0ZW5lcnMuc3BsaWNlKCBpbmRleCwgMSApO1xuICB9XG5cbiAgcmV0dXJuIHRoaXM7XG59O1xuXG5wcm90by5lbWl0RXZlbnQgPSBmdW5jdGlvbiggZXZlbnROYW1lLCBhcmdzICkge1xuICB2YXIgbGlzdGVuZXJzID0gdGhpcy5fZXZlbnRzICYmIHRoaXMuX2V2ZW50c1sgZXZlbnROYW1lIF07XG4gIGlmICggIWxpc3RlbmVycyB8fCAhbGlzdGVuZXJzLmxlbmd0aCApIHtcbiAgICByZXR1cm47XG4gIH1cbiAgLy8gY29weSBvdmVyIHRvIGF2b2lkIGludGVyZmVyZW5jZSBpZiAub2ZmKCkgaW4gbGlzdGVuZXJcbiAgbGlzdGVuZXJzID0gbGlzdGVuZXJzLnNsaWNlKDApO1xuICBhcmdzID0gYXJncyB8fCBbXTtcbiAgLy8gb25jZSBzdHVmZlxuICB2YXIgb25jZUxpc3RlbmVycyA9IHRoaXMuX29uY2VFdmVudHMgJiYgdGhpcy5fb25jZUV2ZW50c1sgZXZlbnROYW1lIF07XG5cbiAgZm9yICggdmFyIGk9MDsgaSA8IGxpc3RlbmVycy5sZW5ndGg7IGkrKyApIHtcbiAgICB2YXIgbGlzdGVuZXIgPSBsaXN0ZW5lcnNbaV1cbiAgICB2YXIgaXNPbmNlID0gb25jZUxpc3RlbmVycyAmJiBvbmNlTGlzdGVuZXJzWyBsaXN0ZW5lciBdO1xuICAgIGlmICggaXNPbmNlICkge1xuICAgICAgLy8gcmVtb3ZlIGxpc3RlbmVyXG4gICAgICAvLyByZW1vdmUgYmVmb3JlIHRyaWdnZXIgdG8gcHJldmVudCByZWN1cnNpb25cbiAgICAgIHRoaXMub2ZmKCBldmVudE5hbWUsIGxpc3RlbmVyICk7XG4gICAgICAvLyB1bnNldCBvbmNlIGZsYWdcbiAgICAgIGRlbGV0ZSBvbmNlTGlzdGVuZXJzWyBsaXN0ZW5lciBdO1xuICAgIH1cbiAgICAvLyB0cmlnZ2VyIGxpc3RlbmVyXG4gICAgbGlzdGVuZXIuYXBwbHkoIHRoaXMsIGFyZ3MgKTtcbiAgfVxuXG4gIHJldHVybiB0aGlzO1xufTtcblxucHJvdG8uYWxsT2ZmID0gZnVuY3Rpb24oKSB7XG4gIGRlbGV0ZSB0aGlzLl9ldmVudHM7XG4gIGRlbGV0ZSB0aGlzLl9vbmNlRXZlbnRzO1xufTtcblxucmV0dXJuIEV2RW1pdHRlcjtcblxufSkpO1xuIiwiLyohXG4gKiBqUXVlcnkgSmF2YVNjcmlwdCBMaWJyYXJ5IHYyLjIuNFxuICogaHR0cDovL2pxdWVyeS5jb20vXG4gKlxuICogSW5jbHVkZXMgU2l6emxlLmpzXG4gKiBodHRwOi8vc2l6emxlanMuY29tL1xuICpcbiAqIENvcHlyaWdodCBqUXVlcnkgRm91bmRhdGlvbiBhbmQgb3RoZXIgY29udHJpYnV0b3JzXG4gKiBSZWxlYXNlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2VcbiAqIGh0dHA6Ly9qcXVlcnkub3JnL2xpY2Vuc2VcbiAqXG4gKiBEYXRlOiAyMDE2LTA1LTIwVDE3OjIzWlxuICovXG5cbihmdW5jdGlvbiggZ2xvYmFsLCBmYWN0b3J5ICkge1xuXG5cdGlmICggdHlwZW9mIG1vZHVsZSA9PT0gXCJvYmplY3RcIiAmJiB0eXBlb2YgbW9kdWxlLmV4cG9ydHMgPT09IFwib2JqZWN0XCIgKSB7XG5cdFx0Ly8gRm9yIENvbW1vbkpTIGFuZCBDb21tb25KUy1saWtlIGVudmlyb25tZW50cyB3aGVyZSBhIHByb3BlciBgd2luZG93YFxuXHRcdC8vIGlzIHByZXNlbnQsIGV4ZWN1dGUgdGhlIGZhY3RvcnkgYW5kIGdldCBqUXVlcnkuXG5cdFx0Ly8gRm9yIGVudmlyb25tZW50cyB0aGF0IGRvIG5vdCBoYXZlIGEgYHdpbmRvd2Agd2l0aCBhIGBkb2N1bWVudGBcblx0XHQvLyAoc3VjaCBhcyBOb2RlLmpzKSwgZXhwb3NlIGEgZmFjdG9yeSBhcyBtb2R1bGUuZXhwb3J0cy5cblx0XHQvLyBUaGlzIGFjY2VudHVhdGVzIHRoZSBuZWVkIGZvciB0aGUgY3JlYXRpb24gb2YgYSByZWFsIGB3aW5kb3dgLlxuXHRcdC8vIGUuZy4gdmFyIGpRdWVyeSA9IHJlcXVpcmUoXCJqcXVlcnlcIikod2luZG93KTtcblx0XHQvLyBTZWUgdGlja2V0ICMxNDU0OSBmb3IgbW9yZSBpbmZvLlxuXHRcdG1vZHVsZS5leHBvcnRzID0gZ2xvYmFsLmRvY3VtZW50ID9cblx0XHRcdGZhY3RvcnkoIGdsb2JhbCwgdHJ1ZSApIDpcblx0XHRcdGZ1bmN0aW9uKCB3ICkge1xuXHRcdFx0XHRpZiAoICF3LmRvY3VtZW50ICkge1xuXHRcdFx0XHRcdHRocm93IG5ldyBFcnJvciggXCJqUXVlcnkgcmVxdWlyZXMgYSB3aW5kb3cgd2l0aCBhIGRvY3VtZW50XCIgKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRyZXR1cm4gZmFjdG9yeSggdyApO1xuXHRcdFx0fTtcblx0fSBlbHNlIHtcblx0XHRmYWN0b3J5KCBnbG9iYWwgKTtcblx0fVxuXG4vLyBQYXNzIHRoaXMgaWYgd2luZG93IGlzIG5vdCBkZWZpbmVkIHlldFxufSh0eXBlb2Ygd2luZG93ICE9PSBcInVuZGVmaW5lZFwiID8gd2luZG93IDogdGhpcywgZnVuY3Rpb24oIHdpbmRvdywgbm9HbG9iYWwgKSB7XG5cbi8vIFN1cHBvcnQ6IEZpcmVmb3ggMTgrXG4vLyBDYW4ndCBiZSBpbiBzdHJpY3QgbW9kZSwgc2V2ZXJhbCBsaWJzIGluY2x1ZGluZyBBU1AuTkVUIHRyYWNlXG4vLyB0aGUgc3RhY2sgdmlhIGFyZ3VtZW50cy5jYWxsZXIuY2FsbGVlIGFuZCBGaXJlZm94IGRpZXMgaWZcbi8vIHlvdSB0cnkgdG8gdHJhY2UgdGhyb3VnaCBcInVzZSBzdHJpY3RcIiBjYWxsIGNoYWlucy4gKCMxMzMzNSlcbi8vXCJ1c2Ugc3RyaWN0XCI7XG52YXIgYXJyID0gW107XG5cbnZhciBkb2N1bWVudCA9IHdpbmRvdy5kb2N1bWVudDtcblxudmFyIHNsaWNlID0gYXJyLnNsaWNlO1xuXG52YXIgY29uY2F0ID0gYXJyLmNvbmNhdDtcblxudmFyIHB1c2ggPSBhcnIucHVzaDtcblxudmFyIGluZGV4T2YgPSBhcnIuaW5kZXhPZjtcblxudmFyIGNsYXNzMnR5cGUgPSB7fTtcblxudmFyIHRvU3RyaW5nID0gY2xhc3MydHlwZS50b1N0cmluZztcblxudmFyIGhhc093biA9IGNsYXNzMnR5cGUuaGFzT3duUHJvcGVydHk7XG5cbnZhciBzdXBwb3J0ID0ge307XG5cblxuXG52YXJcblx0dmVyc2lvbiA9IFwiMi4yLjRcIixcblxuXHQvLyBEZWZpbmUgYSBsb2NhbCBjb3B5IG9mIGpRdWVyeVxuXHRqUXVlcnkgPSBmdW5jdGlvbiggc2VsZWN0b3IsIGNvbnRleHQgKSB7XG5cblx0XHQvLyBUaGUgalF1ZXJ5IG9iamVjdCBpcyBhY3R1YWxseSBqdXN0IHRoZSBpbml0IGNvbnN0cnVjdG9yICdlbmhhbmNlZCdcblx0XHQvLyBOZWVkIGluaXQgaWYgalF1ZXJ5IGlzIGNhbGxlZCAoanVzdCBhbGxvdyBlcnJvciB0byBiZSB0aHJvd24gaWYgbm90IGluY2x1ZGVkKVxuXHRcdHJldHVybiBuZXcgalF1ZXJ5LmZuLmluaXQoIHNlbGVjdG9yLCBjb250ZXh0ICk7XG5cdH0sXG5cblx0Ly8gU3VwcG9ydDogQW5kcm9pZDw0LjFcblx0Ly8gTWFrZSBzdXJlIHdlIHRyaW0gQk9NIGFuZCBOQlNQXG5cdHJ0cmltID0gL15bXFxzXFx1RkVGRlxceEEwXSt8W1xcc1xcdUZFRkZcXHhBMF0rJC9nLFxuXG5cdC8vIE1hdGNoZXMgZGFzaGVkIHN0cmluZyBmb3IgY2FtZWxpemluZ1xuXHRybXNQcmVmaXggPSAvXi1tcy0vLFxuXHRyZGFzaEFscGhhID0gLy0oW1xcZGEtel0pL2dpLFxuXG5cdC8vIFVzZWQgYnkgalF1ZXJ5LmNhbWVsQ2FzZSBhcyBjYWxsYmFjayB0byByZXBsYWNlKClcblx0ZmNhbWVsQ2FzZSA9IGZ1bmN0aW9uKCBhbGwsIGxldHRlciApIHtcblx0XHRyZXR1cm4gbGV0dGVyLnRvVXBwZXJDYXNlKCk7XG5cdH07XG5cbmpRdWVyeS5mbiA9IGpRdWVyeS5wcm90b3R5cGUgPSB7XG5cblx0Ly8gVGhlIGN1cnJlbnQgdmVyc2lvbiBvZiBqUXVlcnkgYmVpbmcgdXNlZFxuXHRqcXVlcnk6IHZlcnNpb24sXG5cblx0Y29uc3RydWN0b3I6IGpRdWVyeSxcblxuXHQvLyBTdGFydCB3aXRoIGFuIGVtcHR5IHNlbGVjdG9yXG5cdHNlbGVjdG9yOiBcIlwiLFxuXG5cdC8vIFRoZSBkZWZhdWx0IGxlbmd0aCBvZiBhIGpRdWVyeSBvYmplY3QgaXMgMFxuXHRsZW5ndGg6IDAsXG5cblx0dG9BcnJheTogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIHNsaWNlLmNhbGwoIHRoaXMgKTtcblx0fSxcblxuXHQvLyBHZXQgdGhlIE50aCBlbGVtZW50IGluIHRoZSBtYXRjaGVkIGVsZW1lbnQgc2V0IE9SXG5cdC8vIEdldCB0aGUgd2hvbGUgbWF0Y2hlZCBlbGVtZW50IHNldCBhcyBhIGNsZWFuIGFycmF5XG5cdGdldDogZnVuY3Rpb24oIG51bSApIHtcblx0XHRyZXR1cm4gbnVtICE9IG51bGwgP1xuXG5cdFx0XHQvLyBSZXR1cm4ganVzdCB0aGUgb25lIGVsZW1lbnQgZnJvbSB0aGUgc2V0XG5cdFx0XHQoIG51bSA8IDAgPyB0aGlzWyBudW0gKyB0aGlzLmxlbmd0aCBdIDogdGhpc1sgbnVtIF0gKSA6XG5cblx0XHRcdC8vIFJldHVybiBhbGwgdGhlIGVsZW1lbnRzIGluIGEgY2xlYW4gYXJyYXlcblx0XHRcdHNsaWNlLmNhbGwoIHRoaXMgKTtcblx0fSxcblxuXHQvLyBUYWtlIGFuIGFycmF5IG9mIGVsZW1lbnRzIGFuZCBwdXNoIGl0IG9udG8gdGhlIHN0YWNrXG5cdC8vIChyZXR1cm5pbmcgdGhlIG5ldyBtYXRjaGVkIGVsZW1lbnQgc2V0KVxuXHRwdXNoU3RhY2s6IGZ1bmN0aW9uKCBlbGVtcyApIHtcblxuXHRcdC8vIEJ1aWxkIGEgbmV3IGpRdWVyeSBtYXRjaGVkIGVsZW1lbnQgc2V0XG5cdFx0dmFyIHJldCA9IGpRdWVyeS5tZXJnZSggdGhpcy5jb25zdHJ1Y3RvcigpLCBlbGVtcyApO1xuXG5cdFx0Ly8gQWRkIHRoZSBvbGQgb2JqZWN0IG9udG8gdGhlIHN0YWNrIChhcyBhIHJlZmVyZW5jZSlcblx0XHRyZXQucHJldk9iamVjdCA9IHRoaXM7XG5cdFx0cmV0LmNvbnRleHQgPSB0aGlzLmNvbnRleHQ7XG5cblx0XHQvLyBSZXR1cm4gdGhlIG5ld2x5LWZvcm1lZCBlbGVtZW50IHNldFxuXHRcdHJldHVybiByZXQ7XG5cdH0sXG5cblx0Ly8gRXhlY3V0ZSBhIGNhbGxiYWNrIGZvciBldmVyeSBlbGVtZW50IGluIHRoZSBtYXRjaGVkIHNldC5cblx0ZWFjaDogZnVuY3Rpb24oIGNhbGxiYWNrICkge1xuXHRcdHJldHVybiBqUXVlcnkuZWFjaCggdGhpcywgY2FsbGJhY2sgKTtcblx0fSxcblxuXHRtYXA6IGZ1bmN0aW9uKCBjYWxsYmFjayApIHtcblx0XHRyZXR1cm4gdGhpcy5wdXNoU3RhY2soIGpRdWVyeS5tYXAoIHRoaXMsIGZ1bmN0aW9uKCBlbGVtLCBpICkge1xuXHRcdFx0cmV0dXJuIGNhbGxiYWNrLmNhbGwoIGVsZW0sIGksIGVsZW0gKTtcblx0XHR9ICkgKTtcblx0fSxcblxuXHRzbGljZTogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIHRoaXMucHVzaFN0YWNrKCBzbGljZS5hcHBseSggdGhpcywgYXJndW1lbnRzICkgKTtcblx0fSxcblxuXHRmaXJzdDogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIHRoaXMuZXEoIDAgKTtcblx0fSxcblxuXHRsYXN0OiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gdGhpcy5lcSggLTEgKTtcblx0fSxcblxuXHRlcTogZnVuY3Rpb24oIGkgKSB7XG5cdFx0dmFyIGxlbiA9IHRoaXMubGVuZ3RoLFxuXHRcdFx0aiA9ICtpICsgKCBpIDwgMCA/IGxlbiA6IDAgKTtcblx0XHRyZXR1cm4gdGhpcy5wdXNoU3RhY2soIGogPj0gMCAmJiBqIDwgbGVuID8gWyB0aGlzWyBqIF0gXSA6IFtdICk7XG5cdH0sXG5cblx0ZW5kOiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gdGhpcy5wcmV2T2JqZWN0IHx8IHRoaXMuY29uc3RydWN0b3IoKTtcblx0fSxcblxuXHQvLyBGb3IgaW50ZXJuYWwgdXNlIG9ubHkuXG5cdC8vIEJlaGF2ZXMgbGlrZSBhbiBBcnJheSdzIG1ldGhvZCwgbm90IGxpa2UgYSBqUXVlcnkgbWV0aG9kLlxuXHRwdXNoOiBwdXNoLFxuXHRzb3J0OiBhcnIuc29ydCxcblx0c3BsaWNlOiBhcnIuc3BsaWNlXG59O1xuXG5qUXVlcnkuZXh0ZW5kID0galF1ZXJ5LmZuLmV4dGVuZCA9IGZ1bmN0aW9uKCkge1xuXHR2YXIgb3B0aW9ucywgbmFtZSwgc3JjLCBjb3B5LCBjb3B5SXNBcnJheSwgY2xvbmUsXG5cdFx0dGFyZ2V0ID0gYXJndW1lbnRzWyAwIF0gfHwge30sXG5cdFx0aSA9IDEsXG5cdFx0bGVuZ3RoID0gYXJndW1lbnRzLmxlbmd0aCxcblx0XHRkZWVwID0gZmFsc2U7XG5cblx0Ly8gSGFuZGxlIGEgZGVlcCBjb3B5IHNpdHVhdGlvblxuXHRpZiAoIHR5cGVvZiB0YXJnZXQgPT09IFwiYm9vbGVhblwiICkge1xuXHRcdGRlZXAgPSB0YXJnZXQ7XG5cblx0XHQvLyBTa2lwIHRoZSBib29sZWFuIGFuZCB0aGUgdGFyZ2V0XG5cdFx0dGFyZ2V0ID0gYXJndW1lbnRzWyBpIF0gfHwge307XG5cdFx0aSsrO1xuXHR9XG5cblx0Ly8gSGFuZGxlIGNhc2Ugd2hlbiB0YXJnZXQgaXMgYSBzdHJpbmcgb3Igc29tZXRoaW5nIChwb3NzaWJsZSBpbiBkZWVwIGNvcHkpXG5cdGlmICggdHlwZW9mIHRhcmdldCAhPT0gXCJvYmplY3RcIiAmJiAhalF1ZXJ5LmlzRnVuY3Rpb24oIHRhcmdldCApICkge1xuXHRcdHRhcmdldCA9IHt9O1xuXHR9XG5cblx0Ly8gRXh0ZW5kIGpRdWVyeSBpdHNlbGYgaWYgb25seSBvbmUgYXJndW1lbnQgaXMgcGFzc2VkXG5cdGlmICggaSA9PT0gbGVuZ3RoICkge1xuXHRcdHRhcmdldCA9IHRoaXM7XG5cdFx0aS0tO1xuXHR9XG5cblx0Zm9yICggOyBpIDwgbGVuZ3RoOyBpKysgKSB7XG5cblx0XHQvLyBPbmx5IGRlYWwgd2l0aCBub24tbnVsbC91bmRlZmluZWQgdmFsdWVzXG5cdFx0aWYgKCAoIG9wdGlvbnMgPSBhcmd1bWVudHNbIGkgXSApICE9IG51bGwgKSB7XG5cblx0XHRcdC8vIEV4dGVuZCB0aGUgYmFzZSBvYmplY3Rcblx0XHRcdGZvciAoIG5hbWUgaW4gb3B0aW9ucyApIHtcblx0XHRcdFx0c3JjID0gdGFyZ2V0WyBuYW1lIF07XG5cdFx0XHRcdGNvcHkgPSBvcHRpb25zWyBuYW1lIF07XG5cblx0XHRcdFx0Ly8gUHJldmVudCBuZXZlci1lbmRpbmcgbG9vcFxuXHRcdFx0XHRpZiAoIHRhcmdldCA9PT0gY29weSApIHtcblx0XHRcdFx0XHRjb250aW51ZTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIFJlY3Vyc2UgaWYgd2UncmUgbWVyZ2luZyBwbGFpbiBvYmplY3RzIG9yIGFycmF5c1xuXHRcdFx0XHRpZiAoIGRlZXAgJiYgY29weSAmJiAoIGpRdWVyeS5pc1BsYWluT2JqZWN0KCBjb3B5ICkgfHxcblx0XHRcdFx0XHQoIGNvcHlJc0FycmF5ID0galF1ZXJ5LmlzQXJyYXkoIGNvcHkgKSApICkgKSB7XG5cblx0XHRcdFx0XHRpZiAoIGNvcHlJc0FycmF5ICkge1xuXHRcdFx0XHRcdFx0Y29weUlzQXJyYXkgPSBmYWxzZTtcblx0XHRcdFx0XHRcdGNsb25lID0gc3JjICYmIGpRdWVyeS5pc0FycmF5KCBzcmMgKSA/IHNyYyA6IFtdO1xuXG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdGNsb25lID0gc3JjICYmIGpRdWVyeS5pc1BsYWluT2JqZWN0KCBzcmMgKSA/IHNyYyA6IHt9O1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdC8vIE5ldmVyIG1vdmUgb3JpZ2luYWwgb2JqZWN0cywgY2xvbmUgdGhlbVxuXHRcdFx0XHRcdHRhcmdldFsgbmFtZSBdID0galF1ZXJ5LmV4dGVuZCggZGVlcCwgY2xvbmUsIGNvcHkgKTtcblxuXHRcdFx0XHQvLyBEb24ndCBicmluZyBpbiB1bmRlZmluZWQgdmFsdWVzXG5cdFx0XHRcdH0gZWxzZSBpZiAoIGNvcHkgIT09IHVuZGVmaW5lZCApIHtcblx0XHRcdFx0XHR0YXJnZXRbIG5hbWUgXSA9IGNvcHk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHQvLyBSZXR1cm4gdGhlIG1vZGlmaWVkIG9iamVjdFxuXHRyZXR1cm4gdGFyZ2V0O1xufTtcblxualF1ZXJ5LmV4dGVuZCgge1xuXG5cdC8vIFVuaXF1ZSBmb3IgZWFjaCBjb3B5IG9mIGpRdWVyeSBvbiB0aGUgcGFnZVxuXHRleHBhbmRvOiBcImpRdWVyeVwiICsgKCB2ZXJzaW9uICsgTWF0aC5yYW5kb20oKSApLnJlcGxhY2UoIC9cXEQvZywgXCJcIiApLFxuXG5cdC8vIEFzc3VtZSBqUXVlcnkgaXMgcmVhZHkgd2l0aG91dCB0aGUgcmVhZHkgbW9kdWxlXG5cdGlzUmVhZHk6IHRydWUsXG5cblx0ZXJyb3I6IGZ1bmN0aW9uKCBtc2cgKSB7XG5cdFx0dGhyb3cgbmV3IEVycm9yKCBtc2cgKTtcblx0fSxcblxuXHRub29wOiBmdW5jdGlvbigpIHt9LFxuXG5cdGlzRnVuY3Rpb246IGZ1bmN0aW9uKCBvYmogKSB7XG5cdFx0cmV0dXJuIGpRdWVyeS50eXBlKCBvYmogKSA9PT0gXCJmdW5jdGlvblwiO1xuXHR9LFxuXG5cdGlzQXJyYXk6IEFycmF5LmlzQXJyYXksXG5cblx0aXNXaW5kb3c6IGZ1bmN0aW9uKCBvYmogKSB7XG5cdFx0cmV0dXJuIG9iaiAhPSBudWxsICYmIG9iaiA9PT0gb2JqLndpbmRvdztcblx0fSxcblxuXHRpc051bWVyaWM6IGZ1bmN0aW9uKCBvYmogKSB7XG5cblx0XHQvLyBwYXJzZUZsb2F0IE5hTnMgbnVtZXJpYy1jYXN0IGZhbHNlIHBvc2l0aXZlcyAobnVsbHx0cnVlfGZhbHNlfFwiXCIpXG5cdFx0Ly8gLi4uYnV0IG1pc2ludGVycHJldHMgbGVhZGluZy1udW1iZXIgc3RyaW5ncywgcGFydGljdWxhcmx5IGhleCBsaXRlcmFscyAoXCIweC4uLlwiKVxuXHRcdC8vIHN1YnRyYWN0aW9uIGZvcmNlcyBpbmZpbml0aWVzIHRvIE5hTlxuXHRcdC8vIGFkZGluZyAxIGNvcnJlY3RzIGxvc3Mgb2YgcHJlY2lzaW9uIGZyb20gcGFyc2VGbG9hdCAoIzE1MTAwKVxuXHRcdHZhciByZWFsU3RyaW5nT2JqID0gb2JqICYmIG9iai50b1N0cmluZygpO1xuXHRcdHJldHVybiAhalF1ZXJ5LmlzQXJyYXkoIG9iaiApICYmICggcmVhbFN0cmluZ09iaiAtIHBhcnNlRmxvYXQoIHJlYWxTdHJpbmdPYmogKSArIDEgKSA+PSAwO1xuXHR9LFxuXG5cdGlzUGxhaW5PYmplY3Q6IGZ1bmN0aW9uKCBvYmogKSB7XG5cdFx0dmFyIGtleTtcblxuXHRcdC8vIE5vdCBwbGFpbiBvYmplY3RzOlxuXHRcdC8vIC0gQW55IG9iamVjdCBvciB2YWx1ZSB3aG9zZSBpbnRlcm5hbCBbW0NsYXNzXV0gcHJvcGVydHkgaXMgbm90IFwiW29iamVjdCBPYmplY3RdXCJcblx0XHQvLyAtIERPTSBub2Rlc1xuXHRcdC8vIC0gd2luZG93XG5cdFx0aWYgKCBqUXVlcnkudHlwZSggb2JqICkgIT09IFwib2JqZWN0XCIgfHwgb2JqLm5vZGVUeXBlIHx8IGpRdWVyeS5pc1dpbmRvdyggb2JqICkgKSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXG5cdFx0Ly8gTm90IG93biBjb25zdHJ1Y3RvciBwcm9wZXJ0eSBtdXN0IGJlIE9iamVjdFxuXHRcdGlmICggb2JqLmNvbnN0cnVjdG9yICYmXG5cdFx0XHRcdCFoYXNPd24uY2FsbCggb2JqLCBcImNvbnN0cnVjdG9yXCIgKSAmJlxuXHRcdFx0XHQhaGFzT3duLmNhbGwoIG9iai5jb25zdHJ1Y3Rvci5wcm90b3R5cGUgfHwge30sIFwiaXNQcm90b3R5cGVPZlwiICkgKSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXG5cdFx0Ly8gT3duIHByb3BlcnRpZXMgYXJlIGVudW1lcmF0ZWQgZmlyc3RseSwgc28gdG8gc3BlZWQgdXAsXG5cdFx0Ly8gaWYgbGFzdCBvbmUgaXMgb3duLCB0aGVuIGFsbCBwcm9wZXJ0aWVzIGFyZSBvd25cblx0XHRmb3IgKCBrZXkgaW4gb2JqICkge31cblxuXHRcdHJldHVybiBrZXkgPT09IHVuZGVmaW5lZCB8fCBoYXNPd24uY2FsbCggb2JqLCBrZXkgKTtcblx0fSxcblxuXHRpc0VtcHR5T2JqZWN0OiBmdW5jdGlvbiggb2JqICkge1xuXHRcdHZhciBuYW1lO1xuXHRcdGZvciAoIG5hbWUgaW4gb2JqICkge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblx0XHRyZXR1cm4gdHJ1ZTtcblx0fSxcblxuXHR0eXBlOiBmdW5jdGlvbiggb2JqICkge1xuXHRcdGlmICggb2JqID09IG51bGwgKSB7XG5cdFx0XHRyZXR1cm4gb2JqICsgXCJcIjtcblx0XHR9XG5cblx0XHQvLyBTdXBwb3J0OiBBbmRyb2lkPDQuMCwgaU9TPDYgKGZ1bmN0aW9uaXNoIFJlZ0V4cClcblx0XHRyZXR1cm4gdHlwZW9mIG9iaiA9PT0gXCJvYmplY3RcIiB8fCB0eXBlb2Ygb2JqID09PSBcImZ1bmN0aW9uXCIgP1xuXHRcdFx0Y2xhc3MydHlwZVsgdG9TdHJpbmcuY2FsbCggb2JqICkgXSB8fCBcIm9iamVjdFwiIDpcblx0XHRcdHR5cGVvZiBvYmo7XG5cdH0sXG5cblx0Ly8gRXZhbHVhdGVzIGEgc2NyaXB0IGluIGEgZ2xvYmFsIGNvbnRleHRcblx0Z2xvYmFsRXZhbDogZnVuY3Rpb24oIGNvZGUgKSB7XG5cdFx0dmFyIHNjcmlwdCxcblx0XHRcdGluZGlyZWN0ID0gZXZhbDtcblxuXHRcdGNvZGUgPSBqUXVlcnkudHJpbSggY29kZSApO1xuXG5cdFx0aWYgKCBjb2RlICkge1xuXG5cdFx0XHQvLyBJZiB0aGUgY29kZSBpbmNsdWRlcyBhIHZhbGlkLCBwcm9sb2d1ZSBwb3NpdGlvblxuXHRcdFx0Ly8gc3RyaWN0IG1vZGUgcHJhZ21hLCBleGVjdXRlIGNvZGUgYnkgaW5qZWN0aW5nIGFcblx0XHRcdC8vIHNjcmlwdCB0YWcgaW50byB0aGUgZG9jdW1lbnQuXG5cdFx0XHRpZiAoIGNvZGUuaW5kZXhPZiggXCJ1c2Ugc3RyaWN0XCIgKSA9PT0gMSApIHtcblx0XHRcdFx0c2NyaXB0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCggXCJzY3JpcHRcIiApO1xuXHRcdFx0XHRzY3JpcHQudGV4dCA9IGNvZGU7XG5cdFx0XHRcdGRvY3VtZW50LmhlYWQuYXBwZW5kQ2hpbGQoIHNjcmlwdCApLnBhcmVudE5vZGUucmVtb3ZlQ2hpbGQoIHNjcmlwdCApO1xuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHQvLyBPdGhlcndpc2UsIGF2b2lkIHRoZSBET00gbm9kZSBjcmVhdGlvbiwgaW5zZXJ0aW9uXG5cdFx0XHRcdC8vIGFuZCByZW1vdmFsIGJ5IHVzaW5nIGFuIGluZGlyZWN0IGdsb2JhbCBldmFsXG5cblx0XHRcdFx0aW5kaXJlY3QoIGNvZGUgKTtcblx0XHRcdH1cblx0XHR9XG5cdH0sXG5cblx0Ly8gQ29udmVydCBkYXNoZWQgdG8gY2FtZWxDYXNlOyB1c2VkIGJ5IHRoZSBjc3MgYW5kIGRhdGEgbW9kdWxlc1xuXHQvLyBTdXBwb3J0OiBJRTktMTErXG5cdC8vIE1pY3Jvc29mdCBmb3Jnb3QgdG8gaHVtcCB0aGVpciB2ZW5kb3IgcHJlZml4ICgjOTU3Milcblx0Y2FtZWxDYXNlOiBmdW5jdGlvbiggc3RyaW5nICkge1xuXHRcdHJldHVybiBzdHJpbmcucmVwbGFjZSggcm1zUHJlZml4LCBcIm1zLVwiICkucmVwbGFjZSggcmRhc2hBbHBoYSwgZmNhbWVsQ2FzZSApO1xuXHR9LFxuXG5cdG5vZGVOYW1lOiBmdW5jdGlvbiggZWxlbSwgbmFtZSApIHtcblx0XHRyZXR1cm4gZWxlbS5ub2RlTmFtZSAmJiBlbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09IG5hbWUudG9Mb3dlckNhc2UoKTtcblx0fSxcblxuXHRlYWNoOiBmdW5jdGlvbiggb2JqLCBjYWxsYmFjayApIHtcblx0XHR2YXIgbGVuZ3RoLCBpID0gMDtcblxuXHRcdGlmICggaXNBcnJheUxpa2UoIG9iaiApICkge1xuXHRcdFx0bGVuZ3RoID0gb2JqLmxlbmd0aDtcblx0XHRcdGZvciAoIDsgaSA8IGxlbmd0aDsgaSsrICkge1xuXHRcdFx0XHRpZiAoIGNhbGxiYWNrLmNhbGwoIG9ialsgaSBdLCBpLCBvYmpbIGkgXSApID09PSBmYWxzZSApIHtcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0gZWxzZSB7XG5cdFx0XHRmb3IgKCBpIGluIG9iaiApIHtcblx0XHRcdFx0aWYgKCBjYWxsYmFjay5jYWxsKCBvYmpbIGkgXSwgaSwgb2JqWyBpIF0gKSA9PT0gZmFsc2UgKSB7XG5cdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gb2JqO1xuXHR9LFxuXG5cdC8vIFN1cHBvcnQ6IEFuZHJvaWQ8NC4xXG5cdHRyaW06IGZ1bmN0aW9uKCB0ZXh0ICkge1xuXHRcdHJldHVybiB0ZXh0ID09IG51bGwgP1xuXHRcdFx0XCJcIiA6XG5cdFx0XHQoIHRleHQgKyBcIlwiICkucmVwbGFjZSggcnRyaW0sIFwiXCIgKTtcblx0fSxcblxuXHQvLyByZXN1bHRzIGlzIGZvciBpbnRlcm5hbCB1c2FnZSBvbmx5XG5cdG1ha2VBcnJheTogZnVuY3Rpb24oIGFyciwgcmVzdWx0cyApIHtcblx0XHR2YXIgcmV0ID0gcmVzdWx0cyB8fCBbXTtcblxuXHRcdGlmICggYXJyICE9IG51bGwgKSB7XG5cdFx0XHRpZiAoIGlzQXJyYXlMaWtlKCBPYmplY3QoIGFyciApICkgKSB7XG5cdFx0XHRcdGpRdWVyeS5tZXJnZSggcmV0LFxuXHRcdFx0XHRcdHR5cGVvZiBhcnIgPT09IFwic3RyaW5nXCIgP1xuXHRcdFx0XHRcdFsgYXJyIF0gOiBhcnJcblx0XHRcdFx0KTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHB1c2guY2FsbCggcmV0LCBhcnIgKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gcmV0O1xuXHR9LFxuXG5cdGluQXJyYXk6IGZ1bmN0aW9uKCBlbGVtLCBhcnIsIGkgKSB7XG5cdFx0cmV0dXJuIGFyciA9PSBudWxsID8gLTEgOiBpbmRleE9mLmNhbGwoIGFyciwgZWxlbSwgaSApO1xuXHR9LFxuXG5cdG1lcmdlOiBmdW5jdGlvbiggZmlyc3QsIHNlY29uZCApIHtcblx0XHR2YXIgbGVuID0gK3NlY29uZC5sZW5ndGgsXG5cdFx0XHRqID0gMCxcblx0XHRcdGkgPSBmaXJzdC5sZW5ndGg7XG5cblx0XHRmb3IgKCA7IGogPCBsZW47IGorKyApIHtcblx0XHRcdGZpcnN0WyBpKysgXSA9IHNlY29uZFsgaiBdO1xuXHRcdH1cblxuXHRcdGZpcnN0Lmxlbmd0aCA9IGk7XG5cblx0XHRyZXR1cm4gZmlyc3Q7XG5cdH0sXG5cblx0Z3JlcDogZnVuY3Rpb24oIGVsZW1zLCBjYWxsYmFjaywgaW52ZXJ0ICkge1xuXHRcdHZhciBjYWxsYmFja0ludmVyc2UsXG5cdFx0XHRtYXRjaGVzID0gW10sXG5cdFx0XHRpID0gMCxcblx0XHRcdGxlbmd0aCA9IGVsZW1zLmxlbmd0aCxcblx0XHRcdGNhbGxiYWNrRXhwZWN0ID0gIWludmVydDtcblxuXHRcdC8vIEdvIHRocm91Z2ggdGhlIGFycmF5LCBvbmx5IHNhdmluZyB0aGUgaXRlbXNcblx0XHQvLyB0aGF0IHBhc3MgdGhlIHZhbGlkYXRvciBmdW5jdGlvblxuXHRcdGZvciAoIDsgaSA8IGxlbmd0aDsgaSsrICkge1xuXHRcdFx0Y2FsbGJhY2tJbnZlcnNlID0gIWNhbGxiYWNrKCBlbGVtc1sgaSBdLCBpICk7XG5cdFx0XHRpZiAoIGNhbGxiYWNrSW52ZXJzZSAhPT0gY2FsbGJhY2tFeHBlY3QgKSB7XG5cdFx0XHRcdG1hdGNoZXMucHVzaCggZWxlbXNbIGkgXSApO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiBtYXRjaGVzO1xuXHR9LFxuXG5cdC8vIGFyZyBpcyBmb3IgaW50ZXJuYWwgdXNhZ2Ugb25seVxuXHRtYXA6IGZ1bmN0aW9uKCBlbGVtcywgY2FsbGJhY2ssIGFyZyApIHtcblx0XHR2YXIgbGVuZ3RoLCB2YWx1ZSxcblx0XHRcdGkgPSAwLFxuXHRcdFx0cmV0ID0gW107XG5cblx0XHQvLyBHbyB0aHJvdWdoIHRoZSBhcnJheSwgdHJhbnNsYXRpbmcgZWFjaCBvZiB0aGUgaXRlbXMgdG8gdGhlaXIgbmV3IHZhbHVlc1xuXHRcdGlmICggaXNBcnJheUxpa2UoIGVsZW1zICkgKSB7XG5cdFx0XHRsZW5ndGggPSBlbGVtcy5sZW5ndGg7XG5cdFx0XHRmb3IgKCA7IGkgPCBsZW5ndGg7IGkrKyApIHtcblx0XHRcdFx0dmFsdWUgPSBjYWxsYmFjayggZWxlbXNbIGkgXSwgaSwgYXJnICk7XG5cblx0XHRcdFx0aWYgKCB2YWx1ZSAhPSBudWxsICkge1xuXHRcdFx0XHRcdHJldC5wdXNoKCB2YWx1ZSApO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHQvLyBHbyB0aHJvdWdoIGV2ZXJ5IGtleSBvbiB0aGUgb2JqZWN0LFxuXHRcdH0gZWxzZSB7XG5cdFx0XHRmb3IgKCBpIGluIGVsZW1zICkge1xuXHRcdFx0XHR2YWx1ZSA9IGNhbGxiYWNrKCBlbGVtc1sgaSBdLCBpLCBhcmcgKTtcblxuXHRcdFx0XHRpZiAoIHZhbHVlICE9IG51bGwgKSB7XG5cdFx0XHRcdFx0cmV0LnB1c2goIHZhbHVlICk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyBGbGF0dGVuIGFueSBuZXN0ZWQgYXJyYXlzXG5cdFx0cmV0dXJuIGNvbmNhdC5hcHBseSggW10sIHJldCApO1xuXHR9LFxuXG5cdC8vIEEgZ2xvYmFsIEdVSUQgY291bnRlciBmb3Igb2JqZWN0c1xuXHRndWlkOiAxLFxuXG5cdC8vIEJpbmQgYSBmdW5jdGlvbiB0byBhIGNvbnRleHQsIG9wdGlvbmFsbHkgcGFydGlhbGx5IGFwcGx5aW5nIGFueVxuXHQvLyBhcmd1bWVudHMuXG5cdHByb3h5OiBmdW5jdGlvbiggZm4sIGNvbnRleHQgKSB7XG5cdFx0dmFyIHRtcCwgYXJncywgcHJveHk7XG5cblx0XHRpZiAoIHR5cGVvZiBjb250ZXh0ID09PSBcInN0cmluZ1wiICkge1xuXHRcdFx0dG1wID0gZm5bIGNvbnRleHQgXTtcblx0XHRcdGNvbnRleHQgPSBmbjtcblx0XHRcdGZuID0gdG1wO1xuXHRcdH1cblxuXHRcdC8vIFF1aWNrIGNoZWNrIHRvIGRldGVybWluZSBpZiB0YXJnZXQgaXMgY2FsbGFibGUsIGluIHRoZSBzcGVjXG5cdFx0Ly8gdGhpcyB0aHJvd3MgYSBUeXBlRXJyb3IsIGJ1dCB3ZSB3aWxsIGp1c3QgcmV0dXJuIHVuZGVmaW5lZC5cblx0XHRpZiAoICFqUXVlcnkuaXNGdW5jdGlvbiggZm4gKSApIHtcblx0XHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdFx0fVxuXG5cdFx0Ly8gU2ltdWxhdGVkIGJpbmRcblx0XHRhcmdzID0gc2xpY2UuY2FsbCggYXJndW1lbnRzLCAyICk7XG5cdFx0cHJveHkgPSBmdW5jdGlvbigpIHtcblx0XHRcdHJldHVybiBmbi5hcHBseSggY29udGV4dCB8fCB0aGlzLCBhcmdzLmNvbmNhdCggc2xpY2UuY2FsbCggYXJndW1lbnRzICkgKSApO1xuXHRcdH07XG5cblx0XHQvLyBTZXQgdGhlIGd1aWQgb2YgdW5pcXVlIGhhbmRsZXIgdG8gdGhlIHNhbWUgb2Ygb3JpZ2luYWwgaGFuZGxlciwgc28gaXQgY2FuIGJlIHJlbW92ZWRcblx0XHRwcm94eS5ndWlkID0gZm4uZ3VpZCA9IGZuLmd1aWQgfHwgalF1ZXJ5Lmd1aWQrKztcblxuXHRcdHJldHVybiBwcm94eTtcblx0fSxcblxuXHRub3c6IERhdGUubm93LFxuXG5cdC8vIGpRdWVyeS5zdXBwb3J0IGlzIG5vdCB1c2VkIGluIENvcmUgYnV0IG90aGVyIHByb2plY3RzIGF0dGFjaCB0aGVpclxuXHQvLyBwcm9wZXJ0aWVzIHRvIGl0IHNvIGl0IG5lZWRzIHRvIGV4aXN0LlxuXHRzdXBwb3J0OiBzdXBwb3J0XG59ICk7XG5cbi8vIEpTSGludCB3b3VsZCBlcnJvciBvbiB0aGlzIGNvZGUgZHVlIHRvIHRoZSBTeW1ib2wgbm90IGJlaW5nIGRlZmluZWQgaW4gRVM1LlxuLy8gRGVmaW5pbmcgdGhpcyBnbG9iYWwgaW4gLmpzaGludHJjIHdvdWxkIGNyZWF0ZSBhIGRhbmdlciBvZiB1c2luZyB0aGUgZ2xvYmFsXG4vLyB1bmd1YXJkZWQgaW4gYW5vdGhlciBwbGFjZSwgaXQgc2VlbXMgc2FmZXIgdG8ganVzdCBkaXNhYmxlIEpTSGludCBmb3IgdGhlc2Vcbi8vIHRocmVlIGxpbmVzLlxuLyoganNoaW50IGlnbm9yZTogc3RhcnQgKi9cbmlmICggdHlwZW9mIFN5bWJvbCA9PT0gXCJmdW5jdGlvblwiICkge1xuXHRqUXVlcnkuZm5bIFN5bWJvbC5pdGVyYXRvciBdID0gYXJyWyBTeW1ib2wuaXRlcmF0b3IgXTtcbn1cbi8qIGpzaGludCBpZ25vcmU6IGVuZCAqL1xuXG4vLyBQb3B1bGF0ZSB0aGUgY2xhc3MydHlwZSBtYXBcbmpRdWVyeS5lYWNoKCBcIkJvb2xlYW4gTnVtYmVyIFN0cmluZyBGdW5jdGlvbiBBcnJheSBEYXRlIFJlZ0V4cCBPYmplY3QgRXJyb3IgU3ltYm9sXCIuc3BsaXQoIFwiIFwiICksXG5mdW5jdGlvbiggaSwgbmFtZSApIHtcblx0Y2xhc3MydHlwZVsgXCJbb2JqZWN0IFwiICsgbmFtZSArIFwiXVwiIF0gPSBuYW1lLnRvTG93ZXJDYXNlKCk7XG59ICk7XG5cbmZ1bmN0aW9uIGlzQXJyYXlMaWtlKCBvYmogKSB7XG5cblx0Ly8gU3VwcG9ydDogaU9TIDguMiAobm90IHJlcHJvZHVjaWJsZSBpbiBzaW11bGF0b3IpXG5cdC8vIGBpbmAgY2hlY2sgdXNlZCB0byBwcmV2ZW50IEpJVCBlcnJvciAoZ2gtMjE0NSlcblx0Ly8gaGFzT3duIGlzbid0IHVzZWQgaGVyZSBkdWUgdG8gZmFsc2UgbmVnYXRpdmVzXG5cdC8vIHJlZ2FyZGluZyBOb2RlbGlzdCBsZW5ndGggaW4gSUVcblx0dmFyIGxlbmd0aCA9ICEhb2JqICYmIFwibGVuZ3RoXCIgaW4gb2JqICYmIG9iai5sZW5ndGgsXG5cdFx0dHlwZSA9IGpRdWVyeS50eXBlKCBvYmogKTtcblxuXHRpZiAoIHR5cGUgPT09IFwiZnVuY3Rpb25cIiB8fCBqUXVlcnkuaXNXaW5kb3coIG9iaiApICkge1xuXHRcdHJldHVybiBmYWxzZTtcblx0fVxuXG5cdHJldHVybiB0eXBlID09PSBcImFycmF5XCIgfHwgbGVuZ3RoID09PSAwIHx8XG5cdFx0dHlwZW9mIGxlbmd0aCA9PT0gXCJudW1iZXJcIiAmJiBsZW5ndGggPiAwICYmICggbGVuZ3RoIC0gMSApIGluIG9iajtcbn1cbnZhciBTaXp6bGUgPVxuLyohXG4gKiBTaXp6bGUgQ1NTIFNlbGVjdG9yIEVuZ2luZSB2Mi4yLjFcbiAqIGh0dHA6Ly9zaXp6bGVqcy5jb20vXG4gKlxuICogQ29weXJpZ2h0IGpRdWVyeSBGb3VuZGF0aW9uIGFuZCBvdGhlciBjb250cmlidXRvcnNcbiAqIFJlbGVhc2VkIHVuZGVyIHRoZSBNSVQgbGljZW5zZVxuICogaHR0cDovL2pxdWVyeS5vcmcvbGljZW5zZVxuICpcbiAqIERhdGU6IDIwMTUtMTAtMTdcbiAqL1xuKGZ1bmN0aW9uKCB3aW5kb3cgKSB7XG5cbnZhciBpLFxuXHRzdXBwb3J0LFxuXHRFeHByLFxuXHRnZXRUZXh0LFxuXHRpc1hNTCxcblx0dG9rZW5pemUsXG5cdGNvbXBpbGUsXG5cdHNlbGVjdCxcblx0b3V0ZXJtb3N0Q29udGV4dCxcblx0c29ydElucHV0LFxuXHRoYXNEdXBsaWNhdGUsXG5cblx0Ly8gTG9jYWwgZG9jdW1lbnQgdmFyc1xuXHRzZXREb2N1bWVudCxcblx0ZG9jdW1lbnQsXG5cdGRvY0VsZW0sXG5cdGRvY3VtZW50SXNIVE1MLFxuXHRyYnVnZ3lRU0EsXG5cdHJidWdneU1hdGNoZXMsXG5cdG1hdGNoZXMsXG5cdGNvbnRhaW5zLFxuXG5cdC8vIEluc3RhbmNlLXNwZWNpZmljIGRhdGFcblx0ZXhwYW5kbyA9IFwic2l6emxlXCIgKyAxICogbmV3IERhdGUoKSxcblx0cHJlZmVycmVkRG9jID0gd2luZG93LmRvY3VtZW50LFxuXHRkaXJydW5zID0gMCxcblx0ZG9uZSA9IDAsXG5cdGNsYXNzQ2FjaGUgPSBjcmVhdGVDYWNoZSgpLFxuXHR0b2tlbkNhY2hlID0gY3JlYXRlQ2FjaGUoKSxcblx0Y29tcGlsZXJDYWNoZSA9IGNyZWF0ZUNhY2hlKCksXG5cdHNvcnRPcmRlciA9IGZ1bmN0aW9uKCBhLCBiICkge1xuXHRcdGlmICggYSA9PT0gYiApIHtcblx0XHRcdGhhc0R1cGxpY2F0ZSA9IHRydWU7XG5cdFx0fVxuXHRcdHJldHVybiAwO1xuXHR9LFxuXG5cdC8vIEdlbmVyYWwtcHVycG9zZSBjb25zdGFudHNcblx0TUFYX05FR0FUSVZFID0gMSA8PCAzMSxcblxuXHQvLyBJbnN0YW5jZSBtZXRob2RzXG5cdGhhc093biA9ICh7fSkuaGFzT3duUHJvcGVydHksXG5cdGFyciA9IFtdLFxuXHRwb3AgPSBhcnIucG9wLFxuXHRwdXNoX25hdGl2ZSA9IGFyci5wdXNoLFxuXHRwdXNoID0gYXJyLnB1c2gsXG5cdHNsaWNlID0gYXJyLnNsaWNlLFxuXHQvLyBVc2UgYSBzdHJpcHBlZC1kb3duIGluZGV4T2YgYXMgaXQncyBmYXN0ZXIgdGhhbiBuYXRpdmVcblx0Ly8gaHR0cDovL2pzcGVyZi5jb20vdGhvci1pbmRleG9mLXZzLWZvci81XG5cdGluZGV4T2YgPSBmdW5jdGlvbiggbGlzdCwgZWxlbSApIHtcblx0XHR2YXIgaSA9IDAsXG5cdFx0XHRsZW4gPSBsaXN0Lmxlbmd0aDtcblx0XHRmb3IgKCA7IGkgPCBsZW47IGkrKyApIHtcblx0XHRcdGlmICggbGlzdFtpXSA9PT0gZWxlbSApIHtcblx0XHRcdFx0cmV0dXJuIGk7XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHJldHVybiAtMTtcblx0fSxcblxuXHRib29sZWFucyA9IFwiY2hlY2tlZHxzZWxlY3RlZHxhc3luY3xhdXRvZm9jdXN8YXV0b3BsYXl8Y29udHJvbHN8ZGVmZXJ8ZGlzYWJsZWR8aGlkZGVufGlzbWFwfGxvb3B8bXVsdGlwbGV8b3BlbnxyZWFkb25seXxyZXF1aXJlZHxzY29wZWRcIixcblxuXHQvLyBSZWd1bGFyIGV4cHJlc3Npb25zXG5cblx0Ly8gaHR0cDovL3d3dy53My5vcmcvVFIvY3NzMy1zZWxlY3RvcnMvI3doaXRlc3BhY2Vcblx0d2hpdGVzcGFjZSA9IFwiW1xcXFx4MjBcXFxcdFxcXFxyXFxcXG5cXFxcZl1cIixcblxuXHQvLyBodHRwOi8vd3d3LnczLm9yZy9UUi9DU1MyMS9zeW5kYXRhLmh0bWwjdmFsdWUtZGVmLWlkZW50aWZpZXJcblx0aWRlbnRpZmllciA9IFwiKD86XFxcXFxcXFwufFtcXFxcdy1dfFteXFxcXHgwMC1cXFxceGEwXSkrXCIsXG5cblx0Ly8gQXR0cmlidXRlIHNlbGVjdG9yczogaHR0cDovL3d3dy53My5vcmcvVFIvc2VsZWN0b3JzLyNhdHRyaWJ1dGUtc2VsZWN0b3JzXG5cdGF0dHJpYnV0ZXMgPSBcIlxcXFxbXCIgKyB3aGl0ZXNwYWNlICsgXCIqKFwiICsgaWRlbnRpZmllciArIFwiKSg/OlwiICsgd2hpdGVzcGFjZSArXG5cdFx0Ly8gT3BlcmF0b3IgKGNhcHR1cmUgMilcblx0XHRcIiooWypeJHwhfl0/PSlcIiArIHdoaXRlc3BhY2UgK1xuXHRcdC8vIFwiQXR0cmlidXRlIHZhbHVlcyBtdXN0IGJlIENTUyBpZGVudGlmaWVycyBbY2FwdHVyZSA1XSBvciBzdHJpbmdzIFtjYXB0dXJlIDMgb3IgY2FwdHVyZSA0XVwiXG5cdFx0XCIqKD86JygoPzpcXFxcXFxcXC58W15cXFxcXFxcXCddKSopJ3xcXFwiKCg/OlxcXFxcXFxcLnxbXlxcXFxcXFxcXFxcIl0pKilcXFwifChcIiArIGlkZW50aWZpZXIgKyBcIikpfClcIiArIHdoaXRlc3BhY2UgK1xuXHRcdFwiKlxcXFxdXCIsXG5cblx0cHNldWRvcyA9IFwiOihcIiArIGlkZW50aWZpZXIgKyBcIikoPzpcXFxcKChcIiArXG5cdFx0Ly8gVG8gcmVkdWNlIHRoZSBudW1iZXIgb2Ygc2VsZWN0b3JzIG5lZWRpbmcgdG9rZW5pemUgaW4gdGhlIHByZUZpbHRlciwgcHJlZmVyIGFyZ3VtZW50czpcblx0XHQvLyAxLiBxdW90ZWQgKGNhcHR1cmUgMzsgY2FwdHVyZSA0IG9yIGNhcHR1cmUgNSlcblx0XHRcIignKCg/OlxcXFxcXFxcLnxbXlxcXFxcXFxcJ10pKiknfFxcXCIoKD86XFxcXFxcXFwufFteXFxcXFxcXFxcXFwiXSkqKVxcXCIpfFwiICtcblx0XHQvLyAyLiBzaW1wbGUgKGNhcHR1cmUgNilcblx0XHRcIigoPzpcXFxcXFxcXC58W15cXFxcXFxcXCgpW1xcXFxdXXxcIiArIGF0dHJpYnV0ZXMgKyBcIikqKXxcIiArXG5cdFx0Ly8gMy4gYW55dGhpbmcgZWxzZSAoY2FwdHVyZSAyKVxuXHRcdFwiLipcIiArXG5cdFx0XCIpXFxcXCl8KVwiLFxuXG5cdC8vIExlYWRpbmcgYW5kIG5vbi1lc2NhcGVkIHRyYWlsaW5nIHdoaXRlc3BhY2UsIGNhcHR1cmluZyBzb21lIG5vbi13aGl0ZXNwYWNlIGNoYXJhY3RlcnMgcHJlY2VkaW5nIHRoZSBsYXR0ZXJcblx0cndoaXRlc3BhY2UgPSBuZXcgUmVnRXhwKCB3aGl0ZXNwYWNlICsgXCIrXCIsIFwiZ1wiICksXG5cdHJ0cmltID0gbmV3IFJlZ0V4cCggXCJeXCIgKyB3aGl0ZXNwYWNlICsgXCIrfCgoPzpefFteXFxcXFxcXFxdKSg/OlxcXFxcXFxcLikqKVwiICsgd2hpdGVzcGFjZSArIFwiKyRcIiwgXCJnXCIgKSxcblxuXHRyY29tbWEgPSBuZXcgUmVnRXhwKCBcIl5cIiArIHdoaXRlc3BhY2UgKyBcIiosXCIgKyB3aGl0ZXNwYWNlICsgXCIqXCIgKSxcblx0cmNvbWJpbmF0b3JzID0gbmV3IFJlZ0V4cCggXCJeXCIgKyB3aGl0ZXNwYWNlICsgXCIqKFs+K35dfFwiICsgd2hpdGVzcGFjZSArIFwiKVwiICsgd2hpdGVzcGFjZSArIFwiKlwiICksXG5cblx0cmF0dHJpYnV0ZVF1b3RlcyA9IG5ldyBSZWdFeHAoIFwiPVwiICsgd2hpdGVzcGFjZSArIFwiKihbXlxcXFxdJ1xcXCJdKj8pXCIgKyB3aGl0ZXNwYWNlICsgXCIqXFxcXF1cIiwgXCJnXCIgKSxcblxuXHRycHNldWRvID0gbmV3IFJlZ0V4cCggcHNldWRvcyApLFxuXHRyaWRlbnRpZmllciA9IG5ldyBSZWdFeHAoIFwiXlwiICsgaWRlbnRpZmllciArIFwiJFwiICksXG5cblx0bWF0Y2hFeHByID0ge1xuXHRcdFwiSURcIjogbmV3IFJlZ0V4cCggXCJeIyhcIiArIGlkZW50aWZpZXIgKyBcIilcIiApLFxuXHRcdFwiQ0xBU1NcIjogbmV3IFJlZ0V4cCggXCJeXFxcXC4oXCIgKyBpZGVudGlmaWVyICsgXCIpXCIgKSxcblx0XHRcIlRBR1wiOiBuZXcgUmVnRXhwKCBcIl4oXCIgKyBpZGVudGlmaWVyICsgXCJ8WypdKVwiICksXG5cdFx0XCJBVFRSXCI6IG5ldyBSZWdFeHAoIFwiXlwiICsgYXR0cmlidXRlcyApLFxuXHRcdFwiUFNFVURPXCI6IG5ldyBSZWdFeHAoIFwiXlwiICsgcHNldWRvcyApLFxuXHRcdFwiQ0hJTERcIjogbmV3IFJlZ0V4cCggXCJeOihvbmx5fGZpcnN0fGxhc3R8bnRofG50aC1sYXN0KS0oY2hpbGR8b2YtdHlwZSkoPzpcXFxcKFwiICsgd2hpdGVzcGFjZSArXG5cdFx0XHRcIiooZXZlbnxvZGR8KChbKy1dfCkoXFxcXGQqKW58KVwiICsgd2hpdGVzcGFjZSArIFwiKig/OihbKy1dfClcIiArIHdoaXRlc3BhY2UgK1xuXHRcdFx0XCIqKFxcXFxkKyl8KSlcIiArIHdoaXRlc3BhY2UgKyBcIipcXFxcKXwpXCIsIFwiaVwiICksXG5cdFx0XCJib29sXCI6IG5ldyBSZWdFeHAoIFwiXig/OlwiICsgYm9vbGVhbnMgKyBcIikkXCIsIFwiaVwiICksXG5cdFx0Ly8gRm9yIHVzZSBpbiBsaWJyYXJpZXMgaW1wbGVtZW50aW5nIC5pcygpXG5cdFx0Ly8gV2UgdXNlIHRoaXMgZm9yIFBPUyBtYXRjaGluZyBpbiBgc2VsZWN0YFxuXHRcdFwibmVlZHNDb250ZXh0XCI6IG5ldyBSZWdFeHAoIFwiXlwiICsgd2hpdGVzcGFjZSArIFwiKls+K35dfDooZXZlbnxvZGR8ZXF8Z3R8bHR8bnRofGZpcnN0fGxhc3QpKD86XFxcXChcIiArXG5cdFx0XHR3aGl0ZXNwYWNlICsgXCIqKCg/Oi1cXFxcZCk/XFxcXGQqKVwiICsgd2hpdGVzcGFjZSArIFwiKlxcXFwpfCkoPz1bXi1dfCQpXCIsIFwiaVwiIClcblx0fSxcblxuXHRyaW5wdXRzID0gL14oPzppbnB1dHxzZWxlY3R8dGV4dGFyZWF8YnV0dG9uKSQvaSxcblx0cmhlYWRlciA9IC9eaFxcZCQvaSxcblxuXHRybmF0aXZlID0gL15bXntdK1xce1xccypcXFtuYXRpdmUgXFx3LyxcblxuXHQvLyBFYXNpbHktcGFyc2VhYmxlL3JldHJpZXZhYmxlIElEIG9yIFRBRyBvciBDTEFTUyBzZWxlY3RvcnNcblx0cnF1aWNrRXhwciA9IC9eKD86IyhbXFx3LV0rKXwoXFx3Kyl8XFwuKFtcXHctXSspKSQvLFxuXG5cdHJzaWJsaW5nID0gL1srfl0vLFxuXHRyZXNjYXBlID0gLyd8XFxcXC9nLFxuXG5cdC8vIENTUyBlc2NhcGVzIGh0dHA6Ly93d3cudzMub3JnL1RSL0NTUzIxL3N5bmRhdGEuaHRtbCNlc2NhcGVkLWNoYXJhY3RlcnNcblx0cnVuZXNjYXBlID0gbmV3IFJlZ0V4cCggXCJcXFxcXFxcXChbXFxcXGRhLWZdezEsNn1cIiArIHdoaXRlc3BhY2UgKyBcIj98KFwiICsgd2hpdGVzcGFjZSArIFwiKXwuKVwiLCBcImlnXCIgKSxcblx0ZnVuZXNjYXBlID0gZnVuY3Rpb24oIF8sIGVzY2FwZWQsIGVzY2FwZWRXaGl0ZXNwYWNlICkge1xuXHRcdHZhciBoaWdoID0gXCIweFwiICsgZXNjYXBlZCAtIDB4MTAwMDA7XG5cdFx0Ly8gTmFOIG1lYW5zIG5vbi1jb2RlcG9pbnRcblx0XHQvLyBTdXBwb3J0OiBGaXJlZm94PDI0XG5cdFx0Ly8gV29ya2Fyb3VuZCBlcnJvbmVvdXMgbnVtZXJpYyBpbnRlcnByZXRhdGlvbiBvZiArXCIweFwiXG5cdFx0cmV0dXJuIGhpZ2ggIT09IGhpZ2ggfHwgZXNjYXBlZFdoaXRlc3BhY2UgP1xuXHRcdFx0ZXNjYXBlZCA6XG5cdFx0XHRoaWdoIDwgMCA/XG5cdFx0XHRcdC8vIEJNUCBjb2RlcG9pbnRcblx0XHRcdFx0U3RyaW5nLmZyb21DaGFyQ29kZSggaGlnaCArIDB4MTAwMDAgKSA6XG5cdFx0XHRcdC8vIFN1cHBsZW1lbnRhbCBQbGFuZSBjb2RlcG9pbnQgKHN1cnJvZ2F0ZSBwYWlyKVxuXHRcdFx0XHRTdHJpbmcuZnJvbUNoYXJDb2RlKCBoaWdoID4+IDEwIHwgMHhEODAwLCBoaWdoICYgMHgzRkYgfCAweERDMDAgKTtcblx0fSxcblxuXHQvLyBVc2VkIGZvciBpZnJhbWVzXG5cdC8vIFNlZSBzZXREb2N1bWVudCgpXG5cdC8vIFJlbW92aW5nIHRoZSBmdW5jdGlvbiB3cmFwcGVyIGNhdXNlcyBhIFwiUGVybWlzc2lvbiBEZW5pZWRcIlxuXHQvLyBlcnJvciBpbiBJRVxuXHR1bmxvYWRIYW5kbGVyID0gZnVuY3Rpb24oKSB7XG5cdFx0c2V0RG9jdW1lbnQoKTtcblx0fTtcblxuLy8gT3B0aW1pemUgZm9yIHB1c2guYXBwbHkoIF8sIE5vZGVMaXN0IClcbnRyeSB7XG5cdHB1c2guYXBwbHkoXG5cdFx0KGFyciA9IHNsaWNlLmNhbGwoIHByZWZlcnJlZERvYy5jaGlsZE5vZGVzICkpLFxuXHRcdHByZWZlcnJlZERvYy5jaGlsZE5vZGVzXG5cdCk7XG5cdC8vIFN1cHBvcnQ6IEFuZHJvaWQ8NC4wXG5cdC8vIERldGVjdCBzaWxlbnRseSBmYWlsaW5nIHB1c2guYXBwbHlcblx0YXJyWyBwcmVmZXJyZWREb2MuY2hpbGROb2Rlcy5sZW5ndGggXS5ub2RlVHlwZTtcbn0gY2F0Y2ggKCBlICkge1xuXHRwdXNoID0geyBhcHBseTogYXJyLmxlbmd0aCA/XG5cblx0XHQvLyBMZXZlcmFnZSBzbGljZSBpZiBwb3NzaWJsZVxuXHRcdGZ1bmN0aW9uKCB0YXJnZXQsIGVscyApIHtcblx0XHRcdHB1c2hfbmF0aXZlLmFwcGx5KCB0YXJnZXQsIHNsaWNlLmNhbGwoZWxzKSApO1xuXHRcdH0gOlxuXG5cdFx0Ly8gU3VwcG9ydDogSUU8OVxuXHRcdC8vIE90aGVyd2lzZSBhcHBlbmQgZGlyZWN0bHlcblx0XHRmdW5jdGlvbiggdGFyZ2V0LCBlbHMgKSB7XG5cdFx0XHR2YXIgaiA9IHRhcmdldC5sZW5ndGgsXG5cdFx0XHRcdGkgPSAwO1xuXHRcdFx0Ly8gQ2FuJ3QgdHJ1c3QgTm9kZUxpc3QubGVuZ3RoXG5cdFx0XHR3aGlsZSAoICh0YXJnZXRbaisrXSA9IGVsc1tpKytdKSApIHt9XG5cdFx0XHR0YXJnZXQubGVuZ3RoID0gaiAtIDE7XG5cdFx0fVxuXHR9O1xufVxuXG5mdW5jdGlvbiBTaXp6bGUoIHNlbGVjdG9yLCBjb250ZXh0LCByZXN1bHRzLCBzZWVkICkge1xuXHR2YXIgbSwgaSwgZWxlbSwgbmlkLCBuaWRzZWxlY3QsIG1hdGNoLCBncm91cHMsIG5ld1NlbGVjdG9yLFxuXHRcdG5ld0NvbnRleHQgPSBjb250ZXh0ICYmIGNvbnRleHQub3duZXJEb2N1bWVudCxcblxuXHRcdC8vIG5vZGVUeXBlIGRlZmF1bHRzIHRvIDksIHNpbmNlIGNvbnRleHQgZGVmYXVsdHMgdG8gZG9jdW1lbnRcblx0XHRub2RlVHlwZSA9IGNvbnRleHQgPyBjb250ZXh0Lm5vZGVUeXBlIDogOTtcblxuXHRyZXN1bHRzID0gcmVzdWx0cyB8fCBbXTtcblxuXHQvLyBSZXR1cm4gZWFybHkgZnJvbSBjYWxscyB3aXRoIGludmFsaWQgc2VsZWN0b3Igb3IgY29udGV4dFxuXHRpZiAoIHR5cGVvZiBzZWxlY3RvciAhPT0gXCJzdHJpbmdcIiB8fCAhc2VsZWN0b3IgfHxcblx0XHRub2RlVHlwZSAhPT0gMSAmJiBub2RlVHlwZSAhPT0gOSAmJiBub2RlVHlwZSAhPT0gMTEgKSB7XG5cblx0XHRyZXR1cm4gcmVzdWx0cztcblx0fVxuXG5cdC8vIFRyeSB0byBzaG9ydGN1dCBmaW5kIG9wZXJhdGlvbnMgKGFzIG9wcG9zZWQgdG8gZmlsdGVycykgaW4gSFRNTCBkb2N1bWVudHNcblx0aWYgKCAhc2VlZCApIHtcblxuXHRcdGlmICggKCBjb250ZXh0ID8gY29udGV4dC5vd25lckRvY3VtZW50IHx8IGNvbnRleHQgOiBwcmVmZXJyZWREb2MgKSAhPT0gZG9jdW1lbnQgKSB7XG5cdFx0XHRzZXREb2N1bWVudCggY29udGV4dCApO1xuXHRcdH1cblx0XHRjb250ZXh0ID0gY29udGV4dCB8fCBkb2N1bWVudDtcblxuXHRcdGlmICggZG9jdW1lbnRJc0hUTUwgKSB7XG5cblx0XHRcdC8vIElmIHRoZSBzZWxlY3RvciBpcyBzdWZmaWNpZW50bHkgc2ltcGxlLCB0cnkgdXNpbmcgYSBcImdldCpCeSpcIiBET00gbWV0aG9kXG5cdFx0XHQvLyAoZXhjZXB0aW5nIERvY3VtZW50RnJhZ21lbnQgY29udGV4dCwgd2hlcmUgdGhlIG1ldGhvZHMgZG9uJ3QgZXhpc3QpXG5cdFx0XHRpZiAoIG5vZGVUeXBlICE9PSAxMSAmJiAobWF0Y2ggPSBycXVpY2tFeHByLmV4ZWMoIHNlbGVjdG9yICkpICkge1xuXG5cdFx0XHRcdC8vIElEIHNlbGVjdG9yXG5cdFx0XHRcdGlmICggKG0gPSBtYXRjaFsxXSkgKSB7XG5cblx0XHRcdFx0XHQvLyBEb2N1bWVudCBjb250ZXh0XG5cdFx0XHRcdFx0aWYgKCBub2RlVHlwZSA9PT0gOSApIHtcblx0XHRcdFx0XHRcdGlmICggKGVsZW0gPSBjb250ZXh0LmdldEVsZW1lbnRCeUlkKCBtICkpICkge1xuXG5cdFx0XHRcdFx0XHRcdC8vIFN1cHBvcnQ6IElFLCBPcGVyYSwgV2Via2l0XG5cdFx0XHRcdFx0XHRcdC8vIFRPRE86IGlkZW50aWZ5IHZlcnNpb25zXG5cdFx0XHRcdFx0XHRcdC8vIGdldEVsZW1lbnRCeUlkIGNhbiBtYXRjaCBlbGVtZW50cyBieSBuYW1lIGluc3RlYWQgb2YgSURcblx0XHRcdFx0XHRcdFx0aWYgKCBlbGVtLmlkID09PSBtICkge1xuXHRcdFx0XHRcdFx0XHRcdHJlc3VsdHMucHVzaCggZWxlbSApO1xuXHRcdFx0XHRcdFx0XHRcdHJldHVybiByZXN1bHRzO1xuXHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRyZXR1cm4gcmVzdWx0cztcblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdC8vIEVsZW1lbnQgY29udGV4dFxuXHRcdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHRcdC8vIFN1cHBvcnQ6IElFLCBPcGVyYSwgV2Via2l0XG5cdFx0XHRcdFx0XHQvLyBUT0RPOiBpZGVudGlmeSB2ZXJzaW9uc1xuXHRcdFx0XHRcdFx0Ly8gZ2V0RWxlbWVudEJ5SWQgY2FuIG1hdGNoIGVsZW1lbnRzIGJ5IG5hbWUgaW5zdGVhZCBvZiBJRFxuXHRcdFx0XHRcdFx0aWYgKCBuZXdDb250ZXh0ICYmIChlbGVtID0gbmV3Q29udGV4dC5nZXRFbGVtZW50QnlJZCggbSApKSAmJlxuXHRcdFx0XHRcdFx0XHRjb250YWlucyggY29udGV4dCwgZWxlbSApICYmXG5cdFx0XHRcdFx0XHRcdGVsZW0uaWQgPT09IG0gKSB7XG5cblx0XHRcdFx0XHRcdFx0cmVzdWx0cy5wdXNoKCBlbGVtICk7XG5cdFx0XHRcdFx0XHRcdHJldHVybiByZXN1bHRzO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBUeXBlIHNlbGVjdG9yXG5cdFx0XHRcdH0gZWxzZSBpZiAoIG1hdGNoWzJdICkge1xuXHRcdFx0XHRcdHB1c2guYXBwbHkoIHJlc3VsdHMsIGNvbnRleHQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIHNlbGVjdG9yICkgKTtcblx0XHRcdFx0XHRyZXR1cm4gcmVzdWx0cztcblxuXHRcdFx0XHQvLyBDbGFzcyBzZWxlY3RvclxuXHRcdFx0XHR9IGVsc2UgaWYgKCAobSA9IG1hdGNoWzNdKSAmJiBzdXBwb3J0LmdldEVsZW1lbnRzQnlDbGFzc05hbWUgJiZcblx0XHRcdFx0XHRjb250ZXh0LmdldEVsZW1lbnRzQnlDbGFzc05hbWUgKSB7XG5cblx0XHRcdFx0XHRwdXNoLmFwcGx5KCByZXN1bHRzLCBjb250ZXh0LmdldEVsZW1lbnRzQnlDbGFzc05hbWUoIG0gKSApO1xuXHRcdFx0XHRcdHJldHVybiByZXN1bHRzO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdC8vIFRha2UgYWR2YW50YWdlIG9mIHF1ZXJ5U2VsZWN0b3JBbGxcblx0XHRcdGlmICggc3VwcG9ydC5xc2EgJiZcblx0XHRcdFx0IWNvbXBpbGVyQ2FjaGVbIHNlbGVjdG9yICsgXCIgXCIgXSAmJlxuXHRcdFx0XHQoIXJidWdneVFTQSB8fCAhcmJ1Z2d5UVNBLnRlc3QoIHNlbGVjdG9yICkpICkge1xuXG5cdFx0XHRcdGlmICggbm9kZVR5cGUgIT09IDEgKSB7XG5cdFx0XHRcdFx0bmV3Q29udGV4dCA9IGNvbnRleHQ7XG5cdFx0XHRcdFx0bmV3U2VsZWN0b3IgPSBzZWxlY3RvcjtcblxuXHRcdFx0XHQvLyBxU0EgbG9va3Mgb3V0c2lkZSBFbGVtZW50IGNvbnRleHQsIHdoaWNoIGlzIG5vdCB3aGF0IHdlIHdhbnRcblx0XHRcdFx0Ly8gVGhhbmtzIHRvIEFuZHJldyBEdXBvbnQgZm9yIHRoaXMgd29ya2Fyb3VuZCB0ZWNobmlxdWVcblx0XHRcdFx0Ly8gU3VwcG9ydDogSUUgPD04XG5cdFx0XHRcdC8vIEV4Y2x1ZGUgb2JqZWN0IGVsZW1lbnRzXG5cdFx0XHRcdH0gZWxzZSBpZiAoIGNvbnRleHQubm9kZU5hbWUudG9Mb3dlckNhc2UoKSAhPT0gXCJvYmplY3RcIiApIHtcblxuXHRcdFx0XHRcdC8vIENhcHR1cmUgdGhlIGNvbnRleHQgSUQsIHNldHRpbmcgaXQgZmlyc3QgaWYgbmVjZXNzYXJ5XG5cdFx0XHRcdFx0aWYgKCAobmlkID0gY29udGV4dC5nZXRBdHRyaWJ1dGUoIFwiaWRcIiApKSApIHtcblx0XHRcdFx0XHRcdG5pZCA9IG5pZC5yZXBsYWNlKCByZXNjYXBlLCBcIlxcXFwkJlwiICk7XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdGNvbnRleHQuc2V0QXR0cmlidXRlKCBcImlkXCIsIChuaWQgPSBleHBhbmRvKSApO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdC8vIFByZWZpeCBldmVyeSBzZWxlY3RvciBpbiB0aGUgbGlzdFxuXHRcdFx0XHRcdGdyb3VwcyA9IHRva2VuaXplKCBzZWxlY3RvciApO1xuXHRcdFx0XHRcdGkgPSBncm91cHMubGVuZ3RoO1xuXHRcdFx0XHRcdG5pZHNlbGVjdCA9IHJpZGVudGlmaWVyLnRlc3QoIG5pZCApID8gXCIjXCIgKyBuaWQgOiBcIltpZD0nXCIgKyBuaWQgKyBcIiddXCI7XG5cdFx0XHRcdFx0d2hpbGUgKCBpLS0gKSB7XG5cdFx0XHRcdFx0XHRncm91cHNbaV0gPSBuaWRzZWxlY3QgKyBcIiBcIiArIHRvU2VsZWN0b3IoIGdyb3Vwc1tpXSApO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRuZXdTZWxlY3RvciA9IGdyb3Vwcy5qb2luKCBcIixcIiApO1xuXG5cdFx0XHRcdFx0Ly8gRXhwYW5kIGNvbnRleHQgZm9yIHNpYmxpbmcgc2VsZWN0b3JzXG5cdFx0XHRcdFx0bmV3Q29udGV4dCA9IHJzaWJsaW5nLnRlc3QoIHNlbGVjdG9yICkgJiYgdGVzdENvbnRleHQoIGNvbnRleHQucGFyZW50Tm9kZSApIHx8XG5cdFx0XHRcdFx0XHRjb250ZXh0O1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKCBuZXdTZWxlY3RvciApIHtcblx0XHRcdFx0XHR0cnkge1xuXHRcdFx0XHRcdFx0cHVzaC5hcHBseSggcmVzdWx0cyxcblx0XHRcdFx0XHRcdFx0bmV3Q29udGV4dC5xdWVyeVNlbGVjdG9yQWxsKCBuZXdTZWxlY3RvciApXG5cdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdFx0cmV0dXJuIHJlc3VsdHM7XG5cdFx0XHRcdFx0fSBjYXRjaCAoIHFzYUVycm9yICkge1xuXHRcdFx0XHRcdH0gZmluYWxseSB7XG5cdFx0XHRcdFx0XHRpZiAoIG5pZCA9PT0gZXhwYW5kbyApIHtcblx0XHRcdFx0XHRcdFx0Y29udGV4dC5yZW1vdmVBdHRyaWJ1dGUoIFwiaWRcIiApO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdC8vIEFsbCBvdGhlcnNcblx0cmV0dXJuIHNlbGVjdCggc2VsZWN0b3IucmVwbGFjZSggcnRyaW0sIFwiJDFcIiApLCBjb250ZXh0LCByZXN1bHRzLCBzZWVkICk7XG59XG5cbi8qKlxuICogQ3JlYXRlIGtleS12YWx1ZSBjYWNoZXMgb2YgbGltaXRlZCBzaXplXG4gKiBAcmV0dXJucyB7ZnVuY3Rpb24oc3RyaW5nLCBvYmplY3QpfSBSZXR1cm5zIHRoZSBPYmplY3QgZGF0YSBhZnRlciBzdG9yaW5nIGl0IG9uIGl0c2VsZiB3aXRoXG4gKlx0cHJvcGVydHkgbmFtZSB0aGUgKHNwYWNlLXN1ZmZpeGVkKSBzdHJpbmcgYW5kIChpZiB0aGUgY2FjaGUgaXMgbGFyZ2VyIHRoYW4gRXhwci5jYWNoZUxlbmd0aClcbiAqXHRkZWxldGluZyB0aGUgb2xkZXN0IGVudHJ5XG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZUNhY2hlKCkge1xuXHR2YXIga2V5cyA9IFtdO1xuXG5cdGZ1bmN0aW9uIGNhY2hlKCBrZXksIHZhbHVlICkge1xuXHRcdC8vIFVzZSAoa2V5ICsgXCIgXCIpIHRvIGF2b2lkIGNvbGxpc2lvbiB3aXRoIG5hdGl2ZSBwcm90b3R5cGUgcHJvcGVydGllcyAoc2VlIElzc3VlICMxNTcpXG5cdFx0aWYgKCBrZXlzLnB1c2goIGtleSArIFwiIFwiICkgPiBFeHByLmNhY2hlTGVuZ3RoICkge1xuXHRcdFx0Ly8gT25seSBrZWVwIHRoZSBtb3N0IHJlY2VudCBlbnRyaWVzXG5cdFx0XHRkZWxldGUgY2FjaGVbIGtleXMuc2hpZnQoKSBdO1xuXHRcdH1cblx0XHRyZXR1cm4gKGNhY2hlWyBrZXkgKyBcIiBcIiBdID0gdmFsdWUpO1xuXHR9XG5cdHJldHVybiBjYWNoZTtcbn1cblxuLyoqXG4gKiBNYXJrIGEgZnVuY3Rpb24gZm9yIHNwZWNpYWwgdXNlIGJ5IFNpenpsZVxuICogQHBhcmFtIHtGdW5jdGlvbn0gZm4gVGhlIGZ1bmN0aW9uIHRvIG1hcmtcbiAqL1xuZnVuY3Rpb24gbWFya0Z1bmN0aW9uKCBmbiApIHtcblx0Zm5bIGV4cGFuZG8gXSA9IHRydWU7XG5cdHJldHVybiBmbjtcbn1cblxuLyoqXG4gKiBTdXBwb3J0IHRlc3RpbmcgdXNpbmcgYW4gZWxlbWVudFxuICogQHBhcmFtIHtGdW5jdGlvbn0gZm4gUGFzc2VkIHRoZSBjcmVhdGVkIGRpdiBhbmQgZXhwZWN0cyBhIGJvb2xlYW4gcmVzdWx0XG4gKi9cbmZ1bmN0aW9uIGFzc2VydCggZm4gKSB7XG5cdHZhciBkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KFwiZGl2XCIpO1xuXG5cdHRyeSB7XG5cdFx0cmV0dXJuICEhZm4oIGRpdiApO1xuXHR9IGNhdGNoIChlKSB7XG5cdFx0cmV0dXJuIGZhbHNlO1xuXHR9IGZpbmFsbHkge1xuXHRcdC8vIFJlbW92ZSBmcm9tIGl0cyBwYXJlbnQgYnkgZGVmYXVsdFxuXHRcdGlmICggZGl2LnBhcmVudE5vZGUgKSB7XG5cdFx0XHRkaXYucGFyZW50Tm9kZS5yZW1vdmVDaGlsZCggZGl2ICk7XG5cdFx0fVxuXHRcdC8vIHJlbGVhc2UgbWVtb3J5IGluIElFXG5cdFx0ZGl2ID0gbnVsbDtcblx0fVxufVxuXG4vKipcbiAqIEFkZHMgdGhlIHNhbWUgaGFuZGxlciBmb3IgYWxsIG9mIHRoZSBzcGVjaWZpZWQgYXR0cnNcbiAqIEBwYXJhbSB7U3RyaW5nfSBhdHRycyBQaXBlLXNlcGFyYXRlZCBsaXN0IG9mIGF0dHJpYnV0ZXNcbiAqIEBwYXJhbSB7RnVuY3Rpb259IGhhbmRsZXIgVGhlIG1ldGhvZCB0aGF0IHdpbGwgYmUgYXBwbGllZFxuICovXG5mdW5jdGlvbiBhZGRIYW5kbGUoIGF0dHJzLCBoYW5kbGVyICkge1xuXHR2YXIgYXJyID0gYXR0cnMuc3BsaXQoXCJ8XCIpLFxuXHRcdGkgPSBhcnIubGVuZ3RoO1xuXG5cdHdoaWxlICggaS0tICkge1xuXHRcdEV4cHIuYXR0ckhhbmRsZVsgYXJyW2ldIF0gPSBoYW5kbGVyO1xuXHR9XG59XG5cbi8qKlxuICogQ2hlY2tzIGRvY3VtZW50IG9yZGVyIG9mIHR3byBzaWJsaW5nc1xuICogQHBhcmFtIHtFbGVtZW50fSBhXG4gKiBAcGFyYW0ge0VsZW1lbnR9IGJcbiAqIEByZXR1cm5zIHtOdW1iZXJ9IFJldHVybnMgbGVzcyB0aGFuIDAgaWYgYSBwcmVjZWRlcyBiLCBncmVhdGVyIHRoYW4gMCBpZiBhIGZvbGxvd3MgYlxuICovXG5mdW5jdGlvbiBzaWJsaW5nQ2hlY2soIGEsIGIgKSB7XG5cdHZhciBjdXIgPSBiICYmIGEsXG5cdFx0ZGlmZiA9IGN1ciAmJiBhLm5vZGVUeXBlID09PSAxICYmIGIubm9kZVR5cGUgPT09IDEgJiZcblx0XHRcdCggfmIuc291cmNlSW5kZXggfHwgTUFYX05FR0FUSVZFICkgLVxuXHRcdFx0KCB+YS5zb3VyY2VJbmRleCB8fCBNQVhfTkVHQVRJVkUgKTtcblxuXHQvLyBVc2UgSUUgc291cmNlSW5kZXggaWYgYXZhaWxhYmxlIG9uIGJvdGggbm9kZXNcblx0aWYgKCBkaWZmICkge1xuXHRcdHJldHVybiBkaWZmO1xuXHR9XG5cblx0Ly8gQ2hlY2sgaWYgYiBmb2xsb3dzIGFcblx0aWYgKCBjdXIgKSB7XG5cdFx0d2hpbGUgKCAoY3VyID0gY3VyLm5leHRTaWJsaW5nKSApIHtcblx0XHRcdGlmICggY3VyID09PSBiICkge1xuXHRcdFx0XHRyZXR1cm4gLTE7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0cmV0dXJuIGEgPyAxIDogLTE7XG59XG5cbi8qKlxuICogUmV0dXJucyBhIGZ1bmN0aW9uIHRvIHVzZSBpbiBwc2V1ZG9zIGZvciBpbnB1dCB0eXBlc1xuICogQHBhcmFtIHtTdHJpbmd9IHR5cGVcbiAqL1xuZnVuY3Rpb24gY3JlYXRlSW5wdXRQc2V1ZG8oIHR5cGUgKSB7XG5cdHJldHVybiBmdW5jdGlvbiggZWxlbSApIHtcblx0XHR2YXIgbmFtZSA9IGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtcblx0XHRyZXR1cm4gbmFtZSA9PT0gXCJpbnB1dFwiICYmIGVsZW0udHlwZSA9PT0gdHlwZTtcblx0fTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIGEgZnVuY3Rpb24gdG8gdXNlIGluIHBzZXVkb3MgZm9yIGJ1dHRvbnNcbiAqIEBwYXJhbSB7U3RyaW5nfSB0eXBlXG4gKi9cbmZ1bmN0aW9uIGNyZWF0ZUJ1dHRvblBzZXVkbyggdHlwZSApIHtcblx0cmV0dXJuIGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdHZhciBuYW1lID0gZWxlbS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO1xuXHRcdHJldHVybiAobmFtZSA9PT0gXCJpbnB1dFwiIHx8IG5hbWUgPT09IFwiYnV0dG9uXCIpICYmIGVsZW0udHlwZSA9PT0gdHlwZTtcblx0fTtcbn1cblxuLyoqXG4gKiBSZXR1cm5zIGEgZnVuY3Rpb24gdG8gdXNlIGluIHBzZXVkb3MgZm9yIHBvc2l0aW9uYWxzXG4gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmblxuICovXG5mdW5jdGlvbiBjcmVhdGVQb3NpdGlvbmFsUHNldWRvKCBmbiApIHtcblx0cmV0dXJuIG1hcmtGdW5jdGlvbihmdW5jdGlvbiggYXJndW1lbnQgKSB7XG5cdFx0YXJndW1lbnQgPSArYXJndW1lbnQ7XG5cdFx0cmV0dXJuIG1hcmtGdW5jdGlvbihmdW5jdGlvbiggc2VlZCwgbWF0Y2hlcyApIHtcblx0XHRcdHZhciBqLFxuXHRcdFx0XHRtYXRjaEluZGV4ZXMgPSBmbiggW10sIHNlZWQubGVuZ3RoLCBhcmd1bWVudCApLFxuXHRcdFx0XHRpID0gbWF0Y2hJbmRleGVzLmxlbmd0aDtcblxuXHRcdFx0Ly8gTWF0Y2ggZWxlbWVudHMgZm91bmQgYXQgdGhlIHNwZWNpZmllZCBpbmRleGVzXG5cdFx0XHR3aGlsZSAoIGktLSApIHtcblx0XHRcdFx0aWYgKCBzZWVkWyAoaiA9IG1hdGNoSW5kZXhlc1tpXSkgXSApIHtcblx0XHRcdFx0XHRzZWVkW2pdID0gIShtYXRjaGVzW2pdID0gc2VlZFtqXSk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9KTtcblx0fSk7XG59XG5cbi8qKlxuICogQ2hlY2tzIGEgbm9kZSBmb3IgdmFsaWRpdHkgYXMgYSBTaXp6bGUgY29udGV4dFxuICogQHBhcmFtIHtFbGVtZW50fE9iamVjdD19IGNvbnRleHRcbiAqIEByZXR1cm5zIHtFbGVtZW50fE9iamVjdHxCb29sZWFufSBUaGUgaW5wdXQgbm9kZSBpZiBhY2NlcHRhYmxlLCBvdGhlcndpc2UgYSBmYWxzeSB2YWx1ZVxuICovXG5mdW5jdGlvbiB0ZXN0Q29udGV4dCggY29udGV4dCApIHtcblx0cmV0dXJuIGNvbnRleHQgJiYgdHlwZW9mIGNvbnRleHQuZ2V0RWxlbWVudHNCeVRhZ05hbWUgIT09IFwidW5kZWZpbmVkXCIgJiYgY29udGV4dDtcbn1cblxuLy8gRXhwb3NlIHN1cHBvcnQgdmFycyBmb3IgY29udmVuaWVuY2VcbnN1cHBvcnQgPSBTaXp6bGUuc3VwcG9ydCA9IHt9O1xuXG4vKipcbiAqIERldGVjdHMgWE1MIG5vZGVzXG4gKiBAcGFyYW0ge0VsZW1lbnR8T2JqZWN0fSBlbGVtIEFuIGVsZW1lbnQgb3IgYSBkb2N1bWVudFxuICogQHJldHVybnMge0Jvb2xlYW59IFRydWUgaWZmIGVsZW0gaXMgYSBub24tSFRNTCBYTUwgbm9kZVxuICovXG5pc1hNTCA9IFNpenpsZS5pc1hNTCA9IGZ1bmN0aW9uKCBlbGVtICkge1xuXHQvLyBkb2N1bWVudEVsZW1lbnQgaXMgdmVyaWZpZWQgZm9yIGNhc2VzIHdoZXJlIGl0IGRvZXNuJ3QgeWV0IGV4aXN0XG5cdC8vIChzdWNoIGFzIGxvYWRpbmcgaWZyYW1lcyBpbiBJRSAtICM0ODMzKVxuXHR2YXIgZG9jdW1lbnRFbGVtZW50ID0gZWxlbSAmJiAoZWxlbS5vd25lckRvY3VtZW50IHx8IGVsZW0pLmRvY3VtZW50RWxlbWVudDtcblx0cmV0dXJuIGRvY3VtZW50RWxlbWVudCA/IGRvY3VtZW50RWxlbWVudC5ub2RlTmFtZSAhPT0gXCJIVE1MXCIgOiBmYWxzZTtcbn07XG5cbi8qKlxuICogU2V0cyBkb2N1bWVudC1yZWxhdGVkIHZhcmlhYmxlcyBvbmNlIGJhc2VkIG9uIHRoZSBjdXJyZW50IGRvY3VtZW50XG4gKiBAcGFyYW0ge0VsZW1lbnR8T2JqZWN0fSBbZG9jXSBBbiBlbGVtZW50IG9yIGRvY3VtZW50IG9iamVjdCB0byB1c2UgdG8gc2V0IHRoZSBkb2N1bWVudFxuICogQHJldHVybnMge09iamVjdH0gUmV0dXJucyB0aGUgY3VycmVudCBkb2N1bWVudFxuICovXG5zZXREb2N1bWVudCA9IFNpenpsZS5zZXREb2N1bWVudCA9IGZ1bmN0aW9uKCBub2RlICkge1xuXHR2YXIgaGFzQ29tcGFyZSwgcGFyZW50LFxuXHRcdGRvYyA9IG5vZGUgPyBub2RlLm93bmVyRG9jdW1lbnQgfHwgbm9kZSA6IHByZWZlcnJlZERvYztcblxuXHQvLyBSZXR1cm4gZWFybHkgaWYgZG9jIGlzIGludmFsaWQgb3IgYWxyZWFkeSBzZWxlY3RlZFxuXHRpZiAoIGRvYyA9PT0gZG9jdW1lbnQgfHwgZG9jLm5vZGVUeXBlICE9PSA5IHx8ICFkb2MuZG9jdW1lbnRFbGVtZW50ICkge1xuXHRcdHJldHVybiBkb2N1bWVudDtcblx0fVxuXG5cdC8vIFVwZGF0ZSBnbG9iYWwgdmFyaWFibGVzXG5cdGRvY3VtZW50ID0gZG9jO1xuXHRkb2NFbGVtID0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50O1xuXHRkb2N1bWVudElzSFRNTCA9ICFpc1hNTCggZG9jdW1lbnQgKTtcblxuXHQvLyBTdXBwb3J0OiBJRSA5LTExLCBFZGdlXG5cdC8vIEFjY2Vzc2luZyBpZnJhbWUgZG9jdW1lbnRzIGFmdGVyIHVubG9hZCB0aHJvd3MgXCJwZXJtaXNzaW9uIGRlbmllZFwiIGVycm9ycyAoalF1ZXJ5ICMxMzkzNilcblx0aWYgKCAocGFyZW50ID0gZG9jdW1lbnQuZGVmYXVsdFZpZXcpICYmIHBhcmVudC50b3AgIT09IHBhcmVudCApIHtcblx0XHQvLyBTdXBwb3J0OiBJRSAxMVxuXHRcdGlmICggcGFyZW50LmFkZEV2ZW50TGlzdGVuZXIgKSB7XG5cdFx0XHRwYXJlbnQuYWRkRXZlbnRMaXN0ZW5lciggXCJ1bmxvYWRcIiwgdW5sb2FkSGFuZGxlciwgZmFsc2UgKTtcblxuXHRcdC8vIFN1cHBvcnQ6IElFIDkgLSAxMCBvbmx5XG5cdFx0fSBlbHNlIGlmICggcGFyZW50LmF0dGFjaEV2ZW50ICkge1xuXHRcdFx0cGFyZW50LmF0dGFjaEV2ZW50KCBcIm9udW5sb2FkXCIsIHVubG9hZEhhbmRsZXIgKTtcblx0XHR9XG5cdH1cblxuXHQvKiBBdHRyaWJ1dGVzXG5cdC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cblxuXHQvLyBTdXBwb3J0OiBJRTw4XG5cdC8vIFZlcmlmeSB0aGF0IGdldEF0dHJpYnV0ZSByZWFsbHkgcmV0dXJucyBhdHRyaWJ1dGVzIGFuZCBub3QgcHJvcGVydGllc1xuXHQvLyAoZXhjZXB0aW5nIElFOCBib29sZWFucylcblx0c3VwcG9ydC5hdHRyaWJ1dGVzID0gYXNzZXJ0KGZ1bmN0aW9uKCBkaXYgKSB7XG5cdFx0ZGl2LmNsYXNzTmFtZSA9IFwiaVwiO1xuXHRcdHJldHVybiAhZGl2LmdldEF0dHJpYnV0ZShcImNsYXNzTmFtZVwiKTtcblx0fSk7XG5cblx0LyogZ2V0RWxlbWVudChzKUJ5KlxuXHQtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovXG5cblx0Ly8gQ2hlY2sgaWYgZ2V0RWxlbWVudHNCeVRhZ05hbWUoXCIqXCIpIHJldHVybnMgb25seSBlbGVtZW50c1xuXHRzdXBwb3J0LmdldEVsZW1lbnRzQnlUYWdOYW1lID0gYXNzZXJ0KGZ1bmN0aW9uKCBkaXYgKSB7XG5cdFx0ZGl2LmFwcGVuZENoaWxkKCBkb2N1bWVudC5jcmVhdGVDb21tZW50KFwiXCIpICk7XG5cdFx0cmV0dXJuICFkaXYuZ2V0RWxlbWVudHNCeVRhZ05hbWUoXCIqXCIpLmxlbmd0aDtcblx0fSk7XG5cblx0Ly8gU3VwcG9ydDogSUU8OVxuXHRzdXBwb3J0LmdldEVsZW1lbnRzQnlDbGFzc05hbWUgPSBybmF0aXZlLnRlc3QoIGRvY3VtZW50LmdldEVsZW1lbnRzQnlDbGFzc05hbWUgKTtcblxuXHQvLyBTdXBwb3J0OiBJRTwxMFxuXHQvLyBDaGVjayBpZiBnZXRFbGVtZW50QnlJZCByZXR1cm5zIGVsZW1lbnRzIGJ5IG5hbWVcblx0Ly8gVGhlIGJyb2tlbiBnZXRFbGVtZW50QnlJZCBtZXRob2RzIGRvbid0IHBpY2sgdXAgcHJvZ3JhbWF0aWNhbGx5LXNldCBuYW1lcyxcblx0Ly8gc28gdXNlIGEgcm91bmRhYm91dCBnZXRFbGVtZW50c0J5TmFtZSB0ZXN0XG5cdHN1cHBvcnQuZ2V0QnlJZCA9IGFzc2VydChmdW5jdGlvbiggZGl2ICkge1xuXHRcdGRvY0VsZW0uYXBwZW5kQ2hpbGQoIGRpdiApLmlkID0gZXhwYW5kbztcblx0XHRyZXR1cm4gIWRvY3VtZW50LmdldEVsZW1lbnRzQnlOYW1lIHx8ICFkb2N1bWVudC5nZXRFbGVtZW50c0J5TmFtZSggZXhwYW5kbyApLmxlbmd0aDtcblx0fSk7XG5cblx0Ly8gSUQgZmluZCBhbmQgZmlsdGVyXG5cdGlmICggc3VwcG9ydC5nZXRCeUlkICkge1xuXHRcdEV4cHIuZmluZFtcIklEXCJdID0gZnVuY3Rpb24oIGlkLCBjb250ZXh0ICkge1xuXHRcdFx0aWYgKCB0eXBlb2YgY29udGV4dC5nZXRFbGVtZW50QnlJZCAhPT0gXCJ1bmRlZmluZWRcIiAmJiBkb2N1bWVudElzSFRNTCApIHtcblx0XHRcdFx0dmFyIG0gPSBjb250ZXh0LmdldEVsZW1lbnRCeUlkKCBpZCApO1xuXHRcdFx0XHRyZXR1cm4gbSA/IFsgbSBdIDogW107XG5cdFx0XHR9XG5cdFx0fTtcblx0XHRFeHByLmZpbHRlcltcIklEXCJdID0gZnVuY3Rpb24oIGlkICkge1xuXHRcdFx0dmFyIGF0dHJJZCA9IGlkLnJlcGxhY2UoIHJ1bmVzY2FwZSwgZnVuZXNjYXBlICk7XG5cdFx0XHRyZXR1cm4gZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHRcdHJldHVybiBlbGVtLmdldEF0dHJpYnV0ZShcImlkXCIpID09PSBhdHRySWQ7XG5cdFx0XHR9O1xuXHRcdH07XG5cdH0gZWxzZSB7XG5cdFx0Ly8gU3VwcG9ydDogSUU2Lzdcblx0XHQvLyBnZXRFbGVtZW50QnlJZCBpcyBub3QgcmVsaWFibGUgYXMgYSBmaW5kIHNob3J0Y3V0XG5cdFx0ZGVsZXRlIEV4cHIuZmluZFtcIklEXCJdO1xuXG5cdFx0RXhwci5maWx0ZXJbXCJJRFwiXSA9ICBmdW5jdGlvbiggaWQgKSB7XG5cdFx0XHR2YXIgYXR0cklkID0gaWQucmVwbGFjZSggcnVuZXNjYXBlLCBmdW5lc2NhcGUgKTtcblx0XHRcdHJldHVybiBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdFx0dmFyIG5vZGUgPSB0eXBlb2YgZWxlbS5nZXRBdHRyaWJ1dGVOb2RlICE9PSBcInVuZGVmaW5lZFwiICYmXG5cdFx0XHRcdFx0ZWxlbS5nZXRBdHRyaWJ1dGVOb2RlKFwiaWRcIik7XG5cdFx0XHRcdHJldHVybiBub2RlICYmIG5vZGUudmFsdWUgPT09IGF0dHJJZDtcblx0XHRcdH07XG5cdFx0fTtcblx0fVxuXG5cdC8vIFRhZ1xuXHRFeHByLmZpbmRbXCJUQUdcIl0gPSBzdXBwb3J0LmdldEVsZW1lbnRzQnlUYWdOYW1lID9cblx0XHRmdW5jdGlvbiggdGFnLCBjb250ZXh0ICkge1xuXHRcdFx0aWYgKCB0eXBlb2YgY29udGV4dC5nZXRFbGVtZW50c0J5VGFnTmFtZSAhPT0gXCJ1bmRlZmluZWRcIiApIHtcblx0XHRcdFx0cmV0dXJuIGNvbnRleHQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIHRhZyApO1xuXG5cdFx0XHQvLyBEb2N1bWVudEZyYWdtZW50IG5vZGVzIGRvbid0IGhhdmUgZ0VCVE5cblx0XHRcdH0gZWxzZSBpZiAoIHN1cHBvcnQucXNhICkge1xuXHRcdFx0XHRyZXR1cm4gY29udGV4dC5xdWVyeVNlbGVjdG9yQWxsKCB0YWcgKTtcblx0XHRcdH1cblx0XHR9IDpcblxuXHRcdGZ1bmN0aW9uKCB0YWcsIGNvbnRleHQgKSB7XG5cdFx0XHR2YXIgZWxlbSxcblx0XHRcdFx0dG1wID0gW10sXG5cdFx0XHRcdGkgPSAwLFxuXHRcdFx0XHQvLyBCeSBoYXBweSBjb2luY2lkZW5jZSwgYSAoYnJva2VuKSBnRUJUTiBhcHBlYXJzIG9uIERvY3VtZW50RnJhZ21lbnQgbm9kZXMgdG9vXG5cdFx0XHRcdHJlc3VsdHMgPSBjb250ZXh0LmdldEVsZW1lbnRzQnlUYWdOYW1lKCB0YWcgKTtcblxuXHRcdFx0Ly8gRmlsdGVyIG91dCBwb3NzaWJsZSBjb21tZW50c1xuXHRcdFx0aWYgKCB0YWcgPT09IFwiKlwiICkge1xuXHRcdFx0XHR3aGlsZSAoIChlbGVtID0gcmVzdWx0c1tpKytdKSApIHtcblx0XHRcdFx0XHRpZiAoIGVsZW0ubm9kZVR5cGUgPT09IDEgKSB7XG5cdFx0XHRcdFx0XHR0bXAucHVzaCggZWxlbSApO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXG5cdFx0XHRcdHJldHVybiB0bXA7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gcmVzdWx0cztcblx0XHR9O1xuXG5cdC8vIENsYXNzXG5cdEV4cHIuZmluZFtcIkNMQVNTXCJdID0gc3VwcG9ydC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lICYmIGZ1bmN0aW9uKCBjbGFzc05hbWUsIGNvbnRleHQgKSB7XG5cdFx0aWYgKCB0eXBlb2YgY29udGV4dC5nZXRFbGVtZW50c0J5Q2xhc3NOYW1lICE9PSBcInVuZGVmaW5lZFwiICYmIGRvY3VtZW50SXNIVE1MICkge1xuXHRcdFx0cmV0dXJuIGNvbnRleHQuZ2V0RWxlbWVudHNCeUNsYXNzTmFtZSggY2xhc3NOYW1lICk7XG5cdFx0fVxuXHR9O1xuXG5cdC8qIFFTQS9tYXRjaGVzU2VsZWN0b3Jcblx0LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuXG5cdC8vIFFTQSBhbmQgbWF0Y2hlc1NlbGVjdG9yIHN1cHBvcnRcblxuXHQvLyBtYXRjaGVzU2VsZWN0b3IoOmFjdGl2ZSkgcmVwb3J0cyBmYWxzZSB3aGVuIHRydWUgKElFOS9PcGVyYSAxMS41KVxuXHRyYnVnZ3lNYXRjaGVzID0gW107XG5cblx0Ly8gcVNhKDpmb2N1cykgcmVwb3J0cyBmYWxzZSB3aGVuIHRydWUgKENocm9tZSAyMSlcblx0Ly8gV2UgYWxsb3cgdGhpcyBiZWNhdXNlIG9mIGEgYnVnIGluIElFOC85IHRoYXQgdGhyb3dzIGFuIGVycm9yXG5cdC8vIHdoZW5ldmVyIGBkb2N1bWVudC5hY3RpdmVFbGVtZW50YCBpcyBhY2Nlc3NlZCBvbiBhbiBpZnJhbWVcblx0Ly8gU28sIHdlIGFsbG93IDpmb2N1cyB0byBwYXNzIHRocm91Z2ggUVNBIGFsbCB0aGUgdGltZSB0byBhdm9pZCB0aGUgSUUgZXJyb3Jcblx0Ly8gU2VlIGh0dHA6Ly9idWdzLmpxdWVyeS5jb20vdGlja2V0LzEzMzc4XG5cdHJidWdneVFTQSA9IFtdO1xuXG5cdGlmICggKHN1cHBvcnQucXNhID0gcm5hdGl2ZS50ZXN0KCBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsICkpICkge1xuXHRcdC8vIEJ1aWxkIFFTQSByZWdleFxuXHRcdC8vIFJlZ2V4IHN0cmF0ZWd5IGFkb3B0ZWQgZnJvbSBEaWVnbyBQZXJpbmlcblx0XHRhc3NlcnQoZnVuY3Rpb24oIGRpdiApIHtcblx0XHRcdC8vIFNlbGVjdCBpcyBzZXQgdG8gZW1wdHkgc3RyaW5nIG9uIHB1cnBvc2Vcblx0XHRcdC8vIFRoaXMgaXMgdG8gdGVzdCBJRSdzIHRyZWF0bWVudCBvZiBub3QgZXhwbGljaXRseVxuXHRcdFx0Ly8gc2V0dGluZyBhIGJvb2xlYW4gY29udGVudCBhdHRyaWJ1dGUsXG5cdFx0XHQvLyBzaW5jZSBpdHMgcHJlc2VuY2Ugc2hvdWxkIGJlIGVub3VnaFxuXHRcdFx0Ly8gaHR0cDovL2J1Z3MuanF1ZXJ5LmNvbS90aWNrZXQvMTIzNTlcblx0XHRcdGRvY0VsZW0uYXBwZW5kQ2hpbGQoIGRpdiApLmlubmVySFRNTCA9IFwiPGEgaWQ9J1wiICsgZXhwYW5kbyArIFwiJz48L2E+XCIgK1xuXHRcdFx0XHRcIjxzZWxlY3QgaWQ9J1wiICsgZXhwYW5kbyArIFwiLVxcclxcXFwnIG1zYWxsb3djYXB0dXJlPScnPlwiICtcblx0XHRcdFx0XCI8b3B0aW9uIHNlbGVjdGVkPScnPjwvb3B0aW9uPjwvc2VsZWN0PlwiO1xuXG5cdFx0XHQvLyBTdXBwb3J0OiBJRTgsIE9wZXJhIDExLTEyLjE2XG5cdFx0XHQvLyBOb3RoaW5nIHNob3VsZCBiZSBzZWxlY3RlZCB3aGVuIGVtcHR5IHN0cmluZ3MgZm9sbG93IF49IG9yICQ9IG9yICo9XG5cdFx0XHQvLyBUaGUgdGVzdCBhdHRyaWJ1dGUgbXVzdCBiZSB1bmtub3duIGluIE9wZXJhIGJ1dCBcInNhZmVcIiBmb3IgV2luUlRcblx0XHRcdC8vIGh0dHA6Ly9tc2RuLm1pY3Jvc29mdC5jb20vZW4tdXMvbGlicmFyeS9pZS9oaDQ2NTM4OC5hc3B4I2F0dHJpYnV0ZV9zZWN0aW9uXG5cdFx0XHRpZiAoIGRpdi5xdWVyeVNlbGVjdG9yQWxsKFwiW21zYWxsb3djYXB0dXJlXj0nJ11cIikubGVuZ3RoICkge1xuXHRcdFx0XHRyYnVnZ3lRU0EucHVzaCggXCJbKl4kXT1cIiArIHdoaXRlc3BhY2UgKyBcIiooPzonJ3xcXFwiXFxcIilcIiApO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBTdXBwb3J0OiBJRThcblx0XHRcdC8vIEJvb2xlYW4gYXR0cmlidXRlcyBhbmQgXCJ2YWx1ZVwiIGFyZSBub3QgdHJlYXRlZCBjb3JyZWN0bHlcblx0XHRcdGlmICggIWRpdi5xdWVyeVNlbGVjdG9yQWxsKFwiW3NlbGVjdGVkXVwiKS5sZW5ndGggKSB7XG5cdFx0XHRcdHJidWdneVFTQS5wdXNoKCBcIlxcXFxbXCIgKyB3aGl0ZXNwYWNlICsgXCIqKD86dmFsdWV8XCIgKyBib29sZWFucyArIFwiKVwiICk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIFN1cHBvcnQ6IENocm9tZTwyOSwgQW5kcm9pZDw0LjQsIFNhZmFyaTw3LjArLCBpT1M8Ny4wKywgUGhhbnRvbUpTPDEuOS44K1xuXHRcdFx0aWYgKCAhZGl2LnF1ZXJ5U2VsZWN0b3JBbGwoIFwiW2lkfj1cIiArIGV4cGFuZG8gKyBcIi1dXCIgKS5sZW5ndGggKSB7XG5cdFx0XHRcdHJidWdneVFTQS5wdXNoKFwifj1cIik7XG5cdFx0XHR9XG5cblx0XHRcdC8vIFdlYmtpdC9PcGVyYSAtIDpjaGVja2VkIHNob3VsZCByZXR1cm4gc2VsZWN0ZWQgb3B0aW9uIGVsZW1lbnRzXG5cdFx0XHQvLyBodHRwOi8vd3d3LnczLm9yZy9UUi8yMDExL1JFQy1jc3MzLXNlbGVjdG9ycy0yMDExMDkyOS8jY2hlY2tlZFxuXHRcdFx0Ly8gSUU4IHRocm93cyBlcnJvciBoZXJlIGFuZCB3aWxsIG5vdCBzZWUgbGF0ZXIgdGVzdHNcblx0XHRcdGlmICggIWRpdi5xdWVyeVNlbGVjdG9yQWxsKFwiOmNoZWNrZWRcIikubGVuZ3RoICkge1xuXHRcdFx0XHRyYnVnZ3lRU0EucHVzaChcIjpjaGVja2VkXCIpO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBTdXBwb3J0OiBTYWZhcmkgOCssIGlPUyA4K1xuXHRcdFx0Ly8gaHR0cHM6Ly9idWdzLndlYmtpdC5vcmcvc2hvd19idWcuY2dpP2lkPTEzNjg1MVxuXHRcdFx0Ly8gSW4tcGFnZSBgc2VsZWN0b3IjaWQgc2liaW5nLWNvbWJpbmF0b3Igc2VsZWN0b3JgIGZhaWxzXG5cdFx0XHRpZiAoICFkaXYucXVlcnlTZWxlY3RvckFsbCggXCJhI1wiICsgZXhwYW5kbyArIFwiKypcIiApLmxlbmd0aCApIHtcblx0XHRcdFx0cmJ1Z2d5UVNBLnB1c2goXCIuIy4rWyt+XVwiKTtcblx0XHRcdH1cblx0XHR9KTtcblxuXHRcdGFzc2VydChmdW5jdGlvbiggZGl2ICkge1xuXHRcdFx0Ly8gU3VwcG9ydDogV2luZG93cyA4IE5hdGl2ZSBBcHBzXG5cdFx0XHQvLyBUaGUgdHlwZSBhbmQgbmFtZSBhdHRyaWJ1dGVzIGFyZSByZXN0cmljdGVkIGR1cmluZyAuaW5uZXJIVE1MIGFzc2lnbm1lbnRcblx0XHRcdHZhciBpbnB1dCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJpbnB1dFwiKTtcblx0XHRcdGlucHV0LnNldEF0dHJpYnV0ZSggXCJ0eXBlXCIsIFwiaGlkZGVuXCIgKTtcblx0XHRcdGRpdi5hcHBlbmRDaGlsZCggaW5wdXQgKS5zZXRBdHRyaWJ1dGUoIFwibmFtZVwiLCBcIkRcIiApO1xuXG5cdFx0XHQvLyBTdXBwb3J0OiBJRThcblx0XHRcdC8vIEVuZm9yY2UgY2FzZS1zZW5zaXRpdml0eSBvZiBuYW1lIGF0dHJpYnV0ZVxuXHRcdFx0aWYgKCBkaXYucXVlcnlTZWxlY3RvckFsbChcIltuYW1lPWRdXCIpLmxlbmd0aCApIHtcblx0XHRcdFx0cmJ1Z2d5UVNBLnB1c2goIFwibmFtZVwiICsgd2hpdGVzcGFjZSArIFwiKlsqXiR8IX5dPz1cIiApO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBGRiAzLjUgLSA6ZW5hYmxlZC86ZGlzYWJsZWQgYW5kIGhpZGRlbiBlbGVtZW50cyAoaGlkZGVuIGVsZW1lbnRzIGFyZSBzdGlsbCBlbmFibGVkKVxuXHRcdFx0Ly8gSUU4IHRocm93cyBlcnJvciBoZXJlIGFuZCB3aWxsIG5vdCBzZWUgbGF0ZXIgdGVzdHNcblx0XHRcdGlmICggIWRpdi5xdWVyeVNlbGVjdG9yQWxsKFwiOmVuYWJsZWRcIikubGVuZ3RoICkge1xuXHRcdFx0XHRyYnVnZ3lRU0EucHVzaCggXCI6ZW5hYmxlZFwiLCBcIjpkaXNhYmxlZFwiICk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIE9wZXJhIDEwLTExIGRvZXMgbm90IHRocm93IG9uIHBvc3QtY29tbWEgaW52YWxpZCBwc2V1ZG9zXG5cdFx0XHRkaXYucXVlcnlTZWxlY3RvckFsbChcIiosOnhcIik7XG5cdFx0XHRyYnVnZ3lRU0EucHVzaChcIiwuKjpcIik7XG5cdFx0fSk7XG5cdH1cblxuXHRpZiAoIChzdXBwb3J0Lm1hdGNoZXNTZWxlY3RvciA9IHJuYXRpdmUudGVzdCggKG1hdGNoZXMgPSBkb2NFbGVtLm1hdGNoZXMgfHxcblx0XHRkb2NFbGVtLndlYmtpdE1hdGNoZXNTZWxlY3RvciB8fFxuXHRcdGRvY0VsZW0ubW96TWF0Y2hlc1NlbGVjdG9yIHx8XG5cdFx0ZG9jRWxlbS5vTWF0Y2hlc1NlbGVjdG9yIHx8XG5cdFx0ZG9jRWxlbS5tc01hdGNoZXNTZWxlY3RvcikgKSkgKSB7XG5cblx0XHRhc3NlcnQoZnVuY3Rpb24oIGRpdiApIHtcblx0XHRcdC8vIENoZWNrIHRvIHNlZSBpZiBpdCdzIHBvc3NpYmxlIHRvIGRvIG1hdGNoZXNTZWxlY3RvclxuXHRcdFx0Ly8gb24gYSBkaXNjb25uZWN0ZWQgbm9kZSAoSUUgOSlcblx0XHRcdHN1cHBvcnQuZGlzY29ubmVjdGVkTWF0Y2ggPSBtYXRjaGVzLmNhbGwoIGRpdiwgXCJkaXZcIiApO1xuXG5cdFx0XHQvLyBUaGlzIHNob3VsZCBmYWlsIHdpdGggYW4gZXhjZXB0aW9uXG5cdFx0XHQvLyBHZWNrbyBkb2VzIG5vdCBlcnJvciwgcmV0dXJucyBmYWxzZSBpbnN0ZWFkXG5cdFx0XHRtYXRjaGVzLmNhbGwoIGRpdiwgXCJbcyE9JyddOnhcIiApO1xuXHRcdFx0cmJ1Z2d5TWF0Y2hlcy5wdXNoKCBcIiE9XCIsIHBzZXVkb3MgKTtcblx0XHR9KTtcblx0fVxuXG5cdHJidWdneVFTQSA9IHJidWdneVFTQS5sZW5ndGggJiYgbmV3IFJlZ0V4cCggcmJ1Z2d5UVNBLmpvaW4oXCJ8XCIpICk7XG5cdHJidWdneU1hdGNoZXMgPSByYnVnZ3lNYXRjaGVzLmxlbmd0aCAmJiBuZXcgUmVnRXhwKCByYnVnZ3lNYXRjaGVzLmpvaW4oXCJ8XCIpICk7XG5cblx0LyogQ29udGFpbnNcblx0LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqL1xuXHRoYXNDb21wYXJlID0gcm5hdGl2ZS50ZXN0KCBkb2NFbGVtLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uICk7XG5cblx0Ly8gRWxlbWVudCBjb250YWlucyBhbm90aGVyXG5cdC8vIFB1cnBvc2VmdWxseSBzZWxmLWV4Y2x1c2l2ZVxuXHQvLyBBcyBpbiwgYW4gZWxlbWVudCBkb2VzIG5vdCBjb250YWluIGl0c2VsZlxuXHRjb250YWlucyA9IGhhc0NvbXBhcmUgfHwgcm5hdGl2ZS50ZXN0KCBkb2NFbGVtLmNvbnRhaW5zICkgP1xuXHRcdGZ1bmN0aW9uKCBhLCBiICkge1xuXHRcdFx0dmFyIGFkb3duID0gYS5ub2RlVHlwZSA9PT0gOSA/IGEuZG9jdW1lbnRFbGVtZW50IDogYSxcblx0XHRcdFx0YnVwID0gYiAmJiBiLnBhcmVudE5vZGU7XG5cdFx0XHRyZXR1cm4gYSA9PT0gYnVwIHx8ICEhKCBidXAgJiYgYnVwLm5vZGVUeXBlID09PSAxICYmIChcblx0XHRcdFx0YWRvd24uY29udGFpbnMgP1xuXHRcdFx0XHRcdGFkb3duLmNvbnRhaW5zKCBidXAgKSA6XG5cdFx0XHRcdFx0YS5jb21wYXJlRG9jdW1lbnRQb3NpdGlvbiAmJiBhLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKCBidXAgKSAmIDE2XG5cdFx0XHQpKTtcblx0XHR9IDpcblx0XHRmdW5jdGlvbiggYSwgYiApIHtcblx0XHRcdGlmICggYiApIHtcblx0XHRcdFx0d2hpbGUgKCAoYiA9IGIucGFyZW50Tm9kZSkgKSB7XG5cdFx0XHRcdFx0aWYgKCBiID09PSBhICkge1xuXHRcdFx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fTtcblxuXHQvKiBTb3J0aW5nXG5cdC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi9cblxuXHQvLyBEb2N1bWVudCBvcmRlciBzb3J0aW5nXG5cdHNvcnRPcmRlciA9IGhhc0NvbXBhcmUgP1xuXHRmdW5jdGlvbiggYSwgYiApIHtcblxuXHRcdC8vIEZsYWcgZm9yIGR1cGxpY2F0ZSByZW1vdmFsXG5cdFx0aWYgKCBhID09PSBiICkge1xuXHRcdFx0aGFzRHVwbGljYXRlID0gdHJ1ZTtcblx0XHRcdHJldHVybiAwO1xuXHRcdH1cblxuXHRcdC8vIFNvcnQgb24gbWV0aG9kIGV4aXN0ZW5jZSBpZiBvbmx5IG9uZSBpbnB1dCBoYXMgY29tcGFyZURvY3VtZW50UG9zaXRpb25cblx0XHR2YXIgY29tcGFyZSA9ICFhLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uIC0gIWIuY29tcGFyZURvY3VtZW50UG9zaXRpb247XG5cdFx0aWYgKCBjb21wYXJlICkge1xuXHRcdFx0cmV0dXJuIGNvbXBhcmU7XG5cdFx0fVxuXG5cdFx0Ly8gQ2FsY3VsYXRlIHBvc2l0aW9uIGlmIGJvdGggaW5wdXRzIGJlbG9uZyB0byB0aGUgc2FtZSBkb2N1bWVudFxuXHRcdGNvbXBhcmUgPSAoIGEub3duZXJEb2N1bWVudCB8fCBhICkgPT09ICggYi5vd25lckRvY3VtZW50IHx8IGIgKSA/XG5cdFx0XHRhLmNvbXBhcmVEb2N1bWVudFBvc2l0aW9uKCBiICkgOlxuXG5cdFx0XHQvLyBPdGhlcndpc2Ugd2Uga25vdyB0aGV5IGFyZSBkaXNjb25uZWN0ZWRcblx0XHRcdDE7XG5cblx0XHQvLyBEaXNjb25uZWN0ZWQgbm9kZXNcblx0XHRpZiAoIGNvbXBhcmUgJiAxIHx8XG5cdFx0XHQoIXN1cHBvcnQuc29ydERldGFjaGVkICYmIGIuY29tcGFyZURvY3VtZW50UG9zaXRpb24oIGEgKSA9PT0gY29tcGFyZSkgKSB7XG5cblx0XHRcdC8vIENob29zZSB0aGUgZmlyc3QgZWxlbWVudCB0aGF0IGlzIHJlbGF0ZWQgdG8gb3VyIHByZWZlcnJlZCBkb2N1bWVudFxuXHRcdFx0aWYgKCBhID09PSBkb2N1bWVudCB8fCBhLm93bmVyRG9jdW1lbnQgPT09IHByZWZlcnJlZERvYyAmJiBjb250YWlucyhwcmVmZXJyZWREb2MsIGEpICkge1xuXHRcdFx0XHRyZXR1cm4gLTE7XG5cdFx0XHR9XG5cdFx0XHRpZiAoIGIgPT09IGRvY3VtZW50IHx8IGIub3duZXJEb2N1bWVudCA9PT0gcHJlZmVycmVkRG9jICYmIGNvbnRhaW5zKHByZWZlcnJlZERvYywgYikgKSB7XG5cdFx0XHRcdHJldHVybiAxO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBNYWludGFpbiBvcmlnaW5hbCBvcmRlclxuXHRcdFx0cmV0dXJuIHNvcnRJbnB1dCA/XG5cdFx0XHRcdCggaW5kZXhPZiggc29ydElucHV0LCBhICkgLSBpbmRleE9mKCBzb3J0SW5wdXQsIGIgKSApIDpcblx0XHRcdFx0MDtcblx0XHR9XG5cblx0XHRyZXR1cm4gY29tcGFyZSAmIDQgPyAtMSA6IDE7XG5cdH0gOlxuXHRmdW5jdGlvbiggYSwgYiApIHtcblx0XHQvLyBFeGl0IGVhcmx5IGlmIHRoZSBub2RlcyBhcmUgaWRlbnRpY2FsXG5cdFx0aWYgKCBhID09PSBiICkge1xuXHRcdFx0aGFzRHVwbGljYXRlID0gdHJ1ZTtcblx0XHRcdHJldHVybiAwO1xuXHRcdH1cblxuXHRcdHZhciBjdXIsXG5cdFx0XHRpID0gMCxcblx0XHRcdGF1cCA9IGEucGFyZW50Tm9kZSxcblx0XHRcdGJ1cCA9IGIucGFyZW50Tm9kZSxcblx0XHRcdGFwID0gWyBhIF0sXG5cdFx0XHRicCA9IFsgYiBdO1xuXG5cdFx0Ly8gUGFyZW50bGVzcyBub2RlcyBhcmUgZWl0aGVyIGRvY3VtZW50cyBvciBkaXNjb25uZWN0ZWRcblx0XHRpZiAoICFhdXAgfHwgIWJ1cCApIHtcblx0XHRcdHJldHVybiBhID09PSBkb2N1bWVudCA/IC0xIDpcblx0XHRcdFx0YiA9PT0gZG9jdW1lbnQgPyAxIDpcblx0XHRcdFx0YXVwID8gLTEgOlxuXHRcdFx0XHRidXAgPyAxIDpcblx0XHRcdFx0c29ydElucHV0ID9cblx0XHRcdFx0KCBpbmRleE9mKCBzb3J0SW5wdXQsIGEgKSAtIGluZGV4T2YoIHNvcnRJbnB1dCwgYiApICkgOlxuXHRcdFx0XHQwO1xuXG5cdFx0Ly8gSWYgdGhlIG5vZGVzIGFyZSBzaWJsaW5ncywgd2UgY2FuIGRvIGEgcXVpY2sgY2hlY2tcblx0XHR9IGVsc2UgaWYgKCBhdXAgPT09IGJ1cCApIHtcblx0XHRcdHJldHVybiBzaWJsaW5nQ2hlY2soIGEsIGIgKTtcblx0XHR9XG5cblx0XHQvLyBPdGhlcndpc2Ugd2UgbmVlZCBmdWxsIGxpc3RzIG9mIHRoZWlyIGFuY2VzdG9ycyBmb3IgY29tcGFyaXNvblxuXHRcdGN1ciA9IGE7XG5cdFx0d2hpbGUgKCAoY3VyID0gY3VyLnBhcmVudE5vZGUpICkge1xuXHRcdFx0YXAudW5zaGlmdCggY3VyICk7XG5cdFx0fVxuXHRcdGN1ciA9IGI7XG5cdFx0d2hpbGUgKCAoY3VyID0gY3VyLnBhcmVudE5vZGUpICkge1xuXHRcdFx0YnAudW5zaGlmdCggY3VyICk7XG5cdFx0fVxuXG5cdFx0Ly8gV2FsayBkb3duIHRoZSB0cmVlIGxvb2tpbmcgZm9yIGEgZGlzY3JlcGFuY3lcblx0XHR3aGlsZSAoIGFwW2ldID09PSBicFtpXSApIHtcblx0XHRcdGkrKztcblx0XHR9XG5cblx0XHRyZXR1cm4gaSA/XG5cdFx0XHQvLyBEbyBhIHNpYmxpbmcgY2hlY2sgaWYgdGhlIG5vZGVzIGhhdmUgYSBjb21tb24gYW5jZXN0b3Jcblx0XHRcdHNpYmxpbmdDaGVjayggYXBbaV0sIGJwW2ldICkgOlxuXG5cdFx0XHQvLyBPdGhlcndpc2Ugbm9kZXMgaW4gb3VyIGRvY3VtZW50IHNvcnQgZmlyc3Rcblx0XHRcdGFwW2ldID09PSBwcmVmZXJyZWREb2MgPyAtMSA6XG5cdFx0XHRicFtpXSA9PT0gcHJlZmVycmVkRG9jID8gMSA6XG5cdFx0XHQwO1xuXHR9O1xuXG5cdHJldHVybiBkb2N1bWVudDtcbn07XG5cblNpenpsZS5tYXRjaGVzID0gZnVuY3Rpb24oIGV4cHIsIGVsZW1lbnRzICkge1xuXHRyZXR1cm4gU2l6emxlKCBleHByLCBudWxsLCBudWxsLCBlbGVtZW50cyApO1xufTtcblxuU2l6emxlLm1hdGNoZXNTZWxlY3RvciA9IGZ1bmN0aW9uKCBlbGVtLCBleHByICkge1xuXHQvLyBTZXQgZG9jdW1lbnQgdmFycyBpZiBuZWVkZWRcblx0aWYgKCAoIGVsZW0ub3duZXJEb2N1bWVudCB8fCBlbGVtICkgIT09IGRvY3VtZW50ICkge1xuXHRcdHNldERvY3VtZW50KCBlbGVtICk7XG5cdH1cblxuXHQvLyBNYWtlIHN1cmUgdGhhdCBhdHRyaWJ1dGUgc2VsZWN0b3JzIGFyZSBxdW90ZWRcblx0ZXhwciA9IGV4cHIucmVwbGFjZSggcmF0dHJpYnV0ZVF1b3RlcywgXCI9JyQxJ11cIiApO1xuXG5cdGlmICggc3VwcG9ydC5tYXRjaGVzU2VsZWN0b3IgJiYgZG9jdW1lbnRJc0hUTUwgJiZcblx0XHQhY29tcGlsZXJDYWNoZVsgZXhwciArIFwiIFwiIF0gJiZcblx0XHQoICFyYnVnZ3lNYXRjaGVzIHx8ICFyYnVnZ3lNYXRjaGVzLnRlc3QoIGV4cHIgKSApICYmXG5cdFx0KCAhcmJ1Z2d5UVNBICAgICB8fCAhcmJ1Z2d5UVNBLnRlc3QoIGV4cHIgKSApICkge1xuXG5cdFx0dHJ5IHtcblx0XHRcdHZhciByZXQgPSBtYXRjaGVzLmNhbGwoIGVsZW0sIGV4cHIgKTtcblxuXHRcdFx0Ly8gSUUgOSdzIG1hdGNoZXNTZWxlY3RvciByZXR1cm5zIGZhbHNlIG9uIGRpc2Nvbm5lY3RlZCBub2Rlc1xuXHRcdFx0aWYgKCByZXQgfHwgc3VwcG9ydC5kaXNjb25uZWN0ZWRNYXRjaCB8fFxuXHRcdFx0XHRcdC8vIEFzIHdlbGwsIGRpc2Nvbm5lY3RlZCBub2RlcyBhcmUgc2FpZCB0byBiZSBpbiBhIGRvY3VtZW50XG5cdFx0XHRcdFx0Ly8gZnJhZ21lbnQgaW4gSUUgOVxuXHRcdFx0XHRcdGVsZW0uZG9jdW1lbnQgJiYgZWxlbS5kb2N1bWVudC5ub2RlVHlwZSAhPT0gMTEgKSB7XG5cdFx0XHRcdHJldHVybiByZXQ7XG5cdFx0XHR9XG5cdFx0fSBjYXRjaCAoZSkge31cblx0fVxuXG5cdHJldHVybiBTaXp6bGUoIGV4cHIsIGRvY3VtZW50LCBudWxsLCBbIGVsZW0gXSApLmxlbmd0aCA+IDA7XG59O1xuXG5TaXp6bGUuY29udGFpbnMgPSBmdW5jdGlvbiggY29udGV4dCwgZWxlbSApIHtcblx0Ly8gU2V0IGRvY3VtZW50IHZhcnMgaWYgbmVlZGVkXG5cdGlmICggKCBjb250ZXh0Lm93bmVyRG9jdW1lbnQgfHwgY29udGV4dCApICE9PSBkb2N1bWVudCApIHtcblx0XHRzZXREb2N1bWVudCggY29udGV4dCApO1xuXHR9XG5cdHJldHVybiBjb250YWlucyggY29udGV4dCwgZWxlbSApO1xufTtcblxuU2l6emxlLmF0dHIgPSBmdW5jdGlvbiggZWxlbSwgbmFtZSApIHtcblx0Ly8gU2V0IGRvY3VtZW50IHZhcnMgaWYgbmVlZGVkXG5cdGlmICggKCBlbGVtLm93bmVyRG9jdW1lbnQgfHwgZWxlbSApICE9PSBkb2N1bWVudCApIHtcblx0XHRzZXREb2N1bWVudCggZWxlbSApO1xuXHR9XG5cblx0dmFyIGZuID0gRXhwci5hdHRySGFuZGxlWyBuYW1lLnRvTG93ZXJDYXNlKCkgXSxcblx0XHQvLyBEb24ndCBnZXQgZm9vbGVkIGJ5IE9iamVjdC5wcm90b3R5cGUgcHJvcGVydGllcyAoalF1ZXJ5ICMxMzgwNylcblx0XHR2YWwgPSBmbiAmJiBoYXNPd24uY2FsbCggRXhwci5hdHRySGFuZGxlLCBuYW1lLnRvTG93ZXJDYXNlKCkgKSA/XG5cdFx0XHRmbiggZWxlbSwgbmFtZSwgIWRvY3VtZW50SXNIVE1MICkgOlxuXHRcdFx0dW5kZWZpbmVkO1xuXG5cdHJldHVybiB2YWwgIT09IHVuZGVmaW5lZCA/XG5cdFx0dmFsIDpcblx0XHRzdXBwb3J0LmF0dHJpYnV0ZXMgfHwgIWRvY3VtZW50SXNIVE1MID9cblx0XHRcdGVsZW0uZ2V0QXR0cmlidXRlKCBuYW1lICkgOlxuXHRcdFx0KHZhbCA9IGVsZW0uZ2V0QXR0cmlidXRlTm9kZShuYW1lKSkgJiYgdmFsLnNwZWNpZmllZCA/XG5cdFx0XHRcdHZhbC52YWx1ZSA6XG5cdFx0XHRcdG51bGw7XG59O1xuXG5TaXp6bGUuZXJyb3IgPSBmdW5jdGlvbiggbXNnICkge1xuXHR0aHJvdyBuZXcgRXJyb3IoIFwiU3ludGF4IGVycm9yLCB1bnJlY29nbml6ZWQgZXhwcmVzc2lvbjogXCIgKyBtc2cgKTtcbn07XG5cbi8qKlxuICogRG9jdW1lbnQgc29ydGluZyBhbmQgcmVtb3ZpbmcgZHVwbGljYXRlc1xuICogQHBhcmFtIHtBcnJheUxpa2V9IHJlc3VsdHNcbiAqL1xuU2l6emxlLnVuaXF1ZVNvcnQgPSBmdW5jdGlvbiggcmVzdWx0cyApIHtcblx0dmFyIGVsZW0sXG5cdFx0ZHVwbGljYXRlcyA9IFtdLFxuXHRcdGogPSAwLFxuXHRcdGkgPSAwO1xuXG5cdC8vIFVubGVzcyB3ZSAqa25vdyogd2UgY2FuIGRldGVjdCBkdXBsaWNhdGVzLCBhc3N1bWUgdGhlaXIgcHJlc2VuY2Vcblx0aGFzRHVwbGljYXRlID0gIXN1cHBvcnQuZGV0ZWN0RHVwbGljYXRlcztcblx0c29ydElucHV0ID0gIXN1cHBvcnQuc29ydFN0YWJsZSAmJiByZXN1bHRzLnNsaWNlKCAwICk7XG5cdHJlc3VsdHMuc29ydCggc29ydE9yZGVyICk7XG5cblx0aWYgKCBoYXNEdXBsaWNhdGUgKSB7XG5cdFx0d2hpbGUgKCAoZWxlbSA9IHJlc3VsdHNbaSsrXSkgKSB7XG5cdFx0XHRpZiAoIGVsZW0gPT09IHJlc3VsdHNbIGkgXSApIHtcblx0XHRcdFx0aiA9IGR1cGxpY2F0ZXMucHVzaCggaSApO1xuXHRcdFx0fVxuXHRcdH1cblx0XHR3aGlsZSAoIGotLSApIHtcblx0XHRcdHJlc3VsdHMuc3BsaWNlKCBkdXBsaWNhdGVzWyBqIF0sIDEgKTtcblx0XHR9XG5cdH1cblxuXHQvLyBDbGVhciBpbnB1dCBhZnRlciBzb3J0aW5nIHRvIHJlbGVhc2Ugb2JqZWN0c1xuXHQvLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2pxdWVyeS9zaXp6bGUvcHVsbC8yMjVcblx0c29ydElucHV0ID0gbnVsbDtcblxuXHRyZXR1cm4gcmVzdWx0cztcbn07XG5cbi8qKlxuICogVXRpbGl0eSBmdW5jdGlvbiBmb3IgcmV0cmlldmluZyB0aGUgdGV4dCB2YWx1ZSBvZiBhbiBhcnJheSBvZiBET00gbm9kZXNcbiAqIEBwYXJhbSB7QXJyYXl8RWxlbWVudH0gZWxlbVxuICovXG5nZXRUZXh0ID0gU2l6emxlLmdldFRleHQgPSBmdW5jdGlvbiggZWxlbSApIHtcblx0dmFyIG5vZGUsXG5cdFx0cmV0ID0gXCJcIixcblx0XHRpID0gMCxcblx0XHRub2RlVHlwZSA9IGVsZW0ubm9kZVR5cGU7XG5cblx0aWYgKCAhbm9kZVR5cGUgKSB7XG5cdFx0Ly8gSWYgbm8gbm9kZVR5cGUsIHRoaXMgaXMgZXhwZWN0ZWQgdG8gYmUgYW4gYXJyYXlcblx0XHR3aGlsZSAoIChub2RlID0gZWxlbVtpKytdKSApIHtcblx0XHRcdC8vIERvIG5vdCB0cmF2ZXJzZSBjb21tZW50IG5vZGVzXG5cdFx0XHRyZXQgKz0gZ2V0VGV4dCggbm9kZSApO1xuXHRcdH1cblx0fSBlbHNlIGlmICggbm9kZVR5cGUgPT09IDEgfHwgbm9kZVR5cGUgPT09IDkgfHwgbm9kZVR5cGUgPT09IDExICkge1xuXHRcdC8vIFVzZSB0ZXh0Q29udGVudCBmb3IgZWxlbWVudHNcblx0XHQvLyBpbm5lclRleHQgdXNhZ2UgcmVtb3ZlZCBmb3IgY29uc2lzdGVuY3kgb2YgbmV3IGxpbmVzIChqUXVlcnkgIzExMTUzKVxuXHRcdGlmICggdHlwZW9mIGVsZW0udGV4dENvbnRlbnQgPT09IFwic3RyaW5nXCIgKSB7XG5cdFx0XHRyZXR1cm4gZWxlbS50ZXh0Q29udGVudDtcblx0XHR9IGVsc2Uge1xuXHRcdFx0Ly8gVHJhdmVyc2UgaXRzIGNoaWxkcmVuXG5cdFx0XHRmb3IgKCBlbGVtID0gZWxlbS5maXJzdENoaWxkOyBlbGVtOyBlbGVtID0gZWxlbS5uZXh0U2libGluZyApIHtcblx0XHRcdFx0cmV0ICs9IGdldFRleHQoIGVsZW0gKTtcblx0XHRcdH1cblx0XHR9XG5cdH0gZWxzZSBpZiAoIG5vZGVUeXBlID09PSAzIHx8IG5vZGVUeXBlID09PSA0ICkge1xuXHRcdHJldHVybiBlbGVtLm5vZGVWYWx1ZTtcblx0fVxuXHQvLyBEbyBub3QgaW5jbHVkZSBjb21tZW50IG9yIHByb2Nlc3NpbmcgaW5zdHJ1Y3Rpb24gbm9kZXNcblxuXHRyZXR1cm4gcmV0O1xufTtcblxuRXhwciA9IFNpenpsZS5zZWxlY3RvcnMgPSB7XG5cblx0Ly8gQ2FuIGJlIGFkanVzdGVkIGJ5IHRoZSB1c2VyXG5cdGNhY2hlTGVuZ3RoOiA1MCxcblxuXHRjcmVhdGVQc2V1ZG86IG1hcmtGdW5jdGlvbixcblxuXHRtYXRjaDogbWF0Y2hFeHByLFxuXG5cdGF0dHJIYW5kbGU6IHt9LFxuXG5cdGZpbmQ6IHt9LFxuXG5cdHJlbGF0aXZlOiB7XG5cdFx0XCI+XCI6IHsgZGlyOiBcInBhcmVudE5vZGVcIiwgZmlyc3Q6IHRydWUgfSxcblx0XHRcIiBcIjogeyBkaXI6IFwicGFyZW50Tm9kZVwiIH0sXG5cdFx0XCIrXCI6IHsgZGlyOiBcInByZXZpb3VzU2libGluZ1wiLCBmaXJzdDogdHJ1ZSB9LFxuXHRcdFwiflwiOiB7IGRpcjogXCJwcmV2aW91c1NpYmxpbmdcIiB9XG5cdH0sXG5cblx0cHJlRmlsdGVyOiB7XG5cdFx0XCJBVFRSXCI6IGZ1bmN0aW9uKCBtYXRjaCApIHtcblx0XHRcdG1hdGNoWzFdID0gbWF0Y2hbMV0ucmVwbGFjZSggcnVuZXNjYXBlLCBmdW5lc2NhcGUgKTtcblxuXHRcdFx0Ly8gTW92ZSB0aGUgZ2l2ZW4gdmFsdWUgdG8gbWF0Y2hbM10gd2hldGhlciBxdW90ZWQgb3IgdW5xdW90ZWRcblx0XHRcdG1hdGNoWzNdID0gKCBtYXRjaFszXSB8fCBtYXRjaFs0XSB8fCBtYXRjaFs1XSB8fCBcIlwiICkucmVwbGFjZSggcnVuZXNjYXBlLCBmdW5lc2NhcGUgKTtcblxuXHRcdFx0aWYgKCBtYXRjaFsyXSA9PT0gXCJ+PVwiICkge1xuXHRcdFx0XHRtYXRjaFszXSA9IFwiIFwiICsgbWF0Y2hbM10gKyBcIiBcIjtcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIG1hdGNoLnNsaWNlKCAwLCA0ICk7XG5cdFx0fSxcblxuXHRcdFwiQ0hJTERcIjogZnVuY3Rpb24oIG1hdGNoICkge1xuXHRcdFx0LyogbWF0Y2hlcyBmcm9tIG1hdGNoRXhwcltcIkNISUxEXCJdXG5cdFx0XHRcdDEgdHlwZSAob25seXxudGh8Li4uKVxuXHRcdFx0XHQyIHdoYXQgKGNoaWxkfG9mLXR5cGUpXG5cdFx0XHRcdDMgYXJndW1lbnQgKGV2ZW58b2RkfFxcZCp8XFxkKm4oWystXVxcZCspP3wuLi4pXG5cdFx0XHRcdDQgeG4tY29tcG9uZW50IG9mIHhuK3kgYXJndW1lbnQgKFsrLV0/XFxkKm58KVxuXHRcdFx0XHQ1IHNpZ24gb2YgeG4tY29tcG9uZW50XG5cdFx0XHRcdDYgeCBvZiB4bi1jb21wb25lbnRcblx0XHRcdFx0NyBzaWduIG9mIHktY29tcG9uZW50XG5cdFx0XHRcdDggeSBvZiB5LWNvbXBvbmVudFxuXHRcdFx0Ki9cblx0XHRcdG1hdGNoWzFdID0gbWF0Y2hbMV0udG9Mb3dlckNhc2UoKTtcblxuXHRcdFx0aWYgKCBtYXRjaFsxXS5zbGljZSggMCwgMyApID09PSBcIm50aFwiICkge1xuXHRcdFx0XHQvLyBudGgtKiByZXF1aXJlcyBhcmd1bWVudFxuXHRcdFx0XHRpZiAoICFtYXRjaFszXSApIHtcblx0XHRcdFx0XHRTaXp6bGUuZXJyb3IoIG1hdGNoWzBdICk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBudW1lcmljIHggYW5kIHkgcGFyYW1ldGVycyBmb3IgRXhwci5maWx0ZXIuQ0hJTERcblx0XHRcdFx0Ly8gcmVtZW1iZXIgdGhhdCBmYWxzZS90cnVlIGNhc3QgcmVzcGVjdGl2ZWx5IHRvIDAvMVxuXHRcdFx0XHRtYXRjaFs0XSA9ICsoIG1hdGNoWzRdID8gbWF0Y2hbNV0gKyAobWF0Y2hbNl0gfHwgMSkgOiAyICogKCBtYXRjaFszXSA9PT0gXCJldmVuXCIgfHwgbWF0Y2hbM10gPT09IFwib2RkXCIgKSApO1xuXHRcdFx0XHRtYXRjaFs1XSA9ICsoICggbWF0Y2hbN10gKyBtYXRjaFs4XSApIHx8IG1hdGNoWzNdID09PSBcIm9kZFwiICk7XG5cblx0XHRcdC8vIG90aGVyIHR5cGVzIHByb2hpYml0IGFyZ3VtZW50c1xuXHRcdFx0fSBlbHNlIGlmICggbWF0Y2hbM10gKSB7XG5cdFx0XHRcdFNpenpsZS5lcnJvciggbWF0Y2hbMF0gKTtcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIG1hdGNoO1xuXHRcdH0sXG5cblx0XHRcIlBTRVVET1wiOiBmdW5jdGlvbiggbWF0Y2ggKSB7XG5cdFx0XHR2YXIgZXhjZXNzLFxuXHRcdFx0XHR1bnF1b3RlZCA9ICFtYXRjaFs2XSAmJiBtYXRjaFsyXTtcblxuXHRcdFx0aWYgKCBtYXRjaEV4cHJbXCJDSElMRFwiXS50ZXN0KCBtYXRjaFswXSApICkge1xuXHRcdFx0XHRyZXR1cm4gbnVsbDtcblx0XHRcdH1cblxuXHRcdFx0Ly8gQWNjZXB0IHF1b3RlZCBhcmd1bWVudHMgYXMtaXNcblx0XHRcdGlmICggbWF0Y2hbM10gKSB7XG5cdFx0XHRcdG1hdGNoWzJdID0gbWF0Y2hbNF0gfHwgbWF0Y2hbNV0gfHwgXCJcIjtcblxuXHRcdFx0Ly8gU3RyaXAgZXhjZXNzIGNoYXJhY3RlcnMgZnJvbSB1bnF1b3RlZCBhcmd1bWVudHNcblx0XHRcdH0gZWxzZSBpZiAoIHVucXVvdGVkICYmIHJwc2V1ZG8udGVzdCggdW5xdW90ZWQgKSAmJlxuXHRcdFx0XHQvLyBHZXQgZXhjZXNzIGZyb20gdG9rZW5pemUgKHJlY3Vyc2l2ZWx5KVxuXHRcdFx0XHQoZXhjZXNzID0gdG9rZW5pemUoIHVucXVvdGVkLCB0cnVlICkpICYmXG5cdFx0XHRcdC8vIGFkdmFuY2UgdG8gdGhlIG5leHQgY2xvc2luZyBwYXJlbnRoZXNpc1xuXHRcdFx0XHQoZXhjZXNzID0gdW5xdW90ZWQuaW5kZXhPZiggXCIpXCIsIHVucXVvdGVkLmxlbmd0aCAtIGV4Y2VzcyApIC0gdW5xdW90ZWQubGVuZ3RoKSApIHtcblxuXHRcdFx0XHQvLyBleGNlc3MgaXMgYSBuZWdhdGl2ZSBpbmRleFxuXHRcdFx0XHRtYXRjaFswXSA9IG1hdGNoWzBdLnNsaWNlKCAwLCBleGNlc3MgKTtcblx0XHRcdFx0bWF0Y2hbMl0gPSB1bnF1b3RlZC5zbGljZSggMCwgZXhjZXNzICk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIFJldHVybiBvbmx5IGNhcHR1cmVzIG5lZWRlZCBieSB0aGUgcHNldWRvIGZpbHRlciBtZXRob2QgKHR5cGUgYW5kIGFyZ3VtZW50KVxuXHRcdFx0cmV0dXJuIG1hdGNoLnNsaWNlKCAwLCAzICk7XG5cdFx0fVxuXHR9LFxuXG5cdGZpbHRlcjoge1xuXG5cdFx0XCJUQUdcIjogZnVuY3Rpb24oIG5vZGVOYW1lU2VsZWN0b3IgKSB7XG5cdFx0XHR2YXIgbm9kZU5hbWUgPSBub2RlTmFtZVNlbGVjdG9yLnJlcGxhY2UoIHJ1bmVzY2FwZSwgZnVuZXNjYXBlICkudG9Mb3dlckNhc2UoKTtcblx0XHRcdHJldHVybiBub2RlTmFtZVNlbGVjdG9yID09PSBcIipcIiA/XG5cdFx0XHRcdGZ1bmN0aW9uKCkgeyByZXR1cm4gdHJ1ZTsgfSA6XG5cdFx0XHRcdGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0XHRcdHJldHVybiBlbGVtLm5vZGVOYW1lICYmIGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gbm9kZU5hbWU7XG5cdFx0XHRcdH07XG5cdFx0fSxcblxuXHRcdFwiQ0xBU1NcIjogZnVuY3Rpb24oIGNsYXNzTmFtZSApIHtcblx0XHRcdHZhciBwYXR0ZXJuID0gY2xhc3NDYWNoZVsgY2xhc3NOYW1lICsgXCIgXCIgXTtcblxuXHRcdFx0cmV0dXJuIHBhdHRlcm4gfHxcblx0XHRcdFx0KHBhdHRlcm4gPSBuZXcgUmVnRXhwKCBcIihefFwiICsgd2hpdGVzcGFjZSArIFwiKVwiICsgY2xhc3NOYW1lICsgXCIoXCIgKyB3aGl0ZXNwYWNlICsgXCJ8JClcIiApKSAmJlxuXHRcdFx0XHRjbGFzc0NhY2hlKCBjbGFzc05hbWUsIGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0XHRcdHJldHVybiBwYXR0ZXJuLnRlc3QoIHR5cGVvZiBlbGVtLmNsYXNzTmFtZSA9PT0gXCJzdHJpbmdcIiAmJiBlbGVtLmNsYXNzTmFtZSB8fCB0eXBlb2YgZWxlbS5nZXRBdHRyaWJ1dGUgIT09IFwidW5kZWZpbmVkXCIgJiYgZWxlbS5nZXRBdHRyaWJ1dGUoXCJjbGFzc1wiKSB8fCBcIlwiICk7XG5cdFx0XHRcdH0pO1xuXHRcdH0sXG5cblx0XHRcIkFUVFJcIjogZnVuY3Rpb24oIG5hbWUsIG9wZXJhdG9yLCBjaGVjayApIHtcblx0XHRcdHJldHVybiBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdFx0dmFyIHJlc3VsdCA9IFNpenpsZS5hdHRyKCBlbGVtLCBuYW1lICk7XG5cblx0XHRcdFx0aWYgKCByZXN1bHQgPT0gbnVsbCApIHtcblx0XHRcdFx0XHRyZXR1cm4gb3BlcmF0b3IgPT09IFwiIT1cIjtcblx0XHRcdFx0fVxuXHRcdFx0XHRpZiAoICFvcGVyYXRvciApIHtcblx0XHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdHJlc3VsdCArPSBcIlwiO1xuXG5cdFx0XHRcdHJldHVybiBvcGVyYXRvciA9PT0gXCI9XCIgPyByZXN1bHQgPT09IGNoZWNrIDpcblx0XHRcdFx0XHRvcGVyYXRvciA9PT0gXCIhPVwiID8gcmVzdWx0ICE9PSBjaGVjayA6XG5cdFx0XHRcdFx0b3BlcmF0b3IgPT09IFwiXj1cIiA/IGNoZWNrICYmIHJlc3VsdC5pbmRleE9mKCBjaGVjayApID09PSAwIDpcblx0XHRcdFx0XHRvcGVyYXRvciA9PT0gXCIqPVwiID8gY2hlY2sgJiYgcmVzdWx0LmluZGV4T2YoIGNoZWNrICkgPiAtMSA6XG5cdFx0XHRcdFx0b3BlcmF0b3IgPT09IFwiJD1cIiA/IGNoZWNrICYmIHJlc3VsdC5zbGljZSggLWNoZWNrLmxlbmd0aCApID09PSBjaGVjayA6XG5cdFx0XHRcdFx0b3BlcmF0b3IgPT09IFwifj1cIiA/ICggXCIgXCIgKyByZXN1bHQucmVwbGFjZSggcndoaXRlc3BhY2UsIFwiIFwiICkgKyBcIiBcIiApLmluZGV4T2YoIGNoZWNrICkgPiAtMSA6XG5cdFx0XHRcdFx0b3BlcmF0b3IgPT09IFwifD1cIiA/IHJlc3VsdCA9PT0gY2hlY2sgfHwgcmVzdWx0LnNsaWNlKCAwLCBjaGVjay5sZW5ndGggKyAxICkgPT09IGNoZWNrICsgXCItXCIgOlxuXHRcdFx0XHRcdGZhbHNlO1xuXHRcdFx0fTtcblx0XHR9LFxuXG5cdFx0XCJDSElMRFwiOiBmdW5jdGlvbiggdHlwZSwgd2hhdCwgYXJndW1lbnQsIGZpcnN0LCBsYXN0ICkge1xuXHRcdFx0dmFyIHNpbXBsZSA9IHR5cGUuc2xpY2UoIDAsIDMgKSAhPT0gXCJudGhcIixcblx0XHRcdFx0Zm9yd2FyZCA9IHR5cGUuc2xpY2UoIC00ICkgIT09IFwibGFzdFwiLFxuXHRcdFx0XHRvZlR5cGUgPSB3aGF0ID09PSBcIm9mLXR5cGVcIjtcblxuXHRcdFx0cmV0dXJuIGZpcnN0ID09PSAxICYmIGxhc3QgPT09IDAgP1xuXG5cdFx0XHRcdC8vIFNob3J0Y3V0IGZvciA6bnRoLSoobilcblx0XHRcdFx0ZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHRcdFx0cmV0dXJuICEhZWxlbS5wYXJlbnROb2RlO1xuXHRcdFx0XHR9IDpcblxuXHRcdFx0XHRmdW5jdGlvbiggZWxlbSwgY29udGV4dCwgeG1sICkge1xuXHRcdFx0XHRcdHZhciBjYWNoZSwgdW5pcXVlQ2FjaGUsIG91dGVyQ2FjaGUsIG5vZGUsIG5vZGVJbmRleCwgc3RhcnQsXG5cdFx0XHRcdFx0XHRkaXIgPSBzaW1wbGUgIT09IGZvcndhcmQgPyBcIm5leHRTaWJsaW5nXCIgOiBcInByZXZpb3VzU2libGluZ1wiLFxuXHRcdFx0XHRcdFx0cGFyZW50ID0gZWxlbS5wYXJlbnROb2RlLFxuXHRcdFx0XHRcdFx0bmFtZSA9IG9mVHlwZSAmJiBlbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCksXG5cdFx0XHRcdFx0XHR1c2VDYWNoZSA9ICF4bWwgJiYgIW9mVHlwZSxcblx0XHRcdFx0XHRcdGRpZmYgPSBmYWxzZTtcblxuXHRcdFx0XHRcdGlmICggcGFyZW50ICkge1xuXG5cdFx0XHRcdFx0XHQvLyA6KGZpcnN0fGxhc3R8b25seSktKGNoaWxkfG9mLXR5cGUpXG5cdFx0XHRcdFx0XHRpZiAoIHNpbXBsZSApIHtcblx0XHRcdFx0XHRcdFx0d2hpbGUgKCBkaXIgKSB7XG5cdFx0XHRcdFx0XHRcdFx0bm9kZSA9IGVsZW07XG5cdFx0XHRcdFx0XHRcdFx0d2hpbGUgKCAobm9kZSA9IG5vZGVbIGRpciBdKSApIHtcblx0XHRcdFx0XHRcdFx0XHRcdGlmICggb2ZUeXBlID9cblx0XHRcdFx0XHRcdFx0XHRcdFx0bm9kZS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpID09PSBuYW1lIDpcblx0XHRcdFx0XHRcdFx0XHRcdFx0bm9kZS5ub2RlVHlwZSA9PT0gMSApIHtcblxuXHRcdFx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdC8vIFJldmVyc2UgZGlyZWN0aW9uIGZvciA6b25seS0qIChpZiB3ZSBoYXZlbid0IHlldCBkb25lIHNvKVxuXHRcdFx0XHRcdFx0XHRcdHN0YXJ0ID0gZGlyID0gdHlwZSA9PT0gXCJvbmx5XCIgJiYgIXN0YXJ0ICYmIFwibmV4dFNpYmxpbmdcIjtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0c3RhcnQgPSBbIGZvcndhcmQgPyBwYXJlbnQuZmlyc3RDaGlsZCA6IHBhcmVudC5sYXN0Q2hpbGQgXTtcblxuXHRcdFx0XHRcdFx0Ly8gbm9uLXhtbCA6bnRoLWNoaWxkKC4uLikgc3RvcmVzIGNhY2hlIGRhdGEgb24gYHBhcmVudGBcblx0XHRcdFx0XHRcdGlmICggZm9yd2FyZCAmJiB1c2VDYWNoZSApIHtcblxuXHRcdFx0XHRcdFx0XHQvLyBTZWVrIGBlbGVtYCBmcm9tIGEgcHJldmlvdXNseS1jYWNoZWQgaW5kZXhcblxuXHRcdFx0XHRcdFx0XHQvLyAuLi5pbiBhIGd6aXAtZnJpZW5kbHkgd2F5XG5cdFx0XHRcdFx0XHRcdG5vZGUgPSBwYXJlbnQ7XG5cdFx0XHRcdFx0XHRcdG91dGVyQ2FjaGUgPSBub2RlWyBleHBhbmRvIF0gfHwgKG5vZGVbIGV4cGFuZG8gXSA9IHt9KTtcblxuXHRcdFx0XHRcdFx0XHQvLyBTdXBwb3J0OiBJRSA8OSBvbmx5XG5cdFx0XHRcdFx0XHRcdC8vIERlZmVuZCBhZ2FpbnN0IGNsb25lZCBhdHRyb3BlcnRpZXMgKGpRdWVyeSBnaC0xNzA5KVxuXHRcdFx0XHRcdFx0XHR1bmlxdWVDYWNoZSA9IG91dGVyQ2FjaGVbIG5vZGUudW5pcXVlSUQgXSB8fFxuXHRcdFx0XHRcdFx0XHRcdChvdXRlckNhY2hlWyBub2RlLnVuaXF1ZUlEIF0gPSB7fSk7XG5cblx0XHRcdFx0XHRcdFx0Y2FjaGUgPSB1bmlxdWVDYWNoZVsgdHlwZSBdIHx8IFtdO1xuXHRcdFx0XHRcdFx0XHRub2RlSW5kZXggPSBjYWNoZVsgMCBdID09PSBkaXJydW5zICYmIGNhY2hlWyAxIF07XG5cdFx0XHRcdFx0XHRcdGRpZmYgPSBub2RlSW5kZXggJiYgY2FjaGVbIDIgXTtcblx0XHRcdFx0XHRcdFx0bm9kZSA9IG5vZGVJbmRleCAmJiBwYXJlbnQuY2hpbGROb2Rlc1sgbm9kZUluZGV4IF07XG5cblx0XHRcdFx0XHRcdFx0d2hpbGUgKCAobm9kZSA9ICsrbm9kZUluZGV4ICYmIG5vZGUgJiYgbm9kZVsgZGlyIF0gfHxcblxuXHRcdFx0XHRcdFx0XHRcdC8vIEZhbGxiYWNrIHRvIHNlZWtpbmcgYGVsZW1gIGZyb20gdGhlIHN0YXJ0XG5cdFx0XHRcdFx0XHRcdFx0KGRpZmYgPSBub2RlSW5kZXggPSAwKSB8fCBzdGFydC5wb3AoKSkgKSB7XG5cblx0XHRcdFx0XHRcdFx0XHQvLyBXaGVuIGZvdW5kLCBjYWNoZSBpbmRleGVzIG9uIGBwYXJlbnRgIGFuZCBicmVha1xuXHRcdFx0XHRcdFx0XHRcdGlmICggbm9kZS5ub2RlVHlwZSA9PT0gMSAmJiArK2RpZmYgJiYgbm9kZSA9PT0gZWxlbSApIHtcblx0XHRcdFx0XHRcdFx0XHRcdHVuaXF1ZUNhY2hlWyB0eXBlIF0gPSBbIGRpcnJ1bnMsIG5vZGVJbmRleCwgZGlmZiBdO1xuXHRcdFx0XHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdC8vIFVzZSBwcmV2aW91c2x5LWNhY2hlZCBlbGVtZW50IGluZGV4IGlmIGF2YWlsYWJsZVxuXHRcdFx0XHRcdFx0XHRpZiAoIHVzZUNhY2hlICkge1xuXHRcdFx0XHRcdFx0XHRcdC8vIC4uLmluIGEgZ3ppcC1mcmllbmRseSB3YXlcblx0XHRcdFx0XHRcdFx0XHRub2RlID0gZWxlbTtcblx0XHRcdFx0XHRcdFx0XHRvdXRlckNhY2hlID0gbm9kZVsgZXhwYW5kbyBdIHx8IChub2RlWyBleHBhbmRvIF0gPSB7fSk7XG5cblx0XHRcdFx0XHRcdFx0XHQvLyBTdXBwb3J0OiBJRSA8OSBvbmx5XG5cdFx0XHRcdFx0XHRcdFx0Ly8gRGVmZW5kIGFnYWluc3QgY2xvbmVkIGF0dHJvcGVydGllcyAoalF1ZXJ5IGdoLTE3MDkpXG5cdFx0XHRcdFx0XHRcdFx0dW5pcXVlQ2FjaGUgPSBvdXRlckNhY2hlWyBub2RlLnVuaXF1ZUlEIF0gfHxcblx0XHRcdFx0XHRcdFx0XHRcdChvdXRlckNhY2hlWyBub2RlLnVuaXF1ZUlEIF0gPSB7fSk7XG5cblx0XHRcdFx0XHRcdFx0XHRjYWNoZSA9IHVuaXF1ZUNhY2hlWyB0eXBlIF0gfHwgW107XG5cdFx0XHRcdFx0XHRcdFx0bm9kZUluZGV4ID0gY2FjaGVbIDAgXSA9PT0gZGlycnVucyAmJiBjYWNoZVsgMSBdO1xuXHRcdFx0XHRcdFx0XHRcdGRpZmYgPSBub2RlSW5kZXg7XG5cdFx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0XHQvLyB4bWwgOm50aC1jaGlsZCguLi4pXG5cdFx0XHRcdFx0XHRcdC8vIG9yIDpudGgtbGFzdC1jaGlsZCguLi4pIG9yIDpudGgoLWxhc3QpPy1vZi10eXBlKC4uLilcblx0XHRcdFx0XHRcdFx0aWYgKCBkaWZmID09PSBmYWxzZSApIHtcblx0XHRcdFx0XHRcdFx0XHQvLyBVc2UgdGhlIHNhbWUgbG9vcCBhcyBhYm92ZSB0byBzZWVrIGBlbGVtYCBmcm9tIHRoZSBzdGFydFxuXHRcdFx0XHRcdFx0XHRcdHdoaWxlICggKG5vZGUgPSArK25vZGVJbmRleCAmJiBub2RlICYmIG5vZGVbIGRpciBdIHx8XG5cdFx0XHRcdFx0XHRcdFx0XHQoZGlmZiA9IG5vZGVJbmRleCA9IDApIHx8IHN0YXJ0LnBvcCgpKSApIHtcblxuXHRcdFx0XHRcdFx0XHRcdFx0aWYgKCAoIG9mVHlwZSA/XG5cdFx0XHRcdFx0XHRcdFx0XHRcdG5vZGUubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gbmFtZSA6XG5cdFx0XHRcdFx0XHRcdFx0XHRcdG5vZGUubm9kZVR5cGUgPT09IDEgKSAmJlxuXHRcdFx0XHRcdFx0XHRcdFx0XHQrK2RpZmYgKSB7XG5cblx0XHRcdFx0XHRcdFx0XHRcdFx0Ly8gQ2FjaGUgdGhlIGluZGV4IG9mIGVhY2ggZW5jb3VudGVyZWQgZWxlbWVudFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRpZiAoIHVzZUNhY2hlICkge1xuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdG91dGVyQ2FjaGUgPSBub2RlWyBleHBhbmRvIF0gfHwgKG5vZGVbIGV4cGFuZG8gXSA9IHt9KTtcblxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdC8vIFN1cHBvcnQ6IElFIDw5IG9ubHlcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHQvLyBEZWZlbmQgYWdhaW5zdCBjbG9uZWQgYXR0cm9wZXJ0aWVzIChqUXVlcnkgZ2gtMTcwOSlcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHR1bmlxdWVDYWNoZSA9IG91dGVyQ2FjaGVbIG5vZGUudW5pcXVlSUQgXSB8fFxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdFx0KG91dGVyQ2FjaGVbIG5vZGUudW5pcXVlSUQgXSA9IHt9KTtcblxuXHRcdFx0XHRcdFx0XHRcdFx0XHRcdHVuaXF1ZUNhY2hlWyB0eXBlIF0gPSBbIGRpcnJ1bnMsIGRpZmYgXTtcblx0XHRcdFx0XHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHRcdFx0XHRcdGlmICggbm9kZSA9PT0gZWxlbSApIHtcblx0XHRcdFx0XHRcdFx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0XHQvLyBJbmNvcnBvcmF0ZSB0aGUgb2Zmc2V0LCB0aGVuIGNoZWNrIGFnYWluc3QgY3ljbGUgc2l6ZVxuXHRcdFx0XHRcdFx0ZGlmZiAtPSBsYXN0O1xuXHRcdFx0XHRcdFx0cmV0dXJuIGRpZmYgPT09IGZpcnN0IHx8ICggZGlmZiAlIGZpcnN0ID09PSAwICYmIGRpZmYgLyBmaXJzdCA+PSAwICk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9O1xuXHRcdH0sXG5cblx0XHRcIlBTRVVET1wiOiBmdW5jdGlvbiggcHNldWRvLCBhcmd1bWVudCApIHtcblx0XHRcdC8vIHBzZXVkby1jbGFzcyBuYW1lcyBhcmUgY2FzZS1pbnNlbnNpdGl2ZVxuXHRcdFx0Ly8gaHR0cDovL3d3dy53My5vcmcvVFIvc2VsZWN0b3JzLyNwc2V1ZG8tY2xhc3Nlc1xuXHRcdFx0Ly8gUHJpb3JpdGl6ZSBieSBjYXNlIHNlbnNpdGl2aXR5IGluIGNhc2UgY3VzdG9tIHBzZXVkb3MgYXJlIGFkZGVkIHdpdGggdXBwZXJjYXNlIGxldHRlcnNcblx0XHRcdC8vIFJlbWVtYmVyIHRoYXQgc2V0RmlsdGVycyBpbmhlcml0cyBmcm9tIHBzZXVkb3Ncblx0XHRcdHZhciBhcmdzLFxuXHRcdFx0XHRmbiA9IEV4cHIucHNldWRvc1sgcHNldWRvIF0gfHwgRXhwci5zZXRGaWx0ZXJzWyBwc2V1ZG8udG9Mb3dlckNhc2UoKSBdIHx8XG5cdFx0XHRcdFx0U2l6emxlLmVycm9yKCBcInVuc3VwcG9ydGVkIHBzZXVkbzogXCIgKyBwc2V1ZG8gKTtcblxuXHRcdFx0Ly8gVGhlIHVzZXIgbWF5IHVzZSBjcmVhdGVQc2V1ZG8gdG8gaW5kaWNhdGUgdGhhdFxuXHRcdFx0Ly8gYXJndW1lbnRzIGFyZSBuZWVkZWQgdG8gY3JlYXRlIHRoZSBmaWx0ZXIgZnVuY3Rpb25cblx0XHRcdC8vIGp1c3QgYXMgU2l6emxlIGRvZXNcblx0XHRcdGlmICggZm5bIGV4cGFuZG8gXSApIHtcblx0XHRcdFx0cmV0dXJuIGZuKCBhcmd1bWVudCApO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBCdXQgbWFpbnRhaW4gc3VwcG9ydCBmb3Igb2xkIHNpZ25hdHVyZXNcblx0XHRcdGlmICggZm4ubGVuZ3RoID4gMSApIHtcblx0XHRcdFx0YXJncyA9IFsgcHNldWRvLCBwc2V1ZG8sIFwiXCIsIGFyZ3VtZW50IF07XG5cdFx0XHRcdHJldHVybiBFeHByLnNldEZpbHRlcnMuaGFzT3duUHJvcGVydHkoIHBzZXVkby50b0xvd2VyQ2FzZSgpICkgP1xuXHRcdFx0XHRcdG1hcmtGdW5jdGlvbihmdW5jdGlvbiggc2VlZCwgbWF0Y2hlcyApIHtcblx0XHRcdFx0XHRcdHZhciBpZHgsXG5cdFx0XHRcdFx0XHRcdG1hdGNoZWQgPSBmbiggc2VlZCwgYXJndW1lbnQgKSxcblx0XHRcdFx0XHRcdFx0aSA9IG1hdGNoZWQubGVuZ3RoO1xuXHRcdFx0XHRcdFx0d2hpbGUgKCBpLS0gKSB7XG5cdFx0XHRcdFx0XHRcdGlkeCA9IGluZGV4T2YoIHNlZWQsIG1hdGNoZWRbaV0gKTtcblx0XHRcdFx0XHRcdFx0c2VlZFsgaWR4IF0gPSAhKCBtYXRjaGVzWyBpZHggXSA9IG1hdGNoZWRbaV0gKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9KSA6XG5cdFx0XHRcdFx0ZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gZm4oIGVsZW0sIDAsIGFyZ3MgKTtcblx0XHRcdFx0XHR9O1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gZm47XG5cdFx0fVxuXHR9LFxuXG5cdHBzZXVkb3M6IHtcblx0XHQvLyBQb3RlbnRpYWxseSBjb21wbGV4IHBzZXVkb3Ncblx0XHRcIm5vdFwiOiBtYXJrRnVuY3Rpb24oZnVuY3Rpb24oIHNlbGVjdG9yICkge1xuXHRcdFx0Ly8gVHJpbSB0aGUgc2VsZWN0b3IgcGFzc2VkIHRvIGNvbXBpbGVcblx0XHRcdC8vIHRvIGF2b2lkIHRyZWF0aW5nIGxlYWRpbmcgYW5kIHRyYWlsaW5nXG5cdFx0XHQvLyBzcGFjZXMgYXMgY29tYmluYXRvcnNcblx0XHRcdHZhciBpbnB1dCA9IFtdLFxuXHRcdFx0XHRyZXN1bHRzID0gW10sXG5cdFx0XHRcdG1hdGNoZXIgPSBjb21waWxlKCBzZWxlY3Rvci5yZXBsYWNlKCBydHJpbSwgXCIkMVwiICkgKTtcblxuXHRcdFx0cmV0dXJuIG1hdGNoZXJbIGV4cGFuZG8gXSA/XG5cdFx0XHRcdG1hcmtGdW5jdGlvbihmdW5jdGlvbiggc2VlZCwgbWF0Y2hlcywgY29udGV4dCwgeG1sICkge1xuXHRcdFx0XHRcdHZhciBlbGVtLFxuXHRcdFx0XHRcdFx0dW5tYXRjaGVkID0gbWF0Y2hlciggc2VlZCwgbnVsbCwgeG1sLCBbXSApLFxuXHRcdFx0XHRcdFx0aSA9IHNlZWQubGVuZ3RoO1xuXG5cdFx0XHRcdFx0Ly8gTWF0Y2ggZWxlbWVudHMgdW5tYXRjaGVkIGJ5IGBtYXRjaGVyYFxuXHRcdFx0XHRcdHdoaWxlICggaS0tICkge1xuXHRcdFx0XHRcdFx0aWYgKCAoZWxlbSA9IHVubWF0Y2hlZFtpXSkgKSB7XG5cdFx0XHRcdFx0XHRcdHNlZWRbaV0gPSAhKG1hdGNoZXNbaV0gPSBlbGVtKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0pIDpcblx0XHRcdFx0ZnVuY3Rpb24oIGVsZW0sIGNvbnRleHQsIHhtbCApIHtcblx0XHRcdFx0XHRpbnB1dFswXSA9IGVsZW07XG5cdFx0XHRcdFx0bWF0Y2hlciggaW5wdXQsIG51bGwsIHhtbCwgcmVzdWx0cyApO1xuXHRcdFx0XHRcdC8vIERvbid0IGtlZXAgdGhlIGVsZW1lbnQgKGlzc3VlICMyOTkpXG5cdFx0XHRcdFx0aW5wdXRbMF0gPSBudWxsO1xuXHRcdFx0XHRcdHJldHVybiAhcmVzdWx0cy5wb3AoKTtcblx0XHRcdFx0fTtcblx0XHR9KSxcblxuXHRcdFwiaGFzXCI6IG1hcmtGdW5jdGlvbihmdW5jdGlvbiggc2VsZWN0b3IgKSB7XG5cdFx0XHRyZXR1cm4gZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHRcdHJldHVybiBTaXp6bGUoIHNlbGVjdG9yLCBlbGVtICkubGVuZ3RoID4gMDtcblx0XHRcdH07XG5cdFx0fSksXG5cblx0XHRcImNvbnRhaW5zXCI6IG1hcmtGdW5jdGlvbihmdW5jdGlvbiggdGV4dCApIHtcblx0XHRcdHRleHQgPSB0ZXh0LnJlcGxhY2UoIHJ1bmVzY2FwZSwgZnVuZXNjYXBlICk7XG5cdFx0XHRyZXR1cm4gZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHRcdHJldHVybiAoIGVsZW0udGV4dENvbnRlbnQgfHwgZWxlbS5pbm5lclRleHQgfHwgZ2V0VGV4dCggZWxlbSApICkuaW5kZXhPZiggdGV4dCApID4gLTE7XG5cdFx0XHR9O1xuXHRcdH0pLFxuXG5cdFx0Ly8gXCJXaGV0aGVyIGFuIGVsZW1lbnQgaXMgcmVwcmVzZW50ZWQgYnkgYSA6bGFuZygpIHNlbGVjdG9yXG5cdFx0Ly8gaXMgYmFzZWQgc29sZWx5IG9uIHRoZSBlbGVtZW50J3MgbGFuZ3VhZ2UgdmFsdWVcblx0XHQvLyBiZWluZyBlcXVhbCB0byB0aGUgaWRlbnRpZmllciBDLFxuXHRcdC8vIG9yIGJlZ2lubmluZyB3aXRoIHRoZSBpZGVudGlmaWVyIEMgaW1tZWRpYXRlbHkgZm9sbG93ZWQgYnkgXCItXCIuXG5cdFx0Ly8gVGhlIG1hdGNoaW5nIG9mIEMgYWdhaW5zdCB0aGUgZWxlbWVudCdzIGxhbmd1YWdlIHZhbHVlIGlzIHBlcmZvcm1lZCBjYXNlLWluc2Vuc2l0aXZlbHkuXG5cdFx0Ly8gVGhlIGlkZW50aWZpZXIgQyBkb2VzIG5vdCBoYXZlIHRvIGJlIGEgdmFsaWQgbGFuZ3VhZ2UgbmFtZS5cIlxuXHRcdC8vIGh0dHA6Ly93d3cudzMub3JnL1RSL3NlbGVjdG9ycy8jbGFuZy1wc2V1ZG9cblx0XHRcImxhbmdcIjogbWFya0Z1bmN0aW9uKCBmdW5jdGlvbiggbGFuZyApIHtcblx0XHRcdC8vIGxhbmcgdmFsdWUgbXVzdCBiZSBhIHZhbGlkIGlkZW50aWZpZXJcblx0XHRcdGlmICggIXJpZGVudGlmaWVyLnRlc3QobGFuZyB8fCBcIlwiKSApIHtcblx0XHRcdFx0U2l6emxlLmVycm9yKCBcInVuc3VwcG9ydGVkIGxhbmc6IFwiICsgbGFuZyApO1xuXHRcdFx0fVxuXHRcdFx0bGFuZyA9IGxhbmcucmVwbGFjZSggcnVuZXNjYXBlLCBmdW5lc2NhcGUgKS50b0xvd2VyQ2FzZSgpO1xuXHRcdFx0cmV0dXJuIGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0XHR2YXIgZWxlbUxhbmc7XG5cdFx0XHRcdGRvIHtcblx0XHRcdFx0XHRpZiAoIChlbGVtTGFuZyA9IGRvY3VtZW50SXNIVE1MID9cblx0XHRcdFx0XHRcdGVsZW0ubGFuZyA6XG5cdFx0XHRcdFx0XHRlbGVtLmdldEF0dHJpYnV0ZShcInhtbDpsYW5nXCIpIHx8IGVsZW0uZ2V0QXR0cmlidXRlKFwibGFuZ1wiKSkgKSB7XG5cblx0XHRcdFx0XHRcdGVsZW1MYW5nID0gZWxlbUxhbmcudG9Mb3dlckNhc2UoKTtcblx0XHRcdFx0XHRcdHJldHVybiBlbGVtTGFuZyA9PT0gbGFuZyB8fCBlbGVtTGFuZy5pbmRleE9mKCBsYW5nICsgXCItXCIgKSA9PT0gMDtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0gd2hpbGUgKCAoZWxlbSA9IGVsZW0ucGFyZW50Tm9kZSkgJiYgZWxlbS5ub2RlVHlwZSA9PT0gMSApO1xuXHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHR9O1xuXHRcdH0pLFxuXG5cdFx0Ly8gTWlzY2VsbGFuZW91c1xuXHRcdFwidGFyZ2V0XCI6IGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0dmFyIGhhc2ggPSB3aW5kb3cubG9jYXRpb24gJiYgd2luZG93LmxvY2F0aW9uLmhhc2g7XG5cdFx0XHRyZXR1cm4gaGFzaCAmJiBoYXNoLnNsaWNlKCAxICkgPT09IGVsZW0uaWQ7XG5cdFx0fSxcblxuXHRcdFwicm9vdFwiOiBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdHJldHVybiBlbGVtID09PSBkb2NFbGVtO1xuXHRcdH0sXG5cblx0XHRcImZvY3VzXCI6IGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0cmV0dXJuIGVsZW0gPT09IGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQgJiYgKCFkb2N1bWVudC5oYXNGb2N1cyB8fCBkb2N1bWVudC5oYXNGb2N1cygpKSAmJiAhIShlbGVtLnR5cGUgfHwgZWxlbS5ocmVmIHx8IH5lbGVtLnRhYkluZGV4KTtcblx0XHR9LFxuXG5cdFx0Ly8gQm9vbGVhbiBwcm9wZXJ0aWVzXG5cdFx0XCJlbmFibGVkXCI6IGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0cmV0dXJuIGVsZW0uZGlzYWJsZWQgPT09IGZhbHNlO1xuXHRcdH0sXG5cblx0XHRcImRpc2FibGVkXCI6IGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0cmV0dXJuIGVsZW0uZGlzYWJsZWQgPT09IHRydWU7XG5cdFx0fSxcblxuXHRcdFwiY2hlY2tlZFwiOiBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdC8vIEluIENTUzMsIDpjaGVja2VkIHNob3VsZCByZXR1cm4gYm90aCBjaGVja2VkIGFuZCBzZWxlY3RlZCBlbGVtZW50c1xuXHRcdFx0Ly8gaHR0cDovL3d3dy53My5vcmcvVFIvMjAxMS9SRUMtY3NzMy1zZWxlY3RvcnMtMjAxMTA5MjkvI2NoZWNrZWRcblx0XHRcdHZhciBub2RlTmFtZSA9IGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKTtcblx0XHRcdHJldHVybiAobm9kZU5hbWUgPT09IFwiaW5wdXRcIiAmJiAhIWVsZW0uY2hlY2tlZCkgfHwgKG5vZGVOYW1lID09PSBcIm9wdGlvblwiICYmICEhZWxlbS5zZWxlY3RlZCk7XG5cdFx0fSxcblxuXHRcdFwic2VsZWN0ZWRcIjogZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHQvLyBBY2Nlc3NpbmcgdGhpcyBwcm9wZXJ0eSBtYWtlcyBzZWxlY3RlZC1ieS1kZWZhdWx0XG5cdFx0XHQvLyBvcHRpb25zIGluIFNhZmFyaSB3b3JrIHByb3Blcmx5XG5cdFx0XHRpZiAoIGVsZW0ucGFyZW50Tm9kZSApIHtcblx0XHRcdFx0ZWxlbS5wYXJlbnROb2RlLnNlbGVjdGVkSW5kZXg7XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiBlbGVtLnNlbGVjdGVkID09PSB0cnVlO1xuXHRcdH0sXG5cblx0XHQvLyBDb250ZW50c1xuXHRcdFwiZW1wdHlcIjogZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHQvLyBodHRwOi8vd3d3LnczLm9yZy9UUi9zZWxlY3RvcnMvI2VtcHR5LXBzZXVkb1xuXHRcdFx0Ly8gOmVtcHR5IGlzIG5lZ2F0ZWQgYnkgZWxlbWVudCAoMSkgb3IgY29udGVudCBub2RlcyAodGV4dDogMzsgY2RhdGE6IDQ7IGVudGl0eSByZWY6IDUpLFxuXHRcdFx0Ly8gICBidXQgbm90IGJ5IG90aGVycyAoY29tbWVudDogODsgcHJvY2Vzc2luZyBpbnN0cnVjdGlvbjogNzsgZXRjLilcblx0XHRcdC8vIG5vZGVUeXBlIDwgNiB3b3JrcyBiZWNhdXNlIGF0dHJpYnV0ZXMgKDIpIGRvIG5vdCBhcHBlYXIgYXMgY2hpbGRyZW5cblx0XHRcdGZvciAoIGVsZW0gPSBlbGVtLmZpcnN0Q2hpbGQ7IGVsZW07IGVsZW0gPSBlbGVtLm5leHRTaWJsaW5nICkge1xuXHRcdFx0XHRpZiAoIGVsZW0ubm9kZVR5cGUgPCA2ICkge1xuXHRcdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0fSxcblxuXHRcdFwicGFyZW50XCI6IGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0cmV0dXJuICFFeHByLnBzZXVkb3NbXCJlbXB0eVwiXSggZWxlbSApO1xuXHRcdH0sXG5cblx0XHQvLyBFbGVtZW50L2lucHV0IHR5cGVzXG5cdFx0XCJoZWFkZXJcIjogZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHRyZXR1cm4gcmhlYWRlci50ZXN0KCBlbGVtLm5vZGVOYW1lICk7XG5cdFx0fSxcblxuXHRcdFwiaW5wdXRcIjogZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHRyZXR1cm4gcmlucHV0cy50ZXN0KCBlbGVtLm5vZGVOYW1lICk7XG5cdFx0fSxcblxuXHRcdFwiYnV0dG9uXCI6IGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0dmFyIG5hbWUgPSBlbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCk7XG5cdFx0XHRyZXR1cm4gbmFtZSA9PT0gXCJpbnB1dFwiICYmIGVsZW0udHlwZSA9PT0gXCJidXR0b25cIiB8fCBuYW1lID09PSBcImJ1dHRvblwiO1xuXHRcdH0sXG5cblx0XHRcInRleHRcIjogZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHR2YXIgYXR0cjtcblx0XHRcdHJldHVybiBlbGVtLm5vZGVOYW1lLnRvTG93ZXJDYXNlKCkgPT09IFwiaW5wdXRcIiAmJlxuXHRcdFx0XHRlbGVtLnR5cGUgPT09IFwidGV4dFwiICYmXG5cblx0XHRcdFx0Ly8gU3VwcG9ydDogSUU8OFxuXHRcdFx0XHQvLyBOZXcgSFRNTDUgYXR0cmlidXRlIHZhbHVlcyAoZS5nLiwgXCJzZWFyY2hcIikgYXBwZWFyIHdpdGggZWxlbS50eXBlID09PSBcInRleHRcIlxuXHRcdFx0XHQoIChhdHRyID0gZWxlbS5nZXRBdHRyaWJ1dGUoXCJ0eXBlXCIpKSA9PSBudWxsIHx8IGF0dHIudG9Mb3dlckNhc2UoKSA9PT0gXCJ0ZXh0XCIgKTtcblx0XHR9LFxuXG5cdFx0Ly8gUG9zaXRpb24taW4tY29sbGVjdGlvblxuXHRcdFwiZmlyc3RcIjogY3JlYXRlUG9zaXRpb25hbFBzZXVkbyhmdW5jdGlvbigpIHtcblx0XHRcdHJldHVybiBbIDAgXTtcblx0XHR9KSxcblxuXHRcdFwibGFzdFwiOiBjcmVhdGVQb3NpdGlvbmFsUHNldWRvKGZ1bmN0aW9uKCBtYXRjaEluZGV4ZXMsIGxlbmd0aCApIHtcblx0XHRcdHJldHVybiBbIGxlbmd0aCAtIDEgXTtcblx0XHR9KSxcblxuXHRcdFwiZXFcIjogY3JlYXRlUG9zaXRpb25hbFBzZXVkbyhmdW5jdGlvbiggbWF0Y2hJbmRleGVzLCBsZW5ndGgsIGFyZ3VtZW50ICkge1xuXHRcdFx0cmV0dXJuIFsgYXJndW1lbnQgPCAwID8gYXJndW1lbnQgKyBsZW5ndGggOiBhcmd1bWVudCBdO1xuXHRcdH0pLFxuXG5cdFx0XCJldmVuXCI6IGNyZWF0ZVBvc2l0aW9uYWxQc2V1ZG8oZnVuY3Rpb24oIG1hdGNoSW5kZXhlcywgbGVuZ3RoICkge1xuXHRcdFx0dmFyIGkgPSAwO1xuXHRcdFx0Zm9yICggOyBpIDwgbGVuZ3RoOyBpICs9IDIgKSB7XG5cdFx0XHRcdG1hdGNoSW5kZXhlcy5wdXNoKCBpICk7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gbWF0Y2hJbmRleGVzO1xuXHRcdH0pLFxuXG5cdFx0XCJvZGRcIjogY3JlYXRlUG9zaXRpb25hbFBzZXVkbyhmdW5jdGlvbiggbWF0Y2hJbmRleGVzLCBsZW5ndGggKSB7XG5cdFx0XHR2YXIgaSA9IDE7XG5cdFx0XHRmb3IgKCA7IGkgPCBsZW5ndGg7IGkgKz0gMiApIHtcblx0XHRcdFx0bWF0Y2hJbmRleGVzLnB1c2goIGkgKTtcblx0XHRcdH1cblx0XHRcdHJldHVybiBtYXRjaEluZGV4ZXM7XG5cdFx0fSksXG5cblx0XHRcImx0XCI6IGNyZWF0ZVBvc2l0aW9uYWxQc2V1ZG8oZnVuY3Rpb24oIG1hdGNoSW5kZXhlcywgbGVuZ3RoLCBhcmd1bWVudCApIHtcblx0XHRcdHZhciBpID0gYXJndW1lbnQgPCAwID8gYXJndW1lbnQgKyBsZW5ndGggOiBhcmd1bWVudDtcblx0XHRcdGZvciAoIDsgLS1pID49IDA7ICkge1xuXHRcdFx0XHRtYXRjaEluZGV4ZXMucHVzaCggaSApO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIG1hdGNoSW5kZXhlcztcblx0XHR9KSxcblxuXHRcdFwiZ3RcIjogY3JlYXRlUG9zaXRpb25hbFBzZXVkbyhmdW5jdGlvbiggbWF0Y2hJbmRleGVzLCBsZW5ndGgsIGFyZ3VtZW50ICkge1xuXHRcdFx0dmFyIGkgPSBhcmd1bWVudCA8IDAgPyBhcmd1bWVudCArIGxlbmd0aCA6IGFyZ3VtZW50O1xuXHRcdFx0Zm9yICggOyArK2kgPCBsZW5ndGg7ICkge1xuXHRcdFx0XHRtYXRjaEluZGV4ZXMucHVzaCggaSApO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIG1hdGNoSW5kZXhlcztcblx0XHR9KVxuXHR9XG59O1xuXG5FeHByLnBzZXVkb3NbXCJudGhcIl0gPSBFeHByLnBzZXVkb3NbXCJlcVwiXTtcblxuLy8gQWRkIGJ1dHRvbi9pbnB1dCB0eXBlIHBzZXVkb3NcbmZvciAoIGkgaW4geyByYWRpbzogdHJ1ZSwgY2hlY2tib3g6IHRydWUsIGZpbGU6IHRydWUsIHBhc3N3b3JkOiB0cnVlLCBpbWFnZTogdHJ1ZSB9ICkge1xuXHRFeHByLnBzZXVkb3NbIGkgXSA9IGNyZWF0ZUlucHV0UHNldWRvKCBpICk7XG59XG5mb3IgKCBpIGluIHsgc3VibWl0OiB0cnVlLCByZXNldDogdHJ1ZSB9ICkge1xuXHRFeHByLnBzZXVkb3NbIGkgXSA9IGNyZWF0ZUJ1dHRvblBzZXVkbyggaSApO1xufVxuXG4vLyBFYXN5IEFQSSBmb3IgY3JlYXRpbmcgbmV3IHNldEZpbHRlcnNcbmZ1bmN0aW9uIHNldEZpbHRlcnMoKSB7fVxuc2V0RmlsdGVycy5wcm90b3R5cGUgPSBFeHByLmZpbHRlcnMgPSBFeHByLnBzZXVkb3M7XG5FeHByLnNldEZpbHRlcnMgPSBuZXcgc2V0RmlsdGVycygpO1xuXG50b2tlbml6ZSA9IFNpenpsZS50b2tlbml6ZSA9IGZ1bmN0aW9uKCBzZWxlY3RvciwgcGFyc2VPbmx5ICkge1xuXHR2YXIgbWF0Y2hlZCwgbWF0Y2gsIHRva2VucywgdHlwZSxcblx0XHRzb0ZhciwgZ3JvdXBzLCBwcmVGaWx0ZXJzLFxuXHRcdGNhY2hlZCA9IHRva2VuQ2FjaGVbIHNlbGVjdG9yICsgXCIgXCIgXTtcblxuXHRpZiAoIGNhY2hlZCApIHtcblx0XHRyZXR1cm4gcGFyc2VPbmx5ID8gMCA6IGNhY2hlZC5zbGljZSggMCApO1xuXHR9XG5cblx0c29GYXIgPSBzZWxlY3Rvcjtcblx0Z3JvdXBzID0gW107XG5cdHByZUZpbHRlcnMgPSBFeHByLnByZUZpbHRlcjtcblxuXHR3aGlsZSAoIHNvRmFyICkge1xuXG5cdFx0Ly8gQ29tbWEgYW5kIGZpcnN0IHJ1blxuXHRcdGlmICggIW1hdGNoZWQgfHwgKG1hdGNoID0gcmNvbW1hLmV4ZWMoIHNvRmFyICkpICkge1xuXHRcdFx0aWYgKCBtYXRjaCApIHtcblx0XHRcdFx0Ly8gRG9uJ3QgY29uc3VtZSB0cmFpbGluZyBjb21tYXMgYXMgdmFsaWRcblx0XHRcdFx0c29GYXIgPSBzb0Zhci5zbGljZSggbWF0Y2hbMF0ubGVuZ3RoICkgfHwgc29GYXI7XG5cdFx0XHR9XG5cdFx0XHRncm91cHMucHVzaCggKHRva2VucyA9IFtdKSApO1xuXHRcdH1cblxuXHRcdG1hdGNoZWQgPSBmYWxzZTtcblxuXHRcdC8vIENvbWJpbmF0b3JzXG5cdFx0aWYgKCAobWF0Y2ggPSByY29tYmluYXRvcnMuZXhlYyggc29GYXIgKSkgKSB7XG5cdFx0XHRtYXRjaGVkID0gbWF0Y2guc2hpZnQoKTtcblx0XHRcdHRva2Vucy5wdXNoKHtcblx0XHRcdFx0dmFsdWU6IG1hdGNoZWQsXG5cdFx0XHRcdC8vIENhc3QgZGVzY2VuZGFudCBjb21iaW5hdG9ycyB0byBzcGFjZVxuXHRcdFx0XHR0eXBlOiBtYXRjaFswXS5yZXBsYWNlKCBydHJpbSwgXCIgXCIgKVxuXHRcdFx0fSk7XG5cdFx0XHRzb0ZhciA9IHNvRmFyLnNsaWNlKCBtYXRjaGVkLmxlbmd0aCApO1xuXHRcdH1cblxuXHRcdC8vIEZpbHRlcnNcblx0XHRmb3IgKCB0eXBlIGluIEV4cHIuZmlsdGVyICkge1xuXHRcdFx0aWYgKCAobWF0Y2ggPSBtYXRjaEV4cHJbIHR5cGUgXS5leGVjKCBzb0ZhciApKSAmJiAoIXByZUZpbHRlcnNbIHR5cGUgXSB8fFxuXHRcdFx0XHQobWF0Y2ggPSBwcmVGaWx0ZXJzWyB0eXBlIF0oIG1hdGNoICkpKSApIHtcblx0XHRcdFx0bWF0Y2hlZCA9IG1hdGNoLnNoaWZ0KCk7XG5cdFx0XHRcdHRva2Vucy5wdXNoKHtcblx0XHRcdFx0XHR2YWx1ZTogbWF0Y2hlZCxcblx0XHRcdFx0XHR0eXBlOiB0eXBlLFxuXHRcdFx0XHRcdG1hdGNoZXM6IG1hdGNoXG5cdFx0XHRcdH0pO1xuXHRcdFx0XHRzb0ZhciA9IHNvRmFyLnNsaWNlKCBtYXRjaGVkLmxlbmd0aCApO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdGlmICggIW1hdGNoZWQgKSB7XG5cdFx0XHRicmVhaztcblx0XHR9XG5cdH1cblxuXHQvLyBSZXR1cm4gdGhlIGxlbmd0aCBvZiB0aGUgaW52YWxpZCBleGNlc3Ncblx0Ly8gaWYgd2UncmUganVzdCBwYXJzaW5nXG5cdC8vIE90aGVyd2lzZSwgdGhyb3cgYW4gZXJyb3Igb3IgcmV0dXJuIHRva2Vuc1xuXHRyZXR1cm4gcGFyc2VPbmx5ID9cblx0XHRzb0Zhci5sZW5ndGggOlxuXHRcdHNvRmFyID9cblx0XHRcdFNpenpsZS5lcnJvciggc2VsZWN0b3IgKSA6XG5cdFx0XHQvLyBDYWNoZSB0aGUgdG9rZW5zXG5cdFx0XHR0b2tlbkNhY2hlKCBzZWxlY3RvciwgZ3JvdXBzICkuc2xpY2UoIDAgKTtcbn07XG5cbmZ1bmN0aW9uIHRvU2VsZWN0b3IoIHRva2VucyApIHtcblx0dmFyIGkgPSAwLFxuXHRcdGxlbiA9IHRva2Vucy5sZW5ndGgsXG5cdFx0c2VsZWN0b3IgPSBcIlwiO1xuXHRmb3IgKCA7IGkgPCBsZW47IGkrKyApIHtcblx0XHRzZWxlY3RvciArPSB0b2tlbnNbaV0udmFsdWU7XG5cdH1cblx0cmV0dXJuIHNlbGVjdG9yO1xufVxuXG5mdW5jdGlvbiBhZGRDb21iaW5hdG9yKCBtYXRjaGVyLCBjb21iaW5hdG9yLCBiYXNlICkge1xuXHR2YXIgZGlyID0gY29tYmluYXRvci5kaXIsXG5cdFx0Y2hlY2tOb25FbGVtZW50cyA9IGJhc2UgJiYgZGlyID09PSBcInBhcmVudE5vZGVcIixcblx0XHRkb25lTmFtZSA9IGRvbmUrKztcblxuXHRyZXR1cm4gY29tYmluYXRvci5maXJzdCA/XG5cdFx0Ly8gQ2hlY2sgYWdhaW5zdCBjbG9zZXN0IGFuY2VzdG9yL3ByZWNlZGluZyBlbGVtZW50XG5cdFx0ZnVuY3Rpb24oIGVsZW0sIGNvbnRleHQsIHhtbCApIHtcblx0XHRcdHdoaWxlICggKGVsZW0gPSBlbGVtWyBkaXIgXSkgKSB7XG5cdFx0XHRcdGlmICggZWxlbS5ub2RlVHlwZSA9PT0gMSB8fCBjaGVja05vbkVsZW1lbnRzICkge1xuXHRcdFx0XHRcdHJldHVybiBtYXRjaGVyKCBlbGVtLCBjb250ZXh0LCB4bWwgKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0gOlxuXG5cdFx0Ly8gQ2hlY2sgYWdhaW5zdCBhbGwgYW5jZXN0b3IvcHJlY2VkaW5nIGVsZW1lbnRzXG5cdFx0ZnVuY3Rpb24oIGVsZW0sIGNvbnRleHQsIHhtbCApIHtcblx0XHRcdHZhciBvbGRDYWNoZSwgdW5pcXVlQ2FjaGUsIG91dGVyQ2FjaGUsXG5cdFx0XHRcdG5ld0NhY2hlID0gWyBkaXJydW5zLCBkb25lTmFtZSBdO1xuXG5cdFx0XHQvLyBXZSBjYW4ndCBzZXQgYXJiaXRyYXJ5IGRhdGEgb24gWE1MIG5vZGVzLCBzbyB0aGV5IGRvbid0IGJlbmVmaXQgZnJvbSBjb21iaW5hdG9yIGNhY2hpbmdcblx0XHRcdGlmICggeG1sICkge1xuXHRcdFx0XHR3aGlsZSAoIChlbGVtID0gZWxlbVsgZGlyIF0pICkge1xuXHRcdFx0XHRcdGlmICggZWxlbS5ub2RlVHlwZSA9PT0gMSB8fCBjaGVja05vbkVsZW1lbnRzICkge1xuXHRcdFx0XHRcdFx0aWYgKCBtYXRjaGVyKCBlbGVtLCBjb250ZXh0LCB4bWwgKSApIHtcblx0XHRcdFx0XHRcdFx0cmV0dXJuIHRydWU7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHR3aGlsZSAoIChlbGVtID0gZWxlbVsgZGlyIF0pICkge1xuXHRcdFx0XHRcdGlmICggZWxlbS5ub2RlVHlwZSA9PT0gMSB8fCBjaGVja05vbkVsZW1lbnRzICkge1xuXHRcdFx0XHRcdFx0b3V0ZXJDYWNoZSA9IGVsZW1bIGV4cGFuZG8gXSB8fCAoZWxlbVsgZXhwYW5kbyBdID0ge30pO1xuXG5cdFx0XHRcdFx0XHQvLyBTdXBwb3J0OiBJRSA8OSBvbmx5XG5cdFx0XHRcdFx0XHQvLyBEZWZlbmQgYWdhaW5zdCBjbG9uZWQgYXR0cm9wZXJ0aWVzIChqUXVlcnkgZ2gtMTcwOSlcblx0XHRcdFx0XHRcdHVuaXF1ZUNhY2hlID0gb3V0ZXJDYWNoZVsgZWxlbS51bmlxdWVJRCBdIHx8IChvdXRlckNhY2hlWyBlbGVtLnVuaXF1ZUlEIF0gPSB7fSk7XG5cblx0XHRcdFx0XHRcdGlmICggKG9sZENhY2hlID0gdW5pcXVlQ2FjaGVbIGRpciBdKSAmJlxuXHRcdFx0XHRcdFx0XHRvbGRDYWNoZVsgMCBdID09PSBkaXJydW5zICYmIG9sZENhY2hlWyAxIF0gPT09IGRvbmVOYW1lICkge1xuXG5cdFx0XHRcdFx0XHRcdC8vIEFzc2lnbiB0byBuZXdDYWNoZSBzbyByZXN1bHRzIGJhY2stcHJvcGFnYXRlIHRvIHByZXZpb3VzIGVsZW1lbnRzXG5cdFx0XHRcdFx0XHRcdHJldHVybiAobmV3Q2FjaGVbIDIgXSA9IG9sZENhY2hlWyAyIF0pO1xuXHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0Ly8gUmV1c2UgbmV3Y2FjaGUgc28gcmVzdWx0cyBiYWNrLXByb3BhZ2F0ZSB0byBwcmV2aW91cyBlbGVtZW50c1xuXHRcdFx0XHRcdFx0XHR1bmlxdWVDYWNoZVsgZGlyIF0gPSBuZXdDYWNoZTtcblxuXHRcdFx0XHRcdFx0XHQvLyBBIG1hdGNoIG1lYW5zIHdlJ3JlIGRvbmU7IGEgZmFpbCBtZWFucyB3ZSBoYXZlIHRvIGtlZXAgY2hlY2tpbmdcblx0XHRcdFx0XHRcdFx0aWYgKCAobmV3Q2FjaGVbIDIgXSA9IG1hdGNoZXIoIGVsZW0sIGNvbnRleHQsIHhtbCApKSApIHtcblx0XHRcdFx0XHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH07XG59XG5cbmZ1bmN0aW9uIGVsZW1lbnRNYXRjaGVyKCBtYXRjaGVycyApIHtcblx0cmV0dXJuIG1hdGNoZXJzLmxlbmd0aCA+IDEgP1xuXHRcdGZ1bmN0aW9uKCBlbGVtLCBjb250ZXh0LCB4bWwgKSB7XG5cdFx0XHR2YXIgaSA9IG1hdGNoZXJzLmxlbmd0aDtcblx0XHRcdHdoaWxlICggaS0tICkge1xuXHRcdFx0XHRpZiAoICFtYXRjaGVyc1tpXSggZWxlbSwgY29udGV4dCwgeG1sICkgKSB7XG5cdFx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHR9IDpcblx0XHRtYXRjaGVyc1swXTtcbn1cblxuZnVuY3Rpb24gbXVsdGlwbGVDb250ZXh0cyggc2VsZWN0b3IsIGNvbnRleHRzLCByZXN1bHRzICkge1xuXHR2YXIgaSA9IDAsXG5cdFx0bGVuID0gY29udGV4dHMubGVuZ3RoO1xuXHRmb3IgKCA7IGkgPCBsZW47IGkrKyApIHtcblx0XHRTaXp6bGUoIHNlbGVjdG9yLCBjb250ZXh0c1tpXSwgcmVzdWx0cyApO1xuXHR9XG5cdHJldHVybiByZXN1bHRzO1xufVxuXG5mdW5jdGlvbiBjb25kZW5zZSggdW5tYXRjaGVkLCBtYXAsIGZpbHRlciwgY29udGV4dCwgeG1sICkge1xuXHR2YXIgZWxlbSxcblx0XHRuZXdVbm1hdGNoZWQgPSBbXSxcblx0XHRpID0gMCxcblx0XHRsZW4gPSB1bm1hdGNoZWQubGVuZ3RoLFxuXHRcdG1hcHBlZCA9IG1hcCAhPSBudWxsO1xuXG5cdGZvciAoIDsgaSA8IGxlbjsgaSsrICkge1xuXHRcdGlmICggKGVsZW0gPSB1bm1hdGNoZWRbaV0pICkge1xuXHRcdFx0aWYgKCAhZmlsdGVyIHx8IGZpbHRlciggZWxlbSwgY29udGV4dCwgeG1sICkgKSB7XG5cdFx0XHRcdG5ld1VubWF0Y2hlZC5wdXNoKCBlbGVtICk7XG5cdFx0XHRcdGlmICggbWFwcGVkICkge1xuXHRcdFx0XHRcdG1hcC5wdXNoKCBpICk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHRyZXR1cm4gbmV3VW5tYXRjaGVkO1xufVxuXG5mdW5jdGlvbiBzZXRNYXRjaGVyKCBwcmVGaWx0ZXIsIHNlbGVjdG9yLCBtYXRjaGVyLCBwb3N0RmlsdGVyLCBwb3N0RmluZGVyLCBwb3N0U2VsZWN0b3IgKSB7XG5cdGlmICggcG9zdEZpbHRlciAmJiAhcG9zdEZpbHRlclsgZXhwYW5kbyBdICkge1xuXHRcdHBvc3RGaWx0ZXIgPSBzZXRNYXRjaGVyKCBwb3N0RmlsdGVyICk7XG5cdH1cblx0aWYgKCBwb3N0RmluZGVyICYmICFwb3N0RmluZGVyWyBleHBhbmRvIF0gKSB7XG5cdFx0cG9zdEZpbmRlciA9IHNldE1hdGNoZXIoIHBvc3RGaW5kZXIsIHBvc3RTZWxlY3RvciApO1xuXHR9XG5cdHJldHVybiBtYXJrRnVuY3Rpb24oZnVuY3Rpb24oIHNlZWQsIHJlc3VsdHMsIGNvbnRleHQsIHhtbCApIHtcblx0XHR2YXIgdGVtcCwgaSwgZWxlbSxcblx0XHRcdHByZU1hcCA9IFtdLFxuXHRcdFx0cG9zdE1hcCA9IFtdLFxuXHRcdFx0cHJlZXhpc3RpbmcgPSByZXN1bHRzLmxlbmd0aCxcblxuXHRcdFx0Ly8gR2V0IGluaXRpYWwgZWxlbWVudHMgZnJvbSBzZWVkIG9yIGNvbnRleHRcblx0XHRcdGVsZW1zID0gc2VlZCB8fCBtdWx0aXBsZUNvbnRleHRzKCBzZWxlY3RvciB8fCBcIipcIiwgY29udGV4dC5ub2RlVHlwZSA/IFsgY29udGV4dCBdIDogY29udGV4dCwgW10gKSxcblxuXHRcdFx0Ly8gUHJlZmlsdGVyIHRvIGdldCBtYXRjaGVyIGlucHV0LCBwcmVzZXJ2aW5nIGEgbWFwIGZvciBzZWVkLXJlc3VsdHMgc3luY2hyb25pemF0aW9uXG5cdFx0XHRtYXRjaGVySW4gPSBwcmVGaWx0ZXIgJiYgKCBzZWVkIHx8ICFzZWxlY3RvciApID9cblx0XHRcdFx0Y29uZGVuc2UoIGVsZW1zLCBwcmVNYXAsIHByZUZpbHRlciwgY29udGV4dCwgeG1sICkgOlxuXHRcdFx0XHRlbGVtcyxcblxuXHRcdFx0bWF0Y2hlck91dCA9IG1hdGNoZXIgP1xuXHRcdFx0XHQvLyBJZiB3ZSBoYXZlIGEgcG9zdEZpbmRlciwgb3IgZmlsdGVyZWQgc2VlZCwgb3Igbm9uLXNlZWQgcG9zdEZpbHRlciBvciBwcmVleGlzdGluZyByZXN1bHRzLFxuXHRcdFx0XHRwb3N0RmluZGVyIHx8ICggc2VlZCA/IHByZUZpbHRlciA6IHByZWV4aXN0aW5nIHx8IHBvc3RGaWx0ZXIgKSA/XG5cblx0XHRcdFx0XHQvLyAuLi5pbnRlcm1lZGlhdGUgcHJvY2Vzc2luZyBpcyBuZWNlc3Nhcnlcblx0XHRcdFx0XHRbXSA6XG5cblx0XHRcdFx0XHQvLyAuLi5vdGhlcndpc2UgdXNlIHJlc3VsdHMgZGlyZWN0bHlcblx0XHRcdFx0XHRyZXN1bHRzIDpcblx0XHRcdFx0bWF0Y2hlckluO1xuXG5cdFx0Ly8gRmluZCBwcmltYXJ5IG1hdGNoZXNcblx0XHRpZiAoIG1hdGNoZXIgKSB7XG5cdFx0XHRtYXRjaGVyKCBtYXRjaGVySW4sIG1hdGNoZXJPdXQsIGNvbnRleHQsIHhtbCApO1xuXHRcdH1cblxuXHRcdC8vIEFwcGx5IHBvc3RGaWx0ZXJcblx0XHRpZiAoIHBvc3RGaWx0ZXIgKSB7XG5cdFx0XHR0ZW1wID0gY29uZGVuc2UoIG1hdGNoZXJPdXQsIHBvc3RNYXAgKTtcblx0XHRcdHBvc3RGaWx0ZXIoIHRlbXAsIFtdLCBjb250ZXh0LCB4bWwgKTtcblxuXHRcdFx0Ly8gVW4tbWF0Y2ggZmFpbGluZyBlbGVtZW50cyBieSBtb3ZpbmcgdGhlbSBiYWNrIHRvIG1hdGNoZXJJblxuXHRcdFx0aSA9IHRlbXAubGVuZ3RoO1xuXHRcdFx0d2hpbGUgKCBpLS0gKSB7XG5cdFx0XHRcdGlmICggKGVsZW0gPSB0ZW1wW2ldKSApIHtcblx0XHRcdFx0XHRtYXRjaGVyT3V0WyBwb3N0TWFwW2ldIF0gPSAhKG1hdGNoZXJJblsgcG9zdE1hcFtpXSBdID0gZWxlbSk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHRpZiAoIHNlZWQgKSB7XG5cdFx0XHRpZiAoIHBvc3RGaW5kZXIgfHwgcHJlRmlsdGVyICkge1xuXHRcdFx0XHRpZiAoIHBvc3RGaW5kZXIgKSB7XG5cdFx0XHRcdFx0Ly8gR2V0IHRoZSBmaW5hbCBtYXRjaGVyT3V0IGJ5IGNvbmRlbnNpbmcgdGhpcyBpbnRlcm1lZGlhdGUgaW50byBwb3N0RmluZGVyIGNvbnRleHRzXG5cdFx0XHRcdFx0dGVtcCA9IFtdO1xuXHRcdFx0XHRcdGkgPSBtYXRjaGVyT3V0Lmxlbmd0aDtcblx0XHRcdFx0XHR3aGlsZSAoIGktLSApIHtcblx0XHRcdFx0XHRcdGlmICggKGVsZW0gPSBtYXRjaGVyT3V0W2ldKSApIHtcblx0XHRcdFx0XHRcdFx0Ly8gUmVzdG9yZSBtYXRjaGVySW4gc2luY2UgZWxlbSBpcyBub3QgeWV0IGEgZmluYWwgbWF0Y2hcblx0XHRcdFx0XHRcdFx0dGVtcC5wdXNoKCAobWF0Y2hlckluW2ldID0gZWxlbSkgKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0cG9zdEZpbmRlciggbnVsbCwgKG1hdGNoZXJPdXQgPSBbXSksIHRlbXAsIHhtbCApO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gTW92ZSBtYXRjaGVkIGVsZW1lbnRzIGZyb20gc2VlZCB0byByZXN1bHRzIHRvIGtlZXAgdGhlbSBzeW5jaHJvbml6ZWRcblx0XHRcdFx0aSA9IG1hdGNoZXJPdXQubGVuZ3RoO1xuXHRcdFx0XHR3aGlsZSAoIGktLSApIHtcblx0XHRcdFx0XHRpZiAoIChlbGVtID0gbWF0Y2hlck91dFtpXSkgJiZcblx0XHRcdFx0XHRcdCh0ZW1wID0gcG9zdEZpbmRlciA/IGluZGV4T2YoIHNlZWQsIGVsZW0gKSA6IHByZU1hcFtpXSkgPiAtMSApIHtcblxuXHRcdFx0XHRcdFx0c2VlZFt0ZW1wXSA9ICEocmVzdWx0c1t0ZW1wXSA9IGVsZW0pO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0Ly8gQWRkIGVsZW1lbnRzIHRvIHJlc3VsdHMsIHRocm91Z2ggcG9zdEZpbmRlciBpZiBkZWZpbmVkXG5cdFx0fSBlbHNlIHtcblx0XHRcdG1hdGNoZXJPdXQgPSBjb25kZW5zZShcblx0XHRcdFx0bWF0Y2hlck91dCA9PT0gcmVzdWx0cyA/XG5cdFx0XHRcdFx0bWF0Y2hlck91dC5zcGxpY2UoIHByZWV4aXN0aW5nLCBtYXRjaGVyT3V0Lmxlbmd0aCApIDpcblx0XHRcdFx0XHRtYXRjaGVyT3V0XG5cdFx0XHQpO1xuXHRcdFx0aWYgKCBwb3N0RmluZGVyICkge1xuXHRcdFx0XHRwb3N0RmluZGVyKCBudWxsLCByZXN1bHRzLCBtYXRjaGVyT3V0LCB4bWwgKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHB1c2guYXBwbHkoIHJlc3VsdHMsIG1hdGNoZXJPdXQgKTtcblx0XHRcdH1cblx0XHR9XG5cdH0pO1xufVxuXG5mdW5jdGlvbiBtYXRjaGVyRnJvbVRva2VucyggdG9rZW5zICkge1xuXHR2YXIgY2hlY2tDb250ZXh0LCBtYXRjaGVyLCBqLFxuXHRcdGxlbiA9IHRva2Vucy5sZW5ndGgsXG5cdFx0bGVhZGluZ1JlbGF0aXZlID0gRXhwci5yZWxhdGl2ZVsgdG9rZW5zWzBdLnR5cGUgXSxcblx0XHRpbXBsaWNpdFJlbGF0aXZlID0gbGVhZGluZ1JlbGF0aXZlIHx8IEV4cHIucmVsYXRpdmVbXCIgXCJdLFxuXHRcdGkgPSBsZWFkaW5nUmVsYXRpdmUgPyAxIDogMCxcblxuXHRcdC8vIFRoZSBmb3VuZGF0aW9uYWwgbWF0Y2hlciBlbnN1cmVzIHRoYXQgZWxlbWVudHMgYXJlIHJlYWNoYWJsZSBmcm9tIHRvcC1sZXZlbCBjb250ZXh0KHMpXG5cdFx0bWF0Y2hDb250ZXh0ID0gYWRkQ29tYmluYXRvciggZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHRyZXR1cm4gZWxlbSA9PT0gY2hlY2tDb250ZXh0O1xuXHRcdH0sIGltcGxpY2l0UmVsYXRpdmUsIHRydWUgKSxcblx0XHRtYXRjaEFueUNvbnRleHQgPSBhZGRDb21iaW5hdG9yKCBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdHJldHVybiBpbmRleE9mKCBjaGVja0NvbnRleHQsIGVsZW0gKSA+IC0xO1xuXHRcdH0sIGltcGxpY2l0UmVsYXRpdmUsIHRydWUgKSxcblx0XHRtYXRjaGVycyA9IFsgZnVuY3Rpb24oIGVsZW0sIGNvbnRleHQsIHhtbCApIHtcblx0XHRcdHZhciByZXQgPSAoICFsZWFkaW5nUmVsYXRpdmUgJiYgKCB4bWwgfHwgY29udGV4dCAhPT0gb3V0ZXJtb3N0Q29udGV4dCApICkgfHwgKFxuXHRcdFx0XHQoY2hlY2tDb250ZXh0ID0gY29udGV4dCkubm9kZVR5cGUgP1xuXHRcdFx0XHRcdG1hdGNoQ29udGV4dCggZWxlbSwgY29udGV4dCwgeG1sICkgOlxuXHRcdFx0XHRcdG1hdGNoQW55Q29udGV4dCggZWxlbSwgY29udGV4dCwgeG1sICkgKTtcblx0XHRcdC8vIEF2b2lkIGhhbmdpbmcgb250byBlbGVtZW50IChpc3N1ZSAjMjk5KVxuXHRcdFx0Y2hlY2tDb250ZXh0ID0gbnVsbDtcblx0XHRcdHJldHVybiByZXQ7XG5cdFx0fSBdO1xuXG5cdGZvciAoIDsgaSA8IGxlbjsgaSsrICkge1xuXHRcdGlmICggKG1hdGNoZXIgPSBFeHByLnJlbGF0aXZlWyB0b2tlbnNbaV0udHlwZSBdKSApIHtcblx0XHRcdG1hdGNoZXJzID0gWyBhZGRDb21iaW5hdG9yKGVsZW1lbnRNYXRjaGVyKCBtYXRjaGVycyApLCBtYXRjaGVyKSBdO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRtYXRjaGVyID0gRXhwci5maWx0ZXJbIHRva2Vuc1tpXS50eXBlIF0uYXBwbHkoIG51bGwsIHRva2Vuc1tpXS5tYXRjaGVzICk7XG5cblx0XHRcdC8vIFJldHVybiBzcGVjaWFsIHVwb24gc2VlaW5nIGEgcG9zaXRpb25hbCBtYXRjaGVyXG5cdFx0XHRpZiAoIG1hdGNoZXJbIGV4cGFuZG8gXSApIHtcblx0XHRcdFx0Ly8gRmluZCB0aGUgbmV4dCByZWxhdGl2ZSBvcGVyYXRvciAoaWYgYW55KSBmb3IgcHJvcGVyIGhhbmRsaW5nXG5cdFx0XHRcdGogPSArK2k7XG5cdFx0XHRcdGZvciAoIDsgaiA8IGxlbjsgaisrICkge1xuXHRcdFx0XHRcdGlmICggRXhwci5yZWxhdGl2ZVsgdG9rZW5zW2pdLnR5cGUgXSApIHtcblx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0XHRyZXR1cm4gc2V0TWF0Y2hlcihcblx0XHRcdFx0XHRpID4gMSAmJiBlbGVtZW50TWF0Y2hlciggbWF0Y2hlcnMgKSxcblx0XHRcdFx0XHRpID4gMSAmJiB0b1NlbGVjdG9yKFxuXHRcdFx0XHRcdFx0Ly8gSWYgdGhlIHByZWNlZGluZyB0b2tlbiB3YXMgYSBkZXNjZW5kYW50IGNvbWJpbmF0b3IsIGluc2VydCBhbiBpbXBsaWNpdCBhbnktZWxlbWVudCBgKmBcblx0XHRcdFx0XHRcdHRva2Vucy5zbGljZSggMCwgaSAtIDEgKS5jb25jYXQoeyB2YWx1ZTogdG9rZW5zWyBpIC0gMiBdLnR5cGUgPT09IFwiIFwiID8gXCIqXCIgOiBcIlwiIH0pXG5cdFx0XHRcdFx0KS5yZXBsYWNlKCBydHJpbSwgXCIkMVwiICksXG5cdFx0XHRcdFx0bWF0Y2hlcixcblx0XHRcdFx0XHRpIDwgaiAmJiBtYXRjaGVyRnJvbVRva2VucyggdG9rZW5zLnNsaWNlKCBpLCBqICkgKSxcblx0XHRcdFx0XHRqIDwgbGVuICYmIG1hdGNoZXJGcm9tVG9rZW5zKCAodG9rZW5zID0gdG9rZW5zLnNsaWNlKCBqICkpICksXG5cdFx0XHRcdFx0aiA8IGxlbiAmJiB0b1NlbGVjdG9yKCB0b2tlbnMgKVxuXHRcdFx0XHQpO1xuXHRcdFx0fVxuXHRcdFx0bWF0Y2hlcnMucHVzaCggbWF0Y2hlciApO1xuXHRcdH1cblx0fVxuXG5cdHJldHVybiBlbGVtZW50TWF0Y2hlciggbWF0Y2hlcnMgKTtcbn1cblxuZnVuY3Rpb24gbWF0Y2hlckZyb21Hcm91cE1hdGNoZXJzKCBlbGVtZW50TWF0Y2hlcnMsIHNldE1hdGNoZXJzICkge1xuXHR2YXIgYnlTZXQgPSBzZXRNYXRjaGVycy5sZW5ndGggPiAwLFxuXHRcdGJ5RWxlbWVudCA9IGVsZW1lbnRNYXRjaGVycy5sZW5ndGggPiAwLFxuXHRcdHN1cGVyTWF0Y2hlciA9IGZ1bmN0aW9uKCBzZWVkLCBjb250ZXh0LCB4bWwsIHJlc3VsdHMsIG91dGVybW9zdCApIHtcblx0XHRcdHZhciBlbGVtLCBqLCBtYXRjaGVyLFxuXHRcdFx0XHRtYXRjaGVkQ291bnQgPSAwLFxuXHRcdFx0XHRpID0gXCIwXCIsXG5cdFx0XHRcdHVubWF0Y2hlZCA9IHNlZWQgJiYgW10sXG5cdFx0XHRcdHNldE1hdGNoZWQgPSBbXSxcblx0XHRcdFx0Y29udGV4dEJhY2t1cCA9IG91dGVybW9zdENvbnRleHQsXG5cdFx0XHRcdC8vIFdlIG11c3QgYWx3YXlzIGhhdmUgZWl0aGVyIHNlZWQgZWxlbWVudHMgb3Igb3V0ZXJtb3N0IGNvbnRleHRcblx0XHRcdFx0ZWxlbXMgPSBzZWVkIHx8IGJ5RWxlbWVudCAmJiBFeHByLmZpbmRbXCJUQUdcIl0oIFwiKlwiLCBvdXRlcm1vc3QgKSxcblx0XHRcdFx0Ly8gVXNlIGludGVnZXIgZGlycnVucyBpZmYgdGhpcyBpcyB0aGUgb3V0ZXJtb3N0IG1hdGNoZXJcblx0XHRcdFx0ZGlycnVuc1VuaXF1ZSA9IChkaXJydW5zICs9IGNvbnRleHRCYWNrdXAgPT0gbnVsbCA/IDEgOiBNYXRoLnJhbmRvbSgpIHx8IDAuMSksXG5cdFx0XHRcdGxlbiA9IGVsZW1zLmxlbmd0aDtcblxuXHRcdFx0aWYgKCBvdXRlcm1vc3QgKSB7XG5cdFx0XHRcdG91dGVybW9zdENvbnRleHQgPSBjb250ZXh0ID09PSBkb2N1bWVudCB8fCBjb250ZXh0IHx8IG91dGVybW9zdDtcblx0XHRcdH1cblxuXHRcdFx0Ly8gQWRkIGVsZW1lbnRzIHBhc3NpbmcgZWxlbWVudE1hdGNoZXJzIGRpcmVjdGx5IHRvIHJlc3VsdHNcblx0XHRcdC8vIFN1cHBvcnQ6IElFPDksIFNhZmFyaVxuXHRcdFx0Ly8gVG9sZXJhdGUgTm9kZUxpc3QgcHJvcGVydGllcyAoSUU6IFwibGVuZ3RoXCI7IFNhZmFyaTogPG51bWJlcj4pIG1hdGNoaW5nIGVsZW1lbnRzIGJ5IGlkXG5cdFx0XHRmb3IgKCA7IGkgIT09IGxlbiAmJiAoZWxlbSA9IGVsZW1zW2ldKSAhPSBudWxsOyBpKysgKSB7XG5cdFx0XHRcdGlmICggYnlFbGVtZW50ICYmIGVsZW0gKSB7XG5cdFx0XHRcdFx0aiA9IDA7XG5cdFx0XHRcdFx0aWYgKCAhY29udGV4dCAmJiBlbGVtLm93bmVyRG9jdW1lbnQgIT09IGRvY3VtZW50ICkge1xuXHRcdFx0XHRcdFx0c2V0RG9jdW1lbnQoIGVsZW0gKTtcblx0XHRcdFx0XHRcdHhtbCA9ICFkb2N1bWVudElzSFRNTDtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0d2hpbGUgKCAobWF0Y2hlciA9IGVsZW1lbnRNYXRjaGVyc1tqKytdKSApIHtcblx0XHRcdFx0XHRcdGlmICggbWF0Y2hlciggZWxlbSwgY29udGV4dCB8fCBkb2N1bWVudCwgeG1sKSApIHtcblx0XHRcdFx0XHRcdFx0cmVzdWx0cy5wdXNoKCBlbGVtICk7XG5cdFx0XHRcdFx0XHRcdGJyZWFrO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRpZiAoIG91dGVybW9zdCApIHtcblx0XHRcdFx0XHRcdGRpcnJ1bnMgPSBkaXJydW5zVW5pcXVlO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIFRyYWNrIHVubWF0Y2hlZCBlbGVtZW50cyBmb3Igc2V0IGZpbHRlcnNcblx0XHRcdFx0aWYgKCBieVNldCApIHtcblx0XHRcdFx0XHQvLyBUaGV5IHdpbGwgaGF2ZSBnb25lIHRocm91Z2ggYWxsIHBvc3NpYmxlIG1hdGNoZXJzXG5cdFx0XHRcdFx0aWYgKCAoZWxlbSA9ICFtYXRjaGVyICYmIGVsZW0pICkge1xuXHRcdFx0XHRcdFx0bWF0Y2hlZENvdW50LS07XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0Ly8gTGVuZ3RoZW4gdGhlIGFycmF5IGZvciBldmVyeSBlbGVtZW50LCBtYXRjaGVkIG9yIG5vdFxuXHRcdFx0XHRcdGlmICggc2VlZCApIHtcblx0XHRcdFx0XHRcdHVubWF0Y2hlZC5wdXNoKCBlbGVtICk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdC8vIGBpYCBpcyBub3cgdGhlIGNvdW50IG9mIGVsZW1lbnRzIHZpc2l0ZWQgYWJvdmUsIGFuZCBhZGRpbmcgaXQgdG8gYG1hdGNoZWRDb3VudGBcblx0XHRcdC8vIG1ha2VzIHRoZSBsYXR0ZXIgbm9ubmVnYXRpdmUuXG5cdFx0XHRtYXRjaGVkQ291bnQgKz0gaTtcblxuXHRcdFx0Ly8gQXBwbHkgc2V0IGZpbHRlcnMgdG8gdW5tYXRjaGVkIGVsZW1lbnRzXG5cdFx0XHQvLyBOT1RFOiBUaGlzIGNhbiBiZSBza2lwcGVkIGlmIHRoZXJlIGFyZSBubyB1bm1hdGNoZWQgZWxlbWVudHMgKGkuZS4sIGBtYXRjaGVkQ291bnRgXG5cdFx0XHQvLyBlcXVhbHMgYGlgKSwgdW5sZXNzIHdlIGRpZG4ndCB2aXNpdCBfYW55XyBlbGVtZW50cyBpbiB0aGUgYWJvdmUgbG9vcCBiZWNhdXNlIHdlIGhhdmVcblx0XHRcdC8vIG5vIGVsZW1lbnQgbWF0Y2hlcnMgYW5kIG5vIHNlZWQuXG5cdFx0XHQvLyBJbmNyZW1lbnRpbmcgYW4gaW5pdGlhbGx5LXN0cmluZyBcIjBcIiBgaWAgYWxsb3dzIGBpYCB0byByZW1haW4gYSBzdHJpbmcgb25seSBpbiB0aGF0XG5cdFx0XHQvLyBjYXNlLCB3aGljaCB3aWxsIHJlc3VsdCBpbiBhIFwiMDBcIiBgbWF0Y2hlZENvdW50YCB0aGF0IGRpZmZlcnMgZnJvbSBgaWAgYnV0IGlzIGFsc29cblx0XHRcdC8vIG51bWVyaWNhbGx5IHplcm8uXG5cdFx0XHRpZiAoIGJ5U2V0ICYmIGkgIT09IG1hdGNoZWRDb3VudCApIHtcblx0XHRcdFx0aiA9IDA7XG5cdFx0XHRcdHdoaWxlICggKG1hdGNoZXIgPSBzZXRNYXRjaGVyc1tqKytdKSApIHtcblx0XHRcdFx0XHRtYXRjaGVyKCB1bm1hdGNoZWQsIHNldE1hdGNoZWQsIGNvbnRleHQsIHhtbCApO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0aWYgKCBzZWVkICkge1xuXHRcdFx0XHRcdC8vIFJlaW50ZWdyYXRlIGVsZW1lbnQgbWF0Y2hlcyB0byBlbGltaW5hdGUgdGhlIG5lZWQgZm9yIHNvcnRpbmdcblx0XHRcdFx0XHRpZiAoIG1hdGNoZWRDb3VudCA+IDAgKSB7XG5cdFx0XHRcdFx0XHR3aGlsZSAoIGktLSApIHtcblx0XHRcdFx0XHRcdFx0aWYgKCAhKHVubWF0Y2hlZFtpXSB8fCBzZXRNYXRjaGVkW2ldKSApIHtcblx0XHRcdFx0XHRcdFx0XHRzZXRNYXRjaGVkW2ldID0gcG9wLmNhbGwoIHJlc3VsdHMgKTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdC8vIERpc2NhcmQgaW5kZXggcGxhY2Vob2xkZXIgdmFsdWVzIHRvIGdldCBvbmx5IGFjdHVhbCBtYXRjaGVzXG5cdFx0XHRcdFx0c2V0TWF0Y2hlZCA9IGNvbmRlbnNlKCBzZXRNYXRjaGVkICk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBBZGQgbWF0Y2hlcyB0byByZXN1bHRzXG5cdFx0XHRcdHB1c2guYXBwbHkoIHJlc3VsdHMsIHNldE1hdGNoZWQgKTtcblxuXHRcdFx0XHQvLyBTZWVkbGVzcyBzZXQgbWF0Y2hlcyBzdWNjZWVkaW5nIG11bHRpcGxlIHN1Y2Nlc3NmdWwgbWF0Y2hlcnMgc3RpcHVsYXRlIHNvcnRpbmdcblx0XHRcdFx0aWYgKCBvdXRlcm1vc3QgJiYgIXNlZWQgJiYgc2V0TWF0Y2hlZC5sZW5ndGggPiAwICYmXG5cdFx0XHRcdFx0KCBtYXRjaGVkQ291bnQgKyBzZXRNYXRjaGVycy5sZW5ndGggKSA+IDEgKSB7XG5cblx0XHRcdFx0XHRTaXp6bGUudW5pcXVlU29ydCggcmVzdWx0cyApO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdC8vIE92ZXJyaWRlIG1hbmlwdWxhdGlvbiBvZiBnbG9iYWxzIGJ5IG5lc3RlZCBtYXRjaGVyc1xuXHRcdFx0aWYgKCBvdXRlcm1vc3QgKSB7XG5cdFx0XHRcdGRpcnJ1bnMgPSBkaXJydW5zVW5pcXVlO1xuXHRcdFx0XHRvdXRlcm1vc3RDb250ZXh0ID0gY29udGV4dEJhY2t1cDtcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIHVubWF0Y2hlZDtcblx0XHR9O1xuXG5cdHJldHVybiBieVNldCA/XG5cdFx0bWFya0Z1bmN0aW9uKCBzdXBlck1hdGNoZXIgKSA6XG5cdFx0c3VwZXJNYXRjaGVyO1xufVxuXG5jb21waWxlID0gU2l6emxlLmNvbXBpbGUgPSBmdW5jdGlvbiggc2VsZWN0b3IsIG1hdGNoIC8qIEludGVybmFsIFVzZSBPbmx5ICovICkge1xuXHR2YXIgaSxcblx0XHRzZXRNYXRjaGVycyA9IFtdLFxuXHRcdGVsZW1lbnRNYXRjaGVycyA9IFtdLFxuXHRcdGNhY2hlZCA9IGNvbXBpbGVyQ2FjaGVbIHNlbGVjdG9yICsgXCIgXCIgXTtcblxuXHRpZiAoICFjYWNoZWQgKSB7XG5cdFx0Ly8gR2VuZXJhdGUgYSBmdW5jdGlvbiBvZiByZWN1cnNpdmUgZnVuY3Rpb25zIHRoYXQgY2FuIGJlIHVzZWQgdG8gY2hlY2sgZWFjaCBlbGVtZW50XG5cdFx0aWYgKCAhbWF0Y2ggKSB7XG5cdFx0XHRtYXRjaCA9IHRva2VuaXplKCBzZWxlY3RvciApO1xuXHRcdH1cblx0XHRpID0gbWF0Y2gubGVuZ3RoO1xuXHRcdHdoaWxlICggaS0tICkge1xuXHRcdFx0Y2FjaGVkID0gbWF0Y2hlckZyb21Ub2tlbnMoIG1hdGNoW2ldICk7XG5cdFx0XHRpZiAoIGNhY2hlZFsgZXhwYW5kbyBdICkge1xuXHRcdFx0XHRzZXRNYXRjaGVycy5wdXNoKCBjYWNoZWQgKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGVsZW1lbnRNYXRjaGVycy5wdXNoKCBjYWNoZWQgKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyBDYWNoZSB0aGUgY29tcGlsZWQgZnVuY3Rpb25cblx0XHRjYWNoZWQgPSBjb21waWxlckNhY2hlKCBzZWxlY3RvciwgbWF0Y2hlckZyb21Hcm91cE1hdGNoZXJzKCBlbGVtZW50TWF0Y2hlcnMsIHNldE1hdGNoZXJzICkgKTtcblxuXHRcdC8vIFNhdmUgc2VsZWN0b3IgYW5kIHRva2VuaXphdGlvblxuXHRcdGNhY2hlZC5zZWxlY3RvciA9IHNlbGVjdG9yO1xuXHR9XG5cdHJldHVybiBjYWNoZWQ7XG59O1xuXG4vKipcbiAqIEEgbG93LWxldmVsIHNlbGVjdGlvbiBmdW5jdGlvbiB0aGF0IHdvcmtzIHdpdGggU2l6emxlJ3MgY29tcGlsZWRcbiAqICBzZWxlY3RvciBmdW5jdGlvbnNcbiAqIEBwYXJhbSB7U3RyaW5nfEZ1bmN0aW9ufSBzZWxlY3RvciBBIHNlbGVjdG9yIG9yIGEgcHJlLWNvbXBpbGVkXG4gKiAgc2VsZWN0b3IgZnVuY3Rpb24gYnVpbHQgd2l0aCBTaXp6bGUuY29tcGlsZVxuICogQHBhcmFtIHtFbGVtZW50fSBjb250ZXh0XG4gKiBAcGFyYW0ge0FycmF5fSBbcmVzdWx0c11cbiAqIEBwYXJhbSB7QXJyYXl9IFtzZWVkXSBBIHNldCBvZiBlbGVtZW50cyB0byBtYXRjaCBhZ2FpbnN0XG4gKi9cbnNlbGVjdCA9IFNpenpsZS5zZWxlY3QgPSBmdW5jdGlvbiggc2VsZWN0b3IsIGNvbnRleHQsIHJlc3VsdHMsIHNlZWQgKSB7XG5cdHZhciBpLCB0b2tlbnMsIHRva2VuLCB0eXBlLCBmaW5kLFxuXHRcdGNvbXBpbGVkID0gdHlwZW9mIHNlbGVjdG9yID09PSBcImZ1bmN0aW9uXCIgJiYgc2VsZWN0b3IsXG5cdFx0bWF0Y2ggPSAhc2VlZCAmJiB0b2tlbml6ZSggKHNlbGVjdG9yID0gY29tcGlsZWQuc2VsZWN0b3IgfHwgc2VsZWN0b3IpICk7XG5cblx0cmVzdWx0cyA9IHJlc3VsdHMgfHwgW107XG5cblx0Ly8gVHJ5IHRvIG1pbmltaXplIG9wZXJhdGlvbnMgaWYgdGhlcmUgaXMgb25seSBvbmUgc2VsZWN0b3IgaW4gdGhlIGxpc3QgYW5kIG5vIHNlZWRcblx0Ly8gKHRoZSBsYXR0ZXIgb2Ygd2hpY2ggZ3VhcmFudGVlcyB1cyBjb250ZXh0KVxuXHRpZiAoIG1hdGNoLmxlbmd0aCA9PT0gMSApIHtcblxuXHRcdC8vIFJlZHVjZSBjb250ZXh0IGlmIHRoZSBsZWFkaW5nIGNvbXBvdW5kIHNlbGVjdG9yIGlzIGFuIElEXG5cdFx0dG9rZW5zID0gbWF0Y2hbMF0gPSBtYXRjaFswXS5zbGljZSggMCApO1xuXHRcdGlmICggdG9rZW5zLmxlbmd0aCA+IDIgJiYgKHRva2VuID0gdG9rZW5zWzBdKS50eXBlID09PSBcIklEXCIgJiZcblx0XHRcdFx0c3VwcG9ydC5nZXRCeUlkICYmIGNvbnRleHQubm9kZVR5cGUgPT09IDkgJiYgZG9jdW1lbnRJc0hUTUwgJiZcblx0XHRcdFx0RXhwci5yZWxhdGl2ZVsgdG9rZW5zWzFdLnR5cGUgXSApIHtcblxuXHRcdFx0Y29udGV4dCA9ICggRXhwci5maW5kW1wiSURcIl0oIHRva2VuLm1hdGNoZXNbMF0ucmVwbGFjZShydW5lc2NhcGUsIGZ1bmVzY2FwZSksIGNvbnRleHQgKSB8fCBbXSApWzBdO1xuXHRcdFx0aWYgKCAhY29udGV4dCApIHtcblx0XHRcdFx0cmV0dXJuIHJlc3VsdHM7XG5cblx0XHRcdC8vIFByZWNvbXBpbGVkIG1hdGNoZXJzIHdpbGwgc3RpbGwgdmVyaWZ5IGFuY2VzdHJ5LCBzbyBzdGVwIHVwIGEgbGV2ZWxcblx0XHRcdH0gZWxzZSBpZiAoIGNvbXBpbGVkICkge1xuXHRcdFx0XHRjb250ZXh0ID0gY29udGV4dC5wYXJlbnROb2RlO1xuXHRcdFx0fVxuXG5cdFx0XHRzZWxlY3RvciA9IHNlbGVjdG9yLnNsaWNlKCB0b2tlbnMuc2hpZnQoKS52YWx1ZS5sZW5ndGggKTtcblx0XHR9XG5cblx0XHQvLyBGZXRjaCBhIHNlZWQgc2V0IGZvciByaWdodC10by1sZWZ0IG1hdGNoaW5nXG5cdFx0aSA9IG1hdGNoRXhwcltcIm5lZWRzQ29udGV4dFwiXS50ZXN0KCBzZWxlY3RvciApID8gMCA6IHRva2Vucy5sZW5ndGg7XG5cdFx0d2hpbGUgKCBpLS0gKSB7XG5cdFx0XHR0b2tlbiA9IHRva2Vuc1tpXTtcblxuXHRcdFx0Ly8gQWJvcnQgaWYgd2UgaGl0IGEgY29tYmluYXRvclxuXHRcdFx0aWYgKCBFeHByLnJlbGF0aXZlWyAodHlwZSA9IHRva2VuLnR5cGUpIF0gKSB7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0fVxuXHRcdFx0aWYgKCAoZmluZCA9IEV4cHIuZmluZFsgdHlwZSBdKSApIHtcblx0XHRcdFx0Ly8gU2VhcmNoLCBleHBhbmRpbmcgY29udGV4dCBmb3IgbGVhZGluZyBzaWJsaW5nIGNvbWJpbmF0b3JzXG5cdFx0XHRcdGlmICggKHNlZWQgPSBmaW5kKFxuXHRcdFx0XHRcdHRva2VuLm1hdGNoZXNbMF0ucmVwbGFjZSggcnVuZXNjYXBlLCBmdW5lc2NhcGUgKSxcblx0XHRcdFx0XHRyc2libGluZy50ZXN0KCB0b2tlbnNbMF0udHlwZSApICYmIHRlc3RDb250ZXh0KCBjb250ZXh0LnBhcmVudE5vZGUgKSB8fCBjb250ZXh0XG5cdFx0XHRcdCkpICkge1xuXG5cdFx0XHRcdFx0Ly8gSWYgc2VlZCBpcyBlbXB0eSBvciBubyB0b2tlbnMgcmVtYWluLCB3ZSBjYW4gcmV0dXJuIGVhcmx5XG5cdFx0XHRcdFx0dG9rZW5zLnNwbGljZSggaSwgMSApO1xuXHRcdFx0XHRcdHNlbGVjdG9yID0gc2VlZC5sZW5ndGggJiYgdG9TZWxlY3RvciggdG9rZW5zICk7XG5cdFx0XHRcdFx0aWYgKCAhc2VsZWN0b3IgKSB7XG5cdFx0XHRcdFx0XHRwdXNoLmFwcGx5KCByZXN1bHRzLCBzZWVkICk7XG5cdFx0XHRcdFx0XHRyZXR1cm4gcmVzdWx0cztcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0fVxuXG5cdC8vIENvbXBpbGUgYW5kIGV4ZWN1dGUgYSBmaWx0ZXJpbmcgZnVuY3Rpb24gaWYgb25lIGlzIG5vdCBwcm92aWRlZFxuXHQvLyBQcm92aWRlIGBtYXRjaGAgdG8gYXZvaWQgcmV0b2tlbml6YXRpb24gaWYgd2UgbW9kaWZpZWQgdGhlIHNlbGVjdG9yIGFib3ZlXG5cdCggY29tcGlsZWQgfHwgY29tcGlsZSggc2VsZWN0b3IsIG1hdGNoICkgKShcblx0XHRzZWVkLFxuXHRcdGNvbnRleHQsXG5cdFx0IWRvY3VtZW50SXNIVE1MLFxuXHRcdHJlc3VsdHMsXG5cdFx0IWNvbnRleHQgfHwgcnNpYmxpbmcudGVzdCggc2VsZWN0b3IgKSAmJiB0ZXN0Q29udGV4dCggY29udGV4dC5wYXJlbnROb2RlICkgfHwgY29udGV4dFxuXHQpO1xuXHRyZXR1cm4gcmVzdWx0cztcbn07XG5cbi8vIE9uZS10aW1lIGFzc2lnbm1lbnRzXG5cbi8vIFNvcnQgc3RhYmlsaXR5XG5zdXBwb3J0LnNvcnRTdGFibGUgPSBleHBhbmRvLnNwbGl0KFwiXCIpLnNvcnQoIHNvcnRPcmRlciApLmpvaW4oXCJcIikgPT09IGV4cGFuZG87XG5cbi8vIFN1cHBvcnQ6IENocm9tZSAxNC0zNStcbi8vIEFsd2F5cyBhc3N1bWUgZHVwbGljYXRlcyBpZiB0aGV5IGFyZW4ndCBwYXNzZWQgdG8gdGhlIGNvbXBhcmlzb24gZnVuY3Rpb25cbnN1cHBvcnQuZGV0ZWN0RHVwbGljYXRlcyA9ICEhaGFzRHVwbGljYXRlO1xuXG4vLyBJbml0aWFsaXplIGFnYWluc3QgdGhlIGRlZmF1bHQgZG9jdW1lbnRcbnNldERvY3VtZW50KCk7XG5cbi8vIFN1cHBvcnQ6IFdlYmtpdDw1MzcuMzIgLSBTYWZhcmkgNi4wLjMvQ2hyb21lIDI1IChmaXhlZCBpbiBDaHJvbWUgMjcpXG4vLyBEZXRhY2hlZCBub2RlcyBjb25mb3VuZGluZ2x5IGZvbGxvdyAqZWFjaCBvdGhlcipcbnN1cHBvcnQuc29ydERldGFjaGVkID0gYXNzZXJ0KGZ1bmN0aW9uKCBkaXYxICkge1xuXHQvLyBTaG91bGQgcmV0dXJuIDEsIGJ1dCByZXR1cm5zIDQgKGZvbGxvd2luZylcblx0cmV0dXJuIGRpdjEuY29tcGFyZURvY3VtZW50UG9zaXRpb24oIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJkaXZcIikgKSAmIDE7XG59KTtcblxuLy8gU3VwcG9ydDogSUU8OFxuLy8gUHJldmVudCBhdHRyaWJ1dGUvcHJvcGVydHkgXCJpbnRlcnBvbGF0aW9uXCJcbi8vIGh0dHA6Ly9tc2RuLm1pY3Jvc29mdC5jb20vZW4tdXMvbGlicmFyeS9tczUzNjQyOSUyOFZTLjg1JTI5LmFzcHhcbmlmICggIWFzc2VydChmdW5jdGlvbiggZGl2ICkge1xuXHRkaXYuaW5uZXJIVE1MID0gXCI8YSBocmVmPScjJz48L2E+XCI7XG5cdHJldHVybiBkaXYuZmlyc3RDaGlsZC5nZXRBdHRyaWJ1dGUoXCJocmVmXCIpID09PSBcIiNcIiA7XG59KSApIHtcblx0YWRkSGFuZGxlKCBcInR5cGV8aHJlZnxoZWlnaHR8d2lkdGhcIiwgZnVuY3Rpb24oIGVsZW0sIG5hbWUsIGlzWE1MICkge1xuXHRcdGlmICggIWlzWE1MICkge1xuXHRcdFx0cmV0dXJuIGVsZW0uZ2V0QXR0cmlidXRlKCBuYW1lLCBuYW1lLnRvTG93ZXJDYXNlKCkgPT09IFwidHlwZVwiID8gMSA6IDIgKTtcblx0XHR9XG5cdH0pO1xufVxuXG4vLyBTdXBwb3J0OiBJRTw5XG4vLyBVc2UgZGVmYXVsdFZhbHVlIGluIHBsYWNlIG9mIGdldEF0dHJpYnV0ZShcInZhbHVlXCIpXG5pZiAoICFzdXBwb3J0LmF0dHJpYnV0ZXMgfHwgIWFzc2VydChmdW5jdGlvbiggZGl2ICkge1xuXHRkaXYuaW5uZXJIVE1MID0gXCI8aW5wdXQvPlwiO1xuXHRkaXYuZmlyc3RDaGlsZC5zZXRBdHRyaWJ1dGUoIFwidmFsdWVcIiwgXCJcIiApO1xuXHRyZXR1cm4gZGl2LmZpcnN0Q2hpbGQuZ2V0QXR0cmlidXRlKCBcInZhbHVlXCIgKSA9PT0gXCJcIjtcbn0pICkge1xuXHRhZGRIYW5kbGUoIFwidmFsdWVcIiwgZnVuY3Rpb24oIGVsZW0sIG5hbWUsIGlzWE1MICkge1xuXHRcdGlmICggIWlzWE1MICYmIGVsZW0ubm9kZU5hbWUudG9Mb3dlckNhc2UoKSA9PT0gXCJpbnB1dFwiICkge1xuXHRcdFx0cmV0dXJuIGVsZW0uZGVmYXVsdFZhbHVlO1xuXHRcdH1cblx0fSk7XG59XG5cbi8vIFN1cHBvcnQ6IElFPDlcbi8vIFVzZSBnZXRBdHRyaWJ1dGVOb2RlIHRvIGZldGNoIGJvb2xlYW5zIHdoZW4gZ2V0QXR0cmlidXRlIGxpZXNcbmlmICggIWFzc2VydChmdW5jdGlvbiggZGl2ICkge1xuXHRyZXR1cm4gZGl2LmdldEF0dHJpYnV0ZShcImRpc2FibGVkXCIpID09IG51bGw7XG59KSApIHtcblx0YWRkSGFuZGxlKCBib29sZWFucywgZnVuY3Rpb24oIGVsZW0sIG5hbWUsIGlzWE1MICkge1xuXHRcdHZhciB2YWw7XG5cdFx0aWYgKCAhaXNYTUwgKSB7XG5cdFx0XHRyZXR1cm4gZWxlbVsgbmFtZSBdID09PSB0cnVlID8gbmFtZS50b0xvd2VyQ2FzZSgpIDpcblx0XHRcdFx0XHQodmFsID0gZWxlbS5nZXRBdHRyaWJ1dGVOb2RlKCBuYW1lICkpICYmIHZhbC5zcGVjaWZpZWQgP1xuXHRcdFx0XHRcdHZhbC52YWx1ZSA6XG5cdFx0XHRcdG51bGw7XG5cdFx0fVxuXHR9KTtcbn1cblxucmV0dXJuIFNpenpsZTtcblxufSkoIHdpbmRvdyApO1xuXG5cblxualF1ZXJ5LmZpbmQgPSBTaXp6bGU7XG5qUXVlcnkuZXhwciA9IFNpenpsZS5zZWxlY3RvcnM7XG5qUXVlcnkuZXhwclsgXCI6XCIgXSA9IGpRdWVyeS5leHByLnBzZXVkb3M7XG5qUXVlcnkudW5pcXVlU29ydCA9IGpRdWVyeS51bmlxdWUgPSBTaXp6bGUudW5pcXVlU29ydDtcbmpRdWVyeS50ZXh0ID0gU2l6emxlLmdldFRleHQ7XG5qUXVlcnkuaXNYTUxEb2MgPSBTaXp6bGUuaXNYTUw7XG5qUXVlcnkuY29udGFpbnMgPSBTaXp6bGUuY29udGFpbnM7XG5cblxuXG52YXIgZGlyID0gZnVuY3Rpb24oIGVsZW0sIGRpciwgdW50aWwgKSB7XG5cdHZhciBtYXRjaGVkID0gW10sXG5cdFx0dHJ1bmNhdGUgPSB1bnRpbCAhPT0gdW5kZWZpbmVkO1xuXG5cdHdoaWxlICggKCBlbGVtID0gZWxlbVsgZGlyIF0gKSAmJiBlbGVtLm5vZGVUeXBlICE9PSA5ICkge1xuXHRcdGlmICggZWxlbS5ub2RlVHlwZSA9PT0gMSApIHtcblx0XHRcdGlmICggdHJ1bmNhdGUgJiYgalF1ZXJ5KCBlbGVtICkuaXMoIHVudGlsICkgKSB7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0fVxuXHRcdFx0bWF0Y2hlZC5wdXNoKCBlbGVtICk7XG5cdFx0fVxuXHR9XG5cdHJldHVybiBtYXRjaGVkO1xufTtcblxuXG52YXIgc2libGluZ3MgPSBmdW5jdGlvbiggbiwgZWxlbSApIHtcblx0dmFyIG1hdGNoZWQgPSBbXTtcblxuXHRmb3IgKCA7IG47IG4gPSBuLm5leHRTaWJsaW5nICkge1xuXHRcdGlmICggbi5ub2RlVHlwZSA9PT0gMSAmJiBuICE9PSBlbGVtICkge1xuXHRcdFx0bWF0Y2hlZC5wdXNoKCBuICk7XG5cdFx0fVxuXHR9XG5cblx0cmV0dXJuIG1hdGNoZWQ7XG59O1xuXG5cbnZhciBybmVlZHNDb250ZXh0ID0galF1ZXJ5LmV4cHIubWF0Y2gubmVlZHNDb250ZXh0O1xuXG52YXIgcnNpbmdsZVRhZyA9ICggL148KFtcXHctXSspXFxzKlxcLz8+KD86PFxcL1xcMT58KSQvICk7XG5cblxuXG52YXIgcmlzU2ltcGxlID0gL14uW146I1xcW1xcLixdKiQvO1xuXG4vLyBJbXBsZW1lbnQgdGhlIGlkZW50aWNhbCBmdW5jdGlvbmFsaXR5IGZvciBmaWx0ZXIgYW5kIG5vdFxuZnVuY3Rpb24gd2lubm93KCBlbGVtZW50cywgcXVhbGlmaWVyLCBub3QgKSB7XG5cdGlmICggalF1ZXJ5LmlzRnVuY3Rpb24oIHF1YWxpZmllciApICkge1xuXHRcdHJldHVybiBqUXVlcnkuZ3JlcCggZWxlbWVudHMsIGZ1bmN0aW9uKCBlbGVtLCBpICkge1xuXHRcdFx0LyoganNoaW50IC1XMDE4ICovXG5cdFx0XHRyZXR1cm4gISFxdWFsaWZpZXIuY2FsbCggZWxlbSwgaSwgZWxlbSApICE9PSBub3Q7XG5cdFx0fSApO1xuXG5cdH1cblxuXHRpZiAoIHF1YWxpZmllci5ub2RlVHlwZSApIHtcblx0XHRyZXR1cm4galF1ZXJ5LmdyZXAoIGVsZW1lbnRzLCBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRcdHJldHVybiAoIGVsZW0gPT09IHF1YWxpZmllciApICE9PSBub3Q7XG5cdFx0fSApO1xuXG5cdH1cblxuXHRpZiAoIHR5cGVvZiBxdWFsaWZpZXIgPT09IFwic3RyaW5nXCIgKSB7XG5cdFx0aWYgKCByaXNTaW1wbGUudGVzdCggcXVhbGlmaWVyICkgKSB7XG5cdFx0XHRyZXR1cm4galF1ZXJ5LmZpbHRlciggcXVhbGlmaWVyLCBlbGVtZW50cywgbm90ICk7XG5cdFx0fVxuXG5cdFx0cXVhbGlmaWVyID0galF1ZXJ5LmZpbHRlciggcXVhbGlmaWVyLCBlbGVtZW50cyApO1xuXHR9XG5cblx0cmV0dXJuIGpRdWVyeS5ncmVwKCBlbGVtZW50cywgZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0cmV0dXJuICggaW5kZXhPZi5jYWxsKCBxdWFsaWZpZXIsIGVsZW0gKSA+IC0xICkgIT09IG5vdDtcblx0fSApO1xufVxuXG5qUXVlcnkuZmlsdGVyID0gZnVuY3Rpb24oIGV4cHIsIGVsZW1zLCBub3QgKSB7XG5cdHZhciBlbGVtID0gZWxlbXNbIDAgXTtcblxuXHRpZiAoIG5vdCApIHtcblx0XHRleHByID0gXCI6bm90KFwiICsgZXhwciArIFwiKVwiO1xuXHR9XG5cblx0cmV0dXJuIGVsZW1zLmxlbmd0aCA9PT0gMSAmJiBlbGVtLm5vZGVUeXBlID09PSAxID9cblx0XHRqUXVlcnkuZmluZC5tYXRjaGVzU2VsZWN0b3IoIGVsZW0sIGV4cHIgKSA/IFsgZWxlbSBdIDogW10gOlxuXHRcdGpRdWVyeS5maW5kLm1hdGNoZXMoIGV4cHIsIGpRdWVyeS5ncmVwKCBlbGVtcywgZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHRyZXR1cm4gZWxlbS5ub2RlVHlwZSA9PT0gMTtcblx0XHR9ICkgKTtcbn07XG5cbmpRdWVyeS5mbi5leHRlbmQoIHtcblx0ZmluZDogZnVuY3Rpb24oIHNlbGVjdG9yICkge1xuXHRcdHZhciBpLFxuXHRcdFx0bGVuID0gdGhpcy5sZW5ndGgsXG5cdFx0XHRyZXQgPSBbXSxcblx0XHRcdHNlbGYgPSB0aGlzO1xuXG5cdFx0aWYgKCB0eXBlb2Ygc2VsZWN0b3IgIT09IFwic3RyaW5nXCIgKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5wdXNoU3RhY2soIGpRdWVyeSggc2VsZWN0b3IgKS5maWx0ZXIoIGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRmb3IgKCBpID0gMDsgaSA8IGxlbjsgaSsrICkge1xuXHRcdFx0XHRcdGlmICggalF1ZXJ5LmNvbnRhaW5zKCBzZWxmWyBpIF0sIHRoaXMgKSApIHtcblx0XHRcdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fSApICk7XG5cdFx0fVxuXG5cdFx0Zm9yICggaSA9IDA7IGkgPCBsZW47IGkrKyApIHtcblx0XHRcdGpRdWVyeS5maW5kKCBzZWxlY3Rvciwgc2VsZlsgaSBdLCByZXQgKTtcblx0XHR9XG5cblx0XHQvLyBOZWVkZWQgYmVjYXVzZSAkKCBzZWxlY3RvciwgY29udGV4dCApIGJlY29tZXMgJCggY29udGV4dCApLmZpbmQoIHNlbGVjdG9yIClcblx0XHRyZXQgPSB0aGlzLnB1c2hTdGFjayggbGVuID4gMSA/IGpRdWVyeS51bmlxdWUoIHJldCApIDogcmV0ICk7XG5cdFx0cmV0LnNlbGVjdG9yID0gdGhpcy5zZWxlY3RvciA/IHRoaXMuc2VsZWN0b3IgKyBcIiBcIiArIHNlbGVjdG9yIDogc2VsZWN0b3I7XG5cdFx0cmV0dXJuIHJldDtcblx0fSxcblx0ZmlsdGVyOiBmdW5jdGlvbiggc2VsZWN0b3IgKSB7XG5cdFx0cmV0dXJuIHRoaXMucHVzaFN0YWNrKCB3aW5ub3coIHRoaXMsIHNlbGVjdG9yIHx8IFtdLCBmYWxzZSApICk7XG5cdH0sXG5cdG5vdDogZnVuY3Rpb24oIHNlbGVjdG9yICkge1xuXHRcdHJldHVybiB0aGlzLnB1c2hTdGFjayggd2lubm93KCB0aGlzLCBzZWxlY3RvciB8fCBbXSwgdHJ1ZSApICk7XG5cdH0sXG5cdGlzOiBmdW5jdGlvbiggc2VsZWN0b3IgKSB7XG5cdFx0cmV0dXJuICEhd2lubm93KFxuXHRcdFx0dGhpcyxcblxuXHRcdFx0Ly8gSWYgdGhpcyBpcyBhIHBvc2l0aW9uYWwvcmVsYXRpdmUgc2VsZWN0b3IsIGNoZWNrIG1lbWJlcnNoaXAgaW4gdGhlIHJldHVybmVkIHNldFxuXHRcdFx0Ly8gc28gJChcInA6Zmlyc3RcIikuaXMoXCJwOmxhc3RcIikgd29uJ3QgcmV0dXJuIHRydWUgZm9yIGEgZG9jIHdpdGggdHdvIFwicFwiLlxuXHRcdFx0dHlwZW9mIHNlbGVjdG9yID09PSBcInN0cmluZ1wiICYmIHJuZWVkc0NvbnRleHQudGVzdCggc2VsZWN0b3IgKSA/XG5cdFx0XHRcdGpRdWVyeSggc2VsZWN0b3IgKSA6XG5cdFx0XHRcdHNlbGVjdG9yIHx8IFtdLFxuXHRcdFx0ZmFsc2Vcblx0XHQpLmxlbmd0aDtcblx0fVxufSApO1xuXG5cbi8vIEluaXRpYWxpemUgYSBqUXVlcnkgb2JqZWN0XG5cblxuLy8gQSBjZW50cmFsIHJlZmVyZW5jZSB0byB0aGUgcm9vdCBqUXVlcnkoZG9jdW1lbnQpXG52YXIgcm9vdGpRdWVyeSxcblxuXHQvLyBBIHNpbXBsZSB3YXkgdG8gY2hlY2sgZm9yIEhUTUwgc3RyaW5nc1xuXHQvLyBQcmlvcml0aXplICNpZCBvdmVyIDx0YWc+IHRvIGF2b2lkIFhTUyB2aWEgbG9jYXRpb24uaGFzaCAoIzk1MjEpXG5cdC8vIFN0cmljdCBIVE1MIHJlY29nbml0aW9uICgjMTEyOTA6IG11c3Qgc3RhcnQgd2l0aCA8KVxuXHRycXVpY2tFeHByID0gL14oPzpcXHMqKDxbXFx3XFxXXSs+KVtePl0qfCMoW1xcdy1dKikpJC8sXG5cblx0aW5pdCA9IGpRdWVyeS5mbi5pbml0ID0gZnVuY3Rpb24oIHNlbGVjdG9yLCBjb250ZXh0LCByb290ICkge1xuXHRcdHZhciBtYXRjaCwgZWxlbTtcblxuXHRcdC8vIEhBTkRMRTogJChcIlwiKSwgJChudWxsKSwgJCh1bmRlZmluZWQpLCAkKGZhbHNlKVxuXHRcdGlmICggIXNlbGVjdG9yICkge1xuXHRcdFx0cmV0dXJuIHRoaXM7XG5cdFx0fVxuXG5cdFx0Ly8gTWV0aG9kIGluaXQoKSBhY2NlcHRzIGFuIGFsdGVybmF0ZSByb290alF1ZXJ5XG5cdFx0Ly8gc28gbWlncmF0ZSBjYW4gc3VwcG9ydCBqUXVlcnkuc3ViIChnaC0yMTAxKVxuXHRcdHJvb3QgPSByb290IHx8IHJvb3RqUXVlcnk7XG5cblx0XHQvLyBIYW5kbGUgSFRNTCBzdHJpbmdzXG5cdFx0aWYgKCB0eXBlb2Ygc2VsZWN0b3IgPT09IFwic3RyaW5nXCIgKSB7XG5cdFx0XHRpZiAoIHNlbGVjdG9yWyAwIF0gPT09IFwiPFwiICYmXG5cdFx0XHRcdHNlbGVjdG9yWyBzZWxlY3Rvci5sZW5ndGggLSAxIF0gPT09IFwiPlwiICYmXG5cdFx0XHRcdHNlbGVjdG9yLmxlbmd0aCA+PSAzICkge1xuXG5cdFx0XHRcdC8vIEFzc3VtZSB0aGF0IHN0cmluZ3MgdGhhdCBzdGFydCBhbmQgZW5kIHdpdGggPD4gYXJlIEhUTUwgYW5kIHNraXAgdGhlIHJlZ2V4IGNoZWNrXG5cdFx0XHRcdG1hdGNoID0gWyBudWxsLCBzZWxlY3RvciwgbnVsbCBdO1xuXG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRtYXRjaCA9IHJxdWlja0V4cHIuZXhlYyggc2VsZWN0b3IgKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gTWF0Y2ggaHRtbCBvciBtYWtlIHN1cmUgbm8gY29udGV4dCBpcyBzcGVjaWZpZWQgZm9yICNpZFxuXHRcdFx0aWYgKCBtYXRjaCAmJiAoIG1hdGNoWyAxIF0gfHwgIWNvbnRleHQgKSApIHtcblxuXHRcdFx0XHQvLyBIQU5ETEU6ICQoaHRtbCkgLT4gJChhcnJheSlcblx0XHRcdFx0aWYgKCBtYXRjaFsgMSBdICkge1xuXHRcdFx0XHRcdGNvbnRleHQgPSBjb250ZXh0IGluc3RhbmNlb2YgalF1ZXJ5ID8gY29udGV4dFsgMCBdIDogY29udGV4dDtcblxuXHRcdFx0XHRcdC8vIE9wdGlvbiB0byBydW4gc2NyaXB0cyBpcyB0cnVlIGZvciBiYWNrLWNvbXBhdFxuXHRcdFx0XHRcdC8vIEludGVudGlvbmFsbHkgbGV0IHRoZSBlcnJvciBiZSB0aHJvd24gaWYgcGFyc2VIVE1MIGlzIG5vdCBwcmVzZW50XG5cdFx0XHRcdFx0alF1ZXJ5Lm1lcmdlKCB0aGlzLCBqUXVlcnkucGFyc2VIVE1MKFxuXHRcdFx0XHRcdFx0bWF0Y2hbIDEgXSxcblx0XHRcdFx0XHRcdGNvbnRleHQgJiYgY29udGV4dC5ub2RlVHlwZSA/IGNvbnRleHQub3duZXJEb2N1bWVudCB8fCBjb250ZXh0IDogZG9jdW1lbnQsXG5cdFx0XHRcdFx0XHR0cnVlXG5cdFx0XHRcdFx0KSApO1xuXG5cdFx0XHRcdFx0Ly8gSEFORExFOiAkKGh0bWwsIHByb3BzKVxuXHRcdFx0XHRcdGlmICggcnNpbmdsZVRhZy50ZXN0KCBtYXRjaFsgMSBdICkgJiYgalF1ZXJ5LmlzUGxhaW5PYmplY3QoIGNvbnRleHQgKSApIHtcblx0XHRcdFx0XHRcdGZvciAoIG1hdGNoIGluIGNvbnRleHQgKSB7XG5cblx0XHRcdFx0XHRcdFx0Ly8gUHJvcGVydGllcyBvZiBjb250ZXh0IGFyZSBjYWxsZWQgYXMgbWV0aG9kcyBpZiBwb3NzaWJsZVxuXHRcdFx0XHRcdFx0XHRpZiAoIGpRdWVyeS5pc0Z1bmN0aW9uKCB0aGlzWyBtYXRjaCBdICkgKSB7XG5cdFx0XHRcdFx0XHRcdFx0dGhpc1sgbWF0Y2ggXSggY29udGV4dFsgbWF0Y2ggXSApO1xuXG5cdFx0XHRcdFx0XHRcdC8vIC4uLmFuZCBvdGhlcndpc2Ugc2V0IGFzIGF0dHJpYnV0ZXNcblx0XHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0XHR0aGlzLmF0dHIoIG1hdGNoLCBjb250ZXh0WyBtYXRjaCBdICk7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHRyZXR1cm4gdGhpcztcblxuXHRcdFx0XHQvLyBIQU5ETEU6ICQoI2lkKVxuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdGVsZW0gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCggbWF0Y2hbIDIgXSApO1xuXG5cdFx0XHRcdFx0Ly8gU3VwcG9ydDogQmxhY2tiZXJyeSA0LjZcblx0XHRcdFx0XHQvLyBnRUJJRCByZXR1cm5zIG5vZGVzIG5vIGxvbmdlciBpbiB0aGUgZG9jdW1lbnQgKCM2OTYzKVxuXHRcdFx0XHRcdGlmICggZWxlbSAmJiBlbGVtLnBhcmVudE5vZGUgKSB7XG5cblx0XHRcdFx0XHRcdC8vIEluamVjdCB0aGUgZWxlbWVudCBkaXJlY3RseSBpbnRvIHRoZSBqUXVlcnkgb2JqZWN0XG5cdFx0XHRcdFx0XHR0aGlzLmxlbmd0aCA9IDE7XG5cdFx0XHRcdFx0XHR0aGlzWyAwIF0gPSBlbGVtO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdHRoaXMuY29udGV4dCA9IGRvY3VtZW50O1xuXHRcdFx0XHRcdHRoaXMuc2VsZWN0b3IgPSBzZWxlY3Rvcjtcblx0XHRcdFx0XHRyZXR1cm4gdGhpcztcblx0XHRcdFx0fVxuXG5cdFx0XHQvLyBIQU5ETEU6ICQoZXhwciwgJCguLi4pKVxuXHRcdFx0fSBlbHNlIGlmICggIWNvbnRleHQgfHwgY29udGV4dC5qcXVlcnkgKSB7XG5cdFx0XHRcdHJldHVybiAoIGNvbnRleHQgfHwgcm9vdCApLmZpbmQoIHNlbGVjdG9yICk7XG5cblx0XHRcdC8vIEhBTkRMRTogJChleHByLCBjb250ZXh0KVxuXHRcdFx0Ly8gKHdoaWNoIGlzIGp1c3QgZXF1aXZhbGVudCB0bzogJChjb250ZXh0KS5maW5kKGV4cHIpXG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRyZXR1cm4gdGhpcy5jb25zdHJ1Y3RvciggY29udGV4dCApLmZpbmQoIHNlbGVjdG9yICk7XG5cdFx0XHR9XG5cblx0XHQvLyBIQU5ETEU6ICQoRE9NRWxlbWVudClcblx0XHR9IGVsc2UgaWYgKCBzZWxlY3Rvci5ub2RlVHlwZSApIHtcblx0XHRcdHRoaXMuY29udGV4dCA9IHRoaXNbIDAgXSA9IHNlbGVjdG9yO1xuXHRcdFx0dGhpcy5sZW5ndGggPSAxO1xuXHRcdFx0cmV0dXJuIHRoaXM7XG5cblx0XHQvLyBIQU5ETEU6ICQoZnVuY3Rpb24pXG5cdFx0Ly8gU2hvcnRjdXQgZm9yIGRvY3VtZW50IHJlYWR5XG5cdFx0fSBlbHNlIGlmICggalF1ZXJ5LmlzRnVuY3Rpb24oIHNlbGVjdG9yICkgKSB7XG5cdFx0XHRyZXR1cm4gcm9vdC5yZWFkeSAhPT0gdW5kZWZpbmVkID9cblx0XHRcdFx0cm9vdC5yZWFkeSggc2VsZWN0b3IgKSA6XG5cblx0XHRcdFx0Ly8gRXhlY3V0ZSBpbW1lZGlhdGVseSBpZiByZWFkeSBpcyBub3QgcHJlc2VudFxuXHRcdFx0XHRzZWxlY3RvciggalF1ZXJ5ICk7XG5cdFx0fVxuXG5cdFx0aWYgKCBzZWxlY3Rvci5zZWxlY3RvciAhPT0gdW5kZWZpbmVkICkge1xuXHRcdFx0dGhpcy5zZWxlY3RvciA9IHNlbGVjdG9yLnNlbGVjdG9yO1xuXHRcdFx0dGhpcy5jb250ZXh0ID0gc2VsZWN0b3IuY29udGV4dDtcblx0XHR9XG5cblx0XHRyZXR1cm4galF1ZXJ5Lm1ha2VBcnJheSggc2VsZWN0b3IsIHRoaXMgKTtcblx0fTtcblxuLy8gR2l2ZSB0aGUgaW5pdCBmdW5jdGlvbiB0aGUgalF1ZXJ5IHByb3RvdHlwZSBmb3IgbGF0ZXIgaW5zdGFudGlhdGlvblxuaW5pdC5wcm90b3R5cGUgPSBqUXVlcnkuZm47XG5cbi8vIEluaXRpYWxpemUgY2VudHJhbCByZWZlcmVuY2VcbnJvb3RqUXVlcnkgPSBqUXVlcnkoIGRvY3VtZW50ICk7XG5cblxudmFyIHJwYXJlbnRzcHJldiA9IC9eKD86cGFyZW50c3xwcmV2KD86VW50aWx8QWxsKSkvLFxuXG5cdC8vIE1ldGhvZHMgZ3VhcmFudGVlZCB0byBwcm9kdWNlIGEgdW5pcXVlIHNldCB3aGVuIHN0YXJ0aW5nIGZyb20gYSB1bmlxdWUgc2V0XG5cdGd1YXJhbnRlZWRVbmlxdWUgPSB7XG5cdFx0Y2hpbGRyZW46IHRydWUsXG5cdFx0Y29udGVudHM6IHRydWUsXG5cdFx0bmV4dDogdHJ1ZSxcblx0XHRwcmV2OiB0cnVlXG5cdH07XG5cbmpRdWVyeS5mbi5leHRlbmQoIHtcblx0aGFzOiBmdW5jdGlvbiggdGFyZ2V0ICkge1xuXHRcdHZhciB0YXJnZXRzID0galF1ZXJ5KCB0YXJnZXQsIHRoaXMgKSxcblx0XHRcdGwgPSB0YXJnZXRzLmxlbmd0aDtcblxuXHRcdHJldHVybiB0aGlzLmZpbHRlciggZnVuY3Rpb24oKSB7XG5cdFx0XHR2YXIgaSA9IDA7XG5cdFx0XHRmb3IgKCA7IGkgPCBsOyBpKysgKSB7XG5cdFx0XHRcdGlmICggalF1ZXJ5LmNvbnRhaW5zKCB0aGlzLCB0YXJnZXRzWyBpIF0gKSApIHtcblx0XHRcdFx0XHRyZXR1cm4gdHJ1ZTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0gKTtcblx0fSxcblxuXHRjbG9zZXN0OiBmdW5jdGlvbiggc2VsZWN0b3JzLCBjb250ZXh0ICkge1xuXHRcdHZhciBjdXIsXG5cdFx0XHRpID0gMCxcblx0XHRcdGwgPSB0aGlzLmxlbmd0aCxcblx0XHRcdG1hdGNoZWQgPSBbXSxcblx0XHRcdHBvcyA9IHJuZWVkc0NvbnRleHQudGVzdCggc2VsZWN0b3JzICkgfHwgdHlwZW9mIHNlbGVjdG9ycyAhPT0gXCJzdHJpbmdcIiA/XG5cdFx0XHRcdGpRdWVyeSggc2VsZWN0b3JzLCBjb250ZXh0IHx8IHRoaXMuY29udGV4dCApIDpcblx0XHRcdFx0MDtcblxuXHRcdGZvciAoIDsgaSA8IGw7IGkrKyApIHtcblx0XHRcdGZvciAoIGN1ciA9IHRoaXNbIGkgXTsgY3VyICYmIGN1ciAhPT0gY29udGV4dDsgY3VyID0gY3VyLnBhcmVudE5vZGUgKSB7XG5cblx0XHRcdFx0Ly8gQWx3YXlzIHNraXAgZG9jdW1lbnQgZnJhZ21lbnRzXG5cdFx0XHRcdGlmICggY3VyLm5vZGVUeXBlIDwgMTEgJiYgKCBwb3MgP1xuXHRcdFx0XHRcdHBvcy5pbmRleCggY3VyICkgPiAtMSA6XG5cblx0XHRcdFx0XHQvLyBEb24ndCBwYXNzIG5vbi1lbGVtZW50cyB0byBTaXp6bGVcblx0XHRcdFx0XHRjdXIubm9kZVR5cGUgPT09IDEgJiZcblx0XHRcdFx0XHRcdGpRdWVyeS5maW5kLm1hdGNoZXNTZWxlY3RvciggY3VyLCBzZWxlY3RvcnMgKSApICkge1xuXG5cdFx0XHRcdFx0bWF0Y2hlZC5wdXNoKCBjdXIgKTtcblx0XHRcdFx0XHRicmVhaztcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzLnB1c2hTdGFjayggbWF0Y2hlZC5sZW5ndGggPiAxID8galF1ZXJ5LnVuaXF1ZVNvcnQoIG1hdGNoZWQgKSA6IG1hdGNoZWQgKTtcblx0fSxcblxuXHQvLyBEZXRlcm1pbmUgdGhlIHBvc2l0aW9uIG9mIGFuIGVsZW1lbnQgd2l0aGluIHRoZSBzZXRcblx0aW5kZXg6IGZ1bmN0aW9uKCBlbGVtICkge1xuXG5cdFx0Ly8gTm8gYXJndW1lbnQsIHJldHVybiBpbmRleCBpbiBwYXJlbnRcblx0XHRpZiAoICFlbGVtICkge1xuXHRcdFx0cmV0dXJuICggdGhpc1sgMCBdICYmIHRoaXNbIDAgXS5wYXJlbnROb2RlICkgPyB0aGlzLmZpcnN0KCkucHJldkFsbCgpLmxlbmd0aCA6IC0xO1xuXHRcdH1cblxuXHRcdC8vIEluZGV4IGluIHNlbGVjdG9yXG5cdFx0aWYgKCB0eXBlb2YgZWxlbSA9PT0gXCJzdHJpbmdcIiApIHtcblx0XHRcdHJldHVybiBpbmRleE9mLmNhbGwoIGpRdWVyeSggZWxlbSApLCB0aGlzWyAwIF0gKTtcblx0XHR9XG5cblx0XHQvLyBMb2NhdGUgdGhlIHBvc2l0aW9uIG9mIHRoZSBkZXNpcmVkIGVsZW1lbnRcblx0XHRyZXR1cm4gaW5kZXhPZi5jYWxsKCB0aGlzLFxuXG5cdFx0XHQvLyBJZiBpdCByZWNlaXZlcyBhIGpRdWVyeSBvYmplY3QsIHRoZSBmaXJzdCBlbGVtZW50IGlzIHVzZWRcblx0XHRcdGVsZW0uanF1ZXJ5ID8gZWxlbVsgMCBdIDogZWxlbVxuXHRcdCk7XG5cdH0sXG5cblx0YWRkOiBmdW5jdGlvbiggc2VsZWN0b3IsIGNvbnRleHQgKSB7XG5cdFx0cmV0dXJuIHRoaXMucHVzaFN0YWNrKFxuXHRcdFx0alF1ZXJ5LnVuaXF1ZVNvcnQoXG5cdFx0XHRcdGpRdWVyeS5tZXJnZSggdGhpcy5nZXQoKSwgalF1ZXJ5KCBzZWxlY3RvciwgY29udGV4dCApIClcblx0XHRcdClcblx0XHQpO1xuXHR9LFxuXG5cdGFkZEJhY2s6IGZ1bmN0aW9uKCBzZWxlY3RvciApIHtcblx0XHRyZXR1cm4gdGhpcy5hZGQoIHNlbGVjdG9yID09IG51bGwgP1xuXHRcdFx0dGhpcy5wcmV2T2JqZWN0IDogdGhpcy5wcmV2T2JqZWN0LmZpbHRlciggc2VsZWN0b3IgKVxuXHRcdCk7XG5cdH1cbn0gKTtcblxuZnVuY3Rpb24gc2libGluZyggY3VyLCBkaXIgKSB7XG5cdHdoaWxlICggKCBjdXIgPSBjdXJbIGRpciBdICkgJiYgY3VyLm5vZGVUeXBlICE9PSAxICkge31cblx0cmV0dXJuIGN1cjtcbn1cblxualF1ZXJ5LmVhY2goIHtcblx0cGFyZW50OiBmdW5jdGlvbiggZWxlbSApIHtcblx0XHR2YXIgcGFyZW50ID0gZWxlbS5wYXJlbnROb2RlO1xuXHRcdHJldHVybiBwYXJlbnQgJiYgcGFyZW50Lm5vZGVUeXBlICE9PSAxMSA/IHBhcmVudCA6IG51bGw7XG5cdH0sXG5cdHBhcmVudHM6IGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdHJldHVybiBkaXIoIGVsZW0sIFwicGFyZW50Tm9kZVwiICk7XG5cdH0sXG5cdHBhcmVudHNVbnRpbDogZnVuY3Rpb24oIGVsZW0sIGksIHVudGlsICkge1xuXHRcdHJldHVybiBkaXIoIGVsZW0sIFwicGFyZW50Tm9kZVwiLCB1bnRpbCApO1xuXHR9LFxuXHRuZXh0OiBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRyZXR1cm4gc2libGluZyggZWxlbSwgXCJuZXh0U2libGluZ1wiICk7XG5cdH0sXG5cdHByZXY6IGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdHJldHVybiBzaWJsaW5nKCBlbGVtLCBcInByZXZpb3VzU2libGluZ1wiICk7XG5cdH0sXG5cdG5leHRBbGw6IGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdHJldHVybiBkaXIoIGVsZW0sIFwibmV4dFNpYmxpbmdcIiApO1xuXHR9LFxuXHRwcmV2QWxsOiBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRyZXR1cm4gZGlyKCBlbGVtLCBcInByZXZpb3VzU2libGluZ1wiICk7XG5cdH0sXG5cdG5leHRVbnRpbDogZnVuY3Rpb24oIGVsZW0sIGksIHVudGlsICkge1xuXHRcdHJldHVybiBkaXIoIGVsZW0sIFwibmV4dFNpYmxpbmdcIiwgdW50aWwgKTtcblx0fSxcblx0cHJldlVudGlsOiBmdW5jdGlvbiggZWxlbSwgaSwgdW50aWwgKSB7XG5cdFx0cmV0dXJuIGRpciggZWxlbSwgXCJwcmV2aW91c1NpYmxpbmdcIiwgdW50aWwgKTtcblx0fSxcblx0c2libGluZ3M6IGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdHJldHVybiBzaWJsaW5ncyggKCBlbGVtLnBhcmVudE5vZGUgfHwge30gKS5maXJzdENoaWxkLCBlbGVtICk7XG5cdH0sXG5cdGNoaWxkcmVuOiBmdW5jdGlvbiggZWxlbSApIHtcblx0XHRyZXR1cm4gc2libGluZ3MoIGVsZW0uZmlyc3RDaGlsZCApO1xuXHR9LFxuXHRjb250ZW50czogZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0cmV0dXJuIGVsZW0uY29udGVudERvY3VtZW50IHx8IGpRdWVyeS5tZXJnZSggW10sIGVsZW0uY2hpbGROb2RlcyApO1xuXHR9XG59LCBmdW5jdGlvbiggbmFtZSwgZm4gKSB7XG5cdGpRdWVyeS5mblsgbmFtZSBdID0gZnVuY3Rpb24oIHVudGlsLCBzZWxlY3RvciApIHtcblx0XHR2YXIgbWF0Y2hlZCA9IGpRdWVyeS5tYXAoIHRoaXMsIGZuLCB1bnRpbCApO1xuXG5cdFx0aWYgKCBuYW1lLnNsaWNlKCAtNSApICE9PSBcIlVudGlsXCIgKSB7XG5cdFx0XHRzZWxlY3RvciA9IHVudGlsO1xuXHRcdH1cblxuXHRcdGlmICggc2VsZWN0b3IgJiYgdHlwZW9mIHNlbGVjdG9yID09PSBcInN0cmluZ1wiICkge1xuXHRcdFx0bWF0Y2hlZCA9IGpRdWVyeS5maWx0ZXIoIHNlbGVjdG9yLCBtYXRjaGVkICk7XG5cdFx0fVxuXG5cdFx0aWYgKCB0aGlzLmxlbmd0aCA+IDEgKSB7XG5cblx0XHRcdC8vIFJlbW92ZSBkdXBsaWNhdGVzXG5cdFx0XHRpZiAoICFndWFyYW50ZWVkVW5pcXVlWyBuYW1lIF0gKSB7XG5cdFx0XHRcdGpRdWVyeS51bmlxdWVTb3J0KCBtYXRjaGVkICk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIFJldmVyc2Ugb3JkZXIgZm9yIHBhcmVudHMqIGFuZCBwcmV2LWRlcml2YXRpdmVzXG5cdFx0XHRpZiAoIHJwYXJlbnRzcHJldi50ZXN0KCBuYW1lICkgKSB7XG5cdFx0XHRcdG1hdGNoZWQucmV2ZXJzZSgpO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzLnB1c2hTdGFjayggbWF0Y2hlZCApO1xuXHR9O1xufSApO1xudmFyIHJub3R3aGl0ZSA9ICggL1xcUysvZyApO1xuXG5cblxuLy8gQ29udmVydCBTdHJpbmctZm9ybWF0dGVkIG9wdGlvbnMgaW50byBPYmplY3QtZm9ybWF0dGVkIG9uZXNcbmZ1bmN0aW9uIGNyZWF0ZU9wdGlvbnMoIG9wdGlvbnMgKSB7XG5cdHZhciBvYmplY3QgPSB7fTtcblx0alF1ZXJ5LmVhY2goIG9wdGlvbnMubWF0Y2goIHJub3R3aGl0ZSApIHx8IFtdLCBmdW5jdGlvbiggXywgZmxhZyApIHtcblx0XHRvYmplY3RbIGZsYWcgXSA9IHRydWU7XG5cdH0gKTtcblx0cmV0dXJuIG9iamVjdDtcbn1cblxuLypcbiAqIENyZWF0ZSBhIGNhbGxiYWNrIGxpc3QgdXNpbmcgdGhlIGZvbGxvd2luZyBwYXJhbWV0ZXJzOlxuICpcbiAqXHRvcHRpb25zOiBhbiBvcHRpb25hbCBsaXN0IG9mIHNwYWNlLXNlcGFyYXRlZCBvcHRpb25zIHRoYXQgd2lsbCBjaGFuZ2UgaG93XG4gKlx0XHRcdHRoZSBjYWxsYmFjayBsaXN0IGJlaGF2ZXMgb3IgYSBtb3JlIHRyYWRpdGlvbmFsIG9wdGlvbiBvYmplY3RcbiAqXG4gKiBCeSBkZWZhdWx0IGEgY2FsbGJhY2sgbGlzdCB3aWxsIGFjdCBsaWtlIGFuIGV2ZW50IGNhbGxiYWNrIGxpc3QgYW5kIGNhbiBiZVxuICogXCJmaXJlZFwiIG11bHRpcGxlIHRpbWVzLlxuICpcbiAqIFBvc3NpYmxlIG9wdGlvbnM6XG4gKlxuICpcdG9uY2U6XHRcdFx0d2lsbCBlbnN1cmUgdGhlIGNhbGxiYWNrIGxpc3QgY2FuIG9ubHkgYmUgZmlyZWQgb25jZSAobGlrZSBhIERlZmVycmVkKVxuICpcbiAqXHRtZW1vcnk6XHRcdFx0d2lsbCBrZWVwIHRyYWNrIG9mIHByZXZpb3VzIHZhbHVlcyBhbmQgd2lsbCBjYWxsIGFueSBjYWxsYmFjayBhZGRlZFxuICpcdFx0XHRcdFx0YWZ0ZXIgdGhlIGxpc3QgaGFzIGJlZW4gZmlyZWQgcmlnaHQgYXdheSB3aXRoIHRoZSBsYXRlc3QgXCJtZW1vcml6ZWRcIlxuICpcdFx0XHRcdFx0dmFsdWVzIChsaWtlIGEgRGVmZXJyZWQpXG4gKlxuICpcdHVuaXF1ZTpcdFx0XHR3aWxsIGVuc3VyZSBhIGNhbGxiYWNrIGNhbiBvbmx5IGJlIGFkZGVkIG9uY2UgKG5vIGR1cGxpY2F0ZSBpbiB0aGUgbGlzdClcbiAqXG4gKlx0c3RvcE9uRmFsc2U6XHRpbnRlcnJ1cHQgY2FsbGluZ3Mgd2hlbiBhIGNhbGxiYWNrIHJldHVybnMgZmFsc2VcbiAqXG4gKi9cbmpRdWVyeS5DYWxsYmFja3MgPSBmdW5jdGlvbiggb3B0aW9ucyApIHtcblxuXHQvLyBDb252ZXJ0IG9wdGlvbnMgZnJvbSBTdHJpbmctZm9ybWF0dGVkIHRvIE9iamVjdC1mb3JtYXR0ZWQgaWYgbmVlZGVkXG5cdC8vICh3ZSBjaGVjayBpbiBjYWNoZSBmaXJzdClcblx0b3B0aW9ucyA9IHR5cGVvZiBvcHRpb25zID09PSBcInN0cmluZ1wiID9cblx0XHRjcmVhdGVPcHRpb25zKCBvcHRpb25zICkgOlxuXHRcdGpRdWVyeS5leHRlbmQoIHt9LCBvcHRpb25zICk7XG5cblx0dmFyIC8vIEZsYWcgdG8ga25vdyBpZiBsaXN0IGlzIGN1cnJlbnRseSBmaXJpbmdcblx0XHRmaXJpbmcsXG5cblx0XHQvLyBMYXN0IGZpcmUgdmFsdWUgZm9yIG5vbi1mb3JnZXR0YWJsZSBsaXN0c1xuXHRcdG1lbW9yeSxcblxuXHRcdC8vIEZsYWcgdG8ga25vdyBpZiBsaXN0IHdhcyBhbHJlYWR5IGZpcmVkXG5cdFx0ZmlyZWQsXG5cblx0XHQvLyBGbGFnIHRvIHByZXZlbnQgZmlyaW5nXG5cdFx0bG9ja2VkLFxuXG5cdFx0Ly8gQWN0dWFsIGNhbGxiYWNrIGxpc3Rcblx0XHRsaXN0ID0gW10sXG5cblx0XHQvLyBRdWV1ZSBvZiBleGVjdXRpb24gZGF0YSBmb3IgcmVwZWF0YWJsZSBsaXN0c1xuXHRcdHF1ZXVlID0gW10sXG5cblx0XHQvLyBJbmRleCBvZiBjdXJyZW50bHkgZmlyaW5nIGNhbGxiYWNrIChtb2RpZmllZCBieSBhZGQvcmVtb3ZlIGFzIG5lZWRlZClcblx0XHRmaXJpbmdJbmRleCA9IC0xLFxuXG5cdFx0Ly8gRmlyZSBjYWxsYmFja3Ncblx0XHRmaXJlID0gZnVuY3Rpb24oKSB7XG5cblx0XHRcdC8vIEVuZm9yY2Ugc2luZ2xlLWZpcmluZ1xuXHRcdFx0bG9ja2VkID0gb3B0aW9ucy5vbmNlO1xuXG5cdFx0XHQvLyBFeGVjdXRlIGNhbGxiYWNrcyBmb3IgYWxsIHBlbmRpbmcgZXhlY3V0aW9ucyxcblx0XHRcdC8vIHJlc3BlY3RpbmcgZmlyaW5nSW5kZXggb3ZlcnJpZGVzIGFuZCBydW50aW1lIGNoYW5nZXNcblx0XHRcdGZpcmVkID0gZmlyaW5nID0gdHJ1ZTtcblx0XHRcdGZvciAoIDsgcXVldWUubGVuZ3RoOyBmaXJpbmdJbmRleCA9IC0xICkge1xuXHRcdFx0XHRtZW1vcnkgPSBxdWV1ZS5zaGlmdCgpO1xuXHRcdFx0XHR3aGlsZSAoICsrZmlyaW5nSW5kZXggPCBsaXN0Lmxlbmd0aCApIHtcblxuXHRcdFx0XHRcdC8vIFJ1biBjYWxsYmFjayBhbmQgY2hlY2sgZm9yIGVhcmx5IHRlcm1pbmF0aW9uXG5cdFx0XHRcdFx0aWYgKCBsaXN0WyBmaXJpbmdJbmRleCBdLmFwcGx5KCBtZW1vcnlbIDAgXSwgbWVtb3J5WyAxIF0gKSA9PT0gZmFsc2UgJiZcblx0XHRcdFx0XHRcdG9wdGlvbnMuc3RvcE9uRmFsc2UgKSB7XG5cblx0XHRcdFx0XHRcdC8vIEp1bXAgdG8gZW5kIGFuZCBmb3JnZXQgdGhlIGRhdGEgc28gLmFkZCBkb2Vzbid0IHJlLWZpcmVcblx0XHRcdFx0XHRcdGZpcmluZ0luZGV4ID0gbGlzdC5sZW5ndGg7XG5cdFx0XHRcdFx0XHRtZW1vcnkgPSBmYWxzZTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0Ly8gRm9yZ2V0IHRoZSBkYXRhIGlmIHdlJ3JlIGRvbmUgd2l0aCBpdFxuXHRcdFx0aWYgKCAhb3B0aW9ucy5tZW1vcnkgKSB7XG5cdFx0XHRcdG1lbW9yeSA9IGZhbHNlO1xuXHRcdFx0fVxuXG5cdFx0XHRmaXJpbmcgPSBmYWxzZTtcblxuXHRcdFx0Ly8gQ2xlYW4gdXAgaWYgd2UncmUgZG9uZSBmaXJpbmcgZm9yIGdvb2Rcblx0XHRcdGlmICggbG9ja2VkICkge1xuXG5cdFx0XHRcdC8vIEtlZXAgYW4gZW1wdHkgbGlzdCBpZiB3ZSBoYXZlIGRhdGEgZm9yIGZ1dHVyZSBhZGQgY2FsbHNcblx0XHRcdFx0aWYgKCBtZW1vcnkgKSB7XG5cdFx0XHRcdFx0bGlzdCA9IFtdO1xuXG5cdFx0XHRcdC8vIE90aGVyd2lzZSwgdGhpcyBvYmplY3QgaXMgc3BlbnRcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRsaXN0ID0gXCJcIjtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH0sXG5cblx0XHQvLyBBY3R1YWwgQ2FsbGJhY2tzIG9iamVjdFxuXHRcdHNlbGYgPSB7XG5cblx0XHRcdC8vIEFkZCBhIGNhbGxiYWNrIG9yIGEgY29sbGVjdGlvbiBvZiBjYWxsYmFja3MgdG8gdGhlIGxpc3Rcblx0XHRcdGFkZDogZnVuY3Rpb24oKSB7XG5cdFx0XHRcdGlmICggbGlzdCApIHtcblxuXHRcdFx0XHRcdC8vIElmIHdlIGhhdmUgbWVtb3J5IGZyb20gYSBwYXN0IHJ1biwgd2Ugc2hvdWxkIGZpcmUgYWZ0ZXIgYWRkaW5nXG5cdFx0XHRcdFx0aWYgKCBtZW1vcnkgJiYgIWZpcmluZyApIHtcblx0XHRcdFx0XHRcdGZpcmluZ0luZGV4ID0gbGlzdC5sZW5ndGggLSAxO1xuXHRcdFx0XHRcdFx0cXVldWUucHVzaCggbWVtb3J5ICk7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0KCBmdW5jdGlvbiBhZGQoIGFyZ3MgKSB7XG5cdFx0XHRcdFx0XHRqUXVlcnkuZWFjaCggYXJncywgZnVuY3Rpb24oIF8sIGFyZyApIHtcblx0XHRcdFx0XHRcdFx0aWYgKCBqUXVlcnkuaXNGdW5jdGlvbiggYXJnICkgKSB7XG5cdFx0XHRcdFx0XHRcdFx0aWYgKCAhb3B0aW9ucy51bmlxdWUgfHwgIXNlbGYuaGFzKCBhcmcgKSApIHtcblx0XHRcdFx0XHRcdFx0XHRcdGxpc3QucHVzaCggYXJnICk7XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHR9IGVsc2UgaWYgKCBhcmcgJiYgYXJnLmxlbmd0aCAmJiBqUXVlcnkudHlwZSggYXJnICkgIT09IFwic3RyaW5nXCIgKSB7XG5cblx0XHRcdFx0XHRcdFx0XHQvLyBJbnNwZWN0IHJlY3Vyc2l2ZWx5XG5cdFx0XHRcdFx0XHRcdFx0YWRkKCBhcmcgKTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fSApO1xuXHRcdFx0XHRcdH0gKSggYXJndW1lbnRzICk7XG5cblx0XHRcdFx0XHRpZiAoIG1lbW9yeSAmJiAhZmlyaW5nICkge1xuXHRcdFx0XHRcdFx0ZmlyZSgpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0XHRyZXR1cm4gdGhpcztcblx0XHRcdH0sXG5cblx0XHRcdC8vIFJlbW92ZSBhIGNhbGxiYWNrIGZyb20gdGhlIGxpc3Rcblx0XHRcdHJlbW92ZTogZnVuY3Rpb24oKSB7XG5cdFx0XHRcdGpRdWVyeS5lYWNoKCBhcmd1bWVudHMsIGZ1bmN0aW9uKCBfLCBhcmcgKSB7XG5cdFx0XHRcdFx0dmFyIGluZGV4O1xuXHRcdFx0XHRcdHdoaWxlICggKCBpbmRleCA9IGpRdWVyeS5pbkFycmF5KCBhcmcsIGxpc3QsIGluZGV4ICkgKSA+IC0xICkge1xuXHRcdFx0XHRcdFx0bGlzdC5zcGxpY2UoIGluZGV4LCAxICk7XG5cblx0XHRcdFx0XHRcdC8vIEhhbmRsZSBmaXJpbmcgaW5kZXhlc1xuXHRcdFx0XHRcdFx0aWYgKCBpbmRleCA8PSBmaXJpbmdJbmRleCApIHtcblx0XHRcdFx0XHRcdFx0ZmlyaW5nSW5kZXgtLTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0gKTtcblx0XHRcdFx0cmV0dXJuIHRoaXM7XG5cdFx0XHR9LFxuXG5cdFx0XHQvLyBDaGVjayBpZiBhIGdpdmVuIGNhbGxiYWNrIGlzIGluIHRoZSBsaXN0LlxuXHRcdFx0Ly8gSWYgbm8gYXJndW1lbnQgaXMgZ2l2ZW4sIHJldHVybiB3aGV0aGVyIG9yIG5vdCBsaXN0IGhhcyBjYWxsYmFja3MgYXR0YWNoZWQuXG5cdFx0XHRoYXM6IGZ1bmN0aW9uKCBmbiApIHtcblx0XHRcdFx0cmV0dXJuIGZuID9cblx0XHRcdFx0XHRqUXVlcnkuaW5BcnJheSggZm4sIGxpc3QgKSA+IC0xIDpcblx0XHRcdFx0XHRsaXN0Lmxlbmd0aCA+IDA7XG5cdFx0XHR9LFxuXG5cdFx0XHQvLyBSZW1vdmUgYWxsIGNhbGxiYWNrcyBmcm9tIHRoZSBsaXN0XG5cdFx0XHRlbXB0eTogZnVuY3Rpb24oKSB7XG5cdFx0XHRcdGlmICggbGlzdCApIHtcblx0XHRcdFx0XHRsaXN0ID0gW107XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIHRoaXM7XG5cdFx0XHR9LFxuXG5cdFx0XHQvLyBEaXNhYmxlIC5maXJlIGFuZCAuYWRkXG5cdFx0XHQvLyBBYm9ydCBhbnkgY3VycmVudC9wZW5kaW5nIGV4ZWN1dGlvbnNcblx0XHRcdC8vIENsZWFyIGFsbCBjYWxsYmFja3MgYW5kIHZhbHVlc1xuXHRcdFx0ZGlzYWJsZTogZnVuY3Rpb24oKSB7XG5cdFx0XHRcdGxvY2tlZCA9IHF1ZXVlID0gW107XG5cdFx0XHRcdGxpc3QgPSBtZW1vcnkgPSBcIlwiO1xuXHRcdFx0XHRyZXR1cm4gdGhpcztcblx0XHRcdH0sXG5cdFx0XHRkaXNhYmxlZDogZnVuY3Rpb24oKSB7XG5cdFx0XHRcdHJldHVybiAhbGlzdDtcblx0XHRcdH0sXG5cblx0XHRcdC8vIERpc2FibGUgLmZpcmVcblx0XHRcdC8vIEFsc28gZGlzYWJsZSAuYWRkIHVubGVzcyB3ZSBoYXZlIG1lbW9yeSAoc2luY2UgaXQgd291bGQgaGF2ZSBubyBlZmZlY3QpXG5cdFx0XHQvLyBBYm9ydCBhbnkgcGVuZGluZyBleGVjdXRpb25zXG5cdFx0XHRsb2NrOiBmdW5jdGlvbigpIHtcblx0XHRcdFx0bG9ja2VkID0gcXVldWUgPSBbXTtcblx0XHRcdFx0aWYgKCAhbWVtb3J5ICkge1xuXHRcdFx0XHRcdGxpc3QgPSBtZW1vcnkgPSBcIlwiO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHJldHVybiB0aGlzO1xuXHRcdFx0fSxcblx0XHRcdGxvY2tlZDogZnVuY3Rpb24oKSB7XG5cdFx0XHRcdHJldHVybiAhIWxvY2tlZDtcblx0XHRcdH0sXG5cblx0XHRcdC8vIENhbGwgYWxsIGNhbGxiYWNrcyB3aXRoIHRoZSBnaXZlbiBjb250ZXh0IGFuZCBhcmd1bWVudHNcblx0XHRcdGZpcmVXaXRoOiBmdW5jdGlvbiggY29udGV4dCwgYXJncyApIHtcblx0XHRcdFx0aWYgKCAhbG9ja2VkICkge1xuXHRcdFx0XHRcdGFyZ3MgPSBhcmdzIHx8IFtdO1xuXHRcdFx0XHRcdGFyZ3MgPSBbIGNvbnRleHQsIGFyZ3Muc2xpY2UgPyBhcmdzLnNsaWNlKCkgOiBhcmdzIF07XG5cdFx0XHRcdFx0cXVldWUucHVzaCggYXJncyApO1xuXHRcdFx0XHRcdGlmICggIWZpcmluZyApIHtcblx0XHRcdFx0XHRcdGZpcmUoKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIHRoaXM7XG5cdFx0XHR9LFxuXG5cdFx0XHQvLyBDYWxsIGFsbCB0aGUgY2FsbGJhY2tzIHdpdGggdGhlIGdpdmVuIGFyZ3VtZW50c1xuXHRcdFx0ZmlyZTogZnVuY3Rpb24oKSB7XG5cdFx0XHRcdHNlbGYuZmlyZVdpdGgoIHRoaXMsIGFyZ3VtZW50cyApO1xuXHRcdFx0XHRyZXR1cm4gdGhpcztcblx0XHRcdH0sXG5cblx0XHRcdC8vIFRvIGtub3cgaWYgdGhlIGNhbGxiYWNrcyBoYXZlIGFscmVhZHkgYmVlbiBjYWxsZWQgYXQgbGVhc3Qgb25jZVxuXHRcdFx0ZmlyZWQ6IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRyZXR1cm4gISFmaXJlZDtcblx0XHRcdH1cblx0XHR9O1xuXG5cdHJldHVybiBzZWxmO1xufTtcblxuXG5qUXVlcnkuZXh0ZW5kKCB7XG5cblx0RGVmZXJyZWQ6IGZ1bmN0aW9uKCBmdW5jICkge1xuXHRcdHZhciB0dXBsZXMgPSBbXG5cblx0XHRcdFx0Ly8gYWN0aW9uLCBhZGQgbGlzdGVuZXIsIGxpc3RlbmVyIGxpc3QsIGZpbmFsIHN0YXRlXG5cdFx0XHRcdFsgXCJyZXNvbHZlXCIsIFwiZG9uZVwiLCBqUXVlcnkuQ2FsbGJhY2tzKCBcIm9uY2UgbWVtb3J5XCIgKSwgXCJyZXNvbHZlZFwiIF0sXG5cdFx0XHRcdFsgXCJyZWplY3RcIiwgXCJmYWlsXCIsIGpRdWVyeS5DYWxsYmFja3MoIFwib25jZSBtZW1vcnlcIiApLCBcInJlamVjdGVkXCIgXSxcblx0XHRcdFx0WyBcIm5vdGlmeVwiLCBcInByb2dyZXNzXCIsIGpRdWVyeS5DYWxsYmFja3MoIFwibWVtb3J5XCIgKSBdXG5cdFx0XHRdLFxuXHRcdFx0c3RhdGUgPSBcInBlbmRpbmdcIixcblx0XHRcdHByb21pc2UgPSB7XG5cdFx0XHRcdHN0YXRlOiBmdW5jdGlvbigpIHtcblx0XHRcdFx0XHRyZXR1cm4gc3RhdGU7XG5cdFx0XHRcdH0sXG5cdFx0XHRcdGFsd2F5czogZnVuY3Rpb24oKSB7XG5cdFx0XHRcdFx0ZGVmZXJyZWQuZG9uZSggYXJndW1lbnRzICkuZmFpbCggYXJndW1lbnRzICk7XG5cdFx0XHRcdFx0cmV0dXJuIHRoaXM7XG5cdFx0XHRcdH0sXG5cdFx0XHRcdHRoZW46IGZ1bmN0aW9uKCAvKiBmbkRvbmUsIGZuRmFpbCwgZm5Qcm9ncmVzcyAqLyApIHtcblx0XHRcdFx0XHR2YXIgZm5zID0gYXJndW1lbnRzO1xuXHRcdFx0XHRcdHJldHVybiBqUXVlcnkuRGVmZXJyZWQoIGZ1bmN0aW9uKCBuZXdEZWZlciApIHtcblx0XHRcdFx0XHRcdGpRdWVyeS5lYWNoKCB0dXBsZXMsIGZ1bmN0aW9uKCBpLCB0dXBsZSApIHtcblx0XHRcdFx0XHRcdFx0dmFyIGZuID0galF1ZXJ5LmlzRnVuY3Rpb24oIGZuc1sgaSBdICkgJiYgZm5zWyBpIF07XG5cblx0XHRcdFx0XHRcdFx0Ly8gZGVmZXJyZWRbIGRvbmUgfCBmYWlsIHwgcHJvZ3Jlc3MgXSBmb3IgZm9yd2FyZGluZyBhY3Rpb25zIHRvIG5ld0RlZmVyXG5cdFx0XHRcdFx0XHRcdGRlZmVycmVkWyB0dXBsZVsgMSBdIF0oIGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRcdFx0XHRcdHZhciByZXR1cm5lZCA9IGZuICYmIGZuLmFwcGx5KCB0aGlzLCBhcmd1bWVudHMgKTtcblx0XHRcdFx0XHRcdFx0XHRpZiAoIHJldHVybmVkICYmIGpRdWVyeS5pc0Z1bmN0aW9uKCByZXR1cm5lZC5wcm9taXNlICkgKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRyZXR1cm5lZC5wcm9taXNlKClcblx0XHRcdFx0XHRcdFx0XHRcdFx0LnByb2dyZXNzKCBuZXdEZWZlci5ub3RpZnkgKVxuXHRcdFx0XHRcdFx0XHRcdFx0XHQuZG9uZSggbmV3RGVmZXIucmVzb2x2ZSApXG5cdFx0XHRcdFx0XHRcdFx0XHRcdC5mYWlsKCBuZXdEZWZlci5yZWplY3QgKTtcblx0XHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRcdFx0bmV3RGVmZXJbIHR1cGxlWyAwIF0gKyBcIldpdGhcIiBdKFxuXHRcdFx0XHRcdFx0XHRcdFx0XHR0aGlzID09PSBwcm9taXNlID8gbmV3RGVmZXIucHJvbWlzZSgpIDogdGhpcyxcblx0XHRcdFx0XHRcdFx0XHRcdFx0Zm4gPyBbIHJldHVybmVkIF0gOiBhcmd1bWVudHNcblx0XHRcdFx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHR9ICk7XG5cdFx0XHRcdFx0XHR9ICk7XG5cdFx0XHRcdFx0XHRmbnMgPSBudWxsO1xuXHRcdFx0XHRcdH0gKS5wcm9taXNlKCk7XG5cdFx0XHRcdH0sXG5cblx0XHRcdFx0Ly8gR2V0IGEgcHJvbWlzZSBmb3IgdGhpcyBkZWZlcnJlZFxuXHRcdFx0XHQvLyBJZiBvYmogaXMgcHJvdmlkZWQsIHRoZSBwcm9taXNlIGFzcGVjdCBpcyBhZGRlZCB0byB0aGUgb2JqZWN0XG5cdFx0XHRcdHByb21pc2U6IGZ1bmN0aW9uKCBvYmogKSB7XG5cdFx0XHRcdFx0cmV0dXJuIG9iaiAhPSBudWxsID8galF1ZXJ5LmV4dGVuZCggb2JqLCBwcm9taXNlICkgOiBwcm9taXNlO1xuXHRcdFx0XHR9XG5cdFx0XHR9LFxuXHRcdFx0ZGVmZXJyZWQgPSB7fTtcblxuXHRcdC8vIEtlZXAgcGlwZSBmb3IgYmFjay1jb21wYXRcblx0XHRwcm9taXNlLnBpcGUgPSBwcm9taXNlLnRoZW47XG5cblx0XHQvLyBBZGQgbGlzdC1zcGVjaWZpYyBtZXRob2RzXG5cdFx0alF1ZXJ5LmVhY2goIHR1cGxlcywgZnVuY3Rpb24oIGksIHR1cGxlICkge1xuXHRcdFx0dmFyIGxpc3QgPSB0dXBsZVsgMiBdLFxuXHRcdFx0XHRzdGF0ZVN0cmluZyA9IHR1cGxlWyAzIF07XG5cblx0XHRcdC8vIHByb21pc2VbIGRvbmUgfCBmYWlsIHwgcHJvZ3Jlc3MgXSA9IGxpc3QuYWRkXG5cdFx0XHRwcm9taXNlWyB0dXBsZVsgMSBdIF0gPSBsaXN0LmFkZDtcblxuXHRcdFx0Ly8gSGFuZGxlIHN0YXRlXG5cdFx0XHRpZiAoIHN0YXRlU3RyaW5nICkge1xuXHRcdFx0XHRsaXN0LmFkZCggZnVuY3Rpb24oKSB7XG5cblx0XHRcdFx0XHQvLyBzdGF0ZSA9IFsgcmVzb2x2ZWQgfCByZWplY3RlZCBdXG5cdFx0XHRcdFx0c3RhdGUgPSBzdGF0ZVN0cmluZztcblxuXHRcdFx0XHQvLyBbIHJlamVjdF9saXN0IHwgcmVzb2x2ZV9saXN0IF0uZGlzYWJsZTsgcHJvZ3Jlc3NfbGlzdC5sb2NrXG5cdFx0XHRcdH0sIHR1cGxlc1sgaSBeIDEgXVsgMiBdLmRpc2FibGUsIHR1cGxlc1sgMiBdWyAyIF0ubG9jayApO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBkZWZlcnJlZFsgcmVzb2x2ZSB8IHJlamVjdCB8IG5vdGlmeSBdXG5cdFx0XHRkZWZlcnJlZFsgdHVwbGVbIDAgXSBdID0gZnVuY3Rpb24oKSB7XG5cdFx0XHRcdGRlZmVycmVkWyB0dXBsZVsgMCBdICsgXCJXaXRoXCIgXSggdGhpcyA9PT0gZGVmZXJyZWQgPyBwcm9taXNlIDogdGhpcywgYXJndW1lbnRzICk7XG5cdFx0XHRcdHJldHVybiB0aGlzO1xuXHRcdFx0fTtcblx0XHRcdGRlZmVycmVkWyB0dXBsZVsgMCBdICsgXCJXaXRoXCIgXSA9IGxpc3QuZmlyZVdpdGg7XG5cdFx0fSApO1xuXG5cdFx0Ly8gTWFrZSB0aGUgZGVmZXJyZWQgYSBwcm9taXNlXG5cdFx0cHJvbWlzZS5wcm9taXNlKCBkZWZlcnJlZCApO1xuXG5cdFx0Ly8gQ2FsbCBnaXZlbiBmdW5jIGlmIGFueVxuXHRcdGlmICggZnVuYyApIHtcblx0XHRcdGZ1bmMuY2FsbCggZGVmZXJyZWQsIGRlZmVycmVkICk7XG5cdFx0fVxuXG5cdFx0Ly8gQWxsIGRvbmUhXG5cdFx0cmV0dXJuIGRlZmVycmVkO1xuXHR9LFxuXG5cdC8vIERlZmVycmVkIGhlbHBlclxuXHR3aGVuOiBmdW5jdGlvbiggc3Vib3JkaW5hdGUgLyogLCAuLi4sIHN1Ym9yZGluYXRlTiAqLyApIHtcblx0XHR2YXIgaSA9IDAsXG5cdFx0XHRyZXNvbHZlVmFsdWVzID0gc2xpY2UuY2FsbCggYXJndW1lbnRzICksXG5cdFx0XHRsZW5ndGggPSByZXNvbHZlVmFsdWVzLmxlbmd0aCxcblxuXHRcdFx0Ly8gdGhlIGNvdW50IG9mIHVuY29tcGxldGVkIHN1Ym9yZGluYXRlc1xuXHRcdFx0cmVtYWluaW5nID0gbGVuZ3RoICE9PSAxIHx8XG5cdFx0XHRcdCggc3Vib3JkaW5hdGUgJiYgalF1ZXJ5LmlzRnVuY3Rpb24oIHN1Ym9yZGluYXRlLnByb21pc2UgKSApID8gbGVuZ3RoIDogMCxcblxuXHRcdFx0Ly8gdGhlIG1hc3RlciBEZWZlcnJlZC5cblx0XHRcdC8vIElmIHJlc29sdmVWYWx1ZXMgY29uc2lzdCBvZiBvbmx5IGEgc2luZ2xlIERlZmVycmVkLCBqdXN0IHVzZSB0aGF0LlxuXHRcdFx0ZGVmZXJyZWQgPSByZW1haW5pbmcgPT09IDEgPyBzdWJvcmRpbmF0ZSA6IGpRdWVyeS5EZWZlcnJlZCgpLFxuXG5cdFx0XHQvLyBVcGRhdGUgZnVuY3Rpb24gZm9yIGJvdGggcmVzb2x2ZSBhbmQgcHJvZ3Jlc3MgdmFsdWVzXG5cdFx0XHR1cGRhdGVGdW5jID0gZnVuY3Rpb24oIGksIGNvbnRleHRzLCB2YWx1ZXMgKSB7XG5cdFx0XHRcdHJldHVybiBmdW5jdGlvbiggdmFsdWUgKSB7XG5cdFx0XHRcdFx0Y29udGV4dHNbIGkgXSA9IHRoaXM7XG5cdFx0XHRcdFx0dmFsdWVzWyBpIF0gPSBhcmd1bWVudHMubGVuZ3RoID4gMSA/IHNsaWNlLmNhbGwoIGFyZ3VtZW50cyApIDogdmFsdWU7XG5cdFx0XHRcdFx0aWYgKCB2YWx1ZXMgPT09IHByb2dyZXNzVmFsdWVzICkge1xuXHRcdFx0XHRcdFx0ZGVmZXJyZWQubm90aWZ5V2l0aCggY29udGV4dHMsIHZhbHVlcyApO1xuXHRcdFx0XHRcdH0gZWxzZSBpZiAoICEoIC0tcmVtYWluaW5nICkgKSB7XG5cdFx0XHRcdFx0XHRkZWZlcnJlZC5yZXNvbHZlV2l0aCggY29udGV4dHMsIHZhbHVlcyApO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fTtcblx0XHRcdH0sXG5cblx0XHRcdHByb2dyZXNzVmFsdWVzLCBwcm9ncmVzc0NvbnRleHRzLCByZXNvbHZlQ29udGV4dHM7XG5cblx0XHQvLyBBZGQgbGlzdGVuZXJzIHRvIERlZmVycmVkIHN1Ym9yZGluYXRlczsgdHJlYXQgb3RoZXJzIGFzIHJlc29sdmVkXG5cdFx0aWYgKCBsZW5ndGggPiAxICkge1xuXHRcdFx0cHJvZ3Jlc3NWYWx1ZXMgPSBuZXcgQXJyYXkoIGxlbmd0aCApO1xuXHRcdFx0cHJvZ3Jlc3NDb250ZXh0cyA9IG5ldyBBcnJheSggbGVuZ3RoICk7XG5cdFx0XHRyZXNvbHZlQ29udGV4dHMgPSBuZXcgQXJyYXkoIGxlbmd0aCApO1xuXHRcdFx0Zm9yICggOyBpIDwgbGVuZ3RoOyBpKysgKSB7XG5cdFx0XHRcdGlmICggcmVzb2x2ZVZhbHVlc1sgaSBdICYmIGpRdWVyeS5pc0Z1bmN0aW9uKCByZXNvbHZlVmFsdWVzWyBpIF0ucHJvbWlzZSApICkge1xuXHRcdFx0XHRcdHJlc29sdmVWYWx1ZXNbIGkgXS5wcm9taXNlKClcblx0XHRcdFx0XHRcdC5wcm9ncmVzcyggdXBkYXRlRnVuYyggaSwgcHJvZ3Jlc3NDb250ZXh0cywgcHJvZ3Jlc3NWYWx1ZXMgKSApXG5cdFx0XHRcdFx0XHQuZG9uZSggdXBkYXRlRnVuYyggaSwgcmVzb2x2ZUNvbnRleHRzLCByZXNvbHZlVmFsdWVzICkgKVxuXHRcdFx0XHRcdFx0LmZhaWwoIGRlZmVycmVkLnJlamVjdCApO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdC0tcmVtYWluaW5nO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Ly8gSWYgd2UncmUgbm90IHdhaXRpbmcgb24gYW55dGhpbmcsIHJlc29sdmUgdGhlIG1hc3RlclxuXHRcdGlmICggIXJlbWFpbmluZyApIHtcblx0XHRcdGRlZmVycmVkLnJlc29sdmVXaXRoKCByZXNvbHZlQ29udGV4dHMsIHJlc29sdmVWYWx1ZXMgKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gZGVmZXJyZWQucHJvbWlzZSgpO1xuXHR9XG59ICk7XG5cblxuLy8gVGhlIGRlZmVycmVkIHVzZWQgb24gRE9NIHJlYWR5XG52YXIgcmVhZHlMaXN0O1xuXG5qUXVlcnkuZm4ucmVhZHkgPSBmdW5jdGlvbiggZm4gKSB7XG5cblx0Ly8gQWRkIHRoZSBjYWxsYmFja1xuXHRqUXVlcnkucmVhZHkucHJvbWlzZSgpLmRvbmUoIGZuICk7XG5cblx0cmV0dXJuIHRoaXM7XG59O1xuXG5qUXVlcnkuZXh0ZW5kKCB7XG5cblx0Ly8gSXMgdGhlIERPTSByZWFkeSB0byBiZSB1c2VkPyBTZXQgdG8gdHJ1ZSBvbmNlIGl0IG9jY3Vycy5cblx0aXNSZWFkeTogZmFsc2UsXG5cblx0Ly8gQSBjb3VudGVyIHRvIHRyYWNrIGhvdyBtYW55IGl0ZW1zIHRvIHdhaXQgZm9yIGJlZm9yZVxuXHQvLyB0aGUgcmVhZHkgZXZlbnQgZmlyZXMuIFNlZSAjNjc4MVxuXHRyZWFkeVdhaXQ6IDEsXG5cblx0Ly8gSG9sZCAob3IgcmVsZWFzZSkgdGhlIHJlYWR5IGV2ZW50XG5cdGhvbGRSZWFkeTogZnVuY3Rpb24oIGhvbGQgKSB7XG5cdFx0aWYgKCBob2xkICkge1xuXHRcdFx0alF1ZXJ5LnJlYWR5V2FpdCsrO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRqUXVlcnkucmVhZHkoIHRydWUgKTtcblx0XHR9XG5cdH0sXG5cblx0Ly8gSGFuZGxlIHdoZW4gdGhlIERPTSBpcyByZWFkeVxuXHRyZWFkeTogZnVuY3Rpb24oIHdhaXQgKSB7XG5cblx0XHQvLyBBYm9ydCBpZiB0aGVyZSBhcmUgcGVuZGluZyBob2xkcyBvciB3ZSdyZSBhbHJlYWR5IHJlYWR5XG5cdFx0aWYgKCB3YWl0ID09PSB0cnVlID8gLS1qUXVlcnkucmVhZHlXYWl0IDogalF1ZXJ5LmlzUmVhZHkgKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Ly8gUmVtZW1iZXIgdGhhdCB0aGUgRE9NIGlzIHJlYWR5XG5cdFx0alF1ZXJ5LmlzUmVhZHkgPSB0cnVlO1xuXG5cdFx0Ly8gSWYgYSBub3JtYWwgRE9NIFJlYWR5IGV2ZW50IGZpcmVkLCBkZWNyZW1lbnQsIGFuZCB3YWl0IGlmIG5lZWQgYmVcblx0XHRpZiAoIHdhaXQgIT09IHRydWUgJiYgLS1qUXVlcnkucmVhZHlXYWl0ID4gMCApIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHQvLyBJZiB0aGVyZSBhcmUgZnVuY3Rpb25zIGJvdW5kLCB0byBleGVjdXRlXG5cdFx0cmVhZHlMaXN0LnJlc29sdmVXaXRoKCBkb2N1bWVudCwgWyBqUXVlcnkgXSApO1xuXG5cdFx0Ly8gVHJpZ2dlciBhbnkgYm91bmQgcmVhZHkgZXZlbnRzXG5cdFx0aWYgKCBqUXVlcnkuZm4udHJpZ2dlckhhbmRsZXIgKSB7XG5cdFx0XHRqUXVlcnkoIGRvY3VtZW50ICkudHJpZ2dlckhhbmRsZXIoIFwicmVhZHlcIiApO1xuXHRcdFx0alF1ZXJ5KCBkb2N1bWVudCApLm9mZiggXCJyZWFkeVwiICk7XG5cdFx0fVxuXHR9XG59ICk7XG5cbi8qKlxuICogVGhlIHJlYWR5IGV2ZW50IGhhbmRsZXIgYW5kIHNlbGYgY2xlYW51cCBtZXRob2RcbiAqL1xuZnVuY3Rpb24gY29tcGxldGVkKCkge1xuXHRkb2N1bWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCBcIkRPTUNvbnRlbnRMb2FkZWRcIiwgY29tcGxldGVkICk7XG5cdHdpbmRvdy5yZW1vdmVFdmVudExpc3RlbmVyKCBcImxvYWRcIiwgY29tcGxldGVkICk7XG5cdGpRdWVyeS5yZWFkeSgpO1xufVxuXG5qUXVlcnkucmVhZHkucHJvbWlzZSA9IGZ1bmN0aW9uKCBvYmogKSB7XG5cdGlmICggIXJlYWR5TGlzdCApIHtcblxuXHRcdHJlYWR5TGlzdCA9IGpRdWVyeS5EZWZlcnJlZCgpO1xuXG5cdFx0Ly8gQ2F0Y2ggY2FzZXMgd2hlcmUgJChkb2N1bWVudCkucmVhZHkoKSBpcyBjYWxsZWRcblx0XHQvLyBhZnRlciB0aGUgYnJvd3NlciBldmVudCBoYXMgYWxyZWFkeSBvY2N1cnJlZC5cblx0XHQvLyBTdXBwb3J0OiBJRTktMTAgb25seVxuXHRcdC8vIE9sZGVyIElFIHNvbWV0aW1lcyBzaWduYWxzIFwiaW50ZXJhY3RpdmVcIiB0b28gc29vblxuXHRcdGlmICggZG9jdW1lbnQucmVhZHlTdGF0ZSA9PT0gXCJjb21wbGV0ZVwiIHx8XG5cdFx0XHQoIGRvY3VtZW50LnJlYWR5U3RhdGUgIT09IFwibG9hZGluZ1wiICYmICFkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQuZG9TY3JvbGwgKSApIHtcblxuXHRcdFx0Ly8gSGFuZGxlIGl0IGFzeW5jaHJvbm91c2x5IHRvIGFsbG93IHNjcmlwdHMgdGhlIG9wcG9ydHVuaXR5IHRvIGRlbGF5IHJlYWR5XG5cdFx0XHR3aW5kb3cuc2V0VGltZW91dCggalF1ZXJ5LnJlYWR5ICk7XG5cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHQvLyBVc2UgdGhlIGhhbmR5IGV2ZW50IGNhbGxiYWNrXG5cdFx0XHRkb2N1bWVudC5hZGRFdmVudExpc3RlbmVyKCBcIkRPTUNvbnRlbnRMb2FkZWRcIiwgY29tcGxldGVkICk7XG5cblx0XHRcdC8vIEEgZmFsbGJhY2sgdG8gd2luZG93Lm9ubG9hZCwgdGhhdCB3aWxsIGFsd2F5cyB3b3JrXG5cdFx0XHR3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lciggXCJsb2FkXCIsIGNvbXBsZXRlZCApO1xuXHRcdH1cblx0fVxuXHRyZXR1cm4gcmVhZHlMaXN0LnByb21pc2UoIG9iaiApO1xufTtcblxuLy8gS2ljayBvZmYgdGhlIERPTSByZWFkeSBjaGVjayBldmVuIGlmIHRoZSB1c2VyIGRvZXMgbm90XG5qUXVlcnkucmVhZHkucHJvbWlzZSgpO1xuXG5cblxuXG4vLyBNdWx0aWZ1bmN0aW9uYWwgbWV0aG9kIHRvIGdldCBhbmQgc2V0IHZhbHVlcyBvZiBhIGNvbGxlY3Rpb25cbi8vIFRoZSB2YWx1ZS9zIGNhbiBvcHRpb25hbGx5IGJlIGV4ZWN1dGVkIGlmIGl0J3MgYSBmdW5jdGlvblxudmFyIGFjY2VzcyA9IGZ1bmN0aW9uKCBlbGVtcywgZm4sIGtleSwgdmFsdWUsIGNoYWluYWJsZSwgZW1wdHlHZXQsIHJhdyApIHtcblx0dmFyIGkgPSAwLFxuXHRcdGxlbiA9IGVsZW1zLmxlbmd0aCxcblx0XHRidWxrID0ga2V5ID09IG51bGw7XG5cblx0Ly8gU2V0cyBtYW55IHZhbHVlc1xuXHRpZiAoIGpRdWVyeS50eXBlKCBrZXkgKSA9PT0gXCJvYmplY3RcIiApIHtcblx0XHRjaGFpbmFibGUgPSB0cnVlO1xuXHRcdGZvciAoIGkgaW4ga2V5ICkge1xuXHRcdFx0YWNjZXNzKCBlbGVtcywgZm4sIGksIGtleVsgaSBdLCB0cnVlLCBlbXB0eUdldCwgcmF3ICk7XG5cdFx0fVxuXG5cdC8vIFNldHMgb25lIHZhbHVlXG5cdH0gZWxzZSBpZiAoIHZhbHVlICE9PSB1bmRlZmluZWQgKSB7XG5cdFx0Y2hhaW5hYmxlID0gdHJ1ZTtcblxuXHRcdGlmICggIWpRdWVyeS5pc0Z1bmN0aW9uKCB2YWx1ZSApICkge1xuXHRcdFx0cmF3ID0gdHJ1ZTtcblx0XHR9XG5cblx0XHRpZiAoIGJ1bGsgKSB7XG5cblx0XHRcdC8vIEJ1bGsgb3BlcmF0aW9ucyBydW4gYWdhaW5zdCB0aGUgZW50aXJlIHNldFxuXHRcdFx0aWYgKCByYXcgKSB7XG5cdFx0XHRcdGZuLmNhbGwoIGVsZW1zLCB2YWx1ZSApO1xuXHRcdFx0XHRmbiA9IG51bGw7XG5cblx0XHRcdC8vIC4uLmV4Y2VwdCB3aGVuIGV4ZWN1dGluZyBmdW5jdGlvbiB2YWx1ZXNcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGJ1bGsgPSBmbjtcblx0XHRcdFx0Zm4gPSBmdW5jdGlvbiggZWxlbSwga2V5LCB2YWx1ZSApIHtcblx0XHRcdFx0XHRyZXR1cm4gYnVsay5jYWxsKCBqUXVlcnkoIGVsZW0gKSwgdmFsdWUgKTtcblx0XHRcdFx0fTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRpZiAoIGZuICkge1xuXHRcdFx0Zm9yICggOyBpIDwgbGVuOyBpKysgKSB7XG5cdFx0XHRcdGZuKFxuXHRcdFx0XHRcdGVsZW1zWyBpIF0sIGtleSwgcmF3ID9cblx0XHRcdFx0XHR2YWx1ZSA6XG5cdFx0XHRcdFx0dmFsdWUuY2FsbCggZWxlbXNbIGkgXSwgaSwgZm4oIGVsZW1zWyBpIF0sIGtleSApIClcblx0XHRcdFx0KTtcblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHRyZXR1cm4gY2hhaW5hYmxlID9cblx0XHRlbGVtcyA6XG5cblx0XHQvLyBHZXRzXG5cdFx0YnVsayA/XG5cdFx0XHRmbi5jYWxsKCBlbGVtcyApIDpcblx0XHRcdGxlbiA/IGZuKCBlbGVtc1sgMCBdLCBrZXkgKSA6IGVtcHR5R2V0O1xufTtcbnZhciBhY2NlcHREYXRhID0gZnVuY3Rpb24oIG93bmVyICkge1xuXG5cdC8vIEFjY2VwdHMgb25seTpcblx0Ly8gIC0gTm9kZVxuXHQvLyAgICAtIE5vZGUuRUxFTUVOVF9OT0RFXG5cdC8vICAgIC0gTm9kZS5ET0NVTUVOVF9OT0RFXG5cdC8vICAtIE9iamVjdFxuXHQvLyAgICAtIEFueVxuXHQvKiBqc2hpbnQgLVcwMTggKi9cblx0cmV0dXJuIG93bmVyLm5vZGVUeXBlID09PSAxIHx8IG93bmVyLm5vZGVUeXBlID09PSA5IHx8ICEoICtvd25lci5ub2RlVHlwZSApO1xufTtcblxuXG5cblxuZnVuY3Rpb24gRGF0YSgpIHtcblx0dGhpcy5leHBhbmRvID0galF1ZXJ5LmV4cGFuZG8gKyBEYXRhLnVpZCsrO1xufVxuXG5EYXRhLnVpZCA9IDE7XG5cbkRhdGEucHJvdG90eXBlID0ge1xuXG5cdHJlZ2lzdGVyOiBmdW5jdGlvbiggb3duZXIsIGluaXRpYWwgKSB7XG5cdFx0dmFyIHZhbHVlID0gaW5pdGlhbCB8fCB7fTtcblxuXHRcdC8vIElmIGl0IGlzIGEgbm9kZSB1bmxpa2VseSB0byBiZSBzdHJpbmdpZnktZWQgb3IgbG9vcGVkIG92ZXJcblx0XHQvLyB1c2UgcGxhaW4gYXNzaWdubWVudFxuXHRcdGlmICggb3duZXIubm9kZVR5cGUgKSB7XG5cdFx0XHRvd25lclsgdGhpcy5leHBhbmRvIF0gPSB2YWx1ZTtcblxuXHRcdC8vIE90aGVyd2lzZSBzZWN1cmUgaXQgaW4gYSBub24tZW51bWVyYWJsZSwgbm9uLXdyaXRhYmxlIHByb3BlcnR5XG5cdFx0Ly8gY29uZmlndXJhYmlsaXR5IG11c3QgYmUgdHJ1ZSB0byBhbGxvdyB0aGUgcHJvcGVydHkgdG8gYmVcblx0XHQvLyBkZWxldGVkIHdpdGggdGhlIGRlbGV0ZSBvcGVyYXRvclxuXHRcdH0gZWxzZSB7XG5cdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoIG93bmVyLCB0aGlzLmV4cGFuZG8sIHtcblx0XHRcdFx0dmFsdWU6IHZhbHVlLFxuXHRcdFx0XHR3cml0YWJsZTogdHJ1ZSxcblx0XHRcdFx0Y29uZmlndXJhYmxlOiB0cnVlXG5cdFx0XHR9ICk7XG5cdFx0fVxuXHRcdHJldHVybiBvd25lclsgdGhpcy5leHBhbmRvIF07XG5cdH0sXG5cdGNhY2hlOiBmdW5jdGlvbiggb3duZXIgKSB7XG5cblx0XHQvLyBXZSBjYW4gYWNjZXB0IGRhdGEgZm9yIG5vbi1lbGVtZW50IG5vZGVzIGluIG1vZGVybiBicm93c2Vycyxcblx0XHQvLyBidXQgd2Ugc2hvdWxkIG5vdCwgc2VlICM4MzM1LlxuXHRcdC8vIEFsd2F5cyByZXR1cm4gYW4gZW1wdHkgb2JqZWN0LlxuXHRcdGlmICggIWFjY2VwdERhdGEoIG93bmVyICkgKSB7XG5cdFx0XHRyZXR1cm4ge307XG5cdFx0fVxuXG5cdFx0Ly8gQ2hlY2sgaWYgdGhlIG93bmVyIG9iamVjdCBhbHJlYWR5IGhhcyBhIGNhY2hlXG5cdFx0dmFyIHZhbHVlID0gb3duZXJbIHRoaXMuZXhwYW5kbyBdO1xuXG5cdFx0Ly8gSWYgbm90LCBjcmVhdGUgb25lXG5cdFx0aWYgKCAhdmFsdWUgKSB7XG5cdFx0XHR2YWx1ZSA9IHt9O1xuXG5cdFx0XHQvLyBXZSBjYW4gYWNjZXB0IGRhdGEgZm9yIG5vbi1lbGVtZW50IG5vZGVzIGluIG1vZGVybiBicm93c2Vycyxcblx0XHRcdC8vIGJ1dCB3ZSBzaG91bGQgbm90LCBzZWUgIzgzMzUuXG5cdFx0XHQvLyBBbHdheXMgcmV0dXJuIGFuIGVtcHR5IG9iamVjdC5cblx0XHRcdGlmICggYWNjZXB0RGF0YSggb3duZXIgKSApIHtcblxuXHRcdFx0XHQvLyBJZiBpdCBpcyBhIG5vZGUgdW5saWtlbHkgdG8gYmUgc3RyaW5naWZ5LWVkIG9yIGxvb3BlZCBvdmVyXG5cdFx0XHRcdC8vIHVzZSBwbGFpbiBhc3NpZ25tZW50XG5cdFx0XHRcdGlmICggb3duZXIubm9kZVR5cGUgKSB7XG5cdFx0XHRcdFx0b3duZXJbIHRoaXMuZXhwYW5kbyBdID0gdmFsdWU7XG5cblx0XHRcdFx0Ly8gT3RoZXJ3aXNlIHNlY3VyZSBpdCBpbiBhIG5vbi1lbnVtZXJhYmxlIHByb3BlcnR5XG5cdFx0XHRcdC8vIGNvbmZpZ3VyYWJsZSBtdXN0IGJlIHRydWUgdG8gYWxsb3cgdGhlIHByb3BlcnR5IHRvIGJlXG5cdFx0XHRcdC8vIGRlbGV0ZWQgd2hlbiBkYXRhIGlzIHJlbW92ZWRcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRPYmplY3QuZGVmaW5lUHJvcGVydHkoIG93bmVyLCB0aGlzLmV4cGFuZG8sIHtcblx0XHRcdFx0XHRcdHZhbHVlOiB2YWx1ZSxcblx0XHRcdFx0XHRcdGNvbmZpZ3VyYWJsZTogdHJ1ZVxuXHRcdFx0XHRcdH0gKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiB2YWx1ZTtcblx0fSxcblx0c2V0OiBmdW5jdGlvbiggb3duZXIsIGRhdGEsIHZhbHVlICkge1xuXHRcdHZhciBwcm9wLFxuXHRcdFx0Y2FjaGUgPSB0aGlzLmNhY2hlKCBvd25lciApO1xuXG5cdFx0Ly8gSGFuZGxlOiBbIG93bmVyLCBrZXksIHZhbHVlIF0gYXJnc1xuXHRcdGlmICggdHlwZW9mIGRhdGEgPT09IFwic3RyaW5nXCIgKSB7XG5cdFx0XHRjYWNoZVsgZGF0YSBdID0gdmFsdWU7XG5cblx0XHQvLyBIYW5kbGU6IFsgb3duZXIsIHsgcHJvcGVydGllcyB9IF0gYXJnc1xuXHRcdH0gZWxzZSB7XG5cblx0XHRcdC8vIENvcHkgdGhlIHByb3BlcnRpZXMgb25lLWJ5LW9uZSB0byB0aGUgY2FjaGUgb2JqZWN0XG5cdFx0XHRmb3IgKCBwcm9wIGluIGRhdGEgKSB7XG5cdFx0XHRcdGNhY2hlWyBwcm9wIF0gPSBkYXRhWyBwcm9wIF07XG5cdFx0XHR9XG5cdFx0fVxuXHRcdHJldHVybiBjYWNoZTtcblx0fSxcblx0Z2V0OiBmdW5jdGlvbiggb3duZXIsIGtleSApIHtcblx0XHRyZXR1cm4ga2V5ID09PSB1bmRlZmluZWQgP1xuXHRcdFx0dGhpcy5jYWNoZSggb3duZXIgKSA6XG5cdFx0XHRvd25lclsgdGhpcy5leHBhbmRvIF0gJiYgb3duZXJbIHRoaXMuZXhwYW5kbyBdWyBrZXkgXTtcblx0fSxcblx0YWNjZXNzOiBmdW5jdGlvbiggb3duZXIsIGtleSwgdmFsdWUgKSB7XG5cdFx0dmFyIHN0b3JlZDtcblxuXHRcdC8vIEluIGNhc2VzIHdoZXJlIGVpdGhlcjpcblx0XHQvL1xuXHRcdC8vICAgMS4gTm8ga2V5IHdhcyBzcGVjaWZpZWRcblx0XHQvLyAgIDIuIEEgc3RyaW5nIGtleSB3YXMgc3BlY2lmaWVkLCBidXQgbm8gdmFsdWUgcHJvdmlkZWRcblx0XHQvL1xuXHRcdC8vIFRha2UgdGhlIFwicmVhZFwiIHBhdGggYW5kIGFsbG93IHRoZSBnZXQgbWV0aG9kIHRvIGRldGVybWluZVxuXHRcdC8vIHdoaWNoIHZhbHVlIHRvIHJldHVybiwgcmVzcGVjdGl2ZWx5IGVpdGhlcjpcblx0XHQvL1xuXHRcdC8vICAgMS4gVGhlIGVudGlyZSBjYWNoZSBvYmplY3Rcblx0XHQvLyAgIDIuIFRoZSBkYXRhIHN0b3JlZCBhdCB0aGUga2V5XG5cdFx0Ly9cblx0XHRpZiAoIGtleSA9PT0gdW5kZWZpbmVkIHx8XG5cdFx0XHRcdCggKCBrZXkgJiYgdHlwZW9mIGtleSA9PT0gXCJzdHJpbmdcIiApICYmIHZhbHVlID09PSB1bmRlZmluZWQgKSApIHtcblxuXHRcdFx0c3RvcmVkID0gdGhpcy5nZXQoIG93bmVyLCBrZXkgKTtcblxuXHRcdFx0cmV0dXJuIHN0b3JlZCAhPT0gdW5kZWZpbmVkID9cblx0XHRcdFx0c3RvcmVkIDogdGhpcy5nZXQoIG93bmVyLCBqUXVlcnkuY2FtZWxDYXNlKCBrZXkgKSApO1xuXHRcdH1cblxuXHRcdC8vIFdoZW4gdGhlIGtleSBpcyBub3QgYSBzdHJpbmcsIG9yIGJvdGggYSBrZXkgYW5kIHZhbHVlXG5cdFx0Ly8gYXJlIHNwZWNpZmllZCwgc2V0IG9yIGV4dGVuZCAoZXhpc3Rpbmcgb2JqZWN0cykgd2l0aCBlaXRoZXI6XG5cdFx0Ly9cblx0XHQvLyAgIDEuIEFuIG9iamVjdCBvZiBwcm9wZXJ0aWVzXG5cdFx0Ly8gICAyLiBBIGtleSBhbmQgdmFsdWVcblx0XHQvL1xuXHRcdHRoaXMuc2V0KCBvd25lciwga2V5LCB2YWx1ZSApO1xuXG5cdFx0Ly8gU2luY2UgdGhlIFwic2V0XCIgcGF0aCBjYW4gaGF2ZSB0d28gcG9zc2libGUgZW50cnkgcG9pbnRzXG5cdFx0Ly8gcmV0dXJuIHRoZSBleHBlY3RlZCBkYXRhIGJhc2VkIG9uIHdoaWNoIHBhdGggd2FzIHRha2VuWypdXG5cdFx0cmV0dXJuIHZhbHVlICE9PSB1bmRlZmluZWQgPyB2YWx1ZSA6IGtleTtcblx0fSxcblx0cmVtb3ZlOiBmdW5jdGlvbiggb3duZXIsIGtleSApIHtcblx0XHR2YXIgaSwgbmFtZSwgY2FtZWwsXG5cdFx0XHRjYWNoZSA9IG93bmVyWyB0aGlzLmV4cGFuZG8gXTtcblxuXHRcdGlmICggY2FjaGUgPT09IHVuZGVmaW5lZCApIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRpZiAoIGtleSA9PT0gdW5kZWZpbmVkICkge1xuXHRcdFx0dGhpcy5yZWdpc3Rlciggb3duZXIgKTtcblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdC8vIFN1cHBvcnQgYXJyYXkgb3Igc3BhY2Ugc2VwYXJhdGVkIHN0cmluZyBvZiBrZXlzXG5cdFx0XHRpZiAoIGpRdWVyeS5pc0FycmF5KCBrZXkgKSApIHtcblxuXHRcdFx0XHQvLyBJZiBcIm5hbWVcIiBpcyBhbiBhcnJheSBvZiBrZXlzLi4uXG5cdFx0XHRcdC8vIFdoZW4gZGF0YSBpcyBpbml0aWFsbHkgY3JlYXRlZCwgdmlhIChcImtleVwiLCBcInZhbFwiKSBzaWduYXR1cmUsXG5cdFx0XHRcdC8vIGtleXMgd2lsbCBiZSBjb252ZXJ0ZWQgdG8gY2FtZWxDYXNlLlxuXHRcdFx0XHQvLyBTaW5jZSB0aGVyZSBpcyBubyB3YXkgdG8gdGVsbCBfaG93XyBhIGtleSB3YXMgYWRkZWQsIHJlbW92ZVxuXHRcdFx0XHQvLyBib3RoIHBsYWluIGtleSBhbmQgY2FtZWxDYXNlIGtleS4gIzEyNzg2XG5cdFx0XHRcdC8vIFRoaXMgd2lsbCBvbmx5IHBlbmFsaXplIHRoZSBhcnJheSBhcmd1bWVudCBwYXRoLlxuXHRcdFx0XHRuYW1lID0ga2V5LmNvbmNhdCgga2V5Lm1hcCggalF1ZXJ5LmNhbWVsQ2FzZSApICk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRjYW1lbCA9IGpRdWVyeS5jYW1lbENhc2UoIGtleSApO1xuXG5cdFx0XHRcdC8vIFRyeSB0aGUgc3RyaW5nIGFzIGEga2V5IGJlZm9yZSBhbnkgbWFuaXB1bGF0aW9uXG5cdFx0XHRcdGlmICgga2V5IGluIGNhY2hlICkge1xuXHRcdFx0XHRcdG5hbWUgPSBbIGtleSwgY2FtZWwgXTtcblx0XHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHRcdC8vIElmIGEga2V5IHdpdGggdGhlIHNwYWNlcyBleGlzdHMsIHVzZSBpdC5cblx0XHRcdFx0XHQvLyBPdGhlcndpc2UsIGNyZWF0ZSBhbiBhcnJheSBieSBtYXRjaGluZyBub24td2hpdGVzcGFjZVxuXHRcdFx0XHRcdG5hbWUgPSBjYW1lbDtcblx0XHRcdFx0XHRuYW1lID0gbmFtZSBpbiBjYWNoZSA/XG5cdFx0XHRcdFx0XHRbIG5hbWUgXSA6ICggbmFtZS5tYXRjaCggcm5vdHdoaXRlICkgfHwgW10gKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHRpID0gbmFtZS5sZW5ndGg7XG5cblx0XHRcdHdoaWxlICggaS0tICkge1xuXHRcdFx0XHRkZWxldGUgY2FjaGVbIG5hbWVbIGkgXSBdO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vIFJlbW92ZSB0aGUgZXhwYW5kbyBpZiB0aGVyZSdzIG5vIG1vcmUgZGF0YVxuXHRcdGlmICgga2V5ID09PSB1bmRlZmluZWQgfHwgalF1ZXJ5LmlzRW1wdHlPYmplY3QoIGNhY2hlICkgKSB7XG5cblx0XHRcdC8vIFN1cHBvcnQ6IENocm9tZSA8PSAzNS00NStcblx0XHRcdC8vIFdlYmtpdCAmIEJsaW5rIHBlcmZvcm1hbmNlIHN1ZmZlcnMgd2hlbiBkZWxldGluZyBwcm9wZXJ0aWVzXG5cdFx0XHQvLyBmcm9tIERPTSBub2Rlcywgc28gc2V0IHRvIHVuZGVmaW5lZCBpbnN0ZWFkXG5cdFx0XHQvLyBodHRwczovL2NvZGUuZ29vZ2xlLmNvbS9wL2Nocm9taXVtL2lzc3Vlcy9kZXRhaWw/aWQ9Mzc4NjA3XG5cdFx0XHRpZiAoIG93bmVyLm5vZGVUeXBlICkge1xuXHRcdFx0XHRvd25lclsgdGhpcy5leHBhbmRvIF0gPSB1bmRlZmluZWQ7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRkZWxldGUgb3duZXJbIHRoaXMuZXhwYW5kbyBdO1xuXHRcdFx0fVxuXHRcdH1cblx0fSxcblx0aGFzRGF0YTogZnVuY3Rpb24oIG93bmVyICkge1xuXHRcdHZhciBjYWNoZSA9IG93bmVyWyB0aGlzLmV4cGFuZG8gXTtcblx0XHRyZXR1cm4gY2FjaGUgIT09IHVuZGVmaW5lZCAmJiAhalF1ZXJ5LmlzRW1wdHlPYmplY3QoIGNhY2hlICk7XG5cdH1cbn07XG52YXIgZGF0YVByaXYgPSBuZXcgRGF0YSgpO1xuXG52YXIgZGF0YVVzZXIgPSBuZXcgRGF0YSgpO1xuXG5cblxuLy9cdEltcGxlbWVudGF0aW9uIFN1bW1hcnlcbi8vXG4vL1x0MS4gRW5mb3JjZSBBUEkgc3VyZmFjZSBhbmQgc2VtYW50aWMgY29tcGF0aWJpbGl0eSB3aXRoIDEuOS54IGJyYW5jaFxuLy9cdDIuIEltcHJvdmUgdGhlIG1vZHVsZSdzIG1haW50YWluYWJpbGl0eSBieSByZWR1Y2luZyB0aGUgc3RvcmFnZVxuLy9cdFx0cGF0aHMgdG8gYSBzaW5nbGUgbWVjaGFuaXNtLlxuLy9cdDMuIFVzZSB0aGUgc2FtZSBzaW5nbGUgbWVjaGFuaXNtIHRvIHN1cHBvcnQgXCJwcml2YXRlXCIgYW5kIFwidXNlclwiIGRhdGEuXG4vL1x0NC4gX05ldmVyXyBleHBvc2UgXCJwcml2YXRlXCIgZGF0YSB0byB1c2VyIGNvZGUgKFRPRE86IERyb3AgX2RhdGEsIF9yZW1vdmVEYXRhKVxuLy9cdDUuIEF2b2lkIGV4cG9zaW5nIGltcGxlbWVudGF0aW9uIGRldGFpbHMgb24gdXNlciBvYmplY3RzIChlZy4gZXhwYW5kbyBwcm9wZXJ0aWVzKVxuLy9cdDYuIFByb3ZpZGUgYSBjbGVhciBwYXRoIGZvciBpbXBsZW1lbnRhdGlvbiB1cGdyYWRlIHRvIFdlYWtNYXAgaW4gMjAxNFxuXG52YXIgcmJyYWNlID0gL14oPzpcXHtbXFx3XFxXXSpcXH18XFxbW1xcd1xcV10qXFxdKSQvLFxuXHRybXVsdGlEYXNoID0gL1tBLVpdL2c7XG5cbmZ1bmN0aW9uIGRhdGFBdHRyKCBlbGVtLCBrZXksIGRhdGEgKSB7XG5cdHZhciBuYW1lO1xuXG5cdC8vIElmIG5vdGhpbmcgd2FzIGZvdW5kIGludGVybmFsbHksIHRyeSB0byBmZXRjaCBhbnlcblx0Ly8gZGF0YSBmcm9tIHRoZSBIVE1MNSBkYXRhLSogYXR0cmlidXRlXG5cdGlmICggZGF0YSA9PT0gdW5kZWZpbmVkICYmIGVsZW0ubm9kZVR5cGUgPT09IDEgKSB7XG5cdFx0bmFtZSA9IFwiZGF0YS1cIiArIGtleS5yZXBsYWNlKCBybXVsdGlEYXNoLCBcIi0kJlwiICkudG9Mb3dlckNhc2UoKTtcblx0XHRkYXRhID0gZWxlbS5nZXRBdHRyaWJ1dGUoIG5hbWUgKTtcblxuXHRcdGlmICggdHlwZW9mIGRhdGEgPT09IFwic3RyaW5nXCIgKSB7XG5cdFx0XHR0cnkge1xuXHRcdFx0XHRkYXRhID0gZGF0YSA9PT0gXCJ0cnVlXCIgPyB0cnVlIDpcblx0XHRcdFx0XHRkYXRhID09PSBcImZhbHNlXCIgPyBmYWxzZSA6XG5cdFx0XHRcdFx0ZGF0YSA9PT0gXCJudWxsXCIgPyBudWxsIDpcblxuXHRcdFx0XHRcdC8vIE9ubHkgY29udmVydCB0byBhIG51bWJlciBpZiBpdCBkb2Vzbid0IGNoYW5nZSB0aGUgc3RyaW5nXG5cdFx0XHRcdFx0K2RhdGEgKyBcIlwiID09PSBkYXRhID8gK2RhdGEgOlxuXHRcdFx0XHRcdHJicmFjZS50ZXN0KCBkYXRhICkgPyBqUXVlcnkucGFyc2VKU09OKCBkYXRhICkgOlxuXHRcdFx0XHRcdGRhdGE7XG5cdFx0XHR9IGNhdGNoICggZSApIHt9XG5cblx0XHRcdC8vIE1ha2Ugc3VyZSB3ZSBzZXQgdGhlIGRhdGEgc28gaXQgaXNuJ3QgY2hhbmdlZCBsYXRlclxuXHRcdFx0ZGF0YVVzZXIuc2V0KCBlbGVtLCBrZXksIGRhdGEgKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0ZGF0YSA9IHVuZGVmaW5lZDtcblx0XHR9XG5cdH1cblx0cmV0dXJuIGRhdGE7XG59XG5cbmpRdWVyeS5leHRlbmQoIHtcblx0aGFzRGF0YTogZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0cmV0dXJuIGRhdGFVc2VyLmhhc0RhdGEoIGVsZW0gKSB8fCBkYXRhUHJpdi5oYXNEYXRhKCBlbGVtICk7XG5cdH0sXG5cblx0ZGF0YTogZnVuY3Rpb24oIGVsZW0sIG5hbWUsIGRhdGEgKSB7XG5cdFx0cmV0dXJuIGRhdGFVc2VyLmFjY2VzcyggZWxlbSwgbmFtZSwgZGF0YSApO1xuXHR9LFxuXG5cdHJlbW92ZURhdGE6IGZ1bmN0aW9uKCBlbGVtLCBuYW1lICkge1xuXHRcdGRhdGFVc2VyLnJlbW92ZSggZWxlbSwgbmFtZSApO1xuXHR9LFxuXG5cdC8vIFRPRE86IE5vdyB0aGF0IGFsbCBjYWxscyB0byBfZGF0YSBhbmQgX3JlbW92ZURhdGEgaGF2ZSBiZWVuIHJlcGxhY2VkXG5cdC8vIHdpdGggZGlyZWN0IGNhbGxzIHRvIGRhdGFQcml2IG1ldGhvZHMsIHRoZXNlIGNhbiBiZSBkZXByZWNhdGVkLlxuXHRfZGF0YTogZnVuY3Rpb24oIGVsZW0sIG5hbWUsIGRhdGEgKSB7XG5cdFx0cmV0dXJuIGRhdGFQcml2LmFjY2VzcyggZWxlbSwgbmFtZSwgZGF0YSApO1xuXHR9LFxuXG5cdF9yZW1vdmVEYXRhOiBmdW5jdGlvbiggZWxlbSwgbmFtZSApIHtcblx0XHRkYXRhUHJpdi5yZW1vdmUoIGVsZW0sIG5hbWUgKTtcblx0fVxufSApO1xuXG5qUXVlcnkuZm4uZXh0ZW5kKCB7XG5cdGRhdGE6IGZ1bmN0aW9uKCBrZXksIHZhbHVlICkge1xuXHRcdHZhciBpLCBuYW1lLCBkYXRhLFxuXHRcdFx0ZWxlbSA9IHRoaXNbIDAgXSxcblx0XHRcdGF0dHJzID0gZWxlbSAmJiBlbGVtLmF0dHJpYnV0ZXM7XG5cblx0XHQvLyBHZXRzIGFsbCB2YWx1ZXNcblx0XHRpZiAoIGtleSA9PT0gdW5kZWZpbmVkICkge1xuXHRcdFx0aWYgKCB0aGlzLmxlbmd0aCApIHtcblx0XHRcdFx0ZGF0YSA9IGRhdGFVc2VyLmdldCggZWxlbSApO1xuXG5cdFx0XHRcdGlmICggZWxlbS5ub2RlVHlwZSA9PT0gMSAmJiAhZGF0YVByaXYuZ2V0KCBlbGVtLCBcImhhc0RhdGFBdHRyc1wiICkgKSB7XG5cdFx0XHRcdFx0aSA9IGF0dHJzLmxlbmd0aDtcblx0XHRcdFx0XHR3aGlsZSAoIGktLSApIHtcblxuXHRcdFx0XHRcdFx0Ly8gU3VwcG9ydDogSUUxMStcblx0XHRcdFx0XHRcdC8vIFRoZSBhdHRycyBlbGVtZW50cyBjYW4gYmUgbnVsbCAoIzE0ODk0KVxuXHRcdFx0XHRcdFx0aWYgKCBhdHRyc1sgaSBdICkge1xuXHRcdFx0XHRcdFx0XHRuYW1lID0gYXR0cnNbIGkgXS5uYW1lO1xuXHRcdFx0XHRcdFx0XHRpZiAoIG5hbWUuaW5kZXhPZiggXCJkYXRhLVwiICkgPT09IDAgKSB7XG5cdFx0XHRcdFx0XHRcdFx0bmFtZSA9IGpRdWVyeS5jYW1lbENhc2UoIG5hbWUuc2xpY2UoIDUgKSApO1xuXHRcdFx0XHRcdFx0XHRcdGRhdGFBdHRyKCBlbGVtLCBuYW1lLCBkYXRhWyBuYW1lIF0gKTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRkYXRhUHJpdi5zZXQoIGVsZW0sIFwiaGFzRGF0YUF0dHJzXCIsIHRydWUgKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gZGF0YTtcblx0XHR9XG5cblx0XHQvLyBTZXRzIG11bHRpcGxlIHZhbHVlc1xuXHRcdGlmICggdHlwZW9mIGtleSA9PT0gXCJvYmplY3RcIiApIHtcblx0XHRcdHJldHVybiB0aGlzLmVhY2goIGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRkYXRhVXNlci5zZXQoIHRoaXMsIGtleSApO1xuXHRcdFx0fSApO1xuXHRcdH1cblxuXHRcdHJldHVybiBhY2Nlc3MoIHRoaXMsIGZ1bmN0aW9uKCB2YWx1ZSApIHtcblx0XHRcdHZhciBkYXRhLCBjYW1lbEtleTtcblxuXHRcdFx0Ly8gVGhlIGNhbGxpbmcgalF1ZXJ5IG9iamVjdCAoZWxlbWVudCBtYXRjaGVzKSBpcyBub3QgZW1wdHlcblx0XHRcdC8vIChhbmQgdGhlcmVmb3JlIGhhcyBhbiBlbGVtZW50IGFwcGVhcnMgYXQgdGhpc1sgMCBdKSBhbmQgdGhlXG5cdFx0XHQvLyBgdmFsdWVgIHBhcmFtZXRlciB3YXMgbm90IHVuZGVmaW5lZC4gQW4gZW1wdHkgalF1ZXJ5IG9iamVjdFxuXHRcdFx0Ly8gd2lsbCByZXN1bHQgaW4gYHVuZGVmaW5lZGAgZm9yIGVsZW0gPSB0aGlzWyAwIF0gd2hpY2ggd2lsbFxuXHRcdFx0Ly8gdGhyb3cgYW4gZXhjZXB0aW9uIGlmIGFuIGF0dGVtcHQgdG8gcmVhZCBhIGRhdGEgY2FjaGUgaXMgbWFkZS5cblx0XHRcdGlmICggZWxlbSAmJiB2YWx1ZSA9PT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdC8vIEF0dGVtcHQgdG8gZ2V0IGRhdGEgZnJvbSB0aGUgY2FjaGVcblx0XHRcdFx0Ly8gd2l0aCB0aGUga2V5IGFzLWlzXG5cdFx0XHRcdGRhdGEgPSBkYXRhVXNlci5nZXQoIGVsZW0sIGtleSApIHx8XG5cblx0XHRcdFx0XHQvLyBUcnkgdG8gZmluZCBkYXNoZWQga2V5IGlmIGl0IGV4aXN0cyAoZ2gtMjc3OSlcblx0XHRcdFx0XHQvLyBUaGlzIGlzIGZvciAyLjIueCBvbmx5XG5cdFx0XHRcdFx0ZGF0YVVzZXIuZ2V0KCBlbGVtLCBrZXkucmVwbGFjZSggcm11bHRpRGFzaCwgXCItJCZcIiApLnRvTG93ZXJDYXNlKCkgKTtcblxuXHRcdFx0XHRpZiAoIGRhdGEgIT09IHVuZGVmaW5lZCApIHtcblx0XHRcdFx0XHRyZXR1cm4gZGF0YTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGNhbWVsS2V5ID0galF1ZXJ5LmNhbWVsQ2FzZSgga2V5ICk7XG5cblx0XHRcdFx0Ly8gQXR0ZW1wdCB0byBnZXQgZGF0YSBmcm9tIHRoZSBjYWNoZVxuXHRcdFx0XHQvLyB3aXRoIHRoZSBrZXkgY2FtZWxpemVkXG5cdFx0XHRcdGRhdGEgPSBkYXRhVXNlci5nZXQoIGVsZW0sIGNhbWVsS2V5ICk7XG5cdFx0XHRcdGlmICggZGF0YSAhPT0gdW5kZWZpbmVkICkge1xuXHRcdFx0XHRcdHJldHVybiBkYXRhO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gQXR0ZW1wdCB0byBcImRpc2NvdmVyXCIgdGhlIGRhdGEgaW5cblx0XHRcdFx0Ly8gSFRNTDUgY3VzdG9tIGRhdGEtKiBhdHRyc1xuXHRcdFx0XHRkYXRhID0gZGF0YUF0dHIoIGVsZW0sIGNhbWVsS2V5LCB1bmRlZmluZWQgKTtcblx0XHRcdFx0aWYgKCBkYXRhICE9PSB1bmRlZmluZWQgKSB7XG5cdFx0XHRcdFx0cmV0dXJuIGRhdGE7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBXZSB0cmllZCByZWFsbHkgaGFyZCwgYnV0IHRoZSBkYXRhIGRvZXNuJ3QgZXhpc3QuXG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblxuXHRcdFx0Ly8gU2V0IHRoZSBkYXRhLi4uXG5cdFx0XHRjYW1lbEtleSA9IGpRdWVyeS5jYW1lbENhc2UoIGtleSApO1xuXHRcdFx0dGhpcy5lYWNoKCBmdW5jdGlvbigpIHtcblxuXHRcdFx0XHQvLyBGaXJzdCwgYXR0ZW1wdCB0byBzdG9yZSBhIGNvcHkgb3IgcmVmZXJlbmNlIG9mIGFueVxuXHRcdFx0XHQvLyBkYXRhIHRoYXQgbWlnaHQndmUgYmVlbiBzdG9yZSB3aXRoIGEgY2FtZWxDYXNlZCBrZXkuXG5cdFx0XHRcdHZhciBkYXRhID0gZGF0YVVzZXIuZ2V0KCB0aGlzLCBjYW1lbEtleSApO1xuXG5cdFx0XHRcdC8vIEZvciBIVE1MNSBkYXRhLSogYXR0cmlidXRlIGludGVyb3AsIHdlIGhhdmUgdG9cblx0XHRcdFx0Ly8gc3RvcmUgcHJvcGVydHkgbmFtZXMgd2l0aCBkYXNoZXMgaW4gYSBjYW1lbENhc2UgZm9ybS5cblx0XHRcdFx0Ly8gVGhpcyBtaWdodCBub3QgYXBwbHkgdG8gYWxsIHByb3BlcnRpZXMuLi4qXG5cdFx0XHRcdGRhdGFVc2VyLnNldCggdGhpcywgY2FtZWxLZXksIHZhbHVlICk7XG5cblx0XHRcdFx0Ly8gKi4uLiBJbiB0aGUgY2FzZSBvZiBwcm9wZXJ0aWVzIHRoYXQgbWlnaHQgX2FjdHVhbGx5X1xuXHRcdFx0XHQvLyBoYXZlIGRhc2hlcywgd2UgbmVlZCB0byBhbHNvIHN0b3JlIGEgY29weSBvZiB0aGF0XG5cdFx0XHRcdC8vIHVuY2hhbmdlZCBwcm9wZXJ0eS5cblx0XHRcdFx0aWYgKCBrZXkuaW5kZXhPZiggXCItXCIgKSA+IC0xICYmIGRhdGEgIT09IHVuZGVmaW5lZCApIHtcblx0XHRcdFx0XHRkYXRhVXNlci5zZXQoIHRoaXMsIGtleSwgdmFsdWUgKTtcblx0XHRcdFx0fVxuXHRcdFx0fSApO1xuXHRcdH0sIG51bGwsIHZhbHVlLCBhcmd1bWVudHMubGVuZ3RoID4gMSwgbnVsbCwgdHJ1ZSApO1xuXHR9LFxuXG5cdHJlbW92ZURhdGE6IGZ1bmN0aW9uKCBrZXkgKSB7XG5cdFx0cmV0dXJuIHRoaXMuZWFjaCggZnVuY3Rpb24oKSB7XG5cdFx0XHRkYXRhVXNlci5yZW1vdmUoIHRoaXMsIGtleSApO1xuXHRcdH0gKTtcblx0fVxufSApO1xuXG5cbmpRdWVyeS5leHRlbmQoIHtcblx0cXVldWU6IGZ1bmN0aW9uKCBlbGVtLCB0eXBlLCBkYXRhICkge1xuXHRcdHZhciBxdWV1ZTtcblxuXHRcdGlmICggZWxlbSApIHtcblx0XHRcdHR5cGUgPSAoIHR5cGUgfHwgXCJmeFwiICkgKyBcInF1ZXVlXCI7XG5cdFx0XHRxdWV1ZSA9IGRhdGFQcml2LmdldCggZWxlbSwgdHlwZSApO1xuXG5cdFx0XHQvLyBTcGVlZCB1cCBkZXF1ZXVlIGJ5IGdldHRpbmcgb3V0IHF1aWNrbHkgaWYgdGhpcyBpcyBqdXN0IGEgbG9va3VwXG5cdFx0XHRpZiAoIGRhdGEgKSB7XG5cdFx0XHRcdGlmICggIXF1ZXVlIHx8IGpRdWVyeS5pc0FycmF5KCBkYXRhICkgKSB7XG5cdFx0XHRcdFx0cXVldWUgPSBkYXRhUHJpdi5hY2Nlc3MoIGVsZW0sIHR5cGUsIGpRdWVyeS5tYWtlQXJyYXkoIGRhdGEgKSApO1xuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdHF1ZXVlLnB1c2goIGRhdGEgKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIHF1ZXVlIHx8IFtdO1xuXHRcdH1cblx0fSxcblxuXHRkZXF1ZXVlOiBmdW5jdGlvbiggZWxlbSwgdHlwZSApIHtcblx0XHR0eXBlID0gdHlwZSB8fCBcImZ4XCI7XG5cblx0XHR2YXIgcXVldWUgPSBqUXVlcnkucXVldWUoIGVsZW0sIHR5cGUgKSxcblx0XHRcdHN0YXJ0TGVuZ3RoID0gcXVldWUubGVuZ3RoLFxuXHRcdFx0Zm4gPSBxdWV1ZS5zaGlmdCgpLFxuXHRcdFx0aG9va3MgPSBqUXVlcnkuX3F1ZXVlSG9va3MoIGVsZW0sIHR5cGUgKSxcblx0XHRcdG5leHQgPSBmdW5jdGlvbigpIHtcblx0XHRcdFx0alF1ZXJ5LmRlcXVldWUoIGVsZW0sIHR5cGUgKTtcblx0XHRcdH07XG5cblx0XHQvLyBJZiB0aGUgZnggcXVldWUgaXMgZGVxdWV1ZWQsIGFsd2F5cyByZW1vdmUgdGhlIHByb2dyZXNzIHNlbnRpbmVsXG5cdFx0aWYgKCBmbiA9PT0gXCJpbnByb2dyZXNzXCIgKSB7XG5cdFx0XHRmbiA9IHF1ZXVlLnNoaWZ0KCk7XG5cdFx0XHRzdGFydExlbmd0aC0tO1xuXHRcdH1cblxuXHRcdGlmICggZm4gKSB7XG5cblx0XHRcdC8vIEFkZCBhIHByb2dyZXNzIHNlbnRpbmVsIHRvIHByZXZlbnQgdGhlIGZ4IHF1ZXVlIGZyb20gYmVpbmdcblx0XHRcdC8vIGF1dG9tYXRpY2FsbHkgZGVxdWV1ZWRcblx0XHRcdGlmICggdHlwZSA9PT0gXCJmeFwiICkge1xuXHRcdFx0XHRxdWV1ZS51bnNoaWZ0KCBcImlucHJvZ3Jlc3NcIiApO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBDbGVhciB1cCB0aGUgbGFzdCBxdWV1ZSBzdG9wIGZ1bmN0aW9uXG5cdFx0XHRkZWxldGUgaG9va3Muc3RvcDtcblx0XHRcdGZuLmNhbGwoIGVsZW0sIG5leHQsIGhvb2tzICk7XG5cdFx0fVxuXG5cdFx0aWYgKCAhc3RhcnRMZW5ndGggJiYgaG9va3MgKSB7XG5cdFx0XHRob29rcy5lbXB0eS5maXJlKCk7XG5cdFx0fVxuXHR9LFxuXG5cdC8vIE5vdCBwdWJsaWMgLSBnZW5lcmF0ZSBhIHF1ZXVlSG9va3Mgb2JqZWN0LCBvciByZXR1cm4gdGhlIGN1cnJlbnQgb25lXG5cdF9xdWV1ZUhvb2tzOiBmdW5jdGlvbiggZWxlbSwgdHlwZSApIHtcblx0XHR2YXIga2V5ID0gdHlwZSArIFwicXVldWVIb29rc1wiO1xuXHRcdHJldHVybiBkYXRhUHJpdi5nZXQoIGVsZW0sIGtleSApIHx8IGRhdGFQcml2LmFjY2VzcyggZWxlbSwga2V5LCB7XG5cdFx0XHRlbXB0eTogalF1ZXJ5LkNhbGxiYWNrcyggXCJvbmNlIG1lbW9yeVwiICkuYWRkKCBmdW5jdGlvbigpIHtcblx0XHRcdFx0ZGF0YVByaXYucmVtb3ZlKCBlbGVtLCBbIHR5cGUgKyBcInF1ZXVlXCIsIGtleSBdICk7XG5cdFx0XHR9IClcblx0XHR9ICk7XG5cdH1cbn0gKTtcblxualF1ZXJ5LmZuLmV4dGVuZCgge1xuXHRxdWV1ZTogZnVuY3Rpb24oIHR5cGUsIGRhdGEgKSB7XG5cdFx0dmFyIHNldHRlciA9IDI7XG5cblx0XHRpZiAoIHR5cGVvZiB0eXBlICE9PSBcInN0cmluZ1wiICkge1xuXHRcdFx0ZGF0YSA9IHR5cGU7XG5cdFx0XHR0eXBlID0gXCJmeFwiO1xuXHRcdFx0c2V0dGVyLS07XG5cdFx0fVxuXG5cdFx0aWYgKCBhcmd1bWVudHMubGVuZ3RoIDwgc2V0dGVyICkge1xuXHRcdFx0cmV0dXJuIGpRdWVyeS5xdWV1ZSggdGhpc1sgMCBdLCB0eXBlICk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGRhdGEgPT09IHVuZGVmaW5lZCA/XG5cdFx0XHR0aGlzIDpcblx0XHRcdHRoaXMuZWFjaCggZnVuY3Rpb24oKSB7XG5cdFx0XHRcdHZhciBxdWV1ZSA9IGpRdWVyeS5xdWV1ZSggdGhpcywgdHlwZSwgZGF0YSApO1xuXG5cdFx0XHRcdC8vIEVuc3VyZSBhIGhvb2tzIGZvciB0aGlzIHF1ZXVlXG5cdFx0XHRcdGpRdWVyeS5fcXVldWVIb29rcyggdGhpcywgdHlwZSApO1xuXG5cdFx0XHRcdGlmICggdHlwZSA9PT0gXCJmeFwiICYmIHF1ZXVlWyAwIF0gIT09IFwiaW5wcm9ncmVzc1wiICkge1xuXHRcdFx0XHRcdGpRdWVyeS5kZXF1ZXVlKCB0aGlzLCB0eXBlICk7XG5cdFx0XHRcdH1cblx0XHRcdH0gKTtcblx0fSxcblx0ZGVxdWV1ZTogZnVuY3Rpb24oIHR5cGUgKSB7XG5cdFx0cmV0dXJuIHRoaXMuZWFjaCggZnVuY3Rpb24oKSB7XG5cdFx0XHRqUXVlcnkuZGVxdWV1ZSggdGhpcywgdHlwZSApO1xuXHRcdH0gKTtcblx0fSxcblx0Y2xlYXJRdWV1ZTogZnVuY3Rpb24oIHR5cGUgKSB7XG5cdFx0cmV0dXJuIHRoaXMucXVldWUoIHR5cGUgfHwgXCJmeFwiLCBbXSApO1xuXHR9LFxuXG5cdC8vIEdldCBhIHByb21pc2UgcmVzb2x2ZWQgd2hlbiBxdWV1ZXMgb2YgYSBjZXJ0YWluIHR5cGVcblx0Ly8gYXJlIGVtcHRpZWQgKGZ4IGlzIHRoZSB0eXBlIGJ5IGRlZmF1bHQpXG5cdHByb21pc2U6IGZ1bmN0aW9uKCB0eXBlLCBvYmogKSB7XG5cdFx0dmFyIHRtcCxcblx0XHRcdGNvdW50ID0gMSxcblx0XHRcdGRlZmVyID0galF1ZXJ5LkRlZmVycmVkKCksXG5cdFx0XHRlbGVtZW50cyA9IHRoaXMsXG5cdFx0XHRpID0gdGhpcy5sZW5ndGgsXG5cdFx0XHRyZXNvbHZlID0gZnVuY3Rpb24oKSB7XG5cdFx0XHRcdGlmICggISggLS1jb3VudCApICkge1xuXHRcdFx0XHRcdGRlZmVyLnJlc29sdmVXaXRoKCBlbGVtZW50cywgWyBlbGVtZW50cyBdICk7XG5cdFx0XHRcdH1cblx0XHRcdH07XG5cblx0XHRpZiAoIHR5cGVvZiB0eXBlICE9PSBcInN0cmluZ1wiICkge1xuXHRcdFx0b2JqID0gdHlwZTtcblx0XHRcdHR5cGUgPSB1bmRlZmluZWQ7XG5cdFx0fVxuXHRcdHR5cGUgPSB0eXBlIHx8IFwiZnhcIjtcblxuXHRcdHdoaWxlICggaS0tICkge1xuXHRcdFx0dG1wID0gZGF0YVByaXYuZ2V0KCBlbGVtZW50c1sgaSBdLCB0eXBlICsgXCJxdWV1ZUhvb2tzXCIgKTtcblx0XHRcdGlmICggdG1wICYmIHRtcC5lbXB0eSApIHtcblx0XHRcdFx0Y291bnQrKztcblx0XHRcdFx0dG1wLmVtcHR5LmFkZCggcmVzb2x2ZSApO1xuXHRcdFx0fVxuXHRcdH1cblx0XHRyZXNvbHZlKCk7XG5cdFx0cmV0dXJuIGRlZmVyLnByb21pc2UoIG9iaiApO1xuXHR9XG59ICk7XG52YXIgcG51bSA9ICggL1srLV0/KD86XFxkKlxcLnwpXFxkKyg/OltlRV1bKy1dP1xcZCt8KS8gKS5zb3VyY2U7XG5cbnZhciByY3NzTnVtID0gbmV3IFJlZ0V4cCggXCJeKD86KFsrLV0pPXwpKFwiICsgcG51bSArIFwiKShbYS16JV0qKSRcIiwgXCJpXCIgKTtcblxuXG52YXIgY3NzRXhwYW5kID0gWyBcIlRvcFwiLCBcIlJpZ2h0XCIsIFwiQm90dG9tXCIsIFwiTGVmdFwiIF07XG5cbnZhciBpc0hpZGRlbiA9IGZ1bmN0aW9uKCBlbGVtLCBlbCApIHtcblxuXHRcdC8vIGlzSGlkZGVuIG1pZ2h0IGJlIGNhbGxlZCBmcm9tIGpRdWVyeSNmaWx0ZXIgZnVuY3Rpb247XG5cdFx0Ly8gaW4gdGhhdCBjYXNlLCBlbGVtZW50IHdpbGwgYmUgc2Vjb25kIGFyZ3VtZW50XG5cdFx0ZWxlbSA9IGVsIHx8IGVsZW07XG5cdFx0cmV0dXJuIGpRdWVyeS5jc3MoIGVsZW0sIFwiZGlzcGxheVwiICkgPT09IFwibm9uZVwiIHx8XG5cdFx0XHQhalF1ZXJ5LmNvbnRhaW5zKCBlbGVtLm93bmVyRG9jdW1lbnQsIGVsZW0gKTtcblx0fTtcblxuXG5cbmZ1bmN0aW9uIGFkanVzdENTUyggZWxlbSwgcHJvcCwgdmFsdWVQYXJ0cywgdHdlZW4gKSB7XG5cdHZhciBhZGp1c3RlZCxcblx0XHRzY2FsZSA9IDEsXG5cdFx0bWF4SXRlcmF0aW9ucyA9IDIwLFxuXHRcdGN1cnJlbnRWYWx1ZSA9IHR3ZWVuID9cblx0XHRcdGZ1bmN0aW9uKCkgeyByZXR1cm4gdHdlZW4uY3VyKCk7IH0gOlxuXHRcdFx0ZnVuY3Rpb24oKSB7IHJldHVybiBqUXVlcnkuY3NzKCBlbGVtLCBwcm9wLCBcIlwiICk7IH0sXG5cdFx0aW5pdGlhbCA9IGN1cnJlbnRWYWx1ZSgpLFxuXHRcdHVuaXQgPSB2YWx1ZVBhcnRzICYmIHZhbHVlUGFydHNbIDMgXSB8fCAoIGpRdWVyeS5jc3NOdW1iZXJbIHByb3AgXSA/IFwiXCIgOiBcInB4XCIgKSxcblxuXHRcdC8vIFN0YXJ0aW5nIHZhbHVlIGNvbXB1dGF0aW9uIGlzIHJlcXVpcmVkIGZvciBwb3RlbnRpYWwgdW5pdCBtaXNtYXRjaGVzXG5cdFx0aW5pdGlhbEluVW5pdCA9ICggalF1ZXJ5LmNzc051bWJlclsgcHJvcCBdIHx8IHVuaXQgIT09IFwicHhcIiAmJiAraW5pdGlhbCApICYmXG5cdFx0XHRyY3NzTnVtLmV4ZWMoIGpRdWVyeS5jc3MoIGVsZW0sIHByb3AgKSApO1xuXG5cdGlmICggaW5pdGlhbEluVW5pdCAmJiBpbml0aWFsSW5Vbml0WyAzIF0gIT09IHVuaXQgKSB7XG5cblx0XHQvLyBUcnVzdCB1bml0cyByZXBvcnRlZCBieSBqUXVlcnkuY3NzXG5cdFx0dW5pdCA9IHVuaXQgfHwgaW5pdGlhbEluVW5pdFsgMyBdO1xuXG5cdFx0Ly8gTWFrZSBzdXJlIHdlIHVwZGF0ZSB0aGUgdHdlZW4gcHJvcGVydGllcyBsYXRlciBvblxuXHRcdHZhbHVlUGFydHMgPSB2YWx1ZVBhcnRzIHx8IFtdO1xuXG5cdFx0Ly8gSXRlcmF0aXZlbHkgYXBwcm94aW1hdGUgZnJvbSBhIG5vbnplcm8gc3RhcnRpbmcgcG9pbnRcblx0XHRpbml0aWFsSW5Vbml0ID0gK2luaXRpYWwgfHwgMTtcblxuXHRcdGRvIHtcblxuXHRcdFx0Ly8gSWYgcHJldmlvdXMgaXRlcmF0aW9uIHplcm9lZCBvdXQsIGRvdWJsZSB1bnRpbCB3ZSBnZXQgKnNvbWV0aGluZyouXG5cdFx0XHQvLyBVc2Ugc3RyaW5nIGZvciBkb3VibGluZyBzbyB3ZSBkb24ndCBhY2NpZGVudGFsbHkgc2VlIHNjYWxlIGFzIHVuY2hhbmdlZCBiZWxvd1xuXHRcdFx0c2NhbGUgPSBzY2FsZSB8fCBcIi41XCI7XG5cblx0XHRcdC8vIEFkanVzdCBhbmQgYXBwbHlcblx0XHRcdGluaXRpYWxJblVuaXQgPSBpbml0aWFsSW5Vbml0IC8gc2NhbGU7XG5cdFx0XHRqUXVlcnkuc3R5bGUoIGVsZW0sIHByb3AsIGluaXRpYWxJblVuaXQgKyB1bml0ICk7XG5cblx0XHQvLyBVcGRhdGUgc2NhbGUsIHRvbGVyYXRpbmcgemVybyBvciBOYU4gZnJvbSB0d2Vlbi5jdXIoKVxuXHRcdC8vIEJyZWFrIHRoZSBsb29wIGlmIHNjYWxlIGlzIHVuY2hhbmdlZCBvciBwZXJmZWN0LCBvciBpZiB3ZSd2ZSBqdXN0IGhhZCBlbm91Z2guXG5cdFx0fSB3aGlsZSAoXG5cdFx0XHRzY2FsZSAhPT0gKCBzY2FsZSA9IGN1cnJlbnRWYWx1ZSgpIC8gaW5pdGlhbCApICYmIHNjYWxlICE9PSAxICYmIC0tbWF4SXRlcmF0aW9uc1xuXHRcdCk7XG5cdH1cblxuXHRpZiAoIHZhbHVlUGFydHMgKSB7XG5cdFx0aW5pdGlhbEluVW5pdCA9ICtpbml0aWFsSW5Vbml0IHx8ICtpbml0aWFsIHx8IDA7XG5cblx0XHQvLyBBcHBseSByZWxhdGl2ZSBvZmZzZXQgKCs9Ly09KSBpZiBzcGVjaWZpZWRcblx0XHRhZGp1c3RlZCA9IHZhbHVlUGFydHNbIDEgXSA/XG5cdFx0XHRpbml0aWFsSW5Vbml0ICsgKCB2YWx1ZVBhcnRzWyAxIF0gKyAxICkgKiB2YWx1ZVBhcnRzWyAyIF0gOlxuXHRcdFx0K3ZhbHVlUGFydHNbIDIgXTtcblx0XHRpZiAoIHR3ZWVuICkge1xuXHRcdFx0dHdlZW4udW5pdCA9IHVuaXQ7XG5cdFx0XHR0d2Vlbi5zdGFydCA9IGluaXRpYWxJblVuaXQ7XG5cdFx0XHR0d2Vlbi5lbmQgPSBhZGp1c3RlZDtcblx0XHR9XG5cdH1cblx0cmV0dXJuIGFkanVzdGVkO1xufVxudmFyIHJjaGVja2FibGVUeXBlID0gKCAvXig/OmNoZWNrYm94fHJhZGlvKSQvaSApO1xuXG52YXIgcnRhZ05hbWUgPSAoIC88KFtcXHc6LV0rKS8gKTtcblxudmFyIHJzY3JpcHRUeXBlID0gKCAvXiR8XFwvKD86amF2YXxlY21hKXNjcmlwdC9pICk7XG5cblxuXG4vLyBXZSBoYXZlIHRvIGNsb3NlIHRoZXNlIHRhZ3MgdG8gc3VwcG9ydCBYSFRNTCAoIzEzMjAwKVxudmFyIHdyYXBNYXAgPSB7XG5cblx0Ly8gU3VwcG9ydDogSUU5XG5cdG9wdGlvbjogWyAxLCBcIjxzZWxlY3QgbXVsdGlwbGU9J211bHRpcGxlJz5cIiwgXCI8L3NlbGVjdD5cIiBdLFxuXG5cdC8vIFhIVE1MIHBhcnNlcnMgZG8gbm90IG1hZ2ljYWxseSBpbnNlcnQgZWxlbWVudHMgaW4gdGhlXG5cdC8vIHNhbWUgd2F5IHRoYXQgdGFnIHNvdXAgcGFyc2VycyBkby4gU28gd2UgY2Fubm90IHNob3J0ZW5cblx0Ly8gdGhpcyBieSBvbWl0dGluZyA8dGJvZHk+IG9yIG90aGVyIHJlcXVpcmVkIGVsZW1lbnRzLlxuXHR0aGVhZDogWyAxLCBcIjx0YWJsZT5cIiwgXCI8L3RhYmxlPlwiIF0sXG5cdGNvbDogWyAyLCBcIjx0YWJsZT48Y29sZ3JvdXA+XCIsIFwiPC9jb2xncm91cD48L3RhYmxlPlwiIF0sXG5cdHRyOiBbIDIsIFwiPHRhYmxlPjx0Ym9keT5cIiwgXCI8L3Rib2R5PjwvdGFibGU+XCIgXSxcblx0dGQ6IFsgMywgXCI8dGFibGU+PHRib2R5Pjx0cj5cIiwgXCI8L3RyPjwvdGJvZHk+PC90YWJsZT5cIiBdLFxuXG5cdF9kZWZhdWx0OiBbIDAsIFwiXCIsIFwiXCIgXVxufTtcblxuLy8gU3VwcG9ydDogSUU5XG53cmFwTWFwLm9wdGdyb3VwID0gd3JhcE1hcC5vcHRpb247XG5cbndyYXBNYXAudGJvZHkgPSB3cmFwTWFwLnRmb290ID0gd3JhcE1hcC5jb2xncm91cCA9IHdyYXBNYXAuY2FwdGlvbiA9IHdyYXBNYXAudGhlYWQ7XG53cmFwTWFwLnRoID0gd3JhcE1hcC50ZDtcblxuXG5mdW5jdGlvbiBnZXRBbGwoIGNvbnRleHQsIHRhZyApIHtcblxuXHQvLyBTdXBwb3J0OiBJRTktMTErXG5cdC8vIFVzZSB0eXBlb2YgdG8gYXZvaWQgemVyby1hcmd1bWVudCBtZXRob2QgaW52b2NhdGlvbiBvbiBob3N0IG9iamVjdHMgKCMxNTE1MSlcblx0dmFyIHJldCA9IHR5cGVvZiBjb250ZXh0LmdldEVsZW1lbnRzQnlUYWdOYW1lICE9PSBcInVuZGVmaW5lZFwiID9cblx0XHRcdGNvbnRleHQuZ2V0RWxlbWVudHNCeVRhZ05hbWUoIHRhZyB8fCBcIipcIiApIDpcblx0XHRcdHR5cGVvZiBjb250ZXh0LnF1ZXJ5U2VsZWN0b3JBbGwgIT09IFwidW5kZWZpbmVkXCIgP1xuXHRcdFx0XHRjb250ZXh0LnF1ZXJ5U2VsZWN0b3JBbGwoIHRhZyB8fCBcIipcIiApIDpcblx0XHRcdFtdO1xuXG5cdHJldHVybiB0YWcgPT09IHVuZGVmaW5lZCB8fCB0YWcgJiYgalF1ZXJ5Lm5vZGVOYW1lKCBjb250ZXh0LCB0YWcgKSA/XG5cdFx0alF1ZXJ5Lm1lcmdlKCBbIGNvbnRleHQgXSwgcmV0ICkgOlxuXHRcdHJldDtcbn1cblxuXG4vLyBNYXJrIHNjcmlwdHMgYXMgaGF2aW5nIGFscmVhZHkgYmVlbiBldmFsdWF0ZWRcbmZ1bmN0aW9uIHNldEdsb2JhbEV2YWwoIGVsZW1zLCByZWZFbGVtZW50cyApIHtcblx0dmFyIGkgPSAwLFxuXHRcdGwgPSBlbGVtcy5sZW5ndGg7XG5cblx0Zm9yICggOyBpIDwgbDsgaSsrICkge1xuXHRcdGRhdGFQcml2LnNldChcblx0XHRcdGVsZW1zWyBpIF0sXG5cdFx0XHRcImdsb2JhbEV2YWxcIixcblx0XHRcdCFyZWZFbGVtZW50cyB8fCBkYXRhUHJpdi5nZXQoIHJlZkVsZW1lbnRzWyBpIF0sIFwiZ2xvYmFsRXZhbFwiIClcblx0XHQpO1xuXHR9XG59XG5cblxudmFyIHJodG1sID0gLzx8JiM/XFx3KzsvO1xuXG5mdW5jdGlvbiBidWlsZEZyYWdtZW50KCBlbGVtcywgY29udGV4dCwgc2NyaXB0cywgc2VsZWN0aW9uLCBpZ25vcmVkICkge1xuXHR2YXIgZWxlbSwgdG1wLCB0YWcsIHdyYXAsIGNvbnRhaW5zLCBqLFxuXHRcdGZyYWdtZW50ID0gY29udGV4dC5jcmVhdGVEb2N1bWVudEZyYWdtZW50KCksXG5cdFx0bm9kZXMgPSBbXSxcblx0XHRpID0gMCxcblx0XHRsID0gZWxlbXMubGVuZ3RoO1xuXG5cdGZvciAoIDsgaSA8IGw7IGkrKyApIHtcblx0XHRlbGVtID0gZWxlbXNbIGkgXTtcblxuXHRcdGlmICggZWxlbSB8fCBlbGVtID09PSAwICkge1xuXG5cdFx0XHQvLyBBZGQgbm9kZXMgZGlyZWN0bHlcblx0XHRcdGlmICggalF1ZXJ5LnR5cGUoIGVsZW0gKSA9PT0gXCJvYmplY3RcIiApIHtcblxuXHRcdFx0XHQvLyBTdXBwb3J0OiBBbmRyb2lkPDQuMSwgUGhhbnRvbUpTPDJcblx0XHRcdFx0Ly8gcHVzaC5hcHBseShfLCBhcnJheWxpa2UpIHRocm93cyBvbiBhbmNpZW50IFdlYktpdFxuXHRcdFx0XHRqUXVlcnkubWVyZ2UoIG5vZGVzLCBlbGVtLm5vZGVUeXBlID8gWyBlbGVtIF0gOiBlbGVtICk7XG5cblx0XHRcdC8vIENvbnZlcnQgbm9uLWh0bWwgaW50byBhIHRleHQgbm9kZVxuXHRcdFx0fSBlbHNlIGlmICggIXJodG1sLnRlc3QoIGVsZW0gKSApIHtcblx0XHRcdFx0bm9kZXMucHVzaCggY29udGV4dC5jcmVhdGVUZXh0Tm9kZSggZWxlbSApICk7XG5cblx0XHRcdC8vIENvbnZlcnQgaHRtbCBpbnRvIERPTSBub2Rlc1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0dG1wID0gdG1wIHx8IGZyYWdtZW50LmFwcGVuZENoaWxkKCBjb250ZXh0LmNyZWF0ZUVsZW1lbnQoIFwiZGl2XCIgKSApO1xuXG5cdFx0XHRcdC8vIERlc2VyaWFsaXplIGEgc3RhbmRhcmQgcmVwcmVzZW50YXRpb25cblx0XHRcdFx0dGFnID0gKCBydGFnTmFtZS5leGVjKCBlbGVtICkgfHwgWyBcIlwiLCBcIlwiIF0gKVsgMSBdLnRvTG93ZXJDYXNlKCk7XG5cdFx0XHRcdHdyYXAgPSB3cmFwTWFwWyB0YWcgXSB8fCB3cmFwTWFwLl9kZWZhdWx0O1xuXHRcdFx0XHR0bXAuaW5uZXJIVE1MID0gd3JhcFsgMSBdICsgalF1ZXJ5Lmh0bWxQcmVmaWx0ZXIoIGVsZW0gKSArIHdyYXBbIDIgXTtcblxuXHRcdFx0XHQvLyBEZXNjZW5kIHRocm91Z2ggd3JhcHBlcnMgdG8gdGhlIHJpZ2h0IGNvbnRlbnRcblx0XHRcdFx0aiA9IHdyYXBbIDAgXTtcblx0XHRcdFx0d2hpbGUgKCBqLS0gKSB7XG5cdFx0XHRcdFx0dG1wID0gdG1wLmxhc3RDaGlsZDtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIFN1cHBvcnQ6IEFuZHJvaWQ8NC4xLCBQaGFudG9tSlM8MlxuXHRcdFx0XHQvLyBwdXNoLmFwcGx5KF8sIGFycmF5bGlrZSkgdGhyb3dzIG9uIGFuY2llbnQgV2ViS2l0XG5cdFx0XHRcdGpRdWVyeS5tZXJnZSggbm9kZXMsIHRtcC5jaGlsZE5vZGVzICk7XG5cblx0XHRcdFx0Ly8gUmVtZW1iZXIgdGhlIHRvcC1sZXZlbCBjb250YWluZXJcblx0XHRcdFx0dG1wID0gZnJhZ21lbnQuZmlyc3RDaGlsZDtcblxuXHRcdFx0XHQvLyBFbnN1cmUgdGhlIGNyZWF0ZWQgbm9kZXMgYXJlIG9ycGhhbmVkICgjMTIzOTIpXG5cdFx0XHRcdHRtcC50ZXh0Q29udGVudCA9IFwiXCI7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0Ly8gUmVtb3ZlIHdyYXBwZXIgZnJvbSBmcmFnbWVudFxuXHRmcmFnbWVudC50ZXh0Q29udGVudCA9IFwiXCI7XG5cblx0aSA9IDA7XG5cdHdoaWxlICggKCBlbGVtID0gbm9kZXNbIGkrKyBdICkgKSB7XG5cblx0XHQvLyBTa2lwIGVsZW1lbnRzIGFscmVhZHkgaW4gdGhlIGNvbnRleHQgY29sbGVjdGlvbiAodHJhYy00MDg3KVxuXHRcdGlmICggc2VsZWN0aW9uICYmIGpRdWVyeS5pbkFycmF5KCBlbGVtLCBzZWxlY3Rpb24gKSA+IC0xICkge1xuXHRcdFx0aWYgKCBpZ25vcmVkICkge1xuXHRcdFx0XHRpZ25vcmVkLnB1c2goIGVsZW0gKTtcblx0XHRcdH1cblx0XHRcdGNvbnRpbnVlO1xuXHRcdH1cblxuXHRcdGNvbnRhaW5zID0galF1ZXJ5LmNvbnRhaW5zKCBlbGVtLm93bmVyRG9jdW1lbnQsIGVsZW0gKTtcblxuXHRcdC8vIEFwcGVuZCB0byBmcmFnbWVudFxuXHRcdHRtcCA9IGdldEFsbCggZnJhZ21lbnQuYXBwZW5kQ2hpbGQoIGVsZW0gKSwgXCJzY3JpcHRcIiApO1xuXG5cdFx0Ly8gUHJlc2VydmUgc2NyaXB0IGV2YWx1YXRpb24gaGlzdG9yeVxuXHRcdGlmICggY29udGFpbnMgKSB7XG5cdFx0XHRzZXRHbG9iYWxFdmFsKCB0bXAgKTtcblx0XHR9XG5cblx0XHQvLyBDYXB0dXJlIGV4ZWN1dGFibGVzXG5cdFx0aWYgKCBzY3JpcHRzICkge1xuXHRcdFx0aiA9IDA7XG5cdFx0XHR3aGlsZSAoICggZWxlbSA9IHRtcFsgaisrIF0gKSApIHtcblx0XHRcdFx0aWYgKCByc2NyaXB0VHlwZS50ZXN0KCBlbGVtLnR5cGUgfHwgXCJcIiApICkge1xuXHRcdFx0XHRcdHNjcmlwdHMucHVzaCggZWxlbSApO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0cmV0dXJuIGZyYWdtZW50O1xufVxuXG5cbiggZnVuY3Rpb24oKSB7XG5cdHZhciBmcmFnbWVudCA9IGRvY3VtZW50LmNyZWF0ZURvY3VtZW50RnJhZ21lbnQoKSxcblx0XHRkaXYgPSBmcmFnbWVudC5hcHBlbmRDaGlsZCggZG9jdW1lbnQuY3JlYXRlRWxlbWVudCggXCJkaXZcIiApICksXG5cdFx0aW5wdXQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCBcImlucHV0XCIgKTtcblxuXHQvLyBTdXBwb3J0OiBBbmRyb2lkIDQuMC00LjMsIFNhZmFyaTw9NS4xXG5cdC8vIENoZWNrIHN0YXRlIGxvc3QgaWYgdGhlIG5hbWUgaXMgc2V0ICgjMTEyMTcpXG5cdC8vIFN1cHBvcnQ6IFdpbmRvd3MgV2ViIEFwcHMgKFdXQSlcblx0Ly8gYG5hbWVgIGFuZCBgdHlwZWAgbXVzdCB1c2UgLnNldEF0dHJpYnV0ZSBmb3IgV1dBICgjMTQ5MDEpXG5cdGlucHV0LnNldEF0dHJpYnV0ZSggXCJ0eXBlXCIsIFwicmFkaW9cIiApO1xuXHRpbnB1dC5zZXRBdHRyaWJ1dGUoIFwiY2hlY2tlZFwiLCBcImNoZWNrZWRcIiApO1xuXHRpbnB1dC5zZXRBdHRyaWJ1dGUoIFwibmFtZVwiLCBcInRcIiApO1xuXG5cdGRpdi5hcHBlbmRDaGlsZCggaW5wdXQgKTtcblxuXHQvLyBTdXBwb3J0OiBTYWZhcmk8PTUuMSwgQW5kcm9pZDw0LjJcblx0Ly8gT2xkZXIgV2ViS2l0IGRvZXNuJ3QgY2xvbmUgY2hlY2tlZCBzdGF0ZSBjb3JyZWN0bHkgaW4gZnJhZ21lbnRzXG5cdHN1cHBvcnQuY2hlY2tDbG9uZSA9IGRpdi5jbG9uZU5vZGUoIHRydWUgKS5jbG9uZU5vZGUoIHRydWUgKS5sYXN0Q2hpbGQuY2hlY2tlZDtcblxuXHQvLyBTdXBwb3J0OiBJRTw9MTErXG5cdC8vIE1ha2Ugc3VyZSB0ZXh0YXJlYSAoYW5kIGNoZWNrYm94KSBkZWZhdWx0VmFsdWUgaXMgcHJvcGVybHkgY2xvbmVkXG5cdGRpdi5pbm5lckhUTUwgPSBcIjx0ZXh0YXJlYT54PC90ZXh0YXJlYT5cIjtcblx0c3VwcG9ydC5ub0Nsb25lQ2hlY2tlZCA9ICEhZGl2LmNsb25lTm9kZSggdHJ1ZSApLmxhc3RDaGlsZC5kZWZhdWx0VmFsdWU7XG59ICkoKTtcblxuXG52YXJcblx0cmtleUV2ZW50ID0gL15rZXkvLFxuXHRybW91c2VFdmVudCA9IC9eKD86bW91c2V8cG9pbnRlcnxjb250ZXh0bWVudXxkcmFnfGRyb3ApfGNsaWNrLyxcblx0cnR5cGVuYW1lc3BhY2UgPSAvXihbXi5dKikoPzpcXC4oLispfCkvO1xuXG5mdW5jdGlvbiByZXR1cm5UcnVlKCkge1xuXHRyZXR1cm4gdHJ1ZTtcbn1cblxuZnVuY3Rpb24gcmV0dXJuRmFsc2UoKSB7XG5cdHJldHVybiBmYWxzZTtcbn1cblxuLy8gU3VwcG9ydDogSUU5XG4vLyBTZWUgIzEzMzkzIGZvciBtb3JlIGluZm9cbmZ1bmN0aW9uIHNhZmVBY3RpdmVFbGVtZW50KCkge1xuXHR0cnkge1xuXHRcdHJldHVybiBkb2N1bWVudC5hY3RpdmVFbGVtZW50O1xuXHR9IGNhdGNoICggZXJyICkgeyB9XG59XG5cbmZ1bmN0aW9uIG9uKCBlbGVtLCB0eXBlcywgc2VsZWN0b3IsIGRhdGEsIGZuLCBvbmUgKSB7XG5cdHZhciBvcmlnRm4sIHR5cGU7XG5cblx0Ly8gVHlwZXMgY2FuIGJlIGEgbWFwIG9mIHR5cGVzL2hhbmRsZXJzXG5cdGlmICggdHlwZW9mIHR5cGVzID09PSBcIm9iamVjdFwiICkge1xuXG5cdFx0Ly8gKCB0eXBlcy1PYmplY3QsIHNlbGVjdG9yLCBkYXRhIClcblx0XHRpZiAoIHR5cGVvZiBzZWxlY3RvciAhPT0gXCJzdHJpbmdcIiApIHtcblxuXHRcdFx0Ly8gKCB0eXBlcy1PYmplY3QsIGRhdGEgKVxuXHRcdFx0ZGF0YSA9IGRhdGEgfHwgc2VsZWN0b3I7XG5cdFx0XHRzZWxlY3RvciA9IHVuZGVmaW5lZDtcblx0XHR9XG5cdFx0Zm9yICggdHlwZSBpbiB0eXBlcyApIHtcblx0XHRcdG9uKCBlbGVtLCB0eXBlLCBzZWxlY3RvciwgZGF0YSwgdHlwZXNbIHR5cGUgXSwgb25lICk7XG5cdFx0fVxuXHRcdHJldHVybiBlbGVtO1xuXHR9XG5cblx0aWYgKCBkYXRhID09IG51bGwgJiYgZm4gPT0gbnVsbCApIHtcblxuXHRcdC8vICggdHlwZXMsIGZuIClcblx0XHRmbiA9IHNlbGVjdG9yO1xuXHRcdGRhdGEgPSBzZWxlY3RvciA9IHVuZGVmaW5lZDtcblx0fSBlbHNlIGlmICggZm4gPT0gbnVsbCApIHtcblx0XHRpZiAoIHR5cGVvZiBzZWxlY3RvciA9PT0gXCJzdHJpbmdcIiApIHtcblxuXHRcdFx0Ly8gKCB0eXBlcywgc2VsZWN0b3IsIGZuIClcblx0XHRcdGZuID0gZGF0YTtcblx0XHRcdGRhdGEgPSB1bmRlZmluZWQ7XG5cdFx0fSBlbHNlIHtcblxuXHRcdFx0Ly8gKCB0eXBlcywgZGF0YSwgZm4gKVxuXHRcdFx0Zm4gPSBkYXRhO1xuXHRcdFx0ZGF0YSA9IHNlbGVjdG9yO1xuXHRcdFx0c2VsZWN0b3IgPSB1bmRlZmluZWQ7XG5cdFx0fVxuXHR9XG5cdGlmICggZm4gPT09IGZhbHNlICkge1xuXHRcdGZuID0gcmV0dXJuRmFsc2U7XG5cdH0gZWxzZSBpZiAoICFmbiApIHtcblx0XHRyZXR1cm4gZWxlbTtcblx0fVxuXG5cdGlmICggb25lID09PSAxICkge1xuXHRcdG9yaWdGbiA9IGZuO1xuXHRcdGZuID0gZnVuY3Rpb24oIGV2ZW50ICkge1xuXG5cdFx0XHQvLyBDYW4gdXNlIGFuIGVtcHR5IHNldCwgc2luY2UgZXZlbnQgY29udGFpbnMgdGhlIGluZm9cblx0XHRcdGpRdWVyeSgpLm9mZiggZXZlbnQgKTtcblx0XHRcdHJldHVybiBvcmlnRm4uYXBwbHkoIHRoaXMsIGFyZ3VtZW50cyApO1xuXHRcdH07XG5cblx0XHQvLyBVc2Ugc2FtZSBndWlkIHNvIGNhbGxlciBjYW4gcmVtb3ZlIHVzaW5nIG9yaWdGblxuXHRcdGZuLmd1aWQgPSBvcmlnRm4uZ3VpZCB8fCAoIG9yaWdGbi5ndWlkID0galF1ZXJ5Lmd1aWQrKyApO1xuXHR9XG5cdHJldHVybiBlbGVtLmVhY2goIGZ1bmN0aW9uKCkge1xuXHRcdGpRdWVyeS5ldmVudC5hZGQoIHRoaXMsIHR5cGVzLCBmbiwgZGF0YSwgc2VsZWN0b3IgKTtcblx0fSApO1xufVxuXG4vKlxuICogSGVscGVyIGZ1bmN0aW9ucyBmb3IgbWFuYWdpbmcgZXZlbnRzIC0tIG5vdCBwYXJ0IG9mIHRoZSBwdWJsaWMgaW50ZXJmYWNlLlxuICogUHJvcHMgdG8gRGVhbiBFZHdhcmRzJyBhZGRFdmVudCBsaWJyYXJ5IGZvciBtYW55IG9mIHRoZSBpZGVhcy5cbiAqL1xualF1ZXJ5LmV2ZW50ID0ge1xuXG5cdGdsb2JhbDoge30sXG5cblx0YWRkOiBmdW5jdGlvbiggZWxlbSwgdHlwZXMsIGhhbmRsZXIsIGRhdGEsIHNlbGVjdG9yICkge1xuXG5cdFx0dmFyIGhhbmRsZU9iakluLCBldmVudEhhbmRsZSwgdG1wLFxuXHRcdFx0ZXZlbnRzLCB0LCBoYW5kbGVPYmosXG5cdFx0XHRzcGVjaWFsLCBoYW5kbGVycywgdHlwZSwgbmFtZXNwYWNlcywgb3JpZ1R5cGUsXG5cdFx0XHRlbGVtRGF0YSA9IGRhdGFQcml2LmdldCggZWxlbSApO1xuXG5cdFx0Ly8gRG9uJ3QgYXR0YWNoIGV2ZW50cyB0byBub0RhdGEgb3IgdGV4dC9jb21tZW50IG5vZGVzIChidXQgYWxsb3cgcGxhaW4gb2JqZWN0cylcblx0XHRpZiAoICFlbGVtRGF0YSApIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHQvLyBDYWxsZXIgY2FuIHBhc3MgaW4gYW4gb2JqZWN0IG9mIGN1c3RvbSBkYXRhIGluIGxpZXUgb2YgdGhlIGhhbmRsZXJcblx0XHRpZiAoIGhhbmRsZXIuaGFuZGxlciApIHtcblx0XHRcdGhhbmRsZU9iakluID0gaGFuZGxlcjtcblx0XHRcdGhhbmRsZXIgPSBoYW5kbGVPYmpJbi5oYW5kbGVyO1xuXHRcdFx0c2VsZWN0b3IgPSBoYW5kbGVPYmpJbi5zZWxlY3Rvcjtcblx0XHR9XG5cblx0XHQvLyBNYWtlIHN1cmUgdGhhdCB0aGUgaGFuZGxlciBoYXMgYSB1bmlxdWUgSUQsIHVzZWQgdG8gZmluZC9yZW1vdmUgaXQgbGF0ZXJcblx0XHRpZiAoICFoYW5kbGVyLmd1aWQgKSB7XG5cdFx0XHRoYW5kbGVyLmd1aWQgPSBqUXVlcnkuZ3VpZCsrO1xuXHRcdH1cblxuXHRcdC8vIEluaXQgdGhlIGVsZW1lbnQncyBldmVudCBzdHJ1Y3R1cmUgYW5kIG1haW4gaGFuZGxlciwgaWYgdGhpcyBpcyB0aGUgZmlyc3Rcblx0XHRpZiAoICEoIGV2ZW50cyA9IGVsZW1EYXRhLmV2ZW50cyApICkge1xuXHRcdFx0ZXZlbnRzID0gZWxlbURhdGEuZXZlbnRzID0ge307XG5cdFx0fVxuXHRcdGlmICggISggZXZlbnRIYW5kbGUgPSBlbGVtRGF0YS5oYW5kbGUgKSApIHtcblx0XHRcdGV2ZW50SGFuZGxlID0gZWxlbURhdGEuaGFuZGxlID0gZnVuY3Rpb24oIGUgKSB7XG5cblx0XHRcdFx0Ly8gRGlzY2FyZCB0aGUgc2Vjb25kIGV2ZW50IG9mIGEgalF1ZXJ5LmV2ZW50LnRyaWdnZXIoKSBhbmRcblx0XHRcdFx0Ly8gd2hlbiBhbiBldmVudCBpcyBjYWxsZWQgYWZ0ZXIgYSBwYWdlIGhhcyB1bmxvYWRlZFxuXHRcdFx0XHRyZXR1cm4gdHlwZW9mIGpRdWVyeSAhPT0gXCJ1bmRlZmluZWRcIiAmJiBqUXVlcnkuZXZlbnQudHJpZ2dlcmVkICE9PSBlLnR5cGUgP1xuXHRcdFx0XHRcdGpRdWVyeS5ldmVudC5kaXNwYXRjaC5hcHBseSggZWxlbSwgYXJndW1lbnRzICkgOiB1bmRlZmluZWQ7XG5cdFx0XHR9O1xuXHRcdH1cblxuXHRcdC8vIEhhbmRsZSBtdWx0aXBsZSBldmVudHMgc2VwYXJhdGVkIGJ5IGEgc3BhY2Vcblx0XHR0eXBlcyA9ICggdHlwZXMgfHwgXCJcIiApLm1hdGNoKCBybm90d2hpdGUgKSB8fCBbIFwiXCIgXTtcblx0XHR0ID0gdHlwZXMubGVuZ3RoO1xuXHRcdHdoaWxlICggdC0tICkge1xuXHRcdFx0dG1wID0gcnR5cGVuYW1lc3BhY2UuZXhlYyggdHlwZXNbIHQgXSApIHx8IFtdO1xuXHRcdFx0dHlwZSA9IG9yaWdUeXBlID0gdG1wWyAxIF07XG5cdFx0XHRuYW1lc3BhY2VzID0gKCB0bXBbIDIgXSB8fCBcIlwiICkuc3BsaXQoIFwiLlwiICkuc29ydCgpO1xuXG5cdFx0XHQvLyBUaGVyZSAqbXVzdCogYmUgYSB0eXBlLCBubyBhdHRhY2hpbmcgbmFtZXNwYWNlLW9ubHkgaGFuZGxlcnNcblx0XHRcdGlmICggIXR5cGUgKSB7XG5cdFx0XHRcdGNvbnRpbnVlO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBJZiBldmVudCBjaGFuZ2VzIGl0cyB0eXBlLCB1c2UgdGhlIHNwZWNpYWwgZXZlbnQgaGFuZGxlcnMgZm9yIHRoZSBjaGFuZ2VkIHR5cGVcblx0XHRcdHNwZWNpYWwgPSBqUXVlcnkuZXZlbnQuc3BlY2lhbFsgdHlwZSBdIHx8IHt9O1xuXG5cdFx0XHQvLyBJZiBzZWxlY3RvciBkZWZpbmVkLCBkZXRlcm1pbmUgc3BlY2lhbCBldmVudCBhcGkgdHlwZSwgb3RoZXJ3aXNlIGdpdmVuIHR5cGVcblx0XHRcdHR5cGUgPSAoIHNlbGVjdG9yID8gc3BlY2lhbC5kZWxlZ2F0ZVR5cGUgOiBzcGVjaWFsLmJpbmRUeXBlICkgfHwgdHlwZTtcblxuXHRcdFx0Ly8gVXBkYXRlIHNwZWNpYWwgYmFzZWQgb24gbmV3bHkgcmVzZXQgdHlwZVxuXHRcdFx0c3BlY2lhbCA9IGpRdWVyeS5ldmVudC5zcGVjaWFsWyB0eXBlIF0gfHwge307XG5cblx0XHRcdC8vIGhhbmRsZU9iaiBpcyBwYXNzZWQgdG8gYWxsIGV2ZW50IGhhbmRsZXJzXG5cdFx0XHRoYW5kbGVPYmogPSBqUXVlcnkuZXh0ZW5kKCB7XG5cdFx0XHRcdHR5cGU6IHR5cGUsXG5cdFx0XHRcdG9yaWdUeXBlOiBvcmlnVHlwZSxcblx0XHRcdFx0ZGF0YTogZGF0YSxcblx0XHRcdFx0aGFuZGxlcjogaGFuZGxlcixcblx0XHRcdFx0Z3VpZDogaGFuZGxlci5ndWlkLFxuXHRcdFx0XHRzZWxlY3Rvcjogc2VsZWN0b3IsXG5cdFx0XHRcdG5lZWRzQ29udGV4dDogc2VsZWN0b3IgJiYgalF1ZXJ5LmV4cHIubWF0Y2gubmVlZHNDb250ZXh0LnRlc3QoIHNlbGVjdG9yICksXG5cdFx0XHRcdG5hbWVzcGFjZTogbmFtZXNwYWNlcy5qb2luKCBcIi5cIiApXG5cdFx0XHR9LCBoYW5kbGVPYmpJbiApO1xuXG5cdFx0XHQvLyBJbml0IHRoZSBldmVudCBoYW5kbGVyIHF1ZXVlIGlmIHdlJ3JlIHRoZSBmaXJzdFxuXHRcdFx0aWYgKCAhKCBoYW5kbGVycyA9IGV2ZW50c1sgdHlwZSBdICkgKSB7XG5cdFx0XHRcdGhhbmRsZXJzID0gZXZlbnRzWyB0eXBlIF0gPSBbXTtcblx0XHRcdFx0aGFuZGxlcnMuZGVsZWdhdGVDb3VudCA9IDA7XG5cblx0XHRcdFx0Ly8gT25seSB1c2UgYWRkRXZlbnRMaXN0ZW5lciBpZiB0aGUgc3BlY2lhbCBldmVudHMgaGFuZGxlciByZXR1cm5zIGZhbHNlXG5cdFx0XHRcdGlmICggIXNwZWNpYWwuc2V0dXAgfHxcblx0XHRcdFx0XHRzcGVjaWFsLnNldHVwLmNhbGwoIGVsZW0sIGRhdGEsIG5hbWVzcGFjZXMsIGV2ZW50SGFuZGxlICkgPT09IGZhbHNlICkge1xuXG5cdFx0XHRcdFx0aWYgKCBlbGVtLmFkZEV2ZW50TGlzdGVuZXIgKSB7XG5cdFx0XHRcdFx0XHRlbGVtLmFkZEV2ZW50TGlzdGVuZXIoIHR5cGUsIGV2ZW50SGFuZGxlICk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdGlmICggc3BlY2lhbC5hZGQgKSB7XG5cdFx0XHRcdHNwZWNpYWwuYWRkLmNhbGwoIGVsZW0sIGhhbmRsZU9iaiApO1xuXG5cdFx0XHRcdGlmICggIWhhbmRsZU9iai5oYW5kbGVyLmd1aWQgKSB7XG5cdFx0XHRcdFx0aGFuZGxlT2JqLmhhbmRsZXIuZ3VpZCA9IGhhbmRsZXIuZ3VpZDtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHQvLyBBZGQgdG8gdGhlIGVsZW1lbnQncyBoYW5kbGVyIGxpc3QsIGRlbGVnYXRlcyBpbiBmcm9udFxuXHRcdFx0aWYgKCBzZWxlY3RvciApIHtcblx0XHRcdFx0aGFuZGxlcnMuc3BsaWNlKCBoYW5kbGVycy5kZWxlZ2F0ZUNvdW50KyssIDAsIGhhbmRsZU9iaiApO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0aGFuZGxlcnMucHVzaCggaGFuZGxlT2JqICk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIEtlZXAgdHJhY2sgb2Ygd2hpY2ggZXZlbnRzIGhhdmUgZXZlciBiZWVuIHVzZWQsIGZvciBldmVudCBvcHRpbWl6YXRpb25cblx0XHRcdGpRdWVyeS5ldmVudC5nbG9iYWxbIHR5cGUgXSA9IHRydWU7XG5cdFx0fVxuXG5cdH0sXG5cblx0Ly8gRGV0YWNoIGFuIGV2ZW50IG9yIHNldCBvZiBldmVudHMgZnJvbSBhbiBlbGVtZW50XG5cdHJlbW92ZTogZnVuY3Rpb24oIGVsZW0sIHR5cGVzLCBoYW5kbGVyLCBzZWxlY3RvciwgbWFwcGVkVHlwZXMgKSB7XG5cblx0XHR2YXIgaiwgb3JpZ0NvdW50LCB0bXAsXG5cdFx0XHRldmVudHMsIHQsIGhhbmRsZU9iaixcblx0XHRcdHNwZWNpYWwsIGhhbmRsZXJzLCB0eXBlLCBuYW1lc3BhY2VzLCBvcmlnVHlwZSxcblx0XHRcdGVsZW1EYXRhID0gZGF0YVByaXYuaGFzRGF0YSggZWxlbSApICYmIGRhdGFQcml2LmdldCggZWxlbSApO1xuXG5cdFx0aWYgKCAhZWxlbURhdGEgfHwgISggZXZlbnRzID0gZWxlbURhdGEuZXZlbnRzICkgKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Ly8gT25jZSBmb3IgZWFjaCB0eXBlLm5hbWVzcGFjZSBpbiB0eXBlczsgdHlwZSBtYXkgYmUgb21pdHRlZFxuXHRcdHR5cGVzID0gKCB0eXBlcyB8fCBcIlwiICkubWF0Y2goIHJub3R3aGl0ZSApIHx8IFsgXCJcIiBdO1xuXHRcdHQgPSB0eXBlcy5sZW5ndGg7XG5cdFx0d2hpbGUgKCB0LS0gKSB7XG5cdFx0XHR0bXAgPSBydHlwZW5hbWVzcGFjZS5leGVjKCB0eXBlc1sgdCBdICkgfHwgW107XG5cdFx0XHR0eXBlID0gb3JpZ1R5cGUgPSB0bXBbIDEgXTtcblx0XHRcdG5hbWVzcGFjZXMgPSAoIHRtcFsgMiBdIHx8IFwiXCIgKS5zcGxpdCggXCIuXCIgKS5zb3J0KCk7XG5cblx0XHRcdC8vIFVuYmluZCBhbGwgZXZlbnRzIChvbiB0aGlzIG5hbWVzcGFjZSwgaWYgcHJvdmlkZWQpIGZvciB0aGUgZWxlbWVudFxuXHRcdFx0aWYgKCAhdHlwZSApIHtcblx0XHRcdFx0Zm9yICggdHlwZSBpbiBldmVudHMgKSB7XG5cdFx0XHRcdFx0alF1ZXJ5LmV2ZW50LnJlbW92ZSggZWxlbSwgdHlwZSArIHR5cGVzWyB0IF0sIGhhbmRsZXIsIHNlbGVjdG9yLCB0cnVlICk7XG5cdFx0XHRcdH1cblx0XHRcdFx0Y29udGludWU7XG5cdFx0XHR9XG5cblx0XHRcdHNwZWNpYWwgPSBqUXVlcnkuZXZlbnQuc3BlY2lhbFsgdHlwZSBdIHx8IHt9O1xuXHRcdFx0dHlwZSA9ICggc2VsZWN0b3IgPyBzcGVjaWFsLmRlbGVnYXRlVHlwZSA6IHNwZWNpYWwuYmluZFR5cGUgKSB8fCB0eXBlO1xuXHRcdFx0aGFuZGxlcnMgPSBldmVudHNbIHR5cGUgXSB8fCBbXTtcblx0XHRcdHRtcCA9IHRtcFsgMiBdICYmXG5cdFx0XHRcdG5ldyBSZWdFeHAoIFwiKF58XFxcXC4pXCIgKyBuYW1lc3BhY2VzLmpvaW4oIFwiXFxcXC4oPzouKlxcXFwufClcIiApICsgXCIoXFxcXC58JClcIiApO1xuXG5cdFx0XHQvLyBSZW1vdmUgbWF0Y2hpbmcgZXZlbnRzXG5cdFx0XHRvcmlnQ291bnQgPSBqID0gaGFuZGxlcnMubGVuZ3RoO1xuXHRcdFx0d2hpbGUgKCBqLS0gKSB7XG5cdFx0XHRcdGhhbmRsZU9iaiA9IGhhbmRsZXJzWyBqIF07XG5cblx0XHRcdFx0aWYgKCAoIG1hcHBlZFR5cGVzIHx8IG9yaWdUeXBlID09PSBoYW5kbGVPYmoub3JpZ1R5cGUgKSAmJlxuXHRcdFx0XHRcdCggIWhhbmRsZXIgfHwgaGFuZGxlci5ndWlkID09PSBoYW5kbGVPYmouZ3VpZCApICYmXG5cdFx0XHRcdFx0KCAhdG1wIHx8IHRtcC50ZXN0KCBoYW5kbGVPYmoubmFtZXNwYWNlICkgKSAmJlxuXHRcdFx0XHRcdCggIXNlbGVjdG9yIHx8IHNlbGVjdG9yID09PSBoYW5kbGVPYmouc2VsZWN0b3IgfHxcblx0XHRcdFx0XHRcdHNlbGVjdG9yID09PSBcIioqXCIgJiYgaGFuZGxlT2JqLnNlbGVjdG9yICkgKSB7XG5cdFx0XHRcdFx0aGFuZGxlcnMuc3BsaWNlKCBqLCAxICk7XG5cblx0XHRcdFx0XHRpZiAoIGhhbmRsZU9iai5zZWxlY3RvciApIHtcblx0XHRcdFx0XHRcdGhhbmRsZXJzLmRlbGVnYXRlQ291bnQtLTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0aWYgKCBzcGVjaWFsLnJlbW92ZSApIHtcblx0XHRcdFx0XHRcdHNwZWNpYWwucmVtb3ZlLmNhbGwoIGVsZW0sIGhhbmRsZU9iaiApO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHQvLyBSZW1vdmUgZ2VuZXJpYyBldmVudCBoYW5kbGVyIGlmIHdlIHJlbW92ZWQgc29tZXRoaW5nIGFuZCBubyBtb3JlIGhhbmRsZXJzIGV4aXN0XG5cdFx0XHQvLyAoYXZvaWRzIHBvdGVudGlhbCBmb3IgZW5kbGVzcyByZWN1cnNpb24gZHVyaW5nIHJlbW92YWwgb2Ygc3BlY2lhbCBldmVudCBoYW5kbGVycylcblx0XHRcdGlmICggb3JpZ0NvdW50ICYmICFoYW5kbGVycy5sZW5ndGggKSB7XG5cdFx0XHRcdGlmICggIXNwZWNpYWwudGVhcmRvd24gfHxcblx0XHRcdFx0XHRzcGVjaWFsLnRlYXJkb3duLmNhbGwoIGVsZW0sIG5hbWVzcGFjZXMsIGVsZW1EYXRhLmhhbmRsZSApID09PSBmYWxzZSApIHtcblxuXHRcdFx0XHRcdGpRdWVyeS5yZW1vdmVFdmVudCggZWxlbSwgdHlwZSwgZWxlbURhdGEuaGFuZGxlICk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRkZWxldGUgZXZlbnRzWyB0eXBlIF07XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Ly8gUmVtb3ZlIGRhdGEgYW5kIHRoZSBleHBhbmRvIGlmIGl0J3Mgbm8gbG9uZ2VyIHVzZWRcblx0XHRpZiAoIGpRdWVyeS5pc0VtcHR5T2JqZWN0KCBldmVudHMgKSApIHtcblx0XHRcdGRhdGFQcml2LnJlbW92ZSggZWxlbSwgXCJoYW5kbGUgZXZlbnRzXCIgKTtcblx0XHR9XG5cdH0sXG5cblx0ZGlzcGF0Y2g6IGZ1bmN0aW9uKCBldmVudCApIHtcblxuXHRcdC8vIE1ha2UgYSB3cml0YWJsZSBqUXVlcnkuRXZlbnQgZnJvbSB0aGUgbmF0aXZlIGV2ZW50IG9iamVjdFxuXHRcdGV2ZW50ID0galF1ZXJ5LmV2ZW50LmZpeCggZXZlbnQgKTtcblxuXHRcdHZhciBpLCBqLCByZXQsIG1hdGNoZWQsIGhhbmRsZU9iaixcblx0XHRcdGhhbmRsZXJRdWV1ZSA9IFtdLFxuXHRcdFx0YXJncyA9IHNsaWNlLmNhbGwoIGFyZ3VtZW50cyApLFxuXHRcdFx0aGFuZGxlcnMgPSAoIGRhdGFQcml2LmdldCggdGhpcywgXCJldmVudHNcIiApIHx8IHt9IClbIGV2ZW50LnR5cGUgXSB8fCBbXSxcblx0XHRcdHNwZWNpYWwgPSBqUXVlcnkuZXZlbnQuc3BlY2lhbFsgZXZlbnQudHlwZSBdIHx8IHt9O1xuXG5cdFx0Ly8gVXNlIHRoZSBmaXgtZWQgalF1ZXJ5LkV2ZW50IHJhdGhlciB0aGFuIHRoZSAocmVhZC1vbmx5KSBuYXRpdmUgZXZlbnRcblx0XHRhcmdzWyAwIF0gPSBldmVudDtcblx0XHRldmVudC5kZWxlZ2F0ZVRhcmdldCA9IHRoaXM7XG5cblx0XHQvLyBDYWxsIHRoZSBwcmVEaXNwYXRjaCBob29rIGZvciB0aGUgbWFwcGVkIHR5cGUsIGFuZCBsZXQgaXQgYmFpbCBpZiBkZXNpcmVkXG5cdFx0aWYgKCBzcGVjaWFsLnByZURpc3BhdGNoICYmIHNwZWNpYWwucHJlRGlzcGF0Y2guY2FsbCggdGhpcywgZXZlbnQgKSA9PT0gZmFsc2UgKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0Ly8gRGV0ZXJtaW5lIGhhbmRsZXJzXG5cdFx0aGFuZGxlclF1ZXVlID0galF1ZXJ5LmV2ZW50LmhhbmRsZXJzLmNhbGwoIHRoaXMsIGV2ZW50LCBoYW5kbGVycyApO1xuXG5cdFx0Ly8gUnVuIGRlbGVnYXRlcyBmaXJzdDsgdGhleSBtYXkgd2FudCB0byBzdG9wIHByb3BhZ2F0aW9uIGJlbmVhdGggdXNcblx0XHRpID0gMDtcblx0XHR3aGlsZSAoICggbWF0Y2hlZCA9IGhhbmRsZXJRdWV1ZVsgaSsrIF0gKSAmJiAhZXZlbnQuaXNQcm9wYWdhdGlvblN0b3BwZWQoKSApIHtcblx0XHRcdGV2ZW50LmN1cnJlbnRUYXJnZXQgPSBtYXRjaGVkLmVsZW07XG5cblx0XHRcdGogPSAwO1xuXHRcdFx0d2hpbGUgKCAoIGhhbmRsZU9iaiA9IG1hdGNoZWQuaGFuZGxlcnNbIGorKyBdICkgJiZcblx0XHRcdFx0IWV2ZW50LmlzSW1tZWRpYXRlUHJvcGFnYXRpb25TdG9wcGVkKCkgKSB7XG5cblx0XHRcdFx0Ly8gVHJpZ2dlcmVkIGV2ZW50IG11c3QgZWl0aGVyIDEpIGhhdmUgbm8gbmFtZXNwYWNlLCBvciAyKSBoYXZlIG5hbWVzcGFjZShzKVxuXHRcdFx0XHQvLyBhIHN1YnNldCBvciBlcXVhbCB0byB0aG9zZSBpbiB0aGUgYm91bmQgZXZlbnQgKGJvdGggY2FuIGhhdmUgbm8gbmFtZXNwYWNlKS5cblx0XHRcdFx0aWYgKCAhZXZlbnQucm5hbWVzcGFjZSB8fCBldmVudC5ybmFtZXNwYWNlLnRlc3QoIGhhbmRsZU9iai5uYW1lc3BhY2UgKSApIHtcblxuXHRcdFx0XHRcdGV2ZW50LmhhbmRsZU9iaiA9IGhhbmRsZU9iajtcblx0XHRcdFx0XHRldmVudC5kYXRhID0gaGFuZGxlT2JqLmRhdGE7XG5cblx0XHRcdFx0XHRyZXQgPSAoICggalF1ZXJ5LmV2ZW50LnNwZWNpYWxbIGhhbmRsZU9iai5vcmlnVHlwZSBdIHx8IHt9ICkuaGFuZGxlIHx8XG5cdFx0XHRcdFx0XHRoYW5kbGVPYmouaGFuZGxlciApLmFwcGx5KCBtYXRjaGVkLmVsZW0sIGFyZ3MgKTtcblxuXHRcdFx0XHRcdGlmICggcmV0ICE9PSB1bmRlZmluZWQgKSB7XG5cdFx0XHRcdFx0XHRpZiAoICggZXZlbnQucmVzdWx0ID0gcmV0ICkgPT09IGZhbHNlICkge1xuXHRcdFx0XHRcdFx0XHRldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXHRcdFx0XHRcdFx0XHRldmVudC5zdG9wUHJvcGFnYXRpb24oKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyBDYWxsIHRoZSBwb3N0RGlzcGF0Y2ggaG9vayBmb3IgdGhlIG1hcHBlZCB0eXBlXG5cdFx0aWYgKCBzcGVjaWFsLnBvc3REaXNwYXRjaCApIHtcblx0XHRcdHNwZWNpYWwucG9zdERpc3BhdGNoLmNhbGwoIHRoaXMsIGV2ZW50ICk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGV2ZW50LnJlc3VsdDtcblx0fSxcblxuXHRoYW5kbGVyczogZnVuY3Rpb24oIGV2ZW50LCBoYW5kbGVycyApIHtcblx0XHR2YXIgaSwgbWF0Y2hlcywgc2VsLCBoYW5kbGVPYmosXG5cdFx0XHRoYW5kbGVyUXVldWUgPSBbXSxcblx0XHRcdGRlbGVnYXRlQ291bnQgPSBoYW5kbGVycy5kZWxlZ2F0ZUNvdW50LFxuXHRcdFx0Y3VyID0gZXZlbnQudGFyZ2V0O1xuXG5cdFx0Ly8gU3VwcG9ydCAoYXQgbGVhc3QpOiBDaHJvbWUsIElFOVxuXHRcdC8vIEZpbmQgZGVsZWdhdGUgaGFuZGxlcnNcblx0XHQvLyBCbGFjay1ob2xlIFNWRyA8dXNlPiBpbnN0YW5jZSB0cmVlcyAoIzEzMTgwKVxuXHRcdC8vXG5cdFx0Ly8gU3VwcG9ydDogRmlyZWZveDw9NDIrXG5cdFx0Ly8gQXZvaWQgbm9uLWxlZnQtY2xpY2sgaW4gRkYgYnV0IGRvbid0IGJsb2NrIElFIHJhZGlvIGV2ZW50cyAoIzM4NjEsIGdoLTIzNDMpXG5cdFx0aWYgKCBkZWxlZ2F0ZUNvdW50ICYmIGN1ci5ub2RlVHlwZSAmJlxuXHRcdFx0KCBldmVudC50eXBlICE9PSBcImNsaWNrXCIgfHwgaXNOYU4oIGV2ZW50LmJ1dHRvbiApIHx8IGV2ZW50LmJ1dHRvbiA8IDEgKSApIHtcblxuXHRcdFx0Zm9yICggOyBjdXIgIT09IHRoaXM7IGN1ciA9IGN1ci5wYXJlbnROb2RlIHx8IHRoaXMgKSB7XG5cblx0XHRcdFx0Ly8gRG9uJ3QgY2hlY2sgbm9uLWVsZW1lbnRzICgjMTMyMDgpXG5cdFx0XHRcdC8vIERvbid0IHByb2Nlc3MgY2xpY2tzIG9uIGRpc2FibGVkIGVsZW1lbnRzICgjNjkxMSwgIzgxNjUsICMxMTM4MiwgIzExNzY0KVxuXHRcdFx0XHRpZiAoIGN1ci5ub2RlVHlwZSA9PT0gMSAmJiAoIGN1ci5kaXNhYmxlZCAhPT0gdHJ1ZSB8fCBldmVudC50eXBlICE9PSBcImNsaWNrXCIgKSApIHtcblx0XHRcdFx0XHRtYXRjaGVzID0gW107XG5cdFx0XHRcdFx0Zm9yICggaSA9IDA7IGkgPCBkZWxlZ2F0ZUNvdW50OyBpKysgKSB7XG5cdFx0XHRcdFx0XHRoYW5kbGVPYmogPSBoYW5kbGVyc1sgaSBdO1xuXG5cdFx0XHRcdFx0XHQvLyBEb24ndCBjb25mbGljdCB3aXRoIE9iamVjdC5wcm90b3R5cGUgcHJvcGVydGllcyAoIzEzMjAzKVxuXHRcdFx0XHRcdFx0c2VsID0gaGFuZGxlT2JqLnNlbGVjdG9yICsgXCIgXCI7XG5cblx0XHRcdFx0XHRcdGlmICggbWF0Y2hlc1sgc2VsIF0gPT09IHVuZGVmaW5lZCApIHtcblx0XHRcdFx0XHRcdFx0bWF0Y2hlc1sgc2VsIF0gPSBoYW5kbGVPYmoubmVlZHNDb250ZXh0ID9cblx0XHRcdFx0XHRcdFx0XHRqUXVlcnkoIHNlbCwgdGhpcyApLmluZGV4KCBjdXIgKSA+IC0xIDpcblx0XHRcdFx0XHRcdFx0XHRqUXVlcnkuZmluZCggc2VsLCB0aGlzLCBudWxsLCBbIGN1ciBdICkubGVuZ3RoO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0aWYgKCBtYXRjaGVzWyBzZWwgXSApIHtcblx0XHRcdFx0XHRcdFx0bWF0Y2hlcy5wdXNoKCBoYW5kbGVPYmogKTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0aWYgKCBtYXRjaGVzLmxlbmd0aCApIHtcblx0XHRcdFx0XHRcdGhhbmRsZXJRdWV1ZS5wdXNoKCB7IGVsZW06IGN1ciwgaGFuZGxlcnM6IG1hdGNoZXMgfSApO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vIEFkZCB0aGUgcmVtYWluaW5nIChkaXJlY3RseS1ib3VuZCkgaGFuZGxlcnNcblx0XHRpZiAoIGRlbGVnYXRlQ291bnQgPCBoYW5kbGVycy5sZW5ndGggKSB7XG5cdFx0XHRoYW5kbGVyUXVldWUucHVzaCggeyBlbGVtOiB0aGlzLCBoYW5kbGVyczogaGFuZGxlcnMuc2xpY2UoIGRlbGVnYXRlQ291bnQgKSB9ICk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGhhbmRsZXJRdWV1ZTtcblx0fSxcblxuXHQvLyBJbmNsdWRlcyBzb21lIGV2ZW50IHByb3BzIHNoYXJlZCBieSBLZXlFdmVudCBhbmQgTW91c2VFdmVudFxuXHRwcm9wczogKCBcImFsdEtleSBidWJibGVzIGNhbmNlbGFibGUgY3RybEtleSBjdXJyZW50VGFyZ2V0IGRldGFpbCBldmVudFBoYXNlIFwiICtcblx0XHRcIm1ldGFLZXkgcmVsYXRlZFRhcmdldCBzaGlmdEtleSB0YXJnZXQgdGltZVN0YW1wIHZpZXcgd2hpY2hcIiApLnNwbGl0KCBcIiBcIiApLFxuXG5cdGZpeEhvb2tzOiB7fSxcblxuXHRrZXlIb29rczoge1xuXHRcdHByb3BzOiBcImNoYXIgY2hhckNvZGUga2V5IGtleUNvZGVcIi5zcGxpdCggXCIgXCIgKSxcblx0XHRmaWx0ZXI6IGZ1bmN0aW9uKCBldmVudCwgb3JpZ2luYWwgKSB7XG5cblx0XHRcdC8vIEFkZCB3aGljaCBmb3Iga2V5IGV2ZW50c1xuXHRcdFx0aWYgKCBldmVudC53aGljaCA9PSBudWxsICkge1xuXHRcdFx0XHRldmVudC53aGljaCA9IG9yaWdpbmFsLmNoYXJDb2RlICE9IG51bGwgPyBvcmlnaW5hbC5jaGFyQ29kZSA6IG9yaWdpbmFsLmtleUNvZGU7XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiBldmVudDtcblx0XHR9XG5cdH0sXG5cblx0bW91c2VIb29rczoge1xuXHRcdHByb3BzOiAoIFwiYnV0dG9uIGJ1dHRvbnMgY2xpZW50WCBjbGllbnRZIG9mZnNldFggb2Zmc2V0WSBwYWdlWCBwYWdlWSBcIiArXG5cdFx0XHRcInNjcmVlblggc2NyZWVuWSB0b0VsZW1lbnRcIiApLnNwbGl0KCBcIiBcIiApLFxuXHRcdGZpbHRlcjogZnVuY3Rpb24oIGV2ZW50LCBvcmlnaW5hbCApIHtcblx0XHRcdHZhciBldmVudERvYywgZG9jLCBib2R5LFxuXHRcdFx0XHRidXR0b24gPSBvcmlnaW5hbC5idXR0b247XG5cblx0XHRcdC8vIENhbGN1bGF0ZSBwYWdlWC9ZIGlmIG1pc3NpbmcgYW5kIGNsaWVudFgvWSBhdmFpbGFibGVcblx0XHRcdGlmICggZXZlbnQucGFnZVggPT0gbnVsbCAmJiBvcmlnaW5hbC5jbGllbnRYICE9IG51bGwgKSB7XG5cdFx0XHRcdGV2ZW50RG9jID0gZXZlbnQudGFyZ2V0Lm93bmVyRG9jdW1lbnQgfHwgZG9jdW1lbnQ7XG5cdFx0XHRcdGRvYyA9IGV2ZW50RG9jLmRvY3VtZW50RWxlbWVudDtcblx0XHRcdFx0Ym9keSA9IGV2ZW50RG9jLmJvZHk7XG5cblx0XHRcdFx0ZXZlbnQucGFnZVggPSBvcmlnaW5hbC5jbGllbnRYICtcblx0XHRcdFx0XHQoIGRvYyAmJiBkb2Muc2Nyb2xsTGVmdCB8fCBib2R5ICYmIGJvZHkuc2Nyb2xsTGVmdCB8fCAwICkgLVxuXHRcdFx0XHRcdCggZG9jICYmIGRvYy5jbGllbnRMZWZ0IHx8IGJvZHkgJiYgYm9keS5jbGllbnRMZWZ0IHx8IDAgKTtcblx0XHRcdFx0ZXZlbnQucGFnZVkgPSBvcmlnaW5hbC5jbGllbnRZICtcblx0XHRcdFx0XHQoIGRvYyAmJiBkb2Muc2Nyb2xsVG9wICB8fCBib2R5ICYmIGJvZHkuc2Nyb2xsVG9wICB8fCAwICkgLVxuXHRcdFx0XHRcdCggZG9jICYmIGRvYy5jbGllbnRUb3AgIHx8IGJvZHkgJiYgYm9keS5jbGllbnRUb3AgIHx8IDAgKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gQWRkIHdoaWNoIGZvciBjbGljazogMSA9PT0gbGVmdDsgMiA9PT0gbWlkZGxlOyAzID09PSByaWdodFxuXHRcdFx0Ly8gTm90ZTogYnV0dG9uIGlzIG5vdCBub3JtYWxpemVkLCBzbyBkb24ndCB1c2UgaXRcblx0XHRcdGlmICggIWV2ZW50LndoaWNoICYmIGJ1dHRvbiAhPT0gdW5kZWZpbmVkICkge1xuXHRcdFx0XHRldmVudC53aGljaCA9ICggYnV0dG9uICYgMSA/IDEgOiAoIGJ1dHRvbiAmIDIgPyAzIDogKCBidXR0b24gJiA0ID8gMiA6IDAgKSApICk7XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiBldmVudDtcblx0XHR9XG5cdH0sXG5cblx0Zml4OiBmdW5jdGlvbiggZXZlbnQgKSB7XG5cdFx0aWYgKCBldmVudFsgalF1ZXJ5LmV4cGFuZG8gXSApIHtcblx0XHRcdHJldHVybiBldmVudDtcblx0XHR9XG5cblx0XHQvLyBDcmVhdGUgYSB3cml0YWJsZSBjb3B5IG9mIHRoZSBldmVudCBvYmplY3QgYW5kIG5vcm1hbGl6ZSBzb21lIHByb3BlcnRpZXNcblx0XHR2YXIgaSwgcHJvcCwgY29weSxcblx0XHRcdHR5cGUgPSBldmVudC50eXBlLFxuXHRcdFx0b3JpZ2luYWxFdmVudCA9IGV2ZW50LFxuXHRcdFx0Zml4SG9vayA9IHRoaXMuZml4SG9va3NbIHR5cGUgXTtcblxuXHRcdGlmICggIWZpeEhvb2sgKSB7XG5cdFx0XHR0aGlzLmZpeEhvb2tzWyB0eXBlIF0gPSBmaXhIb29rID1cblx0XHRcdFx0cm1vdXNlRXZlbnQudGVzdCggdHlwZSApID8gdGhpcy5tb3VzZUhvb2tzIDpcblx0XHRcdFx0cmtleUV2ZW50LnRlc3QoIHR5cGUgKSA/IHRoaXMua2V5SG9va3MgOlxuXHRcdFx0XHR7fTtcblx0XHR9XG5cdFx0Y29weSA9IGZpeEhvb2sucHJvcHMgPyB0aGlzLnByb3BzLmNvbmNhdCggZml4SG9vay5wcm9wcyApIDogdGhpcy5wcm9wcztcblxuXHRcdGV2ZW50ID0gbmV3IGpRdWVyeS5FdmVudCggb3JpZ2luYWxFdmVudCApO1xuXG5cdFx0aSA9IGNvcHkubGVuZ3RoO1xuXHRcdHdoaWxlICggaS0tICkge1xuXHRcdFx0cHJvcCA9IGNvcHlbIGkgXTtcblx0XHRcdGV2ZW50WyBwcm9wIF0gPSBvcmlnaW5hbEV2ZW50WyBwcm9wIF07XG5cdFx0fVxuXG5cdFx0Ly8gU3VwcG9ydDogQ29yZG92YSAyLjUgKFdlYktpdCkgKCMxMzI1NSlcblx0XHQvLyBBbGwgZXZlbnRzIHNob3VsZCBoYXZlIGEgdGFyZ2V0OyBDb3Jkb3ZhIGRldmljZXJlYWR5IGRvZXNuJ3Rcblx0XHRpZiAoICFldmVudC50YXJnZXQgKSB7XG5cdFx0XHRldmVudC50YXJnZXQgPSBkb2N1bWVudDtcblx0XHR9XG5cblx0XHQvLyBTdXBwb3J0OiBTYWZhcmkgNi4wKywgQ2hyb21lPDI4XG5cdFx0Ly8gVGFyZ2V0IHNob3VsZCBub3QgYmUgYSB0ZXh0IG5vZGUgKCM1MDQsICMxMzE0Mylcblx0XHRpZiAoIGV2ZW50LnRhcmdldC5ub2RlVHlwZSA9PT0gMyApIHtcblx0XHRcdGV2ZW50LnRhcmdldCA9IGV2ZW50LnRhcmdldC5wYXJlbnROb2RlO1xuXHRcdH1cblxuXHRcdHJldHVybiBmaXhIb29rLmZpbHRlciA/IGZpeEhvb2suZmlsdGVyKCBldmVudCwgb3JpZ2luYWxFdmVudCApIDogZXZlbnQ7XG5cdH0sXG5cblx0c3BlY2lhbDoge1xuXHRcdGxvYWQ6IHtcblxuXHRcdFx0Ly8gUHJldmVudCB0cmlnZ2VyZWQgaW1hZ2UubG9hZCBldmVudHMgZnJvbSBidWJibGluZyB0byB3aW5kb3cubG9hZFxuXHRcdFx0bm9CdWJibGU6IHRydWVcblx0XHR9LFxuXHRcdGZvY3VzOiB7XG5cblx0XHRcdC8vIEZpcmUgbmF0aXZlIGV2ZW50IGlmIHBvc3NpYmxlIHNvIGJsdXIvZm9jdXMgc2VxdWVuY2UgaXMgY29ycmVjdFxuXHRcdFx0dHJpZ2dlcjogZnVuY3Rpb24oKSB7XG5cdFx0XHRcdGlmICggdGhpcyAhPT0gc2FmZUFjdGl2ZUVsZW1lbnQoKSAmJiB0aGlzLmZvY3VzICkge1xuXHRcdFx0XHRcdHRoaXMuZm9jdXMoKTtcblx0XHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHRcdH1cblx0XHRcdH0sXG5cdFx0XHRkZWxlZ2F0ZVR5cGU6IFwiZm9jdXNpblwiXG5cdFx0fSxcblx0XHRibHVyOiB7XG5cdFx0XHR0cmlnZ2VyOiBmdW5jdGlvbigpIHtcblx0XHRcdFx0aWYgKCB0aGlzID09PSBzYWZlQWN0aXZlRWxlbWVudCgpICYmIHRoaXMuYmx1ciApIHtcblx0XHRcdFx0XHR0aGlzLmJsdXIoKTtcblx0XHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHRcdH1cblx0XHRcdH0sXG5cdFx0XHRkZWxlZ2F0ZVR5cGU6IFwiZm9jdXNvdXRcIlxuXHRcdH0sXG5cdFx0Y2xpY2s6IHtcblxuXHRcdFx0Ly8gRm9yIGNoZWNrYm94LCBmaXJlIG5hdGl2ZSBldmVudCBzbyBjaGVja2VkIHN0YXRlIHdpbGwgYmUgcmlnaHRcblx0XHRcdHRyaWdnZXI6IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRpZiAoIHRoaXMudHlwZSA9PT0gXCJjaGVja2JveFwiICYmIHRoaXMuY2xpY2sgJiYgalF1ZXJ5Lm5vZGVOYW1lKCB0aGlzLCBcImlucHV0XCIgKSApIHtcblx0XHRcdFx0XHR0aGlzLmNsaWNrKCk7XG5cdFx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0XHR9XG5cdFx0XHR9LFxuXG5cdFx0XHQvLyBGb3IgY3Jvc3MtYnJvd3NlciBjb25zaXN0ZW5jeSwgZG9uJ3QgZmlyZSBuYXRpdmUgLmNsaWNrKCkgb24gbGlua3Ncblx0XHRcdF9kZWZhdWx0OiBmdW5jdGlvbiggZXZlbnQgKSB7XG5cdFx0XHRcdHJldHVybiBqUXVlcnkubm9kZU5hbWUoIGV2ZW50LnRhcmdldCwgXCJhXCIgKTtcblx0XHRcdH1cblx0XHR9LFxuXG5cdFx0YmVmb3JldW5sb2FkOiB7XG5cdFx0XHRwb3N0RGlzcGF0Y2g6IGZ1bmN0aW9uKCBldmVudCApIHtcblxuXHRcdFx0XHQvLyBTdXBwb3J0OiBGaXJlZm94IDIwK1xuXHRcdFx0XHQvLyBGaXJlZm94IGRvZXNuJ3QgYWxlcnQgaWYgdGhlIHJldHVyblZhbHVlIGZpZWxkIGlzIG5vdCBzZXQuXG5cdFx0XHRcdGlmICggZXZlbnQucmVzdWx0ICE9PSB1bmRlZmluZWQgJiYgZXZlbnQub3JpZ2luYWxFdmVudCApIHtcblx0XHRcdFx0XHRldmVudC5vcmlnaW5hbEV2ZW50LnJldHVyblZhbHVlID0gZXZlbnQucmVzdWx0O1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG59O1xuXG5qUXVlcnkucmVtb3ZlRXZlbnQgPSBmdW5jdGlvbiggZWxlbSwgdHlwZSwgaGFuZGxlICkge1xuXG5cdC8vIFRoaXMgXCJpZlwiIGlzIG5lZWRlZCBmb3IgcGxhaW4gb2JqZWN0c1xuXHRpZiAoIGVsZW0ucmVtb3ZlRXZlbnRMaXN0ZW5lciApIHtcblx0XHRlbGVtLnJlbW92ZUV2ZW50TGlzdGVuZXIoIHR5cGUsIGhhbmRsZSApO1xuXHR9XG59O1xuXG5qUXVlcnkuRXZlbnQgPSBmdW5jdGlvbiggc3JjLCBwcm9wcyApIHtcblxuXHQvLyBBbGxvdyBpbnN0YW50aWF0aW9uIHdpdGhvdXQgdGhlICduZXcnIGtleXdvcmRcblx0aWYgKCAhKCB0aGlzIGluc3RhbmNlb2YgalF1ZXJ5LkV2ZW50ICkgKSB7XG5cdFx0cmV0dXJuIG5ldyBqUXVlcnkuRXZlbnQoIHNyYywgcHJvcHMgKTtcblx0fVxuXG5cdC8vIEV2ZW50IG9iamVjdFxuXHRpZiAoIHNyYyAmJiBzcmMudHlwZSApIHtcblx0XHR0aGlzLm9yaWdpbmFsRXZlbnQgPSBzcmM7XG5cdFx0dGhpcy50eXBlID0gc3JjLnR5cGU7XG5cblx0XHQvLyBFdmVudHMgYnViYmxpbmcgdXAgdGhlIGRvY3VtZW50IG1heSBoYXZlIGJlZW4gbWFya2VkIGFzIHByZXZlbnRlZFxuXHRcdC8vIGJ5IGEgaGFuZGxlciBsb3dlciBkb3duIHRoZSB0cmVlOyByZWZsZWN0IHRoZSBjb3JyZWN0IHZhbHVlLlxuXHRcdHRoaXMuaXNEZWZhdWx0UHJldmVudGVkID0gc3JjLmRlZmF1bHRQcmV2ZW50ZWQgfHxcblx0XHRcdFx0c3JjLmRlZmF1bHRQcmV2ZW50ZWQgPT09IHVuZGVmaW5lZCAmJlxuXG5cdFx0XHRcdC8vIFN1cHBvcnQ6IEFuZHJvaWQ8NC4wXG5cdFx0XHRcdHNyYy5yZXR1cm5WYWx1ZSA9PT0gZmFsc2UgP1xuXHRcdFx0cmV0dXJuVHJ1ZSA6XG5cdFx0XHRyZXR1cm5GYWxzZTtcblxuXHQvLyBFdmVudCB0eXBlXG5cdH0gZWxzZSB7XG5cdFx0dGhpcy50eXBlID0gc3JjO1xuXHR9XG5cblx0Ly8gUHV0IGV4cGxpY2l0bHkgcHJvdmlkZWQgcHJvcGVydGllcyBvbnRvIHRoZSBldmVudCBvYmplY3Rcblx0aWYgKCBwcm9wcyApIHtcblx0XHRqUXVlcnkuZXh0ZW5kKCB0aGlzLCBwcm9wcyApO1xuXHR9XG5cblx0Ly8gQ3JlYXRlIGEgdGltZXN0YW1wIGlmIGluY29taW5nIGV2ZW50IGRvZXNuJ3QgaGF2ZSBvbmVcblx0dGhpcy50aW1lU3RhbXAgPSBzcmMgJiYgc3JjLnRpbWVTdGFtcCB8fCBqUXVlcnkubm93KCk7XG5cblx0Ly8gTWFyayBpdCBhcyBmaXhlZFxuXHR0aGlzWyBqUXVlcnkuZXhwYW5kbyBdID0gdHJ1ZTtcbn07XG5cbi8vIGpRdWVyeS5FdmVudCBpcyBiYXNlZCBvbiBET00zIEV2ZW50cyBhcyBzcGVjaWZpZWQgYnkgdGhlIEVDTUFTY3JpcHQgTGFuZ3VhZ2UgQmluZGluZ1xuLy8gaHR0cDovL3d3dy53My5vcmcvVFIvMjAwMy9XRC1ET00tTGV2ZWwtMy1FdmVudHMtMjAwMzAzMzEvZWNtYS1zY3JpcHQtYmluZGluZy5odG1sXG5qUXVlcnkuRXZlbnQucHJvdG90eXBlID0ge1xuXHRjb25zdHJ1Y3RvcjogalF1ZXJ5LkV2ZW50LFxuXHRpc0RlZmF1bHRQcmV2ZW50ZWQ6IHJldHVybkZhbHNlLFxuXHRpc1Byb3BhZ2F0aW9uU3RvcHBlZDogcmV0dXJuRmFsc2UsXG5cdGlzSW1tZWRpYXRlUHJvcGFnYXRpb25TdG9wcGVkOiByZXR1cm5GYWxzZSxcblx0aXNTaW11bGF0ZWQ6IGZhbHNlLFxuXG5cdHByZXZlbnREZWZhdWx0OiBmdW5jdGlvbigpIHtcblx0XHR2YXIgZSA9IHRoaXMub3JpZ2luYWxFdmVudDtcblxuXHRcdHRoaXMuaXNEZWZhdWx0UHJldmVudGVkID0gcmV0dXJuVHJ1ZTtcblxuXHRcdGlmICggZSAmJiAhdGhpcy5pc1NpbXVsYXRlZCApIHtcblx0XHRcdGUucHJldmVudERlZmF1bHQoKTtcblx0XHR9XG5cdH0sXG5cdHN0b3BQcm9wYWdhdGlvbjogZnVuY3Rpb24oKSB7XG5cdFx0dmFyIGUgPSB0aGlzLm9yaWdpbmFsRXZlbnQ7XG5cblx0XHR0aGlzLmlzUHJvcGFnYXRpb25TdG9wcGVkID0gcmV0dXJuVHJ1ZTtcblxuXHRcdGlmICggZSAmJiAhdGhpcy5pc1NpbXVsYXRlZCApIHtcblx0XHRcdGUuc3RvcFByb3BhZ2F0aW9uKCk7XG5cdFx0fVxuXHR9LFxuXHRzdG9wSW1tZWRpYXRlUHJvcGFnYXRpb246IGZ1bmN0aW9uKCkge1xuXHRcdHZhciBlID0gdGhpcy5vcmlnaW5hbEV2ZW50O1xuXG5cdFx0dGhpcy5pc0ltbWVkaWF0ZVByb3BhZ2F0aW9uU3RvcHBlZCA9IHJldHVyblRydWU7XG5cblx0XHRpZiAoIGUgJiYgIXRoaXMuaXNTaW11bGF0ZWQgKSB7XG5cdFx0XHRlLnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpO1xuXHRcdH1cblxuXHRcdHRoaXMuc3RvcFByb3BhZ2F0aW9uKCk7XG5cdH1cbn07XG5cbi8vIENyZWF0ZSBtb3VzZWVudGVyL2xlYXZlIGV2ZW50cyB1c2luZyBtb3VzZW92ZXIvb3V0IGFuZCBldmVudC10aW1lIGNoZWNrc1xuLy8gc28gdGhhdCBldmVudCBkZWxlZ2F0aW9uIHdvcmtzIGluIGpRdWVyeS5cbi8vIERvIHRoZSBzYW1lIGZvciBwb2ludGVyZW50ZXIvcG9pbnRlcmxlYXZlIGFuZCBwb2ludGVyb3Zlci9wb2ludGVyb3V0XG4vL1xuLy8gU3VwcG9ydDogU2FmYXJpIDcgb25seVxuLy8gU2FmYXJpIHNlbmRzIG1vdXNlZW50ZXIgdG9vIG9mdGVuOyBzZWU6XG4vLyBodHRwczovL2NvZGUuZ29vZ2xlLmNvbS9wL2Nocm9taXVtL2lzc3Vlcy9kZXRhaWw/aWQ9NDcwMjU4XG4vLyBmb3IgdGhlIGRlc2NyaXB0aW9uIG9mIHRoZSBidWcgKGl0IGV4aXN0ZWQgaW4gb2xkZXIgQ2hyb21lIHZlcnNpb25zIGFzIHdlbGwpLlxualF1ZXJ5LmVhY2goIHtcblx0bW91c2VlbnRlcjogXCJtb3VzZW92ZXJcIixcblx0bW91c2VsZWF2ZTogXCJtb3VzZW91dFwiLFxuXHRwb2ludGVyZW50ZXI6IFwicG9pbnRlcm92ZXJcIixcblx0cG9pbnRlcmxlYXZlOiBcInBvaW50ZXJvdXRcIlxufSwgZnVuY3Rpb24oIG9yaWcsIGZpeCApIHtcblx0alF1ZXJ5LmV2ZW50LnNwZWNpYWxbIG9yaWcgXSA9IHtcblx0XHRkZWxlZ2F0ZVR5cGU6IGZpeCxcblx0XHRiaW5kVHlwZTogZml4LFxuXG5cdFx0aGFuZGxlOiBmdW5jdGlvbiggZXZlbnQgKSB7XG5cdFx0XHR2YXIgcmV0LFxuXHRcdFx0XHR0YXJnZXQgPSB0aGlzLFxuXHRcdFx0XHRyZWxhdGVkID0gZXZlbnQucmVsYXRlZFRhcmdldCxcblx0XHRcdFx0aGFuZGxlT2JqID0gZXZlbnQuaGFuZGxlT2JqO1xuXG5cdFx0XHQvLyBGb3IgbW91c2VlbnRlci9sZWF2ZSBjYWxsIHRoZSBoYW5kbGVyIGlmIHJlbGF0ZWQgaXMgb3V0c2lkZSB0aGUgdGFyZ2V0LlxuXHRcdFx0Ly8gTkI6IE5vIHJlbGF0ZWRUYXJnZXQgaWYgdGhlIG1vdXNlIGxlZnQvZW50ZXJlZCB0aGUgYnJvd3NlciB3aW5kb3dcblx0XHRcdGlmICggIXJlbGF0ZWQgfHwgKCByZWxhdGVkICE9PSB0YXJnZXQgJiYgIWpRdWVyeS5jb250YWlucyggdGFyZ2V0LCByZWxhdGVkICkgKSApIHtcblx0XHRcdFx0ZXZlbnQudHlwZSA9IGhhbmRsZU9iai5vcmlnVHlwZTtcblx0XHRcdFx0cmV0ID0gaGFuZGxlT2JqLmhhbmRsZXIuYXBwbHkoIHRoaXMsIGFyZ3VtZW50cyApO1xuXHRcdFx0XHRldmVudC50eXBlID0gZml4O1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIHJldDtcblx0XHR9XG5cdH07XG59ICk7XG5cbmpRdWVyeS5mbi5leHRlbmQoIHtcblx0b246IGZ1bmN0aW9uKCB0eXBlcywgc2VsZWN0b3IsIGRhdGEsIGZuICkge1xuXHRcdHJldHVybiBvbiggdGhpcywgdHlwZXMsIHNlbGVjdG9yLCBkYXRhLCBmbiApO1xuXHR9LFxuXHRvbmU6IGZ1bmN0aW9uKCB0eXBlcywgc2VsZWN0b3IsIGRhdGEsIGZuICkge1xuXHRcdHJldHVybiBvbiggdGhpcywgdHlwZXMsIHNlbGVjdG9yLCBkYXRhLCBmbiwgMSApO1xuXHR9LFxuXHRvZmY6IGZ1bmN0aW9uKCB0eXBlcywgc2VsZWN0b3IsIGZuICkge1xuXHRcdHZhciBoYW5kbGVPYmosIHR5cGU7XG5cdFx0aWYgKCB0eXBlcyAmJiB0eXBlcy5wcmV2ZW50RGVmYXVsdCAmJiB0eXBlcy5oYW5kbGVPYmogKSB7XG5cblx0XHRcdC8vICggZXZlbnQgKSAgZGlzcGF0Y2hlZCBqUXVlcnkuRXZlbnRcblx0XHRcdGhhbmRsZU9iaiA9IHR5cGVzLmhhbmRsZU9iajtcblx0XHRcdGpRdWVyeSggdHlwZXMuZGVsZWdhdGVUYXJnZXQgKS5vZmYoXG5cdFx0XHRcdGhhbmRsZU9iai5uYW1lc3BhY2UgP1xuXHRcdFx0XHRcdGhhbmRsZU9iai5vcmlnVHlwZSArIFwiLlwiICsgaGFuZGxlT2JqLm5hbWVzcGFjZSA6XG5cdFx0XHRcdFx0aGFuZGxlT2JqLm9yaWdUeXBlLFxuXHRcdFx0XHRoYW5kbGVPYmouc2VsZWN0b3IsXG5cdFx0XHRcdGhhbmRsZU9iai5oYW5kbGVyXG5cdFx0XHQpO1xuXHRcdFx0cmV0dXJuIHRoaXM7XG5cdFx0fVxuXHRcdGlmICggdHlwZW9mIHR5cGVzID09PSBcIm9iamVjdFwiICkge1xuXG5cdFx0XHQvLyAoIHR5cGVzLW9iamVjdCBbLCBzZWxlY3Rvcl0gKVxuXHRcdFx0Zm9yICggdHlwZSBpbiB0eXBlcyApIHtcblx0XHRcdFx0dGhpcy5vZmYoIHR5cGUsIHNlbGVjdG9yLCB0eXBlc1sgdHlwZSBdICk7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gdGhpcztcblx0XHR9XG5cdFx0aWYgKCBzZWxlY3RvciA9PT0gZmFsc2UgfHwgdHlwZW9mIHNlbGVjdG9yID09PSBcImZ1bmN0aW9uXCIgKSB7XG5cblx0XHRcdC8vICggdHlwZXMgWywgZm5dIClcblx0XHRcdGZuID0gc2VsZWN0b3I7XG5cdFx0XHRzZWxlY3RvciA9IHVuZGVmaW5lZDtcblx0XHR9XG5cdFx0aWYgKCBmbiA9PT0gZmFsc2UgKSB7XG5cdFx0XHRmbiA9IHJldHVybkZhbHNlO1xuXHRcdH1cblx0XHRyZXR1cm4gdGhpcy5lYWNoKCBmdW5jdGlvbigpIHtcblx0XHRcdGpRdWVyeS5ldmVudC5yZW1vdmUoIHRoaXMsIHR5cGVzLCBmbiwgc2VsZWN0b3IgKTtcblx0XHR9ICk7XG5cdH1cbn0gKTtcblxuXG52YXJcblx0cnhodG1sVGFnID0gLzwoPyFhcmVhfGJyfGNvbHxlbWJlZHxocnxpbWd8aW5wdXR8bGlua3xtZXRhfHBhcmFtKSgoW1xcdzotXSspW14+XSopXFwvPi9naSxcblxuXHQvLyBTdXBwb3J0OiBJRSAxMC0xMSwgRWRnZSAxMDI0MCtcblx0Ly8gSW4gSUUvRWRnZSB1c2luZyByZWdleCBncm91cHMgaGVyZSBjYXVzZXMgc2V2ZXJlIHNsb3dkb3ducy5cblx0Ly8gU2VlIGh0dHBzOi8vY29ubmVjdC5taWNyb3NvZnQuY29tL0lFL2ZlZWRiYWNrL2RldGFpbHMvMTczNjUxMi9cblx0cm5vSW5uZXJodG1sID0gLzxzY3JpcHR8PHN0eWxlfDxsaW5rL2ksXG5cblx0Ly8gY2hlY2tlZD1cImNoZWNrZWRcIiBvciBjaGVja2VkXG5cdHJjaGVja2VkID0gL2NoZWNrZWRcXHMqKD86W149XXw9XFxzKi5jaGVja2VkLikvaSxcblx0cnNjcmlwdFR5cGVNYXNrZWQgPSAvXnRydWVcXC8oLiopLyxcblx0cmNsZWFuU2NyaXB0ID0gL15cXHMqPCEoPzpcXFtDREFUQVxcW3wtLSl8KD86XFxdXFxdfC0tKT5cXHMqJC9nO1xuXG4vLyBNYW5pcHVsYXRpbmcgdGFibGVzIHJlcXVpcmVzIGEgdGJvZHlcbmZ1bmN0aW9uIG1hbmlwdWxhdGlvblRhcmdldCggZWxlbSwgY29udGVudCApIHtcblx0cmV0dXJuIGpRdWVyeS5ub2RlTmFtZSggZWxlbSwgXCJ0YWJsZVwiICkgJiZcblx0XHRqUXVlcnkubm9kZU5hbWUoIGNvbnRlbnQubm9kZVR5cGUgIT09IDExID8gY29udGVudCA6IGNvbnRlbnQuZmlyc3RDaGlsZCwgXCJ0clwiICkgP1xuXG5cdFx0ZWxlbS5nZXRFbGVtZW50c0J5VGFnTmFtZSggXCJ0Ym9keVwiIClbIDAgXSB8fFxuXHRcdFx0ZWxlbS5hcHBlbmRDaGlsZCggZWxlbS5vd25lckRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIFwidGJvZHlcIiApICkgOlxuXHRcdGVsZW07XG59XG5cbi8vIFJlcGxhY2UvcmVzdG9yZSB0aGUgdHlwZSBhdHRyaWJ1dGUgb2Ygc2NyaXB0IGVsZW1lbnRzIGZvciBzYWZlIERPTSBtYW5pcHVsYXRpb25cbmZ1bmN0aW9uIGRpc2FibGVTY3JpcHQoIGVsZW0gKSB7XG5cdGVsZW0udHlwZSA9ICggZWxlbS5nZXRBdHRyaWJ1dGUoIFwidHlwZVwiICkgIT09IG51bGwgKSArIFwiL1wiICsgZWxlbS50eXBlO1xuXHRyZXR1cm4gZWxlbTtcbn1cbmZ1bmN0aW9uIHJlc3RvcmVTY3JpcHQoIGVsZW0gKSB7XG5cdHZhciBtYXRjaCA9IHJzY3JpcHRUeXBlTWFza2VkLmV4ZWMoIGVsZW0udHlwZSApO1xuXG5cdGlmICggbWF0Y2ggKSB7XG5cdFx0ZWxlbS50eXBlID0gbWF0Y2hbIDEgXTtcblx0fSBlbHNlIHtcblx0XHRlbGVtLnJlbW92ZUF0dHJpYnV0ZSggXCJ0eXBlXCIgKTtcblx0fVxuXG5cdHJldHVybiBlbGVtO1xufVxuXG5mdW5jdGlvbiBjbG9uZUNvcHlFdmVudCggc3JjLCBkZXN0ICkge1xuXHR2YXIgaSwgbCwgdHlwZSwgcGRhdGFPbGQsIHBkYXRhQ3VyLCB1ZGF0YU9sZCwgdWRhdGFDdXIsIGV2ZW50cztcblxuXHRpZiAoIGRlc3Qubm9kZVR5cGUgIT09IDEgKSB7XG5cdFx0cmV0dXJuO1xuXHR9XG5cblx0Ly8gMS4gQ29weSBwcml2YXRlIGRhdGE6IGV2ZW50cywgaGFuZGxlcnMsIGV0Yy5cblx0aWYgKCBkYXRhUHJpdi5oYXNEYXRhKCBzcmMgKSApIHtcblx0XHRwZGF0YU9sZCA9IGRhdGFQcml2LmFjY2Vzcyggc3JjICk7XG5cdFx0cGRhdGFDdXIgPSBkYXRhUHJpdi5zZXQoIGRlc3QsIHBkYXRhT2xkICk7XG5cdFx0ZXZlbnRzID0gcGRhdGFPbGQuZXZlbnRzO1xuXG5cdFx0aWYgKCBldmVudHMgKSB7XG5cdFx0XHRkZWxldGUgcGRhdGFDdXIuaGFuZGxlO1xuXHRcdFx0cGRhdGFDdXIuZXZlbnRzID0ge307XG5cblx0XHRcdGZvciAoIHR5cGUgaW4gZXZlbnRzICkge1xuXHRcdFx0XHRmb3IgKCBpID0gMCwgbCA9IGV2ZW50c1sgdHlwZSBdLmxlbmd0aDsgaSA8IGw7IGkrKyApIHtcblx0XHRcdFx0XHRqUXVlcnkuZXZlbnQuYWRkKCBkZXN0LCB0eXBlLCBldmVudHNbIHR5cGUgXVsgaSBdICk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHQvLyAyLiBDb3B5IHVzZXIgZGF0YVxuXHRpZiAoIGRhdGFVc2VyLmhhc0RhdGEoIHNyYyApICkge1xuXHRcdHVkYXRhT2xkID0gZGF0YVVzZXIuYWNjZXNzKCBzcmMgKTtcblx0XHR1ZGF0YUN1ciA9IGpRdWVyeS5leHRlbmQoIHt9LCB1ZGF0YU9sZCApO1xuXG5cdFx0ZGF0YVVzZXIuc2V0KCBkZXN0LCB1ZGF0YUN1ciApO1xuXHR9XG59XG5cbi8vIEZpeCBJRSBidWdzLCBzZWUgc3VwcG9ydCB0ZXN0c1xuZnVuY3Rpb24gZml4SW5wdXQoIHNyYywgZGVzdCApIHtcblx0dmFyIG5vZGVOYW1lID0gZGVzdC5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpO1xuXG5cdC8vIEZhaWxzIHRvIHBlcnNpc3QgdGhlIGNoZWNrZWQgc3RhdGUgb2YgYSBjbG9uZWQgY2hlY2tib3ggb3IgcmFkaW8gYnV0dG9uLlxuXHRpZiAoIG5vZGVOYW1lID09PSBcImlucHV0XCIgJiYgcmNoZWNrYWJsZVR5cGUudGVzdCggc3JjLnR5cGUgKSApIHtcblx0XHRkZXN0LmNoZWNrZWQgPSBzcmMuY2hlY2tlZDtcblxuXHQvLyBGYWlscyB0byByZXR1cm4gdGhlIHNlbGVjdGVkIG9wdGlvbiB0byB0aGUgZGVmYXVsdCBzZWxlY3RlZCBzdGF0ZSB3aGVuIGNsb25pbmcgb3B0aW9uc1xuXHR9IGVsc2UgaWYgKCBub2RlTmFtZSA9PT0gXCJpbnB1dFwiIHx8IG5vZGVOYW1lID09PSBcInRleHRhcmVhXCIgKSB7XG5cdFx0ZGVzdC5kZWZhdWx0VmFsdWUgPSBzcmMuZGVmYXVsdFZhbHVlO1xuXHR9XG59XG5cbmZ1bmN0aW9uIGRvbU1hbmlwKCBjb2xsZWN0aW9uLCBhcmdzLCBjYWxsYmFjaywgaWdub3JlZCApIHtcblxuXHQvLyBGbGF0dGVuIGFueSBuZXN0ZWQgYXJyYXlzXG5cdGFyZ3MgPSBjb25jYXQuYXBwbHkoIFtdLCBhcmdzICk7XG5cblx0dmFyIGZyYWdtZW50LCBmaXJzdCwgc2NyaXB0cywgaGFzU2NyaXB0cywgbm9kZSwgZG9jLFxuXHRcdGkgPSAwLFxuXHRcdGwgPSBjb2xsZWN0aW9uLmxlbmd0aCxcblx0XHRpTm9DbG9uZSA9IGwgLSAxLFxuXHRcdHZhbHVlID0gYXJnc1sgMCBdLFxuXHRcdGlzRnVuY3Rpb24gPSBqUXVlcnkuaXNGdW5jdGlvbiggdmFsdWUgKTtcblxuXHQvLyBXZSBjYW4ndCBjbG9uZU5vZGUgZnJhZ21lbnRzIHRoYXQgY29udGFpbiBjaGVja2VkLCBpbiBXZWJLaXRcblx0aWYgKCBpc0Z1bmN0aW9uIHx8XG5cdFx0XHQoIGwgPiAxICYmIHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIiAmJlxuXHRcdFx0XHQhc3VwcG9ydC5jaGVja0Nsb25lICYmIHJjaGVja2VkLnRlc3QoIHZhbHVlICkgKSApIHtcblx0XHRyZXR1cm4gY29sbGVjdGlvbi5lYWNoKCBmdW5jdGlvbiggaW5kZXggKSB7XG5cdFx0XHR2YXIgc2VsZiA9IGNvbGxlY3Rpb24uZXEoIGluZGV4ICk7XG5cdFx0XHRpZiAoIGlzRnVuY3Rpb24gKSB7XG5cdFx0XHRcdGFyZ3NbIDAgXSA9IHZhbHVlLmNhbGwoIHRoaXMsIGluZGV4LCBzZWxmLmh0bWwoKSApO1xuXHRcdFx0fVxuXHRcdFx0ZG9tTWFuaXAoIHNlbGYsIGFyZ3MsIGNhbGxiYWNrLCBpZ25vcmVkICk7XG5cdFx0fSApO1xuXHR9XG5cblx0aWYgKCBsICkge1xuXHRcdGZyYWdtZW50ID0gYnVpbGRGcmFnbWVudCggYXJncywgY29sbGVjdGlvblsgMCBdLm93bmVyRG9jdW1lbnQsIGZhbHNlLCBjb2xsZWN0aW9uLCBpZ25vcmVkICk7XG5cdFx0Zmlyc3QgPSBmcmFnbWVudC5maXJzdENoaWxkO1xuXG5cdFx0aWYgKCBmcmFnbWVudC5jaGlsZE5vZGVzLmxlbmd0aCA9PT0gMSApIHtcblx0XHRcdGZyYWdtZW50ID0gZmlyc3Q7XG5cdFx0fVxuXG5cdFx0Ly8gUmVxdWlyZSBlaXRoZXIgbmV3IGNvbnRlbnQgb3IgYW4gaW50ZXJlc3QgaW4gaWdub3JlZCBlbGVtZW50cyB0byBpbnZva2UgdGhlIGNhbGxiYWNrXG5cdFx0aWYgKCBmaXJzdCB8fCBpZ25vcmVkICkge1xuXHRcdFx0c2NyaXB0cyA9IGpRdWVyeS5tYXAoIGdldEFsbCggZnJhZ21lbnQsIFwic2NyaXB0XCIgKSwgZGlzYWJsZVNjcmlwdCApO1xuXHRcdFx0aGFzU2NyaXB0cyA9IHNjcmlwdHMubGVuZ3RoO1xuXG5cdFx0XHQvLyBVc2UgdGhlIG9yaWdpbmFsIGZyYWdtZW50IGZvciB0aGUgbGFzdCBpdGVtXG5cdFx0XHQvLyBpbnN0ZWFkIG9mIHRoZSBmaXJzdCBiZWNhdXNlIGl0IGNhbiBlbmQgdXBcblx0XHRcdC8vIGJlaW5nIGVtcHRpZWQgaW5jb3JyZWN0bHkgaW4gY2VydGFpbiBzaXR1YXRpb25zICgjODA3MCkuXG5cdFx0XHRmb3IgKCA7IGkgPCBsOyBpKysgKSB7XG5cdFx0XHRcdG5vZGUgPSBmcmFnbWVudDtcblxuXHRcdFx0XHRpZiAoIGkgIT09IGlOb0Nsb25lICkge1xuXHRcdFx0XHRcdG5vZGUgPSBqUXVlcnkuY2xvbmUoIG5vZGUsIHRydWUsIHRydWUgKTtcblxuXHRcdFx0XHRcdC8vIEtlZXAgcmVmZXJlbmNlcyB0byBjbG9uZWQgc2NyaXB0cyBmb3IgbGF0ZXIgcmVzdG9yYXRpb25cblx0XHRcdFx0XHRpZiAoIGhhc1NjcmlwdHMgKSB7XG5cblx0XHRcdFx0XHRcdC8vIFN1cHBvcnQ6IEFuZHJvaWQ8NC4xLCBQaGFudG9tSlM8MlxuXHRcdFx0XHRcdFx0Ly8gcHVzaC5hcHBseShfLCBhcnJheWxpa2UpIHRocm93cyBvbiBhbmNpZW50IFdlYktpdFxuXHRcdFx0XHRcdFx0alF1ZXJ5Lm1lcmdlKCBzY3JpcHRzLCBnZXRBbGwoIG5vZGUsIFwic2NyaXB0XCIgKSApO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXG5cdFx0XHRcdGNhbGxiYWNrLmNhbGwoIGNvbGxlY3Rpb25bIGkgXSwgbm9kZSwgaSApO1xuXHRcdFx0fVxuXG5cdFx0XHRpZiAoIGhhc1NjcmlwdHMgKSB7XG5cdFx0XHRcdGRvYyA9IHNjcmlwdHNbIHNjcmlwdHMubGVuZ3RoIC0gMSBdLm93bmVyRG9jdW1lbnQ7XG5cblx0XHRcdFx0Ly8gUmVlbmFibGUgc2NyaXB0c1xuXHRcdFx0XHRqUXVlcnkubWFwKCBzY3JpcHRzLCByZXN0b3JlU2NyaXB0ICk7XG5cblx0XHRcdFx0Ly8gRXZhbHVhdGUgZXhlY3V0YWJsZSBzY3JpcHRzIG9uIGZpcnN0IGRvY3VtZW50IGluc2VydGlvblxuXHRcdFx0XHRmb3IgKCBpID0gMDsgaSA8IGhhc1NjcmlwdHM7IGkrKyApIHtcblx0XHRcdFx0XHRub2RlID0gc2NyaXB0c1sgaSBdO1xuXHRcdFx0XHRcdGlmICggcnNjcmlwdFR5cGUudGVzdCggbm9kZS50eXBlIHx8IFwiXCIgKSAmJlxuXHRcdFx0XHRcdFx0IWRhdGFQcml2LmFjY2Vzcyggbm9kZSwgXCJnbG9iYWxFdmFsXCIgKSAmJlxuXHRcdFx0XHRcdFx0alF1ZXJ5LmNvbnRhaW5zKCBkb2MsIG5vZGUgKSApIHtcblxuXHRcdFx0XHRcdFx0aWYgKCBub2RlLnNyYyApIHtcblxuXHRcdFx0XHRcdFx0XHQvLyBPcHRpb25hbCBBSkFYIGRlcGVuZGVuY3ksIGJ1dCB3b24ndCBydW4gc2NyaXB0cyBpZiBub3QgcHJlc2VudFxuXHRcdFx0XHRcdFx0XHRpZiAoIGpRdWVyeS5fZXZhbFVybCApIHtcblx0XHRcdFx0XHRcdFx0XHRqUXVlcnkuX2V2YWxVcmwoIG5vZGUuc3JjICk7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRcdGpRdWVyeS5nbG9iYWxFdmFsKCBub2RlLnRleHRDb250ZW50LnJlcGxhY2UoIHJjbGVhblNjcmlwdCwgXCJcIiApICk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0cmV0dXJuIGNvbGxlY3Rpb247XG59XG5cbmZ1bmN0aW9uIHJlbW92ZSggZWxlbSwgc2VsZWN0b3IsIGtlZXBEYXRhICkge1xuXHR2YXIgbm9kZSxcblx0XHRub2RlcyA9IHNlbGVjdG9yID8galF1ZXJ5LmZpbHRlciggc2VsZWN0b3IsIGVsZW0gKSA6IGVsZW0sXG5cdFx0aSA9IDA7XG5cblx0Zm9yICggOyAoIG5vZGUgPSBub2Rlc1sgaSBdICkgIT0gbnVsbDsgaSsrICkge1xuXHRcdGlmICggIWtlZXBEYXRhICYmIG5vZGUubm9kZVR5cGUgPT09IDEgKSB7XG5cdFx0XHRqUXVlcnkuY2xlYW5EYXRhKCBnZXRBbGwoIG5vZGUgKSApO1xuXHRcdH1cblxuXHRcdGlmICggbm9kZS5wYXJlbnROb2RlICkge1xuXHRcdFx0aWYgKCBrZWVwRGF0YSAmJiBqUXVlcnkuY29udGFpbnMoIG5vZGUub3duZXJEb2N1bWVudCwgbm9kZSApICkge1xuXHRcdFx0XHRzZXRHbG9iYWxFdmFsKCBnZXRBbGwoIG5vZGUsIFwic2NyaXB0XCIgKSApO1xuXHRcdFx0fVxuXHRcdFx0bm9kZS5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKCBub2RlICk7XG5cdFx0fVxuXHR9XG5cblx0cmV0dXJuIGVsZW07XG59XG5cbmpRdWVyeS5leHRlbmQoIHtcblx0aHRtbFByZWZpbHRlcjogZnVuY3Rpb24oIGh0bWwgKSB7XG5cdFx0cmV0dXJuIGh0bWwucmVwbGFjZSggcnhodG1sVGFnLCBcIjwkMT48LyQyPlwiICk7XG5cdH0sXG5cblx0Y2xvbmU6IGZ1bmN0aW9uKCBlbGVtLCBkYXRhQW5kRXZlbnRzLCBkZWVwRGF0YUFuZEV2ZW50cyApIHtcblx0XHR2YXIgaSwgbCwgc3JjRWxlbWVudHMsIGRlc3RFbGVtZW50cyxcblx0XHRcdGNsb25lID0gZWxlbS5jbG9uZU5vZGUoIHRydWUgKSxcblx0XHRcdGluUGFnZSA9IGpRdWVyeS5jb250YWlucyggZWxlbS5vd25lckRvY3VtZW50LCBlbGVtICk7XG5cblx0XHQvLyBGaXggSUUgY2xvbmluZyBpc3N1ZXNcblx0XHRpZiAoICFzdXBwb3J0Lm5vQ2xvbmVDaGVja2VkICYmICggZWxlbS5ub2RlVHlwZSA9PT0gMSB8fCBlbGVtLm5vZGVUeXBlID09PSAxMSApICYmXG5cdFx0XHRcdCFqUXVlcnkuaXNYTUxEb2MoIGVsZW0gKSApIHtcblxuXHRcdFx0Ly8gV2UgZXNjaGV3IFNpenpsZSBoZXJlIGZvciBwZXJmb3JtYW5jZSByZWFzb25zOiBodHRwOi8vanNwZXJmLmNvbS9nZXRhbGwtdnMtc2l6emxlLzJcblx0XHRcdGRlc3RFbGVtZW50cyA9IGdldEFsbCggY2xvbmUgKTtcblx0XHRcdHNyY0VsZW1lbnRzID0gZ2V0QWxsKCBlbGVtICk7XG5cblx0XHRcdGZvciAoIGkgPSAwLCBsID0gc3JjRWxlbWVudHMubGVuZ3RoOyBpIDwgbDsgaSsrICkge1xuXHRcdFx0XHRmaXhJbnB1dCggc3JjRWxlbWVudHNbIGkgXSwgZGVzdEVsZW1lbnRzWyBpIF0gKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHQvLyBDb3B5IHRoZSBldmVudHMgZnJvbSB0aGUgb3JpZ2luYWwgdG8gdGhlIGNsb25lXG5cdFx0aWYgKCBkYXRhQW5kRXZlbnRzICkge1xuXHRcdFx0aWYgKCBkZWVwRGF0YUFuZEV2ZW50cyApIHtcblx0XHRcdFx0c3JjRWxlbWVudHMgPSBzcmNFbGVtZW50cyB8fCBnZXRBbGwoIGVsZW0gKTtcblx0XHRcdFx0ZGVzdEVsZW1lbnRzID0gZGVzdEVsZW1lbnRzIHx8IGdldEFsbCggY2xvbmUgKTtcblxuXHRcdFx0XHRmb3IgKCBpID0gMCwgbCA9IHNyY0VsZW1lbnRzLmxlbmd0aDsgaSA8IGw7IGkrKyApIHtcblx0XHRcdFx0XHRjbG9uZUNvcHlFdmVudCggc3JjRWxlbWVudHNbIGkgXSwgZGVzdEVsZW1lbnRzWyBpIF0gKTtcblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0Y2xvbmVDb3B5RXZlbnQoIGVsZW0sIGNsb25lICk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Ly8gUHJlc2VydmUgc2NyaXB0IGV2YWx1YXRpb24gaGlzdG9yeVxuXHRcdGRlc3RFbGVtZW50cyA9IGdldEFsbCggY2xvbmUsIFwic2NyaXB0XCIgKTtcblx0XHRpZiAoIGRlc3RFbGVtZW50cy5sZW5ndGggPiAwICkge1xuXHRcdFx0c2V0R2xvYmFsRXZhbCggZGVzdEVsZW1lbnRzLCAhaW5QYWdlICYmIGdldEFsbCggZWxlbSwgXCJzY3JpcHRcIiApICk7XG5cdFx0fVxuXG5cdFx0Ly8gUmV0dXJuIHRoZSBjbG9uZWQgc2V0XG5cdFx0cmV0dXJuIGNsb25lO1xuXHR9LFxuXG5cdGNsZWFuRGF0YTogZnVuY3Rpb24oIGVsZW1zICkge1xuXHRcdHZhciBkYXRhLCBlbGVtLCB0eXBlLFxuXHRcdFx0c3BlY2lhbCA9IGpRdWVyeS5ldmVudC5zcGVjaWFsLFxuXHRcdFx0aSA9IDA7XG5cblx0XHRmb3IgKCA7ICggZWxlbSA9IGVsZW1zWyBpIF0gKSAhPT0gdW5kZWZpbmVkOyBpKysgKSB7XG5cdFx0XHRpZiAoIGFjY2VwdERhdGEoIGVsZW0gKSApIHtcblx0XHRcdFx0aWYgKCAoIGRhdGEgPSBlbGVtWyBkYXRhUHJpdi5leHBhbmRvIF0gKSApIHtcblx0XHRcdFx0XHRpZiAoIGRhdGEuZXZlbnRzICkge1xuXHRcdFx0XHRcdFx0Zm9yICggdHlwZSBpbiBkYXRhLmV2ZW50cyApIHtcblx0XHRcdFx0XHRcdFx0aWYgKCBzcGVjaWFsWyB0eXBlIF0gKSB7XG5cdFx0XHRcdFx0XHRcdFx0alF1ZXJ5LmV2ZW50LnJlbW92ZSggZWxlbSwgdHlwZSApO1xuXG5cdFx0XHRcdFx0XHRcdC8vIFRoaXMgaXMgYSBzaG9ydGN1dCB0byBhdm9pZCBqUXVlcnkuZXZlbnQucmVtb3ZlJ3Mgb3ZlcmhlYWRcblx0XHRcdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdFx0XHRqUXVlcnkucmVtb3ZlRXZlbnQoIGVsZW0sIHR5cGUsIGRhdGEuaGFuZGxlICk7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHQvLyBTdXBwb3J0OiBDaHJvbWUgPD0gMzUtNDUrXG5cdFx0XHRcdFx0Ly8gQXNzaWduIHVuZGVmaW5lZCBpbnN0ZWFkIG9mIHVzaW5nIGRlbGV0ZSwgc2VlIERhdGEjcmVtb3ZlXG5cdFx0XHRcdFx0ZWxlbVsgZGF0YVByaXYuZXhwYW5kbyBdID0gdW5kZWZpbmVkO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGlmICggZWxlbVsgZGF0YVVzZXIuZXhwYW5kbyBdICkge1xuXG5cdFx0XHRcdFx0Ly8gU3VwcG9ydDogQ2hyb21lIDw9IDM1LTQ1K1xuXHRcdFx0XHRcdC8vIEFzc2lnbiB1bmRlZmluZWQgaW5zdGVhZCBvZiB1c2luZyBkZWxldGUsIHNlZSBEYXRhI3JlbW92ZVxuXHRcdFx0XHRcdGVsZW1bIGRhdGFVc2VyLmV4cGFuZG8gXSA9IHVuZGVmaW5lZDtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0fVxufSApO1xuXG5qUXVlcnkuZm4uZXh0ZW5kKCB7XG5cblx0Ly8gS2VlcCBkb21NYW5pcCBleHBvc2VkIHVudGlsIDMuMCAoZ2gtMjIyNSlcblx0ZG9tTWFuaXA6IGRvbU1hbmlwLFxuXG5cdGRldGFjaDogZnVuY3Rpb24oIHNlbGVjdG9yICkge1xuXHRcdHJldHVybiByZW1vdmUoIHRoaXMsIHNlbGVjdG9yLCB0cnVlICk7XG5cdH0sXG5cblx0cmVtb3ZlOiBmdW5jdGlvbiggc2VsZWN0b3IgKSB7XG5cdFx0cmV0dXJuIHJlbW92ZSggdGhpcywgc2VsZWN0b3IgKTtcblx0fSxcblxuXHR0ZXh0OiBmdW5jdGlvbiggdmFsdWUgKSB7XG5cdFx0cmV0dXJuIGFjY2VzcyggdGhpcywgZnVuY3Rpb24oIHZhbHVlICkge1xuXHRcdFx0cmV0dXJuIHZhbHVlID09PSB1bmRlZmluZWQgP1xuXHRcdFx0XHRqUXVlcnkudGV4dCggdGhpcyApIDpcblx0XHRcdFx0dGhpcy5lbXB0eSgpLmVhY2goIGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRcdGlmICggdGhpcy5ub2RlVHlwZSA9PT0gMSB8fCB0aGlzLm5vZGVUeXBlID09PSAxMSB8fCB0aGlzLm5vZGVUeXBlID09PSA5ICkge1xuXHRcdFx0XHRcdFx0dGhpcy50ZXh0Q29udGVudCA9IHZhbHVlO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSApO1xuXHRcdH0sIG51bGwsIHZhbHVlLCBhcmd1bWVudHMubGVuZ3RoICk7XG5cdH0sXG5cblx0YXBwZW5kOiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gZG9tTWFuaXAoIHRoaXMsIGFyZ3VtZW50cywgZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHRpZiAoIHRoaXMubm9kZVR5cGUgPT09IDEgfHwgdGhpcy5ub2RlVHlwZSA9PT0gMTEgfHwgdGhpcy5ub2RlVHlwZSA9PT0gOSApIHtcblx0XHRcdFx0dmFyIHRhcmdldCA9IG1hbmlwdWxhdGlvblRhcmdldCggdGhpcywgZWxlbSApO1xuXHRcdFx0XHR0YXJnZXQuYXBwZW5kQ2hpbGQoIGVsZW0gKTtcblx0XHRcdH1cblx0XHR9ICk7XG5cdH0sXG5cblx0cHJlcGVuZDogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIGRvbU1hbmlwKCB0aGlzLCBhcmd1bWVudHMsIGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0aWYgKCB0aGlzLm5vZGVUeXBlID09PSAxIHx8IHRoaXMubm9kZVR5cGUgPT09IDExIHx8IHRoaXMubm9kZVR5cGUgPT09IDkgKSB7XG5cdFx0XHRcdHZhciB0YXJnZXQgPSBtYW5pcHVsYXRpb25UYXJnZXQoIHRoaXMsIGVsZW0gKTtcblx0XHRcdFx0dGFyZ2V0Lmluc2VydEJlZm9yZSggZWxlbSwgdGFyZ2V0LmZpcnN0Q2hpbGQgKTtcblx0XHRcdH1cblx0XHR9ICk7XG5cdH0sXG5cblx0YmVmb3JlOiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gZG9tTWFuaXAoIHRoaXMsIGFyZ3VtZW50cywgZnVuY3Rpb24oIGVsZW0gKSB7XG5cdFx0XHRpZiAoIHRoaXMucGFyZW50Tm9kZSApIHtcblx0XHRcdFx0dGhpcy5wYXJlbnROb2RlLmluc2VydEJlZm9yZSggZWxlbSwgdGhpcyApO1xuXHRcdFx0fVxuXHRcdH0gKTtcblx0fSxcblxuXHRhZnRlcjogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIGRvbU1hbmlwKCB0aGlzLCBhcmd1bWVudHMsIGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0aWYgKCB0aGlzLnBhcmVudE5vZGUgKSB7XG5cdFx0XHRcdHRoaXMucGFyZW50Tm9kZS5pbnNlcnRCZWZvcmUoIGVsZW0sIHRoaXMubmV4dFNpYmxpbmcgKTtcblx0XHRcdH1cblx0XHR9ICk7XG5cdH0sXG5cblx0ZW1wdHk6IGZ1bmN0aW9uKCkge1xuXHRcdHZhciBlbGVtLFxuXHRcdFx0aSA9IDA7XG5cblx0XHRmb3IgKCA7ICggZWxlbSA9IHRoaXNbIGkgXSApICE9IG51bGw7IGkrKyApIHtcblx0XHRcdGlmICggZWxlbS5ub2RlVHlwZSA9PT0gMSApIHtcblxuXHRcdFx0XHQvLyBQcmV2ZW50IG1lbW9yeSBsZWFrc1xuXHRcdFx0XHRqUXVlcnkuY2xlYW5EYXRhKCBnZXRBbGwoIGVsZW0sIGZhbHNlICkgKTtcblxuXHRcdFx0XHQvLyBSZW1vdmUgYW55IHJlbWFpbmluZyBub2Rlc1xuXHRcdFx0XHRlbGVtLnRleHRDb250ZW50ID0gXCJcIjtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcztcblx0fSxcblxuXHRjbG9uZTogZnVuY3Rpb24oIGRhdGFBbmRFdmVudHMsIGRlZXBEYXRhQW5kRXZlbnRzICkge1xuXHRcdGRhdGFBbmRFdmVudHMgPSBkYXRhQW5kRXZlbnRzID09IG51bGwgPyBmYWxzZSA6IGRhdGFBbmRFdmVudHM7XG5cdFx0ZGVlcERhdGFBbmRFdmVudHMgPSBkZWVwRGF0YUFuZEV2ZW50cyA9PSBudWxsID8gZGF0YUFuZEV2ZW50cyA6IGRlZXBEYXRhQW5kRXZlbnRzO1xuXG5cdFx0cmV0dXJuIHRoaXMubWFwKCBmdW5jdGlvbigpIHtcblx0XHRcdHJldHVybiBqUXVlcnkuY2xvbmUoIHRoaXMsIGRhdGFBbmRFdmVudHMsIGRlZXBEYXRhQW5kRXZlbnRzICk7XG5cdFx0fSApO1xuXHR9LFxuXG5cdGh0bWw6IGZ1bmN0aW9uKCB2YWx1ZSApIHtcblx0XHRyZXR1cm4gYWNjZXNzKCB0aGlzLCBmdW5jdGlvbiggdmFsdWUgKSB7XG5cdFx0XHR2YXIgZWxlbSA9IHRoaXNbIDAgXSB8fCB7fSxcblx0XHRcdFx0aSA9IDAsXG5cdFx0XHRcdGwgPSB0aGlzLmxlbmd0aDtcblxuXHRcdFx0aWYgKCB2YWx1ZSA9PT0gdW5kZWZpbmVkICYmIGVsZW0ubm9kZVR5cGUgPT09IDEgKSB7XG5cdFx0XHRcdHJldHVybiBlbGVtLmlubmVySFRNTDtcblx0XHRcdH1cblxuXHRcdFx0Ly8gU2VlIGlmIHdlIGNhbiB0YWtlIGEgc2hvcnRjdXQgYW5kIGp1c3QgdXNlIGlubmVySFRNTFxuXHRcdFx0aWYgKCB0eXBlb2YgdmFsdWUgPT09IFwic3RyaW5nXCIgJiYgIXJub0lubmVyaHRtbC50ZXN0KCB2YWx1ZSApICYmXG5cdFx0XHRcdCF3cmFwTWFwWyAoIHJ0YWdOYW1lLmV4ZWMoIHZhbHVlICkgfHwgWyBcIlwiLCBcIlwiIF0gKVsgMSBdLnRvTG93ZXJDYXNlKCkgXSApIHtcblxuXHRcdFx0XHR2YWx1ZSA9IGpRdWVyeS5odG1sUHJlZmlsdGVyKCB2YWx1ZSApO1xuXG5cdFx0XHRcdHRyeSB7XG5cdFx0XHRcdFx0Zm9yICggOyBpIDwgbDsgaSsrICkge1xuXHRcdFx0XHRcdFx0ZWxlbSA9IHRoaXNbIGkgXSB8fCB7fTtcblxuXHRcdFx0XHRcdFx0Ly8gUmVtb3ZlIGVsZW1lbnQgbm9kZXMgYW5kIHByZXZlbnQgbWVtb3J5IGxlYWtzXG5cdFx0XHRcdFx0XHRpZiAoIGVsZW0ubm9kZVR5cGUgPT09IDEgKSB7XG5cdFx0XHRcdFx0XHRcdGpRdWVyeS5jbGVhbkRhdGEoIGdldEFsbCggZWxlbSwgZmFsc2UgKSApO1xuXHRcdFx0XHRcdFx0XHRlbGVtLmlubmVySFRNTCA9IHZhbHVlO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdGVsZW0gPSAwO1xuXG5cdFx0XHRcdC8vIElmIHVzaW5nIGlubmVySFRNTCB0aHJvd3MgYW4gZXhjZXB0aW9uLCB1c2UgdGhlIGZhbGxiYWNrIG1ldGhvZFxuXHRcdFx0XHR9IGNhdGNoICggZSApIHt9XG5cdFx0XHR9XG5cblx0XHRcdGlmICggZWxlbSApIHtcblx0XHRcdFx0dGhpcy5lbXB0eSgpLmFwcGVuZCggdmFsdWUgKTtcblx0XHRcdH1cblx0XHR9LCBudWxsLCB2YWx1ZSwgYXJndW1lbnRzLmxlbmd0aCApO1xuXHR9LFxuXG5cdHJlcGxhY2VXaXRoOiBmdW5jdGlvbigpIHtcblx0XHR2YXIgaWdub3JlZCA9IFtdO1xuXG5cdFx0Ly8gTWFrZSB0aGUgY2hhbmdlcywgcmVwbGFjaW5nIGVhY2ggbm9uLWlnbm9yZWQgY29udGV4dCBlbGVtZW50IHdpdGggdGhlIG5ldyBjb250ZW50XG5cdFx0cmV0dXJuIGRvbU1hbmlwKCB0aGlzLCBhcmd1bWVudHMsIGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0dmFyIHBhcmVudCA9IHRoaXMucGFyZW50Tm9kZTtcblxuXHRcdFx0aWYgKCBqUXVlcnkuaW5BcnJheSggdGhpcywgaWdub3JlZCApIDwgMCApIHtcblx0XHRcdFx0alF1ZXJ5LmNsZWFuRGF0YSggZ2V0QWxsKCB0aGlzICkgKTtcblx0XHRcdFx0aWYgKCBwYXJlbnQgKSB7XG5cdFx0XHRcdFx0cGFyZW50LnJlcGxhY2VDaGlsZCggZWxlbSwgdGhpcyApO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHQvLyBGb3JjZSBjYWxsYmFjayBpbnZvY2F0aW9uXG5cdFx0fSwgaWdub3JlZCApO1xuXHR9XG59ICk7XG5cbmpRdWVyeS5lYWNoKCB7XG5cdGFwcGVuZFRvOiBcImFwcGVuZFwiLFxuXHRwcmVwZW5kVG86IFwicHJlcGVuZFwiLFxuXHRpbnNlcnRCZWZvcmU6IFwiYmVmb3JlXCIsXG5cdGluc2VydEFmdGVyOiBcImFmdGVyXCIsXG5cdHJlcGxhY2VBbGw6IFwicmVwbGFjZVdpdGhcIlxufSwgZnVuY3Rpb24oIG5hbWUsIG9yaWdpbmFsICkge1xuXHRqUXVlcnkuZm5bIG5hbWUgXSA9IGZ1bmN0aW9uKCBzZWxlY3RvciApIHtcblx0XHR2YXIgZWxlbXMsXG5cdFx0XHRyZXQgPSBbXSxcblx0XHRcdGluc2VydCA9IGpRdWVyeSggc2VsZWN0b3IgKSxcblx0XHRcdGxhc3QgPSBpbnNlcnQubGVuZ3RoIC0gMSxcblx0XHRcdGkgPSAwO1xuXG5cdFx0Zm9yICggOyBpIDw9IGxhc3Q7IGkrKyApIHtcblx0XHRcdGVsZW1zID0gaSA9PT0gbGFzdCA/IHRoaXMgOiB0aGlzLmNsb25lKCB0cnVlICk7XG5cdFx0XHRqUXVlcnkoIGluc2VydFsgaSBdIClbIG9yaWdpbmFsIF0oIGVsZW1zICk7XG5cblx0XHRcdC8vIFN1cHBvcnQ6IFF0V2ViS2l0XG5cdFx0XHQvLyAuZ2V0KCkgYmVjYXVzZSBwdXNoLmFwcGx5KF8sIGFycmF5bGlrZSkgdGhyb3dzXG5cdFx0XHRwdXNoLmFwcGx5KCByZXQsIGVsZW1zLmdldCgpICk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXMucHVzaFN0YWNrKCByZXQgKTtcblx0fTtcbn0gKTtcblxuXG52YXIgaWZyYW1lLFxuXHRlbGVtZGlzcGxheSA9IHtcblxuXHRcdC8vIFN1cHBvcnQ6IEZpcmVmb3hcblx0XHQvLyBXZSBoYXZlIHRvIHByZS1kZWZpbmUgdGhlc2UgdmFsdWVzIGZvciBGRiAoIzEwMjI3KVxuXHRcdEhUTUw6IFwiYmxvY2tcIixcblx0XHRCT0RZOiBcImJsb2NrXCJcblx0fTtcblxuLyoqXG4gKiBSZXRyaWV2ZSB0aGUgYWN0dWFsIGRpc3BsYXkgb2YgYSBlbGVtZW50XG4gKiBAcGFyYW0ge1N0cmluZ30gbmFtZSBub2RlTmFtZSBvZiB0aGUgZWxlbWVudFxuICogQHBhcmFtIHtPYmplY3R9IGRvYyBEb2N1bWVudCBvYmplY3RcbiAqL1xuXG4vLyBDYWxsZWQgb25seSBmcm9tIHdpdGhpbiBkZWZhdWx0RGlzcGxheVxuZnVuY3Rpb24gYWN0dWFsRGlzcGxheSggbmFtZSwgZG9jICkge1xuXHR2YXIgZWxlbSA9IGpRdWVyeSggZG9jLmNyZWF0ZUVsZW1lbnQoIG5hbWUgKSApLmFwcGVuZFRvKCBkb2MuYm9keSApLFxuXG5cdFx0ZGlzcGxheSA9IGpRdWVyeS5jc3MoIGVsZW1bIDAgXSwgXCJkaXNwbGF5XCIgKTtcblxuXHQvLyBXZSBkb24ndCBoYXZlIGFueSBkYXRhIHN0b3JlZCBvbiB0aGUgZWxlbWVudCxcblx0Ly8gc28gdXNlIFwiZGV0YWNoXCIgbWV0aG9kIGFzIGZhc3Qgd2F5IHRvIGdldCByaWQgb2YgdGhlIGVsZW1lbnRcblx0ZWxlbS5kZXRhY2goKTtcblxuXHRyZXR1cm4gZGlzcGxheTtcbn1cblxuLyoqXG4gKiBUcnkgdG8gZGV0ZXJtaW5lIHRoZSBkZWZhdWx0IGRpc3BsYXkgdmFsdWUgb2YgYW4gZWxlbWVudFxuICogQHBhcmFtIHtTdHJpbmd9IG5vZGVOYW1lXG4gKi9cbmZ1bmN0aW9uIGRlZmF1bHREaXNwbGF5KCBub2RlTmFtZSApIHtcblx0dmFyIGRvYyA9IGRvY3VtZW50LFxuXHRcdGRpc3BsYXkgPSBlbGVtZGlzcGxheVsgbm9kZU5hbWUgXTtcblxuXHRpZiAoICFkaXNwbGF5ICkge1xuXHRcdGRpc3BsYXkgPSBhY3R1YWxEaXNwbGF5KCBub2RlTmFtZSwgZG9jICk7XG5cblx0XHQvLyBJZiB0aGUgc2ltcGxlIHdheSBmYWlscywgcmVhZCBmcm9tIGluc2lkZSBhbiBpZnJhbWVcblx0XHRpZiAoIGRpc3BsYXkgPT09IFwibm9uZVwiIHx8ICFkaXNwbGF5ICkge1xuXG5cdFx0XHQvLyBVc2UgdGhlIGFscmVhZHktY3JlYXRlZCBpZnJhbWUgaWYgcG9zc2libGVcblx0XHRcdGlmcmFtZSA9ICggaWZyYW1lIHx8IGpRdWVyeSggXCI8aWZyYW1lIGZyYW1lYm9yZGVyPScwJyB3aWR0aD0nMCcgaGVpZ2h0PScwJy8+XCIgKSApXG5cdFx0XHRcdC5hcHBlbmRUbyggZG9jLmRvY3VtZW50RWxlbWVudCApO1xuXG5cdFx0XHQvLyBBbHdheXMgd3JpdGUgYSBuZXcgSFRNTCBza2VsZXRvbiBzbyBXZWJraXQgYW5kIEZpcmVmb3ggZG9uJ3QgY2hva2Ugb24gcmV1c2Vcblx0XHRcdGRvYyA9IGlmcmFtZVsgMCBdLmNvbnRlbnREb2N1bWVudDtcblxuXHRcdFx0Ly8gU3VwcG9ydDogSUVcblx0XHRcdGRvYy53cml0ZSgpO1xuXHRcdFx0ZG9jLmNsb3NlKCk7XG5cblx0XHRcdGRpc3BsYXkgPSBhY3R1YWxEaXNwbGF5KCBub2RlTmFtZSwgZG9jICk7XG5cdFx0XHRpZnJhbWUuZGV0YWNoKCk7XG5cdFx0fVxuXG5cdFx0Ly8gU3RvcmUgdGhlIGNvcnJlY3QgZGVmYXVsdCBkaXNwbGF5XG5cdFx0ZWxlbWRpc3BsYXlbIG5vZGVOYW1lIF0gPSBkaXNwbGF5O1xuXHR9XG5cblx0cmV0dXJuIGRpc3BsYXk7XG59XG52YXIgcm1hcmdpbiA9ICggL15tYXJnaW4vICk7XG5cbnZhciBybnVtbm9ucHggPSBuZXcgUmVnRXhwKCBcIl4oXCIgKyBwbnVtICsgXCIpKD8hcHgpW2EteiVdKyRcIiwgXCJpXCIgKTtcblxudmFyIGdldFN0eWxlcyA9IGZ1bmN0aW9uKCBlbGVtICkge1xuXG5cdFx0Ly8gU3VwcG9ydDogSUU8PTExKywgRmlyZWZveDw9MzArICgjMTUwOTgsICMxNDE1MClcblx0XHQvLyBJRSB0aHJvd3Mgb24gZWxlbWVudHMgY3JlYXRlZCBpbiBwb3B1cHNcblx0XHQvLyBGRiBtZWFud2hpbGUgdGhyb3dzIG9uIGZyYW1lIGVsZW1lbnRzIHRocm91Z2ggXCJkZWZhdWx0Vmlldy5nZXRDb21wdXRlZFN0eWxlXCJcblx0XHR2YXIgdmlldyA9IGVsZW0ub3duZXJEb2N1bWVudC5kZWZhdWx0VmlldztcblxuXHRcdGlmICggIXZpZXcgfHwgIXZpZXcub3BlbmVyICkge1xuXHRcdFx0dmlldyA9IHdpbmRvdztcblx0XHR9XG5cblx0XHRyZXR1cm4gdmlldy5nZXRDb21wdXRlZFN0eWxlKCBlbGVtICk7XG5cdH07XG5cbnZhciBzd2FwID0gZnVuY3Rpb24oIGVsZW0sIG9wdGlvbnMsIGNhbGxiYWNrLCBhcmdzICkge1xuXHR2YXIgcmV0LCBuYW1lLFxuXHRcdG9sZCA9IHt9O1xuXG5cdC8vIFJlbWVtYmVyIHRoZSBvbGQgdmFsdWVzLCBhbmQgaW5zZXJ0IHRoZSBuZXcgb25lc1xuXHRmb3IgKCBuYW1lIGluIG9wdGlvbnMgKSB7XG5cdFx0b2xkWyBuYW1lIF0gPSBlbGVtLnN0eWxlWyBuYW1lIF07XG5cdFx0ZWxlbS5zdHlsZVsgbmFtZSBdID0gb3B0aW9uc1sgbmFtZSBdO1xuXHR9XG5cblx0cmV0ID0gY2FsbGJhY2suYXBwbHkoIGVsZW0sIGFyZ3MgfHwgW10gKTtcblxuXHQvLyBSZXZlcnQgdGhlIG9sZCB2YWx1ZXNcblx0Zm9yICggbmFtZSBpbiBvcHRpb25zICkge1xuXHRcdGVsZW0uc3R5bGVbIG5hbWUgXSA9IG9sZFsgbmFtZSBdO1xuXHR9XG5cblx0cmV0dXJuIHJldDtcbn07XG5cblxudmFyIGRvY3VtZW50RWxlbWVudCA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudDtcblxuXG5cbiggZnVuY3Rpb24oKSB7XG5cdHZhciBwaXhlbFBvc2l0aW9uVmFsLCBib3hTaXppbmdSZWxpYWJsZVZhbCwgcGl4ZWxNYXJnaW5SaWdodFZhbCwgcmVsaWFibGVNYXJnaW5MZWZ0VmFsLFxuXHRcdGNvbnRhaW5lciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIFwiZGl2XCIgKSxcblx0XHRkaXYgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCBcImRpdlwiICk7XG5cblx0Ly8gRmluaXNoIGVhcmx5IGluIGxpbWl0ZWQgKG5vbi1icm93c2VyKSBlbnZpcm9ubWVudHNcblx0aWYgKCAhZGl2LnN0eWxlICkge1xuXHRcdHJldHVybjtcblx0fVxuXG5cdC8vIFN1cHBvcnQ6IElFOS0xMStcblx0Ly8gU3R5bGUgb2YgY2xvbmVkIGVsZW1lbnQgYWZmZWN0cyBzb3VyY2UgZWxlbWVudCBjbG9uZWQgKCM4OTA4KVxuXHRkaXYuc3R5bGUuYmFja2dyb3VuZENsaXAgPSBcImNvbnRlbnQtYm94XCI7XG5cdGRpdi5jbG9uZU5vZGUoIHRydWUgKS5zdHlsZS5iYWNrZ3JvdW5kQ2xpcCA9IFwiXCI7XG5cdHN1cHBvcnQuY2xlYXJDbG9uZVN0eWxlID0gZGl2LnN0eWxlLmJhY2tncm91bmRDbGlwID09PSBcImNvbnRlbnQtYm94XCI7XG5cblx0Y29udGFpbmVyLnN0eWxlLmNzc1RleHQgPSBcImJvcmRlcjowO3dpZHRoOjhweDtoZWlnaHQ6MDt0b3A6MDtsZWZ0Oi05OTk5cHg7XCIgK1xuXHRcdFwicGFkZGluZzowO21hcmdpbi10b3A6MXB4O3Bvc2l0aW9uOmFic29sdXRlXCI7XG5cdGNvbnRhaW5lci5hcHBlbmRDaGlsZCggZGl2ICk7XG5cblx0Ly8gRXhlY3V0aW5nIGJvdGggcGl4ZWxQb3NpdGlvbiAmIGJveFNpemluZ1JlbGlhYmxlIHRlc3RzIHJlcXVpcmUgb25seSBvbmUgbGF5b3V0XG5cdC8vIHNvIHRoZXkncmUgZXhlY3V0ZWQgYXQgdGhlIHNhbWUgdGltZSB0byBzYXZlIHRoZSBzZWNvbmQgY29tcHV0YXRpb24uXG5cdGZ1bmN0aW9uIGNvbXB1dGVTdHlsZVRlc3RzKCkge1xuXHRcdGRpdi5zdHlsZS5jc3NUZXh0ID1cblxuXHRcdFx0Ly8gU3VwcG9ydDogRmlyZWZveDwyOSwgQW5kcm9pZCAyLjNcblx0XHRcdC8vIFZlbmRvci1wcmVmaXggYm94LXNpemluZ1xuXHRcdFx0XCItd2Via2l0LWJveC1zaXppbmc6Ym9yZGVyLWJveDstbW96LWJveC1zaXppbmc6Ym9yZGVyLWJveDtib3gtc2l6aW5nOmJvcmRlci1ib3g7XCIgK1xuXHRcdFx0XCJwb3NpdGlvbjpyZWxhdGl2ZTtkaXNwbGF5OmJsb2NrO1wiICtcblx0XHRcdFwibWFyZ2luOmF1dG87Ym9yZGVyOjFweDtwYWRkaW5nOjFweDtcIiArXG5cdFx0XHRcInRvcDoxJTt3aWR0aDo1MCVcIjtcblx0XHRkaXYuaW5uZXJIVE1MID0gXCJcIjtcblx0XHRkb2N1bWVudEVsZW1lbnQuYXBwZW5kQ2hpbGQoIGNvbnRhaW5lciApO1xuXG5cdFx0dmFyIGRpdlN0eWxlID0gd2luZG93LmdldENvbXB1dGVkU3R5bGUoIGRpdiApO1xuXHRcdHBpeGVsUG9zaXRpb25WYWwgPSBkaXZTdHlsZS50b3AgIT09IFwiMSVcIjtcblx0XHRyZWxpYWJsZU1hcmdpbkxlZnRWYWwgPSBkaXZTdHlsZS5tYXJnaW5MZWZ0ID09PSBcIjJweFwiO1xuXHRcdGJveFNpemluZ1JlbGlhYmxlVmFsID0gZGl2U3R5bGUud2lkdGggPT09IFwiNHB4XCI7XG5cblx0XHQvLyBTdXBwb3J0OiBBbmRyb2lkIDQuMCAtIDQuMyBvbmx5XG5cdFx0Ly8gU29tZSBzdHlsZXMgY29tZSBiYWNrIHdpdGggcGVyY2VudGFnZSB2YWx1ZXMsIGV2ZW4gdGhvdWdoIHRoZXkgc2hvdWxkbid0XG5cdFx0ZGl2LnN0eWxlLm1hcmdpblJpZ2h0ID0gXCI1MCVcIjtcblx0XHRwaXhlbE1hcmdpblJpZ2h0VmFsID0gZGl2U3R5bGUubWFyZ2luUmlnaHQgPT09IFwiNHB4XCI7XG5cblx0XHRkb2N1bWVudEVsZW1lbnQucmVtb3ZlQ2hpbGQoIGNvbnRhaW5lciApO1xuXHR9XG5cblx0alF1ZXJ5LmV4dGVuZCggc3VwcG9ydCwge1xuXHRcdHBpeGVsUG9zaXRpb246IGZ1bmN0aW9uKCkge1xuXG5cdFx0XHQvLyBUaGlzIHRlc3QgaXMgZXhlY3V0ZWQgb25seSBvbmNlIGJ1dCB3ZSBzdGlsbCBkbyBtZW1vaXppbmdcblx0XHRcdC8vIHNpbmNlIHdlIGNhbiB1c2UgdGhlIGJveFNpemluZ1JlbGlhYmxlIHByZS1jb21wdXRpbmcuXG5cdFx0XHQvLyBObyBuZWVkIHRvIGNoZWNrIGlmIHRoZSB0ZXN0IHdhcyBhbHJlYWR5IHBlcmZvcm1lZCwgdGhvdWdoLlxuXHRcdFx0Y29tcHV0ZVN0eWxlVGVzdHMoKTtcblx0XHRcdHJldHVybiBwaXhlbFBvc2l0aW9uVmFsO1xuXHRcdH0sXG5cdFx0Ym94U2l6aW5nUmVsaWFibGU6IGZ1bmN0aW9uKCkge1xuXHRcdFx0aWYgKCBib3hTaXppbmdSZWxpYWJsZVZhbCA9PSBudWxsICkge1xuXHRcdFx0XHRjb21wdXRlU3R5bGVUZXN0cygpO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIGJveFNpemluZ1JlbGlhYmxlVmFsO1xuXHRcdH0sXG5cdFx0cGl4ZWxNYXJnaW5SaWdodDogZnVuY3Rpb24oKSB7XG5cblx0XHRcdC8vIFN1cHBvcnQ6IEFuZHJvaWQgNC4wLTQuM1xuXHRcdFx0Ly8gV2UncmUgY2hlY2tpbmcgZm9yIGJveFNpemluZ1JlbGlhYmxlVmFsIGhlcmUgaW5zdGVhZCBvZiBwaXhlbE1hcmdpblJpZ2h0VmFsXG5cdFx0XHQvLyBzaW5jZSB0aGF0IGNvbXByZXNzZXMgYmV0dGVyIGFuZCB0aGV5J3JlIGNvbXB1dGVkIHRvZ2V0aGVyIGFueXdheS5cblx0XHRcdGlmICggYm94U2l6aW5nUmVsaWFibGVWYWwgPT0gbnVsbCApIHtcblx0XHRcdFx0Y29tcHV0ZVN0eWxlVGVzdHMoKTtcblx0XHRcdH1cblx0XHRcdHJldHVybiBwaXhlbE1hcmdpblJpZ2h0VmFsO1xuXHRcdH0sXG5cdFx0cmVsaWFibGVNYXJnaW5MZWZ0OiBmdW5jdGlvbigpIHtcblxuXHRcdFx0Ly8gU3VwcG9ydDogSUUgPD04IG9ubHksIEFuZHJvaWQgNC4wIC0gNC4zIG9ubHksIEZpcmVmb3ggPD0zIC0gMzdcblx0XHRcdGlmICggYm94U2l6aW5nUmVsaWFibGVWYWwgPT0gbnVsbCApIHtcblx0XHRcdFx0Y29tcHV0ZVN0eWxlVGVzdHMoKTtcblx0XHRcdH1cblx0XHRcdHJldHVybiByZWxpYWJsZU1hcmdpbkxlZnRWYWw7XG5cdFx0fSxcblx0XHRyZWxpYWJsZU1hcmdpblJpZ2h0OiBmdW5jdGlvbigpIHtcblxuXHRcdFx0Ly8gU3VwcG9ydDogQW5kcm9pZCAyLjNcblx0XHRcdC8vIENoZWNrIGlmIGRpdiB3aXRoIGV4cGxpY2l0IHdpZHRoIGFuZCBubyBtYXJnaW4tcmlnaHQgaW5jb3JyZWN0bHlcblx0XHRcdC8vIGdldHMgY29tcHV0ZWQgbWFyZ2luLXJpZ2h0IGJhc2VkIG9uIHdpZHRoIG9mIGNvbnRhaW5lci4gKCMzMzMzKVxuXHRcdFx0Ly8gV2ViS2l0IEJ1ZyAxMzM0MyAtIGdldENvbXB1dGVkU3R5bGUgcmV0dXJucyB3cm9uZyB2YWx1ZSBmb3IgbWFyZ2luLXJpZ2h0XG5cdFx0XHQvLyBUaGlzIHN1cHBvcnQgZnVuY3Rpb24gaXMgb25seSBleGVjdXRlZCBvbmNlIHNvIG5vIG1lbW9pemluZyBpcyBuZWVkZWQuXG5cdFx0XHR2YXIgcmV0LFxuXHRcdFx0XHRtYXJnaW5EaXYgPSBkaXYuYXBwZW5kQ2hpbGQoIGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIFwiZGl2XCIgKSApO1xuXG5cdFx0XHQvLyBSZXNldCBDU1M6IGJveC1zaXppbmc7IGRpc3BsYXk7IG1hcmdpbjsgYm9yZGVyOyBwYWRkaW5nXG5cdFx0XHRtYXJnaW5EaXYuc3R5bGUuY3NzVGV4dCA9IGRpdi5zdHlsZS5jc3NUZXh0ID1cblxuXHRcdFx0XHQvLyBTdXBwb3J0OiBBbmRyb2lkIDIuM1xuXHRcdFx0XHQvLyBWZW5kb3ItcHJlZml4IGJveC1zaXppbmdcblx0XHRcdFx0XCItd2Via2l0LWJveC1zaXppbmc6Y29udGVudC1ib3g7Ym94LXNpemluZzpjb250ZW50LWJveDtcIiArXG5cdFx0XHRcdFwiZGlzcGxheTpibG9jazttYXJnaW46MDtib3JkZXI6MDtwYWRkaW5nOjBcIjtcblx0XHRcdG1hcmdpbkRpdi5zdHlsZS5tYXJnaW5SaWdodCA9IG1hcmdpbkRpdi5zdHlsZS53aWR0aCA9IFwiMFwiO1xuXHRcdFx0ZGl2LnN0eWxlLndpZHRoID0gXCIxcHhcIjtcblx0XHRcdGRvY3VtZW50RWxlbWVudC5hcHBlbmRDaGlsZCggY29udGFpbmVyICk7XG5cblx0XHRcdHJldCA9ICFwYXJzZUZsb2F0KCB3aW5kb3cuZ2V0Q29tcHV0ZWRTdHlsZSggbWFyZ2luRGl2ICkubWFyZ2luUmlnaHQgKTtcblxuXHRcdFx0ZG9jdW1lbnRFbGVtZW50LnJlbW92ZUNoaWxkKCBjb250YWluZXIgKTtcblx0XHRcdGRpdi5yZW1vdmVDaGlsZCggbWFyZ2luRGl2ICk7XG5cblx0XHRcdHJldHVybiByZXQ7XG5cdFx0fVxuXHR9ICk7XG59ICkoKTtcblxuXG5mdW5jdGlvbiBjdXJDU1MoIGVsZW0sIG5hbWUsIGNvbXB1dGVkICkge1xuXHR2YXIgd2lkdGgsIG1pbldpZHRoLCBtYXhXaWR0aCwgcmV0LFxuXHRcdHN0eWxlID0gZWxlbS5zdHlsZTtcblxuXHRjb21wdXRlZCA9IGNvbXB1dGVkIHx8IGdldFN0eWxlcyggZWxlbSApO1xuXHRyZXQgPSBjb21wdXRlZCA/IGNvbXB1dGVkLmdldFByb3BlcnR5VmFsdWUoIG5hbWUgKSB8fCBjb21wdXRlZFsgbmFtZSBdIDogdW5kZWZpbmVkO1xuXG5cdC8vIFN1cHBvcnQ6IE9wZXJhIDEyLjF4IG9ubHlcblx0Ly8gRmFsbCBiYWNrIHRvIHN0eWxlIGV2ZW4gd2l0aG91dCBjb21wdXRlZFxuXHQvLyBjb21wdXRlZCBpcyB1bmRlZmluZWQgZm9yIGVsZW1zIG9uIGRvY3VtZW50IGZyYWdtZW50c1xuXHRpZiAoICggcmV0ID09PSBcIlwiIHx8IHJldCA9PT0gdW5kZWZpbmVkICkgJiYgIWpRdWVyeS5jb250YWlucyggZWxlbS5vd25lckRvY3VtZW50LCBlbGVtICkgKSB7XG5cdFx0cmV0ID0galF1ZXJ5LnN0eWxlKCBlbGVtLCBuYW1lICk7XG5cdH1cblxuXHQvLyBTdXBwb3J0OiBJRTlcblx0Ly8gZ2V0UHJvcGVydHlWYWx1ZSBpcyBvbmx5IG5lZWRlZCBmb3IgLmNzcygnZmlsdGVyJykgKCMxMjUzNylcblx0aWYgKCBjb21wdXRlZCApIHtcblxuXHRcdC8vIEEgdHJpYnV0ZSB0byB0aGUgXCJhd2Vzb21lIGhhY2sgYnkgRGVhbiBFZHdhcmRzXCJcblx0XHQvLyBBbmRyb2lkIEJyb3dzZXIgcmV0dXJucyBwZXJjZW50YWdlIGZvciBzb21lIHZhbHVlcyxcblx0XHQvLyBidXQgd2lkdGggc2VlbXMgdG8gYmUgcmVsaWFibHkgcGl4ZWxzLlxuXHRcdC8vIFRoaXMgaXMgYWdhaW5zdCB0aGUgQ1NTT00gZHJhZnQgc3BlYzpcblx0XHQvLyBodHRwOi8vZGV2LnczLm9yZy9jc3N3Zy9jc3NvbS8jcmVzb2x2ZWQtdmFsdWVzXG5cdFx0aWYgKCAhc3VwcG9ydC5waXhlbE1hcmdpblJpZ2h0KCkgJiYgcm51bW5vbnB4LnRlc3QoIHJldCApICYmIHJtYXJnaW4udGVzdCggbmFtZSApICkge1xuXG5cdFx0XHQvLyBSZW1lbWJlciB0aGUgb3JpZ2luYWwgdmFsdWVzXG5cdFx0XHR3aWR0aCA9IHN0eWxlLndpZHRoO1xuXHRcdFx0bWluV2lkdGggPSBzdHlsZS5taW5XaWR0aDtcblx0XHRcdG1heFdpZHRoID0gc3R5bGUubWF4V2lkdGg7XG5cblx0XHRcdC8vIFB1dCBpbiB0aGUgbmV3IHZhbHVlcyB0byBnZXQgYSBjb21wdXRlZCB2YWx1ZSBvdXRcblx0XHRcdHN0eWxlLm1pbldpZHRoID0gc3R5bGUubWF4V2lkdGggPSBzdHlsZS53aWR0aCA9IHJldDtcblx0XHRcdHJldCA9IGNvbXB1dGVkLndpZHRoO1xuXG5cdFx0XHQvLyBSZXZlcnQgdGhlIGNoYW5nZWQgdmFsdWVzXG5cdFx0XHRzdHlsZS53aWR0aCA9IHdpZHRoO1xuXHRcdFx0c3R5bGUubWluV2lkdGggPSBtaW5XaWR0aDtcblx0XHRcdHN0eWxlLm1heFdpZHRoID0gbWF4V2lkdGg7XG5cdFx0fVxuXHR9XG5cblx0cmV0dXJuIHJldCAhPT0gdW5kZWZpbmVkID9cblxuXHRcdC8vIFN1cHBvcnQ6IElFOS0xMStcblx0XHQvLyBJRSByZXR1cm5zIHpJbmRleCB2YWx1ZSBhcyBhbiBpbnRlZ2VyLlxuXHRcdHJldCArIFwiXCIgOlxuXHRcdHJldDtcbn1cblxuXG5mdW5jdGlvbiBhZGRHZXRIb29rSWYoIGNvbmRpdGlvbkZuLCBob29rRm4gKSB7XG5cblx0Ly8gRGVmaW5lIHRoZSBob29rLCB3ZSdsbCBjaGVjayBvbiB0aGUgZmlyc3QgcnVuIGlmIGl0J3MgcmVhbGx5IG5lZWRlZC5cblx0cmV0dXJuIHtcblx0XHRnZXQ6IGZ1bmN0aW9uKCkge1xuXHRcdFx0aWYgKCBjb25kaXRpb25GbigpICkge1xuXG5cdFx0XHRcdC8vIEhvb2sgbm90IG5lZWRlZCAob3IgaXQncyBub3QgcG9zc2libGUgdG8gdXNlIGl0IGR1ZVxuXHRcdFx0XHQvLyB0byBtaXNzaW5nIGRlcGVuZGVuY3kpLCByZW1vdmUgaXQuXG5cdFx0XHRcdGRlbGV0ZSB0aGlzLmdldDtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBIb29rIG5lZWRlZDsgcmVkZWZpbmUgaXQgc28gdGhhdCB0aGUgc3VwcG9ydCB0ZXN0IGlzIG5vdCBleGVjdXRlZCBhZ2Fpbi5cblx0XHRcdHJldHVybiAoIHRoaXMuZ2V0ID0gaG9va0ZuICkuYXBwbHkoIHRoaXMsIGFyZ3VtZW50cyApO1xuXHRcdH1cblx0fTtcbn1cblxuXG52YXJcblxuXHQvLyBTd2FwcGFibGUgaWYgZGlzcGxheSBpcyBub25lIG9yIHN0YXJ0cyB3aXRoIHRhYmxlXG5cdC8vIGV4Y2VwdCBcInRhYmxlXCIsIFwidGFibGUtY2VsbFwiLCBvciBcInRhYmxlLWNhcHRpb25cIlxuXHQvLyBTZWUgaGVyZSBmb3IgZGlzcGxheSB2YWx1ZXM6IGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvQ1NTL2Rpc3BsYXlcblx0cmRpc3BsYXlzd2FwID0gL14obm9uZXx0YWJsZSg/IS1jW2VhXSkuKykvLFxuXG5cdGNzc1Nob3cgPSB7IHBvc2l0aW9uOiBcImFic29sdXRlXCIsIHZpc2liaWxpdHk6IFwiaGlkZGVuXCIsIGRpc3BsYXk6IFwiYmxvY2tcIiB9LFxuXHRjc3NOb3JtYWxUcmFuc2Zvcm0gPSB7XG5cdFx0bGV0dGVyU3BhY2luZzogXCIwXCIsXG5cdFx0Zm9udFdlaWdodDogXCI0MDBcIlxuXHR9LFxuXG5cdGNzc1ByZWZpeGVzID0gWyBcIldlYmtpdFwiLCBcIk9cIiwgXCJNb3pcIiwgXCJtc1wiIF0sXG5cdGVtcHR5U3R5bGUgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCBcImRpdlwiICkuc3R5bGU7XG5cbi8vIFJldHVybiBhIGNzcyBwcm9wZXJ0eSBtYXBwZWQgdG8gYSBwb3RlbnRpYWxseSB2ZW5kb3IgcHJlZml4ZWQgcHJvcGVydHlcbmZ1bmN0aW9uIHZlbmRvclByb3BOYW1lKCBuYW1lICkge1xuXG5cdC8vIFNob3J0Y3V0IGZvciBuYW1lcyB0aGF0IGFyZSBub3QgdmVuZG9yIHByZWZpeGVkXG5cdGlmICggbmFtZSBpbiBlbXB0eVN0eWxlICkge1xuXHRcdHJldHVybiBuYW1lO1xuXHR9XG5cblx0Ly8gQ2hlY2sgZm9yIHZlbmRvciBwcmVmaXhlZCBuYW1lc1xuXHR2YXIgY2FwTmFtZSA9IG5hbWVbIDAgXS50b1VwcGVyQ2FzZSgpICsgbmFtZS5zbGljZSggMSApLFxuXHRcdGkgPSBjc3NQcmVmaXhlcy5sZW5ndGg7XG5cblx0d2hpbGUgKCBpLS0gKSB7XG5cdFx0bmFtZSA9IGNzc1ByZWZpeGVzWyBpIF0gKyBjYXBOYW1lO1xuXHRcdGlmICggbmFtZSBpbiBlbXB0eVN0eWxlICkge1xuXHRcdFx0cmV0dXJuIG5hbWU7XG5cdFx0fVxuXHR9XG59XG5cbmZ1bmN0aW9uIHNldFBvc2l0aXZlTnVtYmVyKCBlbGVtLCB2YWx1ZSwgc3VidHJhY3QgKSB7XG5cblx0Ly8gQW55IHJlbGF0aXZlICgrLy0pIHZhbHVlcyBoYXZlIGFscmVhZHkgYmVlblxuXHQvLyBub3JtYWxpemVkIGF0IHRoaXMgcG9pbnRcblx0dmFyIG1hdGNoZXMgPSByY3NzTnVtLmV4ZWMoIHZhbHVlICk7XG5cdHJldHVybiBtYXRjaGVzID9cblxuXHRcdC8vIEd1YXJkIGFnYWluc3QgdW5kZWZpbmVkIFwic3VidHJhY3RcIiwgZS5nLiwgd2hlbiB1c2VkIGFzIGluIGNzc0hvb2tzXG5cdFx0TWF0aC5tYXgoIDAsIG1hdGNoZXNbIDIgXSAtICggc3VidHJhY3QgfHwgMCApICkgKyAoIG1hdGNoZXNbIDMgXSB8fCBcInB4XCIgKSA6XG5cdFx0dmFsdWU7XG59XG5cbmZ1bmN0aW9uIGF1Z21lbnRXaWR0aE9ySGVpZ2h0KCBlbGVtLCBuYW1lLCBleHRyYSwgaXNCb3JkZXJCb3gsIHN0eWxlcyApIHtcblx0dmFyIGkgPSBleHRyYSA9PT0gKCBpc0JvcmRlckJveCA/IFwiYm9yZGVyXCIgOiBcImNvbnRlbnRcIiApID9cblxuXHRcdC8vIElmIHdlIGFscmVhZHkgaGF2ZSB0aGUgcmlnaHQgbWVhc3VyZW1lbnQsIGF2b2lkIGF1Z21lbnRhdGlvblxuXHRcdDQgOlxuXG5cdFx0Ly8gT3RoZXJ3aXNlIGluaXRpYWxpemUgZm9yIGhvcml6b250YWwgb3IgdmVydGljYWwgcHJvcGVydGllc1xuXHRcdG5hbWUgPT09IFwid2lkdGhcIiA/IDEgOiAwLFxuXG5cdFx0dmFsID0gMDtcblxuXHRmb3IgKCA7IGkgPCA0OyBpICs9IDIgKSB7XG5cblx0XHQvLyBCb3RoIGJveCBtb2RlbHMgZXhjbHVkZSBtYXJnaW4sIHNvIGFkZCBpdCBpZiB3ZSB3YW50IGl0XG5cdFx0aWYgKCBleHRyYSA9PT0gXCJtYXJnaW5cIiApIHtcblx0XHRcdHZhbCArPSBqUXVlcnkuY3NzKCBlbGVtLCBleHRyYSArIGNzc0V4cGFuZFsgaSBdLCB0cnVlLCBzdHlsZXMgKTtcblx0XHR9XG5cblx0XHRpZiAoIGlzQm9yZGVyQm94ICkge1xuXG5cdFx0XHQvLyBib3JkZXItYm94IGluY2x1ZGVzIHBhZGRpbmcsIHNvIHJlbW92ZSBpdCBpZiB3ZSB3YW50IGNvbnRlbnRcblx0XHRcdGlmICggZXh0cmEgPT09IFwiY29udGVudFwiICkge1xuXHRcdFx0XHR2YWwgLT0galF1ZXJ5LmNzcyggZWxlbSwgXCJwYWRkaW5nXCIgKyBjc3NFeHBhbmRbIGkgXSwgdHJ1ZSwgc3R5bGVzICk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIEF0IHRoaXMgcG9pbnQsIGV4dHJhIGlzbid0IGJvcmRlciBub3IgbWFyZ2luLCBzbyByZW1vdmUgYm9yZGVyXG5cdFx0XHRpZiAoIGV4dHJhICE9PSBcIm1hcmdpblwiICkge1xuXHRcdFx0XHR2YWwgLT0galF1ZXJ5LmNzcyggZWxlbSwgXCJib3JkZXJcIiArIGNzc0V4cGFuZFsgaSBdICsgXCJXaWR0aFwiLCB0cnVlLCBzdHlsZXMgKTtcblx0XHRcdH1cblx0XHR9IGVsc2Uge1xuXG5cdFx0XHQvLyBBdCB0aGlzIHBvaW50LCBleHRyYSBpc24ndCBjb250ZW50LCBzbyBhZGQgcGFkZGluZ1xuXHRcdFx0dmFsICs9IGpRdWVyeS5jc3MoIGVsZW0sIFwicGFkZGluZ1wiICsgY3NzRXhwYW5kWyBpIF0sIHRydWUsIHN0eWxlcyApO1xuXG5cdFx0XHQvLyBBdCB0aGlzIHBvaW50LCBleHRyYSBpc24ndCBjb250ZW50IG5vciBwYWRkaW5nLCBzbyBhZGQgYm9yZGVyXG5cdFx0XHRpZiAoIGV4dHJhICE9PSBcInBhZGRpbmdcIiApIHtcblx0XHRcdFx0dmFsICs9IGpRdWVyeS5jc3MoIGVsZW0sIFwiYm9yZGVyXCIgKyBjc3NFeHBhbmRbIGkgXSArIFwiV2lkdGhcIiwgdHJ1ZSwgc3R5bGVzICk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0cmV0dXJuIHZhbDtcbn1cblxuZnVuY3Rpb24gZ2V0V2lkdGhPckhlaWdodCggZWxlbSwgbmFtZSwgZXh0cmEgKSB7XG5cblx0Ly8gU3RhcnQgd2l0aCBvZmZzZXQgcHJvcGVydHksIHdoaWNoIGlzIGVxdWl2YWxlbnQgdG8gdGhlIGJvcmRlci1ib3ggdmFsdWVcblx0dmFyIHZhbHVlSXNCb3JkZXJCb3ggPSB0cnVlLFxuXHRcdHZhbCA9IG5hbWUgPT09IFwid2lkdGhcIiA/IGVsZW0ub2Zmc2V0V2lkdGggOiBlbGVtLm9mZnNldEhlaWdodCxcblx0XHRzdHlsZXMgPSBnZXRTdHlsZXMoIGVsZW0gKSxcblx0XHRpc0JvcmRlckJveCA9IGpRdWVyeS5jc3MoIGVsZW0sIFwiYm94U2l6aW5nXCIsIGZhbHNlLCBzdHlsZXMgKSA9PT0gXCJib3JkZXItYm94XCI7XG5cblx0Ly8gU29tZSBub24taHRtbCBlbGVtZW50cyByZXR1cm4gdW5kZWZpbmVkIGZvciBvZmZzZXRXaWR0aCwgc28gY2hlY2sgZm9yIG51bGwvdW5kZWZpbmVkXG5cdC8vIHN2ZyAtIGh0dHBzOi8vYnVnemlsbGEubW96aWxsYS5vcmcvc2hvd19idWcuY2dpP2lkPTY0OTI4NVxuXHQvLyBNYXRoTUwgLSBodHRwczovL2J1Z3ppbGxhLm1vemlsbGEub3JnL3Nob3dfYnVnLmNnaT9pZD00OTE2Njhcblx0aWYgKCB2YWwgPD0gMCB8fCB2YWwgPT0gbnVsbCApIHtcblxuXHRcdC8vIEZhbGwgYmFjayB0byBjb21wdXRlZCB0aGVuIHVuY29tcHV0ZWQgY3NzIGlmIG5lY2Vzc2FyeVxuXHRcdHZhbCA9IGN1ckNTUyggZWxlbSwgbmFtZSwgc3R5bGVzICk7XG5cdFx0aWYgKCB2YWwgPCAwIHx8IHZhbCA9PSBudWxsICkge1xuXHRcdFx0dmFsID0gZWxlbS5zdHlsZVsgbmFtZSBdO1xuXHRcdH1cblxuXHRcdC8vIENvbXB1dGVkIHVuaXQgaXMgbm90IHBpeGVscy4gU3RvcCBoZXJlIGFuZCByZXR1cm4uXG5cdFx0aWYgKCBybnVtbm9ucHgudGVzdCggdmFsICkgKSB7XG5cdFx0XHRyZXR1cm4gdmFsO1xuXHRcdH1cblxuXHRcdC8vIENoZWNrIGZvciBzdHlsZSBpbiBjYXNlIGEgYnJvd3NlciB3aGljaCByZXR1cm5zIHVucmVsaWFibGUgdmFsdWVzXG5cdFx0Ly8gZm9yIGdldENvbXB1dGVkU3R5bGUgc2lsZW50bHkgZmFsbHMgYmFjayB0byB0aGUgcmVsaWFibGUgZWxlbS5zdHlsZVxuXHRcdHZhbHVlSXNCb3JkZXJCb3ggPSBpc0JvcmRlckJveCAmJlxuXHRcdFx0KCBzdXBwb3J0LmJveFNpemluZ1JlbGlhYmxlKCkgfHwgdmFsID09PSBlbGVtLnN0eWxlWyBuYW1lIF0gKTtcblxuXHRcdC8vIE5vcm1hbGl6ZSBcIlwiLCBhdXRvLCBhbmQgcHJlcGFyZSBmb3IgZXh0cmFcblx0XHR2YWwgPSBwYXJzZUZsb2F0KCB2YWwgKSB8fCAwO1xuXHR9XG5cblx0Ly8gVXNlIHRoZSBhY3RpdmUgYm94LXNpemluZyBtb2RlbCB0byBhZGQvc3VidHJhY3QgaXJyZWxldmFudCBzdHlsZXNcblx0cmV0dXJuICggdmFsICtcblx0XHRhdWdtZW50V2lkdGhPckhlaWdodChcblx0XHRcdGVsZW0sXG5cdFx0XHRuYW1lLFxuXHRcdFx0ZXh0cmEgfHwgKCBpc0JvcmRlckJveCA/IFwiYm9yZGVyXCIgOiBcImNvbnRlbnRcIiApLFxuXHRcdFx0dmFsdWVJc0JvcmRlckJveCxcblx0XHRcdHN0eWxlc1xuXHRcdClcblx0KSArIFwicHhcIjtcbn1cblxuZnVuY3Rpb24gc2hvd0hpZGUoIGVsZW1lbnRzLCBzaG93ICkge1xuXHR2YXIgZGlzcGxheSwgZWxlbSwgaGlkZGVuLFxuXHRcdHZhbHVlcyA9IFtdLFxuXHRcdGluZGV4ID0gMCxcblx0XHRsZW5ndGggPSBlbGVtZW50cy5sZW5ndGg7XG5cblx0Zm9yICggOyBpbmRleCA8IGxlbmd0aDsgaW5kZXgrKyApIHtcblx0XHRlbGVtID0gZWxlbWVudHNbIGluZGV4IF07XG5cdFx0aWYgKCAhZWxlbS5zdHlsZSApIHtcblx0XHRcdGNvbnRpbnVlO1xuXHRcdH1cblxuXHRcdHZhbHVlc1sgaW5kZXggXSA9IGRhdGFQcml2LmdldCggZWxlbSwgXCJvbGRkaXNwbGF5XCIgKTtcblx0XHRkaXNwbGF5ID0gZWxlbS5zdHlsZS5kaXNwbGF5O1xuXHRcdGlmICggc2hvdyApIHtcblxuXHRcdFx0Ly8gUmVzZXQgdGhlIGlubGluZSBkaXNwbGF5IG9mIHRoaXMgZWxlbWVudCB0byBsZWFybiBpZiBpdCBpc1xuXHRcdFx0Ly8gYmVpbmcgaGlkZGVuIGJ5IGNhc2NhZGVkIHJ1bGVzIG9yIG5vdFxuXHRcdFx0aWYgKCAhdmFsdWVzWyBpbmRleCBdICYmIGRpc3BsYXkgPT09IFwibm9uZVwiICkge1xuXHRcdFx0XHRlbGVtLnN0eWxlLmRpc3BsYXkgPSBcIlwiO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBTZXQgZWxlbWVudHMgd2hpY2ggaGF2ZSBiZWVuIG92ZXJyaWRkZW4gd2l0aCBkaXNwbGF5OiBub25lXG5cdFx0XHQvLyBpbiBhIHN0eWxlc2hlZXQgdG8gd2hhdGV2ZXIgdGhlIGRlZmF1bHQgYnJvd3NlciBzdHlsZSBpc1xuXHRcdFx0Ly8gZm9yIHN1Y2ggYW4gZWxlbWVudFxuXHRcdFx0aWYgKCBlbGVtLnN0eWxlLmRpc3BsYXkgPT09IFwiXCIgJiYgaXNIaWRkZW4oIGVsZW0gKSApIHtcblx0XHRcdFx0dmFsdWVzWyBpbmRleCBdID0gZGF0YVByaXYuYWNjZXNzKFxuXHRcdFx0XHRcdGVsZW0sXG5cdFx0XHRcdFx0XCJvbGRkaXNwbGF5XCIsXG5cdFx0XHRcdFx0ZGVmYXVsdERpc3BsYXkoIGVsZW0ubm9kZU5hbWUgKVxuXHRcdFx0XHQpO1xuXHRcdFx0fVxuXHRcdH0gZWxzZSB7XG5cdFx0XHRoaWRkZW4gPSBpc0hpZGRlbiggZWxlbSApO1xuXG5cdFx0XHRpZiAoIGRpc3BsYXkgIT09IFwibm9uZVwiIHx8ICFoaWRkZW4gKSB7XG5cdFx0XHRcdGRhdGFQcml2LnNldChcblx0XHRcdFx0XHRlbGVtLFxuXHRcdFx0XHRcdFwib2xkZGlzcGxheVwiLFxuXHRcdFx0XHRcdGhpZGRlbiA/IGRpc3BsYXkgOiBqUXVlcnkuY3NzKCBlbGVtLCBcImRpc3BsYXlcIiApXG5cdFx0XHRcdCk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0Ly8gU2V0IHRoZSBkaXNwbGF5IG9mIG1vc3Qgb2YgdGhlIGVsZW1lbnRzIGluIGEgc2Vjb25kIGxvb3Bcblx0Ly8gdG8gYXZvaWQgdGhlIGNvbnN0YW50IHJlZmxvd1xuXHRmb3IgKCBpbmRleCA9IDA7IGluZGV4IDwgbGVuZ3RoOyBpbmRleCsrICkge1xuXHRcdGVsZW0gPSBlbGVtZW50c1sgaW5kZXggXTtcblx0XHRpZiAoICFlbGVtLnN0eWxlICkge1xuXHRcdFx0Y29udGludWU7XG5cdFx0fVxuXHRcdGlmICggIXNob3cgfHwgZWxlbS5zdHlsZS5kaXNwbGF5ID09PSBcIm5vbmVcIiB8fCBlbGVtLnN0eWxlLmRpc3BsYXkgPT09IFwiXCIgKSB7XG5cdFx0XHRlbGVtLnN0eWxlLmRpc3BsYXkgPSBzaG93ID8gdmFsdWVzWyBpbmRleCBdIHx8IFwiXCIgOiBcIm5vbmVcIjtcblx0XHR9XG5cdH1cblxuXHRyZXR1cm4gZWxlbWVudHM7XG59XG5cbmpRdWVyeS5leHRlbmQoIHtcblxuXHQvLyBBZGQgaW4gc3R5bGUgcHJvcGVydHkgaG9va3MgZm9yIG92ZXJyaWRpbmcgdGhlIGRlZmF1bHRcblx0Ly8gYmVoYXZpb3Igb2YgZ2V0dGluZyBhbmQgc2V0dGluZyBhIHN0eWxlIHByb3BlcnR5XG5cdGNzc0hvb2tzOiB7XG5cdFx0b3BhY2l0eToge1xuXHRcdFx0Z2V0OiBmdW5jdGlvbiggZWxlbSwgY29tcHV0ZWQgKSB7XG5cdFx0XHRcdGlmICggY29tcHV0ZWQgKSB7XG5cblx0XHRcdFx0XHQvLyBXZSBzaG91bGQgYWx3YXlzIGdldCBhIG51bWJlciBiYWNrIGZyb20gb3BhY2l0eVxuXHRcdFx0XHRcdHZhciByZXQgPSBjdXJDU1MoIGVsZW0sIFwib3BhY2l0eVwiICk7XG5cdFx0XHRcdFx0cmV0dXJuIHJldCA9PT0gXCJcIiA/IFwiMVwiIDogcmV0O1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXHR9LFxuXG5cdC8vIERvbid0IGF1dG9tYXRpY2FsbHkgYWRkIFwicHhcIiB0byB0aGVzZSBwb3NzaWJseS11bml0bGVzcyBwcm9wZXJ0aWVzXG5cdGNzc051bWJlcjoge1xuXHRcdFwiYW5pbWF0aW9uSXRlcmF0aW9uQ291bnRcIjogdHJ1ZSxcblx0XHRcImNvbHVtbkNvdW50XCI6IHRydWUsXG5cdFx0XCJmaWxsT3BhY2l0eVwiOiB0cnVlLFxuXHRcdFwiZmxleEdyb3dcIjogdHJ1ZSxcblx0XHRcImZsZXhTaHJpbmtcIjogdHJ1ZSxcblx0XHRcImZvbnRXZWlnaHRcIjogdHJ1ZSxcblx0XHRcImxpbmVIZWlnaHRcIjogdHJ1ZSxcblx0XHRcIm9wYWNpdHlcIjogdHJ1ZSxcblx0XHRcIm9yZGVyXCI6IHRydWUsXG5cdFx0XCJvcnBoYW5zXCI6IHRydWUsXG5cdFx0XCJ3aWRvd3NcIjogdHJ1ZSxcblx0XHRcInpJbmRleFwiOiB0cnVlLFxuXHRcdFwiem9vbVwiOiB0cnVlXG5cdH0sXG5cblx0Ly8gQWRkIGluIHByb3BlcnRpZXMgd2hvc2UgbmFtZXMgeW91IHdpc2ggdG8gZml4IGJlZm9yZVxuXHQvLyBzZXR0aW5nIG9yIGdldHRpbmcgdGhlIHZhbHVlXG5cdGNzc1Byb3BzOiB7XG5cdFx0XCJmbG9hdFwiOiBcImNzc0Zsb2F0XCJcblx0fSxcblxuXHQvLyBHZXQgYW5kIHNldCB0aGUgc3R5bGUgcHJvcGVydHkgb24gYSBET00gTm9kZVxuXHRzdHlsZTogZnVuY3Rpb24oIGVsZW0sIG5hbWUsIHZhbHVlLCBleHRyYSApIHtcblxuXHRcdC8vIERvbid0IHNldCBzdHlsZXMgb24gdGV4dCBhbmQgY29tbWVudCBub2Rlc1xuXHRcdGlmICggIWVsZW0gfHwgZWxlbS5ub2RlVHlwZSA9PT0gMyB8fCBlbGVtLm5vZGVUeXBlID09PSA4IHx8ICFlbGVtLnN0eWxlICkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdC8vIE1ha2Ugc3VyZSB0aGF0IHdlJ3JlIHdvcmtpbmcgd2l0aCB0aGUgcmlnaHQgbmFtZVxuXHRcdHZhciByZXQsIHR5cGUsIGhvb2tzLFxuXHRcdFx0b3JpZ05hbWUgPSBqUXVlcnkuY2FtZWxDYXNlKCBuYW1lICksXG5cdFx0XHRzdHlsZSA9IGVsZW0uc3R5bGU7XG5cblx0XHRuYW1lID0galF1ZXJ5LmNzc1Byb3BzWyBvcmlnTmFtZSBdIHx8XG5cdFx0XHQoIGpRdWVyeS5jc3NQcm9wc1sgb3JpZ05hbWUgXSA9IHZlbmRvclByb3BOYW1lKCBvcmlnTmFtZSApIHx8IG9yaWdOYW1lICk7XG5cblx0XHQvLyBHZXRzIGhvb2sgZm9yIHRoZSBwcmVmaXhlZCB2ZXJzaW9uLCB0aGVuIHVucHJlZml4ZWQgdmVyc2lvblxuXHRcdGhvb2tzID0galF1ZXJ5LmNzc0hvb2tzWyBuYW1lIF0gfHwgalF1ZXJ5LmNzc0hvb2tzWyBvcmlnTmFtZSBdO1xuXG5cdFx0Ly8gQ2hlY2sgaWYgd2UncmUgc2V0dGluZyBhIHZhbHVlXG5cdFx0aWYgKCB2YWx1ZSAhPT0gdW5kZWZpbmVkICkge1xuXHRcdFx0dHlwZSA9IHR5cGVvZiB2YWx1ZTtcblxuXHRcdFx0Ly8gQ29udmVydCBcIis9XCIgb3IgXCItPVwiIHRvIHJlbGF0aXZlIG51bWJlcnMgKCM3MzQ1KVxuXHRcdFx0aWYgKCB0eXBlID09PSBcInN0cmluZ1wiICYmICggcmV0ID0gcmNzc051bS5leGVjKCB2YWx1ZSApICkgJiYgcmV0WyAxIF0gKSB7XG5cdFx0XHRcdHZhbHVlID0gYWRqdXN0Q1NTKCBlbGVtLCBuYW1lLCByZXQgKTtcblxuXHRcdFx0XHQvLyBGaXhlcyBidWcgIzkyMzdcblx0XHRcdFx0dHlwZSA9IFwibnVtYmVyXCI7XG5cdFx0XHR9XG5cblx0XHRcdC8vIE1ha2Ugc3VyZSB0aGF0IG51bGwgYW5kIE5hTiB2YWx1ZXMgYXJlbid0IHNldCAoIzcxMTYpXG5cdFx0XHRpZiAoIHZhbHVlID09IG51bGwgfHwgdmFsdWUgIT09IHZhbHVlICkge1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cblx0XHRcdC8vIElmIGEgbnVtYmVyIHdhcyBwYXNzZWQgaW4sIGFkZCB0aGUgdW5pdCAoZXhjZXB0IGZvciBjZXJ0YWluIENTUyBwcm9wZXJ0aWVzKVxuXHRcdFx0aWYgKCB0eXBlID09PSBcIm51bWJlclwiICkge1xuXHRcdFx0XHR2YWx1ZSArPSByZXQgJiYgcmV0WyAzIF0gfHwgKCBqUXVlcnkuY3NzTnVtYmVyWyBvcmlnTmFtZSBdID8gXCJcIiA6IFwicHhcIiApO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBTdXBwb3J0OiBJRTktMTErXG5cdFx0XHQvLyBiYWNrZ3JvdW5kLSogcHJvcHMgYWZmZWN0IG9yaWdpbmFsIGNsb25lJ3MgdmFsdWVzXG5cdFx0XHRpZiAoICFzdXBwb3J0LmNsZWFyQ2xvbmVTdHlsZSAmJiB2YWx1ZSA9PT0gXCJcIiAmJiBuYW1lLmluZGV4T2YoIFwiYmFja2dyb3VuZFwiICkgPT09IDAgKSB7XG5cdFx0XHRcdHN0eWxlWyBuYW1lIF0gPSBcImluaGVyaXRcIjtcblx0XHRcdH1cblxuXHRcdFx0Ly8gSWYgYSBob29rIHdhcyBwcm92aWRlZCwgdXNlIHRoYXQgdmFsdWUsIG90aGVyd2lzZSBqdXN0IHNldCB0aGUgc3BlY2lmaWVkIHZhbHVlXG5cdFx0XHRpZiAoICFob29rcyB8fCAhKCBcInNldFwiIGluIGhvb2tzICkgfHxcblx0XHRcdFx0KCB2YWx1ZSA9IGhvb2tzLnNldCggZWxlbSwgdmFsdWUsIGV4dHJhICkgKSAhPT0gdW5kZWZpbmVkICkge1xuXG5cdFx0XHRcdHN0eWxlWyBuYW1lIF0gPSB2YWx1ZTtcblx0XHRcdH1cblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdC8vIElmIGEgaG9vayB3YXMgcHJvdmlkZWQgZ2V0IHRoZSBub24tY29tcHV0ZWQgdmFsdWUgZnJvbSB0aGVyZVxuXHRcdFx0aWYgKCBob29rcyAmJiBcImdldFwiIGluIGhvb2tzICYmXG5cdFx0XHRcdCggcmV0ID0gaG9va3MuZ2V0KCBlbGVtLCBmYWxzZSwgZXh0cmEgKSApICE9PSB1bmRlZmluZWQgKSB7XG5cblx0XHRcdFx0cmV0dXJuIHJldDtcblx0XHRcdH1cblxuXHRcdFx0Ly8gT3RoZXJ3aXNlIGp1c3QgZ2V0IHRoZSB2YWx1ZSBmcm9tIHRoZSBzdHlsZSBvYmplY3Rcblx0XHRcdHJldHVybiBzdHlsZVsgbmFtZSBdO1xuXHRcdH1cblx0fSxcblxuXHRjc3M6IGZ1bmN0aW9uKCBlbGVtLCBuYW1lLCBleHRyYSwgc3R5bGVzICkge1xuXHRcdHZhciB2YWwsIG51bSwgaG9va3MsXG5cdFx0XHRvcmlnTmFtZSA9IGpRdWVyeS5jYW1lbENhc2UoIG5hbWUgKTtcblxuXHRcdC8vIE1ha2Ugc3VyZSB0aGF0IHdlJ3JlIHdvcmtpbmcgd2l0aCB0aGUgcmlnaHQgbmFtZVxuXHRcdG5hbWUgPSBqUXVlcnkuY3NzUHJvcHNbIG9yaWdOYW1lIF0gfHxcblx0XHRcdCggalF1ZXJ5LmNzc1Byb3BzWyBvcmlnTmFtZSBdID0gdmVuZG9yUHJvcE5hbWUoIG9yaWdOYW1lICkgfHwgb3JpZ05hbWUgKTtcblxuXHRcdC8vIFRyeSBwcmVmaXhlZCBuYW1lIGZvbGxvd2VkIGJ5IHRoZSB1bnByZWZpeGVkIG5hbWVcblx0XHRob29rcyA9IGpRdWVyeS5jc3NIb29rc1sgbmFtZSBdIHx8IGpRdWVyeS5jc3NIb29rc1sgb3JpZ05hbWUgXTtcblxuXHRcdC8vIElmIGEgaG9vayB3YXMgcHJvdmlkZWQgZ2V0IHRoZSBjb21wdXRlZCB2YWx1ZSBmcm9tIHRoZXJlXG5cdFx0aWYgKCBob29rcyAmJiBcImdldFwiIGluIGhvb2tzICkge1xuXHRcdFx0dmFsID0gaG9va3MuZ2V0KCBlbGVtLCB0cnVlLCBleHRyYSApO1xuXHRcdH1cblxuXHRcdC8vIE90aGVyd2lzZSwgaWYgYSB3YXkgdG8gZ2V0IHRoZSBjb21wdXRlZCB2YWx1ZSBleGlzdHMsIHVzZSB0aGF0XG5cdFx0aWYgKCB2YWwgPT09IHVuZGVmaW5lZCApIHtcblx0XHRcdHZhbCA9IGN1ckNTUyggZWxlbSwgbmFtZSwgc3R5bGVzICk7XG5cdFx0fVxuXG5cdFx0Ly8gQ29udmVydCBcIm5vcm1hbFwiIHRvIGNvbXB1dGVkIHZhbHVlXG5cdFx0aWYgKCB2YWwgPT09IFwibm9ybWFsXCIgJiYgbmFtZSBpbiBjc3NOb3JtYWxUcmFuc2Zvcm0gKSB7XG5cdFx0XHR2YWwgPSBjc3NOb3JtYWxUcmFuc2Zvcm1bIG5hbWUgXTtcblx0XHR9XG5cblx0XHQvLyBNYWtlIG51bWVyaWMgaWYgZm9yY2VkIG9yIGEgcXVhbGlmaWVyIHdhcyBwcm92aWRlZCBhbmQgdmFsIGxvb2tzIG51bWVyaWNcblx0XHRpZiAoIGV4dHJhID09PSBcIlwiIHx8IGV4dHJhICkge1xuXHRcdFx0bnVtID0gcGFyc2VGbG9hdCggdmFsICk7XG5cdFx0XHRyZXR1cm4gZXh0cmEgPT09IHRydWUgfHwgaXNGaW5pdGUoIG51bSApID8gbnVtIHx8IDAgOiB2YWw7XG5cdFx0fVxuXHRcdHJldHVybiB2YWw7XG5cdH1cbn0gKTtcblxualF1ZXJ5LmVhY2goIFsgXCJoZWlnaHRcIiwgXCJ3aWR0aFwiIF0sIGZ1bmN0aW9uKCBpLCBuYW1lICkge1xuXHRqUXVlcnkuY3NzSG9va3NbIG5hbWUgXSA9IHtcblx0XHRnZXQ6IGZ1bmN0aW9uKCBlbGVtLCBjb21wdXRlZCwgZXh0cmEgKSB7XG5cdFx0XHRpZiAoIGNvbXB1dGVkICkge1xuXG5cdFx0XHRcdC8vIENlcnRhaW4gZWxlbWVudHMgY2FuIGhhdmUgZGltZW5zaW9uIGluZm8gaWYgd2UgaW52aXNpYmx5IHNob3cgdGhlbVxuXHRcdFx0XHQvLyBidXQgaXQgbXVzdCBoYXZlIGEgY3VycmVudCBkaXNwbGF5IHN0eWxlIHRoYXQgd291bGQgYmVuZWZpdFxuXHRcdFx0XHRyZXR1cm4gcmRpc3BsYXlzd2FwLnRlc3QoIGpRdWVyeS5jc3MoIGVsZW0sIFwiZGlzcGxheVwiICkgKSAmJlxuXHRcdFx0XHRcdGVsZW0ub2Zmc2V0V2lkdGggPT09IDAgP1xuXHRcdFx0XHRcdFx0c3dhcCggZWxlbSwgY3NzU2hvdywgZnVuY3Rpb24oKSB7XG5cdFx0XHRcdFx0XHRcdHJldHVybiBnZXRXaWR0aE9ySGVpZ2h0KCBlbGVtLCBuYW1lLCBleHRyYSApO1xuXHRcdFx0XHRcdFx0fSApIDpcblx0XHRcdFx0XHRcdGdldFdpZHRoT3JIZWlnaHQoIGVsZW0sIG5hbWUsIGV4dHJhICk7XG5cdFx0XHR9XG5cdFx0fSxcblxuXHRcdHNldDogZnVuY3Rpb24oIGVsZW0sIHZhbHVlLCBleHRyYSApIHtcblx0XHRcdHZhciBtYXRjaGVzLFxuXHRcdFx0XHRzdHlsZXMgPSBleHRyYSAmJiBnZXRTdHlsZXMoIGVsZW0gKSxcblx0XHRcdFx0c3VidHJhY3QgPSBleHRyYSAmJiBhdWdtZW50V2lkdGhPckhlaWdodChcblx0XHRcdFx0XHRlbGVtLFxuXHRcdFx0XHRcdG5hbWUsXG5cdFx0XHRcdFx0ZXh0cmEsXG5cdFx0XHRcdFx0alF1ZXJ5LmNzcyggZWxlbSwgXCJib3hTaXppbmdcIiwgZmFsc2UsIHN0eWxlcyApID09PSBcImJvcmRlci1ib3hcIixcblx0XHRcdFx0XHRzdHlsZXNcblx0XHRcdFx0KTtcblxuXHRcdFx0Ly8gQ29udmVydCB0byBwaXhlbHMgaWYgdmFsdWUgYWRqdXN0bWVudCBpcyBuZWVkZWRcblx0XHRcdGlmICggc3VidHJhY3QgJiYgKCBtYXRjaGVzID0gcmNzc051bS5leGVjKCB2YWx1ZSApICkgJiZcblx0XHRcdFx0KCBtYXRjaGVzWyAzIF0gfHwgXCJweFwiICkgIT09IFwicHhcIiApIHtcblxuXHRcdFx0XHRlbGVtLnN0eWxlWyBuYW1lIF0gPSB2YWx1ZTtcblx0XHRcdFx0dmFsdWUgPSBqUXVlcnkuY3NzKCBlbGVtLCBuYW1lICk7XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiBzZXRQb3NpdGl2ZU51bWJlciggZWxlbSwgdmFsdWUsIHN1YnRyYWN0ICk7XG5cdFx0fVxuXHR9O1xufSApO1xuXG5qUXVlcnkuY3NzSG9va3MubWFyZ2luTGVmdCA9IGFkZEdldEhvb2tJZiggc3VwcG9ydC5yZWxpYWJsZU1hcmdpbkxlZnQsXG5cdGZ1bmN0aW9uKCBlbGVtLCBjb21wdXRlZCApIHtcblx0XHRpZiAoIGNvbXB1dGVkICkge1xuXHRcdFx0cmV0dXJuICggcGFyc2VGbG9hdCggY3VyQ1NTKCBlbGVtLCBcIm1hcmdpbkxlZnRcIiApICkgfHxcblx0XHRcdFx0ZWxlbS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5sZWZ0IC1cblx0XHRcdFx0XHRzd2FwKCBlbGVtLCB7IG1hcmdpbkxlZnQ6IDAgfSwgZnVuY3Rpb24oKSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gZWxlbS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKS5sZWZ0O1xuXHRcdFx0XHRcdH0gKVxuXHRcdFx0XHQpICsgXCJweFwiO1xuXHRcdH1cblx0fVxuKTtcblxuLy8gU3VwcG9ydDogQW5kcm9pZCAyLjNcbmpRdWVyeS5jc3NIb29rcy5tYXJnaW5SaWdodCA9IGFkZEdldEhvb2tJZiggc3VwcG9ydC5yZWxpYWJsZU1hcmdpblJpZ2h0LFxuXHRmdW5jdGlvbiggZWxlbSwgY29tcHV0ZWQgKSB7XG5cdFx0aWYgKCBjb21wdXRlZCApIHtcblx0XHRcdHJldHVybiBzd2FwKCBlbGVtLCB7IFwiZGlzcGxheVwiOiBcImlubGluZS1ibG9ja1wiIH0sXG5cdFx0XHRcdGN1ckNTUywgWyBlbGVtLCBcIm1hcmdpblJpZ2h0XCIgXSApO1xuXHRcdH1cblx0fVxuKTtcblxuLy8gVGhlc2UgaG9va3MgYXJlIHVzZWQgYnkgYW5pbWF0ZSB0byBleHBhbmQgcHJvcGVydGllc1xualF1ZXJ5LmVhY2goIHtcblx0bWFyZ2luOiBcIlwiLFxuXHRwYWRkaW5nOiBcIlwiLFxuXHRib3JkZXI6IFwiV2lkdGhcIlxufSwgZnVuY3Rpb24oIHByZWZpeCwgc3VmZml4ICkge1xuXHRqUXVlcnkuY3NzSG9va3NbIHByZWZpeCArIHN1ZmZpeCBdID0ge1xuXHRcdGV4cGFuZDogZnVuY3Rpb24oIHZhbHVlICkge1xuXHRcdFx0dmFyIGkgPSAwLFxuXHRcdFx0XHRleHBhbmRlZCA9IHt9LFxuXG5cdFx0XHRcdC8vIEFzc3VtZXMgYSBzaW5nbGUgbnVtYmVyIGlmIG5vdCBhIHN0cmluZ1xuXHRcdFx0XHRwYXJ0cyA9IHR5cGVvZiB2YWx1ZSA9PT0gXCJzdHJpbmdcIiA/IHZhbHVlLnNwbGl0KCBcIiBcIiApIDogWyB2YWx1ZSBdO1xuXG5cdFx0XHRmb3IgKCA7IGkgPCA0OyBpKysgKSB7XG5cdFx0XHRcdGV4cGFuZGVkWyBwcmVmaXggKyBjc3NFeHBhbmRbIGkgXSArIHN1ZmZpeCBdID1cblx0XHRcdFx0XHRwYXJ0c1sgaSBdIHx8IHBhcnRzWyBpIC0gMiBdIHx8IHBhcnRzWyAwIF07XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiBleHBhbmRlZDtcblx0XHR9XG5cdH07XG5cblx0aWYgKCAhcm1hcmdpbi50ZXN0KCBwcmVmaXggKSApIHtcblx0XHRqUXVlcnkuY3NzSG9va3NbIHByZWZpeCArIHN1ZmZpeCBdLnNldCA9IHNldFBvc2l0aXZlTnVtYmVyO1xuXHR9XG59ICk7XG5cbmpRdWVyeS5mbi5leHRlbmQoIHtcblx0Y3NzOiBmdW5jdGlvbiggbmFtZSwgdmFsdWUgKSB7XG5cdFx0cmV0dXJuIGFjY2VzcyggdGhpcywgZnVuY3Rpb24oIGVsZW0sIG5hbWUsIHZhbHVlICkge1xuXHRcdFx0dmFyIHN0eWxlcywgbGVuLFxuXHRcdFx0XHRtYXAgPSB7fSxcblx0XHRcdFx0aSA9IDA7XG5cblx0XHRcdGlmICggalF1ZXJ5LmlzQXJyYXkoIG5hbWUgKSApIHtcblx0XHRcdFx0c3R5bGVzID0gZ2V0U3R5bGVzKCBlbGVtICk7XG5cdFx0XHRcdGxlbiA9IG5hbWUubGVuZ3RoO1xuXG5cdFx0XHRcdGZvciAoIDsgaSA8IGxlbjsgaSsrICkge1xuXHRcdFx0XHRcdG1hcFsgbmFtZVsgaSBdIF0gPSBqUXVlcnkuY3NzKCBlbGVtLCBuYW1lWyBpIF0sIGZhbHNlLCBzdHlsZXMgKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdHJldHVybiBtYXA7XG5cdFx0XHR9XG5cblx0XHRcdHJldHVybiB2YWx1ZSAhPT0gdW5kZWZpbmVkID9cblx0XHRcdFx0alF1ZXJ5LnN0eWxlKCBlbGVtLCBuYW1lLCB2YWx1ZSApIDpcblx0XHRcdFx0alF1ZXJ5LmNzcyggZWxlbSwgbmFtZSApO1xuXHRcdH0sIG5hbWUsIHZhbHVlLCBhcmd1bWVudHMubGVuZ3RoID4gMSApO1xuXHR9LFxuXHRzaG93OiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gc2hvd0hpZGUoIHRoaXMsIHRydWUgKTtcblx0fSxcblx0aGlkZTogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIHNob3dIaWRlKCB0aGlzICk7XG5cdH0sXG5cdHRvZ2dsZTogZnVuY3Rpb24oIHN0YXRlICkge1xuXHRcdGlmICggdHlwZW9mIHN0YXRlID09PSBcImJvb2xlYW5cIiApIHtcblx0XHRcdHJldHVybiBzdGF0ZSA/IHRoaXMuc2hvdygpIDogdGhpcy5oaWRlKCk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXMuZWFjaCggZnVuY3Rpb24oKSB7XG5cdFx0XHRpZiAoIGlzSGlkZGVuKCB0aGlzICkgKSB7XG5cdFx0XHRcdGpRdWVyeSggdGhpcyApLnNob3coKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGpRdWVyeSggdGhpcyApLmhpZGUoKTtcblx0XHRcdH1cblx0XHR9ICk7XG5cdH1cbn0gKTtcblxuXG5mdW5jdGlvbiBUd2VlbiggZWxlbSwgb3B0aW9ucywgcHJvcCwgZW5kLCBlYXNpbmcgKSB7XG5cdHJldHVybiBuZXcgVHdlZW4ucHJvdG90eXBlLmluaXQoIGVsZW0sIG9wdGlvbnMsIHByb3AsIGVuZCwgZWFzaW5nICk7XG59XG5qUXVlcnkuVHdlZW4gPSBUd2VlbjtcblxuVHdlZW4ucHJvdG90eXBlID0ge1xuXHRjb25zdHJ1Y3RvcjogVHdlZW4sXG5cdGluaXQ6IGZ1bmN0aW9uKCBlbGVtLCBvcHRpb25zLCBwcm9wLCBlbmQsIGVhc2luZywgdW5pdCApIHtcblx0XHR0aGlzLmVsZW0gPSBlbGVtO1xuXHRcdHRoaXMucHJvcCA9IHByb3A7XG5cdFx0dGhpcy5lYXNpbmcgPSBlYXNpbmcgfHwgalF1ZXJ5LmVhc2luZy5fZGVmYXVsdDtcblx0XHR0aGlzLm9wdGlvbnMgPSBvcHRpb25zO1xuXHRcdHRoaXMuc3RhcnQgPSB0aGlzLm5vdyA9IHRoaXMuY3VyKCk7XG5cdFx0dGhpcy5lbmQgPSBlbmQ7XG5cdFx0dGhpcy51bml0ID0gdW5pdCB8fCAoIGpRdWVyeS5jc3NOdW1iZXJbIHByb3AgXSA/IFwiXCIgOiBcInB4XCIgKTtcblx0fSxcblx0Y3VyOiBmdW5jdGlvbigpIHtcblx0XHR2YXIgaG9va3MgPSBUd2Vlbi5wcm9wSG9va3NbIHRoaXMucHJvcCBdO1xuXG5cdFx0cmV0dXJuIGhvb2tzICYmIGhvb2tzLmdldCA/XG5cdFx0XHRob29rcy5nZXQoIHRoaXMgKSA6XG5cdFx0XHRUd2Vlbi5wcm9wSG9va3MuX2RlZmF1bHQuZ2V0KCB0aGlzICk7XG5cdH0sXG5cdHJ1bjogZnVuY3Rpb24oIHBlcmNlbnQgKSB7XG5cdFx0dmFyIGVhc2VkLFxuXHRcdFx0aG9va3MgPSBUd2Vlbi5wcm9wSG9va3NbIHRoaXMucHJvcCBdO1xuXG5cdFx0aWYgKCB0aGlzLm9wdGlvbnMuZHVyYXRpb24gKSB7XG5cdFx0XHR0aGlzLnBvcyA9IGVhc2VkID0galF1ZXJ5LmVhc2luZ1sgdGhpcy5lYXNpbmcgXShcblx0XHRcdFx0cGVyY2VudCwgdGhpcy5vcHRpb25zLmR1cmF0aW9uICogcGVyY2VudCwgMCwgMSwgdGhpcy5vcHRpb25zLmR1cmF0aW9uXG5cdFx0XHQpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHR0aGlzLnBvcyA9IGVhc2VkID0gcGVyY2VudDtcblx0XHR9XG5cdFx0dGhpcy5ub3cgPSAoIHRoaXMuZW5kIC0gdGhpcy5zdGFydCApICogZWFzZWQgKyB0aGlzLnN0YXJ0O1xuXG5cdFx0aWYgKCB0aGlzLm9wdGlvbnMuc3RlcCApIHtcblx0XHRcdHRoaXMub3B0aW9ucy5zdGVwLmNhbGwoIHRoaXMuZWxlbSwgdGhpcy5ub3csIHRoaXMgKTtcblx0XHR9XG5cblx0XHRpZiAoIGhvb2tzICYmIGhvb2tzLnNldCApIHtcblx0XHRcdGhvb2tzLnNldCggdGhpcyApO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRUd2Vlbi5wcm9wSG9va3MuX2RlZmF1bHQuc2V0KCB0aGlzICk7XG5cdFx0fVxuXHRcdHJldHVybiB0aGlzO1xuXHR9XG59O1xuXG5Ud2Vlbi5wcm90b3R5cGUuaW5pdC5wcm90b3R5cGUgPSBUd2Vlbi5wcm90b3R5cGU7XG5cblR3ZWVuLnByb3BIb29rcyA9IHtcblx0X2RlZmF1bHQ6IHtcblx0XHRnZXQ6IGZ1bmN0aW9uKCB0d2VlbiApIHtcblx0XHRcdHZhciByZXN1bHQ7XG5cblx0XHRcdC8vIFVzZSBhIHByb3BlcnR5IG9uIHRoZSBlbGVtZW50IGRpcmVjdGx5IHdoZW4gaXQgaXMgbm90IGEgRE9NIGVsZW1lbnQsXG5cdFx0XHQvLyBvciB3aGVuIHRoZXJlIGlzIG5vIG1hdGNoaW5nIHN0eWxlIHByb3BlcnR5IHRoYXQgZXhpc3RzLlxuXHRcdFx0aWYgKCB0d2Vlbi5lbGVtLm5vZGVUeXBlICE9PSAxIHx8XG5cdFx0XHRcdHR3ZWVuLmVsZW1bIHR3ZWVuLnByb3AgXSAhPSBudWxsICYmIHR3ZWVuLmVsZW0uc3R5bGVbIHR3ZWVuLnByb3AgXSA9PSBudWxsICkge1xuXHRcdFx0XHRyZXR1cm4gdHdlZW4uZWxlbVsgdHdlZW4ucHJvcCBdO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBQYXNzaW5nIGFuIGVtcHR5IHN0cmluZyBhcyBhIDNyZCBwYXJhbWV0ZXIgdG8gLmNzcyB3aWxsIGF1dG9tYXRpY2FsbHlcblx0XHRcdC8vIGF0dGVtcHQgYSBwYXJzZUZsb2F0IGFuZCBmYWxsYmFjayB0byBhIHN0cmluZyBpZiB0aGUgcGFyc2UgZmFpbHMuXG5cdFx0XHQvLyBTaW1wbGUgdmFsdWVzIHN1Y2ggYXMgXCIxMHB4XCIgYXJlIHBhcnNlZCB0byBGbG9hdDtcblx0XHRcdC8vIGNvbXBsZXggdmFsdWVzIHN1Y2ggYXMgXCJyb3RhdGUoMXJhZClcIiBhcmUgcmV0dXJuZWQgYXMtaXMuXG5cdFx0XHRyZXN1bHQgPSBqUXVlcnkuY3NzKCB0d2Vlbi5lbGVtLCB0d2Vlbi5wcm9wLCBcIlwiICk7XG5cblx0XHRcdC8vIEVtcHR5IHN0cmluZ3MsIG51bGwsIHVuZGVmaW5lZCBhbmQgXCJhdXRvXCIgYXJlIGNvbnZlcnRlZCB0byAwLlxuXHRcdFx0cmV0dXJuICFyZXN1bHQgfHwgcmVzdWx0ID09PSBcImF1dG9cIiA/IDAgOiByZXN1bHQ7XG5cdFx0fSxcblx0XHRzZXQ6IGZ1bmN0aW9uKCB0d2VlbiApIHtcblxuXHRcdFx0Ly8gVXNlIHN0ZXAgaG9vayBmb3IgYmFjayBjb21wYXQuXG5cdFx0XHQvLyBVc2UgY3NzSG9vayBpZiBpdHMgdGhlcmUuXG5cdFx0XHQvLyBVc2UgLnN0eWxlIGlmIGF2YWlsYWJsZSBhbmQgdXNlIHBsYWluIHByb3BlcnRpZXMgd2hlcmUgYXZhaWxhYmxlLlxuXHRcdFx0aWYgKCBqUXVlcnkuZnguc3RlcFsgdHdlZW4ucHJvcCBdICkge1xuXHRcdFx0XHRqUXVlcnkuZnguc3RlcFsgdHdlZW4ucHJvcCBdKCB0d2VlbiApO1xuXHRcdFx0fSBlbHNlIGlmICggdHdlZW4uZWxlbS5ub2RlVHlwZSA9PT0gMSAmJlxuXHRcdFx0XHQoIHR3ZWVuLmVsZW0uc3R5bGVbIGpRdWVyeS5jc3NQcm9wc1sgdHdlZW4ucHJvcCBdIF0gIT0gbnVsbCB8fFxuXHRcdFx0XHRcdGpRdWVyeS5jc3NIb29rc1sgdHdlZW4ucHJvcCBdICkgKSB7XG5cdFx0XHRcdGpRdWVyeS5zdHlsZSggdHdlZW4uZWxlbSwgdHdlZW4ucHJvcCwgdHdlZW4ubm93ICsgdHdlZW4udW5pdCApO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0dHdlZW4uZWxlbVsgdHdlZW4ucHJvcCBdID0gdHdlZW4ubm93O1xuXHRcdFx0fVxuXHRcdH1cblx0fVxufTtcblxuLy8gU3VwcG9ydDogSUU5XG4vLyBQYW5pYyBiYXNlZCBhcHByb2FjaCB0byBzZXR0aW5nIHRoaW5ncyBvbiBkaXNjb25uZWN0ZWQgbm9kZXNcblR3ZWVuLnByb3BIb29rcy5zY3JvbGxUb3AgPSBUd2Vlbi5wcm9wSG9va3Muc2Nyb2xsTGVmdCA9IHtcblx0c2V0OiBmdW5jdGlvbiggdHdlZW4gKSB7XG5cdFx0aWYgKCB0d2Vlbi5lbGVtLm5vZGVUeXBlICYmIHR3ZWVuLmVsZW0ucGFyZW50Tm9kZSApIHtcblx0XHRcdHR3ZWVuLmVsZW1bIHR3ZWVuLnByb3AgXSA9IHR3ZWVuLm5vdztcblx0XHR9XG5cdH1cbn07XG5cbmpRdWVyeS5lYXNpbmcgPSB7XG5cdGxpbmVhcjogZnVuY3Rpb24oIHAgKSB7XG5cdFx0cmV0dXJuIHA7XG5cdH0sXG5cdHN3aW5nOiBmdW5jdGlvbiggcCApIHtcblx0XHRyZXR1cm4gMC41IC0gTWF0aC5jb3MoIHAgKiBNYXRoLlBJICkgLyAyO1xuXHR9LFxuXHRfZGVmYXVsdDogXCJzd2luZ1wiXG59O1xuXG5qUXVlcnkuZnggPSBUd2Vlbi5wcm90b3R5cGUuaW5pdDtcblxuLy8gQmFjayBDb21wYXQgPDEuOCBleHRlbnNpb24gcG9pbnRcbmpRdWVyeS5meC5zdGVwID0ge307XG5cblxuXG5cbnZhclxuXHRmeE5vdywgdGltZXJJZCxcblx0cmZ4dHlwZXMgPSAvXig/OnRvZ2dsZXxzaG93fGhpZGUpJC8sXG5cdHJydW4gPSAvcXVldWVIb29rcyQvO1xuXG4vLyBBbmltYXRpb25zIGNyZWF0ZWQgc3luY2hyb25vdXNseSB3aWxsIHJ1biBzeW5jaHJvbm91c2x5XG5mdW5jdGlvbiBjcmVhdGVGeE5vdygpIHtcblx0d2luZG93LnNldFRpbWVvdXQoIGZ1bmN0aW9uKCkge1xuXHRcdGZ4Tm93ID0gdW5kZWZpbmVkO1xuXHR9ICk7XG5cdHJldHVybiAoIGZ4Tm93ID0galF1ZXJ5Lm5vdygpICk7XG59XG5cbi8vIEdlbmVyYXRlIHBhcmFtZXRlcnMgdG8gY3JlYXRlIGEgc3RhbmRhcmQgYW5pbWF0aW9uXG5mdW5jdGlvbiBnZW5GeCggdHlwZSwgaW5jbHVkZVdpZHRoICkge1xuXHR2YXIgd2hpY2gsXG5cdFx0aSA9IDAsXG5cdFx0YXR0cnMgPSB7IGhlaWdodDogdHlwZSB9O1xuXG5cdC8vIElmIHdlIGluY2x1ZGUgd2lkdGgsIHN0ZXAgdmFsdWUgaXMgMSB0byBkbyBhbGwgY3NzRXhwYW5kIHZhbHVlcyxcblx0Ly8gb3RoZXJ3aXNlIHN0ZXAgdmFsdWUgaXMgMiB0byBza2lwIG92ZXIgTGVmdCBhbmQgUmlnaHRcblx0aW5jbHVkZVdpZHRoID0gaW5jbHVkZVdpZHRoID8gMSA6IDA7XG5cdGZvciAoIDsgaSA8IDQgOyBpICs9IDIgLSBpbmNsdWRlV2lkdGggKSB7XG5cdFx0d2hpY2ggPSBjc3NFeHBhbmRbIGkgXTtcblx0XHRhdHRyc1sgXCJtYXJnaW5cIiArIHdoaWNoIF0gPSBhdHRyc1sgXCJwYWRkaW5nXCIgKyB3aGljaCBdID0gdHlwZTtcblx0fVxuXG5cdGlmICggaW5jbHVkZVdpZHRoICkge1xuXHRcdGF0dHJzLm9wYWNpdHkgPSBhdHRycy53aWR0aCA9IHR5cGU7XG5cdH1cblxuXHRyZXR1cm4gYXR0cnM7XG59XG5cbmZ1bmN0aW9uIGNyZWF0ZVR3ZWVuKCB2YWx1ZSwgcHJvcCwgYW5pbWF0aW9uICkge1xuXHR2YXIgdHdlZW4sXG5cdFx0Y29sbGVjdGlvbiA9ICggQW5pbWF0aW9uLnR3ZWVuZXJzWyBwcm9wIF0gfHwgW10gKS5jb25jYXQoIEFuaW1hdGlvbi50d2VlbmVyc1sgXCIqXCIgXSApLFxuXHRcdGluZGV4ID0gMCxcblx0XHRsZW5ndGggPSBjb2xsZWN0aW9uLmxlbmd0aDtcblx0Zm9yICggOyBpbmRleCA8IGxlbmd0aDsgaW5kZXgrKyApIHtcblx0XHRpZiAoICggdHdlZW4gPSBjb2xsZWN0aW9uWyBpbmRleCBdLmNhbGwoIGFuaW1hdGlvbiwgcHJvcCwgdmFsdWUgKSApICkge1xuXG5cdFx0XHQvLyBXZSdyZSBkb25lIHdpdGggdGhpcyBwcm9wZXJ0eVxuXHRcdFx0cmV0dXJuIHR3ZWVuO1xuXHRcdH1cblx0fVxufVxuXG5mdW5jdGlvbiBkZWZhdWx0UHJlZmlsdGVyKCBlbGVtLCBwcm9wcywgb3B0cyApIHtcblx0LyoganNoaW50IHZhbGlkdGhpczogdHJ1ZSAqL1xuXHR2YXIgcHJvcCwgdmFsdWUsIHRvZ2dsZSwgdHdlZW4sIGhvb2tzLCBvbGRmaXJlLCBkaXNwbGF5LCBjaGVja0Rpc3BsYXksXG5cdFx0YW5pbSA9IHRoaXMsXG5cdFx0b3JpZyA9IHt9LFxuXHRcdHN0eWxlID0gZWxlbS5zdHlsZSxcblx0XHRoaWRkZW4gPSBlbGVtLm5vZGVUeXBlICYmIGlzSGlkZGVuKCBlbGVtICksXG5cdFx0ZGF0YVNob3cgPSBkYXRhUHJpdi5nZXQoIGVsZW0sIFwiZnhzaG93XCIgKTtcblxuXHQvLyBIYW5kbGUgcXVldWU6IGZhbHNlIHByb21pc2VzXG5cdGlmICggIW9wdHMucXVldWUgKSB7XG5cdFx0aG9va3MgPSBqUXVlcnkuX3F1ZXVlSG9va3MoIGVsZW0sIFwiZnhcIiApO1xuXHRcdGlmICggaG9va3MudW5xdWV1ZWQgPT0gbnVsbCApIHtcblx0XHRcdGhvb2tzLnVucXVldWVkID0gMDtcblx0XHRcdG9sZGZpcmUgPSBob29rcy5lbXB0eS5maXJlO1xuXHRcdFx0aG9va3MuZW1wdHkuZmlyZSA9IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRpZiAoICFob29rcy51bnF1ZXVlZCApIHtcblx0XHRcdFx0XHRvbGRmaXJlKCk7XG5cdFx0XHRcdH1cblx0XHRcdH07XG5cdFx0fVxuXHRcdGhvb2tzLnVucXVldWVkKys7XG5cblx0XHRhbmltLmFsd2F5cyggZnVuY3Rpb24oKSB7XG5cblx0XHRcdC8vIEVuc3VyZSB0aGUgY29tcGxldGUgaGFuZGxlciBpcyBjYWxsZWQgYmVmb3JlIHRoaXMgY29tcGxldGVzXG5cdFx0XHRhbmltLmFsd2F5cyggZnVuY3Rpb24oKSB7XG5cdFx0XHRcdGhvb2tzLnVucXVldWVkLS07XG5cdFx0XHRcdGlmICggIWpRdWVyeS5xdWV1ZSggZWxlbSwgXCJmeFwiICkubGVuZ3RoICkge1xuXHRcdFx0XHRcdGhvb2tzLmVtcHR5LmZpcmUoKTtcblx0XHRcdFx0fVxuXHRcdFx0fSApO1xuXHRcdH0gKTtcblx0fVxuXG5cdC8vIEhlaWdodC93aWR0aCBvdmVyZmxvdyBwYXNzXG5cdGlmICggZWxlbS5ub2RlVHlwZSA9PT0gMSAmJiAoIFwiaGVpZ2h0XCIgaW4gcHJvcHMgfHwgXCJ3aWR0aFwiIGluIHByb3BzICkgKSB7XG5cblx0XHQvLyBNYWtlIHN1cmUgdGhhdCBub3RoaW5nIHNuZWFrcyBvdXRcblx0XHQvLyBSZWNvcmQgYWxsIDMgb3ZlcmZsb3cgYXR0cmlidXRlcyBiZWNhdXNlIElFOS0xMCBkbyBub3Rcblx0XHQvLyBjaGFuZ2UgdGhlIG92ZXJmbG93IGF0dHJpYnV0ZSB3aGVuIG92ZXJmbG93WCBhbmRcblx0XHQvLyBvdmVyZmxvd1kgYXJlIHNldCB0byB0aGUgc2FtZSB2YWx1ZVxuXHRcdG9wdHMub3ZlcmZsb3cgPSBbIHN0eWxlLm92ZXJmbG93LCBzdHlsZS5vdmVyZmxvd1gsIHN0eWxlLm92ZXJmbG93WSBdO1xuXG5cdFx0Ly8gU2V0IGRpc3BsYXkgcHJvcGVydHkgdG8gaW5saW5lLWJsb2NrIGZvciBoZWlnaHQvd2lkdGhcblx0XHQvLyBhbmltYXRpb25zIG9uIGlubGluZSBlbGVtZW50cyB0aGF0IGFyZSBoYXZpbmcgd2lkdGgvaGVpZ2h0IGFuaW1hdGVkXG5cdFx0ZGlzcGxheSA9IGpRdWVyeS5jc3MoIGVsZW0sIFwiZGlzcGxheVwiICk7XG5cblx0XHQvLyBUZXN0IGRlZmF1bHQgZGlzcGxheSBpZiBkaXNwbGF5IGlzIGN1cnJlbnRseSBcIm5vbmVcIlxuXHRcdGNoZWNrRGlzcGxheSA9IGRpc3BsYXkgPT09IFwibm9uZVwiID9cblx0XHRcdGRhdGFQcml2LmdldCggZWxlbSwgXCJvbGRkaXNwbGF5XCIgKSB8fCBkZWZhdWx0RGlzcGxheSggZWxlbS5ub2RlTmFtZSApIDogZGlzcGxheTtcblxuXHRcdGlmICggY2hlY2tEaXNwbGF5ID09PSBcImlubGluZVwiICYmIGpRdWVyeS5jc3MoIGVsZW0sIFwiZmxvYXRcIiApID09PSBcIm5vbmVcIiApIHtcblx0XHRcdHN0eWxlLmRpc3BsYXkgPSBcImlubGluZS1ibG9ja1wiO1xuXHRcdH1cblx0fVxuXG5cdGlmICggb3B0cy5vdmVyZmxvdyApIHtcblx0XHRzdHlsZS5vdmVyZmxvdyA9IFwiaGlkZGVuXCI7XG5cdFx0YW5pbS5hbHdheXMoIGZ1bmN0aW9uKCkge1xuXHRcdFx0c3R5bGUub3ZlcmZsb3cgPSBvcHRzLm92ZXJmbG93WyAwIF07XG5cdFx0XHRzdHlsZS5vdmVyZmxvd1ggPSBvcHRzLm92ZXJmbG93WyAxIF07XG5cdFx0XHRzdHlsZS5vdmVyZmxvd1kgPSBvcHRzLm92ZXJmbG93WyAyIF07XG5cdFx0fSApO1xuXHR9XG5cblx0Ly8gc2hvdy9oaWRlIHBhc3Ncblx0Zm9yICggcHJvcCBpbiBwcm9wcyApIHtcblx0XHR2YWx1ZSA9IHByb3BzWyBwcm9wIF07XG5cdFx0aWYgKCByZnh0eXBlcy5leGVjKCB2YWx1ZSApICkge1xuXHRcdFx0ZGVsZXRlIHByb3BzWyBwcm9wIF07XG5cdFx0XHR0b2dnbGUgPSB0b2dnbGUgfHwgdmFsdWUgPT09IFwidG9nZ2xlXCI7XG5cdFx0XHRpZiAoIHZhbHVlID09PSAoIGhpZGRlbiA/IFwiaGlkZVwiIDogXCJzaG93XCIgKSApIHtcblxuXHRcdFx0XHQvLyBJZiB0aGVyZSBpcyBkYXRhU2hvdyBsZWZ0IG92ZXIgZnJvbSBhIHN0b3BwZWQgaGlkZSBvciBzaG93XG5cdFx0XHRcdC8vIGFuZCB3ZSBhcmUgZ29pbmcgdG8gcHJvY2VlZCB3aXRoIHNob3csIHdlIHNob3VsZCBwcmV0ZW5kIHRvIGJlIGhpZGRlblxuXHRcdFx0XHRpZiAoIHZhbHVlID09PSBcInNob3dcIiAmJiBkYXRhU2hvdyAmJiBkYXRhU2hvd1sgcHJvcCBdICE9PSB1bmRlZmluZWQgKSB7XG5cdFx0XHRcdFx0aGlkZGVuID0gdHJ1ZTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRjb250aW51ZTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0b3JpZ1sgcHJvcCBdID0gZGF0YVNob3cgJiYgZGF0YVNob3dbIHByb3AgXSB8fCBqUXVlcnkuc3R5bGUoIGVsZW0sIHByb3AgKTtcblxuXHRcdC8vIEFueSBub24tZnggdmFsdWUgc3RvcHMgdXMgZnJvbSByZXN0b3JpbmcgdGhlIG9yaWdpbmFsIGRpc3BsYXkgdmFsdWVcblx0XHR9IGVsc2Uge1xuXHRcdFx0ZGlzcGxheSA9IHVuZGVmaW5lZDtcblx0XHR9XG5cdH1cblxuXHRpZiAoICFqUXVlcnkuaXNFbXB0eU9iamVjdCggb3JpZyApICkge1xuXHRcdGlmICggZGF0YVNob3cgKSB7XG5cdFx0XHRpZiAoIFwiaGlkZGVuXCIgaW4gZGF0YVNob3cgKSB7XG5cdFx0XHRcdGhpZGRlbiA9IGRhdGFTaG93LmhpZGRlbjtcblx0XHRcdH1cblx0XHR9IGVsc2Uge1xuXHRcdFx0ZGF0YVNob3cgPSBkYXRhUHJpdi5hY2Nlc3MoIGVsZW0sIFwiZnhzaG93XCIsIHt9ICk7XG5cdFx0fVxuXG5cdFx0Ly8gU3RvcmUgc3RhdGUgaWYgaXRzIHRvZ2dsZSAtIGVuYWJsZXMgLnN0b3AoKS50b2dnbGUoKSB0byBcInJldmVyc2VcIlxuXHRcdGlmICggdG9nZ2xlICkge1xuXHRcdFx0ZGF0YVNob3cuaGlkZGVuID0gIWhpZGRlbjtcblx0XHR9XG5cdFx0aWYgKCBoaWRkZW4gKSB7XG5cdFx0XHRqUXVlcnkoIGVsZW0gKS5zaG93KCk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdGFuaW0uZG9uZSggZnVuY3Rpb24oKSB7XG5cdFx0XHRcdGpRdWVyeSggZWxlbSApLmhpZGUoKTtcblx0XHRcdH0gKTtcblx0XHR9XG5cdFx0YW5pbS5kb25lKCBmdW5jdGlvbigpIHtcblx0XHRcdHZhciBwcm9wO1xuXG5cdFx0XHRkYXRhUHJpdi5yZW1vdmUoIGVsZW0sIFwiZnhzaG93XCIgKTtcblx0XHRcdGZvciAoIHByb3AgaW4gb3JpZyApIHtcblx0XHRcdFx0alF1ZXJ5LnN0eWxlKCBlbGVtLCBwcm9wLCBvcmlnWyBwcm9wIF0gKTtcblx0XHRcdH1cblx0XHR9ICk7XG5cdFx0Zm9yICggcHJvcCBpbiBvcmlnICkge1xuXHRcdFx0dHdlZW4gPSBjcmVhdGVUd2VlbiggaGlkZGVuID8gZGF0YVNob3dbIHByb3AgXSA6IDAsIHByb3AsIGFuaW0gKTtcblxuXHRcdFx0aWYgKCAhKCBwcm9wIGluIGRhdGFTaG93ICkgKSB7XG5cdFx0XHRcdGRhdGFTaG93WyBwcm9wIF0gPSB0d2Vlbi5zdGFydDtcblx0XHRcdFx0aWYgKCBoaWRkZW4gKSB7XG5cdFx0XHRcdFx0dHdlZW4uZW5kID0gdHdlZW4uc3RhcnQ7XG5cdFx0XHRcdFx0dHdlZW4uc3RhcnQgPSBwcm9wID09PSBcIndpZHRoXCIgfHwgcHJvcCA9PT0gXCJoZWlnaHRcIiA/IDEgOiAwO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdC8vIElmIHRoaXMgaXMgYSBub29wIGxpa2UgLmhpZGUoKS5oaWRlKCksIHJlc3RvcmUgYW4gb3ZlcndyaXR0ZW4gZGlzcGxheSB2YWx1ZVxuXHR9IGVsc2UgaWYgKCAoIGRpc3BsYXkgPT09IFwibm9uZVwiID8gZGVmYXVsdERpc3BsYXkoIGVsZW0ubm9kZU5hbWUgKSA6IGRpc3BsYXkgKSA9PT0gXCJpbmxpbmVcIiApIHtcblx0XHRzdHlsZS5kaXNwbGF5ID0gZGlzcGxheTtcblx0fVxufVxuXG5mdW5jdGlvbiBwcm9wRmlsdGVyKCBwcm9wcywgc3BlY2lhbEVhc2luZyApIHtcblx0dmFyIGluZGV4LCBuYW1lLCBlYXNpbmcsIHZhbHVlLCBob29rcztcblxuXHQvLyBjYW1lbENhc2UsIHNwZWNpYWxFYXNpbmcgYW5kIGV4cGFuZCBjc3NIb29rIHBhc3Ncblx0Zm9yICggaW5kZXggaW4gcHJvcHMgKSB7XG5cdFx0bmFtZSA9IGpRdWVyeS5jYW1lbENhc2UoIGluZGV4ICk7XG5cdFx0ZWFzaW5nID0gc3BlY2lhbEVhc2luZ1sgbmFtZSBdO1xuXHRcdHZhbHVlID0gcHJvcHNbIGluZGV4IF07XG5cdFx0aWYgKCBqUXVlcnkuaXNBcnJheSggdmFsdWUgKSApIHtcblx0XHRcdGVhc2luZyA9IHZhbHVlWyAxIF07XG5cdFx0XHR2YWx1ZSA9IHByb3BzWyBpbmRleCBdID0gdmFsdWVbIDAgXTtcblx0XHR9XG5cblx0XHRpZiAoIGluZGV4ICE9PSBuYW1lICkge1xuXHRcdFx0cHJvcHNbIG5hbWUgXSA9IHZhbHVlO1xuXHRcdFx0ZGVsZXRlIHByb3BzWyBpbmRleCBdO1xuXHRcdH1cblxuXHRcdGhvb2tzID0galF1ZXJ5LmNzc0hvb2tzWyBuYW1lIF07XG5cdFx0aWYgKCBob29rcyAmJiBcImV4cGFuZFwiIGluIGhvb2tzICkge1xuXHRcdFx0dmFsdWUgPSBob29rcy5leHBhbmQoIHZhbHVlICk7XG5cdFx0XHRkZWxldGUgcHJvcHNbIG5hbWUgXTtcblxuXHRcdFx0Ly8gTm90IHF1aXRlICQuZXh0ZW5kLCB0aGlzIHdvbid0IG92ZXJ3cml0ZSBleGlzdGluZyBrZXlzLlxuXHRcdFx0Ly8gUmV1c2luZyAnaW5kZXgnIGJlY2F1c2Ugd2UgaGF2ZSB0aGUgY29ycmVjdCBcIm5hbWVcIlxuXHRcdFx0Zm9yICggaW5kZXggaW4gdmFsdWUgKSB7XG5cdFx0XHRcdGlmICggISggaW5kZXggaW4gcHJvcHMgKSApIHtcblx0XHRcdFx0XHRwcm9wc1sgaW5kZXggXSA9IHZhbHVlWyBpbmRleCBdO1xuXHRcdFx0XHRcdHNwZWNpYWxFYXNpbmdbIGluZGV4IF0gPSBlYXNpbmc7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9IGVsc2Uge1xuXHRcdFx0c3BlY2lhbEVhc2luZ1sgbmFtZSBdID0gZWFzaW5nO1xuXHRcdH1cblx0fVxufVxuXG5mdW5jdGlvbiBBbmltYXRpb24oIGVsZW0sIHByb3BlcnRpZXMsIG9wdGlvbnMgKSB7XG5cdHZhciByZXN1bHQsXG5cdFx0c3RvcHBlZCxcblx0XHRpbmRleCA9IDAsXG5cdFx0bGVuZ3RoID0gQW5pbWF0aW9uLnByZWZpbHRlcnMubGVuZ3RoLFxuXHRcdGRlZmVycmVkID0galF1ZXJ5LkRlZmVycmVkKCkuYWx3YXlzKCBmdW5jdGlvbigpIHtcblxuXHRcdFx0Ly8gRG9uJ3QgbWF0Y2ggZWxlbSBpbiB0aGUgOmFuaW1hdGVkIHNlbGVjdG9yXG5cdFx0XHRkZWxldGUgdGljay5lbGVtO1xuXHRcdH0gKSxcblx0XHR0aWNrID0gZnVuY3Rpb24oKSB7XG5cdFx0XHRpZiAoIHN0b3BwZWQgKSB7XG5cdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdH1cblx0XHRcdHZhciBjdXJyZW50VGltZSA9IGZ4Tm93IHx8IGNyZWF0ZUZ4Tm93KCksXG5cdFx0XHRcdHJlbWFpbmluZyA9IE1hdGgubWF4KCAwLCBhbmltYXRpb24uc3RhcnRUaW1lICsgYW5pbWF0aW9uLmR1cmF0aW9uIC0gY3VycmVudFRpbWUgKSxcblxuXHRcdFx0XHQvLyBTdXBwb3J0OiBBbmRyb2lkIDIuM1xuXHRcdFx0XHQvLyBBcmNoYWljIGNyYXNoIGJ1ZyB3b24ndCBhbGxvdyB1cyB0byB1c2UgYDEgLSAoIDAuNSB8fCAwIClgICgjMTI0OTcpXG5cdFx0XHRcdHRlbXAgPSByZW1haW5pbmcgLyBhbmltYXRpb24uZHVyYXRpb24gfHwgMCxcblx0XHRcdFx0cGVyY2VudCA9IDEgLSB0ZW1wLFxuXHRcdFx0XHRpbmRleCA9IDAsXG5cdFx0XHRcdGxlbmd0aCA9IGFuaW1hdGlvbi50d2VlbnMubGVuZ3RoO1xuXG5cdFx0XHRmb3IgKCA7IGluZGV4IDwgbGVuZ3RoIDsgaW5kZXgrKyApIHtcblx0XHRcdFx0YW5pbWF0aW9uLnR3ZWVuc1sgaW5kZXggXS5ydW4oIHBlcmNlbnQgKTtcblx0XHRcdH1cblxuXHRcdFx0ZGVmZXJyZWQubm90aWZ5V2l0aCggZWxlbSwgWyBhbmltYXRpb24sIHBlcmNlbnQsIHJlbWFpbmluZyBdICk7XG5cblx0XHRcdGlmICggcGVyY2VudCA8IDEgJiYgbGVuZ3RoICkge1xuXHRcdFx0XHRyZXR1cm4gcmVtYWluaW5nO1xuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0ZGVmZXJyZWQucmVzb2x2ZVdpdGgoIGVsZW0sIFsgYW5pbWF0aW9uIF0gKTtcblx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0fVxuXHRcdH0sXG5cdFx0YW5pbWF0aW9uID0gZGVmZXJyZWQucHJvbWlzZSgge1xuXHRcdFx0ZWxlbTogZWxlbSxcblx0XHRcdHByb3BzOiBqUXVlcnkuZXh0ZW5kKCB7fSwgcHJvcGVydGllcyApLFxuXHRcdFx0b3B0czogalF1ZXJ5LmV4dGVuZCggdHJ1ZSwge1xuXHRcdFx0XHRzcGVjaWFsRWFzaW5nOiB7fSxcblx0XHRcdFx0ZWFzaW5nOiBqUXVlcnkuZWFzaW5nLl9kZWZhdWx0XG5cdFx0XHR9LCBvcHRpb25zICksXG5cdFx0XHRvcmlnaW5hbFByb3BlcnRpZXM6IHByb3BlcnRpZXMsXG5cdFx0XHRvcmlnaW5hbE9wdGlvbnM6IG9wdGlvbnMsXG5cdFx0XHRzdGFydFRpbWU6IGZ4Tm93IHx8IGNyZWF0ZUZ4Tm93KCksXG5cdFx0XHRkdXJhdGlvbjogb3B0aW9ucy5kdXJhdGlvbixcblx0XHRcdHR3ZWVuczogW10sXG5cdFx0XHRjcmVhdGVUd2VlbjogZnVuY3Rpb24oIHByb3AsIGVuZCApIHtcblx0XHRcdFx0dmFyIHR3ZWVuID0galF1ZXJ5LlR3ZWVuKCBlbGVtLCBhbmltYXRpb24ub3B0cywgcHJvcCwgZW5kLFxuXHRcdFx0XHRcdFx0YW5pbWF0aW9uLm9wdHMuc3BlY2lhbEVhc2luZ1sgcHJvcCBdIHx8IGFuaW1hdGlvbi5vcHRzLmVhc2luZyApO1xuXHRcdFx0XHRhbmltYXRpb24udHdlZW5zLnB1c2goIHR3ZWVuICk7XG5cdFx0XHRcdHJldHVybiB0d2Vlbjtcblx0XHRcdH0sXG5cdFx0XHRzdG9wOiBmdW5jdGlvbiggZ290b0VuZCApIHtcblx0XHRcdFx0dmFyIGluZGV4ID0gMCxcblxuXHRcdFx0XHRcdC8vIElmIHdlIGFyZSBnb2luZyB0byB0aGUgZW5kLCB3ZSB3YW50IHRvIHJ1biBhbGwgdGhlIHR3ZWVuc1xuXHRcdFx0XHRcdC8vIG90aGVyd2lzZSB3ZSBza2lwIHRoaXMgcGFydFxuXHRcdFx0XHRcdGxlbmd0aCA9IGdvdG9FbmQgPyBhbmltYXRpb24udHdlZW5zLmxlbmd0aCA6IDA7XG5cdFx0XHRcdGlmICggc3RvcHBlZCApIHtcblx0XHRcdFx0XHRyZXR1cm4gdGhpcztcblx0XHRcdFx0fVxuXHRcdFx0XHRzdG9wcGVkID0gdHJ1ZTtcblx0XHRcdFx0Zm9yICggOyBpbmRleCA8IGxlbmd0aCA7IGluZGV4KysgKSB7XG5cdFx0XHRcdFx0YW5pbWF0aW9uLnR3ZWVuc1sgaW5kZXggXS5ydW4oIDEgKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIFJlc29sdmUgd2hlbiB3ZSBwbGF5ZWQgdGhlIGxhc3QgZnJhbWU7IG90aGVyd2lzZSwgcmVqZWN0XG5cdFx0XHRcdGlmICggZ290b0VuZCApIHtcblx0XHRcdFx0XHRkZWZlcnJlZC5ub3RpZnlXaXRoKCBlbGVtLCBbIGFuaW1hdGlvbiwgMSwgMCBdICk7XG5cdFx0XHRcdFx0ZGVmZXJyZWQucmVzb2x2ZVdpdGgoIGVsZW0sIFsgYW5pbWF0aW9uLCBnb3RvRW5kIF0gKTtcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRkZWZlcnJlZC5yZWplY3RXaXRoKCBlbGVtLCBbIGFuaW1hdGlvbiwgZ290b0VuZCBdICk7XG5cdFx0XHRcdH1cblx0XHRcdFx0cmV0dXJuIHRoaXM7XG5cdFx0XHR9XG5cdFx0fSApLFxuXHRcdHByb3BzID0gYW5pbWF0aW9uLnByb3BzO1xuXG5cdHByb3BGaWx0ZXIoIHByb3BzLCBhbmltYXRpb24ub3B0cy5zcGVjaWFsRWFzaW5nICk7XG5cblx0Zm9yICggOyBpbmRleCA8IGxlbmd0aCA7IGluZGV4KysgKSB7XG5cdFx0cmVzdWx0ID0gQW5pbWF0aW9uLnByZWZpbHRlcnNbIGluZGV4IF0uY2FsbCggYW5pbWF0aW9uLCBlbGVtLCBwcm9wcywgYW5pbWF0aW9uLm9wdHMgKTtcblx0XHRpZiAoIHJlc3VsdCApIHtcblx0XHRcdGlmICggalF1ZXJ5LmlzRnVuY3Rpb24oIHJlc3VsdC5zdG9wICkgKSB7XG5cdFx0XHRcdGpRdWVyeS5fcXVldWVIb29rcyggYW5pbWF0aW9uLmVsZW0sIGFuaW1hdGlvbi5vcHRzLnF1ZXVlICkuc3RvcCA9XG5cdFx0XHRcdFx0alF1ZXJ5LnByb3h5KCByZXN1bHQuc3RvcCwgcmVzdWx0ICk7XG5cdFx0XHR9XG5cdFx0XHRyZXR1cm4gcmVzdWx0O1xuXHRcdH1cblx0fVxuXG5cdGpRdWVyeS5tYXAoIHByb3BzLCBjcmVhdGVUd2VlbiwgYW5pbWF0aW9uICk7XG5cblx0aWYgKCBqUXVlcnkuaXNGdW5jdGlvbiggYW5pbWF0aW9uLm9wdHMuc3RhcnQgKSApIHtcblx0XHRhbmltYXRpb24ub3B0cy5zdGFydC5jYWxsKCBlbGVtLCBhbmltYXRpb24gKTtcblx0fVxuXG5cdGpRdWVyeS5meC50aW1lcihcblx0XHRqUXVlcnkuZXh0ZW5kKCB0aWNrLCB7XG5cdFx0XHRlbGVtOiBlbGVtLFxuXHRcdFx0YW5pbTogYW5pbWF0aW9uLFxuXHRcdFx0cXVldWU6IGFuaW1hdGlvbi5vcHRzLnF1ZXVlXG5cdFx0fSApXG5cdCk7XG5cblx0Ly8gYXR0YWNoIGNhbGxiYWNrcyBmcm9tIG9wdGlvbnNcblx0cmV0dXJuIGFuaW1hdGlvbi5wcm9ncmVzcyggYW5pbWF0aW9uLm9wdHMucHJvZ3Jlc3MgKVxuXHRcdC5kb25lKCBhbmltYXRpb24ub3B0cy5kb25lLCBhbmltYXRpb24ub3B0cy5jb21wbGV0ZSApXG5cdFx0LmZhaWwoIGFuaW1hdGlvbi5vcHRzLmZhaWwgKVxuXHRcdC5hbHdheXMoIGFuaW1hdGlvbi5vcHRzLmFsd2F5cyApO1xufVxuXG5qUXVlcnkuQW5pbWF0aW9uID0galF1ZXJ5LmV4dGVuZCggQW5pbWF0aW9uLCB7XG5cdHR3ZWVuZXJzOiB7XG5cdFx0XCIqXCI6IFsgZnVuY3Rpb24oIHByb3AsIHZhbHVlICkge1xuXHRcdFx0dmFyIHR3ZWVuID0gdGhpcy5jcmVhdGVUd2VlbiggcHJvcCwgdmFsdWUgKTtcblx0XHRcdGFkanVzdENTUyggdHdlZW4uZWxlbSwgcHJvcCwgcmNzc051bS5leGVjKCB2YWx1ZSApLCB0d2VlbiApO1xuXHRcdFx0cmV0dXJuIHR3ZWVuO1xuXHRcdH0gXVxuXHR9LFxuXG5cdHR3ZWVuZXI6IGZ1bmN0aW9uKCBwcm9wcywgY2FsbGJhY2sgKSB7XG5cdFx0aWYgKCBqUXVlcnkuaXNGdW5jdGlvbiggcHJvcHMgKSApIHtcblx0XHRcdGNhbGxiYWNrID0gcHJvcHM7XG5cdFx0XHRwcm9wcyA9IFsgXCIqXCIgXTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0cHJvcHMgPSBwcm9wcy5tYXRjaCggcm5vdHdoaXRlICk7XG5cdFx0fVxuXG5cdFx0dmFyIHByb3AsXG5cdFx0XHRpbmRleCA9IDAsXG5cdFx0XHRsZW5ndGggPSBwcm9wcy5sZW5ndGg7XG5cblx0XHRmb3IgKCA7IGluZGV4IDwgbGVuZ3RoIDsgaW5kZXgrKyApIHtcblx0XHRcdHByb3AgPSBwcm9wc1sgaW5kZXggXTtcblx0XHRcdEFuaW1hdGlvbi50d2VlbmVyc1sgcHJvcCBdID0gQW5pbWF0aW9uLnR3ZWVuZXJzWyBwcm9wIF0gfHwgW107XG5cdFx0XHRBbmltYXRpb24udHdlZW5lcnNbIHByb3AgXS51bnNoaWZ0KCBjYWxsYmFjayApO1xuXHRcdH1cblx0fSxcblxuXHRwcmVmaWx0ZXJzOiBbIGRlZmF1bHRQcmVmaWx0ZXIgXSxcblxuXHRwcmVmaWx0ZXI6IGZ1bmN0aW9uKCBjYWxsYmFjaywgcHJlcGVuZCApIHtcblx0XHRpZiAoIHByZXBlbmQgKSB7XG5cdFx0XHRBbmltYXRpb24ucHJlZmlsdGVycy51bnNoaWZ0KCBjYWxsYmFjayApO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRBbmltYXRpb24ucHJlZmlsdGVycy5wdXNoKCBjYWxsYmFjayApO1xuXHRcdH1cblx0fVxufSApO1xuXG5qUXVlcnkuc3BlZWQgPSBmdW5jdGlvbiggc3BlZWQsIGVhc2luZywgZm4gKSB7XG5cdHZhciBvcHQgPSBzcGVlZCAmJiB0eXBlb2Ygc3BlZWQgPT09IFwib2JqZWN0XCIgPyBqUXVlcnkuZXh0ZW5kKCB7fSwgc3BlZWQgKSA6IHtcblx0XHRjb21wbGV0ZTogZm4gfHwgIWZuICYmIGVhc2luZyB8fFxuXHRcdFx0alF1ZXJ5LmlzRnVuY3Rpb24oIHNwZWVkICkgJiYgc3BlZWQsXG5cdFx0ZHVyYXRpb246IHNwZWVkLFxuXHRcdGVhc2luZzogZm4gJiYgZWFzaW5nIHx8IGVhc2luZyAmJiAhalF1ZXJ5LmlzRnVuY3Rpb24oIGVhc2luZyApICYmIGVhc2luZ1xuXHR9O1xuXG5cdG9wdC5kdXJhdGlvbiA9IGpRdWVyeS5meC5vZmYgPyAwIDogdHlwZW9mIG9wdC5kdXJhdGlvbiA9PT0gXCJudW1iZXJcIiA/XG5cdFx0b3B0LmR1cmF0aW9uIDogb3B0LmR1cmF0aW9uIGluIGpRdWVyeS5meC5zcGVlZHMgP1xuXHRcdFx0alF1ZXJ5LmZ4LnNwZWVkc1sgb3B0LmR1cmF0aW9uIF0gOiBqUXVlcnkuZnguc3BlZWRzLl9kZWZhdWx0O1xuXG5cdC8vIE5vcm1hbGl6ZSBvcHQucXVldWUgLSB0cnVlL3VuZGVmaW5lZC9udWxsIC0+IFwiZnhcIlxuXHRpZiAoIG9wdC5xdWV1ZSA9PSBudWxsIHx8IG9wdC5xdWV1ZSA9PT0gdHJ1ZSApIHtcblx0XHRvcHQucXVldWUgPSBcImZ4XCI7XG5cdH1cblxuXHQvLyBRdWV1ZWluZ1xuXHRvcHQub2xkID0gb3B0LmNvbXBsZXRlO1xuXG5cdG9wdC5jb21wbGV0ZSA9IGZ1bmN0aW9uKCkge1xuXHRcdGlmICggalF1ZXJ5LmlzRnVuY3Rpb24oIG9wdC5vbGQgKSApIHtcblx0XHRcdG9wdC5vbGQuY2FsbCggdGhpcyApO1xuXHRcdH1cblxuXHRcdGlmICggb3B0LnF1ZXVlICkge1xuXHRcdFx0alF1ZXJ5LmRlcXVldWUoIHRoaXMsIG9wdC5xdWV1ZSApO1xuXHRcdH1cblx0fTtcblxuXHRyZXR1cm4gb3B0O1xufTtcblxualF1ZXJ5LmZuLmV4dGVuZCgge1xuXHRmYWRlVG86IGZ1bmN0aW9uKCBzcGVlZCwgdG8sIGVhc2luZywgY2FsbGJhY2sgKSB7XG5cblx0XHQvLyBTaG93IGFueSBoaWRkZW4gZWxlbWVudHMgYWZ0ZXIgc2V0dGluZyBvcGFjaXR5IHRvIDBcblx0XHRyZXR1cm4gdGhpcy5maWx0ZXIoIGlzSGlkZGVuICkuY3NzKCBcIm9wYWNpdHlcIiwgMCApLnNob3coKVxuXG5cdFx0XHQvLyBBbmltYXRlIHRvIHRoZSB2YWx1ZSBzcGVjaWZpZWRcblx0XHRcdC5lbmQoKS5hbmltYXRlKCB7IG9wYWNpdHk6IHRvIH0sIHNwZWVkLCBlYXNpbmcsIGNhbGxiYWNrICk7XG5cdH0sXG5cdGFuaW1hdGU6IGZ1bmN0aW9uKCBwcm9wLCBzcGVlZCwgZWFzaW5nLCBjYWxsYmFjayApIHtcblx0XHR2YXIgZW1wdHkgPSBqUXVlcnkuaXNFbXB0eU9iamVjdCggcHJvcCApLFxuXHRcdFx0b3B0YWxsID0galF1ZXJ5LnNwZWVkKCBzcGVlZCwgZWFzaW5nLCBjYWxsYmFjayApLFxuXHRcdFx0ZG9BbmltYXRpb24gPSBmdW5jdGlvbigpIHtcblxuXHRcdFx0XHQvLyBPcGVyYXRlIG9uIGEgY29weSBvZiBwcm9wIHNvIHBlci1wcm9wZXJ0eSBlYXNpbmcgd29uJ3QgYmUgbG9zdFxuXHRcdFx0XHR2YXIgYW5pbSA9IEFuaW1hdGlvbiggdGhpcywgalF1ZXJ5LmV4dGVuZCgge30sIHByb3AgKSwgb3B0YWxsICk7XG5cblx0XHRcdFx0Ly8gRW1wdHkgYW5pbWF0aW9ucywgb3IgZmluaXNoaW5nIHJlc29sdmVzIGltbWVkaWF0ZWx5XG5cdFx0XHRcdGlmICggZW1wdHkgfHwgZGF0YVByaXYuZ2V0KCB0aGlzLCBcImZpbmlzaFwiICkgKSB7XG5cdFx0XHRcdFx0YW5pbS5zdG9wKCB0cnVlICk7XG5cdFx0XHRcdH1cblx0XHRcdH07XG5cdFx0XHRkb0FuaW1hdGlvbi5maW5pc2ggPSBkb0FuaW1hdGlvbjtcblxuXHRcdHJldHVybiBlbXB0eSB8fCBvcHRhbGwucXVldWUgPT09IGZhbHNlID9cblx0XHRcdHRoaXMuZWFjaCggZG9BbmltYXRpb24gKSA6XG5cdFx0XHR0aGlzLnF1ZXVlKCBvcHRhbGwucXVldWUsIGRvQW5pbWF0aW9uICk7XG5cdH0sXG5cdHN0b3A6IGZ1bmN0aW9uKCB0eXBlLCBjbGVhclF1ZXVlLCBnb3RvRW5kICkge1xuXHRcdHZhciBzdG9wUXVldWUgPSBmdW5jdGlvbiggaG9va3MgKSB7XG5cdFx0XHR2YXIgc3RvcCA9IGhvb2tzLnN0b3A7XG5cdFx0XHRkZWxldGUgaG9va3Muc3RvcDtcblx0XHRcdHN0b3AoIGdvdG9FbmQgKTtcblx0XHR9O1xuXG5cdFx0aWYgKCB0eXBlb2YgdHlwZSAhPT0gXCJzdHJpbmdcIiApIHtcblx0XHRcdGdvdG9FbmQgPSBjbGVhclF1ZXVlO1xuXHRcdFx0Y2xlYXJRdWV1ZSA9IHR5cGU7XG5cdFx0XHR0eXBlID0gdW5kZWZpbmVkO1xuXHRcdH1cblx0XHRpZiAoIGNsZWFyUXVldWUgJiYgdHlwZSAhPT0gZmFsc2UgKSB7XG5cdFx0XHR0aGlzLnF1ZXVlKCB0eXBlIHx8IFwiZnhcIiwgW10gKTtcblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcy5lYWNoKCBmdW5jdGlvbigpIHtcblx0XHRcdHZhciBkZXF1ZXVlID0gdHJ1ZSxcblx0XHRcdFx0aW5kZXggPSB0eXBlICE9IG51bGwgJiYgdHlwZSArIFwicXVldWVIb29rc1wiLFxuXHRcdFx0XHR0aW1lcnMgPSBqUXVlcnkudGltZXJzLFxuXHRcdFx0XHRkYXRhID0gZGF0YVByaXYuZ2V0KCB0aGlzICk7XG5cblx0XHRcdGlmICggaW5kZXggKSB7XG5cdFx0XHRcdGlmICggZGF0YVsgaW5kZXggXSAmJiBkYXRhWyBpbmRleCBdLnN0b3AgKSB7XG5cdFx0XHRcdFx0c3RvcFF1ZXVlKCBkYXRhWyBpbmRleCBdICk7XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdGZvciAoIGluZGV4IGluIGRhdGEgKSB7XG5cdFx0XHRcdFx0aWYgKCBkYXRhWyBpbmRleCBdICYmIGRhdGFbIGluZGV4IF0uc3RvcCAmJiBycnVuLnRlc3QoIGluZGV4ICkgKSB7XG5cdFx0XHRcdFx0XHRzdG9wUXVldWUoIGRhdGFbIGluZGV4IF0gKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0Zm9yICggaW5kZXggPSB0aW1lcnMubGVuZ3RoOyBpbmRleC0tOyApIHtcblx0XHRcdFx0aWYgKCB0aW1lcnNbIGluZGV4IF0uZWxlbSA9PT0gdGhpcyAmJlxuXHRcdFx0XHRcdCggdHlwZSA9PSBudWxsIHx8IHRpbWVyc1sgaW5kZXggXS5xdWV1ZSA9PT0gdHlwZSApICkge1xuXG5cdFx0XHRcdFx0dGltZXJzWyBpbmRleCBdLmFuaW0uc3RvcCggZ290b0VuZCApO1xuXHRcdFx0XHRcdGRlcXVldWUgPSBmYWxzZTtcblx0XHRcdFx0XHR0aW1lcnMuc3BsaWNlKCBpbmRleCwgMSApO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cblx0XHRcdC8vIFN0YXJ0IHRoZSBuZXh0IGluIHRoZSBxdWV1ZSBpZiB0aGUgbGFzdCBzdGVwIHdhc24ndCBmb3JjZWQuXG5cdFx0XHQvLyBUaW1lcnMgY3VycmVudGx5IHdpbGwgY2FsbCB0aGVpciBjb21wbGV0ZSBjYWxsYmFja3MsIHdoaWNoXG5cdFx0XHQvLyB3aWxsIGRlcXVldWUgYnV0IG9ubHkgaWYgdGhleSB3ZXJlIGdvdG9FbmQuXG5cdFx0XHRpZiAoIGRlcXVldWUgfHwgIWdvdG9FbmQgKSB7XG5cdFx0XHRcdGpRdWVyeS5kZXF1ZXVlKCB0aGlzLCB0eXBlICk7XG5cdFx0XHR9XG5cdFx0fSApO1xuXHR9LFxuXHRmaW5pc2g6IGZ1bmN0aW9uKCB0eXBlICkge1xuXHRcdGlmICggdHlwZSAhPT0gZmFsc2UgKSB7XG5cdFx0XHR0eXBlID0gdHlwZSB8fCBcImZ4XCI7XG5cdFx0fVxuXHRcdHJldHVybiB0aGlzLmVhY2goIGZ1bmN0aW9uKCkge1xuXHRcdFx0dmFyIGluZGV4LFxuXHRcdFx0XHRkYXRhID0gZGF0YVByaXYuZ2V0KCB0aGlzICksXG5cdFx0XHRcdHF1ZXVlID0gZGF0YVsgdHlwZSArIFwicXVldWVcIiBdLFxuXHRcdFx0XHRob29rcyA9IGRhdGFbIHR5cGUgKyBcInF1ZXVlSG9va3NcIiBdLFxuXHRcdFx0XHR0aW1lcnMgPSBqUXVlcnkudGltZXJzLFxuXHRcdFx0XHRsZW5ndGggPSBxdWV1ZSA/IHF1ZXVlLmxlbmd0aCA6IDA7XG5cblx0XHRcdC8vIEVuYWJsZSBmaW5pc2hpbmcgZmxhZyBvbiBwcml2YXRlIGRhdGFcblx0XHRcdGRhdGEuZmluaXNoID0gdHJ1ZTtcblxuXHRcdFx0Ly8gRW1wdHkgdGhlIHF1ZXVlIGZpcnN0XG5cdFx0XHRqUXVlcnkucXVldWUoIHRoaXMsIHR5cGUsIFtdICk7XG5cblx0XHRcdGlmICggaG9va3MgJiYgaG9va3Muc3RvcCApIHtcblx0XHRcdFx0aG9va3Muc3RvcC5jYWxsKCB0aGlzLCB0cnVlICk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIExvb2sgZm9yIGFueSBhY3RpdmUgYW5pbWF0aW9ucywgYW5kIGZpbmlzaCB0aGVtXG5cdFx0XHRmb3IgKCBpbmRleCA9IHRpbWVycy5sZW5ndGg7IGluZGV4LS07ICkge1xuXHRcdFx0XHRpZiAoIHRpbWVyc1sgaW5kZXggXS5lbGVtID09PSB0aGlzICYmIHRpbWVyc1sgaW5kZXggXS5xdWV1ZSA9PT0gdHlwZSApIHtcblx0XHRcdFx0XHR0aW1lcnNbIGluZGV4IF0uYW5pbS5zdG9wKCB0cnVlICk7XG5cdFx0XHRcdFx0dGltZXJzLnNwbGljZSggaW5kZXgsIDEgKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHQvLyBMb29rIGZvciBhbnkgYW5pbWF0aW9ucyBpbiB0aGUgb2xkIHF1ZXVlIGFuZCBmaW5pc2ggdGhlbVxuXHRcdFx0Zm9yICggaW5kZXggPSAwOyBpbmRleCA8IGxlbmd0aDsgaW5kZXgrKyApIHtcblx0XHRcdFx0aWYgKCBxdWV1ZVsgaW5kZXggXSAmJiBxdWV1ZVsgaW5kZXggXS5maW5pc2ggKSB7XG5cdFx0XHRcdFx0cXVldWVbIGluZGV4IF0uZmluaXNoLmNhbGwoIHRoaXMgKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHQvLyBUdXJuIG9mZiBmaW5pc2hpbmcgZmxhZ1xuXHRcdFx0ZGVsZXRlIGRhdGEuZmluaXNoO1xuXHRcdH0gKTtcblx0fVxufSApO1xuXG5qUXVlcnkuZWFjaCggWyBcInRvZ2dsZVwiLCBcInNob3dcIiwgXCJoaWRlXCIgXSwgZnVuY3Rpb24oIGksIG5hbWUgKSB7XG5cdHZhciBjc3NGbiA9IGpRdWVyeS5mblsgbmFtZSBdO1xuXHRqUXVlcnkuZm5bIG5hbWUgXSA9IGZ1bmN0aW9uKCBzcGVlZCwgZWFzaW5nLCBjYWxsYmFjayApIHtcblx0XHRyZXR1cm4gc3BlZWQgPT0gbnVsbCB8fCB0eXBlb2Ygc3BlZWQgPT09IFwiYm9vbGVhblwiID9cblx0XHRcdGNzc0ZuLmFwcGx5KCB0aGlzLCBhcmd1bWVudHMgKSA6XG5cdFx0XHR0aGlzLmFuaW1hdGUoIGdlbkZ4KCBuYW1lLCB0cnVlICksIHNwZWVkLCBlYXNpbmcsIGNhbGxiYWNrICk7XG5cdH07XG59ICk7XG5cbi8vIEdlbmVyYXRlIHNob3J0Y3V0cyBmb3IgY3VzdG9tIGFuaW1hdGlvbnNcbmpRdWVyeS5lYWNoKCB7XG5cdHNsaWRlRG93bjogZ2VuRngoIFwic2hvd1wiICksXG5cdHNsaWRlVXA6IGdlbkZ4KCBcImhpZGVcIiApLFxuXHRzbGlkZVRvZ2dsZTogZ2VuRngoIFwidG9nZ2xlXCIgKSxcblx0ZmFkZUluOiB7IG9wYWNpdHk6IFwic2hvd1wiIH0sXG5cdGZhZGVPdXQ6IHsgb3BhY2l0eTogXCJoaWRlXCIgfSxcblx0ZmFkZVRvZ2dsZTogeyBvcGFjaXR5OiBcInRvZ2dsZVwiIH1cbn0sIGZ1bmN0aW9uKCBuYW1lLCBwcm9wcyApIHtcblx0alF1ZXJ5LmZuWyBuYW1lIF0gPSBmdW5jdGlvbiggc3BlZWQsIGVhc2luZywgY2FsbGJhY2sgKSB7XG5cdFx0cmV0dXJuIHRoaXMuYW5pbWF0ZSggcHJvcHMsIHNwZWVkLCBlYXNpbmcsIGNhbGxiYWNrICk7XG5cdH07XG59ICk7XG5cbmpRdWVyeS50aW1lcnMgPSBbXTtcbmpRdWVyeS5meC50aWNrID0gZnVuY3Rpb24oKSB7XG5cdHZhciB0aW1lcixcblx0XHRpID0gMCxcblx0XHR0aW1lcnMgPSBqUXVlcnkudGltZXJzO1xuXG5cdGZ4Tm93ID0galF1ZXJ5Lm5vdygpO1xuXG5cdGZvciAoIDsgaSA8IHRpbWVycy5sZW5ndGg7IGkrKyApIHtcblx0XHR0aW1lciA9IHRpbWVyc1sgaSBdO1xuXG5cdFx0Ly8gQ2hlY2tzIHRoZSB0aW1lciBoYXMgbm90IGFscmVhZHkgYmVlbiByZW1vdmVkXG5cdFx0aWYgKCAhdGltZXIoKSAmJiB0aW1lcnNbIGkgXSA9PT0gdGltZXIgKSB7XG5cdFx0XHR0aW1lcnMuc3BsaWNlKCBpLS0sIDEgKTtcblx0XHR9XG5cdH1cblxuXHRpZiAoICF0aW1lcnMubGVuZ3RoICkge1xuXHRcdGpRdWVyeS5meC5zdG9wKCk7XG5cdH1cblx0ZnhOb3cgPSB1bmRlZmluZWQ7XG59O1xuXG5qUXVlcnkuZngudGltZXIgPSBmdW5jdGlvbiggdGltZXIgKSB7XG5cdGpRdWVyeS50aW1lcnMucHVzaCggdGltZXIgKTtcblx0aWYgKCB0aW1lcigpICkge1xuXHRcdGpRdWVyeS5meC5zdGFydCgpO1xuXHR9IGVsc2Uge1xuXHRcdGpRdWVyeS50aW1lcnMucG9wKCk7XG5cdH1cbn07XG5cbmpRdWVyeS5meC5pbnRlcnZhbCA9IDEzO1xualF1ZXJ5LmZ4LnN0YXJ0ID0gZnVuY3Rpb24oKSB7XG5cdGlmICggIXRpbWVySWQgKSB7XG5cdFx0dGltZXJJZCA9IHdpbmRvdy5zZXRJbnRlcnZhbCggalF1ZXJ5LmZ4LnRpY2ssIGpRdWVyeS5meC5pbnRlcnZhbCApO1xuXHR9XG59O1xuXG5qUXVlcnkuZnguc3RvcCA9IGZ1bmN0aW9uKCkge1xuXHR3aW5kb3cuY2xlYXJJbnRlcnZhbCggdGltZXJJZCApO1xuXG5cdHRpbWVySWQgPSBudWxsO1xufTtcblxualF1ZXJ5LmZ4LnNwZWVkcyA9IHtcblx0c2xvdzogNjAwLFxuXHRmYXN0OiAyMDAsXG5cblx0Ly8gRGVmYXVsdCBzcGVlZFxuXHRfZGVmYXVsdDogNDAwXG59O1xuXG5cbi8vIEJhc2VkIG9mZiBvZiB0aGUgcGx1Z2luIGJ5IENsaW50IEhlbGZlcnMsIHdpdGggcGVybWlzc2lvbi5cbi8vIGh0dHA6Ly93ZWIuYXJjaGl2ZS5vcmcvd2ViLzIwMTAwMzI0MDE0NzQ3L2h0dHA6Ly9ibGluZHNpZ25hbHMuY29tL2luZGV4LnBocC8yMDA5LzA3L2pxdWVyeS1kZWxheS9cbmpRdWVyeS5mbi5kZWxheSA9IGZ1bmN0aW9uKCB0aW1lLCB0eXBlICkge1xuXHR0aW1lID0galF1ZXJ5LmZ4ID8galF1ZXJ5LmZ4LnNwZWVkc1sgdGltZSBdIHx8IHRpbWUgOiB0aW1lO1xuXHR0eXBlID0gdHlwZSB8fCBcImZ4XCI7XG5cblx0cmV0dXJuIHRoaXMucXVldWUoIHR5cGUsIGZ1bmN0aW9uKCBuZXh0LCBob29rcyApIHtcblx0XHR2YXIgdGltZW91dCA9IHdpbmRvdy5zZXRUaW1lb3V0KCBuZXh0LCB0aW1lICk7XG5cdFx0aG9va3Muc3RvcCA9IGZ1bmN0aW9uKCkge1xuXHRcdFx0d2luZG93LmNsZWFyVGltZW91dCggdGltZW91dCApO1xuXHRcdH07XG5cdH0gKTtcbn07XG5cblxuKCBmdW5jdGlvbigpIHtcblx0dmFyIGlucHV0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCggXCJpbnB1dFwiICksXG5cdFx0c2VsZWN0ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCggXCJzZWxlY3RcIiApLFxuXHRcdG9wdCA9IHNlbGVjdC5hcHBlbmRDaGlsZCggZG9jdW1lbnQuY3JlYXRlRWxlbWVudCggXCJvcHRpb25cIiApICk7XG5cblx0aW5wdXQudHlwZSA9IFwiY2hlY2tib3hcIjtcblxuXHQvLyBTdXBwb3J0OiBpT1M8PTUuMSwgQW5kcm9pZDw9NC4yK1xuXHQvLyBEZWZhdWx0IHZhbHVlIGZvciBhIGNoZWNrYm94IHNob3VsZCBiZSBcIm9uXCJcblx0c3VwcG9ydC5jaGVja09uID0gaW5wdXQudmFsdWUgIT09IFwiXCI7XG5cblx0Ly8gU3VwcG9ydDogSUU8PTExK1xuXHQvLyBNdXN0IGFjY2VzcyBzZWxlY3RlZEluZGV4IHRvIG1ha2UgZGVmYXVsdCBvcHRpb25zIHNlbGVjdFxuXHRzdXBwb3J0Lm9wdFNlbGVjdGVkID0gb3B0LnNlbGVjdGVkO1xuXG5cdC8vIFN1cHBvcnQ6IEFuZHJvaWQ8PTIuM1xuXHQvLyBPcHRpb25zIGluc2lkZSBkaXNhYmxlZCBzZWxlY3RzIGFyZSBpbmNvcnJlY3RseSBtYXJrZWQgYXMgZGlzYWJsZWRcblx0c2VsZWN0LmRpc2FibGVkID0gdHJ1ZTtcblx0c3VwcG9ydC5vcHREaXNhYmxlZCA9ICFvcHQuZGlzYWJsZWQ7XG5cblx0Ly8gU3VwcG9ydDogSUU8PTExK1xuXHQvLyBBbiBpbnB1dCBsb3NlcyBpdHMgdmFsdWUgYWZ0ZXIgYmVjb21pbmcgYSByYWRpb1xuXHRpbnB1dCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIFwiaW5wdXRcIiApO1xuXHRpbnB1dC52YWx1ZSA9IFwidFwiO1xuXHRpbnB1dC50eXBlID0gXCJyYWRpb1wiO1xuXHRzdXBwb3J0LnJhZGlvVmFsdWUgPSBpbnB1dC52YWx1ZSA9PT0gXCJ0XCI7XG59ICkoKTtcblxuXG52YXIgYm9vbEhvb2ssXG5cdGF0dHJIYW5kbGUgPSBqUXVlcnkuZXhwci5hdHRySGFuZGxlO1xuXG5qUXVlcnkuZm4uZXh0ZW5kKCB7XG5cdGF0dHI6IGZ1bmN0aW9uKCBuYW1lLCB2YWx1ZSApIHtcblx0XHRyZXR1cm4gYWNjZXNzKCB0aGlzLCBqUXVlcnkuYXR0ciwgbmFtZSwgdmFsdWUsIGFyZ3VtZW50cy5sZW5ndGggPiAxICk7XG5cdH0sXG5cblx0cmVtb3ZlQXR0cjogZnVuY3Rpb24oIG5hbWUgKSB7XG5cdFx0cmV0dXJuIHRoaXMuZWFjaCggZnVuY3Rpb24oKSB7XG5cdFx0XHRqUXVlcnkucmVtb3ZlQXR0ciggdGhpcywgbmFtZSApO1xuXHRcdH0gKTtcblx0fVxufSApO1xuXG5qUXVlcnkuZXh0ZW5kKCB7XG5cdGF0dHI6IGZ1bmN0aW9uKCBlbGVtLCBuYW1lLCB2YWx1ZSApIHtcblx0XHR2YXIgcmV0LCBob29rcyxcblx0XHRcdG5UeXBlID0gZWxlbS5ub2RlVHlwZTtcblxuXHRcdC8vIERvbid0IGdldC9zZXQgYXR0cmlidXRlcyBvbiB0ZXh0LCBjb21tZW50IGFuZCBhdHRyaWJ1dGUgbm9kZXNcblx0XHRpZiAoIG5UeXBlID09PSAzIHx8IG5UeXBlID09PSA4IHx8IG5UeXBlID09PSAyICkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdC8vIEZhbGxiYWNrIHRvIHByb3Agd2hlbiBhdHRyaWJ1dGVzIGFyZSBub3Qgc3VwcG9ydGVkXG5cdFx0aWYgKCB0eXBlb2YgZWxlbS5nZXRBdHRyaWJ1dGUgPT09IFwidW5kZWZpbmVkXCIgKSB7XG5cdFx0XHRyZXR1cm4galF1ZXJ5LnByb3AoIGVsZW0sIG5hbWUsIHZhbHVlICk7XG5cdFx0fVxuXG5cdFx0Ly8gQWxsIGF0dHJpYnV0ZXMgYXJlIGxvd2VyY2FzZVxuXHRcdC8vIEdyYWIgbmVjZXNzYXJ5IGhvb2sgaWYgb25lIGlzIGRlZmluZWRcblx0XHRpZiAoIG5UeXBlICE9PSAxIHx8ICFqUXVlcnkuaXNYTUxEb2MoIGVsZW0gKSApIHtcblx0XHRcdG5hbWUgPSBuYW1lLnRvTG93ZXJDYXNlKCk7XG5cdFx0XHRob29rcyA9IGpRdWVyeS5hdHRySG9va3NbIG5hbWUgXSB8fFxuXHRcdFx0XHQoIGpRdWVyeS5leHByLm1hdGNoLmJvb2wudGVzdCggbmFtZSApID8gYm9vbEhvb2sgOiB1bmRlZmluZWQgKTtcblx0XHR9XG5cblx0XHRpZiAoIHZhbHVlICE9PSB1bmRlZmluZWQgKSB7XG5cdFx0XHRpZiAoIHZhbHVlID09PSBudWxsICkge1xuXHRcdFx0XHRqUXVlcnkucmVtb3ZlQXR0ciggZWxlbSwgbmFtZSApO1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cblx0XHRcdGlmICggaG9va3MgJiYgXCJzZXRcIiBpbiBob29rcyAmJlxuXHRcdFx0XHQoIHJldCA9IGhvb2tzLnNldCggZWxlbSwgdmFsdWUsIG5hbWUgKSApICE9PSB1bmRlZmluZWQgKSB7XG5cdFx0XHRcdHJldHVybiByZXQ7XG5cdFx0XHR9XG5cblx0XHRcdGVsZW0uc2V0QXR0cmlidXRlKCBuYW1lLCB2YWx1ZSArIFwiXCIgKTtcblx0XHRcdHJldHVybiB2YWx1ZTtcblx0XHR9XG5cblx0XHRpZiAoIGhvb2tzICYmIFwiZ2V0XCIgaW4gaG9va3MgJiYgKCByZXQgPSBob29rcy5nZXQoIGVsZW0sIG5hbWUgKSApICE9PSBudWxsICkge1xuXHRcdFx0cmV0dXJuIHJldDtcblx0XHR9XG5cblx0XHRyZXQgPSBqUXVlcnkuZmluZC5hdHRyKCBlbGVtLCBuYW1lICk7XG5cblx0XHQvLyBOb24tZXhpc3RlbnQgYXR0cmlidXRlcyByZXR1cm4gbnVsbCwgd2Ugbm9ybWFsaXplIHRvIHVuZGVmaW5lZFxuXHRcdHJldHVybiByZXQgPT0gbnVsbCA/IHVuZGVmaW5lZCA6IHJldDtcblx0fSxcblxuXHRhdHRySG9va3M6IHtcblx0XHR0eXBlOiB7XG5cdFx0XHRzZXQ6IGZ1bmN0aW9uKCBlbGVtLCB2YWx1ZSApIHtcblx0XHRcdFx0aWYgKCAhc3VwcG9ydC5yYWRpb1ZhbHVlICYmIHZhbHVlID09PSBcInJhZGlvXCIgJiZcblx0XHRcdFx0XHRqUXVlcnkubm9kZU5hbWUoIGVsZW0sIFwiaW5wdXRcIiApICkge1xuXHRcdFx0XHRcdHZhciB2YWwgPSBlbGVtLnZhbHVlO1xuXHRcdFx0XHRcdGVsZW0uc2V0QXR0cmlidXRlKCBcInR5cGVcIiwgdmFsdWUgKTtcblx0XHRcdFx0XHRpZiAoIHZhbCApIHtcblx0XHRcdFx0XHRcdGVsZW0udmFsdWUgPSB2YWw7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdHJldHVybiB2YWx1ZTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0fSxcblxuXHRyZW1vdmVBdHRyOiBmdW5jdGlvbiggZWxlbSwgdmFsdWUgKSB7XG5cdFx0dmFyIG5hbWUsIHByb3BOYW1lLFxuXHRcdFx0aSA9IDAsXG5cdFx0XHRhdHRyTmFtZXMgPSB2YWx1ZSAmJiB2YWx1ZS5tYXRjaCggcm5vdHdoaXRlICk7XG5cblx0XHRpZiAoIGF0dHJOYW1lcyAmJiBlbGVtLm5vZGVUeXBlID09PSAxICkge1xuXHRcdFx0d2hpbGUgKCAoIG5hbWUgPSBhdHRyTmFtZXNbIGkrKyBdICkgKSB7XG5cdFx0XHRcdHByb3BOYW1lID0galF1ZXJ5LnByb3BGaXhbIG5hbWUgXSB8fCBuYW1lO1xuXG5cdFx0XHRcdC8vIEJvb2xlYW4gYXR0cmlidXRlcyBnZXQgc3BlY2lhbCB0cmVhdG1lbnQgKCMxMDg3MClcblx0XHRcdFx0aWYgKCBqUXVlcnkuZXhwci5tYXRjaC5ib29sLnRlc3QoIG5hbWUgKSApIHtcblxuXHRcdFx0XHRcdC8vIFNldCBjb3JyZXNwb25kaW5nIHByb3BlcnR5IHRvIGZhbHNlXG5cdFx0XHRcdFx0ZWxlbVsgcHJvcE5hbWUgXSA9IGZhbHNlO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0ZWxlbS5yZW1vdmVBdHRyaWJ1dGUoIG5hbWUgKTtcblx0XHRcdH1cblx0XHR9XG5cdH1cbn0gKTtcblxuLy8gSG9va3MgZm9yIGJvb2xlYW4gYXR0cmlidXRlc1xuYm9vbEhvb2sgPSB7XG5cdHNldDogZnVuY3Rpb24oIGVsZW0sIHZhbHVlLCBuYW1lICkge1xuXHRcdGlmICggdmFsdWUgPT09IGZhbHNlICkge1xuXG5cdFx0XHQvLyBSZW1vdmUgYm9vbGVhbiBhdHRyaWJ1dGVzIHdoZW4gc2V0IHRvIGZhbHNlXG5cdFx0XHRqUXVlcnkucmVtb3ZlQXR0ciggZWxlbSwgbmFtZSApO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRlbGVtLnNldEF0dHJpYnV0ZSggbmFtZSwgbmFtZSApO1xuXHRcdH1cblx0XHRyZXR1cm4gbmFtZTtcblx0fVxufTtcbmpRdWVyeS5lYWNoKCBqUXVlcnkuZXhwci5tYXRjaC5ib29sLnNvdXJjZS5tYXRjaCggL1xcdysvZyApLCBmdW5jdGlvbiggaSwgbmFtZSApIHtcblx0dmFyIGdldHRlciA9IGF0dHJIYW5kbGVbIG5hbWUgXSB8fCBqUXVlcnkuZmluZC5hdHRyO1xuXG5cdGF0dHJIYW5kbGVbIG5hbWUgXSA9IGZ1bmN0aW9uKCBlbGVtLCBuYW1lLCBpc1hNTCApIHtcblx0XHR2YXIgcmV0LCBoYW5kbGU7XG5cdFx0aWYgKCAhaXNYTUwgKSB7XG5cblx0XHRcdC8vIEF2b2lkIGFuIGluZmluaXRlIGxvb3AgYnkgdGVtcG9yYXJpbHkgcmVtb3ZpbmcgdGhpcyBmdW5jdGlvbiBmcm9tIHRoZSBnZXR0ZXJcblx0XHRcdGhhbmRsZSA9IGF0dHJIYW5kbGVbIG5hbWUgXTtcblx0XHRcdGF0dHJIYW5kbGVbIG5hbWUgXSA9IHJldDtcblx0XHRcdHJldCA9IGdldHRlciggZWxlbSwgbmFtZSwgaXNYTUwgKSAhPSBudWxsID9cblx0XHRcdFx0bmFtZS50b0xvd2VyQ2FzZSgpIDpcblx0XHRcdFx0bnVsbDtcblx0XHRcdGF0dHJIYW5kbGVbIG5hbWUgXSA9IGhhbmRsZTtcblx0XHR9XG5cdFx0cmV0dXJuIHJldDtcblx0fTtcbn0gKTtcblxuXG5cblxudmFyIHJmb2N1c2FibGUgPSAvXig/OmlucHV0fHNlbGVjdHx0ZXh0YXJlYXxidXR0b24pJC9pLFxuXHRyY2xpY2thYmxlID0gL14oPzphfGFyZWEpJC9pO1xuXG5qUXVlcnkuZm4uZXh0ZW5kKCB7XG5cdHByb3A6IGZ1bmN0aW9uKCBuYW1lLCB2YWx1ZSApIHtcblx0XHRyZXR1cm4gYWNjZXNzKCB0aGlzLCBqUXVlcnkucHJvcCwgbmFtZSwgdmFsdWUsIGFyZ3VtZW50cy5sZW5ndGggPiAxICk7XG5cdH0sXG5cblx0cmVtb3ZlUHJvcDogZnVuY3Rpb24oIG5hbWUgKSB7XG5cdFx0cmV0dXJuIHRoaXMuZWFjaCggZnVuY3Rpb24oKSB7XG5cdFx0XHRkZWxldGUgdGhpc1sgalF1ZXJ5LnByb3BGaXhbIG5hbWUgXSB8fCBuYW1lIF07XG5cdFx0fSApO1xuXHR9XG59ICk7XG5cbmpRdWVyeS5leHRlbmQoIHtcblx0cHJvcDogZnVuY3Rpb24oIGVsZW0sIG5hbWUsIHZhbHVlICkge1xuXHRcdHZhciByZXQsIGhvb2tzLFxuXHRcdFx0blR5cGUgPSBlbGVtLm5vZGVUeXBlO1xuXG5cdFx0Ly8gRG9uJ3QgZ2V0L3NldCBwcm9wZXJ0aWVzIG9uIHRleHQsIGNvbW1lbnQgYW5kIGF0dHJpYnV0ZSBub2Rlc1xuXHRcdGlmICggblR5cGUgPT09IDMgfHwgblR5cGUgPT09IDggfHwgblR5cGUgPT09IDIgKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0aWYgKCBuVHlwZSAhPT0gMSB8fCAhalF1ZXJ5LmlzWE1MRG9jKCBlbGVtICkgKSB7XG5cblx0XHRcdC8vIEZpeCBuYW1lIGFuZCBhdHRhY2ggaG9va3Ncblx0XHRcdG5hbWUgPSBqUXVlcnkucHJvcEZpeFsgbmFtZSBdIHx8IG5hbWU7XG5cdFx0XHRob29rcyA9IGpRdWVyeS5wcm9wSG9va3NbIG5hbWUgXTtcblx0XHR9XG5cblx0XHRpZiAoIHZhbHVlICE9PSB1bmRlZmluZWQgKSB7XG5cdFx0XHRpZiAoIGhvb2tzICYmIFwic2V0XCIgaW4gaG9va3MgJiZcblx0XHRcdFx0KCByZXQgPSBob29rcy5zZXQoIGVsZW0sIHZhbHVlLCBuYW1lICkgKSAhPT0gdW5kZWZpbmVkICkge1xuXHRcdFx0XHRyZXR1cm4gcmV0O1xuXHRcdFx0fVxuXG5cdFx0XHRyZXR1cm4gKCBlbGVtWyBuYW1lIF0gPSB2YWx1ZSApO1xuXHRcdH1cblxuXHRcdGlmICggaG9va3MgJiYgXCJnZXRcIiBpbiBob29rcyAmJiAoIHJldCA9IGhvb2tzLmdldCggZWxlbSwgbmFtZSApICkgIT09IG51bGwgKSB7XG5cdFx0XHRyZXR1cm4gcmV0O1xuXHRcdH1cblxuXHRcdHJldHVybiBlbGVtWyBuYW1lIF07XG5cdH0sXG5cblx0cHJvcEhvb2tzOiB7XG5cdFx0dGFiSW5kZXg6IHtcblx0XHRcdGdldDogZnVuY3Rpb24oIGVsZW0gKSB7XG5cblx0XHRcdFx0Ly8gZWxlbS50YWJJbmRleCBkb2Vzbid0IGFsd2F5cyByZXR1cm4gdGhlXG5cdFx0XHRcdC8vIGNvcnJlY3QgdmFsdWUgd2hlbiBpdCBoYXNuJ3QgYmVlbiBleHBsaWNpdGx5IHNldFxuXHRcdFx0XHQvLyBodHRwOi8vZmx1aWRwcm9qZWN0Lm9yZy9ibG9nLzIwMDgvMDEvMDkvZ2V0dGluZy1zZXR0aW5nLWFuZC1yZW1vdmluZy10YWJpbmRleC12YWx1ZXMtd2l0aC1qYXZhc2NyaXB0L1xuXHRcdFx0XHQvLyBVc2UgcHJvcGVyIGF0dHJpYnV0ZSByZXRyaWV2YWwoIzEyMDcyKVxuXHRcdFx0XHR2YXIgdGFiaW5kZXggPSBqUXVlcnkuZmluZC5hdHRyKCBlbGVtLCBcInRhYmluZGV4XCIgKTtcblxuXHRcdFx0XHRyZXR1cm4gdGFiaW5kZXggP1xuXHRcdFx0XHRcdHBhcnNlSW50KCB0YWJpbmRleCwgMTAgKSA6XG5cdFx0XHRcdFx0cmZvY3VzYWJsZS50ZXN0KCBlbGVtLm5vZGVOYW1lICkgfHxcblx0XHRcdFx0XHRcdHJjbGlja2FibGUudGVzdCggZWxlbS5ub2RlTmFtZSApICYmIGVsZW0uaHJlZiA/XG5cdFx0XHRcdFx0XHRcdDAgOlxuXHRcdFx0XHRcdFx0XHQtMTtcblx0XHRcdH1cblx0XHR9XG5cdH0sXG5cblx0cHJvcEZpeDoge1xuXHRcdFwiZm9yXCI6IFwiaHRtbEZvclwiLFxuXHRcdFwiY2xhc3NcIjogXCJjbGFzc05hbWVcIlxuXHR9XG59ICk7XG5cbi8vIFN1cHBvcnQ6IElFIDw9MTEgb25seVxuLy8gQWNjZXNzaW5nIHRoZSBzZWxlY3RlZEluZGV4IHByb3BlcnR5XG4vLyBmb3JjZXMgdGhlIGJyb3dzZXIgdG8gcmVzcGVjdCBzZXR0aW5nIHNlbGVjdGVkXG4vLyBvbiB0aGUgb3B0aW9uXG4vLyBUaGUgZ2V0dGVyIGVuc3VyZXMgYSBkZWZhdWx0IG9wdGlvbiBpcyBzZWxlY3RlZFxuLy8gd2hlbiBpbiBhbiBvcHRncm91cFxuaWYgKCAhc3VwcG9ydC5vcHRTZWxlY3RlZCApIHtcblx0alF1ZXJ5LnByb3BIb29rcy5zZWxlY3RlZCA9IHtcblx0XHRnZXQ6IGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0dmFyIHBhcmVudCA9IGVsZW0ucGFyZW50Tm9kZTtcblx0XHRcdGlmICggcGFyZW50ICYmIHBhcmVudC5wYXJlbnROb2RlICkge1xuXHRcdFx0XHRwYXJlbnQucGFyZW50Tm9kZS5zZWxlY3RlZEluZGV4O1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIG51bGw7XG5cdFx0fSxcblx0XHRzZXQ6IGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0dmFyIHBhcmVudCA9IGVsZW0ucGFyZW50Tm9kZTtcblx0XHRcdGlmICggcGFyZW50ICkge1xuXHRcdFx0XHRwYXJlbnQuc2VsZWN0ZWRJbmRleDtcblxuXHRcdFx0XHRpZiAoIHBhcmVudC5wYXJlbnROb2RlICkge1xuXHRcdFx0XHRcdHBhcmVudC5wYXJlbnROb2RlLnNlbGVjdGVkSW5kZXg7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdH07XG59XG5cbmpRdWVyeS5lYWNoKCBbXG5cdFwidGFiSW5kZXhcIixcblx0XCJyZWFkT25seVwiLFxuXHRcIm1heExlbmd0aFwiLFxuXHRcImNlbGxTcGFjaW5nXCIsXG5cdFwiY2VsbFBhZGRpbmdcIixcblx0XCJyb3dTcGFuXCIsXG5cdFwiY29sU3BhblwiLFxuXHRcInVzZU1hcFwiLFxuXHRcImZyYW1lQm9yZGVyXCIsXG5cdFwiY29udGVudEVkaXRhYmxlXCJcbl0sIGZ1bmN0aW9uKCkge1xuXHRqUXVlcnkucHJvcEZpeFsgdGhpcy50b0xvd2VyQ2FzZSgpIF0gPSB0aGlzO1xufSApO1xuXG5cblxuXG52YXIgcmNsYXNzID0gL1tcXHRcXHJcXG5cXGZdL2c7XG5cbmZ1bmN0aW9uIGdldENsYXNzKCBlbGVtICkge1xuXHRyZXR1cm4gZWxlbS5nZXRBdHRyaWJ1dGUgJiYgZWxlbS5nZXRBdHRyaWJ1dGUoIFwiY2xhc3NcIiApIHx8IFwiXCI7XG59XG5cbmpRdWVyeS5mbi5leHRlbmQoIHtcblx0YWRkQ2xhc3M6IGZ1bmN0aW9uKCB2YWx1ZSApIHtcblx0XHR2YXIgY2xhc3NlcywgZWxlbSwgY3VyLCBjdXJWYWx1ZSwgY2xhenosIGosIGZpbmFsVmFsdWUsXG5cdFx0XHRpID0gMDtcblxuXHRcdGlmICggalF1ZXJ5LmlzRnVuY3Rpb24oIHZhbHVlICkgKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5lYWNoKCBmdW5jdGlvbiggaiApIHtcblx0XHRcdFx0alF1ZXJ5KCB0aGlzICkuYWRkQ2xhc3MoIHZhbHVlLmNhbGwoIHRoaXMsIGosIGdldENsYXNzKCB0aGlzICkgKSApO1xuXHRcdFx0fSApO1xuXHRcdH1cblxuXHRcdGlmICggdHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiICYmIHZhbHVlICkge1xuXHRcdFx0Y2xhc3NlcyA9IHZhbHVlLm1hdGNoKCBybm90d2hpdGUgKSB8fCBbXTtcblxuXHRcdFx0d2hpbGUgKCAoIGVsZW0gPSB0aGlzWyBpKysgXSApICkge1xuXHRcdFx0XHRjdXJWYWx1ZSA9IGdldENsYXNzKCBlbGVtICk7XG5cdFx0XHRcdGN1ciA9IGVsZW0ubm9kZVR5cGUgPT09IDEgJiZcblx0XHRcdFx0XHQoIFwiIFwiICsgY3VyVmFsdWUgKyBcIiBcIiApLnJlcGxhY2UoIHJjbGFzcywgXCIgXCIgKTtcblxuXHRcdFx0XHRpZiAoIGN1ciApIHtcblx0XHRcdFx0XHRqID0gMDtcblx0XHRcdFx0XHR3aGlsZSAoICggY2xhenogPSBjbGFzc2VzWyBqKysgXSApICkge1xuXHRcdFx0XHRcdFx0aWYgKCBjdXIuaW5kZXhPZiggXCIgXCIgKyBjbGF6eiArIFwiIFwiICkgPCAwICkge1xuXHRcdFx0XHRcdFx0XHRjdXIgKz0gY2xhenogKyBcIiBcIjtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHQvLyBPbmx5IGFzc2lnbiBpZiBkaWZmZXJlbnQgdG8gYXZvaWQgdW5uZWVkZWQgcmVuZGVyaW5nLlxuXHRcdFx0XHRcdGZpbmFsVmFsdWUgPSBqUXVlcnkudHJpbSggY3VyICk7XG5cdFx0XHRcdFx0aWYgKCBjdXJWYWx1ZSAhPT0gZmluYWxWYWx1ZSApIHtcblx0XHRcdFx0XHRcdGVsZW0uc2V0QXR0cmlidXRlKCBcImNsYXNzXCIsIGZpbmFsVmFsdWUgKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcztcblx0fSxcblxuXHRyZW1vdmVDbGFzczogZnVuY3Rpb24oIHZhbHVlICkge1xuXHRcdHZhciBjbGFzc2VzLCBlbGVtLCBjdXIsIGN1clZhbHVlLCBjbGF6eiwgaiwgZmluYWxWYWx1ZSxcblx0XHRcdGkgPSAwO1xuXG5cdFx0aWYgKCBqUXVlcnkuaXNGdW5jdGlvbiggdmFsdWUgKSApIHtcblx0XHRcdHJldHVybiB0aGlzLmVhY2goIGZ1bmN0aW9uKCBqICkge1xuXHRcdFx0XHRqUXVlcnkoIHRoaXMgKS5yZW1vdmVDbGFzcyggdmFsdWUuY2FsbCggdGhpcywgaiwgZ2V0Q2xhc3MoIHRoaXMgKSApICk7XG5cdFx0XHR9ICk7XG5cdFx0fVxuXG5cdFx0aWYgKCAhYXJndW1lbnRzLmxlbmd0aCApIHtcblx0XHRcdHJldHVybiB0aGlzLmF0dHIoIFwiY2xhc3NcIiwgXCJcIiApO1xuXHRcdH1cblxuXHRcdGlmICggdHlwZW9mIHZhbHVlID09PSBcInN0cmluZ1wiICYmIHZhbHVlICkge1xuXHRcdFx0Y2xhc3NlcyA9IHZhbHVlLm1hdGNoKCBybm90d2hpdGUgKSB8fCBbXTtcblxuXHRcdFx0d2hpbGUgKCAoIGVsZW0gPSB0aGlzWyBpKysgXSApICkge1xuXHRcdFx0XHRjdXJWYWx1ZSA9IGdldENsYXNzKCBlbGVtICk7XG5cblx0XHRcdFx0Ly8gVGhpcyBleHByZXNzaW9uIGlzIGhlcmUgZm9yIGJldHRlciBjb21wcmVzc2liaWxpdHkgKHNlZSBhZGRDbGFzcylcblx0XHRcdFx0Y3VyID0gZWxlbS5ub2RlVHlwZSA9PT0gMSAmJlxuXHRcdFx0XHRcdCggXCIgXCIgKyBjdXJWYWx1ZSArIFwiIFwiICkucmVwbGFjZSggcmNsYXNzLCBcIiBcIiApO1xuXG5cdFx0XHRcdGlmICggY3VyICkge1xuXHRcdFx0XHRcdGogPSAwO1xuXHRcdFx0XHRcdHdoaWxlICggKCBjbGF6eiA9IGNsYXNzZXNbIGorKyBdICkgKSB7XG5cblx0XHRcdFx0XHRcdC8vIFJlbW92ZSAqYWxsKiBpbnN0YW5jZXNcblx0XHRcdFx0XHRcdHdoaWxlICggY3VyLmluZGV4T2YoIFwiIFwiICsgY2xhenogKyBcIiBcIiApID4gLTEgKSB7XG5cdFx0XHRcdFx0XHRcdGN1ciA9IGN1ci5yZXBsYWNlKCBcIiBcIiArIGNsYXp6ICsgXCIgXCIsIFwiIFwiICk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0Ly8gT25seSBhc3NpZ24gaWYgZGlmZmVyZW50IHRvIGF2b2lkIHVubmVlZGVkIHJlbmRlcmluZy5cblx0XHRcdFx0XHRmaW5hbFZhbHVlID0galF1ZXJ5LnRyaW0oIGN1ciApO1xuXHRcdFx0XHRcdGlmICggY3VyVmFsdWUgIT09IGZpbmFsVmFsdWUgKSB7XG5cdFx0XHRcdFx0XHRlbGVtLnNldEF0dHJpYnV0ZSggXCJjbGFzc1wiLCBmaW5hbFZhbHVlICk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXM7XG5cdH0sXG5cblx0dG9nZ2xlQ2xhc3M6IGZ1bmN0aW9uKCB2YWx1ZSwgc3RhdGVWYWwgKSB7XG5cdFx0dmFyIHR5cGUgPSB0eXBlb2YgdmFsdWU7XG5cblx0XHRpZiAoIHR5cGVvZiBzdGF0ZVZhbCA9PT0gXCJib29sZWFuXCIgJiYgdHlwZSA9PT0gXCJzdHJpbmdcIiApIHtcblx0XHRcdHJldHVybiBzdGF0ZVZhbCA/IHRoaXMuYWRkQ2xhc3MoIHZhbHVlICkgOiB0aGlzLnJlbW92ZUNsYXNzKCB2YWx1ZSApO1xuXHRcdH1cblxuXHRcdGlmICggalF1ZXJ5LmlzRnVuY3Rpb24oIHZhbHVlICkgKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5lYWNoKCBmdW5jdGlvbiggaSApIHtcblx0XHRcdFx0alF1ZXJ5KCB0aGlzICkudG9nZ2xlQ2xhc3MoXG5cdFx0XHRcdFx0dmFsdWUuY2FsbCggdGhpcywgaSwgZ2V0Q2xhc3MoIHRoaXMgKSwgc3RhdGVWYWwgKSxcblx0XHRcdFx0XHRzdGF0ZVZhbFxuXHRcdFx0XHQpO1xuXHRcdFx0fSApO1xuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzLmVhY2goIGZ1bmN0aW9uKCkge1xuXHRcdFx0dmFyIGNsYXNzTmFtZSwgaSwgc2VsZiwgY2xhc3NOYW1lcztcblxuXHRcdFx0aWYgKCB0eXBlID09PSBcInN0cmluZ1wiICkge1xuXG5cdFx0XHRcdC8vIFRvZ2dsZSBpbmRpdmlkdWFsIGNsYXNzIG5hbWVzXG5cdFx0XHRcdGkgPSAwO1xuXHRcdFx0XHRzZWxmID0galF1ZXJ5KCB0aGlzICk7XG5cdFx0XHRcdGNsYXNzTmFtZXMgPSB2YWx1ZS5tYXRjaCggcm5vdHdoaXRlICkgfHwgW107XG5cblx0XHRcdFx0d2hpbGUgKCAoIGNsYXNzTmFtZSA9IGNsYXNzTmFtZXNbIGkrKyBdICkgKSB7XG5cblx0XHRcdFx0XHQvLyBDaGVjayBlYWNoIGNsYXNzTmFtZSBnaXZlbiwgc3BhY2Ugc2VwYXJhdGVkIGxpc3Rcblx0XHRcdFx0XHRpZiAoIHNlbGYuaGFzQ2xhc3MoIGNsYXNzTmFtZSApICkge1xuXHRcdFx0XHRcdFx0c2VsZi5yZW1vdmVDbGFzcyggY2xhc3NOYW1lICk7XG5cdFx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHRcdHNlbGYuYWRkQ2xhc3MoIGNsYXNzTmFtZSApO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXG5cdFx0XHQvLyBUb2dnbGUgd2hvbGUgY2xhc3MgbmFtZVxuXHRcdFx0fSBlbHNlIGlmICggdmFsdWUgPT09IHVuZGVmaW5lZCB8fCB0eXBlID09PSBcImJvb2xlYW5cIiApIHtcblx0XHRcdFx0Y2xhc3NOYW1lID0gZ2V0Q2xhc3MoIHRoaXMgKTtcblx0XHRcdFx0aWYgKCBjbGFzc05hbWUgKSB7XG5cblx0XHRcdFx0XHQvLyBTdG9yZSBjbGFzc05hbWUgaWYgc2V0XG5cdFx0XHRcdFx0ZGF0YVByaXYuc2V0KCB0aGlzLCBcIl9fY2xhc3NOYW1lX19cIiwgY2xhc3NOYW1lICk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBJZiB0aGUgZWxlbWVudCBoYXMgYSBjbGFzcyBuYW1lIG9yIGlmIHdlJ3JlIHBhc3NlZCBgZmFsc2VgLFxuXHRcdFx0XHQvLyB0aGVuIHJlbW92ZSB0aGUgd2hvbGUgY2xhc3NuYW1lIChpZiB0aGVyZSB3YXMgb25lLCB0aGUgYWJvdmUgc2F2ZWQgaXQpLlxuXHRcdFx0XHQvLyBPdGhlcndpc2UgYnJpbmcgYmFjayB3aGF0ZXZlciB3YXMgcHJldmlvdXNseSBzYXZlZCAoaWYgYW55dGhpbmcpLFxuXHRcdFx0XHQvLyBmYWxsaW5nIGJhY2sgdG8gdGhlIGVtcHR5IHN0cmluZyBpZiBub3RoaW5nIHdhcyBzdG9yZWQuXG5cdFx0XHRcdGlmICggdGhpcy5zZXRBdHRyaWJ1dGUgKSB7XG5cdFx0XHRcdFx0dGhpcy5zZXRBdHRyaWJ1dGUoIFwiY2xhc3NcIixcblx0XHRcdFx0XHRcdGNsYXNzTmFtZSB8fCB2YWx1ZSA9PT0gZmFsc2UgP1xuXHRcdFx0XHRcdFx0XCJcIiA6XG5cdFx0XHRcdFx0XHRkYXRhUHJpdi5nZXQoIHRoaXMsIFwiX19jbGFzc05hbWVfX1wiICkgfHwgXCJcIlxuXHRcdFx0XHRcdCk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9ICk7XG5cdH0sXG5cblx0aGFzQ2xhc3M6IGZ1bmN0aW9uKCBzZWxlY3RvciApIHtcblx0XHR2YXIgY2xhc3NOYW1lLCBlbGVtLFxuXHRcdFx0aSA9IDA7XG5cblx0XHRjbGFzc05hbWUgPSBcIiBcIiArIHNlbGVjdG9yICsgXCIgXCI7XG5cdFx0d2hpbGUgKCAoIGVsZW0gPSB0aGlzWyBpKysgXSApICkge1xuXHRcdFx0aWYgKCBlbGVtLm5vZGVUeXBlID09PSAxICYmXG5cdFx0XHRcdCggXCIgXCIgKyBnZXRDbGFzcyggZWxlbSApICsgXCIgXCIgKS5yZXBsYWNlKCByY2xhc3MsIFwiIFwiIClcblx0XHRcdFx0XHQuaW5kZXhPZiggY2xhc3NOYW1lICkgPiAtMVxuXHRcdFx0KSB7XG5cdFx0XHRcdHJldHVybiB0cnVlO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHJldHVybiBmYWxzZTtcblx0fVxufSApO1xuXG5cblxuXG52YXIgcnJldHVybiA9IC9cXHIvZyxcblx0cnNwYWNlcyA9IC9bXFx4MjBcXHRcXHJcXG5cXGZdKy9nO1xuXG5qUXVlcnkuZm4uZXh0ZW5kKCB7XG5cdHZhbDogZnVuY3Rpb24oIHZhbHVlICkge1xuXHRcdHZhciBob29rcywgcmV0LCBpc0Z1bmN0aW9uLFxuXHRcdFx0ZWxlbSA9IHRoaXNbIDAgXTtcblxuXHRcdGlmICggIWFyZ3VtZW50cy5sZW5ndGggKSB7XG5cdFx0XHRpZiAoIGVsZW0gKSB7XG5cdFx0XHRcdGhvb2tzID0galF1ZXJ5LnZhbEhvb2tzWyBlbGVtLnR5cGUgXSB8fFxuXHRcdFx0XHRcdGpRdWVyeS52YWxIb29rc1sgZWxlbS5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpIF07XG5cblx0XHRcdFx0aWYgKCBob29rcyAmJlxuXHRcdFx0XHRcdFwiZ2V0XCIgaW4gaG9va3MgJiZcblx0XHRcdFx0XHQoIHJldCA9IGhvb2tzLmdldCggZWxlbSwgXCJ2YWx1ZVwiICkgKSAhPT0gdW5kZWZpbmVkXG5cdFx0XHRcdCkge1xuXHRcdFx0XHRcdHJldHVybiByZXQ7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHRyZXQgPSBlbGVtLnZhbHVlO1xuXG5cdFx0XHRcdHJldHVybiB0eXBlb2YgcmV0ID09PSBcInN0cmluZ1wiID9cblxuXHRcdFx0XHRcdC8vIEhhbmRsZSBtb3N0IGNvbW1vbiBzdHJpbmcgY2FzZXNcblx0XHRcdFx0XHRyZXQucmVwbGFjZSggcnJldHVybiwgXCJcIiApIDpcblxuXHRcdFx0XHRcdC8vIEhhbmRsZSBjYXNlcyB3aGVyZSB2YWx1ZSBpcyBudWxsL3VuZGVmIG9yIG51bWJlclxuXHRcdFx0XHRcdHJldCA9PSBudWxsID8gXCJcIiA6IHJldDtcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdGlzRnVuY3Rpb24gPSBqUXVlcnkuaXNGdW5jdGlvbiggdmFsdWUgKTtcblxuXHRcdHJldHVybiB0aGlzLmVhY2goIGZ1bmN0aW9uKCBpICkge1xuXHRcdFx0dmFyIHZhbDtcblxuXHRcdFx0aWYgKCB0aGlzLm5vZGVUeXBlICE9PSAxICkge1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cblx0XHRcdGlmICggaXNGdW5jdGlvbiApIHtcblx0XHRcdFx0dmFsID0gdmFsdWUuY2FsbCggdGhpcywgaSwgalF1ZXJ5KCB0aGlzICkudmFsKCkgKTtcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHZhbCA9IHZhbHVlO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBUcmVhdCBudWxsL3VuZGVmaW5lZCBhcyBcIlwiOyBjb252ZXJ0IG51bWJlcnMgdG8gc3RyaW5nXG5cdFx0XHRpZiAoIHZhbCA9PSBudWxsICkge1xuXHRcdFx0XHR2YWwgPSBcIlwiO1xuXG5cdFx0XHR9IGVsc2UgaWYgKCB0eXBlb2YgdmFsID09PSBcIm51bWJlclwiICkge1xuXHRcdFx0XHR2YWwgKz0gXCJcIjtcblxuXHRcdFx0fSBlbHNlIGlmICggalF1ZXJ5LmlzQXJyYXkoIHZhbCApICkge1xuXHRcdFx0XHR2YWwgPSBqUXVlcnkubWFwKCB2YWwsIGZ1bmN0aW9uKCB2YWx1ZSApIHtcblx0XHRcdFx0XHRyZXR1cm4gdmFsdWUgPT0gbnVsbCA/IFwiXCIgOiB2YWx1ZSArIFwiXCI7XG5cdFx0XHRcdH0gKTtcblx0XHRcdH1cblxuXHRcdFx0aG9va3MgPSBqUXVlcnkudmFsSG9va3NbIHRoaXMudHlwZSBdIHx8IGpRdWVyeS52YWxIb29rc1sgdGhpcy5ub2RlTmFtZS50b0xvd2VyQ2FzZSgpIF07XG5cblx0XHRcdC8vIElmIHNldCByZXR1cm5zIHVuZGVmaW5lZCwgZmFsbCBiYWNrIHRvIG5vcm1hbCBzZXR0aW5nXG5cdFx0XHRpZiAoICFob29rcyB8fCAhKCBcInNldFwiIGluIGhvb2tzICkgfHwgaG9va3Muc2V0KCB0aGlzLCB2YWwsIFwidmFsdWVcIiApID09PSB1bmRlZmluZWQgKSB7XG5cdFx0XHRcdHRoaXMudmFsdWUgPSB2YWw7XG5cdFx0XHR9XG5cdFx0fSApO1xuXHR9XG59ICk7XG5cbmpRdWVyeS5leHRlbmQoIHtcblx0dmFsSG9va3M6IHtcblx0XHRvcHRpb246IHtcblx0XHRcdGdldDogZnVuY3Rpb24oIGVsZW0gKSB7XG5cblx0XHRcdFx0dmFyIHZhbCA9IGpRdWVyeS5maW5kLmF0dHIoIGVsZW0sIFwidmFsdWVcIiApO1xuXHRcdFx0XHRyZXR1cm4gdmFsICE9IG51bGwgP1xuXHRcdFx0XHRcdHZhbCA6XG5cblx0XHRcdFx0XHQvLyBTdXBwb3J0OiBJRTEwLTExK1xuXHRcdFx0XHRcdC8vIG9wdGlvbi50ZXh0IHRocm93cyBleGNlcHRpb25zICgjMTQ2ODYsICMxNDg1OClcblx0XHRcdFx0XHQvLyBTdHJpcCBhbmQgY29sbGFwc2Ugd2hpdGVzcGFjZVxuXHRcdFx0XHRcdC8vIGh0dHBzOi8vaHRtbC5zcGVjLndoYXR3Zy5vcmcvI3N0cmlwLWFuZC1jb2xsYXBzZS13aGl0ZXNwYWNlXG5cdFx0XHRcdFx0alF1ZXJ5LnRyaW0oIGpRdWVyeS50ZXh0KCBlbGVtICkgKS5yZXBsYWNlKCByc3BhY2VzLCBcIiBcIiApO1xuXHRcdFx0fVxuXHRcdH0sXG5cdFx0c2VsZWN0OiB7XG5cdFx0XHRnZXQ6IGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0XHR2YXIgdmFsdWUsIG9wdGlvbixcblx0XHRcdFx0XHRvcHRpb25zID0gZWxlbS5vcHRpb25zLFxuXHRcdFx0XHRcdGluZGV4ID0gZWxlbS5zZWxlY3RlZEluZGV4LFxuXHRcdFx0XHRcdG9uZSA9IGVsZW0udHlwZSA9PT0gXCJzZWxlY3Qtb25lXCIgfHwgaW5kZXggPCAwLFxuXHRcdFx0XHRcdHZhbHVlcyA9IG9uZSA/IG51bGwgOiBbXSxcblx0XHRcdFx0XHRtYXggPSBvbmUgPyBpbmRleCArIDEgOiBvcHRpb25zLmxlbmd0aCxcblx0XHRcdFx0XHRpID0gaW5kZXggPCAwID9cblx0XHRcdFx0XHRcdG1heCA6XG5cdFx0XHRcdFx0XHRvbmUgPyBpbmRleCA6IDA7XG5cblx0XHRcdFx0Ly8gTG9vcCB0aHJvdWdoIGFsbCB0aGUgc2VsZWN0ZWQgb3B0aW9uc1xuXHRcdFx0XHRmb3IgKCA7IGkgPCBtYXg7IGkrKyApIHtcblx0XHRcdFx0XHRvcHRpb24gPSBvcHRpb25zWyBpIF07XG5cblx0XHRcdFx0XHQvLyBJRTgtOSBkb2Vzbid0IHVwZGF0ZSBzZWxlY3RlZCBhZnRlciBmb3JtIHJlc2V0ICgjMjU1MSlcblx0XHRcdFx0XHRpZiAoICggb3B0aW9uLnNlbGVjdGVkIHx8IGkgPT09IGluZGV4ICkgJiZcblxuXHRcdFx0XHRcdFx0XHQvLyBEb24ndCByZXR1cm4gb3B0aW9ucyB0aGF0IGFyZSBkaXNhYmxlZCBvciBpbiBhIGRpc2FibGVkIG9wdGdyb3VwXG5cdFx0XHRcdFx0XHRcdCggc3VwcG9ydC5vcHREaXNhYmxlZCA/XG5cdFx0XHRcdFx0XHRcdFx0IW9wdGlvbi5kaXNhYmxlZCA6IG9wdGlvbi5nZXRBdHRyaWJ1dGUoIFwiZGlzYWJsZWRcIiApID09PSBudWxsICkgJiZcblx0XHRcdFx0XHRcdFx0KCAhb3B0aW9uLnBhcmVudE5vZGUuZGlzYWJsZWQgfHxcblx0XHRcdFx0XHRcdFx0XHQhalF1ZXJ5Lm5vZGVOYW1lKCBvcHRpb24ucGFyZW50Tm9kZSwgXCJvcHRncm91cFwiICkgKSApIHtcblxuXHRcdFx0XHRcdFx0Ly8gR2V0IHRoZSBzcGVjaWZpYyB2YWx1ZSBmb3IgdGhlIG9wdGlvblxuXHRcdFx0XHRcdFx0dmFsdWUgPSBqUXVlcnkoIG9wdGlvbiApLnZhbCgpO1xuXG5cdFx0XHRcdFx0XHQvLyBXZSBkb24ndCBuZWVkIGFuIGFycmF5IGZvciBvbmUgc2VsZWN0c1xuXHRcdFx0XHRcdFx0aWYgKCBvbmUgKSB7XG5cdFx0XHRcdFx0XHRcdHJldHVybiB2YWx1ZTtcblx0XHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdFx0Ly8gTXVsdGktU2VsZWN0cyByZXR1cm4gYW4gYXJyYXlcblx0XHRcdFx0XHRcdHZhbHVlcy5wdXNoKCB2YWx1ZSApO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXG5cdFx0XHRcdHJldHVybiB2YWx1ZXM7XG5cdFx0XHR9LFxuXG5cdFx0XHRzZXQ6IGZ1bmN0aW9uKCBlbGVtLCB2YWx1ZSApIHtcblx0XHRcdFx0dmFyIG9wdGlvblNldCwgb3B0aW9uLFxuXHRcdFx0XHRcdG9wdGlvbnMgPSBlbGVtLm9wdGlvbnMsXG5cdFx0XHRcdFx0dmFsdWVzID0galF1ZXJ5Lm1ha2VBcnJheSggdmFsdWUgKSxcblx0XHRcdFx0XHRpID0gb3B0aW9ucy5sZW5ndGg7XG5cblx0XHRcdFx0d2hpbGUgKCBpLS0gKSB7XG5cdFx0XHRcdFx0b3B0aW9uID0gb3B0aW9uc1sgaSBdO1xuXHRcdFx0XHRcdGlmICggb3B0aW9uLnNlbGVjdGVkID1cblx0XHRcdFx0XHRcdGpRdWVyeS5pbkFycmF5KCBqUXVlcnkudmFsSG9va3Mub3B0aW9uLmdldCggb3B0aW9uICksIHZhbHVlcyApID4gLTFcblx0XHRcdFx0XHQpIHtcblx0XHRcdFx0XHRcdG9wdGlvblNldCA9IHRydWU7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gRm9yY2UgYnJvd3NlcnMgdG8gYmVoYXZlIGNvbnNpc3RlbnRseSB3aGVuIG5vbi1tYXRjaGluZyB2YWx1ZSBpcyBzZXRcblx0XHRcdFx0aWYgKCAhb3B0aW9uU2V0ICkge1xuXHRcdFx0XHRcdGVsZW0uc2VsZWN0ZWRJbmRleCA9IC0xO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHJldHVybiB2YWx1ZXM7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG59ICk7XG5cbi8vIFJhZGlvcyBhbmQgY2hlY2tib3hlcyBnZXR0ZXIvc2V0dGVyXG5qUXVlcnkuZWFjaCggWyBcInJhZGlvXCIsIFwiY2hlY2tib3hcIiBdLCBmdW5jdGlvbigpIHtcblx0alF1ZXJ5LnZhbEhvb2tzWyB0aGlzIF0gPSB7XG5cdFx0c2V0OiBmdW5jdGlvbiggZWxlbSwgdmFsdWUgKSB7XG5cdFx0XHRpZiAoIGpRdWVyeS5pc0FycmF5KCB2YWx1ZSApICkge1xuXHRcdFx0XHRyZXR1cm4gKCBlbGVtLmNoZWNrZWQgPSBqUXVlcnkuaW5BcnJheSggalF1ZXJ5KCBlbGVtICkudmFsKCksIHZhbHVlICkgPiAtMSApO1xuXHRcdFx0fVxuXHRcdH1cblx0fTtcblx0aWYgKCAhc3VwcG9ydC5jaGVja09uICkge1xuXHRcdGpRdWVyeS52YWxIb29rc1sgdGhpcyBdLmdldCA9IGZ1bmN0aW9uKCBlbGVtICkge1xuXHRcdFx0cmV0dXJuIGVsZW0uZ2V0QXR0cmlidXRlKCBcInZhbHVlXCIgKSA9PT0gbnVsbCA/IFwib25cIiA6IGVsZW0udmFsdWU7XG5cdFx0fTtcblx0fVxufSApO1xuXG5cblxuXG4vLyBSZXR1cm4galF1ZXJ5IGZvciBhdHRyaWJ1dGVzLW9ubHkgaW5jbHVzaW9uXG5cblxudmFyIHJmb2N1c01vcnBoID0gL14oPzpmb2N1c2luZm9jdXN8Zm9jdXNvdXRibHVyKSQvO1xuXG5qUXVlcnkuZXh0ZW5kKCBqUXVlcnkuZXZlbnQsIHtcblxuXHR0cmlnZ2VyOiBmdW5jdGlvbiggZXZlbnQsIGRhdGEsIGVsZW0sIG9ubHlIYW5kbGVycyApIHtcblxuXHRcdHZhciBpLCBjdXIsIHRtcCwgYnViYmxlVHlwZSwgb250eXBlLCBoYW5kbGUsIHNwZWNpYWwsXG5cdFx0XHRldmVudFBhdGggPSBbIGVsZW0gfHwgZG9jdW1lbnQgXSxcblx0XHRcdHR5cGUgPSBoYXNPd24uY2FsbCggZXZlbnQsIFwidHlwZVwiICkgPyBldmVudC50eXBlIDogZXZlbnQsXG5cdFx0XHRuYW1lc3BhY2VzID0gaGFzT3duLmNhbGwoIGV2ZW50LCBcIm5hbWVzcGFjZVwiICkgPyBldmVudC5uYW1lc3BhY2Uuc3BsaXQoIFwiLlwiICkgOiBbXTtcblxuXHRcdGN1ciA9IHRtcCA9IGVsZW0gPSBlbGVtIHx8IGRvY3VtZW50O1xuXG5cdFx0Ly8gRG9uJ3QgZG8gZXZlbnRzIG9uIHRleHQgYW5kIGNvbW1lbnQgbm9kZXNcblx0XHRpZiAoIGVsZW0ubm9kZVR5cGUgPT09IDMgfHwgZWxlbS5ub2RlVHlwZSA9PT0gOCApIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHQvLyBmb2N1cy9ibHVyIG1vcnBocyB0byBmb2N1c2luL291dDsgZW5zdXJlIHdlJ3JlIG5vdCBmaXJpbmcgdGhlbSByaWdodCBub3dcblx0XHRpZiAoIHJmb2N1c01vcnBoLnRlc3QoIHR5cGUgKyBqUXVlcnkuZXZlbnQudHJpZ2dlcmVkICkgKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0aWYgKCB0eXBlLmluZGV4T2YoIFwiLlwiICkgPiAtMSApIHtcblxuXHRcdFx0Ly8gTmFtZXNwYWNlZCB0cmlnZ2VyOyBjcmVhdGUgYSByZWdleHAgdG8gbWF0Y2ggZXZlbnQgdHlwZSBpbiBoYW5kbGUoKVxuXHRcdFx0bmFtZXNwYWNlcyA9IHR5cGUuc3BsaXQoIFwiLlwiICk7XG5cdFx0XHR0eXBlID0gbmFtZXNwYWNlcy5zaGlmdCgpO1xuXHRcdFx0bmFtZXNwYWNlcy5zb3J0KCk7XG5cdFx0fVxuXHRcdG9udHlwZSA9IHR5cGUuaW5kZXhPZiggXCI6XCIgKSA8IDAgJiYgXCJvblwiICsgdHlwZTtcblxuXHRcdC8vIENhbGxlciBjYW4gcGFzcyBpbiBhIGpRdWVyeS5FdmVudCBvYmplY3QsIE9iamVjdCwgb3IganVzdCBhbiBldmVudCB0eXBlIHN0cmluZ1xuXHRcdGV2ZW50ID0gZXZlbnRbIGpRdWVyeS5leHBhbmRvIF0gP1xuXHRcdFx0ZXZlbnQgOlxuXHRcdFx0bmV3IGpRdWVyeS5FdmVudCggdHlwZSwgdHlwZW9mIGV2ZW50ID09PSBcIm9iamVjdFwiICYmIGV2ZW50ICk7XG5cblx0XHQvLyBUcmlnZ2VyIGJpdG1hc2s6ICYgMSBmb3IgbmF0aXZlIGhhbmRsZXJzOyAmIDIgZm9yIGpRdWVyeSAoYWx3YXlzIHRydWUpXG5cdFx0ZXZlbnQuaXNUcmlnZ2VyID0gb25seUhhbmRsZXJzID8gMiA6IDM7XG5cdFx0ZXZlbnQubmFtZXNwYWNlID0gbmFtZXNwYWNlcy5qb2luKCBcIi5cIiApO1xuXHRcdGV2ZW50LnJuYW1lc3BhY2UgPSBldmVudC5uYW1lc3BhY2UgP1xuXHRcdFx0bmV3IFJlZ0V4cCggXCIoXnxcXFxcLilcIiArIG5hbWVzcGFjZXMuam9pbiggXCJcXFxcLig/Oi4qXFxcXC58KVwiICkgKyBcIihcXFxcLnwkKVwiICkgOlxuXHRcdFx0bnVsbDtcblxuXHRcdC8vIENsZWFuIHVwIHRoZSBldmVudCBpbiBjYXNlIGl0IGlzIGJlaW5nIHJldXNlZFxuXHRcdGV2ZW50LnJlc3VsdCA9IHVuZGVmaW5lZDtcblx0XHRpZiAoICFldmVudC50YXJnZXQgKSB7XG5cdFx0XHRldmVudC50YXJnZXQgPSBlbGVtO1xuXHRcdH1cblxuXHRcdC8vIENsb25lIGFueSBpbmNvbWluZyBkYXRhIGFuZCBwcmVwZW5kIHRoZSBldmVudCwgY3JlYXRpbmcgdGhlIGhhbmRsZXIgYXJnIGxpc3Rcblx0XHRkYXRhID0gZGF0YSA9PSBudWxsID9cblx0XHRcdFsgZXZlbnQgXSA6XG5cdFx0XHRqUXVlcnkubWFrZUFycmF5KCBkYXRhLCBbIGV2ZW50IF0gKTtcblxuXHRcdC8vIEFsbG93IHNwZWNpYWwgZXZlbnRzIHRvIGRyYXcgb3V0c2lkZSB0aGUgbGluZXNcblx0XHRzcGVjaWFsID0galF1ZXJ5LmV2ZW50LnNwZWNpYWxbIHR5cGUgXSB8fCB7fTtcblx0XHRpZiAoICFvbmx5SGFuZGxlcnMgJiYgc3BlY2lhbC50cmlnZ2VyICYmIHNwZWNpYWwudHJpZ2dlci5hcHBseSggZWxlbSwgZGF0YSApID09PSBmYWxzZSApIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHQvLyBEZXRlcm1pbmUgZXZlbnQgcHJvcGFnYXRpb24gcGF0aCBpbiBhZHZhbmNlLCBwZXIgVzNDIGV2ZW50cyBzcGVjICgjOTk1MSlcblx0XHQvLyBCdWJibGUgdXAgdG8gZG9jdW1lbnQsIHRoZW4gdG8gd2luZG93OyB3YXRjaCBmb3IgYSBnbG9iYWwgb3duZXJEb2N1bWVudCB2YXIgKCM5NzI0KVxuXHRcdGlmICggIW9ubHlIYW5kbGVycyAmJiAhc3BlY2lhbC5ub0J1YmJsZSAmJiAhalF1ZXJ5LmlzV2luZG93KCBlbGVtICkgKSB7XG5cblx0XHRcdGJ1YmJsZVR5cGUgPSBzcGVjaWFsLmRlbGVnYXRlVHlwZSB8fCB0eXBlO1xuXHRcdFx0aWYgKCAhcmZvY3VzTW9ycGgudGVzdCggYnViYmxlVHlwZSArIHR5cGUgKSApIHtcblx0XHRcdFx0Y3VyID0gY3VyLnBhcmVudE5vZGU7XG5cdFx0XHR9XG5cdFx0XHRmb3IgKCA7IGN1cjsgY3VyID0gY3VyLnBhcmVudE5vZGUgKSB7XG5cdFx0XHRcdGV2ZW50UGF0aC5wdXNoKCBjdXIgKTtcblx0XHRcdFx0dG1wID0gY3VyO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBPbmx5IGFkZCB3aW5kb3cgaWYgd2UgZ290IHRvIGRvY3VtZW50IChlLmcuLCBub3QgcGxhaW4gb2JqIG9yIGRldGFjaGVkIERPTSlcblx0XHRcdGlmICggdG1wID09PSAoIGVsZW0ub3duZXJEb2N1bWVudCB8fCBkb2N1bWVudCApICkge1xuXHRcdFx0XHRldmVudFBhdGgucHVzaCggdG1wLmRlZmF1bHRWaWV3IHx8IHRtcC5wYXJlbnRXaW5kb3cgfHwgd2luZG93ICk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Ly8gRmlyZSBoYW5kbGVycyBvbiB0aGUgZXZlbnQgcGF0aFxuXHRcdGkgPSAwO1xuXHRcdHdoaWxlICggKCBjdXIgPSBldmVudFBhdGhbIGkrKyBdICkgJiYgIWV2ZW50LmlzUHJvcGFnYXRpb25TdG9wcGVkKCkgKSB7XG5cblx0XHRcdGV2ZW50LnR5cGUgPSBpID4gMSA/XG5cdFx0XHRcdGJ1YmJsZVR5cGUgOlxuXHRcdFx0XHRzcGVjaWFsLmJpbmRUeXBlIHx8IHR5cGU7XG5cblx0XHRcdC8vIGpRdWVyeSBoYW5kbGVyXG5cdFx0XHRoYW5kbGUgPSAoIGRhdGFQcml2LmdldCggY3VyLCBcImV2ZW50c1wiICkgfHwge30gKVsgZXZlbnQudHlwZSBdICYmXG5cdFx0XHRcdGRhdGFQcml2LmdldCggY3VyLCBcImhhbmRsZVwiICk7XG5cdFx0XHRpZiAoIGhhbmRsZSApIHtcblx0XHRcdFx0aGFuZGxlLmFwcGx5KCBjdXIsIGRhdGEgKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gTmF0aXZlIGhhbmRsZXJcblx0XHRcdGhhbmRsZSA9IG9udHlwZSAmJiBjdXJbIG9udHlwZSBdO1xuXHRcdFx0aWYgKCBoYW5kbGUgJiYgaGFuZGxlLmFwcGx5ICYmIGFjY2VwdERhdGEoIGN1ciApICkge1xuXHRcdFx0XHRldmVudC5yZXN1bHQgPSBoYW5kbGUuYXBwbHkoIGN1ciwgZGF0YSApO1xuXHRcdFx0XHRpZiAoIGV2ZW50LnJlc3VsdCA9PT0gZmFsc2UgKSB7XG5cdFx0XHRcdFx0ZXZlbnQucHJldmVudERlZmF1bHQoKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0XHRldmVudC50eXBlID0gdHlwZTtcblxuXHRcdC8vIElmIG5vYm9keSBwcmV2ZW50ZWQgdGhlIGRlZmF1bHQgYWN0aW9uLCBkbyBpdCBub3dcblx0XHRpZiAoICFvbmx5SGFuZGxlcnMgJiYgIWV2ZW50LmlzRGVmYXVsdFByZXZlbnRlZCgpICkge1xuXG5cdFx0XHRpZiAoICggIXNwZWNpYWwuX2RlZmF1bHQgfHxcblx0XHRcdFx0c3BlY2lhbC5fZGVmYXVsdC5hcHBseSggZXZlbnRQYXRoLnBvcCgpLCBkYXRhICkgPT09IGZhbHNlICkgJiZcblx0XHRcdFx0YWNjZXB0RGF0YSggZWxlbSApICkge1xuXG5cdFx0XHRcdC8vIENhbGwgYSBuYXRpdmUgRE9NIG1ldGhvZCBvbiB0aGUgdGFyZ2V0IHdpdGggdGhlIHNhbWUgbmFtZSBuYW1lIGFzIHRoZSBldmVudC5cblx0XHRcdFx0Ly8gRG9uJ3QgZG8gZGVmYXVsdCBhY3Rpb25zIG9uIHdpbmRvdywgdGhhdCdzIHdoZXJlIGdsb2JhbCB2YXJpYWJsZXMgYmUgKCM2MTcwKVxuXHRcdFx0XHRpZiAoIG9udHlwZSAmJiBqUXVlcnkuaXNGdW5jdGlvbiggZWxlbVsgdHlwZSBdICkgJiYgIWpRdWVyeS5pc1dpbmRvdyggZWxlbSApICkge1xuXG5cdFx0XHRcdFx0Ly8gRG9uJ3QgcmUtdHJpZ2dlciBhbiBvbkZPTyBldmVudCB3aGVuIHdlIGNhbGwgaXRzIEZPTygpIG1ldGhvZFxuXHRcdFx0XHRcdHRtcCA9IGVsZW1bIG9udHlwZSBdO1xuXG5cdFx0XHRcdFx0aWYgKCB0bXAgKSB7XG5cdFx0XHRcdFx0XHRlbGVtWyBvbnR5cGUgXSA9IG51bGw7XG5cdFx0XHRcdFx0fVxuXG5cdFx0XHRcdFx0Ly8gUHJldmVudCByZS10cmlnZ2VyaW5nIG9mIHRoZSBzYW1lIGV2ZW50LCBzaW5jZSB3ZSBhbHJlYWR5IGJ1YmJsZWQgaXQgYWJvdmVcblx0XHRcdFx0XHRqUXVlcnkuZXZlbnQudHJpZ2dlcmVkID0gdHlwZTtcblx0XHRcdFx0XHRlbGVtWyB0eXBlIF0oKTtcblx0XHRcdFx0XHRqUXVlcnkuZXZlbnQudHJpZ2dlcmVkID0gdW5kZWZpbmVkO1xuXG5cdFx0XHRcdFx0aWYgKCB0bXAgKSB7XG5cdFx0XHRcdFx0XHRlbGVtWyBvbnR5cGUgXSA9IHRtcDtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gZXZlbnQucmVzdWx0O1xuXHR9LFxuXG5cdC8vIFBpZ2d5YmFjayBvbiBhIGRvbm9yIGV2ZW50IHRvIHNpbXVsYXRlIGEgZGlmZmVyZW50IG9uZVxuXHQvLyBVc2VkIG9ubHkgZm9yIGBmb2N1cyhpbiB8IG91dClgIGV2ZW50c1xuXHRzaW11bGF0ZTogZnVuY3Rpb24oIHR5cGUsIGVsZW0sIGV2ZW50ICkge1xuXHRcdHZhciBlID0galF1ZXJ5LmV4dGVuZChcblx0XHRcdG5ldyBqUXVlcnkuRXZlbnQoKSxcblx0XHRcdGV2ZW50LFxuXHRcdFx0e1xuXHRcdFx0XHR0eXBlOiB0eXBlLFxuXHRcdFx0XHRpc1NpbXVsYXRlZDogdHJ1ZVxuXHRcdFx0fVxuXHRcdCk7XG5cblx0XHRqUXVlcnkuZXZlbnQudHJpZ2dlciggZSwgbnVsbCwgZWxlbSApO1xuXHR9XG5cbn0gKTtcblxualF1ZXJ5LmZuLmV4dGVuZCgge1xuXG5cdHRyaWdnZXI6IGZ1bmN0aW9uKCB0eXBlLCBkYXRhICkge1xuXHRcdHJldHVybiB0aGlzLmVhY2goIGZ1bmN0aW9uKCkge1xuXHRcdFx0alF1ZXJ5LmV2ZW50LnRyaWdnZXIoIHR5cGUsIGRhdGEsIHRoaXMgKTtcblx0XHR9ICk7XG5cdH0sXG5cdHRyaWdnZXJIYW5kbGVyOiBmdW5jdGlvbiggdHlwZSwgZGF0YSApIHtcblx0XHR2YXIgZWxlbSA9IHRoaXNbIDAgXTtcblx0XHRpZiAoIGVsZW0gKSB7XG5cdFx0XHRyZXR1cm4galF1ZXJ5LmV2ZW50LnRyaWdnZXIoIHR5cGUsIGRhdGEsIGVsZW0sIHRydWUgKTtcblx0XHR9XG5cdH1cbn0gKTtcblxuXG5qUXVlcnkuZWFjaCggKCBcImJsdXIgZm9jdXMgZm9jdXNpbiBmb2N1c291dCBsb2FkIHJlc2l6ZSBzY3JvbGwgdW5sb2FkIGNsaWNrIGRibGNsaWNrIFwiICtcblx0XCJtb3VzZWRvd24gbW91c2V1cCBtb3VzZW1vdmUgbW91c2VvdmVyIG1vdXNlb3V0IG1vdXNlZW50ZXIgbW91c2VsZWF2ZSBcIiArXG5cdFwiY2hhbmdlIHNlbGVjdCBzdWJtaXQga2V5ZG93biBrZXlwcmVzcyBrZXl1cCBlcnJvciBjb250ZXh0bWVudVwiICkuc3BsaXQoIFwiIFwiICksXG5cdGZ1bmN0aW9uKCBpLCBuYW1lICkge1xuXG5cdC8vIEhhbmRsZSBldmVudCBiaW5kaW5nXG5cdGpRdWVyeS5mblsgbmFtZSBdID0gZnVuY3Rpb24oIGRhdGEsIGZuICkge1xuXHRcdHJldHVybiBhcmd1bWVudHMubGVuZ3RoID4gMCA/XG5cdFx0XHR0aGlzLm9uKCBuYW1lLCBudWxsLCBkYXRhLCBmbiApIDpcblx0XHRcdHRoaXMudHJpZ2dlciggbmFtZSApO1xuXHR9O1xufSApO1xuXG5qUXVlcnkuZm4uZXh0ZW5kKCB7XG5cdGhvdmVyOiBmdW5jdGlvbiggZm5PdmVyLCBmbk91dCApIHtcblx0XHRyZXR1cm4gdGhpcy5tb3VzZWVudGVyKCBmbk92ZXIgKS5tb3VzZWxlYXZlKCBmbk91dCB8fCBmbk92ZXIgKTtcblx0fVxufSApO1xuXG5cblxuXG5zdXBwb3J0LmZvY3VzaW4gPSBcIm9uZm9jdXNpblwiIGluIHdpbmRvdztcblxuXG4vLyBTdXBwb3J0OiBGaXJlZm94XG4vLyBGaXJlZm94IGRvZXNuJ3QgaGF2ZSBmb2N1cyhpbiB8IG91dCkgZXZlbnRzXG4vLyBSZWxhdGVkIHRpY2tldCAtIGh0dHBzOi8vYnVnemlsbGEubW96aWxsYS5vcmcvc2hvd19idWcuY2dpP2lkPTY4Nzc4N1xuLy9cbi8vIFN1cHBvcnQ6IENocm9tZSwgU2FmYXJpXG4vLyBmb2N1cyhpbiB8IG91dCkgZXZlbnRzIGZpcmUgYWZ0ZXIgZm9jdXMgJiBibHVyIGV2ZW50cyxcbi8vIHdoaWNoIGlzIHNwZWMgdmlvbGF0aW9uIC0gaHR0cDovL3d3dy53My5vcmcvVFIvRE9NLUxldmVsLTMtRXZlbnRzLyNldmVudHMtZm9jdXNldmVudC1ldmVudC1vcmRlclxuLy8gUmVsYXRlZCB0aWNrZXQgLSBodHRwczovL2NvZGUuZ29vZ2xlLmNvbS9wL2Nocm9taXVtL2lzc3Vlcy9kZXRhaWw/aWQ9NDQ5ODU3XG5pZiAoICFzdXBwb3J0LmZvY3VzaW4gKSB7XG5cdGpRdWVyeS5lYWNoKCB7IGZvY3VzOiBcImZvY3VzaW5cIiwgYmx1cjogXCJmb2N1c291dFwiIH0sIGZ1bmN0aW9uKCBvcmlnLCBmaXggKSB7XG5cblx0XHQvLyBBdHRhY2ggYSBzaW5nbGUgY2FwdHVyaW5nIGhhbmRsZXIgb24gdGhlIGRvY3VtZW50IHdoaWxlIHNvbWVvbmUgd2FudHMgZm9jdXNpbi9mb2N1c291dFxuXHRcdHZhciBoYW5kbGVyID0gZnVuY3Rpb24oIGV2ZW50ICkge1xuXHRcdFx0alF1ZXJ5LmV2ZW50LnNpbXVsYXRlKCBmaXgsIGV2ZW50LnRhcmdldCwgalF1ZXJ5LmV2ZW50LmZpeCggZXZlbnQgKSApO1xuXHRcdH07XG5cblx0XHRqUXVlcnkuZXZlbnQuc3BlY2lhbFsgZml4IF0gPSB7XG5cdFx0XHRzZXR1cDogZnVuY3Rpb24oKSB7XG5cdFx0XHRcdHZhciBkb2MgPSB0aGlzLm93bmVyRG9jdW1lbnQgfHwgdGhpcyxcblx0XHRcdFx0XHRhdHRhY2hlcyA9IGRhdGFQcml2LmFjY2VzcyggZG9jLCBmaXggKTtcblxuXHRcdFx0XHRpZiAoICFhdHRhY2hlcyApIHtcblx0XHRcdFx0XHRkb2MuYWRkRXZlbnRMaXN0ZW5lciggb3JpZywgaGFuZGxlciwgdHJ1ZSApO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGRhdGFQcml2LmFjY2VzcyggZG9jLCBmaXgsICggYXR0YWNoZXMgfHwgMCApICsgMSApO1xuXHRcdFx0fSxcblx0XHRcdHRlYXJkb3duOiBmdW5jdGlvbigpIHtcblx0XHRcdFx0dmFyIGRvYyA9IHRoaXMub3duZXJEb2N1bWVudCB8fCB0aGlzLFxuXHRcdFx0XHRcdGF0dGFjaGVzID0gZGF0YVByaXYuYWNjZXNzKCBkb2MsIGZpeCApIC0gMTtcblxuXHRcdFx0XHRpZiAoICFhdHRhY2hlcyApIHtcblx0XHRcdFx0XHRkb2MucmVtb3ZlRXZlbnRMaXN0ZW5lciggb3JpZywgaGFuZGxlciwgdHJ1ZSApO1xuXHRcdFx0XHRcdGRhdGFQcml2LnJlbW92ZSggZG9jLCBmaXggKTtcblxuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdGRhdGFQcml2LmFjY2VzcyggZG9jLCBmaXgsIGF0dGFjaGVzICk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9O1xuXHR9ICk7XG59XG52YXIgbG9jYXRpb24gPSB3aW5kb3cubG9jYXRpb247XG5cbnZhciBub25jZSA9IGpRdWVyeS5ub3coKTtcblxudmFyIHJxdWVyeSA9ICggL1xcPy8gKTtcblxuXG5cbi8vIFN1cHBvcnQ6IEFuZHJvaWQgMi4zXG4vLyBXb3JrYXJvdW5kIGZhaWx1cmUgdG8gc3RyaW5nLWNhc3QgbnVsbCBpbnB1dFxualF1ZXJ5LnBhcnNlSlNPTiA9IGZ1bmN0aW9uKCBkYXRhICkge1xuXHRyZXR1cm4gSlNPTi5wYXJzZSggZGF0YSArIFwiXCIgKTtcbn07XG5cblxuLy8gQ3Jvc3MtYnJvd3NlciB4bWwgcGFyc2luZ1xualF1ZXJ5LnBhcnNlWE1MID0gZnVuY3Rpb24oIGRhdGEgKSB7XG5cdHZhciB4bWw7XG5cdGlmICggIWRhdGEgfHwgdHlwZW9mIGRhdGEgIT09IFwic3RyaW5nXCIgKSB7XG5cdFx0cmV0dXJuIG51bGw7XG5cdH1cblxuXHQvLyBTdXBwb3J0OiBJRTlcblx0dHJ5IHtcblx0XHR4bWwgPSAoIG5ldyB3aW5kb3cuRE9NUGFyc2VyKCkgKS5wYXJzZUZyb21TdHJpbmcoIGRhdGEsIFwidGV4dC94bWxcIiApO1xuXHR9IGNhdGNoICggZSApIHtcblx0XHR4bWwgPSB1bmRlZmluZWQ7XG5cdH1cblxuXHRpZiAoICF4bWwgfHwgeG1sLmdldEVsZW1lbnRzQnlUYWdOYW1lKCBcInBhcnNlcmVycm9yXCIgKS5sZW5ndGggKSB7XG5cdFx0alF1ZXJ5LmVycm9yKCBcIkludmFsaWQgWE1MOiBcIiArIGRhdGEgKTtcblx0fVxuXHRyZXR1cm4geG1sO1xufTtcblxuXG52YXJcblx0cmhhc2ggPSAvIy4qJC8sXG5cdHJ0cyA9IC8oWz8mXSlfPVteJl0qLyxcblx0cmhlYWRlcnMgPSAvXiguKj8pOlsgXFx0XSooW15cXHJcXG5dKikkL21nLFxuXG5cdC8vICM3NjUzLCAjODEyNSwgIzgxNTI6IGxvY2FsIHByb3RvY29sIGRldGVjdGlvblxuXHRybG9jYWxQcm90b2NvbCA9IC9eKD86YWJvdXR8YXBwfGFwcC1zdG9yYWdlfC4rLWV4dGVuc2lvbnxmaWxlfHJlc3x3aWRnZXQpOiQvLFxuXHRybm9Db250ZW50ID0gL14oPzpHRVR8SEVBRCkkLyxcblx0cnByb3RvY29sID0gL15cXC9cXC8vLFxuXG5cdC8qIFByZWZpbHRlcnNcblx0ICogMSkgVGhleSBhcmUgdXNlZnVsIHRvIGludHJvZHVjZSBjdXN0b20gZGF0YVR5cGVzIChzZWUgYWpheC9qc29ucC5qcyBmb3IgYW4gZXhhbXBsZSlcblx0ICogMikgVGhlc2UgYXJlIGNhbGxlZDpcblx0ICogICAgLSBCRUZPUkUgYXNraW5nIGZvciBhIHRyYW5zcG9ydFxuXHQgKiAgICAtIEFGVEVSIHBhcmFtIHNlcmlhbGl6YXRpb24gKHMuZGF0YSBpcyBhIHN0cmluZyBpZiBzLnByb2Nlc3NEYXRhIGlzIHRydWUpXG5cdCAqIDMpIGtleSBpcyB0aGUgZGF0YVR5cGVcblx0ICogNCkgdGhlIGNhdGNoYWxsIHN5bWJvbCBcIipcIiBjYW4gYmUgdXNlZFxuXHQgKiA1KSBleGVjdXRpb24gd2lsbCBzdGFydCB3aXRoIHRyYW5zcG9ydCBkYXRhVHlwZSBhbmQgVEhFTiBjb250aW51ZSBkb3duIHRvIFwiKlwiIGlmIG5lZWRlZFxuXHQgKi9cblx0cHJlZmlsdGVycyA9IHt9LFxuXG5cdC8qIFRyYW5zcG9ydHMgYmluZGluZ3Ncblx0ICogMSkga2V5IGlzIHRoZSBkYXRhVHlwZVxuXHQgKiAyKSB0aGUgY2F0Y2hhbGwgc3ltYm9sIFwiKlwiIGNhbiBiZSB1c2VkXG5cdCAqIDMpIHNlbGVjdGlvbiB3aWxsIHN0YXJ0IHdpdGggdHJhbnNwb3J0IGRhdGFUeXBlIGFuZCBUSEVOIGdvIHRvIFwiKlwiIGlmIG5lZWRlZFxuXHQgKi9cblx0dHJhbnNwb3J0cyA9IHt9LFxuXG5cdC8vIEF2b2lkIGNvbW1lbnQtcHJvbG9nIGNoYXIgc2VxdWVuY2UgKCMxMDA5OCk7IG11c3QgYXBwZWFzZSBsaW50IGFuZCBldmFkZSBjb21wcmVzc2lvblxuXHRhbGxUeXBlcyA9IFwiKi9cIi5jb25jYXQoIFwiKlwiICksXG5cblx0Ly8gQW5jaG9yIHRhZyBmb3IgcGFyc2luZyB0aGUgZG9jdW1lbnQgb3JpZ2luXG5cdG9yaWdpbkFuY2hvciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIFwiYVwiICk7XG5cdG9yaWdpbkFuY2hvci5ocmVmID0gbG9jYXRpb24uaHJlZjtcblxuLy8gQmFzZSBcImNvbnN0cnVjdG9yXCIgZm9yIGpRdWVyeS5hamF4UHJlZmlsdGVyIGFuZCBqUXVlcnkuYWpheFRyYW5zcG9ydFxuZnVuY3Rpb24gYWRkVG9QcmVmaWx0ZXJzT3JUcmFuc3BvcnRzKCBzdHJ1Y3R1cmUgKSB7XG5cblx0Ly8gZGF0YVR5cGVFeHByZXNzaW9uIGlzIG9wdGlvbmFsIGFuZCBkZWZhdWx0cyB0byBcIipcIlxuXHRyZXR1cm4gZnVuY3Rpb24oIGRhdGFUeXBlRXhwcmVzc2lvbiwgZnVuYyApIHtcblxuXHRcdGlmICggdHlwZW9mIGRhdGFUeXBlRXhwcmVzc2lvbiAhPT0gXCJzdHJpbmdcIiApIHtcblx0XHRcdGZ1bmMgPSBkYXRhVHlwZUV4cHJlc3Npb247XG5cdFx0XHRkYXRhVHlwZUV4cHJlc3Npb24gPSBcIipcIjtcblx0XHR9XG5cblx0XHR2YXIgZGF0YVR5cGUsXG5cdFx0XHRpID0gMCxcblx0XHRcdGRhdGFUeXBlcyA9IGRhdGFUeXBlRXhwcmVzc2lvbi50b0xvd2VyQ2FzZSgpLm1hdGNoKCBybm90d2hpdGUgKSB8fCBbXTtcblxuXHRcdGlmICggalF1ZXJ5LmlzRnVuY3Rpb24oIGZ1bmMgKSApIHtcblxuXHRcdFx0Ly8gRm9yIGVhY2ggZGF0YVR5cGUgaW4gdGhlIGRhdGFUeXBlRXhwcmVzc2lvblxuXHRcdFx0d2hpbGUgKCAoIGRhdGFUeXBlID0gZGF0YVR5cGVzWyBpKysgXSApICkge1xuXG5cdFx0XHRcdC8vIFByZXBlbmQgaWYgcmVxdWVzdGVkXG5cdFx0XHRcdGlmICggZGF0YVR5cGVbIDAgXSA9PT0gXCIrXCIgKSB7XG5cdFx0XHRcdFx0ZGF0YVR5cGUgPSBkYXRhVHlwZS5zbGljZSggMSApIHx8IFwiKlwiO1xuXHRcdFx0XHRcdCggc3RydWN0dXJlWyBkYXRhVHlwZSBdID0gc3RydWN0dXJlWyBkYXRhVHlwZSBdIHx8IFtdICkudW5zaGlmdCggZnVuYyApO1xuXG5cdFx0XHRcdC8vIE90aGVyd2lzZSBhcHBlbmRcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHQoIHN0cnVjdHVyZVsgZGF0YVR5cGUgXSA9IHN0cnVjdHVyZVsgZGF0YVR5cGUgXSB8fCBbXSApLnB1c2goIGZ1bmMgKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblx0fTtcbn1cblxuLy8gQmFzZSBpbnNwZWN0aW9uIGZ1bmN0aW9uIGZvciBwcmVmaWx0ZXJzIGFuZCB0cmFuc3BvcnRzXG5mdW5jdGlvbiBpbnNwZWN0UHJlZmlsdGVyc09yVHJhbnNwb3J0cyggc3RydWN0dXJlLCBvcHRpb25zLCBvcmlnaW5hbE9wdGlvbnMsIGpxWEhSICkge1xuXG5cdHZhciBpbnNwZWN0ZWQgPSB7fSxcblx0XHRzZWVraW5nVHJhbnNwb3J0ID0gKCBzdHJ1Y3R1cmUgPT09IHRyYW5zcG9ydHMgKTtcblxuXHRmdW5jdGlvbiBpbnNwZWN0KCBkYXRhVHlwZSApIHtcblx0XHR2YXIgc2VsZWN0ZWQ7XG5cdFx0aW5zcGVjdGVkWyBkYXRhVHlwZSBdID0gdHJ1ZTtcblx0XHRqUXVlcnkuZWFjaCggc3RydWN0dXJlWyBkYXRhVHlwZSBdIHx8IFtdLCBmdW5jdGlvbiggXywgcHJlZmlsdGVyT3JGYWN0b3J5ICkge1xuXHRcdFx0dmFyIGRhdGFUeXBlT3JUcmFuc3BvcnQgPSBwcmVmaWx0ZXJPckZhY3RvcnkoIG9wdGlvbnMsIG9yaWdpbmFsT3B0aW9ucywganFYSFIgKTtcblx0XHRcdGlmICggdHlwZW9mIGRhdGFUeXBlT3JUcmFuc3BvcnQgPT09IFwic3RyaW5nXCIgJiZcblx0XHRcdFx0IXNlZWtpbmdUcmFuc3BvcnQgJiYgIWluc3BlY3RlZFsgZGF0YVR5cGVPclRyYW5zcG9ydCBdICkge1xuXG5cdFx0XHRcdG9wdGlvbnMuZGF0YVR5cGVzLnVuc2hpZnQoIGRhdGFUeXBlT3JUcmFuc3BvcnQgKTtcblx0XHRcdFx0aW5zcGVjdCggZGF0YVR5cGVPclRyYW5zcG9ydCApO1xuXHRcdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0XHR9IGVsc2UgaWYgKCBzZWVraW5nVHJhbnNwb3J0ICkge1xuXHRcdFx0XHRyZXR1cm4gISggc2VsZWN0ZWQgPSBkYXRhVHlwZU9yVHJhbnNwb3J0ICk7XG5cdFx0XHR9XG5cdFx0fSApO1xuXHRcdHJldHVybiBzZWxlY3RlZDtcblx0fVxuXG5cdHJldHVybiBpbnNwZWN0KCBvcHRpb25zLmRhdGFUeXBlc1sgMCBdICkgfHwgIWluc3BlY3RlZFsgXCIqXCIgXSAmJiBpbnNwZWN0KCBcIipcIiApO1xufVxuXG4vLyBBIHNwZWNpYWwgZXh0ZW5kIGZvciBhamF4IG9wdGlvbnNcbi8vIHRoYXQgdGFrZXMgXCJmbGF0XCIgb3B0aW9ucyAobm90IHRvIGJlIGRlZXAgZXh0ZW5kZWQpXG4vLyBGaXhlcyAjOTg4N1xuZnVuY3Rpb24gYWpheEV4dGVuZCggdGFyZ2V0LCBzcmMgKSB7XG5cdHZhciBrZXksIGRlZXAsXG5cdFx0ZmxhdE9wdGlvbnMgPSBqUXVlcnkuYWpheFNldHRpbmdzLmZsYXRPcHRpb25zIHx8IHt9O1xuXG5cdGZvciAoIGtleSBpbiBzcmMgKSB7XG5cdFx0aWYgKCBzcmNbIGtleSBdICE9PSB1bmRlZmluZWQgKSB7XG5cdFx0XHQoIGZsYXRPcHRpb25zWyBrZXkgXSA/IHRhcmdldCA6ICggZGVlcCB8fCAoIGRlZXAgPSB7fSApICkgKVsga2V5IF0gPSBzcmNbIGtleSBdO1xuXHRcdH1cblx0fVxuXHRpZiAoIGRlZXAgKSB7XG5cdFx0alF1ZXJ5LmV4dGVuZCggdHJ1ZSwgdGFyZ2V0LCBkZWVwICk7XG5cdH1cblxuXHRyZXR1cm4gdGFyZ2V0O1xufVxuXG4vKiBIYW5kbGVzIHJlc3BvbnNlcyB0byBhbiBhamF4IHJlcXVlc3Q6XG4gKiAtIGZpbmRzIHRoZSByaWdodCBkYXRhVHlwZSAobWVkaWF0ZXMgYmV0d2VlbiBjb250ZW50LXR5cGUgYW5kIGV4cGVjdGVkIGRhdGFUeXBlKVxuICogLSByZXR1cm5zIHRoZSBjb3JyZXNwb25kaW5nIHJlc3BvbnNlXG4gKi9cbmZ1bmN0aW9uIGFqYXhIYW5kbGVSZXNwb25zZXMoIHMsIGpxWEhSLCByZXNwb25zZXMgKSB7XG5cblx0dmFyIGN0LCB0eXBlLCBmaW5hbERhdGFUeXBlLCBmaXJzdERhdGFUeXBlLFxuXHRcdGNvbnRlbnRzID0gcy5jb250ZW50cyxcblx0XHRkYXRhVHlwZXMgPSBzLmRhdGFUeXBlcztcblxuXHQvLyBSZW1vdmUgYXV0byBkYXRhVHlwZSBhbmQgZ2V0IGNvbnRlbnQtdHlwZSBpbiB0aGUgcHJvY2Vzc1xuXHR3aGlsZSAoIGRhdGFUeXBlc1sgMCBdID09PSBcIipcIiApIHtcblx0XHRkYXRhVHlwZXMuc2hpZnQoKTtcblx0XHRpZiAoIGN0ID09PSB1bmRlZmluZWQgKSB7XG5cdFx0XHRjdCA9IHMubWltZVR5cGUgfHwganFYSFIuZ2V0UmVzcG9uc2VIZWFkZXIoIFwiQ29udGVudC1UeXBlXCIgKTtcblx0XHR9XG5cdH1cblxuXHQvLyBDaGVjayBpZiB3ZSdyZSBkZWFsaW5nIHdpdGggYSBrbm93biBjb250ZW50LXR5cGVcblx0aWYgKCBjdCApIHtcblx0XHRmb3IgKCB0eXBlIGluIGNvbnRlbnRzICkge1xuXHRcdFx0aWYgKCBjb250ZW50c1sgdHlwZSBdICYmIGNvbnRlbnRzWyB0eXBlIF0udGVzdCggY3QgKSApIHtcblx0XHRcdFx0ZGF0YVR5cGVzLnVuc2hpZnQoIHR5cGUgKTtcblx0XHRcdFx0YnJlYWs7XG5cdFx0XHR9XG5cdFx0fVxuXHR9XG5cblx0Ly8gQ2hlY2sgdG8gc2VlIGlmIHdlIGhhdmUgYSByZXNwb25zZSBmb3IgdGhlIGV4cGVjdGVkIGRhdGFUeXBlXG5cdGlmICggZGF0YVR5cGVzWyAwIF0gaW4gcmVzcG9uc2VzICkge1xuXHRcdGZpbmFsRGF0YVR5cGUgPSBkYXRhVHlwZXNbIDAgXTtcblx0fSBlbHNlIHtcblxuXHRcdC8vIFRyeSBjb252ZXJ0aWJsZSBkYXRhVHlwZXNcblx0XHRmb3IgKCB0eXBlIGluIHJlc3BvbnNlcyApIHtcblx0XHRcdGlmICggIWRhdGFUeXBlc1sgMCBdIHx8IHMuY29udmVydGVyc1sgdHlwZSArIFwiIFwiICsgZGF0YVR5cGVzWyAwIF0gXSApIHtcblx0XHRcdFx0ZmluYWxEYXRhVHlwZSA9IHR5cGU7XG5cdFx0XHRcdGJyZWFrO1xuXHRcdFx0fVxuXHRcdFx0aWYgKCAhZmlyc3REYXRhVHlwZSApIHtcblx0XHRcdFx0Zmlyc3REYXRhVHlwZSA9IHR5cGU7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Ly8gT3IganVzdCB1c2UgZmlyc3Qgb25lXG5cdFx0ZmluYWxEYXRhVHlwZSA9IGZpbmFsRGF0YVR5cGUgfHwgZmlyc3REYXRhVHlwZTtcblx0fVxuXG5cdC8vIElmIHdlIGZvdW5kIGEgZGF0YVR5cGVcblx0Ly8gV2UgYWRkIHRoZSBkYXRhVHlwZSB0byB0aGUgbGlzdCBpZiBuZWVkZWRcblx0Ly8gYW5kIHJldHVybiB0aGUgY29ycmVzcG9uZGluZyByZXNwb25zZVxuXHRpZiAoIGZpbmFsRGF0YVR5cGUgKSB7XG5cdFx0aWYgKCBmaW5hbERhdGFUeXBlICE9PSBkYXRhVHlwZXNbIDAgXSApIHtcblx0XHRcdGRhdGFUeXBlcy51bnNoaWZ0KCBmaW5hbERhdGFUeXBlICk7XG5cdFx0fVxuXHRcdHJldHVybiByZXNwb25zZXNbIGZpbmFsRGF0YVR5cGUgXTtcblx0fVxufVxuXG4vKiBDaGFpbiBjb252ZXJzaW9ucyBnaXZlbiB0aGUgcmVxdWVzdCBhbmQgdGhlIG9yaWdpbmFsIHJlc3BvbnNlXG4gKiBBbHNvIHNldHMgdGhlIHJlc3BvbnNlWFhYIGZpZWxkcyBvbiB0aGUganFYSFIgaW5zdGFuY2VcbiAqL1xuZnVuY3Rpb24gYWpheENvbnZlcnQoIHMsIHJlc3BvbnNlLCBqcVhIUiwgaXNTdWNjZXNzICkge1xuXHR2YXIgY29udjIsIGN1cnJlbnQsIGNvbnYsIHRtcCwgcHJldixcblx0XHRjb252ZXJ0ZXJzID0ge30sXG5cblx0XHQvLyBXb3JrIHdpdGggYSBjb3B5IG9mIGRhdGFUeXBlcyBpbiBjYXNlIHdlIG5lZWQgdG8gbW9kaWZ5IGl0IGZvciBjb252ZXJzaW9uXG5cdFx0ZGF0YVR5cGVzID0gcy5kYXRhVHlwZXMuc2xpY2UoKTtcblxuXHQvLyBDcmVhdGUgY29udmVydGVycyBtYXAgd2l0aCBsb3dlcmNhc2VkIGtleXNcblx0aWYgKCBkYXRhVHlwZXNbIDEgXSApIHtcblx0XHRmb3IgKCBjb252IGluIHMuY29udmVydGVycyApIHtcblx0XHRcdGNvbnZlcnRlcnNbIGNvbnYudG9Mb3dlckNhc2UoKSBdID0gcy5jb252ZXJ0ZXJzWyBjb252IF07XG5cdFx0fVxuXHR9XG5cblx0Y3VycmVudCA9IGRhdGFUeXBlcy5zaGlmdCgpO1xuXG5cdC8vIENvbnZlcnQgdG8gZWFjaCBzZXF1ZW50aWFsIGRhdGFUeXBlXG5cdHdoaWxlICggY3VycmVudCApIHtcblxuXHRcdGlmICggcy5yZXNwb25zZUZpZWxkc1sgY3VycmVudCBdICkge1xuXHRcdFx0anFYSFJbIHMucmVzcG9uc2VGaWVsZHNbIGN1cnJlbnQgXSBdID0gcmVzcG9uc2U7XG5cdFx0fVxuXG5cdFx0Ly8gQXBwbHkgdGhlIGRhdGFGaWx0ZXIgaWYgcHJvdmlkZWRcblx0XHRpZiAoICFwcmV2ICYmIGlzU3VjY2VzcyAmJiBzLmRhdGFGaWx0ZXIgKSB7XG5cdFx0XHRyZXNwb25zZSA9IHMuZGF0YUZpbHRlciggcmVzcG9uc2UsIHMuZGF0YVR5cGUgKTtcblx0XHR9XG5cblx0XHRwcmV2ID0gY3VycmVudDtcblx0XHRjdXJyZW50ID0gZGF0YVR5cGVzLnNoaWZ0KCk7XG5cblx0XHRpZiAoIGN1cnJlbnQgKSB7XG5cblx0XHQvLyBUaGVyZSdzIG9ubHkgd29yayB0byBkbyBpZiBjdXJyZW50IGRhdGFUeXBlIGlzIG5vbi1hdXRvXG5cdFx0XHRpZiAoIGN1cnJlbnQgPT09IFwiKlwiICkge1xuXG5cdFx0XHRcdGN1cnJlbnQgPSBwcmV2O1xuXG5cdFx0XHQvLyBDb252ZXJ0IHJlc3BvbnNlIGlmIHByZXYgZGF0YVR5cGUgaXMgbm9uLWF1dG8gYW5kIGRpZmZlcnMgZnJvbSBjdXJyZW50XG5cdFx0XHR9IGVsc2UgaWYgKCBwcmV2ICE9PSBcIipcIiAmJiBwcmV2ICE9PSBjdXJyZW50ICkge1xuXG5cdFx0XHRcdC8vIFNlZWsgYSBkaXJlY3QgY29udmVydGVyXG5cdFx0XHRcdGNvbnYgPSBjb252ZXJ0ZXJzWyBwcmV2ICsgXCIgXCIgKyBjdXJyZW50IF0gfHwgY29udmVydGVyc1sgXCIqIFwiICsgY3VycmVudCBdO1xuXG5cdFx0XHRcdC8vIElmIG5vbmUgZm91bmQsIHNlZWsgYSBwYWlyXG5cdFx0XHRcdGlmICggIWNvbnYgKSB7XG5cdFx0XHRcdFx0Zm9yICggY29udjIgaW4gY29udmVydGVycyApIHtcblxuXHRcdFx0XHRcdFx0Ly8gSWYgY29udjIgb3V0cHV0cyBjdXJyZW50XG5cdFx0XHRcdFx0XHR0bXAgPSBjb252Mi5zcGxpdCggXCIgXCIgKTtcblx0XHRcdFx0XHRcdGlmICggdG1wWyAxIF0gPT09IGN1cnJlbnQgKSB7XG5cblx0XHRcdFx0XHRcdFx0Ly8gSWYgcHJldiBjYW4gYmUgY29udmVydGVkIHRvIGFjY2VwdGVkIGlucHV0XG5cdFx0XHRcdFx0XHRcdGNvbnYgPSBjb252ZXJ0ZXJzWyBwcmV2ICsgXCIgXCIgKyB0bXBbIDAgXSBdIHx8XG5cdFx0XHRcdFx0XHRcdFx0Y29udmVydGVyc1sgXCIqIFwiICsgdG1wWyAwIF0gXTtcblx0XHRcdFx0XHRcdFx0aWYgKCBjb252ICkge1xuXG5cdFx0XHRcdFx0XHRcdFx0Ly8gQ29uZGVuc2UgZXF1aXZhbGVuY2UgY29udmVydGVyc1xuXHRcdFx0XHRcdFx0XHRcdGlmICggY29udiA9PT0gdHJ1ZSApIHtcblx0XHRcdFx0XHRcdFx0XHRcdGNvbnYgPSBjb252ZXJ0ZXJzWyBjb252MiBdO1xuXG5cdFx0XHRcdFx0XHRcdFx0Ly8gT3RoZXJ3aXNlLCBpbnNlcnQgdGhlIGludGVybWVkaWF0ZSBkYXRhVHlwZVxuXHRcdFx0XHRcdFx0XHRcdH0gZWxzZSBpZiAoIGNvbnZlcnRlcnNbIGNvbnYyIF0gIT09IHRydWUgKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRjdXJyZW50ID0gdG1wWyAwIF07XG5cdFx0XHRcdFx0XHRcdFx0XHRkYXRhVHlwZXMudW5zaGlmdCggdG1wWyAxIF0gKTtcblx0XHRcdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBBcHBseSBjb252ZXJ0ZXIgKGlmIG5vdCBhbiBlcXVpdmFsZW5jZSlcblx0XHRcdFx0aWYgKCBjb252ICE9PSB0cnVlICkge1xuXG5cdFx0XHRcdFx0Ly8gVW5sZXNzIGVycm9ycyBhcmUgYWxsb3dlZCB0byBidWJibGUsIGNhdGNoIGFuZCByZXR1cm4gdGhlbVxuXHRcdFx0XHRcdGlmICggY29udiAmJiBzLnRocm93cyApIHtcblx0XHRcdFx0XHRcdHJlc3BvbnNlID0gY29udiggcmVzcG9uc2UgKTtcblx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0dHJ5IHtcblx0XHRcdFx0XHRcdFx0cmVzcG9uc2UgPSBjb252KCByZXNwb25zZSApO1xuXHRcdFx0XHRcdFx0fSBjYXRjaCAoIGUgKSB7XG5cdFx0XHRcdFx0XHRcdHJldHVybiB7XG5cdFx0XHRcdFx0XHRcdFx0c3RhdGU6IFwicGFyc2VyZXJyb3JcIixcblx0XHRcdFx0XHRcdFx0XHRlcnJvcjogY29udiA/IGUgOiBcIk5vIGNvbnZlcnNpb24gZnJvbSBcIiArIHByZXYgKyBcIiB0byBcIiArIGN1cnJlbnRcblx0XHRcdFx0XHRcdFx0fTtcblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9XG5cdH1cblxuXHRyZXR1cm4geyBzdGF0ZTogXCJzdWNjZXNzXCIsIGRhdGE6IHJlc3BvbnNlIH07XG59XG5cbmpRdWVyeS5leHRlbmQoIHtcblxuXHQvLyBDb3VudGVyIGZvciBob2xkaW5nIHRoZSBudW1iZXIgb2YgYWN0aXZlIHF1ZXJpZXNcblx0YWN0aXZlOiAwLFxuXG5cdC8vIExhc3QtTW9kaWZpZWQgaGVhZGVyIGNhY2hlIGZvciBuZXh0IHJlcXVlc3Rcblx0bGFzdE1vZGlmaWVkOiB7fSxcblx0ZXRhZzoge30sXG5cblx0YWpheFNldHRpbmdzOiB7XG5cdFx0dXJsOiBsb2NhdGlvbi5ocmVmLFxuXHRcdHR5cGU6IFwiR0VUXCIsXG5cdFx0aXNMb2NhbDogcmxvY2FsUHJvdG9jb2wudGVzdCggbG9jYXRpb24ucHJvdG9jb2wgKSxcblx0XHRnbG9iYWw6IHRydWUsXG5cdFx0cHJvY2Vzc0RhdGE6IHRydWUsXG5cdFx0YXN5bmM6IHRydWUsXG5cdFx0Y29udGVudFR5cGU6IFwiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkOyBjaGFyc2V0PVVURi04XCIsXG5cdFx0Lypcblx0XHR0aW1lb3V0OiAwLFxuXHRcdGRhdGE6IG51bGwsXG5cdFx0ZGF0YVR5cGU6IG51bGwsXG5cdFx0dXNlcm5hbWU6IG51bGwsXG5cdFx0cGFzc3dvcmQ6IG51bGwsXG5cdFx0Y2FjaGU6IG51bGwsXG5cdFx0dGhyb3dzOiBmYWxzZSxcblx0XHR0cmFkaXRpb25hbDogZmFsc2UsXG5cdFx0aGVhZGVyczoge30sXG5cdFx0Ki9cblxuXHRcdGFjY2VwdHM6IHtcblx0XHRcdFwiKlwiOiBhbGxUeXBlcyxcblx0XHRcdHRleHQ6IFwidGV4dC9wbGFpblwiLFxuXHRcdFx0aHRtbDogXCJ0ZXh0L2h0bWxcIixcblx0XHRcdHhtbDogXCJhcHBsaWNhdGlvbi94bWwsIHRleHQveG1sXCIsXG5cdFx0XHRqc29uOiBcImFwcGxpY2F0aW9uL2pzb24sIHRleHQvamF2YXNjcmlwdFwiXG5cdFx0fSxcblxuXHRcdGNvbnRlbnRzOiB7XG5cdFx0XHR4bWw6IC9cXGJ4bWxcXGIvLFxuXHRcdFx0aHRtbDogL1xcYmh0bWwvLFxuXHRcdFx0anNvbjogL1xcYmpzb25cXGIvXG5cdFx0fSxcblxuXHRcdHJlc3BvbnNlRmllbGRzOiB7XG5cdFx0XHR4bWw6IFwicmVzcG9uc2VYTUxcIixcblx0XHRcdHRleHQ6IFwicmVzcG9uc2VUZXh0XCIsXG5cdFx0XHRqc29uOiBcInJlc3BvbnNlSlNPTlwiXG5cdFx0fSxcblxuXHRcdC8vIERhdGEgY29udmVydGVyc1xuXHRcdC8vIEtleXMgc2VwYXJhdGUgc291cmNlIChvciBjYXRjaGFsbCBcIipcIikgYW5kIGRlc3RpbmF0aW9uIHR5cGVzIHdpdGggYSBzaW5nbGUgc3BhY2Vcblx0XHRjb252ZXJ0ZXJzOiB7XG5cblx0XHRcdC8vIENvbnZlcnQgYW55dGhpbmcgdG8gdGV4dFxuXHRcdFx0XCIqIHRleHRcIjogU3RyaW5nLFxuXG5cdFx0XHQvLyBUZXh0IHRvIGh0bWwgKHRydWUgPSBubyB0cmFuc2Zvcm1hdGlvbilcblx0XHRcdFwidGV4dCBodG1sXCI6IHRydWUsXG5cblx0XHRcdC8vIEV2YWx1YXRlIHRleHQgYXMgYSBqc29uIGV4cHJlc3Npb25cblx0XHRcdFwidGV4dCBqc29uXCI6IGpRdWVyeS5wYXJzZUpTT04sXG5cblx0XHRcdC8vIFBhcnNlIHRleHQgYXMgeG1sXG5cdFx0XHRcInRleHQgeG1sXCI6IGpRdWVyeS5wYXJzZVhNTFxuXHRcdH0sXG5cblx0XHQvLyBGb3Igb3B0aW9ucyB0aGF0IHNob3VsZG4ndCBiZSBkZWVwIGV4dGVuZGVkOlxuXHRcdC8vIHlvdSBjYW4gYWRkIHlvdXIgb3duIGN1c3RvbSBvcHRpb25zIGhlcmUgaWZcblx0XHQvLyBhbmQgd2hlbiB5b3UgY3JlYXRlIG9uZSB0aGF0IHNob3VsZG4ndCBiZVxuXHRcdC8vIGRlZXAgZXh0ZW5kZWQgKHNlZSBhamF4RXh0ZW5kKVxuXHRcdGZsYXRPcHRpb25zOiB7XG5cdFx0XHR1cmw6IHRydWUsXG5cdFx0XHRjb250ZXh0OiB0cnVlXG5cdFx0fVxuXHR9LFxuXG5cdC8vIENyZWF0ZXMgYSBmdWxsIGZsZWRnZWQgc2V0dGluZ3Mgb2JqZWN0IGludG8gdGFyZ2V0XG5cdC8vIHdpdGggYm90aCBhamF4U2V0dGluZ3MgYW5kIHNldHRpbmdzIGZpZWxkcy5cblx0Ly8gSWYgdGFyZ2V0IGlzIG9taXR0ZWQsIHdyaXRlcyBpbnRvIGFqYXhTZXR0aW5ncy5cblx0YWpheFNldHVwOiBmdW5jdGlvbiggdGFyZ2V0LCBzZXR0aW5ncyApIHtcblx0XHRyZXR1cm4gc2V0dGluZ3MgP1xuXG5cdFx0XHQvLyBCdWlsZGluZyBhIHNldHRpbmdzIG9iamVjdFxuXHRcdFx0YWpheEV4dGVuZCggYWpheEV4dGVuZCggdGFyZ2V0LCBqUXVlcnkuYWpheFNldHRpbmdzICksIHNldHRpbmdzICkgOlxuXG5cdFx0XHQvLyBFeHRlbmRpbmcgYWpheFNldHRpbmdzXG5cdFx0XHRhamF4RXh0ZW5kKCBqUXVlcnkuYWpheFNldHRpbmdzLCB0YXJnZXQgKTtcblx0fSxcblxuXHRhamF4UHJlZmlsdGVyOiBhZGRUb1ByZWZpbHRlcnNPclRyYW5zcG9ydHMoIHByZWZpbHRlcnMgKSxcblx0YWpheFRyYW5zcG9ydDogYWRkVG9QcmVmaWx0ZXJzT3JUcmFuc3BvcnRzKCB0cmFuc3BvcnRzICksXG5cblx0Ly8gTWFpbiBtZXRob2Rcblx0YWpheDogZnVuY3Rpb24oIHVybCwgb3B0aW9ucyApIHtcblxuXHRcdC8vIElmIHVybCBpcyBhbiBvYmplY3QsIHNpbXVsYXRlIHByZS0xLjUgc2lnbmF0dXJlXG5cdFx0aWYgKCB0eXBlb2YgdXJsID09PSBcIm9iamVjdFwiICkge1xuXHRcdFx0b3B0aW9ucyA9IHVybDtcblx0XHRcdHVybCA9IHVuZGVmaW5lZDtcblx0XHR9XG5cblx0XHQvLyBGb3JjZSBvcHRpb25zIHRvIGJlIGFuIG9iamVjdFxuXHRcdG9wdGlvbnMgPSBvcHRpb25zIHx8IHt9O1xuXG5cdFx0dmFyIHRyYW5zcG9ydCxcblxuXHRcdFx0Ly8gVVJMIHdpdGhvdXQgYW50aS1jYWNoZSBwYXJhbVxuXHRcdFx0Y2FjaGVVUkwsXG5cblx0XHRcdC8vIFJlc3BvbnNlIGhlYWRlcnNcblx0XHRcdHJlc3BvbnNlSGVhZGVyc1N0cmluZyxcblx0XHRcdHJlc3BvbnNlSGVhZGVycyxcblxuXHRcdFx0Ly8gdGltZW91dCBoYW5kbGVcblx0XHRcdHRpbWVvdXRUaW1lcixcblxuXHRcdFx0Ly8gVXJsIGNsZWFudXAgdmFyXG5cdFx0XHR1cmxBbmNob3IsXG5cblx0XHRcdC8vIFRvIGtub3cgaWYgZ2xvYmFsIGV2ZW50cyBhcmUgdG8gYmUgZGlzcGF0Y2hlZFxuXHRcdFx0ZmlyZUdsb2JhbHMsXG5cblx0XHRcdC8vIExvb3AgdmFyaWFibGVcblx0XHRcdGksXG5cblx0XHRcdC8vIENyZWF0ZSB0aGUgZmluYWwgb3B0aW9ucyBvYmplY3Rcblx0XHRcdHMgPSBqUXVlcnkuYWpheFNldHVwKCB7fSwgb3B0aW9ucyApLFxuXG5cdFx0XHQvLyBDYWxsYmFja3MgY29udGV4dFxuXHRcdFx0Y2FsbGJhY2tDb250ZXh0ID0gcy5jb250ZXh0IHx8IHMsXG5cblx0XHRcdC8vIENvbnRleHQgZm9yIGdsb2JhbCBldmVudHMgaXMgY2FsbGJhY2tDb250ZXh0IGlmIGl0IGlzIGEgRE9NIG5vZGUgb3IgalF1ZXJ5IGNvbGxlY3Rpb25cblx0XHRcdGdsb2JhbEV2ZW50Q29udGV4dCA9IHMuY29udGV4dCAmJlxuXHRcdFx0XHQoIGNhbGxiYWNrQ29udGV4dC5ub2RlVHlwZSB8fCBjYWxsYmFja0NvbnRleHQuanF1ZXJ5ICkgP1xuXHRcdFx0XHRcdGpRdWVyeSggY2FsbGJhY2tDb250ZXh0ICkgOlxuXHRcdFx0XHRcdGpRdWVyeS5ldmVudCxcblxuXHRcdFx0Ly8gRGVmZXJyZWRzXG5cdFx0XHRkZWZlcnJlZCA9IGpRdWVyeS5EZWZlcnJlZCgpLFxuXHRcdFx0Y29tcGxldGVEZWZlcnJlZCA9IGpRdWVyeS5DYWxsYmFja3MoIFwib25jZSBtZW1vcnlcIiApLFxuXG5cdFx0XHQvLyBTdGF0dXMtZGVwZW5kZW50IGNhbGxiYWNrc1xuXHRcdFx0c3RhdHVzQ29kZSA9IHMuc3RhdHVzQ29kZSB8fCB7fSxcblxuXHRcdFx0Ly8gSGVhZGVycyAodGhleSBhcmUgc2VudCBhbGwgYXQgb25jZSlcblx0XHRcdHJlcXVlc3RIZWFkZXJzID0ge30sXG5cdFx0XHRyZXF1ZXN0SGVhZGVyc05hbWVzID0ge30sXG5cblx0XHRcdC8vIFRoZSBqcVhIUiBzdGF0ZVxuXHRcdFx0c3RhdGUgPSAwLFxuXG5cdFx0XHQvLyBEZWZhdWx0IGFib3J0IG1lc3NhZ2Vcblx0XHRcdHN0ckFib3J0ID0gXCJjYW5jZWxlZFwiLFxuXG5cdFx0XHQvLyBGYWtlIHhoclxuXHRcdFx0anFYSFIgPSB7XG5cdFx0XHRcdHJlYWR5U3RhdGU6IDAsXG5cblx0XHRcdFx0Ly8gQnVpbGRzIGhlYWRlcnMgaGFzaHRhYmxlIGlmIG5lZWRlZFxuXHRcdFx0XHRnZXRSZXNwb25zZUhlYWRlcjogZnVuY3Rpb24oIGtleSApIHtcblx0XHRcdFx0XHR2YXIgbWF0Y2g7XG5cdFx0XHRcdFx0aWYgKCBzdGF0ZSA9PT0gMiApIHtcblx0XHRcdFx0XHRcdGlmICggIXJlc3BvbnNlSGVhZGVycyApIHtcblx0XHRcdFx0XHRcdFx0cmVzcG9uc2VIZWFkZXJzID0ge307XG5cdFx0XHRcdFx0XHRcdHdoaWxlICggKCBtYXRjaCA9IHJoZWFkZXJzLmV4ZWMoIHJlc3BvbnNlSGVhZGVyc1N0cmluZyApICkgKSB7XG5cdFx0XHRcdFx0XHRcdFx0cmVzcG9uc2VIZWFkZXJzWyBtYXRjaFsgMSBdLnRvTG93ZXJDYXNlKCkgXSA9IG1hdGNoWyAyIF07XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdG1hdGNoID0gcmVzcG9uc2VIZWFkZXJzWyBrZXkudG9Mb3dlckNhc2UoKSBdO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRyZXR1cm4gbWF0Y2ggPT0gbnVsbCA/IG51bGwgOiBtYXRjaDtcblx0XHRcdFx0fSxcblxuXHRcdFx0XHQvLyBSYXcgc3RyaW5nXG5cdFx0XHRcdGdldEFsbFJlc3BvbnNlSGVhZGVyczogZnVuY3Rpb24oKSB7XG5cdFx0XHRcdFx0cmV0dXJuIHN0YXRlID09PSAyID8gcmVzcG9uc2VIZWFkZXJzU3RyaW5nIDogbnVsbDtcblx0XHRcdFx0fSxcblxuXHRcdFx0XHQvLyBDYWNoZXMgdGhlIGhlYWRlclxuXHRcdFx0XHRzZXRSZXF1ZXN0SGVhZGVyOiBmdW5jdGlvbiggbmFtZSwgdmFsdWUgKSB7XG5cdFx0XHRcdFx0dmFyIGxuYW1lID0gbmFtZS50b0xvd2VyQ2FzZSgpO1xuXHRcdFx0XHRcdGlmICggIXN0YXRlICkge1xuXHRcdFx0XHRcdFx0bmFtZSA9IHJlcXVlc3RIZWFkZXJzTmFtZXNbIGxuYW1lIF0gPSByZXF1ZXN0SGVhZGVyc05hbWVzWyBsbmFtZSBdIHx8IG5hbWU7XG5cdFx0XHRcdFx0XHRyZXF1ZXN0SGVhZGVyc1sgbmFtZSBdID0gdmFsdWU7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdHJldHVybiB0aGlzO1xuXHRcdFx0XHR9LFxuXG5cdFx0XHRcdC8vIE92ZXJyaWRlcyByZXNwb25zZSBjb250ZW50LXR5cGUgaGVhZGVyXG5cdFx0XHRcdG92ZXJyaWRlTWltZVR5cGU6IGZ1bmN0aW9uKCB0eXBlICkge1xuXHRcdFx0XHRcdGlmICggIXN0YXRlICkge1xuXHRcdFx0XHRcdFx0cy5taW1lVHlwZSA9IHR5cGU7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdHJldHVybiB0aGlzO1xuXHRcdFx0XHR9LFxuXG5cdFx0XHRcdC8vIFN0YXR1cy1kZXBlbmRlbnQgY2FsbGJhY2tzXG5cdFx0XHRcdHN0YXR1c0NvZGU6IGZ1bmN0aW9uKCBtYXAgKSB7XG5cdFx0XHRcdFx0dmFyIGNvZGU7XG5cdFx0XHRcdFx0aWYgKCBtYXAgKSB7XG5cdFx0XHRcdFx0XHRpZiAoIHN0YXRlIDwgMiApIHtcblx0XHRcdFx0XHRcdFx0Zm9yICggY29kZSBpbiBtYXAgKSB7XG5cblx0XHRcdFx0XHRcdFx0XHQvLyBMYXp5LWFkZCB0aGUgbmV3IGNhbGxiYWNrIGluIGEgd2F5IHRoYXQgcHJlc2VydmVzIG9sZCBvbmVzXG5cdFx0XHRcdFx0XHRcdFx0c3RhdHVzQ29kZVsgY29kZSBdID0gWyBzdGF0dXNDb2RlWyBjb2RlIF0sIG1hcFsgY29kZSBdIF07XG5cdFx0XHRcdFx0XHRcdH1cblx0XHRcdFx0XHRcdH0gZWxzZSB7XG5cblx0XHRcdFx0XHRcdFx0Ly8gRXhlY3V0ZSB0aGUgYXBwcm9wcmlhdGUgY2FsbGJhY2tzXG5cdFx0XHRcdFx0XHRcdGpxWEhSLmFsd2F5cyggbWFwWyBqcVhIUi5zdGF0dXMgXSApO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRyZXR1cm4gdGhpcztcblx0XHRcdFx0fSxcblxuXHRcdFx0XHQvLyBDYW5jZWwgdGhlIHJlcXVlc3Rcblx0XHRcdFx0YWJvcnQ6IGZ1bmN0aW9uKCBzdGF0dXNUZXh0ICkge1xuXHRcdFx0XHRcdHZhciBmaW5hbFRleHQgPSBzdGF0dXNUZXh0IHx8IHN0ckFib3J0O1xuXHRcdFx0XHRcdGlmICggdHJhbnNwb3J0ICkge1xuXHRcdFx0XHRcdFx0dHJhbnNwb3J0LmFib3J0KCBmaW5hbFRleHQgKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0ZG9uZSggMCwgZmluYWxUZXh0ICk7XG5cdFx0XHRcdFx0cmV0dXJuIHRoaXM7XG5cdFx0XHRcdH1cblx0XHRcdH07XG5cblx0XHQvLyBBdHRhY2ggZGVmZXJyZWRzXG5cdFx0ZGVmZXJyZWQucHJvbWlzZSgganFYSFIgKS5jb21wbGV0ZSA9IGNvbXBsZXRlRGVmZXJyZWQuYWRkO1xuXHRcdGpxWEhSLnN1Y2Nlc3MgPSBqcVhIUi5kb25lO1xuXHRcdGpxWEhSLmVycm9yID0ganFYSFIuZmFpbDtcblxuXHRcdC8vIFJlbW92ZSBoYXNoIGNoYXJhY3RlciAoIzc1MzE6IGFuZCBzdHJpbmcgcHJvbW90aW9uKVxuXHRcdC8vIEFkZCBwcm90b2NvbCBpZiBub3QgcHJvdmlkZWQgKHByZWZpbHRlcnMgbWlnaHQgZXhwZWN0IGl0KVxuXHRcdC8vIEhhbmRsZSBmYWxzeSB1cmwgaW4gdGhlIHNldHRpbmdzIG9iamVjdCAoIzEwMDkzOiBjb25zaXN0ZW5jeSB3aXRoIG9sZCBzaWduYXR1cmUpXG5cdFx0Ly8gV2UgYWxzbyB1c2UgdGhlIHVybCBwYXJhbWV0ZXIgaWYgYXZhaWxhYmxlXG5cdFx0cy51cmwgPSAoICggdXJsIHx8IHMudXJsIHx8IGxvY2F0aW9uLmhyZWYgKSArIFwiXCIgKS5yZXBsYWNlKCByaGFzaCwgXCJcIiApXG5cdFx0XHQucmVwbGFjZSggcnByb3RvY29sLCBsb2NhdGlvbi5wcm90b2NvbCArIFwiLy9cIiApO1xuXG5cdFx0Ly8gQWxpYXMgbWV0aG9kIG9wdGlvbiB0byB0eXBlIGFzIHBlciB0aWNrZXQgIzEyMDA0XG5cdFx0cy50eXBlID0gb3B0aW9ucy5tZXRob2QgfHwgb3B0aW9ucy50eXBlIHx8IHMubWV0aG9kIHx8IHMudHlwZTtcblxuXHRcdC8vIEV4dHJhY3QgZGF0YVR5cGVzIGxpc3Rcblx0XHRzLmRhdGFUeXBlcyA9IGpRdWVyeS50cmltKCBzLmRhdGFUeXBlIHx8IFwiKlwiICkudG9Mb3dlckNhc2UoKS5tYXRjaCggcm5vdHdoaXRlICkgfHwgWyBcIlwiIF07XG5cblx0XHQvLyBBIGNyb3NzLWRvbWFpbiByZXF1ZXN0IGlzIGluIG9yZGVyIHdoZW4gdGhlIG9yaWdpbiBkb2Vzbid0IG1hdGNoIHRoZSBjdXJyZW50IG9yaWdpbi5cblx0XHRpZiAoIHMuY3Jvc3NEb21haW4gPT0gbnVsbCApIHtcblx0XHRcdHVybEFuY2hvciA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoIFwiYVwiICk7XG5cblx0XHRcdC8vIFN1cHBvcnQ6IElFOC0xMStcblx0XHRcdC8vIElFIHRocm93cyBleGNlcHRpb24gaWYgdXJsIGlzIG1hbGZvcm1lZCwgZS5nLiBodHRwOi8vZXhhbXBsZS5jb206ODB4L1xuXHRcdFx0dHJ5IHtcblx0XHRcdFx0dXJsQW5jaG9yLmhyZWYgPSBzLnVybDtcblxuXHRcdFx0XHQvLyBTdXBwb3J0OiBJRTgtMTErXG5cdFx0XHRcdC8vIEFuY2hvcidzIGhvc3QgcHJvcGVydHkgaXNuJ3QgY29ycmVjdGx5IHNldCB3aGVuIHMudXJsIGlzIHJlbGF0aXZlXG5cdFx0XHRcdHVybEFuY2hvci5ocmVmID0gdXJsQW5jaG9yLmhyZWY7XG5cdFx0XHRcdHMuY3Jvc3NEb21haW4gPSBvcmlnaW5BbmNob3IucHJvdG9jb2wgKyBcIi8vXCIgKyBvcmlnaW5BbmNob3IuaG9zdCAhPT1cblx0XHRcdFx0XHR1cmxBbmNob3IucHJvdG9jb2wgKyBcIi8vXCIgKyB1cmxBbmNob3IuaG9zdDtcblx0XHRcdH0gY2F0Y2ggKCBlICkge1xuXG5cdFx0XHRcdC8vIElmIHRoZXJlIGlzIGFuIGVycm9yIHBhcnNpbmcgdGhlIFVSTCwgYXNzdW1lIGl0IGlzIGNyb3NzRG9tYWluLFxuXHRcdFx0XHQvLyBpdCBjYW4gYmUgcmVqZWN0ZWQgYnkgdGhlIHRyYW5zcG9ydCBpZiBpdCBpcyBpbnZhbGlkXG5cdFx0XHRcdHMuY3Jvc3NEb21haW4gPSB0cnVlO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vIENvbnZlcnQgZGF0YSBpZiBub3QgYWxyZWFkeSBhIHN0cmluZ1xuXHRcdGlmICggcy5kYXRhICYmIHMucHJvY2Vzc0RhdGEgJiYgdHlwZW9mIHMuZGF0YSAhPT0gXCJzdHJpbmdcIiApIHtcblx0XHRcdHMuZGF0YSA9IGpRdWVyeS5wYXJhbSggcy5kYXRhLCBzLnRyYWRpdGlvbmFsICk7XG5cdFx0fVxuXG5cdFx0Ly8gQXBwbHkgcHJlZmlsdGVyc1xuXHRcdGluc3BlY3RQcmVmaWx0ZXJzT3JUcmFuc3BvcnRzKCBwcmVmaWx0ZXJzLCBzLCBvcHRpb25zLCBqcVhIUiApO1xuXG5cdFx0Ly8gSWYgcmVxdWVzdCB3YXMgYWJvcnRlZCBpbnNpZGUgYSBwcmVmaWx0ZXIsIHN0b3AgdGhlcmVcblx0XHRpZiAoIHN0YXRlID09PSAyICkge1xuXHRcdFx0cmV0dXJuIGpxWEhSO1xuXHRcdH1cblxuXHRcdC8vIFdlIGNhbiBmaXJlIGdsb2JhbCBldmVudHMgYXMgb2Ygbm93IGlmIGFza2VkIHRvXG5cdFx0Ly8gRG9uJ3QgZmlyZSBldmVudHMgaWYgalF1ZXJ5LmV2ZW50IGlzIHVuZGVmaW5lZCBpbiBhbiBBTUQtdXNhZ2Ugc2NlbmFyaW8gKCMxNTExOClcblx0XHRmaXJlR2xvYmFscyA9IGpRdWVyeS5ldmVudCAmJiBzLmdsb2JhbDtcblxuXHRcdC8vIFdhdGNoIGZvciBhIG5ldyBzZXQgb2YgcmVxdWVzdHNcblx0XHRpZiAoIGZpcmVHbG9iYWxzICYmIGpRdWVyeS5hY3RpdmUrKyA9PT0gMCApIHtcblx0XHRcdGpRdWVyeS5ldmVudC50cmlnZ2VyKCBcImFqYXhTdGFydFwiICk7XG5cdFx0fVxuXG5cdFx0Ly8gVXBwZXJjYXNlIHRoZSB0eXBlXG5cdFx0cy50eXBlID0gcy50eXBlLnRvVXBwZXJDYXNlKCk7XG5cblx0XHQvLyBEZXRlcm1pbmUgaWYgcmVxdWVzdCBoYXMgY29udGVudFxuXHRcdHMuaGFzQ29udGVudCA9ICFybm9Db250ZW50LnRlc3QoIHMudHlwZSApO1xuXG5cdFx0Ly8gU2F2ZSB0aGUgVVJMIGluIGNhc2Ugd2UncmUgdG95aW5nIHdpdGggdGhlIElmLU1vZGlmaWVkLVNpbmNlXG5cdFx0Ly8gYW5kL29yIElmLU5vbmUtTWF0Y2ggaGVhZGVyIGxhdGVyIG9uXG5cdFx0Y2FjaGVVUkwgPSBzLnVybDtcblxuXHRcdC8vIE1vcmUgb3B0aW9ucyBoYW5kbGluZyBmb3IgcmVxdWVzdHMgd2l0aCBubyBjb250ZW50XG5cdFx0aWYgKCAhcy5oYXNDb250ZW50ICkge1xuXG5cdFx0XHQvLyBJZiBkYXRhIGlzIGF2YWlsYWJsZSwgYXBwZW5kIGRhdGEgdG8gdXJsXG5cdFx0XHRpZiAoIHMuZGF0YSApIHtcblx0XHRcdFx0Y2FjaGVVUkwgPSAoIHMudXJsICs9ICggcnF1ZXJ5LnRlc3QoIGNhY2hlVVJMICkgPyBcIiZcIiA6IFwiP1wiICkgKyBzLmRhdGEgKTtcblxuXHRcdFx0XHQvLyAjOTY4MjogcmVtb3ZlIGRhdGEgc28gdGhhdCBpdCdzIG5vdCB1c2VkIGluIGFuIGV2ZW50dWFsIHJldHJ5XG5cdFx0XHRcdGRlbGV0ZSBzLmRhdGE7XG5cdFx0XHR9XG5cblx0XHRcdC8vIEFkZCBhbnRpLWNhY2hlIGluIHVybCBpZiBuZWVkZWRcblx0XHRcdGlmICggcy5jYWNoZSA9PT0gZmFsc2UgKSB7XG5cdFx0XHRcdHMudXJsID0gcnRzLnRlc3QoIGNhY2hlVVJMICkgP1xuXG5cdFx0XHRcdFx0Ly8gSWYgdGhlcmUgaXMgYWxyZWFkeSBhICdfJyBwYXJhbWV0ZXIsIHNldCBpdHMgdmFsdWVcblx0XHRcdFx0XHRjYWNoZVVSTC5yZXBsYWNlKCBydHMsIFwiJDFfPVwiICsgbm9uY2UrKyApIDpcblxuXHRcdFx0XHRcdC8vIE90aGVyd2lzZSBhZGQgb25lIHRvIHRoZSBlbmRcblx0XHRcdFx0XHRjYWNoZVVSTCArICggcnF1ZXJ5LnRlc3QoIGNhY2hlVVJMICkgPyBcIiZcIiA6IFwiP1wiICkgKyBcIl89XCIgKyBub25jZSsrO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vIFNldCB0aGUgSWYtTW9kaWZpZWQtU2luY2UgYW5kL29yIElmLU5vbmUtTWF0Y2ggaGVhZGVyLCBpZiBpbiBpZk1vZGlmaWVkIG1vZGUuXG5cdFx0aWYgKCBzLmlmTW9kaWZpZWQgKSB7XG5cdFx0XHRpZiAoIGpRdWVyeS5sYXN0TW9kaWZpZWRbIGNhY2hlVVJMIF0gKSB7XG5cdFx0XHRcdGpxWEhSLnNldFJlcXVlc3RIZWFkZXIoIFwiSWYtTW9kaWZpZWQtU2luY2VcIiwgalF1ZXJ5Lmxhc3RNb2RpZmllZFsgY2FjaGVVUkwgXSApO1xuXHRcdFx0fVxuXHRcdFx0aWYgKCBqUXVlcnkuZXRhZ1sgY2FjaGVVUkwgXSApIHtcblx0XHRcdFx0anFYSFIuc2V0UmVxdWVzdEhlYWRlciggXCJJZi1Ob25lLU1hdGNoXCIsIGpRdWVyeS5ldGFnWyBjYWNoZVVSTCBdICk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0Ly8gU2V0IHRoZSBjb3JyZWN0IGhlYWRlciwgaWYgZGF0YSBpcyBiZWluZyBzZW50XG5cdFx0aWYgKCBzLmRhdGEgJiYgcy5oYXNDb250ZW50ICYmIHMuY29udGVudFR5cGUgIT09IGZhbHNlIHx8IG9wdGlvbnMuY29udGVudFR5cGUgKSB7XG5cdFx0XHRqcVhIUi5zZXRSZXF1ZXN0SGVhZGVyKCBcIkNvbnRlbnQtVHlwZVwiLCBzLmNvbnRlbnRUeXBlICk7XG5cdFx0fVxuXG5cdFx0Ly8gU2V0IHRoZSBBY2NlcHRzIGhlYWRlciBmb3IgdGhlIHNlcnZlciwgZGVwZW5kaW5nIG9uIHRoZSBkYXRhVHlwZVxuXHRcdGpxWEhSLnNldFJlcXVlc3RIZWFkZXIoXG5cdFx0XHRcIkFjY2VwdFwiLFxuXHRcdFx0cy5kYXRhVHlwZXNbIDAgXSAmJiBzLmFjY2VwdHNbIHMuZGF0YVR5cGVzWyAwIF0gXSA/XG5cdFx0XHRcdHMuYWNjZXB0c1sgcy5kYXRhVHlwZXNbIDAgXSBdICtcblx0XHRcdFx0XHQoIHMuZGF0YVR5cGVzWyAwIF0gIT09IFwiKlwiID8gXCIsIFwiICsgYWxsVHlwZXMgKyBcIjsgcT0wLjAxXCIgOiBcIlwiICkgOlxuXHRcdFx0XHRzLmFjY2VwdHNbIFwiKlwiIF1cblx0XHQpO1xuXG5cdFx0Ly8gQ2hlY2sgZm9yIGhlYWRlcnMgb3B0aW9uXG5cdFx0Zm9yICggaSBpbiBzLmhlYWRlcnMgKSB7XG5cdFx0XHRqcVhIUi5zZXRSZXF1ZXN0SGVhZGVyKCBpLCBzLmhlYWRlcnNbIGkgXSApO1xuXHRcdH1cblxuXHRcdC8vIEFsbG93IGN1c3RvbSBoZWFkZXJzL21pbWV0eXBlcyBhbmQgZWFybHkgYWJvcnRcblx0XHRpZiAoIHMuYmVmb3JlU2VuZCAmJlxuXHRcdFx0KCBzLmJlZm9yZVNlbmQuY2FsbCggY2FsbGJhY2tDb250ZXh0LCBqcVhIUiwgcyApID09PSBmYWxzZSB8fCBzdGF0ZSA9PT0gMiApICkge1xuXG5cdFx0XHQvLyBBYm9ydCBpZiBub3QgZG9uZSBhbHJlYWR5IGFuZCByZXR1cm5cblx0XHRcdHJldHVybiBqcVhIUi5hYm9ydCgpO1xuXHRcdH1cblxuXHRcdC8vIEFib3J0aW5nIGlzIG5vIGxvbmdlciBhIGNhbmNlbGxhdGlvblxuXHRcdHN0ckFib3J0ID0gXCJhYm9ydFwiO1xuXG5cdFx0Ly8gSW5zdGFsbCBjYWxsYmFja3Mgb24gZGVmZXJyZWRzXG5cdFx0Zm9yICggaSBpbiB7IHN1Y2Nlc3M6IDEsIGVycm9yOiAxLCBjb21wbGV0ZTogMSB9ICkge1xuXHRcdFx0anFYSFJbIGkgXSggc1sgaSBdICk7XG5cdFx0fVxuXG5cdFx0Ly8gR2V0IHRyYW5zcG9ydFxuXHRcdHRyYW5zcG9ydCA9IGluc3BlY3RQcmVmaWx0ZXJzT3JUcmFuc3BvcnRzKCB0cmFuc3BvcnRzLCBzLCBvcHRpb25zLCBqcVhIUiApO1xuXG5cdFx0Ly8gSWYgbm8gdHJhbnNwb3J0LCB3ZSBhdXRvLWFib3J0XG5cdFx0aWYgKCAhdHJhbnNwb3J0ICkge1xuXHRcdFx0ZG9uZSggLTEsIFwiTm8gVHJhbnNwb3J0XCIgKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0anFYSFIucmVhZHlTdGF0ZSA9IDE7XG5cblx0XHRcdC8vIFNlbmQgZ2xvYmFsIGV2ZW50XG5cdFx0XHRpZiAoIGZpcmVHbG9iYWxzICkge1xuXHRcdFx0XHRnbG9iYWxFdmVudENvbnRleHQudHJpZ2dlciggXCJhamF4U2VuZFwiLCBbIGpxWEhSLCBzIF0gKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gSWYgcmVxdWVzdCB3YXMgYWJvcnRlZCBpbnNpZGUgYWpheFNlbmQsIHN0b3AgdGhlcmVcblx0XHRcdGlmICggc3RhdGUgPT09IDIgKSB7XG5cdFx0XHRcdHJldHVybiBqcVhIUjtcblx0XHRcdH1cblxuXHRcdFx0Ly8gVGltZW91dFxuXHRcdFx0aWYgKCBzLmFzeW5jICYmIHMudGltZW91dCA+IDAgKSB7XG5cdFx0XHRcdHRpbWVvdXRUaW1lciA9IHdpbmRvdy5zZXRUaW1lb3V0KCBmdW5jdGlvbigpIHtcblx0XHRcdFx0XHRqcVhIUi5hYm9ydCggXCJ0aW1lb3V0XCIgKTtcblx0XHRcdFx0fSwgcy50aW1lb3V0ICk7XG5cdFx0XHR9XG5cblx0XHRcdHRyeSB7XG5cdFx0XHRcdHN0YXRlID0gMTtcblx0XHRcdFx0dHJhbnNwb3J0LnNlbmQoIHJlcXVlc3RIZWFkZXJzLCBkb25lICk7XG5cdFx0XHR9IGNhdGNoICggZSApIHtcblxuXHRcdFx0XHQvLyBQcm9wYWdhdGUgZXhjZXB0aW9uIGFzIGVycm9yIGlmIG5vdCBkb25lXG5cdFx0XHRcdGlmICggc3RhdGUgPCAyICkge1xuXHRcdFx0XHRcdGRvbmUoIC0xLCBlICk7XG5cblx0XHRcdFx0Ly8gU2ltcGx5IHJldGhyb3cgb3RoZXJ3aXNlXG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0dGhyb3cgZTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH1cblxuXHRcdC8vIENhbGxiYWNrIGZvciB3aGVuIGV2ZXJ5dGhpbmcgaXMgZG9uZVxuXHRcdGZ1bmN0aW9uIGRvbmUoIHN0YXR1cywgbmF0aXZlU3RhdHVzVGV4dCwgcmVzcG9uc2VzLCBoZWFkZXJzICkge1xuXHRcdFx0dmFyIGlzU3VjY2Vzcywgc3VjY2VzcywgZXJyb3IsIHJlc3BvbnNlLCBtb2RpZmllZCxcblx0XHRcdFx0c3RhdHVzVGV4dCA9IG5hdGl2ZVN0YXR1c1RleHQ7XG5cblx0XHRcdC8vIENhbGxlZCBvbmNlXG5cdFx0XHRpZiAoIHN0YXRlID09PSAyICkge1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cblx0XHRcdC8vIFN0YXRlIGlzIFwiZG9uZVwiIG5vd1xuXHRcdFx0c3RhdGUgPSAyO1xuXG5cdFx0XHQvLyBDbGVhciB0aW1lb3V0IGlmIGl0IGV4aXN0c1xuXHRcdFx0aWYgKCB0aW1lb3V0VGltZXIgKSB7XG5cdFx0XHRcdHdpbmRvdy5jbGVhclRpbWVvdXQoIHRpbWVvdXRUaW1lciApO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBEZXJlZmVyZW5jZSB0cmFuc3BvcnQgZm9yIGVhcmx5IGdhcmJhZ2UgY29sbGVjdGlvblxuXHRcdFx0Ly8gKG5vIG1hdHRlciBob3cgbG9uZyB0aGUganFYSFIgb2JqZWN0IHdpbGwgYmUgdXNlZClcblx0XHRcdHRyYW5zcG9ydCA9IHVuZGVmaW5lZDtcblxuXHRcdFx0Ly8gQ2FjaGUgcmVzcG9uc2UgaGVhZGVyc1xuXHRcdFx0cmVzcG9uc2VIZWFkZXJzU3RyaW5nID0gaGVhZGVycyB8fCBcIlwiO1xuXG5cdFx0XHQvLyBTZXQgcmVhZHlTdGF0ZVxuXHRcdFx0anFYSFIucmVhZHlTdGF0ZSA9IHN0YXR1cyA+IDAgPyA0IDogMDtcblxuXHRcdFx0Ly8gRGV0ZXJtaW5lIGlmIHN1Y2Nlc3NmdWxcblx0XHRcdGlzU3VjY2VzcyA9IHN0YXR1cyA+PSAyMDAgJiYgc3RhdHVzIDwgMzAwIHx8IHN0YXR1cyA9PT0gMzA0O1xuXG5cdFx0XHQvLyBHZXQgcmVzcG9uc2UgZGF0YVxuXHRcdFx0aWYgKCByZXNwb25zZXMgKSB7XG5cdFx0XHRcdHJlc3BvbnNlID0gYWpheEhhbmRsZVJlc3BvbnNlcyggcywganFYSFIsIHJlc3BvbnNlcyApO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBDb252ZXJ0IG5vIG1hdHRlciB3aGF0ICh0aGF0IHdheSByZXNwb25zZVhYWCBmaWVsZHMgYXJlIGFsd2F5cyBzZXQpXG5cdFx0XHRyZXNwb25zZSA9IGFqYXhDb252ZXJ0KCBzLCByZXNwb25zZSwganFYSFIsIGlzU3VjY2VzcyApO1xuXG5cdFx0XHQvLyBJZiBzdWNjZXNzZnVsLCBoYW5kbGUgdHlwZSBjaGFpbmluZ1xuXHRcdFx0aWYgKCBpc1N1Y2Nlc3MgKSB7XG5cblx0XHRcdFx0Ly8gU2V0IHRoZSBJZi1Nb2RpZmllZC1TaW5jZSBhbmQvb3IgSWYtTm9uZS1NYXRjaCBoZWFkZXIsIGlmIGluIGlmTW9kaWZpZWQgbW9kZS5cblx0XHRcdFx0aWYgKCBzLmlmTW9kaWZpZWQgKSB7XG5cdFx0XHRcdFx0bW9kaWZpZWQgPSBqcVhIUi5nZXRSZXNwb25zZUhlYWRlciggXCJMYXN0LU1vZGlmaWVkXCIgKTtcblx0XHRcdFx0XHRpZiAoIG1vZGlmaWVkICkge1xuXHRcdFx0XHRcdFx0alF1ZXJ5Lmxhc3RNb2RpZmllZFsgY2FjaGVVUkwgXSA9IG1vZGlmaWVkO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRtb2RpZmllZCA9IGpxWEhSLmdldFJlc3BvbnNlSGVhZGVyKCBcImV0YWdcIiApO1xuXHRcdFx0XHRcdGlmICggbW9kaWZpZWQgKSB7XG5cdFx0XHRcdFx0XHRqUXVlcnkuZXRhZ1sgY2FjaGVVUkwgXSA9IG1vZGlmaWVkO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIGlmIG5vIGNvbnRlbnRcblx0XHRcdFx0aWYgKCBzdGF0dXMgPT09IDIwNCB8fCBzLnR5cGUgPT09IFwiSEVBRFwiICkge1xuXHRcdFx0XHRcdHN0YXR1c1RleHQgPSBcIm5vY29udGVudFwiO1xuXG5cdFx0XHRcdC8vIGlmIG5vdCBtb2RpZmllZFxuXHRcdFx0XHR9IGVsc2UgaWYgKCBzdGF0dXMgPT09IDMwNCApIHtcblx0XHRcdFx0XHRzdGF0dXNUZXh0ID0gXCJub3Rtb2RpZmllZFwiO1xuXG5cdFx0XHRcdC8vIElmIHdlIGhhdmUgZGF0YSwgbGV0J3MgY29udmVydCBpdFxuXHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdHN0YXR1c1RleHQgPSByZXNwb25zZS5zdGF0ZTtcblx0XHRcdFx0XHRzdWNjZXNzID0gcmVzcG9uc2UuZGF0YTtcblx0XHRcdFx0XHRlcnJvciA9IHJlc3BvbnNlLmVycm9yO1xuXHRcdFx0XHRcdGlzU3VjY2VzcyA9ICFlcnJvcjtcblx0XHRcdFx0fVxuXHRcdFx0fSBlbHNlIHtcblxuXHRcdFx0XHQvLyBFeHRyYWN0IGVycm9yIGZyb20gc3RhdHVzVGV4dCBhbmQgbm9ybWFsaXplIGZvciBub24tYWJvcnRzXG5cdFx0XHRcdGVycm9yID0gc3RhdHVzVGV4dDtcblx0XHRcdFx0aWYgKCBzdGF0dXMgfHwgIXN0YXR1c1RleHQgKSB7XG5cdFx0XHRcdFx0c3RhdHVzVGV4dCA9IFwiZXJyb3JcIjtcblx0XHRcdFx0XHRpZiAoIHN0YXR1cyA8IDAgKSB7XG5cdFx0XHRcdFx0XHRzdGF0dXMgPSAwO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fVxuXG5cdFx0XHQvLyBTZXQgZGF0YSBmb3IgdGhlIGZha2UgeGhyIG9iamVjdFxuXHRcdFx0anFYSFIuc3RhdHVzID0gc3RhdHVzO1xuXHRcdFx0anFYSFIuc3RhdHVzVGV4dCA9ICggbmF0aXZlU3RhdHVzVGV4dCB8fCBzdGF0dXNUZXh0ICkgKyBcIlwiO1xuXG5cdFx0XHQvLyBTdWNjZXNzL0Vycm9yXG5cdFx0XHRpZiAoIGlzU3VjY2VzcyApIHtcblx0XHRcdFx0ZGVmZXJyZWQucmVzb2x2ZVdpdGgoIGNhbGxiYWNrQ29udGV4dCwgWyBzdWNjZXNzLCBzdGF0dXNUZXh0LCBqcVhIUiBdICk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRkZWZlcnJlZC5yZWplY3RXaXRoKCBjYWxsYmFja0NvbnRleHQsIFsganFYSFIsIHN0YXR1c1RleHQsIGVycm9yIF0gKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gU3RhdHVzLWRlcGVuZGVudCBjYWxsYmFja3Ncblx0XHRcdGpxWEhSLnN0YXR1c0NvZGUoIHN0YXR1c0NvZGUgKTtcblx0XHRcdHN0YXR1c0NvZGUgPSB1bmRlZmluZWQ7XG5cblx0XHRcdGlmICggZmlyZUdsb2JhbHMgKSB7XG5cdFx0XHRcdGdsb2JhbEV2ZW50Q29udGV4dC50cmlnZ2VyKCBpc1N1Y2Nlc3MgPyBcImFqYXhTdWNjZXNzXCIgOiBcImFqYXhFcnJvclwiLFxuXHRcdFx0XHRcdFsganFYSFIsIHMsIGlzU3VjY2VzcyA/IHN1Y2Nlc3MgOiBlcnJvciBdICk7XG5cdFx0XHR9XG5cblx0XHRcdC8vIENvbXBsZXRlXG5cdFx0XHRjb21wbGV0ZURlZmVycmVkLmZpcmVXaXRoKCBjYWxsYmFja0NvbnRleHQsIFsganFYSFIsIHN0YXR1c1RleHQgXSApO1xuXG5cdFx0XHRpZiAoIGZpcmVHbG9iYWxzICkge1xuXHRcdFx0XHRnbG9iYWxFdmVudENvbnRleHQudHJpZ2dlciggXCJhamF4Q29tcGxldGVcIiwgWyBqcVhIUiwgcyBdICk7XG5cblx0XHRcdFx0Ly8gSGFuZGxlIHRoZSBnbG9iYWwgQUpBWCBjb3VudGVyXG5cdFx0XHRcdGlmICggISggLS1qUXVlcnkuYWN0aXZlICkgKSB7XG5cdFx0XHRcdFx0alF1ZXJ5LmV2ZW50LnRyaWdnZXIoIFwiYWpheFN0b3BcIiApO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0cmV0dXJuIGpxWEhSO1xuXHR9LFxuXG5cdGdldEpTT046IGZ1bmN0aW9uKCB1cmwsIGRhdGEsIGNhbGxiYWNrICkge1xuXHRcdHJldHVybiBqUXVlcnkuZ2V0KCB1cmwsIGRhdGEsIGNhbGxiYWNrLCBcImpzb25cIiApO1xuXHR9LFxuXG5cdGdldFNjcmlwdDogZnVuY3Rpb24oIHVybCwgY2FsbGJhY2sgKSB7XG5cdFx0cmV0dXJuIGpRdWVyeS5nZXQoIHVybCwgdW5kZWZpbmVkLCBjYWxsYmFjaywgXCJzY3JpcHRcIiApO1xuXHR9XG59ICk7XG5cbmpRdWVyeS5lYWNoKCBbIFwiZ2V0XCIsIFwicG9zdFwiIF0sIGZ1bmN0aW9uKCBpLCBtZXRob2QgKSB7XG5cdGpRdWVyeVsgbWV0aG9kIF0gPSBmdW5jdGlvbiggdXJsLCBkYXRhLCBjYWxsYmFjaywgdHlwZSApIHtcblxuXHRcdC8vIFNoaWZ0IGFyZ3VtZW50cyBpZiBkYXRhIGFyZ3VtZW50IHdhcyBvbWl0dGVkXG5cdFx0aWYgKCBqUXVlcnkuaXNGdW5jdGlvbiggZGF0YSApICkge1xuXHRcdFx0dHlwZSA9IHR5cGUgfHwgY2FsbGJhY2s7XG5cdFx0XHRjYWxsYmFjayA9IGRhdGE7XG5cdFx0XHRkYXRhID0gdW5kZWZpbmVkO1xuXHRcdH1cblxuXHRcdC8vIFRoZSB1cmwgY2FuIGJlIGFuIG9wdGlvbnMgb2JqZWN0ICh3aGljaCB0aGVuIG11c3QgaGF2ZSAudXJsKVxuXHRcdHJldHVybiBqUXVlcnkuYWpheCggalF1ZXJ5LmV4dGVuZCgge1xuXHRcdFx0dXJsOiB1cmwsXG5cdFx0XHR0eXBlOiBtZXRob2QsXG5cdFx0XHRkYXRhVHlwZTogdHlwZSxcblx0XHRcdGRhdGE6IGRhdGEsXG5cdFx0XHRzdWNjZXNzOiBjYWxsYmFja1xuXHRcdH0sIGpRdWVyeS5pc1BsYWluT2JqZWN0KCB1cmwgKSAmJiB1cmwgKSApO1xuXHR9O1xufSApO1xuXG5cbmpRdWVyeS5fZXZhbFVybCA9IGZ1bmN0aW9uKCB1cmwgKSB7XG5cdHJldHVybiBqUXVlcnkuYWpheCgge1xuXHRcdHVybDogdXJsLFxuXG5cdFx0Ly8gTWFrZSB0aGlzIGV4cGxpY2l0LCBzaW5jZSB1c2VyIGNhbiBvdmVycmlkZSB0aGlzIHRocm91Z2ggYWpheFNldHVwICgjMTEyNjQpXG5cdFx0dHlwZTogXCJHRVRcIixcblx0XHRkYXRhVHlwZTogXCJzY3JpcHRcIixcblx0XHRhc3luYzogZmFsc2UsXG5cdFx0Z2xvYmFsOiBmYWxzZSxcblx0XHRcInRocm93c1wiOiB0cnVlXG5cdH0gKTtcbn07XG5cblxualF1ZXJ5LmZuLmV4dGVuZCgge1xuXHR3cmFwQWxsOiBmdW5jdGlvbiggaHRtbCApIHtcblx0XHR2YXIgd3JhcDtcblxuXHRcdGlmICggalF1ZXJ5LmlzRnVuY3Rpb24oIGh0bWwgKSApIHtcblx0XHRcdHJldHVybiB0aGlzLmVhY2goIGZ1bmN0aW9uKCBpICkge1xuXHRcdFx0XHRqUXVlcnkoIHRoaXMgKS53cmFwQWxsKCBodG1sLmNhbGwoIHRoaXMsIGkgKSApO1xuXHRcdFx0fSApO1xuXHRcdH1cblxuXHRcdGlmICggdGhpc1sgMCBdICkge1xuXG5cdFx0XHQvLyBUaGUgZWxlbWVudHMgdG8gd3JhcCB0aGUgdGFyZ2V0IGFyb3VuZFxuXHRcdFx0d3JhcCA9IGpRdWVyeSggaHRtbCwgdGhpc1sgMCBdLm93bmVyRG9jdW1lbnQgKS5lcSggMCApLmNsb25lKCB0cnVlICk7XG5cblx0XHRcdGlmICggdGhpc1sgMCBdLnBhcmVudE5vZGUgKSB7XG5cdFx0XHRcdHdyYXAuaW5zZXJ0QmVmb3JlKCB0aGlzWyAwIF0gKTtcblx0XHRcdH1cblxuXHRcdFx0d3JhcC5tYXAoIGZ1bmN0aW9uKCkge1xuXHRcdFx0XHR2YXIgZWxlbSA9IHRoaXM7XG5cblx0XHRcdFx0d2hpbGUgKCBlbGVtLmZpcnN0RWxlbWVudENoaWxkICkge1xuXHRcdFx0XHRcdGVsZW0gPSBlbGVtLmZpcnN0RWxlbWVudENoaWxkO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0cmV0dXJuIGVsZW07XG5cdFx0XHR9ICkuYXBwZW5kKCB0aGlzICk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXM7XG5cdH0sXG5cblx0d3JhcElubmVyOiBmdW5jdGlvbiggaHRtbCApIHtcblx0XHRpZiAoIGpRdWVyeS5pc0Z1bmN0aW9uKCBodG1sICkgKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5lYWNoKCBmdW5jdGlvbiggaSApIHtcblx0XHRcdFx0alF1ZXJ5KCB0aGlzICkud3JhcElubmVyKCBodG1sLmNhbGwoIHRoaXMsIGkgKSApO1xuXHRcdFx0fSApO1xuXHRcdH1cblxuXHRcdHJldHVybiB0aGlzLmVhY2goIGZ1bmN0aW9uKCkge1xuXHRcdFx0dmFyIHNlbGYgPSBqUXVlcnkoIHRoaXMgKSxcblx0XHRcdFx0Y29udGVudHMgPSBzZWxmLmNvbnRlbnRzKCk7XG5cblx0XHRcdGlmICggY29udGVudHMubGVuZ3RoICkge1xuXHRcdFx0XHRjb250ZW50cy53cmFwQWxsKCBodG1sICk7XG5cblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHNlbGYuYXBwZW5kKCBodG1sICk7XG5cdFx0XHR9XG5cdFx0fSApO1xuXHR9LFxuXG5cdHdyYXA6IGZ1bmN0aW9uKCBodG1sICkge1xuXHRcdHZhciBpc0Z1bmN0aW9uID0galF1ZXJ5LmlzRnVuY3Rpb24oIGh0bWwgKTtcblxuXHRcdHJldHVybiB0aGlzLmVhY2goIGZ1bmN0aW9uKCBpICkge1xuXHRcdFx0alF1ZXJ5KCB0aGlzICkud3JhcEFsbCggaXNGdW5jdGlvbiA/IGh0bWwuY2FsbCggdGhpcywgaSApIDogaHRtbCApO1xuXHRcdH0gKTtcblx0fSxcblxuXHR1bndyYXA6IGZ1bmN0aW9uKCkge1xuXHRcdHJldHVybiB0aGlzLnBhcmVudCgpLmVhY2goIGZ1bmN0aW9uKCkge1xuXHRcdFx0aWYgKCAhalF1ZXJ5Lm5vZGVOYW1lKCB0aGlzLCBcImJvZHlcIiApICkge1xuXHRcdFx0XHRqUXVlcnkoIHRoaXMgKS5yZXBsYWNlV2l0aCggdGhpcy5jaGlsZE5vZGVzICk7XG5cdFx0XHR9XG5cdFx0fSApLmVuZCgpO1xuXHR9XG59ICk7XG5cblxualF1ZXJ5LmV4cHIuZmlsdGVycy5oaWRkZW4gPSBmdW5jdGlvbiggZWxlbSApIHtcblx0cmV0dXJuICFqUXVlcnkuZXhwci5maWx0ZXJzLnZpc2libGUoIGVsZW0gKTtcbn07XG5qUXVlcnkuZXhwci5maWx0ZXJzLnZpc2libGUgPSBmdW5jdGlvbiggZWxlbSApIHtcblxuXHQvLyBTdXBwb3J0OiBPcGVyYSA8PSAxMi4xMlxuXHQvLyBPcGVyYSByZXBvcnRzIG9mZnNldFdpZHRocyBhbmQgb2Zmc2V0SGVpZ2h0cyBsZXNzIHRoYW4gemVybyBvbiBzb21lIGVsZW1lbnRzXG5cdC8vIFVzZSBPUiBpbnN0ZWFkIG9mIEFORCBhcyB0aGUgZWxlbWVudCBpcyBub3QgdmlzaWJsZSBpZiBlaXRoZXIgaXMgdHJ1ZVxuXHQvLyBTZWUgdGlja2V0cyAjMTA0MDYgYW5kICMxMzEzMlxuXHRyZXR1cm4gZWxlbS5vZmZzZXRXaWR0aCA+IDAgfHwgZWxlbS5vZmZzZXRIZWlnaHQgPiAwIHx8IGVsZW0uZ2V0Q2xpZW50UmVjdHMoKS5sZW5ndGggPiAwO1xufTtcblxuXG5cblxudmFyIHIyMCA9IC8lMjAvZyxcblx0cmJyYWNrZXQgPSAvXFxbXFxdJC8sXG5cdHJDUkxGID0gL1xccj9cXG4vZyxcblx0cnN1Ym1pdHRlclR5cGVzID0gL14oPzpzdWJtaXR8YnV0dG9ufGltYWdlfHJlc2V0fGZpbGUpJC9pLFxuXHRyc3VibWl0dGFibGUgPSAvXig/OmlucHV0fHNlbGVjdHx0ZXh0YXJlYXxrZXlnZW4pL2k7XG5cbmZ1bmN0aW9uIGJ1aWxkUGFyYW1zKCBwcmVmaXgsIG9iaiwgdHJhZGl0aW9uYWwsIGFkZCApIHtcblx0dmFyIG5hbWU7XG5cblx0aWYgKCBqUXVlcnkuaXNBcnJheSggb2JqICkgKSB7XG5cblx0XHQvLyBTZXJpYWxpemUgYXJyYXkgaXRlbS5cblx0XHRqUXVlcnkuZWFjaCggb2JqLCBmdW5jdGlvbiggaSwgdiApIHtcblx0XHRcdGlmICggdHJhZGl0aW9uYWwgfHwgcmJyYWNrZXQudGVzdCggcHJlZml4ICkgKSB7XG5cblx0XHRcdFx0Ly8gVHJlYXQgZWFjaCBhcnJheSBpdGVtIGFzIGEgc2NhbGFyLlxuXHRcdFx0XHRhZGQoIHByZWZpeCwgdiApO1xuXG5cdFx0XHR9IGVsc2Uge1xuXG5cdFx0XHRcdC8vIEl0ZW0gaXMgbm9uLXNjYWxhciAoYXJyYXkgb3Igb2JqZWN0KSwgZW5jb2RlIGl0cyBudW1lcmljIGluZGV4LlxuXHRcdFx0XHRidWlsZFBhcmFtcyhcblx0XHRcdFx0XHRwcmVmaXggKyBcIltcIiArICggdHlwZW9mIHYgPT09IFwib2JqZWN0XCIgJiYgdiAhPSBudWxsID8gaSA6IFwiXCIgKSArIFwiXVwiLFxuXHRcdFx0XHRcdHYsXG5cdFx0XHRcdFx0dHJhZGl0aW9uYWwsXG5cdFx0XHRcdFx0YWRkXG5cdFx0XHRcdCk7XG5cdFx0XHR9XG5cdFx0fSApO1xuXG5cdH0gZWxzZSBpZiAoICF0cmFkaXRpb25hbCAmJiBqUXVlcnkudHlwZSggb2JqICkgPT09IFwib2JqZWN0XCIgKSB7XG5cblx0XHQvLyBTZXJpYWxpemUgb2JqZWN0IGl0ZW0uXG5cdFx0Zm9yICggbmFtZSBpbiBvYmogKSB7XG5cdFx0XHRidWlsZFBhcmFtcyggcHJlZml4ICsgXCJbXCIgKyBuYW1lICsgXCJdXCIsIG9ialsgbmFtZSBdLCB0cmFkaXRpb25hbCwgYWRkICk7XG5cdFx0fVxuXG5cdH0gZWxzZSB7XG5cblx0XHQvLyBTZXJpYWxpemUgc2NhbGFyIGl0ZW0uXG5cdFx0YWRkKCBwcmVmaXgsIG9iaiApO1xuXHR9XG59XG5cbi8vIFNlcmlhbGl6ZSBhbiBhcnJheSBvZiBmb3JtIGVsZW1lbnRzIG9yIGEgc2V0IG9mXG4vLyBrZXkvdmFsdWVzIGludG8gYSBxdWVyeSBzdHJpbmdcbmpRdWVyeS5wYXJhbSA9IGZ1bmN0aW9uKCBhLCB0cmFkaXRpb25hbCApIHtcblx0dmFyIHByZWZpeCxcblx0XHRzID0gW10sXG5cdFx0YWRkID0gZnVuY3Rpb24oIGtleSwgdmFsdWUgKSB7XG5cblx0XHRcdC8vIElmIHZhbHVlIGlzIGEgZnVuY3Rpb24sIGludm9rZSBpdCBhbmQgcmV0dXJuIGl0cyB2YWx1ZVxuXHRcdFx0dmFsdWUgPSBqUXVlcnkuaXNGdW5jdGlvbiggdmFsdWUgKSA/IHZhbHVlKCkgOiAoIHZhbHVlID09IG51bGwgPyBcIlwiIDogdmFsdWUgKTtcblx0XHRcdHNbIHMubGVuZ3RoIF0gPSBlbmNvZGVVUklDb21wb25lbnQoIGtleSApICsgXCI9XCIgKyBlbmNvZGVVUklDb21wb25lbnQoIHZhbHVlICk7XG5cdFx0fTtcblxuXHQvLyBTZXQgdHJhZGl0aW9uYWwgdG8gdHJ1ZSBmb3IgalF1ZXJ5IDw9IDEuMy4yIGJlaGF2aW9yLlxuXHRpZiAoIHRyYWRpdGlvbmFsID09PSB1bmRlZmluZWQgKSB7XG5cdFx0dHJhZGl0aW9uYWwgPSBqUXVlcnkuYWpheFNldHRpbmdzICYmIGpRdWVyeS5hamF4U2V0dGluZ3MudHJhZGl0aW9uYWw7XG5cdH1cblxuXHQvLyBJZiBhbiBhcnJheSB3YXMgcGFzc2VkIGluLCBhc3N1bWUgdGhhdCBpdCBpcyBhbiBhcnJheSBvZiBmb3JtIGVsZW1lbnRzLlxuXHRpZiAoIGpRdWVyeS5pc0FycmF5KCBhICkgfHwgKCBhLmpxdWVyeSAmJiAhalF1ZXJ5LmlzUGxhaW5PYmplY3QoIGEgKSApICkge1xuXG5cdFx0Ly8gU2VyaWFsaXplIHRoZSBmb3JtIGVsZW1lbnRzXG5cdFx0alF1ZXJ5LmVhY2goIGEsIGZ1bmN0aW9uKCkge1xuXHRcdFx0YWRkKCB0aGlzLm5hbWUsIHRoaXMudmFsdWUgKTtcblx0XHR9ICk7XG5cblx0fSBlbHNlIHtcblxuXHRcdC8vIElmIHRyYWRpdGlvbmFsLCBlbmNvZGUgdGhlIFwib2xkXCIgd2F5ICh0aGUgd2F5IDEuMy4yIG9yIG9sZGVyXG5cdFx0Ly8gZGlkIGl0KSwgb3RoZXJ3aXNlIGVuY29kZSBwYXJhbXMgcmVjdXJzaXZlbHkuXG5cdFx0Zm9yICggcHJlZml4IGluIGEgKSB7XG5cdFx0XHRidWlsZFBhcmFtcyggcHJlZml4LCBhWyBwcmVmaXggXSwgdHJhZGl0aW9uYWwsIGFkZCApO1xuXHRcdH1cblx0fVxuXG5cdC8vIFJldHVybiB0aGUgcmVzdWx0aW5nIHNlcmlhbGl6YXRpb25cblx0cmV0dXJuIHMuam9pbiggXCImXCIgKS5yZXBsYWNlKCByMjAsIFwiK1wiICk7XG59O1xuXG5qUXVlcnkuZm4uZXh0ZW5kKCB7XG5cdHNlcmlhbGl6ZTogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIGpRdWVyeS5wYXJhbSggdGhpcy5zZXJpYWxpemVBcnJheSgpICk7XG5cdH0sXG5cdHNlcmlhbGl6ZUFycmF5OiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gdGhpcy5tYXAoIGZ1bmN0aW9uKCkge1xuXG5cdFx0XHQvLyBDYW4gYWRkIHByb3BIb29rIGZvciBcImVsZW1lbnRzXCIgdG8gZmlsdGVyIG9yIGFkZCBmb3JtIGVsZW1lbnRzXG5cdFx0XHR2YXIgZWxlbWVudHMgPSBqUXVlcnkucHJvcCggdGhpcywgXCJlbGVtZW50c1wiICk7XG5cdFx0XHRyZXR1cm4gZWxlbWVudHMgPyBqUXVlcnkubWFrZUFycmF5KCBlbGVtZW50cyApIDogdGhpcztcblx0XHR9IClcblx0XHQuZmlsdGVyKCBmdW5jdGlvbigpIHtcblx0XHRcdHZhciB0eXBlID0gdGhpcy50eXBlO1xuXG5cdFx0XHQvLyBVc2UgLmlzKCBcIjpkaXNhYmxlZFwiICkgc28gdGhhdCBmaWVsZHNldFtkaXNhYmxlZF0gd29ya3Ncblx0XHRcdHJldHVybiB0aGlzLm5hbWUgJiYgIWpRdWVyeSggdGhpcyApLmlzKCBcIjpkaXNhYmxlZFwiICkgJiZcblx0XHRcdFx0cnN1Ym1pdHRhYmxlLnRlc3QoIHRoaXMubm9kZU5hbWUgKSAmJiAhcnN1Ym1pdHRlclR5cGVzLnRlc3QoIHR5cGUgKSAmJlxuXHRcdFx0XHQoIHRoaXMuY2hlY2tlZCB8fCAhcmNoZWNrYWJsZVR5cGUudGVzdCggdHlwZSApICk7XG5cdFx0fSApXG5cdFx0Lm1hcCggZnVuY3Rpb24oIGksIGVsZW0gKSB7XG5cdFx0XHR2YXIgdmFsID0galF1ZXJ5KCB0aGlzICkudmFsKCk7XG5cblx0XHRcdHJldHVybiB2YWwgPT0gbnVsbCA/XG5cdFx0XHRcdG51bGwgOlxuXHRcdFx0XHRqUXVlcnkuaXNBcnJheSggdmFsICkgP1xuXHRcdFx0XHRcdGpRdWVyeS5tYXAoIHZhbCwgZnVuY3Rpb24oIHZhbCApIHtcblx0XHRcdFx0XHRcdHJldHVybiB7IG5hbWU6IGVsZW0ubmFtZSwgdmFsdWU6IHZhbC5yZXBsYWNlKCByQ1JMRiwgXCJcXHJcXG5cIiApIH07XG5cdFx0XHRcdFx0fSApIDpcblx0XHRcdFx0XHR7IG5hbWU6IGVsZW0ubmFtZSwgdmFsdWU6IHZhbC5yZXBsYWNlKCByQ1JMRiwgXCJcXHJcXG5cIiApIH07XG5cdFx0fSApLmdldCgpO1xuXHR9XG59ICk7XG5cblxualF1ZXJ5LmFqYXhTZXR0aW5ncy54aHIgPSBmdW5jdGlvbigpIHtcblx0dHJ5IHtcblx0XHRyZXR1cm4gbmV3IHdpbmRvdy5YTUxIdHRwUmVxdWVzdCgpO1xuXHR9IGNhdGNoICggZSApIHt9XG59O1xuXG52YXIgeGhyU3VjY2Vzc1N0YXR1cyA9IHtcblxuXHRcdC8vIEZpbGUgcHJvdG9jb2wgYWx3YXlzIHlpZWxkcyBzdGF0dXMgY29kZSAwLCBhc3N1bWUgMjAwXG5cdFx0MDogMjAwLFxuXG5cdFx0Ly8gU3VwcG9ydDogSUU5XG5cdFx0Ly8gIzE0NTA6IHNvbWV0aW1lcyBJRSByZXR1cm5zIDEyMjMgd2hlbiBpdCBzaG91bGQgYmUgMjA0XG5cdFx0MTIyMzogMjA0XG5cdH0sXG5cdHhoclN1cHBvcnRlZCA9IGpRdWVyeS5hamF4U2V0dGluZ3MueGhyKCk7XG5cbnN1cHBvcnQuY29ycyA9ICEheGhyU3VwcG9ydGVkICYmICggXCJ3aXRoQ3JlZGVudGlhbHNcIiBpbiB4aHJTdXBwb3J0ZWQgKTtcbnN1cHBvcnQuYWpheCA9IHhoclN1cHBvcnRlZCA9ICEheGhyU3VwcG9ydGVkO1xuXG5qUXVlcnkuYWpheFRyYW5zcG9ydCggZnVuY3Rpb24oIG9wdGlvbnMgKSB7XG5cdHZhciBjYWxsYmFjaywgZXJyb3JDYWxsYmFjaztcblxuXHQvLyBDcm9zcyBkb21haW4gb25seSBhbGxvd2VkIGlmIHN1cHBvcnRlZCB0aHJvdWdoIFhNTEh0dHBSZXF1ZXN0XG5cdGlmICggc3VwcG9ydC5jb3JzIHx8IHhoclN1cHBvcnRlZCAmJiAhb3B0aW9ucy5jcm9zc0RvbWFpbiApIHtcblx0XHRyZXR1cm4ge1xuXHRcdFx0c2VuZDogZnVuY3Rpb24oIGhlYWRlcnMsIGNvbXBsZXRlICkge1xuXHRcdFx0XHR2YXIgaSxcblx0XHRcdFx0XHR4aHIgPSBvcHRpb25zLnhocigpO1xuXG5cdFx0XHRcdHhoci5vcGVuKFxuXHRcdFx0XHRcdG9wdGlvbnMudHlwZSxcblx0XHRcdFx0XHRvcHRpb25zLnVybCxcblx0XHRcdFx0XHRvcHRpb25zLmFzeW5jLFxuXHRcdFx0XHRcdG9wdGlvbnMudXNlcm5hbWUsXG5cdFx0XHRcdFx0b3B0aW9ucy5wYXNzd29yZFxuXHRcdFx0XHQpO1xuXG5cdFx0XHRcdC8vIEFwcGx5IGN1c3RvbSBmaWVsZHMgaWYgcHJvdmlkZWRcblx0XHRcdFx0aWYgKCBvcHRpb25zLnhockZpZWxkcyApIHtcblx0XHRcdFx0XHRmb3IgKCBpIGluIG9wdGlvbnMueGhyRmllbGRzICkge1xuXHRcdFx0XHRcdFx0eGhyWyBpIF0gPSBvcHRpb25zLnhockZpZWxkc1sgaSBdO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIE92ZXJyaWRlIG1pbWUgdHlwZSBpZiBuZWVkZWRcblx0XHRcdFx0aWYgKCBvcHRpb25zLm1pbWVUeXBlICYmIHhoci5vdmVycmlkZU1pbWVUeXBlICkge1xuXHRcdFx0XHRcdHhoci5vdmVycmlkZU1pbWVUeXBlKCBvcHRpb25zLm1pbWVUeXBlICk7XG5cdFx0XHRcdH1cblxuXHRcdFx0XHQvLyBYLVJlcXVlc3RlZC1XaXRoIGhlYWRlclxuXHRcdFx0XHQvLyBGb3IgY3Jvc3MtZG9tYWluIHJlcXVlc3RzLCBzZWVpbmcgYXMgY29uZGl0aW9ucyBmb3IgYSBwcmVmbGlnaHQgYXJlXG5cdFx0XHRcdC8vIGFraW4gdG8gYSBqaWdzYXcgcHV6emxlLCB3ZSBzaW1wbHkgbmV2ZXIgc2V0IGl0IHRvIGJlIHN1cmUuXG5cdFx0XHRcdC8vIChpdCBjYW4gYWx3YXlzIGJlIHNldCBvbiBhIHBlci1yZXF1ZXN0IGJhc2lzIG9yIGV2ZW4gdXNpbmcgYWpheFNldHVwKVxuXHRcdFx0XHQvLyBGb3Igc2FtZS1kb21haW4gcmVxdWVzdHMsIHdvbid0IGNoYW5nZSBoZWFkZXIgaWYgYWxyZWFkeSBwcm92aWRlZC5cblx0XHRcdFx0aWYgKCAhb3B0aW9ucy5jcm9zc0RvbWFpbiAmJiAhaGVhZGVyc1sgXCJYLVJlcXVlc3RlZC1XaXRoXCIgXSApIHtcblx0XHRcdFx0XHRoZWFkZXJzWyBcIlgtUmVxdWVzdGVkLVdpdGhcIiBdID0gXCJYTUxIdHRwUmVxdWVzdFwiO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0Ly8gU2V0IGhlYWRlcnNcblx0XHRcdFx0Zm9yICggaSBpbiBoZWFkZXJzICkge1xuXHRcdFx0XHRcdHhoci5zZXRSZXF1ZXN0SGVhZGVyKCBpLCBoZWFkZXJzWyBpIF0gKTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIENhbGxiYWNrXG5cdFx0XHRcdGNhbGxiYWNrID0gZnVuY3Rpb24oIHR5cGUgKSB7XG5cdFx0XHRcdFx0cmV0dXJuIGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRcdFx0aWYgKCBjYWxsYmFjayApIHtcblx0XHRcdFx0XHRcdFx0Y2FsbGJhY2sgPSBlcnJvckNhbGxiYWNrID0geGhyLm9ubG9hZCA9XG5cdFx0XHRcdFx0XHRcdFx0eGhyLm9uZXJyb3IgPSB4aHIub25hYm9ydCA9IHhoci5vbnJlYWR5c3RhdGVjaGFuZ2UgPSBudWxsO1xuXG5cdFx0XHRcdFx0XHRcdGlmICggdHlwZSA9PT0gXCJhYm9ydFwiICkge1xuXHRcdFx0XHRcdFx0XHRcdHhoci5hYm9ydCgpO1xuXHRcdFx0XHRcdFx0XHR9IGVsc2UgaWYgKCB0eXBlID09PSBcImVycm9yXCIgKSB7XG5cblx0XHRcdFx0XHRcdFx0XHQvLyBTdXBwb3J0OiBJRTlcblx0XHRcdFx0XHRcdFx0XHQvLyBPbiBhIG1hbnVhbCBuYXRpdmUgYWJvcnQsIElFOSB0aHJvd3Ncblx0XHRcdFx0XHRcdFx0XHQvLyBlcnJvcnMgb24gYW55IHByb3BlcnR5IGFjY2VzcyB0aGF0IGlzIG5vdCByZWFkeVN0YXRlXG5cdFx0XHRcdFx0XHRcdFx0aWYgKCB0eXBlb2YgeGhyLnN0YXR1cyAhPT0gXCJudW1iZXJcIiApIHtcblx0XHRcdFx0XHRcdFx0XHRcdGNvbXBsZXRlKCAwLCBcImVycm9yXCIgKTtcblx0XHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRcdFx0Y29tcGxldGUoXG5cblx0XHRcdFx0XHRcdFx0XHRcdFx0Ly8gRmlsZTogcHJvdG9jb2wgYWx3YXlzIHlpZWxkcyBzdGF0dXMgMDsgc2VlICM4NjA1LCAjMTQyMDdcblx0XHRcdFx0XHRcdFx0XHRcdFx0eGhyLnN0YXR1cyxcblx0XHRcdFx0XHRcdFx0XHRcdFx0eGhyLnN0YXR1c1RleHRcblx0XHRcdFx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRcdFx0XHRcdGNvbXBsZXRlKFxuXHRcdFx0XHRcdFx0XHRcdFx0eGhyU3VjY2Vzc1N0YXR1c1sgeGhyLnN0YXR1cyBdIHx8IHhoci5zdGF0dXMsXG5cdFx0XHRcdFx0XHRcdFx0XHR4aHIuc3RhdHVzVGV4dCxcblxuXHRcdFx0XHRcdFx0XHRcdFx0Ly8gU3VwcG9ydDogSUU5IG9ubHlcblx0XHRcdFx0XHRcdFx0XHRcdC8vIElFOSBoYXMgbm8gWEhSMiBidXQgdGhyb3dzIG9uIGJpbmFyeSAodHJhYy0xMTQyNilcblx0XHRcdFx0XHRcdFx0XHRcdC8vIEZvciBYSFIyIG5vbi10ZXh0LCBsZXQgdGhlIGNhbGxlciBoYW5kbGUgaXQgKGdoLTI0OTgpXG5cdFx0XHRcdFx0XHRcdFx0XHQoIHhoci5yZXNwb25zZVR5cGUgfHwgXCJ0ZXh0XCIgKSAhPT0gXCJ0ZXh0XCIgIHx8XG5cdFx0XHRcdFx0XHRcdFx0XHR0eXBlb2YgeGhyLnJlc3BvbnNlVGV4dCAhPT0gXCJzdHJpbmdcIiA/XG5cdFx0XHRcdFx0XHRcdFx0XHRcdHsgYmluYXJ5OiB4aHIucmVzcG9uc2UgfSA6XG5cdFx0XHRcdFx0XHRcdFx0XHRcdHsgdGV4dDogeGhyLnJlc3BvbnNlVGV4dCB9LFxuXHRcdFx0XHRcdFx0XHRcdFx0eGhyLmdldEFsbFJlc3BvbnNlSGVhZGVycygpXG5cdFx0XHRcdFx0XHRcdFx0KTtcblx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH07XG5cdFx0XHRcdH07XG5cblx0XHRcdFx0Ly8gTGlzdGVuIHRvIGV2ZW50c1xuXHRcdFx0XHR4aHIub25sb2FkID0gY2FsbGJhY2soKTtcblx0XHRcdFx0ZXJyb3JDYWxsYmFjayA9IHhoci5vbmVycm9yID0gY2FsbGJhY2soIFwiZXJyb3JcIiApO1xuXG5cdFx0XHRcdC8vIFN1cHBvcnQ6IElFOVxuXHRcdFx0XHQvLyBVc2Ugb25yZWFkeXN0YXRlY2hhbmdlIHRvIHJlcGxhY2Ugb25hYm9ydFxuXHRcdFx0XHQvLyB0byBoYW5kbGUgdW5jYXVnaHQgYWJvcnRzXG5cdFx0XHRcdGlmICggeGhyLm9uYWJvcnQgIT09IHVuZGVmaW5lZCApIHtcblx0XHRcdFx0XHR4aHIub25hYm9ydCA9IGVycm9yQ2FsbGJhY2s7XG5cdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0eGhyLm9ucmVhZHlzdGF0ZWNoYW5nZSA9IGZ1bmN0aW9uKCkge1xuXG5cdFx0XHRcdFx0XHQvLyBDaGVjayByZWFkeVN0YXRlIGJlZm9yZSB0aW1lb3V0IGFzIGl0IGNoYW5nZXNcblx0XHRcdFx0XHRcdGlmICggeGhyLnJlYWR5U3RhdGUgPT09IDQgKSB7XG5cblx0XHRcdFx0XHRcdFx0Ly8gQWxsb3cgb25lcnJvciB0byBiZSBjYWxsZWQgZmlyc3QsXG5cdFx0XHRcdFx0XHRcdC8vIGJ1dCB0aGF0IHdpbGwgbm90IGhhbmRsZSBhIG5hdGl2ZSBhYm9ydFxuXHRcdFx0XHRcdFx0XHQvLyBBbHNvLCBzYXZlIGVycm9yQ2FsbGJhY2sgdG8gYSB2YXJpYWJsZVxuXHRcdFx0XHRcdFx0XHQvLyBhcyB4aHIub25lcnJvciBjYW5ub3QgYmUgYWNjZXNzZWRcblx0XHRcdFx0XHRcdFx0d2luZG93LnNldFRpbWVvdXQoIGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRcdFx0XHRcdGlmICggY2FsbGJhY2sgKSB7XG5cdFx0XHRcdFx0XHRcdFx0XHRlcnJvckNhbGxiYWNrKCk7XG5cdFx0XHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdFx0XHR9ICk7XG5cdFx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0fTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIENyZWF0ZSB0aGUgYWJvcnQgY2FsbGJhY2tcblx0XHRcdFx0Y2FsbGJhY2sgPSBjYWxsYmFjayggXCJhYm9ydFwiICk7XG5cblx0XHRcdFx0dHJ5IHtcblxuXHRcdFx0XHRcdC8vIERvIHNlbmQgdGhlIHJlcXVlc3QgKHRoaXMgbWF5IHJhaXNlIGFuIGV4Y2VwdGlvbilcblx0XHRcdFx0XHR4aHIuc2VuZCggb3B0aW9ucy5oYXNDb250ZW50ICYmIG9wdGlvbnMuZGF0YSB8fCBudWxsICk7XG5cdFx0XHRcdH0gY2F0Y2ggKCBlICkge1xuXG5cdFx0XHRcdFx0Ly8gIzE0NjgzOiBPbmx5IHJldGhyb3cgaWYgdGhpcyBoYXNuJ3QgYmVlbiBub3RpZmllZCBhcyBhbiBlcnJvciB5ZXRcblx0XHRcdFx0XHRpZiAoIGNhbGxiYWNrICkge1xuXHRcdFx0XHRcdFx0dGhyb3cgZTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH1cblx0XHRcdH0sXG5cblx0XHRcdGFib3J0OiBmdW5jdGlvbigpIHtcblx0XHRcdFx0aWYgKCBjYWxsYmFjayApIHtcblx0XHRcdFx0XHRjYWxsYmFjaygpO1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fTtcblx0fVxufSApO1xuXG5cblxuXG4vLyBJbnN0YWxsIHNjcmlwdCBkYXRhVHlwZVxualF1ZXJ5LmFqYXhTZXR1cCgge1xuXHRhY2NlcHRzOiB7XG5cdFx0c2NyaXB0OiBcInRleHQvamF2YXNjcmlwdCwgYXBwbGljYXRpb24vamF2YXNjcmlwdCwgXCIgK1xuXHRcdFx0XCJhcHBsaWNhdGlvbi9lY21hc2NyaXB0LCBhcHBsaWNhdGlvbi94LWVjbWFzY3JpcHRcIlxuXHR9LFxuXHRjb250ZW50czoge1xuXHRcdHNjcmlwdDogL1xcYig/OmphdmF8ZWNtYSlzY3JpcHRcXGIvXG5cdH0sXG5cdGNvbnZlcnRlcnM6IHtcblx0XHRcInRleHQgc2NyaXB0XCI6IGZ1bmN0aW9uKCB0ZXh0ICkge1xuXHRcdFx0alF1ZXJ5Lmdsb2JhbEV2YWwoIHRleHQgKTtcblx0XHRcdHJldHVybiB0ZXh0O1xuXHRcdH1cblx0fVxufSApO1xuXG4vLyBIYW5kbGUgY2FjaGUncyBzcGVjaWFsIGNhc2UgYW5kIGNyb3NzRG9tYWluXG5qUXVlcnkuYWpheFByZWZpbHRlciggXCJzY3JpcHRcIiwgZnVuY3Rpb24oIHMgKSB7XG5cdGlmICggcy5jYWNoZSA9PT0gdW5kZWZpbmVkICkge1xuXHRcdHMuY2FjaGUgPSBmYWxzZTtcblx0fVxuXHRpZiAoIHMuY3Jvc3NEb21haW4gKSB7XG5cdFx0cy50eXBlID0gXCJHRVRcIjtcblx0fVxufSApO1xuXG4vLyBCaW5kIHNjcmlwdCB0YWcgaGFjayB0cmFuc3BvcnRcbmpRdWVyeS5hamF4VHJhbnNwb3J0KCBcInNjcmlwdFwiLCBmdW5jdGlvbiggcyApIHtcblxuXHQvLyBUaGlzIHRyYW5zcG9ydCBvbmx5IGRlYWxzIHdpdGggY3Jvc3MgZG9tYWluIHJlcXVlc3RzXG5cdGlmICggcy5jcm9zc0RvbWFpbiApIHtcblx0XHR2YXIgc2NyaXB0LCBjYWxsYmFjaztcblx0XHRyZXR1cm4ge1xuXHRcdFx0c2VuZDogZnVuY3Rpb24oIF8sIGNvbXBsZXRlICkge1xuXHRcdFx0XHRzY3JpcHQgPSBqUXVlcnkoIFwiPHNjcmlwdD5cIiApLnByb3AoIHtcblx0XHRcdFx0XHRjaGFyc2V0OiBzLnNjcmlwdENoYXJzZXQsXG5cdFx0XHRcdFx0c3JjOiBzLnVybFxuXHRcdFx0XHR9ICkub24oXG5cdFx0XHRcdFx0XCJsb2FkIGVycm9yXCIsXG5cdFx0XHRcdFx0Y2FsbGJhY2sgPSBmdW5jdGlvbiggZXZ0ICkge1xuXHRcdFx0XHRcdFx0c2NyaXB0LnJlbW92ZSgpO1xuXHRcdFx0XHRcdFx0Y2FsbGJhY2sgPSBudWxsO1xuXHRcdFx0XHRcdFx0aWYgKCBldnQgKSB7XG5cdFx0XHRcdFx0XHRcdGNvbXBsZXRlKCBldnQudHlwZSA9PT0gXCJlcnJvclwiID8gNDA0IDogMjAwLCBldnQudHlwZSApO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH1cblx0XHRcdFx0KTtcblxuXHRcdFx0XHQvLyBVc2UgbmF0aXZlIERPTSBtYW5pcHVsYXRpb24gdG8gYXZvaWQgb3VyIGRvbU1hbmlwIEFKQVggdHJpY2tlcnlcblx0XHRcdFx0ZG9jdW1lbnQuaGVhZC5hcHBlbmRDaGlsZCggc2NyaXB0WyAwIF0gKTtcblx0XHRcdH0sXG5cdFx0XHRhYm9ydDogZnVuY3Rpb24oKSB7XG5cdFx0XHRcdGlmICggY2FsbGJhY2sgKSB7XG5cdFx0XHRcdFx0Y2FsbGJhY2soKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH07XG5cdH1cbn0gKTtcblxuXG5cblxudmFyIG9sZENhbGxiYWNrcyA9IFtdLFxuXHRyanNvbnAgPSAvKD0pXFw/KD89JnwkKXxcXD9cXD8vO1xuXG4vLyBEZWZhdWx0IGpzb25wIHNldHRpbmdzXG5qUXVlcnkuYWpheFNldHVwKCB7XG5cdGpzb25wOiBcImNhbGxiYWNrXCIsXG5cdGpzb25wQ2FsbGJhY2s6IGZ1bmN0aW9uKCkge1xuXHRcdHZhciBjYWxsYmFjayA9IG9sZENhbGxiYWNrcy5wb3AoKSB8fCAoIGpRdWVyeS5leHBhbmRvICsgXCJfXCIgKyAoIG5vbmNlKysgKSApO1xuXHRcdHRoaXNbIGNhbGxiYWNrIF0gPSB0cnVlO1xuXHRcdHJldHVybiBjYWxsYmFjaztcblx0fVxufSApO1xuXG4vLyBEZXRlY3QsIG5vcm1hbGl6ZSBvcHRpb25zIGFuZCBpbnN0YWxsIGNhbGxiYWNrcyBmb3IganNvbnAgcmVxdWVzdHNcbmpRdWVyeS5hamF4UHJlZmlsdGVyKCBcImpzb24ganNvbnBcIiwgZnVuY3Rpb24oIHMsIG9yaWdpbmFsU2V0dGluZ3MsIGpxWEhSICkge1xuXG5cdHZhciBjYWxsYmFja05hbWUsIG92ZXJ3cml0dGVuLCByZXNwb25zZUNvbnRhaW5lcixcblx0XHRqc29uUHJvcCA9IHMuanNvbnAgIT09IGZhbHNlICYmICggcmpzb25wLnRlc3QoIHMudXJsICkgP1xuXHRcdFx0XCJ1cmxcIiA6XG5cdFx0XHR0eXBlb2Ygcy5kYXRhID09PSBcInN0cmluZ1wiICYmXG5cdFx0XHRcdCggcy5jb250ZW50VHlwZSB8fCBcIlwiIClcblx0XHRcdFx0XHQuaW5kZXhPZiggXCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWRcIiApID09PSAwICYmXG5cdFx0XHRcdHJqc29ucC50ZXN0KCBzLmRhdGEgKSAmJiBcImRhdGFcIlxuXHRcdCk7XG5cblx0Ly8gSGFuZGxlIGlmZiB0aGUgZXhwZWN0ZWQgZGF0YSB0eXBlIGlzIFwianNvbnBcIiBvciB3ZSBoYXZlIGEgcGFyYW1ldGVyIHRvIHNldFxuXHRpZiAoIGpzb25Qcm9wIHx8IHMuZGF0YVR5cGVzWyAwIF0gPT09IFwianNvbnBcIiApIHtcblxuXHRcdC8vIEdldCBjYWxsYmFjayBuYW1lLCByZW1lbWJlcmluZyBwcmVleGlzdGluZyB2YWx1ZSBhc3NvY2lhdGVkIHdpdGggaXRcblx0XHRjYWxsYmFja05hbWUgPSBzLmpzb25wQ2FsbGJhY2sgPSBqUXVlcnkuaXNGdW5jdGlvbiggcy5qc29ucENhbGxiYWNrICkgP1xuXHRcdFx0cy5qc29ucENhbGxiYWNrKCkgOlxuXHRcdFx0cy5qc29ucENhbGxiYWNrO1xuXG5cdFx0Ly8gSW5zZXJ0IGNhbGxiYWNrIGludG8gdXJsIG9yIGZvcm0gZGF0YVxuXHRcdGlmICgganNvblByb3AgKSB7XG5cdFx0XHRzWyBqc29uUHJvcCBdID0gc1sganNvblByb3AgXS5yZXBsYWNlKCByanNvbnAsIFwiJDFcIiArIGNhbGxiYWNrTmFtZSApO1xuXHRcdH0gZWxzZSBpZiAoIHMuanNvbnAgIT09IGZhbHNlICkge1xuXHRcdFx0cy51cmwgKz0gKCBycXVlcnkudGVzdCggcy51cmwgKSA/IFwiJlwiIDogXCI/XCIgKSArIHMuanNvbnAgKyBcIj1cIiArIGNhbGxiYWNrTmFtZTtcblx0XHR9XG5cblx0XHQvLyBVc2UgZGF0YSBjb252ZXJ0ZXIgdG8gcmV0cmlldmUganNvbiBhZnRlciBzY3JpcHQgZXhlY3V0aW9uXG5cdFx0cy5jb252ZXJ0ZXJzWyBcInNjcmlwdCBqc29uXCIgXSA9IGZ1bmN0aW9uKCkge1xuXHRcdFx0aWYgKCAhcmVzcG9uc2VDb250YWluZXIgKSB7XG5cdFx0XHRcdGpRdWVyeS5lcnJvciggY2FsbGJhY2tOYW1lICsgXCIgd2FzIG5vdCBjYWxsZWRcIiApO1xuXHRcdFx0fVxuXHRcdFx0cmV0dXJuIHJlc3BvbnNlQ29udGFpbmVyWyAwIF07XG5cdFx0fTtcblxuXHRcdC8vIEZvcmNlIGpzb24gZGF0YVR5cGVcblx0XHRzLmRhdGFUeXBlc1sgMCBdID0gXCJqc29uXCI7XG5cblx0XHQvLyBJbnN0YWxsIGNhbGxiYWNrXG5cdFx0b3ZlcndyaXR0ZW4gPSB3aW5kb3dbIGNhbGxiYWNrTmFtZSBdO1xuXHRcdHdpbmRvd1sgY2FsbGJhY2tOYW1lIF0gPSBmdW5jdGlvbigpIHtcblx0XHRcdHJlc3BvbnNlQ29udGFpbmVyID0gYXJndW1lbnRzO1xuXHRcdH07XG5cblx0XHQvLyBDbGVhbi11cCBmdW5jdGlvbiAoZmlyZXMgYWZ0ZXIgY29udmVydGVycylcblx0XHRqcVhIUi5hbHdheXMoIGZ1bmN0aW9uKCkge1xuXG5cdFx0XHQvLyBJZiBwcmV2aW91cyB2YWx1ZSBkaWRuJ3QgZXhpc3QgLSByZW1vdmUgaXRcblx0XHRcdGlmICggb3ZlcndyaXR0ZW4gPT09IHVuZGVmaW5lZCApIHtcblx0XHRcdFx0alF1ZXJ5KCB3aW5kb3cgKS5yZW1vdmVQcm9wKCBjYWxsYmFja05hbWUgKTtcblxuXHRcdFx0Ly8gT3RoZXJ3aXNlIHJlc3RvcmUgcHJlZXhpc3RpbmcgdmFsdWVcblx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdHdpbmRvd1sgY2FsbGJhY2tOYW1lIF0gPSBvdmVyd3JpdHRlbjtcblx0XHRcdH1cblxuXHRcdFx0Ly8gU2F2ZSBiYWNrIGFzIGZyZWVcblx0XHRcdGlmICggc1sgY2FsbGJhY2tOYW1lIF0gKSB7XG5cblx0XHRcdFx0Ly8gTWFrZSBzdXJlIHRoYXQgcmUtdXNpbmcgdGhlIG9wdGlvbnMgZG9lc24ndCBzY3JldyB0aGluZ3MgYXJvdW5kXG5cdFx0XHRcdHMuanNvbnBDYWxsYmFjayA9IG9yaWdpbmFsU2V0dGluZ3MuanNvbnBDYWxsYmFjaztcblxuXHRcdFx0XHQvLyBTYXZlIHRoZSBjYWxsYmFjayBuYW1lIGZvciBmdXR1cmUgdXNlXG5cdFx0XHRcdG9sZENhbGxiYWNrcy5wdXNoKCBjYWxsYmFja05hbWUgKTtcblx0XHRcdH1cblxuXHRcdFx0Ly8gQ2FsbCBpZiBpdCB3YXMgYSBmdW5jdGlvbiBhbmQgd2UgaGF2ZSBhIHJlc3BvbnNlXG5cdFx0XHRpZiAoIHJlc3BvbnNlQ29udGFpbmVyICYmIGpRdWVyeS5pc0Z1bmN0aW9uKCBvdmVyd3JpdHRlbiApICkge1xuXHRcdFx0XHRvdmVyd3JpdHRlbiggcmVzcG9uc2VDb250YWluZXJbIDAgXSApO1xuXHRcdFx0fVxuXG5cdFx0XHRyZXNwb25zZUNvbnRhaW5lciA9IG92ZXJ3cml0dGVuID0gdW5kZWZpbmVkO1xuXHRcdH0gKTtcblxuXHRcdC8vIERlbGVnYXRlIHRvIHNjcmlwdFxuXHRcdHJldHVybiBcInNjcmlwdFwiO1xuXHR9XG59ICk7XG5cblxuXG5cbi8vIEFyZ3VtZW50IFwiZGF0YVwiIHNob3VsZCBiZSBzdHJpbmcgb2YgaHRtbFxuLy8gY29udGV4dCAob3B0aW9uYWwpOiBJZiBzcGVjaWZpZWQsIHRoZSBmcmFnbWVudCB3aWxsIGJlIGNyZWF0ZWQgaW4gdGhpcyBjb250ZXh0LFxuLy8gZGVmYXVsdHMgdG8gZG9jdW1lbnRcbi8vIGtlZXBTY3JpcHRzIChvcHRpb25hbCk6IElmIHRydWUsIHdpbGwgaW5jbHVkZSBzY3JpcHRzIHBhc3NlZCBpbiB0aGUgaHRtbCBzdHJpbmdcbmpRdWVyeS5wYXJzZUhUTUwgPSBmdW5jdGlvbiggZGF0YSwgY29udGV4dCwga2VlcFNjcmlwdHMgKSB7XG5cdGlmICggIWRhdGEgfHwgdHlwZW9mIGRhdGEgIT09IFwic3RyaW5nXCIgKSB7XG5cdFx0cmV0dXJuIG51bGw7XG5cdH1cblx0aWYgKCB0eXBlb2YgY29udGV4dCA9PT0gXCJib29sZWFuXCIgKSB7XG5cdFx0a2VlcFNjcmlwdHMgPSBjb250ZXh0O1xuXHRcdGNvbnRleHQgPSBmYWxzZTtcblx0fVxuXHRjb250ZXh0ID0gY29udGV4dCB8fCBkb2N1bWVudDtcblxuXHR2YXIgcGFyc2VkID0gcnNpbmdsZVRhZy5leGVjKCBkYXRhICksXG5cdFx0c2NyaXB0cyA9ICFrZWVwU2NyaXB0cyAmJiBbXTtcblxuXHQvLyBTaW5nbGUgdGFnXG5cdGlmICggcGFyc2VkICkge1xuXHRcdHJldHVybiBbIGNvbnRleHQuY3JlYXRlRWxlbWVudCggcGFyc2VkWyAxIF0gKSBdO1xuXHR9XG5cblx0cGFyc2VkID0gYnVpbGRGcmFnbWVudCggWyBkYXRhIF0sIGNvbnRleHQsIHNjcmlwdHMgKTtcblxuXHRpZiAoIHNjcmlwdHMgJiYgc2NyaXB0cy5sZW5ndGggKSB7XG5cdFx0alF1ZXJ5KCBzY3JpcHRzICkucmVtb3ZlKCk7XG5cdH1cblxuXHRyZXR1cm4galF1ZXJ5Lm1lcmdlKCBbXSwgcGFyc2VkLmNoaWxkTm9kZXMgKTtcbn07XG5cblxuLy8gS2VlcCBhIGNvcHkgb2YgdGhlIG9sZCBsb2FkIG1ldGhvZFxudmFyIF9sb2FkID0galF1ZXJ5LmZuLmxvYWQ7XG5cbi8qKlxuICogTG9hZCBhIHVybCBpbnRvIGEgcGFnZVxuICovXG5qUXVlcnkuZm4ubG9hZCA9IGZ1bmN0aW9uKCB1cmwsIHBhcmFtcywgY2FsbGJhY2sgKSB7XG5cdGlmICggdHlwZW9mIHVybCAhPT0gXCJzdHJpbmdcIiAmJiBfbG9hZCApIHtcblx0XHRyZXR1cm4gX2xvYWQuYXBwbHkoIHRoaXMsIGFyZ3VtZW50cyApO1xuXHR9XG5cblx0dmFyIHNlbGVjdG9yLCB0eXBlLCByZXNwb25zZSxcblx0XHRzZWxmID0gdGhpcyxcblx0XHRvZmYgPSB1cmwuaW5kZXhPZiggXCIgXCIgKTtcblxuXHRpZiAoIG9mZiA+IC0xICkge1xuXHRcdHNlbGVjdG9yID0galF1ZXJ5LnRyaW0oIHVybC5zbGljZSggb2ZmICkgKTtcblx0XHR1cmwgPSB1cmwuc2xpY2UoIDAsIG9mZiApO1xuXHR9XG5cblx0Ly8gSWYgaXQncyBhIGZ1bmN0aW9uXG5cdGlmICggalF1ZXJ5LmlzRnVuY3Rpb24oIHBhcmFtcyApICkge1xuXG5cdFx0Ly8gV2UgYXNzdW1lIHRoYXQgaXQncyB0aGUgY2FsbGJhY2tcblx0XHRjYWxsYmFjayA9IHBhcmFtcztcblx0XHRwYXJhbXMgPSB1bmRlZmluZWQ7XG5cblx0Ly8gT3RoZXJ3aXNlLCBidWlsZCBhIHBhcmFtIHN0cmluZ1xuXHR9IGVsc2UgaWYgKCBwYXJhbXMgJiYgdHlwZW9mIHBhcmFtcyA9PT0gXCJvYmplY3RcIiApIHtcblx0XHR0eXBlID0gXCJQT1NUXCI7XG5cdH1cblxuXHQvLyBJZiB3ZSBoYXZlIGVsZW1lbnRzIHRvIG1vZGlmeSwgbWFrZSB0aGUgcmVxdWVzdFxuXHRpZiAoIHNlbGYubGVuZ3RoID4gMCApIHtcblx0XHRqUXVlcnkuYWpheCgge1xuXHRcdFx0dXJsOiB1cmwsXG5cblx0XHRcdC8vIElmIFwidHlwZVwiIHZhcmlhYmxlIGlzIHVuZGVmaW5lZCwgdGhlbiBcIkdFVFwiIG1ldGhvZCB3aWxsIGJlIHVzZWQuXG5cdFx0XHQvLyBNYWtlIHZhbHVlIG9mIHRoaXMgZmllbGQgZXhwbGljaXQgc2luY2Vcblx0XHRcdC8vIHVzZXIgY2FuIG92ZXJyaWRlIGl0IHRocm91Z2ggYWpheFNldHVwIG1ldGhvZFxuXHRcdFx0dHlwZTogdHlwZSB8fCBcIkdFVFwiLFxuXHRcdFx0ZGF0YVR5cGU6IFwiaHRtbFwiLFxuXHRcdFx0ZGF0YTogcGFyYW1zXG5cdFx0fSApLmRvbmUoIGZ1bmN0aW9uKCByZXNwb25zZVRleHQgKSB7XG5cblx0XHRcdC8vIFNhdmUgcmVzcG9uc2UgZm9yIHVzZSBpbiBjb21wbGV0ZSBjYWxsYmFja1xuXHRcdFx0cmVzcG9uc2UgPSBhcmd1bWVudHM7XG5cblx0XHRcdHNlbGYuaHRtbCggc2VsZWN0b3IgP1xuXG5cdFx0XHRcdC8vIElmIGEgc2VsZWN0b3Igd2FzIHNwZWNpZmllZCwgbG9jYXRlIHRoZSByaWdodCBlbGVtZW50cyBpbiBhIGR1bW15IGRpdlxuXHRcdFx0XHQvLyBFeGNsdWRlIHNjcmlwdHMgdG8gYXZvaWQgSUUgJ1Blcm1pc3Npb24gRGVuaWVkJyBlcnJvcnNcblx0XHRcdFx0alF1ZXJ5KCBcIjxkaXY+XCIgKS5hcHBlbmQoIGpRdWVyeS5wYXJzZUhUTUwoIHJlc3BvbnNlVGV4dCApICkuZmluZCggc2VsZWN0b3IgKSA6XG5cblx0XHRcdFx0Ly8gT3RoZXJ3aXNlIHVzZSB0aGUgZnVsbCByZXN1bHRcblx0XHRcdFx0cmVzcG9uc2VUZXh0ICk7XG5cblx0XHQvLyBJZiB0aGUgcmVxdWVzdCBzdWNjZWVkcywgdGhpcyBmdW5jdGlvbiBnZXRzIFwiZGF0YVwiLCBcInN0YXR1c1wiLCBcImpxWEhSXCJcblx0XHQvLyBidXQgdGhleSBhcmUgaWdub3JlZCBiZWNhdXNlIHJlc3BvbnNlIHdhcyBzZXQgYWJvdmUuXG5cdFx0Ly8gSWYgaXQgZmFpbHMsIHRoaXMgZnVuY3Rpb24gZ2V0cyBcImpxWEhSXCIsIFwic3RhdHVzXCIsIFwiZXJyb3JcIlxuXHRcdH0gKS5hbHdheXMoIGNhbGxiYWNrICYmIGZ1bmN0aW9uKCBqcVhIUiwgc3RhdHVzICkge1xuXHRcdFx0c2VsZi5lYWNoKCBmdW5jdGlvbigpIHtcblx0XHRcdFx0Y2FsbGJhY2suYXBwbHkoIHRoaXMsIHJlc3BvbnNlIHx8IFsganFYSFIucmVzcG9uc2VUZXh0LCBzdGF0dXMsIGpxWEhSIF0gKTtcblx0XHRcdH0gKTtcblx0XHR9ICk7XG5cdH1cblxuXHRyZXR1cm4gdGhpcztcbn07XG5cblxuXG5cbi8vIEF0dGFjaCBhIGJ1bmNoIG9mIGZ1bmN0aW9ucyBmb3IgaGFuZGxpbmcgY29tbW9uIEFKQVggZXZlbnRzXG5qUXVlcnkuZWFjaCggW1xuXHRcImFqYXhTdGFydFwiLFxuXHRcImFqYXhTdG9wXCIsXG5cdFwiYWpheENvbXBsZXRlXCIsXG5cdFwiYWpheEVycm9yXCIsXG5cdFwiYWpheFN1Y2Nlc3NcIixcblx0XCJhamF4U2VuZFwiXG5dLCBmdW5jdGlvbiggaSwgdHlwZSApIHtcblx0alF1ZXJ5LmZuWyB0eXBlIF0gPSBmdW5jdGlvbiggZm4gKSB7XG5cdFx0cmV0dXJuIHRoaXMub24oIHR5cGUsIGZuICk7XG5cdH07XG59ICk7XG5cblxuXG5cbmpRdWVyeS5leHByLmZpbHRlcnMuYW5pbWF0ZWQgPSBmdW5jdGlvbiggZWxlbSApIHtcblx0cmV0dXJuIGpRdWVyeS5ncmVwKCBqUXVlcnkudGltZXJzLCBmdW5jdGlvbiggZm4gKSB7XG5cdFx0cmV0dXJuIGVsZW0gPT09IGZuLmVsZW07XG5cdH0gKS5sZW5ndGg7XG59O1xuXG5cblxuXG4vKipcbiAqIEdldHMgYSB3aW5kb3cgZnJvbSBhbiBlbGVtZW50XG4gKi9cbmZ1bmN0aW9uIGdldFdpbmRvdyggZWxlbSApIHtcblx0cmV0dXJuIGpRdWVyeS5pc1dpbmRvdyggZWxlbSApID8gZWxlbSA6IGVsZW0ubm9kZVR5cGUgPT09IDkgJiYgZWxlbS5kZWZhdWx0Vmlldztcbn1cblxualF1ZXJ5Lm9mZnNldCA9IHtcblx0c2V0T2Zmc2V0OiBmdW5jdGlvbiggZWxlbSwgb3B0aW9ucywgaSApIHtcblx0XHR2YXIgY3VyUG9zaXRpb24sIGN1ckxlZnQsIGN1ckNTU1RvcCwgY3VyVG9wLCBjdXJPZmZzZXQsIGN1ckNTU0xlZnQsIGNhbGN1bGF0ZVBvc2l0aW9uLFxuXHRcdFx0cG9zaXRpb24gPSBqUXVlcnkuY3NzKCBlbGVtLCBcInBvc2l0aW9uXCIgKSxcblx0XHRcdGN1ckVsZW0gPSBqUXVlcnkoIGVsZW0gKSxcblx0XHRcdHByb3BzID0ge307XG5cblx0XHQvLyBTZXQgcG9zaXRpb24gZmlyc3QsIGluLWNhc2UgdG9wL2xlZnQgYXJlIHNldCBldmVuIG9uIHN0YXRpYyBlbGVtXG5cdFx0aWYgKCBwb3NpdGlvbiA9PT0gXCJzdGF0aWNcIiApIHtcblx0XHRcdGVsZW0uc3R5bGUucG9zaXRpb24gPSBcInJlbGF0aXZlXCI7XG5cdFx0fVxuXG5cdFx0Y3VyT2Zmc2V0ID0gY3VyRWxlbS5vZmZzZXQoKTtcblx0XHRjdXJDU1NUb3AgPSBqUXVlcnkuY3NzKCBlbGVtLCBcInRvcFwiICk7XG5cdFx0Y3VyQ1NTTGVmdCA9IGpRdWVyeS5jc3MoIGVsZW0sIFwibGVmdFwiICk7XG5cdFx0Y2FsY3VsYXRlUG9zaXRpb24gPSAoIHBvc2l0aW9uID09PSBcImFic29sdXRlXCIgfHwgcG9zaXRpb24gPT09IFwiZml4ZWRcIiApICYmXG5cdFx0XHQoIGN1ckNTU1RvcCArIGN1ckNTU0xlZnQgKS5pbmRleE9mKCBcImF1dG9cIiApID4gLTE7XG5cblx0XHQvLyBOZWVkIHRvIGJlIGFibGUgdG8gY2FsY3VsYXRlIHBvc2l0aW9uIGlmIGVpdGhlclxuXHRcdC8vIHRvcCBvciBsZWZ0IGlzIGF1dG8gYW5kIHBvc2l0aW9uIGlzIGVpdGhlciBhYnNvbHV0ZSBvciBmaXhlZFxuXHRcdGlmICggY2FsY3VsYXRlUG9zaXRpb24gKSB7XG5cdFx0XHRjdXJQb3NpdGlvbiA9IGN1ckVsZW0ucG9zaXRpb24oKTtcblx0XHRcdGN1clRvcCA9IGN1clBvc2l0aW9uLnRvcDtcblx0XHRcdGN1ckxlZnQgPSBjdXJQb3NpdGlvbi5sZWZ0O1xuXG5cdFx0fSBlbHNlIHtcblx0XHRcdGN1clRvcCA9IHBhcnNlRmxvYXQoIGN1ckNTU1RvcCApIHx8IDA7XG5cdFx0XHRjdXJMZWZ0ID0gcGFyc2VGbG9hdCggY3VyQ1NTTGVmdCApIHx8IDA7XG5cdFx0fVxuXG5cdFx0aWYgKCBqUXVlcnkuaXNGdW5jdGlvbiggb3B0aW9ucyApICkge1xuXG5cdFx0XHQvLyBVc2UgalF1ZXJ5LmV4dGVuZCBoZXJlIHRvIGFsbG93IG1vZGlmaWNhdGlvbiBvZiBjb29yZGluYXRlcyBhcmd1bWVudCAoZ2gtMTg0OClcblx0XHRcdG9wdGlvbnMgPSBvcHRpb25zLmNhbGwoIGVsZW0sIGksIGpRdWVyeS5leHRlbmQoIHt9LCBjdXJPZmZzZXQgKSApO1xuXHRcdH1cblxuXHRcdGlmICggb3B0aW9ucy50b3AgIT0gbnVsbCApIHtcblx0XHRcdHByb3BzLnRvcCA9ICggb3B0aW9ucy50b3AgLSBjdXJPZmZzZXQudG9wICkgKyBjdXJUb3A7XG5cdFx0fVxuXHRcdGlmICggb3B0aW9ucy5sZWZ0ICE9IG51bGwgKSB7XG5cdFx0XHRwcm9wcy5sZWZ0ID0gKCBvcHRpb25zLmxlZnQgLSBjdXJPZmZzZXQubGVmdCApICsgY3VyTGVmdDtcblx0XHR9XG5cblx0XHRpZiAoIFwidXNpbmdcIiBpbiBvcHRpb25zICkge1xuXHRcdFx0b3B0aW9ucy51c2luZy5jYWxsKCBlbGVtLCBwcm9wcyApO1xuXG5cdFx0fSBlbHNlIHtcblx0XHRcdGN1ckVsZW0uY3NzKCBwcm9wcyApO1xuXHRcdH1cblx0fVxufTtcblxualF1ZXJ5LmZuLmV4dGVuZCgge1xuXHRvZmZzZXQ6IGZ1bmN0aW9uKCBvcHRpb25zICkge1xuXHRcdGlmICggYXJndW1lbnRzLmxlbmd0aCApIHtcblx0XHRcdHJldHVybiBvcHRpb25zID09PSB1bmRlZmluZWQgP1xuXHRcdFx0XHR0aGlzIDpcblx0XHRcdFx0dGhpcy5lYWNoKCBmdW5jdGlvbiggaSApIHtcblx0XHRcdFx0XHRqUXVlcnkub2Zmc2V0LnNldE9mZnNldCggdGhpcywgb3B0aW9ucywgaSApO1xuXHRcdFx0XHR9ICk7XG5cdFx0fVxuXG5cdFx0dmFyIGRvY0VsZW0sIHdpbixcblx0XHRcdGVsZW0gPSB0aGlzWyAwIF0sXG5cdFx0XHRib3ggPSB7IHRvcDogMCwgbGVmdDogMCB9LFxuXHRcdFx0ZG9jID0gZWxlbSAmJiBlbGVtLm93bmVyRG9jdW1lbnQ7XG5cblx0XHRpZiAoICFkb2MgKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0ZG9jRWxlbSA9IGRvYy5kb2N1bWVudEVsZW1lbnQ7XG5cblx0XHQvLyBNYWtlIHN1cmUgaXQncyBub3QgYSBkaXNjb25uZWN0ZWQgRE9NIG5vZGVcblx0XHRpZiAoICFqUXVlcnkuY29udGFpbnMoIGRvY0VsZW0sIGVsZW0gKSApIHtcblx0XHRcdHJldHVybiBib3g7XG5cdFx0fVxuXG5cdFx0Ym94ID0gZWxlbS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcblx0XHR3aW4gPSBnZXRXaW5kb3coIGRvYyApO1xuXHRcdHJldHVybiB7XG5cdFx0XHR0b3A6IGJveC50b3AgKyB3aW4ucGFnZVlPZmZzZXQgLSBkb2NFbGVtLmNsaWVudFRvcCxcblx0XHRcdGxlZnQ6IGJveC5sZWZ0ICsgd2luLnBhZ2VYT2Zmc2V0IC0gZG9jRWxlbS5jbGllbnRMZWZ0XG5cdFx0fTtcblx0fSxcblxuXHRwb3NpdGlvbjogZnVuY3Rpb24oKSB7XG5cdFx0aWYgKCAhdGhpc1sgMCBdICkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdHZhciBvZmZzZXRQYXJlbnQsIG9mZnNldCxcblx0XHRcdGVsZW0gPSB0aGlzWyAwIF0sXG5cdFx0XHRwYXJlbnRPZmZzZXQgPSB7IHRvcDogMCwgbGVmdDogMCB9O1xuXG5cdFx0Ly8gRml4ZWQgZWxlbWVudHMgYXJlIG9mZnNldCBmcm9tIHdpbmRvdyAocGFyZW50T2Zmc2V0ID0ge3RvcDowLCBsZWZ0OiAwfSxcblx0XHQvLyBiZWNhdXNlIGl0IGlzIGl0cyBvbmx5IG9mZnNldCBwYXJlbnRcblx0XHRpZiAoIGpRdWVyeS5jc3MoIGVsZW0sIFwicG9zaXRpb25cIiApID09PSBcImZpeGVkXCIgKSB7XG5cblx0XHRcdC8vIEFzc3VtZSBnZXRCb3VuZGluZ0NsaWVudFJlY3QgaXMgdGhlcmUgd2hlbiBjb21wdXRlZCBwb3NpdGlvbiBpcyBmaXhlZFxuXHRcdFx0b2Zmc2V0ID0gZWxlbS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKTtcblxuXHRcdH0gZWxzZSB7XG5cblx0XHRcdC8vIEdldCAqcmVhbCogb2Zmc2V0UGFyZW50XG5cdFx0XHRvZmZzZXRQYXJlbnQgPSB0aGlzLm9mZnNldFBhcmVudCgpO1xuXG5cdFx0XHQvLyBHZXQgY29ycmVjdCBvZmZzZXRzXG5cdFx0XHRvZmZzZXQgPSB0aGlzLm9mZnNldCgpO1xuXHRcdFx0aWYgKCAhalF1ZXJ5Lm5vZGVOYW1lKCBvZmZzZXRQYXJlbnRbIDAgXSwgXCJodG1sXCIgKSApIHtcblx0XHRcdFx0cGFyZW50T2Zmc2V0ID0gb2Zmc2V0UGFyZW50Lm9mZnNldCgpO1xuXHRcdFx0fVxuXG5cdFx0XHQvLyBBZGQgb2Zmc2V0UGFyZW50IGJvcmRlcnNcblx0XHRcdHBhcmVudE9mZnNldC50b3AgKz0galF1ZXJ5LmNzcyggb2Zmc2V0UGFyZW50WyAwIF0sIFwiYm9yZGVyVG9wV2lkdGhcIiwgdHJ1ZSApO1xuXHRcdFx0cGFyZW50T2Zmc2V0LmxlZnQgKz0galF1ZXJ5LmNzcyggb2Zmc2V0UGFyZW50WyAwIF0sIFwiYm9yZGVyTGVmdFdpZHRoXCIsIHRydWUgKTtcblx0XHR9XG5cblx0XHQvLyBTdWJ0cmFjdCBwYXJlbnQgb2Zmc2V0cyBhbmQgZWxlbWVudCBtYXJnaW5zXG5cdFx0cmV0dXJuIHtcblx0XHRcdHRvcDogb2Zmc2V0LnRvcCAtIHBhcmVudE9mZnNldC50b3AgLSBqUXVlcnkuY3NzKCBlbGVtLCBcIm1hcmdpblRvcFwiLCB0cnVlICksXG5cdFx0XHRsZWZ0OiBvZmZzZXQubGVmdCAtIHBhcmVudE9mZnNldC5sZWZ0IC0galF1ZXJ5LmNzcyggZWxlbSwgXCJtYXJnaW5MZWZ0XCIsIHRydWUgKVxuXHRcdH07XG5cdH0sXG5cblx0Ly8gVGhpcyBtZXRob2Qgd2lsbCByZXR1cm4gZG9jdW1lbnRFbGVtZW50IGluIHRoZSBmb2xsb3dpbmcgY2FzZXM6XG5cdC8vIDEpIEZvciB0aGUgZWxlbWVudCBpbnNpZGUgdGhlIGlmcmFtZSB3aXRob3V0IG9mZnNldFBhcmVudCwgdGhpcyBtZXRob2Qgd2lsbCByZXR1cm5cblx0Ly8gICAgZG9jdW1lbnRFbGVtZW50IG9mIHRoZSBwYXJlbnQgd2luZG93XG5cdC8vIDIpIEZvciB0aGUgaGlkZGVuIG9yIGRldGFjaGVkIGVsZW1lbnRcblx0Ly8gMykgRm9yIGJvZHkgb3IgaHRtbCBlbGVtZW50LCBpLmUuIGluIGNhc2Ugb2YgdGhlIGh0bWwgbm9kZSAtIGl0IHdpbGwgcmV0dXJuIGl0c2VsZlxuXHQvL1xuXHQvLyBidXQgdGhvc2UgZXhjZXB0aW9ucyB3ZXJlIG5ldmVyIHByZXNlbnRlZCBhcyBhIHJlYWwgbGlmZSB1c2UtY2FzZXNcblx0Ly8gYW5kIG1pZ2h0IGJlIGNvbnNpZGVyZWQgYXMgbW9yZSBwcmVmZXJhYmxlIHJlc3VsdHMuXG5cdC8vXG5cdC8vIFRoaXMgbG9naWMsIGhvd2V2ZXIsIGlzIG5vdCBndWFyYW50ZWVkIGFuZCBjYW4gY2hhbmdlIGF0IGFueSBwb2ludCBpbiB0aGUgZnV0dXJlXG5cdG9mZnNldFBhcmVudDogZnVuY3Rpb24oKSB7XG5cdFx0cmV0dXJuIHRoaXMubWFwKCBmdW5jdGlvbigpIHtcblx0XHRcdHZhciBvZmZzZXRQYXJlbnQgPSB0aGlzLm9mZnNldFBhcmVudDtcblxuXHRcdFx0d2hpbGUgKCBvZmZzZXRQYXJlbnQgJiYgalF1ZXJ5LmNzcyggb2Zmc2V0UGFyZW50LCBcInBvc2l0aW9uXCIgKSA9PT0gXCJzdGF0aWNcIiApIHtcblx0XHRcdFx0b2Zmc2V0UGFyZW50ID0gb2Zmc2V0UGFyZW50Lm9mZnNldFBhcmVudDtcblx0XHRcdH1cblxuXHRcdFx0cmV0dXJuIG9mZnNldFBhcmVudCB8fCBkb2N1bWVudEVsZW1lbnQ7XG5cdFx0fSApO1xuXHR9XG59ICk7XG5cbi8vIENyZWF0ZSBzY3JvbGxMZWZ0IGFuZCBzY3JvbGxUb3AgbWV0aG9kc1xualF1ZXJ5LmVhY2goIHsgc2Nyb2xsTGVmdDogXCJwYWdlWE9mZnNldFwiLCBzY3JvbGxUb3A6IFwicGFnZVlPZmZzZXRcIiB9LCBmdW5jdGlvbiggbWV0aG9kLCBwcm9wICkge1xuXHR2YXIgdG9wID0gXCJwYWdlWU9mZnNldFwiID09PSBwcm9wO1xuXG5cdGpRdWVyeS5mblsgbWV0aG9kIF0gPSBmdW5jdGlvbiggdmFsICkge1xuXHRcdHJldHVybiBhY2Nlc3MoIHRoaXMsIGZ1bmN0aW9uKCBlbGVtLCBtZXRob2QsIHZhbCApIHtcblx0XHRcdHZhciB3aW4gPSBnZXRXaW5kb3coIGVsZW0gKTtcblxuXHRcdFx0aWYgKCB2YWwgPT09IHVuZGVmaW5lZCApIHtcblx0XHRcdFx0cmV0dXJuIHdpbiA/IHdpblsgcHJvcCBdIDogZWxlbVsgbWV0aG9kIF07XG5cdFx0XHR9XG5cblx0XHRcdGlmICggd2luICkge1xuXHRcdFx0XHR3aW4uc2Nyb2xsVG8oXG5cdFx0XHRcdFx0IXRvcCA/IHZhbCA6IHdpbi5wYWdlWE9mZnNldCxcblx0XHRcdFx0XHR0b3AgPyB2YWwgOiB3aW4ucGFnZVlPZmZzZXRcblx0XHRcdFx0KTtcblxuXHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0ZWxlbVsgbWV0aG9kIF0gPSB2YWw7XG5cdFx0XHR9XG5cdFx0fSwgbWV0aG9kLCB2YWwsIGFyZ3VtZW50cy5sZW5ndGggKTtcblx0fTtcbn0gKTtcblxuLy8gU3VwcG9ydDogU2FmYXJpPDctOCssIENocm9tZTwzNy00NCtcbi8vIEFkZCB0aGUgdG9wL2xlZnQgY3NzSG9va3MgdXNpbmcgalF1ZXJ5LmZuLnBvc2l0aW9uXG4vLyBXZWJraXQgYnVnOiBodHRwczovL2J1Z3Mud2Via2l0Lm9yZy9zaG93X2J1Zy5jZ2k/aWQ9MjkwODRcbi8vIEJsaW5rIGJ1ZzogaHR0cHM6Ly9jb2RlLmdvb2dsZS5jb20vcC9jaHJvbWl1bS9pc3N1ZXMvZGV0YWlsP2lkPTIyOTI4MFxuLy8gZ2V0Q29tcHV0ZWRTdHlsZSByZXR1cm5zIHBlcmNlbnQgd2hlbiBzcGVjaWZpZWQgZm9yIHRvcC9sZWZ0L2JvdHRvbS9yaWdodDtcbi8vIHJhdGhlciB0aGFuIG1ha2UgdGhlIGNzcyBtb2R1bGUgZGVwZW5kIG9uIHRoZSBvZmZzZXQgbW9kdWxlLCBqdXN0IGNoZWNrIGZvciBpdCBoZXJlXG5qUXVlcnkuZWFjaCggWyBcInRvcFwiLCBcImxlZnRcIiBdLCBmdW5jdGlvbiggaSwgcHJvcCApIHtcblx0alF1ZXJ5LmNzc0hvb2tzWyBwcm9wIF0gPSBhZGRHZXRIb29rSWYoIHN1cHBvcnQucGl4ZWxQb3NpdGlvbixcblx0XHRmdW5jdGlvbiggZWxlbSwgY29tcHV0ZWQgKSB7XG5cdFx0XHRpZiAoIGNvbXB1dGVkICkge1xuXHRcdFx0XHRjb21wdXRlZCA9IGN1ckNTUyggZWxlbSwgcHJvcCApO1xuXG5cdFx0XHRcdC8vIElmIGN1ckNTUyByZXR1cm5zIHBlcmNlbnRhZ2UsIGZhbGxiYWNrIHRvIG9mZnNldFxuXHRcdFx0XHRyZXR1cm4gcm51bW5vbnB4LnRlc3QoIGNvbXB1dGVkICkgP1xuXHRcdFx0XHRcdGpRdWVyeSggZWxlbSApLnBvc2l0aW9uKClbIHByb3AgXSArIFwicHhcIiA6XG5cdFx0XHRcdFx0Y29tcHV0ZWQ7XG5cdFx0XHR9XG5cdFx0fVxuXHQpO1xufSApO1xuXG5cbi8vIENyZWF0ZSBpbm5lckhlaWdodCwgaW5uZXJXaWR0aCwgaGVpZ2h0LCB3aWR0aCwgb3V0ZXJIZWlnaHQgYW5kIG91dGVyV2lkdGggbWV0aG9kc1xualF1ZXJ5LmVhY2goIHsgSGVpZ2h0OiBcImhlaWdodFwiLCBXaWR0aDogXCJ3aWR0aFwiIH0sIGZ1bmN0aW9uKCBuYW1lLCB0eXBlICkge1xuXHRqUXVlcnkuZWFjaCggeyBwYWRkaW5nOiBcImlubmVyXCIgKyBuYW1lLCBjb250ZW50OiB0eXBlLCBcIlwiOiBcIm91dGVyXCIgKyBuYW1lIH0sXG5cdFx0ZnVuY3Rpb24oIGRlZmF1bHRFeHRyYSwgZnVuY05hbWUgKSB7XG5cblx0XHQvLyBNYXJnaW4gaXMgb25seSBmb3Igb3V0ZXJIZWlnaHQsIG91dGVyV2lkdGhcblx0XHRqUXVlcnkuZm5bIGZ1bmNOYW1lIF0gPSBmdW5jdGlvbiggbWFyZ2luLCB2YWx1ZSApIHtcblx0XHRcdHZhciBjaGFpbmFibGUgPSBhcmd1bWVudHMubGVuZ3RoICYmICggZGVmYXVsdEV4dHJhIHx8IHR5cGVvZiBtYXJnaW4gIT09IFwiYm9vbGVhblwiICksXG5cdFx0XHRcdGV4dHJhID0gZGVmYXVsdEV4dHJhIHx8ICggbWFyZ2luID09PSB0cnVlIHx8IHZhbHVlID09PSB0cnVlID8gXCJtYXJnaW5cIiA6IFwiYm9yZGVyXCIgKTtcblxuXHRcdFx0cmV0dXJuIGFjY2VzcyggdGhpcywgZnVuY3Rpb24oIGVsZW0sIHR5cGUsIHZhbHVlICkge1xuXHRcdFx0XHR2YXIgZG9jO1xuXG5cdFx0XHRcdGlmICggalF1ZXJ5LmlzV2luZG93KCBlbGVtICkgKSB7XG5cblx0XHRcdFx0XHQvLyBBcyBvZiA1LzgvMjAxMiB0aGlzIHdpbGwgeWllbGQgaW5jb3JyZWN0IHJlc3VsdHMgZm9yIE1vYmlsZSBTYWZhcmksIGJ1dCB0aGVyZVxuXHRcdFx0XHRcdC8vIGlzbid0IGEgd2hvbGUgbG90IHdlIGNhbiBkby4gU2VlIHB1bGwgcmVxdWVzdCBhdCB0aGlzIFVSTCBmb3IgZGlzY3Vzc2lvbjpcblx0XHRcdFx0XHQvLyBodHRwczovL2dpdGh1Yi5jb20vanF1ZXJ5L2pxdWVyeS9wdWxsLzc2NFxuXHRcdFx0XHRcdHJldHVybiBlbGVtLmRvY3VtZW50LmRvY3VtZW50RWxlbWVudFsgXCJjbGllbnRcIiArIG5hbWUgXTtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdC8vIEdldCBkb2N1bWVudCB3aWR0aCBvciBoZWlnaHRcblx0XHRcdFx0aWYgKCBlbGVtLm5vZGVUeXBlID09PSA5ICkge1xuXHRcdFx0XHRcdGRvYyA9IGVsZW0uZG9jdW1lbnRFbGVtZW50O1xuXG5cdFx0XHRcdFx0Ly8gRWl0aGVyIHNjcm9sbFtXaWR0aC9IZWlnaHRdIG9yIG9mZnNldFtXaWR0aC9IZWlnaHRdIG9yIGNsaWVudFtXaWR0aC9IZWlnaHRdLFxuXHRcdFx0XHRcdC8vIHdoaWNoZXZlciBpcyBncmVhdGVzdFxuXHRcdFx0XHRcdHJldHVybiBNYXRoLm1heChcblx0XHRcdFx0XHRcdGVsZW0uYm9keVsgXCJzY3JvbGxcIiArIG5hbWUgXSwgZG9jWyBcInNjcm9sbFwiICsgbmFtZSBdLFxuXHRcdFx0XHRcdFx0ZWxlbS5ib2R5WyBcIm9mZnNldFwiICsgbmFtZSBdLCBkb2NbIFwib2Zmc2V0XCIgKyBuYW1lIF0sXG5cdFx0XHRcdFx0XHRkb2NbIFwiY2xpZW50XCIgKyBuYW1lIF1cblx0XHRcdFx0XHQpO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0cmV0dXJuIHZhbHVlID09PSB1bmRlZmluZWQgP1xuXG5cdFx0XHRcdFx0Ly8gR2V0IHdpZHRoIG9yIGhlaWdodCBvbiB0aGUgZWxlbWVudCwgcmVxdWVzdGluZyBidXQgbm90IGZvcmNpbmcgcGFyc2VGbG9hdFxuXHRcdFx0XHRcdGpRdWVyeS5jc3MoIGVsZW0sIHR5cGUsIGV4dHJhICkgOlxuXG5cdFx0XHRcdFx0Ly8gU2V0IHdpZHRoIG9yIGhlaWdodCBvbiB0aGUgZWxlbWVudFxuXHRcdFx0XHRcdGpRdWVyeS5zdHlsZSggZWxlbSwgdHlwZSwgdmFsdWUsIGV4dHJhICk7XG5cdFx0XHR9LCB0eXBlLCBjaGFpbmFibGUgPyBtYXJnaW4gOiB1bmRlZmluZWQsIGNoYWluYWJsZSwgbnVsbCApO1xuXHRcdH07XG5cdH0gKTtcbn0gKTtcblxuXG5qUXVlcnkuZm4uZXh0ZW5kKCB7XG5cblx0YmluZDogZnVuY3Rpb24oIHR5cGVzLCBkYXRhLCBmbiApIHtcblx0XHRyZXR1cm4gdGhpcy5vbiggdHlwZXMsIG51bGwsIGRhdGEsIGZuICk7XG5cdH0sXG5cdHVuYmluZDogZnVuY3Rpb24oIHR5cGVzLCBmbiApIHtcblx0XHRyZXR1cm4gdGhpcy5vZmYoIHR5cGVzLCBudWxsLCBmbiApO1xuXHR9LFxuXG5cdGRlbGVnYXRlOiBmdW5jdGlvbiggc2VsZWN0b3IsIHR5cGVzLCBkYXRhLCBmbiApIHtcblx0XHRyZXR1cm4gdGhpcy5vbiggdHlwZXMsIHNlbGVjdG9yLCBkYXRhLCBmbiApO1xuXHR9LFxuXHR1bmRlbGVnYXRlOiBmdW5jdGlvbiggc2VsZWN0b3IsIHR5cGVzLCBmbiApIHtcblxuXHRcdC8vICggbmFtZXNwYWNlICkgb3IgKCBzZWxlY3RvciwgdHlwZXMgWywgZm5dIClcblx0XHRyZXR1cm4gYXJndW1lbnRzLmxlbmd0aCA9PT0gMSA/XG5cdFx0XHR0aGlzLm9mZiggc2VsZWN0b3IsIFwiKipcIiApIDpcblx0XHRcdHRoaXMub2ZmKCB0eXBlcywgc2VsZWN0b3IgfHwgXCIqKlwiLCBmbiApO1xuXHR9LFxuXHRzaXplOiBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4gdGhpcy5sZW5ndGg7XG5cdH1cbn0gKTtcblxualF1ZXJ5LmZuLmFuZFNlbGYgPSBqUXVlcnkuZm4uYWRkQmFjaztcblxuXG5cblxuLy8gUmVnaXN0ZXIgYXMgYSBuYW1lZCBBTUQgbW9kdWxlLCBzaW5jZSBqUXVlcnkgY2FuIGJlIGNvbmNhdGVuYXRlZCB3aXRoIG90aGVyXG4vLyBmaWxlcyB0aGF0IG1heSB1c2UgZGVmaW5lLCBidXQgbm90IHZpYSBhIHByb3BlciBjb25jYXRlbmF0aW9uIHNjcmlwdCB0aGF0XG4vLyB1bmRlcnN0YW5kcyBhbm9ueW1vdXMgQU1EIG1vZHVsZXMuIEEgbmFtZWQgQU1EIGlzIHNhZmVzdCBhbmQgbW9zdCByb2J1c3Rcbi8vIHdheSB0byByZWdpc3Rlci4gTG93ZXJjYXNlIGpxdWVyeSBpcyB1c2VkIGJlY2F1c2UgQU1EIG1vZHVsZSBuYW1lcyBhcmVcbi8vIGRlcml2ZWQgZnJvbSBmaWxlIG5hbWVzLCBhbmQgalF1ZXJ5IGlzIG5vcm1hbGx5IGRlbGl2ZXJlZCBpbiBhIGxvd2VyY2FzZVxuLy8gZmlsZSBuYW1lLiBEbyB0aGlzIGFmdGVyIGNyZWF0aW5nIHRoZSBnbG9iYWwgc28gdGhhdCBpZiBhbiBBTUQgbW9kdWxlIHdhbnRzXG4vLyB0byBjYWxsIG5vQ29uZmxpY3QgdG8gaGlkZSB0aGlzIHZlcnNpb24gb2YgalF1ZXJ5LCBpdCB3aWxsIHdvcmsuXG5cbi8vIE5vdGUgdGhhdCBmb3IgbWF4aW11bSBwb3J0YWJpbGl0eSwgbGlicmFyaWVzIHRoYXQgYXJlIG5vdCBqUXVlcnkgc2hvdWxkXG4vLyBkZWNsYXJlIHRoZW1zZWx2ZXMgYXMgYW5vbnltb3VzIG1vZHVsZXMsIGFuZCBhdm9pZCBzZXR0aW5nIGEgZ2xvYmFsIGlmIGFuXG4vLyBBTUQgbG9hZGVyIGlzIHByZXNlbnQuIGpRdWVyeSBpcyBhIHNwZWNpYWwgY2FzZS4gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZVxuLy8gaHR0cHM6Ly9naXRodWIuY29tL2pyYnVya2UvcmVxdWlyZWpzL3dpa2kvVXBkYXRpbmctZXhpc3RpbmctbGlicmFyaWVzI3dpa2ktYW5vblxuXG5pZiAoIHR5cGVvZiBkZWZpbmUgPT09IFwiZnVuY3Rpb25cIiAmJiBkZWZpbmUuYW1kICkge1xuXHRkZWZpbmUoIFwianF1ZXJ5XCIsIFtdLCBmdW5jdGlvbigpIHtcblx0XHRyZXR1cm4galF1ZXJ5O1xuXHR9ICk7XG59XG5cblxuXG52YXJcblxuXHQvLyBNYXAgb3ZlciBqUXVlcnkgaW4gY2FzZSBvZiBvdmVyd3JpdGVcblx0X2pRdWVyeSA9IHdpbmRvdy5qUXVlcnksXG5cblx0Ly8gTWFwIG92ZXIgdGhlICQgaW4gY2FzZSBvZiBvdmVyd3JpdGVcblx0XyQgPSB3aW5kb3cuJDtcblxualF1ZXJ5Lm5vQ29uZmxpY3QgPSBmdW5jdGlvbiggZGVlcCApIHtcblx0aWYgKCB3aW5kb3cuJCA9PT0galF1ZXJ5ICkge1xuXHRcdHdpbmRvdy4kID0gXyQ7XG5cdH1cblxuXHRpZiAoIGRlZXAgJiYgd2luZG93LmpRdWVyeSA9PT0galF1ZXJ5ICkge1xuXHRcdHdpbmRvdy5qUXVlcnkgPSBfalF1ZXJ5O1xuXHR9XG5cblx0cmV0dXJuIGpRdWVyeTtcbn07XG5cbi8vIEV4cG9zZSBqUXVlcnkgYW5kICQgaWRlbnRpZmllcnMsIGV2ZW4gaW4gQU1EXG4vLyAoIzcxMDIjY29tbWVudDoxMCwgaHR0cHM6Ly9naXRodWIuY29tL2pxdWVyeS9qcXVlcnkvcHVsbC81NTcpXG4vLyBhbmQgQ29tbW9uSlMgZm9yIGJyb3dzZXIgZW11bGF0b3JzICgjMTM1NjYpXG5pZiAoICFub0dsb2JhbCApIHtcblx0d2luZG93LmpRdWVyeSA9IHdpbmRvdy4kID0galF1ZXJ5O1xufVxuXG5yZXR1cm4galF1ZXJ5O1xufSkpO1xuIiwiLyohXG4gKiBNYXNvbnJ5IHY0LjIuMlxuICogQ2FzY2FkaW5nIGdyaWQgbGF5b3V0IGxpYnJhcnlcbiAqIGh0dHBzOi8vbWFzb25yeS5kZXNhbmRyby5jb21cbiAqIE1JVCBMaWNlbnNlXG4gKiBieSBEYXZpZCBEZVNhbmRyb1xuICovXG5cbiggZnVuY3Rpb24oIHdpbmRvdywgZmFjdG9yeSApIHtcbiAgLy8gdW5pdmVyc2FsIG1vZHVsZSBkZWZpbml0aW9uXG4gIC8qIGpzaGludCBzdHJpY3Q6IGZhbHNlICovIC8qZ2xvYmFscyBkZWZpbmUsIG1vZHVsZSwgcmVxdWlyZSAqL1xuICBpZiAoIHR5cGVvZiBkZWZpbmUgPT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kICkge1xuICAgIC8vIEFNRFxuICAgIGRlZmluZSggW1xuICAgICAgICAnb3V0bGF5ZXIvb3V0bGF5ZXInLFxuICAgICAgICAnZ2V0LXNpemUvZ2V0LXNpemUnXG4gICAgICBdLFxuICAgICAgZmFjdG9yeSApO1xuICB9IGVsc2UgaWYgKCB0eXBlb2YgbW9kdWxlID09ICdvYmplY3QnICYmIG1vZHVsZS5leHBvcnRzICkge1xuICAgIC8vIENvbW1vbkpTXG4gICAgbW9kdWxlLmV4cG9ydHMgPSBmYWN0b3J5KFxuICAgICAgcmVxdWlyZSgnb3V0bGF5ZXInKSxcbiAgICAgIHJlcXVpcmUoJ2dldC1zaXplJylcbiAgICApO1xuICB9IGVsc2Uge1xuICAgIC8vIGJyb3dzZXIgZ2xvYmFsXG4gICAgd2luZG93Lk1hc29ucnkgPSBmYWN0b3J5KFxuICAgICAgd2luZG93Lk91dGxheWVyLFxuICAgICAgd2luZG93LmdldFNpemVcbiAgICApO1xuICB9XG5cbn0oIHdpbmRvdywgZnVuY3Rpb24gZmFjdG9yeSggT3V0bGF5ZXIsIGdldFNpemUgKSB7XG5cbid1c2Ugc3RyaWN0JztcblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gbWFzb25yeURlZmluaXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gLy9cblxuICAvLyBjcmVhdGUgYW4gT3V0bGF5ZXIgbGF5b3V0IGNsYXNzXG4gIHZhciBNYXNvbnJ5ID0gT3V0bGF5ZXIuY3JlYXRlKCdtYXNvbnJ5Jyk7XG4gIC8vIGlzRml0V2lkdGggLT4gZml0V2lkdGhcbiAgTWFzb25yeS5jb21wYXRPcHRpb25zLmZpdFdpZHRoID0gJ2lzRml0V2lkdGgnO1xuXG4gIHZhciBwcm90byA9IE1hc29ucnkucHJvdG90eXBlO1xuXG4gIHByb3RvLl9yZXNldExheW91dCA9IGZ1bmN0aW9uKCkge1xuICAgIHRoaXMuZ2V0U2l6ZSgpO1xuICAgIHRoaXMuX2dldE1lYXN1cmVtZW50KCAnY29sdW1uV2lkdGgnLCAnb3V0ZXJXaWR0aCcgKTtcbiAgICB0aGlzLl9nZXRNZWFzdXJlbWVudCggJ2d1dHRlcicsICdvdXRlcldpZHRoJyApO1xuICAgIHRoaXMubWVhc3VyZUNvbHVtbnMoKTtcblxuICAgIC8vIHJlc2V0IGNvbHVtbiBZXG4gICAgdGhpcy5jb2xZcyA9IFtdO1xuICAgIGZvciAoIHZhciBpPTA7IGkgPCB0aGlzLmNvbHM7IGkrKyApIHtcbiAgICAgIHRoaXMuY29sWXMucHVzaCggMCApO1xuICAgIH1cblxuICAgIHRoaXMubWF4WSA9IDA7XG4gICAgdGhpcy5ob3Jpem9udGFsQ29sSW5kZXggPSAwO1xuICB9O1xuXG4gIHByb3RvLm1lYXN1cmVDb2x1bW5zID0gZnVuY3Rpb24oKSB7XG4gICAgdGhpcy5nZXRDb250YWluZXJXaWR0aCgpO1xuICAgIC8vIGlmIGNvbHVtbldpZHRoIGlzIDAsIGRlZmF1bHQgdG8gb3V0ZXJXaWR0aCBvZiBmaXJzdCBpdGVtXG4gICAgaWYgKCAhdGhpcy5jb2x1bW5XaWR0aCApIHtcbiAgICAgIHZhciBmaXJzdEl0ZW0gPSB0aGlzLml0ZW1zWzBdO1xuICAgICAgdmFyIGZpcnN0SXRlbUVsZW0gPSBmaXJzdEl0ZW0gJiYgZmlyc3RJdGVtLmVsZW1lbnQ7XG4gICAgICAvLyBjb2x1bW5XaWR0aCBmYWxsIGJhY2sgdG8gaXRlbSBvZiBmaXJzdCBlbGVtZW50XG4gICAgICB0aGlzLmNvbHVtbldpZHRoID0gZmlyc3RJdGVtRWxlbSAmJiBnZXRTaXplKCBmaXJzdEl0ZW1FbGVtICkub3V0ZXJXaWR0aCB8fFxuICAgICAgICAvLyBpZiBmaXJzdCBlbGVtIGhhcyBubyB3aWR0aCwgZGVmYXVsdCB0byBzaXplIG9mIGNvbnRhaW5lclxuICAgICAgICB0aGlzLmNvbnRhaW5lcldpZHRoO1xuICAgIH1cblxuICAgIHZhciBjb2x1bW5XaWR0aCA9IHRoaXMuY29sdW1uV2lkdGggKz0gdGhpcy5ndXR0ZXI7XG5cbiAgICAvLyBjYWxjdWxhdGUgY29sdW1uc1xuICAgIHZhciBjb250YWluZXJXaWR0aCA9IHRoaXMuY29udGFpbmVyV2lkdGggKyB0aGlzLmd1dHRlcjtcbiAgICB2YXIgY29scyA9IGNvbnRhaW5lcldpZHRoIC8gY29sdW1uV2lkdGg7XG4gICAgLy8gZml4IHJvdW5kaW5nIGVycm9ycywgdHlwaWNhbGx5IHdpdGggZ3V0dGVyc1xuICAgIHZhciBleGNlc3MgPSBjb2x1bW5XaWR0aCAtIGNvbnRhaW5lcldpZHRoICUgY29sdW1uV2lkdGg7XG4gICAgLy8gaWYgb3ZlcnNob290IGlzIGxlc3MgdGhhbiBhIHBpeGVsLCByb3VuZCB1cCwgb3RoZXJ3aXNlIGZsb29yIGl0XG4gICAgdmFyIG1hdGhNZXRob2QgPSBleGNlc3MgJiYgZXhjZXNzIDwgMSA/ICdyb3VuZCcgOiAnZmxvb3InO1xuICAgIGNvbHMgPSBNYXRoWyBtYXRoTWV0aG9kIF0oIGNvbHMgKTtcbiAgICB0aGlzLmNvbHMgPSBNYXRoLm1heCggY29scywgMSApO1xuICB9O1xuXG4gIHByb3RvLmdldENvbnRhaW5lcldpZHRoID0gZnVuY3Rpb24oKSB7XG4gICAgLy8gY29udGFpbmVyIGlzIHBhcmVudCBpZiBmaXQgd2lkdGhcbiAgICB2YXIgaXNGaXRXaWR0aCA9IHRoaXMuX2dldE9wdGlvbignZml0V2lkdGgnKTtcbiAgICB2YXIgY29udGFpbmVyID0gaXNGaXRXaWR0aCA/IHRoaXMuZWxlbWVudC5wYXJlbnROb2RlIDogdGhpcy5lbGVtZW50O1xuICAgIC8vIGNoZWNrIHRoYXQgdGhpcy5zaXplIGFuZCBzaXplIGFyZSB0aGVyZVxuICAgIC8vIElFOCB0cmlnZ2VycyByZXNpemUgb24gYm9keSBzaXplIGNoYW5nZSwgc28gdGhleSBtaWdodCBub3QgYmVcbiAgICB2YXIgc2l6ZSA9IGdldFNpemUoIGNvbnRhaW5lciApO1xuICAgIHRoaXMuY29udGFpbmVyV2lkdGggPSBzaXplICYmIHNpemUuaW5uZXJXaWR0aDtcbiAgfTtcblxuICBwcm90by5fZ2V0SXRlbUxheW91dFBvc2l0aW9uID0gZnVuY3Rpb24oIGl0ZW0gKSB7XG4gICAgaXRlbS5nZXRTaXplKCk7XG4gICAgLy8gaG93IG1hbnkgY29sdW1ucyBkb2VzIHRoaXMgYnJpY2sgc3BhblxuICAgIHZhciByZW1haW5kZXIgPSBpdGVtLnNpemUub3V0ZXJXaWR0aCAlIHRoaXMuY29sdW1uV2lkdGg7XG4gICAgdmFyIG1hdGhNZXRob2QgPSByZW1haW5kZXIgJiYgcmVtYWluZGVyIDwgMSA/ICdyb3VuZCcgOiAnY2VpbCc7XG4gICAgLy8gcm91bmQgaWYgb2ZmIGJ5IDEgcGl4ZWwsIG90aGVyd2lzZSB1c2UgY2VpbFxuICAgIHZhciBjb2xTcGFuID0gTWF0aFsgbWF0aE1ldGhvZCBdKCBpdGVtLnNpemUub3V0ZXJXaWR0aCAvIHRoaXMuY29sdW1uV2lkdGggKTtcbiAgICBjb2xTcGFuID0gTWF0aC5taW4oIGNvbFNwYW4sIHRoaXMuY29scyApO1xuICAgIC8vIHVzZSBob3Jpem9udGFsIG9yIHRvcCBjb2x1bW4gcG9zaXRpb25cbiAgICB2YXIgY29sUG9zTWV0aG9kID0gdGhpcy5vcHRpb25zLmhvcml6b250YWxPcmRlciA/XG4gICAgICAnX2dldEhvcml6b250YWxDb2xQb3NpdGlvbicgOiAnX2dldFRvcENvbFBvc2l0aW9uJztcbiAgICB2YXIgY29sUG9zaXRpb24gPSB0aGlzWyBjb2xQb3NNZXRob2QgXSggY29sU3BhbiwgaXRlbSApO1xuICAgIC8vIHBvc2l0aW9uIHRoZSBicmlja1xuICAgIHZhciBwb3NpdGlvbiA9IHtcbiAgICAgIHg6IHRoaXMuY29sdW1uV2lkdGggKiBjb2xQb3NpdGlvbi5jb2wsXG4gICAgICB5OiBjb2xQb3NpdGlvbi55XG4gICAgfTtcbiAgICAvLyBhcHBseSBzZXRIZWlnaHQgdG8gbmVjZXNzYXJ5IGNvbHVtbnNcbiAgICB2YXIgc2V0SGVpZ2h0ID0gY29sUG9zaXRpb24ueSArIGl0ZW0uc2l6ZS5vdXRlckhlaWdodDtcbiAgICB2YXIgc2V0TWF4ID0gY29sU3BhbiArIGNvbFBvc2l0aW9uLmNvbDtcbiAgICBmb3IgKCB2YXIgaSA9IGNvbFBvc2l0aW9uLmNvbDsgaSA8IHNldE1heDsgaSsrICkge1xuICAgICAgdGhpcy5jb2xZc1tpXSA9IHNldEhlaWdodDtcbiAgICB9XG5cbiAgICByZXR1cm4gcG9zaXRpb247XG4gIH07XG5cbiAgcHJvdG8uX2dldFRvcENvbFBvc2l0aW9uID0gZnVuY3Rpb24oIGNvbFNwYW4gKSB7XG4gICAgdmFyIGNvbEdyb3VwID0gdGhpcy5fZ2V0VG9wQ29sR3JvdXAoIGNvbFNwYW4gKTtcbiAgICAvLyBnZXQgdGhlIG1pbmltdW0gWSB2YWx1ZSBmcm9tIHRoZSBjb2x1bW5zXG4gICAgdmFyIG1pbmltdW1ZID0gTWF0aC5taW4uYXBwbHkoIE1hdGgsIGNvbEdyb3VwICk7XG5cbiAgICByZXR1cm4ge1xuICAgICAgY29sOiBjb2xHcm91cC5pbmRleE9mKCBtaW5pbXVtWSApLFxuICAgICAgeTogbWluaW11bVksXG4gICAgfTtcbiAgfTtcblxuICAvKipcbiAgICogQHBhcmFtIHtOdW1iZXJ9IGNvbFNwYW4gLSBudW1iZXIgb2YgY29sdW1ucyB0aGUgZWxlbWVudCBzcGFuc1xuICAgKiBAcmV0dXJucyB7QXJyYXl9IGNvbEdyb3VwXG4gICAqL1xuICBwcm90by5fZ2V0VG9wQ29sR3JvdXAgPSBmdW5jdGlvbiggY29sU3BhbiApIHtcbiAgICBpZiAoIGNvbFNwYW4gPCAyICkge1xuICAgICAgLy8gaWYgYnJpY2sgc3BhbnMgb25seSBvbmUgY29sdW1uLCB1c2UgYWxsIHRoZSBjb2x1bW4gWXNcbiAgICAgIHJldHVybiB0aGlzLmNvbFlzO1xuICAgIH1cblxuICAgIHZhciBjb2xHcm91cCA9IFtdO1xuICAgIC8vIGhvdyBtYW55IGRpZmZlcmVudCBwbGFjZXMgY291bGQgdGhpcyBicmljayBmaXQgaG9yaXpvbnRhbGx5XG4gICAgdmFyIGdyb3VwQ291bnQgPSB0aGlzLmNvbHMgKyAxIC0gY29sU3BhbjtcbiAgICAvLyBmb3IgZWFjaCBncm91cCBwb3RlbnRpYWwgaG9yaXpvbnRhbCBwb3NpdGlvblxuICAgIGZvciAoIHZhciBpID0gMDsgaSA8IGdyb3VwQ291bnQ7IGkrKyApIHtcbiAgICAgIGNvbEdyb3VwW2ldID0gdGhpcy5fZ2V0Q29sR3JvdXBZKCBpLCBjb2xTcGFuICk7XG4gICAgfVxuICAgIHJldHVybiBjb2xHcm91cDtcbiAgfTtcblxuICBwcm90by5fZ2V0Q29sR3JvdXBZID0gZnVuY3Rpb24oIGNvbCwgY29sU3BhbiApIHtcbiAgICBpZiAoIGNvbFNwYW4gPCAyICkge1xuICAgICAgcmV0dXJuIHRoaXMuY29sWXNbIGNvbCBdO1xuICAgIH1cbiAgICAvLyBtYWtlIGFuIGFycmF5IG9mIGNvbFkgdmFsdWVzIGZvciB0aGF0IG9uZSBncm91cFxuICAgIHZhciBncm91cENvbFlzID0gdGhpcy5jb2xZcy5zbGljZSggY29sLCBjb2wgKyBjb2xTcGFuICk7XG4gICAgLy8gYW5kIGdldCB0aGUgbWF4IHZhbHVlIG9mIHRoZSBhcnJheVxuICAgIHJldHVybiBNYXRoLm1heC5hcHBseSggTWF0aCwgZ3JvdXBDb2xZcyApO1xuICB9O1xuXG4gIC8vIGdldCBjb2x1bW4gcG9zaXRpb24gYmFzZWQgb24gaG9yaXpvbnRhbCBpbmRleC4gIzg3M1xuICBwcm90by5fZ2V0SG9yaXpvbnRhbENvbFBvc2l0aW9uID0gZnVuY3Rpb24oIGNvbFNwYW4sIGl0ZW0gKSB7XG4gICAgdmFyIGNvbCA9IHRoaXMuaG9yaXpvbnRhbENvbEluZGV4ICUgdGhpcy5jb2xzO1xuICAgIHZhciBpc092ZXIgPSBjb2xTcGFuID4gMSAmJiBjb2wgKyBjb2xTcGFuID4gdGhpcy5jb2xzO1xuICAgIC8vIHNoaWZ0IHRvIG5leHQgcm93IGlmIGl0ZW0gY2FuJ3QgZml0IG9uIGN1cnJlbnQgcm93XG4gICAgY29sID0gaXNPdmVyID8gMCA6IGNvbDtcbiAgICAvLyBkb24ndCBsZXQgemVyby1zaXplIGl0ZW1zIHRha2UgdXAgc3BhY2VcbiAgICB2YXIgaGFzU2l6ZSA9IGl0ZW0uc2l6ZS5vdXRlcldpZHRoICYmIGl0ZW0uc2l6ZS5vdXRlckhlaWdodDtcbiAgICB0aGlzLmhvcml6b250YWxDb2xJbmRleCA9IGhhc1NpemUgPyBjb2wgKyBjb2xTcGFuIDogdGhpcy5ob3Jpem9udGFsQ29sSW5kZXg7XG5cbiAgICByZXR1cm4ge1xuICAgICAgY29sOiBjb2wsXG4gICAgICB5OiB0aGlzLl9nZXRDb2xHcm91cFkoIGNvbCwgY29sU3BhbiApLFxuICAgIH07XG4gIH07XG5cbiAgcHJvdG8uX21hbmFnZVN0YW1wID0gZnVuY3Rpb24oIHN0YW1wICkge1xuICAgIHZhciBzdGFtcFNpemUgPSBnZXRTaXplKCBzdGFtcCApO1xuICAgIHZhciBvZmZzZXQgPSB0aGlzLl9nZXRFbGVtZW50T2Zmc2V0KCBzdGFtcCApO1xuICAgIC8vIGdldCB0aGUgY29sdW1ucyB0aGF0IHRoaXMgc3RhbXAgYWZmZWN0c1xuICAgIHZhciBpc09yaWdpbkxlZnQgPSB0aGlzLl9nZXRPcHRpb24oJ29yaWdpbkxlZnQnKTtcbiAgICB2YXIgZmlyc3RYID0gaXNPcmlnaW5MZWZ0ID8gb2Zmc2V0LmxlZnQgOiBvZmZzZXQucmlnaHQ7XG4gICAgdmFyIGxhc3RYID0gZmlyc3RYICsgc3RhbXBTaXplLm91dGVyV2lkdGg7XG4gICAgdmFyIGZpcnN0Q29sID0gTWF0aC5mbG9vciggZmlyc3RYIC8gdGhpcy5jb2x1bW5XaWR0aCApO1xuICAgIGZpcnN0Q29sID0gTWF0aC5tYXgoIDAsIGZpcnN0Q29sICk7XG4gICAgdmFyIGxhc3RDb2wgPSBNYXRoLmZsb29yKCBsYXN0WCAvIHRoaXMuY29sdW1uV2lkdGggKTtcbiAgICAvLyBsYXN0Q29sIHNob3VsZCBub3QgZ28gb3ZlciBpZiBtdWx0aXBsZSBvZiBjb2x1bW5XaWR0aCAjNDI1XG4gICAgbGFzdENvbCAtPSBsYXN0WCAlIHRoaXMuY29sdW1uV2lkdGggPyAwIDogMTtcbiAgICBsYXN0Q29sID0gTWF0aC5taW4oIHRoaXMuY29scyAtIDEsIGxhc3RDb2wgKTtcbiAgICAvLyBzZXQgY29sWXMgdG8gYm90dG9tIG9mIHRoZSBzdGFtcFxuXG4gICAgdmFyIGlzT3JpZ2luVG9wID0gdGhpcy5fZ2V0T3B0aW9uKCdvcmlnaW5Ub3AnKTtcbiAgICB2YXIgc3RhbXBNYXhZID0gKCBpc09yaWdpblRvcCA/IG9mZnNldC50b3AgOiBvZmZzZXQuYm90dG9tICkgK1xuICAgICAgc3RhbXBTaXplLm91dGVySGVpZ2h0O1xuICAgIGZvciAoIHZhciBpID0gZmlyc3RDb2w7IGkgPD0gbGFzdENvbDsgaSsrICkge1xuICAgICAgdGhpcy5jb2xZc1tpXSA9IE1hdGgubWF4KCBzdGFtcE1heFksIHRoaXMuY29sWXNbaV0gKTtcbiAgICB9XG4gIH07XG5cbiAgcHJvdG8uX2dldENvbnRhaW5lclNpemUgPSBmdW5jdGlvbigpIHtcbiAgICB0aGlzLm1heFkgPSBNYXRoLm1heC5hcHBseSggTWF0aCwgdGhpcy5jb2xZcyApO1xuICAgIHZhciBzaXplID0ge1xuICAgICAgaGVpZ2h0OiB0aGlzLm1heFlcbiAgICB9O1xuXG4gICAgaWYgKCB0aGlzLl9nZXRPcHRpb24oJ2ZpdFdpZHRoJykgKSB7XG4gICAgICBzaXplLndpZHRoID0gdGhpcy5fZ2V0Q29udGFpbmVyRml0V2lkdGgoKTtcbiAgICB9XG5cbiAgICByZXR1cm4gc2l6ZTtcbiAgfTtcblxuICBwcm90by5fZ2V0Q29udGFpbmVyRml0V2lkdGggPSBmdW5jdGlvbigpIHtcbiAgICB2YXIgdW51c2VkQ29scyA9IDA7XG4gICAgLy8gY291bnQgdW51c2VkIGNvbHVtbnNcbiAgICB2YXIgaSA9IHRoaXMuY29scztcbiAgICB3aGlsZSAoIC0taSApIHtcbiAgICAgIGlmICggdGhpcy5jb2xZc1tpXSAhPT0gMCApIHtcbiAgICAgICAgYnJlYWs7XG4gICAgICB9XG4gICAgICB1bnVzZWRDb2xzKys7XG4gICAgfVxuICAgIC8vIGZpdCBjb250YWluZXIgdG8gY29sdW1ucyB0aGF0IGhhdmUgYmVlbiB1c2VkXG4gICAgcmV0dXJuICggdGhpcy5jb2xzIC0gdW51c2VkQ29scyApICogdGhpcy5jb2x1bW5XaWR0aCAtIHRoaXMuZ3V0dGVyO1xuICB9O1xuXG4gIHByb3RvLm5lZWRzUmVzaXplTGF5b3V0ID0gZnVuY3Rpb24oKSB7XG4gICAgdmFyIHByZXZpb3VzV2lkdGggPSB0aGlzLmNvbnRhaW5lcldpZHRoO1xuICAgIHRoaXMuZ2V0Q29udGFpbmVyV2lkdGgoKTtcbiAgICByZXR1cm4gcHJldmlvdXNXaWR0aCAhPSB0aGlzLmNvbnRhaW5lcldpZHRoO1xuICB9O1xuXG4gIHJldHVybiBNYXNvbnJ5O1xuXG59KSk7XG4iLCIvKiFcbiAqIGdldFNpemUgdjIuMC4zXG4gKiBtZWFzdXJlIHNpemUgb2YgZWxlbWVudHNcbiAqIE1JVCBsaWNlbnNlXG4gKi9cblxuLyoganNoaW50IGJyb3dzZXI6IHRydWUsIHN0cmljdDogdHJ1ZSwgdW5kZWY6IHRydWUsIHVudXNlZDogdHJ1ZSAqL1xuLyogZ2xvYmFscyBjb25zb2xlOiBmYWxzZSAqL1xuXG4oIGZ1bmN0aW9uKCB3aW5kb3csIGZhY3RvcnkgKSB7XG4gIC8qIGpzaGludCBzdHJpY3Q6IGZhbHNlICovIC8qIGdsb2JhbHMgZGVmaW5lLCBtb2R1bGUgKi9cbiAgaWYgKCB0eXBlb2YgZGVmaW5lID09ICdmdW5jdGlvbicgJiYgZGVmaW5lLmFtZCApIHtcbiAgICAvLyBBTURcbiAgICBkZWZpbmUoIGZhY3RvcnkgKTtcbiAgfSBlbHNlIGlmICggdHlwZW9mIG1vZHVsZSA9PSAnb2JqZWN0JyAmJiBtb2R1bGUuZXhwb3J0cyApIHtcbiAgICAvLyBDb21tb25KU1xuICAgIG1vZHVsZS5leHBvcnRzID0gZmFjdG9yeSgpO1xuICB9IGVsc2Uge1xuICAgIC8vIGJyb3dzZXIgZ2xvYmFsXG4gICAgd2luZG93LmdldFNpemUgPSBmYWN0b3J5KCk7XG4gIH1cblxufSkoIHdpbmRvdywgZnVuY3Rpb24gZmFjdG9yeSgpIHtcbid1c2Ugc3RyaWN0JztcblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gaGVscGVycyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAvL1xuXG4vLyBnZXQgYSBudW1iZXIgZnJvbSBhIHN0cmluZywgbm90IGEgcGVyY2VudGFnZVxuZnVuY3Rpb24gZ2V0U3R5bGVTaXplKCB2YWx1ZSApIHtcbiAgdmFyIG51bSA9IHBhcnNlRmxvYXQoIHZhbHVlICk7XG4gIC8vIG5vdCBhIHBlcmNlbnQgbGlrZSAnMTAwJScsIGFuZCBhIG51bWJlclxuICB2YXIgaXNWYWxpZCA9IHZhbHVlLmluZGV4T2YoJyUnKSA9PSAtMSAmJiAhaXNOYU4oIG51bSApO1xuICByZXR1cm4gaXNWYWxpZCAmJiBudW07XG59XG5cbmZ1bmN0aW9uIG5vb3AoKSB7fVxuXG52YXIgbG9nRXJyb3IgPSB0eXBlb2YgY29uc29sZSA9PSAndW5kZWZpbmVkJyA/IG5vb3AgOlxuICBmdW5jdGlvbiggbWVzc2FnZSApIHtcbiAgICBjb25zb2xlLmVycm9yKCBtZXNzYWdlICk7XG4gIH07XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIG1lYXN1cmVtZW50cyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAvL1xuXG52YXIgbWVhc3VyZW1lbnRzID0gW1xuICAncGFkZGluZ0xlZnQnLFxuICAncGFkZGluZ1JpZ2h0JyxcbiAgJ3BhZGRpbmdUb3AnLFxuICAncGFkZGluZ0JvdHRvbScsXG4gICdtYXJnaW5MZWZ0JyxcbiAgJ21hcmdpblJpZ2h0JyxcbiAgJ21hcmdpblRvcCcsXG4gICdtYXJnaW5Cb3R0b20nLFxuICAnYm9yZGVyTGVmdFdpZHRoJyxcbiAgJ2JvcmRlclJpZ2h0V2lkdGgnLFxuICAnYm9yZGVyVG9wV2lkdGgnLFxuICAnYm9yZGVyQm90dG9tV2lkdGgnXG5dO1xuXG52YXIgbWVhc3VyZW1lbnRzTGVuZ3RoID0gbWVhc3VyZW1lbnRzLmxlbmd0aDtcblxuZnVuY3Rpb24gZ2V0WmVyb1NpemUoKSB7XG4gIHZhciBzaXplID0ge1xuICAgIHdpZHRoOiAwLFxuICAgIGhlaWdodDogMCxcbiAgICBpbm5lcldpZHRoOiAwLFxuICAgIGlubmVySGVpZ2h0OiAwLFxuICAgIG91dGVyV2lkdGg6IDAsXG4gICAgb3V0ZXJIZWlnaHQ6IDBcbiAgfTtcbiAgZm9yICggdmFyIGk9MDsgaSA8IG1lYXN1cmVtZW50c0xlbmd0aDsgaSsrICkge1xuICAgIHZhciBtZWFzdXJlbWVudCA9IG1lYXN1cmVtZW50c1tpXTtcbiAgICBzaXplWyBtZWFzdXJlbWVudCBdID0gMDtcbiAgfVxuICByZXR1cm4gc2l6ZTtcbn1cblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gZ2V0U3R5bGUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gLy9cblxuLyoqXG4gKiBnZXRTdHlsZSwgZ2V0IHN0eWxlIG9mIGVsZW1lbnQsIGNoZWNrIGZvciBGaXJlZm94IGJ1Z1xuICogaHR0cHM6Ly9idWd6aWxsYS5tb3ppbGxhLm9yZy9zaG93X2J1Zy5jZ2k/aWQ9NTQ4Mzk3XG4gKi9cbmZ1bmN0aW9uIGdldFN0eWxlKCBlbGVtICkge1xuICB2YXIgc3R5bGUgPSBnZXRDb21wdXRlZFN0eWxlKCBlbGVtICk7XG4gIGlmICggIXN0eWxlICkge1xuICAgIGxvZ0Vycm9yKCAnU3R5bGUgcmV0dXJuZWQgJyArIHN0eWxlICtcbiAgICAgICcuIEFyZSB5b3UgcnVubmluZyB0aGlzIGNvZGUgaW4gYSBoaWRkZW4gaWZyYW1lIG9uIEZpcmVmb3g/ICcgK1xuICAgICAgJ1NlZSBodHRwczovL2JpdC5seS9nZXRzaXplYnVnMScgKTtcbiAgfVxuICByZXR1cm4gc3R5bGU7XG59XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHNldHVwIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIC8vXG5cbnZhciBpc1NldHVwID0gZmFsc2U7XG5cbnZhciBpc0JveFNpemVPdXRlcjtcblxuLyoqXG4gKiBzZXR1cFxuICogY2hlY2sgaXNCb3hTaXplck91dGVyXG4gKiBkbyBvbiBmaXJzdCBnZXRTaXplKCkgcmF0aGVyIHRoYW4gb24gcGFnZSBsb2FkIGZvciBGaXJlZm94IGJ1Z1xuICovXG5mdW5jdGlvbiBzZXR1cCgpIHtcbiAgLy8gc2V0dXAgb25jZVxuICBpZiAoIGlzU2V0dXAgKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIGlzU2V0dXAgPSB0cnVlO1xuXG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIGJveCBzaXppbmcgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gLy9cblxuICAvKipcbiAgICogQ2hyb21lICYgU2FmYXJpIG1lYXN1cmUgdGhlIG91dGVyLXdpZHRoIG9uIHN0eWxlLndpZHRoIG9uIGJvcmRlci1ib3ggZWxlbXNcbiAgICogSUUxMSAmIEZpcmVmb3g8MjkgbWVhc3VyZXMgdGhlIGlubmVyLXdpZHRoXG4gICAqL1xuICB2YXIgZGl2ID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnZGl2Jyk7XG4gIGRpdi5zdHlsZS53aWR0aCA9ICcyMDBweCc7XG4gIGRpdi5zdHlsZS5wYWRkaW5nID0gJzFweCAycHggM3B4IDRweCc7XG4gIGRpdi5zdHlsZS5ib3JkZXJTdHlsZSA9ICdzb2xpZCc7XG4gIGRpdi5zdHlsZS5ib3JkZXJXaWR0aCA9ICcxcHggMnB4IDNweCA0cHgnO1xuICBkaXYuc3R5bGUuYm94U2l6aW5nID0gJ2JvcmRlci1ib3gnO1xuXG4gIHZhciBib2R5ID0gZG9jdW1lbnQuYm9keSB8fCBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQ7XG4gIGJvZHkuYXBwZW5kQ2hpbGQoIGRpdiApO1xuICB2YXIgc3R5bGUgPSBnZXRTdHlsZSggZGl2ICk7XG4gIC8vIHJvdW5kIHZhbHVlIGZvciBicm93c2VyIHpvb20uIGRlc2FuZHJvL21hc29ucnkjOTI4XG4gIGlzQm94U2l6ZU91dGVyID0gTWF0aC5yb3VuZCggZ2V0U3R5bGVTaXplKCBzdHlsZS53aWR0aCApICkgPT0gMjAwO1xuICBnZXRTaXplLmlzQm94U2l6ZU91dGVyID0gaXNCb3hTaXplT3V0ZXI7XG5cbiAgYm9keS5yZW1vdmVDaGlsZCggZGl2ICk7XG59XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIGdldFNpemUgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gLy9cblxuZnVuY3Rpb24gZ2V0U2l6ZSggZWxlbSApIHtcbiAgc2V0dXAoKTtcblxuICAvLyB1c2UgcXVlcnlTZWxldG9yIGlmIGVsZW0gaXMgc3RyaW5nXG4gIGlmICggdHlwZW9mIGVsZW0gPT0gJ3N0cmluZycgKSB7XG4gICAgZWxlbSA9IGRvY3VtZW50LnF1ZXJ5U2VsZWN0b3IoIGVsZW0gKTtcbiAgfVxuXG4gIC8vIGRvIG5vdCBwcm9jZWVkIG9uIG5vbi1vYmplY3RzXG4gIGlmICggIWVsZW0gfHwgdHlwZW9mIGVsZW0gIT0gJ29iamVjdCcgfHwgIWVsZW0ubm9kZVR5cGUgKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgdmFyIHN0eWxlID0gZ2V0U3R5bGUoIGVsZW0gKTtcblxuICAvLyBpZiBoaWRkZW4sIGV2ZXJ5dGhpbmcgaXMgMFxuICBpZiAoIHN0eWxlLmRpc3BsYXkgPT0gJ25vbmUnICkge1xuICAgIHJldHVybiBnZXRaZXJvU2l6ZSgpO1xuICB9XG5cbiAgdmFyIHNpemUgPSB7fTtcbiAgc2l6ZS53aWR0aCA9IGVsZW0ub2Zmc2V0V2lkdGg7XG4gIHNpemUuaGVpZ2h0ID0gZWxlbS5vZmZzZXRIZWlnaHQ7XG5cbiAgdmFyIGlzQm9yZGVyQm94ID0gc2l6ZS5pc0JvcmRlckJveCA9IHN0eWxlLmJveFNpemluZyA9PSAnYm9yZGVyLWJveCc7XG5cbiAgLy8gZ2V0IGFsbCBtZWFzdXJlbWVudHNcbiAgZm9yICggdmFyIGk9MDsgaSA8IG1lYXN1cmVtZW50c0xlbmd0aDsgaSsrICkge1xuICAgIHZhciBtZWFzdXJlbWVudCA9IG1lYXN1cmVtZW50c1tpXTtcbiAgICB2YXIgdmFsdWUgPSBzdHlsZVsgbWVhc3VyZW1lbnQgXTtcbiAgICB2YXIgbnVtID0gcGFyc2VGbG9hdCggdmFsdWUgKTtcbiAgICAvLyBhbnkgJ2F1dG8nLCAnbWVkaXVtJyB2YWx1ZSB3aWxsIGJlIDBcbiAgICBzaXplWyBtZWFzdXJlbWVudCBdID0gIWlzTmFOKCBudW0gKSA/IG51bSA6IDA7XG4gIH1cblxuICB2YXIgcGFkZGluZ1dpZHRoID0gc2l6ZS5wYWRkaW5nTGVmdCArIHNpemUucGFkZGluZ1JpZ2h0O1xuICB2YXIgcGFkZGluZ0hlaWdodCA9IHNpemUucGFkZGluZ1RvcCArIHNpemUucGFkZGluZ0JvdHRvbTtcbiAgdmFyIG1hcmdpbldpZHRoID0gc2l6ZS5tYXJnaW5MZWZ0ICsgc2l6ZS5tYXJnaW5SaWdodDtcbiAgdmFyIG1hcmdpbkhlaWdodCA9IHNpemUubWFyZ2luVG9wICsgc2l6ZS5tYXJnaW5Cb3R0b207XG4gIHZhciBib3JkZXJXaWR0aCA9IHNpemUuYm9yZGVyTGVmdFdpZHRoICsgc2l6ZS5ib3JkZXJSaWdodFdpZHRoO1xuICB2YXIgYm9yZGVySGVpZ2h0ID0gc2l6ZS5ib3JkZXJUb3BXaWR0aCArIHNpemUuYm9yZGVyQm90dG9tV2lkdGg7XG5cbiAgdmFyIGlzQm9yZGVyQm94U2l6ZU91dGVyID0gaXNCb3JkZXJCb3ggJiYgaXNCb3hTaXplT3V0ZXI7XG5cbiAgLy8gb3ZlcndyaXRlIHdpZHRoIGFuZCBoZWlnaHQgaWYgd2UgY2FuIGdldCBpdCBmcm9tIHN0eWxlXG4gIHZhciBzdHlsZVdpZHRoID0gZ2V0U3R5bGVTaXplKCBzdHlsZS53aWR0aCApO1xuICBpZiAoIHN0eWxlV2lkdGggIT09IGZhbHNlICkge1xuICAgIHNpemUud2lkdGggPSBzdHlsZVdpZHRoICtcbiAgICAgIC8vIGFkZCBwYWRkaW5nIGFuZCBib3JkZXIgdW5sZXNzIGl0J3MgYWxyZWFkeSBpbmNsdWRpbmcgaXRcbiAgICAgICggaXNCb3JkZXJCb3hTaXplT3V0ZXIgPyAwIDogcGFkZGluZ1dpZHRoICsgYm9yZGVyV2lkdGggKTtcbiAgfVxuXG4gIHZhciBzdHlsZUhlaWdodCA9IGdldFN0eWxlU2l6ZSggc3R5bGUuaGVpZ2h0ICk7XG4gIGlmICggc3R5bGVIZWlnaHQgIT09IGZhbHNlICkge1xuICAgIHNpemUuaGVpZ2h0ID0gc3R5bGVIZWlnaHQgK1xuICAgICAgLy8gYWRkIHBhZGRpbmcgYW5kIGJvcmRlciB1bmxlc3MgaXQncyBhbHJlYWR5IGluY2x1ZGluZyBpdFxuICAgICAgKCBpc0JvcmRlckJveFNpemVPdXRlciA/IDAgOiBwYWRkaW5nSGVpZ2h0ICsgYm9yZGVySGVpZ2h0ICk7XG4gIH1cblxuICBzaXplLmlubmVyV2lkdGggPSBzaXplLndpZHRoIC0gKCBwYWRkaW5nV2lkdGggKyBib3JkZXJXaWR0aCApO1xuICBzaXplLmlubmVySGVpZ2h0ID0gc2l6ZS5oZWlnaHQgLSAoIHBhZGRpbmdIZWlnaHQgKyBib3JkZXJIZWlnaHQgKTtcblxuICBzaXplLm91dGVyV2lkdGggPSBzaXplLndpZHRoICsgbWFyZ2luV2lkdGg7XG4gIHNpemUub3V0ZXJIZWlnaHQgPSBzaXplLmhlaWdodCArIG1hcmdpbkhlaWdodDtcblxuICByZXR1cm4gc2l6ZTtcbn1cblxucmV0dXJuIGdldFNpemU7XG5cbn0pO1xuIiwiLyoqXG4gKiBPdXRsYXllciBJdGVtXG4gKi9cblxuKCBmdW5jdGlvbiggd2luZG93LCBmYWN0b3J5ICkge1xuICAvLyB1bml2ZXJzYWwgbW9kdWxlIGRlZmluaXRpb25cbiAgLyoganNoaW50IHN0cmljdDogZmFsc2UgKi8gLyogZ2xvYmFscyBkZWZpbmUsIG1vZHVsZSwgcmVxdWlyZSAqL1xuICBpZiAoIHR5cGVvZiBkZWZpbmUgPT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kICkge1xuICAgIC8vIEFNRCAtIFJlcXVpcmVKU1xuICAgIGRlZmluZSggW1xuICAgICAgICAnZXYtZW1pdHRlci9ldi1lbWl0dGVyJyxcbiAgICAgICAgJ2dldC1zaXplL2dldC1zaXplJ1xuICAgICAgXSxcbiAgICAgIGZhY3RvcnlcbiAgICApO1xuICB9IGVsc2UgaWYgKCB0eXBlb2YgbW9kdWxlID09ICdvYmplY3QnICYmIG1vZHVsZS5leHBvcnRzICkge1xuICAgIC8vIENvbW1vbkpTIC0gQnJvd3NlcmlmeSwgV2VicGFja1xuICAgIG1vZHVsZS5leHBvcnRzID0gZmFjdG9yeShcbiAgICAgIHJlcXVpcmUoJ2V2LWVtaXR0ZXInKSxcbiAgICAgIHJlcXVpcmUoJ2dldC1zaXplJylcbiAgICApO1xuICB9IGVsc2Uge1xuICAgIC8vIGJyb3dzZXIgZ2xvYmFsXG4gICAgd2luZG93Lk91dGxheWVyID0ge307XG4gICAgd2luZG93Lk91dGxheWVyLkl0ZW0gPSBmYWN0b3J5KFxuICAgICAgd2luZG93LkV2RW1pdHRlcixcbiAgICAgIHdpbmRvdy5nZXRTaXplXG4gICAgKTtcbiAgfVxuXG59KCB3aW5kb3csIGZ1bmN0aW9uIGZhY3RvcnkoIEV2RW1pdHRlciwgZ2V0U2l6ZSApIHtcbid1c2Ugc3RyaWN0JztcblxuLy8gLS0tLS0gaGVscGVycyAtLS0tLSAvL1xuXG5mdW5jdGlvbiBpc0VtcHR5T2JqKCBvYmogKSB7XG4gIGZvciAoIHZhciBwcm9wIGluIG9iaiApIHtcbiAgICByZXR1cm4gZmFsc2U7XG4gIH1cbiAgcHJvcCA9IG51bGw7XG4gIHJldHVybiB0cnVlO1xufVxuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBDU1MzIHN1cHBvcnQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gLy9cblxuXG52YXIgZG9jRWxlbVN0eWxlID0gZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LnN0eWxlO1xuXG52YXIgdHJhbnNpdGlvblByb3BlcnR5ID0gdHlwZW9mIGRvY0VsZW1TdHlsZS50cmFuc2l0aW9uID09ICdzdHJpbmcnID9cbiAgJ3RyYW5zaXRpb24nIDogJ1dlYmtpdFRyYW5zaXRpb24nO1xudmFyIHRyYW5zZm9ybVByb3BlcnR5ID0gdHlwZW9mIGRvY0VsZW1TdHlsZS50cmFuc2Zvcm0gPT0gJ3N0cmluZycgP1xuICAndHJhbnNmb3JtJyA6ICdXZWJraXRUcmFuc2Zvcm0nO1xuXG52YXIgdHJhbnNpdGlvbkVuZEV2ZW50ID0ge1xuICBXZWJraXRUcmFuc2l0aW9uOiAnd2Via2l0VHJhbnNpdGlvbkVuZCcsXG4gIHRyYW5zaXRpb246ICd0cmFuc2l0aW9uZW5kJ1xufVsgdHJhbnNpdGlvblByb3BlcnR5IF07XG5cbi8vIGNhY2hlIGFsbCB2ZW5kb3IgcHJvcGVydGllcyB0aGF0IGNvdWxkIGhhdmUgdmVuZG9yIHByZWZpeFxudmFyIHZlbmRvclByb3BlcnRpZXMgPSB7XG4gIHRyYW5zZm9ybTogdHJhbnNmb3JtUHJvcGVydHksXG4gIHRyYW5zaXRpb246IHRyYW5zaXRpb25Qcm9wZXJ0eSxcbiAgdHJhbnNpdGlvbkR1cmF0aW9uOiB0cmFuc2l0aW9uUHJvcGVydHkgKyAnRHVyYXRpb24nLFxuICB0cmFuc2l0aW9uUHJvcGVydHk6IHRyYW5zaXRpb25Qcm9wZXJ0eSArICdQcm9wZXJ0eScsXG4gIHRyYW5zaXRpb25EZWxheTogdHJhbnNpdGlvblByb3BlcnR5ICsgJ0RlbGF5J1xufTtcblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gSXRlbSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAvL1xuXG5mdW5jdGlvbiBJdGVtKCBlbGVtZW50LCBsYXlvdXQgKSB7XG4gIGlmICggIWVsZW1lbnQgKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgdGhpcy5lbGVtZW50ID0gZWxlbWVudDtcbiAgLy8gcGFyZW50IGxheW91dCBjbGFzcywgaS5lLiBNYXNvbnJ5LCBJc290b3BlLCBvciBQYWNrZXJ5XG4gIHRoaXMubGF5b3V0ID0gbGF5b3V0O1xuICB0aGlzLnBvc2l0aW9uID0ge1xuICAgIHg6IDAsXG4gICAgeTogMFxuICB9O1xuXG4gIHRoaXMuX2NyZWF0ZSgpO1xufVxuXG4vLyBpbmhlcml0IEV2RW1pdHRlclxudmFyIHByb3RvID0gSXRlbS5wcm90b3R5cGUgPSBPYmplY3QuY3JlYXRlKCBFdkVtaXR0ZXIucHJvdG90eXBlICk7XG5wcm90by5jb25zdHJ1Y3RvciA9IEl0ZW07XG5cbnByb3RvLl9jcmVhdGUgPSBmdW5jdGlvbigpIHtcbiAgLy8gdHJhbnNpdGlvbiBvYmplY3RzXG4gIHRoaXMuX3RyYW5zbiA9IHtcbiAgICBpbmdQcm9wZXJ0aWVzOiB7fSxcbiAgICBjbGVhbjoge30sXG4gICAgb25FbmQ6IHt9XG4gIH07XG5cbiAgdGhpcy5jc3Moe1xuICAgIHBvc2l0aW9uOiAnYWJzb2x1dGUnXG4gIH0pO1xufTtcblxuLy8gdHJpZ2dlciBzcGVjaWZpZWQgaGFuZGxlciBmb3IgZXZlbnQgdHlwZVxucHJvdG8uaGFuZGxlRXZlbnQgPSBmdW5jdGlvbiggZXZlbnQgKSB7XG4gIHZhciBtZXRob2QgPSAnb24nICsgZXZlbnQudHlwZTtcbiAgaWYgKCB0aGlzWyBtZXRob2QgXSApIHtcbiAgICB0aGlzWyBtZXRob2QgXSggZXZlbnQgKTtcbiAgfVxufTtcblxucHJvdG8uZ2V0U2l6ZSA9IGZ1bmN0aW9uKCkge1xuICB0aGlzLnNpemUgPSBnZXRTaXplKCB0aGlzLmVsZW1lbnQgKTtcbn07XG5cbi8qKlxuICogYXBwbHkgQ1NTIHN0eWxlcyB0byBlbGVtZW50XG4gKiBAcGFyYW0ge09iamVjdH0gc3R5bGVcbiAqL1xucHJvdG8uY3NzID0gZnVuY3Rpb24oIHN0eWxlICkge1xuICB2YXIgZWxlbVN0eWxlID0gdGhpcy5lbGVtZW50LnN0eWxlO1xuXG4gIGZvciAoIHZhciBwcm9wIGluIHN0eWxlICkge1xuICAgIC8vIHVzZSB2ZW5kb3IgcHJvcGVydHkgaWYgYXZhaWxhYmxlXG4gICAgdmFyIHN1cHBvcnRlZFByb3AgPSB2ZW5kb3JQcm9wZXJ0aWVzWyBwcm9wIF0gfHwgcHJvcDtcbiAgICBlbGVtU3R5bGVbIHN1cHBvcnRlZFByb3AgXSA9IHN0eWxlWyBwcm9wIF07XG4gIH1cbn07XG5cbiAvLyBtZWFzdXJlIHBvc2l0aW9uLCBhbmQgc2V0cyBpdFxucHJvdG8uZ2V0UG9zaXRpb24gPSBmdW5jdGlvbigpIHtcbiAgdmFyIHN0eWxlID0gZ2V0Q29tcHV0ZWRTdHlsZSggdGhpcy5lbGVtZW50ICk7XG4gIHZhciBpc09yaWdpbkxlZnQgPSB0aGlzLmxheW91dC5fZ2V0T3B0aW9uKCdvcmlnaW5MZWZ0Jyk7XG4gIHZhciBpc09yaWdpblRvcCA9IHRoaXMubGF5b3V0Ll9nZXRPcHRpb24oJ29yaWdpblRvcCcpO1xuICB2YXIgeFZhbHVlID0gc3R5bGVbIGlzT3JpZ2luTGVmdCA/ICdsZWZ0JyA6ICdyaWdodCcgXTtcbiAgdmFyIHlWYWx1ZSA9IHN0eWxlWyBpc09yaWdpblRvcCA/ICd0b3AnIDogJ2JvdHRvbScgXTtcbiAgdmFyIHggPSBwYXJzZUZsb2F0KCB4VmFsdWUgKTtcbiAgdmFyIHkgPSBwYXJzZUZsb2F0KCB5VmFsdWUgKTtcbiAgLy8gY29udmVydCBwZXJjZW50IHRvIHBpeGVsc1xuICB2YXIgbGF5b3V0U2l6ZSA9IHRoaXMubGF5b3V0LnNpemU7XG4gIGlmICggeFZhbHVlLmluZGV4T2YoJyUnKSAhPSAtMSApIHtcbiAgICB4ID0gKCB4IC8gMTAwICkgKiBsYXlvdXRTaXplLndpZHRoO1xuICB9XG4gIGlmICggeVZhbHVlLmluZGV4T2YoJyUnKSAhPSAtMSApIHtcbiAgICB5ID0gKCB5IC8gMTAwICkgKiBsYXlvdXRTaXplLmhlaWdodDtcbiAgfVxuICAvLyBjbGVhbiB1cCAnYXV0bycgb3Igb3RoZXIgbm9uLWludGVnZXIgdmFsdWVzXG4gIHggPSBpc05hTiggeCApID8gMCA6IHg7XG4gIHkgPSBpc05hTiggeSApID8gMCA6IHk7XG4gIC8vIHJlbW92ZSBwYWRkaW5nIGZyb20gbWVhc3VyZW1lbnRcbiAgeCAtPSBpc09yaWdpbkxlZnQgPyBsYXlvdXRTaXplLnBhZGRpbmdMZWZ0IDogbGF5b3V0U2l6ZS5wYWRkaW5nUmlnaHQ7XG4gIHkgLT0gaXNPcmlnaW5Ub3AgPyBsYXlvdXRTaXplLnBhZGRpbmdUb3AgOiBsYXlvdXRTaXplLnBhZGRpbmdCb3R0b207XG5cbiAgdGhpcy5wb3NpdGlvbi54ID0geDtcbiAgdGhpcy5wb3NpdGlvbi55ID0geTtcbn07XG5cbi8vIHNldCBzZXR0bGVkIHBvc2l0aW9uLCBhcHBseSBwYWRkaW5nXG5wcm90by5sYXlvdXRQb3NpdGlvbiA9IGZ1bmN0aW9uKCkge1xuICB2YXIgbGF5b3V0U2l6ZSA9IHRoaXMubGF5b3V0LnNpemU7XG4gIHZhciBzdHlsZSA9IHt9O1xuICB2YXIgaXNPcmlnaW5MZWZ0ID0gdGhpcy5sYXlvdXQuX2dldE9wdGlvbignb3JpZ2luTGVmdCcpO1xuICB2YXIgaXNPcmlnaW5Ub3AgPSB0aGlzLmxheW91dC5fZ2V0T3B0aW9uKCdvcmlnaW5Ub3AnKTtcblxuICAvLyB4XG4gIHZhciB4UGFkZGluZyA9IGlzT3JpZ2luTGVmdCA/ICdwYWRkaW5nTGVmdCcgOiAncGFkZGluZ1JpZ2h0JztcbiAgdmFyIHhQcm9wZXJ0eSA9IGlzT3JpZ2luTGVmdCA/ICdsZWZ0JyA6ICdyaWdodCc7XG4gIHZhciB4UmVzZXRQcm9wZXJ0eSA9IGlzT3JpZ2luTGVmdCA/ICdyaWdodCcgOiAnbGVmdCc7XG5cbiAgdmFyIHggPSB0aGlzLnBvc2l0aW9uLnggKyBsYXlvdXRTaXplWyB4UGFkZGluZyBdO1xuICAvLyBzZXQgaW4gcGVyY2VudGFnZSBvciBwaXhlbHNcbiAgc3R5bGVbIHhQcm9wZXJ0eSBdID0gdGhpcy5nZXRYVmFsdWUoIHggKTtcbiAgLy8gcmVzZXQgb3RoZXIgcHJvcGVydHlcbiAgc3R5bGVbIHhSZXNldFByb3BlcnR5IF0gPSAnJztcblxuICAvLyB5XG4gIHZhciB5UGFkZGluZyA9IGlzT3JpZ2luVG9wID8gJ3BhZGRpbmdUb3AnIDogJ3BhZGRpbmdCb3R0b20nO1xuICB2YXIgeVByb3BlcnR5ID0gaXNPcmlnaW5Ub3AgPyAndG9wJyA6ICdib3R0b20nO1xuICB2YXIgeVJlc2V0UHJvcGVydHkgPSBpc09yaWdpblRvcCA/ICdib3R0b20nIDogJ3RvcCc7XG5cbiAgdmFyIHkgPSB0aGlzLnBvc2l0aW9uLnkgKyBsYXlvdXRTaXplWyB5UGFkZGluZyBdO1xuICAvLyBzZXQgaW4gcGVyY2VudGFnZSBvciBwaXhlbHNcbiAgc3R5bGVbIHlQcm9wZXJ0eSBdID0gdGhpcy5nZXRZVmFsdWUoIHkgKTtcbiAgLy8gcmVzZXQgb3RoZXIgcHJvcGVydHlcbiAgc3R5bGVbIHlSZXNldFByb3BlcnR5IF0gPSAnJztcblxuICB0aGlzLmNzcyggc3R5bGUgKTtcbiAgdGhpcy5lbWl0RXZlbnQoICdsYXlvdXQnLCBbIHRoaXMgXSApO1xufTtcblxucHJvdG8uZ2V0WFZhbHVlID0gZnVuY3Rpb24oIHggKSB7XG4gIHZhciBpc0hvcml6b250YWwgPSB0aGlzLmxheW91dC5fZ2V0T3B0aW9uKCdob3Jpem9udGFsJyk7XG4gIHJldHVybiB0aGlzLmxheW91dC5vcHRpb25zLnBlcmNlbnRQb3NpdGlvbiAmJiAhaXNIb3Jpem9udGFsID9cbiAgICAoICggeCAvIHRoaXMubGF5b3V0LnNpemUud2lkdGggKSAqIDEwMCApICsgJyUnIDogeCArICdweCc7XG59O1xuXG5wcm90by5nZXRZVmFsdWUgPSBmdW5jdGlvbiggeSApIHtcbiAgdmFyIGlzSG9yaXpvbnRhbCA9IHRoaXMubGF5b3V0Ll9nZXRPcHRpb24oJ2hvcml6b250YWwnKTtcbiAgcmV0dXJuIHRoaXMubGF5b3V0Lm9wdGlvbnMucGVyY2VudFBvc2l0aW9uICYmIGlzSG9yaXpvbnRhbCA/XG4gICAgKCAoIHkgLyB0aGlzLmxheW91dC5zaXplLmhlaWdodCApICogMTAwICkgKyAnJScgOiB5ICsgJ3B4Jztcbn07XG5cbnByb3RvLl90cmFuc2l0aW9uVG8gPSBmdW5jdGlvbiggeCwgeSApIHtcbiAgdGhpcy5nZXRQb3NpdGlvbigpO1xuICAvLyBnZXQgY3VycmVudCB4ICYgeSBmcm9tIHRvcC9sZWZ0XG4gIHZhciBjdXJYID0gdGhpcy5wb3NpdGlvbi54O1xuICB2YXIgY3VyWSA9IHRoaXMucG9zaXRpb24ueTtcblxuICB2YXIgZGlkTm90TW92ZSA9IHggPT0gdGhpcy5wb3NpdGlvbi54ICYmIHkgPT0gdGhpcy5wb3NpdGlvbi55O1xuXG4gIC8vIHNhdmUgZW5kIHBvc2l0aW9uXG4gIHRoaXMuc2V0UG9zaXRpb24oIHgsIHkgKTtcblxuICAvLyBpZiBkaWQgbm90IG1vdmUgYW5kIG5vdCB0cmFuc2l0aW9uaW5nLCBqdXN0IGdvIHRvIGxheW91dFxuICBpZiAoIGRpZE5vdE1vdmUgJiYgIXRoaXMuaXNUcmFuc2l0aW9uaW5nICkge1xuICAgIHRoaXMubGF5b3V0UG9zaXRpb24oKTtcbiAgICByZXR1cm47XG4gIH1cblxuICB2YXIgdHJhbnNYID0geCAtIGN1clg7XG4gIHZhciB0cmFuc1kgPSB5IC0gY3VyWTtcbiAgdmFyIHRyYW5zaXRpb25TdHlsZSA9IHt9O1xuICB0cmFuc2l0aW9uU3R5bGUudHJhbnNmb3JtID0gdGhpcy5nZXRUcmFuc2xhdGUoIHRyYW5zWCwgdHJhbnNZICk7XG5cbiAgdGhpcy50cmFuc2l0aW9uKHtcbiAgICB0bzogdHJhbnNpdGlvblN0eWxlLFxuICAgIG9uVHJhbnNpdGlvbkVuZDoge1xuICAgICAgdHJhbnNmb3JtOiB0aGlzLmxheW91dFBvc2l0aW9uXG4gICAgfSxcbiAgICBpc0NsZWFuaW5nOiB0cnVlXG4gIH0pO1xufTtcblxucHJvdG8uZ2V0VHJhbnNsYXRlID0gZnVuY3Rpb24oIHgsIHkgKSB7XG4gIC8vIGZsaXAgY29vcmlkaW5hdGVzIGlmIG9yaWdpbiBvbiByaWdodCBvciBib3R0b21cbiAgdmFyIGlzT3JpZ2luTGVmdCA9IHRoaXMubGF5b3V0Ll9nZXRPcHRpb24oJ29yaWdpbkxlZnQnKTtcbiAgdmFyIGlzT3JpZ2luVG9wID0gdGhpcy5sYXlvdXQuX2dldE9wdGlvbignb3JpZ2luVG9wJyk7XG4gIHggPSBpc09yaWdpbkxlZnQgPyB4IDogLXg7XG4gIHkgPSBpc09yaWdpblRvcCA/IHkgOiAteTtcbiAgcmV0dXJuICd0cmFuc2xhdGUzZCgnICsgeCArICdweCwgJyArIHkgKyAncHgsIDApJztcbn07XG5cbi8vIG5vbiB0cmFuc2l0aW9uICsgdHJhbnNmb3JtIHN1cHBvcnRcbnByb3RvLmdvVG8gPSBmdW5jdGlvbiggeCwgeSApIHtcbiAgdGhpcy5zZXRQb3NpdGlvbiggeCwgeSApO1xuICB0aGlzLmxheW91dFBvc2l0aW9uKCk7XG59O1xuXG5wcm90by5tb3ZlVG8gPSBwcm90by5fdHJhbnNpdGlvblRvO1xuXG5wcm90by5zZXRQb3NpdGlvbiA9IGZ1bmN0aW9uKCB4LCB5ICkge1xuICB0aGlzLnBvc2l0aW9uLnggPSBwYXJzZUZsb2F0KCB4ICk7XG4gIHRoaXMucG9zaXRpb24ueSA9IHBhcnNlRmxvYXQoIHkgKTtcbn07XG5cbi8vIC0tLS0tIHRyYW5zaXRpb24gLS0tLS0gLy9cblxuLyoqXG4gKiBAcGFyYW0ge09iamVjdH0gc3R5bGUgLSBDU1NcbiAqIEBwYXJhbSB7RnVuY3Rpb259IG9uVHJhbnNpdGlvbkVuZFxuICovXG5cbi8vIG5vbiB0cmFuc2l0aW9uLCBqdXN0IHRyaWdnZXIgY2FsbGJhY2tcbnByb3RvLl9ub25UcmFuc2l0aW9uID0gZnVuY3Rpb24oIGFyZ3MgKSB7XG4gIHRoaXMuY3NzKCBhcmdzLnRvICk7XG4gIGlmICggYXJncy5pc0NsZWFuaW5nICkge1xuICAgIHRoaXMuX3JlbW92ZVN0eWxlcyggYXJncy50byApO1xuICB9XG4gIGZvciAoIHZhciBwcm9wIGluIGFyZ3Mub25UcmFuc2l0aW9uRW5kICkge1xuICAgIGFyZ3Mub25UcmFuc2l0aW9uRW5kWyBwcm9wIF0uY2FsbCggdGhpcyApO1xuICB9XG59O1xuXG4vKipcbiAqIHByb3BlciB0cmFuc2l0aW9uXG4gKiBAcGFyYW0ge09iamVjdH0gYXJncyAtIGFyZ3VtZW50c1xuICogICBAcGFyYW0ge09iamVjdH0gdG8gLSBzdHlsZSB0byB0cmFuc2l0aW9uIHRvXG4gKiAgIEBwYXJhbSB7T2JqZWN0fSBmcm9tIC0gc3R5bGUgdG8gc3RhcnQgdHJhbnNpdGlvbiBmcm9tXG4gKiAgIEBwYXJhbSB7Qm9vbGVhbn0gaXNDbGVhbmluZyAtIHJlbW92ZXMgdHJhbnNpdGlvbiBzdHlsZXMgYWZ0ZXIgdHJhbnNpdGlvblxuICogICBAcGFyYW0ge0Z1bmN0aW9ufSBvblRyYW5zaXRpb25FbmQgLSBjYWxsYmFja1xuICovXG5wcm90by50cmFuc2l0aW9uID0gZnVuY3Rpb24oIGFyZ3MgKSB7XG4gIC8vIHJlZGlyZWN0IHRvIG5vblRyYW5zaXRpb24gaWYgbm8gdHJhbnNpdGlvbiBkdXJhdGlvblxuICBpZiAoICFwYXJzZUZsb2F0KCB0aGlzLmxheW91dC5vcHRpb25zLnRyYW5zaXRpb25EdXJhdGlvbiApICkge1xuICAgIHRoaXMuX25vblRyYW5zaXRpb24oIGFyZ3MgKTtcbiAgICByZXR1cm47XG4gIH1cblxuICB2YXIgX3RyYW5zaXRpb24gPSB0aGlzLl90cmFuc247XG4gIC8vIGtlZXAgdHJhY2sgb2Ygb25UcmFuc2l0aW9uRW5kIGNhbGxiYWNrIGJ5IGNzcyBwcm9wZXJ0eVxuICBmb3IgKCB2YXIgcHJvcCBpbiBhcmdzLm9uVHJhbnNpdGlvbkVuZCApIHtcbiAgICBfdHJhbnNpdGlvbi5vbkVuZFsgcHJvcCBdID0gYXJncy5vblRyYW5zaXRpb25FbmRbIHByb3AgXTtcbiAgfVxuICAvLyBrZWVwIHRyYWNrIG9mIHByb3BlcnRpZXMgdGhhdCBhcmUgdHJhbnNpdGlvbmluZ1xuICBmb3IgKCBwcm9wIGluIGFyZ3MudG8gKSB7XG4gICAgX3RyYW5zaXRpb24uaW5nUHJvcGVydGllc1sgcHJvcCBdID0gdHJ1ZTtcbiAgICAvLyBrZWVwIHRyYWNrIG9mIHByb3BlcnRpZXMgdG8gY2xlYW4gdXAgd2hlbiB0cmFuc2l0aW9uIGlzIGRvbmVcbiAgICBpZiAoIGFyZ3MuaXNDbGVhbmluZyApIHtcbiAgICAgIF90cmFuc2l0aW9uLmNsZWFuWyBwcm9wIF0gPSB0cnVlO1xuICAgIH1cbiAgfVxuXG4gIC8vIHNldCBmcm9tIHN0eWxlc1xuICBpZiAoIGFyZ3MuZnJvbSApIHtcbiAgICB0aGlzLmNzcyggYXJncy5mcm9tICk7XG4gICAgLy8gZm9yY2UgcmVkcmF3LiBodHRwOi8vYmxvZy5hbGV4bWFjY2F3LmNvbS9jc3MtdHJhbnNpdGlvbnNcbiAgICB2YXIgaCA9IHRoaXMuZWxlbWVudC5vZmZzZXRIZWlnaHQ7XG4gICAgLy8gaGFjayBmb3IgSlNIaW50IHRvIGh1c2ggYWJvdXQgdW51c2VkIHZhclxuICAgIGggPSBudWxsO1xuICB9XG4gIC8vIGVuYWJsZSB0cmFuc2l0aW9uXG4gIHRoaXMuZW5hYmxlVHJhbnNpdGlvbiggYXJncy50byApO1xuICAvLyBzZXQgc3R5bGVzIHRoYXQgYXJlIHRyYW5zaXRpb25pbmdcbiAgdGhpcy5jc3MoIGFyZ3MudG8gKTtcblxuICB0aGlzLmlzVHJhbnNpdGlvbmluZyA9IHRydWU7XG5cbn07XG5cbi8vIGRhc2ggYmVmb3JlIGFsbCBjYXAgbGV0dGVycywgaW5jbHVkaW5nIGZpcnN0IGZvclxuLy8gV2Via2l0VHJhbnNmb3JtID0+IC13ZWJraXQtdHJhbnNmb3JtXG5mdW5jdGlvbiB0b0Rhc2hlZEFsbCggc3RyICkge1xuICByZXR1cm4gc3RyLnJlcGxhY2UoIC8oW0EtWl0pL2csIGZ1bmN0aW9uKCAkMSApIHtcbiAgICByZXR1cm4gJy0nICsgJDEudG9Mb3dlckNhc2UoKTtcbiAgfSk7XG59XG5cbnZhciB0cmFuc2l0aW9uUHJvcHMgPSAnb3BhY2l0eSwnICsgdG9EYXNoZWRBbGwoIHRyYW5zZm9ybVByb3BlcnR5ICk7XG5cbnByb3RvLmVuYWJsZVRyYW5zaXRpb24gPSBmdW5jdGlvbigvKiBzdHlsZSAqLykge1xuICAvLyBIQUNLIGNoYW5naW5nIHRyYW5zaXRpb25Qcm9wZXJ0eSBkdXJpbmcgYSB0cmFuc2l0aW9uXG4gIC8vIHdpbGwgY2F1c2UgdHJhbnNpdGlvbiB0byBqdW1wXG4gIGlmICggdGhpcy5pc1RyYW5zaXRpb25pbmcgKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgLy8gbWFrZSBgdHJhbnNpdGlvbjogZm9vLCBiYXIsIGJhemAgZnJvbSBzdHlsZSBvYmplY3RcbiAgLy8gSEFDSyB1bi1jb21tZW50IHRoaXMgd2hlbiBlbmFibGVUcmFuc2l0aW9uIGNhbiB3b3JrXG4gIC8vIHdoaWxlIGEgdHJhbnNpdGlvbiBpcyBoYXBwZW5pbmdcbiAgLy8gdmFyIHRyYW5zaXRpb25WYWx1ZXMgPSBbXTtcbiAgLy8gZm9yICggdmFyIHByb3AgaW4gc3R5bGUgKSB7XG4gIC8vICAgLy8gZGFzaC1pZnkgY2FtZWxDYXNlZCBwcm9wZXJ0aWVzIGxpa2UgV2Via2l0VHJhbnNpdGlvblxuICAvLyAgIHByb3AgPSB2ZW5kb3JQcm9wZXJ0aWVzWyBwcm9wIF0gfHwgcHJvcDtcbiAgLy8gICB0cmFuc2l0aW9uVmFsdWVzLnB1c2goIHRvRGFzaGVkQWxsKCBwcm9wICkgKTtcbiAgLy8gfVxuICAvLyBtdW5nZSBudW1iZXIgdG8gbWlsbGlzZWNvbmQsIHRvIG1hdGNoIHN0YWdnZXJcbiAgdmFyIGR1cmF0aW9uID0gdGhpcy5sYXlvdXQub3B0aW9ucy50cmFuc2l0aW9uRHVyYXRpb247XG4gIGR1cmF0aW9uID0gdHlwZW9mIGR1cmF0aW9uID09ICdudW1iZXInID8gZHVyYXRpb24gKyAnbXMnIDogZHVyYXRpb247XG4gIC8vIGVuYWJsZSB0cmFuc2l0aW9uIHN0eWxlc1xuICB0aGlzLmNzcyh7XG4gICAgdHJhbnNpdGlvblByb3BlcnR5OiB0cmFuc2l0aW9uUHJvcHMsXG4gICAgdHJhbnNpdGlvbkR1cmF0aW9uOiBkdXJhdGlvbixcbiAgICB0cmFuc2l0aW9uRGVsYXk6IHRoaXMuc3RhZ2dlckRlbGF5IHx8IDBcbiAgfSk7XG4gIC8vIGxpc3RlbiBmb3IgdHJhbnNpdGlvbiBlbmQgZXZlbnRcbiAgdGhpcy5lbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoIHRyYW5zaXRpb25FbmRFdmVudCwgdGhpcywgZmFsc2UgKTtcbn07XG5cbi8vIC0tLS0tIGV2ZW50cyAtLS0tLSAvL1xuXG5wcm90by5vbndlYmtpdFRyYW5zaXRpb25FbmQgPSBmdW5jdGlvbiggZXZlbnQgKSB7XG4gIHRoaXMub250cmFuc2l0aW9uZW5kKCBldmVudCApO1xufTtcblxucHJvdG8ub25vdHJhbnNpdGlvbmVuZCA9IGZ1bmN0aW9uKCBldmVudCApIHtcbiAgdGhpcy5vbnRyYW5zaXRpb25lbmQoIGV2ZW50ICk7XG59O1xuXG4vLyBwcm9wZXJ0aWVzIHRoYXQgSSBtdW5nZSB0byBtYWtlIG15IGxpZmUgZWFzaWVyXG52YXIgZGFzaGVkVmVuZG9yUHJvcGVydGllcyA9IHtcbiAgJy13ZWJraXQtdHJhbnNmb3JtJzogJ3RyYW5zZm9ybSdcbn07XG5cbnByb3RvLm9udHJhbnNpdGlvbmVuZCA9IGZ1bmN0aW9uKCBldmVudCApIHtcbiAgLy8gZGlzcmVnYXJkIGJ1YmJsZWQgZXZlbnRzIGZyb20gY2hpbGRyZW5cbiAgaWYgKCBldmVudC50YXJnZXQgIT09IHRoaXMuZWxlbWVudCApIHtcbiAgICByZXR1cm47XG4gIH1cbiAgdmFyIF90cmFuc2l0aW9uID0gdGhpcy5fdHJhbnNuO1xuICAvLyBnZXQgcHJvcGVydHkgbmFtZSBvZiB0cmFuc2l0aW9uZWQgcHJvcGVydHksIGNvbnZlcnQgdG8gcHJlZml4LWZyZWVcbiAgdmFyIHByb3BlcnR5TmFtZSA9IGRhc2hlZFZlbmRvclByb3BlcnRpZXNbIGV2ZW50LnByb3BlcnR5TmFtZSBdIHx8IGV2ZW50LnByb3BlcnR5TmFtZTtcblxuICAvLyByZW1vdmUgcHJvcGVydHkgdGhhdCBoYXMgY29tcGxldGVkIHRyYW5zaXRpb25pbmdcbiAgZGVsZXRlIF90cmFuc2l0aW9uLmluZ1Byb3BlcnRpZXNbIHByb3BlcnR5TmFtZSBdO1xuICAvLyBjaGVjayBpZiBhbnkgcHJvcGVydGllcyBhcmUgc3RpbGwgdHJhbnNpdGlvbmluZ1xuICBpZiAoIGlzRW1wdHlPYmooIF90cmFuc2l0aW9uLmluZ1Byb3BlcnRpZXMgKSApIHtcbiAgICAvLyBhbGwgcHJvcGVydGllcyBoYXZlIGNvbXBsZXRlZCB0cmFuc2l0aW9uaW5nXG4gICAgdGhpcy5kaXNhYmxlVHJhbnNpdGlvbigpO1xuICB9XG4gIC8vIGNsZWFuIHN0eWxlXG4gIGlmICggcHJvcGVydHlOYW1lIGluIF90cmFuc2l0aW9uLmNsZWFuICkge1xuICAgIC8vIGNsZWFuIHVwIHN0eWxlXG4gICAgdGhpcy5lbGVtZW50LnN0eWxlWyBldmVudC5wcm9wZXJ0eU5hbWUgXSA9ICcnO1xuICAgIGRlbGV0ZSBfdHJhbnNpdGlvbi5jbGVhblsgcHJvcGVydHlOYW1lIF07XG4gIH1cbiAgLy8gdHJpZ2dlciBvblRyYW5zaXRpb25FbmQgY2FsbGJhY2tcbiAgaWYgKCBwcm9wZXJ0eU5hbWUgaW4gX3RyYW5zaXRpb24ub25FbmQgKSB7XG4gICAgdmFyIG9uVHJhbnNpdGlvbkVuZCA9IF90cmFuc2l0aW9uLm9uRW5kWyBwcm9wZXJ0eU5hbWUgXTtcbiAgICBvblRyYW5zaXRpb25FbmQuY2FsbCggdGhpcyApO1xuICAgIGRlbGV0ZSBfdHJhbnNpdGlvbi5vbkVuZFsgcHJvcGVydHlOYW1lIF07XG4gIH1cblxuICB0aGlzLmVtaXRFdmVudCggJ3RyYW5zaXRpb25FbmQnLCBbIHRoaXMgXSApO1xufTtcblxucHJvdG8uZGlzYWJsZVRyYW5zaXRpb24gPSBmdW5jdGlvbigpIHtcbiAgdGhpcy5yZW1vdmVUcmFuc2l0aW9uU3R5bGVzKCk7XG4gIHRoaXMuZWxlbWVudC5yZW1vdmVFdmVudExpc3RlbmVyKCB0cmFuc2l0aW9uRW5kRXZlbnQsIHRoaXMsIGZhbHNlICk7XG4gIHRoaXMuaXNUcmFuc2l0aW9uaW5nID0gZmFsc2U7XG59O1xuXG4vKipcbiAqIHJlbW92ZXMgc3R5bGUgcHJvcGVydHkgZnJvbSBlbGVtZW50XG4gKiBAcGFyYW0ge09iamVjdH0gc3R5bGVcbioqL1xucHJvdG8uX3JlbW92ZVN0eWxlcyA9IGZ1bmN0aW9uKCBzdHlsZSApIHtcbiAgLy8gY2xlYW4gdXAgdHJhbnNpdGlvbiBzdHlsZXNcbiAgdmFyIGNsZWFuU3R5bGUgPSB7fTtcbiAgZm9yICggdmFyIHByb3AgaW4gc3R5bGUgKSB7XG4gICAgY2xlYW5TdHlsZVsgcHJvcCBdID0gJyc7XG4gIH1cbiAgdGhpcy5jc3MoIGNsZWFuU3R5bGUgKTtcbn07XG5cbnZhciBjbGVhblRyYW5zaXRpb25TdHlsZSA9IHtcbiAgdHJhbnNpdGlvblByb3BlcnR5OiAnJyxcbiAgdHJhbnNpdGlvbkR1cmF0aW9uOiAnJyxcbiAgdHJhbnNpdGlvbkRlbGF5OiAnJ1xufTtcblxucHJvdG8ucmVtb3ZlVHJhbnNpdGlvblN0eWxlcyA9IGZ1bmN0aW9uKCkge1xuICAvLyByZW1vdmUgdHJhbnNpdGlvblxuICB0aGlzLmNzcyggY2xlYW5UcmFuc2l0aW9uU3R5bGUgKTtcbn07XG5cbi8vIC0tLS0tIHN0YWdnZXIgLS0tLS0gLy9cblxucHJvdG8uc3RhZ2dlciA9IGZ1bmN0aW9uKCBkZWxheSApIHtcbiAgZGVsYXkgPSBpc05hTiggZGVsYXkgKSA/IDAgOiBkZWxheTtcbiAgdGhpcy5zdGFnZ2VyRGVsYXkgPSBkZWxheSArICdtcyc7XG59O1xuXG4vLyAtLS0tLSBzaG93L2hpZGUvcmVtb3ZlIC0tLS0tIC8vXG5cbi8vIHJlbW92ZSBlbGVtZW50IGZyb20gRE9NXG5wcm90by5yZW1vdmVFbGVtID0gZnVuY3Rpb24oKSB7XG4gIHRoaXMuZWxlbWVudC5wYXJlbnROb2RlLnJlbW92ZUNoaWxkKCB0aGlzLmVsZW1lbnQgKTtcbiAgLy8gcmVtb3ZlIGRpc3BsYXk6IG5vbmVcbiAgdGhpcy5jc3MoeyBkaXNwbGF5OiAnJyB9KTtcbiAgdGhpcy5lbWl0RXZlbnQoICdyZW1vdmUnLCBbIHRoaXMgXSApO1xufTtcblxucHJvdG8ucmVtb3ZlID0gZnVuY3Rpb24oKSB7XG4gIC8vIGp1c3QgcmVtb3ZlIGVsZW1lbnQgaWYgbm8gdHJhbnNpdGlvbiBzdXBwb3J0IG9yIG5vIHRyYW5zaXRpb25cbiAgaWYgKCAhdHJhbnNpdGlvblByb3BlcnR5IHx8ICFwYXJzZUZsb2F0KCB0aGlzLmxheW91dC5vcHRpb25zLnRyYW5zaXRpb25EdXJhdGlvbiApICkge1xuICAgIHRoaXMucmVtb3ZlRWxlbSgpO1xuICAgIHJldHVybjtcbiAgfVxuXG4gIC8vIHN0YXJ0IHRyYW5zaXRpb25cbiAgdGhpcy5vbmNlKCAndHJhbnNpdGlvbkVuZCcsIGZ1bmN0aW9uKCkge1xuICAgIHRoaXMucmVtb3ZlRWxlbSgpO1xuICB9KTtcbiAgdGhpcy5oaWRlKCk7XG59O1xuXG5wcm90by5yZXZlYWwgPSBmdW5jdGlvbigpIHtcbiAgZGVsZXRlIHRoaXMuaXNIaWRkZW47XG4gIC8vIHJlbW92ZSBkaXNwbGF5OiBub25lXG4gIHRoaXMuY3NzKHsgZGlzcGxheTogJycgfSk7XG5cbiAgdmFyIG9wdGlvbnMgPSB0aGlzLmxheW91dC5vcHRpb25zO1xuXG4gIHZhciBvblRyYW5zaXRpb25FbmQgPSB7fTtcbiAgdmFyIHRyYW5zaXRpb25FbmRQcm9wZXJ0eSA9IHRoaXMuZ2V0SGlkZVJldmVhbFRyYW5zaXRpb25FbmRQcm9wZXJ0eSgndmlzaWJsZVN0eWxlJyk7XG4gIG9uVHJhbnNpdGlvbkVuZFsgdHJhbnNpdGlvbkVuZFByb3BlcnR5IF0gPSB0aGlzLm9uUmV2ZWFsVHJhbnNpdGlvbkVuZDtcblxuICB0aGlzLnRyYW5zaXRpb24oe1xuICAgIGZyb206IG9wdGlvbnMuaGlkZGVuU3R5bGUsXG4gICAgdG86IG9wdGlvbnMudmlzaWJsZVN0eWxlLFxuICAgIGlzQ2xlYW5pbmc6IHRydWUsXG4gICAgb25UcmFuc2l0aW9uRW5kOiBvblRyYW5zaXRpb25FbmRcbiAgfSk7XG59O1xuXG5wcm90by5vblJldmVhbFRyYW5zaXRpb25FbmQgPSBmdW5jdGlvbigpIHtcbiAgLy8gY2hlY2sgaWYgc3RpbGwgdmlzaWJsZVxuICAvLyBkdXJpbmcgdHJhbnNpdGlvbiwgaXRlbSBtYXkgaGF2ZSBiZWVuIGhpZGRlblxuICBpZiAoICF0aGlzLmlzSGlkZGVuICkge1xuICAgIHRoaXMuZW1pdEV2ZW50KCdyZXZlYWwnKTtcbiAgfVxufTtcblxuLyoqXG4gKiBnZXQgc3R5bGUgcHJvcGVydHkgdXNlIGZvciBoaWRlL3JldmVhbCB0cmFuc2l0aW9uIGVuZFxuICogQHBhcmFtIHtTdHJpbmd9IHN0eWxlUHJvcGVydHkgLSBoaWRkZW5TdHlsZS92aXNpYmxlU3R5bGVcbiAqIEByZXR1cm5zIHtTdHJpbmd9XG4gKi9cbnByb3RvLmdldEhpZGVSZXZlYWxUcmFuc2l0aW9uRW5kUHJvcGVydHkgPSBmdW5jdGlvbiggc3R5bGVQcm9wZXJ0eSApIHtcbiAgdmFyIG9wdGlvblN0eWxlID0gdGhpcy5sYXlvdXQub3B0aW9uc1sgc3R5bGVQcm9wZXJ0eSBdO1xuICAvLyB1c2Ugb3BhY2l0eVxuICBpZiAoIG9wdGlvblN0eWxlLm9wYWNpdHkgKSB7XG4gICAgcmV0dXJuICdvcGFjaXR5JztcbiAgfVxuICAvLyBnZXQgZmlyc3QgcHJvcGVydHlcbiAgZm9yICggdmFyIHByb3AgaW4gb3B0aW9uU3R5bGUgKSB7XG4gICAgcmV0dXJuIHByb3A7XG4gIH1cbn07XG5cbnByb3RvLmhpZGUgPSBmdW5jdGlvbigpIHtcbiAgLy8gc2V0IGZsYWdcbiAgdGhpcy5pc0hpZGRlbiA9IHRydWU7XG4gIC8vIHJlbW92ZSBkaXNwbGF5OiBub25lXG4gIHRoaXMuY3NzKHsgZGlzcGxheTogJycgfSk7XG5cbiAgdmFyIG9wdGlvbnMgPSB0aGlzLmxheW91dC5vcHRpb25zO1xuXG4gIHZhciBvblRyYW5zaXRpb25FbmQgPSB7fTtcbiAgdmFyIHRyYW5zaXRpb25FbmRQcm9wZXJ0eSA9IHRoaXMuZ2V0SGlkZVJldmVhbFRyYW5zaXRpb25FbmRQcm9wZXJ0eSgnaGlkZGVuU3R5bGUnKTtcbiAgb25UcmFuc2l0aW9uRW5kWyB0cmFuc2l0aW9uRW5kUHJvcGVydHkgXSA9IHRoaXMub25IaWRlVHJhbnNpdGlvbkVuZDtcblxuICB0aGlzLnRyYW5zaXRpb24oe1xuICAgIGZyb206IG9wdGlvbnMudmlzaWJsZVN0eWxlLFxuICAgIHRvOiBvcHRpb25zLmhpZGRlblN0eWxlLFxuICAgIC8vIGtlZXAgaGlkZGVuIHN0dWZmIGhpZGRlblxuICAgIGlzQ2xlYW5pbmc6IHRydWUsXG4gICAgb25UcmFuc2l0aW9uRW5kOiBvblRyYW5zaXRpb25FbmRcbiAgfSk7XG59O1xuXG5wcm90by5vbkhpZGVUcmFuc2l0aW9uRW5kID0gZnVuY3Rpb24oKSB7XG4gIC8vIGNoZWNrIGlmIHN0aWxsIGhpZGRlblxuICAvLyBkdXJpbmcgdHJhbnNpdGlvbiwgaXRlbSBtYXkgaGF2ZSBiZWVuIHVuLWhpZGRlblxuICBpZiAoIHRoaXMuaXNIaWRkZW4gKSB7XG4gICAgdGhpcy5jc3MoeyBkaXNwbGF5OiAnbm9uZScgfSk7XG4gICAgdGhpcy5lbWl0RXZlbnQoJ2hpZGUnKTtcbiAgfVxufTtcblxucHJvdG8uZGVzdHJveSA9IGZ1bmN0aW9uKCkge1xuICB0aGlzLmNzcyh7XG4gICAgcG9zaXRpb246ICcnLFxuICAgIGxlZnQ6ICcnLFxuICAgIHJpZ2h0OiAnJyxcbiAgICB0b3A6ICcnLFxuICAgIGJvdHRvbTogJycsXG4gICAgdHJhbnNpdGlvbjogJycsXG4gICAgdHJhbnNmb3JtOiAnJ1xuICB9KTtcbn07XG5cbnJldHVybiBJdGVtO1xuXG59KSk7XG4iLCIvKipcbiAqIG1hdGNoZXNTZWxlY3RvciB2Mi4wLjJcbiAqIG1hdGNoZXNTZWxlY3RvciggZWxlbWVudCwgJy5zZWxlY3RvcicgKVxuICogTUlUIGxpY2Vuc2VcbiAqL1xuXG4vKmpzaGludCBicm93c2VyOiB0cnVlLCBzdHJpY3Q6IHRydWUsIHVuZGVmOiB0cnVlLCB1bnVzZWQ6IHRydWUgKi9cblxuKCBmdW5jdGlvbiggd2luZG93LCBmYWN0b3J5ICkge1xuICAvKmdsb2JhbCBkZWZpbmU6IGZhbHNlLCBtb2R1bGU6IGZhbHNlICovXG4gICd1c2Ugc3RyaWN0JztcbiAgLy8gdW5pdmVyc2FsIG1vZHVsZSBkZWZpbml0aW9uXG4gIGlmICggdHlwZW9mIGRlZmluZSA9PSAnZnVuY3Rpb24nICYmIGRlZmluZS5hbWQgKSB7XG4gICAgLy8gQU1EXG4gICAgZGVmaW5lKCBmYWN0b3J5ICk7XG4gIH0gZWxzZSBpZiAoIHR5cGVvZiBtb2R1bGUgPT0gJ29iamVjdCcgJiYgbW9kdWxlLmV4cG9ydHMgKSB7XG4gICAgLy8gQ29tbW9uSlNcbiAgICBtb2R1bGUuZXhwb3J0cyA9IGZhY3RvcnkoKTtcbiAgfSBlbHNlIHtcbiAgICAvLyBicm93c2VyIGdsb2JhbFxuICAgIHdpbmRvdy5tYXRjaGVzU2VsZWN0b3IgPSBmYWN0b3J5KCk7XG4gIH1cblxufSggd2luZG93LCBmdW5jdGlvbiBmYWN0b3J5KCkge1xuICAndXNlIHN0cmljdCc7XG5cbiAgdmFyIG1hdGNoZXNNZXRob2QgPSAoIGZ1bmN0aW9uKCkge1xuICAgIHZhciBFbGVtUHJvdG8gPSB3aW5kb3cuRWxlbWVudC5wcm90b3R5cGU7XG4gICAgLy8gY2hlY2sgZm9yIHRoZSBzdGFuZGFyZCBtZXRob2QgbmFtZSBmaXJzdFxuICAgIGlmICggRWxlbVByb3RvLm1hdGNoZXMgKSB7XG4gICAgICByZXR1cm4gJ21hdGNoZXMnO1xuICAgIH1cbiAgICAvLyBjaGVjayB1bi1wcmVmaXhlZFxuICAgIGlmICggRWxlbVByb3RvLm1hdGNoZXNTZWxlY3RvciApIHtcbiAgICAgIHJldHVybiAnbWF0Y2hlc1NlbGVjdG9yJztcbiAgICB9XG4gICAgLy8gY2hlY2sgdmVuZG9yIHByZWZpeGVzXG4gICAgdmFyIHByZWZpeGVzID0gWyAnd2Via2l0JywgJ21veicsICdtcycsICdvJyBdO1xuXG4gICAgZm9yICggdmFyIGk9MDsgaSA8IHByZWZpeGVzLmxlbmd0aDsgaSsrICkge1xuICAgICAgdmFyIHByZWZpeCA9IHByZWZpeGVzW2ldO1xuICAgICAgdmFyIG1ldGhvZCA9IHByZWZpeCArICdNYXRjaGVzU2VsZWN0b3InO1xuICAgICAgaWYgKCBFbGVtUHJvdG9bIG1ldGhvZCBdICkge1xuICAgICAgICByZXR1cm4gbWV0aG9kO1xuICAgICAgfVxuICAgIH1cbiAgfSkoKTtcblxuICByZXR1cm4gZnVuY3Rpb24gbWF0Y2hlc1NlbGVjdG9yKCBlbGVtLCBzZWxlY3RvciApIHtcbiAgICByZXR1cm4gZWxlbVsgbWF0Y2hlc01ldGhvZCBdKCBzZWxlY3RvciApO1xuICB9O1xuXG59KSk7XG4iLCIvKipcbiAqIEZpenp5IFVJIHV0aWxzIHYyLjAuN1xuICogTUlUIGxpY2Vuc2VcbiAqL1xuXG4vKmpzaGludCBicm93c2VyOiB0cnVlLCB1bmRlZjogdHJ1ZSwgdW51c2VkOiB0cnVlLCBzdHJpY3Q6IHRydWUgKi9cblxuKCBmdW5jdGlvbiggd2luZG93LCBmYWN0b3J5ICkge1xuICAvLyB1bml2ZXJzYWwgbW9kdWxlIGRlZmluaXRpb25cbiAgLypqc2hpbnQgc3RyaWN0OiBmYWxzZSAqLyAvKmdsb2JhbHMgZGVmaW5lLCBtb2R1bGUsIHJlcXVpcmUgKi9cblxuICBpZiAoIHR5cGVvZiBkZWZpbmUgPT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kICkge1xuICAgIC8vIEFNRFxuICAgIGRlZmluZSggW1xuICAgICAgJ2Rlc2FuZHJvLW1hdGNoZXMtc2VsZWN0b3IvbWF0Y2hlcy1zZWxlY3RvcidcbiAgICBdLCBmdW5jdGlvbiggbWF0Y2hlc1NlbGVjdG9yICkge1xuICAgICAgcmV0dXJuIGZhY3RvcnkoIHdpbmRvdywgbWF0Y2hlc1NlbGVjdG9yICk7XG4gICAgfSk7XG4gIH0gZWxzZSBpZiAoIHR5cGVvZiBtb2R1bGUgPT0gJ29iamVjdCcgJiYgbW9kdWxlLmV4cG9ydHMgKSB7XG4gICAgLy8gQ29tbW9uSlNcbiAgICBtb2R1bGUuZXhwb3J0cyA9IGZhY3RvcnkoXG4gICAgICB3aW5kb3csXG4gICAgICByZXF1aXJlKCdkZXNhbmRyby1tYXRjaGVzLXNlbGVjdG9yJylcbiAgICApO1xuICB9IGVsc2Uge1xuICAgIC8vIGJyb3dzZXIgZ2xvYmFsXG4gICAgd2luZG93LmZpenp5VUlVdGlscyA9IGZhY3RvcnkoXG4gICAgICB3aW5kb3csXG4gICAgICB3aW5kb3cubWF0Y2hlc1NlbGVjdG9yXG4gICAgKTtcbiAgfVxuXG59KCB3aW5kb3csIGZ1bmN0aW9uIGZhY3RvcnkoIHdpbmRvdywgbWF0Y2hlc1NlbGVjdG9yICkge1xuXG4ndXNlIHN0cmljdCc7XG5cbnZhciB1dGlscyA9IHt9O1xuXG4vLyAtLS0tLSBleHRlbmQgLS0tLS0gLy9cblxuLy8gZXh0ZW5kcyBvYmplY3RzXG51dGlscy5leHRlbmQgPSBmdW5jdGlvbiggYSwgYiApIHtcbiAgZm9yICggdmFyIHByb3AgaW4gYiApIHtcbiAgICBhWyBwcm9wIF0gPSBiWyBwcm9wIF07XG4gIH1cbiAgcmV0dXJuIGE7XG59O1xuXG4vLyAtLS0tLSBtb2R1bG8gLS0tLS0gLy9cblxudXRpbHMubW9kdWxvID0gZnVuY3Rpb24oIG51bSwgZGl2ICkge1xuICByZXR1cm4gKCAoIG51bSAlIGRpdiApICsgZGl2ICkgJSBkaXY7XG59O1xuXG4vLyAtLS0tLSBtYWtlQXJyYXkgLS0tLS0gLy9cblxudmFyIGFycmF5U2xpY2UgPSBBcnJheS5wcm90b3R5cGUuc2xpY2U7XG5cbi8vIHR1cm4gZWxlbWVudCBvciBub2RlTGlzdCBpbnRvIGFuIGFycmF5XG51dGlscy5tYWtlQXJyYXkgPSBmdW5jdGlvbiggb2JqICkge1xuICBpZiAoIEFycmF5LmlzQXJyYXkoIG9iaiApICkge1xuICAgIC8vIHVzZSBvYmplY3QgaWYgYWxyZWFkeSBhbiBhcnJheVxuICAgIHJldHVybiBvYmo7XG4gIH1cbiAgLy8gcmV0dXJuIGVtcHR5IGFycmF5IGlmIHVuZGVmaW5lZCBvciBudWxsLiAjNlxuICBpZiAoIG9iaiA9PT0gbnVsbCB8fCBvYmogPT09IHVuZGVmaW5lZCApIHtcbiAgICByZXR1cm4gW107XG4gIH1cblxuICB2YXIgaXNBcnJheUxpa2UgPSB0eXBlb2Ygb2JqID09ICdvYmplY3QnICYmIHR5cGVvZiBvYmoubGVuZ3RoID09ICdudW1iZXInO1xuICBpZiAoIGlzQXJyYXlMaWtlICkge1xuICAgIC8vIGNvbnZlcnQgbm9kZUxpc3QgdG8gYXJyYXlcbiAgICByZXR1cm4gYXJyYXlTbGljZS5jYWxsKCBvYmogKTtcbiAgfVxuXG4gIC8vIGFycmF5IG9mIHNpbmdsZSBpbmRleFxuICByZXR1cm4gWyBvYmogXTtcbn07XG5cbi8vIC0tLS0tIHJlbW92ZUZyb20gLS0tLS0gLy9cblxudXRpbHMucmVtb3ZlRnJvbSA9IGZ1bmN0aW9uKCBhcnksIG9iaiApIHtcbiAgdmFyIGluZGV4ID0gYXJ5LmluZGV4T2YoIG9iaiApO1xuICBpZiAoIGluZGV4ICE9IC0xICkge1xuICAgIGFyeS5zcGxpY2UoIGluZGV4LCAxICk7XG4gIH1cbn07XG5cbi8vIC0tLS0tIGdldFBhcmVudCAtLS0tLSAvL1xuXG51dGlscy5nZXRQYXJlbnQgPSBmdW5jdGlvbiggZWxlbSwgc2VsZWN0b3IgKSB7XG4gIHdoaWxlICggZWxlbS5wYXJlbnROb2RlICYmIGVsZW0gIT0gZG9jdW1lbnQuYm9keSApIHtcbiAgICBlbGVtID0gZWxlbS5wYXJlbnROb2RlO1xuICAgIGlmICggbWF0Y2hlc1NlbGVjdG9yKCBlbGVtLCBzZWxlY3RvciApICkge1xuICAgICAgcmV0dXJuIGVsZW07XG4gICAgfVxuICB9XG59O1xuXG4vLyAtLS0tLSBnZXRRdWVyeUVsZW1lbnQgLS0tLS0gLy9cblxuLy8gdXNlIGVsZW1lbnQgYXMgc2VsZWN0b3Igc3RyaW5nXG51dGlscy5nZXRRdWVyeUVsZW1lbnQgPSBmdW5jdGlvbiggZWxlbSApIHtcbiAgaWYgKCB0eXBlb2YgZWxlbSA9PSAnc3RyaW5nJyApIHtcbiAgICByZXR1cm4gZG9jdW1lbnQucXVlcnlTZWxlY3RvciggZWxlbSApO1xuICB9XG4gIHJldHVybiBlbGVtO1xufTtcblxuLy8gLS0tLS0gaGFuZGxlRXZlbnQgLS0tLS0gLy9cblxuLy8gZW5hYmxlIC5vbnR5cGUgdG8gdHJpZ2dlciBmcm9tIC5hZGRFdmVudExpc3RlbmVyKCBlbGVtLCAndHlwZScgKVxudXRpbHMuaGFuZGxlRXZlbnQgPSBmdW5jdGlvbiggZXZlbnQgKSB7XG4gIHZhciBtZXRob2QgPSAnb24nICsgZXZlbnQudHlwZTtcbiAgaWYgKCB0aGlzWyBtZXRob2QgXSApIHtcbiAgICB0aGlzWyBtZXRob2QgXSggZXZlbnQgKTtcbiAgfVxufTtcblxuLy8gLS0tLS0gZmlsdGVyRmluZEVsZW1lbnRzIC0tLS0tIC8vXG5cbnV0aWxzLmZpbHRlckZpbmRFbGVtZW50cyA9IGZ1bmN0aW9uKCBlbGVtcywgc2VsZWN0b3IgKSB7XG4gIC8vIG1ha2UgYXJyYXkgb2YgZWxlbXNcbiAgZWxlbXMgPSB1dGlscy5tYWtlQXJyYXkoIGVsZW1zICk7XG4gIHZhciBmZkVsZW1zID0gW107XG5cbiAgZWxlbXMuZm9yRWFjaCggZnVuY3Rpb24oIGVsZW0gKSB7XG4gICAgLy8gY2hlY2sgdGhhdCBlbGVtIGlzIGFuIGFjdHVhbCBlbGVtZW50XG4gICAgaWYgKCAhKCBlbGVtIGluc3RhbmNlb2YgSFRNTEVsZW1lbnQgKSApIHtcbiAgICAgIHJldHVybjtcbiAgICB9XG4gICAgLy8gYWRkIGVsZW0gaWYgbm8gc2VsZWN0b3JcbiAgICBpZiAoICFzZWxlY3RvciApIHtcbiAgICAgIGZmRWxlbXMucHVzaCggZWxlbSApO1xuICAgICAgcmV0dXJuO1xuICAgIH1cbiAgICAvLyBmaWx0ZXIgJiBmaW5kIGl0ZW1zIGlmIHdlIGhhdmUgYSBzZWxlY3RvclxuICAgIC8vIGZpbHRlclxuICAgIGlmICggbWF0Y2hlc1NlbGVjdG9yKCBlbGVtLCBzZWxlY3RvciApICkge1xuICAgICAgZmZFbGVtcy5wdXNoKCBlbGVtICk7XG4gICAgfVxuICAgIC8vIGZpbmQgY2hpbGRyZW5cbiAgICB2YXIgY2hpbGRFbGVtcyA9IGVsZW0ucXVlcnlTZWxlY3RvckFsbCggc2VsZWN0b3IgKTtcbiAgICAvLyBjb25jYXQgY2hpbGRFbGVtcyB0byBmaWx0ZXJGb3VuZCBhcnJheVxuICAgIGZvciAoIHZhciBpPTA7IGkgPCBjaGlsZEVsZW1zLmxlbmd0aDsgaSsrICkge1xuICAgICAgZmZFbGVtcy5wdXNoKCBjaGlsZEVsZW1zW2ldICk7XG4gICAgfVxuICB9KTtcblxuICByZXR1cm4gZmZFbGVtcztcbn07XG5cbi8vIC0tLS0tIGRlYm91bmNlTWV0aG9kIC0tLS0tIC8vXG5cbnV0aWxzLmRlYm91bmNlTWV0aG9kID0gZnVuY3Rpb24oIF9jbGFzcywgbWV0aG9kTmFtZSwgdGhyZXNob2xkICkge1xuICB0aHJlc2hvbGQgPSB0aHJlc2hvbGQgfHwgMTAwO1xuICAvLyBvcmlnaW5hbCBtZXRob2RcbiAgdmFyIG1ldGhvZCA9IF9jbGFzcy5wcm90b3R5cGVbIG1ldGhvZE5hbWUgXTtcbiAgdmFyIHRpbWVvdXROYW1lID0gbWV0aG9kTmFtZSArICdUaW1lb3V0JztcblxuICBfY2xhc3MucHJvdG90eXBlWyBtZXRob2ROYW1lIF0gPSBmdW5jdGlvbigpIHtcbiAgICB2YXIgdGltZW91dCA9IHRoaXNbIHRpbWVvdXROYW1lIF07XG4gICAgY2xlYXJUaW1lb3V0KCB0aW1lb3V0ICk7XG5cbiAgICB2YXIgYXJncyA9IGFyZ3VtZW50cztcbiAgICB2YXIgX3RoaXMgPSB0aGlzO1xuICAgIHRoaXNbIHRpbWVvdXROYW1lIF0gPSBzZXRUaW1lb3V0KCBmdW5jdGlvbigpIHtcbiAgICAgIG1ldGhvZC5hcHBseSggX3RoaXMsIGFyZ3MgKTtcbiAgICAgIGRlbGV0ZSBfdGhpc1sgdGltZW91dE5hbWUgXTtcbiAgICB9LCB0aHJlc2hvbGQgKTtcbiAgfTtcbn07XG5cbi8vIC0tLS0tIGRvY1JlYWR5IC0tLS0tIC8vXG5cbnV0aWxzLmRvY1JlYWR5ID0gZnVuY3Rpb24oIGNhbGxiYWNrICkge1xuICB2YXIgcmVhZHlTdGF0ZSA9IGRvY3VtZW50LnJlYWR5U3RhdGU7XG4gIGlmICggcmVhZHlTdGF0ZSA9PSAnY29tcGxldGUnIHx8IHJlYWR5U3RhdGUgPT0gJ2ludGVyYWN0aXZlJyApIHtcbiAgICAvLyBkbyBhc3luYyB0byBhbGxvdyBmb3Igb3RoZXIgc2NyaXB0cyB0byBydW4uIG1ldGFmaXp6eS9mbGlja2l0eSM0NDFcbiAgICBzZXRUaW1lb3V0KCBjYWxsYmFjayApO1xuICB9IGVsc2Uge1xuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoICdET01Db250ZW50TG9hZGVkJywgY2FsbGJhY2sgKTtcbiAgfVxufTtcblxuLy8gLS0tLS0gaHRtbEluaXQgLS0tLS0gLy9cblxuLy8gaHR0cDovL2phbWVzcm9iZXJ0cy5uYW1lL2Jsb2cvMjAxMC8wMi8yMi9zdHJpbmctZnVuY3Rpb25zLWZvci1qYXZhc2NyaXB0LXRyaW0tdG8tY2FtZWwtY2FzZS10by1kYXNoZWQtYW5kLXRvLXVuZGVyc2NvcmUvXG51dGlscy50b0Rhc2hlZCA9IGZ1bmN0aW9uKCBzdHIgKSB7XG4gIHJldHVybiBzdHIucmVwbGFjZSggLyguKShbQS1aXSkvZywgZnVuY3Rpb24oIG1hdGNoLCAkMSwgJDIgKSB7XG4gICAgcmV0dXJuICQxICsgJy0nICsgJDI7XG4gIH0pLnRvTG93ZXJDYXNlKCk7XG59O1xuXG52YXIgY29uc29sZSA9IHdpbmRvdy5jb25zb2xlO1xuLyoqXG4gKiBhbGxvdyB1c2VyIHRvIGluaXRpYWxpemUgY2xhc3NlcyB2aWEgW2RhdGEtbmFtZXNwYWNlXSBvciAuanMtbmFtZXNwYWNlIGNsYXNzXG4gKiBodG1sSW5pdCggV2lkZ2V0LCAnd2lkZ2V0TmFtZScgKVxuICogb3B0aW9ucyBhcmUgcGFyc2VkIGZyb20gZGF0YS1uYW1lc3BhY2Utb3B0aW9uc1xuICovXG51dGlscy5odG1sSW5pdCA9IGZ1bmN0aW9uKCBXaWRnZXRDbGFzcywgbmFtZXNwYWNlICkge1xuICB1dGlscy5kb2NSZWFkeSggZnVuY3Rpb24oKSB7XG4gICAgdmFyIGRhc2hlZE5hbWVzcGFjZSA9IHV0aWxzLnRvRGFzaGVkKCBuYW1lc3BhY2UgKTtcbiAgICB2YXIgZGF0YUF0dHIgPSAnZGF0YS0nICsgZGFzaGVkTmFtZXNwYWNlO1xuICAgIHZhciBkYXRhQXR0ckVsZW1zID0gZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbCggJ1snICsgZGF0YUF0dHIgKyAnXScgKTtcbiAgICB2YXIganNEYXNoRWxlbXMgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yQWxsKCAnLmpzLScgKyBkYXNoZWROYW1lc3BhY2UgKTtcbiAgICB2YXIgZWxlbXMgPSB1dGlscy5tYWtlQXJyYXkoIGRhdGFBdHRyRWxlbXMgKVxuICAgICAgLmNvbmNhdCggdXRpbHMubWFrZUFycmF5KCBqc0Rhc2hFbGVtcyApICk7XG4gICAgdmFyIGRhdGFPcHRpb25zQXR0ciA9IGRhdGFBdHRyICsgJy1vcHRpb25zJztcbiAgICB2YXIgalF1ZXJ5ID0gd2luZG93LmpRdWVyeTtcblxuICAgIGVsZW1zLmZvckVhY2goIGZ1bmN0aW9uKCBlbGVtICkge1xuICAgICAgdmFyIGF0dHIgPSBlbGVtLmdldEF0dHJpYnV0ZSggZGF0YUF0dHIgKSB8fFxuICAgICAgICBlbGVtLmdldEF0dHJpYnV0ZSggZGF0YU9wdGlvbnNBdHRyICk7XG4gICAgICB2YXIgb3B0aW9ucztcbiAgICAgIHRyeSB7XG4gICAgICAgIG9wdGlvbnMgPSBhdHRyICYmIEpTT04ucGFyc2UoIGF0dHIgKTtcbiAgICAgIH0gY2F0Y2ggKCBlcnJvciApIHtcbiAgICAgICAgLy8gbG9nIGVycm9yLCBkbyBub3QgaW5pdGlhbGl6ZVxuICAgICAgICBpZiAoIGNvbnNvbGUgKSB7XG4gICAgICAgICAgY29uc29sZS5lcnJvciggJ0Vycm9yIHBhcnNpbmcgJyArIGRhdGFBdHRyICsgJyBvbiAnICsgZWxlbS5jbGFzc05hbWUgK1xuICAgICAgICAgICc6ICcgKyBlcnJvciApO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybjtcbiAgICAgIH1cbiAgICAgIC8vIGluaXRpYWxpemVcbiAgICAgIHZhciBpbnN0YW5jZSA9IG5ldyBXaWRnZXRDbGFzcyggZWxlbSwgb3B0aW9ucyApO1xuICAgICAgLy8gbWFrZSBhdmFpbGFibGUgdmlhICQoKS5kYXRhKCduYW1lc3BhY2UnKVxuICAgICAgaWYgKCBqUXVlcnkgKSB7XG4gICAgICAgIGpRdWVyeS5kYXRhKCBlbGVtLCBuYW1lc3BhY2UsIGluc3RhbmNlICk7XG4gICAgICB9XG4gICAgfSk7XG5cbiAgfSk7XG59O1xuXG4vLyAtLS0tLSAgLS0tLS0gLy9cblxucmV0dXJuIHV0aWxzO1xuXG59KSk7XG4iLCIvKiFcbiAqIE91dGxheWVyIHYyLjEuMVxuICogdGhlIGJyYWlucyBhbmQgZ3V0cyBvZiBhIGxheW91dCBsaWJyYXJ5XG4gKiBNSVQgbGljZW5zZVxuICovXG5cbiggZnVuY3Rpb24oIHdpbmRvdywgZmFjdG9yeSApIHtcbiAgJ3VzZSBzdHJpY3QnO1xuICAvLyB1bml2ZXJzYWwgbW9kdWxlIGRlZmluaXRpb25cbiAgLyoganNoaW50IHN0cmljdDogZmFsc2UgKi8gLyogZ2xvYmFscyBkZWZpbmUsIG1vZHVsZSwgcmVxdWlyZSAqL1xuICBpZiAoIHR5cGVvZiBkZWZpbmUgPT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kICkge1xuICAgIC8vIEFNRCAtIFJlcXVpcmVKU1xuICAgIGRlZmluZSggW1xuICAgICAgICAnZXYtZW1pdHRlci9ldi1lbWl0dGVyJyxcbiAgICAgICAgJ2dldC1zaXplL2dldC1zaXplJyxcbiAgICAgICAgJ2Zpenp5LXVpLXV0aWxzL3V0aWxzJyxcbiAgICAgICAgJy4vaXRlbSdcbiAgICAgIF0sXG4gICAgICBmdW5jdGlvbiggRXZFbWl0dGVyLCBnZXRTaXplLCB1dGlscywgSXRlbSApIHtcbiAgICAgICAgcmV0dXJuIGZhY3RvcnkoIHdpbmRvdywgRXZFbWl0dGVyLCBnZXRTaXplLCB1dGlscywgSXRlbSk7XG4gICAgICB9XG4gICAgKTtcbiAgfSBlbHNlIGlmICggdHlwZW9mIG1vZHVsZSA9PSAnb2JqZWN0JyAmJiBtb2R1bGUuZXhwb3J0cyApIHtcbiAgICAvLyBDb21tb25KUyAtIEJyb3dzZXJpZnksIFdlYnBhY2tcbiAgICBtb2R1bGUuZXhwb3J0cyA9IGZhY3RvcnkoXG4gICAgICB3aW5kb3csXG4gICAgICByZXF1aXJlKCdldi1lbWl0dGVyJyksXG4gICAgICByZXF1aXJlKCdnZXQtc2l6ZScpLFxuICAgICAgcmVxdWlyZSgnZml6enktdWktdXRpbHMnKSxcbiAgICAgIHJlcXVpcmUoJy4vaXRlbScpXG4gICAgKTtcbiAgfSBlbHNlIHtcbiAgICAvLyBicm93c2VyIGdsb2JhbFxuICAgIHdpbmRvdy5PdXRsYXllciA9IGZhY3RvcnkoXG4gICAgICB3aW5kb3csXG4gICAgICB3aW5kb3cuRXZFbWl0dGVyLFxuICAgICAgd2luZG93LmdldFNpemUsXG4gICAgICB3aW5kb3cuZml6enlVSVV0aWxzLFxuICAgICAgd2luZG93Lk91dGxheWVyLkl0ZW1cbiAgICApO1xuICB9XG5cbn0oIHdpbmRvdywgZnVuY3Rpb24gZmFjdG9yeSggd2luZG93LCBFdkVtaXR0ZXIsIGdldFNpemUsIHV0aWxzLCBJdGVtICkge1xuJ3VzZSBzdHJpY3QnO1xuXG4vLyAtLS0tLSB2YXJzIC0tLS0tIC8vXG5cbnZhciBjb25zb2xlID0gd2luZG93LmNvbnNvbGU7XG52YXIgalF1ZXJ5ID0gd2luZG93LmpRdWVyeTtcbnZhciBub29wID0gZnVuY3Rpb24oKSB7fTtcblxuLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gT3V0bGF5ZXIgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gLy9cblxuLy8gZ2xvYmFsbHkgdW5pcXVlIGlkZW50aWZpZXJzXG52YXIgR1VJRCA9IDA7XG4vLyBpbnRlcm5hbCBzdG9yZSBvZiBhbGwgT3V0bGF5ZXIgaW50YW5jZXNcbnZhciBpbnN0YW5jZXMgPSB7fTtcblxuXG4vKipcbiAqIEBwYXJhbSB7RWxlbWVudCwgU3RyaW5nfSBlbGVtZW50XG4gKiBAcGFyYW0ge09iamVjdH0gb3B0aW9uc1xuICogQGNvbnN0cnVjdG9yXG4gKi9cbmZ1bmN0aW9uIE91dGxheWVyKCBlbGVtZW50LCBvcHRpb25zICkge1xuICB2YXIgcXVlcnlFbGVtZW50ID0gdXRpbHMuZ2V0UXVlcnlFbGVtZW50KCBlbGVtZW50ICk7XG4gIGlmICggIXF1ZXJ5RWxlbWVudCApIHtcbiAgICBpZiAoIGNvbnNvbGUgKSB7XG4gICAgICBjb25zb2xlLmVycm9yKCAnQmFkIGVsZW1lbnQgZm9yICcgKyB0aGlzLmNvbnN0cnVjdG9yLm5hbWVzcGFjZSArXG4gICAgICAgICc6ICcgKyAoIHF1ZXJ5RWxlbWVudCB8fCBlbGVtZW50ICkgKTtcbiAgICB9XG4gICAgcmV0dXJuO1xuICB9XG4gIHRoaXMuZWxlbWVudCA9IHF1ZXJ5RWxlbWVudDtcbiAgLy8gYWRkIGpRdWVyeVxuICBpZiAoIGpRdWVyeSApIHtcbiAgICB0aGlzLiRlbGVtZW50ID0galF1ZXJ5KCB0aGlzLmVsZW1lbnQgKTtcbiAgfVxuXG4gIC8vIG9wdGlvbnNcbiAgdGhpcy5vcHRpb25zID0gdXRpbHMuZXh0ZW5kKCB7fSwgdGhpcy5jb25zdHJ1Y3Rvci5kZWZhdWx0cyApO1xuICB0aGlzLm9wdGlvbiggb3B0aW9ucyApO1xuXG4gIC8vIGFkZCBpZCBmb3IgT3V0bGF5ZXIuZ2V0RnJvbUVsZW1lbnRcbiAgdmFyIGlkID0gKytHVUlEO1xuICB0aGlzLmVsZW1lbnQub3V0bGF5ZXJHVUlEID0gaWQ7IC8vIGV4cGFuZG9cbiAgaW5zdGFuY2VzWyBpZCBdID0gdGhpczsgLy8gYXNzb2NpYXRlIHZpYSBpZFxuXG4gIC8vIGtpY2sgaXQgb2ZmXG4gIHRoaXMuX2NyZWF0ZSgpO1xuXG4gIHZhciBpc0luaXRMYXlvdXQgPSB0aGlzLl9nZXRPcHRpb24oJ2luaXRMYXlvdXQnKTtcbiAgaWYgKCBpc0luaXRMYXlvdXQgKSB7XG4gICAgdGhpcy5sYXlvdXQoKTtcbiAgfVxufVxuXG4vLyBzZXR0aW5ncyBhcmUgZm9yIGludGVybmFsIHVzZSBvbmx5XG5PdXRsYXllci5uYW1lc3BhY2UgPSAnb3V0bGF5ZXInO1xuT3V0bGF5ZXIuSXRlbSA9IEl0ZW07XG5cbi8vIGRlZmF1bHQgb3B0aW9uc1xuT3V0bGF5ZXIuZGVmYXVsdHMgPSB7XG4gIGNvbnRhaW5lclN0eWxlOiB7XG4gICAgcG9zaXRpb246ICdyZWxhdGl2ZSdcbiAgfSxcbiAgaW5pdExheW91dDogdHJ1ZSxcbiAgb3JpZ2luTGVmdDogdHJ1ZSxcbiAgb3JpZ2luVG9wOiB0cnVlLFxuICByZXNpemU6IHRydWUsXG4gIHJlc2l6ZUNvbnRhaW5lcjogdHJ1ZSxcbiAgLy8gaXRlbSBvcHRpb25zXG4gIHRyYW5zaXRpb25EdXJhdGlvbjogJzAuNHMnLFxuICBoaWRkZW5TdHlsZToge1xuICAgIG9wYWNpdHk6IDAsXG4gICAgdHJhbnNmb3JtOiAnc2NhbGUoMC4wMDEpJ1xuICB9LFxuICB2aXNpYmxlU3R5bGU6IHtcbiAgICBvcGFjaXR5OiAxLFxuICAgIHRyYW5zZm9ybTogJ3NjYWxlKDEpJ1xuICB9XG59O1xuXG52YXIgcHJvdG8gPSBPdXRsYXllci5wcm90b3R5cGU7XG4vLyBpbmhlcml0IEV2RW1pdHRlclxudXRpbHMuZXh0ZW5kKCBwcm90bywgRXZFbWl0dGVyLnByb3RvdHlwZSApO1xuXG4vKipcbiAqIHNldCBvcHRpb25zXG4gKiBAcGFyYW0ge09iamVjdH0gb3B0c1xuICovXG5wcm90by5vcHRpb24gPSBmdW5jdGlvbiggb3B0cyApIHtcbiAgdXRpbHMuZXh0ZW5kKCB0aGlzLm9wdGlvbnMsIG9wdHMgKTtcbn07XG5cbi8qKlxuICogZ2V0IGJhY2t3YXJkcyBjb21wYXRpYmxlIG9wdGlvbiB2YWx1ZSwgY2hlY2sgb2xkIG5hbWVcbiAqL1xucHJvdG8uX2dldE9wdGlvbiA9IGZ1bmN0aW9uKCBvcHRpb24gKSB7XG4gIHZhciBvbGRPcHRpb24gPSB0aGlzLmNvbnN0cnVjdG9yLmNvbXBhdE9wdGlvbnNbIG9wdGlvbiBdO1xuICByZXR1cm4gb2xkT3B0aW9uICYmIHRoaXMub3B0aW9uc1sgb2xkT3B0aW9uIF0gIT09IHVuZGVmaW5lZCA/XG4gICAgdGhpcy5vcHRpb25zWyBvbGRPcHRpb24gXSA6IHRoaXMub3B0aW9uc1sgb3B0aW9uIF07XG59O1xuXG5PdXRsYXllci5jb21wYXRPcHRpb25zID0ge1xuICAvLyBjdXJyZW50TmFtZTogb2xkTmFtZVxuICBpbml0TGF5b3V0OiAnaXNJbml0TGF5b3V0JyxcbiAgaG9yaXpvbnRhbDogJ2lzSG9yaXpvbnRhbCcsXG4gIGxheW91dEluc3RhbnQ6ICdpc0xheW91dEluc3RhbnQnLFxuICBvcmlnaW5MZWZ0OiAnaXNPcmlnaW5MZWZ0JyxcbiAgb3JpZ2luVG9wOiAnaXNPcmlnaW5Ub3AnLFxuICByZXNpemU6ICdpc1Jlc2l6ZUJvdW5kJyxcbiAgcmVzaXplQ29udGFpbmVyOiAnaXNSZXNpemluZ0NvbnRhaW5lcidcbn07XG5cbnByb3RvLl9jcmVhdGUgPSBmdW5jdGlvbigpIHtcbiAgLy8gZ2V0IGl0ZW1zIGZyb20gY2hpbGRyZW5cbiAgdGhpcy5yZWxvYWRJdGVtcygpO1xuICAvLyBlbGVtZW50cyB0aGF0IGFmZmVjdCBsYXlvdXQsIGJ1dCBhcmUgbm90IGxhaWQgb3V0XG4gIHRoaXMuc3RhbXBzID0gW107XG4gIHRoaXMuc3RhbXAoIHRoaXMub3B0aW9ucy5zdGFtcCApO1xuICAvLyBzZXQgY29udGFpbmVyIHN0eWxlXG4gIHV0aWxzLmV4dGVuZCggdGhpcy5lbGVtZW50LnN0eWxlLCB0aGlzLm9wdGlvbnMuY29udGFpbmVyU3R5bGUgKTtcblxuICAvLyBiaW5kIHJlc2l6ZSBtZXRob2RcbiAgdmFyIGNhbkJpbmRSZXNpemUgPSB0aGlzLl9nZXRPcHRpb24oJ3Jlc2l6ZScpO1xuICBpZiAoIGNhbkJpbmRSZXNpemUgKSB7XG4gICAgdGhpcy5iaW5kUmVzaXplKCk7XG4gIH1cbn07XG5cbi8vIGdvZXMgdGhyb3VnaCBhbGwgY2hpbGRyZW4gYWdhaW4gYW5kIGdldHMgYnJpY2tzIGluIHByb3BlciBvcmRlclxucHJvdG8ucmVsb2FkSXRlbXMgPSBmdW5jdGlvbigpIHtcbiAgLy8gY29sbGVjdGlvbiBvZiBpdGVtIGVsZW1lbnRzXG4gIHRoaXMuaXRlbXMgPSB0aGlzLl9pdGVtaXplKCB0aGlzLmVsZW1lbnQuY2hpbGRyZW4gKTtcbn07XG5cblxuLyoqXG4gKiB0dXJuIGVsZW1lbnRzIGludG8gT3V0bGF5ZXIuSXRlbXMgdG8gYmUgdXNlZCBpbiBsYXlvdXRcbiAqIEBwYXJhbSB7QXJyYXkgb3IgTm9kZUxpc3Qgb3IgSFRNTEVsZW1lbnR9IGVsZW1zXG4gKiBAcmV0dXJucyB7QXJyYXl9IGl0ZW1zIC0gY29sbGVjdGlvbiBvZiBuZXcgT3V0bGF5ZXIgSXRlbXNcbiAqL1xucHJvdG8uX2l0ZW1pemUgPSBmdW5jdGlvbiggZWxlbXMgKSB7XG5cbiAgdmFyIGl0ZW1FbGVtcyA9IHRoaXMuX2ZpbHRlckZpbmRJdGVtRWxlbWVudHMoIGVsZW1zICk7XG4gIHZhciBJdGVtID0gdGhpcy5jb25zdHJ1Y3Rvci5JdGVtO1xuXG4gIC8vIGNyZWF0ZSBuZXcgT3V0bGF5ZXIgSXRlbXMgZm9yIGNvbGxlY3Rpb25cbiAgdmFyIGl0ZW1zID0gW107XG4gIGZvciAoIHZhciBpPTA7IGkgPCBpdGVtRWxlbXMubGVuZ3RoOyBpKysgKSB7XG4gICAgdmFyIGVsZW0gPSBpdGVtRWxlbXNbaV07XG4gICAgdmFyIGl0ZW0gPSBuZXcgSXRlbSggZWxlbSwgdGhpcyApO1xuICAgIGl0ZW1zLnB1c2goIGl0ZW0gKTtcbiAgfVxuXG4gIHJldHVybiBpdGVtcztcbn07XG5cbi8qKlxuICogZ2V0IGl0ZW0gZWxlbWVudHMgdG8gYmUgdXNlZCBpbiBsYXlvdXRcbiAqIEBwYXJhbSB7QXJyYXkgb3IgTm9kZUxpc3Qgb3IgSFRNTEVsZW1lbnR9IGVsZW1zXG4gKiBAcmV0dXJucyB7QXJyYXl9IGl0ZW1zIC0gaXRlbSBlbGVtZW50c1xuICovXG5wcm90by5fZmlsdGVyRmluZEl0ZW1FbGVtZW50cyA9IGZ1bmN0aW9uKCBlbGVtcyApIHtcbiAgcmV0dXJuIHV0aWxzLmZpbHRlckZpbmRFbGVtZW50cyggZWxlbXMsIHRoaXMub3B0aW9ucy5pdGVtU2VsZWN0b3IgKTtcbn07XG5cbi8qKlxuICogZ2V0dGVyIG1ldGhvZCBmb3IgZ2V0dGluZyBpdGVtIGVsZW1lbnRzXG4gKiBAcmV0dXJucyB7QXJyYXl9IGVsZW1zIC0gY29sbGVjdGlvbiBvZiBpdGVtIGVsZW1lbnRzXG4gKi9cbnByb3RvLmdldEl0ZW1FbGVtZW50cyA9IGZ1bmN0aW9uKCkge1xuICByZXR1cm4gdGhpcy5pdGVtcy5tYXAoIGZ1bmN0aW9uKCBpdGVtICkge1xuICAgIHJldHVybiBpdGVtLmVsZW1lbnQ7XG4gIH0pO1xufTtcblxuLy8gLS0tLS0gaW5pdCAmIGxheW91dCAtLS0tLSAvL1xuXG4vKipcbiAqIGxheXMgb3V0IGFsbCBpdGVtc1xuICovXG5wcm90by5sYXlvdXQgPSBmdW5jdGlvbigpIHtcbiAgdGhpcy5fcmVzZXRMYXlvdXQoKTtcbiAgdGhpcy5fbWFuYWdlU3RhbXBzKCk7XG5cbiAgLy8gZG9uJ3QgYW5pbWF0ZSBmaXJzdCBsYXlvdXRcbiAgdmFyIGxheW91dEluc3RhbnQgPSB0aGlzLl9nZXRPcHRpb24oJ2xheW91dEluc3RhbnQnKTtcbiAgdmFyIGlzSW5zdGFudCA9IGxheW91dEluc3RhbnQgIT09IHVuZGVmaW5lZCA/XG4gICAgbGF5b3V0SW5zdGFudCA6ICF0aGlzLl9pc0xheW91dEluaXRlZDtcbiAgdGhpcy5sYXlvdXRJdGVtcyggdGhpcy5pdGVtcywgaXNJbnN0YW50ICk7XG5cbiAgLy8gZmxhZyBmb3IgaW5pdGFsaXplZFxuICB0aGlzLl9pc0xheW91dEluaXRlZCA9IHRydWU7XG59O1xuXG4vLyBfaW5pdCBpcyBhbGlhcyBmb3IgbGF5b3V0XG5wcm90by5faW5pdCA9IHByb3RvLmxheW91dDtcblxuLyoqXG4gKiBsb2dpYyBiZWZvcmUgYW55IG5ldyBsYXlvdXRcbiAqL1xucHJvdG8uX3Jlc2V0TGF5b3V0ID0gZnVuY3Rpb24oKSB7XG4gIHRoaXMuZ2V0U2l6ZSgpO1xufTtcblxuXG5wcm90by5nZXRTaXplID0gZnVuY3Rpb24oKSB7XG4gIHRoaXMuc2l6ZSA9IGdldFNpemUoIHRoaXMuZWxlbWVudCApO1xufTtcblxuLyoqXG4gKiBnZXQgbWVhc3VyZW1lbnQgZnJvbSBvcHRpb24sIGZvciBjb2x1bW5XaWR0aCwgcm93SGVpZ2h0LCBndXR0ZXJcbiAqIGlmIG9wdGlvbiBpcyBTdHJpbmcgLT4gZ2V0IGVsZW1lbnQgZnJvbSBzZWxlY3RvciBzdHJpbmcsICYgZ2V0IHNpemUgb2YgZWxlbWVudFxuICogaWYgb3B0aW9uIGlzIEVsZW1lbnQgLT4gZ2V0IHNpemUgb2YgZWxlbWVudFxuICogZWxzZSB1c2Ugb3B0aW9uIGFzIGEgbnVtYmVyXG4gKlxuICogQHBhcmFtIHtTdHJpbmd9IG1lYXN1cmVtZW50XG4gKiBAcGFyYW0ge1N0cmluZ30gc2l6ZSAtIHdpZHRoIG9yIGhlaWdodFxuICogQHByaXZhdGVcbiAqL1xucHJvdG8uX2dldE1lYXN1cmVtZW50ID0gZnVuY3Rpb24oIG1lYXN1cmVtZW50LCBzaXplICkge1xuICB2YXIgb3B0aW9uID0gdGhpcy5vcHRpb25zWyBtZWFzdXJlbWVudCBdO1xuICB2YXIgZWxlbTtcbiAgaWYgKCAhb3B0aW9uICkge1xuICAgIC8vIGRlZmF1bHQgdG8gMFxuICAgIHRoaXNbIG1lYXN1cmVtZW50IF0gPSAwO1xuICB9IGVsc2Uge1xuICAgIC8vIHVzZSBvcHRpb24gYXMgYW4gZWxlbWVudFxuICAgIGlmICggdHlwZW9mIG9wdGlvbiA9PSAnc3RyaW5nJyApIHtcbiAgICAgIGVsZW0gPSB0aGlzLmVsZW1lbnQucXVlcnlTZWxlY3Rvciggb3B0aW9uICk7XG4gICAgfSBlbHNlIGlmICggb3B0aW9uIGluc3RhbmNlb2YgSFRNTEVsZW1lbnQgKSB7XG4gICAgICBlbGVtID0gb3B0aW9uO1xuICAgIH1cbiAgICAvLyB1c2Ugc2l6ZSBvZiBlbGVtZW50LCBpZiBlbGVtZW50XG4gICAgdGhpc1sgbWVhc3VyZW1lbnQgXSA9IGVsZW0gPyBnZXRTaXplKCBlbGVtIClbIHNpemUgXSA6IG9wdGlvbjtcbiAgfVxufTtcblxuLyoqXG4gKiBsYXlvdXQgYSBjb2xsZWN0aW9uIG9mIGl0ZW0gZWxlbWVudHNcbiAqIEBhcGkgcHVibGljXG4gKi9cbnByb3RvLmxheW91dEl0ZW1zID0gZnVuY3Rpb24oIGl0ZW1zLCBpc0luc3RhbnQgKSB7XG4gIGl0ZW1zID0gdGhpcy5fZ2V0SXRlbXNGb3JMYXlvdXQoIGl0ZW1zICk7XG5cbiAgdGhpcy5fbGF5b3V0SXRlbXMoIGl0ZW1zLCBpc0luc3RhbnQgKTtcblxuICB0aGlzLl9wb3N0TGF5b3V0KCk7XG59O1xuXG4vKipcbiAqIGdldCB0aGUgaXRlbXMgdG8gYmUgbGFpZCBvdXRcbiAqIHlvdSBtYXkgd2FudCB0byBza2lwIG92ZXIgc29tZSBpdGVtc1xuICogQHBhcmFtIHtBcnJheX0gaXRlbXNcbiAqIEByZXR1cm5zIHtBcnJheX0gaXRlbXNcbiAqL1xucHJvdG8uX2dldEl0ZW1zRm9yTGF5b3V0ID0gZnVuY3Rpb24oIGl0ZW1zICkge1xuICByZXR1cm4gaXRlbXMuZmlsdGVyKCBmdW5jdGlvbiggaXRlbSApIHtcbiAgICByZXR1cm4gIWl0ZW0uaXNJZ25vcmVkO1xuICB9KTtcbn07XG5cbi8qKlxuICogbGF5b3V0IGl0ZW1zXG4gKiBAcGFyYW0ge0FycmF5fSBpdGVtc1xuICogQHBhcmFtIHtCb29sZWFufSBpc0luc3RhbnRcbiAqL1xucHJvdG8uX2xheW91dEl0ZW1zID0gZnVuY3Rpb24oIGl0ZW1zLCBpc0luc3RhbnQgKSB7XG4gIHRoaXMuX2VtaXRDb21wbGV0ZU9uSXRlbXMoICdsYXlvdXQnLCBpdGVtcyApO1xuXG4gIGlmICggIWl0ZW1zIHx8ICFpdGVtcy5sZW5ndGggKSB7XG4gICAgLy8gbm8gaXRlbXMsIGVtaXQgZXZlbnQgd2l0aCBlbXB0eSBhcnJheVxuICAgIHJldHVybjtcbiAgfVxuXG4gIHZhciBxdWV1ZSA9IFtdO1xuXG4gIGl0ZW1zLmZvckVhY2goIGZ1bmN0aW9uKCBpdGVtICkge1xuICAgIC8vIGdldCB4L3kgb2JqZWN0IGZyb20gbWV0aG9kXG4gICAgdmFyIHBvc2l0aW9uID0gdGhpcy5fZ2V0SXRlbUxheW91dFBvc2l0aW9uKCBpdGVtICk7XG4gICAgLy8gZW5xdWV1ZVxuICAgIHBvc2l0aW9uLml0ZW0gPSBpdGVtO1xuICAgIHBvc2l0aW9uLmlzSW5zdGFudCA9IGlzSW5zdGFudCB8fCBpdGVtLmlzTGF5b3V0SW5zdGFudDtcbiAgICBxdWV1ZS5wdXNoKCBwb3NpdGlvbiApO1xuICB9LCB0aGlzICk7XG5cbiAgdGhpcy5fcHJvY2Vzc0xheW91dFF1ZXVlKCBxdWV1ZSApO1xufTtcblxuLyoqXG4gKiBnZXQgaXRlbSBsYXlvdXQgcG9zaXRpb25cbiAqIEBwYXJhbSB7T3V0bGF5ZXIuSXRlbX0gaXRlbVxuICogQHJldHVybnMge09iamVjdH0geCBhbmQgeSBwb3NpdGlvblxuICovXG5wcm90by5fZ2V0SXRlbUxheW91dFBvc2l0aW9uID0gZnVuY3Rpb24oIC8qIGl0ZW0gKi8gKSB7XG4gIHJldHVybiB7XG4gICAgeDogMCxcbiAgICB5OiAwXG4gIH07XG59O1xuXG4vKipcbiAqIGl0ZXJhdGUgb3ZlciBhcnJheSBhbmQgcG9zaXRpb24gZWFjaCBpdGVtXG4gKiBSZWFzb24gYmVpbmcgLSBzZXBhcmF0aW5nIHRoaXMgbG9naWMgcHJldmVudHMgJ2xheW91dCBpbnZhbGlkYXRpb24nXG4gKiB0aHggQHBhdWxfaXJpc2hcbiAqIEBwYXJhbSB7QXJyYXl9IHF1ZXVlXG4gKi9cbnByb3RvLl9wcm9jZXNzTGF5b3V0UXVldWUgPSBmdW5jdGlvbiggcXVldWUgKSB7XG4gIHRoaXMudXBkYXRlU3RhZ2dlcigpO1xuICBxdWV1ZS5mb3JFYWNoKCBmdW5jdGlvbiggb2JqLCBpICkge1xuICAgIHRoaXMuX3Bvc2l0aW9uSXRlbSggb2JqLml0ZW0sIG9iai54LCBvYmoueSwgb2JqLmlzSW5zdGFudCwgaSApO1xuICB9LCB0aGlzICk7XG59O1xuXG4vLyBzZXQgc3RhZ2dlciBmcm9tIG9wdGlvbiBpbiBtaWxsaXNlY29uZHMgbnVtYmVyXG5wcm90by51cGRhdGVTdGFnZ2VyID0gZnVuY3Rpb24oKSB7XG4gIHZhciBzdGFnZ2VyID0gdGhpcy5vcHRpb25zLnN0YWdnZXI7XG4gIGlmICggc3RhZ2dlciA9PT0gbnVsbCB8fCBzdGFnZ2VyID09PSB1bmRlZmluZWQgKSB7XG4gICAgdGhpcy5zdGFnZ2VyID0gMDtcbiAgICByZXR1cm47XG4gIH1cbiAgdGhpcy5zdGFnZ2VyID0gZ2V0TWlsbGlzZWNvbmRzKCBzdGFnZ2VyICk7XG4gIHJldHVybiB0aGlzLnN0YWdnZXI7XG59O1xuXG4vKipcbiAqIFNldHMgcG9zaXRpb24gb2YgaXRlbSBpbiBET01cbiAqIEBwYXJhbSB7T3V0bGF5ZXIuSXRlbX0gaXRlbVxuICogQHBhcmFtIHtOdW1iZXJ9IHggLSBob3Jpem9udGFsIHBvc2l0aW9uXG4gKiBAcGFyYW0ge051bWJlcn0geSAtIHZlcnRpY2FsIHBvc2l0aW9uXG4gKiBAcGFyYW0ge0Jvb2xlYW59IGlzSW5zdGFudCAtIGRpc2FibGVzIHRyYW5zaXRpb25zXG4gKi9cbnByb3RvLl9wb3NpdGlvbkl0ZW0gPSBmdW5jdGlvbiggaXRlbSwgeCwgeSwgaXNJbnN0YW50LCBpICkge1xuICBpZiAoIGlzSW5zdGFudCApIHtcbiAgICAvLyBpZiBub3QgdHJhbnNpdGlvbiwganVzdCBzZXQgQ1NTXG4gICAgaXRlbS5nb1RvKCB4LCB5ICk7XG4gIH0gZWxzZSB7XG4gICAgaXRlbS5zdGFnZ2VyKCBpICogdGhpcy5zdGFnZ2VyICk7XG4gICAgaXRlbS5tb3ZlVG8oIHgsIHkgKTtcbiAgfVxufTtcblxuLyoqXG4gKiBBbnkgbG9naWMgeW91IHdhbnQgdG8gZG8gYWZ0ZXIgZWFjaCBsYXlvdXQsXG4gKiBpLmUuIHNpemUgdGhlIGNvbnRhaW5lclxuICovXG5wcm90by5fcG9zdExheW91dCA9IGZ1bmN0aW9uKCkge1xuICB0aGlzLnJlc2l6ZUNvbnRhaW5lcigpO1xufTtcblxucHJvdG8ucmVzaXplQ29udGFpbmVyID0gZnVuY3Rpb24oKSB7XG4gIHZhciBpc1Jlc2l6aW5nQ29udGFpbmVyID0gdGhpcy5fZ2V0T3B0aW9uKCdyZXNpemVDb250YWluZXInKTtcbiAgaWYgKCAhaXNSZXNpemluZ0NvbnRhaW5lciApIHtcbiAgICByZXR1cm47XG4gIH1cbiAgdmFyIHNpemUgPSB0aGlzLl9nZXRDb250YWluZXJTaXplKCk7XG4gIGlmICggc2l6ZSApIHtcbiAgICB0aGlzLl9zZXRDb250YWluZXJNZWFzdXJlKCBzaXplLndpZHRoLCB0cnVlICk7XG4gICAgdGhpcy5fc2V0Q29udGFpbmVyTWVhc3VyZSggc2l6ZS5oZWlnaHQsIGZhbHNlICk7XG4gIH1cbn07XG5cbi8qKlxuICogU2V0cyB3aWR0aCBvciBoZWlnaHQgb2YgY29udGFpbmVyIGlmIHJldHVybmVkXG4gKiBAcmV0dXJucyB7T2JqZWN0fSBzaXplXG4gKiAgIEBwYXJhbSB7TnVtYmVyfSB3aWR0aFxuICogICBAcGFyYW0ge051bWJlcn0gaGVpZ2h0XG4gKi9cbnByb3RvLl9nZXRDb250YWluZXJTaXplID0gbm9vcDtcblxuLyoqXG4gKiBAcGFyYW0ge051bWJlcn0gbWVhc3VyZSAtIHNpemUgb2Ygd2lkdGggb3IgaGVpZ2h0XG4gKiBAcGFyYW0ge0Jvb2xlYW59IGlzV2lkdGhcbiAqL1xucHJvdG8uX3NldENvbnRhaW5lck1lYXN1cmUgPSBmdW5jdGlvbiggbWVhc3VyZSwgaXNXaWR0aCApIHtcbiAgaWYgKCBtZWFzdXJlID09PSB1bmRlZmluZWQgKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgdmFyIGVsZW1TaXplID0gdGhpcy5zaXplO1xuICAvLyBhZGQgcGFkZGluZyBhbmQgYm9yZGVyIHdpZHRoIGlmIGJvcmRlciBib3hcbiAgaWYgKCBlbGVtU2l6ZS5pc0JvcmRlckJveCApIHtcbiAgICBtZWFzdXJlICs9IGlzV2lkdGggPyBlbGVtU2l6ZS5wYWRkaW5nTGVmdCArIGVsZW1TaXplLnBhZGRpbmdSaWdodCArXG4gICAgICBlbGVtU2l6ZS5ib3JkZXJMZWZ0V2lkdGggKyBlbGVtU2l6ZS5ib3JkZXJSaWdodFdpZHRoIDpcbiAgICAgIGVsZW1TaXplLnBhZGRpbmdCb3R0b20gKyBlbGVtU2l6ZS5wYWRkaW5nVG9wICtcbiAgICAgIGVsZW1TaXplLmJvcmRlclRvcFdpZHRoICsgZWxlbVNpemUuYm9yZGVyQm90dG9tV2lkdGg7XG4gIH1cblxuICBtZWFzdXJlID0gTWF0aC5tYXgoIG1lYXN1cmUsIDAgKTtcbiAgdGhpcy5lbGVtZW50LnN0eWxlWyBpc1dpZHRoID8gJ3dpZHRoJyA6ICdoZWlnaHQnIF0gPSBtZWFzdXJlICsgJ3B4Jztcbn07XG5cbi8qKlxuICogZW1pdCBldmVudENvbXBsZXRlIG9uIGEgY29sbGVjdGlvbiBvZiBpdGVtcyBldmVudHNcbiAqIEBwYXJhbSB7U3RyaW5nfSBldmVudE5hbWVcbiAqIEBwYXJhbSB7QXJyYXl9IGl0ZW1zIC0gT3V0bGF5ZXIuSXRlbXNcbiAqL1xucHJvdG8uX2VtaXRDb21wbGV0ZU9uSXRlbXMgPSBmdW5jdGlvbiggZXZlbnROYW1lLCBpdGVtcyApIHtcbiAgdmFyIF90aGlzID0gdGhpcztcbiAgZnVuY3Rpb24gb25Db21wbGV0ZSgpIHtcbiAgICBfdGhpcy5kaXNwYXRjaEV2ZW50KCBldmVudE5hbWUgKyAnQ29tcGxldGUnLCBudWxsLCBbIGl0ZW1zIF0gKTtcbiAgfVxuXG4gIHZhciBjb3VudCA9IGl0ZW1zLmxlbmd0aDtcbiAgaWYgKCAhaXRlbXMgfHwgIWNvdW50ICkge1xuICAgIG9uQ29tcGxldGUoKTtcbiAgICByZXR1cm47XG4gIH1cblxuICB2YXIgZG9uZUNvdW50ID0gMDtcbiAgZnVuY3Rpb24gdGljaygpIHtcbiAgICBkb25lQ291bnQrKztcbiAgICBpZiAoIGRvbmVDb3VudCA9PSBjb3VudCApIHtcbiAgICAgIG9uQ29tcGxldGUoKTtcbiAgICB9XG4gIH1cblxuICAvLyBiaW5kIGNhbGxiYWNrXG4gIGl0ZW1zLmZvckVhY2goIGZ1bmN0aW9uKCBpdGVtICkge1xuICAgIGl0ZW0ub25jZSggZXZlbnROYW1lLCB0aWNrICk7XG4gIH0pO1xufTtcblxuLyoqXG4gKiBlbWl0cyBldmVudHMgdmlhIEV2RW1pdHRlciBhbmQgalF1ZXJ5IGV2ZW50c1xuICogQHBhcmFtIHtTdHJpbmd9IHR5cGUgLSBuYW1lIG9mIGV2ZW50XG4gKiBAcGFyYW0ge0V2ZW50fSBldmVudCAtIG9yaWdpbmFsIGV2ZW50XG4gKiBAcGFyYW0ge0FycmF5fSBhcmdzIC0gZXh0cmEgYXJndW1lbnRzXG4gKi9cbnByb3RvLmRpc3BhdGNoRXZlbnQgPSBmdW5jdGlvbiggdHlwZSwgZXZlbnQsIGFyZ3MgKSB7XG4gIC8vIGFkZCBvcmlnaW5hbCBldmVudCB0byBhcmd1bWVudHNcbiAgdmFyIGVtaXRBcmdzID0gZXZlbnQgPyBbIGV2ZW50IF0uY29uY2F0KCBhcmdzICkgOiBhcmdzO1xuICB0aGlzLmVtaXRFdmVudCggdHlwZSwgZW1pdEFyZ3MgKTtcblxuICBpZiAoIGpRdWVyeSApIHtcbiAgICAvLyBzZXQgdGhpcy4kZWxlbWVudFxuICAgIHRoaXMuJGVsZW1lbnQgPSB0aGlzLiRlbGVtZW50IHx8IGpRdWVyeSggdGhpcy5lbGVtZW50ICk7XG4gICAgaWYgKCBldmVudCApIHtcbiAgICAgIC8vIGNyZWF0ZSBqUXVlcnkgZXZlbnRcbiAgICAgIHZhciAkZXZlbnQgPSBqUXVlcnkuRXZlbnQoIGV2ZW50ICk7XG4gICAgICAkZXZlbnQudHlwZSA9IHR5cGU7XG4gICAgICB0aGlzLiRlbGVtZW50LnRyaWdnZXIoICRldmVudCwgYXJncyApO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBqdXN0IHRyaWdnZXIgd2l0aCB0eXBlIGlmIG5vIGV2ZW50IGF2YWlsYWJsZVxuICAgICAgdGhpcy4kZWxlbWVudC50cmlnZ2VyKCB0eXBlLCBhcmdzICk7XG4gICAgfVxuICB9XG59O1xuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBpZ25vcmUgJiBzdGFtcHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gLy9cblxuXG4vKipcbiAqIGtlZXAgaXRlbSBpbiBjb2xsZWN0aW9uLCBidXQgZG8gbm90IGxheSBpdCBvdXRcbiAqIGlnbm9yZWQgaXRlbXMgZG8gbm90IGdldCBza2lwcGVkIGluIGxheW91dFxuICogQHBhcmFtIHtFbGVtZW50fSBlbGVtXG4gKi9cbnByb3RvLmlnbm9yZSA9IGZ1bmN0aW9uKCBlbGVtICkge1xuICB2YXIgaXRlbSA9IHRoaXMuZ2V0SXRlbSggZWxlbSApO1xuICBpZiAoIGl0ZW0gKSB7XG4gICAgaXRlbS5pc0lnbm9yZWQgPSB0cnVlO1xuICB9XG59O1xuXG4vKipcbiAqIHJldHVybiBpdGVtIHRvIGxheW91dCBjb2xsZWN0aW9uXG4gKiBAcGFyYW0ge0VsZW1lbnR9IGVsZW1cbiAqL1xucHJvdG8udW5pZ25vcmUgPSBmdW5jdGlvbiggZWxlbSApIHtcbiAgdmFyIGl0ZW0gPSB0aGlzLmdldEl0ZW0oIGVsZW0gKTtcbiAgaWYgKCBpdGVtICkge1xuICAgIGRlbGV0ZSBpdGVtLmlzSWdub3JlZDtcbiAgfVxufTtcblxuLyoqXG4gKiBhZGRzIGVsZW1lbnRzIHRvIHN0YW1wc1xuICogQHBhcmFtIHtOb2RlTGlzdCwgQXJyYXksIEVsZW1lbnQsIG9yIFN0cmluZ30gZWxlbXNcbiAqL1xucHJvdG8uc3RhbXAgPSBmdW5jdGlvbiggZWxlbXMgKSB7XG4gIGVsZW1zID0gdGhpcy5fZmluZCggZWxlbXMgKTtcbiAgaWYgKCAhZWxlbXMgKSB7XG4gICAgcmV0dXJuO1xuICB9XG5cbiAgdGhpcy5zdGFtcHMgPSB0aGlzLnN0YW1wcy5jb25jYXQoIGVsZW1zICk7XG4gIC8vIGlnbm9yZVxuICBlbGVtcy5mb3JFYWNoKCB0aGlzLmlnbm9yZSwgdGhpcyApO1xufTtcblxuLyoqXG4gKiByZW1vdmVzIGVsZW1lbnRzIHRvIHN0YW1wc1xuICogQHBhcmFtIHtOb2RlTGlzdCwgQXJyYXksIG9yIEVsZW1lbnR9IGVsZW1zXG4gKi9cbnByb3RvLnVuc3RhbXAgPSBmdW5jdGlvbiggZWxlbXMgKSB7XG4gIGVsZW1zID0gdGhpcy5fZmluZCggZWxlbXMgKTtcbiAgaWYgKCAhZWxlbXMgKXtcbiAgICByZXR1cm47XG4gIH1cblxuICBlbGVtcy5mb3JFYWNoKCBmdW5jdGlvbiggZWxlbSApIHtcbiAgICAvLyBmaWx0ZXIgb3V0IHJlbW92ZWQgc3RhbXAgZWxlbWVudHNcbiAgICB1dGlscy5yZW1vdmVGcm9tKCB0aGlzLnN0YW1wcywgZWxlbSApO1xuICAgIHRoaXMudW5pZ25vcmUoIGVsZW0gKTtcbiAgfSwgdGhpcyApO1xufTtcblxuLyoqXG4gKiBmaW5kcyBjaGlsZCBlbGVtZW50c1xuICogQHBhcmFtIHtOb2RlTGlzdCwgQXJyYXksIEVsZW1lbnQsIG9yIFN0cmluZ30gZWxlbXNcbiAqIEByZXR1cm5zIHtBcnJheX0gZWxlbXNcbiAqL1xucHJvdG8uX2ZpbmQgPSBmdW5jdGlvbiggZWxlbXMgKSB7XG4gIGlmICggIWVsZW1zICkge1xuICAgIHJldHVybjtcbiAgfVxuICAvLyBpZiBzdHJpbmcsIHVzZSBhcmd1bWVudCBhcyBzZWxlY3RvciBzdHJpbmdcbiAgaWYgKCB0eXBlb2YgZWxlbXMgPT0gJ3N0cmluZycgKSB7XG4gICAgZWxlbXMgPSB0aGlzLmVsZW1lbnQucXVlcnlTZWxlY3RvckFsbCggZWxlbXMgKTtcbiAgfVxuICBlbGVtcyA9IHV0aWxzLm1ha2VBcnJheSggZWxlbXMgKTtcbiAgcmV0dXJuIGVsZW1zO1xufTtcblxucHJvdG8uX21hbmFnZVN0YW1wcyA9IGZ1bmN0aW9uKCkge1xuICBpZiAoICF0aGlzLnN0YW1wcyB8fCAhdGhpcy5zdGFtcHMubGVuZ3RoICkge1xuICAgIHJldHVybjtcbiAgfVxuXG4gIHRoaXMuX2dldEJvdW5kaW5nUmVjdCgpO1xuXG4gIHRoaXMuc3RhbXBzLmZvckVhY2goIHRoaXMuX21hbmFnZVN0YW1wLCB0aGlzICk7XG59O1xuXG4vLyB1cGRhdGUgYm91bmRpbmdMZWZ0IC8gVG9wXG5wcm90by5fZ2V0Qm91bmRpbmdSZWN0ID0gZnVuY3Rpb24oKSB7XG4gIC8vIGdldCBib3VuZGluZyByZWN0IGZvciBjb250YWluZXIgZWxlbWVudFxuICB2YXIgYm91bmRpbmdSZWN0ID0gdGhpcy5lbGVtZW50LmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpO1xuICB2YXIgc2l6ZSA9IHRoaXMuc2l6ZTtcbiAgdGhpcy5fYm91bmRpbmdSZWN0ID0ge1xuICAgIGxlZnQ6IGJvdW5kaW5nUmVjdC5sZWZ0ICsgc2l6ZS5wYWRkaW5nTGVmdCArIHNpemUuYm9yZGVyTGVmdFdpZHRoLFxuICAgIHRvcDogYm91bmRpbmdSZWN0LnRvcCArIHNpemUucGFkZGluZ1RvcCArIHNpemUuYm9yZGVyVG9wV2lkdGgsXG4gICAgcmlnaHQ6IGJvdW5kaW5nUmVjdC5yaWdodCAtICggc2l6ZS5wYWRkaW5nUmlnaHQgKyBzaXplLmJvcmRlclJpZ2h0V2lkdGggKSxcbiAgICBib3R0b206IGJvdW5kaW5nUmVjdC5ib3R0b20gLSAoIHNpemUucGFkZGluZ0JvdHRvbSArIHNpemUuYm9yZGVyQm90dG9tV2lkdGggKVxuICB9O1xufTtcblxuLyoqXG4gKiBAcGFyYW0ge0VsZW1lbnR9IHN0YW1wXG4qKi9cbnByb3RvLl9tYW5hZ2VTdGFtcCA9IG5vb3A7XG5cbi8qKlxuICogZ2V0IHgveSBwb3NpdGlvbiBvZiBlbGVtZW50IHJlbGF0aXZlIHRvIGNvbnRhaW5lciBlbGVtZW50XG4gKiBAcGFyYW0ge0VsZW1lbnR9IGVsZW1cbiAqIEByZXR1cm5zIHtPYmplY3R9IG9mZnNldCAtIGhhcyBsZWZ0LCB0b3AsIHJpZ2h0LCBib3R0b21cbiAqL1xucHJvdG8uX2dldEVsZW1lbnRPZmZzZXQgPSBmdW5jdGlvbiggZWxlbSApIHtcbiAgdmFyIGJvdW5kaW5nUmVjdCA9IGVsZW0uZ2V0Qm91bmRpbmdDbGllbnRSZWN0KCk7XG4gIHZhciB0aGlzUmVjdCA9IHRoaXMuX2JvdW5kaW5nUmVjdDtcbiAgdmFyIHNpemUgPSBnZXRTaXplKCBlbGVtICk7XG4gIHZhciBvZmZzZXQgPSB7XG4gICAgbGVmdDogYm91bmRpbmdSZWN0LmxlZnQgLSB0aGlzUmVjdC5sZWZ0IC0gc2l6ZS5tYXJnaW5MZWZ0LFxuICAgIHRvcDogYm91bmRpbmdSZWN0LnRvcCAtIHRoaXNSZWN0LnRvcCAtIHNpemUubWFyZ2luVG9wLFxuICAgIHJpZ2h0OiB0aGlzUmVjdC5yaWdodCAtIGJvdW5kaW5nUmVjdC5yaWdodCAtIHNpemUubWFyZ2luUmlnaHQsXG4gICAgYm90dG9tOiB0aGlzUmVjdC5ib3R0b20gLSBib3VuZGluZ1JlY3QuYm90dG9tIC0gc2l6ZS5tYXJnaW5Cb3R0b21cbiAgfTtcbiAgcmV0dXJuIG9mZnNldDtcbn07XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIHJlc2l6ZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAvL1xuXG4vLyBlbmFibGUgZXZlbnQgaGFuZGxlcnMgZm9yIGxpc3RlbmVyc1xuLy8gaS5lLiByZXNpemUgLT4gb25yZXNpemVcbnByb3RvLmhhbmRsZUV2ZW50ID0gdXRpbHMuaGFuZGxlRXZlbnQ7XG5cbi8qKlxuICogQmluZCBsYXlvdXQgdG8gd2luZG93IHJlc2l6aW5nXG4gKi9cbnByb3RvLmJpbmRSZXNpemUgPSBmdW5jdGlvbigpIHtcbiAgd2luZG93LmFkZEV2ZW50TGlzdGVuZXIoICdyZXNpemUnLCB0aGlzICk7XG4gIHRoaXMuaXNSZXNpemVCb3VuZCA9IHRydWU7XG59O1xuXG4vKipcbiAqIFVuYmluZCBsYXlvdXQgdG8gd2luZG93IHJlc2l6aW5nXG4gKi9cbnByb3RvLnVuYmluZFJlc2l6ZSA9IGZ1bmN0aW9uKCkge1xuICB3aW5kb3cucmVtb3ZlRXZlbnRMaXN0ZW5lciggJ3Jlc2l6ZScsIHRoaXMgKTtcbiAgdGhpcy5pc1Jlc2l6ZUJvdW5kID0gZmFsc2U7XG59O1xuXG5wcm90by5vbnJlc2l6ZSA9IGZ1bmN0aW9uKCkge1xuICB0aGlzLnJlc2l6ZSgpO1xufTtcblxudXRpbHMuZGVib3VuY2VNZXRob2QoIE91dGxheWVyLCAnb25yZXNpemUnLCAxMDAgKTtcblxucHJvdG8ucmVzaXplID0gZnVuY3Rpb24oKSB7XG4gIC8vIGRvbid0IHRyaWdnZXIgaWYgc2l6ZSBkaWQgbm90IGNoYW5nZVxuICAvLyBvciBpZiByZXNpemUgd2FzIHVuYm91bmQuIFNlZSAjOVxuICBpZiAoICF0aGlzLmlzUmVzaXplQm91bmQgfHwgIXRoaXMubmVlZHNSZXNpemVMYXlvdXQoKSApIHtcbiAgICByZXR1cm47XG4gIH1cblxuICB0aGlzLmxheW91dCgpO1xufTtcblxuLyoqXG4gKiBjaGVjayBpZiBsYXlvdXQgaXMgbmVlZGVkIHBvc3QgbGF5b3V0XG4gKiBAcmV0dXJucyBCb29sZWFuXG4gKi9cbnByb3RvLm5lZWRzUmVzaXplTGF5b3V0ID0gZnVuY3Rpb24oKSB7XG4gIHZhciBzaXplID0gZ2V0U2l6ZSggdGhpcy5lbGVtZW50ICk7XG4gIC8vIGNoZWNrIHRoYXQgdGhpcy5zaXplIGFuZCBzaXplIGFyZSB0aGVyZVxuICAvLyBJRTggdHJpZ2dlcnMgcmVzaXplIG9uIGJvZHkgc2l6ZSBjaGFuZ2UsIHNvIHRoZXkgbWlnaHQgbm90IGJlXG4gIHZhciBoYXNTaXplcyA9IHRoaXMuc2l6ZSAmJiBzaXplO1xuICByZXR1cm4gaGFzU2l6ZXMgJiYgc2l6ZS5pbm5lcldpZHRoICE9PSB0aGlzLnNpemUuaW5uZXJXaWR0aDtcbn07XG5cbi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIG1ldGhvZHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gLy9cblxuLyoqXG4gKiBhZGQgaXRlbXMgdG8gT3V0bGF5ZXIgaW5zdGFuY2VcbiAqIEBwYXJhbSB7QXJyYXkgb3IgTm9kZUxpc3Qgb3IgRWxlbWVudH0gZWxlbXNcbiAqIEByZXR1cm5zIHtBcnJheX0gaXRlbXMgLSBPdXRsYXllci5JdGVtc1xuKiovXG5wcm90by5hZGRJdGVtcyA9IGZ1bmN0aW9uKCBlbGVtcyApIHtcbiAgdmFyIGl0ZW1zID0gdGhpcy5faXRlbWl6ZSggZWxlbXMgKTtcbiAgLy8gYWRkIGl0ZW1zIHRvIGNvbGxlY3Rpb25cbiAgaWYgKCBpdGVtcy5sZW5ndGggKSB7XG4gICAgdGhpcy5pdGVtcyA9IHRoaXMuaXRlbXMuY29uY2F0KCBpdGVtcyApO1xuICB9XG4gIHJldHVybiBpdGVtcztcbn07XG5cbi8qKlxuICogTGF5b3V0IG5ld2x5LWFwcGVuZGVkIGl0ZW0gZWxlbWVudHNcbiAqIEBwYXJhbSB7QXJyYXkgb3IgTm9kZUxpc3Qgb3IgRWxlbWVudH0gZWxlbXNcbiAqL1xucHJvdG8uYXBwZW5kZWQgPSBmdW5jdGlvbiggZWxlbXMgKSB7XG4gIHZhciBpdGVtcyA9IHRoaXMuYWRkSXRlbXMoIGVsZW1zICk7XG4gIGlmICggIWl0ZW1zLmxlbmd0aCApIHtcbiAgICByZXR1cm47XG4gIH1cbiAgLy8gbGF5b3V0IGFuZCByZXZlYWwganVzdCB0aGUgbmV3IGl0ZW1zXG4gIHRoaXMubGF5b3V0SXRlbXMoIGl0ZW1zLCB0cnVlICk7XG4gIHRoaXMucmV2ZWFsKCBpdGVtcyApO1xufTtcblxuLyoqXG4gKiBMYXlvdXQgcHJlcGVuZGVkIGVsZW1lbnRzXG4gKiBAcGFyYW0ge0FycmF5IG9yIE5vZGVMaXN0IG9yIEVsZW1lbnR9IGVsZW1zXG4gKi9cbnByb3RvLnByZXBlbmRlZCA9IGZ1bmN0aW9uKCBlbGVtcyApIHtcbiAgdmFyIGl0ZW1zID0gdGhpcy5faXRlbWl6ZSggZWxlbXMgKTtcbiAgaWYgKCAhaXRlbXMubGVuZ3RoICkge1xuICAgIHJldHVybjtcbiAgfVxuICAvLyBhZGQgaXRlbXMgdG8gYmVnaW5uaW5nIG9mIGNvbGxlY3Rpb25cbiAgdmFyIHByZXZpb3VzSXRlbXMgPSB0aGlzLml0ZW1zLnNsaWNlKDApO1xuICB0aGlzLml0ZW1zID0gaXRlbXMuY29uY2F0KCBwcmV2aW91c0l0ZW1zICk7XG4gIC8vIHN0YXJ0IG5ldyBsYXlvdXRcbiAgdGhpcy5fcmVzZXRMYXlvdXQoKTtcbiAgdGhpcy5fbWFuYWdlU3RhbXBzKCk7XG4gIC8vIGxheW91dCBuZXcgc3R1ZmYgd2l0aG91dCB0cmFuc2l0aW9uXG4gIHRoaXMubGF5b3V0SXRlbXMoIGl0ZW1zLCB0cnVlICk7XG4gIHRoaXMucmV2ZWFsKCBpdGVtcyApO1xuICAvLyBsYXlvdXQgcHJldmlvdXMgaXRlbXNcbiAgdGhpcy5sYXlvdXRJdGVtcyggcHJldmlvdXNJdGVtcyApO1xufTtcblxuLyoqXG4gKiByZXZlYWwgYSBjb2xsZWN0aW9uIG9mIGl0ZW1zXG4gKiBAcGFyYW0ge0FycmF5IG9mIE91dGxheWVyLkl0ZW1zfSBpdGVtc1xuICovXG5wcm90by5yZXZlYWwgPSBmdW5jdGlvbiggaXRlbXMgKSB7XG4gIHRoaXMuX2VtaXRDb21wbGV0ZU9uSXRlbXMoICdyZXZlYWwnLCBpdGVtcyApO1xuICBpZiAoICFpdGVtcyB8fCAhaXRlbXMubGVuZ3RoICkge1xuICAgIHJldHVybjtcbiAgfVxuICB2YXIgc3RhZ2dlciA9IHRoaXMudXBkYXRlU3RhZ2dlcigpO1xuICBpdGVtcy5mb3JFYWNoKCBmdW5jdGlvbiggaXRlbSwgaSApIHtcbiAgICBpdGVtLnN0YWdnZXIoIGkgKiBzdGFnZ2VyICk7XG4gICAgaXRlbS5yZXZlYWwoKTtcbiAgfSk7XG59O1xuXG4vKipcbiAqIGhpZGUgYSBjb2xsZWN0aW9uIG9mIGl0ZW1zXG4gKiBAcGFyYW0ge0FycmF5IG9mIE91dGxheWVyLkl0ZW1zfSBpdGVtc1xuICovXG5wcm90by5oaWRlID0gZnVuY3Rpb24oIGl0ZW1zICkge1xuICB0aGlzLl9lbWl0Q29tcGxldGVPbkl0ZW1zKCAnaGlkZScsIGl0ZW1zICk7XG4gIGlmICggIWl0ZW1zIHx8ICFpdGVtcy5sZW5ndGggKSB7XG4gICAgcmV0dXJuO1xuICB9XG4gIHZhciBzdGFnZ2VyID0gdGhpcy51cGRhdGVTdGFnZ2VyKCk7XG4gIGl0ZW1zLmZvckVhY2goIGZ1bmN0aW9uKCBpdGVtLCBpICkge1xuICAgIGl0ZW0uc3RhZ2dlciggaSAqIHN0YWdnZXIgKTtcbiAgICBpdGVtLmhpZGUoKTtcbiAgfSk7XG59O1xuXG4vKipcbiAqIHJldmVhbCBpdGVtIGVsZW1lbnRzXG4gKiBAcGFyYW0ge0FycmF5fSwge0VsZW1lbnR9LCB7Tm9kZUxpc3R9IGl0ZW1zXG4gKi9cbnByb3RvLnJldmVhbEl0ZW1FbGVtZW50cyA9IGZ1bmN0aW9uKCBlbGVtcyApIHtcbiAgdmFyIGl0ZW1zID0gdGhpcy5nZXRJdGVtcyggZWxlbXMgKTtcbiAgdGhpcy5yZXZlYWwoIGl0ZW1zICk7XG59O1xuXG4vKipcbiAqIGhpZGUgaXRlbSBlbGVtZW50c1xuICogQHBhcmFtIHtBcnJheX0sIHtFbGVtZW50fSwge05vZGVMaXN0fSBpdGVtc1xuICovXG5wcm90by5oaWRlSXRlbUVsZW1lbnRzID0gZnVuY3Rpb24oIGVsZW1zICkge1xuICB2YXIgaXRlbXMgPSB0aGlzLmdldEl0ZW1zKCBlbGVtcyApO1xuICB0aGlzLmhpZGUoIGl0ZW1zICk7XG59O1xuXG4vKipcbiAqIGdldCBPdXRsYXllci5JdGVtLCBnaXZlbiBhbiBFbGVtZW50XG4gKiBAcGFyYW0ge0VsZW1lbnR9IGVsZW1cbiAqIEBwYXJhbSB7RnVuY3Rpb259IGNhbGxiYWNrXG4gKiBAcmV0dXJucyB7T3V0bGF5ZXIuSXRlbX0gaXRlbVxuICovXG5wcm90by5nZXRJdGVtID0gZnVuY3Rpb24oIGVsZW0gKSB7XG4gIC8vIGxvb3AgdGhyb3VnaCBpdGVtcyB0byBnZXQgdGhlIG9uZSB0aGF0IG1hdGNoZXNcbiAgZm9yICggdmFyIGk9MDsgaSA8IHRoaXMuaXRlbXMubGVuZ3RoOyBpKysgKSB7XG4gICAgdmFyIGl0ZW0gPSB0aGlzLml0ZW1zW2ldO1xuICAgIGlmICggaXRlbS5lbGVtZW50ID09IGVsZW0gKSB7XG4gICAgICAvLyByZXR1cm4gaXRlbVxuICAgICAgcmV0dXJuIGl0ZW07XG4gICAgfVxuICB9XG59O1xuXG4vKipcbiAqIGdldCBjb2xsZWN0aW9uIG9mIE91dGxheWVyLkl0ZW1zLCBnaXZlbiBFbGVtZW50c1xuICogQHBhcmFtIHtBcnJheX0gZWxlbXNcbiAqIEByZXR1cm5zIHtBcnJheX0gaXRlbXMgLSBPdXRsYXllci5JdGVtc1xuICovXG5wcm90by5nZXRJdGVtcyA9IGZ1bmN0aW9uKCBlbGVtcyApIHtcbiAgZWxlbXMgPSB1dGlscy5tYWtlQXJyYXkoIGVsZW1zICk7XG4gIHZhciBpdGVtcyA9IFtdO1xuICBlbGVtcy5mb3JFYWNoKCBmdW5jdGlvbiggZWxlbSApIHtcbiAgICB2YXIgaXRlbSA9IHRoaXMuZ2V0SXRlbSggZWxlbSApO1xuICAgIGlmICggaXRlbSApIHtcbiAgICAgIGl0ZW1zLnB1c2goIGl0ZW0gKTtcbiAgICB9XG4gIH0sIHRoaXMgKTtcblxuICByZXR1cm4gaXRlbXM7XG59O1xuXG4vKipcbiAqIHJlbW92ZSBlbGVtZW50KHMpIGZyb20gaW5zdGFuY2UgYW5kIERPTVxuICogQHBhcmFtIHtBcnJheSBvciBOb2RlTGlzdCBvciBFbGVtZW50fSBlbGVtc1xuICovXG5wcm90by5yZW1vdmUgPSBmdW5jdGlvbiggZWxlbXMgKSB7XG4gIHZhciByZW1vdmVJdGVtcyA9IHRoaXMuZ2V0SXRlbXMoIGVsZW1zICk7XG5cbiAgdGhpcy5fZW1pdENvbXBsZXRlT25JdGVtcyggJ3JlbW92ZScsIHJlbW92ZUl0ZW1zICk7XG5cbiAgLy8gYmFpbCBpZiBubyBpdGVtcyB0byByZW1vdmVcbiAgaWYgKCAhcmVtb3ZlSXRlbXMgfHwgIXJlbW92ZUl0ZW1zLmxlbmd0aCApIHtcbiAgICByZXR1cm47XG4gIH1cblxuICByZW1vdmVJdGVtcy5mb3JFYWNoKCBmdW5jdGlvbiggaXRlbSApIHtcbiAgICBpdGVtLnJlbW92ZSgpO1xuICAgIC8vIHJlbW92ZSBpdGVtIGZyb20gY29sbGVjdGlvblxuICAgIHV0aWxzLnJlbW92ZUZyb20oIHRoaXMuaXRlbXMsIGl0ZW0gKTtcbiAgfSwgdGhpcyApO1xufTtcblxuLy8gLS0tLS0gZGVzdHJveSAtLS0tLSAvL1xuXG4vLyByZW1vdmUgYW5kIGRpc2FibGUgT3V0bGF5ZXIgaW5zdGFuY2VcbnByb3RvLmRlc3Ryb3kgPSBmdW5jdGlvbigpIHtcbiAgLy8gY2xlYW4gdXAgZHluYW1pYyBzdHlsZXNcbiAgdmFyIHN0eWxlID0gdGhpcy5lbGVtZW50LnN0eWxlO1xuICBzdHlsZS5oZWlnaHQgPSAnJztcbiAgc3R5bGUucG9zaXRpb24gPSAnJztcbiAgc3R5bGUud2lkdGggPSAnJztcbiAgLy8gZGVzdHJveSBpdGVtc1xuICB0aGlzLml0ZW1zLmZvckVhY2goIGZ1bmN0aW9uKCBpdGVtICkge1xuICAgIGl0ZW0uZGVzdHJveSgpO1xuICB9KTtcblxuICB0aGlzLnVuYmluZFJlc2l6ZSgpO1xuXG4gIHZhciBpZCA9IHRoaXMuZWxlbWVudC5vdXRsYXllckdVSUQ7XG4gIGRlbGV0ZSBpbnN0YW5jZXNbIGlkIF07IC8vIHJlbW92ZSByZWZlcmVuY2UgdG8gaW5zdGFuY2UgYnkgaWRcbiAgZGVsZXRlIHRoaXMuZWxlbWVudC5vdXRsYXllckdVSUQ7XG4gIC8vIHJlbW92ZSBkYXRhIGZvciBqUXVlcnlcbiAgaWYgKCBqUXVlcnkgKSB7XG4gICAgalF1ZXJ5LnJlbW92ZURhdGEoIHRoaXMuZWxlbWVudCwgdGhpcy5jb25zdHJ1Y3Rvci5uYW1lc3BhY2UgKTtcbiAgfVxuXG59O1xuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBkYXRhIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIC8vXG5cbi8qKlxuICogZ2V0IE91dGxheWVyIGluc3RhbmNlIGZyb20gZWxlbWVudFxuICogQHBhcmFtIHtFbGVtZW50fSBlbGVtXG4gKiBAcmV0dXJucyB7T3V0bGF5ZXJ9XG4gKi9cbk91dGxheWVyLmRhdGEgPSBmdW5jdGlvbiggZWxlbSApIHtcbiAgZWxlbSA9IHV0aWxzLmdldFF1ZXJ5RWxlbWVudCggZWxlbSApO1xuICB2YXIgaWQgPSBlbGVtICYmIGVsZW0ub3V0bGF5ZXJHVUlEO1xuICByZXR1cm4gaWQgJiYgaW5zdGFuY2VzWyBpZCBdO1xufTtcblxuXG4vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBjcmVhdGUgT3V0bGF5ZXIgY2xhc3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gLy9cblxuLyoqXG4gKiBjcmVhdGUgYSBsYXlvdXQgY2xhc3NcbiAqIEBwYXJhbSB7U3RyaW5nfSBuYW1lc3BhY2VcbiAqL1xuT3V0bGF5ZXIuY3JlYXRlID0gZnVuY3Rpb24oIG5hbWVzcGFjZSwgb3B0aW9ucyApIHtcbiAgLy8gc3ViLWNsYXNzIE91dGxheWVyXG4gIHZhciBMYXlvdXQgPSBzdWJjbGFzcyggT3V0bGF5ZXIgKTtcbiAgLy8gYXBwbHkgbmV3IG9wdGlvbnMgYW5kIGNvbXBhdE9wdGlvbnNcbiAgTGF5b3V0LmRlZmF1bHRzID0gdXRpbHMuZXh0ZW5kKCB7fSwgT3V0bGF5ZXIuZGVmYXVsdHMgKTtcbiAgdXRpbHMuZXh0ZW5kKCBMYXlvdXQuZGVmYXVsdHMsIG9wdGlvbnMgKTtcbiAgTGF5b3V0LmNvbXBhdE9wdGlvbnMgPSB1dGlscy5leHRlbmQoIHt9LCBPdXRsYXllci5jb21wYXRPcHRpb25zICApO1xuXG4gIExheW91dC5uYW1lc3BhY2UgPSBuYW1lc3BhY2U7XG5cbiAgTGF5b3V0LmRhdGEgPSBPdXRsYXllci5kYXRhO1xuXG4gIC8vIHN1Yi1jbGFzcyBJdGVtXG4gIExheW91dC5JdGVtID0gc3ViY2xhc3MoIEl0ZW0gKTtcblxuICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBkZWNsYXJhdGl2ZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAvL1xuXG4gIHV0aWxzLmh0bWxJbml0KCBMYXlvdXQsIG5hbWVzcGFjZSApO1xuXG4gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIGpRdWVyeSBicmlkZ2UgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gLy9cblxuICAvLyBtYWtlIGludG8galF1ZXJ5IHBsdWdpblxuICBpZiAoIGpRdWVyeSAmJiBqUXVlcnkuYnJpZGdldCApIHtcbiAgICBqUXVlcnkuYnJpZGdldCggbmFtZXNwYWNlLCBMYXlvdXQgKTtcbiAgfVxuXG4gIHJldHVybiBMYXlvdXQ7XG59O1xuXG5mdW5jdGlvbiBzdWJjbGFzcyggUGFyZW50ICkge1xuICBmdW5jdGlvbiBTdWJDbGFzcygpIHtcbiAgICBQYXJlbnQuYXBwbHkoIHRoaXMsIGFyZ3VtZW50cyApO1xuICB9XG5cbiAgU3ViQ2xhc3MucHJvdG90eXBlID0gT2JqZWN0LmNyZWF0ZSggUGFyZW50LnByb3RvdHlwZSApO1xuICBTdWJDbGFzcy5wcm90b3R5cGUuY29uc3RydWN0b3IgPSBTdWJDbGFzcztcblxuICByZXR1cm4gU3ViQ2xhc3M7XG59XG5cbi8vIC0tLS0tIGhlbHBlcnMgLS0tLS0gLy9cblxuLy8gaG93IG1hbnkgbWlsbGlzZWNvbmRzIGFyZSBpbiBlYWNoIHVuaXRcbnZhciBtc1VuaXRzID0ge1xuICBtczogMSxcbiAgczogMTAwMFxufTtcblxuLy8gbXVuZ2UgdGltZS1saWtlIHBhcmFtZXRlciBpbnRvIG1pbGxpc2Vjb25kIG51bWJlclxuLy8gJzAuNHMnIC0+IDQwXG5mdW5jdGlvbiBnZXRNaWxsaXNlY29uZHMoIHRpbWUgKSB7XG4gIGlmICggdHlwZW9mIHRpbWUgPT0gJ251bWJlcicgKSB7XG4gICAgcmV0dXJuIHRpbWU7XG4gIH1cbiAgdmFyIG1hdGNoZXMgPSB0aW1lLm1hdGNoKCAvKF5cXGQqXFwuP1xcZCopKFxcdyopLyApO1xuICB2YXIgbnVtID0gbWF0Y2hlcyAmJiBtYXRjaGVzWzFdO1xuICB2YXIgdW5pdCA9IG1hdGNoZXMgJiYgbWF0Y2hlc1syXTtcbiAgaWYgKCAhbnVtLmxlbmd0aCApIHtcbiAgICByZXR1cm4gMDtcbiAgfVxuICBudW0gPSBwYXJzZUZsb2F0KCBudW0gKTtcbiAgdmFyIG11bHQgPSBtc1VuaXRzWyB1bml0IF0gfHwgMTtcbiAgcmV0dXJuIG51bSAqIG11bHQ7XG59XG5cbi8vIC0tLS0tIGZpbiAtLS0tLSAvL1xuXG4vLyBiYWNrIGluIGdsb2JhbFxuT3V0bGF5ZXIuSXRlbSA9IEl0ZW07XG5cbnJldHVybiBPdXRsYXllcjtcblxufSkpO1xuIiwiIWZ1bmN0aW9uKHJvb3QsIGZhY3RvcnkpIHtcbiAgICBcImZ1bmN0aW9uXCIgPT0gdHlwZW9mIGRlZmluZSAmJiBkZWZpbmUuYW1kID8gLy8gQU1ELiBSZWdpc3RlciBhcyBhbiBhbm9ueW1vdXMgbW9kdWxlIHVubGVzcyBhbWRNb2R1bGVJZCBpcyBzZXRcbiAgICBkZWZpbmUoW10sIGZ1bmN0aW9uKCkge1xuICAgICAgICByZXR1cm4gcm9vdC5zdmc0ZXZlcnlib2R5ID0gZmFjdG9yeSgpO1xuICAgIH0pIDogXCJvYmplY3RcIiA9PSB0eXBlb2YgbW9kdWxlICYmIG1vZHVsZS5leHBvcnRzID8gLy8gTm9kZS4gRG9lcyBub3Qgd29yayB3aXRoIHN0cmljdCBDb21tb25KUywgYnV0XG4gICAgLy8gb25seSBDb21tb25KUy1saWtlIGVudmlyb25tZW50cyB0aGF0IHN1cHBvcnQgbW9kdWxlLmV4cG9ydHMsXG4gICAgLy8gbGlrZSBOb2RlLlxuICAgIG1vZHVsZS5leHBvcnRzID0gZmFjdG9yeSgpIDogcm9vdC5zdmc0ZXZlcnlib2R5ID0gZmFjdG9yeSgpO1xufSh0aGlzLCBmdW5jdGlvbigpIHtcbiAgICAvKiEgc3ZnNGV2ZXJ5Ym9keSB2Mi4xLjkgfCBnaXRodWIuY29tL2pvbmF0aGFudG5lYWwvc3ZnNGV2ZXJ5Ym9keSAqL1xuICAgIGZ1bmN0aW9uIGVtYmVkKHBhcmVudCwgc3ZnLCB0YXJnZXQpIHtcbiAgICAgICAgLy8gaWYgdGhlIHRhcmdldCBleGlzdHNcbiAgICAgICAgaWYgKHRhcmdldCkge1xuICAgICAgICAgICAgLy8gY3JlYXRlIGEgZG9jdW1lbnQgZnJhZ21lbnQgdG8gaG9sZCB0aGUgY29udGVudHMgb2YgdGhlIHRhcmdldFxuICAgICAgICAgICAgdmFyIGZyYWdtZW50ID0gZG9jdW1lbnQuY3JlYXRlRG9jdW1lbnRGcmFnbWVudCgpLCB2aWV3Qm94ID0gIXN2Zy5oYXNBdHRyaWJ1dGUoXCJ2aWV3Qm94XCIpICYmIHRhcmdldC5nZXRBdHRyaWJ1dGUoXCJ2aWV3Qm94XCIpO1xuICAgICAgICAgICAgLy8gY29uZGl0aW9uYWxseSBzZXQgdGhlIHZpZXdCb3ggb24gdGhlIHN2Z1xuICAgICAgICAgICAgdmlld0JveCAmJiBzdmcuc2V0QXR0cmlidXRlKFwidmlld0JveFwiLCB2aWV3Qm94KTtcbiAgICAgICAgICAgIC8vIGNvcHkgdGhlIGNvbnRlbnRzIG9mIHRoZSBjbG9uZSBpbnRvIHRoZSBmcmFnbWVudFxuICAgICAgICAgICAgZm9yICgvLyBjbG9uZSB0aGUgdGFyZ2V0XG4gICAgICAgICAgICB2YXIgY2xvbmUgPSB0YXJnZXQuY2xvbmVOb2RlKCEwKTsgY2xvbmUuY2hpbGROb2Rlcy5sZW5ndGg7ICkge1xuICAgICAgICAgICAgICAgIGZyYWdtZW50LmFwcGVuZENoaWxkKGNsb25lLmZpcnN0Q2hpbGQpO1xuICAgICAgICAgICAgfVxuICAgICAgICAgICAgLy8gYXBwZW5kIHRoZSBmcmFnbWVudCBpbnRvIHRoZSBzdmdcbiAgICAgICAgICAgIHBhcmVudC5hcHBlbmRDaGlsZChmcmFnbWVudCk7XG4gICAgICAgIH1cbiAgICB9XG4gICAgZnVuY3Rpb24gbG9hZHJlYWR5c3RhdGVjaGFuZ2UoeGhyKSB7XG4gICAgICAgIC8vIGxpc3RlbiB0byBjaGFuZ2VzIGluIHRoZSByZXF1ZXN0XG4gICAgICAgIHhoci5vbnJlYWR5c3RhdGVjaGFuZ2UgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIC8vIGlmIHRoZSByZXF1ZXN0IGlzIHJlYWR5XG4gICAgICAgICAgICBpZiAoNCA9PT0geGhyLnJlYWR5U3RhdGUpIHtcbiAgICAgICAgICAgICAgICAvLyBnZXQgdGhlIGNhY2hlZCBodG1sIGRvY3VtZW50XG4gICAgICAgICAgICAgICAgdmFyIGNhY2hlZERvY3VtZW50ID0geGhyLl9jYWNoZWREb2N1bWVudDtcbiAgICAgICAgICAgICAgICAvLyBlbnN1cmUgdGhlIGNhY2hlZCBodG1sIGRvY3VtZW50IGJhc2VkIG9uIHRoZSB4aHIgcmVzcG9uc2VcbiAgICAgICAgICAgICAgICBjYWNoZWREb2N1bWVudCB8fCAoY2FjaGVkRG9jdW1lbnQgPSB4aHIuX2NhY2hlZERvY3VtZW50ID0gZG9jdW1lbnQuaW1wbGVtZW50YXRpb24uY3JlYXRlSFRNTERvY3VtZW50KFwiXCIpLCBcbiAgICAgICAgICAgICAgICBjYWNoZWREb2N1bWVudC5ib2R5LmlubmVySFRNTCA9IHhoci5yZXNwb25zZVRleHQsIHhoci5fY2FjaGVkVGFyZ2V0ID0ge30pLCAvLyBjbGVhciB0aGUgeGhyIGVtYmVkcyBsaXN0IGFuZCBlbWJlZCBlYWNoIGl0ZW1cbiAgICAgICAgICAgICAgICB4aHIuX2VtYmVkcy5zcGxpY2UoMCkubWFwKGZ1bmN0aW9uKGl0ZW0pIHtcbiAgICAgICAgICAgICAgICAgICAgLy8gZ2V0IHRoZSBjYWNoZWQgdGFyZ2V0XG4gICAgICAgICAgICAgICAgICAgIHZhciB0YXJnZXQgPSB4aHIuX2NhY2hlZFRhcmdldFtpdGVtLmlkXTtcbiAgICAgICAgICAgICAgICAgICAgLy8gZW5zdXJlIHRoZSBjYWNoZWQgdGFyZ2V0XG4gICAgICAgICAgICAgICAgICAgIHRhcmdldCB8fCAodGFyZ2V0ID0geGhyLl9jYWNoZWRUYXJnZXRbaXRlbS5pZF0gPSBjYWNoZWREb2N1bWVudC5nZXRFbGVtZW50QnlJZChpdGVtLmlkKSksIFxuICAgICAgICAgICAgICAgICAgICAvLyBlbWJlZCB0aGUgdGFyZ2V0IGludG8gdGhlIHN2Z1xuICAgICAgICAgICAgICAgICAgICBlbWJlZChpdGVtLnBhcmVudCwgaXRlbS5zdmcsIHRhcmdldCk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sIC8vIHRlc3QgdGhlIHJlYWR5IHN0YXRlIGNoYW5nZSBpbW1lZGlhdGVseVxuICAgICAgICB4aHIub25yZWFkeXN0YXRlY2hhbmdlKCk7XG4gICAgfVxuICAgIGZ1bmN0aW9uIHN2ZzRldmVyeWJvZHkocmF3b3B0cykge1xuICAgICAgICBmdW5jdGlvbiBvbmludGVydmFsKCkge1xuICAgICAgICAgICAgLy8gd2hpbGUgdGhlIGluZGV4IGV4aXN0cyBpbiB0aGUgbGl2ZSA8dXNlPiBjb2xsZWN0aW9uXG4gICAgICAgICAgICBmb3IgKC8vIGdldCB0aGUgY2FjaGVkIDx1c2U+IGluZGV4XG4gICAgICAgICAgICB2YXIgaW5kZXggPSAwOyBpbmRleCA8IHVzZXMubGVuZ3RoOyApIHtcbiAgICAgICAgICAgICAgICAvLyBnZXQgdGhlIGN1cnJlbnQgPHVzZT5cbiAgICAgICAgICAgICAgICB2YXIgdXNlID0gdXNlc1tpbmRleF0sIHBhcmVudCA9IHVzZS5wYXJlbnROb2RlLCBzdmcgPSBnZXRTVkdBbmNlc3RvcihwYXJlbnQpLCBzcmMgPSB1c2UuZ2V0QXR0cmlidXRlKFwieGxpbms6aHJlZlwiKSB8fCB1c2UuZ2V0QXR0cmlidXRlKFwiaHJlZlwiKTtcbiAgICAgICAgICAgICAgICBpZiAoIXNyYyAmJiBvcHRzLmF0dHJpYnV0ZU5hbWUgJiYgKHNyYyA9IHVzZS5nZXRBdHRyaWJ1dGUob3B0cy5hdHRyaWJ1dGVOYW1lKSksIFxuICAgICAgICAgICAgICAgIHN2ZyAmJiBzcmMpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKHBvbHlmaWxsKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIW9wdHMudmFsaWRhdGUgfHwgb3B0cy52YWxpZGF0ZShzcmMsIHN2ZywgdXNlKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlbW92ZSB0aGUgPHVzZT4gZWxlbWVudFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudC5yZW1vdmVDaGlsZCh1c2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHBhcnNlIHRoZSBzcmMgYW5kIGdldCB0aGUgdXJsIGFuZCBpZFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBzcmNTcGxpdCA9IHNyYy5zcGxpdChcIiNcIiksIHVybCA9IHNyY1NwbGl0LnNoaWZ0KCksIGlkID0gc3JjU3BsaXQuam9pbihcIiNcIik7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaWYgdGhlIGxpbmsgaXMgZXh0ZXJuYWxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodXJsLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBnZXQgdGhlIGNhY2hlZCB4aHIgcmVxdWVzdFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgeGhyID0gcmVxdWVzdHNbdXJsXTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZW5zdXJlIHRoZSB4aHIgcmVxdWVzdCBleGlzdHNcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeGhyIHx8ICh4aHIgPSByZXF1ZXN0c1t1cmxdID0gbmV3IFhNTEh0dHBSZXF1ZXN0KCksIHhoci5vcGVuKFwiR0VUXCIsIHVybCksIHhoci5zZW5kKCksIFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4aHIuX2VtYmVkcyA9IFtdKSwgLy8gYWRkIHRoZSBzdmcgYW5kIGlkIGFzIGFuIGl0ZW0gdG8gdGhlIHhociBlbWJlZHMgbGlzdFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB4aHIuX2VtYmVkcy5wdXNoKHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudDogcGFyZW50LFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ZnOiBzdmcsXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZDogaWRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSksIC8vIHByZXBhcmUgdGhlIHhociByZWFkeSBzdGF0ZSBjaGFuZ2UgZXZlbnRcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9hZHJlYWR5c3RhdGVjaGFuZ2UoeGhyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBlbWJlZCB0aGUgbG9jYWwgaWQgaW50byB0aGUgc3ZnXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVtYmVkKHBhcmVudCwgc3ZnLCBkb2N1bWVudC5nZXRFbGVtZW50QnlJZChpZCkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW5jcmVhc2UgdGhlIGluZGV4IHdoZW4gdGhlIHByZXZpb3VzIHZhbHVlIHdhcyBub3QgXCJ2YWxpZFwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgKytpbmRleCwgKytudW1iZXJPZlN2Z1VzZUVsZW1lbnRzVG9CeXBhc3M7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAvLyBpbmNyZWFzZSB0aGUgaW5kZXggd2hlbiB0aGUgcHJldmlvdXMgdmFsdWUgd2FzIG5vdCBcInZhbGlkXCJcbiAgICAgICAgICAgICAgICAgICAgKytpbmRleDtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICAvLyBjb250aW51ZSB0aGUgaW50ZXJ2YWxcbiAgICAgICAgICAgICghdXNlcy5sZW5ndGggfHwgdXNlcy5sZW5ndGggLSBudW1iZXJPZlN2Z1VzZUVsZW1lbnRzVG9CeXBhc3MgPiAwKSAmJiByZXF1ZXN0QW5pbWF0aW9uRnJhbWUob25pbnRlcnZhbCwgNjcpO1xuICAgICAgICB9XG4gICAgICAgIHZhciBwb2x5ZmlsbCwgb3B0cyA9IE9iamVjdChyYXdvcHRzKSwgbmV3ZXJJRVVBID0gL1xcYlRyaWRlbnRcXC9bNTY3XVxcYnxcXGJNU0lFICg/Ojl8MTApXFwuMFxcYi8sIHdlYmtpdFVBID0gL1xcYkFwcGxlV2ViS2l0XFwvKFxcZCspXFxiLywgb2xkZXJFZGdlVUEgPSAvXFxiRWRnZVxcLzEyXFwuKFxcZCspXFxiLywgZWRnZVVBID0gL1xcYkVkZ2VcXC8uKFxcZCspXFxiLywgaW5JZnJhbWUgPSB3aW5kb3cudG9wICE9PSB3aW5kb3cuc2VsZjtcbiAgICAgICAgcG9seWZpbGwgPSBcInBvbHlmaWxsXCIgaW4gb3B0cyA/IG9wdHMucG9seWZpbGwgOiBuZXdlcklFVUEudGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSB8fCAobmF2aWdhdG9yLnVzZXJBZ2VudC5tYXRjaChvbGRlckVkZ2VVQSkgfHwgW10pWzFdIDwgMTA1NDcgfHwgKG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2god2Via2l0VUEpIHx8IFtdKVsxXSA8IDUzNyB8fCBlZGdlVUEudGVzdChuYXZpZ2F0b3IudXNlckFnZW50KSAmJiBpbklmcmFtZTtcbiAgICAgICAgLy8gY3JlYXRlIHhociByZXF1ZXN0cyBvYmplY3RcbiAgICAgICAgdmFyIHJlcXVlc3RzID0ge30sIHJlcXVlc3RBbmltYXRpb25GcmFtZSA9IHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUgfHwgc2V0VGltZW91dCwgdXNlcyA9IGRvY3VtZW50LmdldEVsZW1lbnRzQnlUYWdOYW1lKFwidXNlXCIpLCBudW1iZXJPZlN2Z1VzZUVsZW1lbnRzVG9CeXBhc3MgPSAwO1xuICAgICAgICAvLyBjb25kaXRpb25hbGx5IHN0YXJ0IHRoZSBpbnRlcnZhbCBpZiB0aGUgcG9seWZpbGwgaXMgYWN0aXZlXG4gICAgICAgIHBvbHlmaWxsICYmIG9uaW50ZXJ2YWwoKTtcbiAgICB9XG4gICAgZnVuY3Rpb24gZ2V0U1ZHQW5jZXN0b3Iobm9kZSkge1xuICAgICAgICBmb3IgKHZhciBzdmcgPSBub2RlOyBcInN2Z1wiICE9PSBzdmcubm9kZU5hbWUudG9Mb3dlckNhc2UoKSAmJiAoc3ZnID0gc3ZnLnBhcmVudE5vZGUpOyApIHt9XG4gICAgICAgIHJldHVybiBzdmc7XG4gICAgfVxuICAgIHJldHVybiBzdmc0ZXZlcnlib2R5O1xufSk7IiwiLyohIFVJa2l0IDIuMjcuNCB8IGh0dHA6Ly93d3cuZ2V0dWlraXQuY29tIHwgKGMpIDIwMTQgWU9PdGhlbWUgfCBNSVQgTGljZW5zZSAqL1xuKGZ1bmN0aW9uKGNvcmUpIHtcblxuICAgIHZhciB1aWtpdDtcblxuICAgIGlmICghd2luZG93LmpRdWVyeSkge1xuICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1VJa2l0IDIueCByZXF1aXJlcyBqUXVlcnknKTtcbiAgICB9IGVsc2Uge1xuICAgICAgICB1aWtpdCA9IGNvcmUod2luZG93LmpRdWVyeSk7XG4gICAgfVxuXG4gICAgaWYgKHR5cGVvZiBkZWZpbmUgPT0gJ2Z1bmN0aW9uJyAmJiBkZWZpbmUuYW1kKSB7IC8vIEFNRFxuXG4gICAgICAgIGRlZmluZSgndWlraXQnLCBmdW5jdGlvbigpe1xuXG4gICAgICAgICAgICB1aWtpdC5sb2FkID0gZnVuY3Rpb24ocmVzLCByZXEsIG9ubG9hZCwgY29uZmlnKSB7XG5cbiAgICAgICAgICAgICAgICB2YXIgcmVzb3VyY2VzID0gcmVzLnNwbGl0KCcsJyksIGxvYWQgPSBbXSwgaSwgYmFzZSA9IChjb25maWcuY29uZmlnICYmIGNvbmZpZy5jb25maWcudWlraXQgJiYgY29uZmlnLmNvbmZpZy51aWtpdC5iYXNlID8gY29uZmlnLmNvbmZpZy51aWtpdC5iYXNlIDogJycpLnJlcGxhY2UoL1xcLyskL2csICcnKTtcblxuICAgICAgICAgICAgICAgIGlmICghYmFzZSkge1xuICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ1BsZWFzZSBkZWZpbmUgYmFzZSBwYXRoIHRvIFVJa2l0IGluIHRoZSByZXF1aXJlanMgY29uZmlnLicpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCByZXNvdXJjZXMubGVuZ3RoOyBpICs9IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHJlc291cmNlID0gcmVzb3VyY2VzW2ldLnJlcGxhY2UoL1xcLi9nLCAnLycpO1xuICAgICAgICAgICAgICAgICAgICBsb2FkLnB1c2goYmFzZSsnL2NvbXBvbmVudHMvJytyZXNvdXJjZSk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgcmVxKGxvYWQsIGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICBvbmxvYWQodWlraXQpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgcmV0dXJuIHVpa2l0O1xuICAgICAgICB9KTtcbiAgICB9XG5cbn0pKGZ1bmN0aW9uKCQpIHtcblxuICAgIFwidXNlIHN0cmljdFwiO1xuXG4gICAgaWYgKHdpbmRvdy5VSWtpdDIpIHtcbiAgICAgICAgcmV0dXJuIHdpbmRvdy5VSWtpdDI7XG4gICAgfVxuXG4gICAgdmFyIFVJID0ge30sIF9VSSA9IHdpbmRvdy5VSWtpdCB8fCB1bmRlZmluZWQ7XG5cbiAgICBVSS52ZXJzaW9uID0gJzIuMjcuNCc7XG5cbiAgICBVSS5ub0NvbmZsaWN0ID0gZnVuY3Rpb24oKSB7XG4gICAgICAgIC8vIHJlc3RvcmUgVUlraXQgdmVyc2lvblxuICAgICAgICBpZiAoX1VJKSB7XG4gICAgICAgICAgICB3aW5kb3cuVUlraXQgPSBfVUk7XG4gICAgICAgICAgICAkLlVJa2l0ICAgICAgPSBfVUk7XG4gICAgICAgICAgICAkLmZuLnVrICAgICAgPSBfVUkuZm47XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gVUk7XG4gICAgfTtcblxuICAgIHdpbmRvdy5VSWtpdDIgPSBVSTtcblxuICAgIGlmICghX1VJKSB7XG4gICAgICAgIHdpbmRvdy5VSWtpdCA9IFVJO1xuICAgIH1cblxuICAgIC8vIGNhY2hlIGpRdWVyeVxuICAgIFVJLiQgPSAkO1xuXG4gICAgVUkuJGRvYyAgPSBVSS4kKGRvY3VtZW50KTtcbiAgICBVSS4kd2luICA9IFVJLiQod2luZG93KTtcbiAgICBVSS4kaHRtbCA9IFVJLiQoJ2h0bWwnKTtcblxuICAgIFVJLnN1cHBvcnQgPSB7fTtcbiAgICBVSS5zdXBwb3J0LnRyYW5zaXRpb24gPSAoZnVuY3Rpb24oKSB7XG5cbiAgICAgICAgdmFyIHRyYW5zaXRpb25FbmQgPSAoZnVuY3Rpb24oKSB7XG5cbiAgICAgICAgICAgIHZhciBlbGVtZW50ID0gZG9jdW1lbnQuYm9keSB8fCBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQsXG4gICAgICAgICAgICAgICAgdHJhbnNFbmRFdmVudE5hbWVzID0ge1xuICAgICAgICAgICAgICAgICAgICBXZWJraXRUcmFuc2l0aW9uIDogJ3dlYmtpdFRyYW5zaXRpb25FbmQnLFxuICAgICAgICAgICAgICAgICAgICBNb3pUcmFuc2l0aW9uICAgIDogJ3RyYW5zaXRpb25lbmQnLFxuICAgICAgICAgICAgICAgICAgICBPVHJhbnNpdGlvbiAgICAgIDogJ29UcmFuc2l0aW9uRW5kIG90cmFuc2l0aW9uZW5kJyxcbiAgICAgICAgICAgICAgICAgICAgdHJhbnNpdGlvbiAgICAgICA6ICd0cmFuc2l0aW9uZW5kJ1xuICAgICAgICAgICAgICAgIH0sIG5hbWU7XG5cbiAgICAgICAgICAgIGZvciAobmFtZSBpbiB0cmFuc0VuZEV2ZW50TmFtZXMpIHtcbiAgICAgICAgICAgICAgICBpZiAoZWxlbWVudC5zdHlsZVtuYW1lXSAhPT0gdW5kZWZpbmVkKSByZXR1cm4gdHJhbnNFbmRFdmVudE5hbWVzW25hbWVdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KCkpO1xuXG4gICAgICAgIHJldHVybiB0cmFuc2l0aW9uRW5kICYmIHsgZW5kOiB0cmFuc2l0aW9uRW5kIH07XG4gICAgfSkoKTtcblxuICAgIFVJLnN1cHBvcnQuYW5pbWF0aW9uID0gKGZ1bmN0aW9uKCkge1xuXG4gICAgICAgIHZhciBhbmltYXRpb25FbmQgPSAoZnVuY3Rpb24oKSB7XG5cbiAgICAgICAgICAgIHZhciBlbGVtZW50ID0gZG9jdW1lbnQuYm9keSB8fCBkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQsXG4gICAgICAgICAgICAgICAgYW5pbUVuZEV2ZW50TmFtZXMgPSB7XG4gICAgICAgICAgICAgICAgICAgIFdlYmtpdEFuaW1hdGlvbiA6ICd3ZWJraXRBbmltYXRpb25FbmQnLFxuICAgICAgICAgICAgICAgICAgICBNb3pBbmltYXRpb24gICAgOiAnYW5pbWF0aW9uZW5kJyxcbiAgICAgICAgICAgICAgICAgICAgT0FuaW1hdGlvbiAgICAgIDogJ29BbmltYXRpb25FbmQgb2FuaW1hdGlvbmVuZCcsXG4gICAgICAgICAgICAgICAgICAgIGFuaW1hdGlvbiAgICAgICA6ICdhbmltYXRpb25lbmQnXG4gICAgICAgICAgICAgICAgfSwgbmFtZTtcblxuICAgICAgICAgICAgZm9yIChuYW1lIGluIGFuaW1FbmRFdmVudE5hbWVzKSB7XG4gICAgICAgICAgICAgICAgaWYgKGVsZW1lbnQuc3R5bGVbbmFtZV0gIT09IHVuZGVmaW5lZCkgcmV0dXJuIGFuaW1FbmRFdmVudE5hbWVzW25hbWVdO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KCkpO1xuXG4gICAgICAgIHJldHVybiBhbmltYXRpb25FbmQgJiYgeyBlbmQ6IGFuaW1hdGlvbkVuZCB9O1xuICAgIH0pKCk7XG5cbiAgICAvLyByZXF1ZXN0QW5pbWF0aW9uRnJhbWUgcG9seWZpbGxcbiAgICAvL2h0dHBzOi8vZ2l0aHViLmNvbS9kYXJpdXMvcmVxdWVzdEFuaW1hdGlvbkZyYW1lXG4gICAgKGZ1bmN0aW9uKCkge1xuXG4gICAgICAgIERhdGUubm93ID0gRGF0ZS5ub3cgfHwgZnVuY3Rpb24oKSB7IHJldHVybiBuZXcgRGF0ZSgpLmdldFRpbWUoKTsgfTtcblxuICAgICAgICB2YXIgdmVuZG9ycyA9IFsnd2Via2l0JywgJ21veiddO1xuICAgICAgICBmb3IgKHZhciBpID0gMDsgaSA8IHZlbmRvcnMubGVuZ3RoICYmICF3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lOyArK2kpIHtcbiAgICAgICAgICAgIHZhciB2cCA9IHZlbmRvcnNbaV07XG4gICAgICAgICAgICB3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lID0gd2luZG93W3ZwKydSZXF1ZXN0QW5pbWF0aW9uRnJhbWUnXTtcbiAgICAgICAgICAgIHdpbmRvdy5jYW5jZWxBbmltYXRpb25GcmFtZSA9ICh3aW5kb3dbdnArJ0NhbmNlbEFuaW1hdGlvbkZyYW1lJ11cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHx8IHdpbmRvd1t2cCsnQ2FuY2VsUmVxdWVzdEFuaW1hdGlvbkZyYW1lJ10pO1xuICAgICAgICB9XG4gICAgICAgIGlmICgvaVAoYWR8aG9uZXxvZCkuKk9TIDYvLnRlc3Qod2luZG93Lm5hdmlnYXRvci51c2VyQWdlbnQpIC8vIGlPUzYgaXMgYnVnZ3lcbiAgICAgICAgICAgIHx8ICF3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lIHx8ICF3aW5kb3cuY2FuY2VsQW5pbWF0aW9uRnJhbWUpIHtcbiAgICAgICAgICAgIHZhciBsYXN0VGltZSA9IDA7XG4gICAgICAgICAgICB3aW5kb3cucmVxdWVzdEFuaW1hdGlvbkZyYW1lID0gZnVuY3Rpb24oY2FsbGJhY2spIHtcbiAgICAgICAgICAgICAgICB2YXIgbm93ID0gRGF0ZS5ub3coKTtcbiAgICAgICAgICAgICAgICB2YXIgbmV4dFRpbWUgPSBNYXRoLm1heChsYXN0VGltZSArIDE2LCBub3cpO1xuICAgICAgICAgICAgICAgIHJldHVybiBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkgeyBjYWxsYmFjayhsYXN0VGltZSA9IG5leHRUaW1lKTsgfSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0VGltZSAtIG5vdyk7XG4gICAgICAgICAgICB9O1xuICAgICAgICAgICAgd2luZG93LmNhbmNlbEFuaW1hdGlvbkZyYW1lID0gY2xlYXJUaW1lb3V0O1xuICAgICAgICB9XG4gICAgfSgpKTtcblxuICAgIFVJLnN1cHBvcnQudG91Y2ggPSAoXG4gICAgICAgICgnb250b3VjaHN0YXJ0JyBpbiBkb2N1bWVudCkgfHxcbiAgICAgICAgKHdpbmRvdy5Eb2N1bWVudFRvdWNoICYmIGRvY3VtZW50IGluc3RhbmNlb2Ygd2luZG93LkRvY3VtZW50VG91Y2gpICB8fFxuICAgICAgICAod2luZG93Lm5hdmlnYXRvci5tc1BvaW50ZXJFbmFibGVkICYmIHdpbmRvdy5uYXZpZ2F0b3IubXNNYXhUb3VjaFBvaW50cyA+IDApIHx8IC8vSUUgMTBcbiAgICAgICAgKHdpbmRvdy5uYXZpZ2F0b3IucG9pbnRlckVuYWJsZWQgJiYgd2luZG93Lm5hdmlnYXRvci5tYXhUb3VjaFBvaW50cyA+IDApIHx8IC8vSUUgPj0xMVxuICAgICAgICBmYWxzZVxuICAgICk7XG5cbiAgICBVSS5zdXBwb3J0Lm11dGF0aW9ub2JzZXJ2ZXIgPSAod2luZG93Lk11dGF0aW9uT2JzZXJ2ZXIgfHwgd2luZG93LldlYktpdE11dGF0aW9uT2JzZXJ2ZXIgfHwgbnVsbCk7XG5cbiAgICBVSS5VdGlscyA9IHt9O1xuXG4gICAgVUkuVXRpbHMuaXNGdWxsc2NyZWVuID0gZnVuY3Rpb24oKSB7XG4gICAgICAgIHJldHVybiBkb2N1bWVudC53ZWJraXRGdWxsc2NyZWVuRWxlbWVudCB8fCBkb2N1bWVudC5tb3pGdWxsU2NyZWVuRWxlbWVudCB8fCBkb2N1bWVudC5tc0Z1bGxzY3JlZW5FbGVtZW50IHx8IGRvY3VtZW50LmZ1bGxzY3JlZW5FbGVtZW50IHx8IGZhbHNlO1xuICAgIH07XG5cbiAgICBVSS5VdGlscy5zdHIyanNvbiA9IGZ1bmN0aW9uKHN0ciwgbm90ZXZpbCkge1xuICAgICAgICB0cnkge1xuICAgICAgICAgICAgaWYgKG5vdGV2aWwpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gSlNPTi5wYXJzZShzdHJcbiAgICAgICAgICAgICAgICAgICAgLy8gd3JhcCBrZXlzIHdpdGhvdXQgcXVvdGUgd2l0aCB2YWxpZCBkb3VibGUgcXVvdGVcbiAgICAgICAgICAgICAgICAgICAgLnJlcGxhY2UoLyhbXFwkXFx3XSspXFxzKjovZywgZnVuY3Rpb24oXywgJDEpe3JldHVybiAnXCInKyQxKydcIjonO30pXG4gICAgICAgICAgICAgICAgICAgIC8vIHJlcGxhY2luZyBzaW5nbGUgcXVvdGUgd3JhcHBlZCBvbmVzIHRvIGRvdWJsZSBxdW90ZVxuICAgICAgICAgICAgICAgICAgICAucmVwbGFjZSgvJyhbXiddKyknL2csIGZ1bmN0aW9uKF8sICQxKXtyZXR1cm4gJ1wiJyskMSsnXCInO30pXG4gICAgICAgICAgICAgICAgKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIChuZXcgRnVuY3Rpb24oJycsICd2YXIganNvbiA9ICcgKyBzdHIgKyAnOyByZXR1cm4gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShqc29uKSk7JykpKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0gY2F0Y2goZSkgeyByZXR1cm4gZmFsc2U7IH1cbiAgICB9O1xuXG4gICAgVUkuVXRpbHMuZGVib3VuY2UgPSBmdW5jdGlvbihmdW5jLCB3YWl0LCBpbW1lZGlhdGUpIHtcbiAgICAgICAgdmFyIHRpbWVvdXQ7XG4gICAgICAgIHJldHVybiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHZhciBjb250ZXh0ID0gdGhpcywgYXJncyA9IGFyZ3VtZW50cztcbiAgICAgICAgICAgIHZhciBsYXRlciA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgIHRpbWVvdXQgPSBudWxsO1xuICAgICAgICAgICAgICAgIGlmICghaW1tZWRpYXRlKSBmdW5jLmFwcGx5KGNvbnRleHQsIGFyZ3MpO1xuICAgICAgICAgICAgfTtcbiAgICAgICAgICAgIHZhciBjYWxsTm93ID0gaW1tZWRpYXRlICYmICF0aW1lb3V0O1xuICAgICAgICAgICAgY2xlYXJUaW1lb3V0KHRpbWVvdXQpO1xuICAgICAgICAgICAgdGltZW91dCA9IHNldFRpbWVvdXQobGF0ZXIsIHdhaXQpO1xuICAgICAgICAgICAgaWYgKGNhbGxOb3cpIGZ1bmMuYXBwbHkoY29udGV4dCwgYXJncyk7XG4gICAgICAgIH07XG4gICAgfTtcblxuICAgIFVJLlV0aWxzLnRocm90dGxlID0gZnVuY3Rpb24gKGZ1bmMsIGxpbWl0KSB7XG4gICAgICAgIHZhciB3YWl0ID0gZmFsc2U7XG4gICAgICAgIHJldHVybiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICBpZiAoIXdhaXQpIHtcbiAgICAgICAgICAgICAgICBmdW5jLmNhbGwoKTtcbiAgICAgICAgICAgICAgICB3YWl0ID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgd2FpdCA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIH0sIGxpbWl0KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuICAgIH07XG5cbiAgICBVSS5VdGlscy5yZW1vdmVDc3NSdWxlcyA9IGZ1bmN0aW9uKHNlbGVjdG9yUmVnRXgpIHtcbiAgICAgICAgdmFyIGlkeCwgaWR4cywgc3R5bGVzaGVldCwgX2ksIF9qLCBfaywgX2xlbiwgX2xlbjEsIF9sZW4yLCBfcmVmO1xuXG4gICAgICAgIGlmKCFzZWxlY3RvclJlZ0V4KSByZXR1cm47XG5cbiAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbigpe1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgX3JlZiA9IGRvY3VtZW50LnN0eWxlU2hlZXRzO1xuICAgICAgICAgICAgICBmb3IgKF9pID0gMCwgX2xlbiA9IF9yZWYubGVuZ3RoOyBfaSA8IF9sZW47IF9pKyspIHtcbiAgICAgICAgICAgICAgICBzdHlsZXNoZWV0ID0gX3JlZltfaV07XG4gICAgICAgICAgICAgICAgaWR4cyA9IFtdO1xuICAgICAgICAgICAgICAgIHN0eWxlc2hlZXQuY3NzUnVsZXMgPSBzdHlsZXNoZWV0LmNzc1J1bGVzO1xuICAgICAgICAgICAgICAgIGZvciAoaWR4ID0gX2ogPSAwLCBfbGVuMSA9IHN0eWxlc2hlZXQuY3NzUnVsZXMubGVuZ3RoOyBfaiA8IF9sZW4xOyBpZHggPSArK19qKSB7XG4gICAgICAgICAgICAgICAgICBpZiAoc3R5bGVzaGVldC5jc3NSdWxlc1tpZHhdLnR5cGUgPT09IENTU1J1bGUuU1RZTEVfUlVMRSAmJiBzZWxlY3RvclJlZ0V4LnRlc3Qoc3R5bGVzaGVldC5jc3NSdWxlc1tpZHhdLnNlbGVjdG9yVGV4dCkpIHtcbiAgICAgICAgICAgICAgICAgICAgaWR4cy51bnNoaWZ0KGlkeCk7XG4gICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIGZvciAoX2sgPSAwLCBfbGVuMiA9IGlkeHMubGVuZ3RoOyBfayA8IF9sZW4yOyBfaysrKSB7XG4gICAgICAgICAgICAgICAgICBzdHlsZXNoZWV0LmRlbGV0ZVJ1bGUoaWR4c1tfa10pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSBjYXRjaCAoX2Vycm9yKSB7fVxuICAgICAgICB9LCAwKTtcbiAgICB9O1xuXG4gICAgVUkuVXRpbHMuaXNJblZpZXcgPSBmdW5jdGlvbihlbGVtZW50LCBvcHRpb25zKSB7XG5cbiAgICAgICAgdmFyICRlbGVtZW50ID0gJChlbGVtZW50KTtcblxuICAgICAgICBpZiAoISRlbGVtZW50LmlzKCc6dmlzaWJsZScpKSB7XG4gICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgd2luZG93X2xlZnQgPSBVSS4kd2luLnNjcm9sbExlZnQoKSwgd2luZG93X3RvcCA9IFVJLiR3aW4uc2Nyb2xsVG9wKCksIG9mZnNldCA9ICRlbGVtZW50Lm9mZnNldCgpLCBsZWZ0ID0gb2Zmc2V0LmxlZnQsIHRvcCA9IG9mZnNldC50b3A7XG5cbiAgICAgICAgb3B0aW9ucyA9ICQuZXh0ZW5kKHt0b3BvZmZzZXQ6MCwgbGVmdG9mZnNldDowfSwgb3B0aW9ucyk7XG5cbiAgICAgICAgaWYgKHRvcCArICRlbGVtZW50LmhlaWdodCgpID49IHdpbmRvd190b3AgJiYgdG9wIC0gb3B0aW9ucy50b3BvZmZzZXQgPD0gd2luZG93X3RvcCArIFVJLiR3aW4uaGVpZ2h0KCkgJiZcbiAgICAgICAgICAgIGxlZnQgKyAkZWxlbWVudC53aWR0aCgpID49IHdpbmRvd19sZWZ0ICYmIGxlZnQgLSBvcHRpb25zLmxlZnRvZmZzZXQgPD0gd2luZG93X2xlZnQgKyBVSS4kd2luLndpZHRoKCkpIHtcbiAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgVUkuVXRpbHMuY2hlY2tEaXNwbGF5ID0gZnVuY3Rpb24oY29udGV4dCwgaW5pdGFuaW1hdGlvbikge1xuXG4gICAgICAgIHZhciBlbGVtZW50cyA9IFVJLiQoJ1tkYXRhLXVrLW1hcmdpbl0sIFtkYXRhLXVrLWdyaWQtbWF0Y2hdLCBbZGF0YS11ay1ncmlkLW1hcmdpbl0sIFtkYXRhLXVrLWNoZWNrLWRpc3BsYXldJywgY29udGV4dCB8fCBkb2N1bWVudCksIGFuaW1hdGVkO1xuXG4gICAgICAgIGlmIChjb250ZXh0ICYmICFlbGVtZW50cy5sZW5ndGgpIHtcbiAgICAgICAgICAgIGVsZW1lbnRzID0gJChjb250ZXh0KTtcbiAgICAgICAgfVxuXG4gICAgICAgIGVsZW1lbnRzLnRyaWdnZXIoJ2Rpc3BsYXkudWsuY2hlY2snKTtcblxuICAgICAgICAvLyBmaXggZmlyZWZveCAvIElFIGFuaW1hdGlvbnNcbiAgICAgICAgaWYgKGluaXRhbmltYXRpb24pIHtcblxuICAgICAgICAgICAgaWYgKHR5cGVvZihpbml0YW5pbWF0aW9uKSE9J3N0cmluZycpIHtcbiAgICAgICAgICAgICAgICBpbml0YW5pbWF0aW9uID0gJ1tjbGFzcyo9XCJ1ay1hbmltYXRpb24tXCJdJztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZWxlbWVudHMuZmluZChpbml0YW5pbWF0aW9uKS5lYWNoKGZ1bmN0aW9uKCl7XG5cbiAgICAgICAgICAgICAgICB2YXIgZWxlICA9IFVJLiQodGhpcyksXG4gICAgICAgICAgICAgICAgICAgIGNscyAgPSBlbGUuYXR0cignY2xhc3MnKSxcbiAgICAgICAgICAgICAgICAgICAgYW5pbSA9IGNscy5tYXRjaCgvdWstYW5pbWF0aW9uLSguKykvKTtcblxuICAgICAgICAgICAgICAgIGVsZS5yZW1vdmVDbGFzcyhhbmltWzBdKS53aWR0aCgpO1xuXG4gICAgICAgICAgICAgICAgZWxlLmFkZENsYXNzKGFuaW1bMF0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZWxlbWVudHM7XG4gICAgfTtcblxuICAgIFVJLlV0aWxzLm9wdGlvbnMgPSBmdW5jdGlvbihzdHJpbmcpIHtcblxuICAgICAgICBpZiAoJC50eXBlKHN0cmluZykhPSdzdHJpbmcnKSByZXR1cm4gc3RyaW5nO1xuXG4gICAgICAgIGlmIChzdHJpbmcuaW5kZXhPZignOicpICE9IC0xICYmIHN0cmluZy50cmltKCkuc3Vic3RyKC0xKSAhPSAnfScpIHtcbiAgICAgICAgICAgIHN0cmluZyA9ICd7JytzdHJpbmcrJ30nO1xuICAgICAgICB9XG5cbiAgICAgICAgdmFyIHN0YXJ0ID0gKHN0cmluZyA/IHN0cmluZy5pbmRleE9mKFwie1wiKSA6IC0xKSwgb3B0aW9ucyA9IHt9O1xuXG4gICAgICAgIGlmIChzdGFydCAhPSAtMSkge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBvcHRpb25zID0gVUkuVXRpbHMuc3RyMmpzb24oc3RyaW5nLnN1YnN0cihzdGFydCkpO1xuICAgICAgICAgICAgfSBjYXRjaCAoZSkge31cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBvcHRpb25zO1xuICAgIH07XG5cbiAgICBVSS5VdGlscy5hbmltYXRlID0gZnVuY3Rpb24oZWxlbWVudCwgY2xzKSB7XG5cbiAgICAgICAgdmFyIGQgPSAkLkRlZmVycmVkKCk7XG5cbiAgICAgICAgZWxlbWVudCA9IFVJLiQoZWxlbWVudCk7XG5cbiAgICAgICAgZWxlbWVudC5jc3MoJ2Rpc3BsYXknLCAnbm9uZScpLmFkZENsYXNzKGNscykub25lKFVJLnN1cHBvcnQuYW5pbWF0aW9uLmVuZCwgZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICBlbGVtZW50LnJlbW92ZUNsYXNzKGNscyk7XG4gICAgICAgICAgICBkLnJlc29sdmUoKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgZWxlbWVudC5jc3MoJ2Rpc3BsYXknLCAnJyk7XG5cbiAgICAgICAgcmV0dXJuIGQucHJvbWlzZSgpO1xuICAgIH07XG5cbiAgICBVSS5VdGlscy51aWQgPSBmdW5jdGlvbihwcmVmaXgpIHtcbiAgICAgICAgcmV0dXJuIChwcmVmaXggfHwgJ2lkJykgKyAobmV3IERhdGUoKS5nZXRUaW1lKCkpK1wiUkFORFwiKyhNYXRoLmNlaWwoTWF0aC5yYW5kb20oKSAqIDEwMDAwMCkpO1xuICAgIH07XG5cbiAgICBVSS5VdGlscy50ZW1wbGF0ZSA9IGZ1bmN0aW9uKHN0ciwgZGF0YSkge1xuXG4gICAgICAgIHZhciB0b2tlbnMgPSBzdHIucmVwbGFjZSgvXFxuL2csICdcXFxcbicpLnJlcGxhY2UoL1xce1xce1xce1xccyooLis/KVxccypcXH1cXH1cXH0vZywgXCJ7eyEkMX19XCIpLnNwbGl0KC8oXFx7XFx7XFxzKiguKz8pXFxzKlxcfVxcfSkvZyksXG4gICAgICAgICAgICBpPTAsIHRvYywgY21kLCBwcm9wLCB2YWwsIGZuLCBvdXRwdXQgPSBbXSwgb3BlbmJsb2NrcyA9IDA7XG5cbiAgICAgICAgd2hpbGUoaSA8IHRva2Vucy5sZW5ndGgpIHtcblxuICAgICAgICAgICAgdG9jID0gdG9rZW5zW2ldO1xuXG4gICAgICAgICAgICBpZih0b2MubWF0Y2goL1xce1xce1xccyooLis/KVxccypcXH1cXH0vKSkge1xuICAgICAgICAgICAgICAgIGkgPSBpICsgMTtcbiAgICAgICAgICAgICAgICB0b2MgID0gdG9rZW5zW2ldO1xuICAgICAgICAgICAgICAgIGNtZCAgPSB0b2NbMF07XG4gICAgICAgICAgICAgICAgcHJvcCA9IHRvYy5zdWJzdHJpbmcodG9jLm1hdGNoKC9eKFxcXnxcXCN8XFwhfFxcfnxcXDopLykgPyAxOjApO1xuXG4gICAgICAgICAgICAgICAgc3dpdGNoKGNtZCkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlICd+JzpcbiAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dC5wdXNoKCdmb3IodmFyICRpPTA7JGk8Jytwcm9wKycubGVuZ3RoOyRpKyspIHsgdmFyICRpdGVtID0gJytwcm9wKydbJGldOycpO1xuICAgICAgICAgICAgICAgICAgICAgICAgb3BlbmJsb2NrcysrO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJzonOlxuICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0LnB1c2goJ2Zvcih2YXIgJGtleSBpbiAnK3Byb3ArJykgeyB2YXIgJHZhbCA9ICcrcHJvcCsnWyRrZXldOycpO1xuICAgICAgICAgICAgICAgICAgICAgICAgb3BlbmJsb2NrcysrO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJyMnOlxuICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0LnB1c2goJ2lmKCcrcHJvcCsnKSB7Jyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBvcGVuYmxvY2tzKys7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAnXic6XG4gICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQucHVzaCgnaWYoIScrcHJvcCsnKSB7Jyk7XG4gICAgICAgICAgICAgICAgICAgICAgICBvcGVuYmxvY2tzKys7XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAnLyc6XG4gICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQucHVzaCgnfScpO1xuICAgICAgICAgICAgICAgICAgICAgICAgb3BlbmJsb2Nrcy0tO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJyEnOlxuICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0LnB1c2goJ19fcmV0LnB1c2goJytwcm9wKycpOycpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQucHVzaCgnX19yZXQucHVzaChlc2NhcGUoJytwcm9wKycpKTsnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgb3V0cHV0LnB1c2goXCJfX3JldC5wdXNoKCdcIit0b2MucmVwbGFjZSgvXFwnL2csIFwiXFxcXCdcIikrXCInKTtcIik7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpID0gaSArIDE7XG4gICAgICAgIH1cblxuICAgICAgICBmbiAgPSBuZXcgRnVuY3Rpb24oJyRkYXRhJywgW1xuICAgICAgICAgICAgJ3ZhciBfX3JldCA9IFtdOycsXG4gICAgICAgICAgICAndHJ5IHsnLFxuICAgICAgICAgICAgJ3dpdGgoJGRhdGEpeycsICghb3BlbmJsb2NrcyA/IG91dHB1dC5qb2luKCcnKSA6ICdfX3JldCA9IFtcIk5vdCBhbGwgYmxvY2tzIGFyZSBjbG9zZWQgY29ycmVjdGx5LlwiXScpLCAnfTsnLFxuICAgICAgICAgICAgJ31jYXRjaChlKXtfX3JldCA9IFtlLm1lc3NhZ2VdO30nLFxuICAgICAgICAgICAgJ3JldHVybiBfX3JldC5qb2luKFwiXCIpLnJlcGxhY2UoL1xcXFxuXFxcXG4vZywgXCJcXFxcblwiKTsnLFxuICAgICAgICAgICAgXCJmdW5jdGlvbiBlc2NhcGUoaHRtbCkgeyByZXR1cm4gU3RyaW5nKGh0bWwpLnJlcGxhY2UoLyYvZywgJyZhbXA7JykucmVwbGFjZSgvXFxcIi9nLCAnJnF1b3Q7JykucmVwbGFjZSgvPC9nLCAnJmx0OycpLnJlcGxhY2UoLz4vZywgJyZndDsnKTt9XCJcbiAgICAgICAgXS5qb2luKFwiXFxuXCIpKTtcblxuICAgICAgICByZXR1cm4gZGF0YSA/IGZuKGRhdGEpIDogZm47XG4gICAgfTtcblxuICAgIFVJLlV0aWxzLmZvY3VzID0gZnVuY3Rpb24oZWxlbWVudCwgZXh0cmEpIHtcblxuICAgICAgICBlbGVtZW50ID0gJChlbGVtZW50KTtcblxuICAgICAgICBpZiAoIWVsZW1lbnQubGVuZ3RoKSB7XG4gICAgICAgICAgICByZXR1cm4gZWxlbWVudDtcbiAgICAgICAgfVxuXG4gICAgICAgIHZhciBhdXRvZm9jdXMgPSBlbGVtZW50LmZpbmQoJ1thdXRvZm9jdXNdOmZpcnN0JyksIHRhYmlkeDtcblxuICAgICAgICBpZiAoYXV0b2ZvY3VzLmxlbmd0aCkge1xuICAgICAgICAgICAgcmV0dXJuIGF1dG9mb2N1cy5mb2N1cygpO1xuICAgICAgICB9XG5cbiAgICAgICAgYXV0b2ZvY3VzID0gZWxlbWVudC5maW5kKCc6aW5wdXQnKyhleHRyYSAmJiAoJywnK2V4dHJhKSB8fCAnJykpLmZpcnN0KCk7XG5cbiAgICAgICAgaWYgKGF1dG9mb2N1cy5sZW5ndGgpIHtcbiAgICAgICAgICAgIHJldHVybiBhdXRvZm9jdXMuZm9jdXMoKTtcbiAgICAgICAgfVxuXG4gICAgICAgIGlmICghZWxlbWVudC5hdHRyKCd0YWJpbmRleCcpKSB7XG4gICAgICAgICAgICB0YWJpZHggPSAxMDAwO1xuICAgICAgICAgICAgZWxlbWVudC5hdHRyKCd0YWJpbmRleCcsIHRhYmlkeCk7XG4gICAgICAgIH1cblxuICAgICAgICBlbGVtZW50WzBdLmZvY3VzKCk7XG5cbiAgICAgICAgaWYgKHRhYmlkeCkge1xuICAgICAgICAgICAgZWxlbWVudC5hdHRyKCd0YWJpbmRleCcsICcnKTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBlbGVtZW50O1xuICAgIH1cblxuICAgIFVJLlV0aWxzLmV2ZW50cyAgICAgICA9IHt9O1xuICAgIFVJLlV0aWxzLmV2ZW50cy5jbGljayA9IFVJLnN1cHBvcnQudG91Y2ggPyAndGFwJyA6ICdjbGljayc7XG5cbiAgICAvLyBkZXByZWNhdGVkXG5cbiAgICBVSS5mbiA9IGZ1bmN0aW9uKGNvbW1hbmQsIG9wdGlvbnMpIHtcblxuICAgICAgICB2YXIgYXJncyA9IGFyZ3VtZW50cywgY21kID0gY29tbWFuZC5tYXRjaCgvXihbYS16XFwtXSspKD86XFwuKFthLXpdKykpPy9pKSwgY29tcG9uZW50ID0gY21kWzFdLCBtZXRob2QgPSBjbWRbMl07XG5cbiAgICAgICAgaWYgKCFVSVtjb21wb25lbnRdKSB7XG4gICAgICAgICAgICAkLmVycm9yKCdVSWtpdCBjb21wb25lbnQgWycgKyBjb21wb25lbnQgKyAnXSBkb2VzIG5vdCBleGlzdC4nKTtcbiAgICAgICAgICAgIHJldHVybiB0aGlzO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHZhciAkdGhpcyA9ICQodGhpcyksIGRhdGEgPSAkdGhpcy5kYXRhKGNvbXBvbmVudCk7XG4gICAgICAgICAgICBpZiAoIWRhdGEpICR0aGlzLmRhdGEoY29tcG9uZW50LCAoZGF0YSA9IFVJW2NvbXBvbmVudF0odGhpcywgbWV0aG9kID8gdW5kZWZpbmVkIDogb3B0aW9ucykpKTtcbiAgICAgICAgICAgIGlmIChtZXRob2QpIGRhdGFbbWV0aG9kXS5hcHBseShkYXRhLCBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmdzLCAxKSk7XG4gICAgICAgIH0pO1xuICAgIH07XG5cbiAgICAkLlVJa2l0ICAgICAgICAgID0gVUk7XG4gICAgJC5mbi51ayAgICAgICAgICA9IFVJLmZuO1xuXG4gICAgVUkubGFuZ2RpcmVjdGlvbiA9IFVJLiRodG1sLmF0dHIoXCJkaXJcIikgPT0gXCJydGxcIiA/IFwicmlnaHRcIiA6IFwibGVmdFwiO1xuXG4gICAgVUkuY29tcG9uZW50cyAgICA9IHt9O1xuXG4gICAgVUkuY29tcG9uZW50ID0gZnVuY3Rpb24obmFtZSwgZGVmLCBvdmVycmlkZSkge1xuXG4gICAgICAgIGlmIChVSS5jb21wb25lbnRzW25hbWVdICYmICFvdmVycmlkZSkge1xuICAgICAgICAgICAgcmV0dXJuIFVJLmNvbXBvbmVudHNbbmFtZV07XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgZm4gPSBmdW5jdGlvbihlbGVtZW50LCBvcHRpb25zKSB7XG5cbiAgICAgICAgICAgIHZhciAkdGhpcyA9IHRoaXM7XG5cbiAgICAgICAgICAgIHRoaXMuVUlraXQgICA9IFVJO1xuICAgICAgICAgICAgdGhpcy5lbGVtZW50ID0gZWxlbWVudCA/IFVJLiQoZWxlbWVudCkgOiBudWxsO1xuICAgICAgICAgICAgdGhpcy5vcHRpb25zID0gJC5leHRlbmQodHJ1ZSwge30sIHRoaXMuZGVmYXVsdHMsIG9wdGlvbnMpO1xuICAgICAgICAgICAgdGhpcy5wbHVnaW5zID0ge307XG5cbiAgICAgICAgICAgIGlmICh0aGlzLmVsZW1lbnQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmVsZW1lbnQuZGF0YShuYW1lLCB0aGlzKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5pbml0KCk7XG5cbiAgICAgICAgICAgICh0aGlzLm9wdGlvbnMucGx1Z2lucy5sZW5ndGggPyB0aGlzLm9wdGlvbnMucGx1Z2lucyA6IE9iamVjdC5rZXlzKGZuLnBsdWdpbnMpKS5mb3JFYWNoKGZ1bmN0aW9uKHBsdWdpbikge1xuXG4gICAgICAgICAgICAgICAgaWYgKGZuLnBsdWdpbnNbcGx1Z2luXS5pbml0KSB7XG4gICAgICAgICAgICAgICAgICAgIGZuLnBsdWdpbnNbcGx1Z2luXS5pbml0KCR0aGlzKTtcbiAgICAgICAgICAgICAgICAgICAgJHRoaXMucGx1Z2luc1twbHVnaW5dID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICB0aGlzLnRyaWdnZXIoJ2luaXQudWsuY29tcG9uZW50JywgW25hbWUsIHRoaXNdKTtcblxuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIH07XG5cbiAgICAgICAgZm4ucGx1Z2lucyA9IHt9O1xuXG4gICAgICAgICQuZXh0ZW5kKHRydWUsIGZuLnByb3RvdHlwZSwge1xuXG4gICAgICAgICAgICBkZWZhdWx0cyA6IHtwbHVnaW5zOiBbXX0sXG5cbiAgICAgICAgICAgIGJvb3Q6IGZ1bmN0aW9uKCl7fSxcbiAgICAgICAgICAgIGluaXQ6IGZ1bmN0aW9uKCl7fSxcblxuICAgICAgICAgICAgb246IGZ1bmN0aW9uKGExLGEyLGEzKXtcbiAgICAgICAgICAgICAgICByZXR1cm4gVUkuJCh0aGlzLmVsZW1lbnQgfHwgdGhpcykub24oYTEsYTIsYTMpO1xuICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgb25lOiBmdW5jdGlvbihhMSxhMixhMyl7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFVJLiQodGhpcy5lbGVtZW50IHx8IHRoaXMpLm9uZShhMSxhMixhMyk7XG4gICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICBvZmY6IGZ1bmN0aW9uKGV2dCl7XG4gICAgICAgICAgICAgICAgcmV0dXJuIFVJLiQodGhpcy5lbGVtZW50IHx8IHRoaXMpLm9mZihldnQpO1xuICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgdHJpZ2dlcjogZnVuY3Rpb24oZXZ0LCBwYXJhbXMpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gVUkuJCh0aGlzLmVsZW1lbnQgfHwgdGhpcykudHJpZ2dlcihldnQsIHBhcmFtcyk7XG4gICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICBmaW5kOiBmdW5jdGlvbihzZWxlY3Rvcikge1xuICAgICAgICAgICAgICAgIHJldHVybiBVSS4kKHRoaXMuZWxlbWVudCA/IHRoaXMuZWxlbWVudDogW10pLmZpbmQoc2VsZWN0b3IpO1xuICAgICAgICAgICAgfSxcblxuICAgICAgICAgICAgcHJveHk6IGZ1bmN0aW9uKG9iaiwgbWV0aG9kcykge1xuXG4gICAgICAgICAgICAgICAgdmFyICR0aGlzID0gdGhpcztcblxuICAgICAgICAgICAgICAgIG1ldGhvZHMuc3BsaXQoJyAnKS5mb3JFYWNoKGZ1bmN0aW9uKG1ldGhvZCkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoISR0aGlzW21ldGhvZF0pICR0aGlzW21ldGhvZF0gPSBmdW5jdGlvbigpIHsgcmV0dXJuIG9ialttZXRob2RdLmFwcGx5KG9iaiwgYXJndW1lbnRzKTsgfTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgIG1peGluOiBmdW5jdGlvbihvYmosIG1ldGhvZHMpIHtcblxuICAgICAgICAgICAgICAgIHZhciAkdGhpcyA9IHRoaXM7XG5cbiAgICAgICAgICAgICAgICBtZXRob2RzLnNwbGl0KCcgJykuZm9yRWFjaChmdW5jdGlvbihtZXRob2QpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCEkdGhpc1ttZXRob2RdKSAkdGhpc1ttZXRob2RdID0gb2JqW21ldGhvZF0uYmluZCgkdGhpcyk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICBvcHRpb246IGZ1bmN0aW9uKCkge1xuXG4gICAgICAgICAgICAgICAgaWYgKGFyZ3VtZW50cy5sZW5ndGggPT0gMSkge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5vcHRpb25zW2FyZ3VtZW50c1swXV0gfHwgdW5kZWZpbmVkO1xuICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoYXJndW1lbnRzLmxlbmd0aCA9PSAyKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMub3B0aW9uc1thcmd1bWVudHNbMF1dID0gYXJndW1lbnRzWzFdO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH1cblxuICAgICAgICB9LCBkZWYpO1xuXG4gICAgICAgIHRoaXMuY29tcG9uZW50c1tuYW1lXSA9IGZuO1xuXG4gICAgICAgIHRoaXNbbmFtZV0gPSBmdW5jdGlvbigpIHtcblxuICAgICAgICAgICAgdmFyIGVsZW1lbnQsIG9wdGlvbnM7XG5cbiAgICAgICAgICAgIGlmIChhcmd1bWVudHMubGVuZ3RoKSB7XG5cbiAgICAgICAgICAgICAgICBzd2l0Y2goYXJndW1lbnRzLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICBjYXNlIDE6XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0eXBlb2YgYXJndW1lbnRzWzBdID09PSAnc3RyaW5nJyB8fCBhcmd1bWVudHNbMF0ubm9kZVR5cGUgfHwgYXJndW1lbnRzWzBdIGluc3RhbmNlb2YgalF1ZXJ5KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudCA9ICQoYXJndW1lbnRzWzBdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucyA9IGFyZ3VtZW50c1swXTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgMjpcblxuICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudCA9ICQoYXJndW1lbnRzWzBdKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMgPSBhcmd1bWVudHNbMV07XG4gICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChlbGVtZW50ICYmIGVsZW1lbnQuZGF0YShuYW1lKSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBlbGVtZW50LmRhdGEobmFtZSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiAobmV3IFVJLmNvbXBvbmVudHNbbmFtZV0oZWxlbWVudCwgb3B0aW9ucykpO1xuICAgICAgICB9O1xuXG4gICAgICAgIGlmIChVSS5kb21yZWFkeSkge1xuICAgICAgICAgICAgVUkuY29tcG9uZW50LmJvb3QobmFtZSk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZm47XG4gICAgfTtcblxuICAgIFVJLnBsdWdpbiA9IGZ1bmN0aW9uKGNvbXBvbmVudCwgbmFtZSwgZGVmKSB7XG4gICAgICAgIHRoaXMuY29tcG9uZW50c1tjb21wb25lbnRdLnBsdWdpbnNbbmFtZV0gPSBkZWY7XG4gICAgfTtcblxuICAgIFVJLmNvbXBvbmVudC5ib290ID0gZnVuY3Rpb24obmFtZSkge1xuXG4gICAgICAgIGlmIChVSS5jb21wb25lbnRzW25hbWVdLnByb3RvdHlwZSAmJiBVSS5jb21wb25lbnRzW25hbWVdLnByb3RvdHlwZS5ib290ICYmICFVSS5jb21wb25lbnRzW25hbWVdLmJvb3RlZCkge1xuICAgICAgICAgICAgVUkuY29tcG9uZW50c1tuYW1lXS5wcm90b3R5cGUuYm9vdC5hcHBseShVSSwgW10pO1xuICAgICAgICAgICAgVUkuY29tcG9uZW50c1tuYW1lXS5ib290ZWQgPSB0cnVlO1xuICAgICAgICB9XG4gICAgfTtcblxuICAgIFVJLmNvbXBvbmVudC5ib290Q29tcG9uZW50cyA9IGZ1bmN0aW9uKCkge1xuXG4gICAgICAgIGZvciAodmFyIGNvbXBvbmVudCBpbiBVSS5jb21wb25lbnRzKSB7XG4gICAgICAgICAgICBVSS5jb21wb25lbnQuYm9vdChjb21wb25lbnQpO1xuICAgICAgICB9XG4gICAgfTtcblxuXG4gICAgLy8gRE9NIG11dGF0aW9uIHNhdmUgcmVhZHkgaGVscGVyIGZ1bmN0aW9uXG5cbiAgICBVSS5kb21PYnNlcnZlcnMgPSBbXTtcbiAgICBVSS5kb21yZWFkeSAgICAgPSBmYWxzZTtcblxuICAgIFVJLnJlYWR5ID0gZnVuY3Rpb24oZm4pIHtcblxuICAgICAgICBVSS5kb21PYnNlcnZlcnMucHVzaChmbik7XG5cbiAgICAgICAgaWYgKFVJLmRvbXJlYWR5KSB7XG4gICAgICAgICAgICBmbihkb2N1bWVudCk7XG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgVUkub24gPSBmdW5jdGlvbihhMSxhMixhMyl7XG5cbiAgICAgICAgaWYgKGExICYmIGExLmluZGV4T2YoJ3JlYWR5LnVrLmRvbScpID4gLTEgJiYgVUkuZG9tcmVhZHkpIHtcbiAgICAgICAgICAgIGEyLmFwcGx5KFVJLiRkb2MpO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIFVJLiRkb2Mub24oYTEsYTIsYTMpO1xuICAgIH07XG5cbiAgICBVSS5vbmUgPSBmdW5jdGlvbihhMSxhMixhMyl7XG5cbiAgICAgICAgaWYgKGExICYmIGExLmluZGV4T2YoJ3JlYWR5LnVrLmRvbScpID4gLTEgJiYgVUkuZG9tcmVhZHkpIHtcbiAgICAgICAgICAgIGEyLmFwcGx5KFVJLiRkb2MpO1xuICAgICAgICAgICAgcmV0dXJuIFVJLiRkb2M7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gVUkuJGRvYy5vbmUoYTEsYTIsYTMpO1xuICAgIH07XG5cbiAgICBVSS50cmlnZ2VyID0gZnVuY3Rpb24oZXZ0LCBwYXJhbXMpIHtcbiAgICAgICAgcmV0dXJuIFVJLiRkb2MudHJpZ2dlcihldnQsIHBhcmFtcyk7XG4gICAgfTtcblxuICAgIFVJLmRvbU9ic2VydmUgPSBmdW5jdGlvbihzZWxlY3RvciwgZm4pIHtcblxuICAgICAgICBpZighVUkuc3VwcG9ydC5tdXRhdGlvbm9ic2VydmVyKSByZXR1cm47XG5cbiAgICAgICAgZm4gPSBmbiB8fCBmdW5jdGlvbigpIHt9O1xuXG4gICAgICAgIFVJLiQoc2VsZWN0b3IpLmVhY2goZnVuY3Rpb24oKSB7XG5cbiAgICAgICAgICAgIHZhciBlbGVtZW50ICA9IHRoaXMsXG4gICAgICAgICAgICAgICAgJGVsZW1lbnQgPSBVSS4kKGVsZW1lbnQpO1xuXG4gICAgICAgICAgICBpZiAoJGVsZW1lbnQuZGF0YSgnb2JzZXJ2ZXInKSkge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdHJ5IHtcblxuICAgICAgICAgICAgICAgIHZhciBvYnNlcnZlciA9IG5ldyBVSS5zdXBwb3J0Lm11dGF0aW9ub2JzZXJ2ZXIoVUkuVXRpbHMuZGVib3VuY2UoZnVuY3Rpb24obXV0YXRpb25zKSB7XG4gICAgICAgICAgICAgICAgICAgIGZuLmFwcGx5KGVsZW1lbnQsIFskZWxlbWVudF0pO1xuICAgICAgICAgICAgICAgICAgICAkZWxlbWVudC50cmlnZ2VyKCdjaGFuZ2VkLnVrLmRvbScpO1xuICAgICAgICAgICAgICAgIH0sIDUwKSwge2NoaWxkTGlzdDogdHJ1ZSwgc3VidHJlZTogdHJ1ZX0pO1xuXG4gICAgICAgICAgICAgICAgLy8gcGFzcyBpbiB0aGUgdGFyZ2V0IG5vZGUsIGFzIHdlbGwgYXMgdGhlIG9ic2VydmVyIG9wdGlvbnNcbiAgICAgICAgICAgICAgICBvYnNlcnZlci5vYnNlcnZlKGVsZW1lbnQsIHsgY2hpbGRMaXN0OiB0cnVlLCBzdWJ0cmVlOiB0cnVlIH0pO1xuXG4gICAgICAgICAgICAgICAgJGVsZW1lbnQuZGF0YSgnb2JzZXJ2ZXInLCBvYnNlcnZlcik7XG5cbiAgICAgICAgICAgIH0gY2F0Y2goZSkge31cbiAgICAgICAgfSk7XG4gICAgfTtcblxuICAgIFVJLmluaXQgPSBmdW5jdGlvbihyb290KSB7XG5cbiAgICAgICAgcm9vdCA9IHJvb3QgfHwgZG9jdW1lbnQ7XG5cbiAgICAgICAgVUkuZG9tT2JzZXJ2ZXJzLmZvckVhY2goZnVuY3Rpb24oZm4pe1xuICAgICAgICAgICAgZm4ocm9vdCk7XG4gICAgICAgIH0pO1xuICAgIH07XG5cbiAgICBVSS5vbignZG9tcmVhZHkudWsuZG9tJywgZnVuY3Rpb24oKXtcblxuICAgICAgICBVSS5pbml0KCk7XG5cbiAgICAgICAgaWYgKFVJLmRvbXJlYWR5KSBVSS5VdGlscy5jaGVja0Rpc3BsYXkoKTtcbiAgICB9KTtcblxuICAgIGRvY3VtZW50LmFkZEV2ZW50TGlzdGVuZXIoJ0RPTUNvbnRlbnRMb2FkZWQnLCBmdW5jdGlvbigpe1xuXG4gICAgICAgIHZhciBkb21SZWFkeSA9IGZ1bmN0aW9uKCkge1xuXG4gICAgICAgICAgICBVSS4kYm9keSA9IFVJLiQoJ2JvZHknKTtcblxuICAgICAgICAgICAgVUkudHJpZ2dlcignYmVmb3JlcmVhZHkudWsuZG9tJyk7XG5cbiAgICAgICAgICAgIFVJLmNvbXBvbmVudC5ib290Q29tcG9uZW50cygpO1xuXG4gICAgICAgICAgICAvLyBjdXN0b20gc2Nyb2xsIG9ic2VydmVyXG4gICAgICAgICAgICB2YXIgcmFmVG9rZW4gPSByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoKGZ1bmN0aW9uKCl7XG5cbiAgICAgICAgICAgICAgICB2YXIgbWVtb3J5ID0ge2Rpcjoge3g6MCwgeTowfSwgeDogd2luZG93LnBhZ2VYT2Zmc2V0LCB5OndpbmRvdy5wYWdlWU9mZnNldH07XG5cbiAgICAgICAgICAgICAgICB2YXIgZm4gPSBmdW5jdGlvbigpe1xuICAgICAgICAgICAgICAgICAgICAvLyByZWFkaW5nIHRoaXMgKHdpbmRvdy5wYWdlW1h8WV1PZmZzZXQpIGNhdXNlcyBhIGZ1bGwgcGFnZSByZWNhbGMgb2YgdGhlIGxheW91dCBpbiBDaHJvbWUsXG4gICAgICAgICAgICAgICAgICAgIC8vIHNvIHdlIG9ubHkgd2FudCB0byBkbyB0aGlzIG9uY2VcbiAgICAgICAgICAgICAgICAgICAgdmFyIHdweG8gPSB3aW5kb3cucGFnZVhPZmZzZXQ7XG4gICAgICAgICAgICAgICAgICAgIHZhciB3cHlvID0gd2luZG93LnBhZ2VZT2Zmc2V0O1xuXG4gICAgICAgICAgICAgICAgICAgIC8vIERpZCB0aGUgc2Nyb2xsIHBvc2l0aW9uIGNoYW5nZSBzaW5jZSB0aGUgbGFzdCB0aW1lIHdlIHdlcmUgaGVyZT9cbiAgICAgICAgICAgICAgICAgICAgaWYgKG1lbW9yeS54ICE9IHdweG8gfHwgbWVtb3J5LnkgIT0gd3B5bykge1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBTZXQgdGhlIGRpcmVjdGlvbiBvZiB0aGUgc2Nyb2xsIGFuZCBzdG9yZSB0aGUgbmV3IHBvc2l0aW9uXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAod3B4byAhPSBtZW1vcnkueCkge21lbW9yeS5kaXIueCA9IHdweG8gPiBtZW1vcnkueCA/IDE6LTE7IH0gZWxzZSB7IG1lbW9yeS5kaXIueCA9IDA7IH1cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh3cHlvICE9IG1lbW9yeS55KSB7bWVtb3J5LmRpci55ID0gd3B5byA+IG1lbW9yeS55ID8gMTotMTsgfSBlbHNlIHsgbWVtb3J5LmRpci55ID0gMDsgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICBtZW1vcnkueCA9IHdweG87XG4gICAgICAgICAgICAgICAgICAgICAgICBtZW1vcnkueSA9IHdweW87XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRyaWdnZXIgdGhlIHNjcm9sbCBldmVudCwgdGhpcyBjb3VsZCBwcm9iYWJseSBiZSBzZW50IHVzaW5nIG1lbW9yeS5jbG9uZSgpIGJ1dCB0aGlzIGlzXG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBtb3JlIGV4cGxpY2l0IGFuZCBlYXNpZXIgdG8gc2VlIGV4YWN0bHkgd2hhdCBpcyBiZWluZyBzZW50IGluIHRoZSBldmVudC5cbiAgICAgICAgICAgICAgICAgICAgICAgIFVJLiRkb2MudHJpZ2dlcignc2Nyb2xsaW5nLnVrLmRvY3VtZW50JywgW3tcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXI6IHt4OiBtZW1vcnkuZGlyLngsIHk6IG1lbW9yeS5kaXIueX0sIHg6IHdweG8sIHk6IHdweW9cbiAgICAgICAgICAgICAgICAgICAgICAgIH1dKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGNhbmNlbEFuaW1hdGlvbkZyYW1lKHJhZlRva2VuKTtcbiAgICAgICAgICAgICAgICAgICAgcmFmVG9rZW4gPSByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoZm4pO1xuICAgICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgICBpZiAoVUkuc3VwcG9ydC50b3VjaCkge1xuICAgICAgICAgICAgICAgICAgICBVSS4kaHRtbC5vbigndG91Y2htb3ZlIHRvdWNoZW5kIE1TUG9pbnRlck1vdmUgTVNQb2ludGVyVXAgcG9pbnRlcm1vdmUgcG9pbnRlcnVwJywgZm4pO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChtZW1vcnkueCB8fCBtZW1vcnkueSkgZm4oKTtcblxuICAgICAgICAgICAgICAgIHJldHVybiBmbjtcblxuICAgICAgICAgICAgfSkoKSk7XG5cbiAgICAgICAgICAgIC8vIHJ1biBjb21wb25lbnQgaW5pdCBmdW5jdGlvbnMgb24gZG9tXG4gICAgICAgICAgICBVSS50cmlnZ2VyKCdkb21yZWFkeS51ay5kb20nKTtcblxuICAgICAgICAgICAgaWYgKFVJLnN1cHBvcnQudG91Y2gpIHtcblxuICAgICAgICAgICAgICAgIC8vIHJlbW92ZSBjc3MgaG92ZXIgcnVsZXMgZm9yIHRvdWNoIGRldmljZXNcbiAgICAgICAgICAgICAgICAvLyBVSS5VdGlscy5yZW1vdmVDc3NSdWxlcygvXFwudWstKD8hbmF2YmFyKS4qOmhvdmVyLyk7XG5cbiAgICAgICAgICAgICAgICAvLyB2aWV3cG9ydCB1bml0IGZpeCBmb3IgdWstaGVpZ2h0LXZpZXdwb3J0IC0gc2hvdWxkIGJlIGZpeGVkIGluIGlPUyA4XG4gICAgICAgICAgICAgICAgaWYgKG5hdmlnYXRvci51c2VyQWdlbnQubWF0Y2goLyhpUGFkfGlQaG9uZXxpUG9kKS9nKSkge1xuXG4gICAgICAgICAgICAgICAgICAgIFVJLiR3aW4ub24oJ2xvYWQgb3JpZW50YXRpb25jaGFuZ2UgcmVzaXplJywgVUkuVXRpbHMuZGVib3VuY2UoKGZ1bmN0aW9uKCl7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBmbiA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoJy51ay1oZWlnaHQtdmlld3BvcnQnKS5jc3MoJ2hlaWdodCcsIHdpbmRvdy5pbm5lckhlaWdodCk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZuO1xuICAgICAgICAgICAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZuKCk7XG5cbiAgICAgICAgICAgICAgICAgICAgfSkoKSwgMTAwKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBVSS50cmlnZ2VyKCdhZnRlcnJlYWR5LnVrLmRvbScpO1xuXG4gICAgICAgICAgICAvLyBtYXJrIHRoYXQgZG9tcmVhZHkgaXMgbGVmdCBiZWhpbmRcbiAgICAgICAgICAgIFVJLmRvbXJlYWR5ID0gdHJ1ZTtcblxuICAgICAgICAgICAgLy8gYXV0byBpbml0IGpzIGNvbXBvbmVudHNcbiAgICAgICAgICAgIGlmIChVSS5zdXBwb3J0Lm11dGF0aW9ub2JzZXJ2ZXIpIHtcblxuICAgICAgICAgICAgICAgIHZhciBpbml0Rm4gPSBVSS5VdGlscy5kZWJvdW5jZShmdW5jdGlvbigpe1xuICAgICAgICAgICAgICAgICAgICByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoZnVuY3Rpb24oKXsgVUkuaW5pdChkb2N1bWVudC5ib2R5KTt9KTtcbiAgICAgICAgICAgICAgICB9LCAxMCk7XG5cbiAgICAgICAgICAgICAgICAobmV3IFVJLnN1cHBvcnQubXV0YXRpb25vYnNlcnZlcihmdW5jdGlvbihtdXRhdGlvbnMpIHtcblxuICAgICAgICAgICAgICAgICAgICB2YXIgaW5pdCA9IGZhbHNlO1xuXG4gICAgICAgICAgICAgICAgICAgIG11dGF0aW9ucy5ldmVyeShmdW5jdGlvbihtdXRhdGlvbil7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtdXRhdGlvbi50eXBlICE9ICdjaGlsZExpc3QnKSByZXR1cm4gdHJ1ZTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDAsIG5vZGU7IGkgPCBtdXRhdGlvbi5hZGRlZE5vZGVzLmxlbmd0aDsgKytpKSB7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBub2RlID0gbXV0YXRpb24uYWRkZWROb2Rlc1tpXTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChub2RlLm91dGVySFRNTCAmJiBub2RlLm91dGVySFRNTC5pbmRleE9mKCdkYXRhLXVrLScpICE9PSAtMSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKGluaXQgPSB0cnVlKSAmJiBmYWxzZTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKGluaXQpIGluaXRGbigpO1xuXG4gICAgICAgICAgICAgICAgfSkpLm9ic2VydmUoZG9jdW1lbnQuYm9keSwge2NoaWxkTGlzdDogdHJ1ZSwgc3VidHJlZTogdHJ1ZX0pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuXG4gICAgICAgIGlmIChkb2N1bWVudC5yZWFkeVN0YXRlID09ICdjb21wbGV0ZScgfHwgZG9jdW1lbnQucmVhZHlTdGF0ZSA9PSAnaW50ZXJhY3RpdmUnKSB7XG4gICAgICAgICAgICBzZXRUaW1lb3V0KGRvbVJlYWR5KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBkb21SZWFkeTtcblxuICAgIH0oKSk7XG5cbiAgICAvLyBhZGQgdG91Y2ggaWRlbnRpZmllciBjbGFzc1xuICAgIFVJLiRodG1sLmFkZENsYXNzKFVJLnN1cHBvcnQudG91Y2ggPyAndWstdG91Y2gnIDogJ3VrLW5vdG91Y2gnKTtcblxuICAgIC8vIGFkZCB1ay1ob3ZlciBjbGFzcyBvbiB0YXAgdG8gc3VwcG9ydCBvdmVybGF5cyBvbiB0b3VjaCBkZXZpY2VzXG4gICAgaWYgKFVJLnN1cHBvcnQudG91Y2gpIHtcblxuICAgICAgICB2YXIgaG92ZXJzZXQgPSBmYWxzZSxcbiAgICAgICAgICAgIGV4Y2x1ZGUsXG4gICAgICAgICAgICBob3ZlcmNscyA9ICd1ay1ob3ZlcicsXG4gICAgICAgICAgICBzZWxlY3RvciA9ICcudWstb3ZlcmxheSwgLnVrLW92ZXJsYXktaG92ZXIsIC51ay1vdmVybGF5LXRvZ2dsZSwgLnVrLWFuaW1hdGlvbi1ob3ZlciwgLnVrLWhhcy1ob3Zlcic7XG5cbiAgICAgICAgVUkuJGh0bWwub24oJ21vdXNlZW50ZXIgdG91Y2hzdGFydCBNU1BvaW50ZXJEb3duIHBvaW50ZXJkb3duJywgc2VsZWN0b3IsIGZ1bmN0aW9uKCkge1xuXG4gICAgICAgICAgICBpZiAoaG92ZXJzZXQpICQoJy4nK2hvdmVyY2xzKS5yZW1vdmVDbGFzcyhob3ZlcmNscyk7XG5cbiAgICAgICAgICAgIGhvdmVyc2V0ID0gJCh0aGlzKS5hZGRDbGFzcyhob3ZlcmNscyk7XG5cbiAgICAgICAgfSkub24oJ21vdXNlbGVhdmUgdG91Y2hlbmQgTVNQb2ludGVyVXAgcG9pbnRlcnVwJywgZnVuY3Rpb24oZSkge1xuXG4gICAgICAgICAgICBleGNsdWRlID0gJChlLnRhcmdldCkucGFyZW50cyhzZWxlY3Rvcik7XG5cbiAgICAgICAgICAgIGlmIChob3ZlcnNldCkge1xuICAgICAgICAgICAgICAgIGhvdmVyc2V0Lm5vdChleGNsdWRlKS5yZW1vdmVDbGFzcyhob3ZlcmNscyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH1cblxuICAgIHJldHVybiBVSTtcbn0pO1xuXG4vLyAgQmFzZWQgb24gWmVwdG9zIHRvdWNoLmpzXG4vLyAgaHR0cHM6Ly9yYXcuZ2l0aHViLmNvbS9tYWRyb2JieS96ZXB0by9tYXN0ZXIvc3JjL3RvdWNoLmpzXG4vLyAgWmVwdG8uanMgbWF5IGJlIGZyZWVseSBkaXN0cmlidXRlZCB1bmRlciB0aGUgTUlUIGxpY2Vuc2UuXG5cbjsoZnVuY3Rpb24oJCl7XG5cbiAgaWYgKCQuZm4uc3dpcGVMZWZ0KSB7XG4gICAgcmV0dXJuO1xuICB9XG5cblxuICB2YXIgdG91Y2ggPSB7fSwgdG91Y2hUaW1lb3V0LCB0YXBUaW1lb3V0LCBzd2lwZVRpbWVvdXQsIGxvbmdUYXBUaW1lb3V0LCBsb25nVGFwRGVsYXkgPSA3NTAsIGdlc3R1cmU7XG4gIHZhciBoYXNUb3VjaEV2ZW50cyA9ICdvbnRvdWNoc3RhcnQnIGluIHdpbmRvdyxcbiAgICAgIGhhc1BvaW50ZXJFdmVudHMgPSB3aW5kb3cuUG9pbnRlckV2ZW50LFxuICAgICAgaGFzVG91Y2ggPSBoYXNUb3VjaEV2ZW50c1xuICAgICAgfHwgd2luZG93LkRvY3VtZW50VG91Y2ggJiYgZG9jdW1lbnQgaW5zdGFuY2VvZiBEb2N1bWVudFRvdWNoXG4gICAgICB8fCBuYXZpZ2F0b3IubXNQb2ludGVyRW5hYmxlZCAmJiBuYXZpZ2F0b3IubXNNYXhUb3VjaFBvaW50cyA+IDAgLy8gSUUgMTBcbiAgICAgIHx8IG5hdmlnYXRvci5wb2ludGVyRW5hYmxlZCAmJiBuYXZpZ2F0b3IubWF4VG91Y2hQb2ludHMgPiAwOyAvLyBJRSA+PTExXG5cbiAgZnVuY3Rpb24gc3dpcGVEaXJlY3Rpb24oeDEsIHgyLCB5MSwgeTIpIHtcbiAgICByZXR1cm4gTWF0aC5hYnMoeDEgLSB4MikgPj0gTWF0aC5hYnMoeTEgLSB5MikgPyAoeDEgLSB4MiA+IDAgPyAnTGVmdCcgOiAnUmlnaHQnKSA6ICh5MSAtIHkyID4gMCA/ICdVcCcgOiAnRG93bicpO1xuICB9XG5cbiAgZnVuY3Rpb24gbG9uZ1RhcCgpIHtcbiAgICBsb25nVGFwVGltZW91dCA9IG51bGw7XG4gICAgaWYgKHRvdWNoLmxhc3QpIHtcbiAgICAgIGlmICggdG91Y2guZWwgIT09IHVuZGVmaW5lZCApIHRvdWNoLmVsLnRyaWdnZXIoJ2xvbmdUYXAnKTtcbiAgICAgIHRvdWNoID0ge307XG4gICAgfVxuICB9XG5cbiAgZnVuY3Rpb24gY2FuY2VsTG9uZ1RhcCgpIHtcbiAgICBpZiAobG9uZ1RhcFRpbWVvdXQpIGNsZWFyVGltZW91dChsb25nVGFwVGltZW91dCk7XG4gICAgbG9uZ1RhcFRpbWVvdXQgPSBudWxsO1xuICB9XG5cbiAgZnVuY3Rpb24gY2FuY2VsQWxsKCkge1xuICAgIGlmICh0b3VjaFRpbWVvdXQpICAgY2xlYXJUaW1lb3V0KHRvdWNoVGltZW91dCk7XG4gICAgaWYgKHRhcFRpbWVvdXQpICAgICBjbGVhclRpbWVvdXQodGFwVGltZW91dCk7XG4gICAgaWYgKHN3aXBlVGltZW91dCkgICBjbGVhclRpbWVvdXQoc3dpcGVUaW1lb3V0KTtcbiAgICBpZiAobG9uZ1RhcFRpbWVvdXQpIGNsZWFyVGltZW91dChsb25nVGFwVGltZW91dCk7XG4gICAgdG91Y2hUaW1lb3V0ID0gdGFwVGltZW91dCA9IHN3aXBlVGltZW91dCA9IGxvbmdUYXBUaW1lb3V0ID0gbnVsbDtcbiAgICB0b3VjaCA9IHt9O1xuICB9XG5cbiAgZnVuY3Rpb24gaXNQcmltYXJ5VG91Y2goZXZlbnQpe1xuICAgIHJldHVybiBldmVudC5wb2ludGVyVHlwZSA9PSBldmVudC5NU1BPSU5URVJfVFlQRV9UT1VDSCAmJiBldmVudC5pc1ByaW1hcnk7XG4gIH1cblxuICAkKGZ1bmN0aW9uKCl7XG4gICAgdmFyIG5vdywgZGVsdGEsIGRlbHRhWCA9IDAsIGRlbHRhWSA9IDAsIGZpcnN0VG91Y2g7XG5cbiAgICBpZiAoJ01TR2VzdHVyZScgaW4gd2luZG93KSB7XG4gICAgICBnZXN0dXJlID0gbmV3IE1TR2VzdHVyZSgpO1xuICAgICAgZ2VzdHVyZS50YXJnZXQgPSBkb2N1bWVudC5ib2R5O1xuICAgIH1cblxuICAgICQoZG9jdW1lbnQpXG4gICAgICAub24oJ01TR2VzdHVyZUVuZCBnZXN0dXJlZW5kJywgZnVuY3Rpb24oZSl7XG5cbiAgICAgICAgdmFyIHN3aXBlRGlyZWN0aW9uRnJvbVZlbG9jaXR5ID0gZS5vcmlnaW5hbEV2ZW50LnZlbG9jaXR5WCA+IDEgPyAnUmlnaHQnIDogZS5vcmlnaW5hbEV2ZW50LnZlbG9jaXR5WCA8IC0xID8gJ0xlZnQnIDogZS5vcmlnaW5hbEV2ZW50LnZlbG9jaXR5WSA+IDEgPyAnRG93bicgOiBlLm9yaWdpbmFsRXZlbnQudmVsb2NpdHlZIDwgLTEgPyAnVXAnIDogbnVsbDtcblxuICAgICAgICBpZiAoc3dpcGVEaXJlY3Rpb25Gcm9tVmVsb2NpdHkgJiYgdG91Y2guZWwgIT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgIHRvdWNoLmVsLnRyaWdnZXIoJ3N3aXBlJyk7XG4gICAgICAgICAgdG91Y2guZWwudHJpZ2dlcignc3dpcGUnKyBzd2lwZURpcmVjdGlvbkZyb21WZWxvY2l0eSk7XG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgICAvLyBNU1BvaW50ZXJEb3duOiBmb3IgSUUxMFxuICAgICAgLy8gcG9pbnRlcmRvd246IGZvciBJRTExXG4gICAgICAub24oJ3RvdWNoc3RhcnQgTVNQb2ludGVyRG93biBwb2ludGVyZG93bicsIGZ1bmN0aW9uKGUpe1xuXG4gICAgICAgIGlmKGUudHlwZSA9PSAnTVNQb2ludGVyRG93bicgJiYgIWlzUHJpbWFyeVRvdWNoKGUub3JpZ2luYWxFdmVudCkpIHJldHVybjtcblxuICAgICAgICBmaXJzdFRvdWNoID0gKGUudHlwZSA9PSAnTVNQb2ludGVyRG93bicgfHwgZS50eXBlID09ICdwb2ludGVyZG93bicpID8gZSA6IGUub3JpZ2luYWxFdmVudC50b3VjaGVzWzBdO1xuXG4gICAgICAgIG5vdyAgICAgID0gRGF0ZS5ub3coKTtcbiAgICAgICAgZGVsdGEgICAgPSBub3cgLSAodG91Y2gubGFzdCB8fCBub3cpO1xuICAgICAgICB0b3VjaC5lbCA9ICQoJ3RhZ05hbWUnIGluIGZpcnN0VG91Y2gudGFyZ2V0ID8gZmlyc3RUb3VjaC50YXJnZXQgOiBmaXJzdFRvdWNoLnRhcmdldC5wYXJlbnROb2RlKTtcblxuICAgICAgICBpZih0b3VjaFRpbWVvdXQpIGNsZWFyVGltZW91dCh0b3VjaFRpbWVvdXQpO1xuXG4gICAgICAgIHRvdWNoLngxID0gZmlyc3RUb3VjaC5wYWdlWDtcbiAgICAgICAgdG91Y2gueTEgPSBmaXJzdFRvdWNoLnBhZ2VZO1xuXG4gICAgICAgIGlmIChkZWx0YSA+IDAgJiYgZGVsdGEgPD0gMjUwKSB0b3VjaC5pc0RvdWJsZVRhcCA9IHRydWU7XG5cbiAgICAgICAgdG91Y2gubGFzdCA9IG5vdztcbiAgICAgICAgbG9uZ1RhcFRpbWVvdXQgPSBzZXRUaW1lb3V0KGxvbmdUYXAsIGxvbmdUYXBEZWxheSk7XG5cbiAgICAgICAgLy8gYWRkcyB0aGUgY3VycmVudCB0b3VjaCBjb250YWN0IGZvciBJRSBnZXN0dXJlIHJlY29nbml0aW9uXG4gICAgICAgIGlmIChlLm9yaWdpbmFsRXZlbnQgJiYgZS5vcmlnaW5hbEV2ZW50LnBvaW50ZXJJZCAmJiBnZXN0dXJlICYmICggZS50eXBlID09ICdNU1BvaW50ZXJEb3duJyB8fCBlLnR5cGUgPT0gJ3BvaW50ZXJkb3duJyB8fCBlLnR5cGUgPT0gJ3RvdWNoc3RhcnQnICkgKSB7XG4gICAgICAgICAgZ2VzdHVyZS5hZGRQb2ludGVyKGUub3JpZ2luYWxFdmVudC5wb2ludGVySWQpO1xuICAgICAgICB9XG5cbiAgICAgIH0pXG4gICAgICAvLyBNU1BvaW50ZXJNb3ZlOiBmb3IgSUUxMFxuICAgICAgLy8gcG9pbnRlcm1vdmU6IGZvciBJRTExXG4gICAgICAub24oJ3RvdWNobW92ZSBNU1BvaW50ZXJNb3ZlIHBvaW50ZXJtb3ZlJywgZnVuY3Rpb24oZSl7XG5cbiAgICAgICAgaWYgKGUudHlwZSA9PSAnTVNQb2ludGVyTW92ZScgJiYgIWlzUHJpbWFyeVRvdWNoKGUub3JpZ2luYWxFdmVudCkpIHJldHVybjtcblxuICAgICAgICBmaXJzdFRvdWNoID0gKGUudHlwZSA9PSAnTVNQb2ludGVyTW92ZScgfHwgZS50eXBlID09ICdwb2ludGVybW92ZScpID8gZSA6IGUub3JpZ2luYWxFdmVudC50b3VjaGVzWzBdO1xuXG4gICAgICAgIGNhbmNlbExvbmdUYXAoKTtcbiAgICAgICAgdG91Y2gueDIgPSBmaXJzdFRvdWNoLnBhZ2VYO1xuICAgICAgICB0b3VjaC55MiA9IGZpcnN0VG91Y2gucGFnZVk7XG5cbiAgICAgICAgZGVsdGFYICs9IE1hdGguYWJzKHRvdWNoLngxIC0gdG91Y2gueDIpO1xuICAgICAgICBkZWx0YVkgKz0gTWF0aC5hYnModG91Y2gueTEgLSB0b3VjaC55Mik7XG4gICAgICB9KVxuICAgICAgLy8gTVNQb2ludGVyVXA6IGZvciBJRTEwXG4gICAgICAvLyBwb2ludGVydXA6IGZvciBJRTExXG4gICAgICAub24oJ3RvdWNoZW5kIE1TUG9pbnRlclVwIHBvaW50ZXJ1cCcsIGZ1bmN0aW9uKGUpe1xuXG4gICAgICAgIGlmIChlLnR5cGUgPT0gJ01TUG9pbnRlclVwJyAmJiAhaXNQcmltYXJ5VG91Y2goZS5vcmlnaW5hbEV2ZW50KSkgcmV0dXJuO1xuXG4gICAgICAgIGNhbmNlbExvbmdUYXAoKTtcblxuICAgICAgICAvLyBzd2lwZVxuICAgICAgICBpZiAoKHRvdWNoLngyICYmIE1hdGguYWJzKHRvdWNoLngxIC0gdG91Y2gueDIpID4gMzApIHx8ICh0b3VjaC55MiAmJiBNYXRoLmFicyh0b3VjaC55MSAtIHRvdWNoLnkyKSA+IDMwKSl7XG5cbiAgICAgICAgICBzd2lwZVRpbWVvdXQgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgaWYgKCB0b3VjaC5lbCAhPT0gdW5kZWZpbmVkICkge1xuICAgICAgICAgICAgICB0b3VjaC5lbC50cmlnZ2VyKCdzd2lwZScpO1xuICAgICAgICAgICAgICB0b3VjaC5lbC50cmlnZ2VyKCdzd2lwZScgKyAoc3dpcGVEaXJlY3Rpb24odG91Y2gueDEsIHRvdWNoLngyLCB0b3VjaC55MSwgdG91Y2gueTIpKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICB0b3VjaCA9IHt9O1xuICAgICAgICAgIH0sIDApO1xuXG4gICAgICAgIC8vIG5vcm1hbCB0YXBcbiAgICAgICAgfSBlbHNlIGlmICgnbGFzdCcgaW4gdG91Y2gpIHtcblxuICAgICAgICAgIC8vIGRvbid0IGZpcmUgdGFwIHdoZW4gZGVsdGEgcG9zaXRpb24gY2hhbmdlZCBieSBtb3JlIHRoYW4gMzAgcGl4ZWxzLFxuICAgICAgICAgIC8vIGZvciBpbnN0YW5jZSB3aGVuIG1vdmluZyB0byBhIHBvaW50IGFuZCBiYWNrIHRvIG9yaWdpblxuICAgICAgICAgIGlmIChpc05hTihkZWx0YVgpIHx8IChkZWx0YVggPCAzMCAmJiBkZWx0YVkgPCAzMCkpIHtcbiAgICAgICAgICAgIC8vIGRlbGF5IGJ5IG9uZSB0aWNrIHNvIHdlIGNhbiBjYW5jZWwgdGhlICd0YXAnIGV2ZW50IGlmICdzY3JvbGwnIGZpcmVzXG4gICAgICAgICAgICAvLyAoJ3RhcCcgZmlyZXMgYmVmb3JlICdzY3JvbGwnKVxuICAgICAgICAgICAgdGFwVGltZW91dCA9IHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7XG5cbiAgICAgICAgICAgICAgLy8gdHJpZ2dlciB1bml2ZXJzYWwgJ3RhcCcgd2l0aCB0aGUgb3B0aW9uIHRvIGNhbmNlbFRvdWNoKClcbiAgICAgICAgICAgICAgLy8gKGNhbmNlbFRvdWNoIGNhbmNlbHMgcHJvY2Vzc2luZyBvZiBzaW5nbGUgdnMgZG91YmxlIHRhcHMgZm9yIGZhc3RlciAndGFwJyByZXNwb25zZSlcbiAgICAgICAgICAgICAgdmFyIGV2ZW50ID0gJC5FdmVudCgndGFwJyk7XG4gICAgICAgICAgICAgIGV2ZW50LmNhbmNlbFRvdWNoID0gY2FuY2VsQWxsO1xuICAgICAgICAgICAgICBpZiAoIHRvdWNoLmVsICE9PSB1bmRlZmluZWQgKSB0b3VjaC5lbC50cmlnZ2VyKGV2ZW50KTtcblxuICAgICAgICAgICAgICAvLyB0cmlnZ2VyIGRvdWJsZSB0YXAgaW1tZWRpYXRlbHlcbiAgICAgICAgICAgICAgaWYgKHRvdWNoLmlzRG91YmxlVGFwKSB7XG4gICAgICAgICAgICAgICAgaWYgKCB0b3VjaC5lbCAhPT0gdW5kZWZpbmVkICkgdG91Y2guZWwudHJpZ2dlcignZG91YmxlVGFwJyk7XG4gICAgICAgICAgICAgICAgdG91Y2ggPSB7fTtcbiAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgIC8vIHRyaWdnZXIgc2luZ2xlIHRhcCBhZnRlciAyNTBtcyBvZiBpbmFjdGl2aXR5XG4gICAgICAgICAgICAgIGVsc2Uge1xuICAgICAgICAgICAgICAgIHRvdWNoVGltZW91dCA9IHNldFRpbWVvdXQoZnVuY3Rpb24oKXtcbiAgICAgICAgICAgICAgICAgIHRvdWNoVGltZW91dCA9IG51bGw7XG4gICAgICAgICAgICAgICAgICBpZiAoIHRvdWNoLmVsICE9PSB1bmRlZmluZWQgKSB0b3VjaC5lbC50cmlnZ2VyKCdzaW5nbGVUYXAnKTtcbiAgICAgICAgICAgICAgICAgIHRvdWNoID0ge307XG4gICAgICAgICAgICAgICAgfSwgMjUwKTtcbiAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSwgMCk7XG4gICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHRvdWNoID0ge307XG4gICAgICAgICAgfVxuICAgICAgICAgIGRlbHRhWCA9IGRlbHRhWSA9IDA7XG4gICAgICAgIH1cbiAgICAgIH0pXG4gICAgICAvLyB3aGVuIHRoZSBicm93c2VyIHdpbmRvdyBsb3NlcyBmb2N1cyxcbiAgICAgIC8vIGZvciBleGFtcGxlIHdoZW4gYSBtb2RhbCBkaWFsb2cgaXMgc2hvd24sXG4gICAgICAvLyBjYW5jZWwgYWxsIG9uZ29pbmcgZXZlbnRzXG4gICAgICAub24oJ3RvdWNoY2FuY2VsIE1TUG9pbnRlckNhbmNlbCBwb2ludGVyY2FuY2VsJywgZnVuY3Rpb24oZSl7XG5cbiAgICAgICAgLy8gSWdub3JlIHBvaW50ZXJjYW5jZWwgaWYgdGhlIGV2ZW50IHN1cHBvcnRzIHRvdWNoIGV2ZW50cywgdG8gcHJldmVudCBwb2ludGVyY2FuY2VsIGluIHN3aXBlIGdlc3R1cmVcbiAgICAgICAgaWYgKChlLnR5cGUgPT0gJ3RvdWNoY2FuY2VsJyAmJiBoYXNUb3VjaEV2ZW50cyAmJiBoYXNUb3VjaCkgfHwgKCFoYXNUb3VjaEV2ZW50cyAmJiBlLnR5cGUgPT0gJ3BvaW50ZXJjYW5jZWwnICYmIGhhc1BvaW50ZXJFdmVudHMpKSB7XG4gICAgICAgICAgY2FuY2VsQWxsKCk7XG4gICAgICAgIH1cblxuICAgIH0pO1xuXG4gICAgLy8gc2Nyb2xsaW5nIHRoZSB3aW5kb3cgaW5kaWNhdGVzIGludGVudGlvbiBvZiB0aGUgdXNlclxuICAgIC8vIHRvIHNjcm9sbCwgbm90IHRhcCBvciBzd2lwZSwgc28gY2FuY2VsIGFsbCBvbmdvaW5nIGV2ZW50c1xuICAgICQod2luZG93KS5vbignc2Nyb2xsJywgY2FuY2VsQWxsKTtcbiAgfSk7XG5cbiAgWydzd2lwZScsICdzd2lwZUxlZnQnLCAnc3dpcGVSaWdodCcsICdzd2lwZVVwJywgJ3N3aXBlRG93bicsICdkb3VibGVUYXAnLCAndGFwJywgJ3NpbmdsZVRhcCcsICdsb25nVGFwJ10uZm9yRWFjaChmdW5jdGlvbihldmVudE5hbWUpe1xuICAgICQuZm5bZXZlbnROYW1lXSA9IGZ1bmN0aW9uKGNhbGxiYWNrKXsgcmV0dXJuICQodGhpcykub24oZXZlbnROYW1lLCBjYWxsYmFjayk7IH07XG4gIH0pO1xufSkoalF1ZXJ5KTtcblxuKGZ1bmN0aW9uKFVJKSB7XG5cbiAgICBcInVzZSBzdHJpY3RcIjtcblxuICAgIHZhciBzdGFja3MgPSBbXTtcblxuICAgIFVJLmNvbXBvbmVudCgnc3RhY2tNYXJnaW4nLCB7XG5cbiAgICAgICAgZGVmYXVsdHM6IHtcbiAgICAgICAgICAgIGNsczogJ3VrLW1hcmdpbi1zbWFsbC10b3AnLFxuICAgICAgICAgICAgcm93Zmlyc3Q6IGZhbHNlLFxuICAgICAgICAgICAgb2JzZXJ2ZTogZmFsc2VcbiAgICAgICAgfSxcblxuICAgICAgICBib290OiBmdW5jdGlvbigpIHtcblxuICAgICAgICAgICAgLy8gaW5pdCBjb2RlXG4gICAgICAgICAgICBVSS5yZWFkeShmdW5jdGlvbihjb250ZXh0KSB7XG5cbiAgICAgICAgICAgICAgICBVSS4kKCdbZGF0YS11ay1tYXJnaW5dJywgY29udGV4dCkuZWFjaChmdW5jdGlvbigpIHtcblxuICAgICAgICAgICAgICAgICAgICB2YXIgZWxlID0gVUkuJCh0aGlzKTtcblxuICAgICAgICAgICAgICAgICAgICBpZiAoIWVsZS5kYXRhKCdzdGFja01hcmdpbicpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBVSS5zdGFja01hcmdpbihlbGUsIFVJLlV0aWxzLm9wdGlvbnMoZWxlLmF0dHIoJ2RhdGEtdWstbWFyZ2luJykpKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgaW5pdDogZnVuY3Rpb24oKSB7XG5cbiAgICAgICAgICAgIHZhciAkdGhpcyA9IHRoaXM7XG5cbiAgICAgICAgICAgIFVJLiR3aW4ub24oJ3Jlc2l6ZSBvcmllbnRhdGlvbmNoYW5nZScsIChmdW5jdGlvbigpIHtcblxuICAgICAgICAgICAgICAgIHZhciBmbiA9IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICAkdGhpcy5wcm9jZXNzKCk7XG4gICAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgICAgIFVJLiQoZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgIGZuKCk7XG4gICAgICAgICAgICAgICAgICAgIFVJLiR3aW4ub24oJ2xvYWQnLCBmbik7XG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gVUkuVXRpbHMuZGVib3VuY2UoZm4sIDIwKTtcbiAgICAgICAgICAgIH0pKCkpO1xuXG4gICAgICAgICAgICB0aGlzLm9uKCdkaXNwbGF5LnVrLmNoZWNrJywgZnVuY3Rpb24oZSkge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmVsZW1lbnQuaXMoJzp2aXNpYmxlJykpIHRoaXMucHJvY2VzcygpO1xuICAgICAgICAgICAgfS5iaW5kKHRoaXMpKTtcblxuICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5vYnNlcnZlKSB7XG5cbiAgICAgICAgICAgICAgICBVSS5kb21PYnNlcnZlKHRoaXMuZWxlbWVudCwgZnVuY3Rpb24oZSkge1xuICAgICAgICAgICAgICAgICAgICBpZiAoJHRoaXMuZWxlbWVudC5pcygnOnZpc2libGUnKSkgJHRoaXMucHJvY2VzcygpO1xuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBzdGFja3MucHVzaCh0aGlzKTtcbiAgICAgICAgfSxcblxuICAgICAgICBwcm9jZXNzOiBmdW5jdGlvbigpIHtcblxuICAgICAgICAgICAgdmFyICR0aGlzID0gdGhpcywgY29sdW1ucyA9IHRoaXMuZWxlbWVudC5jaGlsZHJlbigpO1xuXG4gICAgICAgICAgICBVSS5VdGlscy5zdGFja01hcmdpbihjb2x1bW5zLCB0aGlzLm9wdGlvbnMpO1xuXG4gICAgICAgICAgICBpZiAoIXRoaXMub3B0aW9ucy5yb3dmaXJzdCB8fCAhY29sdW1ucy5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgLy8gTWFyayBmaXJzdCBjb2x1bW4gZWxlbWVudHNcbiAgICAgICAgICAgIHZhciBncm91cCA9IHt9LCBtaW5sZWZ0ID0gZmFsc2U7XG5cbiAgICAgICAgICAgIGNvbHVtbnMucmVtb3ZlQ2xhc3ModGhpcy5vcHRpb25zLnJvd2ZpcnN0KS5lYWNoKGZ1bmN0aW9uKG9mZnNldCwgJGVsZSl7XG5cbiAgICAgICAgICAgICAgICAkZWxlID0gVUkuJCh0aGlzKTtcblxuICAgICAgICAgICAgICAgIGlmICh0aGlzLnN0eWxlLmRpc3BsYXkgIT0gJ25vbmUnKSB7XG4gICAgICAgICAgICAgICAgICAgIG9mZnNldCA9ICRlbGUub2Zmc2V0KCkubGVmdDtcbiAgICAgICAgICAgICAgICAgICAgKChncm91cFtvZmZzZXRdID0gZ3JvdXBbb2Zmc2V0XSB8fCBbXSkgJiYgZ3JvdXBbb2Zmc2V0XSkucHVzaCh0aGlzKTtcbiAgICAgICAgICAgICAgICAgICAgbWlubGVmdCA9IG1pbmxlZnQgPT09IGZhbHNlID8gb2Zmc2V0IDogTWF0aC5taW4obWlubGVmdCwgb2Zmc2V0KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgVUkuJChncm91cFttaW5sZWZ0XSkuYWRkQ2xhc3ModGhpcy5vcHRpb25zLnJvd2ZpcnN0KTtcblxuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIH1cblxuICAgIH0pO1xuXG5cbiAgICAvLyByZXNwb25zaXZlIGVsZW1lbnQgZS5nLiBpZnJhbWVzXG5cbiAgICAoZnVuY3Rpb24oKXtcblxuICAgICAgICB2YXIgZWxlbWVudHMgPSBbXSwgY2hlY2sgPSBmdW5jdGlvbihlbGUpIHtcblxuICAgICAgICAgICAgaWYgKCFlbGUuaXMoJzp2aXNpYmxlJykpIHJldHVybjtcblxuICAgICAgICAgICAgdmFyIHdpZHRoICA9IGVsZS5wYXJlbnQoKS53aWR0aCgpLFxuICAgICAgICAgICAgICAgIGl3aWR0aCA9IGVsZS5kYXRhKCd3aWR0aCcpLFxuICAgICAgICAgICAgICAgIHJhdGlvICA9ICh3aWR0aCAvIGl3aWR0aCksXG4gICAgICAgICAgICAgICAgaGVpZ2h0ID0gTWF0aC5mbG9vcihyYXRpbyAqIGVsZS5kYXRhKCdoZWlnaHQnKSk7XG5cbiAgICAgICAgICAgIGVsZS5jc3Moe2hlaWdodDogKHdpZHRoIDwgaXdpZHRoKSA/IGhlaWdodCA6IGVsZS5kYXRhKCdoZWlnaHQnKX0pO1xuICAgICAgICB9O1xuXG4gICAgICAgIFVJLmNvbXBvbmVudCgncmVzcG9uc2l2ZUVsZW1lbnQnLCB7XG5cbiAgICAgICAgICAgIGRlZmF1bHRzOiB7fSxcblxuICAgICAgICAgICAgYm9vdDogZnVuY3Rpb24oKSB7XG5cbiAgICAgICAgICAgICAgICAvLyBpbml0IGNvZGVcbiAgICAgICAgICAgICAgICBVSS5yZWFkeShmdW5jdGlvbihjb250ZXh0KSB7XG5cbiAgICAgICAgICAgICAgICAgICAgVUkuJCgnaWZyYW1lLnVrLXJlc3BvbnNpdmUtd2lkdGgsIFtkYXRhLXVrLXJlc3BvbnNpdmVdJywgY29udGV4dCkuZWFjaChmdW5jdGlvbigpIHtcblxuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGVsZSA9IFVJLiQodGhpcyksIG9iajtcblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFlbGUuZGF0YSgncmVzcG9uc2l2ZUVsZW1lbnQnKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iaiA9IFVJLnJlc3BvbnNpdmVFbGVtZW50KGVsZSwge30pO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgIGluaXQ6IGZ1bmN0aW9uKCkge1xuXG4gICAgICAgICAgICAgICAgdmFyIGVsZSA9IHRoaXMuZWxlbWVudDtcblxuICAgICAgICAgICAgICAgIGlmIChlbGUuYXR0cignd2lkdGgnKSAmJiBlbGUuYXR0cignaGVpZ2h0JykpIHtcblxuICAgICAgICAgICAgICAgICAgICBlbGUuZGF0YSh7XG4gICAgICAgICAgICAgICAgICAgICAgICB3aWR0aCA6IGVsZS5hdHRyKCd3aWR0aCcpLFxuICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OiBlbGUuYXR0cignaGVpZ2h0JylcbiAgICAgICAgICAgICAgICAgICAgfSkub24oJ2Rpc3BsYXkudWsuY2hlY2snLCBmdW5jdGlvbigpe1xuICAgICAgICAgICAgICAgICAgICAgICAgY2hlY2soZWxlKTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgY2hlY2soZWxlKTtcblxuICAgICAgICAgICAgICAgICAgICBlbGVtZW50cy5wdXNoKGVsZSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICBVSS4kd2luLm9uKCdyZXNpemUgbG9hZCcsIFVJLlV0aWxzLmRlYm91bmNlKGZ1bmN0aW9uKCl7XG5cbiAgICAgICAgICAgIGVsZW1lbnRzLmZvckVhY2goZnVuY3Rpb24oZWxlKXtcbiAgICAgICAgICAgICAgICBjaGVjayhlbGUpO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgfSwgMTUpKTtcblxuICAgIH0pKCk7XG5cblxuICAgIC8vIGhlbHBlclxuXG4gICAgVUkuVXRpbHMuc3RhY2tNYXJnaW4gPSBmdW5jdGlvbihlbGVtZW50cywgb3B0aW9ucykge1xuXG4gICAgICAgIG9wdGlvbnMgPSBVSS4kLmV4dGVuZCh7XG4gICAgICAgICAgICBjbHM6ICd1ay1tYXJnaW4tc21hbGwtdG9wJ1xuICAgICAgICB9LCBvcHRpb25zKTtcblxuICAgICAgICBlbGVtZW50cyA9IFVJLiQoZWxlbWVudHMpLnJlbW92ZUNsYXNzKG9wdGlvbnMuY2xzKTtcblxuICAgICAgICB2YXIgbWluID0gZmFsc2U7XG5cbiAgICAgICAgZWxlbWVudHMuZWFjaChmdW5jdGlvbihvZmZzZXQsIGhlaWdodCwgcG9zLCAkZWxlKXtcblxuICAgICAgICAgICAgJGVsZSAgID0gVUkuJCh0aGlzKTtcblxuICAgICAgICAgICAgaWYgKCRlbGUuY3NzKCdkaXNwbGF5JykgIT0gJ25vbmUnKSB7XG5cbiAgICAgICAgICAgICAgICBvZmZzZXQgPSAkZWxlLm9mZnNldCgpO1xuICAgICAgICAgICAgICAgIGhlaWdodCA9ICRlbGUub3V0ZXJIZWlnaHQoKTtcbiAgICAgICAgICAgICAgICBwb3MgICAgPSBvZmZzZXQudG9wICsgaGVpZ2h0O1xuXG4gICAgICAgICAgICAgICAgJGVsZS5kYXRhKHtcbiAgICAgICAgICAgICAgICAgICAgdWtNYXJnaW5Qb3M6IHBvcyxcbiAgICAgICAgICAgICAgICAgICAgdWtNYXJnaW5Ub3A6IG9mZnNldC50b3BcbiAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgIGlmIChtaW4gPT09IGZhbHNlIHx8IChvZmZzZXQudG9wIDwgbWluLnRvcCkgKSB7XG5cbiAgICAgICAgICAgICAgICAgICAgbWluID0ge1xuICAgICAgICAgICAgICAgICAgICAgICAgdG9wICA6IG9mZnNldC50b3AsXG4gICAgICAgICAgICAgICAgICAgICAgICBsZWZ0IDogb2Zmc2V0LmxlZnQsXG4gICAgICAgICAgICAgICAgICAgICAgICBwb3MgIDogcG9zXG4gICAgICAgICAgICAgICAgICAgIH07XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgIH0pLmVhY2goZnVuY3Rpb24oJGVsZSkge1xuXG4gICAgICAgICAgICAkZWxlICAgPSBVSS4kKHRoaXMpO1xuXG4gICAgICAgICAgICBpZiAoJGVsZS5jc3MoJ2Rpc3BsYXknKSAhPSAnbm9uZScgJiYgJGVsZS5kYXRhKCd1a01hcmdpblRvcCcpID4gbWluLnRvcCAmJiAkZWxlLmRhdGEoJ3VrTWFyZ2luUG9zJykgPiBtaW4ucG9zKSB7XG4gICAgICAgICAgICAgICAgJGVsZS5hZGRDbGFzcyhvcHRpb25zLmNscyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuICAgIH07XG5cbiAgICBVSS5VdGlscy5tYXRjaEhlaWdodHMgPSBmdW5jdGlvbihlbGVtZW50cywgb3B0aW9ucykge1xuXG4gICAgICAgIGVsZW1lbnRzID0gVUkuJChlbGVtZW50cykuY3NzKCdtaW4taGVpZ2h0JywgJycpO1xuICAgICAgICBvcHRpb25zICA9IFVJLiQuZXh0ZW5kKHsgcm93IDogdHJ1ZSB9LCBvcHRpb25zKTtcblxuICAgICAgICB2YXIgbWF0Y2hIZWlnaHRzID0gZnVuY3Rpb24oZ3JvdXApe1xuXG4gICAgICAgICAgICBpZiAoZ3JvdXAubGVuZ3RoIDwgMikgcmV0dXJuO1xuXG4gICAgICAgICAgICB2YXIgbWF4ID0gMDtcblxuICAgICAgICAgICAgZ3JvdXAuZWFjaChmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICBtYXggPSBNYXRoLm1heChtYXgsIFVJLiQodGhpcykub3V0ZXJIZWlnaHQoKSk7XG4gICAgICAgICAgICB9KS5lYWNoKGZ1bmN0aW9uKCkge1xuXG4gICAgICAgICAgICAgICAgdmFyIGVsZW1lbnQgPSBVSS4kKHRoaXMpLFxuICAgICAgICAgICAgICAgICAgICBoZWlnaHQgID0gbWF4IC0gKGVsZW1lbnQuY3NzKCdib3gtc2l6aW5nJykgPT0gJ2JvcmRlci1ib3gnID8gMCA6IChlbGVtZW50Lm91dGVySGVpZ2h0KCkgLSBlbGVtZW50LmhlaWdodCgpKSk7XG5cbiAgICAgICAgICAgICAgICBlbGVtZW50LmNzcygnbWluLWhlaWdodCcsIGhlaWdodCArICdweCcpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH07XG5cbiAgICAgICAgaWYgKG9wdGlvbnMucm93KSB7XG5cbiAgICAgICAgICAgIGVsZW1lbnRzLmZpcnN0KCkud2lkdGgoKTsgLy8gZm9yY2UgcmVkcmF3XG5cbiAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKXtcblxuICAgICAgICAgICAgICAgIHZhciBsYXN0b2Zmc2V0ID0gZmFsc2UsIGdyb3VwID0gW107XG5cbiAgICAgICAgICAgICAgICBlbGVtZW50cy5lYWNoKGZ1bmN0aW9uKCkge1xuXG4gICAgICAgICAgICAgICAgICAgIHZhciBlbGUgPSBVSS4kKHRoaXMpLCBvZmZzZXQgPSBlbGUub2Zmc2V0KCkudG9wO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmIChvZmZzZXQgIT0gbGFzdG9mZnNldCAmJiBncm91cC5sZW5ndGgpIHtcblxuICAgICAgICAgICAgICAgICAgICAgICAgbWF0Y2hIZWlnaHRzKFVJLiQoZ3JvdXApKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGdyb3VwICA9IFtdO1xuICAgICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0ID0gZWxlLm9mZnNldCgpLnRvcDtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGdyb3VwLnB1c2goZWxlKTtcbiAgICAgICAgICAgICAgICAgICAgbGFzdG9mZnNldCA9IG9mZnNldDtcbiAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgIGlmIChncm91cC5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgbWF0Y2hIZWlnaHRzKFVJLiQoZ3JvdXApKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIH0sIDApO1xuXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBtYXRjaEhlaWdodHMoZWxlbWVudHMpO1xuICAgICAgICB9XG4gICAgfTtcblxuICAgIChmdW5jdGlvbihjYWNoZVN2Z3Mpe1xuXG4gICAgICAgIFVJLlV0aWxzLmlubGluZVN2ZyA9IGZ1bmN0aW9uKHNlbGVjdG9yLCByb290KSB7XG5cbiAgICAgICAgICAgIHZhciBpbWFnZXMgPSBVSS4kKHNlbGVjdG9yIHx8ICdpbWdbc3JjJD1cIi5zdmdcIl0nLCByb290IHx8IGRvY3VtZW50KS5lYWNoKGZ1bmN0aW9uKCl7XG5cbiAgICAgICAgICAgICAgICB2YXIgaW1nID0gVUkuJCh0aGlzKSxcbiAgICAgICAgICAgICAgICAgICAgc3JjID0gaW1nLmF0dHIoJ3NyYycpO1xuXG4gICAgICAgICAgICAgICAgaWYgKCFjYWNoZVN2Z3Nbc3JjXSkge1xuXG4gICAgICAgICAgICAgICAgICAgIHZhciBkID0gVUkuJC5EZWZlcnJlZCgpO1xuXG4gICAgICAgICAgICAgICAgICAgIFVJLiQuZ2V0KHNyYywge25jOiBNYXRoLnJhbmRvbSgpfSwgZnVuY3Rpb24oZGF0YSl7XG4gICAgICAgICAgICAgICAgICAgICAgICBkLnJlc29sdmUoVUkuJChkYXRhKS5maW5kKCdzdmcnKSk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgICAgIGNhY2hlU3Znc1tzcmNdID0gZC5wcm9taXNlKCk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgY2FjaGVTdmdzW3NyY10udGhlbihmdW5jdGlvbihzdmcpIHtcblxuICAgICAgICAgICAgICAgICAgICB2YXIgJHN2ZyA9IFVJLiQoc3ZnKS5jbG9uZSgpO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmIChpbWcuYXR0cignaWQnKSkgJHN2Zy5hdHRyKCdpZCcsIGltZy5hdHRyKCdpZCcpKTtcbiAgICAgICAgICAgICAgICAgICAgaWYgKGltZy5hdHRyKCdjbGFzcycpKSAkc3ZnLmF0dHIoJ2NsYXNzJywgaW1nLmF0dHIoJ2NsYXNzJykpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoaW1nLmF0dHIoJ3N0eWxlJykpICRzdmcuYXR0cignc3R5bGUnLCBpbWcuYXR0cignc3R5bGUnKSk7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKGltZy5hdHRyKCd3aWR0aCcpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAkc3ZnLmF0dHIoJ3dpZHRoJywgaW1nLmF0dHIoJ3dpZHRoJykpO1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFpbWcuYXR0cignaGVpZ2h0JykpICAkc3ZnLnJlbW92ZUF0dHIoJ2hlaWdodCcpO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKGltZy5hdHRyKCdoZWlnaHQnKSl7XG4gICAgICAgICAgICAgICAgICAgICAgICAkc3ZnLmF0dHIoJ2hlaWdodCcsIGltZy5hdHRyKCdoZWlnaHQnKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWltZy5hdHRyKCd3aWR0aCcpKSAkc3ZnLnJlbW92ZUF0dHIoJ3dpZHRoJyk7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBpbWcucmVwbGFjZVdpdGgoJHN2Zyk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfTtcblxuICAgICAgICAvLyBpbml0IGNvZGVcbiAgICAgICAgVUkucmVhZHkoZnVuY3Rpb24oY29udGV4dCkge1xuICAgICAgICAgICAgVUkuVXRpbHMuaW5saW5lU3ZnKCdbZGF0YS11ay1zdmddJywgY29udGV4dCk7XG4gICAgICAgIH0pO1xuXG4gICAgfSkoe30pO1xuXG4gICAgVUkuVXRpbHMuZ2V0Q3NzVmFyID0gZnVuY3Rpb24obmFtZSkge1xuXG4gICAgICAgIC8qIHVzYWdlIGluIGNzczogIC52YXItbmFtZTpiZWZvcmUgeyBjb250ZW50OlwieHl6XCIgfSAqL1xuXG4gICAgICAgIHZhciB2YWwsIGRvYyA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCwgZWxlbWVudCA9IGRvYy5hcHBlbmRDaGlsZChkb2N1bWVudC5jcmVhdGVFbGVtZW50KCdkaXYnKSk7XG5cbiAgICAgICAgZWxlbWVudC5jbGFzc0xpc3QuYWRkKCd2YXItJytuYW1lKTtcblxuICAgICAgICB0cnkge1xuICAgICAgICAgICAgdmFsID0gSlNPTi5wYXJzZSh2YWwgPSBnZXRDb21wdXRlZFN0eWxlKGVsZW1lbnQsICc6YmVmb3JlJykuY29udGVudC5yZXBsYWNlKC9eW1wiJ10oLiopW1wiJ10kLywgJyQxJykpO1xuICAgICAgICB9IGNhdGNoIChlKSB7XG4gICAgICAgICAgICB2YWwgPSB1bmRlZmluZWQ7XG4gICAgICAgIH1cblxuICAgICAgICBkb2MucmVtb3ZlQ2hpbGQoZWxlbWVudCk7XG5cbiAgICAgICAgcmV0dXJuIHZhbDtcbiAgICB9XG5cbn0pKFVJa2l0Mik7XG5cbihmdW5jdGlvbihVSSkge1xuXG4gICAgXCJ1c2Ugc3RyaWN0XCI7XG5cbiAgICBVSS5jb21wb25lbnQoJ3Ntb290aFNjcm9sbCcsIHtcblxuICAgICAgICBib290OiBmdW5jdGlvbigpIHtcblxuICAgICAgICAgICAgLy8gaW5pdCBjb2RlXG4gICAgICAgICAgICBVSS4kaHRtbC5vbignY2xpY2suc21vb3RoLXNjcm9sbC51aWtpdCcsICdbZGF0YS11ay1zbW9vdGgtc2Nyb2xsXScsIGZ1bmN0aW9uKGUpIHtcbiAgICAgICAgICAgICAgICB2YXIgZWxlID0gVUkuJCh0aGlzKTtcblxuICAgICAgICAgICAgICAgIGlmICghZWxlLmRhdGEoJ3Ntb290aFNjcm9sbCcpKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBvYmogPSBVSS5zbW9vdGhTY3JvbGwoZWxlLCBVSS5VdGlscy5vcHRpb25zKGVsZS5hdHRyKCdkYXRhLXVrLXNtb290aC1zY3JvbGwnKSkpO1xuICAgICAgICAgICAgICAgICAgICBlbGUudHJpZ2dlcignY2xpY2snKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSxcblxuICAgICAgICBpbml0OiBmdW5jdGlvbigpIHtcblxuICAgICAgICAgICAgdmFyICR0aGlzID0gdGhpcztcblxuICAgICAgICAgICAgdGhpcy5vbignY2xpY2snLCBmdW5jdGlvbihlKSB7XG4gICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgIHNjcm9sbFRvRWxlbWVudChVSS4kKHRoaXMuaGFzaCkubGVuZ3RoID8gVUkuJCh0aGlzLmhhc2gpIDogVUkuJCgnYm9keScpLCAkdGhpcy5vcHRpb25zKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG4gICAgfSk7XG5cbiAgICBmdW5jdGlvbiBzY3JvbGxUb0VsZW1lbnQoZWxlLCBvcHRpb25zKSB7XG5cbiAgICAgICAgb3B0aW9ucyA9IFVJLiQuZXh0ZW5kKHtcbiAgICAgICAgICAgIGR1cmF0aW9uOiAxMDAwLFxuICAgICAgICAgICAgdHJhbnNpdGlvbjogJ2Vhc2VPdXRFeHBvJyxcbiAgICAgICAgICAgIG9mZnNldDogMCxcbiAgICAgICAgICAgIGNvbXBsZXRlOiBmdW5jdGlvbigpe31cbiAgICAgICAgfSwgb3B0aW9ucyk7XG5cbiAgICAgICAgLy8gZ2V0IC8gc2V0IHBhcmFtZXRlcnNcbiAgICAgICAgdmFyIHRhcmdldCAgICA9IGVsZS5vZmZzZXQoKS50b3AgLSBvcHRpb25zLm9mZnNldCxcbiAgICAgICAgICAgIGRvY2hlaWdodCA9IFVJLiRkb2MuaGVpZ2h0KCksXG4gICAgICAgICAgICB3aW5oZWlnaHQgPSB3aW5kb3cuaW5uZXJIZWlnaHQ7XG5cbiAgICAgICAgaWYgKCh0YXJnZXQgKyB3aW5oZWlnaHQpID4gZG9jaGVpZ2h0KSB7XG4gICAgICAgICAgICB0YXJnZXQgPSBkb2NoZWlnaHQgLSB3aW5oZWlnaHQ7XG4gICAgICAgIH1cblxuICAgICAgICAvLyBhbmltYXRlIHRvIHRhcmdldCwgZmlyZSBjYWxsYmFjayB3aGVuIGRvbmVcbiAgICAgICAgVUkuJCgnaHRtbCxib2R5Jykuc3RvcCgpLmFuaW1hdGUoe3Njcm9sbFRvcDogdGFyZ2V0fSwgb3B0aW9ucy5kdXJhdGlvbiwgb3B0aW9ucy50cmFuc2l0aW9uKS5wcm9taXNlKCkuZG9uZShvcHRpb25zLmNvbXBsZXRlKTtcbiAgICB9XG5cbiAgICBVSS5VdGlscy5zY3JvbGxUb0VsZW1lbnQgPSBzY3JvbGxUb0VsZW1lbnQ7XG5cbiAgICBpZiAoIVVJLiQuZWFzaW5nLmVhc2VPdXRFeHBvKSB7XG4gICAgICAgIFVJLiQuZWFzaW5nLmVhc2VPdXRFeHBvID0gZnVuY3Rpb24oeCwgdCwgYiwgYywgZCkgeyByZXR1cm4gKHQgPT0gZCkgPyBiICsgYyA6IGMgKiAoLU1hdGgucG93KDIsIC0xMCAqIHQgLyBkKSArIDEpICsgYjsgfTtcbiAgICB9XG5cbn0pKFVJa2l0Mik7XG5cbihmdW5jdGlvbihVSSkge1xuXG4gICAgXCJ1c2Ugc3RyaWN0XCI7XG5cbiAgICB2YXIgJHdpbiAgICAgICAgICAgPSBVSS4kd2luLFxuICAgICAgICAkZG9jICAgICAgICAgICA9IFVJLiRkb2MsXG4gICAgICAgIHNjcm9sbHNwaWVzICAgID0gW10sXG4gICAgICAgIGNoZWNrU2Nyb2xsU3B5ID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICBmb3IodmFyIGk9MDsgaSA8IHNjcm9sbHNwaWVzLmxlbmd0aDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgd2luZG93LnJlcXVlc3RBbmltYXRpb25GcmFtZS5hcHBseSh3aW5kb3csIFtzY3JvbGxzcGllc1tpXS5jaGVja10pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuXG4gICAgVUkuY29tcG9uZW50KCdzY3JvbGxzcHknLCB7XG5cbiAgICAgICAgZGVmYXVsdHM6IHtcbiAgICAgICAgICAgIHRhcmdldCAgICAgOiBmYWxzZSxcbiAgICAgICAgICAgIGNscyAgICAgICAgOiAndWstc2Nyb2xsc3B5LWludmlldycsXG4gICAgICAgICAgICBpbml0Y2xzICAgIDogJ3VrLXNjcm9sbHNweS1pbml0LWludmlldycsXG4gICAgICAgICAgICB0b3BvZmZzZXQgIDogMCxcbiAgICAgICAgICAgIGxlZnRvZmZzZXQgOiAwLFxuICAgICAgICAgICAgcmVwZWF0ICAgICA6IGZhbHNlLFxuICAgICAgICAgICAgZGVsYXkgICAgICA6IDBcbiAgICAgICAgfSxcblxuICAgICAgICBib290OiBmdW5jdGlvbigpIHtcblxuICAgICAgICAgICAgLy8gbGlzdGVuIHRvIHNjcm9sbCBhbmQgcmVzaXplXG4gICAgICAgICAgICAkZG9jLm9uKCdzY3JvbGxpbmcudWsuZG9jdW1lbnQnLCBjaGVja1Njcm9sbFNweSk7XG4gICAgICAgICAgICAkd2luLm9uKCdsb2FkIHJlc2l6ZSBvcmllbnRhdGlvbmNoYW5nZScsIFVJLlV0aWxzLmRlYm91bmNlKGNoZWNrU2Nyb2xsU3B5LCA1MCkpO1xuXG4gICAgICAgICAgICAvLyBpbml0IGNvZGVcbiAgICAgICAgICAgIFVJLnJlYWR5KGZ1bmN0aW9uKGNvbnRleHQpIHtcblxuICAgICAgICAgICAgICAgIFVJLiQoJ1tkYXRhLXVrLXNjcm9sbHNweV0nLCBjb250ZXh0KS5lYWNoKGZ1bmN0aW9uKCkge1xuXG4gICAgICAgICAgICAgICAgICAgIHZhciBlbGVtZW50ID0gVUkuJCh0aGlzKTtcblxuICAgICAgICAgICAgICAgICAgICBpZiAoIWVsZW1lbnQuZGF0YSgnc2Nyb2xsc3B5JykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBvYmogPSBVSS5zY3JvbGxzcHkoZWxlbWVudCwgVUkuVXRpbHMub3B0aW9ucyhlbGVtZW50LmF0dHIoJ2RhdGEtdWstc2Nyb2xsc3B5JykpKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgaW5pdDogZnVuY3Rpb24oKSB7XG5cbiAgICAgICAgICAgIHZhciAkdGhpcyA9IHRoaXMsIGludmlld3N0YXRlLCBpbml0aW52aWV3LCB0b2dnbGVjbHMgPSB0aGlzLm9wdGlvbnMuY2xzLnNwbGl0KC8sLyksIGZuID0gZnVuY3Rpb24oKXtcblxuICAgICAgICAgICAgICAgIHZhciBlbGVtZW50cyAgICAgPSAkdGhpcy5vcHRpb25zLnRhcmdldCA/ICR0aGlzLmVsZW1lbnQuZmluZCgkdGhpcy5vcHRpb25zLnRhcmdldCkgOiAkdGhpcy5lbGVtZW50LFxuICAgICAgICAgICAgICAgICAgICBkZWxheUlkeCAgICAgPSBlbGVtZW50cy5sZW5ndGggPT09IDEgPyAxIDogMCxcbiAgICAgICAgICAgICAgICAgICAgdG9nZ2xlY2xzSWR4ID0gMDtcblxuICAgICAgICAgICAgICAgIGVsZW1lbnRzLmVhY2goZnVuY3Rpb24oaWR4KXtcblxuICAgICAgICAgICAgICAgICAgICB2YXIgZWxlbWVudCAgICAgPSBVSS4kKHRoaXMpLFxuICAgICAgICAgICAgICAgICAgICAgICAgaW52aWV3c3RhdGUgPSBlbGVtZW50LmRhdGEoJ2ludmlld3N0YXRlJyksXG4gICAgICAgICAgICAgICAgICAgICAgICBpbnZpZXcgICAgICA9IFVJLlV0aWxzLmlzSW5WaWV3KGVsZW1lbnQsICR0aGlzLm9wdGlvbnMpLFxuICAgICAgICAgICAgICAgICAgICAgICAgdG9nZ2xlICAgICAgPSBlbGVtZW50LmF0dHIoJ2RhdGEtdWstc2Nyb2xsc3B5LWNscycpIHx8IHRvZ2dsZWNsc1t0b2dnbGVjbHNJZHhdLnRyaW0oKTtcblxuICAgICAgICAgICAgICAgICAgICBpZiAoaW52aWV3ICYmICFpbnZpZXdzdGF0ZSAmJiAhZWxlbWVudC5kYXRhKCdzY3JvbGxzcHktaWRsZScpKSB7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaW5pdGludmlldykge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQuYWRkQ2xhc3MoJHRoaXMub3B0aW9ucy5pbml0Y2xzKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy5vZmZzZXQgPSBlbGVtZW50Lm9mZnNldCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluaXRpbnZpZXcgPSB0cnVlO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudC50cmlnZ2VyKCdpbml0LnVrLnNjcm9sbHNweScpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50LmRhdGEoJ3Njcm9sbHNweS1pZGxlJywgc2V0VGltZW91dChmdW5jdGlvbigpe1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5hZGRDbGFzcygndWstc2Nyb2xsc3B5LWludmlldycpLnRvZ2dsZUNsYXNzKHRvZ2dsZSkud2lkdGgoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50LnRyaWdnZXIoJ2ludmlldy51ay5zY3JvbGxzcHknKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQuZGF0YSgnc2Nyb2xsc3B5LWlkbGUnLCBmYWxzZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudC5kYXRhKCdpbnZpZXdzdGF0ZScsIHRydWUpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICB9LCAkdGhpcy5vcHRpb25zLmRlbGF5ICogZGVsYXlJZHgpKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgZGVsYXlJZHgrKztcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGlmICghaW52aWV3ICYmIGludmlld3N0YXRlICYmICR0aGlzLm9wdGlvbnMucmVwZWF0KSB7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChlbGVtZW50LmRhdGEoJ3Njcm9sbHNweS1pZGxlJykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQoZWxlbWVudC5kYXRhKCdzY3JvbGxzcHktaWRsZScpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50LmRhdGEoJ3Njcm9sbHNweS1pZGxlJywgZmFsc2UpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50LnJlbW92ZUNsYXNzKCd1ay1zY3JvbGxzcHktaW52aWV3JykudG9nZ2xlQ2xhc3ModG9nZ2xlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQuZGF0YSgnaW52aWV3c3RhdGUnLCBmYWxzZSk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsZW1lbnQudHJpZ2dlcignb3V0dmlldy51ay5zY3JvbGxzcHknKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIHRvZ2dsZWNsc0lkeCA9IHRvZ2dsZWNsc1t0b2dnbGVjbHNJZHggKyAxXSA/ICh0b2dnbGVjbHNJZHggKyAxKSA6IDA7XG5cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIGZuKCk7XG5cbiAgICAgICAgICAgIHRoaXMuY2hlY2sgPSBmbjtcblxuICAgICAgICAgICAgc2Nyb2xsc3BpZXMucHVzaCh0aGlzKTtcbiAgICAgICAgfVxuICAgIH0pO1xuXG5cbiAgICB2YXIgc2Nyb2xsc3B5bmF2cyA9IFtdLFxuICAgICAgICBjaGVja1Njcm9sbFNweU5hdnMgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIGZvcih2YXIgaT0wOyBpIDwgc2Nyb2xsc3B5bmF2cy5sZW5ndGg7IGkrKykge1xuICAgICAgICAgICAgICAgIHdpbmRvdy5yZXF1ZXN0QW5pbWF0aW9uRnJhbWUuYXBwbHkod2luZG93LCBbc2Nyb2xsc3B5bmF2c1tpXS5jaGVja10pO1xuICAgICAgICAgICAgfVxuICAgICAgICB9O1xuXG4gICAgVUkuY29tcG9uZW50KCdzY3JvbGxzcHluYXYnLCB7XG5cbiAgICAgICAgZGVmYXVsdHM6IHtcbiAgICAgICAgICAgIGNscyAgICAgICAgICA6ICd1ay1hY3RpdmUnLFxuICAgICAgICAgICAgY2xvc2VzdCAgICAgIDogZmFsc2UsXG4gICAgICAgICAgICB0b3BvZmZzZXQgICAgOiAwLFxuICAgICAgICAgICAgbGVmdG9mZnNldCAgIDogMCxcbiAgICAgICAgICAgIHNtb290aHNjcm9sbCA6IGZhbHNlXG4gICAgICAgIH0sXG5cbiAgICAgICAgYm9vdDogZnVuY3Rpb24oKSB7XG5cbiAgICAgICAgICAgIC8vIGxpc3RlbiB0byBzY3JvbGwgYW5kIHJlc2l6ZVxuICAgICAgICAgICAgJGRvYy5vbignc2Nyb2xsaW5nLnVrLmRvY3VtZW50JywgY2hlY2tTY3JvbGxTcHlOYXZzKTtcbiAgICAgICAgICAgICR3aW4ub24oJ3Jlc2l6ZSBvcmllbnRhdGlvbmNoYW5nZScsIFVJLlV0aWxzLmRlYm91bmNlKGNoZWNrU2Nyb2xsU3B5TmF2cywgNTApKTtcblxuICAgICAgICAgICAgLy8gaW5pdCBjb2RlXG4gICAgICAgICAgICBVSS5yZWFkeShmdW5jdGlvbihjb250ZXh0KSB7XG5cbiAgICAgICAgICAgICAgICBVSS4kKCdbZGF0YS11ay1zY3JvbGxzcHktbmF2XScsIGNvbnRleHQpLmVhY2goZnVuY3Rpb24oKSB7XG5cbiAgICAgICAgICAgICAgICAgICAgdmFyIGVsZW1lbnQgPSBVSS4kKHRoaXMpO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmICghZWxlbWVudC5kYXRhKCdzY3JvbGxzcHluYXYnKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG9iaiA9IFVJLnNjcm9sbHNweW5hdihlbGVtZW50LCBVSS5VdGlscy5vcHRpb25zKGVsZW1lbnQuYXR0cignZGF0YS11ay1zY3JvbGxzcHktbmF2JykpKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgaW5pdDogZnVuY3Rpb24oKSB7XG5cbiAgICAgICAgICAgIHZhciBpZHMgICAgID0gW10sXG4gICAgICAgICAgICAgICAgbGlua3MgICA9IHRoaXMuZmluZChcImFbaHJlZl49JyMnXVwiKS5lYWNoKGZ1bmN0aW9uKCl7IGlmKHRoaXMuZ2V0QXR0cmlidXRlKCdocmVmJykudHJpbSgpIT09JyMnKSBpZHMucHVzaCh0aGlzLmdldEF0dHJpYnV0ZSgnaHJlZicpKTsgfSksXG4gICAgICAgICAgICAgICAgdGFyZ2V0cyA9IFVJLiQoaWRzLmpvaW4oXCIsXCIpKSxcblxuICAgICAgICAgICAgICAgIGNsc0FjdGl2ZSAgPSB0aGlzLm9wdGlvbnMuY2xzLFxuICAgICAgICAgICAgICAgIGNsc0Nsb3Nlc3QgPSB0aGlzLm9wdGlvbnMuY2xvc2VzdCB8fCB0aGlzLm9wdGlvbnMuY2xvc2VzdDtcblxuICAgICAgICAgICAgdmFyICR0aGlzID0gdGhpcywgaW52aWV3cywgZm4gPSBmdW5jdGlvbigpe1xuXG4gICAgICAgICAgICAgICAgaW52aWV3cyA9IFtdO1xuXG4gICAgICAgICAgICAgICAgZm9yICh2YXIgaT0wIDsgaSA8IHRhcmdldHMubGVuZ3RoIDsgaSsrKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmIChVSS5VdGlscy5pc0luVmlldyh0YXJnZXRzLmVxKGkpLCAkdGhpcy5vcHRpb25zKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaW52aWV3cy5wdXNoKHRhcmdldHMuZXEoaSkpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYgKGludmlld3MubGVuZ3RoKSB7XG5cbiAgICAgICAgICAgICAgICAgICAgdmFyIG5hdml0ZW1zLFxuICAgICAgICAgICAgICAgICAgICAgICAgc2Nyb2xsVG9wID0gJHdpbi5zY3JvbGxUb3AoKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldCA9IChmdW5jdGlvbigpe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcih2YXIgaT0wOyBpPCBpbnZpZXdzLmxlbmd0aDtpKyspe1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoaW52aWV3c1tpXS5vZmZzZXQoKS50b3AgLSAkdGhpcy5vcHRpb25zLnRvcG9mZnNldCA+PSBzY3JvbGxUb3Ape1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGludmlld3NbaV07XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgICAgICB9KSgpO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmICghdGFyZ2V0KSByZXR1cm47XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKCR0aGlzLm9wdGlvbnMuY2xvc2VzdCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgbGlua3MuYmx1cigpLmNsb3Nlc3QoY2xzQ2xvc2VzdCkucmVtb3ZlQ2xhc3MoY2xzQWN0aXZlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIG5hdml0ZW1zID0gbGlua3MuZmlsdGVyKFwiYVtocmVmPScjXCIrdGFyZ2V0LmF0dHIoJ2lkJykrXCInXVwiKS5jbG9zZXN0KGNsc0Nsb3Nlc3QpLmFkZENsYXNzKGNsc0FjdGl2ZSk7XG4gICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBuYXZpdGVtcyA9IGxpbmtzLnJlbW92ZUNsYXNzKGNsc0FjdGl2ZSkuZmlsdGVyKFwiYVtocmVmPScjXCIrdGFyZ2V0LmF0dHIoXCJpZFwiKStcIiddXCIpLmFkZENsYXNzKGNsc0FjdGl2ZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAkdGhpcy5lbGVtZW50LnRyaWdnZXIoJ2ludmlldy51ay5zY3JvbGxzcHluYXYnLCBbdGFyZ2V0LCBuYXZpdGVtc10pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMuc21vb3Roc2Nyb2xsICYmIFVJLnNtb290aFNjcm9sbCkge1xuICAgICAgICAgICAgICAgIGxpbmtzLmVhY2goZnVuY3Rpb24oKXtcbiAgICAgICAgICAgICAgICAgICAgVUkuc21vb3RoU2Nyb2xsKHRoaXMsICR0aGlzLm9wdGlvbnMuc21vb3Roc2Nyb2xsKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgZm4oKTtcblxuICAgICAgICAgICAgdGhpcy5lbGVtZW50LmRhdGEoJ3Njcm9sbHNweW5hdicsIHRoaXMpO1xuXG4gICAgICAgICAgICB0aGlzLmNoZWNrID0gZm47XG4gICAgICAgICAgICBzY3JvbGxzcHluYXZzLnB1c2godGhpcyk7XG5cbiAgICAgICAgfVxuICAgIH0pO1xuXG59KShVSWtpdDIpO1xuXG4oZnVuY3Rpb24oVUkpe1xuXG4gICAgXCJ1c2Ugc3RyaWN0XCI7XG5cbiAgICB2YXIgdG9nZ2xlcyA9IFtdO1xuXG4gICAgVUkuY29tcG9uZW50KCd0b2dnbGUnLCB7XG5cbiAgICAgICAgZGVmYXVsdHM6IHtcbiAgICAgICAgICAgIHRhcmdldCAgICA6IGZhbHNlLFxuICAgICAgICAgICAgY2xzICAgICAgIDogJ3VrLWhpZGRlbicsXG4gICAgICAgICAgICBhbmltYXRpb24gOiBmYWxzZSxcbiAgICAgICAgICAgIGR1cmF0aW9uICA6IDIwMFxuICAgICAgICB9LFxuXG4gICAgICAgIGJvb3Q6IGZ1bmN0aW9uKCl7XG5cbiAgICAgICAgICAgIC8vIGluaXQgY29kZVxuICAgICAgICAgICAgVUkucmVhZHkoZnVuY3Rpb24oY29udGV4dCkge1xuXG4gICAgICAgICAgICAgICAgVUkuJCgnW2RhdGEtdWstdG9nZ2xlXScsIGNvbnRleHQpLmVhY2goZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBlbGUgPSBVSS4kKHRoaXMpO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmICghZWxlLmRhdGEoJ3RvZ2dsZScpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICB2YXIgb2JqID0gVUkudG9nZ2xlKGVsZSwgVUkuVXRpbHMub3B0aW9ucyhlbGUuYXR0cignZGF0YS11ay10b2dnbGUnKSkpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7XG5cbiAgICAgICAgICAgICAgICAgICAgdG9nZ2xlcy5mb3JFYWNoKGZ1bmN0aW9uKHRvZ2dsZSl7XG4gICAgICAgICAgICAgICAgICAgICAgICB0b2dnbGUuZ2V0VG9nZ2xlcygpO1xuICAgICAgICAgICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgICAgIH0sIDApO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgaW5pdDogZnVuY3Rpb24oKSB7XG5cbiAgICAgICAgICAgIHZhciAkdGhpcyA9IHRoaXM7XG5cbiAgICAgICAgICAgIHRoaXMuYXJpYSA9ICh0aGlzLm9wdGlvbnMuY2xzLmluZGV4T2YoJ3VrLWhpZGRlbicpICE9PSAtMSk7XG5cbiAgICAgICAgICAgIHRoaXMub24oJ2NsaWNrJywgZnVuY3Rpb24oZSkge1xuXG4gICAgICAgICAgICAgICAgaWYgKCR0aGlzLmVsZW1lbnQuaXMoJ2FbaHJlZj1cIiNcIl0nKSkge1xuICAgICAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgJHRoaXMudG9nZ2xlKCk7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgdG9nZ2xlcy5wdXNoKHRoaXMpO1xuICAgICAgICB9LFxuXG4gICAgICAgIHRvZ2dsZTogZnVuY3Rpb24oKSB7XG5cbiAgICAgICAgICAgIHRoaXMuZ2V0VG9nZ2xlcygpO1xuXG4gICAgICAgICAgICBpZighdGhpcy50b3RvZ2dsZS5sZW5ndGgpIHJldHVybjtcblxuICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5hbmltYXRpb24gJiYgVUkuc3VwcG9ydC5hbmltYXRpb24pIHtcblxuICAgICAgICAgICAgICAgIHZhciAkdGhpcyA9IHRoaXMsIGFuaW1hdGlvbnMgPSB0aGlzLm9wdGlvbnMuYW5pbWF0aW9uLnNwbGl0KCcsJyk7XG5cbiAgICAgICAgICAgICAgICBpZiAoYW5pbWF0aW9ucy5sZW5ndGggPT0gMSkge1xuICAgICAgICAgICAgICAgICAgICBhbmltYXRpb25zWzFdID0gYW5pbWF0aW9uc1swXTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBhbmltYXRpb25zWzBdID0gYW5pbWF0aW9uc1swXS50cmltKCk7XG4gICAgICAgICAgICAgICAgYW5pbWF0aW9uc1sxXSA9IGFuaW1hdGlvbnNbMV0udHJpbSgpO1xuXG4gICAgICAgICAgICAgICAgdGhpcy50b3RvZ2dsZS5jc3MoJ2FuaW1hdGlvbi1kdXJhdGlvbicsIHRoaXMub3B0aW9ucy5kdXJhdGlvbisnbXMnKTtcblxuICAgICAgICAgICAgICAgIHRoaXMudG90b2dnbGUuZWFjaChmdW5jdGlvbigpe1xuXG4gICAgICAgICAgICAgICAgICAgIHZhciBlbGUgPSBVSS4kKHRoaXMpO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmIChlbGUuaGFzQ2xhc3MoJHRoaXMub3B0aW9ucy5jbHMpKSB7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGVsZS50b2dnbGVDbGFzcygkdGhpcy5vcHRpb25zLmNscyk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIFVJLlV0aWxzLmFuaW1hdGUoZWxlLCBhbmltYXRpb25zWzBdKS50aGVuKGZ1bmN0aW9uKCl7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlLmNzcygnYW5pbWF0aW9uLWR1cmF0aW9uJywgJycpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJLlV0aWxzLmNoZWNrRGlzcGxheShlbGUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcblxuICAgICAgICAgICAgICAgICAgICAgICAgVUkuVXRpbHMuYW5pbWF0ZSh0aGlzLCBhbmltYXRpb25zWzFdKycgdWstYW5pbWF0aW9uLXJldmVyc2UnKS50aGVuKGZ1bmN0aW9uKCl7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlLnRvZ2dsZUNsYXNzKCR0aGlzLm9wdGlvbnMuY2xzKS5jc3MoJ2FuaW1hdGlvbi1kdXJhdGlvbicsICcnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBVSS5VdGlscy5jaGVja0Rpc3BsYXkoZWxlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIHRoaXMudG90b2dnbGUudG9nZ2xlQ2xhc3ModGhpcy5vcHRpb25zLmNscyk7XG4gICAgICAgICAgICAgICAgVUkuVXRpbHMuY2hlY2tEaXNwbGF5KHRoaXMudG90b2dnbGUpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLnVwZGF0ZUFyaWEoKTtcblxuICAgICAgICB9LFxuXG4gICAgICAgIGdldFRvZ2dsZXM6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgdGhpcy50b3RvZ2dsZSA9IHRoaXMub3B0aW9ucy50YXJnZXQgPyBVSS4kKHRoaXMub3B0aW9ucy50YXJnZXQpOltdO1xuICAgICAgICAgICAgdGhpcy51cGRhdGVBcmlhKCk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgdXBkYXRlQXJpYTogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5hcmlhICYmIHRoaXMudG90b2dnbGUubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgdGhpcy50b3RvZ2dsZS5ub3QoJ1thcmlhLWhpZGRlbl0nKS5lYWNoKGZ1bmN0aW9uKCl7XG4gICAgICAgICAgICAgICAgICAgIFVJLiQodGhpcykuYXR0cignYXJpYS1oaWRkZW4nLCBVSS4kKHRoaXMpLmhhc0NsYXNzKCd1ay1oaWRkZW4nKSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9KTtcblxufSkoVUlraXQyKTtcblxuKGZ1bmN0aW9uKFVJKSB7XG5cbiAgICBcInVzZSBzdHJpY3RcIjtcblxuICAgIFVJLmNvbXBvbmVudCgnYWxlcnQnLCB7XG5cbiAgICAgICAgZGVmYXVsdHM6IHtcbiAgICAgICAgICAgIGZhZGU6IHRydWUsXG4gICAgICAgICAgICBkdXJhdGlvbjogMjAwLFxuICAgICAgICAgICAgdHJpZ2dlcjogJy51ay1hbGVydC1jbG9zZSdcbiAgICAgICAgfSxcblxuICAgICAgICBib290OiBmdW5jdGlvbigpIHtcblxuICAgICAgICAgICAgLy8gaW5pdCBjb2RlXG4gICAgICAgICAgICBVSS4kaHRtbC5vbignY2xpY2suYWxlcnQudWlraXQnLCAnW2RhdGEtdWstYWxlcnRdJywgZnVuY3Rpb24oZSkge1xuXG4gICAgICAgICAgICAgICAgdmFyIGVsZSA9IFVJLiQodGhpcyk7XG5cbiAgICAgICAgICAgICAgICBpZiAoIWVsZS5kYXRhKCdhbGVydCcpKSB7XG5cbiAgICAgICAgICAgICAgICAgICAgdmFyIGFsZXJ0ID0gVUkuYWxlcnQoZWxlLCBVSS5VdGlscy5vcHRpb25zKGVsZS5hdHRyKCdkYXRhLXVrLWFsZXJ0JykpKTtcblxuICAgICAgICAgICAgICAgICAgICBpZiAoVUkuJChlLnRhcmdldCkuaXMoYWxlcnQub3B0aW9ucy50cmlnZ2VyKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYWxlcnQuY2xvc2UoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9LFxuXG4gICAgICAgIGluaXQ6IGZ1bmN0aW9uKCkge1xuXG4gICAgICAgICAgICB2YXIgJHRoaXMgPSB0aGlzO1xuXG4gICAgICAgICAgICB0aGlzLm9uKCdjbGljaycsIHRoaXMub3B0aW9ucy50cmlnZ2VyLCBmdW5jdGlvbihlKSB7XG4gICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgICR0aGlzLmNsb3NlKCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSxcblxuICAgICAgICBjbG9zZTogZnVuY3Rpb24oKSB7XG5cbiAgICAgICAgICAgIHZhciBlbGVtZW50ICAgICAgID0gdGhpcy50cmlnZ2VyKCdjbG9zZS51ay5hbGVydCcpLFxuICAgICAgICAgICAgICAgIHJlbW92ZUVsZW1lbnQgPSBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMudHJpZ2dlcignY2xvc2VkLnVrLmFsZXJ0JykucmVtb3ZlKCk7XG4gICAgICAgICAgICAgICAgfS5iaW5kKHRoaXMpO1xuXG4gICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLmZhZGUpIHtcbiAgICAgICAgICAgICAgICBlbGVtZW50LmNzcygnb3ZlcmZsb3cnLCAnaGlkZGVuJykuY3NzKFwibWF4LWhlaWdodFwiLCBlbGVtZW50LmhlaWdodCgpKS5hbmltYXRlKHtcbiAgICAgICAgICAgICAgICAgICAgaGVpZ2h0ICAgICAgICAgOiAwLFxuICAgICAgICAgICAgICAgICAgICBvcGFjaXR5ICAgICAgICA6IDAsXG4gICAgICAgICAgICAgICAgICAgIHBhZGRpbmdUb3AgICAgOiAwLFxuICAgICAgICAgICAgICAgICAgICBwYWRkaW5nQm90dG9tIDogMCxcbiAgICAgICAgICAgICAgICAgICAgbWFyZ2luVG9wICAgICA6IDAsXG4gICAgICAgICAgICAgICAgICAgIG1hcmdpbkJvdHRvbSAgOiAwXG4gICAgICAgICAgICAgICAgfSwgdGhpcy5vcHRpb25zLmR1cmF0aW9uLCByZW1vdmVFbGVtZW50KTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgcmVtb3ZlRWxlbWVudCgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG5cbiAgICB9KTtcblxufSkoVUlraXQyKTtcblxuKGZ1bmN0aW9uKFVJKSB7XG5cbiAgICBcInVzZSBzdHJpY3RcIjtcblxuICAgIFVJLmNvbXBvbmVudCgnYnV0dG9uUmFkaW8nLCB7XG5cbiAgICAgICAgZGVmYXVsdHM6IHtcbiAgICAgICAgICAgIGFjdGl2ZUNsYXNzOiAndWstYWN0aXZlJyxcbiAgICAgICAgICAgIHRhcmdldDogJy51ay1idXR0b24nXG4gICAgICAgIH0sXG5cbiAgICAgICAgYm9vdDogZnVuY3Rpb24oKSB7XG5cbiAgICAgICAgICAgIC8vIGluaXQgY29kZVxuICAgICAgICAgICAgVUkuJGh0bWwub24oJ2NsaWNrLmJ1dHRvbnJhZGlvLnVpa2l0JywgJ1tkYXRhLXVrLWJ1dHRvbi1yYWRpb10nLCBmdW5jdGlvbihlKSB7XG5cbiAgICAgICAgICAgICAgICB2YXIgZWxlID0gVUkuJCh0aGlzKTtcblxuICAgICAgICAgICAgICAgIGlmICghZWxlLmRhdGEoJ2J1dHRvblJhZGlvJykpIHtcblxuICAgICAgICAgICAgICAgICAgICB2YXIgb2JqICAgID0gVUkuYnV0dG9uUmFkaW8oZWxlLCBVSS5VdGlscy5vcHRpb25zKGVsZS5hdHRyKCdkYXRhLXVrLWJ1dHRvbi1yYWRpbycpKSksXG4gICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXQgPSBVSS4kKGUudGFyZ2V0KTtcblxuICAgICAgICAgICAgICAgICAgICBpZiAodGFyZ2V0LmlzKG9iai5vcHRpb25zLnRhcmdldCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldC50cmlnZ2VyKCdjbGljaycpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgaW5pdDogZnVuY3Rpb24oKSB7XG5cbiAgICAgICAgICAgIHZhciAkdGhpcyA9IHRoaXM7XG5cbiAgICAgICAgICAgIC8vIEluaXQgQVJJQVxuICAgICAgICAgICAgdGhpcy5maW5kKCR0aGlzLm9wdGlvbnMudGFyZ2V0KS5hdHRyKCdhcmlhLWNoZWNrZWQnLCAnZmFsc2UnKS5maWx0ZXIoJy4nICsgJHRoaXMub3B0aW9ucy5hY3RpdmVDbGFzcykuYXR0cignYXJpYS1jaGVja2VkJywgJ3RydWUnKTtcblxuICAgICAgICAgICAgdGhpcy5vbignY2xpY2snLCB0aGlzLm9wdGlvbnMudGFyZ2V0LCBmdW5jdGlvbihlKSB7XG5cbiAgICAgICAgICAgICAgICB2YXIgZWxlID0gVUkuJCh0aGlzKTtcblxuICAgICAgICAgICAgICAgIGlmIChlbGUuaXMoJ2FbaHJlZj1cIiNcIl0nKSkgZS5wcmV2ZW50RGVmYXVsdCgpO1xuXG4gICAgICAgICAgICAgICAgJHRoaXMuZmluZCgkdGhpcy5vcHRpb25zLnRhcmdldCkubm90KGVsZSkucmVtb3ZlQ2xhc3MoJHRoaXMub3B0aW9ucy5hY3RpdmVDbGFzcykuYmx1cigpO1xuICAgICAgICAgICAgICAgIGVsZS5hZGRDbGFzcygkdGhpcy5vcHRpb25zLmFjdGl2ZUNsYXNzKTtcblxuICAgICAgICAgICAgICAgIC8vIFVwZGF0ZSBBUklBXG4gICAgICAgICAgICAgICAgJHRoaXMuZmluZCgkdGhpcy5vcHRpb25zLnRhcmdldCkubm90KGVsZSkuYXR0cignYXJpYS1jaGVja2VkJywgJ2ZhbHNlJyk7XG4gICAgICAgICAgICAgICAgZWxlLmF0dHIoJ2FyaWEtY2hlY2tlZCcsICd0cnVlJyk7XG5cbiAgICAgICAgICAgICAgICAkdGhpcy50cmlnZ2VyKCdjaGFuZ2UudWsuYnV0dG9uJywgW2VsZV0pO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgfSxcblxuICAgICAgICBnZXRTZWxlY3RlZDogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5maW5kKCcuJyArIHRoaXMub3B0aW9ucy5hY3RpdmVDbGFzcyk7XG4gICAgICAgIH1cbiAgICB9KTtcblxuICAgIFVJLmNvbXBvbmVudCgnYnV0dG9uQ2hlY2tib3gnLCB7XG5cbiAgICAgICAgZGVmYXVsdHM6IHtcbiAgICAgICAgICAgIGFjdGl2ZUNsYXNzOiAndWstYWN0aXZlJyxcbiAgICAgICAgICAgIHRhcmdldDogJy51ay1idXR0b24nXG4gICAgICAgIH0sXG5cbiAgICAgICAgYm9vdDogZnVuY3Rpb24oKSB7XG5cbiAgICAgICAgICAgIFVJLiRodG1sLm9uKCdjbGljay5idXR0b25jaGVja2JveC51aWtpdCcsICdbZGF0YS11ay1idXR0b24tY2hlY2tib3hdJywgZnVuY3Rpb24oZSkge1xuICAgICAgICAgICAgICAgIHZhciBlbGUgPSBVSS4kKHRoaXMpO1xuXG4gICAgICAgICAgICAgICAgaWYgKCFlbGUuZGF0YSgnYnV0dG9uQ2hlY2tib3gnKSkge1xuXG4gICAgICAgICAgICAgICAgICAgIHZhciBvYmogICAgPSBVSS5idXR0b25DaGVja2JveChlbGUsIFVJLlV0aWxzLm9wdGlvbnMoZWxlLmF0dHIoJ2RhdGEtdWstYnV0dG9uLWNoZWNrYm94JykpKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldCA9IFVJLiQoZS50YXJnZXQpO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmICh0YXJnZXQuaXMob2JqLm9wdGlvbnMudGFyZ2V0KSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0LnRyaWdnZXIoJ2NsaWNrJyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSxcblxuICAgICAgICBpbml0OiBmdW5jdGlvbigpIHtcblxuICAgICAgICAgICAgdmFyICR0aGlzID0gdGhpcztcblxuICAgICAgICAgICAgLy8gSW5pdCBBUklBXG4gICAgICAgICAgICB0aGlzLmZpbmQoJHRoaXMub3B0aW9ucy50YXJnZXQpLmF0dHIoJ2FyaWEtY2hlY2tlZCcsICdmYWxzZScpLmZpbHRlcignLicgKyAkdGhpcy5vcHRpb25zLmFjdGl2ZUNsYXNzKS5hdHRyKCdhcmlhLWNoZWNrZWQnLCAndHJ1ZScpO1xuXG4gICAgICAgICAgICB0aGlzLm9uKCdjbGljaycsIHRoaXMub3B0aW9ucy50YXJnZXQsIGZ1bmN0aW9uKGUpIHtcbiAgICAgICAgICAgICAgICB2YXIgZWxlID0gVUkuJCh0aGlzKTtcblxuICAgICAgICAgICAgICAgIGlmIChlbGUuaXMoJ2FbaHJlZj1cIiNcIl0nKSkgZS5wcmV2ZW50RGVmYXVsdCgpO1xuXG4gICAgICAgICAgICAgICAgZWxlLnRvZ2dsZUNsYXNzKCR0aGlzLm9wdGlvbnMuYWN0aXZlQ2xhc3MpLmJsdXIoKTtcblxuICAgICAgICAgICAgICAgIC8vIFVwZGF0ZSBBUklBXG4gICAgICAgICAgICAgICAgZWxlLmF0dHIoJ2FyaWEtY2hlY2tlZCcsIGVsZS5oYXNDbGFzcygkdGhpcy5vcHRpb25zLmFjdGl2ZUNsYXNzKSk7XG5cbiAgICAgICAgICAgICAgICAkdGhpcy50cmlnZ2VyKCdjaGFuZ2UudWsuYnV0dG9uJywgW2VsZV0pO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgfSxcblxuICAgICAgICBnZXRTZWxlY3RlZDogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5maW5kKCcuJyArIHRoaXMub3B0aW9ucy5hY3RpdmVDbGFzcyk7XG4gICAgICAgIH1cbiAgICB9KTtcblxuXG4gICAgVUkuY29tcG9uZW50KCdidXR0b24nLCB7XG5cbiAgICAgICAgZGVmYXVsdHM6IHt9LFxuXG4gICAgICAgIGJvb3Q6IGZ1bmN0aW9uKCkge1xuXG4gICAgICAgICAgICBVSS4kaHRtbC5vbignY2xpY2suYnV0dG9uLnVpa2l0JywgJ1tkYXRhLXVrLWJ1dHRvbl0nLCBmdW5jdGlvbihlKSB7XG4gICAgICAgICAgICAgICAgdmFyIGVsZSA9IFVJLiQodGhpcyk7XG5cbiAgICAgICAgICAgICAgICBpZiAoIWVsZS5kYXRhKCdidXR0b24nKSkge1xuXG4gICAgICAgICAgICAgICAgICAgIHZhciBvYmogPSBVSS5idXR0b24oZWxlLCBVSS5VdGlscy5vcHRpb25zKGVsZS5hdHRyKCdkYXRhLXVrLWJ1dHRvbicpKSk7XG4gICAgICAgICAgICAgICAgICAgIGVsZS50cmlnZ2VyKCdjbGljaycpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9LFxuXG4gICAgICAgIGluaXQ6IGZ1bmN0aW9uKCkge1xuXG4gICAgICAgICAgICB2YXIgJHRoaXMgPSB0aGlzO1xuXG4gICAgICAgICAgICAvLyBJbml0IEFSSUFcbiAgICAgICAgICAgIHRoaXMuZWxlbWVudC5hdHRyKCdhcmlhLXByZXNzZWQnLCB0aGlzLmVsZW1lbnQuaGFzQ2xhc3MoXCJ1ay1hY3RpdmVcIikpO1xuXG4gICAgICAgICAgICB0aGlzLm9uKCdjbGljaycsIGZ1bmN0aW9uKGUpIHtcblxuICAgICAgICAgICAgICAgIGlmICgkdGhpcy5lbGVtZW50LmlzKCdhW2hyZWY9XCIjXCJdJykpIGUucHJldmVudERlZmF1bHQoKTtcblxuICAgICAgICAgICAgICAgICR0aGlzLnRvZ2dsZSgpO1xuICAgICAgICAgICAgICAgICR0aGlzLnRyaWdnZXIoJ2NoYW5nZS51ay5idXR0b24nLCBbJHRoaXMuZWxlbWVudC5ibHVyKCkuaGFzQ2xhc3MoJ3VrLWFjdGl2ZScpXSk7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICB9LFxuXG4gICAgICAgIHRvZ2dsZTogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICB0aGlzLmVsZW1lbnQudG9nZ2xlQ2xhc3MoJ3VrLWFjdGl2ZScpO1xuXG4gICAgICAgICAgICAvLyBVcGRhdGUgQVJJQVxuICAgICAgICAgICAgdGhpcy5lbGVtZW50LmF0dHIoJ2FyaWEtcHJlc3NlZCcsIHRoaXMuZWxlbWVudC5oYXNDbGFzcygndWstYWN0aXZlJykpO1xuICAgICAgICB9XG4gICAgfSk7XG5cbn0pKFVJa2l0Mik7XG5cbihmdW5jdGlvbihVSSkge1xuXG4gICAgXCJ1c2Ugc3RyaWN0XCI7XG5cbiAgICB2YXIgYWN0aXZlID0gZmFsc2UsIGhvdmVySWRsZSwgZmxpcHMgPSB7XG4gICAgICAgIHg6IHtcbiAgICAgICAgICAgICdib3R0b20tbGVmdCcgICA6ICdib3R0b20tcmlnaHQnLFxuICAgICAgICAgICAgJ2JvdHRvbS1yaWdodCcgIDogJ2JvdHRvbS1sZWZ0JyxcbiAgICAgICAgICAgICdib3R0b20tY2VudGVyJyA6ICdib3R0b20tY2VudGVyJyxcbiAgICAgICAgICAgICd0b3AtbGVmdCcgICAgICA6ICd0b3AtcmlnaHQnLFxuICAgICAgICAgICAgJ3RvcC1yaWdodCcgICAgIDogJ3RvcC1sZWZ0JyxcbiAgICAgICAgICAgICd0b3AtY2VudGVyJyAgICA6ICd0b3AtY2VudGVyJyxcbiAgICAgICAgICAgICdsZWZ0LXRvcCcgICAgICA6ICdyaWdodC10b3AnLFxuICAgICAgICAgICAgJ2xlZnQtYm90dG9tJyAgIDogJ3JpZ2h0LWJvdHRvbScsXG4gICAgICAgICAgICAnbGVmdC1jZW50ZXInICAgOiAncmlnaHQtY2VudGVyJyxcbiAgICAgICAgICAgICdyaWdodC10b3AnICAgICA6ICdsZWZ0LXRvcCcsXG4gICAgICAgICAgICAncmlnaHQtYm90dG9tJyAgOiAnbGVmdC1ib3R0b20nLFxuICAgICAgICAgICAgJ3JpZ2h0LWNlbnRlcicgIDogJ2xlZnQtY2VudGVyJ1xuICAgICAgICB9LFxuICAgICAgICB5OiB7XG4gICAgICAgICAgICAnYm90dG9tLWxlZnQnICAgOiAndG9wLWxlZnQnLFxuICAgICAgICAgICAgJ2JvdHRvbS1yaWdodCcgIDogJ3RvcC1yaWdodCcsXG4gICAgICAgICAgICAnYm90dG9tLWNlbnRlcicgOiAndG9wLWNlbnRlcicsXG4gICAgICAgICAgICAndG9wLWxlZnQnICAgICAgOiAnYm90dG9tLWxlZnQnLFxuICAgICAgICAgICAgJ3RvcC1yaWdodCcgICAgIDogJ2JvdHRvbS1yaWdodCcsXG4gICAgICAgICAgICAndG9wLWNlbnRlcicgICAgOiAnYm90dG9tLWNlbnRlcicsXG4gICAgICAgICAgICAnbGVmdC10b3AnICAgICAgOiAnbGVmdC1ib3R0b20nLFxuICAgICAgICAgICAgJ2xlZnQtYm90dG9tJyAgIDogJ2xlZnQtdG9wJyxcbiAgICAgICAgICAgICdsZWZ0LWNlbnRlcicgICA6ICdsZWZ0LWNlbnRlcicsXG4gICAgICAgICAgICAncmlnaHQtdG9wJyAgICAgOiAncmlnaHQtYm90dG9tJyxcbiAgICAgICAgICAgICdyaWdodC1ib3R0b20nICA6ICdyaWdodC10b3AnLFxuICAgICAgICAgICAgJ3JpZ2h0LWNlbnRlcicgIDogJ3JpZ2h0LWNlbnRlcidcbiAgICAgICAgfSxcbiAgICAgICAgeHk6IHtcbiAgICAgICAgICAgICdib3R0b20tbGVmdCcgICA6ICd0b3AtcmlnaHQnLFxuICAgICAgICAgICAgJ2JvdHRvbS1yaWdodCcgIDogJ3RvcC1sZWZ0JyxcbiAgICAgICAgICAgICdib3R0b20tY2VudGVyJyA6ICd0b3AtY2VudGVyJyxcbiAgICAgICAgICAgICd0b3AtbGVmdCcgICAgICA6ICdib3R0b20tcmlnaHQnLFxuICAgICAgICAgICAgJ3RvcC1yaWdodCcgICAgIDogJ2JvdHRvbS1sZWZ0JyxcbiAgICAgICAgICAgICd0b3AtY2VudGVyJyAgICA6ICdib3R0b20tY2VudGVyJyxcbiAgICAgICAgICAgICdsZWZ0LXRvcCcgICAgICA6ICdyaWdodC1ib3R0b20nLFxuICAgICAgICAgICAgJ2xlZnQtYm90dG9tJyAgIDogJ3JpZ2h0LXRvcCcsXG4gICAgICAgICAgICAnbGVmdC1jZW50ZXInICAgOiAncmlnaHQtY2VudGVyJyxcbiAgICAgICAgICAgICdyaWdodC10b3AnICAgICA6ICdsZWZ0LWJvdHRvbScsXG4gICAgICAgICAgICAncmlnaHQtYm90dG9tJyAgOiAnbGVmdC10b3AnLFxuICAgICAgICAgICAgJ3JpZ2h0LWNlbnRlcicgIDogJ2xlZnQtY2VudGVyJ1xuICAgICAgICB9XG4gICAgfTtcblxuICAgIFVJLmNvbXBvbmVudCgnZHJvcGRvd24nLCB7XG5cbiAgICAgICAgZGVmYXVsdHM6IHtcbiAgICAgICAgICAgbW9kZSAgICAgICAgICAgIDogJ2hvdmVyJyxcbiAgICAgICAgICAgcG9zICAgICAgICAgICAgIDogJ2JvdHRvbS1sZWZ0JyxcbiAgICAgICAgICAgb2Zmc2V0ICAgICAgICAgIDogMCxcbiAgICAgICAgICAgcmVtYWludGltZSAgICAgIDogODAwLFxuICAgICAgICAgICBqdXN0aWZ5ICAgICAgICAgOiBmYWxzZSxcbiAgICAgICAgICAgYm91bmRhcnkgICAgICAgIDogVUkuJHdpbixcbiAgICAgICAgICAgZGVsYXkgICAgICAgICAgIDogMCxcbiAgICAgICAgICAgZHJvcGRvd25TZWxlY3RvcjogJy51ay1kcm9wZG93biwudWstZHJvcGRvd24tYmxhbmsnLFxuICAgICAgICAgICBob3ZlckRlbGF5SWRsZSAgOiAyNTAsXG4gICAgICAgICAgIHByZXZlbnRmbGlwICAgICA6IGZhbHNlXG4gICAgICAgIH0sXG5cbiAgICAgICAgcmVtYWluSWRsZTogZmFsc2UsXG5cbiAgICAgICAgYm9vdDogZnVuY3Rpb24oKSB7XG5cbiAgICAgICAgICAgIHZhciB0cmlnZ2VyZXZlbnQgPSBVSS5zdXBwb3J0LnRvdWNoID8gJ2NsaWNrJyA6ICdtb3VzZWVudGVyJztcblxuICAgICAgICAgICAgLy8gaW5pdCBjb2RlXG4gICAgICAgICAgICBVSS4kaHRtbC5vbih0cmlnZ2VyZXZlbnQrJy5kcm9wZG93bi51aWtpdCBmb2N1cyBwb2ludGVyZG93bicsICdbZGF0YS11ay1kcm9wZG93bl0nLCBmdW5jdGlvbihlKSB7XG5cbiAgICAgICAgICAgICAgICB2YXIgZWxlID0gVUkuJCh0aGlzKTtcblxuICAgICAgICAgICAgICAgIGlmICghZWxlLmRhdGEoJ2Ryb3Bkb3duJykpIHtcblxuICAgICAgICAgICAgICAgICAgICB2YXIgZHJvcGRvd24gPSBVSS5kcm9wZG93bihlbGUsIFVJLlV0aWxzLm9wdGlvbnMoZWxlLmF0dHIoJ2RhdGEtdWstZHJvcGRvd24nKSkpO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmIChlLnR5cGU9PSdjbGljaycgfHwgKGUudHlwZT09J21vdXNlZW50ZXInICYmIGRyb3Bkb3duLm9wdGlvbnMubW9kZT09J2hvdmVyJykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGRyb3Bkb3duLmVsZW1lbnQudHJpZ2dlcih0cmlnZ2VyZXZlbnQpO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKGRyb3Bkb3duLmRyb3Bkb3duLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgaW5pdDogZnVuY3Rpb24oKSB7XG5cbiAgICAgICAgICAgIHZhciAkdGhpcyA9IHRoaXM7XG5cbiAgICAgICAgICAgIHRoaXMuZHJvcGRvd24gICAgID0gdGhpcy5maW5kKHRoaXMub3B0aW9ucy5kcm9wZG93blNlbGVjdG9yKTtcbiAgICAgICAgICAgIHRoaXMub2Zmc2V0UGFyZW50ID0gdGhpcy5kcm9wZG93bi5wYXJlbnRzKCkuZmlsdGVyKGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiBVSS4kLmluQXJyYXkoVUkuJCh0aGlzKS5jc3MoJ3Bvc2l0aW9uJyksIFsncmVsYXRpdmUnLCAnZml4ZWQnLCAnYWJzb2x1dGUnXSkgIT09IC0xO1xuICAgICAgICAgICAgfSkuc2xpY2UoMCwxKTtcblxuICAgICAgICAgICAgaWYgKCF0aGlzLm9mZnNldFBhcmVudC5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICB0aGlzLm9mZnNldFBhcmVudCA9IHRoaXMuZWxlbWVudDtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5jZW50ZXJlZCAgPSB0aGlzLmRyb3Bkb3duLmhhc0NsYXNzKCd1ay1kcm9wZG93bi1jZW50ZXInKTtcbiAgICAgICAgICAgIHRoaXMuanVzdGlmaWVkID0gdGhpcy5vcHRpb25zLmp1c3RpZnkgPyBVSS4kKHRoaXMub3B0aW9ucy5qdXN0aWZ5KSA6IGZhbHNlO1xuXG4gICAgICAgICAgICB0aGlzLmJvdW5kYXJ5ICA9IFVJLiQodGhpcy5vcHRpb25zLmJvdW5kYXJ5KTtcblxuICAgICAgICAgICAgaWYgKCF0aGlzLmJvdW5kYXJ5Lmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIHRoaXMuYm91bmRhcnkgPSBVSS4kd2luO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAvLyBsZWdhY3kgREVQUkVDQVRFRCFcbiAgICAgICAgICAgIGlmICh0aGlzLmRyb3Bkb3duLmhhc0NsYXNzKCd1ay1kcm9wZG93bi11cCcpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLnBvcyA9ICd0b3AtbGVmdCc7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodGhpcy5kcm9wZG93bi5oYXNDbGFzcygndWstZHJvcGRvd24tZmxpcCcpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLnBvcyA9IHRoaXMub3B0aW9ucy5wb3MucmVwbGFjZSgnbGVmdCcsJ3JpZ2h0Jyk7XG4gICAgICAgICAgICB9XG4gICAgICAgICAgICBpZiAodGhpcy5kcm9wZG93bi5oYXNDbGFzcygndWstZHJvcGRvd24tY2VudGVyJykpIHtcbiAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMucG9zID0gdGhpcy5vcHRpb25zLnBvcy5yZXBsYWNlKC8obGVmdHxyaWdodCkvLCdjZW50ZXInKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIC8vLS0gZW5kIGxlZ2FjeVxuXG4gICAgICAgICAgICAvLyBJbml0IEFSSUFcbiAgICAgICAgICAgIHRoaXMuZWxlbWVudC5hdHRyKCdhcmlhLWhhc3BvcHVwJywgJ3RydWUnKTtcbiAgICAgICAgICAgIHRoaXMuZWxlbWVudC5hdHRyKCdhcmlhLWV4cGFuZGVkJywgdGhpcy5lbGVtZW50Lmhhc0NsYXNzKCd1ay1vcGVuJykpO1xuICAgICAgICAgICAgdGhpcy5kcm9wZG93bi5hdHRyKCdhcmlhLWhpZGRlbicsICd0cnVlJyk7XG5cbiAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMubW9kZSA9PSAnY2xpY2snIHx8IFVJLnN1cHBvcnQudG91Y2gpIHtcblxuICAgICAgICAgICAgICAgIHRoaXMub24oJ2NsaWNrLnVrLmRyb3Bkb3duJywgZnVuY3Rpb24oZSkge1xuXG4gICAgICAgICAgICAgICAgICAgIHZhciAkdGFyZ2V0ID0gVUkuJChlLnRhcmdldCk7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKCEkdGFyZ2V0LnBhcmVudHMoJHRoaXMub3B0aW9ucy5kcm9wZG93blNlbGVjdG9yKS5sZW5ndGgpIHtcblxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCR0YXJnZXQuaXMoXCJhW2hyZWY9JyMnXVwiKSB8fCAkdGFyZ2V0LnBhcmVudCgpLmlzKFwiYVtocmVmPScjJ11cIikgfHwgKCR0aGlzLmRyb3Bkb3duLmxlbmd0aCAmJiAhJHRoaXMuZHJvcGRvd24uaXMoJzp2aXNpYmxlJykpICl7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICAgICAkdGFyZ2V0LmJsdXIoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGlmICghJHRoaXMuZWxlbWVudC5oYXNDbGFzcygndWstb3BlbicpKSB7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLnNob3coKTtcblxuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoISR0aGlzLmRyb3Bkb3duLmZpbmQoZS50YXJnZXQpLmxlbmd0aCB8fCAkdGFyZ2V0LmlzKCcudWstZHJvcGRvd24tY2xvc2UnKSB8fCAkdGFyZ2V0LnBhcmVudHMoJy51ay1kcm9wZG93bi1jbG9zZScpLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLmhpZGUoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICB9IGVsc2Uge1xuXG4gICAgICAgICAgICAgICAgdGhpcy5vbignbW91c2VlbnRlcicsIGZ1bmN0aW9uKGUpIHtcblxuICAgICAgICAgICAgICAgICAgICAkdGhpcy50cmlnZ2VyKCdwb2ludGVyZW50ZXIudWsuZHJvcGRvd24nLCBbJHRoaXNdKTtcblxuICAgICAgICAgICAgICAgICAgICBpZiAoJHRoaXMucmVtYWluSWRsZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KCR0aGlzLnJlbWFpbklkbGUpO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKGhvdmVySWRsZSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY2xlYXJUaW1lb3V0KGhvdmVySWRsZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICBpZiAoYWN0aXZlICYmIGFjdGl2ZSA9PSAkdGhpcykge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gcHNldWRvIG1hbnVBaW1cbiAgICAgICAgICAgICAgICAgICAgaWYgKGFjdGl2ZSAmJiBhY3RpdmUgIT0gJHRoaXMpIHtcblxuICAgICAgICAgICAgICAgICAgICAgICAgaG92ZXJJZGxlID0gc2V0VGltZW91dChmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBob3ZlcklkbGUgPSBzZXRUaW1lb3V0KCR0aGlzLnNob3cuYmluZCgkdGhpcyksICR0aGlzLm9wdGlvbnMuZGVsYXkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSwgJHRoaXMub3B0aW9ucy5ob3ZlckRlbGF5SWRsZSk7XG5cbiAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHtcblxuICAgICAgICAgICAgICAgICAgICAgICAgaG92ZXJJZGxlID0gc2V0VGltZW91dCgkdGhpcy5zaG93LmJpbmQoJHRoaXMpLCAkdGhpcy5vcHRpb25zLmRlbGF5KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgfSkub24oJ21vdXNlbGVhdmUnLCBmdW5jdGlvbigpIHtcblxuICAgICAgICAgICAgICAgICAgICBpZiAoaG92ZXJJZGxlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQoaG92ZXJJZGxlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICR0aGlzLnJlbWFpbklkbGUgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGFjdGl2ZSAmJiBhY3RpdmUgPT0gJHRoaXMpICR0aGlzLmhpZGUoKTtcbiAgICAgICAgICAgICAgICAgICAgfSwgJHRoaXMub3B0aW9ucy5yZW1haW50aW1lKTtcblxuICAgICAgICAgICAgICAgICAgICAkdGhpcy50cmlnZ2VyKCdwb2ludGVybGVhdmUudWsuZHJvcGRvd24nLCBbJHRoaXNdKTtcblxuICAgICAgICAgICAgICAgIH0pLm9uKCdjbGljaycsIGZ1bmN0aW9uKGUpe1xuXG4gICAgICAgICAgICAgICAgICAgIHZhciAkdGFyZ2V0ID0gVUkuJChlLnRhcmdldCk7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKCR0aGlzLnJlbWFpbklkbGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dCgkdGhpcy5yZW1haW5JZGxlKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGlmIChhY3RpdmUgJiYgYWN0aXZlID09ICR0aGlzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoISR0aGlzLmRyb3Bkb3duLmZpbmQoZS50YXJnZXQpLmxlbmd0aCB8fCAkdGFyZ2V0LmlzKCcudWstZHJvcGRvd24tY2xvc2UnKSB8fCAkdGFyZ2V0LnBhcmVudHMoJy51ay1kcm9wZG93bi1jbG9zZScpLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLmhpZGUoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGlmICgkdGFyZ2V0LmlzKFwiYVtocmVmPScjJ11cIikgfHwgJHRhcmdldC5wYXJlbnQoKS5pcyhcImFbaHJlZj0nIyddXCIpKXtcbiAgICAgICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgICR0aGlzLnNob3coKTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSxcblxuICAgICAgICBzaG93OiBmdW5jdGlvbigpe1xuXG4gICAgICAgICAgICBVSS4kaHRtbC5vZmYoJ2NsaWNrLm91dGVyLmRyb3Bkb3duJyk7XG5cbiAgICAgICAgICAgIGlmIChhY3RpdmUgJiYgYWN0aXZlICE9IHRoaXMpIHtcbiAgICAgICAgICAgICAgICBhY3RpdmUuaGlkZSh0cnVlKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGhvdmVySWRsZSkge1xuICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dChob3ZlcklkbGUpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLnRyaWdnZXIoJ2JlZm9yZXNob3cudWsuZHJvcGRvd24nLCBbdGhpc10pO1xuXG4gICAgICAgICAgICB0aGlzLmNoZWNrRGltZW5zaW9ucygpO1xuICAgICAgICAgICAgdGhpcy5lbGVtZW50LmFkZENsYXNzKCd1ay1vcGVuJyk7XG5cbiAgICAgICAgICAgIC8vIFVwZGF0ZSBBUklBXG4gICAgICAgICAgICB0aGlzLmVsZW1lbnQuYXR0cignYXJpYS1leHBhbmRlZCcsICd0cnVlJyk7XG4gICAgICAgICAgICB0aGlzLmRyb3Bkb3duLmF0dHIoJ2FyaWEtaGlkZGVuJywgJ2ZhbHNlJyk7XG5cbiAgICAgICAgICAgIHRoaXMudHJpZ2dlcignc2hvdy51ay5kcm9wZG93bicsIFt0aGlzXSk7XG5cbiAgICAgICAgICAgIFVJLlV0aWxzLmNoZWNrRGlzcGxheSh0aGlzLmRyb3Bkb3duLCB0cnVlKTtcbiAgICAgICAgICAgIFVJLlV0aWxzLmZvY3VzKHRoaXMuZHJvcGRvd24pO1xuICAgICAgICAgICAgYWN0aXZlID0gdGhpcztcblxuICAgICAgICAgICAgdGhpcy5yZWdpc3Rlck91dGVyQ2xpY2soKTtcbiAgICAgICAgfSxcblxuICAgICAgICBoaWRlOiBmdW5jdGlvbihmb3JjZSkge1xuXG4gICAgICAgICAgICB0aGlzLnRyaWdnZXIoJ2JlZm9yZWhpZGUudWsuZHJvcGRvd24nLCBbdGhpcywgZm9yY2VdKTtcblxuICAgICAgICAgICAgdGhpcy5lbGVtZW50LnJlbW92ZUNsYXNzKCd1ay1vcGVuJyk7XG5cbiAgICAgICAgICAgIGlmICh0aGlzLnJlbWFpbklkbGUpIHtcbiAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQodGhpcy5yZW1haW5JZGxlKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5yZW1haW5JZGxlID0gZmFsc2U7XG5cbiAgICAgICAgICAgIC8vIFVwZGF0ZSBBUklBXG4gICAgICAgICAgICB0aGlzLmVsZW1lbnQuYXR0cignYXJpYS1leHBhbmRlZCcsICdmYWxzZScpO1xuICAgICAgICAgICAgdGhpcy5kcm9wZG93bi5hdHRyKCdhcmlhLWhpZGRlbicsICd0cnVlJyk7XG5cbiAgICAgICAgICAgIHRoaXMudHJpZ2dlcignaGlkZS51ay5kcm9wZG93bicsIFt0aGlzLCBmb3JjZV0pO1xuXG4gICAgICAgICAgICBpZiAoYWN0aXZlID09IHRoaXMpIGFjdGl2ZSA9IGZhbHNlO1xuICAgICAgICB9LFxuXG4gICAgICAgIHJlZ2lzdGVyT3V0ZXJDbGljazogZnVuY3Rpb24oKXtcblxuICAgICAgICAgICAgdmFyICR0aGlzID0gdGhpcztcblxuICAgICAgICAgICAgVUkuJGh0bWwub2ZmKCdjbGljay5vdXRlci5kcm9wZG93bicpO1xuXG4gICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkge1xuXG4gICAgICAgICAgICAgICAgVUkuJGh0bWwub24oJ2NsaWNrLm91dGVyLmRyb3Bkb3duJywgZnVuY3Rpb24oZSkge1xuXG4gICAgICAgICAgICAgICAgICAgIGlmIChob3ZlcklkbGUpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dChob3ZlcklkbGUpO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgdmFyICR0YXJnZXQgPSBVSS4kKGUudGFyZ2V0KTtcblxuICAgICAgICAgICAgICAgICAgICBpZiAoYWN0aXZlID09ICR0aGlzICYmICEkdGhpcy5lbGVtZW50LmZpbmQoZS50YXJnZXQpLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMuaGlkZSh0cnVlKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIFVJLiRodG1sLm9mZignY2xpY2sub3V0ZXIuZHJvcGRvd24nKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSwgMTApO1xuICAgICAgICB9LFxuXG4gICAgICAgIGNoZWNrRGltZW5zaW9uczogZnVuY3Rpb24oKSB7XG5cbiAgICAgICAgICAgIGlmICghdGhpcy5kcm9wZG93bi5sZW5ndGgpIHJldHVybjtcblxuICAgICAgICAgICAgLy8gcmVzZXRcbiAgICAgICAgICAgIHRoaXMuZHJvcGRvd24ucmVtb3ZlQ2xhc3MoJ3VrLWRyb3Bkb3duLXRvcCB1ay1kcm9wZG93bi1ib3R0b20gdWstZHJvcGRvd24tbGVmdCB1ay1kcm9wZG93bi1yaWdodCB1ay1kcm9wZG93bi1zdGFjayB1ay1kcm9wZG93bi1hdXRvZmxpcCcpLmNzcyh7XG4gICAgICAgICAgICAgICAgdG9wTGVmdCA6JycsXG4gICAgICAgICAgICAgICAgbGVmdCA6JycsXG4gICAgICAgICAgICAgICAgbWFyZ2luTGVmdCA6JycsXG4gICAgICAgICAgICAgICAgbWFyZ2luUmlnaHQgOicnXG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgaWYgKHRoaXMuanVzdGlmaWVkICYmIHRoaXMuanVzdGlmaWVkLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIHRoaXMuZHJvcGRvd24uY3NzKCdtaW4td2lkdGgnLCAnJyk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHZhciAkdGhpcyAgICAgICAgICA9IHRoaXMsXG4gICAgICAgICAgICAgICAgcG9zICAgICAgICAgICAgPSBVSS4kLmV4dGVuZCh7fSwgdGhpcy5vZmZzZXRQYXJlbnQub2Zmc2V0KCksIHt3aWR0aDogdGhpcy5vZmZzZXRQYXJlbnRbMF0ub2Zmc2V0V2lkdGgsIGhlaWdodDogdGhpcy5vZmZzZXRQYXJlbnRbMF0ub2Zmc2V0SGVpZ2h0fSksXG4gICAgICAgICAgICAgICAgcG9zb2Zmc2V0ICAgICAgPSB0aGlzLm9wdGlvbnMub2Zmc2V0LFxuICAgICAgICAgICAgICAgIGRyb3Bkb3duICAgICAgID0gdGhpcy5kcm9wZG93bixcbiAgICAgICAgICAgICAgICBvZmZzZXQgICAgICAgICA9IGRyb3Bkb3duLnNob3coKS5vZmZzZXQoKSB8fCB7bGVmdDogMCwgdG9wOiAwfSxcbiAgICAgICAgICAgICAgICB3aWR0aCAgICAgICAgICA9IGRyb3Bkb3duLm91dGVyV2lkdGgoKSxcbiAgICAgICAgICAgICAgICBoZWlnaHQgICAgICAgICA9IGRyb3Bkb3duLm91dGVySGVpZ2h0KCksXG4gICAgICAgICAgICAgICAgYm91bmRhcnl3aWR0aCAgPSB0aGlzLmJvdW5kYXJ5LndpZHRoKCksXG4gICAgICAgICAgICAgICAgYm91bmRhcnlvZmZzZXQgPSB0aGlzLmJvdW5kYXJ5WzBdICE9PSB3aW5kb3cgJiYgdGhpcy5ib3VuZGFyeS5vZmZzZXQoKSA/IHRoaXMuYm91bmRhcnkub2Zmc2V0KCk6IHt0b3A6MCwgbGVmdDowfSxcbiAgICAgICAgICAgICAgICBkcG9zICAgICAgICAgICA9IHRoaXMub3B0aW9ucy5wb3M7XG5cbiAgICAgICAgICAgIHZhciB2YXJpYW50cyA9ICB7XG4gICAgICAgICAgICAgICAgICAgICdib3R0b20tbGVmdCcgICA6IHt0b3A6IDAgKyBwb3MuaGVpZ2h0ICsgcG9zb2Zmc2V0LCBsZWZ0OiAwfSxcbiAgICAgICAgICAgICAgICAgICAgJ2JvdHRvbS1yaWdodCcgIDoge3RvcDogMCArIHBvcy5oZWlnaHQgKyBwb3NvZmZzZXQsIGxlZnQ6IDAgKyBwb3Mud2lkdGggLSB3aWR0aH0sXG4gICAgICAgICAgICAgICAgICAgICdib3R0b20tY2VudGVyJyA6IHt0b3A6IDAgKyBwb3MuaGVpZ2h0ICsgcG9zb2Zmc2V0LCBsZWZ0OiAwICsgcG9zLndpZHRoIC8gMiAtIHdpZHRoIC8gMn0sXG4gICAgICAgICAgICAgICAgICAgICd0b3AtbGVmdCcgICAgICA6IHt0b3A6IDAgLSBoZWlnaHQgLSBwb3NvZmZzZXQsIGxlZnQ6IDB9LFxuICAgICAgICAgICAgICAgICAgICAndG9wLXJpZ2h0JyAgICAgOiB7dG9wOiAwIC0gaGVpZ2h0IC0gcG9zb2Zmc2V0LCBsZWZ0OiAwICsgcG9zLndpZHRoIC0gd2lkdGh9LFxuICAgICAgICAgICAgICAgICAgICAndG9wLWNlbnRlcicgICAgOiB7dG9wOiAwIC0gaGVpZ2h0IC0gcG9zb2Zmc2V0LCBsZWZ0OiAwICsgcG9zLndpZHRoIC8gMiAtIHdpZHRoIC8gMn0sXG4gICAgICAgICAgICAgICAgICAgICdsZWZ0LXRvcCcgICAgICA6IHt0b3A6IDAsIGxlZnQ6IDAgLSB3aWR0aCAtIHBvc29mZnNldH0sXG4gICAgICAgICAgICAgICAgICAgICdsZWZ0LWJvdHRvbScgICA6IHt0b3A6IDAgKyBwb3MuaGVpZ2h0IC0gaGVpZ2h0LCBsZWZ0OiAwIC0gd2lkdGggLSBwb3NvZmZzZXR9LFxuICAgICAgICAgICAgICAgICAgICAnbGVmdC1jZW50ZXInICAgOiB7dG9wOiAwICsgcG9zLmhlaWdodCAvIDIgLSBoZWlnaHQgLyAyLCBsZWZ0OiAwIC0gd2lkdGggLSBwb3NvZmZzZXR9LFxuICAgICAgICAgICAgICAgICAgICAncmlnaHQtdG9wJyAgICAgOiB7dG9wOiAwLCBsZWZ0OiAwICsgcG9zLndpZHRoICsgcG9zb2Zmc2V0fSxcbiAgICAgICAgICAgICAgICAgICAgJ3JpZ2h0LWJvdHRvbScgIDoge3RvcDogMCArIHBvcy5oZWlnaHQgLSBoZWlnaHQsIGxlZnQ6IDAgKyBwb3Mud2lkdGggKyBwb3NvZmZzZXR9LFxuICAgICAgICAgICAgICAgICAgICAncmlnaHQtY2VudGVyJyAgOiB7dG9wOiAwICsgcG9zLmhlaWdodCAvIDIgLSBoZWlnaHQgLyAyLCBsZWZ0OiAwICsgcG9zLndpZHRoICsgcG9zb2Zmc2V0fVxuICAgICAgICAgICAgICAgIH0sXG4gICAgICAgICAgICAgICAgY3NzID0ge30sXG4gICAgICAgICAgICAgICAgcHA7XG5cbiAgICAgICAgICAgIHBwID0gZHBvcy5zcGxpdCgnLScpO1xuICAgICAgICAgICAgY3NzID0gdmFyaWFudHNbZHBvc10gPyB2YXJpYW50c1tkcG9zXSA6IHZhcmlhbnRzWydib3R0b20tbGVmdCddO1xuXG4gICAgICAgICAgICAvLyBqdXN0aWZ5IGRyb3Bkb3duXG4gICAgICAgICAgICBpZiAodGhpcy5qdXN0aWZpZWQgJiYgdGhpcy5qdXN0aWZpZWQubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAganVzdGlmeShkcm9wZG93bi5jc3Moe2xlZnQ6MH0pLCB0aGlzLmp1c3RpZmllZCwgYm91bmRhcnl3aWR0aCk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuXG4gICAgICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5wcmV2ZW50ZmxpcCAhPT0gdHJ1ZSkge1xuXG4gICAgICAgICAgICAgICAgICAgIHZhciBmZHBvcztcblxuICAgICAgICAgICAgICAgICAgICBzd2l0Y2godGhpcy5jaGVja0JvdW5kYXJ5KHBvcy5sZWZ0ICsgY3NzLmxlZnQsIHBvcy50b3AgKyBjc3MudG9wLCB3aWR0aCwgaGVpZ2h0LCBib3VuZGFyeXdpZHRoKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBcInhcIjpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZih0aGlzLm9wdGlvbnMucHJldmVudGZsaXAgIT09J3gnKSBmZHBvcyA9IGZsaXBzWyd4J11bZHBvc10gfHwgJ3JpZ2h0LXRvcCc7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFwieVwiOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHRoaXMub3B0aW9ucy5wcmV2ZW50ZmxpcCAhPT0neScpIGZkcG9zID0gZmxpcHNbJ3knXVtkcG9zXSB8fCAndG9wLWxlZnQnO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBcInh5XCI6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoIXRoaXMub3B0aW9ucy5wcmV2ZW50ZmxpcCkgZmRwb3MgPSBmbGlwc1sneHknXVtkcG9zXSB8fCAncmlnaHQtYm90dG9tJztcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGlmIChmZHBvcykge1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBwcCAgPSBmZHBvcy5zcGxpdCgnLScpO1xuICAgICAgICAgICAgICAgICAgICAgICAgY3NzID0gdmFyaWFudHNbZmRwb3NdID8gdmFyaWFudHNbZmRwb3NdIDogdmFyaWFudHNbJ2JvdHRvbS1sZWZ0J107XG4gICAgICAgICAgICAgICAgICAgICAgICBkcm9wZG93bi5hZGRDbGFzcygndWstZHJvcGRvd24tYXV0b2ZsaXAnKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgLy8gY2hlY2sgZmxpcHBlZFxuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRoaXMuY2hlY2tCb3VuZGFyeShwb3MubGVmdCArIGNzcy5sZWZ0LCBwb3MudG9wICsgY3NzLnRvcCwgd2lkdGgsIGhlaWdodCwgYm91bmRhcnl3aWR0aCkpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcCAgPSBkcG9zLnNwbGl0KCctJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY3NzID0gdmFyaWFudHNbZHBvc10gPyB2YXJpYW50c1tkcG9zXSA6IHZhcmlhbnRzWydib3R0b20tbGVmdCddO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAod2lkdGggPiBib3VuZGFyeXdpZHRoKSB7XG4gICAgICAgICAgICAgICAgZHJvcGRvd24uYWRkQ2xhc3MoJ3VrLWRyb3Bkb3duLXN0YWNrJyk7XG4gICAgICAgICAgICAgICAgdGhpcy50cmlnZ2VyKCdzdGFjay51ay5kcm9wZG93bicsIFt0aGlzXSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGRyb3Bkb3duLmNzcyhjc3MpLmNzcygnZGlzcGxheScsICcnKS5hZGRDbGFzcygndWstZHJvcGRvd24tJytwcFswXSk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgY2hlY2tCb3VuZGFyeTogZnVuY3Rpb24obGVmdCwgdG9wLCB3aWR0aCwgaGVpZ2h0LCBib3VuZGFyeXdpZHRoKSB7XG5cbiAgICAgICAgICAgIHZhciBheGlzID0gXCJcIjtcblxuICAgICAgICAgICAgaWYgKGxlZnQgPCAwIHx8ICgobGVmdCAtIFVJLiR3aW4uc2Nyb2xsTGVmdCgpKSt3aWR0aCkgPiBib3VuZGFyeXdpZHRoKSB7XG4gICAgICAgICAgICAgICBheGlzICs9IFwieFwiO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAoKHRvcCAtIFVJLiR3aW4uc2Nyb2xsVG9wKCkpIDwgMCB8fCAoKHRvcCAtIFVJLiR3aW4uc2Nyb2xsVG9wKCkpK2hlaWdodCkgPiB3aW5kb3cuaW5uZXJIZWlnaHQpIHtcbiAgICAgICAgICAgICAgIGF4aXMgKz0gXCJ5XCI7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHJldHVybiBheGlzO1xuICAgICAgICB9XG4gICAgfSk7XG5cblxuICAgIFVJLmNvbXBvbmVudCgnZHJvcGRvd25PdmVybGF5Jywge1xuXG4gICAgICAgIGRlZmF1bHRzOiB7XG4gICAgICAgICAgIGp1c3RpZnkgOiBmYWxzZSxcbiAgICAgICAgICAgY2xzICAgICA6ICcnLFxuICAgICAgICAgICBkdXJhdGlvbjogMjAwXG4gICAgICAgIH0sXG5cbiAgICAgICAgYm9vdDogZnVuY3Rpb24oKSB7XG5cbiAgICAgICAgICAgIC8vIGluaXQgY29kZVxuICAgICAgICAgICAgVUkucmVhZHkoZnVuY3Rpb24oY29udGV4dCkge1xuXG4gICAgICAgICAgICAgICAgVUkuJCgnW2RhdGEtdWstZHJvcGRvd24tb3ZlcmxheV0nLCBjb250ZXh0KS5lYWNoKGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgZWxlID0gVUkuJCh0aGlzKTtcblxuICAgICAgICAgICAgICAgICAgICBpZiAoIWVsZS5kYXRhKCdkcm9wZG93bk92ZXJsYXknKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgVUkuZHJvcGRvd25PdmVybGF5KGVsZSwgVUkuVXRpbHMub3B0aW9ucyhlbGUuYXR0cignZGF0YS11ay1kcm9wZG93bi1vdmVybGF5JykpKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgaW5pdDogZnVuY3Rpb24oKSB7XG5cbiAgICAgICAgICAgIHZhciAkdGhpcyA9IHRoaXM7XG5cbiAgICAgICAgICAgIHRoaXMuanVzdGlmaWVkID0gdGhpcy5vcHRpb25zLmp1c3RpZnkgPyBVSS4kKHRoaXMub3B0aW9ucy5qdXN0aWZ5KSA6IGZhbHNlO1xuICAgICAgICAgICAgdGhpcy5vdmVybGF5ICAgPSB0aGlzLmVsZW1lbnQuZmluZCgndWstZHJvcGRvd24tb3ZlcmxheScpO1xuXG4gICAgICAgICAgICBpZiAoIXRoaXMub3ZlcmxheS5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICB0aGlzLm92ZXJsYXkgPSBVSS4kKCc8ZGl2IGNsYXNzPVwidWstZHJvcGRvd24tb3ZlcmxheVwiPjwvZGl2PicpLmFwcGVuZFRvKHRoaXMuZWxlbWVudCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMub3ZlcmxheS5hZGRDbGFzcyh0aGlzLm9wdGlvbnMuY2xzKTtcblxuICAgICAgICAgICAgdGhpcy5vbih7XG5cbiAgICAgICAgICAgICAgICAnYmVmb3Jlc2hvdy51ay5kcm9wZG93bic6IGZ1bmN0aW9uKGUsIGRyb3Bkb3duKSB7XG4gICAgICAgICAgICAgICAgICAgICR0aGlzLmRyb3Bkb3duID0gZHJvcGRvd247XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKCR0aGlzLmp1c3RpZmllZCAmJiAkdGhpcy5qdXN0aWZpZWQubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBqdXN0aWZ5KCR0aGlzLm92ZXJsYXkuY3NzKHtkaXNwbGF5OidibG9jaycsIG1hcmdpbkxlZnQ6JycsIG1hcmdpblJpZ2h0OicnfSksICR0aGlzLmp1c3RpZmllZCwgJHRoaXMuanVzdGlmaWVkLm91dGVyV2lkdGgoKSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICAgICAgJ3Nob3cudWsuZHJvcGRvd24nOiBmdW5jdGlvbihlLCBkcm9wZG93bikge1xuXG4gICAgICAgICAgICAgICAgICAgIHZhciBoID0gJHRoaXMuZHJvcGRvd24uZHJvcGRvd24ub3V0ZXJIZWlnaHQodHJ1ZSk7XG5cbiAgICAgICAgICAgICAgICAgICAgJHRoaXMuZHJvcGRvd24uZWxlbWVudC5yZW1vdmVDbGFzcygndWstb3BlbicpO1xuXG4gICAgICAgICAgICAgICAgICAgICR0aGlzLm92ZXJsYXkuc3RvcCgpLmNzcygnZGlzcGxheScsICdibG9jaycpLmFuaW1hdGUoe2hlaWdodDogaH0sICR0aGlzLm9wdGlvbnMuZHVyYXRpb24sIGZ1bmN0aW9uKCkge1xuXG4gICAgICAgICAgICAgICAgICAgICAgICR0aGlzLmRyb3Bkb3duLmRyb3Bkb3duLmNzcygndmlzaWJpbGl0eScsICcnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgJHRoaXMuZHJvcGRvd24uZWxlbWVudC5hZGRDbGFzcygndWstb3BlbicpO1xuXG4gICAgICAgICAgICAgICAgICAgICAgIFVJLlV0aWxzLmNoZWNrRGlzcGxheSgkdGhpcy5kcm9wZG93bi5kcm9wZG93biwgdHJ1ZSk7XG4gICAgICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgICAgICR0aGlzLnBvaW50ZXJsZWF2ZSA9IGZhbHNlO1xuICAgICAgICAgICAgICAgIH0sXG5cbiAgICAgICAgICAgICAgICAnaGlkZS51ay5kcm9wZG93bic6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICAkdGhpcy5vdmVybGF5LnN0b3AoKS5hbmltYXRlKHtoZWlnaHQ6IDB9LCAkdGhpcy5vcHRpb25zLmR1cmF0aW9uKTtcbiAgICAgICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICAgICAgJ3BvaW50ZXJlbnRlci51ay5kcm9wZG93bic6IGZ1bmN0aW9uKGUsIGRyb3Bkb3duKSB7XG4gICAgICAgICAgICAgICAgICAgIGNsZWFyVGltZW91dCgkdGhpcy5yZW1haW5JZGxlKTtcbiAgICAgICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICAgICAgJ3BvaW50ZXJsZWF2ZS51ay5kcm9wZG93bic6IGZ1bmN0aW9uKGUsIGRyb3Bkb3duKSB7XG4gICAgICAgICAgICAgICAgICAgICR0aGlzLnBvaW50ZXJsZWF2ZSA9IHRydWU7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG5cblxuICAgICAgICAgICAgdGhpcy5vdmVybGF5Lm9uKHtcblxuICAgICAgICAgICAgICAgICdtb3VzZWVudGVyJzogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICgkdGhpcy5yZW1haW5JZGxlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQoJHRoaXMuZHJvcGRvd24ucmVtYWluSWRsZSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBjbGVhclRpbWVvdXQoJHRoaXMucmVtYWluSWRsZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9LFxuXG4gICAgICAgICAgICAgICAgJ21vdXNlbGVhdmUnOiBmdW5jdGlvbigpe1xuXG4gICAgICAgICAgICAgICAgICAgIGlmICgkdGhpcy5wb2ludGVybGVhdmUgJiYgYWN0aXZlKSB7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLnJlbWFpbklkbGUgPSBzZXRUaW1lb3V0KGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoYWN0aXZlKSBhY3RpdmUuaGlkZSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSwgYWN0aXZlLm9wdGlvbnMucmVtYWludGltZSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KVxuICAgICAgICB9XG5cbiAgICB9KTtcblxuXG4gICAgZnVuY3Rpb24ganVzdGlmeShlbGUsIGp1c3RpZnlUbywgYm91bmRhcnl3aWR0aCwgb2Zmc2V0KSB7XG5cbiAgICAgICAgZWxlICAgICAgICAgICA9IFVJLiQoZWxlKTtcbiAgICAgICAganVzdGlmeVRvICAgICA9IFVJLiQoanVzdGlmeVRvKTtcbiAgICAgICAgYm91bmRhcnl3aWR0aCA9IGJvdW5kYXJ5d2lkdGggfHwgd2luZG93LmlubmVyV2lkdGg7XG4gICAgICAgIG9mZnNldCAgICAgICAgPSBvZmZzZXQgfHwgZWxlLm9mZnNldCgpO1xuXG4gICAgICAgIGlmIChqdXN0aWZ5VG8ubGVuZ3RoKSB7XG5cbiAgICAgICAgICAgIHZhciBqd2lkdGggPSBqdXN0aWZ5VG8ub3V0ZXJXaWR0aCgpO1xuXG4gICAgICAgICAgICBlbGUuY3NzKCdtaW4td2lkdGgnLCBqd2lkdGgpO1xuXG4gICAgICAgICAgICBpZiAoVUkubGFuZ2RpcmVjdGlvbiA9PSAncmlnaHQnKSB7XG5cbiAgICAgICAgICAgICAgICB2YXIgcmlnaHQxICAgPSBib3VuZGFyeXdpZHRoIC0gKGp1c3RpZnlUby5vZmZzZXQoKS5sZWZ0ICsgandpZHRoKSxcbiAgICAgICAgICAgICAgICAgICAgcmlnaHQyICAgPSBib3VuZGFyeXdpZHRoIC0gKGVsZS5vZmZzZXQoKS5sZWZ0ICsgZWxlLm91dGVyV2lkdGgoKSk7XG5cbiAgICAgICAgICAgICAgICBlbGUuY3NzKCdtYXJnaW4tcmlnaHQnLCByaWdodDEgLSByaWdodDIpO1xuXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGVsZS5jc3MoJ21hcmdpbi1sZWZ0JywganVzdGlmeVRvLm9mZnNldCgpLmxlZnQgLSBvZmZzZXQubGVmdCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICB9XG5cbn0pKFVJa2l0Mik7XG5cbihmdW5jdGlvbihVSSkge1xuXG4gICAgXCJ1c2Ugc3RyaWN0XCI7XG5cbiAgICB2YXIgZ3JpZHMgPSBbXTtcblxuICAgIFVJLmNvbXBvbmVudCgnZ3JpZE1hdGNoSGVpZ2h0Jywge1xuXG4gICAgICAgIGRlZmF1bHRzOiB7XG4gICAgICAgICAgICB0YXJnZXQgICAgICAgIDogZmFsc2UsXG4gICAgICAgICAgICByb3cgICAgICAgICAgIDogdHJ1ZSxcbiAgICAgICAgICAgIGlnbm9yZXN0YWNrZWQgOiBmYWxzZSxcbiAgICAgICAgICAgIG9ic2VydmUgICAgICAgOiBmYWxzZVxuICAgICAgICB9LFxuXG4gICAgICAgIGJvb3Q6IGZ1bmN0aW9uKCkge1xuXG4gICAgICAgICAgICAvLyBpbml0IGNvZGVcbiAgICAgICAgICAgIFVJLnJlYWR5KGZ1bmN0aW9uKGNvbnRleHQpIHtcblxuICAgICAgICAgICAgICAgIFVJLiQoJ1tkYXRhLXVrLWdyaWQtbWF0Y2hdJywgY29udGV4dCkuZWFjaChmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIGdyaWQgPSBVSS4kKHRoaXMpLCBvYmo7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKCFncmlkLmRhdGEoJ2dyaWRNYXRjaEhlaWdodCcpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBvYmogPSBVSS5ncmlkTWF0Y2hIZWlnaHQoZ3JpZCwgVUkuVXRpbHMub3B0aW9ucyhncmlkLmF0dHIoJ2RhdGEtdWstZ3JpZC1tYXRjaCcpKSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9LFxuXG4gICAgICAgIGluaXQ6IGZ1bmN0aW9uKCkge1xuXG4gICAgICAgICAgICB2YXIgJHRoaXMgPSB0aGlzO1xuXG4gICAgICAgICAgICB0aGlzLmNvbHVtbnMgID0gdGhpcy5lbGVtZW50LmNoaWxkcmVuKCk7XG4gICAgICAgICAgICB0aGlzLmVsZW1lbnRzID0gdGhpcy5vcHRpb25zLnRhcmdldCA/IHRoaXMuZmluZCh0aGlzLm9wdGlvbnMudGFyZ2V0KSA6IHRoaXMuY29sdW1ucztcblxuICAgICAgICAgICAgaWYgKCF0aGlzLmNvbHVtbnMubGVuZ3RoKSByZXR1cm47XG5cbiAgICAgICAgICAgIFVJLiR3aW4ub24oJ2xvYWQgcmVzaXplIG9yaWVudGF0aW9uY2hhbmdlJywgKGZ1bmN0aW9uKCkge1xuXG4gICAgICAgICAgICAgICAgdmFyIGZuID0gZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICgkdGhpcy5lbGVtZW50LmlzKCc6dmlzaWJsZScpKSAkdGhpcy5tYXRjaCgpO1xuICAgICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgICAgICBVSS4kKGZ1bmN0aW9uKCkgeyBmbigpOyB9KTtcblxuICAgICAgICAgICAgICAgIHJldHVybiBVSS5VdGlscy5kZWJvdW5jZShmbiwgNTApO1xuICAgICAgICAgICAgfSkoKSk7XG5cbiAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMub2JzZXJ2ZSkge1xuXG4gICAgICAgICAgICAgICAgVUkuZG9tT2JzZXJ2ZSh0aGlzLmVsZW1lbnQsIGZ1bmN0aW9uKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgaWYgKCR0aGlzLmVsZW1lbnQuaXMoJzp2aXNpYmxlJykpICR0aGlzLm1hdGNoKCk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMub24oJ2Rpc3BsYXkudWsuY2hlY2snLCBmdW5jdGlvbihlKSB7XG4gICAgICAgICAgICAgICAgaWYodGhpcy5lbGVtZW50LmlzKCc6dmlzaWJsZScpKSB0aGlzLm1hdGNoKCk7XG4gICAgICAgICAgICB9LmJpbmQodGhpcykpO1xuXG4gICAgICAgICAgICBncmlkcy5wdXNoKHRoaXMpO1xuICAgICAgICB9LFxuXG4gICAgICAgIG1hdGNoOiBmdW5jdGlvbigpIHtcblxuICAgICAgICAgICAgdmFyIGZpcnN0dmlzaWJsZSA9IHRoaXMuY29sdW1ucy5maWx0ZXIoJzp2aXNpYmxlOmZpcnN0Jyk7XG5cbiAgICAgICAgICAgIGlmICghZmlyc3R2aXNpYmxlLmxlbmd0aCkgcmV0dXJuO1xuXG4gICAgICAgICAgICB2YXIgc3RhY2tlZCA9IE1hdGguY2VpbCgxMDAgKiBwYXJzZUZsb2F0KGZpcnN0dmlzaWJsZS5jc3MoJ3dpZHRoJykpIC8gcGFyc2VGbG9hdChmaXJzdHZpc2libGUucGFyZW50KCkuY3NzKCd3aWR0aCcpKSkgPj0gMTAwO1xuXG4gICAgICAgICAgICBpZiAoc3RhY2tlZCAmJiAhdGhpcy5vcHRpb25zLmlnbm9yZXN0YWNrZWQpIHtcbiAgICAgICAgICAgICAgICB0aGlzLnJldmVydCgpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICBVSS5VdGlscy5tYXRjaEhlaWdodHModGhpcy5lbGVtZW50cywgdGhpcy5vcHRpb25zKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIH0sXG5cbiAgICAgICAgcmV2ZXJ0OiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHRoaXMuZWxlbWVudHMuY3NzKCdtaW4taGVpZ2h0JywgJycpO1xuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIH1cbiAgICB9KTtcblxuICAgIFVJLmNvbXBvbmVudCgnZ3JpZE1hcmdpbicsIHtcblxuICAgICAgICBkZWZhdWx0czoge1xuICAgICAgICAgICAgY2xzICAgICAgOiAndWstZ3JpZC1tYXJnaW4nLFxuICAgICAgICAgICAgcm93Zmlyc3QgOiAndWstcm93LWZpcnN0J1xuICAgICAgICB9LFxuXG4gICAgICAgIGJvb3Q6IGZ1bmN0aW9uKCkge1xuXG4gICAgICAgICAgICAvLyBpbml0IGNvZGVcbiAgICAgICAgICAgIFVJLnJlYWR5KGZ1bmN0aW9uKGNvbnRleHQpIHtcblxuICAgICAgICAgICAgICAgIFVJLiQoJ1tkYXRhLXVrLWdyaWQtbWFyZ2luXScsIGNvbnRleHQpLmVhY2goZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciBncmlkID0gVUkuJCh0aGlzKSwgb2JqO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmICghZ3JpZC5kYXRhKCdncmlkTWFyZ2luJykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIG9iaiA9IFVJLmdyaWRNYXJnaW4oZ3JpZCwgVUkuVXRpbHMub3B0aW9ucyhncmlkLmF0dHIoJ2RhdGEtdWstZ3JpZC1tYXJnaW4nKSkpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSxcblxuICAgICAgICBpbml0OiBmdW5jdGlvbigpIHtcblxuICAgICAgICAgICAgdmFyIHN0YWNrTWFyZ2luID0gVUkuc3RhY2tNYXJnaW4odGhpcy5lbGVtZW50LCB0aGlzLm9wdGlvbnMpO1xuICAgICAgICB9XG4gICAgfSk7XG5cbn0pKFVJa2l0Mik7XG5cbihmdW5jdGlvbihVSSkge1xuXG4gICAgXCJ1c2Ugc3RyaWN0XCI7XG5cbiAgICB2YXIgYWN0aXZlID0gZmFsc2UsIGFjdGl2ZUNvdW50ID0gMCwgJGh0bWwgPSBVSS4kaHRtbCwgYm9keTtcblxuICAgIFVJLiR3aW4ub24oJ3Jlc2l6ZSBvcmllbnRhdGlvbmNoYW5nZScsIFVJLlV0aWxzLmRlYm91bmNlKGZ1bmN0aW9uKCl7XG4gICAgICAgIFVJLiQoJy51ay1tb2RhbC51ay1vcGVuJykuZWFjaChmdW5jdGlvbigpe1xuICAgICAgICAgICAgcmV0dXJuIFVJLiQodGhpcykuZGF0YSgnbW9kYWwnKSAmJiBVSS4kKHRoaXMpLmRhdGEoJ21vZGFsJykucmVzaXplKCk7XG4gICAgICAgIH0pO1xuICAgIH0sIDE1MCkpO1xuXG4gICAgVUkuY29tcG9uZW50KCdtb2RhbCcsIHtcblxuICAgICAgICBkZWZhdWx0czoge1xuICAgICAgICAgICAga2V5Ym9hcmQ6IHRydWUsXG4gICAgICAgICAgICBiZ2Nsb3NlOiB0cnVlLFxuICAgICAgICAgICAgbWluU2Nyb2xsSGVpZ2h0OiAxNTAsXG4gICAgICAgICAgICBjZW50ZXI6IGZhbHNlLFxuICAgICAgICAgICAgbW9kYWw6IHRydWVcbiAgICAgICAgfSxcblxuICAgICAgICBzY3JvbGxhYmxlOiBmYWxzZSxcbiAgICAgICAgdHJhbnNpdGlvbjogZmFsc2UsXG4gICAgICAgIGhhc1RyYW5zaXRpb25lZDogdHJ1ZSxcblxuICAgICAgICBpbml0OiBmdW5jdGlvbigpIHtcblxuICAgICAgICAgICAgaWYgKCFib2R5KSBib2R5ID0gVUkuJCgnYm9keScpO1xuXG4gICAgICAgICAgICBpZiAoIXRoaXMuZWxlbWVudC5sZW5ndGgpIHJldHVybjtcblxuICAgICAgICAgICAgdmFyICR0aGlzID0gdGhpcztcblxuICAgICAgICAgICAgdGhpcy5wYWRkaW5nZGlyID0gJ3BhZGRpbmctJyArIChVSS5sYW5nZGlyZWN0aW9uID09ICdsZWZ0JyA/ICdyaWdodCc6J2xlZnQnKTtcbiAgICAgICAgICAgIHRoaXMuZGlhbG9nICAgICA9IHRoaXMuZmluZCgnLnVrLW1vZGFsLWRpYWxvZycpO1xuXG4gICAgICAgICAgICB0aGlzLmFjdGl2ZSAgICAgPSBmYWxzZTtcblxuICAgICAgICAgICAgLy8gVXBkYXRlIEFSSUFcbiAgICAgICAgICAgIHRoaXMuZWxlbWVudC5hdHRyKCdhcmlhLWhpZGRlbicsIHRoaXMuZWxlbWVudC5oYXNDbGFzcygndWstb3BlbicpKTtcblxuICAgICAgICAgICAgdGhpcy5vbignY2xpY2snLCAnLnVrLW1vZGFsLWNsb3NlJywgZnVuY3Rpb24oZSkge1xuICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICAkdGhpcy5oaWRlKCk7XG4gICAgICAgICAgICB9KS5vbignY2xpY2snLCBmdW5jdGlvbihlKSB7XG5cbiAgICAgICAgICAgICAgICB2YXIgdGFyZ2V0ID0gVUkuJChlLnRhcmdldCk7XG5cbiAgICAgICAgICAgICAgICBpZiAodGFyZ2V0WzBdID09ICR0aGlzLmVsZW1lbnRbMF0gJiYgJHRoaXMub3B0aW9ucy5iZ2Nsb3NlKSB7XG4gICAgICAgICAgICAgICAgICAgICR0aGlzLmhpZGUoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgVUkuZG9tT2JzZXJ2ZSh0aGlzLmVsZW1lbnQsIGZ1bmN0aW9uKGUpIHsgJHRoaXMucmVzaXplKCk7IH0pO1xuICAgICAgICB9LFxuXG4gICAgICAgIHRvZ2dsZTogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpc1t0aGlzLmlzQWN0aXZlKCkgPyAnaGlkZScgOiAnc2hvdyddKCk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgc2hvdzogZnVuY3Rpb24oKSB7XG5cbiAgICAgICAgICAgIGlmICghdGhpcy5lbGVtZW50Lmxlbmd0aCkgcmV0dXJuO1xuXG4gICAgICAgICAgICB2YXIgJHRoaXMgPSB0aGlzO1xuXG4gICAgICAgICAgICBpZiAodGhpcy5pc0FjdGl2ZSgpKSByZXR1cm47XG5cbiAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMubW9kYWwgJiYgYWN0aXZlKSB7XG4gICAgICAgICAgICAgICAgYWN0aXZlLmhpZGUodHJ1ZSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMuZWxlbWVudC5yZW1vdmVDbGFzcygndWstb3BlbicpLnNob3coKTtcbiAgICAgICAgICAgIHRoaXMucmVzaXplKHRydWUpO1xuXG4gICAgICAgICAgICBpZiAodGhpcy5vcHRpb25zLm1vZGFsKSB7XG4gICAgICAgICAgICAgICAgYWN0aXZlID0gdGhpcztcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5hY3RpdmUgPSB0cnVlO1xuXG4gICAgICAgICAgICBhY3RpdmVDb3VudCsrO1xuXG4gICAgICAgICAgICBpZiAoVUkuc3VwcG9ydC50cmFuc2l0aW9uKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5oYXNUcmFuc2l0aW9uZWQgPSBmYWxzZTtcbiAgICAgICAgICAgICAgICB0aGlzLmVsZW1lbnQub25lKFVJLnN1cHBvcnQudHJhbnNpdGlvbi5lbmQsIGZ1bmN0aW9uKCl7XG4gICAgICAgICAgICAgICAgICAgICR0aGlzLmhhc1RyYW5zaXRpb25lZCA9IHRydWU7XG4gICAgICAgICAgICAgICAgICAgIFVJLlV0aWxzLmZvY3VzKCR0aGlzLmRpYWxvZywgJ2FbaHJlZl0nKTtcbiAgICAgICAgICAgICAgICB9KS5hZGRDbGFzcygndWstb3BlbicpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0aGlzLmVsZW1lbnQuYWRkQ2xhc3MoJ3VrLW9wZW4nKTtcbiAgICAgICAgICAgICAgICBVSS5VdGlscy5mb2N1cyh0aGlzLmRpYWxvZywgJ2FbaHJlZl0nKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgJGh0bWwuYWRkQ2xhc3MoJ3VrLW1vZGFsLXBhZ2UnKS5oZWlnaHQoKTsgLy8gZm9yY2UgYnJvd3NlciBlbmdpbmUgcmVkcmF3XG5cbiAgICAgICAgICAgIC8vIFVwZGF0ZSBBUklBXG4gICAgICAgICAgICB0aGlzLmVsZW1lbnQuYXR0cignYXJpYS1oaWRkZW4nLCAnZmFsc2UnKTtcblxuICAgICAgICAgICAgdGhpcy5lbGVtZW50LnRyaWdnZXIoJ3Nob3cudWsubW9kYWwnKTtcblxuICAgICAgICAgICAgVUkuVXRpbHMuY2hlY2tEaXNwbGF5KHRoaXMuZGlhbG9nLCB0cnVlKTtcblxuICAgICAgICAgICAgcmV0dXJuIHRoaXM7XG4gICAgICAgIH0sXG5cbiAgICAgICAgaGlkZTogZnVuY3Rpb24oZm9yY2UpIHtcblxuICAgICAgICAgICAgaWYgKCFmb3JjZSAmJiBVSS5zdXBwb3J0LnRyYW5zaXRpb24gJiYgdGhpcy5oYXNUcmFuc2l0aW9uZWQpIHtcblxuICAgICAgICAgICAgICAgIHZhciAkdGhpcyA9IHRoaXM7XG5cbiAgICAgICAgICAgICAgICB0aGlzLm9uZShVSS5zdXBwb3J0LnRyYW5zaXRpb24uZW5kLCBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICAgJHRoaXMuX2hpZGUoKTtcbiAgICAgICAgICAgICAgICB9KS5yZW1vdmVDbGFzcygndWstb3BlbicpO1xuXG4gICAgICAgICAgICB9IGVsc2Uge1xuXG4gICAgICAgICAgICAgICAgdGhpcy5faGlkZSgpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICByZXR1cm4gdGhpcztcbiAgICAgICAgfSxcblxuICAgICAgICByZXNpemU6IGZ1bmN0aW9uKGZvcmNlKSB7XG5cbiAgICAgICAgICAgIGlmICghdGhpcy5pc0FjdGl2ZSgpICYmICFmb3JjZSkgcmV0dXJuO1xuXG4gICAgICAgICAgICB2YXIgYm9keXdpZHRoICA9IGJvZHkud2lkdGgoKTtcblxuICAgICAgICAgICAgdGhpcy5zY3JvbGxiYXJ3aWR0aCA9IHdpbmRvdy5pbm5lcldpZHRoIC0gYm9keXdpZHRoO1xuXG4gICAgICAgICAgICBib2R5LmNzcyh0aGlzLnBhZGRpbmdkaXIsIHRoaXMuc2Nyb2xsYmFyd2lkdGgpO1xuXG4gICAgICAgICAgICB0aGlzLmVsZW1lbnQuY3NzKCdvdmVyZmxvdy15JywgdGhpcy5zY3JvbGxiYXJ3aWR0aCA/ICdzY3JvbGwnIDogJ2F1dG8nKTtcblxuICAgICAgICAgICAgaWYgKCF0aGlzLnVwZGF0ZVNjcm9sbGFibGUoKSAmJiB0aGlzLm9wdGlvbnMuY2VudGVyKSB7XG5cbiAgICAgICAgICAgICAgICB2YXIgZGggID0gdGhpcy5kaWFsb2cub3V0ZXJIZWlnaHQoKSxcbiAgICAgICAgICAgICAgICBwYWQgPSBwYXJzZUludCh0aGlzLmRpYWxvZy5jc3MoJ21hcmdpbi10b3AnKSwgMTApICsgcGFyc2VJbnQodGhpcy5kaWFsb2cuY3NzKCdtYXJnaW4tYm90dG9tJyksIDEwKTtcblxuICAgICAgICAgICAgICAgIGlmICgoZGggKyBwYWQpIDwgd2luZG93LmlubmVySGVpZ2h0KSB7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuZGlhbG9nLmNzcyh7dG9wOiAod2luZG93LmlubmVySGVpZ2h0LzIgLSBkaC8yKSAtIHBhZCB9KTtcbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmRpYWxvZy5jc3Moe3RvcDogJyd9KTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG5cbiAgICAgICAgdXBkYXRlU2Nyb2xsYWJsZTogZnVuY3Rpb24oKSB7XG5cbiAgICAgICAgICAgIC8vIGhhcyBzY3JvbGxhYmxlP1xuICAgICAgICAgICAgdmFyIHNjcm9sbGFibGUgPSB0aGlzLmRpYWxvZy5maW5kKCcudWstb3ZlcmZsb3ctY29udGFpbmVyOnZpc2libGU6Zmlyc3QnKTtcblxuICAgICAgICAgICAgaWYgKHNjcm9sbGFibGUubGVuZ3RoKSB7XG5cbiAgICAgICAgICAgICAgICBzY3JvbGxhYmxlLmNzcygnaGVpZ2h0JywgMCk7XG5cbiAgICAgICAgICAgICAgICB2YXIgb2Zmc2V0ID0gTWF0aC5hYnMocGFyc2VJbnQodGhpcy5kaWFsb2cuY3NzKCdtYXJnaW4tdG9wJyksIDEwKSksXG4gICAgICAgICAgICAgICAgZGggICAgID0gdGhpcy5kaWFsb2cub3V0ZXJIZWlnaHQoKSxcbiAgICAgICAgICAgICAgICB3aCAgICAgPSB3aW5kb3cuaW5uZXJIZWlnaHQsXG4gICAgICAgICAgICAgICAgaCAgICAgID0gd2ggLSAyKihvZmZzZXQgPCAyMCA/IDIwOm9mZnNldCkgLSBkaDtcblxuICAgICAgICAgICAgICAgIHNjcm9sbGFibGUuY3NzKHtcbiAgICAgICAgICAgICAgICAgICAgbWF4SGVpZ2h0OiAoaCA8IHRoaXMub3B0aW9ucy5taW5TY3JvbGxIZWlnaHQgPyAnJzpoKSxcbiAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OicnXG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIGZhbHNlO1xuICAgICAgICB9LFxuXG4gICAgICAgIF9oaWRlOiBmdW5jdGlvbigpIHtcblxuICAgICAgICAgICAgdGhpcy5hY3RpdmUgPSBmYWxzZTtcbiAgICAgICAgICAgIGlmIChhY3RpdmVDb3VudCA+IDApIGFjdGl2ZUNvdW50LS07XG4gICAgICAgICAgICBlbHNlIGFjdGl2ZUNvdW50ID0gMDtcblxuICAgICAgICAgICAgdGhpcy5lbGVtZW50LmhpZGUoKS5yZW1vdmVDbGFzcygndWstb3BlbicpO1xuXG4gICAgICAgICAgICAvLyBVcGRhdGUgQVJJQVxuICAgICAgICAgICAgdGhpcy5lbGVtZW50LmF0dHIoJ2FyaWEtaGlkZGVuJywgJ3RydWUnKTtcblxuICAgICAgICAgICAgaWYgKCFhY3RpdmVDb3VudCkge1xuICAgICAgICAgICAgICAgICRodG1sLnJlbW92ZUNsYXNzKCd1ay1tb2RhbC1wYWdlJyk7XG4gICAgICAgICAgICAgICAgYm9keS5jc3ModGhpcy5wYWRkaW5nZGlyLCBcIlwiKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKGFjdGl2ZT09PXRoaXMpIGFjdGl2ZSA9IGZhbHNlO1xuXG4gICAgICAgICAgICB0aGlzLnRyaWdnZXIoJ2hpZGUudWsubW9kYWwnKTtcbiAgICAgICAgfSxcblxuICAgICAgICBpc0FjdGl2ZTogZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICByZXR1cm4gdGhpcy5lbGVtZW50Lmhhc0NsYXNzKCd1ay1vcGVuJyk7XG4gICAgICAgIH1cblxuICAgIH0pO1xuXG4gICAgVUkuY29tcG9uZW50KCdtb2RhbFRyaWdnZXInLCB7XG5cbiAgICAgICAgYm9vdDogZnVuY3Rpb24oKSB7XG5cbiAgICAgICAgICAgIC8vIGluaXQgY29kZVxuICAgICAgICAgICAgVUkuJGh0bWwub24oJ2NsaWNrLm1vZGFsLnVpa2l0JywgJ1tkYXRhLXVrLW1vZGFsXScsIGZ1bmN0aW9uKGUpIHtcblxuICAgICAgICAgICAgICAgIHZhciBlbGUgPSBVSS4kKHRoaXMpO1xuXG4gICAgICAgICAgICAgICAgaWYgKGVsZS5pcygnYScpKSB7XG4gICAgICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICBpZiAoIWVsZS5kYXRhKCdtb2RhbFRyaWdnZXInKSkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgbW9kYWwgPSBVSS5tb2RhbFRyaWdnZXIoZWxlLCBVSS5VdGlscy5vcHRpb25zKGVsZS5hdHRyKCdkYXRhLXVrLW1vZGFsJykpKTtcbiAgICAgICAgICAgICAgICAgICAgbW9kYWwuc2hvdygpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIC8vIGNsb3NlIG1vZGFsIG9uIGVzYyBidXR0b25cbiAgICAgICAgICAgIFVJLiRodG1sLm9uKCdrZXlkb3duLm1vZGFsLnVpa2l0JywgZnVuY3Rpb24gKGUpIHtcblxuICAgICAgICAgICAgICAgIGlmIChhY3RpdmUgJiYgZS5rZXlDb2RlID09PSAyNyAmJiBhY3RpdmUub3B0aW9ucy5rZXlib2FyZCkgeyAvLyBFU0NcbiAgICAgICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgICAgICBhY3RpdmUuaGlkZSgpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9LFxuXG4gICAgICAgIGluaXQ6IGZ1bmN0aW9uKCkge1xuXG4gICAgICAgICAgICB2YXIgJHRoaXMgPSB0aGlzO1xuXG4gICAgICAgICAgICB0aGlzLm9wdGlvbnMgPSBVSS4kLmV4dGVuZCh7XG4gICAgICAgICAgICAgICAgdGFyZ2V0OiAkdGhpcy5lbGVtZW50LmlzKCdhJykgPyAkdGhpcy5lbGVtZW50LmF0dHIoJ2hyZWYnKSA6IGZhbHNlXG4gICAgICAgICAgICB9LCB0aGlzLm9wdGlvbnMpO1xuXG4gICAgICAgICAgICB0aGlzLm1vZGFsID0gVUkubW9kYWwodGhpcy5vcHRpb25zLnRhcmdldCwgdGhpcy5vcHRpb25zKTtcblxuICAgICAgICAgICAgdGhpcy5vbihcImNsaWNrXCIsIGZ1bmN0aW9uKGUpIHtcbiAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgJHRoaXMuc2hvdygpO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIC8vbWV0aG9kc1xuICAgICAgICAgICAgdGhpcy5wcm94eSh0aGlzLm1vZGFsLCAnc2hvdyBoaWRlIGlzQWN0aXZlJyk7XG4gICAgICAgIH1cbiAgICB9KTtcblxuICAgIFVJLm1vZGFsLmRpYWxvZyA9IGZ1bmN0aW9uKGNvbnRlbnQsIG9wdGlvbnMpIHtcblxuICAgICAgICB2YXIgbW9kYWwgPSBVSS5tb2RhbChVSS4kKFVJLm1vZGFsLmRpYWxvZy50ZW1wbGF0ZSkuYXBwZW5kVG8oJ2JvZHknKSwgb3B0aW9ucyk7XG5cbiAgICAgICAgbW9kYWwub24oJ2hpZGUudWsubW9kYWwnLCBmdW5jdGlvbigpe1xuICAgICAgICAgICAgaWYgKG1vZGFsLnBlcnNpc3QpIHtcbiAgICAgICAgICAgICAgICBtb2RhbC5wZXJzaXN0LmFwcGVuZFRvKG1vZGFsLnBlcnNpc3QuZGF0YSgnbW9kYWxQZXJzaXN0UGFyZW50JykpO1xuICAgICAgICAgICAgICAgIG1vZGFsLnBlcnNpc3QgPSBmYWxzZTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgICAgIG1vZGFsLmVsZW1lbnQucmVtb3ZlKCk7XG4gICAgICAgIH0pO1xuXG4gICAgICAgIHNldENvbnRlbnQoY29udGVudCwgbW9kYWwpO1xuXG4gICAgICAgIHJldHVybiBtb2RhbDtcbiAgICB9O1xuXG4gICAgVUkubW9kYWwuZGlhbG9nLnRlbXBsYXRlID0gJzxkaXYgY2xhc3M9XCJ1ay1tb2RhbFwiPjxkaXYgY2xhc3M9XCJ1ay1tb2RhbC1kaWFsb2dcIiBzdHlsZT1cIm1pbi1oZWlnaHQ6MDtcIj48L2Rpdj48L2Rpdj4nO1xuXG4gICAgVUkubW9kYWwuYWxlcnQgPSBmdW5jdGlvbihjb250ZW50LCBvcHRpb25zKSB7XG5cbiAgICAgICAgb3B0aW9ucyA9IFVJLiQuZXh0ZW5kKHRydWUsIHtiZ2Nsb3NlOmZhbHNlLCBrZXlib2FyZDpmYWxzZSwgbW9kYWw6ZmFsc2UsIGxhYmVsczpVSS5tb2RhbC5sYWJlbHN9LCBvcHRpb25zKTtcblxuICAgICAgICB2YXIgbW9kYWwgPSBVSS5tb2RhbC5kaWFsb2coKFtcbiAgICAgICAgICAgICc8ZGl2IGNsYXNzPVwidWstbWFyZ2luIHVrLW1vZGFsLWNvbnRlbnRcIj4nK1N0cmluZyhjb250ZW50KSsnPC9kaXY+JyxcbiAgICAgICAgICAgICc8ZGl2IGNsYXNzPVwidWstbW9kYWwtZm9vdGVyIHVrLXRleHQtcmlnaHRcIj48YnV0dG9uIGNsYXNzPVwidWstYnV0dG9uIHVrLWJ1dHRvbi1wcmltYXJ5IHVrLW1vZGFsLWNsb3NlXCI+JytvcHRpb25zLmxhYmVscy5PaysnPC9idXR0b24+PC9kaXY+J1xuICAgICAgICBdKS5qb2luKFwiXCIpLCBvcHRpb25zKTtcblxuICAgICAgICBtb2RhbC5vbignc2hvdy51ay5tb2RhbCcsIGZ1bmN0aW9uKCl7XG4gICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7XG4gICAgICAgICAgICAgICAgbW9kYWwuZWxlbWVudC5maW5kKCdidXR0b246Zmlyc3QnKS5mb2N1cygpO1xuICAgICAgICAgICAgfSwgNTApO1xuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gbW9kYWwuc2hvdygpO1xuICAgIH07XG5cbiAgICBVSS5tb2RhbC5jb25maXJtID0gZnVuY3Rpb24oY29udGVudCwgb25jb25maXJtLCBvbmNhbmNlbCkge1xuXG4gICAgICAgIHZhciBvcHRpb25zID0gYXJndW1lbnRzLmxlbmd0aCA+IDEgJiYgYXJndW1lbnRzW2FyZ3VtZW50cy5sZW5ndGgtMV0gPyBhcmd1bWVudHNbYXJndW1lbnRzLmxlbmd0aC0xXSA6IHt9O1xuXG4gICAgICAgIG9uY29uZmlybSA9IFVJLiQuaXNGdW5jdGlvbihvbmNvbmZpcm0pID8gb25jb25maXJtIDogZnVuY3Rpb24oKXt9O1xuICAgICAgICBvbmNhbmNlbCAgPSBVSS4kLmlzRnVuY3Rpb24ob25jYW5jZWwpID8gb25jYW5jZWwgOiBmdW5jdGlvbigpe307XG4gICAgICAgIG9wdGlvbnMgICA9IFVJLiQuZXh0ZW5kKHRydWUsIHtiZ2Nsb3NlOmZhbHNlLCBrZXlib2FyZDpmYWxzZSwgbW9kYWw6ZmFsc2UsIGxhYmVsczpVSS5tb2RhbC5sYWJlbHN9LCBVSS4kLmlzRnVuY3Rpb24ob3B0aW9ucykgPyB7fTpvcHRpb25zKTtcblxuICAgICAgICB2YXIgbW9kYWwgPSBVSS5tb2RhbC5kaWFsb2coKFtcbiAgICAgICAgICAgICc8ZGl2IGNsYXNzPVwidWstbWFyZ2luIHVrLW1vZGFsLWNvbnRlbnRcIj4nK1N0cmluZyhjb250ZW50KSsnPC9kaXY+JyxcbiAgICAgICAgICAgICc8ZGl2IGNsYXNzPVwidWstbW9kYWwtZm9vdGVyIHVrLXRleHQtcmlnaHRcIj48YnV0dG9uIGNsYXNzPVwidWstYnV0dG9uIGpzLW1vZGFsLWNvbmZpcm0tY2FuY2VsXCI+JytvcHRpb25zLmxhYmVscy5DYW5jZWwrJzwvYnV0dG9uPiA8YnV0dG9uIGNsYXNzPVwidWstYnV0dG9uIHVrLWJ1dHRvbi1wcmltYXJ5IGpzLW1vZGFsLWNvbmZpcm1cIj4nK29wdGlvbnMubGFiZWxzLk9rKyc8L2J1dHRvbj48L2Rpdj4nXG4gICAgICAgIF0pLmpvaW4oXCJcIiksIG9wdGlvbnMpO1xuXG4gICAgICAgIG1vZGFsLmVsZW1lbnQuZmluZChcIi5qcy1tb2RhbC1jb25maXJtLCAuanMtbW9kYWwtY29uZmlybS1jYW5jZWxcIikub24oXCJjbGlja1wiLCBmdW5jdGlvbigpe1xuICAgICAgICAgICAgVUkuJCh0aGlzKS5pcygnLmpzLW1vZGFsLWNvbmZpcm0nKSA/IG9uY29uZmlybSgpIDogb25jYW5jZWwoKTtcbiAgICAgICAgICAgIG1vZGFsLmhpZGUoKTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgbW9kYWwub24oJ3Nob3cudWsubW9kYWwnLCBmdW5jdGlvbigpe1xuICAgICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbigpe1xuICAgICAgICAgICAgICAgIG1vZGFsLmVsZW1lbnQuZmluZCgnLmpzLW1vZGFsLWNvbmZpcm0nKS5mb2N1cygpO1xuICAgICAgICAgICAgfSwgNTApO1xuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gbW9kYWwuc2hvdygpO1xuICAgIH07XG5cbiAgICBVSS5tb2RhbC5wcm9tcHQgPSBmdW5jdGlvbih0ZXh0LCB2YWx1ZSwgb25zdWJtaXQsIG9wdGlvbnMpIHtcblxuICAgICAgICBvbnN1Ym1pdCA9IFVJLiQuaXNGdW5jdGlvbihvbnN1Ym1pdCkgPyBvbnN1Ym1pdCA6IGZ1bmN0aW9uKHZhbHVlKXt9O1xuICAgICAgICBvcHRpb25zICA9IFVJLiQuZXh0ZW5kKHRydWUsIHtiZ2Nsb3NlOmZhbHNlLCBrZXlib2FyZDpmYWxzZSwgbW9kYWw6ZmFsc2UsIGxhYmVsczpVSS5tb2RhbC5sYWJlbHN9LCBvcHRpb25zKTtcblxuICAgICAgICB2YXIgbW9kYWwgPSBVSS5tb2RhbC5kaWFsb2coKFtcbiAgICAgICAgICAgIHRleHQgPyAnPGRpdiBjbGFzcz1cInVrLW1vZGFsLWNvbnRlbnQgdWstZm9ybVwiPicrU3RyaW5nKHRleHQpKyc8L2Rpdj4nOicnLFxuICAgICAgICAgICAgJzxkaXYgY2xhc3M9XCJ1ay1tYXJnaW4tc21hbGwtdG9wIHVrLW1vZGFsLWNvbnRlbnQgdWstZm9ybVwiPjxwPjxpbnB1dCB0eXBlPVwidGV4dFwiIGNsYXNzPVwidWstd2lkdGgtMS0xXCI+PC9wPjwvZGl2PicsXG4gICAgICAgICAgICAnPGRpdiBjbGFzcz1cInVrLW1vZGFsLWZvb3RlciB1ay10ZXh0LXJpZ2h0XCI+PGJ1dHRvbiBjbGFzcz1cInVrLWJ1dHRvbiB1ay1tb2RhbC1jbG9zZVwiPicrb3B0aW9ucy5sYWJlbHMuQ2FuY2VsKyc8L2J1dHRvbj4gPGJ1dHRvbiBjbGFzcz1cInVrLWJ1dHRvbiB1ay1idXR0b24tcHJpbWFyeSBqcy1tb2RhbC1va1wiPicrb3B0aW9ucy5sYWJlbHMuT2srJzwvYnV0dG9uPjwvZGl2PidcbiAgICAgICAgXSkuam9pbihcIlwiKSwgb3B0aW9ucyksXG5cbiAgICAgICAgaW5wdXQgPSBtb2RhbC5lbGVtZW50LmZpbmQoXCJpbnB1dFt0eXBlPSd0ZXh0J11cIikudmFsKHZhbHVlIHx8ICcnKS5vbigna2V5dXAnLCBmdW5jdGlvbihlKXtcbiAgICAgICAgICAgIGlmIChlLmtleUNvZGUgPT0gMTMpIHtcbiAgICAgICAgICAgICAgICBtb2RhbC5lbGVtZW50LmZpbmQoJy5qcy1tb2RhbC1vaycpLnRyaWdnZXIoJ2NsaWNrJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgIG1vZGFsLmVsZW1lbnQuZmluZCgnLmpzLW1vZGFsLW9rJykub24oJ2NsaWNrJywgZnVuY3Rpb24oKXtcbiAgICAgICAgICAgIGlmIChvbnN1Ym1pdChpbnB1dC52YWwoKSkhPT1mYWxzZSl7XG4gICAgICAgICAgICAgICAgbW9kYWwuaGlkZSgpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9KTtcblxuICAgICAgICByZXR1cm4gbW9kYWwuc2hvdygpO1xuICAgIH07XG5cbiAgICBVSS5tb2RhbC5ibG9ja1VJID0gZnVuY3Rpb24oY29udGVudCwgb3B0aW9ucykge1xuXG4gICAgICAgIHZhciBtb2RhbCA9IFVJLm1vZGFsLmRpYWxvZygoW1xuICAgICAgICAgICAgJzxkaXYgY2xhc3M9XCJ1ay1tYXJnaW4gdWstbW9kYWwtY29udGVudFwiPicrU3RyaW5nKGNvbnRlbnQgfHwgJzxkaXYgY2xhc3M9XCJ1ay10ZXh0LWNlbnRlclwiPi4uLjwvZGl2PicpKyc8L2Rpdj4nXG4gICAgICAgIF0pLmpvaW4oXCJcIiksIFVJLiQuZXh0ZW5kKHtiZ2Nsb3NlOmZhbHNlLCBrZXlib2FyZDpmYWxzZSwgbW9kYWw6ZmFsc2V9LCBvcHRpb25zKSk7XG5cbiAgICAgICAgbW9kYWwuY29udGVudCA9IG1vZGFsLmVsZW1lbnQuZmluZCgnLnVrLW1vZGFsLWNvbnRlbnQ6Zmlyc3QnKTtcblxuICAgICAgICByZXR1cm4gbW9kYWwuc2hvdygpO1xuICAgIH07XG5cbiAgICBVSS5tb2RhbC5sYWJlbHMgPSB7XG4gICAgICAgIE9rOiAnT2snLFxuICAgICAgICBDYW5jZWw6ICdDYW5jZWwnXG4gICAgfTtcblxuICAgIC8vIGhlbHBlciBmdW5jdGlvbnNcbiAgICBmdW5jdGlvbiBzZXRDb250ZW50KGNvbnRlbnQsIG1vZGFsKXtcblxuICAgICAgICBpZighbW9kYWwpIHJldHVybjtcblxuICAgICAgICBpZiAodHlwZW9mIGNvbnRlbnQgPT09ICdvYmplY3QnKSB7XG5cbiAgICAgICAgICAgIC8vIGNvbnZlcnQgRE9NIG9iamVjdCB0byBhIGpRdWVyeSBvYmplY3RcbiAgICAgICAgICAgIGNvbnRlbnQgPSBjb250ZW50IGluc3RhbmNlb2YgalF1ZXJ5ID8gY29udGVudCA6IFVJLiQoY29udGVudCk7XG5cbiAgICAgICAgICAgIGlmKGNvbnRlbnQucGFyZW50KCkubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgbW9kYWwucGVyc2lzdCA9IGNvbnRlbnQ7XG4gICAgICAgICAgICAgICAgbW9kYWwucGVyc2lzdC5kYXRhKCdtb2RhbFBlcnNpc3RQYXJlbnQnLCBjb250ZW50LnBhcmVudCgpKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfWVsc2UgaWYgKHR5cGVvZiBjb250ZW50ID09PSAnc3RyaW5nJyB8fCB0eXBlb2YgY29udGVudCA9PT0gJ251bWJlcicpIHtcbiAgICAgICAgICAgICAgICAvLyBqdXN0IGluc2VydCB0aGUgZGF0YSBhcyBpbm5lckhUTUxcbiAgICAgICAgICAgICAgICBjb250ZW50ID0gVUkuJCgnPGRpdj48L2Rpdj4nKS5odG1sKGNvbnRlbnQpO1xuICAgICAgICB9ZWxzZSB7XG4gICAgICAgICAgICAgICAgLy8gdW5zdXBwb3J0ZWQgZGF0YSB0eXBlIVxuICAgICAgICAgICAgICAgIGNvbnRlbnQgPSBVSS4kKCc8ZGl2PjwvZGl2PicpLmh0bWwoJ1VJa2l0Mi5tb2RhbCBFcnJvcjogVW5zdXBwb3J0ZWQgZGF0YSB0eXBlOiAnICsgdHlwZW9mIGNvbnRlbnQpO1xuICAgICAgICB9XG5cbiAgICAgICAgY29udGVudC5hcHBlbmRUbyhtb2RhbC5lbGVtZW50LmZpbmQoJy51ay1tb2RhbC1kaWFsb2cnKSk7XG5cbiAgICAgICAgcmV0dXJuIG1vZGFsO1xuICAgIH1cblxufSkoVUlraXQyKTtcblxuKGZ1bmN0aW9uKFVJKSB7XG5cbiAgICBcInVzZSBzdHJpY3RcIjtcblxuICAgIFVJLmNvbXBvbmVudCgnbmF2Jywge1xuXG4gICAgICAgIGRlZmF1bHRzOiB7XG4gICAgICAgICAgICB0b2dnbGU6ICc+bGkudWstcGFyZW50ID4gYVtocmVmPVwiI1wiXScsXG4gICAgICAgICAgICBsaXN0czogJz5saS51ay1wYXJlbnQgPiB1bCcsXG4gICAgICAgICAgICBtdWx0aXBsZTogZmFsc2VcbiAgICAgICAgfSxcblxuICAgICAgICBib290OiBmdW5jdGlvbigpIHtcblxuICAgICAgICAgICAgLy8gaW5pdCBjb2RlXG4gICAgICAgICAgICBVSS5yZWFkeShmdW5jdGlvbihjb250ZXh0KSB7XG5cbiAgICAgICAgICAgICAgICBVSS4kKCdbZGF0YS11ay1uYXZdJywgY29udGV4dCkuZWFjaChmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIG5hdiA9IFVJLiQodGhpcyk7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKCFuYXYuZGF0YSgnbmF2JykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBvYmogPSBVSS5uYXYobmF2LCBVSS5VdGlscy5vcHRpb25zKG5hdi5hdHRyKCdkYXRhLXVrLW5hdicpKSk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9LFxuXG4gICAgICAgIGluaXQ6IGZ1bmN0aW9uKCkge1xuXG4gICAgICAgICAgICB2YXIgJHRoaXMgPSB0aGlzO1xuXG4gICAgICAgICAgICB0aGlzLm9uKCdjbGljay51ay5uYXYnLCB0aGlzLm9wdGlvbnMudG9nZ2xlLCBmdW5jdGlvbihlKSB7XG4gICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgIHZhciBlbGUgPSBVSS4kKHRoaXMpO1xuICAgICAgICAgICAgICAgICR0aGlzLm9wZW4oZWxlLnBhcmVudCgpWzBdID09ICR0aGlzLmVsZW1lbnRbMF0gPyBlbGUgOiBlbGUucGFyZW50KFwibGlcIikpO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIHRoaXMudXBkYXRlKCk7XG5cbiAgICAgICAgICAgIFVJLmRvbU9ic2VydmUodGhpcy5lbGVtZW50LCBmdW5jdGlvbihlKSB7XG4gICAgICAgICAgICAgICAgaWYgKCR0aGlzLmVsZW1lbnQuZmluZCgkdGhpcy5vcHRpb25zLmxpc3RzKS5ub3QoJ1tyb2xlXScpLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICAkdGhpcy51cGRhdGUoKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSxcblxuICAgICAgICB1cGRhdGU6IGZ1bmN0aW9uKCkge1xuXG4gICAgICAgICAgICB2YXIgJHRoaXMgPSB0aGlzO1xuXG4gICAgICAgICAgICB0aGlzLmZpbmQodGhpcy5vcHRpb25zLmxpc3RzKS5lYWNoKGZ1bmN0aW9uKCkge1xuXG4gICAgICAgICAgICAgICAgdmFyICRlbGUgICA9IFVJLiQodGhpcykuYXR0cigncm9sZScsICdtZW51JyksXG4gICAgICAgICAgICAgICAgICAgIHBhcmVudCA9ICRlbGUuY2xvc2VzdCgnbGknKSxcbiAgICAgICAgICAgICAgICAgICAgYWN0aXZlID0gcGFyZW50Lmhhc0NsYXNzKFwidWstYWN0aXZlXCIpO1xuXG4gICAgICAgICAgICAgICAgaWYgKCFwYXJlbnQuZGF0YSgnbGlzdC1jb250YWluZXInKSkge1xuICAgICAgICAgICAgICAgICAgICAkZWxlLndyYXAoJzxkaXYgc3R5bGU9XCJvdmVyZmxvdzpoaWRkZW47aGVpZ2h0OjA7cG9zaXRpb246cmVsYXRpdmU7XCI+PC9kaXY+Jyk7XG4gICAgICAgICAgICAgICAgICAgIHBhcmVudC5kYXRhKCdsaXN0LWNvbnRhaW5lcicsICRlbGUucGFyZW50KClbYWN0aXZlID8gJ3JlbW92ZUNsYXNzJzonYWRkQ2xhc3MnXSgndWstaGlkZGVuJykpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIC8vIEluaXQgQVJJQVxuICAgICAgICAgICAgICAgIHBhcmVudC5hdHRyKCdhcmlhLWV4cGFuZGVkJywgcGFyZW50Lmhhc0NsYXNzKFwidWstb3BlblwiKSk7XG5cbiAgICAgICAgICAgICAgICBpZiAoYWN0aXZlKSAkdGhpcy5vcGVuKHBhcmVudCwgdHJ1ZSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSxcblxuICAgICAgICBvcGVuOiBmdW5jdGlvbihsaSwgbm9hbmltYXRpb24pIHtcblxuICAgICAgICAgICAgdmFyICR0aGlzID0gdGhpcywgZWxlbWVudCA9IHRoaXMuZWxlbWVudCwgJGxpID0gVUkuJChsaSksICRjb250YWluZXIgPSAkbGkuZGF0YSgnbGlzdC1jb250YWluZXInKTtcblxuICAgICAgICAgICAgaWYgKCF0aGlzLm9wdGlvbnMubXVsdGlwbGUpIHtcblxuICAgICAgICAgICAgICAgIGVsZW1lbnQuY2hpbGRyZW4oJy51ay1vcGVuJykubm90KGxpKS5lYWNoKGZ1bmN0aW9uKCkge1xuXG4gICAgICAgICAgICAgICAgICAgIHZhciBlbGUgPSBVSS4kKHRoaXMpO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmIChlbGUuZGF0YSgnbGlzdC1jb250YWluZXInKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZWxlLmRhdGEoJ2xpc3QtY29udGFpbmVyJykuc3RvcCgpLmFuaW1hdGUoe2hlaWdodDogMH0sIGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJLiQodGhpcykucGFyZW50KCkucmVtb3ZlQ2xhc3MoJ3VrLW9wZW4nKS5lbmQoKS5hZGRDbGFzcygndWstaGlkZGVuJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAkbGkudG9nZ2xlQ2xhc3MoJ3VrLW9wZW4nKTtcblxuICAgICAgICAgICAgLy8gVXBkYXRlIEFSSUFcbiAgICAgICAgICAgICRsaS5hdHRyKCdhcmlhLWV4cGFuZGVkJywgJGxpLmhhc0NsYXNzKCd1ay1vcGVuJykpO1xuXG4gICAgICAgICAgICBpZiAoJGNvbnRhaW5lcikge1xuXG4gICAgICAgICAgICAgICAgaWYgKCRsaS5oYXNDbGFzcygndWstb3BlbicpKSB7XG4gICAgICAgICAgICAgICAgICAgICRjb250YWluZXIucmVtb3ZlQ2xhc3MoJ3VrLWhpZGRlbicpO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGlmIChub2FuaW1hdGlvbikge1xuXG4gICAgICAgICAgICAgICAgICAgICRjb250YWluZXIuc3RvcCgpLmhlaWdodCgkbGkuaGFzQ2xhc3MoJ3VrLW9wZW4nKSA/ICdhdXRvJyA6IDApO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmICghJGxpLmhhc0NsYXNzKCd1ay1vcGVuJykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICRjb250YWluZXIuYWRkQ2xhc3MoJ3VrLWhpZGRlbicpO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgdGhpcy50cmlnZ2VyKCdkaXNwbGF5LnVrLmNoZWNrJyk7XG5cbiAgICAgICAgICAgICAgICB9IGVsc2Uge1xuXG4gICAgICAgICAgICAgICAgICAgICRjb250YWluZXIuc3RvcCgpLmFuaW1hdGUoe1xuICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OiAoJGxpLmhhc0NsYXNzKCd1ay1vcGVuJykgPyBnZXRIZWlnaHQoJGNvbnRhaW5lci5maW5kKCd1bDpmaXJzdCcpKSA6IDApXG4gICAgICAgICAgICAgICAgICAgIH0sIGZ1bmN0aW9uKCkge1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAoISRsaS5oYXNDbGFzcygndWstb3BlbicpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgJGNvbnRhaW5lci5hZGRDbGFzcygndWstaGlkZGVuJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICRjb250YWluZXIuY3NzKCdoZWlnaHQnLCAnJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLnRyaWdnZXIoJ2Rpc3BsYXkudWsuY2hlY2snKTtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSk7XG5cblxuICAgIC8vIGhlbHBlclxuXG4gICAgZnVuY3Rpb24gZ2V0SGVpZ2h0KGVsZSkge1xuXG4gICAgICAgIHZhciAkZWxlID0gVUkuJChlbGUpLCBoZWlnaHQgPSAnYXV0byc7XG5cbiAgICAgICAgaWYgKCRlbGUuaXMoJzp2aXNpYmxlJykpIHtcbiAgICAgICAgICAgIGhlaWdodCA9ICRlbGUub3V0ZXJIZWlnaHQoKTtcbiAgICAgICAgfSBlbHNlIHtcblxuICAgICAgICAgICAgdmFyIHRtcCA9IHtcbiAgICAgICAgICAgICAgICBwb3NpdGlvbjogJGVsZS5jc3MoJ3Bvc2l0aW9uJyksXG4gICAgICAgICAgICAgICAgdmlzaWJpbGl0eTogJGVsZS5jc3MoJ3Zpc2liaWxpdHknKSxcbiAgICAgICAgICAgICAgICBkaXNwbGF5OiAkZWxlLmNzcygnZGlzcGxheScpXG4gICAgICAgICAgICB9O1xuXG4gICAgICAgICAgICBoZWlnaHQgPSAkZWxlLmNzcyh7cG9zaXRpb246ICdhYnNvbHV0ZScsIHZpc2liaWxpdHk6ICdoaWRkZW4nLCBkaXNwbGF5OiAnYmxvY2snfSkub3V0ZXJIZWlnaHQoKTtcblxuICAgICAgICAgICAgJGVsZS5jc3ModG1wKTsgLy8gcmVzZXQgZWxlbWVudFxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIGhlaWdodDtcbiAgICB9XG5cbn0pKFVJa2l0Mik7XG5cbihmdW5jdGlvbihVSSkge1xuXG4gICAgXCJ1c2Ugc3RyaWN0XCI7XG5cbiAgICB2YXIgc2Nyb2xscG9zID0ge3g6IHdpbmRvdy5zY3JvbGxYLCB5OiB3aW5kb3cuc2Nyb2xsWX0sXG4gICAgICAgICR3aW4gICAgICA9IFVJLiR3aW4sXG4gICAgICAgICRkb2MgICAgICA9IFVJLiRkb2MsXG4gICAgICAgICRodG1sICAgICA9IFVJLiRodG1sLFxuICAgICAgICBPZmZjYW52YXMgPSB7XG5cbiAgICAgICAgc2hvdzogZnVuY3Rpb24oZWxlbWVudCwgb3B0aW9ucykge1xuXG4gICAgICAgICAgICBlbGVtZW50ID0gVUkuJChlbGVtZW50KTtcblxuICAgICAgICAgICAgaWYgKCFlbGVtZW50Lmxlbmd0aCkgcmV0dXJuO1xuXG4gICAgICAgICAgICBvcHRpb25zID0gVUkuJC5leHRlbmQoe21vZGU6ICdwdXNoJ30sIG9wdGlvbnMpO1xuXG4gICAgICAgICAgICB2YXIgJGJvZHkgICAgID0gVUkuJCgnYm9keScpLFxuICAgICAgICAgICAgICAgIGJhciAgICAgICA9IGVsZW1lbnQuZmluZCgnLnVrLW9mZmNhbnZhcy1iYXI6Zmlyc3QnKSxcbiAgICAgICAgICAgICAgICBydGwgICAgICAgPSAoVUkubGFuZ2RpcmVjdGlvbiA9PSAncmlnaHQnKSxcbiAgICAgICAgICAgICAgICBmbGlwICAgICAgPSBiYXIuaGFzQ2xhc3MoJ3VrLW9mZmNhbnZhcy1iYXItZmxpcCcpID8gLTE6MSxcbiAgICAgICAgICAgICAgICBkaXIgICAgICAgPSBmbGlwICogKHJ0bCA/IC0xIDogMSksXG5cbiAgICAgICAgICAgICAgICBzY3JvbGxiYXJ3aWR0aCA9ICB3aW5kb3cuaW5uZXJXaWR0aCAtICRib2R5LndpZHRoKCk7XG5cbiAgICAgICAgICAgIHNjcm9sbHBvcyA9IHt4OiB3aW5kb3cucGFnZVhPZmZzZXQsIHk6IHdpbmRvdy5wYWdlWU9mZnNldH07XG5cbiAgICAgICAgICAgIGJhci5hdHRyKCdtb2RlJywgb3B0aW9ucy5tb2RlKTtcbiAgICAgICAgICAgIGVsZW1lbnQuYWRkQ2xhc3MoJ3VrLWFjdGl2ZScpO1xuXG4gICAgICAgICAgICAkYm9keS5jc3Moe3dpZHRoOiB3aW5kb3cuaW5uZXJXaWR0aCAtIHNjcm9sbGJhcndpZHRoLCBoZWlnaHQ6IHdpbmRvdy5pbm5lckhlaWdodH0pLmFkZENsYXNzKCd1ay1vZmZjYW52YXMtcGFnZScpO1xuXG4gICAgICAgICAgICBpZiAob3B0aW9ucy5tb2RlID09ICdwdXNoJyB8fCBvcHRpb25zLm1vZGUgPT0gJ3JldmVhbCcpIHtcbiAgICAgICAgICAgICAgICAkYm9keS5jc3MoKHJ0bCA/ICdtYXJnaW4tcmlnaHQnIDogJ21hcmdpbi1sZWZ0JyksIChydGwgPyAtMSA6IDEpICogKGJhci5vdXRlcldpZHRoKCkgKiBkaXIpKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYgKG9wdGlvbnMubW9kZSA9PSAncmV2ZWFsJykge1xuICAgICAgICAgICAgICAgIGJhci5jc3MoJ2NsaXAnLCAncmVjdCgwLCAnK2Jhci5vdXRlcldpZHRoKCkrJ3B4LCAxMDB2aCwgMCknKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgJGh0bWwuY3NzKCdtYXJnaW4tdG9wJywgc2Nyb2xscG9zLnkgKiAtMSkud2lkdGgoKTsgLy8gLndpZHRoKCkgLSBmb3JjZSByZWRyYXdcblxuXG4gICAgICAgICAgICBiYXIuYWRkQ2xhc3MoJ3VrLW9mZmNhbnZhcy1iYXItc2hvdycpO1xuXG4gICAgICAgICAgICB0aGlzLl9pbml0RWxlbWVudChlbGVtZW50KTtcblxuICAgICAgICAgICAgYmFyLnRyaWdnZXIoJ3Nob3cudWsub2ZmY2FudmFzJywgW2VsZW1lbnQsIGJhcl0pO1xuXG4gICAgICAgICAgICAvLyBVcGRhdGUgQVJJQVxuICAgICAgICAgICAgZWxlbWVudC5hdHRyKCdhcmlhLWhpZGRlbicsICdmYWxzZScpO1xuICAgICAgICB9LFxuXG4gICAgICAgIGhpZGU6IGZ1bmN0aW9uKGZvcmNlKSB7XG5cbiAgICAgICAgICAgIHZhciAkYm9keSA9IFVJLiQoJ2JvZHknKSxcbiAgICAgICAgICAgICAgICBwYW5lbCA9IFVJLiQoJy51ay1vZmZjYW52YXMudWstYWN0aXZlJyksXG4gICAgICAgICAgICAgICAgcnRsICAgPSAoVUkubGFuZ2RpcmVjdGlvbiA9PSAncmlnaHQnKSxcbiAgICAgICAgICAgICAgICBiYXIgICA9IHBhbmVsLmZpbmQoJy51ay1vZmZjYW52YXMtYmFyOmZpcnN0JyksXG4gICAgICAgICAgICAgICAgZmluYWxpemUgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICAgJGJvZHkucmVtb3ZlQ2xhc3MoJ3VrLW9mZmNhbnZhcy1wYWdlJykuY3NzKHt3aWR0aDogJycsIGhlaWdodDogJycsIG1hcmdpbkxlZnQ6ICcnLCBtYXJnaW5SaWdodDogJyd9KTtcbiAgICAgICAgICAgICAgICAgICAgcGFuZWwucmVtb3ZlQ2xhc3MoJ3VrLWFjdGl2ZScpO1xuXG4gICAgICAgICAgICAgICAgICAgIGJhci5yZW1vdmVDbGFzcygndWstb2ZmY2FudmFzLWJhci1zaG93Jyk7XG4gICAgICAgICAgICAgICAgICAgICRodG1sLmNzcygnbWFyZ2luLXRvcCcsICcnKTtcbiAgICAgICAgICAgICAgICAgICAgd2luZG93LnNjcm9sbFRvKHNjcm9sbHBvcy54LCBzY3JvbGxwb3MueSk7XG4gICAgICAgICAgICAgICAgICAgIGJhci50cmlnZ2VyKCdoaWRlLnVrLm9mZmNhbnZhcycsIFtwYW5lbCwgYmFyXSk7XG5cbiAgICAgICAgICAgICAgICAgICAgLy8gVXBkYXRlIEFSSUFcbiAgICAgICAgICAgICAgICAgICAgcGFuZWwuYXR0cignYXJpYS1oaWRkZW4nLCAndHJ1ZScpO1xuICAgICAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIGlmICghcGFuZWwubGVuZ3RoKSByZXR1cm47XG4gICAgICAgICAgICBpZiAoYmFyLmF0dHIoJ21vZGUnKSA9PSAnbm9uZScpIGZvcmNlID0gdHJ1ZTtcblxuICAgICAgICAgICAgaWYgKFVJLnN1cHBvcnQudHJhbnNpdGlvbiAmJiAhZm9yY2UpIHtcblxuICAgICAgICAgICAgICAgICRib2R5Lm9uZShVSS5zdXBwb3J0LnRyYW5zaXRpb24uZW5kLCBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICAgZmluYWxpemUoKTtcbiAgICAgICAgICAgICAgICB9KS5jc3MoKHJ0bCA/ICdtYXJnaW4tcmlnaHQnIDogJ21hcmdpbi1sZWZ0JyksICcnKTtcblxuICAgICAgICAgICAgICAgIGlmIChiYXIuYXR0cignbW9kZScpID09ICdyZXZlYWwnKSB7XG4gICAgICAgICAgICAgICAgICAgIGJhci5jc3MoJ2NsaXAnLCAnJyk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbigpe1xuICAgICAgICAgICAgICAgICAgICBiYXIucmVtb3ZlQ2xhc3MoJ3VrLW9mZmNhbnZhcy1iYXItc2hvdycpO1xuICAgICAgICAgICAgICAgIH0sIDApO1xuXG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIGZpbmFsaXplKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sXG5cbiAgICAgICAgX2luaXRFbGVtZW50OiBmdW5jdGlvbihlbGVtZW50KSB7XG5cbiAgICAgICAgICAgIGlmIChlbGVtZW50LmRhdGEoJ09mZmNhbnZhc0luaXQnKSkgcmV0dXJuO1xuXG4gICAgICAgICAgICBlbGVtZW50Lm9uKCdjbGljay51ay5vZmZjYW52YXMgc3dpcGVSaWdodC51ay5vZmZjYW52YXMgc3dpcGVMZWZ0LnVrLm9mZmNhbnZhcycsIGZ1bmN0aW9uKGUpIHtcblxuICAgICAgICAgICAgICAgIHZhciB0YXJnZXQgPSBVSS4kKGUudGFyZ2V0KTtcblxuICAgICAgICAgICAgICAgIGlmICghZS50eXBlLm1hdGNoKC9zd2lwZS8pKSB7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKCF0YXJnZXQuaGFzQ2xhc3MoJ3VrLW9mZmNhbnZhcy1jbG9zZScpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBpZiAodGFyZ2V0Lmhhc0NsYXNzKCd1ay1vZmZjYW52YXMtYmFyJykpIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0YXJnZXQucGFyZW50cygnLnVrLW9mZmNhbnZhcy1iYXI6Zmlyc3QnKS5sZW5ndGgpIHJldHVybjtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIGUuc3RvcEltbWVkaWF0ZVByb3BhZ2F0aW9uKCk7XG4gICAgICAgICAgICAgICAgT2ZmY2FudmFzLmhpZGUoKTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBlbGVtZW50Lm9uKCdjbGljaycsICdhW2hyZWYqPVwiI1wiXScsIGZ1bmN0aW9uKGUpe1xuXG4gICAgICAgICAgICAgICAgdmFyIGxpbmsgPSBVSS4kKHRoaXMpLFxuICAgICAgICAgICAgICAgICAgICBocmVmID0gbGluay5hdHRyKCdocmVmJyk7XG5cbiAgICAgICAgICAgICAgICBpZiAoaHJlZiA9PSAnIycpIHtcbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgIFVJLiRkb2Mub25lKCdoaWRlLnVrLm9mZmNhbnZhcycsIGZ1bmN0aW9uKCkge1xuXG4gICAgICAgICAgICAgICAgICAgIHZhciB0YXJnZXQ7XG5cbiAgICAgICAgICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldCA9IFVJLiQobGlua1swXS5oYXNoKTtcbiAgICAgICAgICAgICAgICAgICAgfSBjYXRjaCAoZSl7XG4gICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXQgPSAnJztcbiAgICAgICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgICAgIGlmICghdGFyZ2V0Lmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0ID0gVUkuJCgnW25hbWU9XCInK2xpbmtbMF0uaGFzaC5yZXBsYWNlKCcjJywnJykrJ1wiXScpO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKHRhcmdldC5sZW5ndGggJiYgVUkuVXRpbHMuc2Nyb2xsVG9FbGVtZW50KSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBVSS5VdGlscy5zY3JvbGxUb0VsZW1lbnQodGFyZ2V0LCBVSS5VdGlscy5vcHRpb25zKGxpbmsuYXR0cignZGF0YS11ay1zbW9vdGgtc2Nyb2xsJykgfHwgJ3t9JykpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93LmxvY2F0aW9uLmhyZWYgPSBocmVmO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICAgICBPZmZjYW52YXMuaGlkZSgpO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIGVsZW1lbnQuZGF0YSgnT2ZmY2FudmFzSW5pdCcsIHRydWUpO1xuICAgICAgICB9XG4gICAgfTtcblxuICAgIFVJLmNvbXBvbmVudCgnb2ZmY2FudmFzVHJpZ2dlcicsIHtcblxuICAgICAgICBib290OiBmdW5jdGlvbigpIHtcblxuICAgICAgICAgICAgLy8gaW5pdCBjb2RlXG4gICAgICAgICAgICAkaHRtbC5vbignY2xpY2sub2ZmY2FudmFzLnVpa2l0JywgJ1tkYXRhLXVrLW9mZmNhbnZhc10nLCBmdW5jdGlvbihlKSB7XG5cbiAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG5cbiAgICAgICAgICAgICAgICB2YXIgZWxlID0gVUkuJCh0aGlzKTtcblxuICAgICAgICAgICAgICAgIGlmICghZWxlLmRhdGEoJ29mZmNhbnZhc1RyaWdnZXInKSkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgb2JqID0gVUkub2ZmY2FudmFzVHJpZ2dlcihlbGUsIFVJLlV0aWxzLm9wdGlvbnMoZWxlLmF0dHIoJ2RhdGEtdWstb2ZmY2FudmFzJykpKTtcbiAgICAgICAgICAgICAgICAgICAgZWxlLnRyaWdnZXIoXCJjbGlja1wiKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgJGh0bWwub24oJ2tleWRvd24udWsub2ZmY2FudmFzJywgZnVuY3Rpb24oZSkge1xuXG4gICAgICAgICAgICAgICAgaWYgKGUua2V5Q29kZSA9PT0gMjcpIHsgLy8gRVNDXG4gICAgICAgICAgICAgICAgICAgIE9mZmNhbnZhcy5oaWRlKCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgaW5pdDogZnVuY3Rpb24oKSB7XG5cbiAgICAgICAgICAgIHZhciAkdGhpcyA9IHRoaXM7XG5cbiAgICAgICAgICAgIHRoaXMub3B0aW9ucyA9IFVJLiQuZXh0ZW5kKHtcbiAgICAgICAgICAgICAgICB0YXJnZXQ6ICR0aGlzLmVsZW1lbnQuaXMoJ2EnKSA/ICR0aGlzLmVsZW1lbnQuYXR0cignaHJlZicpIDogZmFsc2UsXG4gICAgICAgICAgICAgICAgbW9kZTogJ3B1c2gnXG4gICAgICAgICAgICB9LCB0aGlzLm9wdGlvbnMpO1xuXG4gICAgICAgICAgICB0aGlzLm9uKCdjbGljaycsIGZ1bmN0aW9uKGUpIHtcbiAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICAgICAgT2ZmY2FudmFzLnNob3coJHRoaXMub3B0aW9ucy50YXJnZXQsICR0aGlzLm9wdGlvbnMpO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cbiAgICB9KTtcblxuICAgIFVJLm9mZmNhbnZhcyA9IE9mZmNhbnZhcztcblxufSkoVUlraXQyKTtcblxuKGZ1bmN0aW9uKFVJKSB7XG5cbiAgICBcInVzZSBzdHJpY3RcIjtcblxuICAgIHZhciBBbmltYXRpb25zO1xuXG4gICAgVUkuY29tcG9uZW50KCdzd2l0Y2hlcicsIHtcblxuICAgICAgICBkZWZhdWx0czoge1xuICAgICAgICAgICAgY29ubmVjdCAgIDogZmFsc2UsXG4gICAgICAgICAgICB0b2dnbGUgICAgOiAnPionLFxuICAgICAgICAgICAgYWN0aXZlICAgIDogMCxcbiAgICAgICAgICAgIGFuaW1hdGlvbiA6IGZhbHNlLFxuICAgICAgICAgICAgZHVyYXRpb24gIDogMjAwLFxuICAgICAgICAgICAgc3dpcGluZyAgIDogdHJ1ZVxuICAgICAgICB9LFxuXG4gICAgICAgIGFuaW1hdGluZzogZmFsc2UsXG5cbiAgICAgICAgYm9vdDogZnVuY3Rpb24oKSB7XG5cbiAgICAgICAgICAgIC8vIGluaXQgY29kZVxuICAgICAgICAgICAgVUkucmVhZHkoZnVuY3Rpb24oY29udGV4dCkge1xuXG4gICAgICAgICAgICAgICAgVUkuJCgnW2RhdGEtdWstc3dpdGNoZXJdJywgY29udGV4dCkuZWFjaChmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyIHN3aXRjaGVyID0gVUkuJCh0aGlzKTtcblxuICAgICAgICAgICAgICAgICAgICBpZiAoIXN3aXRjaGVyLmRhdGEoJ3N3aXRjaGVyJykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBvYmogPSBVSS5zd2l0Y2hlcihzd2l0Y2hlciwgVUkuVXRpbHMub3B0aW9ucyhzd2l0Y2hlci5hdHRyKCdkYXRhLXVrLXN3aXRjaGVyJykpKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgaW5pdDogZnVuY3Rpb24oKSB7XG5cbiAgICAgICAgICAgIHZhciAkdGhpcyA9IHRoaXM7XG5cbiAgICAgICAgICAgIHRoaXMub24oJ2NsaWNrLnVrLnN3aXRjaGVyJywgdGhpcy5vcHRpb25zLnRvZ2dsZSwgZnVuY3Rpb24oZSkge1xuICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICAkdGhpcy5zaG93KHRoaXMpO1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIGlmICghdGhpcy5vcHRpb25zLmNvbm5lY3QpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMuY29ubmVjdCA9IFVJLiQodGhpcy5vcHRpb25zLmNvbm5lY3QpO1xuXG4gICAgICAgICAgICBpZiAoIXRoaXMuY29ubmVjdC5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMuY29ubmVjdC5vbignY2xpY2sudWsuc3dpdGNoZXInLCAnW2RhdGEtdWstc3dpdGNoZXItaXRlbV0nLCBmdW5jdGlvbihlKSB7XG5cbiAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG5cbiAgICAgICAgICAgICAgICB2YXIgaXRlbSA9IFVJLiQodGhpcykuYXR0cignZGF0YS11ay1zd2l0Y2hlci1pdGVtJyk7XG5cbiAgICAgICAgICAgICAgICBpZiAoJHRoaXMuaW5kZXggPT0gaXRlbSkgcmV0dXJuO1xuXG4gICAgICAgICAgICAgICAgc3dpdGNoKGl0ZW0pIHtcbiAgICAgICAgICAgICAgICAgICAgY2FzZSAnbmV4dCc6XG4gICAgICAgICAgICAgICAgICAgIGNhc2UgJ3ByZXZpb3VzJzpcbiAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLnNob3coJHRoaXMuaW5kZXggKyAoaXRlbT09J25leHQnID8gMTotMSkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6XG4gICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy5zaG93KHBhcnNlSW50KGl0ZW0sIDEwKSk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMuc3dpcGluZykge1xuXG4gICAgICAgICAgICAgICAgdGhpcy5jb25uZWN0Lm9uKCdzd2lwZVJpZ2h0IHN3aXBlTGVmdCcsIGZ1bmN0aW9uKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgICAgICAgICBpZiAoIXdpbmRvdy5nZXRTZWxlY3Rpb24oKS50b1N0cmluZygpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAkdGhpcy5zaG93KCR0aGlzLmluZGV4ICsgKGUudHlwZSA9PSAnc3dpcGVMZWZ0JyA/IDEgOiAtMSkpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMudXBkYXRlKCk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgdXBkYXRlOiBmdW5jdGlvbigpIHtcblxuICAgICAgICAgICAgdGhpcy5jb25uZWN0LmNoaWxkcmVuKCkucmVtb3ZlQ2xhc3MoJ3VrLWFjdGl2ZScpLmF0dHIoJ2FyaWEtaGlkZGVuJywgJ3RydWUnKTtcblxuICAgICAgICAgICAgdmFyIHRvZ2dsZXMgPSB0aGlzLmZpbmQodGhpcy5vcHRpb25zLnRvZ2dsZSksXG4gICAgICAgICAgICAgICAgYWN0aXZlICA9IHRvZ2dsZXMuZmlsdGVyKCcudWstYWN0aXZlJyk7XG5cbiAgICAgICAgICAgIGlmIChhY3RpdmUubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zaG93KGFjdGl2ZSwgZmFsc2UpO1xuICAgICAgICAgICAgfSBlbHNlIHtcblxuICAgICAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMuYWN0aXZlPT09ZmFsc2UpIHJldHVybjtcblxuICAgICAgICAgICAgICAgIGFjdGl2ZSA9IHRvZ2dsZXMuZXEodGhpcy5vcHRpb25zLmFjdGl2ZSk7XG4gICAgICAgICAgICAgICAgdGhpcy5zaG93KGFjdGl2ZS5sZW5ndGggPyBhY3RpdmUgOiB0b2dnbGVzLmVxKDApLCBmYWxzZSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIEluaXQgQVJJQSBmb3IgdG9nZ2xlc1xuICAgICAgICAgICAgdG9nZ2xlcy5ub3QoYWN0aXZlKS5hdHRyKCdhcmlhLWV4cGFuZGVkJywgJ2ZhbHNlJyk7XG4gICAgICAgICAgICBhY3RpdmUuYXR0cignYXJpYS1leHBhbmRlZCcsICd0cnVlJyk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgc2hvdzogZnVuY3Rpb24odGFiLCBhbmltYXRlKSB7XG5cbiAgICAgICAgICAgIGlmICh0aGlzLmFuaW1hdGluZykge1xuICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdmFyIHRvZ2dsZXMgPSB0aGlzLmZpbmQodGhpcy5vcHRpb25zLnRvZ2dsZSk7XG5cbiAgICAgICAgICAgIGlmIChpc05hTih0YWIpKSB7XG4gICAgICAgICAgICAgICAgdGFiID0gVUkuJCh0YWIpO1xuICAgICAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgICAgICB0YWIgPSB0YWIgPCAwID8gdG9nZ2xlcy5sZW5ndGgtMSA6IHRhYjtcbiAgICAgICAgICAgICAgICB0YWIgPSB0b2dnbGVzLmVxKHRvZ2dsZXNbdGFiXSA/IHRhYiA6IDApO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB2YXIgJHRoaXMgICAgID0gdGhpcyxcbiAgICAgICAgICAgICAgICBhY3RpdmUgICAgPSBVSS4kKHRhYiksXG4gICAgICAgICAgICAgICAgYW5pbWF0aW9uID0gQW5pbWF0aW9uc1t0aGlzLm9wdGlvbnMuYW5pbWF0aW9uXSB8fCBmdW5jdGlvbihjdXJyZW50LCBuZXh0KSB7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKCEkdGhpcy5vcHRpb25zLmFuaW1hdGlvbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEFuaW1hdGlvbnMubm9uZS5hcHBseSgkdGhpcyk7XG4gICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICB2YXIgYW5pbSA9ICR0aGlzLm9wdGlvbnMuYW5pbWF0aW9uLnNwbGl0KCcsJyk7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKGFuaW0ubGVuZ3RoID09IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGFuaW1bMV0gPSBhbmltWzBdO1xuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgYW5pbVswXSA9IGFuaW1bMF0udHJpbSgpO1xuICAgICAgICAgICAgICAgICAgICBhbmltWzFdID0gYW5pbVsxXS50cmltKCk7XG5cbiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvcmVBbmltYXRpb24uYXBwbHkoJHRoaXMsIFthbmltLCBjdXJyZW50LCBuZXh0XSk7XG4gICAgICAgICAgICAgICAgfTtcblxuICAgICAgICAgICAgaWYgKGFuaW1hdGU9PT1mYWxzZSB8fCAhVUkuc3VwcG9ydC5hbmltYXRpb24pIHtcbiAgICAgICAgICAgICAgICBhbmltYXRpb24gPSBBbmltYXRpb25zLm5vbmU7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmIChhY3RpdmUuaGFzQ2xhc3MoXCJ1ay1kaXNhYmxlZFwiKSkgcmV0dXJuO1xuXG4gICAgICAgICAgICAvLyBVcGRhdGUgQVJJQSBmb3IgVG9nZ2xlc1xuICAgICAgICAgICAgdG9nZ2xlcy5hdHRyKCdhcmlhLWV4cGFuZGVkJywgJ2ZhbHNlJyk7XG4gICAgICAgICAgICBhY3RpdmUuYXR0cignYXJpYS1leHBhbmRlZCcsICd0cnVlJyk7XG5cbiAgICAgICAgICAgIHRvZ2dsZXMuZmlsdGVyKFwiLnVrLWFjdGl2ZVwiKS5yZW1vdmVDbGFzcyhcInVrLWFjdGl2ZVwiKTtcbiAgICAgICAgICAgIGFjdGl2ZS5hZGRDbGFzcyhcInVrLWFjdGl2ZVwiKTtcblxuICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5jb25uZWN0ICYmIHRoaXMuY29ubmVjdC5sZW5ndGgpIHtcblxuICAgICAgICAgICAgICAgIHRoaXMuaW5kZXggPSB0aGlzLmZpbmQodGhpcy5vcHRpb25zLnRvZ2dsZSkuaW5kZXgoYWN0aXZlKTtcblxuICAgICAgICAgICAgICAgIGlmICh0aGlzLmluZGV4ID09IC0xICkge1xuICAgICAgICAgICAgICAgICAgICB0aGlzLmluZGV4ID0gMDtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICB0aGlzLmNvbm5lY3QuZWFjaChmdW5jdGlvbigpIHtcblxuICAgICAgICAgICAgICAgICAgICB2YXIgY29udGFpbmVyID0gVUkuJCh0aGlzKSxcbiAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkcmVuICA9IFVJLiQoY29udGFpbmVyLmNoaWxkcmVuKCkpLFxuICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudCAgID0gVUkuJChjaGlsZHJlbi5maWx0ZXIoJy51ay1hY3RpdmUnKSksXG4gICAgICAgICAgICAgICAgICAgICAgICBuZXh0ICAgICAgPSBVSS4kKGNoaWxkcmVuLmVxKCR0aGlzLmluZGV4KSk7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLmFuaW1hdGluZyA9IHRydWU7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGFuaW1hdGlvbi5hcHBseSgkdGhpcywgW2N1cnJlbnQsIG5leHRdKS50aGVuKGZ1bmN0aW9uKCl7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdXJyZW50LnJlbW92ZUNsYXNzKFwidWstYWN0aXZlXCIpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5leHQuYWRkQ2xhc3MoXCJ1ay1hY3RpdmVcIik7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBVcGRhdGUgQVJJQSBmb3IgY29ubmVjdFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN1cnJlbnQuYXR0cignYXJpYS1oaWRkZW4nLCAndHJ1ZScpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5leHQuYXR0cignYXJpYS1oaWRkZW4nLCAnZmFsc2UnKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVJLlV0aWxzLmNoZWNrRGlzcGxheShuZXh0LCB0cnVlKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICR0aGlzLmFuaW1hdGluZyA9IGZhbHNlO1xuXG4gICAgICAgICAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy50cmlnZ2VyKFwic2hvdy51ay5zd2l0Y2hlclwiLCBbYWN0aXZlXSk7XG4gICAgICAgIH1cbiAgICB9KTtcblxuICAgIEFuaW1hdGlvbnMgPSB7XG5cbiAgICAgICAgJ25vbmUnOiBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHZhciBkID0gVUkuJC5EZWZlcnJlZCgpO1xuICAgICAgICAgICAgZC5yZXNvbHZlKCk7XG4gICAgICAgICAgICByZXR1cm4gZC5wcm9taXNlKCk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgJ2ZhZGUnOiBmdW5jdGlvbihjdXJyZW50LCBuZXh0KSB7XG4gICAgICAgICAgICByZXR1cm4gY29yZUFuaW1hdGlvbi5hcHBseSh0aGlzLCBbJ3VrLWFuaW1hdGlvbi1mYWRlJywgY3VycmVudCwgbmV4dF0pO1xuICAgICAgICB9LFxuXG4gICAgICAgICdzbGlkZS1ib3R0b20nOiBmdW5jdGlvbihjdXJyZW50LCBuZXh0KSB7XG4gICAgICAgICAgICByZXR1cm4gY29yZUFuaW1hdGlvbi5hcHBseSh0aGlzLCBbJ3VrLWFuaW1hdGlvbi1zbGlkZS1ib3R0b20nLCBjdXJyZW50LCBuZXh0XSk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgJ3NsaWRlLXRvcCc6IGZ1bmN0aW9uKGN1cnJlbnQsIG5leHQpIHtcbiAgICAgICAgICAgIHJldHVybiBjb3JlQW5pbWF0aW9uLmFwcGx5KHRoaXMsIFsndWstYW5pbWF0aW9uLXNsaWRlLXRvcCcsIGN1cnJlbnQsIG5leHRdKTtcbiAgICAgICAgfSxcblxuICAgICAgICAnc2xpZGUtdmVydGljYWwnOiBmdW5jdGlvbihjdXJyZW50LCBuZXh0LCBkaXIpIHtcblxuICAgICAgICAgICAgdmFyIGFuaW0gPSBbJ3VrLWFuaW1hdGlvbi1zbGlkZS10b3AnLCAndWstYW5pbWF0aW9uLXNsaWRlLWJvdHRvbSddO1xuXG4gICAgICAgICAgICBpZiAoY3VycmVudCAmJiBjdXJyZW50LmluZGV4KCkgPiBuZXh0LmluZGV4KCkpIHtcbiAgICAgICAgICAgICAgICBhbmltLnJldmVyc2UoKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIGNvcmVBbmltYXRpb24uYXBwbHkodGhpcywgW2FuaW0sIGN1cnJlbnQsIG5leHRdKTtcbiAgICAgICAgfSxcblxuICAgICAgICAnc2xpZGUtbGVmdCc6IGZ1bmN0aW9uKGN1cnJlbnQsIG5leHQpIHtcbiAgICAgICAgICAgIHJldHVybiBjb3JlQW5pbWF0aW9uLmFwcGx5KHRoaXMsIFsndWstYW5pbWF0aW9uLXNsaWRlLWxlZnQnLCBjdXJyZW50LCBuZXh0XSk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgJ3NsaWRlLXJpZ2h0JzogZnVuY3Rpb24oY3VycmVudCwgbmV4dCkge1xuICAgICAgICAgICAgcmV0dXJuIGNvcmVBbmltYXRpb24uYXBwbHkodGhpcywgWyd1ay1hbmltYXRpb24tc2xpZGUtcmlnaHQnLCBjdXJyZW50LCBuZXh0XSk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgJ3NsaWRlLWhvcml6b250YWwnOiBmdW5jdGlvbihjdXJyZW50LCBuZXh0LCBkaXIpIHtcblxuICAgICAgICAgICAgdmFyIGFuaW0gPSBbJ3VrLWFuaW1hdGlvbi1zbGlkZS1yaWdodCcsICd1ay1hbmltYXRpb24tc2xpZGUtbGVmdCddO1xuXG4gICAgICAgICAgICBpZiAoY3VycmVudCAmJiBjdXJyZW50LmluZGV4KCkgPiBuZXh0LmluZGV4KCkpIHtcbiAgICAgICAgICAgICAgICBhbmltLnJldmVyc2UoKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgcmV0dXJuIGNvcmVBbmltYXRpb24uYXBwbHkodGhpcywgW2FuaW0sIGN1cnJlbnQsIG5leHRdKTtcbiAgICAgICAgfSxcblxuICAgICAgICAnc2NhbGUnOiBmdW5jdGlvbihjdXJyZW50LCBuZXh0KSB7XG4gICAgICAgICAgICByZXR1cm4gY29yZUFuaW1hdGlvbi5hcHBseSh0aGlzLCBbJ3VrLWFuaW1hdGlvbi1zY2FsZS11cCcsIGN1cnJlbnQsIG5leHRdKTtcbiAgICAgICAgfVxuICAgIH07XG5cbiAgICBVSS5zd2l0Y2hlci5hbmltYXRpb25zID0gQW5pbWF0aW9ucztcblxuXG4gICAgLy8gaGVscGVyc1xuXG4gICAgZnVuY3Rpb24gY29yZUFuaW1hdGlvbihjbHMsIGN1cnJlbnQsIG5leHQpIHtcblxuICAgICAgICB2YXIgZCA9IFVJLiQuRGVmZXJyZWQoKSwgY2xzSW4gPSBjbHMsIGNsc091dCA9IGNscywgcmVsZWFzZTtcblxuICAgICAgICBpZiAobmV4dFswXT09PWN1cnJlbnRbMF0pIHtcbiAgICAgICAgICAgIGQucmVzb2x2ZSgpO1xuICAgICAgICAgICAgcmV0dXJuIGQucHJvbWlzZSgpO1xuICAgICAgICB9XG5cbiAgICAgICAgaWYgKHR5cGVvZihjbHMpID09ICdvYmplY3QnKSB7XG4gICAgICAgICAgICBjbHNJbiAgPSBjbHNbMF07XG4gICAgICAgICAgICBjbHNPdXQgPSBjbHNbMV0gfHwgY2xzWzBdO1xuICAgICAgICB9XG5cbiAgICAgICAgVUkuJGJvZHkuY3NzKCdvdmVyZmxvdy14JywgJ2hpZGRlbicpOyAvLyBmaXggc2Nyb2xsIGp1bXBpbmcgaW4gaU9TXG5cbiAgICAgICAgcmVsZWFzZSA9IGZ1bmN0aW9uKCkge1xuXG4gICAgICAgICAgICBpZiAoY3VycmVudCkgY3VycmVudC5oaWRlKCkucmVtb3ZlQ2xhc3MoJ3VrLWFjdGl2ZSAnK2Nsc091dCsnIHVrLWFuaW1hdGlvbi1yZXZlcnNlJyk7XG5cbiAgICAgICAgICAgIG5leHQuYWRkQ2xhc3MoY2xzSW4pLm9uZShVSS5zdXBwb3J0LmFuaW1hdGlvbi5lbmQsIGZ1bmN0aW9uKCkge1xuXG4gICAgICAgICAgICAgICAgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgIG5leHQucmVtb3ZlQ2xhc3MoJycrY2xzSW4rJycpLmNzcyh7b3BhY2l0eTonJywgZGlzcGxheTonJ30pO1xuICAgICAgICAgICAgICAgIH0sIDApO1xuXG4gICAgICAgICAgICAgICAgZC5yZXNvbHZlKCk7XG5cbiAgICAgICAgICAgICAgICBVSS4kYm9keS5jc3MoJ292ZXJmbG93LXgnLCAnJyk7XG5cbiAgICAgICAgICAgICAgICBpZiAoY3VycmVudCkgY3VycmVudC5jc3Moe29wYWNpdHk6JycsIGRpc3BsYXk6Jyd9KTtcblxuICAgICAgICAgICAgfS5iaW5kKHRoaXMpKS5zaG93KCk7XG4gICAgICAgIH07XG5cbiAgICAgICAgbmV4dC5jc3MoJ2FuaW1hdGlvbi1kdXJhdGlvbicsIHRoaXMub3B0aW9ucy5kdXJhdGlvbisnbXMnKTtcblxuICAgICAgICBpZiAoY3VycmVudCAmJiBjdXJyZW50Lmxlbmd0aCkge1xuXG4gICAgICAgICAgICBjdXJyZW50LmNzcygnYW5pbWF0aW9uLWR1cmF0aW9uJywgdGhpcy5vcHRpb25zLmR1cmF0aW9uKydtcycpO1xuXG4gICAgICAgICAgICBjdXJyZW50LmNzcygnZGlzcGxheScsICdub25lJykuYWRkQ2xhc3MoY2xzT3V0KycgdWstYW5pbWF0aW9uLXJldmVyc2UnKS5vbmUoVUkuc3VwcG9ydC5hbmltYXRpb24uZW5kLCBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgICAgICByZWxlYXNlKCk7XG4gICAgICAgICAgICB9LmJpbmQodGhpcykpLmNzcygnZGlzcGxheScsICcnKTtcblxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgbmV4dC5hZGRDbGFzcygndWstYWN0aXZlJyk7XG4gICAgICAgICAgICByZWxlYXNlKCk7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gZC5wcm9taXNlKCk7XG4gICAgfVxuXG59KShVSWtpdDIpO1xuXG4oZnVuY3Rpb24oVUkpIHtcblxuICAgIFwidXNlIHN0cmljdFwiO1xuXG4gICAgVUkuY29tcG9uZW50KCd0YWInLCB7XG5cbiAgICAgICAgZGVmYXVsdHM6IHtcbiAgICAgICAgICAgIHRhcmdldCAgICA6ICc+bGk6bm90KC51ay10YWItcmVzcG9uc2l2ZSwgLnVrLWRpc2FibGVkKScsXG4gICAgICAgICAgICBjb25uZWN0ICAgOiBmYWxzZSxcbiAgICAgICAgICAgIGFjdGl2ZSAgICA6IDAsXG4gICAgICAgICAgICBhbmltYXRpb24gOiBmYWxzZSxcbiAgICAgICAgICAgIGR1cmF0aW9uICA6IDIwMCxcbiAgICAgICAgICAgIHN3aXBpbmcgICA6IHRydWVcbiAgICAgICAgfSxcblxuICAgICAgICBib290OiBmdW5jdGlvbigpIHtcblxuICAgICAgICAgICAgLy8gaW5pdCBjb2RlXG4gICAgICAgICAgICBVSS5yZWFkeShmdW5jdGlvbihjb250ZXh0KSB7XG5cbiAgICAgICAgICAgICAgICBVSS4kKCdbZGF0YS11ay10YWJdJywgY29udGV4dCkuZWFjaChmdW5jdGlvbigpIHtcblxuICAgICAgICAgICAgICAgICAgICB2YXIgdGFiID0gVUkuJCh0aGlzKTtcblxuICAgICAgICAgICAgICAgICAgICBpZiAoIXRhYi5kYXRhKCd0YWInKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIG9iaiA9IFVJLnRhYih0YWIsIFVJLlV0aWxzLm9wdGlvbnModGFiLmF0dHIoJ2RhdGEtdWstdGFiJykpKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuICAgICAgICAgICAgfSk7XG4gICAgICAgIH0sXG5cbiAgICAgICAgaW5pdDogZnVuY3Rpb24oKSB7XG5cbiAgICAgICAgICAgIHZhciAkdGhpcyA9IHRoaXM7XG5cbiAgICAgICAgICAgIHRoaXMuY3VycmVudCA9IGZhbHNlO1xuXG4gICAgICAgICAgICB0aGlzLm9uKCdjbGljay51ay50YWInLCB0aGlzLm9wdGlvbnMudGFyZ2V0LCBmdW5jdGlvbihlKSB7XG5cbiAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG5cbiAgICAgICAgICAgICAgICBpZiAoJHRoaXMuc3dpdGNoZXIgJiYgJHRoaXMuc3dpdGNoZXIuYW5pbWF0aW5nKSB7XG4gICAgICAgICAgICAgICAgICAgIHJldHVybjtcbiAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICB2YXIgY3VycmVudCA9ICR0aGlzLmZpbmQoJHRoaXMub3B0aW9ucy50YXJnZXQpLm5vdCh0aGlzKTtcblxuICAgICAgICAgICAgICAgIGN1cnJlbnQucmVtb3ZlQ2xhc3MoJ3VrLWFjdGl2ZScpLmJsdXIoKTtcblxuICAgICAgICAgICAgICAgICR0aGlzLnRyaWdnZXIoJ2NoYW5nZS51ay50YWInLCBbVUkuJCh0aGlzKS5hZGRDbGFzcygndWstYWN0aXZlJyksICR0aGlzLmN1cnJlbnRdKTtcblxuICAgICAgICAgICAgICAgICR0aGlzLmN1cnJlbnQgPSBVSS4kKHRoaXMpO1xuXG4gICAgICAgICAgICAgICAgLy8gVXBkYXRlIEFSSUFcbiAgICAgICAgICAgICAgICBpZiAoISR0aGlzLm9wdGlvbnMuY29ubmVjdCkge1xuICAgICAgICAgICAgICAgICAgICBjdXJyZW50LmF0dHIoJ2FyaWEtZXhwYW5kZWQnLCAnZmFsc2UnKTtcbiAgICAgICAgICAgICAgICAgICAgVUkuJCh0aGlzKS5hdHRyKCdhcmlhLWV4cGFuZGVkJywgJ3RydWUnKTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgaWYgKHRoaXMub3B0aW9ucy5jb25uZWN0KSB7XG4gICAgICAgICAgICAgICAgdGhpcy5jb25uZWN0ID0gVUkuJCh0aGlzLm9wdGlvbnMuY29ubmVjdCk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIGluaXQgcmVzcG9uc2l2ZSB0YWJcbiAgICAgICAgICAgIHRoaXMucmVzcG9uc2l2ZXRhYiA9IFVJLiQoJzxsaSBjbGFzcz1cInVrLXRhYi1yZXNwb25zaXZlIHVrLWFjdGl2ZVwiPjxhPjwvYT48L2xpPicpLmFwcGVuZCgnPGRpdiBjbGFzcz1cInVrLWRyb3Bkb3duIHVrLWRyb3Bkb3duLXNtYWxsXCI+PHVsIGNsYXNzPVwidWstbmF2IHVrLW5hdi1kcm9wZG93blwiPjwvdWw+PGRpdj4nKTtcblxuICAgICAgICAgICAgdGhpcy5yZXNwb25zaXZldGFiLmRyb3Bkb3duID0gdGhpcy5yZXNwb25zaXZldGFiLmZpbmQoJy51ay1kcm9wZG93bicpO1xuICAgICAgICAgICAgdGhpcy5yZXNwb25zaXZldGFiLmxzdCAgICAgID0gdGhpcy5yZXNwb25zaXZldGFiLmRyb3Bkb3duLmZpbmQoJ3VsJyk7XG4gICAgICAgICAgICB0aGlzLnJlc3BvbnNpdmV0YWIuY2FwdGlvbiAgPSB0aGlzLnJlc3BvbnNpdmV0YWIuZmluZCgnYTpmaXJzdCcpO1xuXG4gICAgICAgICAgICBpZiAodGhpcy5lbGVtZW50Lmhhc0NsYXNzKCd1ay10YWItYm90dG9tJykpIHRoaXMucmVzcG9uc2l2ZXRhYi5kcm9wZG93bi5hZGRDbGFzcygndWstZHJvcGRvd24tdXAnKTtcblxuICAgICAgICAgICAgLy8gaGFuZGxlIGNsaWNrXG4gICAgICAgICAgICB0aGlzLnJlc3BvbnNpdmV0YWIubHN0Lm9uKCdjbGljay51ay50YWInLCAnYScsIGZ1bmN0aW9uKGUpIHtcblxuICAgICAgICAgICAgICAgIGUucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICBlLnN0b3BQcm9wYWdhdGlvbigpO1xuXG4gICAgICAgICAgICAgICAgdmFyIGxpbmsgPSBVSS4kKHRoaXMpO1xuXG4gICAgICAgICAgICAgICAgJHRoaXMuZWxlbWVudC5jaGlsZHJlbignbGk6bm90KC51ay10YWItcmVzcG9uc2l2ZSknKS5lcShsaW5rLmRhdGEoJ2luZGV4JykpLnRyaWdnZXIoJ2NsaWNrJyk7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgdGhpcy5vbignc2hvdy51ay5zd2l0Y2hlciBjaGFuZ2UudWsudGFiJywgZnVuY3Rpb24oZSwgdGFiKSB7XG4gICAgICAgICAgICAgICAgJHRoaXMucmVzcG9uc2l2ZXRhYi5jYXB0aW9uLmh0bWwodGFiLnRleHQoKSk7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgdGhpcy5lbGVtZW50LmFwcGVuZCh0aGlzLnJlc3BvbnNpdmV0YWIpO1xuXG4gICAgICAgICAgICAvLyBpbml0IFVJa2l0IGNvbXBvbmVudHNcbiAgICAgICAgICAgIGlmICh0aGlzLm9wdGlvbnMuY29ubmVjdCkge1xuXG4gICAgICAgICAgICAgICAgdGhpcy5zd2l0Y2hlciA9IFVJLnN3aXRjaGVyKHRoaXMuZWxlbWVudCwge1xuICAgICAgICAgICAgICAgICAgICB0b2dnbGUgICAgOiAnPmxpOm5vdCgudWstdGFiLXJlc3BvbnNpdmUpJyxcbiAgICAgICAgICAgICAgICAgICAgY29ubmVjdCAgIDogdGhpcy5vcHRpb25zLmNvbm5lY3QsXG4gICAgICAgICAgICAgICAgICAgIGFjdGl2ZSAgICA6IHRoaXMub3B0aW9ucy5hY3RpdmUsXG4gICAgICAgICAgICAgICAgICAgIGFuaW1hdGlvbiA6IHRoaXMub3B0aW9ucy5hbmltYXRpb24sXG4gICAgICAgICAgICAgICAgICAgIGR1cmF0aW9uICA6IHRoaXMub3B0aW9ucy5kdXJhdGlvbixcbiAgICAgICAgICAgICAgICAgICAgc3dpcGluZyAgIDogdGhpcy5vcHRpb25zLnN3aXBpbmdcbiAgICAgICAgICAgICAgICB9KTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgVUkuZHJvcGRvd24odGhpcy5yZXNwb25zaXZldGFiLCB7bW9kZTogJ2NsaWNrJywgcHJldmVudGZsaXA6ICd5J30pO1xuXG4gICAgICAgICAgICAvLyBpbml0XG4gICAgICAgICAgICAkdGhpcy50cmlnZ2VyKCdjaGFuZ2UudWsudGFiJywgW3RoaXMuZWxlbWVudC5maW5kKHRoaXMub3B0aW9ucy50YXJnZXQpLm5vdCgnLnVrLXRhYi1yZXNwb25zaXZlJykuZmlsdGVyKCcudWstYWN0aXZlJyldKTtcblxuICAgICAgICAgICAgdGhpcy5jaGVjaygpO1xuXG4gICAgICAgICAgICBVSS4kd2luLm9uKCdyZXNpemUgb3JpZW50YXRpb25jaGFuZ2UnLCBVSS5VdGlscy5kZWJvdW5jZShmdW5jdGlvbigpe1xuICAgICAgICAgICAgICAgIGlmICgkdGhpcy5lbGVtZW50LmlzKCc6dmlzaWJsZScpKSAgJHRoaXMuY2hlY2soKTtcbiAgICAgICAgICAgIH0sIDEwMCkpO1xuXG4gICAgICAgICAgICB0aGlzLm9uKCdkaXNwbGF5LnVrLmNoZWNrJywgZnVuY3Rpb24oKXtcbiAgICAgICAgICAgICAgICBpZiAoJHRoaXMuZWxlbWVudC5pcygnOnZpc2libGUnKSkgICR0aGlzLmNoZWNrKCk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSxcblxuICAgICAgICBjaGVjazogZnVuY3Rpb24oKSB7XG5cbiAgICAgICAgICAgIHZhciBjaGlsZHJlbiA9IHRoaXMuZWxlbWVudC5jaGlsZHJlbignbGk6bm90KC51ay10YWItcmVzcG9uc2l2ZSknKS5yZW1vdmVDbGFzcygndWstaGlkZGVuJyk7XG5cbiAgICAgICAgICAgIGlmICghY2hpbGRyZW4ubGVuZ3RoKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5yZXNwb25zaXZldGFiLmFkZENsYXNzKCd1ay1oaWRkZW4nKTtcbiAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHZhciB0b3AgICAgICAgICAgPSAoY2hpbGRyZW4uZXEoMCkub2Zmc2V0KCkudG9wICsgTWF0aC5jZWlsKGNoaWxkcmVuLmVxKDApLmhlaWdodCgpLzIpKSxcbiAgICAgICAgICAgICAgICBkb3Jlc3BvbnNpdmUgPSBmYWxzZSxcbiAgICAgICAgICAgICAgICBpdGVtLCBsaW5rLCBjbG9uZTtcblxuICAgICAgICAgICAgdGhpcy5yZXNwb25zaXZldGFiLmxzdC5lbXB0eSgpO1xuXG4gICAgICAgICAgICBjaGlsZHJlbi5lYWNoKGZ1bmN0aW9uKCl7XG5cbiAgICAgICAgICAgICAgICBpZiAoVUkuJCh0aGlzKS5vZmZzZXQoKS50b3AgPiB0b3ApIHtcbiAgICAgICAgICAgICAgICAgICAgZG9yZXNwb25zaXZlID0gdHJ1ZTtcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgaWYgKGRvcmVzcG9uc2l2ZSkge1xuXG4gICAgICAgICAgICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBjaGlsZHJlbi5sZW5ndGg7IGkrKykge1xuXG4gICAgICAgICAgICAgICAgICAgIGl0ZW0gID0gVUkuJChjaGlsZHJlbi5lcShpKSk7XG4gICAgICAgICAgICAgICAgICAgIGxpbmsgID0gaXRlbS5maW5kKCdhJyk7XG5cbiAgICAgICAgICAgICAgICAgICAgaWYgKGl0ZW0uY3NzKCdmbG9hdCcpICE9ICdub25lJyAmJiAhaXRlbS5hdHRyKCd1ay1kcm9wZG93bicpKSB7XG5cbiAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaXRlbS5oYXNDbGFzcygndWstZGlzYWJsZWQnKSkge1xuXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xvbmUgPSBVSS4kKGl0ZW1bMF0ub3V0ZXJIVE1MKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbG9uZS5maW5kKCdhJykuZGF0YSgnaW5kZXgnLCBpKTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMucmVzcG9uc2l2ZXRhYi5sc3QuYXBwZW5kKGNsb25lKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgICAgICAgICAgICAgaXRlbS5hZGRDbGFzcygndWstaGlkZGVuJyk7XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHRoaXMucmVzcG9uc2l2ZXRhYlt0aGlzLnJlc3BvbnNpdmV0YWIubHN0LmNoaWxkcmVuKCdsaScpLmxlbmd0aCA/ICdyZW1vdmVDbGFzcyc6J2FkZENsYXNzJ10oJ3VrLWhpZGRlbicpO1xuICAgICAgICB9XG4gICAgfSk7XG5cbn0pKFVJa2l0Mik7XG5cbihmdW5jdGlvbihVSSl7XG5cbiAgICBcInVzZSBzdHJpY3RcIjtcblxuICAgIFVJLmNvbXBvbmVudCgnY292ZXInLCB7XG5cbiAgICAgICAgZGVmYXVsdHM6IHtcbiAgICAgICAgICAgIGF1dG9tdXRlIDogdHJ1ZVxuICAgICAgICB9LFxuXG4gICAgICAgIGJvb3Q6IGZ1bmN0aW9uKCkge1xuXG4gICAgICAgICAgICAvLyBhdXRvIGluaXRcbiAgICAgICAgICAgIFVJLnJlYWR5KGZ1bmN0aW9uKGNvbnRleHQpIHtcblxuICAgICAgICAgICAgICAgIFVJLiQoJ1tkYXRhLXVrLWNvdmVyXScsIGNvbnRleHQpLmVhY2goZnVuY3Rpb24oKXtcblxuICAgICAgICAgICAgICAgICAgICB2YXIgZWxlID0gVUkuJCh0aGlzKTtcblxuICAgICAgICAgICAgICAgICAgICBpZighZWxlLmRhdGEoJ2NvdmVyJykpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHZhciBwbHVnaW4gPSBVSS5jb3ZlcihlbGUsIFVJLlV0aWxzLm9wdGlvbnMoZWxlLmF0dHIoJ2RhdGEtdWstY292ZXInKSkpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSxcblxuICAgICAgICBpbml0OiBmdW5jdGlvbigpIHtcblxuICAgICAgICAgICAgdGhpcy5wYXJlbnQgPSB0aGlzLmVsZW1lbnQucGFyZW50KCk7XG5cbiAgICAgICAgICAgIFVJLiR3aW4ub24oJ2xvYWQgcmVzaXplIG9yaWVudGF0aW9uY2hhbmdlJywgVUkuVXRpbHMuZGVib3VuY2UoZnVuY3Rpb24oKXtcbiAgICAgICAgICAgICAgICB0aGlzLmNoZWNrKCk7XG4gICAgICAgICAgICB9LmJpbmQodGhpcyksIDEwMCkpO1xuXG4gICAgICAgICAgICB0aGlzLm9uKCdkaXNwbGF5LnVrLmNoZWNrJywgZnVuY3Rpb24oZSkge1xuICAgICAgICAgICAgICAgIGlmICh0aGlzLmVsZW1lbnQuaXMoJzp2aXNpYmxlJykpIHRoaXMuY2hlY2soKTtcbiAgICAgICAgICAgIH0uYmluZCh0aGlzKSk7XG5cbiAgICAgICAgICAgIHRoaXMuY2hlY2soKTtcblxuICAgICAgICAgICAgaWYgKHRoaXMuZWxlbWVudC5pcygnaWZyYW1lJykgJiYgdGhpcy5vcHRpb25zLmF1dG9tdXRlKSB7XG5cbiAgICAgICAgICAgICAgICB2YXIgc3JjID0gdGhpcy5lbGVtZW50LmF0dHIoJ3NyYycpO1xuXG4gICAgICAgICAgICAgICAgdGhpcy5lbGVtZW50LmF0dHIoJ3NyYycsICcnKS5vbignbG9hZCcsIGZ1bmN0aW9uKCl7XG4gICAgICAgICAgICAgICAgICAgIHRoaXMuY29udGVudFdpbmRvdy5wb3N0TWVzc2FnZSgneyBcImV2ZW50XCI6IFwiY29tbWFuZFwiLCBcImZ1bmNcIjogXCJtdXRlXCIsIFwibWV0aG9kXCI6XCJzZXRWb2x1bWVcIiwgXCJ2YWx1ZVwiOjB9JywgJyonKTtcbiAgICAgICAgICAgICAgICB9KS5hdHRyKCdzcmMnLCBbc3JjLCAoc3JjLmluZGV4T2YoJz8nKSA+IC0xID8gJyYnOic/JyksICdlbmFibGVqc2FwaT0xJmFwaT0xJ10uam9pbignJykpO1xuICAgICAgICAgICAgfVxuICAgICAgICB9LFxuXG4gICAgICAgIGNoZWNrOiBmdW5jdGlvbigpIHtcblxuICAgICAgICAgICAgdGhpcy5lbGVtZW50LmNzcyh7IHdpZHRoICA6ICcnLCBoZWlnaHQgOiAnJyB9KTtcblxuICAgICAgICAgICAgdGhpcy5kaW1lbnNpb24gPSB7dzogdGhpcy5lbGVtZW50LndpZHRoKCksIGg6IHRoaXMuZWxlbWVudC5oZWlnaHQoKX07XG5cbiAgICAgICAgICAgIGlmICh0aGlzLmVsZW1lbnQuYXR0cignd2lkdGgnKSAmJiAhaXNOYU4odGhpcy5lbGVtZW50LmF0dHIoJ3dpZHRoJykpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5kaW1lbnNpb24udyA9IHRoaXMuZWxlbWVudC5hdHRyKCd3aWR0aCcpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZiAodGhpcy5lbGVtZW50LmF0dHIoJ2hlaWdodCcpICYmICFpc05hTih0aGlzLmVsZW1lbnQuYXR0cignaGVpZ2h0JykpKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5kaW1lbnNpb24uaCA9IHRoaXMuZWxlbWVudC5hdHRyKCdoZWlnaHQnKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgdGhpcy5yYXRpbyA9IHRoaXMuZGltZW5zaW9uLncgLyB0aGlzLmRpbWVuc2lvbi5oO1xuXG4gICAgICAgICAgICB2YXIgdyA9IHRoaXMucGFyZW50LndpZHRoKCksIGggPSB0aGlzLnBhcmVudC5oZWlnaHQoKSwgd2lkdGgsIGhlaWdodDtcblxuICAgICAgICAgICAgLy8gaWYgZWxlbWVudCBoZWlnaHQgPCBwYXJlbnQgaGVpZ2h0IChnYXAgdW5kZXJuZWF0aClcbiAgICAgICAgICAgIGlmICgodyAvIHRoaXMucmF0aW8pIDwgaCkge1xuXG4gICAgICAgICAgICAgICAgd2lkdGggID0gTWF0aC5jZWlsKGggKiB0aGlzLnJhdGlvKTtcbiAgICAgICAgICAgICAgICBoZWlnaHQgPSBoO1xuXG4gICAgICAgICAgICAvLyBlbGVtZW50IHdpZHRoIDwgcGFyZW50IHdpZHRoIChnYXAgdG8gcmlnaHQpXG4gICAgICAgICAgICB9IGVsc2Uge1xuXG4gICAgICAgICAgICAgICAgd2lkdGggID0gdztcbiAgICAgICAgICAgICAgICBoZWlnaHQgPSBNYXRoLmNlaWwodyAvIHRoaXMucmF0aW8pO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB0aGlzLmVsZW1lbnQuY3NzKHsgd2lkdGggIDogd2lkdGgsIGhlaWdodCA6IGhlaWdodCB9KTtcbiAgICAgICAgfVxuICAgIH0pO1xuXG59KShVSWtpdDIpO1xuIiwid2luZG93LiQgPSB3aW5kb3cualF1ZXJ5ID0gcmVxdWlyZSgnanF1ZXJ5Jyk7XG5cbi8vIHZlbmRvclxucmVxdWlyZSgnc3ZnNGV2ZXJ5Ym9keScpKCk7XG5yZXF1aXJlKCd1aWtpdCcpO1xuXG4vLyByZXF1aXJlKCcuL3ZlbmRvci91aWtpdC91aWtpdC5taW4nKTtcbnJlcXVpcmUoJy4vdmVuZG9yL3Vpa2l0L21vZGFsLm1pbicpO1xucmVxdWlyZSgnLi92ZW5kb3IvdWlraXQvbGlnaHRib3gubWluJyk7XG5yZXF1aXJlKCcuL3ZlbmRvci91aWtpdC9hY2NvcmRpb24ubWluJyk7XG5yZXF1aXJlKCcuL3ZlbmRvci91aWtpdC9zbGlkZXIubWluJyk7XG5yZXF1aXJlKCcuL3ZlbmRvci91aWtpdC9zbGlkZXNldC5taW4nKTtcbnJlcXVpcmUoJy4vdmVuZG9yL3Vpa2l0L3NsaWRlc2hvdy5taW4nKTtcbnJlcXVpcmUoJy4vdmVuZG9yL3Vpa2l0L3N0aWNreS5taW4nKTtcbnJlcXVpcmUoJy4vdmVuZG9yL3Vpa2l0L3Rvb2x0aXAubWluJyk7XG5cbnJlcXVpcmUoJy4vdmVuZG9yL293bC5jYXJvdXNlbCcpO1xucmVxdWlyZSgnLi92ZW5kb3Ivc2VsZWN0Mi5taW4nKTtcbnJlcXVpcmUoJy4vdmVuZG9yL3BpY3R1cmVmaWxsLm1pbicpO1xuXG4vLyBtb2R1bGVzXG5yZXF1aXJlKCcuL2NvbXBvbmVudHMvY2hhbmdlcicpO1xucmVxdWlyZSgnLi9jb21wb25lbnRzL3NsaWRlc2hvdycpO1xucmVxdWlyZSgnLi9jb21wb25lbnRzL3ZpZGVvJyk7XG5yZXF1aXJlKCcuL2NvbXBvbmVudHMvZmlsdGVyLWFjY29yZGlvbicpO1xucmVxdWlyZSgnLi9jb21wb25lbnRzL3N0aWNreS1oZWFkZXInKTtcbnJlcXVpcmUoJy4vY29tcG9uZW50cy9zdGlja3ktc3VibWVudScpO1xucmVxdWlyZSgnLi9jb21wb25lbnRzL3Ntb290aC1zY3JvbGwnKTtcbnJlcXVpcmUoJy4vY29tcG9uZW50cy9jbGVhcmFibGUtaW5wdXQnKTtcbnJlcXVpcmUoJy4vY29tcG9uZW50cy9Pd2xDb250cm9sJyk7XG5yZXF1aXJlKCcuL2NvbXBvbmVudHMvZXZlbnRzJyk7XG5yZXF1aXJlKCcuL2NvbXBvbmVudHMvZm9ybWhhbmRsZXInKTtcbnJlcXVpcmUoJy4vY29tcG9uZW50cy9zaGFyZXInKTtcbnJlcXVpcmUoJy4vY29tcG9uZW50cy90YWJsZScpO1xucmVxdWlyZSgnLi9jb21wb25lbnRzL3RvZ2dsZS1kb3dubG9hZC1idXR0b24nKTtcbnJlcXVpcmUoJy4vY29tcG9uZW50cy9tYXNvbnJ5LWxheW91dCcpO1xuXG4vLyBkb24ndCB1cGxvYWQhXG4vLyByZXF1aXJlKCcuL3ZlbmRvci9jb25maWd1cmF0b3InKTtcblxuXG4vLyBuZWVkcyByZWZhY3RvclxucmVxdWlyZSgnLi9zaGFtZScpO1xuIiwiKGZ1bmN0aW9uICgkLCB3aW5kb3csIGRvY3VtZW50LCB1bmRlZmluZWQpIHtcbiAgICAndXNlIHN0cmljdCc7XG5cbiAgICAvKlxuICAgICAqIENvbnN0cnVjdG9yXG4gICAgICovXG4gICAgdmFyIE93bENvbnRyb2wgPSBmdW5jdGlvbihlbGVtZW50LCBvcHRpb25zKSB7XG5cbiAgICAgICAgdGhpcy5lbGVtZW50ID0gZWxlbWVudDtcblxuICAgICAgICB0aGlzLiRlbGVtZW50ID0gJChlbGVtZW50KTtcblxuICAgICAgICB0aGlzLm9wdGlvbnMgPSBvcHRpb25zO1xuXG4gICAgICAgIHRoaXMubWV0YU9wdGlvbnMgPSB0aGlzLiRlbGVtZW50LmRhdGEoJ293bGNvbnRyb2wnKTtcblxuICAgICAgICB0aGlzLnNldHRpbmdzID0gJC5leHRlbmQoe30sIE93bENvbnRyb2wuRGVmYXVsdHMsIHRoaXMub3B0aW9ucywgdGhpcy5tZXRhT3B0aW9ucyk7XG5cbiAgICB9O1xuXG4gICAgLypcbiAgICAgKiBEZWZhdWx0c1xuICAgICAqL1xuICAgIE93bENvbnRyb2wuRGVmYXVsdHMgPSB7fTtcblxuICAgIC8qXG4gICAgICogSW5pdGlhbGl6ZVxuICAgICAqL1xuICAgIE93bENvbnRyb2wucHJvdG90eXBlLmluaXRpYWxpemUgPSBmdW5jdGlvbigpIHtcbiAgICAgICAgLy8gY29uc29sZS5sb2coJ2luaXRpYWxpemluZyBPd2xDb250cm9sJyk7XG5cbiAgICAgICAgLy8gY29uc29sZS5sb2codGhpcy5zZXR0aW5ncyk7XG5cbiAgICAgICAgdGhpcy4kZWxlbWVudC5vd2xDYXJvdXNlbCh0aGlzLnNldHRpbmdzKTtcbiAgICB9O1xuXG5cbiAgICAvKlxuICAgICAqIGpRdWVyeSBQbHVnaW4gUmVnaXN0ZXJcbiAgICAgKi9cbiAgICAkLmZuLm93bENvbnRyb2wgPSBmdW5jdGlvbihvcHRpb25zKSB7XG4gICAgICAgIHJldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICBuZXcgT3dsQ29udHJvbCh0aGlzLCBvcHRpb25zKS5pbml0aWFsaXplKCk7XG4gICAgICAgIH0pXG4gICAgfTtcblxufSkoalF1ZXJ5LCB3aW5kb3csIHdpbmRvdy5kb2N1bWVudCk7IiwiKGZ1bmN0aW9uKCQsIHdpbmRvdywgZG9jdW1lbnQsIHVuZGVmaW5lZCkge1xuICAgICd1c2Ugc3RyaWN0JztcblxuICAgIHZhciBDaGFuZ2VyID0gZnVuY3Rpb24oZWxlbWVudCwgb3B0aW9ucykge1xuICAgICAgICB2YXIgJHRoaXMgPSAkKHRoaXMpLFxuICAgICAgICAgICAgX3RoaXMgPSB0aGlzO1xuXG4gICAgICAgIHRoaXMuZWxlbWVudCA9ICQoZWxlbWVudCk7XG4gICAgICAgIHRoaXMub3B0aW9ucyA9ICQuZXh0ZW5kKHt9LCB0aGlzLmRlZmF1bHRzLCBvcHRpb25zKTtcblxuICAgICAgICB0aGlzLmVsZW1lbnQub24oJ21vdXNlZW50ZXInLCBmdW5jdGlvbihlKSB7XG4gICAgICAgICAgICBfdGhpcy5jaGFuZ2VNZWRpYSgpO1xuICAgICAgICB9KTtcbiAgICB9O1xuXG4gICAgJC5leHRlbmQoQ2hhbmdlci5wcm90b3R5cGUsIHtcblxuICAgICAgICBkZWZhdWx0czoge30sXG5cbiAgICAgICAgY2hhbmdlTWVkaWE6IGZ1bmN0aW9uKCkge1xuICAgICAgICAgICAgdGhpcy5lbGVtZW50LnBhcmVudHMoJy5qcy1wYW5lbC1zdG9yeScpLmZpbmQoJ3BpY3R1cmUgc291cmNlOmZpcnN0LWNoaWxkJykuYXR0cignc3Jjc2V0JywgdGhpcy5vcHRpb25zLnNyYyk7XG4gICAgICAgIH1cblxuICAgIH0pO1xuXG4gICAgLy8gaW5pdFxuICAgICQoZnVuY3Rpb24oKSB7XG4gICAgICAgICQoJ1tkYXRhLWNoYW5nZXJdJykuZWFjaChmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIHZhciBjaGFuZ2VyID0gJCh0aGlzKTtcbiAgICAgICAgICAgIG5ldyBDaGFuZ2VyKGNoYW5nZXIsIHRyYW5zZm9ybU9wdGlvbnMoY2hhbmdlci5kYXRhKCdjaGFuZ2VyJykpKTtcbiAgICAgICAgfSlcbiAgICB9KTtcblxuICAgIC8vIGhlbHBlclxuICAgIHZhciB0cmFuc2Zvcm1PcHRpb25zID0gZnVuY3Rpb24oc3RyaW5nKSB7XG5cbiAgICAgICAgaWYgKCQuaXNQbGFpbk9iamVjdChzdHJpbmcpKSByZXR1cm4gc3RyaW5nO1xuXG4gICAgICAgIHZhciBzdGFydCA9IHN0cmluZy5pbmRleE9mKFwie1wiKSwgb3B0aW9ucyA9IHt9O1xuXG4gICAgICAgIGlmIChzdGFydCAhPSAtMSkge1xuICAgICAgICAgICAgdHJ5IHtcbiAgICAgICAgICAgICAgICBvcHRpb25zID0gKG5ldyBGdW5jdGlvbihcIlwiLCBcInZhciBqc29uID0gXCIgKyBzdHJpbmcuc3Vic3RyKHN0YXJ0KSArIFwiOyByZXR1cm4gSlNPTi5wYXJzZShKU09OLnN0cmluZ2lmeShqc29uKSk7XCIpKSgpO1xuICAgICAgICAgICAgfSBjYXRjaCAoZSkge31cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiBvcHRpb25zO1xuICAgIH07XG5cbn0pKGpRdWVyeSwgd2luZG93LCB3aW5kb3cuZG9jdW1lbnQpO1xuIiwiKGZ1bmN0aW9uICgkLCB3aW5kb3csIGRvY3VtZW50LCB1bmRlZmluZWQpIHtcbiAgICAndXNlIHN0cmljdCc7XG5cbiAgICB2YXIgJGVsZW1lbnQgPSAkKCcuanMtY2xlYXJhYmxlLWlucHV0JyksXG4gICAgICAgIGRlZmF1bHRzID0ge1xuICAgICAgICAgICAgXCJzdWJtaXRvbmNsaWNrXCI6IGZhbHNlXG4gICAgICAgIH07XG5cbiAgICAkZWxlbWVudC5lYWNoKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgdmFyICR0aGlzID0gJCh0aGlzKSxcbiAgICAgICAgICAgIG9wdGlvbnMgPSAkdGhpcy5hdHRyKCdkYXRhLWNsZWFyYWJsZScpID8gSlNPTi5wYXJzZSgkdGhpcy5hdHRyKCdkYXRhLWNsZWFyYWJsZScpKSA6IHt9LFxuICAgICAgICAgICAgc2V0dGluZ3MgPSAkLmV4dGVuZCh0cnVlLCB7fSwgZGVmYXVsdHMsIG9wdGlvbnMpO1xuXG4gICAgICAgICR0aGlzLndyYXAoJzxzcGFuIGNsYXNzPVwidG0taW5wdXQgdG0taW5wdXQtLXdpdGgtY2xlYXItaWNvblwiIC8+JykuYWZ0ZXIoJCgnPHNwYW4gLz4nKS5vbignY2xpY2snLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAkKHRoaXMpLnByZXYoJ2lucHV0JykudmFsKCcnKS5mb2N1cygpO1xuXG4gICAgICAgICAgICBpZiAoc2V0dGluZ3Muc3VibWl0b25jbGljaykge1xuICAgICAgICAgICAgICAgIHZhciAkZm9ybSA9ICR0aGlzLmNsb3Nlc3QoJ2Zvcm0nKTtcblxuICAgICAgICAgICAgICAgIGlmICgkZm9ybS5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICAgICAgJGZvcm0uc3VibWl0KCk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfVxuICAgICAgICB9KSk7XG4gICAgfSk7XG5cbn0pKGpRdWVyeSwgd2luZG93LCB3aW5kb3cuZG9jdW1lbnQpOyIsIihmdW5jdGlvbiAoJCwgd2luZG93LCBkb2N1bWVudCwgdW5kZWZpbmVkKSB7XG4gICAgJ3VzZSBzdHJpY3QnO1xuXG4gICAgdmFyICRldmVudHNDb250YWluZXIgPSAkKCcuanMtZXZlbnQtbGlzdC1jb250YWluZXInKTtcbiAgICB2YXIgJGZpbHRlckJ1dHRvbiA9ICQoJy5qcy1maWx0ZXItZXZlbnQtbGlzdCcpO1xuICAgIHZhciBidXR0b25BY3RpdmUgPSAndG0tYnV0dG9uLWJhc2ljLS1hY3RpdmUnO1xuXG4gICAgdmFyICRldmVudHNDYXRlZ29yeSA9ICQoJ1tkYXRhLWZpbHRlci10eXBlPVwiY2F0ZWdvcnlcIl0nKTtcbiAgICB2YXIgJGV2ZW50c0xvY2F0aW9uID0gJCgnW2RhdGEtZmlsdGVyLXR5cGU9XCJsb2NhdGlvblwiXScpO1xuXG4gICAgLy92YXIgZmlsdGVyVXJsID0gJ2h0dHA6Ly9raXNrLW1lbm5la2VzLXd3dy0yMDE1MTAxOS1yZWxhdW5jaC4xMC42LjAuMTA5LnhpcC5pbzo4ODg4L3NjaHVsdW5nZW4vZmlsdGVyLyc7XG4gICAgdmFyIGZpbHRlclVybENvbnRyb2xsZXIgPSAnP3R4X3NmZXZlbnRtZ3RfcGlldmVudFthY3Rpb25dPWxpc3QmdHhfc2ZldmVudG1ndF9waWV2ZW50W2NvbnRyb2xsZXJdPUV2ZW50JztcbiAgICB2YXIgZmlsdGVyVXJsRGVtYW5kQ2F0ZWdvcnkgPSAnJnR4X3NmZXZlbnRtZ3RfcGlldmVudFtvdmVyd3JpdGVEZW1hbmRdW2NhdGVnb3J5XT0nO1xuICAgIHZhciBmaWx0ZXJVcmxEZW1hbmRMb2NhdGlvbiA9ICcmdHhfc2ZldmVudG1ndF9waWV2ZW50W292ZXJ3cml0ZURlbWFuZF1bbG9jYXRpb25dPSc7XG5cbiAgICBmdW5jdGlvbiBoYW5kbGVFdmVudHMoKSB7XG5cbiAgICAgICAgJCgnLmpzLXRtLWZvcm0tc2V0LWxhYmVsJykub24oJ2JsdXInLCBmdW5jdGlvbigpe1xuICAgICAgICAgICAgaWYoJCh0aGlzKS52YWwoKSkge1xuICAgICAgICAgICAgICAgICQodGhpcykucmVtb3ZlQ2xhc3MoJ2lzLWVtcHR5Jyk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICQodGhpcykuYWRkQ2xhc3MoJ2lzLWVtcHR5Jyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0pO1xuXG4gICAgICAgICQoJy5qcy1maWx0ZXItZXZlbnQtbGlzdC1tb2JpbGUnKS5vbignc2VsZWN0MjpzZWxlY3QnLCBmdW5jdGlvbiAoZSkge1xuICAgICAgICAgICAgdmFyIHVybCA9IGZpbHRlclVybCArIGZpbHRlclVybENvbnRyb2xsZXI7XG5cbiAgICAgICAgICAgIHZhciBkZW1hbmRDYXRlZ29yeSA9ICQoJy5qcy1maWx0ZXItZXZlbnQtbGlzdC1tb2JpbGVbZGF0YS1maWx0ZXItdHlwZT1cImNhdGVnb3J5XCJdJykuc2VsZWN0MigpLmZpbmQoXCI6c2VsZWN0ZWRcIikuZGF0YShcInVpZFwiKTtcbiAgICAgICAgICAgIGlmKGRlbWFuZENhdGVnb3J5KSB7XG4gICAgICAgICAgICAgICAgdXJsICs9IGZpbHRlclVybERlbWFuZENhdGVnb3J5ICsgZGVtYW5kQ2F0ZWdvcnk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIHZhciBkZW1hbmRMb2NhdGlvbiA9ICQoJy5qcy1maWx0ZXItZXZlbnQtbGlzdC1tb2JpbGVbZGF0YS1maWx0ZXItdHlwZT1cImNhdGVnb3J5XCJdJykuc2VsZWN0MigpLmZpbmQoXCI6c2VsZWN0ZWRcIikuZGF0YShcInVpZFwiKTtcbiAgICAgICAgICAgIGlmKGRlbWFuZExvY2F0aW9uKSB7XG4gICAgICAgICAgICAgICAgdXJsICs9IGZpbHRlclVybERlbWFuZExvY2F0aW9uICsgZGVtYW5kTG9jYXRpb247XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGdldERhdGEodXJsKTtcbiAgICAgICAgfSk7XG5cblxuICAgICAgICAkKCcuanMtZmlsdGVyLWV2ZW50LWxpc3QnKS5vbignY2xpY2snLCBmdW5jdGlvbiBmaWx0ZXJCdXR0b24oZSkge1xuICAgICAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICAgICAgdmFyIGJ1dHRvbiA9ICQodGhpcyk7XG4gICAgICAgICAgICB2YXIgdXJsID0gZmlsdGVyVXJsICsgZmlsdGVyVXJsQ29udHJvbGxlcjtcbiAgICAgICAgICAgIHZhciBhcnJEZW1hbmRDYXRlZ29yeSA9IFtdO1xuICAgICAgICAgICAgdmFyIGFyckRlbWFuZExvY2F0aW9uID0gW107XG5cbiAgICAgICAgICAgIGlmKGJ1dHRvbi5wYXJlbnRzKCdbZGF0YS1maWx0ZXItdHlwZV0nKS5kYXRhKCdmaWx0ZXJUeXBlJykgPT0gJ2NhdGVnb3J5Jykge1xuICAgICAgICAgICAgICAgICRldmVudHNDYXRlZ29yeS5maW5kKCdhJykucmVtb3ZlQ2xhc3MoYnV0dG9uQWN0aXZlKTtcbiAgICAgICAgICAgICAgICBidXR0b24uYWRkQ2xhc3MoYnV0dG9uQWN0aXZlKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgaWYoYnV0dG9uLnBhcmVudHMoJ1tkYXRhLWZpbHRlci10eXBlXScpLmRhdGEoJ2ZpbHRlclR5cGUnKSA9PSAnbG9jYXRpb24nKSB7XG4gICAgICAgICAgICAgICAgJGV2ZW50c0xvY2F0aW9uLmZpbmQoJ2EnKS5ub3QoJCh0aGlzKSkucmVtb3ZlQ2xhc3MoYnV0dG9uQWN0aXZlKTtcbiAgICAgICAgICAgICAgICBidXR0b24udG9nZ2xlQ2xhc3MoYnV0dG9uQWN0aXZlKTtcbiAgICAgICAgICAgIH1cblxuICAgICAgICAgICAgJGV2ZW50c0NhdGVnb3J5LmZpbmQoJy4nICsgYnV0dG9uQWN0aXZlKS5lYWNoKGZ1bmN0aW9uKGksIGUpIHtcbiAgICAgICAgICAgICAgICBpZigkKGUpLmRhdGEoJ2lkJykpIHtcbiAgICAgICAgICAgICAgICAgICAgYXJyRGVtYW5kQ2F0ZWdvcnlbaV0gPSAkKGUpLmRhdGEoJ2lkJyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICRldmVudHNMb2NhdGlvbi5maW5kKCcuJyArIGJ1dHRvbkFjdGl2ZSkuZWFjaChmdW5jdGlvbihpLCBlKSB7XG4gICAgICAgICAgICAgICAgaWYoJChlKS5kYXRhKCdpZCcpKSB7XG4gICAgICAgICAgICAgICAgICAgIGFyckRlbWFuZExvY2F0aW9uW2ldID0gJChlKS5kYXRhKCdpZCcpO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICBpZihhcnJEZW1hbmRDYXRlZ29yeS5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgdXJsICs9IGZpbHRlclVybERlbWFuZENhdGVnb3J5ICsgYXJyRGVtYW5kQ2F0ZWdvcnkuam9pbignLCcpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZihhcnJEZW1hbmRMb2NhdGlvbi5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgdXJsICs9IGZpbHRlclVybERlbWFuZExvY2F0aW9uICsgYXJyRGVtYW5kTG9jYXRpb24uam9pbignLCcpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBpZihhcnJEZW1hbmRDYXRlZ29yeS5sZW5ndGggPT0gMCAmJiBhcnJEZW1hbmRMb2NhdGlvbi5sZW5ndGggPiAwKSB7XG4gICAgICAgICAgICAgICAgJCgnLmpzLWZpbHRlci1ldmVudC1saXN0LWFsbCcpLnJlbW92ZUNsYXNzKGJ1dHRvbkFjdGl2ZSk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIGlmKGFyckRlbWFuZENhdGVnb3J5Lmxlbmd0aCA9PSAwICYmIGFyckRlbWFuZExvY2F0aW9uLmxlbmd0aCA9PSAwKSB7XG4gICAgICAgICAgICAgICAgJCgnLmpzLWZpbHRlci1ldmVudC1saXN0LWFsbCcpLnRyaWdnZXIoJ2NsaWNrJyk7XG4gICAgICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICBnZXREYXRhKHVybCk7XG5cbiAgICAgICAgfSk7XG5cbiAgICAgICAgJCgnLmpzLWZpbHRlci1ldmVudC1saXN0LWFsbCcpLm9uKCdjbGljaycsIGZ1bmN0aW9uIGZpbHRlckJ1dHRvbihlKSB7XG4gICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgICAgICB2YXIgdXJsID0gJCh0aGlzKS5hdHRyKCdocmVmJyk7XG5cbiAgICAgICAgICAgICRmaWx0ZXJCdXR0b24ucmVtb3ZlQ2xhc3MoYnV0dG9uQWN0aXZlKTtcbiAgICAgICAgICAgICQodGhpcykuYWRkQ2xhc3MoYnV0dG9uQWN0aXZlKTtcblxuICAgICAgICAgICAgZ2V0RGF0YSh1cmwpO1xuICAgICAgICB9KTtcblxuICAgICAgICBpZigkKCcudG0tYmxvY2stLW1vYmlsZS1zdGlja3knKS5sZW5ndGgpIHtcblxuICAgICAgICAgICAgdmFyIHNjcm9sbFRpbWVvdXQ7XG4gICAgICAgICAgICB2YXIgdGhyb3R0bGUgPSAxMDA7XG4gICAgICAgICAgICAkKHdpbmRvdykub24oJ3Njcm9sbCByZXNpemUnLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFzY3JvbGxUaW1lb3V0KSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICgkKHdpbmRvdykud2lkdGgoKSA8IDc2OCkge1xuXG4gICAgICAgICAgICAgICAgICAgICAgICBzY3JvbGxUaW1lb3V0ID0gc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGlzSW5WaWV3cG9ydCgkKCcuanMtZXZlbnRzLXN0aWNreS10cmlnZ2VyJykpKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICQoJy50bS1ibG9jay0tbW9iaWxlLXN0aWNreScpLmFkZENsYXNzKCd0bS1ibG9jay0tbW9iaWxlLXN0aWNreS0tdW5zZXQnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKCcudG0tYmxvY2stLW1vYmlsZS1zdGlja3knKS5yZW1vdmVDbGFzcygndG0tYmxvY2stLW1vYmlsZS1zdGlja3ktLXVuc2V0Jyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjcm9sbFRpbWVvdXQgPSBudWxsO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSwgdGhyb3R0bGUpO1xuICAgICAgICAgICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgICAgICAgICAgJCgnLnRtLWJsb2NrLS1tb2JpbGUtc3RpY2t5JykuYWRkQ2xhc3MoJ3RtLWJsb2NrLS1tb2JpbGUtc3RpY2t5LS11bnNldCcpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBpZigkKCcuanMtc2Nyb2xsLXRvLWVycm9yJykubGVuZ3RoID4gMCkge1xuXG4gICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uIHNjcm9sbFRvRXJyb3IoKSB7XG4gICAgICAgICAgICAgICAgdmFyIHNjcm9sbFRvRXJyb3JQb3NpdGlvbiA9ICQoJy5qcy1zY3JvbGwtdG8tZXJyb3InKS5maXJzdCgnLmYzLWZvcm0tZXJyb3InKS5vZmZzZXQoKS50b3A7XG4gICAgICAgICAgICAgICAgJCgnaHRtbCwgYm9keScpLmFuaW1hdGUoe1xuICAgICAgICAgICAgICAgICAgICBzY3JvbGxUb3A6IHNjcm9sbFRvRXJyb3JQb3NpdGlvblxuICAgICAgICAgICAgICAgIH0sIDEwMDApO1xuICAgICAgICAgICAgfSwgNzUwKTtcblxuICAgICAgICB9XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gZ2V0RGF0YSh1cmwpIHtcbiAgICAgICAgdmFyIF90aGlzID0gdGhpcztcblxuICAgICAgICBhamF4RGF0YSh1cmwpLnRoZW4oZnVuY3Rpb24gKGRhdGEpIHtcblxuICAgICAgICAgICAgdmFyIGZpcnN0UnVuID0gMTtcblxuICAgICAgICAgICAgJGV2ZW50c0NvbnRhaW5lci5hZGRDbGFzcygndG0tZXZlbnRzLW92ZXJ2aWV3X19jb250YWluZXItLWZhZGUtb3V0Jyk7XG4gICAgICAgICAgICAkZXZlbnRzQ29udGFpbmVyLm9uZSgnd2Via2l0VHJhbnNpdGlvbkVuZCBvdHJhbnNpdGlvbmVuZCBvVHJhbnNpdGlvbkVuZCBtc1RyYW5zaXRpb25FbmQgdHJhbnNpdGlvbmVuZCcsIGZ1bmN0aW9uIChlKSB7XG4gICAgICAgICAgICAgICAgaWYgKCFmaXJzdFJ1bikge1xuICAgICAgICAgICAgICAgICAgICByZXR1cm47XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgdmFyIGV2ZW50cyA9ICQoZGF0YSkuZmluZCgnLmpzLWV2ZW50LWxpc3QnKTtcbiAgICAgICAgICAgICAgICBmaXJzdFJ1biA9IDA7XG5cbiAgICAgICAgICAgICAgICAkKCcuanMtZXZlbnQtbGlzdCcpLnJlbW92ZSgpO1xuICAgICAgICAgICAgICAgICRldmVudHNDb250YWluZXIuYXBwZW5kKGV2ZW50cyk7XG5cbiAgICAgICAgICAgICAgICAkKHRoaXMpLnJlbW92ZUNsYXNzKCd0bS1ldmVudHMtb3ZlcnZpZXdfX2NvbnRhaW5lci0tZmFkZS1vdXQnKTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICB3aW5kb3cuaGlzdG9yeS5wdXNoU3RhdGUobnVsbCwgbnVsbCwgJChfdGhpcykuYXR0cignaHJlZicpKTtcbiAgICAgICAgfSkuY2F0Y2goZnVuY3Rpb24gKGVycikge30pO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGFqYXhEYXRhKHVybCkge1xuICAgICAgICByZXR1cm4gbmV3IFByb21pc2UoZnVuY3Rpb24gKHJlc29sdmUsIHJlamVjdCkge1xuICAgICAgICAgICAgdmFyIHJlcSA9IG5ldyBYTUxIdHRwUmVxdWVzdCgpO1xuICAgICAgICAgICAgcmVxLm9wZW4oJ0dFVCcsIHVybCk7XG4gICAgICAgICAgICByZXEub25sb2FkID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHJldHVybiByZXEuc3RhdHVzID09PSAyMDAgPyByZXNvbHZlKHJlcS5yZXNwb25zZSkgOiByZWplY3QoRXJyb3IocmVxLnN0YXR1c1RleHQpKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICByZXEub25lcnJvciA9IGZ1bmN0aW9uIChlKSB7XG4gICAgICAgICAgICAgICAgcmV0dXJuIHJlamVjdChFcnJvcignTmV0d29yayBFcnJvcjogJyArIGUpKTtcbiAgICAgICAgICAgIH07XG4gICAgICAgICAgICByZXEuc2VuZCgpO1xuICAgICAgICB9KTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBzZXRCdXR0b25TdGF0ZShidXR0b24pIHtcbiAgICAgICRmaWx0ZXJCdXR0b24ucmVtb3ZlQ2xhc3MoYnV0dG9uQWN0aXZlKTtcbiAgICAgIGJ1dHRvbi5hZGRDbGFzcyhidXR0b25BY3RpdmUpO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGlzSW5WaWV3cG9ydChlbGVtZW50KSB7XG4gICAgICAgIHZhciBlbGVtZW50VG9wID0gJChlbGVtZW50KS5vZmZzZXQoKS50b3A7XG4gICAgICAgIHZhciBlbGVtZW50Qm90dG9tID0gZWxlbWVudFRvcCArICQoZWxlbWVudCkub3V0ZXJIZWlnaHQoKTtcbiAgICAgICAgdmFyIHZpZXdwb3J0VG9wID0gJCh3aW5kb3cpLnNjcm9sbFRvcCgpO1xuICAgICAgICB2YXIgdmlld3BvcnRCb3R0b20gPSB2aWV3cG9ydFRvcCArICQod2luZG93KS5oZWlnaHQoKTtcbiAgICAgICAgcmV0dXJuIGVsZW1lbnRCb3R0b20gPiB2aWV3cG9ydFRvcCAmJiBlbGVtZW50VG9wIDwgdmlld3BvcnRCb3R0b207XG4gICAgfVxuXG4gICAgaGFuZGxlRXZlbnRzKCk7XG5cbn0pKGpRdWVyeSwgd2luZG93LCB3aW5kb3cuZG9jdW1lbnQpO1xuIiwiKGZ1bmN0aW9uICgkLCB3aW5kb3csIGRvY3VtZW50LCB1bmRlZmluZWQpIHtcbiAgICAndXNlIHN0cmljdCc7XG5cbiAgICB2YXIgYWNjb3JkaW9uRW5hYmxlZCA9IGZhbHNlO1xuICAgIHZhciBhY2NvcmRpb24gPSBudWxsO1xuXG4gICAgZnVuY3Rpb24gY2hlY2tNZWRpYVF1ZXJ5KCkge1xuICAgICAgICByZXR1cm4gd2luZG93Lm1hdGNoTWVkaWEoXCIobWluLXdpZHRoOiA3NjhweClcIikubWF0Y2hlcztcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBjaGVja0FjY29yZGlvbigpIHtcbiAgICAgICAgaWYgKGNoZWNrTWVkaWFRdWVyeSgpKSB7XG4gICAgICAgICAgICBkaXNhYmxlQWNjb3JkaW9uKCk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBlbmFibGVBY2NvcmRpb24oKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIGZ1bmN0aW9uIGRpc2FibGVBY2NvcmRpb24oKSB7XG5cbiAgICAgICAgLy8gY29uc29sZS5sb2coJ2Rpc2FibGVBY2NvcmRpb24gYmVjYXVzZSBtaW4td2lkdGggaXMgNzY4cHgnKTtcblxuICAgICAgICBpZiAoYWNjb3JkaW9uRW5hYmxlZCkge1xuICAgICAgICAgICAgJCgnLmpzLWZpbHRlci1hY2NvcmRpb24nKS5vZmYoJ2NsaWNrLnVrLmFjY29yZGlvbicpO1xuICAgICAgICAgICAgJCgnLmpzLWZpbHRlci1hY2NvcmRpb24gLnVrLWFjY29yZGlvbi10aXRsZScpLnJlbW92ZUNsYXNzKCd1ay1hY3RpdmUnKTtcbiAgICAgICAgICAgICQoJy5qcy1maWx0ZXItYWNjb3JkaW9uIC51ay1hY2NvcmRpb24tY29udGVudCcpLnVud3JhcCgpLnJlbW92ZUNsYXNzKCd1ay1hY3RpdmUnKTtcblxuICAgICAgICAgICAgYWNjb3JkaW9uID0gbnVsbDtcbiAgICAgICAgICAgIGFjY29yZGlvbkVuYWJsZWQgPSBmYWxzZTtcbiAgICAgICAgfVxuICAgIH1cblxuXG4gICAgZnVuY3Rpb24gZW5hYmxlQWNjb3JkaW9uKCkge1xuICAgICAgICAvLyBjb25zb2xlLmxvZygnZW5hYmxlQWNjb3JkaW9uIGJlY2F1c2UgbWF4LXdpZHRoIGlzIDc2N3B4Jyk7XG5cbiAgICAgICAgaWYgKCFhY2NvcmRpb25FbmFibGVkKSB7XG4gICAgICAgICAgICBhY2NvcmRpb24gPSBVSWtpdC5hY2NvcmRpb24oJCgnLmpzLWZpbHRlci1hY2NvcmRpb24nKSwge2NvbGxhcHNlOiBmYWxzZX0pO1xuICAgICAgICAgICAgYWNjb3JkaW9uRW5hYmxlZCA9IHRydWU7XG5cbiAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKGFjY29yZGlvbik7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICAkKCcuanMtZmlsdGVyLWFjY29yZGlvbicpLmZpbmQoJy50bS10b29sdGlwLWljb24nKS5vbignY2xpY2snLCBmdW5jdGlvbiAoZSkge1xuICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIHJldHVybiBmYWxzZTtcbiAgICB9KTtcblxuICAgIFVJa2l0Lm9uKCdhZnRlcnJlYWR5LnVrLmRvbScsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgaWYgKCQoJy5qcy1maWx0ZXItYWNjb3JkaW9uJykubGVuZ3RoKSB7XG4gICAgICAgICAgICBjaGVja0FjY29yZGlvbigpO1xuICAgICAgICB9XG5cbiAgICAgICAgJCh3aW5kb3cpLm9uKCdyZXNpemUgb3JpZW50YXRpb25jaGFuZ2UnLCBVSWtpdC5VdGlscy5kZWJvdW5jZShmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgICAgICAgIGlmICgkKCcuanMtZmlsdGVyLWFjY29yZGlvbicpLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgIGNoZWNrQWNjb3JkaW9uKCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH0sIDEwMCkpO1xuXG4gICAgICAgICQoJ2h0bWwnKS5vbigndXBkYXRlLmZpbHRlci5hY2NvcmRpb24nLCBmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKCd1cGRhdGUuZmlsdGVyLmFjY29yZGlvbicpO1xuXG4gICAgICAgICAgICBpZiAoJCgnLmpzLWZpbHRlci1hY2NvcmRpb24nKS5sZW5ndGgpIHtcbiAgICAgICAgICAgICAgICBhY2NvcmRpb25FbmFibGVkID0gZmFsc2U7IC8vIHJlaW5pdCBhZnRlciBhamF4XG4gICAgICAgICAgICAgICAgY2hlY2tBY2NvcmRpb24oKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSlcbiAgICB9KTtcblxufSkoalF1ZXJ5LCB3aW5kb3csIHdpbmRvdy5kb2N1bWVudCk7IiwiKGZ1bmN0aW9uICgkLCB3aW5kb3csIGRvY3VtZW50LCB1bmRlZmluZWQpIHtcbiAgICAndXNlIHN0cmljdCc7XG5cbiAgICB2YXIgc2Nyb2xsVG9Gb3JtRXJyb3IgPSAoZnVuY3Rpb24gKCkge1xuXG4gICAgICAgIHZhciBjb250YWluZXIgPSAkKCcuanMtc2Nyb2xsLXRvLWVycm9yJyk7XG4gICAgICAgIHZhciBhbmNob3IgPSAkKCcuanMtc2Nyb2xsLXRvLWFuY2hvcicpO1xuICAgICAgICB2YXIgZXJyb3IgPSAnLmludmFsaWQnO1xuXG4gICAgICAgIGZ1bmN0aW9uIGluaXQoKSB7XG4gICAgICAgICAgICBpZiAoY29udGFpbmVyLmZpbmQoZXJyb3IpLmxlbmd0aCA+IDApIHtcbiAgICAgICAgICAgICAgICBzZXRUaW1lb3V0KGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICAgICAgJCgnYm9keSwgaHRtbCcpLmFuaW1hdGUoe1xuICAgICAgICAgICAgICAgICAgICAgICAgc2Nyb2xsVG9wOiBhbmNob3Iub2Zmc2V0KCkudG9wXG4gICAgICAgICAgICAgICAgICAgIH0sIDUwMCk7XG4gICAgICAgICAgICAgICAgfSwgMzAwKTtcbiAgICAgICAgICAgIH1cbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBpbml0OiBpbml0XG4gICAgICAgIH07XG4gICAgfSkoKTtcblxuICAgIHZhciB2YWxpZGF0ZUNvbnRhY3RGb3JtID0gKGZ1bmN0aW9uICgpIHtcblxuICAgICAgICB2YXIgY29udGFpbmVyID0gJCgnI2NvbnRhY3QtZm9ybScpO1xuICAgICAgICB2YXIgZXJyb3JDbGFzcyA9ICdpbnZhbGlkJztcblxuICAgICAgICBmdW5jdGlvbiBpbml0KCkge1xuXG4gICAgICAgICAgICBjb250YWluZXIuZmluZCgnLmpzLXN1Ym1pdC1mb3JtJykub24oJ2NsaWNrJywgZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG5cbiAgICAgICAgICAgICAgICBjb250YWluZXIuZmluZCgnLnZhbGlkYXRpb25XcmFwcGVyJykucmVtb3ZlQ2xhc3MoZXJyb3JDbGFzcyk7XG5cbiAgICAgICAgICAgICAgICB2YXIgcmVxdWlyZWQgPSBjb250YWluZXIuZmluZCgnLnJlcXVpcmVkJyk7XG4gICAgICAgICAgICAgICAgJC5lYWNoKHJlcXVpcmVkLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmICghJCh0aGlzKS52YWwoKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgJCh0aGlzKS5wYXJlbnRzKCcudmFsaWRhdGlvbldyYXBwZXInKS5hZGRDbGFzcyhlcnJvckNsYXNzKTtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAgICAgaWYgKGNvbnRhaW5lci5maW5kKCcuJyArIGVycm9yQ2xhc3MpLmxlbmd0aCA8IDEpIHtcbiAgICAgICAgICAgICAgICAgICAgZ3JlY2FwdGNoYS5leGVjdXRlKCk7XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBpbml0OiBpbml0XG4gICAgICAgIH07XG4gICAgfSkoKTtcblxuICAgIHNjcm9sbFRvRm9ybUVycm9yLmluaXQoKTtcbiAgICB2YWxpZGF0ZUNvbnRhY3RGb3JtLmluaXQoKTtcbn0pKGpRdWVyeSwgd2luZG93LCB3aW5kb3cuZG9jdW1lbnQpO1xuIiwiKGZ1bmN0aW9uKCQsIHdpbmRvdywgZG9jdW1lbnQsIHVuZGVmaW5lZCkge1xuICAgICd1c2Ugc3RyaWN0JztcblxuICAgIHZhciBpbWFnZXNMb2FkZWQgPSByZXF1aXJlKCdpbWFnZXNsb2FkZWQnKTtcbiAgICB2YXIgTWFzb25yeSA9IHJlcXVpcmUoJ21hc29ucnktbGF5b3V0Jyk7XG4gICAgdmFyIGdyaWQgPSBkb2N1bWVudC5xdWVyeVNlbGVjdG9yKCcuanMtbXNucnktZ3JpZCcpO1xuICAgIHZhciBtc25yeTtcblxuICAgIGlmICghZ3JpZCkge1xuICAgICAgICByZXR1cm47XG4gICAgfVxuXG4gICAgaW1hZ2VzTG9hZGVkKCBncmlkLCBmdW5jdGlvbigpIHtcbiAgICAgICAgbXNucnkgPSBuZXcgTWFzb25yeShncmlkLCB7XG4gICAgICAgICAgICBndXR0ZXI6IDEwLFxuICAgICAgICAgICAgaXRlbVNlbGVjdG9yOiAnLm1zbnJ5LWdyaWRfX2l0ZW0nLFxuICAgICAgICAgICAgY29sdW1uV2lkdGg6ICcubXNucnktZ3JpZF9fc2l6ZXInLFxuICAgICAgICAgICAgcGVyY2VudFBvc2l0aW9uOiB0cnVlXG4gICAgICAgIH0pO1xuICAgIH0pO1xuXG59KShqUXVlcnksIHdpbmRvdywgd2luZG93LmRvY3VtZW50KTtcbiIsIi8qXG5Qb3NzaWJsZSBGaWVsZHM6XG5cdHVyaSAgICAgQWxpYXM6IHVybCwgRmFsbGJhY2s6IGxvY2F0aW9uLmhyZWZcblx0dGl0bGUgICBGYWxsYmFjazogb2c6dGl0bGUsIDx0aXRsZT5cblx0bWVzc2FnZSBGYWxsYmFjazogZmllbGQgdGl0bGVcblx0aW1hZ2UgICBGYWxsYmFjazogb2c6aW1hZ2VcblxuQWxsIGZpZWxkcyBjYW4gYmUgZGVmaW5lZCBhdCBhIHNwZWNpZmljIHNoYXJlciBvciBhdCB0aGUgcGFyZW50IGVsZW1lbnQgYXMgZGF0YSB0YWc6XG48dWwgY2xhc3M9XCJzaGFyZXJcIiBkYXRhLXRpdGxlPVwiU2hhcmVyIHRpdGxlXCIgZGF0YS1tZXNzYWdlPVwiRnVsbCBzaGFyaW5nIG1lc3NhZ2VcIj5cblx0PGxpIGNsYXNzPVwidHdpdHRlclwiIGRhdGEtbWVzc2FnZT1cIlNob3J0IHR3aXR0ZXIgbWVzc2FnZVwiPjwvbGk+XG5cdDxsaSBjbGFzcz1cImZhY2Vib29rXCI+PC9saT5cbjwvdWw+XG5cblNoYXJlcnMgd2l0aCB1c2VkIGZpZWxkczpcblx0ZmFjZWJvb2s6ICAgdGl0bGUsIHVyaVxuXHR0d2l0dGVyOiAgICBtZXNzYWdlLCB1cmlcblx0Z29vZ2xlcGx1czogdXJpXG5cdHBpbnRlcmVzdDogIHVyaSwgaW1hZ2UsIG1lc3NhZ2Vcblx0bWFpbDogICAgICAgdGl0bGUsIG1lc3NhZ2UsIHVyaVx0LSB1c2UgJiMxMDsgZsO8ciBsaW5lIGJyZWFrcyBpbiBtZXNzYWdlXG5cbiovXG4oZnVuY3Rpb24gKCQsIHdpbmRvdywgZG9jdW1lbnQsIHVuZGVmaW5lZCkge1xuICAgICd1c2Ugc3RyaWN0JztcblxuICB2YXIgZ2V0dGVyID0ge307XG5cbiAgZ2V0dGVyLnVyaSA9IGZ1bmN0aW9uIGdldFVyaShlbCkge1xuICAgIHZhciB1cmk7XG5cbiAgICB1cmkgPSB1cmkgfHwgZWwuZGF0YSgndXJpJyk7XG4gICAgdXJpID0gdXJpIHx8IGVsLmRhdGEoJ3VybCcpO1xuICAgIHVyaSA9IHVyaSB8fCBlbC5jbG9zZXN0KCcuc2hhcmVyJykuZGF0YSgndXJpJyk7XG4gICAgdXJpID0gdXJpIHx8IGVsLmNsb3Nlc3QoJy5zaGFyZXInKS5kYXRhKCd1cmwnKTtcbiAgICB1cmkgPSB1cmkgfHwgbG9jYXRpb24uaHJlZjtcblxuICAgIHJldHVybiB1cmk7XG4gIH07XG5cbiAgZ2V0dGVyLnRpdGxlID0gZnVuY3Rpb24gZ2V0VGl0bGUoZWwpIHtcbiAgICB2YXIgdGl0bGU7XG5cbiAgICB0aXRsZSA9IHRpdGxlIHx8IGVsLmRhdGEoJ3RpdGxlJyk7XG4gICAgdGl0bGUgPSB0aXRsZSB8fCBlbC5jbG9zZXN0KCcuc2hhcmVyJykuZGF0YSgndGl0bGUnKTtcbiAgICB0aXRsZSA9IHRpdGxlIHx8ICQoJ21ldGFbcHJvcGVydHk9XCJvZzp0aXRsZVwiXScpLnByb3AoJ2NvbnRlbnQnKTtcbiAgICB0aXRsZSA9IHRpdGxlIHx8ICQoJ3RpdGxlJykudGV4dCgpO1xuXG4gICAgcmV0dXJuIHRpdGxlO1xuICB9O1xuXG4gIGdldHRlci5tZXNzYWdlID0gZnVuY3Rpb24gZ2V0TWVzc2FnZShlbCkge1xuICAgIHZhciBtZXNzYWdlO1xuXG4gICAgbWVzc2FnZSA9IG1lc3NhZ2UgfHwgZWwuZGF0YSgnbWVzc2FnZScpO1xuICAgIG1lc3NhZ2UgPSBtZXNzYWdlIHx8IGVsLmNsb3Nlc3QoJy5zaGFyZXInKS5kYXRhKCdtZXNzYWdlJyk7XG4gICAgbWVzc2FnZSA9IG1lc3NhZ2UgfHwgZ2V0dGVyLnRpdGxlKGVsKTtcblxuICAgIHJldHVybiBtZXNzYWdlO1xuICB9O1xuXG4gIGdldHRlci5pbWFnZSA9IGZ1bmN0aW9uIGdldE1lc3NhZ2UoZWwpIHtcbiAgICB2YXIgaW1hZ2U7XG5cbiAgICBpbWFnZSA9IGltYWdlIHx8IGVsLmRhdGEoJ2ltYWdlJyk7XG4gICAgaW1hZ2UgPSBpbWFnZSB8fCBlbC5jbG9zZXN0KCcuc2hhcmVyJykuZGF0YSgnaW1hZ2UnKTtcbiAgICBpbWFnZSA9IGltYWdlIHx8ICQoJ21ldGFbcHJvcGVydHk9XCJvZzppbWFnZVwiXScpLnByb3AoJ2NvbnRlbnQnKTtcblxuICAgIHJldHVybiBpbWFnZTtcbiAgfTtcblxuICBmdW5jdGlvbiBwb3B1cCh1cmksIHdpZHRoLCBoZWlnaHQpIHtcbiAgICBvcGVuKHVyaSwgJ3NoYXJlcicsICd3aWR0aD0nICsgd2lkdGggKyAnLGhlaWdodD0nICsgaGVpZ2h0KTtcbiAgfVxuXG4gIHZhciBzaGFyZUhhbmRsZXJzID0ge1xuICAgIGZhY2Vib29rOiB7XG4gICAgICB1cmk6ICdodHRwczovL3d3dy5mYWNlYm9vay5jb20vc2hhcmVyL3NoYXJlci5waHA/dT0ldXJpJSZwW3RpdGxlXT0ldGl0bGUlJmRpc3BsYXk9cG9wdXAnLFxuICAgICAgcmVwbGFjZW1lbnRzOiBbJ3RpdGxlJywgJ3VyaSddLFxuICAgICAgd2lkdGg6IDY1MCxcbiAgICAgIGhlaWdodDogMzIwXG4gICAgfSxcbiAgICB0d2l0dGVyOiB7XG4gICAgICB1cmk6ICdodHRwczovL3R3aXR0ZXIuY29tL2ludGVudC90d2VldD90ZXh0PSVtZXNzYWdlJSZ1cmw9JXVyaSUnLFxuICAgICAgcmVwbGFjZW1lbnRzOiBbJ21lc3NhZ2UnLCAndXJpJ10sXG4gICAgICB3aWR0aDogNTIwLFxuICAgICAgaGVpZ2h0OiAyNjBcbiAgICB9LFxuICAgIGdvb2dsZXBsdXM6IHtcbiAgICAgIHVyaTogJ2h0dHBzOi8vcGx1cy5nb29nbGUuY29tL3NoYXJlP3VybD0ldXJpJScsXG4gICAgICByZXBsYWNlbWVudHM6IFsndXJpJ10sXG4gICAgICB3aWR0aDogNTEwLFxuICAgICAgaGVpZ2h0OiAzOTBcbiAgICB9LFxuICAgIHBpbnRlcmVzdDoge1xuICAgICAgdXJpOiAnaHR0cDovL3BpbnRlcmVzdC5jb20vcGluL2NyZWF0ZS9idXR0b24vP3VybD0ldXJpJSZtZWRpYT0laW1hZ2UlJmRlc2NyaXB0aW9uPSVtZXNzYWdlJScsXG4gICAgICByZXBsYWNlbWVudHM6IFsndXJpJywgJ2ltYWdlJywgJ21lc3NhZ2UnXSxcbiAgICAgIHdpZHRoOiA1MTAsXG4gICAgICBoZWlnaHQ6IDM5MFxuICAgIH0sXG4gICAgbWFpbDoge1xuICAgICAgdXJpOiAnbWFpbHRvOj9zdWJqZWN0PSV0aXRsZSUmYm9keT0lbWVzc2FnZSUgJXVyaSUnLFxuICAgICAgcmVwbGFjZW1lbnRzOiBbJ3RpdGxlJywgJ21lc3NhZ2UnLCAndXJpJ10sXG4gICAgICBoYW5kbGVyOiBmdW5jdGlvbiAodXJpKSB7XG4gICAgICAgIGxvY2F0aW9uLmhyZWYgPSB1cmk7XG4gICAgICB9XG4gICAgfVxuICB9O1xuXG4gIHZhciBpbml0ID0gZnVuY3Rpb24gaW5pdFNoYXJlcigpIHtcbiAgICAkLmVhY2goc2hhcmVIYW5kbGVycywgZnVuY3Rpb24gKG5hbWUsIHZhbHVlcykge1xuICAgICAgJCgnYm9keScpLm9uKCdjbGljayB0b3VjaGVuZCcsICcuc2hhcmVyIC4nICsgbmFtZSwgZnVuY3Rpb24gKGUpIHtcbiAgICAgICAgZS5wcmV2ZW50RGVmYXVsdCgpO1xuICAgICAgICB2YXIgZWwgPSAkKHRoaXMpO1xuICAgICAgICB2YXIgdXJpID0gdmFsdWVzLnVyaTtcbiAgICAgICAgJC5lYWNoKHZhbHVlcy5yZXBsYWNlbWVudHMsIGZ1bmN0aW9uIChrLCB2KSB7XG4gICAgICAgICAgdXJpID0gdXJpLnJlcGxhY2UobmV3IFJlZ0V4cCgnJScgKyB2ICsgJyUnKSwgZW5jb2RlVVJJQ29tcG9uZW50KGdldHRlclt2XShlbCkpKTtcbiAgICAgICAgfSk7XG4gICAgICAgIHZhciBoYW5kbGVyID0gdmFsdWVzLmhhbmRsZXIgfHwgcG9wdXA7XG4gICAgICAgIGhhbmRsZXIodXJpLCB2YWx1ZXMud2lkdGgsIHZhbHVlcy5oZWlnaHQpO1xuICAgICAgfSk7XG4gICAgfSk7XG4gIH07XG5cbiAgdmFyIHNlbGYgPSB7XG4gICAgaW5pdDogaW5pdCxcbiAgICBnZXR0ZXI6IGdldHRlcixcbiAgICBwb3B1cDogcG9wdXAsXG4gICAgaGFuZGxlcnM6IHNoYXJlSGFuZGxlcnNcbiAgfTtcblxuICBzZWxmLmluaXQoKTtcblxufSkoalF1ZXJ5LCB3aW5kb3csIHdpbmRvdy5kb2N1bWVudCk7XG4iLCIoZnVuY3Rpb24gKCQsIHdpbmRvdywgZG9jdW1lbnQsIHVuZGVmaW5lZCkge1xuICAgICd1c2Ugc3RyaWN0JztcblxuICAgIC8vIG9uIHNsaWRlIGNoYW5nZSByZXNldCB2aWRlbyBpbnNpZGUgbGFzdCBzbGlkZVxuICAgICQoJ1tkYXRhLXVrLXNsaWRlc2hvd10nKS5vbignc2hvdy51ay5zbGlkZXNob3cnLCBmdW5jdGlvbiAoZXZlbnQsIG5leHRTbGlkZSwgY3VycmVudFNsaWRlKSB7XG4gICAgICAgIHZhciAkc2xpZGUgPSAkKGN1cnJlbnRTbGlkZSksXG4gICAgICAgICAgICAkdmlkZW8gPSAkc2xpZGUuZmluZCgndmlkZW8nKSxcbiAgICAgICAgICAgICR2aWRlb0NvbnRhaW5lciA9ICRzbGlkZS5maW5kKCcuanMtdmlkZW8nKSxcbiAgICAgICAgICAgICRwbGF5Q29udHJvbCA9ICRzbGlkZS5maW5kKCcuanMtdmlkZW8tcGxheScpLFxuICAgICAgICAgICAgJHBhdXNlQ29udHJvbCA9ICRzbGlkZS5maW5kKCcuanMtdmlkZW8tcGF1c2UnKSxcbiAgICAgICAgICAgICRtdXRlQ29udHJvbCA9ICRzbGlkZS5maW5kKCcuanMtdmlkZW8tbXV0ZScpO1xuXG4gICAgICAgIGlmICgkdmlkZW8ubGVuZ3RoID4gMCkge1xuICAgICAgICAgICAgJHZpZGVvLmNzcygnZGlzcGxheScsICdub25lJyk7XG4gICAgICAgICAgICAkdmlkZW9bMF0ucGF1c2UoKTtcbiAgICAgICAgICAgICR2aWRlb0NvbnRhaW5lci5yZW1vdmVDbGFzcygndG0tdmlkZW8tLWlzLXBsYXlpbmcnKTtcblxuICAgICAgICAgICAgJHBhdXNlQ29udHJvbC5jc3MoJ2Rpc3BsYXknLCAnbm9uZScpO1xuICAgICAgICAgICAgJG11dGVDb250cm9sLmNzcygnZGlzcGxheScsICdub25lJyk7XG4gICAgICAgICAgICAkcGxheUNvbnRyb2wuY3NzKCdkaXNwbGF5JywgJ2lubGluZS1ibG9jaycpO1xuXG4gICAgICAgICAgICAkdmlkZW9bMF0uY3VycmVudFRpbWUgPSAwOyBcbiAgICAgICAgfVxuICAgIH0pO1xuXG59KShqUXVlcnksIHdpbmRvdywgd2luZG93LmRvY3VtZW50KTsiLCIoZnVuY3Rpb24gKCQsIHdpbmRvdywgZG9jdW1lbnQsIHVuZGVmaW5lZCkge1xuICAgICd1c2Ugc3RyaWN0JztcblxuICAgIHZhciBzbW9vdGhTY3JvbGxlciA9IG51bGwsXG4gICAgICAgICRlbGVtZW50ID0gJCgnLmpzLXNtb290aC1zY3JvbGwnKTtcblxuICAgICRlbGVtZW50LmVhY2goZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgJHRoaXMgPSAkKHRoaXMpO1xuXG4gICAgICAgICR0aGlzLm9uKCdjbGljaycsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciBvZmZzZXRBZGQgPSAwO1xuXG4gICAgICAgICAgICBpZiAoJCh3aW5kb3cpLndpZHRoKCkgPCA5NjApIHtcbiAgICAgICAgICAgICAgICBvZmZzZXRBZGQgPSAkKCcjdG0taGVhZGVyJykub3V0ZXJIZWlnaHQoKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgb2Zmc2V0QWRkID0gJCgnI3RtLWhlYWRlcicpLm91dGVySGVpZ2h0KCkgLyAyO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICB2YXIgb2Zmc2V0ID0gJHRoaXMucGFyZW50cygnLnRtLWJsb2NrJykub3V0ZXJIZWlnaHQoKSArIG9mZnNldEFkZDtcblxuICAgICAgICAgICAgJChcImh0bWwsYm9keVwiKS5zdG9wKCkuYW5pbWF0ZSh7c2Nyb2xsVG9wOiBvZmZzZXR9LCAxMDAwLCAnZWFzZU91dEV4cG8nKTtcbiAgICAgICAgfSk7XG4gICAgfSk7XG5cbn0pKGpRdWVyeSwgd2luZG93LCB3aW5kb3cuZG9jdW1lbnQpOyIsIihmdW5jdGlvbiAoJCwgd2luZG93LCBkb2N1bWVudCwgdW5kZWZpbmVkKSB7XG4gICAgJ3VzZSBzdHJpY3QnO1xuXG4gICAgdmFyIHN0aWNreUhlYWRlciA9IG51bGwsXG4gICAgICAgICRlbGVtZW50ID0gJCgnLmpzLXN0aWNreS1oZWFkZXInKSxcbiAgICAgICAgJGhlYWRlciA9ICRlbGVtZW50LmZpbmQoJy50bS1oZWFkZXInKSxcbiAgICAgICAgJG1vYmlsZU1lbnUgPSAkKCcjdG0tbWVudS1tb2JpbGUnKSxcbiAgICAgICAgJG1vYmlsZU1lbnVIb29rID0gJCgnLmpzLXN0aWNreS1tb2JpbGUtbWVudScpLFxuICAgICAgICBtb2JpbGVNZW51SXNDbG9zZWQgPSAkbW9iaWxlTWVudS5oYXNDbGFzcygndG0tbWVudS1tb2JpbGUtLWlzLWNsb3NlZCcpLFxuICAgICAgICBzaHJpbmtUcmlnZ2VyT2Zmc2V0ID0gMTA4LFxuICAgICAgICBwbGFjZWhvbGRlck1pbkhlaWdodCA9IDYyO1xuXG4gICAgZnVuY3Rpb24gaXNNb2JpbGUoKSB7XG4gICAgICAgIHJldHVybiAhd2luZG93Lm1hdGNoTWVkaWEoJyhtaW4td2lkdGg6IDk2MHB4KScpLm1hdGNoZXM7XG4gICAgfVxuXG4gICAgZnVuY3Rpb24gb25TY3JvbGxTaHJpbmsoKSB7XG4gICAgICAgIHZhciBzY3JvbGxUb3AgPSAkKHdpbmRvdykuc2Nyb2xsVG9wKCksXG4gICAgICAgICAgICBzaHJpbmtPbiA9IHNocmlua1RyaWdnZXJPZmZzZXQsXG4gICAgICAgICAgICBjbHNhY3RpdmUgPSAndG0taGVhZGVyLS1zbWFsbCc7XG5cbiAgICAgICAgaWYgKHNjcm9sbFRvcCA+IHNocmlua09uKSB7XG4gICAgICAgICAgICAkaGVhZGVyLmFkZENsYXNzKGNsc2FjdGl2ZSk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAkaGVhZGVyLnJlbW92ZUNsYXNzKGNsc2FjdGl2ZSk7XG4gICAgICAgIH1cbiAgICB9XG5cbiAgICBmdW5jdGlvbiBvbk1vYmlsZU1lbnVDbGljaygpIHtcbiAgICAgICAgLy8gY29uc29sZS5sb2coJ29uTW9iaWxlTWVudUNsaWNrJyk7XG4gICAgICAgIG1vYmlsZU1lbnVJc0Nsb3NlZCA9ICFtb2JpbGVNZW51SXNDbG9zZWQ7XG5cbiAgICAgICAgJGVsZW1lbnQuY3NzKHtcbiAgICAgICAgICAgICdwb3NpdGlvbic6ICdmaXhlZCcsXG4gICAgICAgICAgICAndG9wJzogMCxcbiAgICAgICAgICAgICd3aWR0aCc6ICQod2luZG93KS53aWR0aCgpXG4gICAgICAgIH0pLmFkZENsYXNzKCd1ay1hY3RpdmUnKTtcblxuICAgICAgICBpZiAobW9iaWxlTWVudUlzQ2xvc2VkKSB7XG4gICAgICAgICAgICAkZWxlbWVudC5jc3Moe1xuICAgICAgICAgICAgICAgICdoZWlnaHQnOiAnYXV0bycsXG4gICAgICAgICAgICAgICAgJ292ZXJmbG93LXknOiAndmlzaWJsZSdcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAkKCdib2R5LCBodG1sJykucmVtb3ZlQ2xhc3MoJ2pzLWRpc2FibGVkLXNjcm9sbGluZycpO1xuXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAkZWxlbWVudC5jc3Moe1xuICAgICAgICAgICAgICAgICdoZWlnaHQnOiAnMTAwJScsXG4gICAgICAgICAgICAgICAgJ292ZXJmbG93LXknOiAnc2Nyb2xsJ1xuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgICQoJ2JvZHksIGh0bWwnKS5hZGRDbGFzcygnanMtZGlzYWJsZWQtc2Nyb2xsaW5nJyk7XG4gICAgICAgIH1cblxuICAgICAgICBzdGlja3lIZWFkZXIuc3RpY2t5Lm9wdGlvbnMuc2hvd3VwID0gbW9iaWxlTWVudUlzQ2xvc2VkO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHJlY2FsY1dyYXBwZXJIZWlnaHQoKSB7XG4gICAgICAgIHZhciBwbGFjZWhvbGRlckhlaWdodCA9ICRlbGVtZW50Lm91dGVySGVpZ2h0KCkgPiBwbGFjZWhvbGRlck1pbkhlaWdodCA/ICRlbGVtZW50Lm91dGVySGVpZ2h0KCkgOiBwbGFjZWhvbGRlck1pbkhlaWdodDtcbiAgICAgICAgJGVsZW1lbnQucGFyZW50KCkuaGVpZ2h0KHBsYWNlaG9sZGVySGVpZ2h0KTtcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBpbml0U3RpY2t5KCkge1xuICAgICAgICB2YXIgb3B0aW9ucyA9IHtcbiAgICAgICAgICAgIGFuaW1hdGlvbjogJ3VrLWFuaW1hdGlvbi1zbGlkZS10b3AnXG4gICAgICAgIH07XG5cbiAgICAgICAgaWYgKCFpc01vYmlsZSgpKSB7XG4gICAgICAgICAgICAkKHdpbmRvdykub24oJ3Njcm9sbCcsIG9uU2Nyb2xsU2hyaW5rKTtcbiAgICAgICAgfVxuXG4gICAgICAgICRtb2JpbGVNZW51SG9vay5vbignY2xpY2snLCBvbk1vYmlsZU1lbnVDbGljayk7XG5cbiAgICAgICAgcmV0dXJuIFVJa2l0LnN0aWNreSgkZWxlbWVudCwgb3B0aW9ucyk7XG4gICAgfVxuXG4gICAgJCh3aW5kb3cpLm9uKCdyZXNpemUnLCBVSWtpdC5VdGlscy5kZWJvdW5jZShmdW5jdGlvbiAoZXZlbnQpIHtcblxuICAgICAgICAvLyBjb25zb2xlLmxvZygnc3RhdGVJc01vYmlsZScsIGlzTW9iaWxlKCkpO1xuICAgICAgICAvLyBjb25zb2xlLmxvZygnc3RpY2t5SGVhZGVyLm9wdGlvbnMuc2hvd3VwJywgc3RpY2t5SGVhZGVyLm9wdGlvbnMuc2hvd3VwKTtcbiAgICAgICAgLy8gY29uc29sZS5sb2coJ3N0aWNreUhlYWRlci5vcHRpb25zLnNob3d1cCAhPT0gc3RhdGVJc01vYmlsZScsIHN0aWNreUhlYWRlci5vcHRpb25zLnNob3d1cCAhPT0gaXNNb2JpbGUoKSk7XG5cbiAgICAgICAgLy8gaWYgbW9iaWxlICg8IDk2MHB4KSwgcmVtb3ZlIGxpc3RlbmVyIGZvciBoZWFkZXIgc2hyaW5raW5nIGFuZCBhY3RpdmF0ZSBzaG93dXAgZmVhdHVyZVxuICAgICAgICBpZiAoaXNNb2JpbGUoKSkge1xuICAgICAgICAgICAgJCh3aW5kb3cpLm9mZignc2Nyb2xsJywgb25TY3JvbGxTaHJpbmspO1xuXG4gICAgICAgICAgICBpZiAoJGhlYWRlci5oYXNDbGFzcygndG0taGVhZGVyLS1zbWFsbCcpKSB7XG4gICAgICAgICAgICAgICAgJGhlYWRlci5yZW1vdmVDbGFzcygndG0taGVhZGVyLS1zbWFsbCcpO1xuICAgICAgICAgICAgfVxuXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAkKHdpbmRvdykub24oJ3Njcm9sbCcsIG9uU2Nyb2xsU2hyaW5rKTtcbiAgICAgICAgICAgIG9uU2Nyb2xsU2hyaW5rKCk7XG5cbiAgICAgICAgfVxuXG4gICAgICAgIHJlY2FsY1dyYXBwZXJIZWlnaHQoKTtcblxuICAgIH0sIDIwMCkpO1xuXG4gICAgc3RpY2t5SGVhZGVyID0gaW5pdFN0aWNreSgpO1xuXG4gICAgJChkb2N1bWVudCkub24oJ3RvdWNobW92ZScsICcuanMtZGlzYWJsZWQtc2Nyb2xsaW5nJywgZnVuY3Rpb24oZXZlbnQpIHtcbiAgICAgICAgdmFyIG1lbnVIZWlnaHQgPSAkbW9iaWxlTWVudS5vdXRlckhlaWdodCgpICsgJCgnI3RtLWhlYWRlcicpLm91dGVySGVpZ2h0KCksXG4gICAgICAgICAgICB2aWV3cG9ydEhlaWdodCA9ICQod2luZG93KS5vdXRlckhlaWdodCgpO1xuXG4gICAgICAgIGlmIChtZW51SGVpZ2h0IDwgdmlld3BvcnRIZWlnaHQpIHtcbiAgICAgICAgICAgIGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG4gICAgICAgIH1cbiAgICB9KTtcblxufSkoalF1ZXJ5LCB3aW5kb3csIHdpbmRvdy5kb2N1bWVudCk7XG4iLCIoZnVuY3Rpb24gKCQsIHdpbmRvdywgZG9jdW1lbnQsIHVuZGVmaW5lZCkge1xuICAgICd1c2Ugc3RyaWN0JztcblxuICAgIHZhciBpbml0ID0gbnVsbDtcbiAgICB2YXIgb2Zmc2V0VG9wID0gbnVsbDtcbiAgICB2YXIgJGVsZW1lbnQgPSAkKCcuanMtc3RpY2t5LXN1Ym1lbnUnKTtcbiAgICB2YXIgJGhlYWRlciA9ICQoJy5qcy1zdGlja3ktaGVhZGVyIC50bS1oZWFkZXInKTtcbiAgICB2YXIgb2Zmc2V0VG9wTWVkaXVtID0gMTAyO1xuICAgIHZhciBvZmZzZXRUb3BTbWFsbCA9IDYyO1xuXG4gICAgLy8gU2xpZGUgdG8gYW5jaG9yXG4gICAgJCgnLmpzLXNlY3Rpb24tbWVudSBhJykub24oJ2NsaWNrJywgZnVuY3Rpb24oZSkge1xuICAgICAgICBlLnByZXZlbnREZWZhdWx0KCk7XG5cbiAgICAgICAgdmFyIGhyZWYgPSAkKHRoaXMpLmF0dHIoJ2hyZWYnKTtcblxuICAgICAgICBpZiAoJCh0aGlzKS5oYXNDbGFzcygnanMtbGluaycpIHx8IGhyZWYuaW5kZXhPZignIycpID09ICctMScpIHtcbiAgICAgICAgICAgIHdpbmRvdy5sb2NhdGlvbiA9ICQodGhpcykuYXR0cignaHJlZicpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgdmFyIGFUYWcgPSAkKCQodGhpcykuYXR0cignaHJlZicpKTtcblxuICAgICAgICAgICAgY29uc29sZS5sb2coYVRhZyk7XG5cbiAgICAgICAgICAgICQodGhpcykuY2xvc2VzdCgndWwnKS5maW5kKCcuYWN0aXZlJykucmVtb3ZlQ2xhc3MoJ2FjdGl2ZScpO1xuICAgICAgICAgICAgJCh0aGlzKS5jbG9zZXN0KCdsaScpLmFkZENsYXNzKCdhY3RpdmUnKTtcblxuICAgICAgICAgICAgc2Nyb2xsVG9wKGFUYWcpO1xuICAgICAgICB9XG4gICAgfSk7XG5cbiAgICAkKCcuanMtc2VjdGlvbi1tZW51LW1vYmlsZScpLm9uKCdzZWxlY3QyOnNlbGVjdCcsIGZ1bmN0aW9uKCkge1xuICAgICAgICB2YXIgYVRhZyA9ICQoXCJbaWQ9J1wiICsgJCh0aGlzKS5maW5kKFwiOnNlbGVjdGVkXCIpLmRhdGEoJ2hyZWYnKS5yZXBsYWNlKCcjJywgJycpICsgXCInXVwiKTtcblxuICAgICAgICBjb25zb2xlLmxvZyhhVGFnKTtcblxuICAgICAgICBpZiAoJCh0aGlzKS5maW5kKFwiOnNlbGVjdGVkXCIpLmhhc0NsYXNzKCdqcy1saW5rJykpIHtcbiAgICAgICAgICAgIHdpbmRvdy5sb2NhdGlvbiA9ICQodGhpcykuZmluZChcIjpzZWxlY3RlZFwiKS5kYXRhKCdocmVmJyk7XG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICBzY3JvbGxUb3AoYVRhZyk7XG4gICAgICAgIH1cbiAgICB9KTtcblxuXG4gICAgZnVuY3Rpb24gc2Nyb2xsVG9wKGFUYWcpIHtcbiAgICAgICAgaWYgKCFhVGFnLm9mZnNldCgpKSB7XG4gICAgICAgICAgICByZXR1cm47XG4gICAgICAgIH1cblxuICAgICAgICB2YXIgb2Zmc2V0ID0gc2V0T2Zmc2V0VG9wKCkgKyAkZWxlbWVudC5vdXRlckhlaWdodCh0cnVlKTtcbiAgICAgICAgJCgnaHRtbCxib2R5JykuYW5pbWF0ZSh7c2Nyb2xsVG9wOiBhVGFnLm9mZnNldCgpLnRvcCwgZWFzZTogJ2Vhc2Vpbm91dCd9LCA1MDApO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIGlzTW9iaWxlKCkge1xuICAgICAgICByZXR1cm4gIXdpbmRvdy5tYXRjaE1lZGlhKCcobWluLXdpZHRoOiAxMjIwcHgpJykubWF0Y2hlcztcbiAgICB9XG5cbiAgICBmdW5jdGlvbiBzZXRPZmZzZXRUb3AoKSB7XG5cbiAgICAgICAgdmFyIG9mZnNldFRvcCA9IG9mZnNldFRvcFNtYWxsO1xuXG4gICAgICAgIGlmKCFpc01vYmlsZSgpKSB7XG4gICAgICAgICAgICBvZmZzZXRUb3AgPSBvZmZzZXRUb3BNZWRpdW07XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4gb2Zmc2V0VG9wO1xuICAgIH1cblxuICAgIGZ1bmN0aW9uIHN0aWNreVN1Ym1lbnUoKSB7XG5cbiAgICAgICAgZnVuY3Rpb24gaW5pdCgpIHtcbiAgICAgICAgICAgIHZhciBvcHRpb25zID0ge1xuICAgICAgICAgICAgICAgIHRvcDogc2V0T2Zmc2V0VG9wKCksXG4gICAgICAgICAgICAgICAgYW5pbWF0aW9uOiAndWstYW5pbWF0aW9uLXNsaWRlLXRvcCdcbiAgICAgICAgICAgIH07XG5cbiAgICAgICAgICAgIHJldHVybiBVSWtpdC5zdGlja3koJGVsZW1lbnQsIG9wdGlvbnMpO1xuICAgICAgICB9XG5cbiAgICAgICAgJCh3aW5kb3cpLm9uKCdyZXNpemUnLCBVSWtpdC5VdGlscy5kZWJvdW5jZShmdW5jdGlvbiAoZXZlbnQpIHtcblxuICAgICAgICAgICAgVUlraXQuc3RpY2t5KCRlbGVtZW50KS5vcHRpb25zLnRvcCA9IHNldE9mZnNldFRvcCgpO1xuXG4gICAgICAgIH0sIDIwMCkpO1xuXG4gICAgICAgIGluaXQgPSBpbml0KCk7XG4gICAgfVxuXG4gICAgdmFyIHN0aWNreVN1Ym1lbnUgPSBzdGlja3lTdWJtZW51KCk7XG5cbn0pKGpRdWVyeSwgd2luZG93LCB3aW5kb3cuZG9jdW1lbnQpO1xuIiwiKGZ1bmN0aW9uICgkLCB3aW5kb3csIGRvY3VtZW50LCB1bmRlZmluZWQpIHtcbiAgICAndXNlIHN0cmljdCc7XG5cbiAgICAvLyBGaWxsIFRhYmxlIHdpdGggZW1wdHkgaXRlbXMgaWYgbmVlZGVkXG4gICAgZnVuY3Rpb24gZmlsbFRhYmxlKCkge1xuICAgICAgICB2YXIgY29udGFpbmVyID0gJCgnLmpzLXRtLXRhYmxlJyk7XG4gICAgICAgIHZhciBlbXB0eSA9ICc8ZGl2IGNsYXNzPVwidG0tdGFibGVfX2dyaWQgdG0tdGFibGVfX2dyaWRfX2l0ZW0gdG0tdGFibGVfX2dyaWQtLWVtcHR5XCI+PC9kaXY+J1xuICAgICAgICB2YXIgaXRlbXNBcnJheSA9IFtdO1xuICAgICAgICB2YXIgbWF4Um93cyA9IFtdO1xuICAgICAgICB2YXIgZmlsbCA9IDA7XG5cbiAgICAgICAgJC5lYWNoKGNvbnRhaW5lciwgZnVuY3Rpb24gZ2V0SXRlbXMoaSkge1xuICAgICAgICAgICAgaXRlbXNBcnJheVtpXSA9IFtdO1xuICAgICAgICAgICAgJCh0aGlzKS5maW5kKCcudG0tdGFibGUtaXRlbScpLmVhY2goZnVuY3Rpb24gZ2V0SXRlbXNJbm5lciAoZikge1xuICAgICAgICAgICAgICAgIHZhciBpdGVtcyA9ICQodGhpcykuZGF0YSgnaXRlbXMnKTtcbiAgICAgICAgICAgICAgICB2YXIgY29scyA9ICQodGhpcykuZGF0YSgnY29scycpO1xuICAgICAgICAgICAgICAgIHZhciByb3dzID0gTWF0aC5jZWlsKGl0ZW1zIC8gY29scyk7XG5cbiAgICAgICAgICAgICAgICBpdGVtc0FycmF5W2ldW2ZdID0gW2l0ZW1zLCBjb2xzLCByb3dzXTtcblxuICAgICAgICAgICAgICAgIGlmKG1heFJvd3NbaV0gPCByb3dzIHx8IG1heFJvd3NbaV0gPT09IHVuZGVmaW5lZCkge1xuICAgICAgICAgICAgICAgICAgICBtYXhSb3dzW2ldID0gcm93cztcbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG5cbiAgICAgICAgJC5lYWNoKGl0ZW1zQXJyYXksIGZ1bmN0aW9uIHNldEl0ZW1zKGksIGUpIHtcblxuICAgICAgICAgICAgJC5lYWNoKGUsIGZ1bmN0aW9uIHNldEl0ZW1zSW5uZXIgKGYsIGcpIHtcblxuICAgICAgICAgICAgICAgIGlmKGdbMV0gPT0gMSkge1xuICAgICAgICAgICAgICAgICAgICBpZihnWzNdICE9IG1heFJvd3NbaV0pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIGZpbGwgPSBtYXhSb3dzW2ldIC0gZ1swXTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgZm9yKHZhciBtID0gMDsgbSA8IGZpbGw7IG0rKyApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKCcuanMtdG0tdGFibGU6ZXEoJyArIGkgKyAnKScpLmZpbmQoJy50bS10YWJsZS1pdGVtOmVxKCcgKyBmICsgJyknKS5hcHBlbmQoJChlbXB0eSkpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgaWYoZ1sxXSA9PSAzKSB7XG4gICAgICAgICAgICAgICAgICAgIGlmKGdbM10gIT0gbWF4Um93c1tpXSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgZmlsbCA9IG1heFJvd3NbaV0gKiBnWzFdIC0gZ1swXTtcblxuICAgICAgICAgICAgICAgICAgICAgICAgZm9yKHZhciBtID0gMDsgbSA8IGZpbGw7IG0rKyApIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAkKCcuanMtdG0tdGFibGU6ZXEoJyArIGkgKyAnKScpLmZpbmQoJy50bS10YWJsZS1pdGVtOmVxKCcgKyBmICsgJyknKS5maW5kKCcudG0tdGFibGVfX2dyaWRfX2NvbnRhaW5lcicpLmFwcGVuZCgkKGVtcHR5KSk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfSk7XG4gICAgfVxuXG4gICAgZmlsbFRhYmxlKCk7XG5cbn0pKGpRdWVyeSwgd2luZG93LCB3aW5kb3cuZG9jdW1lbnQpO1xuIiwiKGZ1bmN0aW9uICgkLCB3aW5kb3csIGRvY3VtZW50LCB1bmRlZmluZWQpIHtcbiAgICAndXNlIHN0cmljdCc7XG5cbiAgICB2YXIgc2VsZWN0b3IgPSAkKCcuanMtZG93bmxvYWQtdG9nZ2xlIGlucHV0W3R5cGU9Y2hlY2tib3hdJyk7XG4gICAgdmFyIHRhcmdldCA9ICQoJy5qcy1kb3dubG9hZC1idXR0b24nKTtcblxuICAgIHNlbGVjdG9yLm9uKCdjaGFuZ2UnLCBmdW5jdGlvbiB0b2dnbGVEb3dubG9hZEJ1dHRvbigpIHtcblxuICAgICAgICBpZih0YXJnZXQuaGFzQ2xhc3MoJ3BhbmVsLWRvd25sb2FkLS1oaWRkZW4nKSkge1xuICAgICAgICAgICAgJCh0aGlzKS5jbG9zZXN0KCdkaXYnKS5mYWRlT3V0KGZ1bmN0aW9uIGJ1dHRvbkZhZGVJbigpIHtcbiAgICAgICAgICAgICAgICB0YXJnZXQuZmFkZUluKCkucmVtb3ZlQ2xhc3MoJ3BhbmVsLWRvd25sb2FkLS1oaWRkZW4nKTtcbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgIH1cbiAgICB9KTtcblxufSkoalF1ZXJ5LCB3aW5kb3csIHdpbmRvdy5kb2N1bWVudCk7XG4iLCIoZnVuY3Rpb24gKCQsIHdpbmRvdywgZG9jdW1lbnQsIHVuZGVmaW5lZCkge1xuICAgICd1c2Ugc3RyaWN0JztcblxuICAgIHZhciB2aWRlb0hvdmVyID0gKGZ1bmN0aW9uICgpIHtcblxuICAgICAgICBmdW5jdGlvbiBpbml0KCkge1xuICAgICAgICAgICAgJCgnLmpzLXZpZGVvLWhvdmVyJykuaG92ZXIoZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICQodGhpcykuZmluZCgndmlkZW8nKVswXS5wbGF5KCk7XG4gICAgICAgICAgICB9LCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgJCh0aGlzKS5maW5kKCd2aWRlbycpWzBdLnBhdXNlKCk7XG4gICAgICAgICAgICAgICAgJCh0aGlzKS5maW5kKCd2aWRlbycpWzBdLmN1cnJlbnRUaW1lID0gMDtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGluaXQ6IGluaXRcbiAgICAgICAgfTtcbiAgICB9KSgpO1xuXG4gICAgdmFyIHZpZGVvTGlua3MgPSAoZnVuY3Rpb24gKCkge1xuXG4gICAgICAgIGZ1bmN0aW9uIGluaXQoKSB7XG4gICAgICAgICAgICAkKCcuanMtdmlkZW8tbGlua3MnKS5lYWNoKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICB2YXIgJGxpbmtzID0gJCh0aGlzKS5maW5kKCcudG0tcGFuZWwtc3RvcnlfX2xpbmtzIGxpJyk7XG4gICAgICAgICAgICAgICAgdmFyIG51bWJlck9mTGlua3MgPSAkbGlua3MubGVuZ3RoO1xuXG4gICAgICAgICAgICAgICAgLy8gYnJlYWsgaWYgbGVzcyB0aGFuIDIgbGlua3NcbiAgICAgICAgICAgICAgICBpZiAobnVtYmVyT2ZMaW5rcyA8PSAxKSByZXR1cm47XG5cbiAgICAgICAgICAgICAgICAkbGlua3MuZWFjaChmdW5jdGlvbiAoaW5kZXgpIHtcbiAgICAgICAgICAgICAgICAgICAgdmFyICRsaW5rID0gJCh0aGlzKTtcbiAgICAgICAgICAgICAgICAgICAgdmFyICRwYXJlbnRQYW5lbCA9ICRsaW5rLnBhcmVudHMoJy5qcy1wYW5lbC1zdG9yeScpO1xuICAgICAgICAgICAgICAgICAgICB2YXIgJHZpZGVvRWxlbWVudCA9ICRwYXJlbnRQYW5lbC5maW5kKCd2aWRlbycpLmVxKGluZGV4KTtcblxuICAgICAgICAgICAgICAgICAgICAkbGluay5ob3ZlcihmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBoaWRlIGFsbCB2aWRlb3NcbiAgICAgICAgICAgICAgICAgICAgICAgICRwYXJlbnRQYW5lbC5maW5kKCd2aWRlbycpLmNzcygnZGlzcGxheScsICdub25lJyk7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBzaG93IHRoZSBjb3JyZWN0IHZpZGVvXG4gICAgICAgICAgICAgICAgICAgICAgICAkdmlkZW9FbGVtZW50LmNzcygnZGlzcGxheScsICdpbmxpbmUnKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN0YXJ0IHBsYXlpbmdcbiAgICAgICAgICAgICAgICAgICAgICAgICR2aWRlb0VsZW1lbnRbMF0ucGxheSgpO1xuICAgICAgICAgICAgICAgICAgICB9LCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAvLyBzdG9wIHBsYXlpbmdcbiAgICAgICAgICAgICAgICAgICAgICAgICR2aWRlb0VsZW1lbnRbMF0ucGF1c2UoKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlc2V0IHZpZGVvXG4gICAgICAgICAgICAgICAgICAgICAgICAkdmlkZW9FbGVtZW50WzBdLmN1cnJlbnRUaW1lID0gMDtcbiAgICAgICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICAgICAgfSk7XG4gICAgICAgICAgICB9KTtcbiAgICAgICAgfVxuXG4gICAgICAgIHJldHVybiB7XG4gICAgICAgICAgICBpbml0OiBpbml0XG4gICAgICAgIH07XG4gICAgfSkoKTtcblxuICAgIHZhciB2aWRlb1N3aXRjaFBvc3RlciA9IChmdW5jdGlvbiAoKSB7XG5cbiAgICAgICAgZnVuY3Rpb24gaW5pdCgpIHtcblxuICAgICAgICAgICAgLy8kKHdpbmRvdykub24oJ3Jlc2l6ZScsIGZ1bmN0aW9uIChlKSB7XG4gICAgICAgICAgICAvLyAgICBjaGVja1dpbmRvd1dpZHRoKCk7XG4gICAgICAgICAgICAvL30pO1xuXG4gICAgICAgICAgICBjaGVja1dpbmRvd1dpZHRoKCk7XG4gICAgICAgIH1cblxuICAgICAgICBmdW5jdGlvbiBjaGVja1dpbmRvd1dpZHRoKCkge1xuICAgICAgICAgICAgdmFyIHdXaWR0aCA9ICQod2luZG93KS53aWR0aCgpO1xuXG4gICAgICAgICAgICBpZiAod1dpZHRoID4gNzY3KSB7XG4gICAgICAgICAgICAgICAgY2hhbmdlVmlkZW9Qb3N0ZXIoJ2xhcmdlJyk7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHdXaWR0aCA+IDMyMCkge1xuICAgICAgICAgICAgICAgIGNoYW5nZVZpZGVvUG9zdGVyKCdtZWRpdW0nKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgY2hhbmdlVmlkZW9Qb3N0ZXIoJ3NtYWxsJyk7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgfVxuXG4gICAgICAgIGZ1bmN0aW9uIGNoYW5nZVZpZGVvUG9zdGVyKHBvc3RlclNpemUpIHtcblxuICAgICAgICAgICAgJCgndmlkZW8nKS5lYWNoKGZ1bmN0aW9uIChpLCBlbGVtZW50KSB7XG4gICAgICAgICAgICAgICAgdmFyIHBvc3RlclVybCA9ICQoZWxlbWVudCkuZGF0YSgncG9zdGVyLScgKyBwb3N0ZXJTaXplKTtcbiAgICAgICAgICAgICAgICAkKGVsZW1lbnQpLmF0dHIoJ3Bvc3RlcicsIHBvc3RlclVybCk7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICB9XG5cbiAgICAgICAgcmV0dXJuIHtcbiAgICAgICAgICAgIGluaXQ6IGluaXRcbiAgICAgICAgfTtcbiAgICB9KSgpO1xuXG4gICAgdmFyIHZpZGVvQ29udHJvbHMgPSAoZnVuY3Rpb24gKCkge1xuICAgICAgICB2YXIgJHZpZGVvQ29udGFpbmVyID0gJCgnLmpzLXZpZGVvJyksXG4gICAgICAgICAgICAkdmlkZW8gPSAkdmlkZW9Db250YWluZXIuZmluZCgndmlkZW8nKSxcbiAgICAgICAgICAgICRwbGF5Q29udHJvbCA9ICQoJy5qcy12aWRlby1wbGF5JyksXG4gICAgICAgICAgICAkcGF1c2VDb250cm9sID0gJCgnLmpzLXZpZGVvLXBhdXNlJyksXG4gICAgICAgICAgICAkbXV0ZUNvbnRyb2wgPSAkKCcuanMtdmlkZW8tbXV0ZScpO1xuXG4gICAgICAgIGZ1bmN0aW9uIGluaXQoKSB7XG5cbiAgICAgICAgICAgICRwbGF5Q29udHJvbC5vbignY2xpY2snLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgdmFyICR0aGlzID0gJCh0aGlzKSxcbiAgICAgICAgICAgICAgICAgICAgdmlkZW8gPSAkdGhpcy5wYXJlbnRzKCcuanMtdmlkZW8nKS5maW5kKCd2aWRlbycpWzBdO1xuXG4gICAgICAgICAgICAgICAgJCh2aWRlbykuY3NzKCdkaXNwbGF5JywgJ2Jsb2NrJyk7XG5cbiAgICAgICAgICAgICAgICB2aWRlby5wbGF5KCk7XG5cbiAgICAgICAgICAgICAgICBpZiAoJCgnaHRtbCcpLmhhc0NsYXNzKCd1ay10b3VjaCcpICYmIHdpbmRvdy5tYXRjaE1lZGlhKCcobWF4LXdpZHRoOiAxMDI0cHgpJykubWF0Y2hlcykge1xuICAgICAgICAgICAgICAgICAgICBoYW5kbGVGdWxsU2NyZWVuKHZpZGVvKTtcblxuICAgICAgICAgICAgICAgICAgICB0cnkge1xuICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHZpZGVvLnJlcXVlc3RGdWxsc2NyZWVuKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlkZW8ucmVxdWVzdEZ1bGxzY3JlZW4oKTtcbiAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodmlkZW8ubW96UmVxdWVzdEZ1bGxTY3JlZW4pIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aWRlby5tb3pSZXF1ZXN0RnVsbFNjcmVlbigpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICh2aWRlby53ZWJraXRSZXF1ZXN0RnVsbHNjcmVlbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpZGVvLndlYmtpdFJlcXVlc3RGdWxsc2NyZWVuKCk7XG4gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHZpZGVvLndlYmtpdEVudGVyRnVsbHNjcmVlbikge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpZGVvLndlYmtpdEVudGVyRnVsbFNjcmVlbigpO1xuICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICB9XG5cbiAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKGUpIHtcbiAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgICAgICR0aGlzLmNzcygnZGlzcGxheScsICdub25lJyk7XG4gICAgICAgICAgICAgICAgICAgICRwYXVzZUNvbnRyb2wuY3NzKCdkaXNwbGF5JywgJ2lubGluZS1ibG9jaycpO1xuICAgICAgICAgICAgICAgICAgICAkbXV0ZUNvbnRyb2wuY3NzKCdkaXNwbGF5JywgJ2lubGluZS1ibG9jaycpO1xuXG4gICAgICAgICAgICAgICAgICAgIGlmICghJHZpZGVvQ29udGFpbmVyLmhhc0NsYXNzKCd0bS12aWRlby0tLWlzLXBsYXlpbmcnKSkge1xuICAgICAgICAgICAgICAgICAgICAgICAgJHZpZGVvQ29udGFpbmVyLmFkZENsYXNzKCd0bS12aWRlby0taXMtcGxheWluZycpO1xuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgfVxuXG4gICAgICAgICAgICAgICAgLy8gaWYgdmlkZW8gZW5kZWQgaGlkZSBpdCBhbmQgc2hvdyBpbWFnZVxuICAgICAgICAgICAgICAgICQodmlkZW8pLm9uKCdlbmRlZCcsIGZ1bmN0aW9uIChlKSB7XG4gICAgICAgICAgICAgICAgICAgICQodmlkZW8pLmNzcygnZGlzcGxheScsICdub25lJyk7XG4gICAgICAgICAgICAgICAgICAgIHZpZGVvLmN1cnJlbnRUaW1lID0gMDtcbiAgICAgICAgICAgICAgICAgICAgJHZpZGVvQ29udGFpbmVyLnJlbW92ZUNsYXNzKCd0bS12aWRlby0taXMtcGxheWluZycpO1xuXG4gICAgICAgICAgICAgICAgICAgICRwYXVzZUNvbnRyb2wuY3NzKCdkaXNwbGF5JywgJ25vbmUnKTtcbiAgICAgICAgICAgICAgICAgICAgJG11dGVDb250cm9sLmNzcygnZGlzcGxheScsICdub25lJyk7XG4gICAgICAgICAgICAgICAgICAgICRwbGF5Q29udHJvbC5jc3MoJ2Rpc3BsYXknLCAnaW5saW5lLWJsb2NrJyk7XG4gICAgICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAkcGF1c2VDb250cm9sLm9uKCdjbGljaycsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICB2YXIgZWxlbWVudCA9IHRoaXM7XG4gICAgICAgICAgICAgICAgaGFuZGxlUGF1c2UoZWxlbWVudCk7XG4gICAgICAgICAgICB9KTtcblxuICAgICAgICAgICAgJG11dGVDb250cm9sLm9uKCdjbGljaycsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICB2YXIgJHRoaXMgPSAkKHRoaXMpLFxuICAgICAgICAgICAgICAgICAgICB2aWRlbyA9ICR0aGlzLnBhcmVudHMoJy5qcy12aWRlbycpLmZpbmQoJ3ZpZGVvJylbMF07XG5cbiAgICAgICAgICAgICAgICAodmlkZW8ubXV0ZWQpID8gdmlkZW8ubXV0ZWQgPSBmYWxzZSA6IHZpZGVvLm11dGVkID0gdHJ1ZTtcblxuICAgICAgICAgICAgICAgICR0aGlzLnRvZ2dsZUNsYXNzKCd0bS12aWRlby1jb250cm9sc19fbXV0ZS0taXMtbXV0ZWQnKTtcbiAgICAgICAgICAgIH0pO1xuICAgICAgICB9XG5cbiAgICAgICAgZnVuY3Rpb24gaGFuZGxlUGF1c2UoZWxlbWVudCkge1xuICAgICAgICAgICAgdmFyICR0aGlzID0gJChlbGVtZW50KSB8fCAkKHRoaXMpLFxuICAgICAgICAgICAgICAgIHZpZGVvID0gJHRoaXMucGFyZW50cygnLmpzLXZpZGVvJykuZmluZCgndmlkZW8nKVswXTtcblxuICAgICAgICAgICAgJHRoaXMuY3NzKCdkaXNwbGF5JywgJ25vbmUnKTtcbiAgICAgICAgICAgICRtdXRlQ29udHJvbC5jc3MoJ2Rpc3BsYXknLCAnbm9uZScpO1xuICAgICAgICAgICAgJHBsYXlDb250cm9sLmNzcygnZGlzcGxheScsICdpbmxpbmUtYmxvY2snKTtcblxuICAgICAgICAgICAgdmlkZW8ucGF1c2UoKTtcbiAgICAgICAgICAgICR2aWRlb0NvbnRhaW5lci5yZW1vdmVDbGFzcygndG0tdmlkZW8tLWlzLXBsYXlpbmcnKTtcblxuICAgICAgICAgICAgLy8gY29uc29sZS5sb2coXCIkKCdodG1sJykuaGFzQ2xhc3MoJ3VrLXRvdWNoJykgfHwgd2luZG93Lm1hdGNoTWVkaWEoJyhtYXgtd2lkdGg6IDc2OHB4KScpLm1hdGNoZXNcIiwgJCgnaHRtbCcpLmhhc0NsYXNzKCd1ay10b3VjaCcpIHx8IHdpbmRvdy5tYXRjaE1lZGlhKCcobWF4LXdpZHRoOiA3NjhweCknKS5tYXRjaGVzKTtcblxuICAgICAgICAgICAgaWYgKCQoJ2h0bWwnKS5oYXNDbGFzcygndWstdG91Y2gnKSB8fCB3aW5kb3cubWF0Y2hNZWRpYSgnKG1heC13aWR0aDogNzY4cHgpJykubWF0Y2hlcykge1xuICAgICAgICAgICAgICAgICQodmlkZW8pLmNzcygnZGlzcGxheScsICdub25lJyk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBmdW5jdGlvbiBoYW5kbGVGdWxsU2NyZWVuKHZpZGVvKSB7XG4gICAgICAgICAgICB2YXIgaXNGdWxsU2NyZWVuO1xuXG4gICAgICAgICAgICAvLyBkZXNrdG9wIGNocm9tZS9zYWZhcmkvb3BlcmEvZmlyZWZveCAvIG1vYmlsZSBjaHJvbWVcbiAgICAgICAgICAgICQoZG9jdW1lbnQpLm9uKCd3ZWJraXRmdWxsc2NyZWVuY2hhbmdlIG1vemZ1bGxzY3JlZW5jaGFuZ2UgZnVsbHNjcmVlbmNoYW5nZSAnLCBmdW5jdGlvbiAoZXZlbnQpIHtcbiAgICAgICAgICAgICAgICBpc0Z1bGxTY3JlZW4gPSBjaGVja0Z1bGxTY3JlZW4odmlkZW8pO1xuXG4gICAgICAgICAgICAgICAgaWYgKCFpc0Z1bGxTY3JlZW4pIHtcbiAgICAgICAgICAgICAgICAgICAgaGFuZGxlUGF1c2UodmlkZW8pO1xuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pO1xuXG4gICAgICAgICAgICAvLyBpb3Mgc2FmYXJpXG4gICAgICAgICAgICAkKHZpZGVvKS5vbignd2Via2l0YmVnaW5mdWxsc2NyZWVuIHdlYmtpdGVuZGZ1bGxzY3JlZW4nLCBmdW5jdGlvbihldmVudCkge1xuICAgICAgICAgICAgICAgIGlzRnVsbFNjcmVlbiA9IGNoZWNrRnVsbFNjcmVlbih2aWRlbyk7XG5cbiAgICAgICAgICAgICAgICBpZiAoIWlzRnVsbFNjcmVlbikge1xuICAgICAgICAgICAgICAgICAgICBoYW5kbGVQYXVzZSh2aWRlbyk7XG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSk7XG4gICAgICAgIH1cblxuICAgICAgICBmdW5jdGlvbiBjaGVja0Z1bGxTY3JlZW4odmlkZW8pIHtcbiAgICAgICAgICAgIHZhciBpc0Z1bGxTY3JlZW47XG5cbiAgICAgICAgICAgIGlmIChkb2N1bWVudC5mdWxsc2NyZWVuKSB7XG4gICAgICAgICAgICAgICAgaXNGdWxsU2NyZWVuID0gZG9jdW1lbnQuZnVsbHNjcmVlbjtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAoZG9jdW1lbnQubW96RnVsbFNjcmVlbikge1xuICAgICAgICAgICAgICAgIGlzRnVsbFNjcmVlbiA9IGRvY3VtZW50Lm1vekZ1bGxTY3JlZW47XG4gICAgICAgICAgICB9IGVsc2UgaWYgKGRvY3VtZW50LndlYmtpdElzRnVsbFNjcmVlbikge1xuICAgICAgICAgICAgICAgIGlzRnVsbFNjcmVlbiA9IGRvY3VtZW50LndlYmtpdElzRnVsbFNjcmVlbjtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodmlkZW8ud2Via2l0RGlzcGxheWluZ0Z1bGxzY3JlZW4pIHtcbiAgICAgICAgICAgICAgICBpc0Z1bGxTY3JlZW4gPSB2aWRlby53ZWJraXREaXNwbGF5aW5nRnVsbHNjcmVlbjtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgaXNGdWxsU2NyZWVuID0gZmFsc2U7XG4gICAgICAgICAgICB9XG5cbiAgICAgICAgICAgIC8vIGNvbnNvbGUubG9nKGlzRnVsbFNjcmVlbik7XG5cbiAgICAgICAgICAgIHJldHVybiBpc0Z1bGxTY3JlZW47XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgaW5pdDogaW5pdFxuICAgICAgICB9O1xuXG4gICAgfSkoKTtcblxuICAgIHZpZGVvSG92ZXIuaW5pdCgpO1xuICAgIHZpZGVvTGlua3MuaW5pdCgpO1xuICAgIHZpZGVvU3dpdGNoUG9zdGVyLmluaXQoKTtcbiAgICB2aWRlb0NvbnRyb2xzLmluaXQoKTtcblxufSkoalF1ZXJ5LCB3aW5kb3csIHdpbmRvdy5kb2N1bWVudCk7XG4iLCIkKGZ1bmN0aW9uKCkge1xuICAgICd1c2Ugc3RyaWN0JztcblxuICAgIHZhciBVdGlsc01hdGNoSGVpZ2h0cyA9IChmdW5jdGlvbigpIHtcblxuICAgICAgICBmdW5jdGlvbiBtYXRjaEhlaWdodHMoc2VsZWN0b3IpIHtcbiAgICAgICAgICAgIFVJa2l0LlV0aWxzLm1hdGNoSGVpZ2h0cyhzZWxlY3Rvcik7XG4gICAgICAgIH1cblxuICAgICAgICByZXR1cm4ge1xuICAgICAgICAgICAgbWF0Y2g6IG1hdGNoSGVpZ2h0c1xuICAgICAgICB9O1xuICAgIH0pKCk7XG5cblxuICAgIGlmICgkKCcuanMtcGFuZWwtc3RvcnkgPiAudG0tcGFuZWwtc3RvcnlfX2JvdHRvbScpLmxlbmd0aCA+IDEpIHtcbiAgICAgICAgJCh3aW5kb3cpLm9uKCdsb2FkIHJlc2l6ZSBvcmllbnRhdGlvbmNoYW5nZScsIChmdW5jdGlvbigpIHtcbiAgICAgICAgICAgIFVJa2l0LlV0aWxzLmRlYm91bmNlKFV0aWxzTWF0Y2hIZWlnaHRzLm1hdGNoKCcuanMtcGFuZWwtc3RvcnkgPiAudG0tcGFuZWwtc3RvcnlfX2JvdHRvbScpLCA1MCk7XG4gICAgICAgIH0pKCkpO1xuICAgIH1cblxuICAgICQoJy50bS1oZWFkZXIgW2RhdGEtdWstZHJvcGRvd25dJykub24oJ3Nob3cudWsuZHJvcGRvd24nLCBmdW5jdGlvbigpIHtcblxuICAgICAgICB2YXIgJHNsaWRlckVsZW1lbnQgPSAkKHRoaXMpLmZpbmQoJy5qcy1tZW51LWRlc2t0b3AnKTtcblxuICAgICAgICBpZiAoJHNsaWRlckVsZW1lbnQubGVuZ3RoKSB7XG4gICAgICAgICAgICBVSWtpdC5zbGlkZXIoJHNsaWRlckVsZW1lbnQsIHtcbiAgICAgICAgICAgICAgICBpbmZpbml0ZTogdHJ1ZVxuICAgICAgICAgICAgfSk7XG5cbiAgICAgICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICAgICAgJCh3aW5kb3cpLnRyaWdnZXIoJ3Jlc2l6ZScpO1xuICAgICAgICAgICAgICAgIGNvbnNvbGUubG9nKCd0cmlnZ2VyIHdpbmRvdyByZXNpemUnKTtcbiAgICAgICAgICAgIH0sIDIwMClcbiAgICAgICAgfVxuXG4gICAgICAgIHNldFRpbWVvdXQoZnVuY3Rpb24oKSB7XG4gICAgICAgICAgICBVdGlsc01hdGNoSGVpZ2h0cy5tYXRjaCgnLmpzLXBhbmVsLXN0b3J5ID4gLnRtLXBhbmVsLXN0b3J5X19ib3R0b20nKTtcbiAgICAgICAgICAgIFV0aWxzTWF0Y2hIZWlnaHRzLm1hdGNoKCcuanMtbWVudS1kZXNrdG9wLWRyb3Bkb3duLW5hdl9faXRlbScpO1xuXG4gICAgICAgICAgICAvLyAkKHdpbmRvdykudHJpZ2dlcigncmVzaXplJyk7XG4gICAgICAgIH0sIDEwMClcblxuICAgIH0pO1xuXG4gICAgLy8gc2VsZWN0MlxuICAgICQoJ3NlbGVjdCcpLnNlbGVjdDIoe1xuICAgICAgICBwbGFjZWhvbGRlcjogJycsXG4gICAgICAgIG1pbmltdW1SZXN1bHRzRm9yU2VhcmNoOiBJbmZpbml0eVxuICAgIH0pO1xuXG4gICAgJCgnW2RhdGEtb3dsY29udHJvbF0nKS5lYWNoKGZ1bmN0aW9uKCkge1xuICAgICAgICAkKHRoaXMpLm93bENvbnRyb2woKTtcbiAgICB9KTtcblxufSk7XG4iLCIvKipcbiAqIE93bCBDYXJvdXNlbCB2Mi4xLjRcbiAqIENvcHlyaWdodCAyMDEzLTIwMTYgRGF2aWQgRGV1dHNjaFxuICogTGljZW5zZWQgdW5kZXIgTUlUIChodHRwczovL2dpdGh1Yi5jb20vT3dsQ2Fyb3VzZWwyL093bENhcm91c2VsMi9ibG9iL21hc3Rlci9MSUNFTlNFKVxuICovXG4vKipcbiAqIE93bCBjYXJvdXNlbFxuICogQHZlcnNpb24gMi4xLjBcbiAqIEBhdXRob3IgQmFydG9zeiBXb2pjaWVjaG93c2tpXG4gKiBAYXV0aG9yIERhdmlkIERldXRzY2hcbiAqIEBsaWNlbnNlIFRoZSBNSVQgTGljZW5zZSAoTUlUKVxuICogQHRvZG8gTGF6eSBMb2FkIEljb25cbiAqIEB0b2RvIHByZXZlbnQgYW5pbWF0aW9uZW5kIGJ1YmxpbmdcbiAqIEB0b2RvIGl0ZW1zU2NhbGVVcFxuICogQHRvZG8gVGVzdCBaZXB0b1xuICogQHRvZG8gc3RhZ2VQYWRkaW5nIGNhbGN1bGF0ZSB3cm9uZyBhY3RpdmUgY2xhc3Nlc1xuICovXG47KGZ1bmN0aW9uKCQsIHdpbmRvdywgZG9jdW1lbnQsIHVuZGVmaW5lZCkge1xuXG5cdC8qKlxuXHQgKiBDcmVhdGVzIGEgY2Fyb3VzZWwuXG5cdCAqIEBjbGFzcyBUaGUgT3dsIENhcm91c2VsLlxuXHQgKiBAcHVibGljXG5cdCAqIEBwYXJhbSB7SFRNTEVsZW1lbnR8alF1ZXJ5fSBlbGVtZW50IC0gVGhlIGVsZW1lbnQgdG8gY3JlYXRlIHRoZSBjYXJvdXNlbCBmb3IuXG5cdCAqIEBwYXJhbSB7T2JqZWN0fSBbb3B0aW9uc10gLSBUaGUgb3B0aW9uc1xuXHQgKi9cblx0ZnVuY3Rpb24gT3dsKGVsZW1lbnQsIG9wdGlvbnMpIHtcblxuXHRcdC8qKlxuXHRcdCAqIEN1cnJlbnQgc2V0dGluZ3MgZm9yIHRoZSBjYXJvdXNlbC5cblx0XHQgKiBAcHVibGljXG5cdFx0ICovXG5cdFx0dGhpcy5zZXR0aW5ncyA9IG51bGw7XG5cblx0XHQvKipcblx0XHQgKiBDdXJyZW50IG9wdGlvbnMgc2V0IGJ5IHRoZSBjYWxsZXIgaW5jbHVkaW5nIGRlZmF1bHRzLlxuXHRcdCAqIEBwdWJsaWNcblx0XHQgKi9cblx0XHR0aGlzLm9wdGlvbnMgPSAkLmV4dGVuZCh7fSwgT3dsLkRlZmF1bHRzLCBvcHRpb25zKTtcblxuXHRcdC8qKlxuXHRcdCAqIFBsdWdpbiBlbGVtZW50LlxuXHRcdCAqIEBwdWJsaWNcblx0XHQgKi9cblx0XHR0aGlzLiRlbGVtZW50ID0gJChlbGVtZW50KTtcblxuXHRcdC8qKlxuXHRcdCAqIFByb3hpZWQgZXZlbnQgaGFuZGxlcnMuXG5cdFx0ICogQHByb3RlY3RlZFxuXHRcdCAqL1xuXHRcdHRoaXMuX2hhbmRsZXJzID0ge307XG5cblx0XHQvKipcblx0XHQgKiBSZWZlcmVuY2VzIHRvIHRoZSBydW5uaW5nIHBsdWdpbnMgb2YgdGhpcyBjYXJvdXNlbC5cblx0XHQgKiBAcHJvdGVjdGVkXG5cdFx0ICovXG5cdFx0dGhpcy5fcGx1Z2lucyA9IHt9O1xuXG5cdFx0LyoqXG5cdFx0ICogQ3VycmVudGx5IHN1cHByZXNzZWQgZXZlbnRzIHRvIHByZXZlbnQgdGhlbSBmcm9tIGJlZWluZyByZXRyaWdnZXJlZC5cblx0XHQgKiBAcHJvdGVjdGVkXG5cdFx0ICovXG5cdFx0dGhpcy5fc3VwcmVzcyA9IHt9O1xuXG5cdFx0LyoqXG5cdFx0ICogQWJzb2x1dGUgY3VycmVudCBwb3NpdGlvbi5cblx0XHQgKiBAcHJvdGVjdGVkXG5cdFx0ICovXG5cdFx0dGhpcy5fY3VycmVudCA9IG51bGw7XG5cblx0XHQvKipcblx0XHQgKiBBbmltYXRpb24gc3BlZWQgaW4gbWlsbGlzZWNvbmRzLlxuXHRcdCAqIEBwcm90ZWN0ZWRcblx0XHQgKi9cblx0XHR0aGlzLl9zcGVlZCA9IG51bGw7XG5cblx0XHQvKipcblx0XHQgKiBDb29yZGluYXRlcyBvZiBhbGwgaXRlbXMgaW4gcGl4ZWwuXG5cdFx0ICogQHRvZG8gVGhlIG5hbWUgb2YgdGhpcyBtZW1iZXIgaXMgbWlzc2xlYWRpbmcuXG5cdFx0ICogQHByb3RlY3RlZFxuXHRcdCAqL1xuXHRcdHRoaXMuX2Nvb3JkaW5hdGVzID0gW107XG5cblx0XHQvKipcblx0XHQgKiBDdXJyZW50IGJyZWFrcG9pbnQuXG5cdFx0ICogQHRvZG8gUmVhbCBtZWRpYSBxdWVyaWVzIHdvdWxkIGJlIG5pY2UuXG5cdFx0ICogQHByb3RlY3RlZFxuXHRcdCAqL1xuXHRcdHRoaXMuX2JyZWFrcG9pbnQgPSBudWxsO1xuXG5cdFx0LyoqXG5cdFx0ICogQ3VycmVudCB3aWR0aCBvZiB0aGUgcGx1Z2luIGVsZW1lbnQuXG5cdFx0ICovXG5cdFx0dGhpcy5fd2lkdGggPSBudWxsO1xuXG5cdFx0LyoqXG5cdFx0ICogQWxsIHJlYWwgaXRlbXMuXG5cdFx0ICogQHByb3RlY3RlZFxuXHRcdCAqL1xuXHRcdHRoaXMuX2l0ZW1zID0gW107XG5cblx0XHQvKipcblx0XHQgKiBBbGwgY2xvbmVkIGl0ZW1zLlxuXHRcdCAqIEBwcm90ZWN0ZWRcblx0XHQgKi9cblx0XHR0aGlzLl9jbG9uZXMgPSBbXTtcblxuXHRcdC8qKlxuXHRcdCAqIE1lcmdlIHZhbHVlcyBvZiBhbGwgaXRlbXMuXG5cdFx0ICogQHRvZG8gTWF5YmUgdGhpcyBjb3VsZCBiZSBwYXJ0IG9mIGEgcGx1Z2luLlxuXHRcdCAqIEBwcm90ZWN0ZWRcblx0XHQgKi9cblx0XHR0aGlzLl9tZXJnZXJzID0gW107XG5cblx0XHQvKipcblx0XHQgKiBXaWR0aHMgb2YgYWxsIGl0ZW1zLlxuXHRcdCAqL1xuXHRcdHRoaXMuX3dpZHRocyA9IFtdO1xuXG5cdFx0LyoqXG5cdFx0ICogSW52YWxpZGF0ZWQgcGFydHMgd2l0aGluIHRoZSB1cGRhdGUgcHJvY2Vzcy5cblx0XHQgKiBAcHJvdGVjdGVkXG5cdFx0ICovXG5cdFx0dGhpcy5faW52YWxpZGF0ZWQgPSB7fTtcblxuXHRcdC8qKlxuXHRcdCAqIE9yZGVyZWQgbGlzdCBvZiB3b3JrZXJzIGZvciB0aGUgdXBkYXRlIHByb2Nlc3MuXG5cdFx0ICogQHByb3RlY3RlZFxuXHRcdCAqL1xuXHRcdHRoaXMuX3BpcGUgPSBbXTtcblxuXHRcdC8qKlxuXHRcdCAqIEN1cnJlbnQgc3RhdGUgaW5mb3JtYXRpb24gZm9yIHRoZSBkcmFnIG9wZXJhdGlvbi5cblx0XHQgKiBAdG9kbyAjMjYxXG5cdFx0ICogQHByb3RlY3RlZFxuXHRcdCAqL1xuXHRcdHRoaXMuX2RyYWcgPSB7XG5cdFx0XHR0aW1lOiBudWxsLFxuXHRcdFx0dGFyZ2V0OiBudWxsLFxuXHRcdFx0cG9pbnRlcjogbnVsbCxcblx0XHRcdHN0YWdlOiB7XG5cdFx0XHRcdHN0YXJ0OiBudWxsLFxuXHRcdFx0XHRjdXJyZW50OiBudWxsXG5cdFx0XHR9LFxuXHRcdFx0ZGlyZWN0aW9uOiBudWxsXG5cdFx0fTtcblxuXHRcdC8qKlxuXHRcdCAqIEN1cnJlbnQgc3RhdGUgaW5mb3JtYXRpb24gYW5kIHRoZWlyIHRhZ3MuXG5cdFx0ICogQHR5cGUge09iamVjdH1cblx0XHQgKiBAcHJvdGVjdGVkXG5cdFx0ICovXG5cdFx0dGhpcy5fc3RhdGVzID0ge1xuXHRcdFx0Y3VycmVudDoge30sXG5cdFx0XHR0YWdzOiB7XG5cdFx0XHRcdCdpbml0aWFsaXppbmcnOiBbICdidXN5JyBdLFxuXHRcdFx0XHQnYW5pbWF0aW5nJzogWyAnYnVzeScgXSxcblx0XHRcdFx0J2RyYWdnaW5nJzogWyAnaW50ZXJhY3RpbmcnIF1cblx0XHRcdH1cblx0XHR9O1xuXG5cdFx0JC5lYWNoKFsgJ29uUmVzaXplJywgJ29uVGhyb3R0bGVkUmVzaXplJyBdLCAkLnByb3h5KGZ1bmN0aW9uKGksIGhhbmRsZXIpIHtcblx0XHRcdHRoaXMuX2hhbmRsZXJzW2hhbmRsZXJdID0gJC5wcm94eSh0aGlzW2hhbmRsZXJdLCB0aGlzKTtcblx0XHR9LCB0aGlzKSk7XG5cblx0XHQkLmVhY2goT3dsLlBsdWdpbnMsICQucHJveHkoZnVuY3Rpb24oa2V5LCBwbHVnaW4pIHtcblx0XHRcdHRoaXMuX3BsdWdpbnNba2V5LmNoYXJBdCgwKS50b0xvd2VyQ2FzZSgpICsga2V5LnNsaWNlKDEpXVxuXHRcdFx0XHQ9IG5ldyBwbHVnaW4odGhpcyk7XG5cdFx0fSwgdGhpcykpO1xuXG5cdFx0JC5lYWNoKE93bC5Xb3JrZXJzLCAkLnByb3h5KGZ1bmN0aW9uKHByaW9yaXR5LCB3b3JrZXIpIHtcblx0XHRcdHRoaXMuX3BpcGUucHVzaCh7XG5cdFx0XHRcdCdmaWx0ZXInOiB3b3JrZXIuZmlsdGVyLFxuXHRcdFx0XHQncnVuJzogJC5wcm94eSh3b3JrZXIucnVuLCB0aGlzKVxuXHRcdFx0fSk7XG5cdFx0fSwgdGhpcykpO1xuXG5cdFx0dGhpcy5zZXR1cCgpO1xuXHRcdHRoaXMuaW5pdGlhbGl6ZSgpO1xuXHR9XG5cblx0LyoqXG5cdCAqIERlZmF1bHQgb3B0aW9ucyBmb3IgdGhlIGNhcm91c2VsLlxuXHQgKiBAcHVibGljXG5cdCAqL1xuXHRPd2wuRGVmYXVsdHMgPSB7XG5cdFx0aXRlbXM6IDMsXG5cdFx0bG9vcDogZmFsc2UsXG5cdFx0Y2VudGVyOiBmYWxzZSxcblx0XHRyZXdpbmQ6IGZhbHNlLFxuXG5cdFx0bW91c2VEcmFnOiB0cnVlLFxuXHRcdHRvdWNoRHJhZzogdHJ1ZSxcblx0XHRwdWxsRHJhZzogdHJ1ZSxcblx0XHRmcmVlRHJhZzogZmFsc2UsXG5cblx0XHRtYXJnaW46IDAsXG5cdFx0c3RhZ2VQYWRkaW5nOiAwLFxuXG5cdFx0bWVyZ2U6IGZhbHNlLFxuXHRcdG1lcmdlRml0OiB0cnVlLFxuXHRcdGF1dG9XaWR0aDogZmFsc2UsXG5cblx0XHRzdGFydFBvc2l0aW9uOiAwLFxuXHRcdHJ0bDogZmFsc2UsXG5cblx0XHRzbWFydFNwZWVkOiAyNTAsXG5cdFx0Zmx1aWRTcGVlZDogZmFsc2UsXG5cdFx0ZHJhZ0VuZFNwZWVkOiBmYWxzZSxcblxuXHRcdHJlc3BvbnNpdmU6IHt9LFxuXHRcdHJlc3BvbnNpdmVSZWZyZXNoUmF0ZTogMjAwLFxuXHRcdHJlc3BvbnNpdmVCYXNlRWxlbWVudDogd2luZG93LFxuXG5cdFx0ZmFsbGJhY2tFYXNpbmc6ICdzd2luZycsXG5cblx0XHRpbmZvOiBmYWxzZSxcblxuXHRcdG5lc3RlZEl0ZW1TZWxlY3RvcjogZmFsc2UsXG5cdFx0aXRlbUVsZW1lbnQ6ICdkaXYnLFxuXHRcdHN0YWdlRWxlbWVudDogJ2RpdicsXG5cblx0XHRyZWZyZXNoQ2xhc3M6ICdvd2wtcmVmcmVzaCcsXG5cdFx0bG9hZGVkQ2xhc3M6ICdvd2wtbG9hZGVkJyxcblx0XHRsb2FkaW5nQ2xhc3M6ICdvd2wtbG9hZGluZycsXG5cdFx0cnRsQ2xhc3M6ICdvd2wtcnRsJyxcblx0XHRyZXNwb25zaXZlQ2xhc3M6ICdvd2wtcmVzcG9uc2l2ZScsXG5cdFx0ZHJhZ0NsYXNzOiAnb3dsLWRyYWcnLFxuXHRcdGl0ZW1DbGFzczogJ293bC1pdGVtJyxcblx0XHRzdGFnZUNsYXNzOiAnb3dsLXN0YWdlJyxcblx0XHRzdGFnZU91dGVyQ2xhc3M6ICdvd2wtc3RhZ2Utb3V0ZXInLFxuXHRcdGdyYWJDbGFzczogJ293bC1ncmFiJ1xuXHR9O1xuXG5cdC8qKlxuXHQgKiBFbnVtZXJhdGlvbiBmb3Igd2lkdGguXG5cdCAqIEBwdWJsaWNcblx0ICogQHJlYWRvbmx5XG5cdCAqIEBlbnVtIHtTdHJpbmd9XG5cdCAqL1xuXHRPd2wuV2lkdGggPSB7XG5cdFx0RGVmYXVsdDogJ2RlZmF1bHQnLFxuXHRcdElubmVyOiAnaW5uZXInLFxuXHRcdE91dGVyOiAnb3V0ZXInXG5cdH07XG5cblx0LyoqXG5cdCAqIEVudW1lcmF0aW9uIGZvciB0eXBlcy5cblx0ICogQHB1YmxpY1xuXHQgKiBAcmVhZG9ubHlcblx0ICogQGVudW0ge1N0cmluZ31cblx0ICovXG5cdE93bC5UeXBlID0ge1xuXHRcdEV2ZW50OiAnZXZlbnQnLFxuXHRcdFN0YXRlOiAnc3RhdGUnXG5cdH07XG5cblx0LyoqXG5cdCAqIENvbnRhaW5zIGFsbCByZWdpc3RlcmVkIHBsdWdpbnMuXG5cdCAqIEBwdWJsaWNcblx0ICovXG5cdE93bC5QbHVnaW5zID0ge307XG5cblx0LyoqXG5cdCAqIExpc3Qgb2Ygd29ya2VycyBpbnZvbHZlZCBpbiB0aGUgdXBkYXRlIHByb2Nlc3MuXG5cdCAqL1xuXHRPd2wuV29ya2VycyA9IFsge1xuXHRcdGZpbHRlcjogWyAnd2lkdGgnLCAnc2V0dGluZ3MnIF0sXG5cdFx0cnVuOiBmdW5jdGlvbigpIHtcblx0XHRcdHRoaXMuX3dpZHRoID0gdGhpcy4kZWxlbWVudC53aWR0aCgpO1xuXHRcdH1cblx0fSwge1xuXHRcdGZpbHRlcjogWyAnd2lkdGgnLCAnaXRlbXMnLCAnc2V0dGluZ3MnIF0sXG5cdFx0cnVuOiBmdW5jdGlvbihjYWNoZSkge1xuXHRcdFx0Y2FjaGUuY3VycmVudCA9IHRoaXMuX2l0ZW1zICYmIHRoaXMuX2l0ZW1zW3RoaXMucmVsYXRpdmUodGhpcy5fY3VycmVudCldO1xuXHRcdH1cblx0fSwge1xuXHRcdGZpbHRlcjogWyAnaXRlbXMnLCAnc2V0dGluZ3MnIF0sXG5cdFx0cnVuOiBmdW5jdGlvbigpIHtcblx0XHRcdHRoaXMuJHN0YWdlLmNoaWxkcmVuKCcuY2xvbmVkJykucmVtb3ZlKCk7XG5cdFx0fVxuXHR9LCB7XG5cdFx0ZmlsdGVyOiBbICd3aWR0aCcsICdpdGVtcycsICdzZXR0aW5ncycgXSxcblx0XHRydW46IGZ1bmN0aW9uKGNhY2hlKSB7XG5cdFx0XHR2YXIgbWFyZ2luID0gdGhpcy5zZXR0aW5ncy5tYXJnaW4gfHwgJycsXG5cdFx0XHRcdGdyaWQgPSAhdGhpcy5zZXR0aW5ncy5hdXRvV2lkdGgsXG5cdFx0XHRcdHJ0bCA9IHRoaXMuc2V0dGluZ3MucnRsLFxuXHRcdFx0XHRjc3MgPSB7XG5cdFx0XHRcdFx0J3dpZHRoJzogJ2F1dG8nLFxuXHRcdFx0XHRcdCdtYXJnaW4tbGVmdCc6IHJ0bCA/IG1hcmdpbiA6ICcnLFxuXHRcdFx0XHRcdCdtYXJnaW4tcmlnaHQnOiBydGwgPyAnJyA6IG1hcmdpblxuXHRcdFx0XHR9O1xuXG5cdFx0XHQhZ3JpZCAmJiB0aGlzLiRzdGFnZS5jaGlsZHJlbigpLmNzcyhjc3MpO1xuXG5cdFx0XHRjYWNoZS5jc3MgPSBjc3M7XG5cdFx0fVxuXHR9LCB7XG5cdFx0ZmlsdGVyOiBbICd3aWR0aCcsICdpdGVtcycsICdzZXR0aW5ncycgXSxcblx0XHRydW46IGZ1bmN0aW9uKGNhY2hlKSB7XG5cdFx0XHR2YXIgd2lkdGggPSAodGhpcy53aWR0aCgpIC8gdGhpcy5zZXR0aW5ncy5pdGVtcykudG9GaXhlZCgzKSAtIHRoaXMuc2V0dGluZ3MubWFyZ2luLFxuXHRcdFx0XHRtZXJnZSA9IG51bGwsXG5cdFx0XHRcdGl0ZXJhdG9yID0gdGhpcy5faXRlbXMubGVuZ3RoLFxuXHRcdFx0XHRncmlkID0gIXRoaXMuc2V0dGluZ3MuYXV0b1dpZHRoLFxuXHRcdFx0XHR3aWR0aHMgPSBbXTtcblxuXHRcdFx0Y2FjaGUuaXRlbXMgPSB7XG5cdFx0XHRcdG1lcmdlOiBmYWxzZSxcblx0XHRcdFx0d2lkdGg6IHdpZHRoXG5cdFx0XHR9O1xuXG5cdFx0XHR3aGlsZSAoaXRlcmF0b3ItLSkge1xuXHRcdFx0XHRtZXJnZSA9IHRoaXMuX21lcmdlcnNbaXRlcmF0b3JdO1xuXHRcdFx0XHRtZXJnZSA9IHRoaXMuc2V0dGluZ3MubWVyZ2VGaXQgJiYgTWF0aC5taW4obWVyZ2UsIHRoaXMuc2V0dGluZ3MuaXRlbXMpIHx8IG1lcmdlO1xuXG5cdFx0XHRcdGNhY2hlLml0ZW1zLm1lcmdlID0gbWVyZ2UgPiAxIHx8IGNhY2hlLml0ZW1zLm1lcmdlO1xuXG5cdFx0XHRcdHdpZHRoc1tpdGVyYXRvcl0gPSAhZ3JpZCA/IHRoaXMuX2l0ZW1zW2l0ZXJhdG9yXS53aWR0aCgpIDogd2lkdGggKiBtZXJnZTtcblx0XHRcdH1cblxuXHRcdFx0dGhpcy5fd2lkdGhzID0gd2lkdGhzO1xuXHRcdH1cblx0fSwge1xuXHRcdGZpbHRlcjogWyAnaXRlbXMnLCAnc2V0dGluZ3MnIF0sXG5cdFx0cnVuOiBmdW5jdGlvbigpIHtcblx0XHRcdHZhciBjbG9uZXMgPSBbXSxcblx0XHRcdFx0aXRlbXMgPSB0aGlzLl9pdGVtcyxcblx0XHRcdFx0c2V0dGluZ3MgPSB0aGlzLnNldHRpbmdzLFxuXHRcdFx0XHR2aWV3ID0gTWF0aC5tYXgoc2V0dGluZ3MuaXRlbXMgKiAyLCA0KSxcblx0XHRcdFx0c2l6ZSA9IE1hdGguY2VpbChpdGVtcy5sZW5ndGggLyAyKSAqIDIsXG5cdFx0XHRcdHJlcGVhdCA9IHNldHRpbmdzLmxvb3AgJiYgaXRlbXMubGVuZ3RoID8gc2V0dGluZ3MucmV3aW5kID8gdmlldyA6IE1hdGgubWF4KHZpZXcsIHNpemUpIDogMCxcblx0XHRcdFx0YXBwZW5kID0gJycsXG5cdFx0XHRcdHByZXBlbmQgPSAnJztcblxuXHRcdFx0cmVwZWF0IC89IDI7XG5cblx0XHRcdHdoaWxlIChyZXBlYXQtLSkge1xuXHRcdFx0XHRjbG9uZXMucHVzaCh0aGlzLm5vcm1hbGl6ZShjbG9uZXMubGVuZ3RoIC8gMiwgdHJ1ZSkpO1xuXHRcdFx0XHRhcHBlbmQgPSBhcHBlbmQgKyBpdGVtc1tjbG9uZXNbY2xvbmVzLmxlbmd0aCAtIDFdXVswXS5vdXRlckhUTUw7XG5cdFx0XHRcdGNsb25lcy5wdXNoKHRoaXMubm9ybWFsaXplKGl0ZW1zLmxlbmd0aCAtIDEgLSAoY2xvbmVzLmxlbmd0aCAtIDEpIC8gMiwgdHJ1ZSkpO1xuXHRcdFx0XHRwcmVwZW5kID0gaXRlbXNbY2xvbmVzW2Nsb25lcy5sZW5ndGggLSAxXV1bMF0ub3V0ZXJIVE1MICsgcHJlcGVuZDtcblx0XHRcdH1cblxuXHRcdFx0dGhpcy5fY2xvbmVzID0gY2xvbmVzO1xuXG5cdFx0XHQkKGFwcGVuZCkuYWRkQ2xhc3MoJ2Nsb25lZCcpLmFwcGVuZFRvKHRoaXMuJHN0YWdlKTtcblx0XHRcdCQocHJlcGVuZCkuYWRkQ2xhc3MoJ2Nsb25lZCcpLnByZXBlbmRUbyh0aGlzLiRzdGFnZSk7XG5cdFx0fVxuXHR9LCB7XG5cdFx0ZmlsdGVyOiBbICd3aWR0aCcsICdpdGVtcycsICdzZXR0aW5ncycgXSxcblx0XHRydW46IGZ1bmN0aW9uKCkge1xuXHRcdFx0dmFyIHJ0bCA9IHRoaXMuc2V0dGluZ3MucnRsID8gMSA6IC0xLFxuXHRcdFx0XHRzaXplID0gdGhpcy5fY2xvbmVzLmxlbmd0aCArIHRoaXMuX2l0ZW1zLmxlbmd0aCxcblx0XHRcdFx0aXRlcmF0b3IgPSAtMSxcblx0XHRcdFx0cHJldmlvdXMgPSAwLFxuXHRcdFx0XHRjdXJyZW50ID0gMCxcblx0XHRcdFx0Y29vcmRpbmF0ZXMgPSBbXTtcblxuXHRcdFx0d2hpbGUgKCsraXRlcmF0b3IgPCBzaXplKSB7XG5cdFx0XHRcdHByZXZpb3VzID0gY29vcmRpbmF0ZXNbaXRlcmF0b3IgLSAxXSB8fCAwO1xuXHRcdFx0XHRjdXJyZW50ID0gdGhpcy5fd2lkdGhzW3RoaXMucmVsYXRpdmUoaXRlcmF0b3IpXSArIHRoaXMuc2V0dGluZ3MubWFyZ2luO1xuXHRcdFx0XHRjb29yZGluYXRlcy5wdXNoKHByZXZpb3VzICsgY3VycmVudCAqIHJ0bCk7XG5cdFx0XHR9XG5cblx0XHRcdHRoaXMuX2Nvb3JkaW5hdGVzID0gY29vcmRpbmF0ZXM7XG5cdFx0fVxuXHR9LCB7XG5cdFx0ZmlsdGVyOiBbICd3aWR0aCcsICdpdGVtcycsICdzZXR0aW5ncycgXSxcblx0XHRydW46IGZ1bmN0aW9uKCkge1xuXHRcdFx0dmFyIHBhZGRpbmcgPSB0aGlzLnNldHRpbmdzLnN0YWdlUGFkZGluZyxcblx0XHRcdFx0Y29vcmRpbmF0ZXMgPSB0aGlzLl9jb29yZGluYXRlcyxcblx0XHRcdFx0Y3NzID0ge1xuXHRcdFx0XHRcdCd3aWR0aCc6IE1hdGguY2VpbChNYXRoLmFicyhjb29yZGluYXRlc1tjb29yZGluYXRlcy5sZW5ndGggLSAxXSkpICsgcGFkZGluZyAqIDIsXG5cdFx0XHRcdFx0J3BhZGRpbmctbGVmdCc6IHBhZGRpbmcgfHwgJycsXG5cdFx0XHRcdFx0J3BhZGRpbmctcmlnaHQnOiBwYWRkaW5nIHx8ICcnXG5cdFx0XHRcdH07XG5cblx0XHRcdHRoaXMuJHN0YWdlLmNzcyhjc3MpO1xuXHRcdH1cblx0fSwge1xuXHRcdGZpbHRlcjogWyAnd2lkdGgnLCAnaXRlbXMnLCAnc2V0dGluZ3MnIF0sXG5cdFx0cnVuOiBmdW5jdGlvbihjYWNoZSkge1xuXHRcdFx0dmFyIGl0ZXJhdG9yID0gdGhpcy5fY29vcmRpbmF0ZXMubGVuZ3RoLFxuXHRcdFx0XHRncmlkID0gIXRoaXMuc2V0dGluZ3MuYXV0b1dpZHRoLFxuXHRcdFx0XHRpdGVtcyA9IHRoaXMuJHN0YWdlLmNoaWxkcmVuKCk7XG5cblx0XHRcdGlmIChncmlkICYmIGNhY2hlLml0ZW1zLm1lcmdlKSB7XG5cdFx0XHRcdHdoaWxlIChpdGVyYXRvci0tKSB7XG5cdFx0XHRcdFx0Y2FjaGUuY3NzLndpZHRoID0gdGhpcy5fd2lkdGhzW3RoaXMucmVsYXRpdmUoaXRlcmF0b3IpXTtcblx0XHRcdFx0XHRpdGVtcy5lcShpdGVyYXRvcikuY3NzKGNhY2hlLmNzcyk7XG5cdFx0XHRcdH1cblx0XHRcdH0gZWxzZSBpZiAoZ3JpZCkge1xuXHRcdFx0XHRjYWNoZS5jc3Mud2lkdGggPSBjYWNoZS5pdGVtcy53aWR0aDtcblx0XHRcdFx0aXRlbXMuY3NzKGNhY2hlLmNzcyk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9LCB7XG5cdFx0ZmlsdGVyOiBbICdpdGVtcycgXSxcblx0XHRydW46IGZ1bmN0aW9uKCkge1xuXHRcdFx0dGhpcy5fY29vcmRpbmF0ZXMubGVuZ3RoIDwgMSAmJiB0aGlzLiRzdGFnZS5yZW1vdmVBdHRyKCdzdHlsZScpO1xuXHRcdH1cblx0fSwge1xuXHRcdGZpbHRlcjogWyAnd2lkdGgnLCAnaXRlbXMnLCAnc2V0dGluZ3MnIF0sXG5cdFx0cnVuOiBmdW5jdGlvbihjYWNoZSkge1xuXHRcdFx0Y2FjaGUuY3VycmVudCA9IGNhY2hlLmN1cnJlbnQgPyB0aGlzLiRzdGFnZS5jaGlsZHJlbigpLmluZGV4KGNhY2hlLmN1cnJlbnQpIDogMDtcblx0XHRcdGNhY2hlLmN1cnJlbnQgPSBNYXRoLm1heCh0aGlzLm1pbmltdW0oKSwgTWF0aC5taW4odGhpcy5tYXhpbXVtKCksIGNhY2hlLmN1cnJlbnQpKTtcblx0XHRcdHRoaXMucmVzZXQoY2FjaGUuY3VycmVudCk7XG5cdFx0fVxuXHR9LCB7XG5cdFx0ZmlsdGVyOiBbICdwb3NpdGlvbicgXSxcblx0XHRydW46IGZ1bmN0aW9uKCkge1xuXHRcdFx0dGhpcy5hbmltYXRlKHRoaXMuY29vcmRpbmF0ZXModGhpcy5fY3VycmVudCkpO1xuXHRcdH1cblx0fSwge1xuXHRcdGZpbHRlcjogWyAnd2lkdGgnLCAncG9zaXRpb24nLCAnaXRlbXMnLCAnc2V0dGluZ3MnIF0sXG5cdFx0cnVuOiBmdW5jdGlvbigpIHtcblx0XHRcdHZhciBydGwgPSB0aGlzLnNldHRpbmdzLnJ0bCA/IDEgOiAtMSxcblx0XHRcdFx0cGFkZGluZyA9IHRoaXMuc2V0dGluZ3Muc3RhZ2VQYWRkaW5nICogMixcblx0XHRcdFx0YmVnaW4gPSB0aGlzLmNvb3JkaW5hdGVzKHRoaXMuY3VycmVudCgpKSArIHBhZGRpbmcsXG5cdFx0XHRcdGVuZCA9IGJlZ2luICsgdGhpcy53aWR0aCgpICogcnRsLFxuXHRcdFx0XHRpbm5lciwgb3V0ZXIsIG1hdGNoZXMgPSBbXSwgaSwgbjtcblxuXHRcdFx0Zm9yIChpID0gMCwgbiA9IHRoaXMuX2Nvb3JkaW5hdGVzLmxlbmd0aDsgaSA8IG47IGkrKykge1xuXHRcdFx0XHRpbm5lciA9IHRoaXMuX2Nvb3JkaW5hdGVzW2kgLSAxXSB8fCAwO1xuXHRcdFx0XHRvdXRlciA9IE1hdGguYWJzKHRoaXMuX2Nvb3JkaW5hdGVzW2ldKSArIHBhZGRpbmcgKiBydGw7XG5cblx0XHRcdFx0aWYgKCh0aGlzLm9wKGlubmVyLCAnPD0nLCBiZWdpbikgJiYgKHRoaXMub3AoaW5uZXIsICc+JywgZW5kKSkpXG5cdFx0XHRcdFx0fHwgKHRoaXMub3Aob3V0ZXIsICc8JywgYmVnaW4pICYmIHRoaXMub3Aob3V0ZXIsICc+JywgZW5kKSkpIHtcblx0XHRcdFx0XHRtYXRjaGVzLnB1c2goaSk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblxuXHRcdFx0dGhpcy4kc3RhZ2UuY2hpbGRyZW4oJy5hY3RpdmUnKS5yZW1vdmVDbGFzcygnYWN0aXZlJyk7XG5cdFx0XHR0aGlzLiRzdGFnZS5jaGlsZHJlbignOmVxKCcgKyBtYXRjaGVzLmpvaW4oJyksIDplcSgnKSArICcpJykuYWRkQ2xhc3MoJ2FjdGl2ZScpO1xuXG5cdFx0XHRpZiAodGhpcy5zZXR0aW5ncy5jZW50ZXIpIHtcblx0XHRcdFx0dGhpcy4kc3RhZ2UuY2hpbGRyZW4oJy5jZW50ZXInKS5yZW1vdmVDbGFzcygnY2VudGVyJyk7XG5cdFx0XHRcdHRoaXMuJHN0YWdlLmNoaWxkcmVuKCkuZXEodGhpcy5jdXJyZW50KCkpLmFkZENsYXNzKCdjZW50ZXInKTtcblx0XHRcdH1cblx0XHR9XG5cdH0gXTtcblxuXHQvKipcblx0ICogSW5pdGlhbGl6ZXMgdGhlIGNhcm91c2VsLlxuXHQgKiBAcHJvdGVjdGVkXG5cdCAqL1xuXHRPd2wucHJvdG90eXBlLmluaXRpYWxpemUgPSBmdW5jdGlvbigpIHtcblx0XHR0aGlzLmVudGVyKCdpbml0aWFsaXppbmcnKTtcblx0XHR0aGlzLnRyaWdnZXIoJ2luaXRpYWxpemUnKTtcblxuXHRcdHRoaXMuJGVsZW1lbnQudG9nZ2xlQ2xhc3ModGhpcy5zZXR0aW5ncy5ydGxDbGFzcywgdGhpcy5zZXR0aW5ncy5ydGwpO1xuXG5cdFx0aWYgKHRoaXMuc2V0dGluZ3MuYXV0b1dpZHRoICYmICF0aGlzLmlzKCdwcmUtbG9hZGluZycpKSB7XG5cdFx0XHR2YXIgaW1ncywgbmVzdGVkU2VsZWN0b3IsIHdpZHRoO1xuXHRcdFx0aW1ncyA9IHRoaXMuJGVsZW1lbnQuZmluZCgnaW1nJyk7XG5cdFx0XHRuZXN0ZWRTZWxlY3RvciA9IHRoaXMuc2V0dGluZ3MubmVzdGVkSXRlbVNlbGVjdG9yID8gJy4nICsgdGhpcy5zZXR0aW5ncy5uZXN0ZWRJdGVtU2VsZWN0b3IgOiB1bmRlZmluZWQ7XG5cdFx0XHR3aWR0aCA9IHRoaXMuJGVsZW1lbnQuY2hpbGRyZW4obmVzdGVkU2VsZWN0b3IpLndpZHRoKCk7XG5cblx0XHRcdGlmIChpbWdzLmxlbmd0aCAmJiB3aWR0aCA8PSAwKSB7XG5cdFx0XHRcdHRoaXMucHJlbG9hZEF1dG9XaWR0aEltYWdlcyhpbWdzKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHR0aGlzLiRlbGVtZW50LmFkZENsYXNzKHRoaXMub3B0aW9ucy5sb2FkaW5nQ2xhc3MpO1xuXG5cdFx0Ly8gY3JlYXRlIHN0YWdlXG5cdFx0dGhpcy4kc3RhZ2UgPSAkKCc8JyArIHRoaXMuc2V0dGluZ3Muc3RhZ2VFbGVtZW50ICsgJyBjbGFzcz1cIicgKyB0aGlzLnNldHRpbmdzLnN0YWdlQ2xhc3MgKyAnXCIvPicpXG5cdFx0XHQud3JhcCgnPGRpdiBjbGFzcz1cIicgKyB0aGlzLnNldHRpbmdzLnN0YWdlT3V0ZXJDbGFzcyArICdcIi8+Jyk7XG5cblx0XHQvLyBhcHBlbmQgc3RhZ2Vcblx0XHR0aGlzLiRlbGVtZW50LmFwcGVuZCh0aGlzLiRzdGFnZS5wYXJlbnQoKSk7XG5cblx0XHQvLyBhcHBlbmQgY29udGVudFxuXHRcdHRoaXMucmVwbGFjZSh0aGlzLiRlbGVtZW50LmNoaWxkcmVuKCkubm90KHRoaXMuJHN0YWdlLnBhcmVudCgpKSk7XG5cblx0XHQvLyBjaGVjayB2aXNpYmlsaXR5XG5cdFx0aWYgKHRoaXMuJGVsZW1lbnQuaXMoJzp2aXNpYmxlJykpIHtcblx0XHRcdC8vIHVwZGF0ZSB2aWV3XG5cdFx0XHR0aGlzLnJlZnJlc2goKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0Ly8gaW52YWxpZGF0ZSB3aWR0aFxuXHRcdFx0dGhpcy5pbnZhbGlkYXRlKCd3aWR0aCcpO1xuXHRcdH1cblxuXHRcdHRoaXMuJGVsZW1lbnRcblx0XHRcdC5yZW1vdmVDbGFzcyh0aGlzLm9wdGlvbnMubG9hZGluZ0NsYXNzKVxuXHRcdFx0LmFkZENsYXNzKHRoaXMub3B0aW9ucy5sb2FkZWRDbGFzcyk7XG5cblx0XHQvLyByZWdpc3RlciBldmVudCBoYW5kbGVyc1xuXHRcdHRoaXMucmVnaXN0ZXJFdmVudEhhbmRsZXJzKCk7XG5cblx0XHR0aGlzLmxlYXZlKCdpbml0aWFsaXppbmcnKTtcblx0XHR0aGlzLnRyaWdnZXIoJ2luaXRpYWxpemVkJyk7XG5cdH07XG5cblx0LyoqXG5cdCAqIFNldHVwcyB0aGUgY3VycmVudCBzZXR0aW5ncy5cblx0ICogQHRvZG8gUmVtb3ZlIHJlc3BvbnNpdmUgY2xhc3Nlcy4gV2h5IHNob3VsZCBhZGFwdGl2ZSBkZXNpZ25zIGJlIGJyb3VnaHQgaW50byBJRTg/XG5cdCAqIEB0b2RvIFN1cHBvcnQgZm9yIG1lZGlhIHF1ZXJpZXMgYnkgdXNpbmcgYG1hdGNoTWVkaWFgIHdvdWxkIGJlIG5pY2UuXG5cdCAqIEBwdWJsaWNcblx0ICovXG5cdE93bC5wcm90b3R5cGUuc2V0dXAgPSBmdW5jdGlvbigpIHtcblx0XHR2YXIgdmlld3BvcnQgPSB0aGlzLnZpZXdwb3J0KCksXG5cdFx0XHRvdmVyd3JpdGVzID0gdGhpcy5vcHRpb25zLnJlc3BvbnNpdmUsXG5cdFx0XHRtYXRjaCA9IC0xLFxuXHRcdFx0c2V0dGluZ3MgPSBudWxsO1xuXG5cdFx0aWYgKCFvdmVyd3JpdGVzKSB7XG5cdFx0XHRzZXR0aW5ncyA9ICQuZXh0ZW5kKHt9LCB0aGlzLm9wdGlvbnMpO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHQkLmVhY2gob3ZlcndyaXRlcywgZnVuY3Rpb24oYnJlYWtwb2ludCkge1xuXHRcdFx0XHRpZiAoYnJlYWtwb2ludCA8PSB2aWV3cG9ydCAmJiBicmVha3BvaW50ID4gbWF0Y2gpIHtcblx0XHRcdFx0XHRtYXRjaCA9IE51bWJlcihicmVha3BvaW50KTtcblx0XHRcdFx0fVxuXHRcdFx0fSk7XG5cblx0XHRcdHNldHRpbmdzID0gJC5leHRlbmQoe30sIHRoaXMub3B0aW9ucywgb3ZlcndyaXRlc1ttYXRjaF0pO1xuXHRcdFx0ZGVsZXRlIHNldHRpbmdzLnJlc3BvbnNpdmU7XG5cblx0XHRcdC8vIHJlc3BvbnNpdmUgY2xhc3Ncblx0XHRcdGlmIChzZXR0aW5ncy5yZXNwb25zaXZlQ2xhc3MpIHtcblx0XHRcdFx0dGhpcy4kZWxlbWVudC5hdHRyKCdjbGFzcycsXG5cdFx0XHRcdFx0dGhpcy4kZWxlbWVudC5hdHRyKCdjbGFzcycpLnJlcGxhY2UobmV3IFJlZ0V4cCgnKCcgKyB0aGlzLm9wdGlvbnMucmVzcG9uc2l2ZUNsYXNzICsgJy0pXFxcXFMrXFxcXHMnLCAnZycpLCAnJDEnICsgbWF0Y2gpXG5cdFx0XHRcdCk7XG5cdFx0XHR9XG5cdFx0fVxuXG5cdFx0aWYgKHRoaXMuc2V0dGluZ3MgPT09IG51bGwgfHwgdGhpcy5fYnJlYWtwb2ludCAhPT0gbWF0Y2gpIHtcblx0XHRcdHRoaXMudHJpZ2dlcignY2hhbmdlJywgeyBwcm9wZXJ0eTogeyBuYW1lOiAnc2V0dGluZ3MnLCB2YWx1ZTogc2V0dGluZ3MgfSB9KTtcblx0XHRcdHRoaXMuX2JyZWFrcG9pbnQgPSBtYXRjaDtcblx0XHRcdHRoaXMuc2V0dGluZ3MgPSBzZXR0aW5ncztcblx0XHRcdHRoaXMuaW52YWxpZGF0ZSgnc2V0dGluZ3MnKTtcblx0XHRcdHRoaXMudHJpZ2dlcignY2hhbmdlZCcsIHsgcHJvcGVydHk6IHsgbmFtZTogJ3NldHRpbmdzJywgdmFsdWU6IHRoaXMuc2V0dGluZ3MgfSB9KTtcblx0XHR9XG5cdH07XG5cblx0LyoqXG5cdCAqIFVwZGF0ZXMgb3B0aW9uIGxvZ2ljIGlmIG5lY2Vzc2VyeS5cblx0ICogQHByb3RlY3RlZFxuXHQgKi9cblx0T3dsLnByb3RvdHlwZS5vcHRpb25zTG9naWMgPSBmdW5jdGlvbigpIHtcblx0XHRpZiAodGhpcy5zZXR0aW5ncy5hdXRvV2lkdGgpIHtcblx0XHRcdHRoaXMuc2V0dGluZ3Muc3RhZ2VQYWRkaW5nID0gZmFsc2U7XG5cdFx0XHR0aGlzLnNldHRpbmdzLm1lcmdlID0gZmFsc2U7XG5cdFx0fVxuXHR9O1xuXG5cdC8qKlxuXHQgKiBQcmVwYXJlcyBhbiBpdGVtIGJlZm9yZSBhZGQuXG5cdCAqIEB0b2RvIFJlbmFtZSBldmVudCBwYXJhbWV0ZXIgYGNvbnRlbnRgIHRvIGBpdGVtYC5cblx0ICogQHByb3RlY3RlZFxuXHQgKiBAcmV0dXJucyB7alF1ZXJ5fEhUTUxFbGVtZW50fSAtIFRoZSBpdGVtIGNvbnRhaW5lci5cblx0ICovXG5cdE93bC5wcm90b3R5cGUucHJlcGFyZSA9IGZ1bmN0aW9uKGl0ZW0pIHtcblx0XHR2YXIgZXZlbnQgPSB0aGlzLnRyaWdnZXIoJ3ByZXBhcmUnLCB7IGNvbnRlbnQ6IGl0ZW0gfSk7XG5cblx0XHRpZiAoIWV2ZW50LmRhdGEpIHtcblx0XHRcdGV2ZW50LmRhdGEgPSAkKCc8JyArIHRoaXMuc2V0dGluZ3MuaXRlbUVsZW1lbnQgKyAnLz4nKVxuXHRcdFx0XHQuYWRkQ2xhc3ModGhpcy5vcHRpb25zLml0ZW1DbGFzcykuYXBwZW5kKGl0ZW0pXG5cdFx0fVxuXG5cdFx0dGhpcy50cmlnZ2VyKCdwcmVwYXJlZCcsIHsgY29udGVudDogZXZlbnQuZGF0YSB9KTtcblxuXHRcdHJldHVybiBldmVudC5kYXRhO1xuXHR9O1xuXG5cdC8qKlxuXHQgKiBVcGRhdGVzIHRoZSB2aWV3LlxuXHQgKiBAcHVibGljXG5cdCAqL1xuXHRPd2wucHJvdG90eXBlLnVwZGF0ZSA9IGZ1bmN0aW9uKCkge1xuXHRcdHZhciBpID0gMCxcblx0XHRcdG4gPSB0aGlzLl9waXBlLmxlbmd0aCxcblx0XHRcdGZpbHRlciA9ICQucHJveHkoZnVuY3Rpb24ocCkgeyByZXR1cm4gdGhpc1twXSB9LCB0aGlzLl9pbnZhbGlkYXRlZCksXG5cdFx0XHRjYWNoZSA9IHt9O1xuXG5cdFx0d2hpbGUgKGkgPCBuKSB7XG5cdFx0XHRpZiAodGhpcy5faW52YWxpZGF0ZWQuYWxsIHx8ICQuZ3JlcCh0aGlzLl9waXBlW2ldLmZpbHRlciwgZmlsdGVyKS5sZW5ndGggPiAwKSB7XG5cdFx0XHRcdHRoaXMuX3BpcGVbaV0ucnVuKGNhY2hlKTtcblx0XHRcdH1cblx0XHRcdGkrKztcblx0XHR9XG5cblx0XHR0aGlzLl9pbnZhbGlkYXRlZCA9IHt9O1xuXG5cdFx0IXRoaXMuaXMoJ3ZhbGlkJykgJiYgdGhpcy5lbnRlcigndmFsaWQnKTtcblx0fTtcblxuXHQvKipcblx0ICogR2V0cyB0aGUgd2lkdGggb2YgdGhlIHZpZXcuXG5cdCAqIEBwdWJsaWNcblx0ICogQHBhcmFtIHtPd2wuV2lkdGh9IFtkaW1lbnNpb249T3dsLldpZHRoLkRlZmF1bHRdIC0gVGhlIGRpbWVuc2lvbiB0byByZXR1cm4uXG5cdCAqIEByZXR1cm5zIHtOdW1iZXJ9IC0gVGhlIHdpZHRoIG9mIHRoZSB2aWV3IGluIHBpeGVsLlxuXHQgKi9cblx0T3dsLnByb3RvdHlwZS53aWR0aCA9IGZ1bmN0aW9uKGRpbWVuc2lvbikge1xuXHRcdGRpbWVuc2lvbiA9IGRpbWVuc2lvbiB8fCBPd2wuV2lkdGguRGVmYXVsdDtcblx0XHRzd2l0Y2ggKGRpbWVuc2lvbikge1xuXHRcdFx0Y2FzZSBPd2wuV2lkdGguSW5uZXI6XG5cdFx0XHRjYXNlIE93bC5XaWR0aC5PdXRlcjpcblx0XHRcdFx0cmV0dXJuIHRoaXMuX3dpZHRoO1xuXHRcdFx0ZGVmYXVsdDpcblx0XHRcdFx0cmV0dXJuIHRoaXMuX3dpZHRoIC0gdGhpcy5zZXR0aW5ncy5zdGFnZVBhZGRpbmcgKiAyICsgdGhpcy5zZXR0aW5ncy5tYXJnaW47XG5cdFx0fVxuXHR9O1xuXG5cdC8qKlxuXHQgKiBSZWZyZXNoZXMgdGhlIGNhcm91c2VsIHByaW1hcmlseSBmb3IgYWRhcHRpdmUgcHVycG9zZXMuXG5cdCAqIEBwdWJsaWNcblx0ICovXG5cdE93bC5wcm90b3R5cGUucmVmcmVzaCA9IGZ1bmN0aW9uKCkge1xuXHRcdHRoaXMuZW50ZXIoJ3JlZnJlc2hpbmcnKTtcblx0XHR0aGlzLnRyaWdnZXIoJ3JlZnJlc2gnKTtcblxuXHRcdHRoaXMuc2V0dXAoKTtcblxuXHRcdHRoaXMub3B0aW9uc0xvZ2ljKCk7XG5cblx0XHR0aGlzLiRlbGVtZW50LmFkZENsYXNzKHRoaXMub3B0aW9ucy5yZWZyZXNoQ2xhc3MpO1xuXG5cdFx0dGhpcy51cGRhdGUoKTtcblxuXHRcdHRoaXMuJGVsZW1lbnQucmVtb3ZlQ2xhc3ModGhpcy5vcHRpb25zLnJlZnJlc2hDbGFzcyk7XG5cblx0XHR0aGlzLmxlYXZlKCdyZWZyZXNoaW5nJyk7XG5cdFx0dGhpcy50cmlnZ2VyKCdyZWZyZXNoZWQnKTtcblx0fTtcblxuXHQvKipcblx0ICogQ2hlY2tzIHdpbmRvdyBgcmVzaXplYCBldmVudC5cblx0ICogQHByb3RlY3RlZFxuXHQgKi9cblx0T3dsLnByb3RvdHlwZS5vblRocm90dGxlZFJlc2l6ZSA9IGZ1bmN0aW9uKCkge1xuXHRcdHdpbmRvdy5jbGVhclRpbWVvdXQodGhpcy5yZXNpemVUaW1lcik7XG5cdFx0dGhpcy5yZXNpemVUaW1lciA9IHdpbmRvdy5zZXRUaW1lb3V0KHRoaXMuX2hhbmRsZXJzLm9uUmVzaXplLCB0aGlzLnNldHRpbmdzLnJlc3BvbnNpdmVSZWZyZXNoUmF0ZSk7XG5cdH07XG5cblx0LyoqXG5cdCAqIENoZWNrcyB3aW5kb3cgYHJlc2l6ZWAgZXZlbnQuXG5cdCAqIEBwcm90ZWN0ZWRcblx0ICovXG5cdE93bC5wcm90b3R5cGUub25SZXNpemUgPSBmdW5jdGlvbigpIHtcblx0XHRpZiAoIXRoaXMuX2l0ZW1zLmxlbmd0aCkge1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblxuXHRcdGlmICh0aGlzLl93aWR0aCA9PT0gdGhpcy4kZWxlbWVudC53aWR0aCgpKSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXG5cdFx0aWYgKCF0aGlzLiRlbGVtZW50LmlzKCc6dmlzaWJsZScpKSB7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXG5cdFx0dGhpcy5lbnRlcigncmVzaXppbmcnKTtcblxuXHRcdGlmICh0aGlzLnRyaWdnZXIoJ3Jlc2l6ZScpLmlzRGVmYXVsdFByZXZlbnRlZCgpKSB7XG5cdFx0XHR0aGlzLmxlYXZlKCdyZXNpemluZycpO1xuXHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdH1cblxuXHRcdHRoaXMuaW52YWxpZGF0ZSgnd2lkdGgnKTtcblxuXHRcdHRoaXMucmVmcmVzaCgpO1xuXG5cdFx0dGhpcy5sZWF2ZSgncmVzaXppbmcnKTtcblx0XHR0aGlzLnRyaWdnZXIoJ3Jlc2l6ZWQnKTtcblx0fTtcblxuXHQvKipcblx0ICogUmVnaXN0ZXJzIGV2ZW50IGhhbmRsZXJzLlxuXHQgKiBAdG9kbyBDaGVjayBgbXNQb2ludGVyRW5hYmxlZGBcblx0ICogQHRvZG8gIzI2MVxuXHQgKiBAcHJvdGVjdGVkXG5cdCAqL1xuXHRPd2wucHJvdG90eXBlLnJlZ2lzdGVyRXZlbnRIYW5kbGVycyA9IGZ1bmN0aW9uKCkge1xuXHRcdGlmICgkLnN1cHBvcnQudHJhbnNpdGlvbikge1xuXHRcdFx0dGhpcy4kc3RhZ2Uub24oJC5zdXBwb3J0LnRyYW5zaXRpb24uZW5kICsgJy5vd2wuY29yZScsICQucHJveHkodGhpcy5vblRyYW5zaXRpb25FbmQsIHRoaXMpKTtcblx0XHR9XG5cblx0XHRpZiAodGhpcy5zZXR0aW5ncy5yZXNwb25zaXZlICE9PSBmYWxzZSkge1xuXHRcdFx0dGhpcy5vbih3aW5kb3csICdyZXNpemUnLCB0aGlzLl9oYW5kbGVycy5vblRocm90dGxlZFJlc2l6ZSk7XG5cdFx0fVxuXG5cdFx0aWYgKHRoaXMuc2V0dGluZ3MubW91c2VEcmFnKSB7XG5cdFx0XHR0aGlzLiRlbGVtZW50LmFkZENsYXNzKHRoaXMub3B0aW9ucy5kcmFnQ2xhc3MpO1xuXHRcdFx0dGhpcy4kc3RhZ2Uub24oJ21vdXNlZG93bi5vd2wuY29yZScsICQucHJveHkodGhpcy5vbkRyYWdTdGFydCwgdGhpcykpO1xuXHRcdFx0dGhpcy4kc3RhZ2Uub24oJ2RyYWdzdGFydC5vd2wuY29yZSBzZWxlY3RzdGFydC5vd2wuY29yZScsIGZ1bmN0aW9uKCkgeyByZXR1cm4gZmFsc2UgfSk7XG5cdFx0fVxuXG5cdFx0aWYgKHRoaXMuc2V0dGluZ3MudG91Y2hEcmFnKXtcblx0XHRcdHRoaXMuJHN0YWdlLm9uKCd0b3VjaHN0YXJ0Lm93bC5jb3JlJywgJC5wcm94eSh0aGlzLm9uRHJhZ1N0YXJ0LCB0aGlzKSk7XG5cdFx0XHR0aGlzLiRzdGFnZS5vbigndG91Y2hjYW5jZWwub3dsLmNvcmUnLCAkLnByb3h5KHRoaXMub25EcmFnRW5kLCB0aGlzKSk7XG5cdFx0fVxuXHR9O1xuXG5cdC8qKlxuXHQgKiBIYW5kbGVzIGB0b3VjaHN0YXJ0YCBhbmQgYG1vdXNlZG93bmAgZXZlbnRzLlxuXHQgKiBAdG9kbyBIb3Jpem9udGFsIHN3aXBlIHRocmVzaG9sZCBhcyBvcHRpb25cblx0ICogQHRvZG8gIzI2MVxuXHQgKiBAcHJvdGVjdGVkXG5cdCAqIEBwYXJhbSB7RXZlbnR9IGV2ZW50IC0gVGhlIGV2ZW50IGFyZ3VtZW50cy5cblx0ICovXG5cdE93bC5wcm90b3R5cGUub25EcmFnU3RhcnQgPSBmdW5jdGlvbihldmVudCkge1xuXHRcdHZhciBzdGFnZSA9IG51bGw7XG5cblx0XHRpZiAoZXZlbnQud2hpY2ggPT09IDMpIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHRpZiAoJC5zdXBwb3J0LnRyYW5zZm9ybSkge1xuXHRcdFx0c3RhZ2UgPSB0aGlzLiRzdGFnZS5jc3MoJ3RyYW5zZm9ybScpLnJlcGxhY2UoLy4qXFwofFxcKXwgL2csICcnKS5zcGxpdCgnLCcpO1xuXHRcdFx0c3RhZ2UgPSB7XG5cdFx0XHRcdHg6IHN0YWdlW3N0YWdlLmxlbmd0aCA9PT0gMTYgPyAxMiA6IDRdLFxuXHRcdFx0XHR5OiBzdGFnZVtzdGFnZS5sZW5ndGggPT09IDE2ID8gMTMgOiA1XVxuXHRcdFx0fTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0c3RhZ2UgPSB0aGlzLiRzdGFnZS5wb3NpdGlvbigpO1xuXHRcdFx0c3RhZ2UgPSB7XG5cdFx0XHRcdHg6IHRoaXMuc2V0dGluZ3MucnRsID9cblx0XHRcdFx0XHRzdGFnZS5sZWZ0ICsgdGhpcy4kc3RhZ2Uud2lkdGgoKSAtIHRoaXMud2lkdGgoKSArIHRoaXMuc2V0dGluZ3MubWFyZ2luIDpcblx0XHRcdFx0XHRzdGFnZS5sZWZ0LFxuXHRcdFx0XHR5OiBzdGFnZS50b3Bcblx0XHRcdH07XG5cdFx0fVxuXG5cdFx0aWYgKHRoaXMuaXMoJ2FuaW1hdGluZycpKSB7XG5cdFx0XHQkLnN1cHBvcnQudHJhbnNmb3JtID8gdGhpcy5hbmltYXRlKHN0YWdlLngpIDogdGhpcy4kc3RhZ2Uuc3RvcCgpXG5cdFx0XHR0aGlzLmludmFsaWRhdGUoJ3Bvc2l0aW9uJyk7XG5cdFx0fVxuXG5cdFx0dGhpcy4kZWxlbWVudC50b2dnbGVDbGFzcyh0aGlzLm9wdGlvbnMuZ3JhYkNsYXNzLCBldmVudC50eXBlID09PSAnbW91c2Vkb3duJyk7XG5cblx0XHR0aGlzLnNwZWVkKDApO1xuXG5cdFx0dGhpcy5fZHJhZy50aW1lID0gbmV3IERhdGUoKS5nZXRUaW1lKCk7XG5cdFx0dGhpcy5fZHJhZy50YXJnZXQgPSAkKGV2ZW50LnRhcmdldCk7XG5cdFx0dGhpcy5fZHJhZy5zdGFnZS5zdGFydCA9IHN0YWdlO1xuXHRcdHRoaXMuX2RyYWcuc3RhZ2UuY3VycmVudCA9IHN0YWdlO1xuXHRcdHRoaXMuX2RyYWcucG9pbnRlciA9IHRoaXMucG9pbnRlcihldmVudCk7XG5cblx0XHQkKGRvY3VtZW50KS5vbignbW91c2V1cC5vd2wuY29yZSB0b3VjaGVuZC5vd2wuY29yZScsICQucHJveHkodGhpcy5vbkRyYWdFbmQsIHRoaXMpKTtcblxuXHRcdCQoZG9jdW1lbnQpLm9uZSgnbW91c2Vtb3ZlLm93bC5jb3JlIHRvdWNobW92ZS5vd2wuY29yZScsICQucHJveHkoZnVuY3Rpb24oZXZlbnQpIHtcblx0XHRcdHZhciBkZWx0YSA9IHRoaXMuZGlmZmVyZW5jZSh0aGlzLl9kcmFnLnBvaW50ZXIsIHRoaXMucG9pbnRlcihldmVudCkpO1xuXG5cdFx0XHQkKGRvY3VtZW50KS5vbignbW91c2Vtb3ZlLm93bC5jb3JlIHRvdWNobW92ZS5vd2wuY29yZScsICQucHJveHkodGhpcy5vbkRyYWdNb3ZlLCB0aGlzKSk7XG5cblx0XHRcdGlmIChNYXRoLmFicyhkZWx0YS54KSA8IE1hdGguYWJzKGRlbHRhLnkpICYmIHRoaXMuaXMoJ3ZhbGlkJykpIHtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXG5cdFx0XHRldmVudC5wcmV2ZW50RGVmYXVsdCgpO1xuXG5cdFx0XHR0aGlzLmVudGVyKCdkcmFnZ2luZycpO1xuXHRcdFx0dGhpcy50cmlnZ2VyKCdkcmFnJyk7XG5cdFx0fSwgdGhpcykpO1xuXHR9O1xuXG5cdC8qKlxuXHQgKiBIYW5kbGVzIHRoZSBgdG91Y2htb3ZlYCBhbmQgYG1vdXNlbW92ZWAgZXZlbnRzLlxuXHQgKiBAdG9kbyAjMjYxXG5cdCAqIEBwcm90ZWN0ZWRcblx0ICogQHBhcmFtIHtFdmVudH0gZXZlbnQgLSBUaGUgZXZlbnQgYXJndW1lbnRzLlxuXHQgKi9cblx0T3dsLnByb3RvdHlwZS5vbkRyYWdNb3ZlID0gZnVuY3Rpb24oZXZlbnQpIHtcblx0XHR2YXIgbWluaW11bSA9IG51bGwsXG5cdFx0XHRtYXhpbXVtID0gbnVsbCxcblx0XHRcdHB1bGwgPSBudWxsLFxuXHRcdFx0ZGVsdGEgPSB0aGlzLmRpZmZlcmVuY2UodGhpcy5fZHJhZy5wb2ludGVyLCB0aGlzLnBvaW50ZXIoZXZlbnQpKSxcblx0XHRcdHN0YWdlID0gdGhpcy5kaWZmZXJlbmNlKHRoaXMuX2RyYWcuc3RhZ2Uuc3RhcnQsIGRlbHRhKTtcblxuXHRcdGlmICghdGhpcy5pcygnZHJhZ2dpbmcnKSkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdGV2ZW50LnByZXZlbnREZWZhdWx0KCk7XG5cblx0XHRpZiAodGhpcy5zZXR0aW5ncy5sb29wKSB7XG5cdFx0XHRtaW5pbXVtID0gdGhpcy5jb29yZGluYXRlcyh0aGlzLm1pbmltdW0oKSk7XG5cdFx0XHRtYXhpbXVtID0gdGhpcy5jb29yZGluYXRlcyh0aGlzLm1heGltdW0oKSArIDEpIC0gbWluaW11bTtcblx0XHRcdHN0YWdlLnggPSAoKChzdGFnZS54IC0gbWluaW11bSkgJSBtYXhpbXVtICsgbWF4aW11bSkgJSBtYXhpbXVtKSArIG1pbmltdW07XG5cdFx0fSBlbHNlIHtcblx0XHRcdG1pbmltdW0gPSB0aGlzLnNldHRpbmdzLnJ0bCA/IHRoaXMuY29vcmRpbmF0ZXModGhpcy5tYXhpbXVtKCkpIDogdGhpcy5jb29yZGluYXRlcyh0aGlzLm1pbmltdW0oKSk7XG5cdFx0XHRtYXhpbXVtID0gdGhpcy5zZXR0aW5ncy5ydGwgPyB0aGlzLmNvb3JkaW5hdGVzKHRoaXMubWluaW11bSgpKSA6IHRoaXMuY29vcmRpbmF0ZXModGhpcy5tYXhpbXVtKCkpO1xuXHRcdFx0cHVsbCA9IHRoaXMuc2V0dGluZ3MucHVsbERyYWcgPyAtMSAqIGRlbHRhLnggLyA1IDogMDtcblx0XHRcdHN0YWdlLnggPSBNYXRoLm1heChNYXRoLm1pbihzdGFnZS54LCBtaW5pbXVtICsgcHVsbCksIG1heGltdW0gKyBwdWxsKTtcblx0XHR9XG5cblx0XHR0aGlzLl9kcmFnLnN0YWdlLmN1cnJlbnQgPSBzdGFnZTtcblxuXHRcdHRoaXMuYW5pbWF0ZShzdGFnZS54KTtcblx0fTtcblxuXHQvKipcblx0ICogSGFuZGxlcyB0aGUgYHRvdWNoZW5kYCBhbmQgYG1vdXNldXBgIGV2ZW50cy5cblx0ICogQHRvZG8gIzI2MVxuXHQgKiBAdG9kbyBUaHJlc2hvbGQgZm9yIGNsaWNrIGV2ZW50XG5cdCAqIEBwcm90ZWN0ZWRcblx0ICogQHBhcmFtIHtFdmVudH0gZXZlbnQgLSBUaGUgZXZlbnQgYXJndW1lbnRzLlxuXHQgKi9cblx0T3dsLnByb3RvdHlwZS5vbkRyYWdFbmQgPSBmdW5jdGlvbihldmVudCkge1xuXHRcdHZhciBkZWx0YSA9IHRoaXMuZGlmZmVyZW5jZSh0aGlzLl9kcmFnLnBvaW50ZXIsIHRoaXMucG9pbnRlcihldmVudCkpLFxuXHRcdFx0c3RhZ2UgPSB0aGlzLl9kcmFnLnN0YWdlLmN1cnJlbnQsXG5cdFx0XHRkaXJlY3Rpb24gPSBkZWx0YS54ID4gMCBeIHRoaXMuc2V0dGluZ3MucnRsID8gJ2xlZnQnIDogJ3JpZ2h0JztcblxuXHRcdCQoZG9jdW1lbnQpLm9mZignLm93bC5jb3JlJyk7XG5cblx0XHR0aGlzLiRlbGVtZW50LnJlbW92ZUNsYXNzKHRoaXMub3B0aW9ucy5ncmFiQ2xhc3MpO1xuXG5cdFx0aWYgKGRlbHRhLnggIT09IDAgJiYgdGhpcy5pcygnZHJhZ2dpbmcnKSB8fCAhdGhpcy5pcygndmFsaWQnKSkge1xuXHRcdFx0dGhpcy5zcGVlZCh0aGlzLnNldHRpbmdzLmRyYWdFbmRTcGVlZCB8fCB0aGlzLnNldHRpbmdzLnNtYXJ0U3BlZWQpO1xuXHRcdFx0dGhpcy5jdXJyZW50KHRoaXMuY2xvc2VzdChzdGFnZS54LCBkZWx0YS54ICE9PSAwID8gZGlyZWN0aW9uIDogdGhpcy5fZHJhZy5kaXJlY3Rpb24pKTtcblx0XHRcdHRoaXMuaW52YWxpZGF0ZSgncG9zaXRpb24nKTtcblx0XHRcdHRoaXMudXBkYXRlKCk7XG5cblx0XHRcdHRoaXMuX2RyYWcuZGlyZWN0aW9uID0gZGlyZWN0aW9uO1xuXG5cdFx0XHRpZiAoTWF0aC5hYnMoZGVsdGEueCkgPiAzIHx8IG5ldyBEYXRlKCkuZ2V0VGltZSgpIC0gdGhpcy5fZHJhZy50aW1lID4gMzAwKSB7XG5cdFx0XHRcdHRoaXMuX2RyYWcudGFyZ2V0Lm9uZSgnY2xpY2sub3dsLmNvcmUnLCBmdW5jdGlvbigpIHsgcmV0dXJuIGZhbHNlOyB9KTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRpZiAoIXRoaXMuaXMoJ2RyYWdnaW5nJykpIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHR0aGlzLmxlYXZlKCdkcmFnZ2luZycpO1xuXHRcdHRoaXMudHJpZ2dlcignZHJhZ2dlZCcpO1xuXHR9O1xuXG5cdC8qKlxuXHQgKiBHZXRzIGFic29sdXRlIHBvc2l0aW9uIG9mIHRoZSBjbG9zZXN0IGl0ZW0gZm9yIGEgY29vcmRpbmF0ZS5cblx0ICogQHRvZG8gU2V0dGluZyBgZnJlZURyYWdgIG1ha2VzIGBjbG9zZXN0YCBub3QgcmV1c2FibGUuIFNlZSAjMTY1LlxuXHQgKiBAcHJvdGVjdGVkXG5cdCAqIEBwYXJhbSB7TnVtYmVyfSBjb29yZGluYXRlIC0gVGhlIGNvb3JkaW5hdGUgaW4gcGl4ZWwuXG5cdCAqIEBwYXJhbSB7U3RyaW5nfSBkaXJlY3Rpb24gLSBUaGUgZGlyZWN0aW9uIHRvIGNoZWNrIGZvciB0aGUgY2xvc2VzdCBpdGVtLiBFdGhlciBgbGVmdGAgb3IgYHJpZ2h0YC5cblx0ICogQHJldHVybiB7TnVtYmVyfSAtIFRoZSBhYnNvbHV0ZSBwb3NpdGlvbiBvZiB0aGUgY2xvc2VzdCBpdGVtLlxuXHQgKi9cblx0T3dsLnByb3RvdHlwZS5jbG9zZXN0ID0gZnVuY3Rpb24oY29vcmRpbmF0ZSwgZGlyZWN0aW9uKSB7XG5cdFx0dmFyIHBvc2l0aW9uID0gLTEsXG5cdFx0XHRwdWxsID0gMzAsXG5cdFx0XHR3aWR0aCA9IHRoaXMud2lkdGgoKSxcblx0XHRcdGNvb3JkaW5hdGVzID0gdGhpcy5jb29yZGluYXRlcygpO1xuXG5cdFx0aWYgKCF0aGlzLnNldHRpbmdzLmZyZWVEcmFnKSB7XG5cdFx0XHQvLyBjaGVjayBjbG9zZXN0IGl0ZW1cblx0XHRcdCQuZWFjaChjb29yZGluYXRlcywgJC5wcm94eShmdW5jdGlvbihpbmRleCwgdmFsdWUpIHtcblx0XHRcdFx0Ly8gb24gYSBsZWZ0IHB1bGwsIGNoZWNrIG9uIGN1cnJlbnQgaW5kZXhcblx0XHRcdFx0aWYgKGRpcmVjdGlvbiA9PT0gJ2xlZnQnICYmIGNvb3JkaW5hdGUgPiB2YWx1ZSAtIHB1bGwgJiYgY29vcmRpbmF0ZSA8IHZhbHVlICsgcHVsbCkge1xuXHRcdFx0XHRcdHBvc2l0aW9uID0gaW5kZXg7XG5cdFx0XHRcdC8vIG9uIGEgcmlnaHQgcHVsbCwgY2hlY2sgb24gcHJldmlvdXMgaW5kZXhcblx0XHRcdFx0Ly8gdG8gZG8gc28sIHN1YnRyYWN0IHdpZHRoIGZyb20gdmFsdWUgYW5kIHNldCBwb3NpdGlvbiA9IGluZGV4ICsgMVxuXHRcdFx0XHR9IGVsc2UgaWYgKGRpcmVjdGlvbiA9PT0gJ3JpZ2h0JyAmJiBjb29yZGluYXRlID4gdmFsdWUgLSB3aWR0aCAtIHB1bGwgJiYgY29vcmRpbmF0ZSA8IHZhbHVlIC0gd2lkdGggKyBwdWxsKSB7XG5cdFx0XHRcdFx0cG9zaXRpb24gPSBpbmRleCArIDE7XG5cdFx0XHRcdH0gZWxzZSBpZiAodGhpcy5vcChjb29yZGluYXRlLCAnPCcsIHZhbHVlKVxuXHRcdFx0XHRcdCYmIHRoaXMub3AoY29vcmRpbmF0ZSwgJz4nLCBjb29yZGluYXRlc1tpbmRleCArIDFdIHx8IHZhbHVlIC0gd2lkdGgpKSB7XG5cdFx0XHRcdFx0cG9zaXRpb24gPSBkaXJlY3Rpb24gPT09ICdsZWZ0JyA/IGluZGV4ICsgMSA6IGluZGV4O1xuXHRcdFx0XHR9XG5cdFx0XHRcdHJldHVybiBwb3NpdGlvbiA9PT0gLTE7XG5cdFx0XHR9LCB0aGlzKSk7XG5cdFx0fVxuXG5cdFx0aWYgKCF0aGlzLnNldHRpbmdzLmxvb3ApIHtcblx0XHRcdC8vIG5vbiBsb29wIGJvdW5kcmllc1xuXHRcdFx0aWYgKHRoaXMub3AoY29vcmRpbmF0ZSwgJz4nLCBjb29yZGluYXRlc1t0aGlzLm1pbmltdW0oKV0pKSB7XG5cdFx0XHRcdHBvc2l0aW9uID0gY29vcmRpbmF0ZSA9IHRoaXMubWluaW11bSgpO1xuXHRcdFx0fSBlbHNlIGlmICh0aGlzLm9wKGNvb3JkaW5hdGUsICc8JywgY29vcmRpbmF0ZXNbdGhpcy5tYXhpbXVtKCldKSkge1xuXHRcdFx0XHRwb3NpdGlvbiA9IGNvb3JkaW5hdGUgPSB0aGlzLm1heGltdW0oKTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gcG9zaXRpb247XG5cdH07XG5cblx0LyoqXG5cdCAqIEFuaW1hdGVzIHRoZSBzdGFnZS5cblx0ICogQHRvZG8gIzI3MFxuXHQgKiBAcHVibGljXG5cdCAqIEBwYXJhbSB7TnVtYmVyfSBjb29yZGluYXRlIC0gVGhlIGNvb3JkaW5hdGUgaW4gcGl4ZWxzLlxuXHQgKi9cblx0T3dsLnByb3RvdHlwZS5hbmltYXRlID0gZnVuY3Rpb24oY29vcmRpbmF0ZSkge1xuXHRcdHZhciBhbmltYXRlID0gdGhpcy5zcGVlZCgpID4gMDtcblxuXHRcdHRoaXMuaXMoJ2FuaW1hdGluZycpICYmIHRoaXMub25UcmFuc2l0aW9uRW5kKCk7XG5cblx0XHRpZiAoYW5pbWF0ZSkge1xuXHRcdFx0dGhpcy5lbnRlcignYW5pbWF0aW5nJyk7XG5cdFx0XHR0aGlzLnRyaWdnZXIoJ3RyYW5zbGF0ZScpO1xuXHRcdH1cblxuXHRcdGlmICgkLnN1cHBvcnQudHJhbnNmb3JtM2QgJiYgJC5zdXBwb3J0LnRyYW5zaXRpb24pIHtcblx0XHRcdHRoaXMuJHN0YWdlLmNzcyh7XG5cdFx0XHRcdHRyYW5zZm9ybTogJ3RyYW5zbGF0ZTNkKCcgKyBjb29yZGluYXRlICsgJ3B4LDBweCwwcHgpJyxcblx0XHRcdFx0dHJhbnNpdGlvbjogKHRoaXMuc3BlZWQoKSAvIDEwMDApICsgJ3MnXG5cdFx0XHR9KTtcblx0XHR9IGVsc2UgaWYgKGFuaW1hdGUpIHtcblx0XHRcdHRoaXMuJHN0YWdlLmFuaW1hdGUoe1xuXHRcdFx0XHRsZWZ0OiBjb29yZGluYXRlICsgJ3B4J1xuXHRcdFx0fSwgdGhpcy5zcGVlZCgpLCB0aGlzLnNldHRpbmdzLmZhbGxiYWNrRWFzaW5nLCAkLnByb3h5KHRoaXMub25UcmFuc2l0aW9uRW5kLCB0aGlzKSk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHRoaXMuJHN0YWdlLmNzcyh7XG5cdFx0XHRcdGxlZnQ6IGNvb3JkaW5hdGUgKyAncHgnXG5cdFx0XHR9KTtcblx0XHR9XG5cdH07XG5cblx0LyoqXG5cdCAqIENoZWNrcyB3aGV0aGVyIHRoZSBjYXJvdXNlbCBpcyBpbiBhIHNwZWNpZmljIHN0YXRlIG9yIG5vdC5cblx0ICogQHBhcmFtIHtTdHJpbmd9IHN0YXRlIC0gVGhlIHN0YXRlIHRvIGNoZWNrLlxuXHQgKiBAcmV0dXJucyB7Qm9vbGVhbn0gLSBUaGUgZmxhZyB3aGljaCBpbmRpY2F0ZXMgaWYgdGhlIGNhcm91c2VsIGlzIGJ1c3kuXG5cdCAqL1xuXHRPd2wucHJvdG90eXBlLmlzID0gZnVuY3Rpb24oc3RhdGUpIHtcblx0XHRyZXR1cm4gdGhpcy5fc3RhdGVzLmN1cnJlbnRbc3RhdGVdICYmIHRoaXMuX3N0YXRlcy5jdXJyZW50W3N0YXRlXSA+IDA7XG5cdH07XG5cblx0LyoqXG5cdCAqIFNldHMgdGhlIGFic29sdXRlIHBvc2l0aW9uIG9mIHRoZSBjdXJyZW50IGl0ZW0uXG5cdCAqIEBwdWJsaWNcblx0ICogQHBhcmFtIHtOdW1iZXJ9IFtwb3NpdGlvbl0gLSBUaGUgbmV3IGFic29sdXRlIHBvc2l0aW9uIG9yIG5vdGhpbmcgdG8gbGVhdmUgaXQgdW5jaGFuZ2VkLlxuXHQgKiBAcmV0dXJucyB7TnVtYmVyfSAtIFRoZSBhYnNvbHV0ZSBwb3NpdGlvbiBvZiB0aGUgY3VycmVudCBpdGVtLlxuXHQgKi9cblx0T3dsLnByb3RvdHlwZS5jdXJyZW50ID0gZnVuY3Rpb24ocG9zaXRpb24pIHtcblx0XHRpZiAocG9zaXRpb24gPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0cmV0dXJuIHRoaXMuX2N1cnJlbnQ7XG5cdFx0fVxuXG5cdFx0aWYgKHRoaXMuX2l0ZW1zLmxlbmd0aCA9PT0gMCkge1xuXHRcdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0XHR9XG5cblx0XHRwb3NpdGlvbiA9IHRoaXMubm9ybWFsaXplKHBvc2l0aW9uKTtcblxuXHRcdGlmICh0aGlzLl9jdXJyZW50ICE9PSBwb3NpdGlvbikge1xuXHRcdFx0dmFyIGV2ZW50ID0gdGhpcy50cmlnZ2VyKCdjaGFuZ2UnLCB7IHByb3BlcnR5OiB7IG5hbWU6ICdwb3NpdGlvbicsIHZhbHVlOiBwb3NpdGlvbiB9IH0pO1xuXG5cdFx0XHRpZiAoZXZlbnQuZGF0YSAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRcdHBvc2l0aW9uID0gdGhpcy5ub3JtYWxpemUoZXZlbnQuZGF0YSk7XG5cdFx0XHR9XG5cblx0XHRcdHRoaXMuX2N1cnJlbnQgPSBwb3NpdGlvbjtcblxuXHRcdFx0dGhpcy5pbnZhbGlkYXRlKCdwb3NpdGlvbicpO1xuXG5cdFx0XHR0aGlzLnRyaWdnZXIoJ2NoYW5nZWQnLCB7IHByb3BlcnR5OiB7IG5hbWU6ICdwb3NpdGlvbicsIHZhbHVlOiB0aGlzLl9jdXJyZW50IH0gfSk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHRoaXMuX2N1cnJlbnQ7XG5cdH07XG5cblx0LyoqXG5cdCAqIEludmFsaWRhdGVzIHRoZSBnaXZlbiBwYXJ0IG9mIHRoZSB1cGRhdGUgcm91dGluZS5cblx0ICogQHBhcmFtIHtTdHJpbmd9IFtwYXJ0XSAtIFRoZSBwYXJ0IHRvIGludmFsaWRhdGUuXG5cdCAqIEByZXR1cm5zIHtBcnJheS48U3RyaW5nPn0gLSBUaGUgaW52YWxpZGF0ZWQgcGFydHMuXG5cdCAqL1xuXHRPd2wucHJvdG90eXBlLmludmFsaWRhdGUgPSBmdW5jdGlvbihwYXJ0KSB7XG5cdFx0aWYgKCQudHlwZShwYXJ0KSA9PT0gJ3N0cmluZycpIHtcblx0XHRcdHRoaXMuX2ludmFsaWRhdGVkW3BhcnRdID0gdHJ1ZTtcblx0XHRcdHRoaXMuaXMoJ3ZhbGlkJykgJiYgdGhpcy5sZWF2ZSgndmFsaWQnKTtcblx0XHR9XG5cdFx0cmV0dXJuICQubWFwKHRoaXMuX2ludmFsaWRhdGVkLCBmdW5jdGlvbih2LCBpKSB7IHJldHVybiBpIH0pO1xuXHR9O1xuXG5cdC8qKlxuXHQgKiBSZXNldHMgdGhlIGFic29sdXRlIHBvc2l0aW9uIG9mIHRoZSBjdXJyZW50IGl0ZW0uXG5cdCAqIEBwdWJsaWNcblx0ICogQHBhcmFtIHtOdW1iZXJ9IHBvc2l0aW9uIC0gVGhlIGFic29sdXRlIHBvc2l0aW9uIG9mIHRoZSBuZXcgaXRlbS5cblx0ICovXG5cdE93bC5wcm90b3R5cGUucmVzZXQgPSBmdW5jdGlvbihwb3NpdGlvbikge1xuXHRcdHBvc2l0aW9uID0gdGhpcy5ub3JtYWxpemUocG9zaXRpb24pO1xuXG5cdFx0aWYgKHBvc2l0aW9uID09PSB1bmRlZmluZWQpIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHR0aGlzLl9zcGVlZCA9IDA7XG5cdFx0dGhpcy5fY3VycmVudCA9IHBvc2l0aW9uO1xuXG5cdFx0dGhpcy5zdXBwcmVzcyhbICd0cmFuc2xhdGUnLCAndHJhbnNsYXRlZCcgXSk7XG5cblx0XHR0aGlzLmFuaW1hdGUodGhpcy5jb29yZGluYXRlcyhwb3NpdGlvbikpO1xuXG5cdFx0dGhpcy5yZWxlYXNlKFsgJ3RyYW5zbGF0ZScsICd0cmFuc2xhdGVkJyBdKTtcblx0fTtcblxuXHQvKipcblx0ICogTm9ybWFsaXplcyBhbiBhYnNvbHV0ZSBvciBhIHJlbGF0aXZlIHBvc2l0aW9uIG9mIGFuIGl0ZW0uXG5cdCAqIEBwdWJsaWNcblx0ICogQHBhcmFtIHtOdW1iZXJ9IHBvc2l0aW9uIC0gVGhlIGFic29sdXRlIG9yIHJlbGF0aXZlIHBvc2l0aW9uIHRvIG5vcm1hbGl6ZS5cblx0ICogQHBhcmFtIHtCb29sZWFufSBbcmVsYXRpdmU9ZmFsc2VdIC0gV2hldGhlciB0aGUgZ2l2ZW4gcG9zaXRpb24gaXMgcmVsYXRpdmUgb3Igbm90LlxuXHQgKiBAcmV0dXJucyB7TnVtYmVyfSAtIFRoZSBub3JtYWxpemVkIHBvc2l0aW9uLlxuXHQgKi9cblx0T3dsLnByb3RvdHlwZS5ub3JtYWxpemUgPSBmdW5jdGlvbihwb3NpdGlvbiwgcmVsYXRpdmUpIHtcblx0XHR2YXIgbiA9IHRoaXMuX2l0ZW1zLmxlbmd0aCxcblx0XHRcdG0gPSByZWxhdGl2ZSA/IDAgOiB0aGlzLl9jbG9uZXMubGVuZ3RoO1xuXG5cdFx0aWYgKCF0aGlzLmlzTnVtZXJpYyhwb3NpdGlvbikgfHwgbiA8IDEpIHtcblx0XHRcdHBvc2l0aW9uID0gdW5kZWZpbmVkO1xuXHRcdH0gZWxzZSBpZiAocG9zaXRpb24gPCAwIHx8IHBvc2l0aW9uID49IG4gKyBtKSB7XG5cdFx0XHRwb3NpdGlvbiA9ICgocG9zaXRpb24gLSBtIC8gMikgJSBuICsgbikgJSBuICsgbSAvIDI7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHBvc2l0aW9uO1xuXHR9O1xuXG5cdC8qKlxuXHQgKiBDb252ZXJ0cyBhbiBhYnNvbHV0ZSBwb3NpdGlvbiBvZiBhbiBpdGVtIGludG8gYSByZWxhdGl2ZSBvbmUuXG5cdCAqIEBwdWJsaWNcblx0ICogQHBhcmFtIHtOdW1iZXJ9IHBvc2l0aW9uIC0gVGhlIGFic29sdXRlIHBvc2l0aW9uIHRvIGNvbnZlcnQuXG5cdCAqIEByZXR1cm5zIHtOdW1iZXJ9IC0gVGhlIGNvbnZlcnRlZCBwb3NpdGlvbi5cblx0ICovXG5cdE93bC5wcm90b3R5cGUucmVsYXRpdmUgPSBmdW5jdGlvbihwb3NpdGlvbikge1xuXHRcdHBvc2l0aW9uIC09IHRoaXMuX2Nsb25lcy5sZW5ndGggLyAyO1xuXHRcdHJldHVybiB0aGlzLm5vcm1hbGl6ZShwb3NpdGlvbiwgdHJ1ZSk7XG5cdH07XG5cblx0LyoqXG5cdCAqIEdldHMgdGhlIG1heGltdW0gcG9zaXRpb24gZm9yIHRoZSBjdXJyZW50IGl0ZW0uXG5cdCAqIEBwdWJsaWNcblx0ICogQHBhcmFtIHtCb29sZWFufSBbcmVsYXRpdmU9ZmFsc2VdIC0gV2hldGhlciB0byByZXR1cm4gYW4gYWJzb2x1dGUgcG9zaXRpb24gb3IgYSByZWxhdGl2ZSBwb3NpdGlvbi5cblx0ICogQHJldHVybnMge051bWJlcn1cblx0ICovXG5cdE93bC5wcm90b3R5cGUubWF4aW11bSA9IGZ1bmN0aW9uKHJlbGF0aXZlKSB7XG5cdFx0dmFyIHNldHRpbmdzID0gdGhpcy5zZXR0aW5ncyxcblx0XHRcdG1heGltdW0gPSB0aGlzLl9jb29yZGluYXRlcy5sZW5ndGgsXG5cdFx0XHRib3VuZGFyeSA9IE1hdGguYWJzKHRoaXMuX2Nvb3JkaW5hdGVzW21heGltdW0gLSAxXSkgLSB0aGlzLl93aWR0aCxcblx0XHRcdGkgPSAtMSwgajtcblxuXHRcdGlmIChzZXR0aW5ncy5sb29wKSB7XG5cdFx0XHRtYXhpbXVtID0gdGhpcy5fY2xvbmVzLmxlbmd0aCAvIDIgKyB0aGlzLl9pdGVtcy5sZW5ndGggLSAxO1xuXHRcdH0gZWxzZSBpZiAoc2V0dGluZ3MuYXV0b1dpZHRoIHx8IHNldHRpbmdzLm1lcmdlKSB7XG5cdFx0XHQvLyBiaW5hcnkgc2VhcmNoXG5cdFx0XHR3aGlsZSAobWF4aW11bSAtIGkgPiAxKSB7XG5cdFx0XHRcdE1hdGguYWJzKHRoaXMuX2Nvb3JkaW5hdGVzW2ogPSBtYXhpbXVtICsgaSA+PiAxXSkgPCBib3VuZGFyeVxuXHRcdFx0XHRcdD8gaSA9IGogOiBtYXhpbXVtID0gajtcblx0XHRcdH1cblx0XHR9IGVsc2UgaWYgKHNldHRpbmdzLmNlbnRlcikge1xuXHRcdFx0bWF4aW11bSA9IHRoaXMuX2l0ZW1zLmxlbmd0aCAtIDE7XG5cdFx0fSBlbHNlIHtcblx0XHRcdG1heGltdW0gPSB0aGlzLl9pdGVtcy5sZW5ndGggLSBzZXR0aW5ncy5pdGVtcztcblx0XHR9XG5cblx0XHRpZiAocmVsYXRpdmUpIHtcblx0XHRcdG1heGltdW0gLT0gdGhpcy5fY2xvbmVzLmxlbmd0aCAvIDI7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIE1hdGgubWF4KG1heGltdW0sIDApO1xuXHR9O1xuXG5cdC8qKlxuXHQgKiBHZXRzIHRoZSBtaW5pbXVtIHBvc2l0aW9uIGZvciB0aGUgY3VycmVudCBpdGVtLlxuXHQgKiBAcHVibGljXG5cdCAqIEBwYXJhbSB7Qm9vbGVhbn0gW3JlbGF0aXZlPWZhbHNlXSAtIFdoZXRoZXIgdG8gcmV0dXJuIGFuIGFic29sdXRlIHBvc2l0aW9uIG9yIGEgcmVsYXRpdmUgcG9zaXRpb24uXG5cdCAqIEByZXR1cm5zIHtOdW1iZXJ9XG5cdCAqL1xuXHRPd2wucHJvdG90eXBlLm1pbmltdW0gPSBmdW5jdGlvbihyZWxhdGl2ZSkge1xuXHRcdHJldHVybiByZWxhdGl2ZSA/IDAgOiB0aGlzLl9jbG9uZXMubGVuZ3RoIC8gMjtcblx0fTtcblxuXHQvKipcblx0ICogR2V0cyBhbiBpdGVtIGF0IHRoZSBzcGVjaWZpZWQgcmVsYXRpdmUgcG9zaXRpb24uXG5cdCAqIEBwdWJsaWNcblx0ICogQHBhcmFtIHtOdW1iZXJ9IFtwb3NpdGlvbl0gLSBUaGUgcmVsYXRpdmUgcG9zaXRpb24gb2YgdGhlIGl0ZW0uXG5cdCAqIEByZXR1cm4ge2pRdWVyeXxBcnJheS48alF1ZXJ5Pn0gLSBUaGUgaXRlbSBhdCB0aGUgZ2l2ZW4gcG9zaXRpb24gb3IgYWxsIGl0ZW1zIGlmIG5vIHBvc2l0aW9uIHdhcyBnaXZlbi5cblx0ICovXG5cdE93bC5wcm90b3R5cGUuaXRlbXMgPSBmdW5jdGlvbihwb3NpdGlvbikge1xuXHRcdGlmIChwb3NpdGlvbiA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRyZXR1cm4gdGhpcy5faXRlbXMuc2xpY2UoKTtcblx0XHR9XG5cblx0XHRwb3NpdGlvbiA9IHRoaXMubm9ybWFsaXplKHBvc2l0aW9uLCB0cnVlKTtcblx0XHRyZXR1cm4gdGhpcy5faXRlbXNbcG9zaXRpb25dO1xuXHR9O1xuXG5cdC8qKlxuXHQgKiBHZXRzIGFuIGl0ZW0gYXQgdGhlIHNwZWNpZmllZCByZWxhdGl2ZSBwb3NpdGlvbi5cblx0ICogQHB1YmxpY1xuXHQgKiBAcGFyYW0ge051bWJlcn0gW3Bvc2l0aW9uXSAtIFRoZSByZWxhdGl2ZSBwb3NpdGlvbiBvZiB0aGUgaXRlbS5cblx0ICogQHJldHVybiB7alF1ZXJ5fEFycmF5LjxqUXVlcnk+fSAtIFRoZSBpdGVtIGF0IHRoZSBnaXZlbiBwb3NpdGlvbiBvciBhbGwgaXRlbXMgaWYgbm8gcG9zaXRpb24gd2FzIGdpdmVuLlxuXHQgKi9cblx0T3dsLnByb3RvdHlwZS5tZXJnZXJzID0gZnVuY3Rpb24ocG9zaXRpb24pIHtcblx0XHRpZiAocG9zaXRpb24gPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0cmV0dXJuIHRoaXMuX21lcmdlcnMuc2xpY2UoKTtcblx0XHR9XG5cblx0XHRwb3NpdGlvbiA9IHRoaXMubm9ybWFsaXplKHBvc2l0aW9uLCB0cnVlKTtcblx0XHRyZXR1cm4gdGhpcy5fbWVyZ2Vyc1twb3NpdGlvbl07XG5cdH07XG5cblx0LyoqXG5cdCAqIEdldHMgdGhlIGFic29sdXRlIHBvc2l0aW9ucyBvZiBjbG9uZXMgZm9yIGFuIGl0ZW0uXG5cdCAqIEBwdWJsaWNcblx0ICogQHBhcmFtIHtOdW1iZXJ9IFtwb3NpdGlvbl0gLSBUaGUgcmVsYXRpdmUgcG9zaXRpb24gb2YgdGhlIGl0ZW0uXG5cdCAqIEByZXR1cm5zIHtBcnJheS48TnVtYmVyPn0gLSBUaGUgYWJzb2x1dGUgcG9zaXRpb25zIG9mIGNsb25lcyBmb3IgdGhlIGl0ZW0gb3IgYWxsIGlmIG5vIHBvc2l0aW9uIHdhcyBnaXZlbi5cblx0ICovXG5cdE93bC5wcm90b3R5cGUuY2xvbmVzID0gZnVuY3Rpb24ocG9zaXRpb24pIHtcblx0XHR2YXIgb2RkID0gdGhpcy5fY2xvbmVzLmxlbmd0aCAvIDIsXG5cdFx0XHRldmVuID0gb2RkICsgdGhpcy5faXRlbXMubGVuZ3RoLFxuXHRcdFx0bWFwID0gZnVuY3Rpb24oaW5kZXgpIHsgcmV0dXJuIGluZGV4ICUgMiA9PT0gMCA/IGV2ZW4gKyBpbmRleCAvIDIgOiBvZGQgLSAoaW5kZXggKyAxKSAvIDIgfTtcblxuXHRcdGlmIChwb3NpdGlvbiA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRyZXR1cm4gJC5tYXAodGhpcy5fY2xvbmVzLCBmdW5jdGlvbih2LCBpKSB7IHJldHVybiBtYXAoaSkgfSk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuICQubWFwKHRoaXMuX2Nsb25lcywgZnVuY3Rpb24odiwgaSkgeyByZXR1cm4gdiA9PT0gcG9zaXRpb24gPyBtYXAoaSkgOiBudWxsIH0pO1xuXHR9O1xuXG5cdC8qKlxuXHQgKiBTZXRzIHRoZSBjdXJyZW50IGFuaW1hdGlvbiBzcGVlZC5cblx0ICogQHB1YmxpY1xuXHQgKiBAcGFyYW0ge051bWJlcn0gW3NwZWVkXSAtIFRoZSBhbmltYXRpb24gc3BlZWQgaW4gbWlsbGlzZWNvbmRzIG9yIG5vdGhpbmcgdG8gbGVhdmUgaXQgdW5jaGFuZ2VkLlxuXHQgKiBAcmV0dXJucyB7TnVtYmVyfSAtIFRoZSBjdXJyZW50IGFuaW1hdGlvbiBzcGVlZCBpbiBtaWxsaXNlY29uZHMuXG5cdCAqL1xuXHRPd2wucHJvdG90eXBlLnNwZWVkID0gZnVuY3Rpb24oc3BlZWQpIHtcblx0XHRpZiAoc3BlZWQgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0dGhpcy5fc3BlZWQgPSBzcGVlZDtcblx0XHR9XG5cblx0XHRyZXR1cm4gdGhpcy5fc3BlZWQ7XG5cdH07XG5cblx0LyoqXG5cdCAqIEdldHMgdGhlIGNvb3JkaW5hdGUgb2YgYW4gaXRlbS5cblx0ICogQHRvZG8gVGhlIG5hbWUgb2YgdGhpcyBtZXRob2QgaXMgbWlzc2xlYW5kaW5nLlxuXHQgKiBAcHVibGljXG5cdCAqIEBwYXJhbSB7TnVtYmVyfSBwb3NpdGlvbiAtIFRoZSBhYnNvbHV0ZSBwb3NpdGlvbiBvZiB0aGUgaXRlbSB3aXRoaW4gYG1pbmltdW0oKWAgYW5kIGBtYXhpbXVtKClgLlxuXHQgKiBAcmV0dXJucyB7TnVtYmVyfEFycmF5LjxOdW1iZXI+fSAtIFRoZSBjb29yZGluYXRlIG9mIHRoZSBpdGVtIGluIHBpeGVsIG9yIGFsbCBjb29yZGluYXRlcy5cblx0ICovXG5cdE93bC5wcm90b3R5cGUuY29vcmRpbmF0ZXMgPSBmdW5jdGlvbihwb3NpdGlvbikge1xuXHRcdHZhciBtdWx0aXBsaWVyID0gMSxcblx0XHRcdG5ld1Bvc2l0aW9uID0gcG9zaXRpb24gLSAxLFxuXHRcdFx0Y29vcmRpbmF0ZTtcblxuXHRcdGlmIChwb3NpdGlvbiA9PT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRyZXR1cm4gJC5tYXAodGhpcy5fY29vcmRpbmF0ZXMsICQucHJveHkoZnVuY3Rpb24oY29vcmRpbmF0ZSwgaW5kZXgpIHtcblx0XHRcdFx0cmV0dXJuIHRoaXMuY29vcmRpbmF0ZXMoaW5kZXgpO1xuXHRcdFx0fSwgdGhpcykpO1xuXHRcdH1cblxuXHRcdGlmICh0aGlzLnNldHRpbmdzLmNlbnRlcikge1xuXHRcdFx0aWYgKHRoaXMuc2V0dGluZ3MucnRsKSB7XG5cdFx0XHRcdG11bHRpcGxpZXIgPSAtMTtcblx0XHRcdFx0bmV3UG9zaXRpb24gPSBwb3NpdGlvbiArIDE7XG5cdFx0XHR9XG5cblx0XHRcdGNvb3JkaW5hdGUgPSB0aGlzLl9jb29yZGluYXRlc1twb3NpdGlvbl07XG5cdFx0XHRjb29yZGluYXRlICs9ICh0aGlzLndpZHRoKCkgLSBjb29yZGluYXRlICsgKHRoaXMuX2Nvb3JkaW5hdGVzW25ld1Bvc2l0aW9uXSB8fCAwKSkgLyAyICogbXVsdGlwbGllcjtcblx0XHR9IGVsc2Uge1xuXHRcdFx0Y29vcmRpbmF0ZSA9IHRoaXMuX2Nvb3JkaW5hdGVzW25ld1Bvc2l0aW9uXSB8fCAwO1xuXHRcdH1cblxuXHRcdGNvb3JkaW5hdGUgPSBNYXRoLmNlaWwoY29vcmRpbmF0ZSk7XG5cblx0XHRyZXR1cm4gY29vcmRpbmF0ZTtcblx0fTtcblxuXHQvKipcblx0ICogQ2FsY3VsYXRlcyB0aGUgc3BlZWQgZm9yIGEgdHJhbnNsYXRpb24uXG5cdCAqIEBwcm90ZWN0ZWRcblx0ICogQHBhcmFtIHtOdW1iZXJ9IGZyb20gLSBUaGUgYWJzb2x1dGUgcG9zaXRpb24gb2YgdGhlIHN0YXJ0IGl0ZW0uXG5cdCAqIEBwYXJhbSB7TnVtYmVyfSB0byAtIFRoZSBhYnNvbHV0ZSBwb3NpdGlvbiBvZiB0aGUgdGFyZ2V0IGl0ZW0uXG5cdCAqIEBwYXJhbSB7TnVtYmVyfSBbZmFjdG9yPXVuZGVmaW5lZF0gLSBUaGUgdGltZSBmYWN0b3IgaW4gbWlsbGlzZWNvbmRzLlxuXHQgKiBAcmV0dXJucyB7TnVtYmVyfSAtIFRoZSB0aW1lIGluIG1pbGxpc2Vjb25kcyBmb3IgdGhlIHRyYW5zbGF0aW9uLlxuXHQgKi9cblx0T3dsLnByb3RvdHlwZS5kdXJhdGlvbiA9IGZ1bmN0aW9uKGZyb20sIHRvLCBmYWN0b3IpIHtcblx0XHRpZiAoZmFjdG9yID09PSAwKSB7XG5cdFx0XHRyZXR1cm4gMDtcblx0XHR9XG5cblx0XHRyZXR1cm4gTWF0aC5taW4oTWF0aC5tYXgoTWF0aC5hYnModG8gLSBmcm9tKSwgMSksIDYpICogTWF0aC5hYnMoKGZhY3RvciB8fCB0aGlzLnNldHRpbmdzLnNtYXJ0U3BlZWQpKTtcblx0fTtcblxuXHQvKipcblx0ICogU2xpZGVzIHRvIHRoZSBzcGVjaWZpZWQgaXRlbS5cblx0ICogQHB1YmxpY1xuXHQgKiBAcGFyYW0ge051bWJlcn0gcG9zaXRpb24gLSBUaGUgcG9zaXRpb24gb2YgdGhlIGl0ZW0uXG5cdCAqIEBwYXJhbSB7TnVtYmVyfSBbc3BlZWRdIC0gVGhlIHRpbWUgaW4gbWlsbGlzZWNvbmRzIGZvciB0aGUgdHJhbnNpdGlvbi5cblx0ICovXG5cdE93bC5wcm90b3R5cGUudG8gPSBmdW5jdGlvbihwb3NpdGlvbiwgc3BlZWQpIHtcblx0XHR2YXIgY3VycmVudCA9IHRoaXMuY3VycmVudCgpLFxuXHRcdFx0cmV2ZXJ0ID0gbnVsbCxcblx0XHRcdGRpc3RhbmNlID0gcG9zaXRpb24gLSB0aGlzLnJlbGF0aXZlKGN1cnJlbnQpLFxuXHRcdFx0ZGlyZWN0aW9uID0gKGRpc3RhbmNlID4gMCkgLSAoZGlzdGFuY2UgPCAwKSxcblx0XHRcdGl0ZW1zID0gdGhpcy5faXRlbXMubGVuZ3RoLFxuXHRcdFx0bWluaW11bSA9IHRoaXMubWluaW11bSgpLFxuXHRcdFx0bWF4aW11bSA9IHRoaXMubWF4aW11bSgpO1xuXG5cdFx0aWYgKHRoaXMuc2V0dGluZ3MubG9vcCkge1xuXHRcdFx0aWYgKCF0aGlzLnNldHRpbmdzLnJld2luZCAmJiBNYXRoLmFicyhkaXN0YW5jZSkgPiBpdGVtcyAvIDIpIHtcblx0XHRcdFx0ZGlzdGFuY2UgKz0gZGlyZWN0aW9uICogLTEgKiBpdGVtcztcblx0XHRcdH1cblxuXHRcdFx0cG9zaXRpb24gPSBjdXJyZW50ICsgZGlzdGFuY2U7XG5cdFx0XHRyZXZlcnQgPSAoKHBvc2l0aW9uIC0gbWluaW11bSkgJSBpdGVtcyArIGl0ZW1zKSAlIGl0ZW1zICsgbWluaW11bTtcblxuXHRcdFx0aWYgKHJldmVydCAhPT0gcG9zaXRpb24gJiYgcmV2ZXJ0IC0gZGlzdGFuY2UgPD0gbWF4aW11bSAmJiByZXZlcnQgLSBkaXN0YW5jZSA+IDApIHtcblx0XHRcdFx0Y3VycmVudCA9IHJldmVydCAtIGRpc3RhbmNlO1xuXHRcdFx0XHRwb3NpdGlvbiA9IHJldmVydDtcblx0XHRcdFx0dGhpcy5yZXNldChjdXJyZW50KTtcblx0XHRcdH1cblx0XHR9IGVsc2UgaWYgKHRoaXMuc2V0dGluZ3MucmV3aW5kKSB7XG5cdFx0XHRtYXhpbXVtICs9IDE7XG5cdFx0XHRwb3NpdGlvbiA9IChwb3NpdGlvbiAlIG1heGltdW0gKyBtYXhpbXVtKSAlIG1heGltdW07XG5cdFx0fSBlbHNlIHtcblx0XHRcdHBvc2l0aW9uID0gTWF0aC5tYXgobWluaW11bSwgTWF0aC5taW4obWF4aW11bSwgcG9zaXRpb24pKTtcblx0XHR9XG5cblx0XHR0aGlzLnNwZWVkKHRoaXMuZHVyYXRpb24oY3VycmVudCwgcG9zaXRpb24sIHNwZWVkKSk7XG5cdFx0dGhpcy5jdXJyZW50KHBvc2l0aW9uKTtcblxuXHRcdGlmICh0aGlzLiRlbGVtZW50LmlzKCc6dmlzaWJsZScpKSB7XG5cdFx0XHR0aGlzLnVwZGF0ZSgpO1xuXHRcdH1cblx0fTtcblxuXHQvKipcblx0ICogU2xpZGVzIHRvIHRoZSBuZXh0IGl0ZW0uXG5cdCAqIEBwdWJsaWNcblx0ICogQHBhcmFtIHtOdW1iZXJ9IFtzcGVlZF0gLSBUaGUgdGltZSBpbiBtaWxsaXNlY29uZHMgZm9yIHRoZSB0cmFuc2l0aW9uLlxuXHQgKi9cblx0T3dsLnByb3RvdHlwZS5uZXh0ID0gZnVuY3Rpb24oc3BlZWQpIHtcblx0XHRzcGVlZCA9IHNwZWVkIHx8IGZhbHNlO1xuXHRcdHRoaXMudG8odGhpcy5yZWxhdGl2ZSh0aGlzLmN1cnJlbnQoKSkgKyAxLCBzcGVlZCk7XG5cdH07XG5cblx0LyoqXG5cdCAqIFNsaWRlcyB0byB0aGUgcHJldmlvdXMgaXRlbS5cblx0ICogQHB1YmxpY1xuXHQgKiBAcGFyYW0ge051bWJlcn0gW3NwZWVkXSAtIFRoZSB0aW1lIGluIG1pbGxpc2Vjb25kcyBmb3IgdGhlIHRyYW5zaXRpb24uXG5cdCAqL1xuXHRPd2wucHJvdG90eXBlLnByZXYgPSBmdW5jdGlvbihzcGVlZCkge1xuXHRcdHNwZWVkID0gc3BlZWQgfHwgZmFsc2U7XG5cdFx0dGhpcy50byh0aGlzLnJlbGF0aXZlKHRoaXMuY3VycmVudCgpKSAtIDEsIHNwZWVkKTtcblx0fTtcblxuXHQvKipcblx0ICogSGFuZGxlcyB0aGUgZW5kIG9mIGFuIGFuaW1hdGlvbi5cblx0ICogQHByb3RlY3RlZFxuXHQgKiBAcGFyYW0ge0V2ZW50fSBldmVudCAtIFRoZSBldmVudCBhcmd1bWVudHMuXG5cdCAqL1xuXHRPd2wucHJvdG90eXBlLm9uVHJhbnNpdGlvbkVuZCA9IGZ1bmN0aW9uKGV2ZW50KSB7XG5cblx0XHQvLyBpZiBjc3MyIGFuaW1hdGlvbiB0aGVuIGV2ZW50IG9iamVjdCBpcyB1bmRlZmluZWRcblx0XHRpZiAoZXZlbnQgIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0ZXZlbnQuc3RvcFByb3BhZ2F0aW9uKCk7XG5cblx0XHRcdC8vIENhdGNoIG9ubHkgb3dsLXN0YWdlIHRyYW5zaXRpb25FbmQgZXZlbnRcblx0XHRcdGlmICgoZXZlbnQudGFyZ2V0IHx8IGV2ZW50LnNyY0VsZW1lbnQgfHwgZXZlbnQub3JpZ2luYWxUYXJnZXQpICE9PSB0aGlzLiRzdGFnZS5nZXQoMCkpIHtcblx0XHRcdFx0cmV0dXJuIGZhbHNlO1xuXHRcdFx0fVxuXHRcdH1cblxuXHRcdHRoaXMubGVhdmUoJ2FuaW1hdGluZycpO1xuXHRcdHRoaXMudHJpZ2dlcigndHJhbnNsYXRlZCcpO1xuXHR9O1xuXG5cdC8qKlxuXHQgKiBHZXRzIHZpZXdwb3J0IHdpZHRoLlxuXHQgKiBAcHJvdGVjdGVkXG5cdCAqIEByZXR1cm4ge051bWJlcn0gLSBUaGUgd2lkdGggaW4gcGl4ZWwuXG5cdCAqL1xuXHRPd2wucHJvdG90eXBlLnZpZXdwb3J0ID0gZnVuY3Rpb24oKSB7XG5cdFx0dmFyIHdpZHRoO1xuXHRcdGlmICh0aGlzLm9wdGlvbnMucmVzcG9uc2l2ZUJhc2VFbGVtZW50ICE9PSB3aW5kb3cpIHtcblx0XHRcdHdpZHRoID0gJCh0aGlzLm9wdGlvbnMucmVzcG9uc2l2ZUJhc2VFbGVtZW50KS53aWR0aCgpO1xuXHRcdH0gZWxzZSBpZiAod2luZG93LmlubmVyV2lkdGgpIHtcblx0XHRcdHdpZHRoID0gd2luZG93LmlubmVyV2lkdGg7XG5cdFx0fSBlbHNlIGlmIChkb2N1bWVudC5kb2N1bWVudEVsZW1lbnQgJiYgZG9jdW1lbnQuZG9jdW1lbnRFbGVtZW50LmNsaWVudFdpZHRoKSB7XG5cdFx0XHR3aWR0aCA9IGRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5jbGllbnRXaWR0aDtcblx0XHR9IGVsc2Uge1xuXHRcdFx0dGhyb3cgJ0NhbiBub3QgZGV0ZWN0IHZpZXdwb3J0IHdpZHRoLic7XG5cdFx0fVxuXHRcdHJldHVybiB3aWR0aDtcblx0fTtcblxuXHQvKipcblx0ICogUmVwbGFjZXMgdGhlIGN1cnJlbnQgY29udGVudC5cblx0ICogQHB1YmxpY1xuXHQgKiBAcGFyYW0ge0hUTUxFbGVtZW50fGpRdWVyeXxTdHJpbmd9IGNvbnRlbnQgLSBUaGUgbmV3IGNvbnRlbnQuXG5cdCAqL1xuXHRPd2wucHJvdG90eXBlLnJlcGxhY2UgPSBmdW5jdGlvbihjb250ZW50KSB7XG5cdFx0dGhpcy4kc3RhZ2UuZW1wdHkoKTtcblx0XHR0aGlzLl9pdGVtcyA9IFtdO1xuXG5cdFx0aWYgKGNvbnRlbnQpIHtcblx0XHRcdGNvbnRlbnQgPSAoY29udGVudCBpbnN0YW5jZW9mIGpRdWVyeSkgPyBjb250ZW50IDogJChjb250ZW50KTtcblx0XHR9XG5cblx0XHRpZiAodGhpcy5zZXR0aW5ncy5uZXN0ZWRJdGVtU2VsZWN0b3IpIHtcblx0XHRcdGNvbnRlbnQgPSBjb250ZW50LmZpbmQoJy4nICsgdGhpcy5zZXR0aW5ncy5uZXN0ZWRJdGVtU2VsZWN0b3IpO1xuXHRcdH1cblxuXHRcdGNvbnRlbnQuZmlsdGVyKGZ1bmN0aW9uKCkge1xuXHRcdFx0cmV0dXJuIHRoaXMubm9kZVR5cGUgPT09IDE7XG5cdFx0fSkuZWFjaCgkLnByb3h5KGZ1bmN0aW9uKGluZGV4LCBpdGVtKSB7XG5cdFx0XHRpdGVtID0gdGhpcy5wcmVwYXJlKGl0ZW0pO1xuXHRcdFx0dGhpcy4kc3RhZ2UuYXBwZW5kKGl0ZW0pO1xuXHRcdFx0dGhpcy5faXRlbXMucHVzaChpdGVtKTtcblx0XHRcdHRoaXMuX21lcmdlcnMucHVzaChpdGVtLmZpbmQoJ1tkYXRhLW1lcmdlXScpLmFuZFNlbGYoJ1tkYXRhLW1lcmdlXScpLmF0dHIoJ2RhdGEtbWVyZ2UnKSAqIDEgfHwgMSk7XG5cdFx0fSwgdGhpcykpO1xuXG5cdFx0dGhpcy5yZXNldCh0aGlzLmlzTnVtZXJpYyh0aGlzLnNldHRpbmdzLnN0YXJ0UG9zaXRpb24pID8gdGhpcy5zZXR0aW5ncy5zdGFydFBvc2l0aW9uIDogMCk7XG5cblx0XHR0aGlzLmludmFsaWRhdGUoJ2l0ZW1zJyk7XG5cdH07XG5cblx0LyoqXG5cdCAqIEFkZHMgYW4gaXRlbS5cblx0ICogQHRvZG8gVXNlIGBpdGVtYCBpbnN0ZWFkIG9mIGBjb250ZW50YCBmb3IgdGhlIGV2ZW50IGFyZ3VtZW50cy5cblx0ICogQHB1YmxpY1xuXHQgKiBAcGFyYW0ge0hUTUxFbGVtZW50fGpRdWVyeXxTdHJpbmd9IGNvbnRlbnQgLSBUaGUgaXRlbSBjb250ZW50IHRvIGFkZC5cblx0ICogQHBhcmFtIHtOdW1iZXJ9IFtwb3NpdGlvbl0gLSBUaGUgcmVsYXRpdmUgcG9zaXRpb24gYXQgd2hpY2ggdG8gaW5zZXJ0IHRoZSBpdGVtIG90aGVyd2lzZSB0aGUgaXRlbSB3aWxsIGJlIGFkZGVkIHRvIHRoZSBlbmQuXG5cdCAqL1xuXHRPd2wucHJvdG90eXBlLmFkZCA9IGZ1bmN0aW9uKGNvbnRlbnQsIHBvc2l0aW9uKSB7XG5cdFx0dmFyIGN1cnJlbnQgPSB0aGlzLnJlbGF0aXZlKHRoaXMuX2N1cnJlbnQpO1xuXG5cdFx0cG9zaXRpb24gPSBwb3NpdGlvbiA9PT0gdW5kZWZpbmVkID8gdGhpcy5faXRlbXMubGVuZ3RoIDogdGhpcy5ub3JtYWxpemUocG9zaXRpb24sIHRydWUpO1xuXHRcdGNvbnRlbnQgPSBjb250ZW50IGluc3RhbmNlb2YgalF1ZXJ5ID8gY29udGVudCA6ICQoY29udGVudCk7XG5cblx0XHR0aGlzLnRyaWdnZXIoJ2FkZCcsIHsgY29udGVudDogY29udGVudCwgcG9zaXRpb246IHBvc2l0aW9uIH0pO1xuXG5cdFx0Y29udGVudCA9IHRoaXMucHJlcGFyZShjb250ZW50KTtcblxuXHRcdGlmICh0aGlzLl9pdGVtcy5sZW5ndGggPT09IDAgfHwgcG9zaXRpb24gPT09IHRoaXMuX2l0ZW1zLmxlbmd0aCkge1xuXHRcdFx0dGhpcy5faXRlbXMubGVuZ3RoID09PSAwICYmIHRoaXMuJHN0YWdlLmFwcGVuZChjb250ZW50KTtcblx0XHRcdHRoaXMuX2l0ZW1zLmxlbmd0aCAhPT0gMCAmJiB0aGlzLl9pdGVtc1twb3NpdGlvbiAtIDFdLmFmdGVyKGNvbnRlbnQpO1xuXHRcdFx0dGhpcy5faXRlbXMucHVzaChjb250ZW50KTtcblx0XHRcdHRoaXMuX21lcmdlcnMucHVzaChjb250ZW50LmZpbmQoJ1tkYXRhLW1lcmdlXScpLmFuZFNlbGYoJ1tkYXRhLW1lcmdlXScpLmF0dHIoJ2RhdGEtbWVyZ2UnKSAqIDEgfHwgMSk7XG5cdFx0fSBlbHNlIHtcblx0XHRcdHRoaXMuX2l0ZW1zW3Bvc2l0aW9uXS5iZWZvcmUoY29udGVudCk7XG5cdFx0XHR0aGlzLl9pdGVtcy5zcGxpY2UocG9zaXRpb24sIDAsIGNvbnRlbnQpO1xuXHRcdFx0dGhpcy5fbWVyZ2Vycy5zcGxpY2UocG9zaXRpb24sIDAsIGNvbnRlbnQuZmluZCgnW2RhdGEtbWVyZ2VdJykuYW5kU2VsZignW2RhdGEtbWVyZ2VdJykuYXR0cignZGF0YS1tZXJnZScpICogMSB8fCAxKTtcblx0XHR9XG5cblx0XHR0aGlzLl9pdGVtc1tjdXJyZW50XSAmJiB0aGlzLnJlc2V0KHRoaXMuX2l0ZW1zW2N1cnJlbnRdLmluZGV4KCkpO1xuXG5cdFx0dGhpcy5pbnZhbGlkYXRlKCdpdGVtcycpO1xuXG5cdFx0dGhpcy50cmlnZ2VyKCdhZGRlZCcsIHsgY29udGVudDogY29udGVudCwgcG9zaXRpb246IHBvc2l0aW9uIH0pO1xuXHR9O1xuXG5cdC8qKlxuXHQgKiBSZW1vdmVzIGFuIGl0ZW0gYnkgaXRzIHBvc2l0aW9uLlxuXHQgKiBAdG9kbyBVc2UgYGl0ZW1gIGluc3RlYWQgb2YgYGNvbnRlbnRgIGZvciB0aGUgZXZlbnQgYXJndW1lbnRzLlxuXHQgKiBAcHVibGljXG5cdCAqIEBwYXJhbSB7TnVtYmVyfSBwb3NpdGlvbiAtIFRoZSByZWxhdGl2ZSBwb3NpdGlvbiBvZiB0aGUgaXRlbSB0byByZW1vdmUuXG5cdCAqL1xuXHRPd2wucHJvdG90eXBlLnJlbW92ZSA9IGZ1bmN0aW9uKHBvc2l0aW9uKSB7XG5cdFx0cG9zaXRpb24gPSB0aGlzLm5vcm1hbGl6ZShwb3NpdGlvbiwgdHJ1ZSk7XG5cblx0XHRpZiAocG9zaXRpb24gPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdHRoaXMudHJpZ2dlcigncmVtb3ZlJywgeyBjb250ZW50OiB0aGlzLl9pdGVtc1twb3NpdGlvbl0sIHBvc2l0aW9uOiBwb3NpdGlvbiB9KTtcblxuXHRcdHRoaXMuX2l0ZW1zW3Bvc2l0aW9uXS5yZW1vdmUoKTtcblx0XHR0aGlzLl9pdGVtcy5zcGxpY2UocG9zaXRpb24sIDEpO1xuXHRcdHRoaXMuX21lcmdlcnMuc3BsaWNlKHBvc2l0aW9uLCAxKTtcblxuXHRcdHRoaXMuaW52YWxpZGF0ZSgnaXRlbXMnKTtcblxuXHRcdHRoaXMudHJpZ2dlcigncmVtb3ZlZCcsIHsgY29udGVudDogbnVsbCwgcG9zaXRpb246IHBvc2l0aW9uIH0pO1xuXHR9O1xuXG5cdC8qKlxuXHQgKiBQcmVsb2FkcyBpbWFnZXMgd2l0aCBhdXRvIHdpZHRoLlxuXHQgKiBAdG9kbyBSZXBsYWNlIGJ5IGEgbW9yZSBnZW5lcmljIGFwcHJvYWNoXG5cdCAqIEBwcm90ZWN0ZWRcblx0ICovXG5cdE93bC5wcm90b3R5cGUucHJlbG9hZEF1dG9XaWR0aEltYWdlcyA9IGZ1bmN0aW9uKGltYWdlcykge1xuXHRcdGltYWdlcy5lYWNoKCQucHJveHkoZnVuY3Rpb24oaSwgZWxlbWVudCkge1xuXHRcdFx0dGhpcy5lbnRlcigncHJlLWxvYWRpbmcnKTtcblx0XHRcdGVsZW1lbnQgPSAkKGVsZW1lbnQpO1xuXHRcdFx0JChuZXcgSW1hZ2UoKSkub25lKCdsb2FkJywgJC5wcm94eShmdW5jdGlvbihlKSB7XG5cdFx0XHRcdGVsZW1lbnQuYXR0cignc3JjJywgZS50YXJnZXQuc3JjKTtcblx0XHRcdFx0ZWxlbWVudC5jc3MoJ29wYWNpdHknLCAxKTtcblx0XHRcdFx0dGhpcy5sZWF2ZSgncHJlLWxvYWRpbmcnKTtcblx0XHRcdFx0IXRoaXMuaXMoJ3ByZS1sb2FkaW5nJykgJiYgIXRoaXMuaXMoJ2luaXRpYWxpemluZycpICYmIHRoaXMucmVmcmVzaCgpO1xuXHRcdFx0fSwgdGhpcykpLmF0dHIoJ3NyYycsIGVsZW1lbnQuYXR0cignc3JjJykgfHwgZWxlbWVudC5hdHRyKCdkYXRhLXNyYycpIHx8IGVsZW1lbnQuYXR0cignZGF0YS1zcmMtcmV0aW5hJykpO1xuXHRcdH0sIHRoaXMpKTtcblx0fTtcblxuXHQvKipcblx0ICogRGVzdHJveXMgdGhlIGNhcm91c2VsLlxuXHQgKiBAcHVibGljXG5cdCAqL1xuXHRPd2wucHJvdG90eXBlLmRlc3Ryb3kgPSBmdW5jdGlvbigpIHtcblxuXHRcdHRoaXMuJGVsZW1lbnQub2ZmKCcub3dsLmNvcmUnKTtcblx0XHR0aGlzLiRzdGFnZS5vZmYoJy5vd2wuY29yZScpO1xuXHRcdCQoZG9jdW1lbnQpLm9mZignLm93bC5jb3JlJyk7XG5cblx0XHRpZiAodGhpcy5zZXR0aW5ncy5yZXNwb25zaXZlICE9PSBmYWxzZSkge1xuXHRcdFx0d2luZG93LmNsZWFyVGltZW91dCh0aGlzLnJlc2l6ZVRpbWVyKTtcblx0XHRcdHRoaXMub2ZmKHdpbmRvdywgJ3Jlc2l6ZScsIHRoaXMuX2hhbmRsZXJzLm9uVGhyb3R0bGVkUmVzaXplKTtcblx0XHR9XG5cblx0XHRmb3IgKHZhciBpIGluIHRoaXMuX3BsdWdpbnMpIHtcblx0XHRcdHRoaXMuX3BsdWdpbnNbaV0uZGVzdHJveSgpO1xuXHRcdH1cblxuXHRcdHRoaXMuJHN0YWdlLmNoaWxkcmVuKCcuY2xvbmVkJykucmVtb3ZlKCk7XG5cblx0XHR0aGlzLiRzdGFnZS51bndyYXAoKTtcblx0XHR0aGlzLiRzdGFnZS5jaGlsZHJlbigpLmNvbnRlbnRzKCkudW53cmFwKCk7XG5cdFx0dGhpcy4kc3RhZ2UuY2hpbGRyZW4oKS51bndyYXAoKTtcblxuXHRcdHRoaXMuJGVsZW1lbnRcblx0XHRcdC5yZW1vdmVDbGFzcyh0aGlzLm9wdGlvbnMucmVmcmVzaENsYXNzKVxuXHRcdFx0LnJlbW92ZUNsYXNzKHRoaXMub3B0aW9ucy5sb2FkaW5nQ2xhc3MpXG5cdFx0XHQucmVtb3ZlQ2xhc3ModGhpcy5vcHRpb25zLmxvYWRlZENsYXNzKVxuXHRcdFx0LnJlbW92ZUNsYXNzKHRoaXMub3B0aW9ucy5ydGxDbGFzcylcblx0XHRcdC5yZW1vdmVDbGFzcyh0aGlzLm9wdGlvbnMuZHJhZ0NsYXNzKVxuXHRcdFx0LnJlbW92ZUNsYXNzKHRoaXMub3B0aW9ucy5ncmFiQ2xhc3MpXG5cdFx0XHQuYXR0cignY2xhc3MnLCB0aGlzLiRlbGVtZW50LmF0dHIoJ2NsYXNzJykucmVwbGFjZShuZXcgUmVnRXhwKHRoaXMub3B0aW9ucy5yZXNwb25zaXZlQ2xhc3MgKyAnLVxcXFxTK1xcXFxzJywgJ2cnKSwgJycpKVxuXHRcdFx0LnJlbW92ZURhdGEoJ293bC5jYXJvdXNlbCcpO1xuXHR9O1xuXG5cdC8qKlxuXHQgKiBPcGVyYXRvcnMgdG8gY2FsY3VsYXRlIHJpZ2h0LXRvLWxlZnQgYW5kIGxlZnQtdG8tcmlnaHQuXG5cdCAqIEBwcm90ZWN0ZWRcblx0ICogQHBhcmFtIHtOdW1iZXJ9IFthXSAtIFRoZSBsZWZ0IHNpZGUgb3BlcmFuZC5cblx0ICogQHBhcmFtIHtTdHJpbmd9IFtvXSAtIFRoZSBvcGVyYXRvci5cblx0ICogQHBhcmFtIHtOdW1iZXJ9IFtiXSAtIFRoZSByaWdodCBzaWRlIG9wZXJhbmQuXG5cdCAqL1xuXHRPd2wucHJvdG90eXBlLm9wID0gZnVuY3Rpb24oYSwgbywgYikge1xuXHRcdHZhciBydGwgPSB0aGlzLnNldHRpbmdzLnJ0bDtcblx0XHRzd2l0Y2ggKG8pIHtcblx0XHRcdGNhc2UgJzwnOlxuXHRcdFx0XHRyZXR1cm4gcnRsID8gYSA+IGIgOiBhIDwgYjtcblx0XHRcdGNhc2UgJz4nOlxuXHRcdFx0XHRyZXR1cm4gcnRsID8gYSA8IGIgOiBhID4gYjtcblx0XHRcdGNhc2UgJz49Jzpcblx0XHRcdFx0cmV0dXJuIHJ0bCA/IGEgPD0gYiA6IGEgPj0gYjtcblx0XHRcdGNhc2UgJzw9Jzpcblx0XHRcdFx0cmV0dXJuIHJ0bCA/IGEgPj0gYiA6IGEgPD0gYjtcblx0XHRcdGRlZmF1bHQ6XG5cdFx0XHRcdGJyZWFrO1xuXHRcdH1cblx0fTtcblxuXHQvKipcblx0ICogQXR0YWNoZXMgdG8gYW4gaW50ZXJuYWwgZXZlbnQuXG5cdCAqIEBwcm90ZWN0ZWRcblx0ICogQHBhcmFtIHtIVE1MRWxlbWVudH0gZWxlbWVudCAtIFRoZSBldmVudCBzb3VyY2UuXG5cdCAqIEBwYXJhbSB7U3RyaW5nfSBldmVudCAtIFRoZSBldmVudCBuYW1lLlxuXHQgKiBAcGFyYW0ge0Z1bmN0aW9ufSBsaXN0ZW5lciAtIFRoZSBldmVudCBoYW5kbGVyIHRvIGF0dGFjaC5cblx0ICogQHBhcmFtIHtCb29sZWFufSBjYXB0dXJlIC0gV2V0aGVyIHRoZSBldmVudCBzaG91bGQgYmUgaGFuZGxlZCBhdCB0aGUgY2FwdHVyaW5nIHBoYXNlIG9yIG5vdC5cblx0ICovXG5cdE93bC5wcm90b3R5cGUub24gPSBmdW5jdGlvbihlbGVtZW50LCBldmVudCwgbGlzdGVuZXIsIGNhcHR1cmUpIHtcblx0XHRpZiAoZWxlbWVudC5hZGRFdmVudExpc3RlbmVyKSB7XG5cdFx0XHRlbGVtZW50LmFkZEV2ZW50TGlzdGVuZXIoZXZlbnQsIGxpc3RlbmVyLCBjYXB0dXJlKTtcblx0XHR9IGVsc2UgaWYgKGVsZW1lbnQuYXR0YWNoRXZlbnQpIHtcblx0XHRcdGVsZW1lbnQuYXR0YWNoRXZlbnQoJ29uJyArIGV2ZW50LCBsaXN0ZW5lcik7XG5cdFx0fVxuXHR9O1xuXG5cdC8qKlxuXHQgKiBEZXRhY2hlcyBmcm9tIGFuIGludGVybmFsIGV2ZW50LlxuXHQgKiBAcHJvdGVjdGVkXG5cdCAqIEBwYXJhbSB7SFRNTEVsZW1lbnR9IGVsZW1lbnQgLSBUaGUgZXZlbnQgc291cmNlLlxuXHQgKiBAcGFyYW0ge1N0cmluZ30gZXZlbnQgLSBUaGUgZXZlbnQgbmFtZS5cblx0ICogQHBhcmFtIHtGdW5jdGlvbn0gbGlzdGVuZXIgLSBUaGUgYXR0YWNoZWQgZXZlbnQgaGFuZGxlciB0byBkZXRhY2guXG5cdCAqIEBwYXJhbSB7Qm9vbGVhbn0gY2FwdHVyZSAtIFdldGhlciB0aGUgYXR0YWNoZWQgZXZlbnQgaGFuZGxlciB3YXMgcmVnaXN0ZXJlZCBhcyBhIGNhcHR1cmluZyBsaXN0ZW5lciBvciBub3QuXG5cdCAqL1xuXHRPd2wucHJvdG90eXBlLm9mZiA9IGZ1bmN0aW9uKGVsZW1lbnQsIGV2ZW50LCBsaXN0ZW5lciwgY2FwdHVyZSkge1xuXHRcdGlmIChlbGVtZW50LnJlbW92ZUV2ZW50TGlzdGVuZXIpIHtcblx0XHRcdGVsZW1lbnQucmVtb3ZlRXZlbnRMaXN0ZW5lcihldmVudCwgbGlzdGVuZXIsIGNhcHR1cmUpO1xuXHRcdH0gZWxzZSBpZiAoZWxlbWVudC5kZXRhY2hFdmVudCkge1xuXHRcdFx0ZWxlbWVudC5kZXRhY2hFdmVudCgnb24nICsgZXZlbnQsIGxpc3RlbmVyKTtcblx0XHR9XG5cdH07XG5cblx0LyoqXG5cdCAqIFRyaWdnZXJzIGEgcHVibGljIGV2ZW50LlxuXHQgKiBAdG9kbyBSZW1vdmUgYHN0YXR1c2AsIGByZWxhdGVkVGFyZ2V0YCBzaG91bGQgYmUgdXNlZCBpbnN0ZWFkLlxuXHQgKiBAcHJvdGVjdGVkXG5cdCAqIEBwYXJhbSB7U3RyaW5nfSBuYW1lIC0gVGhlIGV2ZW50IG5hbWUuXG5cdCAqIEBwYXJhbSB7Kn0gW2RhdGE9bnVsbF0gLSBUaGUgZXZlbnQgZGF0YS5cblx0ICogQHBhcmFtIHtTdHJpbmd9IFtuYW1lc3BhY2U9Y2Fyb3VzZWxdIC0gVGhlIGV2ZW50IG5hbWVzcGFjZS5cblx0ICogQHBhcmFtIHtTdHJpbmd9IFtzdGF0ZV0gLSBUaGUgc3RhdGUgd2hpY2ggaXMgYXNzb2NpYXRlZCB3aXRoIHRoZSBldmVudC5cblx0ICogQHBhcmFtIHtCb29sZWFufSBbZW50ZXI9ZmFsc2VdIC0gSW5kaWNhdGVzIGlmIHRoZSBjYWxsIGVudGVycyB0aGUgc3BlY2lmaWVkIHN0YXRlIG9yIG5vdC5cblx0ICogQHJldHVybnMge0V2ZW50fSAtIFRoZSBldmVudCBhcmd1bWVudHMuXG5cdCAqL1xuXHRPd2wucHJvdG90eXBlLnRyaWdnZXIgPSBmdW5jdGlvbihuYW1lLCBkYXRhLCBuYW1lc3BhY2UsIHN0YXRlLCBlbnRlcikge1xuXHRcdHZhciBzdGF0dXMgPSB7XG5cdFx0XHRpdGVtOiB7IGNvdW50OiB0aGlzLl9pdGVtcy5sZW5ndGgsIGluZGV4OiB0aGlzLmN1cnJlbnQoKSB9XG5cdFx0fSwgaGFuZGxlciA9ICQuY2FtZWxDYXNlKFxuXHRcdFx0JC5ncmVwKFsgJ29uJywgbmFtZSwgbmFtZXNwYWNlIF0sIGZ1bmN0aW9uKHYpIHsgcmV0dXJuIHYgfSlcblx0XHRcdFx0LmpvaW4oJy0nKS50b0xvd2VyQ2FzZSgpXG5cdFx0KSwgZXZlbnQgPSAkLkV2ZW50KFxuXHRcdFx0WyBuYW1lLCAnb3dsJywgbmFtZXNwYWNlIHx8ICdjYXJvdXNlbCcgXS5qb2luKCcuJykudG9Mb3dlckNhc2UoKSxcblx0XHRcdCQuZXh0ZW5kKHsgcmVsYXRlZFRhcmdldDogdGhpcyB9LCBzdGF0dXMsIGRhdGEpXG5cdFx0KTtcblxuXHRcdGlmICghdGhpcy5fc3VwcmVzc1tuYW1lXSkge1xuXHRcdFx0JC5lYWNoKHRoaXMuX3BsdWdpbnMsIGZ1bmN0aW9uKG5hbWUsIHBsdWdpbikge1xuXHRcdFx0XHRpZiAocGx1Z2luLm9uVHJpZ2dlcikge1xuXHRcdFx0XHRcdHBsdWdpbi5vblRyaWdnZXIoZXZlbnQpO1xuXHRcdFx0XHR9XG5cdFx0XHR9KTtcblxuXHRcdFx0dGhpcy5yZWdpc3Rlcih7IHR5cGU6IE93bC5UeXBlLkV2ZW50LCBuYW1lOiBuYW1lIH0pO1xuXHRcdFx0dGhpcy4kZWxlbWVudC50cmlnZ2VyKGV2ZW50KTtcblxuXHRcdFx0aWYgKHRoaXMuc2V0dGluZ3MgJiYgdHlwZW9mIHRoaXMuc2V0dGluZ3NbaGFuZGxlcl0gPT09ICdmdW5jdGlvbicpIHtcblx0XHRcdFx0dGhpcy5zZXR0aW5nc1toYW5kbGVyXS5jYWxsKHRoaXMsIGV2ZW50KTtcblx0XHRcdH1cblx0XHR9XG5cblx0XHRyZXR1cm4gZXZlbnQ7XG5cdH07XG5cblx0LyoqXG5cdCAqIEVudGVycyBhIHN0YXRlLlxuXHQgKiBAcGFyYW0gbmFtZSAtIFRoZSBzdGF0ZSBuYW1lLlxuXHQgKi9cblx0T3dsLnByb3RvdHlwZS5lbnRlciA9IGZ1bmN0aW9uKG5hbWUpIHtcblx0XHQkLmVhY2goWyBuYW1lIF0uY29uY2F0KHRoaXMuX3N0YXRlcy50YWdzW25hbWVdIHx8IFtdKSwgJC5wcm94eShmdW5jdGlvbihpLCBuYW1lKSB7XG5cdFx0XHRpZiAodGhpcy5fc3RhdGVzLmN1cnJlbnRbbmFtZV0gPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0XHR0aGlzLl9zdGF0ZXMuY3VycmVudFtuYW1lXSA9IDA7XG5cdFx0XHR9XG5cblx0XHRcdHRoaXMuX3N0YXRlcy5jdXJyZW50W25hbWVdKys7XG5cdFx0fSwgdGhpcykpO1xuXHR9O1xuXG5cdC8qKlxuXHQgKiBMZWF2ZXMgYSBzdGF0ZS5cblx0ICogQHBhcmFtIG5hbWUgLSBUaGUgc3RhdGUgbmFtZS5cblx0ICovXG5cdE93bC5wcm90b3R5cGUubGVhdmUgPSBmdW5jdGlvbihuYW1lKSB7XG5cdFx0JC5lYWNoKFsgbmFtZSBdLmNvbmNhdCh0aGlzLl9zdGF0ZXMudGFnc1tuYW1lXSB8fCBbXSksICQucHJveHkoZnVuY3Rpb24oaSwgbmFtZSkge1xuXHRcdFx0dGhpcy5fc3RhdGVzLmN1cnJlbnRbbmFtZV0tLTtcblx0XHR9LCB0aGlzKSk7XG5cdH07XG5cblx0LyoqXG5cdCAqIFJlZ2lzdGVycyBhbiBldmVudCBvciBzdGF0ZS5cblx0ICogQHB1YmxpY1xuXHQgKiBAcGFyYW0ge09iamVjdH0gb2JqZWN0IC0gVGhlIGV2ZW50IG9yIHN0YXRlIHRvIHJlZ2lzdGVyLlxuXHQgKi9cblx0T3dsLnByb3RvdHlwZS5yZWdpc3RlciA9IGZ1bmN0aW9uKG9iamVjdCkge1xuXHRcdGlmIChvYmplY3QudHlwZSA9PT0gT3dsLlR5cGUuRXZlbnQpIHtcblx0XHRcdGlmICghJC5ldmVudC5zcGVjaWFsW29iamVjdC5uYW1lXSkge1xuXHRcdFx0XHQkLmV2ZW50LnNwZWNpYWxbb2JqZWN0Lm5hbWVdID0ge307XG5cdFx0XHR9XG5cblx0XHRcdGlmICghJC5ldmVudC5zcGVjaWFsW29iamVjdC5uYW1lXS5vd2wpIHtcblx0XHRcdFx0dmFyIF9kZWZhdWx0ID0gJC5ldmVudC5zcGVjaWFsW29iamVjdC5uYW1lXS5fZGVmYXVsdDtcblx0XHRcdFx0JC5ldmVudC5zcGVjaWFsW29iamVjdC5uYW1lXS5fZGVmYXVsdCA9IGZ1bmN0aW9uKGUpIHtcblx0XHRcdFx0XHRpZiAoX2RlZmF1bHQgJiYgX2RlZmF1bHQuYXBwbHkgJiYgKCFlLm5hbWVzcGFjZSB8fCBlLm5hbWVzcGFjZS5pbmRleE9mKCdvd2wnKSA9PT0gLTEpKSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gX2RlZmF1bHQuYXBwbHkodGhpcywgYXJndW1lbnRzKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdFx0cmV0dXJuIGUubmFtZXNwYWNlICYmIGUubmFtZXNwYWNlLmluZGV4T2YoJ293bCcpID4gLTE7XG5cdFx0XHRcdH07XG5cdFx0XHRcdCQuZXZlbnQuc3BlY2lhbFtvYmplY3QubmFtZV0ub3dsID0gdHJ1ZTtcblx0XHRcdH1cblx0XHR9IGVsc2UgaWYgKG9iamVjdC50eXBlID09PSBPd2wuVHlwZS5TdGF0ZSkge1xuXHRcdFx0aWYgKCF0aGlzLl9zdGF0ZXMudGFnc1tvYmplY3QubmFtZV0pIHtcblx0XHRcdFx0dGhpcy5fc3RhdGVzLnRhZ3Nbb2JqZWN0Lm5hbWVdID0gb2JqZWN0LnRhZ3M7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHR0aGlzLl9zdGF0ZXMudGFnc1tvYmplY3QubmFtZV0gPSB0aGlzLl9zdGF0ZXMudGFnc1tvYmplY3QubmFtZV0uY29uY2F0KG9iamVjdC50YWdzKTtcblx0XHRcdH1cblxuXHRcdFx0dGhpcy5fc3RhdGVzLnRhZ3Nbb2JqZWN0Lm5hbWVdID0gJC5ncmVwKHRoaXMuX3N0YXRlcy50YWdzW29iamVjdC5uYW1lXSwgJC5wcm94eShmdW5jdGlvbih0YWcsIGkpIHtcblx0XHRcdFx0cmV0dXJuICQuaW5BcnJheSh0YWcsIHRoaXMuX3N0YXRlcy50YWdzW29iamVjdC5uYW1lXSkgPT09IGk7XG5cdFx0XHR9LCB0aGlzKSk7XG5cdFx0fVxuXHR9O1xuXG5cdC8qKlxuXHQgKiBTdXBwcmVzc2VzIGV2ZW50cy5cblx0ICogQHByb3RlY3RlZFxuXHQgKiBAcGFyYW0ge0FycmF5LjxTdHJpbmc+fSBldmVudHMgLSBUaGUgZXZlbnRzIHRvIHN1cHByZXNzLlxuXHQgKi9cblx0T3dsLnByb3RvdHlwZS5zdXBwcmVzcyA9IGZ1bmN0aW9uKGV2ZW50cykge1xuXHRcdCQuZWFjaChldmVudHMsICQucHJveHkoZnVuY3Rpb24oaW5kZXgsIGV2ZW50KSB7XG5cdFx0XHR0aGlzLl9zdXByZXNzW2V2ZW50XSA9IHRydWU7XG5cdFx0fSwgdGhpcykpO1xuXHR9O1xuXG5cdC8qKlxuXHQgKiBSZWxlYXNlcyBzdXBwcmVzc2VkIGV2ZW50cy5cblx0ICogQHByb3RlY3RlZFxuXHQgKiBAcGFyYW0ge0FycmF5LjxTdHJpbmc+fSBldmVudHMgLSBUaGUgZXZlbnRzIHRvIHJlbGVhc2UuXG5cdCAqL1xuXHRPd2wucHJvdG90eXBlLnJlbGVhc2UgPSBmdW5jdGlvbihldmVudHMpIHtcblx0XHQkLmVhY2goZXZlbnRzLCAkLnByb3h5KGZ1bmN0aW9uKGluZGV4LCBldmVudCkge1xuXHRcdFx0ZGVsZXRlIHRoaXMuX3N1cHJlc3NbZXZlbnRdO1xuXHRcdH0sIHRoaXMpKTtcblx0fTtcblxuXHQvKipcblx0ICogR2V0cyB1bmlmaWVkIHBvaW50ZXIgY29vcmRpbmF0ZXMgZnJvbSBldmVudC5cblx0ICogQHRvZG8gIzI2MVxuXHQgKiBAcHJvdGVjdGVkXG5cdCAqIEBwYXJhbSB7RXZlbnR9IC0gVGhlIGBtb3VzZWRvd25gIG9yIGB0b3VjaHN0YXJ0YCBldmVudC5cblx0ICogQHJldHVybnMge09iamVjdH0gLSBDb250YWlucyBgeGAgYW5kIGB5YCBjb29yZGluYXRlcyBvZiBjdXJyZW50IHBvaW50ZXIgcG9zaXRpb24uXG5cdCAqL1xuXHRPd2wucHJvdG90eXBlLnBvaW50ZXIgPSBmdW5jdGlvbihldmVudCkge1xuXHRcdHZhciByZXN1bHQgPSB7IHg6IG51bGwsIHk6IG51bGwgfTtcblxuXHRcdGV2ZW50ID0gZXZlbnQub3JpZ2luYWxFdmVudCB8fCBldmVudCB8fCB3aW5kb3cuZXZlbnQ7XG5cblx0XHRldmVudCA9IGV2ZW50LnRvdWNoZXMgJiYgZXZlbnQudG91Y2hlcy5sZW5ndGggP1xuXHRcdFx0ZXZlbnQudG91Y2hlc1swXSA6IGV2ZW50LmNoYW5nZWRUb3VjaGVzICYmIGV2ZW50LmNoYW5nZWRUb3VjaGVzLmxlbmd0aCA/XG5cdFx0XHRcdGV2ZW50LmNoYW5nZWRUb3VjaGVzWzBdIDogZXZlbnQ7XG5cblx0XHRpZiAoZXZlbnQucGFnZVgpIHtcblx0XHRcdHJlc3VsdC54ID0gZXZlbnQucGFnZVg7XG5cdFx0XHRyZXN1bHQueSA9IGV2ZW50LnBhZ2VZO1xuXHRcdH0gZWxzZSB7XG5cdFx0XHRyZXN1bHQueCA9IGV2ZW50LmNsaWVudFg7XG5cdFx0XHRyZXN1bHQueSA9IGV2ZW50LmNsaWVudFk7XG5cdFx0fVxuXG5cdFx0cmV0dXJuIHJlc3VsdDtcblx0fTtcblxuXHQvKipcblx0ICogRGV0ZXJtaW5lcyBpZiB0aGUgaW5wdXQgaXMgYSBOdW1iZXIgb3Igc29tZXRoaW5nIHRoYXQgY2FuIGJlIGNvZXJjZWQgdG8gYSBOdW1iZXJcblx0ICogQHByb3RlY3RlZFxuXHQgKiBAcGFyYW0ge051bWJlcnxTdHJpbmd8T2JqZWN0fEFycmF5fEJvb2xlYW58UmVnRXhwfEZ1bmN0aW9ufFN5bWJvbH0gLSBUaGUgaW5wdXQgdG8gYmUgdGVzdGVkXG5cdCAqIEByZXR1cm5zIHtCb29sZWFufSAtIEFuIGluZGljYXRpb24gaWYgdGhlIGlucHV0IGlzIGEgTnVtYmVyIG9yIGNhbiBiZSBjb2VyY2VkIHRvIGEgTnVtYmVyXG5cdCAqL1xuXHRPd2wucHJvdG90eXBlLmlzTnVtZXJpYyA9IGZ1bmN0aW9uKG51bWJlcikge1xuXHRcdHJldHVybiAhaXNOYU4ocGFyc2VGbG9hdChudW1iZXIpKTtcblx0fTtcblxuXHQvKipcblx0ICogR2V0cyB0aGUgZGlmZmVyZW5jZSBvZiB0d28gdmVjdG9ycy5cblx0ICogQHRvZG8gIzI2MVxuXHQgKiBAcHJvdGVjdGVkXG5cdCAqIEBwYXJhbSB7T2JqZWN0fSAtIFRoZSBmaXJzdCB2ZWN0b3IuXG5cdCAqIEBwYXJhbSB7T2JqZWN0fSAtIFRoZSBzZWNvbmQgdmVjdG9yLlxuXHQgKiBAcmV0dXJucyB7T2JqZWN0fSAtIFRoZSBkaWZmZXJlbmNlLlxuXHQgKi9cblx0T3dsLnByb3RvdHlwZS5kaWZmZXJlbmNlID0gZnVuY3Rpb24oZmlyc3QsIHNlY29uZCkge1xuXHRcdHJldHVybiB7XG5cdFx0XHR4OiBmaXJzdC54IC0gc2Vjb25kLngsXG5cdFx0XHR5OiBmaXJzdC55IC0gc2Vjb25kLnlcblx0XHR9O1xuXHR9O1xuXG5cdC8qKlxuXHQgKiBUaGUgalF1ZXJ5IFBsdWdpbiBmb3IgdGhlIE93bCBDYXJvdXNlbFxuXHQgKiBAdG9kbyBOYXZpZ2F0aW9uIHBsdWdpbiBgbmV4dGAgYW5kIGBwcmV2YFxuXHQgKiBAcHVibGljXG5cdCAqL1xuXHQkLmZuLm93bENhcm91c2VsID0gZnVuY3Rpb24ob3B0aW9uKSB7XG5cdFx0dmFyIGFyZ3MgPSBBcnJheS5wcm90b3R5cGUuc2xpY2UuY2FsbChhcmd1bWVudHMsIDEpO1xuXG5cdFx0cmV0dXJuIHRoaXMuZWFjaChmdW5jdGlvbigpIHtcblx0XHRcdHZhciAkdGhpcyA9ICQodGhpcyksXG5cdFx0XHRcdGRhdGEgPSAkdGhpcy5kYXRhKCdvd2wuY2Fyb3VzZWwnKTtcblxuXHRcdFx0aWYgKCFkYXRhKSB7XG5cdFx0XHRcdGRhdGEgPSBuZXcgT3dsKHRoaXMsIHR5cGVvZiBvcHRpb24gPT0gJ29iamVjdCcgJiYgb3B0aW9uKTtcblx0XHRcdFx0JHRoaXMuZGF0YSgnb3dsLmNhcm91c2VsJywgZGF0YSk7XG5cblx0XHRcdFx0JC5lYWNoKFtcblx0XHRcdFx0XHQnbmV4dCcsICdwcmV2JywgJ3RvJywgJ2Rlc3Ryb3knLCAncmVmcmVzaCcsICdyZXBsYWNlJywgJ2FkZCcsICdyZW1vdmUnXG5cdFx0XHRcdF0sIGZ1bmN0aW9uKGksIGV2ZW50KSB7XG5cdFx0XHRcdFx0ZGF0YS5yZWdpc3Rlcih7IHR5cGU6IE93bC5UeXBlLkV2ZW50LCBuYW1lOiBldmVudCB9KTtcblx0XHRcdFx0XHRkYXRhLiRlbGVtZW50Lm9uKGV2ZW50ICsgJy5vd2wuY2Fyb3VzZWwuY29yZScsICQucHJveHkoZnVuY3Rpb24oZSkge1xuXHRcdFx0XHRcdFx0aWYgKGUubmFtZXNwYWNlICYmIGUucmVsYXRlZFRhcmdldCAhPT0gdGhpcykge1xuXHRcdFx0XHRcdFx0XHR0aGlzLnN1cHByZXNzKFsgZXZlbnQgXSk7XG5cdFx0XHRcdFx0XHRcdGRhdGFbZXZlbnRdLmFwcGx5KHRoaXMsIFtdLnNsaWNlLmNhbGwoYXJndW1lbnRzLCAxKSk7XG5cdFx0XHRcdFx0XHRcdHRoaXMucmVsZWFzZShbIGV2ZW50IF0pO1xuXHRcdFx0XHRcdFx0fVxuXHRcdFx0XHRcdH0sIGRhdGEpKTtcblx0XHRcdFx0fSk7XG5cdFx0XHR9XG5cblx0XHRcdGlmICh0eXBlb2Ygb3B0aW9uID09ICdzdHJpbmcnICYmIG9wdGlvbi5jaGFyQXQoMCkgIT09ICdfJykge1xuXHRcdFx0XHRkYXRhW29wdGlvbl0uYXBwbHkoZGF0YSwgYXJncyk7XG5cdFx0XHR9XG5cdFx0fSk7XG5cdH07XG5cblx0LyoqXG5cdCAqIFRoZSBjb25zdHJ1Y3RvciBmb3IgdGhlIGpRdWVyeSBQbHVnaW5cblx0ICogQHB1YmxpY1xuXHQgKi9cblx0JC5mbi5vd2xDYXJvdXNlbC5Db25zdHJ1Y3RvciA9IE93bDtcblxufSkod2luZG93LlplcHRvIHx8IHdpbmRvdy5qUXVlcnksIHdpbmRvdywgZG9jdW1lbnQpO1xuXG4vKipcbiAqIEF1dG9SZWZyZXNoIFBsdWdpblxuICogQHZlcnNpb24gMi4xLjBcbiAqIEBhdXRob3IgQXJ0dXMgS29sYW5vd3NraVxuICogQGF1dGhvciBEYXZpZCBEZXV0c2NoXG4gKiBAbGljZW5zZSBUaGUgTUlUIExpY2Vuc2UgKE1JVClcbiAqL1xuOyhmdW5jdGlvbigkLCB3aW5kb3csIGRvY3VtZW50LCB1bmRlZmluZWQpIHtcblxuXHQvKipcblx0ICogQ3JlYXRlcyB0aGUgYXV0byByZWZyZXNoIHBsdWdpbi5cblx0ICogQGNsYXNzIFRoZSBBdXRvIFJlZnJlc2ggUGx1Z2luXG5cdCAqIEBwYXJhbSB7T3dsfSBjYXJvdXNlbCAtIFRoZSBPd2wgQ2Fyb3VzZWxcblx0ICovXG5cdHZhciBBdXRvUmVmcmVzaCA9IGZ1bmN0aW9uKGNhcm91c2VsKSB7XG5cdFx0LyoqXG5cdFx0ICogUmVmZXJlbmNlIHRvIHRoZSBjb3JlLlxuXHRcdCAqIEBwcm90ZWN0ZWRcblx0XHQgKiBAdHlwZSB7T3dsfVxuXHRcdCAqL1xuXHRcdHRoaXMuX2NvcmUgPSBjYXJvdXNlbDtcblxuXHRcdC8qKlxuXHRcdCAqIFJlZnJlc2ggaW50ZXJ2YWwuXG5cdFx0ICogQHByb3RlY3RlZFxuXHRcdCAqIEB0eXBlIHtudW1iZXJ9XG5cdFx0ICovXG5cdFx0dGhpcy5faW50ZXJ2YWwgPSBudWxsO1xuXG5cdFx0LyoqXG5cdFx0ICogV2hldGhlciB0aGUgZWxlbWVudCBpcyBjdXJyZW50bHkgdmlzaWJsZSBvciBub3QuXG5cdFx0ICogQHByb3RlY3RlZFxuXHRcdCAqIEB0eXBlIHtCb29sZWFufVxuXHRcdCAqL1xuXHRcdHRoaXMuX3Zpc2libGUgPSBudWxsO1xuXG5cdFx0LyoqXG5cdFx0ICogQWxsIGV2ZW50IGhhbmRsZXJzLlxuXHRcdCAqIEBwcm90ZWN0ZWRcblx0XHQgKiBAdHlwZSB7T2JqZWN0fVxuXHRcdCAqL1xuXHRcdHRoaXMuX2hhbmRsZXJzID0ge1xuXHRcdFx0J2luaXRpYWxpemVkLm93bC5jYXJvdXNlbCc6ICQucHJveHkoZnVuY3Rpb24oZSkge1xuXHRcdFx0XHRpZiAoZS5uYW1lc3BhY2UgJiYgdGhpcy5fY29yZS5zZXR0aW5ncy5hdXRvUmVmcmVzaCkge1xuXHRcdFx0XHRcdHRoaXMud2F0Y2goKTtcblx0XHRcdFx0fVxuXHRcdFx0fSwgdGhpcylcblx0XHR9O1xuXG5cdFx0Ly8gc2V0IGRlZmF1bHQgb3B0aW9uc1xuXHRcdHRoaXMuX2NvcmUub3B0aW9ucyA9ICQuZXh0ZW5kKHt9LCBBdXRvUmVmcmVzaC5EZWZhdWx0cywgdGhpcy5fY29yZS5vcHRpb25zKTtcblxuXHRcdC8vIHJlZ2lzdGVyIGV2ZW50IGhhbmRsZXJzXG5cdFx0dGhpcy5fY29yZS4kZWxlbWVudC5vbih0aGlzLl9oYW5kbGVycyk7XG5cdH07XG5cblx0LyoqXG5cdCAqIERlZmF1bHQgb3B0aW9ucy5cblx0ICogQHB1YmxpY1xuXHQgKi9cblx0QXV0b1JlZnJlc2guRGVmYXVsdHMgPSB7XG5cdFx0YXV0b1JlZnJlc2g6IHRydWUsXG5cdFx0YXV0b1JlZnJlc2hJbnRlcnZhbDogNTAwXG5cdH07XG5cblx0LyoqXG5cdCAqIFdhdGNoZXMgdGhlIGVsZW1lbnQuXG5cdCAqL1xuXHRBdXRvUmVmcmVzaC5wcm90b3R5cGUud2F0Y2ggPSBmdW5jdGlvbigpIHtcblx0XHRpZiAodGhpcy5faW50ZXJ2YWwpIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHR0aGlzLl92aXNpYmxlID0gdGhpcy5fY29yZS4kZWxlbWVudC5pcygnOnZpc2libGUnKTtcblx0XHR0aGlzLl9pbnRlcnZhbCA9IHdpbmRvdy5zZXRJbnRlcnZhbCgkLnByb3h5KHRoaXMucmVmcmVzaCwgdGhpcyksIHRoaXMuX2NvcmUuc2V0dGluZ3MuYXV0b1JlZnJlc2hJbnRlcnZhbCk7XG5cdH07XG5cblx0LyoqXG5cdCAqIFJlZnJlc2hlcyB0aGUgZWxlbWVudC5cblx0ICovXG5cdEF1dG9SZWZyZXNoLnByb3RvdHlwZS5yZWZyZXNoID0gZnVuY3Rpb24oKSB7XG5cdFx0aWYgKHRoaXMuX2NvcmUuJGVsZW1lbnQuaXMoJzp2aXNpYmxlJykgPT09IHRoaXMuX3Zpc2libGUpIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHR0aGlzLl92aXNpYmxlID0gIXRoaXMuX3Zpc2libGU7XG5cblx0XHR0aGlzLl9jb3JlLiRlbGVtZW50LnRvZ2dsZUNsYXNzKCdvd2wtaGlkZGVuJywgIXRoaXMuX3Zpc2libGUpO1xuXG5cdFx0dGhpcy5fdmlzaWJsZSAmJiAodGhpcy5fY29yZS5pbnZhbGlkYXRlKCd3aWR0aCcpICYmIHRoaXMuX2NvcmUucmVmcmVzaCgpKTtcblx0fTtcblxuXHQvKipcblx0ICogRGVzdHJveXMgdGhlIHBsdWdpbi5cblx0ICovXG5cdEF1dG9SZWZyZXNoLnByb3RvdHlwZS5kZXN0cm95ID0gZnVuY3Rpb24oKSB7XG5cdFx0dmFyIGhhbmRsZXIsIHByb3BlcnR5O1xuXG5cdFx0d2luZG93LmNsZWFySW50ZXJ2YWwodGhpcy5faW50ZXJ2YWwpO1xuXG5cdFx0Zm9yIChoYW5kbGVyIGluIHRoaXMuX2hhbmRsZXJzKSB7XG5cdFx0XHR0aGlzLl9jb3JlLiRlbGVtZW50Lm9mZihoYW5kbGVyLCB0aGlzLl9oYW5kbGVyc1toYW5kbGVyXSk7XG5cdFx0fVxuXHRcdGZvciAocHJvcGVydHkgaW4gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXModGhpcykpIHtcblx0XHRcdHR5cGVvZiB0aGlzW3Byb3BlcnR5XSAhPSAnZnVuY3Rpb24nICYmICh0aGlzW3Byb3BlcnR5XSA9IG51bGwpO1xuXHRcdH1cblx0fTtcblxuXHQkLmZuLm93bENhcm91c2VsLkNvbnN0cnVjdG9yLlBsdWdpbnMuQXV0b1JlZnJlc2ggPSBBdXRvUmVmcmVzaDtcblxufSkod2luZG93LlplcHRvIHx8IHdpbmRvdy5qUXVlcnksIHdpbmRvdywgZG9jdW1lbnQpO1xuXG4vKipcbiAqIExhenkgUGx1Z2luXG4gKiBAdmVyc2lvbiAyLjEuMFxuICogQGF1dGhvciBCYXJ0b3N6IFdvamNpZWNob3dza2lcbiAqIEBhdXRob3IgRGF2aWQgRGV1dHNjaFxuICogQGxpY2Vuc2UgVGhlIE1JVCBMaWNlbnNlIChNSVQpXG4gKi9cbjsoZnVuY3Rpb24oJCwgd2luZG93LCBkb2N1bWVudCwgdW5kZWZpbmVkKSB7XG5cblx0LyoqXG5cdCAqIENyZWF0ZXMgdGhlIGxhenkgcGx1Z2luLlxuXHQgKiBAY2xhc3MgVGhlIExhenkgUGx1Z2luXG5cdCAqIEBwYXJhbSB7T3dsfSBjYXJvdXNlbCAtIFRoZSBPd2wgQ2Fyb3VzZWxcblx0ICovXG5cdHZhciBMYXp5ID0gZnVuY3Rpb24oY2Fyb3VzZWwpIHtcblxuXHRcdC8qKlxuXHRcdCAqIFJlZmVyZW5jZSB0byB0aGUgY29yZS5cblx0XHQgKiBAcHJvdGVjdGVkXG5cdFx0ICogQHR5cGUge093bH1cblx0XHQgKi9cblx0XHR0aGlzLl9jb3JlID0gY2Fyb3VzZWw7XG5cblx0XHQvKipcblx0XHQgKiBBbHJlYWR5IGxvYWRlZCBpdGVtcy5cblx0XHQgKiBAcHJvdGVjdGVkXG5cdFx0ICogQHR5cGUge0FycmF5LjxqUXVlcnk+fVxuXHRcdCAqL1xuXHRcdHRoaXMuX2xvYWRlZCA9IFtdO1xuXG5cdFx0LyoqXG5cdFx0ICogRXZlbnQgaGFuZGxlcnMuXG5cdFx0ICogQHByb3RlY3RlZFxuXHRcdCAqIEB0eXBlIHtPYmplY3R9XG5cdFx0ICovXG5cdFx0dGhpcy5faGFuZGxlcnMgPSB7XG5cdFx0XHQnaW5pdGlhbGl6ZWQub3dsLmNhcm91c2VsIGNoYW5nZS5vd2wuY2Fyb3VzZWwgcmVzaXplZC5vd2wuY2Fyb3VzZWwnOiAkLnByb3h5KGZ1bmN0aW9uKGUpIHtcblx0XHRcdFx0aWYgKCFlLm5hbWVzcGFjZSkge1xuXHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGlmICghdGhpcy5fY29yZS5zZXR0aW5ncyB8fCAhdGhpcy5fY29yZS5zZXR0aW5ncy5sYXp5TG9hZCkge1xuXHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0fVxuXG5cdFx0XHRcdGlmICgoZS5wcm9wZXJ0eSAmJiBlLnByb3BlcnR5Lm5hbWUgPT0gJ3Bvc2l0aW9uJykgfHwgZS50eXBlID09ICdpbml0aWFsaXplZCcpIHtcblx0XHRcdFx0XHR2YXIgc2V0dGluZ3MgPSB0aGlzLl9jb3JlLnNldHRpbmdzLFxuXHRcdFx0XHRcdFx0biA9IChzZXR0aW5ncy5jZW50ZXIgJiYgTWF0aC5jZWlsKHNldHRpbmdzLml0ZW1zIC8gMikgfHwgc2V0dGluZ3MuaXRlbXMpLFxuXHRcdFx0XHRcdFx0aSA9ICgoc2V0dGluZ3MuY2VudGVyICYmIG4gKiAtMSkgfHwgMCksXG5cdFx0XHRcdFx0XHRwb3NpdGlvbiA9IChlLnByb3BlcnR5ICYmIGUucHJvcGVydHkudmFsdWUgIT09IHVuZGVmaW5lZCA/IGUucHJvcGVydHkudmFsdWUgOiB0aGlzLl9jb3JlLmN1cnJlbnQoKSkgKyBpLFxuXHRcdFx0XHRcdFx0Y2xvbmVzID0gdGhpcy5fY29yZS5jbG9uZXMoKS5sZW5ndGgsXG5cdFx0XHRcdFx0XHRsb2FkID0gJC5wcm94eShmdW5jdGlvbihpLCB2KSB7IHRoaXMubG9hZCh2KSB9LCB0aGlzKTtcblxuXHRcdFx0XHRcdHdoaWxlIChpKysgPCBuKSB7XG5cdFx0XHRcdFx0XHR0aGlzLmxvYWQoY2xvbmVzIC8gMiArIHRoaXMuX2NvcmUucmVsYXRpdmUocG9zaXRpb24pKTtcblx0XHRcdFx0XHRcdGNsb25lcyAmJiAkLmVhY2godGhpcy5fY29yZS5jbG9uZXModGhpcy5fY29yZS5yZWxhdGl2ZShwb3NpdGlvbikpLCBsb2FkKTtcblx0XHRcdFx0XHRcdHBvc2l0aW9uKys7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHR9XG5cdFx0XHR9LCB0aGlzKVxuXHRcdH07XG5cblx0XHQvLyBzZXQgdGhlIGRlZmF1bHQgb3B0aW9uc1xuXHRcdHRoaXMuX2NvcmUub3B0aW9ucyA9ICQuZXh0ZW5kKHt9LCBMYXp5LkRlZmF1bHRzLCB0aGlzLl9jb3JlLm9wdGlvbnMpO1xuXG5cdFx0Ly8gcmVnaXN0ZXIgZXZlbnQgaGFuZGxlclxuXHRcdHRoaXMuX2NvcmUuJGVsZW1lbnQub24odGhpcy5faGFuZGxlcnMpO1xuXHR9O1xuXG5cdC8qKlxuXHQgKiBEZWZhdWx0IG9wdGlvbnMuXG5cdCAqIEBwdWJsaWNcblx0ICovXG5cdExhenkuRGVmYXVsdHMgPSB7XG5cdFx0bGF6eUxvYWQ6IGZhbHNlXG5cdH07XG5cblx0LyoqXG5cdCAqIExvYWRzIGFsbCByZXNvdXJjZXMgb2YgYW4gaXRlbSBhdCB0aGUgc3BlY2lmaWVkIHBvc2l0aW9uLlxuXHQgKiBAcGFyYW0ge051bWJlcn0gcG9zaXRpb24gLSBUaGUgYWJzb2x1dGUgcG9zaXRpb24gb2YgdGhlIGl0ZW0uXG5cdCAqIEBwcm90ZWN0ZWRcblx0ICovXG5cdExhenkucHJvdG90eXBlLmxvYWQgPSBmdW5jdGlvbihwb3NpdGlvbikge1xuXHRcdHZhciAkaXRlbSA9IHRoaXMuX2NvcmUuJHN0YWdlLmNoaWxkcmVuKCkuZXEocG9zaXRpb24pLFxuXHRcdFx0JGVsZW1lbnRzID0gJGl0ZW0gJiYgJGl0ZW0uZmluZCgnLm93bC1sYXp5Jyk7XG5cblx0XHRpZiAoISRlbGVtZW50cyB8fCAkLmluQXJyYXkoJGl0ZW0uZ2V0KDApLCB0aGlzLl9sb2FkZWQpID4gLTEpIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHQkZWxlbWVudHMuZWFjaCgkLnByb3h5KGZ1bmN0aW9uKGluZGV4LCBlbGVtZW50KSB7XG5cdFx0XHR2YXIgJGVsZW1lbnQgPSAkKGVsZW1lbnQpLCBpbWFnZSxcblx0XHRcdFx0dXJsID0gKHdpbmRvdy5kZXZpY2VQaXhlbFJhdGlvID4gMSAmJiAkZWxlbWVudC5hdHRyKCdkYXRhLXNyYy1yZXRpbmEnKSkgfHwgJGVsZW1lbnQuYXR0cignZGF0YS1zcmMnKTtcblxuXHRcdFx0dGhpcy5fY29yZS50cmlnZ2VyKCdsb2FkJywgeyBlbGVtZW50OiAkZWxlbWVudCwgdXJsOiB1cmwgfSwgJ2xhenknKTtcblxuXHRcdFx0aWYgKCRlbGVtZW50LmlzKCdpbWcnKSkge1xuXHRcdFx0XHQkZWxlbWVudC5vbmUoJ2xvYWQub3dsLmxhenknLCAkLnByb3h5KGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRcdCRlbGVtZW50LmNzcygnb3BhY2l0eScsIDEpO1xuXHRcdFx0XHRcdHRoaXMuX2NvcmUudHJpZ2dlcignbG9hZGVkJywgeyBlbGVtZW50OiAkZWxlbWVudCwgdXJsOiB1cmwgfSwgJ2xhenknKTtcblx0XHRcdFx0fSwgdGhpcykpLmF0dHIoJ3NyYycsIHVybCk7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHRpbWFnZSA9IG5ldyBJbWFnZSgpO1xuXHRcdFx0XHRpbWFnZS5vbmxvYWQgPSAkLnByb3h5KGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRcdCRlbGVtZW50LmNzcyh7XG5cdFx0XHRcdFx0XHQnYmFja2dyb3VuZC1pbWFnZSc6ICd1cmwoJyArIHVybCArICcpJyxcblx0XHRcdFx0XHRcdCdvcGFjaXR5JzogJzEnXG5cdFx0XHRcdFx0fSk7XG5cdFx0XHRcdFx0dGhpcy5fY29yZS50cmlnZ2VyKCdsb2FkZWQnLCB7IGVsZW1lbnQ6ICRlbGVtZW50LCB1cmw6IHVybCB9LCAnbGF6eScpO1xuXHRcdFx0XHR9LCB0aGlzKTtcblx0XHRcdFx0aW1hZ2Uuc3JjID0gdXJsO1xuXHRcdFx0fVxuXHRcdH0sIHRoaXMpKTtcblxuXHRcdHRoaXMuX2xvYWRlZC5wdXNoKCRpdGVtLmdldCgwKSk7XG5cdH07XG5cblx0LyoqXG5cdCAqIERlc3Ryb3lzIHRoZSBwbHVnaW4uXG5cdCAqIEBwdWJsaWNcblx0ICovXG5cdExhenkucHJvdG90eXBlLmRlc3Ryb3kgPSBmdW5jdGlvbigpIHtcblx0XHR2YXIgaGFuZGxlciwgcHJvcGVydHk7XG5cblx0XHRmb3IgKGhhbmRsZXIgaW4gdGhpcy5oYW5kbGVycykge1xuXHRcdFx0dGhpcy5fY29yZS4kZWxlbWVudC5vZmYoaGFuZGxlciwgdGhpcy5oYW5kbGVyc1toYW5kbGVyXSk7XG5cdFx0fVxuXHRcdGZvciAocHJvcGVydHkgaW4gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXModGhpcykpIHtcblx0XHRcdHR5cGVvZiB0aGlzW3Byb3BlcnR5XSAhPSAnZnVuY3Rpb24nICYmICh0aGlzW3Byb3BlcnR5XSA9IG51bGwpO1xuXHRcdH1cblx0fTtcblxuXHQkLmZuLm93bENhcm91c2VsLkNvbnN0cnVjdG9yLlBsdWdpbnMuTGF6eSA9IExhenk7XG5cbn0pKHdpbmRvdy5aZXB0byB8fCB3aW5kb3cualF1ZXJ5LCB3aW5kb3csIGRvY3VtZW50KTtcblxuLyoqXG4gKiBBdXRvSGVpZ2h0IFBsdWdpblxuICogQHZlcnNpb24gMi4xLjBcbiAqIEBhdXRob3IgQmFydG9zeiBXb2pjaWVjaG93c2tpXG4gKiBAYXV0aG9yIERhdmlkIERldXRzY2hcbiAqIEBsaWNlbnNlIFRoZSBNSVQgTGljZW5zZSAoTUlUKVxuICovXG47KGZ1bmN0aW9uKCQsIHdpbmRvdywgZG9jdW1lbnQsIHVuZGVmaW5lZCkge1xuXG5cdC8qKlxuXHQgKiBDcmVhdGVzIHRoZSBhdXRvIGhlaWdodCBwbHVnaW4uXG5cdCAqIEBjbGFzcyBUaGUgQXV0byBIZWlnaHQgUGx1Z2luXG5cdCAqIEBwYXJhbSB7T3dsfSBjYXJvdXNlbCAtIFRoZSBPd2wgQ2Fyb3VzZWxcblx0ICovXG5cdHZhciBBdXRvSGVpZ2h0ID0gZnVuY3Rpb24oY2Fyb3VzZWwpIHtcblx0XHQvKipcblx0XHQgKiBSZWZlcmVuY2UgdG8gdGhlIGNvcmUuXG5cdFx0ICogQHByb3RlY3RlZFxuXHRcdCAqIEB0eXBlIHtPd2x9XG5cdFx0ICovXG5cdFx0dGhpcy5fY29yZSA9IGNhcm91c2VsO1xuXG5cdFx0LyoqXG5cdFx0ICogQWxsIGV2ZW50IGhhbmRsZXJzLlxuXHRcdCAqIEBwcm90ZWN0ZWRcblx0XHQgKiBAdHlwZSB7T2JqZWN0fVxuXHRcdCAqL1xuXHRcdHRoaXMuX2hhbmRsZXJzID0ge1xuXHRcdFx0J2luaXRpYWxpemVkLm93bC5jYXJvdXNlbCByZWZyZXNoZWQub3dsLmNhcm91c2VsJzogJC5wcm94eShmdW5jdGlvbihlKSB7XG5cdFx0XHRcdGlmIChlLm5hbWVzcGFjZSAmJiB0aGlzLl9jb3JlLnNldHRpbmdzLmF1dG9IZWlnaHQpIHtcblx0XHRcdFx0XHR0aGlzLnVwZGF0ZSgpO1xuXHRcdFx0XHR9XG5cdFx0XHR9LCB0aGlzKSxcblx0XHRcdCdjaGFuZ2VkLm93bC5jYXJvdXNlbCc6ICQucHJveHkoZnVuY3Rpb24oZSkge1xuXHRcdFx0XHRpZiAoZS5uYW1lc3BhY2UgJiYgdGhpcy5fY29yZS5zZXR0aW5ncy5hdXRvSGVpZ2h0ICYmIGUucHJvcGVydHkubmFtZSA9PSAncG9zaXRpb24nKXtcblx0XHRcdFx0XHR0aGlzLnVwZGF0ZSgpO1xuXHRcdFx0XHR9XG5cdFx0XHR9LCB0aGlzKSxcblx0XHRcdCdsb2FkZWQub3dsLmxhenknOiAkLnByb3h5KGZ1bmN0aW9uKGUpIHtcblx0XHRcdFx0aWYgKGUubmFtZXNwYWNlICYmIHRoaXMuX2NvcmUuc2V0dGluZ3MuYXV0b0hlaWdodFxuXHRcdFx0XHRcdCYmIGUuZWxlbWVudC5jbG9zZXN0KCcuJyArIHRoaXMuX2NvcmUuc2V0dGluZ3MuaXRlbUNsYXNzKS5pbmRleCgpID09PSB0aGlzLl9jb3JlLmN1cnJlbnQoKSkge1xuXHRcdFx0XHRcdHRoaXMudXBkYXRlKCk7XG5cdFx0XHRcdH1cblx0XHRcdH0sIHRoaXMpXG5cdFx0fTtcblxuXHRcdC8vIHNldCBkZWZhdWx0IG9wdGlvbnNcblx0XHR0aGlzLl9jb3JlLm9wdGlvbnMgPSAkLmV4dGVuZCh7fSwgQXV0b0hlaWdodC5EZWZhdWx0cywgdGhpcy5fY29yZS5vcHRpb25zKTtcblxuXHRcdC8vIHJlZ2lzdGVyIGV2ZW50IGhhbmRsZXJzXG5cdFx0dGhpcy5fY29yZS4kZWxlbWVudC5vbih0aGlzLl9oYW5kbGVycyk7XG5cdH07XG5cblx0LyoqXG5cdCAqIERlZmF1bHQgb3B0aW9ucy5cblx0ICogQHB1YmxpY1xuXHQgKi9cblx0QXV0b0hlaWdodC5EZWZhdWx0cyA9IHtcblx0XHRhdXRvSGVpZ2h0OiBmYWxzZSxcblx0XHRhdXRvSGVpZ2h0Q2xhc3M6ICdvd2wtaGVpZ2h0J1xuXHR9O1xuXG5cdC8qKlxuXHQgKiBVcGRhdGVzIHRoZSB2aWV3LlxuXHQgKi9cblx0QXV0b0hlaWdodC5wcm90b3R5cGUudXBkYXRlID0gZnVuY3Rpb24oKSB7XG5cdFx0dmFyIHN0YXJ0ID0gdGhpcy5fY29yZS5fY3VycmVudCxcblx0XHRcdGVuZCA9IHN0YXJ0ICsgdGhpcy5fY29yZS5zZXR0aW5ncy5pdGVtcyxcblx0XHRcdHZpc2libGUgPSB0aGlzLl9jb3JlLiRzdGFnZS5jaGlsZHJlbigpLnRvQXJyYXkoKS5zbGljZShzdGFydCwgZW5kKSxcblx0XHRcdGhlaWdodHMgPSBbXSxcblx0XHRcdG1heGhlaWdodCA9IDA7XG5cblx0XHQkLmVhY2godmlzaWJsZSwgZnVuY3Rpb24oaW5kZXgsIGl0ZW0pIHtcblx0XHRcdGhlaWdodHMucHVzaCgkKGl0ZW0pLmhlaWdodCgpKTtcblx0XHR9KTtcblxuXHRcdG1heGhlaWdodCA9IE1hdGgubWF4LmFwcGx5KG51bGwsIGhlaWdodHMpO1xuXG5cdFx0dGhpcy5fY29yZS4kc3RhZ2UucGFyZW50KClcblx0XHRcdC5oZWlnaHQobWF4aGVpZ2h0KVxuXHRcdFx0LmFkZENsYXNzKHRoaXMuX2NvcmUuc2V0dGluZ3MuYXV0b0hlaWdodENsYXNzKTtcblx0fTtcblxuXHRBdXRvSGVpZ2h0LnByb3RvdHlwZS5kZXN0cm95ID0gZnVuY3Rpb24oKSB7XG5cdFx0dmFyIGhhbmRsZXIsIHByb3BlcnR5O1xuXG5cdFx0Zm9yIChoYW5kbGVyIGluIHRoaXMuX2hhbmRsZXJzKSB7XG5cdFx0XHR0aGlzLl9jb3JlLiRlbGVtZW50Lm9mZihoYW5kbGVyLCB0aGlzLl9oYW5kbGVyc1toYW5kbGVyXSk7XG5cdFx0fVxuXHRcdGZvciAocHJvcGVydHkgaW4gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXModGhpcykpIHtcblx0XHRcdHR5cGVvZiB0aGlzW3Byb3BlcnR5XSAhPSAnZnVuY3Rpb24nICYmICh0aGlzW3Byb3BlcnR5XSA9IG51bGwpO1xuXHRcdH1cblx0fTtcblxuXHQkLmZuLm93bENhcm91c2VsLkNvbnN0cnVjdG9yLlBsdWdpbnMuQXV0b0hlaWdodCA9IEF1dG9IZWlnaHQ7XG5cbn0pKHdpbmRvdy5aZXB0byB8fCB3aW5kb3cualF1ZXJ5LCB3aW5kb3csIGRvY3VtZW50KTtcblxuLyoqXG4gKiBWaWRlbyBQbHVnaW5cbiAqIEB2ZXJzaW9uIDIuMS4wXG4gKiBAYXV0aG9yIEJhcnRvc3ogV29qY2llY2hvd3NraVxuICogQGF1dGhvciBEYXZpZCBEZXV0c2NoXG4gKiBAbGljZW5zZSBUaGUgTUlUIExpY2Vuc2UgKE1JVClcbiAqL1xuOyhmdW5jdGlvbigkLCB3aW5kb3csIGRvY3VtZW50LCB1bmRlZmluZWQpIHtcblxuXHQvKipcblx0ICogQ3JlYXRlcyB0aGUgdmlkZW8gcGx1Z2luLlxuXHQgKiBAY2xhc3MgVGhlIFZpZGVvIFBsdWdpblxuXHQgKiBAcGFyYW0ge093bH0gY2Fyb3VzZWwgLSBUaGUgT3dsIENhcm91c2VsXG5cdCAqL1xuXHR2YXIgVmlkZW8gPSBmdW5jdGlvbihjYXJvdXNlbCkge1xuXHRcdC8qKlxuXHRcdCAqIFJlZmVyZW5jZSB0byB0aGUgY29yZS5cblx0XHQgKiBAcHJvdGVjdGVkXG5cdFx0ICogQHR5cGUge093bH1cblx0XHQgKi9cblx0XHR0aGlzLl9jb3JlID0gY2Fyb3VzZWw7XG5cblx0XHQvKipcblx0XHQgKiBDYWNoZSBhbGwgdmlkZW8gVVJMcy5cblx0XHQgKiBAcHJvdGVjdGVkXG5cdFx0ICogQHR5cGUge09iamVjdH1cblx0XHQgKi9cblx0XHR0aGlzLl92aWRlb3MgPSB7fTtcblxuXHRcdC8qKlxuXHRcdCAqIEN1cnJlbnQgcGxheWluZyBpdGVtLlxuXHRcdCAqIEBwcm90ZWN0ZWRcblx0XHQgKiBAdHlwZSB7alF1ZXJ5fVxuXHRcdCAqL1xuXHRcdHRoaXMuX3BsYXlpbmcgPSBudWxsO1xuXG5cdFx0LyoqXG5cdFx0ICogQWxsIGV2ZW50IGhhbmRsZXJzLlxuXHRcdCAqIEB0b2RvIFRoZSBjbG9uZWQgY29udGVudCByZW1vdmFsZSBpcyB0b28gbGF0ZVxuXHRcdCAqIEBwcm90ZWN0ZWRcblx0XHQgKiBAdHlwZSB7T2JqZWN0fVxuXHRcdCAqL1xuXHRcdHRoaXMuX2hhbmRsZXJzID0ge1xuXHRcdFx0J2luaXRpYWxpemVkLm93bC5jYXJvdXNlbCc6ICQucHJveHkoZnVuY3Rpb24oZSkge1xuXHRcdFx0XHRpZiAoZS5uYW1lc3BhY2UpIHtcblx0XHRcdFx0XHR0aGlzLl9jb3JlLnJlZ2lzdGVyKHsgdHlwZTogJ3N0YXRlJywgbmFtZTogJ3BsYXlpbmcnLCB0YWdzOiBbICdpbnRlcmFjdGluZycgXSB9KTtcblx0XHRcdFx0fVxuXHRcdFx0fSwgdGhpcyksXG5cdFx0XHQncmVzaXplLm93bC5jYXJvdXNlbCc6ICQucHJveHkoZnVuY3Rpb24oZSkge1xuXHRcdFx0XHRpZiAoZS5uYW1lc3BhY2UgJiYgdGhpcy5fY29yZS5zZXR0aW5ncy52aWRlbyAmJiB0aGlzLmlzSW5GdWxsU2NyZWVuKCkpIHtcblx0XHRcdFx0XHRlLnByZXZlbnREZWZhdWx0KCk7XG5cdFx0XHRcdH1cblx0XHRcdH0sIHRoaXMpLFxuXHRcdFx0J3JlZnJlc2hlZC5vd2wuY2Fyb3VzZWwnOiAkLnByb3h5KGZ1bmN0aW9uKGUpIHtcblx0XHRcdFx0aWYgKGUubmFtZXNwYWNlICYmIHRoaXMuX2NvcmUuaXMoJ3Jlc2l6aW5nJykpIHtcblx0XHRcdFx0XHR0aGlzLl9jb3JlLiRzdGFnZS5maW5kKCcuY2xvbmVkIC5vd2wtdmlkZW8tZnJhbWUnKS5yZW1vdmUoKTtcblx0XHRcdFx0fVxuXHRcdFx0fSwgdGhpcyksXG5cdFx0XHQnY2hhbmdlZC5vd2wuY2Fyb3VzZWwnOiAkLnByb3h5KGZ1bmN0aW9uKGUpIHtcblx0XHRcdFx0aWYgKGUubmFtZXNwYWNlICYmIGUucHJvcGVydHkubmFtZSA9PT0gJ3Bvc2l0aW9uJyAmJiB0aGlzLl9wbGF5aW5nKSB7XG5cdFx0XHRcdFx0dGhpcy5zdG9wKCk7XG5cdFx0XHRcdH1cblx0XHRcdH0sIHRoaXMpLFxuXHRcdFx0J3ByZXBhcmVkLm93bC5jYXJvdXNlbCc6ICQucHJveHkoZnVuY3Rpb24oZSkge1xuXHRcdFx0XHRpZiAoIWUubmFtZXNwYWNlKSB7XG5cdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHR9XG5cblx0XHRcdFx0dmFyICRlbGVtZW50ID0gJChlLmNvbnRlbnQpLmZpbmQoJy5vd2wtdmlkZW8nKTtcblxuXHRcdFx0XHRpZiAoJGVsZW1lbnQubGVuZ3RoKSB7XG5cdFx0XHRcdFx0JGVsZW1lbnQuY3NzKCdkaXNwbGF5JywgJ25vbmUnKTtcblx0XHRcdFx0XHR0aGlzLmZldGNoKCRlbGVtZW50LCAkKGUuY29udGVudCkpO1xuXHRcdFx0XHR9XG5cdFx0XHR9LCB0aGlzKVxuXHRcdH07XG5cblx0XHQvLyBzZXQgZGVmYXVsdCBvcHRpb25zXG5cdFx0dGhpcy5fY29yZS5vcHRpb25zID0gJC5leHRlbmQoe30sIFZpZGVvLkRlZmF1bHRzLCB0aGlzLl9jb3JlLm9wdGlvbnMpO1xuXG5cdFx0Ly8gcmVnaXN0ZXIgZXZlbnQgaGFuZGxlcnNcblx0XHR0aGlzLl9jb3JlLiRlbGVtZW50Lm9uKHRoaXMuX2hhbmRsZXJzKTtcblxuXHRcdHRoaXMuX2NvcmUuJGVsZW1lbnQub24oJ2NsaWNrLm93bC52aWRlbycsICcub3dsLXZpZGVvLXBsYXktaWNvbicsICQucHJveHkoZnVuY3Rpb24oZSkge1xuXHRcdFx0dGhpcy5wbGF5KGUpO1xuXHRcdH0sIHRoaXMpKTtcblx0fTtcblxuXHQvKipcblx0ICogRGVmYXVsdCBvcHRpb25zLlxuXHQgKiBAcHVibGljXG5cdCAqL1xuXHRWaWRlby5EZWZhdWx0cyA9IHtcblx0XHR2aWRlbzogZmFsc2UsXG5cdFx0dmlkZW9IZWlnaHQ6IGZhbHNlLFxuXHRcdHZpZGVvV2lkdGg6IGZhbHNlXG5cdH07XG5cblx0LyoqXG5cdCAqIEdldHMgdGhlIHZpZGVvIElEIGFuZCB0aGUgdHlwZSAoWW91VHViZS9WaW1lby92emFhciBvbmx5KS5cblx0ICogQHByb3RlY3RlZFxuXHQgKiBAcGFyYW0ge2pRdWVyeX0gdGFyZ2V0IC0gVGhlIHRhcmdldCBjb250YWluaW5nIHRoZSB2aWRlbyBkYXRhLlxuXHQgKiBAcGFyYW0ge2pRdWVyeX0gaXRlbSAtIFRoZSBpdGVtIGNvbnRhaW5pbmcgdGhlIHZpZGVvLlxuXHQgKi9cblx0VmlkZW8ucHJvdG90eXBlLmZldGNoID0gZnVuY3Rpb24odGFyZ2V0LCBpdGVtKSB7XG5cdFx0XHR2YXIgdHlwZSA9IChmdW5jdGlvbigpIHtcblx0XHRcdFx0XHRpZiAodGFyZ2V0LmF0dHIoJ2RhdGEtdmltZW8taWQnKSkge1xuXHRcdFx0XHRcdFx0cmV0dXJuICd2aW1lbyc7XG5cdFx0XHRcdFx0fSBlbHNlIGlmICh0YXJnZXQuYXR0cignZGF0YS12emFhci1pZCcpKSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gJ3Z6YWFyJ1xuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHRyZXR1cm4gJ3lvdXR1YmUnO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fSkoKSxcblx0XHRcdFx0aWQgPSB0YXJnZXQuYXR0cignZGF0YS12aW1lby1pZCcpIHx8IHRhcmdldC5hdHRyKCdkYXRhLXlvdXR1YmUtaWQnKSB8fCB0YXJnZXQuYXR0cignZGF0YS12emFhci1pZCcpLFxuXHRcdFx0XHR3aWR0aCA9IHRhcmdldC5hdHRyKCdkYXRhLXdpZHRoJykgfHwgdGhpcy5fY29yZS5zZXR0aW5ncy52aWRlb1dpZHRoLFxuXHRcdFx0XHRoZWlnaHQgPSB0YXJnZXQuYXR0cignZGF0YS1oZWlnaHQnKSB8fCB0aGlzLl9jb3JlLnNldHRpbmdzLnZpZGVvSGVpZ2h0LFxuXHRcdFx0XHR1cmwgPSB0YXJnZXQuYXR0cignaHJlZicpO1xuXG5cdFx0aWYgKHVybCkge1xuXG5cdFx0XHQvKlxuXHRcdFx0XHRcdFBhcnNlcyB0aGUgaWQncyBvdXQgb2YgdGhlIGZvbGxvd2luZyB1cmxzIChhbmQgcHJvYmFibHkgbW9yZSk6XG5cdFx0XHRcdFx0aHR0cHM6Ly93d3cueW91dHViZS5jb20vd2F0Y2g/dj06aWRcblx0XHRcdFx0XHRodHRwczovL3lvdXR1LmJlLzppZFxuXHRcdFx0XHRcdGh0dHBzOi8vdmltZW8uY29tLzppZFxuXHRcdFx0XHRcdGh0dHBzOi8vdmltZW8uY29tL2NoYW5uZWxzLzpjaGFubmVsLzppZFxuXHRcdFx0XHRcdGh0dHBzOi8vdmltZW8uY29tL2dyb3Vwcy86Z3JvdXAvdmlkZW9zLzppZFxuXHRcdFx0XHRcdGh0dHBzOi8vYXBwLnZ6YWFyLmNvbS92aWRlb3MvOmlkXG5cblx0XHRcdFx0XHRWaXN1YWwgZXhhbXBsZTogaHR0cHM6Ly9yZWdleHBlci5jb20vIyhodHRwJTNBJTdDaHR0cHMlM0ElN0MpJTVDJTJGJTVDJTJGKHBsYXllci4lN0N3d3cuJTdDYXBwLiklM0YodmltZW8lNUMuY29tJTdDeW91dHUoYmUlNUMuY29tJTdDJTVDLmJlJTdDYmUlNUMuZ29vZ2xlYXBpcyU1Qy5jb20pJTdDdnphYXIlNUMuY29tKSU1QyUyRih2aWRlbyU1QyUyRiU3Q3ZpZGVvcyU1QyUyRiU3Q2VtYmVkJTVDJTJGJTdDY2hhbm5lbHMlNUMlMkYuJTJCJTVDJTJGJTdDZ3JvdXBzJTVDJTJGLiUyQiU1QyUyRiU3Q3dhdGNoJTVDJTNGdiUzRCU3Q3YlNUMlMkYpJTNGKCU1QkEtWmEtejAtOS5fJTI1LSU1RCopKCU1QyUyNiU1Q1MlMkIpJTNGXG5cdFx0XHQqL1xuXG5cdFx0XHRpZCA9IHVybC5tYXRjaCgvKGh0dHA6fGh0dHBzOnwpXFwvXFwvKHBsYXllci58d3d3LnxhcHAuKT8odmltZW9cXC5jb218eW91dHUoYmVcXC5jb218XFwuYmV8YmVcXC5nb29nbGVhcGlzXFwuY29tKXx2emFhclxcLmNvbSlcXC8odmlkZW9cXC98dmlkZW9zXFwvfGVtYmVkXFwvfGNoYW5uZWxzXFwvLitcXC98Z3JvdXBzXFwvLitcXC98d2F0Y2hcXD92PXx2XFwvKT8oW0EtWmEtejAtOS5fJS1dKikoXFwmXFxTKyk/Lyk7XG5cblx0XHRcdGlmIChpZFszXS5pbmRleE9mKCd5b3V0dScpID4gLTEpIHtcblx0XHRcdFx0dHlwZSA9ICd5b3V0dWJlJztcblx0XHRcdH0gZWxzZSBpZiAoaWRbM10uaW5kZXhPZigndmltZW8nKSA+IC0xKSB7XG5cdFx0XHRcdHR5cGUgPSAndmltZW8nO1xuXHRcdFx0fSBlbHNlIGlmIChpZFszXS5pbmRleE9mKCd2emFhcicpID4gLTEpIHtcblx0XHRcdFx0dHlwZSA9ICd2emFhcic7XG5cdFx0XHR9IGVsc2Uge1xuXHRcdFx0XHR0aHJvdyBuZXcgRXJyb3IoJ1ZpZGVvIFVSTCBub3Qgc3VwcG9ydGVkLicpO1xuXHRcdFx0fVxuXHRcdFx0aWQgPSBpZFs2XTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0dGhyb3cgbmV3IEVycm9yKCdNaXNzaW5nIHZpZGVvIFVSTC4nKTtcblx0XHR9XG5cblx0XHR0aGlzLl92aWRlb3NbdXJsXSA9IHtcblx0XHRcdHR5cGU6IHR5cGUsXG5cdFx0XHRpZDogaWQsXG5cdFx0XHR3aWR0aDogd2lkdGgsXG5cdFx0XHRoZWlnaHQ6IGhlaWdodFxuXHRcdH07XG5cblx0XHRpdGVtLmF0dHIoJ2RhdGEtdmlkZW8nLCB1cmwpO1xuXG5cdFx0dGhpcy50aHVtYm5haWwodGFyZ2V0LCB0aGlzLl92aWRlb3NbdXJsXSk7XG5cdH07XG5cblx0LyoqXG5cdCAqIENyZWF0ZXMgdmlkZW8gdGh1bWJuYWlsLlxuXHQgKiBAcHJvdGVjdGVkXG5cdCAqIEBwYXJhbSB7alF1ZXJ5fSB0YXJnZXQgLSBUaGUgdGFyZ2V0IGNvbnRhaW5pbmcgdGhlIHZpZGVvIGRhdGEuXG5cdCAqIEBwYXJhbSB7T2JqZWN0fSBpbmZvIC0gVGhlIHZpZGVvIGluZm8gb2JqZWN0LlxuXHQgKiBAc2VlIGBmZXRjaGBcblx0ICovXG5cdFZpZGVvLnByb3RvdHlwZS50aHVtYm5haWwgPSBmdW5jdGlvbih0YXJnZXQsIHZpZGVvKSB7XG5cdFx0dmFyIHRuTGluayxcblx0XHRcdGljb24sXG5cdFx0XHRwYXRoLFxuXHRcdFx0ZGltZW5zaW9ucyA9IHZpZGVvLndpZHRoICYmIHZpZGVvLmhlaWdodCA/ICdzdHlsZT1cIndpZHRoOicgKyB2aWRlby53aWR0aCArICdweDtoZWlnaHQ6JyArIHZpZGVvLmhlaWdodCArICdweDtcIicgOiAnJyxcblx0XHRcdGN1c3RvbVRuID0gdGFyZ2V0LmZpbmQoJ2ltZycpLFxuXHRcdFx0c3JjVHlwZSA9ICdzcmMnLFxuXHRcdFx0bGF6eUNsYXNzID0gJycsXG5cdFx0XHRzZXR0aW5ncyA9IHRoaXMuX2NvcmUuc2V0dGluZ3MsXG5cdFx0XHRjcmVhdGUgPSBmdW5jdGlvbihwYXRoKSB7XG5cdFx0XHRcdGljb24gPSAnPGRpdiBjbGFzcz1cIm93bC12aWRlby1wbGF5LWljb25cIj48L2Rpdj4nO1xuXG5cdFx0XHRcdGlmIChzZXR0aW5ncy5sYXp5TG9hZCkge1xuXHRcdFx0XHRcdHRuTGluayA9ICc8ZGl2IGNsYXNzPVwib3dsLXZpZGVvLXRuICcgKyBsYXp5Q2xhc3MgKyAnXCIgJyArIHNyY1R5cGUgKyAnPVwiJyArIHBhdGggKyAnXCI+PC9kaXY+Jztcblx0XHRcdFx0fSBlbHNlIHtcblx0XHRcdFx0XHR0bkxpbmsgPSAnPGRpdiBjbGFzcz1cIm93bC12aWRlby10blwiIHN0eWxlPVwib3BhY2l0eToxO2JhY2tncm91bmQtaW1hZ2U6dXJsKCcgKyBwYXRoICsgJylcIj48L2Rpdj4nO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHRhcmdldC5hZnRlcih0bkxpbmspO1xuXHRcdFx0XHR0YXJnZXQuYWZ0ZXIoaWNvbik7XG5cdFx0XHR9O1xuXG5cdFx0Ly8gd3JhcCB2aWRlbyBjb250ZW50IGludG8gb3dsLXZpZGVvLXdyYXBwZXIgZGl2XG5cdFx0dGFyZ2V0LndyYXAoJzxkaXYgY2xhc3M9XCJvd2wtdmlkZW8td3JhcHBlclwiJyArIGRpbWVuc2lvbnMgKyAnPjwvZGl2PicpO1xuXG5cdFx0aWYgKHRoaXMuX2NvcmUuc2V0dGluZ3MubGF6eUxvYWQpIHtcblx0XHRcdHNyY1R5cGUgPSAnZGF0YS1zcmMnO1xuXHRcdFx0bGF6eUNsYXNzID0gJ293bC1sYXp5Jztcblx0XHR9XG5cblx0XHQvLyBjdXN0b20gdGh1bWJuYWlsXG5cdFx0aWYgKGN1c3RvbVRuLmxlbmd0aCkge1xuXHRcdFx0Y3JlYXRlKGN1c3RvbVRuLmF0dHIoc3JjVHlwZSkpO1xuXHRcdFx0Y3VzdG9tVG4ucmVtb3ZlKCk7XG5cdFx0XHRyZXR1cm4gZmFsc2U7XG5cdFx0fVxuXG5cdFx0aWYgKHZpZGVvLnR5cGUgPT09ICd5b3V0dWJlJykge1xuXHRcdFx0cGF0aCA9IFwiLy9pbWcueW91dHViZS5jb20vdmkvXCIgKyB2aWRlby5pZCArIFwiL2hxZGVmYXVsdC5qcGdcIjtcblx0XHRcdGNyZWF0ZShwYXRoKTtcblx0XHR9IGVsc2UgaWYgKHZpZGVvLnR5cGUgPT09ICd2aW1lbycpIHtcblx0XHRcdCQuYWpheCh7XG5cdFx0XHRcdHR5cGU6ICdHRVQnLFxuXHRcdFx0XHR1cmw6ICcvL3ZpbWVvLmNvbS9hcGkvdjIvdmlkZW8vJyArIHZpZGVvLmlkICsgJy5qc29uJyxcblx0XHRcdFx0anNvbnA6ICdjYWxsYmFjaycsXG5cdFx0XHRcdGRhdGFUeXBlOiAnanNvbnAnLFxuXHRcdFx0XHRzdWNjZXNzOiBmdW5jdGlvbihkYXRhKSB7XG5cdFx0XHRcdFx0cGF0aCA9IGRhdGFbMF0udGh1bWJuYWlsX2xhcmdlO1xuXHRcdFx0XHRcdGNyZWF0ZShwYXRoKTtcblx0XHRcdFx0fVxuXHRcdFx0fSk7XG5cdFx0fSBlbHNlIGlmICh2aWRlby50eXBlID09PSAndnphYXInKSB7XG5cdFx0XHQkLmFqYXgoe1xuXHRcdFx0XHR0eXBlOiAnR0VUJyxcblx0XHRcdFx0dXJsOiAnLy92emFhci5jb20vYXBpL3ZpZGVvcy8nICsgdmlkZW8uaWQgKyAnLmpzb24nLFxuXHRcdFx0XHRqc29ucDogJ2NhbGxiYWNrJyxcblx0XHRcdFx0ZGF0YVR5cGU6ICdqc29ucCcsXG5cdFx0XHRcdHN1Y2Nlc3M6IGZ1bmN0aW9uKGRhdGEpIHtcblx0XHRcdFx0XHRwYXRoID0gZGF0YS5mcmFtZWdyYWJfdXJsO1xuXHRcdFx0XHRcdGNyZWF0ZShwYXRoKTtcblx0XHRcdFx0fVxuXHRcdFx0fSk7XG5cdFx0fVxuXHR9O1xuXG5cdC8qKlxuXHQgKiBTdG9wcyB0aGUgY3VycmVudCB2aWRlby5cblx0ICogQHB1YmxpY1xuXHQgKi9cblx0VmlkZW8ucHJvdG90eXBlLnN0b3AgPSBmdW5jdGlvbigpIHtcblx0XHR0aGlzLl9jb3JlLnRyaWdnZXIoJ3N0b3AnLCBudWxsLCAndmlkZW8nKTtcblx0XHR0aGlzLl9wbGF5aW5nLmZpbmQoJy5vd2wtdmlkZW8tZnJhbWUnKS5yZW1vdmUoKTtcblx0XHR0aGlzLl9wbGF5aW5nLnJlbW92ZUNsYXNzKCdvd2wtdmlkZW8tcGxheWluZycpO1xuXHRcdHRoaXMuX3BsYXlpbmcgPSBudWxsO1xuXHRcdHRoaXMuX2NvcmUubGVhdmUoJ3BsYXlpbmcnKTtcblx0XHR0aGlzLl9jb3JlLnRyaWdnZXIoJ3N0b3BwZWQnLCBudWxsLCAndmlkZW8nKTtcblx0fTtcblxuXHQvKipcblx0ICogU3RhcnRzIHRoZSBjdXJyZW50IHZpZGVvLlxuXHQgKiBAcHVibGljXG5cdCAqIEBwYXJhbSB7RXZlbnR9IGV2ZW50IC0gVGhlIGV2ZW50IGFyZ3VtZW50cy5cblx0ICovXG5cdFZpZGVvLnByb3RvdHlwZS5wbGF5ID0gZnVuY3Rpb24oZXZlbnQpIHtcblx0XHR2YXIgdGFyZ2V0ID0gJChldmVudC50YXJnZXQpLFxuXHRcdFx0aXRlbSA9IHRhcmdldC5jbG9zZXN0KCcuJyArIHRoaXMuX2NvcmUuc2V0dGluZ3MuaXRlbUNsYXNzKSxcblx0XHRcdHZpZGVvID0gdGhpcy5fdmlkZW9zW2l0ZW0uYXR0cignZGF0YS12aWRlbycpXSxcblx0XHRcdHdpZHRoID0gdmlkZW8ud2lkdGggfHwgJzEwMCUnLFxuXHRcdFx0aGVpZ2h0ID0gdmlkZW8uaGVpZ2h0IHx8IHRoaXMuX2NvcmUuJHN0YWdlLmhlaWdodCgpLFxuXHRcdFx0aHRtbDtcblxuXHRcdGlmICh0aGlzLl9wbGF5aW5nKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0dGhpcy5fY29yZS5lbnRlcigncGxheWluZycpO1xuXHRcdHRoaXMuX2NvcmUudHJpZ2dlcigncGxheScsIG51bGwsICd2aWRlbycpO1xuXG5cdFx0aXRlbSA9IHRoaXMuX2NvcmUuaXRlbXModGhpcy5fY29yZS5yZWxhdGl2ZShpdGVtLmluZGV4KCkpKTtcblxuXHRcdHRoaXMuX2NvcmUucmVzZXQoaXRlbS5pbmRleCgpKTtcblxuXHRcdGlmICh2aWRlby50eXBlID09PSAneW91dHViZScpIHtcblx0XHRcdGh0bWwgPSAnPGlmcmFtZSB3aWR0aD1cIicgKyB3aWR0aCArICdcIiBoZWlnaHQ9XCInICsgaGVpZ2h0ICsgJ1wiIHNyYz1cIi8vd3d3LnlvdXR1YmUuY29tL2VtYmVkLycgK1xuXHRcdFx0XHR2aWRlby5pZCArICc/YXV0b3BsYXk9MSZ2PScgKyB2aWRlby5pZCArICdcIiBmcmFtZWJvcmRlcj1cIjBcIiBhbGxvd2Z1bGxzY3JlZW4+PC9pZnJhbWU+Jztcblx0XHR9IGVsc2UgaWYgKHZpZGVvLnR5cGUgPT09ICd2aW1lbycpIHtcblx0XHRcdGh0bWwgPSAnPGlmcmFtZSBzcmM9XCIvL3BsYXllci52aW1lby5jb20vdmlkZW8vJyArIHZpZGVvLmlkICtcblx0XHRcdFx0Jz9hdXRvcGxheT0xXCIgd2lkdGg9XCInICsgd2lkdGggKyAnXCIgaGVpZ2h0PVwiJyArIGhlaWdodCArXG5cdFx0XHRcdCdcIiBmcmFtZWJvcmRlcj1cIjBcIiB3ZWJraXRhbGxvd2Z1bGxzY3JlZW4gbW96YWxsb3dmdWxsc2NyZWVuIGFsbG93ZnVsbHNjcmVlbj48L2lmcmFtZT4nO1xuXHRcdH0gZWxzZSBpZiAodmlkZW8udHlwZSA9PT0gJ3Z6YWFyJykge1xuXHRcdFx0aHRtbCA9ICc8aWZyYW1lIGZyYW1lYm9yZGVyPVwiMFwiJyArICdoZWlnaHQ9XCInICsgaGVpZ2h0ICsgJ1wiJyArICd3aWR0aD1cIicgKyB3aWR0aCArXG5cdFx0XHRcdCdcIiBhbGxvd2Z1bGxzY3JlZW4gbW96YWxsb3dmdWxsc2NyZWVuIHdlYmtpdEFsbG93RnVsbFNjcmVlbiAnICtcblx0XHRcdFx0J3NyYz1cIi8vdmlldy52emFhci5jb20vJyArIHZpZGVvLmlkICsgJy9wbGF5ZXI/YXV0b3BsYXk9dHJ1ZVwiPjwvaWZyYW1lPic7XG5cdFx0fVxuXG5cdFx0JCgnPGRpdiBjbGFzcz1cIm93bC12aWRlby1mcmFtZVwiPicgKyBodG1sICsgJzwvZGl2PicpLmluc2VydEFmdGVyKGl0ZW0uZmluZCgnLm93bC12aWRlbycpKTtcblxuXHRcdHRoaXMuX3BsYXlpbmcgPSBpdGVtLmFkZENsYXNzKCdvd2wtdmlkZW8tcGxheWluZycpO1xuXHR9O1xuXG5cdC8qKlxuXHQgKiBDaGVja3Mgd2hldGhlciBhbiB2aWRlbyBpcyBjdXJyZW50bHkgaW4gZnVsbCBzY3JlZW4gbW9kZSBvciBub3QuXG5cdCAqIEB0b2RvIEJhZCBzdHlsZSBiZWNhdXNlIGxvb2tzIGxpa2UgYSByZWFkb25seSBtZXRob2QgYnV0IGNoYW5nZXMgbWVtYmVycy5cblx0ICogQHByb3RlY3RlZFxuXHQgKiBAcmV0dXJucyB7Qm9vbGVhbn1cblx0ICovXG5cdFZpZGVvLnByb3RvdHlwZS5pc0luRnVsbFNjcmVlbiA9IGZ1bmN0aW9uKCkge1xuXHRcdHZhciBlbGVtZW50ID0gZG9jdW1lbnQuZnVsbHNjcmVlbkVsZW1lbnQgfHwgZG9jdW1lbnQubW96RnVsbFNjcmVlbkVsZW1lbnQgfHxcblx0XHRcdFx0ZG9jdW1lbnQud2Via2l0RnVsbHNjcmVlbkVsZW1lbnQ7XG5cblx0XHRyZXR1cm4gZWxlbWVudCAmJiAkKGVsZW1lbnQpLnBhcmVudCgpLmhhc0NsYXNzKCdvd2wtdmlkZW8tZnJhbWUnKTtcblx0fTtcblxuXHQvKipcblx0ICogRGVzdHJveXMgdGhlIHBsdWdpbi5cblx0ICovXG5cdFZpZGVvLnByb3RvdHlwZS5kZXN0cm95ID0gZnVuY3Rpb24oKSB7XG5cdFx0dmFyIGhhbmRsZXIsIHByb3BlcnR5O1xuXG5cdFx0dGhpcy5fY29yZS4kZWxlbWVudC5vZmYoJ2NsaWNrLm93bC52aWRlbycpO1xuXG5cdFx0Zm9yIChoYW5kbGVyIGluIHRoaXMuX2hhbmRsZXJzKSB7XG5cdFx0XHR0aGlzLl9jb3JlLiRlbGVtZW50Lm9mZihoYW5kbGVyLCB0aGlzLl9oYW5kbGVyc1toYW5kbGVyXSk7XG5cdFx0fVxuXHRcdGZvciAocHJvcGVydHkgaW4gT2JqZWN0LmdldE93blByb3BlcnR5TmFtZXModGhpcykpIHtcblx0XHRcdHR5cGVvZiB0aGlzW3Byb3BlcnR5XSAhPSAnZnVuY3Rpb24nICYmICh0aGlzW3Byb3BlcnR5XSA9IG51bGwpO1xuXHRcdH1cblx0fTtcblxuXHQkLmZuLm93bENhcm91c2VsLkNvbnN0cnVjdG9yLlBsdWdpbnMuVmlkZW8gPSBWaWRlbztcblxufSkod2luZG93LlplcHRvIHx8IHdpbmRvdy5qUXVlcnksIHdpbmRvdywgZG9jdW1lbnQpO1xuXG4vKipcbiAqIEFuaW1hdGUgUGx1Z2luXG4gKiBAdmVyc2lvbiAyLjEuMFxuICogQGF1dGhvciBCYXJ0b3N6IFdvamNpZWNob3dza2lcbiAqIEBhdXRob3IgRGF2aWQgRGV1dHNjaFxuICogQGxpY2Vuc2UgVGhlIE1JVCBMaWNlbnNlIChNSVQpXG4gKi9cbjsoZnVuY3Rpb24oJCwgd2luZG93LCBkb2N1bWVudCwgdW5kZWZpbmVkKSB7XG5cblx0LyoqXG5cdCAqIENyZWF0ZXMgdGhlIGFuaW1hdGUgcGx1Z2luLlxuXHQgKiBAY2xhc3MgVGhlIE5hdmlnYXRpb24gUGx1Z2luXG5cdCAqIEBwYXJhbSB7T3dsfSBzY29wZSAtIFRoZSBPd2wgQ2Fyb3VzZWxcblx0ICovXG5cdHZhciBBbmltYXRlID0gZnVuY3Rpb24oc2NvcGUpIHtcblx0XHR0aGlzLmNvcmUgPSBzY29wZTtcblx0XHR0aGlzLmNvcmUub3B0aW9ucyA9ICQuZXh0ZW5kKHt9LCBBbmltYXRlLkRlZmF1bHRzLCB0aGlzLmNvcmUub3B0aW9ucyk7XG5cdFx0dGhpcy5zd2FwcGluZyA9IHRydWU7XG5cdFx0dGhpcy5wcmV2aW91cyA9IHVuZGVmaW5lZDtcblx0XHR0aGlzLm5leHQgPSB1bmRlZmluZWQ7XG5cblx0XHR0aGlzLmhhbmRsZXJzID0ge1xuXHRcdFx0J2NoYW5nZS5vd2wuY2Fyb3VzZWwnOiAkLnByb3h5KGZ1bmN0aW9uKGUpIHtcblx0XHRcdFx0aWYgKGUubmFtZXNwYWNlICYmIGUucHJvcGVydHkubmFtZSA9PSAncG9zaXRpb24nKSB7XG5cdFx0XHRcdFx0dGhpcy5wcmV2aW91cyA9IHRoaXMuY29yZS5jdXJyZW50KCk7XG5cdFx0XHRcdFx0dGhpcy5uZXh0ID0gZS5wcm9wZXJ0eS52YWx1ZTtcblx0XHRcdFx0fVxuXHRcdFx0fSwgdGhpcyksXG5cdFx0XHQnZHJhZy5vd2wuY2Fyb3VzZWwgZHJhZ2dlZC5vd2wuY2Fyb3VzZWwgdHJhbnNsYXRlZC5vd2wuY2Fyb3VzZWwnOiAkLnByb3h5KGZ1bmN0aW9uKGUpIHtcblx0XHRcdFx0aWYgKGUubmFtZXNwYWNlKSB7XG5cdFx0XHRcdFx0dGhpcy5zd2FwcGluZyA9IGUudHlwZSA9PSAndHJhbnNsYXRlZCc7XG5cdFx0XHRcdH1cblx0XHRcdH0sIHRoaXMpLFxuXHRcdFx0J3RyYW5zbGF0ZS5vd2wuY2Fyb3VzZWwnOiAkLnByb3h5KGZ1bmN0aW9uKGUpIHtcblx0XHRcdFx0aWYgKGUubmFtZXNwYWNlICYmIHRoaXMuc3dhcHBpbmcgJiYgKHRoaXMuY29yZS5vcHRpb25zLmFuaW1hdGVPdXQgfHwgdGhpcy5jb3JlLm9wdGlvbnMuYW5pbWF0ZUluKSkge1xuXHRcdFx0XHRcdHRoaXMuc3dhcCgpO1xuXHRcdFx0XHR9XG5cdFx0XHR9LCB0aGlzKVxuXHRcdH07XG5cblx0XHR0aGlzLmNvcmUuJGVsZW1lbnQub24odGhpcy5oYW5kbGVycyk7XG5cdH07XG5cblx0LyoqXG5cdCAqIERlZmF1bHQgb3B0aW9ucy5cblx0ICogQHB1YmxpY1xuXHQgKi9cblx0QW5pbWF0ZS5EZWZhdWx0cyA9IHtcblx0XHRhbmltYXRlT3V0OiBmYWxzZSxcblx0XHRhbmltYXRlSW46IGZhbHNlXG5cdH07XG5cblx0LyoqXG5cdCAqIFRvZ2dsZXMgdGhlIGFuaW1hdGlvbiBjbGFzc2VzIHdoZW5ldmVyIGFuIHRyYW5zbGF0aW9ucyBzdGFydHMuXG5cdCAqIEBwcm90ZWN0ZWRcblx0ICogQHJldHVybnMge0Jvb2xlYW58dW5kZWZpbmVkfVxuXHQgKi9cblx0QW5pbWF0ZS5wcm90b3R5cGUuc3dhcCA9IGZ1bmN0aW9uKCkge1xuXG5cdFx0aWYgKHRoaXMuY29yZS5zZXR0aW5ncy5pdGVtcyAhPT0gMSkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdGlmICghJC5zdXBwb3J0LmFuaW1hdGlvbiB8fCAhJC5zdXBwb3J0LnRyYW5zaXRpb24pIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHR0aGlzLmNvcmUuc3BlZWQoMCk7XG5cblx0XHR2YXIgbGVmdCxcblx0XHRcdGNsZWFyID0gJC5wcm94eSh0aGlzLmNsZWFyLCB0aGlzKSxcblx0XHRcdHByZXZpb3VzID0gdGhpcy5jb3JlLiRzdGFnZS5jaGlsZHJlbigpLmVxKHRoaXMucHJldmlvdXMpLFxuXHRcdFx0bmV4dCA9IHRoaXMuY29yZS4kc3RhZ2UuY2hpbGRyZW4oKS5lcSh0aGlzLm5leHQpLFxuXHRcdFx0aW5jb21pbmcgPSB0aGlzLmNvcmUuc2V0dGluZ3MuYW5pbWF0ZUluLFxuXHRcdFx0b3V0Z29pbmcgPSB0aGlzLmNvcmUuc2V0dGluZ3MuYW5pbWF0ZU91dDtcblxuXHRcdGlmICh0aGlzLmNvcmUuY3VycmVudCgpID09PSB0aGlzLnByZXZpb3VzKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0aWYgKG91dGdvaW5nKSB7XG5cdFx0XHRsZWZ0ID0gdGhpcy5jb3JlLmNvb3JkaW5hdGVzKHRoaXMucHJldmlvdXMpIC0gdGhpcy5jb3JlLmNvb3JkaW5hdGVzKHRoaXMubmV4dCk7XG5cdFx0XHRwcmV2aW91cy5vbmUoJC5zdXBwb3J0LmFuaW1hdGlvbi5lbmQsIGNsZWFyKVxuXHRcdFx0XHQuY3NzKCB7ICdsZWZ0JzogbGVmdCArICdweCcgfSApXG5cdFx0XHRcdC5hZGRDbGFzcygnYW5pbWF0ZWQgb3dsLWFuaW1hdGVkLW91dCcpXG5cdFx0XHRcdC5hZGRDbGFzcyhvdXRnb2luZyk7XG5cdFx0fVxuXG5cdFx0aWYgKGluY29taW5nKSB7XG5cdFx0XHRuZXh0Lm9uZSgkLnN1cHBvcnQuYW5pbWF0aW9uLmVuZCwgY2xlYXIpXG5cdFx0XHRcdC5hZGRDbGFzcygnYW5pbWF0ZWQgb3dsLWFuaW1hdGVkLWluJylcblx0XHRcdFx0LmFkZENsYXNzKGluY29taW5nKTtcblx0XHR9XG5cdH07XG5cblx0QW5pbWF0ZS5wcm90b3R5cGUuY2xlYXIgPSBmdW5jdGlvbihlKSB7XG5cdFx0JChlLnRhcmdldCkuY3NzKCB7ICdsZWZ0JzogJycgfSApXG5cdFx0XHQucmVtb3ZlQ2xhc3MoJ2FuaW1hdGVkIG93bC1hbmltYXRlZC1vdXQgb3dsLWFuaW1hdGVkLWluJylcblx0XHRcdC5yZW1vdmVDbGFzcyh0aGlzLmNvcmUuc2V0dGluZ3MuYW5pbWF0ZUluKVxuXHRcdFx0LnJlbW92ZUNsYXNzKHRoaXMuY29yZS5zZXR0aW5ncy5hbmltYXRlT3V0KTtcblx0XHR0aGlzLmNvcmUub25UcmFuc2l0aW9uRW5kKCk7XG5cdH07XG5cblx0LyoqXG5cdCAqIERlc3Ryb3lzIHRoZSBwbHVnaW4uXG5cdCAqIEBwdWJsaWNcblx0ICovXG5cdEFuaW1hdGUucHJvdG90eXBlLmRlc3Ryb3kgPSBmdW5jdGlvbigpIHtcblx0XHR2YXIgaGFuZGxlciwgcHJvcGVydHk7XG5cblx0XHRmb3IgKGhhbmRsZXIgaW4gdGhpcy5oYW5kbGVycykge1xuXHRcdFx0dGhpcy5jb3JlLiRlbGVtZW50Lm9mZihoYW5kbGVyLCB0aGlzLmhhbmRsZXJzW2hhbmRsZXJdKTtcblx0XHR9XG5cdFx0Zm9yIChwcm9wZXJ0eSBpbiBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyh0aGlzKSkge1xuXHRcdFx0dHlwZW9mIHRoaXNbcHJvcGVydHldICE9ICdmdW5jdGlvbicgJiYgKHRoaXNbcHJvcGVydHldID0gbnVsbCk7XG5cdFx0fVxuXHR9O1xuXG5cdCQuZm4ub3dsQ2Fyb3VzZWwuQ29uc3RydWN0b3IuUGx1Z2lucy5BbmltYXRlID0gQW5pbWF0ZTtcblxufSkod2luZG93LlplcHRvIHx8IHdpbmRvdy5qUXVlcnksIHdpbmRvdywgZG9jdW1lbnQpO1xuXG4vKipcbiAqIEF1dG9wbGF5IFBsdWdpblxuICogQHZlcnNpb24gMi4xLjBcbiAqIEBhdXRob3IgQmFydG9zeiBXb2pjaWVjaG93c2tpXG4gKiBAYXV0aG9yIEFydHVzIEtvbGFub3dza2lcbiAqIEBhdXRob3IgRGF2aWQgRGV1dHNjaFxuICogQGxpY2Vuc2UgVGhlIE1JVCBMaWNlbnNlIChNSVQpXG4gKi9cbjsoZnVuY3Rpb24oJCwgd2luZG93LCBkb2N1bWVudCwgdW5kZWZpbmVkKSB7XG5cblx0LyoqXG5cdCAqIENyZWF0ZXMgdGhlIGF1dG9wbGF5IHBsdWdpbi5cblx0ICogQGNsYXNzIFRoZSBBdXRvcGxheSBQbHVnaW5cblx0ICogQHBhcmFtIHtPd2x9IHNjb3BlIC0gVGhlIE93bCBDYXJvdXNlbFxuXHQgKi9cblx0dmFyIEF1dG9wbGF5ID0gZnVuY3Rpb24oY2Fyb3VzZWwpIHtcblx0XHQvKipcblx0XHQgKiBSZWZlcmVuY2UgdG8gdGhlIGNvcmUuXG5cdFx0ICogQHByb3RlY3RlZFxuXHRcdCAqIEB0eXBlIHtPd2x9XG5cdFx0ICovXG5cdFx0dGhpcy5fY29yZSA9IGNhcm91c2VsO1xuXG5cdFx0LyoqXG5cdFx0ICogVGhlIGF1dG9wbGF5IHRpbWVvdXQuXG5cdFx0ICogQHR5cGUge1RpbWVvdXR9XG5cdFx0ICovXG5cdFx0dGhpcy5fdGltZW91dCA9IG51bGw7XG5cblx0XHQvKipcblx0XHQgKiBJbmRpY2F0ZXMgd2hlbmV2ZXIgdGhlIGF1dG9wbGF5IGlzIHBhdXNlZC5cblx0XHQgKiBAdHlwZSB7Qm9vbGVhbn1cblx0XHQgKi9cblx0XHR0aGlzLl9wYXVzZWQgPSBmYWxzZTtcblxuXHRcdC8qKlxuXHRcdCAqIEFsbCBldmVudCBoYW5kbGVycy5cblx0XHQgKiBAcHJvdGVjdGVkXG5cdFx0ICogQHR5cGUge09iamVjdH1cblx0XHQgKi9cblx0XHR0aGlzLl9oYW5kbGVycyA9IHtcblx0XHRcdCdjaGFuZ2VkLm93bC5jYXJvdXNlbCc6ICQucHJveHkoZnVuY3Rpb24oZSkge1xuXHRcdFx0XHRpZiAoZS5uYW1lc3BhY2UgJiYgZS5wcm9wZXJ0eS5uYW1lID09PSAnc2V0dGluZ3MnKSB7XG5cdFx0XHRcdFx0aWYgKHRoaXMuX2NvcmUuc2V0dGluZ3MuYXV0b3BsYXkpIHtcblx0XHRcdFx0XHRcdHRoaXMucGxheSgpO1xuXHRcdFx0XHRcdH0gZWxzZSB7XG5cdFx0XHRcdFx0XHR0aGlzLnN0b3AoKTtcblx0XHRcdFx0XHR9XG5cdFx0XHRcdH0gZWxzZSBpZiAoZS5uYW1lc3BhY2UgJiYgZS5wcm9wZXJ0eS5uYW1lID09PSAncG9zaXRpb24nKSB7XG5cdFx0XHRcdFx0Ly9jb25zb2xlLmxvZygncGxheT8nLCBlKTtcblx0XHRcdFx0XHRpZiAodGhpcy5fY29yZS5zZXR0aW5ncy5hdXRvcGxheSkge1xuXHRcdFx0XHRcdFx0dGhpcy5fc2V0QXV0b1BsYXlJbnRlcnZhbCgpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0fVxuXHRcdFx0fSwgdGhpcyksXG5cdFx0XHQnaW5pdGlhbGl6ZWQub3dsLmNhcm91c2VsJzogJC5wcm94eShmdW5jdGlvbihlKSB7XG5cdFx0XHRcdGlmIChlLm5hbWVzcGFjZSAmJiB0aGlzLl9jb3JlLnNldHRpbmdzLmF1dG9wbGF5KSB7XG5cdFx0XHRcdFx0dGhpcy5wbGF5KCk7XG5cdFx0XHRcdH1cblx0XHRcdH0sIHRoaXMpLFxuXHRcdFx0J3BsYXkub3dsLmF1dG9wbGF5JzogJC5wcm94eShmdW5jdGlvbihlLCB0LCBzKSB7XG5cdFx0XHRcdGlmIChlLm5hbWVzcGFjZSkge1xuXHRcdFx0XHRcdHRoaXMucGxheSh0LCBzKTtcblx0XHRcdFx0fVxuXHRcdFx0fSwgdGhpcyksXG5cdFx0XHQnc3RvcC5vd2wuYXV0b3BsYXknOiAkLnByb3h5KGZ1bmN0aW9uKGUpIHtcblx0XHRcdFx0aWYgKGUubmFtZXNwYWNlKSB7XG5cdFx0XHRcdFx0dGhpcy5zdG9wKCk7XG5cdFx0XHRcdH1cblx0XHRcdH0sIHRoaXMpLFxuXHRcdFx0J21vdXNlb3Zlci5vd2wuYXV0b3BsYXknOiAkLnByb3h5KGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRpZiAodGhpcy5fY29yZS5zZXR0aW5ncy5hdXRvcGxheUhvdmVyUGF1c2UgJiYgdGhpcy5fY29yZS5pcygncm90YXRpbmcnKSkge1xuXHRcdFx0XHRcdHRoaXMucGF1c2UoKTtcblx0XHRcdFx0fVxuXHRcdFx0fSwgdGhpcyksXG5cdFx0XHQnbW91c2VsZWF2ZS5vd2wuYXV0b3BsYXknOiAkLnByb3h5KGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRpZiAodGhpcy5fY29yZS5zZXR0aW5ncy5hdXRvcGxheUhvdmVyUGF1c2UgJiYgdGhpcy5fY29yZS5pcygncm90YXRpbmcnKSkge1xuXHRcdFx0XHRcdHRoaXMucGxheSgpO1xuXHRcdFx0XHR9XG5cdFx0XHR9LCB0aGlzKSxcblx0XHRcdCd0b3VjaHN0YXJ0Lm93bC5jb3JlJzogJC5wcm94eShmdW5jdGlvbigpIHtcblx0XHRcdFx0aWYgKHRoaXMuX2NvcmUuc2V0dGluZ3MuYXV0b3BsYXlIb3ZlclBhdXNlICYmIHRoaXMuX2NvcmUuaXMoJ3JvdGF0aW5nJykpIHtcblx0XHRcdFx0XHR0aGlzLnBhdXNlKCk7XG5cdFx0XHRcdH1cblx0XHRcdH0sIHRoaXMpLFxuXHRcdFx0J3RvdWNoZW5kLm93bC5jb3JlJzogJC5wcm94eShmdW5jdGlvbigpIHtcblx0XHRcdFx0aWYgKHRoaXMuX2NvcmUuc2V0dGluZ3MuYXV0b3BsYXlIb3ZlclBhdXNlKSB7XG5cdFx0XHRcdFx0dGhpcy5wbGF5KCk7XG5cdFx0XHRcdH1cblx0XHRcdH0sIHRoaXMpXG5cdFx0fTtcblxuXHRcdC8vIHJlZ2lzdGVyIGV2ZW50IGhhbmRsZXJzXG5cdFx0dGhpcy5fY29yZS4kZWxlbWVudC5vbih0aGlzLl9oYW5kbGVycyk7XG5cblx0XHQvLyBzZXQgZGVmYXVsdCBvcHRpb25zXG5cdFx0dGhpcy5fY29yZS5vcHRpb25zID0gJC5leHRlbmQoe30sIEF1dG9wbGF5LkRlZmF1bHRzLCB0aGlzLl9jb3JlLm9wdGlvbnMpO1xuXHR9O1xuXG5cdC8qKlxuXHQgKiBEZWZhdWx0IG9wdGlvbnMuXG5cdCAqIEBwdWJsaWNcblx0ICovXG5cdEF1dG9wbGF5LkRlZmF1bHRzID0ge1xuXHRcdGF1dG9wbGF5OiBmYWxzZSxcblx0XHRhdXRvcGxheVRpbWVvdXQ6IDUwMDAsXG5cdFx0YXV0b3BsYXlIb3ZlclBhdXNlOiBmYWxzZSxcblx0XHRhdXRvcGxheVNwZWVkOiBmYWxzZVxuXHR9O1xuXG5cdC8qKlxuXHQgKiBTdGFydHMgdGhlIGF1dG9wbGF5LlxuXHQgKiBAcHVibGljXG5cdCAqIEBwYXJhbSB7TnVtYmVyfSBbdGltZW91dF0gLSBUaGUgaW50ZXJ2YWwgYmVmb3JlIHRoZSBuZXh0IGFuaW1hdGlvbiBzdGFydHMuXG5cdCAqIEBwYXJhbSB7TnVtYmVyfSBbc3BlZWRdIC0gVGhlIGFuaW1hdGlvbiBzcGVlZCBmb3IgdGhlIGFuaW1hdGlvbnMuXG5cdCAqL1xuXHRBdXRvcGxheS5wcm90b3R5cGUucGxheSA9IGZ1bmN0aW9uKHRpbWVvdXQsIHNwZWVkKSB7XG5cdFx0dGhpcy5fcGF1c2VkID0gZmFsc2U7XG5cblx0XHRpZiAodGhpcy5fY29yZS5pcygncm90YXRpbmcnKSkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblxuXHRcdHRoaXMuX2NvcmUuZW50ZXIoJ3JvdGF0aW5nJyk7XG5cblx0XHR0aGlzLl9zZXRBdXRvUGxheUludGVydmFsKCk7XG5cdH07XG5cblx0LyoqXG5cdCAqIEdldHMgYSBuZXcgdGltZW91dFxuXHQgKiBAcHJpdmF0ZVxuXHQgKiBAcGFyYW0ge051bWJlcn0gW3RpbWVvdXRdIC0gVGhlIGludGVydmFsIGJlZm9yZSB0aGUgbmV4dCBhbmltYXRpb24gc3RhcnRzLlxuXHQgKiBAcGFyYW0ge051bWJlcn0gW3NwZWVkXSAtIFRoZSBhbmltYXRpb24gc3BlZWQgZm9yIHRoZSBhbmltYXRpb25zLlxuXHQgKiBAcmV0dXJuIHtUaW1lb3V0fVxuXHQgKi9cblx0QXV0b3BsYXkucHJvdG90eXBlLl9nZXROZXh0VGltZW91dCA9IGZ1bmN0aW9uKHRpbWVvdXQsIHNwZWVkKSB7XG5cdFx0aWYgKCB0aGlzLl90aW1lb3V0ICkge1xuXHRcdFx0d2luZG93LmNsZWFyVGltZW91dCh0aGlzLl90aW1lb3V0KTtcblx0XHR9XG5cdFx0cmV0dXJuIHdpbmRvdy5zZXRUaW1lb3V0KCQucHJveHkoZnVuY3Rpb24oKSB7XG5cdFx0XHRpZiAodGhpcy5fcGF1c2VkIHx8IHRoaXMuX2NvcmUuaXMoJ2J1c3knKSB8fCB0aGlzLl9jb3JlLmlzKCdpbnRlcmFjdGluZycpIHx8IGRvY3VtZW50LmhpZGRlbikge1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cdFx0XHR0aGlzLl9jb3JlLm5leHQoc3BlZWQgfHwgdGhpcy5fY29yZS5zZXR0aW5ncy5hdXRvcGxheVNwZWVkKTtcblx0XHR9LCB0aGlzKSwgdGltZW91dCB8fCB0aGlzLl9jb3JlLnNldHRpbmdzLmF1dG9wbGF5VGltZW91dCk7XG5cdH07XG5cblx0LyoqXG5cdCAqIFNldHMgYXV0b3BsYXkgaW4gbW90aW9uLlxuXHQgKiBAcHJpdmF0ZVxuXHQgKi9cblx0QXV0b3BsYXkucHJvdG90eXBlLl9zZXRBdXRvUGxheUludGVydmFsID0gZnVuY3Rpb24oKSB7XG5cdFx0dGhpcy5fdGltZW91dCA9IHRoaXMuX2dldE5leHRUaW1lb3V0KCk7XG5cdH07XG5cblx0LyoqXG5cdCAqIFN0b3BzIHRoZSBhdXRvcGxheS5cblx0ICogQHB1YmxpY1xuXHQgKi9cblx0QXV0b3BsYXkucHJvdG90eXBlLnN0b3AgPSBmdW5jdGlvbigpIHtcblx0XHRpZiAoIXRoaXMuX2NvcmUuaXMoJ3JvdGF0aW5nJykpIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cblx0XHR3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuX3RpbWVvdXQpO1xuXHRcdHRoaXMuX2NvcmUubGVhdmUoJ3JvdGF0aW5nJyk7XG5cdH07XG5cblx0LyoqXG5cdCAqIFN0b3BzIHRoZSBhdXRvcGxheS5cblx0ICogQHB1YmxpY1xuXHQgKi9cblx0QXV0b3BsYXkucHJvdG90eXBlLnBhdXNlID0gZnVuY3Rpb24oKSB7XG5cdFx0aWYgKCF0aGlzLl9jb3JlLmlzKCdyb3RhdGluZycpKSB7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXG5cdFx0dGhpcy5fcGF1c2VkID0gdHJ1ZTtcblx0fTtcblxuXHQvKipcblx0ICogRGVzdHJveXMgdGhlIHBsdWdpbi5cblx0ICovXG5cdEF1dG9wbGF5LnByb3RvdHlwZS5kZXN0cm95ID0gZnVuY3Rpb24oKSB7XG5cdFx0dmFyIGhhbmRsZXIsIHByb3BlcnR5O1xuXG5cdFx0dGhpcy5zdG9wKCk7XG5cblx0XHRmb3IgKGhhbmRsZXIgaW4gdGhpcy5faGFuZGxlcnMpIHtcblx0XHRcdHRoaXMuX2NvcmUuJGVsZW1lbnQub2ZmKGhhbmRsZXIsIHRoaXMuX2hhbmRsZXJzW2hhbmRsZXJdKTtcblx0XHR9XG5cdFx0Zm9yIChwcm9wZXJ0eSBpbiBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyh0aGlzKSkge1xuXHRcdFx0dHlwZW9mIHRoaXNbcHJvcGVydHldICE9ICdmdW5jdGlvbicgJiYgKHRoaXNbcHJvcGVydHldID0gbnVsbCk7XG5cdFx0fVxuXHR9O1xuXG5cdCQuZm4ub3dsQ2Fyb3VzZWwuQ29uc3RydWN0b3IuUGx1Z2lucy5hdXRvcGxheSA9IEF1dG9wbGF5O1xuXG59KSh3aW5kb3cuWmVwdG8gfHwgd2luZG93LmpRdWVyeSwgd2luZG93LCBkb2N1bWVudCk7XG5cbi8qKlxuICogTmF2aWdhdGlvbiBQbHVnaW5cbiAqIEB2ZXJzaW9uIDIuMS4wXG4gKiBAYXV0aG9yIEFydHVzIEtvbGFub3dza2lcbiAqIEBhdXRob3IgRGF2aWQgRGV1dHNjaFxuICogQGxpY2Vuc2UgVGhlIE1JVCBMaWNlbnNlIChNSVQpXG4gKi9cbjsoZnVuY3Rpb24oJCwgd2luZG93LCBkb2N1bWVudCwgdW5kZWZpbmVkKSB7XG5cdCd1c2Ugc3RyaWN0JztcblxuXHQvKipcblx0ICogQ3JlYXRlcyB0aGUgbmF2aWdhdGlvbiBwbHVnaW4uXG5cdCAqIEBjbGFzcyBUaGUgTmF2aWdhdGlvbiBQbHVnaW5cblx0ICogQHBhcmFtIHtPd2x9IGNhcm91c2VsIC0gVGhlIE93bCBDYXJvdXNlbC5cblx0ICovXG5cdHZhciBOYXZpZ2F0aW9uID0gZnVuY3Rpb24oY2Fyb3VzZWwpIHtcblx0XHQvKipcblx0XHQgKiBSZWZlcmVuY2UgdG8gdGhlIGNvcmUuXG5cdFx0ICogQHByb3RlY3RlZFxuXHRcdCAqIEB0eXBlIHtPd2x9XG5cdFx0ICovXG5cdFx0dGhpcy5fY29yZSA9IGNhcm91c2VsO1xuXG5cdFx0LyoqXG5cdFx0ICogSW5kaWNhdGVzIHdoZXRoZXIgdGhlIHBsdWdpbiBpcyBpbml0aWFsaXplZCBvciBub3QuXG5cdFx0ICogQHByb3RlY3RlZFxuXHRcdCAqIEB0eXBlIHtCb29sZWFufVxuXHRcdCAqL1xuXHRcdHRoaXMuX2luaXRpYWxpemVkID0gZmFsc2U7XG5cblx0XHQvKipcblx0XHQgKiBUaGUgY3VycmVudCBwYWdpbmcgaW5kZXhlcy5cblx0XHQgKiBAcHJvdGVjdGVkXG5cdFx0ICogQHR5cGUge0FycmF5fVxuXHRcdCAqL1xuXHRcdHRoaXMuX3BhZ2VzID0gW107XG5cblx0XHQvKipcblx0XHQgKiBBbGwgRE9NIGVsZW1lbnRzIG9mIHRoZSB1c2VyIGludGVyZmFjZS5cblx0XHQgKiBAcHJvdGVjdGVkXG5cdFx0ICogQHR5cGUge09iamVjdH1cblx0XHQgKi9cblx0XHR0aGlzLl9jb250cm9scyA9IHt9O1xuXG5cdFx0LyoqXG5cdFx0ICogTWFya3VwIGZvciBhbiBpbmRpY2F0b3IuXG5cdFx0ICogQHByb3RlY3RlZFxuXHRcdCAqIEB0eXBlIHtBcnJheS48U3RyaW5nPn1cblx0XHQgKi9cblx0XHR0aGlzLl90ZW1wbGF0ZXMgPSBbXTtcblxuXHRcdC8qKlxuXHRcdCAqIFRoZSBjYXJvdXNlbCBlbGVtZW50LlxuXHRcdCAqIEB0eXBlIHtqUXVlcnl9XG5cdFx0ICovXG5cdFx0dGhpcy4kZWxlbWVudCA9IHRoaXMuX2NvcmUuJGVsZW1lbnQ7XG5cblx0XHQvKipcblx0XHQgKiBPdmVycmlkZGVuIG1ldGhvZHMgb2YgdGhlIGNhcm91c2VsLlxuXHRcdCAqIEBwcm90ZWN0ZWRcblx0XHQgKiBAdHlwZSB7T2JqZWN0fVxuXHRcdCAqL1xuXHRcdHRoaXMuX292ZXJyaWRlcyA9IHtcblx0XHRcdG5leHQ6IHRoaXMuX2NvcmUubmV4dCxcblx0XHRcdHByZXY6IHRoaXMuX2NvcmUucHJldixcblx0XHRcdHRvOiB0aGlzLl9jb3JlLnRvXG5cdFx0fTtcblxuXHRcdC8qKlxuXHRcdCAqIEFsbCBldmVudCBoYW5kbGVycy5cblx0XHQgKiBAcHJvdGVjdGVkXG5cdFx0ICogQHR5cGUge09iamVjdH1cblx0XHQgKi9cblx0XHR0aGlzLl9oYW5kbGVycyA9IHtcblx0XHRcdCdwcmVwYXJlZC5vd2wuY2Fyb3VzZWwnOiAkLnByb3h5KGZ1bmN0aW9uKGUpIHtcblx0XHRcdFx0aWYgKGUubmFtZXNwYWNlICYmIHRoaXMuX2NvcmUuc2V0dGluZ3MuZG90c0RhdGEpIHtcblx0XHRcdFx0XHR0aGlzLl90ZW1wbGF0ZXMucHVzaCgnPGRpdiBjbGFzcz1cIicgKyB0aGlzLl9jb3JlLnNldHRpbmdzLmRvdENsYXNzICsgJ1wiPicgK1xuXHRcdFx0XHRcdFx0JChlLmNvbnRlbnQpLmZpbmQoJ1tkYXRhLWRvdF0nKS5hZGRCYWNrKCdbZGF0YS1kb3RdJykuYXR0cignZGF0YS1kb3QnKSArICc8L2Rpdj4nKTtcblx0XHRcdFx0fVxuXHRcdFx0fSwgdGhpcyksXG5cdFx0XHQnYWRkZWQub3dsLmNhcm91c2VsJzogJC5wcm94eShmdW5jdGlvbihlKSB7XG5cdFx0XHRcdGlmIChlLm5hbWVzcGFjZSAmJiB0aGlzLl9jb3JlLnNldHRpbmdzLmRvdHNEYXRhKSB7XG5cdFx0XHRcdFx0dGhpcy5fdGVtcGxhdGVzLnNwbGljZShlLnBvc2l0aW9uLCAwLCB0aGlzLl90ZW1wbGF0ZXMucG9wKCkpO1xuXHRcdFx0XHR9XG5cdFx0XHR9LCB0aGlzKSxcblx0XHRcdCdyZW1vdmUub3dsLmNhcm91c2VsJzogJC5wcm94eShmdW5jdGlvbihlKSB7XG5cdFx0XHRcdGlmIChlLm5hbWVzcGFjZSAmJiB0aGlzLl9jb3JlLnNldHRpbmdzLmRvdHNEYXRhKSB7XG5cdFx0XHRcdFx0dGhpcy5fdGVtcGxhdGVzLnNwbGljZShlLnBvc2l0aW9uLCAxKTtcblx0XHRcdFx0fVxuXHRcdFx0fSwgdGhpcyksXG5cdFx0XHQnY2hhbmdlZC5vd2wuY2Fyb3VzZWwnOiAkLnByb3h5KGZ1bmN0aW9uKGUpIHtcblx0XHRcdFx0aWYgKGUubmFtZXNwYWNlICYmIGUucHJvcGVydHkubmFtZSA9PSAncG9zaXRpb24nKSB7XG5cdFx0XHRcdFx0dGhpcy5kcmF3KCk7XG5cdFx0XHRcdH1cblx0XHRcdH0sIHRoaXMpLFxuXHRcdFx0J2luaXRpYWxpemVkLm93bC5jYXJvdXNlbCc6ICQucHJveHkoZnVuY3Rpb24oZSkge1xuXHRcdFx0XHRpZiAoZS5uYW1lc3BhY2UgJiYgIXRoaXMuX2luaXRpYWxpemVkKSB7XG5cdFx0XHRcdFx0dGhpcy5fY29yZS50cmlnZ2VyKCdpbml0aWFsaXplJywgbnVsbCwgJ25hdmlnYXRpb24nKTtcblx0XHRcdFx0XHR0aGlzLmluaXRpYWxpemUoKTtcblx0XHRcdFx0XHR0aGlzLnVwZGF0ZSgpO1xuXHRcdFx0XHRcdHRoaXMuZHJhdygpO1xuXHRcdFx0XHRcdHRoaXMuX2luaXRpYWxpemVkID0gdHJ1ZTtcblx0XHRcdFx0XHR0aGlzLl9jb3JlLnRyaWdnZXIoJ2luaXRpYWxpemVkJywgbnVsbCwgJ25hdmlnYXRpb24nKTtcblx0XHRcdFx0fVxuXHRcdFx0fSwgdGhpcyksXG5cdFx0XHQncmVmcmVzaGVkLm93bC5jYXJvdXNlbCc6ICQucHJveHkoZnVuY3Rpb24oZSkge1xuXHRcdFx0XHRpZiAoZS5uYW1lc3BhY2UgJiYgdGhpcy5faW5pdGlhbGl6ZWQpIHtcblx0XHRcdFx0XHR0aGlzLl9jb3JlLnRyaWdnZXIoJ3JlZnJlc2gnLCBudWxsLCAnbmF2aWdhdGlvbicpO1xuXHRcdFx0XHRcdHRoaXMudXBkYXRlKCk7XG5cdFx0XHRcdFx0dGhpcy5kcmF3KCk7XG5cdFx0XHRcdFx0dGhpcy5fY29yZS50cmlnZ2VyKCdyZWZyZXNoZWQnLCBudWxsLCAnbmF2aWdhdGlvbicpO1xuXHRcdFx0XHR9XG5cdFx0XHR9LCB0aGlzKVxuXHRcdH07XG5cblx0XHQvLyBzZXQgZGVmYXVsdCBvcHRpb25zXG5cdFx0dGhpcy5fY29yZS5vcHRpb25zID0gJC5leHRlbmQoe30sIE5hdmlnYXRpb24uRGVmYXVsdHMsIHRoaXMuX2NvcmUub3B0aW9ucyk7XG5cblx0XHQvLyByZWdpc3RlciBldmVudCBoYW5kbGVyc1xuXHRcdHRoaXMuJGVsZW1lbnQub24odGhpcy5faGFuZGxlcnMpO1xuXHR9O1xuXG5cdC8qKlxuXHQgKiBEZWZhdWx0IG9wdGlvbnMuXG5cdCAqIEBwdWJsaWNcblx0ICogQHRvZG8gUmVuYW1lIGBzbGlkZUJ5YCB0byBgbmF2QnlgXG5cdCAqL1xuXHROYXZpZ2F0aW9uLkRlZmF1bHRzID0ge1xuXHRcdG5hdjogZmFsc2UsXG5cdFx0bmF2VGV4dDogWyAncHJldicsICduZXh0JyBdLFxuXHRcdG5hdlNwZWVkOiBmYWxzZSxcblx0XHRuYXZFbGVtZW50OiAnZGl2Jyxcblx0XHRuYXZDb250YWluZXI6IGZhbHNlLFxuXHRcdG5hdkNvbnRhaW5lckNsYXNzOiAnb3dsLW5hdicsXG5cdFx0bmF2Q2xhc3M6IFsgJ293bC1wcmV2JywgJ293bC1uZXh0JyBdLFxuXHRcdHNsaWRlQnk6IDEsXG5cdFx0ZG90Q2xhc3M6ICdvd2wtZG90Jyxcblx0XHRkb3RzQ2xhc3M6ICdvd2wtZG90cycsXG5cdFx0ZG90czogdHJ1ZSxcblx0XHRkb3RzRWFjaDogZmFsc2UsXG5cdFx0ZG90c0RhdGE6IGZhbHNlLFxuXHRcdGRvdHNTcGVlZDogZmFsc2UsXG5cdFx0ZG90c0NvbnRhaW5lcjogZmFsc2Vcblx0fTtcblxuXHQvKipcblx0ICogSW5pdGlhbGl6ZXMgdGhlIGxheW91dCBvZiB0aGUgcGx1Z2luIGFuZCBleHRlbmRzIHRoZSBjYXJvdXNlbC5cblx0ICogQHByb3RlY3RlZFxuXHQgKi9cblx0TmF2aWdhdGlvbi5wcm90b3R5cGUuaW5pdGlhbGl6ZSA9IGZ1bmN0aW9uKCkge1xuXHRcdHZhciBvdmVycmlkZSxcblx0XHRcdHNldHRpbmdzID0gdGhpcy5fY29yZS5zZXR0aW5ncztcblxuXHRcdC8vIGNyZWF0ZSBET00gc3RydWN0dXJlIGZvciByZWxhdGl2ZSBuYXZpZ2F0aW9uXG5cdFx0dGhpcy5fY29udHJvbHMuJHJlbGF0aXZlID0gKHNldHRpbmdzLm5hdkNvbnRhaW5lciA/ICQoc2V0dGluZ3MubmF2Q29udGFpbmVyKVxuXHRcdFx0OiAkKCc8ZGl2PicpLmFkZENsYXNzKHNldHRpbmdzLm5hdkNvbnRhaW5lckNsYXNzKS5hcHBlbmRUbyh0aGlzLiRlbGVtZW50KSkuYWRkQ2xhc3MoJ2Rpc2FibGVkJyk7XG5cblx0XHR0aGlzLl9jb250cm9scy4kcHJldmlvdXMgPSAkKCc8JyArIHNldHRpbmdzLm5hdkVsZW1lbnQgKyAnPicpXG5cdFx0XHQuYWRkQ2xhc3Moc2V0dGluZ3MubmF2Q2xhc3NbMF0pXG5cdFx0XHQuaHRtbChzZXR0aW5ncy5uYXZUZXh0WzBdKVxuXHRcdFx0LnByZXBlbmRUbyh0aGlzLl9jb250cm9scy4kcmVsYXRpdmUpXG5cdFx0XHQub24oJ2NsaWNrJywgJC5wcm94eShmdW5jdGlvbihlKSB7XG5cdFx0XHRcdHRoaXMucHJldihzZXR0aW5ncy5uYXZTcGVlZCk7XG5cdFx0XHR9LCB0aGlzKSk7XG5cdFx0dGhpcy5fY29udHJvbHMuJG5leHQgPSAkKCc8JyArIHNldHRpbmdzLm5hdkVsZW1lbnQgKyAnPicpXG5cdFx0XHQuYWRkQ2xhc3Moc2V0dGluZ3MubmF2Q2xhc3NbMV0pXG5cdFx0XHQuaHRtbChzZXR0aW5ncy5uYXZUZXh0WzFdKVxuXHRcdFx0LmFwcGVuZFRvKHRoaXMuX2NvbnRyb2xzLiRyZWxhdGl2ZSlcblx0XHRcdC5vbignY2xpY2snLCAkLnByb3h5KGZ1bmN0aW9uKGUpIHtcblx0XHRcdFx0dGhpcy5uZXh0KHNldHRpbmdzLm5hdlNwZWVkKTtcblx0XHRcdH0sIHRoaXMpKTtcblxuXHRcdC8vIGNyZWF0ZSBET00gc3RydWN0dXJlIGZvciBhYnNvbHV0ZSBuYXZpZ2F0aW9uXG5cdFx0aWYgKCFzZXR0aW5ncy5kb3RzRGF0YSkge1xuXHRcdFx0dGhpcy5fdGVtcGxhdGVzID0gWyAkKCc8ZGl2PicpXG5cdFx0XHRcdC5hZGRDbGFzcyhzZXR0aW5ncy5kb3RDbGFzcylcblx0XHRcdFx0LmFwcGVuZCgkKCc8c3Bhbj4nKSlcblx0XHRcdFx0LnByb3AoJ291dGVySFRNTCcpIF07XG5cdFx0fVxuXG5cdFx0dGhpcy5fY29udHJvbHMuJGFic29sdXRlID0gKHNldHRpbmdzLmRvdHNDb250YWluZXIgPyAkKHNldHRpbmdzLmRvdHNDb250YWluZXIpXG5cdFx0XHQ6ICQoJzxkaXY+JykuYWRkQ2xhc3Moc2V0dGluZ3MuZG90c0NsYXNzKS5hcHBlbmRUbyh0aGlzLiRlbGVtZW50KSkuYWRkQ2xhc3MoJ2Rpc2FibGVkJyk7XG5cblx0XHR0aGlzLl9jb250cm9scy4kYWJzb2x1dGUub24oJ2NsaWNrJywgJ2RpdicsICQucHJveHkoZnVuY3Rpb24oZSkge1xuXHRcdFx0dmFyIGluZGV4ID0gJChlLnRhcmdldCkucGFyZW50KCkuaXModGhpcy5fY29udHJvbHMuJGFic29sdXRlKVxuXHRcdFx0XHQ/ICQoZS50YXJnZXQpLmluZGV4KCkgOiAkKGUudGFyZ2V0KS5wYXJlbnQoKS5pbmRleCgpO1xuXG5cdFx0XHRlLnByZXZlbnREZWZhdWx0KCk7XG5cblx0XHRcdHRoaXMudG8oaW5kZXgsIHNldHRpbmdzLmRvdHNTcGVlZCk7XG5cdFx0fSwgdGhpcykpO1xuXG5cdFx0Ly8gb3ZlcnJpZGUgcHVibGljIG1ldGhvZHMgb2YgdGhlIGNhcm91c2VsXG5cdFx0Zm9yIChvdmVycmlkZSBpbiB0aGlzLl9vdmVycmlkZXMpIHtcblx0XHRcdHRoaXMuX2NvcmVbb3ZlcnJpZGVdID0gJC5wcm94eSh0aGlzW292ZXJyaWRlXSwgdGhpcyk7XG5cdFx0fVxuXHR9O1xuXG5cdC8qKlxuXHQgKiBEZXN0cm95cyB0aGUgcGx1Z2luLlxuXHQgKiBAcHJvdGVjdGVkXG5cdCAqL1xuXHROYXZpZ2F0aW9uLnByb3RvdHlwZS5kZXN0cm95ID0gZnVuY3Rpb24oKSB7XG5cdFx0dmFyIGhhbmRsZXIsIGNvbnRyb2wsIHByb3BlcnR5LCBvdmVycmlkZTtcblxuXHRcdGZvciAoaGFuZGxlciBpbiB0aGlzLl9oYW5kbGVycykge1xuXHRcdFx0dGhpcy4kZWxlbWVudC5vZmYoaGFuZGxlciwgdGhpcy5faGFuZGxlcnNbaGFuZGxlcl0pO1xuXHRcdH1cblx0XHRmb3IgKGNvbnRyb2wgaW4gdGhpcy5fY29udHJvbHMpIHtcblx0XHRcdHRoaXMuX2NvbnRyb2xzW2NvbnRyb2xdLnJlbW92ZSgpO1xuXHRcdH1cblx0XHRmb3IgKG92ZXJyaWRlIGluIHRoaXMub3ZlcmlkZXMpIHtcblx0XHRcdHRoaXMuX2NvcmVbb3ZlcnJpZGVdID0gdGhpcy5fb3ZlcnJpZGVzW292ZXJyaWRlXTtcblx0XHR9XG5cdFx0Zm9yIChwcm9wZXJ0eSBpbiBPYmplY3QuZ2V0T3duUHJvcGVydHlOYW1lcyh0aGlzKSkge1xuXHRcdFx0dHlwZW9mIHRoaXNbcHJvcGVydHldICE9ICdmdW5jdGlvbicgJiYgKHRoaXNbcHJvcGVydHldID0gbnVsbCk7XG5cdFx0fVxuXHR9O1xuXG5cdC8qKlxuXHQgKiBVcGRhdGVzIHRoZSBpbnRlcm5hbCBzdGF0ZS5cblx0ICogQHByb3RlY3RlZFxuXHQgKi9cblx0TmF2aWdhdGlvbi5wcm90b3R5cGUudXBkYXRlID0gZnVuY3Rpb24oKSB7XG5cdFx0dmFyIGksIGosIGssXG5cdFx0XHRsb3dlciA9IHRoaXMuX2NvcmUuY2xvbmVzKCkubGVuZ3RoIC8gMixcblx0XHRcdHVwcGVyID0gbG93ZXIgKyB0aGlzLl9jb3JlLml0ZW1zKCkubGVuZ3RoLFxuXHRcdFx0bWF4aW11bSA9IHRoaXMuX2NvcmUubWF4aW11bSh0cnVlKSxcblx0XHRcdHNldHRpbmdzID0gdGhpcy5fY29yZS5zZXR0aW5ncyxcblx0XHRcdHNpemUgPSBzZXR0aW5ncy5jZW50ZXIgfHwgc2V0dGluZ3MuYXV0b1dpZHRoIHx8IHNldHRpbmdzLmRvdHNEYXRhXG5cdFx0XHRcdD8gMSA6IHNldHRpbmdzLmRvdHNFYWNoIHx8IHNldHRpbmdzLml0ZW1zO1xuXG5cdFx0aWYgKHNldHRpbmdzLnNsaWRlQnkgIT09ICdwYWdlJykge1xuXHRcdFx0c2V0dGluZ3Muc2xpZGVCeSA9IE1hdGgubWluKHNldHRpbmdzLnNsaWRlQnksIHNldHRpbmdzLml0ZW1zKTtcblx0XHR9XG5cblx0XHRpZiAoc2V0dGluZ3MuZG90cyB8fCBzZXR0aW5ncy5zbGlkZUJ5ID09ICdwYWdlJykge1xuXHRcdFx0dGhpcy5fcGFnZXMgPSBbXTtcblxuXHRcdFx0Zm9yIChpID0gbG93ZXIsIGogPSAwLCBrID0gMDsgaSA8IHVwcGVyOyBpKyspIHtcblx0XHRcdFx0aWYgKGogPj0gc2l6ZSB8fCBqID09PSAwKSB7XG5cdFx0XHRcdFx0dGhpcy5fcGFnZXMucHVzaCh7XG5cdFx0XHRcdFx0XHRzdGFydDogTWF0aC5taW4obWF4aW11bSwgaSAtIGxvd2VyKSxcblx0XHRcdFx0XHRcdGVuZDogaSAtIGxvd2VyICsgc2l6ZSAtIDFcblx0XHRcdFx0XHR9KTtcblx0XHRcdFx0XHRpZiAoTWF0aC5taW4obWF4aW11bSwgaSAtIGxvd2VyKSA9PT0gbWF4aW11bSkge1xuXHRcdFx0XHRcdFx0YnJlYWs7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdGogPSAwLCArK2s7XG5cdFx0XHRcdH1cblx0XHRcdFx0aiArPSB0aGlzLl9jb3JlLm1lcmdlcnModGhpcy5fY29yZS5yZWxhdGl2ZShpKSk7XG5cdFx0XHR9XG5cdFx0fVxuXHR9O1xuXG5cdC8qKlxuXHQgKiBEcmF3cyB0aGUgdXNlciBpbnRlcmZhY2UuXG5cdCAqIEB0b2RvIFRoZSBvcHRpb24gYGRvdHNEYXRhYCB3b250IHdvcmsuXG5cdCAqIEBwcm90ZWN0ZWRcblx0ICovXG5cdE5hdmlnYXRpb24ucHJvdG90eXBlLmRyYXcgPSBmdW5jdGlvbigpIHtcblx0XHR2YXIgZGlmZmVyZW5jZSxcblx0XHRcdHNldHRpbmdzID0gdGhpcy5fY29yZS5zZXR0aW5ncyxcblx0XHRcdGRpc2FibGVkID0gdGhpcy5fY29yZS5pdGVtcygpLmxlbmd0aCA8PSBzZXR0aW5ncy5pdGVtcyxcblx0XHRcdGluZGV4ID0gdGhpcy5fY29yZS5yZWxhdGl2ZSh0aGlzLl9jb3JlLmN1cnJlbnQoKSksXG5cdFx0XHRsb29wID0gc2V0dGluZ3MubG9vcCB8fCBzZXR0aW5ncy5yZXdpbmQ7XG5cblx0XHR0aGlzLl9jb250cm9scy4kcmVsYXRpdmUudG9nZ2xlQ2xhc3MoJ2Rpc2FibGVkJywgIXNldHRpbmdzLm5hdiB8fCBkaXNhYmxlZCk7XG5cblx0XHRpZiAoc2V0dGluZ3MubmF2KSB7XG5cdFx0XHR0aGlzLl9jb250cm9scy4kcHJldmlvdXMudG9nZ2xlQ2xhc3MoJ2Rpc2FibGVkJywgIWxvb3AgJiYgaW5kZXggPD0gdGhpcy5fY29yZS5taW5pbXVtKHRydWUpKTtcblx0XHRcdHRoaXMuX2NvbnRyb2xzLiRuZXh0LnRvZ2dsZUNsYXNzKCdkaXNhYmxlZCcsICFsb29wICYmIGluZGV4ID49IHRoaXMuX2NvcmUubWF4aW11bSh0cnVlKSk7XG5cdFx0fVxuXG5cdFx0dGhpcy5fY29udHJvbHMuJGFic29sdXRlLnRvZ2dsZUNsYXNzKCdkaXNhYmxlZCcsICFzZXR0aW5ncy5kb3RzIHx8IGRpc2FibGVkKTtcblxuXHRcdGlmIChzZXR0aW5ncy5kb3RzKSB7XG5cdFx0XHRkaWZmZXJlbmNlID0gdGhpcy5fcGFnZXMubGVuZ3RoIC0gdGhpcy5fY29udHJvbHMuJGFic29sdXRlLmNoaWxkcmVuKCkubGVuZ3RoO1xuXG5cdFx0XHRpZiAoc2V0dGluZ3MuZG90c0RhdGEgJiYgZGlmZmVyZW5jZSAhPT0gMCkge1xuXHRcdFx0XHR0aGlzLl9jb250cm9scy4kYWJzb2x1dGUuaHRtbCh0aGlzLl90ZW1wbGF0ZXMuam9pbignJykpO1xuXHRcdFx0fSBlbHNlIGlmIChkaWZmZXJlbmNlID4gMCkge1xuXHRcdFx0XHR0aGlzLl9jb250cm9scy4kYWJzb2x1dGUuYXBwZW5kKG5ldyBBcnJheShkaWZmZXJlbmNlICsgMSkuam9pbih0aGlzLl90ZW1wbGF0ZXNbMF0pKTtcblx0XHRcdH0gZWxzZSBpZiAoZGlmZmVyZW5jZSA8IDApIHtcblx0XHRcdFx0dGhpcy5fY29udHJvbHMuJGFic29sdXRlLmNoaWxkcmVuKCkuc2xpY2UoZGlmZmVyZW5jZSkucmVtb3ZlKCk7XG5cdFx0XHR9XG5cblx0XHRcdHRoaXMuX2NvbnRyb2xzLiRhYnNvbHV0ZS5maW5kKCcuYWN0aXZlJykucmVtb3ZlQ2xhc3MoJ2FjdGl2ZScpO1xuXHRcdFx0dGhpcy5fY29udHJvbHMuJGFic29sdXRlLmNoaWxkcmVuKCkuZXEoJC5pbkFycmF5KHRoaXMuY3VycmVudCgpLCB0aGlzLl9wYWdlcykpLmFkZENsYXNzKCdhY3RpdmUnKTtcblx0XHR9XG5cdH07XG5cblx0LyoqXG5cdCAqIEV4dGVuZHMgZXZlbnQgZGF0YS5cblx0ICogQHByb3RlY3RlZFxuXHQgKiBAcGFyYW0ge0V2ZW50fSBldmVudCAtIFRoZSBldmVudCBvYmplY3Qgd2hpY2ggZ2V0cyB0aHJvd24uXG5cdCAqL1xuXHROYXZpZ2F0aW9uLnByb3RvdHlwZS5vblRyaWdnZXIgPSBmdW5jdGlvbihldmVudCkge1xuXHRcdHZhciBzZXR0aW5ncyA9IHRoaXMuX2NvcmUuc2V0dGluZ3M7XG5cblx0XHRldmVudC5wYWdlID0ge1xuXHRcdFx0aW5kZXg6ICQuaW5BcnJheSh0aGlzLmN1cnJlbnQoKSwgdGhpcy5fcGFnZXMpLFxuXHRcdFx0Y291bnQ6IHRoaXMuX3BhZ2VzLmxlbmd0aCxcblx0XHRcdHNpemU6IHNldHRpbmdzICYmIChzZXR0aW5ncy5jZW50ZXIgfHwgc2V0dGluZ3MuYXV0b1dpZHRoIHx8IHNldHRpbmdzLmRvdHNEYXRhXG5cdFx0XHRcdD8gMSA6IHNldHRpbmdzLmRvdHNFYWNoIHx8IHNldHRpbmdzLml0ZW1zKVxuXHRcdH07XG5cdH07XG5cblx0LyoqXG5cdCAqIEdldHMgdGhlIGN1cnJlbnQgcGFnZSBwb3NpdGlvbiBvZiB0aGUgY2Fyb3VzZWwuXG5cdCAqIEBwcm90ZWN0ZWRcblx0ICogQHJldHVybnMge051bWJlcn1cblx0ICovXG5cdE5hdmlnYXRpb24ucHJvdG90eXBlLmN1cnJlbnQgPSBmdW5jdGlvbigpIHtcblx0XHR2YXIgY3VycmVudCA9IHRoaXMuX2NvcmUucmVsYXRpdmUodGhpcy5fY29yZS5jdXJyZW50KCkpO1xuXHRcdHJldHVybiAkLmdyZXAodGhpcy5fcGFnZXMsICQucHJveHkoZnVuY3Rpb24ocGFnZSwgaW5kZXgpIHtcblx0XHRcdHJldHVybiBwYWdlLnN0YXJ0IDw9IGN1cnJlbnQgJiYgcGFnZS5lbmQgPj0gY3VycmVudDtcblx0XHR9LCB0aGlzKSkucG9wKCk7XG5cdH07XG5cblx0LyoqXG5cdCAqIEdldHMgdGhlIGN1cnJlbnQgc3VjY2Vzb3IvcHJlZGVjZXNzb3IgcG9zaXRpb24uXG5cdCAqIEBwcm90ZWN0ZWRcblx0ICogQHJldHVybnMge051bWJlcn1cblx0ICovXG5cdE5hdmlnYXRpb24ucHJvdG90eXBlLmdldFBvc2l0aW9uID0gZnVuY3Rpb24oc3VjY2Vzc29yKSB7XG5cdFx0dmFyIHBvc2l0aW9uLCBsZW5ndGgsXG5cdFx0XHRzZXR0aW5ncyA9IHRoaXMuX2NvcmUuc2V0dGluZ3M7XG5cblx0XHRpZiAoc2V0dGluZ3Muc2xpZGVCeSA9PSAncGFnZScpIHtcblx0XHRcdHBvc2l0aW9uID0gJC5pbkFycmF5KHRoaXMuY3VycmVudCgpLCB0aGlzLl9wYWdlcyk7XG5cdFx0XHRsZW5ndGggPSB0aGlzLl9wYWdlcy5sZW5ndGg7XG5cdFx0XHRzdWNjZXNzb3IgPyArK3Bvc2l0aW9uIDogLS1wb3NpdGlvbjtcblx0XHRcdHBvc2l0aW9uID0gdGhpcy5fcGFnZXNbKChwb3NpdGlvbiAlIGxlbmd0aCkgKyBsZW5ndGgpICUgbGVuZ3RoXS5zdGFydDtcblx0XHR9IGVsc2Uge1xuXHRcdFx0cG9zaXRpb24gPSB0aGlzLl9jb3JlLnJlbGF0aXZlKHRoaXMuX2NvcmUuY3VycmVudCgpKTtcblx0XHRcdGxlbmd0aCA9IHRoaXMuX2NvcmUuaXRlbXMoKS5sZW5ndGg7XG5cdFx0XHRzdWNjZXNzb3IgPyBwb3NpdGlvbiArPSBzZXR0aW5ncy5zbGlkZUJ5IDogcG9zaXRpb24gLT0gc2V0dGluZ3Muc2xpZGVCeTtcblx0XHR9XG5cblx0XHRyZXR1cm4gcG9zaXRpb247XG5cdH07XG5cblx0LyoqXG5cdCAqIFNsaWRlcyB0byB0aGUgbmV4dCBpdGVtIG9yIHBhZ2UuXG5cdCAqIEBwdWJsaWNcblx0ICogQHBhcmFtIHtOdW1iZXJ9IFtzcGVlZD1mYWxzZV0gLSBUaGUgdGltZSBpbiBtaWxsaXNlY29uZHMgZm9yIHRoZSB0cmFuc2l0aW9uLlxuXHQgKi9cblx0TmF2aWdhdGlvbi5wcm90b3R5cGUubmV4dCA9IGZ1bmN0aW9uKHNwZWVkKSB7XG5cdFx0JC5wcm94eSh0aGlzLl9vdmVycmlkZXMudG8sIHRoaXMuX2NvcmUpKHRoaXMuZ2V0UG9zaXRpb24odHJ1ZSksIHNwZWVkKTtcblx0fTtcblxuXHQvKipcblx0ICogU2xpZGVzIHRvIHRoZSBwcmV2aW91cyBpdGVtIG9yIHBhZ2UuXG5cdCAqIEBwdWJsaWNcblx0ICogQHBhcmFtIHtOdW1iZXJ9IFtzcGVlZD1mYWxzZV0gLSBUaGUgdGltZSBpbiBtaWxsaXNlY29uZHMgZm9yIHRoZSB0cmFuc2l0aW9uLlxuXHQgKi9cblx0TmF2aWdhdGlvbi5wcm90b3R5cGUucHJldiA9IGZ1bmN0aW9uKHNwZWVkKSB7XG5cdFx0JC5wcm94eSh0aGlzLl9vdmVycmlkZXMudG8sIHRoaXMuX2NvcmUpKHRoaXMuZ2V0UG9zaXRpb24oZmFsc2UpLCBzcGVlZCk7XG5cdH07XG5cblx0LyoqXG5cdCAqIFNsaWRlcyB0byB0aGUgc3BlY2lmaWVkIGl0ZW0gb3IgcGFnZS5cblx0ICogQHB1YmxpY1xuXHQgKiBAcGFyYW0ge051bWJlcn0gcG9zaXRpb24gLSBUaGUgcG9zaXRpb24gb2YgdGhlIGl0ZW0gb3IgcGFnZS5cblx0ICogQHBhcmFtIHtOdW1iZXJ9IFtzcGVlZF0gLSBUaGUgdGltZSBpbiBtaWxsaXNlY29uZHMgZm9yIHRoZSB0cmFuc2l0aW9uLlxuXHQgKiBAcGFyYW0ge0Jvb2xlYW59IFtzdGFuZGFyZD1mYWxzZV0gLSBXaGV0aGVyIHRvIHVzZSB0aGUgc3RhbmRhcmQgYmVoYXZpb3VyIG9yIG5vdC5cblx0ICovXG5cdE5hdmlnYXRpb24ucHJvdG90eXBlLnRvID0gZnVuY3Rpb24ocG9zaXRpb24sIHNwZWVkLCBzdGFuZGFyZCkge1xuXHRcdHZhciBsZW5ndGg7XG5cblx0XHRpZiAoIXN0YW5kYXJkICYmIHRoaXMuX3BhZ2VzLmxlbmd0aCkge1xuXHRcdFx0bGVuZ3RoID0gdGhpcy5fcGFnZXMubGVuZ3RoO1xuXHRcdFx0JC5wcm94eSh0aGlzLl9vdmVycmlkZXMudG8sIHRoaXMuX2NvcmUpKHRoaXMuX3BhZ2VzWygocG9zaXRpb24gJSBsZW5ndGgpICsgbGVuZ3RoKSAlIGxlbmd0aF0uc3RhcnQsIHNwZWVkKTtcblx0XHR9IGVsc2Uge1xuXHRcdFx0JC5wcm94eSh0aGlzLl9vdmVycmlkZXMudG8sIHRoaXMuX2NvcmUpKHBvc2l0aW9uLCBzcGVlZCk7XG5cdFx0fVxuXHR9O1xuXG5cdCQuZm4ub3dsQ2Fyb3VzZWwuQ29uc3RydWN0b3IuUGx1Z2lucy5OYXZpZ2F0aW9uID0gTmF2aWdhdGlvbjtcblxufSkod2luZG93LlplcHRvIHx8IHdpbmRvdy5qUXVlcnksIHdpbmRvdywgZG9jdW1lbnQpO1xuXG4vKipcbiAqIEhhc2ggUGx1Z2luXG4gKiBAdmVyc2lvbiAyLjEuMFxuICogQGF1dGhvciBBcnR1cyBLb2xhbm93c2tpXG4gKiBAYXV0aG9yIERhdmlkIERldXRzY2hcbiAqIEBsaWNlbnNlIFRoZSBNSVQgTGljZW5zZSAoTUlUKVxuICovXG47KGZ1bmN0aW9uKCQsIHdpbmRvdywgZG9jdW1lbnQsIHVuZGVmaW5lZCkge1xuXHQndXNlIHN0cmljdCc7XG5cblx0LyoqXG5cdCAqIENyZWF0ZXMgdGhlIGhhc2ggcGx1Z2luLlxuXHQgKiBAY2xhc3MgVGhlIEhhc2ggUGx1Z2luXG5cdCAqIEBwYXJhbSB7T3dsfSBjYXJvdXNlbCAtIFRoZSBPd2wgQ2Fyb3VzZWxcblx0ICovXG5cdHZhciBIYXNoID0gZnVuY3Rpb24oY2Fyb3VzZWwpIHtcblx0XHQvKipcblx0XHQgKiBSZWZlcmVuY2UgdG8gdGhlIGNvcmUuXG5cdFx0ICogQHByb3RlY3RlZFxuXHRcdCAqIEB0eXBlIHtPd2x9XG5cdFx0ICovXG5cdFx0dGhpcy5fY29yZSA9IGNhcm91c2VsO1xuXG5cdFx0LyoqXG5cdFx0ICogSGFzaCBpbmRleCBmb3IgdGhlIGl0ZW1zLlxuXHRcdCAqIEBwcm90ZWN0ZWRcblx0XHQgKiBAdHlwZSB7T2JqZWN0fVxuXHRcdCAqL1xuXHRcdHRoaXMuX2hhc2hlcyA9IHt9O1xuXG5cdFx0LyoqXG5cdFx0ICogVGhlIGNhcm91c2VsIGVsZW1lbnQuXG5cdFx0ICogQHR5cGUge2pRdWVyeX1cblx0XHQgKi9cblx0XHR0aGlzLiRlbGVtZW50ID0gdGhpcy5fY29yZS4kZWxlbWVudDtcblxuXHRcdC8qKlxuXHRcdCAqIEFsbCBldmVudCBoYW5kbGVycy5cblx0XHQgKiBAcHJvdGVjdGVkXG5cdFx0ICogQHR5cGUge09iamVjdH1cblx0XHQgKi9cblx0XHR0aGlzLl9oYW5kbGVycyA9IHtcblx0XHRcdCdpbml0aWFsaXplZC5vd2wuY2Fyb3VzZWwnOiAkLnByb3h5KGZ1bmN0aW9uKGUpIHtcblx0XHRcdFx0aWYgKGUubmFtZXNwYWNlICYmIHRoaXMuX2NvcmUuc2V0dGluZ3Muc3RhcnRQb3NpdGlvbiA9PT0gJ1VSTEhhc2gnKSB7XG5cdFx0XHRcdFx0JCh3aW5kb3cpLnRyaWdnZXIoJ2hhc2hjaGFuZ2Uub3dsLm5hdmlnYXRpb24nKTtcblx0XHRcdFx0fVxuXHRcdFx0fSwgdGhpcyksXG5cdFx0XHQncHJlcGFyZWQub3dsLmNhcm91c2VsJzogJC5wcm94eShmdW5jdGlvbihlKSB7XG5cdFx0XHRcdGlmIChlLm5hbWVzcGFjZSkge1xuXHRcdFx0XHRcdHZhciBoYXNoID0gJChlLmNvbnRlbnQpLmZpbmQoJ1tkYXRhLWhhc2hdJykuYWRkQmFjaygnW2RhdGEtaGFzaF0nKS5hdHRyKCdkYXRhLWhhc2gnKTtcblxuXHRcdFx0XHRcdGlmICghaGFzaCkge1xuXHRcdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHRcdH1cblxuXHRcdFx0XHRcdHRoaXMuX2hhc2hlc1toYXNoXSA9IGUuY29udGVudDtcblx0XHRcdFx0fVxuXHRcdFx0fSwgdGhpcyksXG5cdFx0XHQnY2hhbmdlZC5vd2wuY2Fyb3VzZWwnOiAkLnByb3h5KGZ1bmN0aW9uKGUpIHtcblx0XHRcdFx0aWYgKGUubmFtZXNwYWNlICYmIGUucHJvcGVydHkubmFtZSA9PT0gJ3Bvc2l0aW9uJykge1xuXHRcdFx0XHRcdHZhciBjdXJyZW50ID0gdGhpcy5fY29yZS5pdGVtcyh0aGlzLl9jb3JlLnJlbGF0aXZlKHRoaXMuX2NvcmUuY3VycmVudCgpKSksXG5cdFx0XHRcdFx0XHRoYXNoID0gJC5tYXAodGhpcy5faGFzaGVzLCBmdW5jdGlvbihpdGVtLCBoYXNoKSB7XG5cdFx0XHRcdFx0XHRcdHJldHVybiBpdGVtID09PSBjdXJyZW50ID8gaGFzaCA6IG51bGw7XG5cdFx0XHRcdFx0XHR9KS5qb2luKCk7XG5cblx0XHRcdFx0XHRpZiAoIWhhc2ggfHwgd2luZG93LmxvY2F0aW9uLmhhc2guc2xpY2UoMSkgPT09IGhhc2gpIHtcblx0XHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0XHR9XG5cblx0XHRcdFx0XHR3aW5kb3cubG9jYXRpb24uaGFzaCA9IGhhc2g7XG5cdFx0XHRcdH1cblx0XHRcdH0sIHRoaXMpXG5cdFx0fTtcblxuXHRcdC8vIHNldCBkZWZhdWx0IG9wdGlvbnNcblx0XHR0aGlzLl9jb3JlLm9wdGlvbnMgPSAkLmV4dGVuZCh7fSwgSGFzaC5EZWZhdWx0cywgdGhpcy5fY29yZS5vcHRpb25zKTtcblxuXHRcdC8vIHJlZ2lzdGVyIHRoZSBldmVudCBoYW5kbGVyc1xuXHRcdHRoaXMuJGVsZW1lbnQub24odGhpcy5faGFuZGxlcnMpO1xuXG5cdFx0Ly8gcmVnaXN0ZXIgZXZlbnQgbGlzdGVuZXIgZm9yIGhhc2ggbmF2aWdhdGlvblxuXHRcdCQod2luZG93KS5vbignaGFzaGNoYW5nZS5vd2wubmF2aWdhdGlvbicsICQucHJveHkoZnVuY3Rpb24oZSkge1xuXHRcdFx0dmFyIGhhc2ggPSB3aW5kb3cubG9jYXRpb24uaGFzaC5zdWJzdHJpbmcoMSksXG5cdFx0XHRcdGl0ZW1zID0gdGhpcy5fY29yZS4kc3RhZ2UuY2hpbGRyZW4oKSxcblx0XHRcdFx0cG9zaXRpb24gPSB0aGlzLl9oYXNoZXNbaGFzaF0gJiYgaXRlbXMuaW5kZXgodGhpcy5faGFzaGVzW2hhc2hdKTtcblxuXHRcdFx0aWYgKHBvc2l0aW9uID09PSB1bmRlZmluZWQgfHwgcG9zaXRpb24gPT09IHRoaXMuX2NvcmUuY3VycmVudCgpKSB7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblxuXHRcdFx0dGhpcy5fY29yZS50byh0aGlzLl9jb3JlLnJlbGF0aXZlKHBvc2l0aW9uKSwgZmFsc2UsIHRydWUpO1xuXHRcdH0sIHRoaXMpKTtcblx0fTtcblxuXHQvKipcblx0ICogRGVmYXVsdCBvcHRpb25zLlxuXHQgKiBAcHVibGljXG5cdCAqL1xuXHRIYXNoLkRlZmF1bHRzID0ge1xuXHRcdFVSTGhhc2hMaXN0ZW5lcjogZmFsc2Vcblx0fTtcblxuXHQvKipcblx0ICogRGVzdHJveXMgdGhlIHBsdWdpbi5cblx0ICogQHB1YmxpY1xuXHQgKi9cblx0SGFzaC5wcm90b3R5cGUuZGVzdHJveSA9IGZ1bmN0aW9uKCkge1xuXHRcdHZhciBoYW5kbGVyLCBwcm9wZXJ0eTtcblxuXHRcdCQod2luZG93KS5vZmYoJ2hhc2hjaGFuZ2Uub3dsLm5hdmlnYXRpb24nKTtcblxuXHRcdGZvciAoaGFuZGxlciBpbiB0aGlzLl9oYW5kbGVycykge1xuXHRcdFx0dGhpcy5fY29yZS4kZWxlbWVudC5vZmYoaGFuZGxlciwgdGhpcy5faGFuZGxlcnNbaGFuZGxlcl0pO1xuXHRcdH1cblx0XHRmb3IgKHByb3BlcnR5IGluIE9iamVjdC5nZXRPd25Qcm9wZXJ0eU5hbWVzKHRoaXMpKSB7XG5cdFx0XHR0eXBlb2YgdGhpc1twcm9wZXJ0eV0gIT0gJ2Z1bmN0aW9uJyAmJiAodGhpc1twcm9wZXJ0eV0gPSBudWxsKTtcblx0XHR9XG5cdH07XG5cblx0JC5mbi5vd2xDYXJvdXNlbC5Db25zdHJ1Y3Rvci5QbHVnaW5zLkhhc2ggPSBIYXNoO1xuXG59KSh3aW5kb3cuWmVwdG8gfHwgd2luZG93LmpRdWVyeSwgd2luZG93LCBkb2N1bWVudCk7XG5cbi8qKlxuICogU3VwcG9ydCBQbHVnaW5cbiAqXG4gKiBAdmVyc2lvbiAyLjEuMFxuICogQGF1dGhvciBWaXZpZCBQbGFuZXQgU29mdHdhcmUgR21iSFxuICogQGF1dGhvciBBcnR1cyBLb2xhbm93c2tpXG4gKiBAYXV0aG9yIERhdmlkIERldXRzY2hcbiAqIEBsaWNlbnNlIFRoZSBNSVQgTGljZW5zZSAoTUlUKVxuICovXG47KGZ1bmN0aW9uKCQsIHdpbmRvdywgZG9jdW1lbnQsIHVuZGVmaW5lZCkge1xuXG5cdHZhciBzdHlsZSA9ICQoJzxzdXBwb3J0PicpLmdldCgwKS5zdHlsZSxcblx0XHRwcmVmaXhlcyA9ICdXZWJraXQgTW96IE8gbXMnLnNwbGl0KCcgJyksXG5cdFx0ZXZlbnRzID0ge1xuXHRcdFx0dHJhbnNpdGlvbjoge1xuXHRcdFx0XHRlbmQ6IHtcblx0XHRcdFx0XHRXZWJraXRUcmFuc2l0aW9uOiAnd2Via2l0VHJhbnNpdGlvbkVuZCcsXG5cdFx0XHRcdFx0TW96VHJhbnNpdGlvbjogJ3RyYW5zaXRpb25lbmQnLFxuXHRcdFx0XHRcdE9UcmFuc2l0aW9uOiAnb1RyYW5zaXRpb25FbmQnLFxuXHRcdFx0XHRcdHRyYW5zaXRpb246ICd0cmFuc2l0aW9uZW5kJ1xuXHRcdFx0XHR9XG5cdFx0XHR9LFxuXHRcdFx0YW5pbWF0aW9uOiB7XG5cdFx0XHRcdGVuZDoge1xuXHRcdFx0XHRcdFdlYmtpdEFuaW1hdGlvbjogJ3dlYmtpdEFuaW1hdGlvbkVuZCcsXG5cdFx0XHRcdFx0TW96QW5pbWF0aW9uOiAnYW5pbWF0aW9uZW5kJyxcblx0XHRcdFx0XHRPQW5pbWF0aW9uOiAnb0FuaW1hdGlvbkVuZCcsXG5cdFx0XHRcdFx0YW5pbWF0aW9uOiAnYW5pbWF0aW9uZW5kJ1xuXHRcdFx0XHR9XG5cdFx0XHR9XG5cdFx0fSxcblx0XHR0ZXN0cyA9IHtcblx0XHRcdGNzc3RyYW5zZm9ybXM6IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRyZXR1cm4gISF0ZXN0KCd0cmFuc2Zvcm0nKTtcblx0XHRcdH0sXG5cdFx0XHRjc3N0cmFuc2Zvcm1zM2Q6IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRyZXR1cm4gISF0ZXN0KCdwZXJzcGVjdGl2ZScpO1xuXHRcdFx0fSxcblx0XHRcdGNzc3RyYW5zaXRpb25zOiBmdW5jdGlvbigpIHtcblx0XHRcdFx0cmV0dXJuICEhdGVzdCgndHJhbnNpdGlvbicpO1xuXHRcdFx0fSxcblx0XHRcdGNzc2FuaW1hdGlvbnM6IGZ1bmN0aW9uKCkge1xuXHRcdFx0XHRyZXR1cm4gISF0ZXN0KCdhbmltYXRpb24nKTtcblx0XHRcdH1cblx0XHR9O1xuXG5cdGZ1bmN0aW9uIHRlc3QocHJvcGVydHksIHByZWZpeGVkKSB7XG5cdFx0dmFyIHJlc3VsdCA9IGZhbHNlLFxuXHRcdFx0dXBwZXIgPSBwcm9wZXJ0eS5jaGFyQXQoMCkudG9VcHBlckNhc2UoKSArIHByb3BlcnR5LnNsaWNlKDEpO1xuXG5cdFx0JC5lYWNoKChwcm9wZXJ0eSArICcgJyArIHByZWZpeGVzLmpvaW4odXBwZXIgKyAnICcpICsgdXBwZXIpLnNwbGl0KCcgJyksIGZ1bmN0aW9uKGksIHByb3BlcnR5KSB7XG5cdFx0XHRpZiAoc3R5bGVbcHJvcGVydHldICE9PSB1bmRlZmluZWQpIHtcblx0XHRcdFx0cmVzdWx0ID0gcHJlZml4ZWQgPyBwcm9wZXJ0eSA6IHRydWU7XG5cdFx0XHRcdHJldHVybiBmYWxzZTtcblx0XHRcdH1cblx0XHR9KTtcblxuXHRcdHJldHVybiByZXN1bHQ7XG5cdH1cblxuXHRmdW5jdGlvbiBwcmVmaXhlZChwcm9wZXJ0eSkge1xuXHRcdHJldHVybiB0ZXN0KHByb3BlcnR5LCB0cnVlKTtcblx0fVxuXG5cdGlmICh0ZXN0cy5jc3N0cmFuc2l0aW9ucygpKSB7XG5cdFx0LyoganNoaW50IC1XMDUzICovXG5cdFx0JC5zdXBwb3J0LnRyYW5zaXRpb24gPSBuZXcgU3RyaW5nKHByZWZpeGVkKCd0cmFuc2l0aW9uJykpXG5cdFx0JC5zdXBwb3J0LnRyYW5zaXRpb24uZW5kID0gZXZlbnRzLnRyYW5zaXRpb24uZW5kWyAkLnN1cHBvcnQudHJhbnNpdGlvbiBdO1xuXHR9XG5cblx0aWYgKHRlc3RzLmNzc2FuaW1hdGlvbnMoKSkge1xuXHRcdC8qIGpzaGludCAtVzA1MyAqL1xuXHRcdCQuc3VwcG9ydC5hbmltYXRpb24gPSBuZXcgU3RyaW5nKHByZWZpeGVkKCdhbmltYXRpb24nKSlcblx0XHQkLnN1cHBvcnQuYW5pbWF0aW9uLmVuZCA9IGV2ZW50cy5hbmltYXRpb24uZW5kWyAkLnN1cHBvcnQuYW5pbWF0aW9uIF07XG5cdH1cblxuXHRpZiAodGVzdHMuY3NzdHJhbnNmb3JtcygpKSB7XG5cdFx0LyoganNoaW50IC1XMDUzICovXG5cdFx0JC5zdXBwb3J0LnRyYW5zZm9ybSA9IG5ldyBTdHJpbmcocHJlZml4ZWQoJ3RyYW5zZm9ybScpKTtcblx0XHQkLnN1cHBvcnQudHJhbnNmb3JtM2QgPSB0ZXN0cy5jc3N0cmFuc2Zvcm1zM2QoKTtcblx0fVxuXG59KSh3aW5kb3cuWmVwdG8gfHwgd2luZG93LmpRdWVyeSwgd2luZG93LCBkb2N1bWVudCk7XG4iLCIvKiEgcGljdHVyZWZpbGwgLSB2My4wLjIgLSAyMDE2LTAyLTEyXG4gKiBodHRwczovL3Njb3R0amVobC5naXRodWIuaW8vcGljdHVyZWZpbGwvXG4gKiBDb3B5cmlnaHQgKGMpIDIwMTYgaHR0cHM6Ly9naXRodWIuY29tL3Njb3R0amVobC9waWN0dXJlZmlsbC9ibG9iL21hc3Rlci9BdXRob3JzLnR4dDsgTGljZW5zZWQgTUlUXG4gKi9cbiFmdW5jdGlvbihhKXt2YXIgYj1uYXZpZ2F0b3IudXNlckFnZW50O2EuSFRNTFBpY3R1cmVFbGVtZW50JiYvZWNrby8udGVzdChiKSYmYi5tYXRjaCgvcnZcXDooXFxkKykvKSYmUmVnRXhwLiQxPDQ1JiZhZGRFdmVudExpc3RlbmVyKFwicmVzaXplXCIsZnVuY3Rpb24oKXt2YXIgYixjPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJzb3VyY2VcIiksZD1mdW5jdGlvbihhKXt2YXIgYixkLGU9YS5wYXJlbnROb2RlO1wiUElDVFVSRVwiPT09ZS5ub2RlTmFtZS50b1VwcGVyQ2FzZSgpPyhiPWMuY2xvbmVOb2RlKCksZS5pbnNlcnRCZWZvcmUoYixlLmZpcnN0RWxlbWVudENoaWxkKSxzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS5yZW1vdmVDaGlsZChiKX0pKTooIWEuX3BmTGFzdFNpemV8fGEub2Zmc2V0V2lkdGg+YS5fcGZMYXN0U2l6ZSkmJihhLl9wZkxhc3RTaXplPWEub2Zmc2V0V2lkdGgsZD1hLnNpemVzLGEuc2l6ZXMrPVwiLDEwMHZ3XCIsc2V0VGltZW91dChmdW5jdGlvbigpe2Euc2l6ZXM9ZH0pKX0sZT1mdW5jdGlvbigpe3ZhciBhLGI9ZG9jdW1lbnQucXVlcnlTZWxlY3RvckFsbChcInBpY3R1cmUgPiBpbWcsIGltZ1tzcmNzZXRdW3NpemVzXVwiKTtmb3IoYT0wO2E8Yi5sZW5ndGg7YSsrKWQoYlthXSl9LGY9ZnVuY3Rpb24oKXtjbGVhclRpbWVvdXQoYiksYj1zZXRUaW1lb3V0KGUsOTkpfSxnPWEubWF0Y2hNZWRpYSYmbWF0Y2hNZWRpYShcIihvcmllbnRhdGlvbjogbGFuZHNjYXBlKVwiKSxoPWZ1bmN0aW9uKCl7ZigpLGcmJmcuYWRkTGlzdGVuZXImJmcuYWRkTGlzdGVuZXIoZil9O3JldHVybiBjLnNyY3NldD1cImRhdGE6aW1hZ2UvZ2lmO2Jhc2U2NCxSMGxHT0RsaEFRQUJBQUFBQUNINUJBRUtBQUVBTEFBQUFBQUJBQUVBQUFJQ1RBRUFPdz09XCIsL15bY3xpXXxkJC8udGVzdChkb2N1bWVudC5yZWFkeVN0YXRlfHxcIlwiKT9oKCk6ZG9jdW1lbnQuYWRkRXZlbnRMaXN0ZW5lcihcIkRPTUNvbnRlbnRMb2FkZWRcIixoKSxmfSgpKX0od2luZG93KSxmdW5jdGlvbihhLGIsYyl7XCJ1c2Ugc3RyaWN0XCI7ZnVuY3Rpb24gZChhKXtyZXR1cm5cIiBcIj09PWF8fFwiXHRcIj09PWF8fFwiXFxuXCI9PT1hfHxcIlxcZlwiPT09YXx8XCJcXHJcIj09PWF9ZnVuY3Rpb24gZShiLGMpe3ZhciBkPW5ldyBhLkltYWdlO3JldHVybiBkLm9uZXJyb3I9ZnVuY3Rpb24oKXtBW2JdPSExLGJhKCl9LGQub25sb2FkPWZ1bmN0aW9uKCl7QVtiXT0xPT09ZC53aWR0aCxiYSgpfSxkLnNyYz1jLFwicGVuZGluZ1wifWZ1bmN0aW9uIGYoKXtNPSExLFA9YS5kZXZpY2VQaXhlbFJhdGlvLE49e30sTz17fSxzLkRQUj1QfHwxLFEud2lkdGg9TWF0aC5tYXgoYS5pbm5lcldpZHRofHwwLHouY2xpZW50V2lkdGgpLFEuaGVpZ2h0PU1hdGgubWF4KGEuaW5uZXJIZWlnaHR8fDAsei5jbGllbnRIZWlnaHQpLFEudnc9US53aWR0aC8xMDAsUS52aD1RLmhlaWdodC8xMDAscj1bUS5oZWlnaHQsUS53aWR0aCxQXS5qb2luKFwiLVwiKSxRLmVtPXMuZ2V0RW1WYWx1ZSgpLFEucmVtPVEuZW19ZnVuY3Rpb24gZyhhLGIsYyxkKXt2YXIgZSxmLGcsaDtyZXR1cm5cInNhdmVEYXRhXCI9PT1CLmFsZ29yaXRobT9hPjIuNz9oPWMrMTooZj1iLWMsZT1NYXRoLnBvdyhhLS42LDEuNSksZz1mKmUsZCYmKGcrPS4xKmUpLGg9YStnKTpoPWM+MT9NYXRoLnNxcnQoYSpiKTphLGg+Y31mdW5jdGlvbiBoKGEpe3ZhciBiLGM9cy5nZXRTZXQoYSksZD0hMTtcInBlbmRpbmdcIiE9PWMmJihkPXIsYyYmKGI9cy5zZXRSZXMoYykscy5hcHBseVNldENhbmRpZGF0ZShiLGEpKSksYVtzLm5zXS5ldmFsZWQ9ZH1mdW5jdGlvbiBpKGEsYil7cmV0dXJuIGEucmVzLWIucmVzfWZ1bmN0aW9uIGooYSxiLGMpe3ZhciBkO3JldHVybiFjJiZiJiYoYz1hW3MubnNdLnNldHMsYz1jJiZjW2MubGVuZ3RoLTFdKSxkPWsoYixjKSxkJiYoYj1zLm1ha2VVcmwoYiksYVtzLm5zXS5jdXJTcmM9YixhW3MubnNdLmN1ckNhbj1kLGQucmVzfHxhYShkLGQuc2V0LnNpemVzKSksZH1mdW5jdGlvbiBrKGEsYil7dmFyIGMsZCxlO2lmKGEmJmIpZm9yKGU9cy5wYXJzZVNldChiKSxhPXMubWFrZVVybChhKSxjPTA7YzxlLmxlbmd0aDtjKyspaWYoYT09PXMubWFrZVVybChlW2NdLnVybCkpe2Q9ZVtjXTticmVha31yZXR1cm4gZH1mdW5jdGlvbiBsKGEsYil7dmFyIGMsZCxlLGYsZz1hLmdldEVsZW1lbnRzQnlUYWdOYW1lKFwic291cmNlXCIpO2ZvcihjPTAsZD1nLmxlbmd0aDtkPmM7YysrKWU9Z1tjXSxlW3MubnNdPSEwLGY9ZS5nZXRBdHRyaWJ1dGUoXCJzcmNzZXRcIiksZiYmYi5wdXNoKHtzcmNzZXQ6ZixtZWRpYTplLmdldEF0dHJpYnV0ZShcIm1lZGlhXCIpLHR5cGU6ZS5nZXRBdHRyaWJ1dGUoXCJ0eXBlXCIpLHNpemVzOmUuZ2V0QXR0cmlidXRlKFwic2l6ZXNcIil9KX1mdW5jdGlvbiBtKGEsYil7ZnVuY3Rpb24gYyhiKXt2YXIgYyxkPWIuZXhlYyhhLnN1YnN0cmluZyhtKSk7cmV0dXJuIGQ/KGM9ZFswXSxtKz1jLmxlbmd0aCxjKTp2b2lkIDB9ZnVuY3Rpb24gZSgpe3ZhciBhLGMsZCxlLGYsaSxqLGssbCxtPSExLG89e307Zm9yKGU9MDtlPGgubGVuZ3RoO2UrKylmPWhbZV0saT1mW2YubGVuZ3RoLTFdLGo9Zi5zdWJzdHJpbmcoMCxmLmxlbmd0aC0xKSxrPXBhcnNlSW50KGosMTApLGw9cGFyc2VGbG9hdChqKSxYLnRlc3QoaikmJlwid1wiPT09aT8oKGF8fGMpJiYobT0hMCksMD09PWs/bT0hMDphPWspOlkudGVzdChqKSYmXCJ4XCI9PT1pPygoYXx8Y3x8ZCkmJihtPSEwKSwwPmw/bT0hMDpjPWwpOlgudGVzdChqKSYmXCJoXCI9PT1pPygoZHx8YykmJihtPSEwKSwwPT09az9tPSEwOmQ9ayk6bT0hMDttfHwoby51cmw9ZyxhJiYoby53PWEpLGMmJihvLmQ9YyksZCYmKG8uaD1kKSxkfHxjfHxhfHwoby5kPTEpLDE9PT1vLmQmJihiLmhhczF4PSEwKSxvLnNldD1iLG4ucHVzaChvKSl9ZnVuY3Rpb24gZigpe2ZvcihjKFQpLGk9XCJcIixqPVwiaW4gZGVzY3JpcHRvclwiOzspe2lmKGs9YS5jaGFyQXQobSksXCJpbiBkZXNjcmlwdG9yXCI9PT1qKWlmKGQoaykpaSYmKGgucHVzaChpKSxpPVwiXCIsaj1cImFmdGVyIGRlc2NyaXB0b3JcIik7ZWxzZXtpZihcIixcIj09PWspcmV0dXJuIG0rPTEsaSYmaC5wdXNoKGkpLHZvaWQgZSgpO2lmKFwiKFwiPT09aylpKz1rLGo9XCJpbiBwYXJlbnNcIjtlbHNle2lmKFwiXCI9PT1rKXJldHVybiBpJiZoLnB1c2goaSksdm9pZCBlKCk7aSs9a319ZWxzZSBpZihcImluIHBhcmVuc1wiPT09ailpZihcIilcIj09PWspaSs9ayxqPVwiaW4gZGVzY3JpcHRvclwiO2Vsc2V7aWYoXCJcIj09PWspcmV0dXJuIGgucHVzaChpKSx2b2lkIGUoKTtpKz1rfWVsc2UgaWYoXCJhZnRlciBkZXNjcmlwdG9yXCI9PT1qKWlmKGQoaykpO2Vsc2V7aWYoXCJcIj09PWspcmV0dXJuIHZvaWQgZSgpO2o9XCJpbiBkZXNjcmlwdG9yXCIsbS09MX1tKz0xfX1mb3IodmFyIGcsaCxpLGosayxsPWEubGVuZ3RoLG09MCxuPVtdOzspe2lmKGMoVSksbT49bClyZXR1cm4gbjtnPWMoViksaD1bXSxcIixcIj09PWcuc2xpY2UoLTEpPyhnPWcucmVwbGFjZShXLFwiXCIpLGUoKSk6ZigpfX1mdW5jdGlvbiBuKGEpe2Z1bmN0aW9uIGIoYSl7ZnVuY3Rpb24gYigpe2YmJihnLnB1c2goZiksZj1cIlwiKX1mdW5jdGlvbiBjKCl7Z1swXSYmKGgucHVzaChnKSxnPVtdKX1mb3IodmFyIGUsZj1cIlwiLGc9W10saD1bXSxpPTAsaj0wLGs9ITE7Oyl7aWYoZT1hLmNoYXJBdChqKSxcIlwiPT09ZSlyZXR1cm4gYigpLGMoKSxoO2lmKGspe2lmKFwiKlwiPT09ZSYmXCIvXCI9PT1hW2orMV0pe2s9ITEsais9MixiKCk7Y29udGludWV9ais9MX1lbHNle2lmKGQoZSkpe2lmKGEuY2hhckF0KGotMSkmJmQoYS5jaGFyQXQoai0xKSl8fCFmKXtqKz0xO2NvbnRpbnVlfWlmKDA9PT1pKXtiKCksais9MTtjb250aW51ZX1lPVwiIFwifWVsc2UgaWYoXCIoXCI9PT1lKWkrPTE7ZWxzZSBpZihcIilcIj09PWUpaS09MTtlbHNle2lmKFwiLFwiPT09ZSl7YigpLGMoKSxqKz0xO2NvbnRpbnVlfWlmKFwiL1wiPT09ZSYmXCIqXCI9PT1hLmNoYXJBdChqKzEpKXtrPSEwLGorPTI7Y29udGludWV9fWYrPWUsais9MX19fWZ1bmN0aW9uIGMoYSl7cmV0dXJuIGsudGVzdChhKSYmcGFyc2VGbG9hdChhKT49MD8hMDpsLnRlc3QoYSk/ITA6XCIwXCI9PT1hfHxcIi0wXCI9PT1hfHxcIiswXCI9PT1hPyEwOiExfXZhciBlLGYsZyxoLGksaixrPS9eKD86WystXT9bMC05XSt8WzAtOV0qXFwuWzAtOV0rKSg/OltlRV1bKy1dP1swLTldKyk/KD86Y2h8Y218ZW18ZXh8aW58bW18cGN8cHR8cHh8cmVtfHZofHZtaW58dm1heHx2dykkL2ksbD0vXmNhbGNcXCgoPzpbMC05YS16IFxcLlxcK1xcLVxcKlxcL1xcKFxcKV0rKVxcKSQvaTtmb3IoZj1iKGEpLGc9Zi5sZW5ndGgsZT0wO2c+ZTtlKyspaWYoaD1mW2VdLGk9aFtoLmxlbmd0aC0xXSxjKGkpKXtpZihqPWksaC5wb3AoKSwwPT09aC5sZW5ndGgpcmV0dXJuIGo7aWYoaD1oLmpvaW4oXCIgXCIpLHMubWF0Y2hlc01lZGlhKGgpKXJldHVybiBqfXJldHVyblwiMTAwdndcIn1iLmNyZWF0ZUVsZW1lbnQoXCJwaWN0dXJlXCIpO3ZhciBvLHAscSxyLHM9e30sdD0hMSx1PWZ1bmN0aW9uKCl7fSx2PWIuY3JlYXRlRWxlbWVudChcImltZ1wiKSx3PXYuZ2V0QXR0cmlidXRlLHg9di5zZXRBdHRyaWJ1dGUseT12LnJlbW92ZUF0dHJpYnV0ZSx6PWIuZG9jdW1lbnRFbGVtZW50LEE9e30sQj17YWxnb3JpdGhtOlwiXCJ9LEM9XCJkYXRhLXBmc3JjXCIsRD1DK1wic2V0XCIsRT1uYXZpZ2F0b3IudXNlckFnZW50LEY9L3JpZGVudC8udGVzdChFKXx8L2Vja28vLnRlc3QoRSkmJkUubWF0Y2goL3J2XFw6KFxcZCspLykmJlJlZ0V4cC4kMT4zNSxHPVwiY3VycmVudFNyY1wiLEg9L1xccytcXCs/XFxkKyhlXFxkKyk/dy8sST0vKFxcKFteKV0rXFwpKT9cXHMqKC4rKS8sSj1hLnBpY3R1cmVmaWxsQ0ZHLEs9XCJwb3NpdGlvbjphYnNvbHV0ZTtsZWZ0OjA7dmlzaWJpbGl0eTpoaWRkZW47ZGlzcGxheTpibG9jaztwYWRkaW5nOjA7Ym9yZGVyOm5vbmU7Zm9udC1zaXplOjFlbTt3aWR0aDoxZW07b3ZlcmZsb3c6aGlkZGVuO2NsaXA6cmVjdCgwcHgsIDBweCwgMHB4LCAwcHgpXCIsTD1cImZvbnQtc2l6ZToxMDAlIWltcG9ydGFudDtcIixNPSEwLE49e30sTz17fSxQPWEuZGV2aWNlUGl4ZWxSYXRpbyxRPXtweDoxLFwiaW5cIjo5Nn0sUj1iLmNyZWF0ZUVsZW1lbnQoXCJhXCIpLFM9ITEsVD0vXlsgXFx0XFxuXFxyXFx1MDAwY10rLyxVPS9eWywgXFx0XFxuXFxyXFx1MDAwY10rLyxWPS9eW14gXFx0XFxuXFxyXFx1MDAwY10rLyxXPS9bLF0rJC8sWD0vXlxcZCskLyxZPS9eLT8oPzpbMC05XSt8WzAtOV0qXFwuWzAtOV0rKSg/OltlRV1bKy1dP1swLTldKyk/JC8sWj1mdW5jdGlvbihhLGIsYyxkKXthLmFkZEV2ZW50TGlzdGVuZXI/YS5hZGRFdmVudExpc3RlbmVyKGIsYyxkfHwhMSk6YS5hdHRhY2hFdmVudCYmYS5hdHRhY2hFdmVudChcIm9uXCIrYixjKX0sJD1mdW5jdGlvbihhKXt2YXIgYj17fTtyZXR1cm4gZnVuY3Rpb24oYyl7cmV0dXJuIGMgaW4gYnx8KGJbY109YShjKSksYltjXX19LF89ZnVuY3Rpb24oKXt2YXIgYT0vXihbXFxkXFwuXSspKGVtfHZ3fHB4KSQvLGI9ZnVuY3Rpb24oKXtmb3IodmFyIGE9YXJndW1lbnRzLGI9MCxjPWFbMF07KytiIGluIGE7KWM9Yy5yZXBsYWNlKGFbYl0sYVsrK2JdKTtyZXR1cm4gY30sYz0kKGZ1bmN0aW9uKGEpe3JldHVyblwicmV0dXJuIFwiK2IoKGF8fFwiXCIpLnRvTG93ZXJDYXNlKCksL1xcYmFuZFxcYi9nLFwiJiZcIiwvLC9nLFwifHxcIiwvbWluLShbYS16LVxcc10rKTovZyxcImUuJDE+PVwiLC9tYXgtKFthLXotXFxzXSspOi9nLFwiZS4kMTw9XCIsL2NhbGMoW14pXSspL2csXCIoJDEpXCIsLyhcXGQrW1xcLl0qW1xcZF0qKShbYS16XSspL2csXCIoJDEgKiBlLiQyKVwiLC9eKD8hKGUuW2Etel18WzAtOVxcLiY9fD48XFwrXFwtXFwqXFwoXFwpXFwvXSkpLiovZ2ksXCJcIikrXCI7XCJ9KTtyZXR1cm4gZnVuY3Rpb24oYixkKXt2YXIgZTtpZighKGIgaW4gTikpaWYoTltiXT0hMSxkJiYoZT1iLm1hdGNoKGEpKSlOW2JdPWVbMV0qUVtlWzJdXTtlbHNlIHRyeXtOW2JdPW5ldyBGdW5jdGlvbihcImVcIixjKGIpKShRKX1jYXRjaChmKXt9cmV0dXJuIE5bYl19fSgpLGFhPWZ1bmN0aW9uKGEsYil7cmV0dXJuIGEudz8oYS5jV2lkdGg9cy5jYWxjTGlzdExlbmd0aChifHxcIjEwMHZ3XCIpLGEucmVzPWEudy9hLmNXaWR0aCk6YS5yZXM9YS5kLGF9LGJhPWZ1bmN0aW9uKGEpe2lmKHQpe3ZhciBjLGQsZSxmPWF8fHt9O2lmKGYuZWxlbWVudHMmJjE9PT1mLmVsZW1lbnRzLm5vZGVUeXBlJiYoXCJJTUdcIj09PWYuZWxlbWVudHMubm9kZU5hbWUudG9VcHBlckNhc2UoKT9mLmVsZW1lbnRzPVtmLmVsZW1lbnRzXTooZi5jb250ZXh0PWYuZWxlbWVudHMsZi5lbGVtZW50cz1udWxsKSksYz1mLmVsZW1lbnRzfHxzLnFzYShmLmNvbnRleHR8fGIsZi5yZWV2YWx1YXRlfHxmLnJlc2VsZWN0P3Muc2VsOnMuc2VsU2hvcnQpLGU9Yy5sZW5ndGgpe2ZvcihzLnNldHVwUnVuKGYpLFM9ITAsZD0wO2U+ZDtkKyspcy5maWxsSW1nKGNbZF0sZik7cy50ZWFyZG93blJ1bihmKX19fTtvPWEuY29uc29sZSYmY29uc29sZS53YXJuP2Z1bmN0aW9uKGEpe2NvbnNvbGUud2FybihhKX06dSxHIGluIHZ8fChHPVwic3JjXCIpLEFbXCJpbWFnZS9qcGVnXCJdPSEwLEFbXCJpbWFnZS9naWZcIl09ITAsQVtcImltYWdlL3BuZ1wiXT0hMCxBW1wiaW1hZ2Uvc3ZnK3htbFwiXT1iLmltcGxlbWVudGF0aW9uLmhhc0ZlYXR1cmUoXCJodHRwOi8vd3d3LnczLm9yZy9UUi9TVkcxMS9mZWF0dXJlI0ltYWdlXCIsXCIxLjFcIikscy5ucz0oXCJwZlwiKyhuZXcgRGF0ZSkuZ2V0VGltZSgpKS5zdWJzdHIoMCw5KSxzLnN1cFNyY3NldD1cInNyY3NldFwiaW4gdixzLnN1cFNpemVzPVwic2l6ZXNcImluIHYscy5zdXBQaWN0dXJlPSEhYS5IVE1MUGljdHVyZUVsZW1lbnQscy5zdXBTcmNzZXQmJnMuc3VwUGljdHVyZSYmIXMuc3VwU2l6ZXMmJiFmdW5jdGlvbihhKXt2LnNyY3NldD1cImRhdGE6LGFcIixhLnNyYz1cImRhdGE6LGFcIixzLnN1cFNyY3NldD12LmNvbXBsZXRlPT09YS5jb21wbGV0ZSxzLnN1cFBpY3R1cmU9cy5zdXBTcmNzZXQmJnMuc3VwUGljdHVyZX0oYi5jcmVhdGVFbGVtZW50KFwiaW1nXCIpKSxzLnN1cFNyY3NldCYmIXMuc3VwU2l6ZXM/IWZ1bmN0aW9uKCl7dmFyIGE9XCJkYXRhOmltYWdlL2dpZjtiYXNlNjQsUjBsR09EbGhBZ0FCQVBBQUFQLy8vd0FBQUNINUJBQUFBQUFBTEFBQUFBQUNBQUVBQUFJQ0JBb0FPdz09XCIsYz1cImRhdGE6aW1hZ2UvZ2lmO2Jhc2U2NCxSMGxHT0RsaEFRQUJBQUFBQUNINUJBRUtBQUVBTEFBQUFBQUJBQUVBQUFJQ1RBRUFPdz09XCIsZD1iLmNyZWF0ZUVsZW1lbnQoXCJpbWdcIiksZT1mdW5jdGlvbigpe3ZhciBhPWQud2lkdGg7Mj09PWEmJihzLnN1cFNpemVzPSEwKSxxPXMuc3VwU3Jjc2V0JiYhcy5zdXBTaXplcyx0PSEwLHNldFRpbWVvdXQoYmEpfTtkLm9ubG9hZD1lLGQub25lcnJvcj1lLGQuc2V0QXR0cmlidXRlKFwic2l6ZXNcIixcIjlweFwiKSxkLnNyY3NldD1jK1wiIDF3LFwiK2ErXCIgOXdcIixkLnNyYz1jfSgpOnQ9ITAscy5zZWxTaG9ydD1cInBpY3R1cmU+aW1nLGltZ1tzcmNzZXRdXCIscy5zZWw9cy5zZWxTaG9ydCxzLmNmZz1CLHMuRFBSPVB8fDEscy51PVEscy50eXBlcz1BLHMuc2V0U2l6ZT11LHMubWFrZVVybD0kKGZ1bmN0aW9uKGEpe3JldHVybiBSLmhyZWY9YSxSLmhyZWZ9KSxzLnFzYT1mdW5jdGlvbihhLGIpe3JldHVyblwicXVlcnlTZWxlY3RvclwiaW4gYT9hLnF1ZXJ5U2VsZWN0b3JBbGwoYik6W119LHMubWF0Y2hlc01lZGlhPWZ1bmN0aW9uKCl7cmV0dXJuIGEubWF0Y2hNZWRpYSYmKG1hdGNoTWVkaWEoXCIobWluLXdpZHRoOiAwLjFlbSlcIil8fHt9KS5tYXRjaGVzP3MubWF0Y2hlc01lZGlhPWZ1bmN0aW9uKGEpe3JldHVybiFhfHxtYXRjaE1lZGlhKGEpLm1hdGNoZXN9OnMubWF0Y2hlc01lZGlhPXMubU1RLHMubWF0Y2hlc01lZGlhLmFwcGx5KHRoaXMsYXJndW1lbnRzKX0scy5tTVE9ZnVuY3Rpb24oYSl7cmV0dXJuIGE/XyhhKTohMH0scy5jYWxjTGVuZ3RoPWZ1bmN0aW9uKGEpe3ZhciBiPV8oYSwhMCl8fCExO3JldHVybiAwPmImJihiPSExKSxifSxzLnN1cHBvcnRzVHlwZT1mdW5jdGlvbihhKXtyZXR1cm4gYT9BW2FdOiEwfSxzLnBhcnNlU2l6ZT0kKGZ1bmN0aW9uKGEpe3ZhciBiPShhfHxcIlwiKS5tYXRjaChJKTtyZXR1cm57bWVkaWE6YiYmYlsxXSxsZW5ndGg6YiYmYlsyXX19KSxzLnBhcnNlU2V0PWZ1bmN0aW9uKGEpe3JldHVybiBhLmNhbmRzfHwoYS5jYW5kcz1tKGEuc3Jjc2V0LGEpKSxhLmNhbmRzfSxzLmdldEVtVmFsdWU9ZnVuY3Rpb24oKXt2YXIgYTtpZighcCYmKGE9Yi5ib2R5KSl7dmFyIGM9Yi5jcmVhdGVFbGVtZW50KFwiZGl2XCIpLGQ9ei5zdHlsZS5jc3NUZXh0LGU9YS5zdHlsZS5jc3NUZXh0O2Muc3R5bGUuY3NzVGV4dD1LLHouc3R5bGUuY3NzVGV4dD1MLGEuc3R5bGUuY3NzVGV4dD1MLGEuYXBwZW5kQ2hpbGQoYykscD1jLm9mZnNldFdpZHRoLGEucmVtb3ZlQ2hpbGQoYykscD1wYXJzZUZsb2F0KHAsMTApLHouc3R5bGUuY3NzVGV4dD1kLGEuc3R5bGUuY3NzVGV4dD1lfXJldHVybiBwfHwxNn0scy5jYWxjTGlzdExlbmd0aD1mdW5jdGlvbihhKXtpZighKGEgaW4gTyl8fEIudVQpe3ZhciBiPXMuY2FsY0xlbmd0aChuKGEpKTtPW2FdPWI/YjpRLndpZHRofXJldHVybiBPW2FdfSxzLnNldFJlcz1mdW5jdGlvbihhKXt2YXIgYjtpZihhKXtiPXMucGFyc2VTZXQoYSk7Zm9yKHZhciBjPTAsZD1iLmxlbmd0aDtkPmM7YysrKWFhKGJbY10sYS5zaXplcyl9cmV0dXJuIGJ9LHMuc2V0UmVzLnJlcz1hYSxzLmFwcGx5U2V0Q2FuZGlkYXRlPWZ1bmN0aW9uKGEsYil7aWYoYS5sZW5ndGgpe3ZhciBjLGQsZSxmLGgsayxsLG0sbixvPWJbcy5uc10scD1zLkRQUjtpZihrPW8uY3VyU3JjfHxiW0ddLGw9by5jdXJDYW58fGooYixrLGFbMF0uc2V0KSxsJiZsLnNldD09PWFbMF0uc2V0JiYobj1GJiYhYi5jb21wbGV0ZSYmbC5yZXMtLjE+cCxufHwobC5jYWNoZWQ9ITAsbC5yZXM+PXAmJihoPWwpKSksIWgpZm9yKGEuc29ydChpKSxmPWEubGVuZ3RoLGg9YVtmLTFdLGQ9MDtmPmQ7ZCsrKWlmKGM9YVtkXSxjLnJlcz49cCl7ZT1kLTEsaD1hW2VdJiYobnx8ayE9PXMubWFrZVVybChjLnVybCkpJiZnKGFbZV0ucmVzLGMucmVzLHAsYVtlXS5jYWNoZWQpP2FbZV06YzticmVha31oJiYobT1zLm1ha2VVcmwoaC51cmwpLG8uY3VyU3JjPW0sby5jdXJDYW49aCxtIT09ayYmcy5zZXRTcmMoYixoKSxzLnNldFNpemUoYikpfX0scy5zZXRTcmM9ZnVuY3Rpb24oYSxiKXt2YXIgYzthLnNyYz1iLnVybCxcImltYWdlL3N2Zyt4bWxcIj09PWIuc2V0LnR5cGUmJihjPWEuc3R5bGUud2lkdGgsYS5zdHlsZS53aWR0aD1hLm9mZnNldFdpZHRoKzErXCJweFwiLGEub2Zmc2V0V2lkdGgrMSYmKGEuc3R5bGUud2lkdGg9YykpfSxzLmdldFNldD1mdW5jdGlvbihhKXt2YXIgYixjLGQsZT0hMSxmPWFbcy5uc10uc2V0cztmb3IoYj0wO2I8Zi5sZW5ndGgmJiFlO2IrKylpZihjPWZbYl0sYy5zcmNzZXQmJnMubWF0Y2hlc01lZGlhKGMubWVkaWEpJiYoZD1zLnN1cHBvcnRzVHlwZShjLnR5cGUpKSl7XCJwZW5kaW5nXCI9PT1kJiYoYz1kKSxlPWM7YnJlYWt9cmV0dXJuIGV9LHMucGFyc2VTZXRzPWZ1bmN0aW9uKGEsYixkKXt2YXIgZSxmLGcsaCxpPWImJlwiUElDVFVSRVwiPT09Yi5ub2RlTmFtZS50b1VwcGVyQ2FzZSgpLGo9YVtzLm5zXTsoai5zcmM9PT1jfHxkLnNyYykmJihqLnNyYz13LmNhbGwoYSxcInNyY1wiKSxqLnNyYz94LmNhbGwoYSxDLGouc3JjKTp5LmNhbGwoYSxDKSksKGouc3Jjc2V0PT09Y3x8ZC5zcmNzZXR8fCFzLnN1cFNyY3NldHx8YS5zcmNzZXQpJiYoZT13LmNhbGwoYSxcInNyY3NldFwiKSxqLnNyY3NldD1lLGg9ITApLGouc2V0cz1bXSxpJiYoai5waWM9ITAsbChiLGouc2V0cykpLGouc3Jjc2V0PyhmPXtzcmNzZXQ6ai5zcmNzZXQsc2l6ZXM6dy5jYWxsKGEsXCJzaXplc1wiKX0sai5zZXRzLnB1c2goZiksZz0ocXx8ai5zcmMpJiZILnRlc3Qoai5zcmNzZXR8fFwiXCIpLGd8fCFqLnNyY3x8ayhqLnNyYyxmKXx8Zi5oYXMxeHx8KGYuc3Jjc2V0Kz1cIiwgXCIrai5zcmMsZi5jYW5kcy5wdXNoKHt1cmw6ai5zcmMsZDoxLHNldDpmfSkpKTpqLnNyYyYmai5zZXRzLnB1c2goe3NyY3NldDpqLnNyYyxzaXplczpudWxsfSksai5jdXJDYW49bnVsbCxqLmN1clNyYz1jLGouc3VwcG9ydGVkPSEoaXx8ZiYmIXMuc3VwU3Jjc2V0fHxnJiYhcy5zdXBTaXplcyksaCYmcy5zdXBTcmNzZXQmJiFqLnN1cHBvcnRlZCYmKGU/KHguY2FsbChhLEQsZSksYS5zcmNzZXQ9XCJcIik6eS5jYWxsKGEsRCkpLGouc3VwcG9ydGVkJiYhai5zcmNzZXQmJighai5zcmMmJmEuc3JjfHxhLnNyYyE9PXMubWFrZVVybChqLnNyYykpJiYobnVsbD09PWouc3JjP2EucmVtb3ZlQXR0cmlidXRlKFwic3JjXCIpOmEuc3JjPWouc3JjKSxqLnBhcnNlZD0hMH0scy5maWxsSW1nPWZ1bmN0aW9uKGEsYil7dmFyIGMsZD1iLnJlc2VsZWN0fHxiLnJlZXZhbHVhdGU7YVtzLm5zXXx8KGFbcy5uc109e30pLGM9YVtzLm5zXSwoZHx8Yy5ldmFsZWQhPT1yKSYmKCghYy5wYXJzZWR8fGIucmVldmFsdWF0ZSkmJnMucGFyc2VTZXRzKGEsYS5wYXJlbnROb2RlLGIpLGMuc3VwcG9ydGVkP2MuZXZhbGVkPXI6aChhKSl9LHMuc2V0dXBSdW49ZnVuY3Rpb24oKXsoIVN8fE18fFAhPT1hLmRldmljZVBpeGVsUmF0aW8pJiZmKCl9LHMuc3VwUGljdHVyZT8oYmE9dSxzLmZpbGxJbWc9dSk6IWZ1bmN0aW9uKCl7dmFyIGMsZD1hLmF0dGFjaEV2ZW50Py9kJHxeYy86L2QkfF5jfF5pLyxlPWZ1bmN0aW9uKCl7dmFyIGE9Yi5yZWFkeVN0YXRlfHxcIlwiO2Y9c2V0VGltZW91dChlLFwibG9hZGluZ1wiPT09YT8yMDA6OTk5KSxiLmJvZHkmJihzLmZpbGxJbWdzKCksYz1jfHxkLnRlc3QoYSksYyYmY2xlYXJUaW1lb3V0KGYpKX0sZj1zZXRUaW1lb3V0KGUsYi5ib2R5Pzk6OTkpLGc9ZnVuY3Rpb24oYSxiKXt2YXIgYyxkLGU9ZnVuY3Rpb24oKXt2YXIgZj1uZXcgRGF0ZS1kO2I+Zj9jPXNldFRpbWVvdXQoZSxiLWYpOihjPW51bGwsYSgpKX07cmV0dXJuIGZ1bmN0aW9uKCl7ZD1uZXcgRGF0ZSxjfHwoYz1zZXRUaW1lb3V0KGUsYikpfX0saD16LmNsaWVudEhlaWdodCxpPWZ1bmN0aW9uKCl7TT1NYXRoLm1heChhLmlubmVyV2lkdGh8fDAsei5jbGllbnRXaWR0aCkhPT1RLndpZHRofHx6LmNsaWVudEhlaWdodCE9PWgsaD16LmNsaWVudEhlaWdodCxNJiZzLmZpbGxJbWdzKCl9O1ooYSxcInJlc2l6ZVwiLGcoaSw5OSkpLFooYixcInJlYWR5c3RhdGVjaGFuZ2VcIixlKX0oKSxzLnBpY3R1cmVmaWxsPWJhLHMuZmlsbEltZ3M9YmEscy50ZWFyZG93blJ1bj11LGJhLl89cyxhLnBpY3R1cmVmaWxsQ0ZHPXtwZjpzLHB1c2g6ZnVuY3Rpb24oYSl7dmFyIGI9YS5zaGlmdCgpO1wiZnVuY3Rpb25cIj09dHlwZW9mIHNbYl0/c1tiXS5hcHBseShzLGEpOihCW2JdPWFbMF0sUyYmcy5maWxsSW1ncyh7cmVzZWxlY3Q6ITB9KSl9fTtmb3IoO0omJkoubGVuZ3RoOylhLnBpY3R1cmVmaWxsQ0ZHLnB1c2goSi5zaGlmdCgpKTthLnBpY3R1cmVmaWxsPWJhLFwib2JqZWN0XCI9PXR5cGVvZiBtb2R1bGUmJlwib2JqZWN0XCI9PXR5cGVvZiBtb2R1bGUuZXhwb3J0cz9tb2R1bGUuZXhwb3J0cz1iYTpcImZ1bmN0aW9uXCI9PXR5cGVvZiBkZWZpbmUmJmRlZmluZS5hbWQmJmRlZmluZShcInBpY3R1cmVmaWxsXCIsZnVuY3Rpb24oKXtyZXR1cm4gYmF9KSxzLnN1cFBpY3R1cmV8fChBW1wiaW1hZ2Uvd2VicFwiXT1lKFwiaW1hZ2Uvd2VicFwiLFwiZGF0YTppbWFnZS93ZWJwO2Jhc2U2NCxVa2xHUmtvQUFBQlhSVUpRVmxBNFdBb0FBQUFRQUFBQUFBQUFBQUFBUVV4UVNBd0FBQUFCQnhBUi9ROUVSUDhEQUFCV1VEZ2dHQUFBQURBQkFKMEJLZ0VBQVFBREFEUWxwQUFEY0FEKysvMVFBQT09XCIpKX0od2luZG93LGRvY3VtZW50KTsiLCIvKiEgU2VsZWN0MiA0LjAuMyB8IGh0dHBzOi8vZ2l0aHViLmNvbS9zZWxlY3QyL3NlbGVjdDIvYmxvYi9tYXN0ZXIvTElDRU5TRS5tZCAqLyFmdW5jdGlvbihhKXtcImZ1bmN0aW9uXCI9PXR5cGVvZiBkZWZpbmUmJmRlZmluZS5hbWQ/ZGVmaW5lKFtcImpxdWVyeVwiXSxhKTphKFwib2JqZWN0XCI9PXR5cGVvZiBleHBvcnRzP3JlcXVpcmUoXCJqcXVlcnlcIik6alF1ZXJ5KX0oZnVuY3Rpb24oYSl7dmFyIGI9ZnVuY3Rpb24oKXtpZihhJiZhLmZuJiZhLmZuLnNlbGVjdDImJmEuZm4uc2VsZWN0Mi5hbWQpdmFyIGI9YS5mbi5zZWxlY3QyLmFtZDt2YXIgYjtyZXR1cm4gZnVuY3Rpb24oKXtpZighYnx8IWIucmVxdWlyZWpzKXtiP2M9YjpiPXt9O3ZhciBhLGMsZDshZnVuY3Rpb24oYil7ZnVuY3Rpb24gZShhLGIpe3JldHVybiB1LmNhbGwoYSxiKX1mdW5jdGlvbiBmKGEsYil7dmFyIGMsZCxlLGYsZyxoLGksaixrLGwsbSxuPWImJmIuc3BsaXQoXCIvXCIpLG89cy5tYXAscD1vJiZvW1wiKlwiXXx8e307aWYoYSYmXCIuXCI9PT1hLmNoYXJBdCgwKSlpZihiKXtmb3IoYT1hLnNwbGl0KFwiL1wiKSxnPWEubGVuZ3RoLTEscy5ub2RlSWRDb21wYXQmJncudGVzdChhW2ddKSYmKGFbZ109YVtnXS5yZXBsYWNlKHcsXCJcIikpLGE9bi5zbGljZSgwLG4ubGVuZ3RoLTEpLmNvbmNhdChhKSxrPTA7azxhLmxlbmd0aDtrKz0xKWlmKG09YVtrXSxcIi5cIj09PW0pYS5zcGxpY2UoaywxKSxrLT0xO2Vsc2UgaWYoXCIuLlwiPT09bSl7aWYoMT09PWsmJihcIi4uXCI9PT1hWzJdfHxcIi4uXCI9PT1hWzBdKSlicmVhaztrPjAmJihhLnNwbGljZShrLTEsMiksay09Mil9YT1hLmpvaW4oXCIvXCIpfWVsc2UgMD09PWEuaW5kZXhPZihcIi4vXCIpJiYoYT1hLnN1YnN0cmluZygyKSk7aWYoKG58fHApJiZvKXtmb3IoYz1hLnNwbGl0KFwiL1wiKSxrPWMubGVuZ3RoO2s+MDtrLT0xKXtpZihkPWMuc2xpY2UoMCxrKS5qb2luKFwiL1wiKSxuKWZvcihsPW4ubGVuZ3RoO2w+MDtsLT0xKWlmKGU9b1tuLnNsaWNlKDAsbCkuam9pbihcIi9cIildLGUmJihlPWVbZF0pKXtmPWUsaD1rO2JyZWFrfWlmKGYpYnJlYWs7IWkmJnAmJnBbZF0mJihpPXBbZF0saj1rKX0hZiYmaSYmKGY9aSxoPWopLGYmJihjLnNwbGljZSgwLGgsZiksYT1jLmpvaW4oXCIvXCIpKX1yZXR1cm4gYX1mdW5jdGlvbiBnKGEsYyl7cmV0dXJuIGZ1bmN0aW9uKCl7dmFyIGQ9di5jYWxsKGFyZ3VtZW50cywwKTtyZXR1cm5cInN0cmluZ1wiIT10eXBlb2YgZFswXSYmMT09PWQubGVuZ3RoJiZkLnB1c2gobnVsbCksbi5hcHBseShiLGQuY29uY2F0KFthLGNdKSl9fWZ1bmN0aW9uIGgoYSl7cmV0dXJuIGZ1bmN0aW9uKGIpe3JldHVybiBmKGIsYSl9fWZ1bmN0aW9uIGkoYSl7cmV0dXJuIGZ1bmN0aW9uKGIpe3FbYV09Yn19ZnVuY3Rpb24gaihhKXtpZihlKHIsYSkpe3ZhciBjPXJbYV07ZGVsZXRlIHJbYV0sdFthXT0hMCxtLmFwcGx5KGIsYyl9aWYoIWUocSxhKSYmIWUodCxhKSl0aHJvdyBuZXcgRXJyb3IoXCJObyBcIithKTtyZXR1cm4gcVthXX1mdW5jdGlvbiBrKGEpe3ZhciBiLGM9YT9hLmluZGV4T2YoXCIhXCIpOi0xO3JldHVybiBjPi0xJiYoYj1hLnN1YnN0cmluZygwLGMpLGE9YS5zdWJzdHJpbmcoYysxLGEubGVuZ3RoKSksW2IsYV19ZnVuY3Rpb24gbChhKXtyZXR1cm4gZnVuY3Rpb24oKXtyZXR1cm4gcyYmcy5jb25maWcmJnMuY29uZmlnW2FdfHx7fX19dmFyIG0sbixvLHAscT17fSxyPXt9LHM9e30sdD17fSx1PU9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHksdj1bXS5zbGljZSx3PS9cXC5qcyQvO289ZnVuY3Rpb24oYSxiKXt2YXIgYyxkPWsoYSksZT1kWzBdO3JldHVybiBhPWRbMV0sZSYmKGU9ZihlLGIpLGM9aihlKSksZT9hPWMmJmMubm9ybWFsaXplP2Mubm9ybWFsaXplKGEsaChiKSk6ZihhLGIpOihhPWYoYSxiKSxkPWsoYSksZT1kWzBdLGE9ZFsxXSxlJiYoYz1qKGUpKSkse2Y6ZT9lK1wiIVwiK2E6YSxuOmEscHI6ZSxwOmN9fSxwPXtyZXF1aXJlOmZ1bmN0aW9uKGEpe3JldHVybiBnKGEpfSxleHBvcnRzOmZ1bmN0aW9uKGEpe3ZhciBiPXFbYV07cmV0dXJuXCJ1bmRlZmluZWRcIiE9dHlwZW9mIGI/YjpxW2FdPXt9fSxtb2R1bGU6ZnVuY3Rpb24oYSl7cmV0dXJue2lkOmEsdXJpOlwiXCIsZXhwb3J0czpxW2FdLGNvbmZpZzpsKGEpfX19LG09ZnVuY3Rpb24oYSxjLGQsZil7dmFyIGgsayxsLG0sbixzLHU9W10sdj10eXBlb2YgZDtpZihmPWZ8fGEsXCJ1bmRlZmluZWRcIj09PXZ8fFwiZnVuY3Rpb25cIj09PXYpe2ZvcihjPSFjLmxlbmd0aCYmZC5sZW5ndGg/W1wicmVxdWlyZVwiLFwiZXhwb3J0c1wiLFwibW9kdWxlXCJdOmMsbj0wO248Yy5sZW5ndGg7bis9MSlpZihtPW8oY1tuXSxmKSxrPW0uZixcInJlcXVpcmVcIj09PWspdVtuXT1wLnJlcXVpcmUoYSk7ZWxzZSBpZihcImV4cG9ydHNcIj09PWspdVtuXT1wLmV4cG9ydHMoYSkscz0hMDtlbHNlIGlmKFwibW9kdWxlXCI9PT1rKWg9dVtuXT1wLm1vZHVsZShhKTtlbHNlIGlmKGUocSxrKXx8ZShyLGspfHxlKHQsaykpdVtuXT1qKGspO2Vsc2V7aWYoIW0ucCl0aHJvdyBuZXcgRXJyb3IoYStcIiBtaXNzaW5nIFwiK2spO20ucC5sb2FkKG0ubixnKGYsITApLGkoaykse30pLHVbbl09cVtrXX1sPWQ/ZC5hcHBseShxW2FdLHUpOnZvaWQgMCxhJiYoaCYmaC5leHBvcnRzIT09YiYmaC5leHBvcnRzIT09cVthXT9xW2FdPWguZXhwb3J0czpsPT09YiYmc3x8KHFbYV09bCkpfWVsc2UgYSYmKHFbYV09ZCl9LGE9Yz1uPWZ1bmN0aW9uKGEsYyxkLGUsZil7aWYoXCJzdHJpbmdcIj09dHlwZW9mIGEpcmV0dXJuIHBbYV0/cFthXShjKTpqKG8oYSxjKS5mKTtpZighYS5zcGxpY2Upe2lmKHM9YSxzLmRlcHMmJm4ocy5kZXBzLHMuY2FsbGJhY2spLCFjKXJldHVybjtjLnNwbGljZT8oYT1jLGM9ZCxkPW51bGwpOmE9Yn1yZXR1cm4gYz1jfHxmdW5jdGlvbigpe30sXCJmdW5jdGlvblwiPT10eXBlb2YgZCYmKGQ9ZSxlPWYpLGU/bShiLGEsYyxkKTpzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7bShiLGEsYyxkKX0sNCksbn0sbi5jb25maWc9ZnVuY3Rpb24oYSl7cmV0dXJuIG4oYSl9LGEuX2RlZmluZWQ9cSxkPWZ1bmN0aW9uKGEsYixjKXtpZihcInN0cmluZ1wiIT10eXBlb2YgYSl0aHJvdyBuZXcgRXJyb3IoXCJTZWUgYWxtb25kIFJFQURNRTogaW5jb3JyZWN0IG1vZHVsZSBidWlsZCwgbm8gbW9kdWxlIG5hbWVcIik7Yi5zcGxpY2V8fChjPWIsYj1bXSksZShxLGEpfHxlKHIsYSl8fChyW2FdPVthLGIsY10pfSxkLmFtZD17alF1ZXJ5OiEwfX0oKSxiLnJlcXVpcmVqcz1hLGIucmVxdWlyZT1jLGIuZGVmaW5lPWR9fSgpLGIuZGVmaW5lKFwiYWxtb25kXCIsZnVuY3Rpb24oKXt9KSxiLmRlZmluZShcImpxdWVyeVwiLFtdLGZ1bmN0aW9uKCl7dmFyIGI9YXx8JDtyZXR1cm4gbnVsbD09YiYmY29uc29sZSYmY29uc29sZS5lcnJvciYmY29uc29sZS5lcnJvcihcIlNlbGVjdDI6IEFuIGluc3RhbmNlIG9mIGpRdWVyeSBvciBhIGpRdWVyeS1jb21wYXRpYmxlIGxpYnJhcnkgd2FzIG5vdCBmb3VuZC4gTWFrZSBzdXJlIHRoYXQgeW91IGFyZSBpbmNsdWRpbmcgalF1ZXJ5IGJlZm9yZSBTZWxlY3QyIG9uIHlvdXIgd2ViIHBhZ2UuXCIpLGJ9KSxiLmRlZmluZShcInNlbGVjdDIvdXRpbHNcIixbXCJqcXVlcnlcIl0sZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihhKXt2YXIgYj1hLnByb3RvdHlwZSxjPVtdO2Zvcih2YXIgZCBpbiBiKXt2YXIgZT1iW2RdO1wiZnVuY3Rpb25cIj09dHlwZW9mIGUmJlwiY29uc3RydWN0b3JcIiE9PWQmJmMucHVzaChkKX1yZXR1cm4gY312YXIgYz17fTtjLkV4dGVuZD1mdW5jdGlvbihhLGIpe2Z1bmN0aW9uIGMoKXt0aGlzLmNvbnN0cnVjdG9yPWF9dmFyIGQ9e30uaGFzT3duUHJvcGVydHk7Zm9yKHZhciBlIGluIGIpZC5jYWxsKGIsZSkmJihhW2VdPWJbZV0pO3JldHVybiBjLnByb3RvdHlwZT1iLnByb3RvdHlwZSxhLnByb3RvdHlwZT1uZXcgYyxhLl9fc3VwZXJfXz1iLnByb3RvdHlwZSxhfSxjLkRlY29yYXRlPWZ1bmN0aW9uKGEsYyl7ZnVuY3Rpb24gZCgpe3ZhciBiPUFycmF5LnByb3RvdHlwZS51bnNoaWZ0LGQ9Yy5wcm90b3R5cGUuY29uc3RydWN0b3IubGVuZ3RoLGU9YS5wcm90b3R5cGUuY29uc3RydWN0b3I7ZD4wJiYoYi5jYWxsKGFyZ3VtZW50cyxhLnByb3RvdHlwZS5jb25zdHJ1Y3RvciksZT1jLnByb3RvdHlwZS5jb25zdHJ1Y3RvciksZS5hcHBseSh0aGlzLGFyZ3VtZW50cyl9ZnVuY3Rpb24gZSgpe3RoaXMuY29uc3RydWN0b3I9ZH12YXIgZj1iKGMpLGc9YihhKTtjLmRpc3BsYXlOYW1lPWEuZGlzcGxheU5hbWUsZC5wcm90b3R5cGU9bmV3IGU7Zm9yKHZhciBoPTA7aDxnLmxlbmd0aDtoKyspe3ZhciBpPWdbaF07ZC5wcm90b3R5cGVbaV09YS5wcm90b3R5cGVbaV19Zm9yKHZhciBqPShmdW5jdGlvbihhKXt2YXIgYj1mdW5jdGlvbigpe307YSBpbiBkLnByb3RvdHlwZSYmKGI9ZC5wcm90b3R5cGVbYV0pO3ZhciBlPWMucHJvdG90eXBlW2FdO3JldHVybiBmdW5jdGlvbigpe3ZhciBhPUFycmF5LnByb3RvdHlwZS51bnNoaWZ0O3JldHVybiBhLmNhbGwoYXJndW1lbnRzLGIpLGUuYXBwbHkodGhpcyxhcmd1bWVudHMpfX0pLGs9MDtrPGYubGVuZ3RoO2srKyl7dmFyIGw9ZltrXTtkLnByb3RvdHlwZVtsXT1qKGwpfXJldHVybiBkfTt2YXIgZD1mdW5jdGlvbigpe3RoaXMubGlzdGVuZXJzPXt9fTtyZXR1cm4gZC5wcm90b3R5cGUub249ZnVuY3Rpb24oYSxiKXt0aGlzLmxpc3RlbmVycz10aGlzLmxpc3RlbmVyc3x8e30sYSBpbiB0aGlzLmxpc3RlbmVycz90aGlzLmxpc3RlbmVyc1thXS5wdXNoKGIpOnRoaXMubGlzdGVuZXJzW2FdPVtiXX0sZC5wcm90b3R5cGUudHJpZ2dlcj1mdW5jdGlvbihhKXt2YXIgYj1BcnJheS5wcm90b3R5cGUuc2xpY2UsYz1iLmNhbGwoYXJndW1lbnRzLDEpO3RoaXMubGlzdGVuZXJzPXRoaXMubGlzdGVuZXJzfHx7fSxudWxsPT1jJiYoYz1bXSksMD09PWMubGVuZ3RoJiZjLnB1c2goe30pLGNbMF0uX3R5cGU9YSxhIGluIHRoaXMubGlzdGVuZXJzJiZ0aGlzLmludm9rZSh0aGlzLmxpc3RlbmVyc1thXSxiLmNhbGwoYXJndW1lbnRzLDEpKSxcIipcImluIHRoaXMubGlzdGVuZXJzJiZ0aGlzLmludm9rZSh0aGlzLmxpc3RlbmVyc1tcIipcIl0sYXJndW1lbnRzKX0sZC5wcm90b3R5cGUuaW52b2tlPWZ1bmN0aW9uKGEsYil7Zm9yKHZhciBjPTAsZD1hLmxlbmd0aDtkPmM7YysrKWFbY10uYXBwbHkodGhpcyxiKX0sYy5PYnNlcnZhYmxlPWQsYy5nZW5lcmF0ZUNoYXJzPWZ1bmN0aW9uKGEpe2Zvcih2YXIgYj1cIlwiLGM9MDthPmM7YysrKXt2YXIgZD1NYXRoLmZsb29yKDM2Kk1hdGgucmFuZG9tKCkpO2IrPWQudG9TdHJpbmcoMzYpfXJldHVybiBifSxjLmJpbmQ9ZnVuY3Rpb24oYSxiKXtyZXR1cm4gZnVuY3Rpb24oKXthLmFwcGx5KGIsYXJndW1lbnRzKX19LGMuX2NvbnZlcnREYXRhPWZ1bmN0aW9uKGEpe2Zvcih2YXIgYiBpbiBhKXt2YXIgYz1iLnNwbGl0KFwiLVwiKSxkPWE7aWYoMSE9PWMubGVuZ3RoKXtmb3IodmFyIGU9MDtlPGMubGVuZ3RoO2UrKyl7dmFyIGY9Y1tlXTtmPWYuc3Vic3RyaW5nKDAsMSkudG9Mb3dlckNhc2UoKStmLnN1YnN0cmluZygxKSxmIGluIGR8fChkW2ZdPXt9KSxlPT1jLmxlbmd0aC0xJiYoZFtmXT1hW2JdKSxkPWRbZl19ZGVsZXRlIGFbYl19fXJldHVybiBhfSxjLmhhc1Njcm9sbD1mdW5jdGlvbihiLGMpe3ZhciBkPWEoYyksZT1jLnN0eWxlLm92ZXJmbG93WCxmPWMuc3R5bGUub3ZlcmZsb3dZO3JldHVybiBlIT09Znx8XCJoaWRkZW5cIiE9PWYmJlwidmlzaWJsZVwiIT09Zj9cInNjcm9sbFwiPT09ZXx8XCJzY3JvbGxcIj09PWY/ITA6ZC5pbm5lckhlaWdodCgpPGMuc2Nyb2xsSGVpZ2h0fHxkLmlubmVyV2lkdGgoKTxjLnNjcm9sbFdpZHRoOiExfSxjLmVzY2FwZU1hcmt1cD1mdW5jdGlvbihhKXt2YXIgYj17XCJcXFxcXCI6XCImIzkyO1wiLFwiJlwiOlwiJmFtcDtcIixcIjxcIjpcIiZsdDtcIixcIj5cIjpcIiZndDtcIiwnXCInOlwiJnF1b3Q7XCIsXCInXCI6XCImIzM5O1wiLFwiL1wiOlwiJiM0NztcIn07cmV0dXJuXCJzdHJpbmdcIiE9dHlwZW9mIGE/YTpTdHJpbmcoYSkucmVwbGFjZSgvWyY8PlwiJ1xcL1xcXFxdL2csZnVuY3Rpb24oYSl7cmV0dXJuIGJbYV19KX0sYy5hcHBlbmRNYW55PWZ1bmN0aW9uKGIsYyl7aWYoXCIxLjdcIj09PWEuZm4uanF1ZXJ5LnN1YnN0cigwLDMpKXt2YXIgZD1hKCk7YS5tYXAoYyxmdW5jdGlvbihhKXtkPWQuYWRkKGEpfSksYz1kfWIuYXBwZW5kKGMpfSxjfSksYi5kZWZpbmUoXCJzZWxlY3QyL3Jlc3VsdHNcIixbXCJqcXVlcnlcIixcIi4vdXRpbHNcIl0sZnVuY3Rpb24oYSxiKXtmdW5jdGlvbiBjKGEsYixkKXt0aGlzLiRlbGVtZW50PWEsdGhpcy5kYXRhPWQsdGhpcy5vcHRpb25zPWIsYy5fX3N1cGVyX18uY29uc3RydWN0b3IuY2FsbCh0aGlzKX1yZXR1cm4gYi5FeHRlbmQoYyxiLk9ic2VydmFibGUpLGMucHJvdG90eXBlLnJlbmRlcj1mdW5jdGlvbigpe3ZhciBiPWEoJzx1bCBjbGFzcz1cInNlbGVjdDItcmVzdWx0c19fb3B0aW9uc1wiIHJvbGU9XCJ0cmVlXCI+PC91bD4nKTtyZXR1cm4gdGhpcy5vcHRpb25zLmdldChcIm11bHRpcGxlXCIpJiZiLmF0dHIoXCJhcmlhLW11bHRpc2VsZWN0YWJsZVwiLFwidHJ1ZVwiKSx0aGlzLiRyZXN1bHRzPWIsYn0sYy5wcm90b3R5cGUuY2xlYXI9ZnVuY3Rpb24oKXt0aGlzLiRyZXN1bHRzLmVtcHR5KCl9LGMucHJvdG90eXBlLmRpc3BsYXlNZXNzYWdlPWZ1bmN0aW9uKGIpe3ZhciBjPXRoaXMub3B0aW9ucy5nZXQoXCJlc2NhcGVNYXJrdXBcIik7dGhpcy5jbGVhcigpLHRoaXMuaGlkZUxvYWRpbmcoKTt2YXIgZD1hKCc8bGkgcm9sZT1cInRyZWVpdGVtXCIgYXJpYS1saXZlPVwiYXNzZXJ0aXZlXCIgY2xhc3M9XCJzZWxlY3QyLXJlc3VsdHNfX29wdGlvblwiPjwvbGk+JyksZT10aGlzLm9wdGlvbnMuZ2V0KFwidHJhbnNsYXRpb25zXCIpLmdldChiLm1lc3NhZ2UpO2QuYXBwZW5kKGMoZShiLmFyZ3MpKSksZFswXS5jbGFzc05hbWUrPVwiIHNlbGVjdDItcmVzdWx0c19fbWVzc2FnZVwiLHRoaXMuJHJlc3VsdHMuYXBwZW5kKGQpfSxjLnByb3RvdHlwZS5oaWRlTWVzc2FnZXM9ZnVuY3Rpb24oKXt0aGlzLiRyZXN1bHRzLmZpbmQoXCIuc2VsZWN0Mi1yZXN1bHRzX19tZXNzYWdlXCIpLnJlbW92ZSgpfSxjLnByb3RvdHlwZS5hcHBlbmQ9ZnVuY3Rpb24oYSl7dGhpcy5oaWRlTG9hZGluZygpO3ZhciBiPVtdO2lmKG51bGw9PWEucmVzdWx0c3x8MD09PWEucmVzdWx0cy5sZW5ndGgpcmV0dXJuIHZvaWQoMD09PXRoaXMuJHJlc3VsdHMuY2hpbGRyZW4oKS5sZW5ndGgmJnRoaXMudHJpZ2dlcihcInJlc3VsdHM6bWVzc2FnZVwiLHttZXNzYWdlOlwibm9SZXN1bHRzXCJ9KSk7YS5yZXN1bHRzPXRoaXMuc29ydChhLnJlc3VsdHMpO2Zvcih2YXIgYz0wO2M8YS5yZXN1bHRzLmxlbmd0aDtjKyspe3ZhciBkPWEucmVzdWx0c1tjXSxlPXRoaXMub3B0aW9uKGQpO2IucHVzaChlKX10aGlzLiRyZXN1bHRzLmFwcGVuZChiKX0sYy5wcm90b3R5cGUucG9zaXRpb249ZnVuY3Rpb24oYSxiKXt2YXIgYz1iLmZpbmQoXCIuc2VsZWN0Mi1yZXN1bHRzXCIpO2MuYXBwZW5kKGEpfSxjLnByb3RvdHlwZS5zb3J0PWZ1bmN0aW9uKGEpe3ZhciBiPXRoaXMub3B0aW9ucy5nZXQoXCJzb3J0ZXJcIik7cmV0dXJuIGIoYSl9LGMucHJvdG90eXBlLmhpZ2hsaWdodEZpcnN0SXRlbT1mdW5jdGlvbigpe3ZhciBhPXRoaXMuJHJlc3VsdHMuZmluZChcIi5zZWxlY3QyLXJlc3VsdHNfX29wdGlvblthcmlhLXNlbGVjdGVkXVwiKSxiPWEuZmlsdGVyKFwiW2FyaWEtc2VsZWN0ZWQ9dHJ1ZV1cIik7Yi5sZW5ndGg+MD9iLmZpcnN0KCkudHJpZ2dlcihcIm1vdXNlZW50ZXJcIik6YS5maXJzdCgpLnRyaWdnZXIoXCJtb3VzZWVudGVyXCIpLHRoaXMuZW5zdXJlSGlnaGxpZ2h0VmlzaWJsZSgpfSxjLnByb3RvdHlwZS5zZXRDbGFzc2VzPWZ1bmN0aW9uKCl7dmFyIGI9dGhpczt0aGlzLmRhdGEuY3VycmVudChmdW5jdGlvbihjKXt2YXIgZD1hLm1hcChjLGZ1bmN0aW9uKGEpe3JldHVybiBhLmlkLnRvU3RyaW5nKCl9KSxlPWIuJHJlc3VsdHMuZmluZChcIi5zZWxlY3QyLXJlc3VsdHNfX29wdGlvblthcmlhLXNlbGVjdGVkXVwiKTtlLmVhY2goZnVuY3Rpb24oKXt2YXIgYj1hKHRoaXMpLGM9YS5kYXRhKHRoaXMsXCJkYXRhXCIpLGU9XCJcIitjLmlkO251bGwhPWMuZWxlbWVudCYmYy5lbGVtZW50LnNlbGVjdGVkfHxudWxsPT1jLmVsZW1lbnQmJmEuaW5BcnJheShlLGQpPi0xP2IuYXR0cihcImFyaWEtc2VsZWN0ZWRcIixcInRydWVcIik6Yi5hdHRyKFwiYXJpYS1zZWxlY3RlZFwiLFwiZmFsc2VcIil9KX0pfSxjLnByb3RvdHlwZS5zaG93TG9hZGluZz1mdW5jdGlvbihhKXt0aGlzLmhpZGVMb2FkaW5nKCk7dmFyIGI9dGhpcy5vcHRpb25zLmdldChcInRyYW5zbGF0aW9uc1wiKS5nZXQoXCJzZWFyY2hpbmdcIiksYz17ZGlzYWJsZWQ6ITAsbG9hZGluZzohMCx0ZXh0OmIoYSl9LGQ9dGhpcy5vcHRpb24oYyk7ZC5jbGFzc05hbWUrPVwiIGxvYWRpbmctcmVzdWx0c1wiLHRoaXMuJHJlc3VsdHMucHJlcGVuZChkKX0sYy5wcm90b3R5cGUuaGlkZUxvYWRpbmc9ZnVuY3Rpb24oKXt0aGlzLiRyZXN1bHRzLmZpbmQoXCIubG9hZGluZy1yZXN1bHRzXCIpLnJlbW92ZSgpfSxjLnByb3RvdHlwZS5vcHRpb249ZnVuY3Rpb24oYil7dmFyIGM9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImxpXCIpO2MuY2xhc3NOYW1lPVwic2VsZWN0Mi1yZXN1bHRzX19vcHRpb25cIjt2YXIgZD17cm9sZTpcInRyZWVpdGVtXCIsXCJhcmlhLXNlbGVjdGVkXCI6XCJmYWxzZVwifTtiLmRpc2FibGVkJiYoZGVsZXRlIGRbXCJhcmlhLXNlbGVjdGVkXCJdLGRbXCJhcmlhLWRpc2FibGVkXCJdPVwidHJ1ZVwiKSxudWxsPT1iLmlkJiZkZWxldGUgZFtcImFyaWEtc2VsZWN0ZWRcIl0sbnVsbCE9Yi5fcmVzdWx0SWQmJihjLmlkPWIuX3Jlc3VsdElkKSxiLnRpdGxlJiYoYy50aXRsZT1iLnRpdGxlKSxiLmNoaWxkcmVuJiYoZC5yb2xlPVwiZ3JvdXBcIixkW1wiYXJpYS1sYWJlbFwiXT1iLnRleHQsZGVsZXRlIGRbXCJhcmlhLXNlbGVjdGVkXCJdKTtmb3IodmFyIGUgaW4gZCl7dmFyIGY9ZFtlXTtjLnNldEF0dHJpYnV0ZShlLGYpfWlmKGIuY2hpbGRyZW4pe3ZhciBnPWEoYyksaD1kb2N1bWVudC5jcmVhdGVFbGVtZW50KFwic3Ryb25nXCIpO2guY2xhc3NOYW1lPVwic2VsZWN0Mi1yZXN1bHRzX19ncm91cFwiO2EoaCk7dGhpcy50ZW1wbGF0ZShiLGgpO2Zvcih2YXIgaT1bXSxqPTA7ajxiLmNoaWxkcmVuLmxlbmd0aDtqKyspe3ZhciBrPWIuY2hpbGRyZW5bal0sbD10aGlzLm9wdGlvbihrKTtpLnB1c2gobCl9dmFyIG09YShcIjx1bD48L3VsPlwiLHtcImNsYXNzXCI6XCJzZWxlY3QyLXJlc3VsdHNfX29wdGlvbnMgc2VsZWN0Mi1yZXN1bHRzX19vcHRpb25zLS1uZXN0ZWRcIn0pO20uYXBwZW5kKGkpLGcuYXBwZW5kKGgpLGcuYXBwZW5kKG0pfWVsc2UgdGhpcy50ZW1wbGF0ZShiLGMpO3JldHVybiBhLmRhdGEoYyxcImRhdGFcIixiKSxjfSxjLnByb3RvdHlwZS5iaW5kPWZ1bmN0aW9uKGIsYyl7dmFyIGQ9dGhpcyxlPWIuaWQrXCItcmVzdWx0c1wiO3RoaXMuJHJlc3VsdHMuYXR0cihcImlkXCIsZSksYi5vbihcInJlc3VsdHM6YWxsXCIsZnVuY3Rpb24oYSl7ZC5jbGVhcigpLGQuYXBwZW5kKGEuZGF0YSksYi5pc09wZW4oKSYmKGQuc2V0Q2xhc3NlcygpLGQuaGlnaGxpZ2h0Rmlyc3RJdGVtKCkpfSksYi5vbihcInJlc3VsdHM6YXBwZW5kXCIsZnVuY3Rpb24oYSl7ZC5hcHBlbmQoYS5kYXRhKSxiLmlzT3BlbigpJiZkLnNldENsYXNzZXMoKX0pLGIub24oXCJxdWVyeVwiLGZ1bmN0aW9uKGEpe2QuaGlkZU1lc3NhZ2VzKCksZC5zaG93TG9hZGluZyhhKX0pLGIub24oXCJzZWxlY3RcIixmdW5jdGlvbigpe2IuaXNPcGVuKCkmJihkLnNldENsYXNzZXMoKSxkLmhpZ2hsaWdodEZpcnN0SXRlbSgpKX0pLGIub24oXCJ1bnNlbGVjdFwiLGZ1bmN0aW9uKCl7Yi5pc09wZW4oKSYmKGQuc2V0Q2xhc3NlcygpLGQuaGlnaGxpZ2h0Rmlyc3RJdGVtKCkpfSksYi5vbihcIm9wZW5cIixmdW5jdGlvbigpe2QuJHJlc3VsdHMuYXR0cihcImFyaWEtZXhwYW5kZWRcIixcInRydWVcIiksZC4kcmVzdWx0cy5hdHRyKFwiYXJpYS1oaWRkZW5cIixcImZhbHNlXCIpLGQuc2V0Q2xhc3NlcygpLGQuZW5zdXJlSGlnaGxpZ2h0VmlzaWJsZSgpfSksYi5vbihcImNsb3NlXCIsZnVuY3Rpb24oKXtkLiRyZXN1bHRzLmF0dHIoXCJhcmlhLWV4cGFuZGVkXCIsXCJmYWxzZVwiKSxkLiRyZXN1bHRzLmF0dHIoXCJhcmlhLWhpZGRlblwiLFwidHJ1ZVwiKSxkLiRyZXN1bHRzLnJlbW92ZUF0dHIoXCJhcmlhLWFjdGl2ZWRlc2NlbmRhbnRcIil9KSxiLm9uKFwicmVzdWx0czp0b2dnbGVcIixmdW5jdGlvbigpe3ZhciBhPWQuZ2V0SGlnaGxpZ2h0ZWRSZXN1bHRzKCk7MCE9PWEubGVuZ3RoJiZhLnRyaWdnZXIoXCJtb3VzZXVwXCIpfSksYi5vbihcInJlc3VsdHM6c2VsZWN0XCIsZnVuY3Rpb24oKXt2YXIgYT1kLmdldEhpZ2hsaWdodGVkUmVzdWx0cygpO2lmKDAhPT1hLmxlbmd0aCl7dmFyIGI9YS5kYXRhKFwiZGF0YVwiKTtcInRydWVcIj09YS5hdHRyKFwiYXJpYS1zZWxlY3RlZFwiKT9kLnRyaWdnZXIoXCJjbG9zZVwiLHt9KTpkLnRyaWdnZXIoXCJzZWxlY3RcIix7ZGF0YTpifSl9fSksYi5vbihcInJlc3VsdHM6cHJldmlvdXNcIixmdW5jdGlvbigpe3ZhciBhPWQuZ2V0SGlnaGxpZ2h0ZWRSZXN1bHRzKCksYj1kLiRyZXN1bHRzLmZpbmQoXCJbYXJpYS1zZWxlY3RlZF1cIiksYz1iLmluZGV4KGEpO2lmKDAhPT1jKXt2YXIgZT1jLTE7MD09PWEubGVuZ3RoJiYoZT0wKTt2YXIgZj1iLmVxKGUpO2YudHJpZ2dlcihcIm1vdXNlZW50ZXJcIik7dmFyIGc9ZC4kcmVzdWx0cy5vZmZzZXQoKS50b3AsaD1mLm9mZnNldCgpLnRvcCxpPWQuJHJlc3VsdHMuc2Nyb2xsVG9wKCkrKGgtZyk7MD09PWU/ZC4kcmVzdWx0cy5zY3JvbGxUb3AoMCk6MD5oLWcmJmQuJHJlc3VsdHMuc2Nyb2xsVG9wKGkpfX0pLGIub24oXCJyZXN1bHRzOm5leHRcIixmdW5jdGlvbigpe3ZhciBhPWQuZ2V0SGlnaGxpZ2h0ZWRSZXN1bHRzKCksYj1kLiRyZXN1bHRzLmZpbmQoXCJbYXJpYS1zZWxlY3RlZF1cIiksYz1iLmluZGV4KGEpLGU9YysxO2lmKCEoZT49Yi5sZW5ndGgpKXt2YXIgZj1iLmVxKGUpO2YudHJpZ2dlcihcIm1vdXNlZW50ZXJcIik7dmFyIGc9ZC4kcmVzdWx0cy5vZmZzZXQoKS50b3ArZC4kcmVzdWx0cy5vdXRlckhlaWdodCghMSksaD1mLm9mZnNldCgpLnRvcCtmLm91dGVySGVpZ2h0KCExKSxpPWQuJHJlc3VsdHMuc2Nyb2xsVG9wKCkraC1nOzA9PT1lP2QuJHJlc3VsdHMuc2Nyb2xsVG9wKDApOmg+ZyYmZC4kcmVzdWx0cy5zY3JvbGxUb3AoaSl9fSksYi5vbihcInJlc3VsdHM6Zm9jdXNcIixmdW5jdGlvbihhKXthLmVsZW1lbnQuYWRkQ2xhc3MoXCJzZWxlY3QyLXJlc3VsdHNfX29wdGlvbi0taGlnaGxpZ2h0ZWRcIil9KSxiLm9uKFwicmVzdWx0czptZXNzYWdlXCIsZnVuY3Rpb24oYSl7ZC5kaXNwbGF5TWVzc2FnZShhKX0pLGEuZm4ubW91c2V3aGVlbCYmdGhpcy4kcmVzdWx0cy5vbihcIm1vdXNld2hlZWxcIixmdW5jdGlvbihhKXt2YXIgYj1kLiRyZXN1bHRzLnNjcm9sbFRvcCgpLGM9ZC4kcmVzdWx0cy5nZXQoMCkuc2Nyb2xsSGVpZ2h0LWIrYS5kZWx0YVksZT1hLmRlbHRhWT4wJiZiLWEuZGVsdGFZPD0wLGY9YS5kZWx0YVk8MCYmYzw9ZC4kcmVzdWx0cy5oZWlnaHQoKTtlPyhkLiRyZXN1bHRzLnNjcm9sbFRvcCgwKSxhLnByZXZlbnREZWZhdWx0KCksYS5zdG9wUHJvcGFnYXRpb24oKSk6ZiYmKGQuJHJlc3VsdHMuc2Nyb2xsVG9wKGQuJHJlc3VsdHMuZ2V0KDApLnNjcm9sbEhlaWdodC1kLiRyZXN1bHRzLmhlaWdodCgpKSxhLnByZXZlbnREZWZhdWx0KCksYS5zdG9wUHJvcGFnYXRpb24oKSl9KSx0aGlzLiRyZXN1bHRzLm9uKFwibW91c2V1cFwiLFwiLnNlbGVjdDItcmVzdWx0c19fb3B0aW9uW2FyaWEtc2VsZWN0ZWRdXCIsZnVuY3Rpb24oYil7dmFyIGM9YSh0aGlzKSxlPWMuZGF0YShcImRhdGFcIik7cmV0dXJuXCJ0cnVlXCI9PT1jLmF0dHIoXCJhcmlhLXNlbGVjdGVkXCIpP3ZvaWQoZC5vcHRpb25zLmdldChcIm11bHRpcGxlXCIpP2QudHJpZ2dlcihcInVuc2VsZWN0XCIse29yaWdpbmFsRXZlbnQ6YixkYXRhOmV9KTpkLnRyaWdnZXIoXCJjbG9zZVwiLHt9KSk6dm9pZCBkLnRyaWdnZXIoXCJzZWxlY3RcIix7b3JpZ2luYWxFdmVudDpiLGRhdGE6ZX0pfSksdGhpcy4kcmVzdWx0cy5vbihcIm1vdXNlZW50ZXJcIixcIi5zZWxlY3QyLXJlc3VsdHNfX29wdGlvblthcmlhLXNlbGVjdGVkXVwiLGZ1bmN0aW9uKGIpe3ZhciBjPWEodGhpcykuZGF0YShcImRhdGFcIik7ZC5nZXRIaWdobGlnaHRlZFJlc3VsdHMoKS5yZW1vdmVDbGFzcyhcInNlbGVjdDItcmVzdWx0c19fb3B0aW9uLS1oaWdobGlnaHRlZFwiKSxkLnRyaWdnZXIoXCJyZXN1bHRzOmZvY3VzXCIse2RhdGE6YyxlbGVtZW50OmEodGhpcyl9KX0pfSxjLnByb3RvdHlwZS5nZXRIaWdobGlnaHRlZFJlc3VsdHM9ZnVuY3Rpb24oKXt2YXIgYT10aGlzLiRyZXN1bHRzLmZpbmQoXCIuc2VsZWN0Mi1yZXN1bHRzX19vcHRpb24tLWhpZ2hsaWdodGVkXCIpO3JldHVybiBhfSxjLnByb3RvdHlwZS5kZXN0cm95PWZ1bmN0aW9uKCl7dGhpcy4kcmVzdWx0cy5yZW1vdmUoKX0sYy5wcm90b3R5cGUuZW5zdXJlSGlnaGxpZ2h0VmlzaWJsZT1mdW5jdGlvbigpe3ZhciBhPXRoaXMuZ2V0SGlnaGxpZ2h0ZWRSZXN1bHRzKCk7aWYoMCE9PWEubGVuZ3RoKXt2YXIgYj10aGlzLiRyZXN1bHRzLmZpbmQoXCJbYXJpYS1zZWxlY3RlZF1cIiksYz1iLmluZGV4KGEpLGQ9dGhpcy4kcmVzdWx0cy5vZmZzZXQoKS50b3AsZT1hLm9mZnNldCgpLnRvcCxmPXRoaXMuJHJlc3VsdHMuc2Nyb2xsVG9wKCkrKGUtZCksZz1lLWQ7Zi09MiphLm91dGVySGVpZ2h0KCExKSwyPj1jP3RoaXMuJHJlc3VsdHMuc2Nyb2xsVG9wKDApOihnPnRoaXMuJHJlc3VsdHMub3V0ZXJIZWlnaHQoKXx8MD5nKSYmdGhpcy4kcmVzdWx0cy5zY3JvbGxUb3AoZil9fSxjLnByb3RvdHlwZS50ZW1wbGF0ZT1mdW5jdGlvbihiLGMpe3ZhciBkPXRoaXMub3B0aW9ucy5nZXQoXCJ0ZW1wbGF0ZVJlc3VsdFwiKSxlPXRoaXMub3B0aW9ucy5nZXQoXCJlc2NhcGVNYXJrdXBcIiksZj1kKGIsYyk7bnVsbD09Zj9jLnN0eWxlLmRpc3BsYXk9XCJub25lXCI6XCJzdHJpbmdcIj09dHlwZW9mIGY/Yy5pbm5lckhUTUw9ZShmKTphKGMpLmFwcGVuZChmKX0sY30pLGIuZGVmaW5lKFwic2VsZWN0Mi9rZXlzXCIsW10sZnVuY3Rpb24oKXt2YXIgYT17QkFDS1NQQUNFOjgsVEFCOjksRU5URVI6MTMsU0hJRlQ6MTYsQ1RSTDoxNyxBTFQ6MTgsRVNDOjI3LFNQQUNFOjMyLFBBR0VfVVA6MzMsUEFHRV9ET1dOOjM0LEVORDozNSxIT01FOjM2LExFRlQ6MzcsVVA6MzgsUklHSFQ6MzksRE9XTjo0MCxERUxFVEU6NDZ9O3JldHVybiBhfSksYi5kZWZpbmUoXCJzZWxlY3QyL3NlbGVjdGlvbi9iYXNlXCIsW1wianF1ZXJ5XCIsXCIuLi91dGlsc1wiLFwiLi4va2V5c1wiXSxmdW5jdGlvbihhLGIsYyl7ZnVuY3Rpb24gZChhLGIpe3RoaXMuJGVsZW1lbnQ9YSx0aGlzLm9wdGlvbnM9YixkLl9fc3VwZXJfXy5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMpfXJldHVybiBiLkV4dGVuZChkLGIuT2JzZXJ2YWJsZSksZC5wcm90b3R5cGUucmVuZGVyPWZ1bmN0aW9uKCl7dmFyIGI9YSgnPHNwYW4gY2xhc3M9XCJzZWxlY3QyLXNlbGVjdGlvblwiIHJvbGU9XCJjb21ib2JveFwiICBhcmlhLWhhc3BvcHVwPVwidHJ1ZVwiIGFyaWEtZXhwYW5kZWQ9XCJmYWxzZVwiPjwvc3Bhbj4nKTtyZXR1cm4gdGhpcy5fdGFiaW5kZXg9MCxudWxsIT10aGlzLiRlbGVtZW50LmRhdGEoXCJvbGQtdGFiaW5kZXhcIik/dGhpcy5fdGFiaW5kZXg9dGhpcy4kZWxlbWVudC5kYXRhKFwib2xkLXRhYmluZGV4XCIpOm51bGwhPXRoaXMuJGVsZW1lbnQuYXR0cihcInRhYmluZGV4XCIpJiYodGhpcy5fdGFiaW5kZXg9dGhpcy4kZWxlbWVudC5hdHRyKFwidGFiaW5kZXhcIikpLGIuYXR0cihcInRpdGxlXCIsdGhpcy4kZWxlbWVudC5hdHRyKFwidGl0bGVcIikpLGIuYXR0cihcInRhYmluZGV4XCIsdGhpcy5fdGFiaW5kZXgpLHRoaXMuJHNlbGVjdGlvbj1iLGJ9LGQucHJvdG90eXBlLmJpbmQ9ZnVuY3Rpb24oYSxiKXt2YXIgZD10aGlzLGU9KGEuaWQrXCItY29udGFpbmVyXCIsYS5pZCtcIi1yZXN1bHRzXCIpO3RoaXMuY29udGFpbmVyPWEsdGhpcy4kc2VsZWN0aW9uLm9uKFwiZm9jdXNcIixmdW5jdGlvbihhKXtkLnRyaWdnZXIoXCJmb2N1c1wiLGEpfSksdGhpcy4kc2VsZWN0aW9uLm9uKFwiYmx1clwiLGZ1bmN0aW9uKGEpe2QuX2hhbmRsZUJsdXIoYSl9KSx0aGlzLiRzZWxlY3Rpb24ub24oXCJrZXlkb3duXCIsZnVuY3Rpb24oYSl7ZC50cmlnZ2VyKFwia2V5cHJlc3NcIixhKSxhLndoaWNoPT09Yy5TUEFDRSYmYS5wcmV2ZW50RGVmYXVsdCgpfSksYS5vbihcInJlc3VsdHM6Zm9jdXNcIixmdW5jdGlvbihhKXtkLiRzZWxlY3Rpb24uYXR0cihcImFyaWEtYWN0aXZlZGVzY2VuZGFudFwiLGEuZGF0YS5fcmVzdWx0SWQpfSksYS5vbihcInNlbGVjdGlvbjp1cGRhdGVcIixmdW5jdGlvbihhKXtkLnVwZGF0ZShhLmRhdGEpfSksYS5vbihcIm9wZW5cIixmdW5jdGlvbigpe2QuJHNlbGVjdGlvbi5hdHRyKFwiYXJpYS1leHBhbmRlZFwiLFwidHJ1ZVwiKSxkLiRzZWxlY3Rpb24uYXR0cihcImFyaWEtb3duc1wiLGUpLGQuX2F0dGFjaENsb3NlSGFuZGxlcihhKX0pLGEub24oXCJjbG9zZVwiLGZ1bmN0aW9uKCl7ZC4kc2VsZWN0aW9uLmF0dHIoXCJhcmlhLWV4cGFuZGVkXCIsXCJmYWxzZVwiKSxkLiRzZWxlY3Rpb24ucmVtb3ZlQXR0cihcImFyaWEtYWN0aXZlZGVzY2VuZGFudFwiKSxkLiRzZWxlY3Rpb24ucmVtb3ZlQXR0cihcImFyaWEtb3duc1wiKSxkLiRzZWxlY3Rpb24uZm9jdXMoKSxkLl9kZXRhY2hDbG9zZUhhbmRsZXIoYSl9KSxhLm9uKFwiZW5hYmxlXCIsZnVuY3Rpb24oKXtkLiRzZWxlY3Rpb24uYXR0cihcInRhYmluZGV4XCIsZC5fdGFiaW5kZXgpfSksYS5vbihcImRpc2FibGVcIixmdW5jdGlvbigpe2QuJHNlbGVjdGlvbi5hdHRyKFwidGFiaW5kZXhcIixcIi0xXCIpfSl9LGQucHJvdG90eXBlLl9oYW5kbGVCbHVyPWZ1bmN0aW9uKGIpe3ZhciBjPXRoaXM7d2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKXtkb2N1bWVudC5hY3RpdmVFbGVtZW50PT1jLiRzZWxlY3Rpb25bMF18fGEuY29udGFpbnMoYy4kc2VsZWN0aW9uWzBdLGRvY3VtZW50LmFjdGl2ZUVsZW1lbnQpfHxjLnRyaWdnZXIoXCJibHVyXCIsYil9LDEpfSxkLnByb3RvdHlwZS5fYXR0YWNoQ2xvc2VIYW5kbGVyPWZ1bmN0aW9uKGIpe2EoZG9jdW1lbnQuYm9keSkub24oXCJtb3VzZWRvd24uc2VsZWN0Mi5cIitiLmlkLGZ1bmN0aW9uKGIpe3ZhciBjPWEoYi50YXJnZXQpLGQ9Yy5jbG9zZXN0KFwiLnNlbGVjdDJcIiksZT1hKFwiLnNlbGVjdDIuc2VsZWN0Mi1jb250YWluZXItLW9wZW5cIik7ZS5lYWNoKGZ1bmN0aW9uKCl7dmFyIGI9YSh0aGlzKTtpZih0aGlzIT1kWzBdKXt2YXIgYz1iLmRhdGEoXCJlbGVtZW50XCIpO2Muc2VsZWN0MihcImNsb3NlXCIpfX0pfSl9LGQucHJvdG90eXBlLl9kZXRhY2hDbG9zZUhhbmRsZXI9ZnVuY3Rpb24oYil7YShkb2N1bWVudC5ib2R5KS5vZmYoXCJtb3VzZWRvd24uc2VsZWN0Mi5cIitiLmlkKX0sZC5wcm90b3R5cGUucG9zaXRpb249ZnVuY3Rpb24oYSxiKXt2YXIgYz1iLmZpbmQoXCIuc2VsZWN0aW9uXCIpO2MuYXBwZW5kKGEpfSxkLnByb3RvdHlwZS5kZXN0cm95PWZ1bmN0aW9uKCl7dGhpcy5fZGV0YWNoQ2xvc2VIYW5kbGVyKHRoaXMuY29udGFpbmVyKX0sZC5wcm90b3R5cGUudXBkYXRlPWZ1bmN0aW9uKGEpe3Rocm93IG5ldyBFcnJvcihcIlRoZSBgdXBkYXRlYCBtZXRob2QgbXVzdCBiZSBkZWZpbmVkIGluIGNoaWxkIGNsYXNzZXMuXCIpfSxkfSksYi5kZWZpbmUoXCJzZWxlY3QyL3NlbGVjdGlvbi9zaW5nbGVcIixbXCJqcXVlcnlcIixcIi4vYmFzZVwiLFwiLi4vdXRpbHNcIixcIi4uL2tleXNcIl0sZnVuY3Rpb24oYSxiLGMsZCl7ZnVuY3Rpb24gZSgpe2UuX19zdXBlcl9fLmNvbnN0cnVjdG9yLmFwcGx5KHRoaXMsYXJndW1lbnRzKX1yZXR1cm4gYy5FeHRlbmQoZSxiKSxlLnByb3RvdHlwZS5yZW5kZXI9ZnVuY3Rpb24oKXt2YXIgYT1lLl9fc3VwZXJfXy5yZW5kZXIuY2FsbCh0aGlzKTtyZXR1cm4gYS5hZGRDbGFzcyhcInNlbGVjdDItc2VsZWN0aW9uLS1zaW5nbGVcIiksYS5odG1sKCc8c3BhbiBjbGFzcz1cInNlbGVjdDItc2VsZWN0aW9uX19yZW5kZXJlZFwiPjwvc3Bhbj48c3BhbiBjbGFzcz1cInNlbGVjdDItc2VsZWN0aW9uX19hcnJvd1wiIHJvbGU9XCJwcmVzZW50YXRpb25cIj48YiByb2xlPVwicHJlc2VudGF0aW9uXCI+PC9iPjwvc3Bhbj4nKSxhfSxlLnByb3RvdHlwZS5iaW5kPWZ1bmN0aW9uKGEsYil7dmFyIGM9dGhpcztlLl9fc3VwZXJfXy5iaW5kLmFwcGx5KHRoaXMsYXJndW1lbnRzKTt2YXIgZD1hLmlkK1wiLWNvbnRhaW5lclwiO3RoaXMuJHNlbGVjdGlvbi5maW5kKFwiLnNlbGVjdDItc2VsZWN0aW9uX19yZW5kZXJlZFwiKS5hdHRyKFwiaWRcIixkKSx0aGlzLiRzZWxlY3Rpb24uYXR0cihcImFyaWEtbGFiZWxsZWRieVwiLGQpLHRoaXMuJHNlbGVjdGlvbi5vbihcIm1vdXNlZG93blwiLGZ1bmN0aW9uKGEpezE9PT1hLndoaWNoJiZjLnRyaWdnZXIoXCJ0b2dnbGVcIix7b3JpZ2luYWxFdmVudDphfSl9KSx0aGlzLiRzZWxlY3Rpb24ub24oXCJmb2N1c1wiLGZ1bmN0aW9uKGEpe30pLHRoaXMuJHNlbGVjdGlvbi5vbihcImJsdXJcIixmdW5jdGlvbihhKXt9KSxhLm9uKFwiZm9jdXNcIixmdW5jdGlvbihiKXthLmlzT3BlbigpfHxjLiRzZWxlY3Rpb24uZm9jdXMoKX0pLGEub24oXCJzZWxlY3Rpb246dXBkYXRlXCIsZnVuY3Rpb24oYSl7Yy51cGRhdGUoYS5kYXRhKX0pfSxlLnByb3RvdHlwZS5jbGVhcj1mdW5jdGlvbigpe3RoaXMuJHNlbGVjdGlvbi5maW5kKFwiLnNlbGVjdDItc2VsZWN0aW9uX19yZW5kZXJlZFwiKS5lbXB0eSgpfSxlLnByb3RvdHlwZS5kaXNwbGF5PWZ1bmN0aW9uKGEsYil7dmFyIGM9dGhpcy5vcHRpb25zLmdldChcInRlbXBsYXRlU2VsZWN0aW9uXCIpLGQ9dGhpcy5vcHRpb25zLmdldChcImVzY2FwZU1hcmt1cFwiKTtyZXR1cm4gZChjKGEsYikpfSxlLnByb3RvdHlwZS5zZWxlY3Rpb25Db250YWluZXI9ZnVuY3Rpb24oKXtyZXR1cm4gYShcIjxzcGFuPjwvc3Bhbj5cIil9LGUucHJvdG90eXBlLnVwZGF0ZT1mdW5jdGlvbihhKXtpZigwPT09YS5sZW5ndGgpcmV0dXJuIHZvaWQgdGhpcy5jbGVhcigpO3ZhciBiPWFbMF0sYz10aGlzLiRzZWxlY3Rpb24uZmluZChcIi5zZWxlY3QyLXNlbGVjdGlvbl9fcmVuZGVyZWRcIiksZD10aGlzLmRpc3BsYXkoYixjKTtjLmVtcHR5KCkuYXBwZW5kKGQpLGMucHJvcChcInRpdGxlXCIsYi50aXRsZXx8Yi50ZXh0KX0sZX0pLGIuZGVmaW5lKFwic2VsZWN0Mi9zZWxlY3Rpb24vbXVsdGlwbGVcIixbXCJqcXVlcnlcIixcIi4vYmFzZVwiLFwiLi4vdXRpbHNcIl0sZnVuY3Rpb24oYSxiLGMpe2Z1bmN0aW9uIGQoYSxiKXtkLl9fc3VwZXJfXy5jb25zdHJ1Y3Rvci5hcHBseSh0aGlzLGFyZ3VtZW50cyl9cmV0dXJuIGMuRXh0ZW5kKGQsYiksZC5wcm90b3R5cGUucmVuZGVyPWZ1bmN0aW9uKCl7dmFyIGE9ZC5fX3N1cGVyX18ucmVuZGVyLmNhbGwodGhpcyk7cmV0dXJuIGEuYWRkQ2xhc3MoXCJzZWxlY3QyLXNlbGVjdGlvbi0tbXVsdGlwbGVcIiksYS5odG1sKCc8dWwgY2xhc3M9XCJzZWxlY3QyLXNlbGVjdGlvbl9fcmVuZGVyZWRcIj48L3VsPicpLGF9LGQucHJvdG90eXBlLmJpbmQ9ZnVuY3Rpb24oYixjKXt2YXIgZT10aGlzO2QuX19zdXBlcl9fLmJpbmQuYXBwbHkodGhpcyxhcmd1bWVudHMpLHRoaXMuJHNlbGVjdGlvbi5vbihcImNsaWNrXCIsZnVuY3Rpb24oYSl7ZS50cmlnZ2VyKFwidG9nZ2xlXCIse29yaWdpbmFsRXZlbnQ6YX0pfSksdGhpcy4kc2VsZWN0aW9uLm9uKFwiY2xpY2tcIixcIi5zZWxlY3QyLXNlbGVjdGlvbl9fY2hvaWNlX19yZW1vdmVcIixmdW5jdGlvbihiKXtpZighZS5vcHRpb25zLmdldChcImRpc2FibGVkXCIpKXt2YXIgYz1hKHRoaXMpLGQ9Yy5wYXJlbnQoKSxmPWQuZGF0YShcImRhdGFcIik7ZS50cmlnZ2VyKFwidW5zZWxlY3RcIix7b3JpZ2luYWxFdmVudDpiLGRhdGE6Zn0pfX0pfSxkLnByb3RvdHlwZS5jbGVhcj1mdW5jdGlvbigpe3RoaXMuJHNlbGVjdGlvbi5maW5kKFwiLnNlbGVjdDItc2VsZWN0aW9uX19yZW5kZXJlZFwiKS5lbXB0eSgpfSxkLnByb3RvdHlwZS5kaXNwbGF5PWZ1bmN0aW9uKGEsYil7dmFyIGM9dGhpcy5vcHRpb25zLmdldChcInRlbXBsYXRlU2VsZWN0aW9uXCIpLGQ9dGhpcy5vcHRpb25zLmdldChcImVzY2FwZU1hcmt1cFwiKTtyZXR1cm4gZChjKGEsYikpfSxkLnByb3RvdHlwZS5zZWxlY3Rpb25Db250YWluZXI9ZnVuY3Rpb24oKXt2YXIgYj1hKCc8bGkgY2xhc3M9XCJzZWxlY3QyLXNlbGVjdGlvbl9fY2hvaWNlXCI+PHNwYW4gY2xhc3M9XCJzZWxlY3QyLXNlbGVjdGlvbl9fY2hvaWNlX19yZW1vdmVcIiByb2xlPVwicHJlc2VudGF0aW9uXCI+JnRpbWVzOzwvc3Bhbj48L2xpPicpO3JldHVybiBifSxkLnByb3RvdHlwZS51cGRhdGU9ZnVuY3Rpb24oYSl7aWYodGhpcy5jbGVhcigpLDAhPT1hLmxlbmd0aCl7Zm9yKHZhciBiPVtdLGQ9MDtkPGEubGVuZ3RoO2QrKyl7dmFyIGU9YVtkXSxmPXRoaXMuc2VsZWN0aW9uQ29udGFpbmVyKCksZz10aGlzLmRpc3BsYXkoZSxmKTtmLmFwcGVuZChnKSxmLnByb3AoXCJ0aXRsZVwiLGUudGl0bGV8fGUudGV4dCksZi5kYXRhKFwiZGF0YVwiLGUpLGIucHVzaChmKX12YXIgaD10aGlzLiRzZWxlY3Rpb24uZmluZChcIi5zZWxlY3QyLXNlbGVjdGlvbl9fcmVuZGVyZWRcIik7Yy5hcHBlbmRNYW55KGgsYil9fSxkfSksYi5kZWZpbmUoXCJzZWxlY3QyL3NlbGVjdGlvbi9wbGFjZWhvbGRlclwiLFtcIi4uL3V0aWxzXCJdLGZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYSxiLGMpe3RoaXMucGxhY2Vob2xkZXI9dGhpcy5ub3JtYWxpemVQbGFjZWhvbGRlcihjLmdldChcInBsYWNlaG9sZGVyXCIpKSxhLmNhbGwodGhpcyxiLGMpfXJldHVybiBiLnByb3RvdHlwZS5ub3JtYWxpemVQbGFjZWhvbGRlcj1mdW5jdGlvbihhLGIpe3JldHVyblwic3RyaW5nXCI9PXR5cGVvZiBiJiYoYj17aWQ6XCJcIix0ZXh0OmJ9KSxifSxiLnByb3RvdHlwZS5jcmVhdGVQbGFjZWhvbGRlcj1mdW5jdGlvbihhLGIpe3ZhciBjPXRoaXMuc2VsZWN0aW9uQ29udGFpbmVyKCk7cmV0dXJuIGMuaHRtbCh0aGlzLmRpc3BsYXkoYikpLGMuYWRkQ2xhc3MoXCJzZWxlY3QyLXNlbGVjdGlvbl9fcGxhY2Vob2xkZXJcIikucmVtb3ZlQ2xhc3MoXCJzZWxlY3QyLXNlbGVjdGlvbl9fY2hvaWNlXCIpLGN9LGIucHJvdG90eXBlLnVwZGF0ZT1mdW5jdGlvbihhLGIpe3ZhciBjPTE9PWIubGVuZ3RoJiZiWzBdLmlkIT10aGlzLnBsYWNlaG9sZGVyLmlkLGQ9Yi5sZW5ndGg+MTtpZihkfHxjKXJldHVybiBhLmNhbGwodGhpcyxiKTt0aGlzLmNsZWFyKCk7dmFyIGU9dGhpcy5jcmVhdGVQbGFjZWhvbGRlcih0aGlzLnBsYWNlaG9sZGVyKTt0aGlzLiRzZWxlY3Rpb24uZmluZChcIi5zZWxlY3QyLXNlbGVjdGlvbl9fcmVuZGVyZWRcIikuYXBwZW5kKGUpfSxifSksYi5kZWZpbmUoXCJzZWxlY3QyL3NlbGVjdGlvbi9hbGxvd0NsZWFyXCIsW1wianF1ZXJ5XCIsXCIuLi9rZXlzXCJdLGZ1bmN0aW9uKGEsYil7ZnVuY3Rpb24gYygpe31yZXR1cm4gYy5wcm90b3R5cGUuYmluZD1mdW5jdGlvbihhLGIsYyl7dmFyIGQ9dGhpczthLmNhbGwodGhpcyxiLGMpLG51bGw9PXRoaXMucGxhY2Vob2xkZXImJnRoaXMub3B0aW9ucy5nZXQoXCJkZWJ1Z1wiKSYmd2luZG93LmNvbnNvbGUmJmNvbnNvbGUuZXJyb3ImJmNvbnNvbGUuZXJyb3IoXCJTZWxlY3QyOiBUaGUgYGFsbG93Q2xlYXJgIG9wdGlvbiBzaG91bGQgYmUgdXNlZCBpbiBjb21iaW5hdGlvbiB3aXRoIHRoZSBgcGxhY2Vob2xkZXJgIG9wdGlvbi5cIiksdGhpcy4kc2VsZWN0aW9uLm9uKFwibW91c2Vkb3duXCIsXCIuc2VsZWN0Mi1zZWxlY3Rpb25fX2NsZWFyXCIsZnVuY3Rpb24oYSl7ZC5faGFuZGxlQ2xlYXIoYSl9KSxiLm9uKFwia2V5cHJlc3NcIixmdW5jdGlvbihhKXtkLl9oYW5kbGVLZXlib2FyZENsZWFyKGEsYil9KX0sYy5wcm90b3R5cGUuX2hhbmRsZUNsZWFyPWZ1bmN0aW9uKGEsYil7aWYoIXRoaXMub3B0aW9ucy5nZXQoXCJkaXNhYmxlZFwiKSl7dmFyIGM9dGhpcy4kc2VsZWN0aW9uLmZpbmQoXCIuc2VsZWN0Mi1zZWxlY3Rpb25fX2NsZWFyXCIpO2lmKDAhPT1jLmxlbmd0aCl7Yi5zdG9wUHJvcGFnYXRpb24oKTtmb3IodmFyIGQ9Yy5kYXRhKFwiZGF0YVwiKSxlPTA7ZTxkLmxlbmd0aDtlKyspe3ZhciBmPXtkYXRhOmRbZV19O2lmKHRoaXMudHJpZ2dlcihcInVuc2VsZWN0XCIsZiksZi5wcmV2ZW50ZWQpcmV0dXJufXRoaXMuJGVsZW1lbnQudmFsKHRoaXMucGxhY2Vob2xkZXIuaWQpLnRyaWdnZXIoXCJjaGFuZ2VcIiksdGhpcy50cmlnZ2VyKFwidG9nZ2xlXCIse30pfX19LGMucHJvdG90eXBlLl9oYW5kbGVLZXlib2FyZENsZWFyPWZ1bmN0aW9uKGEsYyxkKXtkLmlzT3BlbigpfHwoYy53aGljaD09Yi5ERUxFVEV8fGMud2hpY2g9PWIuQkFDS1NQQUNFKSYmdGhpcy5faGFuZGxlQ2xlYXIoYyl9LGMucHJvdG90eXBlLnVwZGF0ZT1mdW5jdGlvbihiLGMpe2lmKGIuY2FsbCh0aGlzLGMpLCEodGhpcy4kc2VsZWN0aW9uLmZpbmQoXCIuc2VsZWN0Mi1zZWxlY3Rpb25fX3BsYWNlaG9sZGVyXCIpLmxlbmd0aD4wfHwwPT09Yy5sZW5ndGgpKXt2YXIgZD1hKCc8c3BhbiBjbGFzcz1cInNlbGVjdDItc2VsZWN0aW9uX19jbGVhclwiPiZ0aW1lczs8L3NwYW4+Jyk7ZC5kYXRhKFwiZGF0YVwiLGMpLHRoaXMuJHNlbGVjdGlvbi5maW5kKFwiLnNlbGVjdDItc2VsZWN0aW9uX19yZW5kZXJlZFwiKS5wcmVwZW5kKGQpfX0sY30pLGIuZGVmaW5lKFwic2VsZWN0Mi9zZWxlY3Rpb24vc2VhcmNoXCIsW1wianF1ZXJ5XCIsXCIuLi91dGlsc1wiLFwiLi4va2V5c1wiXSxmdW5jdGlvbihhLGIsYyl7ZnVuY3Rpb24gZChhLGIsYyl7YS5jYWxsKHRoaXMsYixjKX1yZXR1cm4gZC5wcm90b3R5cGUucmVuZGVyPWZ1bmN0aW9uKGIpe3ZhciBjPWEoJzxsaSBjbGFzcz1cInNlbGVjdDItc2VhcmNoIHNlbGVjdDItc2VhcmNoLS1pbmxpbmVcIj48aW5wdXQgY2xhc3M9XCJzZWxlY3QyLXNlYXJjaF9fZmllbGRcIiB0eXBlPVwic2VhcmNoXCIgdGFiaW5kZXg9XCItMVwiIGF1dG9jb21wbGV0ZT1cIm9mZlwiIGF1dG9jb3JyZWN0PVwib2ZmXCIgYXV0b2NhcGl0YWxpemU9XCJvZmZcIiBzcGVsbGNoZWNrPVwiZmFsc2VcIiByb2xlPVwidGV4dGJveFwiIGFyaWEtYXV0b2NvbXBsZXRlPVwibGlzdFwiIC8+PC9saT4nKTt0aGlzLiRzZWFyY2hDb250YWluZXI9Yyx0aGlzLiRzZWFyY2g9Yy5maW5kKFwiaW5wdXRcIik7dmFyIGQ9Yi5jYWxsKHRoaXMpO3JldHVybiB0aGlzLl90cmFuc2ZlclRhYkluZGV4KCksZH0sZC5wcm90b3R5cGUuYmluZD1mdW5jdGlvbihhLGIsZCl7dmFyIGU9dGhpczthLmNhbGwodGhpcyxiLGQpLGIub24oXCJvcGVuXCIsZnVuY3Rpb24oKXtlLiRzZWFyY2gudHJpZ2dlcihcImZvY3VzXCIpfSksYi5vbihcImNsb3NlXCIsZnVuY3Rpb24oKXtlLiRzZWFyY2gudmFsKFwiXCIpLGUuJHNlYXJjaC5yZW1vdmVBdHRyKFwiYXJpYS1hY3RpdmVkZXNjZW5kYW50XCIpLGUuJHNlYXJjaC50cmlnZ2VyKFwiZm9jdXNcIil9KSxiLm9uKFwiZW5hYmxlXCIsZnVuY3Rpb24oKXtlLiRzZWFyY2gucHJvcChcImRpc2FibGVkXCIsITEpLGUuX3RyYW5zZmVyVGFiSW5kZXgoKX0pLGIub24oXCJkaXNhYmxlXCIsZnVuY3Rpb24oKXtlLiRzZWFyY2gucHJvcChcImRpc2FibGVkXCIsITApfSksYi5vbihcImZvY3VzXCIsZnVuY3Rpb24oYSl7ZS4kc2VhcmNoLnRyaWdnZXIoXCJmb2N1c1wiKX0pLGIub24oXCJyZXN1bHRzOmZvY3VzXCIsZnVuY3Rpb24oYSl7ZS4kc2VhcmNoLmF0dHIoXCJhcmlhLWFjdGl2ZWRlc2NlbmRhbnRcIixhLmlkKX0pLHRoaXMuJHNlbGVjdGlvbi5vbihcImZvY3VzaW5cIixcIi5zZWxlY3QyLXNlYXJjaC0taW5saW5lXCIsZnVuY3Rpb24oYSl7ZS50cmlnZ2VyKFwiZm9jdXNcIixhKX0pLHRoaXMuJHNlbGVjdGlvbi5vbihcImZvY3Vzb3V0XCIsXCIuc2VsZWN0Mi1zZWFyY2gtLWlubGluZVwiLGZ1bmN0aW9uKGEpe2UuX2hhbmRsZUJsdXIoYSl9KSx0aGlzLiRzZWxlY3Rpb24ub24oXCJrZXlkb3duXCIsXCIuc2VsZWN0Mi1zZWFyY2gtLWlubGluZVwiLGZ1bmN0aW9uKGEpe2Euc3RvcFByb3BhZ2F0aW9uKCksZS50cmlnZ2VyKFwia2V5cHJlc3NcIixhKSxlLl9rZXlVcFByZXZlbnRlZD1hLmlzRGVmYXVsdFByZXZlbnRlZCgpO3ZhciBiPWEud2hpY2g7aWYoYj09PWMuQkFDS1NQQUNFJiZcIlwiPT09ZS4kc2VhcmNoLnZhbCgpKXt2YXIgZD1lLiRzZWFyY2hDb250YWluZXIucHJldihcIi5zZWxlY3QyLXNlbGVjdGlvbl9fY2hvaWNlXCIpO2lmKGQubGVuZ3RoPjApe3ZhciBmPWQuZGF0YShcImRhdGFcIik7ZS5zZWFyY2hSZW1vdmVDaG9pY2UoZiksYS5wcmV2ZW50RGVmYXVsdCgpfX19KTt2YXIgZj1kb2N1bWVudC5kb2N1bWVudE1vZGUsZz1mJiYxMT49Zjt0aGlzLiRzZWxlY3Rpb24ub24oXCJpbnB1dC5zZWFyY2hjaGVja1wiLFwiLnNlbGVjdDItc2VhcmNoLS1pbmxpbmVcIixmdW5jdGlvbihhKXtyZXR1cm4gZz92b2lkIGUuJHNlbGVjdGlvbi5vZmYoXCJpbnB1dC5zZWFyY2ggaW5wdXQuc2VhcmNoY2hlY2tcIik6dm9pZCBlLiRzZWxlY3Rpb24ub2ZmKFwia2V5dXAuc2VhcmNoXCIpfSksdGhpcy4kc2VsZWN0aW9uLm9uKFwia2V5dXAuc2VhcmNoIGlucHV0LnNlYXJjaFwiLFwiLnNlbGVjdDItc2VhcmNoLS1pbmxpbmVcIixmdW5jdGlvbihhKXtpZihnJiZcImlucHV0XCI9PT1hLnR5cGUpcmV0dXJuIHZvaWQgZS4kc2VsZWN0aW9uLm9mZihcImlucHV0LnNlYXJjaCBpbnB1dC5zZWFyY2hjaGVja1wiKTt2YXIgYj1hLndoaWNoO2IhPWMuU0hJRlQmJmIhPWMuQ1RSTCYmYiE9Yy5BTFQmJmIhPWMuVEFCJiZlLmhhbmRsZVNlYXJjaChhKX0pfSxkLnByb3RvdHlwZS5fdHJhbnNmZXJUYWJJbmRleD1mdW5jdGlvbihhKXt0aGlzLiRzZWFyY2guYXR0cihcInRhYmluZGV4XCIsdGhpcy4kc2VsZWN0aW9uLmF0dHIoXCJ0YWJpbmRleFwiKSksdGhpcy4kc2VsZWN0aW9uLmF0dHIoXCJ0YWJpbmRleFwiLFwiLTFcIil9LGQucHJvdG90eXBlLmNyZWF0ZVBsYWNlaG9sZGVyPWZ1bmN0aW9uKGEsYil7dGhpcy4kc2VhcmNoLmF0dHIoXCJwbGFjZWhvbGRlclwiLGIudGV4dCl9LGQucHJvdG90eXBlLnVwZGF0ZT1mdW5jdGlvbihhLGIpe3ZhciBjPXRoaXMuJHNlYXJjaFswXT09ZG9jdW1lbnQuYWN0aXZlRWxlbWVudDt0aGlzLiRzZWFyY2guYXR0cihcInBsYWNlaG9sZGVyXCIsXCJcIiksYS5jYWxsKHRoaXMsYiksdGhpcy4kc2VsZWN0aW9uLmZpbmQoXCIuc2VsZWN0Mi1zZWxlY3Rpb25fX3JlbmRlcmVkXCIpLmFwcGVuZCh0aGlzLiRzZWFyY2hDb250YWluZXIpLHRoaXMucmVzaXplU2VhcmNoKCksYyYmdGhpcy4kc2VhcmNoLmZvY3VzKCl9LGQucHJvdG90eXBlLmhhbmRsZVNlYXJjaD1mdW5jdGlvbigpe2lmKHRoaXMucmVzaXplU2VhcmNoKCksIXRoaXMuX2tleVVwUHJldmVudGVkKXt2YXIgYT10aGlzLiRzZWFyY2gudmFsKCk7dGhpcy50cmlnZ2VyKFwicXVlcnlcIix7dGVybTphfSl9dGhpcy5fa2V5VXBQcmV2ZW50ZWQ9ITF9LGQucHJvdG90eXBlLnNlYXJjaFJlbW92ZUNob2ljZT1mdW5jdGlvbihhLGIpe3RoaXMudHJpZ2dlcihcInVuc2VsZWN0XCIse2RhdGE6Yn0pLHRoaXMuJHNlYXJjaC52YWwoYi50ZXh0KSx0aGlzLmhhbmRsZVNlYXJjaCgpfSxkLnByb3RvdHlwZS5yZXNpemVTZWFyY2g9ZnVuY3Rpb24oKXt0aGlzLiRzZWFyY2guY3NzKFwid2lkdGhcIixcIjI1cHhcIik7dmFyIGE9XCJcIjtpZihcIlwiIT09dGhpcy4kc2VhcmNoLmF0dHIoXCJwbGFjZWhvbGRlclwiKSlhPXRoaXMuJHNlbGVjdGlvbi5maW5kKFwiLnNlbGVjdDItc2VsZWN0aW9uX19yZW5kZXJlZFwiKS5pbm5lcldpZHRoKCk7ZWxzZXt2YXIgYj10aGlzLiRzZWFyY2gudmFsKCkubGVuZ3RoKzE7YT0uNzUqYitcImVtXCJ9dGhpcy4kc2VhcmNoLmNzcyhcIndpZHRoXCIsYSl9LGR9KSxiLmRlZmluZShcInNlbGVjdDIvc2VsZWN0aW9uL2V2ZW50UmVsYXlcIixbXCJqcXVlcnlcIl0sZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYigpe31yZXR1cm4gYi5wcm90b3R5cGUuYmluZD1mdW5jdGlvbihiLGMsZCl7dmFyIGU9dGhpcyxmPVtcIm9wZW5cIixcIm9wZW5pbmdcIixcImNsb3NlXCIsXCJjbG9zaW5nXCIsXCJzZWxlY3RcIixcInNlbGVjdGluZ1wiLFwidW5zZWxlY3RcIixcInVuc2VsZWN0aW5nXCJdLGc9W1wib3BlbmluZ1wiLFwiY2xvc2luZ1wiLFwic2VsZWN0aW5nXCIsXCJ1bnNlbGVjdGluZ1wiXTtiLmNhbGwodGhpcyxjLGQpLGMub24oXCIqXCIsZnVuY3Rpb24oYixjKXtpZigtMSE9PWEuaW5BcnJheShiLGYpKXtjPWN8fHt9O3ZhciBkPWEuRXZlbnQoXCJzZWxlY3QyOlwiK2Ise3BhcmFtczpjfSk7ZS4kZWxlbWVudC50cmlnZ2VyKGQpLC0xIT09YS5pbkFycmF5KGIsZykmJihjLnByZXZlbnRlZD1kLmlzRGVmYXVsdFByZXZlbnRlZCgpKX19KX0sYn0pLGIuZGVmaW5lKFwic2VsZWN0Mi90cmFuc2xhdGlvblwiLFtcImpxdWVyeVwiLFwicmVxdWlyZVwiXSxmdW5jdGlvbihhLGIpe2Z1bmN0aW9uIGMoYSl7dGhpcy5kaWN0PWF8fHt9fXJldHVybiBjLnByb3RvdHlwZS5hbGw9ZnVuY3Rpb24oKXtyZXR1cm4gdGhpcy5kaWN0fSxjLnByb3RvdHlwZS5nZXQ9ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMuZGljdFthXX0sYy5wcm90b3R5cGUuZXh0ZW5kPWZ1bmN0aW9uKGIpe3RoaXMuZGljdD1hLmV4dGVuZCh7fSxiLmFsbCgpLHRoaXMuZGljdCl9LGMuX2NhY2hlPXt9LGMubG9hZFBhdGg9ZnVuY3Rpb24oYSl7aWYoIShhIGluIGMuX2NhY2hlKSl7dmFyIGQ9YihhKTtjLl9jYWNoZVthXT1kfXJldHVybiBuZXcgYyhjLl9jYWNoZVthXSl9LGN9KSxiLmRlZmluZShcInNlbGVjdDIvZGlhY3JpdGljc1wiLFtdLGZ1bmN0aW9uKCl7dmFyIGE9e1wi4pK2XCI6XCJBXCIsXCLvvKFcIjpcIkFcIixcIsOAXCI6XCJBXCIsXCLDgVwiOlwiQVwiLFwiw4JcIjpcIkFcIixcIuG6plwiOlwiQVwiLFwi4bqkXCI6XCJBXCIsXCLhuqpcIjpcIkFcIixcIuG6qFwiOlwiQVwiLFwiw4NcIjpcIkFcIixcIsSAXCI6XCJBXCIsXCLEglwiOlwiQVwiLFwi4bqwXCI6XCJBXCIsXCLhuq5cIjpcIkFcIixcIuG6tFwiOlwiQVwiLFwi4bqyXCI6XCJBXCIsXCLIplwiOlwiQVwiLFwix6BcIjpcIkFcIixcIsOEXCI6XCJBXCIsXCLHnlwiOlwiQVwiLFwi4bqiXCI6XCJBXCIsXCLDhVwiOlwiQVwiLFwix7pcIjpcIkFcIixcIseNXCI6XCJBXCIsXCLIgFwiOlwiQVwiLFwiyIJcIjpcIkFcIixcIuG6oFwiOlwiQVwiLFwi4bqsXCI6XCJBXCIsXCLhurZcIjpcIkFcIixcIuG4gFwiOlwiQVwiLFwixIRcIjpcIkFcIixcIsi6XCI6XCJBXCIsXCLisa9cIjpcIkFcIixcIuqcslwiOlwiQUFcIixcIsOGXCI6XCJBRVwiLFwix7xcIjpcIkFFXCIsXCLHolwiOlwiQUVcIixcIuqctFwiOlwiQU9cIixcIuqctlwiOlwiQVVcIixcIuqcuFwiOlwiQVZcIixcIuqculwiOlwiQVZcIixcIuqcvFwiOlwiQVlcIixcIuKSt1wiOlwiQlwiLFwi77yiXCI6XCJCXCIsXCLhuIJcIjpcIkJcIixcIuG4hFwiOlwiQlwiLFwi4biGXCI6XCJCXCIsXCLJg1wiOlwiQlwiLFwixoJcIjpcIkJcIixcIsaBXCI6XCJCXCIsXCLikrhcIjpcIkNcIixcIu+8o1wiOlwiQ1wiLFwixIZcIjpcIkNcIixcIsSIXCI6XCJDXCIsXCLEilwiOlwiQ1wiLFwixIxcIjpcIkNcIixcIsOHXCI6XCJDXCIsXCLhuIhcIjpcIkNcIixcIsaHXCI6XCJDXCIsXCLIu1wiOlwiQ1wiLFwi6py+XCI6XCJDXCIsXCLikrlcIjpcIkRcIixcIu+8pFwiOlwiRFwiLFwi4biKXCI6XCJEXCIsXCLEjlwiOlwiRFwiLFwi4biMXCI6XCJEXCIsXCLhuJBcIjpcIkRcIixcIuG4klwiOlwiRFwiLFwi4biOXCI6XCJEXCIsXCLEkFwiOlwiRFwiLFwixotcIjpcIkRcIixcIsaKXCI6XCJEXCIsXCLGiVwiOlwiRFwiLFwi6p25XCI6XCJEXCIsXCLHsVwiOlwiRFpcIixcIseEXCI6XCJEWlwiLFwix7JcIjpcIkR6XCIsXCLHhVwiOlwiRHpcIixcIuKSulwiOlwiRVwiLFwi77ylXCI6XCJFXCIsXCLDiFwiOlwiRVwiLFwiw4lcIjpcIkVcIixcIsOKXCI6XCJFXCIsXCLhu4BcIjpcIkVcIixcIuG6vlwiOlwiRVwiLFwi4buEXCI6XCJFXCIsXCLhu4JcIjpcIkVcIixcIuG6vFwiOlwiRVwiLFwixJJcIjpcIkVcIixcIuG4lFwiOlwiRVwiLFwi4biWXCI6XCJFXCIsXCLElFwiOlwiRVwiLFwixJZcIjpcIkVcIixcIsOLXCI6XCJFXCIsXCLhurpcIjpcIkVcIixcIsSaXCI6XCJFXCIsXCLIhFwiOlwiRVwiLFwiyIZcIjpcIkVcIixcIuG6uFwiOlwiRVwiLFwi4buGXCI6XCJFXCIsXCLIqFwiOlwiRVwiLFwi4bicXCI6XCJFXCIsXCLEmFwiOlwiRVwiLFwi4biYXCI6XCJFXCIsXCLhuJpcIjpcIkVcIixcIsaQXCI6XCJFXCIsXCLGjlwiOlwiRVwiLFwi4pK7XCI6XCJGXCIsXCLvvKZcIjpcIkZcIixcIuG4nlwiOlwiRlwiLFwixpFcIjpcIkZcIixcIuqdu1wiOlwiRlwiLFwi4pK8XCI6XCJHXCIsXCLvvKdcIjpcIkdcIixcIse0XCI6XCJHXCIsXCLEnFwiOlwiR1wiLFwi4bigXCI6XCJHXCIsXCLEnlwiOlwiR1wiLFwixKBcIjpcIkdcIixcIsemXCI6XCJHXCIsXCLEolwiOlwiR1wiLFwix6RcIjpcIkdcIixcIsaTXCI6XCJHXCIsXCLqnqBcIjpcIkdcIixcIuqdvVwiOlwiR1wiLFwi6p2+XCI6XCJHXCIsXCLikr1cIjpcIkhcIixcIu+8qFwiOlwiSFwiLFwixKRcIjpcIkhcIixcIuG4olwiOlwiSFwiLFwi4bimXCI6XCJIXCIsXCLInlwiOlwiSFwiLFwi4bikXCI6XCJIXCIsXCLhuKhcIjpcIkhcIixcIuG4qlwiOlwiSFwiLFwixKZcIjpcIkhcIixcIuKxp1wiOlwiSFwiLFwi4rG1XCI6XCJIXCIsXCLqno1cIjpcIkhcIixcIuKSvlwiOlwiSVwiLFwi77ypXCI6XCJJXCIsXCLDjFwiOlwiSVwiLFwiw41cIjpcIklcIixcIsOOXCI6XCJJXCIsXCLEqFwiOlwiSVwiLFwixKpcIjpcIklcIixcIsSsXCI6XCJJXCIsXCLEsFwiOlwiSVwiLFwiw49cIjpcIklcIixcIuG4rlwiOlwiSVwiLFwi4buIXCI6XCJJXCIsXCLHj1wiOlwiSVwiLFwiyIhcIjpcIklcIixcIsiKXCI6XCJJXCIsXCLhu4pcIjpcIklcIixcIsSuXCI6XCJJXCIsXCLhuKxcIjpcIklcIixcIsaXXCI6XCJJXCIsXCLikr9cIjpcIkpcIixcIu+8qlwiOlwiSlwiLFwixLRcIjpcIkpcIixcIsmIXCI6XCJKXCIsXCLik4BcIjpcIktcIixcIu+8q1wiOlwiS1wiLFwi4biwXCI6XCJLXCIsXCLHqFwiOlwiS1wiLFwi4biyXCI6XCJLXCIsXCLEtlwiOlwiS1wiLFwi4bi0XCI6XCJLXCIsXCLGmFwiOlwiS1wiLFwi4rGpXCI6XCJLXCIsXCLqnYBcIjpcIktcIixcIuqdglwiOlwiS1wiLFwi6p2EXCI6XCJLXCIsXCLqnqJcIjpcIktcIixcIuKTgVwiOlwiTFwiLFwi77ysXCI6XCJMXCIsXCLEv1wiOlwiTFwiLFwixLlcIjpcIkxcIixcIsS9XCI6XCJMXCIsXCLhuLZcIjpcIkxcIixcIuG4uFwiOlwiTFwiLFwixLtcIjpcIkxcIixcIuG4vFwiOlwiTFwiLFwi4bi6XCI6XCJMXCIsXCLFgVwiOlwiTFwiLFwiyL1cIjpcIkxcIixcIuKxolwiOlwiTFwiLFwi4rGgXCI6XCJMXCIsXCLqnYhcIjpcIkxcIixcIuqdhlwiOlwiTFwiLFwi6p6AXCI6XCJMXCIsXCLHh1wiOlwiTEpcIixcIseIXCI6XCJMalwiLFwi4pOCXCI6XCJNXCIsXCLvvK1cIjpcIk1cIixcIuG4vlwiOlwiTVwiLFwi4bmAXCI6XCJNXCIsXCLhuYJcIjpcIk1cIixcIuKxrlwiOlwiTVwiLFwixpxcIjpcIk1cIixcIuKTg1wiOlwiTlwiLFwi77yuXCI6XCJOXCIsXCLHuFwiOlwiTlwiLFwixYNcIjpcIk5cIixcIsORXCI6XCJOXCIsXCLhuYRcIjpcIk5cIixcIsWHXCI6XCJOXCIsXCLhuYZcIjpcIk5cIixcIsWFXCI6XCJOXCIsXCLhuYpcIjpcIk5cIixcIuG5iFwiOlwiTlwiLFwiyKBcIjpcIk5cIixcIsadXCI6XCJOXCIsXCLqnpBcIjpcIk5cIixcIuqepFwiOlwiTlwiLFwix4pcIjpcIk5KXCIsXCLHi1wiOlwiTmpcIixcIuKThFwiOlwiT1wiLFwi77yvXCI6XCJPXCIsXCLDklwiOlwiT1wiLFwiw5NcIjpcIk9cIixcIsOUXCI6XCJPXCIsXCLhu5JcIjpcIk9cIixcIuG7kFwiOlwiT1wiLFwi4buWXCI6XCJPXCIsXCLhu5RcIjpcIk9cIixcIsOVXCI6XCJPXCIsXCLhuYxcIjpcIk9cIixcIsisXCI6XCJPXCIsXCLhuY5cIjpcIk9cIixcIsWMXCI6XCJPXCIsXCLhuZBcIjpcIk9cIixcIuG5klwiOlwiT1wiLFwixY5cIjpcIk9cIixcIsiuXCI6XCJPXCIsXCLIsFwiOlwiT1wiLFwiw5ZcIjpcIk9cIixcIsiqXCI6XCJPXCIsXCLhu45cIjpcIk9cIixcIsWQXCI6XCJPXCIsXCLHkVwiOlwiT1wiLFwiyIxcIjpcIk9cIixcIsiOXCI6XCJPXCIsXCLGoFwiOlwiT1wiLFwi4bucXCI6XCJPXCIsXCLhu5pcIjpcIk9cIixcIuG7oFwiOlwiT1wiLFwi4bueXCI6XCJPXCIsXCLhu6JcIjpcIk9cIixcIuG7jFwiOlwiT1wiLFwi4buYXCI6XCJPXCIsXCLHqlwiOlwiT1wiLFwix6xcIjpcIk9cIixcIsOYXCI6XCJPXCIsXCLHvlwiOlwiT1wiLFwixoZcIjpcIk9cIixcIsafXCI6XCJPXCIsXCLqnYpcIjpcIk9cIixcIuqdjFwiOlwiT1wiLFwixqJcIjpcIk9JXCIsXCLqnY5cIjpcIk9PXCIsXCLIolwiOlwiT1VcIixcIuKThVwiOlwiUFwiLFwi77ywXCI6XCJQXCIsXCLhuZRcIjpcIlBcIixcIuG5llwiOlwiUFwiLFwixqRcIjpcIlBcIixcIuKxo1wiOlwiUFwiLFwi6p2QXCI6XCJQXCIsXCLqnZJcIjpcIlBcIixcIuqdlFwiOlwiUFwiLFwi4pOGXCI6XCJRXCIsXCLvvLFcIjpcIlFcIixcIuqdllwiOlwiUVwiLFwi6p2YXCI6XCJRXCIsXCLJilwiOlwiUVwiLFwi4pOHXCI6XCJSXCIsXCLvvLJcIjpcIlJcIixcIsWUXCI6XCJSXCIsXCLhuZhcIjpcIlJcIixcIsWYXCI6XCJSXCIsXCLIkFwiOlwiUlwiLFwiyJJcIjpcIlJcIixcIuG5mlwiOlwiUlwiLFwi4bmcXCI6XCJSXCIsXCLFllwiOlwiUlwiLFwi4bmeXCI6XCJSXCIsXCLJjFwiOlwiUlwiLFwi4rGkXCI6XCJSXCIsXCLqnZpcIjpcIlJcIixcIuqeplwiOlwiUlwiLFwi6p6CXCI6XCJSXCIsXCLik4hcIjpcIlNcIixcIu+8s1wiOlwiU1wiLFwi4bqeXCI6XCJTXCIsXCLFmlwiOlwiU1wiLFwi4bmkXCI6XCJTXCIsXCLFnFwiOlwiU1wiLFwi4bmgXCI6XCJTXCIsXCLFoFwiOlwiU1wiLFwi4bmmXCI6XCJTXCIsXCLhuaJcIjpcIlNcIixcIuG5qFwiOlwiU1wiLFwiyJhcIjpcIlNcIixcIsWeXCI6XCJTXCIsXCLisb5cIjpcIlNcIixcIuqeqFwiOlwiU1wiLFwi6p6EXCI6XCJTXCIsXCLik4lcIjpcIlRcIixcIu+8tFwiOlwiVFwiLFwi4bmqXCI6XCJUXCIsXCLFpFwiOlwiVFwiLFwi4bmsXCI6XCJUXCIsXCLImlwiOlwiVFwiLFwixaJcIjpcIlRcIixcIuG5sFwiOlwiVFwiLFwi4bmuXCI6XCJUXCIsXCLFplwiOlwiVFwiLFwixqxcIjpcIlRcIixcIsauXCI6XCJUXCIsXCLIvlwiOlwiVFwiLFwi6p6GXCI6XCJUXCIsXCLqnKhcIjpcIlRaXCIsXCLik4pcIjpcIlVcIixcIu+8tVwiOlwiVVwiLFwiw5lcIjpcIlVcIixcIsOaXCI6XCJVXCIsXCLDm1wiOlwiVVwiLFwixahcIjpcIlVcIixcIuG5uFwiOlwiVVwiLFwixapcIjpcIlVcIixcIuG5ulwiOlwiVVwiLFwixaxcIjpcIlVcIixcIsOcXCI6XCJVXCIsXCLHm1wiOlwiVVwiLFwix5dcIjpcIlVcIixcIseVXCI6XCJVXCIsXCLHmVwiOlwiVVwiLFwi4bumXCI6XCJVXCIsXCLFrlwiOlwiVVwiLFwixbBcIjpcIlVcIixcIseTXCI6XCJVXCIsXCLIlFwiOlwiVVwiLFwiyJZcIjpcIlVcIixcIsavXCI6XCJVXCIsXCLhu6pcIjpcIlVcIixcIuG7qFwiOlwiVVwiLFwi4buuXCI6XCJVXCIsXCLhu6xcIjpcIlVcIixcIuG7sFwiOlwiVVwiLFwi4bukXCI6XCJVXCIsXCLhubJcIjpcIlVcIixcIsWyXCI6XCJVXCIsXCLhubZcIjpcIlVcIixcIuG5tFwiOlwiVVwiLFwiyYRcIjpcIlVcIixcIuKTi1wiOlwiVlwiLFwi77y2XCI6XCJWXCIsXCLhubxcIjpcIlZcIixcIuG5vlwiOlwiVlwiLFwixrJcIjpcIlZcIixcIuqdnlwiOlwiVlwiLFwiyYVcIjpcIlZcIixcIuqdoFwiOlwiVllcIixcIuKTjFwiOlwiV1wiLFwi77y3XCI6XCJXXCIsXCLhuoBcIjpcIldcIixcIuG6glwiOlwiV1wiLFwixbRcIjpcIldcIixcIuG6hlwiOlwiV1wiLFwi4bqEXCI6XCJXXCIsXCLhuohcIjpcIldcIixcIuKxslwiOlwiV1wiLFwi4pONXCI6XCJYXCIsXCLvvLhcIjpcIlhcIixcIuG6ilwiOlwiWFwiLFwi4bqMXCI6XCJYXCIsXCLik45cIjpcIllcIixcIu+8uVwiOlwiWVwiLFwi4buyXCI6XCJZXCIsXCLDnVwiOlwiWVwiLFwixbZcIjpcIllcIixcIuG7uFwiOlwiWVwiLFwiyLJcIjpcIllcIixcIuG6jlwiOlwiWVwiLFwixbhcIjpcIllcIixcIuG7tlwiOlwiWVwiLFwi4bu0XCI6XCJZXCIsXCLGs1wiOlwiWVwiLFwiyY5cIjpcIllcIixcIuG7vlwiOlwiWVwiLFwi4pOPXCI6XCJaXCIsXCLvvLpcIjpcIlpcIixcIsW5XCI6XCJaXCIsXCLhupBcIjpcIlpcIixcIsW7XCI6XCJaXCIsXCLFvVwiOlwiWlwiLFwi4bqSXCI6XCJaXCIsXCLhupRcIjpcIlpcIixcIsa1XCI6XCJaXCIsXCLIpFwiOlwiWlwiLFwi4rG/XCI6XCJaXCIsXCLisatcIjpcIlpcIixcIuqdolwiOlwiWlwiLFwi4pOQXCI6XCJhXCIsXCLvvYFcIjpcImFcIixcIuG6mlwiOlwiYVwiLFwiw6BcIjpcImFcIixcIsOhXCI6XCJhXCIsXCLDolwiOlwiYVwiLFwi4bqnXCI6XCJhXCIsXCLhuqVcIjpcImFcIixcIuG6q1wiOlwiYVwiLFwi4bqpXCI6XCJhXCIsXCLDo1wiOlwiYVwiLFwixIFcIjpcImFcIixcIsSDXCI6XCJhXCIsXCLhurFcIjpcImFcIixcIuG6r1wiOlwiYVwiLFwi4bq1XCI6XCJhXCIsXCLhurNcIjpcImFcIixcIsinXCI6XCJhXCIsXCLHoVwiOlwiYVwiLFwiw6RcIjpcImFcIixcIsefXCI6XCJhXCIsXCLhuqNcIjpcImFcIixcIsOlXCI6XCJhXCIsXCLHu1wiOlwiYVwiLFwix45cIjpcImFcIixcIsiBXCI6XCJhXCIsXCLIg1wiOlwiYVwiLFwi4bqhXCI6XCJhXCIsXCLhuq1cIjpcImFcIixcIuG6t1wiOlwiYVwiLFwi4biBXCI6XCJhXCIsXCLEhVwiOlwiYVwiLFwi4rGlXCI6XCJhXCIsXCLJkFwiOlwiYVwiLFwi6pyzXCI6XCJhYVwiLFwiw6ZcIjpcImFlXCIsXCLHvVwiOlwiYWVcIixcIsejXCI6XCJhZVwiLFwi6py1XCI6XCJhb1wiLFwi6py3XCI6XCJhdVwiLFwi6py5XCI6XCJhdlwiLFwi6py7XCI6XCJhdlwiLFwi6py9XCI6XCJheVwiLFwi4pORXCI6XCJiXCIsXCLvvYJcIjpcImJcIixcIuG4g1wiOlwiYlwiLFwi4biFXCI6XCJiXCIsXCLhuIdcIjpcImJcIixcIsaAXCI6XCJiXCIsXCLGg1wiOlwiYlwiLFwiyZNcIjpcImJcIixcIuKTklwiOlwiY1wiLFwi772DXCI6XCJjXCIsXCLEh1wiOlwiY1wiLFwixIlcIjpcImNcIixcIsSLXCI6XCJjXCIsXCLEjVwiOlwiY1wiLFwiw6dcIjpcImNcIixcIuG4iVwiOlwiY1wiLFwixohcIjpcImNcIixcIsi8XCI6XCJjXCIsXCLqnL9cIjpcImNcIixcIuKGhFwiOlwiY1wiLFwi4pOTXCI6XCJkXCIsXCLvvYRcIjpcImRcIixcIuG4i1wiOlwiZFwiLFwixI9cIjpcImRcIixcIuG4jVwiOlwiZFwiLFwi4biRXCI6XCJkXCIsXCLhuJNcIjpcImRcIixcIuG4j1wiOlwiZFwiLFwixJFcIjpcImRcIixcIsaMXCI6XCJkXCIsXCLJllwiOlwiZFwiLFwiyZdcIjpcImRcIixcIuqdulwiOlwiZFwiLFwix7NcIjpcImR6XCIsXCLHhlwiOlwiZHpcIixcIuKTlFwiOlwiZVwiLFwi772FXCI6XCJlXCIsXCLDqFwiOlwiZVwiLFwiw6lcIjpcImVcIixcIsOqXCI6XCJlXCIsXCLhu4FcIjpcImVcIixcIuG6v1wiOlwiZVwiLFwi4buFXCI6XCJlXCIsXCLhu4NcIjpcImVcIixcIuG6vVwiOlwiZVwiLFwixJNcIjpcImVcIixcIuG4lVwiOlwiZVwiLFwi4biXXCI6XCJlXCIsXCLElVwiOlwiZVwiLFwixJdcIjpcImVcIixcIsOrXCI6XCJlXCIsXCLhurtcIjpcImVcIixcIsSbXCI6XCJlXCIsXCLIhVwiOlwiZVwiLFwiyIdcIjpcImVcIixcIuG6uVwiOlwiZVwiLFwi4buHXCI6XCJlXCIsXCLIqVwiOlwiZVwiLFwi4bidXCI6XCJlXCIsXCLEmVwiOlwiZVwiLFwi4biZXCI6XCJlXCIsXCLhuJtcIjpcImVcIixcIsmHXCI6XCJlXCIsXCLJm1wiOlwiZVwiLFwix51cIjpcImVcIixcIuKTlVwiOlwiZlwiLFwi772GXCI6XCJmXCIsXCLhuJ9cIjpcImZcIixcIsaSXCI6XCJmXCIsXCLqnbxcIjpcImZcIixcIuKTllwiOlwiZ1wiLFwi772HXCI6XCJnXCIsXCLHtVwiOlwiZ1wiLFwixJ1cIjpcImdcIixcIuG4oVwiOlwiZ1wiLFwixJ9cIjpcImdcIixcIsShXCI6XCJnXCIsXCLHp1wiOlwiZ1wiLFwixKNcIjpcImdcIixcIselXCI6XCJnXCIsXCLJoFwiOlwiZ1wiLFwi6p6hXCI6XCJnXCIsXCLhtblcIjpcImdcIixcIuqdv1wiOlwiZ1wiLFwi4pOXXCI6XCJoXCIsXCLvvYhcIjpcImhcIixcIsSlXCI6XCJoXCIsXCLhuKNcIjpcImhcIixcIuG4p1wiOlwiaFwiLFwiyJ9cIjpcImhcIixcIuG4pVwiOlwiaFwiLFwi4bipXCI6XCJoXCIsXCLhuKtcIjpcImhcIixcIuG6llwiOlwiaFwiLFwixKdcIjpcImhcIixcIuKxqFwiOlwiaFwiLFwi4rG2XCI6XCJoXCIsXCLJpVwiOlwiaFwiLFwixpVcIjpcImh2XCIsXCLik5hcIjpcImlcIixcIu+9iVwiOlwiaVwiLFwiw6xcIjpcImlcIixcIsOtXCI6XCJpXCIsXCLDrlwiOlwiaVwiLFwixKlcIjpcImlcIixcIsSrXCI6XCJpXCIsXCLErVwiOlwiaVwiLFwiw69cIjpcImlcIixcIuG4r1wiOlwiaVwiLFwi4buJXCI6XCJpXCIsXCLHkFwiOlwiaVwiLFwiyIlcIjpcImlcIixcIsiLXCI6XCJpXCIsXCLhu4tcIjpcImlcIixcIsSvXCI6XCJpXCIsXCLhuK1cIjpcImlcIixcIsmoXCI6XCJpXCIsXCLEsVwiOlwiaVwiLFwi4pOZXCI6XCJqXCIsXCLvvYpcIjpcImpcIixcIsS1XCI6XCJqXCIsXCLHsFwiOlwialwiLFwiyYlcIjpcImpcIixcIuKTmlwiOlwia1wiLFwi772LXCI6XCJrXCIsXCLhuLFcIjpcImtcIixcIsepXCI6XCJrXCIsXCLhuLNcIjpcImtcIixcIsS3XCI6XCJrXCIsXCLhuLVcIjpcImtcIixcIsaZXCI6XCJrXCIsXCLisapcIjpcImtcIixcIuqdgVwiOlwia1wiLFwi6p2DXCI6XCJrXCIsXCLqnYVcIjpcImtcIixcIuqeo1wiOlwia1wiLFwi4pObXCI6XCJsXCIsXCLvvYxcIjpcImxcIixcIsWAXCI6XCJsXCIsXCLEulwiOlwibFwiLFwixL5cIjpcImxcIixcIuG4t1wiOlwibFwiLFwi4bi5XCI6XCJsXCIsXCLEvFwiOlwibFwiLFwi4bi9XCI6XCJsXCIsXCLhuLtcIjpcImxcIixcIsW/XCI6XCJsXCIsXCLFglwiOlwibFwiLFwixppcIjpcImxcIixcIsmrXCI6XCJsXCIsXCLisaFcIjpcImxcIixcIuqdiVwiOlwibFwiLFwi6p6BXCI6XCJsXCIsXCLqnYdcIjpcImxcIixcIseJXCI6XCJsalwiLFwi4pOcXCI6XCJtXCIsXCLvvY1cIjpcIm1cIixcIuG4v1wiOlwibVwiLFwi4bmBXCI6XCJtXCIsXCLhuYNcIjpcIm1cIixcIsmxXCI6XCJtXCIsXCLJr1wiOlwibVwiLFwi4pOdXCI6XCJuXCIsXCLvvY5cIjpcIm5cIixcIse5XCI6XCJuXCIsXCLFhFwiOlwiblwiLFwiw7FcIjpcIm5cIixcIuG5hVwiOlwiblwiLFwixYhcIjpcIm5cIixcIuG5h1wiOlwiblwiLFwixYZcIjpcIm5cIixcIuG5i1wiOlwiblwiLFwi4bmJXCI6XCJuXCIsXCLGnlwiOlwiblwiLFwiybJcIjpcIm5cIixcIsWJXCI6XCJuXCIsXCLqnpFcIjpcIm5cIixcIuqepVwiOlwiblwiLFwix4xcIjpcIm5qXCIsXCLik55cIjpcIm9cIixcIu+9j1wiOlwib1wiLFwiw7JcIjpcIm9cIixcIsOzXCI6XCJvXCIsXCLDtFwiOlwib1wiLFwi4buTXCI6XCJvXCIsXCLhu5FcIjpcIm9cIixcIuG7l1wiOlwib1wiLFwi4buVXCI6XCJvXCIsXCLDtVwiOlwib1wiLFwi4bmNXCI6XCJvXCIsXCLIrVwiOlwib1wiLFwi4bmPXCI6XCJvXCIsXCLFjVwiOlwib1wiLFwi4bmRXCI6XCJvXCIsXCLhuZNcIjpcIm9cIixcIsWPXCI6XCJvXCIsXCLIr1wiOlwib1wiLFwiyLFcIjpcIm9cIixcIsO2XCI6XCJvXCIsXCLIq1wiOlwib1wiLFwi4buPXCI6XCJvXCIsXCLFkVwiOlwib1wiLFwix5JcIjpcIm9cIixcIsiNXCI6XCJvXCIsXCLIj1wiOlwib1wiLFwixqFcIjpcIm9cIixcIuG7nVwiOlwib1wiLFwi4bubXCI6XCJvXCIsXCLhu6FcIjpcIm9cIixcIuG7n1wiOlwib1wiLFwi4bujXCI6XCJvXCIsXCLhu41cIjpcIm9cIixcIuG7mVwiOlwib1wiLFwix6tcIjpcIm9cIixcIsetXCI6XCJvXCIsXCLDuFwiOlwib1wiLFwix79cIjpcIm9cIixcIsmUXCI6XCJvXCIsXCLqnYtcIjpcIm9cIixcIuqdjVwiOlwib1wiLFwiybVcIjpcIm9cIixcIsajXCI6XCJvaVwiLFwiyKNcIjpcIm91XCIsXCLqnY9cIjpcIm9vXCIsXCLik59cIjpcInBcIixcIu+9kFwiOlwicFwiLFwi4bmVXCI6XCJwXCIsXCLhuZdcIjpcInBcIixcIsalXCI6XCJwXCIsXCLhtb1cIjpcInBcIixcIuqdkVwiOlwicFwiLFwi6p2TXCI6XCJwXCIsXCLqnZVcIjpcInBcIixcIuKToFwiOlwicVwiLFwi772RXCI6XCJxXCIsXCLJi1wiOlwicVwiLFwi6p2XXCI6XCJxXCIsXCLqnZlcIjpcInFcIixcIuKToVwiOlwiclwiLFwi772SXCI6XCJyXCIsXCLFlVwiOlwiclwiLFwi4bmZXCI6XCJyXCIsXCLFmVwiOlwiclwiLFwiyJFcIjpcInJcIixcIsiTXCI6XCJyXCIsXCLhuZtcIjpcInJcIixcIuG5nVwiOlwiclwiLFwixZdcIjpcInJcIixcIuG5n1wiOlwiclwiLFwiyY1cIjpcInJcIixcIsm9XCI6XCJyXCIsXCLqnZtcIjpcInJcIixcIuqep1wiOlwiclwiLFwi6p6DXCI6XCJyXCIsXCLik6JcIjpcInNcIixcIu+9k1wiOlwic1wiLFwiw59cIjpcInNcIixcIsWbXCI6XCJzXCIsXCLhuaVcIjpcInNcIixcIsWdXCI6XCJzXCIsXCLhuaFcIjpcInNcIixcIsWhXCI6XCJzXCIsXCLhuadcIjpcInNcIixcIuG5o1wiOlwic1wiLFwi4bmpXCI6XCJzXCIsXCLImVwiOlwic1wiLFwixZ9cIjpcInNcIixcIsi/XCI6XCJzXCIsXCLqnqlcIjpcInNcIixcIuqehVwiOlwic1wiLFwi4bqbXCI6XCJzXCIsXCLik6NcIjpcInRcIixcIu+9lFwiOlwidFwiLFwi4bmrXCI6XCJ0XCIsXCLhupdcIjpcInRcIixcIsWlXCI6XCJ0XCIsXCLhua1cIjpcInRcIixcIsibXCI6XCJ0XCIsXCLFo1wiOlwidFwiLFwi4bmxXCI6XCJ0XCIsXCLhua9cIjpcInRcIixcIsWnXCI6XCJ0XCIsXCLGrVwiOlwidFwiLFwiyohcIjpcInRcIixcIuKxplwiOlwidFwiLFwi6p6HXCI6XCJ0XCIsXCLqnKlcIjpcInR6XCIsXCLik6RcIjpcInVcIixcIu+9lVwiOlwidVwiLFwiw7lcIjpcInVcIixcIsO6XCI6XCJ1XCIsXCLDu1wiOlwidVwiLFwixalcIjpcInVcIixcIuG5uVwiOlwidVwiLFwixatcIjpcInVcIixcIuG5u1wiOlwidVwiLFwixa1cIjpcInVcIixcIsO8XCI6XCJ1XCIsXCLHnFwiOlwidVwiLFwix5hcIjpcInVcIixcIseWXCI6XCJ1XCIsXCLHmlwiOlwidVwiLFwi4bunXCI6XCJ1XCIsXCLFr1wiOlwidVwiLFwixbFcIjpcInVcIixcIseUXCI6XCJ1XCIsXCLIlVwiOlwidVwiLFwiyJdcIjpcInVcIixcIsawXCI6XCJ1XCIsXCLhu6tcIjpcInVcIixcIuG7qVwiOlwidVwiLFwi4buvXCI6XCJ1XCIsXCLhu61cIjpcInVcIixcIuG7sVwiOlwidVwiLFwi4bulXCI6XCJ1XCIsXCLhubNcIjpcInVcIixcIsWzXCI6XCJ1XCIsXCLhubdcIjpcInVcIixcIuG5tVwiOlwidVwiLFwiyolcIjpcInVcIixcIuKTpVwiOlwidlwiLFwi772WXCI6XCJ2XCIsXCLhub1cIjpcInZcIixcIuG5v1wiOlwidlwiLFwiyotcIjpcInZcIixcIuqdn1wiOlwidlwiLFwiyoxcIjpcInZcIixcIuqdoVwiOlwidnlcIixcIuKTplwiOlwid1wiLFwi772XXCI6XCJ3XCIsXCLhuoFcIjpcIndcIixcIuG6g1wiOlwid1wiLFwixbVcIjpcIndcIixcIuG6h1wiOlwid1wiLFwi4bqFXCI6XCJ3XCIsXCLhuphcIjpcIndcIixcIuG6iVwiOlwid1wiLFwi4rGzXCI6XCJ3XCIsXCLik6dcIjpcInhcIixcIu+9mFwiOlwieFwiLFwi4bqLXCI6XCJ4XCIsXCLhuo1cIjpcInhcIixcIuKTqFwiOlwieVwiLFwi772ZXCI6XCJ5XCIsXCLhu7NcIjpcInlcIixcIsO9XCI6XCJ5XCIsXCLFt1wiOlwieVwiLFwi4bu5XCI6XCJ5XCIsXCLIs1wiOlwieVwiLFwi4bqPXCI6XCJ5XCIsXCLDv1wiOlwieVwiLFwi4bu3XCI6XCJ5XCIsXCLhuplcIjpcInlcIixcIuG7tVwiOlwieVwiLFwixrRcIjpcInlcIixcIsmPXCI6XCJ5XCIsXCLhu79cIjpcInlcIixcIuKTqVwiOlwielwiLFwi772aXCI6XCJ6XCIsXCLFulwiOlwielwiLFwi4bqRXCI6XCJ6XCIsXCLFvFwiOlwielwiLFwixb5cIjpcInpcIixcIuG6k1wiOlwielwiLFwi4bqVXCI6XCJ6XCIsXCLGtlwiOlwielwiLFwiyKVcIjpcInpcIixcIsmAXCI6XCJ6XCIsXCLisaxcIjpcInpcIixcIuqdo1wiOlwielwiLFwizoZcIjpcIs6RXCIsXCLOiFwiOlwizpVcIixcIs6JXCI6XCLOl1wiLFwizopcIjpcIs6ZXCIsXCLOqlwiOlwizplcIixcIs6MXCI6XCLOn1wiLFwizo5cIjpcIs6lXCIsXCLOq1wiOlwizqVcIixcIs6PXCI6XCLOqVwiLFwizqxcIjpcIs6xXCIsXCLOrVwiOlwizrVcIixcIs6uXCI6XCLOt1wiLFwizq9cIjpcIs65XCIsXCLPilwiOlwizrlcIixcIs6QXCI6XCLOuVwiLFwiz4xcIjpcIs6/XCIsXCLPjVwiOlwiz4VcIixcIs+LXCI6XCLPhVwiLFwizrBcIjpcIs+FXCIsXCLPiVwiOlwiz4lcIixcIs+CXCI6XCLPg1wifTtyZXR1cm4gYX0pLGIuZGVmaW5lKFwic2VsZWN0Mi9kYXRhL2Jhc2VcIixbXCIuLi91dGlsc1wiXSxmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEsYyl7Yi5fX3N1cGVyX18uY29uc3RydWN0b3IuY2FsbCh0aGlzKX1yZXR1cm4gYS5FeHRlbmQoYixhLk9ic2VydmFibGUpLGIucHJvdG90eXBlLmN1cnJlbnQ9ZnVuY3Rpb24oYSl7dGhyb3cgbmV3IEVycm9yKFwiVGhlIGBjdXJyZW50YCBtZXRob2QgbXVzdCBiZSBkZWZpbmVkIGluIGNoaWxkIGNsYXNzZXMuXCIpfSxiLnByb3RvdHlwZS5xdWVyeT1mdW5jdGlvbihhLGIpe3Rocm93IG5ldyBFcnJvcihcIlRoZSBgcXVlcnlgIG1ldGhvZCBtdXN0IGJlIGRlZmluZWQgaW4gY2hpbGQgY2xhc3Nlcy5cIil9LGIucHJvdG90eXBlLmJpbmQ9ZnVuY3Rpb24oYSxiKXt9LGIucHJvdG90eXBlLmRlc3Ryb3k9ZnVuY3Rpb24oKXt9LGIucHJvdG90eXBlLmdlbmVyYXRlUmVzdWx0SWQ9ZnVuY3Rpb24oYixjKXt2YXIgZD1iLmlkK1wiLXJlc3VsdC1cIjtyZXR1cm4gZCs9YS5nZW5lcmF0ZUNoYXJzKDQpLGQrPW51bGwhPWMuaWQ/XCItXCIrYy5pZC50b1N0cmluZygpOlwiLVwiK2EuZ2VuZXJhdGVDaGFycyg0KX0sYn0pLGIuZGVmaW5lKFwic2VsZWN0Mi9kYXRhL3NlbGVjdFwiLFtcIi4vYmFzZVwiLFwiLi4vdXRpbHNcIixcImpxdWVyeVwiXSxmdW5jdGlvbihhLGIsYyl7ZnVuY3Rpb24gZChhLGIpe3RoaXMuJGVsZW1lbnQ9YSx0aGlzLm9wdGlvbnM9YixkLl9fc3VwZXJfXy5jb25zdHJ1Y3Rvci5jYWxsKHRoaXMpfXJldHVybiBiLkV4dGVuZChkLGEpLGQucHJvdG90eXBlLmN1cnJlbnQ9ZnVuY3Rpb24oYSl7dmFyIGI9W10sZD10aGlzO3RoaXMuJGVsZW1lbnQuZmluZChcIjpzZWxlY3RlZFwiKS5lYWNoKGZ1bmN0aW9uKCl7dmFyIGE9Yyh0aGlzKSxlPWQuaXRlbShhKTtiLnB1c2goZSl9KSxhKGIpfSxkLnByb3RvdHlwZS5zZWxlY3Q9ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcztpZihhLnNlbGVjdGVkPSEwLGMoYS5lbGVtZW50KS5pcyhcIm9wdGlvblwiKSlyZXR1cm4gYS5lbGVtZW50LnNlbGVjdGVkPSEwLHZvaWQgdGhpcy4kZWxlbWVudC50cmlnZ2VyKFwiY2hhbmdlXCIpO1xuaWYodGhpcy4kZWxlbWVudC5wcm9wKFwibXVsdGlwbGVcIikpdGhpcy5jdXJyZW50KGZ1bmN0aW9uKGQpe3ZhciBlPVtdO2E9W2FdLGEucHVzaC5hcHBseShhLGQpO2Zvcih2YXIgZj0wO2Y8YS5sZW5ndGg7ZisrKXt2YXIgZz1hW2ZdLmlkOy0xPT09Yy5pbkFycmF5KGcsZSkmJmUucHVzaChnKX1iLiRlbGVtZW50LnZhbChlKSxiLiRlbGVtZW50LnRyaWdnZXIoXCJjaGFuZ2VcIil9KTtlbHNle3ZhciBkPWEuaWQ7dGhpcy4kZWxlbWVudC52YWwoZCksdGhpcy4kZWxlbWVudC50cmlnZ2VyKFwiY2hhbmdlXCIpfX0sZC5wcm90b3R5cGUudW5zZWxlY3Q9ZnVuY3Rpb24oYSl7dmFyIGI9dGhpcztpZih0aGlzLiRlbGVtZW50LnByb3AoXCJtdWx0aXBsZVwiKSlyZXR1cm4gYS5zZWxlY3RlZD0hMSxjKGEuZWxlbWVudCkuaXMoXCJvcHRpb25cIik/KGEuZWxlbWVudC5zZWxlY3RlZD0hMSx2b2lkIHRoaXMuJGVsZW1lbnQudHJpZ2dlcihcImNoYW5nZVwiKSk6dm9pZCB0aGlzLmN1cnJlbnQoZnVuY3Rpb24oZCl7Zm9yKHZhciBlPVtdLGY9MDtmPGQubGVuZ3RoO2YrKyl7dmFyIGc9ZFtmXS5pZDtnIT09YS5pZCYmLTE9PT1jLmluQXJyYXkoZyxlKSYmZS5wdXNoKGcpfWIuJGVsZW1lbnQudmFsKGUpLGIuJGVsZW1lbnQudHJpZ2dlcihcImNoYW5nZVwiKX0pfSxkLnByb3RvdHlwZS5iaW5kPWZ1bmN0aW9uKGEsYil7dmFyIGM9dGhpczt0aGlzLmNvbnRhaW5lcj1hLGEub24oXCJzZWxlY3RcIixmdW5jdGlvbihhKXtjLnNlbGVjdChhLmRhdGEpfSksYS5vbihcInVuc2VsZWN0XCIsZnVuY3Rpb24oYSl7Yy51bnNlbGVjdChhLmRhdGEpfSl9LGQucHJvdG90eXBlLmRlc3Ryb3k9ZnVuY3Rpb24oKXt0aGlzLiRlbGVtZW50LmZpbmQoXCIqXCIpLmVhY2goZnVuY3Rpb24oKXtjLnJlbW92ZURhdGEodGhpcyxcImRhdGFcIil9KX0sZC5wcm90b3R5cGUucXVlcnk9ZnVuY3Rpb24oYSxiKXt2YXIgZD1bXSxlPXRoaXMsZj10aGlzLiRlbGVtZW50LmNoaWxkcmVuKCk7Zi5lYWNoKGZ1bmN0aW9uKCl7dmFyIGI9Yyh0aGlzKTtpZihiLmlzKFwib3B0aW9uXCIpfHxiLmlzKFwib3B0Z3JvdXBcIikpe3ZhciBmPWUuaXRlbShiKSxnPWUubWF0Y2hlcyhhLGYpO251bGwhPT1nJiZkLnB1c2goZyl9fSksYih7cmVzdWx0czpkfSl9LGQucHJvdG90eXBlLmFkZE9wdGlvbnM9ZnVuY3Rpb24oYSl7Yi5hcHBlbmRNYW55KHRoaXMuJGVsZW1lbnQsYSl9LGQucHJvdG90eXBlLm9wdGlvbj1mdW5jdGlvbihhKXt2YXIgYjthLmNoaWxkcmVuPyhiPWRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoXCJvcHRncm91cFwiKSxiLmxhYmVsPWEudGV4dCk6KGI9ZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcIm9wdGlvblwiKSx2b2lkIDAhPT1iLnRleHRDb250ZW50P2IudGV4dENvbnRlbnQ9YS50ZXh0OmIuaW5uZXJUZXh0PWEudGV4dCksYS5pZCYmKGIudmFsdWU9YS5pZCksYS5kaXNhYmxlZCYmKGIuZGlzYWJsZWQ9ITApLGEuc2VsZWN0ZWQmJihiLnNlbGVjdGVkPSEwKSxhLnRpdGxlJiYoYi50aXRsZT1hLnRpdGxlKTt2YXIgZD1jKGIpLGU9dGhpcy5fbm9ybWFsaXplSXRlbShhKTtyZXR1cm4gZS5lbGVtZW50PWIsYy5kYXRhKGIsXCJkYXRhXCIsZSksZH0sZC5wcm90b3R5cGUuaXRlbT1mdW5jdGlvbihhKXt2YXIgYj17fTtpZihiPWMuZGF0YShhWzBdLFwiZGF0YVwiKSxudWxsIT1iKXJldHVybiBiO2lmKGEuaXMoXCJvcHRpb25cIikpYj17aWQ6YS52YWwoKSx0ZXh0OmEudGV4dCgpLGRpc2FibGVkOmEucHJvcChcImRpc2FibGVkXCIpLHNlbGVjdGVkOmEucHJvcChcInNlbGVjdGVkXCIpLHRpdGxlOmEucHJvcChcInRpdGxlXCIpfTtlbHNlIGlmKGEuaXMoXCJvcHRncm91cFwiKSl7Yj17dGV4dDphLnByb3AoXCJsYWJlbFwiKSxjaGlsZHJlbjpbXSx0aXRsZTphLnByb3AoXCJ0aXRsZVwiKX07Zm9yKHZhciBkPWEuY2hpbGRyZW4oXCJvcHRpb25cIiksZT1bXSxmPTA7ZjxkLmxlbmd0aDtmKyspe3ZhciBnPWMoZFtmXSksaD10aGlzLml0ZW0oZyk7ZS5wdXNoKGgpfWIuY2hpbGRyZW49ZX1yZXR1cm4gYj10aGlzLl9ub3JtYWxpemVJdGVtKGIpLGIuZWxlbWVudD1hWzBdLGMuZGF0YShhWzBdLFwiZGF0YVwiLGIpLGJ9LGQucHJvdG90eXBlLl9ub3JtYWxpemVJdGVtPWZ1bmN0aW9uKGEpe2MuaXNQbGFpbk9iamVjdChhKXx8KGE9e2lkOmEsdGV4dDphfSksYT1jLmV4dGVuZCh7fSx7dGV4dDpcIlwifSxhKTt2YXIgYj17c2VsZWN0ZWQ6ITEsZGlzYWJsZWQ6ITF9O3JldHVybiBudWxsIT1hLmlkJiYoYS5pZD1hLmlkLnRvU3RyaW5nKCkpLG51bGwhPWEudGV4dCYmKGEudGV4dD1hLnRleHQudG9TdHJpbmcoKSksbnVsbD09YS5fcmVzdWx0SWQmJmEuaWQmJm51bGwhPXRoaXMuY29udGFpbmVyJiYoYS5fcmVzdWx0SWQ9dGhpcy5nZW5lcmF0ZVJlc3VsdElkKHRoaXMuY29udGFpbmVyLGEpKSxjLmV4dGVuZCh7fSxiLGEpfSxkLnByb3RvdHlwZS5tYXRjaGVzPWZ1bmN0aW9uKGEsYil7dmFyIGM9dGhpcy5vcHRpb25zLmdldChcIm1hdGNoZXJcIik7cmV0dXJuIGMoYSxiKX0sZH0pLGIuZGVmaW5lKFwic2VsZWN0Mi9kYXRhL2FycmF5XCIsW1wiLi9zZWxlY3RcIixcIi4uL3V0aWxzXCIsXCJqcXVlcnlcIl0sZnVuY3Rpb24oYSxiLGMpe2Z1bmN0aW9uIGQoYSxiKXt2YXIgYz1iLmdldChcImRhdGFcIil8fFtdO2QuX19zdXBlcl9fLmNvbnN0cnVjdG9yLmNhbGwodGhpcyxhLGIpLHRoaXMuYWRkT3B0aW9ucyh0aGlzLmNvbnZlcnRUb09wdGlvbnMoYykpfXJldHVybiBiLkV4dGVuZChkLGEpLGQucHJvdG90eXBlLnNlbGVjdD1mdW5jdGlvbihhKXt2YXIgYj10aGlzLiRlbGVtZW50LmZpbmQoXCJvcHRpb25cIikuZmlsdGVyKGZ1bmN0aW9uKGIsYyl7cmV0dXJuIGMudmFsdWU9PWEuaWQudG9TdHJpbmcoKX0pOzA9PT1iLmxlbmd0aCYmKGI9dGhpcy5vcHRpb24oYSksdGhpcy5hZGRPcHRpb25zKGIpKSxkLl9fc3VwZXJfXy5zZWxlY3QuY2FsbCh0aGlzLGEpfSxkLnByb3RvdHlwZS5jb252ZXJ0VG9PcHRpb25zPWZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGQoYSl7cmV0dXJuIGZ1bmN0aW9uKCl7cmV0dXJuIGModGhpcykudmFsKCk9PWEuaWR9fWZvcih2YXIgZT10aGlzLGY9dGhpcy4kZWxlbWVudC5maW5kKFwib3B0aW9uXCIpLGc9Zi5tYXAoZnVuY3Rpb24oKXtyZXR1cm4gZS5pdGVtKGModGhpcykpLmlkfSkuZ2V0KCksaD1bXSxpPTA7aTxhLmxlbmd0aDtpKyspe3ZhciBqPXRoaXMuX25vcm1hbGl6ZUl0ZW0oYVtpXSk7aWYoYy5pbkFycmF5KGouaWQsZyk+PTApe3ZhciBrPWYuZmlsdGVyKGQoaikpLGw9dGhpcy5pdGVtKGspLG09Yy5leHRlbmQoITAse30saixsKSxuPXRoaXMub3B0aW9uKG0pO2sucmVwbGFjZVdpdGgobil9ZWxzZXt2YXIgbz10aGlzLm9wdGlvbihqKTtpZihqLmNoaWxkcmVuKXt2YXIgcD10aGlzLmNvbnZlcnRUb09wdGlvbnMoai5jaGlsZHJlbik7Yi5hcHBlbmRNYW55KG8scCl9aC5wdXNoKG8pfX1yZXR1cm4gaH0sZH0pLGIuZGVmaW5lKFwic2VsZWN0Mi9kYXRhL2FqYXhcIixbXCIuL2FycmF5XCIsXCIuLi91dGlsc1wiLFwianF1ZXJ5XCJdLGZ1bmN0aW9uKGEsYixjKXtmdW5jdGlvbiBkKGEsYil7dGhpcy5hamF4T3B0aW9ucz10aGlzLl9hcHBseURlZmF1bHRzKGIuZ2V0KFwiYWpheFwiKSksbnVsbCE9dGhpcy5hamF4T3B0aW9ucy5wcm9jZXNzUmVzdWx0cyYmKHRoaXMucHJvY2Vzc1Jlc3VsdHM9dGhpcy5hamF4T3B0aW9ucy5wcm9jZXNzUmVzdWx0cyksZC5fX3N1cGVyX18uY29uc3RydWN0b3IuY2FsbCh0aGlzLGEsYil9cmV0dXJuIGIuRXh0ZW5kKGQsYSksZC5wcm90b3R5cGUuX2FwcGx5RGVmYXVsdHM9ZnVuY3Rpb24oYSl7dmFyIGI9e2RhdGE6ZnVuY3Rpb24oYSl7cmV0dXJuIGMuZXh0ZW5kKHt9LGEse3E6YS50ZXJtfSl9LHRyYW5zcG9ydDpmdW5jdGlvbihhLGIsZCl7dmFyIGU9Yy5hamF4KGEpO3JldHVybiBlLnRoZW4oYiksZS5mYWlsKGQpLGV9fTtyZXR1cm4gYy5leHRlbmQoe30sYixhLCEwKX0sZC5wcm90b3R5cGUucHJvY2Vzc1Jlc3VsdHM9ZnVuY3Rpb24oYSl7cmV0dXJuIGF9LGQucHJvdG90eXBlLnF1ZXJ5PWZ1bmN0aW9uKGEsYil7ZnVuY3Rpb24gZCgpe3ZhciBkPWYudHJhbnNwb3J0KGYsZnVuY3Rpb24oZCl7dmFyIGY9ZS5wcm9jZXNzUmVzdWx0cyhkLGEpO2Uub3B0aW9ucy5nZXQoXCJkZWJ1Z1wiKSYmd2luZG93LmNvbnNvbGUmJmNvbnNvbGUuZXJyb3ImJihmJiZmLnJlc3VsdHMmJmMuaXNBcnJheShmLnJlc3VsdHMpfHxjb25zb2xlLmVycm9yKFwiU2VsZWN0MjogVGhlIEFKQVggcmVzdWx0cyBkaWQgbm90IHJldHVybiBhbiBhcnJheSBpbiB0aGUgYHJlc3VsdHNgIGtleSBvZiB0aGUgcmVzcG9uc2UuXCIpKSxiKGYpfSxmdW5jdGlvbigpe2Quc3RhdHVzJiZcIjBcIj09PWQuc3RhdHVzfHxlLnRyaWdnZXIoXCJyZXN1bHRzOm1lc3NhZ2VcIix7bWVzc2FnZTpcImVycm9yTG9hZGluZ1wifSl9KTtlLl9yZXF1ZXN0PWR9dmFyIGU9dGhpcztudWxsIT10aGlzLl9yZXF1ZXN0JiYoYy5pc0Z1bmN0aW9uKHRoaXMuX3JlcXVlc3QuYWJvcnQpJiZ0aGlzLl9yZXF1ZXN0LmFib3J0KCksdGhpcy5fcmVxdWVzdD1udWxsKTt2YXIgZj1jLmV4dGVuZCh7dHlwZTpcIkdFVFwifSx0aGlzLmFqYXhPcHRpb25zKTtcImZ1bmN0aW9uXCI9PXR5cGVvZiBmLnVybCYmKGYudXJsPWYudXJsLmNhbGwodGhpcy4kZWxlbWVudCxhKSksXCJmdW5jdGlvblwiPT10eXBlb2YgZi5kYXRhJiYoZi5kYXRhPWYuZGF0YS5jYWxsKHRoaXMuJGVsZW1lbnQsYSkpLHRoaXMuYWpheE9wdGlvbnMuZGVsYXkmJm51bGwhPWEudGVybT8odGhpcy5fcXVlcnlUaW1lb3V0JiZ3aW5kb3cuY2xlYXJUaW1lb3V0KHRoaXMuX3F1ZXJ5VGltZW91dCksdGhpcy5fcXVlcnlUaW1lb3V0PXdpbmRvdy5zZXRUaW1lb3V0KGQsdGhpcy5hamF4T3B0aW9ucy5kZWxheSkpOmQoKX0sZH0pLGIuZGVmaW5lKFwic2VsZWN0Mi9kYXRhL3RhZ3NcIixbXCJqcXVlcnlcIl0sZnVuY3Rpb24oYSl7ZnVuY3Rpb24gYihiLGMsZCl7dmFyIGU9ZC5nZXQoXCJ0YWdzXCIpLGY9ZC5nZXQoXCJjcmVhdGVUYWdcIik7dm9pZCAwIT09ZiYmKHRoaXMuY3JlYXRlVGFnPWYpO3ZhciBnPWQuZ2V0KFwiaW5zZXJ0VGFnXCIpO2lmKHZvaWQgMCE9PWcmJih0aGlzLmluc2VydFRhZz1nKSxiLmNhbGwodGhpcyxjLGQpLGEuaXNBcnJheShlKSlmb3IodmFyIGg9MDtoPGUubGVuZ3RoO2grKyl7dmFyIGk9ZVtoXSxqPXRoaXMuX25vcm1hbGl6ZUl0ZW0oaSksaz10aGlzLm9wdGlvbihqKTt0aGlzLiRlbGVtZW50LmFwcGVuZChrKX19cmV0dXJuIGIucHJvdG90eXBlLnF1ZXJ5PWZ1bmN0aW9uKGEsYixjKXtmdW5jdGlvbiBkKGEsZil7Zm9yKHZhciBnPWEucmVzdWx0cyxoPTA7aDxnLmxlbmd0aDtoKyspe3ZhciBpPWdbaF0saj1udWxsIT1pLmNoaWxkcmVuJiYhZCh7cmVzdWx0czppLmNoaWxkcmVufSwhMCksaz1pLnRleHQ9PT1iLnRlcm07aWYoa3x8ailyZXR1cm4gZj8hMTooYS5kYXRhPWcsdm9pZCBjKGEpKX1pZihmKXJldHVybiEwO3ZhciBsPWUuY3JlYXRlVGFnKGIpO2lmKG51bGwhPWwpe3ZhciBtPWUub3B0aW9uKGwpO20uYXR0cihcImRhdGEtc2VsZWN0Mi10YWdcIiwhMCksZS5hZGRPcHRpb25zKFttXSksZS5pbnNlcnRUYWcoZyxsKX1hLnJlc3VsdHM9ZyxjKGEpfXZhciBlPXRoaXM7cmV0dXJuIHRoaXMuX3JlbW92ZU9sZFRhZ3MoKSxudWxsPT1iLnRlcm18fG51bGwhPWIucGFnZT92b2lkIGEuY2FsbCh0aGlzLGIsYyk6dm9pZCBhLmNhbGwodGhpcyxiLGQpfSxiLnByb3RvdHlwZS5jcmVhdGVUYWc9ZnVuY3Rpb24oYixjKXt2YXIgZD1hLnRyaW0oYy50ZXJtKTtyZXR1cm5cIlwiPT09ZD9udWxsOntpZDpkLHRleHQ6ZH19LGIucHJvdG90eXBlLmluc2VydFRhZz1mdW5jdGlvbihhLGIsYyl7Yi51bnNoaWZ0KGMpfSxiLnByb3RvdHlwZS5fcmVtb3ZlT2xkVGFncz1mdW5jdGlvbihiKXt2YXIgYz0odGhpcy5fbGFzdFRhZyx0aGlzLiRlbGVtZW50LmZpbmQoXCJvcHRpb25bZGF0YS1zZWxlY3QyLXRhZ11cIikpO2MuZWFjaChmdW5jdGlvbigpe3RoaXMuc2VsZWN0ZWR8fGEodGhpcykucmVtb3ZlKCl9KX0sYn0pLGIuZGVmaW5lKFwic2VsZWN0Mi9kYXRhL3Rva2VuaXplclwiLFtcImpxdWVyeVwiXSxmdW5jdGlvbihhKXtmdW5jdGlvbiBiKGEsYixjKXt2YXIgZD1jLmdldChcInRva2VuaXplclwiKTt2b2lkIDAhPT1kJiYodGhpcy50b2tlbml6ZXI9ZCksYS5jYWxsKHRoaXMsYixjKX1yZXR1cm4gYi5wcm90b3R5cGUuYmluZD1mdW5jdGlvbihhLGIsYyl7YS5jYWxsKHRoaXMsYixjKSx0aGlzLiRzZWFyY2g9Yi5kcm9wZG93bi4kc2VhcmNofHxiLnNlbGVjdGlvbi4kc2VhcmNofHxjLmZpbmQoXCIuc2VsZWN0Mi1zZWFyY2hfX2ZpZWxkXCIpfSxiLnByb3RvdHlwZS5xdWVyeT1mdW5jdGlvbihiLGMsZCl7ZnVuY3Rpb24gZShiKXt2YXIgYz1nLl9ub3JtYWxpemVJdGVtKGIpLGQ9Zy4kZWxlbWVudC5maW5kKFwib3B0aW9uXCIpLmZpbHRlcihmdW5jdGlvbigpe3JldHVybiBhKHRoaXMpLnZhbCgpPT09Yy5pZH0pO2lmKCFkLmxlbmd0aCl7dmFyIGU9Zy5vcHRpb24oYyk7ZS5hdHRyKFwiZGF0YS1zZWxlY3QyLXRhZ1wiLCEwKSxnLl9yZW1vdmVPbGRUYWdzKCksZy5hZGRPcHRpb25zKFtlXSl9ZihjKX1mdW5jdGlvbiBmKGEpe2cudHJpZ2dlcihcInNlbGVjdFwiLHtkYXRhOmF9KX12YXIgZz10aGlzO2MudGVybT1jLnRlcm18fFwiXCI7dmFyIGg9dGhpcy50b2tlbml6ZXIoYyx0aGlzLm9wdGlvbnMsZSk7aC50ZXJtIT09Yy50ZXJtJiYodGhpcy4kc2VhcmNoLmxlbmd0aCYmKHRoaXMuJHNlYXJjaC52YWwoaC50ZXJtKSx0aGlzLiRzZWFyY2guZm9jdXMoKSksYy50ZXJtPWgudGVybSksYi5jYWxsKHRoaXMsYyxkKX0sYi5wcm90b3R5cGUudG9rZW5pemVyPWZ1bmN0aW9uKGIsYyxkLGUpe2Zvcih2YXIgZj1kLmdldChcInRva2VuU2VwYXJhdG9yc1wiKXx8W10sZz1jLnRlcm0saD0wLGk9dGhpcy5jcmVhdGVUYWd8fGZ1bmN0aW9uKGEpe3JldHVybntpZDphLnRlcm0sdGV4dDphLnRlcm19fTtoPGcubGVuZ3RoOyl7dmFyIGo9Z1toXTtpZigtMSE9PWEuaW5BcnJheShqLGYpKXt2YXIgaz1nLnN1YnN0cigwLGgpLGw9YS5leHRlbmQoe30sYyx7dGVybTprfSksbT1pKGwpO251bGwhPW0/KGUobSksZz1nLnN1YnN0cihoKzEpfHxcIlwiLGg9MCk6aCsrfWVsc2UgaCsrfXJldHVybnt0ZXJtOmd9fSxifSksYi5kZWZpbmUoXCJzZWxlY3QyL2RhdGEvbWluaW11bUlucHV0TGVuZ3RoXCIsW10sZnVuY3Rpb24oKXtmdW5jdGlvbiBhKGEsYixjKXt0aGlzLm1pbmltdW1JbnB1dExlbmd0aD1jLmdldChcIm1pbmltdW1JbnB1dExlbmd0aFwiKSxhLmNhbGwodGhpcyxiLGMpfXJldHVybiBhLnByb3RvdHlwZS5xdWVyeT1mdW5jdGlvbihhLGIsYyl7cmV0dXJuIGIudGVybT1iLnRlcm18fFwiXCIsYi50ZXJtLmxlbmd0aDx0aGlzLm1pbmltdW1JbnB1dExlbmd0aD92b2lkIHRoaXMudHJpZ2dlcihcInJlc3VsdHM6bWVzc2FnZVwiLHttZXNzYWdlOlwiaW5wdXRUb29TaG9ydFwiLGFyZ3M6e21pbmltdW06dGhpcy5taW5pbXVtSW5wdXRMZW5ndGgsaW5wdXQ6Yi50ZXJtLHBhcmFtczpifX0pOnZvaWQgYS5jYWxsKHRoaXMsYixjKX0sYX0pLGIuZGVmaW5lKFwic2VsZWN0Mi9kYXRhL21heGltdW1JbnB1dExlbmd0aFwiLFtdLGZ1bmN0aW9uKCl7ZnVuY3Rpb24gYShhLGIsYyl7dGhpcy5tYXhpbXVtSW5wdXRMZW5ndGg9Yy5nZXQoXCJtYXhpbXVtSW5wdXRMZW5ndGhcIiksYS5jYWxsKHRoaXMsYixjKX1yZXR1cm4gYS5wcm90b3R5cGUucXVlcnk9ZnVuY3Rpb24oYSxiLGMpe3JldHVybiBiLnRlcm09Yi50ZXJtfHxcIlwiLHRoaXMubWF4aW11bUlucHV0TGVuZ3RoPjAmJmIudGVybS5sZW5ndGg+dGhpcy5tYXhpbXVtSW5wdXRMZW5ndGg/dm9pZCB0aGlzLnRyaWdnZXIoXCJyZXN1bHRzOm1lc3NhZ2VcIix7bWVzc2FnZTpcImlucHV0VG9vTG9uZ1wiLGFyZ3M6e21heGltdW06dGhpcy5tYXhpbXVtSW5wdXRMZW5ndGgsaW5wdXQ6Yi50ZXJtLHBhcmFtczpifX0pOnZvaWQgYS5jYWxsKHRoaXMsYixjKX0sYX0pLGIuZGVmaW5lKFwic2VsZWN0Mi9kYXRhL21heGltdW1TZWxlY3Rpb25MZW5ndGhcIixbXSxmdW5jdGlvbigpe2Z1bmN0aW9uIGEoYSxiLGMpe3RoaXMubWF4aW11bVNlbGVjdGlvbkxlbmd0aD1jLmdldChcIm1heGltdW1TZWxlY3Rpb25MZW5ndGhcIiksYS5jYWxsKHRoaXMsYixjKX1yZXR1cm4gYS5wcm90b3R5cGUucXVlcnk9ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPXRoaXM7dGhpcy5jdXJyZW50KGZ1bmN0aW9uKGUpe3ZhciBmPW51bGwhPWU/ZS5sZW5ndGg6MDtyZXR1cm4gZC5tYXhpbXVtU2VsZWN0aW9uTGVuZ3RoPjAmJmY+PWQubWF4aW11bVNlbGVjdGlvbkxlbmd0aD92b2lkIGQudHJpZ2dlcihcInJlc3VsdHM6bWVzc2FnZVwiLHttZXNzYWdlOlwibWF4aW11bVNlbGVjdGVkXCIsYXJnczp7bWF4aW11bTpkLm1heGltdW1TZWxlY3Rpb25MZW5ndGh9fSk6dm9pZCBhLmNhbGwoZCxiLGMpfSl9LGF9KSxiLmRlZmluZShcInNlbGVjdDIvZHJvcGRvd25cIixbXCJqcXVlcnlcIixcIi4vdXRpbHNcIl0sZnVuY3Rpb24oYSxiKXtmdW5jdGlvbiBjKGEsYil7dGhpcy4kZWxlbWVudD1hLHRoaXMub3B0aW9ucz1iLGMuX19zdXBlcl9fLmNvbnN0cnVjdG9yLmNhbGwodGhpcyl9cmV0dXJuIGIuRXh0ZW5kKGMsYi5PYnNlcnZhYmxlKSxjLnByb3RvdHlwZS5yZW5kZXI9ZnVuY3Rpb24oKXt2YXIgYj1hKCc8c3BhbiBjbGFzcz1cInNlbGVjdDItZHJvcGRvd25cIj48c3BhbiBjbGFzcz1cInNlbGVjdDItcmVzdWx0c1wiPjwvc3Bhbj48L3NwYW4+Jyk7cmV0dXJuIGIuYXR0cihcImRpclwiLHRoaXMub3B0aW9ucy5nZXQoXCJkaXJcIikpLHRoaXMuJGRyb3Bkb3duPWIsYn0sYy5wcm90b3R5cGUuYmluZD1mdW5jdGlvbigpe30sYy5wcm90b3R5cGUucG9zaXRpb249ZnVuY3Rpb24oYSxiKXt9LGMucHJvdG90eXBlLmRlc3Ryb3k9ZnVuY3Rpb24oKXt0aGlzLiRkcm9wZG93bi5yZW1vdmUoKX0sY30pLGIuZGVmaW5lKFwic2VsZWN0Mi9kcm9wZG93bi9zZWFyY2hcIixbXCJqcXVlcnlcIixcIi4uL3V0aWxzXCJdLGZ1bmN0aW9uKGEsYil7ZnVuY3Rpb24gYygpe31yZXR1cm4gYy5wcm90b3R5cGUucmVuZGVyPWZ1bmN0aW9uKGIpe3ZhciBjPWIuY2FsbCh0aGlzKSxkPWEoJzxzcGFuIGNsYXNzPVwic2VsZWN0Mi1zZWFyY2ggc2VsZWN0Mi1zZWFyY2gtLWRyb3Bkb3duXCI+PGlucHV0IGNsYXNzPVwic2VsZWN0Mi1zZWFyY2hfX2ZpZWxkXCIgdHlwZT1cInNlYXJjaFwiIHRhYmluZGV4PVwiLTFcIiBhdXRvY29tcGxldGU9XCJvZmZcIiBhdXRvY29ycmVjdD1cIm9mZlwiIGF1dG9jYXBpdGFsaXplPVwib2ZmXCIgc3BlbGxjaGVjaz1cImZhbHNlXCIgcm9sZT1cInRleHRib3hcIiAvPjwvc3Bhbj4nKTtyZXR1cm4gdGhpcy4kc2VhcmNoQ29udGFpbmVyPWQsdGhpcy4kc2VhcmNoPWQuZmluZChcImlucHV0XCIpLGMucHJlcGVuZChkKSxjfSxjLnByb3RvdHlwZS5iaW5kPWZ1bmN0aW9uKGIsYyxkKXt2YXIgZT10aGlzO2IuY2FsbCh0aGlzLGMsZCksdGhpcy4kc2VhcmNoLm9uKFwia2V5ZG93blwiLGZ1bmN0aW9uKGEpe2UudHJpZ2dlcihcImtleXByZXNzXCIsYSksZS5fa2V5VXBQcmV2ZW50ZWQ9YS5pc0RlZmF1bHRQcmV2ZW50ZWQoKX0pLHRoaXMuJHNlYXJjaC5vbihcImlucHV0XCIsZnVuY3Rpb24oYil7YSh0aGlzKS5vZmYoXCJrZXl1cFwiKX0pLHRoaXMuJHNlYXJjaC5vbihcImtleXVwIGlucHV0XCIsZnVuY3Rpb24oYSl7ZS5oYW5kbGVTZWFyY2goYSl9KSxjLm9uKFwib3BlblwiLGZ1bmN0aW9uKCl7ZS4kc2VhcmNoLmF0dHIoXCJ0YWJpbmRleFwiLDApLGUuJHNlYXJjaC5mb2N1cygpLHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCl7ZS4kc2VhcmNoLmZvY3VzKCl9LDApfSksYy5vbihcImNsb3NlXCIsZnVuY3Rpb24oKXtlLiRzZWFyY2guYXR0cihcInRhYmluZGV4XCIsLTEpLGUuJHNlYXJjaC52YWwoXCJcIil9KSxjLm9uKFwiZm9jdXNcIixmdW5jdGlvbigpe2MuaXNPcGVuKCkmJmUuJHNlYXJjaC5mb2N1cygpfSksYy5vbihcInJlc3VsdHM6YWxsXCIsZnVuY3Rpb24oYSl7aWYobnVsbD09YS5xdWVyeS50ZXJtfHxcIlwiPT09YS5xdWVyeS50ZXJtKXt2YXIgYj1lLnNob3dTZWFyY2goYSk7Yj9lLiRzZWFyY2hDb250YWluZXIucmVtb3ZlQ2xhc3MoXCJzZWxlY3QyLXNlYXJjaC0taGlkZVwiKTplLiRzZWFyY2hDb250YWluZXIuYWRkQ2xhc3MoXCJzZWxlY3QyLXNlYXJjaC0taGlkZVwiKX19KX0sYy5wcm90b3R5cGUuaGFuZGxlU2VhcmNoPWZ1bmN0aW9uKGEpe2lmKCF0aGlzLl9rZXlVcFByZXZlbnRlZCl7dmFyIGI9dGhpcy4kc2VhcmNoLnZhbCgpO3RoaXMudHJpZ2dlcihcInF1ZXJ5XCIse3Rlcm06Yn0pfXRoaXMuX2tleVVwUHJldmVudGVkPSExfSxjLnByb3RvdHlwZS5zaG93U2VhcmNoPWZ1bmN0aW9uKGEsYil7cmV0dXJuITB9LGN9KSxiLmRlZmluZShcInNlbGVjdDIvZHJvcGRvd24vaGlkZVBsYWNlaG9sZGVyXCIsW10sZnVuY3Rpb24oKXtmdW5jdGlvbiBhKGEsYixjLGQpe3RoaXMucGxhY2Vob2xkZXI9dGhpcy5ub3JtYWxpemVQbGFjZWhvbGRlcihjLmdldChcInBsYWNlaG9sZGVyXCIpKSxhLmNhbGwodGhpcyxiLGMsZCl9cmV0dXJuIGEucHJvdG90eXBlLmFwcGVuZD1mdW5jdGlvbihhLGIpe2IucmVzdWx0cz10aGlzLnJlbW92ZVBsYWNlaG9sZGVyKGIucmVzdWx0cyksYS5jYWxsKHRoaXMsYil9LGEucHJvdG90eXBlLm5vcm1hbGl6ZVBsYWNlaG9sZGVyPWZ1bmN0aW9uKGEsYil7cmV0dXJuXCJzdHJpbmdcIj09dHlwZW9mIGImJihiPXtpZDpcIlwiLHRleHQ6Yn0pLGJ9LGEucHJvdG90eXBlLnJlbW92ZVBsYWNlaG9sZGVyPWZ1bmN0aW9uKGEsYil7Zm9yKHZhciBjPWIuc2xpY2UoMCksZD1iLmxlbmd0aC0xO2Q+PTA7ZC0tKXt2YXIgZT1iW2RdO3RoaXMucGxhY2Vob2xkZXIuaWQ9PT1lLmlkJiZjLnNwbGljZShkLDEpfXJldHVybiBjfSxhfSksYi5kZWZpbmUoXCJzZWxlY3QyL2Ryb3Bkb3duL2luZmluaXRlU2Nyb2xsXCIsW1wianF1ZXJ5XCJdLGZ1bmN0aW9uKGEpe2Z1bmN0aW9uIGIoYSxiLGMsZCl7dGhpcy5sYXN0UGFyYW1zPXt9LGEuY2FsbCh0aGlzLGIsYyxkKSx0aGlzLiRsb2FkaW5nTW9yZT10aGlzLmNyZWF0ZUxvYWRpbmdNb3JlKCksdGhpcy5sb2FkaW5nPSExfXJldHVybiBiLnByb3RvdHlwZS5hcHBlbmQ9ZnVuY3Rpb24oYSxiKXt0aGlzLiRsb2FkaW5nTW9yZS5yZW1vdmUoKSx0aGlzLmxvYWRpbmc9ITEsYS5jYWxsKHRoaXMsYiksdGhpcy5zaG93TG9hZGluZ01vcmUoYikmJnRoaXMuJHJlc3VsdHMuYXBwZW5kKHRoaXMuJGxvYWRpbmdNb3JlKX0sYi5wcm90b3R5cGUuYmluZD1mdW5jdGlvbihiLGMsZCl7dmFyIGU9dGhpcztiLmNhbGwodGhpcyxjLGQpLGMub24oXCJxdWVyeVwiLGZ1bmN0aW9uKGEpe2UubGFzdFBhcmFtcz1hLGUubG9hZGluZz0hMH0pLGMub24oXCJxdWVyeTphcHBlbmRcIixmdW5jdGlvbihhKXtlLmxhc3RQYXJhbXM9YSxlLmxvYWRpbmc9ITB9KSx0aGlzLiRyZXN1bHRzLm9uKFwic2Nyb2xsXCIsZnVuY3Rpb24oKXt2YXIgYj1hLmNvbnRhaW5zKGRvY3VtZW50LmRvY3VtZW50RWxlbWVudCxlLiRsb2FkaW5nTW9yZVswXSk7aWYoIWUubG9hZGluZyYmYil7dmFyIGM9ZS4kcmVzdWx0cy5vZmZzZXQoKS50b3ArZS4kcmVzdWx0cy5vdXRlckhlaWdodCghMSksZD1lLiRsb2FkaW5nTW9yZS5vZmZzZXQoKS50b3ArZS4kbG9hZGluZ01vcmUub3V0ZXJIZWlnaHQoITEpO2MrNTA+PWQmJmUubG9hZE1vcmUoKX19KX0sYi5wcm90b3R5cGUubG9hZE1vcmU9ZnVuY3Rpb24oKXt0aGlzLmxvYWRpbmc9ITA7dmFyIGI9YS5leHRlbmQoe30se3BhZ2U6MX0sdGhpcy5sYXN0UGFyYW1zKTtiLnBhZ2UrKyx0aGlzLnRyaWdnZXIoXCJxdWVyeTphcHBlbmRcIixiKX0sYi5wcm90b3R5cGUuc2hvd0xvYWRpbmdNb3JlPWZ1bmN0aW9uKGEsYil7cmV0dXJuIGIucGFnaW5hdGlvbiYmYi5wYWdpbmF0aW9uLm1vcmV9LGIucHJvdG90eXBlLmNyZWF0ZUxvYWRpbmdNb3JlPWZ1bmN0aW9uKCl7dmFyIGI9YSgnPGxpIGNsYXNzPVwic2VsZWN0Mi1yZXN1bHRzX19vcHRpb24gc2VsZWN0Mi1yZXN1bHRzX19vcHRpb24tLWxvYWQtbW9yZVwicm9sZT1cInRyZWVpdGVtXCIgYXJpYS1kaXNhYmxlZD1cInRydWVcIj48L2xpPicpLGM9dGhpcy5vcHRpb25zLmdldChcInRyYW5zbGF0aW9uc1wiKS5nZXQoXCJsb2FkaW5nTW9yZVwiKTtyZXR1cm4gYi5odG1sKGModGhpcy5sYXN0UGFyYW1zKSksYn0sYn0pLGIuZGVmaW5lKFwic2VsZWN0Mi9kcm9wZG93bi9hdHRhY2hCb2R5XCIsW1wianF1ZXJ5XCIsXCIuLi91dGlsc1wiXSxmdW5jdGlvbihhLGIpe2Z1bmN0aW9uIGMoYixjLGQpe3RoaXMuJGRyb3Bkb3duUGFyZW50PWQuZ2V0KFwiZHJvcGRvd25QYXJlbnRcIil8fGEoZG9jdW1lbnQuYm9keSksYi5jYWxsKHRoaXMsYyxkKX1yZXR1cm4gYy5wcm90b3R5cGUuYmluZD1mdW5jdGlvbihhLGIsYyl7dmFyIGQ9dGhpcyxlPSExO2EuY2FsbCh0aGlzLGIsYyksYi5vbihcIm9wZW5cIixmdW5jdGlvbigpe2QuX3Nob3dEcm9wZG93bigpLGQuX2F0dGFjaFBvc2l0aW9uaW5nSGFuZGxlcihiKSxlfHwoZT0hMCxiLm9uKFwicmVzdWx0czphbGxcIixmdW5jdGlvbigpe2QuX3Bvc2l0aW9uRHJvcGRvd24oKSxkLl9yZXNpemVEcm9wZG93bigpfSksYi5vbihcInJlc3VsdHM6YXBwZW5kXCIsZnVuY3Rpb24oKXtkLl9wb3NpdGlvbkRyb3Bkb3duKCksZC5fcmVzaXplRHJvcGRvd24oKX0pKX0pLGIub24oXCJjbG9zZVwiLGZ1bmN0aW9uKCl7ZC5faGlkZURyb3Bkb3duKCksZC5fZGV0YWNoUG9zaXRpb25pbmdIYW5kbGVyKGIpfSksdGhpcy4kZHJvcGRvd25Db250YWluZXIub24oXCJtb3VzZWRvd25cIixmdW5jdGlvbihhKXthLnN0b3BQcm9wYWdhdGlvbigpfSl9LGMucHJvdG90eXBlLmRlc3Ryb3k9ZnVuY3Rpb24oYSl7YS5jYWxsKHRoaXMpLHRoaXMuJGRyb3Bkb3duQ29udGFpbmVyLnJlbW92ZSgpfSxjLnByb3RvdHlwZS5wb3NpdGlvbj1mdW5jdGlvbihhLGIsYyl7Yi5hdHRyKFwiY2xhc3NcIixjLmF0dHIoXCJjbGFzc1wiKSksYi5yZW1vdmVDbGFzcyhcInNlbGVjdDJcIiksYi5hZGRDbGFzcyhcInNlbGVjdDItY29udGFpbmVyLS1vcGVuXCIpLGIuY3NzKHtwb3NpdGlvbjpcImFic29sdXRlXCIsdG9wOi05OTk5OTl9KSx0aGlzLiRjb250YWluZXI9Y30sYy5wcm90b3R5cGUucmVuZGVyPWZ1bmN0aW9uKGIpe3ZhciBjPWEoXCI8c3Bhbj48L3NwYW4+XCIpLGQ9Yi5jYWxsKHRoaXMpO3JldHVybiBjLmFwcGVuZChkKSx0aGlzLiRkcm9wZG93bkNvbnRhaW5lcj1jLGN9LGMucHJvdG90eXBlLl9oaWRlRHJvcGRvd249ZnVuY3Rpb24oYSl7dGhpcy4kZHJvcGRvd25Db250YWluZXIuZGV0YWNoKCl9LGMucHJvdG90eXBlLl9hdHRhY2hQb3NpdGlvbmluZ0hhbmRsZXI9ZnVuY3Rpb24oYyxkKXt2YXIgZT10aGlzLGY9XCJzY3JvbGwuc2VsZWN0Mi5cIitkLmlkLGc9XCJyZXNpemUuc2VsZWN0Mi5cIitkLmlkLGg9XCJvcmllbnRhdGlvbmNoYW5nZS5zZWxlY3QyLlwiK2QuaWQsaT10aGlzLiRjb250YWluZXIucGFyZW50cygpLmZpbHRlcihiLmhhc1Njcm9sbCk7aS5lYWNoKGZ1bmN0aW9uKCl7YSh0aGlzKS5kYXRhKFwic2VsZWN0Mi1zY3JvbGwtcG9zaXRpb25cIix7eDphKHRoaXMpLnNjcm9sbExlZnQoKSx5OmEodGhpcykuc2Nyb2xsVG9wKCl9KX0pLGkub24oZixmdW5jdGlvbihiKXt2YXIgYz1hKHRoaXMpLmRhdGEoXCJzZWxlY3QyLXNjcm9sbC1wb3NpdGlvblwiKTthKHRoaXMpLnNjcm9sbFRvcChjLnkpfSksYSh3aW5kb3cpLm9uKGYrXCIgXCIrZytcIiBcIitoLGZ1bmN0aW9uKGEpe2UuX3Bvc2l0aW9uRHJvcGRvd24oKSxlLl9yZXNpemVEcm9wZG93bigpfSl9LGMucHJvdG90eXBlLl9kZXRhY2hQb3NpdGlvbmluZ0hhbmRsZXI9ZnVuY3Rpb24oYyxkKXt2YXIgZT1cInNjcm9sbC5zZWxlY3QyLlwiK2QuaWQsZj1cInJlc2l6ZS5zZWxlY3QyLlwiK2QuaWQsZz1cIm9yaWVudGF0aW9uY2hhbmdlLnNlbGVjdDIuXCIrZC5pZCxoPXRoaXMuJGNvbnRhaW5lci5wYXJlbnRzKCkuZmlsdGVyKGIuaGFzU2Nyb2xsKTtoLm9mZihlKSxhKHdpbmRvdykub2ZmKGUrXCIgXCIrZitcIiBcIitnKX0sYy5wcm90b3R5cGUuX3Bvc2l0aW9uRHJvcGRvd249ZnVuY3Rpb24oKXt2YXIgYj1hKHdpbmRvdyksYz10aGlzLiRkcm9wZG93bi5oYXNDbGFzcyhcInNlbGVjdDItZHJvcGRvd24tLWFib3ZlXCIpLGQ9dGhpcy4kZHJvcGRvd24uaGFzQ2xhc3MoXCJzZWxlY3QyLWRyb3Bkb3duLS1iZWxvd1wiKSxlPW51bGwsZj10aGlzLiRjb250YWluZXIub2Zmc2V0KCk7Zi5ib3R0b209Zi50b3ArdGhpcy4kY29udGFpbmVyLm91dGVySGVpZ2h0KCExKTt2YXIgZz17aGVpZ2h0OnRoaXMuJGNvbnRhaW5lci5vdXRlckhlaWdodCghMSl9O2cudG9wPWYudG9wLGcuYm90dG9tPWYudG9wK2cuaGVpZ2h0O3ZhciBoPXtoZWlnaHQ6dGhpcy4kZHJvcGRvd24ub3V0ZXJIZWlnaHQoITEpfSxpPXt0b3A6Yi5zY3JvbGxUb3AoKSxib3R0b206Yi5zY3JvbGxUb3AoKStiLmhlaWdodCgpfSxqPWkudG9wPGYudG9wLWguaGVpZ2h0LGs9aS5ib3R0b20+Zi5ib3R0b20raC5oZWlnaHQsbD17bGVmdDpmLmxlZnQsdG9wOmcuYm90dG9tfSxtPXRoaXMuJGRyb3Bkb3duUGFyZW50O1wic3RhdGljXCI9PT1tLmNzcyhcInBvc2l0aW9uXCIpJiYobT1tLm9mZnNldFBhcmVudCgpKTt2YXIgbj1tLm9mZnNldCgpO2wudG9wLT1uLnRvcCxsLmxlZnQtPW4ubGVmdCxjfHxkfHwoZT1cImJlbG93XCIpLGt8fCFqfHxjPyFqJiZrJiZjJiYoZT1cImJlbG93XCIpOmU9XCJhYm92ZVwiLChcImFib3ZlXCI9PWV8fGMmJlwiYmVsb3dcIiE9PWUpJiYobC50b3A9Zy50b3Atbi50b3AtaC5oZWlnaHQpLG51bGwhPWUmJih0aGlzLiRkcm9wZG93bi5yZW1vdmVDbGFzcyhcInNlbGVjdDItZHJvcGRvd24tLWJlbG93IHNlbGVjdDItZHJvcGRvd24tLWFib3ZlXCIpLmFkZENsYXNzKFwic2VsZWN0Mi1kcm9wZG93bi0tXCIrZSksdGhpcy4kY29udGFpbmVyLnJlbW92ZUNsYXNzKFwic2VsZWN0Mi1jb250YWluZXItLWJlbG93IHNlbGVjdDItY29udGFpbmVyLS1hYm92ZVwiKS5hZGRDbGFzcyhcInNlbGVjdDItY29udGFpbmVyLS1cIitlKSksdGhpcy4kZHJvcGRvd25Db250YWluZXIuY3NzKGwpfSxjLnByb3RvdHlwZS5fcmVzaXplRHJvcGRvd249ZnVuY3Rpb24oKXt2YXIgYT17d2lkdGg6dGhpcy4kY29udGFpbmVyLm91dGVyV2lkdGgoITEpK1wicHhcIn07dGhpcy5vcHRpb25zLmdldChcImRyb3Bkb3duQXV0b1dpZHRoXCIpJiYoYS5taW5XaWR0aD1hLndpZHRoLGEucG9zaXRpb249XCJyZWxhdGl2ZVwiLGEud2lkdGg9XCJhdXRvXCIpLHRoaXMuJGRyb3Bkb3duLmNzcyhhKX0sYy5wcm90b3R5cGUuX3Nob3dEcm9wZG93bj1mdW5jdGlvbihhKXt0aGlzLiRkcm9wZG93bkNvbnRhaW5lci5hcHBlbmRUbyh0aGlzLiRkcm9wZG93blBhcmVudCksdGhpcy5fcG9zaXRpb25Ecm9wZG93bigpLHRoaXMuX3Jlc2l6ZURyb3Bkb3duKCl9LGN9KSxiLmRlZmluZShcInNlbGVjdDIvZHJvcGRvd24vbWluaW11bVJlc3VsdHNGb3JTZWFyY2hcIixbXSxmdW5jdGlvbigpe2Z1bmN0aW9uIGEoYil7Zm9yKHZhciBjPTAsZD0wO2Q8Yi5sZW5ndGg7ZCsrKXt2YXIgZT1iW2RdO2UuY2hpbGRyZW4/Yys9YShlLmNoaWxkcmVuKTpjKyt9cmV0dXJuIGN9ZnVuY3Rpb24gYihhLGIsYyxkKXt0aGlzLm1pbmltdW1SZXN1bHRzRm9yU2VhcmNoPWMuZ2V0KFwibWluaW11bVJlc3VsdHNGb3JTZWFyY2hcIiksdGhpcy5taW5pbXVtUmVzdWx0c0ZvclNlYXJjaDwwJiYodGhpcy5taW5pbXVtUmVzdWx0c0ZvclNlYXJjaD0xLzApLGEuY2FsbCh0aGlzLGIsYyxkKX1yZXR1cm4gYi5wcm90b3R5cGUuc2hvd1NlYXJjaD1mdW5jdGlvbihiLGMpe3JldHVybiBhKGMuZGF0YS5yZXN1bHRzKTx0aGlzLm1pbmltdW1SZXN1bHRzRm9yU2VhcmNoPyExOmIuY2FsbCh0aGlzLGMpfSxifSksYi5kZWZpbmUoXCJzZWxlY3QyL2Ryb3Bkb3duL3NlbGVjdE9uQ2xvc2VcIixbXSxmdW5jdGlvbigpe2Z1bmN0aW9uIGEoKXt9cmV0dXJuIGEucHJvdG90eXBlLmJpbmQ9ZnVuY3Rpb24oYSxiLGMpe3ZhciBkPXRoaXM7YS5jYWxsKHRoaXMsYixjKSxiLm9uKFwiY2xvc2VcIixmdW5jdGlvbihhKXtkLl9oYW5kbGVTZWxlY3RPbkNsb3NlKGEpfSl9LGEucHJvdG90eXBlLl9oYW5kbGVTZWxlY3RPbkNsb3NlPWZ1bmN0aW9uKGEsYil7aWYoYiYmbnVsbCE9Yi5vcmlnaW5hbFNlbGVjdDJFdmVudCl7dmFyIGM9Yi5vcmlnaW5hbFNlbGVjdDJFdmVudDtpZihcInNlbGVjdFwiPT09Yy5fdHlwZXx8XCJ1bnNlbGVjdFwiPT09Yy5fdHlwZSlyZXR1cm59dmFyIGQ9dGhpcy5nZXRIaWdobGlnaHRlZFJlc3VsdHMoKTtpZighKGQubGVuZ3RoPDEpKXt2YXIgZT1kLmRhdGEoXCJkYXRhXCIpO251bGwhPWUuZWxlbWVudCYmZS5lbGVtZW50LnNlbGVjdGVkfHxudWxsPT1lLmVsZW1lbnQmJmUuc2VsZWN0ZWR8fHRoaXMudHJpZ2dlcihcInNlbGVjdFwiLHtkYXRhOmV9KX19LGF9KSxiLmRlZmluZShcInNlbGVjdDIvZHJvcGRvd24vY2xvc2VPblNlbGVjdFwiLFtdLGZ1bmN0aW9uKCl7ZnVuY3Rpb24gYSgpe31yZXR1cm4gYS5wcm90b3R5cGUuYmluZD1mdW5jdGlvbihhLGIsYyl7dmFyIGQ9dGhpczthLmNhbGwodGhpcyxiLGMpLGIub24oXCJzZWxlY3RcIixmdW5jdGlvbihhKXtkLl9zZWxlY3RUcmlnZ2VyZWQoYSl9KSxiLm9uKFwidW5zZWxlY3RcIixmdW5jdGlvbihhKXtkLl9zZWxlY3RUcmlnZ2VyZWQoYSl9KX0sYS5wcm90b3R5cGUuX3NlbGVjdFRyaWdnZXJlZD1mdW5jdGlvbihhLGIpe3ZhciBjPWIub3JpZ2luYWxFdmVudDtjJiZjLmN0cmxLZXl8fHRoaXMudHJpZ2dlcihcImNsb3NlXCIse29yaWdpbmFsRXZlbnQ6YyxvcmlnaW5hbFNlbGVjdDJFdmVudDpifSl9LGF9KSxiLmRlZmluZShcInNlbGVjdDIvaTE4bi9lblwiLFtdLGZ1bmN0aW9uKCl7cmV0dXJue2Vycm9yTG9hZGluZzpmdW5jdGlvbigpe3JldHVyblwiVGhlIHJlc3VsdHMgY291bGQgbm90IGJlIGxvYWRlZC5cIn0saW5wdXRUb29Mb25nOmZ1bmN0aW9uKGEpe3ZhciBiPWEuaW5wdXQubGVuZ3RoLWEubWF4aW11bSxjPVwiUGxlYXNlIGRlbGV0ZSBcIitiK1wiIGNoYXJhY3RlclwiO3JldHVybiAxIT1iJiYoYys9XCJzXCIpLGN9LGlucHV0VG9vU2hvcnQ6ZnVuY3Rpb24oYSl7dmFyIGI9YS5taW5pbXVtLWEuaW5wdXQubGVuZ3RoLGM9XCJQbGVhc2UgZW50ZXIgXCIrYitcIiBvciBtb3JlIGNoYXJhY3RlcnNcIjtyZXR1cm4gY30sbG9hZGluZ01vcmU6ZnVuY3Rpb24oKXtyZXR1cm5cIkxvYWRpbmcgbW9yZSByZXN1bHRz4oCmXCJ9LG1heGltdW1TZWxlY3RlZDpmdW5jdGlvbihhKXt2YXIgYj1cIllvdSBjYW4gb25seSBzZWxlY3QgXCIrYS5tYXhpbXVtK1wiIGl0ZW1cIjtyZXR1cm4gMSE9YS5tYXhpbXVtJiYoYis9XCJzXCIpLGJ9LG5vUmVzdWx0czpmdW5jdGlvbigpe3JldHVyblwiTm8gcmVzdWx0cyBmb3VuZFwifSxzZWFyY2hpbmc6ZnVuY3Rpb24oKXtyZXR1cm5cIlNlYXJjaGluZ+KAplwifX19KSxiLmRlZmluZShcInNlbGVjdDIvZGVmYXVsdHNcIixbXCJqcXVlcnlcIixcInJlcXVpcmVcIixcIi4vcmVzdWx0c1wiLFwiLi9zZWxlY3Rpb24vc2luZ2xlXCIsXCIuL3NlbGVjdGlvbi9tdWx0aXBsZVwiLFwiLi9zZWxlY3Rpb24vcGxhY2Vob2xkZXJcIixcIi4vc2VsZWN0aW9uL2FsbG93Q2xlYXJcIixcIi4vc2VsZWN0aW9uL3NlYXJjaFwiLFwiLi9zZWxlY3Rpb24vZXZlbnRSZWxheVwiLFwiLi91dGlsc1wiLFwiLi90cmFuc2xhdGlvblwiLFwiLi9kaWFjcml0aWNzXCIsXCIuL2RhdGEvc2VsZWN0XCIsXCIuL2RhdGEvYXJyYXlcIixcIi4vZGF0YS9hamF4XCIsXCIuL2RhdGEvdGFnc1wiLFwiLi9kYXRhL3Rva2VuaXplclwiLFwiLi9kYXRhL21pbmltdW1JbnB1dExlbmd0aFwiLFwiLi9kYXRhL21heGltdW1JbnB1dExlbmd0aFwiLFwiLi9kYXRhL21heGltdW1TZWxlY3Rpb25MZW5ndGhcIixcIi4vZHJvcGRvd25cIixcIi4vZHJvcGRvd24vc2VhcmNoXCIsXCIuL2Ryb3Bkb3duL2hpZGVQbGFjZWhvbGRlclwiLFwiLi9kcm9wZG93bi9pbmZpbml0ZVNjcm9sbFwiLFwiLi9kcm9wZG93bi9hdHRhY2hCb2R5XCIsXCIuL2Ryb3Bkb3duL21pbmltdW1SZXN1bHRzRm9yU2VhcmNoXCIsXCIuL2Ryb3Bkb3duL3NlbGVjdE9uQ2xvc2VcIixcIi4vZHJvcGRvd24vY2xvc2VPblNlbGVjdFwiLFwiLi9pMThuL2VuXCJdLGZ1bmN0aW9uKGEsYixjLGQsZSxmLGcsaCxpLGosayxsLG0sbixvLHAscSxyLHMsdCx1LHYsdyx4LHkseixBLEIsQyl7ZnVuY3Rpb24gRCgpe3RoaXMucmVzZXQoKX1ELnByb3RvdHlwZS5hcHBseT1mdW5jdGlvbihsKXtpZihsPWEuZXh0ZW5kKCEwLHt9LHRoaXMuZGVmYXVsdHMsbCksbnVsbD09bC5kYXRhQWRhcHRlcil7aWYobnVsbCE9bC5hamF4P2wuZGF0YUFkYXB0ZXI9bzpudWxsIT1sLmRhdGE/bC5kYXRhQWRhcHRlcj1uOmwuZGF0YUFkYXB0ZXI9bSxsLm1pbmltdW1JbnB1dExlbmd0aD4wJiYobC5kYXRhQWRhcHRlcj1qLkRlY29yYXRlKGwuZGF0YUFkYXB0ZXIscikpLGwubWF4aW11bUlucHV0TGVuZ3RoPjAmJihsLmRhdGFBZGFwdGVyPWouRGVjb3JhdGUobC5kYXRhQWRhcHRlcixzKSksbC5tYXhpbXVtU2VsZWN0aW9uTGVuZ3RoPjAmJihsLmRhdGFBZGFwdGVyPWouRGVjb3JhdGUobC5kYXRhQWRhcHRlcix0KSksbC50YWdzJiYobC5kYXRhQWRhcHRlcj1qLkRlY29yYXRlKGwuZGF0YUFkYXB0ZXIscCkpLChudWxsIT1sLnRva2VuU2VwYXJhdG9yc3x8bnVsbCE9bC50b2tlbml6ZXIpJiYobC5kYXRhQWRhcHRlcj1qLkRlY29yYXRlKGwuZGF0YUFkYXB0ZXIscSkpLG51bGwhPWwucXVlcnkpe3ZhciBDPWIobC5hbWRCYXNlK1wiY29tcGF0L3F1ZXJ5XCIpO2wuZGF0YUFkYXB0ZXI9ai5EZWNvcmF0ZShsLmRhdGFBZGFwdGVyLEMpfWlmKG51bGwhPWwuaW5pdFNlbGVjdGlvbil7dmFyIEQ9YihsLmFtZEJhc2UrXCJjb21wYXQvaW5pdFNlbGVjdGlvblwiKTtsLmRhdGFBZGFwdGVyPWouRGVjb3JhdGUobC5kYXRhQWRhcHRlcixEKX19aWYobnVsbD09bC5yZXN1bHRzQWRhcHRlciYmKGwucmVzdWx0c0FkYXB0ZXI9YyxudWxsIT1sLmFqYXgmJihsLnJlc3VsdHNBZGFwdGVyPWouRGVjb3JhdGUobC5yZXN1bHRzQWRhcHRlcix4KSksbnVsbCE9bC5wbGFjZWhvbGRlciYmKGwucmVzdWx0c0FkYXB0ZXI9ai5EZWNvcmF0ZShsLnJlc3VsdHNBZGFwdGVyLHcpKSxsLnNlbGVjdE9uQ2xvc2UmJihsLnJlc3VsdHNBZGFwdGVyPWouRGVjb3JhdGUobC5yZXN1bHRzQWRhcHRlcixBKSkpLG51bGw9PWwuZHJvcGRvd25BZGFwdGVyKXtpZihsLm11bHRpcGxlKWwuZHJvcGRvd25BZGFwdGVyPXU7ZWxzZXt2YXIgRT1qLkRlY29yYXRlKHUsdik7bC5kcm9wZG93bkFkYXB0ZXI9RX1pZigwIT09bC5taW5pbXVtUmVzdWx0c0ZvclNlYXJjaCYmKGwuZHJvcGRvd25BZGFwdGVyPWouRGVjb3JhdGUobC5kcm9wZG93bkFkYXB0ZXIseikpLGwuY2xvc2VPblNlbGVjdCYmKGwuZHJvcGRvd25BZGFwdGVyPWouRGVjb3JhdGUobC5kcm9wZG93bkFkYXB0ZXIsQikpLG51bGwhPWwuZHJvcGRvd25Dc3NDbGFzc3x8bnVsbCE9bC5kcm9wZG93bkNzc3x8bnVsbCE9bC5hZGFwdERyb3Bkb3duQ3NzQ2xhc3Mpe3ZhciBGPWIobC5hbWRCYXNlK1wiY29tcGF0L2Ryb3Bkb3duQ3NzXCIpO2wuZHJvcGRvd25BZGFwdGVyPWouRGVjb3JhdGUobC5kcm9wZG93bkFkYXB0ZXIsRil9bC5kcm9wZG93bkFkYXB0ZXI9ai5EZWNvcmF0ZShsLmRyb3Bkb3duQWRhcHRlcix5KX1pZihudWxsPT1sLnNlbGVjdGlvbkFkYXB0ZXIpe2lmKGwubXVsdGlwbGU/bC5zZWxlY3Rpb25BZGFwdGVyPWU6bC5zZWxlY3Rpb25BZGFwdGVyPWQsbnVsbCE9bC5wbGFjZWhvbGRlciYmKGwuc2VsZWN0aW9uQWRhcHRlcj1qLkRlY29yYXRlKGwuc2VsZWN0aW9uQWRhcHRlcixmKSksbC5hbGxvd0NsZWFyJiYobC5zZWxlY3Rpb25BZGFwdGVyPWouRGVjb3JhdGUobC5zZWxlY3Rpb25BZGFwdGVyLGcpKSxsLm11bHRpcGxlJiYobC5zZWxlY3Rpb25BZGFwdGVyPWouRGVjb3JhdGUobC5zZWxlY3Rpb25BZGFwdGVyLGgpKSxudWxsIT1sLmNvbnRhaW5lckNzc0NsYXNzfHxudWxsIT1sLmNvbnRhaW5lckNzc3x8bnVsbCE9bC5hZGFwdENvbnRhaW5lckNzc0NsYXNzKXt2YXIgRz1iKGwuYW1kQmFzZStcImNvbXBhdC9jb250YWluZXJDc3NcIik7bC5zZWxlY3Rpb25BZGFwdGVyPWouRGVjb3JhdGUobC5zZWxlY3Rpb25BZGFwdGVyLEcpfWwuc2VsZWN0aW9uQWRhcHRlcj1qLkRlY29yYXRlKGwuc2VsZWN0aW9uQWRhcHRlcixpKX1pZihcInN0cmluZ1wiPT10eXBlb2YgbC5sYW5ndWFnZSlpZihsLmxhbmd1YWdlLmluZGV4T2YoXCItXCIpPjApe3ZhciBIPWwubGFuZ3VhZ2Uuc3BsaXQoXCItXCIpLEk9SFswXTtsLmxhbmd1YWdlPVtsLmxhbmd1YWdlLEldfWVsc2UgbC5sYW5ndWFnZT1bbC5sYW5ndWFnZV07aWYoYS5pc0FycmF5KGwubGFuZ3VhZ2UpKXt2YXIgSj1uZXcgaztsLmxhbmd1YWdlLnB1c2goXCJlblwiKTtmb3IodmFyIEs9bC5sYW5ndWFnZSxMPTA7TDxLLmxlbmd0aDtMKyspe3ZhciBNPUtbTF0sTj17fTt0cnl7Tj1rLmxvYWRQYXRoKE0pfWNhdGNoKE8pe3RyeXtNPXRoaXMuZGVmYXVsdHMuYW1kTGFuZ3VhZ2VCYXNlK00sTj1rLmxvYWRQYXRoKE0pfWNhdGNoKFApe2wuZGVidWcmJndpbmRvdy5jb25zb2xlJiZjb25zb2xlLndhcm4mJmNvbnNvbGUud2FybignU2VsZWN0MjogVGhlIGxhbmd1YWdlIGZpbGUgZm9yIFwiJytNKydcIiBjb3VsZCBub3QgYmUgYXV0b21hdGljYWxseSBsb2FkZWQuIEEgZmFsbGJhY2sgd2lsbCBiZSB1c2VkIGluc3RlYWQuJyk7Y29udGludWV9fUouZXh0ZW5kKE4pfWwudHJhbnNsYXRpb25zPUp9ZWxzZXt2YXIgUT1rLmxvYWRQYXRoKHRoaXMuZGVmYXVsdHMuYW1kTGFuZ3VhZ2VCYXNlK1wiZW5cIiksUj1uZXcgayhsLmxhbmd1YWdlKTtSLmV4dGVuZChRKSxsLnRyYW5zbGF0aW9ucz1SfXJldHVybiBsfSxELnByb3RvdHlwZS5yZXNldD1mdW5jdGlvbigpe2Z1bmN0aW9uIGIoYSl7ZnVuY3Rpb24gYihhKXtyZXR1cm4gbFthXXx8YX1yZXR1cm4gYS5yZXBsYWNlKC9bXlxcdTAwMDAtXFx1MDA3RV0vZyxiKX1mdW5jdGlvbiBjKGQsZSl7aWYoXCJcIj09PWEudHJpbShkLnRlcm0pKXJldHVybiBlO2lmKGUuY2hpbGRyZW4mJmUuY2hpbGRyZW4ubGVuZ3RoPjApe2Zvcih2YXIgZj1hLmV4dGVuZCghMCx7fSxlKSxnPWUuY2hpbGRyZW4ubGVuZ3RoLTE7Zz49MDtnLS0pe3ZhciBoPWUuY2hpbGRyZW5bZ10saT1jKGQsaCk7bnVsbD09aSYmZi5jaGlsZHJlbi5zcGxpY2UoZywxKX1yZXR1cm4gZi5jaGlsZHJlbi5sZW5ndGg+MD9mOmMoZCxmKX12YXIgaj1iKGUudGV4dCkudG9VcHBlckNhc2UoKSxrPWIoZC50ZXJtKS50b1VwcGVyQ2FzZSgpO3JldHVybiBqLmluZGV4T2Yoayk+LTE/ZTpudWxsfXRoaXMuZGVmYXVsdHM9e2FtZEJhc2U6XCIuL1wiLGFtZExhbmd1YWdlQmFzZTpcIi4vaTE4bi9cIixjbG9zZU9uU2VsZWN0OiEwLGRlYnVnOiExLGRyb3Bkb3duQXV0b1dpZHRoOiExLGVzY2FwZU1hcmt1cDpqLmVzY2FwZU1hcmt1cCxsYW5ndWFnZTpDLG1hdGNoZXI6YyxtaW5pbXVtSW5wdXRMZW5ndGg6MCxtYXhpbXVtSW5wdXRMZW5ndGg6MCxtYXhpbXVtU2VsZWN0aW9uTGVuZ3RoOjAsbWluaW11bVJlc3VsdHNGb3JTZWFyY2g6MCxzZWxlY3RPbkNsb3NlOiExLHNvcnRlcjpmdW5jdGlvbihhKXtyZXR1cm4gYX0sdGVtcGxhdGVSZXN1bHQ6ZnVuY3Rpb24oYSl7cmV0dXJuIGEudGV4dH0sdGVtcGxhdGVTZWxlY3Rpb246ZnVuY3Rpb24oYSl7cmV0dXJuIGEudGV4dH0sdGhlbWU6XCJkZWZhdWx0XCIsd2lkdGg6XCJyZXNvbHZlXCJ9fSxELnByb3RvdHlwZS5zZXQ9ZnVuY3Rpb24oYixjKXt2YXIgZD1hLmNhbWVsQ2FzZShiKSxlPXt9O2VbZF09Yzt2YXIgZj1qLl9jb252ZXJ0RGF0YShlKTthLmV4dGVuZCh0aGlzLmRlZmF1bHRzLGYpfTt2YXIgRT1uZXcgRDtyZXR1cm4gRX0pLGIuZGVmaW5lKFwic2VsZWN0Mi9vcHRpb25zXCIsW1wicmVxdWlyZVwiLFwianF1ZXJ5XCIsXCIuL2RlZmF1bHRzXCIsXCIuL3V0aWxzXCJdLGZ1bmN0aW9uKGEsYixjLGQpe2Z1bmN0aW9uIGUoYixlKXtpZih0aGlzLm9wdGlvbnM9YixudWxsIT1lJiZ0aGlzLmZyb21FbGVtZW50KGUpLHRoaXMub3B0aW9ucz1jLmFwcGx5KHRoaXMub3B0aW9ucyksZSYmZS5pcyhcImlucHV0XCIpKXt2YXIgZj1hKHRoaXMuZ2V0KFwiYW1kQmFzZVwiKStcImNvbXBhdC9pbnB1dERhdGFcIik7dGhpcy5vcHRpb25zLmRhdGFBZGFwdGVyPWQuRGVjb3JhdGUodGhpcy5vcHRpb25zLmRhdGFBZGFwdGVyLGYpfX1yZXR1cm4gZS5wcm90b3R5cGUuZnJvbUVsZW1lbnQ9ZnVuY3Rpb24oYSl7dmFyIGM9W1wic2VsZWN0MlwiXTtudWxsPT10aGlzLm9wdGlvbnMubXVsdGlwbGUmJih0aGlzLm9wdGlvbnMubXVsdGlwbGU9YS5wcm9wKFwibXVsdGlwbGVcIikpLG51bGw9PXRoaXMub3B0aW9ucy5kaXNhYmxlZCYmKHRoaXMub3B0aW9ucy5kaXNhYmxlZD1hLnByb3AoXCJkaXNhYmxlZFwiKSksbnVsbD09dGhpcy5vcHRpb25zLmxhbmd1YWdlJiYoYS5wcm9wKFwibGFuZ1wiKT90aGlzLm9wdGlvbnMubGFuZ3VhZ2U9YS5wcm9wKFwibGFuZ1wiKS50b0xvd2VyQ2FzZSgpOmEuY2xvc2VzdChcIltsYW5nXVwiKS5wcm9wKFwibGFuZ1wiKSYmKHRoaXMub3B0aW9ucy5sYW5ndWFnZT1hLmNsb3Nlc3QoXCJbbGFuZ11cIikucHJvcChcImxhbmdcIikpKSxudWxsPT10aGlzLm9wdGlvbnMuZGlyJiYoYS5wcm9wKFwiZGlyXCIpP3RoaXMub3B0aW9ucy5kaXI9YS5wcm9wKFwiZGlyXCIpOmEuY2xvc2VzdChcIltkaXJdXCIpLnByb3AoXCJkaXJcIik/dGhpcy5vcHRpb25zLmRpcj1hLmNsb3Nlc3QoXCJbZGlyXVwiKS5wcm9wKFwiZGlyXCIpOnRoaXMub3B0aW9ucy5kaXI9XCJsdHJcIiksYS5wcm9wKFwiZGlzYWJsZWRcIix0aGlzLm9wdGlvbnMuZGlzYWJsZWQpLGEucHJvcChcIm11bHRpcGxlXCIsdGhpcy5vcHRpb25zLm11bHRpcGxlKSxhLmRhdGEoXCJzZWxlY3QyVGFnc1wiKSYmKHRoaXMub3B0aW9ucy5kZWJ1ZyYmd2luZG93LmNvbnNvbGUmJmNvbnNvbGUud2FybiYmY29uc29sZS53YXJuKCdTZWxlY3QyOiBUaGUgYGRhdGEtc2VsZWN0Mi10YWdzYCBhdHRyaWJ1dGUgaGFzIGJlZW4gY2hhbmdlZCB0byB1c2UgdGhlIGBkYXRhLWRhdGFgIGFuZCBgZGF0YS10YWdzPVwidHJ1ZVwiYCBhdHRyaWJ1dGVzIGFuZCB3aWxsIGJlIHJlbW92ZWQgaW4gZnV0dXJlIHZlcnNpb25zIG9mIFNlbGVjdDIuJyksYS5kYXRhKFwiZGF0YVwiLGEuZGF0YShcInNlbGVjdDJUYWdzXCIpKSxhLmRhdGEoXCJ0YWdzXCIsITApKSxhLmRhdGEoXCJhamF4VXJsXCIpJiYodGhpcy5vcHRpb25zLmRlYnVnJiZ3aW5kb3cuY29uc29sZSYmY29uc29sZS53YXJuJiZjb25zb2xlLndhcm4oXCJTZWxlY3QyOiBUaGUgYGRhdGEtYWpheC11cmxgIGF0dHJpYnV0ZSBoYXMgYmVlbiBjaGFuZ2VkIHRvIGBkYXRhLWFqYXgtLXVybGAgYW5kIHN1cHBvcnQgZm9yIHRoZSBvbGQgYXR0cmlidXRlIHdpbGwgYmUgcmVtb3ZlZCBpbiBmdXR1cmUgdmVyc2lvbnMgb2YgU2VsZWN0Mi5cIiksYS5hdHRyKFwiYWpheC0tdXJsXCIsYS5kYXRhKFwiYWpheFVybFwiKSksYS5kYXRhKFwiYWpheC0tdXJsXCIsYS5kYXRhKFwiYWpheFVybFwiKSkpO3ZhciBlPXt9O2U9Yi5mbi5qcXVlcnkmJlwiMS5cIj09Yi5mbi5qcXVlcnkuc3Vic3RyKDAsMikmJmFbMF0uZGF0YXNldD9iLmV4dGVuZCghMCx7fSxhWzBdLmRhdGFzZXQsYS5kYXRhKCkpOmEuZGF0YSgpO3ZhciBmPWIuZXh0ZW5kKCEwLHt9LGUpO2Y9ZC5fY29udmVydERhdGEoZik7Zm9yKHZhciBnIGluIGYpYi5pbkFycmF5KGcsYyk+LTF8fChiLmlzUGxhaW5PYmplY3QodGhpcy5vcHRpb25zW2ddKT9iLmV4dGVuZCh0aGlzLm9wdGlvbnNbZ10sZltnXSk6dGhpcy5vcHRpb25zW2ddPWZbZ10pO3JldHVybiB0aGlzfSxlLnByb3RvdHlwZS5nZXQ9ZnVuY3Rpb24oYSl7cmV0dXJuIHRoaXMub3B0aW9uc1thXX0sZS5wcm90b3R5cGUuc2V0PWZ1bmN0aW9uKGEsYil7dGhpcy5vcHRpb25zW2FdPWJ9LGV9KSxiLmRlZmluZShcInNlbGVjdDIvY29yZVwiLFtcImpxdWVyeVwiLFwiLi9vcHRpb25zXCIsXCIuL3V0aWxzXCIsXCIuL2tleXNcIl0sZnVuY3Rpb24oYSxiLGMsZCl7dmFyIGU9ZnVuY3Rpb24oYSxjKXtudWxsIT1hLmRhdGEoXCJzZWxlY3QyXCIpJiZhLmRhdGEoXCJzZWxlY3QyXCIpLmRlc3Ryb3koKSx0aGlzLiRlbGVtZW50PWEsdGhpcy5pZD10aGlzLl9nZW5lcmF0ZUlkKGEpLGM9Y3x8e30sdGhpcy5vcHRpb25zPW5ldyBiKGMsYSksZS5fX3N1cGVyX18uY29uc3RydWN0b3IuY2FsbCh0aGlzKTt2YXIgZD1hLmF0dHIoXCJ0YWJpbmRleFwiKXx8MDthLmRhdGEoXCJvbGQtdGFiaW5kZXhcIixkKSxhLmF0dHIoXCJ0YWJpbmRleFwiLFwiLTFcIik7dmFyIGY9dGhpcy5vcHRpb25zLmdldChcImRhdGFBZGFwdGVyXCIpO3RoaXMuZGF0YUFkYXB0ZXI9bmV3IGYoYSx0aGlzLm9wdGlvbnMpO3ZhciBnPXRoaXMucmVuZGVyKCk7dGhpcy5fcGxhY2VDb250YWluZXIoZyk7dmFyIGg9dGhpcy5vcHRpb25zLmdldChcInNlbGVjdGlvbkFkYXB0ZXJcIik7dGhpcy5zZWxlY3Rpb249bmV3IGgoYSx0aGlzLm9wdGlvbnMpLHRoaXMuJHNlbGVjdGlvbj10aGlzLnNlbGVjdGlvbi5yZW5kZXIoKSx0aGlzLnNlbGVjdGlvbi5wb3NpdGlvbih0aGlzLiRzZWxlY3Rpb24sZyk7dmFyIGk9dGhpcy5vcHRpb25zLmdldChcImRyb3Bkb3duQWRhcHRlclwiKTt0aGlzLmRyb3Bkb3duPW5ldyBpKGEsdGhpcy5vcHRpb25zKSx0aGlzLiRkcm9wZG93bj10aGlzLmRyb3Bkb3duLnJlbmRlcigpLHRoaXMuZHJvcGRvd24ucG9zaXRpb24odGhpcy4kZHJvcGRvd24sZyk7dmFyIGo9dGhpcy5vcHRpb25zLmdldChcInJlc3VsdHNBZGFwdGVyXCIpO3RoaXMucmVzdWx0cz1uZXcgaihhLHRoaXMub3B0aW9ucyx0aGlzLmRhdGFBZGFwdGVyKSx0aGlzLiRyZXN1bHRzPXRoaXMucmVzdWx0cy5yZW5kZXIoKSx0aGlzLnJlc3VsdHMucG9zaXRpb24odGhpcy4kcmVzdWx0cyx0aGlzLiRkcm9wZG93bik7dmFyIGs9dGhpczt0aGlzLl9iaW5kQWRhcHRlcnMoKSx0aGlzLl9yZWdpc3RlckRvbUV2ZW50cygpLHRoaXMuX3JlZ2lzdGVyRGF0YUV2ZW50cygpLHRoaXMuX3JlZ2lzdGVyU2VsZWN0aW9uRXZlbnRzKCksdGhpcy5fcmVnaXN0ZXJEcm9wZG93bkV2ZW50cygpLHRoaXMuX3JlZ2lzdGVyUmVzdWx0c0V2ZW50cygpLHRoaXMuX3JlZ2lzdGVyRXZlbnRzKCksdGhpcy5kYXRhQWRhcHRlci5jdXJyZW50KGZ1bmN0aW9uKGEpe2sudHJpZ2dlcihcInNlbGVjdGlvbjp1cGRhdGVcIix7ZGF0YTphfSl9KSxhLmFkZENsYXNzKFwic2VsZWN0Mi1oaWRkZW4tYWNjZXNzaWJsZVwiKSxhLmF0dHIoXCJhcmlhLWhpZGRlblwiLFwidHJ1ZVwiKSx0aGlzLl9zeW5jQXR0cmlidXRlcygpLGEuZGF0YShcInNlbGVjdDJcIix0aGlzKX07cmV0dXJuIGMuRXh0ZW5kKGUsYy5PYnNlcnZhYmxlKSxlLnByb3RvdHlwZS5fZ2VuZXJhdGVJZD1mdW5jdGlvbihhKXt2YXIgYj1cIlwiO3JldHVybiBiPW51bGwhPWEuYXR0cihcImlkXCIpP2EuYXR0cihcImlkXCIpOm51bGwhPWEuYXR0cihcIm5hbWVcIik/YS5hdHRyKFwibmFtZVwiKStcIi1cIitjLmdlbmVyYXRlQ2hhcnMoMik6Yy5nZW5lcmF0ZUNoYXJzKDQpLGI9Yi5yZXBsYWNlKC8oOnxcXC58XFxbfFxcXXwsKS9nLFwiXCIpLGI9XCJzZWxlY3QyLVwiK2J9LGUucHJvdG90eXBlLl9wbGFjZUNvbnRhaW5lcj1mdW5jdGlvbihhKXthLmluc2VydEFmdGVyKHRoaXMuJGVsZW1lbnQpO3ZhciBiPXRoaXMuX3Jlc29sdmVXaWR0aCh0aGlzLiRlbGVtZW50LHRoaXMub3B0aW9ucy5nZXQoXCJ3aWR0aFwiKSk7bnVsbCE9YiYmYS5jc3MoXCJ3aWR0aFwiLGIpfSxlLnByb3RvdHlwZS5fcmVzb2x2ZVdpZHRoPWZ1bmN0aW9uKGEsYil7dmFyIGM9L153aWR0aDooKFstK10/KFswLTldKlxcLik/WzAtOV0rKShweHxlbXxleHwlfGlufGNtfG1tfHB0fHBjKSkvaTtpZihcInJlc29sdmVcIj09Yil7dmFyIGQ9dGhpcy5fcmVzb2x2ZVdpZHRoKGEsXCJzdHlsZVwiKTtyZXR1cm4gbnVsbCE9ZD9kOnRoaXMuX3Jlc29sdmVXaWR0aChhLFwiZWxlbWVudFwiKX1pZihcImVsZW1lbnRcIj09Yil7dmFyIGU9YS5vdXRlcldpZHRoKCExKTtyZXR1cm4gMD49ZT9cImF1dG9cIjplK1wicHhcIn1pZihcInN0eWxlXCI9PWIpe3ZhciBmPWEuYXR0cihcInN0eWxlXCIpO2lmKFwic3RyaW5nXCIhPXR5cGVvZiBmKXJldHVybiBudWxsO2Zvcih2YXIgZz1mLnNwbGl0KFwiO1wiKSxoPTAsaT1nLmxlbmd0aDtpPmg7aCs9MSl7dmFyIGo9Z1toXS5yZXBsYWNlKC9cXHMvZyxcIlwiKSxrPWoubWF0Y2goYyk7aWYobnVsbCE9PWsmJmsubGVuZ3RoPj0xKXJldHVybiBrWzFdfXJldHVybiBudWxsfXJldHVybiBifSxlLnByb3RvdHlwZS5fYmluZEFkYXB0ZXJzPWZ1bmN0aW9uKCl7dGhpcy5kYXRhQWRhcHRlci5iaW5kKHRoaXMsdGhpcy4kY29udGFpbmVyKSx0aGlzLnNlbGVjdGlvbi5iaW5kKHRoaXMsdGhpcy4kY29udGFpbmVyKSx0aGlzLmRyb3Bkb3duLmJpbmQodGhpcyx0aGlzLiRjb250YWluZXIpLHRoaXMucmVzdWx0cy5iaW5kKHRoaXMsdGhpcy4kY29udGFpbmVyKX0sZS5wcm90b3R5cGUuX3JlZ2lzdGVyRG9tRXZlbnRzPWZ1bmN0aW9uKCl7dmFyIGI9dGhpczt0aGlzLiRlbGVtZW50Lm9uKFwiY2hhbmdlLnNlbGVjdDJcIixmdW5jdGlvbigpe2IuZGF0YUFkYXB0ZXIuY3VycmVudChmdW5jdGlvbihhKXtiLnRyaWdnZXIoXCJzZWxlY3Rpb246dXBkYXRlXCIse2RhdGE6YX0pfSl9KSx0aGlzLiRlbGVtZW50Lm9uKFwiZm9jdXMuc2VsZWN0MlwiLGZ1bmN0aW9uKGEpe2IudHJpZ2dlcihcImZvY3VzXCIsYSl9KSx0aGlzLl9zeW5jQT1jLmJpbmQodGhpcy5fc3luY0F0dHJpYnV0ZXMsdGhpcyksdGhpcy5fc3luY1M9Yy5iaW5kKHRoaXMuX3N5bmNTdWJ0cmVlLHRoaXMpLHRoaXMuJGVsZW1lbnRbMF0uYXR0YWNoRXZlbnQmJnRoaXMuJGVsZW1lbnRbMF0uYXR0YWNoRXZlbnQoXCJvbnByb3BlcnR5Y2hhbmdlXCIsdGhpcy5fc3luY0EpO3ZhciBkPXdpbmRvdy5NdXRhdGlvbk9ic2VydmVyfHx3aW5kb3cuV2ViS2l0TXV0YXRpb25PYnNlcnZlcnx8d2luZG93Lk1vek11dGF0aW9uT2JzZXJ2ZXI7bnVsbCE9ZD8odGhpcy5fb2JzZXJ2ZXI9bmV3IGQoZnVuY3Rpb24oYyl7YS5lYWNoKGMsYi5fc3luY0EpLGEuZWFjaChjLGIuX3N5bmNTKX0pLHRoaXMuX29ic2VydmVyLm9ic2VydmUodGhpcy4kZWxlbWVudFswXSx7YXR0cmlidXRlczohMCxjaGlsZExpc3Q6ITAsc3VidHJlZTohMX0pKTp0aGlzLiRlbGVtZW50WzBdLmFkZEV2ZW50TGlzdGVuZXImJih0aGlzLiRlbGVtZW50WzBdLmFkZEV2ZW50TGlzdGVuZXIoXCJET01BdHRyTW9kaWZpZWRcIixiLl9zeW5jQSwhMSksdGhpcy4kZWxlbWVudFswXS5hZGRFdmVudExpc3RlbmVyKFwiRE9NTm9kZUluc2VydGVkXCIsYi5fc3luY1MsITEpLHRoaXMuJGVsZW1lbnRbMF0uYWRkRXZlbnRMaXN0ZW5lcihcIkRPTU5vZGVSZW1vdmVkXCIsYi5fc3luY1MsITEpKX0sZS5wcm90b3R5cGUuX3JlZ2lzdGVyRGF0YUV2ZW50cz1mdW5jdGlvbigpe3ZhciBhPXRoaXM7dGhpcy5kYXRhQWRhcHRlci5vbihcIipcIixmdW5jdGlvbihiLGMpe2EudHJpZ2dlcihiLGMpfSl9LGUucHJvdG90eXBlLl9yZWdpc3RlclNlbGVjdGlvbkV2ZW50cz1mdW5jdGlvbigpe3ZhciBiPXRoaXMsYz1bXCJ0b2dnbGVcIixcImZvY3VzXCJdO3RoaXMuc2VsZWN0aW9uLm9uKFwidG9nZ2xlXCIsZnVuY3Rpb24oKXtiLnRvZ2dsZURyb3Bkb3duKCl9KSx0aGlzLnNlbGVjdGlvbi5vbihcImZvY3VzXCIsZnVuY3Rpb24oYSl7Yi5mb2N1cyhhKX0pLHRoaXMuc2VsZWN0aW9uLm9uKFwiKlwiLGZ1bmN0aW9uKGQsZSl7LTE9PT1hLmluQXJyYXkoZCxjKSYmYi50cmlnZ2VyKGQsZSl9KX0sZS5wcm90b3R5cGUuX3JlZ2lzdGVyRHJvcGRvd25FdmVudHM9ZnVuY3Rpb24oKXt2YXIgYT10aGlzO3RoaXMuZHJvcGRvd24ub24oXCIqXCIsZnVuY3Rpb24oYixjKXthLnRyaWdnZXIoYixjKX0pfSxlLnByb3RvdHlwZS5fcmVnaXN0ZXJSZXN1bHRzRXZlbnRzPWZ1bmN0aW9uKCl7dmFyIGE9dGhpczt0aGlzLnJlc3VsdHMub24oXCIqXCIsZnVuY3Rpb24oYixjKXthLnRyaWdnZXIoYixjKX0pfSxlLnByb3RvdHlwZS5fcmVnaXN0ZXJFdmVudHM9ZnVuY3Rpb24oKXt2YXIgYT10aGlzO3RoaXMub24oXCJvcGVuXCIsZnVuY3Rpb24oKXthLiRjb250YWluZXIuYWRkQ2xhc3MoXCJzZWxlY3QyLWNvbnRhaW5lci0tb3BlblwiKX0pLHRoaXMub24oXCJjbG9zZVwiLGZ1bmN0aW9uKCl7YS4kY29udGFpbmVyLnJlbW92ZUNsYXNzKFwic2VsZWN0Mi1jb250YWluZXItLW9wZW5cIil9KSx0aGlzLm9uKFwiZW5hYmxlXCIsZnVuY3Rpb24oKXthLiRjb250YWluZXIucmVtb3ZlQ2xhc3MoXCJzZWxlY3QyLWNvbnRhaW5lci0tZGlzYWJsZWRcIil9KSx0aGlzLm9uKFwiZGlzYWJsZVwiLGZ1bmN0aW9uKCl7YS4kY29udGFpbmVyLmFkZENsYXNzKFwic2VsZWN0Mi1jb250YWluZXItLWRpc2FibGVkXCIpfSksdGhpcy5vbihcImJsdXJcIixmdW5jdGlvbigpe2EuJGNvbnRhaW5lci5yZW1vdmVDbGFzcyhcInNlbGVjdDItY29udGFpbmVyLS1mb2N1c1wiKX0pLHRoaXMub24oXCJxdWVyeVwiLGZ1bmN0aW9uKGIpe2EuaXNPcGVuKCl8fGEudHJpZ2dlcihcIm9wZW5cIix7fSksdGhpcy5kYXRhQWRhcHRlci5xdWVyeShiLGZ1bmN0aW9uKGMpe2EudHJpZ2dlcihcInJlc3VsdHM6YWxsXCIse2RhdGE6YyxxdWVyeTpifSl9KX0pLHRoaXMub24oXCJxdWVyeTphcHBlbmRcIixmdW5jdGlvbihiKXt0aGlzLmRhdGFBZGFwdGVyLnF1ZXJ5KGIsZnVuY3Rpb24oYyl7YS50cmlnZ2VyKFwicmVzdWx0czphcHBlbmRcIix7ZGF0YTpjLHF1ZXJ5OmJ9KX0pfSksdGhpcy5vbihcImtleXByZXNzXCIsZnVuY3Rpb24oYil7dmFyIGM9Yi53aGljaDthLmlzT3BlbigpP2M9PT1kLkVTQ3x8Yz09PWQuVEFCfHxjPT09ZC5VUCYmYi5hbHRLZXk/KGEuY2xvc2UoKSxiLnByZXZlbnREZWZhdWx0KCkpOmM9PT1kLkVOVEVSPyhhLnRyaWdnZXIoXCJyZXN1bHRzOnNlbGVjdFwiLHt9KSxiLnByZXZlbnREZWZhdWx0KCkpOmM9PT1kLlNQQUNFJiZiLmN0cmxLZXk/KGEudHJpZ2dlcihcInJlc3VsdHM6dG9nZ2xlXCIse30pLGIucHJldmVudERlZmF1bHQoKSk6Yz09PWQuVVA/KGEudHJpZ2dlcihcInJlc3VsdHM6cHJldmlvdXNcIix7fSksYi5wcmV2ZW50RGVmYXVsdCgpKTpjPT09ZC5ET1dOJiYoYS50cmlnZ2VyKFwicmVzdWx0czpuZXh0XCIse30pLGIucHJldmVudERlZmF1bHQoKSk6KGM9PT1kLkVOVEVSfHxjPT09ZC5TUEFDRXx8Yz09PWQuRE9XTiYmYi5hbHRLZXkpJiYoYS5vcGVuKCksYi5wcmV2ZW50RGVmYXVsdCgpKX0pfSxlLnByb3RvdHlwZS5fc3luY0F0dHJpYnV0ZXM9ZnVuY3Rpb24oKXt0aGlzLm9wdGlvbnMuc2V0KFwiZGlzYWJsZWRcIix0aGlzLiRlbGVtZW50LnByb3AoXCJkaXNhYmxlZFwiKSksdGhpcy5vcHRpb25zLmdldChcImRpc2FibGVkXCIpPyh0aGlzLmlzT3BlbigpJiZ0aGlzLmNsb3NlKCksdGhpcy50cmlnZ2VyKFwiZGlzYWJsZVwiLHt9KSk6dGhpcy50cmlnZ2VyKFwiZW5hYmxlXCIse30pfSxlLnByb3RvdHlwZS5fc3luY1N1YnRyZWU9ZnVuY3Rpb24oYSxiKXt2YXIgYz0hMSxkPXRoaXM7aWYoIWF8fCFhLnRhcmdldHx8XCJPUFRJT05cIj09PWEudGFyZ2V0Lm5vZGVOYW1lfHxcIk9QVEdST1VQXCI9PT1hLnRhcmdldC5ub2RlTmFtZSl7aWYoYilpZihiLmFkZGVkTm9kZXMmJmIuYWRkZWROb2Rlcy5sZW5ndGg+MClmb3IodmFyIGU9MDtlPGIuYWRkZWROb2Rlcy5sZW5ndGg7ZSsrKXt2YXIgZj1iLmFkZGVkTm9kZXNbZV07Zi5zZWxlY3RlZCYmKGM9ITApfWVsc2UgYi5yZW1vdmVkTm9kZXMmJmIucmVtb3ZlZE5vZGVzLmxlbmd0aD4wJiYoYz0hMCk7ZWxzZSBjPSEwO2MmJnRoaXMuZGF0YUFkYXB0ZXIuY3VycmVudChmdW5jdGlvbihhKXtkLnRyaWdnZXIoXCJzZWxlY3Rpb246dXBkYXRlXCIse2RhdGE6YX0pfSl9fSxlLnByb3RvdHlwZS50cmlnZ2VyPWZ1bmN0aW9uKGEsYil7dmFyIGM9ZS5fX3N1cGVyX18udHJpZ2dlcixkPXtvcGVuOlwib3BlbmluZ1wiLGNsb3NlOlwiY2xvc2luZ1wiLHNlbGVjdDpcInNlbGVjdGluZ1wiLHVuc2VsZWN0OlwidW5zZWxlY3RpbmdcIn07aWYodm9pZCAwPT09YiYmKGI9e30pLGEgaW4gZCl7dmFyIGY9ZFthXSxnPXtwcmV2ZW50ZWQ6ITEsbmFtZTphLGFyZ3M6Yn07aWYoYy5jYWxsKHRoaXMsZixnKSxnLnByZXZlbnRlZClyZXR1cm4gdm9pZChiLnByZXZlbnRlZD0hMCl9Yy5jYWxsKHRoaXMsYSxiKX0sZS5wcm90b3R5cGUudG9nZ2xlRHJvcGRvd249ZnVuY3Rpb24oKXt0aGlzLm9wdGlvbnMuZ2V0KFwiZGlzYWJsZWRcIil8fCh0aGlzLmlzT3BlbigpP3RoaXMuY2xvc2UoKTp0aGlzLm9wZW4oKSl9LGUucHJvdG90eXBlLm9wZW49ZnVuY3Rpb24oKXt0aGlzLmlzT3BlbigpfHx0aGlzLnRyaWdnZXIoXCJxdWVyeVwiLHt9KX0sZS5wcm90b3R5cGUuY2xvc2U9ZnVuY3Rpb24oKXt0aGlzLmlzT3BlbigpJiZ0aGlzLnRyaWdnZXIoXCJjbG9zZVwiLHt9KX0sZS5wcm90b3R5cGUuaXNPcGVuPWZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuJGNvbnRhaW5lci5oYXNDbGFzcyhcInNlbGVjdDItY29udGFpbmVyLS1vcGVuXCIpfSxlLnByb3RvdHlwZS5oYXNGb2N1cz1mdW5jdGlvbigpe3JldHVybiB0aGlzLiRjb250YWluZXIuaGFzQ2xhc3MoXCJzZWxlY3QyLWNvbnRhaW5lci0tZm9jdXNcIil9LGUucHJvdG90eXBlLmZvY3VzPWZ1bmN0aW9uKGEpe3RoaXMuaGFzRm9jdXMoKXx8KHRoaXMuJGNvbnRhaW5lci5hZGRDbGFzcyhcInNlbGVjdDItY29udGFpbmVyLS1mb2N1c1wiKSx0aGlzLnRyaWdnZXIoXCJmb2N1c1wiLHt9KSl9LGUucHJvdG90eXBlLmVuYWJsZT1mdW5jdGlvbihhKXt0aGlzLm9wdGlvbnMuZ2V0KFwiZGVidWdcIikmJndpbmRvdy5jb25zb2xlJiZjb25zb2xlLndhcm4mJmNvbnNvbGUud2FybignU2VsZWN0MjogVGhlIGBzZWxlY3QyKFwiZW5hYmxlXCIpYCBtZXRob2QgaGFzIGJlZW4gZGVwcmVjYXRlZCBhbmQgd2lsbCBiZSByZW1vdmVkIGluIGxhdGVyIFNlbGVjdDIgdmVyc2lvbnMuIFVzZSAkZWxlbWVudC5wcm9wKFwiZGlzYWJsZWRcIikgaW5zdGVhZC4nKSwobnVsbD09YXx8MD09PWEubGVuZ3RoKSYmKGE9WyEwXSk7dmFyIGI9IWFbMF07dGhpcy4kZWxlbWVudC5wcm9wKFwiZGlzYWJsZWRcIixiKX0sZS5wcm90b3R5cGUuZGF0YT1mdW5jdGlvbigpe3RoaXMub3B0aW9ucy5nZXQoXCJkZWJ1Z1wiKSYmYXJndW1lbnRzLmxlbmd0aD4wJiZ3aW5kb3cuY29uc29sZSYmY29uc29sZS53YXJuJiZjb25zb2xlLndhcm4oJ1NlbGVjdDI6IERhdGEgY2FuIG5vIGxvbmdlciBiZSBzZXQgdXNpbmcgYHNlbGVjdDIoXCJkYXRhXCIpYC4gWW91IHNob3VsZCBjb25zaWRlciBzZXR0aW5nIHRoZSB2YWx1ZSBpbnN0ZWFkIHVzaW5nIGAkZWxlbWVudC52YWwoKWAuJyk7dmFyIGE9W107cmV0dXJuIHRoaXMuZGF0YUFkYXB0ZXIuY3VycmVudChmdW5jdGlvbihiKXthPWJ9KSxhfSxlLnByb3RvdHlwZS52YWw9ZnVuY3Rpb24oYil7aWYodGhpcy5vcHRpb25zLmdldChcImRlYnVnXCIpJiZ3aW5kb3cuY29uc29sZSYmY29uc29sZS53YXJuJiZjb25zb2xlLndhcm4oJ1NlbGVjdDI6IFRoZSBgc2VsZWN0MihcInZhbFwiKWAgbWV0aG9kIGhhcyBiZWVuIGRlcHJlY2F0ZWQgYW5kIHdpbGwgYmUgcmVtb3ZlZCBpbiBsYXRlciBTZWxlY3QyIHZlcnNpb25zLiBVc2UgJGVsZW1lbnQudmFsKCkgaW5zdGVhZC4nKSxudWxsPT1ifHwwPT09Yi5sZW5ndGgpcmV0dXJuIHRoaXMuJGVsZW1lbnQudmFsKCk7dmFyIGM9YlswXTthLmlzQXJyYXkoYykmJihjPWEubWFwKGMsZnVuY3Rpb24oYSl7cmV0dXJuIGEudG9TdHJpbmcoKX0pKSx0aGlzLiRlbGVtZW50LnZhbChjKS50cmlnZ2VyKFwiY2hhbmdlXCIpfSxlLnByb3RvdHlwZS5kZXN0cm95PWZ1bmN0aW9uKCl7dGhpcy4kY29udGFpbmVyLnJlbW92ZSgpLHRoaXMuJGVsZW1lbnRbMF0uZGV0YWNoRXZlbnQmJnRoaXMuJGVsZW1lbnRbMF0uZGV0YWNoRXZlbnQoXCJvbnByb3BlcnR5Y2hhbmdlXCIsdGhpcy5fc3luY0EpLG51bGwhPXRoaXMuX29ic2VydmVyPyh0aGlzLl9vYnNlcnZlci5kaXNjb25uZWN0KCksdGhpcy5fb2JzZXJ2ZXI9bnVsbCk6dGhpcy4kZWxlbWVudFswXS5yZW1vdmVFdmVudExpc3RlbmVyJiYodGhpcy4kZWxlbWVudFswXS5yZW1vdmVFdmVudExpc3RlbmVyKFwiRE9NQXR0ck1vZGlmaWVkXCIsdGhpcy5fc3luY0EsITEpLHRoaXMuJGVsZW1lbnRbMF0ucmVtb3ZlRXZlbnRMaXN0ZW5lcihcIkRPTU5vZGVJbnNlcnRlZFwiLHRoaXMuX3N5bmNTLCExKSx0aGlzLiRlbGVtZW50WzBdLnJlbW92ZUV2ZW50TGlzdGVuZXIoXCJET01Ob2RlUmVtb3ZlZFwiLHRoaXMuX3N5bmNTLCExKSksdGhpcy5fc3luY0E9bnVsbCx0aGlzLl9zeW5jUz1udWxsLHRoaXMuJGVsZW1lbnQub2ZmKFwiLnNlbGVjdDJcIiksdGhpcy4kZWxlbWVudC5hdHRyKFwidGFiaW5kZXhcIix0aGlzLiRlbGVtZW50LmRhdGEoXCJvbGQtdGFiaW5kZXhcIikpLHRoaXMuJGVsZW1lbnQucmVtb3ZlQ2xhc3MoXCJzZWxlY3QyLWhpZGRlbi1hY2Nlc3NpYmxlXCIpLHRoaXMuJGVsZW1lbnQuYXR0cihcImFyaWEtaGlkZGVuXCIsXCJmYWxzZVwiKSx0aGlzLiRlbGVtZW50LnJlbW92ZURhdGEoXCJzZWxlY3QyXCIpLHRoaXMuZGF0YUFkYXB0ZXIuZGVzdHJveSgpLHRoaXMuc2VsZWN0aW9uLmRlc3Ryb3koKSx0aGlzLmRyb3Bkb3duLmRlc3Ryb3koKSx0aGlzLnJlc3VsdHMuZGVzdHJveSgpLHRoaXMuZGF0YUFkYXB0ZXI9bnVsbCx0aGlzLnNlbGVjdGlvbj1udWxsLHRoaXMuZHJvcGRvd249bnVsbCx0aGlzLnJlc3VsdHM9bnVsbDtcbn0sZS5wcm90b3R5cGUucmVuZGVyPWZ1bmN0aW9uKCl7dmFyIGI9YSgnPHNwYW4gY2xhc3M9XCJzZWxlY3QyIHNlbGVjdDItY29udGFpbmVyXCI+PHNwYW4gY2xhc3M9XCJzZWxlY3Rpb25cIj48L3NwYW4+PHNwYW4gY2xhc3M9XCJkcm9wZG93bi13cmFwcGVyXCIgYXJpYS1oaWRkZW49XCJ0cnVlXCI+PC9zcGFuPjwvc3Bhbj4nKTtyZXR1cm4gYi5hdHRyKFwiZGlyXCIsdGhpcy5vcHRpb25zLmdldChcImRpclwiKSksdGhpcy4kY29udGFpbmVyPWIsdGhpcy4kY29udGFpbmVyLmFkZENsYXNzKFwic2VsZWN0Mi1jb250YWluZXItLVwiK3RoaXMub3B0aW9ucy5nZXQoXCJ0aGVtZVwiKSksYi5kYXRhKFwiZWxlbWVudFwiLHRoaXMuJGVsZW1lbnQpLGJ9LGV9KSxiLmRlZmluZShcImpxdWVyeS1tb3VzZXdoZWVsXCIsW1wianF1ZXJ5XCJdLGZ1bmN0aW9uKGEpe3JldHVybiBhfSksYi5kZWZpbmUoXCJqcXVlcnkuc2VsZWN0MlwiLFtcImpxdWVyeVwiLFwianF1ZXJ5LW1vdXNld2hlZWxcIixcIi4vc2VsZWN0Mi9jb3JlXCIsXCIuL3NlbGVjdDIvZGVmYXVsdHNcIl0sZnVuY3Rpb24oYSxiLGMsZCl7aWYobnVsbD09YS5mbi5zZWxlY3QyKXt2YXIgZT1bXCJvcGVuXCIsXCJjbG9zZVwiLFwiZGVzdHJveVwiXTthLmZuLnNlbGVjdDI9ZnVuY3Rpb24oYil7aWYoYj1ifHx7fSxcIm9iamVjdFwiPT10eXBlb2YgYilyZXR1cm4gdGhpcy5lYWNoKGZ1bmN0aW9uKCl7dmFyIGQ9YS5leHRlbmQoITAse30sYik7bmV3IGMoYSh0aGlzKSxkKX0pLHRoaXM7aWYoXCJzdHJpbmdcIj09dHlwZW9mIGIpe3ZhciBkLGY9QXJyYXkucHJvdG90eXBlLnNsaWNlLmNhbGwoYXJndW1lbnRzLDEpO3JldHVybiB0aGlzLmVhY2goZnVuY3Rpb24oKXt2YXIgYz1hKHRoaXMpLmRhdGEoXCJzZWxlY3QyXCIpO251bGw9PWMmJndpbmRvdy5jb25zb2xlJiZjb25zb2xlLmVycm9yJiZjb25zb2xlLmVycm9yKFwiVGhlIHNlbGVjdDIoJ1wiK2IrXCInKSBtZXRob2Qgd2FzIGNhbGxlZCBvbiBhbiBlbGVtZW50IHRoYXQgaXMgbm90IHVzaW5nIFNlbGVjdDIuXCIpLGQ9Y1tiXS5hcHBseShjLGYpfSksYS5pbkFycmF5KGIsZSk+LTE/dGhpczpkfXRocm93IG5ldyBFcnJvcihcIkludmFsaWQgYXJndW1lbnRzIGZvciBTZWxlY3QyOiBcIitiKX19cmV0dXJuIG51bGw9PWEuZm4uc2VsZWN0Mi5kZWZhdWx0cyYmKGEuZm4uc2VsZWN0Mi5kZWZhdWx0cz1kKSxjfSkse2RlZmluZTpiLmRlZmluZSxyZXF1aXJlOmIucmVxdWlyZX19KCksYz1iLnJlcXVpcmUoXCJqcXVlcnkuc2VsZWN0MlwiKTtyZXR1cm4gYS5mbi5zZWxlY3QyLmFtZD1iLGN9KTsiLCIvKiEgVUlraXQgMi4yNS4wIHwgaHR0cDovL3d3dy5nZXR1aWtpdC5jb20gfCAoYykgMjAxNCBZT090aGVtZSB8IE1JVCBMaWNlbnNlICovXG4hZnVuY3Rpb24odCl7dmFyIGk7d2luZG93LlVJa2l0JiYoaT10KFVJa2l0KSksXCJmdW5jdGlvblwiPT10eXBlb2YgZGVmaW5lJiZkZWZpbmUuYW1kJiZkZWZpbmUoXCJ1aWtpdC1hY2NvcmRpb25cIixbXCJ1aWtpdFwiXSxmdW5jdGlvbigpe3JldHVybiBpfHx0KFVJa2l0KX0pfShmdW5jdGlvbih0KXtcInVzZSBzdHJpY3RcIjtmdW5jdGlvbiBpKGkpe3ZhciBvPXQuJChpKSxlPVwiYXV0b1wiO2lmKG8uaXMoXCI6dmlzaWJsZVwiKSllPW8ub3V0ZXJIZWlnaHQoKTtlbHNle3ZhciBhPXtwb3NpdGlvbjpvLmNzcyhcInBvc2l0aW9uXCIpLHZpc2liaWxpdHk6by5jc3MoXCJ2aXNpYmlsaXR5XCIpLGRpc3BsYXk6by5jc3MoXCJkaXNwbGF5XCIpfTtlPW8uY3NzKHtwb3NpdGlvbjpcImFic29sdXRlXCIsdmlzaWJpbGl0eTpcImhpZGRlblwiLGRpc3BsYXk6XCJibG9ja1wifSkub3V0ZXJIZWlnaHQoKSxvLmNzcyhhKX1yZXR1cm4gZX1yZXR1cm4gdC5jb21wb25lbnQoXCJhY2NvcmRpb25cIix7ZGVmYXVsdHM6e3Nob3dmaXJzdDohMCxjb2xsYXBzZTohMCxhbmltYXRlOiEwLGVhc2luZzpcInN3aW5nXCIsZHVyYXRpb246MzAwLHRvZ2dsZTpcIi51ay1hY2NvcmRpb24tdGl0bGVcIixjb250YWluZXJzOlwiLnVrLWFjY29yZGlvbi1jb250ZW50XCIsY2xzYWN0aXZlOlwidWstYWN0aXZlXCJ9LGJvb3Q6ZnVuY3Rpb24oKXt0LnJlYWR5KGZ1bmN0aW9uKGkpe3NldFRpbWVvdXQoZnVuY3Rpb24oKXt0LiQoXCJbZGF0YS11ay1hY2NvcmRpb25dXCIsaSkuZWFjaChmdW5jdGlvbigpe3ZhciBpPXQuJCh0aGlzKTtpLmRhdGEoXCJhY2NvcmRpb25cIil8fHQuYWNjb3JkaW9uKGksdC5VdGlscy5vcHRpb25zKGkuYXR0cihcImRhdGEtdWstYWNjb3JkaW9uXCIpKSl9KX0sMCl9KX0saW5pdDpmdW5jdGlvbigpe3ZhciBpPXRoaXM7dGhpcy5lbGVtZW50Lm9uKFwiY2xpY2sudWsuYWNjb3JkaW9uXCIsdGhpcy5vcHRpb25zLnRvZ2dsZSxmdW5jdGlvbihvKXtvLnByZXZlbnREZWZhdWx0KCksaS50b2dnbGVJdGVtKHQuJCh0aGlzKS5kYXRhKFwid3JhcHBlclwiKSxpLm9wdGlvbnMuYW5pbWF0ZSxpLm9wdGlvbnMuY29sbGFwc2UpfSksdGhpcy51cGRhdGUoKSx0aGlzLm9wdGlvbnMuc2hvd2ZpcnN0JiZ0aGlzLnRvZ2dsZUl0ZW0odGhpcy50b2dnbGUuZXEoMCkuZGF0YShcIndyYXBwZXJcIiksITEsITEpfSx0b2dnbGVJdGVtOmZ1bmN0aW9uKG8sZSxhKXt2YXIgbj10aGlzO28uZGF0YShcInRvZ2dsZVwiKS50b2dnbGVDbGFzcyh0aGlzLm9wdGlvbnMuY2xzYWN0aXZlKSxvLmRhdGEoXCJjb250ZW50XCIpLnRvZ2dsZUNsYXNzKHRoaXMub3B0aW9ucy5jbHNhY3RpdmUpO3ZhciBzPW8uZGF0YShcInRvZ2dsZVwiKS5oYXNDbGFzcyh0aGlzLm9wdGlvbnMuY2xzYWN0aXZlKTthJiYodGhpcy50b2dnbGUubm90KG8uZGF0YShcInRvZ2dsZVwiKSkucmVtb3ZlQ2xhc3ModGhpcy5vcHRpb25zLmNsc2FjdGl2ZSksdGhpcy5jb250ZW50Lm5vdChvLmRhdGEoXCJjb250ZW50XCIpKS5yZW1vdmVDbGFzcyh0aGlzLm9wdGlvbnMuY2xzYWN0aXZlKS5wYXJlbnQoKS5zdG9wKCkuY3NzKFwib3ZlcmZsb3dcIixcImhpZGRlblwiKS5hbmltYXRlKHtoZWlnaHQ6MH0se2Vhc2luZzp0aGlzLm9wdGlvbnMuZWFzaW5nLGR1cmF0aW9uOmU/dGhpcy5vcHRpb25zLmR1cmF0aW9uOjB9KS5hdHRyKFwiYXJpYS1leHBhbmRlZFwiLFwiZmFsc2VcIikpLG8uc3RvcCgpLmNzcyhcIm92ZXJmbG93XCIsXCJoaWRkZW5cIiksZT9vLmFuaW1hdGUoe2hlaWdodDpzP2koby5kYXRhKFwiY29udGVudFwiKSk6MH0se2Vhc2luZzp0aGlzLm9wdGlvbnMuZWFzaW5nLGR1cmF0aW9uOnRoaXMub3B0aW9ucy5kdXJhdGlvbixjb21wbGV0ZTpmdW5jdGlvbigpe3MmJihvLmNzcyh7b3ZlcmZsb3c6XCJcIixoZWlnaHQ6XCJhdXRvXCJ9KSx0LlV0aWxzLmNoZWNrRGlzcGxheShvLmRhdGEoXCJjb250ZW50XCIpKSksbi50cmlnZ2VyKFwiZGlzcGxheS51ay5jaGVja1wiKX19KTooby5oZWlnaHQocz9cImF1dG9cIjowKSxzJiYoby5jc3Moe292ZXJmbG93OlwiXCJ9KSx0LlV0aWxzLmNoZWNrRGlzcGxheShvLmRhdGEoXCJjb250ZW50XCIpKSksdGhpcy50cmlnZ2VyKFwiZGlzcGxheS51ay5jaGVja1wiKSksby5hdHRyKFwiYXJpYS1leHBhbmRlZFwiLHMpLHRoaXMuZWxlbWVudC50cmlnZ2VyKFwidG9nZ2xlLnVrLmFjY29yZGlvblwiLFtzLG8uZGF0YShcInRvZ2dsZVwiKSxvLmRhdGEoXCJjb250ZW50XCIpXSl9LHVwZGF0ZTpmdW5jdGlvbigpe3ZhciBpLG8sZSxhPXRoaXM7dGhpcy50b2dnbGU9dGhpcy5maW5kKHRoaXMub3B0aW9ucy50b2dnbGUpLHRoaXMuY29udGVudD10aGlzLmZpbmQodGhpcy5vcHRpb25zLmNvbnRhaW5lcnMpLHRoaXMuY29udGVudC5lYWNoKGZ1bmN0aW9uKG4pe2k9dC4kKHRoaXMpLGkucGFyZW50KCkuZGF0YShcIndyYXBwZXJcIik/bz1pLnBhcmVudCgpOihvPXQuJCh0aGlzKS53cmFwKCc8ZGl2IGRhdGEtd3JhcHBlcj1cInRydWVcIiBzdHlsZT1cIm92ZXJmbG93OmhpZGRlbjtoZWlnaHQ6MDtwb3NpdGlvbjpyZWxhdGl2ZTtcIj48L2Rpdj4nKS5wYXJlbnQoKSxvLmF0dHIoXCJhcmlhLWV4cGFuZGVkXCIsXCJmYWxzZVwiKSksZT1hLnRvZ2dsZS5lcShuKSxvLmRhdGEoXCJ0b2dnbGVcIixlKSxvLmRhdGEoXCJjb250ZW50XCIsaSksZS5kYXRhKFwid3JhcHBlclwiLG8pLGkuZGF0YShcIndyYXBwZXJcIixvKX0pLHRoaXMuZWxlbWVudC50cmlnZ2VyKFwidXBkYXRlLnVrLmFjY29yZGlvblwiLFt0aGlzXSl9fSksdC5hY2NvcmRpb259KTsiLCIvKiEgVUlraXQgMi4yNy40IHwgaHR0cDovL3d3dy5nZXR1aWtpdC5jb20gfCAoYykgMjAxNCBZT090aGVtZSB8IE1JVCBMaWNlbnNlICovXG4hZnVuY3Rpb24oaSl7dmFyIHQ7d2luZG93LlVJa2l0MiYmKHQ9aShVSWtpdDIpKSxcImZ1bmN0aW9uXCI9PXR5cGVvZiBkZWZpbmUmJmRlZmluZS5hbWQmJmRlZmluZShcInVpa2l0LWxpZ2h0Ym94XCIsW1widWlraXRcIl0sZnVuY3Rpb24oKXtyZXR1cm4gdHx8aShVSWtpdDIpfSl9KGZ1bmN0aW9uKGkpe1widXNlIHN0cmljdFwiO2Z1bmN0aW9uIHQodCl7aWYoZSlyZXR1cm4gZS5saWdodGJveD10LGU7ZT1pLiQoWyc8ZGl2IGNsYXNzPVwidWstbW9kYWxcIj4nLCc8ZGl2IGNsYXNzPVwidWstbW9kYWwtZGlhbG9nIHVrLW1vZGFsLWRpYWxvZy1saWdodGJveCB1ay1zbGlkZW5hdi1wb3NpdGlvblwiIHN0eWxlPVwibWFyZ2luLWxlZnQ6YXV0bzttYXJnaW4tcmlnaHQ6YXV0bzt3aWR0aDoyMDBweDtoZWlnaHQ6MjAwcHg7dG9wOicrTWF0aC5hYnMod2luZG93LmlubmVySGVpZ2h0LzItMjAwKSsncHg7XCI+JywnPGEgaHJlZj1cIiNcIiBjbGFzcz1cInVrLW1vZGFsLWNsb3NlIHVrLWNsb3NlIHVrLWNsb3NlLWFsdFwiPjwvYT4nLCc8ZGl2IGNsYXNzPVwidWstbGlnaHRib3gtY29udGVudFwiPjwvZGl2PicsJzxkaXYgY2xhc3M9XCJ1ay1tb2RhbC1zcGlubmVyIHVrLWhpZGRlblwiPjwvZGl2PicsXCI8L2Rpdj5cIixcIjwvZGl2PlwiXS5qb2luKFwiXCIpKS5hcHBlbmRUbyhcImJvZHlcIiksZS5kaWFsb2c9ZS5maW5kKFwiLnVrLW1vZGFsLWRpYWxvZzpmaXJzdFwiKSxlLmNvbnRlbnQ9ZS5maW5kKFwiLnVrLWxpZ2h0Ym94LWNvbnRlbnQ6Zmlyc3RcIiksZS5sb2FkZXI9ZS5maW5kKFwiLnVrLW1vZGFsLXNwaW5uZXI6Zmlyc3RcIiksZS5jbG9zZXI9ZS5maW5kKFwiLnVrLWNsb3NlLnVrLWNsb3NlLWFsdFwiKSxlLm1vZGFsPWkubW9kYWwoZSx7bW9kYWw6ITF9KSxlLm9uKFwic3dpcGVSaWdodCBzd2lwZUxlZnRcIixmdW5jdGlvbihpKXtlLmxpZ2h0Ym94W1wic3dpcGVMZWZ0XCI9PWkudHlwZT9cIm5leHRcIjpcInByZXZpb3VzXCJdKCl9KS5vbihcImNsaWNrXCIsXCJbZGF0YS1saWdodGJveC1wcmV2aW91c10sIFtkYXRhLWxpZ2h0Ym94LW5leHRdXCIsZnVuY3Rpb24odCl7dC5wcmV2ZW50RGVmYXVsdCgpLGUubGlnaHRib3hbaS4kKHRoaXMpLmlzKFwiW2RhdGEtbGlnaHRib3gtbmV4dF1cIik/XCJuZXh0XCI6XCJwcmV2aW91c1wiXSgpfSksZS5vbihcImhpZGUudWsubW9kYWxcIixmdW5jdGlvbigpe2UuY29udGVudC5odG1sKFwiXCIpfSk7dmFyIG89e3c6d2luZG93LmlubmVyV2lkdGgsaDp3aW5kb3cuaW5uZXJIZWlnaHR9O3JldHVybiBpLiR3aW4ub24oXCJsb2FkIHJlc2l6ZSBvcmllbnRhdGlvbmNoYW5nZVwiLGkuVXRpbHMuZGVib3VuY2UoZnVuY3Rpb24oKXtvLnchPT13aW5kb3cuaW5uZXJXaWR0aCYmZS5pcyhcIjp2aXNpYmxlXCIpJiYhaS5VdGlscy5pc0Z1bGxzY3JlZW4oKSYmZS5saWdodGJveC5maXRTaXplKCksbz17dzp3aW5kb3cuaW5uZXJXaWR0aCxoOndpbmRvdy5pbm5lckhlaWdodH19LDEwMCkpLGUubGlnaHRib3g9dCxlfXZhciBlLG89e307cmV0dXJuIGkuY29tcG9uZW50KFwibGlnaHRib3hcIix7ZGVmYXVsdHM6e2FsbG93ZnVsbHNjcmVlbjohMCxkdXJhdGlvbjo0MDAsZ3JvdXA6ITEsa2V5Ym9hcmQ6ITB9LGluZGV4OjAsaXRlbXM6ITEsYm9vdDpmdW5jdGlvbigpe2kuJGh0bWwub24oXCJjbGlja1wiLFwiW2RhdGEtdWstbGlnaHRib3hdXCIsZnVuY3Rpb24odCl7dC5wcmV2ZW50RGVmYXVsdCgpO3ZhciBlPWkuJCh0aGlzKTtlLmRhdGEoXCJsaWdodGJveFwiKXx8aS5saWdodGJveChlLGkuVXRpbHMub3B0aW9ucyhlLmF0dHIoXCJkYXRhLXVrLWxpZ2h0Ym94XCIpKSksZS5kYXRhKFwibGlnaHRib3hcIikuc2hvdyhlKX0pLGkuJGRvYy5vbihcImtleXVwXCIsZnVuY3Rpb24oaSl7aWYoZSYmZS5pcyhcIjp2aXNpYmxlXCIpJiZlLmxpZ2h0Ym94Lm9wdGlvbnMua2V5Ym9hcmQpc3dpdGNoKGkucHJldmVudERlZmF1bHQoKSxpLmtleUNvZGUpe2Nhc2UgMzc6ZS5saWdodGJveC5wcmV2aW91cygpO2JyZWFrO2Nhc2UgMzk6ZS5saWdodGJveC5uZXh0KCl9fSl9LGluaXQ6ZnVuY3Rpb24oKXt2YXIgdD1bXTtpZih0aGlzLmluZGV4PTAsdGhpcy5zaWJsaW5ncz1bXSx0aGlzLmVsZW1lbnQmJnRoaXMuZWxlbWVudC5sZW5ndGgpe3ZhciBlPXRoaXMub3B0aW9ucy5ncm91cD9pLiQoJ1tkYXRhLXVrLWxpZ2h0Ym94Kj1cIicrdGhpcy5vcHRpb25zLmdyb3VwKydcIl0nKTp0aGlzLmVsZW1lbnQ7ZS5lYWNoKGZ1bmN0aW9uKCl7dmFyIGU9aS4kKHRoaXMpO3QucHVzaCh7c291cmNlOmUuYXR0cihcImhyZWZcIiksdGl0bGU6ZS5hdHRyKFwiZGF0YS10aXRsZVwiKXx8ZS5hdHRyKFwidGl0bGVcIiksdHlwZTplLmF0dHIoXCJkYXRhLWxpZ2h0Ym94LXR5cGVcIil8fFwiYXV0b1wiLGxpbms6ZX0pfSksdGhpcy5pbmRleD1lLmluZGV4KHRoaXMuZWxlbWVudCksdGhpcy5zaWJsaW5ncz10fWVsc2UgdGhpcy5vcHRpb25zLmdyb3VwJiZ0aGlzLm9wdGlvbnMuZ3JvdXAubGVuZ3RoJiYodGhpcy5zaWJsaW5ncz10aGlzLm9wdGlvbnMuZ3JvdXApO3RoaXMudHJpZ2dlcihcImxpZ2h0Ym94LWluaXRcIixbdGhpc10pfSxzaG93OmZ1bmN0aW9uKGUpe3RoaXMubW9kYWw9dCh0aGlzKSx0aGlzLm1vZGFsLmRpYWxvZy5zdG9wKCksdGhpcy5tb2RhbC5jb250ZW50LnN0b3AoKTt2YXIgbyxuLHM9dGhpcyxoPWkuJC5EZWZlcnJlZCgpO2U9ZXx8MCxcIm9iamVjdFwiPT10eXBlb2YgZSYmdGhpcy5zaWJsaW5ncy5mb3JFYWNoKGZ1bmN0aW9uKGksdCl7ZVswXT09PWkubGlua1swXSYmKGU9dCl9KSwwPmU/ZT10aGlzLnNpYmxpbmdzLmxlbmd0aC1lOnRoaXMuc2libGluZ3NbZV18fChlPTApLG49dGhpcy5zaWJsaW5nc1tlXSxvPXtsaWdodGJveDpzLHNvdXJjZTpuLnNvdXJjZSx0eXBlOm4udHlwZSxpbmRleDplLHByb21pc2U6aCx0aXRsZTpuLnRpdGxlLGl0ZW06bixtZXRhOntjb250ZW50OlwiXCIsd2lkdGg6bnVsbCxoZWlnaHQ6bnVsbH19LHRoaXMuaW5kZXg9ZSx0aGlzLm1vZGFsLmNvbnRlbnQuZW1wdHkoKSx0aGlzLm1vZGFsLmlzKFwiOnZpc2libGVcIil8fCh0aGlzLm1vZGFsLmNvbnRlbnQuY3NzKHt3aWR0aDpcIlwiLGhlaWdodDpcIlwifSkuZW1wdHkoKSx0aGlzLm1vZGFsLm1vZGFsLnNob3coKSksdGhpcy5tb2RhbC5sb2FkZXIucmVtb3ZlQ2xhc3MoXCJ1ay1oaWRkZW5cIiksaC5wcm9taXNlKCkuZG9uZShmdW5jdGlvbigpe3MuZGF0YT1vLHMuZml0U2l6ZShvKX0pLmZhaWwoZnVuY3Rpb24oKXtvLm1ldGEuY29udGVudD0nPGRpdiBjbGFzcz1cInVrLXBvc2l0aW9uLWNvdmVyIHVrLWZsZXggdWstZmxleC1taWRkbGUgdWstZmxleC1jZW50ZXJcIj48c3Ryb25nPkxvYWRpbmcgcmVzb3VyY2UgZmFpbGVkITwvc3Ryb25nPjwvZGl2Picsby5tZXRhLndpZHRoPTQwMCxvLm1ldGEuaGVpZ2h0PTMwMCxzLmRhdGE9byxzLmZpdFNpemUobyl9KSxzLnRyaWdnZXIoXCJzaG93aXRlbS51ay5saWdodGJveFwiLFtvXSl9LGZpdFNpemU6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLGU9dGhpcy5kYXRhLG89dGhpcy5tb2RhbC5kaWFsb2cub3V0ZXJXaWR0aCgpLXRoaXMubW9kYWwuZGlhbG9nLndpZHRoKCksbj1wYXJzZUludCh0aGlzLm1vZGFsLmRpYWxvZy5jc3MoXCJtYXJnaW4tdG9wXCIpLDEwKSxzPXBhcnNlSW50KHRoaXMubW9kYWwuZGlhbG9nLmNzcyhcIm1hcmdpbi1ib3R0b21cIiksMTApLGg9bitzLGE9ZS5tZXRhLmNvbnRlbnQsbD10Lm9wdGlvbnMuZHVyYXRpb247dGhpcy5zaWJsaW5ncy5sZW5ndGg+MSYmKGE9W2EsJzxhIGhyZWY9XCIjXCIgY2xhc3M9XCJ1ay1zbGlkZW5hdiB1ay1zbGlkZW5hdi1jb250cmFzdCB1ay1zbGlkZW5hdi1wcmV2aW91cyB1ay1oaWRkZW4tdG91Y2hcIiBkYXRhLWxpZ2h0Ym94LXByZXZpb3VzPjwvYT4nLCc8YSBocmVmPVwiI1wiIGNsYXNzPVwidWstc2xpZGVuYXYgdWstc2xpZGVuYXYtY29udHJhc3QgdWstc2xpZGVuYXYtbmV4dCB1ay1oaWRkZW4tdG91Y2hcIiBkYXRhLWxpZ2h0Ym94LW5leHQ+PC9hPiddLmpvaW4oXCJcIikpO3ZhciBkLHIsdT1pLiQoXCI8ZGl2PiZuYnNwOzwvZGl2PlwiKS5jc3Moe29wYWNpdHk6MCxwb3NpdGlvbjpcImFic29sdXRlXCIsdG9wOjAsbGVmdDowLHdpZHRoOlwiMTAwJVwiLG1heFdpZHRoOnQubW9kYWwuZGlhbG9nLmNzcyhcIm1heC13aWR0aFwiKSxwYWRkaW5nOnQubW9kYWwuZGlhbG9nLmNzcyhcInBhZGRpbmdcIiksbWFyZ2luOnQubW9kYWwuZGlhbG9nLmNzcyhcIm1hcmdpblwiKX0pLGM9ZS5tZXRhLndpZHRoLGc9ZS5tZXRhLmhlaWdodDt1LmFwcGVuZFRvKFwiYm9keVwiKS53aWR0aCgpLGQ9dS53aWR0aCgpLHI9d2luZG93LmlubmVySGVpZ2h0LWgsdS5yZW1vdmUoKSx0aGlzLm1vZGFsLmRpYWxvZy5maW5kKFwiLnVrLW1vZGFsLWNhcHRpb25cIikucmVtb3ZlKCksZS50aXRsZSYmKHRoaXMubW9kYWwuZGlhbG9nLmFwcGVuZCgnPGRpdiBjbGFzcz1cInVrLW1vZGFsLWNhcHRpb25cIj4nK2UudGl0bGUrXCI8L2Rpdj5cIiksci09dGhpcy5tb2RhbC5kaWFsb2cuZmluZChcIi51ay1tb2RhbC1jYXB0aW9uXCIpLm91dGVySGVpZ2h0KCkpLGQ8ZS5tZXRhLndpZHRoJiYoZz1NYXRoLmZsb29yKGcqKGQvYykpLGM9ZCksZz5yJiYoZz1NYXRoLmZsb29yKHIpLGM9TWF0aC5jZWlsKGUubWV0YS53aWR0aCooci9lLm1ldGEuaGVpZ2h0KSkpLHRoaXMubW9kYWwuY29udGVudC5jc3MoXCJvcGFjaXR5XCIsMCkud2lkdGgoYykuaHRtbChhKSxcImlmcmFtZVwiPT1lLnR5cGUmJnRoaXMubW9kYWwuY29udGVudC5maW5kKFwiaWZyYW1lOmZpcnN0XCIpLmhlaWdodChnKTt2YXIgbT1nK28scD1NYXRoLmZsb29yKHdpbmRvdy5pbm5lckhlaWdodC8yLW0vMiktaDswPnAmJihwPTApLHRoaXMubW9kYWwuY2xvc2VyLmFkZENsYXNzKFwidWstaGlkZGVuXCIpLHQubW9kYWwuZGF0YShcIm13aWR0aFwiKT09YyYmdC5tb2RhbC5kYXRhKFwibWhlaWdodFwiKT09ZyYmKGw9MCksdGhpcy5tb2RhbC5kaWFsb2cuYW5pbWF0ZSh7d2lkdGg6YytvLGhlaWdodDpnK28sdG9wOnB9LGwsXCJzd2luZ1wiLGZ1bmN0aW9uKCl7dC5tb2RhbC5sb2FkZXIuYWRkQ2xhc3MoXCJ1ay1oaWRkZW5cIiksdC5tb2RhbC5jb250ZW50LmNzcyh7d2lkdGg6XCJcIn0pLmFuaW1hdGUoe29wYWNpdHk6MX0sZnVuY3Rpb24oKXt0Lm1vZGFsLmNsb3Nlci5yZW1vdmVDbGFzcyhcInVrLWhpZGRlblwiKX0pLHQubW9kYWwuZGF0YSh7bXdpZHRoOmMsbWhlaWdodDpnfSl9KX0sbmV4dDpmdW5jdGlvbigpe3RoaXMuc2hvdyh0aGlzLnNpYmxpbmdzW3RoaXMuaW5kZXgrMV0/dGhpcy5pbmRleCsxOjApfSxwcmV2aW91czpmdW5jdGlvbigpe3RoaXMuc2hvdyh0aGlzLnNpYmxpbmdzW3RoaXMuaW5kZXgtMV0/dGhpcy5pbmRleC0xOnRoaXMuc2libGluZ3MubGVuZ3RoLTEpfX0pLGkucGx1Z2luKFwibGlnaHRib3hcIixcImltYWdlXCIse2luaXQ6ZnVuY3Rpb24oaSl7aS5vbihcInNob3dpdGVtLnVrLmxpZ2h0Ym94XCIsZnVuY3Rpb24oaSx0KXtpZihcImltYWdlXCI9PXQudHlwZXx8dC5zb3VyY2UmJnQuc291cmNlLm1hdGNoKC9cXC4oanBnfGpwZWd8cG5nfGdpZnxzdmcpJC9pKSl7dmFyIGU9ZnVuY3Rpb24oaSxlLG8pe3QubWV0YT17Y29udGVudDonPGltZyBjbGFzcz1cInVrLXJlc3BvbnNpdmUtd2lkdGhcIiB3aWR0aD1cIicrZSsnXCIgaGVpZ2h0PVwiJytvKydcIiBzcmMgPVwiJytpKydcIj4nLHdpZHRoOmUsaGVpZ2h0Om99LHQudHlwZT1cImltYWdlXCIsdC5wcm9taXNlLnJlc29sdmUoKX07aWYob1t0LnNvdXJjZV0pZSh0LnNvdXJjZSxvW3Quc291cmNlXS53aWR0aCxvW3Quc291cmNlXS5oZWlnaHQpO2Vsc2V7dmFyIG49bmV3IEltYWdlO24ub25lcnJvcj1mdW5jdGlvbigpe3QucHJvbWlzZS5yZWplY3QoXCJMb2FkaW5nIGltYWdlIGZhaWxlZFwiKX0sbi5vbmxvYWQ9ZnVuY3Rpb24oKXtvW3Quc291cmNlXT17d2lkdGg6bi53aWR0aCxoZWlnaHQ6bi5oZWlnaHR9LGUodC5zb3VyY2Usb1t0LnNvdXJjZV0ud2lkdGgsb1t0LnNvdXJjZV0uaGVpZ2h0KX0sbi5zcmM9dC5zb3VyY2V9fX0pfX0pLGkucGx1Z2luKFwibGlnaHRib3hcIixcInlvdXR1YmVcIix7aW5pdDpmdW5jdGlvbihpKXt2YXIgdD0vKFxcL1xcLy4qP3lvdXR1YmVcXC5bYS16XSspXFwvd2F0Y2hcXD92PShbXiZdKykmPyguKikvLG49L3lvdXR1XFwuYmVcXC8oLiopLztpLm9uKFwic2hvd2l0ZW0udWsubGlnaHRib3hcIixmdW5jdGlvbihpLHMpe3ZhciBoLGEsbD1mdW5jdGlvbihpLHQsbyl7cy5tZXRhPXtjb250ZW50Oic8aWZyYW1lIHNyYz1cIi8vd3d3LnlvdXR1YmUuY29tL2VtYmVkLycraSsnXCIgd2lkdGg9XCInK3QrJ1wiIGhlaWdodD1cIicrbysnXCIgc3R5bGU9XCJtYXgtd2lkdGg6MTAwJTtcIicrKGUubGlnaHRib3gub3B0aW9ucy5hbGxvd2Z1bGxzY3JlZW4/XCIgYWxsb3dmdWxsc2NyZWVuXCI6XCJcIikrXCI+PC9pZnJhbWU+XCIsd2lkdGg6dCxoZWlnaHQ6b30scy50eXBlPVwiaWZyYW1lXCIscy5wcm9taXNlLnJlc29sdmUoKX07aWYoKGE9cy5zb3VyY2UubWF0Y2godCkpJiYoaD1hWzJdKSwoYT1zLnNvdXJjZS5tYXRjaChuKSkmJihoPWFbMV0pLGgpe2lmKG9baF0pbChoLG9baF0ud2lkdGgsb1toXS5oZWlnaHQpO2Vsc2V7dmFyIGQ9bmV3IEltYWdlLHI9ITE7ZC5vbmVycm9yPWZ1bmN0aW9uKCl7b1toXT17d2lkdGg6NjQwLGhlaWdodDozMjB9LGwoaCxvW2hdLndpZHRoLG9baF0uaGVpZ2h0KX0sZC5vbmxvYWQ9ZnVuY3Rpb24oKXsxMjA9PWQud2lkdGgmJjkwPT1kLmhlaWdodD9yPyhvW2hdPXt3aWR0aDo2NDAsaGVpZ2h0OjMyMH0sbChoLG9baF0ud2lkdGgsb1toXS5oZWlnaHQpKToocj0hMCxkLnNyYz1cIi8vaW1nLnlvdXR1YmUuY29tL3ZpL1wiK2grXCIvMC5qcGdcIik6KG9baF09e3dpZHRoOmQud2lkdGgsaGVpZ2h0OmQuaGVpZ2h0fSxsKGgsZC53aWR0aCxkLmhlaWdodCkpfSxkLnNyYz1cIi8vaW1nLnlvdXR1YmUuY29tL3ZpL1wiK2grXCIvbWF4cmVzZGVmYXVsdC5qcGdcIn1pLnN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpfX0pfX0pLGkucGx1Z2luKFwibGlnaHRib3hcIixcInZpbWVvXCIse2luaXQ6ZnVuY3Rpb24odCl7dmFyIG4scz0vKFxcL1xcLy4qPyl2aW1lb1xcLlthLXpdK1xcLyhbMC05XSspLio/Lzt0Lm9uKFwic2hvd2l0ZW0udWsubGlnaHRib3hcIixmdW5jdGlvbih0LGgpe3ZhciBhLGw9ZnVuY3Rpb24oaSx0LG8pe2gubWV0YT17Y29udGVudDonPGlmcmFtZSBzcmM9XCIvL3BsYXllci52aW1lby5jb20vdmlkZW8vJytpKydcIiB3aWR0aD1cIicrdCsnXCIgaGVpZ2h0PVwiJytvKydcIiBzdHlsZT1cIndpZHRoOjEwMCU7Ym94LXNpemluZzpib3JkZXItYm94O1wiJysoZS5saWdodGJveC5vcHRpb25zLmFsbG93ZnVsbHNjcmVlbj9cIiBhbGxvd2Z1bGxzY3JlZW5cIjpcIlwiKStcIj48L2lmcmFtZT5cIix3aWR0aDp0LGhlaWdodDpvfSxoLnR5cGU9XCJpZnJhbWVcIixoLnByb21pc2UucmVzb2x2ZSgpfTsobj1oLnNvdXJjZS5tYXRjaChzKSkmJihhPW5bMl0sb1thXT9sKGEsb1thXS53aWR0aCxvW2FdLmhlaWdodCk6aS4kLmFqYXgoe3R5cGU6XCJHRVRcIix1cmw6XCIvL3ZpbWVvLmNvbS9hcGkvb2VtYmVkLmpzb24/dXJsPVwiK2VuY29kZVVSSShoLnNvdXJjZSksanNvbnA6XCJjYWxsYmFja1wiLGRhdGFUeXBlOlwianNvbnBcIixzdWNjZXNzOmZ1bmN0aW9uKGkpe29bYV09e3dpZHRoOmkud2lkdGgsaGVpZ2h0OmkuaGVpZ2h0fSxsKGEsb1thXS53aWR0aCxvW2FdLmhlaWdodCl9fSksdC5zdG9wSW1tZWRpYXRlUHJvcGFnYXRpb24oKSl9KX19KSxpLnBsdWdpbihcImxpZ2h0Ym94XCIsXCJ2aWRlb1wiLHtpbml0OmZ1bmN0aW9uKHQpe3Qub24oXCJzaG93aXRlbS51ay5saWdodGJveFwiLGZ1bmN0aW9uKHQsZSl7dmFyIG49ZnVuY3Rpb24oaSx0LG8pe2UubWV0YT17Y29udGVudDonPHZpZGVvIGNsYXNzPVwidWstcmVzcG9uc2l2ZS13aWR0aFwiIHNyYz1cIicraSsnXCIgd2lkdGg9XCInK3QrJ1wiIGhlaWdodD1cIicrbysnXCIgY29udHJvbHM+PC92aWRlbz4nLHdpZHRoOnQsaGVpZ2h0Om99LGUudHlwZT1cInZpZGVvXCIsZS5wcm9taXNlLnJlc29sdmUoKX07aWYoXCJ2aWRlb1wiPT1lLnR5cGV8fGUuc291cmNlLm1hdGNoKC9cXC4obXA0fHdlYm18b2d2KSQvaSkpaWYob1tlLnNvdXJjZV0pbihlLnNvdXJjZSxvW2Uuc291cmNlXS53aWR0aCxvW2Uuc291cmNlXS5oZWlnaHQpO2Vsc2UgdmFyIHM9aS4kKCc8dmlkZW8gc3R5bGU9XCJwb3NpdGlvbjpmaXhlZDt2aXNpYmlsaXR5OmhpZGRlbjt0b3A6LTEwMDAwcHg7XCI+PC92aWRlbz4nKS5hdHRyKFwic3JjXCIsZS5zb3VyY2UpLmFwcGVuZFRvKFwiYm9keVwiKSxoPXNldEludGVydmFsKGZ1bmN0aW9uKCl7c1swXS52aWRlb1dpZHRoJiYoY2xlYXJJbnRlcnZhbChoKSxvW2Uuc291cmNlXT17d2lkdGg6c1swXS52aWRlb1dpZHRoLGhlaWdodDpzWzBdLnZpZGVvSGVpZ2h0fSxuKGUuc291cmNlLG9bZS5zb3VyY2VdLndpZHRoLG9bZS5zb3VyY2VdLmhlaWdodCkscy5yZW1vdmUoKSl9LDIwKX0pfX0pLGkucGx1Z2luKFwibGlnaHRib3hcIixcImlmcmFtZVwiLHtpbml0OmZ1bmN0aW9uKGkpe2kub24oXCJzaG93aXRlbS51ay5saWdodGJveFwiLGZ1bmN0aW9uKHQsbyl7dmFyIG49ZnVuY3Rpb24oaSx0LG4pe28ubWV0YT17Y29udGVudDonPGlmcmFtZSBjbGFzcz1cInVrLXJlc3BvbnNpdmUtd2lkdGhcIiBzcmM9XCInK2krJ1wiIHdpZHRoPVwiJyt0KydcIiBoZWlnaHQ9XCInK24rJ1wiJysoZS5saWdodGJveC5vcHRpb25zLmFsbG93ZnVsbHNjcmVlbj9cIiBhbGxvd2Z1bGxzY3JlZW5cIjpcIlwiKStcIj48L2lmcmFtZT5cIix3aWR0aDp0LGhlaWdodDpufSxvLnR5cGU9XCJpZnJhbWVcIixvLnByb21pc2UucmVzb2x2ZSgpfTsoXCJpZnJhbWVcIj09PW8udHlwZXx8by5zb3VyY2UubWF0Y2goL1xcLihodG1sfHBocCkkLykpJiZuKG8uc291cmNlLGkub3B0aW9ucy53aWR0aHx8ODAwLGkub3B0aW9ucy5oZWlnaHR8fDYwMCl9KX19KSxpLmxpZ2h0Ym94LmNyZWF0ZT1mdW5jdGlvbih0LGUpe2lmKHQpe3ZhciBvLG49W107cmV0dXJuIHQuZm9yRWFjaChmdW5jdGlvbih0KXtuLnB1c2goaS4kLmV4dGVuZCh7c291cmNlOlwiXCIsdGl0bGU6XCJcIix0eXBlOlwiYXV0b1wiLGxpbms6ITF9LFwic3RyaW5nXCI9PXR5cGVvZiB0P3tzb3VyY2U6dH06dCkpfSksbz1pLmxpZ2h0Ym94KGkuJC5leHRlbmQoe30sZSx7Z3JvdXA6bn0pKX19LGkubGlnaHRib3h9KTsiLCIvKiEgVUlraXQgMi4yNy40IHwgaHR0cDovL3d3dy5nZXR1aWtpdC5jb20gfCAoYykgMjAxNCBZT090aGVtZSB8IE1JVCBMaWNlbnNlICovXG4hZnVuY3Rpb24odCl7XCJ1c2Ugc3RyaWN0XCI7ZnVuY3Rpb24gaShpLGUpe3JldHVybiBlPyhcIm9iamVjdFwiPT10eXBlb2YgaT8oaT1pIGluc3RhbmNlb2YgalF1ZXJ5P2k6dC4kKGkpLGkucGFyZW50KCkubGVuZ3RoJiYoZS5wZXJzaXN0PWksZS5wZXJzaXN0LmRhdGEoXCJtb2RhbFBlcnNpc3RQYXJlbnRcIixpLnBhcmVudCgpKSkpOmk9XCJzdHJpbmdcIj09dHlwZW9mIGl8fFwibnVtYmVyXCI9PXR5cGVvZiBpP3QuJChcIjxkaXY+PC9kaXY+XCIpLmh0bWwoaSk6dC4kKFwiPGRpdj48L2Rpdj5cIikuaHRtbChcIlVJa2l0Mi5tb2RhbCBFcnJvcjogVW5zdXBwb3J0ZWQgZGF0YSB0eXBlOiBcIit0eXBlb2YgaSksaS5hcHBlbmRUbyhlLmVsZW1lbnQuZmluZChcIi51ay1tb2RhbC1kaWFsb2dcIikpLGUpOnZvaWQgMH12YXIgZSxvPSExLG49MCxzPXQuJGh0bWw7dC4kd2luLm9uKFwicmVzaXplIG9yaWVudGF0aW9uY2hhbmdlXCIsdC5VdGlscy5kZWJvdW5jZShmdW5jdGlvbigpe3QuJChcIi51ay1tb2RhbC51ay1vcGVuXCIpLmVhY2goZnVuY3Rpb24oKXtyZXR1cm4gdC4kKHRoaXMpLmRhdGEoXCJtb2RhbFwiKSYmdC4kKHRoaXMpLmRhdGEoXCJtb2RhbFwiKS5yZXNpemUoKX0pfSwxNTApKSx0LmNvbXBvbmVudChcIm1vZGFsXCIse2RlZmF1bHRzOntrZXlib2FyZDohMCxiZ2Nsb3NlOiEwLG1pblNjcm9sbEhlaWdodDoxNTAsY2VudGVyOiExLG1vZGFsOiEwfSxzY3JvbGxhYmxlOiExLHRyYW5zaXRpb246ITEsaGFzVHJhbnNpdGlvbmVkOiEwLGluaXQ6ZnVuY3Rpb24oKXtpZihlfHwoZT10LiQoXCJib2R5XCIpKSx0aGlzLmVsZW1lbnQubGVuZ3RoKXt2YXIgaT10aGlzO3RoaXMucGFkZGluZ2Rpcj1cInBhZGRpbmctXCIrKFwibGVmdFwiPT10LmxhbmdkaXJlY3Rpb24/XCJyaWdodFwiOlwibGVmdFwiKSx0aGlzLmRpYWxvZz10aGlzLmZpbmQoXCIudWstbW9kYWwtZGlhbG9nXCIpLHRoaXMuYWN0aXZlPSExLHRoaXMuZWxlbWVudC5hdHRyKFwiYXJpYS1oaWRkZW5cIix0aGlzLmVsZW1lbnQuaGFzQ2xhc3MoXCJ1ay1vcGVuXCIpKSx0aGlzLm9uKFwiY2xpY2tcIixcIi51ay1tb2RhbC1jbG9zZVwiLGZ1bmN0aW9uKHQpe3QucHJldmVudERlZmF1bHQoKSxpLmhpZGUoKX0pLm9uKFwiY2xpY2tcIixmdW5jdGlvbihlKXt2YXIgbz10LiQoZS50YXJnZXQpO29bMF09PWkuZWxlbWVudFswXSYmaS5vcHRpb25zLmJnY2xvc2UmJmkuaGlkZSgpfSksdC5kb21PYnNlcnZlKHRoaXMuZWxlbWVudCxmdW5jdGlvbigpe2kucmVzaXplKCl9KX19LHRvZ2dsZTpmdW5jdGlvbigpe3JldHVybiB0aGlzW3RoaXMuaXNBY3RpdmUoKT9cImhpZGVcIjpcInNob3dcIl0oKX0sc2hvdzpmdW5jdGlvbigpe2lmKHRoaXMuZWxlbWVudC5sZW5ndGgpe3ZhciBpPXRoaXM7aWYoIXRoaXMuaXNBY3RpdmUoKSlyZXR1cm4gdGhpcy5vcHRpb25zLm1vZGFsJiZvJiZvLmhpZGUoITApLHRoaXMuZWxlbWVudC5yZW1vdmVDbGFzcyhcInVrLW9wZW5cIikuc2hvdygpLHRoaXMucmVzaXplKCEwKSx0aGlzLm9wdGlvbnMubW9kYWwmJihvPXRoaXMpLHRoaXMuYWN0aXZlPSEwLG4rKyx0LnN1cHBvcnQudHJhbnNpdGlvbj8odGhpcy5oYXNUcmFuc2l0aW9uZWQ9ITEsdGhpcy5lbGVtZW50Lm9uZSh0LnN1cHBvcnQudHJhbnNpdGlvbi5lbmQsZnVuY3Rpb24oKXtpLmhhc1RyYW5zaXRpb25lZD0hMCx0LlV0aWxzLmZvY3VzKGkuZGlhbG9nLFwiYVtocmVmXVwiKX0pLmFkZENsYXNzKFwidWstb3BlblwiKSk6KHRoaXMuZWxlbWVudC5hZGRDbGFzcyhcInVrLW9wZW5cIiksdC5VdGlscy5mb2N1cyh0aGlzLmRpYWxvZyxcImFbaHJlZl1cIikpLHMuYWRkQ2xhc3MoXCJ1ay1tb2RhbC1wYWdlXCIpLmhlaWdodCgpLHRoaXMuZWxlbWVudC5hdHRyKFwiYXJpYS1oaWRkZW5cIixcImZhbHNlXCIpLHRoaXMuZWxlbWVudC50cmlnZ2VyKFwic2hvdy51ay5tb2RhbFwiKSx0LlV0aWxzLmNoZWNrRGlzcGxheSh0aGlzLmRpYWxvZywhMCksdGhpc319LGhpZGU6ZnVuY3Rpb24oaSl7aWYoIWkmJnQuc3VwcG9ydC50cmFuc2l0aW9uJiZ0aGlzLmhhc1RyYW5zaXRpb25lZCl7dmFyIGU9dGhpczt0aGlzLm9uZSh0LnN1cHBvcnQudHJhbnNpdGlvbi5lbmQsZnVuY3Rpb24oKXtlLl9oaWRlKCl9KS5yZW1vdmVDbGFzcyhcInVrLW9wZW5cIil9ZWxzZSB0aGlzLl9oaWRlKCk7cmV0dXJuIHRoaXN9LHJlc2l6ZTpmdW5jdGlvbih0KXtpZih0aGlzLmlzQWN0aXZlKCl8fHQpe3ZhciBpPWUud2lkdGgoKTtpZih0aGlzLnNjcm9sbGJhcndpZHRoPXdpbmRvdy5pbm5lcldpZHRoLWksZS5jc3ModGhpcy5wYWRkaW5nZGlyLHRoaXMuc2Nyb2xsYmFyd2lkdGgpLHRoaXMuZWxlbWVudC5jc3MoXCJvdmVyZmxvdy15XCIsdGhpcy5zY3JvbGxiYXJ3aWR0aD9cInNjcm9sbFwiOlwiYXV0b1wiKSwhdGhpcy51cGRhdGVTY3JvbGxhYmxlKCkmJnRoaXMub3B0aW9ucy5jZW50ZXIpe3ZhciBvPXRoaXMuZGlhbG9nLm91dGVySGVpZ2h0KCksbj1wYXJzZUludCh0aGlzLmRpYWxvZy5jc3MoXCJtYXJnaW4tdG9wXCIpLDEwKStwYXJzZUludCh0aGlzLmRpYWxvZy5jc3MoXCJtYXJnaW4tYm90dG9tXCIpLDEwKTtvK248d2luZG93LmlubmVySGVpZ2h0P3RoaXMuZGlhbG9nLmNzcyh7dG9wOndpbmRvdy5pbm5lckhlaWdodC8yLW8vMi1ufSk6dGhpcy5kaWFsb2cuY3NzKHt0b3A6XCJcIn0pfX19LHVwZGF0ZVNjcm9sbGFibGU6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLmRpYWxvZy5maW5kKFwiLnVrLW92ZXJmbG93LWNvbnRhaW5lcjp2aXNpYmxlOmZpcnN0XCIpO2lmKHQubGVuZ3RoKXt0LmNzcyhcImhlaWdodFwiLDApO3ZhciBpPU1hdGguYWJzKHBhcnNlSW50KHRoaXMuZGlhbG9nLmNzcyhcIm1hcmdpbi10b3BcIiksMTApKSxlPXRoaXMuZGlhbG9nLm91dGVySGVpZ2h0KCksbz13aW5kb3cuaW5uZXJIZWlnaHQsbj1vLTIqKDIwPmk/MjA6aSktZTtyZXR1cm4gdC5jc3Moe21heEhlaWdodDpuPHRoaXMub3B0aW9ucy5taW5TY3JvbGxIZWlnaHQ/XCJcIjpuLGhlaWdodDpcIlwifSksITB9cmV0dXJuITF9LF9oaWRlOmZ1bmN0aW9uKCl7dGhpcy5hY3RpdmU9ITEsbj4wP24tLTpuPTAsdGhpcy5lbGVtZW50LmhpZGUoKS5yZW1vdmVDbGFzcyhcInVrLW9wZW5cIiksdGhpcy5lbGVtZW50LmF0dHIoXCJhcmlhLWhpZGRlblwiLFwidHJ1ZVwiKSxufHwocy5yZW1vdmVDbGFzcyhcInVrLW1vZGFsLXBhZ2VcIiksZS5jc3ModGhpcy5wYWRkaW5nZGlyLFwiXCIpKSxvPT09dGhpcyYmKG89ITEpLHRoaXMudHJpZ2dlcihcImhpZGUudWsubW9kYWxcIil9LGlzQWN0aXZlOmZ1bmN0aW9uKCl7cmV0dXJuIHRoaXMuZWxlbWVudC5oYXNDbGFzcyhcInVrLW9wZW5cIil9fSksdC5jb21wb25lbnQoXCJtb2RhbFRyaWdnZXJcIix7Ym9vdDpmdW5jdGlvbigpe3QuJGh0bWwub24oXCJjbGljay5tb2RhbC51aWtpdFwiLFwiW2RhdGEtdWstbW9kYWxdXCIsZnVuY3Rpb24oaSl7dmFyIGU9dC4kKHRoaXMpO2lmKGUuaXMoXCJhXCIpJiZpLnByZXZlbnREZWZhdWx0KCksIWUuZGF0YShcIm1vZGFsVHJpZ2dlclwiKSl7dmFyIG89dC5tb2RhbFRyaWdnZXIoZSx0LlV0aWxzLm9wdGlvbnMoZS5hdHRyKFwiZGF0YS11ay1tb2RhbFwiKSkpO28uc2hvdygpfX0pLHQuJGh0bWwub24oXCJrZXlkb3duLm1vZGFsLnVpa2l0XCIsZnVuY3Rpb24odCl7byYmMjc9PT10LmtleUNvZGUmJm8ub3B0aW9ucy5rZXlib2FyZCYmKHQucHJldmVudERlZmF1bHQoKSxvLmhpZGUoKSl9KX0saW5pdDpmdW5jdGlvbigpe3ZhciBpPXRoaXM7dGhpcy5vcHRpb25zPXQuJC5leHRlbmQoe3RhcmdldDppLmVsZW1lbnQuaXMoXCJhXCIpP2kuZWxlbWVudC5hdHRyKFwiaHJlZlwiKTohMX0sdGhpcy5vcHRpb25zKSx0aGlzLm1vZGFsPXQubW9kYWwodGhpcy5vcHRpb25zLnRhcmdldCx0aGlzLm9wdGlvbnMpLHRoaXMub24oXCJjbGlja1wiLGZ1bmN0aW9uKHQpe3QucHJldmVudERlZmF1bHQoKSxpLnNob3coKX0pLHRoaXMucHJveHkodGhpcy5tb2RhbCxcInNob3cgaGlkZSBpc0FjdGl2ZVwiKX19KSx0Lm1vZGFsLmRpYWxvZz1mdW5jdGlvbihlLG8pe3ZhciBuPXQubW9kYWwodC4kKHQubW9kYWwuZGlhbG9nLnRlbXBsYXRlKS5hcHBlbmRUbyhcImJvZHlcIiksbyk7cmV0dXJuIG4ub24oXCJoaWRlLnVrLm1vZGFsXCIsZnVuY3Rpb24oKXtuLnBlcnNpc3QmJihuLnBlcnNpc3QuYXBwZW5kVG8obi5wZXJzaXN0LmRhdGEoXCJtb2RhbFBlcnNpc3RQYXJlbnRcIikpLG4ucGVyc2lzdD0hMSksbi5lbGVtZW50LnJlbW92ZSgpfSksaShlLG4pLG59LHQubW9kYWwuZGlhbG9nLnRlbXBsYXRlPSc8ZGl2IGNsYXNzPVwidWstbW9kYWxcIj48ZGl2IGNsYXNzPVwidWstbW9kYWwtZGlhbG9nXCIgc3R5bGU9XCJtaW4taGVpZ2h0OjA7XCI+PC9kaXY+PC9kaXY+Jyx0Lm1vZGFsLmFsZXJ0PWZ1bmN0aW9uKGksZSl7ZT10LiQuZXh0ZW5kKCEwLHtiZ2Nsb3NlOiExLGtleWJvYXJkOiExLG1vZGFsOiExLGxhYmVsczp0Lm1vZGFsLmxhYmVsc30sZSk7dmFyIG89dC5tb2RhbC5kaWFsb2coWyc8ZGl2IGNsYXNzPVwidWstbWFyZ2luIHVrLW1vZGFsLWNvbnRlbnRcIj4nK1N0cmluZyhpKStcIjwvZGl2PlwiLCc8ZGl2IGNsYXNzPVwidWstbW9kYWwtZm9vdGVyIHVrLXRleHQtcmlnaHRcIj48YnV0dG9uIGNsYXNzPVwidWstYnV0dG9uIHVrLWJ1dHRvbi1wcmltYXJ5IHVrLW1vZGFsLWNsb3NlXCI+JytlLmxhYmVscy5PaytcIjwvYnV0dG9uPjwvZGl2PlwiXS5qb2luKFwiXCIpLGUpO3JldHVybiBvLm9uKFwic2hvdy51ay5tb2RhbFwiLGZ1bmN0aW9uKCl7c2V0VGltZW91dChmdW5jdGlvbigpe28uZWxlbWVudC5maW5kKFwiYnV0dG9uOmZpcnN0XCIpLmZvY3VzKCl9LDUwKX0pLG8uc2hvdygpfSx0Lm1vZGFsLmNvbmZpcm09ZnVuY3Rpb24oaSxlLG8pe3ZhciBuPWFyZ3VtZW50cy5sZW5ndGg+MSYmYXJndW1lbnRzW2FyZ3VtZW50cy5sZW5ndGgtMV0/YXJndW1lbnRzW2FyZ3VtZW50cy5sZW5ndGgtMV06e307ZT10LiQuaXNGdW5jdGlvbihlKT9lOmZ1bmN0aW9uKCl7fSxvPXQuJC5pc0Z1bmN0aW9uKG8pP286ZnVuY3Rpb24oKXt9LG49dC4kLmV4dGVuZCghMCx7YmdjbG9zZTohMSxrZXlib2FyZDohMSxtb2RhbDohMSxsYWJlbHM6dC5tb2RhbC5sYWJlbHN9LHQuJC5pc0Z1bmN0aW9uKG4pP3t9Om4pO3ZhciBzPXQubW9kYWwuZGlhbG9nKFsnPGRpdiBjbGFzcz1cInVrLW1hcmdpbiB1ay1tb2RhbC1jb250ZW50XCI+JytTdHJpbmcoaSkrXCI8L2Rpdj5cIiwnPGRpdiBjbGFzcz1cInVrLW1vZGFsLWZvb3RlciB1ay10ZXh0LXJpZ2h0XCI+PGJ1dHRvbiBjbGFzcz1cInVrLWJ1dHRvbiBqcy1tb2RhbC1jb25maXJtLWNhbmNlbFwiPicrbi5sYWJlbHMuQ2FuY2VsKyc8L2J1dHRvbj4gPGJ1dHRvbiBjbGFzcz1cInVrLWJ1dHRvbiB1ay1idXR0b24tcHJpbWFyeSBqcy1tb2RhbC1jb25maXJtXCI+JytuLmxhYmVscy5PaytcIjwvYnV0dG9uPjwvZGl2PlwiXS5qb2luKFwiXCIpLG4pO3JldHVybiBzLmVsZW1lbnQuZmluZChcIi5qcy1tb2RhbC1jb25maXJtLCAuanMtbW9kYWwtY29uZmlybS1jYW5jZWxcIikub24oXCJjbGlja1wiLGZ1bmN0aW9uKCl7dC4kKHRoaXMpLmlzKFwiLmpzLW1vZGFsLWNvbmZpcm1cIik/ZSgpOm8oKSxzLmhpZGUoKX0pLHMub24oXCJzaG93LnVrLm1vZGFsXCIsZnVuY3Rpb24oKXtzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7cy5lbGVtZW50LmZpbmQoXCIuanMtbW9kYWwtY29uZmlybVwiKS5mb2N1cygpfSw1MCl9KSxzLnNob3coKX0sdC5tb2RhbC5wcm9tcHQ9ZnVuY3Rpb24oaSxlLG8sbil7bz10LiQuaXNGdW5jdGlvbihvKT9vOmZ1bmN0aW9uKCl7fSxuPXQuJC5leHRlbmQoITAse2JnY2xvc2U6ITEsa2V5Ym9hcmQ6ITEsbW9kYWw6ITEsbGFiZWxzOnQubW9kYWwubGFiZWxzfSxuKTt2YXIgcz10Lm1vZGFsLmRpYWxvZyhbaT8nPGRpdiBjbGFzcz1cInVrLW1vZGFsLWNvbnRlbnQgdWstZm9ybVwiPicrU3RyaW5nKGkpK1wiPC9kaXY+XCI6XCJcIiwnPGRpdiBjbGFzcz1cInVrLW1hcmdpbi1zbWFsbC10b3AgdWstbW9kYWwtY29udGVudCB1ay1mb3JtXCI+PHA+PGlucHV0IHR5cGU9XCJ0ZXh0XCIgY2xhc3M9XCJ1ay13aWR0aC0xLTFcIj48L3A+PC9kaXY+JywnPGRpdiBjbGFzcz1cInVrLW1vZGFsLWZvb3RlciB1ay10ZXh0LXJpZ2h0XCI+PGJ1dHRvbiBjbGFzcz1cInVrLWJ1dHRvbiB1ay1tb2RhbC1jbG9zZVwiPicrbi5sYWJlbHMuQ2FuY2VsKyc8L2J1dHRvbj4gPGJ1dHRvbiBjbGFzcz1cInVrLWJ1dHRvbiB1ay1idXR0b24tcHJpbWFyeSBqcy1tb2RhbC1va1wiPicrbi5sYWJlbHMuT2srXCI8L2J1dHRvbj48L2Rpdj5cIl0uam9pbihcIlwiKSxuKSxhPXMuZWxlbWVudC5maW5kKFwiaW5wdXRbdHlwZT0ndGV4dCddXCIpLnZhbChlfHxcIlwiKS5vbihcImtleXVwXCIsZnVuY3Rpb24odCl7MTM9PXQua2V5Q29kZSYmcy5lbGVtZW50LmZpbmQoXCIuanMtbW9kYWwtb2tcIikudHJpZ2dlcihcImNsaWNrXCIpfSk7cmV0dXJuIHMuZWxlbWVudC5maW5kKFwiLmpzLW1vZGFsLW9rXCIpLm9uKFwiY2xpY2tcIixmdW5jdGlvbigpe28oYS52YWwoKSkhPT0hMSYmcy5oaWRlKCl9KSxzLnNob3coKX0sdC5tb2RhbC5ibG9ja1VJPWZ1bmN0aW9uKGksZSl7dmFyIG89dC5tb2RhbC5kaWFsb2coWyc8ZGl2IGNsYXNzPVwidWstbWFyZ2luIHVrLW1vZGFsLWNvbnRlbnRcIj4nK1N0cmluZyhpfHwnPGRpdiBjbGFzcz1cInVrLXRleHQtY2VudGVyXCI+Li4uPC9kaXY+JykrXCI8L2Rpdj5cIl0uam9pbihcIlwiKSx0LiQuZXh0ZW5kKHtiZ2Nsb3NlOiExLGtleWJvYXJkOiExLG1vZGFsOiExfSxlKSk7cmV0dXJuIG8uY29udGVudD1vLmVsZW1lbnQuZmluZChcIi51ay1tb2RhbC1jb250ZW50OmZpcnN0XCIpLG8uc2hvdygpfSx0Lm1vZGFsLmxhYmVscz17T2s6XCJPa1wiLENhbmNlbDpcIkNhbmNlbFwifX0oVUlraXQyKTsiLCIvKiEgVUlraXQgMi4yNS4wIHwgaHR0cDovL3d3dy5nZXR1aWtpdC5jb20gfCAoYykgMjAxNCBZT090aGVtZSB8IE1JVCBMaWNlbnNlICovXG4hZnVuY3Rpb24odCl7dmFyIGU7d2luZG93LlVJa2l0JiYoZT10KFVJa2l0KSksXCJmdW5jdGlvblwiPT10eXBlb2YgZGVmaW5lJiZkZWZpbmUuYW1kJiZkZWZpbmUoXCJ1aWtpdC1zbGlkZXJcIixbXCJ1aWtpdFwiXSxmdW5jdGlvbigpe3JldHVybiBlfHx0KFVJa2l0KX0pfShmdW5jdGlvbih0KXtcInVzZSBzdHJpY3RcIjt2YXIgZSxpLHMsbixhPXt9O3JldHVybiB0LmNvbXBvbmVudChcInNsaWRlclwiLHtkZWZhdWx0czp7Y2VudGVyOiExLHRocmVzaG9sZDoxMCxpbmZpbml0ZTohMCxhdXRvcGxheTohMSxhdXRvcGxheUludGVydmFsOjdlMyxwYXVzZU9uSG92ZXI6ITAsYWN0aXZlY2xzOlwidWstYWN0aXZlXCJ9LGJvb3Q6ZnVuY3Rpb24oKXt0LnJlYWR5KGZ1bmN0aW9uKGUpe3NldFRpbWVvdXQoZnVuY3Rpb24oKXt0LiQoXCJbZGF0YS11ay1zbGlkZXJdXCIsZSkuZWFjaChmdW5jdGlvbigpe3ZhciBlPXQuJCh0aGlzKTtlLmRhdGEoXCJzbGlkZXJcIil8fHQuc2xpZGVyKGUsdC5VdGlscy5vcHRpb25zKGUuYXR0cihcImRhdGEtdWstc2xpZGVyXCIpKSl9KX0sMCl9KX0saW5pdDpmdW5jdGlvbigpe3ZhciBvPXRoaXM7dGhpcy5jb250YWluZXI9dGhpcy5lbGVtZW50LmZpbmQoXCIudWstc2xpZGVyXCIpLHRoaXMuZm9jdXM9MCx0LiR3aW4ub24oXCJyZXNpemUgbG9hZFwiLHQuVXRpbHMuZGVib3VuY2UoZnVuY3Rpb24oKXtvLnJlc2l6ZSghMCl9LDEwMCkpLHRoaXMub24oXCJjbGljay51ay5zbGlkZXJcIixcIltkYXRhLXVrLXNsaWRlci1pdGVtXVwiLGZ1bmN0aW9uKGUpe2UucHJldmVudERlZmF1bHQoKTt2YXIgaT10LiQodGhpcykuYXR0cihcImRhdGEtdWstc2xpZGVyLWl0ZW1cIik7aWYoby5mb2N1cyE9aSlzd2l0Y2goby5zdG9wKCksaSl7Y2FzZVwibmV4dFwiOmNhc2VcInByZXZpb3VzXCI6b1tcIm5leHRcIj09aT9cIm5leHRcIjpcInByZXZpb3VzXCJdKCk7YnJlYWs7ZGVmYXVsdDpvLnVwZGF0ZUZvY3VzKHBhcnNlSW50KGksMTApKX19KSx0aGlzLmNvbnRhaW5lci5vbih7XCJ0b3VjaHN0YXJ0IG1vdXNlZG93blwiOmZ1bmN0aW9uKGgpe2gub3JpZ2luYWxFdmVudCYmaC5vcmlnaW5hbEV2ZW50LnRvdWNoZXMmJihoPWgub3JpZ2luYWxFdmVudC50b3VjaGVzWzBdKSxoLmJ1dHRvbiYmMj09aC5idXR0b258fCFvLmFjdGl2ZXx8KG8uc3RvcCgpLHM9dC4kKGgudGFyZ2V0KS5pcyhcImFcIik/dC4kKGgudGFyZ2V0KTp0LiQoaC50YXJnZXQpLnBhcmVudHMoXCJhOmZpcnN0XCIpLG49ITEscy5sZW5ndGgmJnMub25lKFwiY2xpY2tcIixmdW5jdGlvbih0KXtuJiZ0LnByZXZlbnREZWZhdWx0KCl9KSxpPWZ1bmN0aW9uKHQpe249ITAsZT1vLGE9e3RvdWNoeDpwYXJzZUludCh0LnBhZ2VYLDEwKSxkaXI6MSxmb2N1czpvLmZvY3VzLGJhc2U6by5vcHRpb25zLmNlbnRlcj9cImNlbnRlclwiOlwiYXJlYVwifSx0Lm9yaWdpbmFsRXZlbnQmJnQub3JpZ2luYWxFdmVudC50b3VjaGVzJiYodD10Lm9yaWdpbmFsRXZlbnQudG91Y2hlc1swXSksZS5lbGVtZW50LmRhdGEoe1wicG9pbnRlci1zdGFydFwiOnt4OnBhcnNlSW50KHQucGFnZVgsMTApLHk6cGFyc2VJbnQodC5wYWdlWSwxMCl9LFwicG9pbnRlci1wb3Mtc3RhcnRcIjpvLnBvc30pLG8uY29udGFpbmVyLmFkZENsYXNzKFwidWstZHJhZ1wiKSxpPSExfSxpLng9cGFyc2VJbnQoaC5wYWdlWCwxMCksaS50aHJlc2hvbGQ9by5vcHRpb25zLnRocmVzaG9sZCl9LG1vdXNlZW50ZXI6ZnVuY3Rpb24oKXtvLm9wdGlvbnMucGF1c2VPbkhvdmVyJiYoby5ob3ZlcmluZz0hMCl9LG1vdXNlbGVhdmU6ZnVuY3Rpb24oKXtvLmhvdmVyaW5nPSExfX0pLHRoaXMucmVzaXplKCEwKSx0aGlzLm9uKFwiZGlzcGxheS51ay5jaGVja1wiLGZ1bmN0aW9uKCl7by5lbGVtZW50LmlzKFwiOnZpc2libGVcIikmJm8ucmVzaXplKCEwKX0pLHRoaXMuZWxlbWVudC5maW5kKFwiYSxpbWdcIikuYXR0cihcImRyYWdnYWJsZVwiLFwiZmFsc2VcIiksdGhpcy5vcHRpb25zLmF1dG9wbGF5JiZ0aGlzLnN0YXJ0KCl9LHJlc2l6ZTpmdW5jdGlvbihlKXt2YXIgaSxzLG4sYSxvPXRoaXMsaD0wLHI9MDtyZXR1cm4gdGhpcy5pdGVtcz10aGlzLmNvbnRhaW5lci5jaGlsZHJlbigpLmZpbHRlcihcIjp2aXNpYmxlXCIpLHRoaXMudnA9dGhpcy5lbGVtZW50WzBdLmdldEJvdW5kaW5nQ2xpZW50UmVjdCgpLndpZHRoLHRoaXMuY29udGFpbmVyLmNzcyh7XCJtaW4td2lkdGhcIjpcIlwiLFwibWluLWhlaWdodFwiOlwiXCJ9KSx0aGlzLml0ZW1zLmVhY2goZnVuY3Rpb24oZSl7aT10LiQodGhpcyksYT1pLmNzcyh7bGVmdDpcIlwiLHdpZHRoOlwiXCJ9KVswXS5nZXRCb3VuZGluZ0NsaWVudFJlY3QoKSxzPWEud2lkdGgsbj1pLndpZHRoKCkscj1NYXRoLm1heChyLGEuaGVpZ2h0KSxpLmNzcyh7bGVmdDpoLHdpZHRoOnN9KS5kYXRhKHtpZHg6ZSxsZWZ0Omgsd2lkdGg6cyxjd2lkdGg6bixhcmVhOmgrcyxjZW50ZXI6aC0oby52cC8yLW4vMil9KSxoKz1zfSksdGhpcy5jb250YWluZXIuY3NzKHtcIm1pbi13aWR0aFwiOmgsXCJtaW4taGVpZ2h0XCI6cn0pLHRoaXMub3B0aW9ucy5pbmZpbml0ZSYmKGg8PTIqdGhpcy52cHx8dGhpcy5pdGVtcy5sZW5ndGg8NSkmJiF0aGlzLml0ZW1zUmVzaXplZD8odGhpcy5jb250YWluZXIuY2hpbGRyZW4oKS5lYWNoKGZ1bmN0aW9uKHQpe28uY29udGFpbmVyLmFwcGVuZChvLml0ZW1zLmVxKHQpLmNsb25lKCEwKS5hdHRyKFwiaWRcIixcIlwiKSl9KS5lYWNoKGZ1bmN0aW9uKHQpe28uY29udGFpbmVyLmFwcGVuZChvLml0ZW1zLmVxKHQpLmNsb25lKCEwKS5hdHRyKFwiaWRcIixcIlwiKSl9KSx0aGlzLml0ZW1zUmVzaXplZD0hMCx0aGlzLnJlc2l6ZSgpKToodGhpcy5jdz1oLHRoaXMucG9zPTAsdGhpcy5hY3RpdmU9aD49dGhpcy52cCx0aGlzLmNvbnRhaW5lci5jc3Moe1wiLW1zLXRyYW5zZm9ybVwiOlwiXCIsXCItd2Via2l0LXRyYW5zZm9ybVwiOlwiXCIsdHJhbnNmb3JtOlwiXCJ9KSxlJiZ0aGlzLnVwZGF0ZUZvY3VzKHRoaXMuZm9jdXMpLHZvaWQgMCl9LHVwZGF0ZVBvczpmdW5jdGlvbih0KXt0aGlzLnBvcz10LHRoaXMuY29udGFpbmVyLmNzcyh7XCItbXMtdHJhbnNmb3JtXCI6XCJ0cmFuc2xhdGVYKFwiK3QrXCJweClcIixcIi13ZWJraXQtdHJhbnNmb3JtXCI6XCJ0cmFuc2xhdGVYKFwiK3QrXCJweClcIix0cmFuc2Zvcm06XCJ0cmFuc2xhdGVYKFwiK3QrXCJweClcIn0pfSx1cGRhdGVGb2N1czpmdW5jdGlvbihlLGkpe2lmKHRoaXMuYWN0aXZlKXtpPWl8fChlPnRoaXMuZm9jdXM/MTotMSk7dmFyIHMsbixhPXRoaXMuaXRlbXMuZXEoZSk7aWYodGhpcy5vcHRpb25zLmluZmluaXRlJiZ0aGlzLmluZmluaXRlKGUsaSksdGhpcy5vcHRpb25zLmNlbnRlcil0aGlzLnVwZGF0ZVBvcygtMSphLmRhdGEoXCJjZW50ZXJcIikpLHRoaXMuaXRlbXMuZmlsdGVyKFwiLlwiK3RoaXMub3B0aW9ucy5hY3RpdmVjbHMpLnJlbW92ZUNsYXNzKHRoaXMub3B0aW9ucy5hY3RpdmVjbHMpLGEuYWRkQ2xhc3ModGhpcy5vcHRpb25zLmFjdGl2ZWNscyk7ZWxzZSBpZih0aGlzLm9wdGlvbnMuaW5maW5pdGUpdGhpcy51cGRhdGVQb3MoLTEqYS5kYXRhKFwibGVmdFwiKSk7ZWxzZXtmb3Iocz0wLG49ZTtuPHRoaXMuaXRlbXMubGVuZ3RoO24rKylzKz10aGlzLml0ZW1zLmVxKG4pLmRhdGEoXCJ3aWR0aFwiKTtpZihzPnRoaXMudnApdGhpcy51cGRhdGVQb3MoLTEqYS5kYXRhKFwibGVmdFwiKSk7ZWxzZSBpZigxPT1pKXtmb3Iocz0wLG49dGhpcy5pdGVtcy5sZW5ndGgtMTtuPj0wO24tLSl7aWYocys9dGhpcy5pdGVtcy5lcShuKS5kYXRhKFwid2lkdGhcIikscz09dGhpcy52cCl7ZT1uO2JyZWFrfWlmKHM+dGhpcy52cCl7ZT1uPHRoaXMuaXRlbXMubGVuZ3RoLTE/bisxOm47YnJlYWt9fXM+dGhpcy52cD90aGlzLnVwZGF0ZVBvcygtMSoodGhpcy5jb250YWluZXIud2lkdGgoKS10aGlzLnZwKSk6dGhpcy51cGRhdGVQb3MoLTEqdGhpcy5pdGVtcy5lcShlKS5kYXRhKFwibGVmdFwiKSl9fXZhciBvPXRoaXMuaXRlbXMuZXEoZSkuZGF0YShcImxlZnRcIik7dGhpcy5pdGVtcy5yZW1vdmVDbGFzcyhcInVrLXNsaWRlLWJlZm9yZSB1ay1zbGlkZS1hZnRlclwiKS5lYWNoKGZ1bmN0aW9uKGkpe2khPT1lJiZ0LiQodGhpcykuYWRkQ2xhc3ModC4kKHRoaXMpLmRhdGEoXCJsZWZ0XCIpPG8/XCJ1ay1zbGlkZS1iZWZvcmVcIjpcInVrLXNsaWRlLWFmdGVyXCIpfSksdGhpcy5mb2N1cz1lLHRoaXMudHJpZ2dlcihcImZvY3VzaXRlbS51ay5zbGlkZXJcIixbZSx0aGlzLml0ZW1zLmVxKGUpLHRoaXNdKX19LG5leHQ6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLml0ZW1zW3RoaXMuZm9jdXMrMV0/dGhpcy5mb2N1cysxOnRoaXMub3B0aW9ucy5pbmZpbml0ZT8wOnRoaXMuZm9jdXM7dGhpcy51cGRhdGVGb2N1cyh0LDEpfSxwcmV2aW91czpmdW5jdGlvbigpe3ZhciB0PXRoaXMuaXRlbXNbdGhpcy5mb2N1cy0xXT90aGlzLmZvY3VzLTE6dGhpcy5vcHRpb25zLmluZmluaXRlP3RoaXMuaXRlbXNbdGhpcy5mb2N1cy0xXT90aGlzLml0ZW1zLTE6dGhpcy5pdGVtcy5sZW5ndGgtMTp0aGlzLmZvY3VzO3RoaXMudXBkYXRlRm9jdXModCwtMSl9LHN0YXJ0OmZ1bmN0aW9uKCl7dGhpcy5zdG9wKCk7dmFyIHQ9dGhpczt0aGlzLmludGVydmFsPXNldEludGVydmFsKGZ1bmN0aW9uKCl7dC5ob3ZlcmluZ3x8dC5uZXh0KCl9LHRoaXMub3B0aW9ucy5hdXRvcGxheUludGVydmFsKX0sc3RvcDpmdW5jdGlvbigpe3RoaXMuaW50ZXJ2YWwmJmNsZWFySW50ZXJ2YWwodGhpcy5pbnRlcnZhbCl9LGluZmluaXRlOmZ1bmN0aW9uKHQsZSl7dmFyIGkscz10aGlzLG49dGhpcy5pdGVtcy5lcSh0KSxhPXQsbz1bXSxoPTA7aWYoMT09ZSl7Zm9yKGk9MDtpPHRoaXMuaXRlbXMubGVuZ3RoJiYoYSE9dCYmKGgrPXRoaXMuaXRlbXMuZXEoYSkuZGF0YShcIndpZHRoXCIpLG8ucHVzaCh0aGlzLml0ZW1zLmVxKGEpKSksIShoPnRoaXMudnApKTtpKyspYT1hKzE9PXRoaXMuaXRlbXMubGVuZ3RoPzA6YSsxO28ubGVuZ3RoJiZvLmZvckVhY2goZnVuY3Rpb24odCl7dmFyIGU9bi5kYXRhKFwiYXJlYVwiKTt0LmNzcyh7bGVmdDplfSkuZGF0YSh7bGVmdDplLGFyZWE6ZSt0LmRhdGEoXCJ3aWR0aFwiKSxjZW50ZXI6ZS0ocy52cC8yLXQuZGF0YShcImN3aWR0aFwiKS8yKX0pLG49dH0pfWVsc2V7Zm9yKGk9dGhpcy5pdGVtcy5sZW5ndGgtMTtpPi0xJiYoaCs9dGhpcy5pdGVtcy5lcShhKS5kYXRhKFwid2lkdGhcIiksYSE9dCYmby5wdXNoKHRoaXMuaXRlbXMuZXEoYSkpLCEoaD50aGlzLnZwKSk7aS0tKWE9YS0xPT0tMT90aGlzLml0ZW1zLmxlbmd0aC0xOmEtMTtvLmxlbmd0aCYmby5mb3JFYWNoKGZ1bmN0aW9uKHQpe3ZhciBlPW4uZGF0YShcImxlZnRcIiktdC5kYXRhKFwid2lkdGhcIik7dC5jc3Moe2xlZnQ6ZX0pLmRhdGEoe2xlZnQ6ZSxhcmVhOmUrdC5kYXRhKFwid2lkdGhcIiksY2VudGVyOmUtKHMudnAvMi10LmRhdGEoXCJjd2lkdGhcIikvMil9KSxuPXR9KX19fSksdC4kZG9jLm9uKFwibW91c2Vtb3ZlLnVrLnNsaWRlciB0b3VjaG1vdmUudWsuc2xpZGVyXCIsZnVuY3Rpb24odCl7aWYodC5vcmlnaW5hbEV2ZW50JiZ0Lm9yaWdpbmFsRXZlbnQudG91Y2hlcyYmKHQ9dC5vcmlnaW5hbEV2ZW50LnRvdWNoZXNbMF0pLGkmJk1hdGguYWJzKHQucGFnZVgtaS54KT5pLnRocmVzaG9sZCYmKHdpbmRvdy5nZXRTZWxlY3Rpb24oKS50b1N0cmluZygpP2U9aT0hMTppKHQpKSxlKXt2YXIgcyxuLG8saCxyLGMsZix1LGQsbDtpZih0LmNsaWVudFh8fHQuY2xpZW50WT9zPXQuY2xpZW50WDoodC5wYWdlWHx8dC5wYWdlWSkmJihzPXQucGFnZVgtZG9jdW1lbnQuYm9keS5zY3JvbGxMZWZ0LWRvY3VtZW50LmRvY3VtZW50RWxlbWVudC5zY3JvbGxMZWZ0KSxyPWEuZm9jdXMsbj1zLWUuZWxlbWVudC5kYXRhKFwicG9pbnRlci1zdGFydFwiKS54LG89ZS5lbGVtZW50LmRhdGEoXCJwb2ludGVyLXBvcy1zdGFydFwiKStuLGg9cz5lLmVsZW1lbnQuZGF0YShcInBvaW50ZXItc3RhcnRcIikueD8tMToxLGM9ZS5pdGVtcy5lcShhLmZvY3VzKSwxPT1oKWZvcihmPWMuZGF0YShcImxlZnRcIikrTWF0aC5hYnMobiksdT0wLGQ9YS5mb2N1czt1PGUuaXRlbXMubGVuZ3RoO3UrKyl7aWYobD1lLml0ZW1zLmVxKGQpLGQhPWEuZm9jdXMmJmwuZGF0YShcImxlZnRcIik8ZiYmbC5kYXRhKFwiYXJlYVwiKT5mKXtyPWQ7YnJlYWt9ZD1kKzE9PWUuaXRlbXMubGVuZ3RoPzA6ZCsxfWVsc2UgZm9yKGY9Yy5kYXRhKFwibGVmdFwiKS1NYXRoLmFicyhuKSx1PTAsZD1hLmZvY3VzO3U8ZS5pdGVtcy5sZW5ndGg7dSsrKXtpZihsPWUuaXRlbXMuZXEoZCksZCE9YS5mb2N1cyYmbC5kYXRhKFwiYXJlYVwiKTw9Yy5kYXRhKFwibGVmdFwiKSYmbC5kYXRhKFwiY2VudGVyXCIpPGYpe3I9ZDticmVha31kPWQtMT09LTE/ZS5pdGVtcy5sZW5ndGgtMTpkLTF9ZS5vcHRpb25zLmluZmluaXRlJiZyIT1hLl9mb2N1cyYmZS5pbmZpbml0ZShyLGgpLGUudXBkYXRlUG9zKG8pLGEuZGlyPWgsYS5fZm9jdXM9cixhLnRvdWNoeD1wYXJzZUludCh0LnBhZ2VYLDEwKSxhLmRpZmY9Zn19KSx0LiRkb2Mub24oXCJtb3VzZXVwLnVrLnNsaWRlciB0b3VjaGVuZC51ay5zbGlkZXJcIixmdW5jdGlvbigpe2lmKGUpe2UuY29udGFpbmVyLnJlbW92ZUNsYXNzKFwidWstZHJhZ1wiKSxlLml0ZW1zLmVxKGEuZm9jdXMpO3ZhciB0LHMsbixvPSExO2lmKDE9PWEuZGlyKWZvcihzPTAsbj1hLmZvY3VzO3M8ZS5pdGVtcy5sZW5ndGg7cysrKXtpZih0PWUuaXRlbXMuZXEobiksbiE9YS5mb2N1cyYmdC5kYXRhKFwibGVmdFwiKT5hLmRpZmYpe289bjticmVha31uPW4rMT09ZS5pdGVtcy5sZW5ndGg/MDpuKzF9ZWxzZSBmb3Iocz0wLG49YS5mb2N1cztzPGUuaXRlbXMubGVuZ3RoO3MrKyl7aWYodD1lLml0ZW1zLmVxKG4pLG4hPWEuZm9jdXMmJnQuZGF0YShcImxlZnRcIik8YS5kaWZmKXtvPW47YnJlYWt9bj1uLTE9PS0xP2UuaXRlbXMubGVuZ3RoLTE6bi0xfWUudXBkYXRlRm9jdXMobyE9PSExP286YS5fZm9jdXMpfWU9aT0hMX0pLHQuc2xpZGVyfSk7IiwiLyohIFVJa2l0IDIuMjUuMCB8IGh0dHA6Ly93d3cuZ2V0dWlraXQuY29tIHwgKGMpIDIwMTQgWU9PdGhlbWUgfCBNSVQgTGljZW5zZSAqL1xuIWZ1bmN0aW9uKHQpe3ZhciBpO3dpbmRvdy5VSWtpdCYmKGk9dChVSWtpdCkpLFwiZnVuY3Rpb25cIj09dHlwZW9mIGRlZmluZSYmZGVmaW5lLmFtZCYmZGVmaW5lKFwidWlraXQtc2xpZGVzZXRcIixbXCJ1aWtpdFwiXSxmdW5jdGlvbigpe3JldHVybiBpfHx0KFVJa2l0KX0pfShmdW5jdGlvbih0KXtcInVzZSBzdHJpY3RcIjtmdW5jdGlvbiBpKGksZSxzLG4pe3ZhciBhLG8scixsLGg9dC4kLkRlZmVycmVkKCksdT10aGlzLm9wdGlvbnMuZGVsYXk9PT0hMT9NYXRoLmZsb29yKHRoaXMub3B0aW9ucy5kdXJhdGlvbi8yKTp0aGlzLm9wdGlvbnMuZGVsYXksZD10aGlzO2lmKG49bnx8MSx0aGlzLmVsZW1lbnQuY3NzKFwibWluLWhlaWdodFwiLHRoaXMuZWxlbWVudC5oZWlnaHQoKSksc1swXT09PWVbMF0pcmV0dXJuIGgucmVzb2x2ZSgpLGgucHJvbWlzZSgpO2lmKFwib2JqZWN0XCI9PXR5cGVvZiBpPyhhPWlbMF0sbz1pWzFdfHxpWzBdKTooYT1pLG89YSkscj1mdW5jdGlvbigpe2lmKGUmJmUubGVuZ3RoJiZlLmhpZGUoKS5yZW1vdmVDbGFzcyhvK1wiIHVrLWFuaW1hdGlvbi1yZXZlcnNlXCIpLmNzcyh7b3BhY2l0eTpcIlwiLFwiYW5pbWF0aW9uLWRlbGF5XCI6XCJcIixhbmltYXRpb246XCJcIn0pLCFzLmxlbmd0aClyZXR1cm4gaC5yZXNvbHZlKCksdm9pZCAwO2ZvcihsPTA7bDxzLmxlbmd0aDtsKyspcy5lcSgxPT1uP2w6cy5sZW5ndGgtbC0xKS5jc3MoXCJhbmltYXRpb24tZGVsYXlcIixsKnUrXCJtc1wiKTt2YXIgaT1mdW5jdGlvbigpe3MucmVtb3ZlQ2xhc3MoXCJcIithKS5jc3Moe29wYWNpdHk6XCJcIixkaXNwbGF5OlwiXCIsXCJhbmltYXRpb24tZGVsYXlcIjpcIlwiLGFuaW1hdGlvbjpcIlwifSksaC5yZXNvbHZlKCksZC5lbGVtZW50LmNzcyhcIm1pbi1oZWlnaHRcIixcIlwiKSxpPSExfTtzLmFkZENsYXNzKGEpWzE9PW4/XCJsYXN0XCI6XCJmaXJzdFwiXSgpLm9uZSh0LnN1cHBvcnQuYW5pbWF0aW9uLmVuZCxmdW5jdGlvbigpe2kmJmkoKX0pLmVuZCgpLmNzcyhcImRpc3BsYXlcIixcIlwiKSxzZXRUaW1lb3V0KGZ1bmN0aW9uKCl7aSYmaSgpfSxzLmxlbmd0aCp1KjIpfSxzLmxlbmd0aCYmcy5jc3MoXCJhbmltYXRpb24tZHVyYXRpb25cIix0aGlzLm9wdGlvbnMuZHVyYXRpb24rXCJtc1wiKSxlJiZlLmxlbmd0aClmb3IoZS5jc3MoXCJhbmltYXRpb24tZHVyYXRpb25cIix0aGlzLm9wdGlvbnMuZHVyYXRpb24rXCJtc1wiKVsxPT1uP1wibGFzdFwiOlwiZmlyc3RcIl0oKS5vbmUodC5zdXBwb3J0LmFuaW1hdGlvbi5lbmQsZnVuY3Rpb24oKXtyKCl9KSxsPTA7bDxlLmxlbmd0aDtsKyspIWZ1bmN0aW9uKGksZSl7c2V0VGltZW91dChmdW5jdGlvbigpe2UuY3NzKFwiZGlzcGxheVwiLFwibm9uZVwiKS5jc3MoXCJkaXNwbGF5XCIsXCJcIikuY3NzKFwib3BhY2l0eVwiLDApLm9uKHQuc3VwcG9ydC5hbmltYXRpb24uZW5kLGZ1bmN0aW9uKCl7ZS5yZW1vdmVDbGFzcyhvKX0pLmFkZENsYXNzKG8rXCIgdWstYW5pbWF0aW9uLXJldmVyc2VcIil9LmJpbmQodGhpcyksbCp1KX0obCxlLmVxKDE9PW4/bDplLmxlbmd0aC1sLTEpKTtlbHNlIHIoKTtyZXR1cm4gaC5wcm9taXNlKCl9ZnVuY3Rpb24gZSh0LGkpe3ZhciBlLHM9MCxuPS0xLGE9dC5sZW5ndGh8fDAsbz1bXTtpZigxPmkpcmV0dXJuIG51bGw7Zm9yKDthPnM7KWU9cyVpLGU/b1tuXVtlXT10W3NdOm9bKytuXT1bdFtzXV0scysrO2ZvcihzPTAsYT1vLmxlbmd0aDthPnM7KW9bc109alF1ZXJ5KG9bc10pLHMrKztyZXR1cm4gb312YXIgczt0LmNvbXBvbmVudChcInNsaWRlc2V0XCIse2RlZmF1bHRzOntcImRlZmF1bHRcIjoxLGFuaW1hdGlvbjpcImZhZGVcIixkdXJhdGlvbjoyMDAsZmlsdGVyOlwiXCIsZGVsYXk6ITEsY29udHJvbHM6ITEsYXV0b3BsYXk6ITEsYXV0b3BsYXlJbnRlcnZhbDo3ZTMscGF1c2VPbkhvdmVyOiEwfSxzZXRzOltdLGJvb3Q6ZnVuY3Rpb24oKXt0LnJlYWR5KGZ1bmN0aW9uKGkpe3QuJChcIltkYXRhLXVrLXNsaWRlc2V0XVwiLGkpLmVhY2goZnVuY3Rpb24oKXt2YXIgaT10LiQodGhpcyk7aS5kYXRhKFwic2xpZGVzZXRcIil8fHQuc2xpZGVzZXQoaSx0LlV0aWxzLm9wdGlvbnMoaS5hdHRyKFwiZGF0YS11ay1zbGlkZXNldFwiKSkpfSl9KX0saW5pdDpmdW5jdGlvbigpe3ZhciBpPXRoaXM7dGhpcy5hY3RpdmVTZXQ9ITEsdGhpcy5saXN0PXRoaXMuZWxlbWVudC5maW5kKFwiLnVrLXNsaWRlc2V0XCIpLHRoaXMubmF2PXRoaXMuZWxlbWVudC5maW5kKFwiLnVrLXNsaWRlc2V0LW5hdlwiKSx0aGlzLmNvbnRyb2xzPXRoaXMub3B0aW9ucy5jb250cm9scz90LiQodGhpcy5vcHRpb25zLmNvbnRyb2xzKTp0aGlzLmVsZW1lbnQsdC4kd2luLm9uKFwicmVzaXplIGxvYWRcIix0LlV0aWxzLmRlYm91bmNlKGZ1bmN0aW9uKCl7aS51cGRhdGVTZXRzKCl9LDEwMCkpLGkubGlzdC5hZGRDbGFzcyhcInVrLWdyaWQtd2lkdGgtMS1cIitpLm9wdGlvbnMuZGVmYXVsdCksW1wieGxhcmdlXCIsXCJsYXJnZVwiLFwibWVkaXVtXCIsXCJzbWFsbFwiXS5mb3JFYWNoKGZ1bmN0aW9uKHQpe2kub3B0aW9uc1t0XSYmaS5saXN0LmFkZENsYXNzKFwidWstZ3JpZC13aWR0aC1cIit0K1wiLTEtXCIraS5vcHRpb25zW3RdKX0pLHRoaXMub24oXCJjbGljay51ay5zbGlkZXNldFwiLFwiW2RhdGEtdWstc2xpZGVzZXQtaXRlbV1cIixmdW5jdGlvbihlKXtpZihlLnByZXZlbnREZWZhdWx0KCksIWkuYW5pbWF0aW5nKXt2YXIgcz10LiQodGhpcykuYXR0cihcImRhdGEtdWstc2xpZGVzZXQtaXRlbVwiKTtpZihpLmFjdGl2ZVNldCE9PXMpc3dpdGNoKHMpe2Nhc2VcIm5leHRcIjpjYXNlXCJwcmV2aW91c1wiOmlbXCJuZXh0XCI9PXM/XCJuZXh0XCI6XCJwcmV2aW91c1wiXSgpO2JyZWFrO2RlZmF1bHQ6aS5zaG93KHBhcnNlSW50KHMsMTApKX19fSksdGhpcy5jb250cm9scy5vbihcImNsaWNrLnVrLnNsaWRlc2V0XCIsXCJbZGF0YS11ay1maWx0ZXJdXCIsZnVuY3Rpb24oZSl7dmFyIHM9dC4kKHRoaXMpO3MucGFyZW50KCkuaGFzQ2xhc3MoXCJ1ay1zbGlkZXNldFwiKXx8KGUucHJldmVudERlZmF1bHQoKSxpLmFuaW1hdGluZ3x8aS5jdXJyZW50RmlsdGVyPT1zLmF0dHIoXCJkYXRhLXVrLWZpbHRlclwiKXx8KGkudXBkYXRlRmlsdGVyKHMuYXR0cihcImRhdGEtdWstZmlsdGVyXCIpKSxpLl9oaWRlKCkudGhlbihmdW5jdGlvbigpe2kudXBkYXRlU2V0cyghMCwhMCl9KSkpfSksdGhpcy5vbihcInN3aXBlUmlnaHQgc3dpcGVMZWZ0XCIsZnVuY3Rpb24odCl7aVtcInN3aXBlTGVmdFwiPT10LnR5cGU/XCJuZXh0XCI6XCJwcmV2aW91c1wiXSgpfSksdGhpcy51cGRhdGVGaWx0ZXIodGhpcy5vcHRpb25zLmZpbHRlciksdGhpcy51cGRhdGVTZXRzKCksdGhpcy5lbGVtZW50Lm9uKHttb3VzZWVudGVyOmZ1bmN0aW9uKCl7aS5vcHRpb25zLnBhdXNlT25Ib3ZlciYmKGkuaG92ZXJpbmc9ITApfSxtb3VzZWxlYXZlOmZ1bmN0aW9uKCl7aS5ob3ZlcmluZz0hMX19KSx0aGlzLm9wdGlvbnMuYXV0b3BsYXkmJnRoaXMuc3RhcnQoKX0sdXBkYXRlU2V0czpmdW5jdGlvbih0LGkpe3ZhciBzLG49dGhpcy52aXNpYmxlO2lmKHRoaXMudmlzaWJsZT10aGlzLmdldFZpc2libGVPbkN1cnJlbkJyZWFrcG9pbnQoKSxuIT10aGlzLnZpc2libGV8fGkpe2Zvcih0aGlzLmNoaWxkcmVuPXRoaXMubGlzdC5jaGlsZHJlbigpLmhpZGUoKSx0aGlzLml0ZW1zPXRoaXMuZ2V0SXRlbXMoKSx0aGlzLnNldHM9ZSh0aGlzLml0ZW1zLHRoaXMudmlzaWJsZSkscz0wO3M8dGhpcy5zZXRzLmxlbmd0aDtzKyspdGhpcy5zZXRzW3NdLmNzcyh7ZGlzcGxheTpcIm5vbmVcIn0pO2lmKHRoaXMubmF2Lmxlbmd0aCYmdGhpcy5uYXYuZW1wdHkoKSl7Zm9yKHM9MDtzPHRoaXMuc2V0cy5sZW5ndGg7cysrKXRoaXMubmF2LmFwcGVuZCgnPGxpIGRhdGEtdWstc2xpZGVzZXQtaXRlbT1cIicrcysnXCI+PGE+PC9hPjwvbGk+Jyk7dGhpcy5uYXZbMT09dGhpcy5uYXYuY2hpbGRyZW4oKS5sZW5ndGg/XCJhZGRDbGFzc1wiOlwicmVtb3ZlQ2xhc3NcIl0oXCJ1ay1pbnZpc2libGVcIil9dGhpcy5hY3RpdmVTZXQ9ITEsdGhpcy5zaG93KDAsIXQpfX0sdXBkYXRlRmlsdGVyOmZ1bmN0aW9uKGkpe3ZhciBlLHM9dGhpczt0aGlzLmN1cnJlbnRGaWx0ZXI9aSx0aGlzLmNvbnRyb2xzLmZpbmQoXCJbZGF0YS11ay1maWx0ZXJdXCIpLmVhY2goZnVuY3Rpb24oKXtlPXQuJCh0aGlzKSxlLnBhcmVudCgpLmhhc0NsYXNzKFwidWstc2xpZGVzZXRcIil8fChlLmF0dHIoXCJkYXRhLXVrLWZpbHRlclwiKT09cy5jdXJyZW50RmlsdGVyP2UuYWRkQ2xhc3MoXCJ1ay1hY3RpdmVcIik6ZS5yZW1vdmVDbGFzcyhcInVrLWFjdGl2ZVwiKSl9KX0sZ2V0VmlzaWJsZU9uQ3VycmVuQnJlYWtwb2ludDpmdW5jdGlvbigpe3ZhciBpPW51bGwsZT10LiQoJzxkaXYgc3R5bGU9XCJwb3NpdGlvbjphYnNvbHV0ZTtoZWlnaHQ6MXB4O3RvcDotMTAwMHB4O3dpZHRoOjEwMHB4XCI+PGRpdj48L2Rpdj48L2Rpdj4nKS5hcHBlbmRUbyhcImJvZHlcIikscz1lLmNoaWxkcmVuKCkuZXEoMCksbj10aGlzLm9wdGlvbnM7cmV0dXJuW1wieGxhcmdlXCIsXCJsYXJnZVwiLFwibWVkaXVtXCIsXCJzbWFsbFwiXS5mb3JFYWNoKGZ1bmN0aW9uKHQpe25bdF0mJiFpJiYoZS5hdHRyKFwiY2xhc3NcIixcInVrLWdyaWQtd2lkdGgtXCIrdCtcIi0xLTJcIikud2lkdGgoKSw1MD09cy53aWR0aCgpJiYoaT10KSl9KSxlLnJlbW92ZSgpLHRoaXMub3B0aW9uc1tpXXx8dGhpcy5vcHRpb25zW1wiZGVmYXVsdFwiXX0sZ2V0SXRlbXM6ZnVuY3Rpb24oKXt2YXIgaSxlPVtdO3JldHVybiB0aGlzLmN1cnJlbnRGaWx0ZXI/KGk9dGhpcy5jdXJyZW50RmlsdGVyfHxbXSxcInN0cmluZ1wiPT10eXBlb2YgaSYmKGk9aS5zcGxpdCgvLC8pLm1hcChmdW5jdGlvbih0KXtyZXR1cm4gdC50cmltKCl9KSksdGhpcy5jaGlsZHJlbi5lYWNoKGZ1bmN0aW9uKCl7dmFyIHM9dC4kKHRoaXMpLG49cy5hdHRyKFwiZGF0YS11ay1maWx0ZXJcIiksYT1pLmxlbmd0aD8hMTohMDtuJiYobj1uLnNwbGl0KC8sLykubWFwKGZ1bmN0aW9uKHQpe3JldHVybiB0LnRyaW0oKX0pLGkuZm9yRWFjaChmdW5jdGlvbih0KXtuLmluZGV4T2YodCk+LTEmJihhPSEwKX0pKSxhJiZlLnB1c2goc1swXSl9KSxlPXQuJChlKSk6ZT10aGlzLmxpc3QuY2hpbGRyZW4oKSxlfSxzaG93OmZ1bmN0aW9uKGksZSxuKXt2YXIgYT10aGlzO2lmKHRoaXMuYWN0aXZlU2V0IT09aSYmIXRoaXMuYW5pbWF0aW5nKXtuPW58fChpPHRoaXMuYWN0aXZlU2V0Py0xOjEpO3ZhciBvPXRoaXMuc2V0c1t0aGlzLmFjdGl2ZVNldF18fFtdLHI9dGhpcy5zZXRzW2ldLGw9dGhpcy5fZ2V0QW5pbWF0aW9uKCk7KGV8fCF0LnN1cHBvcnQuYW5pbWF0aW9uKSYmKGw9cy5ub25lKSx0aGlzLmFuaW1hdGluZz0hMCx0aGlzLm5hdi5sZW5ndGgmJnRoaXMubmF2LmNoaWxkcmVuKCkucmVtb3ZlQ2xhc3MoXCJ1ay1hY3RpdmVcIikuZXEoaSkuYWRkQ2xhc3MoXCJ1ay1hY3RpdmVcIiksbC5hcHBseShhLFtvLHIsbl0pLnRoZW4oZnVuY3Rpb24oKXt0LlV0aWxzLmNoZWNrRGlzcGxheShyLCEwKSxhLmNoaWxkcmVuLmhpZGUoKS5yZW1vdmVDbGFzcyhcInVrLWFjdGl2ZVwiKSxyLmFkZENsYXNzKFwidWstYWN0aXZlXCIpLmNzcyh7ZGlzcGxheTpcIlwiLG9wYWNpdHk6XCJcIn0pLGEuYW5pbWF0aW5nPSExLGEuYWN0aXZlU2V0PWksdC5VdGlscy5jaGVja0Rpc3BsYXkociwhMCksYS50cmlnZ2VyKFwic2hvdy51ay5zbGlkZXNldFwiLFtyXSl9KX19LF9nZXRBbmltYXRpb246ZnVuY3Rpb24oKXt2YXIgaT1zW3RoaXMub3B0aW9ucy5hbmltYXRpb25dfHxzLm5vbmU7cmV0dXJuIHQuc3VwcG9ydC5hbmltYXRpb258fChpPXMubm9uZSksaX0sX2hpZGU6ZnVuY3Rpb24oKXt2YXIgdD10aGlzLGk9dGhpcy5zZXRzW3RoaXMuYWN0aXZlU2V0XXx8W10sZT10aGlzLl9nZXRBbmltYXRpb24oKTtyZXR1cm4gdGhpcy5hbmltYXRpbmc9ITAsZS5hcHBseSh0LFtpLFtdLDFdKS50aGVuKGZ1bmN0aW9uKCl7dC5hbmltYXRpbmc9ITF9KX0sbmV4dDpmdW5jdGlvbigpe3RoaXMuc2hvdyh0aGlzLnNldHNbdGhpcy5hY3RpdmVTZXQrMV0/dGhpcy5hY3RpdmVTZXQrMTowLCExLDEpfSxwcmV2aW91czpmdW5jdGlvbigpe3RoaXMuc2hvdyh0aGlzLnNldHNbdGhpcy5hY3RpdmVTZXQtMV0/dGhpcy5hY3RpdmVTZXQtMTp0aGlzLnNldHMubGVuZ3RoLTEsITEsLTEpfSxzdGFydDpmdW5jdGlvbigpe3RoaXMuc3RvcCgpO3ZhciB0PXRoaXM7dGhpcy5pbnRlcnZhbD1zZXRJbnRlcnZhbChmdW5jdGlvbigpe3QuaG92ZXJpbmd8fHQuYW5pbWF0aW5nfHx0Lm5leHQoKX0sdGhpcy5vcHRpb25zLmF1dG9wbGF5SW50ZXJ2YWwpfSxzdG9wOmZ1bmN0aW9uKCl7dGhpcy5pbnRlcnZhbCYmY2xlYXJJbnRlcnZhbCh0aGlzLmludGVydmFsKX19KSxzPXtub25lOmZ1bmN0aW9uKCl7dmFyIGk9dC4kLkRlZmVycmVkKCk7cmV0dXJuIGkucmVzb2x2ZSgpLGkucHJvbWlzZSgpfSxmYWRlOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIGkuYXBwbHkodGhpcyxbXCJ1ay1hbmltYXRpb24tZmFkZVwiLHQsZV0pfSxcInNsaWRlLWJvdHRvbVwiOmZ1bmN0aW9uKHQsZSl7cmV0dXJuIGkuYXBwbHkodGhpcyxbXCJ1ay1hbmltYXRpb24tc2xpZGUtYm90dG9tXCIsdCxlXSl9LFwic2xpZGUtdG9wXCI6ZnVuY3Rpb24odCxlKXtyZXR1cm4gaS5hcHBseSh0aGlzLFtcInVrLWFuaW1hdGlvbi1zbGlkZS10b3BcIix0LGVdKX0sXCJzbGlkZS12ZXJ0aWNhbFwiOmZ1bmN0aW9uKHQsZSxzKXt2YXIgbj1bXCJ1ay1hbmltYXRpb24tc2xpZGUtdG9wXCIsXCJ1ay1hbmltYXRpb24tc2xpZGUtYm90dG9tXCJdO3JldHVybi0xPT1zJiZuLnJldmVyc2UoKSxpLmFwcGx5KHRoaXMsW24sdCxlXSl9LFwic2xpZGUtaG9yaXpvbnRhbFwiOmZ1bmN0aW9uKHQsZSxzKXt2YXIgbj1bXCJ1ay1hbmltYXRpb24tc2xpZGUtcmlnaHRcIixcInVrLWFuaW1hdGlvbi1zbGlkZS1sZWZ0XCJdO3JldHVybi0xPT1zJiZuLnJldmVyc2UoKSxpLmFwcGx5KHRoaXMsW24sdCxlLHNdKX0sc2NhbGU6ZnVuY3Rpb24odCxlKXtyZXR1cm4gaS5hcHBseSh0aGlzLFtcInVrLWFuaW1hdGlvbi1zY2FsZS11cFwiLHQsZV0pfX0sdC5zbGlkZXNldC5hbmltYXRpb25zPXN9KTsiLCIvKiEgVUlraXQgMi4yNS4wIHwgaHR0cDovL3d3dy5nZXR1aWtpdC5jb20gfCAoYykgMjAxNCBZT090aGVtZSB8IE1JVCBMaWNlbnNlICovXG4hZnVuY3Rpb24gKGkpIHtcbiAgICB2YXIgdDtcbiAgICB3aW5kb3cuVUlraXQgJiYgKHQgPSBpKFVJa2l0KSksIFwiZnVuY3Rpb25cIiA9PSB0eXBlb2YgZGVmaW5lICYmIGRlZmluZS5hbWQgJiYgZGVmaW5lKFwidWlraXQtc2xpZGVzaG93XCIsIFtcInVpa2l0XCJdLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgIHJldHVybiB0IHx8IGkoVUlraXQpXG4gICAgfSlcbn0oZnVuY3Rpb24gKGkpIHtcbiAgICBcInVzZSBzdHJpY3RcIjtcbiAgICB2YXIgdCwgcyA9IDA7XG4gICAgaS5jb21wb25lbnQoXCJzbGlkZXNob3dcIiwge1xuICAgICAgICBkZWZhdWx0czoge1xuICAgICAgICAgICAgYW5pbWF0aW9uOiBcImZhZGVcIixcbiAgICAgICAgICAgIGR1cmF0aW9uOiA1MDAsXG4gICAgICAgICAgICBoZWlnaHQ6IFwiYXV0b1wiLFxuICAgICAgICAgICAgc3RhcnQ6IDAsXG4gICAgICAgICAgICBhdXRvcGxheTogITEsXG4gICAgICAgICAgICBhdXRvcGxheUludGVydmFsOiA3ZTMsXG4gICAgICAgICAgICB2aWRlb2F1dG9wbGF5OiAhMCxcbiAgICAgICAgICAgIHZpZGVvbXV0ZTogITAsXG4gICAgICAgICAgICBzbGljZXM6IDE1LFxuICAgICAgICAgICAgcGF1c2VPbkhvdmVyOiAhMCxcbiAgICAgICAgICAgIGtlbmJ1cm5zOiAhMSxcbiAgICAgICAgICAgIGtlbmJ1cm5zYW5pbWF0aW9uczogW1widWstYW5pbWF0aW9uLW1pZGRsZS1sZWZ0XCIsIFwidWstYW5pbWF0aW9uLXRvcC1yaWdodFwiLCBcInVrLWFuaW1hdGlvbi1ib3R0b20tbGVmdFwiLCBcInVrLWFuaW1hdGlvbi10b3AtY2VudGVyXCIsIFwiXCIsIFwidWstYW5pbWF0aW9uLWJvdHRvbS1yaWdodFwiXVxuICAgICAgICB9LCBjdXJyZW50OiAhMSwgaW50ZXJ2YWw6IG51bGwsIGhvdmVyaW5nOiAhMSwgYm9vdDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgaS5yZWFkeShmdW5jdGlvbiAodCkge1xuICAgICAgICAgICAgICAgIGkuJChcIltkYXRhLXVrLXNsaWRlc2hvd11cIiwgdCkuZWFjaChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgIHZhciB0ID0gaS4kKHRoaXMpO1xuICAgICAgICAgICAgICAgICAgICB0LmRhdGEoXCJzbGlkZXNob3dcIikgfHwgaS5zbGlkZXNob3codCwgaS5VdGlscy5vcHRpb25zKHQuYXR0cihcImRhdGEtdWstc2xpZGVzaG93XCIpKSlcbiAgICAgICAgICAgICAgICB9KVxuICAgICAgICAgICAgfSlcbiAgICAgICAgfSwgaW5pdDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdmFyIHQsIGUsIGEgPSB0aGlzO1xuICAgICAgICAgICAgdGhpcy5jb250YWluZXIgPSB0aGlzLmVsZW1lbnQuaGFzQ2xhc3MoXCJ1ay1zbGlkZXNob3dcIikgPyB0aGlzLmVsZW1lbnQgOiBpLiQodGhpcy5maW5kKFwiLnVrLXNsaWRlc2hvd1wiKSksIHRoaXMuc2xpZGVzID0gdGhpcy5jb250YWluZXIuY2hpbGRyZW4oKSwgdGhpcy5zbGlkZXNDb3VudCA9IHRoaXMuc2xpZGVzLmxlbmd0aCwgdGhpcy5jdXJyZW50ID0gdGhpcy5vcHRpb25zLnN0YXJ0LCB0aGlzLmFuaW1hdGluZyA9ICExLCB0aGlzLnRyaWdnZXJzID0gdGhpcy5maW5kKFwiW2RhdGEtdWstc2xpZGVzaG93LWl0ZW1dXCIpLCB0aGlzLmZpeEZ1bGxzY3JlZW4gPSBuYXZpZ2F0b3IudXNlckFnZW50Lm1hdGNoKC8oaVBhZHxpUGhvbmV8aVBvZCkvZykgJiYgdGhpcy5jb250YWluZXIuaGFzQ2xhc3MoXCJ1ay1zbGlkZXNob3ctZnVsbHNjcmVlblwiKSwgdGhpcy5vcHRpb25zLmtlbmJ1cm5zICYmIChlID0gdGhpcy5vcHRpb25zLmtlbmJ1cm5zID09PSAhMCA/IFwiMTVzXCIgOiB0aGlzLm9wdGlvbnMua2VuYnVybnMsIFN0cmluZyhlKS5tYXRjaCgvKG1zfHMpJC8pIHx8IChlICs9IFwibXNcIiksIFwic3RyaW5nXCIgPT0gdHlwZW9mIHRoaXMub3B0aW9ucy5rZW5idXJuc2FuaW1hdGlvbnMgJiYgKHRoaXMub3B0aW9ucy5rZW5idXJuc2FuaW1hdGlvbnMgPSB0aGlzLm9wdGlvbnMua2VuYnVybnNhbmltYXRpb25zLnNwbGl0KFwiLFwiKSkpLCB0aGlzLnNsaWRlcy5lYWNoKGZ1bmN0aW9uIChuKSB7XG4gICAgICAgICAgICAgICAgdmFyIG8gPSBpLiQodGhpcyksIHIgPSBvLmNoaWxkcmVuKFwiaW1nLHZpZGVvLGlmcmFtZVwiKS5lcSgwKTtcbiAgICAgICAgICAgICAgICBpZiAoby5kYXRhKFwibWVkaWFcIiwgciksIG8uZGF0YShcInNpemVyXCIsIHIpLCByLmxlbmd0aCkge1xuICAgICAgICAgICAgICAgICAgICB2YXIgZDtcbiAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChyWzBdLm5vZGVOYW1lKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlXCJQSUNUVVJFXCI6XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlXCJJTUdcIjpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXIgdSA9IGkuJCgnPGRpdiBjbGFzcz1cInVrLWNvdmVyLWJhY2tncm91bmQgdWstcG9zaXRpb24tY292ZXJcIj48L2Rpdj4nKS5jc3Moe1wiYmFja2dyb3VuZC1pbWFnZVwiOiBcInVybChcIiArIHIuYXR0cihcInNyY1wiKSArIFwiKVwifSk7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgci5hdHRyKFwid2lkdGhcIikgJiYgci5hdHRyKFwiaGVpZ2h0XCIpICYmIChkID0gaS4kKFwiPGNhbnZhcz48L2NhbnZhcz5cIikuYXR0cih7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoOiByLmF0dHIoXCJ3aWR0aFwiKSxcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OiByLmF0dHIoXCJoZWlnaHRcIilcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICB9KSwgci5yZXBsYWNlV2l0aChkKSwgciA9IGQsIGQgPSB2b2lkIDApLCByLmNzcyh7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpZHRoOiBcIjEwMCVcIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVpZ2h0OiBcImF1dG9cIixcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3BhY2l0eTogMFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLCBvLnByZXBlbmQodSkuZGF0YShcImNvdmVyXCIsIHUpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgY2FzZVwiSUZSQU1FXCI6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGggPSByWzBdLnNyYywgYyA9IFwic3ctXCIgKyArK3M7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgci5hdHRyKFwic3JjXCIsIFwiXCIpLm9uKFwibG9hZFwiLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgobiAhPT0gYS5jdXJyZW50IHx8IG4gPT0gYS5jdXJyZW50ICYmICFhLm9wdGlvbnMudmlkZW9hdXRvcGxheSkgJiYgYS5wYXVzZW1lZGlhKHIpLCBhLm9wdGlvbnMudmlkZW9tdXRlKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhLm11dGVtZWRpYShyKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhciBpID0gc2V0SW50ZXJ2YWwoZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhLm11dGVtZWRpYShyKSwgKyt0ID49IDQgJiYgY2xlYXJJbnRlcnZhbChpKVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0oMCksIDI1MClcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0pLmRhdGEoXCJzbGlkZXNob3dcIiwgYSkuYXR0cihcImRhdGEtcGxheWVyLWlkXCIsIGMpLmF0dHIoXCJzcmNcIiwgW2gsIGguaW5kZXhPZihcIj9cIikgPiAtMSA/IFwiJlwiIDogXCI/XCIsIFwiZW5hYmxlanNhcGk9MSZhcGk9MSZwbGF5ZXJfaWQ9XCIgKyBjXS5qb2luKFwiXCIpKS5hZGRDbGFzcyhcInVrLXBvc2l0aW9uLWFic29sdXRlXCIpLCBpLnN1cHBvcnQudG91Y2ggfHwgci5jc3MoXCJwb2ludGVyLWV2ZW50c1wiLCBcIm5vbmVcIiksIGQgPSAhMCwgaS5jb3ZlciAmJiAoaS5jb3ZlcihyKSwgci5hdHRyKFwiZGF0YS11ay1jb3ZlclwiLCBcInt9XCIpKTtcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhaztcbiAgICAgICAgICAgICAgICAgICAgICAgIGNhc2VcIlZJREVPXCI6XG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgci5hZGRDbGFzcyhcInVrLWNvdmVyLW9iamVjdCB1ay1wb3NpdGlvbi1hYnNvbHV0ZVwiKSwgZCA9ICEwLCBhLm9wdGlvbnMudmlkZW9tdXRlICYmIGEubXV0ZW1lZGlhKHIpXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICAgICAgaWYgKGQpIHtcbiAgICAgICAgICAgICAgICAgICAgICAgIHQgPSBpLiQoXCI8Y2FudmFzPjwvY2FudmFzPlwiKS5hdHRyKHt3aWR0aDogclswXS53aWR0aCwgaGVpZ2h0OiByWzBdLmhlaWdodH0pO1xuICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGwgPSBpLiQoJzxpbWcgc3R5bGU9XCJ3aWR0aDoxMDAlO2hlaWdodDphdXRvO1wiPicpLmF0dHIoXCJzcmNcIiwgdFswXS50b0RhdGFVUkwoKSk7XG4gICAgICAgICAgICAgICAgICAgICAgICBvLnByZXBlbmQobCksIG8uZGF0YShcInNpemVyXCIsIGwpXG4gICAgICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgICAgICB9IGVsc2Ugby5kYXRhKFwic2l6ZXJcIiwgbyk7XG4gICAgICAgICAgICAgICAgYS5oYXNLZW5CdXJucyhvKSAmJiBvLmRhdGEoXCJjb3ZlclwiKS5jc3Moe1wiLXdlYmtpdC1hbmltYXRpb24tZHVyYXRpb25cIjogZSwgXCJhbmltYXRpb24tZHVyYXRpb25cIjogZX0pXG4gICAgICAgICAgICB9KSwgdGhpcy5vbihcImNsaWNrLnVrLnNsaWRlc2hvd1wiLCBcIltkYXRhLXVrLXNsaWRlc2hvdy1pdGVtXVwiLCBmdW5jdGlvbiAodCkge1xuICAgICAgICAgICAgICAgIHQucHJldmVudERlZmF1bHQoKTtcbiAgICAgICAgICAgICAgICB2YXIgcyA9IGkuJCh0aGlzKS5hdHRyKFwiZGF0YS11ay1zbGlkZXNob3ctaXRlbVwiKTtcbiAgICAgICAgICAgICAgICBpZiAoYS5jdXJyZW50ICE9IHMpIHtcbiAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChzKSB7XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlXCJuZXh0XCI6XG4gICAgICAgICAgICAgICAgICAgICAgICBjYXNlXCJwcmV2aW91c1wiOlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFbXCJuZXh0XCIgPT0gcyA/IFwibmV4dFwiIDogXCJwcmV2aW91c1wiXSgpO1xuICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDpcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhLnNob3cocGFyc2VJbnQocywgMTApKVxuICAgICAgICAgICAgICAgICAgICB9XG4gICAgICAgICAgICAgICAgICAgIGEuc3RvcCgpXG4gICAgICAgICAgICAgICAgfVxuICAgICAgICAgICAgfSksIHRoaXMuc2xpZGVzLmF0dHIoXCJhcmlhLWhpZGRlblwiLCBcInRydWVcIikuZXEodGhpcy5jdXJyZW50KS5hZGRDbGFzcyhcInVrLWFjdGl2ZVwiKS5hdHRyKFwiYXJpYS1oaWRkZW5cIiwgXCJmYWxzZVwiKSwgdGhpcy50cmlnZ2Vycy5maWx0ZXIoJ1tkYXRhLXVrLXNsaWRlc2hvdy1pdGVtPVwiJyArIHRoaXMuY3VycmVudCArICdcIl0nKS5hZGRDbGFzcyhcInVrLWFjdGl2ZVwiKSwgaS4kd2luLm9uKFwicmVzaXplIGxvYWRcIiwgaS5VdGlscy5kZWJvdW5jZShmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgYS5yZXNpemUoKSwgYS5maXhGdWxsc2NyZWVuICYmIChhLmNvbnRhaW5lci5jc3MoXCJoZWlnaHRcIiwgd2luZG93LmlubmVySGVpZ2h0KSwgYS5zbGlkZXMuY3NzKFwiaGVpZ2h0XCIsIHdpbmRvdy5pbm5lckhlaWdodCkpXG4gICAgICAgICAgICB9LCAxMDApKSwgc2V0VGltZW91dChmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgYS5yZXNpemUoKVxuICAgICAgICAgICAgfSwgODApLCB0aGlzLm9wdGlvbnMuYXV0b3BsYXkgJiYgdGhpcy5zdGFydCgpLCB0aGlzLm9wdGlvbnMudmlkZW9hdXRvcGxheSAmJiB0aGlzLnNsaWRlcy5lcSh0aGlzLmN1cnJlbnQpLmRhdGEoXCJtZWRpYVwiKSAmJiB0aGlzLnBsYXltZWRpYSh0aGlzLnNsaWRlcy5lcSh0aGlzLmN1cnJlbnQpLmRhdGEoXCJtZWRpYVwiKSksIHRoaXMub3B0aW9ucy5rZW5idXJucyAmJiB0aGlzLmFwcGx5S2VuQnVybnModGhpcy5zbGlkZXMuZXEodGhpcy5jdXJyZW50KSksIHRoaXMuY29udGFpbmVyLm9uKHtcbiAgICAgICAgICAgICAgICBtb3VzZWVudGVyOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgIGEub3B0aW9ucy5wYXVzZU9uSG92ZXIgJiYgKGEuaG92ZXJpbmcgPSAhMClcbiAgICAgICAgICAgICAgICB9LCBtb3VzZWxlYXZlOiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgICAgIGEuaG92ZXJpbmcgPSAhMVxuICAgICAgICAgICAgICAgIH1cbiAgICAgICAgICAgIH0pLCB0aGlzLm9uKFwic3dpcGVSaWdodCBzd2lwZUxlZnRcIiwgZnVuY3Rpb24gKGkpIHtcbiAgICAgICAgICAgICAgICBhW1wic3dpcGVMZWZ0XCIgPT0gaS50eXBlID8gXCJuZXh0XCIgOiBcInByZXZpb3VzXCJdKClcbiAgICAgICAgICAgIH0pLCB0aGlzLm9uKFwiZGlzcGxheS51ay5jaGVja1wiLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgYS5lbGVtZW50LmlzKFwiOnZpc2libGVcIikgJiYgKGEucmVzaXplKCksIGEuZml4RnVsbHNjcmVlbiAmJiAoYS5jb250YWluZXIuY3NzKFwiaGVpZ2h0XCIsIHdpbmRvdy5pbm5lckhlaWdodCksIGEuc2xpZGVzLmNzcyhcImhlaWdodFwiLCB3aW5kb3cuaW5uZXJIZWlnaHQpKSlcbiAgICAgICAgICAgIH0pXG4gICAgICAgIH0sIHJlc2l6ZTogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgaWYgKCF0aGlzLmNvbnRhaW5lci5oYXNDbGFzcyhcInVrLXNsaWRlc2hvdy1mdWxsc2NyZWVuXCIpKSB7XG4gICAgICAgICAgICAgICAgdmFyIHQgPSB0aGlzLm9wdGlvbnMuaGVpZ2h0O1xuICAgICAgICAgICAgICAgIFwiYXV0b1wiID09PSB0aGlzLm9wdGlvbnMuaGVpZ2h0ICYmICh0ID0gMCwgdGhpcy5zbGlkZXMuY3NzKFwiaGVpZ2h0XCIsIFwiXCIpLmVhY2goZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICB0ID0gTWF0aC5tYXgodCwgaS4kKHRoaXMpLmhlaWdodCgpKVxuICAgICAgICAgICAgICAgIH0pKSwgdGhpcy5jb250YWluZXIuY3NzKFwiaGVpZ2h0XCIsIHQpLCB0aGlzLnNsaWRlcy5jc3MoXCJoZWlnaHRcIiwgdClcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSwgc2hvdzogZnVuY3Rpb24gKHMsIGUpIHtcbiAgICAgICAgICAgIGlmICghdGhpcy5hbmltYXRpbmcgJiYgdGhpcy5jdXJyZW50ICE9IHMpIHtcbiAgICAgICAgICAgICAgICB0aGlzLmFuaW1hdGluZyA9ICEwO1xuICAgICAgICAgICAgICAgIHZhciBhID0gdGhpcywgbiA9IHRoaXMuc2xpZGVzLmVxKHRoaXMuY3VycmVudCksIG8gPSB0aGlzLnNsaWRlcy5lcShzKSwgciA9IGUgPyBlIDogdGhpcy5jdXJyZW50IDwgcyA/IDEgOiAtMSwgZCA9IG4uZGF0YShcIm1lZGlhXCIpLCB1ID0gdFt0aGlzLm9wdGlvbnMuYW5pbWF0aW9uXSA/IHRoaXMub3B0aW9ucy5hbmltYXRpb24gOiBcImZhZGVcIiwgaCA9IG8uZGF0YShcIm1lZGlhXCIpLCBjID0gZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgICAgICBhLmFuaW1hdGluZyAmJiAoZCAmJiBkLmlzKFwidmlkZW8saWZyYW1lXCIpICYmIGEucGF1c2VtZWRpYShkKSwgaCAmJiBoLmlzKFwidmlkZW8saWZyYW1lXCIpICYmIGEucGxheW1lZGlhKGgpLCBvLmFkZENsYXNzKFwidWstYWN0aXZlXCIpLmF0dHIoXCJhcmlhLWhpZGRlblwiLCBcImZhbHNlXCIpLCBuLnJlbW92ZUNsYXNzKFwidWstYWN0aXZlXCIpLmF0dHIoXCJhcmlhLWhpZGRlblwiLCBcInRydWVcIiksIGEuYW5pbWF0aW5nID0gITEsIGEuY3VycmVudCA9IHMsIGkuVXRpbHMuY2hlY2tEaXNwbGF5KG8sICdbY2xhc3MqPVwidWstYW5pbWF0aW9uLVwiXTpub3QoLnVrLWNvdmVyLWJhY2tncm91bmQudWstcG9zaXRpb24tY292ZXIpJyksIGEudHJpZ2dlcihcInNob3cudWsuc2xpZGVzaG93XCIsIFtvLCBuLCBhXSkpXG4gICAgICAgICAgICAgICAgfTtcbiAgICAgICAgICAgICAgICBhLmFwcGx5S2VuQnVybnMobyksIGkuc3VwcG9ydC5hbmltYXRpb24gfHwgKHUgPSBcIm5vbmVcIiksIG4gPSBpLiQobiksIG8gPSBpLiQobyksIGEudHJpZ2dlcihcImJlZm9yZXNob3cudWsuc2xpZGVzaG93XCIsIFtvLCBuLCBhXSksIHRbdV0uYXBwbHkodGhpcywgW24sIG8sIHJdKS50aGVuKGMpLCBhLnRyaWdnZXJzLnJlbW92ZUNsYXNzKFwidWstYWN0aXZlXCIpLCBhLnRyaWdnZXJzLmZpbHRlcignW2RhdGEtdWstc2xpZGVzaG93LWl0ZW09XCInICsgcyArICdcIl0nKS5hZGRDbGFzcyhcInVrLWFjdGl2ZVwiKVxuICAgICAgICAgICAgfVxuICAgICAgICB9LCBhcHBseUtlbkJ1cm5zOiBmdW5jdGlvbiAoaSkge1xuICAgICAgICAgICAgaWYgKHRoaXMuaGFzS2VuQnVybnMoaSkpIHtcbiAgICAgICAgICAgICAgICB2YXIgdCA9IHRoaXMub3B0aW9ucy5rZW5idXJuc2FuaW1hdGlvbnMsIHMgPSB0aGlzLmtiaW5kZXggfHwgMDtcbiAgICAgICAgICAgICAgICBpLmRhdGEoXCJjb3ZlclwiKS5hdHRyKFwiY2xhc3NcIiwgXCJ1ay1jb3Zlci1iYWNrZ3JvdW5kIHVrLXBvc2l0aW9uLWNvdmVyXCIpLndpZHRoKCksIGkuZGF0YShcImNvdmVyXCIpLmFkZENsYXNzKFtcInVrLWFuaW1hdGlvbi1zY2FsZVwiLCBcInVrLWFuaW1hdGlvbi1yZXZlcnNlXCIsIHRbc10udHJpbSgpXS5qb2luKFwiIFwiKSksIHRoaXMua2JpbmRleCA9IHRbcyArIDFdID8gcyArIDEgOiAwXG4gICAgICAgICAgICB9XG4gICAgICAgIH0sIGhhc0tlbkJ1cm5zOiBmdW5jdGlvbiAoaSkge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMub3B0aW9ucy5rZW5idXJucyAmJiBpLmRhdGEoXCJjb3ZlclwiKVxuICAgICAgICB9LCBuZXh0OiBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICB0aGlzLnNob3codGhpcy5zbGlkZXNbdGhpcy5jdXJyZW50ICsgMV0gPyB0aGlzLmN1cnJlbnQgKyAxIDogMCwgMSlcbiAgICAgICAgfSwgcHJldmlvdXM6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHRoaXMuc2hvdyh0aGlzLnNsaWRlc1t0aGlzLmN1cnJlbnQgLSAxXSA/IHRoaXMuY3VycmVudCAtIDEgOiB0aGlzLnNsaWRlcy5sZW5ndGggLSAxLCAtMSlcbiAgICAgICAgfSwgc3RhcnQ6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHRoaXMuc3RvcCgpO1xuICAgICAgICAgICAgdmFyIGkgPSB0aGlzO1xuICAgICAgICAgICAgdGhpcy5pbnRlcnZhbCA9IHNldEludGVydmFsKGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICBpLmhvdmVyaW5nIHx8IGkubmV4dCgpXG4gICAgICAgICAgICB9LCB0aGlzLm9wdGlvbnMuYXV0b3BsYXlJbnRlcnZhbClcbiAgICAgICAgfSwgc3RvcDogZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgdGhpcy5pbnRlcnZhbCAmJiBjbGVhckludGVydmFsKHRoaXMuaW50ZXJ2YWwpXG4gICAgICAgIH0sIHBsYXltZWRpYTogZnVuY3Rpb24gKGkpIHtcbiAgICAgICAgICAgIGlmIChpICYmIGlbMF0pc3dpdGNoIChpWzBdLm5vZGVOYW1lKSB7XG4gICAgICAgICAgICAgICAgY2FzZVwiVklERU9cIjpcbiAgICAgICAgICAgICAgICAgICAgdGhpcy5vcHRpb25zLnZpZGVvbXV0ZSB8fCAoaVswXS5tdXRlZCA9ICExKSwgaVswXS5wbGF5KCk7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2VcIklGUkFNRVwiOlxuICAgICAgICAgICAgICAgICAgICB0aGlzLm9wdGlvbnMudmlkZW9tdXRlIHx8IGlbMF0uY29udGVudFdpbmRvdy5wb3N0TWVzc2FnZSgneyBcImV2ZW50XCI6IFwiY29tbWFuZFwiLCBcImZ1bmNcIjogXCJ1bm11dGVcIiwgXCJtZXRob2RcIjpcInNldFZvbHVtZVwiLCBcInZhbHVlXCI6MX0nLCBcIipcIiksIGlbMF0uY29udGVudFdpbmRvdy5wb3N0TWVzc2FnZSgneyBcImV2ZW50XCI6IFwiY29tbWFuZFwiLCBcImZ1bmNcIjogXCJwbGF5VmlkZW9cIiwgXCJtZXRob2RcIjpcInBsYXlcIn0nLCBcIipcIilcbiAgICAgICAgICAgIH1cbiAgICAgICAgfSwgcGF1c2VtZWRpYTogZnVuY3Rpb24gKGkpIHtcbiAgICAgICAgICAgIHN3aXRjaCAoaVswXS5ub2RlTmFtZSkge1xuICAgICAgICAgICAgICAgIGNhc2VcIlZJREVPXCI6XG4gICAgICAgICAgICAgICAgICAgIGlbMF0ucGF1c2UoKTtcbiAgICAgICAgICAgICAgICAgICAgYnJlYWs7XG4gICAgICAgICAgICAgICAgY2FzZVwiSUZSQU1FXCI6XG4gICAgICAgICAgICAgICAgICAgIGlbMF0uY29udGVudFdpbmRvdy5wb3N0TWVzc2FnZSgneyBcImV2ZW50XCI6IFwiY29tbWFuZFwiLCBcImZ1bmNcIjogXCJwYXVzZVZpZGVvXCIsIFwibWV0aG9kXCI6XCJwYXVzZVwifScsIFwiKlwiKVxuICAgICAgICAgICAgfVxuICAgICAgICB9LCBtdXRlbWVkaWE6IGZ1bmN0aW9uIChpKSB7XG4gICAgICAgICAgICBzd2l0Y2ggKGlbMF0ubm9kZU5hbWUpIHtcbiAgICAgICAgICAgICAgICBjYXNlXCJWSURFT1wiOlxuICAgICAgICAgICAgICAgICAgICBpWzBdLm11dGVkID0gITA7XG4gICAgICAgICAgICAgICAgICAgIGJyZWFrO1xuICAgICAgICAgICAgICAgIGNhc2VcIklGUkFNRVwiOlxuICAgICAgICAgICAgICAgICAgICBpWzBdLmNvbnRlbnRXaW5kb3cucG9zdE1lc3NhZ2UoJ3sgXCJldmVudFwiOiBcImNvbW1hbmRcIiwgXCJmdW5jXCI6IFwibXV0ZVwiLCBcIm1ldGhvZFwiOlwic2V0Vm9sdW1lXCIsIFwidmFsdWVcIjowfScsIFwiKlwiKVxuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgfSksIHQgPSB7XG4gICAgICAgIG5vbmU6IGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgIHZhciB0ID0gaS4kLkRlZmVycmVkKCk7XG4gICAgICAgICAgICByZXR1cm4gdC5yZXNvbHZlKCksIHQucHJvbWlzZSgpXG4gICAgICAgIH0sIHNjcm9sbDogZnVuY3Rpb24gKHQsIHMsIGUpIHtcbiAgICAgICAgICAgIHZhciBhID0gaS4kLkRlZmVycmVkKCk7XG4gICAgICAgICAgICByZXR1cm4gdC5jc3MoXCJhbmltYXRpb24tZHVyYXRpb25cIiwgdGhpcy5vcHRpb25zLmR1cmF0aW9uICsgXCJtc1wiKSwgcy5jc3MoXCJhbmltYXRpb24tZHVyYXRpb25cIiwgdGhpcy5vcHRpb25zLmR1cmF0aW9uICsgXCJtc1wiKSwgcy5jc3MoXCJvcGFjaXR5XCIsIDEpLm9uZShpLnN1cHBvcnQuYW5pbWF0aW9uLmVuZCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHQucmVtb3ZlQ2xhc3MoLTEgPT0gZSA/IFwidWstc2xpZGVzaG93LXNjcm9sbC1iYWNrd2FyZC1vdXRcIiA6IFwidWstc2xpZGVzaG93LXNjcm9sbC1mb3J3YXJkLW91dFwiKSwgcy5jc3MoXCJvcGFjaXR5XCIsIFwiXCIpLnJlbW92ZUNsYXNzKC0xID09IGUgPyBcInVrLXNsaWRlc2hvdy1zY3JvbGwtYmFja3dhcmQtaW5cIiA6IFwidWstc2xpZGVzaG93LXNjcm9sbC1mb3J3YXJkLWluXCIpLCBhLnJlc29sdmUoKVxuICAgICAgICAgICAgfS5iaW5kKHRoaXMpKSwgdC5hZGRDbGFzcygtMSA9PSBlID8gXCJ1ay1zbGlkZXNob3ctc2Nyb2xsLWJhY2t3YXJkLW91dFwiIDogXCJ1ay1zbGlkZXNob3ctc2Nyb2xsLWZvcndhcmQtb3V0XCIpLCBzLmFkZENsYXNzKC0xID09IGUgPyBcInVrLXNsaWRlc2hvdy1zY3JvbGwtYmFja3dhcmQtaW5cIiA6IFwidWstc2xpZGVzaG93LXNjcm9sbC1mb3J3YXJkLWluXCIpLCBzLndpZHRoKCksIGEucHJvbWlzZSgpXG4gICAgICAgIH0sIHN3aXBlOiBmdW5jdGlvbiAodCwgcywgZSkge1xuICAgICAgICAgICAgdmFyIGEgPSBpLiQuRGVmZXJyZWQoKTtcbiAgICAgICAgICAgIHJldHVybiB0LmNzcyhcImFuaW1hdGlvbi1kdXJhdGlvblwiLCB0aGlzLm9wdGlvbnMuZHVyYXRpb24gKyBcIm1zXCIpLCBzLmNzcyhcImFuaW1hdGlvbi1kdXJhdGlvblwiLCB0aGlzLm9wdGlvbnMuZHVyYXRpb24gKyBcIm1zXCIpLCBzLmNzcyhcIm9wYWNpdHlcIiwgMSkub25lKGkuc3VwcG9ydC5hbmltYXRpb24uZW5kLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgdC5yZW1vdmVDbGFzcygtMSA9PT0gZSA/IFwidWstc2xpZGVzaG93LXN3aXBlLWJhY2t3YXJkLW91dFwiIDogXCJ1ay1zbGlkZXNob3ctc3dpcGUtZm9yd2FyZC1vdXRcIiksIHMuY3NzKFwib3BhY2l0eVwiLCBcIlwiKS5yZW1vdmVDbGFzcygtMSA9PT0gZSA/IFwidWstc2xpZGVzaG93LXN3aXBlLWJhY2t3YXJkLWluXCIgOiBcInVrLXNsaWRlc2hvdy1zd2lwZS1mb3J3YXJkLWluXCIpLCBhLnJlc29sdmUoKVxuICAgICAgICAgICAgfS5iaW5kKHRoaXMpKSwgdC5hZGRDbGFzcygtMSA9PSBlID8gXCJ1ay1zbGlkZXNob3ctc3dpcGUtYmFja3dhcmQtb3V0XCIgOiBcInVrLXNsaWRlc2hvdy1zd2lwZS1mb3J3YXJkLW91dFwiKSwgcy5hZGRDbGFzcygtMSA9PSBlID8gXCJ1ay1zbGlkZXNob3ctc3dpcGUtYmFja3dhcmQtaW5cIiA6IFwidWstc2xpZGVzaG93LXN3aXBlLWZvcndhcmQtaW5cIiksIHMud2lkdGgoKSwgYS5wcm9taXNlKClcbiAgICAgICAgfSwgc2NhbGU6IGZ1bmN0aW9uICh0LCBzKSB7XG4gICAgICAgICAgICB2YXIgZSA9IGkuJC5EZWZlcnJlZCgpO1xuICAgICAgICAgICAgcmV0dXJuIHQuY3NzKFwiYW5pbWF0aW9uLWR1cmF0aW9uXCIsIHRoaXMub3B0aW9ucy5kdXJhdGlvbiArIFwibXNcIiksIHMuY3NzKFwiYW5pbWF0aW9uLWR1cmF0aW9uXCIsIHRoaXMub3B0aW9ucy5kdXJhdGlvbiArIFwibXNcIiksIHMuY3NzKFwib3BhY2l0eVwiLCAxKSwgdC5vbmUoaS5zdXBwb3J0LmFuaW1hdGlvbi5lbmQsIGZ1bmN0aW9uICgpIHtcbiAgICAgICAgICAgICAgICB0LnJlbW92ZUNsYXNzKFwidWstc2xpZGVzaG93LXNjYWxlLW91dFwiKSwgcy5jc3MoXCJvcGFjaXR5XCIsIFwiXCIpLCBlLnJlc29sdmUoKVxuICAgICAgICAgICAgfS5iaW5kKHRoaXMpKSwgdC5hZGRDbGFzcyhcInVrLXNsaWRlc2hvdy1zY2FsZS1vdXRcIiksIHQud2lkdGgoKSwgZS5wcm9taXNlKClcbiAgICAgICAgfSwgZmFkZTogZnVuY3Rpb24gKHQsIHMpIHtcbiAgICAgICAgICAgIHZhciBlID0gaS4kLkRlZmVycmVkKCk7XG4gICAgICAgICAgICByZXR1cm4gdC5jc3MoXCJhbmltYXRpb24tZHVyYXRpb25cIiwgdGhpcy5vcHRpb25zLmR1cmF0aW9uICsgXCJtc1wiKSwgcy5jc3MoXCJhbmltYXRpb24tZHVyYXRpb25cIiwgdGhpcy5vcHRpb25zLmR1cmF0aW9uICsgXCJtc1wiKSwgcy5jc3MoXCJvcGFjaXR5XCIsIDEpLCBzLmRhdGEoXCJjb3ZlclwiKSB8fCBzLmRhdGEoXCJwbGFjZWhvbGRlclwiKSB8fCBzLmNzcyhcIm9wYWNpdHlcIiwgMSkub25lKGkuc3VwcG9ydC5hbmltYXRpb24uZW5kLCBmdW5jdGlvbiAoKSB7XG4gICAgICAgICAgICAgICAgcy5yZW1vdmVDbGFzcyhcInVrLXNsaWRlc2hvdy1mYWRlLWluXCIpXG4gICAgICAgICAgICB9KS5hZGRDbGFzcyhcInVrLXNsaWRlc2hvdy1mYWRlLWluXCIpLCB0Lm9uZShpLnN1cHBvcnQuYW5pbWF0aW9uLmVuZCwgZnVuY3Rpb24gKCkge1xuICAgICAgICAgICAgICAgIHQucmVtb3ZlQ2xhc3MoXCJ1ay1zbGlkZXNob3ctZmFkZS1vdXRcIiksIHMuY3NzKFwib3BhY2l0eVwiLCBcIlwiKSwgZS5yZXNvbHZlKClcbiAgICAgICAgICAgIH0uYmluZCh0aGlzKSksIHQuYWRkQ2xhc3MoXCJ1ay1zbGlkZXNob3ctZmFkZS1vdXRcIiksIHQud2lkdGgoKSwgZS5wcm9taXNlKClcbiAgICAgICAgfVxuICAgIH0sIGkuc2xpZGVzaG93LmFuaW1hdGlvbnMgPSB0LCB3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcihcIm1lc3NhZ2VcIiwgZnVuY3Rpb24gKHQpIHtcbiAgICAgICAgdmFyIHMsIGUgPSB0LmRhdGE7XG4gICAgICAgIGlmIChcInN0cmluZ1wiID09IHR5cGVvZiBlKXRyeSB7XG4gICAgICAgICAgICBlID0gSlNPTi5wYXJzZShlKVxuICAgICAgICB9IGNhdGNoIChhKSB7XG4gICAgICAgICAgICBlID0ge31cbiAgICAgICAgfVxuICAgICAgICB0Lm9yaWdpbiAmJiB0Lm9yaWdpbi5pbmRleE9mKFwidmltZW9cIikgPiAtMSAmJiBcInJlYWR5XCIgPT0gZS5ldmVudCAmJiBlLnBsYXllcl9pZCAmJiAocyA9IGkuJCgnW2RhdGEtcGxheWVyLWlkPVwiJyArIGUucGxheWVyX2lkICsgJ1wiXScpLCBzLmxlbmd0aCAmJiBzLmRhdGEoXCJzbGlkZXNob3dcIikubXV0ZW1lZGlhKHMpKVxuICAgIH0sICExKVxufSk7IiwiLyohIFVJa2l0IDIuMjYuMyB8IGh0dHA6Ly93d3cuZ2V0dWlraXQuY29tIHwgKGMpIDIwMTQgWU9PdGhlbWUgfCBNSVQgTGljZW5zZSAqL1xuIWZ1bmN0aW9uKHQpe3ZhciBpO3dpbmRvdy5VSWtpdCYmKGk9dChVSWtpdCkpLFwiZnVuY3Rpb25cIj09dHlwZW9mIGRlZmluZSYmZGVmaW5lLmFtZCYmZGVmaW5lKFwidWlraXQtc3RpY2t5XCIsW1widWlraXRcIl0sZnVuY3Rpb24oKXtyZXR1cm4gaXx8dChVSWtpdCl9KX0oZnVuY3Rpb24odCl7XCJ1c2Ugc3RyaWN0XCI7ZnVuY3Rpb24gaSgpe3ZhciBpPWFyZ3VtZW50cy5sZW5ndGg/YXJndW1lbnRzOm47aWYoaS5sZW5ndGgmJiEoZS5zY3JvbGxUb3AoKTwwKSlmb3IodmFyIG8sYSxyLGgscD1lLnNjcm9sbFRvcCgpLGM9cy5oZWlnaHQoKSxsPWUuaGVpZ2h0KCksZD1jLWwsdT1wPmQ/ZC1wOjAsbT0wO208aS5sZW5ndGg7bSsrKWlmKGg9aVttXSxoLmVsZW1lbnQuaXMoXCI6dmlzaWJsZVwiKSYmIWguYW5pbWF0ZSl7aWYoaC5jaGVjaygpKXtpZihoLnRvcDwwP289MDoocj1oLmVsZW1lbnQub3V0ZXJIZWlnaHQoKSxvPWMtci1oLnRvcC1oLm9wdGlvbnMuYm90dG9tLXAtdSxvPTA+bz9vK2gudG9wOmgudG9wKSxoLmJvdW5kYXJ5JiZoLmJvdW5kYXJ5Lmxlbmd0aCl7dmFyIGY9aC5ib3VuZGFyeS5vZmZzZXQoKS50b3A7YT1oLmJvdW5kdG9wYXJlbnQ/Yy0oZitoLmJvdW5kYXJ5Lm91dGVySGVpZ2h0KCkpK3BhcnNlSW50KGguYm91bmRhcnkuY3NzKFwicGFkZGluZy1ib3R0b21cIikpOmMtZixvPXArcj5jLWEtKGgudG9wPDA/MDpoLnRvcCk/Yy1hLShwK3IpOm99aWYoaC5jdXJyZW50VG9wIT1vKXtpZihoLmVsZW1lbnQuY3NzKHtwb3NpdGlvbjpcImZpeGVkXCIsdG9wOm8sd2lkdGg6aC5nZXRXaWR0aEZyb20ubGVuZ3RoP2guZ2V0V2lkdGhGcm9tLndpZHRoKCk6aC5lbGVtZW50LndpZHRoKCl9KSwhaC5pbml0JiYoaC5lbGVtZW50LmFkZENsYXNzKGgub3B0aW9ucy5jbHNpbml0KSxsb2NhdGlvbi5oYXNoJiZwPjAmJmgub3B0aW9ucy50YXJnZXQpKXt2YXIgZz10LiQobG9jYXRpb24uaGFzaCk7Zy5sZW5ndGgmJnNldFRpbWVvdXQoZnVuY3Rpb24odCxpKXtyZXR1cm4gZnVuY3Rpb24oKXtpLmVsZW1lbnQud2lkdGgoKTt2YXIgZT10Lm9mZnNldCgpLHM9ZS50b3ArdC5vdXRlckhlaWdodCgpLG49aS5lbGVtZW50Lm9mZnNldCgpLG89aS5lbGVtZW50Lm91dGVySGVpZ2h0KCksYT1uLnRvcCtvO24udG9wPHMmJmUudG9wPGEmJihwPWUudG9wLW8taS5vcHRpb25zLnRhcmdldCx3aW5kb3cuc2Nyb2xsVG8oMCxwKSl9fShnLGgpLDApfWguZWxlbWVudC5hZGRDbGFzcyhoLm9wdGlvbnMuY2xzYWN0aXZlKS5yZW1vdmVDbGFzcyhoLm9wdGlvbnMuY2xzaW5hY3RpdmUpLGguZWxlbWVudC50cmlnZ2VyKFwiYWN0aXZlLnVrLnN0aWNreVwiKSxoLmVsZW1lbnQuY3NzKFwibWFyZ2luXCIsXCJcIiksaC5vcHRpb25zLmFuaW1hdGlvbiYmaC5pbml0JiYhdC5VdGlscy5pc0luVmlldyhoLndyYXBwZXIpJiZoLmVsZW1lbnQuYWRkQ2xhc3MoaC5vcHRpb25zLmFuaW1hdGlvbiksaC5jdXJyZW50VG9wPW99fWVsc2UgbnVsbCE9PWguY3VycmVudFRvcCYmaC5yZXNldCgpO2guaW5pdD0hMH19dmFyIGU9dC4kd2luLHM9dC4kZG9jLG49W10sbz0xO3JldHVybiB0LmNvbXBvbmVudChcInN0aWNreVwiLHtkZWZhdWx0czp7dG9wOjAsYm90dG9tOjAsYW5pbWF0aW9uOlwiXCIsY2xzaW5pdDpcInVrLXN0aWNreS1pbml0XCIsY2xzYWN0aXZlOlwidWstYWN0aXZlXCIsY2xzaW5hY3RpdmU6XCJcIixnZXRXaWR0aEZyb206XCJcIixzaG93dXA6ITEsYm91bmRhcnk6ITEsbWVkaWE6ITEsdGFyZ2V0OiExLGRpc2FibGVkOiExfSxib290OmZ1bmN0aW9uKCl7dC4kZG9jLm9uKFwic2Nyb2xsaW5nLnVrLmRvY3VtZW50XCIsZnVuY3Rpb24odCxlKXtlJiZlLmRpciYmKG89ZS5kaXIueSxpKCkpfSksdC4kd2luLm9uKFwicmVzaXplIG9yaWVudGF0aW9uY2hhbmdlXCIsdC5VdGlscy5kZWJvdW5jZShmdW5jdGlvbigpe2lmKG4ubGVuZ3RoKXtmb3IodmFyIHQ9MDt0PG4ubGVuZ3RoO3QrKyluW3RdLnJlc2V0KCEwKTtpKCl9fSwxMDApKSx0LnJlYWR5KGZ1bmN0aW9uKGUpe3NldFRpbWVvdXQoZnVuY3Rpb24oKXt0LiQoXCJbZGF0YS11ay1zdGlja3ldXCIsZSkuZWFjaChmdW5jdGlvbigpe3ZhciBpPXQuJCh0aGlzKTtpLmRhdGEoXCJzdGlja3lcIil8fHQuc3RpY2t5KGksdC5VdGlscy5vcHRpb25zKGkuYXR0cihcImRhdGEtdWstc3RpY2t5XCIpKSl9KSxpKCl9LDApfSl9LGluaXQ6ZnVuY3Rpb24oKXt2YXIgaSxhPXRoaXMub3B0aW9ucy5ib3VuZGFyeTt0aGlzLndyYXBwZXI9dGhpcy5lbGVtZW50LndyYXAoJzxkaXYgY2xhc3M9XCJ1ay1zdGlja3ktcGxhY2Vob2xkZXJcIj48L2Rpdj4nKS5wYXJlbnQoKSx0aGlzLmNvbXB1dGVXcmFwcGVyKCksdGhpcy5lbGVtZW50LmNzcyhcIm1hcmdpblwiLDApLGEmJihhPT09ITB8fFwiIVwiPT09YVswXT8oYT1hPT09ITA/dGhpcy53cmFwcGVyLnBhcmVudCgpOnRoaXMud3JhcHBlci5jbG9zZXN0KGEuc3Vic3RyKDEpKSxpPSEwKTpcInN0cmluZ1wiPT10eXBlb2YgYSYmKGE9dC4kKGEpKSksdGhpcy5zdGlja3k9e3NlbGY6dGhpcyxvcHRpb25zOnRoaXMub3B0aW9ucyxlbGVtZW50OnRoaXMuZWxlbWVudCxjdXJyZW50VG9wOm51bGwsd3JhcHBlcjp0aGlzLndyYXBwZXIsaW5pdDohMSxnZXRXaWR0aEZyb206dC4kKHRoaXMub3B0aW9ucy5nZXRXaWR0aEZyb218fHRoaXMud3JhcHBlciksYm91bmRhcnk6YSxib3VuZHRvcGFyZW50OmksdG9wOjAsY2FsY1RvcDpmdW5jdGlvbigpe3ZhciBpPXRoaXMub3B0aW9ucy50b3A7aWYodGhpcy5vcHRpb25zLnRvcCYmXCJzdHJpbmdcIj09dHlwZW9mIHRoaXMub3B0aW9ucy50b3ApaWYodGhpcy5vcHRpb25zLnRvcC5tYXRjaCgvXigtfCkoXFxkKyl2aCQvKSlpPXdpbmRvdy5pbm5lckhlaWdodCpwYXJzZUludCh0aGlzLm9wdGlvbnMudG9wLDEwKS8xMDA7ZWxzZXt2YXIgZT10LiQodGhpcy5vcHRpb25zLnRvcCkuZmlyc3QoKTtlLmxlbmd0aCYmZS5pcyhcIjp2aXNpYmxlXCIpJiYoaT0tMSooZS5vZmZzZXQoKS50b3ArZS5vdXRlckhlaWdodCgpLXRoaXMud3JhcHBlci5vZmZzZXQoKS50b3ApKX10aGlzLnRvcD1pfSxyZXNldDpmdW5jdGlvbihpKXt0aGlzLmNhbGNUb3AoKTt2YXIgZT1mdW5jdGlvbigpe3RoaXMuZWxlbWVudC5jc3Moe3Bvc2l0aW9uOlwiXCIsdG9wOlwiXCIsd2lkdGg6XCJcIixsZWZ0OlwiXCIsbWFyZ2luOlwiMFwifSksdGhpcy5lbGVtZW50LnJlbW92ZUNsYXNzKFt0aGlzLm9wdGlvbnMuYW5pbWF0aW9uLFwidWstYW5pbWF0aW9uLXJldmVyc2VcIix0aGlzLm9wdGlvbnMuY2xzYWN0aXZlXS5qb2luKFwiIFwiKSksdGhpcy5lbGVtZW50LmFkZENsYXNzKHRoaXMub3B0aW9ucy5jbHNpbmFjdGl2ZSksdGhpcy5lbGVtZW50LnRyaWdnZXIoXCJpbmFjdGl2ZS51ay5zdGlja3lcIiksdGhpcy5jdXJyZW50VG9wPW51bGwsdGhpcy5hbmltYXRlPSExfS5iaW5kKHRoaXMpOyFpJiZ0aGlzLm9wdGlvbnMuYW5pbWF0aW9uJiZ0LnN1cHBvcnQuYW5pbWF0aW9uJiYhdC5VdGlscy5pc0luVmlldyh0aGlzLndyYXBwZXIpPyh0aGlzLmFuaW1hdGU9ITAsdGhpcy5lbGVtZW50LnJlbW92ZUNsYXNzKHRoaXMub3B0aW9ucy5hbmltYXRpb24pLm9uZSh0LnN1cHBvcnQuYW5pbWF0aW9uLmVuZCxmdW5jdGlvbigpe2UoKX0pLndpZHRoKCksdGhpcy5lbGVtZW50LmFkZENsYXNzKHRoaXMub3B0aW9ucy5hbmltYXRpb24rXCIgdWstYW5pbWF0aW9uLXJldmVyc2VcIikpOmUoKX0sY2hlY2s6ZnVuY3Rpb24oKXtpZih0aGlzLm9wdGlvbnMuZGlzYWJsZWQpcmV0dXJuITE7aWYodGhpcy5vcHRpb25zLm1lZGlhKXN3aXRjaCh0eXBlb2YgdGhpcy5vcHRpb25zLm1lZGlhKXtjYXNlXCJudW1iZXJcIjppZih3aW5kb3cuaW5uZXJXaWR0aDx0aGlzLm9wdGlvbnMubWVkaWEpcmV0dXJuITE7YnJlYWs7Y2FzZVwic3RyaW5nXCI6aWYod2luZG93Lm1hdGNoTWVkaWEmJiF3aW5kb3cubWF0Y2hNZWRpYSh0aGlzLm9wdGlvbnMubWVkaWEpLm1hdGNoZXMpcmV0dXJuITF9dmFyIGk9ZS5zY3JvbGxUb3AoKSxuPXMuaGVpZ2h0KCksYT1uLXdpbmRvdy5pbm5lckhlaWdodCxyPWk+YT9hLWk6MCxoPXRoaXMud3JhcHBlci5vZmZzZXQoKS50b3AscD1oLXRoaXMudG9wLXIsYz1pPj1wO3JldHVybiBjJiZ0aGlzLm9wdGlvbnMuc2hvd3VwJiYoMT09byYmKGM9ITEpLC0xPT1vJiYhdGhpcy5lbGVtZW50Lmhhc0NsYXNzKHRoaXMub3B0aW9ucy5jbHNhY3RpdmUpJiZ0LlV0aWxzLmlzSW5WaWV3KHRoaXMud3JhcHBlcikmJihjPSExKSksY319LHRoaXMuc3RpY2t5LmNhbGNUb3AoKSxuLnB1c2godGhpcy5zdGlja3kpfSx1cGRhdGU6ZnVuY3Rpb24oKXtpKHRoaXMuc3RpY2t5KX0sZW5hYmxlOmZ1bmN0aW9uKCl7dGhpcy5vcHRpb25zLmRpc2FibGVkPSExLHRoaXMudXBkYXRlKCl9LGRpc2FibGU6ZnVuY3Rpb24odCl7dGhpcy5vcHRpb25zLmRpc2FibGVkPSEwLHRoaXMuc3RpY2t5LnJlc2V0KHQpfSxjb21wdXRlV3JhcHBlcjpmdW5jdGlvbigpe3RoaXMud3JhcHBlci5jc3Moe2hlaWdodDotMT09W1wiYWJzb2x1dGVcIixcImZpeGVkXCJdLmluZGV4T2YodGhpcy5lbGVtZW50LmNzcyhcInBvc2l0aW9uXCIpKT90aGlzLmVsZW1lbnQub3V0ZXJIZWlnaHQoKTpcIlwiLFwiZmxvYXRcIjpcIm5vbmVcIiE9dGhpcy5lbGVtZW50LmNzcyhcImZsb2F0XCIpP3RoaXMuZWxlbWVudC5jc3MoXCJmbG9hdFwiKTpcIlwiLG1hcmdpbjp0aGlzLmVsZW1lbnQuY3NzKFwibWFyZ2luXCIpfSksXCJmaXhlZFwiPT10aGlzLmVsZW1lbnQuY3NzKFwicG9zaXRpb25cIikmJnRoaXMuZWxlbWVudC5jc3Moe3dpZHRoOnRoaXMuc3RpY2t5LmdldFdpZHRoRnJvbS5sZW5ndGg/dGhpcy5zdGlja3kuZ2V0V2lkdGhGcm9tLndpZHRoKCk6dGhpcy5lbGVtZW50LndpZHRoKCl9KX19KSx0LnN0aWNreX0pOyIsIi8qISBVSWtpdCAyLjI2LjMgfCBodHRwOi8vd3d3LmdldHVpa2l0LmNvbSB8IChjKSAyMDE0IFlPT3RoZW1lIHwgTUlUIExpY2Vuc2UgKi9cbiFmdW5jdGlvbih0KXt2YXIgaTt3aW5kb3cuVUlraXQmJihpPXQoVUlraXQpKSxcImZ1bmN0aW9uXCI9PXR5cGVvZiBkZWZpbmUmJmRlZmluZS5hbWQmJmRlZmluZShcInVpa2l0LXRvb2x0aXBcIixbXCJ1aWtpdFwiXSxmdW5jdGlvbigpe3JldHVybiBpfHx0KFVJa2l0KX0pfShmdW5jdGlvbih0KXtcInVzZSBzdHJpY3RcIjt2YXIgaSxvLGU7cmV0dXJuIHQuY29tcG9uZW50KFwidG9vbHRpcFwiLHtkZWZhdWx0czp7b2Zmc2V0OjUscG9zOlwidG9wXCIsYW5pbWF0aW9uOiExLGRlbGF5OjAsY2xzOlwiXCIsYWN0aXZlQ2xhc3M6XCJ1ay1hY3RpdmVcIixzcmM6ZnVuY3Rpb24odCl7dmFyIGk9dC5hdHRyKFwidGl0bGVcIik7cmV0dXJuIHZvaWQgMCE9PWkmJnQuZGF0YShcImNhY2hlZC10aXRsZVwiLGkpLnJlbW92ZUF0dHIoXCJ0aXRsZVwiKSx0LmRhdGEoXCJjYWNoZWQtdGl0bGVcIil9fSx0aXA6XCJcIixib290OmZ1bmN0aW9uKCl7dC4kaHRtbC5vbihcIm1vdXNlZW50ZXIudG9vbHRpcC51aWtpdCBmb2N1cy50b29sdGlwLnVpa2l0XCIsXCJbZGF0YS11ay10b29sdGlwXVwiLGZ1bmN0aW9uKCl7dmFyIGk9dC4kKHRoaXMpO2kuZGF0YShcInRvb2x0aXBcIil8fCh0LnRvb2x0aXAoaSx0LlV0aWxzLm9wdGlvbnMoaS5hdHRyKFwiZGF0YS11ay10b29sdGlwXCIpKSksaS50cmlnZ2VyKFwibW91c2VlbnRlclwiKSl9KX0saW5pdDpmdW5jdGlvbigpe3ZhciBvPXRoaXM7aXx8KGk9dC4kKCc8ZGl2IGNsYXNzPVwidWstdG9vbHRpcFwiPjwvZGl2PicpLmFwcGVuZFRvKFwiYm9keVwiKSksdGhpcy5vbih7Zm9jdXM6ZnVuY3Rpb24oKXtvLnNob3coKX0sYmx1cjpmdW5jdGlvbigpe28uaGlkZSgpfSxtb3VzZWVudGVyOmZ1bmN0aW9uKCl7by5zaG93KCl9LG1vdXNlbGVhdmU6ZnVuY3Rpb24oKXtvLmhpZGUoKX19KX0sc2hvdzpmdW5jdGlvbigpe2lmKHRoaXMudGlwPVwiZnVuY3Rpb25cIj09dHlwZW9mIHRoaXMub3B0aW9ucy5zcmM/dGhpcy5vcHRpb25zLnNyYyh0aGlzLmVsZW1lbnQpOnRoaXMub3B0aW9ucy5zcmMsbyYmY2xlYXJUaW1lb3V0KG8pLGUmJmNsZWFyVGltZW91dChlKSxcInN0cmluZ1wiPT10eXBlb2YgdGhpcy50aXA/dGhpcy50aXAubGVuZ3RoOjApe2kuc3RvcCgpLmNzcyh7dG9wOi0yZTMsdmlzaWJpbGl0eTpcImhpZGRlblwifSkucmVtb3ZlQ2xhc3ModGhpcy5vcHRpb25zLmFjdGl2ZUNsYXNzKS5zaG93KCksaS5odG1sKCc8ZGl2IGNsYXNzPVwidWstdG9vbHRpcC1pbm5lclwiPicrdGhpcy50aXArXCI8L2Rpdj5cIik7dmFyIHM9dGhpcyxuPXQuJC5leHRlbmQoe30sdGhpcy5lbGVtZW50Lm9mZnNldCgpLHt3aWR0aDp0aGlzLmVsZW1lbnRbMF0ub2Zmc2V0V2lkdGgsaGVpZ2h0OnRoaXMuZWxlbWVudFswXS5vZmZzZXRIZWlnaHR9KSxsPWlbMF0ub2Zmc2V0V2lkdGgsZj1pWzBdLm9mZnNldEhlaWdodCxwPVwiZnVuY3Rpb25cIj09dHlwZW9mIHRoaXMub3B0aW9ucy5vZmZzZXQ/dGhpcy5vcHRpb25zLm9mZnNldC5jYWxsKHRoaXMuZWxlbWVudCk6dGhpcy5vcHRpb25zLm9mZnNldCxhPVwiZnVuY3Rpb25cIj09dHlwZW9mIHRoaXMub3B0aW9ucy5wb3M/dGhpcy5vcHRpb25zLnBvcy5jYWxsKHRoaXMuZWxlbWVudCk6dGhpcy5vcHRpb25zLnBvcyxoPWEuc3BsaXQoXCItXCIpLGM9e2Rpc3BsYXk6XCJub25lXCIsdmlzaWJpbGl0eTpcInZpc2libGVcIix0b3A6bi50b3Arbi5oZWlnaHQrZixsZWZ0Om4ubGVmdH07aWYoXCJmaXhlZFwiPT10LiRodG1sLmNzcyhcInBvc2l0aW9uXCIpfHxcImZpeGVkXCI9PXQuJGJvZHkuY3NzKFwicG9zaXRpb25cIikpe3ZhciByPXQuJChcImJvZHlcIikub2Zmc2V0KCksZD10LiQoXCJodG1sXCIpLm9mZnNldCgpLHU9e3RvcDpkLnRvcCtyLnRvcCxsZWZ0OmQubGVmdCtyLmxlZnR9O24ubGVmdC09dS5sZWZ0LG4udG9wLT11LnRvcH1cImxlZnRcIiE9aFswXSYmXCJyaWdodFwiIT1oWzBdfHxcInJpZ2h0XCIhPXQubGFuZ2RpcmVjdGlvbnx8KGhbMF09XCJsZWZ0XCI9PWhbMF0/XCJyaWdodFwiOlwibGVmdFwiKTt2YXIgbT17Ym90dG9tOnt0b3A6bi50b3Arbi5oZWlnaHQrcCxsZWZ0Om4ubGVmdCtuLndpZHRoLzItbC8yfSx0b3A6e3RvcDpuLnRvcC1mLXAsbGVmdDpuLmxlZnQrbi53aWR0aC8yLWwvMn0sbGVmdDp7dG9wOm4udG9wK24uaGVpZ2h0LzItZi8yLGxlZnQ6bi5sZWZ0LWwtcH0scmlnaHQ6e3RvcDpuLnRvcCtuLmhlaWdodC8yLWYvMixsZWZ0Om4ubGVmdCtuLndpZHRoK3B9fTt0LiQuZXh0ZW5kKGMsbVtoWzBdXSksMj09aC5sZW5ndGgmJihjLmxlZnQ9XCJsZWZ0XCI9PWhbMV0/bi5sZWZ0Om4ubGVmdCtuLndpZHRoLWwpO3ZhciB2PXRoaXMuY2hlY2tCb3VuZGFyeShjLmxlZnQsYy50b3AsbCxmKTtpZih2KXtzd2l0Y2godil7Y2FzZVwieFwiOmE9Mj09aC5sZW5ndGg/aFswXStcIi1cIisoYy5sZWZ0PDA/XCJsZWZ0XCI6XCJyaWdodFwiKTpjLmxlZnQ8MD9cInJpZ2h0XCI6XCJsZWZ0XCI7YnJlYWs7Y2FzZVwieVwiOmE9Mj09aC5sZW5ndGg/KGMudG9wPDA/XCJib3R0b21cIjpcInRvcFwiKStcIi1cIitoWzFdOmMudG9wPDA/XCJib3R0b21cIjpcInRvcFwiO2JyZWFrO2Nhc2VcInh5XCI6YT0yPT1oLmxlbmd0aD8oYy50b3A8MD9cImJvdHRvbVwiOlwidG9wXCIpK1wiLVwiKyhjLmxlZnQ8MD9cImxlZnRcIjpcInJpZ2h0XCIpOmMubGVmdDwwP1wicmlnaHRcIjpcImxlZnRcIn1oPWEuc3BsaXQoXCItXCIpLHQuJC5leHRlbmQoYyxtW2hbMF1dKSwyPT1oLmxlbmd0aCYmKGMubGVmdD1cImxlZnRcIj09aFsxXT9uLmxlZnQ6bi5sZWZ0K24ud2lkdGgtbCl9Yy5sZWZ0LT10LiRib2R5LnBvc2l0aW9uKCkubGVmdCxvPXNldFRpbWVvdXQoZnVuY3Rpb24oKXtpLmNzcyhjKS5hdHRyKFwiY2xhc3NcIixbXCJ1ay10b29sdGlwXCIsXCJ1ay10b29sdGlwLVwiK2Escy5vcHRpb25zLmNsc10uam9pbihcIiBcIikpLHMub3B0aW9ucy5hbmltYXRpb24/aS5jc3Moe29wYWNpdHk6MCxkaXNwbGF5OlwiYmxvY2tcIn0pLmFkZENsYXNzKHMub3B0aW9ucy5hY3RpdmVDbGFzcykuYW5pbWF0ZSh7b3BhY2l0eToxfSxwYXJzZUludChzLm9wdGlvbnMuYW5pbWF0aW9uLDEwKXx8NDAwKTppLnNob3coKS5hZGRDbGFzcyhzLm9wdGlvbnMuYWN0aXZlQ2xhc3MpLG89ITEsZT1zZXRJbnRlcnZhbChmdW5jdGlvbigpe3MuZWxlbWVudC5pcyhcIjp2aXNpYmxlXCIpfHxzLmhpZGUoKX0sMTUwKX0scGFyc2VJbnQodGhpcy5vcHRpb25zLmRlbGF5LDEwKXx8MCl9fSxoaWRlOmZ1bmN0aW9uKCl7aWYoIXRoaXMuZWxlbWVudC5pcyhcImlucHV0XCIpfHx0aGlzLmVsZW1lbnRbMF0hPT1kb2N1bWVudC5hY3RpdmVFbGVtZW50KWlmKG8mJmNsZWFyVGltZW91dChvKSxlJiZjbGVhclRpbWVvdXQoZSksaS5zdG9wKCksdGhpcy5vcHRpb25zLmFuaW1hdGlvbil7dmFyIHQ9dGhpcztpLmZhZGVPdXQocGFyc2VJbnQodGhpcy5vcHRpb25zLmFuaW1hdGlvbiwxMCl8fDQwMCxmdW5jdGlvbigpe2kucmVtb3ZlQ2xhc3ModC5vcHRpb25zLmFjdGl2ZUNsYXNzKX0pfWVsc2UgaS5oaWRlKCkucmVtb3ZlQ2xhc3ModGhpcy5vcHRpb25zLmFjdGl2ZUNsYXNzKX0sY29udGVudDpmdW5jdGlvbigpe3JldHVybiB0aGlzLnRpcH0sY2hlY2tCb3VuZGFyeTpmdW5jdGlvbihpLG8sZSxzKXt2YXIgbj1cIlwiO3JldHVybigwPml8fGktdC4kd2luLnNjcm9sbExlZnQoKStlPndpbmRvdy5pbm5lcldpZHRoKSYmKG4rPVwieFwiKSwoMD5vfHxvLXQuJHdpbi5zY3JvbGxUb3AoKStzPndpbmRvdy5pbm5lckhlaWdodCkmJihuKz1cInlcIiksbn19KSx0LnRvb2x0aXB9KTsiXX0=
